Replace mandatory_prefix with prefix_requirement
[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 NOP_Fixup1 (int, int);
106 static void NOP_Fixup2 (int, int);
107 static void OP_3DNowSuffix (int, int);
108 static void CMP_Fixup (int, int);
109 static void BadOp (void);
110 static void REP_Fixup (int, int);
111 static void BND_Fixup (int, int);
112 static void HLE_Fixup1 (int, int);
113 static void HLE_Fixup2 (int, int);
114 static void HLE_Fixup3 (int, int);
115 static void CMPXCHG8B_Fixup (int, int);
116 static void XMM_Fixup (int, int);
117 static void CRC32_Fixup (int, int);
118 static void FXSAVE_Fixup (int, int);
119 static void OP_LWPCB_E (int, int);
120 static void OP_LWP_E (int, int);
121 static void OP_Vex_2src_1 (int, int);
122 static void OP_Vex_2src_2 (int, int);
123
124 static void MOVBE_Fixup (int, int);
125
126 static void OP_Mask (int, int);
127
128 struct dis_private {
129   /* Points to first byte not fetched.  */
130   bfd_byte *max_fetched;
131   bfd_byte the_buffer[MAX_MNEM_SIZE];
132   bfd_vma insn_start;
133   int orig_sizeflag;
134   OPCODES_SIGJMP_BUF bailout;
135 };
136
137 enum address_mode
138 {
139   mode_16bit,
140   mode_32bit,
141   mode_64bit
142 };
143
144 enum address_mode address_mode;
145
146 /* Flags for the prefixes for the current instruction.  See below.  */
147 static int prefixes;
148
149 /* REX prefix the current instruction.  See below.  */
150 static int rex;
151 /* Bits of REX we've already used.  */
152 static int rex_used;
153 /* REX bits in original REX prefix ignored.  */
154 static int rex_ignored;
155 /* Mark parts used in the REX prefix.  When we are testing for
156    empty prefix (for 8bit register REX extension), just mask it
157    out.  Otherwise test for REX bit is excuse for existence of REX
158    only in case value is nonzero.  */
159 #define USED_REX(value)                                 \
160   {                                                     \
161     if (value)                                          \
162       {                                                 \
163         if ((rex & value))                              \
164           rex_used |= (value) | REX_OPCODE;             \
165       }                                                 \
166     else                                                \
167       rex_used |= REX_OPCODE;                           \
168   }
169
170 /* Flags for prefixes which we somehow handled when printing the
171    current instruction.  */
172 static int used_prefixes;
173
174 /* Flags stored in PREFIXES.  */
175 #define PREFIX_REPZ 1
176 #define PREFIX_REPNZ 2
177 #define PREFIX_LOCK 4
178 #define PREFIX_CS 8
179 #define PREFIX_SS 0x10
180 #define PREFIX_DS 0x20
181 #define PREFIX_ES 0x40
182 #define PREFIX_FS 0x80
183 #define PREFIX_GS 0x100
184 #define PREFIX_DATA 0x200
185 #define PREFIX_ADDR 0x400
186 #define PREFIX_FWAIT 0x800
187
188 /* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
189    to ADDR (exclusive) are valid.  Returns 1 for success, longjmps
190    on error.  */
191 #define FETCH_DATA(info, addr) \
192   ((addr) <= ((struct dis_private *) (info->private_data))->max_fetched \
193    ? 1 : fetch_data ((info), (addr)))
194
195 static int
196 fetch_data (struct disassemble_info *info, bfd_byte *addr)
197 {
198   int status;
199   struct dis_private *priv = (struct dis_private *) info->private_data;
200   bfd_vma start = priv->insn_start + (priv->max_fetched - priv->the_buffer);
201
202   if (addr <= priv->the_buffer + MAX_MNEM_SIZE)
203     status = (*info->read_memory_func) (start,
204                                         priv->max_fetched,
205                                         addr - priv->max_fetched,
206                                         info);
207   else
208     status = -1;
209   if (status != 0)
210     {
211       /* If we did manage to read at least one byte, then
212          print_insn_i386 will do something sensible.  Otherwise, print
213          an error.  We do that here because this is where we know
214          STATUS.  */
215       if (priv->max_fetched == priv->the_buffer)
216         (*info->memory_error_func) (status, start, info);
217       OPCODES_SIGLONGJMP (priv->bailout, 1);
218     }
219   else
220     priv->max_fetched = addr;
221   return 1;
222 }
223
224 /* Possible values for prefix requirement.  */
225 #define PREFIX_UD_SHIFT         8
226 #define PREFIX_UD_REPZ          (PREFIX_REPZ << PREFIX_UD_SHIFT)
227 #define PREFIX_UD_REPNZ         (PREFIX_REPNZ << PREFIX_UD_SHIFT)
228 #define PREFIX_UD_DATA          (PREFIX_DATA << PREFIX_UD_SHIFT)
229 #define PREFIX_UD_ADDR          (PREFIX_ADDR << PREFIX_UD_SHIFT)
230 #define PREFIX_UD_LOCK          (PREFIX_LOCK << PREFIX_UD_SHIFT)
231 #define PREFIX_IGNORED_SHIFT    16
232 #define PREFIX_IGNORED_REPZ     (PREFIX_REPZ << PREFIX_IGNORED_SHIFT)
233 #define PREFIX_IGNORED_REPNZ    (PREFIX_REPNZ << PREFIX_IGNORED_SHIFT)
234 #define PREFIX_IGNORED_DATA     (PREFIX_DATA << PREFIX_IGNORED_SHIFT)
235 #define PREFIX_IGNORED_ADDR     (PREFIX_ADDR << PREFIX_IGNORED_SHIFT)
236 #define PREFIX_IGNORED_LOCK     (PREFIX_LOCK << PREFIX_IGNORED_SHIFT)
237
238 /* Opcode prefixes.  */
239 #define PREFIX_OPCODE           (PREFIX_REPZ \
240                                  | PREFIX_REPNZ \
241                                  | PREFIX_DATA)
242
243 /* Prefixes ignored.  */
244 #define PREFIX_IGNORED          (PREFIX_IGNORED_REPZ \
245                                  | PREFIX_IGNORED_REPNZ \
246                                  | PREFIX_IGNORED_DATA)
247
248 #define XX { NULL, 0 }
249 #define Bad_Opcode NULL, { { NULL, 0 } }, 0
250
251 #define Eb { OP_E, b_mode }
252 #define Ebnd { OP_E, bnd_mode }
253 #define EbS { OP_E, b_swap_mode }
254 #define Ev { OP_E, v_mode }
255 #define Ev_bnd { OP_E, v_bnd_mode }
256 #define EvS { OP_E, v_swap_mode }
257 #define Ed { OP_E, d_mode }
258 #define Edq { OP_E, dq_mode }
259 #define Edqw { OP_E, dqw_mode }
260 #define EdqwS { OP_E, dqw_swap_mode }
261 #define Edqb { OP_E, dqb_mode }
262 #define Edb { OP_E, db_mode }
263 #define Edw { OP_E, dw_mode }
264 #define Edqd { OP_E, dqd_mode }
265 #define Eq { OP_E, q_mode }
266 #define indirEv { OP_indirE, stack_v_mode }
267 #define indirEp { OP_indirE, f_mode }
268 #define stackEv { OP_E, stack_v_mode }
269 #define Em { OP_E, m_mode }
270 #define Ew { OP_E, w_mode }
271 #define M { OP_M, 0 }           /* lea, lgdt, etc. */
272 #define Ma { OP_M, a_mode }
273 #define Mb { OP_M, b_mode }
274 #define Md { OP_M, d_mode }
275 #define Mo { OP_M, o_mode }
276 #define Mp { OP_M, f_mode }             /* 32 or 48 bit memory operand for LDS, LES etc */
277 #define Mq { OP_M, q_mode }
278 #define Mx { OP_M, x_mode }
279 #define Mxmm { OP_M, xmm_mode }
280 #define Gb { OP_G, b_mode }
281 #define Gbnd { OP_G, bnd_mode }
282 #define Gv { OP_G, v_mode }
283 #define Gd { OP_G, d_mode }
284 #define Gdq { OP_G, dq_mode }
285 #define Gm { OP_G, m_mode }
286 #define Gw { OP_G, w_mode }
287 #define Rd { OP_R, d_mode }
288 #define Rdq { OP_R, dq_mode }
289 #define Rm { OP_R, m_mode }
290 #define Ib { OP_I, b_mode }
291 #define sIb { OP_sI, b_mode }   /* sign extened byte */
292 #define sIbT { OP_sI, b_T_mode } /* sign extened byte like 'T' */
293 #define Iv { OP_I, v_mode }
294 #define sIv { OP_sI, v_mode }
295 #define Iq { OP_I, q_mode }
296 #define Iv64 { OP_I64, v_mode }
297 #define Iw { OP_I, w_mode }
298 #define I1 { OP_I, const_1_mode }
299 #define Jb { OP_J, b_mode }
300 #define Jv { OP_J, v_mode }
301 #define Cm { OP_C, m_mode }
302 #define Dm { OP_D, m_mode }
303 #define Td { OP_T, d_mode }
304 #define Skip_MODRM { OP_Skip_MODRM, 0 }
305
306 #define RMeAX { OP_REG, eAX_reg }
307 #define RMeBX { OP_REG, eBX_reg }
308 #define RMeCX { OP_REG, eCX_reg }
309 #define RMeDX { OP_REG, eDX_reg }
310 #define RMeSP { OP_REG, eSP_reg }
311 #define RMeBP { OP_REG, eBP_reg }
312 #define RMeSI { OP_REG, eSI_reg }
313 #define RMeDI { OP_REG, eDI_reg }
314 #define RMrAX { OP_REG, rAX_reg }
315 #define RMrBX { OP_REG, rBX_reg }
316 #define RMrCX { OP_REG, rCX_reg }
317 #define RMrDX { OP_REG, rDX_reg }
318 #define RMrSP { OP_REG, rSP_reg }
319 #define RMrBP { OP_REG, rBP_reg }
320 #define RMrSI { OP_REG, rSI_reg }
321 #define RMrDI { OP_REG, rDI_reg }
322 #define RMAL { OP_REG, al_reg }
323 #define RMCL { OP_REG, cl_reg }
324 #define RMDL { OP_REG, dl_reg }
325 #define RMBL { OP_REG, bl_reg }
326 #define RMAH { OP_REG, ah_reg }
327 #define RMCH { OP_REG, ch_reg }
328 #define RMDH { OP_REG, dh_reg }
329 #define RMBH { OP_REG, bh_reg }
330 #define RMAX { OP_REG, ax_reg }
331 #define RMDX { OP_REG, dx_reg }
332
333 #define eAX { OP_IMREG, eAX_reg }
334 #define eBX { OP_IMREG, eBX_reg }
335 #define eCX { OP_IMREG, eCX_reg }
336 #define eDX { OP_IMREG, eDX_reg }
337 #define eSP { OP_IMREG, eSP_reg }
338 #define eBP { OP_IMREG, eBP_reg }
339 #define eSI { OP_IMREG, eSI_reg }
340 #define eDI { OP_IMREG, eDI_reg }
341 #define AL { OP_IMREG, al_reg }
342 #define CL { OP_IMREG, cl_reg }
343 #define DL { OP_IMREG, dl_reg }
344 #define BL { OP_IMREG, bl_reg }
345 #define AH { OP_IMREG, ah_reg }
346 #define CH { OP_IMREG, ch_reg }
347 #define DH { OP_IMREG, dh_reg }
348 #define BH { OP_IMREG, bh_reg }
349 #define AX { OP_IMREG, ax_reg }
350 #define DX { OP_IMREG, dx_reg }
351 #define zAX { OP_IMREG, z_mode_ax_reg }
352 #define indirDX { OP_IMREG, indir_dx_reg }
353
354 #define Sw { OP_SEG, w_mode }
355 #define Sv { OP_SEG, v_mode }
356 #define Ap { OP_DIR, 0 }
357 #define Ob { OP_OFF64, b_mode }
358 #define Ov { OP_OFF64, v_mode }
359 #define Xb { OP_DSreg, eSI_reg }
360 #define Xv { OP_DSreg, eSI_reg }
361 #define Xz { OP_DSreg, eSI_reg }
362 #define Yb { OP_ESreg, eDI_reg }
363 #define Yv { OP_ESreg, eDI_reg }
364 #define DSBX { OP_DSreg, eBX_reg }
365
366 #define es { OP_REG, es_reg }
367 #define ss { OP_REG, ss_reg }
368 #define cs { OP_REG, cs_reg }
369 #define ds { OP_REG, ds_reg }
370 #define fs { OP_REG, fs_reg }
371 #define gs { OP_REG, gs_reg }
372
373 #define MX { OP_MMX, 0 }
374 #define XM { OP_XMM, 0 }
375 #define XMScalar { OP_XMM, scalar_mode }
376 #define XMGatherQ { OP_XMM, vex_vsib_q_w_dq_mode }
377 #define XMM { OP_XMM, xmm_mode }
378 #define XMxmmq { OP_XMM, xmmq_mode }
379 #define EM { OP_EM, v_mode }
380 #define EMS { OP_EM, v_swap_mode }
381 #define EMd { OP_EM, d_mode }
382 #define EMx { OP_EM, x_mode }
383 #define EXw { OP_EX, w_mode }
384 #define EXd { OP_EX, d_mode }
385 #define EXdScalar { OP_EX, d_scalar_mode }
386 #define EXdS { OP_EX, d_swap_mode }
387 #define EXdScalarS { OP_EX, d_scalar_swap_mode }
388 #define EXq { OP_EX, q_mode }
389 #define EXqScalar { OP_EX, q_scalar_mode }
390 #define EXqScalarS { OP_EX, q_scalar_swap_mode }
391 #define EXqS { OP_EX, q_swap_mode }
392 #define EXx { OP_EX, x_mode }
393 #define EXxS { OP_EX, x_swap_mode }
394 #define EXxmm { OP_EX, xmm_mode }
395 #define EXymm { OP_EX, ymm_mode }
396 #define EXxmmq { OP_EX, xmmq_mode }
397 #define EXEvexHalfBcstXmmq { OP_EX, evex_half_bcst_xmmq_mode }
398 #define EXxmm_mb { OP_EX, xmm_mb_mode }
399 #define EXxmm_mw { OP_EX, xmm_mw_mode }
400 #define EXxmm_md { OP_EX, xmm_md_mode }
401 #define EXxmm_mq { OP_EX, xmm_mq_mode }
402 #define EXxmm_mdq { OP_EX, xmm_mdq_mode }
403 #define EXxmmdw { OP_EX, xmmdw_mode }
404 #define EXxmmqd { OP_EX, xmmqd_mode }
405 #define EXymmq { OP_EX, ymmq_mode }
406 #define EXVexWdq { OP_EX, vex_w_dq_mode }
407 #define EXVexWdqScalar { OP_EX, vex_scalar_w_dq_mode }
408 #define EXEvexXGscat { OP_EX, evex_x_gscat_mode }
409 #define EXEvexXNoBcst { OP_EX, evex_x_nobcst_mode }
410 #define MS { OP_MS, v_mode }
411 #define XS { OP_XS, v_mode }
412 #define EMCq { OP_EMC, q_mode }
413 #define MXC { OP_MXC, 0 }
414 #define OPSUF { OP_3DNowSuffix, 0 }
415 #define CMP { CMP_Fixup, 0 }
416 #define XMM0 { XMM_Fixup, 0 }
417 #define FXSAVE { FXSAVE_Fixup, 0 }
418 #define Vex_2src_1 { OP_Vex_2src_1, 0 }
419 #define Vex_2src_2 { OP_Vex_2src_2, 0 }
420
421 #define Vex { OP_VEX, vex_mode }
422 #define VexScalar { OP_VEX, vex_scalar_mode }
423 #define VexGatherQ { OP_VEX, vex_vsib_q_w_dq_mode }
424 #define Vex128 { OP_VEX, vex128_mode }
425 #define Vex256 { OP_VEX, vex256_mode }
426 #define VexGdq { OP_VEX, dq_mode }
427 #define VexI4 { VEXI4_Fixup, 0}
428 #define EXdVex { OP_EX_Vex, d_mode }
429 #define EXdVexS { OP_EX_Vex, d_swap_mode }
430 #define EXdVexScalarS { OP_EX_Vex, d_scalar_swap_mode }
431 #define EXqVex { OP_EX_Vex, q_mode }
432 #define EXqVexS { OP_EX_Vex, q_swap_mode }
433 #define EXqVexScalarS { OP_EX_Vex, q_scalar_swap_mode }
434 #define EXVexW { OP_EX_VexW, x_mode }
435 #define EXdVexW { OP_EX_VexW, d_mode }
436 #define EXqVexW { OP_EX_VexW, q_mode }
437 #define EXVexImmW { OP_EX_VexImmW, x_mode }
438 #define XMVex { OP_XMM_Vex, 0 }
439 #define XMVexScalar { OP_XMM_Vex, scalar_mode }
440 #define XMVexW { OP_XMM_VexW, 0 }
441 #define XMVexI4 { OP_REG_VexI4, x_mode }
442 #define PCLMUL { PCLMUL_Fixup, 0 }
443 #define VZERO { VZERO_Fixup, 0 }
444 #define VCMP { VCMP_Fixup, 0 }
445 #define VPCMP { VPCMP_Fixup, 0 }
446
447 #define EXxEVexR { OP_Rounding, evex_rounding_mode }
448 #define EXxEVexS { OP_Rounding, evex_sae_mode }
449
450 #define XMask { OP_Mask, mask_mode }
451 #define MaskG { OP_G, mask_mode }
452 #define MaskE { OP_E, mask_mode }
453 #define MaskBDE { OP_E, mask_bd_mode }
454 #define MaskR { OP_R, mask_mode }
455 #define MaskVex { OP_VEX, mask_mode }
456
457 #define MVexVSIBDWpX { OP_M, vex_vsib_d_w_dq_mode }
458 #define MVexVSIBDQWpX { OP_M, vex_vsib_d_w_d_mode }
459 #define MVexVSIBQWpX { OP_M, vex_vsib_q_w_dq_mode }
460 #define MVexVSIBQDWpX { OP_M, vex_vsib_q_w_d_mode }
461
462 /* Used handle "rep" prefix for string instructions.  */
463 #define Xbr { REP_Fixup, eSI_reg }
464 #define Xvr { REP_Fixup, eSI_reg }
465 #define Ybr { REP_Fixup, eDI_reg }
466 #define Yvr { REP_Fixup, eDI_reg }
467 #define Yzr { REP_Fixup, eDI_reg }
468 #define indirDXr { REP_Fixup, indir_dx_reg }
469 #define ALr { REP_Fixup, al_reg }
470 #define eAXr { REP_Fixup, eAX_reg }
471
472 /* Used handle HLE prefix for lockable instructions.  */
473 #define Ebh1 { HLE_Fixup1, b_mode }
474 #define Evh1 { HLE_Fixup1, v_mode }
475 #define Ebh2 { HLE_Fixup2, b_mode }
476 #define Evh2 { HLE_Fixup2, v_mode }
477 #define Ebh3 { HLE_Fixup3, b_mode }
478 #define Evh3 { HLE_Fixup3, v_mode }
479
480 #define BND { BND_Fixup, 0 }
481
482 #define cond_jump_flag { NULL, cond_jump_mode }
483 #define loop_jcxz_flag { NULL, loop_jcxz_mode }
484
485 /* bits in sizeflag */
486 #define SUFFIX_ALWAYS 4
487 #define AFLAG 2
488 #define DFLAG 1
489
490 enum
491 {
492   /* byte operand */
493   b_mode = 1,
494   /* byte operand with operand swapped */
495   b_swap_mode,
496   /* byte operand, sign extend like 'T' suffix */
497   b_T_mode,
498   /* operand size depends on prefixes */
499   v_mode,
500   /* operand size depends on prefixes with operand swapped */
501   v_swap_mode,
502   /* word operand */
503   w_mode,
504   /* double word operand  */
505   d_mode,
506   /* double word operand with operand swapped */
507   d_swap_mode,
508   /* quad word operand */
509   q_mode,
510   /* quad word operand with operand swapped */
511   q_swap_mode,
512   /* ten-byte operand */
513   t_mode,
514   /* 16-byte XMM, 32-byte YMM or 64-byte ZMM operand.  In EVEX with
515      broadcast enabled.  */
516   x_mode,
517   /* Similar to x_mode, but with different EVEX mem shifts.  */
518   evex_x_gscat_mode,
519   /* Similar to x_mode, but with disabled broadcast.  */
520   evex_x_nobcst_mode,
521   /* Similar to x_mode, but with operands swapped and disabled broadcast
522      in EVEX.  */
523   x_swap_mode,
524   /* 16-byte XMM operand */
525   xmm_mode,
526   /* XMM, XMM or YMM register operand, or quad word, xmmword or ymmword
527      memory operand (depending on vector length).  Broadcast isn't
528      allowed.  */
529   xmmq_mode,
530   /* Same as xmmq_mode, but broadcast is allowed.  */
531   evex_half_bcst_xmmq_mode,
532   /* XMM register or byte memory operand */
533   xmm_mb_mode,
534   /* XMM register or word memory operand */
535   xmm_mw_mode,
536   /* XMM register or double word memory operand */
537   xmm_md_mode,
538   /* XMM register or quad word memory operand */
539   xmm_mq_mode,
540   /* XMM register or double/quad word memory operand, depending on
541      VEX.W.  */
542   xmm_mdq_mode,
543   /* 16-byte XMM, word, double word or quad word operand.  */
544   xmmdw_mode,
545   /* 16-byte XMM, double word, quad word operand or xmm word operand.  */
546   xmmqd_mode,
547   /* 32-byte YMM operand */
548   ymm_mode,
549   /* quad word, ymmword or zmmword memory operand.  */
550   ymmq_mode,
551   /* 32-byte YMM or 16-byte word operand */
552   ymmxmm_mode,
553   /* d_mode in 32bit, q_mode in 64bit mode.  */
554   m_mode,
555   /* pair of v_mode operands */
556   a_mode,
557   cond_jump_mode,
558   loop_jcxz_mode,
559   v_bnd_mode,
560   /* operand size depends on REX prefixes.  */
561   dq_mode,
562   /* registers like dq_mode, memory like w_mode.  */
563   dqw_mode,
564   dqw_swap_mode,
565   bnd_mode,
566   /* 4- or 6-byte pointer operand */
567   f_mode,
568   const_1_mode,
569   /* v_mode for stack-related opcodes.  */
570   stack_v_mode,
571   /* non-quad operand size depends on prefixes */
572   z_mode,
573   /* 16-byte operand */
574   o_mode,
575   /* registers like dq_mode, memory like b_mode.  */
576   dqb_mode,
577   /* registers like d_mode, memory like b_mode.  */
578   db_mode,
579   /* registers like d_mode, memory like w_mode.  */
580   dw_mode,
581   /* registers like dq_mode, memory like d_mode.  */
582   dqd_mode,
583   /* normal vex mode */
584   vex_mode,
585   /* 128bit vex mode */
586   vex128_mode,
587   /* 256bit vex mode */
588   vex256_mode,
589   /* operand size depends on the VEX.W bit.  */
590   vex_w_dq_mode,
591
592   /* Similar to vex_w_dq_mode, with VSIB dword indices.  */
593   vex_vsib_d_w_dq_mode,
594   /* Similar to vex_vsib_d_w_dq_mode, with smaller memory.  */
595   vex_vsib_d_w_d_mode,
596   /* Similar to vex_w_dq_mode, with VSIB qword indices.  */
597   vex_vsib_q_w_dq_mode,
598   /* Similar to vex_vsib_q_w_dq_mode, with smaller memory.  */
599   vex_vsib_q_w_d_mode,
600
601   /* scalar, ignore vector length.  */
602   scalar_mode,
603   /* like d_mode, ignore vector length.  */
604   d_scalar_mode,
605   /* like d_swap_mode, ignore vector length.  */
606   d_scalar_swap_mode,
607   /* like q_mode, ignore vector length.  */
608   q_scalar_mode,
609   /* like q_swap_mode, ignore vector length.  */
610   q_scalar_swap_mode,
611   /* like vex_mode, ignore vector length.  */
612   vex_scalar_mode,
613   /* like vex_w_dq_mode, ignore vector length.  */
614   vex_scalar_w_dq_mode,
615
616   /* Static rounding.  */
617   evex_rounding_mode,
618   /* Supress all exceptions.  */
619   evex_sae_mode,
620
621   /* Mask register operand.  */
622   mask_mode,
623   /* Mask register operand.  */
624   mask_bd_mode,
625
626   es_reg,
627   cs_reg,
628   ss_reg,
629   ds_reg,
630   fs_reg,
631   gs_reg,
632
633   eAX_reg,
634   eCX_reg,
635   eDX_reg,
636   eBX_reg,
637   eSP_reg,
638   eBP_reg,
639   eSI_reg,
640   eDI_reg,
641
642   al_reg,
643   cl_reg,
644   dl_reg,
645   bl_reg,
646   ah_reg,
647   ch_reg,
648   dh_reg,
649   bh_reg,
650
651   ax_reg,
652   cx_reg,
653   dx_reg,
654   bx_reg,
655   sp_reg,
656   bp_reg,
657   si_reg,
658   di_reg,
659
660   rAX_reg,
661   rCX_reg,
662   rDX_reg,
663   rBX_reg,
664   rSP_reg,
665   rBP_reg,
666   rSI_reg,
667   rDI_reg,
668
669   z_mode_ax_reg,
670   indir_dx_reg
671 };
672
673 enum
674 {
675   FLOATCODE = 1,
676   USE_REG_TABLE,
677   USE_MOD_TABLE,
678   USE_RM_TABLE,
679   USE_PREFIX_TABLE,
680   USE_X86_64_TABLE,
681   USE_3BYTE_TABLE,
682   USE_XOP_8F_TABLE,
683   USE_VEX_C4_TABLE,
684   USE_VEX_C5_TABLE,
685   USE_VEX_LEN_TABLE,
686   USE_VEX_W_TABLE,
687   USE_EVEX_TABLE
688 };
689
690 #define FLOAT                   NULL, { { NULL, FLOATCODE } }, 0
691
692 #define DIS386(T, I)            NULL, { { NULL, (T)}, { NULL,  (I) } }, 0
693 #define DIS386_PREFIX(T, I, P)          NULL, { { NULL, (T)}, { NULL,  (I) } }, P
694 #define REG_TABLE(I)            DIS386 (USE_REG_TABLE, (I))
695 #define MOD_TABLE(I)            DIS386 (USE_MOD_TABLE, (I))
696 #define RM_TABLE(I)             DIS386 (USE_RM_TABLE, (I))
697 #define PREFIX_TABLE(I)         DIS386 (USE_PREFIX_TABLE, (I))
698 #define X86_64_TABLE(I)         DIS386 (USE_X86_64_TABLE, (I))
699 #define THREE_BYTE_TABLE(I)     DIS386 (USE_3BYTE_TABLE, (I))
700 #define THREE_BYTE_TABLE_PREFIX(I, P)   DIS386_PREFIX (USE_3BYTE_TABLE, (I), P)
701 #define XOP_8F_TABLE(I)         DIS386 (USE_XOP_8F_TABLE, (I))
702 #define VEX_C4_TABLE(I)         DIS386 (USE_VEX_C4_TABLE, (I))
703 #define VEX_C5_TABLE(I)         DIS386 (USE_VEX_C5_TABLE, (I))
704 #define VEX_LEN_TABLE(I)        DIS386 (USE_VEX_LEN_TABLE, (I))
705 #define VEX_W_TABLE(I)          DIS386 (USE_VEX_W_TABLE, (I))
706 #define EVEX_TABLE(I)           DIS386 (USE_EVEX_TABLE, (I))
707
708 enum
709 {
710   REG_80 = 0,
711   REG_81,
712   REG_82,
713   REG_8F,
714   REG_C0,
715   REG_C1,
716   REG_C6,
717   REG_C7,
718   REG_D0,
719   REG_D1,
720   REG_D2,
721   REG_D3,
722   REG_F6,
723   REG_F7,
724   REG_FE,
725   REG_FF,
726   REG_0F00,
727   REG_0F01,
728   REG_0F0D,
729   REG_0F18,
730   REG_0F71,
731   REG_0F72,
732   REG_0F73,
733   REG_0FA6,
734   REG_0FA7,
735   REG_0FAE,
736   REG_0FBA,
737   REG_0FC7,
738   REG_VEX_0F71,
739   REG_VEX_0F72,
740   REG_VEX_0F73,
741   REG_VEX_0FAE,
742   REG_VEX_0F38F3,
743   REG_XOP_LWPCB,
744   REG_XOP_LWP,
745   REG_XOP_TBM_01,
746   REG_XOP_TBM_02,
747
748   REG_EVEX_0F71,
749   REG_EVEX_0F72,
750   REG_EVEX_0F73,
751   REG_EVEX_0F38C6,
752   REG_EVEX_0F38C7
753 };
754
755 enum
756 {
757   MOD_8D = 0,
758   MOD_C6_REG_7,
759   MOD_C7_REG_7,
760   MOD_FF_REG_3,
761   MOD_FF_REG_5,
762   MOD_0F01_REG_0,
763   MOD_0F01_REG_1,
764   MOD_0F01_REG_2,
765   MOD_0F01_REG_3,
766   MOD_0F01_REG_7,
767   MOD_0F12_PREFIX_0,
768   MOD_0F13,
769   MOD_0F16_PREFIX_0,
770   MOD_0F17,
771   MOD_0F18_REG_0,
772   MOD_0F18_REG_1,
773   MOD_0F18_REG_2,
774   MOD_0F18_REG_3,
775   MOD_0F18_REG_4,
776   MOD_0F18_REG_5,
777   MOD_0F18_REG_6,
778   MOD_0F18_REG_7,
779   MOD_0F1A_PREFIX_0,
780   MOD_0F1B_PREFIX_0,
781   MOD_0F1B_PREFIX_1,
782   MOD_0F24,
783   MOD_0F26,
784   MOD_0F2B_PREFIX_0,
785   MOD_0F2B_PREFIX_1,
786   MOD_0F2B_PREFIX_2,
787   MOD_0F2B_PREFIX_3,
788   MOD_0F51,
789   MOD_0F71_REG_2,
790   MOD_0F71_REG_4,
791   MOD_0F71_REG_6,
792   MOD_0F72_REG_2,
793   MOD_0F72_REG_4,
794   MOD_0F72_REG_6,
795   MOD_0F73_REG_2,
796   MOD_0F73_REG_3,
797   MOD_0F73_REG_6,
798   MOD_0F73_REG_7,
799   MOD_0FAE_REG_0,
800   MOD_0FAE_REG_1,
801   MOD_0FAE_REG_2,
802   MOD_0FAE_REG_3,
803   MOD_0FAE_REG_4,
804   MOD_0FAE_REG_5,
805   MOD_0FAE_REG_6,
806   MOD_0FAE_REG_7,
807   MOD_0FB2,
808   MOD_0FB4,
809   MOD_0FB5,
810   MOD_0FC7_REG_3,
811   MOD_0FC7_REG_4,
812   MOD_0FC7_REG_5,
813   MOD_0FC7_REG_6,
814   MOD_0FC7_REG_7,
815   MOD_0FD7,
816   MOD_0FE7_PREFIX_2,
817   MOD_0FF0_PREFIX_3,
818   MOD_0F382A_PREFIX_2,
819   MOD_62_32BIT,
820   MOD_C4_32BIT,
821   MOD_C5_32BIT,
822   MOD_VEX_0F12_PREFIX_0,
823   MOD_VEX_0F13,
824   MOD_VEX_0F16_PREFIX_0,
825   MOD_VEX_0F17,
826   MOD_VEX_0F2B,
827   MOD_VEX_0F50,
828   MOD_VEX_0F71_REG_2,
829   MOD_VEX_0F71_REG_4,
830   MOD_VEX_0F71_REG_6,
831   MOD_VEX_0F72_REG_2,
832   MOD_VEX_0F72_REG_4,
833   MOD_VEX_0F72_REG_6,
834   MOD_VEX_0F73_REG_2,
835   MOD_VEX_0F73_REG_3,
836   MOD_VEX_0F73_REG_6,
837   MOD_VEX_0F73_REG_7,
838   MOD_VEX_0FAE_REG_2,
839   MOD_VEX_0FAE_REG_3,
840   MOD_VEX_0FD7_PREFIX_2,
841   MOD_VEX_0FE7_PREFIX_2,
842   MOD_VEX_0FF0_PREFIX_3,
843   MOD_VEX_0F381A_PREFIX_2,
844   MOD_VEX_0F382A_PREFIX_2,
845   MOD_VEX_0F382C_PREFIX_2,
846   MOD_VEX_0F382D_PREFIX_2,
847   MOD_VEX_0F382E_PREFIX_2,
848   MOD_VEX_0F382F_PREFIX_2,
849   MOD_VEX_0F385A_PREFIX_2,
850   MOD_VEX_0F388C_PREFIX_2,
851   MOD_VEX_0F388E_PREFIX_2,
852
853   MOD_EVEX_0F10_PREFIX_1,
854   MOD_EVEX_0F10_PREFIX_3,
855   MOD_EVEX_0F11_PREFIX_1,
856   MOD_EVEX_0F11_PREFIX_3,
857   MOD_EVEX_0F12_PREFIX_0,
858   MOD_EVEX_0F16_PREFIX_0,
859   MOD_EVEX_0F38C6_REG_1,
860   MOD_EVEX_0F38C6_REG_2,
861   MOD_EVEX_0F38C6_REG_5,
862   MOD_EVEX_0F38C6_REG_6,
863   MOD_EVEX_0F38C7_REG_1,
864   MOD_EVEX_0F38C7_REG_2,
865   MOD_EVEX_0F38C7_REG_5,
866   MOD_EVEX_0F38C7_REG_6
867 };
868
869 enum
870 {
871   RM_C6_REG_7 = 0,
872   RM_C7_REG_7,
873   RM_0F01_REG_0,
874   RM_0F01_REG_1,
875   RM_0F01_REG_2,
876   RM_0F01_REG_3,
877   RM_0F01_REG_7,
878   RM_0FAE_REG_5,
879   RM_0FAE_REG_6,
880   RM_0FAE_REG_7
881 };
882
883 enum
884 {
885   PREFIX_90 = 0,
886   PREFIX_0F10,
887   PREFIX_0F11,
888   PREFIX_0F12,
889   PREFIX_0F16,
890   PREFIX_0F1A,
891   PREFIX_0F1B,
892   PREFIX_0F2A,
893   PREFIX_0F2B,
894   PREFIX_0F2C,
895   PREFIX_0F2D,
896   PREFIX_0F2E,
897   PREFIX_0F2F,
898   PREFIX_0F51,
899   PREFIX_0F52,
900   PREFIX_0F53,
901   PREFIX_0F58,
902   PREFIX_0F59,
903   PREFIX_0F5A,
904   PREFIX_0F5B,
905   PREFIX_0F5C,
906   PREFIX_0F5D,
907   PREFIX_0F5E,
908   PREFIX_0F5F,
909   PREFIX_0F60,
910   PREFIX_0F61,
911   PREFIX_0F62,
912   PREFIX_0F6C,
913   PREFIX_0F6D,
914   PREFIX_0F6F,
915   PREFIX_0F70,
916   PREFIX_0F73_REG_3,
917   PREFIX_0F73_REG_7,
918   PREFIX_0F78,
919   PREFIX_0F79,
920   PREFIX_0F7C,
921   PREFIX_0F7D,
922   PREFIX_0F7E,
923   PREFIX_0F7F,
924   PREFIX_0FAE_REG_0,
925   PREFIX_0FAE_REG_1,
926   PREFIX_0FAE_REG_2,
927   PREFIX_0FAE_REG_3,
928   PREFIX_0FAE_REG_6,
929   PREFIX_0FAE_REG_7,
930   PREFIX_RM_0_0FAE_REG_7,
931   PREFIX_0FB8,
932   PREFIX_0FBC,
933   PREFIX_0FBD,
934   PREFIX_0FC2,
935   PREFIX_0FC3,
936   PREFIX_0FC7_REG_6,
937   PREFIX_0FD0,
938   PREFIX_0FD6,
939   PREFIX_0FE6,
940   PREFIX_0FE7,
941   PREFIX_0FF0,
942   PREFIX_0FF7,
943   PREFIX_0F3810,
944   PREFIX_0F3814,
945   PREFIX_0F3815,
946   PREFIX_0F3817,
947   PREFIX_0F3820,
948   PREFIX_0F3821,
949   PREFIX_0F3822,
950   PREFIX_0F3823,
951   PREFIX_0F3824,
952   PREFIX_0F3825,
953   PREFIX_0F3828,
954   PREFIX_0F3829,
955   PREFIX_0F382A,
956   PREFIX_0F382B,
957   PREFIX_0F3830,
958   PREFIX_0F3831,
959   PREFIX_0F3832,
960   PREFIX_0F3833,
961   PREFIX_0F3834,
962   PREFIX_0F3835,
963   PREFIX_0F3837,
964   PREFIX_0F3838,
965   PREFIX_0F3839,
966   PREFIX_0F383A,
967   PREFIX_0F383B,
968   PREFIX_0F383C,
969   PREFIX_0F383D,
970   PREFIX_0F383E,
971   PREFIX_0F383F,
972   PREFIX_0F3840,
973   PREFIX_0F3841,
974   PREFIX_0F3880,
975   PREFIX_0F3881,
976   PREFIX_0F3882,
977   PREFIX_0F38C8,
978   PREFIX_0F38C9,
979   PREFIX_0F38CA,
980   PREFIX_0F38CB,
981   PREFIX_0F38CC,
982   PREFIX_0F38CD,
983   PREFIX_0F38DB,
984   PREFIX_0F38DC,
985   PREFIX_0F38DD,
986   PREFIX_0F38DE,
987   PREFIX_0F38DF,
988   PREFIX_0F38F0,
989   PREFIX_0F38F1,
990   PREFIX_0F38F6,
991   PREFIX_0F3A08,
992   PREFIX_0F3A09,
993   PREFIX_0F3A0A,
994   PREFIX_0F3A0B,
995   PREFIX_0F3A0C,
996   PREFIX_0F3A0D,
997   PREFIX_0F3A0E,
998   PREFIX_0F3A14,
999   PREFIX_0F3A15,
1000   PREFIX_0F3A16,
1001   PREFIX_0F3A17,
1002   PREFIX_0F3A20,
1003   PREFIX_0F3A21,
1004   PREFIX_0F3A22,
1005   PREFIX_0F3A40,
1006   PREFIX_0F3A41,
1007   PREFIX_0F3A42,
1008   PREFIX_0F3A44,
1009   PREFIX_0F3A60,
1010   PREFIX_0F3A61,
1011   PREFIX_0F3A62,
1012   PREFIX_0F3A63,
1013   PREFIX_0F3ACC,
1014   PREFIX_0F3ADF,
1015   PREFIX_VEX_0F10,
1016   PREFIX_VEX_0F11,
1017   PREFIX_VEX_0F12,
1018   PREFIX_VEX_0F16,
1019   PREFIX_VEX_0F2A,
1020   PREFIX_VEX_0F2C,
1021   PREFIX_VEX_0F2D,
1022   PREFIX_VEX_0F2E,
1023   PREFIX_VEX_0F2F,
1024   PREFIX_VEX_0F41,
1025   PREFIX_VEX_0F42,
1026   PREFIX_VEX_0F44,
1027   PREFIX_VEX_0F45,
1028   PREFIX_VEX_0F46,
1029   PREFIX_VEX_0F47,
1030   PREFIX_VEX_0F4A,
1031   PREFIX_VEX_0F4B,
1032   PREFIX_VEX_0F51,
1033   PREFIX_VEX_0F52,
1034   PREFIX_VEX_0F53,
1035   PREFIX_VEX_0F58,
1036   PREFIX_VEX_0F59,
1037   PREFIX_VEX_0F5A,
1038   PREFIX_VEX_0F5B,
1039   PREFIX_VEX_0F5C,
1040   PREFIX_VEX_0F5D,
1041   PREFIX_VEX_0F5E,
1042   PREFIX_VEX_0F5F,
1043   PREFIX_VEX_0F60,
1044   PREFIX_VEX_0F61,
1045   PREFIX_VEX_0F62,
1046   PREFIX_VEX_0F63,
1047   PREFIX_VEX_0F64,
1048   PREFIX_VEX_0F65,
1049   PREFIX_VEX_0F66,
1050   PREFIX_VEX_0F67,
1051   PREFIX_VEX_0F68,
1052   PREFIX_VEX_0F69,
1053   PREFIX_VEX_0F6A,
1054   PREFIX_VEX_0F6B,
1055   PREFIX_VEX_0F6C,
1056   PREFIX_VEX_0F6D,
1057   PREFIX_VEX_0F6E,
1058   PREFIX_VEX_0F6F,
1059   PREFIX_VEX_0F70,
1060   PREFIX_VEX_0F71_REG_2,
1061   PREFIX_VEX_0F71_REG_4,
1062   PREFIX_VEX_0F71_REG_6,
1063   PREFIX_VEX_0F72_REG_2,
1064   PREFIX_VEX_0F72_REG_4,
1065   PREFIX_VEX_0F72_REG_6,
1066   PREFIX_VEX_0F73_REG_2,
1067   PREFIX_VEX_0F73_REG_3,
1068   PREFIX_VEX_0F73_REG_6,
1069   PREFIX_VEX_0F73_REG_7,
1070   PREFIX_VEX_0F74,
1071   PREFIX_VEX_0F75,
1072   PREFIX_VEX_0F76,
1073   PREFIX_VEX_0F77,
1074   PREFIX_VEX_0F7C,
1075   PREFIX_VEX_0F7D,
1076   PREFIX_VEX_0F7E,
1077   PREFIX_VEX_0F7F,
1078   PREFIX_VEX_0F90,
1079   PREFIX_VEX_0F91,
1080   PREFIX_VEX_0F92,
1081   PREFIX_VEX_0F93,
1082   PREFIX_VEX_0F98,
1083   PREFIX_VEX_0F99,
1084   PREFIX_VEX_0FC2,
1085   PREFIX_VEX_0FC4,
1086   PREFIX_VEX_0FC5,
1087   PREFIX_VEX_0FD0,
1088   PREFIX_VEX_0FD1,
1089   PREFIX_VEX_0FD2,
1090   PREFIX_VEX_0FD3,
1091   PREFIX_VEX_0FD4,
1092   PREFIX_VEX_0FD5,
1093   PREFIX_VEX_0FD6,
1094   PREFIX_VEX_0FD7,
1095   PREFIX_VEX_0FD8,
1096   PREFIX_VEX_0FD9,
1097   PREFIX_VEX_0FDA,
1098   PREFIX_VEX_0FDB,
1099   PREFIX_VEX_0FDC,
1100   PREFIX_VEX_0FDD,
1101   PREFIX_VEX_0FDE,
1102   PREFIX_VEX_0FDF,
1103   PREFIX_VEX_0FE0,
1104   PREFIX_VEX_0FE1,
1105   PREFIX_VEX_0FE2,
1106   PREFIX_VEX_0FE3,
1107   PREFIX_VEX_0FE4,
1108   PREFIX_VEX_0FE5,
1109   PREFIX_VEX_0FE6,
1110   PREFIX_VEX_0FE7,
1111   PREFIX_VEX_0FE8,
1112   PREFIX_VEX_0FE9,
1113   PREFIX_VEX_0FEA,
1114   PREFIX_VEX_0FEB,
1115   PREFIX_VEX_0FEC,
1116   PREFIX_VEX_0FED,
1117   PREFIX_VEX_0FEE,
1118   PREFIX_VEX_0FEF,
1119   PREFIX_VEX_0FF0,
1120   PREFIX_VEX_0FF1,
1121   PREFIX_VEX_0FF2,
1122   PREFIX_VEX_0FF3,
1123   PREFIX_VEX_0FF4,
1124   PREFIX_VEX_0FF5,
1125   PREFIX_VEX_0FF6,
1126   PREFIX_VEX_0FF7,
1127   PREFIX_VEX_0FF8,
1128   PREFIX_VEX_0FF9,
1129   PREFIX_VEX_0FFA,
1130   PREFIX_VEX_0FFB,
1131   PREFIX_VEX_0FFC,
1132   PREFIX_VEX_0FFD,
1133   PREFIX_VEX_0FFE,
1134   PREFIX_VEX_0F3800,
1135   PREFIX_VEX_0F3801,
1136   PREFIX_VEX_0F3802,
1137   PREFIX_VEX_0F3803,
1138   PREFIX_VEX_0F3804,
1139   PREFIX_VEX_0F3805,
1140   PREFIX_VEX_0F3806,
1141   PREFIX_VEX_0F3807,
1142   PREFIX_VEX_0F3808,
1143   PREFIX_VEX_0F3809,
1144   PREFIX_VEX_0F380A,
1145   PREFIX_VEX_0F380B,
1146   PREFIX_VEX_0F380C,
1147   PREFIX_VEX_0F380D,
1148   PREFIX_VEX_0F380E,
1149   PREFIX_VEX_0F380F,
1150   PREFIX_VEX_0F3813,
1151   PREFIX_VEX_0F3816,
1152   PREFIX_VEX_0F3817,
1153   PREFIX_VEX_0F3818,
1154   PREFIX_VEX_0F3819,
1155   PREFIX_VEX_0F381A,
1156   PREFIX_VEX_0F381C,
1157   PREFIX_VEX_0F381D,
1158   PREFIX_VEX_0F381E,
1159   PREFIX_VEX_0F3820,
1160   PREFIX_VEX_0F3821,
1161   PREFIX_VEX_0F3822,
1162   PREFIX_VEX_0F3823,
1163   PREFIX_VEX_0F3824,
1164   PREFIX_VEX_0F3825,
1165   PREFIX_VEX_0F3828,
1166   PREFIX_VEX_0F3829,
1167   PREFIX_VEX_0F382A,
1168   PREFIX_VEX_0F382B,
1169   PREFIX_VEX_0F382C,
1170   PREFIX_VEX_0F382D,
1171   PREFIX_VEX_0F382E,
1172   PREFIX_VEX_0F382F,
1173   PREFIX_VEX_0F3830,
1174   PREFIX_VEX_0F3831,
1175   PREFIX_VEX_0F3832,
1176   PREFIX_VEX_0F3833,
1177   PREFIX_VEX_0F3834,
1178   PREFIX_VEX_0F3835,
1179   PREFIX_VEX_0F3836,
1180   PREFIX_VEX_0F3837,
1181   PREFIX_VEX_0F3838,
1182   PREFIX_VEX_0F3839,
1183   PREFIX_VEX_0F383A,
1184   PREFIX_VEX_0F383B,
1185   PREFIX_VEX_0F383C,
1186   PREFIX_VEX_0F383D,
1187   PREFIX_VEX_0F383E,
1188   PREFIX_VEX_0F383F,
1189   PREFIX_VEX_0F3840,
1190   PREFIX_VEX_0F3841,
1191   PREFIX_VEX_0F3845,
1192   PREFIX_VEX_0F3846,
1193   PREFIX_VEX_0F3847,
1194   PREFIX_VEX_0F3858,
1195   PREFIX_VEX_0F3859,
1196   PREFIX_VEX_0F385A,
1197   PREFIX_VEX_0F3878,
1198   PREFIX_VEX_0F3879,
1199   PREFIX_VEX_0F388C,
1200   PREFIX_VEX_0F388E,
1201   PREFIX_VEX_0F3890,
1202   PREFIX_VEX_0F3891,
1203   PREFIX_VEX_0F3892,
1204   PREFIX_VEX_0F3893,
1205   PREFIX_VEX_0F3896,
1206   PREFIX_VEX_0F3897,
1207   PREFIX_VEX_0F3898,
1208   PREFIX_VEX_0F3899,
1209   PREFIX_VEX_0F389A,
1210   PREFIX_VEX_0F389B,
1211   PREFIX_VEX_0F389C,
1212   PREFIX_VEX_0F389D,
1213   PREFIX_VEX_0F389E,
1214   PREFIX_VEX_0F389F,
1215   PREFIX_VEX_0F38A6,
1216   PREFIX_VEX_0F38A7,
1217   PREFIX_VEX_0F38A8,
1218   PREFIX_VEX_0F38A9,
1219   PREFIX_VEX_0F38AA,
1220   PREFIX_VEX_0F38AB,
1221   PREFIX_VEX_0F38AC,
1222   PREFIX_VEX_0F38AD,
1223   PREFIX_VEX_0F38AE,
1224   PREFIX_VEX_0F38AF,
1225   PREFIX_VEX_0F38B6,
1226   PREFIX_VEX_0F38B7,
1227   PREFIX_VEX_0F38B8,
1228   PREFIX_VEX_0F38B9,
1229   PREFIX_VEX_0F38BA,
1230   PREFIX_VEX_0F38BB,
1231   PREFIX_VEX_0F38BC,
1232   PREFIX_VEX_0F38BD,
1233   PREFIX_VEX_0F38BE,
1234   PREFIX_VEX_0F38BF,
1235   PREFIX_VEX_0F38DB,
1236   PREFIX_VEX_0F38DC,
1237   PREFIX_VEX_0F38DD,
1238   PREFIX_VEX_0F38DE,
1239   PREFIX_VEX_0F38DF,
1240   PREFIX_VEX_0F38F2,
1241   PREFIX_VEX_0F38F3_REG_1,
1242   PREFIX_VEX_0F38F3_REG_2,
1243   PREFIX_VEX_0F38F3_REG_3,
1244   PREFIX_VEX_0F38F5,
1245   PREFIX_VEX_0F38F6,
1246   PREFIX_VEX_0F38F7,
1247   PREFIX_VEX_0F3A00,
1248   PREFIX_VEX_0F3A01,
1249   PREFIX_VEX_0F3A02,
1250   PREFIX_VEX_0F3A04,
1251   PREFIX_VEX_0F3A05,
1252   PREFIX_VEX_0F3A06,
1253   PREFIX_VEX_0F3A08,
1254   PREFIX_VEX_0F3A09,
1255   PREFIX_VEX_0F3A0A,
1256   PREFIX_VEX_0F3A0B,
1257   PREFIX_VEX_0F3A0C,
1258   PREFIX_VEX_0F3A0D,
1259   PREFIX_VEX_0F3A0E,
1260   PREFIX_VEX_0F3A0F,
1261   PREFIX_VEX_0F3A14,
1262   PREFIX_VEX_0F3A15,
1263   PREFIX_VEX_0F3A16,
1264   PREFIX_VEX_0F3A17,
1265   PREFIX_VEX_0F3A18,
1266   PREFIX_VEX_0F3A19,
1267   PREFIX_VEX_0F3A1D,
1268   PREFIX_VEX_0F3A20,
1269   PREFIX_VEX_0F3A21,
1270   PREFIX_VEX_0F3A22,
1271   PREFIX_VEX_0F3A30,
1272   PREFIX_VEX_0F3A31,
1273   PREFIX_VEX_0F3A32,
1274   PREFIX_VEX_0F3A33,
1275   PREFIX_VEX_0F3A38,
1276   PREFIX_VEX_0F3A39,
1277   PREFIX_VEX_0F3A40,
1278   PREFIX_VEX_0F3A41,
1279   PREFIX_VEX_0F3A42,
1280   PREFIX_VEX_0F3A44,
1281   PREFIX_VEX_0F3A46,
1282   PREFIX_VEX_0F3A48,
1283   PREFIX_VEX_0F3A49,
1284   PREFIX_VEX_0F3A4A,
1285   PREFIX_VEX_0F3A4B,
1286   PREFIX_VEX_0F3A4C,
1287   PREFIX_VEX_0F3A5C,
1288   PREFIX_VEX_0F3A5D,
1289   PREFIX_VEX_0F3A5E,
1290   PREFIX_VEX_0F3A5F,
1291   PREFIX_VEX_0F3A60,
1292   PREFIX_VEX_0F3A61,
1293   PREFIX_VEX_0F3A62,
1294   PREFIX_VEX_0F3A63,
1295   PREFIX_VEX_0F3A68,
1296   PREFIX_VEX_0F3A69,
1297   PREFIX_VEX_0F3A6A,
1298   PREFIX_VEX_0F3A6B,
1299   PREFIX_VEX_0F3A6C,
1300   PREFIX_VEX_0F3A6D,
1301   PREFIX_VEX_0F3A6E,
1302   PREFIX_VEX_0F3A6F,
1303   PREFIX_VEX_0F3A78,
1304   PREFIX_VEX_0F3A79,
1305   PREFIX_VEX_0F3A7A,
1306   PREFIX_VEX_0F3A7B,
1307   PREFIX_VEX_0F3A7C,
1308   PREFIX_VEX_0F3A7D,
1309   PREFIX_VEX_0F3A7E,
1310   PREFIX_VEX_0F3A7F,
1311   PREFIX_VEX_0F3ADF,
1312   PREFIX_VEX_0F3AF0,
1313
1314   PREFIX_EVEX_0F10,
1315   PREFIX_EVEX_0F11,
1316   PREFIX_EVEX_0F12,
1317   PREFIX_EVEX_0F13,
1318   PREFIX_EVEX_0F14,
1319   PREFIX_EVEX_0F15,
1320   PREFIX_EVEX_0F16,
1321   PREFIX_EVEX_0F17,
1322   PREFIX_EVEX_0F28,
1323   PREFIX_EVEX_0F29,
1324   PREFIX_EVEX_0F2A,
1325   PREFIX_EVEX_0F2B,
1326   PREFIX_EVEX_0F2C,
1327   PREFIX_EVEX_0F2D,
1328   PREFIX_EVEX_0F2E,
1329   PREFIX_EVEX_0F2F,
1330   PREFIX_EVEX_0F51,
1331   PREFIX_EVEX_0F54,
1332   PREFIX_EVEX_0F55,
1333   PREFIX_EVEX_0F56,
1334   PREFIX_EVEX_0F57,
1335   PREFIX_EVEX_0F58,
1336   PREFIX_EVEX_0F59,
1337   PREFIX_EVEX_0F5A,
1338   PREFIX_EVEX_0F5B,
1339   PREFIX_EVEX_0F5C,
1340   PREFIX_EVEX_0F5D,
1341   PREFIX_EVEX_0F5E,
1342   PREFIX_EVEX_0F5F,
1343   PREFIX_EVEX_0F60,
1344   PREFIX_EVEX_0F61,
1345   PREFIX_EVEX_0F62,
1346   PREFIX_EVEX_0F63,
1347   PREFIX_EVEX_0F64,
1348   PREFIX_EVEX_0F65,
1349   PREFIX_EVEX_0F66,
1350   PREFIX_EVEX_0F67,
1351   PREFIX_EVEX_0F68,
1352   PREFIX_EVEX_0F69,
1353   PREFIX_EVEX_0F6A,
1354   PREFIX_EVEX_0F6B,
1355   PREFIX_EVEX_0F6C,
1356   PREFIX_EVEX_0F6D,
1357   PREFIX_EVEX_0F6E,
1358   PREFIX_EVEX_0F6F,
1359   PREFIX_EVEX_0F70,
1360   PREFIX_EVEX_0F71_REG_2,
1361   PREFIX_EVEX_0F71_REG_4,
1362   PREFIX_EVEX_0F71_REG_6,
1363   PREFIX_EVEX_0F72_REG_0,
1364   PREFIX_EVEX_0F72_REG_1,
1365   PREFIX_EVEX_0F72_REG_2,
1366   PREFIX_EVEX_0F72_REG_4,
1367   PREFIX_EVEX_0F72_REG_6,
1368   PREFIX_EVEX_0F73_REG_2,
1369   PREFIX_EVEX_0F73_REG_3,
1370   PREFIX_EVEX_0F73_REG_6,
1371   PREFIX_EVEX_0F73_REG_7,
1372   PREFIX_EVEX_0F74,
1373   PREFIX_EVEX_0F75,
1374   PREFIX_EVEX_0F76,
1375   PREFIX_EVEX_0F78,
1376   PREFIX_EVEX_0F79,
1377   PREFIX_EVEX_0F7A,
1378   PREFIX_EVEX_0F7B,
1379   PREFIX_EVEX_0F7E,
1380   PREFIX_EVEX_0F7F,
1381   PREFIX_EVEX_0FC2,
1382   PREFIX_EVEX_0FC4,
1383   PREFIX_EVEX_0FC5,
1384   PREFIX_EVEX_0FC6,
1385   PREFIX_EVEX_0FD1,
1386   PREFIX_EVEX_0FD2,
1387   PREFIX_EVEX_0FD3,
1388   PREFIX_EVEX_0FD4,
1389   PREFIX_EVEX_0FD5,
1390   PREFIX_EVEX_0FD6,
1391   PREFIX_EVEX_0FD8,
1392   PREFIX_EVEX_0FD9,
1393   PREFIX_EVEX_0FDA,
1394   PREFIX_EVEX_0FDB,
1395   PREFIX_EVEX_0FDC,
1396   PREFIX_EVEX_0FDD,
1397   PREFIX_EVEX_0FDE,
1398   PREFIX_EVEX_0FDF,
1399   PREFIX_EVEX_0FE0,
1400   PREFIX_EVEX_0FE1,
1401   PREFIX_EVEX_0FE2,
1402   PREFIX_EVEX_0FE3,
1403   PREFIX_EVEX_0FE4,
1404   PREFIX_EVEX_0FE5,
1405   PREFIX_EVEX_0FE6,
1406   PREFIX_EVEX_0FE7,
1407   PREFIX_EVEX_0FE8,
1408   PREFIX_EVEX_0FE9,
1409   PREFIX_EVEX_0FEA,
1410   PREFIX_EVEX_0FEB,
1411   PREFIX_EVEX_0FEC,
1412   PREFIX_EVEX_0FED,
1413   PREFIX_EVEX_0FEE,
1414   PREFIX_EVEX_0FEF,
1415   PREFIX_EVEX_0FF1,
1416   PREFIX_EVEX_0FF2,
1417   PREFIX_EVEX_0FF3,
1418   PREFIX_EVEX_0FF4,
1419   PREFIX_EVEX_0FF5,
1420   PREFIX_EVEX_0FF6,
1421   PREFIX_EVEX_0FF8,
1422   PREFIX_EVEX_0FF9,
1423   PREFIX_EVEX_0FFA,
1424   PREFIX_EVEX_0FFB,
1425   PREFIX_EVEX_0FFC,
1426   PREFIX_EVEX_0FFD,
1427   PREFIX_EVEX_0FFE,
1428   PREFIX_EVEX_0F3800,
1429   PREFIX_EVEX_0F3804,
1430   PREFIX_EVEX_0F380B,
1431   PREFIX_EVEX_0F380C,
1432   PREFIX_EVEX_0F380D,
1433   PREFIX_EVEX_0F3810,
1434   PREFIX_EVEX_0F3811,
1435   PREFIX_EVEX_0F3812,
1436   PREFIX_EVEX_0F3813,
1437   PREFIX_EVEX_0F3814,
1438   PREFIX_EVEX_0F3815,
1439   PREFIX_EVEX_0F3816,
1440   PREFIX_EVEX_0F3818,
1441   PREFIX_EVEX_0F3819,
1442   PREFIX_EVEX_0F381A,
1443   PREFIX_EVEX_0F381B,
1444   PREFIX_EVEX_0F381C,
1445   PREFIX_EVEX_0F381D,
1446   PREFIX_EVEX_0F381E,
1447   PREFIX_EVEX_0F381F,
1448   PREFIX_EVEX_0F3820,
1449   PREFIX_EVEX_0F3821,
1450   PREFIX_EVEX_0F3822,
1451   PREFIX_EVEX_0F3823,
1452   PREFIX_EVEX_0F3824,
1453   PREFIX_EVEX_0F3825,
1454   PREFIX_EVEX_0F3826,
1455   PREFIX_EVEX_0F3827,
1456   PREFIX_EVEX_0F3828,
1457   PREFIX_EVEX_0F3829,
1458   PREFIX_EVEX_0F382A,
1459   PREFIX_EVEX_0F382B,
1460   PREFIX_EVEX_0F382C,
1461   PREFIX_EVEX_0F382D,
1462   PREFIX_EVEX_0F3830,
1463   PREFIX_EVEX_0F3831,
1464   PREFIX_EVEX_0F3832,
1465   PREFIX_EVEX_0F3833,
1466   PREFIX_EVEX_0F3834,
1467   PREFIX_EVEX_0F3835,
1468   PREFIX_EVEX_0F3836,
1469   PREFIX_EVEX_0F3837,
1470   PREFIX_EVEX_0F3838,
1471   PREFIX_EVEX_0F3839,
1472   PREFIX_EVEX_0F383A,
1473   PREFIX_EVEX_0F383B,
1474   PREFIX_EVEX_0F383C,
1475   PREFIX_EVEX_0F383D,
1476   PREFIX_EVEX_0F383E,
1477   PREFIX_EVEX_0F383F,
1478   PREFIX_EVEX_0F3840,
1479   PREFIX_EVEX_0F3842,
1480   PREFIX_EVEX_0F3843,
1481   PREFIX_EVEX_0F3844,
1482   PREFIX_EVEX_0F3845,
1483   PREFIX_EVEX_0F3846,
1484   PREFIX_EVEX_0F3847,
1485   PREFIX_EVEX_0F384C,
1486   PREFIX_EVEX_0F384D,
1487   PREFIX_EVEX_0F384E,
1488   PREFIX_EVEX_0F384F,
1489   PREFIX_EVEX_0F3858,
1490   PREFIX_EVEX_0F3859,
1491   PREFIX_EVEX_0F385A,
1492   PREFIX_EVEX_0F385B,
1493   PREFIX_EVEX_0F3864,
1494   PREFIX_EVEX_0F3865,
1495   PREFIX_EVEX_0F3866,
1496   PREFIX_EVEX_0F3875,
1497   PREFIX_EVEX_0F3876,
1498   PREFIX_EVEX_0F3877,
1499   PREFIX_EVEX_0F3878,
1500   PREFIX_EVEX_0F3879,
1501   PREFIX_EVEX_0F387A,
1502   PREFIX_EVEX_0F387B,
1503   PREFIX_EVEX_0F387C,
1504   PREFIX_EVEX_0F387D,
1505   PREFIX_EVEX_0F387E,
1506   PREFIX_EVEX_0F387F,
1507   PREFIX_EVEX_0F3883,
1508   PREFIX_EVEX_0F3888,
1509   PREFIX_EVEX_0F3889,
1510   PREFIX_EVEX_0F388A,
1511   PREFIX_EVEX_0F388B,
1512   PREFIX_EVEX_0F388D,
1513   PREFIX_EVEX_0F3890,
1514   PREFIX_EVEX_0F3891,
1515   PREFIX_EVEX_0F3892,
1516   PREFIX_EVEX_0F3893,
1517   PREFIX_EVEX_0F3896,
1518   PREFIX_EVEX_0F3897,
1519   PREFIX_EVEX_0F3898,
1520   PREFIX_EVEX_0F3899,
1521   PREFIX_EVEX_0F389A,
1522   PREFIX_EVEX_0F389B,
1523   PREFIX_EVEX_0F389C,
1524   PREFIX_EVEX_0F389D,
1525   PREFIX_EVEX_0F389E,
1526   PREFIX_EVEX_0F389F,
1527   PREFIX_EVEX_0F38A0,
1528   PREFIX_EVEX_0F38A1,
1529   PREFIX_EVEX_0F38A2,
1530   PREFIX_EVEX_0F38A3,
1531   PREFIX_EVEX_0F38A6,
1532   PREFIX_EVEX_0F38A7,
1533   PREFIX_EVEX_0F38A8,
1534   PREFIX_EVEX_0F38A9,
1535   PREFIX_EVEX_0F38AA,
1536   PREFIX_EVEX_0F38AB,
1537   PREFIX_EVEX_0F38AC,
1538   PREFIX_EVEX_0F38AD,
1539   PREFIX_EVEX_0F38AE,
1540   PREFIX_EVEX_0F38AF,
1541   PREFIX_EVEX_0F38B4,
1542   PREFIX_EVEX_0F38B5,
1543   PREFIX_EVEX_0F38B6,
1544   PREFIX_EVEX_0F38B7,
1545   PREFIX_EVEX_0F38B8,
1546   PREFIX_EVEX_0F38B9,
1547   PREFIX_EVEX_0F38BA,
1548   PREFIX_EVEX_0F38BB,
1549   PREFIX_EVEX_0F38BC,
1550   PREFIX_EVEX_0F38BD,
1551   PREFIX_EVEX_0F38BE,
1552   PREFIX_EVEX_0F38BF,
1553   PREFIX_EVEX_0F38C4,
1554   PREFIX_EVEX_0F38C6_REG_1,
1555   PREFIX_EVEX_0F38C6_REG_2,
1556   PREFIX_EVEX_0F38C6_REG_5,
1557   PREFIX_EVEX_0F38C6_REG_6,
1558   PREFIX_EVEX_0F38C7_REG_1,
1559   PREFIX_EVEX_0F38C7_REG_2,
1560   PREFIX_EVEX_0F38C7_REG_5,
1561   PREFIX_EVEX_0F38C7_REG_6,
1562   PREFIX_EVEX_0F38C8,
1563   PREFIX_EVEX_0F38CA,
1564   PREFIX_EVEX_0F38CB,
1565   PREFIX_EVEX_0F38CC,
1566   PREFIX_EVEX_0F38CD,
1567
1568   PREFIX_EVEX_0F3A00,
1569   PREFIX_EVEX_0F3A01,
1570   PREFIX_EVEX_0F3A03,
1571   PREFIX_EVEX_0F3A04,
1572   PREFIX_EVEX_0F3A05,
1573   PREFIX_EVEX_0F3A08,
1574   PREFIX_EVEX_0F3A09,
1575   PREFIX_EVEX_0F3A0A,
1576   PREFIX_EVEX_0F3A0B,
1577   PREFIX_EVEX_0F3A0F,
1578   PREFIX_EVEX_0F3A14,
1579   PREFIX_EVEX_0F3A15,
1580   PREFIX_EVEX_0F3A16,
1581   PREFIX_EVEX_0F3A17,
1582   PREFIX_EVEX_0F3A18,
1583   PREFIX_EVEX_0F3A19,
1584   PREFIX_EVEX_0F3A1A,
1585   PREFIX_EVEX_0F3A1B,
1586   PREFIX_EVEX_0F3A1D,
1587   PREFIX_EVEX_0F3A1E,
1588   PREFIX_EVEX_0F3A1F,
1589   PREFIX_EVEX_0F3A20,
1590   PREFIX_EVEX_0F3A21,
1591   PREFIX_EVEX_0F3A22,
1592   PREFIX_EVEX_0F3A23,
1593   PREFIX_EVEX_0F3A25,
1594   PREFIX_EVEX_0F3A26,
1595   PREFIX_EVEX_0F3A27,
1596   PREFIX_EVEX_0F3A38,
1597   PREFIX_EVEX_0F3A39,
1598   PREFIX_EVEX_0F3A3A,
1599   PREFIX_EVEX_0F3A3B,
1600   PREFIX_EVEX_0F3A3E,
1601   PREFIX_EVEX_0F3A3F,
1602   PREFIX_EVEX_0F3A42,
1603   PREFIX_EVEX_0F3A43,
1604   PREFIX_EVEX_0F3A50,
1605   PREFIX_EVEX_0F3A51,
1606   PREFIX_EVEX_0F3A54,
1607   PREFIX_EVEX_0F3A55,
1608   PREFIX_EVEX_0F3A56,
1609   PREFIX_EVEX_0F3A57,
1610   PREFIX_EVEX_0F3A66,
1611   PREFIX_EVEX_0F3A67
1612 };
1613
1614 enum
1615 {
1616   X86_64_06 = 0,
1617   X86_64_07,
1618   X86_64_0D,
1619   X86_64_16,
1620   X86_64_17,
1621   X86_64_1E,
1622   X86_64_1F,
1623   X86_64_27,
1624   X86_64_2F,
1625   X86_64_37,
1626   X86_64_3F,
1627   X86_64_60,
1628   X86_64_61,
1629   X86_64_62,
1630   X86_64_63,
1631   X86_64_6D,
1632   X86_64_6F,
1633   X86_64_9A,
1634   X86_64_C4,
1635   X86_64_C5,
1636   X86_64_CE,
1637   X86_64_D4,
1638   X86_64_D5,
1639   X86_64_EA,
1640   X86_64_0F01_REG_0,
1641   X86_64_0F01_REG_1,
1642   X86_64_0F01_REG_2,
1643   X86_64_0F01_REG_3
1644 };
1645
1646 enum
1647 {
1648   THREE_BYTE_0F38 = 0,
1649   THREE_BYTE_0F3A,
1650   THREE_BYTE_0F7A
1651 };
1652
1653 enum
1654 {
1655   XOP_08 = 0,
1656   XOP_09,
1657   XOP_0A
1658 };
1659
1660 enum
1661 {
1662   VEX_0F = 0,
1663   VEX_0F38,
1664   VEX_0F3A
1665 };
1666
1667 enum
1668 {
1669   EVEX_0F = 0,
1670   EVEX_0F38,
1671   EVEX_0F3A
1672 };
1673
1674 enum
1675 {
1676   VEX_LEN_0F10_P_1 = 0,
1677   VEX_LEN_0F10_P_3,
1678   VEX_LEN_0F11_P_1,
1679   VEX_LEN_0F11_P_3,
1680   VEX_LEN_0F12_P_0_M_0,
1681   VEX_LEN_0F12_P_0_M_1,
1682   VEX_LEN_0F12_P_2,
1683   VEX_LEN_0F13_M_0,
1684   VEX_LEN_0F16_P_0_M_0,
1685   VEX_LEN_0F16_P_0_M_1,
1686   VEX_LEN_0F16_P_2,
1687   VEX_LEN_0F17_M_0,
1688   VEX_LEN_0F2A_P_1,
1689   VEX_LEN_0F2A_P_3,
1690   VEX_LEN_0F2C_P_1,
1691   VEX_LEN_0F2C_P_3,
1692   VEX_LEN_0F2D_P_1,
1693   VEX_LEN_0F2D_P_3,
1694   VEX_LEN_0F2E_P_0,
1695   VEX_LEN_0F2E_P_2,
1696   VEX_LEN_0F2F_P_0,
1697   VEX_LEN_0F2F_P_2,
1698   VEX_LEN_0F41_P_0,
1699   VEX_LEN_0F41_P_2,
1700   VEX_LEN_0F42_P_0,
1701   VEX_LEN_0F42_P_2,
1702   VEX_LEN_0F44_P_0,
1703   VEX_LEN_0F44_P_2,
1704   VEX_LEN_0F45_P_0,
1705   VEX_LEN_0F45_P_2,
1706   VEX_LEN_0F46_P_0,
1707   VEX_LEN_0F46_P_2,
1708   VEX_LEN_0F47_P_0,
1709   VEX_LEN_0F47_P_2,
1710   VEX_LEN_0F4A_P_0,
1711   VEX_LEN_0F4A_P_2,
1712   VEX_LEN_0F4B_P_0,
1713   VEX_LEN_0F4B_P_2,
1714   VEX_LEN_0F51_P_1,
1715   VEX_LEN_0F51_P_3,
1716   VEX_LEN_0F52_P_1,
1717   VEX_LEN_0F53_P_1,
1718   VEX_LEN_0F58_P_1,
1719   VEX_LEN_0F58_P_3,
1720   VEX_LEN_0F59_P_1,
1721   VEX_LEN_0F59_P_3,
1722   VEX_LEN_0F5A_P_1,
1723   VEX_LEN_0F5A_P_3,
1724   VEX_LEN_0F5C_P_1,
1725   VEX_LEN_0F5C_P_3,
1726   VEX_LEN_0F5D_P_1,
1727   VEX_LEN_0F5D_P_3,
1728   VEX_LEN_0F5E_P_1,
1729   VEX_LEN_0F5E_P_3,
1730   VEX_LEN_0F5F_P_1,
1731   VEX_LEN_0F5F_P_3,
1732   VEX_LEN_0F6E_P_2,
1733   VEX_LEN_0F7E_P_1,
1734   VEX_LEN_0F7E_P_2,
1735   VEX_LEN_0F90_P_0,
1736   VEX_LEN_0F90_P_2,
1737   VEX_LEN_0F91_P_0,
1738   VEX_LEN_0F91_P_2,
1739   VEX_LEN_0F92_P_0,
1740   VEX_LEN_0F92_P_2,
1741   VEX_LEN_0F92_P_3,
1742   VEX_LEN_0F93_P_0,
1743   VEX_LEN_0F93_P_2,
1744   VEX_LEN_0F93_P_3,
1745   VEX_LEN_0F98_P_0,
1746   VEX_LEN_0F98_P_2,
1747   VEX_LEN_0F99_P_0,
1748   VEX_LEN_0F99_P_2,
1749   VEX_LEN_0FAE_R_2_M_0,
1750   VEX_LEN_0FAE_R_3_M_0,
1751   VEX_LEN_0FC2_P_1,
1752   VEX_LEN_0FC2_P_3,
1753   VEX_LEN_0FC4_P_2,
1754   VEX_LEN_0FC5_P_2,
1755   VEX_LEN_0FD6_P_2,
1756   VEX_LEN_0FF7_P_2,
1757   VEX_LEN_0F3816_P_2,
1758   VEX_LEN_0F3819_P_2,
1759   VEX_LEN_0F381A_P_2_M_0,
1760   VEX_LEN_0F3836_P_2,
1761   VEX_LEN_0F3841_P_2,
1762   VEX_LEN_0F385A_P_2_M_0,
1763   VEX_LEN_0F38DB_P_2,
1764   VEX_LEN_0F38DC_P_2,
1765   VEX_LEN_0F38DD_P_2,
1766   VEX_LEN_0F38DE_P_2,
1767   VEX_LEN_0F38DF_P_2,
1768   VEX_LEN_0F38F2_P_0,
1769   VEX_LEN_0F38F3_R_1_P_0,
1770   VEX_LEN_0F38F3_R_2_P_0,
1771   VEX_LEN_0F38F3_R_3_P_0,
1772   VEX_LEN_0F38F5_P_0,
1773   VEX_LEN_0F38F5_P_1,
1774   VEX_LEN_0F38F5_P_3,
1775   VEX_LEN_0F38F6_P_3,
1776   VEX_LEN_0F38F7_P_0,
1777   VEX_LEN_0F38F7_P_1,
1778   VEX_LEN_0F38F7_P_2,
1779   VEX_LEN_0F38F7_P_3,
1780   VEX_LEN_0F3A00_P_2,
1781   VEX_LEN_0F3A01_P_2,
1782   VEX_LEN_0F3A06_P_2,
1783   VEX_LEN_0F3A0A_P_2,
1784   VEX_LEN_0F3A0B_P_2,
1785   VEX_LEN_0F3A14_P_2,
1786   VEX_LEN_0F3A15_P_2,
1787   VEX_LEN_0F3A16_P_2,
1788   VEX_LEN_0F3A17_P_2,
1789   VEX_LEN_0F3A18_P_2,
1790   VEX_LEN_0F3A19_P_2,
1791   VEX_LEN_0F3A20_P_2,
1792   VEX_LEN_0F3A21_P_2,
1793   VEX_LEN_0F3A22_P_2,
1794   VEX_LEN_0F3A30_P_2,
1795   VEX_LEN_0F3A31_P_2,
1796   VEX_LEN_0F3A32_P_2,
1797   VEX_LEN_0F3A33_P_2,
1798   VEX_LEN_0F3A38_P_2,
1799   VEX_LEN_0F3A39_P_2,
1800   VEX_LEN_0F3A41_P_2,
1801   VEX_LEN_0F3A44_P_2,
1802   VEX_LEN_0F3A46_P_2,
1803   VEX_LEN_0F3A60_P_2,
1804   VEX_LEN_0F3A61_P_2,
1805   VEX_LEN_0F3A62_P_2,
1806   VEX_LEN_0F3A63_P_2,
1807   VEX_LEN_0F3A6A_P_2,
1808   VEX_LEN_0F3A6B_P_2,
1809   VEX_LEN_0F3A6E_P_2,
1810   VEX_LEN_0F3A6F_P_2,
1811   VEX_LEN_0F3A7A_P_2,
1812   VEX_LEN_0F3A7B_P_2,
1813   VEX_LEN_0F3A7E_P_2,
1814   VEX_LEN_0F3A7F_P_2,
1815   VEX_LEN_0F3ADF_P_2,
1816   VEX_LEN_0F3AF0_P_3,
1817   VEX_LEN_0FXOP_08_CC,
1818   VEX_LEN_0FXOP_08_CD,
1819   VEX_LEN_0FXOP_08_CE,
1820   VEX_LEN_0FXOP_08_CF,
1821   VEX_LEN_0FXOP_08_EC,
1822   VEX_LEN_0FXOP_08_ED,
1823   VEX_LEN_0FXOP_08_EE,
1824   VEX_LEN_0FXOP_08_EF,
1825   VEX_LEN_0FXOP_09_80,
1826   VEX_LEN_0FXOP_09_81
1827 };
1828
1829 enum
1830 {
1831   VEX_W_0F10_P_0 = 0,
1832   VEX_W_0F10_P_1,
1833   VEX_W_0F10_P_2,
1834   VEX_W_0F10_P_3,
1835   VEX_W_0F11_P_0,
1836   VEX_W_0F11_P_1,
1837   VEX_W_0F11_P_2,
1838   VEX_W_0F11_P_3,
1839   VEX_W_0F12_P_0_M_0,
1840   VEX_W_0F12_P_0_M_1,
1841   VEX_W_0F12_P_1,
1842   VEX_W_0F12_P_2,
1843   VEX_W_0F12_P_3,
1844   VEX_W_0F13_M_0,
1845   VEX_W_0F14,
1846   VEX_W_0F15,
1847   VEX_W_0F16_P_0_M_0,
1848   VEX_W_0F16_P_0_M_1,
1849   VEX_W_0F16_P_1,
1850   VEX_W_0F16_P_2,
1851   VEX_W_0F17_M_0,
1852   VEX_W_0F28,
1853   VEX_W_0F29,
1854   VEX_W_0F2B_M_0,
1855   VEX_W_0F2E_P_0,
1856   VEX_W_0F2E_P_2,
1857   VEX_W_0F2F_P_0,
1858   VEX_W_0F2F_P_2,
1859   VEX_W_0F41_P_0_LEN_1,
1860   VEX_W_0F41_P_2_LEN_1,
1861   VEX_W_0F42_P_0_LEN_1,
1862   VEX_W_0F42_P_2_LEN_1,
1863   VEX_W_0F44_P_0_LEN_0,
1864   VEX_W_0F44_P_2_LEN_0,
1865   VEX_W_0F45_P_0_LEN_1,
1866   VEX_W_0F45_P_2_LEN_1,
1867   VEX_W_0F46_P_0_LEN_1,
1868   VEX_W_0F46_P_2_LEN_1,
1869   VEX_W_0F47_P_0_LEN_1,
1870   VEX_W_0F47_P_2_LEN_1,
1871   VEX_W_0F4A_P_0_LEN_1,
1872   VEX_W_0F4A_P_2_LEN_1,
1873   VEX_W_0F4B_P_0_LEN_1,
1874   VEX_W_0F4B_P_2_LEN_1,
1875   VEX_W_0F50_M_0,
1876   VEX_W_0F51_P_0,
1877   VEX_W_0F51_P_1,
1878   VEX_W_0F51_P_2,
1879   VEX_W_0F51_P_3,
1880   VEX_W_0F52_P_0,
1881   VEX_W_0F52_P_1,
1882   VEX_W_0F53_P_0,
1883   VEX_W_0F53_P_1,
1884   VEX_W_0F58_P_0,
1885   VEX_W_0F58_P_1,
1886   VEX_W_0F58_P_2,
1887   VEX_W_0F58_P_3,
1888   VEX_W_0F59_P_0,
1889   VEX_W_0F59_P_1,
1890   VEX_W_0F59_P_2,
1891   VEX_W_0F59_P_3,
1892   VEX_W_0F5A_P_0,
1893   VEX_W_0F5A_P_1,
1894   VEX_W_0F5A_P_3,
1895   VEX_W_0F5B_P_0,
1896   VEX_W_0F5B_P_1,
1897   VEX_W_0F5B_P_2,
1898   VEX_W_0F5C_P_0,
1899   VEX_W_0F5C_P_1,
1900   VEX_W_0F5C_P_2,
1901   VEX_W_0F5C_P_3,
1902   VEX_W_0F5D_P_0,
1903   VEX_W_0F5D_P_1,
1904   VEX_W_0F5D_P_2,
1905   VEX_W_0F5D_P_3,
1906   VEX_W_0F5E_P_0,
1907   VEX_W_0F5E_P_1,
1908   VEX_W_0F5E_P_2,
1909   VEX_W_0F5E_P_3,
1910   VEX_W_0F5F_P_0,
1911   VEX_W_0F5F_P_1,
1912   VEX_W_0F5F_P_2,
1913   VEX_W_0F5F_P_3,
1914   VEX_W_0F60_P_2,
1915   VEX_W_0F61_P_2,
1916   VEX_W_0F62_P_2,
1917   VEX_W_0F63_P_2,
1918   VEX_W_0F64_P_2,
1919   VEX_W_0F65_P_2,
1920   VEX_W_0F66_P_2,
1921   VEX_W_0F67_P_2,
1922   VEX_W_0F68_P_2,
1923   VEX_W_0F69_P_2,
1924   VEX_W_0F6A_P_2,
1925   VEX_W_0F6B_P_2,
1926   VEX_W_0F6C_P_2,
1927   VEX_W_0F6D_P_2,
1928   VEX_W_0F6F_P_1,
1929   VEX_W_0F6F_P_2,
1930   VEX_W_0F70_P_1,
1931   VEX_W_0F70_P_2,
1932   VEX_W_0F70_P_3,
1933   VEX_W_0F71_R_2_P_2,
1934   VEX_W_0F71_R_4_P_2,
1935   VEX_W_0F71_R_6_P_2,
1936   VEX_W_0F72_R_2_P_2,
1937   VEX_W_0F72_R_4_P_2,
1938   VEX_W_0F72_R_6_P_2,
1939   VEX_W_0F73_R_2_P_2,
1940   VEX_W_0F73_R_3_P_2,
1941   VEX_W_0F73_R_6_P_2,
1942   VEX_W_0F73_R_7_P_2,
1943   VEX_W_0F74_P_2,
1944   VEX_W_0F75_P_2,
1945   VEX_W_0F76_P_2,
1946   VEX_W_0F77_P_0,
1947   VEX_W_0F7C_P_2,
1948   VEX_W_0F7C_P_3,
1949   VEX_W_0F7D_P_2,
1950   VEX_W_0F7D_P_3,
1951   VEX_W_0F7E_P_1,
1952   VEX_W_0F7F_P_1,
1953   VEX_W_0F7F_P_2,
1954   VEX_W_0F90_P_0_LEN_0,
1955   VEX_W_0F90_P_2_LEN_0,
1956   VEX_W_0F91_P_0_LEN_0,
1957   VEX_W_0F91_P_2_LEN_0,
1958   VEX_W_0F92_P_0_LEN_0,
1959   VEX_W_0F92_P_2_LEN_0,
1960   VEX_W_0F92_P_3_LEN_0,
1961   VEX_W_0F93_P_0_LEN_0,
1962   VEX_W_0F93_P_2_LEN_0,
1963   VEX_W_0F93_P_3_LEN_0,
1964   VEX_W_0F98_P_0_LEN_0,
1965   VEX_W_0F98_P_2_LEN_0,
1966   VEX_W_0F99_P_0_LEN_0,
1967   VEX_W_0F99_P_2_LEN_0,
1968   VEX_W_0FAE_R_2_M_0,
1969   VEX_W_0FAE_R_3_M_0,
1970   VEX_W_0FC2_P_0,
1971   VEX_W_0FC2_P_1,
1972   VEX_W_0FC2_P_2,
1973   VEX_W_0FC2_P_3,
1974   VEX_W_0FC4_P_2,
1975   VEX_W_0FC5_P_2,
1976   VEX_W_0FD0_P_2,
1977   VEX_W_0FD0_P_3,
1978   VEX_W_0FD1_P_2,
1979   VEX_W_0FD2_P_2,
1980   VEX_W_0FD3_P_2,
1981   VEX_W_0FD4_P_2,
1982   VEX_W_0FD5_P_2,
1983   VEX_W_0FD6_P_2,
1984   VEX_W_0FD7_P_2_M_1,
1985   VEX_W_0FD8_P_2,
1986   VEX_W_0FD9_P_2,
1987   VEX_W_0FDA_P_2,
1988   VEX_W_0FDB_P_2,
1989   VEX_W_0FDC_P_2,
1990   VEX_W_0FDD_P_2,
1991   VEX_W_0FDE_P_2,
1992   VEX_W_0FDF_P_2,
1993   VEX_W_0FE0_P_2,
1994   VEX_W_0FE1_P_2,
1995   VEX_W_0FE2_P_2,
1996   VEX_W_0FE3_P_2,
1997   VEX_W_0FE4_P_2,
1998   VEX_W_0FE5_P_2,
1999   VEX_W_0FE6_P_1,
2000   VEX_W_0FE6_P_2,
2001   VEX_W_0FE6_P_3,
2002   VEX_W_0FE7_P_2_M_0,
2003   VEX_W_0FE8_P_2,
2004   VEX_W_0FE9_P_2,
2005   VEX_W_0FEA_P_2,
2006   VEX_W_0FEB_P_2,
2007   VEX_W_0FEC_P_2,
2008   VEX_W_0FED_P_2,
2009   VEX_W_0FEE_P_2,
2010   VEX_W_0FEF_P_2,
2011   VEX_W_0FF0_P_3_M_0,
2012   VEX_W_0FF1_P_2,
2013   VEX_W_0FF2_P_2,
2014   VEX_W_0FF3_P_2,
2015   VEX_W_0FF4_P_2,
2016   VEX_W_0FF5_P_2,
2017   VEX_W_0FF6_P_2,
2018   VEX_W_0FF7_P_2,
2019   VEX_W_0FF8_P_2,
2020   VEX_W_0FF9_P_2,
2021   VEX_W_0FFA_P_2,
2022   VEX_W_0FFB_P_2,
2023   VEX_W_0FFC_P_2,
2024   VEX_W_0FFD_P_2,
2025   VEX_W_0FFE_P_2,
2026   VEX_W_0F3800_P_2,
2027   VEX_W_0F3801_P_2,
2028   VEX_W_0F3802_P_2,
2029   VEX_W_0F3803_P_2,
2030   VEX_W_0F3804_P_2,
2031   VEX_W_0F3805_P_2,
2032   VEX_W_0F3806_P_2,
2033   VEX_W_0F3807_P_2,
2034   VEX_W_0F3808_P_2,
2035   VEX_W_0F3809_P_2,
2036   VEX_W_0F380A_P_2,
2037   VEX_W_0F380B_P_2,
2038   VEX_W_0F380C_P_2,
2039   VEX_W_0F380D_P_2,
2040   VEX_W_0F380E_P_2,
2041   VEX_W_0F380F_P_2,
2042   VEX_W_0F3816_P_2,
2043   VEX_W_0F3817_P_2,
2044   VEX_W_0F3818_P_2,
2045   VEX_W_0F3819_P_2,
2046   VEX_W_0F381A_P_2_M_0,
2047   VEX_W_0F381C_P_2,
2048   VEX_W_0F381D_P_2,
2049   VEX_W_0F381E_P_2,
2050   VEX_W_0F3820_P_2,
2051   VEX_W_0F3821_P_2,
2052   VEX_W_0F3822_P_2,
2053   VEX_W_0F3823_P_2,
2054   VEX_W_0F3824_P_2,
2055   VEX_W_0F3825_P_2,
2056   VEX_W_0F3828_P_2,
2057   VEX_W_0F3829_P_2,
2058   VEX_W_0F382A_P_2_M_0,
2059   VEX_W_0F382B_P_2,
2060   VEX_W_0F382C_P_2_M_0,
2061   VEX_W_0F382D_P_2_M_0,
2062   VEX_W_0F382E_P_2_M_0,
2063   VEX_W_0F382F_P_2_M_0,
2064   VEX_W_0F3830_P_2,
2065   VEX_W_0F3831_P_2,
2066   VEX_W_0F3832_P_2,
2067   VEX_W_0F3833_P_2,
2068   VEX_W_0F3834_P_2,
2069   VEX_W_0F3835_P_2,
2070   VEX_W_0F3836_P_2,
2071   VEX_W_0F3837_P_2,
2072   VEX_W_0F3838_P_2,
2073   VEX_W_0F3839_P_2,
2074   VEX_W_0F383A_P_2,
2075   VEX_W_0F383B_P_2,
2076   VEX_W_0F383C_P_2,
2077   VEX_W_0F383D_P_2,
2078   VEX_W_0F383E_P_2,
2079   VEX_W_0F383F_P_2,
2080   VEX_W_0F3840_P_2,
2081   VEX_W_0F3841_P_2,
2082   VEX_W_0F3846_P_2,
2083   VEX_W_0F3858_P_2,
2084   VEX_W_0F3859_P_2,
2085   VEX_W_0F385A_P_2_M_0,
2086   VEX_W_0F3878_P_2,
2087   VEX_W_0F3879_P_2,
2088   VEX_W_0F38DB_P_2,
2089   VEX_W_0F38DC_P_2,
2090   VEX_W_0F38DD_P_2,
2091   VEX_W_0F38DE_P_2,
2092   VEX_W_0F38DF_P_2,
2093   VEX_W_0F3A00_P_2,
2094   VEX_W_0F3A01_P_2,
2095   VEX_W_0F3A02_P_2,
2096   VEX_W_0F3A04_P_2,
2097   VEX_W_0F3A05_P_2,
2098   VEX_W_0F3A06_P_2,
2099   VEX_W_0F3A08_P_2,
2100   VEX_W_0F3A09_P_2,
2101   VEX_W_0F3A0A_P_2,
2102   VEX_W_0F3A0B_P_2,
2103   VEX_W_0F3A0C_P_2,
2104   VEX_W_0F3A0D_P_2,
2105   VEX_W_0F3A0E_P_2,
2106   VEX_W_0F3A0F_P_2,
2107   VEX_W_0F3A14_P_2,
2108   VEX_W_0F3A15_P_2,
2109   VEX_W_0F3A18_P_2,
2110   VEX_W_0F3A19_P_2,
2111   VEX_W_0F3A20_P_2,
2112   VEX_W_0F3A21_P_2,
2113   VEX_W_0F3A30_P_2_LEN_0,
2114   VEX_W_0F3A31_P_2_LEN_0,
2115   VEX_W_0F3A32_P_2_LEN_0,
2116   VEX_W_0F3A33_P_2_LEN_0,
2117   VEX_W_0F3A38_P_2,
2118   VEX_W_0F3A39_P_2,
2119   VEX_W_0F3A40_P_2,
2120   VEX_W_0F3A41_P_2,
2121   VEX_W_0F3A42_P_2,
2122   VEX_W_0F3A44_P_2,
2123   VEX_W_0F3A46_P_2,
2124   VEX_W_0F3A48_P_2,
2125   VEX_W_0F3A49_P_2,
2126   VEX_W_0F3A4A_P_2,
2127   VEX_W_0F3A4B_P_2,
2128   VEX_W_0F3A4C_P_2,
2129   VEX_W_0F3A60_P_2,
2130   VEX_W_0F3A61_P_2,
2131   VEX_W_0F3A62_P_2,
2132   VEX_W_0F3A63_P_2,
2133   VEX_W_0F3ADF_P_2,
2134
2135   EVEX_W_0F10_P_0,
2136   EVEX_W_0F10_P_1_M_0,
2137   EVEX_W_0F10_P_1_M_1,
2138   EVEX_W_0F10_P_2,
2139   EVEX_W_0F10_P_3_M_0,
2140   EVEX_W_0F10_P_3_M_1,
2141   EVEX_W_0F11_P_0,
2142   EVEX_W_0F11_P_1_M_0,
2143   EVEX_W_0F11_P_1_M_1,
2144   EVEX_W_0F11_P_2,
2145   EVEX_W_0F11_P_3_M_0,
2146   EVEX_W_0F11_P_3_M_1,
2147   EVEX_W_0F12_P_0_M_0,
2148   EVEX_W_0F12_P_0_M_1,
2149   EVEX_W_0F12_P_1,
2150   EVEX_W_0F12_P_2,
2151   EVEX_W_0F12_P_3,
2152   EVEX_W_0F13_P_0,
2153   EVEX_W_0F13_P_2,
2154   EVEX_W_0F14_P_0,
2155   EVEX_W_0F14_P_2,
2156   EVEX_W_0F15_P_0,
2157   EVEX_W_0F15_P_2,
2158   EVEX_W_0F16_P_0_M_0,
2159   EVEX_W_0F16_P_0_M_1,
2160   EVEX_W_0F16_P_1,
2161   EVEX_W_0F16_P_2,
2162   EVEX_W_0F17_P_0,
2163   EVEX_W_0F17_P_2,
2164   EVEX_W_0F28_P_0,
2165   EVEX_W_0F28_P_2,
2166   EVEX_W_0F29_P_0,
2167   EVEX_W_0F29_P_2,
2168   EVEX_W_0F2A_P_1,
2169   EVEX_W_0F2A_P_3,
2170   EVEX_W_0F2B_P_0,
2171   EVEX_W_0F2B_P_2,
2172   EVEX_W_0F2E_P_0,
2173   EVEX_W_0F2E_P_2,
2174   EVEX_W_0F2F_P_0,
2175   EVEX_W_0F2F_P_2,
2176   EVEX_W_0F51_P_0,
2177   EVEX_W_0F51_P_1,
2178   EVEX_W_0F51_P_2,
2179   EVEX_W_0F51_P_3,
2180   EVEX_W_0F54_P_0,
2181   EVEX_W_0F54_P_2,
2182   EVEX_W_0F55_P_0,
2183   EVEX_W_0F55_P_2,
2184   EVEX_W_0F56_P_0,
2185   EVEX_W_0F56_P_2,
2186   EVEX_W_0F57_P_0,
2187   EVEX_W_0F57_P_2,
2188   EVEX_W_0F58_P_0,
2189   EVEX_W_0F58_P_1,
2190   EVEX_W_0F58_P_2,
2191   EVEX_W_0F58_P_3,
2192   EVEX_W_0F59_P_0,
2193   EVEX_W_0F59_P_1,
2194   EVEX_W_0F59_P_2,
2195   EVEX_W_0F59_P_3,
2196   EVEX_W_0F5A_P_0,
2197   EVEX_W_0F5A_P_1,
2198   EVEX_W_0F5A_P_2,
2199   EVEX_W_0F5A_P_3,
2200   EVEX_W_0F5B_P_0,
2201   EVEX_W_0F5B_P_1,
2202   EVEX_W_0F5B_P_2,
2203   EVEX_W_0F5C_P_0,
2204   EVEX_W_0F5C_P_1,
2205   EVEX_W_0F5C_P_2,
2206   EVEX_W_0F5C_P_3,
2207   EVEX_W_0F5D_P_0,
2208   EVEX_W_0F5D_P_1,
2209   EVEX_W_0F5D_P_2,
2210   EVEX_W_0F5D_P_3,
2211   EVEX_W_0F5E_P_0,
2212   EVEX_W_0F5E_P_1,
2213   EVEX_W_0F5E_P_2,
2214   EVEX_W_0F5E_P_3,
2215   EVEX_W_0F5F_P_0,
2216   EVEX_W_0F5F_P_1,
2217   EVEX_W_0F5F_P_2,
2218   EVEX_W_0F5F_P_3,
2219   EVEX_W_0F62_P_2,
2220   EVEX_W_0F66_P_2,
2221   EVEX_W_0F6A_P_2,
2222   EVEX_W_0F6B_P_2,
2223   EVEX_W_0F6C_P_2,
2224   EVEX_W_0F6D_P_2,
2225   EVEX_W_0F6E_P_2,
2226   EVEX_W_0F6F_P_1,
2227   EVEX_W_0F6F_P_2,
2228   EVEX_W_0F6F_P_3,
2229   EVEX_W_0F70_P_2,
2230   EVEX_W_0F72_R_2_P_2,
2231   EVEX_W_0F72_R_6_P_2,
2232   EVEX_W_0F73_R_2_P_2,
2233   EVEX_W_0F73_R_6_P_2,
2234   EVEX_W_0F76_P_2,
2235   EVEX_W_0F78_P_0,
2236   EVEX_W_0F78_P_2,
2237   EVEX_W_0F79_P_0,
2238   EVEX_W_0F79_P_2,
2239   EVEX_W_0F7A_P_1,
2240   EVEX_W_0F7A_P_2,
2241   EVEX_W_0F7A_P_3,
2242   EVEX_W_0F7B_P_1,
2243   EVEX_W_0F7B_P_2,
2244   EVEX_W_0F7B_P_3,
2245   EVEX_W_0F7E_P_1,
2246   EVEX_W_0F7E_P_2,
2247   EVEX_W_0F7F_P_1,
2248   EVEX_W_0F7F_P_2,
2249   EVEX_W_0F7F_P_3,
2250   EVEX_W_0FC2_P_0,
2251   EVEX_W_0FC2_P_1,
2252   EVEX_W_0FC2_P_2,
2253   EVEX_W_0FC2_P_3,
2254   EVEX_W_0FC6_P_0,
2255   EVEX_W_0FC6_P_2,
2256   EVEX_W_0FD2_P_2,
2257   EVEX_W_0FD3_P_2,
2258   EVEX_W_0FD4_P_2,
2259   EVEX_W_0FD6_P_2,
2260   EVEX_W_0FE6_P_1,
2261   EVEX_W_0FE6_P_2,
2262   EVEX_W_0FE6_P_3,
2263   EVEX_W_0FE7_P_2,
2264   EVEX_W_0FF2_P_2,
2265   EVEX_W_0FF3_P_2,
2266   EVEX_W_0FF4_P_2,
2267   EVEX_W_0FFA_P_2,
2268   EVEX_W_0FFB_P_2,
2269   EVEX_W_0FFE_P_2,
2270   EVEX_W_0F380C_P_2,
2271   EVEX_W_0F380D_P_2,
2272   EVEX_W_0F3810_P_1,
2273   EVEX_W_0F3810_P_2,
2274   EVEX_W_0F3811_P_1,
2275   EVEX_W_0F3811_P_2,
2276   EVEX_W_0F3812_P_1,
2277   EVEX_W_0F3812_P_2,
2278   EVEX_W_0F3813_P_1,
2279   EVEX_W_0F3813_P_2,
2280   EVEX_W_0F3814_P_1,
2281   EVEX_W_0F3815_P_1,
2282   EVEX_W_0F3818_P_2,
2283   EVEX_W_0F3819_P_2,
2284   EVEX_W_0F381A_P_2,
2285   EVEX_W_0F381B_P_2,
2286   EVEX_W_0F381E_P_2,
2287   EVEX_W_0F381F_P_2,
2288   EVEX_W_0F3820_P_1,
2289   EVEX_W_0F3821_P_1,
2290   EVEX_W_0F3822_P_1,
2291   EVEX_W_0F3823_P_1,
2292   EVEX_W_0F3824_P_1,
2293   EVEX_W_0F3825_P_1,
2294   EVEX_W_0F3825_P_2,
2295   EVEX_W_0F3826_P_1,
2296   EVEX_W_0F3826_P_2,
2297   EVEX_W_0F3828_P_1,
2298   EVEX_W_0F3828_P_2,
2299   EVEX_W_0F3829_P_1,
2300   EVEX_W_0F3829_P_2,
2301   EVEX_W_0F382A_P_1,
2302   EVEX_W_0F382A_P_2,
2303   EVEX_W_0F382B_P_2,
2304   EVEX_W_0F3830_P_1,
2305   EVEX_W_0F3831_P_1,
2306   EVEX_W_0F3832_P_1,
2307   EVEX_W_0F3833_P_1,
2308   EVEX_W_0F3834_P_1,
2309   EVEX_W_0F3835_P_1,
2310   EVEX_W_0F3835_P_2,
2311   EVEX_W_0F3837_P_2,
2312   EVEX_W_0F3838_P_1,
2313   EVEX_W_0F3839_P_1,
2314   EVEX_W_0F383A_P_1,
2315   EVEX_W_0F3840_P_2,
2316   EVEX_W_0F3858_P_2,
2317   EVEX_W_0F3859_P_2,
2318   EVEX_W_0F385A_P_2,
2319   EVEX_W_0F385B_P_2,
2320   EVEX_W_0F3866_P_2,
2321   EVEX_W_0F3875_P_2,
2322   EVEX_W_0F3878_P_2,
2323   EVEX_W_0F3879_P_2,
2324   EVEX_W_0F387A_P_2,
2325   EVEX_W_0F387B_P_2,
2326   EVEX_W_0F387D_P_2,
2327   EVEX_W_0F3883_P_2,
2328   EVEX_W_0F388D_P_2,
2329   EVEX_W_0F3891_P_2,
2330   EVEX_W_0F3893_P_2,
2331   EVEX_W_0F38A1_P_2,
2332   EVEX_W_0F38A3_P_2,
2333   EVEX_W_0F38C7_R_1_P_2,
2334   EVEX_W_0F38C7_R_2_P_2,
2335   EVEX_W_0F38C7_R_5_P_2,
2336   EVEX_W_0F38C7_R_6_P_2,
2337
2338   EVEX_W_0F3A00_P_2,
2339   EVEX_W_0F3A01_P_2,
2340   EVEX_W_0F3A04_P_2,
2341   EVEX_W_0F3A05_P_2,
2342   EVEX_W_0F3A08_P_2,
2343   EVEX_W_0F3A09_P_2,
2344   EVEX_W_0F3A0A_P_2,
2345   EVEX_W_0F3A0B_P_2,
2346   EVEX_W_0F3A16_P_2,
2347   EVEX_W_0F3A18_P_2,
2348   EVEX_W_0F3A19_P_2,
2349   EVEX_W_0F3A1A_P_2,
2350   EVEX_W_0F3A1B_P_2,
2351   EVEX_W_0F3A1D_P_2,
2352   EVEX_W_0F3A21_P_2,
2353   EVEX_W_0F3A22_P_2,
2354   EVEX_W_0F3A23_P_2,
2355   EVEX_W_0F3A38_P_2,
2356   EVEX_W_0F3A39_P_2,
2357   EVEX_W_0F3A3A_P_2,
2358   EVEX_W_0F3A3B_P_2,
2359   EVEX_W_0F3A3E_P_2,
2360   EVEX_W_0F3A3F_P_2,
2361   EVEX_W_0F3A42_P_2,
2362   EVEX_W_0F3A43_P_2,
2363   EVEX_W_0F3A50_P_2,
2364   EVEX_W_0F3A51_P_2,
2365   EVEX_W_0F3A56_P_2,
2366   EVEX_W_0F3A57_P_2,
2367   EVEX_W_0F3A66_P_2,
2368   EVEX_W_0F3A67_P_2
2369 };
2370
2371 typedef void (*op_rtn) (int bytemode, int sizeflag);
2372
2373 struct dis386 {
2374   const char *name;
2375   struct
2376     {
2377       op_rtn rtn;
2378       int bytemode;
2379     } op[MAX_OPERANDS];
2380   unsigned int prefix_requirement;
2381 };
2382
2383 /* Upper case letters in the instruction names here are macros.
2384    'A' => print 'b' if no register operands or suffix_always is true
2385    'B' => print 'b' if suffix_always is true
2386    'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
2387           size prefix
2388    'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
2389           suffix_always is true
2390    'E' => print 'e' if 32-bit form of jcxz
2391    'F' => print 'w' or 'l' depending on address size prefix (loop insns)
2392    'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
2393    'H' => print ",pt" or ",pn" branch hint
2394    'I' => honor following macro letter even in Intel mode (implemented only
2395           for some of the macro letters)
2396    'J' => print 'l'
2397    'K' => print 'd' or 'q' if rex prefix is present.
2398    'L' => print 'l' if suffix_always is true
2399    'M' => print 'r' if intel_mnemonic is false.
2400    'N' => print 'n' if instruction has no wait "prefix"
2401    'O' => print 'd' or 'o' (or 'q' in Intel mode)
2402    'P' => print 'w', 'l' or 'q' if instruction has an operand size prefix,
2403           or suffix_always is true.  print 'q' if rex prefix is present.
2404    'Q' => print 'w', 'l' or 'q' for memory operand or suffix_always
2405           is true
2406    'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
2407    'S' => print 'w', 'l' or 'q' if suffix_always is true
2408    'T' => print 'q' in 64bit mode and behave as 'P' otherwise
2409    'U' => print 'q' in 64bit mode and behave as 'Q' otherwise
2410    'V' => print 'q' in 64bit mode and behave as 'S' otherwise
2411    'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
2412    'X' => print 's', 'd' depending on data16 prefix (for XMM)
2413    'Y' => 'q' if instruction has an REX 64bit overwrite prefix and
2414           suffix_always is true.
2415    'Z' => print 'q' in 64bit mode and behave as 'L' otherwise
2416    '!' => change condition from true to false or from false to true.
2417    '%' => add 1 upper case letter to the macro.
2418
2419    2 upper case letter macros:
2420    "XY" => print 'x' or 'y' if no register operands or suffix_always
2421            is true.
2422    "XW" => print 's', 'd' depending on the VEX.W bit (for FMA)
2423    "LQ" => print 'l' ('d' in Intel mode) or 'q' for memory operand
2424            or suffix_always is true
2425    "LB" => print "abs" in 64bit mode and behave as 'B' otherwise
2426    "LS" => print "abs" in 64bit mode and behave as 'S' otherwise
2427    "LV" => print "abs" for 64bit operand and behave as 'S' otherwise
2428    "LW" => print 'd', 'q' depending on the VEX.W bit
2429    "LP" => print 'w' or 'l' ('d' in Intel mode) if instruction has
2430            an operand size prefix, or suffix_always is true.  print
2431            'q' if rex prefix is present.
2432
2433    Many of the above letters print nothing in Intel mode.  See "putop"
2434    for the details.
2435
2436    Braces '{' and '}', and vertical bars '|', indicate alternative
2437    mnemonic strings for AT&T and Intel.  */
2438
2439 static const struct dis386 dis386[] = {
2440   /* 00 */
2441   { "addB",             { Ebh1, Gb }, 0 },
2442   { "addS",             { Evh1, Gv }, 0 },
2443   { "addB",             { Gb, EbS }, 0 },
2444   { "addS",             { Gv, EvS }, 0 },
2445   { "addB",             { AL, Ib }, 0 },
2446   { "addS",             { eAX, Iv }, 0 },
2447   { X86_64_TABLE (X86_64_06) },
2448   { X86_64_TABLE (X86_64_07) },
2449   /* 08 */
2450   { "orB",              { Ebh1, Gb }, 0 },
2451   { "orS",              { Evh1, Gv }, 0 },
2452   { "orB",              { Gb, EbS }, 0 },
2453   { "orS",              { Gv, EvS }, 0 },
2454   { "orB",              { AL, Ib }, 0 },
2455   { "orS",              { eAX, Iv }, 0 },
2456   { X86_64_TABLE (X86_64_0D) },
2457   { Bad_Opcode },       /* 0x0f extended opcode escape */
2458   /* 10 */
2459   { "adcB",             { Ebh1, Gb }, 0 },
2460   { "adcS",             { Evh1, Gv }, 0 },
2461   { "adcB",             { Gb, EbS }, 0 },
2462   { "adcS",             { Gv, EvS }, 0 },
2463   { "adcB",             { AL, Ib }, 0 },
2464   { "adcS",             { eAX, Iv }, 0 },
2465   { X86_64_TABLE (X86_64_16) },
2466   { X86_64_TABLE (X86_64_17) },
2467   /* 18 */
2468   { "sbbB",             { Ebh1, Gb }, 0 },
2469   { "sbbS",             { Evh1, Gv }, 0 },
2470   { "sbbB",             { Gb, EbS }, 0 },
2471   { "sbbS",             { Gv, EvS }, 0 },
2472   { "sbbB",             { AL, Ib }, 0 },
2473   { "sbbS",             { eAX, Iv }, 0 },
2474   { X86_64_TABLE (X86_64_1E) },
2475   { X86_64_TABLE (X86_64_1F) },
2476   /* 20 */
2477   { "andB",             { Ebh1, Gb }, 0 },
2478   { "andS",             { Evh1, Gv }, 0 },
2479   { "andB",             { Gb, EbS }, 0 },
2480   { "andS",             { Gv, EvS }, 0 },
2481   { "andB",             { AL, Ib }, 0 },
2482   { "andS",             { eAX, Iv }, 0 },
2483   { Bad_Opcode },       /* SEG ES prefix */
2484   { X86_64_TABLE (X86_64_27) },
2485   /* 28 */
2486   { "subB",             { Ebh1, Gb }, 0 },
2487   { "subS",             { Evh1, Gv }, 0 },
2488   { "subB",             { Gb, EbS }, 0 },
2489   { "subS",             { Gv, EvS }, 0 },
2490   { "subB",             { AL, Ib }, 0 },
2491   { "subS",             { eAX, Iv }, 0 },
2492   { Bad_Opcode },       /* SEG CS prefix */
2493   { X86_64_TABLE (X86_64_2F) },
2494   /* 30 */
2495   { "xorB",             { Ebh1, Gb }, 0 },
2496   { "xorS",             { Evh1, Gv }, 0 },
2497   { "xorB",             { Gb, EbS }, 0 },
2498   { "xorS",             { Gv, EvS }, 0 },
2499   { "xorB",             { AL, Ib }, 0 },
2500   { "xorS",             { eAX, Iv }, 0 },
2501   { Bad_Opcode },       /* SEG SS prefix */
2502   { X86_64_TABLE (X86_64_37) },
2503   /* 38 */
2504   { "cmpB",             { Eb, Gb }, 0 },
2505   { "cmpS",             { Ev, Gv }, 0 },
2506   { "cmpB",             { Gb, EbS }, 0 },
2507   { "cmpS",             { Gv, EvS }, 0 },
2508   { "cmpB",             { AL, Ib }, 0 },
2509   { "cmpS",             { eAX, Iv }, 0 },
2510   { Bad_Opcode },       /* SEG DS prefix */
2511   { X86_64_TABLE (X86_64_3F) },
2512   /* 40 */
2513   { "inc{S|}",          { RMeAX }, 0 },
2514   { "inc{S|}",          { RMeCX }, 0 },
2515   { "inc{S|}",          { RMeDX }, 0 },
2516   { "inc{S|}",          { RMeBX }, 0 },
2517   { "inc{S|}",          { RMeSP }, 0 },
2518   { "inc{S|}",          { RMeBP }, 0 },
2519   { "inc{S|}",          { RMeSI }, 0 },
2520   { "inc{S|}",          { RMeDI }, 0 },
2521   /* 48 */
2522   { "dec{S|}",          { RMeAX }, 0 },
2523   { "dec{S|}",          { RMeCX }, 0 },
2524   { "dec{S|}",          { RMeDX }, 0 },
2525   { "dec{S|}",          { RMeBX }, 0 },
2526   { "dec{S|}",          { RMeSP }, 0 },
2527   { "dec{S|}",          { RMeBP }, 0 },
2528   { "dec{S|}",          { RMeSI }, 0 },
2529   { "dec{S|}",          { RMeDI }, 0 },
2530   /* 50 */
2531   { "pushV",            { RMrAX }, 0 },
2532   { "pushV",            { RMrCX }, 0 },
2533   { "pushV",            { RMrDX }, 0 },
2534   { "pushV",            { RMrBX }, 0 },
2535   { "pushV",            { RMrSP }, 0 },
2536   { "pushV",            { RMrBP }, 0 },
2537   { "pushV",            { RMrSI }, 0 },
2538   { "pushV",            { RMrDI }, 0 },
2539   /* 58 */
2540   { "popV",             { RMrAX }, 0 },
2541   { "popV",             { RMrCX }, 0 },
2542   { "popV",             { RMrDX }, 0 },
2543   { "popV",             { RMrBX }, 0 },
2544   { "popV",             { RMrSP }, 0 },
2545   { "popV",             { RMrBP }, 0 },
2546   { "popV",             { RMrSI }, 0 },
2547   { "popV",             { RMrDI }, 0 },
2548   /* 60 */
2549   { X86_64_TABLE (X86_64_60) },
2550   { X86_64_TABLE (X86_64_61) },
2551   { X86_64_TABLE (X86_64_62) },
2552   { X86_64_TABLE (X86_64_63) },
2553   { Bad_Opcode },       /* seg fs */
2554   { Bad_Opcode },       /* seg gs */
2555   { Bad_Opcode },       /* op size prefix */
2556   { Bad_Opcode },       /* adr size prefix */
2557   /* 68 */
2558   { "pushT",            { sIv }, 0 },
2559   { "imulS",            { Gv, Ev, Iv }, 0 },
2560   { "pushT",            { sIbT }, 0 },
2561   { "imulS",            { Gv, Ev, sIb }, 0 },
2562   { "ins{b|}",          { Ybr, indirDX }, 0 },
2563   { X86_64_TABLE (X86_64_6D) },
2564   { "outs{b|}",         { indirDXr, Xb }, 0 },
2565   { X86_64_TABLE (X86_64_6F) },
2566   /* 70 */
2567   { "joH",              { Jb, BND, cond_jump_flag }, 0 },
2568   { "jnoH",             { Jb, BND, cond_jump_flag }, 0 },
2569   { "jbH",              { Jb, BND, cond_jump_flag }, 0 },
2570   { "jaeH",             { Jb, BND, cond_jump_flag }, 0 },
2571   { "jeH",              { Jb, BND, cond_jump_flag }, 0 },
2572   { "jneH",             { Jb, BND, cond_jump_flag }, 0 },
2573   { "jbeH",             { Jb, BND, cond_jump_flag }, 0 },
2574   { "jaH",              { Jb, BND, cond_jump_flag }, 0 },
2575   /* 78 */
2576   { "jsH",              { Jb, BND, cond_jump_flag }, 0 },
2577   { "jnsH",             { Jb, BND, cond_jump_flag }, 0 },
2578   { "jpH",              { Jb, BND, cond_jump_flag }, 0 },
2579   { "jnpH",             { Jb, BND, cond_jump_flag }, 0 },
2580   { "jlH",              { Jb, BND, cond_jump_flag }, 0 },
2581   { "jgeH",             { Jb, BND, cond_jump_flag }, 0 },
2582   { "jleH",             { Jb, BND, cond_jump_flag }, 0 },
2583   { "jgH",              { Jb, BND, cond_jump_flag }, 0 },
2584   /* 80 */
2585   { REG_TABLE (REG_80) },
2586   { REG_TABLE (REG_81) },
2587   { Bad_Opcode },
2588   { REG_TABLE (REG_82) },
2589   { "testB",            { Eb, Gb }, 0 },
2590   { "testS",            { Ev, Gv }, 0 },
2591   { "xchgB",            { Ebh2, Gb }, 0 },
2592   { "xchgS",            { Evh2, Gv }, 0 },
2593   /* 88 */
2594   { "movB",             { Ebh3, Gb }, 0 },
2595   { "movS",             { Evh3, Gv }, 0 },
2596   { "movB",             { Gb, EbS }, 0 },
2597   { "movS",             { Gv, EvS }, 0 },
2598   { "movD",             { Sv, Sw }, 0 },
2599   { MOD_TABLE (MOD_8D) },
2600   { "movD",             { Sw, Sv }, 0 },
2601   { REG_TABLE (REG_8F) },
2602   /* 90 */
2603   { PREFIX_TABLE (PREFIX_90) },
2604   { "xchgS",            { RMeCX, eAX }, 0 },
2605   { "xchgS",            { RMeDX, eAX }, 0 },
2606   { "xchgS",            { RMeBX, eAX }, 0 },
2607   { "xchgS",            { RMeSP, eAX }, 0 },
2608   { "xchgS",            { RMeBP, eAX }, 0 },
2609   { "xchgS",            { RMeSI, eAX }, 0 },
2610   { "xchgS",            { RMeDI, eAX }, 0 },
2611   /* 98 */
2612   { "cW{t|}R",          { XX }, 0 },
2613   { "cR{t|}O",          { XX }, 0 },
2614   { X86_64_TABLE (X86_64_9A) },
2615   { Bad_Opcode },       /* fwait */
2616   { "pushfT",           { XX }, 0 },
2617   { "popfT",            { XX }, 0 },
2618   { "sahf",             { XX }, 0 },
2619   { "lahf",             { XX }, 0 },
2620   /* a0 */
2621   { "mov%LB",           { AL, Ob }, 0 },
2622   { "mov%LS",           { eAX, Ov }, 0 },
2623   { "mov%LB",           { Ob, AL }, 0 },
2624   { "mov%LS",           { Ov, eAX }, 0 },
2625   { "movs{b|}",         { Ybr, Xb }, 0 },
2626   { "movs{R|}",         { Yvr, Xv }, 0 },
2627   { "cmps{b|}",         { Xb, Yb }, 0 },
2628   { "cmps{R|}",         { Xv, Yv }, 0 },
2629   /* a8 */
2630   { "testB",            { AL, Ib }, 0 },
2631   { "testS",            { eAX, Iv }, 0 },
2632   { "stosB",            { Ybr, AL }, 0 },
2633   { "stosS",            { Yvr, eAX }, 0 },
2634   { "lodsB",            { ALr, Xb }, 0 },
2635   { "lodsS",            { eAXr, Xv }, 0 },
2636   { "scasB",            { AL, Yb }, 0 },
2637   { "scasS",            { eAX, Yv }, 0 },
2638   /* b0 */
2639   { "movB",             { RMAL, Ib }, 0 },
2640   { "movB",             { RMCL, Ib }, 0 },
2641   { "movB",             { RMDL, Ib }, 0 },
2642   { "movB",             { RMBL, Ib }, 0 },
2643   { "movB",             { RMAH, Ib }, 0 },
2644   { "movB",             { RMCH, Ib }, 0 },
2645   { "movB",             { RMDH, Ib }, 0 },
2646   { "movB",             { RMBH, Ib }, 0 },
2647   /* b8 */
2648   { "mov%LV",           { RMeAX, Iv64 }, 0 },
2649   { "mov%LV",           { RMeCX, Iv64 }, 0 },
2650   { "mov%LV",           { RMeDX, Iv64 }, 0 },
2651   { "mov%LV",           { RMeBX, Iv64 }, 0 },
2652   { "mov%LV",           { RMeSP, Iv64 }, 0 },
2653   { "mov%LV",           { RMeBP, Iv64 }, 0 },
2654   { "mov%LV",           { RMeSI, Iv64 }, 0 },
2655   { "mov%LV",           { RMeDI, Iv64 }, 0 },
2656   /* c0 */
2657   { REG_TABLE (REG_C0) },
2658   { REG_TABLE (REG_C1) },
2659   { "retT",             { Iw, BND }, 0 },
2660   { "retT",             { BND }, 0 },
2661   { X86_64_TABLE (X86_64_C4) },
2662   { X86_64_TABLE (X86_64_C5) },
2663   { REG_TABLE (REG_C6) },
2664   { REG_TABLE (REG_C7) },
2665   /* c8 */
2666   { "enterT",           { Iw, Ib }, 0 },
2667   { "leaveT",           { XX }, 0 },
2668   { "Jret{|f}P",        { Iw }, 0 },
2669   { "Jret{|f}P",        { XX }, 0 },
2670   { "int3",             { XX }, 0 },
2671   { "int",              { Ib }, 0 },
2672   { X86_64_TABLE (X86_64_CE) },
2673   { "iret%LP",          { XX }, 0 },
2674   /* d0 */
2675   { REG_TABLE (REG_D0) },
2676   { REG_TABLE (REG_D1) },
2677   { REG_TABLE (REG_D2) },
2678   { REG_TABLE (REG_D3) },
2679   { X86_64_TABLE (X86_64_D4) },
2680   { X86_64_TABLE (X86_64_D5) },
2681   { Bad_Opcode },
2682   { "xlat",             { DSBX }, 0 },
2683   /* d8 */
2684   { FLOAT },
2685   { FLOAT },
2686   { FLOAT },
2687   { FLOAT },
2688   { FLOAT },
2689   { FLOAT },
2690   { FLOAT },
2691   { FLOAT },
2692   /* e0 */
2693   { "loopneFH",         { Jb, XX, loop_jcxz_flag }, 0 },
2694   { "loopeFH",          { Jb, XX, loop_jcxz_flag }, 0 },
2695   { "loopFH",           { Jb, XX, loop_jcxz_flag }, 0 },
2696   { "jEcxzH",           { Jb, XX, loop_jcxz_flag }, 0 },
2697   { "inB",              { AL, Ib }, 0 },
2698   { "inG",              { zAX, Ib }, 0 },
2699   { "outB",             { Ib, AL }, 0 },
2700   { "outG",             { Ib, zAX }, 0 },
2701   /* e8 */
2702   { "callT",            { Jv, BND }, 0 },
2703   { "jmpT",             { Jv, BND }, 0 },
2704   { X86_64_TABLE (X86_64_EA) },
2705   { "jmp",              { Jb, BND }, 0 },
2706   { "inB",              { AL, indirDX }, 0 },
2707   { "inG",              { zAX, indirDX }, 0 },
2708   { "outB",             { indirDX, AL }, 0 },
2709   { "outG",             { indirDX, zAX }, 0 },
2710   /* f0 */
2711   { Bad_Opcode },       /* lock prefix */
2712   { "icebp",            { XX }, 0 },
2713   { Bad_Opcode },       /* repne */
2714   { Bad_Opcode },       /* repz */
2715   { "hlt",              { XX }, 0 },
2716   { "cmc",              { XX }, 0 },
2717   { REG_TABLE (REG_F6) },
2718   { REG_TABLE (REG_F7) },
2719   /* f8 */
2720   { "clc",              { XX }, 0 },
2721   { "stc",              { XX }, 0 },
2722   { "cli",              { XX }, 0 },
2723   { "sti",              { XX }, 0 },
2724   { "cld",              { XX }, 0 },
2725   { "std",              { XX }, 0 },
2726   { REG_TABLE (REG_FE) },
2727   { REG_TABLE (REG_FF) },
2728 };
2729
2730 static const struct dis386 dis386_twobyte[] = {
2731   /* 00 */
2732   { REG_TABLE (REG_0F00 ) },
2733   { REG_TABLE (REG_0F01 ) },
2734   { "larS",             { Gv, Ew }, 0 },
2735   { "lslS",             { Gv, Ew }, 0 },
2736   { Bad_Opcode },
2737   { "syscall",          { XX }, 0 },
2738   { "clts",             { XX }, 0 },
2739   { "sysret%LP",                { XX }, 0 },
2740   /* 08 */
2741   { "invd",             { XX }, 0 },
2742   { "wbinvd",           { XX }, 0 },
2743   { Bad_Opcode },
2744   { "ud2",              { XX }, 0 },
2745   { Bad_Opcode },
2746   { REG_TABLE (REG_0F0D) },
2747   { "femms",            { XX }, 0 },
2748   { "",                 { MX, EM, OPSUF }, 0 }, /* See OP_3DNowSuffix.  */
2749   /* 10 */
2750   { PREFIX_TABLE (PREFIX_0F10) },
2751   { PREFIX_TABLE (PREFIX_0F11) },
2752   { PREFIX_TABLE (PREFIX_0F12) },
2753   { MOD_TABLE (MOD_0F13) },
2754   { "unpcklpX",         { XM, EXx }, PREFIX_OPCODE },
2755   { "unpckhpX",         { XM, EXx }, PREFIX_OPCODE },
2756   { PREFIX_TABLE (PREFIX_0F16) },
2757   { MOD_TABLE (MOD_0F17) },
2758   /* 18 */
2759   { REG_TABLE (REG_0F18) },
2760   { "nopQ",             { Ev }, 0 },
2761   { PREFIX_TABLE (PREFIX_0F1A) },
2762   { PREFIX_TABLE (PREFIX_0F1B) },
2763   { "nopQ",             { Ev }, 0 },
2764   { "nopQ",             { Ev }, 0 },
2765   { "nopQ",             { Ev }, 0 },
2766   { "nopQ",             { Ev }, 0 },
2767   /* 20 */
2768   { "movZ",             { Rm, Cm }, 0 },
2769   { "movZ",             { Rm, Dm }, 0 },
2770   { "movZ",             { Cm, Rm }, 0 },
2771   { "movZ",             { Dm, Rm }, 0 },
2772   { MOD_TABLE (MOD_0F24) },
2773   { Bad_Opcode },
2774   { MOD_TABLE (MOD_0F26) },
2775   { Bad_Opcode },
2776   /* 28 */
2777   { "movapX",           { XM, EXx }, PREFIX_OPCODE },
2778   { "movapX",           { EXxS, XM }, PREFIX_OPCODE },
2779   { PREFIX_TABLE (PREFIX_0F2A) },
2780   { PREFIX_TABLE (PREFIX_0F2B) },
2781   { PREFIX_TABLE (PREFIX_0F2C) },
2782   { PREFIX_TABLE (PREFIX_0F2D) },
2783   { PREFIX_TABLE (PREFIX_0F2E) },
2784   { PREFIX_TABLE (PREFIX_0F2F) },
2785   /* 30 */
2786   { "wrmsr",            { XX }, 0 },
2787   { "rdtsc",            { XX }, 0 },
2788   { "rdmsr",            { XX }, 0 },
2789   { "rdpmc",            { XX }, 0 },
2790   { "sysenter",         { XX }, 0 },
2791   { "sysexit",          { XX }, 0 },
2792   { Bad_Opcode },
2793   { "getsec",           { XX }, 0 },
2794   /* 38 */
2795   { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F38, PREFIX_OPCODE) },
2796   { Bad_Opcode },
2797   { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F3A, PREFIX_OPCODE) },
2798   { Bad_Opcode },
2799   { Bad_Opcode },
2800   { Bad_Opcode },
2801   { Bad_Opcode },
2802   { Bad_Opcode },
2803   /* 40 */
2804   { "cmovoS",           { Gv, Ev }, 0 },
2805   { "cmovnoS",          { Gv, Ev }, 0 },
2806   { "cmovbS",           { Gv, Ev }, 0 },
2807   { "cmovaeS",          { Gv, Ev }, 0 },
2808   { "cmoveS",           { Gv, Ev }, 0 },
2809   { "cmovneS",          { Gv, Ev }, 0 },
2810   { "cmovbeS",          { Gv, Ev }, 0 },
2811   { "cmovaS",           { Gv, Ev }, 0 },
2812   /* 48 */
2813   { "cmovsS",           { Gv, Ev }, 0 },
2814   { "cmovnsS",          { Gv, Ev }, 0 },
2815   { "cmovpS",           { Gv, Ev }, 0 },
2816   { "cmovnpS",          { Gv, Ev }, 0 },
2817   { "cmovlS",           { Gv, Ev }, 0 },
2818   { "cmovgeS",          { Gv, Ev }, 0 },
2819   { "cmovleS",          { Gv, Ev }, 0 },
2820   { "cmovgS",           { Gv, Ev }, 0 },
2821   /* 50 */
2822   { MOD_TABLE (MOD_0F51) },
2823   { PREFIX_TABLE (PREFIX_0F51) },
2824   { PREFIX_TABLE (PREFIX_0F52) },
2825   { PREFIX_TABLE (PREFIX_0F53) },
2826   { "andpX",            { XM, EXx }, PREFIX_OPCODE },
2827   { "andnpX",           { XM, EXx }, PREFIX_OPCODE },
2828   { "orpX",             { XM, EXx }, PREFIX_OPCODE },
2829   { "xorpX",            { XM, EXx }, PREFIX_OPCODE },
2830   /* 58 */
2831   { PREFIX_TABLE (PREFIX_0F58) },
2832   { PREFIX_TABLE (PREFIX_0F59) },
2833   { PREFIX_TABLE (PREFIX_0F5A) },
2834   { PREFIX_TABLE (PREFIX_0F5B) },
2835   { PREFIX_TABLE (PREFIX_0F5C) },
2836   { PREFIX_TABLE (PREFIX_0F5D) },
2837   { PREFIX_TABLE (PREFIX_0F5E) },
2838   { PREFIX_TABLE (PREFIX_0F5F) },
2839   /* 60 */
2840   { PREFIX_TABLE (PREFIX_0F60) },
2841   { PREFIX_TABLE (PREFIX_0F61) },
2842   { PREFIX_TABLE (PREFIX_0F62) },
2843   { "packsswb",         { MX, EM }, PREFIX_OPCODE },
2844   { "pcmpgtb",          { MX, EM }, PREFIX_OPCODE },
2845   { "pcmpgtw",          { MX, EM }, PREFIX_OPCODE },
2846   { "pcmpgtd",          { MX, EM }, PREFIX_OPCODE },
2847   { "packuswb",         { MX, EM }, PREFIX_OPCODE },
2848   /* 68 */
2849   { "punpckhbw",        { MX, EM }, PREFIX_OPCODE },
2850   { "punpckhwd",        { MX, EM }, PREFIX_OPCODE },
2851   { "punpckhdq",        { MX, EM }, PREFIX_OPCODE },
2852   { "packssdw",         { MX, EM }, PREFIX_OPCODE },
2853   { PREFIX_TABLE (PREFIX_0F6C) },
2854   { PREFIX_TABLE (PREFIX_0F6D) },
2855   { "movK",             { MX, Edq }, PREFIX_OPCODE },
2856   { PREFIX_TABLE (PREFIX_0F6F) },
2857   /* 70 */
2858   { PREFIX_TABLE (PREFIX_0F70) },
2859   { REG_TABLE (REG_0F71) },
2860   { REG_TABLE (REG_0F72) },
2861   { REG_TABLE (REG_0F73) },
2862   { "pcmpeqb",          { MX, EM }, PREFIX_OPCODE },
2863   { "pcmpeqw",          { MX, EM }, PREFIX_OPCODE },
2864   { "pcmpeqd",          { MX, EM }, PREFIX_OPCODE },
2865   { "emms",             { XX }, PREFIX_OPCODE },
2866   /* 78 */
2867   { PREFIX_TABLE (PREFIX_0F78) },
2868   { PREFIX_TABLE (PREFIX_0F79) },
2869   { THREE_BYTE_TABLE (THREE_BYTE_0F7A) },
2870   { Bad_Opcode },
2871   { PREFIX_TABLE (PREFIX_0F7C) },
2872   { PREFIX_TABLE (PREFIX_0F7D) },
2873   { PREFIX_TABLE (PREFIX_0F7E) },
2874   { PREFIX_TABLE (PREFIX_0F7F) },
2875   /* 80 */
2876   { "joH",              { Jv, BND, cond_jump_flag }, 0 },
2877   { "jnoH",             { Jv, BND, cond_jump_flag }, 0 },
2878   { "jbH",              { Jv, BND, cond_jump_flag }, 0 },
2879   { "jaeH",             { Jv, BND, cond_jump_flag }, 0 },
2880   { "jeH",              { Jv, BND, cond_jump_flag }, 0 },
2881   { "jneH",             { Jv, BND, cond_jump_flag }, 0 },
2882   { "jbeH",             { Jv, BND, cond_jump_flag }, 0 },
2883   { "jaH",              { Jv, BND, cond_jump_flag }, 0 },
2884   /* 88 */
2885   { "jsH",              { Jv, BND, cond_jump_flag }, 0 },
2886   { "jnsH",             { Jv, BND, cond_jump_flag }, 0 },
2887   { "jpH",              { Jv, BND, cond_jump_flag }, 0 },
2888   { "jnpH",             { Jv, BND, cond_jump_flag }, 0 },
2889   { "jlH",              { Jv, BND, cond_jump_flag }, 0 },
2890   { "jgeH",             { Jv, BND, cond_jump_flag }, 0 },
2891   { "jleH",             { Jv, BND, cond_jump_flag }, 0 },
2892   { "jgH",              { Jv, BND, cond_jump_flag }, 0 },
2893   /* 90 */
2894   { "seto",             { Eb }, 0 },
2895   { "setno",            { Eb }, 0 },
2896   { "setb",             { Eb }, 0 },
2897   { "setae",            { Eb }, 0 },
2898   { "sete",             { Eb }, 0 },
2899   { "setne",            { Eb }, 0 },
2900   { "setbe",            { Eb }, 0 },
2901   { "seta",             { Eb }, 0 },
2902   /* 98 */
2903   { "sets",             { Eb }, 0 },
2904   { "setns",            { Eb }, 0 },
2905   { "setp",             { Eb }, 0 },
2906   { "setnp",            { Eb }, 0 },
2907   { "setl",             { Eb }, 0 },
2908   { "setge",            { Eb }, 0 },
2909   { "setle",            { Eb }, 0 },
2910   { "setg",             { Eb }, 0 },
2911   /* a0 */
2912   { "pushT",            { fs }, 0 },
2913   { "popT",             { fs }, 0 },
2914   { "cpuid",            { XX }, 0 },
2915   { "btS",              { Ev, Gv }, 0 },
2916   { "shldS",            { Ev, Gv, Ib }, 0 },
2917   { "shldS",            { Ev, Gv, CL }, 0 },
2918   { REG_TABLE (REG_0FA6) },
2919   { REG_TABLE (REG_0FA7) },
2920   /* a8 */
2921   { "pushT",            { gs }, 0 },
2922   { "popT",             { gs }, 0 },
2923   { "rsm",              { XX }, 0 },
2924   { "btsS",             { Evh1, Gv }, 0 },
2925   { "shrdS",            { Ev, Gv, Ib }, 0 },
2926   { "shrdS",            { Ev, Gv, CL }, 0 },
2927   { REG_TABLE (REG_0FAE) },
2928   { "imulS",            { Gv, Ev }, 0 },
2929   /* b0 */
2930   { "cmpxchgB",         { Ebh1, Gb }, 0 },
2931   { "cmpxchgS",         { Evh1, Gv }, 0 },
2932   { MOD_TABLE (MOD_0FB2) },
2933   { "btrS",             { Evh1, Gv }, 0 },
2934   { MOD_TABLE (MOD_0FB4) },
2935   { MOD_TABLE (MOD_0FB5) },
2936   { "movz{bR|x}",       { Gv, Eb }, 0 },
2937   { "movz{wR|x}",       { Gv, Ew }, 0 }, /* yes, there really is movzww ! */
2938   /* b8 */
2939   { PREFIX_TABLE (PREFIX_0FB8) },
2940   { "ud1",              { XX }, 0 },
2941   { REG_TABLE (REG_0FBA) },
2942   { "btcS",             { Evh1, Gv }, 0 },
2943   { PREFIX_TABLE (PREFIX_0FBC) },
2944   { PREFIX_TABLE (PREFIX_0FBD) },
2945   { "movs{bR|x}",       { Gv, Eb }, 0 },
2946   { "movs{wR|x}",       { Gv, Ew }, 0 }, /* yes, there really is movsww ! */
2947   /* c0 */
2948   { "xaddB",            { Ebh1, Gb }, 0 },
2949   { "xaddS",            { Evh1, Gv }, 0 },
2950   { PREFIX_TABLE (PREFIX_0FC2) },
2951   { PREFIX_TABLE (PREFIX_0FC3) },
2952   { "pinsrw",           { MX, Edqw, Ib }, PREFIX_OPCODE },
2953   { "pextrw",           { Gdq, MS, Ib }, PREFIX_OPCODE },
2954   { "shufpX",           { XM, EXx, Ib }, PREFIX_OPCODE },
2955   { REG_TABLE (REG_0FC7) },
2956   /* c8 */
2957   { "bswap",            { RMeAX }, 0 },
2958   { "bswap",            { RMeCX }, 0 },
2959   { "bswap",            { RMeDX }, 0 },
2960   { "bswap",            { RMeBX }, 0 },
2961   { "bswap",            { RMeSP }, 0 },
2962   { "bswap",            { RMeBP }, 0 },
2963   { "bswap",            { RMeSI }, 0 },
2964   { "bswap",            { RMeDI }, 0 },
2965   /* d0 */
2966   { PREFIX_TABLE (PREFIX_0FD0) },
2967   { "psrlw",            { MX, EM }, PREFIX_OPCODE },
2968   { "psrld",            { MX, EM }, PREFIX_OPCODE },
2969   { "psrlq",            { MX, EM }, PREFIX_OPCODE },
2970   { "paddq",            { MX, EM }, PREFIX_OPCODE },
2971   { "pmullw",           { MX, EM }, PREFIX_OPCODE },
2972   { PREFIX_TABLE (PREFIX_0FD6) },
2973   { MOD_TABLE (MOD_0FD7) },
2974   /* d8 */
2975   { "psubusb",          { MX, EM }, PREFIX_OPCODE },
2976   { "psubusw",          { MX, EM }, PREFIX_OPCODE },
2977   { "pminub",           { MX, EM }, PREFIX_OPCODE },
2978   { "pand",             { MX, EM }, PREFIX_OPCODE },
2979   { "paddusb",          { MX, EM }, PREFIX_OPCODE },
2980   { "paddusw",          { MX, EM }, PREFIX_OPCODE },
2981   { "pmaxub",           { MX, EM }, PREFIX_OPCODE },
2982   { "pandn",            { MX, EM }, PREFIX_OPCODE },
2983   /* e0 */
2984   { "pavgb",            { MX, EM }, PREFIX_OPCODE },
2985   { "psraw",            { MX, EM }, PREFIX_OPCODE },
2986   { "psrad",            { MX, EM }, PREFIX_OPCODE },
2987   { "pavgw",            { MX, EM }, PREFIX_OPCODE },
2988   { "pmulhuw",          { MX, EM }, PREFIX_OPCODE },
2989   { "pmulhw",           { MX, EM }, PREFIX_OPCODE },
2990   { PREFIX_TABLE (PREFIX_0FE6) },
2991   { PREFIX_TABLE (PREFIX_0FE7) },
2992   /* e8 */
2993   { "psubsb",           { MX, EM }, PREFIX_OPCODE },
2994   { "psubsw",           { MX, EM }, PREFIX_OPCODE },
2995   { "pminsw",           { MX, EM }, PREFIX_OPCODE },
2996   { "por",              { MX, EM }, PREFIX_OPCODE },
2997   { "paddsb",           { MX, EM }, PREFIX_OPCODE },
2998   { "paddsw",           { MX, EM }, PREFIX_OPCODE },
2999   { "pmaxsw",           { MX, EM }, PREFIX_OPCODE },
3000   { "pxor",             { MX, EM }, PREFIX_OPCODE },
3001   /* f0 */
3002   { PREFIX_TABLE (PREFIX_0FF0) },
3003   { "psllw",            { MX, EM }, PREFIX_OPCODE },
3004   { "pslld",            { MX, EM }, PREFIX_OPCODE },
3005   { "psllq",            { MX, EM }, PREFIX_OPCODE },
3006   { "pmuludq",          { MX, EM }, PREFIX_OPCODE },
3007   { "pmaddwd",          { MX, EM }, PREFIX_OPCODE },
3008   { "psadbw",           { MX, EM }, PREFIX_OPCODE },
3009   { PREFIX_TABLE (PREFIX_0FF7) },
3010   /* f8 */
3011   { "psubb",            { MX, EM }, PREFIX_OPCODE },
3012   { "psubw",            { MX, EM }, PREFIX_OPCODE },
3013   { "psubd",            { MX, EM }, PREFIX_OPCODE },
3014   { "psubq",            { MX, EM }, PREFIX_OPCODE },
3015   { "paddb",            { MX, EM }, PREFIX_OPCODE },
3016   { "paddw",            { MX, EM }, PREFIX_OPCODE },
3017   { "paddd",            { MX, EM }, PREFIX_OPCODE },
3018   { Bad_Opcode },
3019 };
3020
3021 static const unsigned char onebyte_has_modrm[256] = {
3022   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
3023   /*       -------------------------------        */
3024   /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
3025   /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
3026   /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
3027   /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
3028   /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
3029   /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
3030   /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
3031   /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
3032   /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
3033   /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
3034   /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
3035   /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
3036   /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
3037   /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
3038   /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
3039   /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1  /* f0 */
3040   /*       -------------------------------        */
3041   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
3042 };
3043
3044 static const unsigned char twobyte_has_modrm[256] = {
3045   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
3046   /*       -------------------------------        */
3047   /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
3048   /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
3049   /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
3050   /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
3051   /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
3052   /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
3053   /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
3054   /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
3055   /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
3056   /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
3057   /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
3058   /* b0 */ 1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1, /* bf */
3059   /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
3060   /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
3061   /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
3062   /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0  /* ff */
3063   /*       -------------------------------        */
3064   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
3065 };
3066
3067 static char obuf[100];
3068 static char *obufp;
3069 static char *mnemonicendp;
3070 static char scratchbuf[100];
3071 static unsigned char *start_codep;
3072 static unsigned char *insn_codep;
3073 static unsigned char *codep;
3074 static unsigned char *end_codep;
3075 static int last_lock_prefix;
3076 static int last_repz_prefix;
3077 static int last_repnz_prefix;
3078 static int last_data_prefix;
3079 static int last_addr_prefix;
3080 static int last_rex_prefix;
3081 static int last_seg_prefix;
3082 static int fwait_prefix;
3083 /* The PREFIX_REPZ/PREFIX_REPNZ/PREFIX_DATA prefix is mandatory.  */
3084 static int prefix_requirement;
3085 /* The active segment register prefix.  */
3086 static int active_seg_prefix;
3087 #define MAX_CODE_LENGTH 15
3088 /* We can up to 14 prefixes since the maximum instruction length is
3089    15bytes.  */
3090 static int all_prefixes[MAX_CODE_LENGTH - 1];
3091 static disassemble_info *the_info;
3092 static struct
3093   {
3094     int mod;
3095     int reg;
3096     int rm;
3097   }
3098 modrm;
3099 static unsigned char need_modrm;
3100 static struct
3101   {
3102     int scale;
3103     int index;
3104     int base;
3105   }
3106 sib;
3107 static struct
3108   {
3109     int register_specifier;
3110     int length;
3111     int prefix;
3112     int w;
3113     int evex;
3114     int r;
3115     int v;
3116     int mask_register_specifier;
3117     int zeroing;
3118     int ll;
3119     int b;
3120   }
3121 vex;
3122 static unsigned char need_vex;
3123 static unsigned char need_vex_reg;
3124 static unsigned char vex_w_done;
3125
3126 struct op
3127   {
3128     const char *name;
3129     unsigned int len;
3130   };
3131
3132 /* If we are accessing mod/rm/reg without need_modrm set, then the
3133    values are stale.  Hitting this abort likely indicates that you
3134    need to update onebyte_has_modrm or twobyte_has_modrm.  */
3135 #define MODRM_CHECK  if (!need_modrm) abort ()
3136
3137 static const char **names64;
3138 static const char **names32;
3139 static const char **names16;
3140 static const char **names8;
3141 static const char **names8rex;
3142 static const char **names_seg;
3143 static const char *index64;
3144 static const char *index32;
3145 static const char **index16;
3146 static const char **names_bnd;
3147
3148 static const char *intel_names64[] = {
3149   "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
3150   "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
3151 };
3152 static const char *intel_names32[] = {
3153   "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
3154   "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
3155 };
3156 static const char *intel_names16[] = {
3157   "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
3158   "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
3159 };
3160 static const char *intel_names8[] = {
3161   "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
3162 };
3163 static const char *intel_names8rex[] = {
3164   "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
3165   "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
3166 };
3167 static const char *intel_names_seg[] = {
3168   "es", "cs", "ss", "ds", "fs", "gs", "?", "?",
3169 };
3170 static const char *intel_index64 = "riz";
3171 static const char *intel_index32 = "eiz";
3172 static const char *intel_index16[] = {
3173   "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
3174 };
3175
3176 static const char *att_names64[] = {
3177   "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
3178   "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
3179 };
3180 static const char *att_names32[] = {
3181   "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
3182   "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
3183 };
3184 static const char *att_names16[] = {
3185   "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
3186   "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
3187 };
3188 static const char *att_names8[] = {
3189   "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
3190 };
3191 static const char *att_names8rex[] = {
3192   "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
3193   "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
3194 };
3195 static const char *att_names_seg[] = {
3196   "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
3197 };
3198 static const char *att_index64 = "%riz";
3199 static const char *att_index32 = "%eiz";
3200 static const char *att_index16[] = {
3201   "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
3202 };
3203
3204 static const char **names_mm;
3205 static const char *intel_names_mm[] = {
3206   "mm0", "mm1", "mm2", "mm3",
3207   "mm4", "mm5", "mm6", "mm7"
3208 };
3209 static const char *att_names_mm[] = {
3210   "%mm0", "%mm1", "%mm2", "%mm3",
3211   "%mm4", "%mm5", "%mm6", "%mm7"
3212 };
3213
3214 static const char *intel_names_bnd[] = {
3215   "bnd0", "bnd1", "bnd2", "bnd3"
3216 };
3217
3218 static const char *att_names_bnd[] = {
3219   "%bnd0", "%bnd1", "%bnd2", "%bnd3"
3220 };
3221
3222 static const char **names_xmm;
3223 static const char *intel_names_xmm[] = {
3224   "xmm0", "xmm1", "xmm2", "xmm3",
3225   "xmm4", "xmm5", "xmm6", "xmm7",
3226   "xmm8", "xmm9", "xmm10", "xmm11",
3227   "xmm12", "xmm13", "xmm14", "xmm15",
3228   "xmm16", "xmm17", "xmm18", "xmm19",
3229   "xmm20", "xmm21", "xmm22", "xmm23",
3230   "xmm24", "xmm25", "xmm26", "xmm27",
3231   "xmm28", "xmm29", "xmm30", "xmm31"
3232 };
3233 static const char *att_names_xmm[] = {
3234   "%xmm0", "%xmm1", "%xmm2", "%xmm3",
3235   "%xmm4", "%xmm5", "%xmm6", "%xmm7",
3236   "%xmm8", "%xmm9", "%xmm10", "%xmm11",
3237   "%xmm12", "%xmm13", "%xmm14", "%xmm15",
3238   "%xmm16", "%xmm17", "%xmm18", "%xmm19",
3239   "%xmm20", "%xmm21", "%xmm22", "%xmm23",
3240   "%xmm24", "%xmm25", "%xmm26", "%xmm27",
3241   "%xmm28", "%xmm29", "%xmm30", "%xmm31"
3242 };
3243
3244 static const char **names_ymm;
3245 static const char *intel_names_ymm[] = {
3246   "ymm0", "ymm1", "ymm2", "ymm3",
3247   "ymm4", "ymm5", "ymm6", "ymm7",
3248   "ymm8", "ymm9", "ymm10", "ymm11",
3249   "ymm12", "ymm13", "ymm14", "ymm15",
3250   "ymm16", "ymm17", "ymm18", "ymm19",
3251   "ymm20", "ymm21", "ymm22", "ymm23",
3252   "ymm24", "ymm25", "ymm26", "ymm27",
3253   "ymm28", "ymm29", "ymm30", "ymm31"
3254 };
3255 static const char *att_names_ymm[] = {
3256   "%ymm0", "%ymm1", "%ymm2", "%ymm3",
3257   "%ymm4", "%ymm5", "%ymm6", "%ymm7",
3258   "%ymm8", "%ymm9", "%ymm10", "%ymm11",
3259   "%ymm12", "%ymm13", "%ymm14", "%ymm15",
3260   "%ymm16", "%ymm17", "%ymm18", "%ymm19",
3261   "%ymm20", "%ymm21", "%ymm22", "%ymm23",
3262   "%ymm24", "%ymm25", "%ymm26", "%ymm27",
3263   "%ymm28", "%ymm29", "%ymm30", "%ymm31"
3264 };
3265
3266 static const char **names_zmm;
3267 static const char *intel_names_zmm[] = {
3268   "zmm0", "zmm1", "zmm2", "zmm3",
3269   "zmm4", "zmm5", "zmm6", "zmm7",
3270   "zmm8", "zmm9", "zmm10", "zmm11",
3271   "zmm12", "zmm13", "zmm14", "zmm15",
3272   "zmm16", "zmm17", "zmm18", "zmm19",
3273   "zmm20", "zmm21", "zmm22", "zmm23",
3274   "zmm24", "zmm25", "zmm26", "zmm27",
3275   "zmm28", "zmm29", "zmm30", "zmm31"
3276 };
3277 static const char *att_names_zmm[] = {
3278   "%zmm0", "%zmm1", "%zmm2", "%zmm3",
3279   "%zmm4", "%zmm5", "%zmm6", "%zmm7",
3280   "%zmm8", "%zmm9", "%zmm10", "%zmm11",
3281   "%zmm12", "%zmm13", "%zmm14", "%zmm15",
3282   "%zmm16", "%zmm17", "%zmm18", "%zmm19",
3283   "%zmm20", "%zmm21", "%zmm22", "%zmm23",
3284   "%zmm24", "%zmm25", "%zmm26", "%zmm27",
3285   "%zmm28", "%zmm29", "%zmm30", "%zmm31"
3286 };
3287
3288 static const char **names_mask;
3289 static const char *intel_names_mask[] = {
3290   "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7"
3291 };
3292 static const char *att_names_mask[] = {
3293   "%k0", "%k1", "%k2", "%k3", "%k4", "%k5", "%k6", "%k7"
3294 };
3295
3296 static const char *names_rounding[] =
3297 {
3298   "{rn-sae}",
3299   "{rd-sae}",
3300   "{ru-sae}",
3301   "{rz-sae}"
3302 };
3303
3304 static const struct dis386 reg_table[][8] = {
3305   /* REG_80 */
3306   {
3307     { "addA",   { Ebh1, Ib }, 0 },
3308     { "orA",    { Ebh1, Ib }, 0 },
3309     { "adcA",   { Ebh1, Ib }, 0 },
3310     { "sbbA",   { Ebh1, Ib }, 0 },
3311     { "andA",   { Ebh1, Ib }, 0 },
3312     { "subA",   { Ebh1, Ib }, 0 },
3313     { "xorA",   { Ebh1, Ib }, 0 },
3314     { "cmpA",   { Eb, Ib }, 0 },
3315   },
3316   /* REG_81 */
3317   {
3318     { "addQ",   { Evh1, Iv }, 0 },
3319     { "orQ",    { Evh1, Iv }, 0 },
3320     { "adcQ",   { Evh1, Iv }, 0 },
3321     { "sbbQ",   { Evh1, Iv }, 0 },
3322     { "andQ",   { Evh1, Iv }, 0 },
3323     { "subQ",   { Evh1, Iv }, 0 },
3324     { "xorQ",   { Evh1, Iv }, 0 },
3325     { "cmpQ",   { Ev, Iv }, 0 },
3326   },
3327   /* REG_82 */
3328   {
3329     { "addQ",   { Evh1, sIb }, 0 },
3330     { "orQ",    { Evh1, sIb }, 0 },
3331     { "adcQ",   { Evh1, sIb }, 0 },
3332     { "sbbQ",   { Evh1, sIb }, 0 },
3333     { "andQ",   { Evh1, sIb }, 0 },
3334     { "subQ",   { Evh1, sIb }, 0 },
3335     { "xorQ",   { Evh1, sIb }, 0 },
3336     { "cmpQ",   { Ev, sIb }, 0 },
3337   },
3338   /* REG_8F */
3339   {
3340     { "popU",   { stackEv }, 0 },
3341     { XOP_8F_TABLE (XOP_09) },
3342     { Bad_Opcode },
3343     { Bad_Opcode },
3344     { Bad_Opcode },
3345     { XOP_8F_TABLE (XOP_09) },
3346   },
3347   /* REG_C0 */
3348   {
3349     { "rolA",   { Eb, Ib }, 0 },
3350     { "rorA",   { Eb, Ib }, 0 },
3351     { "rclA",   { Eb, Ib }, 0 },
3352     { "rcrA",   { Eb, Ib }, 0 },
3353     { "shlA",   { Eb, Ib }, 0 },
3354     { "shrA",   { Eb, Ib }, 0 },
3355     { Bad_Opcode },
3356     { "sarA",   { Eb, Ib }, 0 },
3357   },
3358   /* REG_C1 */
3359   {
3360     { "rolQ",   { Ev, Ib }, 0 },
3361     { "rorQ",   { Ev, Ib }, 0 },
3362     { "rclQ",   { Ev, Ib }, 0 },
3363     { "rcrQ",   { Ev, Ib }, 0 },
3364     { "shlQ",   { Ev, Ib }, 0 },
3365     { "shrQ",   { Ev, Ib }, 0 },
3366     { Bad_Opcode },
3367     { "sarQ",   { Ev, Ib }, 0 },
3368   },
3369   /* REG_C6 */
3370   {
3371     { "movA",   { Ebh3, Ib }, 0 },
3372     { Bad_Opcode },
3373     { Bad_Opcode },
3374     { Bad_Opcode },
3375     { Bad_Opcode },
3376     { Bad_Opcode },
3377     { Bad_Opcode },
3378     { MOD_TABLE (MOD_C6_REG_7) },
3379   },
3380   /* REG_C7 */
3381   {
3382     { "movQ",   { Evh3, Iv }, 0 },
3383     { Bad_Opcode },
3384     { Bad_Opcode },
3385     { Bad_Opcode },
3386     { Bad_Opcode },
3387     { Bad_Opcode },
3388     { Bad_Opcode },
3389     { MOD_TABLE (MOD_C7_REG_7) },
3390   },
3391   /* REG_D0 */
3392   {
3393     { "rolA",   { Eb, I1 }, 0 },
3394     { "rorA",   { Eb, I1 }, 0 },
3395     { "rclA",   { Eb, I1 }, 0 },
3396     { "rcrA",   { Eb, I1 }, 0 },
3397     { "shlA",   { Eb, I1 }, 0 },
3398     { "shrA",   { Eb, I1 }, 0 },
3399     { Bad_Opcode },
3400     { "sarA",   { Eb, I1 }, 0 },
3401   },
3402   /* REG_D1 */
3403   {
3404     { "rolQ",   { Ev, I1 }, 0 },
3405     { "rorQ",   { Ev, I1 }, 0 },
3406     { "rclQ",   { Ev, I1 }, 0 },
3407     { "rcrQ",   { Ev, I1 }, 0 },
3408     { "shlQ",   { Ev, I1 }, 0 },
3409     { "shrQ",   { Ev, I1 }, 0 },
3410     { Bad_Opcode },
3411     { "sarQ",   { Ev, I1 }, 0 },
3412   },
3413   /* REG_D2 */
3414   {
3415     { "rolA",   { Eb, CL }, 0 },
3416     { "rorA",   { Eb, CL }, 0 },
3417     { "rclA",   { Eb, CL }, 0 },
3418     { "rcrA",   { Eb, CL }, 0 },
3419     { "shlA",   { Eb, CL }, 0 },
3420     { "shrA",   { Eb, CL }, 0 },
3421     { Bad_Opcode },
3422     { "sarA",   { Eb, CL }, 0 },
3423   },
3424   /* REG_D3 */
3425   {
3426     { "rolQ",   { Ev, CL }, 0 },
3427     { "rorQ",   { Ev, CL }, 0 },
3428     { "rclQ",   { Ev, CL }, 0 },
3429     { "rcrQ",   { Ev, CL }, 0 },
3430     { "shlQ",   { Ev, CL }, 0 },
3431     { "shrQ",   { Ev, CL }, 0 },
3432     { Bad_Opcode },
3433     { "sarQ",   { Ev, CL }, 0 },
3434   },
3435   /* REG_F6 */
3436   {
3437     { "testA",  { Eb, Ib }, 0 },
3438     { Bad_Opcode },
3439     { "notA",   { Ebh1 }, 0 },
3440     { "negA",   { Ebh1 }, 0 },
3441     { "mulA",   { Eb }, 0 },    /* Don't print the implicit %al register,  */
3442     { "imulA",  { Eb }, 0 },    /* to distinguish these opcodes from other */
3443     { "divA",   { Eb }, 0 },    /* mul/imul opcodes.  Do the same for div  */
3444     { "idivA",  { Eb }, 0 },    /* and idiv for consistency.               */
3445   },
3446   /* REG_F7 */
3447   {
3448     { "testQ",  { Ev, Iv }, 0 },
3449     { Bad_Opcode },
3450     { "notQ",   { Evh1 }, 0 },
3451     { "negQ",   { Evh1 }, 0 },
3452     { "mulQ",   { Ev }, 0 },    /* Don't print the implicit register.  */
3453     { "imulQ",  { Ev }, 0 },
3454     { "divQ",   { Ev }, 0 },
3455     { "idivQ",  { Ev }, 0 },
3456   },
3457   /* REG_FE */
3458   {
3459     { "incA",   { Ebh1 }, 0 },
3460     { "decA",   { Ebh1 }, 0 },
3461   },
3462   /* REG_FF */
3463   {
3464     { "incQ",   { Evh1 }, 0 },
3465     { "decQ",   { Evh1 }, 0 },
3466     { "call{T|}", { indirEv, BND }, 0 },
3467     { MOD_TABLE (MOD_FF_REG_3) },
3468     { "jmp{T|}", { indirEv, BND }, 0 },
3469     { MOD_TABLE (MOD_FF_REG_5) },
3470     { "pushU",  { stackEv }, 0 },
3471     { Bad_Opcode },
3472   },
3473   /* REG_0F00 */
3474   {
3475     { "sldtD",  { Sv }, 0 },
3476     { "strD",   { Sv }, 0 },
3477     { "lldt",   { Ew }, 0 },
3478     { "ltr",    { Ew }, 0 },
3479     { "verr",   { Ew }, 0 },
3480     { "verw",   { Ew }, 0 },
3481     { Bad_Opcode },
3482     { Bad_Opcode },
3483   },
3484   /* REG_0F01 */
3485   {
3486     { MOD_TABLE (MOD_0F01_REG_0) },
3487     { MOD_TABLE (MOD_0F01_REG_1) },
3488     { MOD_TABLE (MOD_0F01_REG_2) },
3489     { MOD_TABLE (MOD_0F01_REG_3) },
3490     { "smswD",  { Sv }, 0 },
3491     { Bad_Opcode },
3492     { "lmsw",   { Ew }, 0 },
3493     { MOD_TABLE (MOD_0F01_REG_7) },
3494   },
3495   /* REG_0F0D */
3496   {
3497     { "prefetch",       { Mb }, 0 },
3498     { "prefetchw",      { Mb }, 0 },
3499     { "prefetchwt1",    { Mb }, 0 },
3500     { "prefetch",       { Mb }, 0 },
3501     { "prefetch",       { Mb }, 0 },
3502     { "prefetch",       { Mb }, 0 },
3503     { "prefetch",       { Mb }, 0 },
3504     { "prefetch",       { Mb }, 0 },
3505   },
3506   /* REG_0F18 */
3507   {
3508     { MOD_TABLE (MOD_0F18_REG_0) },
3509     { MOD_TABLE (MOD_0F18_REG_1) },
3510     { MOD_TABLE (MOD_0F18_REG_2) },
3511     { MOD_TABLE (MOD_0F18_REG_3) },
3512     { MOD_TABLE (MOD_0F18_REG_4) },
3513     { MOD_TABLE (MOD_0F18_REG_5) },
3514     { MOD_TABLE (MOD_0F18_REG_6) },
3515     { MOD_TABLE (MOD_0F18_REG_7) },
3516   },
3517   /* REG_0F71 */
3518   {
3519     { Bad_Opcode },
3520     { Bad_Opcode },
3521     { MOD_TABLE (MOD_0F71_REG_2) },
3522     { Bad_Opcode },
3523     { MOD_TABLE (MOD_0F71_REG_4) },
3524     { Bad_Opcode },
3525     { MOD_TABLE (MOD_0F71_REG_6) },
3526   },
3527   /* REG_0F72 */
3528   {
3529     { Bad_Opcode },
3530     { Bad_Opcode },
3531     { MOD_TABLE (MOD_0F72_REG_2) },
3532     { Bad_Opcode },
3533     { MOD_TABLE (MOD_0F72_REG_4) },
3534     { Bad_Opcode },
3535     { MOD_TABLE (MOD_0F72_REG_6) },
3536   },
3537   /* REG_0F73 */
3538   {
3539     { Bad_Opcode },
3540     { Bad_Opcode },
3541     { MOD_TABLE (MOD_0F73_REG_2) },
3542     { MOD_TABLE (MOD_0F73_REG_3) },
3543     { Bad_Opcode },
3544     { Bad_Opcode },
3545     { MOD_TABLE (MOD_0F73_REG_6) },
3546     { MOD_TABLE (MOD_0F73_REG_7) },
3547   },
3548   /* REG_0FA6 */
3549   {
3550     { "montmul",        { { OP_0f07, 0 } }, 0 },
3551     { "xsha1",          { { OP_0f07, 0 } }, 0 },
3552     { "xsha256",        { { OP_0f07, 0 } }, 0 },
3553   },
3554   /* REG_0FA7 */
3555   {
3556     { "xstore-rng",     { { OP_0f07, 0 } }, 0 },
3557     { "xcrypt-ecb",     { { OP_0f07, 0 } }, 0 },
3558     { "xcrypt-cbc",     { { OP_0f07, 0 } }, 0 },
3559     { "xcrypt-ctr",     { { OP_0f07, 0 } }, 0 },
3560     { "xcrypt-cfb",     { { OP_0f07, 0 } }, 0 },
3561     { "xcrypt-ofb",     { { OP_0f07, 0 } }, 0 },
3562   },
3563   /* REG_0FAE */
3564   {
3565     { MOD_TABLE (MOD_0FAE_REG_0) },
3566     { MOD_TABLE (MOD_0FAE_REG_1) },
3567     { MOD_TABLE (MOD_0FAE_REG_2) },
3568     { MOD_TABLE (MOD_0FAE_REG_3) },
3569     { MOD_TABLE (MOD_0FAE_REG_4) },
3570     { MOD_TABLE (MOD_0FAE_REG_5) },
3571     { MOD_TABLE (MOD_0FAE_REG_6) },
3572     { MOD_TABLE (MOD_0FAE_REG_7) },
3573   },
3574   /* REG_0FBA */
3575   {
3576     { Bad_Opcode },
3577     { Bad_Opcode },
3578     { Bad_Opcode },
3579     { Bad_Opcode },
3580     { "btQ",    { Ev, Ib }, 0 },
3581     { "btsQ",   { Evh1, Ib }, 0 },
3582     { "btrQ",   { Evh1, Ib }, 0 },
3583     { "btcQ",   { Evh1, Ib }, 0 },
3584   },
3585   /* REG_0FC7 */
3586   {
3587     { Bad_Opcode },
3588     { "cmpxchg8b", { { CMPXCHG8B_Fixup, q_mode } }, 0 },
3589     { Bad_Opcode },
3590     { MOD_TABLE (MOD_0FC7_REG_3) },
3591     { MOD_TABLE (MOD_0FC7_REG_4) },
3592     { MOD_TABLE (MOD_0FC7_REG_5) },
3593     { MOD_TABLE (MOD_0FC7_REG_6) },
3594     { MOD_TABLE (MOD_0FC7_REG_7) },
3595   },
3596   /* REG_VEX_0F71 */
3597   {
3598     { Bad_Opcode },
3599     { Bad_Opcode },
3600     { MOD_TABLE (MOD_VEX_0F71_REG_2) },
3601     { Bad_Opcode },
3602     { MOD_TABLE (MOD_VEX_0F71_REG_4) },
3603     { Bad_Opcode },
3604     { MOD_TABLE (MOD_VEX_0F71_REG_6) },
3605   },
3606   /* REG_VEX_0F72 */
3607   {
3608     { Bad_Opcode },
3609     { Bad_Opcode },
3610     { MOD_TABLE (MOD_VEX_0F72_REG_2) },
3611     { Bad_Opcode },
3612     { MOD_TABLE (MOD_VEX_0F72_REG_4) },
3613     { Bad_Opcode },
3614     { MOD_TABLE (MOD_VEX_0F72_REG_6) },
3615   },
3616   /* REG_VEX_0F73 */
3617   {
3618     { Bad_Opcode },
3619     { Bad_Opcode },
3620     { MOD_TABLE (MOD_VEX_0F73_REG_2) },
3621     { MOD_TABLE (MOD_VEX_0F73_REG_3) },
3622     { Bad_Opcode },
3623     { Bad_Opcode },
3624     { MOD_TABLE (MOD_VEX_0F73_REG_6) },
3625     { MOD_TABLE (MOD_VEX_0F73_REG_7) },
3626   },
3627   /* REG_VEX_0FAE */
3628   {
3629     { Bad_Opcode },
3630     { Bad_Opcode },
3631     { MOD_TABLE (MOD_VEX_0FAE_REG_2) },
3632     { MOD_TABLE (MOD_VEX_0FAE_REG_3) },
3633   },
3634   /* REG_VEX_0F38F3 */
3635   {
3636     { Bad_Opcode },
3637     { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_1) },
3638     { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_2) },
3639     { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_3) },
3640   },
3641   /* REG_XOP_LWPCB */
3642   {
3643     { "llwpcb", { { OP_LWPCB_E, 0 } }, 0 },
3644     { "slwpcb", { { OP_LWPCB_E, 0 } }, 0 },
3645   },
3646   /* REG_XOP_LWP */
3647   {
3648     { "lwpins", { { OP_LWP_E, 0 }, Ed, Iq }, 0 },
3649     { "lwpval", { { OP_LWP_E, 0 }, Ed, Iq }, 0 },
3650   },
3651   /* REG_XOP_TBM_01 */
3652   {
3653     { Bad_Opcode },
3654     { "blcfill",        { { OP_LWP_E, 0 }, Ev }, 0 },
3655     { "blsfill",        { { OP_LWP_E, 0 }, Ev }, 0 },
3656     { "blcs",   { { OP_LWP_E, 0 }, Ev }, 0 },
3657     { "tzmsk",  { { OP_LWP_E, 0 }, Ev }, 0 },
3658     { "blcic",  { { OP_LWP_E, 0 }, Ev }, 0 },
3659     { "blsic",  { { OP_LWP_E, 0 }, Ev }, 0 },
3660     { "t1mskc", { { OP_LWP_E, 0 }, Ev }, 0 },
3661   },
3662   /* REG_XOP_TBM_02 */
3663   {
3664     { Bad_Opcode },
3665     { "blcmsk", { { OP_LWP_E, 0 }, Ev }, 0 },
3666     { Bad_Opcode },
3667     { Bad_Opcode },
3668     { Bad_Opcode },
3669     { Bad_Opcode },
3670     { "blci",   { { OP_LWP_E, 0 }, Ev }, 0 },
3671   },
3672 #define NEED_REG_TABLE
3673 #include "i386-dis-evex.h"
3674 #undef NEED_REG_TABLE
3675 };
3676
3677 static const struct dis386 prefix_table[][4] = {
3678   /* PREFIX_90 */
3679   {
3680     { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } }, 0 },
3681     { "pause", { XX }, 0 },
3682     { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } }, 0 },
3683     { NULL, { { NULL, 0 } }, PREFIX_IGNORED }
3684   },
3685
3686   /* PREFIX_0F10 */
3687   {
3688     { "movups", { XM, EXx }, PREFIX_OPCODE },
3689     { "movss",  { XM, EXd }, PREFIX_OPCODE },
3690     { "movupd", { XM, EXx }, PREFIX_OPCODE },
3691     { "movsd",  { XM, EXq }, PREFIX_OPCODE },
3692   },
3693
3694   /* PREFIX_0F11 */
3695   {
3696     { "movups", { EXxS, XM }, PREFIX_OPCODE },
3697     { "movss",  { EXdS, XM }, PREFIX_OPCODE },
3698     { "movupd", { EXxS, XM }, PREFIX_OPCODE },
3699     { "movsd",  { EXqS, XM }, PREFIX_OPCODE },
3700   },
3701
3702   /* PREFIX_0F12 */
3703   {
3704     { MOD_TABLE (MOD_0F12_PREFIX_0) },
3705     { "movsldup", { XM, EXx }, PREFIX_OPCODE },
3706     { "movlpd", { XM, EXq }, PREFIX_OPCODE },
3707     { "movddup", { XM, EXq }, PREFIX_OPCODE },
3708   },
3709
3710   /* PREFIX_0F16 */
3711   {
3712     { MOD_TABLE (MOD_0F16_PREFIX_0) },
3713     { "movshdup", { XM, EXx }, PREFIX_OPCODE },
3714     { "movhpd", { XM, EXq }, PREFIX_OPCODE },
3715   },
3716
3717   /* PREFIX_0F1A */
3718   {
3719     { MOD_TABLE (MOD_0F1A_PREFIX_0) },
3720     { "bndcl",  { Gbnd, Ev_bnd }, 0 },
3721     { "bndmov", { Gbnd, Ebnd }, 0 },
3722     { "bndcu",  { Gbnd, Ev_bnd }, 0 },
3723   },
3724
3725   /* PREFIX_0F1B */
3726   {
3727     { MOD_TABLE (MOD_0F1B_PREFIX_0) },
3728     { MOD_TABLE (MOD_0F1B_PREFIX_1) },
3729     { "bndmov", { Ebnd, Gbnd }, 0 },
3730     { "bndcn",  { Gbnd, Ev_bnd }, 0 },
3731   },
3732
3733   /* PREFIX_0F2A */
3734   {
3735     { "cvtpi2ps", { XM, EMCq }, PREFIX_OPCODE },
3736     { "cvtsi2ss%LQ", { XM, Ev }, PREFIX_OPCODE },
3737     { "cvtpi2pd", { XM, EMCq }, PREFIX_OPCODE },
3738     { "cvtsi2sd%LQ", { XM, Ev }, 0 },
3739   },
3740
3741   /* PREFIX_0F2B */
3742   {
3743     { MOD_TABLE (MOD_0F2B_PREFIX_0) },
3744     { MOD_TABLE (MOD_0F2B_PREFIX_1) },
3745     { MOD_TABLE (MOD_0F2B_PREFIX_2) },
3746     { MOD_TABLE (MOD_0F2B_PREFIX_3) },
3747   },
3748
3749   /* PREFIX_0F2C */
3750   {
3751     { "cvttps2pi", { MXC, EXq }, PREFIX_OPCODE },
3752     { "cvttss2siY", { Gv, EXd }, PREFIX_OPCODE },
3753     { "cvttpd2pi", { MXC, EXx }, PREFIX_OPCODE },
3754     { "cvttsd2siY", { Gv, EXq }, PREFIX_OPCODE },
3755   },
3756
3757   /* PREFIX_0F2D */
3758   {
3759     { "cvtps2pi", { MXC, EXq }, PREFIX_OPCODE },
3760     { "cvtss2siY", { Gv, EXd }, PREFIX_OPCODE },
3761     { "cvtpd2pi", { MXC, EXx }, PREFIX_OPCODE },
3762     { "cvtsd2siY", { Gv, EXq }, PREFIX_OPCODE },
3763   },
3764
3765   /* PREFIX_0F2E */
3766   {
3767     { "ucomiss",{ XM, EXd }, 0 },
3768     { Bad_Opcode },
3769     { "ucomisd",{ XM, EXq }, 0 },
3770   },
3771
3772   /* PREFIX_0F2F */
3773   {
3774     { "comiss", { XM, EXd }, 0 },
3775     { Bad_Opcode },
3776     { "comisd", { XM, EXq }, 0 },
3777   },
3778
3779   /* PREFIX_0F51 */
3780   {
3781     { "sqrtps", { XM, EXx }, PREFIX_OPCODE },
3782     { "sqrtss", { XM, EXd }, PREFIX_OPCODE },
3783     { "sqrtpd", { XM, EXx }, PREFIX_OPCODE },
3784     { "sqrtsd", { XM, EXq }, PREFIX_OPCODE },
3785   },
3786
3787   /* PREFIX_0F52 */
3788   {
3789     { "rsqrtps",{ XM, EXx }, PREFIX_OPCODE },
3790     { "rsqrtss",{ XM, EXd }, PREFIX_OPCODE },
3791   },
3792
3793   /* PREFIX_0F53 */
3794   {
3795     { "rcpps",  { XM, EXx }, PREFIX_OPCODE },
3796     { "rcpss",  { XM, EXd }, PREFIX_OPCODE },
3797   },
3798
3799   /* PREFIX_0F58 */
3800   {
3801     { "addps", { XM, EXx }, PREFIX_OPCODE },
3802     { "addss", { XM, EXd }, PREFIX_OPCODE },
3803     { "addpd", { XM, EXx }, PREFIX_OPCODE },
3804     { "addsd", { XM, EXq }, PREFIX_OPCODE },
3805   },
3806
3807   /* PREFIX_0F59 */
3808   {
3809     { "mulps",  { XM, EXx }, PREFIX_OPCODE },
3810     { "mulss",  { XM, EXd }, PREFIX_OPCODE },
3811     { "mulpd",  { XM, EXx }, PREFIX_OPCODE },
3812     { "mulsd",  { XM, EXq }, PREFIX_OPCODE },
3813   },
3814
3815   /* PREFIX_0F5A */
3816   {
3817     { "cvtps2pd", { XM, EXq }, PREFIX_OPCODE },
3818     { "cvtss2sd", { XM, EXd }, PREFIX_OPCODE },
3819     { "cvtpd2ps", { XM, EXx }, PREFIX_OPCODE },
3820     { "cvtsd2ss", { XM, EXq }, PREFIX_OPCODE },
3821   },
3822
3823   /* PREFIX_0F5B */
3824   {
3825     { "cvtdq2ps", { XM, EXx }, PREFIX_OPCODE },
3826     { "cvttps2dq", { XM, EXx }, PREFIX_OPCODE },
3827     { "cvtps2dq", { XM, EXx }, PREFIX_OPCODE },
3828   },
3829
3830   /* PREFIX_0F5C */
3831   {
3832     { "subps",  { XM, EXx }, PREFIX_OPCODE },
3833     { "subss",  { XM, EXd }, PREFIX_OPCODE },
3834     { "subpd",  { XM, EXx }, PREFIX_OPCODE },
3835     { "subsd",  { XM, EXq }, PREFIX_OPCODE },
3836   },
3837
3838   /* PREFIX_0F5D */
3839   {
3840     { "minps",  { XM, EXx }, PREFIX_OPCODE },
3841     { "minss",  { XM, EXd }, PREFIX_OPCODE },
3842     { "minpd",  { XM, EXx }, PREFIX_OPCODE },
3843     { "minsd",  { XM, EXq }, PREFIX_OPCODE },
3844   },
3845
3846   /* PREFIX_0F5E */
3847   {
3848     { "divps",  { XM, EXx }, PREFIX_OPCODE },
3849     { "divss",  { XM, EXd }, PREFIX_OPCODE },
3850     { "divpd",  { XM, EXx }, PREFIX_OPCODE },
3851     { "divsd",  { XM, EXq }, PREFIX_OPCODE },
3852   },
3853
3854   /* PREFIX_0F5F */
3855   {
3856     { "maxps",  { XM, EXx }, PREFIX_OPCODE },
3857     { "maxss",  { XM, EXd }, PREFIX_OPCODE },
3858     { "maxpd",  { XM, EXx }, PREFIX_OPCODE },
3859     { "maxsd",  { XM, EXq }, PREFIX_OPCODE },
3860   },
3861
3862   /* PREFIX_0F60 */
3863   {
3864     { "punpcklbw",{ MX, EMd }, PREFIX_OPCODE },
3865     { Bad_Opcode },
3866     { "punpcklbw",{ MX, EMx }, PREFIX_OPCODE },
3867   },
3868
3869   /* PREFIX_0F61 */
3870   {
3871     { "punpcklwd",{ MX, EMd }, PREFIX_OPCODE },
3872     { Bad_Opcode },
3873     { "punpcklwd",{ MX, EMx }, PREFIX_OPCODE },
3874   },
3875
3876   /* PREFIX_0F62 */
3877   {
3878     { "punpckldq",{ MX, EMd }, PREFIX_OPCODE },
3879     { Bad_Opcode },
3880     { "punpckldq",{ MX, EMx }, PREFIX_OPCODE },
3881   },
3882
3883   /* PREFIX_0F6C */
3884   {
3885     { Bad_Opcode },
3886     { Bad_Opcode },
3887     { "punpcklqdq", { XM, EXx }, PREFIX_OPCODE },
3888   },
3889
3890   /* PREFIX_0F6D */
3891   {
3892     { Bad_Opcode },
3893     { Bad_Opcode },
3894     { "punpckhqdq", { XM, EXx }, PREFIX_OPCODE },
3895   },
3896
3897   /* PREFIX_0F6F */
3898   {
3899     { "movq",   { MX, EM }, PREFIX_OPCODE },
3900     { "movdqu", { XM, EXx }, PREFIX_OPCODE },
3901     { "movdqa", { XM, EXx }, PREFIX_OPCODE },
3902   },
3903
3904   /* PREFIX_0F70 */
3905   {
3906     { "pshufw", { MX, EM, Ib }, PREFIX_OPCODE },
3907     { "pshufhw",{ XM, EXx, Ib }, PREFIX_OPCODE },
3908     { "pshufd", { XM, EXx, Ib }, PREFIX_OPCODE },
3909     { "pshuflw",{ XM, EXx, Ib }, PREFIX_OPCODE },
3910   },
3911
3912   /* PREFIX_0F73_REG_3 */
3913   {
3914     { Bad_Opcode },
3915     { Bad_Opcode },
3916     { "psrldq", { XS, Ib }, 0 },
3917   },
3918
3919   /* PREFIX_0F73_REG_7 */
3920   {
3921     { Bad_Opcode },
3922     { Bad_Opcode },
3923     { "pslldq", { XS, Ib }, 0 },
3924   },
3925
3926   /* PREFIX_0F78 */
3927   {
3928     {"vmread",  { Em, Gm }, 0 },
3929     { Bad_Opcode },
3930     {"extrq",   { XS, Ib, Ib }, 0 },
3931     {"insertq", { XM, XS, Ib, Ib }, 0 },
3932   },
3933
3934   /* PREFIX_0F79 */
3935   {
3936     {"vmwrite", { Gm, Em }, 0 },
3937     { Bad_Opcode },
3938     {"extrq",   { XM, XS }, 0 },
3939     {"insertq", { XM, XS }, 0 },
3940   },
3941
3942   /* PREFIX_0F7C */
3943   {
3944     { Bad_Opcode },
3945     { Bad_Opcode },
3946     { "haddpd", { XM, EXx }, PREFIX_OPCODE },
3947     { "haddps", { XM, EXx }, PREFIX_OPCODE },
3948   },
3949
3950   /* PREFIX_0F7D */
3951   {
3952     { Bad_Opcode },
3953     { Bad_Opcode },
3954     { "hsubpd", { XM, EXx }, PREFIX_OPCODE },
3955     { "hsubps", { XM, EXx }, PREFIX_OPCODE },
3956   },
3957
3958   /* PREFIX_0F7E */
3959   {
3960     { "movK",   { Edq, MX }, PREFIX_OPCODE },
3961     { "movq",   { XM, EXq }, PREFIX_OPCODE },
3962     { "movK",   { Edq, XM }, PREFIX_OPCODE },
3963   },
3964
3965   /* PREFIX_0F7F */
3966   {
3967     { "movq",   { EMS, MX }, PREFIX_OPCODE },
3968     { "movdqu", { EXxS, XM }, PREFIX_OPCODE },
3969     { "movdqa", { EXxS, XM }, PREFIX_OPCODE },
3970   },
3971
3972   /* PREFIX_0FAE_REG_0 */
3973   {
3974     { Bad_Opcode },
3975     { "rdfsbase", { Ev }, 0 },
3976   },
3977
3978   /* PREFIX_0FAE_REG_1 */
3979   {
3980     { Bad_Opcode },
3981     { "rdgsbase", { Ev }, 0 },
3982   },
3983
3984   /* PREFIX_0FAE_REG_2 */
3985   {
3986     { Bad_Opcode },
3987     { "wrfsbase", { Ev }, 0 },
3988   },
3989
3990   /* PREFIX_0FAE_REG_3 */
3991   {
3992     { Bad_Opcode },
3993     { "wrgsbase", { Ev }, 0 },
3994   },
3995
3996   /* PREFIX_0FAE_REG_6 */
3997   {
3998     { "xsaveopt",      { FXSAVE }, 0 },
3999     { Bad_Opcode },
4000     { "clwb",   { Mb }, 0 },
4001   },
4002
4003   /* PREFIX_0FAE_REG_7 */
4004   {
4005     { "clflush",        { Mb }, 0 },
4006     { Bad_Opcode },
4007     { "clflushopt",     { Mb }, 0 },
4008   },
4009
4010   /* PREFIX_RM_0_0FAE_REG_7 */
4011   {
4012     { "sfence",         { Skip_MODRM }, 0 },
4013     { Bad_Opcode },
4014     { "pcommit",                { Skip_MODRM }, 0 },
4015   },
4016
4017   /* PREFIX_0FB8 */
4018   {
4019     { Bad_Opcode },
4020     { "popcntS", { Gv, Ev }, 0 },
4021   },
4022
4023   /* PREFIX_0FBC */
4024   {
4025     { "bsfS",   { Gv, Ev }, 0 },
4026     { "tzcntS", { Gv, Ev }, 0 },
4027     { "bsfS",   { Gv, Ev }, 0 },
4028   },
4029
4030   /* PREFIX_0FBD */
4031   {
4032     { "bsrS",   { Gv, Ev }, 0 },
4033     { "lzcntS", { Gv, Ev }, 0 },
4034     { "bsrS",   { Gv, Ev }, 0 },
4035   },
4036
4037   /* PREFIX_0FC2 */
4038   {
4039     { "cmpps",  { XM, EXx, CMP }, PREFIX_OPCODE },
4040     { "cmpss",  { XM, EXd, CMP }, PREFIX_OPCODE },
4041     { "cmppd",  { XM, EXx, CMP }, PREFIX_OPCODE },
4042     { "cmpsd",  { XM, EXq, CMP }, PREFIX_OPCODE },
4043   },
4044
4045   /* PREFIX_0FC3 */
4046   {
4047     { "movntiS", { Ma, Gv }, PREFIX_OPCODE },
4048   },
4049
4050   /* PREFIX_0FC7_REG_6 */
4051   {
4052     { "vmptrld",{ Mq }, 0 },
4053     { "vmxon",  { Mq }, 0 },
4054     { "vmclear",{ Mq }, 0 },
4055   },
4056
4057   /* PREFIX_0FD0 */
4058   {
4059     { Bad_Opcode },
4060     { Bad_Opcode },
4061     { "addsubpd", { XM, EXx }, 0 },
4062     { "addsubps", { XM, EXx }, 0 },
4063   },
4064
4065   /* PREFIX_0FD6 */
4066   {
4067     { Bad_Opcode },
4068     { "movq2dq",{ XM, MS }, 0 },
4069     { "movq",   { EXqS, XM }, 0 },
4070     { "movdq2q",{ MX, XS }, 0 },
4071   },
4072
4073   /* PREFIX_0FE6 */
4074   {
4075     { Bad_Opcode },
4076     { "cvtdq2pd", { XM, EXq }, PREFIX_OPCODE },
4077     { "cvttpd2dq", { XM, EXx }, PREFIX_OPCODE },
4078     { "cvtpd2dq", { XM, EXx }, PREFIX_OPCODE },
4079   },
4080
4081   /* PREFIX_0FE7 */
4082   {
4083     { "movntq", { Mq, MX }, PREFIX_OPCODE },
4084     { Bad_Opcode },
4085     { MOD_TABLE (MOD_0FE7_PREFIX_2) },
4086   },
4087
4088   /* PREFIX_0FF0 */
4089   {
4090     { Bad_Opcode },
4091     { Bad_Opcode },
4092     { Bad_Opcode },
4093     { MOD_TABLE (MOD_0FF0_PREFIX_3) },
4094   },
4095
4096   /* PREFIX_0FF7 */
4097   {
4098     { "maskmovq", { MX, MS }, PREFIX_OPCODE },
4099     { Bad_Opcode },
4100     { "maskmovdqu", { XM, XS }, PREFIX_OPCODE },
4101   },
4102
4103   /* PREFIX_0F3810 */
4104   {
4105     { Bad_Opcode },
4106     { Bad_Opcode },
4107     { "pblendvb", { XM, EXx, XMM0 }, PREFIX_OPCODE },
4108   },
4109
4110   /* PREFIX_0F3814 */
4111   {
4112     { Bad_Opcode },
4113     { Bad_Opcode },
4114     { "blendvps", { XM, EXx, XMM0 }, PREFIX_OPCODE },
4115   },
4116
4117   /* PREFIX_0F3815 */
4118   {
4119     { Bad_Opcode },
4120     { Bad_Opcode },
4121     { "blendvpd", { XM, EXx, XMM0 }, PREFIX_OPCODE },
4122   },
4123
4124   /* PREFIX_0F3817 */
4125   {
4126     { Bad_Opcode },
4127     { Bad_Opcode },
4128     { "ptest",  { XM, EXx }, PREFIX_OPCODE },
4129   },
4130
4131   /* PREFIX_0F3820 */
4132   {
4133     { Bad_Opcode },
4134     { Bad_Opcode },
4135     { "pmovsxbw", { XM, EXq }, PREFIX_OPCODE },
4136   },
4137
4138   /* PREFIX_0F3821 */
4139   {
4140     { Bad_Opcode },
4141     { Bad_Opcode },
4142     { "pmovsxbd", { XM, EXd }, PREFIX_OPCODE },
4143   },
4144
4145   /* PREFIX_0F3822 */
4146   {
4147     { Bad_Opcode },
4148     { Bad_Opcode },
4149     { "pmovsxbq", { XM, EXw }, PREFIX_OPCODE },
4150   },
4151
4152   /* PREFIX_0F3823 */
4153   {
4154     { Bad_Opcode },
4155     { Bad_Opcode },
4156     { "pmovsxwd", { XM, EXq }, PREFIX_OPCODE },
4157   },
4158
4159   /* PREFIX_0F3824 */
4160   {
4161     { Bad_Opcode },
4162     { Bad_Opcode },
4163     { "pmovsxwq", { XM, EXd }, PREFIX_OPCODE },
4164   },
4165
4166   /* PREFIX_0F3825 */
4167   {
4168     { Bad_Opcode },
4169     { Bad_Opcode },
4170     { "pmovsxdq", { XM, EXq }, PREFIX_OPCODE },
4171   },
4172
4173   /* PREFIX_0F3828 */
4174   {
4175     { Bad_Opcode },
4176     { Bad_Opcode },
4177     { "pmuldq", { XM, EXx }, PREFIX_OPCODE },
4178   },
4179
4180   /* PREFIX_0F3829 */
4181   {
4182     { Bad_Opcode },
4183     { Bad_Opcode },
4184     { "pcmpeqq", { XM, EXx }, PREFIX_OPCODE },
4185   },
4186
4187   /* PREFIX_0F382A */
4188   {
4189     { Bad_Opcode },
4190     { Bad_Opcode },
4191     { MOD_TABLE (MOD_0F382A_PREFIX_2) },
4192   },
4193
4194   /* PREFIX_0F382B */
4195   {
4196     { Bad_Opcode },
4197     { Bad_Opcode },
4198     { "packusdw", { XM, EXx }, PREFIX_OPCODE },
4199   },
4200
4201   /* PREFIX_0F3830 */
4202   {
4203     { Bad_Opcode },
4204     { Bad_Opcode },
4205     { "pmovzxbw", { XM, EXq }, PREFIX_OPCODE },
4206   },
4207
4208   /* PREFIX_0F3831 */
4209   {
4210     { Bad_Opcode },
4211     { Bad_Opcode },
4212     { "pmovzxbd", { XM, EXd }, PREFIX_OPCODE },
4213   },
4214
4215   /* PREFIX_0F3832 */
4216   {
4217     { Bad_Opcode },
4218     { Bad_Opcode },
4219     { "pmovzxbq", { XM, EXw }, PREFIX_OPCODE },
4220   },
4221
4222   /* PREFIX_0F3833 */
4223   {
4224     { Bad_Opcode },
4225     { Bad_Opcode },
4226     { "pmovzxwd", { XM, EXq }, PREFIX_OPCODE },
4227   },
4228
4229   /* PREFIX_0F3834 */
4230   {
4231     { Bad_Opcode },
4232     { Bad_Opcode },
4233     { "pmovzxwq", { XM, EXd }, PREFIX_OPCODE },
4234   },
4235
4236   /* PREFIX_0F3835 */
4237   {
4238     { Bad_Opcode },
4239     { Bad_Opcode },
4240     { "pmovzxdq", { XM, EXq }, PREFIX_OPCODE },
4241   },
4242
4243   /* PREFIX_0F3837 */
4244   {
4245     { Bad_Opcode },
4246     { Bad_Opcode },
4247     { "pcmpgtq", { XM, EXx }, PREFIX_OPCODE },
4248   },
4249
4250   /* PREFIX_0F3838 */
4251   {
4252     { Bad_Opcode },
4253     { Bad_Opcode },
4254     { "pminsb", { XM, EXx }, PREFIX_OPCODE },
4255   },
4256
4257   /* PREFIX_0F3839 */
4258   {
4259     { Bad_Opcode },
4260     { Bad_Opcode },
4261     { "pminsd", { XM, EXx }, PREFIX_OPCODE },
4262   },
4263
4264   /* PREFIX_0F383A */
4265   {
4266     { Bad_Opcode },
4267     { Bad_Opcode },
4268     { "pminuw", { XM, EXx }, PREFIX_OPCODE },
4269   },
4270
4271   /* PREFIX_0F383B */
4272   {
4273     { Bad_Opcode },
4274     { Bad_Opcode },
4275     { "pminud", { XM, EXx }, PREFIX_OPCODE },
4276   },
4277
4278   /* PREFIX_0F383C */
4279   {
4280     { Bad_Opcode },
4281     { Bad_Opcode },
4282     { "pmaxsb", { XM, EXx }, PREFIX_OPCODE },
4283   },
4284
4285   /* PREFIX_0F383D */
4286   {
4287     { Bad_Opcode },
4288     { Bad_Opcode },
4289     { "pmaxsd", { XM, EXx }, PREFIX_OPCODE },
4290   },
4291
4292   /* PREFIX_0F383E */
4293   {
4294     { Bad_Opcode },
4295     { Bad_Opcode },
4296     { "pmaxuw", { XM, EXx }, PREFIX_OPCODE },
4297   },
4298
4299   /* PREFIX_0F383F */
4300   {
4301     { Bad_Opcode },
4302     { Bad_Opcode },
4303     { "pmaxud", { XM, EXx }, PREFIX_OPCODE },
4304   },
4305
4306   /* PREFIX_0F3840 */
4307   {
4308     { Bad_Opcode },
4309     { Bad_Opcode },
4310     { "pmulld", { XM, EXx }, PREFIX_OPCODE },
4311   },
4312
4313   /* PREFIX_0F3841 */
4314   {
4315     { Bad_Opcode },
4316     { Bad_Opcode },
4317     { "phminposuw", { XM, EXx }, PREFIX_OPCODE },
4318   },
4319
4320   /* PREFIX_0F3880 */
4321   {
4322     { Bad_Opcode },
4323     { Bad_Opcode },
4324     { "invept", { Gm, Mo }, PREFIX_OPCODE },
4325   },
4326
4327   /* PREFIX_0F3881 */
4328   {
4329     { Bad_Opcode },
4330     { Bad_Opcode },
4331     { "invvpid", { Gm, Mo }, PREFIX_OPCODE },
4332   },
4333
4334   /* PREFIX_0F3882 */
4335   {
4336     { Bad_Opcode },
4337     { Bad_Opcode },
4338     { "invpcid", { Gm, M }, PREFIX_OPCODE },
4339   },
4340
4341   /* PREFIX_0F38C8 */
4342   {
4343     { "sha1nexte", { XM, EXxmm }, PREFIX_OPCODE },
4344   },
4345
4346   /* PREFIX_0F38C9 */
4347   {
4348     { "sha1msg1", { XM, EXxmm }, PREFIX_OPCODE },
4349   },
4350
4351   /* PREFIX_0F38CA */
4352   {
4353     { "sha1msg2", { XM, EXxmm }, PREFIX_OPCODE },
4354   },
4355
4356   /* PREFIX_0F38CB */
4357   {
4358     { "sha256rnds2", { XM, EXxmm, XMM0 }, PREFIX_OPCODE },
4359   },
4360
4361   /* PREFIX_0F38CC */
4362   {
4363     { "sha256msg1", { XM, EXxmm }, PREFIX_OPCODE },
4364   },
4365
4366   /* PREFIX_0F38CD */
4367   {
4368     { "sha256msg2", { XM, EXxmm }, PREFIX_OPCODE },
4369   },
4370
4371   /* PREFIX_0F38DB */
4372   {
4373     { Bad_Opcode },
4374     { Bad_Opcode },
4375     { "aesimc", { XM, EXx }, PREFIX_OPCODE },
4376   },
4377
4378   /* PREFIX_0F38DC */
4379   {
4380     { Bad_Opcode },
4381     { Bad_Opcode },
4382     { "aesenc", { XM, EXx }, PREFIX_OPCODE },
4383   },
4384
4385   /* PREFIX_0F38DD */
4386   {
4387     { Bad_Opcode },
4388     { Bad_Opcode },
4389     { "aesenclast", { XM, EXx }, PREFIX_OPCODE },
4390   },
4391
4392   /* PREFIX_0F38DE */
4393   {
4394     { Bad_Opcode },
4395     { Bad_Opcode },
4396     { "aesdec", { XM, EXx }, PREFIX_OPCODE },
4397   },
4398
4399   /* PREFIX_0F38DF */
4400   {
4401     { Bad_Opcode },
4402     { Bad_Opcode },
4403     { "aesdeclast", { XM, EXx }, PREFIX_OPCODE },
4404   },
4405
4406   /* PREFIX_0F38F0 */
4407   {
4408     { "movbeS", { Gv, { MOVBE_Fixup, v_mode } }, PREFIX_OPCODE },
4409     { Bad_Opcode },
4410     { "movbeS", { Gv, { MOVBE_Fixup, v_mode } }, PREFIX_OPCODE },
4411     { "crc32",  { Gdq, { CRC32_Fixup, b_mode } }, PREFIX_OPCODE },
4412   },
4413
4414   /* PREFIX_0F38F1 */
4415   {
4416     { "movbeS", { { MOVBE_Fixup, v_mode }, Gv }, PREFIX_OPCODE },
4417     { Bad_Opcode },
4418     { "movbeS", { { MOVBE_Fixup, v_mode }, Gv }, PREFIX_OPCODE },
4419     { "crc32",  { Gdq, { CRC32_Fixup, v_mode } }, PREFIX_OPCODE },
4420   },
4421
4422   /* PREFIX_0F38F6 */
4423   {
4424     { Bad_Opcode },
4425     { "adoxS",  { Gdq, Edq}, PREFIX_OPCODE },
4426     { "adcxS",  { Gdq, Edq}, PREFIX_OPCODE },
4427     { Bad_Opcode },
4428   },
4429
4430   /* PREFIX_0F3A08 */
4431   {
4432     { Bad_Opcode },
4433     { Bad_Opcode },
4434     { "roundps", { XM, EXx, Ib }, PREFIX_OPCODE },
4435   },
4436
4437   /* PREFIX_0F3A09 */
4438   {
4439     { Bad_Opcode },
4440     { Bad_Opcode },
4441     { "roundpd", { XM, EXx, Ib }, PREFIX_OPCODE },
4442   },
4443
4444   /* PREFIX_0F3A0A */
4445   {
4446     { Bad_Opcode },
4447     { Bad_Opcode },
4448     { "roundss", { XM, EXd, Ib }, PREFIX_OPCODE },
4449   },
4450
4451   /* PREFIX_0F3A0B */
4452   {
4453     { Bad_Opcode },
4454     { Bad_Opcode },
4455     { "roundsd", { XM, EXq, Ib }, PREFIX_OPCODE },
4456   },
4457
4458   /* PREFIX_0F3A0C */
4459   {
4460     { Bad_Opcode },
4461     { Bad_Opcode },
4462     { "blendps", { XM, EXx, Ib }, PREFIX_OPCODE },
4463   },
4464
4465   /* PREFIX_0F3A0D */
4466   {
4467     { Bad_Opcode },
4468     { Bad_Opcode },
4469     { "blendpd", { XM, EXx, Ib }, PREFIX_OPCODE },
4470   },
4471
4472   /* PREFIX_0F3A0E */
4473   {
4474     { Bad_Opcode },
4475     { Bad_Opcode },
4476     { "pblendw", { XM, EXx, Ib }, PREFIX_OPCODE },
4477   },
4478
4479   /* PREFIX_0F3A14 */
4480   {
4481     { Bad_Opcode },
4482     { Bad_Opcode },
4483     { "pextrb", { Edqb, XM, Ib }, PREFIX_OPCODE },
4484   },
4485
4486   /* PREFIX_0F3A15 */
4487   {
4488     { Bad_Opcode },
4489     { Bad_Opcode },
4490     { "pextrw", { Edqw, XM, Ib }, PREFIX_OPCODE },
4491   },
4492
4493   /* PREFIX_0F3A16 */
4494   {
4495     { Bad_Opcode },
4496     { Bad_Opcode },
4497     { "pextrK", { Edq, XM, Ib }, PREFIX_OPCODE },
4498   },
4499
4500   /* PREFIX_0F3A17 */
4501   {
4502     { Bad_Opcode },
4503     { Bad_Opcode },
4504     { "extractps", { Edqd, XM, Ib }, PREFIX_OPCODE },
4505   },
4506
4507   /* PREFIX_0F3A20 */
4508   {
4509     { Bad_Opcode },
4510     { Bad_Opcode },
4511     { "pinsrb", { XM, Edqb, Ib }, PREFIX_OPCODE },
4512   },
4513
4514   /* PREFIX_0F3A21 */
4515   {
4516     { Bad_Opcode },
4517     { Bad_Opcode },
4518     { "insertps", { XM, EXd, Ib }, PREFIX_OPCODE },
4519   },
4520
4521   /* PREFIX_0F3A22 */
4522   {
4523     { Bad_Opcode },
4524     { Bad_Opcode },
4525     { "pinsrK", { XM, Edq, Ib }, PREFIX_OPCODE },
4526   },
4527
4528   /* PREFIX_0F3A40 */
4529   {
4530     { Bad_Opcode },
4531     { Bad_Opcode },
4532     { "dpps",   { XM, EXx, Ib }, PREFIX_OPCODE },
4533   },
4534
4535   /* PREFIX_0F3A41 */
4536   {
4537     { Bad_Opcode },
4538     { Bad_Opcode },
4539     { "dppd",   { XM, EXx, Ib }, PREFIX_OPCODE },
4540   },
4541
4542   /* PREFIX_0F3A42 */
4543   {
4544     { Bad_Opcode },
4545     { Bad_Opcode },
4546     { "mpsadbw", { XM, EXx, Ib }, PREFIX_OPCODE },
4547   },
4548
4549   /* PREFIX_0F3A44 */
4550   {
4551     { Bad_Opcode },
4552     { Bad_Opcode },
4553     { "pclmulqdq", { XM, EXx, PCLMUL }, PREFIX_OPCODE },
4554   },
4555
4556   /* PREFIX_0F3A60 */
4557   {
4558     { Bad_Opcode },
4559     { Bad_Opcode },
4560     { "pcmpestrm", { XM, EXx, Ib }, PREFIX_OPCODE },
4561   },
4562
4563   /* PREFIX_0F3A61 */
4564   {
4565     { Bad_Opcode },
4566     { Bad_Opcode },
4567     { "pcmpestri", { XM, EXx, Ib }, PREFIX_OPCODE },
4568   },
4569
4570   /* PREFIX_0F3A62 */
4571   {
4572     { Bad_Opcode },
4573     { Bad_Opcode },
4574     { "pcmpistrm", { XM, EXx, Ib }, PREFIX_OPCODE },
4575   },
4576
4577   /* PREFIX_0F3A63 */
4578   {
4579     { Bad_Opcode },
4580     { Bad_Opcode },
4581     { "pcmpistri", { XM, EXx, Ib }, PREFIX_OPCODE },
4582   },
4583
4584   /* PREFIX_0F3ACC */
4585   {
4586     { "sha1rnds4", { XM, EXxmm, Ib }, PREFIX_OPCODE },
4587   },
4588
4589   /* PREFIX_0F3ADF */
4590   {
4591     { Bad_Opcode },
4592     { Bad_Opcode },
4593     { "aeskeygenassist", { XM, EXx, Ib }, PREFIX_OPCODE },
4594   },
4595
4596   /* PREFIX_VEX_0F10 */
4597   {
4598     { VEX_W_TABLE (VEX_W_0F10_P_0) },
4599     { VEX_LEN_TABLE (VEX_LEN_0F10_P_1) },
4600     { VEX_W_TABLE (VEX_W_0F10_P_2) },
4601     { VEX_LEN_TABLE (VEX_LEN_0F10_P_3) },
4602   },
4603
4604   /* PREFIX_VEX_0F11 */
4605   {
4606     { VEX_W_TABLE (VEX_W_0F11_P_0) },
4607     { VEX_LEN_TABLE (VEX_LEN_0F11_P_1) },
4608     { VEX_W_TABLE (VEX_W_0F11_P_2) },
4609     { VEX_LEN_TABLE (VEX_LEN_0F11_P_3) },
4610   },
4611
4612   /* PREFIX_VEX_0F12 */
4613   {
4614     { MOD_TABLE (MOD_VEX_0F12_PREFIX_0) },
4615     { VEX_W_TABLE (VEX_W_0F12_P_1) },
4616     { VEX_LEN_TABLE (VEX_LEN_0F12_P_2) },
4617     { VEX_W_TABLE (VEX_W_0F12_P_3) },
4618   },
4619
4620   /* PREFIX_VEX_0F16 */
4621   {
4622     { MOD_TABLE (MOD_VEX_0F16_PREFIX_0) },
4623     { VEX_W_TABLE (VEX_W_0F16_P_1) },
4624     { VEX_LEN_TABLE (VEX_LEN_0F16_P_2) },
4625   },
4626
4627   /* PREFIX_VEX_0F2A */
4628   {
4629     { Bad_Opcode },
4630     { VEX_LEN_TABLE (VEX_LEN_0F2A_P_1) },
4631     { Bad_Opcode },
4632     { VEX_LEN_TABLE (VEX_LEN_0F2A_P_3) },
4633   },
4634
4635   /* PREFIX_VEX_0F2C */
4636   {
4637     { Bad_Opcode },
4638     { VEX_LEN_TABLE (VEX_LEN_0F2C_P_1) },
4639     { Bad_Opcode },
4640     { VEX_LEN_TABLE (VEX_LEN_0F2C_P_3) },
4641   },
4642
4643   /* PREFIX_VEX_0F2D */
4644   {
4645     { Bad_Opcode },
4646     { VEX_LEN_TABLE (VEX_LEN_0F2D_P_1) },
4647     { Bad_Opcode },
4648     { VEX_LEN_TABLE (VEX_LEN_0F2D_P_3) },
4649   },
4650
4651   /* PREFIX_VEX_0F2E */
4652   {
4653     { VEX_LEN_TABLE (VEX_LEN_0F2E_P_0) },
4654     { Bad_Opcode },
4655     { VEX_LEN_TABLE (VEX_LEN_0F2E_P_2) },
4656   },
4657
4658   /* PREFIX_VEX_0F2F */
4659   {
4660     { VEX_LEN_TABLE (VEX_LEN_0F2F_P_0) },
4661     { Bad_Opcode },
4662     { VEX_LEN_TABLE (VEX_LEN_0F2F_P_2) },
4663   },
4664
4665   /* PREFIX_VEX_0F41 */
4666   {
4667     { VEX_LEN_TABLE (VEX_LEN_0F41_P_0) },
4668     { Bad_Opcode },
4669     { VEX_LEN_TABLE (VEX_LEN_0F41_P_2) },
4670   },
4671
4672   /* PREFIX_VEX_0F42 */
4673   {
4674     { VEX_LEN_TABLE (VEX_LEN_0F42_P_0) },
4675     { Bad_Opcode },
4676     { VEX_LEN_TABLE (VEX_LEN_0F42_P_2) },
4677   },
4678
4679   /* PREFIX_VEX_0F44 */
4680   {
4681     { VEX_LEN_TABLE (VEX_LEN_0F44_P_0) },
4682     { Bad_Opcode },
4683     { VEX_LEN_TABLE (VEX_LEN_0F44_P_2) },
4684   },
4685
4686   /* PREFIX_VEX_0F45 */
4687   {
4688     { VEX_LEN_TABLE (VEX_LEN_0F45_P_0) },
4689     { Bad_Opcode },
4690     { VEX_LEN_TABLE (VEX_LEN_0F45_P_2) },
4691   },
4692
4693   /* PREFIX_VEX_0F46 */
4694   {
4695     { VEX_LEN_TABLE (VEX_LEN_0F46_P_0) },
4696     { Bad_Opcode },
4697     { VEX_LEN_TABLE (VEX_LEN_0F46_P_2) },
4698   },
4699
4700   /* PREFIX_VEX_0F47 */
4701   {
4702     { VEX_LEN_TABLE (VEX_LEN_0F47_P_0) },
4703     { Bad_Opcode },
4704     { VEX_LEN_TABLE (VEX_LEN_0F47_P_2) },
4705   },
4706
4707   /* PREFIX_VEX_0F4A */
4708   {
4709     { VEX_LEN_TABLE (VEX_LEN_0F4A_P_0) },
4710     { Bad_Opcode },
4711     { VEX_LEN_TABLE (VEX_LEN_0F4A_P_2) },
4712   },
4713
4714   /* PREFIX_VEX_0F4B */
4715   {
4716     { VEX_LEN_TABLE (VEX_LEN_0F4B_P_0) },
4717     { Bad_Opcode },
4718     { VEX_LEN_TABLE (VEX_LEN_0F4B_P_2) },
4719   },
4720
4721   /* PREFIX_VEX_0F51 */
4722   {
4723     { VEX_W_TABLE (VEX_W_0F51_P_0) },
4724     { VEX_LEN_TABLE (VEX_LEN_0F51_P_1) },
4725     { VEX_W_TABLE (VEX_W_0F51_P_2) },
4726     { VEX_LEN_TABLE (VEX_LEN_0F51_P_3) },
4727   },
4728
4729   /* PREFIX_VEX_0F52 */
4730   {
4731     { VEX_W_TABLE (VEX_W_0F52_P_0) },
4732     { VEX_LEN_TABLE (VEX_LEN_0F52_P_1) },
4733   },
4734
4735   /* PREFIX_VEX_0F53 */
4736   {
4737     { VEX_W_TABLE (VEX_W_0F53_P_0) },
4738     { VEX_LEN_TABLE (VEX_LEN_0F53_P_1) },
4739   },
4740
4741   /* PREFIX_VEX_0F58 */
4742   {
4743     { VEX_W_TABLE (VEX_W_0F58_P_0) },
4744     { VEX_LEN_TABLE (VEX_LEN_0F58_P_1) },
4745     { VEX_W_TABLE (VEX_W_0F58_P_2) },
4746     { VEX_LEN_TABLE (VEX_LEN_0F58_P_3) },
4747   },
4748
4749   /* PREFIX_VEX_0F59 */
4750   {
4751     { VEX_W_TABLE (VEX_W_0F59_P_0) },
4752     { VEX_LEN_TABLE (VEX_LEN_0F59_P_1) },
4753     { VEX_W_TABLE (VEX_W_0F59_P_2) },
4754     { VEX_LEN_TABLE (VEX_LEN_0F59_P_3) },
4755   },
4756
4757   /* PREFIX_VEX_0F5A */
4758   {
4759     { VEX_W_TABLE (VEX_W_0F5A_P_0) },
4760     { VEX_LEN_TABLE (VEX_LEN_0F5A_P_1) },
4761     { "vcvtpd2ps%XY", { XMM, EXx }, 0 },
4762     { VEX_LEN_TABLE (VEX_LEN_0F5A_P_3) },
4763   },
4764
4765   /* PREFIX_VEX_0F5B */
4766   {
4767     { VEX_W_TABLE (VEX_W_0F5B_P_0) },
4768     { VEX_W_TABLE (VEX_W_0F5B_P_1) },
4769     { VEX_W_TABLE (VEX_W_0F5B_P_2) },
4770   },
4771
4772   /* PREFIX_VEX_0F5C */
4773   {
4774     { VEX_W_TABLE (VEX_W_0F5C_P_0) },
4775     { VEX_LEN_TABLE (VEX_LEN_0F5C_P_1) },
4776     { VEX_W_TABLE (VEX_W_0F5C_P_2) },
4777     { VEX_LEN_TABLE (VEX_LEN_0F5C_P_3) },
4778   },
4779
4780   /* PREFIX_VEX_0F5D */
4781   {
4782     { VEX_W_TABLE (VEX_W_0F5D_P_0) },
4783     { VEX_LEN_TABLE (VEX_LEN_0F5D_P_1) },
4784     { VEX_W_TABLE (VEX_W_0F5D_P_2) },
4785     { VEX_LEN_TABLE (VEX_LEN_0F5D_P_3) },
4786   },
4787
4788   /* PREFIX_VEX_0F5E */
4789   {
4790     { VEX_W_TABLE (VEX_W_0F5E_P_0) },
4791     { VEX_LEN_TABLE (VEX_LEN_0F5E_P_1) },
4792     { VEX_W_TABLE (VEX_W_0F5E_P_2) },
4793     { VEX_LEN_TABLE (VEX_LEN_0F5E_P_3) },
4794   },
4795
4796   /* PREFIX_VEX_0F5F */
4797   {
4798     { VEX_W_TABLE (VEX_W_0F5F_P_0) },
4799     { VEX_LEN_TABLE (VEX_LEN_0F5F_P_1) },
4800     { VEX_W_TABLE (VEX_W_0F5F_P_2) },
4801     { VEX_LEN_TABLE (VEX_LEN_0F5F_P_3) },
4802   },
4803
4804   /* PREFIX_VEX_0F60 */
4805   {
4806     { Bad_Opcode },
4807     { Bad_Opcode },
4808     { VEX_W_TABLE (VEX_W_0F60_P_2) },
4809   },
4810
4811   /* PREFIX_VEX_0F61 */
4812   {
4813     { Bad_Opcode },
4814     { Bad_Opcode },
4815     { VEX_W_TABLE (VEX_W_0F61_P_2) },
4816   },
4817
4818   /* PREFIX_VEX_0F62 */
4819   {
4820     { Bad_Opcode },
4821     { Bad_Opcode },
4822     { VEX_W_TABLE (VEX_W_0F62_P_2) },
4823   },
4824
4825   /* PREFIX_VEX_0F63 */
4826   {
4827     { Bad_Opcode },
4828     { Bad_Opcode },
4829     { VEX_W_TABLE (VEX_W_0F63_P_2) },
4830   },
4831
4832   /* PREFIX_VEX_0F64 */
4833   {
4834     { Bad_Opcode },
4835     { Bad_Opcode },
4836     { VEX_W_TABLE (VEX_W_0F64_P_2) },
4837   },
4838
4839   /* PREFIX_VEX_0F65 */
4840   {
4841     { Bad_Opcode },
4842     { Bad_Opcode },
4843     { VEX_W_TABLE (VEX_W_0F65_P_2) },
4844   },
4845
4846   /* PREFIX_VEX_0F66 */
4847   {
4848     { Bad_Opcode },
4849     { Bad_Opcode },
4850     { VEX_W_TABLE (VEX_W_0F66_P_2) },
4851   },
4852
4853   /* PREFIX_VEX_0F67 */
4854   {
4855     { Bad_Opcode },
4856     { Bad_Opcode },
4857     { VEX_W_TABLE (VEX_W_0F67_P_2) },
4858   },
4859
4860   /* PREFIX_VEX_0F68 */
4861   {
4862     { Bad_Opcode },
4863     { Bad_Opcode },
4864     { VEX_W_TABLE (VEX_W_0F68_P_2) },
4865   },
4866
4867   /* PREFIX_VEX_0F69 */
4868   {
4869     { Bad_Opcode },
4870     { Bad_Opcode },
4871     { VEX_W_TABLE (VEX_W_0F69_P_2) },
4872   },
4873
4874   /* PREFIX_VEX_0F6A */
4875   {
4876     { Bad_Opcode },
4877     { Bad_Opcode },
4878     { VEX_W_TABLE (VEX_W_0F6A_P_2) },
4879   },
4880
4881   /* PREFIX_VEX_0F6B */
4882   {
4883     { Bad_Opcode },
4884     { Bad_Opcode },
4885     { VEX_W_TABLE (VEX_W_0F6B_P_2) },
4886   },
4887
4888   /* PREFIX_VEX_0F6C */
4889   {
4890     { Bad_Opcode },
4891     { Bad_Opcode },
4892     { VEX_W_TABLE (VEX_W_0F6C_P_2) },
4893   },
4894
4895   /* PREFIX_VEX_0F6D */
4896   {
4897     { Bad_Opcode },
4898     { Bad_Opcode },
4899     { VEX_W_TABLE (VEX_W_0F6D_P_2) },
4900   },
4901
4902   /* PREFIX_VEX_0F6E */
4903   {
4904     { Bad_Opcode },
4905     { Bad_Opcode },
4906     { VEX_LEN_TABLE (VEX_LEN_0F6E_P_2) },
4907   },
4908
4909   /* PREFIX_VEX_0F6F */
4910   {
4911     { Bad_Opcode },
4912     { VEX_W_TABLE (VEX_W_0F6F_P_1) },
4913     { VEX_W_TABLE (VEX_W_0F6F_P_2) },
4914   },
4915
4916   /* PREFIX_VEX_0F70 */
4917   {
4918     { Bad_Opcode },
4919     { VEX_W_TABLE (VEX_W_0F70_P_1) },
4920     { VEX_W_TABLE (VEX_W_0F70_P_2) },
4921     { VEX_W_TABLE (VEX_W_0F70_P_3) },
4922   },
4923
4924   /* PREFIX_VEX_0F71_REG_2 */
4925   {
4926     { Bad_Opcode },
4927     { Bad_Opcode },
4928     { VEX_W_TABLE (VEX_W_0F71_R_2_P_2) },
4929   },
4930
4931   /* PREFIX_VEX_0F71_REG_4 */
4932   {
4933     { Bad_Opcode },
4934     { Bad_Opcode },
4935     { VEX_W_TABLE (VEX_W_0F71_R_4_P_2) },
4936   },
4937
4938   /* PREFIX_VEX_0F71_REG_6 */
4939   {
4940     { Bad_Opcode },
4941     { Bad_Opcode },
4942     { VEX_W_TABLE (VEX_W_0F71_R_6_P_2) },
4943   },
4944
4945   /* PREFIX_VEX_0F72_REG_2 */
4946   {
4947     { Bad_Opcode },
4948     { Bad_Opcode },
4949     { VEX_W_TABLE (VEX_W_0F72_R_2_P_2) },
4950   },
4951
4952   /* PREFIX_VEX_0F72_REG_4 */
4953   {
4954     { Bad_Opcode },
4955     { Bad_Opcode },
4956     { VEX_W_TABLE (VEX_W_0F72_R_4_P_2) },
4957   },
4958
4959   /* PREFIX_VEX_0F72_REG_6 */
4960   {
4961     { Bad_Opcode },
4962     { Bad_Opcode },
4963     { VEX_W_TABLE (VEX_W_0F72_R_6_P_2) },
4964   },
4965
4966   /* PREFIX_VEX_0F73_REG_2 */
4967   {
4968     { Bad_Opcode },
4969     { Bad_Opcode },
4970     { VEX_W_TABLE (VEX_W_0F73_R_2_P_2) },
4971   },
4972
4973   /* PREFIX_VEX_0F73_REG_3 */
4974   {
4975     { Bad_Opcode },
4976     { Bad_Opcode },
4977     { VEX_W_TABLE (VEX_W_0F73_R_3_P_2) },
4978   },
4979
4980   /* PREFIX_VEX_0F73_REG_6 */
4981   {
4982     { Bad_Opcode },
4983     { Bad_Opcode },
4984     { VEX_W_TABLE (VEX_W_0F73_R_6_P_2) },
4985   },
4986
4987   /* PREFIX_VEX_0F73_REG_7 */
4988   {
4989     { Bad_Opcode },
4990     { Bad_Opcode },
4991     { VEX_W_TABLE (VEX_W_0F73_R_7_P_2) },
4992   },
4993
4994   /* PREFIX_VEX_0F74 */
4995   {
4996     { Bad_Opcode },
4997     { Bad_Opcode },
4998     { VEX_W_TABLE (VEX_W_0F74_P_2) },
4999   },
5000
5001   /* PREFIX_VEX_0F75 */
5002   {
5003     { Bad_Opcode },
5004     { Bad_Opcode },
5005     { VEX_W_TABLE (VEX_W_0F75_P_2) },
5006   },
5007
5008   /* PREFIX_VEX_0F76 */
5009   {
5010     { Bad_Opcode },
5011     { Bad_Opcode },
5012     { VEX_W_TABLE (VEX_W_0F76_P_2) },
5013   },
5014
5015   /* PREFIX_VEX_0F77 */
5016   {
5017     { VEX_W_TABLE (VEX_W_0F77_P_0) },
5018   },
5019
5020   /* PREFIX_VEX_0F7C */
5021   {
5022     { Bad_Opcode },
5023     { Bad_Opcode },
5024     { VEX_W_TABLE (VEX_W_0F7C_P_2) },
5025     { VEX_W_TABLE (VEX_W_0F7C_P_3) },
5026   },
5027
5028   /* PREFIX_VEX_0F7D */
5029   {
5030     { Bad_Opcode },
5031     { Bad_Opcode },
5032     { VEX_W_TABLE (VEX_W_0F7D_P_2) },
5033     { VEX_W_TABLE (VEX_W_0F7D_P_3) },
5034   },
5035
5036   /* PREFIX_VEX_0F7E */
5037   {
5038     { Bad_Opcode },
5039     { VEX_LEN_TABLE (VEX_LEN_0F7E_P_1) },
5040     { VEX_LEN_TABLE (VEX_LEN_0F7E_P_2) },
5041   },
5042
5043   /* PREFIX_VEX_0F7F */
5044   {
5045     { Bad_Opcode },
5046     { VEX_W_TABLE (VEX_W_0F7F_P_1) },
5047     { VEX_W_TABLE (VEX_W_0F7F_P_2) },
5048   },
5049
5050   /* PREFIX_VEX_0F90 */
5051   {
5052     { VEX_LEN_TABLE (VEX_LEN_0F90_P_0) },
5053     { Bad_Opcode },
5054     { VEX_LEN_TABLE (VEX_LEN_0F90_P_2) },
5055   },
5056
5057   /* PREFIX_VEX_0F91 */
5058   {
5059     { VEX_LEN_TABLE (VEX_LEN_0F91_P_0) },
5060     { Bad_Opcode },
5061     { VEX_LEN_TABLE (VEX_LEN_0F91_P_2) },
5062   },
5063
5064   /* PREFIX_VEX_0F92 */
5065   {
5066     { VEX_LEN_TABLE (VEX_LEN_0F92_P_0) },
5067     { Bad_Opcode },
5068     { VEX_LEN_TABLE (VEX_LEN_0F92_P_2) },
5069     { VEX_LEN_TABLE (VEX_LEN_0F92_P_3) },
5070   },
5071
5072   /* PREFIX_VEX_0F93 */
5073   {
5074     { VEX_LEN_TABLE (VEX_LEN_0F93_P_0) },
5075     { Bad_Opcode },
5076     { VEX_LEN_TABLE (VEX_LEN_0F93_P_2) },
5077     { VEX_LEN_TABLE (VEX_LEN_0F93_P_3) },
5078   },
5079
5080   /* PREFIX_VEX_0F98 */
5081   {
5082     { VEX_LEN_TABLE (VEX_LEN_0F98_P_0) },
5083     { Bad_Opcode },
5084     { VEX_LEN_TABLE (VEX_LEN_0F98_P_2) },
5085   },
5086
5087   /* PREFIX_VEX_0F99 */
5088   {
5089     { VEX_LEN_TABLE (VEX_LEN_0F99_P_0) },
5090     { Bad_Opcode },
5091     { VEX_LEN_TABLE (VEX_LEN_0F99_P_2) },
5092   },
5093
5094   /* PREFIX_VEX_0FC2 */
5095   {
5096     { VEX_W_TABLE (VEX_W_0FC2_P_0) },
5097     { VEX_LEN_TABLE (VEX_LEN_0FC2_P_1) },
5098     { VEX_W_TABLE (VEX_W_0FC2_P_2) },
5099     { VEX_LEN_TABLE (VEX_LEN_0FC2_P_3) },
5100   },
5101
5102   /* PREFIX_VEX_0FC4 */
5103   {
5104     { Bad_Opcode },
5105     { Bad_Opcode },
5106     { VEX_LEN_TABLE (VEX_LEN_0FC4_P_2) },
5107   },
5108
5109   /* PREFIX_VEX_0FC5 */
5110   {
5111     { Bad_Opcode },
5112     { Bad_Opcode },
5113     { VEX_LEN_TABLE (VEX_LEN_0FC5_P_2) },
5114   },
5115
5116   /* PREFIX_VEX_0FD0 */
5117   {
5118     { Bad_Opcode },
5119     { Bad_Opcode },
5120     { VEX_W_TABLE (VEX_W_0FD0_P_2) },
5121     { VEX_W_TABLE (VEX_W_0FD0_P_3) },
5122   },
5123
5124   /* PREFIX_VEX_0FD1 */
5125   {
5126     { Bad_Opcode },
5127     { Bad_Opcode },
5128     { VEX_W_TABLE (VEX_W_0FD1_P_2) },
5129   },
5130
5131   /* PREFIX_VEX_0FD2 */
5132   {
5133     { Bad_Opcode },
5134     { Bad_Opcode },
5135     { VEX_W_TABLE (VEX_W_0FD2_P_2) },
5136   },
5137
5138   /* PREFIX_VEX_0FD3 */
5139   {
5140     { Bad_Opcode },
5141     { Bad_Opcode },
5142     { VEX_W_TABLE (VEX_W_0FD3_P_2) },
5143   },
5144
5145   /* PREFIX_VEX_0FD4 */
5146   {
5147     { Bad_Opcode },
5148     { Bad_Opcode },
5149     { VEX_W_TABLE (VEX_W_0FD4_P_2) },
5150   },
5151
5152   /* PREFIX_VEX_0FD5 */
5153   {
5154     { Bad_Opcode },
5155     { Bad_Opcode },
5156     { VEX_W_TABLE (VEX_W_0FD5_P_2) },
5157   },
5158
5159   /* PREFIX_VEX_0FD6 */
5160   {
5161     { Bad_Opcode },
5162     { Bad_Opcode },
5163     { VEX_LEN_TABLE (VEX_LEN_0FD6_P_2) },
5164   },
5165
5166   /* PREFIX_VEX_0FD7 */
5167   {
5168     { Bad_Opcode },
5169     { Bad_Opcode },
5170     { MOD_TABLE (MOD_VEX_0FD7_PREFIX_2) },
5171   },
5172
5173   /* PREFIX_VEX_0FD8 */
5174   {
5175     { Bad_Opcode },
5176     { Bad_Opcode },
5177     { VEX_W_TABLE (VEX_W_0FD8_P_2) },
5178   },
5179
5180   /* PREFIX_VEX_0FD9 */
5181   {
5182     { Bad_Opcode },
5183     { Bad_Opcode },
5184     { VEX_W_TABLE (VEX_W_0FD9_P_2) },
5185   },
5186
5187   /* PREFIX_VEX_0FDA */
5188   {
5189     { Bad_Opcode },
5190     { Bad_Opcode },
5191     { VEX_W_TABLE (VEX_W_0FDA_P_2) },
5192   },
5193
5194   /* PREFIX_VEX_0FDB */
5195   {
5196     { Bad_Opcode },
5197     { Bad_Opcode },
5198     { VEX_W_TABLE (VEX_W_0FDB_P_2) },
5199   },
5200
5201   /* PREFIX_VEX_0FDC */
5202   {
5203     { Bad_Opcode },
5204     { Bad_Opcode },
5205     { VEX_W_TABLE (VEX_W_0FDC_P_2) },
5206   },
5207
5208   /* PREFIX_VEX_0FDD */
5209   {
5210     { Bad_Opcode },
5211     { Bad_Opcode },
5212     { VEX_W_TABLE (VEX_W_0FDD_P_2) },
5213   },
5214
5215   /* PREFIX_VEX_0FDE */
5216   {
5217     { Bad_Opcode },
5218     { Bad_Opcode },
5219     { VEX_W_TABLE (VEX_W_0FDE_P_2) },
5220   },
5221
5222   /* PREFIX_VEX_0FDF */
5223   {
5224     { Bad_Opcode },
5225     { Bad_Opcode },
5226     { VEX_W_TABLE (VEX_W_0FDF_P_2) },
5227   },
5228
5229   /* PREFIX_VEX_0FE0 */
5230   {
5231     { Bad_Opcode },
5232     { Bad_Opcode },
5233     { VEX_W_TABLE (VEX_W_0FE0_P_2) },
5234   },
5235
5236   /* PREFIX_VEX_0FE1 */
5237   {
5238     { Bad_Opcode },
5239     { Bad_Opcode },
5240     { VEX_W_TABLE (VEX_W_0FE1_P_2) },
5241   },
5242
5243   /* PREFIX_VEX_0FE2 */
5244   {
5245     { Bad_Opcode },
5246     { Bad_Opcode },
5247     { VEX_W_TABLE (VEX_W_0FE2_P_2) },
5248   },
5249
5250   /* PREFIX_VEX_0FE3 */
5251   {
5252     { Bad_Opcode },
5253     { Bad_Opcode },
5254     { VEX_W_TABLE (VEX_W_0FE3_P_2) },
5255   },
5256
5257   /* PREFIX_VEX_0FE4 */
5258   {
5259     { Bad_Opcode },
5260     { Bad_Opcode },
5261     { VEX_W_TABLE (VEX_W_0FE4_P_2) },
5262   },
5263
5264   /* PREFIX_VEX_0FE5 */
5265   {
5266     { Bad_Opcode },
5267     { Bad_Opcode },
5268     { VEX_W_TABLE (VEX_W_0FE5_P_2) },
5269   },
5270
5271   /* PREFIX_VEX_0FE6 */
5272   {
5273     { Bad_Opcode },
5274     { VEX_W_TABLE (VEX_W_0FE6_P_1) },
5275     { VEX_W_TABLE (VEX_W_0FE6_P_2) },
5276     { VEX_W_TABLE (VEX_W_0FE6_P_3) },
5277   },
5278
5279   /* PREFIX_VEX_0FE7 */
5280   {
5281     { Bad_Opcode },
5282     { Bad_Opcode },
5283     { MOD_TABLE (MOD_VEX_0FE7_PREFIX_2) },
5284   },
5285
5286   /* PREFIX_VEX_0FE8 */
5287   {
5288     { Bad_Opcode },
5289     { Bad_Opcode },
5290     { VEX_W_TABLE (VEX_W_0FE8_P_2) },
5291   },
5292
5293   /* PREFIX_VEX_0FE9 */
5294   {
5295     { Bad_Opcode },
5296     { Bad_Opcode },
5297     { VEX_W_TABLE (VEX_W_0FE9_P_2) },
5298   },
5299
5300   /* PREFIX_VEX_0FEA */
5301   {
5302     { Bad_Opcode },
5303     { Bad_Opcode },
5304     { VEX_W_TABLE (VEX_W_0FEA_P_2) },
5305   },
5306
5307   /* PREFIX_VEX_0FEB */
5308   {
5309     { Bad_Opcode },
5310     { Bad_Opcode },
5311     { VEX_W_TABLE (VEX_W_0FEB_P_2) },
5312   },
5313
5314   /* PREFIX_VEX_0FEC */
5315   {
5316     { Bad_Opcode },
5317     { Bad_Opcode },
5318     { VEX_W_TABLE (VEX_W_0FEC_P_2) },
5319   },
5320
5321   /* PREFIX_VEX_0FED */
5322   {
5323     { Bad_Opcode },
5324     { Bad_Opcode },
5325     { VEX_W_TABLE (VEX_W_0FED_P_2) },
5326   },
5327
5328   /* PREFIX_VEX_0FEE */
5329   {
5330     { Bad_Opcode },
5331     { Bad_Opcode },
5332     { VEX_W_TABLE (VEX_W_0FEE_P_2) },
5333   },
5334
5335   /* PREFIX_VEX_0FEF */
5336   {
5337     { Bad_Opcode },
5338     { Bad_Opcode },
5339     { VEX_W_TABLE (VEX_W_0FEF_P_2) },
5340   },
5341
5342   /* PREFIX_VEX_0FF0 */
5343   {
5344     { Bad_Opcode },
5345     { Bad_Opcode },
5346     { Bad_Opcode },
5347     { MOD_TABLE (MOD_VEX_0FF0_PREFIX_3) },
5348   },
5349
5350   /* PREFIX_VEX_0FF1 */
5351   {
5352     { Bad_Opcode },
5353     { Bad_Opcode },
5354     { VEX_W_TABLE (VEX_W_0FF1_P_2) },
5355   },
5356
5357   /* PREFIX_VEX_0FF2 */
5358   {
5359     { Bad_Opcode },
5360     { Bad_Opcode },
5361     { VEX_W_TABLE (VEX_W_0FF2_P_2) },
5362   },
5363
5364   /* PREFIX_VEX_0FF3 */
5365   {
5366     { Bad_Opcode },
5367     { Bad_Opcode },
5368     { VEX_W_TABLE (VEX_W_0FF3_P_2) },
5369   },
5370
5371   /* PREFIX_VEX_0FF4 */
5372   {
5373     { Bad_Opcode },
5374     { Bad_Opcode },
5375     { VEX_W_TABLE (VEX_W_0FF4_P_2) },
5376   },
5377
5378   /* PREFIX_VEX_0FF5 */
5379   {
5380     { Bad_Opcode },
5381     { Bad_Opcode },
5382     { VEX_W_TABLE (VEX_W_0FF5_P_2) },
5383   },
5384
5385   /* PREFIX_VEX_0FF6 */
5386   {
5387     { Bad_Opcode },
5388     { Bad_Opcode },
5389     { VEX_W_TABLE (VEX_W_0FF6_P_2) },
5390   },
5391
5392   /* PREFIX_VEX_0FF7 */
5393   {
5394     { Bad_Opcode },
5395     { Bad_Opcode },
5396     { VEX_LEN_TABLE (VEX_LEN_0FF7_P_2) },
5397   },
5398
5399   /* PREFIX_VEX_0FF8 */
5400   {
5401     { Bad_Opcode },
5402     { Bad_Opcode },
5403     { VEX_W_TABLE (VEX_W_0FF8_P_2) },
5404   },
5405
5406   /* PREFIX_VEX_0FF9 */
5407   {
5408     { Bad_Opcode },
5409     { Bad_Opcode },
5410     { VEX_W_TABLE (VEX_W_0FF9_P_2) },
5411   },
5412
5413   /* PREFIX_VEX_0FFA */
5414   {
5415     { Bad_Opcode },
5416     { Bad_Opcode },
5417     { VEX_W_TABLE (VEX_W_0FFA_P_2) },
5418   },
5419
5420   /* PREFIX_VEX_0FFB */
5421   {
5422     { Bad_Opcode },
5423     { Bad_Opcode },
5424     { VEX_W_TABLE (VEX_W_0FFB_P_2) },
5425   },
5426
5427   /* PREFIX_VEX_0FFC */
5428   {
5429     { Bad_Opcode },
5430     { Bad_Opcode },
5431     { VEX_W_TABLE (VEX_W_0FFC_P_2) },
5432   },
5433
5434   /* PREFIX_VEX_0FFD */
5435   {
5436     { Bad_Opcode },
5437     { Bad_Opcode },
5438     { VEX_W_TABLE (VEX_W_0FFD_P_2) },
5439   },
5440
5441   /* PREFIX_VEX_0FFE */
5442   {
5443     { Bad_Opcode },
5444     { Bad_Opcode },
5445     { VEX_W_TABLE (VEX_W_0FFE_P_2) },
5446   },
5447
5448   /* PREFIX_VEX_0F3800 */
5449   {
5450     { Bad_Opcode },
5451     { Bad_Opcode },
5452     { VEX_W_TABLE (VEX_W_0F3800_P_2) },
5453   },
5454
5455   /* PREFIX_VEX_0F3801 */
5456   {
5457     { Bad_Opcode },
5458     { Bad_Opcode },
5459     { VEX_W_TABLE (VEX_W_0F3801_P_2) },
5460   },
5461
5462   /* PREFIX_VEX_0F3802 */
5463   {
5464     { Bad_Opcode },
5465     { Bad_Opcode },
5466     { VEX_W_TABLE (VEX_W_0F3802_P_2) },
5467   },
5468
5469   /* PREFIX_VEX_0F3803 */
5470   {
5471     { Bad_Opcode },
5472     { Bad_Opcode },
5473     { VEX_W_TABLE (VEX_W_0F3803_P_2) },
5474   },
5475
5476   /* PREFIX_VEX_0F3804 */
5477   {
5478     { Bad_Opcode },
5479     { Bad_Opcode },
5480     { VEX_W_TABLE (VEX_W_0F3804_P_2) },
5481   },
5482
5483   /* PREFIX_VEX_0F3805 */
5484   {
5485     { Bad_Opcode },
5486     { Bad_Opcode },
5487     { VEX_W_TABLE (VEX_W_0F3805_P_2) },
5488   },
5489
5490   /* PREFIX_VEX_0F3806 */
5491   {
5492     { Bad_Opcode },
5493     { Bad_Opcode },
5494     { VEX_W_TABLE (VEX_W_0F3806_P_2) },
5495   },
5496
5497   /* PREFIX_VEX_0F3807 */
5498   {
5499     { Bad_Opcode },
5500     { Bad_Opcode },
5501     { VEX_W_TABLE (VEX_W_0F3807_P_2) },
5502   },
5503
5504   /* PREFIX_VEX_0F3808 */
5505   {
5506     { Bad_Opcode },
5507     { Bad_Opcode },
5508     { VEX_W_TABLE (VEX_W_0F3808_P_2) },
5509   },
5510
5511   /* PREFIX_VEX_0F3809 */
5512   {
5513     { Bad_Opcode },
5514     { Bad_Opcode },
5515     { VEX_W_TABLE (VEX_W_0F3809_P_2) },
5516   },
5517
5518   /* PREFIX_VEX_0F380A */
5519   {
5520     { Bad_Opcode },
5521     { Bad_Opcode },
5522     { VEX_W_TABLE (VEX_W_0F380A_P_2) },
5523   },
5524
5525   /* PREFIX_VEX_0F380B */
5526   {
5527     { Bad_Opcode },
5528     { Bad_Opcode },
5529     { VEX_W_TABLE (VEX_W_0F380B_P_2) },
5530   },
5531
5532   /* PREFIX_VEX_0F380C */
5533   {
5534     { Bad_Opcode },
5535     { Bad_Opcode },
5536     { VEX_W_TABLE (VEX_W_0F380C_P_2) },
5537   },
5538
5539   /* PREFIX_VEX_0F380D */
5540   {
5541     { Bad_Opcode },
5542     { Bad_Opcode },
5543     { VEX_W_TABLE (VEX_W_0F380D_P_2) },
5544   },
5545
5546   /* PREFIX_VEX_0F380E */
5547   {
5548     { Bad_Opcode },
5549     { Bad_Opcode },
5550     { VEX_W_TABLE (VEX_W_0F380E_P_2) },
5551   },
5552
5553   /* PREFIX_VEX_0F380F */
5554   {
5555     { Bad_Opcode },
5556     { Bad_Opcode },
5557     { VEX_W_TABLE (VEX_W_0F380F_P_2) },
5558   },
5559
5560   /* PREFIX_VEX_0F3813 */
5561   {
5562     { Bad_Opcode },
5563     { Bad_Opcode },
5564     { "vcvtph2ps", { XM, EXxmmq }, 0 },
5565   },
5566
5567   /* PREFIX_VEX_0F3816 */
5568   {
5569     { Bad_Opcode },
5570     { Bad_Opcode },
5571     { VEX_LEN_TABLE (VEX_LEN_0F3816_P_2) },
5572   },
5573
5574   /* PREFIX_VEX_0F3817 */
5575   {
5576     { Bad_Opcode },
5577     { Bad_Opcode },
5578     { VEX_W_TABLE (VEX_W_0F3817_P_2) },
5579   },
5580
5581   /* PREFIX_VEX_0F3818 */
5582   {
5583     { Bad_Opcode },
5584     { Bad_Opcode },
5585     { VEX_W_TABLE (VEX_W_0F3818_P_2) },
5586   },
5587
5588   /* PREFIX_VEX_0F3819 */
5589   {
5590     { Bad_Opcode },
5591     { Bad_Opcode },
5592     { VEX_LEN_TABLE (VEX_LEN_0F3819_P_2) },
5593   },
5594
5595   /* PREFIX_VEX_0F381A */
5596   {
5597     { Bad_Opcode },
5598     { Bad_Opcode },
5599     { MOD_TABLE (MOD_VEX_0F381A_PREFIX_2) },
5600   },
5601
5602   /* PREFIX_VEX_0F381C */
5603   {
5604     { Bad_Opcode },
5605     { Bad_Opcode },
5606     { VEX_W_TABLE (VEX_W_0F381C_P_2) },
5607   },
5608
5609   /* PREFIX_VEX_0F381D */
5610   {
5611     { Bad_Opcode },
5612     { Bad_Opcode },
5613     { VEX_W_TABLE (VEX_W_0F381D_P_2) },
5614   },
5615
5616   /* PREFIX_VEX_0F381E */
5617   {
5618     { Bad_Opcode },
5619     { Bad_Opcode },
5620     { VEX_W_TABLE (VEX_W_0F381E_P_2) },
5621   },
5622
5623   /* PREFIX_VEX_0F3820 */
5624   {
5625     { Bad_Opcode },
5626     { Bad_Opcode },
5627     { VEX_W_TABLE (VEX_W_0F3820_P_2) },
5628   },
5629
5630   /* PREFIX_VEX_0F3821 */
5631   {
5632     { Bad_Opcode },
5633     { Bad_Opcode },
5634     { VEX_W_TABLE (VEX_W_0F3821_P_2) },
5635   },
5636
5637   /* PREFIX_VEX_0F3822 */
5638   {
5639     { Bad_Opcode },
5640     { Bad_Opcode },
5641     { VEX_W_TABLE (VEX_W_0F3822_P_2) },
5642   },
5643
5644   /* PREFIX_VEX_0F3823 */
5645   {
5646     { Bad_Opcode },
5647     { Bad_Opcode },
5648     { VEX_W_TABLE (VEX_W_0F3823_P_2) },
5649   },
5650
5651   /* PREFIX_VEX_0F3824 */
5652   {
5653     { Bad_Opcode },
5654     { Bad_Opcode },
5655     { VEX_W_TABLE (VEX_W_0F3824_P_2) },
5656   },
5657
5658   /* PREFIX_VEX_0F3825 */
5659   {
5660     { Bad_Opcode },
5661     { Bad_Opcode },
5662     { VEX_W_TABLE (VEX_W_0F3825_P_2) },
5663   },
5664
5665   /* PREFIX_VEX_0F3828 */
5666   {
5667     { Bad_Opcode },
5668     { Bad_Opcode },
5669     { VEX_W_TABLE (VEX_W_0F3828_P_2) },
5670   },
5671
5672   /* PREFIX_VEX_0F3829 */
5673   {
5674     { Bad_Opcode },
5675     { Bad_Opcode },
5676     { VEX_W_TABLE (VEX_W_0F3829_P_2) },
5677   },
5678
5679   /* PREFIX_VEX_0F382A */
5680   {
5681     { Bad_Opcode },
5682     { Bad_Opcode },
5683     { MOD_TABLE (MOD_VEX_0F382A_PREFIX_2) },
5684   },
5685
5686   /* PREFIX_VEX_0F382B */
5687   {
5688     { Bad_Opcode },
5689     { Bad_Opcode },
5690     { VEX_W_TABLE (VEX_W_0F382B_P_2) },
5691   },
5692
5693   /* PREFIX_VEX_0F382C */
5694   {
5695     { Bad_Opcode },
5696     { Bad_Opcode },
5697      { MOD_TABLE (MOD_VEX_0F382C_PREFIX_2) },
5698   },
5699
5700   /* PREFIX_VEX_0F382D */
5701   {
5702     { Bad_Opcode },
5703     { Bad_Opcode },
5704      { MOD_TABLE (MOD_VEX_0F382D_PREFIX_2) },
5705   },
5706
5707   /* PREFIX_VEX_0F382E */
5708   {
5709     { Bad_Opcode },
5710     { Bad_Opcode },
5711      { MOD_TABLE (MOD_VEX_0F382E_PREFIX_2) },
5712   },
5713
5714   /* PREFIX_VEX_0F382F */
5715   {
5716     { Bad_Opcode },
5717     { Bad_Opcode },
5718      { MOD_TABLE (MOD_VEX_0F382F_PREFIX_2) },
5719   },
5720
5721   /* PREFIX_VEX_0F3830 */
5722   {
5723     { Bad_Opcode },
5724     { Bad_Opcode },
5725     { VEX_W_TABLE (VEX_W_0F3830_P_2) },
5726   },
5727
5728   /* PREFIX_VEX_0F3831 */
5729   {
5730     { Bad_Opcode },
5731     { Bad_Opcode },
5732     { VEX_W_TABLE (VEX_W_0F3831_P_2) },
5733   },
5734
5735   /* PREFIX_VEX_0F3832 */
5736   {
5737     { Bad_Opcode },
5738     { Bad_Opcode },
5739     { VEX_W_TABLE (VEX_W_0F3832_P_2) },
5740   },
5741
5742   /* PREFIX_VEX_0F3833 */
5743   {
5744     { Bad_Opcode },
5745     { Bad_Opcode },
5746     { VEX_W_TABLE (VEX_W_0F3833_P_2) },
5747   },
5748
5749   /* PREFIX_VEX_0F3834 */
5750   {
5751     { Bad_Opcode },
5752     { Bad_Opcode },
5753     { VEX_W_TABLE (VEX_W_0F3834_P_2) },
5754   },
5755
5756   /* PREFIX_VEX_0F3835 */
5757   {
5758     { Bad_Opcode },
5759     { Bad_Opcode },
5760     { VEX_W_TABLE (VEX_W_0F3835_P_2) },
5761   },
5762
5763   /* PREFIX_VEX_0F3836 */
5764   {
5765     { Bad_Opcode },
5766     { Bad_Opcode },
5767     { VEX_LEN_TABLE (VEX_LEN_0F3836_P_2) },
5768   },
5769
5770   /* PREFIX_VEX_0F3837 */
5771   {
5772     { Bad_Opcode },
5773     { Bad_Opcode },
5774     { VEX_W_TABLE (VEX_W_0F3837_P_2) },
5775   },
5776
5777   /* PREFIX_VEX_0F3838 */
5778   {
5779     { Bad_Opcode },
5780     { Bad_Opcode },
5781     { VEX_W_TABLE (VEX_W_0F3838_P_2) },
5782   },
5783
5784   /* PREFIX_VEX_0F3839 */
5785   {
5786     { Bad_Opcode },
5787     { Bad_Opcode },
5788     { VEX_W_TABLE (VEX_W_0F3839_P_2) },
5789   },
5790
5791   /* PREFIX_VEX_0F383A */
5792   {
5793     { Bad_Opcode },
5794     { Bad_Opcode },
5795     { VEX_W_TABLE (VEX_W_0F383A_P_2) },
5796   },
5797
5798   /* PREFIX_VEX_0F383B */
5799   {
5800     { Bad_Opcode },
5801     { Bad_Opcode },
5802     { VEX_W_TABLE (VEX_W_0F383B_P_2) },
5803   },
5804
5805   /* PREFIX_VEX_0F383C */
5806   {
5807     { Bad_Opcode },
5808     { Bad_Opcode },
5809     { VEX_W_TABLE (VEX_W_0F383C_P_2) },
5810   },
5811
5812   /* PREFIX_VEX_0F383D */
5813   {
5814     { Bad_Opcode },
5815     { Bad_Opcode },
5816     { VEX_W_TABLE (VEX_W_0F383D_P_2) },
5817   },
5818
5819   /* PREFIX_VEX_0F383E */
5820   {
5821     { Bad_Opcode },
5822     { Bad_Opcode },
5823     { VEX_W_TABLE (VEX_W_0F383E_P_2) },
5824   },
5825
5826   /* PREFIX_VEX_0F383F */
5827   {
5828     { Bad_Opcode },
5829     { Bad_Opcode },
5830     { VEX_W_TABLE (VEX_W_0F383F_P_2) },
5831   },
5832
5833   /* PREFIX_VEX_0F3840 */
5834   {
5835     { Bad_Opcode },
5836     { Bad_Opcode },
5837     { VEX_W_TABLE (VEX_W_0F3840_P_2) },
5838   },
5839
5840   /* PREFIX_VEX_0F3841 */
5841   {
5842     { Bad_Opcode },
5843     { Bad_Opcode },
5844     { VEX_LEN_TABLE (VEX_LEN_0F3841_P_2) },
5845   },
5846
5847   /* PREFIX_VEX_0F3845 */
5848   {
5849     { Bad_Opcode },
5850     { Bad_Opcode },
5851     { "vpsrlv%LW", { XM, Vex, EXx }, 0 },
5852   },
5853
5854   /* PREFIX_VEX_0F3846 */
5855   {
5856     { Bad_Opcode },
5857     { Bad_Opcode },
5858     { VEX_W_TABLE (VEX_W_0F3846_P_2) },
5859   },
5860
5861   /* PREFIX_VEX_0F3847 */
5862   {
5863     { Bad_Opcode },
5864     { Bad_Opcode },
5865     { "vpsllv%LW", { XM, Vex, EXx }, 0 },
5866   },
5867
5868   /* PREFIX_VEX_0F3858 */
5869   {
5870     { Bad_Opcode },
5871     { Bad_Opcode },
5872     { VEX_W_TABLE (VEX_W_0F3858_P_2) },
5873   },
5874
5875   /* PREFIX_VEX_0F3859 */
5876   {
5877     { Bad_Opcode },
5878     { Bad_Opcode },
5879     { VEX_W_TABLE (VEX_W_0F3859_P_2) },
5880   },
5881
5882   /* PREFIX_VEX_0F385A */
5883   {
5884     { Bad_Opcode },
5885     { Bad_Opcode },
5886     { MOD_TABLE (MOD_VEX_0F385A_PREFIX_2) },
5887   },
5888
5889   /* PREFIX_VEX_0F3878 */
5890   {
5891     { Bad_Opcode },
5892     { Bad_Opcode },
5893     { VEX_W_TABLE (VEX_W_0F3878_P_2) },
5894   },
5895
5896   /* PREFIX_VEX_0F3879 */
5897   {
5898     { Bad_Opcode },
5899     { Bad_Opcode },
5900     { VEX_W_TABLE (VEX_W_0F3879_P_2) },
5901   },
5902
5903   /* PREFIX_VEX_0F388C */
5904   {
5905     { Bad_Opcode },
5906     { Bad_Opcode },
5907     { MOD_TABLE (MOD_VEX_0F388C_PREFIX_2) },
5908   },
5909
5910   /* PREFIX_VEX_0F388E */
5911   {
5912     { Bad_Opcode },
5913     { Bad_Opcode },
5914     { MOD_TABLE (MOD_VEX_0F388E_PREFIX_2) },
5915   },
5916
5917   /* PREFIX_VEX_0F3890 */
5918   {
5919     { Bad_Opcode },
5920     { Bad_Opcode },
5921     { "vpgatherd%LW", { XM, MVexVSIBDWpX, Vex }, 0 },
5922   },
5923
5924   /* PREFIX_VEX_0F3891 */
5925   {
5926     { Bad_Opcode },
5927     { Bad_Opcode },
5928     { "vpgatherq%LW", { XMGatherQ, MVexVSIBQWpX, VexGatherQ }, 0 },
5929   },
5930
5931   /* PREFIX_VEX_0F3892 */
5932   {
5933     { Bad_Opcode },
5934     { Bad_Opcode },
5935     { "vgatherdp%XW", { XM, MVexVSIBDWpX, Vex }, 0 },
5936   },
5937
5938   /* PREFIX_VEX_0F3893 */
5939   {
5940     { Bad_Opcode },
5941     { Bad_Opcode },
5942     { "vgatherqp%XW", { XMGatherQ, MVexVSIBQWpX, VexGatherQ }, 0 },
5943   },
5944
5945   /* PREFIX_VEX_0F3896 */
5946   {
5947     { Bad_Opcode },
5948     { Bad_Opcode },
5949     { "vfmaddsub132p%XW", { XM, Vex, EXx }, 0 },
5950   },
5951
5952   /* PREFIX_VEX_0F3897 */
5953   {
5954     { Bad_Opcode },
5955     { Bad_Opcode },
5956     { "vfmsubadd132p%XW", { XM, Vex, EXx }, 0 },
5957   },
5958
5959   /* PREFIX_VEX_0F3898 */
5960   {
5961     { Bad_Opcode },
5962     { Bad_Opcode },
5963     { "vfmadd132p%XW", { XM, Vex, EXx }, 0 },
5964   },
5965
5966   /* PREFIX_VEX_0F3899 */
5967   {
5968     { Bad_Opcode },
5969     { Bad_Opcode },
5970     { "vfmadd132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
5971   },
5972
5973   /* PREFIX_VEX_0F389A */
5974   {
5975     { Bad_Opcode },
5976     { Bad_Opcode },
5977     { "vfmsub132p%XW", { XM, Vex, EXx }, 0 },
5978   },
5979
5980   /* PREFIX_VEX_0F389B */
5981   {
5982     { Bad_Opcode },
5983     { Bad_Opcode },
5984     { "vfmsub132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
5985   },
5986
5987   /* PREFIX_VEX_0F389C */
5988   {
5989     { Bad_Opcode },
5990     { Bad_Opcode },
5991     { "vfnmadd132p%XW", { XM, Vex, EXx }, 0 },
5992   },
5993
5994   /* PREFIX_VEX_0F389D */
5995   {
5996     { Bad_Opcode },
5997     { Bad_Opcode },
5998     { "vfnmadd132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
5999   },
6000
6001   /* PREFIX_VEX_0F389E */
6002   {
6003     { Bad_Opcode },
6004     { Bad_Opcode },
6005     { "vfnmsub132p%XW", { XM, Vex, EXx }, 0 },
6006   },
6007
6008   /* PREFIX_VEX_0F389F */
6009   {
6010     { Bad_Opcode },
6011     { Bad_Opcode },
6012     { "vfnmsub132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6013   },
6014
6015   /* PREFIX_VEX_0F38A6 */
6016   {
6017     { Bad_Opcode },
6018     { Bad_Opcode },
6019     { "vfmaddsub213p%XW", { XM, Vex, EXx }, 0 },
6020     { Bad_Opcode },
6021   },
6022
6023   /* PREFIX_VEX_0F38A7 */
6024   {
6025     { Bad_Opcode },
6026     { Bad_Opcode },
6027     { "vfmsubadd213p%XW", { XM, Vex, EXx }, 0 },
6028   },
6029
6030   /* PREFIX_VEX_0F38A8 */
6031   {
6032     { Bad_Opcode },
6033     { Bad_Opcode },
6034     { "vfmadd213p%XW", { XM, Vex, EXx }, 0 },
6035   },
6036
6037   /* PREFIX_VEX_0F38A9 */
6038   {
6039     { Bad_Opcode },
6040     { Bad_Opcode },
6041     { "vfmadd213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6042   },
6043
6044   /* PREFIX_VEX_0F38AA */
6045   {
6046     { Bad_Opcode },
6047     { Bad_Opcode },
6048     { "vfmsub213p%XW", { XM, Vex, EXx }, 0 },
6049   },
6050
6051   /* PREFIX_VEX_0F38AB */
6052   {
6053     { Bad_Opcode },
6054     { Bad_Opcode },
6055     { "vfmsub213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6056   },
6057
6058   /* PREFIX_VEX_0F38AC */
6059   {
6060     { Bad_Opcode },
6061     { Bad_Opcode },
6062     { "vfnmadd213p%XW", { XM, Vex, EXx }, 0 },
6063   },
6064
6065   /* PREFIX_VEX_0F38AD */
6066   {
6067     { Bad_Opcode },
6068     { Bad_Opcode },
6069     { "vfnmadd213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6070   },
6071
6072   /* PREFIX_VEX_0F38AE */
6073   {
6074     { Bad_Opcode },
6075     { Bad_Opcode },
6076     { "vfnmsub213p%XW", { XM, Vex, EXx }, 0 },
6077   },
6078
6079   /* PREFIX_VEX_0F38AF */
6080   {
6081     { Bad_Opcode },
6082     { Bad_Opcode },
6083     { "vfnmsub213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6084   },
6085
6086   /* PREFIX_VEX_0F38B6 */
6087   {
6088     { Bad_Opcode },
6089     { Bad_Opcode },
6090     { "vfmaddsub231p%XW", { XM, Vex, EXx }, 0 },
6091   },
6092
6093   /* PREFIX_VEX_0F38B7 */
6094   {
6095     { Bad_Opcode },
6096     { Bad_Opcode },
6097     { "vfmsubadd231p%XW", { XM, Vex, EXx }, 0 },
6098   },
6099
6100   /* PREFIX_VEX_0F38B8 */
6101   {
6102     { Bad_Opcode },
6103     { Bad_Opcode },
6104     { "vfmadd231p%XW", { XM, Vex, EXx }, 0 },
6105   },
6106
6107   /* PREFIX_VEX_0F38B9 */
6108   {
6109     { Bad_Opcode },
6110     { Bad_Opcode },
6111     { "vfmadd231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6112   },
6113
6114   /* PREFIX_VEX_0F38BA */
6115   {
6116     { Bad_Opcode },
6117     { Bad_Opcode },
6118     { "vfmsub231p%XW", { XM, Vex, EXx }, 0 },
6119   },
6120
6121   /* PREFIX_VEX_0F38BB */
6122   {
6123     { Bad_Opcode },
6124     { Bad_Opcode },
6125     { "vfmsub231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6126   },
6127
6128   /* PREFIX_VEX_0F38BC */
6129   {
6130     { Bad_Opcode },
6131     { Bad_Opcode },
6132     { "vfnmadd231p%XW", { XM, Vex, EXx }, 0 },
6133   },
6134
6135   /* PREFIX_VEX_0F38BD */
6136   {
6137     { Bad_Opcode },
6138     { Bad_Opcode },
6139     { "vfnmadd231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6140   },
6141
6142   /* PREFIX_VEX_0F38BE */
6143   {
6144     { Bad_Opcode },
6145     { Bad_Opcode },
6146     { "vfnmsub231p%XW", { XM, Vex, EXx }, 0 },
6147   },
6148
6149   /* PREFIX_VEX_0F38BF */
6150   {
6151     { Bad_Opcode },
6152     { Bad_Opcode },
6153     { "vfnmsub231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6154   },
6155
6156   /* PREFIX_VEX_0F38DB */
6157   {
6158     { Bad_Opcode },
6159     { Bad_Opcode },
6160     { VEX_LEN_TABLE (VEX_LEN_0F38DB_P_2) },
6161   },
6162
6163   /* PREFIX_VEX_0F38DC */
6164   {
6165     { Bad_Opcode },
6166     { Bad_Opcode },
6167     { VEX_LEN_TABLE (VEX_LEN_0F38DC_P_2) },
6168   },
6169
6170   /* PREFIX_VEX_0F38DD */
6171   {
6172     { Bad_Opcode },
6173     { Bad_Opcode },
6174     { VEX_LEN_TABLE (VEX_LEN_0F38DD_P_2) },
6175   },
6176
6177   /* PREFIX_VEX_0F38DE */
6178   {
6179     { Bad_Opcode },
6180     { Bad_Opcode },
6181     { VEX_LEN_TABLE (VEX_LEN_0F38DE_P_2) },
6182   },
6183
6184   /* PREFIX_VEX_0F38DF */
6185   {
6186     { Bad_Opcode },
6187     { Bad_Opcode },
6188     { VEX_LEN_TABLE (VEX_LEN_0F38DF_P_2) },
6189   },
6190
6191   /* PREFIX_VEX_0F38F2 */
6192   {
6193     { VEX_LEN_TABLE (VEX_LEN_0F38F2_P_0) },
6194   },
6195
6196   /* PREFIX_VEX_0F38F3_REG_1 */
6197   {
6198     { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_1_P_0) },
6199   },
6200
6201   /* PREFIX_VEX_0F38F3_REG_2 */
6202   {
6203     { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_2_P_0) },
6204   },
6205
6206   /* PREFIX_VEX_0F38F3_REG_3 */
6207   {
6208     { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_3_P_0) },
6209   },
6210
6211   /* PREFIX_VEX_0F38F5 */
6212   {
6213     { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_0) },
6214     { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_1) },
6215     { Bad_Opcode },
6216     { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_3) },
6217   },
6218
6219   /* PREFIX_VEX_0F38F6 */
6220   {
6221     { Bad_Opcode },
6222     { Bad_Opcode },
6223     { Bad_Opcode },
6224     { VEX_LEN_TABLE (VEX_LEN_0F38F6_P_3) },
6225   },
6226
6227   /* PREFIX_VEX_0F38F7 */
6228   {
6229     { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_0) },
6230     { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_1) },
6231     { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_2) },
6232     { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_3) },
6233   },
6234
6235   /* PREFIX_VEX_0F3A00 */
6236   {
6237     { Bad_Opcode },
6238     { Bad_Opcode },
6239     { VEX_LEN_TABLE (VEX_LEN_0F3A00_P_2) },
6240   },
6241
6242   /* PREFIX_VEX_0F3A01 */
6243   {
6244     { Bad_Opcode },
6245     { Bad_Opcode },
6246     { VEX_LEN_TABLE (VEX_LEN_0F3A01_P_2) },
6247   },
6248
6249   /* PREFIX_VEX_0F3A02 */
6250   {
6251     { Bad_Opcode },
6252     { Bad_Opcode },
6253     { VEX_W_TABLE (VEX_W_0F3A02_P_2) },
6254   },
6255
6256   /* PREFIX_VEX_0F3A04 */
6257   {
6258     { Bad_Opcode },
6259     { Bad_Opcode },
6260     { VEX_W_TABLE (VEX_W_0F3A04_P_2) },
6261   },
6262
6263   /* PREFIX_VEX_0F3A05 */
6264   {
6265     { Bad_Opcode },
6266     { Bad_Opcode },
6267     { VEX_W_TABLE (VEX_W_0F3A05_P_2) },
6268   },
6269
6270   /* PREFIX_VEX_0F3A06 */
6271   {
6272     { Bad_Opcode },
6273     { Bad_Opcode },
6274     { VEX_LEN_TABLE (VEX_LEN_0F3A06_P_2) },
6275   },
6276
6277   /* PREFIX_VEX_0F3A08 */
6278   {
6279     { Bad_Opcode },
6280     { Bad_Opcode },
6281     { VEX_W_TABLE (VEX_W_0F3A08_P_2) },
6282   },
6283
6284   /* PREFIX_VEX_0F3A09 */
6285   {
6286     { Bad_Opcode },
6287     { Bad_Opcode },
6288     { VEX_W_TABLE (VEX_W_0F3A09_P_2) },
6289   },
6290
6291   /* PREFIX_VEX_0F3A0A */
6292   {
6293     { Bad_Opcode },
6294     { Bad_Opcode },
6295     { VEX_LEN_TABLE (VEX_LEN_0F3A0A_P_2) },
6296   },
6297
6298   /* PREFIX_VEX_0F3A0B */
6299   {
6300     { Bad_Opcode },
6301     { Bad_Opcode },
6302     { VEX_LEN_TABLE (VEX_LEN_0F3A0B_P_2) },
6303   },
6304
6305   /* PREFIX_VEX_0F3A0C */
6306   {
6307     { Bad_Opcode },
6308     { Bad_Opcode },
6309     { VEX_W_TABLE (VEX_W_0F3A0C_P_2) },
6310   },
6311
6312   /* PREFIX_VEX_0F3A0D */
6313   {
6314     { Bad_Opcode },
6315     { Bad_Opcode },
6316     { VEX_W_TABLE (VEX_W_0F3A0D_P_2) },
6317   },
6318
6319   /* PREFIX_VEX_0F3A0E */
6320   {
6321     { Bad_Opcode },
6322     { Bad_Opcode },
6323     { VEX_W_TABLE (VEX_W_0F3A0E_P_2) },
6324   },
6325
6326   /* PREFIX_VEX_0F3A0F */
6327   {
6328     { Bad_Opcode },
6329     { Bad_Opcode },
6330     { VEX_W_TABLE (VEX_W_0F3A0F_P_2) },
6331   },
6332
6333   /* PREFIX_VEX_0F3A14 */
6334   {
6335     { Bad_Opcode },
6336     { Bad_Opcode },
6337     { VEX_LEN_TABLE (VEX_LEN_0F3A14_P_2) },
6338   },
6339
6340   /* PREFIX_VEX_0F3A15 */
6341   {
6342     { Bad_Opcode },
6343     { Bad_Opcode },
6344     { VEX_LEN_TABLE (VEX_LEN_0F3A15_P_2) },
6345   },
6346
6347   /* PREFIX_VEX_0F3A16 */
6348   {
6349     { Bad_Opcode },
6350     { Bad_Opcode },
6351     { VEX_LEN_TABLE (VEX_LEN_0F3A16_P_2) },
6352   },
6353
6354   /* PREFIX_VEX_0F3A17 */
6355   {
6356     { Bad_Opcode },
6357     { Bad_Opcode },
6358     { VEX_LEN_TABLE (VEX_LEN_0F3A17_P_2) },
6359   },
6360
6361   /* PREFIX_VEX_0F3A18 */
6362   {
6363     { Bad_Opcode },
6364     { Bad_Opcode },
6365     { VEX_LEN_TABLE (VEX_LEN_0F3A18_P_2) },
6366   },
6367
6368   /* PREFIX_VEX_0F3A19 */
6369   {
6370     { Bad_Opcode },
6371     { Bad_Opcode },
6372     { VEX_LEN_TABLE (VEX_LEN_0F3A19_P_2) },
6373   },
6374
6375   /* PREFIX_VEX_0F3A1D */
6376   {
6377     { Bad_Opcode },
6378     { Bad_Opcode },
6379     { "vcvtps2ph", { EXxmmq, XM, Ib }, 0 },
6380   },
6381
6382   /* PREFIX_VEX_0F3A20 */
6383   {
6384     { Bad_Opcode },
6385     { Bad_Opcode },
6386     { VEX_LEN_TABLE (VEX_LEN_0F3A20_P_2) },
6387   },
6388
6389   /* PREFIX_VEX_0F3A21 */
6390   {
6391     { Bad_Opcode },
6392     { Bad_Opcode },
6393     { VEX_LEN_TABLE (VEX_LEN_0F3A21_P_2) },
6394   },
6395
6396   /* PREFIX_VEX_0F3A22 */
6397   {
6398     { Bad_Opcode },
6399     { Bad_Opcode },
6400     { VEX_LEN_TABLE (VEX_LEN_0F3A22_P_2) },
6401   },
6402
6403   /* PREFIX_VEX_0F3A30 */
6404   {
6405     { Bad_Opcode },
6406     { Bad_Opcode },
6407     { VEX_LEN_TABLE (VEX_LEN_0F3A30_P_2) },
6408   },
6409
6410   /* PREFIX_VEX_0F3A31 */
6411   {
6412     { Bad_Opcode },
6413     { Bad_Opcode },
6414     { VEX_LEN_TABLE (VEX_LEN_0F3A31_P_2) },
6415   },
6416
6417   /* PREFIX_VEX_0F3A32 */
6418   {
6419     { Bad_Opcode },
6420     { Bad_Opcode },
6421     { VEX_LEN_TABLE (VEX_LEN_0F3A32_P_2) },
6422   },
6423
6424   /* PREFIX_VEX_0F3A33 */
6425   {
6426     { Bad_Opcode },
6427     { Bad_Opcode },
6428     { VEX_LEN_TABLE (VEX_LEN_0F3A33_P_2) },
6429   },
6430
6431   /* PREFIX_VEX_0F3A38 */
6432   {
6433     { Bad_Opcode },
6434     { Bad_Opcode },
6435     { VEX_LEN_TABLE (VEX_LEN_0F3A38_P_2) },
6436   },
6437
6438   /* PREFIX_VEX_0F3A39 */
6439   {
6440     { Bad_Opcode },
6441     { Bad_Opcode },
6442     { VEX_LEN_TABLE (VEX_LEN_0F3A39_P_2) },
6443   },
6444
6445   /* PREFIX_VEX_0F3A40 */
6446   {
6447     { Bad_Opcode },
6448     { Bad_Opcode },
6449     { VEX_W_TABLE (VEX_W_0F3A40_P_2) },
6450   },
6451
6452   /* PREFIX_VEX_0F3A41 */
6453   {
6454     { Bad_Opcode },
6455     { Bad_Opcode },
6456     { VEX_LEN_TABLE (VEX_LEN_0F3A41_P_2) },
6457   },
6458
6459   /* PREFIX_VEX_0F3A42 */
6460   {
6461     { Bad_Opcode },
6462     { Bad_Opcode },
6463     { VEX_W_TABLE (VEX_W_0F3A42_P_2) },
6464   },
6465
6466   /* PREFIX_VEX_0F3A44 */
6467   {
6468     { Bad_Opcode },
6469     { Bad_Opcode },
6470     { VEX_LEN_TABLE (VEX_LEN_0F3A44_P_2) },
6471   },
6472
6473   /* PREFIX_VEX_0F3A46 */
6474   {
6475     { Bad_Opcode },
6476     { Bad_Opcode },
6477     { VEX_LEN_TABLE (VEX_LEN_0F3A46_P_2) },
6478   },
6479
6480   /* PREFIX_VEX_0F3A48 */
6481   {
6482     { Bad_Opcode },
6483     { Bad_Opcode },
6484     { VEX_W_TABLE (VEX_W_0F3A48_P_2) },
6485   },
6486
6487   /* PREFIX_VEX_0F3A49 */
6488   {
6489     { Bad_Opcode },
6490     { Bad_Opcode },
6491     { VEX_W_TABLE (VEX_W_0F3A49_P_2) },
6492   },
6493
6494   /* PREFIX_VEX_0F3A4A */
6495   {
6496     { Bad_Opcode },
6497     { Bad_Opcode },
6498     { VEX_W_TABLE (VEX_W_0F3A4A_P_2) },
6499   },
6500
6501   /* PREFIX_VEX_0F3A4B */
6502   {
6503     { Bad_Opcode },
6504     { Bad_Opcode },
6505     { VEX_W_TABLE (VEX_W_0F3A4B_P_2) },
6506   },
6507
6508   /* PREFIX_VEX_0F3A4C */
6509   {
6510     { Bad_Opcode },
6511     { Bad_Opcode },
6512     { VEX_W_TABLE (VEX_W_0F3A4C_P_2) },
6513   },
6514
6515   /* PREFIX_VEX_0F3A5C */
6516   {
6517     { Bad_Opcode },
6518     { Bad_Opcode },
6519     { "vfmaddsubps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
6520   },
6521
6522   /* PREFIX_VEX_0F3A5D */
6523   {
6524     { Bad_Opcode },
6525     { Bad_Opcode },
6526     { "vfmaddsubpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
6527   },
6528
6529   /* PREFIX_VEX_0F3A5E */
6530   {
6531     { Bad_Opcode },
6532     { Bad_Opcode },
6533     { "vfmsubaddps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
6534   },
6535
6536   /* PREFIX_VEX_0F3A5F */
6537   {
6538     { Bad_Opcode },
6539     { Bad_Opcode },
6540     { "vfmsubaddpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
6541   },
6542
6543   /* PREFIX_VEX_0F3A60 */
6544   {
6545     { Bad_Opcode },
6546     { Bad_Opcode },
6547     { VEX_LEN_TABLE (VEX_LEN_0F3A60_P_2) },
6548     { Bad_Opcode },
6549   },
6550
6551   /* PREFIX_VEX_0F3A61 */
6552   {
6553     { Bad_Opcode },
6554     { Bad_Opcode },
6555     { VEX_LEN_TABLE (VEX_LEN_0F3A61_P_2) },
6556   },
6557
6558   /* PREFIX_VEX_0F3A62 */
6559   {
6560     { Bad_Opcode },
6561     { Bad_Opcode },
6562     { VEX_LEN_TABLE (VEX_LEN_0F3A62_P_2) },
6563   },
6564
6565   /* PREFIX_VEX_0F3A63 */
6566   {
6567     { Bad_Opcode },
6568     { Bad_Opcode },
6569     { VEX_LEN_TABLE (VEX_LEN_0F3A63_P_2) },
6570   },
6571
6572   /* PREFIX_VEX_0F3A68 */
6573   {
6574     { Bad_Opcode },
6575     { Bad_Opcode },
6576     { "vfmaddps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
6577   },
6578
6579   /* PREFIX_VEX_0F3A69 */
6580   {
6581     { Bad_Opcode },
6582     { Bad_Opcode },
6583     { "vfmaddpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
6584   },
6585
6586   /* PREFIX_VEX_0F3A6A */
6587   {
6588     { Bad_Opcode },
6589     { Bad_Opcode },
6590     { VEX_LEN_TABLE (VEX_LEN_0F3A6A_P_2) },
6591   },
6592
6593   /* PREFIX_VEX_0F3A6B */
6594   {
6595     { Bad_Opcode },
6596     { Bad_Opcode },
6597     { VEX_LEN_TABLE (VEX_LEN_0F3A6B_P_2) },
6598   },
6599
6600   /* PREFIX_VEX_0F3A6C */
6601   {
6602     { Bad_Opcode },
6603     { Bad_Opcode },
6604     { "vfmsubps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
6605   },
6606
6607   /* PREFIX_VEX_0F3A6D */
6608   {
6609     { Bad_Opcode },
6610     { Bad_Opcode },
6611     { "vfmsubpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
6612   },
6613
6614   /* PREFIX_VEX_0F3A6E */
6615   {
6616     { Bad_Opcode },
6617     { Bad_Opcode },
6618     { VEX_LEN_TABLE (VEX_LEN_0F3A6E_P_2) },
6619   },
6620
6621   /* PREFIX_VEX_0F3A6F */
6622   {
6623     { Bad_Opcode },
6624     { Bad_Opcode },
6625     { VEX_LEN_TABLE (VEX_LEN_0F3A6F_P_2) },
6626   },
6627
6628   /* PREFIX_VEX_0F3A78 */
6629   {
6630     { Bad_Opcode },
6631     { Bad_Opcode },
6632     { "vfnmaddps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
6633   },
6634
6635   /* PREFIX_VEX_0F3A79 */
6636   {
6637     { Bad_Opcode },
6638     { Bad_Opcode },
6639     { "vfnmaddpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
6640   },
6641
6642   /* PREFIX_VEX_0F3A7A */
6643   {
6644     { Bad_Opcode },
6645     { Bad_Opcode },
6646     { VEX_LEN_TABLE (VEX_LEN_0F3A7A_P_2) },
6647   },
6648
6649   /* PREFIX_VEX_0F3A7B */
6650   {
6651     { Bad_Opcode },
6652     { Bad_Opcode },
6653     { VEX_LEN_TABLE (VEX_LEN_0F3A7B_P_2) },
6654   },
6655
6656   /* PREFIX_VEX_0F3A7C */
6657   {
6658     { Bad_Opcode },
6659     { Bad_Opcode },
6660     { "vfnmsubps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
6661     { Bad_Opcode },
6662   },
6663
6664   /* PREFIX_VEX_0F3A7D */
6665   {
6666     { Bad_Opcode },
6667     { Bad_Opcode },
6668     { "vfnmsubpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
6669   },
6670
6671   /* PREFIX_VEX_0F3A7E */
6672   {
6673     { Bad_Opcode },
6674     { Bad_Opcode },
6675     { VEX_LEN_TABLE (VEX_LEN_0F3A7E_P_2) },
6676   },
6677
6678   /* PREFIX_VEX_0F3A7F */
6679   {
6680     { Bad_Opcode },
6681     { Bad_Opcode },
6682     { VEX_LEN_TABLE (VEX_LEN_0F3A7F_P_2) },
6683   },
6684
6685   /* PREFIX_VEX_0F3ADF */
6686   {
6687     { Bad_Opcode },
6688     { Bad_Opcode },
6689     { VEX_LEN_TABLE (VEX_LEN_0F3ADF_P_2) },
6690   },
6691
6692   /* PREFIX_VEX_0F3AF0 */
6693   {
6694     { Bad_Opcode },
6695     { Bad_Opcode },
6696     { Bad_Opcode },
6697     { VEX_LEN_TABLE (VEX_LEN_0F3AF0_P_3) },
6698   },
6699
6700 #define NEED_PREFIX_TABLE
6701 #include "i386-dis-evex.h"
6702 #undef NEED_PREFIX_TABLE
6703 };
6704
6705 static const struct dis386 x86_64_table[][2] = {
6706   /* X86_64_06 */
6707   {
6708     { "pushP", { es }, 0 },
6709   },
6710
6711   /* X86_64_07 */
6712   {
6713     { "popP", { es }, 0 },
6714   },
6715
6716   /* X86_64_0D */
6717   {
6718     { "pushP", { cs }, 0 },
6719   },
6720
6721   /* X86_64_16 */
6722   {
6723     { "pushP", { ss }, 0 },
6724   },
6725
6726   /* X86_64_17 */
6727   {
6728     { "popP", { ss }, 0 },
6729   },
6730
6731   /* X86_64_1E */
6732   {
6733     { "pushP", { ds }, 0 },
6734   },
6735
6736   /* X86_64_1F */
6737   {
6738     { "popP", { ds }, 0 },
6739   },
6740
6741   /* X86_64_27 */
6742   {
6743     { "daa", { XX }, 0 },
6744   },
6745
6746   /* X86_64_2F */
6747   {
6748     { "das", { XX }, 0 },
6749   },
6750
6751   /* X86_64_37 */
6752   {
6753     { "aaa", { XX }, 0 },
6754   },
6755
6756   /* X86_64_3F */
6757   {
6758     { "aas", { XX }, 0 },
6759   },
6760
6761   /* X86_64_60 */
6762   {
6763     { "pushaP", { XX }, 0 },
6764   },
6765
6766   /* X86_64_61 */
6767   {
6768     { "popaP", { XX }, 0 },
6769   },
6770
6771   /* X86_64_62 */
6772   {
6773     { MOD_TABLE (MOD_62_32BIT) },
6774     { EVEX_TABLE (EVEX_0F) },
6775   },
6776
6777   /* X86_64_63 */
6778   {
6779     { "arpl", { Ew, Gw }, 0 },
6780     { "movs{lq|xd}", { Gv, Ed }, 0 },
6781   },
6782
6783   /* X86_64_6D */
6784   {
6785     { "ins{R|}", { Yzr, indirDX }, 0 },
6786     { "ins{G|}", { Yzr, indirDX }, 0 },
6787   },
6788
6789   /* X86_64_6F */
6790   {
6791     { "outs{R|}", { indirDXr, Xz }, 0 },
6792     { "outs{G|}", { indirDXr, Xz }, 0 },
6793   },
6794
6795   /* X86_64_9A */
6796   {
6797     { "Jcall{T|}", { Ap }, 0 },
6798   },
6799
6800   /* X86_64_C4 */
6801   {
6802     { MOD_TABLE (MOD_C4_32BIT) },
6803     { VEX_C4_TABLE (VEX_0F) },
6804   },
6805
6806   /* X86_64_C5 */
6807   {
6808     { MOD_TABLE (MOD_C5_32BIT) },
6809     { VEX_C5_TABLE (VEX_0F) },
6810   },
6811
6812   /* X86_64_CE */
6813   {
6814     { "into", { XX }, 0 },
6815   },
6816
6817   /* X86_64_D4 */
6818   {
6819     { "aam", { Ib }, 0 },
6820   },
6821
6822   /* X86_64_D5 */
6823   {
6824     { "aad", { Ib }, 0 },
6825   },
6826
6827   /* X86_64_EA */
6828   {
6829     { "Jjmp{T|}", { Ap }, 0 },
6830   },
6831
6832   /* X86_64_0F01_REG_0 */
6833   {
6834     { "sgdt{Q|IQ}", { M }, 0 },
6835     { "sgdt", { M }, 0 },
6836   },
6837
6838   /* X86_64_0F01_REG_1 */
6839   {
6840     { "sidt{Q|IQ}", { M }, 0 },
6841     { "sidt", { M }, 0 },
6842   },
6843
6844   /* X86_64_0F01_REG_2 */
6845   {
6846     { "lgdt{Q|Q}", { M }, 0 },
6847     { "lgdt", { M }, 0 },
6848   },
6849
6850   /* X86_64_0F01_REG_3 */
6851   {
6852     { "lidt{Q|Q}", { M }, 0 },
6853     { "lidt", { M }, 0 },
6854   },
6855 };
6856
6857 static const struct dis386 three_byte_table[][256] = {
6858
6859   /* THREE_BYTE_0F38 */
6860   {
6861     /* 00 */
6862     { "pshufb",         { MX, EM }, PREFIX_OPCODE },
6863     { "phaddw",         { MX, EM }, PREFIX_OPCODE },
6864     { "phaddd",         { MX, EM }, PREFIX_OPCODE },
6865     { "phaddsw",        { MX, EM }, PREFIX_OPCODE },
6866     { "pmaddubsw",      { MX, EM }, PREFIX_OPCODE },
6867     { "phsubw",         { MX, EM }, PREFIX_OPCODE },
6868     { "phsubd",         { MX, EM }, PREFIX_OPCODE },
6869     { "phsubsw",        { MX, EM }, PREFIX_OPCODE },
6870     /* 08 */
6871     { "psignb",         { MX, EM }, PREFIX_OPCODE },
6872     { "psignw",         { MX, EM }, PREFIX_OPCODE },
6873     { "psignd",         { MX, EM }, PREFIX_OPCODE },
6874     { "pmulhrsw",       { MX, EM }, PREFIX_OPCODE },
6875     { Bad_Opcode },
6876     { Bad_Opcode },
6877     { Bad_Opcode },
6878     { Bad_Opcode },
6879     /* 10 */
6880     { PREFIX_TABLE (PREFIX_0F3810) },
6881     { Bad_Opcode },
6882     { Bad_Opcode },
6883     { Bad_Opcode },
6884     { PREFIX_TABLE (PREFIX_0F3814) },
6885     { PREFIX_TABLE (PREFIX_0F3815) },
6886     { Bad_Opcode },
6887     { PREFIX_TABLE (PREFIX_0F3817) },
6888     /* 18 */
6889     { Bad_Opcode },
6890     { Bad_Opcode },
6891     { Bad_Opcode },
6892     { Bad_Opcode },
6893     { "pabsb",          { MX, EM }, PREFIX_OPCODE },
6894     { "pabsw",          { MX, EM }, PREFIX_OPCODE },
6895     { "pabsd",          { MX, EM }, PREFIX_OPCODE },
6896     { Bad_Opcode },
6897     /* 20 */
6898     { PREFIX_TABLE (PREFIX_0F3820) },
6899     { PREFIX_TABLE (PREFIX_0F3821) },
6900     { PREFIX_TABLE (PREFIX_0F3822) },
6901     { PREFIX_TABLE (PREFIX_0F3823) },
6902     { PREFIX_TABLE (PREFIX_0F3824) },
6903     { PREFIX_TABLE (PREFIX_0F3825) },
6904     { Bad_Opcode },
6905     { Bad_Opcode },
6906     /* 28 */
6907     { PREFIX_TABLE (PREFIX_0F3828) },
6908     { PREFIX_TABLE (PREFIX_0F3829) },
6909     { PREFIX_TABLE (PREFIX_0F382A) },
6910     { PREFIX_TABLE (PREFIX_0F382B) },
6911     { Bad_Opcode },
6912     { Bad_Opcode },
6913     { Bad_Opcode },
6914     { Bad_Opcode },
6915     /* 30 */
6916     { PREFIX_TABLE (PREFIX_0F3830) },
6917     { PREFIX_TABLE (PREFIX_0F3831) },
6918     { PREFIX_TABLE (PREFIX_0F3832) },
6919     { PREFIX_TABLE (PREFIX_0F3833) },
6920     { PREFIX_TABLE (PREFIX_0F3834) },
6921     { PREFIX_TABLE (PREFIX_0F3835) },
6922     { Bad_Opcode },
6923     { PREFIX_TABLE (PREFIX_0F3837) },
6924     /* 38 */
6925     { PREFIX_TABLE (PREFIX_0F3838) },
6926     { PREFIX_TABLE (PREFIX_0F3839) },
6927     { PREFIX_TABLE (PREFIX_0F383A) },
6928     { PREFIX_TABLE (PREFIX_0F383B) },
6929     { PREFIX_TABLE (PREFIX_0F383C) },
6930     { PREFIX_TABLE (PREFIX_0F383D) },
6931     { PREFIX_TABLE (PREFIX_0F383E) },
6932     { PREFIX_TABLE (PREFIX_0F383F) },
6933     /* 40 */
6934     { PREFIX_TABLE (PREFIX_0F3840) },
6935     { PREFIX_TABLE (PREFIX_0F3841) },
6936     { Bad_Opcode },
6937     { Bad_Opcode },
6938     { Bad_Opcode },
6939     { Bad_Opcode },
6940     { Bad_Opcode },
6941     { Bad_Opcode },
6942     /* 48 */
6943     { Bad_Opcode },
6944     { Bad_Opcode },
6945     { Bad_Opcode },
6946     { Bad_Opcode },
6947     { Bad_Opcode },
6948     { Bad_Opcode },
6949     { Bad_Opcode },
6950     { Bad_Opcode },
6951     /* 50 */
6952     { Bad_Opcode },
6953     { Bad_Opcode },
6954     { Bad_Opcode },
6955     { Bad_Opcode },
6956     { Bad_Opcode },
6957     { Bad_Opcode },
6958     { Bad_Opcode },
6959     { Bad_Opcode },
6960     /* 58 */
6961     { Bad_Opcode },
6962     { Bad_Opcode },
6963     { Bad_Opcode },
6964     { Bad_Opcode },
6965     { Bad_Opcode },
6966     { Bad_Opcode },
6967     { Bad_Opcode },
6968     { Bad_Opcode },
6969     /* 60 */
6970     { Bad_Opcode },
6971     { Bad_Opcode },
6972     { Bad_Opcode },
6973     { Bad_Opcode },
6974     { Bad_Opcode },
6975     { Bad_Opcode },
6976     { Bad_Opcode },
6977     { Bad_Opcode },
6978     /* 68 */
6979     { Bad_Opcode },
6980     { Bad_Opcode },
6981     { Bad_Opcode },
6982     { Bad_Opcode },
6983     { Bad_Opcode },
6984     { Bad_Opcode },
6985     { Bad_Opcode },
6986     { Bad_Opcode },
6987     /* 70 */
6988     { Bad_Opcode },
6989     { Bad_Opcode },
6990     { Bad_Opcode },
6991     { Bad_Opcode },
6992     { Bad_Opcode },
6993     { Bad_Opcode },
6994     { Bad_Opcode },
6995     { Bad_Opcode },
6996     /* 78 */
6997     { Bad_Opcode },
6998     { Bad_Opcode },
6999     { Bad_Opcode },
7000     { Bad_Opcode },
7001     { Bad_Opcode },
7002     { Bad_Opcode },
7003     { Bad_Opcode },
7004     { Bad_Opcode },
7005     /* 80 */
7006     { PREFIX_TABLE (PREFIX_0F3880) },
7007     { PREFIX_TABLE (PREFIX_0F3881) },
7008     { PREFIX_TABLE (PREFIX_0F3882) },
7009     { Bad_Opcode },
7010     { Bad_Opcode },
7011     { Bad_Opcode },
7012     { Bad_Opcode },
7013     { Bad_Opcode },
7014     /* 88 */
7015     { Bad_Opcode },
7016     { Bad_Opcode },
7017     { Bad_Opcode },
7018     { Bad_Opcode },
7019     { Bad_Opcode },
7020     { Bad_Opcode },
7021     { Bad_Opcode },
7022     { Bad_Opcode },
7023     /* 90 */
7024     { Bad_Opcode },
7025     { Bad_Opcode },
7026     { Bad_Opcode },
7027     { Bad_Opcode },
7028     { Bad_Opcode },
7029     { Bad_Opcode },
7030     { Bad_Opcode },
7031     { Bad_Opcode },
7032     /* 98 */
7033     { Bad_Opcode },
7034     { Bad_Opcode },
7035     { Bad_Opcode },
7036     { Bad_Opcode },
7037     { Bad_Opcode },
7038     { Bad_Opcode },
7039     { Bad_Opcode },
7040     { Bad_Opcode },
7041     /* a0 */
7042     { Bad_Opcode },
7043     { Bad_Opcode },
7044     { Bad_Opcode },
7045     { Bad_Opcode },
7046     { Bad_Opcode },
7047     { Bad_Opcode },
7048     { Bad_Opcode },
7049     { Bad_Opcode },
7050     /* a8 */
7051     { Bad_Opcode },
7052     { Bad_Opcode },
7053     { Bad_Opcode },
7054     { Bad_Opcode },
7055     { Bad_Opcode },
7056     { Bad_Opcode },
7057     { Bad_Opcode },
7058     { Bad_Opcode },
7059     /* b0 */
7060     { Bad_Opcode },
7061     { Bad_Opcode },
7062     { Bad_Opcode },
7063     { Bad_Opcode },
7064     { Bad_Opcode },
7065     { Bad_Opcode },
7066     { Bad_Opcode },
7067     { Bad_Opcode },
7068     /* b8 */
7069     { Bad_Opcode },
7070     { Bad_Opcode },
7071     { Bad_Opcode },
7072     { Bad_Opcode },
7073     { Bad_Opcode },
7074     { Bad_Opcode },
7075     { Bad_Opcode },
7076     { Bad_Opcode },
7077     /* c0 */
7078     { Bad_Opcode },
7079     { Bad_Opcode },
7080     { Bad_Opcode },
7081     { Bad_Opcode },
7082     { Bad_Opcode },
7083     { Bad_Opcode },
7084     { Bad_Opcode },
7085     { Bad_Opcode },
7086     /* c8 */
7087     { PREFIX_TABLE (PREFIX_0F38C8) },
7088     { PREFIX_TABLE (PREFIX_0F38C9) },
7089     { PREFIX_TABLE (PREFIX_0F38CA) },
7090     { PREFIX_TABLE (PREFIX_0F38CB) },
7091     { PREFIX_TABLE (PREFIX_0F38CC) },
7092     { PREFIX_TABLE (PREFIX_0F38CD) },
7093     { Bad_Opcode },
7094     { Bad_Opcode },
7095     /* d0 */
7096     { Bad_Opcode },
7097     { Bad_Opcode },
7098     { Bad_Opcode },
7099     { Bad_Opcode },
7100     { Bad_Opcode },
7101     { Bad_Opcode },
7102     { Bad_Opcode },
7103     { Bad_Opcode },
7104     /* d8 */
7105     { Bad_Opcode },
7106     { Bad_Opcode },
7107     { Bad_Opcode },
7108     { PREFIX_TABLE (PREFIX_0F38DB) },
7109     { PREFIX_TABLE (PREFIX_0F38DC) },
7110     { PREFIX_TABLE (PREFIX_0F38DD) },
7111     { PREFIX_TABLE (PREFIX_0F38DE) },
7112     { PREFIX_TABLE (PREFIX_0F38DF) },
7113     /* e0 */
7114     { Bad_Opcode },
7115     { Bad_Opcode },
7116     { Bad_Opcode },
7117     { Bad_Opcode },
7118     { Bad_Opcode },
7119     { Bad_Opcode },
7120     { Bad_Opcode },
7121     { Bad_Opcode },
7122     /* e8 */
7123     { Bad_Opcode },
7124     { Bad_Opcode },
7125     { Bad_Opcode },
7126     { Bad_Opcode },
7127     { Bad_Opcode },
7128     { Bad_Opcode },
7129     { Bad_Opcode },
7130     { Bad_Opcode },
7131     /* f0 */
7132     { PREFIX_TABLE (PREFIX_0F38F0) },
7133     { PREFIX_TABLE (PREFIX_0F38F1) },
7134     { Bad_Opcode },
7135     { Bad_Opcode },
7136     { Bad_Opcode },
7137     { Bad_Opcode },
7138     { PREFIX_TABLE (PREFIX_0F38F6) },
7139     { Bad_Opcode },
7140     /* f8 */
7141     { Bad_Opcode },
7142     { Bad_Opcode },
7143     { Bad_Opcode },
7144     { Bad_Opcode },
7145     { Bad_Opcode },
7146     { Bad_Opcode },
7147     { Bad_Opcode },
7148     { Bad_Opcode },
7149   },
7150   /* THREE_BYTE_0F3A */
7151   {
7152     /* 00 */
7153     { Bad_Opcode },
7154     { Bad_Opcode },
7155     { Bad_Opcode },
7156     { Bad_Opcode },
7157     { Bad_Opcode },
7158     { Bad_Opcode },
7159     { Bad_Opcode },
7160     { Bad_Opcode },
7161     /* 08 */
7162     { PREFIX_TABLE (PREFIX_0F3A08) },
7163     { PREFIX_TABLE (PREFIX_0F3A09) },
7164     { PREFIX_TABLE (PREFIX_0F3A0A) },
7165     { PREFIX_TABLE (PREFIX_0F3A0B) },
7166     { PREFIX_TABLE (PREFIX_0F3A0C) },
7167     { PREFIX_TABLE (PREFIX_0F3A0D) },
7168     { PREFIX_TABLE (PREFIX_0F3A0E) },
7169     { "palignr",        { MX, EM, Ib }, PREFIX_OPCODE },
7170     /* 10 */
7171     { Bad_Opcode },
7172     { Bad_Opcode },
7173     { Bad_Opcode },
7174     { Bad_Opcode },
7175     { PREFIX_TABLE (PREFIX_0F3A14) },
7176     { PREFIX_TABLE (PREFIX_0F3A15) },
7177     { PREFIX_TABLE (PREFIX_0F3A16) },
7178     { PREFIX_TABLE (PREFIX_0F3A17) },
7179     /* 18 */
7180     { Bad_Opcode },
7181     { Bad_Opcode },
7182     { Bad_Opcode },
7183     { Bad_Opcode },
7184     { Bad_Opcode },
7185     { Bad_Opcode },
7186     { Bad_Opcode },
7187     { Bad_Opcode },
7188     /* 20 */
7189     { PREFIX_TABLE (PREFIX_0F3A20) },
7190     { PREFIX_TABLE (PREFIX_0F3A21) },
7191     { PREFIX_TABLE (PREFIX_0F3A22) },
7192     { Bad_Opcode },
7193     { Bad_Opcode },
7194     { Bad_Opcode },
7195     { Bad_Opcode },
7196     { Bad_Opcode },
7197     /* 28 */
7198     { Bad_Opcode },
7199     { Bad_Opcode },
7200     { Bad_Opcode },
7201     { Bad_Opcode },
7202     { Bad_Opcode },
7203     { Bad_Opcode },
7204     { Bad_Opcode },
7205     { Bad_Opcode },
7206     /* 30 */
7207     { Bad_Opcode },
7208     { Bad_Opcode },
7209     { Bad_Opcode },
7210     { Bad_Opcode },
7211     { Bad_Opcode },
7212     { Bad_Opcode },
7213     { Bad_Opcode },
7214     { Bad_Opcode },
7215     /* 38 */
7216     { Bad_Opcode },
7217     { Bad_Opcode },
7218     { Bad_Opcode },
7219     { Bad_Opcode },
7220     { Bad_Opcode },
7221     { Bad_Opcode },
7222     { Bad_Opcode },
7223     { Bad_Opcode },
7224     /* 40 */
7225     { PREFIX_TABLE (PREFIX_0F3A40) },
7226     { PREFIX_TABLE (PREFIX_0F3A41) },
7227     { PREFIX_TABLE (PREFIX_0F3A42) },
7228     { Bad_Opcode },
7229     { PREFIX_TABLE (PREFIX_0F3A44) },
7230     { Bad_Opcode },
7231     { Bad_Opcode },
7232     { Bad_Opcode },
7233     /* 48 */
7234     { Bad_Opcode },
7235     { Bad_Opcode },
7236     { Bad_Opcode },
7237     { Bad_Opcode },
7238     { Bad_Opcode },
7239     { Bad_Opcode },
7240     { Bad_Opcode },
7241     { Bad_Opcode },
7242     /* 50 */
7243     { Bad_Opcode },
7244     { Bad_Opcode },
7245     { Bad_Opcode },
7246     { Bad_Opcode },
7247     { Bad_Opcode },
7248     { Bad_Opcode },
7249     { Bad_Opcode },
7250     { Bad_Opcode },
7251     /* 58 */
7252     { Bad_Opcode },
7253     { Bad_Opcode },
7254     { Bad_Opcode },
7255     { Bad_Opcode },
7256     { Bad_Opcode },
7257     { Bad_Opcode },
7258     { Bad_Opcode },
7259     { Bad_Opcode },
7260     /* 60 */
7261     { PREFIX_TABLE (PREFIX_0F3A60) },
7262     { PREFIX_TABLE (PREFIX_0F3A61) },
7263     { PREFIX_TABLE (PREFIX_0F3A62) },
7264     { PREFIX_TABLE (PREFIX_0F3A63) },
7265     { Bad_Opcode },
7266     { Bad_Opcode },
7267     { Bad_Opcode },
7268     { Bad_Opcode },
7269     /* 68 */
7270     { Bad_Opcode },
7271     { Bad_Opcode },
7272     { Bad_Opcode },
7273     { Bad_Opcode },
7274     { Bad_Opcode },
7275     { Bad_Opcode },
7276     { Bad_Opcode },
7277     { Bad_Opcode },
7278     /* 70 */
7279     { Bad_Opcode },
7280     { Bad_Opcode },
7281     { Bad_Opcode },
7282     { Bad_Opcode },
7283     { Bad_Opcode },
7284     { Bad_Opcode },
7285     { Bad_Opcode },
7286     { Bad_Opcode },
7287     /* 78 */
7288     { Bad_Opcode },
7289     { Bad_Opcode },
7290     { Bad_Opcode },
7291     { Bad_Opcode },
7292     { Bad_Opcode },
7293     { Bad_Opcode },
7294     { Bad_Opcode },
7295     { Bad_Opcode },
7296     /* 80 */
7297     { Bad_Opcode },
7298     { Bad_Opcode },
7299     { Bad_Opcode },
7300     { Bad_Opcode },
7301     { Bad_Opcode },
7302     { Bad_Opcode },
7303     { Bad_Opcode },
7304     { Bad_Opcode },
7305     /* 88 */
7306     { Bad_Opcode },
7307     { Bad_Opcode },
7308     { Bad_Opcode },
7309     { Bad_Opcode },
7310     { Bad_Opcode },
7311     { Bad_Opcode },
7312     { Bad_Opcode },
7313     { Bad_Opcode },
7314     /* 90 */
7315     { Bad_Opcode },
7316     { Bad_Opcode },
7317     { Bad_Opcode },
7318     { Bad_Opcode },
7319     { Bad_Opcode },
7320     { Bad_Opcode },
7321     { Bad_Opcode },
7322     { Bad_Opcode },
7323     /* 98 */
7324     { Bad_Opcode },
7325     { Bad_Opcode },
7326     { Bad_Opcode },
7327     { Bad_Opcode },
7328     { Bad_Opcode },
7329     { Bad_Opcode },
7330     { Bad_Opcode },
7331     { Bad_Opcode },
7332     /* a0 */
7333     { Bad_Opcode },
7334     { Bad_Opcode },
7335     { Bad_Opcode },
7336     { Bad_Opcode },
7337     { Bad_Opcode },
7338     { Bad_Opcode },
7339     { Bad_Opcode },
7340     { Bad_Opcode },
7341     /* a8 */
7342     { Bad_Opcode },
7343     { Bad_Opcode },
7344     { Bad_Opcode },
7345     { Bad_Opcode },
7346     { Bad_Opcode },
7347     { Bad_Opcode },
7348     { Bad_Opcode },
7349     { Bad_Opcode },
7350     /* b0 */
7351     { Bad_Opcode },
7352     { Bad_Opcode },
7353     { Bad_Opcode },
7354     { Bad_Opcode },
7355     { Bad_Opcode },
7356     { Bad_Opcode },
7357     { Bad_Opcode },
7358     { Bad_Opcode },
7359     /* b8 */
7360     { Bad_Opcode },
7361     { Bad_Opcode },
7362     { Bad_Opcode },
7363     { Bad_Opcode },
7364     { Bad_Opcode },
7365     { Bad_Opcode },
7366     { Bad_Opcode },
7367     { Bad_Opcode },
7368     /* c0 */
7369     { Bad_Opcode },
7370     { Bad_Opcode },
7371     { Bad_Opcode },
7372     { Bad_Opcode },
7373     { Bad_Opcode },
7374     { Bad_Opcode },
7375     { Bad_Opcode },
7376     { Bad_Opcode },
7377     /* c8 */
7378     { Bad_Opcode },
7379     { Bad_Opcode },
7380     { Bad_Opcode },
7381     { Bad_Opcode },
7382     { PREFIX_TABLE (PREFIX_0F3ACC) },
7383     { Bad_Opcode },
7384     { Bad_Opcode },
7385     { Bad_Opcode },
7386     /* d0 */
7387     { Bad_Opcode },
7388     { Bad_Opcode },
7389     { Bad_Opcode },
7390     { Bad_Opcode },
7391     { Bad_Opcode },
7392     { Bad_Opcode },
7393     { Bad_Opcode },
7394     { Bad_Opcode },
7395     /* d8 */
7396     { Bad_Opcode },
7397     { Bad_Opcode },
7398     { Bad_Opcode },
7399     { Bad_Opcode },
7400     { Bad_Opcode },
7401     { Bad_Opcode },
7402     { Bad_Opcode },
7403     { PREFIX_TABLE (PREFIX_0F3ADF) },
7404     /* e0 */
7405     { Bad_Opcode },
7406     { Bad_Opcode },
7407     { Bad_Opcode },
7408     { Bad_Opcode },
7409     { Bad_Opcode },
7410     { Bad_Opcode },
7411     { Bad_Opcode },
7412     { Bad_Opcode },
7413     /* e8 */
7414     { Bad_Opcode },
7415     { Bad_Opcode },
7416     { Bad_Opcode },
7417     { Bad_Opcode },
7418     { Bad_Opcode },
7419     { Bad_Opcode },
7420     { Bad_Opcode },
7421     { Bad_Opcode },
7422     /* f0 */
7423     { Bad_Opcode },
7424     { Bad_Opcode },
7425     { Bad_Opcode },
7426     { Bad_Opcode },
7427     { Bad_Opcode },
7428     { Bad_Opcode },
7429     { Bad_Opcode },
7430     { Bad_Opcode },
7431     /* f8 */
7432     { Bad_Opcode },
7433     { Bad_Opcode },
7434     { Bad_Opcode },
7435     { Bad_Opcode },
7436     { Bad_Opcode },
7437     { Bad_Opcode },
7438     { Bad_Opcode },
7439     { Bad_Opcode },
7440   },
7441
7442   /* THREE_BYTE_0F7A */
7443   {
7444     /* 00 */
7445     { Bad_Opcode },
7446     { Bad_Opcode },
7447     { Bad_Opcode },
7448     { Bad_Opcode },
7449     { Bad_Opcode },
7450     { Bad_Opcode },
7451     { Bad_Opcode },
7452     { Bad_Opcode },
7453     /* 08 */
7454     { Bad_Opcode },
7455     { Bad_Opcode },
7456     { Bad_Opcode },
7457     { Bad_Opcode },
7458     { Bad_Opcode },
7459     { Bad_Opcode },
7460     { Bad_Opcode },
7461     { Bad_Opcode },
7462     /* 10 */
7463     { Bad_Opcode },
7464     { Bad_Opcode },
7465     { Bad_Opcode },
7466     { Bad_Opcode },
7467     { Bad_Opcode },
7468     { Bad_Opcode },
7469     { Bad_Opcode },
7470     { Bad_Opcode },
7471     /* 18 */
7472     { Bad_Opcode },
7473     { Bad_Opcode },
7474     { Bad_Opcode },
7475     { Bad_Opcode },
7476     { Bad_Opcode },
7477     { Bad_Opcode },
7478     { Bad_Opcode },
7479     { Bad_Opcode },
7480     /* 20 */
7481     { "ptest",          { XX }, PREFIX_OPCODE },
7482     { Bad_Opcode },
7483     { Bad_Opcode },
7484     { Bad_Opcode },
7485     { Bad_Opcode },
7486     { Bad_Opcode },
7487     { Bad_Opcode },
7488     { Bad_Opcode },
7489     /* 28 */
7490     { Bad_Opcode },
7491     { Bad_Opcode },
7492     { Bad_Opcode },
7493     { Bad_Opcode },
7494     { Bad_Opcode },
7495     { Bad_Opcode },
7496     { Bad_Opcode },
7497     { Bad_Opcode },
7498     /* 30 */
7499     { Bad_Opcode },
7500     { Bad_Opcode },
7501     { Bad_Opcode },
7502     { Bad_Opcode },
7503     { Bad_Opcode },
7504     { Bad_Opcode },
7505     { Bad_Opcode },
7506     { Bad_Opcode },
7507     /* 38 */
7508     { Bad_Opcode },
7509     { Bad_Opcode },
7510     { Bad_Opcode },
7511     { Bad_Opcode },
7512     { Bad_Opcode },
7513     { Bad_Opcode },
7514     { Bad_Opcode },
7515     { Bad_Opcode },
7516     /* 40 */
7517     { Bad_Opcode },
7518     { "phaddbw",        { XM, EXq }, PREFIX_OPCODE },
7519     { "phaddbd",        { XM, EXq }, PREFIX_OPCODE },
7520     { "phaddbq",        { XM, EXq }, PREFIX_OPCODE },
7521     { Bad_Opcode },
7522     { Bad_Opcode },
7523     { "phaddwd",        { XM, EXq }, PREFIX_OPCODE },
7524     { "phaddwq",        { XM, EXq }, PREFIX_OPCODE },
7525     /* 48 */
7526     { Bad_Opcode },
7527     { Bad_Opcode },
7528     { Bad_Opcode },
7529     { "phadddq",        { XM, EXq }, PREFIX_OPCODE },
7530     { Bad_Opcode },
7531     { Bad_Opcode },
7532     { Bad_Opcode },
7533     { Bad_Opcode },
7534     /* 50 */
7535     { Bad_Opcode },
7536     { "phaddubw",       { XM, EXq }, PREFIX_OPCODE },
7537     { "phaddubd",       { XM, EXq }, PREFIX_OPCODE },
7538     { "phaddubq",       { XM, EXq }, PREFIX_OPCODE },
7539     { Bad_Opcode },
7540     { Bad_Opcode },
7541     { "phadduwd",       { XM, EXq }, PREFIX_OPCODE },
7542     { "phadduwq",       { XM, EXq }, PREFIX_OPCODE },
7543     /* 58 */
7544     { Bad_Opcode },
7545     { Bad_Opcode },
7546     { Bad_Opcode },
7547     { "phaddudq",       { XM, EXq }, PREFIX_OPCODE },
7548     { Bad_Opcode },
7549     { Bad_Opcode },
7550     { Bad_Opcode },
7551     { Bad_Opcode },
7552     /* 60 */
7553     { Bad_Opcode },
7554     { "phsubbw",        { XM, EXq }, PREFIX_OPCODE },
7555     { "phsubbd",        { XM, EXq }, PREFIX_OPCODE },
7556     { "phsubbq",        { XM, EXq }, PREFIX_OPCODE },
7557     { Bad_Opcode },
7558     { Bad_Opcode },
7559     { Bad_Opcode },
7560     { Bad_Opcode },
7561     /* 68 */
7562     { Bad_Opcode },
7563     { Bad_Opcode },
7564     { Bad_Opcode },
7565     { Bad_Opcode },
7566     { Bad_Opcode },
7567     { Bad_Opcode },
7568     { Bad_Opcode },
7569     { Bad_Opcode },
7570     /* 70 */
7571     { Bad_Opcode },
7572     { Bad_Opcode },
7573     { Bad_Opcode },
7574     { Bad_Opcode },
7575     { Bad_Opcode },
7576     { Bad_Opcode },
7577     { Bad_Opcode },
7578     { Bad_Opcode },
7579     /* 78 */
7580     { Bad_Opcode },
7581     { Bad_Opcode },
7582     { Bad_Opcode },
7583     { Bad_Opcode },
7584     { Bad_Opcode },
7585     { Bad_Opcode },
7586     { Bad_Opcode },
7587     { Bad_Opcode },
7588     /* 80 */
7589     { Bad_Opcode },
7590     { Bad_Opcode },
7591     { Bad_Opcode },
7592     { Bad_Opcode },
7593     { Bad_Opcode },
7594     { Bad_Opcode },
7595     { Bad_Opcode },
7596     { Bad_Opcode },
7597     /* 88 */
7598     { Bad_Opcode },
7599     { Bad_Opcode },
7600     { Bad_Opcode },
7601     { Bad_Opcode },
7602     { Bad_Opcode },
7603     { Bad_Opcode },
7604     { Bad_Opcode },
7605     { Bad_Opcode },
7606     /* 90 */
7607     { Bad_Opcode },
7608     { Bad_Opcode },
7609     { Bad_Opcode },
7610     { Bad_Opcode },
7611     { Bad_Opcode },
7612     { Bad_Opcode },
7613     { Bad_Opcode },
7614     { Bad_Opcode },
7615     /* 98 */
7616     { Bad_Opcode },
7617     { Bad_Opcode },
7618     { Bad_Opcode },
7619     { Bad_Opcode },
7620     { Bad_Opcode },
7621     { Bad_Opcode },
7622     { Bad_Opcode },
7623     { Bad_Opcode },
7624     /* a0 */
7625     { Bad_Opcode },
7626     { Bad_Opcode },
7627     { Bad_Opcode },
7628     { Bad_Opcode },
7629     { Bad_Opcode },
7630     { Bad_Opcode },
7631     { Bad_Opcode },
7632     { Bad_Opcode },
7633     /* a8 */
7634     { Bad_Opcode },
7635     { Bad_Opcode },
7636     { Bad_Opcode },
7637     { Bad_Opcode },
7638     { Bad_Opcode },
7639     { Bad_Opcode },
7640     { Bad_Opcode },
7641     { Bad_Opcode },
7642     /* b0 */
7643     { Bad_Opcode },
7644     { Bad_Opcode },
7645     { Bad_Opcode },
7646     { Bad_Opcode },
7647     { Bad_Opcode },
7648     { Bad_Opcode },
7649     { Bad_Opcode },
7650     { Bad_Opcode },
7651     /* b8 */
7652     { Bad_Opcode },
7653     { Bad_Opcode },
7654     { Bad_Opcode },
7655     { Bad_Opcode },
7656     { Bad_Opcode },
7657     { Bad_Opcode },
7658     { Bad_Opcode },
7659     { Bad_Opcode },
7660     /* c0 */
7661     { Bad_Opcode },
7662     { Bad_Opcode },
7663     { Bad_Opcode },
7664     { Bad_Opcode },
7665     { Bad_Opcode },
7666     { Bad_Opcode },
7667     { Bad_Opcode },
7668     { Bad_Opcode },
7669     /* c8 */
7670     { Bad_Opcode },
7671     { Bad_Opcode },
7672     { Bad_Opcode },
7673     { Bad_Opcode },
7674     { Bad_Opcode },
7675     { Bad_Opcode },
7676     { Bad_Opcode },
7677     { Bad_Opcode },
7678     /* d0 */
7679     { Bad_Opcode },
7680     { Bad_Opcode },
7681     { Bad_Opcode },
7682     { Bad_Opcode },
7683     { Bad_Opcode },
7684     { Bad_Opcode },
7685     { Bad_Opcode },
7686     { Bad_Opcode },
7687     /* d8 */
7688     { Bad_Opcode },
7689     { Bad_Opcode },
7690     { Bad_Opcode },
7691     { Bad_Opcode },
7692     { Bad_Opcode },
7693     { Bad_Opcode },
7694     { Bad_Opcode },
7695     { Bad_Opcode },
7696     /* e0 */
7697     { Bad_Opcode },
7698     { Bad_Opcode },
7699     { Bad_Opcode },
7700     { Bad_Opcode },
7701     { Bad_Opcode },
7702     { Bad_Opcode },
7703     { Bad_Opcode },
7704     { Bad_Opcode },
7705     /* e8 */
7706     { Bad_Opcode },
7707     { Bad_Opcode },
7708     { Bad_Opcode },
7709     { Bad_Opcode },
7710     { Bad_Opcode },
7711     { Bad_Opcode },
7712     { Bad_Opcode },
7713     { Bad_Opcode },
7714     /* f0 */
7715     { Bad_Opcode },
7716     { Bad_Opcode },
7717     { Bad_Opcode },
7718     { Bad_Opcode },
7719     { Bad_Opcode },
7720     { Bad_Opcode },
7721     { Bad_Opcode },
7722     { Bad_Opcode },
7723     /* f8 */
7724     { Bad_Opcode },
7725     { Bad_Opcode },
7726     { Bad_Opcode },
7727     { Bad_Opcode },
7728     { Bad_Opcode },
7729     { Bad_Opcode },
7730     { Bad_Opcode },
7731     { Bad_Opcode },
7732   },
7733 };
7734
7735 static const struct dis386 xop_table[][256] = {
7736   /* XOP_08 */
7737   {
7738     /* 00 */
7739     { Bad_Opcode },
7740     { Bad_Opcode },
7741     { Bad_Opcode },
7742     { Bad_Opcode },
7743     { Bad_Opcode },
7744     { Bad_Opcode },
7745     { Bad_Opcode },
7746     { Bad_Opcode },
7747     /* 08 */
7748     { Bad_Opcode },
7749     { Bad_Opcode },
7750     { Bad_Opcode },
7751     { Bad_Opcode },
7752     { Bad_Opcode },
7753     { Bad_Opcode },
7754     { Bad_Opcode },
7755     { Bad_Opcode },
7756     /* 10 */
7757     { Bad_Opcode },
7758     { Bad_Opcode },
7759     { Bad_Opcode },
7760     { Bad_Opcode },
7761     { Bad_Opcode },
7762     { Bad_Opcode },
7763     { Bad_Opcode },
7764     { Bad_Opcode },
7765     /* 18 */
7766     { Bad_Opcode },
7767     { Bad_Opcode },
7768     { Bad_Opcode },
7769     { Bad_Opcode },
7770     { Bad_Opcode },
7771     { Bad_Opcode },
7772     { Bad_Opcode },
7773     { Bad_Opcode },
7774     /* 20 */
7775     { Bad_Opcode },
7776     { Bad_Opcode },
7777     { Bad_Opcode },
7778     { Bad_Opcode },
7779     { Bad_Opcode },
7780     { Bad_Opcode },
7781     { Bad_Opcode },
7782     { Bad_Opcode },
7783     /* 28 */
7784     { Bad_Opcode },
7785     { Bad_Opcode },
7786     { Bad_Opcode },
7787     { Bad_Opcode },
7788     { Bad_Opcode },
7789     { Bad_Opcode },
7790     { Bad_Opcode },
7791     { Bad_Opcode },
7792     /* 30 */
7793     { Bad_Opcode },
7794     { Bad_Opcode },
7795     { Bad_Opcode },
7796     { Bad_Opcode },
7797     { Bad_Opcode },
7798     { Bad_Opcode },
7799     { Bad_Opcode },
7800     { Bad_Opcode },
7801     /* 38 */
7802     { Bad_Opcode },
7803     { Bad_Opcode },
7804     { Bad_Opcode },
7805     { Bad_Opcode },
7806     { Bad_Opcode },
7807     { Bad_Opcode },
7808     { Bad_Opcode },
7809     { Bad_Opcode },
7810     /* 40 */
7811     { Bad_Opcode },
7812     { Bad_Opcode },
7813     { Bad_Opcode },
7814     { Bad_Opcode },
7815     { Bad_Opcode },
7816     { Bad_Opcode },
7817     { Bad_Opcode },
7818     { Bad_Opcode },
7819     /* 48 */
7820     { Bad_Opcode },
7821     { Bad_Opcode },
7822     { Bad_Opcode },
7823     { Bad_Opcode },
7824     { Bad_Opcode },
7825     { Bad_Opcode },
7826     { Bad_Opcode },
7827     { Bad_Opcode },
7828     /* 50 */
7829     { Bad_Opcode },
7830     { Bad_Opcode },
7831     { Bad_Opcode },
7832     { Bad_Opcode },
7833     { Bad_Opcode },
7834     { Bad_Opcode },
7835     { Bad_Opcode },
7836     { Bad_Opcode },
7837     /* 58 */
7838     { Bad_Opcode },
7839     { Bad_Opcode },
7840     { Bad_Opcode },
7841     { Bad_Opcode },
7842     { Bad_Opcode },
7843     { Bad_Opcode },
7844     { Bad_Opcode },
7845     { Bad_Opcode },
7846     /* 60 */
7847     { Bad_Opcode },
7848     { Bad_Opcode },
7849     { Bad_Opcode },
7850     { Bad_Opcode },
7851     { Bad_Opcode },
7852     { Bad_Opcode },
7853     { Bad_Opcode },
7854     { Bad_Opcode },
7855     /* 68 */
7856     { Bad_Opcode },
7857     { Bad_Opcode },
7858     { Bad_Opcode },
7859     { Bad_Opcode },
7860     { Bad_Opcode },
7861     { Bad_Opcode },
7862     { Bad_Opcode },
7863     { Bad_Opcode },
7864     /* 70 */
7865     { Bad_Opcode },
7866     { Bad_Opcode },
7867     { Bad_Opcode },
7868     { Bad_Opcode },
7869     { Bad_Opcode },
7870     { Bad_Opcode },
7871     { Bad_Opcode },
7872     { Bad_Opcode },
7873     /* 78 */
7874     { Bad_Opcode },
7875     { Bad_Opcode },
7876     { Bad_Opcode },
7877     { Bad_Opcode },
7878     { Bad_Opcode },
7879     { Bad_Opcode },
7880     { Bad_Opcode },
7881     { Bad_Opcode },
7882     /* 80 */
7883     { Bad_Opcode },
7884     { Bad_Opcode },
7885     { Bad_Opcode },
7886     { Bad_Opcode },
7887     { Bad_Opcode },
7888     { "vpmacssww",      { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7889     { "vpmacsswd",      { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7890     { "vpmacssdql",     { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7891     /* 88 */
7892     { Bad_Opcode },
7893     { Bad_Opcode },
7894     { Bad_Opcode },
7895     { Bad_Opcode },
7896     { Bad_Opcode },
7897     { Bad_Opcode },
7898     { "vpmacssdd",      { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7899     { "vpmacssdqh",     { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7900     /* 90 */
7901     { Bad_Opcode },
7902     { Bad_Opcode },
7903     { Bad_Opcode },
7904     { Bad_Opcode },
7905     { Bad_Opcode },
7906     { "vpmacsww",       { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7907     { "vpmacswd",       { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7908     { "vpmacsdql",      { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7909     /* 98 */
7910     { Bad_Opcode },
7911     { Bad_Opcode },
7912     { Bad_Opcode },
7913     { Bad_Opcode },
7914     { Bad_Opcode },
7915     { Bad_Opcode },
7916     { "vpmacsdd",       { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7917     { "vpmacsdqh",      { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7918     /* a0 */
7919     { Bad_Opcode },
7920     { Bad_Opcode },
7921     { "vpcmov",         { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7922     { "vpperm",         { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7923     { Bad_Opcode },
7924     { Bad_Opcode },
7925     { "vpmadcsswd",     { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7926     { Bad_Opcode },
7927     /* a8 */
7928     { Bad_Opcode },
7929     { Bad_Opcode },
7930     { Bad_Opcode },
7931     { Bad_Opcode },
7932     { Bad_Opcode },
7933     { Bad_Opcode },
7934     { Bad_Opcode },
7935     { Bad_Opcode },
7936     /* b0 */
7937     { Bad_Opcode },
7938     { Bad_Opcode },
7939     { Bad_Opcode },
7940     { Bad_Opcode },
7941     { Bad_Opcode },
7942     { Bad_Opcode },
7943     { "vpmadcswd",      { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7944     { Bad_Opcode },
7945     /* b8 */
7946     { Bad_Opcode },
7947     { Bad_Opcode },
7948     { Bad_Opcode },
7949     { Bad_Opcode },
7950     { Bad_Opcode },
7951     { Bad_Opcode },
7952     { Bad_Opcode },
7953     { Bad_Opcode },
7954     /* c0 */
7955     { "vprotb",         { XM, Vex_2src_1, Ib }, 0 },
7956     { "vprotw",         { XM, Vex_2src_1, Ib }, 0 },
7957     { "vprotd",         { XM, Vex_2src_1, Ib }, 0 },
7958     { "vprotq",         { XM, Vex_2src_1, Ib }, 0 },
7959     { Bad_Opcode },
7960     { Bad_Opcode },
7961     { Bad_Opcode },
7962     { Bad_Opcode },
7963     /* c8 */
7964     { Bad_Opcode },
7965     { Bad_Opcode },
7966     { Bad_Opcode },
7967     { Bad_Opcode },
7968     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CC) },
7969     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CD) },
7970     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CE) },
7971     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CF) },
7972     /* d0 */
7973     { Bad_Opcode },
7974     { Bad_Opcode },
7975     { Bad_Opcode },
7976     { Bad_Opcode },
7977     { Bad_Opcode },
7978     { Bad_Opcode },
7979     { Bad_Opcode },
7980     { Bad_Opcode },
7981     /* d8 */
7982     { Bad_Opcode },
7983     { Bad_Opcode },
7984     { Bad_Opcode },
7985     { Bad_Opcode },
7986     { Bad_Opcode },
7987     { Bad_Opcode },
7988     { Bad_Opcode },
7989     { Bad_Opcode },
7990     /* e0 */
7991     { Bad_Opcode },
7992     { Bad_Opcode },
7993     { Bad_Opcode },
7994     { Bad_Opcode },
7995     { Bad_Opcode },
7996     { Bad_Opcode },
7997     { Bad_Opcode },
7998     { Bad_Opcode },
7999     /* e8 */
8000     { Bad_Opcode },
8001     { Bad_Opcode },
8002     { Bad_Opcode },
8003     { Bad_Opcode },
8004     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EC) },
8005     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_ED) },
8006     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EE) },
8007     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EF) },
8008     /* f0 */
8009     { Bad_Opcode },
8010     { Bad_Opcode },
8011     { Bad_Opcode },
8012     { Bad_Opcode },
8013     { Bad_Opcode },
8014     { Bad_Opcode },
8015     { Bad_Opcode },
8016     { Bad_Opcode },
8017     /* f8 */
8018     { Bad_Opcode },
8019     { Bad_Opcode },
8020     { Bad_Opcode },
8021     { Bad_Opcode },
8022     { Bad_Opcode },
8023     { Bad_Opcode },
8024     { Bad_Opcode },
8025     { Bad_Opcode },
8026   },
8027   /* XOP_09 */
8028   {
8029     /* 00 */
8030     { Bad_Opcode },
8031     { REG_TABLE (REG_XOP_TBM_01) },
8032     { REG_TABLE (REG_XOP_TBM_02) },
8033     { Bad_Opcode },
8034     { Bad_Opcode },
8035     { Bad_Opcode },
8036     { Bad_Opcode },
8037     { Bad_Opcode },
8038     /* 08 */
8039     { Bad_Opcode },
8040     { Bad_Opcode },
8041     { Bad_Opcode },
8042     { Bad_Opcode },
8043     { Bad_Opcode },
8044     { Bad_Opcode },
8045     { Bad_Opcode },
8046     { Bad_Opcode },
8047     /* 10 */
8048     { Bad_Opcode },
8049     { Bad_Opcode },
8050     { REG_TABLE (REG_XOP_LWPCB) },
8051     { Bad_Opcode },
8052     { Bad_Opcode },
8053     { Bad_Opcode },
8054     { Bad_Opcode },
8055     { Bad_Opcode },
8056     /* 18 */
8057     { Bad_Opcode },
8058     { Bad_Opcode },
8059     { Bad_Opcode },
8060     { Bad_Opcode },
8061     { Bad_Opcode },
8062     { Bad_Opcode },
8063     { Bad_Opcode },
8064     { Bad_Opcode },
8065     /* 20 */
8066     { Bad_Opcode },
8067     { Bad_Opcode },
8068     { Bad_Opcode },
8069     { Bad_Opcode },
8070     { Bad_Opcode },
8071     { Bad_Opcode },
8072     { Bad_Opcode },
8073     { Bad_Opcode },
8074     /* 28 */
8075     { Bad_Opcode },
8076     { Bad_Opcode },
8077     { Bad_Opcode },
8078     { Bad_Opcode },
8079     { Bad_Opcode },
8080     { Bad_Opcode },
8081     { Bad_Opcode },
8082     { Bad_Opcode },
8083     /* 30 */
8084     { Bad_Opcode },
8085     { Bad_Opcode },
8086     { Bad_Opcode },
8087     { Bad_Opcode },
8088     { Bad_Opcode },
8089     { Bad_Opcode },
8090     { Bad_Opcode },
8091     { Bad_Opcode },
8092     /* 38 */
8093     { Bad_Opcode },
8094     { Bad_Opcode },
8095     { Bad_Opcode },
8096     { Bad_Opcode },
8097     { Bad_Opcode },
8098     { Bad_Opcode },
8099     { Bad_Opcode },
8100     { Bad_Opcode },
8101     /* 40 */
8102     { Bad_Opcode },
8103     { Bad_Opcode },
8104     { Bad_Opcode },
8105     { Bad_Opcode },
8106     { Bad_Opcode },
8107     { Bad_Opcode },
8108     { Bad_Opcode },
8109     { Bad_Opcode },
8110     /* 48 */
8111     { Bad_Opcode },
8112     { Bad_Opcode },
8113     { Bad_Opcode },
8114     { Bad_Opcode },
8115     { Bad_Opcode },
8116     { Bad_Opcode },
8117     { Bad_Opcode },
8118     { Bad_Opcode },
8119     /* 50 */
8120     { Bad_Opcode },
8121     { Bad_Opcode },
8122     { Bad_Opcode },
8123     { Bad_Opcode },
8124     { Bad_Opcode },
8125     { Bad_Opcode },
8126     { Bad_Opcode },
8127     { Bad_Opcode },
8128     /* 58 */
8129     { Bad_Opcode },
8130     { Bad_Opcode },
8131     { Bad_Opcode },
8132     { Bad_Opcode },
8133     { Bad_Opcode },
8134     { Bad_Opcode },
8135     { Bad_Opcode },
8136     { Bad_Opcode },
8137     /* 60 */
8138     { Bad_Opcode },
8139     { Bad_Opcode },
8140     { Bad_Opcode },
8141     { Bad_Opcode },
8142     { Bad_Opcode },
8143     { Bad_Opcode },
8144     { Bad_Opcode },
8145     { Bad_Opcode },
8146     /* 68 */
8147     { Bad_Opcode },
8148     { Bad_Opcode },
8149     { Bad_Opcode },
8150     { Bad_Opcode },
8151     { Bad_Opcode },
8152     { Bad_Opcode },
8153     { Bad_Opcode },
8154     { Bad_Opcode },
8155     /* 70 */
8156     { Bad_Opcode },
8157     { Bad_Opcode },
8158     { Bad_Opcode },
8159     { Bad_Opcode },
8160     { Bad_Opcode },
8161     { Bad_Opcode },
8162     { Bad_Opcode },
8163     { Bad_Opcode },
8164     /* 78 */
8165     { Bad_Opcode },
8166     { Bad_Opcode },
8167     { Bad_Opcode },
8168     { Bad_Opcode },
8169     { Bad_Opcode },
8170     { Bad_Opcode },
8171     { Bad_Opcode },
8172     { Bad_Opcode },
8173     /* 80 */
8174     { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_80) },
8175     { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_81) },
8176     { "vfrczss",        { XM, EXd }, 0 },
8177     { "vfrczsd",        { XM, EXq }, 0 },
8178     { Bad_Opcode },
8179     { Bad_Opcode },
8180     { Bad_Opcode },
8181     { Bad_Opcode },
8182     /* 88 */
8183     { Bad_Opcode },
8184     { Bad_Opcode },
8185     { Bad_Opcode },
8186     { Bad_Opcode },
8187     { Bad_Opcode },
8188     { Bad_Opcode },
8189     { Bad_Opcode },
8190     { Bad_Opcode },
8191     /* 90 */
8192     { "vprotb",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8193     { "vprotw",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8194     { "vprotd",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8195     { "vprotq",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8196     { "vpshlb",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8197     { "vpshlw",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8198     { "vpshld",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8199     { "vpshlq",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8200     /* 98 */
8201     { "vpshab",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8202     { "vpshaw",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8203     { "vpshad",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8204     { "vpshaq",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8205     { Bad_Opcode },
8206     { Bad_Opcode },
8207     { Bad_Opcode },
8208     { Bad_Opcode },
8209     /* a0 */
8210     { Bad_Opcode },
8211     { Bad_Opcode },
8212     { Bad_Opcode },
8213     { Bad_Opcode },
8214     { Bad_Opcode },
8215     { Bad_Opcode },
8216     { Bad_Opcode },
8217     { Bad_Opcode },
8218     /* a8 */
8219     { Bad_Opcode },
8220     { Bad_Opcode },
8221     { Bad_Opcode },
8222     { Bad_Opcode },
8223     { Bad_Opcode },
8224     { Bad_Opcode },
8225     { Bad_Opcode },
8226     { Bad_Opcode },
8227     /* b0 */
8228     { Bad_Opcode },
8229     { Bad_Opcode },
8230     { Bad_Opcode },
8231     { Bad_Opcode },
8232     { Bad_Opcode },
8233     { Bad_Opcode },
8234     { Bad_Opcode },
8235     { Bad_Opcode },
8236     /* b8 */
8237     { Bad_Opcode },
8238     { Bad_Opcode },
8239     { Bad_Opcode },
8240     { Bad_Opcode },
8241     { Bad_Opcode },
8242     { Bad_Opcode },
8243     { Bad_Opcode },
8244     { Bad_Opcode },
8245     /* c0 */
8246     { Bad_Opcode },
8247     { "vphaddbw",       { XM, EXxmm }, 0 },
8248     { "vphaddbd",       { XM, EXxmm }, 0 },
8249     { "vphaddbq",       { XM, EXxmm }, 0 },
8250     { Bad_Opcode },
8251     { Bad_Opcode },
8252     { "vphaddwd",       { XM, EXxmm }, 0 },
8253     { "vphaddwq",       { XM, EXxmm }, 0 },
8254     /* c8 */
8255     { Bad_Opcode },
8256     { Bad_Opcode },
8257     { Bad_Opcode },
8258     { "vphadddq",       { XM, EXxmm }, 0 },
8259     { Bad_Opcode },
8260     { Bad_Opcode },
8261     { Bad_Opcode },
8262     { Bad_Opcode },
8263     /* d0 */
8264     { Bad_Opcode },
8265     { "vphaddubw",      { XM, EXxmm }, 0 },
8266     { "vphaddubd",      { XM, EXxmm }, 0 },
8267     { "vphaddubq",      { XM, EXxmm }, 0 },
8268     { Bad_Opcode },
8269     { Bad_Opcode },
8270     { "vphadduwd",      { XM, EXxmm }, 0 },
8271     { "vphadduwq",      { XM, EXxmm }, 0 },
8272     /* d8 */
8273     { Bad_Opcode },
8274     { Bad_Opcode },
8275     { Bad_Opcode },
8276     { "vphaddudq",      { XM, EXxmm }, 0 },
8277     { Bad_Opcode },
8278     { Bad_Opcode },
8279     { Bad_Opcode },
8280     { Bad_Opcode },
8281     /* e0 */
8282     { Bad_Opcode },
8283     { "vphsubbw",       { XM, EXxmm }, 0 },
8284     { "vphsubwd",       { XM, EXxmm }, 0 },
8285     { "vphsubdq",       { XM, EXxmm }, 0 },
8286     { Bad_Opcode },
8287     { Bad_Opcode },
8288     { Bad_Opcode },
8289     { Bad_Opcode },
8290     /* e8 */
8291     { Bad_Opcode },
8292     { Bad_Opcode },
8293     { Bad_Opcode },
8294     { Bad_Opcode },
8295     { Bad_Opcode },
8296     { Bad_Opcode },
8297     { Bad_Opcode },
8298     { Bad_Opcode },
8299     /* f0 */
8300     { Bad_Opcode },
8301     { Bad_Opcode },
8302     { Bad_Opcode },
8303     { Bad_Opcode },
8304     { Bad_Opcode },
8305     { Bad_Opcode },
8306     { Bad_Opcode },
8307     { Bad_Opcode },
8308     /* f8 */
8309     { Bad_Opcode },
8310     { Bad_Opcode },
8311     { Bad_Opcode },
8312     { Bad_Opcode },
8313     { Bad_Opcode },
8314     { Bad_Opcode },
8315     { Bad_Opcode },
8316     { Bad_Opcode },
8317   },
8318   /* XOP_0A */
8319   {
8320     /* 00 */
8321     { Bad_Opcode },
8322     { Bad_Opcode },
8323     { Bad_Opcode },
8324     { Bad_Opcode },
8325     { Bad_Opcode },
8326     { Bad_Opcode },
8327     { Bad_Opcode },
8328     { Bad_Opcode },
8329     /* 08 */
8330     { Bad_Opcode },
8331     { Bad_Opcode },
8332     { Bad_Opcode },
8333     { Bad_Opcode },
8334     { Bad_Opcode },
8335     { Bad_Opcode },
8336     { Bad_Opcode },
8337     { Bad_Opcode },
8338     /* 10 */
8339     { "bextr",  { Gv, Ev, Iq }, 0 },
8340     { Bad_Opcode },
8341     { REG_TABLE (REG_XOP_LWP) },
8342     { Bad_Opcode },
8343     { Bad_Opcode },
8344     { Bad_Opcode },
8345     { Bad_Opcode },
8346     { Bad_Opcode },
8347     /* 18 */
8348     { Bad_Opcode },
8349     { Bad_Opcode },
8350     { Bad_Opcode },
8351     { Bad_Opcode },
8352     { Bad_Opcode },
8353     { Bad_Opcode },
8354     { Bad_Opcode },
8355     { Bad_Opcode },
8356     /* 20 */
8357     { Bad_Opcode },
8358     { Bad_Opcode },
8359     { Bad_Opcode },
8360     { Bad_Opcode },
8361     { Bad_Opcode },
8362     { Bad_Opcode },
8363     { Bad_Opcode },
8364     { Bad_Opcode },
8365     /* 28 */
8366     { Bad_Opcode },
8367     { Bad_Opcode },
8368     { Bad_Opcode },
8369     { Bad_Opcode },
8370     { Bad_Opcode },
8371     { Bad_Opcode },
8372     { Bad_Opcode },
8373     { Bad_Opcode },
8374     /* 30 */
8375     { Bad_Opcode },
8376     { Bad_Opcode },
8377     { Bad_Opcode },
8378     { Bad_Opcode },
8379     { Bad_Opcode },
8380     { Bad_Opcode },
8381     { Bad_Opcode },
8382     { Bad_Opcode },
8383     /* 38 */
8384     { Bad_Opcode },
8385     { Bad_Opcode },
8386     { Bad_Opcode },
8387     { Bad_Opcode },
8388     { Bad_Opcode },
8389     { Bad_Opcode },
8390     { Bad_Opcode },
8391     { Bad_Opcode },
8392     /* 40 */
8393     { Bad_Opcode },
8394     { Bad_Opcode },
8395     { Bad_Opcode },
8396     { Bad_Opcode },
8397     { Bad_Opcode },
8398     { Bad_Opcode },
8399     { Bad_Opcode },
8400     { Bad_Opcode },
8401     /* 48 */
8402     { Bad_Opcode },
8403     { Bad_Opcode },
8404     { Bad_Opcode },
8405     { Bad_Opcode },
8406     { Bad_Opcode },
8407     { Bad_Opcode },
8408     { Bad_Opcode },
8409     { Bad_Opcode },
8410     /* 50 */
8411     { Bad_Opcode },
8412     { Bad_Opcode },
8413     { Bad_Opcode },
8414     { Bad_Opcode },
8415     { Bad_Opcode },
8416     { Bad_Opcode },
8417     { Bad_Opcode },
8418     { Bad_Opcode },
8419     /* 58 */
8420     { Bad_Opcode },
8421     { Bad_Opcode },
8422     { Bad_Opcode },
8423     { Bad_Opcode },
8424     { Bad_Opcode },
8425     { Bad_Opcode },
8426     { Bad_Opcode },
8427     { Bad_Opcode },
8428     /* 60 */
8429     { Bad_Opcode },
8430     { Bad_Opcode },
8431     { Bad_Opcode },
8432     { Bad_Opcode },
8433     { Bad_Opcode },
8434     { Bad_Opcode },
8435     { Bad_Opcode },
8436     { Bad_Opcode },
8437     /* 68 */
8438     { Bad_Opcode },
8439     { Bad_Opcode },
8440     { Bad_Opcode },
8441     { Bad_Opcode },
8442     { Bad_Opcode },
8443     { Bad_Opcode },
8444     { Bad_Opcode },
8445     { Bad_Opcode },
8446     /* 70 */
8447     { Bad_Opcode },
8448     { Bad_Opcode },
8449     { Bad_Opcode },
8450     { Bad_Opcode },
8451     { Bad_Opcode },
8452     { Bad_Opcode },
8453     { Bad_Opcode },
8454     { Bad_Opcode },
8455     /* 78 */
8456     { Bad_Opcode },
8457     { Bad_Opcode },
8458     { Bad_Opcode },
8459     { Bad_Opcode },
8460     { Bad_Opcode },
8461     { Bad_Opcode },
8462     { Bad_Opcode },
8463     { Bad_Opcode },
8464     /* 80 */
8465     { Bad_Opcode },
8466     { Bad_Opcode },
8467     { Bad_Opcode },
8468     { Bad_Opcode },
8469     { Bad_Opcode },
8470     { Bad_Opcode },
8471     { Bad_Opcode },
8472     { Bad_Opcode },
8473     /* 88 */
8474     { Bad_Opcode },
8475     { Bad_Opcode },
8476     { Bad_Opcode },
8477     { Bad_Opcode },
8478     { Bad_Opcode },
8479     { Bad_Opcode },
8480     { Bad_Opcode },
8481     { Bad_Opcode },
8482     /* 90 */
8483     { Bad_Opcode },
8484     { Bad_Opcode },
8485     { Bad_Opcode },
8486     { Bad_Opcode },
8487     { Bad_Opcode },
8488     { Bad_Opcode },
8489     { Bad_Opcode },
8490     { Bad_Opcode },
8491     /* 98 */
8492     { Bad_Opcode },
8493     { Bad_Opcode },
8494     { Bad_Opcode },
8495     { Bad_Opcode },
8496     { Bad_Opcode },
8497     { Bad_Opcode },
8498     { Bad_Opcode },
8499     { Bad_Opcode },
8500     /* a0 */
8501     { Bad_Opcode },
8502     { Bad_Opcode },
8503     { Bad_Opcode },
8504     { Bad_Opcode },
8505     { Bad_Opcode },
8506     { Bad_Opcode },
8507     { Bad_Opcode },
8508     { Bad_Opcode },
8509     /* a8 */
8510     { Bad_Opcode },
8511     { Bad_Opcode },
8512     { Bad_Opcode },
8513     { Bad_Opcode },
8514     { Bad_Opcode },
8515     { Bad_Opcode },
8516     { Bad_Opcode },
8517     { Bad_Opcode },
8518     /* b0 */
8519     { Bad_Opcode },
8520     { Bad_Opcode },
8521     { Bad_Opcode },
8522     { Bad_Opcode },
8523     { Bad_Opcode },
8524     { Bad_Opcode },
8525     { Bad_Opcode },
8526     { Bad_Opcode },
8527     /* b8 */
8528     { Bad_Opcode },
8529     { Bad_Opcode },
8530     { Bad_Opcode },
8531     { Bad_Opcode },
8532     { Bad_Opcode },
8533     { Bad_Opcode },
8534     { Bad_Opcode },
8535     { Bad_Opcode },
8536     /* c0 */
8537     { Bad_Opcode },
8538     { Bad_Opcode },
8539     { Bad_Opcode },
8540     { Bad_Opcode },
8541     { Bad_Opcode },
8542     { Bad_Opcode },
8543     { Bad_Opcode },
8544     { Bad_Opcode },
8545     /* c8 */
8546     { Bad_Opcode },
8547     { Bad_Opcode },
8548     { Bad_Opcode },
8549     { Bad_Opcode },
8550     { Bad_Opcode },
8551     { Bad_Opcode },
8552     { Bad_Opcode },
8553     { Bad_Opcode },
8554     /* d0 */
8555     { Bad_Opcode },
8556     { Bad_Opcode },
8557     { Bad_Opcode },
8558     { Bad_Opcode },
8559     { Bad_Opcode },
8560     { Bad_Opcode },
8561     { Bad_Opcode },
8562     { Bad_Opcode },
8563     /* d8 */
8564     { Bad_Opcode },
8565     { Bad_Opcode },
8566     { Bad_Opcode },
8567     { Bad_Opcode },
8568     { Bad_Opcode },
8569     { Bad_Opcode },
8570     { Bad_Opcode },
8571     { Bad_Opcode },
8572     /* e0 */
8573     { Bad_Opcode },
8574     { Bad_Opcode },
8575     { Bad_Opcode },
8576     { Bad_Opcode },
8577     { Bad_Opcode },
8578     { Bad_Opcode },
8579     { Bad_Opcode },
8580     { Bad_Opcode },
8581     /* e8 */
8582     { Bad_Opcode },
8583     { Bad_Opcode },
8584     { Bad_Opcode },
8585     { Bad_Opcode },
8586     { Bad_Opcode },
8587     { Bad_Opcode },
8588     { Bad_Opcode },
8589     { Bad_Opcode },
8590     /* f0 */
8591     { Bad_Opcode },
8592     { Bad_Opcode },
8593     { Bad_Opcode },
8594     { Bad_Opcode },
8595     { Bad_Opcode },
8596     { Bad_Opcode },
8597     { Bad_Opcode },
8598     { Bad_Opcode },
8599     /* f8 */
8600     { Bad_Opcode },
8601     { Bad_Opcode },
8602     { Bad_Opcode },
8603     { Bad_Opcode },
8604     { Bad_Opcode },
8605     { Bad_Opcode },
8606     { Bad_Opcode },
8607     { Bad_Opcode },
8608   },
8609 };
8610
8611 static const struct dis386 vex_table[][256] = {
8612   /* VEX_0F */
8613   {
8614     /* 00 */
8615     { Bad_Opcode },
8616     { Bad_Opcode },
8617     { Bad_Opcode },
8618     { Bad_Opcode },
8619     { Bad_Opcode },
8620     { Bad_Opcode },
8621     { Bad_Opcode },
8622     { Bad_Opcode },
8623     /* 08 */
8624     { Bad_Opcode },
8625     { Bad_Opcode },
8626     { Bad_Opcode },
8627     { Bad_Opcode },
8628     { Bad_Opcode },
8629     { Bad_Opcode },
8630     { Bad_Opcode },
8631     { Bad_Opcode },
8632     /* 10 */
8633     { PREFIX_TABLE (PREFIX_VEX_0F10) },
8634     { PREFIX_TABLE (PREFIX_VEX_0F11) },
8635     { PREFIX_TABLE (PREFIX_VEX_0F12) },
8636     { MOD_TABLE (MOD_VEX_0F13) },
8637     { VEX_W_TABLE (VEX_W_0F14) },
8638     { VEX_W_TABLE (VEX_W_0F15) },
8639     { PREFIX_TABLE (PREFIX_VEX_0F16) },
8640     { MOD_TABLE (MOD_VEX_0F17) },
8641     /* 18 */
8642     { Bad_Opcode },
8643     { Bad_Opcode },
8644     { Bad_Opcode },
8645     { Bad_Opcode },
8646     { Bad_Opcode },
8647     { Bad_Opcode },
8648     { Bad_Opcode },
8649     { Bad_Opcode },
8650     /* 20 */
8651     { Bad_Opcode },
8652     { Bad_Opcode },
8653     { Bad_Opcode },
8654     { Bad_Opcode },
8655     { Bad_Opcode },
8656     { Bad_Opcode },
8657     { Bad_Opcode },
8658     { Bad_Opcode },
8659     /* 28 */
8660     { VEX_W_TABLE (VEX_W_0F28) },
8661     { VEX_W_TABLE (VEX_W_0F29) },
8662     { PREFIX_TABLE (PREFIX_VEX_0F2A) },
8663     { MOD_TABLE (MOD_VEX_0F2B) },
8664     { PREFIX_TABLE (PREFIX_VEX_0F2C) },
8665     { PREFIX_TABLE (PREFIX_VEX_0F2D) },
8666     { PREFIX_TABLE (PREFIX_VEX_0F2E) },
8667     { PREFIX_TABLE (PREFIX_VEX_0F2F) },
8668     /* 30 */
8669     { Bad_Opcode },
8670     { Bad_Opcode },
8671     { Bad_Opcode },
8672     { Bad_Opcode },
8673     { Bad_Opcode },
8674     { Bad_Opcode },
8675     { Bad_Opcode },
8676     { Bad_Opcode },
8677     /* 38 */
8678     { Bad_Opcode },
8679     { Bad_Opcode },
8680     { Bad_Opcode },
8681     { Bad_Opcode },
8682     { Bad_Opcode },
8683     { Bad_Opcode },
8684     { Bad_Opcode },
8685     { Bad_Opcode },
8686     /* 40 */
8687     { Bad_Opcode },
8688     { PREFIX_TABLE (PREFIX_VEX_0F41) },
8689     { PREFIX_TABLE (PREFIX_VEX_0F42) },
8690     { Bad_Opcode },
8691     { PREFIX_TABLE (PREFIX_VEX_0F44) },
8692     { PREFIX_TABLE (PREFIX_VEX_0F45) },
8693     { PREFIX_TABLE (PREFIX_VEX_0F46) },
8694     { PREFIX_TABLE (PREFIX_VEX_0F47) },
8695     /* 48 */
8696     { Bad_Opcode },
8697     { Bad_Opcode },
8698     { PREFIX_TABLE (PREFIX_VEX_0F4A) },
8699     { PREFIX_TABLE (PREFIX_VEX_0F4B) },
8700     { Bad_Opcode },
8701     { Bad_Opcode },
8702     { Bad_Opcode },
8703     { Bad_Opcode },
8704     /* 50 */
8705     { MOD_TABLE (MOD_VEX_0F50) },
8706     { PREFIX_TABLE (PREFIX_VEX_0F51) },
8707     { PREFIX_TABLE (PREFIX_VEX_0F52) },
8708     { PREFIX_TABLE (PREFIX_VEX_0F53) },
8709     { "vandpX",         { XM, Vex, EXx }, 0 },
8710     { "vandnpX",        { XM, Vex, EXx }, 0 },
8711     { "vorpX",          { XM, Vex, EXx }, 0 },
8712     { "vxorpX",         { XM, Vex, EXx }, 0 },
8713     /* 58 */
8714     { PREFIX_TABLE (PREFIX_VEX_0F58) },
8715     { PREFIX_TABLE (PREFIX_VEX_0F59) },
8716     { PREFIX_TABLE (PREFIX_VEX_0F5A) },
8717     { PREFIX_TABLE (PREFIX_VEX_0F5B) },
8718     { PREFIX_TABLE (PREFIX_VEX_0F5C) },
8719     { PREFIX_TABLE (PREFIX_VEX_0F5D) },
8720     { PREFIX_TABLE (PREFIX_VEX_0F5E) },
8721     { PREFIX_TABLE (PREFIX_VEX_0F5F) },
8722     /* 60 */
8723     { PREFIX_TABLE (PREFIX_VEX_0F60) },
8724     { PREFIX_TABLE (PREFIX_VEX_0F61) },
8725     { PREFIX_TABLE (PREFIX_VEX_0F62) },
8726     { PREFIX_TABLE (PREFIX_VEX_0F63) },
8727     { PREFIX_TABLE (PREFIX_VEX_0F64) },
8728     { PREFIX_TABLE (PREFIX_VEX_0F65) },
8729     { PREFIX_TABLE (PREFIX_VEX_0F66) },
8730     { PREFIX_TABLE (PREFIX_VEX_0F67) },
8731     /* 68 */
8732     { PREFIX_TABLE (PREFIX_VEX_0F68) },
8733     { PREFIX_TABLE (PREFIX_VEX_0F69) },
8734     { PREFIX_TABLE (PREFIX_VEX_0F6A) },
8735     { PREFIX_TABLE (PREFIX_VEX_0F6B) },
8736     { PREFIX_TABLE (PREFIX_VEX_0F6C) },
8737     { PREFIX_TABLE (PREFIX_VEX_0F6D) },
8738     { PREFIX_TABLE (PREFIX_VEX_0F6E) },
8739     { PREFIX_TABLE (PREFIX_VEX_0F6F) },
8740     /* 70 */
8741     { PREFIX_TABLE (PREFIX_VEX_0F70) },
8742     { REG_TABLE (REG_VEX_0F71) },
8743     { REG_TABLE (REG_VEX_0F72) },
8744     { REG_TABLE (REG_VEX_0F73) },
8745     { PREFIX_TABLE (PREFIX_VEX_0F74) },
8746     { PREFIX_TABLE (PREFIX_VEX_0F75) },
8747     { PREFIX_TABLE (PREFIX_VEX_0F76) },
8748     { PREFIX_TABLE (PREFIX_VEX_0F77) },
8749     /* 78 */
8750     { Bad_Opcode },
8751     { Bad_Opcode },
8752     { Bad_Opcode },
8753     { Bad_Opcode },
8754     { PREFIX_TABLE (PREFIX_VEX_0F7C) },
8755     { PREFIX_TABLE (PREFIX_VEX_0F7D) },
8756     { PREFIX_TABLE (PREFIX_VEX_0F7E) },
8757     { PREFIX_TABLE (PREFIX_VEX_0F7F) },
8758     /* 80 */
8759     { Bad_Opcode },
8760     { Bad_Opcode },
8761     { Bad_Opcode },
8762     { Bad_Opcode },
8763     { Bad_Opcode },
8764     { Bad_Opcode },
8765     { Bad_Opcode },
8766     { Bad_Opcode },
8767     /* 88 */
8768     { Bad_Opcode },
8769     { Bad_Opcode },
8770     { Bad_Opcode },
8771     { Bad_Opcode },
8772     { Bad_Opcode },
8773     { Bad_Opcode },
8774     { Bad_Opcode },
8775     { Bad_Opcode },
8776     /* 90 */
8777     { PREFIX_TABLE (PREFIX_VEX_0F90) },
8778     { PREFIX_TABLE (PREFIX_VEX_0F91) },
8779     { PREFIX_TABLE (PREFIX_VEX_0F92) },
8780     { PREFIX_TABLE (PREFIX_VEX_0F93) },
8781     { Bad_Opcode },
8782     { Bad_Opcode },
8783     { Bad_Opcode },
8784     { Bad_Opcode },
8785     /* 98 */
8786     { PREFIX_TABLE (PREFIX_VEX_0F98) },
8787     { PREFIX_TABLE (PREFIX_VEX_0F99) },
8788     { Bad_Opcode },
8789     { Bad_Opcode },
8790     { Bad_Opcode },
8791     { Bad_Opcode },
8792     { Bad_Opcode },
8793     { Bad_Opcode },
8794     /* a0 */
8795     { Bad_Opcode },
8796     { Bad_Opcode },
8797     { Bad_Opcode },
8798     { Bad_Opcode },
8799     { Bad_Opcode },
8800     { Bad_Opcode },
8801     { Bad_Opcode },
8802     { Bad_Opcode },
8803     /* a8 */
8804     { Bad_Opcode },
8805     { Bad_Opcode },
8806     { Bad_Opcode },
8807     { Bad_Opcode },
8808     { Bad_Opcode },
8809     { Bad_Opcode },
8810     { REG_TABLE (REG_VEX_0FAE) },
8811     { Bad_Opcode },
8812     /* b0 */
8813     { Bad_Opcode },
8814     { Bad_Opcode },
8815     { Bad_Opcode },
8816     { Bad_Opcode },
8817     { Bad_Opcode },
8818     { Bad_Opcode },
8819     { Bad_Opcode },
8820     { Bad_Opcode },
8821     /* b8 */
8822     { Bad_Opcode },
8823     { Bad_Opcode },
8824     { Bad_Opcode },
8825     { Bad_Opcode },
8826     { Bad_Opcode },
8827     { Bad_Opcode },
8828     { Bad_Opcode },
8829     { Bad_Opcode },
8830     /* c0 */
8831     { Bad_Opcode },
8832     { Bad_Opcode },
8833     { PREFIX_TABLE (PREFIX_VEX_0FC2) },
8834     { Bad_Opcode },
8835     { PREFIX_TABLE (PREFIX_VEX_0FC4) },
8836     { PREFIX_TABLE (PREFIX_VEX_0FC5) },
8837     { "vshufpX",        { XM, Vex, EXx, Ib }, 0 },
8838     { Bad_Opcode },
8839     /* c8 */
8840     { Bad_Opcode },
8841     { Bad_Opcode },
8842     { Bad_Opcode },
8843     { Bad_Opcode },
8844     { Bad_Opcode },
8845     { Bad_Opcode },
8846     { Bad_Opcode },
8847     { Bad_Opcode },
8848     /* d0 */
8849     { PREFIX_TABLE (PREFIX_VEX_0FD0) },
8850     { PREFIX_TABLE (PREFIX_VEX_0FD1) },
8851     { PREFIX_TABLE (PREFIX_VEX_0FD2) },
8852     { PREFIX_TABLE (PREFIX_VEX_0FD3) },
8853     { PREFIX_TABLE (PREFIX_VEX_0FD4) },
8854     { PREFIX_TABLE (PREFIX_VEX_0FD5) },
8855     { PREFIX_TABLE (PREFIX_VEX_0FD6) },
8856     { PREFIX_TABLE (PREFIX_VEX_0FD7) },
8857     /* d8 */
8858     { PREFIX_TABLE (PREFIX_VEX_0FD8) },
8859     { PREFIX_TABLE (PREFIX_VEX_0FD9) },
8860     { PREFIX_TABLE (PREFIX_VEX_0FDA) },
8861     { PREFIX_TABLE (PREFIX_VEX_0FDB) },
8862     { PREFIX_TABLE (PREFIX_VEX_0FDC) },
8863     { PREFIX_TABLE (PREFIX_VEX_0FDD) },
8864     { PREFIX_TABLE (PREFIX_VEX_0FDE) },
8865     { PREFIX_TABLE (PREFIX_VEX_0FDF) },
8866     /* e0 */
8867     { PREFIX_TABLE (PREFIX_VEX_0FE0) },
8868     { PREFIX_TABLE (PREFIX_VEX_0FE1) },
8869     { PREFIX_TABLE (PREFIX_VEX_0FE2) },
8870     { PREFIX_TABLE (PREFIX_VEX_0FE3) },
8871     { PREFIX_TABLE (PREFIX_VEX_0FE4) },
8872     { PREFIX_TABLE (PREFIX_VEX_0FE5) },
8873     { PREFIX_TABLE (PREFIX_VEX_0FE6) },
8874     { PREFIX_TABLE (PREFIX_VEX_0FE7) },
8875     /* e8 */
8876     { PREFIX_TABLE (PREFIX_VEX_0FE8) },
8877     { PREFIX_TABLE (PREFIX_VEX_0FE9) },
8878     { PREFIX_TABLE (PREFIX_VEX_0FEA) },
8879     { PREFIX_TABLE (PREFIX_VEX_0FEB) },
8880     { PREFIX_TABLE (PREFIX_VEX_0FEC) },
8881     { PREFIX_TABLE (PREFIX_VEX_0FED) },
8882     { PREFIX_TABLE (PREFIX_VEX_0FEE) },
8883     { PREFIX_TABLE (PREFIX_VEX_0FEF) },
8884     /* f0 */
8885     { PREFIX_TABLE (PREFIX_VEX_0FF0) },
8886     { PREFIX_TABLE (PREFIX_VEX_0FF1) },
8887     { PREFIX_TABLE (PREFIX_VEX_0FF2) },
8888     { PREFIX_TABLE (PREFIX_VEX_0FF3) },
8889     { PREFIX_TABLE (PREFIX_VEX_0FF4) },
8890     { PREFIX_TABLE (PREFIX_VEX_0FF5) },
8891     { PREFIX_TABLE (PREFIX_VEX_0FF6) },
8892     { PREFIX_TABLE (PREFIX_VEX_0FF7) },
8893     /* f8 */
8894     { PREFIX_TABLE (PREFIX_VEX_0FF8) },
8895     { PREFIX_TABLE (PREFIX_VEX_0FF9) },
8896     { PREFIX_TABLE (PREFIX_VEX_0FFA) },
8897     { PREFIX_TABLE (PREFIX_VEX_0FFB) },
8898     { PREFIX_TABLE (PREFIX_VEX_0FFC) },
8899     { PREFIX_TABLE (PREFIX_VEX_0FFD) },
8900     { PREFIX_TABLE (PREFIX_VEX_0FFE) },
8901     { Bad_Opcode },
8902   },
8903   /* VEX_0F38 */
8904   {
8905     /* 00 */
8906     { PREFIX_TABLE (PREFIX_VEX_0F3800) },
8907     { PREFIX_TABLE (PREFIX_VEX_0F3801) },
8908     { PREFIX_TABLE (PREFIX_VEX_0F3802) },
8909     { PREFIX_TABLE (PREFIX_VEX_0F3803) },
8910     { PREFIX_TABLE (PREFIX_VEX_0F3804) },
8911     { PREFIX_TABLE (PREFIX_VEX_0F3805) },
8912     { PREFIX_TABLE (PREFIX_VEX_0F3806) },
8913     { PREFIX_TABLE (PREFIX_VEX_0F3807) },
8914     /* 08 */
8915     { PREFIX_TABLE (PREFIX_VEX_0F3808) },
8916     { PREFIX_TABLE (PREFIX_VEX_0F3809) },
8917     { PREFIX_TABLE (PREFIX_VEX_0F380A) },
8918     { PREFIX_TABLE (PREFIX_VEX_0F380B) },
8919     { PREFIX_TABLE (PREFIX_VEX_0F380C) },
8920     { PREFIX_TABLE (PREFIX_VEX_0F380D) },
8921     { PREFIX_TABLE (PREFIX_VEX_0F380E) },
8922     { PREFIX_TABLE (PREFIX_VEX_0F380F) },
8923     /* 10 */
8924     { Bad_Opcode },
8925     { Bad_Opcode },
8926     { Bad_Opcode },
8927     { PREFIX_TABLE (PREFIX_VEX_0F3813) },
8928     { Bad_Opcode },
8929     { Bad_Opcode },
8930     { PREFIX_TABLE (PREFIX_VEX_0F3816) },
8931     { PREFIX_TABLE (PREFIX_VEX_0F3817) },
8932     /* 18 */
8933     { PREFIX_TABLE (PREFIX_VEX_0F3818) },
8934     { PREFIX_TABLE (PREFIX_VEX_0F3819) },
8935     { PREFIX_TABLE (PREFIX_VEX_0F381A) },
8936     { Bad_Opcode },
8937     { PREFIX_TABLE (PREFIX_VEX_0F381C) },
8938     { PREFIX_TABLE (PREFIX_VEX_0F381D) },
8939     { PREFIX_TABLE (PREFIX_VEX_0F381E) },
8940     { Bad_Opcode },
8941     /* 20 */
8942     { PREFIX_TABLE (PREFIX_VEX_0F3820) },
8943     { PREFIX_TABLE (PREFIX_VEX_0F3821) },
8944     { PREFIX_TABLE (PREFIX_VEX_0F3822) },
8945     { PREFIX_TABLE (PREFIX_VEX_0F3823) },
8946     { PREFIX_TABLE (PREFIX_VEX_0F3824) },
8947     { PREFIX_TABLE (PREFIX_VEX_0F3825) },
8948     { Bad_Opcode },
8949     { Bad_Opcode },
8950     /* 28 */
8951     { PREFIX_TABLE (PREFIX_VEX_0F3828) },
8952     { PREFIX_TABLE (PREFIX_VEX_0F3829) },
8953     { PREFIX_TABLE (PREFIX_VEX_0F382A) },
8954     { PREFIX_TABLE (PREFIX_VEX_0F382B) },
8955     { PREFIX_TABLE (PREFIX_VEX_0F382C) },
8956     { PREFIX_TABLE (PREFIX_VEX_0F382D) },
8957     { PREFIX_TABLE (PREFIX_VEX_0F382E) },
8958     { PREFIX_TABLE (PREFIX_VEX_0F382F) },
8959     /* 30 */
8960     { PREFIX_TABLE (PREFIX_VEX_0F3830) },
8961     { PREFIX_TABLE (PREFIX_VEX_0F3831) },
8962     { PREFIX_TABLE (PREFIX_VEX_0F3832) },
8963     { PREFIX_TABLE (PREFIX_VEX_0F3833) },
8964     { PREFIX_TABLE (PREFIX_VEX_0F3834) },
8965     { PREFIX_TABLE (PREFIX_VEX_0F3835) },
8966     { PREFIX_TABLE (PREFIX_VEX_0F3836) },
8967     { PREFIX_TABLE (PREFIX_VEX_0F3837) },
8968     /* 38 */
8969     { PREFIX_TABLE (PREFIX_VEX_0F3838) },
8970     { PREFIX_TABLE (PREFIX_VEX_0F3839) },
8971     { PREFIX_TABLE (PREFIX_VEX_0F383A) },
8972     { PREFIX_TABLE (PREFIX_VEX_0F383B) },
8973     { PREFIX_TABLE (PREFIX_VEX_0F383C) },
8974     { PREFIX_TABLE (PREFIX_VEX_0F383D) },
8975     { PREFIX_TABLE (PREFIX_VEX_0F383E) },
8976     { PREFIX_TABLE (PREFIX_VEX_0F383F) },
8977     /* 40 */
8978     { PREFIX_TABLE (PREFIX_VEX_0F3840) },
8979     { PREFIX_TABLE (PREFIX_VEX_0F3841) },
8980     { Bad_Opcode },
8981     { Bad_Opcode },
8982     { Bad_Opcode },
8983     { PREFIX_TABLE (PREFIX_VEX_0F3845) },
8984     { PREFIX_TABLE (PREFIX_VEX_0F3846) },
8985     { PREFIX_TABLE (PREFIX_VEX_0F3847) },
8986     /* 48 */
8987     { Bad_Opcode },
8988     { Bad_Opcode },
8989     { Bad_Opcode },
8990     { Bad_Opcode },
8991     { Bad_Opcode },
8992     { Bad_Opcode },
8993     { Bad_Opcode },
8994     { Bad_Opcode },
8995     /* 50 */
8996     { Bad_Opcode },
8997     { Bad_Opcode },
8998     { Bad_Opcode },
8999     { Bad_Opcode },
9000     { Bad_Opcode },
9001     { Bad_Opcode },
9002     { Bad_Opcode },
9003     { Bad_Opcode },
9004     /* 58 */
9005     { PREFIX_TABLE (PREFIX_VEX_0F3858) },
9006     { PREFIX_TABLE (PREFIX_VEX_0F3859) },
9007     { PREFIX_TABLE (PREFIX_VEX_0F385A) },
9008     { Bad_Opcode },
9009     { Bad_Opcode },
9010     { Bad_Opcode },
9011     { Bad_Opcode },
9012     { Bad_Opcode },
9013     /* 60 */
9014     { Bad_Opcode },
9015     { Bad_Opcode },
9016     { Bad_Opcode },
9017     { Bad_Opcode },
9018     { Bad_Opcode },
9019     { Bad_Opcode },
9020     { Bad_Opcode },
9021     { Bad_Opcode },
9022     /* 68 */
9023     { Bad_Opcode },
9024     { Bad_Opcode },
9025     { Bad_Opcode },
9026     { Bad_Opcode },
9027     { Bad_Opcode },
9028     { Bad_Opcode },
9029     { Bad_Opcode },
9030     { Bad_Opcode },
9031     /* 70 */
9032     { Bad_Opcode },
9033     { Bad_Opcode },
9034     { Bad_Opcode },
9035     { Bad_Opcode },
9036     { Bad_Opcode },
9037     { Bad_Opcode },
9038     { Bad_Opcode },
9039     { Bad_Opcode },
9040     /* 78 */
9041     { PREFIX_TABLE (PREFIX_VEX_0F3878) },
9042     { PREFIX_TABLE (PREFIX_VEX_0F3879) },
9043     { Bad_Opcode },
9044     { Bad_Opcode },
9045     { Bad_Opcode },
9046     { Bad_Opcode },
9047     { Bad_Opcode },
9048     { Bad_Opcode },
9049     /* 80 */
9050     { Bad_Opcode },
9051     { Bad_Opcode },
9052     { Bad_Opcode },
9053     { Bad_Opcode },
9054     { Bad_Opcode },
9055     { Bad_Opcode },
9056     { Bad_Opcode },
9057     { Bad_Opcode },
9058     /* 88 */
9059     { Bad_Opcode },
9060     { Bad_Opcode },
9061     { Bad_Opcode },
9062     { Bad_Opcode },
9063     { PREFIX_TABLE (PREFIX_VEX_0F388C) },
9064     { Bad_Opcode },
9065     { PREFIX_TABLE (PREFIX_VEX_0F388E) },
9066     { Bad_Opcode },
9067     /* 90 */
9068     { PREFIX_TABLE (PREFIX_VEX_0F3890) },
9069     { PREFIX_TABLE (PREFIX_VEX_0F3891) },
9070     { PREFIX_TABLE (PREFIX_VEX_0F3892) },
9071     { PREFIX_TABLE (PREFIX_VEX_0F3893) },
9072     { Bad_Opcode },
9073     { Bad_Opcode },
9074     { PREFIX_TABLE (PREFIX_VEX_0F3896) },
9075     { PREFIX_TABLE (PREFIX_VEX_0F3897) },
9076     /* 98 */
9077     { PREFIX_TABLE (PREFIX_VEX_0F3898) },
9078     { PREFIX_TABLE (PREFIX_VEX_0F3899) },
9079     { PREFIX_TABLE (PREFIX_VEX_0F389A) },
9080     { PREFIX_TABLE (PREFIX_VEX_0F389B) },
9081     { PREFIX_TABLE (PREFIX_VEX_0F389C) },
9082     { PREFIX_TABLE (PREFIX_VEX_0F389D) },
9083     { PREFIX_TABLE (PREFIX_VEX_0F389E) },
9084     { PREFIX_TABLE (PREFIX_VEX_0F389F) },
9085     /* a0 */
9086     { Bad_Opcode },
9087     { Bad_Opcode },
9088     { Bad_Opcode },
9089     { Bad_Opcode },
9090     { Bad_Opcode },
9091     { Bad_Opcode },
9092     { PREFIX_TABLE (PREFIX_VEX_0F38A6) },
9093     { PREFIX_TABLE (PREFIX_VEX_0F38A7) },
9094     /* a8 */
9095     { PREFIX_TABLE (PREFIX_VEX_0F38A8) },
9096     { PREFIX_TABLE (PREFIX_VEX_0F38A9) },
9097     { PREFIX_TABLE (PREFIX_VEX_0F38AA) },
9098     { PREFIX_TABLE (PREFIX_VEX_0F38AB) },
9099     { PREFIX_TABLE (PREFIX_VEX_0F38AC) },
9100     { PREFIX_TABLE (PREFIX_VEX_0F38AD) },
9101     { PREFIX_TABLE (PREFIX_VEX_0F38AE) },
9102     { PREFIX_TABLE (PREFIX_VEX_0F38AF) },
9103     /* b0 */
9104     { Bad_Opcode },
9105     { Bad_Opcode },
9106     { Bad_Opcode },
9107     { Bad_Opcode },
9108     { Bad_Opcode },
9109     { Bad_Opcode },
9110     { PREFIX_TABLE (PREFIX_VEX_0F38B6) },
9111     { PREFIX_TABLE (PREFIX_VEX_0F38B7) },
9112     /* b8 */
9113     { PREFIX_TABLE (PREFIX_VEX_0F38B8) },
9114     { PREFIX_TABLE (PREFIX_VEX_0F38B9) },
9115     { PREFIX_TABLE (PREFIX_VEX_0F38BA) },
9116     { PREFIX_TABLE (PREFIX_VEX_0F38BB) },
9117     { PREFIX_TABLE (PREFIX_VEX_0F38BC) },
9118     { PREFIX_TABLE (PREFIX_VEX_0F38BD) },
9119     { PREFIX_TABLE (PREFIX_VEX_0F38BE) },
9120     { PREFIX_TABLE (PREFIX_VEX_0F38BF) },
9121     /* c0 */
9122     { Bad_Opcode },
9123     { Bad_Opcode },
9124     { Bad_Opcode },
9125     { Bad_Opcode },
9126     { Bad_Opcode },
9127     { Bad_Opcode },
9128     { Bad_Opcode },
9129     { Bad_Opcode },
9130     /* c8 */
9131     { Bad_Opcode },
9132     { Bad_Opcode },
9133     { Bad_Opcode },
9134     { Bad_Opcode },
9135     { Bad_Opcode },
9136     { Bad_Opcode },
9137     { Bad_Opcode },
9138     { Bad_Opcode },
9139     /* d0 */
9140     { Bad_Opcode },
9141     { Bad_Opcode },
9142     { Bad_Opcode },
9143     { Bad_Opcode },
9144     { Bad_Opcode },
9145     { Bad_Opcode },
9146     { Bad_Opcode },
9147     { Bad_Opcode },
9148     /* d8 */
9149     { Bad_Opcode },
9150     { Bad_Opcode },
9151     { Bad_Opcode },
9152     { PREFIX_TABLE (PREFIX_VEX_0F38DB) },
9153     { PREFIX_TABLE (PREFIX_VEX_0F38DC) },
9154     { PREFIX_TABLE (PREFIX_VEX_0F38DD) },
9155     { PREFIX_TABLE (PREFIX_VEX_0F38DE) },
9156     { PREFIX_TABLE (PREFIX_VEX_0F38DF) },
9157     /* e0 */
9158     { Bad_Opcode },
9159     { Bad_Opcode },
9160     { Bad_Opcode },
9161     { Bad_Opcode },
9162     { Bad_Opcode },
9163     { Bad_Opcode },
9164     { Bad_Opcode },
9165     { Bad_Opcode },
9166     /* e8 */
9167     { Bad_Opcode },
9168     { Bad_Opcode },
9169     { Bad_Opcode },
9170     { Bad_Opcode },
9171     { Bad_Opcode },
9172     { Bad_Opcode },
9173     { Bad_Opcode },
9174     { Bad_Opcode },
9175     /* f0 */
9176     { Bad_Opcode },
9177     { Bad_Opcode },
9178     { PREFIX_TABLE (PREFIX_VEX_0F38F2) },
9179     { REG_TABLE (REG_VEX_0F38F3) },
9180     { Bad_Opcode },
9181     { PREFIX_TABLE (PREFIX_VEX_0F38F5) },
9182     { PREFIX_TABLE (PREFIX_VEX_0F38F6) },
9183     { PREFIX_TABLE (PREFIX_VEX_0F38F7) },
9184     /* f8 */
9185     { Bad_Opcode },
9186     { Bad_Opcode },
9187     { Bad_Opcode },
9188     { Bad_Opcode },
9189     { Bad_Opcode },
9190     { Bad_Opcode },
9191     { Bad_Opcode },
9192     { Bad_Opcode },
9193   },
9194   /* VEX_0F3A */
9195   {
9196     /* 00 */
9197     { PREFIX_TABLE (PREFIX_VEX_0F3A00) },
9198     { PREFIX_TABLE (PREFIX_VEX_0F3A01) },
9199     { PREFIX_TABLE (PREFIX_VEX_0F3A02) },
9200     { Bad_Opcode },
9201     { PREFIX_TABLE (PREFIX_VEX_0F3A04) },
9202     { PREFIX_TABLE (PREFIX_VEX_0F3A05) },
9203     { PREFIX_TABLE (PREFIX_VEX_0F3A06) },
9204     { Bad_Opcode },
9205     /* 08 */
9206     { PREFIX_TABLE (PREFIX_VEX_0F3A08) },
9207     { PREFIX_TABLE (PREFIX_VEX_0F3A09) },
9208     { PREFIX_TABLE (PREFIX_VEX_0F3A0A) },
9209     { PREFIX_TABLE (PREFIX_VEX_0F3A0B) },
9210     { PREFIX_TABLE (PREFIX_VEX_0F3A0C) },
9211     { PREFIX_TABLE (PREFIX_VEX_0F3A0D) },
9212     { PREFIX_TABLE (PREFIX_VEX_0F3A0E) },
9213     { PREFIX_TABLE (PREFIX_VEX_0F3A0F) },
9214     /* 10 */
9215     { Bad_Opcode },
9216     { Bad_Opcode },
9217     { Bad_Opcode },
9218     { Bad_Opcode },
9219     { PREFIX_TABLE (PREFIX_VEX_0F3A14) },
9220     { PREFIX_TABLE (PREFIX_VEX_0F3A15) },
9221     { PREFIX_TABLE (PREFIX_VEX_0F3A16) },
9222     { PREFIX_TABLE (PREFIX_VEX_0F3A17) },
9223     /* 18 */
9224     { PREFIX_TABLE (PREFIX_VEX_0F3A18) },
9225     { PREFIX_TABLE (PREFIX_VEX_0F3A19) },
9226     { Bad_Opcode },
9227     { Bad_Opcode },
9228     { Bad_Opcode },
9229     { PREFIX_TABLE (PREFIX_VEX_0F3A1D) },
9230     { Bad_Opcode },
9231     { Bad_Opcode },
9232     /* 20 */
9233     { PREFIX_TABLE (PREFIX_VEX_0F3A20) },
9234     { PREFIX_TABLE (PREFIX_VEX_0F3A21) },
9235     { PREFIX_TABLE (PREFIX_VEX_0F3A22) },
9236     { Bad_Opcode },
9237     { Bad_Opcode },
9238     { Bad_Opcode },
9239     { Bad_Opcode },
9240     { Bad_Opcode },
9241     /* 28 */
9242     { Bad_Opcode },
9243     { Bad_Opcode },
9244     { Bad_Opcode },
9245     { Bad_Opcode },
9246     { Bad_Opcode },
9247     { Bad_Opcode },
9248     { Bad_Opcode },
9249     { Bad_Opcode },
9250     /* 30 */
9251     { PREFIX_TABLE (PREFIX_VEX_0F3A30) },
9252     { PREFIX_TABLE (PREFIX_VEX_0F3A31) },
9253     { PREFIX_TABLE (PREFIX_VEX_0F3A32) },
9254     { PREFIX_TABLE (PREFIX_VEX_0F3A33) },
9255     { Bad_Opcode },
9256     { Bad_Opcode },
9257     { Bad_Opcode },
9258     { Bad_Opcode },
9259     /* 38 */
9260     { PREFIX_TABLE (PREFIX_VEX_0F3A38) },
9261     { PREFIX_TABLE (PREFIX_VEX_0F3A39) },
9262     { Bad_Opcode },
9263     { Bad_Opcode },
9264     { Bad_Opcode },
9265     { Bad_Opcode },
9266     { Bad_Opcode },
9267     { Bad_Opcode },
9268     /* 40 */
9269     { PREFIX_TABLE (PREFIX_VEX_0F3A40) },
9270     { PREFIX_TABLE (PREFIX_VEX_0F3A41) },
9271     { PREFIX_TABLE (PREFIX_VEX_0F3A42) },
9272     { Bad_Opcode },
9273     { PREFIX_TABLE (PREFIX_VEX_0F3A44) },
9274     { Bad_Opcode },
9275     { PREFIX_TABLE (PREFIX_VEX_0F3A46) },
9276     { Bad_Opcode },
9277     /* 48 */
9278     { PREFIX_TABLE (PREFIX_VEX_0F3A48) },
9279     { PREFIX_TABLE (PREFIX_VEX_0F3A49) },
9280     { PREFIX_TABLE (PREFIX_VEX_0F3A4A) },
9281     { PREFIX_TABLE (PREFIX_VEX_0F3A4B) },
9282     { PREFIX_TABLE (PREFIX_VEX_0F3A4C) },
9283     { Bad_Opcode },
9284     { Bad_Opcode },
9285     { Bad_Opcode },
9286     /* 50 */
9287     { Bad_Opcode },
9288     { Bad_Opcode },
9289     { Bad_Opcode },
9290     { Bad_Opcode },
9291     { Bad_Opcode },
9292     { Bad_Opcode },
9293     { Bad_Opcode },
9294     { Bad_Opcode },
9295     /* 58 */
9296     { Bad_Opcode },
9297     { Bad_Opcode },
9298     { Bad_Opcode },
9299     { Bad_Opcode },
9300     { PREFIX_TABLE (PREFIX_VEX_0F3A5C) },
9301     { PREFIX_TABLE (PREFIX_VEX_0F3A5D) },
9302     { PREFIX_TABLE (PREFIX_VEX_0F3A5E) },
9303     { PREFIX_TABLE (PREFIX_VEX_0F3A5F) },
9304     /* 60 */
9305     { PREFIX_TABLE (PREFIX_VEX_0F3A60) },
9306     { PREFIX_TABLE (PREFIX_VEX_0F3A61) },
9307     { PREFIX_TABLE (PREFIX_VEX_0F3A62) },
9308     { PREFIX_TABLE (PREFIX_VEX_0F3A63) },
9309     { Bad_Opcode },
9310     { Bad_Opcode },
9311     { Bad_Opcode },
9312     { Bad_Opcode },
9313     /* 68 */
9314     { PREFIX_TABLE (PREFIX_VEX_0F3A68) },
9315     { PREFIX_TABLE (PREFIX_VEX_0F3A69) },
9316     { PREFIX_TABLE (PREFIX_VEX_0F3A6A) },
9317     { PREFIX_TABLE (PREFIX_VEX_0F3A6B) },
9318     { PREFIX_TABLE (PREFIX_VEX_0F3A6C) },
9319     { PREFIX_TABLE (PREFIX_VEX_0F3A6D) },
9320     { PREFIX_TABLE (PREFIX_VEX_0F3A6E) },
9321     { PREFIX_TABLE (PREFIX_VEX_0F3A6F) },
9322     /* 70 */
9323     { Bad_Opcode },
9324     { Bad_Opcode },
9325     { Bad_Opcode },
9326     { Bad_Opcode },
9327     { Bad_Opcode },
9328     { Bad_Opcode },
9329     { Bad_Opcode },
9330     { Bad_Opcode },
9331     /* 78 */
9332     { PREFIX_TABLE (PREFIX_VEX_0F3A78) },
9333     { PREFIX_TABLE (PREFIX_VEX_0F3A79) },
9334     { PREFIX_TABLE (PREFIX_VEX_0F3A7A) },
9335     { PREFIX_TABLE (PREFIX_VEX_0F3A7B) },
9336     { PREFIX_TABLE (PREFIX_VEX_0F3A7C) },
9337     { PREFIX_TABLE (PREFIX_VEX_0F3A7D) },
9338     { PREFIX_TABLE (PREFIX_VEX_0F3A7E) },
9339     { PREFIX_TABLE (PREFIX_VEX_0F3A7F) },
9340     /* 80 */
9341     { Bad_Opcode },
9342     { Bad_Opcode },
9343     { Bad_Opcode },
9344     { Bad_Opcode },
9345     { Bad_Opcode },
9346     { Bad_Opcode },
9347     { Bad_Opcode },
9348     { Bad_Opcode },
9349     /* 88 */
9350     { Bad_Opcode },
9351     { Bad_Opcode },
9352     { Bad_Opcode },
9353     { Bad_Opcode },
9354     { Bad_Opcode },
9355     { Bad_Opcode },
9356     { Bad_Opcode },
9357     { Bad_Opcode },
9358     /* 90 */
9359     { Bad_Opcode },
9360     { Bad_Opcode },
9361     { Bad_Opcode },
9362     { Bad_Opcode },
9363     { Bad_Opcode },
9364     { Bad_Opcode },
9365     { Bad_Opcode },
9366     { Bad_Opcode },
9367     /* 98 */
9368     { Bad_Opcode },
9369     { Bad_Opcode },
9370     { Bad_Opcode },
9371     { Bad_Opcode },
9372     { Bad_Opcode },
9373     { Bad_Opcode },
9374     { Bad_Opcode },
9375     { Bad_Opcode },
9376     /* a0 */
9377     { Bad_Opcode },
9378     { Bad_Opcode },
9379     { Bad_Opcode },
9380     { Bad_Opcode },
9381     { Bad_Opcode },
9382     { Bad_Opcode },
9383     { Bad_Opcode },
9384     { Bad_Opcode },
9385     /* a8 */
9386     { Bad_Opcode },
9387     { Bad_Opcode },
9388     { Bad_Opcode },
9389     { Bad_Opcode },
9390     { Bad_Opcode },
9391     { Bad_Opcode },
9392     { Bad_Opcode },
9393     { Bad_Opcode },
9394     /* b0 */
9395     { Bad_Opcode },
9396     { Bad_Opcode },
9397     { Bad_Opcode },
9398     { Bad_Opcode },
9399     { Bad_Opcode },
9400     { Bad_Opcode },
9401     { Bad_Opcode },
9402     { Bad_Opcode },
9403     /* b8 */
9404     { Bad_Opcode },
9405     { Bad_Opcode },
9406     { Bad_Opcode },
9407     { Bad_Opcode },
9408     { Bad_Opcode },
9409     { Bad_Opcode },
9410     { Bad_Opcode },
9411     { Bad_Opcode },
9412     /* c0 */
9413     { Bad_Opcode },
9414     { Bad_Opcode },
9415     { Bad_Opcode },
9416     { Bad_Opcode },
9417     { Bad_Opcode },
9418     { Bad_Opcode },
9419     { Bad_Opcode },
9420     { Bad_Opcode },
9421     /* c8 */
9422     { Bad_Opcode },
9423     { Bad_Opcode },
9424     { Bad_Opcode },
9425     { Bad_Opcode },
9426     { Bad_Opcode },
9427     { Bad_Opcode },
9428     { Bad_Opcode },
9429     { Bad_Opcode },
9430     /* d0 */
9431     { Bad_Opcode },
9432     { Bad_Opcode },
9433     { Bad_Opcode },
9434     { Bad_Opcode },
9435     { Bad_Opcode },
9436     { Bad_Opcode },
9437     { Bad_Opcode },
9438     { Bad_Opcode },
9439     /* d8 */
9440     { Bad_Opcode },
9441     { Bad_Opcode },
9442     { Bad_Opcode },
9443     { Bad_Opcode },
9444     { Bad_Opcode },
9445     { Bad_Opcode },
9446     { Bad_Opcode },
9447     { PREFIX_TABLE (PREFIX_VEX_0F3ADF) },
9448     /* e0 */
9449     { Bad_Opcode },
9450     { Bad_Opcode },
9451     { Bad_Opcode },
9452     { Bad_Opcode },
9453     { Bad_Opcode },
9454     { Bad_Opcode },
9455     { Bad_Opcode },
9456     { Bad_Opcode },
9457     /* e8 */
9458     { Bad_Opcode },
9459     { Bad_Opcode },
9460     { Bad_Opcode },
9461     { Bad_Opcode },
9462     { Bad_Opcode },
9463     { Bad_Opcode },
9464     { Bad_Opcode },
9465     { Bad_Opcode },
9466     /* f0 */
9467     { PREFIX_TABLE (PREFIX_VEX_0F3AF0) },
9468     { Bad_Opcode },
9469     { Bad_Opcode },
9470     { Bad_Opcode },
9471     { Bad_Opcode },
9472     { Bad_Opcode },
9473     { Bad_Opcode },
9474     { Bad_Opcode },
9475     /* f8 */
9476     { Bad_Opcode },
9477     { Bad_Opcode },
9478     { Bad_Opcode },
9479     { Bad_Opcode },
9480     { Bad_Opcode },
9481     { Bad_Opcode },
9482     { Bad_Opcode },
9483     { Bad_Opcode },
9484   },
9485 };
9486
9487 #define NEED_OPCODE_TABLE
9488 #include "i386-dis-evex.h"
9489 #undef NEED_OPCODE_TABLE
9490 static const struct dis386 vex_len_table[][2] = {
9491   /* VEX_LEN_0F10_P_1 */
9492   {
9493     { VEX_W_TABLE (VEX_W_0F10_P_1) },
9494     { VEX_W_TABLE (VEX_W_0F10_P_1) },
9495   },
9496
9497   /* VEX_LEN_0F10_P_3 */
9498   {
9499     { VEX_W_TABLE (VEX_W_0F10_P_3) },
9500     { VEX_W_TABLE (VEX_W_0F10_P_3) },
9501   },
9502
9503   /* VEX_LEN_0F11_P_1 */
9504   {
9505     { VEX_W_TABLE (VEX_W_0F11_P_1) },
9506     { VEX_W_TABLE (VEX_W_0F11_P_1) },
9507   },
9508
9509   /* VEX_LEN_0F11_P_3 */
9510   {
9511     { VEX_W_TABLE (VEX_W_0F11_P_3) },
9512     { VEX_W_TABLE (VEX_W_0F11_P_3) },
9513   },
9514
9515   /* VEX_LEN_0F12_P_0_M_0 */
9516   {
9517     { VEX_W_TABLE (VEX_W_0F12_P_0_M_0) },
9518   },
9519
9520   /* VEX_LEN_0F12_P_0_M_1 */
9521   {
9522     { VEX_W_TABLE (VEX_W_0F12_P_0_M_1) },
9523   },
9524
9525   /* VEX_LEN_0F12_P_2 */
9526   {
9527     { VEX_W_TABLE (VEX_W_0F12_P_2) },
9528   },
9529
9530   /* VEX_LEN_0F13_M_0 */
9531   {
9532     { VEX_W_TABLE (VEX_W_0F13_M_0) },
9533   },
9534
9535   /* VEX_LEN_0F16_P_0_M_0 */
9536   {
9537     { VEX_W_TABLE (VEX_W_0F16_P_0_M_0) },
9538   },
9539
9540   /* VEX_LEN_0F16_P_0_M_1 */
9541   {
9542     { VEX_W_TABLE (VEX_W_0F16_P_0_M_1) },
9543   },
9544
9545   /* VEX_LEN_0F16_P_2 */
9546   {
9547     { VEX_W_TABLE (VEX_W_0F16_P_2) },
9548   },
9549
9550   /* VEX_LEN_0F17_M_0 */
9551   {
9552     { VEX_W_TABLE (VEX_W_0F17_M_0) },
9553   },
9554
9555   /* VEX_LEN_0F2A_P_1 */
9556   {
9557     { "vcvtsi2ss%LQ",   { XMScalar, VexScalar, Ev }, 0 },
9558     { "vcvtsi2ss%LQ",   { XMScalar, VexScalar, Ev }, 0 },
9559   },
9560
9561   /* VEX_LEN_0F2A_P_3 */
9562   {
9563     { "vcvtsi2sd%LQ",   { XMScalar, VexScalar, Ev }, 0 },
9564     { "vcvtsi2sd%LQ",   { XMScalar, VexScalar, Ev }, 0 },
9565   },
9566
9567   /* VEX_LEN_0F2C_P_1 */
9568   {
9569     { "vcvttss2siY",    { Gv, EXdScalar }, 0 },
9570     { "vcvttss2siY",    { Gv, EXdScalar }, 0 },
9571   },
9572
9573   /* VEX_LEN_0F2C_P_3 */
9574   {
9575     { "vcvttsd2siY",    { Gv, EXqScalar }, 0 },
9576     { "vcvttsd2siY",    { Gv, EXqScalar }, 0 },
9577   },
9578
9579   /* VEX_LEN_0F2D_P_1 */
9580   {
9581     { "vcvtss2siY",     { Gv, EXdScalar }, 0 },
9582     { "vcvtss2siY",     { Gv, EXdScalar }, 0 },
9583   },
9584
9585   /* VEX_LEN_0F2D_P_3 */
9586   {
9587     { "vcvtsd2siY",     { Gv, EXqScalar }, 0 },
9588     { "vcvtsd2siY",     { Gv, EXqScalar }, 0 },
9589   },
9590
9591   /* VEX_LEN_0F2E_P_0 */
9592   {
9593     { VEX_W_TABLE (VEX_W_0F2E_P_0) },
9594     { VEX_W_TABLE (VEX_W_0F2E_P_0) },
9595   },
9596
9597   /* VEX_LEN_0F2E_P_2 */
9598   {
9599     { VEX_W_TABLE (VEX_W_0F2E_P_2) },
9600     { VEX_W_TABLE (VEX_W_0F2E_P_2) },
9601   },
9602
9603   /* VEX_LEN_0F2F_P_0 */
9604   {
9605     { VEX_W_TABLE (VEX_W_0F2F_P_0) },
9606     { VEX_W_TABLE (VEX_W_0F2F_P_0) },
9607   },
9608
9609   /* VEX_LEN_0F2F_P_2 */
9610   {
9611     { VEX_W_TABLE (VEX_W_0F2F_P_2) },
9612     { VEX_W_TABLE (VEX_W_0F2F_P_2) },
9613   },
9614
9615   /* VEX_LEN_0F41_P_0 */
9616   {
9617     { Bad_Opcode },
9618     { VEX_W_TABLE (VEX_W_0F41_P_0_LEN_1) },
9619   },
9620   /* VEX_LEN_0F41_P_2 */
9621   {
9622     { Bad_Opcode },
9623     { VEX_W_TABLE (VEX_W_0F41_P_2_LEN_1) },
9624   },
9625   /* VEX_LEN_0F42_P_0 */
9626   {
9627     { Bad_Opcode },
9628     { VEX_W_TABLE (VEX_W_0F42_P_0_LEN_1) },
9629   },
9630   /* VEX_LEN_0F42_P_2 */
9631   {
9632     { Bad_Opcode },
9633     { VEX_W_TABLE (VEX_W_0F42_P_2_LEN_1) },
9634   },
9635   /* VEX_LEN_0F44_P_0 */
9636   {
9637     { VEX_W_TABLE (VEX_W_0F44_P_0_LEN_0) },
9638   },
9639   /* VEX_LEN_0F44_P_2 */
9640   {
9641     { VEX_W_TABLE (VEX_W_0F44_P_2_LEN_0) },
9642   },
9643   /* VEX_LEN_0F45_P_0 */
9644   {
9645     { Bad_Opcode },
9646     { VEX_W_TABLE (VEX_W_0F45_P_0_LEN_1) },
9647   },
9648   /* VEX_LEN_0F45_P_2 */
9649   {
9650     { Bad_Opcode },
9651     { VEX_W_TABLE (VEX_W_0F45_P_2_LEN_1) },
9652   },
9653   /* VEX_LEN_0F46_P_0 */
9654   {
9655     { Bad_Opcode },
9656     { VEX_W_TABLE (VEX_W_0F46_P_0_LEN_1) },
9657   },
9658   /* VEX_LEN_0F46_P_2 */
9659   {
9660     { Bad_Opcode },
9661     { VEX_W_TABLE (VEX_W_0F46_P_2_LEN_1) },
9662   },
9663   /* VEX_LEN_0F47_P_0 */
9664   {
9665     { Bad_Opcode },
9666     { VEX_W_TABLE (VEX_W_0F47_P_0_LEN_1) },
9667   },
9668   /* VEX_LEN_0F47_P_2 */
9669   {
9670     { Bad_Opcode },
9671     { VEX_W_TABLE (VEX_W_0F47_P_2_LEN_1) },
9672   },
9673   /* VEX_LEN_0F4A_P_0 */
9674   {
9675     { Bad_Opcode },
9676     { VEX_W_TABLE (VEX_W_0F4A_P_0_LEN_1) },
9677   },
9678   /* VEX_LEN_0F4A_P_2 */
9679   {
9680     { Bad_Opcode },
9681     { VEX_W_TABLE (VEX_W_0F4A_P_2_LEN_1) },
9682   },
9683   /* VEX_LEN_0F4B_P_0 */
9684   {
9685     { Bad_Opcode },
9686     { VEX_W_TABLE (VEX_W_0F4B_P_0_LEN_1) },
9687   },
9688   /* VEX_LEN_0F4B_P_2 */
9689   {
9690     { Bad_Opcode },
9691     { VEX_W_TABLE (VEX_W_0F4B_P_2_LEN_1) },
9692   },
9693
9694   /* VEX_LEN_0F51_P_1 */
9695   {
9696     { VEX_W_TABLE (VEX_W_0F51_P_1) },
9697     { VEX_W_TABLE (VEX_W_0F51_P_1) },
9698   },
9699
9700   /* VEX_LEN_0F51_P_3 */
9701   {
9702     { VEX_W_TABLE (VEX_W_0F51_P_3) },
9703     { VEX_W_TABLE (VEX_W_0F51_P_3) },
9704   },
9705
9706   /* VEX_LEN_0F52_P_1 */
9707   {
9708     { VEX_W_TABLE (VEX_W_0F52_P_1) },
9709     { VEX_W_TABLE (VEX_W_0F52_P_1) },
9710   },
9711
9712   /* VEX_LEN_0F53_P_1 */
9713   {
9714     { VEX_W_TABLE (VEX_W_0F53_P_1) },
9715     { VEX_W_TABLE (VEX_W_0F53_P_1) },
9716   },
9717
9718   /* VEX_LEN_0F58_P_1 */
9719   {
9720     { VEX_W_TABLE (VEX_W_0F58_P_1) },
9721     { VEX_W_TABLE (VEX_W_0F58_P_1) },
9722   },
9723
9724   /* VEX_LEN_0F58_P_3 */
9725   {
9726     { VEX_W_TABLE (VEX_W_0F58_P_3) },
9727     { VEX_W_TABLE (VEX_W_0F58_P_3) },
9728   },
9729
9730   /* VEX_LEN_0F59_P_1 */
9731   {
9732     { VEX_W_TABLE (VEX_W_0F59_P_1) },
9733     { VEX_W_TABLE (VEX_W_0F59_P_1) },
9734   },
9735
9736   /* VEX_LEN_0F59_P_3 */
9737   {
9738     { VEX_W_TABLE (VEX_W_0F59_P_3) },
9739     { VEX_W_TABLE (VEX_W_0F59_P_3) },
9740   },
9741
9742   /* VEX_LEN_0F5A_P_1 */
9743   {
9744     { VEX_W_TABLE (VEX_W_0F5A_P_1) },
9745     { VEX_W_TABLE (VEX_W_0F5A_P_1) },
9746   },
9747
9748   /* VEX_LEN_0F5A_P_3 */
9749   {
9750     { VEX_W_TABLE (VEX_W_0F5A_P_3) },
9751     { VEX_W_TABLE (VEX_W_0F5A_P_3) },
9752   },
9753
9754   /* VEX_LEN_0F5C_P_1 */
9755   {
9756     { VEX_W_TABLE (VEX_W_0F5C_P_1) },
9757     { VEX_W_TABLE (VEX_W_0F5C_P_1) },
9758   },
9759
9760   /* VEX_LEN_0F5C_P_3 */
9761   {
9762     { VEX_W_TABLE (VEX_W_0F5C_P_3) },
9763     { VEX_W_TABLE (VEX_W_0F5C_P_3) },
9764   },
9765
9766   /* VEX_LEN_0F5D_P_1 */
9767   {
9768     { VEX_W_TABLE (VEX_W_0F5D_P_1) },
9769     { VEX_W_TABLE (VEX_W_0F5D_P_1) },
9770   },
9771
9772   /* VEX_LEN_0F5D_P_3 */
9773   {
9774     { VEX_W_TABLE (VEX_W_0F5D_P_3) },
9775     { VEX_W_TABLE (VEX_W_0F5D_P_3) },
9776   },
9777
9778   /* VEX_LEN_0F5E_P_1 */
9779   {
9780     { VEX_W_TABLE (VEX_W_0F5E_P_1) },
9781     { VEX_W_TABLE (VEX_W_0F5E_P_1) },
9782   },
9783
9784   /* VEX_LEN_0F5E_P_3 */
9785   {
9786     { VEX_W_TABLE (VEX_W_0F5E_P_3) },
9787     { VEX_W_TABLE (VEX_W_0F5E_P_3) },
9788   },
9789
9790   /* VEX_LEN_0F5F_P_1 */
9791   {
9792     { VEX_W_TABLE (VEX_W_0F5F_P_1) },
9793     { VEX_W_TABLE (VEX_W_0F5F_P_1) },
9794   },
9795
9796   /* VEX_LEN_0F5F_P_3 */
9797   {
9798     { VEX_W_TABLE (VEX_W_0F5F_P_3) },
9799     { VEX_W_TABLE (VEX_W_0F5F_P_3) },
9800   },
9801
9802   /* VEX_LEN_0F6E_P_2 */
9803   {
9804     { "vmovK",          { XMScalar, Edq }, 0 },
9805     { "vmovK",          { XMScalar, Edq }, 0 },
9806   },
9807
9808   /* VEX_LEN_0F7E_P_1 */
9809   {
9810     { VEX_W_TABLE (VEX_W_0F7E_P_1) },
9811     { VEX_W_TABLE (VEX_W_0F7E_P_1) },
9812   },
9813
9814   /* VEX_LEN_0F7E_P_2 */
9815   {
9816     { "vmovK",          { Edq, XMScalar }, 0 },
9817     { "vmovK",          { Edq, XMScalar }, 0 },
9818   },
9819
9820   /* VEX_LEN_0F90_P_0 */
9821   {
9822     { VEX_W_TABLE (VEX_W_0F90_P_0_LEN_0) },
9823   },
9824
9825   /* VEX_LEN_0F90_P_2 */
9826   {
9827     { VEX_W_TABLE (VEX_W_0F90_P_2_LEN_0) },
9828   },
9829
9830   /* VEX_LEN_0F91_P_0 */
9831   {
9832     { VEX_W_TABLE (VEX_W_0F91_P_0_LEN_0) },
9833   },
9834
9835   /* VEX_LEN_0F91_P_2 */
9836   {
9837     { VEX_W_TABLE (VEX_W_0F91_P_2_LEN_0) },
9838   },
9839
9840   /* VEX_LEN_0F92_P_0 */
9841   {
9842     { VEX_W_TABLE (VEX_W_0F92_P_0_LEN_0) },
9843   },
9844
9845   /* VEX_LEN_0F92_P_2 */
9846   {
9847     { VEX_W_TABLE (VEX_W_0F92_P_2_LEN_0) },
9848   },
9849
9850   /* VEX_LEN_0F92_P_3 */
9851   {
9852     { VEX_W_TABLE (VEX_W_0F92_P_3_LEN_0) },
9853   },
9854
9855   /* VEX_LEN_0F93_P_0 */
9856   {
9857     { VEX_W_TABLE (VEX_W_0F93_P_0_LEN_0) },
9858   },
9859
9860   /* VEX_LEN_0F93_P_2 */
9861   {
9862     { VEX_W_TABLE (VEX_W_0F93_P_2_LEN_0) },
9863   },
9864
9865   /* VEX_LEN_0F93_P_3 */
9866   {
9867     { VEX_W_TABLE (VEX_W_0F93_P_3_LEN_0) },
9868   },
9869
9870   /* VEX_LEN_0F98_P_0 */
9871   {
9872     { VEX_W_TABLE (VEX_W_0F98_P_0_LEN_0) },
9873   },
9874
9875   /* VEX_LEN_0F98_P_2 */
9876   {
9877     { VEX_W_TABLE (VEX_W_0F98_P_2_LEN_0) },
9878   },
9879
9880   /* VEX_LEN_0F99_P_0 */
9881   {
9882     { VEX_W_TABLE (VEX_W_0F99_P_0_LEN_0) },
9883   },
9884
9885   /* VEX_LEN_0F99_P_2 */
9886   {
9887     { VEX_W_TABLE (VEX_W_0F99_P_2_LEN_0) },
9888   },
9889
9890   /* VEX_LEN_0FAE_R_2_M_0 */
9891   {
9892     { VEX_W_TABLE (VEX_W_0FAE_R_2_M_0) },
9893   },
9894
9895   /* VEX_LEN_0FAE_R_3_M_0 */
9896   {
9897     { VEX_W_TABLE (VEX_W_0FAE_R_3_M_0) },
9898   },
9899
9900   /* VEX_LEN_0FC2_P_1 */
9901   {
9902     { VEX_W_TABLE (VEX_W_0FC2_P_1) },
9903     { VEX_W_TABLE (VEX_W_0FC2_P_1) },
9904   },
9905
9906   /* VEX_LEN_0FC2_P_3 */
9907   {
9908     { VEX_W_TABLE (VEX_W_0FC2_P_3) },
9909     { VEX_W_TABLE (VEX_W_0FC2_P_3) },
9910   },
9911
9912   /* VEX_LEN_0FC4_P_2 */
9913   {
9914     { VEX_W_TABLE (VEX_W_0FC4_P_2) },
9915   },
9916
9917   /* VEX_LEN_0FC5_P_2 */
9918   {
9919     { VEX_W_TABLE (VEX_W_0FC5_P_2) },
9920   },
9921
9922   /* VEX_LEN_0FD6_P_2 */
9923   {
9924     { VEX_W_TABLE (VEX_W_0FD6_P_2) },
9925     { VEX_W_TABLE (VEX_W_0FD6_P_2) },
9926   },
9927
9928   /* VEX_LEN_0FF7_P_2 */
9929   {
9930     { VEX_W_TABLE (VEX_W_0FF7_P_2) },
9931   },
9932
9933   /* VEX_LEN_0F3816_P_2 */
9934   {
9935     { Bad_Opcode },
9936     { VEX_W_TABLE (VEX_W_0F3816_P_2) },
9937   },
9938
9939   /* VEX_LEN_0F3819_P_2 */
9940   {
9941     { Bad_Opcode },
9942     { VEX_W_TABLE (VEX_W_0F3819_P_2) },
9943   },
9944
9945   /* VEX_LEN_0F381A_P_2_M_0 */
9946   {
9947     { Bad_Opcode },
9948     { VEX_W_TABLE (VEX_W_0F381A_P_2_M_0) },
9949   },
9950
9951   /* VEX_LEN_0F3836_P_2 */
9952   {
9953     { Bad_Opcode },
9954     { VEX_W_TABLE (VEX_W_0F3836_P_2) },
9955   },
9956
9957   /* VEX_LEN_0F3841_P_2 */
9958   {
9959     { VEX_W_TABLE (VEX_W_0F3841_P_2) },
9960   },
9961
9962   /* VEX_LEN_0F385A_P_2_M_0 */
9963   {
9964     { Bad_Opcode },
9965     { VEX_W_TABLE (VEX_W_0F385A_P_2_M_0) },
9966   },
9967
9968   /* VEX_LEN_0F38DB_P_2 */
9969   {
9970     { VEX_W_TABLE (VEX_W_0F38DB_P_2) },
9971   },
9972
9973   /* VEX_LEN_0F38DC_P_2 */
9974   {
9975     { VEX_W_TABLE (VEX_W_0F38DC_P_2) },
9976   },
9977
9978   /* VEX_LEN_0F38DD_P_2 */
9979   {
9980     { VEX_W_TABLE (VEX_W_0F38DD_P_2) },
9981   },
9982
9983   /* VEX_LEN_0F38DE_P_2 */
9984   {
9985     { VEX_W_TABLE (VEX_W_0F38DE_P_2) },
9986   },
9987
9988   /* VEX_LEN_0F38DF_P_2 */
9989   {
9990     { VEX_W_TABLE (VEX_W_0F38DF_P_2) },
9991   },
9992
9993   /* VEX_LEN_0F38F2_P_0 */
9994   {
9995     { "andnS",          { Gdq, VexGdq, Edq }, 0 },
9996   },
9997
9998   /* VEX_LEN_0F38F3_R_1_P_0 */
9999   {
10000     { "blsrS",          { VexGdq, Edq }, 0 },
10001   },
10002
10003   /* VEX_LEN_0F38F3_R_2_P_0 */
10004   {
10005     { "blsmskS",        { VexGdq, Edq }, 0 },
10006   },
10007
10008   /* VEX_LEN_0F38F3_R_3_P_0 */
10009   {
10010     { "blsiS",          { VexGdq, Edq }, 0 },
10011   },
10012
10013   /* VEX_LEN_0F38F5_P_0 */
10014   {
10015     { "bzhiS",          { Gdq, Edq, VexGdq }, 0 },
10016   },
10017
10018   /* VEX_LEN_0F38F5_P_1 */
10019   {
10020     { "pextS",          { Gdq, VexGdq, Edq }, 0 },
10021   },
10022
10023   /* VEX_LEN_0F38F5_P_3 */
10024   {
10025     { "pdepS",          { Gdq, VexGdq, Edq }, 0 },
10026   },
10027
10028   /* VEX_LEN_0F38F6_P_3 */
10029   {
10030     { "mulxS",          { Gdq, VexGdq, Edq }, 0 },
10031   },
10032
10033   /* VEX_LEN_0F38F7_P_0 */
10034   {
10035     { "bextrS",         { Gdq, Edq, VexGdq }, 0 },
10036   },
10037
10038   /* VEX_LEN_0F38F7_P_1 */
10039   {
10040     { "sarxS",          { Gdq, Edq, VexGdq }, 0 },
10041   },
10042
10043   /* VEX_LEN_0F38F7_P_2 */
10044   {
10045     { "shlxS",          { Gdq, Edq, VexGdq }, 0 },
10046   },
10047
10048   /* VEX_LEN_0F38F7_P_3 */
10049   {
10050     { "shrxS",          { Gdq, Edq, VexGdq }, 0 },
10051   },
10052
10053   /* VEX_LEN_0F3A00_P_2 */
10054   {
10055     { Bad_Opcode },
10056     { VEX_W_TABLE (VEX_W_0F3A00_P_2) },
10057   },
10058
10059   /* VEX_LEN_0F3A01_P_2 */
10060   {
10061     { Bad_Opcode },
10062     { VEX_W_TABLE (VEX_W_0F3A01_P_2) },
10063   },
10064
10065   /* VEX_LEN_0F3A06_P_2 */
10066   {
10067     { Bad_Opcode },
10068     { VEX_W_TABLE (VEX_W_0F3A06_P_2) },
10069   },
10070
10071   /* VEX_LEN_0F3A0A_P_2 */
10072   {
10073     { VEX_W_TABLE (VEX_W_0F3A0A_P_2) },
10074     { VEX_W_TABLE (VEX_W_0F3A0A_P_2) },
10075   },
10076
10077   /* VEX_LEN_0F3A0B_P_2 */
10078   {
10079     { VEX_W_TABLE (VEX_W_0F3A0B_P_2) },
10080     { VEX_W_TABLE (VEX_W_0F3A0B_P_2) },
10081   },
10082
10083   /* VEX_LEN_0F3A14_P_2 */
10084   {
10085     { VEX_W_TABLE (VEX_W_0F3A14_P_2) },
10086   },
10087
10088   /* VEX_LEN_0F3A15_P_2 */
10089   {
10090     { VEX_W_TABLE (VEX_W_0F3A15_P_2) },
10091   },
10092
10093   /* VEX_LEN_0F3A16_P_2  */
10094   {
10095     { "vpextrK",        { Edq, XM, Ib }, 0 },
10096   },
10097
10098   /* VEX_LEN_0F3A17_P_2 */
10099   {
10100     { "vextractps",     { Edqd, XM, Ib }, 0 },
10101   },
10102
10103   /* VEX_LEN_0F3A18_P_2 */
10104   {
10105     { Bad_Opcode },
10106     { VEX_W_TABLE (VEX_W_0F3A18_P_2) },
10107   },
10108
10109   /* VEX_LEN_0F3A19_P_2 */
10110   {
10111     { Bad_Opcode },
10112     { VEX_W_TABLE (VEX_W_0F3A19_P_2) },
10113   },
10114
10115   /* VEX_LEN_0F3A20_P_2 */
10116   {
10117     { VEX_W_TABLE (VEX_W_0F3A20_P_2) },
10118   },
10119
10120   /* VEX_LEN_0F3A21_P_2 */
10121   {
10122     { VEX_W_TABLE (VEX_W_0F3A21_P_2) },
10123   },
10124
10125   /* VEX_LEN_0F3A22_P_2 */
10126   {
10127     { "vpinsrK",        { XM, Vex128, Edq, Ib }, 0 },
10128   },
10129
10130   /* VEX_LEN_0F3A30_P_2 */
10131   {
10132     { VEX_W_TABLE (VEX_W_0F3A30_P_2_LEN_0) },
10133   },
10134
10135   /* VEX_LEN_0F3A31_P_2 */
10136   {
10137     { VEX_W_TABLE (VEX_W_0F3A31_P_2_LEN_0) },
10138   },
10139
10140   /* VEX_LEN_0F3A32_P_2 */
10141   {
10142     { VEX_W_TABLE (VEX_W_0F3A32_P_2_LEN_0) },
10143   },
10144
10145   /* VEX_LEN_0F3A33_P_2 */
10146   {
10147     { VEX_W_TABLE (VEX_W_0F3A33_P_2_LEN_0) },
10148   },
10149
10150   /* VEX_LEN_0F3A38_P_2 */
10151   {
10152     { Bad_Opcode },
10153     { VEX_W_TABLE (VEX_W_0F3A38_P_2) },
10154   },
10155
10156   /* VEX_LEN_0F3A39_P_2 */
10157   {
10158     { Bad_Opcode },
10159     { VEX_W_TABLE (VEX_W_0F3A39_P_2) },
10160   },
10161
10162   /* VEX_LEN_0F3A41_P_2 */
10163   {
10164     { VEX_W_TABLE (VEX_W_0F3A41_P_2) },
10165   },
10166
10167   /* VEX_LEN_0F3A44_P_2 */
10168   {
10169     { VEX_W_TABLE (VEX_W_0F3A44_P_2) },
10170   },
10171
10172   /* VEX_LEN_0F3A46_P_2 */
10173   {
10174     { Bad_Opcode },
10175     { VEX_W_TABLE (VEX_W_0F3A46_P_2) },
10176   },
10177
10178   /* VEX_LEN_0F3A60_P_2 */
10179   {
10180     { VEX_W_TABLE (VEX_W_0F3A60_P_2) },
10181   },
10182
10183   /* VEX_LEN_0F3A61_P_2 */
10184   {
10185     { VEX_W_TABLE (VEX_W_0F3A61_P_2) },
10186   },
10187
10188   /* VEX_LEN_0F3A62_P_2 */
10189   {
10190     { VEX_W_TABLE (VEX_W_0F3A62_P_2) },
10191   },
10192
10193   /* VEX_LEN_0F3A63_P_2 */
10194   {
10195     { VEX_W_TABLE (VEX_W_0F3A63_P_2) },
10196   },
10197
10198   /* VEX_LEN_0F3A6A_P_2 */
10199   {
10200     { "vfmaddss",       { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 }, 0 },
10201   },
10202
10203   /* VEX_LEN_0F3A6B_P_2 */
10204   {
10205     { "vfmaddsd",       { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 }, 0 },
10206   },
10207
10208   /* VEX_LEN_0F3A6E_P_2 */
10209   {
10210     { "vfmsubss",       { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 }, 0 },
10211   },
10212
10213   /* VEX_LEN_0F3A6F_P_2 */
10214   {
10215     { "vfmsubsd",       { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 }, 0 },
10216   },
10217
10218   /* VEX_LEN_0F3A7A_P_2 */
10219   {
10220     { "vfnmaddss",      { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 }, 0 },
10221   },
10222
10223   /* VEX_LEN_0F3A7B_P_2 */
10224   {
10225     { "vfnmaddsd",      { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 }, 0 },
10226   },
10227
10228   /* VEX_LEN_0F3A7E_P_2 */
10229   {
10230     { "vfnmsubss",      { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 }, 0 },
10231   },
10232
10233   /* VEX_LEN_0F3A7F_P_2 */
10234   {
10235     { "vfnmsubsd",      { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 }, 0 },
10236   },
10237
10238   /* VEX_LEN_0F3ADF_P_2 */
10239   {
10240     { VEX_W_TABLE (VEX_W_0F3ADF_P_2) },
10241   },
10242
10243   /* VEX_LEN_0F3AF0_P_3 */
10244   {
10245     { "rorxS",          { Gdq, Edq, Ib }, 0 },
10246   },
10247
10248   /* VEX_LEN_0FXOP_08_CC */
10249   {
10250      { "vpcomb",        { XM, Vex128, EXx, Ib }, 0 },
10251   },
10252
10253   /* VEX_LEN_0FXOP_08_CD */
10254   {
10255      { "vpcomw",        { XM, Vex128, EXx, Ib }, 0 },
10256   },
10257
10258   /* VEX_LEN_0FXOP_08_CE */
10259   {
10260      { "vpcomd",        { XM, Vex128, EXx, Ib }, 0 },
10261   },
10262
10263   /* VEX_LEN_0FXOP_08_CF */
10264   {
10265      { "vpcomq",        { XM, Vex128, EXx, Ib }, 0 },
10266   },
10267
10268   /* VEX_LEN_0FXOP_08_EC */
10269   {
10270      { "vpcomub",       { XM, Vex128, EXx, Ib }, 0 },
10271   },
10272
10273   /* VEX_LEN_0FXOP_08_ED */
10274   {
10275      { "vpcomuw",       { XM, Vex128, EXx, Ib }, 0 },
10276   },
10277
10278   /* VEX_LEN_0FXOP_08_EE */
10279   {
10280      { "vpcomud",       { XM, Vex128, EXx, Ib }, 0 },
10281   },
10282
10283   /* VEX_LEN_0FXOP_08_EF */
10284   {
10285      { "vpcomuq",       { XM, Vex128, EXx, Ib }, 0 },
10286   },
10287
10288   /* VEX_LEN_0FXOP_09_80 */
10289   {
10290     { "vfrczps",        { XM, EXxmm }, 0 },
10291     { "vfrczps",        { XM, EXymmq }, 0 },
10292   },
10293
10294   /* VEX_LEN_0FXOP_09_81 */
10295   {
10296     { "vfrczpd",        { XM, EXxmm }, 0 },
10297     { "vfrczpd",        { XM, EXymmq }, 0 },
10298   },
10299 };
10300
10301 static const struct dis386 vex_w_table[][2] = {
10302   {
10303     /* VEX_W_0F10_P_0 */
10304     { "vmovups",        { XM, EXx }, 0 },
10305   },
10306   {
10307     /* VEX_W_0F10_P_1 */
10308     { "vmovss",         { XMVexScalar, VexScalar, EXdScalar }, 0 },
10309   },
10310   {
10311     /* VEX_W_0F10_P_2 */
10312     { "vmovupd",        { XM, EXx }, 0 },
10313   },
10314   {
10315     /* VEX_W_0F10_P_3 */
10316     { "vmovsd",         { XMVexScalar, VexScalar, EXqScalar }, 0 },
10317   },
10318   {
10319     /* VEX_W_0F11_P_0 */
10320     { "vmovups",        { EXxS, XM }, 0 },
10321   },
10322   {
10323     /* VEX_W_0F11_P_1 */
10324     { "vmovss",         { EXdVexScalarS, VexScalar, XMScalar }, 0 },
10325   },
10326   {
10327     /* VEX_W_0F11_P_2 */
10328     { "vmovupd",        { EXxS, XM }, 0 },
10329   },
10330   {
10331     /* VEX_W_0F11_P_3 */
10332     { "vmovsd",         { EXqVexScalarS, VexScalar, XMScalar }, 0 },
10333   },
10334   {
10335     /* VEX_W_0F12_P_0_M_0 */
10336     { "vmovlps",        { XM, Vex128, EXq }, 0 },
10337   },
10338   {
10339     /* VEX_W_0F12_P_0_M_1 */
10340     { "vmovhlps",       { XM, Vex128, EXq }, 0 },
10341   },
10342   {
10343     /* VEX_W_0F12_P_1 */
10344     { "vmovsldup",      { XM, EXx }, 0 },
10345   },
10346   {
10347     /* VEX_W_0F12_P_2 */
10348     { "vmovlpd",        { XM, Vex128, EXq }, 0 },
10349   },
10350   {
10351     /* VEX_W_0F12_P_3 */
10352     { "vmovddup",       { XM, EXymmq }, 0 },
10353   },
10354   {
10355     /* VEX_W_0F13_M_0 */
10356     { "vmovlpX",        { EXq, XM }, 0 },
10357   },
10358   {
10359     /* VEX_W_0F14 */
10360     { "vunpcklpX",      { XM, Vex, EXx }, 0 },
10361   },
10362   {
10363     /* VEX_W_0F15 */
10364     { "vunpckhpX",      { XM, Vex, EXx }, 0 },
10365   },
10366   {
10367     /* VEX_W_0F16_P_0_M_0 */
10368     { "vmovhps",        { XM, Vex128, EXq }, 0 },
10369   },
10370   {
10371     /* VEX_W_0F16_P_0_M_1 */
10372     { "vmovlhps",       { XM, Vex128, EXq }, 0 },
10373   },
10374   {
10375     /* VEX_W_0F16_P_1 */
10376     { "vmovshdup",      { XM, EXx }, 0 },
10377   },
10378   {
10379     /* VEX_W_0F16_P_2 */
10380     { "vmovhpd",        { XM, Vex128, EXq }, 0 },
10381   },
10382   {
10383     /* VEX_W_0F17_M_0 */
10384     { "vmovhpX",        { EXq, XM }, 0 },
10385   },
10386   {
10387     /* VEX_W_0F28 */
10388     { "vmovapX",        { XM, EXx }, 0 },
10389   },
10390   {
10391     /* VEX_W_0F29 */
10392     { "vmovapX",        { EXxS, XM }, 0 },
10393   },
10394   {
10395     /* VEX_W_0F2B_M_0 */
10396     { "vmovntpX",       { Mx, XM }, 0 },
10397   },
10398   {
10399     /* VEX_W_0F2E_P_0 */
10400     { "vucomiss",       { XMScalar, EXdScalar }, 0 },
10401   },
10402   {
10403     /* VEX_W_0F2E_P_2 */
10404     { "vucomisd",       { XMScalar, EXqScalar }, 0 },
10405   },
10406   {
10407     /* VEX_W_0F2F_P_0 */
10408     { "vcomiss",        { XMScalar, EXdScalar }, 0 },
10409   },
10410   {
10411     /* VEX_W_0F2F_P_2 */
10412     { "vcomisd",        { XMScalar, EXqScalar }, 0 },
10413   },
10414   {
10415     /* VEX_W_0F41_P_0_LEN_1 */
10416     { "kandw",          { MaskG, MaskVex, MaskR }, 0 },
10417     { "kandq",          { MaskG, MaskVex, MaskR }, 0 },
10418   },
10419   {
10420     /* VEX_W_0F41_P_2_LEN_1 */
10421     { "kandb",          { MaskG, MaskVex, MaskR }, 0 },
10422     { "kandd",          { MaskG, MaskVex, MaskR }, 0 },
10423   },
10424   {
10425     /* VEX_W_0F42_P_0_LEN_1 */
10426     { "kandnw",         { MaskG, MaskVex, MaskR }, 0 },
10427     { "kandnq",         { MaskG, MaskVex, MaskR }, 0 },
10428   },
10429   {
10430     /* VEX_W_0F42_P_2_LEN_1 */
10431     { "kandnb",         { MaskG, MaskVex, MaskR }, 0 },
10432     { "kandnd",         { MaskG, MaskVex, MaskR }, 0 },
10433   },
10434   {
10435     /* VEX_W_0F44_P_0_LEN_0 */
10436     { "knotw",          { MaskG, MaskR }, 0 },
10437     { "knotq",          { MaskG, MaskR }, 0 },
10438   },
10439   {
10440     /* VEX_W_0F44_P_2_LEN_0 */
10441     { "knotb",          { MaskG, MaskR }, 0 },
10442     { "knotd",          { MaskG, MaskR }, 0 },
10443   },
10444   {
10445     /* VEX_W_0F45_P_0_LEN_1 */
10446     { "korw",           { MaskG, MaskVex, MaskR }, 0 },
10447     { "korq",           { MaskG, MaskVex, MaskR }, 0 },
10448   },
10449   {
10450     /* VEX_W_0F45_P_2_LEN_1 */
10451     { "korb",           { MaskG, MaskVex, MaskR }, 0 },
10452     { "kord",           { MaskG, MaskVex, MaskR }, 0 },
10453   },
10454   {
10455     /* VEX_W_0F46_P_0_LEN_1 */
10456     { "kxnorw",         { MaskG, MaskVex, MaskR }, 0 },
10457     { "kxnorq",         { MaskG, MaskVex, MaskR }, 0 },
10458   },
10459   {
10460     /* VEX_W_0F46_P_2_LEN_1 */
10461     { "kxnorb",         { MaskG, MaskVex, MaskR }, 0 },
10462     { "kxnord",         { MaskG, MaskVex, MaskR }, 0 },
10463   },
10464   {
10465     /* VEX_W_0F47_P_0_LEN_1 */
10466     { "kxorw",          { MaskG, MaskVex, MaskR }, 0 },
10467     { "kxorq",          { MaskG, MaskVex, MaskR }, 0 },
10468   },
10469   {
10470     /* VEX_W_0F47_P_2_LEN_1 */
10471     { "kxorb",          { MaskG, MaskVex, MaskR }, 0 },
10472     { "kxord",          { MaskG, MaskVex, MaskR }, 0 },
10473   },
10474   {
10475     /* VEX_W_0F4A_P_0_LEN_1 */
10476     { "kaddw",          { MaskG, MaskVex, MaskR }, 0 },
10477     { "kaddq",          { MaskG, MaskVex, MaskR }, 0 },
10478   },
10479   {
10480     /* VEX_W_0F4A_P_2_LEN_1 */
10481     { "kaddb",          { MaskG, MaskVex, MaskR }, 0 },
10482     { "kaddd",          { MaskG, MaskVex, MaskR }, 0 },
10483   },
10484   {
10485     /* VEX_W_0F4B_P_0_LEN_1 */
10486     { "kunpckwd",       { MaskG, MaskVex, MaskR }, 0 },
10487     { "kunpckdq",       { MaskG, MaskVex, MaskR }, 0 },
10488   },
10489   {
10490     /* VEX_W_0F4B_P_2_LEN_1 */
10491     { "kunpckbw",       { MaskG, MaskVex, MaskR }, 0 },
10492   },
10493   {
10494     /* VEX_W_0F50_M_0 */
10495     { "vmovmskpX",      { Gdq, XS }, 0 },
10496   },
10497   {
10498     /* VEX_W_0F51_P_0 */
10499     { "vsqrtps",        { XM, EXx }, 0 },
10500   },
10501   {
10502     /* VEX_W_0F51_P_1 */
10503     { "vsqrtss",        { XMScalar, VexScalar, EXdScalar }, 0 },
10504   },
10505   {
10506     /* VEX_W_0F51_P_2  */
10507     { "vsqrtpd",        { XM, EXx }, 0 },
10508   },
10509   {
10510     /* VEX_W_0F51_P_3 */
10511     { "vsqrtsd",        { XMScalar, VexScalar, EXqScalar }, 0 },
10512   },
10513   {
10514     /* VEX_W_0F52_P_0 */
10515     { "vrsqrtps",       { XM, EXx }, 0 },
10516   },
10517   {
10518     /* VEX_W_0F52_P_1 */
10519     { "vrsqrtss",       { XMScalar, VexScalar, EXdScalar }, 0 },
10520   },
10521   {
10522     /* VEX_W_0F53_P_0  */
10523     { "vrcpps",         { XM, EXx }, 0 },
10524   },
10525   {
10526     /* VEX_W_0F53_P_1  */
10527     { "vrcpss",         { XMScalar, VexScalar, EXdScalar }, 0 },
10528   },
10529   {
10530     /* VEX_W_0F58_P_0  */
10531     { "vaddps",         { XM, Vex, EXx }, 0 },
10532   },
10533   {
10534     /* VEX_W_0F58_P_1  */
10535     { "vaddss",         { XMScalar, VexScalar, EXdScalar }, 0 },
10536   },
10537   {
10538     /* VEX_W_0F58_P_2  */
10539     { "vaddpd",         { XM, Vex, EXx }, 0 },
10540   },
10541   {
10542     /* VEX_W_0F58_P_3  */
10543     { "vaddsd",         { XMScalar, VexScalar, EXqScalar }, 0 },
10544   },
10545   {
10546     /* VEX_W_0F59_P_0  */
10547     { "vmulps",         { XM, Vex, EXx }, 0 },
10548   },
10549   {
10550     /* VEX_W_0F59_P_1  */
10551     { "vmulss",         { XMScalar, VexScalar, EXdScalar }, 0 },
10552   },
10553   {
10554     /* VEX_W_0F59_P_2  */
10555     { "vmulpd",         { XM, Vex, EXx }, 0 },
10556   },
10557   {
10558     /* VEX_W_0F59_P_3  */
10559     { "vmulsd",         { XMScalar, VexScalar, EXqScalar }, 0 },
10560   },
10561   {
10562     /* VEX_W_0F5A_P_0  */
10563     { "vcvtps2pd",      { XM, EXxmmq }, 0 },
10564   },
10565   {
10566     /* VEX_W_0F5A_P_1  */
10567     { "vcvtss2sd",      { XMScalar, VexScalar, EXdScalar }, 0 },
10568   },
10569   {
10570     /* VEX_W_0F5A_P_3  */
10571     { "vcvtsd2ss",      { XMScalar, VexScalar, EXqScalar }, 0 },
10572   },
10573   {
10574     /* VEX_W_0F5B_P_0  */
10575     { "vcvtdq2ps",      { XM, EXx }, 0 },
10576   },
10577   {
10578     /* VEX_W_0F5B_P_1  */
10579     { "vcvttps2dq",     { XM, EXx }, 0 },
10580   },
10581   {
10582     /* VEX_W_0F5B_P_2  */
10583     { "vcvtps2dq",      { XM, EXx }, 0 },
10584   },
10585   {
10586     /* VEX_W_0F5C_P_0  */
10587     { "vsubps",         { XM, Vex, EXx }, 0 },
10588   },
10589   {
10590     /* VEX_W_0F5C_P_1  */
10591     { "vsubss",         { XMScalar, VexScalar, EXdScalar }, 0 },
10592   },
10593   {
10594     /* VEX_W_0F5C_P_2  */
10595     { "vsubpd",         { XM, Vex, EXx }, 0 },
10596   },
10597   {
10598     /* VEX_W_0F5C_P_3  */
10599     { "vsubsd",         { XMScalar, VexScalar, EXqScalar }, 0 },
10600   },
10601   {
10602     /* VEX_W_0F5D_P_0  */
10603     { "vminps",         { XM, Vex, EXx }, 0 },
10604   },
10605   {
10606     /* VEX_W_0F5D_P_1  */
10607     { "vminss",         { XMScalar, VexScalar, EXdScalar }, 0 },
10608   },
10609   {
10610     /* VEX_W_0F5D_P_2  */
10611     { "vminpd",         { XM, Vex, EXx }, 0 },
10612   },
10613   {
10614     /* VEX_W_0F5D_P_3  */
10615     { "vminsd",         { XMScalar, VexScalar, EXqScalar }, 0 },
10616   },
10617   {
10618     /* VEX_W_0F5E_P_0  */
10619     { "vdivps",         { XM, Vex, EXx }, 0 },
10620   },
10621   {
10622     /* VEX_W_0F5E_P_1  */
10623     { "vdivss",         { XMScalar, VexScalar, EXdScalar }, 0 },
10624   },
10625   {
10626     /* VEX_W_0F5E_P_2  */
10627     { "vdivpd",         { XM, Vex, EXx }, 0 },
10628   },
10629   {
10630     /* VEX_W_0F5E_P_3  */
10631     { "vdivsd",         { XMScalar, VexScalar, EXqScalar }, 0 },
10632   },
10633   {
10634     /* VEX_W_0F5F_P_0  */
10635     { "vmaxps",         { XM, Vex, EXx }, 0 },
10636   },
10637   {
10638     /* VEX_W_0F5F_P_1  */
10639     { "vmaxss",         { XMScalar, VexScalar, EXdScalar }, 0 },
10640   },
10641   {
10642     /* VEX_W_0F5F_P_2  */
10643     { "vmaxpd",         { XM, Vex, EXx }, 0 },
10644   },
10645   {
10646     /* VEX_W_0F5F_P_3  */
10647     { "vmaxsd",         { XMScalar, VexScalar, EXqScalar }, 0 },
10648   },
10649   {
10650     /* VEX_W_0F60_P_2  */
10651     { "vpunpcklbw",     { XM, Vex, EXx }, 0 },
10652   },
10653   {
10654     /* VEX_W_0F61_P_2  */
10655     { "vpunpcklwd",     { XM, Vex, EXx }, 0 },
10656   },
10657   {
10658     /* VEX_W_0F62_P_2  */
10659     { "vpunpckldq",     { XM, Vex, EXx }, 0 },
10660   },
10661   {
10662     /* VEX_W_0F63_P_2  */
10663     { "vpacksswb",      { XM, Vex, EXx }, 0 },
10664   },
10665   {
10666     /* VEX_W_0F64_P_2  */
10667     { "vpcmpgtb",       { XM, Vex, EXx }, 0 },
10668   },
10669   {
10670     /* VEX_W_0F65_P_2  */
10671     { "vpcmpgtw",       { XM, Vex, EXx }, 0 },
10672   },
10673   {
10674     /* VEX_W_0F66_P_2  */
10675     { "vpcmpgtd",       { XM, Vex, EXx }, 0 },
10676   },
10677   {
10678     /* VEX_W_0F67_P_2  */
10679     { "vpackuswb",      { XM, Vex, EXx }, 0 },
10680   },
10681   {
10682     /* VEX_W_0F68_P_2  */
10683     { "vpunpckhbw",     { XM, Vex, EXx }, 0 },
10684   },
10685   {
10686     /* VEX_W_0F69_P_2  */
10687     { "vpunpckhwd",     { XM, Vex, EXx }, 0 },
10688   },
10689   {
10690     /* VEX_W_0F6A_P_2  */
10691     { "vpunpckhdq",     { XM, Vex, EXx }, 0 },
10692   },
10693   {
10694     /* VEX_W_0F6B_P_2  */
10695     { "vpackssdw",      { XM, Vex, EXx }, 0 },
10696   },
10697   {
10698     /* VEX_W_0F6C_P_2  */
10699     { "vpunpcklqdq",    { XM, Vex, EXx }, 0 },
10700   },
10701   {
10702     /* VEX_W_0F6D_P_2  */
10703     { "vpunpckhqdq",    { XM, Vex, EXx }, 0 },
10704   },
10705   {
10706     /* VEX_W_0F6F_P_1  */
10707     { "vmovdqu",        { XM, EXx }, 0 },
10708   },
10709   {
10710     /* VEX_W_0F6F_P_2  */
10711     { "vmovdqa",        { XM, EXx }, 0 },
10712   },
10713   {
10714     /* VEX_W_0F70_P_1 */
10715     { "vpshufhw",       { XM, EXx, Ib }, 0 },
10716   },
10717   {
10718     /* VEX_W_0F70_P_2 */
10719     { "vpshufd",        { XM, EXx, Ib }, 0 },
10720   },
10721   {
10722     /* VEX_W_0F70_P_3 */
10723     { "vpshuflw",       { XM, EXx, Ib }, 0 },
10724   },
10725   {
10726     /* VEX_W_0F71_R_2_P_2  */
10727     { "vpsrlw",         { Vex, XS, Ib }, 0 },
10728   },
10729   {
10730     /* VEX_W_0F71_R_4_P_2  */
10731     { "vpsraw",         { Vex, XS, Ib }, 0 },
10732   },
10733   {
10734     /* VEX_W_0F71_R_6_P_2  */
10735     { "vpsllw",         { Vex, XS, Ib }, 0 },
10736   },
10737   {
10738     /* VEX_W_0F72_R_2_P_2  */
10739     { "vpsrld",         { Vex, XS, Ib }, 0 },
10740   },
10741   {
10742     /* VEX_W_0F72_R_4_P_2  */
10743     { "vpsrad",         { Vex, XS, Ib }, 0 },
10744   },
10745   {
10746     /* VEX_W_0F72_R_6_P_2  */
10747     { "vpslld",         { Vex, XS, Ib }, 0 },
10748   },
10749   {
10750     /* VEX_W_0F73_R_2_P_2  */
10751     { "vpsrlq",         { Vex, XS, Ib }, 0 },
10752   },
10753   {
10754     /* VEX_W_0F73_R_3_P_2  */
10755     { "vpsrldq",        { Vex, XS, Ib }, 0 },
10756   },
10757   {
10758     /* VEX_W_0F73_R_6_P_2  */
10759     { "vpsllq",         { Vex, XS, Ib }, 0 },
10760   },
10761   {
10762     /* VEX_W_0F73_R_7_P_2  */
10763     { "vpslldq",        { Vex, XS, Ib }, 0 },
10764   },
10765   {
10766     /* VEX_W_0F74_P_2 */
10767     { "vpcmpeqb",       { XM, Vex, EXx }, 0 },
10768   },
10769   {
10770     /* VEX_W_0F75_P_2 */
10771     { "vpcmpeqw",       { XM, Vex, EXx }, 0 },
10772   },
10773   {
10774     /* VEX_W_0F76_P_2 */
10775     { "vpcmpeqd",       { XM, Vex, EXx }, 0 },
10776   },
10777   {
10778     /* VEX_W_0F77_P_0 */
10779     { "",               { VZERO }, 0 },
10780   },
10781   {
10782     /* VEX_W_0F7C_P_2 */
10783     { "vhaddpd",        { XM, Vex, EXx }, 0 },
10784   },
10785   {
10786     /* VEX_W_0F7C_P_3 */
10787     { "vhaddps",        { XM, Vex, EXx }, 0 },
10788   },
10789   {
10790     /* VEX_W_0F7D_P_2 */
10791     { "vhsubpd",        { XM, Vex, EXx }, 0 },
10792   },
10793   {
10794     /* VEX_W_0F7D_P_3 */
10795     { "vhsubps",        { XM, Vex, EXx }, 0 },
10796   },
10797   {
10798     /* VEX_W_0F7E_P_1 */
10799     { "vmovq",          { XMScalar, EXqScalar }, 0 },
10800   },
10801   {
10802     /* VEX_W_0F7F_P_1 */
10803     { "vmovdqu",        { EXxS, XM }, 0 },
10804   },
10805   {
10806     /* VEX_W_0F7F_P_2 */
10807     { "vmovdqa",        { EXxS, XM }, 0 },
10808   },
10809   {
10810     /* VEX_W_0F90_P_0_LEN_0 */
10811     { "kmovw",          { MaskG, MaskE }, 0 },
10812     { "kmovq",          { MaskG, MaskE }, 0 },
10813   },
10814   {
10815     /* VEX_W_0F90_P_2_LEN_0 */
10816     { "kmovb",          { MaskG, MaskBDE }, 0 },
10817     { "kmovd",          { MaskG, MaskBDE }, 0 },
10818   },
10819   {
10820     /* VEX_W_0F91_P_0_LEN_0 */
10821     { "kmovw",          { Ew, MaskG }, 0 },
10822     { "kmovq",          { Eq, MaskG }, 0 },
10823   },
10824   {
10825     /* VEX_W_0F91_P_2_LEN_0 */
10826     { "kmovb",          { Eb, MaskG }, 0 },
10827     { "kmovd",          { Ed, MaskG }, 0 },
10828   },
10829   {
10830     /* VEX_W_0F92_P_0_LEN_0 */
10831     { "kmovw",          { MaskG, Rdq }, 0 },
10832   },
10833   {
10834     /* VEX_W_0F92_P_2_LEN_0 */
10835     { "kmovb",          { MaskG, Rdq }, 0 },
10836   },
10837   {
10838     /* VEX_W_0F92_P_3_LEN_0 */
10839     { "kmovd",          { MaskG, Rdq }, 0 },
10840     { "kmovq",          { MaskG, Rdq }, 0 },
10841   },
10842   {
10843     /* VEX_W_0F93_P_0_LEN_0 */
10844     { "kmovw",          { Gdq, MaskR }, 0 },
10845   },
10846   {
10847     /* VEX_W_0F93_P_2_LEN_0 */
10848     { "kmovb",          { Gdq, MaskR }, 0 },
10849   },
10850   {
10851     /* VEX_W_0F93_P_3_LEN_0 */
10852     { "kmovd",          { Gdq, MaskR }, 0 },
10853     { "kmovq",          { Gdq, MaskR }, 0 },
10854   },
10855   {
10856     /* VEX_W_0F98_P_0_LEN_0 */
10857     { "kortestw",       { MaskG, MaskR }, 0 },
10858     { "kortestq",       { MaskG, MaskR }, 0 },
10859   },
10860   {
10861     /* VEX_W_0F98_P_2_LEN_0 */
10862     { "kortestb",       { MaskG, MaskR }, 0 },
10863     { "kortestd",       { MaskG, MaskR }, 0 },
10864   },
10865   {
10866     /* VEX_W_0F99_P_0_LEN_0 */
10867     { "ktestw", { MaskG, MaskR }, 0 },
10868     { "ktestq", { MaskG, MaskR }, 0 },
10869   },
10870   {
10871     /* VEX_W_0F99_P_2_LEN_0 */
10872     { "ktestb", { MaskG, MaskR }, 0 },
10873     { "ktestd", { MaskG, MaskR }, 0 },
10874   },
10875   {
10876     /* VEX_W_0FAE_R_2_M_0 */
10877     { "vldmxcsr",       { Md }, 0 },
10878   },
10879   {
10880     /* VEX_W_0FAE_R_3_M_0 */
10881     { "vstmxcsr",       { Md }, 0 },
10882   },
10883   {
10884     /* VEX_W_0FC2_P_0 */
10885     { "vcmpps",         { XM, Vex, EXx, VCMP }, 0 },
10886   },
10887   {
10888     /* VEX_W_0FC2_P_1 */
10889     { "vcmpss",         { XMScalar, VexScalar, EXdScalar, VCMP }, 0 },
10890   },
10891   {
10892     /* VEX_W_0FC2_P_2 */
10893     { "vcmppd",         { XM, Vex, EXx, VCMP }, 0 },
10894   },
10895   {
10896     /* VEX_W_0FC2_P_3 */
10897     { "vcmpsd",         { XMScalar, VexScalar, EXqScalar, VCMP }, 0 },
10898   },
10899   {
10900     /* VEX_W_0FC4_P_2 */
10901     { "vpinsrw",        { XM, Vex128, Edqw, Ib }, 0 },
10902   },
10903   {
10904     /* VEX_W_0FC5_P_2 */
10905     { "vpextrw",        { Gdq, XS, Ib }, 0 },
10906   },
10907   {
10908     /* VEX_W_0FD0_P_2 */
10909     { "vaddsubpd",      { XM, Vex, EXx }, 0 },
10910   },
10911   {
10912     /* VEX_W_0FD0_P_3 */
10913     { "vaddsubps",      { XM, Vex, EXx }, 0 },
10914   },
10915   {
10916     /* VEX_W_0FD1_P_2 */
10917     { "vpsrlw",         { XM, Vex, EXxmm }, 0 },
10918   },
10919   {
10920     /* VEX_W_0FD2_P_2 */
10921     { "vpsrld",         { XM, Vex, EXxmm }, 0 },
10922   },
10923   {
10924     /* VEX_W_0FD3_P_2 */
10925     { "vpsrlq",         { XM, Vex, EXxmm }, 0 },
10926   },
10927   {
10928     /* VEX_W_0FD4_P_2 */
10929     { "vpaddq",         { XM, Vex, EXx }, 0 },
10930   },
10931   {
10932     /* VEX_W_0FD5_P_2 */
10933     { "vpmullw",        { XM, Vex, EXx }, 0 },
10934   },
10935   {
10936     /* VEX_W_0FD6_P_2 */
10937     { "vmovq",          { EXqScalarS, XMScalar }, 0 },
10938   },
10939   {
10940     /* VEX_W_0FD7_P_2_M_1 */
10941     { "vpmovmskb",      { Gdq, XS }, 0 },
10942   },
10943   {
10944     /* VEX_W_0FD8_P_2 */
10945     { "vpsubusb",       { XM, Vex, EXx }, 0 },
10946   },
10947   {
10948     /* VEX_W_0FD9_P_2 */
10949     { "vpsubusw",       { XM, Vex, EXx }, 0 },
10950   },
10951   {
10952     /* VEX_W_0FDA_P_2 */
10953     { "vpminub",        { XM, Vex, EXx }, 0 },
10954   },
10955   {
10956     /* VEX_W_0FDB_P_2 */
10957     { "vpand",          { XM, Vex, EXx }, 0 },
10958   },
10959   {
10960     /* VEX_W_0FDC_P_2 */
10961     { "vpaddusb",       { XM, Vex, EXx }, 0 },
10962   },
10963   {
10964     /* VEX_W_0FDD_P_2 */
10965     { "vpaddusw",       { XM, Vex, EXx }, 0 },
10966   },
10967   {
10968     /* VEX_W_0FDE_P_2 */
10969     { "vpmaxub",        { XM, Vex, EXx }, 0 },
10970   },
10971   {
10972     /* VEX_W_0FDF_P_2 */
10973     { "vpandn",         { XM, Vex, EXx }, 0 },
10974   },
10975   {
10976     /* VEX_W_0FE0_P_2  */
10977     { "vpavgb",         { XM, Vex, EXx }, 0 },
10978   },
10979   {
10980     /* VEX_W_0FE1_P_2  */
10981     { "vpsraw",         { XM, Vex, EXxmm }, 0 },
10982   },
10983   {
10984     /* VEX_W_0FE2_P_2  */
10985     { "vpsrad",         { XM, Vex, EXxmm }, 0 },
10986   },
10987   {
10988     /* VEX_W_0FE3_P_2  */
10989     { "vpavgw",         { XM, Vex, EXx }, 0 },
10990   },
10991   {
10992     /* VEX_W_0FE4_P_2  */
10993     { "vpmulhuw",       { XM, Vex, EXx }, 0 },
10994   },
10995   {
10996     /* VEX_W_0FE5_P_2  */
10997     { "vpmulhw",        { XM, Vex, EXx }, 0 },
10998   },
10999   {
11000     /* VEX_W_0FE6_P_1  */
11001     { "vcvtdq2pd",      { XM, EXxmmq }, 0 },
11002   },
11003   {
11004     /* VEX_W_0FE6_P_2  */
11005     { "vcvttpd2dq%XY",  { XMM, EXx }, 0 },
11006   },
11007   {
11008     /* VEX_W_0FE6_P_3  */
11009     { "vcvtpd2dq%XY",   { XMM, EXx }, 0 },
11010   },
11011   {
11012     /* VEX_W_0FE7_P_2_M_0 */
11013     { "vmovntdq",       { Mx, XM }, 0 },
11014   },
11015   {
11016     /* VEX_W_0FE8_P_2  */
11017     { "vpsubsb",        { XM, Vex, EXx }, 0 },
11018   },
11019   {
11020     /* VEX_W_0FE9_P_2  */
11021     { "vpsubsw",        { XM, Vex, EXx }, 0 },
11022   },
11023   {
11024     /* VEX_W_0FEA_P_2  */
11025     { "vpminsw",        { XM, Vex, EXx }, 0 },
11026   },
11027   {
11028     /* VEX_W_0FEB_P_2  */
11029     { "vpor",           { XM, Vex, EXx }, 0 },
11030   },
11031   {
11032     /* VEX_W_0FEC_P_2  */
11033     { "vpaddsb",        { XM, Vex, EXx }, 0 },
11034   },
11035   {
11036     /* VEX_W_0FED_P_2  */
11037     { "vpaddsw",        { XM, Vex, EXx }, 0 },
11038   },
11039   {
11040     /* VEX_W_0FEE_P_2  */
11041     { "vpmaxsw",        { XM, Vex, EXx }, 0 },
11042   },
11043   {
11044     /* VEX_W_0FEF_P_2  */
11045     { "vpxor",          { XM, Vex, EXx }, 0 },
11046   },
11047   {
11048     /* VEX_W_0FF0_P_3_M_0 */
11049     { "vlddqu",         { XM, M }, 0 },
11050   },
11051   {
11052     /* VEX_W_0FF1_P_2 */
11053     { "vpsllw",         { XM, Vex, EXxmm }, 0 },
11054   },
11055   {
11056     /* VEX_W_0FF2_P_2 */
11057     { "vpslld",         { XM, Vex, EXxmm }, 0 },
11058   },
11059   {
11060     /* VEX_W_0FF3_P_2 */
11061     { "vpsllq",         { XM, Vex, EXxmm }, 0 },
11062   },
11063   {
11064     /* VEX_W_0FF4_P_2 */
11065     { "vpmuludq",       { XM, Vex, EXx }, 0 },
11066   },
11067   {
11068     /* VEX_W_0FF5_P_2 */
11069     { "vpmaddwd",       { XM, Vex, EXx }, 0 },
11070   },
11071   {
11072     /* VEX_W_0FF6_P_2 */
11073     { "vpsadbw",        { XM, Vex, EXx }, 0 },
11074   },
11075   {
11076     /* VEX_W_0FF7_P_2 */
11077     { "vmaskmovdqu",    { XM, XS }, 0 },
11078   },
11079   {
11080     /* VEX_W_0FF8_P_2 */
11081     { "vpsubb",         { XM, Vex, EXx }, 0 },
11082   },
11083   {
11084     /* VEX_W_0FF9_P_2 */
11085     { "vpsubw",         { XM, Vex, EXx }, 0 },
11086   },
11087   {
11088     /* VEX_W_0FFA_P_2 */
11089     { "vpsubd",         { XM, Vex, EXx }, 0 },
11090   },
11091   {
11092     /* VEX_W_0FFB_P_2 */
11093     { "vpsubq",         { XM, Vex, EXx }, 0 },
11094   },
11095   {
11096     /* VEX_W_0FFC_P_2 */
11097     { "vpaddb",         { XM, Vex, EXx }, 0 },
11098   },
11099   {
11100     /* VEX_W_0FFD_P_2 */
11101     { "vpaddw",         { XM, Vex, EXx }, 0 },
11102   },
11103   {
11104     /* VEX_W_0FFE_P_2 */
11105     { "vpaddd",         { XM, Vex, EXx }, 0 },
11106   },
11107   {
11108     /* VEX_W_0F3800_P_2  */
11109     { "vpshufb",        { XM, Vex, EXx }, 0 },
11110   },
11111   {
11112     /* VEX_W_0F3801_P_2  */
11113     { "vphaddw",        { XM, Vex, EXx }, 0 },
11114   },
11115   {
11116     /* VEX_W_0F3802_P_2  */
11117     { "vphaddd",        { XM, Vex, EXx }, 0 },
11118   },
11119   {
11120     /* VEX_W_0F3803_P_2  */
11121     { "vphaddsw",       { XM, Vex, EXx }, 0 },
11122   },
11123   {
11124     /* VEX_W_0F3804_P_2  */
11125     { "vpmaddubsw",     { XM, Vex, EXx }, 0 },
11126   },
11127   {
11128     /* VEX_W_0F3805_P_2  */
11129     { "vphsubw",        { XM, Vex, EXx }, 0 },
11130   },
11131   {
11132     /* VEX_W_0F3806_P_2  */
11133     { "vphsubd",        { XM, Vex, EXx }, 0 },
11134   },
11135   {
11136     /* VEX_W_0F3807_P_2  */
11137     { "vphsubsw",       { XM, Vex, EXx }, 0 },
11138   },
11139   {
11140     /* VEX_W_0F3808_P_2  */
11141     { "vpsignb",        { XM, Vex, EXx }, 0 },
11142   },
11143   {
11144     /* VEX_W_0F3809_P_2  */
11145     { "vpsignw",        { XM, Vex, EXx }, 0 },
11146   },
11147   {
11148     /* VEX_W_0F380A_P_2  */
11149     { "vpsignd",        { XM, Vex, EXx }, 0 },
11150   },
11151   {
11152     /* VEX_W_0F380B_P_2  */
11153     { "vpmulhrsw",      { XM, Vex, EXx }, 0 },
11154   },
11155   {
11156     /* VEX_W_0F380C_P_2  */
11157     { "vpermilps",      { XM, Vex, EXx }, 0 },
11158   },
11159   {
11160     /* VEX_W_0F380D_P_2  */
11161     { "vpermilpd",      { XM, Vex, EXx }, 0 },
11162   },
11163   {
11164     /* VEX_W_0F380E_P_2  */
11165     { "vtestps",        { XM, EXx }, 0 },
11166   },
11167   {
11168     /* VEX_W_0F380F_P_2  */
11169     { "vtestpd",        { XM, EXx }, 0 },
11170   },
11171   {
11172     /* VEX_W_0F3816_P_2  */
11173     { "vpermps",        { XM, Vex, EXx }, 0 },
11174   },
11175   {
11176     /* VEX_W_0F3817_P_2 */
11177     { "vptest",         { XM, EXx }, 0 },
11178   },
11179   {
11180     /* VEX_W_0F3818_P_2 */
11181     { "vbroadcastss",   { XM, EXxmm_md }, 0 },
11182   },
11183   {
11184     /* VEX_W_0F3819_P_2 */
11185     { "vbroadcastsd",   { XM, EXxmm_mq }, 0 },
11186   },
11187   {
11188     /* VEX_W_0F381A_P_2_M_0 */
11189     { "vbroadcastf128", { XM, Mxmm }, 0 },
11190   },
11191   {
11192     /* VEX_W_0F381C_P_2 */
11193     { "vpabsb",         { XM, EXx }, 0 },
11194   },
11195   {
11196     /* VEX_W_0F381D_P_2 */
11197     { "vpabsw",         { XM, EXx }, 0 },
11198   },
11199   {
11200     /* VEX_W_0F381E_P_2 */
11201     { "vpabsd",         { XM, EXx }, 0 },
11202   },
11203   {
11204     /* VEX_W_0F3820_P_2 */
11205     { "vpmovsxbw",      { XM, EXxmmq }, 0 },
11206   },
11207   {
11208     /* VEX_W_0F3821_P_2 */
11209     { "vpmovsxbd",      { XM, EXxmmqd }, 0 },
11210   },
11211   {
11212     /* VEX_W_0F3822_P_2 */
11213     { "vpmovsxbq",      { XM, EXxmmdw }, 0 },
11214   },
11215   {
11216     /* VEX_W_0F3823_P_2 */
11217     { "vpmovsxwd",      { XM, EXxmmq }, 0 },
11218   },
11219   {
11220     /* VEX_W_0F3824_P_2 */
11221     { "vpmovsxwq",      { XM, EXxmmqd }, 0 },
11222   },
11223   {
11224     /* VEX_W_0F3825_P_2 */
11225     { "vpmovsxdq",      { XM, EXxmmq }, 0 },
11226   },
11227   {
11228     /* VEX_W_0F3828_P_2 */
11229     { "vpmuldq",        { XM, Vex, EXx }, 0 },
11230   },
11231   {
11232     /* VEX_W_0F3829_P_2 */
11233     { "vpcmpeqq",       { XM, Vex, EXx }, 0 },
11234   },
11235   {
11236     /* VEX_W_0F382A_P_2_M_0 */
11237     { "vmovntdqa",      { XM, Mx }, 0 },
11238   },
11239   {
11240     /* VEX_W_0F382B_P_2 */
11241     { "vpackusdw",      { XM, Vex, EXx }, 0 },
11242   },
11243   {
11244     /* VEX_W_0F382C_P_2_M_0 */
11245     { "vmaskmovps",     { XM, Vex, Mx }, 0 },
11246   },
11247   {
11248     /* VEX_W_0F382D_P_2_M_0 */
11249     { "vmaskmovpd",     { XM, Vex, Mx }, 0 },
11250   },
11251   {
11252     /* VEX_W_0F382E_P_2_M_0 */
11253     { "vmaskmovps",     { Mx, Vex, XM }, 0 },
11254   },
11255   {
11256     /* VEX_W_0F382F_P_2_M_0 */
11257     { "vmaskmovpd",     { Mx, Vex, XM }, 0 },
11258   },
11259   {
11260     /* VEX_W_0F3830_P_2 */
11261     { "vpmovzxbw",      { XM, EXxmmq }, 0 },
11262   },
11263   {
11264     /* VEX_W_0F3831_P_2 */
11265     { "vpmovzxbd",      { XM, EXxmmqd }, 0 },
11266   },
11267   {
11268     /* VEX_W_0F3832_P_2 */
11269     { "vpmovzxbq",      { XM, EXxmmdw }, 0 },
11270   },
11271   {
11272     /* VEX_W_0F3833_P_2 */
11273     { "vpmovzxwd",      { XM, EXxmmq }, 0 },
11274   },
11275   {
11276     /* VEX_W_0F3834_P_2 */
11277     { "vpmovzxwq",      { XM, EXxmmqd }, 0 },
11278   },
11279   {
11280     /* VEX_W_0F3835_P_2 */
11281     { "vpmovzxdq",      { XM, EXxmmq }, 0 },
11282   },
11283   {
11284     /* VEX_W_0F3836_P_2  */
11285     { "vpermd",         { XM, Vex, EXx }, 0 },
11286   },
11287   {
11288     /* VEX_W_0F3837_P_2 */
11289     { "vpcmpgtq",       { XM, Vex, EXx }, 0 },
11290   },
11291   {
11292     /* VEX_W_0F3838_P_2 */
11293     { "vpminsb",        { XM, Vex, EXx }, 0 },
11294   },
11295   {
11296     /* VEX_W_0F3839_P_2 */
11297     { "vpminsd",        { XM, Vex, EXx }, 0 },
11298   },
11299   {
11300     /* VEX_W_0F383A_P_2 */
11301     { "vpminuw",        { XM, Vex, EXx }, 0 },
11302   },
11303   {
11304     /* VEX_W_0F383B_P_2 */
11305     { "vpminud",        { XM, Vex, EXx }, 0 },
11306   },
11307   {
11308     /* VEX_W_0F383C_P_2 */
11309     { "vpmaxsb",        { XM, Vex, EXx }, 0 },
11310   },
11311   {
11312     /* VEX_W_0F383D_P_2 */
11313     { "vpmaxsd",        { XM, Vex, EXx }, 0 },
11314   },
11315   {
11316     /* VEX_W_0F383E_P_2 */
11317     { "vpmaxuw",        { XM, Vex, EXx }, 0 },
11318   },
11319   {
11320     /* VEX_W_0F383F_P_2 */
11321     { "vpmaxud",        { XM, Vex, EXx }, 0 },
11322   },
11323   {
11324     /* VEX_W_0F3840_P_2 */
11325     { "vpmulld",        { XM, Vex, EXx }, 0 },
11326   },
11327   {
11328     /* VEX_W_0F3841_P_2 */
11329     { "vphminposuw",    { XM, EXx }, 0 },
11330   },
11331   {
11332     /* VEX_W_0F3846_P_2 */
11333     { "vpsravd",        { XM, Vex, EXx }, 0 },
11334   },
11335   {
11336     /* VEX_W_0F3858_P_2 */
11337     { "vpbroadcastd", { XM, EXxmm_md }, 0 },
11338   },
11339   {
11340     /* VEX_W_0F3859_P_2 */
11341     { "vpbroadcastq",   { XM, EXxmm_mq }, 0 },
11342   },
11343   {
11344     /* VEX_W_0F385A_P_2_M_0 */
11345     { "vbroadcasti128", { XM, Mxmm }, 0 },
11346   },
11347   {
11348     /* VEX_W_0F3878_P_2 */
11349     { "vpbroadcastb",   { XM, EXxmm_mb }, 0 },
11350   },
11351   {
11352     /* VEX_W_0F3879_P_2 */
11353     { "vpbroadcastw",   { XM, EXxmm_mw }, 0 },
11354   },
11355   {
11356     /* VEX_W_0F38DB_P_2 */
11357     { "vaesimc",        { XM, EXx }, 0 },
11358   },
11359   {
11360     /* VEX_W_0F38DC_P_2 */
11361     { "vaesenc",        { XM, Vex128, EXx }, 0 },
11362   },
11363   {
11364     /* VEX_W_0F38DD_P_2 */
11365     { "vaesenclast",    { XM, Vex128, EXx }, 0 },
11366   },
11367   {
11368     /* VEX_W_0F38DE_P_2 */
11369     { "vaesdec",        { XM, Vex128, EXx }, 0 },
11370   },
11371   {
11372     /* VEX_W_0F38DF_P_2 */
11373     { "vaesdeclast",    { XM, Vex128, EXx }, 0 },
11374   },
11375   {
11376     /* VEX_W_0F3A00_P_2 */
11377     { Bad_Opcode },
11378     { "vpermq",         { XM, EXx, Ib }, 0 },
11379   },
11380   {
11381     /* VEX_W_0F3A01_P_2 */
11382     { Bad_Opcode },
11383     { "vpermpd",        { XM, EXx, Ib }, 0 },
11384   },
11385   {
11386     /* VEX_W_0F3A02_P_2 */
11387     { "vpblendd",       { XM, Vex, EXx, Ib }, 0 },
11388   },
11389   {
11390     /* VEX_W_0F3A04_P_2 */
11391     { "vpermilps",      { XM, EXx, Ib }, 0 },
11392   },
11393   {
11394     /* VEX_W_0F3A05_P_2 */
11395     { "vpermilpd",      { XM, EXx, Ib }, 0 },
11396   },
11397   {
11398     /* VEX_W_0F3A06_P_2 */
11399     { "vperm2f128",     { XM, Vex256, EXx, Ib }, 0 },
11400   },
11401   {
11402     /* VEX_W_0F3A08_P_2 */
11403     { "vroundps",       { XM, EXx, Ib }, 0 },
11404   },
11405   {
11406     /* VEX_W_0F3A09_P_2 */
11407     { "vroundpd",       { XM, EXx, Ib }, 0 },
11408   },
11409   {
11410     /* VEX_W_0F3A0A_P_2 */
11411     { "vroundss",       { XMScalar, VexScalar, EXdScalar, Ib }, 0 },
11412   },
11413   {
11414     /* VEX_W_0F3A0B_P_2 */
11415     { "vroundsd",       { XMScalar, VexScalar, EXqScalar, Ib }, 0 },
11416   },
11417   {
11418     /* VEX_W_0F3A0C_P_2 */
11419     { "vblendps",       { XM, Vex, EXx, Ib }, 0 },
11420   },
11421   {
11422     /* VEX_W_0F3A0D_P_2 */
11423     { "vblendpd",       { XM, Vex, EXx, Ib }, 0 },
11424   },
11425   {
11426     /* VEX_W_0F3A0E_P_2 */
11427     { "vpblendw",       { XM, Vex, EXx, Ib }, 0 },
11428   },
11429   {
11430     /* VEX_W_0F3A0F_P_2 */
11431     { "vpalignr",       { XM, Vex, EXx, Ib }, 0 },
11432   },
11433   {
11434     /* VEX_W_0F3A14_P_2 */
11435     { "vpextrb",        { Edqb, XM, Ib }, 0 },
11436   },
11437   {
11438     /* VEX_W_0F3A15_P_2 */
11439     { "vpextrw",        { Edqw, XM, Ib }, 0 },
11440   },
11441   {
11442     /* VEX_W_0F3A18_P_2 */
11443     { "vinsertf128",    { XM, Vex256, EXxmm, Ib }, 0 },
11444   },
11445   {
11446     /* VEX_W_0F3A19_P_2 */
11447     { "vextractf128",   { EXxmm, XM, Ib }, 0 },
11448   },
11449   {
11450     /* VEX_W_0F3A20_P_2 */
11451     { "vpinsrb",        { XM, Vex128, Edqb, Ib }, 0 },
11452   },
11453   {
11454     /* VEX_W_0F3A21_P_2 */
11455     { "vinsertps",      { XM, Vex128, EXd, Ib }, 0 },
11456   },
11457   {
11458     /* VEX_W_0F3A30_P_2_LEN_0 */
11459     { "kshiftrb",       { MaskG, MaskR, Ib }, 0 },
11460     { "kshiftrw",       { MaskG, MaskR, Ib }, 0 },
11461   },
11462   {
11463     /* VEX_W_0F3A31_P_2_LEN_0 */
11464     { "kshiftrd",       { MaskG, MaskR, Ib }, 0 },
11465     { "kshiftrq",       { MaskG, MaskR, Ib }, 0 },
11466   },
11467   {
11468     /* VEX_W_0F3A32_P_2_LEN_0 */
11469     { "kshiftlb",       { MaskG, MaskR, Ib }, 0 },
11470     { "kshiftlw",       { MaskG, MaskR, Ib }, 0 },
11471   },
11472   {
11473     /* VEX_W_0F3A33_P_2_LEN_0 */
11474     { "kshiftld",       { MaskG, MaskR, Ib }, 0 },
11475     { "kshiftlq",       { MaskG, MaskR, Ib }, 0 },
11476   },
11477   {
11478     /* VEX_W_0F3A38_P_2 */
11479     { "vinserti128",    { XM, Vex256, EXxmm, Ib }, 0 },
11480   },
11481   {
11482     /* VEX_W_0F3A39_P_2 */
11483     { "vextracti128",   { EXxmm, XM, Ib }, 0 },
11484   },
11485   {
11486     /* VEX_W_0F3A40_P_2 */
11487     { "vdpps",          { XM, Vex, EXx, Ib }, 0 },
11488   },
11489   {
11490     /* VEX_W_0F3A41_P_2 */
11491     { "vdppd",          { XM, Vex128, EXx, Ib }, 0 },
11492   },
11493   {
11494     /* VEX_W_0F3A42_P_2 */
11495     { "vmpsadbw",       { XM, Vex, EXx, Ib }, 0 },
11496   },
11497   {
11498     /* VEX_W_0F3A44_P_2 */
11499     { "vpclmulqdq",     { XM, Vex128, EXx, PCLMUL }, 0 },
11500   },
11501   {
11502     /* VEX_W_0F3A46_P_2 */
11503     { "vperm2i128",     { XM, Vex256, EXx, Ib }, 0 },
11504   },
11505   {
11506     /* VEX_W_0F3A48_P_2 */
11507     { "vpermil2ps",     { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW }, 0 },
11508     { "vpermil2ps",     { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW }, 0 },
11509   },
11510   {
11511     /* VEX_W_0F3A49_P_2 */
11512     { "vpermil2pd",     { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW }, 0 },
11513     { "vpermil2pd",     { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW }, 0 },
11514   },
11515   {
11516     /* VEX_W_0F3A4A_P_2 */
11517     { "vblendvps",      { XM, Vex, EXx, XMVexI4 }, 0 },
11518   },
11519   {
11520     /* VEX_W_0F3A4B_P_2 */
11521     { "vblendvpd",      { XM, Vex, EXx, XMVexI4 }, 0 },
11522   },
11523   {
11524     /* VEX_W_0F3A4C_P_2 */
11525     { "vpblendvb",      { XM, Vex, EXx, XMVexI4 }, 0 },
11526   },
11527   {
11528     /* VEX_W_0F3A60_P_2 */
11529     { "vpcmpestrm",     { XM, EXx, Ib }, 0 },
11530   },
11531   {
11532     /* VEX_W_0F3A61_P_2 */
11533     { "vpcmpestri",     { XM, EXx, Ib }, 0 },
11534   },
11535   {
11536     /* VEX_W_0F3A62_P_2 */
11537     { "vpcmpistrm",     { XM, EXx, Ib }, 0 },
11538   },
11539   {
11540     /* VEX_W_0F3A63_P_2 */
11541     { "vpcmpistri",     { XM, EXx, Ib }, 0 },
11542   },
11543   {
11544     /* VEX_W_0F3ADF_P_2 */
11545     { "vaeskeygenassist", { XM, EXx, Ib }, 0 },
11546   },
11547 #define NEED_VEX_W_TABLE
11548 #include "i386-dis-evex.h"
11549 #undef NEED_VEX_W_TABLE
11550 };
11551
11552 static const struct dis386 mod_table[][2] = {
11553   {
11554     /* MOD_8D */
11555     { "leaS",           { Gv, M }, 0 },
11556   },
11557   {
11558     /* MOD_C6_REG_7 */
11559     { Bad_Opcode },
11560     { RM_TABLE (RM_C6_REG_7) },
11561   },
11562   {
11563     /* MOD_C7_REG_7 */
11564     { Bad_Opcode },
11565     { RM_TABLE (RM_C7_REG_7) },
11566   },
11567   {
11568     /* MOD_FF_REG_3 */
11569     { "Jcall{T|}", { indirEp }, 0 },
11570   },
11571   {
11572     /* MOD_FF_REG_5 */
11573     { "Jjmp{T|}", { indirEp }, 0 },
11574   },
11575   {
11576     /* MOD_0F01_REG_0 */
11577     { X86_64_TABLE (X86_64_0F01_REG_0) },
11578     { RM_TABLE (RM_0F01_REG_0) },
11579   },
11580   {
11581     /* MOD_0F01_REG_1 */
11582     { X86_64_TABLE (X86_64_0F01_REG_1) },
11583     { RM_TABLE (RM_0F01_REG_1) },
11584   },
11585   {
11586     /* MOD_0F01_REG_2 */
11587     { X86_64_TABLE (X86_64_0F01_REG_2) },
11588     { RM_TABLE (RM_0F01_REG_2) },
11589   },
11590   {
11591     /* MOD_0F01_REG_3 */
11592     { X86_64_TABLE (X86_64_0F01_REG_3) },
11593     { RM_TABLE (RM_0F01_REG_3) },
11594   },
11595   {
11596     /* MOD_0F01_REG_7 */
11597     { "invlpg",         { Mb }, 0 },
11598     { RM_TABLE (RM_0F01_REG_7) },
11599   },
11600   {
11601     /* MOD_0F12_PREFIX_0 */
11602     { "movlps",         { XM, EXq }, PREFIX_OPCODE },
11603     { "movhlps",        { XM, EXq }, PREFIX_OPCODE },
11604   },
11605   {
11606     /* MOD_0F13 */
11607     { "movlpX",         { EXq, XM }, PREFIX_OPCODE },
11608   },
11609   {
11610     /* MOD_0F16_PREFIX_0 */
11611     { "movhps",         { XM, EXq }, 0 },
11612     { "movlhps",        { XM, EXq }, 0 },
11613   },
11614   {
11615     /* MOD_0F17 */
11616     { "movhpX",         { EXq, XM }, PREFIX_OPCODE },
11617   },
11618   {
11619     /* MOD_0F18_REG_0 */
11620     { "prefetchnta",    { Mb }, 0 },
11621   },
11622   {
11623     /* MOD_0F18_REG_1 */
11624     { "prefetcht0",     { Mb }, 0 },
11625   },
11626   {
11627     /* MOD_0F18_REG_2 */
11628     { "prefetcht1",     { Mb }, 0 },
11629   },
11630   {
11631     /* MOD_0F18_REG_3 */
11632     { "prefetcht2",     { Mb }, 0 },
11633   },
11634   {
11635     /* MOD_0F18_REG_4 */
11636     { "nop/reserved",   { Mb }, 0 },
11637   },
11638   {
11639     /* MOD_0F18_REG_5 */
11640     { "nop/reserved",   { Mb }, 0 },
11641   },
11642   {
11643     /* MOD_0F18_REG_6 */
11644     { "nop/reserved",   { Mb }, 0 },
11645   },
11646   {
11647     /* MOD_0F18_REG_7 */
11648     { "nop/reserved",   { Mb }, 0 },
11649   },
11650   {
11651     /* MOD_0F1A_PREFIX_0 */
11652     { "bndldx",         { Gbnd, Ev_bnd }, 0 },
11653     { "nopQ",           { Ev }, 0 },
11654   },
11655   {
11656     /* MOD_0F1B_PREFIX_0 */
11657     { "bndstx",         { Ev_bnd, Gbnd }, 0 },
11658     { "nopQ",           { Ev }, 0 },
11659   },
11660   {
11661     /* MOD_0F1B_PREFIX_1 */
11662     { "bndmk",          { Gbnd, Ev_bnd }, 0 },
11663     { "nopQ",           { Ev }, 0 },
11664   },
11665   {
11666     /* MOD_0F24 */
11667     { Bad_Opcode },
11668     { "movL",           { Rd, Td }, 0 },
11669   },
11670   {
11671     /* MOD_0F26 */
11672     { Bad_Opcode },
11673     { "movL",           { Td, Rd }, 0 },
11674   },
11675   {
11676     /* MOD_0F2B_PREFIX_0 */
11677     {"movntps",         { Mx, XM }, PREFIX_OPCODE },
11678   },
11679   {
11680     /* MOD_0F2B_PREFIX_1 */
11681     {"movntss",         { Md, XM }, PREFIX_OPCODE },
11682   },
11683   {
11684     /* MOD_0F2B_PREFIX_2 */
11685     {"movntpd",         { Mx, XM }, PREFIX_OPCODE },
11686   },
11687   {
11688     /* MOD_0F2B_PREFIX_3 */
11689     {"movntsd",         { Mq, XM }, PREFIX_OPCODE },
11690   },
11691   {
11692     /* MOD_0F51 */
11693     { Bad_Opcode },
11694     { "movmskpX",       { Gdq, XS }, PREFIX_OPCODE },
11695   },
11696   {
11697     /* MOD_0F71_REG_2 */
11698     { Bad_Opcode },
11699     { "psrlw",          { MS, Ib }, 0 },
11700   },
11701   {
11702     /* MOD_0F71_REG_4 */
11703     { Bad_Opcode },
11704     { "psraw",          { MS, Ib }, 0 },
11705   },
11706   {
11707     /* MOD_0F71_REG_6 */
11708     { Bad_Opcode },
11709     { "psllw",          { MS, Ib }, 0 },
11710   },
11711   {
11712     /* MOD_0F72_REG_2 */
11713     { Bad_Opcode },
11714     { "psrld",          { MS, Ib }, 0 },
11715   },
11716   {
11717     /* MOD_0F72_REG_4 */
11718     { Bad_Opcode },
11719     { "psrad",          { MS, Ib }, 0 },
11720   },
11721   {
11722     /* MOD_0F72_REG_6 */
11723     { Bad_Opcode },
11724     { "pslld",          { MS, Ib }, 0 },
11725   },
11726   {
11727     /* MOD_0F73_REG_2 */
11728     { Bad_Opcode },
11729     { "psrlq",          { MS, Ib }, 0 },
11730   },
11731   {
11732     /* MOD_0F73_REG_3 */
11733     { Bad_Opcode },
11734     { PREFIX_TABLE (PREFIX_0F73_REG_3) },
11735   },
11736   {
11737     /* MOD_0F73_REG_6 */
11738     { Bad_Opcode },
11739     { "psllq",          { MS, Ib }, 0 },
11740   },
11741   {
11742     /* MOD_0F73_REG_7 */
11743     { Bad_Opcode },
11744     { PREFIX_TABLE (PREFIX_0F73_REG_7) },
11745   },
11746   {
11747     /* MOD_0FAE_REG_0 */
11748     { "fxsave",         { FXSAVE }, 0 },
11749     { PREFIX_TABLE (PREFIX_0FAE_REG_0) },
11750   },
11751   {
11752     /* MOD_0FAE_REG_1 */
11753     { "fxrstor",        { FXSAVE }, 0 },
11754     { PREFIX_TABLE (PREFIX_0FAE_REG_1) },
11755   },
11756   {
11757     /* MOD_0FAE_REG_2 */
11758     { "ldmxcsr",        { Md }, 0 },
11759     { PREFIX_TABLE (PREFIX_0FAE_REG_2) },
11760   },
11761   {
11762     /* MOD_0FAE_REG_3 */
11763     { "stmxcsr",        { Md }, 0 },
11764     { PREFIX_TABLE (PREFIX_0FAE_REG_3) },
11765   },
11766   {
11767     /* MOD_0FAE_REG_4 */
11768     { "xsave",          { FXSAVE }, 0 },
11769   },
11770   {
11771     /* MOD_0FAE_REG_5 */
11772     { "xrstor",         { FXSAVE }, 0 },
11773     { RM_TABLE (RM_0FAE_REG_5) },
11774   },
11775   {
11776     /* MOD_0FAE_REG_6 */
11777     { PREFIX_TABLE (PREFIX_0FAE_REG_6) },
11778     { RM_TABLE (RM_0FAE_REG_6) },
11779   },
11780   {
11781     /* MOD_0FAE_REG_7 */
11782     { PREFIX_TABLE (PREFIX_0FAE_REG_7) },
11783     { RM_TABLE (RM_0FAE_REG_7) },
11784   },
11785   {
11786     /* MOD_0FB2 */
11787     { "lssS",           { Gv, Mp }, 0 },
11788   },
11789   {
11790     /* MOD_0FB4 */
11791     { "lfsS",           { Gv, Mp }, 0 },
11792   },
11793   {
11794     /* MOD_0FB5 */
11795     { "lgsS",           { Gv, Mp }, 0 },
11796   },
11797   {
11798     /* MOD_0FC7_REG_3 */
11799     { "xrstors",                { FXSAVE }, 0 },
11800   },
11801   {
11802     /* MOD_0FC7_REG_4 */
11803     { "xsavec",         { FXSAVE }, 0 },
11804   },
11805   {
11806     /* MOD_0FC7_REG_5 */
11807     { "xsaves",         { FXSAVE }, 0 },
11808   },
11809   {
11810     /* MOD_0FC7_REG_6 */
11811     { PREFIX_TABLE (PREFIX_0FC7_REG_6) },
11812     { "rdrand",         { Ev }, 0 },
11813   },
11814   {
11815     /* MOD_0FC7_REG_7 */
11816     { "vmptrst",        { Mq }, 0 },
11817     { "rdseed",         { Ev }, 0 },
11818   },
11819   {
11820     /* MOD_0FD7 */
11821     { Bad_Opcode },
11822     { "pmovmskb",       { Gdq, MS }, 0 },
11823   },
11824   {
11825     /* MOD_0FE7_PREFIX_2 */
11826     { "movntdq",        { Mx, XM }, 0 },
11827   },
11828   {
11829     /* MOD_0FF0_PREFIX_3 */
11830     { "lddqu",          { XM, M }, 0 },
11831   },
11832   {
11833     /* MOD_0F382A_PREFIX_2 */
11834     { "movntdqa",       { XM, Mx }, 0 },
11835   },
11836   {
11837     /* MOD_62_32BIT */
11838     { "bound{S|}",      { Gv, Ma }, 0 },
11839     { EVEX_TABLE (EVEX_0F) },
11840   },
11841   {
11842     /* MOD_C4_32BIT */
11843     { "lesS",           { Gv, Mp }, 0 },
11844     { VEX_C4_TABLE (VEX_0F) },
11845   },
11846   {
11847     /* MOD_C5_32BIT */
11848     { "ldsS",           { Gv, Mp }, 0 },
11849     { VEX_C5_TABLE (VEX_0F) },
11850   },
11851   {
11852     /* MOD_VEX_0F12_PREFIX_0 */
11853     { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_0) },
11854     { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_1) },
11855   },
11856   {
11857     /* MOD_VEX_0F13 */
11858     { VEX_LEN_TABLE (VEX_LEN_0F13_M_0) },
11859   },
11860   {
11861     /* MOD_VEX_0F16_PREFIX_0 */
11862     { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_0) },
11863     { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_1) },
11864   },
11865   {
11866     /* MOD_VEX_0F17 */
11867     { VEX_LEN_TABLE (VEX_LEN_0F17_M_0) },
11868   },
11869   {
11870     /* MOD_VEX_0F2B */
11871     { VEX_W_TABLE (VEX_W_0F2B_M_0) },
11872   },
11873   {
11874     /* MOD_VEX_0F50 */
11875     { Bad_Opcode },
11876     { VEX_W_TABLE (VEX_W_0F50_M_0) },
11877   },
11878   {
11879     /* MOD_VEX_0F71_REG_2 */
11880     { Bad_Opcode },
11881     { PREFIX_TABLE (PREFIX_VEX_0F71_REG_2) },
11882   },
11883   {
11884     /* MOD_VEX_0F71_REG_4 */
11885     { Bad_Opcode },
11886     { PREFIX_TABLE (PREFIX_VEX_0F71_REG_4) },
11887   },
11888   {
11889     /* MOD_VEX_0F71_REG_6 */
11890     { Bad_Opcode },
11891     { PREFIX_TABLE (PREFIX_VEX_0F71_REG_6) },
11892   },
11893   {
11894     /* MOD_VEX_0F72_REG_2 */
11895     { Bad_Opcode },
11896     { PREFIX_TABLE (PREFIX_VEX_0F72_REG_2) },
11897   },
11898   {
11899     /* MOD_VEX_0F72_REG_4 */
11900     { Bad_Opcode },
11901     { PREFIX_TABLE (PREFIX_VEX_0F72_REG_4) },
11902   },
11903   {
11904     /* MOD_VEX_0F72_REG_6 */
11905     { Bad_Opcode },
11906     { PREFIX_TABLE (PREFIX_VEX_0F72_REG_6) },
11907   },
11908   {
11909     /* MOD_VEX_0F73_REG_2 */
11910     { Bad_Opcode },
11911     { PREFIX_TABLE (PREFIX_VEX_0F73_REG_2) },
11912   },
11913   {
11914     /* MOD_VEX_0F73_REG_3 */
11915     { Bad_Opcode },
11916     { PREFIX_TABLE (PREFIX_VEX_0F73_REG_3) },
11917   },
11918   {
11919     /* MOD_VEX_0F73_REG_6 */
11920     { Bad_Opcode },
11921     { PREFIX_TABLE (PREFIX_VEX_0F73_REG_6) },
11922   },
11923   {
11924     /* MOD_VEX_0F73_REG_7 */
11925     { Bad_Opcode },
11926     { PREFIX_TABLE (PREFIX_VEX_0F73_REG_7) },
11927   },
11928   {
11929     /* MOD_VEX_0FAE_REG_2 */
11930     { VEX_LEN_TABLE (VEX_LEN_0FAE_R_2_M_0) },
11931   },
11932   {
11933     /* MOD_VEX_0FAE_REG_3 */
11934     { VEX_LEN_TABLE (VEX_LEN_0FAE_R_3_M_0) },
11935   },
11936   {
11937     /* MOD_VEX_0FD7_PREFIX_2 */
11938     { Bad_Opcode },
11939     { VEX_W_TABLE (VEX_W_0FD7_P_2_M_1) },
11940   },
11941   {
11942     /* MOD_VEX_0FE7_PREFIX_2 */
11943     { VEX_W_TABLE (VEX_W_0FE7_P_2_M_0) },
11944   },
11945   {
11946     /* MOD_VEX_0FF0_PREFIX_3 */
11947     { VEX_W_TABLE (VEX_W_0FF0_P_3_M_0) },
11948   },
11949   {
11950     /* MOD_VEX_0F381A_PREFIX_2 */
11951     { VEX_LEN_TABLE (VEX_LEN_0F381A_P_2_M_0) },
11952   },
11953   {
11954     /* MOD_VEX_0F382A_PREFIX_2 */
11955     { VEX_W_TABLE (VEX_W_0F382A_P_2_M_0) },
11956   },
11957   {
11958     /* MOD_VEX_0F382C_PREFIX_2 */
11959     { VEX_W_TABLE (VEX_W_0F382C_P_2_M_0) },
11960   },
11961   {
11962     /* MOD_VEX_0F382D_PREFIX_2 */
11963     { VEX_W_TABLE (VEX_W_0F382D_P_2_M_0) },
11964   },
11965   {
11966     /* MOD_VEX_0F382E_PREFIX_2 */
11967     { VEX_W_TABLE (VEX_W_0F382E_P_2_M_0) },
11968   },
11969   {
11970     /* MOD_VEX_0F382F_PREFIX_2 */
11971     { VEX_W_TABLE (VEX_W_0F382F_P_2_M_0) },
11972   },
11973   {
11974     /* MOD_VEX_0F385A_PREFIX_2 */
11975     { VEX_LEN_TABLE (VEX_LEN_0F385A_P_2_M_0) },
11976   },
11977   {
11978     /* MOD_VEX_0F388C_PREFIX_2 */
11979     { "vpmaskmov%LW",   { XM, Vex, Mx }, 0 },
11980   },
11981   {
11982     /* MOD_VEX_0F388E_PREFIX_2 */
11983     { "vpmaskmov%LW",   { Mx, Vex, XM }, 0 },
11984   },
11985 #define NEED_MOD_TABLE
11986 #include "i386-dis-evex.h"
11987 #undef NEED_MOD_TABLE
11988 };
11989
11990 static const struct dis386 rm_table[][8] = {
11991   {
11992     /* RM_C6_REG_7 */
11993     { "xabort",         { Skip_MODRM, Ib }, 0 },
11994   },
11995   {
11996     /* RM_C7_REG_7 */
11997     { "xbeginT",        { Skip_MODRM, Jv }, 0 },
11998   },
11999   {
12000     /* RM_0F01_REG_0 */
12001     { Bad_Opcode },
12002     { "vmcall",         { Skip_MODRM }, 0 },
12003     { "vmlaunch",       { Skip_MODRM }, 0 },
12004     { "vmresume",       { Skip_MODRM }, 0 },
12005     { "vmxoff",         { Skip_MODRM }, 0 },
12006   },
12007   {
12008     /* RM_0F01_REG_1 */
12009     { "monitor",        { { OP_Monitor, 0 } }, 0 },
12010     { "mwait",          { { OP_Mwait, 0 } }, 0 },
12011     { "clac",           { Skip_MODRM }, 0 },
12012     { "stac",           { Skip_MODRM }, 0 },
12013     { Bad_Opcode },
12014     { Bad_Opcode },
12015     { Bad_Opcode },
12016     { "encls",          { Skip_MODRM }, 0 },
12017   },
12018   {
12019     /* RM_0F01_REG_2 */
12020     { "xgetbv",         { Skip_MODRM }, 0 },
12021     { "xsetbv",         { Skip_MODRM }, 0 },
12022     { Bad_Opcode },
12023     { Bad_Opcode },
12024     { "vmfunc",         { Skip_MODRM }, 0 },
12025     { "xend",           { Skip_MODRM }, 0 },
12026     { "xtest",          { Skip_MODRM }, 0 },
12027     { "enclu",          { Skip_MODRM }, 0 },
12028   },
12029   {
12030     /* RM_0F01_REG_3 */
12031     { "vmrun",          { Skip_MODRM }, 0 },
12032     { "vmmcall",        { Skip_MODRM }, 0 },
12033     { "vmload",         { Skip_MODRM }, 0 },
12034     { "vmsave",         { Skip_MODRM }, 0 },
12035     { "stgi",           { Skip_MODRM }, 0 },
12036     { "clgi",           { Skip_MODRM }, 0 },
12037     { "skinit",         { Skip_MODRM }, 0 },
12038     { "invlpga",        { Skip_MODRM }, 0 },
12039   },
12040   {
12041     /* RM_0F01_REG_7 */
12042     { "swapgs",         { Skip_MODRM }, 0  },
12043     { "rdtscp",         { Skip_MODRM }, 0  },
12044     { Bad_Opcode },
12045     { Bad_Opcode },
12046     { "clzero",         { Skip_MODRM }, 0  },
12047   },
12048   {
12049     /* RM_0FAE_REG_5 */
12050     { "lfence",         { Skip_MODRM }, 0 },
12051   },
12052   {
12053     /* RM_0FAE_REG_6 */
12054     { "mfence",         { Skip_MODRM }, 0 },
12055   },
12056   {
12057     /* RM_0FAE_REG_7 */
12058     { PREFIX_TABLE (PREFIX_RM_0_0FAE_REG_7) },
12059   },
12060 };
12061
12062 #define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
12063
12064 /* We use the high bit to indicate different name for the same
12065    prefix.  */
12066 #define REP_PREFIX      (0xf3 | 0x100)
12067 #define XACQUIRE_PREFIX (0xf2 | 0x200)
12068 #define XRELEASE_PREFIX (0xf3 | 0x400)
12069 #define BND_PREFIX      (0xf2 | 0x400)
12070
12071 static int
12072 ckprefix (void)
12073 {
12074   int newrex, i, length;
12075   rex = 0;
12076   rex_ignored = 0;
12077   prefixes = 0;
12078   used_prefixes = 0;
12079   rex_used = 0;
12080   last_lock_prefix = -1;
12081   last_repz_prefix = -1;
12082   last_repnz_prefix = -1;
12083   last_data_prefix = -1;
12084   last_addr_prefix = -1;
12085   last_rex_prefix = -1;
12086   last_seg_prefix = -1;
12087   fwait_prefix = -1;
12088   active_seg_prefix = 0;
12089   for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
12090     all_prefixes[i] = 0;
12091   i = 0;
12092   length = 0;
12093   /* The maximum instruction length is 15bytes.  */
12094   while (length < MAX_CODE_LENGTH - 1)
12095     {
12096       FETCH_DATA (the_info, codep + 1);
12097       newrex = 0;
12098       switch (*codep)
12099         {
12100         /* REX prefixes family.  */
12101         case 0x40:
12102         case 0x41:
12103         case 0x42:
12104         case 0x43:
12105         case 0x44:
12106         case 0x45:
12107         case 0x46:
12108         case 0x47:
12109         case 0x48:
12110         case 0x49:
12111         case 0x4a:
12112         case 0x4b:
12113         case 0x4c:
12114         case 0x4d:
12115         case 0x4e:
12116         case 0x4f:
12117           if (address_mode == mode_64bit)
12118             newrex = *codep;
12119           else
12120             return 1;
12121           last_rex_prefix = i;
12122           break;
12123         case 0xf3:
12124           prefixes |= PREFIX_REPZ;
12125           last_repz_prefix = i;
12126           break;
12127         case 0xf2:
12128           prefixes |= PREFIX_REPNZ;
12129           last_repnz_prefix = i;
12130           break;
12131         case 0xf0:
12132           prefixes |= PREFIX_LOCK;
12133           last_lock_prefix = i;
12134           break;
12135         case 0x2e:
12136           prefixes |= PREFIX_CS;
12137           last_seg_prefix = i;
12138           active_seg_prefix = PREFIX_CS;
12139           break;
12140         case 0x36:
12141           prefixes |= PREFIX_SS;
12142           last_seg_prefix = i;
12143           active_seg_prefix = PREFIX_SS;
12144           break;
12145         case 0x3e:
12146           prefixes |= PREFIX_DS;
12147           last_seg_prefix = i;
12148           active_seg_prefix = PREFIX_DS;
12149           break;
12150         case 0x26:
12151           prefixes |= PREFIX_ES;
12152           last_seg_prefix = i;
12153           active_seg_prefix = PREFIX_ES;
12154           break;
12155         case 0x64:
12156           prefixes |= PREFIX_FS;
12157           last_seg_prefix = i;
12158           active_seg_prefix = PREFIX_FS;
12159           break;
12160         case 0x65:
12161           prefixes |= PREFIX_GS;
12162           last_seg_prefix = i;
12163           active_seg_prefix = PREFIX_GS;
12164           break;
12165         case 0x66:
12166           prefixes |= PREFIX_DATA;
12167           last_data_prefix = i;
12168           break;
12169         case 0x67:
12170           prefixes |= PREFIX_ADDR;
12171           last_addr_prefix = i;
12172           break;
12173         case FWAIT_OPCODE:
12174           /* fwait is really an instruction.  If there are prefixes
12175              before the fwait, they belong to the fwait, *not* to the
12176              following instruction.  */
12177           fwait_prefix = i;
12178           if (prefixes || rex)
12179             {
12180               prefixes |= PREFIX_FWAIT;
12181               codep++;
12182               /* This ensures that the previous REX prefixes are noticed
12183                  as unused prefixes, as in the return case below.  */
12184               rex_used = rex;
12185               return 1;
12186             }
12187           prefixes = PREFIX_FWAIT;
12188           break;
12189         default:
12190           return 1;
12191         }
12192       /* Rex is ignored when followed by another prefix.  */
12193       if (rex)
12194         {
12195           rex_used = rex;
12196           return 1;
12197         }
12198       if (*codep != FWAIT_OPCODE)
12199         all_prefixes[i++] = *codep;
12200       rex = newrex;
12201       codep++;
12202       length++;
12203     }
12204   return 0;
12205 }
12206
12207 /* Return the name of the prefix byte PREF, or NULL if PREF is not a
12208    prefix byte.  */
12209
12210 static const char *
12211 prefix_name (int pref, int sizeflag)
12212 {
12213   static const char *rexes [16] =
12214     {
12215       "rex",            /* 0x40 */
12216       "rex.B",          /* 0x41 */
12217       "rex.X",          /* 0x42 */
12218       "rex.XB",         /* 0x43 */
12219       "rex.R",          /* 0x44 */
12220       "rex.RB",         /* 0x45 */
12221       "rex.RX",         /* 0x46 */
12222       "rex.RXB",        /* 0x47 */
12223       "rex.W",          /* 0x48 */
12224       "rex.WB",         /* 0x49 */
12225       "rex.WX",         /* 0x4a */
12226       "rex.WXB",        /* 0x4b */
12227       "rex.WR",         /* 0x4c */
12228       "rex.WRB",        /* 0x4d */
12229       "rex.WRX",        /* 0x4e */
12230       "rex.WRXB",       /* 0x4f */
12231     };
12232
12233   switch (pref)
12234     {
12235     /* REX prefixes family.  */
12236     case 0x40:
12237     case 0x41:
12238     case 0x42:
12239     case 0x43:
12240     case 0x44:
12241     case 0x45:
12242     case 0x46:
12243     case 0x47:
12244     case 0x48:
12245     case 0x49:
12246     case 0x4a:
12247     case 0x4b:
12248     case 0x4c:
12249     case 0x4d:
12250     case 0x4e:
12251     case 0x4f:
12252       return rexes [pref - 0x40];
12253     case 0xf3:
12254       return "repz";
12255     case 0xf2:
12256       return "repnz";
12257     case 0xf0:
12258       return "lock";
12259     case 0x2e:
12260       return "cs";
12261     case 0x36:
12262       return "ss";
12263     case 0x3e:
12264       return "ds";
12265     case 0x26:
12266       return "es";
12267     case 0x64:
12268       return "fs";
12269     case 0x65:
12270       return "gs";
12271     case 0x66:
12272       return (sizeflag & DFLAG) ? "data16" : "data32";
12273     case 0x67:
12274       if (address_mode == mode_64bit)
12275         return (sizeflag & AFLAG) ? "addr32" : "addr64";
12276       else
12277         return (sizeflag & AFLAG) ? "addr16" : "addr32";
12278     case FWAIT_OPCODE:
12279       return "fwait";
12280     case REP_PREFIX:
12281       return "rep";
12282     case XACQUIRE_PREFIX:
12283       return "xacquire";
12284     case XRELEASE_PREFIX:
12285       return "xrelease";
12286     case BND_PREFIX:
12287       return "bnd";
12288     default:
12289       return NULL;
12290     }
12291 }
12292
12293 static char op_out[MAX_OPERANDS][100];
12294 static int op_ad, op_index[MAX_OPERANDS];
12295 static int two_source_ops;
12296 static bfd_vma op_address[MAX_OPERANDS];
12297 static bfd_vma op_riprel[MAX_OPERANDS];
12298 static bfd_vma start_pc;
12299
12300 /*
12301  *   On the 386's of 1988, the maximum length of an instruction is 15 bytes.
12302  *   (see topic "Redundant prefixes" in the "Differences from 8086"
12303  *   section of the "Virtual 8086 Mode" chapter.)
12304  * 'pc' should be the address of this instruction, it will
12305  *   be used to print the target address if this is a relative jump or call
12306  * The function returns the length of this instruction in bytes.
12307  */
12308
12309 static char intel_syntax;
12310 static char intel_mnemonic = !SYSV386_COMPAT;
12311 static char open_char;
12312 static char close_char;
12313 static char separator_char;
12314 static char scale_char;
12315
12316 /* Here for backwards compatibility.  When gdb stops using
12317    print_insn_i386_att and print_insn_i386_intel these functions can
12318    disappear, and print_insn_i386 be merged into print_insn.  */
12319 int
12320 print_insn_i386_att (bfd_vma pc, disassemble_info *info)
12321 {
12322   intel_syntax = 0;
12323
12324   return print_insn (pc, info);
12325 }
12326
12327 int
12328 print_insn_i386_intel (bfd_vma pc, disassemble_info *info)
12329 {
12330   intel_syntax = 1;
12331
12332   return print_insn (pc, info);
12333 }
12334
12335 int
12336 print_insn_i386 (bfd_vma pc, disassemble_info *info)
12337 {
12338   intel_syntax = -1;
12339
12340   return print_insn (pc, info);
12341 }
12342
12343 void
12344 print_i386_disassembler_options (FILE *stream)
12345 {
12346   fprintf (stream, _("\n\
12347 The following i386/x86-64 specific disassembler options are supported for use\n\
12348 with the -M switch (multiple options should be separated by commas):\n"));
12349
12350   fprintf (stream, _("  x86-64      Disassemble in 64bit mode\n"));
12351   fprintf (stream, _("  i386        Disassemble in 32bit mode\n"));
12352   fprintf (stream, _("  i8086       Disassemble in 16bit mode\n"));
12353   fprintf (stream, _("  att         Display instruction in AT&T syntax\n"));
12354   fprintf (stream, _("  intel       Display instruction in Intel syntax\n"));
12355   fprintf (stream, _("  att-mnemonic\n"
12356                      "              Display instruction in AT&T mnemonic\n"));
12357   fprintf (stream, _("  intel-mnemonic\n"
12358                      "              Display instruction in Intel mnemonic\n"));
12359   fprintf (stream, _("  addr64      Assume 64bit address size\n"));
12360   fprintf (stream, _("  addr32      Assume 32bit address size\n"));
12361   fprintf (stream, _("  addr16      Assume 16bit address size\n"));
12362   fprintf (stream, _("  data32      Assume 32bit data size\n"));
12363   fprintf (stream, _("  data16      Assume 16bit data size\n"));
12364   fprintf (stream, _("  suffix      Always display instruction suffix in AT&T syntax\n"));
12365 }
12366
12367 /* Bad opcode.  */
12368 static const struct dis386 bad_opcode = { "(bad)", { XX }, 0 };
12369
12370 /* Get a pointer to struct dis386 with a valid name.  */
12371
12372 static const struct dis386 *
12373 get_valid_dis386 (const struct dis386 *dp, disassemble_info *info)
12374 {
12375   int vindex, vex_table_index;
12376
12377   if (dp->name != NULL)
12378     return dp;
12379
12380   switch (dp->op[0].bytemode)
12381     {
12382     case USE_REG_TABLE:
12383       dp = &reg_table[dp->op[1].bytemode][modrm.reg];
12384       break;
12385
12386     case USE_MOD_TABLE:
12387       vindex = modrm.mod == 0x3 ? 1 : 0;
12388       dp = &mod_table[dp->op[1].bytemode][vindex];
12389       break;
12390
12391     case USE_RM_TABLE:
12392       dp = &rm_table[dp->op[1].bytemode][modrm.rm];
12393       break;
12394
12395     case USE_PREFIX_TABLE:
12396       if (need_vex)
12397         {
12398           /* The prefix in VEX is implicit.  */
12399           switch (vex.prefix)
12400             {
12401             case 0:
12402               vindex = 0;
12403               break;
12404             case REPE_PREFIX_OPCODE:
12405               vindex = 1;
12406               break;
12407             case DATA_PREFIX_OPCODE:
12408               vindex = 2;
12409               break;
12410             case REPNE_PREFIX_OPCODE:
12411               vindex = 3;
12412               break;
12413             default:
12414               abort ();
12415               break;
12416             }
12417         }
12418       else
12419         {
12420           int last_prefix = -1;
12421           int prefix = 0;
12422           vindex = 0;
12423           /* We check PREFIX_REPNZ and PREFIX_REPZ before PREFIX_DATA.
12424              When there are multiple PREFIX_REPNZ and PREFIX_REPZ, the
12425              last one wins.  */
12426           if ((prefixes & (PREFIX_REPZ | PREFIX_REPNZ)) != 0)
12427             {
12428               if (last_repz_prefix > last_repnz_prefix)
12429                 {
12430                   vindex = 1;
12431                   prefix = PREFIX_REPZ;
12432                   last_prefix = last_repz_prefix;
12433                 }
12434               else
12435                 {
12436                   vindex = 3;
12437                   prefix = PREFIX_REPNZ;
12438                   last_prefix = last_repnz_prefix;
12439                 }
12440
12441               /* Check if prefix should be ignored.  */
12442               if ((((prefix_table[dp->op[1].bytemode][vindex].prefix_requirement
12443                      & PREFIX_IGNORED) >> PREFIX_IGNORED_SHIFT)
12444                    & prefix) != 0)
12445                 vindex = 0;
12446             }
12447
12448           if (vindex == 0 && (prefixes & PREFIX_DATA) != 0)
12449             {
12450               vindex = 2;
12451               prefix = PREFIX_DATA;
12452               last_prefix = last_data_prefix;
12453             }
12454
12455           if (vindex != 0)
12456             {
12457               used_prefixes |= prefix;
12458               all_prefixes[last_prefix] = 0;
12459             }
12460         }
12461       dp = &prefix_table[dp->op[1].bytemode][vindex];
12462       break;
12463
12464     case USE_X86_64_TABLE:
12465       vindex = address_mode == mode_64bit ? 1 : 0;
12466       dp = &x86_64_table[dp->op[1].bytemode][vindex];
12467       break;
12468
12469     case USE_3BYTE_TABLE:
12470       FETCH_DATA (info, codep + 2);
12471       vindex = *codep++;
12472       dp = &three_byte_table[dp->op[1].bytemode][vindex];
12473       end_codep = codep;
12474       modrm.mod = (*codep >> 6) & 3;
12475       modrm.reg = (*codep >> 3) & 7;
12476       modrm.rm = *codep & 7;
12477       break;
12478
12479     case USE_VEX_LEN_TABLE:
12480       if (!need_vex)
12481         abort ();
12482
12483       switch (vex.length)
12484         {
12485         case 128:
12486           vindex = 0;
12487           break;
12488         case 256:
12489           vindex = 1;
12490           break;
12491         default:
12492           abort ();
12493           break;
12494         }
12495
12496       dp = &vex_len_table[dp->op[1].bytemode][vindex];
12497       break;
12498
12499     case USE_XOP_8F_TABLE:
12500       FETCH_DATA (info, codep + 3);
12501       /* All bits in the REX prefix are ignored.  */
12502       rex_ignored = rex;
12503       rex = ~(*codep >> 5) & 0x7;
12504
12505       /* VEX_TABLE_INDEX is the mmmmm part of the XOP byte 1 "RCB.mmmmm".  */
12506       switch ((*codep & 0x1f))
12507         {
12508         default:
12509           dp = &bad_opcode;
12510           return dp;
12511         case 0x8:
12512           vex_table_index = XOP_08;
12513           break;
12514         case 0x9:
12515           vex_table_index = XOP_09;
12516           break;
12517         case 0xa:
12518           vex_table_index = XOP_0A;
12519           break;
12520         }
12521       codep++;
12522       vex.w = *codep & 0x80;
12523       if (vex.w && address_mode == mode_64bit)
12524         rex |= REX_W;
12525
12526       vex.register_specifier = (~(*codep >> 3)) & 0xf;
12527       if (address_mode != mode_64bit
12528           && vex.register_specifier > 0x7)
12529         {
12530           dp = &bad_opcode;
12531           return dp;
12532         }
12533
12534       vex.length = (*codep & 0x4) ? 256 : 128;
12535       switch ((*codep & 0x3))
12536         {
12537         case 0:
12538           vex.prefix = 0;
12539           break;
12540         case 1:
12541           vex.prefix = DATA_PREFIX_OPCODE;
12542           break;
12543         case 2:
12544           vex.prefix = REPE_PREFIX_OPCODE;
12545           break;
12546         case 3:
12547           vex.prefix = REPNE_PREFIX_OPCODE;
12548           break;
12549         }
12550       need_vex = 1;
12551       need_vex_reg = 1;
12552       codep++;
12553       vindex = *codep++;
12554       dp = &xop_table[vex_table_index][vindex];
12555
12556       end_codep = codep;
12557       FETCH_DATA (info, codep + 1);
12558       modrm.mod = (*codep >> 6) & 3;
12559       modrm.reg = (*codep >> 3) & 7;
12560       modrm.rm = *codep & 7;
12561       break;
12562
12563     case USE_VEX_C4_TABLE:
12564       /* VEX prefix.  */
12565       FETCH_DATA (info, codep + 3);
12566       /* All bits in the REX prefix are ignored.  */
12567       rex_ignored = rex;
12568       rex = ~(*codep >> 5) & 0x7;
12569       switch ((*codep & 0x1f))
12570         {
12571         default:
12572           dp = &bad_opcode;
12573           return dp;
12574         case 0x1:
12575           vex_table_index = VEX_0F;
12576           break;
12577         case 0x2:
12578           vex_table_index = VEX_0F38;
12579           break;
12580         case 0x3:
12581           vex_table_index = VEX_0F3A;
12582           break;
12583         }
12584       codep++;
12585       vex.w = *codep & 0x80;
12586       if (vex.w && address_mode == mode_64bit)
12587         rex |= REX_W;
12588
12589       vex.register_specifier = (~(*codep >> 3)) & 0xf;
12590       if (address_mode != mode_64bit
12591           && vex.register_specifier > 0x7)
12592         {
12593           dp = &bad_opcode;
12594           return dp;
12595         }
12596
12597       vex.length = (*codep & 0x4) ? 256 : 128;
12598       switch ((*codep & 0x3))
12599         {
12600         case 0:
12601           vex.prefix = 0;
12602           break;
12603         case 1:
12604           vex.prefix = DATA_PREFIX_OPCODE;
12605           break;
12606         case 2:
12607           vex.prefix = REPE_PREFIX_OPCODE;
12608           break;
12609         case 3:
12610           vex.prefix = REPNE_PREFIX_OPCODE;
12611           break;
12612         }
12613       need_vex = 1;
12614       need_vex_reg = 1;
12615       codep++;
12616       vindex = *codep++;
12617       dp = &vex_table[vex_table_index][vindex];
12618       end_codep = codep;
12619       /* There is no MODRM byte for VEX [82|77].  */
12620       if (vindex != 0x77 && vindex != 0x82)
12621         {
12622           FETCH_DATA (info, codep + 1);
12623           modrm.mod = (*codep >> 6) & 3;
12624           modrm.reg = (*codep >> 3) & 7;
12625           modrm.rm = *codep & 7;
12626         }
12627       break;
12628
12629     case USE_VEX_C5_TABLE:
12630       /* VEX prefix.  */
12631       FETCH_DATA (info, codep + 2);
12632       /* All bits in the REX prefix are ignored.  */
12633       rex_ignored = rex;
12634       rex = (*codep & 0x80) ? 0 : REX_R;
12635
12636       vex.register_specifier = (~(*codep >> 3)) & 0xf;
12637       if (address_mode != mode_64bit
12638           && vex.register_specifier > 0x7)
12639         {
12640           dp = &bad_opcode;
12641           return dp;
12642         }
12643
12644       vex.w = 0;
12645
12646       vex.length = (*codep & 0x4) ? 256 : 128;
12647       switch ((*codep & 0x3))
12648         {
12649         case 0:
12650           vex.prefix = 0;
12651           break;
12652         case 1:
12653           vex.prefix = DATA_PREFIX_OPCODE;
12654           break;
12655         case 2:
12656           vex.prefix = REPE_PREFIX_OPCODE;
12657           break;
12658         case 3:
12659           vex.prefix = REPNE_PREFIX_OPCODE;
12660           break;
12661         }
12662       need_vex = 1;
12663       need_vex_reg = 1;
12664       codep++;
12665       vindex = *codep++;
12666       dp = &vex_table[dp->op[1].bytemode][vindex];
12667       end_codep = codep;
12668       /* There is no MODRM byte for VEX [82|77].  */
12669       if (vindex != 0x77 && vindex != 0x82)
12670         {
12671           FETCH_DATA (info, codep + 1);
12672           modrm.mod = (*codep >> 6) & 3;
12673           modrm.reg = (*codep >> 3) & 7;
12674           modrm.rm = *codep & 7;
12675         }
12676       break;
12677
12678     case USE_VEX_W_TABLE:
12679       if (!need_vex)
12680         abort ();
12681
12682       dp = &vex_w_table[dp->op[1].bytemode][vex.w ? 1 : 0];
12683       break;
12684
12685     case USE_EVEX_TABLE:
12686       two_source_ops = 0;
12687       /* EVEX prefix.  */
12688       vex.evex = 1;
12689       FETCH_DATA (info, codep + 4);
12690       /* All bits in the REX prefix are ignored.  */
12691       rex_ignored = rex;
12692       /* The first byte after 0x62.  */
12693       rex = ~(*codep >> 5) & 0x7;
12694       vex.r = *codep & 0x10;
12695       switch ((*codep & 0xf))
12696         {
12697         default:
12698           return &bad_opcode;
12699         case 0x1:
12700           vex_table_index = EVEX_0F;
12701           break;
12702         case 0x2:
12703           vex_table_index = EVEX_0F38;
12704           break;
12705         case 0x3:
12706           vex_table_index = EVEX_0F3A;
12707           break;
12708         }
12709
12710       /* The second byte after 0x62.  */
12711       codep++;
12712       vex.w = *codep & 0x80;
12713       if (vex.w && address_mode == mode_64bit)
12714         rex |= REX_W;
12715
12716       vex.register_specifier = (~(*codep >> 3)) & 0xf;
12717       if (address_mode != mode_64bit)
12718         {
12719           /* In 16/32-bit mode silently ignore following bits.  */
12720           rex &= ~REX_B;
12721           vex.r = 1;
12722           vex.v = 1;
12723           vex.register_specifier &= 0x7;
12724         }
12725
12726       /* The U bit.  */
12727       if (!(*codep & 0x4))
12728         return &bad_opcode;
12729
12730       switch ((*codep & 0x3))
12731         {
12732         case 0:
12733           vex.prefix = 0;
12734           break;
12735         case 1:
12736           vex.prefix = DATA_PREFIX_OPCODE;
12737           break;
12738         case 2:
12739           vex.prefix = REPE_PREFIX_OPCODE;
12740           break;
12741         case 3:
12742           vex.prefix = REPNE_PREFIX_OPCODE;
12743           break;
12744         }
12745
12746       /* The third byte after 0x62.  */
12747       codep++;
12748
12749       /* Remember the static rounding bits.  */
12750       vex.ll = (*codep >> 5) & 3;
12751       vex.b = (*codep & 0x10) != 0;
12752
12753       vex.v = *codep & 0x8;
12754       vex.mask_register_specifier = *codep & 0x7;
12755       vex.zeroing = *codep & 0x80;
12756
12757       need_vex = 1;
12758       need_vex_reg = 1;
12759       codep++;
12760       vindex = *codep++;
12761       dp = &evex_table[vex_table_index][vindex];
12762       end_codep = codep;
12763       FETCH_DATA (info, codep + 1);
12764       modrm.mod = (*codep >> 6) & 3;
12765       modrm.reg = (*codep >> 3) & 7;
12766       modrm.rm = *codep & 7;
12767
12768       /* Set vector length.  */
12769       if (modrm.mod == 3 && vex.b)
12770         vex.length = 512;
12771       else
12772         {
12773           switch (vex.ll)
12774             {
12775             case 0x0:
12776               vex.length = 128;
12777               break;
12778             case 0x1:
12779               vex.length = 256;
12780               break;
12781             case 0x2:
12782               vex.length = 512;
12783               break;
12784             default:
12785               return &bad_opcode;
12786             }
12787         }
12788       break;
12789
12790     case 0:
12791       dp = &bad_opcode;
12792       break;
12793
12794     default:
12795       abort ();
12796     }
12797
12798   if (dp->name != NULL)
12799     return dp;
12800   else
12801     return get_valid_dis386 (dp, info);
12802 }
12803
12804 static void
12805 get_sib (disassemble_info *info, int sizeflag)
12806 {
12807   /* If modrm.mod == 3, operand must be register.  */
12808   if (need_modrm
12809       && ((sizeflag & AFLAG) || address_mode == mode_64bit)
12810       && modrm.mod != 3
12811       && modrm.rm == 4)
12812     {
12813       FETCH_DATA (info, codep + 2);
12814       sib.index = (codep [1] >> 3) & 7;
12815       sib.scale = (codep [1] >> 6) & 3;
12816       sib.base = codep [1] & 7;
12817     }
12818 }
12819
12820 static int
12821 print_insn (bfd_vma pc, disassemble_info *info)
12822 {
12823   const struct dis386 *dp;
12824   int i;
12825   char *op_txt[MAX_OPERANDS];
12826   int needcomma;
12827   int sizeflag, orig_sizeflag;
12828   const char *p;
12829   struct dis_private priv;
12830   int prefix_length;
12831
12832   priv.orig_sizeflag = AFLAG | DFLAG;
12833   if ((info->mach & bfd_mach_i386_i386) != 0)
12834     address_mode = mode_32bit;
12835   else if (info->mach == bfd_mach_i386_i8086)
12836     {
12837       address_mode = mode_16bit;
12838       priv.orig_sizeflag = 0;
12839     }
12840   else
12841     address_mode = mode_64bit;
12842
12843   if (intel_syntax == (char) -1)
12844     intel_syntax = (info->mach & bfd_mach_i386_intel_syntax) != 0;
12845
12846   for (p = info->disassembler_options; p != NULL; )
12847     {
12848       if (CONST_STRNEQ (p, "x86-64"))
12849         {
12850           address_mode = mode_64bit;
12851           priv.orig_sizeflag = AFLAG | DFLAG;
12852         }
12853       else if (CONST_STRNEQ (p, "i386"))
12854         {
12855           address_mode = mode_32bit;
12856           priv.orig_sizeflag = AFLAG | DFLAG;
12857         }
12858       else if (CONST_STRNEQ (p, "i8086"))
12859         {
12860           address_mode = mode_16bit;
12861           priv.orig_sizeflag = 0;
12862         }
12863       else if (CONST_STRNEQ (p, "intel"))
12864         {
12865           intel_syntax = 1;
12866           if (CONST_STRNEQ (p + 5, "-mnemonic"))
12867             intel_mnemonic = 1;
12868         }
12869       else if (CONST_STRNEQ (p, "att"))
12870         {
12871           intel_syntax = 0;
12872           if (CONST_STRNEQ (p + 3, "-mnemonic"))
12873             intel_mnemonic = 0;
12874         }
12875       else if (CONST_STRNEQ (p, "addr"))
12876         {
12877           if (address_mode == mode_64bit)
12878             {
12879               if (p[4] == '3' && p[5] == '2')
12880                 priv.orig_sizeflag &= ~AFLAG;
12881               else if (p[4] == '6' && p[5] == '4')
12882                 priv.orig_sizeflag |= AFLAG;
12883             }
12884           else
12885             {
12886               if (p[4] == '1' && p[5] == '6')
12887                 priv.orig_sizeflag &= ~AFLAG;
12888               else if (p[4] == '3' && p[5] == '2')
12889                 priv.orig_sizeflag |= AFLAG;
12890             }
12891         }
12892       else if (CONST_STRNEQ (p, "data"))
12893         {
12894           if (p[4] == '1' && p[5] == '6')
12895             priv.orig_sizeflag &= ~DFLAG;
12896           else if (p[4] == '3' && p[5] == '2')
12897             priv.orig_sizeflag |= DFLAG;
12898         }
12899       else if (CONST_STRNEQ (p, "suffix"))
12900         priv.orig_sizeflag |= SUFFIX_ALWAYS;
12901
12902       p = strchr (p, ',');
12903       if (p != NULL)
12904         p++;
12905     }
12906
12907   if (intel_syntax)
12908     {
12909       names64 = intel_names64;
12910       names32 = intel_names32;
12911       names16 = intel_names16;
12912       names8 = intel_names8;
12913       names8rex = intel_names8rex;
12914       names_seg = intel_names_seg;
12915       names_mm = intel_names_mm;
12916       names_bnd = intel_names_bnd;
12917       names_xmm = intel_names_xmm;
12918       names_ymm = intel_names_ymm;
12919       names_zmm = intel_names_zmm;
12920       index64 = intel_index64;
12921       index32 = intel_index32;
12922       names_mask = intel_names_mask;
12923       index16 = intel_index16;
12924       open_char = '[';
12925       close_char = ']';
12926       separator_char = '+';
12927       scale_char = '*';
12928     }
12929   else
12930     {
12931       names64 = att_names64;
12932       names32 = att_names32;
12933       names16 = att_names16;
12934       names8 = att_names8;
12935       names8rex = att_names8rex;
12936       names_seg = att_names_seg;
12937       names_mm = att_names_mm;
12938       names_bnd = att_names_bnd;
12939       names_xmm = att_names_xmm;
12940       names_ymm = att_names_ymm;
12941       names_zmm = att_names_zmm;
12942       index64 = att_index64;
12943       index32 = att_index32;
12944       names_mask = att_names_mask;
12945       index16 = att_index16;
12946       open_char = '(';
12947       close_char =  ')';
12948       separator_char = ',';
12949       scale_char = ',';
12950     }
12951
12952   /* The output looks better if we put 7 bytes on a line, since that
12953      puts most long word instructions on a single line.  Use 8 bytes
12954      for Intel L1OM.  */
12955   if ((info->mach & bfd_mach_l1om) != 0)
12956     info->bytes_per_line = 8;
12957   else
12958     info->bytes_per_line = 7;
12959
12960   info->private_data = &priv;
12961   priv.max_fetched = priv.the_buffer;
12962   priv.insn_start = pc;
12963
12964   obuf[0] = 0;
12965   for (i = 0; i < MAX_OPERANDS; ++i)
12966     {
12967       op_out[i][0] = 0;
12968       op_index[i] = -1;
12969     }
12970
12971   the_info = info;
12972   start_pc = pc;
12973   start_codep = priv.the_buffer;
12974   codep = priv.the_buffer;
12975
12976   if (OPCODES_SIGSETJMP (priv.bailout) != 0)
12977     {
12978       const char *name;
12979
12980       /* Getting here means we tried for data but didn't get it.  That
12981          means we have an incomplete instruction of some sort.  Just
12982          print the first byte as a prefix or a .byte pseudo-op.  */
12983       if (codep > priv.the_buffer)
12984         {
12985           name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
12986           if (name != NULL)
12987             (*info->fprintf_func) (info->stream, "%s", name);
12988           else
12989             {
12990               /* Just print the first byte as a .byte instruction.  */
12991               (*info->fprintf_func) (info->stream, ".byte 0x%x",
12992                                      (unsigned int) priv.the_buffer[0]);
12993             }
12994
12995           return 1;
12996         }
12997
12998       return -1;
12999     }
13000
13001   obufp = obuf;
13002   sizeflag = priv.orig_sizeflag;
13003
13004   if (!ckprefix () || rex_used)
13005     {
13006       /* Too many prefixes or unused REX prefixes.  */
13007       for (i = 0;
13008            i < (int) ARRAY_SIZE (all_prefixes) && all_prefixes[i];
13009            i++)
13010         (*info->fprintf_func) (info->stream, "%s%s",
13011                                i == 0 ? "" : " ",
13012                                prefix_name (all_prefixes[i], sizeflag));
13013       return i;
13014     }
13015
13016   insn_codep = codep;
13017
13018   FETCH_DATA (info, codep + 1);
13019   two_source_ops = (*codep == 0x62) || (*codep == 0xc8);
13020
13021   if (((prefixes & PREFIX_FWAIT)
13022        && ((*codep < 0xd8) || (*codep > 0xdf))))
13023     {
13024       /* Handle prefixes before fwait.  */
13025       for (i = 0; i < fwait_prefix && all_prefixes[i];
13026            i++)
13027         (*info->fprintf_func) (info->stream, "%s ",
13028                                prefix_name (all_prefixes[i], sizeflag));
13029       (*info->fprintf_func) (info->stream, "fwait");
13030       return i + 1;
13031     }
13032
13033   if (*codep == 0x0f)
13034     {
13035       unsigned char threebyte;
13036       FETCH_DATA (info, codep + 2);
13037       threebyte = *++codep;
13038       dp = &dis386_twobyte[threebyte];
13039       need_modrm = twobyte_has_modrm[*codep];
13040       prefix_requirement = dp->prefix_requirement;
13041       codep++;
13042     }
13043   else
13044     {
13045       dp = &dis386[*codep];
13046       need_modrm = onebyte_has_modrm[*codep];
13047       prefix_requirement = 0;
13048       codep++;
13049     }
13050
13051   /* Save sizeflag for printing the extra prefixes later before updating
13052      it for mnemonic and operand processing.  The prefix names depend
13053      only on the address mode.  */
13054   orig_sizeflag = sizeflag;
13055   if (prefixes & PREFIX_ADDR)
13056     sizeflag ^= AFLAG;
13057   if ((prefixes & PREFIX_DATA))
13058     sizeflag ^= DFLAG;
13059
13060   end_codep = codep;
13061   if (need_modrm)
13062     {
13063       FETCH_DATA (info, codep + 1);
13064       modrm.mod = (*codep >> 6) & 3;
13065       modrm.reg = (*codep >> 3) & 7;
13066       modrm.rm = *codep & 7;
13067     }
13068
13069   need_vex = 0;
13070   need_vex_reg = 0;
13071   vex_w_done = 0;
13072   vex.evex = 0;
13073
13074   if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE)
13075     {
13076       get_sib (info, sizeflag);
13077       dofloat (sizeflag);
13078     }
13079   else
13080     {
13081       dp = get_valid_dis386 (dp, info);
13082       if (dp != NULL && putop (dp->name, sizeflag) == 0)
13083         {
13084           get_sib (info, sizeflag);
13085           for (i = 0; i < MAX_OPERANDS; ++i)
13086             {
13087               obufp = op_out[i];
13088               op_ad = MAX_OPERANDS - 1 - i;
13089               if (dp->op[i].rtn)
13090                 (*dp->op[i].rtn) (dp->op[i].bytemode, sizeflag);
13091               /* For EVEX instruction after the last operand masking
13092                  should be printed.  */
13093               if (i == 0 && vex.evex)
13094                 {
13095                   /* Don't print {%k0}.  */
13096                   if (vex.mask_register_specifier)
13097                     {
13098                       oappend ("{");
13099                       oappend (names_mask[vex.mask_register_specifier]);
13100                       oappend ("}");
13101                     }
13102                   if (vex.zeroing)
13103                     oappend ("{z}");
13104                 }
13105             }
13106         }
13107     }
13108
13109   /* Check if the REX prefix is used.  */
13110   if (rex_ignored == 0 && (rex ^ rex_used) == 0 && last_rex_prefix >= 0)
13111     all_prefixes[last_rex_prefix] = 0;
13112
13113   /* Check if the SEG prefix is used.  */
13114   if ((prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS | PREFIX_ES
13115                    | PREFIX_FS | PREFIX_GS)) != 0
13116       && (used_prefixes & active_seg_prefix) != 0)
13117     all_prefixes[last_seg_prefix] = 0;
13118
13119   /* Check if the ADDR prefix is used.  */
13120   if ((prefixes & PREFIX_ADDR) != 0
13121       && (used_prefixes & PREFIX_ADDR) != 0)
13122     all_prefixes[last_addr_prefix] = 0;
13123
13124   /* Check if the DATA prefix is used.  */
13125   if ((prefixes & PREFIX_DATA) != 0
13126       && (used_prefixes & PREFIX_DATA) != 0)
13127     all_prefixes[last_data_prefix] = 0;
13128
13129   /* Print the extra prefixes.  */
13130   prefix_length = 0;
13131   for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
13132     if (all_prefixes[i])
13133       {
13134         const char *name;
13135         name = prefix_name (all_prefixes[i], orig_sizeflag);
13136         if (name == NULL)
13137           abort ();
13138         prefix_length += strlen (name) + 1;
13139         (*info->fprintf_func) (info->stream, "%s ", name);
13140       }
13141
13142   /* If the mandatory PREFIX_REPZ/PREFIX_REPNZ/PREFIX_DATA prefix is
13143      unused, opcode is invalid.  Since the PREFIX_DATA prefix may be
13144      used by putop and MMX/SSE operand and may be overriden by the
13145      PREFIX_REPZ/PREFIX_REPNZ fix, we check the PREFIX_DATA prefix
13146      separately.  */
13147   if (prefix_requirement == PREFIX_OPCODE
13148       && dp != &bad_opcode
13149       && (((prefixes
13150             & (PREFIX_REPZ | PREFIX_REPNZ)) != 0
13151            && (used_prefixes
13152                & (PREFIX_REPZ | PREFIX_REPNZ)) == 0)
13153           || ((((prefixes
13154                  & (PREFIX_REPZ | PREFIX_REPNZ | PREFIX_DATA))
13155                 == PREFIX_DATA)
13156                && (used_prefixes & PREFIX_DATA) == 0))))
13157     {
13158       (*info->fprintf_func) (info->stream, "(bad)");
13159       return end_codep - priv.the_buffer;
13160     }
13161
13162   /* Check maximum code length.  */
13163   if ((codep - start_codep) > MAX_CODE_LENGTH)
13164     {
13165       (*info->fprintf_func) (info->stream, "(bad)");
13166       return MAX_CODE_LENGTH;
13167     }
13168
13169   obufp = mnemonicendp;
13170   for (i = strlen (obuf) + prefix_length; i < 6; i++)
13171     oappend (" ");
13172   oappend (" ");
13173   (*info->fprintf_func) (info->stream, "%s", obuf);
13174
13175   /* The enter and bound instructions are printed with operands in the same
13176      order as the intel book; everything else is printed in reverse order.  */
13177   if (intel_syntax || two_source_ops)
13178     {
13179       bfd_vma riprel;
13180
13181       for (i = 0; i < MAX_OPERANDS; ++i)
13182         op_txt[i] = op_out[i];
13183
13184       for (i = 0; i < (MAX_OPERANDS >> 1); ++i)
13185         {
13186           op_ad = op_index[i];
13187           op_index[i] = op_index[MAX_OPERANDS - 1 - i];
13188           op_index[MAX_OPERANDS - 1 - i] = op_ad;
13189           riprel = op_riprel[i];
13190           op_riprel[i] = op_riprel [MAX_OPERANDS - 1 - i];
13191           op_riprel[MAX_OPERANDS - 1 - i] = riprel;
13192         }
13193     }
13194   else
13195     {
13196       for (i = 0; i < MAX_OPERANDS; ++i)
13197         op_txt[MAX_OPERANDS - 1 - i] = op_out[i];
13198     }
13199
13200   needcomma = 0;
13201   for (i = 0; i < MAX_OPERANDS; ++i)
13202     if (*op_txt[i])
13203       {
13204         if (needcomma)
13205           (*info->fprintf_func) (info->stream, ",");
13206         if (op_index[i] != -1 && !op_riprel[i])
13207           (*info->print_address_func) ((bfd_vma) op_address[op_index[i]], info);
13208         else
13209           (*info->fprintf_func) (info->stream, "%s", op_txt[i]);
13210         needcomma = 1;
13211       }
13212
13213   for (i = 0; i < MAX_OPERANDS; i++)
13214     if (op_index[i] != -1 && op_riprel[i])
13215       {
13216         (*info->fprintf_func) (info->stream, "        # ");
13217         (*info->print_address_func) ((bfd_vma) (start_pc + codep - start_codep
13218                                                 + op_address[op_index[i]]), info);
13219         break;
13220       }
13221   return codep - priv.the_buffer;
13222 }
13223
13224 static const char *float_mem[] = {
13225   /* d8 */
13226   "fadd{s|}",
13227   "fmul{s|}",
13228   "fcom{s|}",
13229   "fcomp{s|}",
13230   "fsub{s|}",
13231   "fsubr{s|}",
13232   "fdiv{s|}",
13233   "fdivr{s|}",
13234   /* d9 */
13235   "fld{s|}",
13236   "(bad)",
13237   "fst{s|}",
13238   "fstp{s|}",
13239   "fldenvIC",
13240   "fldcw",
13241   "fNstenvIC",
13242   "fNstcw",
13243   /* da */
13244   "fiadd{l|}",
13245   "fimul{l|}",
13246   "ficom{l|}",
13247   "ficomp{l|}",
13248   "fisub{l|}",
13249   "fisubr{l|}",
13250   "fidiv{l|}",
13251   "fidivr{l|}",
13252   /* db */
13253   "fild{l|}",
13254   "fisttp{l|}",
13255   "fist{l|}",
13256   "fistp{l|}",
13257   "(bad)",
13258   "fld{t||t|}",
13259   "(bad)",
13260   "fstp{t||t|}",
13261   /* dc */
13262   "fadd{l|}",
13263   "fmul{l|}",
13264   "fcom{l|}",
13265   "fcomp{l|}",
13266   "fsub{l|}",
13267   "fsubr{l|}",
13268   "fdiv{l|}",
13269   "fdivr{l|}",
13270   /* dd */
13271   "fld{l|}",
13272   "fisttp{ll|}",
13273   "fst{l||}",
13274   "fstp{l|}",
13275   "frstorIC",
13276   "(bad)",
13277   "fNsaveIC",
13278   "fNstsw",
13279   /* de */
13280   "fiadd",
13281   "fimul",
13282   "ficom",
13283   "ficomp",
13284   "fisub",
13285   "fisubr",
13286   "fidiv",
13287   "fidivr",
13288   /* df */
13289   "fild",
13290   "fisttp",
13291   "fist",
13292   "fistp",
13293   "fbld",
13294   "fild{ll|}",
13295   "fbstp",
13296   "fistp{ll|}",
13297 };
13298
13299 static const unsigned char float_mem_mode[] = {
13300   /* d8 */
13301   d_mode,
13302   d_mode,
13303   d_mode,
13304   d_mode,
13305   d_mode,
13306   d_mode,
13307   d_mode,
13308   d_mode,
13309   /* d9 */
13310   d_mode,
13311   0,
13312   d_mode,
13313   d_mode,
13314   0,
13315   w_mode,
13316   0,
13317   w_mode,
13318   /* da */
13319   d_mode,
13320   d_mode,
13321   d_mode,
13322   d_mode,
13323   d_mode,
13324   d_mode,
13325   d_mode,
13326   d_mode,
13327   /* db */
13328   d_mode,
13329   d_mode,
13330   d_mode,
13331   d_mode,
13332   0,
13333   t_mode,
13334   0,
13335   t_mode,
13336   /* dc */
13337   q_mode,
13338   q_mode,
13339   q_mode,
13340   q_mode,
13341   q_mode,
13342   q_mode,
13343   q_mode,
13344   q_mode,
13345   /* dd */
13346   q_mode,
13347   q_mode,
13348   q_mode,
13349   q_mode,
13350   0,
13351   0,
13352   0,
13353   w_mode,
13354   /* de */
13355   w_mode,
13356   w_mode,
13357   w_mode,
13358   w_mode,
13359   w_mode,
13360   w_mode,
13361   w_mode,
13362   w_mode,
13363   /* df */
13364   w_mode,
13365   w_mode,
13366   w_mode,
13367   w_mode,
13368   t_mode,
13369   q_mode,
13370   t_mode,
13371   q_mode
13372 };
13373
13374 #define ST { OP_ST, 0 }
13375 #define STi { OP_STi, 0 }
13376
13377 #define FGRPd9_2 NULL, { { NULL, 0 } }, 0
13378 #define FGRPd9_4 NULL, { { NULL, 1 } }, 0
13379 #define FGRPd9_5 NULL, { { NULL, 2 } }, 0
13380 #define FGRPd9_6 NULL, { { NULL, 3 } }, 0
13381 #define FGRPd9_7 NULL, { { NULL, 4 } }, 0
13382 #define FGRPda_5 NULL, { { NULL, 5 } }, 0
13383 #define FGRPdb_4 NULL, { { NULL, 6 } }, 0
13384 #define FGRPde_3 NULL, { { NULL, 7 } }, 0
13385 #define FGRPdf_4 NULL, { { NULL, 8 } }, 0
13386
13387 static const struct dis386 float_reg[][8] = {
13388   /* d8 */
13389   {
13390     { "fadd",   { ST, STi }, 0 },
13391     { "fmul",   { ST, STi }, 0 },
13392     { "fcom",   { STi }, 0 },
13393     { "fcomp",  { STi }, 0 },
13394     { "fsub",   { ST, STi }, 0 },
13395     { "fsubr",  { ST, STi }, 0 },
13396     { "fdiv",   { ST, STi }, 0 },
13397     { "fdivr",  { ST, STi }, 0 },
13398   },
13399   /* d9 */
13400   {
13401     { "fld",    { STi }, 0 },
13402     { "fxch",   { STi }, 0 },
13403     { FGRPd9_2 },
13404     { Bad_Opcode },
13405     { FGRPd9_4 },
13406     { FGRPd9_5 },
13407     { FGRPd9_6 },
13408     { FGRPd9_7 },
13409   },
13410   /* da */
13411   {
13412     { "fcmovb", { ST, STi }, 0 },
13413     { "fcmove", { ST, STi }, 0 },
13414     { "fcmovbe",{ ST, STi }, 0 },
13415     { "fcmovu", { ST, STi }, 0 },
13416     { Bad_Opcode },
13417     { FGRPda_5 },
13418     { Bad_Opcode },
13419     { Bad_Opcode },
13420   },
13421   /* db */
13422   {
13423     { "fcmovnb",{ ST, STi }, 0 },
13424     { "fcmovne",{ ST, STi }, 0 },
13425     { "fcmovnbe",{ ST, STi }, 0 },
13426     { "fcmovnu",{ ST, STi }, 0 },
13427     { FGRPdb_4 },
13428     { "fucomi", { ST, STi }, 0 },
13429     { "fcomi",  { ST, STi }, 0 },
13430     { Bad_Opcode },
13431   },
13432   /* dc */
13433   {
13434     { "fadd",   { STi, ST }, 0 },
13435     { "fmul",   { STi, ST }, 0 },
13436     { Bad_Opcode },
13437     { Bad_Opcode },
13438     { "fsub!M", { STi, ST }, 0 },
13439     { "fsubM",  { STi, ST }, 0 },
13440     { "fdiv!M", { STi, ST }, 0 },
13441     { "fdivM",  { STi, ST }, 0 },
13442   },
13443   /* dd */
13444   {
13445     { "ffree",  { STi }, 0 },
13446     { Bad_Opcode },
13447     { "fst",    { STi }, 0 },
13448     { "fstp",   { STi }, 0 },
13449     { "fucom",  { STi }, 0 },
13450     { "fucomp", { STi }, 0 },
13451     { Bad_Opcode },
13452     { Bad_Opcode },
13453   },
13454   /* de */
13455   {
13456     { "faddp",  { STi, ST }, 0 },
13457     { "fmulp",  { STi, ST }, 0 },
13458     { Bad_Opcode },
13459     { FGRPde_3 },
13460     { "fsub!Mp", { STi, ST }, 0 },
13461     { "fsubMp", { STi, ST }, 0 },
13462     { "fdiv!Mp", { STi, ST }, 0 },
13463     { "fdivMp", { STi, ST }, 0 },
13464   },
13465   /* df */
13466   {
13467     { "ffreep", { STi }, 0 },
13468     { Bad_Opcode },
13469     { Bad_Opcode },
13470     { Bad_Opcode },
13471     { FGRPdf_4 },
13472     { "fucomip", { ST, STi }, 0 },
13473     { "fcomip", { ST, STi }, 0 },
13474     { Bad_Opcode },
13475   },
13476 };
13477
13478 static char *fgrps[][8] = {
13479   /* d9_2  0 */
13480   {
13481     "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
13482   },
13483
13484   /* d9_4  1 */
13485   {
13486     "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
13487   },
13488
13489   /* d9_5  2 */
13490   {
13491     "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
13492   },
13493
13494   /* d9_6  3 */
13495   {
13496     "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
13497   },
13498
13499   /* d9_7  4 */
13500   {
13501     "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
13502   },
13503
13504   /* da_5  5 */
13505   {
13506     "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
13507   },
13508
13509   /* db_4  6 */
13510   {
13511     "fNeni(8087 only)","fNdisi(8087 only)","fNclex","fNinit",
13512     "fNsetpm(287 only)","frstpm(287 only)","(bad)","(bad)",
13513   },
13514
13515   /* de_3  7 */
13516   {
13517     "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
13518   },
13519
13520   /* df_4  8 */
13521   {
13522     "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
13523   },
13524 };
13525
13526 static void
13527 swap_operand (void)
13528 {
13529   mnemonicendp[0] = '.';
13530   mnemonicendp[1] = 's';
13531   mnemonicendp += 2;
13532 }
13533
13534 static void
13535 OP_Skip_MODRM (int bytemode ATTRIBUTE_UNUSED,
13536                int sizeflag ATTRIBUTE_UNUSED)
13537 {
13538   /* Skip mod/rm byte.  */
13539   MODRM_CHECK;
13540   codep++;
13541 }
13542
13543 static void
13544 dofloat (int sizeflag)
13545 {
13546   const struct dis386 *dp;
13547   unsigned char floatop;
13548
13549   floatop = codep[-1];
13550
13551   if (modrm.mod != 3)
13552     {
13553       int fp_indx = (floatop - 0xd8) * 8 + modrm.reg;
13554
13555       putop (float_mem[fp_indx], sizeflag);
13556       obufp = op_out[0];
13557       op_ad = 2;
13558       OP_E (float_mem_mode[fp_indx], sizeflag);
13559       return;
13560     }
13561   /* Skip mod/rm byte.  */
13562   MODRM_CHECK;
13563   codep++;
13564
13565   dp = &float_reg[floatop - 0xd8][modrm.reg];
13566   if (dp->name == NULL)
13567     {
13568       putop (fgrps[dp->op[0].bytemode][modrm.rm], sizeflag);
13569
13570       /* Instruction fnstsw is only one with strange arg.  */
13571       if (floatop == 0xdf && codep[-1] == 0xe0)
13572         strcpy (op_out[0], names16[0]);
13573     }
13574   else
13575     {
13576       putop (dp->name, sizeflag);
13577
13578       obufp = op_out[0];
13579       op_ad = 2;
13580       if (dp->op[0].rtn)
13581         (*dp->op[0].rtn) (dp->op[0].bytemode, sizeflag);
13582
13583       obufp = op_out[1];
13584       op_ad = 1;
13585       if (dp->op[1].rtn)
13586         (*dp->op[1].rtn) (dp->op[1].bytemode, sizeflag);
13587     }
13588 }
13589
13590 /* Like oappend (below), but S is a string starting with '%'.
13591    In Intel syntax, the '%' is elided.  */
13592 static void
13593 oappend_maybe_intel (const char *s)
13594 {
13595   oappend (s + intel_syntax);
13596 }
13597
13598 static void
13599 OP_ST (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13600 {
13601   oappend_maybe_intel ("%st");
13602 }
13603
13604 static void
13605 OP_STi (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13606 {
13607   sprintf (scratchbuf, "%%st(%d)", modrm.rm);
13608   oappend_maybe_intel (scratchbuf);
13609 }
13610
13611 /* Capital letters in template are macros.  */
13612 static int
13613 putop (const char *in_template, int sizeflag)
13614 {
13615   const char *p;
13616   int alt = 0;
13617   int cond = 1;
13618   unsigned int l = 0, len = 1;
13619   char last[4];
13620
13621 #define SAVE_LAST(c)                    \
13622   if (l < len && l < sizeof (last))     \
13623     last[l++] = c;                      \
13624   else                                  \
13625     abort ();
13626
13627   for (p = in_template; *p; p++)
13628     {
13629       switch (*p)
13630         {
13631         default:
13632           *obufp++ = *p;
13633           break;
13634         case '%':
13635           len++;
13636           break;
13637         case '!':
13638           cond = 0;
13639           break;
13640         case '{':
13641           alt = 0;
13642           if (intel_syntax)
13643             {
13644               while (*++p != '|')
13645                 if (*p == '}' || *p == '\0')
13646                   abort ();
13647             }
13648           /* Fall through.  */
13649         case 'I':
13650           alt = 1;
13651           continue;
13652         case '|':
13653           while (*++p != '}')
13654             {
13655               if (*p == '\0')
13656                 abort ();
13657             }
13658           break;
13659         case '}':
13660           break;
13661         case 'A':
13662           if (intel_syntax)
13663             break;
13664           if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
13665             *obufp++ = 'b';
13666           break;
13667         case 'B':
13668           if (l == 0 && len == 1)
13669             {
13670 case_B:
13671               if (intel_syntax)
13672                 break;
13673               if (sizeflag & SUFFIX_ALWAYS)
13674                 *obufp++ = 'b';
13675             }
13676           else
13677             {
13678               if (l != 1
13679                   || len != 2
13680                   || last[0] != 'L')
13681                 {
13682                   SAVE_LAST (*p);
13683                   break;
13684                 }
13685
13686               if (address_mode == mode_64bit
13687                   && !(prefixes & PREFIX_ADDR))
13688                 {
13689                   *obufp++ = 'a';
13690                   *obufp++ = 'b';
13691                   *obufp++ = 's';
13692                 }
13693
13694               goto case_B;
13695             }
13696           break;
13697         case 'C':
13698           if (intel_syntax && !alt)
13699             break;
13700           if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
13701             {
13702               if (sizeflag & DFLAG)
13703                 *obufp++ = intel_syntax ? 'd' : 'l';
13704               else
13705                 *obufp++ = intel_syntax ? 'w' : 's';
13706               used_prefixes |= (prefixes & PREFIX_DATA);
13707             }
13708           break;
13709         case 'D':
13710           if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
13711             break;
13712           USED_REX (REX_W);
13713           if (modrm.mod == 3)
13714             {
13715               if (rex & REX_W)
13716                 *obufp++ = 'q';
13717               else
13718                 {
13719                   if (sizeflag & DFLAG)
13720                     *obufp++ = intel_syntax ? 'd' : 'l';
13721                   else
13722                     *obufp++ = 'w';
13723                   used_prefixes |= (prefixes & PREFIX_DATA);
13724                 }
13725             }
13726           else
13727             *obufp++ = 'w';
13728           break;
13729         case 'E':               /* For jcxz/jecxz */
13730           if (address_mode == mode_64bit)
13731             {
13732               if (sizeflag & AFLAG)
13733                 *obufp++ = 'r';
13734               else
13735                 *obufp++ = 'e';
13736             }
13737           else
13738             if (sizeflag & AFLAG)
13739               *obufp++ = 'e';
13740           used_prefixes |= (prefixes & PREFIX_ADDR);
13741           break;
13742         case 'F':
13743           if (intel_syntax)
13744             break;
13745           if ((prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS))
13746             {
13747               if (sizeflag & AFLAG)
13748                 *obufp++ = address_mode == mode_64bit ? 'q' : 'l';
13749               else
13750                 *obufp++ = address_mode == mode_64bit ? 'l' : 'w';
13751               used_prefixes |= (prefixes & PREFIX_ADDR);
13752             }
13753           break;
13754         case 'G':
13755           if (intel_syntax || (obufp[-1] != 's' && !(sizeflag & SUFFIX_ALWAYS)))
13756             break;
13757           if ((rex & REX_W) || (sizeflag & DFLAG))
13758             *obufp++ = 'l';
13759           else
13760             *obufp++ = 'w';
13761           if (!(rex & REX_W))
13762             used_prefixes |= (prefixes & PREFIX_DATA);
13763           break;
13764         case 'H':
13765           if (intel_syntax)
13766             break;
13767           if ((prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS
13768               || (prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS)
13769             {
13770               used_prefixes |= prefixes & (PREFIX_CS | PREFIX_DS);
13771               *obufp++ = ',';
13772               *obufp++ = 'p';
13773               if (prefixes & PREFIX_DS)
13774                 *obufp++ = 't';
13775               else
13776                 *obufp++ = 'n';
13777             }
13778           break;
13779         case 'J':
13780           if (intel_syntax)
13781             break;
13782           *obufp++ = 'l';
13783           break;
13784         case 'K':
13785           USED_REX (REX_W);
13786           if (rex & REX_W)
13787             *obufp++ = 'q';
13788           else
13789             *obufp++ = 'd';
13790           break;
13791         case 'Z':
13792           if (intel_syntax)
13793             break;
13794           if (address_mode == mode_64bit && (sizeflag & SUFFIX_ALWAYS))
13795             {
13796               *obufp++ = 'q';
13797               break;
13798             }
13799           /* Fall through.  */
13800           goto case_L;
13801         case 'L':
13802           if (l != 0 || len != 1)
13803             {
13804               SAVE_LAST (*p);
13805               break;
13806             }
13807 case_L:
13808           if (intel_syntax)
13809             break;
13810           if (sizeflag & SUFFIX_ALWAYS)
13811             *obufp++ = 'l';
13812           break;
13813         case 'M':
13814           if (intel_mnemonic != cond)
13815             *obufp++ = 'r';
13816           break;
13817         case 'N':
13818           if ((prefixes & PREFIX_FWAIT) == 0)
13819             *obufp++ = 'n';
13820           else
13821             used_prefixes |= PREFIX_FWAIT;
13822           break;
13823         case 'O':
13824           USED_REX (REX_W);
13825           if (rex & REX_W)
13826             *obufp++ = 'o';
13827           else if (intel_syntax && (sizeflag & DFLAG))
13828             *obufp++ = 'q';
13829           else
13830             *obufp++ = 'd';
13831           if (!(rex & REX_W))
13832             used_prefixes |= (prefixes & PREFIX_DATA);
13833           break;
13834         case 'T':
13835           if (!intel_syntax
13836               && address_mode == mode_64bit
13837               && ((sizeflag & DFLAG) || (rex & REX_W)))
13838             {
13839               *obufp++ = 'q';
13840               break;
13841             }
13842           /* Fall through.  */
13843           goto case_P;
13844         case 'P':
13845           if (l == 0 && len == 1)
13846             {
13847 case_P:
13848               if (intel_syntax)
13849                 {
13850                   if ((rex & REX_W) == 0
13851                       && (prefixes & PREFIX_DATA))
13852                     {
13853                       if ((sizeflag & DFLAG) == 0)
13854                         *obufp++ = 'w';
13855                       used_prefixes |= (prefixes & PREFIX_DATA);
13856                     }
13857                   break;
13858                 }
13859               if ((prefixes & PREFIX_DATA)
13860                   || (rex & REX_W)
13861                   || (sizeflag & SUFFIX_ALWAYS))
13862                 {
13863                   USED_REX (REX_W);
13864                   if (rex & REX_W)
13865                     *obufp++ = 'q';
13866                   else
13867                     {
13868                       if (sizeflag & DFLAG)
13869                         *obufp++ = 'l';
13870                       else
13871                         *obufp++ = 'w';
13872                       used_prefixes |= (prefixes & PREFIX_DATA);
13873                     }
13874                 }
13875             }
13876           else
13877             {
13878               if (l != 1 || len != 2 || last[0] != 'L')
13879                 {
13880                   SAVE_LAST (*p);
13881                   break;
13882                 }
13883
13884               if ((prefixes & PREFIX_DATA)
13885                   || (rex & REX_W)
13886                   || (sizeflag & SUFFIX_ALWAYS))
13887                 {
13888                   USED_REX (REX_W);
13889                   if (rex & REX_W)
13890                     *obufp++ = 'q';
13891                   else
13892                     {
13893                       if (sizeflag & DFLAG)
13894                         *obufp++ = intel_syntax ? 'd' : 'l';
13895                       else
13896                         *obufp++ = 'w';
13897                       used_prefixes |= (prefixes & PREFIX_DATA);
13898                     }
13899                 }
13900             }
13901           break;
13902         case 'U':
13903           if (intel_syntax)
13904             break;
13905           if (address_mode == mode_64bit
13906               && ((sizeflag & DFLAG) || (rex & REX_W)))
13907             {
13908               if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
13909                 *obufp++ = 'q';
13910               break;
13911             }
13912           /* Fall through.  */
13913           goto case_Q;
13914         case 'Q':
13915           if (l == 0 && len == 1)
13916             {
13917 case_Q:
13918               if (intel_syntax && !alt)
13919                 break;
13920               USED_REX (REX_W);
13921               if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
13922                 {
13923                   if (rex & REX_W)
13924                     *obufp++ = 'q';
13925                   else
13926                     {
13927                       if (sizeflag & DFLAG)
13928                         *obufp++ = intel_syntax ? 'd' : 'l';
13929                       else
13930                         *obufp++ = 'w';
13931                       used_prefixes |= (prefixes & PREFIX_DATA);
13932                     }
13933                 }
13934             }
13935           else
13936             {
13937               if (l != 1 || len != 2 || last[0] != 'L')
13938                 {
13939                   SAVE_LAST (*p);
13940                   break;
13941                 }
13942               if (intel_syntax
13943                   || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
13944                 break;
13945               if ((rex & REX_W))
13946                 {
13947                   USED_REX (REX_W);
13948                   *obufp++ = 'q';
13949                 }
13950               else
13951                 *obufp++ = 'l';
13952             }
13953           break;
13954         case 'R':
13955           USED_REX (REX_W);
13956           if (rex & REX_W)
13957             *obufp++ = 'q';
13958           else if (sizeflag & DFLAG)
13959             {
13960               if (intel_syntax)
13961                   *obufp++ = 'd';
13962               else
13963                   *obufp++ = 'l';
13964             }
13965           else
13966             *obufp++ = 'w';
13967           if (intel_syntax && !p[1]
13968               && ((rex & REX_W) || (sizeflag & DFLAG)))
13969             *obufp++ = 'e';
13970           if (!(rex & REX_W))
13971             used_prefixes |= (prefixes & PREFIX_DATA);
13972           break;
13973         case 'V':
13974           if (l == 0 && len == 1)
13975             {
13976               if (intel_syntax)
13977                 break;
13978               if (address_mode == mode_64bit
13979                   && ((sizeflag & DFLAG) || (rex & REX_W)))
13980                 {
13981                   if (sizeflag & SUFFIX_ALWAYS)
13982                     *obufp++ = 'q';
13983                   break;
13984                 }
13985             }
13986           else
13987             {
13988               if (l != 1
13989                   || len != 2
13990                   || last[0] != 'L')
13991                 {
13992                   SAVE_LAST (*p);
13993                   break;
13994                 }
13995
13996               if (rex & REX_W)
13997                 {
13998                   *obufp++ = 'a';
13999                   *obufp++ = 'b';
14000                   *obufp++ = 's';
14001                 }
14002             }
14003           /* Fall through.  */
14004           goto case_S;
14005         case 'S':
14006           if (l == 0 && len == 1)
14007             {
14008 case_S:
14009               if (intel_syntax)
14010                 break;
14011               if (sizeflag & SUFFIX_ALWAYS)
14012                 {
14013                   if (rex & REX_W)
14014                     *obufp++ = 'q';
14015                   else
14016                     {
14017                       if (sizeflag & DFLAG)
14018                         *obufp++ = 'l';
14019                       else
14020                         *obufp++ = 'w';
14021                       used_prefixes |= (prefixes & PREFIX_DATA);
14022                     }
14023                 }
14024             }
14025           else
14026             {
14027               if (l != 1
14028                   || len != 2
14029                   || last[0] != 'L')
14030                 {
14031                   SAVE_LAST (*p);
14032                   break;
14033                 }
14034
14035               if (address_mode == mode_64bit
14036                   && !(prefixes & PREFIX_ADDR))
14037                 {
14038                   *obufp++ = 'a';
14039                   *obufp++ = 'b';
14040                   *obufp++ = 's';
14041                 }
14042
14043               goto case_S;
14044             }
14045           break;
14046         case 'X':
14047           if (l != 0 || len != 1)
14048             {
14049               SAVE_LAST (*p);
14050               break;
14051             }
14052           if (need_vex && vex.prefix)
14053             {
14054               if (vex.prefix == DATA_PREFIX_OPCODE)
14055                 *obufp++ = 'd';
14056               else
14057                 *obufp++ = 's';
14058             }
14059           else
14060             {
14061               if (prefixes & PREFIX_DATA)
14062                 *obufp++ = 'd';
14063               else
14064                 *obufp++ = 's';
14065               used_prefixes |= (prefixes & PREFIX_DATA);
14066             }
14067           break;
14068         case 'Y':
14069           if (l == 0 && len == 1)
14070             {
14071               if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
14072                 break;
14073               if (rex & REX_W)
14074                 {
14075                   USED_REX (REX_W);
14076                   *obufp++ = 'q';
14077                 }
14078               break;
14079             }
14080           else
14081             {
14082               if (l != 1 || len != 2 || last[0] != 'X')
14083                 {
14084                   SAVE_LAST (*p);
14085                   break;
14086                 }
14087               if (!need_vex)
14088                 abort ();
14089               if (intel_syntax
14090                   || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
14091                 break;
14092               switch (vex.length)
14093                 {
14094                 case 128:
14095                   *obufp++ = 'x';
14096                   break;
14097                 case 256:
14098                   *obufp++ = 'y';
14099                   break;
14100                 default:
14101                   abort ();
14102                 }
14103             }
14104           break;
14105         case 'W':
14106           if (l == 0 && len == 1)
14107             {
14108               /* operand size flag for cwtl, cbtw */
14109               USED_REX (REX_W);
14110               if (rex & REX_W)
14111                 {
14112                   if (intel_syntax)
14113                     *obufp++ = 'd';
14114                   else
14115                     *obufp++ = 'l';
14116                 }
14117               else if (sizeflag & DFLAG)
14118                 *obufp++ = 'w';
14119               else
14120                 *obufp++ = 'b';
14121               if (!(rex & REX_W))
14122                 used_prefixes |= (prefixes & PREFIX_DATA);
14123             }
14124           else
14125             {
14126               if (l != 1
14127                   || len != 2
14128                   || (last[0] != 'X'
14129                       && last[0] != 'L'))
14130                 {
14131                   SAVE_LAST (*p);
14132                   break;
14133                 }
14134               if (!need_vex)
14135                 abort ();
14136               if (last[0] == 'X')
14137                 *obufp++ = vex.w ? 'd': 's';
14138               else
14139                 *obufp++ = vex.w ? 'q': 'd';
14140             }
14141           break;
14142         }
14143       alt = 0;
14144     }
14145   *obufp = 0;
14146   mnemonicendp = obufp;
14147   return 0;
14148 }
14149
14150 static void
14151 oappend (const char *s)
14152 {
14153   obufp = stpcpy (obufp, s);
14154 }
14155
14156 static void
14157 append_seg (void)
14158 {
14159   /* Only print the active segment register.  */
14160   if (!active_seg_prefix)
14161     return;
14162
14163   used_prefixes |= active_seg_prefix;
14164   switch (active_seg_prefix)
14165     {
14166     case PREFIX_CS:
14167       oappend_maybe_intel ("%cs:");
14168       break;
14169     case PREFIX_DS:
14170       oappend_maybe_intel ("%ds:");
14171       break;
14172     case PREFIX_SS:
14173       oappend_maybe_intel ("%ss:");
14174       break;
14175     case PREFIX_ES:
14176       oappend_maybe_intel ("%es:");
14177       break;
14178     case PREFIX_FS:
14179       oappend_maybe_intel ("%fs:");
14180       break;
14181     case PREFIX_GS:
14182       oappend_maybe_intel ("%gs:");
14183       break;
14184     default:
14185       break;
14186     }
14187 }
14188
14189 static void
14190 OP_indirE (int bytemode, int sizeflag)
14191 {
14192   if (!intel_syntax)
14193     oappend ("*");
14194   OP_E (bytemode, sizeflag);
14195 }
14196
14197 static void
14198 print_operand_value (char *buf, int hex, bfd_vma disp)
14199 {
14200   if (address_mode == mode_64bit)
14201     {
14202       if (hex)
14203         {
14204           char tmp[30];
14205           int i;
14206           buf[0] = '0';
14207           buf[1] = 'x';
14208           sprintf_vma (tmp, disp);
14209           for (i = 0; tmp[i] == '0' && tmp[i + 1]; i++);
14210           strcpy (buf + 2, tmp + i);
14211         }
14212       else
14213         {
14214           bfd_signed_vma v = disp;
14215           char tmp[30];
14216           int i;
14217           if (v < 0)
14218             {
14219               *(buf++) = '-';
14220               v = -disp;
14221               /* Check for possible overflow on 0x8000000000000000.  */
14222               if (v < 0)
14223                 {
14224                   strcpy (buf, "9223372036854775808");
14225                   return;
14226                 }
14227             }
14228           if (!v)
14229             {
14230               strcpy (buf, "0");
14231               return;
14232             }
14233
14234           i = 0;
14235           tmp[29] = 0;
14236           while (v)
14237             {
14238               tmp[28 - i] = (v % 10) + '0';
14239               v /= 10;
14240               i++;
14241             }
14242           strcpy (buf, tmp + 29 - i);
14243         }
14244     }
14245   else
14246     {
14247       if (hex)
14248         sprintf (buf, "0x%x", (unsigned int) disp);
14249       else
14250         sprintf (buf, "%d", (int) disp);
14251     }
14252 }
14253
14254 /* Put DISP in BUF as signed hex number.  */
14255
14256 static void
14257 print_displacement (char *buf, bfd_vma disp)
14258 {
14259   bfd_signed_vma val = disp;
14260   char tmp[30];
14261   int i, j = 0;
14262
14263   if (val < 0)
14264     {
14265       buf[j++] = '-';
14266       val = -disp;
14267
14268       /* Check for possible overflow.  */
14269       if (val < 0)
14270         {
14271           switch (address_mode)
14272             {
14273             case mode_64bit:
14274               strcpy (buf + j, "0x8000000000000000");
14275               break;
14276             case mode_32bit:
14277               strcpy (buf + j, "0x80000000");
14278               break;
14279             case mode_16bit:
14280               strcpy (buf + j, "0x8000");
14281               break;
14282             }
14283           return;
14284         }
14285     }
14286
14287   buf[j++] = '0';
14288   buf[j++] = 'x';
14289
14290   sprintf_vma (tmp, (bfd_vma) val);
14291   for (i = 0; tmp[i] == '0'; i++)
14292     continue;
14293   if (tmp[i] == '\0')
14294     i--;
14295   strcpy (buf + j, tmp + i);
14296 }
14297
14298 static void
14299 intel_operand_size (int bytemode, int sizeflag)
14300 {
14301   if (vex.evex
14302       && vex.b
14303       && (bytemode == x_mode
14304           || bytemode == evex_half_bcst_xmmq_mode))
14305     {
14306       if (vex.w)
14307         oappend ("QWORD PTR ");
14308       else
14309         oappend ("DWORD PTR ");
14310       return;
14311     }
14312   switch (bytemode)
14313     {
14314     case b_mode:
14315     case b_swap_mode:
14316     case dqb_mode:
14317     case db_mode:
14318       oappend ("BYTE PTR ");
14319       break;
14320     case w_mode:
14321     case dw_mode:
14322     case dqw_mode:
14323     case dqw_swap_mode:
14324       oappend ("WORD PTR ");
14325       break;
14326     case stack_v_mode:
14327       if (address_mode == mode_64bit && ((sizeflag & DFLAG) || (rex & REX_W)))
14328         {
14329           oappend ("QWORD PTR ");
14330           break;
14331         }
14332       /* FALLTHRU */
14333     case v_mode:
14334     case v_swap_mode:
14335     case dq_mode:
14336       USED_REX (REX_W);
14337       if (rex & REX_W)
14338         oappend ("QWORD PTR ");
14339       else
14340         {
14341           if ((sizeflag & DFLAG) || bytemode == dq_mode)
14342             oappend ("DWORD PTR ");
14343           else
14344             oappend ("WORD PTR ");
14345           used_prefixes |= (prefixes & PREFIX_DATA);
14346         }
14347       break;
14348     case z_mode:
14349       if ((rex & REX_W) || (sizeflag & DFLAG))
14350         *obufp++ = 'D';
14351       oappend ("WORD PTR ");
14352       if (!(rex & REX_W))
14353         used_prefixes |= (prefixes & PREFIX_DATA);
14354       break;
14355     case a_mode:
14356       if (sizeflag & DFLAG)
14357         oappend ("QWORD PTR ");
14358       else
14359         oappend ("DWORD PTR ");
14360       used_prefixes |= (prefixes & PREFIX_DATA);
14361       break;
14362     case d_mode:
14363     case d_scalar_mode:
14364     case d_scalar_swap_mode:
14365     case d_swap_mode:
14366     case dqd_mode:
14367       oappend ("DWORD PTR ");
14368       break;
14369     case q_mode:
14370     case q_scalar_mode:
14371     case q_scalar_swap_mode:
14372     case q_swap_mode:
14373       oappend ("QWORD PTR ");
14374       break;
14375     case m_mode:
14376       if (address_mode == mode_64bit)
14377         oappend ("QWORD PTR ");
14378       else
14379         oappend ("DWORD PTR ");
14380       break;
14381     case f_mode:
14382       if (sizeflag & DFLAG)
14383         oappend ("FWORD PTR ");
14384       else
14385         oappend ("DWORD PTR ");
14386       used_prefixes |= (prefixes & PREFIX_DATA);
14387       break;
14388     case t_mode:
14389       oappend ("TBYTE PTR ");
14390       break;
14391     case x_mode:
14392     case x_swap_mode:
14393     case evex_x_gscat_mode:
14394     case evex_x_nobcst_mode:
14395       if (need_vex)
14396         {
14397           switch (vex.length)
14398             {
14399             case 128:
14400               oappend ("XMMWORD PTR ");
14401               break;
14402             case 256:
14403               oappend ("YMMWORD PTR ");
14404               break;
14405             case 512:
14406               oappend ("ZMMWORD PTR ");
14407               break;
14408             default:
14409               abort ();
14410             }
14411         }
14412       else
14413         oappend ("XMMWORD PTR ");
14414       break;
14415     case xmm_mode:
14416       oappend ("XMMWORD PTR ");
14417       break;
14418     case ymm_mode:
14419       oappend ("YMMWORD PTR ");
14420       break;
14421     case xmmq_mode:
14422     case evex_half_bcst_xmmq_mode:
14423       if (!need_vex)
14424         abort ();
14425
14426       switch (vex.length)
14427         {
14428         case 128:
14429           oappend ("QWORD PTR ");
14430           break;
14431         case 256:
14432           oappend ("XMMWORD PTR ");
14433           break;
14434         case 512:
14435           oappend ("YMMWORD PTR ");
14436           break;
14437         default:
14438           abort ();
14439         }
14440       break;
14441     case xmm_mb_mode:
14442       if (!need_vex)
14443         abort ();
14444
14445       switch (vex.length)
14446         {
14447         case 128:
14448         case 256:
14449         case 512:
14450           oappend ("BYTE PTR ");
14451           break;
14452         default:
14453           abort ();
14454         }
14455       break;
14456     case xmm_mw_mode:
14457       if (!need_vex)
14458         abort ();
14459
14460       switch (vex.length)
14461         {
14462         case 128:
14463         case 256:
14464         case 512:
14465           oappend ("WORD PTR ");
14466           break;
14467         default:
14468           abort ();
14469         }
14470       break;
14471     case xmm_md_mode:
14472       if (!need_vex)
14473         abort ();
14474
14475       switch (vex.length)
14476         {
14477         case 128:
14478         case 256:
14479         case 512:
14480           oappend ("DWORD PTR ");
14481           break;
14482         default:
14483           abort ();
14484         }
14485       break;
14486     case xmm_mq_mode:
14487       if (!need_vex)
14488         abort ();
14489
14490       switch (vex.length)
14491         {
14492         case 128:
14493         case 256:
14494         case 512:
14495           oappend ("QWORD PTR ");
14496           break;
14497         default:
14498           abort ();
14499         }
14500       break;
14501     case xmmdw_mode:
14502       if (!need_vex)
14503         abort ();
14504
14505       switch (vex.length)
14506         {
14507         case 128:
14508           oappend ("WORD PTR ");
14509           break;
14510         case 256:
14511           oappend ("DWORD PTR ");
14512           break;
14513         case 512:
14514           oappend ("QWORD PTR ");
14515           break;
14516         default:
14517           abort ();
14518         }
14519       break;
14520     case xmmqd_mode:
14521       if (!need_vex)
14522         abort ();
14523
14524       switch (vex.length)
14525         {
14526         case 128:
14527           oappend ("DWORD PTR ");
14528           break;
14529         case 256:
14530           oappend ("QWORD PTR ");
14531           break;
14532         case 512:
14533           oappend ("XMMWORD PTR ");
14534           break;
14535         default:
14536           abort ();
14537         }
14538       break;
14539     case ymmq_mode:
14540       if (!need_vex)
14541         abort ();
14542
14543       switch (vex.length)
14544         {
14545         case 128:
14546           oappend ("QWORD PTR ");
14547           break;
14548         case 256:
14549           oappend ("YMMWORD PTR ");
14550           break;
14551         case 512:
14552           oappend ("ZMMWORD PTR ");
14553           break;
14554         default:
14555           abort ();
14556         }
14557       break;
14558     case ymmxmm_mode:
14559       if (!need_vex)
14560         abort ();
14561
14562       switch (vex.length)
14563         {
14564         case 128:
14565         case 256:
14566           oappend ("XMMWORD PTR ");
14567           break;
14568         default:
14569           abort ();
14570         }
14571       break;
14572     case o_mode:
14573       oappend ("OWORD PTR ");
14574       break;
14575     case xmm_mdq_mode:
14576     case vex_w_dq_mode:
14577     case vex_scalar_w_dq_mode:
14578       if (!need_vex)
14579         abort ();
14580
14581       if (vex.w)
14582         oappend ("QWORD PTR ");
14583       else
14584         oappend ("DWORD PTR ");
14585       break;
14586     case vex_vsib_d_w_dq_mode:
14587     case vex_vsib_q_w_dq_mode:
14588       if (!need_vex)
14589         abort ();
14590
14591       if (!vex.evex)
14592         {
14593           if (vex.w)
14594             oappend ("QWORD PTR ");
14595           else
14596             oappend ("DWORD PTR ");
14597         }
14598       else
14599         {
14600           switch (vex.length)
14601             {
14602             case 128:
14603               oappend ("XMMWORD PTR ");
14604               break;
14605             case 256:
14606               oappend ("YMMWORD PTR ");
14607               break;
14608             case 512:
14609               oappend ("ZMMWORD PTR ");
14610               break;
14611             default:
14612               abort ();
14613             }
14614         }
14615       break;
14616     case vex_vsib_q_w_d_mode:
14617     case vex_vsib_d_w_d_mode:
14618       if (!need_vex || !vex.evex)
14619         abort ();
14620
14621       switch (vex.length)
14622         {
14623         case 128:
14624           oappend ("QWORD PTR ");
14625           break;
14626         case 256:
14627           oappend ("XMMWORD PTR ");
14628           break;
14629         case 512:
14630           oappend ("YMMWORD PTR ");
14631           break;
14632         default:
14633           abort ();
14634         }
14635
14636       break;
14637     case mask_bd_mode:
14638       if (!need_vex || vex.length != 128)
14639         abort ();
14640       if (vex.w)
14641         oappend ("DWORD PTR ");
14642       else
14643         oappend ("BYTE PTR ");
14644       break;
14645     case mask_mode:
14646       if (!need_vex)
14647         abort ();
14648       if (vex.w)
14649         oappend ("QWORD PTR ");
14650       else
14651         oappend ("WORD PTR ");
14652       break;
14653     case v_bnd_mode:
14654     default:
14655       break;
14656     }
14657 }
14658
14659 static void
14660 OP_E_register (int bytemode, int sizeflag)
14661 {
14662   int reg = modrm.rm;
14663   const char **names;
14664
14665   USED_REX (REX_B);
14666   if ((rex & REX_B))
14667     reg += 8;
14668
14669   if ((sizeflag & SUFFIX_ALWAYS)
14670       && (bytemode == b_swap_mode
14671           || bytemode == v_swap_mode
14672           || bytemode == dqw_swap_mode))
14673     swap_operand ();
14674
14675   switch (bytemode)
14676     {
14677     case b_mode:
14678     case b_swap_mode:
14679       USED_REX (0);
14680       if (rex)
14681         names = names8rex;
14682       else
14683         names = names8;
14684       break;
14685     case w_mode:
14686       names = names16;
14687       break;
14688     case d_mode:
14689     case dw_mode:
14690     case db_mode:
14691       names = names32;
14692       break;
14693     case q_mode:
14694       names = names64;
14695       break;
14696     case m_mode:
14697     case v_bnd_mode:
14698       names = address_mode == mode_64bit ? names64 : names32;
14699       break;
14700     case bnd_mode:
14701       names = names_bnd;
14702       break;
14703     case stack_v_mode:
14704       if (address_mode == mode_64bit && ((sizeflag & DFLAG) || (rex & REX_W)))
14705         {
14706           names = names64;
14707           break;
14708         }
14709       bytemode = v_mode;
14710       /* FALLTHRU */
14711     case v_mode:
14712     case v_swap_mode:
14713     case dq_mode:
14714     case dqb_mode:
14715     case dqd_mode:
14716     case dqw_mode:
14717     case dqw_swap_mode:
14718       USED_REX (REX_W);
14719       if (rex & REX_W)
14720         names = names64;
14721       else
14722         {
14723           if ((sizeflag & DFLAG)
14724               || (bytemode != v_mode
14725                   && bytemode != v_swap_mode))
14726             names = names32;
14727           else
14728             names = names16;
14729           used_prefixes |= (prefixes & PREFIX_DATA);
14730         }
14731       break;
14732     case mask_bd_mode:
14733     case mask_mode:
14734       names = names_mask;
14735       break;
14736     case 0:
14737       return;
14738     default:
14739       oappend (INTERNAL_DISASSEMBLER_ERROR);
14740       return;
14741     }
14742   oappend (names[reg]);
14743 }
14744
14745 static void
14746 OP_E_memory (int bytemode, int sizeflag)
14747 {
14748   bfd_vma disp = 0;
14749   int add = (rex & REX_B) ? 8 : 0;
14750   int riprel = 0;
14751   int shift;
14752
14753   if (vex.evex)
14754     {
14755       /* In EVEX, if operand doesn't allow broadcast, vex.b should be 0.  */
14756       if (vex.b
14757           && bytemode != x_mode
14758           && bytemode != xmmq_mode
14759           && bytemode != evex_half_bcst_xmmq_mode)
14760         {
14761           BadOp ();
14762           return;
14763         }
14764       switch (bytemode)
14765         {
14766         case dqw_mode:
14767         case dw_mode:
14768         case dqw_swap_mode:
14769           shift = 1;
14770           break;
14771         case dqb_mode:
14772         case db_mode:
14773           shift = 0;
14774           break;
14775         case vex_vsib_d_w_dq_mode:
14776         case vex_vsib_d_w_d_mode:
14777         case vex_vsib_q_w_dq_mode:
14778         case vex_vsib_q_w_d_mode:
14779         case evex_x_gscat_mode:
14780         case xmm_mdq_mode:
14781           shift = vex.w ? 3 : 2;
14782           break;
14783         case x_mode:
14784         case evex_half_bcst_xmmq_mode:
14785         case xmmq_mode:
14786           if (vex.b)
14787             {
14788               shift = vex.w ? 3 : 2;
14789               break;
14790             }
14791           /* Fall through if vex.b == 0.  */
14792         case xmmqd_mode:
14793         case xmmdw_mode:
14794         case ymmq_mode:
14795         case evex_x_nobcst_mode:
14796         case x_swap_mode:
14797           switch (vex.length)
14798             {
14799             case 128:
14800               shift = 4;
14801               break;
14802             case 256:
14803               shift = 5;
14804               break;
14805             case 512:
14806               shift = 6;
14807               break;
14808             default:
14809               abort ();
14810             }
14811           break;
14812         case ymm_mode:
14813           shift = 5;
14814           break;
14815         case xmm_mode:
14816           shift = 4;
14817           break;
14818         case xmm_mq_mode:
14819         case q_mode:
14820         case q_scalar_mode:
14821         case q_swap_mode:
14822         case q_scalar_swap_mode:
14823           shift = 3;
14824           break;
14825         case dqd_mode:
14826         case xmm_md_mode:
14827         case d_mode:
14828         case d_scalar_mode:
14829         case d_swap_mode:
14830         case d_scalar_swap_mode:
14831           shift = 2;
14832           break;
14833         case xmm_mw_mode:
14834           shift = 1;
14835           break;
14836         case xmm_mb_mode:
14837           shift = 0;
14838           break;
14839         default:
14840           abort ();
14841         }
14842       /* Make necessary corrections to shift for modes that need it.
14843          For these modes we currently have shift 4, 5 or 6 depending on
14844          vex.length (it corresponds to xmmword, ymmword or zmmword
14845          operand).  We might want to make it 3, 4 or 5 (e.g. for
14846          xmmq_mode).  In case of broadcast enabled the corrections
14847          aren't needed, as element size is always 32 or 64 bits.  */
14848       if (!vex.b
14849           && (bytemode == xmmq_mode
14850               || bytemode == evex_half_bcst_xmmq_mode))
14851         shift -= 1;
14852       else if (bytemode == xmmqd_mode)
14853         shift -= 2;
14854       else if (bytemode == xmmdw_mode)
14855         shift -= 3;
14856       else if (bytemode == ymmq_mode && vex.length == 128)
14857         shift -= 1;
14858     }
14859   else
14860     shift = 0;
14861
14862   USED_REX (REX_B);
14863   if (intel_syntax)
14864     intel_operand_size (bytemode, sizeflag);
14865   append_seg ();
14866
14867   if ((sizeflag & AFLAG) || address_mode == mode_64bit)
14868     {
14869       /* 32/64 bit address mode */
14870       int havedisp;
14871       int havesib;
14872       int havebase;
14873       int haveindex;
14874       int needindex;
14875       int base, rbase;
14876       int vindex = 0;
14877       int scale = 0;
14878       int addr32flag = !((sizeflag & AFLAG)
14879                          || bytemode == v_bnd_mode
14880                          || bytemode == bnd_mode);
14881       const char **indexes64 = names64;
14882       const char **indexes32 = names32;
14883
14884       havesib = 0;
14885       havebase = 1;
14886       haveindex = 0;
14887       base = modrm.rm;
14888
14889       if (base == 4)
14890         {
14891           havesib = 1;
14892           vindex = sib.index;
14893           USED_REX (REX_X);
14894           if (rex & REX_X)
14895             vindex += 8;
14896           switch (bytemode)
14897             {
14898             case vex_vsib_d_w_dq_mode:
14899             case vex_vsib_d_w_d_mode:
14900             case vex_vsib_q_w_dq_mode:
14901             case vex_vsib_q_w_d_mode:
14902               if (!need_vex)
14903                 abort ();
14904               if (vex.evex)
14905                 {
14906                   if (!vex.v)
14907                     vindex += 16;
14908                 }
14909
14910               haveindex = 1;
14911               switch (vex.length)
14912                 {
14913                 case 128:
14914                   indexes64 = indexes32 = names_xmm;
14915                   break;
14916                 case 256:
14917                   if (!vex.w
14918                       || bytemode == vex_vsib_q_w_dq_mode
14919                       || bytemode == vex_vsib_q_w_d_mode)
14920                     indexes64 = indexes32 = names_ymm;
14921                   else
14922                     indexes64 = indexes32 = names_xmm;
14923                   break;
14924                 case 512:
14925                   if (!vex.w
14926                       || bytemode == vex_vsib_q_w_dq_mode
14927                       || bytemode == vex_vsib_q_w_d_mode)
14928                     indexes64 = indexes32 = names_zmm;
14929                   else
14930                     indexes64 = indexes32 = names_ymm;
14931                   break;
14932                 default:
14933                   abort ();
14934                 }
14935               break;
14936             default:
14937               haveindex = vindex != 4;
14938               break;
14939             }
14940           scale = sib.scale;
14941           base = sib.base;
14942           codep++;
14943         }
14944       rbase = base + add;
14945
14946       switch (modrm.mod)
14947         {
14948         case 0:
14949           if (base == 5)
14950             {
14951               havebase = 0;
14952               if (address_mode == mode_64bit && !havesib)
14953                 riprel = 1;
14954               disp = get32s ();
14955             }
14956           break;
14957         case 1:
14958           FETCH_DATA (the_info, codep + 1);
14959           disp = *codep++;
14960           if ((disp & 0x80) != 0)
14961             disp -= 0x100;
14962           if (vex.evex && shift > 0)
14963             disp <<= shift;
14964           break;
14965         case 2:
14966           disp = get32s ();
14967           break;
14968         }
14969
14970       /* In 32bit mode, we need index register to tell [offset] from
14971          [eiz*1 + offset].  */
14972       needindex = (havesib
14973                    && !havebase
14974                    && !haveindex
14975                    && address_mode == mode_32bit);
14976       havedisp = (havebase
14977                   || needindex
14978                   || (havesib && (haveindex || scale != 0)));
14979
14980       if (!intel_syntax)
14981         if (modrm.mod != 0 || base == 5)
14982           {
14983             if (havedisp || riprel)
14984               print_displacement (scratchbuf, disp);
14985             else
14986               print_operand_value (scratchbuf, 1, disp);
14987             oappend (scratchbuf);
14988             if (riprel)
14989               {
14990                 set_op (disp, 1);
14991                 oappend (sizeflag & AFLAG ? "(%rip)" : "(%eip)");
14992               }
14993           }
14994
14995       if ((havebase || haveindex || riprel)
14996           && (bytemode != v_bnd_mode)
14997           && (bytemode != bnd_mode))
14998         used_prefixes |= PREFIX_ADDR;
14999
15000       if (havedisp || (intel_syntax && riprel))
15001         {
15002           *obufp++ = open_char;
15003           if (intel_syntax && riprel)
15004             {
15005               set_op (disp, 1);
15006               oappend (sizeflag & AFLAG ? "rip" : "eip");
15007             }
15008           *obufp = '\0';
15009           if (havebase)
15010             oappend (address_mode == mode_64bit && !addr32flag
15011                      ? names64[rbase] : names32[rbase]);
15012           if (havesib)
15013             {
15014               /* ESP/RSP won't allow index.  If base isn't ESP/RSP,
15015                  print index to tell base + index from base.  */
15016               if (scale != 0
15017                   || needindex
15018                   || haveindex
15019                   || (havebase && base != ESP_REG_NUM))
15020                 {
15021                   if (!intel_syntax || havebase)
15022                     {
15023                       *obufp++ = separator_char;
15024                       *obufp = '\0';
15025                     }
15026                   if (haveindex)
15027                     oappend (address_mode == mode_64bit && !addr32flag
15028                              ? indexes64[vindex] : indexes32[vindex]);
15029                   else
15030                     oappend (address_mode == mode_64bit && !addr32flag
15031                              ? index64 : index32);
15032
15033                   *obufp++ = scale_char;
15034                   *obufp = '\0';
15035                   sprintf (scratchbuf, "%d", 1 << scale);
15036                   oappend (scratchbuf);
15037                 }
15038             }
15039           if (intel_syntax
15040               && (disp || modrm.mod != 0 || base == 5))
15041             {
15042               if (!havedisp || (bfd_signed_vma) disp >= 0)
15043                 {
15044                   *obufp++ = '+';
15045                   *obufp = '\0';
15046                 }
15047               else if (modrm.mod != 1 && disp != -disp)
15048                 {
15049                   *obufp++ = '-';
15050                   *obufp = '\0';
15051                   disp = - (bfd_signed_vma) disp;
15052                 }
15053
15054               if (havedisp)
15055                 print_displacement (scratchbuf, disp);
15056               else
15057                 print_operand_value (scratchbuf, 1, disp);
15058               oappend (scratchbuf);
15059             }
15060
15061           *obufp++ = close_char;
15062           *obufp = '\0';
15063         }
15064       else if (intel_syntax)
15065         {
15066           if (modrm.mod != 0 || base == 5)
15067             {
15068               if (!active_seg_prefix)
15069                 {
15070                   oappend (names_seg[ds_reg - es_reg]);
15071                   oappend (":");
15072                 }
15073               print_operand_value (scratchbuf, 1, disp);
15074               oappend (scratchbuf);
15075             }
15076         }
15077     }
15078   else
15079     {
15080       /* 16 bit address mode */
15081       used_prefixes |= prefixes & PREFIX_ADDR;
15082       switch (modrm.mod)
15083         {
15084         case 0:
15085           if (modrm.rm == 6)
15086             {
15087               disp = get16 ();
15088               if ((disp & 0x8000) != 0)
15089                 disp -= 0x10000;
15090             }
15091           break;
15092         case 1:
15093           FETCH_DATA (the_info, codep + 1);
15094           disp = *codep++;
15095           if ((disp & 0x80) != 0)
15096             disp -= 0x100;
15097           break;
15098         case 2:
15099           disp = get16 ();
15100           if ((disp & 0x8000) != 0)
15101             disp -= 0x10000;
15102           break;
15103         }
15104
15105       if (!intel_syntax)
15106         if (modrm.mod != 0 || modrm.rm == 6)
15107           {
15108             print_displacement (scratchbuf, disp);
15109             oappend (scratchbuf);
15110           }
15111
15112       if (modrm.mod != 0 || modrm.rm != 6)
15113         {
15114           *obufp++ = open_char;
15115           *obufp = '\0';
15116           oappend (index16[modrm.rm]);
15117           if (intel_syntax
15118               && (disp || modrm.mod != 0 || modrm.rm == 6))
15119             {
15120               if ((bfd_signed_vma) disp >= 0)
15121                 {
15122                   *obufp++ = '+';
15123                   *obufp = '\0';
15124                 }
15125               else if (modrm.mod != 1)
15126                 {
15127                   *obufp++ = '-';
15128                   *obufp = '\0';
15129                   disp = - (bfd_signed_vma) disp;
15130                 }
15131
15132               print_displacement (scratchbuf, disp);
15133               oappend (scratchbuf);
15134             }
15135
15136           *obufp++ = close_char;
15137           *obufp = '\0';
15138         }
15139       else if (intel_syntax)
15140         {
15141           if (!active_seg_prefix)
15142             {
15143               oappend (names_seg[ds_reg - es_reg]);
15144               oappend (":");
15145             }
15146           print_operand_value (scratchbuf, 1, disp & 0xffff);
15147           oappend (scratchbuf);
15148         }
15149     }
15150   if (vex.evex && vex.b
15151       && (bytemode == x_mode
15152           || bytemode == xmmq_mode
15153           || bytemode == evex_half_bcst_xmmq_mode))
15154     {
15155       if (vex.w
15156           || bytemode == xmmq_mode
15157           || bytemode == evex_half_bcst_xmmq_mode)
15158         {
15159           switch (vex.length)
15160             {
15161             case 128:
15162               oappend ("{1to2}");
15163               break;
15164             case 256:
15165               oappend ("{1to4}");
15166               break;
15167             case 512:
15168               oappend ("{1to8}");
15169               break;
15170             default:
15171               abort ();
15172             }
15173         }
15174       else
15175         {
15176           switch (vex.length)
15177             {
15178             case 128:
15179               oappend ("{1to4}");
15180               break;
15181             case 256:
15182               oappend ("{1to8}");
15183               break;
15184             case 512:
15185               oappend ("{1to16}");
15186               break;
15187             default:
15188               abort ();
15189             }
15190         }
15191     }
15192 }
15193
15194 static void
15195 OP_E (int bytemode, int sizeflag)
15196 {
15197   /* Skip mod/rm byte.  */
15198   MODRM_CHECK;
15199   codep++;
15200
15201   if (modrm.mod == 3)
15202     OP_E_register (bytemode, sizeflag);
15203   else
15204     OP_E_memory (bytemode, sizeflag);
15205 }
15206
15207 static void
15208 OP_G (int bytemode, int sizeflag)
15209 {
15210   int add = 0;
15211   USED_REX (REX_R);
15212   if (rex & REX_R)
15213     add += 8;
15214   switch (bytemode)
15215     {
15216     case b_mode:
15217       USED_REX (0);
15218       if (rex)
15219         oappend (names8rex[modrm.reg + add]);
15220       else
15221         oappend (names8[modrm.reg + add]);
15222       break;
15223     case w_mode:
15224       oappend (names16[modrm.reg + add]);
15225       break;
15226     case d_mode:
15227     case db_mode:
15228     case dw_mode:
15229       oappend (names32[modrm.reg + add]);
15230       break;
15231     case q_mode:
15232       oappend (names64[modrm.reg + add]);
15233       break;
15234     case bnd_mode:
15235       oappend (names_bnd[modrm.reg]);
15236       break;
15237     case v_mode:
15238     case dq_mode:
15239     case dqb_mode:
15240     case dqd_mode:
15241     case dqw_mode:
15242     case dqw_swap_mode:
15243       USED_REX (REX_W);
15244       if (rex & REX_W)
15245         oappend (names64[modrm.reg + add]);
15246       else
15247         {
15248           if ((sizeflag & DFLAG) || bytemode != v_mode)
15249             oappend (names32[modrm.reg + add]);
15250           else
15251             oappend (names16[modrm.reg + add]);
15252           used_prefixes |= (prefixes & PREFIX_DATA);
15253         }
15254       break;
15255     case m_mode:
15256       if (address_mode == mode_64bit)
15257         oappend (names64[modrm.reg + add]);
15258       else
15259         oappend (names32[modrm.reg + add]);
15260       break;
15261     case mask_bd_mode:
15262     case mask_mode:
15263       oappend (names_mask[modrm.reg + add]);
15264       break;
15265     default:
15266       oappend (INTERNAL_DISASSEMBLER_ERROR);
15267       break;
15268     }
15269 }
15270
15271 static bfd_vma
15272 get64 (void)
15273 {
15274   bfd_vma x;
15275 #ifdef BFD64
15276   unsigned int a;
15277   unsigned int b;
15278
15279   FETCH_DATA (the_info, codep + 8);
15280   a = *codep++ & 0xff;
15281   a |= (*codep++ & 0xff) << 8;
15282   a |= (*codep++ & 0xff) << 16;
15283   a |= (*codep++ & 0xff) << 24;
15284   b = *codep++ & 0xff;
15285   b |= (*codep++ & 0xff) << 8;
15286   b |= (*codep++ & 0xff) << 16;
15287   b |= (*codep++ & 0xff) << 24;
15288   x = a + ((bfd_vma) b << 32);
15289 #else
15290   abort ();
15291   x = 0;
15292 #endif
15293   return x;
15294 }
15295
15296 static bfd_signed_vma
15297 get32 (void)
15298 {
15299   bfd_signed_vma x = 0;
15300
15301   FETCH_DATA (the_info, codep + 4);
15302   x = *codep++ & (bfd_signed_vma) 0xff;
15303   x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
15304   x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
15305   x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
15306   return x;
15307 }
15308
15309 static bfd_signed_vma
15310 get32s (void)
15311 {
15312   bfd_signed_vma x = 0;
15313
15314   FETCH_DATA (the_info, codep + 4);
15315   x = *codep++ & (bfd_signed_vma) 0xff;
15316   x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
15317   x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
15318   x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
15319
15320   x = (x ^ ((bfd_signed_vma) 1 << 31)) - ((bfd_signed_vma) 1 << 31);
15321
15322   return x;
15323 }
15324
15325 static int
15326 get16 (void)
15327 {
15328   int x = 0;
15329
15330   FETCH_DATA (the_info, codep + 2);
15331   x = *codep++ & 0xff;
15332   x |= (*codep++ & 0xff) << 8;
15333   return x;
15334 }
15335
15336 static void
15337 set_op (bfd_vma op, int riprel)
15338 {
15339   op_index[op_ad] = op_ad;
15340   if (address_mode == mode_64bit)
15341     {
15342       op_address[op_ad] = op;
15343       op_riprel[op_ad] = riprel;
15344     }
15345   else
15346     {
15347       /* Mask to get a 32-bit address.  */
15348       op_address[op_ad] = op & 0xffffffff;
15349       op_riprel[op_ad] = riprel & 0xffffffff;
15350     }
15351 }
15352
15353 static void
15354 OP_REG (int code, int sizeflag)
15355 {
15356   const char *s;
15357   int add;
15358
15359   switch (code)
15360     {
15361     case es_reg: case ss_reg: case cs_reg:
15362     case ds_reg: case fs_reg: case gs_reg:
15363       oappend (names_seg[code - es_reg]);
15364       return;
15365     }
15366
15367   USED_REX (REX_B);
15368   if (rex & REX_B)
15369     add = 8;
15370   else
15371     add = 0;
15372
15373   switch (code)
15374     {
15375     case ax_reg: case cx_reg: case dx_reg: case bx_reg:
15376     case sp_reg: case bp_reg: case si_reg: case di_reg:
15377       s = names16[code - ax_reg + add];
15378       break;
15379     case al_reg: case ah_reg: case cl_reg: case ch_reg:
15380     case dl_reg: case dh_reg: case bl_reg: case bh_reg:
15381       USED_REX (0);
15382       if (rex)
15383         s = names8rex[code - al_reg + add];
15384       else
15385         s = names8[code - al_reg];
15386       break;
15387     case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
15388     case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
15389       if (address_mode == mode_64bit
15390           && ((sizeflag & DFLAG) || (rex & REX_W)))
15391         {
15392           s = names64[code - rAX_reg + add];
15393           break;
15394         }
15395       code += eAX_reg - rAX_reg;
15396       /* Fall through.  */
15397     case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
15398     case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
15399       USED_REX (REX_W);
15400       if (rex & REX_W)
15401         s = names64[code - eAX_reg + add];
15402       else
15403         {
15404           if (sizeflag & DFLAG)
15405             s = names32[code - eAX_reg + add];
15406           else
15407             s = names16[code - eAX_reg + add];
15408           used_prefixes |= (prefixes & PREFIX_DATA);
15409         }
15410       break;
15411     default:
15412       s = INTERNAL_DISASSEMBLER_ERROR;
15413       break;
15414     }
15415   oappend (s);
15416 }
15417
15418 static void
15419 OP_IMREG (int code, int sizeflag)
15420 {
15421   const char *s;
15422
15423   switch (code)
15424     {
15425     case indir_dx_reg:
15426       if (intel_syntax)
15427         s = "dx";
15428       else
15429         s = "(%dx)";
15430       break;
15431     case ax_reg: case cx_reg: case dx_reg: case bx_reg:
15432     case sp_reg: case bp_reg: case si_reg: case di_reg:
15433       s = names16[code - ax_reg];
15434       break;
15435     case es_reg: case ss_reg: case cs_reg:
15436     case ds_reg: case fs_reg: case gs_reg:
15437       s = names_seg[code - es_reg];
15438       break;
15439     case al_reg: case ah_reg: case cl_reg: case ch_reg:
15440     case dl_reg: case dh_reg: case bl_reg: case bh_reg:
15441       USED_REX (0);
15442       if (rex)
15443         s = names8rex[code - al_reg];
15444       else
15445         s = names8[code - al_reg];
15446       break;
15447     case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
15448     case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
15449       USED_REX (REX_W);
15450       if (rex & REX_W)
15451         s = names64[code - eAX_reg];
15452       else
15453         {
15454           if (sizeflag & DFLAG)
15455             s = names32[code - eAX_reg];
15456           else
15457             s = names16[code - eAX_reg];
15458           used_prefixes |= (prefixes & PREFIX_DATA);
15459         }
15460       break;
15461     case z_mode_ax_reg:
15462       if ((rex & REX_W) || (sizeflag & DFLAG))
15463         s = *names32;
15464       else
15465         s = *names16;
15466       if (!(rex & REX_W))
15467         used_prefixes |= (prefixes & PREFIX_DATA);
15468       break;
15469     default:
15470       s = INTERNAL_DISASSEMBLER_ERROR;
15471       break;
15472     }
15473   oappend (s);
15474 }
15475
15476 static void
15477 OP_I (int bytemode, int sizeflag)
15478 {
15479   bfd_signed_vma op;
15480   bfd_signed_vma mask = -1;
15481
15482   switch (bytemode)
15483     {
15484     case b_mode:
15485       FETCH_DATA (the_info, codep + 1);
15486       op = *codep++;
15487       mask = 0xff;
15488       break;
15489     case q_mode:
15490       if (address_mode == mode_64bit)
15491         {
15492           op = get32s ();
15493           break;
15494         }
15495       /* Fall through.  */
15496     case v_mode:
15497       USED_REX (REX_W);
15498       if (rex & REX_W)
15499         op = get32s ();
15500       else
15501         {
15502           if (sizeflag & DFLAG)
15503             {
15504               op = get32 ();
15505               mask = 0xffffffff;
15506             }
15507           else
15508             {
15509               op = get16 ();
15510               mask = 0xfffff;
15511             }
15512           used_prefixes |= (prefixes & PREFIX_DATA);
15513         }
15514       break;
15515     case w_mode:
15516       mask = 0xfffff;
15517       op = get16 ();
15518       break;
15519     case const_1_mode:
15520       if (intel_syntax)
15521         oappend ("1");
15522       return;
15523     default:
15524       oappend (INTERNAL_DISASSEMBLER_ERROR);
15525       return;
15526     }
15527
15528   op &= mask;
15529   scratchbuf[0] = '$';
15530   print_operand_value (scratchbuf + 1, 1, op);
15531   oappend_maybe_intel (scratchbuf);
15532   scratchbuf[0] = '\0';
15533 }
15534
15535 static void
15536 OP_I64 (int bytemode, int sizeflag)
15537 {
15538   bfd_signed_vma op;
15539   bfd_signed_vma mask = -1;
15540
15541   if (address_mode != mode_64bit)
15542     {
15543       OP_I (bytemode, sizeflag);
15544       return;
15545     }
15546
15547   switch (bytemode)
15548     {
15549     case b_mode:
15550       FETCH_DATA (the_info, codep + 1);
15551       op = *codep++;
15552       mask = 0xff;
15553       break;
15554     case v_mode:
15555       USED_REX (REX_W);
15556       if (rex & REX_W)
15557         op = get64 ();
15558       else
15559         {
15560           if (sizeflag & DFLAG)
15561             {
15562               op = get32 ();
15563               mask = 0xffffffff;
15564             }
15565           else
15566             {
15567               op = get16 ();
15568               mask = 0xfffff;
15569             }
15570           used_prefixes |= (prefixes & PREFIX_DATA);
15571         }
15572       break;
15573     case w_mode:
15574       mask = 0xfffff;
15575       op = get16 ();
15576       break;
15577     default:
15578       oappend (INTERNAL_DISASSEMBLER_ERROR);
15579       return;
15580     }
15581
15582   op &= mask;
15583   scratchbuf[0] = '$';
15584   print_operand_value (scratchbuf + 1, 1, op);
15585   oappend_maybe_intel (scratchbuf);
15586   scratchbuf[0] = '\0';
15587 }
15588
15589 static void
15590 OP_sI (int bytemode, int sizeflag)
15591 {
15592   bfd_signed_vma op;
15593
15594   switch (bytemode)
15595     {
15596     case b_mode:
15597     case b_T_mode:
15598       FETCH_DATA (the_info, codep + 1);
15599       op = *codep++;
15600       if ((op & 0x80) != 0)
15601         op -= 0x100;
15602       if (bytemode == b_T_mode)
15603         {
15604           if (address_mode != mode_64bit
15605               || !((sizeflag & DFLAG) || (rex & REX_W)))
15606             {
15607               /* The operand-size prefix is overridden by a REX prefix.  */
15608               if ((sizeflag & DFLAG) || (rex & REX_W))
15609                 op &= 0xffffffff;
15610               else
15611                 op &= 0xffff;
15612           }
15613         }
15614       else
15615         {
15616           if (!(rex & REX_W))
15617             {
15618               if (sizeflag & DFLAG)
15619                 op &= 0xffffffff;
15620               else
15621                 op &= 0xffff;
15622             }
15623         }
15624       break;
15625     case v_mode:
15626       /* The operand-size prefix is overridden by a REX prefix.  */
15627       if ((sizeflag & DFLAG) || (rex & REX_W))
15628         op = get32s ();
15629       else
15630         op = get16 ();
15631       break;
15632     default:
15633       oappend (INTERNAL_DISASSEMBLER_ERROR);
15634       return;
15635     }
15636
15637   scratchbuf[0] = '$';
15638   print_operand_value (scratchbuf + 1, 1, op);
15639   oappend_maybe_intel (scratchbuf);
15640 }
15641
15642 static void
15643 OP_J (int bytemode, int sizeflag)
15644 {
15645   bfd_vma disp;
15646   bfd_vma mask = -1;
15647   bfd_vma segment = 0;
15648
15649   switch (bytemode)
15650     {
15651     case b_mode:
15652       FETCH_DATA (the_info, codep + 1);
15653       disp = *codep++;
15654       if ((disp & 0x80) != 0)
15655         disp -= 0x100;
15656       break;
15657     case v_mode:
15658       USED_REX (REX_W);
15659       if ((sizeflag & DFLAG) || (rex & REX_W))
15660         disp = get32s ();
15661       else
15662         {
15663           disp = get16 ();
15664           if ((disp & 0x8000) != 0)
15665             disp -= 0x10000;
15666           /* In 16bit mode, address is wrapped around at 64k within
15667              the same segment.  Otherwise, a data16 prefix on a jump
15668              instruction means that the pc is masked to 16 bits after
15669              the displacement is added!  */
15670           mask = 0xffff;
15671           if ((prefixes & PREFIX_DATA) == 0)
15672             segment = ((start_pc + codep - start_codep)
15673                        & ~((bfd_vma) 0xffff));
15674         }
15675       if (!(rex & REX_W))
15676         used_prefixes |= (prefixes & PREFIX_DATA);
15677       break;
15678     default:
15679       oappend (INTERNAL_DISASSEMBLER_ERROR);
15680       return;
15681     }
15682   disp = ((start_pc + (codep - start_codep) + disp) & mask) | segment;
15683   set_op (disp, 0);
15684   print_operand_value (scratchbuf, 1, disp);
15685   oappend (scratchbuf);
15686 }
15687
15688 static void
15689 OP_SEG (int bytemode, int sizeflag)
15690 {
15691   if (bytemode == w_mode)
15692     oappend (names_seg[modrm.reg]);
15693   else
15694     OP_E (modrm.mod == 3 ? bytemode : w_mode, sizeflag);
15695 }
15696
15697 static void
15698 OP_DIR (int dummy ATTRIBUTE_UNUSED, int sizeflag)
15699 {
15700   int seg, offset;
15701
15702   if (sizeflag & DFLAG)
15703     {
15704       offset = get32 ();
15705       seg = get16 ();
15706     }
15707   else
15708     {
15709       offset = get16 ();
15710       seg = get16 ();
15711     }
15712   used_prefixes |= (prefixes & PREFIX_DATA);
15713   if (intel_syntax)
15714     sprintf (scratchbuf, "0x%x:0x%x", seg, offset);
15715   else
15716     sprintf (scratchbuf, "$0x%x,$0x%x", seg, offset);
15717   oappend (scratchbuf);
15718 }
15719
15720 static void
15721 OP_OFF (int bytemode, int sizeflag)
15722 {
15723   bfd_vma off;
15724
15725   if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
15726     intel_operand_size (bytemode, sizeflag);
15727   append_seg ();
15728
15729   if ((sizeflag & AFLAG) || address_mode == mode_64bit)
15730     off = get32 ();
15731   else
15732     off = get16 ();
15733
15734   if (intel_syntax)
15735     {
15736       if (!active_seg_prefix)
15737         {
15738           oappend (names_seg[ds_reg - es_reg]);
15739           oappend (":");
15740         }
15741     }
15742   print_operand_value (scratchbuf, 1, off);
15743   oappend (scratchbuf);
15744 }
15745
15746 static void
15747 OP_OFF64 (int bytemode, int sizeflag)
15748 {
15749   bfd_vma off;
15750
15751   if (address_mode != mode_64bit
15752       || (prefixes & PREFIX_ADDR))
15753     {
15754       OP_OFF (bytemode, sizeflag);
15755       return;
15756     }
15757
15758   if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
15759     intel_operand_size (bytemode, sizeflag);
15760   append_seg ();
15761
15762   off = get64 ();
15763
15764   if (intel_syntax)
15765     {
15766       if (!active_seg_prefix)
15767         {
15768           oappend (names_seg[ds_reg - es_reg]);
15769           oappend (":");
15770         }
15771     }
15772   print_operand_value (scratchbuf, 1, off);
15773   oappend (scratchbuf);
15774 }
15775
15776 static void
15777 ptr_reg (int code, int sizeflag)
15778 {
15779   const char *s;
15780
15781   *obufp++ = open_char;
15782   used_prefixes |= (prefixes & PREFIX_ADDR);
15783   if (address_mode == mode_64bit)
15784     {
15785       if (!(sizeflag & AFLAG))
15786         s = names32[code - eAX_reg];
15787       else
15788         s = names64[code - eAX_reg];
15789     }
15790   else if (sizeflag & AFLAG)
15791     s = names32[code - eAX_reg];
15792   else
15793     s = names16[code - eAX_reg];
15794   oappend (s);
15795   *obufp++ = close_char;
15796   *obufp = 0;
15797 }
15798
15799 static void
15800 OP_ESreg (int code, int sizeflag)
15801 {
15802   if (intel_syntax)
15803     {
15804       switch (codep[-1])
15805         {
15806         case 0x6d:      /* insw/insl */
15807           intel_operand_size (z_mode, sizeflag);
15808           break;
15809         case 0xa5:      /* movsw/movsl/movsq */
15810         case 0xa7:      /* cmpsw/cmpsl/cmpsq */
15811         case 0xab:      /* stosw/stosl */
15812         case 0xaf:      /* scasw/scasl */
15813           intel_operand_size (v_mode, sizeflag);
15814           break;
15815         default:
15816           intel_operand_size (b_mode, sizeflag);
15817         }
15818     }
15819   oappend_maybe_intel ("%es:");
15820   ptr_reg (code, sizeflag);
15821 }
15822
15823 static void
15824 OP_DSreg (int code, int sizeflag)
15825 {
15826   if (intel_syntax)
15827     {
15828       switch (codep[-1])
15829         {
15830         case 0x6f:      /* outsw/outsl */
15831           intel_operand_size (z_mode, sizeflag);
15832           break;
15833         case 0xa5:      /* movsw/movsl/movsq */
15834         case 0xa7:      /* cmpsw/cmpsl/cmpsq */
15835         case 0xad:      /* lodsw/lodsl/lodsq */
15836           intel_operand_size (v_mode, sizeflag);
15837           break;
15838         default:
15839           intel_operand_size (b_mode, sizeflag);
15840         }
15841     }
15842   /* Set active_seg_prefix to PREFIX_DS if it is unset so that the
15843      default segment register DS is printed.  */
15844   if (!active_seg_prefix)
15845     active_seg_prefix = PREFIX_DS;
15846   append_seg ();
15847   ptr_reg (code, sizeflag);
15848 }
15849
15850 static void
15851 OP_C (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15852 {
15853   int add;
15854   if (rex & REX_R)
15855     {
15856       USED_REX (REX_R);
15857       add = 8;
15858     }
15859   else if (address_mode != mode_64bit && (prefixes & PREFIX_LOCK))
15860     {
15861       all_prefixes[last_lock_prefix] = 0;
15862       used_prefixes |= PREFIX_LOCK;
15863       add = 8;
15864     }
15865   else
15866     add = 0;
15867   sprintf (scratchbuf, "%%cr%d", modrm.reg + add);
15868   oappend_maybe_intel (scratchbuf);
15869 }
15870
15871 static void
15872 OP_D (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15873 {
15874   int add;
15875   USED_REX (REX_R);
15876   if (rex & REX_R)
15877     add = 8;
15878   else
15879     add = 0;
15880   if (intel_syntax)
15881     sprintf (scratchbuf, "db%d", modrm.reg + add);
15882   else
15883     sprintf (scratchbuf, "%%db%d", modrm.reg + add);
15884   oappend (scratchbuf);
15885 }
15886
15887 static void
15888 OP_T (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15889 {
15890   sprintf (scratchbuf, "%%tr%d", modrm.reg);
15891   oappend_maybe_intel (scratchbuf);
15892 }
15893
15894 static void
15895 OP_R (int bytemode, int sizeflag)
15896 {
15897   /* Skip mod/rm byte.  */
15898   MODRM_CHECK;
15899   codep++;
15900   OP_E_register (bytemode, sizeflag);
15901 }
15902
15903 static void
15904 OP_MMX (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15905 {
15906   int reg = modrm.reg;
15907   const char **names;
15908
15909   used_prefixes |= (prefixes & PREFIX_DATA);
15910   if (prefixes & PREFIX_DATA)
15911     {
15912       names = names_xmm;
15913       USED_REX (REX_R);
15914       if (rex & REX_R)
15915         reg += 8;
15916     }
15917   else
15918     names = names_mm;
15919   oappend (names[reg]);
15920 }
15921
15922 static void
15923 OP_XMM (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
15924 {
15925   int reg = modrm.reg;
15926   const char **names;
15927
15928   USED_REX (REX_R);
15929   if (rex & REX_R)
15930     reg += 8;
15931   if (vex.evex)
15932     {
15933       if (!vex.r)
15934         reg += 16;
15935     }
15936
15937   if (need_vex
15938       && bytemode != xmm_mode
15939       && bytemode != xmmq_mode
15940       && bytemode != evex_half_bcst_xmmq_mode
15941       && bytemode != ymm_mode
15942       && bytemode != scalar_mode)
15943     {
15944       switch (vex.length)
15945         {
15946         case 128:
15947           names = names_xmm;
15948           break;
15949         case 256:
15950           if (vex.w
15951               || (bytemode != vex_vsib_q_w_dq_mode
15952                   && bytemode != vex_vsib_q_w_d_mode))
15953             names = names_ymm;
15954           else
15955             names = names_xmm;
15956           break;
15957         case 512:
15958           names = names_zmm;
15959           break;
15960         default:
15961           abort ();
15962         }
15963     }
15964   else if (bytemode == xmmq_mode
15965            || bytemode == evex_half_bcst_xmmq_mode)
15966     {
15967       switch (vex.length)
15968         {
15969         case 128:
15970         case 256:
15971           names = names_xmm;
15972           break;
15973         case 512:
15974           names = names_ymm;
15975           break;
15976         default:
15977           abort ();
15978         }
15979     }
15980   else if (bytemode == ymm_mode)
15981     names = names_ymm;
15982   else
15983     names = names_xmm;
15984   oappend (names[reg]);
15985 }
15986
15987 static void
15988 OP_EM (int bytemode, int sizeflag)
15989 {
15990   int reg;
15991   const char **names;
15992
15993   if (modrm.mod != 3)
15994     {
15995       if (intel_syntax
15996           && (bytemode == v_mode || bytemode == v_swap_mode))
15997         {
15998           bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
15999           used_prefixes |= (prefixes & PREFIX_DATA);
16000         }
16001       OP_E (bytemode, sizeflag);
16002       return;
16003     }
16004
16005   if ((sizeflag & SUFFIX_ALWAYS) && bytemode == v_swap_mode)
16006     swap_operand ();
16007
16008   /* Skip mod/rm byte.  */
16009   MODRM_CHECK;
16010   codep++;
16011   used_prefixes |= (prefixes & PREFIX_DATA);
16012   reg = modrm.rm;
16013   if (prefixes & PREFIX_DATA)
16014     {
16015       names = names_xmm;
16016       USED_REX (REX_B);
16017       if (rex & REX_B)
16018         reg += 8;
16019     }
16020   else
16021     names = names_mm;
16022   oappend (names[reg]);
16023 }
16024
16025 /* cvt* are the only instructions in sse2 which have
16026    both SSE and MMX operands and also have 0x66 prefix
16027    in their opcode. 0x66 was originally used to differentiate
16028    between SSE and MMX instruction(operands). So we have to handle the
16029    cvt* separately using OP_EMC and OP_MXC */
16030 static void
16031 OP_EMC (int bytemode, int sizeflag)
16032 {
16033   if (modrm.mod != 3)
16034     {
16035       if (intel_syntax && bytemode == v_mode)
16036         {
16037           bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
16038           used_prefixes |= (prefixes & PREFIX_DATA);
16039         }
16040       OP_E (bytemode, sizeflag);
16041       return;
16042     }
16043
16044   /* Skip mod/rm byte.  */
16045   MODRM_CHECK;
16046   codep++;
16047   used_prefixes |= (prefixes & PREFIX_DATA);
16048   oappend (names_mm[modrm.rm]);
16049 }
16050
16051 static void
16052 OP_MXC (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
16053 {
16054   used_prefixes |= (prefixes & PREFIX_DATA);
16055   oappend (names_mm[modrm.reg]);
16056 }
16057
16058 static void
16059 OP_EX (int bytemode, int sizeflag)
16060 {
16061   int reg;
16062   const char **names;
16063
16064   /* Skip mod/rm byte.  */
16065   MODRM_CHECK;
16066   codep++;
16067
16068   if (modrm.mod != 3)
16069     {
16070       OP_E_memory (bytemode, sizeflag);
16071       return;
16072     }
16073
16074   reg = modrm.rm;
16075   USED_REX (REX_B);
16076   if (rex & REX_B)
16077     reg += 8;
16078   if (vex.evex)
16079     {
16080       USED_REX (REX_X);
16081       if ((rex & REX_X))
16082         reg += 16;
16083     }
16084
16085   if ((sizeflag & SUFFIX_ALWAYS)
16086       && (bytemode == x_swap_mode
16087           || bytemode == d_swap_mode
16088           || bytemode == dqw_swap_mode
16089           || bytemode == d_scalar_swap_mode
16090           || bytemode == q_swap_mode
16091           || bytemode == q_scalar_swap_mode))
16092     swap_operand ();
16093
16094   if (need_vex
16095       && bytemode != xmm_mode
16096       && bytemode != xmmdw_mode
16097       && bytemode != xmmqd_mode
16098       && bytemode != xmm_mb_mode
16099       && bytemode != xmm_mw_mode
16100       && bytemode != xmm_md_mode
16101       && bytemode != xmm_mq_mode
16102       && bytemode != xmm_mdq_mode
16103       && bytemode != xmmq_mode
16104       && bytemode != evex_half_bcst_xmmq_mode
16105       && bytemode != ymm_mode
16106       && bytemode != d_scalar_mode
16107       && bytemode != d_scalar_swap_mode
16108       && bytemode != q_scalar_mode
16109       && bytemode != q_scalar_swap_mode
16110       && bytemode != vex_scalar_w_dq_mode)
16111     {
16112       switch (vex.length)
16113         {
16114         case 128:
16115           names = names_xmm;
16116           break;
16117         case 256:
16118           names = names_ymm;
16119           break;
16120         case 512:
16121           names = names_zmm;
16122           break;
16123         default:
16124           abort ();
16125         }
16126     }
16127   else if (bytemode == xmmq_mode
16128            || bytemode == evex_half_bcst_xmmq_mode)
16129     {
16130       switch (vex.length)
16131         {
16132         case 128:
16133         case 256:
16134           names = names_xmm;
16135           break;
16136         case 512:
16137           names = names_ymm;
16138           break;
16139         default:
16140           abort ();
16141         }
16142     }
16143   else if (bytemode == ymm_mode)
16144     names = names_ymm;
16145   else
16146     names = names_xmm;
16147   oappend (names[reg]);
16148 }
16149
16150 static void
16151 OP_MS (int bytemode, int sizeflag)
16152 {
16153   if (modrm.mod == 3)
16154     OP_EM (bytemode, sizeflag);
16155   else
16156     BadOp ();
16157 }
16158
16159 static void
16160 OP_XS (int bytemode, int sizeflag)
16161 {
16162   if (modrm.mod == 3)
16163     OP_EX (bytemode, sizeflag);
16164   else
16165     BadOp ();
16166 }
16167
16168 static void
16169 OP_M (int bytemode, int sizeflag)
16170 {
16171   if (modrm.mod == 3)
16172     /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
16173     BadOp ();
16174   else
16175     OP_E (bytemode, sizeflag);
16176 }
16177
16178 static void
16179 OP_0f07 (int bytemode, int sizeflag)
16180 {
16181   if (modrm.mod != 3 || modrm.rm != 0)
16182     BadOp ();
16183   else
16184     OP_E (bytemode, sizeflag);
16185 }
16186
16187 /* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
16188    32bit mode and "xchg %rax,%rax" in 64bit mode.  */
16189
16190 static void
16191 NOP_Fixup1 (int bytemode, int sizeflag)
16192 {
16193   if ((prefixes & PREFIX_DATA) != 0
16194       || (rex != 0
16195           && rex != 0x48
16196           && address_mode == mode_64bit))
16197     OP_REG (bytemode, sizeflag);
16198   else
16199     strcpy (obuf, "nop");
16200 }
16201
16202 static void
16203 NOP_Fixup2 (int bytemode, int sizeflag)
16204 {
16205   if ((prefixes & PREFIX_DATA) != 0
16206       || (rex != 0
16207           && rex != 0x48
16208           && address_mode == mode_64bit))
16209     OP_IMREG (bytemode, sizeflag);
16210 }
16211
16212 static const char *const Suffix3DNow[] = {
16213 /* 00 */        NULL,           NULL,           NULL,           NULL,
16214 /* 04 */        NULL,           NULL,           NULL,           NULL,
16215 /* 08 */        NULL,           NULL,           NULL,           NULL,
16216 /* 0C */        "pi2fw",        "pi2fd",        NULL,           NULL,
16217 /* 10 */        NULL,           NULL,           NULL,           NULL,
16218 /* 14 */        NULL,           NULL,           NULL,           NULL,
16219 /* 18 */        NULL,           NULL,           NULL,           NULL,
16220 /* 1C */        "pf2iw",        "pf2id",        NULL,           NULL,
16221 /* 20 */        NULL,           NULL,           NULL,           NULL,
16222 /* 24 */        NULL,           NULL,           NULL,           NULL,
16223 /* 28 */        NULL,           NULL,           NULL,           NULL,
16224 /* 2C */        NULL,           NULL,           NULL,           NULL,
16225 /* 30 */        NULL,           NULL,           NULL,           NULL,
16226 /* 34 */        NULL,           NULL,           NULL,           NULL,
16227 /* 38 */        NULL,           NULL,           NULL,           NULL,
16228 /* 3C */        NULL,           NULL,           NULL,           NULL,
16229 /* 40 */        NULL,           NULL,           NULL,           NULL,
16230 /* 44 */        NULL,           NULL,           NULL,           NULL,
16231 /* 48 */        NULL,           NULL,           NULL,           NULL,
16232 /* 4C */        NULL,           NULL,           NULL,           NULL,
16233 /* 50 */        NULL,           NULL,           NULL,           NULL,
16234 /* 54 */        NULL,           NULL,           NULL,           NULL,
16235 /* 58 */        NULL,           NULL,           NULL,           NULL,
16236 /* 5C */        NULL,           NULL,           NULL,           NULL,
16237 /* 60 */        NULL,           NULL,           NULL,           NULL,
16238 /* 64 */        NULL,           NULL,           NULL,           NULL,
16239 /* 68 */        NULL,           NULL,           NULL,           NULL,
16240 /* 6C */        NULL,           NULL,           NULL,           NULL,
16241 /* 70 */        NULL,           NULL,           NULL,           NULL,
16242 /* 74 */        NULL,           NULL,           NULL,           NULL,
16243 /* 78 */        NULL,           NULL,           NULL,           NULL,
16244 /* 7C */        NULL,           NULL,           NULL,           NULL,
16245 /* 80 */        NULL,           NULL,           NULL,           NULL,
16246 /* 84 */        NULL,           NULL,           NULL,           NULL,
16247 /* 88 */        NULL,           NULL,           "pfnacc",       NULL,
16248 /* 8C */        NULL,           NULL,           "pfpnacc",      NULL,
16249 /* 90 */        "pfcmpge",      NULL,           NULL,           NULL,
16250 /* 94 */        "pfmin",        NULL,           "pfrcp",        "pfrsqrt",
16251 /* 98 */        NULL,           NULL,           "pfsub",        NULL,
16252 /* 9C */        NULL,           NULL,           "pfadd",        NULL,
16253 /* A0 */        "pfcmpgt",      NULL,           NULL,           NULL,
16254 /* A4 */        "pfmax",        NULL,           "pfrcpit1",     "pfrsqit1",
16255 /* A8 */        NULL,           NULL,           "pfsubr",       NULL,
16256 /* AC */        NULL,           NULL,           "pfacc",        NULL,
16257 /* B0 */        "pfcmpeq",      NULL,           NULL,           NULL,
16258 /* B4 */        "pfmul",        NULL,           "pfrcpit2",     "pmulhrw",
16259 /* B8 */        NULL,           NULL,           NULL,           "pswapd",
16260 /* BC */        NULL,           NULL,           NULL,           "pavgusb",
16261 /* C0 */        NULL,           NULL,           NULL,           NULL,
16262 /* C4 */        NULL,           NULL,           NULL,           NULL,
16263 /* C8 */        NULL,           NULL,           NULL,           NULL,
16264 /* CC */        NULL,           NULL,           NULL,           NULL,
16265 /* D0 */        NULL,           NULL,           NULL,           NULL,
16266 /* D4 */        NULL,           NULL,           NULL,           NULL,
16267 /* D8 */        NULL,           NULL,           NULL,           NULL,
16268 /* DC */        NULL,           NULL,           NULL,           NULL,
16269 /* E0 */        NULL,           NULL,           NULL,           NULL,
16270 /* E4 */        NULL,           NULL,           NULL,           NULL,
16271 /* E8 */        NULL,           NULL,           NULL,           NULL,
16272 /* EC */        NULL,           NULL,           NULL,           NULL,
16273 /* F0 */        NULL,           NULL,           NULL,           NULL,
16274 /* F4 */        NULL,           NULL,           NULL,           NULL,
16275 /* F8 */        NULL,           NULL,           NULL,           NULL,
16276 /* FC */        NULL,           NULL,           NULL,           NULL,
16277 };
16278
16279 static void
16280 OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
16281 {
16282   const char *mnemonic;
16283
16284   FETCH_DATA (the_info, codep + 1);
16285   /* AMD 3DNow! instructions are specified by an opcode suffix in the
16286      place where an 8-bit immediate would normally go.  ie. the last
16287      byte of the instruction.  */
16288   obufp = mnemonicendp;
16289   mnemonic = Suffix3DNow[*codep++ & 0xff];
16290   if (mnemonic)
16291     oappend (mnemonic);
16292   else
16293     {
16294       /* Since a variable sized modrm/sib chunk is between the start
16295          of the opcode (0x0f0f) and the opcode suffix, we need to do
16296          all the modrm processing first, and don't know until now that
16297          we have a bad opcode.  This necessitates some cleaning up.  */
16298       op_out[0][0] = '\0';
16299       op_out[1][0] = '\0';
16300       BadOp ();
16301     }
16302   mnemonicendp = obufp;
16303 }
16304
16305 static struct op simd_cmp_op[] =
16306 {
16307   { STRING_COMMA_LEN ("eq") },
16308   { STRING_COMMA_LEN ("lt") },
16309   { STRING_COMMA_LEN ("le") },
16310   { STRING_COMMA_LEN ("unord") },
16311   { STRING_COMMA_LEN ("neq") },
16312   { STRING_COMMA_LEN ("nlt") },
16313   { STRING_COMMA_LEN ("nle") },
16314   { STRING_COMMA_LEN ("ord") }
16315 };
16316
16317 static void
16318 CMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
16319 {
16320   unsigned int cmp_type;
16321
16322   FETCH_DATA (the_info, codep + 1);
16323   cmp_type = *codep++ & 0xff;
16324   if (cmp_type < ARRAY_SIZE (simd_cmp_op))
16325     {
16326       char suffix [3];
16327       char *p = mnemonicendp - 2;
16328       suffix[0] = p[0];
16329       suffix[1] = p[1];
16330       suffix[2] = '\0';
16331       sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
16332       mnemonicendp += simd_cmp_op[cmp_type].len;
16333     }
16334   else
16335     {
16336       /* We have a reserved extension byte.  Output it directly.  */
16337       scratchbuf[0] = '$';
16338       print_operand_value (scratchbuf + 1, 1, cmp_type);
16339       oappend_maybe_intel (scratchbuf);
16340       scratchbuf[0] = '\0';
16341     }
16342 }
16343
16344 static void
16345 OP_Mwait (int bytemode ATTRIBUTE_UNUSED,
16346           int sizeflag ATTRIBUTE_UNUSED)
16347 {
16348   /* mwait %eax,%ecx  */
16349   if (!intel_syntax)
16350     {
16351       const char **names = (address_mode == mode_64bit
16352                             ? names64 : names32);
16353       strcpy (op_out[0], names[0]);
16354       strcpy (op_out[1], names[1]);
16355       two_source_ops = 1;
16356     }
16357   /* Skip mod/rm byte.  */
16358   MODRM_CHECK;
16359   codep++;
16360 }
16361
16362 static void
16363 OP_Monitor (int bytemode ATTRIBUTE_UNUSED,
16364             int sizeflag ATTRIBUTE_UNUSED)
16365 {
16366   /* monitor %eax,%ecx,%edx"  */
16367   if (!intel_syntax)
16368     {
16369       const char **op1_names;
16370       const char **names = (address_mode == mode_64bit
16371                             ? names64 : names32);
16372
16373       if (!(prefixes & PREFIX_ADDR))
16374         op1_names = (address_mode == mode_16bit
16375                      ? names16 : names);
16376       else
16377         {
16378           /* Remove "addr16/addr32".  */
16379           all_prefixes[last_addr_prefix] = 0;
16380           op1_names = (address_mode != mode_32bit
16381                        ? names32 : names16);
16382           used_prefixes |= PREFIX_ADDR;
16383         }
16384       strcpy (op_out[0], op1_names[0]);
16385       strcpy (op_out[1], names[1]);
16386       strcpy (op_out[2], names[2]);
16387       two_source_ops = 1;
16388     }
16389   /* Skip mod/rm byte.  */
16390   MODRM_CHECK;
16391   codep++;
16392 }
16393
16394 static void
16395 BadOp (void)
16396 {
16397   /* Throw away prefixes and 1st. opcode byte.  */
16398   codep = insn_codep + 1;
16399   oappend ("(bad)");
16400 }
16401
16402 static void
16403 REP_Fixup (int bytemode, int sizeflag)
16404 {
16405   /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
16406      lods and stos.  */
16407   if (prefixes & PREFIX_REPZ)
16408     all_prefixes[last_repz_prefix] = REP_PREFIX;
16409
16410   switch (bytemode)
16411     {
16412     case al_reg:
16413     case eAX_reg:
16414     case indir_dx_reg:
16415       OP_IMREG (bytemode, sizeflag);
16416       break;
16417     case eDI_reg:
16418       OP_ESreg (bytemode, sizeflag);
16419       break;
16420     case eSI_reg:
16421       OP_DSreg (bytemode, sizeflag);
16422       break;
16423     default:
16424       abort ();
16425       break;
16426     }
16427 }
16428
16429 /* For BND-prefixed instructions 0xF2 prefix should be displayed as
16430    "bnd".  */
16431
16432 static void
16433 BND_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
16434 {
16435   if (prefixes & PREFIX_REPNZ)
16436     all_prefixes[last_repnz_prefix] = BND_PREFIX;
16437 }
16438
16439 /* Similar to OP_E.  But the 0xf2/0xf3 prefixes should be displayed as
16440    "xacquire"/"xrelease" for memory operand if there is a LOCK prefix.
16441  */
16442
16443 static void
16444 HLE_Fixup1 (int bytemode, int sizeflag)
16445 {
16446   if (modrm.mod != 3
16447       && (prefixes & PREFIX_LOCK) != 0)
16448     {
16449       if (prefixes & PREFIX_REPZ)
16450         all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
16451       if (prefixes & PREFIX_REPNZ)
16452         all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
16453     }
16454
16455   OP_E (bytemode, sizeflag);
16456 }
16457
16458 /* Similar to OP_E.  But the 0xf2/0xf3 prefixes should be displayed as
16459    "xacquire"/"xrelease" for memory operand.  No check for LOCK prefix.
16460  */
16461
16462 static void
16463 HLE_Fixup2 (int bytemode, int sizeflag)
16464 {
16465   if (modrm.mod != 3)
16466     {
16467       if (prefixes & PREFIX_REPZ)
16468         all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
16469       if (prefixes & PREFIX_REPNZ)
16470         all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
16471     }
16472
16473   OP_E (bytemode, sizeflag);
16474 }
16475
16476 /* Similar to OP_E.  But the 0xf3 prefixes should be displayed as
16477    "xrelease" for memory operand.  No check for LOCK prefix.   */
16478
16479 static void
16480 HLE_Fixup3 (int bytemode, int sizeflag)
16481 {
16482   if (modrm.mod != 3
16483       && last_repz_prefix > last_repnz_prefix
16484       && (prefixes & PREFIX_REPZ) != 0)
16485     all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
16486
16487   OP_E (bytemode, sizeflag);
16488 }
16489
16490 static void
16491 CMPXCHG8B_Fixup (int bytemode, int sizeflag)
16492 {
16493   USED_REX (REX_W);
16494   if (rex & REX_W)
16495     {
16496       /* Change cmpxchg8b to cmpxchg16b.  */
16497       char *p = mnemonicendp - 2;
16498       mnemonicendp = stpcpy (p, "16b");
16499       bytemode = o_mode;
16500     }
16501   else if ((prefixes & PREFIX_LOCK) != 0)
16502     {
16503       if (prefixes & PREFIX_REPZ)
16504         all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
16505       if (prefixes & PREFIX_REPNZ)
16506         all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
16507     }
16508
16509   OP_M (bytemode, sizeflag);
16510 }
16511
16512 static void
16513 XMM_Fixup (int reg, int sizeflag ATTRIBUTE_UNUSED)
16514 {
16515   const char **names;
16516
16517   if (need_vex)
16518     {
16519       switch (vex.length)
16520         {
16521         case 128:
16522           names = names_xmm;
16523           break;
16524         case 256:
16525           names = names_ymm;
16526           break;
16527         default:
16528           abort ();
16529         }
16530     }
16531   else
16532     names = names_xmm;
16533   oappend (names[reg]);
16534 }
16535
16536 static void
16537 CRC32_Fixup (int bytemode, int sizeflag)
16538 {
16539   /* Add proper suffix to "crc32".  */
16540   char *p = mnemonicendp;
16541
16542   switch (bytemode)
16543     {
16544     case b_mode:
16545       if (intel_syntax)
16546         goto skip;
16547
16548       *p++ = 'b';
16549       break;
16550     case v_mode:
16551       if (intel_syntax)
16552         goto skip;
16553
16554       USED_REX (REX_W);
16555       if (rex & REX_W)
16556         *p++ = 'q';
16557       else
16558         {
16559           if (sizeflag & DFLAG)
16560             *p++ = 'l';
16561           else
16562             *p++ = 'w';
16563           used_prefixes |= (prefixes & PREFIX_DATA);
16564         }
16565       break;
16566     default:
16567       oappend (INTERNAL_DISASSEMBLER_ERROR);
16568       break;
16569     }
16570   mnemonicendp = p;
16571   *p = '\0';
16572
16573 skip:
16574   if (modrm.mod == 3)
16575     {
16576       int add;
16577
16578       /* Skip mod/rm byte.  */
16579       MODRM_CHECK;
16580       codep++;
16581
16582       USED_REX (REX_B);
16583       add = (rex & REX_B) ? 8 : 0;
16584       if (bytemode == b_mode)
16585         {
16586           USED_REX (0);
16587           if (rex)
16588             oappend (names8rex[modrm.rm + add]);
16589           else
16590             oappend (names8[modrm.rm + add]);
16591         }
16592       else
16593         {
16594           USED_REX (REX_W);
16595           if (rex & REX_W)
16596             oappend (names64[modrm.rm + add]);
16597           else if ((prefixes & PREFIX_DATA))
16598             oappend (names16[modrm.rm + add]);
16599           else
16600             oappend (names32[modrm.rm + add]);
16601         }
16602     }
16603   else
16604     OP_E (bytemode, sizeflag);
16605 }
16606
16607 static void
16608 FXSAVE_Fixup (int bytemode, int sizeflag)
16609 {
16610   /* Add proper suffix to "fxsave" and "fxrstor".  */
16611   USED_REX (REX_W);
16612   if (rex & REX_W)
16613     {
16614       char *p = mnemonicendp;
16615       *p++ = '6';
16616       *p++ = '4';
16617       *p = '\0';
16618       mnemonicendp = p;
16619     }
16620   OP_M (bytemode, sizeflag);
16621 }
16622
16623 /* Display the destination register operand for instructions with
16624    VEX. */
16625
16626 static void
16627 OP_VEX (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
16628 {
16629   int reg;
16630   const char **names;
16631
16632   if (!need_vex)
16633     abort ();
16634
16635   if (!need_vex_reg)
16636     return;
16637
16638   reg = vex.register_specifier;
16639   if (vex.evex)
16640     {
16641       if (!vex.v)
16642         reg += 16;
16643     }
16644
16645   if (bytemode == vex_scalar_mode)
16646     {
16647       oappend (names_xmm[reg]);
16648       return;
16649     }
16650
16651   switch (vex.length)
16652     {
16653     case 128:
16654       switch (bytemode)
16655         {
16656         case vex_mode:
16657         case vex128_mode:
16658         case vex_vsib_q_w_dq_mode:
16659         case vex_vsib_q_w_d_mode:
16660           names = names_xmm;
16661           break;
16662         case dq_mode:
16663           if (vex.w)
16664             names = names64;
16665           else
16666             names = names32;
16667           break;
16668         case mask_bd_mode:
16669         case mask_mode:
16670           names = names_mask;
16671           break;
16672         default:
16673           abort ();
16674           return;
16675         }
16676       break;
16677     case 256:
16678       switch (bytemode)
16679         {
16680         case vex_mode:
16681         case vex256_mode:
16682           names = names_ymm;
16683           break;
16684         case vex_vsib_q_w_dq_mode:
16685         case vex_vsib_q_w_d_mode:
16686           names = vex.w ? names_ymm : names_xmm;
16687           break;
16688         case mask_bd_mode:
16689         case mask_mode:
16690           names = names_mask;
16691           break;
16692         default:
16693           abort ();
16694           return;
16695         }
16696       break;
16697     case 512:
16698       names = names_zmm;
16699       break;
16700     default:
16701       abort ();
16702       break;
16703     }
16704   oappend (names[reg]);
16705 }
16706
16707 /* Get the VEX immediate byte without moving codep.  */
16708
16709 static unsigned char
16710 get_vex_imm8 (int sizeflag, int opnum)
16711 {
16712   int bytes_before_imm = 0;
16713
16714   if (modrm.mod != 3)
16715     {
16716       /* There are SIB/displacement bytes.  */
16717       if ((sizeflag & AFLAG) || address_mode == mode_64bit)
16718         {
16719           /* 32/64 bit address mode */
16720           int base = modrm.rm;
16721
16722           /* Check SIB byte.  */
16723           if (base == 4)
16724             {
16725               FETCH_DATA (the_info, codep + 1);
16726               base = *codep & 7;
16727               /* When decoding the third source, don't increase
16728                  bytes_before_imm as this has already been incremented
16729                  by one in OP_E_memory while decoding the second
16730                  source operand.  */
16731               if (opnum == 0)
16732                 bytes_before_imm++;
16733             }
16734
16735           /* Don't increase bytes_before_imm when decoding the third source,
16736              it has already been incremented by OP_E_memory while decoding
16737              the second source operand.  */
16738           if (opnum == 0)
16739             {
16740               switch (modrm.mod)
16741                 {
16742                   case 0:
16743                     /* When modrm.rm == 5 or modrm.rm == 4 and base in
16744                        SIB == 5, there is a 4 byte displacement.  */
16745                     if (base != 5)
16746                       /* No displacement. */
16747                       break;
16748                   case 2:
16749                     /* 4 byte displacement.  */
16750                     bytes_before_imm += 4;
16751                     break;
16752                   case 1:
16753                     /* 1 byte displacement.  */
16754                     bytes_before_imm++;
16755                     break;
16756                 }
16757             }
16758         }
16759       else
16760         {
16761           /* 16 bit address mode */
16762           /* Don't increase bytes_before_imm when decoding the third source,
16763              it has already been incremented by OP_E_memory while decoding
16764              the second source operand.  */
16765           if (opnum == 0)
16766             {
16767               switch (modrm.mod)
16768                 {
16769                 case 0:
16770                   /* When modrm.rm == 6, there is a 2 byte displacement.  */
16771                   if (modrm.rm != 6)
16772                     /* No displacement. */
16773                     break;
16774                 case 2:
16775                   /* 2 byte displacement.  */
16776                   bytes_before_imm += 2;
16777                   break;
16778                 case 1:
16779                   /* 1 byte displacement: when decoding the third source,
16780                      don't increase bytes_before_imm as this has already
16781                      been incremented by one in OP_E_memory while decoding
16782                      the second source operand.  */
16783                   if (opnum == 0)
16784                     bytes_before_imm++;
16785
16786                   break;
16787                 }
16788             }
16789         }
16790     }
16791
16792   FETCH_DATA (the_info, codep + bytes_before_imm + 1);
16793   return codep [bytes_before_imm];
16794 }
16795
16796 static void
16797 OP_EX_VexReg (int bytemode, int sizeflag, int reg)
16798 {
16799   const char **names;
16800
16801   if (reg == -1 && modrm.mod != 3)
16802     {
16803       OP_E_memory (bytemode, sizeflag);
16804       return;
16805     }
16806   else
16807     {
16808       if (reg == -1)
16809         {
16810           reg = modrm.rm;
16811           USED_REX (REX_B);
16812           if (rex & REX_B)
16813             reg += 8;
16814         }
16815       else if (reg > 7 && address_mode != mode_64bit)
16816         BadOp ();
16817     }
16818
16819   switch (vex.length)
16820     {
16821     case 128:
16822       names = names_xmm;
16823       break;
16824     case 256:
16825       names = names_ymm;
16826       break;
16827     default:
16828       abort ();
16829     }
16830   oappend (names[reg]);
16831 }
16832
16833 static void
16834 OP_EX_VexImmW (int bytemode, int sizeflag)
16835 {
16836   int reg = -1;
16837   static unsigned char vex_imm8;
16838
16839   if (vex_w_done == 0)
16840     {
16841       vex_w_done = 1;
16842
16843       /* Skip mod/rm byte.  */
16844       MODRM_CHECK;
16845       codep++;
16846
16847       vex_imm8 = get_vex_imm8 (sizeflag, 0);
16848
16849       if (vex.w)
16850           reg = vex_imm8 >> 4;
16851
16852       OP_EX_VexReg (bytemode, sizeflag, reg);
16853     }
16854   else if (vex_w_done == 1)
16855     {
16856       vex_w_done = 2;
16857
16858       if (!vex.w)
16859           reg = vex_imm8 >> 4;
16860
16861       OP_EX_VexReg (bytemode, sizeflag, reg);
16862     }
16863   else
16864     {
16865       /* Output the imm8 directly.  */
16866       scratchbuf[0] = '$';
16867       print_operand_value (scratchbuf + 1, 1, vex_imm8 & 0xf);
16868       oappend_maybe_intel (scratchbuf);
16869       scratchbuf[0] = '\0';
16870       codep++;
16871     }
16872 }
16873
16874 static void
16875 OP_Vex_2src (int bytemode, int sizeflag)
16876 {
16877   if (modrm.mod == 3)
16878     {
16879       int reg = modrm.rm;
16880       USED_REX (REX_B);
16881       if (rex & REX_B)
16882         reg += 8;
16883       oappend (names_xmm[reg]);
16884     }
16885   else
16886     {
16887       if (intel_syntax
16888           && (bytemode == v_mode || bytemode == v_swap_mode))
16889         {
16890           bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
16891           used_prefixes |= (prefixes & PREFIX_DATA);
16892         }
16893       OP_E (bytemode, sizeflag);
16894     }
16895 }
16896
16897 static void
16898 OP_Vex_2src_1 (int bytemode, int sizeflag)
16899 {
16900   if (modrm.mod == 3)
16901     {
16902       /* Skip mod/rm byte.   */
16903       MODRM_CHECK;
16904       codep++;
16905     }
16906
16907   if (vex.w)
16908     oappend (names_xmm[vex.register_specifier]);
16909   else
16910     OP_Vex_2src (bytemode, sizeflag);
16911 }
16912
16913 static void
16914 OP_Vex_2src_2 (int bytemode, int sizeflag)
16915 {
16916   if (vex.w)
16917     OP_Vex_2src (bytemode, sizeflag);
16918   else
16919     oappend (names_xmm[vex.register_specifier]);
16920 }
16921
16922 static void
16923 OP_EX_VexW (int bytemode, int sizeflag)
16924 {
16925   int reg = -1;
16926
16927   if (!vex_w_done)
16928     {
16929       vex_w_done = 1;
16930
16931       /* Skip mod/rm byte.  */
16932       MODRM_CHECK;
16933       codep++;
16934
16935       if (vex.w)
16936         reg = get_vex_imm8 (sizeflag, 0) >> 4;
16937     }
16938   else
16939     {
16940       if (!vex.w)
16941         reg = get_vex_imm8 (sizeflag, 1) >> 4;
16942     }
16943
16944   OP_EX_VexReg (bytemode, sizeflag, reg);
16945 }
16946
16947 static void
16948 VEXI4_Fixup (int bytemode ATTRIBUTE_UNUSED,
16949              int sizeflag ATTRIBUTE_UNUSED)
16950 {
16951   /* Skip the immediate byte and check for invalid bits.  */
16952   FETCH_DATA (the_info, codep + 1);
16953   if (*codep++ & 0xf)
16954     BadOp ();
16955 }
16956
16957 static void
16958 OP_REG_VexI4 (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
16959 {
16960   int reg;
16961   const char **names;
16962
16963   FETCH_DATA (the_info, codep + 1);
16964   reg = *codep++;
16965
16966   if (bytemode != x_mode)
16967     abort ();
16968
16969   if (reg & 0xf)
16970       BadOp ();
16971
16972   reg >>= 4;
16973   if (reg > 7 && address_mode != mode_64bit)
16974     BadOp ();
16975
16976   switch (vex.length)
16977     {
16978     case 128:
16979       names = names_xmm;
16980       break;
16981     case 256:
16982       names = names_ymm;
16983       break;
16984     default:
16985       abort ();
16986     }
16987   oappend (names[reg]);
16988 }
16989
16990 static void
16991 OP_XMM_VexW (int bytemode, int sizeflag)
16992 {
16993   /* Turn off the REX.W bit since it is used for swapping operands
16994      now.  */
16995   rex &= ~REX_W;
16996   OP_XMM (bytemode, sizeflag);
16997 }
16998
16999 static void
17000 OP_EX_Vex (int bytemode, int sizeflag)
17001 {
17002   if (modrm.mod != 3)
17003     {
17004       if (vex.register_specifier != 0)
17005         BadOp ();
17006       need_vex_reg = 0;
17007     }
17008   OP_EX (bytemode, sizeflag);
17009 }
17010
17011 static void
17012 OP_XMM_Vex (int bytemode, int sizeflag)
17013 {
17014   if (modrm.mod != 3)
17015     {
17016       if (vex.register_specifier != 0)
17017         BadOp ();
17018       need_vex_reg = 0;
17019     }
17020   OP_XMM (bytemode, sizeflag);
17021 }
17022
17023 static void
17024 VZERO_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
17025 {
17026   switch (vex.length)
17027     {
17028     case 128:
17029       mnemonicendp = stpcpy (obuf, "vzeroupper");
17030       break;
17031     case 256:
17032       mnemonicendp = stpcpy (obuf, "vzeroall");
17033       break;
17034     default:
17035       abort ();
17036     }
17037 }
17038
17039 static struct op vex_cmp_op[] =
17040 {
17041   { STRING_COMMA_LEN ("eq") },
17042   { STRING_COMMA_LEN ("lt") },
17043   { STRING_COMMA_LEN ("le") },
17044   { STRING_COMMA_LEN ("unord") },
17045   { STRING_COMMA_LEN ("neq") },
17046   { STRING_COMMA_LEN ("nlt") },
17047   { STRING_COMMA_LEN ("nle") },
17048   { STRING_COMMA_LEN ("ord") },
17049   { STRING_COMMA_LEN ("eq_uq") },
17050   { STRING_COMMA_LEN ("nge") },
17051   { STRING_COMMA_LEN ("ngt") },
17052   { STRING_COMMA_LEN ("false") },
17053   { STRING_COMMA_LEN ("neq_oq") },
17054   { STRING_COMMA_LEN ("ge") },
17055   { STRING_COMMA_LEN ("gt") },
17056   { STRING_COMMA_LEN ("true") },
17057   { STRING_COMMA_LEN ("eq_os") },
17058   { STRING_COMMA_LEN ("lt_oq") },
17059   { STRING_COMMA_LEN ("le_oq") },
17060   { STRING_COMMA_LEN ("unord_s") },
17061   { STRING_COMMA_LEN ("neq_us") },
17062   { STRING_COMMA_LEN ("nlt_uq") },
17063   { STRING_COMMA_LEN ("nle_uq") },
17064   { STRING_COMMA_LEN ("ord_s") },
17065   { STRING_COMMA_LEN ("eq_us") },
17066   { STRING_COMMA_LEN ("nge_uq") },
17067   { STRING_COMMA_LEN ("ngt_uq") },
17068   { STRING_COMMA_LEN ("false_os") },
17069   { STRING_COMMA_LEN ("neq_os") },
17070   { STRING_COMMA_LEN ("ge_oq") },
17071   { STRING_COMMA_LEN ("gt_oq") },
17072   { STRING_COMMA_LEN ("true_us") },
17073 };
17074
17075 static void
17076 VCMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
17077 {
17078   unsigned int cmp_type;
17079
17080   FETCH_DATA (the_info, codep + 1);
17081   cmp_type = *codep++ & 0xff;
17082   if (cmp_type < ARRAY_SIZE (vex_cmp_op))
17083     {
17084       char suffix [3];
17085       char *p = mnemonicendp - 2;
17086       suffix[0] = p[0];
17087       suffix[1] = p[1];
17088       suffix[2] = '\0';
17089       sprintf (p, "%s%s", vex_cmp_op[cmp_type].name, suffix);
17090       mnemonicendp += vex_cmp_op[cmp_type].len;
17091     }
17092   else
17093     {
17094       /* We have a reserved extension byte.  Output it directly.  */
17095       scratchbuf[0] = '$';
17096       print_operand_value (scratchbuf + 1, 1, cmp_type);
17097       oappend_maybe_intel (scratchbuf);
17098       scratchbuf[0] = '\0';
17099     }
17100 }
17101
17102 static void
17103 VPCMP_Fixup (int bytemode ATTRIBUTE_UNUSED,
17104              int sizeflag ATTRIBUTE_UNUSED)
17105 {
17106   unsigned int cmp_type;
17107
17108   if (!vex.evex)
17109     abort ();
17110
17111   FETCH_DATA (the_info, codep + 1);
17112   cmp_type = *codep++ & 0xff;
17113   /* There are aliases for immediates 0, 1, 2, 4, 5, 6.
17114      If it's the case, print suffix, otherwise - print the immediate.  */
17115   if (cmp_type < ARRAY_SIZE (simd_cmp_op)
17116       && cmp_type != 3
17117       && cmp_type != 7)
17118     {
17119       char suffix [3];
17120       char *p = mnemonicendp - 2;
17121
17122       /* vpcmp* can have both one- and two-lettered suffix.  */
17123       if (p[0] == 'p')
17124         {
17125           p++;
17126           suffix[0] = p[0];
17127           suffix[1] = '\0';
17128         }
17129       else
17130         {
17131           suffix[0] = p[0];
17132           suffix[1] = p[1];
17133           suffix[2] = '\0';
17134         }
17135
17136       sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
17137       mnemonicendp += simd_cmp_op[cmp_type].len;
17138     }
17139   else
17140     {
17141       /* We have a reserved extension byte.  Output it directly.  */
17142       scratchbuf[0] = '$';
17143       print_operand_value (scratchbuf + 1, 1, cmp_type);
17144       oappend_maybe_intel (scratchbuf);
17145       scratchbuf[0] = '\0';
17146     }
17147 }
17148
17149 static const struct op pclmul_op[] =
17150 {
17151   { STRING_COMMA_LEN ("lql") },
17152   { STRING_COMMA_LEN ("hql") },
17153   { STRING_COMMA_LEN ("lqh") },
17154   { STRING_COMMA_LEN ("hqh") }
17155 };
17156
17157 static void
17158 PCLMUL_Fixup (int bytemode ATTRIBUTE_UNUSED,
17159               int sizeflag ATTRIBUTE_UNUSED)
17160 {
17161   unsigned int pclmul_type;
17162
17163   FETCH_DATA (the_info, codep + 1);
17164   pclmul_type = *codep++ & 0xff;
17165   switch (pclmul_type)
17166     {
17167     case 0x10:
17168       pclmul_type = 2;
17169       break;
17170     case 0x11:
17171       pclmul_type = 3;
17172       break;
17173     default:
17174       break;
17175     }
17176   if (pclmul_type < ARRAY_SIZE (pclmul_op))
17177     {
17178       char suffix [4];
17179       char *p = mnemonicendp - 3;
17180       suffix[0] = p[0];
17181       suffix[1] = p[1];
17182       suffix[2] = p[2];
17183       suffix[3] = '\0';
17184       sprintf (p, "%s%s", pclmul_op[pclmul_type].name, suffix);
17185       mnemonicendp += pclmul_op[pclmul_type].len;
17186     }
17187   else
17188     {
17189       /* We have a reserved extension byte.  Output it directly.  */
17190       scratchbuf[0] = '$';
17191       print_operand_value (scratchbuf + 1, 1, pclmul_type);
17192       oappend_maybe_intel (scratchbuf);
17193       scratchbuf[0] = '\0';
17194     }
17195 }
17196
17197 static void
17198 MOVBE_Fixup (int bytemode, int sizeflag)
17199 {
17200   /* Add proper suffix to "movbe".  */
17201   char *p = mnemonicendp;
17202
17203   switch (bytemode)
17204     {
17205     case v_mode:
17206       if (intel_syntax)
17207         goto skip;
17208
17209       USED_REX (REX_W);
17210       if (sizeflag & SUFFIX_ALWAYS)
17211         {
17212           if (rex & REX_W)
17213             *p++ = 'q';
17214           else
17215             {
17216               if (sizeflag & DFLAG)
17217                 *p++ = 'l';
17218               else
17219                 *p++ = 'w';
17220               used_prefixes |= (prefixes & PREFIX_DATA);
17221             }
17222         }
17223       break;
17224     default:
17225       oappend (INTERNAL_DISASSEMBLER_ERROR);
17226       break;
17227     }
17228   mnemonicendp = p;
17229   *p = '\0';
17230
17231 skip:
17232   OP_M (bytemode, sizeflag);
17233 }
17234
17235 static void
17236 OP_LWPCB_E (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
17237 {
17238   int reg;
17239   const char **names;
17240
17241   /* Skip mod/rm byte.  */
17242   MODRM_CHECK;
17243   codep++;
17244
17245   if (vex.w)
17246     names = names64;
17247   else
17248     names = names32;
17249
17250   reg = modrm.rm;
17251   USED_REX (REX_B);
17252   if (rex & REX_B)
17253     reg += 8;
17254
17255   oappend (names[reg]);
17256 }
17257
17258 static void
17259 OP_LWP_E (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
17260 {
17261   const char **names;
17262
17263   if (vex.w)
17264     names = names64;
17265   else
17266     names = names32;
17267
17268   oappend (names[vex.register_specifier]);
17269 }
17270
17271 static void
17272 OP_Mask (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
17273 {
17274   if (!vex.evex
17275       || (bytemode != mask_mode && bytemode != mask_bd_mode))
17276     abort ();
17277
17278   USED_REX (REX_R);
17279   if ((rex & REX_R) != 0 || !vex.r)
17280     {
17281       BadOp ();
17282       return;
17283     }
17284
17285   oappend (names_mask [modrm.reg]);
17286 }
17287
17288 static void
17289 OP_Rounding (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
17290 {
17291   if (!vex.evex
17292       || (bytemode != evex_rounding_mode
17293           && bytemode != evex_sae_mode))
17294     abort ();
17295   if (modrm.mod == 3 && vex.b)
17296     switch (bytemode)
17297       {
17298       case evex_rounding_mode:
17299         oappend (names_rounding[vex.ll]);
17300         break;
17301       case evex_sae_mode:
17302         oappend ("{sae}");
17303         break;
17304       default:
17305         break;
17306       }
17307 }