Add support for monitorx/mwaitx instructions
[external/binutils.git] / opcodes / i386-dis.c
1 /* Print i386 instructions for GDB, the GNU debugger.
2    Copyright (C) 1988-2015 Free Software Foundation, Inc.
3
4    This file is part of the GNU opcodes library.
5
6    This library is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 3, or (at your option)
9    any later version.
10
11    It is distributed in the hope that it will be useful, but WITHOUT
12    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
14    License for more details.
15
16    You should have received a copy of the GNU General Public License
17    along with this program; if not, write to the Free Software
18    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19    MA 02110-1301, USA.  */
20
21
22 /* 80386 instruction printer by Pace Willisson (pace@prep.ai.mit.edu)
23    July 1988
24     modified by John Hassey (hassey@dg-rtp.dg.com)
25     x86-64 support added by Jan Hubicka (jh@suse.cz)
26     VIA PadLock support by Michal Ludvig (mludvig@suse.cz).  */
27
28 /* The main tables describing the instructions is essentially a copy
29    of the "Opcode Map" chapter (Appendix A) of the Intel 80386
30    Programmers Manual.  Usually, there is a capital letter, followed
31    by a small letter.  The capital letter tell the addressing mode,
32    and the small letter tells about the operand size.  Refer to
33    the Intel manual for details.  */
34
35 #include "sysdep.h"
36 #include "dis-asm.h"
37 #include "opintl.h"
38 #include "opcode/i386.h"
39 #include "libiberty.h"
40
41 #include <setjmp.h>
42
43 static int print_insn (bfd_vma, disassemble_info *);
44 static void dofloat (int);
45 static void OP_ST (int, int);
46 static void OP_STi (int, int);
47 static int putop (const char *, int);
48 static void oappend (const char *);
49 static void append_seg (void);
50 static void OP_indirE (int, int);
51 static void print_operand_value (char *, int, bfd_vma);
52 static void OP_E_register (int, int);
53 static void OP_E_memory (int, int);
54 static void print_displacement (char *, bfd_vma);
55 static void OP_E (int, int);
56 static void OP_G (int, int);
57 static bfd_vma get64 (void);
58 static bfd_signed_vma get32 (void);
59 static bfd_signed_vma get32s (void);
60 static int get16 (void);
61 static void set_op (bfd_vma, int);
62 static void OP_Skip_MODRM (int, int);
63 static void OP_REG (int, int);
64 static void OP_IMREG (int, int);
65 static void OP_I (int, int);
66 static void OP_I64 (int, int);
67 static void OP_sI (int, int);
68 static void OP_J (int, int);
69 static void OP_SEG (int, int);
70 static void OP_DIR (int, int);
71 static void OP_OFF (int, int);
72 static void OP_OFF64 (int, int);
73 static void ptr_reg (int, int);
74 static void OP_ESreg (int, int);
75 static void OP_DSreg (int, int);
76 static void OP_C (int, int);
77 static void OP_D (int, int);
78 static void OP_T (int, int);
79 static void OP_R (int, int);
80 static void OP_MMX (int, int);
81 static void OP_XMM (int, int);
82 static void OP_EM (int, int);
83 static void OP_EX (int, int);
84 static void OP_EMC (int,int);
85 static void OP_MXC (int,int);
86 static void OP_MS (int, int);
87 static void OP_XS (int, int);
88 static void OP_M (int, int);
89 static void OP_VEX (int, int);
90 static void OP_EX_Vex (int, int);
91 static void OP_EX_VexW (int, int);
92 static void OP_EX_VexImmW (int, int);
93 static void OP_XMM_Vex (int, int);
94 static void OP_XMM_VexW (int, int);
95 static void OP_Rounding (int, int);
96 static void OP_REG_VexI4 (int, int);
97 static void PCLMUL_Fixup (int, int);
98 static void VEXI4_Fixup (int, int);
99 static void VZERO_Fixup (int, int);
100 static void VCMP_Fixup (int, int);
101 static void VPCMP_Fixup (int, int);
102 static void OP_0f07 (int, int);
103 static void OP_Monitor (int, int);
104 static void OP_Mwait (int, int);
105 static void OP_Mwaitx (int, int);
106 static void NOP_Fixup1 (int, int);
107 static void NOP_Fixup2 (int, int);
108 static void OP_3DNowSuffix (int, int);
109 static void CMP_Fixup (int, int);
110 static void BadOp (void);
111 static void REP_Fixup (int, int);
112 static void BND_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 OP_LWPCB_E (int, int);
121 static void OP_LWP_E (int, int);
122 static void OP_Vex_2src_1 (int, int);
123 static void OP_Vex_2src_2 (int, int);
124
125 static void MOVBE_Fixup (int, int);
126
127 static void OP_Mask (int, int);
128
129 struct dis_private {
130   /* Points to first byte not fetched.  */
131   bfd_byte *max_fetched;
132   bfd_byte the_buffer[MAX_MNEM_SIZE];
133   bfd_vma insn_start;
134   int orig_sizeflag;
135   OPCODES_SIGJMP_BUF bailout;
136 };
137
138 enum address_mode
139 {
140   mode_16bit,
141   mode_32bit,
142   mode_64bit
143 };
144
145 enum address_mode address_mode;
146
147 /* Flags for the prefixes for the current instruction.  See below.  */
148 static int prefixes;
149
150 /* REX prefix the current instruction.  See below.  */
151 static int rex;
152 /* Bits of REX we've already used.  */
153 static int rex_used;
154 /* REX bits in original REX prefix ignored.  */
155 static int rex_ignored;
156 /* Mark parts used in the REX prefix.  When we are testing for
157    empty prefix (for 8bit register REX extension), just mask it
158    out.  Otherwise test for REX bit is excuse for existence of REX
159    only in case value is nonzero.  */
160 #define USED_REX(value)                                 \
161   {                                                     \
162     if (value)                                          \
163       {                                                 \
164         if ((rex & value))                              \
165           rex_used |= (value) | REX_OPCODE;             \
166       }                                                 \
167     else                                                \
168       rex_used |= REX_OPCODE;                           \
169   }
170
171 /* Flags for prefixes which we somehow handled when printing the
172    current instruction.  */
173 static int used_prefixes;
174
175 /* Flags stored in PREFIXES.  */
176 #define PREFIX_REPZ 1
177 #define PREFIX_REPNZ 2
178 #define PREFIX_LOCK 4
179 #define PREFIX_CS 8
180 #define PREFIX_SS 0x10
181 #define PREFIX_DS 0x20
182 #define PREFIX_ES 0x40
183 #define PREFIX_FS 0x80
184 #define PREFIX_GS 0x100
185 #define PREFIX_DATA 0x200
186 #define PREFIX_ADDR 0x400
187 #define PREFIX_FWAIT 0x800
188
189 /* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
190    to ADDR (exclusive) are valid.  Returns 1 for success, longjmps
191    on error.  */
192 #define FETCH_DATA(info, addr) \
193   ((addr) <= ((struct dis_private *) (info->private_data))->max_fetched \
194    ? 1 : fetch_data ((info), (addr)))
195
196 static int
197 fetch_data (struct disassemble_info *info, bfd_byte *addr)
198 {
199   int status;
200   struct dis_private *priv = (struct dis_private *) info->private_data;
201   bfd_vma start = priv->insn_start + (priv->max_fetched - priv->the_buffer);
202
203   if (addr <= priv->the_buffer + MAX_MNEM_SIZE)
204     status = (*info->read_memory_func) (start,
205                                         priv->max_fetched,
206                                         addr - priv->max_fetched,
207                                         info);
208   else
209     status = -1;
210   if (status != 0)
211     {
212       /* If we did manage to read at least one byte, then
213          print_insn_i386 will do something sensible.  Otherwise, print
214          an error.  We do that here because this is where we know
215          STATUS.  */
216       if (priv->max_fetched == priv->the_buffer)
217         (*info->memory_error_func) (status, start, info);
218       OPCODES_SIGLONGJMP (priv->bailout, 1);
219     }
220   else
221     priv->max_fetched = addr;
222   return 1;
223 }
224
225 /* Possible values for prefix requirement.  */
226 #define PREFIX_IGNORED_SHIFT    16
227 #define PREFIX_IGNORED_REPZ     (PREFIX_REPZ << PREFIX_IGNORED_SHIFT)
228 #define PREFIX_IGNORED_REPNZ    (PREFIX_REPNZ << PREFIX_IGNORED_SHIFT)
229 #define PREFIX_IGNORED_DATA     (PREFIX_DATA << PREFIX_IGNORED_SHIFT)
230 #define PREFIX_IGNORED_ADDR     (PREFIX_ADDR << PREFIX_IGNORED_SHIFT)
231 #define PREFIX_IGNORED_LOCK     (PREFIX_LOCK << PREFIX_IGNORED_SHIFT)
232
233 /* Opcode prefixes.  */
234 #define PREFIX_OPCODE           (PREFIX_REPZ \
235                                  | PREFIX_REPNZ \
236                                  | PREFIX_DATA)
237
238 /* Prefixes ignored.  */
239 #define PREFIX_IGNORED          (PREFIX_IGNORED_REPZ \
240                                  | PREFIX_IGNORED_REPNZ \
241                                  | PREFIX_IGNORED_DATA)
242
243 #define XX { NULL, 0 }
244 #define Bad_Opcode NULL, { { NULL, 0 } }, 0
245
246 #define Eb { OP_E, b_mode }
247 #define Ebnd { OP_E, bnd_mode }
248 #define EbS { OP_E, b_swap_mode }
249 #define Ev { OP_E, v_mode }
250 #define Ev_bnd { OP_E, v_bnd_mode }
251 #define EvS { OP_E, v_swap_mode }
252 #define Ed { OP_E, d_mode }
253 #define Edq { OP_E, dq_mode }
254 #define Edqw { OP_E, dqw_mode }
255 #define EdqwS { OP_E, dqw_swap_mode }
256 #define Edqb { OP_E, dqb_mode }
257 #define Edb { OP_E, db_mode }
258 #define Edw { OP_E, dw_mode }
259 #define Edqd { OP_E, dqd_mode }
260 #define Eq { OP_E, q_mode }
261 #define indirEv { OP_indirE, stack_v_mode }
262 #define indirEp { OP_indirE, f_mode }
263 #define stackEv { OP_E, stack_v_mode }
264 #define Em { OP_E, m_mode }
265 #define Ew { OP_E, w_mode }
266 #define M { OP_M, 0 }           /* lea, lgdt, etc. */
267 #define Ma { OP_M, a_mode }
268 #define Mb { OP_M, b_mode }
269 #define Md { OP_M, d_mode }
270 #define Mo { OP_M, o_mode }
271 #define Mp { OP_M, f_mode }             /* 32 or 48 bit memory operand for LDS, LES etc */
272 #define Mq { OP_M, q_mode }
273 #define Mx { OP_M, x_mode }
274 #define Mxmm { OP_M, xmm_mode }
275 #define Gb { OP_G, b_mode }
276 #define Gbnd { OP_G, bnd_mode }
277 #define Gv { OP_G, v_mode }
278 #define Gd { OP_G, d_mode }
279 #define Gdq { OP_G, dq_mode }
280 #define Gm { OP_G, m_mode }
281 #define Gw { OP_G, w_mode }
282 #define Rd { OP_R, d_mode }
283 #define Rdq { OP_R, dq_mode }
284 #define Rm { OP_R, m_mode }
285 #define Ib { OP_I, b_mode }
286 #define sIb { OP_sI, b_mode }   /* sign extened byte */
287 #define sIbT { OP_sI, b_T_mode } /* sign extened byte like 'T' */
288 #define Iv { OP_I, v_mode }
289 #define sIv { OP_sI, v_mode }
290 #define Iq { OP_I, q_mode }
291 #define Iv64 { OP_I64, v_mode }
292 #define Iw { OP_I, w_mode }
293 #define I1 { OP_I, const_1_mode }
294 #define Jb { OP_J, b_mode }
295 #define Jv { OP_J, v_mode }
296 #define Cm { OP_C, m_mode }
297 #define Dm { OP_D, m_mode }
298 #define Td { OP_T, d_mode }
299 #define Skip_MODRM { OP_Skip_MODRM, 0 }
300
301 #define RMeAX { OP_REG, eAX_reg }
302 #define RMeBX { OP_REG, eBX_reg }
303 #define RMeCX { OP_REG, eCX_reg }
304 #define RMeDX { OP_REG, eDX_reg }
305 #define RMeSP { OP_REG, eSP_reg }
306 #define RMeBP { OP_REG, eBP_reg }
307 #define RMeSI { OP_REG, eSI_reg }
308 #define RMeDI { OP_REG, eDI_reg }
309 #define RMrAX { OP_REG, rAX_reg }
310 #define RMrBX { OP_REG, rBX_reg }
311 #define RMrCX { OP_REG, rCX_reg }
312 #define RMrDX { OP_REG, rDX_reg }
313 #define RMrSP { OP_REG, rSP_reg }
314 #define RMrBP { OP_REG, rBP_reg }
315 #define RMrSI { OP_REG, rSI_reg }
316 #define RMrDI { OP_REG, rDI_reg }
317 #define RMAL { OP_REG, al_reg }
318 #define RMCL { OP_REG, cl_reg }
319 #define RMDL { OP_REG, dl_reg }
320 #define RMBL { OP_REG, bl_reg }
321 #define RMAH { OP_REG, ah_reg }
322 #define RMCH { OP_REG, ch_reg }
323 #define RMDH { OP_REG, dh_reg }
324 #define RMBH { OP_REG, bh_reg }
325 #define RMAX { OP_REG, ax_reg }
326 #define RMDX { OP_REG, dx_reg }
327
328 #define eAX { OP_IMREG, eAX_reg }
329 #define eBX { OP_IMREG, eBX_reg }
330 #define eCX { OP_IMREG, eCX_reg }
331 #define eDX { OP_IMREG, eDX_reg }
332 #define eSP { OP_IMREG, eSP_reg }
333 #define eBP { OP_IMREG, eBP_reg }
334 #define eSI { OP_IMREG, eSI_reg }
335 #define eDI { OP_IMREG, eDI_reg }
336 #define AL { OP_IMREG, al_reg }
337 #define CL { OP_IMREG, cl_reg }
338 #define DL { OP_IMREG, dl_reg }
339 #define BL { OP_IMREG, bl_reg }
340 #define AH { OP_IMREG, ah_reg }
341 #define CH { OP_IMREG, ch_reg }
342 #define DH { OP_IMREG, dh_reg }
343 #define BH { OP_IMREG, bh_reg }
344 #define AX { OP_IMREG, ax_reg }
345 #define DX { OP_IMREG, dx_reg }
346 #define zAX { OP_IMREG, z_mode_ax_reg }
347 #define indirDX { OP_IMREG, indir_dx_reg }
348
349 #define Sw { OP_SEG, w_mode }
350 #define Sv { OP_SEG, v_mode }
351 #define Ap { OP_DIR, 0 }
352 #define Ob { OP_OFF64, b_mode }
353 #define Ov { OP_OFF64, v_mode }
354 #define Xb { OP_DSreg, eSI_reg }
355 #define Xv { OP_DSreg, eSI_reg }
356 #define Xz { OP_DSreg, eSI_reg }
357 #define Yb { OP_ESreg, eDI_reg }
358 #define Yv { OP_ESreg, eDI_reg }
359 #define DSBX { OP_DSreg, eBX_reg }
360
361 #define es { OP_REG, es_reg }
362 #define ss { OP_REG, ss_reg }
363 #define cs { OP_REG, cs_reg }
364 #define ds { OP_REG, ds_reg }
365 #define fs { OP_REG, fs_reg }
366 #define gs { OP_REG, gs_reg }
367
368 #define MX { OP_MMX, 0 }
369 #define XM { OP_XMM, 0 }
370 #define XMScalar { OP_XMM, scalar_mode }
371 #define XMGatherQ { OP_XMM, vex_vsib_q_w_dq_mode }
372 #define XMM { OP_XMM, xmm_mode }
373 #define XMxmmq { OP_XMM, xmmq_mode }
374 #define EM { OP_EM, v_mode }
375 #define EMS { OP_EM, v_swap_mode }
376 #define EMd { OP_EM, d_mode }
377 #define EMx { OP_EM, x_mode }
378 #define EXw { OP_EX, w_mode }
379 #define EXd { OP_EX, d_mode }
380 #define EXdScalar { OP_EX, d_scalar_mode }
381 #define EXdS { OP_EX, d_swap_mode }
382 #define EXdScalarS { OP_EX, d_scalar_swap_mode }
383 #define EXq { OP_EX, q_mode }
384 #define EXqScalar { OP_EX, q_scalar_mode }
385 #define EXqScalarS { OP_EX, q_scalar_swap_mode }
386 #define EXqS { OP_EX, q_swap_mode }
387 #define EXx { OP_EX, x_mode }
388 #define EXxS { OP_EX, x_swap_mode }
389 #define EXxmm { OP_EX, xmm_mode }
390 #define EXymm { OP_EX, ymm_mode }
391 #define EXxmmq { OP_EX, xmmq_mode }
392 #define EXEvexHalfBcstXmmq { OP_EX, evex_half_bcst_xmmq_mode }
393 #define EXxmm_mb { OP_EX, xmm_mb_mode }
394 #define EXxmm_mw { OP_EX, xmm_mw_mode }
395 #define EXxmm_md { OP_EX, xmm_md_mode }
396 #define EXxmm_mq { OP_EX, xmm_mq_mode }
397 #define EXxmm_mdq { OP_EX, xmm_mdq_mode }
398 #define EXxmmdw { OP_EX, xmmdw_mode }
399 #define EXxmmqd { OP_EX, xmmqd_mode }
400 #define EXymmq { OP_EX, ymmq_mode }
401 #define EXVexWdq { OP_EX, vex_w_dq_mode }
402 #define EXVexWdqScalar { OP_EX, vex_scalar_w_dq_mode }
403 #define EXEvexXGscat { OP_EX, evex_x_gscat_mode }
404 #define EXEvexXNoBcst { OP_EX, evex_x_nobcst_mode }
405 #define MS { OP_MS, v_mode }
406 #define XS { OP_XS, v_mode }
407 #define EMCq { OP_EMC, q_mode }
408 #define MXC { OP_MXC, 0 }
409 #define OPSUF { OP_3DNowSuffix, 0 }
410 #define CMP { CMP_Fixup, 0 }
411 #define XMM0 { XMM_Fixup, 0 }
412 #define FXSAVE { FXSAVE_Fixup, 0 }
413 #define Vex_2src_1 { OP_Vex_2src_1, 0 }
414 #define Vex_2src_2 { OP_Vex_2src_2, 0 }
415
416 #define Vex { OP_VEX, vex_mode }
417 #define VexScalar { OP_VEX, vex_scalar_mode }
418 #define VexGatherQ { OP_VEX, vex_vsib_q_w_dq_mode }
419 #define Vex128 { OP_VEX, vex128_mode }
420 #define Vex256 { OP_VEX, vex256_mode }
421 #define VexGdq { OP_VEX, dq_mode }
422 #define VexI4 { VEXI4_Fixup, 0}
423 #define EXdVex { OP_EX_Vex, d_mode }
424 #define EXdVexS { OP_EX_Vex, d_swap_mode }
425 #define EXdVexScalarS { OP_EX_Vex, d_scalar_swap_mode }
426 #define EXqVex { OP_EX_Vex, q_mode }
427 #define EXqVexS { OP_EX_Vex, q_swap_mode }
428 #define EXqVexScalarS { OP_EX_Vex, q_scalar_swap_mode }
429 #define EXVexW { OP_EX_VexW, x_mode }
430 #define EXdVexW { OP_EX_VexW, d_mode }
431 #define EXqVexW { OP_EX_VexW, q_mode }
432 #define EXVexImmW { OP_EX_VexImmW, x_mode }
433 #define XMVex { OP_XMM_Vex, 0 }
434 #define XMVexScalar { OP_XMM_Vex, scalar_mode }
435 #define XMVexW { OP_XMM_VexW, 0 }
436 #define XMVexI4 { OP_REG_VexI4, x_mode }
437 #define PCLMUL { PCLMUL_Fixup, 0 }
438 #define VZERO { VZERO_Fixup, 0 }
439 #define VCMP { VCMP_Fixup, 0 }
440 #define VPCMP { VPCMP_Fixup, 0 }
441
442 #define EXxEVexR { OP_Rounding, evex_rounding_mode }
443 #define EXxEVexS { OP_Rounding, evex_sae_mode }
444
445 #define XMask { OP_Mask, mask_mode }
446 #define MaskG { OP_G, mask_mode }
447 #define MaskE { OP_E, mask_mode }
448 #define MaskBDE { OP_E, mask_bd_mode }
449 #define MaskR { OP_R, mask_mode }
450 #define MaskVex { OP_VEX, mask_mode }
451
452 #define MVexVSIBDWpX { OP_M, vex_vsib_d_w_dq_mode }
453 #define MVexVSIBDQWpX { OP_M, vex_vsib_d_w_d_mode }
454 #define MVexVSIBQWpX { OP_M, vex_vsib_q_w_dq_mode }
455 #define MVexVSIBQDWpX { OP_M, vex_vsib_q_w_d_mode }
456
457 /* Used handle "rep" prefix for string instructions.  */
458 #define Xbr { REP_Fixup, eSI_reg }
459 #define Xvr { REP_Fixup, eSI_reg }
460 #define Ybr { REP_Fixup, eDI_reg }
461 #define Yvr { REP_Fixup, eDI_reg }
462 #define Yzr { REP_Fixup, eDI_reg }
463 #define indirDXr { REP_Fixup, indir_dx_reg }
464 #define ALr { REP_Fixup, al_reg }
465 #define eAXr { REP_Fixup, eAX_reg }
466
467 /* Used handle HLE prefix for lockable instructions.  */
468 #define Ebh1 { HLE_Fixup1, b_mode }
469 #define Evh1 { HLE_Fixup1, v_mode }
470 #define Ebh2 { HLE_Fixup2, b_mode }
471 #define Evh2 { HLE_Fixup2, v_mode }
472 #define Ebh3 { HLE_Fixup3, b_mode }
473 #define Evh3 { HLE_Fixup3, v_mode }
474
475 #define BND { BND_Fixup, 0 }
476
477 #define cond_jump_flag { NULL, cond_jump_mode }
478 #define loop_jcxz_flag { NULL, loop_jcxz_mode }
479
480 /* bits in sizeflag */
481 #define SUFFIX_ALWAYS 4
482 #define AFLAG 2
483 #define DFLAG 1
484
485 enum
486 {
487   /* byte operand */
488   b_mode = 1,
489   /* byte operand with operand swapped */
490   b_swap_mode,
491   /* byte operand, sign extend like 'T' suffix */
492   b_T_mode,
493   /* operand size depends on prefixes */
494   v_mode,
495   /* operand size depends on prefixes with operand swapped */
496   v_swap_mode,
497   /* word operand */
498   w_mode,
499   /* double word operand  */
500   d_mode,
501   /* double word operand with operand swapped */
502   d_swap_mode,
503   /* quad word operand */
504   q_mode,
505   /* quad word operand with operand swapped */
506   q_swap_mode,
507   /* ten-byte operand */
508   t_mode,
509   /* 16-byte XMM, 32-byte YMM or 64-byte ZMM operand.  In EVEX with
510      broadcast enabled.  */
511   x_mode,
512   /* Similar to x_mode, but with different EVEX mem shifts.  */
513   evex_x_gscat_mode,
514   /* Similar to x_mode, but with disabled broadcast.  */
515   evex_x_nobcst_mode,
516   /* Similar to x_mode, but with operands swapped and disabled broadcast
517      in EVEX.  */
518   x_swap_mode,
519   /* 16-byte XMM operand */
520   xmm_mode,
521   /* XMM, XMM or YMM register operand, or quad word, xmmword or ymmword
522      memory operand (depending on vector length).  Broadcast isn't
523      allowed.  */
524   xmmq_mode,
525   /* Same as xmmq_mode, but broadcast is allowed.  */
526   evex_half_bcst_xmmq_mode,
527   /* XMM register or byte memory operand */
528   xmm_mb_mode,
529   /* XMM register or word memory operand */
530   xmm_mw_mode,
531   /* XMM register or double word memory operand */
532   xmm_md_mode,
533   /* XMM register or quad word memory operand */
534   xmm_mq_mode,
535   /* XMM register or double/quad word memory operand, depending on
536      VEX.W.  */
537   xmm_mdq_mode,
538   /* 16-byte XMM, word, double word or quad word operand.  */
539   xmmdw_mode,
540   /* 16-byte XMM, double word, quad word operand or xmm word operand.  */
541   xmmqd_mode,
542   /* 32-byte YMM operand */
543   ymm_mode,
544   /* quad word, ymmword or zmmword memory operand.  */
545   ymmq_mode,
546   /* 32-byte YMM or 16-byte word operand */
547   ymmxmm_mode,
548   /* d_mode in 32bit, q_mode in 64bit mode.  */
549   m_mode,
550   /* pair of v_mode operands */
551   a_mode,
552   cond_jump_mode,
553   loop_jcxz_mode,
554   v_bnd_mode,
555   /* operand size depends on REX prefixes.  */
556   dq_mode,
557   /* registers like dq_mode, memory like w_mode.  */
558   dqw_mode,
559   dqw_swap_mode,
560   bnd_mode,
561   /* 4- or 6-byte pointer operand */
562   f_mode,
563   const_1_mode,
564   /* v_mode for stack-related opcodes.  */
565   stack_v_mode,
566   /* non-quad operand size depends on prefixes */
567   z_mode,
568   /* 16-byte operand */
569   o_mode,
570   /* registers like dq_mode, memory like b_mode.  */
571   dqb_mode,
572   /* registers like d_mode, memory like b_mode.  */
573   db_mode,
574   /* registers like d_mode, memory like w_mode.  */
575   dw_mode,
576   /* registers like dq_mode, memory like d_mode.  */
577   dqd_mode,
578   /* normal vex mode */
579   vex_mode,
580   /* 128bit vex mode */
581   vex128_mode,
582   /* 256bit vex mode */
583   vex256_mode,
584   /* operand size depends on the VEX.W bit.  */
585   vex_w_dq_mode,
586
587   /* Similar to vex_w_dq_mode, with VSIB dword indices.  */
588   vex_vsib_d_w_dq_mode,
589   /* Similar to vex_vsib_d_w_dq_mode, with smaller memory.  */
590   vex_vsib_d_w_d_mode,
591   /* Similar to vex_w_dq_mode, with VSIB qword indices.  */
592   vex_vsib_q_w_dq_mode,
593   /* Similar to vex_vsib_q_w_dq_mode, with smaller memory.  */
594   vex_vsib_q_w_d_mode,
595
596   /* scalar, ignore vector length.  */
597   scalar_mode,
598   /* like d_mode, ignore vector length.  */
599   d_scalar_mode,
600   /* like d_swap_mode, ignore vector length.  */
601   d_scalar_swap_mode,
602   /* like q_mode, ignore vector length.  */
603   q_scalar_mode,
604   /* like q_swap_mode, ignore vector length.  */
605   q_scalar_swap_mode,
606   /* like vex_mode, ignore vector length.  */
607   vex_scalar_mode,
608   /* like vex_w_dq_mode, ignore vector length.  */
609   vex_scalar_w_dq_mode,
610
611   /* Static rounding.  */
612   evex_rounding_mode,
613   /* Supress all exceptions.  */
614   evex_sae_mode,
615
616   /* Mask register operand.  */
617   mask_mode,
618   /* Mask register operand.  */
619   mask_bd_mode,
620
621   es_reg,
622   cs_reg,
623   ss_reg,
624   ds_reg,
625   fs_reg,
626   gs_reg,
627
628   eAX_reg,
629   eCX_reg,
630   eDX_reg,
631   eBX_reg,
632   eSP_reg,
633   eBP_reg,
634   eSI_reg,
635   eDI_reg,
636
637   al_reg,
638   cl_reg,
639   dl_reg,
640   bl_reg,
641   ah_reg,
642   ch_reg,
643   dh_reg,
644   bh_reg,
645
646   ax_reg,
647   cx_reg,
648   dx_reg,
649   bx_reg,
650   sp_reg,
651   bp_reg,
652   si_reg,
653   di_reg,
654
655   rAX_reg,
656   rCX_reg,
657   rDX_reg,
658   rBX_reg,
659   rSP_reg,
660   rBP_reg,
661   rSI_reg,
662   rDI_reg,
663
664   z_mode_ax_reg,
665   indir_dx_reg
666 };
667
668 enum
669 {
670   FLOATCODE = 1,
671   USE_REG_TABLE,
672   USE_MOD_TABLE,
673   USE_RM_TABLE,
674   USE_PREFIX_TABLE,
675   USE_X86_64_TABLE,
676   USE_3BYTE_TABLE,
677   USE_XOP_8F_TABLE,
678   USE_VEX_C4_TABLE,
679   USE_VEX_C5_TABLE,
680   USE_VEX_LEN_TABLE,
681   USE_VEX_W_TABLE,
682   USE_EVEX_TABLE
683 };
684
685 #define FLOAT                   NULL, { { NULL, FLOATCODE } }, 0
686
687 #define DIS386(T, I)            NULL, { { NULL, (T)}, { NULL,  (I) } }, 0
688 #define DIS386_PREFIX(T, I, P)          NULL, { { NULL, (T)}, { NULL,  (I) } }, P
689 #define REG_TABLE(I)            DIS386 (USE_REG_TABLE, (I))
690 #define MOD_TABLE(I)            DIS386 (USE_MOD_TABLE, (I))
691 #define RM_TABLE(I)             DIS386 (USE_RM_TABLE, (I))
692 #define PREFIX_TABLE(I)         DIS386 (USE_PREFIX_TABLE, (I))
693 #define X86_64_TABLE(I)         DIS386 (USE_X86_64_TABLE, (I))
694 #define THREE_BYTE_TABLE(I)     DIS386 (USE_3BYTE_TABLE, (I))
695 #define THREE_BYTE_TABLE_PREFIX(I, P)   DIS386_PREFIX (USE_3BYTE_TABLE, (I), P)
696 #define XOP_8F_TABLE(I)         DIS386 (USE_XOP_8F_TABLE, (I))
697 #define VEX_C4_TABLE(I)         DIS386 (USE_VEX_C4_TABLE, (I))
698 #define VEX_C5_TABLE(I)         DIS386 (USE_VEX_C5_TABLE, (I))
699 #define VEX_LEN_TABLE(I)        DIS386 (USE_VEX_LEN_TABLE, (I))
700 #define VEX_W_TABLE(I)          DIS386 (USE_VEX_W_TABLE, (I))
701 #define EVEX_TABLE(I)           DIS386 (USE_EVEX_TABLE, (I))
702
703 enum
704 {
705   REG_80 = 0,
706   REG_81,
707   REG_82,
708   REG_8F,
709   REG_C0,
710   REG_C1,
711   REG_C6,
712   REG_C7,
713   REG_D0,
714   REG_D1,
715   REG_D2,
716   REG_D3,
717   REG_F6,
718   REG_F7,
719   REG_FE,
720   REG_FF,
721   REG_0F00,
722   REG_0F01,
723   REG_0F0D,
724   REG_0F18,
725   REG_0F71,
726   REG_0F72,
727   REG_0F73,
728   REG_0FA6,
729   REG_0FA7,
730   REG_0FAE,
731   REG_0FBA,
732   REG_0FC7,
733   REG_VEX_0F71,
734   REG_VEX_0F72,
735   REG_VEX_0F73,
736   REG_VEX_0FAE,
737   REG_VEX_0F38F3,
738   REG_XOP_LWPCB,
739   REG_XOP_LWP,
740   REG_XOP_TBM_01,
741   REG_XOP_TBM_02,
742
743   REG_EVEX_0F71,
744   REG_EVEX_0F72,
745   REG_EVEX_0F73,
746   REG_EVEX_0F38C6,
747   REG_EVEX_0F38C7
748 };
749
750 enum
751 {
752   MOD_8D = 0,
753   MOD_C6_REG_7,
754   MOD_C7_REG_7,
755   MOD_FF_REG_3,
756   MOD_FF_REG_5,
757   MOD_0F01_REG_0,
758   MOD_0F01_REG_1,
759   MOD_0F01_REG_2,
760   MOD_0F01_REG_3,
761   MOD_0F01_REG_7,
762   MOD_0F12_PREFIX_0,
763   MOD_0F13,
764   MOD_0F16_PREFIX_0,
765   MOD_0F17,
766   MOD_0F18_REG_0,
767   MOD_0F18_REG_1,
768   MOD_0F18_REG_2,
769   MOD_0F18_REG_3,
770   MOD_0F18_REG_4,
771   MOD_0F18_REG_5,
772   MOD_0F18_REG_6,
773   MOD_0F18_REG_7,
774   MOD_0F1A_PREFIX_0,
775   MOD_0F1B_PREFIX_0,
776   MOD_0F1B_PREFIX_1,
777   MOD_0F24,
778   MOD_0F26,
779   MOD_0F2B_PREFIX_0,
780   MOD_0F2B_PREFIX_1,
781   MOD_0F2B_PREFIX_2,
782   MOD_0F2B_PREFIX_3,
783   MOD_0F51,
784   MOD_0F71_REG_2,
785   MOD_0F71_REG_4,
786   MOD_0F71_REG_6,
787   MOD_0F72_REG_2,
788   MOD_0F72_REG_4,
789   MOD_0F72_REG_6,
790   MOD_0F73_REG_2,
791   MOD_0F73_REG_3,
792   MOD_0F73_REG_6,
793   MOD_0F73_REG_7,
794   MOD_0FAE_REG_0,
795   MOD_0FAE_REG_1,
796   MOD_0FAE_REG_2,
797   MOD_0FAE_REG_3,
798   MOD_0FAE_REG_4,
799   MOD_0FAE_REG_5,
800   MOD_0FAE_REG_6,
801   MOD_0FAE_REG_7,
802   MOD_0FB2,
803   MOD_0FB4,
804   MOD_0FB5,
805   MOD_0FC7_REG_3,
806   MOD_0FC7_REG_4,
807   MOD_0FC7_REG_5,
808   MOD_0FC7_REG_6,
809   MOD_0FC7_REG_7,
810   MOD_0FD7,
811   MOD_0FE7_PREFIX_2,
812   MOD_0FF0_PREFIX_3,
813   MOD_0F382A_PREFIX_2,
814   MOD_62_32BIT,
815   MOD_C4_32BIT,
816   MOD_C5_32BIT,
817   MOD_VEX_0F12_PREFIX_0,
818   MOD_VEX_0F13,
819   MOD_VEX_0F16_PREFIX_0,
820   MOD_VEX_0F17,
821   MOD_VEX_0F2B,
822   MOD_VEX_0F50,
823   MOD_VEX_0F71_REG_2,
824   MOD_VEX_0F71_REG_4,
825   MOD_VEX_0F71_REG_6,
826   MOD_VEX_0F72_REG_2,
827   MOD_VEX_0F72_REG_4,
828   MOD_VEX_0F72_REG_6,
829   MOD_VEX_0F73_REG_2,
830   MOD_VEX_0F73_REG_3,
831   MOD_VEX_0F73_REG_6,
832   MOD_VEX_0F73_REG_7,
833   MOD_VEX_0FAE_REG_2,
834   MOD_VEX_0FAE_REG_3,
835   MOD_VEX_0FD7_PREFIX_2,
836   MOD_VEX_0FE7_PREFIX_2,
837   MOD_VEX_0FF0_PREFIX_3,
838   MOD_VEX_0F381A_PREFIX_2,
839   MOD_VEX_0F382A_PREFIX_2,
840   MOD_VEX_0F382C_PREFIX_2,
841   MOD_VEX_0F382D_PREFIX_2,
842   MOD_VEX_0F382E_PREFIX_2,
843   MOD_VEX_0F382F_PREFIX_2,
844   MOD_VEX_0F385A_PREFIX_2,
845   MOD_VEX_0F388C_PREFIX_2,
846   MOD_VEX_0F388E_PREFIX_2,
847
848   MOD_EVEX_0F10_PREFIX_1,
849   MOD_EVEX_0F10_PREFIX_3,
850   MOD_EVEX_0F11_PREFIX_1,
851   MOD_EVEX_0F11_PREFIX_3,
852   MOD_EVEX_0F12_PREFIX_0,
853   MOD_EVEX_0F16_PREFIX_0,
854   MOD_EVEX_0F38C6_REG_1,
855   MOD_EVEX_0F38C6_REG_2,
856   MOD_EVEX_0F38C6_REG_5,
857   MOD_EVEX_0F38C6_REG_6,
858   MOD_EVEX_0F38C7_REG_1,
859   MOD_EVEX_0F38C7_REG_2,
860   MOD_EVEX_0F38C7_REG_5,
861   MOD_EVEX_0F38C7_REG_6
862 };
863
864 enum
865 {
866   RM_C6_REG_7 = 0,
867   RM_C7_REG_7,
868   RM_0F01_REG_0,
869   RM_0F01_REG_1,
870   RM_0F01_REG_2,
871   RM_0F01_REG_3,
872   RM_0F01_REG_7,
873   RM_0FAE_REG_5,
874   RM_0FAE_REG_6,
875   RM_0FAE_REG_7
876 };
877
878 enum
879 {
880   PREFIX_90 = 0,
881   PREFIX_0F10,
882   PREFIX_0F11,
883   PREFIX_0F12,
884   PREFIX_0F16,
885   PREFIX_0F1A,
886   PREFIX_0F1B,
887   PREFIX_0F2A,
888   PREFIX_0F2B,
889   PREFIX_0F2C,
890   PREFIX_0F2D,
891   PREFIX_0F2E,
892   PREFIX_0F2F,
893   PREFIX_0F51,
894   PREFIX_0F52,
895   PREFIX_0F53,
896   PREFIX_0F58,
897   PREFIX_0F59,
898   PREFIX_0F5A,
899   PREFIX_0F5B,
900   PREFIX_0F5C,
901   PREFIX_0F5D,
902   PREFIX_0F5E,
903   PREFIX_0F5F,
904   PREFIX_0F60,
905   PREFIX_0F61,
906   PREFIX_0F62,
907   PREFIX_0F6C,
908   PREFIX_0F6D,
909   PREFIX_0F6F,
910   PREFIX_0F70,
911   PREFIX_0F73_REG_3,
912   PREFIX_0F73_REG_7,
913   PREFIX_0F78,
914   PREFIX_0F79,
915   PREFIX_0F7C,
916   PREFIX_0F7D,
917   PREFIX_0F7E,
918   PREFIX_0F7F,
919   PREFIX_0FAE_REG_0,
920   PREFIX_0FAE_REG_1,
921   PREFIX_0FAE_REG_2,
922   PREFIX_0FAE_REG_3,
923   PREFIX_0FAE_REG_6,
924   PREFIX_0FAE_REG_7,
925   PREFIX_RM_0_0FAE_REG_7,
926   PREFIX_0FB8,
927   PREFIX_0FBC,
928   PREFIX_0FBD,
929   PREFIX_0FC2,
930   PREFIX_0FC3,
931   PREFIX_MOD_0_0FC7_REG_6,
932   PREFIX_MOD_3_0FC7_REG_6,
933   PREFIX_MOD_3_0FC7_REG_7,
934   PREFIX_0FD0,
935   PREFIX_0FD6,
936   PREFIX_0FE6,
937   PREFIX_0FE7,
938   PREFIX_0FF0,
939   PREFIX_0FF7,
940   PREFIX_0F3810,
941   PREFIX_0F3814,
942   PREFIX_0F3815,
943   PREFIX_0F3817,
944   PREFIX_0F3820,
945   PREFIX_0F3821,
946   PREFIX_0F3822,
947   PREFIX_0F3823,
948   PREFIX_0F3824,
949   PREFIX_0F3825,
950   PREFIX_0F3828,
951   PREFIX_0F3829,
952   PREFIX_0F382A,
953   PREFIX_0F382B,
954   PREFIX_0F3830,
955   PREFIX_0F3831,
956   PREFIX_0F3832,
957   PREFIX_0F3833,
958   PREFIX_0F3834,
959   PREFIX_0F3835,
960   PREFIX_0F3837,
961   PREFIX_0F3838,
962   PREFIX_0F3839,
963   PREFIX_0F383A,
964   PREFIX_0F383B,
965   PREFIX_0F383C,
966   PREFIX_0F383D,
967   PREFIX_0F383E,
968   PREFIX_0F383F,
969   PREFIX_0F3840,
970   PREFIX_0F3841,
971   PREFIX_0F3880,
972   PREFIX_0F3881,
973   PREFIX_0F3882,
974   PREFIX_0F38C8,
975   PREFIX_0F38C9,
976   PREFIX_0F38CA,
977   PREFIX_0F38CB,
978   PREFIX_0F38CC,
979   PREFIX_0F38CD,
980   PREFIX_0F38DB,
981   PREFIX_0F38DC,
982   PREFIX_0F38DD,
983   PREFIX_0F38DE,
984   PREFIX_0F38DF,
985   PREFIX_0F38F0,
986   PREFIX_0F38F1,
987   PREFIX_0F38F6,
988   PREFIX_0F3A08,
989   PREFIX_0F3A09,
990   PREFIX_0F3A0A,
991   PREFIX_0F3A0B,
992   PREFIX_0F3A0C,
993   PREFIX_0F3A0D,
994   PREFIX_0F3A0E,
995   PREFIX_0F3A14,
996   PREFIX_0F3A15,
997   PREFIX_0F3A16,
998   PREFIX_0F3A17,
999   PREFIX_0F3A20,
1000   PREFIX_0F3A21,
1001   PREFIX_0F3A22,
1002   PREFIX_0F3A40,
1003   PREFIX_0F3A41,
1004   PREFIX_0F3A42,
1005   PREFIX_0F3A44,
1006   PREFIX_0F3A60,
1007   PREFIX_0F3A61,
1008   PREFIX_0F3A62,
1009   PREFIX_0F3A63,
1010   PREFIX_0F3ACC,
1011   PREFIX_0F3ADF,
1012   PREFIX_VEX_0F10,
1013   PREFIX_VEX_0F11,
1014   PREFIX_VEX_0F12,
1015   PREFIX_VEX_0F16,
1016   PREFIX_VEX_0F2A,
1017   PREFIX_VEX_0F2C,
1018   PREFIX_VEX_0F2D,
1019   PREFIX_VEX_0F2E,
1020   PREFIX_VEX_0F2F,
1021   PREFIX_VEX_0F41,
1022   PREFIX_VEX_0F42,
1023   PREFIX_VEX_0F44,
1024   PREFIX_VEX_0F45,
1025   PREFIX_VEX_0F46,
1026   PREFIX_VEX_0F47,
1027   PREFIX_VEX_0F4A,
1028   PREFIX_VEX_0F4B,
1029   PREFIX_VEX_0F51,
1030   PREFIX_VEX_0F52,
1031   PREFIX_VEX_0F53,
1032   PREFIX_VEX_0F58,
1033   PREFIX_VEX_0F59,
1034   PREFIX_VEX_0F5A,
1035   PREFIX_VEX_0F5B,
1036   PREFIX_VEX_0F5C,
1037   PREFIX_VEX_0F5D,
1038   PREFIX_VEX_0F5E,
1039   PREFIX_VEX_0F5F,
1040   PREFIX_VEX_0F60,
1041   PREFIX_VEX_0F61,
1042   PREFIX_VEX_0F62,
1043   PREFIX_VEX_0F63,
1044   PREFIX_VEX_0F64,
1045   PREFIX_VEX_0F65,
1046   PREFIX_VEX_0F66,
1047   PREFIX_VEX_0F67,
1048   PREFIX_VEX_0F68,
1049   PREFIX_VEX_0F69,
1050   PREFIX_VEX_0F6A,
1051   PREFIX_VEX_0F6B,
1052   PREFIX_VEX_0F6C,
1053   PREFIX_VEX_0F6D,
1054   PREFIX_VEX_0F6E,
1055   PREFIX_VEX_0F6F,
1056   PREFIX_VEX_0F70,
1057   PREFIX_VEX_0F71_REG_2,
1058   PREFIX_VEX_0F71_REG_4,
1059   PREFIX_VEX_0F71_REG_6,
1060   PREFIX_VEX_0F72_REG_2,
1061   PREFIX_VEX_0F72_REG_4,
1062   PREFIX_VEX_0F72_REG_6,
1063   PREFIX_VEX_0F73_REG_2,
1064   PREFIX_VEX_0F73_REG_3,
1065   PREFIX_VEX_0F73_REG_6,
1066   PREFIX_VEX_0F73_REG_7,
1067   PREFIX_VEX_0F74,
1068   PREFIX_VEX_0F75,
1069   PREFIX_VEX_0F76,
1070   PREFIX_VEX_0F77,
1071   PREFIX_VEX_0F7C,
1072   PREFIX_VEX_0F7D,
1073   PREFIX_VEX_0F7E,
1074   PREFIX_VEX_0F7F,
1075   PREFIX_VEX_0F90,
1076   PREFIX_VEX_0F91,
1077   PREFIX_VEX_0F92,
1078   PREFIX_VEX_0F93,
1079   PREFIX_VEX_0F98,
1080   PREFIX_VEX_0F99,
1081   PREFIX_VEX_0FC2,
1082   PREFIX_VEX_0FC4,
1083   PREFIX_VEX_0FC5,
1084   PREFIX_VEX_0FD0,
1085   PREFIX_VEX_0FD1,
1086   PREFIX_VEX_0FD2,
1087   PREFIX_VEX_0FD3,
1088   PREFIX_VEX_0FD4,
1089   PREFIX_VEX_0FD5,
1090   PREFIX_VEX_0FD6,
1091   PREFIX_VEX_0FD7,
1092   PREFIX_VEX_0FD8,
1093   PREFIX_VEX_0FD9,
1094   PREFIX_VEX_0FDA,
1095   PREFIX_VEX_0FDB,
1096   PREFIX_VEX_0FDC,
1097   PREFIX_VEX_0FDD,
1098   PREFIX_VEX_0FDE,
1099   PREFIX_VEX_0FDF,
1100   PREFIX_VEX_0FE0,
1101   PREFIX_VEX_0FE1,
1102   PREFIX_VEX_0FE2,
1103   PREFIX_VEX_0FE3,
1104   PREFIX_VEX_0FE4,
1105   PREFIX_VEX_0FE5,
1106   PREFIX_VEX_0FE6,
1107   PREFIX_VEX_0FE7,
1108   PREFIX_VEX_0FE8,
1109   PREFIX_VEX_0FE9,
1110   PREFIX_VEX_0FEA,
1111   PREFIX_VEX_0FEB,
1112   PREFIX_VEX_0FEC,
1113   PREFIX_VEX_0FED,
1114   PREFIX_VEX_0FEE,
1115   PREFIX_VEX_0FEF,
1116   PREFIX_VEX_0FF0,
1117   PREFIX_VEX_0FF1,
1118   PREFIX_VEX_0FF2,
1119   PREFIX_VEX_0FF3,
1120   PREFIX_VEX_0FF4,
1121   PREFIX_VEX_0FF5,
1122   PREFIX_VEX_0FF6,
1123   PREFIX_VEX_0FF7,
1124   PREFIX_VEX_0FF8,
1125   PREFIX_VEX_0FF9,
1126   PREFIX_VEX_0FFA,
1127   PREFIX_VEX_0FFB,
1128   PREFIX_VEX_0FFC,
1129   PREFIX_VEX_0FFD,
1130   PREFIX_VEX_0FFE,
1131   PREFIX_VEX_0F3800,
1132   PREFIX_VEX_0F3801,
1133   PREFIX_VEX_0F3802,
1134   PREFIX_VEX_0F3803,
1135   PREFIX_VEX_0F3804,
1136   PREFIX_VEX_0F3805,
1137   PREFIX_VEX_0F3806,
1138   PREFIX_VEX_0F3807,
1139   PREFIX_VEX_0F3808,
1140   PREFIX_VEX_0F3809,
1141   PREFIX_VEX_0F380A,
1142   PREFIX_VEX_0F380B,
1143   PREFIX_VEX_0F380C,
1144   PREFIX_VEX_0F380D,
1145   PREFIX_VEX_0F380E,
1146   PREFIX_VEX_0F380F,
1147   PREFIX_VEX_0F3813,
1148   PREFIX_VEX_0F3816,
1149   PREFIX_VEX_0F3817,
1150   PREFIX_VEX_0F3818,
1151   PREFIX_VEX_0F3819,
1152   PREFIX_VEX_0F381A,
1153   PREFIX_VEX_0F381C,
1154   PREFIX_VEX_0F381D,
1155   PREFIX_VEX_0F381E,
1156   PREFIX_VEX_0F3820,
1157   PREFIX_VEX_0F3821,
1158   PREFIX_VEX_0F3822,
1159   PREFIX_VEX_0F3823,
1160   PREFIX_VEX_0F3824,
1161   PREFIX_VEX_0F3825,
1162   PREFIX_VEX_0F3828,
1163   PREFIX_VEX_0F3829,
1164   PREFIX_VEX_0F382A,
1165   PREFIX_VEX_0F382B,
1166   PREFIX_VEX_0F382C,
1167   PREFIX_VEX_0F382D,
1168   PREFIX_VEX_0F382E,
1169   PREFIX_VEX_0F382F,
1170   PREFIX_VEX_0F3830,
1171   PREFIX_VEX_0F3831,
1172   PREFIX_VEX_0F3832,
1173   PREFIX_VEX_0F3833,
1174   PREFIX_VEX_0F3834,
1175   PREFIX_VEX_0F3835,
1176   PREFIX_VEX_0F3836,
1177   PREFIX_VEX_0F3837,
1178   PREFIX_VEX_0F3838,
1179   PREFIX_VEX_0F3839,
1180   PREFIX_VEX_0F383A,
1181   PREFIX_VEX_0F383B,
1182   PREFIX_VEX_0F383C,
1183   PREFIX_VEX_0F383D,
1184   PREFIX_VEX_0F383E,
1185   PREFIX_VEX_0F383F,
1186   PREFIX_VEX_0F3840,
1187   PREFIX_VEX_0F3841,
1188   PREFIX_VEX_0F3845,
1189   PREFIX_VEX_0F3846,
1190   PREFIX_VEX_0F3847,
1191   PREFIX_VEX_0F3858,
1192   PREFIX_VEX_0F3859,
1193   PREFIX_VEX_0F385A,
1194   PREFIX_VEX_0F3878,
1195   PREFIX_VEX_0F3879,
1196   PREFIX_VEX_0F388C,
1197   PREFIX_VEX_0F388E,
1198   PREFIX_VEX_0F3890,
1199   PREFIX_VEX_0F3891,
1200   PREFIX_VEX_0F3892,
1201   PREFIX_VEX_0F3893,
1202   PREFIX_VEX_0F3896,
1203   PREFIX_VEX_0F3897,
1204   PREFIX_VEX_0F3898,
1205   PREFIX_VEX_0F3899,
1206   PREFIX_VEX_0F389A,
1207   PREFIX_VEX_0F389B,
1208   PREFIX_VEX_0F389C,
1209   PREFIX_VEX_0F389D,
1210   PREFIX_VEX_0F389E,
1211   PREFIX_VEX_0F389F,
1212   PREFIX_VEX_0F38A6,
1213   PREFIX_VEX_0F38A7,
1214   PREFIX_VEX_0F38A8,
1215   PREFIX_VEX_0F38A9,
1216   PREFIX_VEX_0F38AA,
1217   PREFIX_VEX_0F38AB,
1218   PREFIX_VEX_0F38AC,
1219   PREFIX_VEX_0F38AD,
1220   PREFIX_VEX_0F38AE,
1221   PREFIX_VEX_0F38AF,
1222   PREFIX_VEX_0F38B6,
1223   PREFIX_VEX_0F38B7,
1224   PREFIX_VEX_0F38B8,
1225   PREFIX_VEX_0F38B9,
1226   PREFIX_VEX_0F38BA,
1227   PREFIX_VEX_0F38BB,
1228   PREFIX_VEX_0F38BC,
1229   PREFIX_VEX_0F38BD,
1230   PREFIX_VEX_0F38BE,
1231   PREFIX_VEX_0F38BF,
1232   PREFIX_VEX_0F38DB,
1233   PREFIX_VEX_0F38DC,
1234   PREFIX_VEX_0F38DD,
1235   PREFIX_VEX_0F38DE,
1236   PREFIX_VEX_0F38DF,
1237   PREFIX_VEX_0F38F2,
1238   PREFIX_VEX_0F38F3_REG_1,
1239   PREFIX_VEX_0F38F3_REG_2,
1240   PREFIX_VEX_0F38F3_REG_3,
1241   PREFIX_VEX_0F38F5,
1242   PREFIX_VEX_0F38F6,
1243   PREFIX_VEX_0F38F7,
1244   PREFIX_VEX_0F3A00,
1245   PREFIX_VEX_0F3A01,
1246   PREFIX_VEX_0F3A02,
1247   PREFIX_VEX_0F3A04,
1248   PREFIX_VEX_0F3A05,
1249   PREFIX_VEX_0F3A06,
1250   PREFIX_VEX_0F3A08,
1251   PREFIX_VEX_0F3A09,
1252   PREFIX_VEX_0F3A0A,
1253   PREFIX_VEX_0F3A0B,
1254   PREFIX_VEX_0F3A0C,
1255   PREFIX_VEX_0F3A0D,
1256   PREFIX_VEX_0F3A0E,
1257   PREFIX_VEX_0F3A0F,
1258   PREFIX_VEX_0F3A14,
1259   PREFIX_VEX_0F3A15,
1260   PREFIX_VEX_0F3A16,
1261   PREFIX_VEX_0F3A17,
1262   PREFIX_VEX_0F3A18,
1263   PREFIX_VEX_0F3A19,
1264   PREFIX_VEX_0F3A1D,
1265   PREFIX_VEX_0F3A20,
1266   PREFIX_VEX_0F3A21,
1267   PREFIX_VEX_0F3A22,
1268   PREFIX_VEX_0F3A30,
1269   PREFIX_VEX_0F3A31,
1270   PREFIX_VEX_0F3A32,
1271   PREFIX_VEX_0F3A33,
1272   PREFIX_VEX_0F3A38,
1273   PREFIX_VEX_0F3A39,
1274   PREFIX_VEX_0F3A40,
1275   PREFIX_VEX_0F3A41,
1276   PREFIX_VEX_0F3A42,
1277   PREFIX_VEX_0F3A44,
1278   PREFIX_VEX_0F3A46,
1279   PREFIX_VEX_0F3A48,
1280   PREFIX_VEX_0F3A49,
1281   PREFIX_VEX_0F3A4A,
1282   PREFIX_VEX_0F3A4B,
1283   PREFIX_VEX_0F3A4C,
1284   PREFIX_VEX_0F3A5C,
1285   PREFIX_VEX_0F3A5D,
1286   PREFIX_VEX_0F3A5E,
1287   PREFIX_VEX_0F3A5F,
1288   PREFIX_VEX_0F3A60,
1289   PREFIX_VEX_0F3A61,
1290   PREFIX_VEX_0F3A62,
1291   PREFIX_VEX_0F3A63,
1292   PREFIX_VEX_0F3A68,
1293   PREFIX_VEX_0F3A69,
1294   PREFIX_VEX_0F3A6A,
1295   PREFIX_VEX_0F3A6B,
1296   PREFIX_VEX_0F3A6C,
1297   PREFIX_VEX_0F3A6D,
1298   PREFIX_VEX_0F3A6E,
1299   PREFIX_VEX_0F3A6F,
1300   PREFIX_VEX_0F3A78,
1301   PREFIX_VEX_0F3A79,
1302   PREFIX_VEX_0F3A7A,
1303   PREFIX_VEX_0F3A7B,
1304   PREFIX_VEX_0F3A7C,
1305   PREFIX_VEX_0F3A7D,
1306   PREFIX_VEX_0F3A7E,
1307   PREFIX_VEX_0F3A7F,
1308   PREFIX_VEX_0F3ADF,
1309   PREFIX_VEX_0F3AF0,
1310
1311   PREFIX_EVEX_0F10,
1312   PREFIX_EVEX_0F11,
1313   PREFIX_EVEX_0F12,
1314   PREFIX_EVEX_0F13,
1315   PREFIX_EVEX_0F14,
1316   PREFIX_EVEX_0F15,
1317   PREFIX_EVEX_0F16,
1318   PREFIX_EVEX_0F17,
1319   PREFIX_EVEX_0F28,
1320   PREFIX_EVEX_0F29,
1321   PREFIX_EVEX_0F2A,
1322   PREFIX_EVEX_0F2B,
1323   PREFIX_EVEX_0F2C,
1324   PREFIX_EVEX_0F2D,
1325   PREFIX_EVEX_0F2E,
1326   PREFIX_EVEX_0F2F,
1327   PREFIX_EVEX_0F51,
1328   PREFIX_EVEX_0F54,
1329   PREFIX_EVEX_0F55,
1330   PREFIX_EVEX_0F56,
1331   PREFIX_EVEX_0F57,
1332   PREFIX_EVEX_0F58,
1333   PREFIX_EVEX_0F59,
1334   PREFIX_EVEX_0F5A,
1335   PREFIX_EVEX_0F5B,
1336   PREFIX_EVEX_0F5C,
1337   PREFIX_EVEX_0F5D,
1338   PREFIX_EVEX_0F5E,
1339   PREFIX_EVEX_0F5F,
1340   PREFIX_EVEX_0F60,
1341   PREFIX_EVEX_0F61,
1342   PREFIX_EVEX_0F62,
1343   PREFIX_EVEX_0F63,
1344   PREFIX_EVEX_0F64,
1345   PREFIX_EVEX_0F65,
1346   PREFIX_EVEX_0F66,
1347   PREFIX_EVEX_0F67,
1348   PREFIX_EVEX_0F68,
1349   PREFIX_EVEX_0F69,
1350   PREFIX_EVEX_0F6A,
1351   PREFIX_EVEX_0F6B,
1352   PREFIX_EVEX_0F6C,
1353   PREFIX_EVEX_0F6D,
1354   PREFIX_EVEX_0F6E,
1355   PREFIX_EVEX_0F6F,
1356   PREFIX_EVEX_0F70,
1357   PREFIX_EVEX_0F71_REG_2,
1358   PREFIX_EVEX_0F71_REG_4,
1359   PREFIX_EVEX_0F71_REG_6,
1360   PREFIX_EVEX_0F72_REG_0,
1361   PREFIX_EVEX_0F72_REG_1,
1362   PREFIX_EVEX_0F72_REG_2,
1363   PREFIX_EVEX_0F72_REG_4,
1364   PREFIX_EVEX_0F72_REG_6,
1365   PREFIX_EVEX_0F73_REG_2,
1366   PREFIX_EVEX_0F73_REG_3,
1367   PREFIX_EVEX_0F73_REG_6,
1368   PREFIX_EVEX_0F73_REG_7,
1369   PREFIX_EVEX_0F74,
1370   PREFIX_EVEX_0F75,
1371   PREFIX_EVEX_0F76,
1372   PREFIX_EVEX_0F78,
1373   PREFIX_EVEX_0F79,
1374   PREFIX_EVEX_0F7A,
1375   PREFIX_EVEX_0F7B,
1376   PREFIX_EVEX_0F7E,
1377   PREFIX_EVEX_0F7F,
1378   PREFIX_EVEX_0FC2,
1379   PREFIX_EVEX_0FC4,
1380   PREFIX_EVEX_0FC5,
1381   PREFIX_EVEX_0FC6,
1382   PREFIX_EVEX_0FD1,
1383   PREFIX_EVEX_0FD2,
1384   PREFIX_EVEX_0FD3,
1385   PREFIX_EVEX_0FD4,
1386   PREFIX_EVEX_0FD5,
1387   PREFIX_EVEX_0FD6,
1388   PREFIX_EVEX_0FD8,
1389   PREFIX_EVEX_0FD9,
1390   PREFIX_EVEX_0FDA,
1391   PREFIX_EVEX_0FDB,
1392   PREFIX_EVEX_0FDC,
1393   PREFIX_EVEX_0FDD,
1394   PREFIX_EVEX_0FDE,
1395   PREFIX_EVEX_0FDF,
1396   PREFIX_EVEX_0FE0,
1397   PREFIX_EVEX_0FE1,
1398   PREFIX_EVEX_0FE2,
1399   PREFIX_EVEX_0FE3,
1400   PREFIX_EVEX_0FE4,
1401   PREFIX_EVEX_0FE5,
1402   PREFIX_EVEX_0FE6,
1403   PREFIX_EVEX_0FE7,
1404   PREFIX_EVEX_0FE8,
1405   PREFIX_EVEX_0FE9,
1406   PREFIX_EVEX_0FEA,
1407   PREFIX_EVEX_0FEB,
1408   PREFIX_EVEX_0FEC,
1409   PREFIX_EVEX_0FED,
1410   PREFIX_EVEX_0FEE,
1411   PREFIX_EVEX_0FEF,
1412   PREFIX_EVEX_0FF1,
1413   PREFIX_EVEX_0FF2,
1414   PREFIX_EVEX_0FF3,
1415   PREFIX_EVEX_0FF4,
1416   PREFIX_EVEX_0FF5,
1417   PREFIX_EVEX_0FF6,
1418   PREFIX_EVEX_0FF8,
1419   PREFIX_EVEX_0FF9,
1420   PREFIX_EVEX_0FFA,
1421   PREFIX_EVEX_0FFB,
1422   PREFIX_EVEX_0FFC,
1423   PREFIX_EVEX_0FFD,
1424   PREFIX_EVEX_0FFE,
1425   PREFIX_EVEX_0F3800,
1426   PREFIX_EVEX_0F3804,
1427   PREFIX_EVEX_0F380B,
1428   PREFIX_EVEX_0F380C,
1429   PREFIX_EVEX_0F380D,
1430   PREFIX_EVEX_0F3810,
1431   PREFIX_EVEX_0F3811,
1432   PREFIX_EVEX_0F3812,
1433   PREFIX_EVEX_0F3813,
1434   PREFIX_EVEX_0F3814,
1435   PREFIX_EVEX_0F3815,
1436   PREFIX_EVEX_0F3816,
1437   PREFIX_EVEX_0F3818,
1438   PREFIX_EVEX_0F3819,
1439   PREFIX_EVEX_0F381A,
1440   PREFIX_EVEX_0F381B,
1441   PREFIX_EVEX_0F381C,
1442   PREFIX_EVEX_0F381D,
1443   PREFIX_EVEX_0F381E,
1444   PREFIX_EVEX_0F381F,
1445   PREFIX_EVEX_0F3820,
1446   PREFIX_EVEX_0F3821,
1447   PREFIX_EVEX_0F3822,
1448   PREFIX_EVEX_0F3823,
1449   PREFIX_EVEX_0F3824,
1450   PREFIX_EVEX_0F3825,
1451   PREFIX_EVEX_0F3826,
1452   PREFIX_EVEX_0F3827,
1453   PREFIX_EVEX_0F3828,
1454   PREFIX_EVEX_0F3829,
1455   PREFIX_EVEX_0F382A,
1456   PREFIX_EVEX_0F382B,
1457   PREFIX_EVEX_0F382C,
1458   PREFIX_EVEX_0F382D,
1459   PREFIX_EVEX_0F3830,
1460   PREFIX_EVEX_0F3831,
1461   PREFIX_EVEX_0F3832,
1462   PREFIX_EVEX_0F3833,
1463   PREFIX_EVEX_0F3834,
1464   PREFIX_EVEX_0F3835,
1465   PREFIX_EVEX_0F3836,
1466   PREFIX_EVEX_0F3837,
1467   PREFIX_EVEX_0F3838,
1468   PREFIX_EVEX_0F3839,
1469   PREFIX_EVEX_0F383A,
1470   PREFIX_EVEX_0F383B,
1471   PREFIX_EVEX_0F383C,
1472   PREFIX_EVEX_0F383D,
1473   PREFIX_EVEX_0F383E,
1474   PREFIX_EVEX_0F383F,
1475   PREFIX_EVEX_0F3840,
1476   PREFIX_EVEX_0F3842,
1477   PREFIX_EVEX_0F3843,
1478   PREFIX_EVEX_0F3844,
1479   PREFIX_EVEX_0F3845,
1480   PREFIX_EVEX_0F3846,
1481   PREFIX_EVEX_0F3847,
1482   PREFIX_EVEX_0F384C,
1483   PREFIX_EVEX_0F384D,
1484   PREFIX_EVEX_0F384E,
1485   PREFIX_EVEX_0F384F,
1486   PREFIX_EVEX_0F3858,
1487   PREFIX_EVEX_0F3859,
1488   PREFIX_EVEX_0F385A,
1489   PREFIX_EVEX_0F385B,
1490   PREFIX_EVEX_0F3864,
1491   PREFIX_EVEX_0F3865,
1492   PREFIX_EVEX_0F3866,
1493   PREFIX_EVEX_0F3875,
1494   PREFIX_EVEX_0F3876,
1495   PREFIX_EVEX_0F3877,
1496   PREFIX_EVEX_0F3878,
1497   PREFIX_EVEX_0F3879,
1498   PREFIX_EVEX_0F387A,
1499   PREFIX_EVEX_0F387B,
1500   PREFIX_EVEX_0F387C,
1501   PREFIX_EVEX_0F387D,
1502   PREFIX_EVEX_0F387E,
1503   PREFIX_EVEX_0F387F,
1504   PREFIX_EVEX_0F3883,
1505   PREFIX_EVEX_0F3888,
1506   PREFIX_EVEX_0F3889,
1507   PREFIX_EVEX_0F388A,
1508   PREFIX_EVEX_0F388B,
1509   PREFIX_EVEX_0F388D,
1510   PREFIX_EVEX_0F3890,
1511   PREFIX_EVEX_0F3891,
1512   PREFIX_EVEX_0F3892,
1513   PREFIX_EVEX_0F3893,
1514   PREFIX_EVEX_0F3896,
1515   PREFIX_EVEX_0F3897,
1516   PREFIX_EVEX_0F3898,
1517   PREFIX_EVEX_0F3899,
1518   PREFIX_EVEX_0F389A,
1519   PREFIX_EVEX_0F389B,
1520   PREFIX_EVEX_0F389C,
1521   PREFIX_EVEX_0F389D,
1522   PREFIX_EVEX_0F389E,
1523   PREFIX_EVEX_0F389F,
1524   PREFIX_EVEX_0F38A0,
1525   PREFIX_EVEX_0F38A1,
1526   PREFIX_EVEX_0F38A2,
1527   PREFIX_EVEX_0F38A3,
1528   PREFIX_EVEX_0F38A6,
1529   PREFIX_EVEX_0F38A7,
1530   PREFIX_EVEX_0F38A8,
1531   PREFIX_EVEX_0F38A9,
1532   PREFIX_EVEX_0F38AA,
1533   PREFIX_EVEX_0F38AB,
1534   PREFIX_EVEX_0F38AC,
1535   PREFIX_EVEX_0F38AD,
1536   PREFIX_EVEX_0F38AE,
1537   PREFIX_EVEX_0F38AF,
1538   PREFIX_EVEX_0F38B4,
1539   PREFIX_EVEX_0F38B5,
1540   PREFIX_EVEX_0F38B6,
1541   PREFIX_EVEX_0F38B7,
1542   PREFIX_EVEX_0F38B8,
1543   PREFIX_EVEX_0F38B9,
1544   PREFIX_EVEX_0F38BA,
1545   PREFIX_EVEX_0F38BB,
1546   PREFIX_EVEX_0F38BC,
1547   PREFIX_EVEX_0F38BD,
1548   PREFIX_EVEX_0F38BE,
1549   PREFIX_EVEX_0F38BF,
1550   PREFIX_EVEX_0F38C4,
1551   PREFIX_EVEX_0F38C6_REG_1,
1552   PREFIX_EVEX_0F38C6_REG_2,
1553   PREFIX_EVEX_0F38C6_REG_5,
1554   PREFIX_EVEX_0F38C6_REG_6,
1555   PREFIX_EVEX_0F38C7_REG_1,
1556   PREFIX_EVEX_0F38C7_REG_2,
1557   PREFIX_EVEX_0F38C7_REG_5,
1558   PREFIX_EVEX_0F38C7_REG_6,
1559   PREFIX_EVEX_0F38C8,
1560   PREFIX_EVEX_0F38CA,
1561   PREFIX_EVEX_0F38CB,
1562   PREFIX_EVEX_0F38CC,
1563   PREFIX_EVEX_0F38CD,
1564
1565   PREFIX_EVEX_0F3A00,
1566   PREFIX_EVEX_0F3A01,
1567   PREFIX_EVEX_0F3A03,
1568   PREFIX_EVEX_0F3A04,
1569   PREFIX_EVEX_0F3A05,
1570   PREFIX_EVEX_0F3A08,
1571   PREFIX_EVEX_0F3A09,
1572   PREFIX_EVEX_0F3A0A,
1573   PREFIX_EVEX_0F3A0B,
1574   PREFIX_EVEX_0F3A0F,
1575   PREFIX_EVEX_0F3A14,
1576   PREFIX_EVEX_0F3A15,
1577   PREFIX_EVEX_0F3A16,
1578   PREFIX_EVEX_0F3A17,
1579   PREFIX_EVEX_0F3A18,
1580   PREFIX_EVEX_0F3A19,
1581   PREFIX_EVEX_0F3A1A,
1582   PREFIX_EVEX_0F3A1B,
1583   PREFIX_EVEX_0F3A1D,
1584   PREFIX_EVEX_0F3A1E,
1585   PREFIX_EVEX_0F3A1F,
1586   PREFIX_EVEX_0F3A20,
1587   PREFIX_EVEX_0F3A21,
1588   PREFIX_EVEX_0F3A22,
1589   PREFIX_EVEX_0F3A23,
1590   PREFIX_EVEX_0F3A25,
1591   PREFIX_EVEX_0F3A26,
1592   PREFIX_EVEX_0F3A27,
1593   PREFIX_EVEX_0F3A38,
1594   PREFIX_EVEX_0F3A39,
1595   PREFIX_EVEX_0F3A3A,
1596   PREFIX_EVEX_0F3A3B,
1597   PREFIX_EVEX_0F3A3E,
1598   PREFIX_EVEX_0F3A3F,
1599   PREFIX_EVEX_0F3A42,
1600   PREFIX_EVEX_0F3A43,
1601   PREFIX_EVEX_0F3A50,
1602   PREFIX_EVEX_0F3A51,
1603   PREFIX_EVEX_0F3A54,
1604   PREFIX_EVEX_0F3A55,
1605   PREFIX_EVEX_0F3A56,
1606   PREFIX_EVEX_0F3A57,
1607   PREFIX_EVEX_0F3A66,
1608   PREFIX_EVEX_0F3A67
1609 };
1610
1611 enum
1612 {
1613   X86_64_06 = 0,
1614   X86_64_07,
1615   X86_64_0D,
1616   X86_64_16,
1617   X86_64_17,
1618   X86_64_1E,
1619   X86_64_1F,
1620   X86_64_27,
1621   X86_64_2F,
1622   X86_64_37,
1623   X86_64_3F,
1624   X86_64_60,
1625   X86_64_61,
1626   X86_64_62,
1627   X86_64_63,
1628   X86_64_6D,
1629   X86_64_6F,
1630   X86_64_9A,
1631   X86_64_C4,
1632   X86_64_C5,
1633   X86_64_CE,
1634   X86_64_D4,
1635   X86_64_D5,
1636   X86_64_E8,
1637   X86_64_E9,
1638   X86_64_EA,
1639   X86_64_0F01_REG_0,
1640   X86_64_0F01_REG_1,
1641   X86_64_0F01_REG_2,
1642   X86_64_0F01_REG_3
1643 };
1644
1645 enum
1646 {
1647   THREE_BYTE_0F38 = 0,
1648   THREE_BYTE_0F3A,
1649   THREE_BYTE_0F7A
1650 };
1651
1652 enum
1653 {
1654   XOP_08 = 0,
1655   XOP_09,
1656   XOP_0A
1657 };
1658
1659 enum
1660 {
1661   VEX_0F = 0,
1662   VEX_0F38,
1663   VEX_0F3A
1664 };
1665
1666 enum
1667 {
1668   EVEX_0F = 0,
1669   EVEX_0F38,
1670   EVEX_0F3A
1671 };
1672
1673 enum
1674 {
1675   VEX_LEN_0F10_P_1 = 0,
1676   VEX_LEN_0F10_P_3,
1677   VEX_LEN_0F11_P_1,
1678   VEX_LEN_0F11_P_3,
1679   VEX_LEN_0F12_P_0_M_0,
1680   VEX_LEN_0F12_P_0_M_1,
1681   VEX_LEN_0F12_P_2,
1682   VEX_LEN_0F13_M_0,
1683   VEX_LEN_0F16_P_0_M_0,
1684   VEX_LEN_0F16_P_0_M_1,
1685   VEX_LEN_0F16_P_2,
1686   VEX_LEN_0F17_M_0,
1687   VEX_LEN_0F2A_P_1,
1688   VEX_LEN_0F2A_P_3,
1689   VEX_LEN_0F2C_P_1,
1690   VEX_LEN_0F2C_P_3,
1691   VEX_LEN_0F2D_P_1,
1692   VEX_LEN_0F2D_P_3,
1693   VEX_LEN_0F2E_P_0,
1694   VEX_LEN_0F2E_P_2,
1695   VEX_LEN_0F2F_P_0,
1696   VEX_LEN_0F2F_P_2,
1697   VEX_LEN_0F41_P_0,
1698   VEX_LEN_0F41_P_2,
1699   VEX_LEN_0F42_P_0,
1700   VEX_LEN_0F42_P_2,
1701   VEX_LEN_0F44_P_0,
1702   VEX_LEN_0F44_P_2,
1703   VEX_LEN_0F45_P_0,
1704   VEX_LEN_0F45_P_2,
1705   VEX_LEN_0F46_P_0,
1706   VEX_LEN_0F46_P_2,
1707   VEX_LEN_0F47_P_0,
1708   VEX_LEN_0F47_P_2,
1709   VEX_LEN_0F4A_P_0,
1710   VEX_LEN_0F4A_P_2,
1711   VEX_LEN_0F4B_P_0,
1712   VEX_LEN_0F4B_P_2,
1713   VEX_LEN_0F51_P_1,
1714   VEX_LEN_0F51_P_3,
1715   VEX_LEN_0F52_P_1,
1716   VEX_LEN_0F53_P_1,
1717   VEX_LEN_0F58_P_1,
1718   VEX_LEN_0F58_P_3,
1719   VEX_LEN_0F59_P_1,
1720   VEX_LEN_0F59_P_3,
1721   VEX_LEN_0F5A_P_1,
1722   VEX_LEN_0F5A_P_3,
1723   VEX_LEN_0F5C_P_1,
1724   VEX_LEN_0F5C_P_3,
1725   VEX_LEN_0F5D_P_1,
1726   VEX_LEN_0F5D_P_3,
1727   VEX_LEN_0F5E_P_1,
1728   VEX_LEN_0F5E_P_3,
1729   VEX_LEN_0F5F_P_1,
1730   VEX_LEN_0F5F_P_3,
1731   VEX_LEN_0F6E_P_2,
1732   VEX_LEN_0F7E_P_1,
1733   VEX_LEN_0F7E_P_2,
1734   VEX_LEN_0F90_P_0,
1735   VEX_LEN_0F90_P_2,
1736   VEX_LEN_0F91_P_0,
1737   VEX_LEN_0F91_P_2,
1738   VEX_LEN_0F92_P_0,
1739   VEX_LEN_0F92_P_2,
1740   VEX_LEN_0F92_P_3,
1741   VEX_LEN_0F93_P_0,
1742   VEX_LEN_0F93_P_2,
1743   VEX_LEN_0F93_P_3,
1744   VEX_LEN_0F98_P_0,
1745   VEX_LEN_0F98_P_2,
1746   VEX_LEN_0F99_P_0,
1747   VEX_LEN_0F99_P_2,
1748   VEX_LEN_0FAE_R_2_M_0,
1749   VEX_LEN_0FAE_R_3_M_0,
1750   VEX_LEN_0FC2_P_1,
1751   VEX_LEN_0FC2_P_3,
1752   VEX_LEN_0FC4_P_2,
1753   VEX_LEN_0FC5_P_2,
1754   VEX_LEN_0FD6_P_2,
1755   VEX_LEN_0FF7_P_2,
1756   VEX_LEN_0F3816_P_2,
1757   VEX_LEN_0F3819_P_2,
1758   VEX_LEN_0F381A_P_2_M_0,
1759   VEX_LEN_0F3836_P_2,
1760   VEX_LEN_0F3841_P_2,
1761   VEX_LEN_0F385A_P_2_M_0,
1762   VEX_LEN_0F38DB_P_2,
1763   VEX_LEN_0F38DC_P_2,
1764   VEX_LEN_0F38DD_P_2,
1765   VEX_LEN_0F38DE_P_2,
1766   VEX_LEN_0F38DF_P_2,
1767   VEX_LEN_0F38F2_P_0,
1768   VEX_LEN_0F38F3_R_1_P_0,
1769   VEX_LEN_0F38F3_R_2_P_0,
1770   VEX_LEN_0F38F3_R_3_P_0,
1771   VEX_LEN_0F38F5_P_0,
1772   VEX_LEN_0F38F5_P_1,
1773   VEX_LEN_0F38F5_P_3,
1774   VEX_LEN_0F38F6_P_3,
1775   VEX_LEN_0F38F7_P_0,
1776   VEX_LEN_0F38F7_P_1,
1777   VEX_LEN_0F38F7_P_2,
1778   VEX_LEN_0F38F7_P_3,
1779   VEX_LEN_0F3A00_P_2,
1780   VEX_LEN_0F3A01_P_2,
1781   VEX_LEN_0F3A06_P_2,
1782   VEX_LEN_0F3A0A_P_2,
1783   VEX_LEN_0F3A0B_P_2,
1784   VEX_LEN_0F3A14_P_2,
1785   VEX_LEN_0F3A15_P_2,
1786   VEX_LEN_0F3A16_P_2,
1787   VEX_LEN_0F3A17_P_2,
1788   VEX_LEN_0F3A18_P_2,
1789   VEX_LEN_0F3A19_P_2,
1790   VEX_LEN_0F3A20_P_2,
1791   VEX_LEN_0F3A21_P_2,
1792   VEX_LEN_0F3A22_P_2,
1793   VEX_LEN_0F3A30_P_2,
1794   VEX_LEN_0F3A31_P_2,
1795   VEX_LEN_0F3A32_P_2,
1796   VEX_LEN_0F3A33_P_2,
1797   VEX_LEN_0F3A38_P_2,
1798   VEX_LEN_0F3A39_P_2,
1799   VEX_LEN_0F3A41_P_2,
1800   VEX_LEN_0F3A44_P_2,
1801   VEX_LEN_0F3A46_P_2,
1802   VEX_LEN_0F3A60_P_2,
1803   VEX_LEN_0F3A61_P_2,
1804   VEX_LEN_0F3A62_P_2,
1805   VEX_LEN_0F3A63_P_2,
1806   VEX_LEN_0F3A6A_P_2,
1807   VEX_LEN_0F3A6B_P_2,
1808   VEX_LEN_0F3A6E_P_2,
1809   VEX_LEN_0F3A6F_P_2,
1810   VEX_LEN_0F3A7A_P_2,
1811   VEX_LEN_0F3A7B_P_2,
1812   VEX_LEN_0F3A7E_P_2,
1813   VEX_LEN_0F3A7F_P_2,
1814   VEX_LEN_0F3ADF_P_2,
1815   VEX_LEN_0F3AF0_P_3,
1816   VEX_LEN_0FXOP_08_CC,
1817   VEX_LEN_0FXOP_08_CD,
1818   VEX_LEN_0FXOP_08_CE,
1819   VEX_LEN_0FXOP_08_CF,
1820   VEX_LEN_0FXOP_08_EC,
1821   VEX_LEN_0FXOP_08_ED,
1822   VEX_LEN_0FXOP_08_EE,
1823   VEX_LEN_0FXOP_08_EF,
1824   VEX_LEN_0FXOP_09_80,
1825   VEX_LEN_0FXOP_09_81
1826 };
1827
1828 enum
1829 {
1830   VEX_W_0F10_P_0 = 0,
1831   VEX_W_0F10_P_1,
1832   VEX_W_0F10_P_2,
1833   VEX_W_0F10_P_3,
1834   VEX_W_0F11_P_0,
1835   VEX_W_0F11_P_1,
1836   VEX_W_0F11_P_2,
1837   VEX_W_0F11_P_3,
1838   VEX_W_0F12_P_0_M_0,
1839   VEX_W_0F12_P_0_M_1,
1840   VEX_W_0F12_P_1,
1841   VEX_W_0F12_P_2,
1842   VEX_W_0F12_P_3,
1843   VEX_W_0F13_M_0,
1844   VEX_W_0F14,
1845   VEX_W_0F15,
1846   VEX_W_0F16_P_0_M_0,
1847   VEX_W_0F16_P_0_M_1,
1848   VEX_W_0F16_P_1,
1849   VEX_W_0F16_P_2,
1850   VEX_W_0F17_M_0,
1851   VEX_W_0F28,
1852   VEX_W_0F29,
1853   VEX_W_0F2B_M_0,
1854   VEX_W_0F2E_P_0,
1855   VEX_W_0F2E_P_2,
1856   VEX_W_0F2F_P_0,
1857   VEX_W_0F2F_P_2,
1858   VEX_W_0F41_P_0_LEN_1,
1859   VEX_W_0F41_P_2_LEN_1,
1860   VEX_W_0F42_P_0_LEN_1,
1861   VEX_W_0F42_P_2_LEN_1,
1862   VEX_W_0F44_P_0_LEN_0,
1863   VEX_W_0F44_P_2_LEN_0,
1864   VEX_W_0F45_P_0_LEN_1,
1865   VEX_W_0F45_P_2_LEN_1,
1866   VEX_W_0F46_P_0_LEN_1,
1867   VEX_W_0F46_P_2_LEN_1,
1868   VEX_W_0F47_P_0_LEN_1,
1869   VEX_W_0F47_P_2_LEN_1,
1870   VEX_W_0F4A_P_0_LEN_1,
1871   VEX_W_0F4A_P_2_LEN_1,
1872   VEX_W_0F4B_P_0_LEN_1,
1873   VEX_W_0F4B_P_2_LEN_1,
1874   VEX_W_0F50_M_0,
1875   VEX_W_0F51_P_0,
1876   VEX_W_0F51_P_1,
1877   VEX_W_0F51_P_2,
1878   VEX_W_0F51_P_3,
1879   VEX_W_0F52_P_0,
1880   VEX_W_0F52_P_1,
1881   VEX_W_0F53_P_0,
1882   VEX_W_0F53_P_1,
1883   VEX_W_0F58_P_0,
1884   VEX_W_0F58_P_1,
1885   VEX_W_0F58_P_2,
1886   VEX_W_0F58_P_3,
1887   VEX_W_0F59_P_0,
1888   VEX_W_0F59_P_1,
1889   VEX_W_0F59_P_2,
1890   VEX_W_0F59_P_3,
1891   VEX_W_0F5A_P_0,
1892   VEX_W_0F5A_P_1,
1893   VEX_W_0F5A_P_3,
1894   VEX_W_0F5B_P_0,
1895   VEX_W_0F5B_P_1,
1896   VEX_W_0F5B_P_2,
1897   VEX_W_0F5C_P_0,
1898   VEX_W_0F5C_P_1,
1899   VEX_W_0F5C_P_2,
1900   VEX_W_0F5C_P_3,
1901   VEX_W_0F5D_P_0,
1902   VEX_W_0F5D_P_1,
1903   VEX_W_0F5D_P_2,
1904   VEX_W_0F5D_P_3,
1905   VEX_W_0F5E_P_0,
1906   VEX_W_0F5E_P_1,
1907   VEX_W_0F5E_P_2,
1908   VEX_W_0F5E_P_3,
1909   VEX_W_0F5F_P_0,
1910   VEX_W_0F5F_P_1,
1911   VEX_W_0F5F_P_2,
1912   VEX_W_0F5F_P_3,
1913   VEX_W_0F60_P_2,
1914   VEX_W_0F61_P_2,
1915   VEX_W_0F62_P_2,
1916   VEX_W_0F63_P_2,
1917   VEX_W_0F64_P_2,
1918   VEX_W_0F65_P_2,
1919   VEX_W_0F66_P_2,
1920   VEX_W_0F67_P_2,
1921   VEX_W_0F68_P_2,
1922   VEX_W_0F69_P_2,
1923   VEX_W_0F6A_P_2,
1924   VEX_W_0F6B_P_2,
1925   VEX_W_0F6C_P_2,
1926   VEX_W_0F6D_P_2,
1927   VEX_W_0F6F_P_1,
1928   VEX_W_0F6F_P_2,
1929   VEX_W_0F70_P_1,
1930   VEX_W_0F70_P_2,
1931   VEX_W_0F70_P_3,
1932   VEX_W_0F71_R_2_P_2,
1933   VEX_W_0F71_R_4_P_2,
1934   VEX_W_0F71_R_6_P_2,
1935   VEX_W_0F72_R_2_P_2,
1936   VEX_W_0F72_R_4_P_2,
1937   VEX_W_0F72_R_6_P_2,
1938   VEX_W_0F73_R_2_P_2,
1939   VEX_W_0F73_R_3_P_2,
1940   VEX_W_0F73_R_6_P_2,
1941   VEX_W_0F73_R_7_P_2,
1942   VEX_W_0F74_P_2,
1943   VEX_W_0F75_P_2,
1944   VEX_W_0F76_P_2,
1945   VEX_W_0F77_P_0,
1946   VEX_W_0F7C_P_2,
1947   VEX_W_0F7C_P_3,
1948   VEX_W_0F7D_P_2,
1949   VEX_W_0F7D_P_3,
1950   VEX_W_0F7E_P_1,
1951   VEX_W_0F7F_P_1,
1952   VEX_W_0F7F_P_2,
1953   VEX_W_0F90_P_0_LEN_0,
1954   VEX_W_0F90_P_2_LEN_0,
1955   VEX_W_0F91_P_0_LEN_0,
1956   VEX_W_0F91_P_2_LEN_0,
1957   VEX_W_0F92_P_0_LEN_0,
1958   VEX_W_0F92_P_2_LEN_0,
1959   VEX_W_0F92_P_3_LEN_0,
1960   VEX_W_0F93_P_0_LEN_0,
1961   VEX_W_0F93_P_2_LEN_0,
1962   VEX_W_0F93_P_3_LEN_0,
1963   VEX_W_0F98_P_0_LEN_0,
1964   VEX_W_0F98_P_2_LEN_0,
1965   VEX_W_0F99_P_0_LEN_0,
1966   VEX_W_0F99_P_2_LEN_0,
1967   VEX_W_0FAE_R_2_M_0,
1968   VEX_W_0FAE_R_3_M_0,
1969   VEX_W_0FC2_P_0,
1970   VEX_W_0FC2_P_1,
1971   VEX_W_0FC2_P_2,
1972   VEX_W_0FC2_P_3,
1973   VEX_W_0FC4_P_2,
1974   VEX_W_0FC5_P_2,
1975   VEX_W_0FD0_P_2,
1976   VEX_W_0FD0_P_3,
1977   VEX_W_0FD1_P_2,
1978   VEX_W_0FD2_P_2,
1979   VEX_W_0FD3_P_2,
1980   VEX_W_0FD4_P_2,
1981   VEX_W_0FD5_P_2,
1982   VEX_W_0FD6_P_2,
1983   VEX_W_0FD7_P_2_M_1,
1984   VEX_W_0FD8_P_2,
1985   VEX_W_0FD9_P_2,
1986   VEX_W_0FDA_P_2,
1987   VEX_W_0FDB_P_2,
1988   VEX_W_0FDC_P_2,
1989   VEX_W_0FDD_P_2,
1990   VEX_W_0FDE_P_2,
1991   VEX_W_0FDF_P_2,
1992   VEX_W_0FE0_P_2,
1993   VEX_W_0FE1_P_2,
1994   VEX_W_0FE2_P_2,
1995   VEX_W_0FE3_P_2,
1996   VEX_W_0FE4_P_2,
1997   VEX_W_0FE5_P_2,
1998   VEX_W_0FE6_P_1,
1999   VEX_W_0FE6_P_2,
2000   VEX_W_0FE6_P_3,
2001   VEX_W_0FE7_P_2_M_0,
2002   VEX_W_0FE8_P_2,
2003   VEX_W_0FE9_P_2,
2004   VEX_W_0FEA_P_2,
2005   VEX_W_0FEB_P_2,
2006   VEX_W_0FEC_P_2,
2007   VEX_W_0FED_P_2,
2008   VEX_W_0FEE_P_2,
2009   VEX_W_0FEF_P_2,
2010   VEX_W_0FF0_P_3_M_0,
2011   VEX_W_0FF1_P_2,
2012   VEX_W_0FF2_P_2,
2013   VEX_W_0FF3_P_2,
2014   VEX_W_0FF4_P_2,
2015   VEX_W_0FF5_P_2,
2016   VEX_W_0FF6_P_2,
2017   VEX_W_0FF7_P_2,
2018   VEX_W_0FF8_P_2,
2019   VEX_W_0FF9_P_2,
2020   VEX_W_0FFA_P_2,
2021   VEX_W_0FFB_P_2,
2022   VEX_W_0FFC_P_2,
2023   VEX_W_0FFD_P_2,
2024   VEX_W_0FFE_P_2,
2025   VEX_W_0F3800_P_2,
2026   VEX_W_0F3801_P_2,
2027   VEX_W_0F3802_P_2,
2028   VEX_W_0F3803_P_2,
2029   VEX_W_0F3804_P_2,
2030   VEX_W_0F3805_P_2,
2031   VEX_W_0F3806_P_2,
2032   VEX_W_0F3807_P_2,
2033   VEX_W_0F3808_P_2,
2034   VEX_W_0F3809_P_2,
2035   VEX_W_0F380A_P_2,
2036   VEX_W_0F380B_P_2,
2037   VEX_W_0F380C_P_2,
2038   VEX_W_0F380D_P_2,
2039   VEX_W_0F380E_P_2,
2040   VEX_W_0F380F_P_2,
2041   VEX_W_0F3816_P_2,
2042   VEX_W_0F3817_P_2,
2043   VEX_W_0F3818_P_2,
2044   VEX_W_0F3819_P_2,
2045   VEX_W_0F381A_P_2_M_0,
2046   VEX_W_0F381C_P_2,
2047   VEX_W_0F381D_P_2,
2048   VEX_W_0F381E_P_2,
2049   VEX_W_0F3820_P_2,
2050   VEX_W_0F3821_P_2,
2051   VEX_W_0F3822_P_2,
2052   VEX_W_0F3823_P_2,
2053   VEX_W_0F3824_P_2,
2054   VEX_W_0F3825_P_2,
2055   VEX_W_0F3828_P_2,
2056   VEX_W_0F3829_P_2,
2057   VEX_W_0F382A_P_2_M_0,
2058   VEX_W_0F382B_P_2,
2059   VEX_W_0F382C_P_2_M_0,
2060   VEX_W_0F382D_P_2_M_0,
2061   VEX_W_0F382E_P_2_M_0,
2062   VEX_W_0F382F_P_2_M_0,
2063   VEX_W_0F3830_P_2,
2064   VEX_W_0F3831_P_2,
2065   VEX_W_0F3832_P_2,
2066   VEX_W_0F3833_P_2,
2067   VEX_W_0F3834_P_2,
2068   VEX_W_0F3835_P_2,
2069   VEX_W_0F3836_P_2,
2070   VEX_W_0F3837_P_2,
2071   VEX_W_0F3838_P_2,
2072   VEX_W_0F3839_P_2,
2073   VEX_W_0F383A_P_2,
2074   VEX_W_0F383B_P_2,
2075   VEX_W_0F383C_P_2,
2076   VEX_W_0F383D_P_2,
2077   VEX_W_0F383E_P_2,
2078   VEX_W_0F383F_P_2,
2079   VEX_W_0F3840_P_2,
2080   VEX_W_0F3841_P_2,
2081   VEX_W_0F3846_P_2,
2082   VEX_W_0F3858_P_2,
2083   VEX_W_0F3859_P_2,
2084   VEX_W_0F385A_P_2_M_0,
2085   VEX_W_0F3878_P_2,
2086   VEX_W_0F3879_P_2,
2087   VEX_W_0F38DB_P_2,
2088   VEX_W_0F38DC_P_2,
2089   VEX_W_0F38DD_P_2,
2090   VEX_W_0F38DE_P_2,
2091   VEX_W_0F38DF_P_2,
2092   VEX_W_0F3A00_P_2,
2093   VEX_W_0F3A01_P_2,
2094   VEX_W_0F3A02_P_2,
2095   VEX_W_0F3A04_P_2,
2096   VEX_W_0F3A05_P_2,
2097   VEX_W_0F3A06_P_2,
2098   VEX_W_0F3A08_P_2,
2099   VEX_W_0F3A09_P_2,
2100   VEX_W_0F3A0A_P_2,
2101   VEX_W_0F3A0B_P_2,
2102   VEX_W_0F3A0C_P_2,
2103   VEX_W_0F3A0D_P_2,
2104   VEX_W_0F3A0E_P_2,
2105   VEX_W_0F3A0F_P_2,
2106   VEX_W_0F3A14_P_2,
2107   VEX_W_0F3A15_P_2,
2108   VEX_W_0F3A18_P_2,
2109   VEX_W_0F3A19_P_2,
2110   VEX_W_0F3A20_P_2,
2111   VEX_W_0F3A21_P_2,
2112   VEX_W_0F3A30_P_2_LEN_0,
2113   VEX_W_0F3A31_P_2_LEN_0,
2114   VEX_W_0F3A32_P_2_LEN_0,
2115   VEX_W_0F3A33_P_2_LEN_0,
2116   VEX_W_0F3A38_P_2,
2117   VEX_W_0F3A39_P_2,
2118   VEX_W_0F3A40_P_2,
2119   VEX_W_0F3A41_P_2,
2120   VEX_W_0F3A42_P_2,
2121   VEX_W_0F3A44_P_2,
2122   VEX_W_0F3A46_P_2,
2123   VEX_W_0F3A48_P_2,
2124   VEX_W_0F3A49_P_2,
2125   VEX_W_0F3A4A_P_2,
2126   VEX_W_0F3A4B_P_2,
2127   VEX_W_0F3A4C_P_2,
2128   VEX_W_0F3A60_P_2,
2129   VEX_W_0F3A61_P_2,
2130   VEX_W_0F3A62_P_2,
2131   VEX_W_0F3A63_P_2,
2132   VEX_W_0F3ADF_P_2,
2133
2134   EVEX_W_0F10_P_0,
2135   EVEX_W_0F10_P_1_M_0,
2136   EVEX_W_0F10_P_1_M_1,
2137   EVEX_W_0F10_P_2,
2138   EVEX_W_0F10_P_3_M_0,
2139   EVEX_W_0F10_P_3_M_1,
2140   EVEX_W_0F11_P_0,
2141   EVEX_W_0F11_P_1_M_0,
2142   EVEX_W_0F11_P_1_M_1,
2143   EVEX_W_0F11_P_2,
2144   EVEX_W_0F11_P_3_M_0,
2145   EVEX_W_0F11_P_3_M_1,
2146   EVEX_W_0F12_P_0_M_0,
2147   EVEX_W_0F12_P_0_M_1,
2148   EVEX_W_0F12_P_1,
2149   EVEX_W_0F12_P_2,
2150   EVEX_W_0F12_P_3,
2151   EVEX_W_0F13_P_0,
2152   EVEX_W_0F13_P_2,
2153   EVEX_W_0F14_P_0,
2154   EVEX_W_0F14_P_2,
2155   EVEX_W_0F15_P_0,
2156   EVEX_W_0F15_P_2,
2157   EVEX_W_0F16_P_0_M_0,
2158   EVEX_W_0F16_P_0_M_1,
2159   EVEX_W_0F16_P_1,
2160   EVEX_W_0F16_P_2,
2161   EVEX_W_0F17_P_0,
2162   EVEX_W_0F17_P_2,
2163   EVEX_W_0F28_P_0,
2164   EVEX_W_0F28_P_2,
2165   EVEX_W_0F29_P_0,
2166   EVEX_W_0F29_P_2,
2167   EVEX_W_0F2A_P_1,
2168   EVEX_W_0F2A_P_3,
2169   EVEX_W_0F2B_P_0,
2170   EVEX_W_0F2B_P_2,
2171   EVEX_W_0F2E_P_0,
2172   EVEX_W_0F2E_P_2,
2173   EVEX_W_0F2F_P_0,
2174   EVEX_W_0F2F_P_2,
2175   EVEX_W_0F51_P_0,
2176   EVEX_W_0F51_P_1,
2177   EVEX_W_0F51_P_2,
2178   EVEX_W_0F51_P_3,
2179   EVEX_W_0F54_P_0,
2180   EVEX_W_0F54_P_2,
2181   EVEX_W_0F55_P_0,
2182   EVEX_W_0F55_P_2,
2183   EVEX_W_0F56_P_0,
2184   EVEX_W_0F56_P_2,
2185   EVEX_W_0F57_P_0,
2186   EVEX_W_0F57_P_2,
2187   EVEX_W_0F58_P_0,
2188   EVEX_W_0F58_P_1,
2189   EVEX_W_0F58_P_2,
2190   EVEX_W_0F58_P_3,
2191   EVEX_W_0F59_P_0,
2192   EVEX_W_0F59_P_1,
2193   EVEX_W_0F59_P_2,
2194   EVEX_W_0F59_P_3,
2195   EVEX_W_0F5A_P_0,
2196   EVEX_W_0F5A_P_1,
2197   EVEX_W_0F5A_P_2,
2198   EVEX_W_0F5A_P_3,
2199   EVEX_W_0F5B_P_0,
2200   EVEX_W_0F5B_P_1,
2201   EVEX_W_0F5B_P_2,
2202   EVEX_W_0F5C_P_0,
2203   EVEX_W_0F5C_P_1,
2204   EVEX_W_0F5C_P_2,
2205   EVEX_W_0F5C_P_3,
2206   EVEX_W_0F5D_P_0,
2207   EVEX_W_0F5D_P_1,
2208   EVEX_W_0F5D_P_2,
2209   EVEX_W_0F5D_P_3,
2210   EVEX_W_0F5E_P_0,
2211   EVEX_W_0F5E_P_1,
2212   EVEX_W_0F5E_P_2,
2213   EVEX_W_0F5E_P_3,
2214   EVEX_W_0F5F_P_0,
2215   EVEX_W_0F5F_P_1,
2216   EVEX_W_0F5F_P_2,
2217   EVEX_W_0F5F_P_3,
2218   EVEX_W_0F62_P_2,
2219   EVEX_W_0F66_P_2,
2220   EVEX_W_0F6A_P_2,
2221   EVEX_W_0F6B_P_2,
2222   EVEX_W_0F6C_P_2,
2223   EVEX_W_0F6D_P_2,
2224   EVEX_W_0F6E_P_2,
2225   EVEX_W_0F6F_P_1,
2226   EVEX_W_0F6F_P_2,
2227   EVEX_W_0F6F_P_3,
2228   EVEX_W_0F70_P_2,
2229   EVEX_W_0F72_R_2_P_2,
2230   EVEX_W_0F72_R_6_P_2,
2231   EVEX_W_0F73_R_2_P_2,
2232   EVEX_W_0F73_R_6_P_2,
2233   EVEX_W_0F76_P_2,
2234   EVEX_W_0F78_P_0,
2235   EVEX_W_0F78_P_2,
2236   EVEX_W_0F79_P_0,
2237   EVEX_W_0F79_P_2,
2238   EVEX_W_0F7A_P_1,
2239   EVEX_W_0F7A_P_2,
2240   EVEX_W_0F7A_P_3,
2241   EVEX_W_0F7B_P_1,
2242   EVEX_W_0F7B_P_2,
2243   EVEX_W_0F7B_P_3,
2244   EVEX_W_0F7E_P_1,
2245   EVEX_W_0F7E_P_2,
2246   EVEX_W_0F7F_P_1,
2247   EVEX_W_0F7F_P_2,
2248   EVEX_W_0F7F_P_3,
2249   EVEX_W_0FC2_P_0,
2250   EVEX_W_0FC2_P_1,
2251   EVEX_W_0FC2_P_2,
2252   EVEX_W_0FC2_P_3,
2253   EVEX_W_0FC6_P_0,
2254   EVEX_W_0FC6_P_2,
2255   EVEX_W_0FD2_P_2,
2256   EVEX_W_0FD3_P_2,
2257   EVEX_W_0FD4_P_2,
2258   EVEX_W_0FD6_P_2,
2259   EVEX_W_0FE6_P_1,
2260   EVEX_W_0FE6_P_2,
2261   EVEX_W_0FE6_P_3,
2262   EVEX_W_0FE7_P_2,
2263   EVEX_W_0FF2_P_2,
2264   EVEX_W_0FF3_P_2,
2265   EVEX_W_0FF4_P_2,
2266   EVEX_W_0FFA_P_2,
2267   EVEX_W_0FFB_P_2,
2268   EVEX_W_0FFE_P_2,
2269   EVEX_W_0F380C_P_2,
2270   EVEX_W_0F380D_P_2,
2271   EVEX_W_0F3810_P_1,
2272   EVEX_W_0F3810_P_2,
2273   EVEX_W_0F3811_P_1,
2274   EVEX_W_0F3811_P_2,
2275   EVEX_W_0F3812_P_1,
2276   EVEX_W_0F3812_P_2,
2277   EVEX_W_0F3813_P_1,
2278   EVEX_W_0F3813_P_2,
2279   EVEX_W_0F3814_P_1,
2280   EVEX_W_0F3815_P_1,
2281   EVEX_W_0F3818_P_2,
2282   EVEX_W_0F3819_P_2,
2283   EVEX_W_0F381A_P_2,
2284   EVEX_W_0F381B_P_2,
2285   EVEX_W_0F381E_P_2,
2286   EVEX_W_0F381F_P_2,
2287   EVEX_W_0F3820_P_1,
2288   EVEX_W_0F3821_P_1,
2289   EVEX_W_0F3822_P_1,
2290   EVEX_W_0F3823_P_1,
2291   EVEX_W_0F3824_P_1,
2292   EVEX_W_0F3825_P_1,
2293   EVEX_W_0F3825_P_2,
2294   EVEX_W_0F3826_P_1,
2295   EVEX_W_0F3826_P_2,
2296   EVEX_W_0F3828_P_1,
2297   EVEX_W_0F3828_P_2,
2298   EVEX_W_0F3829_P_1,
2299   EVEX_W_0F3829_P_2,
2300   EVEX_W_0F382A_P_1,
2301   EVEX_W_0F382A_P_2,
2302   EVEX_W_0F382B_P_2,
2303   EVEX_W_0F3830_P_1,
2304   EVEX_W_0F3831_P_1,
2305   EVEX_W_0F3832_P_1,
2306   EVEX_W_0F3833_P_1,
2307   EVEX_W_0F3834_P_1,
2308   EVEX_W_0F3835_P_1,
2309   EVEX_W_0F3835_P_2,
2310   EVEX_W_0F3837_P_2,
2311   EVEX_W_0F3838_P_1,
2312   EVEX_W_0F3839_P_1,
2313   EVEX_W_0F383A_P_1,
2314   EVEX_W_0F3840_P_2,
2315   EVEX_W_0F3858_P_2,
2316   EVEX_W_0F3859_P_2,
2317   EVEX_W_0F385A_P_2,
2318   EVEX_W_0F385B_P_2,
2319   EVEX_W_0F3866_P_2,
2320   EVEX_W_0F3875_P_2,
2321   EVEX_W_0F3878_P_2,
2322   EVEX_W_0F3879_P_2,
2323   EVEX_W_0F387A_P_2,
2324   EVEX_W_0F387B_P_2,
2325   EVEX_W_0F387D_P_2,
2326   EVEX_W_0F3883_P_2,
2327   EVEX_W_0F388D_P_2,
2328   EVEX_W_0F3891_P_2,
2329   EVEX_W_0F3893_P_2,
2330   EVEX_W_0F38A1_P_2,
2331   EVEX_W_0F38A3_P_2,
2332   EVEX_W_0F38C7_R_1_P_2,
2333   EVEX_W_0F38C7_R_2_P_2,
2334   EVEX_W_0F38C7_R_5_P_2,
2335   EVEX_W_0F38C7_R_6_P_2,
2336
2337   EVEX_W_0F3A00_P_2,
2338   EVEX_W_0F3A01_P_2,
2339   EVEX_W_0F3A04_P_2,
2340   EVEX_W_0F3A05_P_2,
2341   EVEX_W_0F3A08_P_2,
2342   EVEX_W_0F3A09_P_2,
2343   EVEX_W_0F3A0A_P_2,
2344   EVEX_W_0F3A0B_P_2,
2345   EVEX_W_0F3A16_P_2,
2346   EVEX_W_0F3A18_P_2,
2347   EVEX_W_0F3A19_P_2,
2348   EVEX_W_0F3A1A_P_2,
2349   EVEX_W_0F3A1B_P_2,
2350   EVEX_W_0F3A1D_P_2,
2351   EVEX_W_0F3A21_P_2,
2352   EVEX_W_0F3A22_P_2,
2353   EVEX_W_0F3A23_P_2,
2354   EVEX_W_0F3A38_P_2,
2355   EVEX_W_0F3A39_P_2,
2356   EVEX_W_0F3A3A_P_2,
2357   EVEX_W_0F3A3B_P_2,
2358   EVEX_W_0F3A3E_P_2,
2359   EVEX_W_0F3A3F_P_2,
2360   EVEX_W_0F3A42_P_2,
2361   EVEX_W_0F3A43_P_2,
2362   EVEX_W_0F3A50_P_2,
2363   EVEX_W_0F3A51_P_2,
2364   EVEX_W_0F3A56_P_2,
2365   EVEX_W_0F3A57_P_2,
2366   EVEX_W_0F3A66_P_2,
2367   EVEX_W_0F3A67_P_2
2368 };
2369
2370 typedef void (*op_rtn) (int bytemode, int sizeflag);
2371
2372 struct dis386 {
2373   const char *name;
2374   struct
2375     {
2376       op_rtn rtn;
2377       int bytemode;
2378     } op[MAX_OPERANDS];
2379   unsigned int prefix_requirement;
2380 };
2381
2382 /* Upper case letters in the instruction names here are macros.
2383    'A' => print 'b' if no register operands or suffix_always is true
2384    'B' => print 'b' if suffix_always is true
2385    'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
2386           size prefix
2387    'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
2388           suffix_always is true
2389    'E' => print 'e' if 32-bit form of jcxz
2390    'F' => print 'w' or 'l' depending on address size prefix (loop insns)
2391    'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
2392    'H' => print ",pt" or ",pn" branch hint
2393    'I' => honor following macro letter even in Intel mode (implemented only
2394           for some of the macro letters)
2395    'J' => print 'l'
2396    'K' => print 'd' or 'q' if rex prefix is present.
2397    'L' => print 'l' if suffix_always is true
2398    'M' => print 'r' if intel_mnemonic is false.
2399    'N' => print 'n' if instruction has no wait "prefix"
2400    'O' => print 'd' or 'o' (or 'q' in Intel mode)
2401    'P' => print 'w', 'l' or 'q' if instruction has an operand size prefix,
2402           or suffix_always is true.  print 'q' if rex prefix is present.
2403    'Q' => print 'w', 'l' or 'q' for memory operand or suffix_always
2404           is true
2405    'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
2406    'S' => print 'w', 'l' or 'q' if suffix_always is true
2407    'T' => print 'q' in 64bit mode if instruction has no operand size
2408           prefix and behave as 'P' otherwise
2409    'U' => print 'q' in 64bit mode if instruction has no operand size
2410           prefix and behave as 'Q' otherwise
2411    'V' => print 'q' in 64bit mode if instruction has no operand size
2412           prefix and behave as 'S' otherwise
2413    'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
2414    'X' => print 's', 'd' depending on data16 prefix (for XMM)
2415    'Y' => 'q' if instruction has an REX 64bit overwrite prefix and
2416           suffix_always is true.
2417    'Z' => print 'q' in 64bit mode and behave as 'L' otherwise
2418    '!' => change condition from true to false or from false to true.
2419    '%' => add 1 upper case letter to the macro.
2420    '^' => print 'w' or 'l' depending on operand size prefix or
2421           suffix_always is true (lcall/ljmp).
2422    '@' => print 'q' for Intel64 ISA, 'w' or 'q' for AMD64 ISA depending
2423           on operand size prefix.
2424
2425    2 upper case letter macros:
2426    "XY" => print 'x' or 'y' if suffix_always is true or no register
2427            operands and no broadcast.
2428    "XZ" => print 'x', 'y', or 'z' if suffix_always is true or no
2429            register operands and no broadcast.
2430    "XW" => print 's', 'd' depending on the VEX.W bit (for FMA)
2431    "LQ" => print 'l' ('d' in Intel mode) or 'q' for memory operand
2432            or suffix_always is true
2433    "LB" => print "abs" in 64bit mode and behave as 'B' otherwise
2434    "LS" => print "abs" in 64bit mode and behave as 'S' otherwise
2435    "LV" => print "abs" for 64bit operand and behave as 'S' otherwise
2436    "LW" => print 'd', 'q' depending on the VEX.W bit
2437    "LP" => print 'w' or 'l' ('d' in Intel mode) if instruction has
2438            an operand size prefix, or suffix_always is true.  print
2439            'q' if rex prefix is present.
2440
2441    Many of the above letters print nothing in Intel mode.  See "putop"
2442    for the details.
2443
2444    Braces '{' and '}', and vertical bars '|', indicate alternative
2445    mnemonic strings for AT&T and Intel.  */
2446
2447 static const struct dis386 dis386[] = {
2448   /* 00 */
2449   { "addB",             { Ebh1, Gb }, 0 },
2450   { "addS",             { Evh1, Gv }, 0 },
2451   { "addB",             { Gb, EbS }, 0 },
2452   { "addS",             { Gv, EvS }, 0 },
2453   { "addB",             { AL, Ib }, 0 },
2454   { "addS",             { eAX, Iv }, 0 },
2455   { X86_64_TABLE (X86_64_06) },
2456   { X86_64_TABLE (X86_64_07) },
2457   /* 08 */
2458   { "orB",              { Ebh1, Gb }, 0 },
2459   { "orS",              { Evh1, Gv }, 0 },
2460   { "orB",              { Gb, EbS }, 0 },
2461   { "orS",              { Gv, EvS }, 0 },
2462   { "orB",              { AL, Ib }, 0 },
2463   { "orS",              { eAX, Iv }, 0 },
2464   { X86_64_TABLE (X86_64_0D) },
2465   { Bad_Opcode },       /* 0x0f extended opcode escape */
2466   /* 10 */
2467   { "adcB",             { Ebh1, Gb }, 0 },
2468   { "adcS",             { Evh1, Gv }, 0 },
2469   { "adcB",             { Gb, EbS }, 0 },
2470   { "adcS",             { Gv, EvS }, 0 },
2471   { "adcB",             { AL, Ib }, 0 },
2472   { "adcS",             { eAX, Iv }, 0 },
2473   { X86_64_TABLE (X86_64_16) },
2474   { X86_64_TABLE (X86_64_17) },
2475   /* 18 */
2476   { "sbbB",             { Ebh1, Gb }, 0 },
2477   { "sbbS",             { Evh1, Gv }, 0 },
2478   { "sbbB",             { Gb, EbS }, 0 },
2479   { "sbbS",             { Gv, EvS }, 0 },
2480   { "sbbB",             { AL, Ib }, 0 },
2481   { "sbbS",             { eAX, Iv }, 0 },
2482   { X86_64_TABLE (X86_64_1E) },
2483   { X86_64_TABLE (X86_64_1F) },
2484   /* 20 */
2485   { "andB",             { Ebh1, Gb }, 0 },
2486   { "andS",             { Evh1, Gv }, 0 },
2487   { "andB",             { Gb, EbS }, 0 },
2488   { "andS",             { Gv, EvS }, 0 },
2489   { "andB",             { AL, Ib }, 0 },
2490   { "andS",             { eAX, Iv }, 0 },
2491   { Bad_Opcode },       /* SEG ES prefix */
2492   { X86_64_TABLE (X86_64_27) },
2493   /* 28 */
2494   { "subB",             { Ebh1, Gb }, 0 },
2495   { "subS",             { Evh1, Gv }, 0 },
2496   { "subB",             { Gb, EbS }, 0 },
2497   { "subS",             { Gv, EvS }, 0 },
2498   { "subB",             { AL, Ib }, 0 },
2499   { "subS",             { eAX, Iv }, 0 },
2500   { Bad_Opcode },       /* SEG CS prefix */
2501   { X86_64_TABLE (X86_64_2F) },
2502   /* 30 */
2503   { "xorB",             { Ebh1, Gb }, 0 },
2504   { "xorS",             { Evh1, Gv }, 0 },
2505   { "xorB",             { Gb, EbS }, 0 },
2506   { "xorS",             { Gv, EvS }, 0 },
2507   { "xorB",             { AL, Ib }, 0 },
2508   { "xorS",             { eAX, Iv }, 0 },
2509   { Bad_Opcode },       /* SEG SS prefix */
2510   { X86_64_TABLE (X86_64_37) },
2511   /* 38 */
2512   { "cmpB",             { Eb, Gb }, 0 },
2513   { "cmpS",             { Ev, Gv }, 0 },
2514   { "cmpB",             { Gb, EbS }, 0 },
2515   { "cmpS",             { Gv, EvS }, 0 },
2516   { "cmpB",             { AL, Ib }, 0 },
2517   { "cmpS",             { eAX, Iv }, 0 },
2518   { Bad_Opcode },       /* SEG DS prefix */
2519   { X86_64_TABLE (X86_64_3F) },
2520   /* 40 */
2521   { "inc{S|}",          { RMeAX }, 0 },
2522   { "inc{S|}",          { RMeCX }, 0 },
2523   { "inc{S|}",          { RMeDX }, 0 },
2524   { "inc{S|}",          { RMeBX }, 0 },
2525   { "inc{S|}",          { RMeSP }, 0 },
2526   { "inc{S|}",          { RMeBP }, 0 },
2527   { "inc{S|}",          { RMeSI }, 0 },
2528   { "inc{S|}",          { RMeDI }, 0 },
2529   /* 48 */
2530   { "dec{S|}",          { RMeAX }, 0 },
2531   { "dec{S|}",          { RMeCX }, 0 },
2532   { "dec{S|}",          { RMeDX }, 0 },
2533   { "dec{S|}",          { RMeBX }, 0 },
2534   { "dec{S|}",          { RMeSP }, 0 },
2535   { "dec{S|}",          { RMeBP }, 0 },
2536   { "dec{S|}",          { RMeSI }, 0 },
2537   { "dec{S|}",          { RMeDI }, 0 },
2538   /* 50 */
2539   { "pushV",            { RMrAX }, 0 },
2540   { "pushV",            { RMrCX }, 0 },
2541   { "pushV",            { RMrDX }, 0 },
2542   { "pushV",            { RMrBX }, 0 },
2543   { "pushV",            { RMrSP }, 0 },
2544   { "pushV",            { RMrBP }, 0 },
2545   { "pushV",            { RMrSI }, 0 },
2546   { "pushV",            { RMrDI }, 0 },
2547   /* 58 */
2548   { "popV",             { RMrAX }, 0 },
2549   { "popV",             { RMrCX }, 0 },
2550   { "popV",             { RMrDX }, 0 },
2551   { "popV",             { RMrBX }, 0 },
2552   { "popV",             { RMrSP }, 0 },
2553   { "popV",             { RMrBP }, 0 },
2554   { "popV",             { RMrSI }, 0 },
2555   { "popV",             { RMrDI }, 0 },
2556   /* 60 */
2557   { X86_64_TABLE (X86_64_60) },
2558   { X86_64_TABLE (X86_64_61) },
2559   { X86_64_TABLE (X86_64_62) },
2560   { X86_64_TABLE (X86_64_63) },
2561   { Bad_Opcode },       /* seg fs */
2562   { Bad_Opcode },       /* seg gs */
2563   { Bad_Opcode },       /* op size prefix */
2564   { Bad_Opcode },       /* adr size prefix */
2565   /* 68 */
2566   { "pushT",            { sIv }, 0 },
2567   { "imulS",            { Gv, Ev, Iv }, 0 },
2568   { "pushT",            { sIbT }, 0 },
2569   { "imulS",            { Gv, Ev, sIb }, 0 },
2570   { "ins{b|}",          { Ybr, indirDX }, 0 },
2571   { X86_64_TABLE (X86_64_6D) },
2572   { "outs{b|}",         { indirDXr, Xb }, 0 },
2573   { X86_64_TABLE (X86_64_6F) },
2574   /* 70 */
2575   { "joH",              { Jb, BND, cond_jump_flag }, 0 },
2576   { "jnoH",             { Jb, BND, cond_jump_flag }, 0 },
2577   { "jbH",              { Jb, BND, cond_jump_flag }, 0 },
2578   { "jaeH",             { Jb, BND, cond_jump_flag }, 0 },
2579   { "jeH",              { Jb, BND, cond_jump_flag }, 0 },
2580   { "jneH",             { Jb, BND, cond_jump_flag }, 0 },
2581   { "jbeH",             { Jb, BND, cond_jump_flag }, 0 },
2582   { "jaH",              { Jb, BND, cond_jump_flag }, 0 },
2583   /* 78 */
2584   { "jsH",              { Jb, BND, cond_jump_flag }, 0 },
2585   { "jnsH",             { Jb, BND, cond_jump_flag }, 0 },
2586   { "jpH",              { Jb, BND, cond_jump_flag }, 0 },
2587   { "jnpH",             { Jb, BND, cond_jump_flag }, 0 },
2588   { "jlH",              { Jb, BND, cond_jump_flag }, 0 },
2589   { "jgeH",             { Jb, BND, cond_jump_flag }, 0 },
2590   { "jleH",             { Jb, BND, cond_jump_flag }, 0 },
2591   { "jgH",              { Jb, BND, cond_jump_flag }, 0 },
2592   /* 80 */
2593   { REG_TABLE (REG_80) },
2594   { REG_TABLE (REG_81) },
2595   { Bad_Opcode },
2596   { REG_TABLE (REG_82) },
2597   { "testB",            { Eb, Gb }, 0 },
2598   { "testS",            { Ev, Gv }, 0 },
2599   { "xchgB",            { Ebh2, Gb }, 0 },
2600   { "xchgS",            { Evh2, Gv }, 0 },
2601   /* 88 */
2602   { "movB",             { Ebh3, Gb }, 0 },
2603   { "movS",             { Evh3, Gv }, 0 },
2604   { "movB",             { Gb, EbS }, 0 },
2605   { "movS",             { Gv, EvS }, 0 },
2606   { "movD",             { Sv, Sw }, 0 },
2607   { MOD_TABLE (MOD_8D) },
2608   { "movD",             { Sw, Sv }, 0 },
2609   { REG_TABLE (REG_8F) },
2610   /* 90 */
2611   { PREFIX_TABLE (PREFIX_90) },
2612   { "xchgS",            { RMeCX, eAX }, 0 },
2613   { "xchgS",            { RMeDX, eAX }, 0 },
2614   { "xchgS",            { RMeBX, eAX }, 0 },
2615   { "xchgS",            { RMeSP, eAX }, 0 },
2616   { "xchgS",            { RMeBP, eAX }, 0 },
2617   { "xchgS",            { RMeSI, eAX }, 0 },
2618   { "xchgS",            { RMeDI, eAX }, 0 },
2619   /* 98 */
2620   { "cW{t|}R",          { XX }, 0 },
2621   { "cR{t|}O",          { XX }, 0 },
2622   { X86_64_TABLE (X86_64_9A) },
2623   { Bad_Opcode },       /* fwait */
2624   { "pushfT",           { XX }, 0 },
2625   { "popfT",            { XX }, 0 },
2626   { "sahf",             { XX }, 0 },
2627   { "lahf",             { XX }, 0 },
2628   /* a0 */
2629   { "mov%LB",           { AL, Ob }, 0 },
2630   { "mov%LS",           { eAX, Ov }, 0 },
2631   { "mov%LB",           { Ob, AL }, 0 },
2632   { "mov%LS",           { Ov, eAX }, 0 },
2633   { "movs{b|}",         { Ybr, Xb }, 0 },
2634   { "movs{R|}",         { Yvr, Xv }, 0 },
2635   { "cmps{b|}",         { Xb, Yb }, 0 },
2636   { "cmps{R|}",         { Xv, Yv }, 0 },
2637   /* a8 */
2638   { "testB",            { AL, Ib }, 0 },
2639   { "testS",            { eAX, Iv }, 0 },
2640   { "stosB",            { Ybr, AL }, 0 },
2641   { "stosS",            { Yvr, eAX }, 0 },
2642   { "lodsB",            { ALr, Xb }, 0 },
2643   { "lodsS",            { eAXr, Xv }, 0 },
2644   { "scasB",            { AL, Yb }, 0 },
2645   { "scasS",            { eAX, Yv }, 0 },
2646   /* b0 */
2647   { "movB",             { RMAL, Ib }, 0 },
2648   { "movB",             { RMCL, Ib }, 0 },
2649   { "movB",             { RMDL, Ib }, 0 },
2650   { "movB",             { RMBL, Ib }, 0 },
2651   { "movB",             { RMAH, Ib }, 0 },
2652   { "movB",             { RMCH, Ib }, 0 },
2653   { "movB",             { RMDH, Ib }, 0 },
2654   { "movB",             { RMBH, Ib }, 0 },
2655   /* b8 */
2656   { "mov%LV",           { RMeAX, Iv64 }, 0 },
2657   { "mov%LV",           { RMeCX, Iv64 }, 0 },
2658   { "mov%LV",           { RMeDX, Iv64 }, 0 },
2659   { "mov%LV",           { RMeBX, Iv64 }, 0 },
2660   { "mov%LV",           { RMeSP, Iv64 }, 0 },
2661   { "mov%LV",           { RMeBP, Iv64 }, 0 },
2662   { "mov%LV",           { RMeSI, Iv64 }, 0 },
2663   { "mov%LV",           { RMeDI, Iv64 }, 0 },
2664   /* c0 */
2665   { REG_TABLE (REG_C0) },
2666   { REG_TABLE (REG_C1) },
2667   { "retT",             { Iw, BND }, 0 },
2668   { "retT",             { BND }, 0 },
2669   { X86_64_TABLE (X86_64_C4) },
2670   { X86_64_TABLE (X86_64_C5) },
2671   { REG_TABLE (REG_C6) },
2672   { REG_TABLE (REG_C7) },
2673   /* c8 */
2674   { "enterT",           { Iw, Ib }, 0 },
2675   { "leaveT",           { XX }, 0 },
2676   { "Jret{|f}P",        { Iw }, 0 },
2677   { "Jret{|f}P",        { XX }, 0 },
2678   { "int3",             { XX }, 0 },
2679   { "int",              { Ib }, 0 },
2680   { X86_64_TABLE (X86_64_CE) },
2681   { "iret%LP",          { XX }, 0 },
2682   /* d0 */
2683   { REG_TABLE (REG_D0) },
2684   { REG_TABLE (REG_D1) },
2685   { REG_TABLE (REG_D2) },
2686   { REG_TABLE (REG_D3) },
2687   { X86_64_TABLE (X86_64_D4) },
2688   { X86_64_TABLE (X86_64_D5) },
2689   { Bad_Opcode },
2690   { "xlat",             { DSBX }, 0 },
2691   /* d8 */
2692   { FLOAT },
2693   { FLOAT },
2694   { FLOAT },
2695   { FLOAT },
2696   { FLOAT },
2697   { FLOAT },
2698   { FLOAT },
2699   { FLOAT },
2700   /* e0 */
2701   { "loopneFH",         { Jb, XX, loop_jcxz_flag }, 0 },
2702   { "loopeFH",          { Jb, XX, loop_jcxz_flag }, 0 },
2703   { "loopFH",           { Jb, XX, loop_jcxz_flag }, 0 },
2704   { "jEcxzH",           { Jb, XX, loop_jcxz_flag }, 0 },
2705   { "inB",              { AL, Ib }, 0 },
2706   { "inG",              { zAX, Ib }, 0 },
2707   { "outB",             { Ib, AL }, 0 },
2708   { "outG",             { Ib, zAX }, 0 },
2709   /* e8 */
2710   { X86_64_TABLE (X86_64_E8) },
2711   { X86_64_TABLE (X86_64_E9) },
2712   { X86_64_TABLE (X86_64_EA) },
2713   { "jmp",              { Jb, BND }, 0 },
2714   { "inB",              { AL, indirDX }, 0 },
2715   { "inG",              { zAX, indirDX }, 0 },
2716   { "outB",             { indirDX, AL }, 0 },
2717   { "outG",             { indirDX, zAX }, 0 },
2718   /* f0 */
2719   { Bad_Opcode },       /* lock prefix */
2720   { "icebp",            { XX }, 0 },
2721   { Bad_Opcode },       /* repne */
2722   { Bad_Opcode },       /* repz */
2723   { "hlt",              { XX }, 0 },
2724   { "cmc",              { XX }, 0 },
2725   { REG_TABLE (REG_F6) },
2726   { REG_TABLE (REG_F7) },
2727   /* f8 */
2728   { "clc",              { XX }, 0 },
2729   { "stc",              { XX }, 0 },
2730   { "cli",              { XX }, 0 },
2731   { "sti",              { XX }, 0 },
2732   { "cld",              { XX }, 0 },
2733   { "std",              { XX }, 0 },
2734   { REG_TABLE (REG_FE) },
2735   { REG_TABLE (REG_FF) },
2736 };
2737
2738 static const struct dis386 dis386_twobyte[] = {
2739   /* 00 */
2740   { REG_TABLE (REG_0F00 ) },
2741   { REG_TABLE (REG_0F01 ) },
2742   { "larS",             { Gv, Ew }, 0 },
2743   { "lslS",             { Gv, Ew }, 0 },
2744   { Bad_Opcode },
2745   { "syscall",          { XX }, 0 },
2746   { "clts",             { XX }, 0 },
2747   { "sysret%LP",                { XX }, 0 },
2748   /* 08 */
2749   { "invd",             { XX }, 0 },
2750   { "wbinvd",           { XX }, 0 },
2751   { Bad_Opcode },
2752   { "ud2",              { XX }, 0 },
2753   { Bad_Opcode },
2754   { REG_TABLE (REG_0F0D) },
2755   { "femms",            { XX }, 0 },
2756   { "",                 { MX, EM, OPSUF }, 0 }, /* See OP_3DNowSuffix.  */
2757   /* 10 */
2758   { PREFIX_TABLE (PREFIX_0F10) },
2759   { PREFIX_TABLE (PREFIX_0F11) },
2760   { PREFIX_TABLE (PREFIX_0F12) },
2761   { MOD_TABLE (MOD_0F13) },
2762   { "unpcklpX",         { XM, EXx }, PREFIX_OPCODE },
2763   { "unpckhpX",         { XM, EXx }, PREFIX_OPCODE },
2764   { PREFIX_TABLE (PREFIX_0F16) },
2765   { MOD_TABLE (MOD_0F17) },
2766   /* 18 */
2767   { REG_TABLE (REG_0F18) },
2768   { "nopQ",             { Ev }, 0 },
2769   { PREFIX_TABLE (PREFIX_0F1A) },
2770   { PREFIX_TABLE (PREFIX_0F1B) },
2771   { "nopQ",             { Ev }, 0 },
2772   { "nopQ",             { Ev }, 0 },
2773   { "nopQ",             { Ev }, 0 },
2774   { "nopQ",             { Ev }, 0 },
2775   /* 20 */
2776   { "movZ",             { Rm, Cm }, 0 },
2777   { "movZ",             { Rm, Dm }, 0 },
2778   { "movZ",             { Cm, Rm }, 0 },
2779   { "movZ",             { Dm, Rm }, 0 },
2780   { MOD_TABLE (MOD_0F24) },
2781   { Bad_Opcode },
2782   { MOD_TABLE (MOD_0F26) },
2783   { Bad_Opcode },
2784   /* 28 */
2785   { "movapX",           { XM, EXx }, PREFIX_OPCODE },
2786   { "movapX",           { EXxS, XM }, PREFIX_OPCODE },
2787   { PREFIX_TABLE (PREFIX_0F2A) },
2788   { PREFIX_TABLE (PREFIX_0F2B) },
2789   { PREFIX_TABLE (PREFIX_0F2C) },
2790   { PREFIX_TABLE (PREFIX_0F2D) },
2791   { PREFIX_TABLE (PREFIX_0F2E) },
2792   { PREFIX_TABLE (PREFIX_0F2F) },
2793   /* 30 */
2794   { "wrmsr",            { XX }, 0 },
2795   { "rdtsc",            { XX }, 0 },
2796   { "rdmsr",            { XX }, 0 },
2797   { "rdpmc",            { XX }, 0 },
2798   { "sysenter",         { XX }, 0 },
2799   { "sysexit",          { XX }, 0 },
2800   { Bad_Opcode },
2801   { "getsec",           { XX }, 0 },
2802   /* 38 */
2803   { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F38, PREFIX_OPCODE) },
2804   { Bad_Opcode },
2805   { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F3A, PREFIX_OPCODE) },
2806   { Bad_Opcode },
2807   { Bad_Opcode },
2808   { Bad_Opcode },
2809   { Bad_Opcode },
2810   { Bad_Opcode },
2811   /* 40 */
2812   { "cmovoS",           { Gv, Ev }, 0 },
2813   { "cmovnoS",          { Gv, Ev }, 0 },
2814   { "cmovbS",           { Gv, Ev }, 0 },
2815   { "cmovaeS",          { Gv, Ev }, 0 },
2816   { "cmoveS",           { Gv, Ev }, 0 },
2817   { "cmovneS",          { Gv, Ev }, 0 },
2818   { "cmovbeS",          { Gv, Ev }, 0 },
2819   { "cmovaS",           { Gv, Ev }, 0 },
2820   /* 48 */
2821   { "cmovsS",           { Gv, Ev }, 0 },
2822   { "cmovnsS",          { Gv, Ev }, 0 },
2823   { "cmovpS",           { Gv, Ev }, 0 },
2824   { "cmovnpS",          { Gv, Ev }, 0 },
2825   { "cmovlS",           { Gv, Ev }, 0 },
2826   { "cmovgeS",          { Gv, Ev }, 0 },
2827   { "cmovleS",          { Gv, Ev }, 0 },
2828   { "cmovgS",           { Gv, Ev }, 0 },
2829   /* 50 */
2830   { MOD_TABLE (MOD_0F51) },
2831   { PREFIX_TABLE (PREFIX_0F51) },
2832   { PREFIX_TABLE (PREFIX_0F52) },
2833   { PREFIX_TABLE (PREFIX_0F53) },
2834   { "andpX",            { XM, EXx }, PREFIX_OPCODE },
2835   { "andnpX",           { XM, EXx }, PREFIX_OPCODE },
2836   { "orpX",             { XM, EXx }, PREFIX_OPCODE },
2837   { "xorpX",            { XM, EXx }, PREFIX_OPCODE },
2838   /* 58 */
2839   { PREFIX_TABLE (PREFIX_0F58) },
2840   { PREFIX_TABLE (PREFIX_0F59) },
2841   { PREFIX_TABLE (PREFIX_0F5A) },
2842   { PREFIX_TABLE (PREFIX_0F5B) },
2843   { PREFIX_TABLE (PREFIX_0F5C) },
2844   { PREFIX_TABLE (PREFIX_0F5D) },
2845   { PREFIX_TABLE (PREFIX_0F5E) },
2846   { PREFIX_TABLE (PREFIX_0F5F) },
2847   /* 60 */
2848   { PREFIX_TABLE (PREFIX_0F60) },
2849   { PREFIX_TABLE (PREFIX_0F61) },
2850   { PREFIX_TABLE (PREFIX_0F62) },
2851   { "packsswb",         { MX, EM }, PREFIX_OPCODE },
2852   { "pcmpgtb",          { MX, EM }, PREFIX_OPCODE },
2853   { "pcmpgtw",          { MX, EM }, PREFIX_OPCODE },
2854   { "pcmpgtd",          { MX, EM }, PREFIX_OPCODE },
2855   { "packuswb",         { MX, EM }, PREFIX_OPCODE },
2856   /* 68 */
2857   { "punpckhbw",        { MX, EM }, PREFIX_OPCODE },
2858   { "punpckhwd",        { MX, EM }, PREFIX_OPCODE },
2859   { "punpckhdq",        { MX, EM }, PREFIX_OPCODE },
2860   { "packssdw",         { MX, EM }, PREFIX_OPCODE },
2861   { PREFIX_TABLE (PREFIX_0F6C) },
2862   { PREFIX_TABLE (PREFIX_0F6D) },
2863   { "movK",             { MX, Edq }, PREFIX_OPCODE },
2864   { PREFIX_TABLE (PREFIX_0F6F) },
2865   /* 70 */
2866   { PREFIX_TABLE (PREFIX_0F70) },
2867   { REG_TABLE (REG_0F71) },
2868   { REG_TABLE (REG_0F72) },
2869   { REG_TABLE (REG_0F73) },
2870   { "pcmpeqb",          { MX, EM }, PREFIX_OPCODE },
2871   { "pcmpeqw",          { MX, EM }, PREFIX_OPCODE },
2872   { "pcmpeqd",          { MX, EM }, PREFIX_OPCODE },
2873   { "emms",             { XX }, PREFIX_OPCODE },
2874   /* 78 */
2875   { PREFIX_TABLE (PREFIX_0F78) },
2876   { PREFIX_TABLE (PREFIX_0F79) },
2877   { THREE_BYTE_TABLE (THREE_BYTE_0F7A) },
2878   { Bad_Opcode },
2879   { PREFIX_TABLE (PREFIX_0F7C) },
2880   { PREFIX_TABLE (PREFIX_0F7D) },
2881   { PREFIX_TABLE (PREFIX_0F7E) },
2882   { PREFIX_TABLE (PREFIX_0F7F) },
2883   /* 80 */
2884   { "joH",              { Jv, BND, cond_jump_flag }, 0 },
2885   { "jnoH",             { Jv, BND, cond_jump_flag }, 0 },
2886   { "jbH",              { Jv, BND, cond_jump_flag }, 0 },
2887   { "jaeH",             { Jv, BND, cond_jump_flag }, 0 },
2888   { "jeH",              { Jv, BND, cond_jump_flag }, 0 },
2889   { "jneH",             { Jv, BND, cond_jump_flag }, 0 },
2890   { "jbeH",             { Jv, BND, cond_jump_flag }, 0 },
2891   { "jaH",              { Jv, BND, cond_jump_flag }, 0 },
2892   /* 88 */
2893   { "jsH",              { Jv, BND, cond_jump_flag }, 0 },
2894   { "jnsH",             { Jv, BND, cond_jump_flag }, 0 },
2895   { "jpH",              { Jv, BND, cond_jump_flag }, 0 },
2896   { "jnpH",             { Jv, BND, cond_jump_flag }, 0 },
2897   { "jlH",              { Jv, BND, cond_jump_flag }, 0 },
2898   { "jgeH",             { Jv, BND, cond_jump_flag }, 0 },
2899   { "jleH",             { Jv, BND, cond_jump_flag }, 0 },
2900   { "jgH",              { Jv, BND, cond_jump_flag }, 0 },
2901   /* 90 */
2902   { "seto",             { Eb }, 0 },
2903   { "setno",            { Eb }, 0 },
2904   { "setb",             { Eb }, 0 },
2905   { "setae",            { Eb }, 0 },
2906   { "sete",             { Eb }, 0 },
2907   { "setne",            { Eb }, 0 },
2908   { "setbe",            { Eb }, 0 },
2909   { "seta",             { Eb }, 0 },
2910   /* 98 */
2911   { "sets",             { Eb }, 0 },
2912   { "setns",            { Eb }, 0 },
2913   { "setp",             { Eb }, 0 },
2914   { "setnp",            { Eb }, 0 },
2915   { "setl",             { Eb }, 0 },
2916   { "setge",            { Eb }, 0 },
2917   { "setle",            { Eb }, 0 },
2918   { "setg",             { Eb }, 0 },
2919   /* a0 */
2920   { "pushT",            { fs }, 0 },
2921   { "popT",             { fs }, 0 },
2922   { "cpuid",            { XX }, 0 },
2923   { "btS",              { Ev, Gv }, 0 },
2924   { "shldS",            { Ev, Gv, Ib }, 0 },
2925   { "shldS",            { Ev, Gv, CL }, 0 },
2926   { REG_TABLE (REG_0FA6) },
2927   { REG_TABLE (REG_0FA7) },
2928   /* a8 */
2929   { "pushT",            { gs }, 0 },
2930   { "popT",             { gs }, 0 },
2931   { "rsm",              { XX }, 0 },
2932   { "btsS",             { Evh1, Gv }, 0 },
2933   { "shrdS",            { Ev, Gv, Ib }, 0 },
2934   { "shrdS",            { Ev, Gv, CL }, 0 },
2935   { REG_TABLE (REG_0FAE) },
2936   { "imulS",            { Gv, Ev }, 0 },
2937   /* b0 */
2938   { "cmpxchgB",         { Ebh1, Gb }, 0 },
2939   { "cmpxchgS",         { Evh1, Gv }, 0 },
2940   { MOD_TABLE (MOD_0FB2) },
2941   { "btrS",             { Evh1, Gv }, 0 },
2942   { MOD_TABLE (MOD_0FB4) },
2943   { MOD_TABLE (MOD_0FB5) },
2944   { "movz{bR|x}",       { Gv, Eb }, 0 },
2945   { "movz{wR|x}",       { Gv, Ew }, 0 }, /* yes, there really is movzww ! */
2946   /* b8 */
2947   { PREFIX_TABLE (PREFIX_0FB8) },
2948   { "ud1",              { XX }, 0 },
2949   { REG_TABLE (REG_0FBA) },
2950   { "btcS",             { Evh1, Gv }, 0 },
2951   { PREFIX_TABLE (PREFIX_0FBC) },
2952   { PREFIX_TABLE (PREFIX_0FBD) },
2953   { "movs{bR|x}",       { Gv, Eb }, 0 },
2954   { "movs{wR|x}",       { Gv, Ew }, 0 }, /* yes, there really is movsww ! */
2955   /* c0 */
2956   { "xaddB",            { Ebh1, Gb }, 0 },
2957   { "xaddS",            { Evh1, Gv }, 0 },
2958   { PREFIX_TABLE (PREFIX_0FC2) },
2959   { PREFIX_TABLE (PREFIX_0FC3) },
2960   { "pinsrw",           { MX, Edqw, Ib }, PREFIX_OPCODE },
2961   { "pextrw",           { Gdq, MS, Ib }, PREFIX_OPCODE },
2962   { "shufpX",           { XM, EXx, Ib }, PREFIX_OPCODE },
2963   { REG_TABLE (REG_0FC7) },
2964   /* c8 */
2965   { "bswap",            { RMeAX }, 0 },
2966   { "bswap",            { RMeCX }, 0 },
2967   { "bswap",            { RMeDX }, 0 },
2968   { "bswap",            { RMeBX }, 0 },
2969   { "bswap",            { RMeSP }, 0 },
2970   { "bswap",            { RMeBP }, 0 },
2971   { "bswap",            { RMeSI }, 0 },
2972   { "bswap",            { RMeDI }, 0 },
2973   /* d0 */
2974   { PREFIX_TABLE (PREFIX_0FD0) },
2975   { "psrlw",            { MX, EM }, PREFIX_OPCODE },
2976   { "psrld",            { MX, EM }, PREFIX_OPCODE },
2977   { "psrlq",            { MX, EM }, PREFIX_OPCODE },
2978   { "paddq",            { MX, EM }, PREFIX_OPCODE },
2979   { "pmullw",           { MX, EM }, PREFIX_OPCODE },
2980   { PREFIX_TABLE (PREFIX_0FD6) },
2981   { MOD_TABLE (MOD_0FD7) },
2982   /* d8 */
2983   { "psubusb",          { MX, EM }, PREFIX_OPCODE },
2984   { "psubusw",          { MX, EM }, PREFIX_OPCODE },
2985   { "pminub",           { MX, EM }, PREFIX_OPCODE },
2986   { "pand",             { MX, EM }, PREFIX_OPCODE },
2987   { "paddusb",          { MX, EM }, PREFIX_OPCODE },
2988   { "paddusw",          { MX, EM }, PREFIX_OPCODE },
2989   { "pmaxub",           { MX, EM }, PREFIX_OPCODE },
2990   { "pandn",            { MX, EM }, PREFIX_OPCODE },
2991   /* e0 */
2992   { "pavgb",            { MX, EM }, PREFIX_OPCODE },
2993   { "psraw",            { MX, EM }, PREFIX_OPCODE },
2994   { "psrad",            { MX, EM }, PREFIX_OPCODE },
2995   { "pavgw",            { MX, EM }, PREFIX_OPCODE },
2996   { "pmulhuw",          { MX, EM }, PREFIX_OPCODE },
2997   { "pmulhw",           { MX, EM }, PREFIX_OPCODE },
2998   { PREFIX_TABLE (PREFIX_0FE6) },
2999   { PREFIX_TABLE (PREFIX_0FE7) },
3000   /* e8 */
3001   { "psubsb",           { MX, EM }, PREFIX_OPCODE },
3002   { "psubsw",           { MX, EM }, PREFIX_OPCODE },
3003   { "pminsw",           { MX, EM }, PREFIX_OPCODE },
3004   { "por",              { MX, EM }, PREFIX_OPCODE },
3005   { "paddsb",           { MX, EM }, PREFIX_OPCODE },
3006   { "paddsw",           { MX, EM }, PREFIX_OPCODE },
3007   { "pmaxsw",           { MX, EM }, PREFIX_OPCODE },
3008   { "pxor",             { MX, EM }, PREFIX_OPCODE },
3009   /* f0 */
3010   { PREFIX_TABLE (PREFIX_0FF0) },
3011   { "psllw",            { MX, EM }, PREFIX_OPCODE },
3012   { "pslld",            { MX, EM }, PREFIX_OPCODE },
3013   { "psllq",            { MX, EM }, PREFIX_OPCODE },
3014   { "pmuludq",          { MX, EM }, PREFIX_OPCODE },
3015   { "pmaddwd",          { MX, EM }, PREFIX_OPCODE },
3016   { "psadbw",           { MX, EM }, PREFIX_OPCODE },
3017   { PREFIX_TABLE (PREFIX_0FF7) },
3018   /* f8 */
3019   { "psubb",            { MX, EM }, PREFIX_OPCODE },
3020   { "psubw",            { MX, EM }, PREFIX_OPCODE },
3021   { "psubd",            { MX, EM }, PREFIX_OPCODE },
3022   { "psubq",            { MX, EM }, PREFIX_OPCODE },
3023   { "paddb",            { MX, EM }, PREFIX_OPCODE },
3024   { "paddw",            { MX, EM }, PREFIX_OPCODE },
3025   { "paddd",            { MX, EM }, PREFIX_OPCODE },
3026   { Bad_Opcode },
3027 };
3028
3029 static const unsigned char onebyte_has_modrm[256] = {
3030   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
3031   /*       -------------------------------        */
3032   /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
3033   /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
3034   /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
3035   /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
3036   /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
3037   /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
3038   /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
3039   /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
3040   /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
3041   /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
3042   /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
3043   /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
3044   /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
3045   /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
3046   /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
3047   /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1  /* f0 */
3048   /*       -------------------------------        */
3049   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
3050 };
3051
3052 static const unsigned char twobyte_has_modrm[256] = {
3053   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
3054   /*       -------------------------------        */
3055   /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
3056   /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
3057   /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
3058   /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
3059   /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
3060   /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
3061   /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
3062   /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
3063   /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
3064   /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
3065   /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
3066   /* b0 */ 1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1, /* bf */
3067   /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
3068   /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
3069   /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
3070   /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0  /* ff */
3071   /*       -------------------------------        */
3072   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
3073 };
3074
3075 static char obuf[100];
3076 static char *obufp;
3077 static char *mnemonicendp;
3078 static char scratchbuf[100];
3079 static unsigned char *start_codep;
3080 static unsigned char *insn_codep;
3081 static unsigned char *codep;
3082 static unsigned char *end_codep;
3083 static int last_lock_prefix;
3084 static int last_repz_prefix;
3085 static int last_repnz_prefix;
3086 static int last_data_prefix;
3087 static int last_addr_prefix;
3088 static int last_rex_prefix;
3089 static int last_seg_prefix;
3090 static int fwait_prefix;
3091 /* The active segment register prefix.  */
3092 static int active_seg_prefix;
3093 #define MAX_CODE_LENGTH 15
3094 /* We can up to 14 prefixes since the maximum instruction length is
3095    15bytes.  */
3096 static int all_prefixes[MAX_CODE_LENGTH - 1];
3097 static disassemble_info *the_info;
3098 static struct
3099   {
3100     int mod;
3101     int reg;
3102     int rm;
3103   }
3104 modrm;
3105 static unsigned char need_modrm;
3106 static struct
3107   {
3108     int scale;
3109     int index;
3110     int base;
3111   }
3112 sib;
3113 static struct
3114   {
3115     int register_specifier;
3116     int length;
3117     int prefix;
3118     int w;
3119     int evex;
3120     int r;
3121     int v;
3122     int mask_register_specifier;
3123     int zeroing;
3124     int ll;
3125     int b;
3126   }
3127 vex;
3128 static unsigned char need_vex;
3129 static unsigned char need_vex_reg;
3130 static unsigned char vex_w_done;
3131
3132 struct op
3133   {
3134     const char *name;
3135     unsigned int len;
3136   };
3137
3138 /* If we are accessing mod/rm/reg without need_modrm set, then the
3139    values are stale.  Hitting this abort likely indicates that you
3140    need to update onebyte_has_modrm or twobyte_has_modrm.  */
3141 #define MODRM_CHECK  if (!need_modrm) abort ()
3142
3143 static const char **names64;
3144 static const char **names32;
3145 static const char **names16;
3146 static const char **names8;
3147 static const char **names8rex;
3148 static const char **names_seg;
3149 static const char *index64;
3150 static const char *index32;
3151 static const char **index16;
3152 static const char **names_bnd;
3153
3154 static const char *intel_names64[] = {
3155   "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
3156   "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
3157 };
3158 static const char *intel_names32[] = {
3159   "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
3160   "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
3161 };
3162 static const char *intel_names16[] = {
3163   "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
3164   "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
3165 };
3166 static const char *intel_names8[] = {
3167   "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
3168 };
3169 static const char *intel_names8rex[] = {
3170   "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
3171   "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
3172 };
3173 static const char *intel_names_seg[] = {
3174   "es", "cs", "ss", "ds", "fs", "gs", "?", "?",
3175 };
3176 static const char *intel_index64 = "riz";
3177 static const char *intel_index32 = "eiz";
3178 static const char *intel_index16[] = {
3179   "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
3180 };
3181
3182 static const char *att_names64[] = {
3183   "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
3184   "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
3185 };
3186 static const char *att_names32[] = {
3187   "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
3188   "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
3189 };
3190 static const char *att_names16[] = {
3191   "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
3192   "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
3193 };
3194 static const char *att_names8[] = {
3195   "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
3196 };
3197 static const char *att_names8rex[] = {
3198   "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
3199   "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
3200 };
3201 static const char *att_names_seg[] = {
3202   "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
3203 };
3204 static const char *att_index64 = "%riz";
3205 static const char *att_index32 = "%eiz";
3206 static const char *att_index16[] = {
3207   "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
3208 };
3209
3210 static const char **names_mm;
3211 static const char *intel_names_mm[] = {
3212   "mm0", "mm1", "mm2", "mm3",
3213   "mm4", "mm5", "mm6", "mm7"
3214 };
3215 static const char *att_names_mm[] = {
3216   "%mm0", "%mm1", "%mm2", "%mm3",
3217   "%mm4", "%mm5", "%mm6", "%mm7"
3218 };
3219
3220 static const char *intel_names_bnd[] = {
3221   "bnd0", "bnd1", "bnd2", "bnd3"
3222 };
3223
3224 static const char *att_names_bnd[] = {
3225   "%bnd0", "%bnd1", "%bnd2", "%bnd3"
3226 };
3227
3228 static const char **names_xmm;
3229 static const char *intel_names_xmm[] = {
3230   "xmm0", "xmm1", "xmm2", "xmm3",
3231   "xmm4", "xmm5", "xmm6", "xmm7",
3232   "xmm8", "xmm9", "xmm10", "xmm11",
3233   "xmm12", "xmm13", "xmm14", "xmm15",
3234   "xmm16", "xmm17", "xmm18", "xmm19",
3235   "xmm20", "xmm21", "xmm22", "xmm23",
3236   "xmm24", "xmm25", "xmm26", "xmm27",
3237   "xmm28", "xmm29", "xmm30", "xmm31"
3238 };
3239 static const char *att_names_xmm[] = {
3240   "%xmm0", "%xmm1", "%xmm2", "%xmm3",
3241   "%xmm4", "%xmm5", "%xmm6", "%xmm7",
3242   "%xmm8", "%xmm9", "%xmm10", "%xmm11",
3243   "%xmm12", "%xmm13", "%xmm14", "%xmm15",
3244   "%xmm16", "%xmm17", "%xmm18", "%xmm19",
3245   "%xmm20", "%xmm21", "%xmm22", "%xmm23",
3246   "%xmm24", "%xmm25", "%xmm26", "%xmm27",
3247   "%xmm28", "%xmm29", "%xmm30", "%xmm31"
3248 };
3249
3250 static const char **names_ymm;
3251 static const char *intel_names_ymm[] = {
3252   "ymm0", "ymm1", "ymm2", "ymm3",
3253   "ymm4", "ymm5", "ymm6", "ymm7",
3254   "ymm8", "ymm9", "ymm10", "ymm11",
3255   "ymm12", "ymm13", "ymm14", "ymm15",
3256   "ymm16", "ymm17", "ymm18", "ymm19",
3257   "ymm20", "ymm21", "ymm22", "ymm23",
3258   "ymm24", "ymm25", "ymm26", "ymm27",
3259   "ymm28", "ymm29", "ymm30", "ymm31"
3260 };
3261 static const char *att_names_ymm[] = {
3262   "%ymm0", "%ymm1", "%ymm2", "%ymm3",
3263   "%ymm4", "%ymm5", "%ymm6", "%ymm7",
3264   "%ymm8", "%ymm9", "%ymm10", "%ymm11",
3265   "%ymm12", "%ymm13", "%ymm14", "%ymm15",
3266   "%ymm16", "%ymm17", "%ymm18", "%ymm19",
3267   "%ymm20", "%ymm21", "%ymm22", "%ymm23",
3268   "%ymm24", "%ymm25", "%ymm26", "%ymm27",
3269   "%ymm28", "%ymm29", "%ymm30", "%ymm31"
3270 };
3271
3272 static const char **names_zmm;
3273 static const char *intel_names_zmm[] = {
3274   "zmm0", "zmm1", "zmm2", "zmm3",
3275   "zmm4", "zmm5", "zmm6", "zmm7",
3276   "zmm8", "zmm9", "zmm10", "zmm11",
3277   "zmm12", "zmm13", "zmm14", "zmm15",
3278   "zmm16", "zmm17", "zmm18", "zmm19",
3279   "zmm20", "zmm21", "zmm22", "zmm23",
3280   "zmm24", "zmm25", "zmm26", "zmm27",
3281   "zmm28", "zmm29", "zmm30", "zmm31"
3282 };
3283 static const char *att_names_zmm[] = {
3284   "%zmm0", "%zmm1", "%zmm2", "%zmm3",
3285   "%zmm4", "%zmm5", "%zmm6", "%zmm7",
3286   "%zmm8", "%zmm9", "%zmm10", "%zmm11",
3287   "%zmm12", "%zmm13", "%zmm14", "%zmm15",
3288   "%zmm16", "%zmm17", "%zmm18", "%zmm19",
3289   "%zmm20", "%zmm21", "%zmm22", "%zmm23",
3290   "%zmm24", "%zmm25", "%zmm26", "%zmm27",
3291   "%zmm28", "%zmm29", "%zmm30", "%zmm31"
3292 };
3293
3294 static const char **names_mask;
3295 static const char *intel_names_mask[] = {
3296   "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7"
3297 };
3298 static const char *att_names_mask[] = {
3299   "%k0", "%k1", "%k2", "%k3", "%k4", "%k5", "%k6", "%k7"
3300 };
3301
3302 static const char *names_rounding[] =
3303 {
3304   "{rn-sae}",
3305   "{rd-sae}",
3306   "{ru-sae}",
3307   "{rz-sae}"
3308 };
3309
3310 static const struct dis386 reg_table[][8] = {
3311   /* REG_80 */
3312   {
3313     { "addA",   { Ebh1, Ib }, 0 },
3314     { "orA",    { Ebh1, Ib }, 0 },
3315     { "adcA",   { Ebh1, Ib }, 0 },
3316     { "sbbA",   { Ebh1, Ib }, 0 },
3317     { "andA",   { Ebh1, Ib }, 0 },
3318     { "subA",   { Ebh1, Ib }, 0 },
3319     { "xorA",   { Ebh1, Ib }, 0 },
3320     { "cmpA",   { Eb, Ib }, 0 },
3321   },
3322   /* REG_81 */
3323   {
3324     { "addQ",   { Evh1, Iv }, 0 },
3325     { "orQ",    { Evh1, Iv }, 0 },
3326     { "adcQ",   { Evh1, Iv }, 0 },
3327     { "sbbQ",   { Evh1, Iv }, 0 },
3328     { "andQ",   { Evh1, Iv }, 0 },
3329     { "subQ",   { Evh1, Iv }, 0 },
3330     { "xorQ",   { Evh1, Iv }, 0 },
3331     { "cmpQ",   { Ev, Iv }, 0 },
3332   },
3333   /* REG_82 */
3334   {
3335     { "addQ",   { Evh1, sIb }, 0 },
3336     { "orQ",    { Evh1, sIb }, 0 },
3337     { "adcQ",   { Evh1, sIb }, 0 },
3338     { "sbbQ",   { Evh1, sIb }, 0 },
3339     { "andQ",   { Evh1, sIb }, 0 },
3340     { "subQ",   { Evh1, sIb }, 0 },
3341     { "xorQ",   { Evh1, sIb }, 0 },
3342     { "cmpQ",   { Ev, sIb }, 0 },
3343   },
3344   /* REG_8F */
3345   {
3346     { "popU",   { stackEv }, 0 },
3347     { XOP_8F_TABLE (XOP_09) },
3348     { Bad_Opcode },
3349     { Bad_Opcode },
3350     { Bad_Opcode },
3351     { XOP_8F_TABLE (XOP_09) },
3352   },
3353   /* REG_C0 */
3354   {
3355     { "rolA",   { Eb, Ib }, 0 },
3356     { "rorA",   { Eb, Ib }, 0 },
3357     { "rclA",   { Eb, Ib }, 0 },
3358     { "rcrA",   { Eb, Ib }, 0 },
3359     { "shlA",   { Eb, Ib }, 0 },
3360     { "shrA",   { Eb, Ib }, 0 },
3361     { Bad_Opcode },
3362     { "sarA",   { Eb, Ib }, 0 },
3363   },
3364   /* REG_C1 */
3365   {
3366     { "rolQ",   { Ev, Ib }, 0 },
3367     { "rorQ",   { Ev, Ib }, 0 },
3368     { "rclQ",   { Ev, Ib }, 0 },
3369     { "rcrQ",   { Ev, Ib }, 0 },
3370     { "shlQ",   { Ev, Ib }, 0 },
3371     { "shrQ",   { Ev, Ib }, 0 },
3372     { Bad_Opcode },
3373     { "sarQ",   { Ev, Ib }, 0 },
3374   },
3375   /* REG_C6 */
3376   {
3377     { "movA",   { Ebh3, Ib }, 0 },
3378     { Bad_Opcode },
3379     { Bad_Opcode },
3380     { Bad_Opcode },
3381     { Bad_Opcode },
3382     { Bad_Opcode },
3383     { Bad_Opcode },
3384     { MOD_TABLE (MOD_C6_REG_7) },
3385   },
3386   /* REG_C7 */
3387   {
3388     { "movQ",   { Evh3, Iv }, 0 },
3389     { Bad_Opcode },
3390     { Bad_Opcode },
3391     { Bad_Opcode },
3392     { Bad_Opcode },
3393     { Bad_Opcode },
3394     { Bad_Opcode },
3395     { MOD_TABLE (MOD_C7_REG_7) },
3396   },
3397   /* REG_D0 */
3398   {
3399     { "rolA",   { Eb, I1 }, 0 },
3400     { "rorA",   { Eb, I1 }, 0 },
3401     { "rclA",   { Eb, I1 }, 0 },
3402     { "rcrA",   { Eb, I1 }, 0 },
3403     { "shlA",   { Eb, I1 }, 0 },
3404     { "shrA",   { Eb, I1 }, 0 },
3405     { Bad_Opcode },
3406     { "sarA",   { Eb, I1 }, 0 },
3407   },
3408   /* REG_D1 */
3409   {
3410     { "rolQ",   { Ev, I1 }, 0 },
3411     { "rorQ",   { Ev, I1 }, 0 },
3412     { "rclQ",   { Ev, I1 }, 0 },
3413     { "rcrQ",   { Ev, I1 }, 0 },
3414     { "shlQ",   { Ev, I1 }, 0 },
3415     { "shrQ",   { Ev, I1 }, 0 },
3416     { Bad_Opcode },
3417     { "sarQ",   { Ev, I1 }, 0 },
3418   },
3419   /* REG_D2 */
3420   {
3421     { "rolA",   { Eb, CL }, 0 },
3422     { "rorA",   { Eb, CL }, 0 },
3423     { "rclA",   { Eb, CL }, 0 },
3424     { "rcrA",   { Eb, CL }, 0 },
3425     { "shlA",   { Eb, CL }, 0 },
3426     { "shrA",   { Eb, CL }, 0 },
3427     { Bad_Opcode },
3428     { "sarA",   { Eb, CL }, 0 },
3429   },
3430   /* REG_D3 */
3431   {
3432     { "rolQ",   { Ev, CL }, 0 },
3433     { "rorQ",   { Ev, CL }, 0 },
3434     { "rclQ",   { Ev, CL }, 0 },
3435     { "rcrQ",   { Ev, CL }, 0 },
3436     { "shlQ",   { Ev, CL }, 0 },
3437     { "shrQ",   { Ev, CL }, 0 },
3438     { Bad_Opcode },
3439     { "sarQ",   { Ev, CL }, 0 },
3440   },
3441   /* REG_F6 */
3442   {
3443     { "testA",  { Eb, Ib }, 0 },
3444     { Bad_Opcode },
3445     { "notA",   { Ebh1 }, 0 },
3446     { "negA",   { Ebh1 }, 0 },
3447     { "mulA",   { Eb }, 0 },    /* Don't print the implicit %al register,  */
3448     { "imulA",  { Eb }, 0 },    /* to distinguish these opcodes from other */
3449     { "divA",   { Eb }, 0 },    /* mul/imul opcodes.  Do the same for div  */
3450     { "idivA",  { Eb }, 0 },    /* and idiv for consistency.               */
3451   },
3452   /* REG_F7 */
3453   {
3454     { "testQ",  { Ev, Iv }, 0 },
3455     { Bad_Opcode },
3456     { "notQ",   { Evh1 }, 0 },
3457     { "negQ",   { Evh1 }, 0 },
3458     { "mulQ",   { Ev }, 0 },    /* Don't print the implicit register.  */
3459     { "imulQ",  { Ev }, 0 },
3460     { "divQ",   { Ev }, 0 },
3461     { "idivQ",  { Ev }, 0 },
3462   },
3463   /* REG_FE */
3464   {
3465     { "incA",   { Ebh1 }, 0 },
3466     { "decA",   { Ebh1 }, 0 },
3467   },
3468   /* REG_FF */
3469   {
3470     { "incQ",   { Evh1 }, 0 },
3471     { "decQ",   { Evh1 }, 0 },
3472     { "call{T|}", { indirEv, BND }, 0 },
3473     { MOD_TABLE (MOD_FF_REG_3) },
3474     { "jmp{T|}", { indirEv, BND }, 0 },
3475     { MOD_TABLE (MOD_FF_REG_5) },
3476     { "pushU",  { stackEv }, 0 },
3477     { Bad_Opcode },
3478   },
3479   /* REG_0F00 */
3480   {
3481     { "sldtD",  { Sv }, 0 },
3482     { "strD",   { Sv }, 0 },
3483     { "lldt",   { Ew }, 0 },
3484     { "ltr",    { Ew }, 0 },
3485     { "verr",   { Ew }, 0 },
3486     { "verw",   { Ew }, 0 },
3487     { Bad_Opcode },
3488     { Bad_Opcode },
3489   },
3490   /* REG_0F01 */
3491   {
3492     { MOD_TABLE (MOD_0F01_REG_0) },
3493     { MOD_TABLE (MOD_0F01_REG_1) },
3494     { MOD_TABLE (MOD_0F01_REG_2) },
3495     { MOD_TABLE (MOD_0F01_REG_3) },
3496     { "smswD",  { Sv }, 0 },
3497     { Bad_Opcode },
3498     { "lmsw",   { Ew }, 0 },
3499     { MOD_TABLE (MOD_0F01_REG_7) },
3500   },
3501   /* REG_0F0D */
3502   {
3503     { "prefetch",       { Mb }, 0 },
3504     { "prefetchw",      { Mb }, 0 },
3505     { "prefetchwt1",    { Mb }, 0 },
3506     { "prefetch",       { Mb }, 0 },
3507     { "prefetch",       { Mb }, 0 },
3508     { "prefetch",       { Mb }, 0 },
3509     { "prefetch",       { Mb }, 0 },
3510     { "prefetch",       { Mb }, 0 },
3511   },
3512   /* REG_0F18 */
3513   {
3514     { MOD_TABLE (MOD_0F18_REG_0) },
3515     { MOD_TABLE (MOD_0F18_REG_1) },
3516     { MOD_TABLE (MOD_0F18_REG_2) },
3517     { MOD_TABLE (MOD_0F18_REG_3) },
3518     { MOD_TABLE (MOD_0F18_REG_4) },
3519     { MOD_TABLE (MOD_0F18_REG_5) },
3520     { MOD_TABLE (MOD_0F18_REG_6) },
3521     { MOD_TABLE (MOD_0F18_REG_7) },
3522   },
3523   /* REG_0F71 */
3524   {
3525     { Bad_Opcode },
3526     { Bad_Opcode },
3527     { MOD_TABLE (MOD_0F71_REG_2) },
3528     { Bad_Opcode },
3529     { MOD_TABLE (MOD_0F71_REG_4) },
3530     { Bad_Opcode },
3531     { MOD_TABLE (MOD_0F71_REG_6) },
3532   },
3533   /* REG_0F72 */
3534   {
3535     { Bad_Opcode },
3536     { Bad_Opcode },
3537     { MOD_TABLE (MOD_0F72_REG_2) },
3538     { Bad_Opcode },
3539     { MOD_TABLE (MOD_0F72_REG_4) },
3540     { Bad_Opcode },
3541     { MOD_TABLE (MOD_0F72_REG_6) },
3542   },
3543   /* REG_0F73 */
3544   {
3545     { Bad_Opcode },
3546     { Bad_Opcode },
3547     { MOD_TABLE (MOD_0F73_REG_2) },
3548     { MOD_TABLE (MOD_0F73_REG_3) },
3549     { Bad_Opcode },
3550     { Bad_Opcode },
3551     { MOD_TABLE (MOD_0F73_REG_6) },
3552     { MOD_TABLE (MOD_0F73_REG_7) },
3553   },
3554   /* REG_0FA6 */
3555   {
3556     { "montmul",        { { OP_0f07, 0 } }, 0 },
3557     { "xsha1",          { { OP_0f07, 0 } }, 0 },
3558     { "xsha256",        { { OP_0f07, 0 } }, 0 },
3559   },
3560   /* REG_0FA7 */
3561   {
3562     { "xstore-rng",     { { OP_0f07, 0 } }, 0 },
3563     { "xcrypt-ecb",     { { OP_0f07, 0 } }, 0 },
3564     { "xcrypt-cbc",     { { OP_0f07, 0 } }, 0 },
3565     { "xcrypt-ctr",     { { OP_0f07, 0 } }, 0 },
3566     { "xcrypt-cfb",     { { OP_0f07, 0 } }, 0 },
3567     { "xcrypt-ofb",     { { OP_0f07, 0 } }, 0 },
3568   },
3569   /* REG_0FAE */
3570   {
3571     { MOD_TABLE (MOD_0FAE_REG_0) },
3572     { MOD_TABLE (MOD_0FAE_REG_1) },
3573     { MOD_TABLE (MOD_0FAE_REG_2) },
3574     { MOD_TABLE (MOD_0FAE_REG_3) },
3575     { MOD_TABLE (MOD_0FAE_REG_4) },
3576     { MOD_TABLE (MOD_0FAE_REG_5) },
3577     { MOD_TABLE (MOD_0FAE_REG_6) },
3578     { MOD_TABLE (MOD_0FAE_REG_7) },
3579   },
3580   /* REG_0FBA */
3581   {
3582     { Bad_Opcode },
3583     { Bad_Opcode },
3584     { Bad_Opcode },
3585     { Bad_Opcode },
3586     { "btQ",    { Ev, Ib }, 0 },
3587     { "btsQ",   { Evh1, Ib }, 0 },
3588     { "btrQ",   { Evh1, Ib }, 0 },
3589     { "btcQ",   { Evh1, Ib }, 0 },
3590   },
3591   /* REG_0FC7 */
3592   {
3593     { Bad_Opcode },
3594     { "cmpxchg8b", { { CMPXCHG8B_Fixup, q_mode } }, 0 },
3595     { Bad_Opcode },
3596     { MOD_TABLE (MOD_0FC7_REG_3) },
3597     { MOD_TABLE (MOD_0FC7_REG_4) },
3598     { MOD_TABLE (MOD_0FC7_REG_5) },
3599     { MOD_TABLE (MOD_0FC7_REG_6) },
3600     { MOD_TABLE (MOD_0FC7_REG_7) },
3601   },
3602   /* REG_VEX_0F71 */
3603   {
3604     { Bad_Opcode },
3605     { Bad_Opcode },
3606     { MOD_TABLE (MOD_VEX_0F71_REG_2) },
3607     { Bad_Opcode },
3608     { MOD_TABLE (MOD_VEX_0F71_REG_4) },
3609     { Bad_Opcode },
3610     { MOD_TABLE (MOD_VEX_0F71_REG_6) },
3611   },
3612   /* REG_VEX_0F72 */
3613   {
3614     { Bad_Opcode },
3615     { Bad_Opcode },
3616     { MOD_TABLE (MOD_VEX_0F72_REG_2) },
3617     { Bad_Opcode },
3618     { MOD_TABLE (MOD_VEX_0F72_REG_4) },
3619     { Bad_Opcode },
3620     { MOD_TABLE (MOD_VEX_0F72_REG_6) },
3621   },
3622   /* REG_VEX_0F73 */
3623   {
3624     { Bad_Opcode },
3625     { Bad_Opcode },
3626     { MOD_TABLE (MOD_VEX_0F73_REG_2) },
3627     { MOD_TABLE (MOD_VEX_0F73_REG_3) },
3628     { Bad_Opcode },
3629     { Bad_Opcode },
3630     { MOD_TABLE (MOD_VEX_0F73_REG_6) },
3631     { MOD_TABLE (MOD_VEX_0F73_REG_7) },
3632   },
3633   /* REG_VEX_0FAE */
3634   {
3635     { Bad_Opcode },
3636     { Bad_Opcode },
3637     { MOD_TABLE (MOD_VEX_0FAE_REG_2) },
3638     { MOD_TABLE (MOD_VEX_0FAE_REG_3) },
3639   },
3640   /* REG_VEX_0F38F3 */
3641   {
3642     { Bad_Opcode },
3643     { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_1) },
3644     { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_2) },
3645     { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_3) },
3646   },
3647   /* REG_XOP_LWPCB */
3648   {
3649     { "llwpcb", { { OP_LWPCB_E, 0 } }, 0 },
3650     { "slwpcb", { { OP_LWPCB_E, 0 } }, 0 },
3651   },
3652   /* REG_XOP_LWP */
3653   {
3654     { "lwpins", { { OP_LWP_E, 0 }, Ed, Iq }, 0 },
3655     { "lwpval", { { OP_LWP_E, 0 }, Ed, Iq }, 0 },
3656   },
3657   /* REG_XOP_TBM_01 */
3658   {
3659     { Bad_Opcode },
3660     { "blcfill",        { { OP_LWP_E, 0 }, Ev }, 0 },
3661     { "blsfill",        { { OP_LWP_E, 0 }, Ev }, 0 },
3662     { "blcs",   { { OP_LWP_E, 0 }, Ev }, 0 },
3663     { "tzmsk",  { { OP_LWP_E, 0 }, Ev }, 0 },
3664     { "blcic",  { { OP_LWP_E, 0 }, Ev }, 0 },
3665     { "blsic",  { { OP_LWP_E, 0 }, Ev }, 0 },
3666     { "t1mskc", { { OP_LWP_E, 0 }, Ev }, 0 },
3667   },
3668   /* REG_XOP_TBM_02 */
3669   {
3670     { Bad_Opcode },
3671     { "blcmsk", { { OP_LWP_E, 0 }, Ev }, 0 },
3672     { Bad_Opcode },
3673     { Bad_Opcode },
3674     { Bad_Opcode },
3675     { Bad_Opcode },
3676     { "blci",   { { OP_LWP_E, 0 }, Ev }, 0 },
3677   },
3678 #define NEED_REG_TABLE
3679 #include "i386-dis-evex.h"
3680 #undef NEED_REG_TABLE
3681 };
3682
3683 static const struct dis386 prefix_table[][4] = {
3684   /* PREFIX_90 */
3685   {
3686     { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } }, 0 },
3687     { "pause", { XX }, 0 },
3688     { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } }, 0 },
3689     { NULL, { { NULL, 0 } }, PREFIX_IGNORED }
3690   },
3691
3692   /* PREFIX_0F10 */
3693   {
3694     { "movups", { XM, EXx }, PREFIX_OPCODE },
3695     { "movss",  { XM, EXd }, PREFIX_OPCODE },
3696     { "movupd", { XM, EXx }, PREFIX_OPCODE },
3697     { "movsd",  { XM, EXq }, PREFIX_OPCODE },
3698   },
3699
3700   /* PREFIX_0F11 */
3701   {
3702     { "movups", { EXxS, XM }, PREFIX_OPCODE },
3703     { "movss",  { EXdS, XM }, PREFIX_OPCODE },
3704     { "movupd", { EXxS, XM }, PREFIX_OPCODE },
3705     { "movsd",  { EXqS, XM }, PREFIX_OPCODE },
3706   },
3707
3708   /* PREFIX_0F12 */
3709   {
3710     { MOD_TABLE (MOD_0F12_PREFIX_0) },
3711     { "movsldup", { XM, EXx }, PREFIX_OPCODE },
3712     { "movlpd", { XM, EXq }, PREFIX_OPCODE },
3713     { "movddup", { XM, EXq }, PREFIX_OPCODE },
3714   },
3715
3716   /* PREFIX_0F16 */
3717   {
3718     { MOD_TABLE (MOD_0F16_PREFIX_0) },
3719     { "movshdup", { XM, EXx }, PREFIX_OPCODE },
3720     { "movhpd", { XM, EXq }, PREFIX_OPCODE },
3721   },
3722
3723   /* PREFIX_0F1A */
3724   {
3725     { MOD_TABLE (MOD_0F1A_PREFIX_0) },
3726     { "bndcl",  { Gbnd, Ev_bnd }, 0 },
3727     { "bndmov", { Gbnd, Ebnd }, 0 },
3728     { "bndcu",  { Gbnd, Ev_bnd }, 0 },
3729   },
3730
3731   /* PREFIX_0F1B */
3732   {
3733     { MOD_TABLE (MOD_0F1B_PREFIX_0) },
3734     { MOD_TABLE (MOD_0F1B_PREFIX_1) },
3735     { "bndmov", { Ebnd, Gbnd }, 0 },
3736     { "bndcn",  { Gbnd, Ev_bnd }, 0 },
3737   },
3738
3739   /* PREFIX_0F2A */
3740   {
3741     { "cvtpi2ps", { XM, EMCq }, PREFIX_OPCODE },
3742     { "cvtsi2ss%LQ", { XM, Ev }, PREFIX_OPCODE },
3743     { "cvtpi2pd", { XM, EMCq }, PREFIX_OPCODE },
3744     { "cvtsi2sd%LQ", { XM, Ev }, 0 },
3745   },
3746
3747   /* PREFIX_0F2B */
3748   {
3749     { MOD_TABLE (MOD_0F2B_PREFIX_0) },
3750     { MOD_TABLE (MOD_0F2B_PREFIX_1) },
3751     { MOD_TABLE (MOD_0F2B_PREFIX_2) },
3752     { MOD_TABLE (MOD_0F2B_PREFIX_3) },
3753   },
3754
3755   /* PREFIX_0F2C */
3756   {
3757     { "cvttps2pi", { MXC, EXq }, PREFIX_OPCODE },
3758     { "cvttss2siY", { Gv, EXd }, PREFIX_OPCODE },
3759     { "cvttpd2pi", { MXC, EXx }, PREFIX_OPCODE },
3760     { "cvttsd2siY", { Gv, EXq }, PREFIX_OPCODE },
3761   },
3762
3763   /* PREFIX_0F2D */
3764   {
3765     { "cvtps2pi", { MXC, EXq }, PREFIX_OPCODE },
3766     { "cvtss2siY", { Gv, EXd }, PREFIX_OPCODE },
3767     { "cvtpd2pi", { MXC, EXx }, PREFIX_OPCODE },
3768     { "cvtsd2siY", { Gv, EXq }, PREFIX_OPCODE },
3769   },
3770
3771   /* PREFIX_0F2E */
3772   {
3773     { "ucomiss",{ XM, EXd }, 0 },
3774     { Bad_Opcode },
3775     { "ucomisd",{ XM, EXq }, 0 },
3776   },
3777
3778   /* PREFIX_0F2F */
3779   {
3780     { "comiss", { XM, EXd }, 0 },
3781     { Bad_Opcode },
3782     { "comisd", { XM, EXq }, 0 },
3783   },
3784
3785   /* PREFIX_0F51 */
3786   {
3787     { "sqrtps", { XM, EXx }, PREFIX_OPCODE },
3788     { "sqrtss", { XM, EXd }, PREFIX_OPCODE },
3789     { "sqrtpd", { XM, EXx }, PREFIX_OPCODE },
3790     { "sqrtsd", { XM, EXq }, PREFIX_OPCODE },
3791   },
3792
3793   /* PREFIX_0F52 */
3794   {
3795     { "rsqrtps",{ XM, EXx }, PREFIX_OPCODE },
3796     { "rsqrtss",{ XM, EXd }, PREFIX_OPCODE },
3797   },
3798
3799   /* PREFIX_0F53 */
3800   {
3801     { "rcpps",  { XM, EXx }, PREFIX_OPCODE },
3802     { "rcpss",  { XM, EXd }, PREFIX_OPCODE },
3803   },
3804
3805   /* PREFIX_0F58 */
3806   {
3807     { "addps", { XM, EXx }, PREFIX_OPCODE },
3808     { "addss", { XM, EXd }, PREFIX_OPCODE },
3809     { "addpd", { XM, EXx }, PREFIX_OPCODE },
3810     { "addsd", { XM, EXq }, PREFIX_OPCODE },
3811   },
3812
3813   /* PREFIX_0F59 */
3814   {
3815     { "mulps",  { XM, EXx }, PREFIX_OPCODE },
3816     { "mulss",  { XM, EXd }, PREFIX_OPCODE },
3817     { "mulpd",  { XM, EXx }, PREFIX_OPCODE },
3818     { "mulsd",  { XM, EXq }, PREFIX_OPCODE },
3819   },
3820
3821   /* PREFIX_0F5A */
3822   {
3823     { "cvtps2pd", { XM, EXq }, PREFIX_OPCODE },
3824     { "cvtss2sd", { XM, EXd }, PREFIX_OPCODE },
3825     { "cvtpd2ps", { XM, EXx }, PREFIX_OPCODE },
3826     { "cvtsd2ss", { XM, EXq }, PREFIX_OPCODE },
3827   },
3828
3829   /* PREFIX_0F5B */
3830   {
3831     { "cvtdq2ps", { XM, EXx }, PREFIX_OPCODE },
3832     { "cvttps2dq", { XM, EXx }, PREFIX_OPCODE },
3833     { "cvtps2dq", { XM, EXx }, PREFIX_OPCODE },
3834   },
3835
3836   /* PREFIX_0F5C */
3837   {
3838     { "subps",  { XM, EXx }, PREFIX_OPCODE },
3839     { "subss",  { XM, EXd }, PREFIX_OPCODE },
3840     { "subpd",  { XM, EXx }, PREFIX_OPCODE },
3841     { "subsd",  { XM, EXq }, PREFIX_OPCODE },
3842   },
3843
3844   /* PREFIX_0F5D */
3845   {
3846     { "minps",  { XM, EXx }, PREFIX_OPCODE },
3847     { "minss",  { XM, EXd }, PREFIX_OPCODE },
3848     { "minpd",  { XM, EXx }, PREFIX_OPCODE },
3849     { "minsd",  { XM, EXq }, PREFIX_OPCODE },
3850   },
3851
3852   /* PREFIX_0F5E */
3853   {
3854     { "divps",  { XM, EXx }, PREFIX_OPCODE },
3855     { "divss",  { XM, EXd }, PREFIX_OPCODE },
3856     { "divpd",  { XM, EXx }, PREFIX_OPCODE },
3857     { "divsd",  { XM, EXq }, PREFIX_OPCODE },
3858   },
3859
3860   /* PREFIX_0F5F */
3861   {
3862     { "maxps",  { XM, EXx }, PREFIX_OPCODE },
3863     { "maxss",  { XM, EXd }, PREFIX_OPCODE },
3864     { "maxpd",  { XM, EXx }, PREFIX_OPCODE },
3865     { "maxsd",  { XM, EXq }, PREFIX_OPCODE },
3866   },
3867
3868   /* PREFIX_0F60 */
3869   {
3870     { "punpcklbw",{ MX, EMd }, PREFIX_OPCODE },
3871     { Bad_Opcode },
3872     { "punpcklbw",{ MX, EMx }, PREFIX_OPCODE },
3873   },
3874
3875   /* PREFIX_0F61 */
3876   {
3877     { "punpcklwd",{ MX, EMd }, PREFIX_OPCODE },
3878     { Bad_Opcode },
3879     { "punpcklwd",{ MX, EMx }, PREFIX_OPCODE },
3880   },
3881
3882   /* PREFIX_0F62 */
3883   {
3884     { "punpckldq",{ MX, EMd }, PREFIX_OPCODE },
3885     { Bad_Opcode },
3886     { "punpckldq",{ MX, EMx }, PREFIX_OPCODE },
3887   },
3888
3889   /* PREFIX_0F6C */
3890   {
3891     { Bad_Opcode },
3892     { Bad_Opcode },
3893     { "punpcklqdq", { XM, EXx }, PREFIX_OPCODE },
3894   },
3895
3896   /* PREFIX_0F6D */
3897   {
3898     { Bad_Opcode },
3899     { Bad_Opcode },
3900     { "punpckhqdq", { XM, EXx }, PREFIX_OPCODE },
3901   },
3902
3903   /* PREFIX_0F6F */
3904   {
3905     { "movq",   { MX, EM }, PREFIX_OPCODE },
3906     { "movdqu", { XM, EXx }, PREFIX_OPCODE },
3907     { "movdqa", { XM, EXx }, PREFIX_OPCODE },
3908   },
3909
3910   /* PREFIX_0F70 */
3911   {
3912     { "pshufw", { MX, EM, Ib }, PREFIX_OPCODE },
3913     { "pshufhw",{ XM, EXx, Ib }, PREFIX_OPCODE },
3914     { "pshufd", { XM, EXx, Ib }, PREFIX_OPCODE },
3915     { "pshuflw",{ XM, EXx, Ib }, PREFIX_OPCODE },
3916   },
3917
3918   /* PREFIX_0F73_REG_3 */
3919   {
3920     { Bad_Opcode },
3921     { Bad_Opcode },
3922     { "psrldq", { XS, Ib }, 0 },
3923   },
3924
3925   /* PREFIX_0F73_REG_7 */
3926   {
3927     { Bad_Opcode },
3928     { Bad_Opcode },
3929     { "pslldq", { XS, Ib }, 0 },
3930   },
3931
3932   /* PREFIX_0F78 */
3933   {
3934     {"vmread",  { Em, Gm }, 0 },
3935     { Bad_Opcode },
3936     {"extrq",   { XS, Ib, Ib }, 0 },
3937     {"insertq", { XM, XS, Ib, Ib }, 0 },
3938   },
3939
3940   /* PREFIX_0F79 */
3941   {
3942     {"vmwrite", { Gm, Em }, 0 },
3943     { Bad_Opcode },
3944     {"extrq",   { XM, XS }, 0 },
3945     {"insertq", { XM, XS }, 0 },
3946   },
3947
3948   /* PREFIX_0F7C */
3949   {
3950     { Bad_Opcode },
3951     { Bad_Opcode },
3952     { "haddpd", { XM, EXx }, PREFIX_OPCODE },
3953     { "haddps", { XM, EXx }, PREFIX_OPCODE },
3954   },
3955
3956   /* PREFIX_0F7D */
3957   {
3958     { Bad_Opcode },
3959     { Bad_Opcode },
3960     { "hsubpd", { XM, EXx }, PREFIX_OPCODE },
3961     { "hsubps", { XM, EXx }, PREFIX_OPCODE },
3962   },
3963
3964   /* PREFIX_0F7E */
3965   {
3966     { "movK",   { Edq, MX }, PREFIX_OPCODE },
3967     { "movq",   { XM, EXq }, PREFIX_OPCODE },
3968     { "movK",   { Edq, XM }, PREFIX_OPCODE },
3969   },
3970
3971   /* PREFIX_0F7F */
3972   {
3973     { "movq",   { EMS, MX }, PREFIX_OPCODE },
3974     { "movdqu", { EXxS, XM }, PREFIX_OPCODE },
3975     { "movdqa", { EXxS, XM }, PREFIX_OPCODE },
3976   },
3977
3978   /* PREFIX_0FAE_REG_0 */
3979   {
3980     { Bad_Opcode },
3981     { "rdfsbase", { Ev }, 0 },
3982   },
3983
3984   /* PREFIX_0FAE_REG_1 */
3985   {
3986     { Bad_Opcode },
3987     { "rdgsbase", { Ev }, 0 },
3988   },
3989
3990   /* PREFIX_0FAE_REG_2 */
3991   {
3992     { Bad_Opcode },
3993     { "wrfsbase", { Ev }, 0 },
3994   },
3995
3996   /* PREFIX_0FAE_REG_3 */
3997   {
3998     { Bad_Opcode },
3999     { "wrgsbase", { Ev }, 0 },
4000   },
4001
4002   /* PREFIX_0FAE_REG_6 */
4003   {
4004     { "xsaveopt",      { FXSAVE }, 0 },
4005     { Bad_Opcode },
4006     { "clwb",   { Mb }, 0 },
4007   },
4008
4009   /* PREFIX_0FAE_REG_7 */
4010   {
4011     { "clflush",        { Mb }, 0 },
4012     { Bad_Opcode },
4013     { "clflushopt",     { Mb }, 0 },
4014   },
4015
4016   /* PREFIX_RM_0_0FAE_REG_7 */
4017   {
4018     { "sfence",         { Skip_MODRM }, 0 },
4019     { Bad_Opcode },
4020     { "pcommit",                { Skip_MODRM }, 0 },
4021   },
4022
4023   /* PREFIX_0FB8 */
4024   {
4025     { Bad_Opcode },
4026     { "popcntS", { Gv, Ev }, 0 },
4027   },
4028
4029   /* PREFIX_0FBC */
4030   {
4031     { "bsfS",   { Gv, Ev }, 0 },
4032     { "tzcntS", { Gv, Ev }, 0 },
4033     { "bsfS",   { Gv, Ev }, 0 },
4034   },
4035
4036   /* PREFIX_0FBD */
4037   {
4038     { "bsrS",   { Gv, Ev }, 0 },
4039     { "lzcntS", { Gv, Ev }, 0 },
4040     { "bsrS",   { Gv, Ev }, 0 },
4041   },
4042
4043   /* PREFIX_0FC2 */
4044   {
4045     { "cmpps",  { XM, EXx, CMP }, PREFIX_OPCODE },
4046     { "cmpss",  { XM, EXd, CMP }, PREFIX_OPCODE },
4047     { "cmppd",  { XM, EXx, CMP }, PREFIX_OPCODE },
4048     { "cmpsd",  { XM, EXq, CMP }, PREFIX_OPCODE },
4049   },
4050
4051   /* PREFIX_0FC3 */
4052   {
4053     { "movntiS", { Ma, Gv }, PREFIX_OPCODE },
4054   },
4055
4056   /* PREFIX_MOD_0_0FC7_REG_6 */
4057   {
4058     { "vmptrld",{ Mq }, 0 },
4059     { "vmxon",  { Mq }, 0 },
4060     { "vmclear",{ Mq }, 0 },
4061   },
4062
4063   /* PREFIX_MOD_3_0FC7_REG_6 */
4064   {
4065     { "rdrand", { Ev }, 0 },
4066     { Bad_Opcode },
4067     { "rdrand", { Ev }, 0 }
4068   },
4069
4070   /* PREFIX_MOD_3_0FC7_REG_7 */
4071   {
4072     { "rdseed", { Ev }, 0 },
4073     { Bad_Opcode },
4074     { "rdseed", { Ev }, 0 },
4075   },
4076
4077   /* PREFIX_0FD0 */
4078   {
4079     { Bad_Opcode },
4080     { Bad_Opcode },
4081     { "addsubpd", { XM, EXx }, 0 },
4082     { "addsubps", { XM, EXx }, 0 },
4083   },
4084
4085   /* PREFIX_0FD6 */
4086   {
4087     { Bad_Opcode },
4088     { "movq2dq",{ XM, MS }, 0 },
4089     { "movq",   { EXqS, XM }, 0 },
4090     { "movdq2q",{ MX, XS }, 0 },
4091   },
4092
4093   /* PREFIX_0FE6 */
4094   {
4095     { Bad_Opcode },
4096     { "cvtdq2pd", { XM, EXq }, PREFIX_OPCODE },
4097     { "cvttpd2dq", { XM, EXx }, PREFIX_OPCODE },
4098     { "cvtpd2dq", { XM, EXx }, PREFIX_OPCODE },
4099   },
4100
4101   /* PREFIX_0FE7 */
4102   {
4103     { "movntq", { Mq, MX }, PREFIX_OPCODE },
4104     { Bad_Opcode },
4105     { MOD_TABLE (MOD_0FE7_PREFIX_2) },
4106   },
4107
4108   /* PREFIX_0FF0 */
4109   {
4110     { Bad_Opcode },
4111     { Bad_Opcode },
4112     { Bad_Opcode },
4113     { MOD_TABLE (MOD_0FF0_PREFIX_3) },
4114   },
4115
4116   /* PREFIX_0FF7 */
4117   {
4118     { "maskmovq", { MX, MS }, PREFIX_OPCODE },
4119     { Bad_Opcode },
4120     { "maskmovdqu", { XM, XS }, PREFIX_OPCODE },
4121   },
4122
4123   /* PREFIX_0F3810 */
4124   {
4125     { Bad_Opcode },
4126     { Bad_Opcode },
4127     { "pblendvb", { XM, EXx, XMM0 }, PREFIX_OPCODE },
4128   },
4129
4130   /* PREFIX_0F3814 */
4131   {
4132     { Bad_Opcode },
4133     { Bad_Opcode },
4134     { "blendvps", { XM, EXx, XMM0 }, PREFIX_OPCODE },
4135   },
4136
4137   /* PREFIX_0F3815 */
4138   {
4139     { Bad_Opcode },
4140     { Bad_Opcode },
4141     { "blendvpd", { XM, EXx, XMM0 }, PREFIX_OPCODE },
4142   },
4143
4144   /* PREFIX_0F3817 */
4145   {
4146     { Bad_Opcode },
4147     { Bad_Opcode },
4148     { "ptest",  { XM, EXx }, PREFIX_OPCODE },
4149   },
4150
4151   /* PREFIX_0F3820 */
4152   {
4153     { Bad_Opcode },
4154     { Bad_Opcode },
4155     { "pmovsxbw", { XM, EXq }, PREFIX_OPCODE },
4156   },
4157
4158   /* PREFIX_0F3821 */
4159   {
4160     { Bad_Opcode },
4161     { Bad_Opcode },
4162     { "pmovsxbd", { XM, EXd }, PREFIX_OPCODE },
4163   },
4164
4165   /* PREFIX_0F3822 */
4166   {
4167     { Bad_Opcode },
4168     { Bad_Opcode },
4169     { "pmovsxbq", { XM, EXw }, PREFIX_OPCODE },
4170   },
4171
4172   /* PREFIX_0F3823 */
4173   {
4174     { Bad_Opcode },
4175     { Bad_Opcode },
4176     { "pmovsxwd", { XM, EXq }, PREFIX_OPCODE },
4177   },
4178
4179   /* PREFIX_0F3824 */
4180   {
4181     { Bad_Opcode },
4182     { Bad_Opcode },
4183     { "pmovsxwq", { XM, EXd }, PREFIX_OPCODE },
4184   },
4185
4186   /* PREFIX_0F3825 */
4187   {
4188     { Bad_Opcode },
4189     { Bad_Opcode },
4190     { "pmovsxdq", { XM, EXq }, PREFIX_OPCODE },
4191   },
4192
4193   /* PREFIX_0F3828 */
4194   {
4195     { Bad_Opcode },
4196     { Bad_Opcode },
4197     { "pmuldq", { XM, EXx }, PREFIX_OPCODE },
4198   },
4199
4200   /* PREFIX_0F3829 */
4201   {
4202     { Bad_Opcode },
4203     { Bad_Opcode },
4204     { "pcmpeqq", { XM, EXx }, PREFIX_OPCODE },
4205   },
4206
4207   /* PREFIX_0F382A */
4208   {
4209     { Bad_Opcode },
4210     { Bad_Opcode },
4211     { MOD_TABLE (MOD_0F382A_PREFIX_2) },
4212   },
4213
4214   /* PREFIX_0F382B */
4215   {
4216     { Bad_Opcode },
4217     { Bad_Opcode },
4218     { "packusdw", { XM, EXx }, PREFIX_OPCODE },
4219   },
4220
4221   /* PREFIX_0F3830 */
4222   {
4223     { Bad_Opcode },
4224     { Bad_Opcode },
4225     { "pmovzxbw", { XM, EXq }, PREFIX_OPCODE },
4226   },
4227
4228   /* PREFIX_0F3831 */
4229   {
4230     { Bad_Opcode },
4231     { Bad_Opcode },
4232     { "pmovzxbd", { XM, EXd }, PREFIX_OPCODE },
4233   },
4234
4235   /* PREFIX_0F3832 */
4236   {
4237     { Bad_Opcode },
4238     { Bad_Opcode },
4239     { "pmovzxbq", { XM, EXw }, PREFIX_OPCODE },
4240   },
4241
4242   /* PREFIX_0F3833 */
4243   {
4244     { Bad_Opcode },
4245     { Bad_Opcode },
4246     { "pmovzxwd", { XM, EXq }, PREFIX_OPCODE },
4247   },
4248
4249   /* PREFIX_0F3834 */
4250   {
4251     { Bad_Opcode },
4252     { Bad_Opcode },
4253     { "pmovzxwq", { XM, EXd }, PREFIX_OPCODE },
4254   },
4255
4256   /* PREFIX_0F3835 */
4257   {
4258     { Bad_Opcode },
4259     { Bad_Opcode },
4260     { "pmovzxdq", { XM, EXq }, PREFIX_OPCODE },
4261   },
4262
4263   /* PREFIX_0F3837 */
4264   {
4265     { Bad_Opcode },
4266     { Bad_Opcode },
4267     { "pcmpgtq", { XM, EXx }, PREFIX_OPCODE },
4268   },
4269
4270   /* PREFIX_0F3838 */
4271   {
4272     { Bad_Opcode },
4273     { Bad_Opcode },
4274     { "pminsb", { XM, EXx }, PREFIX_OPCODE },
4275   },
4276
4277   /* PREFIX_0F3839 */
4278   {
4279     { Bad_Opcode },
4280     { Bad_Opcode },
4281     { "pminsd", { XM, EXx }, PREFIX_OPCODE },
4282   },
4283
4284   /* PREFIX_0F383A */
4285   {
4286     { Bad_Opcode },
4287     { Bad_Opcode },
4288     { "pminuw", { XM, EXx }, PREFIX_OPCODE },
4289   },
4290
4291   /* PREFIX_0F383B */
4292   {
4293     { Bad_Opcode },
4294     { Bad_Opcode },
4295     { "pminud", { XM, EXx }, PREFIX_OPCODE },
4296   },
4297
4298   /* PREFIX_0F383C */
4299   {
4300     { Bad_Opcode },
4301     { Bad_Opcode },
4302     { "pmaxsb", { XM, EXx }, PREFIX_OPCODE },
4303   },
4304
4305   /* PREFIX_0F383D */
4306   {
4307     { Bad_Opcode },
4308     { Bad_Opcode },
4309     { "pmaxsd", { XM, EXx }, PREFIX_OPCODE },
4310   },
4311
4312   /* PREFIX_0F383E */
4313   {
4314     { Bad_Opcode },
4315     { Bad_Opcode },
4316     { "pmaxuw", { XM, EXx }, PREFIX_OPCODE },
4317   },
4318
4319   /* PREFIX_0F383F */
4320   {
4321     { Bad_Opcode },
4322     { Bad_Opcode },
4323     { "pmaxud", { XM, EXx }, PREFIX_OPCODE },
4324   },
4325
4326   /* PREFIX_0F3840 */
4327   {
4328     { Bad_Opcode },
4329     { Bad_Opcode },
4330     { "pmulld", { XM, EXx }, PREFIX_OPCODE },
4331   },
4332
4333   /* PREFIX_0F3841 */
4334   {
4335     { Bad_Opcode },
4336     { Bad_Opcode },
4337     { "phminposuw", { XM, EXx }, PREFIX_OPCODE },
4338   },
4339
4340   /* PREFIX_0F3880 */
4341   {
4342     { Bad_Opcode },
4343     { Bad_Opcode },
4344     { "invept", { Gm, Mo }, PREFIX_OPCODE },
4345   },
4346
4347   /* PREFIX_0F3881 */
4348   {
4349     { Bad_Opcode },
4350     { Bad_Opcode },
4351     { "invvpid", { Gm, Mo }, PREFIX_OPCODE },
4352   },
4353
4354   /* PREFIX_0F3882 */
4355   {
4356     { Bad_Opcode },
4357     { Bad_Opcode },
4358     { "invpcid", { Gm, M }, PREFIX_OPCODE },
4359   },
4360
4361   /* PREFIX_0F38C8 */
4362   {
4363     { "sha1nexte", { XM, EXxmm }, PREFIX_OPCODE },
4364   },
4365
4366   /* PREFIX_0F38C9 */
4367   {
4368     { "sha1msg1", { XM, EXxmm }, PREFIX_OPCODE },
4369   },
4370
4371   /* PREFIX_0F38CA */
4372   {
4373     { "sha1msg2", { XM, EXxmm }, PREFIX_OPCODE },
4374   },
4375
4376   /* PREFIX_0F38CB */
4377   {
4378     { "sha256rnds2", { XM, EXxmm, XMM0 }, PREFIX_OPCODE },
4379   },
4380
4381   /* PREFIX_0F38CC */
4382   {
4383     { "sha256msg1", { XM, EXxmm }, PREFIX_OPCODE },
4384   },
4385
4386   /* PREFIX_0F38CD */
4387   {
4388     { "sha256msg2", { XM, EXxmm }, PREFIX_OPCODE },
4389   },
4390
4391   /* PREFIX_0F38DB */
4392   {
4393     { Bad_Opcode },
4394     { Bad_Opcode },
4395     { "aesimc", { XM, EXx }, PREFIX_OPCODE },
4396   },
4397
4398   /* PREFIX_0F38DC */
4399   {
4400     { Bad_Opcode },
4401     { Bad_Opcode },
4402     { "aesenc", { XM, EXx }, PREFIX_OPCODE },
4403   },
4404
4405   /* PREFIX_0F38DD */
4406   {
4407     { Bad_Opcode },
4408     { Bad_Opcode },
4409     { "aesenclast", { XM, EXx }, PREFIX_OPCODE },
4410   },
4411
4412   /* PREFIX_0F38DE */
4413   {
4414     { Bad_Opcode },
4415     { Bad_Opcode },
4416     { "aesdec", { XM, EXx }, PREFIX_OPCODE },
4417   },
4418
4419   /* PREFIX_0F38DF */
4420   {
4421     { Bad_Opcode },
4422     { Bad_Opcode },
4423     { "aesdeclast", { XM, EXx }, PREFIX_OPCODE },
4424   },
4425
4426   /* PREFIX_0F38F0 */
4427   {
4428     { "movbeS", { Gv, { MOVBE_Fixup, v_mode } }, PREFIX_OPCODE },
4429     { Bad_Opcode },
4430     { "movbeS", { Gv, { MOVBE_Fixup, v_mode } }, PREFIX_OPCODE },
4431     { "crc32",  { Gdq, { CRC32_Fixup, b_mode } }, PREFIX_OPCODE },
4432   },
4433
4434   /* PREFIX_0F38F1 */
4435   {
4436     { "movbeS", { { MOVBE_Fixup, v_mode }, Gv }, PREFIX_OPCODE },
4437     { Bad_Opcode },
4438     { "movbeS", { { MOVBE_Fixup, v_mode }, Gv }, PREFIX_OPCODE },
4439     { "crc32",  { Gdq, { CRC32_Fixup, v_mode } }, PREFIX_OPCODE },
4440   },
4441
4442   /* PREFIX_0F38F6 */
4443   {
4444     { Bad_Opcode },
4445     { "adoxS",  { Gdq, Edq}, PREFIX_OPCODE },
4446     { "adcxS",  { Gdq, Edq}, PREFIX_OPCODE },
4447     { Bad_Opcode },
4448   },
4449
4450   /* PREFIX_0F3A08 */
4451   {
4452     { Bad_Opcode },
4453     { Bad_Opcode },
4454     { "roundps", { XM, EXx, Ib }, PREFIX_OPCODE },
4455   },
4456
4457   /* PREFIX_0F3A09 */
4458   {
4459     { Bad_Opcode },
4460     { Bad_Opcode },
4461     { "roundpd", { XM, EXx, Ib }, PREFIX_OPCODE },
4462   },
4463
4464   /* PREFIX_0F3A0A */
4465   {
4466     { Bad_Opcode },
4467     { Bad_Opcode },
4468     { "roundss", { XM, EXd, Ib }, PREFIX_OPCODE },
4469   },
4470
4471   /* PREFIX_0F3A0B */
4472   {
4473     { Bad_Opcode },
4474     { Bad_Opcode },
4475     { "roundsd", { XM, EXq, Ib }, PREFIX_OPCODE },
4476   },
4477
4478   /* PREFIX_0F3A0C */
4479   {
4480     { Bad_Opcode },
4481     { Bad_Opcode },
4482     { "blendps", { XM, EXx, Ib }, PREFIX_OPCODE },
4483   },
4484
4485   /* PREFIX_0F3A0D */
4486   {
4487     { Bad_Opcode },
4488     { Bad_Opcode },
4489     { "blendpd", { XM, EXx, Ib }, PREFIX_OPCODE },
4490   },
4491
4492   /* PREFIX_0F3A0E */
4493   {
4494     { Bad_Opcode },
4495     { Bad_Opcode },
4496     { "pblendw", { XM, EXx, Ib }, PREFIX_OPCODE },
4497   },
4498
4499   /* PREFIX_0F3A14 */
4500   {
4501     { Bad_Opcode },
4502     { Bad_Opcode },
4503     { "pextrb", { Edqb, XM, Ib }, PREFIX_OPCODE },
4504   },
4505
4506   /* PREFIX_0F3A15 */
4507   {
4508     { Bad_Opcode },
4509     { Bad_Opcode },
4510     { "pextrw", { Edqw, XM, Ib }, PREFIX_OPCODE },
4511   },
4512
4513   /* PREFIX_0F3A16 */
4514   {
4515     { Bad_Opcode },
4516     { Bad_Opcode },
4517     { "pextrK", { Edq, XM, Ib }, PREFIX_OPCODE },
4518   },
4519
4520   /* PREFIX_0F3A17 */
4521   {
4522     { Bad_Opcode },
4523     { Bad_Opcode },
4524     { "extractps", { Edqd, XM, Ib }, PREFIX_OPCODE },
4525   },
4526
4527   /* PREFIX_0F3A20 */
4528   {
4529     { Bad_Opcode },
4530     { Bad_Opcode },
4531     { "pinsrb", { XM, Edqb, Ib }, PREFIX_OPCODE },
4532   },
4533
4534   /* PREFIX_0F3A21 */
4535   {
4536     { Bad_Opcode },
4537     { Bad_Opcode },
4538     { "insertps", { XM, EXd, Ib }, PREFIX_OPCODE },
4539   },
4540
4541   /* PREFIX_0F3A22 */
4542   {
4543     { Bad_Opcode },
4544     { Bad_Opcode },
4545     { "pinsrK", { XM, Edq, Ib }, PREFIX_OPCODE },
4546   },
4547
4548   /* PREFIX_0F3A40 */
4549   {
4550     { Bad_Opcode },
4551     { Bad_Opcode },
4552     { "dpps",   { XM, EXx, Ib }, PREFIX_OPCODE },
4553   },
4554
4555   /* PREFIX_0F3A41 */
4556   {
4557     { Bad_Opcode },
4558     { Bad_Opcode },
4559     { "dppd",   { XM, EXx, Ib }, PREFIX_OPCODE },
4560   },
4561
4562   /* PREFIX_0F3A42 */
4563   {
4564     { Bad_Opcode },
4565     { Bad_Opcode },
4566     { "mpsadbw", { XM, EXx, Ib }, PREFIX_OPCODE },
4567   },
4568
4569   /* PREFIX_0F3A44 */
4570   {
4571     { Bad_Opcode },
4572     { Bad_Opcode },
4573     { "pclmulqdq", { XM, EXx, PCLMUL }, PREFIX_OPCODE },
4574   },
4575
4576   /* PREFIX_0F3A60 */
4577   {
4578     { Bad_Opcode },
4579     { Bad_Opcode },
4580     { "pcmpestrm", { XM, EXx, Ib }, PREFIX_OPCODE },
4581   },
4582
4583   /* PREFIX_0F3A61 */
4584   {
4585     { Bad_Opcode },
4586     { Bad_Opcode },
4587     { "pcmpestri", { XM, EXx, Ib }, PREFIX_OPCODE },
4588   },
4589
4590   /* PREFIX_0F3A62 */
4591   {
4592     { Bad_Opcode },
4593     { Bad_Opcode },
4594     { "pcmpistrm", { XM, EXx, Ib }, PREFIX_OPCODE },
4595   },
4596
4597   /* PREFIX_0F3A63 */
4598   {
4599     { Bad_Opcode },
4600     { Bad_Opcode },
4601     { "pcmpistri", { XM, EXx, Ib }, PREFIX_OPCODE },
4602   },
4603
4604   /* PREFIX_0F3ACC */
4605   {
4606     { "sha1rnds4", { XM, EXxmm, Ib }, PREFIX_OPCODE },
4607   },
4608
4609   /* PREFIX_0F3ADF */
4610   {
4611     { Bad_Opcode },
4612     { Bad_Opcode },
4613     { "aeskeygenassist", { XM, EXx, Ib }, PREFIX_OPCODE },
4614   },
4615
4616   /* PREFIX_VEX_0F10 */
4617   {
4618     { VEX_W_TABLE (VEX_W_0F10_P_0) },
4619     { VEX_LEN_TABLE (VEX_LEN_0F10_P_1) },
4620     { VEX_W_TABLE (VEX_W_0F10_P_2) },
4621     { VEX_LEN_TABLE (VEX_LEN_0F10_P_3) },
4622   },
4623
4624   /* PREFIX_VEX_0F11 */
4625   {
4626     { VEX_W_TABLE (VEX_W_0F11_P_0) },
4627     { VEX_LEN_TABLE (VEX_LEN_0F11_P_1) },
4628     { VEX_W_TABLE (VEX_W_0F11_P_2) },
4629     { VEX_LEN_TABLE (VEX_LEN_0F11_P_3) },
4630   },
4631
4632   /* PREFIX_VEX_0F12 */
4633   {
4634     { MOD_TABLE (MOD_VEX_0F12_PREFIX_0) },
4635     { VEX_W_TABLE (VEX_W_0F12_P_1) },
4636     { VEX_LEN_TABLE (VEX_LEN_0F12_P_2) },
4637     { VEX_W_TABLE (VEX_W_0F12_P_3) },
4638   },
4639
4640   /* PREFIX_VEX_0F16 */
4641   {
4642     { MOD_TABLE (MOD_VEX_0F16_PREFIX_0) },
4643     { VEX_W_TABLE (VEX_W_0F16_P_1) },
4644     { VEX_LEN_TABLE (VEX_LEN_0F16_P_2) },
4645   },
4646
4647   /* PREFIX_VEX_0F2A */
4648   {
4649     { Bad_Opcode },
4650     { VEX_LEN_TABLE (VEX_LEN_0F2A_P_1) },
4651     { Bad_Opcode },
4652     { VEX_LEN_TABLE (VEX_LEN_0F2A_P_3) },
4653   },
4654
4655   /* PREFIX_VEX_0F2C */
4656   {
4657     { Bad_Opcode },
4658     { VEX_LEN_TABLE (VEX_LEN_0F2C_P_1) },
4659     { Bad_Opcode },
4660     { VEX_LEN_TABLE (VEX_LEN_0F2C_P_3) },
4661   },
4662
4663   /* PREFIX_VEX_0F2D */
4664   {
4665     { Bad_Opcode },
4666     { VEX_LEN_TABLE (VEX_LEN_0F2D_P_1) },
4667     { Bad_Opcode },
4668     { VEX_LEN_TABLE (VEX_LEN_0F2D_P_3) },
4669   },
4670
4671   /* PREFIX_VEX_0F2E */
4672   {
4673     { VEX_LEN_TABLE (VEX_LEN_0F2E_P_0) },
4674     { Bad_Opcode },
4675     { VEX_LEN_TABLE (VEX_LEN_0F2E_P_2) },
4676   },
4677
4678   /* PREFIX_VEX_0F2F */
4679   {
4680     { VEX_LEN_TABLE (VEX_LEN_0F2F_P_0) },
4681     { Bad_Opcode },
4682     { VEX_LEN_TABLE (VEX_LEN_0F2F_P_2) },
4683   },
4684
4685   /* PREFIX_VEX_0F41 */
4686   {
4687     { VEX_LEN_TABLE (VEX_LEN_0F41_P_0) },
4688     { Bad_Opcode },
4689     { VEX_LEN_TABLE (VEX_LEN_0F41_P_2) },
4690   },
4691
4692   /* PREFIX_VEX_0F42 */
4693   {
4694     { VEX_LEN_TABLE (VEX_LEN_0F42_P_0) },
4695     { Bad_Opcode },
4696     { VEX_LEN_TABLE (VEX_LEN_0F42_P_2) },
4697   },
4698
4699   /* PREFIX_VEX_0F44 */
4700   {
4701     { VEX_LEN_TABLE (VEX_LEN_0F44_P_0) },
4702     { Bad_Opcode },
4703     { VEX_LEN_TABLE (VEX_LEN_0F44_P_2) },
4704   },
4705
4706   /* PREFIX_VEX_0F45 */
4707   {
4708     { VEX_LEN_TABLE (VEX_LEN_0F45_P_0) },
4709     { Bad_Opcode },
4710     { VEX_LEN_TABLE (VEX_LEN_0F45_P_2) },
4711   },
4712
4713   /* PREFIX_VEX_0F46 */
4714   {
4715     { VEX_LEN_TABLE (VEX_LEN_0F46_P_0) },
4716     { Bad_Opcode },
4717     { VEX_LEN_TABLE (VEX_LEN_0F46_P_2) },
4718   },
4719
4720   /* PREFIX_VEX_0F47 */
4721   {
4722     { VEX_LEN_TABLE (VEX_LEN_0F47_P_0) },
4723     { Bad_Opcode },
4724     { VEX_LEN_TABLE (VEX_LEN_0F47_P_2) },
4725   },
4726
4727   /* PREFIX_VEX_0F4A */
4728   {
4729     { VEX_LEN_TABLE (VEX_LEN_0F4A_P_0) },
4730     { Bad_Opcode },
4731     { VEX_LEN_TABLE (VEX_LEN_0F4A_P_2) },
4732   },
4733
4734   /* PREFIX_VEX_0F4B */
4735   {
4736     { VEX_LEN_TABLE (VEX_LEN_0F4B_P_0) },
4737     { Bad_Opcode },
4738     { VEX_LEN_TABLE (VEX_LEN_0F4B_P_2) },
4739   },
4740
4741   /* PREFIX_VEX_0F51 */
4742   {
4743     { VEX_W_TABLE (VEX_W_0F51_P_0) },
4744     { VEX_LEN_TABLE (VEX_LEN_0F51_P_1) },
4745     { VEX_W_TABLE (VEX_W_0F51_P_2) },
4746     { VEX_LEN_TABLE (VEX_LEN_0F51_P_3) },
4747   },
4748
4749   /* PREFIX_VEX_0F52 */
4750   {
4751     { VEX_W_TABLE (VEX_W_0F52_P_0) },
4752     { VEX_LEN_TABLE (VEX_LEN_0F52_P_1) },
4753   },
4754
4755   /* PREFIX_VEX_0F53 */
4756   {
4757     { VEX_W_TABLE (VEX_W_0F53_P_0) },
4758     { VEX_LEN_TABLE (VEX_LEN_0F53_P_1) },
4759   },
4760
4761   /* PREFIX_VEX_0F58 */
4762   {
4763     { VEX_W_TABLE (VEX_W_0F58_P_0) },
4764     { VEX_LEN_TABLE (VEX_LEN_0F58_P_1) },
4765     { VEX_W_TABLE (VEX_W_0F58_P_2) },
4766     { VEX_LEN_TABLE (VEX_LEN_0F58_P_3) },
4767   },
4768
4769   /* PREFIX_VEX_0F59 */
4770   {
4771     { VEX_W_TABLE (VEX_W_0F59_P_0) },
4772     { VEX_LEN_TABLE (VEX_LEN_0F59_P_1) },
4773     { VEX_W_TABLE (VEX_W_0F59_P_2) },
4774     { VEX_LEN_TABLE (VEX_LEN_0F59_P_3) },
4775   },
4776
4777   /* PREFIX_VEX_0F5A */
4778   {
4779     { VEX_W_TABLE (VEX_W_0F5A_P_0) },
4780     { VEX_LEN_TABLE (VEX_LEN_0F5A_P_1) },
4781     { "vcvtpd2ps%XY", { XMM, EXx }, 0 },
4782     { VEX_LEN_TABLE (VEX_LEN_0F5A_P_3) },
4783   },
4784
4785   /* PREFIX_VEX_0F5B */
4786   {
4787     { VEX_W_TABLE (VEX_W_0F5B_P_0) },
4788     { VEX_W_TABLE (VEX_W_0F5B_P_1) },
4789     { VEX_W_TABLE (VEX_W_0F5B_P_2) },
4790   },
4791
4792   /* PREFIX_VEX_0F5C */
4793   {
4794     { VEX_W_TABLE (VEX_W_0F5C_P_0) },
4795     { VEX_LEN_TABLE (VEX_LEN_0F5C_P_1) },
4796     { VEX_W_TABLE (VEX_W_0F5C_P_2) },
4797     { VEX_LEN_TABLE (VEX_LEN_0F5C_P_3) },
4798   },
4799
4800   /* PREFIX_VEX_0F5D */
4801   {
4802     { VEX_W_TABLE (VEX_W_0F5D_P_0) },
4803     { VEX_LEN_TABLE (VEX_LEN_0F5D_P_1) },
4804     { VEX_W_TABLE (VEX_W_0F5D_P_2) },
4805     { VEX_LEN_TABLE (VEX_LEN_0F5D_P_3) },
4806   },
4807
4808   /* PREFIX_VEX_0F5E */
4809   {
4810     { VEX_W_TABLE (VEX_W_0F5E_P_0) },
4811     { VEX_LEN_TABLE (VEX_LEN_0F5E_P_1) },
4812     { VEX_W_TABLE (VEX_W_0F5E_P_2) },
4813     { VEX_LEN_TABLE (VEX_LEN_0F5E_P_3) },
4814   },
4815
4816   /* PREFIX_VEX_0F5F */
4817   {
4818     { VEX_W_TABLE (VEX_W_0F5F_P_0) },
4819     { VEX_LEN_TABLE (VEX_LEN_0F5F_P_1) },
4820     { VEX_W_TABLE (VEX_W_0F5F_P_2) },
4821     { VEX_LEN_TABLE (VEX_LEN_0F5F_P_3) },
4822   },
4823
4824   /* PREFIX_VEX_0F60 */
4825   {
4826     { Bad_Opcode },
4827     { Bad_Opcode },
4828     { VEX_W_TABLE (VEX_W_0F60_P_2) },
4829   },
4830
4831   /* PREFIX_VEX_0F61 */
4832   {
4833     { Bad_Opcode },
4834     { Bad_Opcode },
4835     { VEX_W_TABLE (VEX_W_0F61_P_2) },
4836   },
4837
4838   /* PREFIX_VEX_0F62 */
4839   {
4840     { Bad_Opcode },
4841     { Bad_Opcode },
4842     { VEX_W_TABLE (VEX_W_0F62_P_2) },
4843   },
4844
4845   /* PREFIX_VEX_0F63 */
4846   {
4847     { Bad_Opcode },
4848     { Bad_Opcode },
4849     { VEX_W_TABLE (VEX_W_0F63_P_2) },
4850   },
4851
4852   /* PREFIX_VEX_0F64 */
4853   {
4854     { Bad_Opcode },
4855     { Bad_Opcode },
4856     { VEX_W_TABLE (VEX_W_0F64_P_2) },
4857   },
4858
4859   /* PREFIX_VEX_0F65 */
4860   {
4861     { Bad_Opcode },
4862     { Bad_Opcode },
4863     { VEX_W_TABLE (VEX_W_0F65_P_2) },
4864   },
4865
4866   /* PREFIX_VEX_0F66 */
4867   {
4868     { Bad_Opcode },
4869     { Bad_Opcode },
4870     { VEX_W_TABLE (VEX_W_0F66_P_2) },
4871   },
4872
4873   /* PREFIX_VEX_0F67 */
4874   {
4875     { Bad_Opcode },
4876     { Bad_Opcode },
4877     { VEX_W_TABLE (VEX_W_0F67_P_2) },
4878   },
4879
4880   /* PREFIX_VEX_0F68 */
4881   {
4882     { Bad_Opcode },
4883     { Bad_Opcode },
4884     { VEX_W_TABLE (VEX_W_0F68_P_2) },
4885   },
4886
4887   /* PREFIX_VEX_0F69 */
4888   {
4889     { Bad_Opcode },
4890     { Bad_Opcode },
4891     { VEX_W_TABLE (VEX_W_0F69_P_2) },
4892   },
4893
4894   /* PREFIX_VEX_0F6A */
4895   {
4896     { Bad_Opcode },
4897     { Bad_Opcode },
4898     { VEX_W_TABLE (VEX_W_0F6A_P_2) },
4899   },
4900
4901   /* PREFIX_VEX_0F6B */
4902   {
4903     { Bad_Opcode },
4904     { Bad_Opcode },
4905     { VEX_W_TABLE (VEX_W_0F6B_P_2) },
4906   },
4907
4908   /* PREFIX_VEX_0F6C */
4909   {
4910     { Bad_Opcode },
4911     { Bad_Opcode },
4912     { VEX_W_TABLE (VEX_W_0F6C_P_2) },
4913   },
4914
4915   /* PREFIX_VEX_0F6D */
4916   {
4917     { Bad_Opcode },
4918     { Bad_Opcode },
4919     { VEX_W_TABLE (VEX_W_0F6D_P_2) },
4920   },
4921
4922   /* PREFIX_VEX_0F6E */
4923   {
4924     { Bad_Opcode },
4925     { Bad_Opcode },
4926     { VEX_LEN_TABLE (VEX_LEN_0F6E_P_2) },
4927   },
4928
4929   /* PREFIX_VEX_0F6F */
4930   {
4931     { Bad_Opcode },
4932     { VEX_W_TABLE (VEX_W_0F6F_P_1) },
4933     { VEX_W_TABLE (VEX_W_0F6F_P_2) },
4934   },
4935
4936   /* PREFIX_VEX_0F70 */
4937   {
4938     { Bad_Opcode },
4939     { VEX_W_TABLE (VEX_W_0F70_P_1) },
4940     { VEX_W_TABLE (VEX_W_0F70_P_2) },
4941     { VEX_W_TABLE (VEX_W_0F70_P_3) },
4942   },
4943
4944   /* PREFIX_VEX_0F71_REG_2 */
4945   {
4946     { Bad_Opcode },
4947     { Bad_Opcode },
4948     { VEX_W_TABLE (VEX_W_0F71_R_2_P_2) },
4949   },
4950
4951   /* PREFIX_VEX_0F71_REG_4 */
4952   {
4953     { Bad_Opcode },
4954     { Bad_Opcode },
4955     { VEX_W_TABLE (VEX_W_0F71_R_4_P_2) },
4956   },
4957
4958   /* PREFIX_VEX_0F71_REG_6 */
4959   {
4960     { Bad_Opcode },
4961     { Bad_Opcode },
4962     { VEX_W_TABLE (VEX_W_0F71_R_6_P_2) },
4963   },
4964
4965   /* PREFIX_VEX_0F72_REG_2 */
4966   {
4967     { Bad_Opcode },
4968     { Bad_Opcode },
4969     { VEX_W_TABLE (VEX_W_0F72_R_2_P_2) },
4970   },
4971
4972   /* PREFIX_VEX_0F72_REG_4 */
4973   {
4974     { Bad_Opcode },
4975     { Bad_Opcode },
4976     { VEX_W_TABLE (VEX_W_0F72_R_4_P_2) },
4977   },
4978
4979   /* PREFIX_VEX_0F72_REG_6 */
4980   {
4981     { Bad_Opcode },
4982     { Bad_Opcode },
4983     { VEX_W_TABLE (VEX_W_0F72_R_6_P_2) },
4984   },
4985
4986   /* PREFIX_VEX_0F73_REG_2 */
4987   {
4988     { Bad_Opcode },
4989     { Bad_Opcode },
4990     { VEX_W_TABLE (VEX_W_0F73_R_2_P_2) },
4991   },
4992
4993   /* PREFIX_VEX_0F73_REG_3 */
4994   {
4995     { Bad_Opcode },
4996     { Bad_Opcode },
4997     { VEX_W_TABLE (VEX_W_0F73_R_3_P_2) },
4998   },
4999
5000   /* PREFIX_VEX_0F73_REG_6 */
5001   {
5002     { Bad_Opcode },
5003     { Bad_Opcode },
5004     { VEX_W_TABLE (VEX_W_0F73_R_6_P_2) },
5005   },
5006
5007   /* PREFIX_VEX_0F73_REG_7 */
5008   {
5009     { Bad_Opcode },
5010     { Bad_Opcode },
5011     { VEX_W_TABLE (VEX_W_0F73_R_7_P_2) },
5012   },
5013
5014   /* PREFIX_VEX_0F74 */
5015   {
5016     { Bad_Opcode },
5017     { Bad_Opcode },
5018     { VEX_W_TABLE (VEX_W_0F74_P_2) },
5019   },
5020
5021   /* PREFIX_VEX_0F75 */
5022   {
5023     { Bad_Opcode },
5024     { Bad_Opcode },
5025     { VEX_W_TABLE (VEX_W_0F75_P_2) },
5026   },
5027
5028   /* PREFIX_VEX_0F76 */
5029   {
5030     { Bad_Opcode },
5031     { Bad_Opcode },
5032     { VEX_W_TABLE (VEX_W_0F76_P_2) },
5033   },
5034
5035   /* PREFIX_VEX_0F77 */
5036   {
5037     { VEX_W_TABLE (VEX_W_0F77_P_0) },
5038   },
5039
5040   /* PREFIX_VEX_0F7C */
5041   {
5042     { Bad_Opcode },
5043     { Bad_Opcode },
5044     { VEX_W_TABLE (VEX_W_0F7C_P_2) },
5045     { VEX_W_TABLE (VEX_W_0F7C_P_3) },
5046   },
5047
5048   /* PREFIX_VEX_0F7D */
5049   {
5050     { Bad_Opcode },
5051     { Bad_Opcode },
5052     { VEX_W_TABLE (VEX_W_0F7D_P_2) },
5053     { VEX_W_TABLE (VEX_W_0F7D_P_3) },
5054   },
5055
5056   /* PREFIX_VEX_0F7E */
5057   {
5058     { Bad_Opcode },
5059     { VEX_LEN_TABLE (VEX_LEN_0F7E_P_1) },
5060     { VEX_LEN_TABLE (VEX_LEN_0F7E_P_2) },
5061   },
5062
5063   /* PREFIX_VEX_0F7F */
5064   {
5065     { Bad_Opcode },
5066     { VEX_W_TABLE (VEX_W_0F7F_P_1) },
5067     { VEX_W_TABLE (VEX_W_0F7F_P_2) },
5068   },
5069
5070   /* PREFIX_VEX_0F90 */
5071   {
5072     { VEX_LEN_TABLE (VEX_LEN_0F90_P_0) },
5073     { Bad_Opcode },
5074     { VEX_LEN_TABLE (VEX_LEN_0F90_P_2) },
5075   },
5076
5077   /* PREFIX_VEX_0F91 */
5078   {
5079     { VEX_LEN_TABLE (VEX_LEN_0F91_P_0) },
5080     { Bad_Opcode },
5081     { VEX_LEN_TABLE (VEX_LEN_0F91_P_2) },
5082   },
5083
5084   /* PREFIX_VEX_0F92 */
5085   {
5086     { VEX_LEN_TABLE (VEX_LEN_0F92_P_0) },
5087     { Bad_Opcode },
5088     { VEX_LEN_TABLE (VEX_LEN_0F92_P_2) },
5089     { VEX_LEN_TABLE (VEX_LEN_0F92_P_3) },
5090   },
5091
5092   /* PREFIX_VEX_0F93 */
5093   {
5094     { VEX_LEN_TABLE (VEX_LEN_0F93_P_0) },
5095     { Bad_Opcode },
5096     { VEX_LEN_TABLE (VEX_LEN_0F93_P_2) },
5097     { VEX_LEN_TABLE (VEX_LEN_0F93_P_3) },
5098   },
5099
5100   /* PREFIX_VEX_0F98 */
5101   {
5102     { VEX_LEN_TABLE (VEX_LEN_0F98_P_0) },
5103     { Bad_Opcode },
5104     { VEX_LEN_TABLE (VEX_LEN_0F98_P_2) },
5105   },
5106
5107   /* PREFIX_VEX_0F99 */
5108   {
5109     { VEX_LEN_TABLE (VEX_LEN_0F99_P_0) },
5110     { Bad_Opcode },
5111     { VEX_LEN_TABLE (VEX_LEN_0F99_P_2) },
5112   },
5113
5114   /* PREFIX_VEX_0FC2 */
5115   {
5116     { VEX_W_TABLE (VEX_W_0FC2_P_0) },
5117     { VEX_LEN_TABLE (VEX_LEN_0FC2_P_1) },
5118     { VEX_W_TABLE (VEX_W_0FC2_P_2) },
5119     { VEX_LEN_TABLE (VEX_LEN_0FC2_P_3) },
5120   },
5121
5122   /* PREFIX_VEX_0FC4 */
5123   {
5124     { Bad_Opcode },
5125     { Bad_Opcode },
5126     { VEX_LEN_TABLE (VEX_LEN_0FC4_P_2) },
5127   },
5128
5129   /* PREFIX_VEX_0FC5 */
5130   {
5131     { Bad_Opcode },
5132     { Bad_Opcode },
5133     { VEX_LEN_TABLE (VEX_LEN_0FC5_P_2) },
5134   },
5135
5136   /* PREFIX_VEX_0FD0 */
5137   {
5138     { Bad_Opcode },
5139     { Bad_Opcode },
5140     { VEX_W_TABLE (VEX_W_0FD0_P_2) },
5141     { VEX_W_TABLE (VEX_W_0FD0_P_3) },
5142   },
5143
5144   /* PREFIX_VEX_0FD1 */
5145   {
5146     { Bad_Opcode },
5147     { Bad_Opcode },
5148     { VEX_W_TABLE (VEX_W_0FD1_P_2) },
5149   },
5150
5151   /* PREFIX_VEX_0FD2 */
5152   {
5153     { Bad_Opcode },
5154     { Bad_Opcode },
5155     { VEX_W_TABLE (VEX_W_0FD2_P_2) },
5156   },
5157
5158   /* PREFIX_VEX_0FD3 */
5159   {
5160     { Bad_Opcode },
5161     { Bad_Opcode },
5162     { VEX_W_TABLE (VEX_W_0FD3_P_2) },
5163   },
5164
5165   /* PREFIX_VEX_0FD4 */
5166   {
5167     { Bad_Opcode },
5168     { Bad_Opcode },
5169     { VEX_W_TABLE (VEX_W_0FD4_P_2) },
5170   },
5171
5172   /* PREFIX_VEX_0FD5 */
5173   {
5174     { Bad_Opcode },
5175     { Bad_Opcode },
5176     { VEX_W_TABLE (VEX_W_0FD5_P_2) },
5177   },
5178
5179   /* PREFIX_VEX_0FD6 */
5180   {
5181     { Bad_Opcode },
5182     { Bad_Opcode },
5183     { VEX_LEN_TABLE (VEX_LEN_0FD6_P_2) },
5184   },
5185
5186   /* PREFIX_VEX_0FD7 */
5187   {
5188     { Bad_Opcode },
5189     { Bad_Opcode },
5190     { MOD_TABLE (MOD_VEX_0FD7_PREFIX_2) },
5191   },
5192
5193   /* PREFIX_VEX_0FD8 */
5194   {
5195     { Bad_Opcode },
5196     { Bad_Opcode },
5197     { VEX_W_TABLE (VEX_W_0FD8_P_2) },
5198   },
5199
5200   /* PREFIX_VEX_0FD9 */
5201   {
5202     { Bad_Opcode },
5203     { Bad_Opcode },
5204     { VEX_W_TABLE (VEX_W_0FD9_P_2) },
5205   },
5206
5207   /* PREFIX_VEX_0FDA */
5208   {
5209     { Bad_Opcode },
5210     { Bad_Opcode },
5211     { VEX_W_TABLE (VEX_W_0FDA_P_2) },
5212   },
5213
5214   /* PREFIX_VEX_0FDB */
5215   {
5216     { Bad_Opcode },
5217     { Bad_Opcode },
5218     { VEX_W_TABLE (VEX_W_0FDB_P_2) },
5219   },
5220
5221   /* PREFIX_VEX_0FDC */
5222   {
5223     { Bad_Opcode },
5224     { Bad_Opcode },
5225     { VEX_W_TABLE (VEX_W_0FDC_P_2) },
5226   },
5227
5228   /* PREFIX_VEX_0FDD */
5229   {
5230     { Bad_Opcode },
5231     { Bad_Opcode },
5232     { VEX_W_TABLE (VEX_W_0FDD_P_2) },
5233   },
5234
5235   /* PREFIX_VEX_0FDE */
5236   {
5237     { Bad_Opcode },
5238     { Bad_Opcode },
5239     { VEX_W_TABLE (VEX_W_0FDE_P_2) },
5240   },
5241
5242   /* PREFIX_VEX_0FDF */
5243   {
5244     { Bad_Opcode },
5245     { Bad_Opcode },
5246     { VEX_W_TABLE (VEX_W_0FDF_P_2) },
5247   },
5248
5249   /* PREFIX_VEX_0FE0 */
5250   {
5251     { Bad_Opcode },
5252     { Bad_Opcode },
5253     { VEX_W_TABLE (VEX_W_0FE0_P_2) },
5254   },
5255
5256   /* PREFIX_VEX_0FE1 */
5257   {
5258     { Bad_Opcode },
5259     { Bad_Opcode },
5260     { VEX_W_TABLE (VEX_W_0FE1_P_2) },
5261   },
5262
5263   /* PREFIX_VEX_0FE2 */
5264   {
5265     { Bad_Opcode },
5266     { Bad_Opcode },
5267     { VEX_W_TABLE (VEX_W_0FE2_P_2) },
5268   },
5269
5270   /* PREFIX_VEX_0FE3 */
5271   {
5272     { Bad_Opcode },
5273     { Bad_Opcode },
5274     { VEX_W_TABLE (VEX_W_0FE3_P_2) },
5275   },
5276
5277   /* PREFIX_VEX_0FE4 */
5278   {
5279     { Bad_Opcode },
5280     { Bad_Opcode },
5281     { VEX_W_TABLE (VEX_W_0FE4_P_2) },
5282   },
5283
5284   /* PREFIX_VEX_0FE5 */
5285   {
5286     { Bad_Opcode },
5287     { Bad_Opcode },
5288     { VEX_W_TABLE (VEX_W_0FE5_P_2) },
5289   },
5290
5291   /* PREFIX_VEX_0FE6 */
5292   {
5293     { Bad_Opcode },
5294     { VEX_W_TABLE (VEX_W_0FE6_P_1) },
5295     { VEX_W_TABLE (VEX_W_0FE6_P_2) },
5296     { VEX_W_TABLE (VEX_W_0FE6_P_3) },
5297   },
5298
5299   /* PREFIX_VEX_0FE7 */
5300   {
5301     { Bad_Opcode },
5302     { Bad_Opcode },
5303     { MOD_TABLE (MOD_VEX_0FE7_PREFIX_2) },
5304   },
5305
5306   /* PREFIX_VEX_0FE8 */
5307   {
5308     { Bad_Opcode },
5309     { Bad_Opcode },
5310     { VEX_W_TABLE (VEX_W_0FE8_P_2) },
5311   },
5312
5313   /* PREFIX_VEX_0FE9 */
5314   {
5315     { Bad_Opcode },
5316     { Bad_Opcode },
5317     { VEX_W_TABLE (VEX_W_0FE9_P_2) },
5318   },
5319
5320   /* PREFIX_VEX_0FEA */
5321   {
5322     { Bad_Opcode },
5323     { Bad_Opcode },
5324     { VEX_W_TABLE (VEX_W_0FEA_P_2) },
5325   },
5326
5327   /* PREFIX_VEX_0FEB */
5328   {
5329     { Bad_Opcode },
5330     { Bad_Opcode },
5331     { VEX_W_TABLE (VEX_W_0FEB_P_2) },
5332   },
5333
5334   /* PREFIX_VEX_0FEC */
5335   {
5336     { Bad_Opcode },
5337     { Bad_Opcode },
5338     { VEX_W_TABLE (VEX_W_0FEC_P_2) },
5339   },
5340
5341   /* PREFIX_VEX_0FED */
5342   {
5343     { Bad_Opcode },
5344     { Bad_Opcode },
5345     { VEX_W_TABLE (VEX_W_0FED_P_2) },
5346   },
5347
5348   /* PREFIX_VEX_0FEE */
5349   {
5350     { Bad_Opcode },
5351     { Bad_Opcode },
5352     { VEX_W_TABLE (VEX_W_0FEE_P_2) },
5353   },
5354
5355   /* PREFIX_VEX_0FEF */
5356   {
5357     { Bad_Opcode },
5358     { Bad_Opcode },
5359     { VEX_W_TABLE (VEX_W_0FEF_P_2) },
5360   },
5361
5362   /* PREFIX_VEX_0FF0 */
5363   {
5364     { Bad_Opcode },
5365     { Bad_Opcode },
5366     { Bad_Opcode },
5367     { MOD_TABLE (MOD_VEX_0FF0_PREFIX_3) },
5368   },
5369
5370   /* PREFIX_VEX_0FF1 */
5371   {
5372     { Bad_Opcode },
5373     { Bad_Opcode },
5374     { VEX_W_TABLE (VEX_W_0FF1_P_2) },
5375   },
5376
5377   /* PREFIX_VEX_0FF2 */
5378   {
5379     { Bad_Opcode },
5380     { Bad_Opcode },
5381     { VEX_W_TABLE (VEX_W_0FF2_P_2) },
5382   },
5383
5384   /* PREFIX_VEX_0FF3 */
5385   {
5386     { Bad_Opcode },
5387     { Bad_Opcode },
5388     { VEX_W_TABLE (VEX_W_0FF3_P_2) },
5389   },
5390
5391   /* PREFIX_VEX_0FF4 */
5392   {
5393     { Bad_Opcode },
5394     { Bad_Opcode },
5395     { VEX_W_TABLE (VEX_W_0FF4_P_2) },
5396   },
5397
5398   /* PREFIX_VEX_0FF5 */
5399   {
5400     { Bad_Opcode },
5401     { Bad_Opcode },
5402     { VEX_W_TABLE (VEX_W_0FF5_P_2) },
5403   },
5404
5405   /* PREFIX_VEX_0FF6 */
5406   {
5407     { Bad_Opcode },
5408     { Bad_Opcode },
5409     { VEX_W_TABLE (VEX_W_0FF6_P_2) },
5410   },
5411
5412   /* PREFIX_VEX_0FF7 */
5413   {
5414     { Bad_Opcode },
5415     { Bad_Opcode },
5416     { VEX_LEN_TABLE (VEX_LEN_0FF7_P_2) },
5417   },
5418
5419   /* PREFIX_VEX_0FF8 */
5420   {
5421     { Bad_Opcode },
5422     { Bad_Opcode },
5423     { VEX_W_TABLE (VEX_W_0FF8_P_2) },
5424   },
5425
5426   /* PREFIX_VEX_0FF9 */
5427   {
5428     { Bad_Opcode },
5429     { Bad_Opcode },
5430     { VEX_W_TABLE (VEX_W_0FF9_P_2) },
5431   },
5432
5433   /* PREFIX_VEX_0FFA */
5434   {
5435     { Bad_Opcode },
5436     { Bad_Opcode },
5437     { VEX_W_TABLE (VEX_W_0FFA_P_2) },
5438   },
5439
5440   /* PREFIX_VEX_0FFB */
5441   {
5442     { Bad_Opcode },
5443     { Bad_Opcode },
5444     { VEX_W_TABLE (VEX_W_0FFB_P_2) },
5445   },
5446
5447   /* PREFIX_VEX_0FFC */
5448   {
5449     { Bad_Opcode },
5450     { Bad_Opcode },
5451     { VEX_W_TABLE (VEX_W_0FFC_P_2) },
5452   },
5453
5454   /* PREFIX_VEX_0FFD */
5455   {
5456     { Bad_Opcode },
5457     { Bad_Opcode },
5458     { VEX_W_TABLE (VEX_W_0FFD_P_2) },
5459   },
5460
5461   /* PREFIX_VEX_0FFE */
5462   {
5463     { Bad_Opcode },
5464     { Bad_Opcode },
5465     { VEX_W_TABLE (VEX_W_0FFE_P_2) },
5466   },
5467
5468   /* PREFIX_VEX_0F3800 */
5469   {
5470     { Bad_Opcode },
5471     { Bad_Opcode },
5472     { VEX_W_TABLE (VEX_W_0F3800_P_2) },
5473   },
5474
5475   /* PREFIX_VEX_0F3801 */
5476   {
5477     { Bad_Opcode },
5478     { Bad_Opcode },
5479     { VEX_W_TABLE (VEX_W_0F3801_P_2) },
5480   },
5481
5482   /* PREFIX_VEX_0F3802 */
5483   {
5484     { Bad_Opcode },
5485     { Bad_Opcode },
5486     { VEX_W_TABLE (VEX_W_0F3802_P_2) },
5487   },
5488
5489   /* PREFIX_VEX_0F3803 */
5490   {
5491     { Bad_Opcode },
5492     { Bad_Opcode },
5493     { VEX_W_TABLE (VEX_W_0F3803_P_2) },
5494   },
5495
5496   /* PREFIX_VEX_0F3804 */
5497   {
5498     { Bad_Opcode },
5499     { Bad_Opcode },
5500     { VEX_W_TABLE (VEX_W_0F3804_P_2) },
5501   },
5502
5503   /* PREFIX_VEX_0F3805 */
5504   {
5505     { Bad_Opcode },
5506     { Bad_Opcode },
5507     { VEX_W_TABLE (VEX_W_0F3805_P_2) },
5508   },
5509
5510   /* PREFIX_VEX_0F3806 */
5511   {
5512     { Bad_Opcode },
5513     { Bad_Opcode },
5514     { VEX_W_TABLE (VEX_W_0F3806_P_2) },
5515   },
5516
5517   /* PREFIX_VEX_0F3807 */
5518   {
5519     { Bad_Opcode },
5520     { Bad_Opcode },
5521     { VEX_W_TABLE (VEX_W_0F3807_P_2) },
5522   },
5523
5524   /* PREFIX_VEX_0F3808 */
5525   {
5526     { Bad_Opcode },
5527     { Bad_Opcode },
5528     { VEX_W_TABLE (VEX_W_0F3808_P_2) },
5529   },
5530
5531   /* PREFIX_VEX_0F3809 */
5532   {
5533     { Bad_Opcode },
5534     { Bad_Opcode },
5535     { VEX_W_TABLE (VEX_W_0F3809_P_2) },
5536   },
5537
5538   /* PREFIX_VEX_0F380A */
5539   {
5540     { Bad_Opcode },
5541     { Bad_Opcode },
5542     { VEX_W_TABLE (VEX_W_0F380A_P_2) },
5543   },
5544
5545   /* PREFIX_VEX_0F380B */
5546   {
5547     { Bad_Opcode },
5548     { Bad_Opcode },
5549     { VEX_W_TABLE (VEX_W_0F380B_P_2) },
5550   },
5551
5552   /* PREFIX_VEX_0F380C */
5553   {
5554     { Bad_Opcode },
5555     { Bad_Opcode },
5556     { VEX_W_TABLE (VEX_W_0F380C_P_2) },
5557   },
5558
5559   /* PREFIX_VEX_0F380D */
5560   {
5561     { Bad_Opcode },
5562     { Bad_Opcode },
5563     { VEX_W_TABLE (VEX_W_0F380D_P_2) },
5564   },
5565
5566   /* PREFIX_VEX_0F380E */
5567   {
5568     { Bad_Opcode },
5569     { Bad_Opcode },
5570     { VEX_W_TABLE (VEX_W_0F380E_P_2) },
5571   },
5572
5573   /* PREFIX_VEX_0F380F */
5574   {
5575     { Bad_Opcode },
5576     { Bad_Opcode },
5577     { VEX_W_TABLE (VEX_W_0F380F_P_2) },
5578   },
5579
5580   /* PREFIX_VEX_0F3813 */
5581   {
5582     { Bad_Opcode },
5583     { Bad_Opcode },
5584     { "vcvtph2ps", { XM, EXxmmq }, 0 },
5585   },
5586
5587   /* PREFIX_VEX_0F3816 */
5588   {
5589     { Bad_Opcode },
5590     { Bad_Opcode },
5591     { VEX_LEN_TABLE (VEX_LEN_0F3816_P_2) },
5592   },
5593
5594   /* PREFIX_VEX_0F3817 */
5595   {
5596     { Bad_Opcode },
5597     { Bad_Opcode },
5598     { VEX_W_TABLE (VEX_W_0F3817_P_2) },
5599   },
5600
5601   /* PREFIX_VEX_0F3818 */
5602   {
5603     { Bad_Opcode },
5604     { Bad_Opcode },
5605     { VEX_W_TABLE (VEX_W_0F3818_P_2) },
5606   },
5607
5608   /* PREFIX_VEX_0F3819 */
5609   {
5610     { Bad_Opcode },
5611     { Bad_Opcode },
5612     { VEX_LEN_TABLE (VEX_LEN_0F3819_P_2) },
5613   },
5614
5615   /* PREFIX_VEX_0F381A */
5616   {
5617     { Bad_Opcode },
5618     { Bad_Opcode },
5619     { MOD_TABLE (MOD_VEX_0F381A_PREFIX_2) },
5620   },
5621
5622   /* PREFIX_VEX_0F381C */
5623   {
5624     { Bad_Opcode },
5625     { Bad_Opcode },
5626     { VEX_W_TABLE (VEX_W_0F381C_P_2) },
5627   },
5628
5629   /* PREFIX_VEX_0F381D */
5630   {
5631     { Bad_Opcode },
5632     { Bad_Opcode },
5633     { VEX_W_TABLE (VEX_W_0F381D_P_2) },
5634   },
5635
5636   /* PREFIX_VEX_0F381E */
5637   {
5638     { Bad_Opcode },
5639     { Bad_Opcode },
5640     { VEX_W_TABLE (VEX_W_0F381E_P_2) },
5641   },
5642
5643   /* PREFIX_VEX_0F3820 */
5644   {
5645     { Bad_Opcode },
5646     { Bad_Opcode },
5647     { VEX_W_TABLE (VEX_W_0F3820_P_2) },
5648   },
5649
5650   /* PREFIX_VEX_0F3821 */
5651   {
5652     { Bad_Opcode },
5653     { Bad_Opcode },
5654     { VEX_W_TABLE (VEX_W_0F3821_P_2) },
5655   },
5656
5657   /* PREFIX_VEX_0F3822 */
5658   {
5659     { Bad_Opcode },
5660     { Bad_Opcode },
5661     { VEX_W_TABLE (VEX_W_0F3822_P_2) },
5662   },
5663
5664   /* PREFIX_VEX_0F3823 */
5665   {
5666     { Bad_Opcode },
5667     { Bad_Opcode },
5668     { VEX_W_TABLE (VEX_W_0F3823_P_2) },
5669   },
5670
5671   /* PREFIX_VEX_0F3824 */
5672   {
5673     { Bad_Opcode },
5674     { Bad_Opcode },
5675     { VEX_W_TABLE (VEX_W_0F3824_P_2) },
5676   },
5677
5678   /* PREFIX_VEX_0F3825 */
5679   {
5680     { Bad_Opcode },
5681     { Bad_Opcode },
5682     { VEX_W_TABLE (VEX_W_0F3825_P_2) },
5683   },
5684
5685   /* PREFIX_VEX_0F3828 */
5686   {
5687     { Bad_Opcode },
5688     { Bad_Opcode },
5689     { VEX_W_TABLE (VEX_W_0F3828_P_2) },
5690   },
5691
5692   /* PREFIX_VEX_0F3829 */
5693   {
5694     { Bad_Opcode },
5695     { Bad_Opcode },
5696     { VEX_W_TABLE (VEX_W_0F3829_P_2) },
5697   },
5698
5699   /* PREFIX_VEX_0F382A */
5700   {
5701     { Bad_Opcode },
5702     { Bad_Opcode },
5703     { MOD_TABLE (MOD_VEX_0F382A_PREFIX_2) },
5704   },
5705
5706   /* PREFIX_VEX_0F382B */
5707   {
5708     { Bad_Opcode },
5709     { Bad_Opcode },
5710     { VEX_W_TABLE (VEX_W_0F382B_P_2) },
5711   },
5712
5713   /* PREFIX_VEX_0F382C */
5714   {
5715     { Bad_Opcode },
5716     { Bad_Opcode },
5717      { MOD_TABLE (MOD_VEX_0F382C_PREFIX_2) },
5718   },
5719
5720   /* PREFIX_VEX_0F382D */
5721   {
5722     { Bad_Opcode },
5723     { Bad_Opcode },
5724      { MOD_TABLE (MOD_VEX_0F382D_PREFIX_2) },
5725   },
5726
5727   /* PREFIX_VEX_0F382E */
5728   {
5729     { Bad_Opcode },
5730     { Bad_Opcode },
5731      { MOD_TABLE (MOD_VEX_0F382E_PREFIX_2) },
5732   },
5733
5734   /* PREFIX_VEX_0F382F */
5735   {
5736     { Bad_Opcode },
5737     { Bad_Opcode },
5738      { MOD_TABLE (MOD_VEX_0F382F_PREFIX_2) },
5739   },
5740
5741   /* PREFIX_VEX_0F3830 */
5742   {
5743     { Bad_Opcode },
5744     { Bad_Opcode },
5745     { VEX_W_TABLE (VEX_W_0F3830_P_2) },
5746   },
5747
5748   /* PREFIX_VEX_0F3831 */
5749   {
5750     { Bad_Opcode },
5751     { Bad_Opcode },
5752     { VEX_W_TABLE (VEX_W_0F3831_P_2) },
5753   },
5754
5755   /* PREFIX_VEX_0F3832 */
5756   {
5757     { Bad_Opcode },
5758     { Bad_Opcode },
5759     { VEX_W_TABLE (VEX_W_0F3832_P_2) },
5760   },
5761
5762   /* PREFIX_VEX_0F3833 */
5763   {
5764     { Bad_Opcode },
5765     { Bad_Opcode },
5766     { VEX_W_TABLE (VEX_W_0F3833_P_2) },
5767   },
5768
5769   /* PREFIX_VEX_0F3834 */
5770   {
5771     { Bad_Opcode },
5772     { Bad_Opcode },
5773     { VEX_W_TABLE (VEX_W_0F3834_P_2) },
5774   },
5775
5776   /* PREFIX_VEX_0F3835 */
5777   {
5778     { Bad_Opcode },
5779     { Bad_Opcode },
5780     { VEX_W_TABLE (VEX_W_0F3835_P_2) },
5781   },
5782
5783   /* PREFIX_VEX_0F3836 */
5784   {
5785     { Bad_Opcode },
5786     { Bad_Opcode },
5787     { VEX_LEN_TABLE (VEX_LEN_0F3836_P_2) },
5788   },
5789
5790   /* PREFIX_VEX_0F3837 */
5791   {
5792     { Bad_Opcode },
5793     { Bad_Opcode },
5794     { VEX_W_TABLE (VEX_W_0F3837_P_2) },
5795   },
5796
5797   /* PREFIX_VEX_0F3838 */
5798   {
5799     { Bad_Opcode },
5800     { Bad_Opcode },
5801     { VEX_W_TABLE (VEX_W_0F3838_P_2) },
5802   },
5803
5804   /* PREFIX_VEX_0F3839 */
5805   {
5806     { Bad_Opcode },
5807     { Bad_Opcode },
5808     { VEX_W_TABLE (VEX_W_0F3839_P_2) },
5809   },
5810
5811   /* PREFIX_VEX_0F383A */
5812   {
5813     { Bad_Opcode },
5814     { Bad_Opcode },
5815     { VEX_W_TABLE (VEX_W_0F383A_P_2) },
5816   },
5817
5818   /* PREFIX_VEX_0F383B */
5819   {
5820     { Bad_Opcode },
5821     { Bad_Opcode },
5822     { VEX_W_TABLE (VEX_W_0F383B_P_2) },
5823   },
5824
5825   /* PREFIX_VEX_0F383C */
5826   {
5827     { Bad_Opcode },
5828     { Bad_Opcode },
5829     { VEX_W_TABLE (VEX_W_0F383C_P_2) },
5830   },
5831
5832   /* PREFIX_VEX_0F383D */
5833   {
5834     { Bad_Opcode },
5835     { Bad_Opcode },
5836     { VEX_W_TABLE (VEX_W_0F383D_P_2) },
5837   },
5838
5839   /* PREFIX_VEX_0F383E */
5840   {
5841     { Bad_Opcode },
5842     { Bad_Opcode },
5843     { VEX_W_TABLE (VEX_W_0F383E_P_2) },
5844   },
5845
5846   /* PREFIX_VEX_0F383F */
5847   {
5848     { Bad_Opcode },
5849     { Bad_Opcode },
5850     { VEX_W_TABLE (VEX_W_0F383F_P_2) },
5851   },
5852
5853   /* PREFIX_VEX_0F3840 */
5854   {
5855     { Bad_Opcode },
5856     { Bad_Opcode },
5857     { VEX_W_TABLE (VEX_W_0F3840_P_2) },
5858   },
5859
5860   /* PREFIX_VEX_0F3841 */
5861   {
5862     { Bad_Opcode },
5863     { Bad_Opcode },
5864     { VEX_LEN_TABLE (VEX_LEN_0F3841_P_2) },
5865   },
5866
5867   /* PREFIX_VEX_0F3845 */
5868   {
5869     { Bad_Opcode },
5870     { Bad_Opcode },
5871     { "vpsrlv%LW", { XM, Vex, EXx }, 0 },
5872   },
5873
5874   /* PREFIX_VEX_0F3846 */
5875   {
5876     { Bad_Opcode },
5877     { Bad_Opcode },
5878     { VEX_W_TABLE (VEX_W_0F3846_P_2) },
5879   },
5880
5881   /* PREFIX_VEX_0F3847 */
5882   {
5883     { Bad_Opcode },
5884     { Bad_Opcode },
5885     { "vpsllv%LW", { XM, Vex, EXx }, 0 },
5886   },
5887
5888   /* PREFIX_VEX_0F3858 */
5889   {
5890     { Bad_Opcode },
5891     { Bad_Opcode },
5892     { VEX_W_TABLE (VEX_W_0F3858_P_2) },
5893   },
5894
5895   /* PREFIX_VEX_0F3859 */
5896   {
5897     { Bad_Opcode },
5898     { Bad_Opcode },
5899     { VEX_W_TABLE (VEX_W_0F3859_P_2) },
5900   },
5901
5902   /* PREFIX_VEX_0F385A */
5903   {
5904     { Bad_Opcode },
5905     { Bad_Opcode },
5906     { MOD_TABLE (MOD_VEX_0F385A_PREFIX_2) },
5907   },
5908
5909   /* PREFIX_VEX_0F3878 */
5910   {
5911     { Bad_Opcode },
5912     { Bad_Opcode },
5913     { VEX_W_TABLE (VEX_W_0F3878_P_2) },
5914   },
5915
5916   /* PREFIX_VEX_0F3879 */
5917   {
5918     { Bad_Opcode },
5919     { Bad_Opcode },
5920     { VEX_W_TABLE (VEX_W_0F3879_P_2) },
5921   },
5922
5923   /* PREFIX_VEX_0F388C */
5924   {
5925     { Bad_Opcode },
5926     { Bad_Opcode },
5927     { MOD_TABLE (MOD_VEX_0F388C_PREFIX_2) },
5928   },
5929
5930   /* PREFIX_VEX_0F388E */
5931   {
5932     { Bad_Opcode },
5933     { Bad_Opcode },
5934     { MOD_TABLE (MOD_VEX_0F388E_PREFIX_2) },
5935   },
5936
5937   /* PREFIX_VEX_0F3890 */
5938   {
5939     { Bad_Opcode },
5940     { Bad_Opcode },
5941     { "vpgatherd%LW", { XM, MVexVSIBDWpX, Vex }, 0 },
5942   },
5943
5944   /* PREFIX_VEX_0F3891 */
5945   {
5946     { Bad_Opcode },
5947     { Bad_Opcode },
5948     { "vpgatherq%LW", { XMGatherQ, MVexVSIBQWpX, VexGatherQ }, 0 },
5949   },
5950
5951   /* PREFIX_VEX_0F3892 */
5952   {
5953     { Bad_Opcode },
5954     { Bad_Opcode },
5955     { "vgatherdp%XW", { XM, MVexVSIBDWpX, Vex }, 0 },
5956   },
5957
5958   /* PREFIX_VEX_0F3893 */
5959   {
5960     { Bad_Opcode },
5961     { Bad_Opcode },
5962     { "vgatherqp%XW", { XMGatherQ, MVexVSIBQWpX, VexGatherQ }, 0 },
5963   },
5964
5965   /* PREFIX_VEX_0F3896 */
5966   {
5967     { Bad_Opcode },
5968     { Bad_Opcode },
5969     { "vfmaddsub132p%XW", { XM, Vex, EXx }, 0 },
5970   },
5971
5972   /* PREFIX_VEX_0F3897 */
5973   {
5974     { Bad_Opcode },
5975     { Bad_Opcode },
5976     { "vfmsubadd132p%XW", { XM, Vex, EXx }, 0 },
5977   },
5978
5979   /* PREFIX_VEX_0F3898 */
5980   {
5981     { Bad_Opcode },
5982     { Bad_Opcode },
5983     { "vfmadd132p%XW", { XM, Vex, EXx }, 0 },
5984   },
5985
5986   /* PREFIX_VEX_0F3899 */
5987   {
5988     { Bad_Opcode },
5989     { Bad_Opcode },
5990     { "vfmadd132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
5991   },
5992
5993   /* PREFIX_VEX_0F389A */
5994   {
5995     { Bad_Opcode },
5996     { Bad_Opcode },
5997     { "vfmsub132p%XW", { XM, Vex, EXx }, 0 },
5998   },
5999
6000   /* PREFIX_VEX_0F389B */
6001   {
6002     { Bad_Opcode },
6003     { Bad_Opcode },
6004     { "vfmsub132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6005   },
6006
6007   /* PREFIX_VEX_0F389C */
6008   {
6009     { Bad_Opcode },
6010     { Bad_Opcode },
6011     { "vfnmadd132p%XW", { XM, Vex, EXx }, 0 },
6012   },
6013
6014   /* PREFIX_VEX_0F389D */
6015   {
6016     { Bad_Opcode },
6017     { Bad_Opcode },
6018     { "vfnmadd132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6019   },
6020
6021   /* PREFIX_VEX_0F389E */
6022   {
6023     { Bad_Opcode },
6024     { Bad_Opcode },
6025     { "vfnmsub132p%XW", { XM, Vex, EXx }, 0 },
6026   },
6027
6028   /* PREFIX_VEX_0F389F */
6029   {
6030     { Bad_Opcode },
6031     { Bad_Opcode },
6032     { "vfnmsub132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6033   },
6034
6035   /* PREFIX_VEX_0F38A6 */
6036   {
6037     { Bad_Opcode },
6038     { Bad_Opcode },
6039     { "vfmaddsub213p%XW", { XM, Vex, EXx }, 0 },
6040     { Bad_Opcode },
6041   },
6042
6043   /* PREFIX_VEX_0F38A7 */
6044   {
6045     { Bad_Opcode },
6046     { Bad_Opcode },
6047     { "vfmsubadd213p%XW", { XM, Vex, EXx }, 0 },
6048   },
6049
6050   /* PREFIX_VEX_0F38A8 */
6051   {
6052     { Bad_Opcode },
6053     { Bad_Opcode },
6054     { "vfmadd213p%XW", { XM, Vex, EXx }, 0 },
6055   },
6056
6057   /* PREFIX_VEX_0F38A9 */
6058   {
6059     { Bad_Opcode },
6060     { Bad_Opcode },
6061     { "vfmadd213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6062   },
6063
6064   /* PREFIX_VEX_0F38AA */
6065   {
6066     { Bad_Opcode },
6067     { Bad_Opcode },
6068     { "vfmsub213p%XW", { XM, Vex, EXx }, 0 },
6069   },
6070
6071   /* PREFIX_VEX_0F38AB */
6072   {
6073     { Bad_Opcode },
6074     { Bad_Opcode },
6075     { "vfmsub213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6076   },
6077
6078   /* PREFIX_VEX_0F38AC */
6079   {
6080     { Bad_Opcode },
6081     { Bad_Opcode },
6082     { "vfnmadd213p%XW", { XM, Vex, EXx }, 0 },
6083   },
6084
6085   /* PREFIX_VEX_0F38AD */
6086   {
6087     { Bad_Opcode },
6088     { Bad_Opcode },
6089     { "vfnmadd213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6090   },
6091
6092   /* PREFIX_VEX_0F38AE */
6093   {
6094     { Bad_Opcode },
6095     { Bad_Opcode },
6096     { "vfnmsub213p%XW", { XM, Vex, EXx }, 0 },
6097   },
6098
6099   /* PREFIX_VEX_0F38AF */
6100   {
6101     { Bad_Opcode },
6102     { Bad_Opcode },
6103     { "vfnmsub213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6104   },
6105
6106   /* PREFIX_VEX_0F38B6 */
6107   {
6108     { Bad_Opcode },
6109     { Bad_Opcode },
6110     { "vfmaddsub231p%XW", { XM, Vex, EXx }, 0 },
6111   },
6112
6113   /* PREFIX_VEX_0F38B7 */
6114   {
6115     { Bad_Opcode },
6116     { Bad_Opcode },
6117     { "vfmsubadd231p%XW", { XM, Vex, EXx }, 0 },
6118   },
6119
6120   /* PREFIX_VEX_0F38B8 */
6121   {
6122     { Bad_Opcode },
6123     { Bad_Opcode },
6124     { "vfmadd231p%XW", { XM, Vex, EXx }, 0 },
6125   },
6126
6127   /* PREFIX_VEX_0F38B9 */
6128   {
6129     { Bad_Opcode },
6130     { Bad_Opcode },
6131     { "vfmadd231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6132   },
6133
6134   /* PREFIX_VEX_0F38BA */
6135   {
6136     { Bad_Opcode },
6137     { Bad_Opcode },
6138     { "vfmsub231p%XW", { XM, Vex, EXx }, 0 },
6139   },
6140
6141   /* PREFIX_VEX_0F38BB */
6142   {
6143     { Bad_Opcode },
6144     { Bad_Opcode },
6145     { "vfmsub231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6146   },
6147
6148   /* PREFIX_VEX_0F38BC */
6149   {
6150     { Bad_Opcode },
6151     { Bad_Opcode },
6152     { "vfnmadd231p%XW", { XM, Vex, EXx }, 0 },
6153   },
6154
6155   /* PREFIX_VEX_0F38BD */
6156   {
6157     { Bad_Opcode },
6158     { Bad_Opcode },
6159     { "vfnmadd231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6160   },
6161
6162   /* PREFIX_VEX_0F38BE */
6163   {
6164     { Bad_Opcode },
6165     { Bad_Opcode },
6166     { "vfnmsub231p%XW", { XM, Vex, EXx }, 0 },
6167   },
6168
6169   /* PREFIX_VEX_0F38BF */
6170   {
6171     { Bad_Opcode },
6172     { Bad_Opcode },
6173     { "vfnmsub231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6174   },
6175
6176   /* PREFIX_VEX_0F38DB */
6177   {
6178     { Bad_Opcode },
6179     { Bad_Opcode },
6180     { VEX_LEN_TABLE (VEX_LEN_0F38DB_P_2) },
6181   },
6182
6183   /* PREFIX_VEX_0F38DC */
6184   {
6185     { Bad_Opcode },
6186     { Bad_Opcode },
6187     { VEX_LEN_TABLE (VEX_LEN_0F38DC_P_2) },
6188   },
6189
6190   /* PREFIX_VEX_0F38DD */
6191   {
6192     { Bad_Opcode },
6193     { Bad_Opcode },
6194     { VEX_LEN_TABLE (VEX_LEN_0F38DD_P_2) },
6195   },
6196
6197   /* PREFIX_VEX_0F38DE */
6198   {
6199     { Bad_Opcode },
6200     { Bad_Opcode },
6201     { VEX_LEN_TABLE (VEX_LEN_0F38DE_P_2) },
6202   },
6203
6204   /* PREFIX_VEX_0F38DF */
6205   {
6206     { Bad_Opcode },
6207     { Bad_Opcode },
6208     { VEX_LEN_TABLE (VEX_LEN_0F38DF_P_2) },
6209   },
6210
6211   /* PREFIX_VEX_0F38F2 */
6212   {
6213     { VEX_LEN_TABLE (VEX_LEN_0F38F2_P_0) },
6214   },
6215
6216   /* PREFIX_VEX_0F38F3_REG_1 */
6217   {
6218     { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_1_P_0) },
6219   },
6220
6221   /* PREFIX_VEX_0F38F3_REG_2 */
6222   {
6223     { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_2_P_0) },
6224   },
6225
6226   /* PREFIX_VEX_0F38F3_REG_3 */
6227   {
6228     { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_3_P_0) },
6229   },
6230
6231   /* PREFIX_VEX_0F38F5 */
6232   {
6233     { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_0) },
6234     { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_1) },
6235     { Bad_Opcode },
6236     { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_3) },
6237   },
6238
6239   /* PREFIX_VEX_0F38F6 */
6240   {
6241     { Bad_Opcode },
6242     { Bad_Opcode },
6243     { Bad_Opcode },
6244     { VEX_LEN_TABLE (VEX_LEN_0F38F6_P_3) },
6245   },
6246
6247   /* PREFIX_VEX_0F38F7 */
6248   {
6249     { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_0) },
6250     { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_1) },
6251     { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_2) },
6252     { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_3) },
6253   },
6254
6255   /* PREFIX_VEX_0F3A00 */
6256   {
6257     { Bad_Opcode },
6258     { Bad_Opcode },
6259     { VEX_LEN_TABLE (VEX_LEN_0F3A00_P_2) },
6260   },
6261
6262   /* PREFIX_VEX_0F3A01 */
6263   {
6264     { Bad_Opcode },
6265     { Bad_Opcode },
6266     { VEX_LEN_TABLE (VEX_LEN_0F3A01_P_2) },
6267   },
6268
6269   /* PREFIX_VEX_0F3A02 */
6270   {
6271     { Bad_Opcode },
6272     { Bad_Opcode },
6273     { VEX_W_TABLE (VEX_W_0F3A02_P_2) },
6274   },
6275
6276   /* PREFIX_VEX_0F3A04 */
6277   {
6278     { Bad_Opcode },
6279     { Bad_Opcode },
6280     { VEX_W_TABLE (VEX_W_0F3A04_P_2) },
6281   },
6282
6283   /* PREFIX_VEX_0F3A05 */
6284   {
6285     { Bad_Opcode },
6286     { Bad_Opcode },
6287     { VEX_W_TABLE (VEX_W_0F3A05_P_2) },
6288   },
6289
6290   /* PREFIX_VEX_0F3A06 */
6291   {
6292     { Bad_Opcode },
6293     { Bad_Opcode },
6294     { VEX_LEN_TABLE (VEX_LEN_0F3A06_P_2) },
6295   },
6296
6297   /* PREFIX_VEX_0F3A08 */
6298   {
6299     { Bad_Opcode },
6300     { Bad_Opcode },
6301     { VEX_W_TABLE (VEX_W_0F3A08_P_2) },
6302   },
6303
6304   /* PREFIX_VEX_0F3A09 */
6305   {
6306     { Bad_Opcode },
6307     { Bad_Opcode },
6308     { VEX_W_TABLE (VEX_W_0F3A09_P_2) },
6309   },
6310
6311   /* PREFIX_VEX_0F3A0A */
6312   {
6313     { Bad_Opcode },
6314     { Bad_Opcode },
6315     { VEX_LEN_TABLE (VEX_LEN_0F3A0A_P_2) },
6316   },
6317
6318   /* PREFIX_VEX_0F3A0B */
6319   {
6320     { Bad_Opcode },
6321     { Bad_Opcode },
6322     { VEX_LEN_TABLE (VEX_LEN_0F3A0B_P_2) },
6323   },
6324
6325   /* PREFIX_VEX_0F3A0C */
6326   {
6327     { Bad_Opcode },
6328     { Bad_Opcode },
6329     { VEX_W_TABLE (VEX_W_0F3A0C_P_2) },
6330   },
6331
6332   /* PREFIX_VEX_0F3A0D */
6333   {
6334     { Bad_Opcode },
6335     { Bad_Opcode },
6336     { VEX_W_TABLE (VEX_W_0F3A0D_P_2) },
6337   },
6338
6339   /* PREFIX_VEX_0F3A0E */
6340   {
6341     { Bad_Opcode },
6342     { Bad_Opcode },
6343     { VEX_W_TABLE (VEX_W_0F3A0E_P_2) },
6344   },
6345
6346   /* PREFIX_VEX_0F3A0F */
6347   {
6348     { Bad_Opcode },
6349     { Bad_Opcode },
6350     { VEX_W_TABLE (VEX_W_0F3A0F_P_2) },
6351   },
6352
6353   /* PREFIX_VEX_0F3A14 */
6354   {
6355     { Bad_Opcode },
6356     { Bad_Opcode },
6357     { VEX_LEN_TABLE (VEX_LEN_0F3A14_P_2) },
6358   },
6359
6360   /* PREFIX_VEX_0F3A15 */
6361   {
6362     { Bad_Opcode },
6363     { Bad_Opcode },
6364     { VEX_LEN_TABLE (VEX_LEN_0F3A15_P_2) },
6365   },
6366
6367   /* PREFIX_VEX_0F3A16 */
6368   {
6369     { Bad_Opcode },
6370     { Bad_Opcode },
6371     { VEX_LEN_TABLE (VEX_LEN_0F3A16_P_2) },
6372   },
6373
6374   /* PREFIX_VEX_0F3A17 */
6375   {
6376     { Bad_Opcode },
6377     { Bad_Opcode },
6378     { VEX_LEN_TABLE (VEX_LEN_0F3A17_P_2) },
6379   },
6380
6381   /* PREFIX_VEX_0F3A18 */
6382   {
6383     { Bad_Opcode },
6384     { Bad_Opcode },
6385     { VEX_LEN_TABLE (VEX_LEN_0F3A18_P_2) },
6386   },
6387
6388   /* PREFIX_VEX_0F3A19 */
6389   {
6390     { Bad_Opcode },
6391     { Bad_Opcode },
6392     { VEX_LEN_TABLE (VEX_LEN_0F3A19_P_2) },
6393   },
6394
6395   /* PREFIX_VEX_0F3A1D */
6396   {
6397     { Bad_Opcode },
6398     { Bad_Opcode },
6399     { "vcvtps2ph", { EXxmmq, XM, Ib }, 0 },
6400   },
6401
6402   /* PREFIX_VEX_0F3A20 */
6403   {
6404     { Bad_Opcode },
6405     { Bad_Opcode },
6406     { VEX_LEN_TABLE (VEX_LEN_0F3A20_P_2) },
6407   },
6408
6409   /* PREFIX_VEX_0F3A21 */
6410   {
6411     { Bad_Opcode },
6412     { Bad_Opcode },
6413     { VEX_LEN_TABLE (VEX_LEN_0F3A21_P_2) },
6414   },
6415
6416   /* PREFIX_VEX_0F3A22 */
6417   {
6418     { Bad_Opcode },
6419     { Bad_Opcode },
6420     { VEX_LEN_TABLE (VEX_LEN_0F3A22_P_2) },
6421   },
6422
6423   /* PREFIX_VEX_0F3A30 */
6424   {
6425     { Bad_Opcode },
6426     { Bad_Opcode },
6427     { VEX_LEN_TABLE (VEX_LEN_0F3A30_P_2) },
6428   },
6429
6430   /* PREFIX_VEX_0F3A31 */
6431   {
6432     { Bad_Opcode },
6433     { Bad_Opcode },
6434     { VEX_LEN_TABLE (VEX_LEN_0F3A31_P_2) },
6435   },
6436
6437   /* PREFIX_VEX_0F3A32 */
6438   {
6439     { Bad_Opcode },
6440     { Bad_Opcode },
6441     { VEX_LEN_TABLE (VEX_LEN_0F3A32_P_2) },
6442   },
6443
6444   /* PREFIX_VEX_0F3A33 */
6445   {
6446     { Bad_Opcode },
6447     { Bad_Opcode },
6448     { VEX_LEN_TABLE (VEX_LEN_0F3A33_P_2) },
6449   },
6450
6451   /* PREFIX_VEX_0F3A38 */
6452   {
6453     { Bad_Opcode },
6454     { Bad_Opcode },
6455     { VEX_LEN_TABLE (VEX_LEN_0F3A38_P_2) },
6456   },
6457
6458   /* PREFIX_VEX_0F3A39 */
6459   {
6460     { Bad_Opcode },
6461     { Bad_Opcode },
6462     { VEX_LEN_TABLE (VEX_LEN_0F3A39_P_2) },
6463   },
6464
6465   /* PREFIX_VEX_0F3A40 */
6466   {
6467     { Bad_Opcode },
6468     { Bad_Opcode },
6469     { VEX_W_TABLE (VEX_W_0F3A40_P_2) },
6470   },
6471
6472   /* PREFIX_VEX_0F3A41 */
6473   {
6474     { Bad_Opcode },
6475     { Bad_Opcode },
6476     { VEX_LEN_TABLE (VEX_LEN_0F3A41_P_2) },
6477   },
6478
6479   /* PREFIX_VEX_0F3A42 */
6480   {
6481     { Bad_Opcode },
6482     { Bad_Opcode },
6483     { VEX_W_TABLE (VEX_W_0F3A42_P_2) },
6484   },
6485
6486   /* PREFIX_VEX_0F3A44 */
6487   {
6488     { Bad_Opcode },
6489     { Bad_Opcode },
6490     { VEX_LEN_TABLE (VEX_LEN_0F3A44_P_2) },
6491   },
6492
6493   /* PREFIX_VEX_0F3A46 */
6494   {
6495     { Bad_Opcode },
6496     { Bad_Opcode },
6497     { VEX_LEN_TABLE (VEX_LEN_0F3A46_P_2) },
6498   },
6499
6500   /* PREFIX_VEX_0F3A48 */
6501   {
6502     { Bad_Opcode },
6503     { Bad_Opcode },
6504     { VEX_W_TABLE (VEX_W_0F3A48_P_2) },
6505   },
6506
6507   /* PREFIX_VEX_0F3A49 */
6508   {
6509     { Bad_Opcode },
6510     { Bad_Opcode },
6511     { VEX_W_TABLE (VEX_W_0F3A49_P_2) },
6512   },
6513
6514   /* PREFIX_VEX_0F3A4A */
6515   {
6516     { Bad_Opcode },
6517     { Bad_Opcode },
6518     { VEX_W_TABLE (VEX_W_0F3A4A_P_2) },
6519   },
6520
6521   /* PREFIX_VEX_0F3A4B */
6522   {
6523     { Bad_Opcode },
6524     { Bad_Opcode },
6525     { VEX_W_TABLE (VEX_W_0F3A4B_P_2) },
6526   },
6527
6528   /* PREFIX_VEX_0F3A4C */
6529   {
6530     { Bad_Opcode },
6531     { Bad_Opcode },
6532     { VEX_W_TABLE (VEX_W_0F3A4C_P_2) },
6533   },
6534
6535   /* PREFIX_VEX_0F3A5C */
6536   {
6537     { Bad_Opcode },
6538     { Bad_Opcode },
6539     { "vfmaddsubps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
6540   },
6541
6542   /* PREFIX_VEX_0F3A5D */
6543   {
6544     { Bad_Opcode },
6545     { Bad_Opcode },
6546     { "vfmaddsubpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
6547   },
6548
6549   /* PREFIX_VEX_0F3A5E */
6550   {
6551     { Bad_Opcode },
6552     { Bad_Opcode },
6553     { "vfmsubaddps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
6554   },
6555
6556   /* PREFIX_VEX_0F3A5F */
6557   {
6558     { Bad_Opcode },
6559     { Bad_Opcode },
6560     { "vfmsubaddpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
6561   },
6562
6563   /* PREFIX_VEX_0F3A60 */
6564   {
6565     { Bad_Opcode },
6566     { Bad_Opcode },
6567     { VEX_LEN_TABLE (VEX_LEN_0F3A60_P_2) },
6568     { Bad_Opcode },
6569   },
6570
6571   /* PREFIX_VEX_0F3A61 */
6572   {
6573     { Bad_Opcode },
6574     { Bad_Opcode },
6575     { VEX_LEN_TABLE (VEX_LEN_0F3A61_P_2) },
6576   },
6577
6578   /* PREFIX_VEX_0F3A62 */
6579   {
6580     { Bad_Opcode },
6581     { Bad_Opcode },
6582     { VEX_LEN_TABLE (VEX_LEN_0F3A62_P_2) },
6583   },
6584
6585   /* PREFIX_VEX_0F3A63 */
6586   {
6587     { Bad_Opcode },
6588     { Bad_Opcode },
6589     { VEX_LEN_TABLE (VEX_LEN_0F3A63_P_2) },
6590   },
6591
6592   /* PREFIX_VEX_0F3A68 */
6593   {
6594     { Bad_Opcode },
6595     { Bad_Opcode },
6596     { "vfmaddps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
6597   },
6598
6599   /* PREFIX_VEX_0F3A69 */
6600   {
6601     { Bad_Opcode },
6602     { Bad_Opcode },
6603     { "vfmaddpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
6604   },
6605
6606   /* PREFIX_VEX_0F3A6A */
6607   {
6608     { Bad_Opcode },
6609     { Bad_Opcode },
6610     { VEX_LEN_TABLE (VEX_LEN_0F3A6A_P_2) },
6611   },
6612
6613   /* PREFIX_VEX_0F3A6B */
6614   {
6615     { Bad_Opcode },
6616     { Bad_Opcode },
6617     { VEX_LEN_TABLE (VEX_LEN_0F3A6B_P_2) },
6618   },
6619
6620   /* PREFIX_VEX_0F3A6C */
6621   {
6622     { Bad_Opcode },
6623     { Bad_Opcode },
6624     { "vfmsubps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
6625   },
6626
6627   /* PREFIX_VEX_0F3A6D */
6628   {
6629     { Bad_Opcode },
6630     { Bad_Opcode },
6631     { "vfmsubpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
6632   },
6633
6634   /* PREFIX_VEX_0F3A6E */
6635   {
6636     { Bad_Opcode },
6637     { Bad_Opcode },
6638     { VEX_LEN_TABLE (VEX_LEN_0F3A6E_P_2) },
6639   },
6640
6641   /* PREFIX_VEX_0F3A6F */
6642   {
6643     { Bad_Opcode },
6644     { Bad_Opcode },
6645     { VEX_LEN_TABLE (VEX_LEN_0F3A6F_P_2) },
6646   },
6647
6648   /* PREFIX_VEX_0F3A78 */
6649   {
6650     { Bad_Opcode },
6651     { Bad_Opcode },
6652     { "vfnmaddps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
6653   },
6654
6655   /* PREFIX_VEX_0F3A79 */
6656   {
6657     { Bad_Opcode },
6658     { Bad_Opcode },
6659     { "vfnmaddpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
6660   },
6661
6662   /* PREFIX_VEX_0F3A7A */
6663   {
6664     { Bad_Opcode },
6665     { Bad_Opcode },
6666     { VEX_LEN_TABLE (VEX_LEN_0F3A7A_P_2) },
6667   },
6668
6669   /* PREFIX_VEX_0F3A7B */
6670   {
6671     { Bad_Opcode },
6672     { Bad_Opcode },
6673     { VEX_LEN_TABLE (VEX_LEN_0F3A7B_P_2) },
6674   },
6675
6676   /* PREFIX_VEX_0F3A7C */
6677   {
6678     { Bad_Opcode },
6679     { Bad_Opcode },
6680     { "vfnmsubps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
6681     { Bad_Opcode },
6682   },
6683
6684   /* PREFIX_VEX_0F3A7D */
6685   {
6686     { Bad_Opcode },
6687     { Bad_Opcode },
6688     { "vfnmsubpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
6689   },
6690
6691   /* PREFIX_VEX_0F3A7E */
6692   {
6693     { Bad_Opcode },
6694     { Bad_Opcode },
6695     { VEX_LEN_TABLE (VEX_LEN_0F3A7E_P_2) },
6696   },
6697
6698   /* PREFIX_VEX_0F3A7F */
6699   {
6700     { Bad_Opcode },
6701     { Bad_Opcode },
6702     { VEX_LEN_TABLE (VEX_LEN_0F3A7F_P_2) },
6703   },
6704
6705   /* PREFIX_VEX_0F3ADF */
6706   {
6707     { Bad_Opcode },
6708     { Bad_Opcode },
6709     { VEX_LEN_TABLE (VEX_LEN_0F3ADF_P_2) },
6710   },
6711
6712   /* PREFIX_VEX_0F3AF0 */
6713   {
6714     { Bad_Opcode },
6715     { Bad_Opcode },
6716     { Bad_Opcode },
6717     { VEX_LEN_TABLE (VEX_LEN_0F3AF0_P_3) },
6718   },
6719
6720 #define NEED_PREFIX_TABLE
6721 #include "i386-dis-evex.h"
6722 #undef NEED_PREFIX_TABLE
6723 };
6724
6725 static const struct dis386 x86_64_table[][2] = {
6726   /* X86_64_06 */
6727   {
6728     { "pushP", { es }, 0 },
6729   },
6730
6731   /* X86_64_07 */
6732   {
6733     { "popP", { es }, 0 },
6734   },
6735
6736   /* X86_64_0D */
6737   {
6738     { "pushP", { cs }, 0 },
6739   },
6740
6741   /* X86_64_16 */
6742   {
6743     { "pushP", { ss }, 0 },
6744   },
6745
6746   /* X86_64_17 */
6747   {
6748     { "popP", { ss }, 0 },
6749   },
6750
6751   /* X86_64_1E */
6752   {
6753     { "pushP", { ds }, 0 },
6754   },
6755
6756   /* X86_64_1F */
6757   {
6758     { "popP", { ds }, 0 },
6759   },
6760
6761   /* X86_64_27 */
6762   {
6763     { "daa", { XX }, 0 },
6764   },
6765
6766   /* X86_64_2F */
6767   {
6768     { "das", { XX }, 0 },
6769   },
6770
6771   /* X86_64_37 */
6772   {
6773     { "aaa", { XX }, 0 },
6774   },
6775
6776   /* X86_64_3F */
6777   {
6778     { "aas", { XX }, 0 },
6779   },
6780
6781   /* X86_64_60 */
6782   {
6783     { "pushaP", { XX }, 0 },
6784   },
6785
6786   /* X86_64_61 */
6787   {
6788     { "popaP", { XX }, 0 },
6789   },
6790
6791   /* X86_64_62 */
6792   {
6793     { MOD_TABLE (MOD_62_32BIT) },
6794     { EVEX_TABLE (EVEX_0F) },
6795   },
6796
6797   /* X86_64_63 */
6798   {
6799     { "arpl", { Ew, Gw }, 0 },
6800     { "movs{lq|xd}", { Gv, Ed }, 0 },
6801   },
6802
6803   /* X86_64_6D */
6804   {
6805     { "ins{R|}", { Yzr, indirDX }, 0 },
6806     { "ins{G|}", { Yzr, indirDX }, 0 },
6807   },
6808
6809   /* X86_64_6F */
6810   {
6811     { "outs{R|}", { indirDXr, Xz }, 0 },
6812     { "outs{G|}", { indirDXr, Xz }, 0 },
6813   },
6814
6815   /* X86_64_9A */
6816   {
6817     { "Jcall{T|}", { Ap }, 0 },
6818   },
6819
6820   /* X86_64_C4 */
6821   {
6822     { MOD_TABLE (MOD_C4_32BIT) },
6823     { VEX_C4_TABLE (VEX_0F) },
6824   },
6825
6826   /* X86_64_C5 */
6827   {
6828     { MOD_TABLE (MOD_C5_32BIT) },
6829     { VEX_C5_TABLE (VEX_0F) },
6830   },
6831
6832   /* X86_64_CE */
6833   {
6834     { "into", { XX }, 0 },
6835   },
6836
6837   /* X86_64_D4 */
6838   {
6839     { "aam", { Ib }, 0 },
6840   },
6841
6842   /* X86_64_D5 */
6843   {
6844     { "aad", { Ib }, 0 },
6845   },
6846
6847   /* X86_64_E8 */
6848   {
6849     { "callP",          { Jv, BND }, 0 },
6850     { "call@",          { Jv, BND }, 0 }
6851   },
6852
6853   /* X86_64_E9 */
6854   {
6855     { "jmpP",           { Jv, BND }, 0 },
6856     { "jmp@",           { Jv, BND }, 0 }
6857   },
6858
6859   /* X86_64_EA */
6860   {
6861     { "Jjmp{T|}", { Ap }, 0 },
6862   },
6863
6864   /* X86_64_0F01_REG_0 */
6865   {
6866     { "sgdt{Q|IQ}", { M }, 0 },
6867     { "sgdt", { M }, 0 },
6868   },
6869
6870   /* X86_64_0F01_REG_1 */
6871   {
6872     { "sidt{Q|IQ}", { M }, 0 },
6873     { "sidt", { M }, 0 },
6874   },
6875
6876   /* X86_64_0F01_REG_2 */
6877   {
6878     { "lgdt{Q|Q}", { M }, 0 },
6879     { "lgdt", { M }, 0 },
6880   },
6881
6882   /* X86_64_0F01_REG_3 */
6883   {
6884     { "lidt{Q|Q}", { M }, 0 },
6885     { "lidt", { M }, 0 },
6886   },
6887 };
6888
6889 static const struct dis386 three_byte_table[][256] = {
6890
6891   /* THREE_BYTE_0F38 */
6892   {
6893     /* 00 */
6894     { "pshufb",         { MX, EM }, PREFIX_OPCODE },
6895     { "phaddw",         { MX, EM }, PREFIX_OPCODE },
6896     { "phaddd",         { MX, EM }, PREFIX_OPCODE },
6897     { "phaddsw",        { MX, EM }, PREFIX_OPCODE },
6898     { "pmaddubsw",      { MX, EM }, PREFIX_OPCODE },
6899     { "phsubw",         { MX, EM }, PREFIX_OPCODE },
6900     { "phsubd",         { MX, EM }, PREFIX_OPCODE },
6901     { "phsubsw",        { MX, EM }, PREFIX_OPCODE },
6902     /* 08 */
6903     { "psignb",         { MX, EM }, PREFIX_OPCODE },
6904     { "psignw",         { MX, EM }, PREFIX_OPCODE },
6905     { "psignd",         { MX, EM }, PREFIX_OPCODE },
6906     { "pmulhrsw",       { MX, EM }, PREFIX_OPCODE },
6907     { Bad_Opcode },
6908     { Bad_Opcode },
6909     { Bad_Opcode },
6910     { Bad_Opcode },
6911     /* 10 */
6912     { PREFIX_TABLE (PREFIX_0F3810) },
6913     { Bad_Opcode },
6914     { Bad_Opcode },
6915     { Bad_Opcode },
6916     { PREFIX_TABLE (PREFIX_0F3814) },
6917     { PREFIX_TABLE (PREFIX_0F3815) },
6918     { Bad_Opcode },
6919     { PREFIX_TABLE (PREFIX_0F3817) },
6920     /* 18 */
6921     { Bad_Opcode },
6922     { Bad_Opcode },
6923     { Bad_Opcode },
6924     { Bad_Opcode },
6925     { "pabsb",          { MX, EM }, PREFIX_OPCODE },
6926     { "pabsw",          { MX, EM }, PREFIX_OPCODE },
6927     { "pabsd",          { MX, EM }, PREFIX_OPCODE },
6928     { Bad_Opcode },
6929     /* 20 */
6930     { PREFIX_TABLE (PREFIX_0F3820) },
6931     { PREFIX_TABLE (PREFIX_0F3821) },
6932     { PREFIX_TABLE (PREFIX_0F3822) },
6933     { PREFIX_TABLE (PREFIX_0F3823) },
6934     { PREFIX_TABLE (PREFIX_0F3824) },
6935     { PREFIX_TABLE (PREFIX_0F3825) },
6936     { Bad_Opcode },
6937     { Bad_Opcode },
6938     /* 28 */
6939     { PREFIX_TABLE (PREFIX_0F3828) },
6940     { PREFIX_TABLE (PREFIX_0F3829) },
6941     { PREFIX_TABLE (PREFIX_0F382A) },
6942     { PREFIX_TABLE (PREFIX_0F382B) },
6943     { Bad_Opcode },
6944     { Bad_Opcode },
6945     { Bad_Opcode },
6946     { Bad_Opcode },
6947     /* 30 */
6948     { PREFIX_TABLE (PREFIX_0F3830) },
6949     { PREFIX_TABLE (PREFIX_0F3831) },
6950     { PREFIX_TABLE (PREFIX_0F3832) },
6951     { PREFIX_TABLE (PREFIX_0F3833) },
6952     { PREFIX_TABLE (PREFIX_0F3834) },
6953     { PREFIX_TABLE (PREFIX_0F3835) },
6954     { Bad_Opcode },
6955     { PREFIX_TABLE (PREFIX_0F3837) },
6956     /* 38 */
6957     { PREFIX_TABLE (PREFIX_0F3838) },
6958     { PREFIX_TABLE (PREFIX_0F3839) },
6959     { PREFIX_TABLE (PREFIX_0F383A) },
6960     { PREFIX_TABLE (PREFIX_0F383B) },
6961     { PREFIX_TABLE (PREFIX_0F383C) },
6962     { PREFIX_TABLE (PREFIX_0F383D) },
6963     { PREFIX_TABLE (PREFIX_0F383E) },
6964     { PREFIX_TABLE (PREFIX_0F383F) },
6965     /* 40 */
6966     { PREFIX_TABLE (PREFIX_0F3840) },
6967     { PREFIX_TABLE (PREFIX_0F3841) },
6968     { Bad_Opcode },
6969     { Bad_Opcode },
6970     { Bad_Opcode },
6971     { Bad_Opcode },
6972     { Bad_Opcode },
6973     { Bad_Opcode },
6974     /* 48 */
6975     { Bad_Opcode },
6976     { Bad_Opcode },
6977     { Bad_Opcode },
6978     { Bad_Opcode },
6979     { Bad_Opcode },
6980     { Bad_Opcode },
6981     { Bad_Opcode },
6982     { Bad_Opcode },
6983     /* 50 */
6984     { Bad_Opcode },
6985     { Bad_Opcode },
6986     { Bad_Opcode },
6987     { Bad_Opcode },
6988     { Bad_Opcode },
6989     { Bad_Opcode },
6990     { Bad_Opcode },
6991     { Bad_Opcode },
6992     /* 58 */
6993     { Bad_Opcode },
6994     { Bad_Opcode },
6995     { Bad_Opcode },
6996     { Bad_Opcode },
6997     { Bad_Opcode },
6998     { Bad_Opcode },
6999     { Bad_Opcode },
7000     { Bad_Opcode },
7001     /* 60 */
7002     { Bad_Opcode },
7003     { Bad_Opcode },
7004     { Bad_Opcode },
7005     { Bad_Opcode },
7006     { Bad_Opcode },
7007     { Bad_Opcode },
7008     { Bad_Opcode },
7009     { Bad_Opcode },
7010     /* 68 */
7011     { Bad_Opcode },
7012     { Bad_Opcode },
7013     { Bad_Opcode },
7014     { Bad_Opcode },
7015     { Bad_Opcode },
7016     { Bad_Opcode },
7017     { Bad_Opcode },
7018     { Bad_Opcode },
7019     /* 70 */
7020     { Bad_Opcode },
7021     { Bad_Opcode },
7022     { Bad_Opcode },
7023     { Bad_Opcode },
7024     { Bad_Opcode },
7025     { Bad_Opcode },
7026     { Bad_Opcode },
7027     { Bad_Opcode },
7028     /* 78 */
7029     { Bad_Opcode },
7030     { Bad_Opcode },
7031     { Bad_Opcode },
7032     { Bad_Opcode },
7033     { Bad_Opcode },
7034     { Bad_Opcode },
7035     { Bad_Opcode },
7036     { Bad_Opcode },
7037     /* 80 */
7038     { PREFIX_TABLE (PREFIX_0F3880) },
7039     { PREFIX_TABLE (PREFIX_0F3881) },
7040     { PREFIX_TABLE (PREFIX_0F3882) },
7041     { Bad_Opcode },
7042     { Bad_Opcode },
7043     { Bad_Opcode },
7044     { Bad_Opcode },
7045     { Bad_Opcode },
7046     /* 88 */
7047     { Bad_Opcode },
7048     { Bad_Opcode },
7049     { Bad_Opcode },
7050     { Bad_Opcode },
7051     { Bad_Opcode },
7052     { Bad_Opcode },
7053     { Bad_Opcode },
7054     { Bad_Opcode },
7055     /* 90 */
7056     { Bad_Opcode },
7057     { Bad_Opcode },
7058     { Bad_Opcode },
7059     { Bad_Opcode },
7060     { Bad_Opcode },
7061     { Bad_Opcode },
7062     { Bad_Opcode },
7063     { Bad_Opcode },
7064     /* 98 */
7065     { Bad_Opcode },
7066     { Bad_Opcode },
7067     { Bad_Opcode },
7068     { Bad_Opcode },
7069     { Bad_Opcode },
7070     { Bad_Opcode },
7071     { Bad_Opcode },
7072     { Bad_Opcode },
7073     /* a0 */
7074     { Bad_Opcode },
7075     { Bad_Opcode },
7076     { Bad_Opcode },
7077     { Bad_Opcode },
7078     { Bad_Opcode },
7079     { Bad_Opcode },
7080     { Bad_Opcode },
7081     { Bad_Opcode },
7082     /* a8 */
7083     { Bad_Opcode },
7084     { Bad_Opcode },
7085     { Bad_Opcode },
7086     { Bad_Opcode },
7087     { Bad_Opcode },
7088     { Bad_Opcode },
7089     { Bad_Opcode },
7090     { Bad_Opcode },
7091     /* b0 */
7092     { Bad_Opcode },
7093     { Bad_Opcode },
7094     { Bad_Opcode },
7095     { Bad_Opcode },
7096     { Bad_Opcode },
7097     { Bad_Opcode },
7098     { Bad_Opcode },
7099     { Bad_Opcode },
7100     /* b8 */
7101     { Bad_Opcode },
7102     { Bad_Opcode },
7103     { Bad_Opcode },
7104     { Bad_Opcode },
7105     { Bad_Opcode },
7106     { Bad_Opcode },
7107     { Bad_Opcode },
7108     { Bad_Opcode },
7109     /* c0 */
7110     { Bad_Opcode },
7111     { Bad_Opcode },
7112     { Bad_Opcode },
7113     { Bad_Opcode },
7114     { Bad_Opcode },
7115     { Bad_Opcode },
7116     { Bad_Opcode },
7117     { Bad_Opcode },
7118     /* c8 */
7119     { PREFIX_TABLE (PREFIX_0F38C8) },
7120     { PREFIX_TABLE (PREFIX_0F38C9) },
7121     { PREFIX_TABLE (PREFIX_0F38CA) },
7122     { PREFIX_TABLE (PREFIX_0F38CB) },
7123     { PREFIX_TABLE (PREFIX_0F38CC) },
7124     { PREFIX_TABLE (PREFIX_0F38CD) },
7125     { Bad_Opcode },
7126     { Bad_Opcode },
7127     /* d0 */
7128     { Bad_Opcode },
7129     { Bad_Opcode },
7130     { Bad_Opcode },
7131     { Bad_Opcode },
7132     { Bad_Opcode },
7133     { Bad_Opcode },
7134     { Bad_Opcode },
7135     { Bad_Opcode },
7136     /* d8 */
7137     { Bad_Opcode },
7138     { Bad_Opcode },
7139     { Bad_Opcode },
7140     { PREFIX_TABLE (PREFIX_0F38DB) },
7141     { PREFIX_TABLE (PREFIX_0F38DC) },
7142     { PREFIX_TABLE (PREFIX_0F38DD) },
7143     { PREFIX_TABLE (PREFIX_0F38DE) },
7144     { PREFIX_TABLE (PREFIX_0F38DF) },
7145     /* e0 */
7146     { Bad_Opcode },
7147     { Bad_Opcode },
7148     { Bad_Opcode },
7149     { Bad_Opcode },
7150     { Bad_Opcode },
7151     { Bad_Opcode },
7152     { Bad_Opcode },
7153     { Bad_Opcode },
7154     /* e8 */
7155     { Bad_Opcode },
7156     { Bad_Opcode },
7157     { Bad_Opcode },
7158     { Bad_Opcode },
7159     { Bad_Opcode },
7160     { Bad_Opcode },
7161     { Bad_Opcode },
7162     { Bad_Opcode },
7163     /* f0 */
7164     { PREFIX_TABLE (PREFIX_0F38F0) },
7165     { PREFIX_TABLE (PREFIX_0F38F1) },
7166     { Bad_Opcode },
7167     { Bad_Opcode },
7168     { Bad_Opcode },
7169     { Bad_Opcode },
7170     { PREFIX_TABLE (PREFIX_0F38F6) },
7171     { Bad_Opcode },
7172     /* f8 */
7173     { Bad_Opcode },
7174     { Bad_Opcode },
7175     { Bad_Opcode },
7176     { Bad_Opcode },
7177     { Bad_Opcode },
7178     { Bad_Opcode },
7179     { Bad_Opcode },
7180     { Bad_Opcode },
7181   },
7182   /* THREE_BYTE_0F3A */
7183   {
7184     /* 00 */
7185     { Bad_Opcode },
7186     { Bad_Opcode },
7187     { Bad_Opcode },
7188     { Bad_Opcode },
7189     { Bad_Opcode },
7190     { Bad_Opcode },
7191     { Bad_Opcode },
7192     { Bad_Opcode },
7193     /* 08 */
7194     { PREFIX_TABLE (PREFIX_0F3A08) },
7195     { PREFIX_TABLE (PREFIX_0F3A09) },
7196     { PREFIX_TABLE (PREFIX_0F3A0A) },
7197     { PREFIX_TABLE (PREFIX_0F3A0B) },
7198     { PREFIX_TABLE (PREFIX_0F3A0C) },
7199     { PREFIX_TABLE (PREFIX_0F3A0D) },
7200     { PREFIX_TABLE (PREFIX_0F3A0E) },
7201     { "palignr",        { MX, EM, Ib }, PREFIX_OPCODE },
7202     /* 10 */
7203     { Bad_Opcode },
7204     { Bad_Opcode },
7205     { Bad_Opcode },
7206     { Bad_Opcode },
7207     { PREFIX_TABLE (PREFIX_0F3A14) },
7208     { PREFIX_TABLE (PREFIX_0F3A15) },
7209     { PREFIX_TABLE (PREFIX_0F3A16) },
7210     { PREFIX_TABLE (PREFIX_0F3A17) },
7211     /* 18 */
7212     { Bad_Opcode },
7213     { Bad_Opcode },
7214     { Bad_Opcode },
7215     { Bad_Opcode },
7216     { Bad_Opcode },
7217     { Bad_Opcode },
7218     { Bad_Opcode },
7219     { Bad_Opcode },
7220     /* 20 */
7221     { PREFIX_TABLE (PREFIX_0F3A20) },
7222     { PREFIX_TABLE (PREFIX_0F3A21) },
7223     { PREFIX_TABLE (PREFIX_0F3A22) },
7224     { Bad_Opcode },
7225     { Bad_Opcode },
7226     { Bad_Opcode },
7227     { Bad_Opcode },
7228     { Bad_Opcode },
7229     /* 28 */
7230     { Bad_Opcode },
7231     { Bad_Opcode },
7232     { Bad_Opcode },
7233     { Bad_Opcode },
7234     { Bad_Opcode },
7235     { Bad_Opcode },
7236     { Bad_Opcode },
7237     { Bad_Opcode },
7238     /* 30 */
7239     { Bad_Opcode },
7240     { Bad_Opcode },
7241     { Bad_Opcode },
7242     { Bad_Opcode },
7243     { Bad_Opcode },
7244     { Bad_Opcode },
7245     { Bad_Opcode },
7246     { Bad_Opcode },
7247     /* 38 */
7248     { Bad_Opcode },
7249     { Bad_Opcode },
7250     { Bad_Opcode },
7251     { Bad_Opcode },
7252     { Bad_Opcode },
7253     { Bad_Opcode },
7254     { Bad_Opcode },
7255     { Bad_Opcode },
7256     /* 40 */
7257     { PREFIX_TABLE (PREFIX_0F3A40) },
7258     { PREFIX_TABLE (PREFIX_0F3A41) },
7259     { PREFIX_TABLE (PREFIX_0F3A42) },
7260     { Bad_Opcode },
7261     { PREFIX_TABLE (PREFIX_0F3A44) },
7262     { Bad_Opcode },
7263     { Bad_Opcode },
7264     { Bad_Opcode },
7265     /* 48 */
7266     { Bad_Opcode },
7267     { Bad_Opcode },
7268     { Bad_Opcode },
7269     { Bad_Opcode },
7270     { Bad_Opcode },
7271     { Bad_Opcode },
7272     { Bad_Opcode },
7273     { Bad_Opcode },
7274     /* 50 */
7275     { Bad_Opcode },
7276     { Bad_Opcode },
7277     { Bad_Opcode },
7278     { Bad_Opcode },
7279     { Bad_Opcode },
7280     { Bad_Opcode },
7281     { Bad_Opcode },
7282     { Bad_Opcode },
7283     /* 58 */
7284     { Bad_Opcode },
7285     { Bad_Opcode },
7286     { Bad_Opcode },
7287     { Bad_Opcode },
7288     { Bad_Opcode },
7289     { Bad_Opcode },
7290     { Bad_Opcode },
7291     { Bad_Opcode },
7292     /* 60 */
7293     { PREFIX_TABLE (PREFIX_0F3A60) },
7294     { PREFIX_TABLE (PREFIX_0F3A61) },
7295     { PREFIX_TABLE (PREFIX_0F3A62) },
7296     { PREFIX_TABLE (PREFIX_0F3A63) },
7297     { Bad_Opcode },
7298     { Bad_Opcode },
7299     { Bad_Opcode },
7300     { Bad_Opcode },
7301     /* 68 */
7302     { Bad_Opcode },
7303     { Bad_Opcode },
7304     { Bad_Opcode },
7305     { Bad_Opcode },
7306     { Bad_Opcode },
7307     { Bad_Opcode },
7308     { Bad_Opcode },
7309     { Bad_Opcode },
7310     /* 70 */
7311     { Bad_Opcode },
7312     { Bad_Opcode },
7313     { Bad_Opcode },
7314     { Bad_Opcode },
7315     { Bad_Opcode },
7316     { Bad_Opcode },
7317     { Bad_Opcode },
7318     { Bad_Opcode },
7319     /* 78 */
7320     { Bad_Opcode },
7321     { Bad_Opcode },
7322     { Bad_Opcode },
7323     { Bad_Opcode },
7324     { Bad_Opcode },
7325     { Bad_Opcode },
7326     { Bad_Opcode },
7327     { Bad_Opcode },
7328     /* 80 */
7329     { Bad_Opcode },
7330     { Bad_Opcode },
7331     { Bad_Opcode },
7332     { Bad_Opcode },
7333     { Bad_Opcode },
7334     { Bad_Opcode },
7335     { Bad_Opcode },
7336     { Bad_Opcode },
7337     /* 88 */
7338     { Bad_Opcode },
7339     { Bad_Opcode },
7340     { Bad_Opcode },
7341     { Bad_Opcode },
7342     { Bad_Opcode },
7343     { Bad_Opcode },
7344     { Bad_Opcode },
7345     { Bad_Opcode },
7346     /* 90 */
7347     { Bad_Opcode },
7348     { Bad_Opcode },
7349     { Bad_Opcode },
7350     { Bad_Opcode },
7351     { Bad_Opcode },
7352     { Bad_Opcode },
7353     { Bad_Opcode },
7354     { Bad_Opcode },
7355     /* 98 */
7356     { Bad_Opcode },
7357     { Bad_Opcode },
7358     { Bad_Opcode },
7359     { Bad_Opcode },
7360     { Bad_Opcode },
7361     { Bad_Opcode },
7362     { Bad_Opcode },
7363     { Bad_Opcode },
7364     /* a0 */
7365     { Bad_Opcode },
7366     { Bad_Opcode },
7367     { Bad_Opcode },
7368     { Bad_Opcode },
7369     { Bad_Opcode },
7370     { Bad_Opcode },
7371     { Bad_Opcode },
7372     { Bad_Opcode },
7373     /* a8 */
7374     { Bad_Opcode },
7375     { Bad_Opcode },
7376     { Bad_Opcode },
7377     { Bad_Opcode },
7378     { Bad_Opcode },
7379     { Bad_Opcode },
7380     { Bad_Opcode },
7381     { Bad_Opcode },
7382     /* b0 */
7383     { Bad_Opcode },
7384     { Bad_Opcode },
7385     { Bad_Opcode },
7386     { Bad_Opcode },
7387     { Bad_Opcode },
7388     { Bad_Opcode },
7389     { Bad_Opcode },
7390     { Bad_Opcode },
7391     /* b8 */
7392     { Bad_Opcode },
7393     { Bad_Opcode },
7394     { Bad_Opcode },
7395     { Bad_Opcode },
7396     { Bad_Opcode },
7397     { Bad_Opcode },
7398     { Bad_Opcode },
7399     { Bad_Opcode },
7400     /* c0 */
7401     { Bad_Opcode },
7402     { Bad_Opcode },
7403     { Bad_Opcode },
7404     { Bad_Opcode },
7405     { Bad_Opcode },
7406     { Bad_Opcode },
7407     { Bad_Opcode },
7408     { Bad_Opcode },
7409     /* c8 */
7410     { Bad_Opcode },
7411     { Bad_Opcode },
7412     { Bad_Opcode },
7413     { Bad_Opcode },
7414     { PREFIX_TABLE (PREFIX_0F3ACC) },
7415     { Bad_Opcode },
7416     { Bad_Opcode },
7417     { Bad_Opcode },
7418     /* d0 */
7419     { Bad_Opcode },
7420     { Bad_Opcode },
7421     { Bad_Opcode },
7422     { Bad_Opcode },
7423     { Bad_Opcode },
7424     { Bad_Opcode },
7425     { Bad_Opcode },
7426     { Bad_Opcode },
7427     /* d8 */
7428     { Bad_Opcode },
7429     { Bad_Opcode },
7430     { Bad_Opcode },
7431     { Bad_Opcode },
7432     { Bad_Opcode },
7433     { Bad_Opcode },
7434     { Bad_Opcode },
7435     { PREFIX_TABLE (PREFIX_0F3ADF) },
7436     /* e0 */
7437     { Bad_Opcode },
7438     { Bad_Opcode },
7439     { Bad_Opcode },
7440     { Bad_Opcode },
7441     { Bad_Opcode },
7442     { Bad_Opcode },
7443     { Bad_Opcode },
7444     { Bad_Opcode },
7445     /* e8 */
7446     { Bad_Opcode },
7447     { Bad_Opcode },
7448     { Bad_Opcode },
7449     { Bad_Opcode },
7450     { Bad_Opcode },
7451     { Bad_Opcode },
7452     { Bad_Opcode },
7453     { Bad_Opcode },
7454     /* f0 */
7455     { Bad_Opcode },
7456     { Bad_Opcode },
7457     { Bad_Opcode },
7458     { Bad_Opcode },
7459     { Bad_Opcode },
7460     { Bad_Opcode },
7461     { Bad_Opcode },
7462     { Bad_Opcode },
7463     /* f8 */
7464     { Bad_Opcode },
7465     { Bad_Opcode },
7466     { Bad_Opcode },
7467     { Bad_Opcode },
7468     { Bad_Opcode },
7469     { Bad_Opcode },
7470     { Bad_Opcode },
7471     { Bad_Opcode },
7472   },
7473
7474   /* THREE_BYTE_0F7A */
7475   {
7476     /* 00 */
7477     { Bad_Opcode },
7478     { Bad_Opcode },
7479     { Bad_Opcode },
7480     { Bad_Opcode },
7481     { Bad_Opcode },
7482     { Bad_Opcode },
7483     { Bad_Opcode },
7484     { Bad_Opcode },
7485     /* 08 */
7486     { Bad_Opcode },
7487     { Bad_Opcode },
7488     { Bad_Opcode },
7489     { Bad_Opcode },
7490     { Bad_Opcode },
7491     { Bad_Opcode },
7492     { Bad_Opcode },
7493     { Bad_Opcode },
7494     /* 10 */
7495     { Bad_Opcode },
7496     { Bad_Opcode },
7497     { Bad_Opcode },
7498     { Bad_Opcode },
7499     { Bad_Opcode },
7500     { Bad_Opcode },
7501     { Bad_Opcode },
7502     { Bad_Opcode },
7503     /* 18 */
7504     { Bad_Opcode },
7505     { Bad_Opcode },
7506     { Bad_Opcode },
7507     { Bad_Opcode },
7508     { Bad_Opcode },
7509     { Bad_Opcode },
7510     { Bad_Opcode },
7511     { Bad_Opcode },
7512     /* 20 */
7513     { "ptest",          { XX }, PREFIX_OPCODE },
7514     { Bad_Opcode },
7515     { Bad_Opcode },
7516     { Bad_Opcode },
7517     { Bad_Opcode },
7518     { Bad_Opcode },
7519     { Bad_Opcode },
7520     { Bad_Opcode },
7521     /* 28 */
7522     { Bad_Opcode },
7523     { Bad_Opcode },
7524     { Bad_Opcode },
7525     { Bad_Opcode },
7526     { Bad_Opcode },
7527     { Bad_Opcode },
7528     { Bad_Opcode },
7529     { Bad_Opcode },
7530     /* 30 */
7531     { Bad_Opcode },
7532     { Bad_Opcode },
7533     { Bad_Opcode },
7534     { Bad_Opcode },
7535     { Bad_Opcode },
7536     { Bad_Opcode },
7537     { Bad_Opcode },
7538     { Bad_Opcode },
7539     /* 38 */
7540     { Bad_Opcode },
7541     { Bad_Opcode },
7542     { Bad_Opcode },
7543     { Bad_Opcode },
7544     { Bad_Opcode },
7545     { Bad_Opcode },
7546     { Bad_Opcode },
7547     { Bad_Opcode },
7548     /* 40 */
7549     { Bad_Opcode },
7550     { "phaddbw",        { XM, EXq }, PREFIX_OPCODE },
7551     { "phaddbd",        { XM, EXq }, PREFIX_OPCODE },
7552     { "phaddbq",        { XM, EXq }, PREFIX_OPCODE },
7553     { Bad_Opcode },
7554     { Bad_Opcode },
7555     { "phaddwd",        { XM, EXq }, PREFIX_OPCODE },
7556     { "phaddwq",        { XM, EXq }, PREFIX_OPCODE },
7557     /* 48 */
7558     { Bad_Opcode },
7559     { Bad_Opcode },
7560     { Bad_Opcode },
7561     { "phadddq",        { XM, EXq }, PREFIX_OPCODE },
7562     { Bad_Opcode },
7563     { Bad_Opcode },
7564     { Bad_Opcode },
7565     { Bad_Opcode },
7566     /* 50 */
7567     { Bad_Opcode },
7568     { "phaddubw",       { XM, EXq }, PREFIX_OPCODE },
7569     { "phaddubd",       { XM, EXq }, PREFIX_OPCODE },
7570     { "phaddubq",       { XM, EXq }, PREFIX_OPCODE },
7571     { Bad_Opcode },
7572     { Bad_Opcode },
7573     { "phadduwd",       { XM, EXq }, PREFIX_OPCODE },
7574     { "phadduwq",       { XM, EXq }, PREFIX_OPCODE },
7575     /* 58 */
7576     { Bad_Opcode },
7577     { Bad_Opcode },
7578     { Bad_Opcode },
7579     { "phaddudq",       { XM, EXq }, PREFIX_OPCODE },
7580     { Bad_Opcode },
7581     { Bad_Opcode },
7582     { Bad_Opcode },
7583     { Bad_Opcode },
7584     /* 60 */
7585     { Bad_Opcode },
7586     { "phsubbw",        { XM, EXq }, PREFIX_OPCODE },
7587     { "phsubbd",        { XM, EXq }, PREFIX_OPCODE },
7588     { "phsubbq",        { XM, EXq }, PREFIX_OPCODE },
7589     { Bad_Opcode },
7590     { Bad_Opcode },
7591     { Bad_Opcode },
7592     { Bad_Opcode },
7593     /* 68 */
7594     { Bad_Opcode },
7595     { Bad_Opcode },
7596     { Bad_Opcode },
7597     { Bad_Opcode },
7598     { Bad_Opcode },
7599     { Bad_Opcode },
7600     { Bad_Opcode },
7601     { Bad_Opcode },
7602     /* 70 */
7603     { Bad_Opcode },
7604     { Bad_Opcode },
7605     { Bad_Opcode },
7606     { Bad_Opcode },
7607     { Bad_Opcode },
7608     { Bad_Opcode },
7609     { Bad_Opcode },
7610     { Bad_Opcode },
7611     /* 78 */
7612     { Bad_Opcode },
7613     { Bad_Opcode },
7614     { Bad_Opcode },
7615     { Bad_Opcode },
7616     { Bad_Opcode },
7617     { Bad_Opcode },
7618     { Bad_Opcode },
7619     { Bad_Opcode },
7620     /* 80 */
7621     { Bad_Opcode },
7622     { Bad_Opcode },
7623     { Bad_Opcode },
7624     { Bad_Opcode },
7625     { Bad_Opcode },
7626     { Bad_Opcode },
7627     { Bad_Opcode },
7628     { Bad_Opcode },
7629     /* 88 */
7630     { Bad_Opcode },
7631     { Bad_Opcode },
7632     { Bad_Opcode },
7633     { Bad_Opcode },
7634     { Bad_Opcode },
7635     { Bad_Opcode },
7636     { Bad_Opcode },
7637     { Bad_Opcode },
7638     /* 90 */
7639     { Bad_Opcode },
7640     { Bad_Opcode },
7641     { Bad_Opcode },
7642     { Bad_Opcode },
7643     { Bad_Opcode },
7644     { Bad_Opcode },
7645     { Bad_Opcode },
7646     { Bad_Opcode },
7647     /* 98 */
7648     { Bad_Opcode },
7649     { Bad_Opcode },
7650     { Bad_Opcode },
7651     { Bad_Opcode },
7652     { Bad_Opcode },
7653     { Bad_Opcode },
7654     { Bad_Opcode },
7655     { Bad_Opcode },
7656     /* a0 */
7657     { Bad_Opcode },
7658     { Bad_Opcode },
7659     { Bad_Opcode },
7660     { Bad_Opcode },
7661     { Bad_Opcode },
7662     { Bad_Opcode },
7663     { Bad_Opcode },
7664     { Bad_Opcode },
7665     /* a8 */
7666     { Bad_Opcode },
7667     { Bad_Opcode },
7668     { Bad_Opcode },
7669     { Bad_Opcode },
7670     { Bad_Opcode },
7671     { Bad_Opcode },
7672     { Bad_Opcode },
7673     { Bad_Opcode },
7674     /* b0 */
7675     { Bad_Opcode },
7676     { Bad_Opcode },
7677     { Bad_Opcode },
7678     { Bad_Opcode },
7679     { Bad_Opcode },
7680     { Bad_Opcode },
7681     { Bad_Opcode },
7682     { Bad_Opcode },
7683     /* b8 */
7684     { Bad_Opcode },
7685     { Bad_Opcode },
7686     { Bad_Opcode },
7687     { Bad_Opcode },
7688     { Bad_Opcode },
7689     { Bad_Opcode },
7690     { Bad_Opcode },
7691     { Bad_Opcode },
7692     /* c0 */
7693     { Bad_Opcode },
7694     { Bad_Opcode },
7695     { Bad_Opcode },
7696     { Bad_Opcode },
7697     { Bad_Opcode },
7698     { Bad_Opcode },
7699     { Bad_Opcode },
7700     { Bad_Opcode },
7701     /* c8 */
7702     { Bad_Opcode },
7703     { Bad_Opcode },
7704     { Bad_Opcode },
7705     { Bad_Opcode },
7706     { Bad_Opcode },
7707     { Bad_Opcode },
7708     { Bad_Opcode },
7709     { Bad_Opcode },
7710     /* d0 */
7711     { Bad_Opcode },
7712     { Bad_Opcode },
7713     { Bad_Opcode },
7714     { Bad_Opcode },
7715     { Bad_Opcode },
7716     { Bad_Opcode },
7717     { Bad_Opcode },
7718     { Bad_Opcode },
7719     /* d8 */
7720     { Bad_Opcode },
7721     { Bad_Opcode },
7722     { Bad_Opcode },
7723     { Bad_Opcode },
7724     { Bad_Opcode },
7725     { Bad_Opcode },
7726     { Bad_Opcode },
7727     { Bad_Opcode },
7728     /* e0 */
7729     { Bad_Opcode },
7730     { Bad_Opcode },
7731     { Bad_Opcode },
7732     { Bad_Opcode },
7733     { Bad_Opcode },
7734     { Bad_Opcode },
7735     { Bad_Opcode },
7736     { Bad_Opcode },
7737     /* e8 */
7738     { Bad_Opcode },
7739     { Bad_Opcode },
7740     { Bad_Opcode },
7741     { Bad_Opcode },
7742     { Bad_Opcode },
7743     { Bad_Opcode },
7744     { Bad_Opcode },
7745     { Bad_Opcode },
7746     /* f0 */
7747     { Bad_Opcode },
7748     { Bad_Opcode },
7749     { Bad_Opcode },
7750     { Bad_Opcode },
7751     { Bad_Opcode },
7752     { Bad_Opcode },
7753     { Bad_Opcode },
7754     { Bad_Opcode },
7755     /* f8 */
7756     { Bad_Opcode },
7757     { Bad_Opcode },
7758     { Bad_Opcode },
7759     { Bad_Opcode },
7760     { Bad_Opcode },
7761     { Bad_Opcode },
7762     { Bad_Opcode },
7763     { Bad_Opcode },
7764   },
7765 };
7766
7767 static const struct dis386 xop_table[][256] = {
7768   /* XOP_08 */
7769   {
7770     /* 00 */
7771     { Bad_Opcode },
7772     { Bad_Opcode },
7773     { Bad_Opcode },
7774     { Bad_Opcode },
7775     { Bad_Opcode },
7776     { Bad_Opcode },
7777     { Bad_Opcode },
7778     { Bad_Opcode },
7779     /* 08 */
7780     { Bad_Opcode },
7781     { Bad_Opcode },
7782     { Bad_Opcode },
7783     { Bad_Opcode },
7784     { Bad_Opcode },
7785     { Bad_Opcode },
7786     { Bad_Opcode },
7787     { Bad_Opcode },
7788     /* 10 */
7789     { Bad_Opcode },
7790     { Bad_Opcode },
7791     { Bad_Opcode },
7792     { Bad_Opcode },
7793     { Bad_Opcode },
7794     { Bad_Opcode },
7795     { Bad_Opcode },
7796     { Bad_Opcode },
7797     /* 18 */
7798     { Bad_Opcode },
7799     { Bad_Opcode },
7800     { Bad_Opcode },
7801     { Bad_Opcode },
7802     { Bad_Opcode },
7803     { Bad_Opcode },
7804     { Bad_Opcode },
7805     { Bad_Opcode },
7806     /* 20 */
7807     { Bad_Opcode },
7808     { Bad_Opcode },
7809     { Bad_Opcode },
7810     { Bad_Opcode },
7811     { Bad_Opcode },
7812     { Bad_Opcode },
7813     { Bad_Opcode },
7814     { Bad_Opcode },
7815     /* 28 */
7816     { Bad_Opcode },
7817     { Bad_Opcode },
7818     { Bad_Opcode },
7819     { Bad_Opcode },
7820     { Bad_Opcode },
7821     { Bad_Opcode },
7822     { Bad_Opcode },
7823     { Bad_Opcode },
7824     /* 30 */
7825     { Bad_Opcode },
7826     { Bad_Opcode },
7827     { Bad_Opcode },
7828     { Bad_Opcode },
7829     { Bad_Opcode },
7830     { Bad_Opcode },
7831     { Bad_Opcode },
7832     { Bad_Opcode },
7833     /* 38 */
7834     { Bad_Opcode },
7835     { Bad_Opcode },
7836     { Bad_Opcode },
7837     { Bad_Opcode },
7838     { Bad_Opcode },
7839     { Bad_Opcode },
7840     { Bad_Opcode },
7841     { Bad_Opcode },
7842     /* 40 */
7843     { Bad_Opcode },
7844     { Bad_Opcode },
7845     { Bad_Opcode },
7846     { Bad_Opcode },
7847     { Bad_Opcode },
7848     { Bad_Opcode },
7849     { Bad_Opcode },
7850     { Bad_Opcode },
7851     /* 48 */
7852     { Bad_Opcode },
7853     { Bad_Opcode },
7854     { Bad_Opcode },
7855     { Bad_Opcode },
7856     { Bad_Opcode },
7857     { Bad_Opcode },
7858     { Bad_Opcode },
7859     { Bad_Opcode },
7860     /* 50 */
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     /* 58 */
7870     { Bad_Opcode },
7871     { Bad_Opcode },
7872     { Bad_Opcode },
7873     { Bad_Opcode },
7874     { Bad_Opcode },
7875     { Bad_Opcode },
7876     { Bad_Opcode },
7877     { Bad_Opcode },
7878     /* 60 */
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     /* 68 */
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     /* 70 */
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     /* 78 */
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     /* 80 */
7915     { Bad_Opcode },
7916     { Bad_Opcode },
7917     { Bad_Opcode },
7918     { Bad_Opcode },
7919     { Bad_Opcode },
7920     { "vpmacssww",      { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7921     { "vpmacsswd",      { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7922     { "vpmacssdql",     { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7923     /* 88 */
7924     { Bad_Opcode },
7925     { Bad_Opcode },
7926     { Bad_Opcode },
7927     { Bad_Opcode },
7928     { Bad_Opcode },
7929     { Bad_Opcode },
7930     { "vpmacssdd",      { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7931     { "vpmacssdqh",     { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7932     /* 90 */
7933     { Bad_Opcode },
7934     { Bad_Opcode },
7935     { Bad_Opcode },
7936     { Bad_Opcode },
7937     { Bad_Opcode },
7938     { "vpmacsww",       { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7939     { "vpmacswd",       { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7940     { "vpmacsdql",      { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7941     /* 98 */
7942     { Bad_Opcode },
7943     { Bad_Opcode },
7944     { Bad_Opcode },
7945     { Bad_Opcode },
7946     { Bad_Opcode },
7947     { Bad_Opcode },
7948     { "vpmacsdd",       { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7949     { "vpmacsdqh",      { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7950     /* a0 */
7951     { Bad_Opcode },
7952     { Bad_Opcode },
7953     { "vpcmov",         { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7954     { "vpperm",         { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7955     { Bad_Opcode },
7956     { Bad_Opcode },
7957     { "vpmadcsswd",     { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7958     { Bad_Opcode },
7959     /* a8 */
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     /* b0 */
7969     { Bad_Opcode },
7970     { Bad_Opcode },
7971     { Bad_Opcode },
7972     { Bad_Opcode },
7973     { Bad_Opcode },
7974     { Bad_Opcode },
7975     { "vpmadcswd",      { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7976     { Bad_Opcode },
7977     /* b8 */
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     /* c0 */
7987     { "vprotb",         { XM, Vex_2src_1, Ib }, 0 },
7988     { "vprotw",         { XM, Vex_2src_1, Ib }, 0 },
7989     { "vprotd",         { XM, Vex_2src_1, Ib }, 0 },
7990     { "vprotq",         { XM, Vex_2src_1, Ib }, 0 },
7991     { Bad_Opcode },
7992     { Bad_Opcode },
7993     { Bad_Opcode },
7994     { Bad_Opcode },
7995     /* c8 */
7996     { Bad_Opcode },
7997     { Bad_Opcode },
7998     { Bad_Opcode },
7999     { Bad_Opcode },
8000     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CC) },
8001     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CD) },
8002     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CE) },
8003     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CF) },
8004     /* d0 */
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     /* d8 */
8014     { Bad_Opcode },
8015     { Bad_Opcode },
8016     { Bad_Opcode },
8017     { Bad_Opcode },
8018     { Bad_Opcode },
8019     { Bad_Opcode },
8020     { Bad_Opcode },
8021     { Bad_Opcode },
8022     /* e0 */
8023     { Bad_Opcode },
8024     { Bad_Opcode },
8025     { Bad_Opcode },
8026     { Bad_Opcode },
8027     { Bad_Opcode },
8028     { Bad_Opcode },
8029     { Bad_Opcode },
8030     { Bad_Opcode },
8031     /* e8 */
8032     { Bad_Opcode },
8033     { Bad_Opcode },
8034     { Bad_Opcode },
8035     { Bad_Opcode },
8036     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EC) },
8037     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_ED) },
8038     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EE) },
8039     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EF) },
8040     /* f0 */
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     /* f8 */
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   },
8059   /* XOP_09 */
8060   {
8061     /* 00 */
8062     { Bad_Opcode },
8063     { REG_TABLE (REG_XOP_TBM_01) },
8064     { REG_TABLE (REG_XOP_TBM_02) },
8065     { Bad_Opcode },
8066     { Bad_Opcode },
8067     { Bad_Opcode },
8068     { Bad_Opcode },
8069     { Bad_Opcode },
8070     /* 08 */
8071     { Bad_Opcode },
8072     { Bad_Opcode },
8073     { Bad_Opcode },
8074     { Bad_Opcode },
8075     { Bad_Opcode },
8076     { Bad_Opcode },
8077     { Bad_Opcode },
8078     { Bad_Opcode },
8079     /* 10 */
8080     { Bad_Opcode },
8081     { Bad_Opcode },
8082     { REG_TABLE (REG_XOP_LWPCB) },
8083     { Bad_Opcode },
8084     { Bad_Opcode },
8085     { Bad_Opcode },
8086     { Bad_Opcode },
8087     { Bad_Opcode },
8088     /* 18 */
8089     { Bad_Opcode },
8090     { Bad_Opcode },
8091     { Bad_Opcode },
8092     { Bad_Opcode },
8093     { Bad_Opcode },
8094     { Bad_Opcode },
8095     { Bad_Opcode },
8096     { Bad_Opcode },
8097     /* 20 */
8098     { Bad_Opcode },
8099     { Bad_Opcode },
8100     { Bad_Opcode },
8101     { Bad_Opcode },
8102     { Bad_Opcode },
8103     { Bad_Opcode },
8104     { Bad_Opcode },
8105     { Bad_Opcode },
8106     /* 28 */
8107     { Bad_Opcode },
8108     { Bad_Opcode },
8109     { Bad_Opcode },
8110     { Bad_Opcode },
8111     { Bad_Opcode },
8112     { Bad_Opcode },
8113     { Bad_Opcode },
8114     { Bad_Opcode },
8115     /* 30 */
8116     { Bad_Opcode },
8117     { Bad_Opcode },
8118     { Bad_Opcode },
8119     { Bad_Opcode },
8120     { Bad_Opcode },
8121     { Bad_Opcode },
8122     { Bad_Opcode },
8123     { Bad_Opcode },
8124     /* 38 */
8125     { Bad_Opcode },
8126     { Bad_Opcode },
8127     { Bad_Opcode },
8128     { Bad_Opcode },
8129     { Bad_Opcode },
8130     { Bad_Opcode },
8131     { Bad_Opcode },
8132     { Bad_Opcode },
8133     /* 40 */
8134     { Bad_Opcode },
8135     { Bad_Opcode },
8136     { Bad_Opcode },
8137     { Bad_Opcode },
8138     { Bad_Opcode },
8139     { Bad_Opcode },
8140     { Bad_Opcode },
8141     { Bad_Opcode },
8142     /* 48 */
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     /* 50 */
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     /* 58 */
8161     { Bad_Opcode },
8162     { Bad_Opcode },
8163     { Bad_Opcode },
8164     { Bad_Opcode },
8165     { Bad_Opcode },
8166     { Bad_Opcode },
8167     { Bad_Opcode },
8168     { Bad_Opcode },
8169     /* 60 */
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     /* 68 */
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     /* 70 */
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     /* 78 */
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     /* 80 */
8206     { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_80) },
8207     { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_81) },
8208     { "vfrczss",        { XM, EXd }, 0 },
8209     { "vfrczsd",        { XM, EXq }, 0 },
8210     { Bad_Opcode },
8211     { Bad_Opcode },
8212     { Bad_Opcode },
8213     { Bad_Opcode },
8214     /* 88 */
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     /* 90 */
8224     { "vprotb",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8225     { "vprotw",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8226     { "vprotd",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8227     { "vprotq",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8228     { "vpshlb",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8229     { "vpshlw",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8230     { "vpshld",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8231     { "vpshlq",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8232     /* 98 */
8233     { "vpshab",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8234     { "vpshaw",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8235     { "vpshad",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8236     { "vpshaq",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8237     { Bad_Opcode },
8238     { Bad_Opcode },
8239     { Bad_Opcode },
8240     { Bad_Opcode },
8241     /* a0 */
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     /* a8 */
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     /* b0 */
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     /* b8 */
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     /* c0 */
8278     { Bad_Opcode },
8279     { "vphaddbw",       { XM, EXxmm }, 0 },
8280     { "vphaddbd",       { XM, EXxmm }, 0 },
8281     { "vphaddbq",       { XM, EXxmm }, 0 },
8282     { Bad_Opcode },
8283     { Bad_Opcode },
8284     { "vphaddwd",       { XM, EXxmm }, 0 },
8285     { "vphaddwq",       { XM, EXxmm }, 0 },
8286     /* c8 */
8287     { Bad_Opcode },
8288     { Bad_Opcode },
8289     { Bad_Opcode },
8290     { "vphadddq",       { XM, EXxmm }, 0 },
8291     { Bad_Opcode },
8292     { Bad_Opcode },
8293     { Bad_Opcode },
8294     { Bad_Opcode },
8295     /* d0 */
8296     { Bad_Opcode },
8297     { "vphaddubw",      { XM, EXxmm }, 0 },
8298     { "vphaddubd",      { XM, EXxmm }, 0 },
8299     { "vphaddubq",      { XM, EXxmm }, 0 },
8300     { Bad_Opcode },
8301     { Bad_Opcode },
8302     { "vphadduwd",      { XM, EXxmm }, 0 },
8303     { "vphadduwq",      { XM, EXxmm }, 0 },
8304     /* d8 */
8305     { Bad_Opcode },
8306     { Bad_Opcode },
8307     { Bad_Opcode },
8308     { "vphaddudq",      { XM, EXxmm }, 0 },
8309     { Bad_Opcode },
8310     { Bad_Opcode },
8311     { Bad_Opcode },
8312     { Bad_Opcode },
8313     /* e0 */
8314     { Bad_Opcode },
8315     { "vphsubbw",       { XM, EXxmm }, 0 },
8316     { "vphsubwd",       { XM, EXxmm }, 0 },
8317     { "vphsubdq",       { XM, EXxmm }, 0 },
8318     { Bad_Opcode },
8319     { Bad_Opcode },
8320     { Bad_Opcode },
8321     { Bad_Opcode },
8322     /* e8 */
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     /* f0 */
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     /* f8 */
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   },
8350   /* XOP_0A */
8351   {
8352     /* 00 */
8353     { Bad_Opcode },
8354     { Bad_Opcode },
8355     { Bad_Opcode },
8356     { Bad_Opcode },
8357     { Bad_Opcode },
8358     { Bad_Opcode },
8359     { Bad_Opcode },
8360     { Bad_Opcode },
8361     /* 08 */
8362     { Bad_Opcode },
8363     { Bad_Opcode },
8364     { Bad_Opcode },
8365     { Bad_Opcode },
8366     { Bad_Opcode },
8367     { Bad_Opcode },
8368     { Bad_Opcode },
8369     { Bad_Opcode },
8370     /* 10 */
8371     { "bextr",  { Gv, Ev, Iq }, 0 },
8372     { Bad_Opcode },
8373     { REG_TABLE (REG_XOP_LWP) },
8374     { Bad_Opcode },
8375     { Bad_Opcode },
8376     { Bad_Opcode },
8377     { Bad_Opcode },
8378     { Bad_Opcode },
8379     /* 18 */
8380     { Bad_Opcode },
8381     { Bad_Opcode },
8382     { Bad_Opcode },
8383     { Bad_Opcode },
8384     { Bad_Opcode },
8385     { Bad_Opcode },
8386     { Bad_Opcode },
8387     { Bad_Opcode },
8388     /* 20 */
8389     { Bad_Opcode },
8390     { Bad_Opcode },
8391     { Bad_Opcode },
8392     { Bad_Opcode },
8393     { Bad_Opcode },
8394     { Bad_Opcode },
8395     { Bad_Opcode },
8396     { Bad_Opcode },
8397     /* 28 */
8398     { Bad_Opcode },
8399     { Bad_Opcode },
8400     { Bad_Opcode },
8401     { Bad_Opcode },
8402     { Bad_Opcode },
8403     { Bad_Opcode },
8404     { Bad_Opcode },
8405     { Bad_Opcode },
8406     /* 30 */
8407     { Bad_Opcode },
8408     { Bad_Opcode },
8409     { Bad_Opcode },
8410     { Bad_Opcode },
8411     { Bad_Opcode },
8412     { Bad_Opcode },
8413     { Bad_Opcode },
8414     { Bad_Opcode },
8415     /* 38 */
8416     { Bad_Opcode },
8417     { Bad_Opcode },
8418     { Bad_Opcode },
8419     { Bad_Opcode },
8420     { Bad_Opcode },
8421     { Bad_Opcode },
8422     { Bad_Opcode },
8423     { Bad_Opcode },
8424     /* 40 */
8425     { Bad_Opcode },
8426     { Bad_Opcode },
8427     { Bad_Opcode },
8428     { Bad_Opcode },
8429     { Bad_Opcode },
8430     { Bad_Opcode },
8431     { Bad_Opcode },
8432     { Bad_Opcode },
8433     /* 48 */
8434     { Bad_Opcode },
8435     { Bad_Opcode },
8436     { Bad_Opcode },
8437     { Bad_Opcode },
8438     { Bad_Opcode },
8439     { Bad_Opcode },
8440     { Bad_Opcode },
8441     { Bad_Opcode },
8442     /* 50 */
8443     { Bad_Opcode },
8444     { Bad_Opcode },
8445     { Bad_Opcode },
8446     { Bad_Opcode },
8447     { Bad_Opcode },
8448     { Bad_Opcode },
8449     { Bad_Opcode },
8450     { Bad_Opcode },
8451     /* 58 */
8452     { Bad_Opcode },
8453     { Bad_Opcode },
8454     { Bad_Opcode },
8455     { Bad_Opcode },
8456     { Bad_Opcode },
8457     { Bad_Opcode },
8458     { Bad_Opcode },
8459     { Bad_Opcode },
8460     /* 60 */
8461     { Bad_Opcode },
8462     { Bad_Opcode },
8463     { Bad_Opcode },
8464     { Bad_Opcode },
8465     { Bad_Opcode },
8466     { Bad_Opcode },
8467     { Bad_Opcode },
8468     { Bad_Opcode },
8469     /* 68 */
8470     { Bad_Opcode },
8471     { Bad_Opcode },
8472     { Bad_Opcode },
8473     { Bad_Opcode },
8474     { Bad_Opcode },
8475     { Bad_Opcode },
8476     { Bad_Opcode },
8477     { Bad_Opcode },
8478     /* 70 */
8479     { Bad_Opcode },
8480     { Bad_Opcode },
8481     { Bad_Opcode },
8482     { Bad_Opcode },
8483     { Bad_Opcode },
8484     { Bad_Opcode },
8485     { Bad_Opcode },
8486     { Bad_Opcode },
8487     /* 78 */
8488     { Bad_Opcode },
8489     { Bad_Opcode },
8490     { Bad_Opcode },
8491     { Bad_Opcode },
8492     { Bad_Opcode },
8493     { Bad_Opcode },
8494     { Bad_Opcode },
8495     { Bad_Opcode },
8496     /* 80 */
8497     { Bad_Opcode },
8498     { Bad_Opcode },
8499     { Bad_Opcode },
8500     { Bad_Opcode },
8501     { Bad_Opcode },
8502     { Bad_Opcode },
8503     { Bad_Opcode },
8504     { Bad_Opcode },
8505     /* 88 */
8506     { Bad_Opcode },
8507     { Bad_Opcode },
8508     { Bad_Opcode },
8509     { Bad_Opcode },
8510     { Bad_Opcode },
8511     { Bad_Opcode },
8512     { Bad_Opcode },
8513     { Bad_Opcode },
8514     /* 90 */
8515     { Bad_Opcode },
8516     { Bad_Opcode },
8517     { Bad_Opcode },
8518     { Bad_Opcode },
8519     { Bad_Opcode },
8520     { Bad_Opcode },
8521     { Bad_Opcode },
8522     { Bad_Opcode },
8523     /* 98 */
8524     { Bad_Opcode },
8525     { Bad_Opcode },
8526     { Bad_Opcode },
8527     { Bad_Opcode },
8528     { Bad_Opcode },
8529     { Bad_Opcode },
8530     { Bad_Opcode },
8531     { Bad_Opcode },
8532     /* a0 */
8533     { Bad_Opcode },
8534     { Bad_Opcode },
8535     { Bad_Opcode },
8536     { Bad_Opcode },
8537     { Bad_Opcode },
8538     { Bad_Opcode },
8539     { Bad_Opcode },
8540     { Bad_Opcode },
8541     /* a8 */
8542     { Bad_Opcode },
8543     { Bad_Opcode },
8544     { Bad_Opcode },
8545     { Bad_Opcode },
8546     { Bad_Opcode },
8547     { Bad_Opcode },
8548     { Bad_Opcode },
8549     { Bad_Opcode },
8550     /* b0 */
8551     { Bad_Opcode },
8552     { Bad_Opcode },
8553     { Bad_Opcode },
8554     { Bad_Opcode },
8555     { Bad_Opcode },
8556     { Bad_Opcode },
8557     { Bad_Opcode },
8558     { Bad_Opcode },
8559     /* b8 */
8560     { Bad_Opcode },
8561     { Bad_Opcode },
8562     { Bad_Opcode },
8563     { Bad_Opcode },
8564     { Bad_Opcode },
8565     { Bad_Opcode },
8566     { Bad_Opcode },
8567     { Bad_Opcode },
8568     /* c0 */
8569     { Bad_Opcode },
8570     { Bad_Opcode },
8571     { Bad_Opcode },
8572     { Bad_Opcode },
8573     { Bad_Opcode },
8574     { Bad_Opcode },
8575     { Bad_Opcode },
8576     { Bad_Opcode },
8577     /* c8 */
8578     { Bad_Opcode },
8579     { Bad_Opcode },
8580     { Bad_Opcode },
8581     { Bad_Opcode },
8582     { Bad_Opcode },
8583     { Bad_Opcode },
8584     { Bad_Opcode },
8585     { Bad_Opcode },
8586     /* d0 */
8587     { Bad_Opcode },
8588     { Bad_Opcode },
8589     { Bad_Opcode },
8590     { Bad_Opcode },
8591     { Bad_Opcode },
8592     { Bad_Opcode },
8593     { Bad_Opcode },
8594     { Bad_Opcode },
8595     /* d8 */
8596     { Bad_Opcode },
8597     { Bad_Opcode },
8598     { Bad_Opcode },
8599     { Bad_Opcode },
8600     { Bad_Opcode },
8601     { Bad_Opcode },
8602     { Bad_Opcode },
8603     { Bad_Opcode },
8604     /* e0 */
8605     { Bad_Opcode },
8606     { Bad_Opcode },
8607     { Bad_Opcode },
8608     { Bad_Opcode },
8609     { Bad_Opcode },
8610     { Bad_Opcode },
8611     { Bad_Opcode },
8612     { Bad_Opcode },
8613     /* e8 */
8614     { Bad_Opcode },
8615     { Bad_Opcode },
8616     { Bad_Opcode },
8617     { Bad_Opcode },
8618     { Bad_Opcode },
8619     { Bad_Opcode },
8620     { Bad_Opcode },
8621     { Bad_Opcode },
8622     /* f0 */
8623     { Bad_Opcode },
8624     { Bad_Opcode },
8625     { Bad_Opcode },
8626     { Bad_Opcode },
8627     { Bad_Opcode },
8628     { Bad_Opcode },
8629     { Bad_Opcode },
8630     { Bad_Opcode },
8631     /* f8 */
8632     { Bad_Opcode },
8633     { Bad_Opcode },
8634     { Bad_Opcode },
8635     { Bad_Opcode },
8636     { Bad_Opcode },
8637     { Bad_Opcode },
8638     { Bad_Opcode },
8639     { Bad_Opcode },
8640   },
8641 };
8642
8643 static const struct dis386 vex_table[][256] = {
8644   /* VEX_0F */
8645   {
8646     /* 00 */
8647     { Bad_Opcode },
8648     { Bad_Opcode },
8649     { Bad_Opcode },
8650     { Bad_Opcode },
8651     { Bad_Opcode },
8652     { Bad_Opcode },
8653     { Bad_Opcode },
8654     { Bad_Opcode },
8655     /* 08 */
8656     { Bad_Opcode },
8657     { Bad_Opcode },
8658     { Bad_Opcode },
8659     { Bad_Opcode },
8660     { Bad_Opcode },
8661     { Bad_Opcode },
8662     { Bad_Opcode },
8663     { Bad_Opcode },
8664     /* 10 */
8665     { PREFIX_TABLE (PREFIX_VEX_0F10) },
8666     { PREFIX_TABLE (PREFIX_VEX_0F11) },
8667     { PREFIX_TABLE (PREFIX_VEX_0F12) },
8668     { MOD_TABLE (MOD_VEX_0F13) },
8669     { VEX_W_TABLE (VEX_W_0F14) },
8670     { VEX_W_TABLE (VEX_W_0F15) },
8671     { PREFIX_TABLE (PREFIX_VEX_0F16) },
8672     { MOD_TABLE (MOD_VEX_0F17) },
8673     /* 18 */
8674     { Bad_Opcode },
8675     { Bad_Opcode },
8676     { Bad_Opcode },
8677     { Bad_Opcode },
8678     { Bad_Opcode },
8679     { Bad_Opcode },
8680     { Bad_Opcode },
8681     { Bad_Opcode },
8682     /* 20 */
8683     { Bad_Opcode },
8684     { Bad_Opcode },
8685     { Bad_Opcode },
8686     { Bad_Opcode },
8687     { Bad_Opcode },
8688     { Bad_Opcode },
8689     { Bad_Opcode },
8690     { Bad_Opcode },
8691     /* 28 */
8692     { VEX_W_TABLE (VEX_W_0F28) },
8693     { VEX_W_TABLE (VEX_W_0F29) },
8694     { PREFIX_TABLE (PREFIX_VEX_0F2A) },
8695     { MOD_TABLE (MOD_VEX_0F2B) },
8696     { PREFIX_TABLE (PREFIX_VEX_0F2C) },
8697     { PREFIX_TABLE (PREFIX_VEX_0F2D) },
8698     { PREFIX_TABLE (PREFIX_VEX_0F2E) },
8699     { PREFIX_TABLE (PREFIX_VEX_0F2F) },
8700     /* 30 */
8701     { Bad_Opcode },
8702     { Bad_Opcode },
8703     { Bad_Opcode },
8704     { Bad_Opcode },
8705     { Bad_Opcode },
8706     { Bad_Opcode },
8707     { Bad_Opcode },
8708     { Bad_Opcode },
8709     /* 38 */
8710     { Bad_Opcode },
8711     { Bad_Opcode },
8712     { Bad_Opcode },
8713     { Bad_Opcode },
8714     { Bad_Opcode },
8715     { Bad_Opcode },
8716     { Bad_Opcode },
8717     { Bad_Opcode },
8718     /* 40 */
8719     { Bad_Opcode },
8720     { PREFIX_TABLE (PREFIX_VEX_0F41) },
8721     { PREFIX_TABLE (PREFIX_VEX_0F42) },
8722     { Bad_Opcode },
8723     { PREFIX_TABLE (PREFIX_VEX_0F44) },
8724     { PREFIX_TABLE (PREFIX_VEX_0F45) },
8725     { PREFIX_TABLE (PREFIX_VEX_0F46) },
8726     { PREFIX_TABLE (PREFIX_VEX_0F47) },
8727     /* 48 */
8728     { Bad_Opcode },
8729     { Bad_Opcode },
8730     { PREFIX_TABLE (PREFIX_VEX_0F4A) },
8731     { PREFIX_TABLE (PREFIX_VEX_0F4B) },
8732     { Bad_Opcode },
8733     { Bad_Opcode },
8734     { Bad_Opcode },
8735     { Bad_Opcode },
8736     /* 50 */
8737     { MOD_TABLE (MOD_VEX_0F50) },
8738     { PREFIX_TABLE (PREFIX_VEX_0F51) },
8739     { PREFIX_TABLE (PREFIX_VEX_0F52) },
8740     { PREFIX_TABLE (PREFIX_VEX_0F53) },
8741     { "vandpX",         { XM, Vex, EXx }, 0 },
8742     { "vandnpX",        { XM, Vex, EXx }, 0 },
8743     { "vorpX",          { XM, Vex, EXx }, 0 },
8744     { "vxorpX",         { XM, Vex, EXx }, 0 },
8745     /* 58 */
8746     { PREFIX_TABLE (PREFIX_VEX_0F58) },
8747     { PREFIX_TABLE (PREFIX_VEX_0F59) },
8748     { PREFIX_TABLE (PREFIX_VEX_0F5A) },
8749     { PREFIX_TABLE (PREFIX_VEX_0F5B) },
8750     { PREFIX_TABLE (PREFIX_VEX_0F5C) },
8751     { PREFIX_TABLE (PREFIX_VEX_0F5D) },
8752     { PREFIX_TABLE (PREFIX_VEX_0F5E) },
8753     { PREFIX_TABLE (PREFIX_VEX_0F5F) },
8754     /* 60 */
8755     { PREFIX_TABLE (PREFIX_VEX_0F60) },
8756     { PREFIX_TABLE (PREFIX_VEX_0F61) },
8757     { PREFIX_TABLE (PREFIX_VEX_0F62) },
8758     { PREFIX_TABLE (PREFIX_VEX_0F63) },
8759     { PREFIX_TABLE (PREFIX_VEX_0F64) },
8760     { PREFIX_TABLE (PREFIX_VEX_0F65) },
8761     { PREFIX_TABLE (PREFIX_VEX_0F66) },
8762     { PREFIX_TABLE (PREFIX_VEX_0F67) },
8763     /* 68 */
8764     { PREFIX_TABLE (PREFIX_VEX_0F68) },
8765     { PREFIX_TABLE (PREFIX_VEX_0F69) },
8766     { PREFIX_TABLE (PREFIX_VEX_0F6A) },
8767     { PREFIX_TABLE (PREFIX_VEX_0F6B) },
8768     { PREFIX_TABLE (PREFIX_VEX_0F6C) },
8769     { PREFIX_TABLE (PREFIX_VEX_0F6D) },
8770     { PREFIX_TABLE (PREFIX_VEX_0F6E) },
8771     { PREFIX_TABLE (PREFIX_VEX_0F6F) },
8772     /* 70 */
8773     { PREFIX_TABLE (PREFIX_VEX_0F70) },
8774     { REG_TABLE (REG_VEX_0F71) },
8775     { REG_TABLE (REG_VEX_0F72) },
8776     { REG_TABLE (REG_VEX_0F73) },
8777     { PREFIX_TABLE (PREFIX_VEX_0F74) },
8778     { PREFIX_TABLE (PREFIX_VEX_0F75) },
8779     { PREFIX_TABLE (PREFIX_VEX_0F76) },
8780     { PREFIX_TABLE (PREFIX_VEX_0F77) },
8781     /* 78 */
8782     { Bad_Opcode },
8783     { Bad_Opcode },
8784     { Bad_Opcode },
8785     { Bad_Opcode },
8786     { PREFIX_TABLE (PREFIX_VEX_0F7C) },
8787     { PREFIX_TABLE (PREFIX_VEX_0F7D) },
8788     { PREFIX_TABLE (PREFIX_VEX_0F7E) },
8789     { PREFIX_TABLE (PREFIX_VEX_0F7F) },
8790     /* 80 */
8791     { Bad_Opcode },
8792     { Bad_Opcode },
8793     { Bad_Opcode },
8794     { Bad_Opcode },
8795     { Bad_Opcode },
8796     { Bad_Opcode },
8797     { Bad_Opcode },
8798     { Bad_Opcode },
8799     /* 88 */
8800     { Bad_Opcode },
8801     { Bad_Opcode },
8802     { Bad_Opcode },
8803     { Bad_Opcode },
8804     { Bad_Opcode },
8805     { Bad_Opcode },
8806     { Bad_Opcode },
8807     { Bad_Opcode },
8808     /* 90 */
8809     { PREFIX_TABLE (PREFIX_VEX_0F90) },
8810     { PREFIX_TABLE (PREFIX_VEX_0F91) },
8811     { PREFIX_TABLE (PREFIX_VEX_0F92) },
8812     { PREFIX_TABLE (PREFIX_VEX_0F93) },
8813     { Bad_Opcode },
8814     { Bad_Opcode },
8815     { Bad_Opcode },
8816     { Bad_Opcode },
8817     /* 98 */
8818     { PREFIX_TABLE (PREFIX_VEX_0F98) },
8819     { PREFIX_TABLE (PREFIX_VEX_0F99) },
8820     { Bad_Opcode },
8821     { Bad_Opcode },
8822     { Bad_Opcode },
8823     { Bad_Opcode },
8824     { Bad_Opcode },
8825     { Bad_Opcode },
8826     /* a0 */
8827     { Bad_Opcode },
8828     { Bad_Opcode },
8829     { Bad_Opcode },
8830     { Bad_Opcode },
8831     { Bad_Opcode },
8832     { Bad_Opcode },
8833     { Bad_Opcode },
8834     { Bad_Opcode },
8835     /* a8 */
8836     { Bad_Opcode },
8837     { Bad_Opcode },
8838     { Bad_Opcode },
8839     { Bad_Opcode },
8840     { Bad_Opcode },
8841     { Bad_Opcode },
8842     { REG_TABLE (REG_VEX_0FAE) },
8843     { Bad_Opcode },
8844     /* b0 */
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     /* b8 */
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     /* c0 */
8863     { Bad_Opcode },
8864     { Bad_Opcode },
8865     { PREFIX_TABLE (PREFIX_VEX_0FC2) },
8866     { Bad_Opcode },
8867     { PREFIX_TABLE (PREFIX_VEX_0FC4) },
8868     { PREFIX_TABLE (PREFIX_VEX_0FC5) },
8869     { "vshufpX",        { XM, Vex, EXx, Ib }, 0 },
8870     { Bad_Opcode },
8871     /* c8 */
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     /* d0 */
8881     { PREFIX_TABLE (PREFIX_VEX_0FD0) },
8882     { PREFIX_TABLE (PREFIX_VEX_0FD1) },
8883     { PREFIX_TABLE (PREFIX_VEX_0FD2) },
8884     { PREFIX_TABLE (PREFIX_VEX_0FD3) },
8885     { PREFIX_TABLE (PREFIX_VEX_0FD4) },
8886     { PREFIX_TABLE (PREFIX_VEX_0FD5) },
8887     { PREFIX_TABLE (PREFIX_VEX_0FD6) },
8888     { PREFIX_TABLE (PREFIX_VEX_0FD7) },
8889     /* d8 */
8890     { PREFIX_TABLE (PREFIX_VEX_0FD8) },
8891     { PREFIX_TABLE (PREFIX_VEX_0FD9) },
8892     { PREFIX_TABLE (PREFIX_VEX_0FDA) },
8893     { PREFIX_TABLE (PREFIX_VEX_0FDB) },
8894     { PREFIX_TABLE (PREFIX_VEX_0FDC) },
8895     { PREFIX_TABLE (PREFIX_VEX_0FDD) },
8896     { PREFIX_TABLE (PREFIX_VEX_0FDE) },
8897     { PREFIX_TABLE (PREFIX_VEX_0FDF) },
8898     /* e0 */
8899     { PREFIX_TABLE (PREFIX_VEX_0FE0) },
8900     { PREFIX_TABLE (PREFIX_VEX_0FE1) },
8901     { PREFIX_TABLE (PREFIX_VEX_0FE2) },
8902     { PREFIX_TABLE (PREFIX_VEX_0FE3) },
8903     { PREFIX_TABLE (PREFIX_VEX_0FE4) },
8904     { PREFIX_TABLE (PREFIX_VEX_0FE5) },
8905     { PREFIX_TABLE (PREFIX_VEX_0FE6) },
8906     { PREFIX_TABLE (PREFIX_VEX_0FE7) },
8907     /* e8 */
8908     { PREFIX_TABLE (PREFIX_VEX_0FE8) },
8909     { PREFIX_TABLE (PREFIX_VEX_0FE9) },
8910     { PREFIX_TABLE (PREFIX_VEX_0FEA) },
8911     { PREFIX_TABLE (PREFIX_VEX_0FEB) },
8912     { PREFIX_TABLE (PREFIX_VEX_0FEC) },
8913     { PREFIX_TABLE (PREFIX_VEX_0FED) },
8914     { PREFIX_TABLE (PREFIX_VEX_0FEE) },
8915     { PREFIX_TABLE (PREFIX_VEX_0FEF) },
8916     /* f0 */
8917     { PREFIX_TABLE (PREFIX_VEX_0FF0) },
8918     { PREFIX_TABLE (PREFIX_VEX_0FF1) },
8919     { PREFIX_TABLE (PREFIX_VEX_0FF2) },
8920     { PREFIX_TABLE (PREFIX_VEX_0FF3) },
8921     { PREFIX_TABLE (PREFIX_VEX_0FF4) },
8922     { PREFIX_TABLE (PREFIX_VEX_0FF5) },
8923     { PREFIX_TABLE (PREFIX_VEX_0FF6) },
8924     { PREFIX_TABLE (PREFIX_VEX_0FF7) },
8925     /* f8 */
8926     { PREFIX_TABLE (PREFIX_VEX_0FF8) },
8927     { PREFIX_TABLE (PREFIX_VEX_0FF9) },
8928     { PREFIX_TABLE (PREFIX_VEX_0FFA) },
8929     { PREFIX_TABLE (PREFIX_VEX_0FFB) },
8930     { PREFIX_TABLE (PREFIX_VEX_0FFC) },
8931     { PREFIX_TABLE (PREFIX_VEX_0FFD) },
8932     { PREFIX_TABLE (PREFIX_VEX_0FFE) },
8933     { Bad_Opcode },
8934   },
8935   /* VEX_0F38 */
8936   {
8937     /* 00 */
8938     { PREFIX_TABLE (PREFIX_VEX_0F3800) },
8939     { PREFIX_TABLE (PREFIX_VEX_0F3801) },
8940     { PREFIX_TABLE (PREFIX_VEX_0F3802) },
8941     { PREFIX_TABLE (PREFIX_VEX_0F3803) },
8942     { PREFIX_TABLE (PREFIX_VEX_0F3804) },
8943     { PREFIX_TABLE (PREFIX_VEX_0F3805) },
8944     { PREFIX_TABLE (PREFIX_VEX_0F3806) },
8945     { PREFIX_TABLE (PREFIX_VEX_0F3807) },
8946     /* 08 */
8947     { PREFIX_TABLE (PREFIX_VEX_0F3808) },
8948     { PREFIX_TABLE (PREFIX_VEX_0F3809) },
8949     { PREFIX_TABLE (PREFIX_VEX_0F380A) },
8950     { PREFIX_TABLE (PREFIX_VEX_0F380B) },
8951     { PREFIX_TABLE (PREFIX_VEX_0F380C) },
8952     { PREFIX_TABLE (PREFIX_VEX_0F380D) },
8953     { PREFIX_TABLE (PREFIX_VEX_0F380E) },
8954     { PREFIX_TABLE (PREFIX_VEX_0F380F) },
8955     /* 10 */
8956     { Bad_Opcode },
8957     { Bad_Opcode },
8958     { Bad_Opcode },
8959     { PREFIX_TABLE (PREFIX_VEX_0F3813) },
8960     { Bad_Opcode },
8961     { Bad_Opcode },
8962     { PREFIX_TABLE (PREFIX_VEX_0F3816) },
8963     { PREFIX_TABLE (PREFIX_VEX_0F3817) },
8964     /* 18 */
8965     { PREFIX_TABLE (PREFIX_VEX_0F3818) },
8966     { PREFIX_TABLE (PREFIX_VEX_0F3819) },
8967     { PREFIX_TABLE (PREFIX_VEX_0F381A) },
8968     { Bad_Opcode },
8969     { PREFIX_TABLE (PREFIX_VEX_0F381C) },
8970     { PREFIX_TABLE (PREFIX_VEX_0F381D) },
8971     { PREFIX_TABLE (PREFIX_VEX_0F381E) },
8972     { Bad_Opcode },
8973     /* 20 */
8974     { PREFIX_TABLE (PREFIX_VEX_0F3820) },
8975     { PREFIX_TABLE (PREFIX_VEX_0F3821) },
8976     { PREFIX_TABLE (PREFIX_VEX_0F3822) },
8977     { PREFIX_TABLE (PREFIX_VEX_0F3823) },
8978     { PREFIX_TABLE (PREFIX_VEX_0F3824) },
8979     { PREFIX_TABLE (PREFIX_VEX_0F3825) },
8980     { Bad_Opcode },
8981     { Bad_Opcode },
8982     /* 28 */
8983     { PREFIX_TABLE (PREFIX_VEX_0F3828) },
8984     { PREFIX_TABLE (PREFIX_VEX_0F3829) },
8985     { PREFIX_TABLE (PREFIX_VEX_0F382A) },
8986     { PREFIX_TABLE (PREFIX_VEX_0F382B) },
8987     { PREFIX_TABLE (PREFIX_VEX_0F382C) },
8988     { PREFIX_TABLE (PREFIX_VEX_0F382D) },
8989     { PREFIX_TABLE (PREFIX_VEX_0F382E) },
8990     { PREFIX_TABLE (PREFIX_VEX_0F382F) },
8991     /* 30 */
8992     { PREFIX_TABLE (PREFIX_VEX_0F3830) },
8993     { PREFIX_TABLE (PREFIX_VEX_0F3831) },
8994     { PREFIX_TABLE (PREFIX_VEX_0F3832) },
8995     { PREFIX_TABLE (PREFIX_VEX_0F3833) },
8996     { PREFIX_TABLE (PREFIX_VEX_0F3834) },
8997     { PREFIX_TABLE (PREFIX_VEX_0F3835) },
8998     { PREFIX_TABLE (PREFIX_VEX_0F3836) },
8999     { PREFIX_TABLE (PREFIX_VEX_0F3837) },
9000     /* 38 */
9001     { PREFIX_TABLE (PREFIX_VEX_0F3838) },
9002     { PREFIX_TABLE (PREFIX_VEX_0F3839) },
9003     { PREFIX_TABLE (PREFIX_VEX_0F383A) },
9004     { PREFIX_TABLE (PREFIX_VEX_0F383B) },
9005     { PREFIX_TABLE (PREFIX_VEX_0F383C) },
9006     { PREFIX_TABLE (PREFIX_VEX_0F383D) },
9007     { PREFIX_TABLE (PREFIX_VEX_0F383E) },
9008     { PREFIX_TABLE (PREFIX_VEX_0F383F) },
9009     /* 40 */
9010     { PREFIX_TABLE (PREFIX_VEX_0F3840) },
9011     { PREFIX_TABLE (PREFIX_VEX_0F3841) },
9012     { Bad_Opcode },
9013     { Bad_Opcode },
9014     { Bad_Opcode },
9015     { PREFIX_TABLE (PREFIX_VEX_0F3845) },
9016     { PREFIX_TABLE (PREFIX_VEX_0F3846) },
9017     { PREFIX_TABLE (PREFIX_VEX_0F3847) },
9018     /* 48 */
9019     { Bad_Opcode },
9020     { Bad_Opcode },
9021     { Bad_Opcode },
9022     { Bad_Opcode },
9023     { Bad_Opcode },
9024     { Bad_Opcode },
9025     { Bad_Opcode },
9026     { Bad_Opcode },
9027     /* 50 */
9028     { Bad_Opcode },
9029     { Bad_Opcode },
9030     { Bad_Opcode },
9031     { Bad_Opcode },
9032     { Bad_Opcode },
9033     { Bad_Opcode },
9034     { Bad_Opcode },
9035     { Bad_Opcode },
9036     /* 58 */
9037     { PREFIX_TABLE (PREFIX_VEX_0F3858) },
9038     { PREFIX_TABLE (PREFIX_VEX_0F3859) },
9039     { PREFIX_TABLE (PREFIX_VEX_0F385A) },
9040     { Bad_Opcode },
9041     { Bad_Opcode },
9042     { Bad_Opcode },
9043     { Bad_Opcode },
9044     { Bad_Opcode },
9045     /* 60 */
9046     { Bad_Opcode },
9047     { Bad_Opcode },
9048     { Bad_Opcode },
9049     { Bad_Opcode },
9050     { Bad_Opcode },
9051     { Bad_Opcode },
9052     { Bad_Opcode },
9053     { Bad_Opcode },
9054     /* 68 */
9055     { Bad_Opcode },
9056     { Bad_Opcode },
9057     { Bad_Opcode },
9058     { Bad_Opcode },
9059     { Bad_Opcode },
9060     { Bad_Opcode },
9061     { Bad_Opcode },
9062     { Bad_Opcode },
9063     /* 70 */
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     /* 78 */
9073     { PREFIX_TABLE (PREFIX_VEX_0F3878) },
9074     { PREFIX_TABLE (PREFIX_VEX_0F3879) },
9075     { Bad_Opcode },
9076     { Bad_Opcode },
9077     { Bad_Opcode },
9078     { Bad_Opcode },
9079     { Bad_Opcode },
9080     { Bad_Opcode },
9081     /* 80 */
9082     { Bad_Opcode },
9083     { Bad_Opcode },
9084     { Bad_Opcode },
9085     { Bad_Opcode },
9086     { Bad_Opcode },
9087     { Bad_Opcode },
9088     { Bad_Opcode },
9089     { Bad_Opcode },
9090     /* 88 */
9091     { Bad_Opcode },
9092     { Bad_Opcode },
9093     { Bad_Opcode },
9094     { Bad_Opcode },
9095     { PREFIX_TABLE (PREFIX_VEX_0F388C) },
9096     { Bad_Opcode },
9097     { PREFIX_TABLE (PREFIX_VEX_0F388E) },
9098     { Bad_Opcode },
9099     /* 90 */
9100     { PREFIX_TABLE (PREFIX_VEX_0F3890) },
9101     { PREFIX_TABLE (PREFIX_VEX_0F3891) },
9102     { PREFIX_TABLE (PREFIX_VEX_0F3892) },
9103     { PREFIX_TABLE (PREFIX_VEX_0F3893) },
9104     { Bad_Opcode },
9105     { Bad_Opcode },
9106     { PREFIX_TABLE (PREFIX_VEX_0F3896) },
9107     { PREFIX_TABLE (PREFIX_VEX_0F3897) },
9108     /* 98 */
9109     { PREFIX_TABLE (PREFIX_VEX_0F3898) },
9110     { PREFIX_TABLE (PREFIX_VEX_0F3899) },
9111     { PREFIX_TABLE (PREFIX_VEX_0F389A) },
9112     { PREFIX_TABLE (PREFIX_VEX_0F389B) },
9113     { PREFIX_TABLE (PREFIX_VEX_0F389C) },
9114     { PREFIX_TABLE (PREFIX_VEX_0F389D) },
9115     { PREFIX_TABLE (PREFIX_VEX_0F389E) },
9116     { PREFIX_TABLE (PREFIX_VEX_0F389F) },
9117     /* a0 */
9118     { Bad_Opcode },
9119     { Bad_Opcode },
9120     { Bad_Opcode },
9121     { Bad_Opcode },
9122     { Bad_Opcode },
9123     { Bad_Opcode },
9124     { PREFIX_TABLE (PREFIX_VEX_0F38A6) },
9125     { PREFIX_TABLE (PREFIX_VEX_0F38A7) },
9126     /* a8 */
9127     { PREFIX_TABLE (PREFIX_VEX_0F38A8) },
9128     { PREFIX_TABLE (PREFIX_VEX_0F38A9) },
9129     { PREFIX_TABLE (PREFIX_VEX_0F38AA) },
9130     { PREFIX_TABLE (PREFIX_VEX_0F38AB) },
9131     { PREFIX_TABLE (PREFIX_VEX_0F38AC) },
9132     { PREFIX_TABLE (PREFIX_VEX_0F38AD) },
9133     { PREFIX_TABLE (PREFIX_VEX_0F38AE) },
9134     { PREFIX_TABLE (PREFIX_VEX_0F38AF) },
9135     /* b0 */
9136     { Bad_Opcode },
9137     { Bad_Opcode },
9138     { Bad_Opcode },
9139     { Bad_Opcode },
9140     { Bad_Opcode },
9141     { Bad_Opcode },
9142     { PREFIX_TABLE (PREFIX_VEX_0F38B6) },
9143     { PREFIX_TABLE (PREFIX_VEX_0F38B7) },
9144     /* b8 */
9145     { PREFIX_TABLE (PREFIX_VEX_0F38B8) },
9146     { PREFIX_TABLE (PREFIX_VEX_0F38B9) },
9147     { PREFIX_TABLE (PREFIX_VEX_0F38BA) },
9148     { PREFIX_TABLE (PREFIX_VEX_0F38BB) },
9149     { PREFIX_TABLE (PREFIX_VEX_0F38BC) },
9150     { PREFIX_TABLE (PREFIX_VEX_0F38BD) },
9151     { PREFIX_TABLE (PREFIX_VEX_0F38BE) },
9152     { PREFIX_TABLE (PREFIX_VEX_0F38BF) },
9153     /* c0 */
9154     { Bad_Opcode },
9155     { Bad_Opcode },
9156     { Bad_Opcode },
9157     { Bad_Opcode },
9158     { Bad_Opcode },
9159     { Bad_Opcode },
9160     { Bad_Opcode },
9161     { Bad_Opcode },
9162     /* c8 */
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     /* d0 */
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     /* d8 */
9181     { Bad_Opcode },
9182     { Bad_Opcode },
9183     { Bad_Opcode },
9184     { PREFIX_TABLE (PREFIX_VEX_0F38DB) },
9185     { PREFIX_TABLE (PREFIX_VEX_0F38DC) },
9186     { PREFIX_TABLE (PREFIX_VEX_0F38DD) },
9187     { PREFIX_TABLE (PREFIX_VEX_0F38DE) },
9188     { PREFIX_TABLE (PREFIX_VEX_0F38DF) },
9189     /* e0 */
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     /* e8 */
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     /* f0 */
9208     { Bad_Opcode },
9209     { Bad_Opcode },
9210     { PREFIX_TABLE (PREFIX_VEX_0F38F2) },
9211     { REG_TABLE (REG_VEX_0F38F3) },
9212     { Bad_Opcode },
9213     { PREFIX_TABLE (PREFIX_VEX_0F38F5) },
9214     { PREFIX_TABLE (PREFIX_VEX_0F38F6) },
9215     { PREFIX_TABLE (PREFIX_VEX_0F38F7) },
9216     /* f8 */
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   },
9226   /* VEX_0F3A */
9227   {
9228     /* 00 */
9229     { PREFIX_TABLE (PREFIX_VEX_0F3A00) },
9230     { PREFIX_TABLE (PREFIX_VEX_0F3A01) },
9231     { PREFIX_TABLE (PREFIX_VEX_0F3A02) },
9232     { Bad_Opcode },
9233     { PREFIX_TABLE (PREFIX_VEX_0F3A04) },
9234     { PREFIX_TABLE (PREFIX_VEX_0F3A05) },
9235     { PREFIX_TABLE (PREFIX_VEX_0F3A06) },
9236     { Bad_Opcode },
9237     /* 08 */
9238     { PREFIX_TABLE (PREFIX_VEX_0F3A08) },
9239     { PREFIX_TABLE (PREFIX_VEX_0F3A09) },
9240     { PREFIX_TABLE (PREFIX_VEX_0F3A0A) },
9241     { PREFIX_TABLE (PREFIX_VEX_0F3A0B) },
9242     { PREFIX_TABLE (PREFIX_VEX_0F3A0C) },
9243     { PREFIX_TABLE (PREFIX_VEX_0F3A0D) },
9244     { PREFIX_TABLE (PREFIX_VEX_0F3A0E) },
9245     { PREFIX_TABLE (PREFIX_VEX_0F3A0F) },
9246     /* 10 */
9247     { Bad_Opcode },
9248     { Bad_Opcode },
9249     { Bad_Opcode },
9250     { Bad_Opcode },
9251     { PREFIX_TABLE (PREFIX_VEX_0F3A14) },
9252     { PREFIX_TABLE (PREFIX_VEX_0F3A15) },
9253     { PREFIX_TABLE (PREFIX_VEX_0F3A16) },
9254     { PREFIX_TABLE (PREFIX_VEX_0F3A17) },
9255     /* 18 */
9256     { PREFIX_TABLE (PREFIX_VEX_0F3A18) },
9257     { PREFIX_TABLE (PREFIX_VEX_0F3A19) },
9258     { Bad_Opcode },
9259     { Bad_Opcode },
9260     { Bad_Opcode },
9261     { PREFIX_TABLE (PREFIX_VEX_0F3A1D) },
9262     { Bad_Opcode },
9263     { Bad_Opcode },
9264     /* 20 */
9265     { PREFIX_TABLE (PREFIX_VEX_0F3A20) },
9266     { PREFIX_TABLE (PREFIX_VEX_0F3A21) },
9267     { PREFIX_TABLE (PREFIX_VEX_0F3A22) },
9268     { Bad_Opcode },
9269     { Bad_Opcode },
9270     { Bad_Opcode },
9271     { Bad_Opcode },
9272     { Bad_Opcode },
9273     /* 28 */
9274     { Bad_Opcode },
9275     { Bad_Opcode },
9276     { Bad_Opcode },
9277     { Bad_Opcode },
9278     { Bad_Opcode },
9279     { Bad_Opcode },
9280     { Bad_Opcode },
9281     { Bad_Opcode },
9282     /* 30 */
9283     { PREFIX_TABLE (PREFIX_VEX_0F3A30) },
9284     { PREFIX_TABLE (PREFIX_VEX_0F3A31) },
9285     { PREFIX_TABLE (PREFIX_VEX_0F3A32) },
9286     { PREFIX_TABLE (PREFIX_VEX_0F3A33) },
9287     { Bad_Opcode },
9288     { Bad_Opcode },
9289     { Bad_Opcode },
9290     { Bad_Opcode },
9291     /* 38 */
9292     { PREFIX_TABLE (PREFIX_VEX_0F3A38) },
9293     { PREFIX_TABLE (PREFIX_VEX_0F3A39) },
9294     { Bad_Opcode },
9295     { Bad_Opcode },
9296     { Bad_Opcode },
9297     { Bad_Opcode },
9298     { Bad_Opcode },
9299     { Bad_Opcode },
9300     /* 40 */
9301     { PREFIX_TABLE (PREFIX_VEX_0F3A40) },
9302     { PREFIX_TABLE (PREFIX_VEX_0F3A41) },
9303     { PREFIX_TABLE (PREFIX_VEX_0F3A42) },
9304     { Bad_Opcode },
9305     { PREFIX_TABLE (PREFIX_VEX_0F3A44) },
9306     { Bad_Opcode },
9307     { PREFIX_TABLE (PREFIX_VEX_0F3A46) },
9308     { Bad_Opcode },
9309     /* 48 */
9310     { PREFIX_TABLE (PREFIX_VEX_0F3A48) },
9311     { PREFIX_TABLE (PREFIX_VEX_0F3A49) },
9312     { PREFIX_TABLE (PREFIX_VEX_0F3A4A) },
9313     { PREFIX_TABLE (PREFIX_VEX_0F3A4B) },
9314     { PREFIX_TABLE (PREFIX_VEX_0F3A4C) },
9315     { Bad_Opcode },
9316     { Bad_Opcode },
9317     { Bad_Opcode },
9318     /* 50 */
9319     { Bad_Opcode },
9320     { Bad_Opcode },
9321     { Bad_Opcode },
9322     { Bad_Opcode },
9323     { Bad_Opcode },
9324     { Bad_Opcode },
9325     { Bad_Opcode },
9326     { Bad_Opcode },
9327     /* 58 */
9328     { Bad_Opcode },
9329     { Bad_Opcode },
9330     { Bad_Opcode },
9331     { Bad_Opcode },
9332     { PREFIX_TABLE (PREFIX_VEX_0F3A5C) },
9333     { PREFIX_TABLE (PREFIX_VEX_0F3A5D) },
9334     { PREFIX_TABLE (PREFIX_VEX_0F3A5E) },
9335     { PREFIX_TABLE (PREFIX_VEX_0F3A5F) },
9336     /* 60 */
9337     { PREFIX_TABLE (PREFIX_VEX_0F3A60) },
9338     { PREFIX_TABLE (PREFIX_VEX_0F3A61) },
9339     { PREFIX_TABLE (PREFIX_VEX_0F3A62) },
9340     { PREFIX_TABLE (PREFIX_VEX_0F3A63) },
9341     { Bad_Opcode },
9342     { Bad_Opcode },
9343     { Bad_Opcode },
9344     { Bad_Opcode },
9345     /* 68 */
9346     { PREFIX_TABLE (PREFIX_VEX_0F3A68) },
9347     { PREFIX_TABLE (PREFIX_VEX_0F3A69) },
9348     { PREFIX_TABLE (PREFIX_VEX_0F3A6A) },
9349     { PREFIX_TABLE (PREFIX_VEX_0F3A6B) },
9350     { PREFIX_TABLE (PREFIX_VEX_0F3A6C) },
9351     { PREFIX_TABLE (PREFIX_VEX_0F3A6D) },
9352     { PREFIX_TABLE (PREFIX_VEX_0F3A6E) },
9353     { PREFIX_TABLE (PREFIX_VEX_0F3A6F) },
9354     /* 70 */
9355     { Bad_Opcode },
9356     { Bad_Opcode },
9357     { Bad_Opcode },
9358     { Bad_Opcode },
9359     { Bad_Opcode },
9360     { Bad_Opcode },
9361     { Bad_Opcode },
9362     { Bad_Opcode },
9363     /* 78 */
9364     { PREFIX_TABLE (PREFIX_VEX_0F3A78) },
9365     { PREFIX_TABLE (PREFIX_VEX_0F3A79) },
9366     { PREFIX_TABLE (PREFIX_VEX_0F3A7A) },
9367     { PREFIX_TABLE (PREFIX_VEX_0F3A7B) },
9368     { PREFIX_TABLE (PREFIX_VEX_0F3A7C) },
9369     { PREFIX_TABLE (PREFIX_VEX_0F3A7D) },
9370     { PREFIX_TABLE (PREFIX_VEX_0F3A7E) },
9371     { PREFIX_TABLE (PREFIX_VEX_0F3A7F) },
9372     /* 80 */
9373     { Bad_Opcode },
9374     { Bad_Opcode },
9375     { Bad_Opcode },
9376     { Bad_Opcode },
9377     { Bad_Opcode },
9378     { Bad_Opcode },
9379     { Bad_Opcode },
9380     { Bad_Opcode },
9381     /* 88 */
9382     { Bad_Opcode },
9383     { Bad_Opcode },
9384     { Bad_Opcode },
9385     { Bad_Opcode },
9386     { Bad_Opcode },
9387     { Bad_Opcode },
9388     { Bad_Opcode },
9389     { Bad_Opcode },
9390     /* 90 */
9391     { Bad_Opcode },
9392     { Bad_Opcode },
9393     { Bad_Opcode },
9394     { Bad_Opcode },
9395     { Bad_Opcode },
9396     { Bad_Opcode },
9397     { Bad_Opcode },
9398     { Bad_Opcode },
9399     /* 98 */
9400     { Bad_Opcode },
9401     { Bad_Opcode },
9402     { Bad_Opcode },
9403     { Bad_Opcode },
9404     { Bad_Opcode },
9405     { Bad_Opcode },
9406     { Bad_Opcode },
9407     { Bad_Opcode },
9408     /* a0 */
9409     { Bad_Opcode },
9410     { Bad_Opcode },
9411     { Bad_Opcode },
9412     { Bad_Opcode },
9413     { Bad_Opcode },
9414     { Bad_Opcode },
9415     { Bad_Opcode },
9416     { Bad_Opcode },
9417     /* a8 */
9418     { Bad_Opcode },
9419     { Bad_Opcode },
9420     { Bad_Opcode },
9421     { Bad_Opcode },
9422     { Bad_Opcode },
9423     { Bad_Opcode },
9424     { Bad_Opcode },
9425     { Bad_Opcode },
9426     /* b0 */
9427     { Bad_Opcode },
9428     { Bad_Opcode },
9429     { Bad_Opcode },
9430     { Bad_Opcode },
9431     { Bad_Opcode },
9432     { Bad_Opcode },
9433     { Bad_Opcode },
9434     { Bad_Opcode },
9435     /* b8 */
9436     { Bad_Opcode },
9437     { Bad_Opcode },
9438     { Bad_Opcode },
9439     { Bad_Opcode },
9440     { Bad_Opcode },
9441     { Bad_Opcode },
9442     { Bad_Opcode },
9443     { Bad_Opcode },
9444     /* c0 */
9445     { Bad_Opcode },
9446     { Bad_Opcode },
9447     { Bad_Opcode },
9448     { Bad_Opcode },
9449     { Bad_Opcode },
9450     { Bad_Opcode },
9451     { Bad_Opcode },
9452     { Bad_Opcode },
9453     /* c8 */
9454     { Bad_Opcode },
9455     { Bad_Opcode },
9456     { Bad_Opcode },
9457     { Bad_Opcode },
9458     { Bad_Opcode },
9459     { Bad_Opcode },
9460     { Bad_Opcode },
9461     { Bad_Opcode },
9462     /* d0 */
9463     { Bad_Opcode },
9464     { Bad_Opcode },
9465     { Bad_Opcode },
9466     { Bad_Opcode },
9467     { Bad_Opcode },
9468     { Bad_Opcode },
9469     { Bad_Opcode },
9470     { Bad_Opcode },
9471     /* d8 */
9472     { Bad_Opcode },
9473     { Bad_Opcode },
9474     { Bad_Opcode },
9475     { Bad_Opcode },
9476     { Bad_Opcode },
9477     { Bad_Opcode },
9478     { Bad_Opcode },
9479     { PREFIX_TABLE (PREFIX_VEX_0F3ADF) },
9480     /* e0 */
9481     { Bad_Opcode },
9482     { Bad_Opcode },
9483     { Bad_Opcode },
9484     { Bad_Opcode },
9485     { Bad_Opcode },
9486     { Bad_Opcode },
9487     { Bad_Opcode },
9488     { Bad_Opcode },
9489     /* e8 */
9490     { Bad_Opcode },
9491     { Bad_Opcode },
9492     { Bad_Opcode },
9493     { Bad_Opcode },
9494     { Bad_Opcode },
9495     { Bad_Opcode },
9496     { Bad_Opcode },
9497     { Bad_Opcode },
9498     /* f0 */
9499     { PREFIX_TABLE (PREFIX_VEX_0F3AF0) },
9500     { Bad_Opcode },
9501     { Bad_Opcode },
9502     { Bad_Opcode },
9503     { Bad_Opcode },
9504     { Bad_Opcode },
9505     { Bad_Opcode },
9506     { Bad_Opcode },
9507     /* f8 */
9508     { Bad_Opcode },
9509     { Bad_Opcode },
9510     { Bad_Opcode },
9511     { Bad_Opcode },
9512     { Bad_Opcode },
9513     { Bad_Opcode },
9514     { Bad_Opcode },
9515     { Bad_Opcode },
9516   },
9517 };
9518
9519 #define NEED_OPCODE_TABLE
9520 #include "i386-dis-evex.h"
9521 #undef NEED_OPCODE_TABLE
9522 static const struct dis386 vex_len_table[][2] = {
9523   /* VEX_LEN_0F10_P_1 */
9524   {
9525     { VEX_W_TABLE (VEX_W_0F10_P_1) },
9526     { VEX_W_TABLE (VEX_W_0F10_P_1) },
9527   },
9528
9529   /* VEX_LEN_0F10_P_3 */
9530   {
9531     { VEX_W_TABLE (VEX_W_0F10_P_3) },
9532     { VEX_W_TABLE (VEX_W_0F10_P_3) },
9533   },
9534
9535   /* VEX_LEN_0F11_P_1 */
9536   {
9537     { VEX_W_TABLE (VEX_W_0F11_P_1) },
9538     { VEX_W_TABLE (VEX_W_0F11_P_1) },
9539   },
9540
9541   /* VEX_LEN_0F11_P_3 */
9542   {
9543     { VEX_W_TABLE (VEX_W_0F11_P_3) },
9544     { VEX_W_TABLE (VEX_W_0F11_P_3) },
9545   },
9546
9547   /* VEX_LEN_0F12_P_0_M_0 */
9548   {
9549     { VEX_W_TABLE (VEX_W_0F12_P_0_M_0) },
9550   },
9551
9552   /* VEX_LEN_0F12_P_0_M_1 */
9553   {
9554     { VEX_W_TABLE (VEX_W_0F12_P_0_M_1) },
9555   },
9556
9557   /* VEX_LEN_0F12_P_2 */
9558   {
9559     { VEX_W_TABLE (VEX_W_0F12_P_2) },
9560   },
9561
9562   /* VEX_LEN_0F13_M_0 */
9563   {
9564     { VEX_W_TABLE (VEX_W_0F13_M_0) },
9565   },
9566
9567   /* VEX_LEN_0F16_P_0_M_0 */
9568   {
9569     { VEX_W_TABLE (VEX_W_0F16_P_0_M_0) },
9570   },
9571
9572   /* VEX_LEN_0F16_P_0_M_1 */
9573   {
9574     { VEX_W_TABLE (VEX_W_0F16_P_0_M_1) },
9575   },
9576
9577   /* VEX_LEN_0F16_P_2 */
9578   {
9579     { VEX_W_TABLE (VEX_W_0F16_P_2) },
9580   },
9581
9582   /* VEX_LEN_0F17_M_0 */
9583   {
9584     { VEX_W_TABLE (VEX_W_0F17_M_0) },
9585   },
9586
9587   /* VEX_LEN_0F2A_P_1 */
9588   {
9589     { "vcvtsi2ss%LQ",   { XMScalar, VexScalar, Ev }, 0 },
9590     { "vcvtsi2ss%LQ",   { XMScalar, VexScalar, Ev }, 0 },
9591   },
9592
9593   /* VEX_LEN_0F2A_P_3 */
9594   {
9595     { "vcvtsi2sd%LQ",   { XMScalar, VexScalar, Ev }, 0 },
9596     { "vcvtsi2sd%LQ",   { XMScalar, VexScalar, Ev }, 0 },
9597   },
9598
9599   /* VEX_LEN_0F2C_P_1 */
9600   {
9601     { "vcvttss2siY",    { Gv, EXdScalar }, 0 },
9602     { "vcvttss2siY",    { Gv, EXdScalar }, 0 },
9603   },
9604
9605   /* VEX_LEN_0F2C_P_3 */
9606   {
9607     { "vcvttsd2siY",    { Gv, EXqScalar }, 0 },
9608     { "vcvttsd2siY",    { Gv, EXqScalar }, 0 },
9609   },
9610
9611   /* VEX_LEN_0F2D_P_1 */
9612   {
9613     { "vcvtss2siY",     { Gv, EXdScalar }, 0 },
9614     { "vcvtss2siY",     { Gv, EXdScalar }, 0 },
9615   },
9616
9617   /* VEX_LEN_0F2D_P_3 */
9618   {
9619     { "vcvtsd2siY",     { Gv, EXqScalar }, 0 },
9620     { "vcvtsd2siY",     { Gv, EXqScalar }, 0 },
9621   },
9622
9623   /* VEX_LEN_0F2E_P_0 */
9624   {
9625     { VEX_W_TABLE (VEX_W_0F2E_P_0) },
9626     { VEX_W_TABLE (VEX_W_0F2E_P_0) },
9627   },
9628
9629   /* VEX_LEN_0F2E_P_2 */
9630   {
9631     { VEX_W_TABLE (VEX_W_0F2E_P_2) },
9632     { VEX_W_TABLE (VEX_W_0F2E_P_2) },
9633   },
9634
9635   /* VEX_LEN_0F2F_P_0 */
9636   {
9637     { VEX_W_TABLE (VEX_W_0F2F_P_0) },
9638     { VEX_W_TABLE (VEX_W_0F2F_P_0) },
9639   },
9640
9641   /* VEX_LEN_0F2F_P_2 */
9642   {
9643     { VEX_W_TABLE (VEX_W_0F2F_P_2) },
9644     { VEX_W_TABLE (VEX_W_0F2F_P_2) },
9645   },
9646
9647   /* VEX_LEN_0F41_P_0 */
9648   {
9649     { Bad_Opcode },
9650     { VEX_W_TABLE (VEX_W_0F41_P_0_LEN_1) },
9651   },
9652   /* VEX_LEN_0F41_P_2 */
9653   {
9654     { Bad_Opcode },
9655     { VEX_W_TABLE (VEX_W_0F41_P_2_LEN_1) },
9656   },
9657   /* VEX_LEN_0F42_P_0 */
9658   {
9659     { Bad_Opcode },
9660     { VEX_W_TABLE (VEX_W_0F42_P_0_LEN_1) },
9661   },
9662   /* VEX_LEN_0F42_P_2 */
9663   {
9664     { Bad_Opcode },
9665     { VEX_W_TABLE (VEX_W_0F42_P_2_LEN_1) },
9666   },
9667   /* VEX_LEN_0F44_P_0 */
9668   {
9669     { VEX_W_TABLE (VEX_W_0F44_P_0_LEN_0) },
9670   },
9671   /* VEX_LEN_0F44_P_2 */
9672   {
9673     { VEX_W_TABLE (VEX_W_0F44_P_2_LEN_0) },
9674   },
9675   /* VEX_LEN_0F45_P_0 */
9676   {
9677     { Bad_Opcode },
9678     { VEX_W_TABLE (VEX_W_0F45_P_0_LEN_1) },
9679   },
9680   /* VEX_LEN_0F45_P_2 */
9681   {
9682     { Bad_Opcode },
9683     { VEX_W_TABLE (VEX_W_0F45_P_2_LEN_1) },
9684   },
9685   /* VEX_LEN_0F46_P_0 */
9686   {
9687     { Bad_Opcode },
9688     { VEX_W_TABLE (VEX_W_0F46_P_0_LEN_1) },
9689   },
9690   /* VEX_LEN_0F46_P_2 */
9691   {
9692     { Bad_Opcode },
9693     { VEX_W_TABLE (VEX_W_0F46_P_2_LEN_1) },
9694   },
9695   /* VEX_LEN_0F47_P_0 */
9696   {
9697     { Bad_Opcode },
9698     { VEX_W_TABLE (VEX_W_0F47_P_0_LEN_1) },
9699   },
9700   /* VEX_LEN_0F47_P_2 */
9701   {
9702     { Bad_Opcode },
9703     { VEX_W_TABLE (VEX_W_0F47_P_2_LEN_1) },
9704   },
9705   /* VEX_LEN_0F4A_P_0 */
9706   {
9707     { Bad_Opcode },
9708     { VEX_W_TABLE (VEX_W_0F4A_P_0_LEN_1) },
9709   },
9710   /* VEX_LEN_0F4A_P_2 */
9711   {
9712     { Bad_Opcode },
9713     { VEX_W_TABLE (VEX_W_0F4A_P_2_LEN_1) },
9714   },
9715   /* VEX_LEN_0F4B_P_0 */
9716   {
9717     { Bad_Opcode },
9718     { VEX_W_TABLE (VEX_W_0F4B_P_0_LEN_1) },
9719   },
9720   /* VEX_LEN_0F4B_P_2 */
9721   {
9722     { Bad_Opcode },
9723     { VEX_W_TABLE (VEX_W_0F4B_P_2_LEN_1) },
9724   },
9725
9726   /* VEX_LEN_0F51_P_1 */
9727   {
9728     { VEX_W_TABLE (VEX_W_0F51_P_1) },
9729     { VEX_W_TABLE (VEX_W_0F51_P_1) },
9730   },
9731
9732   /* VEX_LEN_0F51_P_3 */
9733   {
9734     { VEX_W_TABLE (VEX_W_0F51_P_3) },
9735     { VEX_W_TABLE (VEX_W_0F51_P_3) },
9736   },
9737
9738   /* VEX_LEN_0F52_P_1 */
9739   {
9740     { VEX_W_TABLE (VEX_W_0F52_P_1) },
9741     { VEX_W_TABLE (VEX_W_0F52_P_1) },
9742   },
9743
9744   /* VEX_LEN_0F53_P_1 */
9745   {
9746     { VEX_W_TABLE (VEX_W_0F53_P_1) },
9747     { VEX_W_TABLE (VEX_W_0F53_P_1) },
9748   },
9749
9750   /* VEX_LEN_0F58_P_1 */
9751   {
9752     { VEX_W_TABLE (VEX_W_0F58_P_1) },
9753     { VEX_W_TABLE (VEX_W_0F58_P_1) },
9754   },
9755
9756   /* VEX_LEN_0F58_P_3 */
9757   {
9758     { VEX_W_TABLE (VEX_W_0F58_P_3) },
9759     { VEX_W_TABLE (VEX_W_0F58_P_3) },
9760   },
9761
9762   /* VEX_LEN_0F59_P_1 */
9763   {
9764     { VEX_W_TABLE (VEX_W_0F59_P_1) },
9765     { VEX_W_TABLE (VEX_W_0F59_P_1) },
9766   },
9767
9768   /* VEX_LEN_0F59_P_3 */
9769   {
9770     { VEX_W_TABLE (VEX_W_0F59_P_3) },
9771     { VEX_W_TABLE (VEX_W_0F59_P_3) },
9772   },
9773
9774   /* VEX_LEN_0F5A_P_1 */
9775   {
9776     { VEX_W_TABLE (VEX_W_0F5A_P_1) },
9777     { VEX_W_TABLE (VEX_W_0F5A_P_1) },
9778   },
9779
9780   /* VEX_LEN_0F5A_P_3 */
9781   {
9782     { VEX_W_TABLE (VEX_W_0F5A_P_3) },
9783     { VEX_W_TABLE (VEX_W_0F5A_P_3) },
9784   },
9785
9786   /* VEX_LEN_0F5C_P_1 */
9787   {
9788     { VEX_W_TABLE (VEX_W_0F5C_P_1) },
9789     { VEX_W_TABLE (VEX_W_0F5C_P_1) },
9790   },
9791
9792   /* VEX_LEN_0F5C_P_3 */
9793   {
9794     { VEX_W_TABLE (VEX_W_0F5C_P_3) },
9795     { VEX_W_TABLE (VEX_W_0F5C_P_3) },
9796   },
9797
9798   /* VEX_LEN_0F5D_P_1 */
9799   {
9800     { VEX_W_TABLE (VEX_W_0F5D_P_1) },
9801     { VEX_W_TABLE (VEX_W_0F5D_P_1) },
9802   },
9803
9804   /* VEX_LEN_0F5D_P_3 */
9805   {
9806     { VEX_W_TABLE (VEX_W_0F5D_P_3) },
9807     { VEX_W_TABLE (VEX_W_0F5D_P_3) },
9808   },
9809
9810   /* VEX_LEN_0F5E_P_1 */
9811   {
9812     { VEX_W_TABLE (VEX_W_0F5E_P_1) },
9813     { VEX_W_TABLE (VEX_W_0F5E_P_1) },
9814   },
9815
9816   /* VEX_LEN_0F5E_P_3 */
9817   {
9818     { VEX_W_TABLE (VEX_W_0F5E_P_3) },
9819     { VEX_W_TABLE (VEX_W_0F5E_P_3) },
9820   },
9821
9822   /* VEX_LEN_0F5F_P_1 */
9823   {
9824     { VEX_W_TABLE (VEX_W_0F5F_P_1) },
9825     { VEX_W_TABLE (VEX_W_0F5F_P_1) },
9826   },
9827
9828   /* VEX_LEN_0F5F_P_3 */
9829   {
9830     { VEX_W_TABLE (VEX_W_0F5F_P_3) },
9831     { VEX_W_TABLE (VEX_W_0F5F_P_3) },
9832   },
9833
9834   /* VEX_LEN_0F6E_P_2 */
9835   {
9836     { "vmovK",          { XMScalar, Edq }, 0 },
9837     { "vmovK",          { XMScalar, Edq }, 0 },
9838   },
9839
9840   /* VEX_LEN_0F7E_P_1 */
9841   {
9842     { VEX_W_TABLE (VEX_W_0F7E_P_1) },
9843     { VEX_W_TABLE (VEX_W_0F7E_P_1) },
9844   },
9845
9846   /* VEX_LEN_0F7E_P_2 */
9847   {
9848     { "vmovK",          { Edq, XMScalar }, 0 },
9849     { "vmovK",          { Edq, XMScalar }, 0 },
9850   },
9851
9852   /* VEX_LEN_0F90_P_0 */
9853   {
9854     { VEX_W_TABLE (VEX_W_0F90_P_0_LEN_0) },
9855   },
9856
9857   /* VEX_LEN_0F90_P_2 */
9858   {
9859     { VEX_W_TABLE (VEX_W_0F90_P_2_LEN_0) },
9860   },
9861
9862   /* VEX_LEN_0F91_P_0 */
9863   {
9864     { VEX_W_TABLE (VEX_W_0F91_P_0_LEN_0) },
9865   },
9866
9867   /* VEX_LEN_0F91_P_2 */
9868   {
9869     { VEX_W_TABLE (VEX_W_0F91_P_2_LEN_0) },
9870   },
9871
9872   /* VEX_LEN_0F92_P_0 */
9873   {
9874     { VEX_W_TABLE (VEX_W_0F92_P_0_LEN_0) },
9875   },
9876
9877   /* VEX_LEN_0F92_P_2 */
9878   {
9879     { VEX_W_TABLE (VEX_W_0F92_P_2_LEN_0) },
9880   },
9881
9882   /* VEX_LEN_0F92_P_3 */
9883   {
9884     { VEX_W_TABLE (VEX_W_0F92_P_3_LEN_0) },
9885   },
9886
9887   /* VEX_LEN_0F93_P_0 */
9888   {
9889     { VEX_W_TABLE (VEX_W_0F93_P_0_LEN_0) },
9890   },
9891
9892   /* VEX_LEN_0F93_P_2 */
9893   {
9894     { VEX_W_TABLE (VEX_W_0F93_P_2_LEN_0) },
9895   },
9896
9897   /* VEX_LEN_0F93_P_3 */
9898   {
9899     { VEX_W_TABLE (VEX_W_0F93_P_3_LEN_0) },
9900   },
9901
9902   /* VEX_LEN_0F98_P_0 */
9903   {
9904     { VEX_W_TABLE (VEX_W_0F98_P_0_LEN_0) },
9905   },
9906
9907   /* VEX_LEN_0F98_P_2 */
9908   {
9909     { VEX_W_TABLE (VEX_W_0F98_P_2_LEN_0) },
9910   },
9911
9912   /* VEX_LEN_0F99_P_0 */
9913   {
9914     { VEX_W_TABLE (VEX_W_0F99_P_0_LEN_0) },
9915   },
9916
9917   /* VEX_LEN_0F99_P_2 */
9918   {
9919     { VEX_W_TABLE (VEX_W_0F99_P_2_LEN_0) },
9920   },
9921
9922   /* VEX_LEN_0FAE_R_2_M_0 */
9923   {
9924     { VEX_W_TABLE (VEX_W_0FAE_R_2_M_0) },
9925   },
9926
9927   /* VEX_LEN_0FAE_R_3_M_0 */
9928   {
9929     { VEX_W_TABLE (VEX_W_0FAE_R_3_M_0) },
9930   },
9931
9932   /* VEX_LEN_0FC2_P_1 */
9933   {
9934     { VEX_W_TABLE (VEX_W_0FC2_P_1) },
9935     { VEX_W_TABLE (VEX_W_0FC2_P_1) },
9936   },
9937
9938   /* VEX_LEN_0FC2_P_3 */
9939   {
9940     { VEX_W_TABLE (VEX_W_0FC2_P_3) },
9941     { VEX_W_TABLE (VEX_W_0FC2_P_3) },
9942   },
9943
9944   /* VEX_LEN_0FC4_P_2 */
9945   {
9946     { VEX_W_TABLE (VEX_W_0FC4_P_2) },
9947   },
9948
9949   /* VEX_LEN_0FC5_P_2 */
9950   {
9951     { VEX_W_TABLE (VEX_W_0FC5_P_2) },
9952   },
9953
9954   /* VEX_LEN_0FD6_P_2 */
9955   {
9956     { VEX_W_TABLE (VEX_W_0FD6_P_2) },
9957     { VEX_W_TABLE (VEX_W_0FD6_P_2) },
9958   },
9959
9960   /* VEX_LEN_0FF7_P_2 */
9961   {
9962     { VEX_W_TABLE (VEX_W_0FF7_P_2) },
9963   },
9964
9965   /* VEX_LEN_0F3816_P_2 */
9966   {
9967     { Bad_Opcode },
9968     { VEX_W_TABLE (VEX_W_0F3816_P_2) },
9969   },
9970
9971   /* VEX_LEN_0F3819_P_2 */
9972   {
9973     { Bad_Opcode },
9974     { VEX_W_TABLE (VEX_W_0F3819_P_2) },
9975   },
9976
9977   /* VEX_LEN_0F381A_P_2_M_0 */
9978   {
9979     { Bad_Opcode },
9980     { VEX_W_TABLE (VEX_W_0F381A_P_2_M_0) },
9981   },
9982
9983   /* VEX_LEN_0F3836_P_2 */
9984   {
9985     { Bad_Opcode },
9986     { VEX_W_TABLE (VEX_W_0F3836_P_2) },
9987   },
9988
9989   /* VEX_LEN_0F3841_P_2 */
9990   {
9991     { VEX_W_TABLE (VEX_W_0F3841_P_2) },
9992   },
9993
9994   /* VEX_LEN_0F385A_P_2_M_0 */
9995   {
9996     { Bad_Opcode },
9997     { VEX_W_TABLE (VEX_W_0F385A_P_2_M_0) },
9998   },
9999
10000   /* VEX_LEN_0F38DB_P_2 */
10001   {
10002     { VEX_W_TABLE (VEX_W_0F38DB_P_2) },
10003   },
10004
10005   /* VEX_LEN_0F38DC_P_2 */
10006   {
10007     { VEX_W_TABLE (VEX_W_0F38DC_P_2) },
10008   },
10009
10010   /* VEX_LEN_0F38DD_P_2 */
10011   {
10012     { VEX_W_TABLE (VEX_W_0F38DD_P_2) },
10013   },
10014
10015   /* VEX_LEN_0F38DE_P_2 */
10016   {
10017     { VEX_W_TABLE (VEX_W_0F38DE_P_2) },
10018   },
10019
10020   /* VEX_LEN_0F38DF_P_2 */
10021   {
10022     { VEX_W_TABLE (VEX_W_0F38DF_P_2) },
10023   },
10024
10025   /* VEX_LEN_0F38F2_P_0 */
10026   {
10027     { "andnS",          { Gdq, VexGdq, Edq }, 0 },
10028   },
10029
10030   /* VEX_LEN_0F38F3_R_1_P_0 */
10031   {
10032     { "blsrS",          { VexGdq, Edq }, 0 },
10033   },
10034
10035   /* VEX_LEN_0F38F3_R_2_P_0 */
10036   {
10037     { "blsmskS",        { VexGdq, Edq }, 0 },
10038   },
10039
10040   /* VEX_LEN_0F38F3_R_3_P_0 */
10041   {
10042     { "blsiS",          { VexGdq, Edq }, 0 },
10043   },
10044
10045   /* VEX_LEN_0F38F5_P_0 */
10046   {
10047     { "bzhiS",          { Gdq, Edq, VexGdq }, 0 },
10048   },
10049
10050   /* VEX_LEN_0F38F5_P_1 */
10051   {
10052     { "pextS",          { Gdq, VexGdq, Edq }, 0 },
10053   },
10054
10055   /* VEX_LEN_0F38F5_P_3 */
10056   {
10057     { "pdepS",          { Gdq, VexGdq, Edq }, 0 },
10058   },
10059
10060   /* VEX_LEN_0F38F6_P_3 */
10061   {
10062     { "mulxS",          { Gdq, VexGdq, Edq }, 0 },
10063   },
10064
10065   /* VEX_LEN_0F38F7_P_0 */
10066   {
10067     { "bextrS",         { Gdq, Edq, VexGdq }, 0 },
10068   },
10069
10070   /* VEX_LEN_0F38F7_P_1 */
10071   {
10072     { "sarxS",          { Gdq, Edq, VexGdq }, 0 },
10073   },
10074
10075   /* VEX_LEN_0F38F7_P_2 */
10076   {
10077     { "shlxS",          { Gdq, Edq, VexGdq }, 0 },
10078   },
10079
10080   /* VEX_LEN_0F38F7_P_3 */
10081   {
10082     { "shrxS",          { Gdq, Edq, VexGdq }, 0 },
10083   },
10084
10085   /* VEX_LEN_0F3A00_P_2 */
10086   {
10087     { Bad_Opcode },
10088     { VEX_W_TABLE (VEX_W_0F3A00_P_2) },
10089   },
10090
10091   /* VEX_LEN_0F3A01_P_2 */
10092   {
10093     { Bad_Opcode },
10094     { VEX_W_TABLE (VEX_W_0F3A01_P_2) },
10095   },
10096
10097   /* VEX_LEN_0F3A06_P_2 */
10098   {
10099     { Bad_Opcode },
10100     { VEX_W_TABLE (VEX_W_0F3A06_P_2) },
10101   },
10102
10103   /* VEX_LEN_0F3A0A_P_2 */
10104   {
10105     { VEX_W_TABLE (VEX_W_0F3A0A_P_2) },
10106     { VEX_W_TABLE (VEX_W_0F3A0A_P_2) },
10107   },
10108
10109   /* VEX_LEN_0F3A0B_P_2 */
10110   {
10111     { VEX_W_TABLE (VEX_W_0F3A0B_P_2) },
10112     { VEX_W_TABLE (VEX_W_0F3A0B_P_2) },
10113   },
10114
10115   /* VEX_LEN_0F3A14_P_2 */
10116   {
10117     { VEX_W_TABLE (VEX_W_0F3A14_P_2) },
10118   },
10119
10120   /* VEX_LEN_0F3A15_P_2 */
10121   {
10122     { VEX_W_TABLE (VEX_W_0F3A15_P_2) },
10123   },
10124
10125   /* VEX_LEN_0F3A16_P_2  */
10126   {
10127     { "vpextrK",        { Edq, XM, Ib }, 0 },
10128   },
10129
10130   /* VEX_LEN_0F3A17_P_2 */
10131   {
10132     { "vextractps",     { Edqd, XM, Ib }, 0 },
10133   },
10134
10135   /* VEX_LEN_0F3A18_P_2 */
10136   {
10137     { Bad_Opcode },
10138     { VEX_W_TABLE (VEX_W_0F3A18_P_2) },
10139   },
10140
10141   /* VEX_LEN_0F3A19_P_2 */
10142   {
10143     { Bad_Opcode },
10144     { VEX_W_TABLE (VEX_W_0F3A19_P_2) },
10145   },
10146
10147   /* VEX_LEN_0F3A20_P_2 */
10148   {
10149     { VEX_W_TABLE (VEX_W_0F3A20_P_2) },
10150   },
10151
10152   /* VEX_LEN_0F3A21_P_2 */
10153   {
10154     { VEX_W_TABLE (VEX_W_0F3A21_P_2) },
10155   },
10156
10157   /* VEX_LEN_0F3A22_P_2 */
10158   {
10159     { "vpinsrK",        { XM, Vex128, Edq, Ib }, 0 },
10160   },
10161
10162   /* VEX_LEN_0F3A30_P_2 */
10163   {
10164     { VEX_W_TABLE (VEX_W_0F3A30_P_2_LEN_0) },
10165   },
10166
10167   /* VEX_LEN_0F3A31_P_2 */
10168   {
10169     { VEX_W_TABLE (VEX_W_0F3A31_P_2_LEN_0) },
10170   },
10171
10172   /* VEX_LEN_0F3A32_P_2 */
10173   {
10174     { VEX_W_TABLE (VEX_W_0F3A32_P_2_LEN_0) },
10175   },
10176
10177   /* VEX_LEN_0F3A33_P_2 */
10178   {
10179     { VEX_W_TABLE (VEX_W_0F3A33_P_2_LEN_0) },
10180   },
10181
10182   /* VEX_LEN_0F3A38_P_2 */
10183   {
10184     { Bad_Opcode },
10185     { VEX_W_TABLE (VEX_W_0F3A38_P_2) },
10186   },
10187
10188   /* VEX_LEN_0F3A39_P_2 */
10189   {
10190     { Bad_Opcode },
10191     { VEX_W_TABLE (VEX_W_0F3A39_P_2) },
10192   },
10193
10194   /* VEX_LEN_0F3A41_P_2 */
10195   {
10196     { VEX_W_TABLE (VEX_W_0F3A41_P_2) },
10197   },
10198
10199   /* VEX_LEN_0F3A44_P_2 */
10200   {
10201     { VEX_W_TABLE (VEX_W_0F3A44_P_2) },
10202   },
10203
10204   /* VEX_LEN_0F3A46_P_2 */
10205   {
10206     { Bad_Opcode },
10207     { VEX_W_TABLE (VEX_W_0F3A46_P_2) },
10208   },
10209
10210   /* VEX_LEN_0F3A60_P_2 */
10211   {
10212     { VEX_W_TABLE (VEX_W_0F3A60_P_2) },
10213   },
10214
10215   /* VEX_LEN_0F3A61_P_2 */
10216   {
10217     { VEX_W_TABLE (VEX_W_0F3A61_P_2) },
10218   },
10219
10220   /* VEX_LEN_0F3A62_P_2 */
10221   {
10222     { VEX_W_TABLE (VEX_W_0F3A62_P_2) },
10223   },
10224
10225   /* VEX_LEN_0F3A63_P_2 */
10226   {
10227     { VEX_W_TABLE (VEX_W_0F3A63_P_2) },
10228   },
10229
10230   /* VEX_LEN_0F3A6A_P_2 */
10231   {
10232     { "vfmaddss",       { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 }, 0 },
10233   },
10234
10235   /* VEX_LEN_0F3A6B_P_2 */
10236   {
10237     { "vfmaddsd",       { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 }, 0 },
10238   },
10239
10240   /* VEX_LEN_0F3A6E_P_2 */
10241   {
10242     { "vfmsubss",       { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 }, 0 },
10243   },
10244
10245   /* VEX_LEN_0F3A6F_P_2 */
10246   {
10247     { "vfmsubsd",       { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 }, 0 },
10248   },
10249
10250   /* VEX_LEN_0F3A7A_P_2 */
10251   {
10252     { "vfnmaddss",      { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 }, 0 },
10253   },
10254
10255   /* VEX_LEN_0F3A7B_P_2 */
10256   {
10257     { "vfnmaddsd",      { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 }, 0 },
10258   },
10259
10260   /* VEX_LEN_0F3A7E_P_2 */
10261   {
10262     { "vfnmsubss",      { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 }, 0 },
10263   },
10264
10265   /* VEX_LEN_0F3A7F_P_2 */
10266   {
10267     { "vfnmsubsd",      { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 }, 0 },
10268   },
10269
10270   /* VEX_LEN_0F3ADF_P_2 */
10271   {
10272     { VEX_W_TABLE (VEX_W_0F3ADF_P_2) },
10273   },
10274
10275   /* VEX_LEN_0F3AF0_P_3 */
10276   {
10277     { "rorxS",          { Gdq, Edq, Ib }, 0 },
10278   },
10279
10280   /* VEX_LEN_0FXOP_08_CC */
10281   {
10282      { "vpcomb",        { XM, Vex128, EXx, Ib }, 0 },
10283   },
10284
10285   /* VEX_LEN_0FXOP_08_CD */
10286   {
10287      { "vpcomw",        { XM, Vex128, EXx, Ib }, 0 },
10288   },
10289
10290   /* VEX_LEN_0FXOP_08_CE */
10291   {
10292      { "vpcomd",        { XM, Vex128, EXx, Ib }, 0 },
10293   },
10294
10295   /* VEX_LEN_0FXOP_08_CF */
10296   {
10297      { "vpcomq",        { XM, Vex128, EXx, Ib }, 0 },
10298   },
10299
10300   /* VEX_LEN_0FXOP_08_EC */
10301   {
10302      { "vpcomub",       { XM, Vex128, EXx, Ib }, 0 },
10303   },
10304
10305   /* VEX_LEN_0FXOP_08_ED */
10306   {
10307      { "vpcomuw",       { XM, Vex128, EXx, Ib }, 0 },
10308   },
10309
10310   /* VEX_LEN_0FXOP_08_EE */
10311   {
10312      { "vpcomud",       { XM, Vex128, EXx, Ib }, 0 },
10313   },
10314
10315   /* VEX_LEN_0FXOP_08_EF */
10316   {
10317      { "vpcomuq",       { XM, Vex128, EXx, Ib }, 0 },
10318   },
10319
10320   /* VEX_LEN_0FXOP_09_80 */
10321   {
10322     { "vfrczps",        { XM, EXxmm }, 0 },
10323     { "vfrczps",        { XM, EXymmq }, 0 },
10324   },
10325
10326   /* VEX_LEN_0FXOP_09_81 */
10327   {
10328     { "vfrczpd",        { XM, EXxmm }, 0 },
10329     { "vfrczpd",        { XM, EXymmq }, 0 },
10330   },
10331 };
10332
10333 static const struct dis386 vex_w_table[][2] = {
10334   {
10335     /* VEX_W_0F10_P_0 */
10336     { "vmovups",        { XM, EXx }, 0 },
10337   },
10338   {
10339     /* VEX_W_0F10_P_1 */
10340     { "vmovss",         { XMVexScalar, VexScalar, EXdScalar }, 0 },
10341   },
10342   {
10343     /* VEX_W_0F10_P_2 */
10344     { "vmovupd",        { XM, EXx }, 0 },
10345   },
10346   {
10347     /* VEX_W_0F10_P_3 */
10348     { "vmovsd",         { XMVexScalar, VexScalar, EXqScalar }, 0 },
10349   },
10350   {
10351     /* VEX_W_0F11_P_0 */
10352     { "vmovups",        { EXxS, XM }, 0 },
10353   },
10354   {
10355     /* VEX_W_0F11_P_1 */
10356     { "vmovss",         { EXdVexScalarS, VexScalar, XMScalar }, 0 },
10357   },
10358   {
10359     /* VEX_W_0F11_P_2 */
10360     { "vmovupd",        { EXxS, XM }, 0 },
10361   },
10362   {
10363     /* VEX_W_0F11_P_3 */
10364     { "vmovsd",         { EXqVexScalarS, VexScalar, XMScalar }, 0 },
10365   },
10366   {
10367     /* VEX_W_0F12_P_0_M_0 */
10368     { "vmovlps",        { XM, Vex128, EXq }, 0 },
10369   },
10370   {
10371     /* VEX_W_0F12_P_0_M_1 */
10372     { "vmovhlps",       { XM, Vex128, EXq }, 0 },
10373   },
10374   {
10375     /* VEX_W_0F12_P_1 */
10376     { "vmovsldup",      { XM, EXx }, 0 },
10377   },
10378   {
10379     /* VEX_W_0F12_P_2 */
10380     { "vmovlpd",        { XM, Vex128, EXq }, 0 },
10381   },
10382   {
10383     /* VEX_W_0F12_P_3 */
10384     { "vmovddup",       { XM, EXymmq }, 0 },
10385   },
10386   {
10387     /* VEX_W_0F13_M_0 */
10388     { "vmovlpX",        { EXq, XM }, 0 },
10389   },
10390   {
10391     /* VEX_W_0F14 */
10392     { "vunpcklpX",      { XM, Vex, EXx }, 0 },
10393   },
10394   {
10395     /* VEX_W_0F15 */
10396     { "vunpckhpX",      { XM, Vex, EXx }, 0 },
10397   },
10398   {
10399     /* VEX_W_0F16_P_0_M_0 */
10400     { "vmovhps",        { XM, Vex128, EXq }, 0 },
10401   },
10402   {
10403     /* VEX_W_0F16_P_0_M_1 */
10404     { "vmovlhps",       { XM, Vex128, EXq }, 0 },
10405   },
10406   {
10407     /* VEX_W_0F16_P_1 */
10408     { "vmovshdup",      { XM, EXx }, 0 },
10409   },
10410   {
10411     /* VEX_W_0F16_P_2 */
10412     { "vmovhpd",        { XM, Vex128, EXq }, 0 },
10413   },
10414   {
10415     /* VEX_W_0F17_M_0 */
10416     { "vmovhpX",        { EXq, XM }, 0 },
10417   },
10418   {
10419     /* VEX_W_0F28 */
10420     { "vmovapX",        { XM, EXx }, 0 },
10421   },
10422   {
10423     /* VEX_W_0F29 */
10424     { "vmovapX",        { EXxS, XM }, 0 },
10425   },
10426   {
10427     /* VEX_W_0F2B_M_0 */
10428     { "vmovntpX",       { Mx, XM }, 0 },
10429   },
10430   {
10431     /* VEX_W_0F2E_P_0 */
10432     { "vucomiss",       { XMScalar, EXdScalar }, 0 },
10433   },
10434   {
10435     /* VEX_W_0F2E_P_2 */
10436     { "vucomisd",       { XMScalar, EXqScalar }, 0 },
10437   },
10438   {
10439     /* VEX_W_0F2F_P_0 */
10440     { "vcomiss",        { XMScalar, EXdScalar }, 0 },
10441   },
10442   {
10443     /* VEX_W_0F2F_P_2 */
10444     { "vcomisd",        { XMScalar, EXqScalar }, 0 },
10445   },
10446   {
10447     /* VEX_W_0F41_P_0_LEN_1 */
10448     { "kandw",          { MaskG, MaskVex, MaskR }, 0 },
10449     { "kandq",          { MaskG, MaskVex, MaskR }, 0 },
10450   },
10451   {
10452     /* VEX_W_0F41_P_2_LEN_1 */
10453     { "kandb",          { MaskG, MaskVex, MaskR }, 0 },
10454     { "kandd",          { MaskG, MaskVex, MaskR }, 0 },
10455   },
10456   {
10457     /* VEX_W_0F42_P_0_LEN_1 */
10458     { "kandnw",         { MaskG, MaskVex, MaskR }, 0 },
10459     { "kandnq",         { MaskG, MaskVex, MaskR }, 0 },
10460   },
10461   {
10462     /* VEX_W_0F42_P_2_LEN_1 */
10463     { "kandnb",         { MaskG, MaskVex, MaskR }, 0 },
10464     { "kandnd",         { MaskG, MaskVex, MaskR }, 0 },
10465   },
10466   {
10467     /* VEX_W_0F44_P_0_LEN_0 */
10468     { "knotw",          { MaskG, MaskR }, 0 },
10469     { "knotq",          { MaskG, MaskR }, 0 },
10470   },
10471   {
10472     /* VEX_W_0F44_P_2_LEN_0 */
10473     { "knotb",          { MaskG, MaskR }, 0 },
10474     { "knotd",          { MaskG, MaskR }, 0 },
10475   },
10476   {
10477     /* VEX_W_0F45_P_0_LEN_1 */
10478     { "korw",           { MaskG, MaskVex, MaskR }, 0 },
10479     { "korq",           { MaskG, MaskVex, MaskR }, 0 },
10480   },
10481   {
10482     /* VEX_W_0F45_P_2_LEN_1 */
10483     { "korb",           { MaskG, MaskVex, MaskR }, 0 },
10484     { "kord",           { MaskG, MaskVex, MaskR }, 0 },
10485   },
10486   {
10487     /* VEX_W_0F46_P_0_LEN_1 */
10488     { "kxnorw",         { MaskG, MaskVex, MaskR }, 0 },
10489     { "kxnorq",         { MaskG, MaskVex, MaskR }, 0 },
10490   },
10491   {
10492     /* VEX_W_0F46_P_2_LEN_1 */
10493     { "kxnorb",         { MaskG, MaskVex, MaskR }, 0 },
10494     { "kxnord",         { MaskG, MaskVex, MaskR }, 0 },
10495   },
10496   {
10497     /* VEX_W_0F47_P_0_LEN_1 */
10498     { "kxorw",          { MaskG, MaskVex, MaskR }, 0 },
10499     { "kxorq",          { MaskG, MaskVex, MaskR }, 0 },
10500   },
10501   {
10502     /* VEX_W_0F47_P_2_LEN_1 */
10503     { "kxorb",          { MaskG, MaskVex, MaskR }, 0 },
10504     { "kxord",          { MaskG, MaskVex, MaskR }, 0 },
10505   },
10506   {
10507     /* VEX_W_0F4A_P_0_LEN_1 */
10508     { "kaddw",          { MaskG, MaskVex, MaskR }, 0 },
10509     { "kaddq",          { MaskG, MaskVex, MaskR }, 0 },
10510   },
10511   {
10512     /* VEX_W_0F4A_P_2_LEN_1 */
10513     { "kaddb",          { MaskG, MaskVex, MaskR }, 0 },
10514     { "kaddd",          { MaskG, MaskVex, MaskR }, 0 },
10515   },
10516   {
10517     /* VEX_W_0F4B_P_0_LEN_1 */
10518     { "kunpckwd",       { MaskG, MaskVex, MaskR }, 0 },
10519     { "kunpckdq",       { MaskG, MaskVex, MaskR }, 0 },
10520   },
10521   {
10522     /* VEX_W_0F4B_P_2_LEN_1 */
10523     { "kunpckbw",       { MaskG, MaskVex, MaskR }, 0 },
10524   },
10525   {
10526     /* VEX_W_0F50_M_0 */
10527     { "vmovmskpX",      { Gdq, XS }, 0 },
10528   },
10529   {
10530     /* VEX_W_0F51_P_0 */
10531     { "vsqrtps",        { XM, EXx }, 0 },
10532   },
10533   {
10534     /* VEX_W_0F51_P_1 */
10535     { "vsqrtss",        { XMScalar, VexScalar, EXdScalar }, 0 },
10536   },
10537   {
10538     /* VEX_W_0F51_P_2  */
10539     { "vsqrtpd",        { XM, EXx }, 0 },
10540   },
10541   {
10542     /* VEX_W_0F51_P_3 */
10543     { "vsqrtsd",        { XMScalar, VexScalar, EXqScalar }, 0 },
10544   },
10545   {
10546     /* VEX_W_0F52_P_0 */
10547     { "vrsqrtps",       { XM, EXx }, 0 },
10548   },
10549   {
10550     /* VEX_W_0F52_P_1 */
10551     { "vrsqrtss",       { XMScalar, VexScalar, EXdScalar }, 0 },
10552   },
10553   {
10554     /* VEX_W_0F53_P_0  */
10555     { "vrcpps",         { XM, EXx }, 0 },
10556   },
10557   {
10558     /* VEX_W_0F53_P_1  */
10559     { "vrcpss",         { XMScalar, VexScalar, EXdScalar }, 0 },
10560   },
10561   {
10562     /* VEX_W_0F58_P_0  */
10563     { "vaddps",         { XM, Vex, EXx }, 0 },
10564   },
10565   {
10566     /* VEX_W_0F58_P_1  */
10567     { "vaddss",         { XMScalar, VexScalar, EXdScalar }, 0 },
10568   },
10569   {
10570     /* VEX_W_0F58_P_2  */
10571     { "vaddpd",         { XM, Vex, EXx }, 0 },
10572   },
10573   {
10574     /* VEX_W_0F58_P_3  */
10575     { "vaddsd",         { XMScalar, VexScalar, EXqScalar }, 0 },
10576   },
10577   {
10578     /* VEX_W_0F59_P_0  */
10579     { "vmulps",         { XM, Vex, EXx }, 0 },
10580   },
10581   {
10582     /* VEX_W_0F59_P_1  */
10583     { "vmulss",         { XMScalar, VexScalar, EXdScalar }, 0 },
10584   },
10585   {
10586     /* VEX_W_0F59_P_2  */
10587     { "vmulpd",         { XM, Vex, EXx }, 0 },
10588   },
10589   {
10590     /* VEX_W_0F59_P_3  */
10591     { "vmulsd",         { XMScalar, VexScalar, EXqScalar }, 0 },
10592   },
10593   {
10594     /* VEX_W_0F5A_P_0  */
10595     { "vcvtps2pd",      { XM, EXxmmq }, 0 },
10596   },
10597   {
10598     /* VEX_W_0F5A_P_1  */
10599     { "vcvtss2sd",      { XMScalar, VexScalar, EXdScalar }, 0 },
10600   },
10601   {
10602     /* VEX_W_0F5A_P_3  */
10603     { "vcvtsd2ss",      { XMScalar, VexScalar, EXqScalar }, 0 },
10604   },
10605   {
10606     /* VEX_W_0F5B_P_0  */
10607     { "vcvtdq2ps",      { XM, EXx }, 0 },
10608   },
10609   {
10610     /* VEX_W_0F5B_P_1  */
10611     { "vcvttps2dq",     { XM, EXx }, 0 },
10612   },
10613   {
10614     /* VEX_W_0F5B_P_2  */
10615     { "vcvtps2dq",      { XM, EXx }, 0 },
10616   },
10617   {
10618     /* VEX_W_0F5C_P_0  */
10619     { "vsubps",         { XM, Vex, EXx }, 0 },
10620   },
10621   {
10622     /* VEX_W_0F5C_P_1  */
10623     { "vsubss",         { XMScalar, VexScalar, EXdScalar }, 0 },
10624   },
10625   {
10626     /* VEX_W_0F5C_P_2  */
10627     { "vsubpd",         { XM, Vex, EXx }, 0 },
10628   },
10629   {
10630     /* VEX_W_0F5C_P_3  */
10631     { "vsubsd",         { XMScalar, VexScalar, EXqScalar }, 0 },
10632   },
10633   {
10634     /* VEX_W_0F5D_P_0  */
10635     { "vminps",         { XM, Vex, EXx }, 0 },
10636   },
10637   {
10638     /* VEX_W_0F5D_P_1  */
10639     { "vminss",         { XMScalar, VexScalar, EXdScalar }, 0 },
10640   },
10641   {
10642     /* VEX_W_0F5D_P_2  */
10643     { "vminpd",         { XM, Vex, EXx }, 0 },
10644   },
10645   {
10646     /* VEX_W_0F5D_P_3  */
10647     { "vminsd",         { XMScalar, VexScalar, EXqScalar }, 0 },
10648   },
10649   {
10650     /* VEX_W_0F5E_P_0  */
10651     { "vdivps",         { XM, Vex, EXx }, 0 },
10652   },
10653   {
10654     /* VEX_W_0F5E_P_1  */
10655     { "vdivss",         { XMScalar, VexScalar, EXdScalar }, 0 },
10656   },
10657   {
10658     /* VEX_W_0F5E_P_2  */
10659     { "vdivpd",         { XM, Vex, EXx }, 0 },
10660   },
10661   {
10662     /* VEX_W_0F5E_P_3  */
10663     { "vdivsd",         { XMScalar, VexScalar, EXqScalar }, 0 },
10664   },
10665   {
10666     /* VEX_W_0F5F_P_0  */
10667     { "vmaxps",         { XM, Vex, EXx }, 0 },
10668   },
10669   {
10670     /* VEX_W_0F5F_P_1  */
10671     { "vmaxss",         { XMScalar, VexScalar, EXdScalar }, 0 },
10672   },
10673   {
10674     /* VEX_W_0F5F_P_2  */
10675     { "vmaxpd",         { XM, Vex, EXx }, 0 },
10676   },
10677   {
10678     /* VEX_W_0F5F_P_3  */
10679     { "vmaxsd",         { XMScalar, VexScalar, EXqScalar }, 0 },
10680   },
10681   {
10682     /* VEX_W_0F60_P_2  */
10683     { "vpunpcklbw",     { XM, Vex, EXx }, 0 },
10684   },
10685   {
10686     /* VEX_W_0F61_P_2  */
10687     { "vpunpcklwd",     { XM, Vex, EXx }, 0 },
10688   },
10689   {
10690     /* VEX_W_0F62_P_2  */
10691     { "vpunpckldq",     { XM, Vex, EXx }, 0 },
10692   },
10693   {
10694     /* VEX_W_0F63_P_2  */
10695     { "vpacksswb",      { XM, Vex, EXx }, 0 },
10696   },
10697   {
10698     /* VEX_W_0F64_P_2  */
10699     { "vpcmpgtb",       { XM, Vex, EXx }, 0 },
10700   },
10701   {
10702     /* VEX_W_0F65_P_2  */
10703     { "vpcmpgtw",       { XM, Vex, EXx }, 0 },
10704   },
10705   {
10706     /* VEX_W_0F66_P_2  */
10707     { "vpcmpgtd",       { XM, Vex, EXx }, 0 },
10708   },
10709   {
10710     /* VEX_W_0F67_P_2  */
10711     { "vpackuswb",      { XM, Vex, EXx }, 0 },
10712   },
10713   {
10714     /* VEX_W_0F68_P_2  */
10715     { "vpunpckhbw",     { XM, Vex, EXx }, 0 },
10716   },
10717   {
10718     /* VEX_W_0F69_P_2  */
10719     { "vpunpckhwd",     { XM, Vex, EXx }, 0 },
10720   },
10721   {
10722     /* VEX_W_0F6A_P_2  */
10723     { "vpunpckhdq",     { XM, Vex, EXx }, 0 },
10724   },
10725   {
10726     /* VEX_W_0F6B_P_2  */
10727     { "vpackssdw",      { XM, Vex, EXx }, 0 },
10728   },
10729   {
10730     /* VEX_W_0F6C_P_2  */
10731     { "vpunpcklqdq",    { XM, Vex, EXx }, 0 },
10732   },
10733   {
10734     /* VEX_W_0F6D_P_2  */
10735     { "vpunpckhqdq",    { XM, Vex, EXx }, 0 },
10736   },
10737   {
10738     /* VEX_W_0F6F_P_1  */
10739     { "vmovdqu",        { XM, EXx }, 0 },
10740   },
10741   {
10742     /* VEX_W_0F6F_P_2  */
10743     { "vmovdqa",        { XM, EXx }, 0 },
10744   },
10745   {
10746     /* VEX_W_0F70_P_1 */
10747     { "vpshufhw",       { XM, EXx, Ib }, 0 },
10748   },
10749   {
10750     /* VEX_W_0F70_P_2 */
10751     { "vpshufd",        { XM, EXx, Ib }, 0 },
10752   },
10753   {
10754     /* VEX_W_0F70_P_3 */
10755     { "vpshuflw",       { XM, EXx, Ib }, 0 },
10756   },
10757   {
10758     /* VEX_W_0F71_R_2_P_2  */
10759     { "vpsrlw",         { Vex, XS, Ib }, 0 },
10760   },
10761   {
10762     /* VEX_W_0F71_R_4_P_2  */
10763     { "vpsraw",         { Vex, XS, Ib }, 0 },
10764   },
10765   {
10766     /* VEX_W_0F71_R_6_P_2  */
10767     { "vpsllw",         { Vex, XS, Ib }, 0 },
10768   },
10769   {
10770     /* VEX_W_0F72_R_2_P_2  */
10771     { "vpsrld",         { Vex, XS, Ib }, 0 },
10772   },
10773   {
10774     /* VEX_W_0F72_R_4_P_2  */
10775     { "vpsrad",         { Vex, XS, Ib }, 0 },
10776   },
10777   {
10778     /* VEX_W_0F72_R_6_P_2  */
10779     { "vpslld",         { Vex, XS, Ib }, 0 },
10780   },
10781   {
10782     /* VEX_W_0F73_R_2_P_2  */
10783     { "vpsrlq",         { Vex, XS, Ib }, 0 },
10784   },
10785   {
10786     /* VEX_W_0F73_R_3_P_2  */
10787     { "vpsrldq",        { Vex, XS, Ib }, 0 },
10788   },
10789   {
10790     /* VEX_W_0F73_R_6_P_2  */
10791     { "vpsllq",         { Vex, XS, Ib }, 0 },
10792   },
10793   {
10794     /* VEX_W_0F73_R_7_P_2  */
10795     { "vpslldq",        { Vex, XS, Ib }, 0 },
10796   },
10797   {
10798     /* VEX_W_0F74_P_2 */
10799     { "vpcmpeqb",       { XM, Vex, EXx }, 0 },
10800   },
10801   {
10802     /* VEX_W_0F75_P_2 */
10803     { "vpcmpeqw",       { XM, Vex, EXx }, 0 },
10804   },
10805   {
10806     /* VEX_W_0F76_P_2 */
10807     { "vpcmpeqd",       { XM, Vex, EXx }, 0 },
10808   },
10809   {
10810     /* VEX_W_0F77_P_0 */
10811     { "",               { VZERO }, 0 },
10812   },
10813   {
10814     /* VEX_W_0F7C_P_2 */
10815     { "vhaddpd",        { XM, Vex, EXx }, 0 },
10816   },
10817   {
10818     /* VEX_W_0F7C_P_3 */
10819     { "vhaddps",        { XM, Vex, EXx }, 0 },
10820   },
10821   {
10822     /* VEX_W_0F7D_P_2 */
10823     { "vhsubpd",        { XM, Vex, EXx }, 0 },
10824   },
10825   {
10826     /* VEX_W_0F7D_P_3 */
10827     { "vhsubps",        { XM, Vex, EXx }, 0 },
10828   },
10829   {
10830     /* VEX_W_0F7E_P_1 */
10831     { "vmovq",          { XMScalar, EXqScalar }, 0 },
10832   },
10833   {
10834     /* VEX_W_0F7F_P_1 */
10835     { "vmovdqu",        { EXxS, XM }, 0 },
10836   },
10837   {
10838     /* VEX_W_0F7F_P_2 */
10839     { "vmovdqa",        { EXxS, XM }, 0 },
10840   },
10841   {
10842     /* VEX_W_0F90_P_0_LEN_0 */
10843     { "kmovw",          { MaskG, MaskE }, 0 },
10844     { "kmovq",          { MaskG, MaskE }, 0 },
10845   },
10846   {
10847     /* VEX_W_0F90_P_2_LEN_0 */
10848     { "kmovb",          { MaskG, MaskBDE }, 0 },
10849     { "kmovd",          { MaskG, MaskBDE }, 0 },
10850   },
10851   {
10852     /* VEX_W_0F91_P_0_LEN_0 */
10853     { "kmovw",          { Ew, MaskG }, 0 },
10854     { "kmovq",          { Eq, MaskG }, 0 },
10855   },
10856   {
10857     /* VEX_W_0F91_P_2_LEN_0 */
10858     { "kmovb",          { Eb, MaskG }, 0 },
10859     { "kmovd",          { Ed, MaskG }, 0 },
10860   },
10861   {
10862     /* VEX_W_0F92_P_0_LEN_0 */
10863     { "kmovw",          { MaskG, Rdq }, 0 },
10864   },
10865   {
10866     /* VEX_W_0F92_P_2_LEN_0 */
10867     { "kmovb",          { MaskG, Rdq }, 0 },
10868   },
10869   {
10870     /* VEX_W_0F92_P_3_LEN_0 */
10871     { "kmovd",          { MaskG, Rdq }, 0 },
10872     { "kmovq",          { MaskG, Rdq }, 0 },
10873   },
10874   {
10875     /* VEX_W_0F93_P_0_LEN_0 */
10876     { "kmovw",          { Gdq, MaskR }, 0 },
10877   },
10878   {
10879     /* VEX_W_0F93_P_2_LEN_0 */
10880     { "kmovb",          { Gdq, MaskR }, 0 },
10881   },
10882   {
10883     /* VEX_W_0F93_P_3_LEN_0 */
10884     { "kmovd",          { Gdq, MaskR }, 0 },
10885     { "kmovq",          { Gdq, MaskR }, 0 },
10886   },
10887   {
10888     /* VEX_W_0F98_P_0_LEN_0 */
10889     { "kortestw",       { MaskG, MaskR }, 0 },
10890     { "kortestq",       { MaskG, MaskR }, 0 },
10891   },
10892   {
10893     /* VEX_W_0F98_P_2_LEN_0 */
10894     { "kortestb",       { MaskG, MaskR }, 0 },
10895     { "kortestd",       { MaskG, MaskR }, 0 },
10896   },
10897   {
10898     /* VEX_W_0F99_P_0_LEN_0 */
10899     { "ktestw", { MaskG, MaskR }, 0 },
10900     { "ktestq", { MaskG, MaskR }, 0 },
10901   },
10902   {
10903     /* VEX_W_0F99_P_2_LEN_0 */
10904     { "ktestb", { MaskG, MaskR }, 0 },
10905     { "ktestd", { MaskG, MaskR }, 0 },
10906   },
10907   {
10908     /* VEX_W_0FAE_R_2_M_0 */
10909     { "vldmxcsr",       { Md }, 0 },
10910   },
10911   {
10912     /* VEX_W_0FAE_R_3_M_0 */
10913     { "vstmxcsr",       { Md }, 0 },
10914   },
10915   {
10916     /* VEX_W_0FC2_P_0 */
10917     { "vcmpps",         { XM, Vex, EXx, VCMP }, 0 },
10918   },
10919   {
10920     /* VEX_W_0FC2_P_1 */
10921     { "vcmpss",         { XMScalar, VexScalar, EXdScalar, VCMP }, 0 },
10922   },
10923   {
10924     /* VEX_W_0FC2_P_2 */
10925     { "vcmppd",         { XM, Vex, EXx, VCMP }, 0 },
10926   },
10927   {
10928     /* VEX_W_0FC2_P_3 */
10929     { "vcmpsd",         { XMScalar, VexScalar, EXqScalar, VCMP }, 0 },
10930   },
10931   {
10932     /* VEX_W_0FC4_P_2 */
10933     { "vpinsrw",        { XM, Vex128, Edqw, Ib }, 0 },
10934   },
10935   {
10936     /* VEX_W_0FC5_P_2 */
10937     { "vpextrw",        { Gdq, XS, Ib }, 0 },
10938   },
10939   {
10940     /* VEX_W_0FD0_P_2 */
10941     { "vaddsubpd",      { XM, Vex, EXx }, 0 },
10942   },
10943   {
10944     /* VEX_W_0FD0_P_3 */
10945     { "vaddsubps",      { XM, Vex, EXx }, 0 },
10946   },
10947   {
10948     /* VEX_W_0FD1_P_2 */
10949     { "vpsrlw",         { XM, Vex, EXxmm }, 0 },
10950   },
10951   {
10952     /* VEX_W_0FD2_P_2 */
10953     { "vpsrld",         { XM, Vex, EXxmm }, 0 },
10954   },
10955   {
10956     /* VEX_W_0FD3_P_2 */
10957     { "vpsrlq",         { XM, Vex, EXxmm }, 0 },
10958   },
10959   {
10960     /* VEX_W_0FD4_P_2 */
10961     { "vpaddq",         { XM, Vex, EXx }, 0 },
10962   },
10963   {
10964     /* VEX_W_0FD5_P_2 */
10965     { "vpmullw",        { XM, Vex, EXx }, 0 },
10966   },
10967   {
10968     /* VEX_W_0FD6_P_2 */
10969     { "vmovq",          { EXqScalarS, XMScalar }, 0 },
10970   },
10971   {
10972     /* VEX_W_0FD7_P_2_M_1 */
10973     { "vpmovmskb",      { Gdq, XS }, 0 },
10974   },
10975   {
10976     /* VEX_W_0FD8_P_2 */
10977     { "vpsubusb",       { XM, Vex, EXx }, 0 },
10978   },
10979   {
10980     /* VEX_W_0FD9_P_2 */
10981     { "vpsubusw",       { XM, Vex, EXx }, 0 },
10982   },
10983   {
10984     /* VEX_W_0FDA_P_2 */
10985     { "vpminub",        { XM, Vex, EXx }, 0 },
10986   },
10987   {
10988     /* VEX_W_0FDB_P_2 */
10989     { "vpand",          { XM, Vex, EXx }, 0 },
10990   },
10991   {
10992     /* VEX_W_0FDC_P_2 */
10993     { "vpaddusb",       { XM, Vex, EXx }, 0 },
10994   },
10995   {
10996     /* VEX_W_0FDD_P_2 */
10997     { "vpaddusw",       { XM, Vex, EXx }, 0 },
10998   },
10999   {
11000     /* VEX_W_0FDE_P_2 */
11001     { "vpmaxub",        { XM, Vex, EXx }, 0 },
11002   },
11003   {
11004     /* VEX_W_0FDF_P_2 */
11005     { "vpandn",         { XM, Vex, EXx }, 0 },
11006   },
11007   {
11008     /* VEX_W_0FE0_P_2  */
11009     { "vpavgb",         { XM, Vex, EXx }, 0 },
11010   },
11011   {
11012     /* VEX_W_0FE1_P_2  */
11013     { "vpsraw",         { XM, Vex, EXxmm }, 0 },
11014   },
11015   {
11016     /* VEX_W_0FE2_P_2  */
11017     { "vpsrad",         { XM, Vex, EXxmm }, 0 },
11018   },
11019   {
11020     /* VEX_W_0FE3_P_2  */
11021     { "vpavgw",         { XM, Vex, EXx }, 0 },
11022   },
11023   {
11024     /* VEX_W_0FE4_P_2  */
11025     { "vpmulhuw",       { XM, Vex, EXx }, 0 },
11026   },
11027   {
11028     /* VEX_W_0FE5_P_2  */
11029     { "vpmulhw",        { XM, Vex, EXx }, 0 },
11030   },
11031   {
11032     /* VEX_W_0FE6_P_1  */
11033     { "vcvtdq2pd",      { XM, EXxmmq }, 0 },
11034   },
11035   {
11036     /* VEX_W_0FE6_P_2  */
11037     { "vcvttpd2dq%XY",  { XMM, EXx }, 0 },
11038   },
11039   {
11040     /* VEX_W_0FE6_P_3  */
11041     { "vcvtpd2dq%XY",   { XMM, EXx }, 0 },
11042   },
11043   {
11044     /* VEX_W_0FE7_P_2_M_0 */
11045     { "vmovntdq",       { Mx, XM }, 0 },
11046   },
11047   {
11048     /* VEX_W_0FE8_P_2  */
11049     { "vpsubsb",        { XM, Vex, EXx }, 0 },
11050   },
11051   {
11052     /* VEX_W_0FE9_P_2  */
11053     { "vpsubsw",        { XM, Vex, EXx }, 0 },
11054   },
11055   {
11056     /* VEX_W_0FEA_P_2  */
11057     { "vpminsw",        { XM, Vex, EXx }, 0 },
11058   },
11059   {
11060     /* VEX_W_0FEB_P_2  */
11061     { "vpor",           { XM, Vex, EXx }, 0 },
11062   },
11063   {
11064     /* VEX_W_0FEC_P_2  */
11065     { "vpaddsb",        { XM, Vex, EXx }, 0 },
11066   },
11067   {
11068     /* VEX_W_0FED_P_2  */
11069     { "vpaddsw",        { XM, Vex, EXx }, 0 },
11070   },
11071   {
11072     /* VEX_W_0FEE_P_2  */
11073     { "vpmaxsw",        { XM, Vex, EXx }, 0 },
11074   },
11075   {
11076     /* VEX_W_0FEF_P_2  */
11077     { "vpxor",          { XM, Vex, EXx }, 0 },
11078   },
11079   {
11080     /* VEX_W_0FF0_P_3_M_0 */
11081     { "vlddqu",         { XM, M }, 0 },
11082   },
11083   {
11084     /* VEX_W_0FF1_P_2 */
11085     { "vpsllw",         { XM, Vex, EXxmm }, 0 },
11086   },
11087   {
11088     /* VEX_W_0FF2_P_2 */
11089     { "vpslld",         { XM, Vex, EXxmm }, 0 },
11090   },
11091   {
11092     /* VEX_W_0FF3_P_2 */
11093     { "vpsllq",         { XM, Vex, EXxmm }, 0 },
11094   },
11095   {
11096     /* VEX_W_0FF4_P_2 */
11097     { "vpmuludq",       { XM, Vex, EXx }, 0 },
11098   },
11099   {
11100     /* VEX_W_0FF5_P_2 */
11101     { "vpmaddwd",       { XM, Vex, EXx }, 0 },
11102   },
11103   {
11104     /* VEX_W_0FF6_P_2 */
11105     { "vpsadbw",        { XM, Vex, EXx }, 0 },
11106   },
11107   {
11108     /* VEX_W_0FF7_P_2 */
11109     { "vmaskmovdqu",    { XM, XS }, 0 },
11110   },
11111   {
11112     /* VEX_W_0FF8_P_2 */
11113     { "vpsubb",         { XM, Vex, EXx }, 0 },
11114   },
11115   {
11116     /* VEX_W_0FF9_P_2 */
11117     { "vpsubw",         { XM, Vex, EXx }, 0 },
11118   },
11119   {
11120     /* VEX_W_0FFA_P_2 */
11121     { "vpsubd",         { XM, Vex, EXx }, 0 },
11122   },
11123   {
11124     /* VEX_W_0FFB_P_2 */
11125     { "vpsubq",         { XM, Vex, EXx }, 0 },
11126   },
11127   {
11128     /* VEX_W_0FFC_P_2 */
11129     { "vpaddb",         { XM, Vex, EXx }, 0 },
11130   },
11131   {
11132     /* VEX_W_0FFD_P_2 */
11133     { "vpaddw",         { XM, Vex, EXx }, 0 },
11134   },
11135   {
11136     /* VEX_W_0FFE_P_2 */
11137     { "vpaddd",         { XM, Vex, EXx }, 0 },
11138   },
11139   {
11140     /* VEX_W_0F3800_P_2  */
11141     { "vpshufb",        { XM, Vex, EXx }, 0 },
11142   },
11143   {
11144     /* VEX_W_0F3801_P_2  */
11145     { "vphaddw",        { XM, Vex, EXx }, 0 },
11146   },
11147   {
11148     /* VEX_W_0F3802_P_2  */
11149     { "vphaddd",        { XM, Vex, EXx }, 0 },
11150   },
11151   {
11152     /* VEX_W_0F3803_P_2  */
11153     { "vphaddsw",       { XM, Vex, EXx }, 0 },
11154   },
11155   {
11156     /* VEX_W_0F3804_P_2  */
11157     { "vpmaddubsw",     { XM, Vex, EXx }, 0 },
11158   },
11159   {
11160     /* VEX_W_0F3805_P_2  */
11161     { "vphsubw",        { XM, Vex, EXx }, 0 },
11162   },
11163   {
11164     /* VEX_W_0F3806_P_2  */
11165     { "vphsubd",        { XM, Vex, EXx }, 0 },
11166   },
11167   {
11168     /* VEX_W_0F3807_P_2  */
11169     { "vphsubsw",       { XM, Vex, EXx }, 0 },
11170   },
11171   {
11172     /* VEX_W_0F3808_P_2  */
11173     { "vpsignb",        { XM, Vex, EXx }, 0 },
11174   },
11175   {
11176     /* VEX_W_0F3809_P_2  */
11177     { "vpsignw",        { XM, Vex, EXx }, 0 },
11178   },
11179   {
11180     /* VEX_W_0F380A_P_2  */
11181     { "vpsignd",        { XM, Vex, EXx }, 0 },
11182   },
11183   {
11184     /* VEX_W_0F380B_P_2  */
11185     { "vpmulhrsw",      { XM, Vex, EXx }, 0 },
11186   },
11187   {
11188     /* VEX_W_0F380C_P_2  */
11189     { "vpermilps",      { XM, Vex, EXx }, 0 },
11190   },
11191   {
11192     /* VEX_W_0F380D_P_2  */
11193     { "vpermilpd",      { XM, Vex, EXx }, 0 },
11194   },
11195   {
11196     /* VEX_W_0F380E_P_2  */
11197     { "vtestps",        { XM, EXx }, 0 },
11198   },
11199   {
11200     /* VEX_W_0F380F_P_2  */
11201     { "vtestpd",        { XM, EXx }, 0 },
11202   },
11203   {
11204     /* VEX_W_0F3816_P_2  */
11205     { "vpermps",        { XM, Vex, EXx }, 0 },
11206   },
11207   {
11208     /* VEX_W_0F3817_P_2 */
11209     { "vptest",         { XM, EXx }, 0 },
11210   },
11211   {
11212     /* VEX_W_0F3818_P_2 */
11213     { "vbroadcastss",   { XM, EXxmm_md }, 0 },
11214   },
11215   {
11216     /* VEX_W_0F3819_P_2 */
11217     { "vbroadcastsd",   { XM, EXxmm_mq }, 0 },
11218   },
11219   {
11220     /* VEX_W_0F381A_P_2_M_0 */
11221     { "vbroadcastf128", { XM, Mxmm }, 0 },
11222   },
11223   {
11224     /* VEX_W_0F381C_P_2 */
11225     { "vpabsb",         { XM, EXx }, 0 },
11226   },
11227   {
11228     /* VEX_W_0F381D_P_2 */
11229     { "vpabsw",         { XM, EXx }, 0 },
11230   },
11231   {
11232     /* VEX_W_0F381E_P_2 */
11233     { "vpabsd",         { XM, EXx }, 0 },
11234   },
11235   {
11236     /* VEX_W_0F3820_P_2 */
11237     { "vpmovsxbw",      { XM, EXxmmq }, 0 },
11238   },
11239   {
11240     /* VEX_W_0F3821_P_2 */
11241     { "vpmovsxbd",      { XM, EXxmmqd }, 0 },
11242   },
11243   {
11244     /* VEX_W_0F3822_P_2 */
11245     { "vpmovsxbq",      { XM, EXxmmdw }, 0 },
11246   },
11247   {
11248     /* VEX_W_0F3823_P_2 */
11249     { "vpmovsxwd",      { XM, EXxmmq }, 0 },
11250   },
11251   {
11252     /* VEX_W_0F3824_P_2 */
11253     { "vpmovsxwq",      { XM, EXxmmqd }, 0 },
11254   },
11255   {
11256     /* VEX_W_0F3825_P_2 */
11257     { "vpmovsxdq",      { XM, EXxmmq }, 0 },
11258   },
11259   {
11260     /* VEX_W_0F3828_P_2 */
11261     { "vpmuldq",        { XM, Vex, EXx }, 0 },
11262   },
11263   {
11264     /* VEX_W_0F3829_P_2 */
11265     { "vpcmpeqq",       { XM, Vex, EXx }, 0 },
11266   },
11267   {
11268     /* VEX_W_0F382A_P_2_M_0 */
11269     { "vmovntdqa",      { XM, Mx }, 0 },
11270   },
11271   {
11272     /* VEX_W_0F382B_P_2 */
11273     { "vpackusdw",      { XM, Vex, EXx }, 0 },
11274   },
11275   {
11276     /* VEX_W_0F382C_P_2_M_0 */
11277     { "vmaskmovps",     { XM, Vex, Mx }, 0 },
11278   },
11279   {
11280     /* VEX_W_0F382D_P_2_M_0 */
11281     { "vmaskmovpd",     { XM, Vex, Mx }, 0 },
11282   },
11283   {
11284     /* VEX_W_0F382E_P_2_M_0 */
11285     { "vmaskmovps",     { Mx, Vex, XM }, 0 },
11286   },
11287   {
11288     /* VEX_W_0F382F_P_2_M_0 */
11289     { "vmaskmovpd",     { Mx, Vex, XM }, 0 },
11290   },
11291   {
11292     /* VEX_W_0F3830_P_2 */
11293     { "vpmovzxbw",      { XM, EXxmmq }, 0 },
11294   },
11295   {
11296     /* VEX_W_0F3831_P_2 */
11297     { "vpmovzxbd",      { XM, EXxmmqd }, 0 },
11298   },
11299   {
11300     /* VEX_W_0F3832_P_2 */
11301     { "vpmovzxbq",      { XM, EXxmmdw }, 0 },
11302   },
11303   {
11304     /* VEX_W_0F3833_P_2 */
11305     { "vpmovzxwd",      { XM, EXxmmq }, 0 },
11306   },
11307   {
11308     /* VEX_W_0F3834_P_2 */
11309     { "vpmovzxwq",      { XM, EXxmmqd }, 0 },
11310   },
11311   {
11312     /* VEX_W_0F3835_P_2 */
11313     { "vpmovzxdq",      { XM, EXxmmq }, 0 },
11314   },
11315   {
11316     /* VEX_W_0F3836_P_2  */
11317     { "vpermd",         { XM, Vex, EXx }, 0 },
11318   },
11319   {
11320     /* VEX_W_0F3837_P_2 */
11321     { "vpcmpgtq",       { XM, Vex, EXx }, 0 },
11322   },
11323   {
11324     /* VEX_W_0F3838_P_2 */
11325     { "vpminsb",        { XM, Vex, EXx }, 0 },
11326   },
11327   {
11328     /* VEX_W_0F3839_P_2 */
11329     { "vpminsd",        { XM, Vex, EXx }, 0 },
11330   },
11331   {
11332     /* VEX_W_0F383A_P_2 */
11333     { "vpminuw",        { XM, Vex, EXx }, 0 },
11334   },
11335   {
11336     /* VEX_W_0F383B_P_2 */
11337     { "vpminud",        { XM, Vex, EXx }, 0 },
11338   },
11339   {
11340     /* VEX_W_0F383C_P_2 */
11341     { "vpmaxsb",        { XM, Vex, EXx }, 0 },
11342   },
11343   {
11344     /* VEX_W_0F383D_P_2 */
11345     { "vpmaxsd",        { XM, Vex, EXx }, 0 },
11346   },
11347   {
11348     /* VEX_W_0F383E_P_2 */
11349     { "vpmaxuw",        { XM, Vex, EXx }, 0 },
11350   },
11351   {
11352     /* VEX_W_0F383F_P_2 */
11353     { "vpmaxud",        { XM, Vex, EXx }, 0 },
11354   },
11355   {
11356     /* VEX_W_0F3840_P_2 */
11357     { "vpmulld",        { XM, Vex, EXx }, 0 },
11358   },
11359   {
11360     /* VEX_W_0F3841_P_2 */
11361     { "vphminposuw",    { XM, EXx }, 0 },
11362   },
11363   {
11364     /* VEX_W_0F3846_P_2 */
11365     { "vpsravd",        { XM, Vex, EXx }, 0 },
11366   },
11367   {
11368     /* VEX_W_0F3858_P_2 */
11369     { "vpbroadcastd", { XM, EXxmm_md }, 0 },
11370   },
11371   {
11372     /* VEX_W_0F3859_P_2 */
11373     { "vpbroadcastq",   { XM, EXxmm_mq }, 0 },
11374   },
11375   {
11376     /* VEX_W_0F385A_P_2_M_0 */
11377     { "vbroadcasti128", { XM, Mxmm }, 0 },
11378   },
11379   {
11380     /* VEX_W_0F3878_P_2 */
11381     { "vpbroadcastb",   { XM, EXxmm_mb }, 0 },
11382   },
11383   {
11384     /* VEX_W_0F3879_P_2 */
11385     { "vpbroadcastw",   { XM, EXxmm_mw }, 0 },
11386   },
11387   {
11388     /* VEX_W_0F38DB_P_2 */
11389     { "vaesimc",        { XM, EXx }, 0 },
11390   },
11391   {
11392     /* VEX_W_0F38DC_P_2 */
11393     { "vaesenc",        { XM, Vex128, EXx }, 0 },
11394   },
11395   {
11396     /* VEX_W_0F38DD_P_2 */
11397     { "vaesenclast",    { XM, Vex128, EXx }, 0 },
11398   },
11399   {
11400     /* VEX_W_0F38DE_P_2 */
11401     { "vaesdec",        { XM, Vex128, EXx }, 0 },
11402   },
11403   {
11404     /* VEX_W_0F38DF_P_2 */
11405     { "vaesdeclast",    { XM, Vex128, EXx }, 0 },
11406   },
11407   {
11408     /* VEX_W_0F3A00_P_2 */
11409     { Bad_Opcode },
11410     { "vpermq",         { XM, EXx, Ib }, 0 },
11411   },
11412   {
11413     /* VEX_W_0F3A01_P_2 */
11414     { Bad_Opcode },
11415     { "vpermpd",        { XM, EXx, Ib }, 0 },
11416   },
11417   {
11418     /* VEX_W_0F3A02_P_2 */
11419     { "vpblendd",       { XM, Vex, EXx, Ib }, 0 },
11420   },
11421   {
11422     /* VEX_W_0F3A04_P_2 */
11423     { "vpermilps",      { XM, EXx, Ib }, 0 },
11424   },
11425   {
11426     /* VEX_W_0F3A05_P_2 */
11427     { "vpermilpd",      { XM, EXx, Ib }, 0 },
11428   },
11429   {
11430     /* VEX_W_0F3A06_P_2 */
11431     { "vperm2f128",     { XM, Vex256, EXx, Ib }, 0 },
11432   },
11433   {
11434     /* VEX_W_0F3A08_P_2 */
11435     { "vroundps",       { XM, EXx, Ib }, 0 },
11436   },
11437   {
11438     /* VEX_W_0F3A09_P_2 */
11439     { "vroundpd",       { XM, EXx, Ib }, 0 },
11440   },
11441   {
11442     /* VEX_W_0F3A0A_P_2 */
11443     { "vroundss",       { XMScalar, VexScalar, EXdScalar, Ib }, 0 },
11444   },
11445   {
11446     /* VEX_W_0F3A0B_P_2 */
11447     { "vroundsd",       { XMScalar, VexScalar, EXqScalar, Ib }, 0 },
11448   },
11449   {
11450     /* VEX_W_0F3A0C_P_2 */
11451     { "vblendps",       { XM, Vex, EXx, Ib }, 0 },
11452   },
11453   {
11454     /* VEX_W_0F3A0D_P_2 */
11455     { "vblendpd",       { XM, Vex, EXx, Ib }, 0 },
11456   },
11457   {
11458     /* VEX_W_0F3A0E_P_2 */
11459     { "vpblendw",       { XM, Vex, EXx, Ib }, 0 },
11460   },
11461   {
11462     /* VEX_W_0F3A0F_P_2 */
11463     { "vpalignr",       { XM, Vex, EXx, Ib }, 0 },
11464   },
11465   {
11466     /* VEX_W_0F3A14_P_2 */
11467     { "vpextrb",        { Edqb, XM, Ib }, 0 },
11468   },
11469   {
11470     /* VEX_W_0F3A15_P_2 */
11471     { "vpextrw",        { Edqw, XM, Ib }, 0 },
11472   },
11473   {
11474     /* VEX_W_0F3A18_P_2 */
11475     { "vinsertf128",    { XM, Vex256, EXxmm, Ib }, 0 },
11476   },
11477   {
11478     /* VEX_W_0F3A19_P_2 */
11479     { "vextractf128",   { EXxmm, XM, Ib }, 0 },
11480   },
11481   {
11482     /* VEX_W_0F3A20_P_2 */
11483     { "vpinsrb",        { XM, Vex128, Edqb, Ib }, 0 },
11484   },
11485   {
11486     /* VEX_W_0F3A21_P_2 */
11487     { "vinsertps",      { XM, Vex128, EXd, Ib }, 0 },
11488   },
11489   {
11490     /* VEX_W_0F3A30_P_2_LEN_0 */
11491     { "kshiftrb",       { MaskG, MaskR, Ib }, 0 },
11492     { "kshiftrw",       { MaskG, MaskR, Ib }, 0 },
11493   },
11494   {
11495     /* VEX_W_0F3A31_P_2_LEN_0 */
11496     { "kshiftrd",       { MaskG, MaskR, Ib }, 0 },
11497     { "kshiftrq",       { MaskG, MaskR, Ib }, 0 },
11498   },
11499   {
11500     /* VEX_W_0F3A32_P_2_LEN_0 */
11501     { "kshiftlb",       { MaskG, MaskR, Ib }, 0 },
11502     { "kshiftlw",       { MaskG, MaskR, Ib }, 0 },
11503   },
11504   {
11505     /* VEX_W_0F3A33_P_2_LEN_0 */
11506     { "kshiftld",       { MaskG, MaskR, Ib }, 0 },
11507     { "kshiftlq",       { MaskG, MaskR, Ib }, 0 },
11508   },
11509   {
11510     /* VEX_W_0F3A38_P_2 */
11511     { "vinserti128",    { XM, Vex256, EXxmm, Ib }, 0 },
11512   },
11513   {
11514     /* VEX_W_0F3A39_P_2 */
11515     { "vextracti128",   { EXxmm, XM, Ib }, 0 },
11516   },
11517   {
11518     /* VEX_W_0F3A40_P_2 */
11519     { "vdpps",          { XM, Vex, EXx, Ib }, 0 },
11520   },
11521   {
11522     /* VEX_W_0F3A41_P_2 */
11523     { "vdppd",          { XM, Vex128, EXx, Ib }, 0 },
11524   },
11525   {
11526     /* VEX_W_0F3A42_P_2 */
11527     { "vmpsadbw",       { XM, Vex, EXx, Ib }, 0 },
11528   },
11529   {
11530     /* VEX_W_0F3A44_P_2 */
11531     { "vpclmulqdq",     { XM, Vex128, EXx, PCLMUL }, 0 },
11532   },
11533   {
11534     /* VEX_W_0F3A46_P_2 */
11535     { "vperm2i128",     { XM, Vex256, EXx, Ib }, 0 },
11536   },
11537   {
11538     /* VEX_W_0F3A48_P_2 */
11539     { "vpermil2ps",     { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW }, 0 },
11540     { "vpermil2ps",     { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW }, 0 },
11541   },
11542   {
11543     /* VEX_W_0F3A49_P_2 */
11544     { "vpermil2pd",     { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW }, 0 },
11545     { "vpermil2pd",     { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW }, 0 },
11546   },
11547   {
11548     /* VEX_W_0F3A4A_P_2 */
11549     { "vblendvps",      { XM, Vex, EXx, XMVexI4 }, 0 },
11550   },
11551   {
11552     /* VEX_W_0F3A4B_P_2 */
11553     { "vblendvpd",      { XM, Vex, EXx, XMVexI4 }, 0 },
11554   },
11555   {
11556     /* VEX_W_0F3A4C_P_2 */
11557     { "vpblendvb",      { XM, Vex, EXx, XMVexI4 }, 0 },
11558   },
11559   {
11560     /* VEX_W_0F3A60_P_2 */
11561     { "vpcmpestrm",     { XM, EXx, Ib }, 0 },
11562   },
11563   {
11564     /* VEX_W_0F3A61_P_2 */
11565     { "vpcmpestri",     { XM, EXx, Ib }, 0 },
11566   },
11567   {
11568     /* VEX_W_0F3A62_P_2 */
11569     { "vpcmpistrm",     { XM, EXx, Ib }, 0 },
11570   },
11571   {
11572     /* VEX_W_0F3A63_P_2 */
11573     { "vpcmpistri",     { XM, EXx, Ib }, 0 },
11574   },
11575   {
11576     /* VEX_W_0F3ADF_P_2 */
11577     { "vaeskeygenassist", { XM, EXx, Ib }, 0 },
11578   },
11579 #define NEED_VEX_W_TABLE
11580 #include "i386-dis-evex.h"
11581 #undef NEED_VEX_W_TABLE
11582 };
11583
11584 static const struct dis386 mod_table[][2] = {
11585   {
11586     /* MOD_8D */
11587     { "leaS",           { Gv, M }, 0 },
11588   },
11589   {
11590     /* MOD_C6_REG_7 */
11591     { Bad_Opcode },
11592     { RM_TABLE (RM_C6_REG_7) },
11593   },
11594   {
11595     /* MOD_C7_REG_7 */
11596     { Bad_Opcode },
11597     { RM_TABLE (RM_C7_REG_7) },
11598   },
11599   {
11600     /* MOD_FF_REG_3 */
11601     { "Jcall^", { indirEp }, 0 },
11602   },
11603   {
11604     /* MOD_FF_REG_5 */
11605     { "Jjmp^", { indirEp }, 0 },
11606   },
11607   {
11608     /* MOD_0F01_REG_0 */
11609     { X86_64_TABLE (X86_64_0F01_REG_0) },
11610     { RM_TABLE (RM_0F01_REG_0) },
11611   },
11612   {
11613     /* MOD_0F01_REG_1 */
11614     { X86_64_TABLE (X86_64_0F01_REG_1) },
11615     { RM_TABLE (RM_0F01_REG_1) },
11616   },
11617   {
11618     /* MOD_0F01_REG_2 */
11619     { X86_64_TABLE (X86_64_0F01_REG_2) },
11620     { RM_TABLE (RM_0F01_REG_2) },
11621   },
11622   {
11623     /* MOD_0F01_REG_3 */
11624     { X86_64_TABLE (X86_64_0F01_REG_3) },
11625     { RM_TABLE (RM_0F01_REG_3) },
11626   },
11627   {
11628     /* MOD_0F01_REG_7 */
11629     { "invlpg",         { Mb }, 0 },
11630     { RM_TABLE (RM_0F01_REG_7) },
11631   },
11632   {
11633     /* MOD_0F12_PREFIX_0 */
11634     { "movlps",         { XM, EXq }, PREFIX_OPCODE },
11635     { "movhlps",        { XM, EXq }, PREFIX_OPCODE },
11636   },
11637   {
11638     /* MOD_0F13 */
11639     { "movlpX",         { EXq, XM }, PREFIX_OPCODE },
11640   },
11641   {
11642     /* MOD_0F16_PREFIX_0 */
11643     { "movhps",         { XM, EXq }, 0 },
11644     { "movlhps",        { XM, EXq }, 0 },
11645   },
11646   {
11647     /* MOD_0F17 */
11648     { "movhpX",         { EXq, XM }, PREFIX_OPCODE },
11649   },
11650   {
11651     /* MOD_0F18_REG_0 */
11652     { "prefetchnta",    { Mb }, 0 },
11653   },
11654   {
11655     /* MOD_0F18_REG_1 */
11656     { "prefetcht0",     { Mb }, 0 },
11657   },
11658   {
11659     /* MOD_0F18_REG_2 */
11660     { "prefetcht1",     { Mb }, 0 },
11661   },
11662   {
11663     /* MOD_0F18_REG_3 */
11664     { "prefetcht2",     { Mb }, 0 },
11665   },
11666   {
11667     /* MOD_0F18_REG_4 */
11668     { "nop/reserved",   { Mb }, 0 },
11669   },
11670   {
11671     /* MOD_0F18_REG_5 */
11672     { "nop/reserved",   { Mb }, 0 },
11673   },
11674   {
11675     /* MOD_0F18_REG_6 */
11676     { "nop/reserved",   { Mb }, 0 },
11677   },
11678   {
11679     /* MOD_0F18_REG_7 */
11680     { "nop/reserved",   { Mb }, 0 },
11681   },
11682   {
11683     /* MOD_0F1A_PREFIX_0 */
11684     { "bndldx",         { Gbnd, Ev_bnd }, 0 },
11685     { "nopQ",           { Ev }, 0 },
11686   },
11687   {
11688     /* MOD_0F1B_PREFIX_0 */
11689     { "bndstx",         { Ev_bnd, Gbnd }, 0 },
11690     { "nopQ",           { Ev }, 0 },
11691   },
11692   {
11693     /* MOD_0F1B_PREFIX_1 */
11694     { "bndmk",          { Gbnd, Ev_bnd }, 0 },
11695     { "nopQ",           { Ev }, 0 },
11696   },
11697   {
11698     /* MOD_0F24 */
11699     { Bad_Opcode },
11700     { "movL",           { Rd, Td }, 0 },
11701   },
11702   {
11703     /* MOD_0F26 */
11704     { Bad_Opcode },
11705     { "movL",           { Td, Rd }, 0 },
11706   },
11707   {
11708     /* MOD_0F2B_PREFIX_0 */
11709     {"movntps",         { Mx, XM }, PREFIX_OPCODE },
11710   },
11711   {
11712     /* MOD_0F2B_PREFIX_1 */
11713     {"movntss",         { Md, XM }, PREFIX_OPCODE },
11714   },
11715   {
11716     /* MOD_0F2B_PREFIX_2 */
11717     {"movntpd",         { Mx, XM }, PREFIX_OPCODE },
11718   },
11719   {
11720     /* MOD_0F2B_PREFIX_3 */
11721     {"movntsd",         { Mq, XM }, PREFIX_OPCODE },
11722   },
11723   {
11724     /* MOD_0F51 */
11725     { Bad_Opcode },
11726     { "movmskpX",       { Gdq, XS }, PREFIX_OPCODE },
11727   },
11728   {
11729     /* MOD_0F71_REG_2 */
11730     { Bad_Opcode },
11731     { "psrlw",          { MS, Ib }, 0 },
11732   },
11733   {
11734     /* MOD_0F71_REG_4 */
11735     { Bad_Opcode },
11736     { "psraw",          { MS, Ib }, 0 },
11737   },
11738   {
11739     /* MOD_0F71_REG_6 */
11740     { Bad_Opcode },
11741     { "psllw",          { MS, Ib }, 0 },
11742   },
11743   {
11744     /* MOD_0F72_REG_2 */
11745     { Bad_Opcode },
11746     { "psrld",          { MS, Ib }, 0 },
11747   },
11748   {
11749     /* MOD_0F72_REG_4 */
11750     { Bad_Opcode },
11751     { "psrad",          { MS, Ib }, 0 },
11752   },
11753   {
11754     /* MOD_0F72_REG_6 */
11755     { Bad_Opcode },
11756     { "pslld",          { MS, Ib }, 0 },
11757   },
11758   {
11759     /* MOD_0F73_REG_2 */
11760     { Bad_Opcode },
11761     { "psrlq",          { MS, Ib }, 0 },
11762   },
11763   {
11764     /* MOD_0F73_REG_3 */
11765     { Bad_Opcode },
11766     { PREFIX_TABLE (PREFIX_0F73_REG_3) },
11767   },
11768   {
11769     /* MOD_0F73_REG_6 */
11770     { Bad_Opcode },
11771     { "psllq",          { MS, Ib }, 0 },
11772   },
11773   {
11774     /* MOD_0F73_REG_7 */
11775     { Bad_Opcode },
11776     { PREFIX_TABLE (PREFIX_0F73_REG_7) },
11777   },
11778   {
11779     /* MOD_0FAE_REG_0 */
11780     { "fxsave",         { FXSAVE }, 0 },
11781     { PREFIX_TABLE (PREFIX_0FAE_REG_0) },
11782   },
11783   {
11784     /* MOD_0FAE_REG_1 */
11785     { "fxrstor",        { FXSAVE }, 0 },
11786     { PREFIX_TABLE (PREFIX_0FAE_REG_1) },
11787   },
11788   {
11789     /* MOD_0FAE_REG_2 */
11790     { "ldmxcsr",        { Md }, 0 },
11791     { PREFIX_TABLE (PREFIX_0FAE_REG_2) },
11792   },
11793   {
11794     /* MOD_0FAE_REG_3 */
11795     { "stmxcsr",        { Md }, 0 },
11796     { PREFIX_TABLE (PREFIX_0FAE_REG_3) },
11797   },
11798   {
11799     /* MOD_0FAE_REG_4 */
11800     { "xsave",          { FXSAVE }, 0 },
11801   },
11802   {
11803     /* MOD_0FAE_REG_5 */
11804     { "xrstor",         { FXSAVE }, 0 },
11805     { RM_TABLE (RM_0FAE_REG_5) },
11806   },
11807   {
11808     /* MOD_0FAE_REG_6 */
11809     { PREFIX_TABLE (PREFIX_0FAE_REG_6) },
11810     { RM_TABLE (RM_0FAE_REG_6) },
11811   },
11812   {
11813     /* MOD_0FAE_REG_7 */
11814     { PREFIX_TABLE (PREFIX_0FAE_REG_7) },
11815     { RM_TABLE (RM_0FAE_REG_7) },
11816   },
11817   {
11818     /* MOD_0FB2 */
11819     { "lssS",           { Gv, Mp }, 0 },
11820   },
11821   {
11822     /* MOD_0FB4 */
11823     { "lfsS",           { Gv, Mp }, 0 },
11824   },
11825   {
11826     /* MOD_0FB5 */
11827     { "lgsS",           { Gv, Mp }, 0 },
11828   },
11829   {
11830     /* MOD_0FC7_REG_3 */
11831     { "xrstors",                { FXSAVE }, 0 },
11832   },
11833   {
11834     /* MOD_0FC7_REG_4 */
11835     { "xsavec",         { FXSAVE }, 0 },
11836   },
11837   {
11838     /* MOD_0FC7_REG_5 */
11839     { "xsaves",         { FXSAVE }, 0 },
11840   },
11841   {
11842     /* MOD_0FC7_REG_6 */
11843     { PREFIX_TABLE (PREFIX_MOD_0_0FC7_REG_6) },
11844     { PREFIX_TABLE (PREFIX_MOD_3_0FC7_REG_6) }
11845   },
11846   {
11847     /* MOD_0FC7_REG_7 */
11848     { "vmptrst",        { Mq }, 0 },
11849     { PREFIX_TABLE (PREFIX_MOD_3_0FC7_REG_7) }
11850   },
11851   {
11852     /* MOD_0FD7 */
11853     { Bad_Opcode },
11854     { "pmovmskb",       { Gdq, MS }, 0 },
11855   },
11856   {
11857     /* MOD_0FE7_PREFIX_2 */
11858     { "movntdq",        { Mx, XM }, 0 },
11859   },
11860   {
11861     /* MOD_0FF0_PREFIX_3 */
11862     { "lddqu",          { XM, M }, 0 },
11863   },
11864   {
11865     /* MOD_0F382A_PREFIX_2 */
11866     { "movntdqa",       { XM, Mx }, 0 },
11867   },
11868   {
11869     /* MOD_62_32BIT */
11870     { "bound{S|}",      { Gv, Ma }, 0 },
11871     { EVEX_TABLE (EVEX_0F) },
11872   },
11873   {
11874     /* MOD_C4_32BIT */
11875     { "lesS",           { Gv, Mp }, 0 },
11876     { VEX_C4_TABLE (VEX_0F) },
11877   },
11878   {
11879     /* MOD_C5_32BIT */
11880     { "ldsS",           { Gv, Mp }, 0 },
11881     { VEX_C5_TABLE (VEX_0F) },
11882   },
11883   {
11884     /* MOD_VEX_0F12_PREFIX_0 */
11885     { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_0) },
11886     { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_1) },
11887   },
11888   {
11889     /* MOD_VEX_0F13 */
11890     { VEX_LEN_TABLE (VEX_LEN_0F13_M_0) },
11891   },
11892   {
11893     /* MOD_VEX_0F16_PREFIX_0 */
11894     { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_0) },
11895     { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_1) },
11896   },
11897   {
11898     /* MOD_VEX_0F17 */
11899     { VEX_LEN_TABLE (VEX_LEN_0F17_M_0) },
11900   },
11901   {
11902     /* MOD_VEX_0F2B */
11903     { VEX_W_TABLE (VEX_W_0F2B_M_0) },
11904   },
11905   {
11906     /* MOD_VEX_0F50 */
11907     { Bad_Opcode },
11908     { VEX_W_TABLE (VEX_W_0F50_M_0) },
11909   },
11910   {
11911     /* MOD_VEX_0F71_REG_2 */
11912     { Bad_Opcode },
11913     { PREFIX_TABLE (PREFIX_VEX_0F71_REG_2) },
11914   },
11915   {
11916     /* MOD_VEX_0F71_REG_4 */
11917     { Bad_Opcode },
11918     { PREFIX_TABLE (PREFIX_VEX_0F71_REG_4) },
11919   },
11920   {
11921     /* MOD_VEX_0F71_REG_6 */
11922     { Bad_Opcode },
11923     { PREFIX_TABLE (PREFIX_VEX_0F71_REG_6) },
11924   },
11925   {
11926     /* MOD_VEX_0F72_REG_2 */
11927     { Bad_Opcode },
11928     { PREFIX_TABLE (PREFIX_VEX_0F72_REG_2) },
11929   },
11930   {
11931     /* MOD_VEX_0F72_REG_4 */
11932     { Bad_Opcode },
11933     { PREFIX_TABLE (PREFIX_VEX_0F72_REG_4) },
11934   },
11935   {
11936     /* MOD_VEX_0F72_REG_6 */
11937     { Bad_Opcode },
11938     { PREFIX_TABLE (PREFIX_VEX_0F72_REG_6) },
11939   },
11940   {
11941     /* MOD_VEX_0F73_REG_2 */
11942     { Bad_Opcode },
11943     { PREFIX_TABLE (PREFIX_VEX_0F73_REG_2) },
11944   },
11945   {
11946     /* MOD_VEX_0F73_REG_3 */
11947     { Bad_Opcode },
11948     { PREFIX_TABLE (PREFIX_VEX_0F73_REG_3) },
11949   },
11950   {
11951     /* MOD_VEX_0F73_REG_6 */
11952     { Bad_Opcode },
11953     { PREFIX_TABLE (PREFIX_VEX_0F73_REG_6) },
11954   },
11955   {
11956     /* MOD_VEX_0F73_REG_7 */
11957     { Bad_Opcode },
11958     { PREFIX_TABLE (PREFIX_VEX_0F73_REG_7) },
11959   },
11960   {
11961     /* MOD_VEX_0FAE_REG_2 */
11962     { VEX_LEN_TABLE (VEX_LEN_0FAE_R_2_M_0) },
11963   },
11964   {
11965     /* MOD_VEX_0FAE_REG_3 */
11966     { VEX_LEN_TABLE (VEX_LEN_0FAE_R_3_M_0) },
11967   },
11968   {
11969     /* MOD_VEX_0FD7_PREFIX_2 */
11970     { Bad_Opcode },
11971     { VEX_W_TABLE (VEX_W_0FD7_P_2_M_1) },
11972   },
11973   {
11974     /* MOD_VEX_0FE7_PREFIX_2 */
11975     { VEX_W_TABLE (VEX_W_0FE7_P_2_M_0) },
11976   },
11977   {
11978     /* MOD_VEX_0FF0_PREFIX_3 */
11979     { VEX_W_TABLE (VEX_W_0FF0_P_3_M_0) },
11980   },
11981   {
11982     /* MOD_VEX_0F381A_PREFIX_2 */
11983     { VEX_LEN_TABLE (VEX_LEN_0F381A_P_2_M_0) },
11984   },
11985   {
11986     /* MOD_VEX_0F382A_PREFIX_2 */
11987     { VEX_W_TABLE (VEX_W_0F382A_P_2_M_0) },
11988   },
11989   {
11990     /* MOD_VEX_0F382C_PREFIX_2 */
11991     { VEX_W_TABLE (VEX_W_0F382C_P_2_M_0) },
11992   },
11993   {
11994     /* MOD_VEX_0F382D_PREFIX_2 */
11995     { VEX_W_TABLE (VEX_W_0F382D_P_2_M_0) },
11996   },
11997   {
11998     /* MOD_VEX_0F382E_PREFIX_2 */
11999     { VEX_W_TABLE (VEX_W_0F382E_P_2_M_0) },
12000   },
12001   {
12002     /* MOD_VEX_0F382F_PREFIX_2 */
12003     { VEX_W_TABLE (VEX_W_0F382F_P_2_M_0) },
12004   },
12005   {
12006     /* MOD_VEX_0F385A_PREFIX_2 */
12007     { VEX_LEN_TABLE (VEX_LEN_0F385A_P_2_M_0) },
12008   },
12009   {
12010     /* MOD_VEX_0F388C_PREFIX_2 */
12011     { "vpmaskmov%LW",   { XM, Vex, Mx }, 0 },
12012   },
12013   {
12014     /* MOD_VEX_0F388E_PREFIX_2 */
12015     { "vpmaskmov%LW",   { Mx, Vex, XM }, 0 },
12016   },
12017 #define NEED_MOD_TABLE
12018 #include "i386-dis-evex.h"
12019 #undef NEED_MOD_TABLE
12020 };
12021
12022 static const struct dis386 rm_table[][8] = {
12023   {
12024     /* RM_C6_REG_7 */
12025     { "xabort",         { Skip_MODRM, Ib }, 0 },
12026   },
12027   {
12028     /* RM_C7_REG_7 */
12029     { "xbeginT",        { Skip_MODRM, Jv }, 0 },
12030   },
12031   {
12032     /* RM_0F01_REG_0 */
12033     { Bad_Opcode },
12034     { "vmcall",         { Skip_MODRM }, 0 },
12035     { "vmlaunch",       { Skip_MODRM }, 0 },
12036     { "vmresume",       { Skip_MODRM }, 0 },
12037     { "vmxoff",         { Skip_MODRM }, 0 },
12038   },
12039   {
12040     /* RM_0F01_REG_1 */
12041     { "monitor",        { { OP_Monitor, 0 } }, 0 },
12042     { "mwait",          { { OP_Mwait, 0 } }, 0 },
12043     { "clac",           { Skip_MODRM }, 0 },
12044     { "stac",           { Skip_MODRM }, 0 },
12045     { Bad_Opcode },
12046     { Bad_Opcode },
12047     { Bad_Opcode },
12048     { "encls",          { Skip_MODRM }, 0 },
12049   },
12050   {
12051     /* RM_0F01_REG_2 */
12052     { "xgetbv",         { Skip_MODRM }, 0 },
12053     { "xsetbv",         { Skip_MODRM }, 0 },
12054     { Bad_Opcode },
12055     { Bad_Opcode },
12056     { "vmfunc",         { Skip_MODRM }, 0 },
12057     { "xend",           { Skip_MODRM }, 0 },
12058     { "xtest",          { Skip_MODRM }, 0 },
12059     { "enclu",          { Skip_MODRM }, 0 },
12060   },
12061   {
12062     /* RM_0F01_REG_3 */
12063     { "vmrun",          { Skip_MODRM }, 0 },
12064     { "vmmcall",        { Skip_MODRM }, 0 },
12065     { "vmload",         { Skip_MODRM }, 0 },
12066     { "vmsave",         { Skip_MODRM }, 0 },
12067     { "stgi",           { Skip_MODRM }, 0 },
12068     { "clgi",           { Skip_MODRM }, 0 },
12069     { "skinit",         { Skip_MODRM }, 0 },
12070     { "invlpga",        { Skip_MODRM }, 0 },
12071   },
12072   {
12073     /* RM_0F01_REG_7 */
12074     { "swapgs",         { Skip_MODRM }, 0  },
12075     { "rdtscp",         { Skip_MODRM }, 0  },
12076     { "monitorx",       { { OP_Monitor, 0 } }, 0  },
12077     { "mwaitx",         { { OP_Mwaitx,  0 } }, 0  },
12078     { "clzero",         { Skip_MODRM }, 0  },
12079   },
12080   {
12081     /* RM_0FAE_REG_5 */
12082     { "lfence",         { Skip_MODRM }, 0 },
12083   },
12084   {
12085     /* RM_0FAE_REG_6 */
12086     { "mfence",         { Skip_MODRM }, 0 },
12087   },
12088   {
12089     /* RM_0FAE_REG_7 */
12090     { PREFIX_TABLE (PREFIX_RM_0_0FAE_REG_7) },
12091   },
12092 };
12093
12094 #define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
12095
12096 /* We use the high bit to indicate different name for the same
12097    prefix.  */
12098 #define REP_PREFIX      (0xf3 | 0x100)
12099 #define XACQUIRE_PREFIX (0xf2 | 0x200)
12100 #define XRELEASE_PREFIX (0xf3 | 0x400)
12101 #define BND_PREFIX      (0xf2 | 0x400)
12102
12103 static int
12104 ckprefix (void)
12105 {
12106   int newrex, i, length;
12107   rex = 0;
12108   rex_ignored = 0;
12109   prefixes = 0;
12110   used_prefixes = 0;
12111   rex_used = 0;
12112   last_lock_prefix = -1;
12113   last_repz_prefix = -1;
12114   last_repnz_prefix = -1;
12115   last_data_prefix = -1;
12116   last_addr_prefix = -1;
12117   last_rex_prefix = -1;
12118   last_seg_prefix = -1;
12119   fwait_prefix = -1;
12120   active_seg_prefix = 0;
12121   for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
12122     all_prefixes[i] = 0;
12123   i = 0;
12124   length = 0;
12125   /* The maximum instruction length is 15bytes.  */
12126   while (length < MAX_CODE_LENGTH - 1)
12127     {
12128       FETCH_DATA (the_info, codep + 1);
12129       newrex = 0;
12130       switch (*codep)
12131         {
12132         /* REX prefixes family.  */
12133         case 0x40:
12134         case 0x41:
12135         case 0x42:
12136         case 0x43:
12137         case 0x44:
12138         case 0x45:
12139         case 0x46:
12140         case 0x47:
12141         case 0x48:
12142         case 0x49:
12143         case 0x4a:
12144         case 0x4b:
12145         case 0x4c:
12146         case 0x4d:
12147         case 0x4e:
12148         case 0x4f:
12149           if (address_mode == mode_64bit)
12150             newrex = *codep;
12151           else
12152             return 1;
12153           last_rex_prefix = i;
12154           break;
12155         case 0xf3:
12156           prefixes |= PREFIX_REPZ;
12157           last_repz_prefix = i;
12158           break;
12159         case 0xf2:
12160           prefixes |= PREFIX_REPNZ;
12161           last_repnz_prefix = i;
12162           break;
12163         case 0xf0:
12164           prefixes |= PREFIX_LOCK;
12165           last_lock_prefix = i;
12166           break;
12167         case 0x2e:
12168           prefixes |= PREFIX_CS;
12169           last_seg_prefix = i;
12170           active_seg_prefix = PREFIX_CS;
12171           break;
12172         case 0x36:
12173           prefixes |= PREFIX_SS;
12174           last_seg_prefix = i;
12175           active_seg_prefix = PREFIX_SS;
12176           break;
12177         case 0x3e:
12178           prefixes |= PREFIX_DS;
12179           last_seg_prefix = i;
12180           active_seg_prefix = PREFIX_DS;
12181           break;
12182         case 0x26:
12183           prefixes |= PREFIX_ES;
12184           last_seg_prefix = i;
12185           active_seg_prefix = PREFIX_ES;
12186           break;
12187         case 0x64:
12188           prefixes |= PREFIX_FS;
12189           last_seg_prefix = i;
12190           active_seg_prefix = PREFIX_FS;
12191           break;
12192         case 0x65:
12193           prefixes |= PREFIX_GS;
12194           last_seg_prefix = i;
12195           active_seg_prefix = PREFIX_GS;
12196           break;
12197         case 0x66:
12198           prefixes |= PREFIX_DATA;
12199           last_data_prefix = i;
12200           break;
12201         case 0x67:
12202           prefixes |= PREFIX_ADDR;
12203           last_addr_prefix = i;
12204           break;
12205         case FWAIT_OPCODE:
12206           /* fwait is really an instruction.  If there are prefixes
12207              before the fwait, they belong to the fwait, *not* to the
12208              following instruction.  */
12209           fwait_prefix = i;
12210           if (prefixes || rex)
12211             {
12212               prefixes |= PREFIX_FWAIT;
12213               codep++;
12214               /* This ensures that the previous REX prefixes are noticed
12215                  as unused prefixes, as in the return case below.  */
12216               rex_used = rex;
12217               return 1;
12218             }
12219           prefixes = PREFIX_FWAIT;
12220           break;
12221         default:
12222           return 1;
12223         }
12224       /* Rex is ignored when followed by another prefix.  */
12225       if (rex)
12226         {
12227           rex_used = rex;
12228           return 1;
12229         }
12230       if (*codep != FWAIT_OPCODE)
12231         all_prefixes[i++] = *codep;
12232       rex = newrex;
12233       codep++;
12234       length++;
12235     }
12236   return 0;
12237 }
12238
12239 /* Return the name of the prefix byte PREF, or NULL if PREF is not a
12240    prefix byte.  */
12241
12242 static const char *
12243 prefix_name (int pref, int sizeflag)
12244 {
12245   static const char *rexes [16] =
12246     {
12247       "rex",            /* 0x40 */
12248       "rex.B",          /* 0x41 */
12249       "rex.X",          /* 0x42 */
12250       "rex.XB",         /* 0x43 */
12251       "rex.R",          /* 0x44 */
12252       "rex.RB",         /* 0x45 */
12253       "rex.RX",         /* 0x46 */
12254       "rex.RXB",        /* 0x47 */
12255       "rex.W",          /* 0x48 */
12256       "rex.WB",         /* 0x49 */
12257       "rex.WX",         /* 0x4a */
12258       "rex.WXB",        /* 0x4b */
12259       "rex.WR",         /* 0x4c */
12260       "rex.WRB",        /* 0x4d */
12261       "rex.WRX",        /* 0x4e */
12262       "rex.WRXB",       /* 0x4f */
12263     };
12264
12265   switch (pref)
12266     {
12267     /* REX prefixes family.  */
12268     case 0x40:
12269     case 0x41:
12270     case 0x42:
12271     case 0x43:
12272     case 0x44:
12273     case 0x45:
12274     case 0x46:
12275     case 0x47:
12276     case 0x48:
12277     case 0x49:
12278     case 0x4a:
12279     case 0x4b:
12280     case 0x4c:
12281     case 0x4d:
12282     case 0x4e:
12283     case 0x4f:
12284       return rexes [pref - 0x40];
12285     case 0xf3:
12286       return "repz";
12287     case 0xf2:
12288       return "repnz";
12289     case 0xf0:
12290       return "lock";
12291     case 0x2e:
12292       return "cs";
12293     case 0x36:
12294       return "ss";
12295     case 0x3e:
12296       return "ds";
12297     case 0x26:
12298       return "es";
12299     case 0x64:
12300       return "fs";
12301     case 0x65:
12302       return "gs";
12303     case 0x66:
12304       return (sizeflag & DFLAG) ? "data16" : "data32";
12305     case 0x67:
12306       if (address_mode == mode_64bit)
12307         return (sizeflag & AFLAG) ? "addr32" : "addr64";
12308       else
12309         return (sizeflag & AFLAG) ? "addr16" : "addr32";
12310     case FWAIT_OPCODE:
12311       return "fwait";
12312     case REP_PREFIX:
12313       return "rep";
12314     case XACQUIRE_PREFIX:
12315       return "xacquire";
12316     case XRELEASE_PREFIX:
12317       return "xrelease";
12318     case BND_PREFIX:
12319       return "bnd";
12320     default:
12321       return NULL;
12322     }
12323 }
12324
12325 static char op_out[MAX_OPERANDS][100];
12326 static int op_ad, op_index[MAX_OPERANDS];
12327 static int two_source_ops;
12328 static bfd_vma op_address[MAX_OPERANDS];
12329 static bfd_vma op_riprel[MAX_OPERANDS];
12330 static bfd_vma start_pc;
12331
12332 /*
12333  *   On the 386's of 1988, the maximum length of an instruction is 15 bytes.
12334  *   (see topic "Redundant prefixes" in the "Differences from 8086"
12335  *   section of the "Virtual 8086 Mode" chapter.)
12336  * 'pc' should be the address of this instruction, it will
12337  *   be used to print the target address if this is a relative jump or call
12338  * The function returns the length of this instruction in bytes.
12339  */
12340
12341 static char intel_syntax;
12342 static char intel_mnemonic = !SYSV386_COMPAT;
12343 static char open_char;
12344 static char close_char;
12345 static char separator_char;
12346 static char scale_char;
12347
12348 enum x86_64_isa
12349 {
12350   amd64 = 0,
12351   intel64
12352 };
12353
12354 static enum x86_64_isa isa64;
12355
12356 /* Here for backwards compatibility.  When gdb stops using
12357    print_insn_i386_att and print_insn_i386_intel these functions can
12358    disappear, and print_insn_i386 be merged into print_insn.  */
12359 int
12360 print_insn_i386_att (bfd_vma pc, disassemble_info *info)
12361 {
12362   intel_syntax = 0;
12363
12364   return print_insn (pc, info);
12365 }
12366
12367 int
12368 print_insn_i386_intel (bfd_vma pc, disassemble_info *info)
12369 {
12370   intel_syntax = 1;
12371
12372   return print_insn (pc, info);
12373 }
12374
12375 int
12376 print_insn_i386 (bfd_vma pc, disassemble_info *info)
12377 {
12378   intel_syntax = -1;
12379
12380   return print_insn (pc, info);
12381 }
12382
12383 void
12384 print_i386_disassembler_options (FILE *stream)
12385 {
12386   fprintf (stream, _("\n\
12387 The following i386/x86-64 specific disassembler options are supported for use\n\
12388 with the -M switch (multiple options should be separated by commas):\n"));
12389
12390   fprintf (stream, _("  x86-64      Disassemble in 64bit mode\n"));
12391   fprintf (stream, _("  i386        Disassemble in 32bit mode\n"));
12392   fprintf (stream, _("  i8086       Disassemble in 16bit mode\n"));
12393   fprintf (stream, _("  att         Display instruction in AT&T syntax\n"));
12394   fprintf (stream, _("  intel       Display instruction in Intel syntax\n"));
12395   fprintf (stream, _("  att-mnemonic\n"
12396                      "              Display instruction in AT&T mnemonic\n"));
12397   fprintf (stream, _("  intel-mnemonic\n"
12398                      "              Display instruction in Intel mnemonic\n"));
12399   fprintf (stream, _("  addr64      Assume 64bit address size\n"));
12400   fprintf (stream, _("  addr32      Assume 32bit address size\n"));
12401   fprintf (stream, _("  addr16      Assume 16bit address size\n"));
12402   fprintf (stream, _("  data32      Assume 32bit data size\n"));
12403   fprintf (stream, _("  data16      Assume 16bit data size\n"));
12404   fprintf (stream, _("  suffix      Always display instruction suffix in AT&T syntax\n"));
12405   fprintf (stream, _("  amd64       Display instruction in AMD64 ISA\n"));
12406   fprintf (stream, _("  intel64     Display instruction in Intel64 ISA\n"));
12407 }
12408
12409 /* Bad opcode.  */
12410 static const struct dis386 bad_opcode = { "(bad)", { XX }, 0 };
12411
12412 /* Get a pointer to struct dis386 with a valid name.  */
12413
12414 static const struct dis386 *
12415 get_valid_dis386 (const struct dis386 *dp, disassemble_info *info)
12416 {
12417   int vindex, vex_table_index;
12418
12419   if (dp->name != NULL)
12420     return dp;
12421
12422   switch (dp->op[0].bytemode)
12423     {
12424     case USE_REG_TABLE:
12425       dp = &reg_table[dp->op[1].bytemode][modrm.reg];
12426       break;
12427
12428     case USE_MOD_TABLE:
12429       vindex = modrm.mod == 0x3 ? 1 : 0;
12430       dp = &mod_table[dp->op[1].bytemode][vindex];
12431       break;
12432
12433     case USE_RM_TABLE:
12434       dp = &rm_table[dp->op[1].bytemode][modrm.rm];
12435       break;
12436
12437     case USE_PREFIX_TABLE:
12438       if (need_vex)
12439         {
12440           /* The prefix in VEX is implicit.  */
12441           switch (vex.prefix)
12442             {
12443             case 0:
12444               vindex = 0;
12445               break;
12446             case REPE_PREFIX_OPCODE:
12447               vindex = 1;
12448               break;
12449             case DATA_PREFIX_OPCODE:
12450               vindex = 2;
12451               break;
12452             case REPNE_PREFIX_OPCODE:
12453               vindex = 3;
12454               break;
12455             default:
12456               abort ();
12457               break;
12458             }
12459         }
12460       else
12461         {
12462           int last_prefix = -1;
12463           int prefix = 0;
12464           vindex = 0;
12465           /* We check PREFIX_REPNZ and PREFIX_REPZ before PREFIX_DATA.
12466              When there are multiple PREFIX_REPNZ and PREFIX_REPZ, the
12467              last one wins.  */
12468           if ((prefixes & (PREFIX_REPZ | PREFIX_REPNZ)) != 0)
12469             {
12470               if (last_repz_prefix > last_repnz_prefix)
12471                 {
12472                   vindex = 1;
12473                   prefix = PREFIX_REPZ;
12474                   last_prefix = last_repz_prefix;
12475                 }
12476               else
12477                 {
12478                   vindex = 3;
12479                   prefix = PREFIX_REPNZ;
12480                   last_prefix = last_repnz_prefix;
12481                 }
12482
12483               /* Check if prefix should be ignored.  */
12484               if ((((prefix_table[dp->op[1].bytemode][vindex].prefix_requirement
12485                      & PREFIX_IGNORED) >> PREFIX_IGNORED_SHIFT)
12486                    & prefix) != 0)
12487                 vindex = 0;
12488             }
12489
12490           if (vindex == 0 && (prefixes & PREFIX_DATA) != 0)
12491             {
12492               vindex = 2;
12493               prefix = PREFIX_DATA;
12494               last_prefix = last_data_prefix;
12495             }
12496
12497           if (vindex != 0)
12498             {
12499               used_prefixes |= prefix;
12500               all_prefixes[last_prefix] = 0;
12501             }
12502         }
12503       dp = &prefix_table[dp->op[1].bytemode][vindex];
12504       break;
12505
12506     case USE_X86_64_TABLE:
12507       vindex = address_mode == mode_64bit ? 1 : 0;
12508       dp = &x86_64_table[dp->op[1].bytemode][vindex];
12509       break;
12510
12511     case USE_3BYTE_TABLE:
12512       FETCH_DATA (info, codep + 2);
12513       vindex = *codep++;
12514       dp = &three_byte_table[dp->op[1].bytemode][vindex];
12515       end_codep = codep;
12516       modrm.mod = (*codep >> 6) & 3;
12517       modrm.reg = (*codep >> 3) & 7;
12518       modrm.rm = *codep & 7;
12519       break;
12520
12521     case USE_VEX_LEN_TABLE:
12522       if (!need_vex)
12523         abort ();
12524
12525       switch (vex.length)
12526         {
12527         case 128:
12528           vindex = 0;
12529           break;
12530         case 256:
12531           vindex = 1;
12532           break;
12533         default:
12534           abort ();
12535           break;
12536         }
12537
12538       dp = &vex_len_table[dp->op[1].bytemode][vindex];
12539       break;
12540
12541     case USE_XOP_8F_TABLE:
12542       FETCH_DATA (info, codep + 3);
12543       /* All bits in the REX prefix are ignored.  */
12544       rex_ignored = rex;
12545       rex = ~(*codep >> 5) & 0x7;
12546
12547       /* VEX_TABLE_INDEX is the mmmmm part of the XOP byte 1 "RCB.mmmmm".  */
12548       switch ((*codep & 0x1f))
12549         {
12550         default:
12551           dp = &bad_opcode;
12552           return dp;
12553         case 0x8:
12554           vex_table_index = XOP_08;
12555           break;
12556         case 0x9:
12557           vex_table_index = XOP_09;
12558           break;
12559         case 0xa:
12560           vex_table_index = XOP_0A;
12561           break;
12562         }
12563       codep++;
12564       vex.w = *codep & 0x80;
12565       if (vex.w && address_mode == mode_64bit)
12566         rex |= REX_W;
12567
12568       vex.register_specifier = (~(*codep >> 3)) & 0xf;
12569       if (address_mode != mode_64bit
12570           && vex.register_specifier > 0x7)
12571         {
12572           dp = &bad_opcode;
12573           return dp;
12574         }
12575
12576       vex.length = (*codep & 0x4) ? 256 : 128;
12577       switch ((*codep & 0x3))
12578         {
12579         case 0:
12580           vex.prefix = 0;
12581           break;
12582         case 1:
12583           vex.prefix = DATA_PREFIX_OPCODE;
12584           break;
12585         case 2:
12586           vex.prefix = REPE_PREFIX_OPCODE;
12587           break;
12588         case 3:
12589           vex.prefix = REPNE_PREFIX_OPCODE;
12590           break;
12591         }
12592       need_vex = 1;
12593       need_vex_reg = 1;
12594       codep++;
12595       vindex = *codep++;
12596       dp = &xop_table[vex_table_index][vindex];
12597
12598       end_codep = codep;
12599       FETCH_DATA (info, codep + 1);
12600       modrm.mod = (*codep >> 6) & 3;
12601       modrm.reg = (*codep >> 3) & 7;
12602       modrm.rm = *codep & 7;
12603       break;
12604
12605     case USE_VEX_C4_TABLE:
12606       /* VEX prefix.  */
12607       FETCH_DATA (info, codep + 3);
12608       /* All bits in the REX prefix are ignored.  */
12609       rex_ignored = rex;
12610       rex = ~(*codep >> 5) & 0x7;
12611       switch ((*codep & 0x1f))
12612         {
12613         default:
12614           dp = &bad_opcode;
12615           return dp;
12616         case 0x1:
12617           vex_table_index = VEX_0F;
12618           break;
12619         case 0x2:
12620           vex_table_index = VEX_0F38;
12621           break;
12622         case 0x3:
12623           vex_table_index = VEX_0F3A;
12624           break;
12625         }
12626       codep++;
12627       vex.w = *codep & 0x80;
12628       if (vex.w && address_mode == mode_64bit)
12629         rex |= REX_W;
12630
12631       vex.register_specifier = (~(*codep >> 3)) & 0xf;
12632       if (address_mode != mode_64bit
12633           && vex.register_specifier > 0x7)
12634         {
12635           dp = &bad_opcode;
12636           return dp;
12637         }
12638
12639       vex.length = (*codep & 0x4) ? 256 : 128;
12640       switch ((*codep & 0x3))
12641         {
12642         case 0:
12643           vex.prefix = 0;
12644           break;
12645         case 1:
12646           vex.prefix = DATA_PREFIX_OPCODE;
12647           break;
12648         case 2:
12649           vex.prefix = REPE_PREFIX_OPCODE;
12650           break;
12651         case 3:
12652           vex.prefix = REPNE_PREFIX_OPCODE;
12653           break;
12654         }
12655       need_vex = 1;
12656       need_vex_reg = 1;
12657       codep++;
12658       vindex = *codep++;
12659       dp = &vex_table[vex_table_index][vindex];
12660       end_codep = codep;
12661       /* There is no MODRM byte for VEX [82|77].  */
12662       if (vindex != 0x77 && vindex != 0x82)
12663         {
12664           FETCH_DATA (info, codep + 1);
12665           modrm.mod = (*codep >> 6) & 3;
12666           modrm.reg = (*codep >> 3) & 7;
12667           modrm.rm = *codep & 7;
12668         }
12669       break;
12670
12671     case USE_VEX_C5_TABLE:
12672       /* VEX prefix.  */
12673       FETCH_DATA (info, codep + 2);
12674       /* All bits in the REX prefix are ignored.  */
12675       rex_ignored = rex;
12676       rex = (*codep & 0x80) ? 0 : REX_R;
12677
12678       vex.register_specifier = (~(*codep >> 3)) & 0xf;
12679       if (address_mode != mode_64bit
12680           && vex.register_specifier > 0x7)
12681         {
12682           dp = &bad_opcode;
12683           return dp;
12684         }
12685
12686       vex.w = 0;
12687
12688       vex.length = (*codep & 0x4) ? 256 : 128;
12689       switch ((*codep & 0x3))
12690         {
12691         case 0:
12692           vex.prefix = 0;
12693           break;
12694         case 1:
12695           vex.prefix = DATA_PREFIX_OPCODE;
12696           break;
12697         case 2:
12698           vex.prefix = REPE_PREFIX_OPCODE;
12699           break;
12700         case 3:
12701           vex.prefix = REPNE_PREFIX_OPCODE;
12702           break;
12703         }
12704       need_vex = 1;
12705       need_vex_reg = 1;
12706       codep++;
12707       vindex = *codep++;
12708       dp = &vex_table[dp->op[1].bytemode][vindex];
12709       end_codep = codep;
12710       /* There is no MODRM byte for VEX [82|77].  */
12711       if (vindex != 0x77 && vindex != 0x82)
12712         {
12713           FETCH_DATA (info, codep + 1);
12714           modrm.mod = (*codep >> 6) & 3;
12715           modrm.reg = (*codep >> 3) & 7;
12716           modrm.rm = *codep & 7;
12717         }
12718       break;
12719
12720     case USE_VEX_W_TABLE:
12721       if (!need_vex)
12722         abort ();
12723
12724       dp = &vex_w_table[dp->op[1].bytemode][vex.w ? 1 : 0];
12725       break;
12726
12727     case USE_EVEX_TABLE:
12728       two_source_ops = 0;
12729       /* EVEX prefix.  */
12730       vex.evex = 1;
12731       FETCH_DATA (info, codep + 4);
12732       /* All bits in the REX prefix are ignored.  */
12733       rex_ignored = rex;
12734       /* The first byte after 0x62.  */
12735       rex = ~(*codep >> 5) & 0x7;
12736       vex.r = *codep & 0x10;
12737       switch ((*codep & 0xf))
12738         {
12739         default:
12740           return &bad_opcode;
12741         case 0x1:
12742           vex_table_index = EVEX_0F;
12743           break;
12744         case 0x2:
12745           vex_table_index = EVEX_0F38;
12746           break;
12747         case 0x3:
12748           vex_table_index = EVEX_0F3A;
12749           break;
12750         }
12751
12752       /* The second byte after 0x62.  */
12753       codep++;
12754       vex.w = *codep & 0x80;
12755       if (vex.w && address_mode == mode_64bit)
12756         rex |= REX_W;
12757
12758       vex.register_specifier = (~(*codep >> 3)) & 0xf;
12759       if (address_mode != mode_64bit)
12760         {
12761           /* In 16/32-bit mode silently ignore following bits.  */
12762           rex &= ~REX_B;
12763           vex.r = 1;
12764           vex.v = 1;
12765           vex.register_specifier &= 0x7;
12766         }
12767
12768       /* The U bit.  */
12769       if (!(*codep & 0x4))
12770         return &bad_opcode;
12771
12772       switch ((*codep & 0x3))
12773         {
12774         case 0:
12775           vex.prefix = 0;
12776           break;
12777         case 1:
12778           vex.prefix = DATA_PREFIX_OPCODE;
12779           break;
12780         case 2:
12781           vex.prefix = REPE_PREFIX_OPCODE;
12782           break;
12783         case 3:
12784           vex.prefix = REPNE_PREFIX_OPCODE;
12785           break;
12786         }
12787
12788       /* The third byte after 0x62.  */
12789       codep++;
12790
12791       /* Remember the static rounding bits.  */
12792       vex.ll = (*codep >> 5) & 3;
12793       vex.b = (*codep & 0x10) != 0;
12794
12795       vex.v = *codep & 0x8;
12796       vex.mask_register_specifier = *codep & 0x7;
12797       vex.zeroing = *codep & 0x80;
12798
12799       need_vex = 1;
12800       need_vex_reg = 1;
12801       codep++;
12802       vindex = *codep++;
12803       dp = &evex_table[vex_table_index][vindex];
12804       end_codep = codep;
12805       FETCH_DATA (info, codep + 1);
12806       modrm.mod = (*codep >> 6) & 3;
12807       modrm.reg = (*codep >> 3) & 7;
12808       modrm.rm = *codep & 7;
12809
12810       /* Set vector length.  */
12811       if (modrm.mod == 3 && vex.b)
12812         vex.length = 512;
12813       else
12814         {
12815           switch (vex.ll)
12816             {
12817             case 0x0:
12818               vex.length = 128;
12819               break;
12820             case 0x1:
12821               vex.length = 256;
12822               break;
12823             case 0x2:
12824               vex.length = 512;
12825               break;
12826             default:
12827               return &bad_opcode;
12828             }
12829         }
12830       break;
12831
12832     case 0:
12833       dp = &bad_opcode;
12834       break;
12835
12836     default:
12837       abort ();
12838     }
12839
12840   if (dp->name != NULL)
12841     return dp;
12842   else
12843     return get_valid_dis386 (dp, info);
12844 }
12845
12846 static void
12847 get_sib (disassemble_info *info, int sizeflag)
12848 {
12849   /* If modrm.mod == 3, operand must be register.  */
12850   if (need_modrm
12851       && ((sizeflag & AFLAG) || address_mode == mode_64bit)
12852       && modrm.mod != 3
12853       && modrm.rm == 4)
12854     {
12855       FETCH_DATA (info, codep + 2);
12856       sib.index = (codep [1] >> 3) & 7;
12857       sib.scale = (codep [1] >> 6) & 3;
12858       sib.base = codep [1] & 7;
12859     }
12860 }
12861
12862 static int
12863 print_insn (bfd_vma pc, disassemble_info *info)
12864 {
12865   const struct dis386 *dp;
12866   int i;
12867   char *op_txt[MAX_OPERANDS];
12868   int needcomma;
12869   int sizeflag, orig_sizeflag;
12870   const char *p;
12871   struct dis_private priv;
12872   int prefix_length;
12873
12874   priv.orig_sizeflag = AFLAG | DFLAG;
12875   if ((info->mach & bfd_mach_i386_i386) != 0)
12876     address_mode = mode_32bit;
12877   else if (info->mach == bfd_mach_i386_i8086)
12878     {
12879       address_mode = mode_16bit;
12880       priv.orig_sizeflag = 0;
12881     }
12882   else
12883     address_mode = mode_64bit;
12884
12885   if (intel_syntax == (char) -1)
12886     intel_syntax = (info->mach & bfd_mach_i386_intel_syntax) != 0;
12887
12888   for (p = info->disassembler_options; p != NULL; )
12889     {
12890       if (CONST_STRNEQ (p, "amd64"))
12891         isa64 = amd64;
12892       else if (CONST_STRNEQ (p, "intel64"))
12893         isa64 = intel64;
12894       else if (CONST_STRNEQ (p, "x86-64"))
12895         {
12896           address_mode = mode_64bit;
12897           priv.orig_sizeflag = AFLAG | DFLAG;
12898         }
12899       else if (CONST_STRNEQ (p, "i386"))
12900         {
12901           address_mode = mode_32bit;
12902           priv.orig_sizeflag = AFLAG | DFLAG;
12903         }
12904       else if (CONST_STRNEQ (p, "i8086"))
12905         {
12906           address_mode = mode_16bit;
12907           priv.orig_sizeflag = 0;
12908         }
12909       else if (CONST_STRNEQ (p, "intel"))
12910         {
12911           intel_syntax = 1;
12912           if (CONST_STRNEQ (p + 5, "-mnemonic"))
12913             intel_mnemonic = 1;
12914         }
12915       else if (CONST_STRNEQ (p, "att"))
12916         {
12917           intel_syntax = 0;
12918           if (CONST_STRNEQ (p + 3, "-mnemonic"))
12919             intel_mnemonic = 0;
12920         }
12921       else if (CONST_STRNEQ (p, "addr"))
12922         {
12923           if (address_mode == mode_64bit)
12924             {
12925               if (p[4] == '3' && p[5] == '2')
12926                 priv.orig_sizeflag &= ~AFLAG;
12927               else if (p[4] == '6' && p[5] == '4')
12928                 priv.orig_sizeflag |= AFLAG;
12929             }
12930           else
12931             {
12932               if (p[4] == '1' && p[5] == '6')
12933                 priv.orig_sizeflag &= ~AFLAG;
12934               else if (p[4] == '3' && p[5] == '2')
12935                 priv.orig_sizeflag |= AFLAG;
12936             }
12937         }
12938       else if (CONST_STRNEQ (p, "data"))
12939         {
12940           if (p[4] == '1' && p[5] == '6')
12941             priv.orig_sizeflag &= ~DFLAG;
12942           else if (p[4] == '3' && p[5] == '2')
12943             priv.orig_sizeflag |= DFLAG;
12944         }
12945       else if (CONST_STRNEQ (p, "suffix"))
12946         priv.orig_sizeflag |= SUFFIX_ALWAYS;
12947
12948       p = strchr (p, ',');
12949       if (p != NULL)
12950         p++;
12951     }
12952
12953   if (intel_syntax)
12954     {
12955       names64 = intel_names64;
12956       names32 = intel_names32;
12957       names16 = intel_names16;
12958       names8 = intel_names8;
12959       names8rex = intel_names8rex;
12960       names_seg = intel_names_seg;
12961       names_mm = intel_names_mm;
12962       names_bnd = intel_names_bnd;
12963       names_xmm = intel_names_xmm;
12964       names_ymm = intel_names_ymm;
12965       names_zmm = intel_names_zmm;
12966       index64 = intel_index64;
12967       index32 = intel_index32;
12968       names_mask = intel_names_mask;
12969       index16 = intel_index16;
12970       open_char = '[';
12971       close_char = ']';
12972       separator_char = '+';
12973       scale_char = '*';
12974     }
12975   else
12976     {
12977       names64 = att_names64;
12978       names32 = att_names32;
12979       names16 = att_names16;
12980       names8 = att_names8;
12981       names8rex = att_names8rex;
12982       names_seg = att_names_seg;
12983       names_mm = att_names_mm;
12984       names_bnd = att_names_bnd;
12985       names_xmm = att_names_xmm;
12986       names_ymm = att_names_ymm;
12987       names_zmm = att_names_zmm;
12988       index64 = att_index64;
12989       index32 = att_index32;
12990       names_mask = att_names_mask;
12991       index16 = att_index16;
12992       open_char = '(';
12993       close_char =  ')';
12994       separator_char = ',';
12995       scale_char = ',';
12996     }
12997
12998   /* The output looks better if we put 7 bytes on a line, since that
12999      puts most long word instructions on a single line.  Use 8 bytes
13000      for Intel L1OM.  */
13001   if ((info->mach & bfd_mach_l1om) != 0)
13002     info->bytes_per_line = 8;
13003   else
13004     info->bytes_per_line = 7;
13005
13006   info->private_data = &priv;
13007   priv.max_fetched = priv.the_buffer;
13008   priv.insn_start = pc;
13009
13010   obuf[0] = 0;
13011   for (i = 0; i < MAX_OPERANDS; ++i)
13012     {
13013       op_out[i][0] = 0;
13014       op_index[i] = -1;
13015     }
13016
13017   the_info = info;
13018   start_pc = pc;
13019   start_codep = priv.the_buffer;
13020   codep = priv.the_buffer;
13021
13022   if (OPCODES_SIGSETJMP (priv.bailout) != 0)
13023     {
13024       const char *name;
13025
13026       /* Getting here means we tried for data but didn't get it.  That
13027          means we have an incomplete instruction of some sort.  Just
13028          print the first byte as a prefix or a .byte pseudo-op.  */
13029       if (codep > priv.the_buffer)
13030         {
13031           name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
13032           if (name != NULL)
13033             (*info->fprintf_func) (info->stream, "%s", name);
13034           else
13035             {
13036               /* Just print the first byte as a .byte instruction.  */
13037               (*info->fprintf_func) (info->stream, ".byte 0x%x",
13038                                      (unsigned int) priv.the_buffer[0]);
13039             }
13040
13041           return 1;
13042         }
13043
13044       return -1;
13045     }
13046
13047   obufp = obuf;
13048   sizeflag = priv.orig_sizeflag;
13049
13050   if (!ckprefix () || rex_used)
13051     {
13052       /* Too many prefixes or unused REX prefixes.  */
13053       for (i = 0;
13054            i < (int) ARRAY_SIZE (all_prefixes) && all_prefixes[i];
13055            i++)
13056         (*info->fprintf_func) (info->stream, "%s%s",
13057                                i == 0 ? "" : " ",
13058                                prefix_name (all_prefixes[i], sizeflag));
13059       return i;
13060     }
13061
13062   insn_codep = codep;
13063
13064   FETCH_DATA (info, codep + 1);
13065   two_source_ops = (*codep == 0x62) || (*codep == 0xc8);
13066
13067   if (((prefixes & PREFIX_FWAIT)
13068        && ((*codep < 0xd8) || (*codep > 0xdf))))
13069     {
13070       /* Handle prefixes before fwait.  */
13071       for (i = 0; i < fwait_prefix && all_prefixes[i];
13072            i++)
13073         (*info->fprintf_func) (info->stream, "%s ",
13074                                prefix_name (all_prefixes[i], sizeflag));
13075       (*info->fprintf_func) (info->stream, "fwait");
13076       return i + 1;
13077     }
13078
13079   if (*codep == 0x0f)
13080     {
13081       unsigned char threebyte;
13082       FETCH_DATA (info, codep + 2);
13083       threebyte = *++codep;
13084       dp = &dis386_twobyte[threebyte];
13085       need_modrm = twobyte_has_modrm[*codep];
13086       codep++;
13087     }
13088   else
13089     {
13090       dp = &dis386[*codep];
13091       need_modrm = onebyte_has_modrm[*codep];
13092       codep++;
13093     }
13094
13095   /* Save sizeflag for printing the extra prefixes later before updating
13096      it for mnemonic and operand processing.  The prefix names depend
13097      only on the address mode.  */
13098   orig_sizeflag = sizeflag;
13099   if (prefixes & PREFIX_ADDR)
13100     sizeflag ^= AFLAG;
13101   if ((prefixes & PREFIX_DATA))
13102     sizeflag ^= DFLAG;
13103
13104   end_codep = codep;
13105   if (need_modrm)
13106     {
13107       FETCH_DATA (info, codep + 1);
13108       modrm.mod = (*codep >> 6) & 3;
13109       modrm.reg = (*codep >> 3) & 7;
13110       modrm.rm = *codep & 7;
13111     }
13112
13113   need_vex = 0;
13114   need_vex_reg = 0;
13115   vex_w_done = 0;
13116   vex.evex = 0;
13117
13118   if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE)
13119     {
13120       get_sib (info, sizeflag);
13121       dofloat (sizeflag);
13122     }
13123   else
13124     {
13125       dp = get_valid_dis386 (dp, info);
13126       if (dp != NULL && putop (dp->name, sizeflag) == 0)
13127         {
13128           get_sib (info, sizeflag);
13129           for (i = 0; i < MAX_OPERANDS; ++i)
13130             {
13131               obufp = op_out[i];
13132               op_ad = MAX_OPERANDS - 1 - i;
13133               if (dp->op[i].rtn)
13134                 (*dp->op[i].rtn) (dp->op[i].bytemode, sizeflag);
13135               /* For EVEX instruction after the last operand masking
13136                  should be printed.  */
13137               if (i == 0 && vex.evex)
13138                 {
13139                   /* Don't print {%k0}.  */
13140                   if (vex.mask_register_specifier)
13141                     {
13142                       oappend ("{");
13143                       oappend (names_mask[vex.mask_register_specifier]);
13144                       oappend ("}");
13145                     }
13146                   if (vex.zeroing)
13147                     oappend ("{z}");
13148                 }
13149             }
13150         }
13151     }
13152
13153   /* Check if the REX prefix is used.  */
13154   if (rex_ignored == 0 && (rex ^ rex_used) == 0 && last_rex_prefix >= 0)
13155     all_prefixes[last_rex_prefix] = 0;
13156
13157   /* Check if the SEG prefix is used.  */
13158   if ((prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS | PREFIX_ES
13159                    | PREFIX_FS | PREFIX_GS)) != 0
13160       && (used_prefixes & active_seg_prefix) != 0)
13161     all_prefixes[last_seg_prefix] = 0;
13162
13163   /* Check if the ADDR prefix is used.  */
13164   if ((prefixes & PREFIX_ADDR) != 0
13165       && (used_prefixes & PREFIX_ADDR) != 0)
13166     all_prefixes[last_addr_prefix] = 0;
13167
13168   /* Check if the DATA prefix is used.  */
13169   if ((prefixes & PREFIX_DATA) != 0
13170       && (used_prefixes & PREFIX_DATA) != 0)
13171     all_prefixes[last_data_prefix] = 0;
13172
13173   /* Print the extra prefixes.  */
13174   prefix_length = 0;
13175   for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
13176     if (all_prefixes[i])
13177       {
13178         const char *name;
13179         name = prefix_name (all_prefixes[i], orig_sizeflag);
13180         if (name == NULL)
13181           abort ();
13182         prefix_length += strlen (name) + 1;
13183         (*info->fprintf_func) (info->stream, "%s ", name);
13184       }
13185
13186   /* If the mandatory PREFIX_REPZ/PREFIX_REPNZ/PREFIX_DATA prefix is
13187      unused, opcode is invalid.  Since the PREFIX_DATA prefix may be
13188      used by putop and MMX/SSE operand and may be overriden by the
13189      PREFIX_REPZ/PREFIX_REPNZ fix, we check the PREFIX_DATA prefix
13190      separately.  */
13191   if (dp->prefix_requirement == PREFIX_OPCODE
13192       && dp != &bad_opcode
13193       && (((prefixes
13194             & (PREFIX_REPZ | PREFIX_REPNZ)) != 0
13195            && (used_prefixes
13196                & (PREFIX_REPZ | PREFIX_REPNZ)) == 0)
13197           || ((((prefixes
13198                  & (PREFIX_REPZ | PREFIX_REPNZ | PREFIX_DATA))
13199                 == PREFIX_DATA)
13200                && (used_prefixes & PREFIX_DATA) == 0))))
13201     {
13202       (*info->fprintf_func) (info->stream, "(bad)");
13203       return end_codep - priv.the_buffer;
13204     }
13205
13206   /* Check maximum code length.  */
13207   if ((codep - start_codep) > MAX_CODE_LENGTH)
13208     {
13209       (*info->fprintf_func) (info->stream, "(bad)");
13210       return MAX_CODE_LENGTH;
13211     }
13212
13213   obufp = mnemonicendp;
13214   for (i = strlen (obuf) + prefix_length; i < 6; i++)
13215     oappend (" ");
13216   oappend (" ");
13217   (*info->fprintf_func) (info->stream, "%s", obuf);
13218
13219   /* The enter and bound instructions are printed with operands in the same
13220      order as the intel book; everything else is printed in reverse order.  */
13221   if (intel_syntax || two_source_ops)
13222     {
13223       bfd_vma riprel;
13224
13225       for (i = 0; i < MAX_OPERANDS; ++i)
13226         op_txt[i] = op_out[i];
13227
13228       if (intel_syntax && dp && dp->op[2].rtn == OP_Rounding
13229           && dp->op[3].rtn == OP_E && dp->op[4].rtn == NULL)
13230         {
13231           op_txt[2] = op_out[3];
13232           op_txt[3] = op_out[2];
13233         }
13234
13235       for (i = 0; i < (MAX_OPERANDS >> 1); ++i)
13236         {
13237           op_ad = op_index[i];
13238           op_index[i] = op_index[MAX_OPERANDS - 1 - i];
13239           op_index[MAX_OPERANDS - 1 - i] = op_ad;
13240           riprel = op_riprel[i];
13241           op_riprel[i] = op_riprel [MAX_OPERANDS - 1 - i];
13242           op_riprel[MAX_OPERANDS - 1 - i] = riprel;
13243         }
13244     }
13245   else
13246     {
13247       for (i = 0; i < MAX_OPERANDS; ++i)
13248         op_txt[MAX_OPERANDS - 1 - i] = op_out[i];
13249     }
13250
13251   needcomma = 0;
13252   for (i = 0; i < MAX_OPERANDS; ++i)
13253     if (*op_txt[i])
13254       {
13255         if (needcomma)
13256           (*info->fprintf_func) (info->stream, ",");
13257         if (op_index[i] != -1 && !op_riprel[i])
13258           (*info->print_address_func) ((bfd_vma) op_address[op_index[i]], info);
13259         else
13260           (*info->fprintf_func) (info->stream, "%s", op_txt[i]);
13261         needcomma = 1;
13262       }
13263
13264   for (i = 0; i < MAX_OPERANDS; i++)
13265     if (op_index[i] != -1 && op_riprel[i])
13266       {
13267         (*info->fprintf_func) (info->stream, "        # ");
13268         (*info->print_address_func) ((bfd_vma) (start_pc + codep - start_codep
13269                                                 + op_address[op_index[i]]), info);
13270         break;
13271       }
13272   return codep - priv.the_buffer;
13273 }
13274
13275 static const char *float_mem[] = {
13276   /* d8 */
13277   "fadd{s|}",
13278   "fmul{s|}",
13279   "fcom{s|}",
13280   "fcomp{s|}",
13281   "fsub{s|}",
13282   "fsubr{s|}",
13283   "fdiv{s|}",
13284   "fdivr{s|}",
13285   /* d9 */
13286   "fld{s|}",
13287   "(bad)",
13288   "fst{s|}",
13289   "fstp{s|}",
13290   "fldenvIC",
13291   "fldcw",
13292   "fNstenvIC",
13293   "fNstcw",
13294   /* da */
13295   "fiadd{l|}",
13296   "fimul{l|}",
13297   "ficom{l|}",
13298   "ficomp{l|}",
13299   "fisub{l|}",
13300   "fisubr{l|}",
13301   "fidiv{l|}",
13302   "fidivr{l|}",
13303   /* db */
13304   "fild{l|}",
13305   "fisttp{l|}",
13306   "fist{l|}",
13307   "fistp{l|}",
13308   "(bad)",
13309   "fld{t||t|}",
13310   "(bad)",
13311   "fstp{t||t|}",
13312   /* dc */
13313   "fadd{l|}",
13314   "fmul{l|}",
13315   "fcom{l|}",
13316   "fcomp{l|}",
13317   "fsub{l|}",
13318   "fsubr{l|}",
13319   "fdiv{l|}",
13320   "fdivr{l|}",
13321   /* dd */
13322   "fld{l|}",
13323   "fisttp{ll|}",
13324   "fst{l||}",
13325   "fstp{l|}",
13326   "frstorIC",
13327   "(bad)",
13328   "fNsaveIC",
13329   "fNstsw",
13330   /* de */
13331   "fiadd",
13332   "fimul",
13333   "ficom",
13334   "ficomp",
13335   "fisub",
13336   "fisubr",
13337   "fidiv",
13338   "fidivr",
13339   /* df */
13340   "fild",
13341   "fisttp",
13342   "fist",
13343   "fistp",
13344   "fbld",
13345   "fild{ll|}",
13346   "fbstp",
13347   "fistp{ll|}",
13348 };
13349
13350 static const unsigned char float_mem_mode[] = {
13351   /* d8 */
13352   d_mode,
13353   d_mode,
13354   d_mode,
13355   d_mode,
13356   d_mode,
13357   d_mode,
13358   d_mode,
13359   d_mode,
13360   /* d9 */
13361   d_mode,
13362   0,
13363   d_mode,
13364   d_mode,
13365   0,
13366   w_mode,
13367   0,
13368   w_mode,
13369   /* da */
13370   d_mode,
13371   d_mode,
13372   d_mode,
13373   d_mode,
13374   d_mode,
13375   d_mode,
13376   d_mode,
13377   d_mode,
13378   /* db */
13379   d_mode,
13380   d_mode,
13381   d_mode,
13382   d_mode,
13383   0,
13384   t_mode,
13385   0,
13386   t_mode,
13387   /* dc */
13388   q_mode,
13389   q_mode,
13390   q_mode,
13391   q_mode,
13392   q_mode,
13393   q_mode,
13394   q_mode,
13395   q_mode,
13396   /* dd */
13397   q_mode,
13398   q_mode,
13399   q_mode,
13400   q_mode,
13401   0,
13402   0,
13403   0,
13404   w_mode,
13405   /* de */
13406   w_mode,
13407   w_mode,
13408   w_mode,
13409   w_mode,
13410   w_mode,
13411   w_mode,
13412   w_mode,
13413   w_mode,
13414   /* df */
13415   w_mode,
13416   w_mode,
13417   w_mode,
13418   w_mode,
13419   t_mode,
13420   q_mode,
13421   t_mode,
13422   q_mode
13423 };
13424
13425 #define ST { OP_ST, 0 }
13426 #define STi { OP_STi, 0 }
13427
13428 #define FGRPd9_2 NULL, { { NULL, 0 } }, 0
13429 #define FGRPd9_4 NULL, { { NULL, 1 } }, 0
13430 #define FGRPd9_5 NULL, { { NULL, 2 } }, 0
13431 #define FGRPd9_6 NULL, { { NULL, 3 } }, 0
13432 #define FGRPd9_7 NULL, { { NULL, 4 } }, 0
13433 #define FGRPda_5 NULL, { { NULL, 5 } }, 0
13434 #define FGRPdb_4 NULL, { { NULL, 6 } }, 0
13435 #define FGRPde_3 NULL, { { NULL, 7 } }, 0
13436 #define FGRPdf_4 NULL, { { NULL, 8 } }, 0
13437
13438 static const struct dis386 float_reg[][8] = {
13439   /* d8 */
13440   {
13441     { "fadd",   { ST, STi }, 0 },
13442     { "fmul",   { ST, STi }, 0 },
13443     { "fcom",   { STi }, 0 },
13444     { "fcomp",  { STi }, 0 },
13445     { "fsub",   { ST, STi }, 0 },
13446     { "fsubr",  { ST, STi }, 0 },
13447     { "fdiv",   { ST, STi }, 0 },
13448     { "fdivr",  { ST, STi }, 0 },
13449   },
13450   /* d9 */
13451   {
13452     { "fld",    { STi }, 0 },
13453     { "fxch",   { STi }, 0 },
13454     { FGRPd9_2 },
13455     { Bad_Opcode },
13456     { FGRPd9_4 },
13457     { FGRPd9_5 },
13458     { FGRPd9_6 },
13459     { FGRPd9_7 },
13460   },
13461   /* da */
13462   {
13463     { "fcmovb", { ST, STi }, 0 },
13464     { "fcmove", { ST, STi }, 0 },
13465     { "fcmovbe",{ ST, STi }, 0 },
13466     { "fcmovu", { ST, STi }, 0 },
13467     { Bad_Opcode },
13468     { FGRPda_5 },
13469     { Bad_Opcode },
13470     { Bad_Opcode },
13471   },
13472   /* db */
13473   {
13474     { "fcmovnb",{ ST, STi }, 0 },
13475     { "fcmovne",{ ST, STi }, 0 },
13476     { "fcmovnbe",{ ST, STi }, 0 },
13477     { "fcmovnu",{ ST, STi }, 0 },
13478     { FGRPdb_4 },
13479     { "fucomi", { ST, STi }, 0 },
13480     { "fcomi",  { ST, STi }, 0 },
13481     { Bad_Opcode },
13482   },
13483   /* dc */
13484   {
13485     { "fadd",   { STi, ST }, 0 },
13486     { "fmul",   { STi, ST }, 0 },
13487     { Bad_Opcode },
13488     { Bad_Opcode },
13489     { "fsub!M", { STi, ST }, 0 },
13490     { "fsubM",  { STi, ST }, 0 },
13491     { "fdiv!M", { STi, ST }, 0 },
13492     { "fdivM",  { STi, ST }, 0 },
13493   },
13494   /* dd */
13495   {
13496     { "ffree",  { STi }, 0 },
13497     { Bad_Opcode },
13498     { "fst",    { STi }, 0 },
13499     { "fstp",   { STi }, 0 },
13500     { "fucom",  { STi }, 0 },
13501     { "fucomp", { STi }, 0 },
13502     { Bad_Opcode },
13503     { Bad_Opcode },
13504   },
13505   /* de */
13506   {
13507     { "faddp",  { STi, ST }, 0 },
13508     { "fmulp",  { STi, ST }, 0 },
13509     { Bad_Opcode },
13510     { FGRPde_3 },
13511     { "fsub!Mp", { STi, ST }, 0 },
13512     { "fsubMp", { STi, ST }, 0 },
13513     { "fdiv!Mp", { STi, ST }, 0 },
13514     { "fdivMp", { STi, ST }, 0 },
13515   },
13516   /* df */
13517   {
13518     { "ffreep", { STi }, 0 },
13519     { Bad_Opcode },
13520     { Bad_Opcode },
13521     { Bad_Opcode },
13522     { FGRPdf_4 },
13523     { "fucomip", { ST, STi }, 0 },
13524     { "fcomip", { ST, STi }, 0 },
13525     { Bad_Opcode },
13526   },
13527 };
13528
13529 static char *fgrps[][8] = {
13530   /* d9_2  0 */
13531   {
13532     "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
13533   },
13534
13535   /* d9_4  1 */
13536   {
13537     "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
13538   },
13539
13540   /* d9_5  2 */
13541   {
13542     "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
13543   },
13544
13545   /* d9_6  3 */
13546   {
13547     "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
13548   },
13549
13550   /* d9_7  4 */
13551   {
13552     "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
13553   },
13554
13555   /* da_5  5 */
13556   {
13557     "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
13558   },
13559
13560   /* db_4  6 */
13561   {
13562     "fNeni(8087 only)","fNdisi(8087 only)","fNclex","fNinit",
13563     "fNsetpm(287 only)","frstpm(287 only)","(bad)","(bad)",
13564   },
13565
13566   /* de_3  7 */
13567   {
13568     "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
13569   },
13570
13571   /* df_4  8 */
13572   {
13573     "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
13574   },
13575 };
13576
13577 static void
13578 swap_operand (void)
13579 {
13580   mnemonicendp[0] = '.';
13581   mnemonicendp[1] = 's';
13582   mnemonicendp += 2;
13583 }
13584
13585 static void
13586 OP_Skip_MODRM (int bytemode ATTRIBUTE_UNUSED,
13587                int sizeflag ATTRIBUTE_UNUSED)
13588 {
13589   /* Skip mod/rm byte.  */
13590   MODRM_CHECK;
13591   codep++;
13592 }
13593
13594 static void
13595 dofloat (int sizeflag)
13596 {
13597   const struct dis386 *dp;
13598   unsigned char floatop;
13599
13600   floatop = codep[-1];
13601
13602   if (modrm.mod != 3)
13603     {
13604       int fp_indx = (floatop - 0xd8) * 8 + modrm.reg;
13605
13606       putop (float_mem[fp_indx], sizeflag);
13607       obufp = op_out[0];
13608       op_ad = 2;
13609       OP_E (float_mem_mode[fp_indx], sizeflag);
13610       return;
13611     }
13612   /* Skip mod/rm byte.  */
13613   MODRM_CHECK;
13614   codep++;
13615
13616   dp = &float_reg[floatop - 0xd8][modrm.reg];
13617   if (dp->name == NULL)
13618     {
13619       putop (fgrps[dp->op[0].bytemode][modrm.rm], sizeflag);
13620
13621       /* Instruction fnstsw is only one with strange arg.  */
13622       if (floatop == 0xdf && codep[-1] == 0xe0)
13623         strcpy (op_out[0], names16[0]);
13624     }
13625   else
13626     {
13627       putop (dp->name, sizeflag);
13628
13629       obufp = op_out[0];
13630       op_ad = 2;
13631       if (dp->op[0].rtn)
13632         (*dp->op[0].rtn) (dp->op[0].bytemode, sizeflag);
13633
13634       obufp = op_out[1];
13635       op_ad = 1;
13636       if (dp->op[1].rtn)
13637         (*dp->op[1].rtn) (dp->op[1].bytemode, sizeflag);
13638     }
13639 }
13640
13641 /* Like oappend (below), but S is a string starting with '%'.
13642    In Intel syntax, the '%' is elided.  */
13643 static void
13644 oappend_maybe_intel (const char *s)
13645 {
13646   oappend (s + intel_syntax);
13647 }
13648
13649 static void
13650 OP_ST (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13651 {
13652   oappend_maybe_intel ("%st");
13653 }
13654
13655 static void
13656 OP_STi (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13657 {
13658   sprintf (scratchbuf, "%%st(%d)", modrm.rm);
13659   oappend_maybe_intel (scratchbuf);
13660 }
13661
13662 /* Capital letters in template are macros.  */
13663 static int
13664 putop (const char *in_template, int sizeflag)
13665 {
13666   const char *p;
13667   int alt = 0;
13668   int cond = 1;
13669   unsigned int l = 0, len = 1;
13670   char last[4];
13671
13672 #define SAVE_LAST(c)                    \
13673   if (l < len && l < sizeof (last))     \
13674     last[l++] = c;                      \
13675   else                                  \
13676     abort ();
13677
13678   for (p = in_template; *p; p++)
13679     {
13680       switch (*p)
13681         {
13682         default:
13683           *obufp++ = *p;
13684           break;
13685         case '%':
13686           len++;
13687           break;
13688         case '!':
13689           cond = 0;
13690           break;
13691         case '{':
13692           alt = 0;
13693           if (intel_syntax)
13694             {
13695               while (*++p != '|')
13696                 if (*p == '}' || *p == '\0')
13697                   abort ();
13698             }
13699           /* Fall through.  */
13700         case 'I':
13701           alt = 1;
13702           continue;
13703         case '|':
13704           while (*++p != '}')
13705             {
13706               if (*p == '\0')
13707                 abort ();
13708             }
13709           break;
13710         case '}':
13711           break;
13712         case 'A':
13713           if (intel_syntax)
13714             break;
13715           if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
13716             *obufp++ = 'b';
13717           break;
13718         case 'B':
13719           if (l == 0 && len == 1)
13720             {
13721 case_B:
13722               if (intel_syntax)
13723                 break;
13724               if (sizeflag & SUFFIX_ALWAYS)
13725                 *obufp++ = 'b';
13726             }
13727           else
13728             {
13729               if (l != 1
13730                   || len != 2
13731                   || last[0] != 'L')
13732                 {
13733                   SAVE_LAST (*p);
13734                   break;
13735                 }
13736
13737               if (address_mode == mode_64bit
13738                   && !(prefixes & PREFIX_ADDR))
13739                 {
13740                   *obufp++ = 'a';
13741                   *obufp++ = 'b';
13742                   *obufp++ = 's';
13743                 }
13744
13745               goto case_B;
13746             }
13747           break;
13748         case 'C':
13749           if (intel_syntax && !alt)
13750             break;
13751           if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
13752             {
13753               if (sizeflag & DFLAG)
13754                 *obufp++ = intel_syntax ? 'd' : 'l';
13755               else
13756                 *obufp++ = intel_syntax ? 'w' : 's';
13757               used_prefixes |= (prefixes & PREFIX_DATA);
13758             }
13759           break;
13760         case 'D':
13761           if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
13762             break;
13763           USED_REX (REX_W);
13764           if (modrm.mod == 3)
13765             {
13766               if (rex & REX_W)
13767                 *obufp++ = 'q';
13768               else
13769                 {
13770                   if (sizeflag & DFLAG)
13771                     *obufp++ = intel_syntax ? 'd' : 'l';
13772                   else
13773                     *obufp++ = 'w';
13774                   used_prefixes |= (prefixes & PREFIX_DATA);
13775                 }
13776             }
13777           else
13778             *obufp++ = 'w';
13779           break;
13780         case 'E':               /* For jcxz/jecxz */
13781           if (address_mode == mode_64bit)
13782             {
13783               if (sizeflag & AFLAG)
13784                 *obufp++ = 'r';
13785               else
13786                 *obufp++ = 'e';
13787             }
13788           else
13789             if (sizeflag & AFLAG)
13790               *obufp++ = 'e';
13791           used_prefixes |= (prefixes & PREFIX_ADDR);
13792           break;
13793         case 'F':
13794           if (intel_syntax)
13795             break;
13796           if ((prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS))
13797             {
13798               if (sizeflag & AFLAG)
13799                 *obufp++ = address_mode == mode_64bit ? 'q' : 'l';
13800               else
13801                 *obufp++ = address_mode == mode_64bit ? 'l' : 'w';
13802               used_prefixes |= (prefixes & PREFIX_ADDR);
13803             }
13804           break;
13805         case 'G':
13806           if (intel_syntax || (obufp[-1] != 's' && !(sizeflag & SUFFIX_ALWAYS)))
13807             break;
13808           if ((rex & REX_W) || (sizeflag & DFLAG))
13809             *obufp++ = 'l';
13810           else
13811             *obufp++ = 'w';
13812           if (!(rex & REX_W))
13813             used_prefixes |= (prefixes & PREFIX_DATA);
13814           break;
13815         case 'H':
13816           if (intel_syntax)
13817             break;
13818           if ((prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS
13819               || (prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS)
13820             {
13821               used_prefixes |= prefixes & (PREFIX_CS | PREFIX_DS);
13822               *obufp++ = ',';
13823               *obufp++ = 'p';
13824               if (prefixes & PREFIX_DS)
13825                 *obufp++ = 't';
13826               else
13827                 *obufp++ = 'n';
13828             }
13829           break;
13830         case 'J':
13831           if (intel_syntax)
13832             break;
13833           *obufp++ = 'l';
13834           break;
13835         case 'K':
13836           USED_REX (REX_W);
13837           if (rex & REX_W)
13838             *obufp++ = 'q';
13839           else
13840             *obufp++ = 'd';
13841           break;
13842         case 'Z':
13843           if (l != 0 || len != 1)
13844             {
13845               if (l != 1 || len != 2 || last[0] != 'X')
13846                 {
13847                   SAVE_LAST (*p);
13848                   break;
13849                 }
13850               if (!need_vex || !vex.evex)
13851                 abort ();
13852               if (intel_syntax
13853                   || ((modrm.mod == 3 || vex.b) && !(sizeflag & SUFFIX_ALWAYS)))
13854                 break;
13855               switch (vex.length)
13856                 {
13857                 case 128:
13858                   *obufp++ = 'x';
13859                   break;
13860                 case 256:
13861                   *obufp++ = 'y';
13862                   break;
13863                 case 512:
13864                   *obufp++ = 'z';
13865                   break;
13866                 default:
13867                   abort ();
13868                 }
13869               break;
13870             }
13871           if (intel_syntax)
13872             break;
13873           if (address_mode == mode_64bit && (sizeflag & SUFFIX_ALWAYS))
13874             {
13875               *obufp++ = 'q';
13876               break;
13877             }
13878           /* Fall through.  */
13879           goto case_L;
13880         case 'L':
13881           if (l != 0 || len != 1)
13882             {
13883               SAVE_LAST (*p);
13884               break;
13885             }
13886 case_L:
13887           if (intel_syntax)
13888             break;
13889           if (sizeflag & SUFFIX_ALWAYS)
13890             *obufp++ = 'l';
13891           break;
13892         case 'M':
13893           if (intel_mnemonic != cond)
13894             *obufp++ = 'r';
13895           break;
13896         case 'N':
13897           if ((prefixes & PREFIX_FWAIT) == 0)
13898             *obufp++ = 'n';
13899           else
13900             used_prefixes |= PREFIX_FWAIT;
13901           break;
13902         case 'O':
13903           USED_REX (REX_W);
13904           if (rex & REX_W)
13905             *obufp++ = 'o';
13906           else if (intel_syntax && (sizeflag & DFLAG))
13907             *obufp++ = 'q';
13908           else
13909             *obufp++ = 'd';
13910           if (!(rex & REX_W))
13911             used_prefixes |= (prefixes & PREFIX_DATA);
13912           break;
13913         case 'T':
13914           if (!intel_syntax
13915               && address_mode == mode_64bit
13916               && ((sizeflag & DFLAG) || (rex & REX_W)))
13917             {
13918               *obufp++ = 'q';
13919               break;
13920             }
13921           /* Fall through.  */
13922           goto case_P;
13923         case 'P':
13924           if (l == 0 && len == 1)
13925             {
13926 case_P:
13927               if (intel_syntax)
13928                 {
13929                   if ((rex & REX_W) == 0
13930                       && (prefixes & PREFIX_DATA))
13931                     {
13932                       if ((sizeflag & DFLAG) == 0)
13933                         *obufp++ = 'w';
13934                       used_prefixes |= (prefixes & PREFIX_DATA);
13935                     }
13936                   break;
13937                 }
13938               if ((prefixes & PREFIX_DATA)
13939                   || (rex & REX_W)
13940                   || (sizeflag & SUFFIX_ALWAYS))
13941                 {
13942                   USED_REX (REX_W);
13943                   if (rex & REX_W)
13944                     *obufp++ = 'q';
13945                   else
13946                     {
13947                       if (sizeflag & DFLAG)
13948                         *obufp++ = 'l';
13949                       else
13950                         *obufp++ = 'w';
13951                       used_prefixes |= (prefixes & PREFIX_DATA);
13952                     }
13953                 }
13954             }
13955           else
13956             {
13957               if (l != 1 || len != 2 || last[0] != 'L')
13958                 {
13959                   SAVE_LAST (*p);
13960                   break;
13961                 }
13962
13963               if ((prefixes & PREFIX_DATA)
13964                   || (rex & REX_W)
13965                   || (sizeflag & SUFFIX_ALWAYS))
13966                 {
13967                   USED_REX (REX_W);
13968                   if (rex & REX_W)
13969                     *obufp++ = 'q';
13970                   else
13971                     {
13972                       if (sizeflag & DFLAG)
13973                         *obufp++ = intel_syntax ? 'd' : 'l';
13974                       else
13975                         *obufp++ = 'w';
13976                       used_prefixes |= (prefixes & PREFIX_DATA);
13977                     }
13978                 }
13979             }
13980           break;
13981         case 'U':
13982           if (intel_syntax)
13983             break;
13984           if (address_mode == mode_64bit
13985               && ((sizeflag & DFLAG) || (rex & REX_W)))
13986             {
13987               if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
13988                 *obufp++ = 'q';
13989               break;
13990             }
13991           /* Fall through.  */
13992           goto case_Q;
13993         case 'Q':
13994           if (l == 0 && len == 1)
13995             {
13996 case_Q:
13997               if (intel_syntax && !alt)
13998                 break;
13999               USED_REX (REX_W);
14000               if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
14001                 {
14002                   if (rex & REX_W)
14003                     *obufp++ = 'q';
14004                   else
14005                     {
14006                       if (sizeflag & DFLAG)
14007                         *obufp++ = intel_syntax ? 'd' : 'l';
14008                       else
14009                         *obufp++ = 'w';
14010                       used_prefixes |= (prefixes & PREFIX_DATA);
14011                     }
14012                 }
14013             }
14014           else
14015             {
14016               if (l != 1 || len != 2 || last[0] != 'L')
14017                 {
14018                   SAVE_LAST (*p);
14019                   break;
14020                 }
14021               if (intel_syntax
14022                   || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
14023                 break;
14024               if ((rex & REX_W))
14025                 {
14026                   USED_REX (REX_W);
14027                   *obufp++ = 'q';
14028                 }
14029               else
14030                 *obufp++ = 'l';
14031             }
14032           break;
14033         case 'R':
14034           USED_REX (REX_W);
14035           if (rex & REX_W)
14036             *obufp++ = 'q';
14037           else if (sizeflag & DFLAG)
14038             {
14039               if (intel_syntax)
14040                   *obufp++ = 'd';
14041               else
14042                   *obufp++ = 'l';
14043             }
14044           else
14045             *obufp++ = 'w';
14046           if (intel_syntax && !p[1]
14047               && ((rex & REX_W) || (sizeflag & DFLAG)))
14048             *obufp++ = 'e';
14049           if (!(rex & REX_W))
14050             used_prefixes |= (prefixes & PREFIX_DATA);
14051           break;
14052         case 'V':
14053           if (l == 0 && len == 1)
14054             {
14055               if (intel_syntax)
14056                 break;
14057               if (address_mode == mode_64bit
14058                   && ((sizeflag & DFLAG) || (rex & REX_W)))
14059                 {
14060                   if (sizeflag & SUFFIX_ALWAYS)
14061                     *obufp++ = 'q';
14062                   break;
14063                 }
14064             }
14065           else
14066             {
14067               if (l != 1
14068                   || len != 2
14069                   || last[0] != 'L')
14070                 {
14071                   SAVE_LAST (*p);
14072                   break;
14073                 }
14074
14075               if (rex & REX_W)
14076                 {
14077                   *obufp++ = 'a';
14078                   *obufp++ = 'b';
14079                   *obufp++ = 's';
14080                 }
14081             }
14082           /* Fall through.  */
14083           goto case_S;
14084         case 'S':
14085           if (l == 0 && len == 1)
14086             {
14087 case_S:
14088               if (intel_syntax)
14089                 break;
14090               if (sizeflag & SUFFIX_ALWAYS)
14091                 {
14092                   if (rex & REX_W)
14093                     *obufp++ = 'q';
14094                   else
14095                     {
14096                       if (sizeflag & DFLAG)
14097                         *obufp++ = 'l';
14098                       else
14099                         *obufp++ = 'w';
14100                       used_prefixes |= (prefixes & PREFIX_DATA);
14101                     }
14102                 }
14103             }
14104           else
14105             {
14106               if (l != 1
14107                   || len != 2
14108                   || last[0] != 'L')
14109                 {
14110                   SAVE_LAST (*p);
14111                   break;
14112                 }
14113
14114               if (address_mode == mode_64bit
14115                   && !(prefixes & PREFIX_ADDR))
14116                 {
14117                   *obufp++ = 'a';
14118                   *obufp++ = 'b';
14119                   *obufp++ = 's';
14120                 }
14121
14122               goto case_S;
14123             }
14124           break;
14125         case 'X':
14126           if (l != 0 || len != 1)
14127             {
14128               SAVE_LAST (*p);
14129               break;
14130             }
14131           if (need_vex && vex.prefix)
14132             {
14133               if (vex.prefix == DATA_PREFIX_OPCODE)
14134                 *obufp++ = 'd';
14135               else
14136                 *obufp++ = 's';
14137             }
14138           else
14139             {
14140               if (prefixes & PREFIX_DATA)
14141                 *obufp++ = 'd';
14142               else
14143                 *obufp++ = 's';
14144               used_prefixes |= (prefixes & PREFIX_DATA);
14145             }
14146           break;
14147         case 'Y':
14148           if (l == 0 && len == 1)
14149             {
14150               if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
14151                 break;
14152               if (rex & REX_W)
14153                 {
14154                   USED_REX (REX_W);
14155                   *obufp++ = 'q';
14156                 }
14157               break;
14158             }
14159           else
14160             {
14161               if (l != 1 || len != 2 || last[0] != 'X')
14162                 {
14163                   SAVE_LAST (*p);
14164                   break;
14165                 }
14166               if (!need_vex)
14167                 abort ();
14168               if (intel_syntax
14169                   || ((modrm.mod == 3 || vex.b) && !(sizeflag & SUFFIX_ALWAYS)))
14170                 break;
14171               switch (vex.length)
14172                 {
14173                 case 128:
14174                   *obufp++ = 'x';
14175                   break;
14176                 case 256:
14177                   *obufp++ = 'y';
14178                   break;
14179                 case 512:
14180                   if (!vex.evex)
14181                 default:
14182                     abort ();
14183                 }
14184             }
14185           break;
14186         case 'W':
14187           if (l == 0 && len == 1)
14188             {
14189               /* operand size flag for cwtl, cbtw */
14190               USED_REX (REX_W);
14191               if (rex & REX_W)
14192                 {
14193                   if (intel_syntax)
14194                     *obufp++ = 'd';
14195                   else
14196                     *obufp++ = 'l';
14197                 }
14198               else if (sizeflag & DFLAG)
14199                 *obufp++ = 'w';
14200               else
14201                 *obufp++ = 'b';
14202               if (!(rex & REX_W))
14203                 used_prefixes |= (prefixes & PREFIX_DATA);
14204             }
14205           else
14206             {
14207               if (l != 1
14208                   || len != 2
14209                   || (last[0] != 'X'
14210                       && last[0] != 'L'))
14211                 {
14212                   SAVE_LAST (*p);
14213                   break;
14214                 }
14215               if (!need_vex)
14216                 abort ();
14217               if (last[0] == 'X')
14218                 *obufp++ = vex.w ? 'd': 's';
14219               else
14220                 *obufp++ = vex.w ? 'q': 'd';
14221             }
14222           break;
14223         case '^':
14224           if (intel_syntax)
14225             break;
14226           if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
14227             {
14228               if (sizeflag & DFLAG)
14229                 *obufp++ = 'l';
14230               else
14231                 *obufp++ = 'w';
14232               used_prefixes |= (prefixes & PREFIX_DATA);
14233             }
14234           break;
14235         case '@':
14236           if (intel_syntax)
14237             break;
14238           if (address_mode == mode_64bit
14239               && (isa64 == intel64
14240                   || ((sizeflag & DFLAG) || (rex & REX_W))))
14241               *obufp++ = 'q';
14242           else if ((prefixes & PREFIX_DATA))
14243             {
14244               if (!(sizeflag & DFLAG))
14245                 *obufp++ = 'w';
14246               used_prefixes |= (prefixes & PREFIX_DATA);
14247             }
14248           break;
14249         }
14250       alt = 0;
14251     }
14252   *obufp = 0;
14253   mnemonicendp = obufp;
14254   return 0;
14255 }
14256
14257 static void
14258 oappend (const char *s)
14259 {
14260   obufp = stpcpy (obufp, s);
14261 }
14262
14263 static void
14264 append_seg (void)
14265 {
14266   /* Only print the active segment register.  */
14267   if (!active_seg_prefix)
14268     return;
14269
14270   used_prefixes |= active_seg_prefix;
14271   switch (active_seg_prefix)
14272     {
14273     case PREFIX_CS:
14274       oappend_maybe_intel ("%cs:");
14275       break;
14276     case PREFIX_DS:
14277       oappend_maybe_intel ("%ds:");
14278       break;
14279     case PREFIX_SS:
14280       oappend_maybe_intel ("%ss:");
14281       break;
14282     case PREFIX_ES:
14283       oappend_maybe_intel ("%es:");
14284       break;
14285     case PREFIX_FS:
14286       oappend_maybe_intel ("%fs:");
14287       break;
14288     case PREFIX_GS:
14289       oappend_maybe_intel ("%gs:");
14290       break;
14291     default:
14292       break;
14293     }
14294 }
14295
14296 static void
14297 OP_indirE (int bytemode, int sizeflag)
14298 {
14299   if (!intel_syntax)
14300     oappend ("*");
14301   OP_E (bytemode, sizeflag);
14302 }
14303
14304 static void
14305 print_operand_value (char *buf, int hex, bfd_vma disp)
14306 {
14307   if (address_mode == mode_64bit)
14308     {
14309       if (hex)
14310         {
14311           char tmp[30];
14312           int i;
14313           buf[0] = '0';
14314           buf[1] = 'x';
14315           sprintf_vma (tmp, disp);
14316           for (i = 0; tmp[i] == '0' && tmp[i + 1]; i++);
14317           strcpy (buf + 2, tmp + i);
14318         }
14319       else
14320         {
14321           bfd_signed_vma v = disp;
14322           char tmp[30];
14323           int i;
14324           if (v < 0)
14325             {
14326               *(buf++) = '-';
14327               v = -disp;
14328               /* Check for possible overflow on 0x8000000000000000.  */
14329               if (v < 0)
14330                 {
14331                   strcpy (buf, "9223372036854775808");
14332                   return;
14333                 }
14334             }
14335           if (!v)
14336             {
14337               strcpy (buf, "0");
14338               return;
14339             }
14340
14341           i = 0;
14342           tmp[29] = 0;
14343           while (v)
14344             {
14345               tmp[28 - i] = (v % 10) + '0';
14346               v /= 10;
14347               i++;
14348             }
14349           strcpy (buf, tmp + 29 - i);
14350         }
14351     }
14352   else
14353     {
14354       if (hex)
14355         sprintf (buf, "0x%x", (unsigned int) disp);
14356       else
14357         sprintf (buf, "%d", (int) disp);
14358     }
14359 }
14360
14361 /* Put DISP in BUF as signed hex number.  */
14362
14363 static void
14364 print_displacement (char *buf, bfd_vma disp)
14365 {
14366   bfd_signed_vma val = disp;
14367   char tmp[30];
14368   int i, j = 0;
14369
14370   if (val < 0)
14371     {
14372       buf[j++] = '-';
14373       val = -disp;
14374
14375       /* Check for possible overflow.  */
14376       if (val < 0)
14377         {
14378           switch (address_mode)
14379             {
14380             case mode_64bit:
14381               strcpy (buf + j, "0x8000000000000000");
14382               break;
14383             case mode_32bit:
14384               strcpy (buf + j, "0x80000000");
14385               break;
14386             case mode_16bit:
14387               strcpy (buf + j, "0x8000");
14388               break;
14389             }
14390           return;
14391         }
14392     }
14393
14394   buf[j++] = '0';
14395   buf[j++] = 'x';
14396
14397   sprintf_vma (tmp, (bfd_vma) val);
14398   for (i = 0; tmp[i] == '0'; i++)
14399     continue;
14400   if (tmp[i] == '\0')
14401     i--;
14402   strcpy (buf + j, tmp + i);
14403 }
14404
14405 static void
14406 intel_operand_size (int bytemode, int sizeflag)
14407 {
14408   if (vex.evex
14409       && vex.b
14410       && (bytemode == x_mode
14411           || bytemode == evex_half_bcst_xmmq_mode))
14412     {
14413       if (vex.w)
14414         oappend ("QWORD PTR ");
14415       else
14416         oappend ("DWORD PTR ");
14417       return;
14418     }
14419   switch (bytemode)
14420     {
14421     case b_mode:
14422     case b_swap_mode:
14423     case dqb_mode:
14424     case db_mode:
14425       oappend ("BYTE PTR ");
14426       break;
14427     case w_mode:
14428     case dw_mode:
14429     case dqw_mode:
14430     case dqw_swap_mode:
14431       oappend ("WORD PTR ");
14432       break;
14433     case stack_v_mode:
14434       if (address_mode == mode_64bit && ((sizeflag & DFLAG) || (rex & REX_W)))
14435         {
14436           oappend ("QWORD PTR ");
14437           break;
14438         }
14439       /* FALLTHRU */
14440     case v_mode:
14441     case v_swap_mode:
14442     case dq_mode:
14443       USED_REX (REX_W);
14444       if (rex & REX_W)
14445         oappend ("QWORD PTR ");
14446       else
14447         {
14448           if ((sizeflag & DFLAG) || bytemode == dq_mode)
14449             oappend ("DWORD PTR ");
14450           else
14451             oappend ("WORD PTR ");
14452           used_prefixes |= (prefixes & PREFIX_DATA);
14453         }
14454       break;
14455     case z_mode:
14456       if ((rex & REX_W) || (sizeflag & DFLAG))
14457         *obufp++ = 'D';
14458       oappend ("WORD PTR ");
14459       if (!(rex & REX_W))
14460         used_prefixes |= (prefixes & PREFIX_DATA);
14461       break;
14462     case a_mode:
14463       if (sizeflag & DFLAG)
14464         oappend ("QWORD PTR ");
14465       else
14466         oappend ("DWORD PTR ");
14467       used_prefixes |= (prefixes & PREFIX_DATA);
14468       break;
14469     case d_mode:
14470     case d_scalar_mode:
14471     case d_scalar_swap_mode:
14472     case d_swap_mode:
14473     case dqd_mode:
14474       oappend ("DWORD PTR ");
14475       break;
14476     case q_mode:
14477     case q_scalar_mode:
14478     case q_scalar_swap_mode:
14479     case q_swap_mode:
14480       oappend ("QWORD PTR ");
14481       break;
14482     case m_mode:
14483       if (address_mode == mode_64bit)
14484         oappend ("QWORD PTR ");
14485       else
14486         oappend ("DWORD PTR ");
14487       break;
14488     case f_mode:
14489       if (sizeflag & DFLAG)
14490         oappend ("FWORD PTR ");
14491       else
14492         oappend ("DWORD PTR ");
14493       used_prefixes |= (prefixes & PREFIX_DATA);
14494       break;
14495     case t_mode:
14496       oappend ("TBYTE PTR ");
14497       break;
14498     case x_mode:
14499     case x_swap_mode:
14500     case evex_x_gscat_mode:
14501     case evex_x_nobcst_mode:
14502       if (need_vex)
14503         {
14504           switch (vex.length)
14505             {
14506             case 128:
14507               oappend ("XMMWORD PTR ");
14508               break;
14509             case 256:
14510               oappend ("YMMWORD PTR ");
14511               break;
14512             case 512:
14513               oappend ("ZMMWORD PTR ");
14514               break;
14515             default:
14516               abort ();
14517             }
14518         }
14519       else
14520         oappend ("XMMWORD PTR ");
14521       break;
14522     case xmm_mode:
14523       oappend ("XMMWORD PTR ");
14524       break;
14525     case ymm_mode:
14526       oappend ("YMMWORD PTR ");
14527       break;
14528     case xmmq_mode:
14529     case evex_half_bcst_xmmq_mode:
14530       if (!need_vex)
14531         abort ();
14532
14533       switch (vex.length)
14534         {
14535         case 128:
14536           oappend ("QWORD PTR ");
14537           break;
14538         case 256:
14539           oappend ("XMMWORD PTR ");
14540           break;
14541         case 512:
14542           oappend ("YMMWORD PTR ");
14543           break;
14544         default:
14545           abort ();
14546         }
14547       break;
14548     case xmm_mb_mode:
14549       if (!need_vex)
14550         abort ();
14551
14552       switch (vex.length)
14553         {
14554         case 128:
14555         case 256:
14556         case 512:
14557           oappend ("BYTE PTR ");
14558           break;
14559         default:
14560           abort ();
14561         }
14562       break;
14563     case xmm_mw_mode:
14564       if (!need_vex)
14565         abort ();
14566
14567       switch (vex.length)
14568         {
14569         case 128:
14570         case 256:
14571         case 512:
14572           oappend ("WORD PTR ");
14573           break;
14574         default:
14575           abort ();
14576         }
14577       break;
14578     case xmm_md_mode:
14579       if (!need_vex)
14580         abort ();
14581
14582       switch (vex.length)
14583         {
14584         case 128:
14585         case 256:
14586         case 512:
14587           oappend ("DWORD PTR ");
14588           break;
14589         default:
14590           abort ();
14591         }
14592       break;
14593     case xmm_mq_mode:
14594       if (!need_vex)
14595         abort ();
14596
14597       switch (vex.length)
14598         {
14599         case 128:
14600         case 256:
14601         case 512:
14602           oappend ("QWORD PTR ");
14603           break;
14604         default:
14605           abort ();
14606         }
14607       break;
14608     case xmmdw_mode:
14609       if (!need_vex)
14610         abort ();
14611
14612       switch (vex.length)
14613         {
14614         case 128:
14615           oappend ("WORD PTR ");
14616           break;
14617         case 256:
14618           oappend ("DWORD PTR ");
14619           break;
14620         case 512:
14621           oappend ("QWORD PTR ");
14622           break;
14623         default:
14624           abort ();
14625         }
14626       break;
14627     case xmmqd_mode:
14628       if (!need_vex)
14629         abort ();
14630
14631       switch (vex.length)
14632         {
14633         case 128:
14634           oappend ("DWORD PTR ");
14635           break;
14636         case 256:
14637           oappend ("QWORD PTR ");
14638           break;
14639         case 512:
14640           oappend ("XMMWORD PTR ");
14641           break;
14642         default:
14643           abort ();
14644         }
14645       break;
14646     case ymmq_mode:
14647       if (!need_vex)
14648         abort ();
14649
14650       switch (vex.length)
14651         {
14652         case 128:
14653           oappend ("QWORD PTR ");
14654           break;
14655         case 256:
14656           oappend ("YMMWORD PTR ");
14657           break;
14658         case 512:
14659           oappend ("ZMMWORD PTR ");
14660           break;
14661         default:
14662           abort ();
14663         }
14664       break;
14665     case ymmxmm_mode:
14666       if (!need_vex)
14667         abort ();
14668
14669       switch (vex.length)
14670         {
14671         case 128:
14672         case 256:
14673           oappend ("XMMWORD PTR ");
14674           break;
14675         default:
14676           abort ();
14677         }
14678       break;
14679     case o_mode:
14680       oappend ("OWORD PTR ");
14681       break;
14682     case xmm_mdq_mode:
14683     case vex_w_dq_mode:
14684     case vex_scalar_w_dq_mode:
14685       if (!need_vex)
14686         abort ();
14687
14688       if (vex.w)
14689         oappend ("QWORD PTR ");
14690       else
14691         oappend ("DWORD PTR ");
14692       break;
14693     case vex_vsib_d_w_dq_mode:
14694     case vex_vsib_q_w_dq_mode:
14695       if (!need_vex)
14696         abort ();
14697
14698       if (!vex.evex)
14699         {
14700           if (vex.w)
14701             oappend ("QWORD PTR ");
14702           else
14703             oappend ("DWORD PTR ");
14704         }
14705       else
14706         {
14707           switch (vex.length)
14708             {
14709             case 128:
14710               oappend ("XMMWORD PTR ");
14711               break;
14712             case 256:
14713               oappend ("YMMWORD PTR ");
14714               break;
14715             case 512:
14716               oappend ("ZMMWORD PTR ");
14717               break;
14718             default:
14719               abort ();
14720             }
14721         }
14722       break;
14723     case vex_vsib_q_w_d_mode:
14724     case vex_vsib_d_w_d_mode:
14725       if (!need_vex || !vex.evex)
14726         abort ();
14727
14728       switch (vex.length)
14729         {
14730         case 128:
14731           oappend ("QWORD PTR ");
14732           break;
14733         case 256:
14734           oappend ("XMMWORD PTR ");
14735           break;
14736         case 512:
14737           oappend ("YMMWORD PTR ");
14738           break;
14739         default:
14740           abort ();
14741         }
14742
14743       break;
14744     case mask_bd_mode:
14745       if (!need_vex || vex.length != 128)
14746         abort ();
14747       if (vex.w)
14748         oappend ("DWORD PTR ");
14749       else
14750         oappend ("BYTE PTR ");
14751       break;
14752     case mask_mode:
14753       if (!need_vex)
14754         abort ();
14755       if (vex.w)
14756         oappend ("QWORD PTR ");
14757       else
14758         oappend ("WORD PTR ");
14759       break;
14760     case v_bnd_mode:
14761     default:
14762       break;
14763     }
14764 }
14765
14766 static void
14767 OP_E_register (int bytemode, int sizeflag)
14768 {
14769   int reg = modrm.rm;
14770   const char **names;
14771
14772   USED_REX (REX_B);
14773   if ((rex & REX_B))
14774     reg += 8;
14775
14776   if ((sizeflag & SUFFIX_ALWAYS)
14777       && (bytemode == b_swap_mode
14778           || bytemode == v_swap_mode
14779           || bytemode == dqw_swap_mode))
14780     swap_operand ();
14781
14782   switch (bytemode)
14783     {
14784     case b_mode:
14785     case b_swap_mode:
14786       USED_REX (0);
14787       if (rex)
14788         names = names8rex;
14789       else
14790         names = names8;
14791       break;
14792     case w_mode:
14793       names = names16;
14794       break;
14795     case d_mode:
14796     case dw_mode:
14797     case db_mode:
14798       names = names32;
14799       break;
14800     case q_mode:
14801       names = names64;
14802       break;
14803     case m_mode:
14804     case v_bnd_mode:
14805       names = address_mode == mode_64bit ? names64 : names32;
14806       break;
14807     case bnd_mode:
14808       names = names_bnd;
14809       break;
14810     case stack_v_mode:
14811       if (address_mode == mode_64bit && ((sizeflag & DFLAG) || (rex & REX_W)))
14812         {
14813           names = names64;
14814           break;
14815         }
14816       bytemode = v_mode;
14817       /* FALLTHRU */
14818     case v_mode:
14819     case v_swap_mode:
14820     case dq_mode:
14821     case dqb_mode:
14822     case dqd_mode:
14823     case dqw_mode:
14824     case dqw_swap_mode:
14825       USED_REX (REX_W);
14826       if (rex & REX_W)
14827         names = names64;
14828       else
14829         {
14830           if ((sizeflag & DFLAG)
14831               || (bytemode != v_mode
14832                   && bytemode != v_swap_mode))
14833             names = names32;
14834           else
14835             names = names16;
14836           used_prefixes |= (prefixes & PREFIX_DATA);
14837         }
14838       break;
14839     case mask_bd_mode:
14840     case mask_mode:
14841       names = names_mask;
14842       break;
14843     case 0:
14844       return;
14845     default:
14846       oappend (INTERNAL_DISASSEMBLER_ERROR);
14847       return;
14848     }
14849   oappend (names[reg]);
14850 }
14851
14852 static void
14853 OP_E_memory (int bytemode, int sizeflag)
14854 {
14855   bfd_vma disp = 0;
14856   int add = (rex & REX_B) ? 8 : 0;
14857   int riprel = 0;
14858   int shift;
14859
14860   if (vex.evex)
14861     {
14862       /* In EVEX, if operand doesn't allow broadcast, vex.b should be 0.  */
14863       if (vex.b
14864           && bytemode != x_mode
14865           && bytemode != xmmq_mode
14866           && bytemode != evex_half_bcst_xmmq_mode)
14867         {
14868           BadOp ();
14869           return;
14870         }
14871       switch (bytemode)
14872         {
14873         case dqw_mode:
14874         case dw_mode:
14875         case dqw_swap_mode:
14876           shift = 1;
14877           break;
14878         case dqb_mode:
14879         case db_mode:
14880           shift = 0;
14881           break;
14882         case vex_vsib_d_w_dq_mode:
14883         case vex_vsib_d_w_d_mode:
14884         case vex_vsib_q_w_dq_mode:
14885         case vex_vsib_q_w_d_mode:
14886         case evex_x_gscat_mode:
14887         case xmm_mdq_mode:
14888           shift = vex.w ? 3 : 2;
14889           break;
14890         case x_mode:
14891         case evex_half_bcst_xmmq_mode:
14892         case xmmq_mode:
14893           if (vex.b)
14894             {
14895               shift = vex.w ? 3 : 2;
14896               break;
14897             }
14898           /* Fall through if vex.b == 0.  */
14899         case xmmqd_mode:
14900         case xmmdw_mode:
14901         case ymmq_mode:
14902         case evex_x_nobcst_mode:
14903         case x_swap_mode:
14904           switch (vex.length)
14905             {
14906             case 128:
14907               shift = 4;
14908               break;
14909             case 256:
14910               shift = 5;
14911               break;
14912             case 512:
14913               shift = 6;
14914               break;
14915             default:
14916               abort ();
14917             }
14918           break;
14919         case ymm_mode:
14920           shift = 5;
14921           break;
14922         case xmm_mode:
14923           shift = 4;
14924           break;
14925         case xmm_mq_mode:
14926         case q_mode:
14927         case q_scalar_mode:
14928         case q_swap_mode:
14929         case q_scalar_swap_mode:
14930           shift = 3;
14931           break;
14932         case dqd_mode:
14933         case xmm_md_mode:
14934         case d_mode:
14935         case d_scalar_mode:
14936         case d_swap_mode:
14937         case d_scalar_swap_mode:
14938           shift = 2;
14939           break;
14940         case xmm_mw_mode:
14941           shift = 1;
14942           break;
14943         case xmm_mb_mode:
14944           shift = 0;
14945           break;
14946         default:
14947           abort ();
14948         }
14949       /* Make necessary corrections to shift for modes that need it.
14950          For these modes we currently have shift 4, 5 or 6 depending on
14951          vex.length (it corresponds to xmmword, ymmword or zmmword
14952          operand).  We might want to make it 3, 4 or 5 (e.g. for
14953          xmmq_mode).  In case of broadcast enabled the corrections
14954          aren't needed, as element size is always 32 or 64 bits.  */
14955       if (!vex.b
14956           && (bytemode == xmmq_mode
14957               || bytemode == evex_half_bcst_xmmq_mode))
14958         shift -= 1;
14959       else if (bytemode == xmmqd_mode)
14960         shift -= 2;
14961       else if (bytemode == xmmdw_mode)
14962         shift -= 3;
14963       else if (bytemode == ymmq_mode && vex.length == 128)
14964         shift -= 1;
14965     }
14966   else
14967     shift = 0;
14968
14969   USED_REX (REX_B);
14970   if (intel_syntax)
14971     intel_operand_size (bytemode, sizeflag);
14972   append_seg ();
14973
14974   if ((sizeflag & AFLAG) || address_mode == mode_64bit)
14975     {
14976       /* 32/64 bit address mode */
14977       int havedisp;
14978       int havesib;
14979       int havebase;
14980       int haveindex;
14981       int needindex;
14982       int base, rbase;
14983       int vindex = 0;
14984       int scale = 0;
14985       int addr32flag = !((sizeflag & AFLAG)
14986                          || bytemode == v_bnd_mode
14987                          || bytemode == bnd_mode);
14988       const char **indexes64 = names64;
14989       const char **indexes32 = names32;
14990
14991       havesib = 0;
14992       havebase = 1;
14993       haveindex = 0;
14994       base = modrm.rm;
14995
14996       if (base == 4)
14997         {
14998           havesib = 1;
14999           vindex = sib.index;
15000           USED_REX (REX_X);
15001           if (rex & REX_X)
15002             vindex += 8;
15003           switch (bytemode)
15004             {
15005             case vex_vsib_d_w_dq_mode:
15006             case vex_vsib_d_w_d_mode:
15007             case vex_vsib_q_w_dq_mode:
15008             case vex_vsib_q_w_d_mode:
15009               if (!need_vex)
15010                 abort ();
15011               if (vex.evex)
15012                 {
15013                   if (!vex.v)
15014                     vindex += 16;
15015                 }
15016
15017               haveindex = 1;
15018               switch (vex.length)
15019                 {
15020                 case 128:
15021                   indexes64 = indexes32 = names_xmm;
15022                   break;
15023                 case 256:
15024                   if (!vex.w
15025                       || bytemode == vex_vsib_q_w_dq_mode
15026                       || bytemode == vex_vsib_q_w_d_mode)
15027                     indexes64 = indexes32 = names_ymm;
15028                   else
15029                     indexes64 = indexes32 = names_xmm;
15030                   break;
15031                 case 512:
15032                   if (!vex.w
15033                       || bytemode == vex_vsib_q_w_dq_mode
15034                       || bytemode == vex_vsib_q_w_d_mode)
15035                     indexes64 = indexes32 = names_zmm;
15036                   else
15037                     indexes64 = indexes32 = names_ymm;
15038                   break;
15039                 default:
15040                   abort ();
15041                 }
15042               break;
15043             default:
15044               haveindex = vindex != 4;
15045               break;
15046             }
15047           scale = sib.scale;
15048           base = sib.base;
15049           codep++;
15050         }
15051       rbase = base + add;
15052
15053       switch (modrm.mod)
15054         {
15055         case 0:
15056           if (base == 5)
15057             {
15058               havebase = 0;
15059               if (address_mode == mode_64bit && !havesib)
15060                 riprel = 1;
15061               disp = get32s ();
15062             }
15063           break;
15064         case 1:
15065           FETCH_DATA (the_info, codep + 1);
15066           disp = *codep++;
15067           if ((disp & 0x80) != 0)
15068             disp -= 0x100;
15069           if (vex.evex && shift > 0)
15070             disp <<= shift;
15071           break;
15072         case 2:
15073           disp = get32s ();
15074           break;
15075         }
15076
15077       /* In 32bit mode, we need index register to tell [offset] from
15078          [eiz*1 + offset].  */
15079       needindex = (havesib
15080                    && !havebase
15081                    && !haveindex
15082                    && address_mode == mode_32bit);
15083       havedisp = (havebase
15084                   || needindex
15085                   || (havesib && (haveindex || scale != 0)));
15086
15087       if (!intel_syntax)
15088         if (modrm.mod != 0 || base == 5)
15089           {
15090             if (havedisp || riprel)
15091               print_displacement (scratchbuf, disp);
15092             else
15093               print_operand_value (scratchbuf, 1, disp);
15094             oappend (scratchbuf);
15095             if (riprel)
15096               {
15097                 set_op (disp, 1);
15098                 oappend (sizeflag & AFLAG ? "(%rip)" : "(%eip)");
15099               }
15100           }
15101
15102       if ((havebase || haveindex || riprel)
15103           && (bytemode != v_bnd_mode)
15104           && (bytemode != bnd_mode))
15105         used_prefixes |= PREFIX_ADDR;
15106
15107       if (havedisp || (intel_syntax && riprel))
15108         {
15109           *obufp++ = open_char;
15110           if (intel_syntax && riprel)
15111             {
15112               set_op (disp, 1);
15113               oappend (sizeflag & AFLAG ? "rip" : "eip");
15114             }
15115           *obufp = '\0';
15116           if (havebase)
15117             oappend (address_mode == mode_64bit && !addr32flag
15118                      ? names64[rbase] : names32[rbase]);
15119           if (havesib)
15120             {
15121               /* ESP/RSP won't allow index.  If base isn't ESP/RSP,
15122                  print index to tell base + index from base.  */
15123               if (scale != 0
15124                   || needindex
15125                   || haveindex
15126                   || (havebase && base != ESP_REG_NUM))
15127                 {
15128                   if (!intel_syntax || havebase)
15129                     {
15130                       *obufp++ = separator_char;
15131                       *obufp = '\0';
15132                     }
15133                   if (haveindex)
15134                     oappend (address_mode == mode_64bit && !addr32flag
15135                              ? indexes64[vindex] : indexes32[vindex]);
15136                   else
15137                     oappend (address_mode == mode_64bit && !addr32flag
15138                              ? index64 : index32);
15139
15140                   *obufp++ = scale_char;
15141                   *obufp = '\0';
15142                   sprintf (scratchbuf, "%d", 1 << scale);
15143                   oappend (scratchbuf);
15144                 }
15145             }
15146           if (intel_syntax
15147               && (disp || modrm.mod != 0 || base == 5))
15148             {
15149               if (!havedisp || (bfd_signed_vma) disp >= 0)
15150                 {
15151                   *obufp++ = '+';
15152                   *obufp = '\0';
15153                 }
15154               else if (modrm.mod != 1 && disp != -disp)
15155                 {
15156                   *obufp++ = '-';
15157                   *obufp = '\0';
15158                   disp = - (bfd_signed_vma) disp;
15159                 }
15160
15161               if (havedisp)
15162                 print_displacement (scratchbuf, disp);
15163               else
15164                 print_operand_value (scratchbuf, 1, disp);
15165               oappend (scratchbuf);
15166             }
15167
15168           *obufp++ = close_char;
15169           *obufp = '\0';
15170         }
15171       else if (intel_syntax)
15172         {
15173           if (modrm.mod != 0 || base == 5)
15174             {
15175               if (!active_seg_prefix)
15176                 {
15177                   oappend (names_seg[ds_reg - es_reg]);
15178                   oappend (":");
15179                 }
15180               print_operand_value (scratchbuf, 1, disp);
15181               oappend (scratchbuf);
15182             }
15183         }
15184     }
15185   else
15186     {
15187       /* 16 bit address mode */
15188       used_prefixes |= prefixes & PREFIX_ADDR;
15189       switch (modrm.mod)
15190         {
15191         case 0:
15192           if (modrm.rm == 6)
15193             {
15194               disp = get16 ();
15195               if ((disp & 0x8000) != 0)
15196                 disp -= 0x10000;
15197             }
15198           break;
15199         case 1:
15200           FETCH_DATA (the_info, codep + 1);
15201           disp = *codep++;
15202           if ((disp & 0x80) != 0)
15203             disp -= 0x100;
15204           break;
15205         case 2:
15206           disp = get16 ();
15207           if ((disp & 0x8000) != 0)
15208             disp -= 0x10000;
15209           break;
15210         }
15211
15212       if (!intel_syntax)
15213         if (modrm.mod != 0 || modrm.rm == 6)
15214           {
15215             print_displacement (scratchbuf, disp);
15216             oappend (scratchbuf);
15217           }
15218
15219       if (modrm.mod != 0 || modrm.rm != 6)
15220         {
15221           *obufp++ = open_char;
15222           *obufp = '\0';
15223           oappend (index16[modrm.rm]);
15224           if (intel_syntax
15225               && (disp || modrm.mod != 0 || modrm.rm == 6))
15226             {
15227               if ((bfd_signed_vma) disp >= 0)
15228                 {
15229                   *obufp++ = '+';
15230                   *obufp = '\0';
15231                 }
15232               else if (modrm.mod != 1)
15233                 {
15234                   *obufp++ = '-';
15235                   *obufp = '\0';
15236                   disp = - (bfd_signed_vma) disp;
15237                 }
15238
15239               print_displacement (scratchbuf, disp);
15240               oappend (scratchbuf);
15241             }
15242
15243           *obufp++ = close_char;
15244           *obufp = '\0';
15245         }
15246       else if (intel_syntax)
15247         {
15248           if (!active_seg_prefix)
15249             {
15250               oappend (names_seg[ds_reg - es_reg]);
15251               oappend (":");
15252             }
15253           print_operand_value (scratchbuf, 1, disp & 0xffff);
15254           oappend (scratchbuf);
15255         }
15256     }
15257   if (vex.evex && vex.b
15258       && (bytemode == x_mode
15259           || bytemode == xmmq_mode
15260           || bytemode == evex_half_bcst_xmmq_mode))
15261     {
15262       if (vex.w
15263           || bytemode == xmmq_mode
15264           || bytemode == evex_half_bcst_xmmq_mode)
15265         {
15266           switch (vex.length)
15267             {
15268             case 128:
15269               oappend ("{1to2}");
15270               break;
15271             case 256:
15272               oappend ("{1to4}");
15273               break;
15274             case 512:
15275               oappend ("{1to8}");
15276               break;
15277             default:
15278               abort ();
15279             }
15280         }
15281       else
15282         {
15283           switch (vex.length)
15284             {
15285             case 128:
15286               oappend ("{1to4}");
15287               break;
15288             case 256:
15289               oappend ("{1to8}");
15290               break;
15291             case 512:
15292               oappend ("{1to16}");
15293               break;
15294             default:
15295               abort ();
15296             }
15297         }
15298     }
15299 }
15300
15301 static void
15302 OP_E (int bytemode, int sizeflag)
15303 {
15304   /* Skip mod/rm byte.  */
15305   MODRM_CHECK;
15306   codep++;
15307
15308   if (modrm.mod == 3)
15309     OP_E_register (bytemode, sizeflag);
15310   else
15311     OP_E_memory (bytemode, sizeflag);
15312 }
15313
15314 static void
15315 OP_G (int bytemode, int sizeflag)
15316 {
15317   int add = 0;
15318   USED_REX (REX_R);
15319   if (rex & REX_R)
15320     add += 8;
15321   switch (bytemode)
15322     {
15323     case b_mode:
15324       USED_REX (0);
15325       if (rex)
15326         oappend (names8rex[modrm.reg + add]);
15327       else
15328         oappend (names8[modrm.reg + add]);
15329       break;
15330     case w_mode:
15331       oappend (names16[modrm.reg + add]);
15332       break;
15333     case d_mode:
15334     case db_mode:
15335     case dw_mode:
15336       oappend (names32[modrm.reg + add]);
15337       break;
15338     case q_mode:
15339       oappend (names64[modrm.reg + add]);
15340       break;
15341     case bnd_mode:
15342       oappend (names_bnd[modrm.reg]);
15343       break;
15344     case v_mode:
15345     case dq_mode:
15346     case dqb_mode:
15347     case dqd_mode:
15348     case dqw_mode:
15349     case dqw_swap_mode:
15350       USED_REX (REX_W);
15351       if (rex & REX_W)
15352         oappend (names64[modrm.reg + add]);
15353       else
15354         {
15355           if ((sizeflag & DFLAG) || bytemode != v_mode)
15356             oappend (names32[modrm.reg + add]);
15357           else
15358             oappend (names16[modrm.reg + add]);
15359           used_prefixes |= (prefixes & PREFIX_DATA);
15360         }
15361       break;
15362     case m_mode:
15363       if (address_mode == mode_64bit)
15364         oappend (names64[modrm.reg + add]);
15365       else
15366         oappend (names32[modrm.reg + add]);
15367       break;
15368     case mask_bd_mode:
15369     case mask_mode:
15370       oappend (names_mask[modrm.reg + add]);
15371       break;
15372     default:
15373       oappend (INTERNAL_DISASSEMBLER_ERROR);
15374       break;
15375     }
15376 }
15377
15378 static bfd_vma
15379 get64 (void)
15380 {
15381   bfd_vma x;
15382 #ifdef BFD64
15383   unsigned int a;
15384   unsigned int b;
15385
15386   FETCH_DATA (the_info, codep + 8);
15387   a = *codep++ & 0xff;
15388   a |= (*codep++ & 0xff) << 8;
15389   a |= (*codep++ & 0xff) << 16;
15390   a |= (*codep++ & 0xff) << 24;
15391   b = *codep++ & 0xff;
15392   b |= (*codep++ & 0xff) << 8;
15393   b |= (*codep++ & 0xff) << 16;
15394   b |= (*codep++ & 0xff) << 24;
15395   x = a + ((bfd_vma) b << 32);
15396 #else
15397   abort ();
15398   x = 0;
15399 #endif
15400   return x;
15401 }
15402
15403 static bfd_signed_vma
15404 get32 (void)
15405 {
15406   bfd_signed_vma x = 0;
15407
15408   FETCH_DATA (the_info, codep + 4);
15409   x = *codep++ & (bfd_signed_vma) 0xff;
15410   x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
15411   x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
15412   x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
15413   return x;
15414 }
15415
15416 static bfd_signed_vma
15417 get32s (void)
15418 {
15419   bfd_signed_vma x = 0;
15420
15421   FETCH_DATA (the_info, codep + 4);
15422   x = *codep++ & (bfd_signed_vma) 0xff;
15423   x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
15424   x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
15425   x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
15426
15427   x = (x ^ ((bfd_signed_vma) 1 << 31)) - ((bfd_signed_vma) 1 << 31);
15428
15429   return x;
15430 }
15431
15432 static int
15433 get16 (void)
15434 {
15435   int x = 0;
15436
15437   FETCH_DATA (the_info, codep + 2);
15438   x = *codep++ & 0xff;
15439   x |= (*codep++ & 0xff) << 8;
15440   return x;
15441 }
15442
15443 static void
15444 set_op (bfd_vma op, int riprel)
15445 {
15446   op_index[op_ad] = op_ad;
15447   if (address_mode == mode_64bit)
15448     {
15449       op_address[op_ad] = op;
15450       op_riprel[op_ad] = riprel;
15451     }
15452   else
15453     {
15454       /* Mask to get a 32-bit address.  */
15455       op_address[op_ad] = op & 0xffffffff;
15456       op_riprel[op_ad] = riprel & 0xffffffff;
15457     }
15458 }
15459
15460 static void
15461 OP_REG (int code, int sizeflag)
15462 {
15463   const char *s;
15464   int add;
15465
15466   switch (code)
15467     {
15468     case es_reg: case ss_reg: case cs_reg:
15469     case ds_reg: case fs_reg: case gs_reg:
15470       oappend (names_seg[code - es_reg]);
15471       return;
15472     }
15473
15474   USED_REX (REX_B);
15475   if (rex & REX_B)
15476     add = 8;
15477   else
15478     add = 0;
15479
15480   switch (code)
15481     {
15482     case ax_reg: case cx_reg: case dx_reg: case bx_reg:
15483     case sp_reg: case bp_reg: case si_reg: case di_reg:
15484       s = names16[code - ax_reg + add];
15485       break;
15486     case al_reg: case ah_reg: case cl_reg: case ch_reg:
15487     case dl_reg: case dh_reg: case bl_reg: case bh_reg:
15488       USED_REX (0);
15489       if (rex)
15490         s = names8rex[code - al_reg + add];
15491       else
15492         s = names8[code - al_reg];
15493       break;
15494     case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
15495     case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
15496       if (address_mode == mode_64bit
15497           && ((sizeflag & DFLAG) || (rex & REX_W)))
15498         {
15499           s = names64[code - rAX_reg + add];
15500           break;
15501         }
15502       code += eAX_reg - rAX_reg;
15503       /* Fall through.  */
15504     case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
15505     case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
15506       USED_REX (REX_W);
15507       if (rex & REX_W)
15508         s = names64[code - eAX_reg + add];
15509       else
15510         {
15511           if (sizeflag & DFLAG)
15512             s = names32[code - eAX_reg + add];
15513           else
15514             s = names16[code - eAX_reg + add];
15515           used_prefixes |= (prefixes & PREFIX_DATA);
15516         }
15517       break;
15518     default:
15519       s = INTERNAL_DISASSEMBLER_ERROR;
15520       break;
15521     }
15522   oappend (s);
15523 }
15524
15525 static void
15526 OP_IMREG (int code, int sizeflag)
15527 {
15528   const char *s;
15529
15530   switch (code)
15531     {
15532     case indir_dx_reg:
15533       if (intel_syntax)
15534         s = "dx";
15535       else
15536         s = "(%dx)";
15537       break;
15538     case ax_reg: case cx_reg: case dx_reg: case bx_reg:
15539     case sp_reg: case bp_reg: case si_reg: case di_reg:
15540       s = names16[code - ax_reg];
15541       break;
15542     case es_reg: case ss_reg: case cs_reg:
15543     case ds_reg: case fs_reg: case gs_reg:
15544       s = names_seg[code - es_reg];
15545       break;
15546     case al_reg: case ah_reg: case cl_reg: case ch_reg:
15547     case dl_reg: case dh_reg: case bl_reg: case bh_reg:
15548       USED_REX (0);
15549       if (rex)
15550         s = names8rex[code - al_reg];
15551       else
15552         s = names8[code - al_reg];
15553       break;
15554     case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
15555     case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
15556       USED_REX (REX_W);
15557       if (rex & REX_W)
15558         s = names64[code - eAX_reg];
15559       else
15560         {
15561           if (sizeflag & DFLAG)
15562             s = names32[code - eAX_reg];
15563           else
15564             s = names16[code - eAX_reg];
15565           used_prefixes |= (prefixes & PREFIX_DATA);
15566         }
15567       break;
15568     case z_mode_ax_reg:
15569       if ((rex & REX_W) || (sizeflag & DFLAG))
15570         s = *names32;
15571       else
15572         s = *names16;
15573       if (!(rex & REX_W))
15574         used_prefixes |= (prefixes & PREFIX_DATA);
15575       break;
15576     default:
15577       s = INTERNAL_DISASSEMBLER_ERROR;
15578       break;
15579     }
15580   oappend (s);
15581 }
15582
15583 static void
15584 OP_I (int bytemode, int sizeflag)
15585 {
15586   bfd_signed_vma op;
15587   bfd_signed_vma mask = -1;
15588
15589   switch (bytemode)
15590     {
15591     case b_mode:
15592       FETCH_DATA (the_info, codep + 1);
15593       op = *codep++;
15594       mask = 0xff;
15595       break;
15596     case q_mode:
15597       if (address_mode == mode_64bit)
15598         {
15599           op = get32s ();
15600           break;
15601         }
15602       /* Fall through.  */
15603     case v_mode:
15604       USED_REX (REX_W);
15605       if (rex & REX_W)
15606         op = get32s ();
15607       else
15608         {
15609           if (sizeflag & DFLAG)
15610             {
15611               op = get32 ();
15612               mask = 0xffffffff;
15613             }
15614           else
15615             {
15616               op = get16 ();
15617               mask = 0xfffff;
15618             }
15619           used_prefixes |= (prefixes & PREFIX_DATA);
15620         }
15621       break;
15622     case w_mode:
15623       mask = 0xfffff;
15624       op = get16 ();
15625       break;
15626     case const_1_mode:
15627       if (intel_syntax)
15628         oappend ("1");
15629       return;
15630     default:
15631       oappend (INTERNAL_DISASSEMBLER_ERROR);
15632       return;
15633     }
15634
15635   op &= mask;
15636   scratchbuf[0] = '$';
15637   print_operand_value (scratchbuf + 1, 1, op);
15638   oappend_maybe_intel (scratchbuf);
15639   scratchbuf[0] = '\0';
15640 }
15641
15642 static void
15643 OP_I64 (int bytemode, int sizeflag)
15644 {
15645   bfd_signed_vma op;
15646   bfd_signed_vma mask = -1;
15647
15648   if (address_mode != mode_64bit)
15649     {
15650       OP_I (bytemode, sizeflag);
15651       return;
15652     }
15653
15654   switch (bytemode)
15655     {
15656     case b_mode:
15657       FETCH_DATA (the_info, codep + 1);
15658       op = *codep++;
15659       mask = 0xff;
15660       break;
15661     case v_mode:
15662       USED_REX (REX_W);
15663       if (rex & REX_W)
15664         op = get64 ();
15665       else
15666         {
15667           if (sizeflag & DFLAG)
15668             {
15669               op = get32 ();
15670               mask = 0xffffffff;
15671             }
15672           else
15673             {
15674               op = get16 ();
15675               mask = 0xfffff;
15676             }
15677           used_prefixes |= (prefixes & PREFIX_DATA);
15678         }
15679       break;
15680     case w_mode:
15681       mask = 0xfffff;
15682       op = get16 ();
15683       break;
15684     default:
15685       oappend (INTERNAL_DISASSEMBLER_ERROR);
15686       return;
15687     }
15688
15689   op &= mask;
15690   scratchbuf[0] = '$';
15691   print_operand_value (scratchbuf + 1, 1, op);
15692   oappend_maybe_intel (scratchbuf);
15693   scratchbuf[0] = '\0';
15694 }
15695
15696 static void
15697 OP_sI (int bytemode, int sizeflag)
15698 {
15699   bfd_signed_vma op;
15700
15701   switch (bytemode)
15702     {
15703     case b_mode:
15704     case b_T_mode:
15705       FETCH_DATA (the_info, codep + 1);
15706       op = *codep++;
15707       if ((op & 0x80) != 0)
15708         op -= 0x100;
15709       if (bytemode == b_T_mode)
15710         {
15711           if (address_mode != mode_64bit
15712               || !((sizeflag & DFLAG) || (rex & REX_W)))
15713             {
15714               /* The operand-size prefix is overridden by a REX prefix.  */
15715               if ((sizeflag & DFLAG) || (rex & REX_W))
15716                 op &= 0xffffffff;
15717               else
15718                 op &= 0xffff;
15719           }
15720         }
15721       else
15722         {
15723           if (!(rex & REX_W))
15724             {
15725               if (sizeflag & DFLAG)
15726                 op &= 0xffffffff;
15727               else
15728                 op &= 0xffff;
15729             }
15730         }
15731       break;
15732     case v_mode:
15733       /* The operand-size prefix is overridden by a REX prefix.  */
15734       if ((sizeflag & DFLAG) || (rex & REX_W))
15735         op = get32s ();
15736       else
15737         op = get16 ();
15738       break;
15739     default:
15740       oappend (INTERNAL_DISASSEMBLER_ERROR);
15741       return;
15742     }
15743
15744   scratchbuf[0] = '$';
15745   print_operand_value (scratchbuf + 1, 1, op);
15746   oappend_maybe_intel (scratchbuf);
15747 }
15748
15749 static void
15750 OP_J (int bytemode, int sizeflag)
15751 {
15752   bfd_vma disp;
15753   bfd_vma mask = -1;
15754   bfd_vma segment = 0;
15755
15756   switch (bytemode)
15757     {
15758     case b_mode:
15759       FETCH_DATA (the_info, codep + 1);
15760       disp = *codep++;
15761       if ((disp & 0x80) != 0)
15762         disp -= 0x100;
15763       break;
15764     case v_mode:
15765       if (isa64 == amd64)
15766         USED_REX (REX_W);
15767       if ((sizeflag & DFLAG)
15768           || (address_mode == mode_64bit
15769               && (isa64 != amd64 || (rex & REX_W))))
15770         disp = get32s ();
15771       else
15772         {
15773           disp = get16 ();
15774           if ((disp & 0x8000) != 0)
15775             disp -= 0x10000;
15776           /* In 16bit mode, address is wrapped around at 64k within
15777              the same segment.  Otherwise, a data16 prefix on a jump
15778              instruction means that the pc is masked to 16 bits after
15779              the displacement is added!  */
15780           mask = 0xffff;
15781           if ((prefixes & PREFIX_DATA) == 0)
15782             segment = ((start_pc + codep - start_codep)
15783                        & ~((bfd_vma) 0xffff));
15784         }
15785       if (address_mode != mode_64bit
15786           || (isa64 == amd64 && !(rex & REX_W)))
15787         used_prefixes |= (prefixes & PREFIX_DATA);
15788       break;
15789     default:
15790       oappend (INTERNAL_DISASSEMBLER_ERROR);
15791       return;
15792     }
15793   disp = ((start_pc + (codep - start_codep) + disp) & mask) | segment;
15794   set_op (disp, 0);
15795   print_operand_value (scratchbuf, 1, disp);
15796   oappend (scratchbuf);
15797 }
15798
15799 static void
15800 OP_SEG (int bytemode, int sizeflag)
15801 {
15802   if (bytemode == w_mode)
15803     oappend (names_seg[modrm.reg]);
15804   else
15805     OP_E (modrm.mod == 3 ? bytemode : w_mode, sizeflag);
15806 }
15807
15808 static void
15809 OP_DIR (int dummy ATTRIBUTE_UNUSED, int sizeflag)
15810 {
15811   int seg, offset;
15812
15813   if (sizeflag & DFLAG)
15814     {
15815       offset = get32 ();
15816       seg = get16 ();
15817     }
15818   else
15819     {
15820       offset = get16 ();
15821       seg = get16 ();
15822     }
15823   used_prefixes |= (prefixes & PREFIX_DATA);
15824   if (intel_syntax)
15825     sprintf (scratchbuf, "0x%x:0x%x", seg, offset);
15826   else
15827     sprintf (scratchbuf, "$0x%x,$0x%x", seg, offset);
15828   oappend (scratchbuf);
15829 }
15830
15831 static void
15832 OP_OFF (int bytemode, int sizeflag)
15833 {
15834   bfd_vma off;
15835
15836   if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
15837     intel_operand_size (bytemode, sizeflag);
15838   append_seg ();
15839
15840   if ((sizeflag & AFLAG) || address_mode == mode_64bit)
15841     off = get32 ();
15842   else
15843     off = get16 ();
15844
15845   if (intel_syntax)
15846     {
15847       if (!active_seg_prefix)
15848         {
15849           oappend (names_seg[ds_reg - es_reg]);
15850           oappend (":");
15851         }
15852     }
15853   print_operand_value (scratchbuf, 1, off);
15854   oappend (scratchbuf);
15855 }
15856
15857 static void
15858 OP_OFF64 (int bytemode, int sizeflag)
15859 {
15860   bfd_vma off;
15861
15862   if (address_mode != mode_64bit
15863       || (prefixes & PREFIX_ADDR))
15864     {
15865       OP_OFF (bytemode, sizeflag);
15866       return;
15867     }
15868
15869   if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
15870     intel_operand_size (bytemode, sizeflag);
15871   append_seg ();
15872
15873   off = get64 ();
15874
15875   if (intel_syntax)
15876     {
15877       if (!active_seg_prefix)
15878         {
15879           oappend (names_seg[ds_reg - es_reg]);
15880           oappend (":");
15881         }
15882     }
15883   print_operand_value (scratchbuf, 1, off);
15884   oappend (scratchbuf);
15885 }
15886
15887 static void
15888 ptr_reg (int code, int sizeflag)
15889 {
15890   const char *s;
15891
15892   *obufp++ = open_char;
15893   used_prefixes |= (prefixes & PREFIX_ADDR);
15894   if (address_mode == mode_64bit)
15895     {
15896       if (!(sizeflag & AFLAG))
15897         s = names32[code - eAX_reg];
15898       else
15899         s = names64[code - eAX_reg];
15900     }
15901   else if (sizeflag & AFLAG)
15902     s = names32[code - eAX_reg];
15903   else
15904     s = names16[code - eAX_reg];
15905   oappend (s);
15906   *obufp++ = close_char;
15907   *obufp = 0;
15908 }
15909
15910 static void
15911 OP_ESreg (int code, int sizeflag)
15912 {
15913   if (intel_syntax)
15914     {
15915       switch (codep[-1])
15916         {
15917         case 0x6d:      /* insw/insl */
15918           intel_operand_size (z_mode, sizeflag);
15919           break;
15920         case 0xa5:      /* movsw/movsl/movsq */
15921         case 0xa7:      /* cmpsw/cmpsl/cmpsq */
15922         case 0xab:      /* stosw/stosl */
15923         case 0xaf:      /* scasw/scasl */
15924           intel_operand_size (v_mode, sizeflag);
15925           break;
15926         default:
15927           intel_operand_size (b_mode, sizeflag);
15928         }
15929     }
15930   oappend_maybe_intel ("%es:");
15931   ptr_reg (code, sizeflag);
15932 }
15933
15934 static void
15935 OP_DSreg (int code, int sizeflag)
15936 {
15937   if (intel_syntax)
15938     {
15939       switch (codep[-1])
15940         {
15941         case 0x6f:      /* outsw/outsl */
15942           intel_operand_size (z_mode, sizeflag);
15943           break;
15944         case 0xa5:      /* movsw/movsl/movsq */
15945         case 0xa7:      /* cmpsw/cmpsl/cmpsq */
15946         case 0xad:      /* lodsw/lodsl/lodsq */
15947           intel_operand_size (v_mode, sizeflag);
15948           break;
15949         default:
15950           intel_operand_size (b_mode, sizeflag);
15951         }
15952     }
15953   /* Set active_seg_prefix to PREFIX_DS if it is unset so that the
15954      default segment register DS is printed.  */
15955   if (!active_seg_prefix)
15956     active_seg_prefix = PREFIX_DS;
15957   append_seg ();
15958   ptr_reg (code, sizeflag);
15959 }
15960
15961 static void
15962 OP_C (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15963 {
15964   int add;
15965   if (rex & REX_R)
15966     {
15967       USED_REX (REX_R);
15968       add = 8;
15969     }
15970   else if (address_mode != mode_64bit && (prefixes & PREFIX_LOCK))
15971     {
15972       all_prefixes[last_lock_prefix] = 0;
15973       used_prefixes |= PREFIX_LOCK;
15974       add = 8;
15975     }
15976   else
15977     add = 0;
15978   sprintf (scratchbuf, "%%cr%d", modrm.reg + add);
15979   oappend_maybe_intel (scratchbuf);
15980 }
15981
15982 static void
15983 OP_D (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15984 {
15985   int add;
15986   USED_REX (REX_R);
15987   if (rex & REX_R)
15988     add = 8;
15989   else
15990     add = 0;
15991   if (intel_syntax)
15992     sprintf (scratchbuf, "db%d", modrm.reg + add);
15993   else
15994     sprintf (scratchbuf, "%%db%d", modrm.reg + add);
15995   oappend (scratchbuf);
15996 }
15997
15998 static void
15999 OP_T (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
16000 {
16001   sprintf (scratchbuf, "%%tr%d", modrm.reg);
16002   oappend_maybe_intel (scratchbuf);
16003 }
16004
16005 static void
16006 OP_R (int bytemode, int sizeflag)
16007 {
16008   /* Skip mod/rm byte.  */
16009   MODRM_CHECK;
16010   codep++;
16011   OP_E_register (bytemode, sizeflag);
16012 }
16013
16014 static void
16015 OP_MMX (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
16016 {
16017   int reg = modrm.reg;
16018   const char **names;
16019
16020   used_prefixes |= (prefixes & PREFIX_DATA);
16021   if (prefixes & PREFIX_DATA)
16022     {
16023       names = names_xmm;
16024       USED_REX (REX_R);
16025       if (rex & REX_R)
16026         reg += 8;
16027     }
16028   else
16029     names = names_mm;
16030   oappend (names[reg]);
16031 }
16032
16033 static void
16034 OP_XMM (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
16035 {
16036   int reg = modrm.reg;
16037   const char **names;
16038
16039   USED_REX (REX_R);
16040   if (rex & REX_R)
16041     reg += 8;
16042   if (vex.evex)
16043     {
16044       if (!vex.r)
16045         reg += 16;
16046     }
16047
16048   if (need_vex
16049       && bytemode != xmm_mode
16050       && bytemode != xmmq_mode
16051       && bytemode != evex_half_bcst_xmmq_mode
16052       && bytemode != ymm_mode
16053       && bytemode != scalar_mode)
16054     {
16055       switch (vex.length)
16056         {
16057         case 128:
16058           names = names_xmm;
16059           break;
16060         case 256:
16061           if (vex.w
16062               || (bytemode != vex_vsib_q_w_dq_mode
16063                   && bytemode != vex_vsib_q_w_d_mode))
16064             names = names_ymm;
16065           else
16066             names = names_xmm;
16067           break;
16068         case 512:
16069           names = names_zmm;
16070           break;
16071         default:
16072           abort ();
16073         }
16074     }
16075   else if (bytemode == xmmq_mode
16076            || bytemode == evex_half_bcst_xmmq_mode)
16077     {
16078       switch (vex.length)
16079         {
16080         case 128:
16081         case 256:
16082           names = names_xmm;
16083           break;
16084         case 512:
16085           names = names_ymm;
16086           break;
16087         default:
16088           abort ();
16089         }
16090     }
16091   else if (bytemode == ymm_mode)
16092     names = names_ymm;
16093   else
16094     names = names_xmm;
16095   oappend (names[reg]);
16096 }
16097
16098 static void
16099 OP_EM (int bytemode, int sizeflag)
16100 {
16101   int reg;
16102   const char **names;
16103
16104   if (modrm.mod != 3)
16105     {
16106       if (intel_syntax
16107           && (bytemode == v_mode || bytemode == v_swap_mode))
16108         {
16109           bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
16110           used_prefixes |= (prefixes & PREFIX_DATA);
16111         }
16112       OP_E (bytemode, sizeflag);
16113       return;
16114     }
16115
16116   if ((sizeflag & SUFFIX_ALWAYS) && bytemode == v_swap_mode)
16117     swap_operand ();
16118
16119   /* Skip mod/rm byte.  */
16120   MODRM_CHECK;
16121   codep++;
16122   used_prefixes |= (prefixes & PREFIX_DATA);
16123   reg = modrm.rm;
16124   if (prefixes & PREFIX_DATA)
16125     {
16126       names = names_xmm;
16127       USED_REX (REX_B);
16128       if (rex & REX_B)
16129         reg += 8;
16130     }
16131   else
16132     names = names_mm;
16133   oappend (names[reg]);
16134 }
16135
16136 /* cvt* are the only instructions in sse2 which have
16137    both SSE and MMX operands and also have 0x66 prefix
16138    in their opcode. 0x66 was originally used to differentiate
16139    between SSE and MMX instruction(operands). So we have to handle the
16140    cvt* separately using OP_EMC and OP_MXC */
16141 static void
16142 OP_EMC (int bytemode, int sizeflag)
16143 {
16144   if (modrm.mod != 3)
16145     {
16146       if (intel_syntax && bytemode == v_mode)
16147         {
16148           bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
16149           used_prefixes |= (prefixes & PREFIX_DATA);
16150         }
16151       OP_E (bytemode, sizeflag);
16152       return;
16153     }
16154
16155   /* Skip mod/rm byte.  */
16156   MODRM_CHECK;
16157   codep++;
16158   used_prefixes |= (prefixes & PREFIX_DATA);
16159   oappend (names_mm[modrm.rm]);
16160 }
16161
16162 static void
16163 OP_MXC (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
16164 {
16165   used_prefixes |= (prefixes & PREFIX_DATA);
16166   oappend (names_mm[modrm.reg]);
16167 }
16168
16169 static void
16170 OP_EX (int bytemode, int sizeflag)
16171 {
16172   int reg;
16173   const char **names;
16174
16175   /* Skip mod/rm byte.  */
16176   MODRM_CHECK;
16177   codep++;
16178
16179   if (modrm.mod != 3)
16180     {
16181       OP_E_memory (bytemode, sizeflag);
16182       return;
16183     }
16184
16185   reg = modrm.rm;
16186   USED_REX (REX_B);
16187   if (rex & REX_B)
16188     reg += 8;
16189   if (vex.evex)
16190     {
16191       USED_REX (REX_X);
16192       if ((rex & REX_X))
16193         reg += 16;
16194     }
16195
16196   if ((sizeflag & SUFFIX_ALWAYS)
16197       && (bytemode == x_swap_mode
16198           || bytemode == d_swap_mode
16199           || bytemode == dqw_swap_mode
16200           || bytemode == d_scalar_swap_mode
16201           || bytemode == q_swap_mode
16202           || bytemode == q_scalar_swap_mode))
16203     swap_operand ();
16204
16205   if (need_vex
16206       && bytemode != xmm_mode
16207       && bytemode != xmmdw_mode
16208       && bytemode != xmmqd_mode
16209       && bytemode != xmm_mb_mode
16210       && bytemode != xmm_mw_mode
16211       && bytemode != xmm_md_mode
16212       && bytemode != xmm_mq_mode
16213       && bytemode != xmm_mdq_mode
16214       && bytemode != xmmq_mode
16215       && bytemode != evex_half_bcst_xmmq_mode
16216       && bytemode != ymm_mode
16217       && bytemode != d_scalar_mode
16218       && bytemode != d_scalar_swap_mode
16219       && bytemode != q_scalar_mode
16220       && bytemode != q_scalar_swap_mode
16221       && bytemode != vex_scalar_w_dq_mode)
16222     {
16223       switch (vex.length)
16224         {
16225         case 128:
16226           names = names_xmm;
16227           break;
16228         case 256:
16229           names = names_ymm;
16230           break;
16231         case 512:
16232           names = names_zmm;
16233           break;
16234         default:
16235           abort ();
16236         }
16237     }
16238   else if (bytemode == xmmq_mode
16239            || bytemode == evex_half_bcst_xmmq_mode)
16240     {
16241       switch (vex.length)
16242         {
16243         case 128:
16244         case 256:
16245           names = names_xmm;
16246           break;
16247         case 512:
16248           names = names_ymm;
16249           break;
16250         default:
16251           abort ();
16252         }
16253     }
16254   else if (bytemode == ymm_mode)
16255     names = names_ymm;
16256   else
16257     names = names_xmm;
16258   oappend (names[reg]);
16259 }
16260
16261 static void
16262 OP_MS (int bytemode, int sizeflag)
16263 {
16264   if (modrm.mod == 3)
16265     OP_EM (bytemode, sizeflag);
16266   else
16267     BadOp ();
16268 }
16269
16270 static void
16271 OP_XS (int bytemode, int sizeflag)
16272 {
16273   if (modrm.mod == 3)
16274     OP_EX (bytemode, sizeflag);
16275   else
16276     BadOp ();
16277 }
16278
16279 static void
16280 OP_M (int bytemode, int sizeflag)
16281 {
16282   if (modrm.mod == 3)
16283     /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
16284     BadOp ();
16285   else
16286     OP_E (bytemode, sizeflag);
16287 }
16288
16289 static void
16290 OP_0f07 (int bytemode, int sizeflag)
16291 {
16292   if (modrm.mod != 3 || modrm.rm != 0)
16293     BadOp ();
16294   else
16295     OP_E (bytemode, sizeflag);
16296 }
16297
16298 /* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
16299    32bit mode and "xchg %rax,%rax" in 64bit mode.  */
16300
16301 static void
16302 NOP_Fixup1 (int bytemode, int sizeflag)
16303 {
16304   if ((prefixes & PREFIX_DATA) != 0
16305       || (rex != 0
16306           && rex != 0x48
16307           && address_mode == mode_64bit))
16308     OP_REG (bytemode, sizeflag);
16309   else
16310     strcpy (obuf, "nop");
16311 }
16312
16313 static void
16314 NOP_Fixup2 (int bytemode, int sizeflag)
16315 {
16316   if ((prefixes & PREFIX_DATA) != 0
16317       || (rex != 0
16318           && rex != 0x48
16319           && address_mode == mode_64bit))
16320     OP_IMREG (bytemode, sizeflag);
16321 }
16322
16323 static const char *const Suffix3DNow[] = {
16324 /* 00 */        NULL,           NULL,           NULL,           NULL,
16325 /* 04 */        NULL,           NULL,           NULL,           NULL,
16326 /* 08 */        NULL,           NULL,           NULL,           NULL,
16327 /* 0C */        "pi2fw",        "pi2fd",        NULL,           NULL,
16328 /* 10 */        NULL,           NULL,           NULL,           NULL,
16329 /* 14 */        NULL,           NULL,           NULL,           NULL,
16330 /* 18 */        NULL,           NULL,           NULL,           NULL,
16331 /* 1C */        "pf2iw",        "pf2id",        NULL,           NULL,
16332 /* 20 */        NULL,           NULL,           NULL,           NULL,
16333 /* 24 */        NULL,           NULL,           NULL,           NULL,
16334 /* 28 */        NULL,           NULL,           NULL,           NULL,
16335 /* 2C */        NULL,           NULL,           NULL,           NULL,
16336 /* 30 */        NULL,           NULL,           NULL,           NULL,
16337 /* 34 */        NULL,           NULL,           NULL,           NULL,
16338 /* 38 */        NULL,           NULL,           NULL,           NULL,
16339 /* 3C */        NULL,           NULL,           NULL,           NULL,
16340 /* 40 */        NULL,           NULL,           NULL,           NULL,
16341 /* 44 */        NULL,           NULL,           NULL,           NULL,
16342 /* 48 */        NULL,           NULL,           NULL,           NULL,
16343 /* 4C */        NULL,           NULL,           NULL,           NULL,
16344 /* 50 */        NULL,           NULL,           NULL,           NULL,
16345 /* 54 */        NULL,           NULL,           NULL,           NULL,
16346 /* 58 */        NULL,           NULL,           NULL,           NULL,
16347 /* 5C */        NULL,           NULL,           NULL,           NULL,
16348 /* 60 */        NULL,           NULL,           NULL,           NULL,
16349 /* 64 */        NULL,           NULL,           NULL,           NULL,
16350 /* 68 */        NULL,           NULL,           NULL,           NULL,
16351 /* 6C */        NULL,           NULL,           NULL,           NULL,
16352 /* 70 */        NULL,           NULL,           NULL,           NULL,
16353 /* 74 */        NULL,           NULL,           NULL,           NULL,
16354 /* 78 */        NULL,           NULL,           NULL,           NULL,
16355 /* 7C */        NULL,           NULL,           NULL,           NULL,
16356 /* 80 */        NULL,           NULL,           NULL,           NULL,
16357 /* 84 */        NULL,           NULL,           NULL,           NULL,
16358 /* 88 */        NULL,           NULL,           "pfnacc",       NULL,
16359 /* 8C */        NULL,           NULL,           "pfpnacc",      NULL,
16360 /* 90 */        "pfcmpge",      NULL,           NULL,           NULL,
16361 /* 94 */        "pfmin",        NULL,           "pfrcp",        "pfrsqrt",
16362 /* 98 */        NULL,           NULL,           "pfsub",        NULL,
16363 /* 9C */        NULL,           NULL,           "pfadd",        NULL,
16364 /* A0 */        "pfcmpgt",      NULL,           NULL,           NULL,
16365 /* A4 */        "pfmax",        NULL,           "pfrcpit1",     "pfrsqit1",
16366 /* A8 */        NULL,           NULL,           "pfsubr",       NULL,
16367 /* AC */        NULL,           NULL,           "pfacc",        NULL,
16368 /* B0 */        "pfcmpeq",      NULL,           NULL,           NULL,
16369 /* B4 */        "pfmul",        NULL,           "pfrcpit2",     "pmulhrw",
16370 /* B8 */        NULL,           NULL,           NULL,           "pswapd",
16371 /* BC */        NULL,           NULL,           NULL,           "pavgusb",
16372 /* C0 */        NULL,           NULL,           NULL,           NULL,
16373 /* C4 */        NULL,           NULL,           NULL,           NULL,
16374 /* C8 */        NULL,           NULL,           NULL,           NULL,
16375 /* CC */        NULL,           NULL,           NULL,           NULL,
16376 /* D0 */        NULL,           NULL,           NULL,           NULL,
16377 /* D4 */        NULL,           NULL,           NULL,           NULL,
16378 /* D8 */        NULL,           NULL,           NULL,           NULL,
16379 /* DC */        NULL,           NULL,           NULL,           NULL,
16380 /* E0 */        NULL,           NULL,           NULL,           NULL,
16381 /* E4 */        NULL,           NULL,           NULL,           NULL,
16382 /* E8 */        NULL,           NULL,           NULL,           NULL,
16383 /* EC */        NULL,           NULL,           NULL,           NULL,
16384 /* F0 */        NULL,           NULL,           NULL,           NULL,
16385 /* F4 */        NULL,           NULL,           NULL,           NULL,
16386 /* F8 */        NULL,           NULL,           NULL,           NULL,
16387 /* FC */        NULL,           NULL,           NULL,           NULL,
16388 };
16389
16390 static void
16391 OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
16392 {
16393   const char *mnemonic;
16394
16395   FETCH_DATA (the_info, codep + 1);
16396   /* AMD 3DNow! instructions are specified by an opcode suffix in the
16397      place where an 8-bit immediate would normally go.  ie. the last
16398      byte of the instruction.  */
16399   obufp = mnemonicendp;
16400   mnemonic = Suffix3DNow[*codep++ & 0xff];
16401   if (mnemonic)
16402     oappend (mnemonic);
16403   else
16404     {
16405       /* Since a variable sized modrm/sib chunk is between the start
16406          of the opcode (0x0f0f) and the opcode suffix, we need to do
16407          all the modrm processing first, and don't know until now that
16408          we have a bad opcode.  This necessitates some cleaning up.  */
16409       op_out[0][0] = '\0';
16410       op_out[1][0] = '\0';
16411       BadOp ();
16412     }
16413   mnemonicendp = obufp;
16414 }
16415
16416 static struct op simd_cmp_op[] =
16417 {
16418   { STRING_COMMA_LEN ("eq") },
16419   { STRING_COMMA_LEN ("lt") },
16420   { STRING_COMMA_LEN ("le") },
16421   { STRING_COMMA_LEN ("unord") },
16422   { STRING_COMMA_LEN ("neq") },
16423   { STRING_COMMA_LEN ("nlt") },
16424   { STRING_COMMA_LEN ("nle") },
16425   { STRING_COMMA_LEN ("ord") }
16426 };
16427
16428 static void
16429 CMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
16430 {
16431   unsigned int cmp_type;
16432
16433   FETCH_DATA (the_info, codep + 1);
16434   cmp_type = *codep++ & 0xff;
16435   if (cmp_type < ARRAY_SIZE (simd_cmp_op))
16436     {
16437       char suffix [3];
16438       char *p = mnemonicendp - 2;
16439       suffix[0] = p[0];
16440       suffix[1] = p[1];
16441       suffix[2] = '\0';
16442       sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
16443       mnemonicendp += simd_cmp_op[cmp_type].len;
16444     }
16445   else
16446     {
16447       /* We have a reserved extension byte.  Output it directly.  */
16448       scratchbuf[0] = '$';
16449       print_operand_value (scratchbuf + 1, 1, cmp_type);
16450       oappend_maybe_intel (scratchbuf);
16451       scratchbuf[0] = '\0';
16452     }
16453 }
16454
16455 static void
16456 OP_Mwaitx (int bytemode ATTRIBUTE_UNUSED,
16457           int sizeflag ATTRIBUTE_UNUSED)
16458 {
16459   /* mwaitx %eax,%ecx,%ebx */
16460   if (!intel_syntax)
16461     {
16462       const char **names = (address_mode == mode_64bit
16463                             ? names64 : names32);
16464       strcpy (op_out[0], names[0]);
16465       strcpy (op_out[1], names[1]);
16466       strcpy (op_out[2], names[3]);
16467       two_source_ops = 1;
16468     }
16469   /* Skip mod/rm byte.  */
16470   MODRM_CHECK;
16471   codep++;
16472 }
16473
16474 static void
16475 OP_Mwait (int bytemode ATTRIBUTE_UNUSED,
16476           int sizeflag ATTRIBUTE_UNUSED)
16477 {
16478   /* mwait %eax,%ecx  */
16479   if (!intel_syntax)
16480     {
16481       const char **names = (address_mode == mode_64bit
16482                             ? names64 : names32);
16483       strcpy (op_out[0], names[0]);
16484       strcpy (op_out[1], names[1]);
16485       two_source_ops = 1;
16486     }
16487   /* Skip mod/rm byte.  */
16488   MODRM_CHECK;
16489   codep++;
16490 }
16491
16492 static void
16493 OP_Monitor (int bytemode ATTRIBUTE_UNUSED,
16494             int sizeflag ATTRIBUTE_UNUSED)
16495 {
16496   /* monitor %eax,%ecx,%edx"  */
16497   if (!intel_syntax)
16498     {
16499       const char **op1_names;
16500       const char **names = (address_mode == mode_64bit
16501                             ? names64 : names32);
16502
16503       if (!(prefixes & PREFIX_ADDR))
16504         op1_names = (address_mode == mode_16bit
16505                      ? names16 : names);
16506       else
16507         {
16508           /* Remove "addr16/addr32".  */
16509           all_prefixes[last_addr_prefix] = 0;
16510           op1_names = (address_mode != mode_32bit
16511                        ? names32 : names16);
16512           used_prefixes |= PREFIX_ADDR;
16513         }
16514       strcpy (op_out[0], op1_names[0]);
16515       strcpy (op_out[1], names[1]);
16516       strcpy (op_out[2], names[2]);
16517       two_source_ops = 1;
16518     }
16519   /* Skip mod/rm byte.  */
16520   MODRM_CHECK;
16521   codep++;
16522 }
16523
16524 static void
16525 BadOp (void)
16526 {
16527   /* Throw away prefixes and 1st. opcode byte.  */
16528   codep = insn_codep + 1;
16529   oappend ("(bad)");
16530 }
16531
16532 static void
16533 REP_Fixup (int bytemode, int sizeflag)
16534 {
16535   /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
16536      lods and stos.  */
16537   if (prefixes & PREFIX_REPZ)
16538     all_prefixes[last_repz_prefix] = REP_PREFIX;
16539
16540   switch (bytemode)
16541     {
16542     case al_reg:
16543     case eAX_reg:
16544     case indir_dx_reg:
16545       OP_IMREG (bytemode, sizeflag);
16546       break;
16547     case eDI_reg:
16548       OP_ESreg (bytemode, sizeflag);
16549       break;
16550     case eSI_reg:
16551       OP_DSreg (bytemode, sizeflag);
16552       break;
16553     default:
16554       abort ();
16555       break;
16556     }
16557 }
16558
16559 /* For BND-prefixed instructions 0xF2 prefix should be displayed as
16560    "bnd".  */
16561
16562 static void
16563 BND_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
16564 {
16565   if (prefixes & PREFIX_REPNZ)
16566     all_prefixes[last_repnz_prefix] = BND_PREFIX;
16567 }
16568
16569 /* Similar to OP_E.  But the 0xf2/0xf3 prefixes should be displayed as
16570    "xacquire"/"xrelease" for memory operand if there is a LOCK prefix.
16571  */
16572
16573 static void
16574 HLE_Fixup1 (int bytemode, int sizeflag)
16575 {
16576   if (modrm.mod != 3
16577       && (prefixes & PREFIX_LOCK) != 0)
16578     {
16579       if (prefixes & PREFIX_REPZ)
16580         all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
16581       if (prefixes & PREFIX_REPNZ)
16582         all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
16583     }
16584
16585   OP_E (bytemode, sizeflag);
16586 }
16587
16588 /* Similar to OP_E.  But the 0xf2/0xf3 prefixes should be displayed as
16589    "xacquire"/"xrelease" for memory operand.  No check for LOCK prefix.
16590  */
16591
16592 static void
16593 HLE_Fixup2 (int bytemode, int sizeflag)
16594 {
16595   if (modrm.mod != 3)
16596     {
16597       if (prefixes & PREFIX_REPZ)
16598         all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
16599       if (prefixes & PREFIX_REPNZ)
16600         all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
16601     }
16602
16603   OP_E (bytemode, sizeflag);
16604 }
16605
16606 /* Similar to OP_E.  But the 0xf3 prefixes should be displayed as
16607    "xrelease" for memory operand.  No check for LOCK prefix.   */
16608
16609 static void
16610 HLE_Fixup3 (int bytemode, int sizeflag)
16611 {
16612   if (modrm.mod != 3
16613       && last_repz_prefix > last_repnz_prefix
16614       && (prefixes & PREFIX_REPZ) != 0)
16615     all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
16616
16617   OP_E (bytemode, sizeflag);
16618 }
16619
16620 static void
16621 CMPXCHG8B_Fixup (int bytemode, int sizeflag)
16622 {
16623   USED_REX (REX_W);
16624   if (rex & REX_W)
16625     {
16626       /* Change cmpxchg8b to cmpxchg16b.  */
16627       char *p = mnemonicendp - 2;
16628       mnemonicendp = stpcpy (p, "16b");
16629       bytemode = o_mode;
16630     }
16631   else if ((prefixes & PREFIX_LOCK) != 0)
16632     {
16633       if (prefixes & PREFIX_REPZ)
16634         all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
16635       if (prefixes & PREFIX_REPNZ)
16636         all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
16637     }
16638
16639   OP_M (bytemode, sizeflag);
16640 }
16641
16642 static void
16643 XMM_Fixup (int reg, int sizeflag ATTRIBUTE_UNUSED)
16644 {
16645   const char **names;
16646
16647   if (need_vex)
16648     {
16649       switch (vex.length)
16650         {
16651         case 128:
16652           names = names_xmm;
16653           break;
16654         case 256:
16655           names = names_ymm;
16656           break;
16657         default:
16658           abort ();
16659         }
16660     }
16661   else
16662     names = names_xmm;
16663   oappend (names[reg]);
16664 }
16665
16666 static void
16667 CRC32_Fixup (int bytemode, int sizeflag)
16668 {
16669   /* Add proper suffix to "crc32".  */
16670   char *p = mnemonicendp;
16671
16672   switch (bytemode)
16673     {
16674     case b_mode:
16675       if (intel_syntax)
16676         goto skip;
16677
16678       *p++ = 'b';
16679       break;
16680     case v_mode:
16681       if (intel_syntax)
16682         goto skip;
16683
16684       USED_REX (REX_W);
16685       if (rex & REX_W)
16686         *p++ = 'q';
16687       else
16688         {
16689           if (sizeflag & DFLAG)
16690             *p++ = 'l';
16691           else
16692             *p++ = 'w';
16693           used_prefixes |= (prefixes & PREFIX_DATA);
16694         }
16695       break;
16696     default:
16697       oappend (INTERNAL_DISASSEMBLER_ERROR);
16698       break;
16699     }
16700   mnemonicendp = p;
16701   *p = '\0';
16702
16703 skip:
16704   if (modrm.mod == 3)
16705     {
16706       int add;
16707
16708       /* Skip mod/rm byte.  */
16709       MODRM_CHECK;
16710       codep++;
16711
16712       USED_REX (REX_B);
16713       add = (rex & REX_B) ? 8 : 0;
16714       if (bytemode == b_mode)
16715         {
16716           USED_REX (0);
16717           if (rex)
16718             oappend (names8rex[modrm.rm + add]);
16719           else
16720             oappend (names8[modrm.rm + add]);
16721         }
16722       else
16723         {
16724           USED_REX (REX_W);
16725           if (rex & REX_W)
16726             oappend (names64[modrm.rm + add]);
16727           else if ((prefixes & PREFIX_DATA))
16728             oappend (names16[modrm.rm + add]);
16729           else
16730             oappend (names32[modrm.rm + add]);
16731         }
16732     }
16733   else
16734     OP_E (bytemode, sizeflag);
16735 }
16736
16737 static void
16738 FXSAVE_Fixup (int bytemode, int sizeflag)
16739 {
16740   /* Add proper suffix to "fxsave" and "fxrstor".  */
16741   USED_REX (REX_W);
16742   if (rex & REX_W)
16743     {
16744       char *p = mnemonicendp;
16745       *p++ = '6';
16746       *p++ = '4';
16747       *p = '\0';
16748       mnemonicendp = p;
16749     }
16750   OP_M (bytemode, sizeflag);
16751 }
16752
16753 /* Display the destination register operand for instructions with
16754    VEX. */
16755
16756 static void
16757 OP_VEX (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
16758 {
16759   int reg;
16760   const char **names;
16761
16762   if (!need_vex)
16763     abort ();
16764
16765   if (!need_vex_reg)
16766     return;
16767
16768   reg = vex.register_specifier;
16769   if (vex.evex)
16770     {
16771       if (!vex.v)
16772         reg += 16;
16773     }
16774
16775   if (bytemode == vex_scalar_mode)
16776     {
16777       oappend (names_xmm[reg]);
16778       return;
16779     }
16780
16781   switch (vex.length)
16782     {
16783     case 128:
16784       switch (bytemode)
16785         {
16786         case vex_mode:
16787         case vex128_mode:
16788         case vex_vsib_q_w_dq_mode:
16789         case vex_vsib_q_w_d_mode:
16790           names = names_xmm;
16791           break;
16792         case dq_mode:
16793           if (vex.w)
16794             names = names64;
16795           else
16796             names = names32;
16797           break;
16798         case mask_bd_mode:
16799         case mask_mode:
16800           names = names_mask;
16801           break;
16802         default:
16803           abort ();
16804           return;
16805         }
16806       break;
16807     case 256:
16808       switch (bytemode)
16809         {
16810         case vex_mode:
16811         case vex256_mode:
16812           names = names_ymm;
16813           break;
16814         case vex_vsib_q_w_dq_mode:
16815         case vex_vsib_q_w_d_mode:
16816           names = vex.w ? names_ymm : names_xmm;
16817           break;
16818         case mask_bd_mode:
16819         case mask_mode:
16820           names = names_mask;
16821           break;
16822         default:
16823           abort ();
16824           return;
16825         }
16826       break;
16827     case 512:
16828       names = names_zmm;
16829       break;
16830     default:
16831       abort ();
16832       break;
16833     }
16834   oappend (names[reg]);
16835 }
16836
16837 /* Get the VEX immediate byte without moving codep.  */
16838
16839 static unsigned char
16840 get_vex_imm8 (int sizeflag, int opnum)
16841 {
16842   int bytes_before_imm = 0;
16843
16844   if (modrm.mod != 3)
16845     {
16846       /* There are SIB/displacement bytes.  */
16847       if ((sizeflag & AFLAG) || address_mode == mode_64bit)
16848         {
16849           /* 32/64 bit address mode */
16850           int base = modrm.rm;
16851
16852           /* Check SIB byte.  */
16853           if (base == 4)
16854             {
16855               FETCH_DATA (the_info, codep + 1);
16856               base = *codep & 7;
16857               /* When decoding the third source, don't increase
16858                  bytes_before_imm as this has already been incremented
16859                  by one in OP_E_memory while decoding the second
16860                  source operand.  */
16861               if (opnum == 0)
16862                 bytes_before_imm++;
16863             }
16864
16865           /* Don't increase bytes_before_imm when decoding the third source,
16866              it has already been incremented by OP_E_memory while decoding
16867              the second source operand.  */
16868           if (opnum == 0)
16869             {
16870               switch (modrm.mod)
16871                 {
16872                   case 0:
16873                     /* When modrm.rm == 5 or modrm.rm == 4 and base in
16874                        SIB == 5, there is a 4 byte displacement.  */
16875                     if (base != 5)
16876                       /* No displacement. */
16877                       break;
16878                   case 2:
16879                     /* 4 byte displacement.  */
16880                     bytes_before_imm += 4;
16881                     break;
16882                   case 1:
16883                     /* 1 byte displacement.  */
16884                     bytes_before_imm++;
16885                     break;
16886                 }
16887             }
16888         }
16889       else
16890         {
16891           /* 16 bit address mode */
16892           /* Don't increase bytes_before_imm when decoding the third source,
16893              it has already been incremented by OP_E_memory while decoding
16894              the second source operand.  */
16895           if (opnum == 0)
16896             {
16897               switch (modrm.mod)
16898                 {
16899                 case 0:
16900                   /* When modrm.rm == 6, there is a 2 byte displacement.  */
16901                   if (modrm.rm != 6)
16902                     /* No displacement. */
16903                     break;
16904                 case 2:
16905                   /* 2 byte displacement.  */
16906                   bytes_before_imm += 2;
16907                   break;
16908                 case 1:
16909                   /* 1 byte displacement: when decoding the third source,
16910                      don't increase bytes_before_imm as this has already
16911                      been incremented by one in OP_E_memory while decoding
16912                      the second source operand.  */
16913                   if (opnum == 0)
16914                     bytes_before_imm++;
16915
16916                   break;
16917                 }
16918             }
16919         }
16920     }
16921
16922   FETCH_DATA (the_info, codep + bytes_before_imm + 1);
16923   return codep [bytes_before_imm];
16924 }
16925
16926 static void
16927 OP_EX_VexReg (int bytemode, int sizeflag, int reg)
16928 {
16929   const char **names;
16930
16931   if (reg == -1 && modrm.mod != 3)
16932     {
16933       OP_E_memory (bytemode, sizeflag);
16934       return;
16935     }
16936   else
16937     {
16938       if (reg == -1)
16939         {
16940           reg = modrm.rm;
16941           USED_REX (REX_B);
16942           if (rex & REX_B)
16943             reg += 8;
16944         }
16945       else if (reg > 7 && address_mode != mode_64bit)
16946         BadOp ();
16947     }
16948
16949   switch (vex.length)
16950     {
16951     case 128:
16952       names = names_xmm;
16953       break;
16954     case 256:
16955       names = names_ymm;
16956       break;
16957     default:
16958       abort ();
16959     }
16960   oappend (names[reg]);
16961 }
16962
16963 static void
16964 OP_EX_VexImmW (int bytemode, int sizeflag)
16965 {
16966   int reg = -1;
16967   static unsigned char vex_imm8;
16968
16969   if (vex_w_done == 0)
16970     {
16971       vex_w_done = 1;
16972
16973       /* Skip mod/rm byte.  */
16974       MODRM_CHECK;
16975       codep++;
16976
16977       vex_imm8 = get_vex_imm8 (sizeflag, 0);
16978
16979       if (vex.w)
16980           reg = vex_imm8 >> 4;
16981
16982       OP_EX_VexReg (bytemode, sizeflag, reg);
16983     }
16984   else if (vex_w_done == 1)
16985     {
16986       vex_w_done = 2;
16987
16988       if (!vex.w)
16989           reg = vex_imm8 >> 4;
16990
16991       OP_EX_VexReg (bytemode, sizeflag, reg);
16992     }
16993   else
16994     {
16995       /* Output the imm8 directly.  */
16996       scratchbuf[0] = '$';
16997       print_operand_value (scratchbuf + 1, 1, vex_imm8 & 0xf);
16998       oappend_maybe_intel (scratchbuf);
16999       scratchbuf[0] = '\0';
17000       codep++;
17001     }
17002 }
17003
17004 static void
17005 OP_Vex_2src (int bytemode, int sizeflag)
17006 {
17007   if (modrm.mod == 3)
17008     {
17009       int reg = modrm.rm;
17010       USED_REX (REX_B);
17011       if (rex & REX_B)
17012         reg += 8;
17013       oappend (names_xmm[reg]);
17014     }
17015   else
17016     {
17017       if (intel_syntax
17018           && (bytemode == v_mode || bytemode == v_swap_mode))
17019         {
17020           bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
17021           used_prefixes |= (prefixes & PREFIX_DATA);
17022         }
17023       OP_E (bytemode, sizeflag);
17024     }
17025 }
17026
17027 static void
17028 OP_Vex_2src_1 (int bytemode, int sizeflag)
17029 {
17030   if (modrm.mod == 3)
17031     {
17032       /* Skip mod/rm byte.   */
17033       MODRM_CHECK;
17034       codep++;
17035     }
17036
17037   if (vex.w)
17038     oappend (names_xmm[vex.register_specifier]);
17039   else
17040     OP_Vex_2src (bytemode, sizeflag);
17041 }
17042
17043 static void
17044 OP_Vex_2src_2 (int bytemode, int sizeflag)
17045 {
17046   if (vex.w)
17047     OP_Vex_2src (bytemode, sizeflag);
17048   else
17049     oappend (names_xmm[vex.register_specifier]);
17050 }
17051
17052 static void
17053 OP_EX_VexW (int bytemode, int sizeflag)
17054 {
17055   int reg = -1;
17056
17057   if (!vex_w_done)
17058     {
17059       vex_w_done = 1;
17060
17061       /* Skip mod/rm byte.  */
17062       MODRM_CHECK;
17063       codep++;
17064
17065       if (vex.w)
17066         reg = get_vex_imm8 (sizeflag, 0) >> 4;
17067     }
17068   else
17069     {
17070       if (!vex.w)
17071         reg = get_vex_imm8 (sizeflag, 1) >> 4;
17072     }
17073
17074   OP_EX_VexReg (bytemode, sizeflag, reg);
17075 }
17076
17077 static void
17078 VEXI4_Fixup (int bytemode ATTRIBUTE_UNUSED,
17079              int sizeflag ATTRIBUTE_UNUSED)
17080 {
17081   /* Skip the immediate byte and check for invalid bits.  */
17082   FETCH_DATA (the_info, codep + 1);
17083   if (*codep++ & 0xf)
17084     BadOp ();
17085 }
17086
17087 static void
17088 OP_REG_VexI4 (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
17089 {
17090   int reg;
17091   const char **names;
17092
17093   FETCH_DATA (the_info, codep + 1);
17094   reg = *codep++;
17095
17096   if (bytemode != x_mode)
17097     abort ();
17098
17099   if (reg & 0xf)
17100       BadOp ();
17101
17102   reg >>= 4;
17103   if (reg > 7 && address_mode != mode_64bit)
17104     BadOp ();
17105
17106   switch (vex.length)
17107     {
17108     case 128:
17109       names = names_xmm;
17110       break;
17111     case 256:
17112       names = names_ymm;
17113       break;
17114     default:
17115       abort ();
17116     }
17117   oappend (names[reg]);
17118 }
17119
17120 static void
17121 OP_XMM_VexW (int bytemode, int sizeflag)
17122 {
17123   /* Turn off the REX.W bit since it is used for swapping operands
17124      now.  */
17125   rex &= ~REX_W;
17126   OP_XMM (bytemode, sizeflag);
17127 }
17128
17129 static void
17130 OP_EX_Vex (int bytemode, int sizeflag)
17131 {
17132   if (modrm.mod != 3)
17133     {
17134       if (vex.register_specifier != 0)
17135         BadOp ();
17136       need_vex_reg = 0;
17137     }
17138   OP_EX (bytemode, sizeflag);
17139 }
17140
17141 static void
17142 OP_XMM_Vex (int bytemode, int sizeflag)
17143 {
17144   if (modrm.mod != 3)
17145     {
17146       if (vex.register_specifier != 0)
17147         BadOp ();
17148       need_vex_reg = 0;
17149     }
17150   OP_XMM (bytemode, sizeflag);
17151 }
17152
17153 static void
17154 VZERO_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
17155 {
17156   switch (vex.length)
17157     {
17158     case 128:
17159       mnemonicendp = stpcpy (obuf, "vzeroupper");
17160       break;
17161     case 256:
17162       mnemonicendp = stpcpy (obuf, "vzeroall");
17163       break;
17164     default:
17165       abort ();
17166     }
17167 }
17168
17169 static struct op vex_cmp_op[] =
17170 {
17171   { STRING_COMMA_LEN ("eq") },
17172   { STRING_COMMA_LEN ("lt") },
17173   { STRING_COMMA_LEN ("le") },
17174   { STRING_COMMA_LEN ("unord") },
17175   { STRING_COMMA_LEN ("neq") },
17176   { STRING_COMMA_LEN ("nlt") },
17177   { STRING_COMMA_LEN ("nle") },
17178   { STRING_COMMA_LEN ("ord") },
17179   { STRING_COMMA_LEN ("eq_uq") },
17180   { STRING_COMMA_LEN ("nge") },
17181   { STRING_COMMA_LEN ("ngt") },
17182   { STRING_COMMA_LEN ("false") },
17183   { STRING_COMMA_LEN ("neq_oq") },
17184   { STRING_COMMA_LEN ("ge") },
17185   { STRING_COMMA_LEN ("gt") },
17186   { STRING_COMMA_LEN ("true") },
17187   { STRING_COMMA_LEN ("eq_os") },
17188   { STRING_COMMA_LEN ("lt_oq") },
17189   { STRING_COMMA_LEN ("le_oq") },
17190   { STRING_COMMA_LEN ("unord_s") },
17191   { STRING_COMMA_LEN ("neq_us") },
17192   { STRING_COMMA_LEN ("nlt_uq") },
17193   { STRING_COMMA_LEN ("nle_uq") },
17194   { STRING_COMMA_LEN ("ord_s") },
17195   { STRING_COMMA_LEN ("eq_us") },
17196   { STRING_COMMA_LEN ("nge_uq") },
17197   { STRING_COMMA_LEN ("ngt_uq") },
17198   { STRING_COMMA_LEN ("false_os") },
17199   { STRING_COMMA_LEN ("neq_os") },
17200   { STRING_COMMA_LEN ("ge_oq") },
17201   { STRING_COMMA_LEN ("gt_oq") },
17202   { STRING_COMMA_LEN ("true_us") },
17203 };
17204
17205 static void
17206 VCMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
17207 {
17208   unsigned int cmp_type;
17209
17210   FETCH_DATA (the_info, codep + 1);
17211   cmp_type = *codep++ & 0xff;
17212   if (cmp_type < ARRAY_SIZE (vex_cmp_op))
17213     {
17214       char suffix [3];
17215       char *p = mnemonicendp - 2;
17216       suffix[0] = p[0];
17217       suffix[1] = p[1];
17218       suffix[2] = '\0';
17219       sprintf (p, "%s%s", vex_cmp_op[cmp_type].name, suffix);
17220       mnemonicendp += vex_cmp_op[cmp_type].len;
17221     }
17222   else
17223     {
17224       /* We have a reserved extension byte.  Output it directly.  */
17225       scratchbuf[0] = '$';
17226       print_operand_value (scratchbuf + 1, 1, cmp_type);
17227       oappend_maybe_intel (scratchbuf);
17228       scratchbuf[0] = '\0';
17229     }
17230 }
17231
17232 static void
17233 VPCMP_Fixup (int bytemode ATTRIBUTE_UNUSED,
17234              int sizeflag ATTRIBUTE_UNUSED)
17235 {
17236   unsigned int cmp_type;
17237
17238   if (!vex.evex)
17239     abort ();
17240
17241   FETCH_DATA (the_info, codep + 1);
17242   cmp_type = *codep++ & 0xff;
17243   /* There are aliases for immediates 0, 1, 2, 4, 5, 6.
17244      If it's the case, print suffix, otherwise - print the immediate.  */
17245   if (cmp_type < ARRAY_SIZE (simd_cmp_op)
17246       && cmp_type != 3
17247       && cmp_type != 7)
17248     {
17249       char suffix [3];
17250       char *p = mnemonicendp - 2;
17251
17252       /* vpcmp* can have both one- and two-lettered suffix.  */
17253       if (p[0] == 'p')
17254         {
17255           p++;
17256           suffix[0] = p[0];
17257           suffix[1] = '\0';
17258         }
17259       else
17260         {
17261           suffix[0] = p[0];
17262           suffix[1] = p[1];
17263           suffix[2] = '\0';
17264         }
17265
17266       sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
17267       mnemonicendp += simd_cmp_op[cmp_type].len;
17268     }
17269   else
17270     {
17271       /* We have a reserved extension byte.  Output it directly.  */
17272       scratchbuf[0] = '$';
17273       print_operand_value (scratchbuf + 1, 1, cmp_type);
17274       oappend_maybe_intel (scratchbuf);
17275       scratchbuf[0] = '\0';
17276     }
17277 }
17278
17279 static const struct op pclmul_op[] =
17280 {
17281   { STRING_COMMA_LEN ("lql") },
17282   { STRING_COMMA_LEN ("hql") },
17283   { STRING_COMMA_LEN ("lqh") },
17284   { STRING_COMMA_LEN ("hqh") }
17285 };
17286
17287 static void
17288 PCLMUL_Fixup (int bytemode ATTRIBUTE_UNUSED,
17289               int sizeflag ATTRIBUTE_UNUSED)
17290 {
17291   unsigned int pclmul_type;
17292
17293   FETCH_DATA (the_info, codep + 1);
17294   pclmul_type = *codep++ & 0xff;
17295   switch (pclmul_type)
17296     {
17297     case 0x10:
17298       pclmul_type = 2;
17299       break;
17300     case 0x11:
17301       pclmul_type = 3;
17302       break;
17303     default:
17304       break;
17305     }
17306   if (pclmul_type < ARRAY_SIZE (pclmul_op))
17307     {
17308       char suffix [4];
17309       char *p = mnemonicendp - 3;
17310       suffix[0] = p[0];
17311       suffix[1] = p[1];
17312       suffix[2] = p[2];
17313       suffix[3] = '\0';
17314       sprintf (p, "%s%s", pclmul_op[pclmul_type].name, suffix);
17315       mnemonicendp += pclmul_op[pclmul_type].len;
17316     }
17317   else
17318     {
17319       /* We have a reserved extension byte.  Output it directly.  */
17320       scratchbuf[0] = '$';
17321       print_operand_value (scratchbuf + 1, 1, pclmul_type);
17322       oappend_maybe_intel (scratchbuf);
17323       scratchbuf[0] = '\0';
17324     }
17325 }
17326
17327 static void
17328 MOVBE_Fixup (int bytemode, int sizeflag)
17329 {
17330   /* Add proper suffix to "movbe".  */
17331   char *p = mnemonicendp;
17332
17333   switch (bytemode)
17334     {
17335     case v_mode:
17336       if (intel_syntax)
17337         goto skip;
17338
17339       USED_REX (REX_W);
17340       if (sizeflag & SUFFIX_ALWAYS)
17341         {
17342           if (rex & REX_W)
17343             *p++ = 'q';
17344           else
17345             {
17346               if (sizeflag & DFLAG)
17347                 *p++ = 'l';
17348               else
17349                 *p++ = 'w';
17350               used_prefixes |= (prefixes & PREFIX_DATA);
17351             }
17352         }
17353       break;
17354     default:
17355       oappend (INTERNAL_DISASSEMBLER_ERROR);
17356       break;
17357     }
17358   mnemonicendp = p;
17359   *p = '\0';
17360
17361 skip:
17362   OP_M (bytemode, sizeflag);
17363 }
17364
17365 static void
17366 OP_LWPCB_E (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
17367 {
17368   int reg;
17369   const char **names;
17370
17371   /* Skip mod/rm byte.  */
17372   MODRM_CHECK;
17373   codep++;
17374
17375   if (vex.w)
17376     names = names64;
17377   else
17378     names = names32;
17379
17380   reg = modrm.rm;
17381   USED_REX (REX_B);
17382   if (rex & REX_B)
17383     reg += 8;
17384
17385   oappend (names[reg]);
17386 }
17387
17388 static void
17389 OP_LWP_E (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
17390 {
17391   const char **names;
17392
17393   if (vex.w)
17394     names = names64;
17395   else
17396     names = names32;
17397
17398   oappend (names[vex.register_specifier]);
17399 }
17400
17401 static void
17402 OP_Mask (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
17403 {
17404   if (!vex.evex
17405       || (bytemode != mask_mode && bytemode != mask_bd_mode))
17406     abort ();
17407
17408   USED_REX (REX_R);
17409   if ((rex & REX_R) != 0 || !vex.r)
17410     {
17411       BadOp ();
17412       return;
17413     }
17414
17415   oappend (names_mask [modrm.reg]);
17416 }
17417
17418 static void
17419 OP_Rounding (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
17420 {
17421   if (!vex.evex
17422       || (bytemode != evex_rounding_mode
17423           && bytemode != evex_sae_mode))
17424     abort ();
17425   if (modrm.mod == 3 && vex.b)
17426     switch (bytemode)
17427       {
17428       case evex_rounding_mode:
17429         oappend (names_rounding[vex.ll]);
17430         break;
17431       case evex_sae_mode:
17432         oappend ("{sae}");
17433         break;
17434       default:
17435         break;
17436       }
17437 }