Handle invalid prefixes for rdrand and rdseed
[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_MOD_0_0FC7_REG_6,
937   PREFIX_MOD_3_0FC7_REG_6,
938   PREFIX_MOD_3_0FC7_REG_7,
939   PREFIX_0FD0,
940   PREFIX_0FD6,
941   PREFIX_0FE6,
942   PREFIX_0FE7,
943   PREFIX_0FF0,
944   PREFIX_0FF7,
945   PREFIX_0F3810,
946   PREFIX_0F3814,
947   PREFIX_0F3815,
948   PREFIX_0F3817,
949   PREFIX_0F3820,
950   PREFIX_0F3821,
951   PREFIX_0F3822,
952   PREFIX_0F3823,
953   PREFIX_0F3824,
954   PREFIX_0F3825,
955   PREFIX_0F3828,
956   PREFIX_0F3829,
957   PREFIX_0F382A,
958   PREFIX_0F382B,
959   PREFIX_0F3830,
960   PREFIX_0F3831,
961   PREFIX_0F3832,
962   PREFIX_0F3833,
963   PREFIX_0F3834,
964   PREFIX_0F3835,
965   PREFIX_0F3837,
966   PREFIX_0F3838,
967   PREFIX_0F3839,
968   PREFIX_0F383A,
969   PREFIX_0F383B,
970   PREFIX_0F383C,
971   PREFIX_0F383D,
972   PREFIX_0F383E,
973   PREFIX_0F383F,
974   PREFIX_0F3840,
975   PREFIX_0F3841,
976   PREFIX_0F3880,
977   PREFIX_0F3881,
978   PREFIX_0F3882,
979   PREFIX_0F38C8,
980   PREFIX_0F38C9,
981   PREFIX_0F38CA,
982   PREFIX_0F38CB,
983   PREFIX_0F38CC,
984   PREFIX_0F38CD,
985   PREFIX_0F38DB,
986   PREFIX_0F38DC,
987   PREFIX_0F38DD,
988   PREFIX_0F38DE,
989   PREFIX_0F38DF,
990   PREFIX_0F38F0,
991   PREFIX_0F38F1,
992   PREFIX_0F38F6,
993   PREFIX_0F3A08,
994   PREFIX_0F3A09,
995   PREFIX_0F3A0A,
996   PREFIX_0F3A0B,
997   PREFIX_0F3A0C,
998   PREFIX_0F3A0D,
999   PREFIX_0F3A0E,
1000   PREFIX_0F3A14,
1001   PREFIX_0F3A15,
1002   PREFIX_0F3A16,
1003   PREFIX_0F3A17,
1004   PREFIX_0F3A20,
1005   PREFIX_0F3A21,
1006   PREFIX_0F3A22,
1007   PREFIX_0F3A40,
1008   PREFIX_0F3A41,
1009   PREFIX_0F3A42,
1010   PREFIX_0F3A44,
1011   PREFIX_0F3A60,
1012   PREFIX_0F3A61,
1013   PREFIX_0F3A62,
1014   PREFIX_0F3A63,
1015   PREFIX_0F3ACC,
1016   PREFIX_0F3ADF,
1017   PREFIX_VEX_0F10,
1018   PREFIX_VEX_0F11,
1019   PREFIX_VEX_0F12,
1020   PREFIX_VEX_0F16,
1021   PREFIX_VEX_0F2A,
1022   PREFIX_VEX_0F2C,
1023   PREFIX_VEX_0F2D,
1024   PREFIX_VEX_0F2E,
1025   PREFIX_VEX_0F2F,
1026   PREFIX_VEX_0F41,
1027   PREFIX_VEX_0F42,
1028   PREFIX_VEX_0F44,
1029   PREFIX_VEX_0F45,
1030   PREFIX_VEX_0F46,
1031   PREFIX_VEX_0F47,
1032   PREFIX_VEX_0F4A,
1033   PREFIX_VEX_0F4B,
1034   PREFIX_VEX_0F51,
1035   PREFIX_VEX_0F52,
1036   PREFIX_VEX_0F53,
1037   PREFIX_VEX_0F58,
1038   PREFIX_VEX_0F59,
1039   PREFIX_VEX_0F5A,
1040   PREFIX_VEX_0F5B,
1041   PREFIX_VEX_0F5C,
1042   PREFIX_VEX_0F5D,
1043   PREFIX_VEX_0F5E,
1044   PREFIX_VEX_0F5F,
1045   PREFIX_VEX_0F60,
1046   PREFIX_VEX_0F61,
1047   PREFIX_VEX_0F62,
1048   PREFIX_VEX_0F63,
1049   PREFIX_VEX_0F64,
1050   PREFIX_VEX_0F65,
1051   PREFIX_VEX_0F66,
1052   PREFIX_VEX_0F67,
1053   PREFIX_VEX_0F68,
1054   PREFIX_VEX_0F69,
1055   PREFIX_VEX_0F6A,
1056   PREFIX_VEX_0F6B,
1057   PREFIX_VEX_0F6C,
1058   PREFIX_VEX_0F6D,
1059   PREFIX_VEX_0F6E,
1060   PREFIX_VEX_0F6F,
1061   PREFIX_VEX_0F70,
1062   PREFIX_VEX_0F71_REG_2,
1063   PREFIX_VEX_0F71_REG_4,
1064   PREFIX_VEX_0F71_REG_6,
1065   PREFIX_VEX_0F72_REG_2,
1066   PREFIX_VEX_0F72_REG_4,
1067   PREFIX_VEX_0F72_REG_6,
1068   PREFIX_VEX_0F73_REG_2,
1069   PREFIX_VEX_0F73_REG_3,
1070   PREFIX_VEX_0F73_REG_6,
1071   PREFIX_VEX_0F73_REG_7,
1072   PREFIX_VEX_0F74,
1073   PREFIX_VEX_0F75,
1074   PREFIX_VEX_0F76,
1075   PREFIX_VEX_0F77,
1076   PREFIX_VEX_0F7C,
1077   PREFIX_VEX_0F7D,
1078   PREFIX_VEX_0F7E,
1079   PREFIX_VEX_0F7F,
1080   PREFIX_VEX_0F90,
1081   PREFIX_VEX_0F91,
1082   PREFIX_VEX_0F92,
1083   PREFIX_VEX_0F93,
1084   PREFIX_VEX_0F98,
1085   PREFIX_VEX_0F99,
1086   PREFIX_VEX_0FC2,
1087   PREFIX_VEX_0FC4,
1088   PREFIX_VEX_0FC5,
1089   PREFIX_VEX_0FD0,
1090   PREFIX_VEX_0FD1,
1091   PREFIX_VEX_0FD2,
1092   PREFIX_VEX_0FD3,
1093   PREFIX_VEX_0FD4,
1094   PREFIX_VEX_0FD5,
1095   PREFIX_VEX_0FD6,
1096   PREFIX_VEX_0FD7,
1097   PREFIX_VEX_0FD8,
1098   PREFIX_VEX_0FD9,
1099   PREFIX_VEX_0FDA,
1100   PREFIX_VEX_0FDB,
1101   PREFIX_VEX_0FDC,
1102   PREFIX_VEX_0FDD,
1103   PREFIX_VEX_0FDE,
1104   PREFIX_VEX_0FDF,
1105   PREFIX_VEX_0FE0,
1106   PREFIX_VEX_0FE1,
1107   PREFIX_VEX_0FE2,
1108   PREFIX_VEX_0FE3,
1109   PREFIX_VEX_0FE4,
1110   PREFIX_VEX_0FE5,
1111   PREFIX_VEX_0FE6,
1112   PREFIX_VEX_0FE7,
1113   PREFIX_VEX_0FE8,
1114   PREFIX_VEX_0FE9,
1115   PREFIX_VEX_0FEA,
1116   PREFIX_VEX_0FEB,
1117   PREFIX_VEX_0FEC,
1118   PREFIX_VEX_0FED,
1119   PREFIX_VEX_0FEE,
1120   PREFIX_VEX_0FEF,
1121   PREFIX_VEX_0FF0,
1122   PREFIX_VEX_0FF1,
1123   PREFIX_VEX_0FF2,
1124   PREFIX_VEX_0FF3,
1125   PREFIX_VEX_0FF4,
1126   PREFIX_VEX_0FF5,
1127   PREFIX_VEX_0FF6,
1128   PREFIX_VEX_0FF7,
1129   PREFIX_VEX_0FF8,
1130   PREFIX_VEX_0FF9,
1131   PREFIX_VEX_0FFA,
1132   PREFIX_VEX_0FFB,
1133   PREFIX_VEX_0FFC,
1134   PREFIX_VEX_0FFD,
1135   PREFIX_VEX_0FFE,
1136   PREFIX_VEX_0F3800,
1137   PREFIX_VEX_0F3801,
1138   PREFIX_VEX_0F3802,
1139   PREFIX_VEX_0F3803,
1140   PREFIX_VEX_0F3804,
1141   PREFIX_VEX_0F3805,
1142   PREFIX_VEX_0F3806,
1143   PREFIX_VEX_0F3807,
1144   PREFIX_VEX_0F3808,
1145   PREFIX_VEX_0F3809,
1146   PREFIX_VEX_0F380A,
1147   PREFIX_VEX_0F380B,
1148   PREFIX_VEX_0F380C,
1149   PREFIX_VEX_0F380D,
1150   PREFIX_VEX_0F380E,
1151   PREFIX_VEX_0F380F,
1152   PREFIX_VEX_0F3813,
1153   PREFIX_VEX_0F3816,
1154   PREFIX_VEX_0F3817,
1155   PREFIX_VEX_0F3818,
1156   PREFIX_VEX_0F3819,
1157   PREFIX_VEX_0F381A,
1158   PREFIX_VEX_0F381C,
1159   PREFIX_VEX_0F381D,
1160   PREFIX_VEX_0F381E,
1161   PREFIX_VEX_0F3820,
1162   PREFIX_VEX_0F3821,
1163   PREFIX_VEX_0F3822,
1164   PREFIX_VEX_0F3823,
1165   PREFIX_VEX_0F3824,
1166   PREFIX_VEX_0F3825,
1167   PREFIX_VEX_0F3828,
1168   PREFIX_VEX_0F3829,
1169   PREFIX_VEX_0F382A,
1170   PREFIX_VEX_0F382B,
1171   PREFIX_VEX_0F382C,
1172   PREFIX_VEX_0F382D,
1173   PREFIX_VEX_0F382E,
1174   PREFIX_VEX_0F382F,
1175   PREFIX_VEX_0F3830,
1176   PREFIX_VEX_0F3831,
1177   PREFIX_VEX_0F3832,
1178   PREFIX_VEX_0F3833,
1179   PREFIX_VEX_0F3834,
1180   PREFIX_VEX_0F3835,
1181   PREFIX_VEX_0F3836,
1182   PREFIX_VEX_0F3837,
1183   PREFIX_VEX_0F3838,
1184   PREFIX_VEX_0F3839,
1185   PREFIX_VEX_0F383A,
1186   PREFIX_VEX_0F383B,
1187   PREFIX_VEX_0F383C,
1188   PREFIX_VEX_0F383D,
1189   PREFIX_VEX_0F383E,
1190   PREFIX_VEX_0F383F,
1191   PREFIX_VEX_0F3840,
1192   PREFIX_VEX_0F3841,
1193   PREFIX_VEX_0F3845,
1194   PREFIX_VEX_0F3846,
1195   PREFIX_VEX_0F3847,
1196   PREFIX_VEX_0F3858,
1197   PREFIX_VEX_0F3859,
1198   PREFIX_VEX_0F385A,
1199   PREFIX_VEX_0F3878,
1200   PREFIX_VEX_0F3879,
1201   PREFIX_VEX_0F388C,
1202   PREFIX_VEX_0F388E,
1203   PREFIX_VEX_0F3890,
1204   PREFIX_VEX_0F3891,
1205   PREFIX_VEX_0F3892,
1206   PREFIX_VEX_0F3893,
1207   PREFIX_VEX_0F3896,
1208   PREFIX_VEX_0F3897,
1209   PREFIX_VEX_0F3898,
1210   PREFIX_VEX_0F3899,
1211   PREFIX_VEX_0F389A,
1212   PREFIX_VEX_0F389B,
1213   PREFIX_VEX_0F389C,
1214   PREFIX_VEX_0F389D,
1215   PREFIX_VEX_0F389E,
1216   PREFIX_VEX_0F389F,
1217   PREFIX_VEX_0F38A6,
1218   PREFIX_VEX_0F38A7,
1219   PREFIX_VEX_0F38A8,
1220   PREFIX_VEX_0F38A9,
1221   PREFIX_VEX_0F38AA,
1222   PREFIX_VEX_0F38AB,
1223   PREFIX_VEX_0F38AC,
1224   PREFIX_VEX_0F38AD,
1225   PREFIX_VEX_0F38AE,
1226   PREFIX_VEX_0F38AF,
1227   PREFIX_VEX_0F38B6,
1228   PREFIX_VEX_0F38B7,
1229   PREFIX_VEX_0F38B8,
1230   PREFIX_VEX_0F38B9,
1231   PREFIX_VEX_0F38BA,
1232   PREFIX_VEX_0F38BB,
1233   PREFIX_VEX_0F38BC,
1234   PREFIX_VEX_0F38BD,
1235   PREFIX_VEX_0F38BE,
1236   PREFIX_VEX_0F38BF,
1237   PREFIX_VEX_0F38DB,
1238   PREFIX_VEX_0F38DC,
1239   PREFIX_VEX_0F38DD,
1240   PREFIX_VEX_0F38DE,
1241   PREFIX_VEX_0F38DF,
1242   PREFIX_VEX_0F38F2,
1243   PREFIX_VEX_0F38F3_REG_1,
1244   PREFIX_VEX_0F38F3_REG_2,
1245   PREFIX_VEX_0F38F3_REG_3,
1246   PREFIX_VEX_0F38F5,
1247   PREFIX_VEX_0F38F6,
1248   PREFIX_VEX_0F38F7,
1249   PREFIX_VEX_0F3A00,
1250   PREFIX_VEX_0F3A01,
1251   PREFIX_VEX_0F3A02,
1252   PREFIX_VEX_0F3A04,
1253   PREFIX_VEX_0F3A05,
1254   PREFIX_VEX_0F3A06,
1255   PREFIX_VEX_0F3A08,
1256   PREFIX_VEX_0F3A09,
1257   PREFIX_VEX_0F3A0A,
1258   PREFIX_VEX_0F3A0B,
1259   PREFIX_VEX_0F3A0C,
1260   PREFIX_VEX_0F3A0D,
1261   PREFIX_VEX_0F3A0E,
1262   PREFIX_VEX_0F3A0F,
1263   PREFIX_VEX_0F3A14,
1264   PREFIX_VEX_0F3A15,
1265   PREFIX_VEX_0F3A16,
1266   PREFIX_VEX_0F3A17,
1267   PREFIX_VEX_0F3A18,
1268   PREFIX_VEX_0F3A19,
1269   PREFIX_VEX_0F3A1D,
1270   PREFIX_VEX_0F3A20,
1271   PREFIX_VEX_0F3A21,
1272   PREFIX_VEX_0F3A22,
1273   PREFIX_VEX_0F3A30,
1274   PREFIX_VEX_0F3A31,
1275   PREFIX_VEX_0F3A32,
1276   PREFIX_VEX_0F3A33,
1277   PREFIX_VEX_0F3A38,
1278   PREFIX_VEX_0F3A39,
1279   PREFIX_VEX_0F3A40,
1280   PREFIX_VEX_0F3A41,
1281   PREFIX_VEX_0F3A42,
1282   PREFIX_VEX_0F3A44,
1283   PREFIX_VEX_0F3A46,
1284   PREFIX_VEX_0F3A48,
1285   PREFIX_VEX_0F3A49,
1286   PREFIX_VEX_0F3A4A,
1287   PREFIX_VEX_0F3A4B,
1288   PREFIX_VEX_0F3A4C,
1289   PREFIX_VEX_0F3A5C,
1290   PREFIX_VEX_0F3A5D,
1291   PREFIX_VEX_0F3A5E,
1292   PREFIX_VEX_0F3A5F,
1293   PREFIX_VEX_0F3A60,
1294   PREFIX_VEX_0F3A61,
1295   PREFIX_VEX_0F3A62,
1296   PREFIX_VEX_0F3A63,
1297   PREFIX_VEX_0F3A68,
1298   PREFIX_VEX_0F3A69,
1299   PREFIX_VEX_0F3A6A,
1300   PREFIX_VEX_0F3A6B,
1301   PREFIX_VEX_0F3A6C,
1302   PREFIX_VEX_0F3A6D,
1303   PREFIX_VEX_0F3A6E,
1304   PREFIX_VEX_0F3A6F,
1305   PREFIX_VEX_0F3A78,
1306   PREFIX_VEX_0F3A79,
1307   PREFIX_VEX_0F3A7A,
1308   PREFIX_VEX_0F3A7B,
1309   PREFIX_VEX_0F3A7C,
1310   PREFIX_VEX_0F3A7D,
1311   PREFIX_VEX_0F3A7E,
1312   PREFIX_VEX_0F3A7F,
1313   PREFIX_VEX_0F3ADF,
1314   PREFIX_VEX_0F3AF0,
1315
1316   PREFIX_EVEX_0F10,
1317   PREFIX_EVEX_0F11,
1318   PREFIX_EVEX_0F12,
1319   PREFIX_EVEX_0F13,
1320   PREFIX_EVEX_0F14,
1321   PREFIX_EVEX_0F15,
1322   PREFIX_EVEX_0F16,
1323   PREFIX_EVEX_0F17,
1324   PREFIX_EVEX_0F28,
1325   PREFIX_EVEX_0F29,
1326   PREFIX_EVEX_0F2A,
1327   PREFIX_EVEX_0F2B,
1328   PREFIX_EVEX_0F2C,
1329   PREFIX_EVEX_0F2D,
1330   PREFIX_EVEX_0F2E,
1331   PREFIX_EVEX_0F2F,
1332   PREFIX_EVEX_0F51,
1333   PREFIX_EVEX_0F54,
1334   PREFIX_EVEX_0F55,
1335   PREFIX_EVEX_0F56,
1336   PREFIX_EVEX_0F57,
1337   PREFIX_EVEX_0F58,
1338   PREFIX_EVEX_0F59,
1339   PREFIX_EVEX_0F5A,
1340   PREFIX_EVEX_0F5B,
1341   PREFIX_EVEX_0F5C,
1342   PREFIX_EVEX_0F5D,
1343   PREFIX_EVEX_0F5E,
1344   PREFIX_EVEX_0F5F,
1345   PREFIX_EVEX_0F60,
1346   PREFIX_EVEX_0F61,
1347   PREFIX_EVEX_0F62,
1348   PREFIX_EVEX_0F63,
1349   PREFIX_EVEX_0F64,
1350   PREFIX_EVEX_0F65,
1351   PREFIX_EVEX_0F66,
1352   PREFIX_EVEX_0F67,
1353   PREFIX_EVEX_0F68,
1354   PREFIX_EVEX_0F69,
1355   PREFIX_EVEX_0F6A,
1356   PREFIX_EVEX_0F6B,
1357   PREFIX_EVEX_0F6C,
1358   PREFIX_EVEX_0F6D,
1359   PREFIX_EVEX_0F6E,
1360   PREFIX_EVEX_0F6F,
1361   PREFIX_EVEX_0F70,
1362   PREFIX_EVEX_0F71_REG_2,
1363   PREFIX_EVEX_0F71_REG_4,
1364   PREFIX_EVEX_0F71_REG_6,
1365   PREFIX_EVEX_0F72_REG_0,
1366   PREFIX_EVEX_0F72_REG_1,
1367   PREFIX_EVEX_0F72_REG_2,
1368   PREFIX_EVEX_0F72_REG_4,
1369   PREFIX_EVEX_0F72_REG_6,
1370   PREFIX_EVEX_0F73_REG_2,
1371   PREFIX_EVEX_0F73_REG_3,
1372   PREFIX_EVEX_0F73_REG_6,
1373   PREFIX_EVEX_0F73_REG_7,
1374   PREFIX_EVEX_0F74,
1375   PREFIX_EVEX_0F75,
1376   PREFIX_EVEX_0F76,
1377   PREFIX_EVEX_0F78,
1378   PREFIX_EVEX_0F79,
1379   PREFIX_EVEX_0F7A,
1380   PREFIX_EVEX_0F7B,
1381   PREFIX_EVEX_0F7E,
1382   PREFIX_EVEX_0F7F,
1383   PREFIX_EVEX_0FC2,
1384   PREFIX_EVEX_0FC4,
1385   PREFIX_EVEX_0FC5,
1386   PREFIX_EVEX_0FC6,
1387   PREFIX_EVEX_0FD1,
1388   PREFIX_EVEX_0FD2,
1389   PREFIX_EVEX_0FD3,
1390   PREFIX_EVEX_0FD4,
1391   PREFIX_EVEX_0FD5,
1392   PREFIX_EVEX_0FD6,
1393   PREFIX_EVEX_0FD8,
1394   PREFIX_EVEX_0FD9,
1395   PREFIX_EVEX_0FDA,
1396   PREFIX_EVEX_0FDB,
1397   PREFIX_EVEX_0FDC,
1398   PREFIX_EVEX_0FDD,
1399   PREFIX_EVEX_0FDE,
1400   PREFIX_EVEX_0FDF,
1401   PREFIX_EVEX_0FE0,
1402   PREFIX_EVEX_0FE1,
1403   PREFIX_EVEX_0FE2,
1404   PREFIX_EVEX_0FE3,
1405   PREFIX_EVEX_0FE4,
1406   PREFIX_EVEX_0FE5,
1407   PREFIX_EVEX_0FE6,
1408   PREFIX_EVEX_0FE7,
1409   PREFIX_EVEX_0FE8,
1410   PREFIX_EVEX_0FE9,
1411   PREFIX_EVEX_0FEA,
1412   PREFIX_EVEX_0FEB,
1413   PREFIX_EVEX_0FEC,
1414   PREFIX_EVEX_0FED,
1415   PREFIX_EVEX_0FEE,
1416   PREFIX_EVEX_0FEF,
1417   PREFIX_EVEX_0FF1,
1418   PREFIX_EVEX_0FF2,
1419   PREFIX_EVEX_0FF3,
1420   PREFIX_EVEX_0FF4,
1421   PREFIX_EVEX_0FF5,
1422   PREFIX_EVEX_0FF6,
1423   PREFIX_EVEX_0FF8,
1424   PREFIX_EVEX_0FF9,
1425   PREFIX_EVEX_0FFA,
1426   PREFIX_EVEX_0FFB,
1427   PREFIX_EVEX_0FFC,
1428   PREFIX_EVEX_0FFD,
1429   PREFIX_EVEX_0FFE,
1430   PREFIX_EVEX_0F3800,
1431   PREFIX_EVEX_0F3804,
1432   PREFIX_EVEX_0F380B,
1433   PREFIX_EVEX_0F380C,
1434   PREFIX_EVEX_0F380D,
1435   PREFIX_EVEX_0F3810,
1436   PREFIX_EVEX_0F3811,
1437   PREFIX_EVEX_0F3812,
1438   PREFIX_EVEX_0F3813,
1439   PREFIX_EVEX_0F3814,
1440   PREFIX_EVEX_0F3815,
1441   PREFIX_EVEX_0F3816,
1442   PREFIX_EVEX_0F3818,
1443   PREFIX_EVEX_0F3819,
1444   PREFIX_EVEX_0F381A,
1445   PREFIX_EVEX_0F381B,
1446   PREFIX_EVEX_0F381C,
1447   PREFIX_EVEX_0F381D,
1448   PREFIX_EVEX_0F381E,
1449   PREFIX_EVEX_0F381F,
1450   PREFIX_EVEX_0F3820,
1451   PREFIX_EVEX_0F3821,
1452   PREFIX_EVEX_0F3822,
1453   PREFIX_EVEX_0F3823,
1454   PREFIX_EVEX_0F3824,
1455   PREFIX_EVEX_0F3825,
1456   PREFIX_EVEX_0F3826,
1457   PREFIX_EVEX_0F3827,
1458   PREFIX_EVEX_0F3828,
1459   PREFIX_EVEX_0F3829,
1460   PREFIX_EVEX_0F382A,
1461   PREFIX_EVEX_0F382B,
1462   PREFIX_EVEX_0F382C,
1463   PREFIX_EVEX_0F382D,
1464   PREFIX_EVEX_0F3830,
1465   PREFIX_EVEX_0F3831,
1466   PREFIX_EVEX_0F3832,
1467   PREFIX_EVEX_0F3833,
1468   PREFIX_EVEX_0F3834,
1469   PREFIX_EVEX_0F3835,
1470   PREFIX_EVEX_0F3836,
1471   PREFIX_EVEX_0F3837,
1472   PREFIX_EVEX_0F3838,
1473   PREFIX_EVEX_0F3839,
1474   PREFIX_EVEX_0F383A,
1475   PREFIX_EVEX_0F383B,
1476   PREFIX_EVEX_0F383C,
1477   PREFIX_EVEX_0F383D,
1478   PREFIX_EVEX_0F383E,
1479   PREFIX_EVEX_0F383F,
1480   PREFIX_EVEX_0F3840,
1481   PREFIX_EVEX_0F3842,
1482   PREFIX_EVEX_0F3843,
1483   PREFIX_EVEX_0F3844,
1484   PREFIX_EVEX_0F3845,
1485   PREFIX_EVEX_0F3846,
1486   PREFIX_EVEX_0F3847,
1487   PREFIX_EVEX_0F384C,
1488   PREFIX_EVEX_0F384D,
1489   PREFIX_EVEX_0F384E,
1490   PREFIX_EVEX_0F384F,
1491   PREFIX_EVEX_0F3858,
1492   PREFIX_EVEX_0F3859,
1493   PREFIX_EVEX_0F385A,
1494   PREFIX_EVEX_0F385B,
1495   PREFIX_EVEX_0F3864,
1496   PREFIX_EVEX_0F3865,
1497   PREFIX_EVEX_0F3866,
1498   PREFIX_EVEX_0F3875,
1499   PREFIX_EVEX_0F3876,
1500   PREFIX_EVEX_0F3877,
1501   PREFIX_EVEX_0F3878,
1502   PREFIX_EVEX_0F3879,
1503   PREFIX_EVEX_0F387A,
1504   PREFIX_EVEX_0F387B,
1505   PREFIX_EVEX_0F387C,
1506   PREFIX_EVEX_0F387D,
1507   PREFIX_EVEX_0F387E,
1508   PREFIX_EVEX_0F387F,
1509   PREFIX_EVEX_0F3883,
1510   PREFIX_EVEX_0F3888,
1511   PREFIX_EVEX_0F3889,
1512   PREFIX_EVEX_0F388A,
1513   PREFIX_EVEX_0F388B,
1514   PREFIX_EVEX_0F388D,
1515   PREFIX_EVEX_0F3890,
1516   PREFIX_EVEX_0F3891,
1517   PREFIX_EVEX_0F3892,
1518   PREFIX_EVEX_0F3893,
1519   PREFIX_EVEX_0F3896,
1520   PREFIX_EVEX_0F3897,
1521   PREFIX_EVEX_0F3898,
1522   PREFIX_EVEX_0F3899,
1523   PREFIX_EVEX_0F389A,
1524   PREFIX_EVEX_0F389B,
1525   PREFIX_EVEX_0F389C,
1526   PREFIX_EVEX_0F389D,
1527   PREFIX_EVEX_0F389E,
1528   PREFIX_EVEX_0F389F,
1529   PREFIX_EVEX_0F38A0,
1530   PREFIX_EVEX_0F38A1,
1531   PREFIX_EVEX_0F38A2,
1532   PREFIX_EVEX_0F38A3,
1533   PREFIX_EVEX_0F38A6,
1534   PREFIX_EVEX_0F38A7,
1535   PREFIX_EVEX_0F38A8,
1536   PREFIX_EVEX_0F38A9,
1537   PREFIX_EVEX_0F38AA,
1538   PREFIX_EVEX_0F38AB,
1539   PREFIX_EVEX_0F38AC,
1540   PREFIX_EVEX_0F38AD,
1541   PREFIX_EVEX_0F38AE,
1542   PREFIX_EVEX_0F38AF,
1543   PREFIX_EVEX_0F38B4,
1544   PREFIX_EVEX_0F38B5,
1545   PREFIX_EVEX_0F38B6,
1546   PREFIX_EVEX_0F38B7,
1547   PREFIX_EVEX_0F38B8,
1548   PREFIX_EVEX_0F38B9,
1549   PREFIX_EVEX_0F38BA,
1550   PREFIX_EVEX_0F38BB,
1551   PREFIX_EVEX_0F38BC,
1552   PREFIX_EVEX_0F38BD,
1553   PREFIX_EVEX_0F38BE,
1554   PREFIX_EVEX_0F38BF,
1555   PREFIX_EVEX_0F38C4,
1556   PREFIX_EVEX_0F38C6_REG_1,
1557   PREFIX_EVEX_0F38C6_REG_2,
1558   PREFIX_EVEX_0F38C6_REG_5,
1559   PREFIX_EVEX_0F38C6_REG_6,
1560   PREFIX_EVEX_0F38C7_REG_1,
1561   PREFIX_EVEX_0F38C7_REG_2,
1562   PREFIX_EVEX_0F38C7_REG_5,
1563   PREFIX_EVEX_0F38C7_REG_6,
1564   PREFIX_EVEX_0F38C8,
1565   PREFIX_EVEX_0F38CA,
1566   PREFIX_EVEX_0F38CB,
1567   PREFIX_EVEX_0F38CC,
1568   PREFIX_EVEX_0F38CD,
1569
1570   PREFIX_EVEX_0F3A00,
1571   PREFIX_EVEX_0F3A01,
1572   PREFIX_EVEX_0F3A03,
1573   PREFIX_EVEX_0F3A04,
1574   PREFIX_EVEX_0F3A05,
1575   PREFIX_EVEX_0F3A08,
1576   PREFIX_EVEX_0F3A09,
1577   PREFIX_EVEX_0F3A0A,
1578   PREFIX_EVEX_0F3A0B,
1579   PREFIX_EVEX_0F3A0F,
1580   PREFIX_EVEX_0F3A14,
1581   PREFIX_EVEX_0F3A15,
1582   PREFIX_EVEX_0F3A16,
1583   PREFIX_EVEX_0F3A17,
1584   PREFIX_EVEX_0F3A18,
1585   PREFIX_EVEX_0F3A19,
1586   PREFIX_EVEX_0F3A1A,
1587   PREFIX_EVEX_0F3A1B,
1588   PREFIX_EVEX_0F3A1D,
1589   PREFIX_EVEX_0F3A1E,
1590   PREFIX_EVEX_0F3A1F,
1591   PREFIX_EVEX_0F3A20,
1592   PREFIX_EVEX_0F3A21,
1593   PREFIX_EVEX_0F3A22,
1594   PREFIX_EVEX_0F3A23,
1595   PREFIX_EVEX_0F3A25,
1596   PREFIX_EVEX_0F3A26,
1597   PREFIX_EVEX_0F3A27,
1598   PREFIX_EVEX_0F3A38,
1599   PREFIX_EVEX_0F3A39,
1600   PREFIX_EVEX_0F3A3A,
1601   PREFIX_EVEX_0F3A3B,
1602   PREFIX_EVEX_0F3A3E,
1603   PREFIX_EVEX_0F3A3F,
1604   PREFIX_EVEX_0F3A42,
1605   PREFIX_EVEX_0F3A43,
1606   PREFIX_EVEX_0F3A50,
1607   PREFIX_EVEX_0F3A51,
1608   PREFIX_EVEX_0F3A54,
1609   PREFIX_EVEX_0F3A55,
1610   PREFIX_EVEX_0F3A56,
1611   PREFIX_EVEX_0F3A57,
1612   PREFIX_EVEX_0F3A66,
1613   PREFIX_EVEX_0F3A67
1614 };
1615
1616 enum
1617 {
1618   X86_64_06 = 0,
1619   X86_64_07,
1620   X86_64_0D,
1621   X86_64_16,
1622   X86_64_17,
1623   X86_64_1E,
1624   X86_64_1F,
1625   X86_64_27,
1626   X86_64_2F,
1627   X86_64_37,
1628   X86_64_3F,
1629   X86_64_60,
1630   X86_64_61,
1631   X86_64_62,
1632   X86_64_63,
1633   X86_64_6D,
1634   X86_64_6F,
1635   X86_64_9A,
1636   X86_64_C4,
1637   X86_64_C5,
1638   X86_64_CE,
1639   X86_64_D4,
1640   X86_64_D5,
1641   X86_64_EA,
1642   X86_64_0F01_REG_0,
1643   X86_64_0F01_REG_1,
1644   X86_64_0F01_REG_2,
1645   X86_64_0F01_REG_3
1646 };
1647
1648 enum
1649 {
1650   THREE_BYTE_0F38 = 0,
1651   THREE_BYTE_0F3A,
1652   THREE_BYTE_0F7A
1653 };
1654
1655 enum
1656 {
1657   XOP_08 = 0,
1658   XOP_09,
1659   XOP_0A
1660 };
1661
1662 enum
1663 {
1664   VEX_0F = 0,
1665   VEX_0F38,
1666   VEX_0F3A
1667 };
1668
1669 enum
1670 {
1671   EVEX_0F = 0,
1672   EVEX_0F38,
1673   EVEX_0F3A
1674 };
1675
1676 enum
1677 {
1678   VEX_LEN_0F10_P_1 = 0,
1679   VEX_LEN_0F10_P_3,
1680   VEX_LEN_0F11_P_1,
1681   VEX_LEN_0F11_P_3,
1682   VEX_LEN_0F12_P_0_M_0,
1683   VEX_LEN_0F12_P_0_M_1,
1684   VEX_LEN_0F12_P_2,
1685   VEX_LEN_0F13_M_0,
1686   VEX_LEN_0F16_P_0_M_0,
1687   VEX_LEN_0F16_P_0_M_1,
1688   VEX_LEN_0F16_P_2,
1689   VEX_LEN_0F17_M_0,
1690   VEX_LEN_0F2A_P_1,
1691   VEX_LEN_0F2A_P_3,
1692   VEX_LEN_0F2C_P_1,
1693   VEX_LEN_0F2C_P_3,
1694   VEX_LEN_0F2D_P_1,
1695   VEX_LEN_0F2D_P_3,
1696   VEX_LEN_0F2E_P_0,
1697   VEX_LEN_0F2E_P_2,
1698   VEX_LEN_0F2F_P_0,
1699   VEX_LEN_0F2F_P_2,
1700   VEX_LEN_0F41_P_0,
1701   VEX_LEN_0F41_P_2,
1702   VEX_LEN_0F42_P_0,
1703   VEX_LEN_0F42_P_2,
1704   VEX_LEN_0F44_P_0,
1705   VEX_LEN_0F44_P_2,
1706   VEX_LEN_0F45_P_0,
1707   VEX_LEN_0F45_P_2,
1708   VEX_LEN_0F46_P_0,
1709   VEX_LEN_0F46_P_2,
1710   VEX_LEN_0F47_P_0,
1711   VEX_LEN_0F47_P_2,
1712   VEX_LEN_0F4A_P_0,
1713   VEX_LEN_0F4A_P_2,
1714   VEX_LEN_0F4B_P_0,
1715   VEX_LEN_0F4B_P_2,
1716   VEX_LEN_0F51_P_1,
1717   VEX_LEN_0F51_P_3,
1718   VEX_LEN_0F52_P_1,
1719   VEX_LEN_0F53_P_1,
1720   VEX_LEN_0F58_P_1,
1721   VEX_LEN_0F58_P_3,
1722   VEX_LEN_0F59_P_1,
1723   VEX_LEN_0F59_P_3,
1724   VEX_LEN_0F5A_P_1,
1725   VEX_LEN_0F5A_P_3,
1726   VEX_LEN_0F5C_P_1,
1727   VEX_LEN_0F5C_P_3,
1728   VEX_LEN_0F5D_P_1,
1729   VEX_LEN_0F5D_P_3,
1730   VEX_LEN_0F5E_P_1,
1731   VEX_LEN_0F5E_P_3,
1732   VEX_LEN_0F5F_P_1,
1733   VEX_LEN_0F5F_P_3,
1734   VEX_LEN_0F6E_P_2,
1735   VEX_LEN_0F7E_P_1,
1736   VEX_LEN_0F7E_P_2,
1737   VEX_LEN_0F90_P_0,
1738   VEX_LEN_0F90_P_2,
1739   VEX_LEN_0F91_P_0,
1740   VEX_LEN_0F91_P_2,
1741   VEX_LEN_0F92_P_0,
1742   VEX_LEN_0F92_P_2,
1743   VEX_LEN_0F92_P_3,
1744   VEX_LEN_0F93_P_0,
1745   VEX_LEN_0F93_P_2,
1746   VEX_LEN_0F93_P_3,
1747   VEX_LEN_0F98_P_0,
1748   VEX_LEN_0F98_P_2,
1749   VEX_LEN_0F99_P_0,
1750   VEX_LEN_0F99_P_2,
1751   VEX_LEN_0FAE_R_2_M_0,
1752   VEX_LEN_0FAE_R_3_M_0,
1753   VEX_LEN_0FC2_P_1,
1754   VEX_LEN_0FC2_P_3,
1755   VEX_LEN_0FC4_P_2,
1756   VEX_LEN_0FC5_P_2,
1757   VEX_LEN_0FD6_P_2,
1758   VEX_LEN_0FF7_P_2,
1759   VEX_LEN_0F3816_P_2,
1760   VEX_LEN_0F3819_P_2,
1761   VEX_LEN_0F381A_P_2_M_0,
1762   VEX_LEN_0F3836_P_2,
1763   VEX_LEN_0F3841_P_2,
1764   VEX_LEN_0F385A_P_2_M_0,
1765   VEX_LEN_0F38DB_P_2,
1766   VEX_LEN_0F38DC_P_2,
1767   VEX_LEN_0F38DD_P_2,
1768   VEX_LEN_0F38DE_P_2,
1769   VEX_LEN_0F38DF_P_2,
1770   VEX_LEN_0F38F2_P_0,
1771   VEX_LEN_0F38F3_R_1_P_0,
1772   VEX_LEN_0F38F3_R_2_P_0,
1773   VEX_LEN_0F38F3_R_3_P_0,
1774   VEX_LEN_0F38F5_P_0,
1775   VEX_LEN_0F38F5_P_1,
1776   VEX_LEN_0F38F5_P_3,
1777   VEX_LEN_0F38F6_P_3,
1778   VEX_LEN_0F38F7_P_0,
1779   VEX_LEN_0F38F7_P_1,
1780   VEX_LEN_0F38F7_P_2,
1781   VEX_LEN_0F38F7_P_3,
1782   VEX_LEN_0F3A00_P_2,
1783   VEX_LEN_0F3A01_P_2,
1784   VEX_LEN_0F3A06_P_2,
1785   VEX_LEN_0F3A0A_P_2,
1786   VEX_LEN_0F3A0B_P_2,
1787   VEX_LEN_0F3A14_P_2,
1788   VEX_LEN_0F3A15_P_2,
1789   VEX_LEN_0F3A16_P_2,
1790   VEX_LEN_0F3A17_P_2,
1791   VEX_LEN_0F3A18_P_2,
1792   VEX_LEN_0F3A19_P_2,
1793   VEX_LEN_0F3A20_P_2,
1794   VEX_LEN_0F3A21_P_2,
1795   VEX_LEN_0F3A22_P_2,
1796   VEX_LEN_0F3A30_P_2,
1797   VEX_LEN_0F3A31_P_2,
1798   VEX_LEN_0F3A32_P_2,
1799   VEX_LEN_0F3A33_P_2,
1800   VEX_LEN_0F3A38_P_2,
1801   VEX_LEN_0F3A39_P_2,
1802   VEX_LEN_0F3A41_P_2,
1803   VEX_LEN_0F3A44_P_2,
1804   VEX_LEN_0F3A46_P_2,
1805   VEX_LEN_0F3A60_P_2,
1806   VEX_LEN_0F3A61_P_2,
1807   VEX_LEN_0F3A62_P_2,
1808   VEX_LEN_0F3A63_P_2,
1809   VEX_LEN_0F3A6A_P_2,
1810   VEX_LEN_0F3A6B_P_2,
1811   VEX_LEN_0F3A6E_P_2,
1812   VEX_LEN_0F3A6F_P_2,
1813   VEX_LEN_0F3A7A_P_2,
1814   VEX_LEN_0F3A7B_P_2,
1815   VEX_LEN_0F3A7E_P_2,
1816   VEX_LEN_0F3A7F_P_2,
1817   VEX_LEN_0F3ADF_P_2,
1818   VEX_LEN_0F3AF0_P_3,
1819   VEX_LEN_0FXOP_08_CC,
1820   VEX_LEN_0FXOP_08_CD,
1821   VEX_LEN_0FXOP_08_CE,
1822   VEX_LEN_0FXOP_08_CF,
1823   VEX_LEN_0FXOP_08_EC,
1824   VEX_LEN_0FXOP_08_ED,
1825   VEX_LEN_0FXOP_08_EE,
1826   VEX_LEN_0FXOP_08_EF,
1827   VEX_LEN_0FXOP_09_80,
1828   VEX_LEN_0FXOP_09_81
1829 };
1830
1831 enum
1832 {
1833   VEX_W_0F10_P_0 = 0,
1834   VEX_W_0F10_P_1,
1835   VEX_W_0F10_P_2,
1836   VEX_W_0F10_P_3,
1837   VEX_W_0F11_P_0,
1838   VEX_W_0F11_P_1,
1839   VEX_W_0F11_P_2,
1840   VEX_W_0F11_P_3,
1841   VEX_W_0F12_P_0_M_0,
1842   VEX_W_0F12_P_0_M_1,
1843   VEX_W_0F12_P_1,
1844   VEX_W_0F12_P_2,
1845   VEX_W_0F12_P_3,
1846   VEX_W_0F13_M_0,
1847   VEX_W_0F14,
1848   VEX_W_0F15,
1849   VEX_W_0F16_P_0_M_0,
1850   VEX_W_0F16_P_0_M_1,
1851   VEX_W_0F16_P_1,
1852   VEX_W_0F16_P_2,
1853   VEX_W_0F17_M_0,
1854   VEX_W_0F28,
1855   VEX_W_0F29,
1856   VEX_W_0F2B_M_0,
1857   VEX_W_0F2E_P_0,
1858   VEX_W_0F2E_P_2,
1859   VEX_W_0F2F_P_0,
1860   VEX_W_0F2F_P_2,
1861   VEX_W_0F41_P_0_LEN_1,
1862   VEX_W_0F41_P_2_LEN_1,
1863   VEX_W_0F42_P_0_LEN_1,
1864   VEX_W_0F42_P_2_LEN_1,
1865   VEX_W_0F44_P_0_LEN_0,
1866   VEX_W_0F44_P_2_LEN_0,
1867   VEX_W_0F45_P_0_LEN_1,
1868   VEX_W_0F45_P_2_LEN_1,
1869   VEX_W_0F46_P_0_LEN_1,
1870   VEX_W_0F46_P_2_LEN_1,
1871   VEX_W_0F47_P_0_LEN_1,
1872   VEX_W_0F47_P_2_LEN_1,
1873   VEX_W_0F4A_P_0_LEN_1,
1874   VEX_W_0F4A_P_2_LEN_1,
1875   VEX_W_0F4B_P_0_LEN_1,
1876   VEX_W_0F4B_P_2_LEN_1,
1877   VEX_W_0F50_M_0,
1878   VEX_W_0F51_P_0,
1879   VEX_W_0F51_P_1,
1880   VEX_W_0F51_P_2,
1881   VEX_W_0F51_P_3,
1882   VEX_W_0F52_P_0,
1883   VEX_W_0F52_P_1,
1884   VEX_W_0F53_P_0,
1885   VEX_W_0F53_P_1,
1886   VEX_W_0F58_P_0,
1887   VEX_W_0F58_P_1,
1888   VEX_W_0F58_P_2,
1889   VEX_W_0F58_P_3,
1890   VEX_W_0F59_P_0,
1891   VEX_W_0F59_P_1,
1892   VEX_W_0F59_P_2,
1893   VEX_W_0F59_P_3,
1894   VEX_W_0F5A_P_0,
1895   VEX_W_0F5A_P_1,
1896   VEX_W_0F5A_P_3,
1897   VEX_W_0F5B_P_0,
1898   VEX_W_0F5B_P_1,
1899   VEX_W_0F5B_P_2,
1900   VEX_W_0F5C_P_0,
1901   VEX_W_0F5C_P_1,
1902   VEX_W_0F5C_P_2,
1903   VEX_W_0F5C_P_3,
1904   VEX_W_0F5D_P_0,
1905   VEX_W_0F5D_P_1,
1906   VEX_W_0F5D_P_2,
1907   VEX_W_0F5D_P_3,
1908   VEX_W_0F5E_P_0,
1909   VEX_W_0F5E_P_1,
1910   VEX_W_0F5E_P_2,
1911   VEX_W_0F5E_P_3,
1912   VEX_W_0F5F_P_0,
1913   VEX_W_0F5F_P_1,
1914   VEX_W_0F5F_P_2,
1915   VEX_W_0F5F_P_3,
1916   VEX_W_0F60_P_2,
1917   VEX_W_0F61_P_2,
1918   VEX_W_0F62_P_2,
1919   VEX_W_0F63_P_2,
1920   VEX_W_0F64_P_2,
1921   VEX_W_0F65_P_2,
1922   VEX_W_0F66_P_2,
1923   VEX_W_0F67_P_2,
1924   VEX_W_0F68_P_2,
1925   VEX_W_0F69_P_2,
1926   VEX_W_0F6A_P_2,
1927   VEX_W_0F6B_P_2,
1928   VEX_W_0F6C_P_2,
1929   VEX_W_0F6D_P_2,
1930   VEX_W_0F6F_P_1,
1931   VEX_W_0F6F_P_2,
1932   VEX_W_0F70_P_1,
1933   VEX_W_0F70_P_2,
1934   VEX_W_0F70_P_3,
1935   VEX_W_0F71_R_2_P_2,
1936   VEX_W_0F71_R_4_P_2,
1937   VEX_W_0F71_R_6_P_2,
1938   VEX_W_0F72_R_2_P_2,
1939   VEX_W_0F72_R_4_P_2,
1940   VEX_W_0F72_R_6_P_2,
1941   VEX_W_0F73_R_2_P_2,
1942   VEX_W_0F73_R_3_P_2,
1943   VEX_W_0F73_R_6_P_2,
1944   VEX_W_0F73_R_7_P_2,
1945   VEX_W_0F74_P_2,
1946   VEX_W_0F75_P_2,
1947   VEX_W_0F76_P_2,
1948   VEX_W_0F77_P_0,
1949   VEX_W_0F7C_P_2,
1950   VEX_W_0F7C_P_3,
1951   VEX_W_0F7D_P_2,
1952   VEX_W_0F7D_P_3,
1953   VEX_W_0F7E_P_1,
1954   VEX_W_0F7F_P_1,
1955   VEX_W_0F7F_P_2,
1956   VEX_W_0F90_P_0_LEN_0,
1957   VEX_W_0F90_P_2_LEN_0,
1958   VEX_W_0F91_P_0_LEN_0,
1959   VEX_W_0F91_P_2_LEN_0,
1960   VEX_W_0F92_P_0_LEN_0,
1961   VEX_W_0F92_P_2_LEN_0,
1962   VEX_W_0F92_P_3_LEN_0,
1963   VEX_W_0F93_P_0_LEN_0,
1964   VEX_W_0F93_P_2_LEN_0,
1965   VEX_W_0F93_P_3_LEN_0,
1966   VEX_W_0F98_P_0_LEN_0,
1967   VEX_W_0F98_P_2_LEN_0,
1968   VEX_W_0F99_P_0_LEN_0,
1969   VEX_W_0F99_P_2_LEN_0,
1970   VEX_W_0FAE_R_2_M_0,
1971   VEX_W_0FAE_R_3_M_0,
1972   VEX_W_0FC2_P_0,
1973   VEX_W_0FC2_P_1,
1974   VEX_W_0FC2_P_2,
1975   VEX_W_0FC2_P_3,
1976   VEX_W_0FC4_P_2,
1977   VEX_W_0FC5_P_2,
1978   VEX_W_0FD0_P_2,
1979   VEX_W_0FD0_P_3,
1980   VEX_W_0FD1_P_2,
1981   VEX_W_0FD2_P_2,
1982   VEX_W_0FD3_P_2,
1983   VEX_W_0FD4_P_2,
1984   VEX_W_0FD5_P_2,
1985   VEX_W_0FD6_P_2,
1986   VEX_W_0FD7_P_2_M_1,
1987   VEX_W_0FD8_P_2,
1988   VEX_W_0FD9_P_2,
1989   VEX_W_0FDA_P_2,
1990   VEX_W_0FDB_P_2,
1991   VEX_W_0FDC_P_2,
1992   VEX_W_0FDD_P_2,
1993   VEX_W_0FDE_P_2,
1994   VEX_W_0FDF_P_2,
1995   VEX_W_0FE0_P_2,
1996   VEX_W_0FE1_P_2,
1997   VEX_W_0FE2_P_2,
1998   VEX_W_0FE3_P_2,
1999   VEX_W_0FE4_P_2,
2000   VEX_W_0FE5_P_2,
2001   VEX_W_0FE6_P_1,
2002   VEX_W_0FE6_P_2,
2003   VEX_W_0FE6_P_3,
2004   VEX_W_0FE7_P_2_M_0,
2005   VEX_W_0FE8_P_2,
2006   VEX_W_0FE9_P_2,
2007   VEX_W_0FEA_P_2,
2008   VEX_W_0FEB_P_2,
2009   VEX_W_0FEC_P_2,
2010   VEX_W_0FED_P_2,
2011   VEX_W_0FEE_P_2,
2012   VEX_W_0FEF_P_2,
2013   VEX_W_0FF0_P_3_M_0,
2014   VEX_W_0FF1_P_2,
2015   VEX_W_0FF2_P_2,
2016   VEX_W_0FF3_P_2,
2017   VEX_W_0FF4_P_2,
2018   VEX_W_0FF5_P_2,
2019   VEX_W_0FF6_P_2,
2020   VEX_W_0FF7_P_2,
2021   VEX_W_0FF8_P_2,
2022   VEX_W_0FF9_P_2,
2023   VEX_W_0FFA_P_2,
2024   VEX_W_0FFB_P_2,
2025   VEX_W_0FFC_P_2,
2026   VEX_W_0FFD_P_2,
2027   VEX_W_0FFE_P_2,
2028   VEX_W_0F3800_P_2,
2029   VEX_W_0F3801_P_2,
2030   VEX_W_0F3802_P_2,
2031   VEX_W_0F3803_P_2,
2032   VEX_W_0F3804_P_2,
2033   VEX_W_0F3805_P_2,
2034   VEX_W_0F3806_P_2,
2035   VEX_W_0F3807_P_2,
2036   VEX_W_0F3808_P_2,
2037   VEX_W_0F3809_P_2,
2038   VEX_W_0F380A_P_2,
2039   VEX_W_0F380B_P_2,
2040   VEX_W_0F380C_P_2,
2041   VEX_W_0F380D_P_2,
2042   VEX_W_0F380E_P_2,
2043   VEX_W_0F380F_P_2,
2044   VEX_W_0F3816_P_2,
2045   VEX_W_0F3817_P_2,
2046   VEX_W_0F3818_P_2,
2047   VEX_W_0F3819_P_2,
2048   VEX_W_0F381A_P_2_M_0,
2049   VEX_W_0F381C_P_2,
2050   VEX_W_0F381D_P_2,
2051   VEX_W_0F381E_P_2,
2052   VEX_W_0F3820_P_2,
2053   VEX_W_0F3821_P_2,
2054   VEX_W_0F3822_P_2,
2055   VEX_W_0F3823_P_2,
2056   VEX_W_0F3824_P_2,
2057   VEX_W_0F3825_P_2,
2058   VEX_W_0F3828_P_2,
2059   VEX_W_0F3829_P_2,
2060   VEX_W_0F382A_P_2_M_0,
2061   VEX_W_0F382B_P_2,
2062   VEX_W_0F382C_P_2_M_0,
2063   VEX_W_0F382D_P_2_M_0,
2064   VEX_W_0F382E_P_2_M_0,
2065   VEX_W_0F382F_P_2_M_0,
2066   VEX_W_0F3830_P_2,
2067   VEX_W_0F3831_P_2,
2068   VEX_W_0F3832_P_2,
2069   VEX_W_0F3833_P_2,
2070   VEX_W_0F3834_P_2,
2071   VEX_W_0F3835_P_2,
2072   VEX_W_0F3836_P_2,
2073   VEX_W_0F3837_P_2,
2074   VEX_W_0F3838_P_2,
2075   VEX_W_0F3839_P_2,
2076   VEX_W_0F383A_P_2,
2077   VEX_W_0F383B_P_2,
2078   VEX_W_0F383C_P_2,
2079   VEX_W_0F383D_P_2,
2080   VEX_W_0F383E_P_2,
2081   VEX_W_0F383F_P_2,
2082   VEX_W_0F3840_P_2,
2083   VEX_W_0F3841_P_2,
2084   VEX_W_0F3846_P_2,
2085   VEX_W_0F3858_P_2,
2086   VEX_W_0F3859_P_2,
2087   VEX_W_0F385A_P_2_M_0,
2088   VEX_W_0F3878_P_2,
2089   VEX_W_0F3879_P_2,
2090   VEX_W_0F38DB_P_2,
2091   VEX_W_0F38DC_P_2,
2092   VEX_W_0F38DD_P_2,
2093   VEX_W_0F38DE_P_2,
2094   VEX_W_0F38DF_P_2,
2095   VEX_W_0F3A00_P_2,
2096   VEX_W_0F3A01_P_2,
2097   VEX_W_0F3A02_P_2,
2098   VEX_W_0F3A04_P_2,
2099   VEX_W_0F3A05_P_2,
2100   VEX_W_0F3A06_P_2,
2101   VEX_W_0F3A08_P_2,
2102   VEX_W_0F3A09_P_2,
2103   VEX_W_0F3A0A_P_2,
2104   VEX_W_0F3A0B_P_2,
2105   VEX_W_0F3A0C_P_2,
2106   VEX_W_0F3A0D_P_2,
2107   VEX_W_0F3A0E_P_2,
2108   VEX_W_0F3A0F_P_2,
2109   VEX_W_0F3A14_P_2,
2110   VEX_W_0F3A15_P_2,
2111   VEX_W_0F3A18_P_2,
2112   VEX_W_0F3A19_P_2,
2113   VEX_W_0F3A20_P_2,
2114   VEX_W_0F3A21_P_2,
2115   VEX_W_0F3A30_P_2_LEN_0,
2116   VEX_W_0F3A31_P_2_LEN_0,
2117   VEX_W_0F3A32_P_2_LEN_0,
2118   VEX_W_0F3A33_P_2_LEN_0,
2119   VEX_W_0F3A38_P_2,
2120   VEX_W_0F3A39_P_2,
2121   VEX_W_0F3A40_P_2,
2122   VEX_W_0F3A41_P_2,
2123   VEX_W_0F3A42_P_2,
2124   VEX_W_0F3A44_P_2,
2125   VEX_W_0F3A46_P_2,
2126   VEX_W_0F3A48_P_2,
2127   VEX_W_0F3A49_P_2,
2128   VEX_W_0F3A4A_P_2,
2129   VEX_W_0F3A4B_P_2,
2130   VEX_W_0F3A4C_P_2,
2131   VEX_W_0F3A60_P_2,
2132   VEX_W_0F3A61_P_2,
2133   VEX_W_0F3A62_P_2,
2134   VEX_W_0F3A63_P_2,
2135   VEX_W_0F3ADF_P_2,
2136
2137   EVEX_W_0F10_P_0,
2138   EVEX_W_0F10_P_1_M_0,
2139   EVEX_W_0F10_P_1_M_1,
2140   EVEX_W_0F10_P_2,
2141   EVEX_W_0F10_P_3_M_0,
2142   EVEX_W_0F10_P_3_M_1,
2143   EVEX_W_0F11_P_0,
2144   EVEX_W_0F11_P_1_M_0,
2145   EVEX_W_0F11_P_1_M_1,
2146   EVEX_W_0F11_P_2,
2147   EVEX_W_0F11_P_3_M_0,
2148   EVEX_W_0F11_P_3_M_1,
2149   EVEX_W_0F12_P_0_M_0,
2150   EVEX_W_0F12_P_0_M_1,
2151   EVEX_W_0F12_P_1,
2152   EVEX_W_0F12_P_2,
2153   EVEX_W_0F12_P_3,
2154   EVEX_W_0F13_P_0,
2155   EVEX_W_0F13_P_2,
2156   EVEX_W_0F14_P_0,
2157   EVEX_W_0F14_P_2,
2158   EVEX_W_0F15_P_0,
2159   EVEX_W_0F15_P_2,
2160   EVEX_W_0F16_P_0_M_0,
2161   EVEX_W_0F16_P_0_M_1,
2162   EVEX_W_0F16_P_1,
2163   EVEX_W_0F16_P_2,
2164   EVEX_W_0F17_P_0,
2165   EVEX_W_0F17_P_2,
2166   EVEX_W_0F28_P_0,
2167   EVEX_W_0F28_P_2,
2168   EVEX_W_0F29_P_0,
2169   EVEX_W_0F29_P_2,
2170   EVEX_W_0F2A_P_1,
2171   EVEX_W_0F2A_P_3,
2172   EVEX_W_0F2B_P_0,
2173   EVEX_W_0F2B_P_2,
2174   EVEX_W_0F2E_P_0,
2175   EVEX_W_0F2E_P_2,
2176   EVEX_W_0F2F_P_0,
2177   EVEX_W_0F2F_P_2,
2178   EVEX_W_0F51_P_0,
2179   EVEX_W_0F51_P_1,
2180   EVEX_W_0F51_P_2,
2181   EVEX_W_0F51_P_3,
2182   EVEX_W_0F54_P_0,
2183   EVEX_W_0F54_P_2,
2184   EVEX_W_0F55_P_0,
2185   EVEX_W_0F55_P_2,
2186   EVEX_W_0F56_P_0,
2187   EVEX_W_0F56_P_2,
2188   EVEX_W_0F57_P_0,
2189   EVEX_W_0F57_P_2,
2190   EVEX_W_0F58_P_0,
2191   EVEX_W_0F58_P_1,
2192   EVEX_W_0F58_P_2,
2193   EVEX_W_0F58_P_3,
2194   EVEX_W_0F59_P_0,
2195   EVEX_W_0F59_P_1,
2196   EVEX_W_0F59_P_2,
2197   EVEX_W_0F59_P_3,
2198   EVEX_W_0F5A_P_0,
2199   EVEX_W_0F5A_P_1,
2200   EVEX_W_0F5A_P_2,
2201   EVEX_W_0F5A_P_3,
2202   EVEX_W_0F5B_P_0,
2203   EVEX_W_0F5B_P_1,
2204   EVEX_W_0F5B_P_2,
2205   EVEX_W_0F5C_P_0,
2206   EVEX_W_0F5C_P_1,
2207   EVEX_W_0F5C_P_2,
2208   EVEX_W_0F5C_P_3,
2209   EVEX_W_0F5D_P_0,
2210   EVEX_W_0F5D_P_1,
2211   EVEX_W_0F5D_P_2,
2212   EVEX_W_0F5D_P_3,
2213   EVEX_W_0F5E_P_0,
2214   EVEX_W_0F5E_P_1,
2215   EVEX_W_0F5E_P_2,
2216   EVEX_W_0F5E_P_3,
2217   EVEX_W_0F5F_P_0,
2218   EVEX_W_0F5F_P_1,
2219   EVEX_W_0F5F_P_2,
2220   EVEX_W_0F5F_P_3,
2221   EVEX_W_0F62_P_2,
2222   EVEX_W_0F66_P_2,
2223   EVEX_W_0F6A_P_2,
2224   EVEX_W_0F6B_P_2,
2225   EVEX_W_0F6C_P_2,
2226   EVEX_W_0F6D_P_2,
2227   EVEX_W_0F6E_P_2,
2228   EVEX_W_0F6F_P_1,
2229   EVEX_W_0F6F_P_2,
2230   EVEX_W_0F6F_P_3,
2231   EVEX_W_0F70_P_2,
2232   EVEX_W_0F72_R_2_P_2,
2233   EVEX_W_0F72_R_6_P_2,
2234   EVEX_W_0F73_R_2_P_2,
2235   EVEX_W_0F73_R_6_P_2,
2236   EVEX_W_0F76_P_2,
2237   EVEX_W_0F78_P_0,
2238   EVEX_W_0F78_P_2,
2239   EVEX_W_0F79_P_0,
2240   EVEX_W_0F79_P_2,
2241   EVEX_W_0F7A_P_1,
2242   EVEX_W_0F7A_P_2,
2243   EVEX_W_0F7A_P_3,
2244   EVEX_W_0F7B_P_1,
2245   EVEX_W_0F7B_P_2,
2246   EVEX_W_0F7B_P_3,
2247   EVEX_W_0F7E_P_1,
2248   EVEX_W_0F7E_P_2,
2249   EVEX_W_0F7F_P_1,
2250   EVEX_W_0F7F_P_2,
2251   EVEX_W_0F7F_P_3,
2252   EVEX_W_0FC2_P_0,
2253   EVEX_W_0FC2_P_1,
2254   EVEX_W_0FC2_P_2,
2255   EVEX_W_0FC2_P_3,
2256   EVEX_W_0FC6_P_0,
2257   EVEX_W_0FC6_P_2,
2258   EVEX_W_0FD2_P_2,
2259   EVEX_W_0FD3_P_2,
2260   EVEX_W_0FD4_P_2,
2261   EVEX_W_0FD6_P_2,
2262   EVEX_W_0FE6_P_1,
2263   EVEX_W_0FE6_P_2,
2264   EVEX_W_0FE6_P_3,
2265   EVEX_W_0FE7_P_2,
2266   EVEX_W_0FF2_P_2,
2267   EVEX_W_0FF3_P_2,
2268   EVEX_W_0FF4_P_2,
2269   EVEX_W_0FFA_P_2,
2270   EVEX_W_0FFB_P_2,
2271   EVEX_W_0FFE_P_2,
2272   EVEX_W_0F380C_P_2,
2273   EVEX_W_0F380D_P_2,
2274   EVEX_W_0F3810_P_1,
2275   EVEX_W_0F3810_P_2,
2276   EVEX_W_0F3811_P_1,
2277   EVEX_W_0F3811_P_2,
2278   EVEX_W_0F3812_P_1,
2279   EVEX_W_0F3812_P_2,
2280   EVEX_W_0F3813_P_1,
2281   EVEX_W_0F3813_P_2,
2282   EVEX_W_0F3814_P_1,
2283   EVEX_W_0F3815_P_1,
2284   EVEX_W_0F3818_P_2,
2285   EVEX_W_0F3819_P_2,
2286   EVEX_W_0F381A_P_2,
2287   EVEX_W_0F381B_P_2,
2288   EVEX_W_0F381E_P_2,
2289   EVEX_W_0F381F_P_2,
2290   EVEX_W_0F3820_P_1,
2291   EVEX_W_0F3821_P_1,
2292   EVEX_W_0F3822_P_1,
2293   EVEX_W_0F3823_P_1,
2294   EVEX_W_0F3824_P_1,
2295   EVEX_W_0F3825_P_1,
2296   EVEX_W_0F3825_P_2,
2297   EVEX_W_0F3826_P_1,
2298   EVEX_W_0F3826_P_2,
2299   EVEX_W_0F3828_P_1,
2300   EVEX_W_0F3828_P_2,
2301   EVEX_W_0F3829_P_1,
2302   EVEX_W_0F3829_P_2,
2303   EVEX_W_0F382A_P_1,
2304   EVEX_W_0F382A_P_2,
2305   EVEX_W_0F382B_P_2,
2306   EVEX_W_0F3830_P_1,
2307   EVEX_W_0F3831_P_1,
2308   EVEX_W_0F3832_P_1,
2309   EVEX_W_0F3833_P_1,
2310   EVEX_W_0F3834_P_1,
2311   EVEX_W_0F3835_P_1,
2312   EVEX_W_0F3835_P_2,
2313   EVEX_W_0F3837_P_2,
2314   EVEX_W_0F3838_P_1,
2315   EVEX_W_0F3839_P_1,
2316   EVEX_W_0F383A_P_1,
2317   EVEX_W_0F3840_P_2,
2318   EVEX_W_0F3858_P_2,
2319   EVEX_W_0F3859_P_2,
2320   EVEX_W_0F385A_P_2,
2321   EVEX_W_0F385B_P_2,
2322   EVEX_W_0F3866_P_2,
2323   EVEX_W_0F3875_P_2,
2324   EVEX_W_0F3878_P_2,
2325   EVEX_W_0F3879_P_2,
2326   EVEX_W_0F387A_P_2,
2327   EVEX_W_0F387B_P_2,
2328   EVEX_W_0F387D_P_2,
2329   EVEX_W_0F3883_P_2,
2330   EVEX_W_0F388D_P_2,
2331   EVEX_W_0F3891_P_2,
2332   EVEX_W_0F3893_P_2,
2333   EVEX_W_0F38A1_P_2,
2334   EVEX_W_0F38A3_P_2,
2335   EVEX_W_0F38C7_R_1_P_2,
2336   EVEX_W_0F38C7_R_2_P_2,
2337   EVEX_W_0F38C7_R_5_P_2,
2338   EVEX_W_0F38C7_R_6_P_2,
2339
2340   EVEX_W_0F3A00_P_2,
2341   EVEX_W_0F3A01_P_2,
2342   EVEX_W_0F3A04_P_2,
2343   EVEX_W_0F3A05_P_2,
2344   EVEX_W_0F3A08_P_2,
2345   EVEX_W_0F3A09_P_2,
2346   EVEX_W_0F3A0A_P_2,
2347   EVEX_W_0F3A0B_P_2,
2348   EVEX_W_0F3A16_P_2,
2349   EVEX_W_0F3A18_P_2,
2350   EVEX_W_0F3A19_P_2,
2351   EVEX_W_0F3A1A_P_2,
2352   EVEX_W_0F3A1B_P_2,
2353   EVEX_W_0F3A1D_P_2,
2354   EVEX_W_0F3A21_P_2,
2355   EVEX_W_0F3A22_P_2,
2356   EVEX_W_0F3A23_P_2,
2357   EVEX_W_0F3A38_P_2,
2358   EVEX_W_0F3A39_P_2,
2359   EVEX_W_0F3A3A_P_2,
2360   EVEX_W_0F3A3B_P_2,
2361   EVEX_W_0F3A3E_P_2,
2362   EVEX_W_0F3A3F_P_2,
2363   EVEX_W_0F3A42_P_2,
2364   EVEX_W_0F3A43_P_2,
2365   EVEX_W_0F3A50_P_2,
2366   EVEX_W_0F3A51_P_2,
2367   EVEX_W_0F3A56_P_2,
2368   EVEX_W_0F3A57_P_2,
2369   EVEX_W_0F3A66_P_2,
2370   EVEX_W_0F3A67_P_2
2371 };
2372
2373 typedef void (*op_rtn) (int bytemode, int sizeflag);
2374
2375 struct dis386 {
2376   const char *name;
2377   struct
2378     {
2379       op_rtn rtn;
2380       int bytemode;
2381     } op[MAX_OPERANDS];
2382   unsigned int prefix_requirement;
2383 };
2384
2385 /* Upper case letters in the instruction names here are macros.
2386    'A' => print 'b' if no register operands or suffix_always is true
2387    'B' => print 'b' if suffix_always is true
2388    'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
2389           size prefix
2390    'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
2391           suffix_always is true
2392    'E' => print 'e' if 32-bit form of jcxz
2393    'F' => print 'w' or 'l' depending on address size prefix (loop insns)
2394    'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
2395    'H' => print ",pt" or ",pn" branch hint
2396    'I' => honor following macro letter even in Intel mode (implemented only
2397           for some of the macro letters)
2398    'J' => print 'l'
2399    'K' => print 'd' or 'q' if rex prefix is present.
2400    'L' => print 'l' if suffix_always is true
2401    'M' => print 'r' if intel_mnemonic is false.
2402    'N' => print 'n' if instruction has no wait "prefix"
2403    'O' => print 'd' or 'o' (or 'q' in Intel mode)
2404    'P' => print 'w', 'l' or 'q' if instruction has an operand size prefix,
2405           or suffix_always is true.  print 'q' if rex prefix is present.
2406    'Q' => print 'w', 'l' or 'q' for memory operand or suffix_always
2407           is true
2408    'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
2409    'S' => print 'w', 'l' or 'q' if suffix_always is true
2410    'T' => print 'q' in 64bit mode and behave as 'P' otherwise
2411    'U' => print 'q' in 64bit mode and behave as 'Q' otherwise
2412    'V' => print 'q' in 64bit mode and behave as 'S' otherwise
2413    'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
2414    'X' => print 's', 'd' depending on data16 prefix (for XMM)
2415    'Y' => 'q' if instruction has an REX 64bit overwrite prefix and
2416           suffix_always is true.
2417    'Z' => print 'q' in 64bit mode and behave as 'L' otherwise
2418    '!' => change condition from true to false or from false to true.
2419    '%' => add 1 upper case letter to the macro.
2420
2421    2 upper case letter macros:
2422    "XY" => print 'x' or 'y' if no register operands or suffix_always
2423            is true.
2424    "XW" => print 's', 'd' depending on the VEX.W bit (for FMA)
2425    "LQ" => print 'l' ('d' in Intel mode) or 'q' for memory operand
2426            or suffix_always is true
2427    "LB" => print "abs" in 64bit mode and behave as 'B' otherwise
2428    "LS" => print "abs" in 64bit mode and behave as 'S' otherwise
2429    "LV" => print "abs" for 64bit operand and behave as 'S' otherwise
2430    "LW" => print 'd', 'q' depending on the VEX.W bit
2431    "LP" => print 'w' or 'l' ('d' in Intel mode) if instruction has
2432            an operand size prefix, or suffix_always is true.  print
2433            'q' if rex prefix is present.
2434
2435    Many of the above letters print nothing in Intel mode.  See "putop"
2436    for the details.
2437
2438    Braces '{' and '}', and vertical bars '|', indicate alternative
2439    mnemonic strings for AT&T and Intel.  */
2440
2441 static const struct dis386 dis386[] = {
2442   /* 00 */
2443   { "addB",             { Ebh1, Gb }, 0 },
2444   { "addS",             { Evh1, Gv }, 0 },
2445   { "addB",             { Gb, EbS }, 0 },
2446   { "addS",             { Gv, EvS }, 0 },
2447   { "addB",             { AL, Ib }, 0 },
2448   { "addS",             { eAX, Iv }, 0 },
2449   { X86_64_TABLE (X86_64_06) },
2450   { X86_64_TABLE (X86_64_07) },
2451   /* 08 */
2452   { "orB",              { Ebh1, Gb }, 0 },
2453   { "orS",              { Evh1, Gv }, 0 },
2454   { "orB",              { Gb, EbS }, 0 },
2455   { "orS",              { Gv, EvS }, 0 },
2456   { "orB",              { AL, Ib }, 0 },
2457   { "orS",              { eAX, Iv }, 0 },
2458   { X86_64_TABLE (X86_64_0D) },
2459   { Bad_Opcode },       /* 0x0f extended opcode escape */
2460   /* 10 */
2461   { "adcB",             { Ebh1, Gb }, 0 },
2462   { "adcS",             { Evh1, Gv }, 0 },
2463   { "adcB",             { Gb, EbS }, 0 },
2464   { "adcS",             { Gv, EvS }, 0 },
2465   { "adcB",             { AL, Ib }, 0 },
2466   { "adcS",             { eAX, Iv }, 0 },
2467   { X86_64_TABLE (X86_64_16) },
2468   { X86_64_TABLE (X86_64_17) },
2469   /* 18 */
2470   { "sbbB",             { Ebh1, Gb }, 0 },
2471   { "sbbS",             { Evh1, Gv }, 0 },
2472   { "sbbB",             { Gb, EbS }, 0 },
2473   { "sbbS",             { Gv, EvS }, 0 },
2474   { "sbbB",             { AL, Ib }, 0 },
2475   { "sbbS",             { eAX, Iv }, 0 },
2476   { X86_64_TABLE (X86_64_1E) },
2477   { X86_64_TABLE (X86_64_1F) },
2478   /* 20 */
2479   { "andB",             { Ebh1, Gb }, 0 },
2480   { "andS",             { Evh1, Gv }, 0 },
2481   { "andB",             { Gb, EbS }, 0 },
2482   { "andS",             { Gv, EvS }, 0 },
2483   { "andB",             { AL, Ib }, 0 },
2484   { "andS",             { eAX, Iv }, 0 },
2485   { Bad_Opcode },       /* SEG ES prefix */
2486   { X86_64_TABLE (X86_64_27) },
2487   /* 28 */
2488   { "subB",             { Ebh1, Gb }, 0 },
2489   { "subS",             { Evh1, Gv }, 0 },
2490   { "subB",             { Gb, EbS }, 0 },
2491   { "subS",             { Gv, EvS }, 0 },
2492   { "subB",             { AL, Ib }, 0 },
2493   { "subS",             { eAX, Iv }, 0 },
2494   { Bad_Opcode },       /* SEG CS prefix */
2495   { X86_64_TABLE (X86_64_2F) },
2496   /* 30 */
2497   { "xorB",             { Ebh1, Gb }, 0 },
2498   { "xorS",             { Evh1, Gv }, 0 },
2499   { "xorB",             { Gb, EbS }, 0 },
2500   { "xorS",             { Gv, EvS }, 0 },
2501   { "xorB",             { AL, Ib }, 0 },
2502   { "xorS",             { eAX, Iv }, 0 },
2503   { Bad_Opcode },       /* SEG SS prefix */
2504   { X86_64_TABLE (X86_64_37) },
2505   /* 38 */
2506   { "cmpB",             { Eb, Gb }, 0 },
2507   { "cmpS",             { Ev, Gv }, 0 },
2508   { "cmpB",             { Gb, EbS }, 0 },
2509   { "cmpS",             { Gv, EvS }, 0 },
2510   { "cmpB",             { AL, Ib }, 0 },
2511   { "cmpS",             { eAX, Iv }, 0 },
2512   { Bad_Opcode },       /* SEG DS prefix */
2513   { X86_64_TABLE (X86_64_3F) },
2514   /* 40 */
2515   { "inc{S|}",          { RMeAX }, 0 },
2516   { "inc{S|}",          { RMeCX }, 0 },
2517   { "inc{S|}",          { RMeDX }, 0 },
2518   { "inc{S|}",          { RMeBX }, 0 },
2519   { "inc{S|}",          { RMeSP }, 0 },
2520   { "inc{S|}",          { RMeBP }, 0 },
2521   { "inc{S|}",          { RMeSI }, 0 },
2522   { "inc{S|}",          { RMeDI }, 0 },
2523   /* 48 */
2524   { "dec{S|}",          { RMeAX }, 0 },
2525   { "dec{S|}",          { RMeCX }, 0 },
2526   { "dec{S|}",          { RMeDX }, 0 },
2527   { "dec{S|}",          { RMeBX }, 0 },
2528   { "dec{S|}",          { RMeSP }, 0 },
2529   { "dec{S|}",          { RMeBP }, 0 },
2530   { "dec{S|}",          { RMeSI }, 0 },
2531   { "dec{S|}",          { RMeDI }, 0 },
2532   /* 50 */
2533   { "pushV",            { RMrAX }, 0 },
2534   { "pushV",            { RMrCX }, 0 },
2535   { "pushV",            { RMrDX }, 0 },
2536   { "pushV",            { RMrBX }, 0 },
2537   { "pushV",            { RMrSP }, 0 },
2538   { "pushV",            { RMrBP }, 0 },
2539   { "pushV",            { RMrSI }, 0 },
2540   { "pushV",            { RMrDI }, 0 },
2541   /* 58 */
2542   { "popV",             { RMrAX }, 0 },
2543   { "popV",             { RMrCX }, 0 },
2544   { "popV",             { RMrDX }, 0 },
2545   { "popV",             { RMrBX }, 0 },
2546   { "popV",             { RMrSP }, 0 },
2547   { "popV",             { RMrBP }, 0 },
2548   { "popV",             { RMrSI }, 0 },
2549   { "popV",             { RMrDI }, 0 },
2550   /* 60 */
2551   { X86_64_TABLE (X86_64_60) },
2552   { X86_64_TABLE (X86_64_61) },
2553   { X86_64_TABLE (X86_64_62) },
2554   { X86_64_TABLE (X86_64_63) },
2555   { Bad_Opcode },       /* seg fs */
2556   { Bad_Opcode },       /* seg gs */
2557   { Bad_Opcode },       /* op size prefix */
2558   { Bad_Opcode },       /* adr size prefix */
2559   /* 68 */
2560   { "pushT",            { sIv }, 0 },
2561   { "imulS",            { Gv, Ev, Iv }, 0 },
2562   { "pushT",            { sIbT }, 0 },
2563   { "imulS",            { Gv, Ev, sIb }, 0 },
2564   { "ins{b|}",          { Ybr, indirDX }, 0 },
2565   { X86_64_TABLE (X86_64_6D) },
2566   { "outs{b|}",         { indirDXr, Xb }, 0 },
2567   { X86_64_TABLE (X86_64_6F) },
2568   /* 70 */
2569   { "joH",              { Jb, BND, cond_jump_flag }, 0 },
2570   { "jnoH",             { Jb, BND, cond_jump_flag }, 0 },
2571   { "jbH",              { Jb, BND, cond_jump_flag }, 0 },
2572   { "jaeH",             { Jb, BND, cond_jump_flag }, 0 },
2573   { "jeH",              { Jb, BND, cond_jump_flag }, 0 },
2574   { "jneH",             { Jb, BND, cond_jump_flag }, 0 },
2575   { "jbeH",             { Jb, BND, cond_jump_flag }, 0 },
2576   { "jaH",              { Jb, BND, cond_jump_flag }, 0 },
2577   /* 78 */
2578   { "jsH",              { Jb, BND, cond_jump_flag }, 0 },
2579   { "jnsH",             { Jb, BND, cond_jump_flag }, 0 },
2580   { "jpH",              { Jb, BND, cond_jump_flag }, 0 },
2581   { "jnpH",             { Jb, BND, cond_jump_flag }, 0 },
2582   { "jlH",              { Jb, BND, cond_jump_flag }, 0 },
2583   { "jgeH",             { Jb, BND, cond_jump_flag }, 0 },
2584   { "jleH",             { Jb, BND, cond_jump_flag }, 0 },
2585   { "jgH",              { Jb, BND, cond_jump_flag }, 0 },
2586   /* 80 */
2587   { REG_TABLE (REG_80) },
2588   { REG_TABLE (REG_81) },
2589   { Bad_Opcode },
2590   { REG_TABLE (REG_82) },
2591   { "testB",            { Eb, Gb }, 0 },
2592   { "testS",            { Ev, Gv }, 0 },
2593   { "xchgB",            { Ebh2, Gb }, 0 },
2594   { "xchgS",            { Evh2, Gv }, 0 },
2595   /* 88 */
2596   { "movB",             { Ebh3, Gb }, 0 },
2597   { "movS",             { Evh3, Gv }, 0 },
2598   { "movB",             { Gb, EbS }, 0 },
2599   { "movS",             { Gv, EvS }, 0 },
2600   { "movD",             { Sv, Sw }, 0 },
2601   { MOD_TABLE (MOD_8D) },
2602   { "movD",             { Sw, Sv }, 0 },
2603   { REG_TABLE (REG_8F) },
2604   /* 90 */
2605   { PREFIX_TABLE (PREFIX_90) },
2606   { "xchgS",            { RMeCX, eAX }, 0 },
2607   { "xchgS",            { RMeDX, eAX }, 0 },
2608   { "xchgS",            { RMeBX, eAX }, 0 },
2609   { "xchgS",            { RMeSP, eAX }, 0 },
2610   { "xchgS",            { RMeBP, eAX }, 0 },
2611   { "xchgS",            { RMeSI, eAX }, 0 },
2612   { "xchgS",            { RMeDI, eAX }, 0 },
2613   /* 98 */
2614   { "cW{t|}R",          { XX }, 0 },
2615   { "cR{t|}O",          { XX }, 0 },
2616   { X86_64_TABLE (X86_64_9A) },
2617   { Bad_Opcode },       /* fwait */
2618   { "pushfT",           { XX }, 0 },
2619   { "popfT",            { XX }, 0 },
2620   { "sahf",             { XX }, 0 },
2621   { "lahf",             { XX }, 0 },
2622   /* a0 */
2623   { "mov%LB",           { AL, Ob }, 0 },
2624   { "mov%LS",           { eAX, Ov }, 0 },
2625   { "mov%LB",           { Ob, AL }, 0 },
2626   { "mov%LS",           { Ov, eAX }, 0 },
2627   { "movs{b|}",         { Ybr, Xb }, 0 },
2628   { "movs{R|}",         { Yvr, Xv }, 0 },
2629   { "cmps{b|}",         { Xb, Yb }, 0 },
2630   { "cmps{R|}",         { Xv, Yv }, 0 },
2631   /* a8 */
2632   { "testB",            { AL, Ib }, 0 },
2633   { "testS",            { eAX, Iv }, 0 },
2634   { "stosB",            { Ybr, AL }, 0 },
2635   { "stosS",            { Yvr, eAX }, 0 },
2636   { "lodsB",            { ALr, Xb }, 0 },
2637   { "lodsS",            { eAXr, Xv }, 0 },
2638   { "scasB",            { AL, Yb }, 0 },
2639   { "scasS",            { eAX, Yv }, 0 },
2640   /* b0 */
2641   { "movB",             { RMAL, Ib }, 0 },
2642   { "movB",             { RMCL, Ib }, 0 },
2643   { "movB",             { RMDL, Ib }, 0 },
2644   { "movB",             { RMBL, Ib }, 0 },
2645   { "movB",             { RMAH, Ib }, 0 },
2646   { "movB",             { RMCH, Ib }, 0 },
2647   { "movB",             { RMDH, Ib }, 0 },
2648   { "movB",             { RMBH, Ib }, 0 },
2649   /* b8 */
2650   { "mov%LV",           { RMeAX, Iv64 }, 0 },
2651   { "mov%LV",           { RMeCX, Iv64 }, 0 },
2652   { "mov%LV",           { RMeDX, Iv64 }, 0 },
2653   { "mov%LV",           { RMeBX, Iv64 }, 0 },
2654   { "mov%LV",           { RMeSP, Iv64 }, 0 },
2655   { "mov%LV",           { RMeBP, Iv64 }, 0 },
2656   { "mov%LV",           { RMeSI, Iv64 }, 0 },
2657   { "mov%LV",           { RMeDI, Iv64 }, 0 },
2658   /* c0 */
2659   { REG_TABLE (REG_C0) },
2660   { REG_TABLE (REG_C1) },
2661   { "retT",             { Iw, BND }, 0 },
2662   { "retT",             { BND }, 0 },
2663   { X86_64_TABLE (X86_64_C4) },
2664   { X86_64_TABLE (X86_64_C5) },
2665   { REG_TABLE (REG_C6) },
2666   { REG_TABLE (REG_C7) },
2667   /* c8 */
2668   { "enterT",           { Iw, Ib }, 0 },
2669   { "leaveT",           { XX }, 0 },
2670   { "Jret{|f}P",        { Iw }, 0 },
2671   { "Jret{|f}P",        { XX }, 0 },
2672   { "int3",             { XX }, 0 },
2673   { "int",              { Ib }, 0 },
2674   { X86_64_TABLE (X86_64_CE) },
2675   { "iret%LP",          { XX }, 0 },
2676   /* d0 */
2677   { REG_TABLE (REG_D0) },
2678   { REG_TABLE (REG_D1) },
2679   { REG_TABLE (REG_D2) },
2680   { REG_TABLE (REG_D3) },
2681   { X86_64_TABLE (X86_64_D4) },
2682   { X86_64_TABLE (X86_64_D5) },
2683   { Bad_Opcode },
2684   { "xlat",             { DSBX }, 0 },
2685   /* d8 */
2686   { FLOAT },
2687   { FLOAT },
2688   { FLOAT },
2689   { FLOAT },
2690   { FLOAT },
2691   { FLOAT },
2692   { FLOAT },
2693   { FLOAT },
2694   /* e0 */
2695   { "loopneFH",         { Jb, XX, loop_jcxz_flag }, 0 },
2696   { "loopeFH",          { Jb, XX, loop_jcxz_flag }, 0 },
2697   { "loopFH",           { Jb, XX, loop_jcxz_flag }, 0 },
2698   { "jEcxzH",           { Jb, XX, loop_jcxz_flag }, 0 },
2699   { "inB",              { AL, Ib }, 0 },
2700   { "inG",              { zAX, Ib }, 0 },
2701   { "outB",             { Ib, AL }, 0 },
2702   { "outG",             { Ib, zAX }, 0 },
2703   /* e8 */
2704   { "callT",            { Jv, BND }, 0 },
2705   { "jmpT",             { Jv, BND }, 0 },
2706   { X86_64_TABLE (X86_64_EA) },
2707   { "jmp",              { Jb, BND }, 0 },
2708   { "inB",              { AL, indirDX }, 0 },
2709   { "inG",              { zAX, indirDX }, 0 },
2710   { "outB",             { indirDX, AL }, 0 },
2711   { "outG",             { indirDX, zAX }, 0 },
2712   /* f0 */
2713   { Bad_Opcode },       /* lock prefix */
2714   { "icebp",            { XX }, 0 },
2715   { Bad_Opcode },       /* repne */
2716   { Bad_Opcode },       /* repz */
2717   { "hlt",              { XX }, 0 },
2718   { "cmc",              { XX }, 0 },
2719   { REG_TABLE (REG_F6) },
2720   { REG_TABLE (REG_F7) },
2721   /* f8 */
2722   { "clc",              { XX }, 0 },
2723   { "stc",              { XX }, 0 },
2724   { "cli",              { XX }, 0 },
2725   { "sti",              { XX }, 0 },
2726   { "cld",              { XX }, 0 },
2727   { "std",              { XX }, 0 },
2728   { REG_TABLE (REG_FE) },
2729   { REG_TABLE (REG_FF) },
2730 };
2731
2732 static const struct dis386 dis386_twobyte[] = {
2733   /* 00 */
2734   { REG_TABLE (REG_0F00 ) },
2735   { REG_TABLE (REG_0F01 ) },
2736   { "larS",             { Gv, Ew }, 0 },
2737   { "lslS",             { Gv, Ew }, 0 },
2738   { Bad_Opcode },
2739   { "syscall",          { XX }, 0 },
2740   { "clts",             { XX }, 0 },
2741   { "sysret%LP",                { XX }, 0 },
2742   /* 08 */
2743   { "invd",             { XX }, 0 },
2744   { "wbinvd",           { XX }, 0 },
2745   { Bad_Opcode },
2746   { "ud2",              { XX }, 0 },
2747   { Bad_Opcode },
2748   { REG_TABLE (REG_0F0D) },
2749   { "femms",            { XX }, 0 },
2750   { "",                 { MX, EM, OPSUF }, 0 }, /* See OP_3DNowSuffix.  */
2751   /* 10 */
2752   { PREFIX_TABLE (PREFIX_0F10) },
2753   { PREFIX_TABLE (PREFIX_0F11) },
2754   { PREFIX_TABLE (PREFIX_0F12) },
2755   { MOD_TABLE (MOD_0F13) },
2756   { "unpcklpX",         { XM, EXx }, PREFIX_OPCODE },
2757   { "unpckhpX",         { XM, EXx }, PREFIX_OPCODE },
2758   { PREFIX_TABLE (PREFIX_0F16) },
2759   { MOD_TABLE (MOD_0F17) },
2760   /* 18 */
2761   { REG_TABLE (REG_0F18) },
2762   { "nopQ",             { Ev }, 0 },
2763   { PREFIX_TABLE (PREFIX_0F1A) },
2764   { PREFIX_TABLE (PREFIX_0F1B) },
2765   { "nopQ",             { Ev }, 0 },
2766   { "nopQ",             { Ev }, 0 },
2767   { "nopQ",             { Ev }, 0 },
2768   { "nopQ",             { Ev }, 0 },
2769   /* 20 */
2770   { "movZ",             { Rm, Cm }, 0 },
2771   { "movZ",             { Rm, Dm }, 0 },
2772   { "movZ",             { Cm, Rm }, 0 },
2773   { "movZ",             { Dm, Rm }, 0 },
2774   { MOD_TABLE (MOD_0F24) },
2775   { Bad_Opcode },
2776   { MOD_TABLE (MOD_0F26) },
2777   { Bad_Opcode },
2778   /* 28 */
2779   { "movapX",           { XM, EXx }, PREFIX_OPCODE },
2780   { "movapX",           { EXxS, XM }, PREFIX_OPCODE },
2781   { PREFIX_TABLE (PREFIX_0F2A) },
2782   { PREFIX_TABLE (PREFIX_0F2B) },
2783   { PREFIX_TABLE (PREFIX_0F2C) },
2784   { PREFIX_TABLE (PREFIX_0F2D) },
2785   { PREFIX_TABLE (PREFIX_0F2E) },
2786   { PREFIX_TABLE (PREFIX_0F2F) },
2787   /* 30 */
2788   { "wrmsr",            { XX }, 0 },
2789   { "rdtsc",            { XX }, 0 },
2790   { "rdmsr",            { XX }, 0 },
2791   { "rdpmc",            { XX }, 0 },
2792   { "sysenter",         { XX }, 0 },
2793   { "sysexit",          { XX }, 0 },
2794   { Bad_Opcode },
2795   { "getsec",           { XX }, 0 },
2796   /* 38 */
2797   { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F38, PREFIX_OPCODE) },
2798   { Bad_Opcode },
2799   { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F3A, PREFIX_OPCODE) },
2800   { Bad_Opcode },
2801   { Bad_Opcode },
2802   { Bad_Opcode },
2803   { Bad_Opcode },
2804   { Bad_Opcode },
2805   /* 40 */
2806   { "cmovoS",           { Gv, Ev }, 0 },
2807   { "cmovnoS",          { Gv, Ev }, 0 },
2808   { "cmovbS",           { Gv, Ev }, 0 },
2809   { "cmovaeS",          { Gv, Ev }, 0 },
2810   { "cmoveS",           { Gv, Ev }, 0 },
2811   { "cmovneS",          { Gv, Ev }, 0 },
2812   { "cmovbeS",          { Gv, Ev }, 0 },
2813   { "cmovaS",           { Gv, Ev }, 0 },
2814   /* 48 */
2815   { "cmovsS",           { Gv, Ev }, 0 },
2816   { "cmovnsS",          { Gv, Ev }, 0 },
2817   { "cmovpS",           { Gv, Ev }, 0 },
2818   { "cmovnpS",          { Gv, Ev }, 0 },
2819   { "cmovlS",           { Gv, Ev }, 0 },
2820   { "cmovgeS",          { Gv, Ev }, 0 },
2821   { "cmovleS",          { Gv, Ev }, 0 },
2822   { "cmovgS",           { Gv, Ev }, 0 },
2823   /* 50 */
2824   { MOD_TABLE (MOD_0F51) },
2825   { PREFIX_TABLE (PREFIX_0F51) },
2826   { PREFIX_TABLE (PREFIX_0F52) },
2827   { PREFIX_TABLE (PREFIX_0F53) },
2828   { "andpX",            { XM, EXx }, PREFIX_OPCODE },
2829   { "andnpX",           { XM, EXx }, PREFIX_OPCODE },
2830   { "orpX",             { XM, EXx }, PREFIX_OPCODE },
2831   { "xorpX",            { XM, EXx }, PREFIX_OPCODE },
2832   /* 58 */
2833   { PREFIX_TABLE (PREFIX_0F58) },
2834   { PREFIX_TABLE (PREFIX_0F59) },
2835   { PREFIX_TABLE (PREFIX_0F5A) },
2836   { PREFIX_TABLE (PREFIX_0F5B) },
2837   { PREFIX_TABLE (PREFIX_0F5C) },
2838   { PREFIX_TABLE (PREFIX_0F5D) },
2839   { PREFIX_TABLE (PREFIX_0F5E) },
2840   { PREFIX_TABLE (PREFIX_0F5F) },
2841   /* 60 */
2842   { PREFIX_TABLE (PREFIX_0F60) },
2843   { PREFIX_TABLE (PREFIX_0F61) },
2844   { PREFIX_TABLE (PREFIX_0F62) },
2845   { "packsswb",         { MX, EM }, PREFIX_OPCODE },
2846   { "pcmpgtb",          { MX, EM }, PREFIX_OPCODE },
2847   { "pcmpgtw",          { MX, EM }, PREFIX_OPCODE },
2848   { "pcmpgtd",          { MX, EM }, PREFIX_OPCODE },
2849   { "packuswb",         { MX, EM }, PREFIX_OPCODE },
2850   /* 68 */
2851   { "punpckhbw",        { MX, EM }, PREFIX_OPCODE },
2852   { "punpckhwd",        { MX, EM }, PREFIX_OPCODE },
2853   { "punpckhdq",        { MX, EM }, PREFIX_OPCODE },
2854   { "packssdw",         { MX, EM }, PREFIX_OPCODE },
2855   { PREFIX_TABLE (PREFIX_0F6C) },
2856   { PREFIX_TABLE (PREFIX_0F6D) },
2857   { "movK",             { MX, Edq }, PREFIX_OPCODE },
2858   { PREFIX_TABLE (PREFIX_0F6F) },
2859   /* 70 */
2860   { PREFIX_TABLE (PREFIX_0F70) },
2861   { REG_TABLE (REG_0F71) },
2862   { REG_TABLE (REG_0F72) },
2863   { REG_TABLE (REG_0F73) },
2864   { "pcmpeqb",          { MX, EM }, PREFIX_OPCODE },
2865   { "pcmpeqw",          { MX, EM }, PREFIX_OPCODE },
2866   { "pcmpeqd",          { MX, EM }, PREFIX_OPCODE },
2867   { "emms",             { XX }, PREFIX_OPCODE },
2868   /* 78 */
2869   { PREFIX_TABLE (PREFIX_0F78) },
2870   { PREFIX_TABLE (PREFIX_0F79) },
2871   { THREE_BYTE_TABLE (THREE_BYTE_0F7A) },
2872   { Bad_Opcode },
2873   { PREFIX_TABLE (PREFIX_0F7C) },
2874   { PREFIX_TABLE (PREFIX_0F7D) },
2875   { PREFIX_TABLE (PREFIX_0F7E) },
2876   { PREFIX_TABLE (PREFIX_0F7F) },
2877   /* 80 */
2878   { "joH",              { Jv, BND, cond_jump_flag }, 0 },
2879   { "jnoH",             { Jv, BND, cond_jump_flag }, 0 },
2880   { "jbH",              { Jv, BND, cond_jump_flag }, 0 },
2881   { "jaeH",             { Jv, BND, cond_jump_flag }, 0 },
2882   { "jeH",              { Jv, BND, cond_jump_flag }, 0 },
2883   { "jneH",             { Jv, BND, cond_jump_flag }, 0 },
2884   { "jbeH",             { Jv, BND, cond_jump_flag }, 0 },
2885   { "jaH",              { Jv, BND, cond_jump_flag }, 0 },
2886   /* 88 */
2887   { "jsH",              { Jv, BND, cond_jump_flag }, 0 },
2888   { "jnsH",             { Jv, BND, cond_jump_flag }, 0 },
2889   { "jpH",              { Jv, BND, cond_jump_flag }, 0 },
2890   { "jnpH",             { Jv, BND, cond_jump_flag }, 0 },
2891   { "jlH",              { Jv, BND, cond_jump_flag }, 0 },
2892   { "jgeH",             { Jv, BND, cond_jump_flag }, 0 },
2893   { "jleH",             { Jv, BND, cond_jump_flag }, 0 },
2894   { "jgH",              { Jv, BND, cond_jump_flag }, 0 },
2895   /* 90 */
2896   { "seto",             { Eb }, 0 },
2897   { "setno",            { Eb }, 0 },
2898   { "setb",             { Eb }, 0 },
2899   { "setae",            { Eb }, 0 },
2900   { "sete",             { Eb }, 0 },
2901   { "setne",            { Eb }, 0 },
2902   { "setbe",            { Eb }, 0 },
2903   { "seta",             { Eb }, 0 },
2904   /* 98 */
2905   { "sets",             { Eb }, 0 },
2906   { "setns",            { Eb }, 0 },
2907   { "setp",             { Eb }, 0 },
2908   { "setnp",            { Eb }, 0 },
2909   { "setl",             { Eb }, 0 },
2910   { "setge",            { Eb }, 0 },
2911   { "setle",            { Eb }, 0 },
2912   { "setg",             { Eb }, 0 },
2913   /* a0 */
2914   { "pushT",            { fs }, 0 },
2915   { "popT",             { fs }, 0 },
2916   { "cpuid",            { XX }, 0 },
2917   { "btS",              { Ev, Gv }, 0 },
2918   { "shldS",            { Ev, Gv, Ib }, 0 },
2919   { "shldS",            { Ev, Gv, CL }, 0 },
2920   { REG_TABLE (REG_0FA6) },
2921   { REG_TABLE (REG_0FA7) },
2922   /* a8 */
2923   { "pushT",            { gs }, 0 },
2924   { "popT",             { gs }, 0 },
2925   { "rsm",              { XX }, 0 },
2926   { "btsS",             { Evh1, Gv }, 0 },
2927   { "shrdS",            { Ev, Gv, Ib }, 0 },
2928   { "shrdS",            { Ev, Gv, CL }, 0 },
2929   { REG_TABLE (REG_0FAE) },
2930   { "imulS",            { Gv, Ev }, 0 },
2931   /* b0 */
2932   { "cmpxchgB",         { Ebh1, Gb }, 0 },
2933   { "cmpxchgS",         { Evh1, Gv }, 0 },
2934   { MOD_TABLE (MOD_0FB2) },
2935   { "btrS",             { Evh1, Gv }, 0 },
2936   { MOD_TABLE (MOD_0FB4) },
2937   { MOD_TABLE (MOD_0FB5) },
2938   { "movz{bR|x}",       { Gv, Eb }, 0 },
2939   { "movz{wR|x}",       { Gv, Ew }, 0 }, /* yes, there really is movzww ! */
2940   /* b8 */
2941   { PREFIX_TABLE (PREFIX_0FB8) },
2942   { "ud1",              { XX }, 0 },
2943   { REG_TABLE (REG_0FBA) },
2944   { "btcS",             { Evh1, Gv }, 0 },
2945   { PREFIX_TABLE (PREFIX_0FBC) },
2946   { PREFIX_TABLE (PREFIX_0FBD) },
2947   { "movs{bR|x}",       { Gv, Eb }, 0 },
2948   { "movs{wR|x}",       { Gv, Ew }, 0 }, /* yes, there really is movsww ! */
2949   /* c0 */
2950   { "xaddB",            { Ebh1, Gb }, 0 },
2951   { "xaddS",            { Evh1, Gv }, 0 },
2952   { PREFIX_TABLE (PREFIX_0FC2) },
2953   { PREFIX_TABLE (PREFIX_0FC3) },
2954   { "pinsrw",           { MX, Edqw, Ib }, PREFIX_OPCODE },
2955   { "pextrw",           { Gdq, MS, Ib }, PREFIX_OPCODE },
2956   { "shufpX",           { XM, EXx, Ib }, PREFIX_OPCODE },
2957   { REG_TABLE (REG_0FC7) },
2958   /* c8 */
2959   { "bswap",            { RMeAX }, 0 },
2960   { "bswap",            { RMeCX }, 0 },
2961   { "bswap",            { RMeDX }, 0 },
2962   { "bswap",            { RMeBX }, 0 },
2963   { "bswap",            { RMeSP }, 0 },
2964   { "bswap",            { RMeBP }, 0 },
2965   { "bswap",            { RMeSI }, 0 },
2966   { "bswap",            { RMeDI }, 0 },
2967   /* d0 */
2968   { PREFIX_TABLE (PREFIX_0FD0) },
2969   { "psrlw",            { MX, EM }, PREFIX_OPCODE },
2970   { "psrld",            { MX, EM }, PREFIX_OPCODE },
2971   { "psrlq",            { MX, EM }, PREFIX_OPCODE },
2972   { "paddq",            { MX, EM }, PREFIX_OPCODE },
2973   { "pmullw",           { MX, EM }, PREFIX_OPCODE },
2974   { PREFIX_TABLE (PREFIX_0FD6) },
2975   { MOD_TABLE (MOD_0FD7) },
2976   /* d8 */
2977   { "psubusb",          { MX, EM }, PREFIX_OPCODE },
2978   { "psubusw",          { MX, EM }, PREFIX_OPCODE },
2979   { "pminub",           { MX, EM }, PREFIX_OPCODE },
2980   { "pand",             { MX, EM }, PREFIX_OPCODE },
2981   { "paddusb",          { MX, EM }, PREFIX_OPCODE },
2982   { "paddusw",          { MX, EM }, PREFIX_OPCODE },
2983   { "pmaxub",           { MX, EM }, PREFIX_OPCODE },
2984   { "pandn",            { MX, EM }, PREFIX_OPCODE },
2985   /* e0 */
2986   { "pavgb",            { MX, EM }, PREFIX_OPCODE },
2987   { "psraw",            { MX, EM }, PREFIX_OPCODE },
2988   { "psrad",            { MX, EM }, PREFIX_OPCODE },
2989   { "pavgw",            { MX, EM }, PREFIX_OPCODE },
2990   { "pmulhuw",          { MX, EM }, PREFIX_OPCODE },
2991   { "pmulhw",           { MX, EM }, PREFIX_OPCODE },
2992   { PREFIX_TABLE (PREFIX_0FE6) },
2993   { PREFIX_TABLE (PREFIX_0FE7) },
2994   /* e8 */
2995   { "psubsb",           { MX, EM }, PREFIX_OPCODE },
2996   { "psubsw",           { MX, EM }, PREFIX_OPCODE },
2997   { "pminsw",           { MX, EM }, PREFIX_OPCODE },
2998   { "por",              { MX, EM }, PREFIX_OPCODE },
2999   { "paddsb",           { MX, EM }, PREFIX_OPCODE },
3000   { "paddsw",           { MX, EM }, PREFIX_OPCODE },
3001   { "pmaxsw",           { MX, EM }, PREFIX_OPCODE },
3002   { "pxor",             { MX, EM }, PREFIX_OPCODE },
3003   /* f0 */
3004   { PREFIX_TABLE (PREFIX_0FF0) },
3005   { "psllw",            { MX, EM }, PREFIX_OPCODE },
3006   { "pslld",            { MX, EM }, PREFIX_OPCODE },
3007   { "psllq",            { MX, EM }, PREFIX_OPCODE },
3008   { "pmuludq",          { MX, EM }, PREFIX_OPCODE },
3009   { "pmaddwd",          { MX, EM }, PREFIX_OPCODE },
3010   { "psadbw",           { MX, EM }, PREFIX_OPCODE },
3011   { PREFIX_TABLE (PREFIX_0FF7) },
3012   /* f8 */
3013   { "psubb",            { MX, EM }, PREFIX_OPCODE },
3014   { "psubw",            { MX, EM }, PREFIX_OPCODE },
3015   { "psubd",            { MX, EM }, PREFIX_OPCODE },
3016   { "psubq",            { MX, EM }, PREFIX_OPCODE },
3017   { "paddb",            { MX, EM }, PREFIX_OPCODE },
3018   { "paddw",            { MX, EM }, PREFIX_OPCODE },
3019   { "paddd",            { MX, EM }, PREFIX_OPCODE },
3020   { Bad_Opcode },
3021 };
3022
3023 static const unsigned char onebyte_has_modrm[256] = {
3024   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
3025   /*       -------------------------------        */
3026   /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
3027   /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
3028   /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
3029   /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
3030   /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
3031   /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
3032   /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
3033   /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
3034   /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
3035   /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
3036   /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
3037   /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
3038   /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
3039   /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
3040   /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
3041   /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1  /* f0 */
3042   /*       -------------------------------        */
3043   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
3044 };
3045
3046 static const unsigned char twobyte_has_modrm[256] = {
3047   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
3048   /*       -------------------------------        */
3049   /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
3050   /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
3051   /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
3052   /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
3053   /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
3054   /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
3055   /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
3056   /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
3057   /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
3058   /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
3059   /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
3060   /* b0 */ 1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1, /* bf */
3061   /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
3062   /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
3063   /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
3064   /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0  /* ff */
3065   /*       -------------------------------        */
3066   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
3067 };
3068
3069 static char obuf[100];
3070 static char *obufp;
3071 static char *mnemonicendp;
3072 static char scratchbuf[100];
3073 static unsigned char *start_codep;
3074 static unsigned char *insn_codep;
3075 static unsigned char *codep;
3076 static unsigned char *end_codep;
3077 static int last_lock_prefix;
3078 static int last_repz_prefix;
3079 static int last_repnz_prefix;
3080 static int last_data_prefix;
3081 static int last_addr_prefix;
3082 static int last_rex_prefix;
3083 static int last_seg_prefix;
3084 static int fwait_prefix;
3085 /* The PREFIX_REPZ/PREFIX_REPNZ/PREFIX_DATA prefix is mandatory.  */
3086 static int prefix_requirement;
3087 /* The active segment register prefix.  */
3088 static int active_seg_prefix;
3089 #define MAX_CODE_LENGTH 15
3090 /* We can up to 14 prefixes since the maximum instruction length is
3091    15bytes.  */
3092 static int all_prefixes[MAX_CODE_LENGTH - 1];
3093 static disassemble_info *the_info;
3094 static struct
3095   {
3096     int mod;
3097     int reg;
3098     int rm;
3099   }
3100 modrm;
3101 static unsigned char need_modrm;
3102 static struct
3103   {
3104     int scale;
3105     int index;
3106     int base;
3107   }
3108 sib;
3109 static struct
3110   {
3111     int register_specifier;
3112     int length;
3113     int prefix;
3114     int w;
3115     int evex;
3116     int r;
3117     int v;
3118     int mask_register_specifier;
3119     int zeroing;
3120     int ll;
3121     int b;
3122   }
3123 vex;
3124 static unsigned char need_vex;
3125 static unsigned char need_vex_reg;
3126 static unsigned char vex_w_done;
3127
3128 struct op
3129   {
3130     const char *name;
3131     unsigned int len;
3132   };
3133
3134 /* If we are accessing mod/rm/reg without need_modrm set, then the
3135    values are stale.  Hitting this abort likely indicates that you
3136    need to update onebyte_has_modrm or twobyte_has_modrm.  */
3137 #define MODRM_CHECK  if (!need_modrm) abort ()
3138
3139 static const char **names64;
3140 static const char **names32;
3141 static const char **names16;
3142 static const char **names8;
3143 static const char **names8rex;
3144 static const char **names_seg;
3145 static const char *index64;
3146 static const char *index32;
3147 static const char **index16;
3148 static const char **names_bnd;
3149
3150 static const char *intel_names64[] = {
3151   "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
3152   "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
3153 };
3154 static const char *intel_names32[] = {
3155   "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
3156   "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
3157 };
3158 static const char *intel_names16[] = {
3159   "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
3160   "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
3161 };
3162 static const char *intel_names8[] = {
3163   "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
3164 };
3165 static const char *intel_names8rex[] = {
3166   "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
3167   "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
3168 };
3169 static const char *intel_names_seg[] = {
3170   "es", "cs", "ss", "ds", "fs", "gs", "?", "?",
3171 };
3172 static const char *intel_index64 = "riz";
3173 static const char *intel_index32 = "eiz";
3174 static const char *intel_index16[] = {
3175   "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
3176 };
3177
3178 static const char *att_names64[] = {
3179   "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
3180   "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
3181 };
3182 static const char *att_names32[] = {
3183   "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
3184   "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
3185 };
3186 static const char *att_names16[] = {
3187   "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
3188   "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
3189 };
3190 static const char *att_names8[] = {
3191   "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
3192 };
3193 static const char *att_names8rex[] = {
3194   "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
3195   "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
3196 };
3197 static const char *att_names_seg[] = {
3198   "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
3199 };
3200 static const char *att_index64 = "%riz";
3201 static const char *att_index32 = "%eiz";
3202 static const char *att_index16[] = {
3203   "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
3204 };
3205
3206 static const char **names_mm;
3207 static const char *intel_names_mm[] = {
3208   "mm0", "mm1", "mm2", "mm3",
3209   "mm4", "mm5", "mm6", "mm7"
3210 };
3211 static const char *att_names_mm[] = {
3212   "%mm0", "%mm1", "%mm2", "%mm3",
3213   "%mm4", "%mm5", "%mm6", "%mm7"
3214 };
3215
3216 static const char *intel_names_bnd[] = {
3217   "bnd0", "bnd1", "bnd2", "bnd3"
3218 };
3219
3220 static const char *att_names_bnd[] = {
3221   "%bnd0", "%bnd1", "%bnd2", "%bnd3"
3222 };
3223
3224 static const char **names_xmm;
3225 static const char *intel_names_xmm[] = {
3226   "xmm0", "xmm1", "xmm2", "xmm3",
3227   "xmm4", "xmm5", "xmm6", "xmm7",
3228   "xmm8", "xmm9", "xmm10", "xmm11",
3229   "xmm12", "xmm13", "xmm14", "xmm15",
3230   "xmm16", "xmm17", "xmm18", "xmm19",
3231   "xmm20", "xmm21", "xmm22", "xmm23",
3232   "xmm24", "xmm25", "xmm26", "xmm27",
3233   "xmm28", "xmm29", "xmm30", "xmm31"
3234 };
3235 static const char *att_names_xmm[] = {
3236   "%xmm0", "%xmm1", "%xmm2", "%xmm3",
3237   "%xmm4", "%xmm5", "%xmm6", "%xmm7",
3238   "%xmm8", "%xmm9", "%xmm10", "%xmm11",
3239   "%xmm12", "%xmm13", "%xmm14", "%xmm15",
3240   "%xmm16", "%xmm17", "%xmm18", "%xmm19",
3241   "%xmm20", "%xmm21", "%xmm22", "%xmm23",
3242   "%xmm24", "%xmm25", "%xmm26", "%xmm27",
3243   "%xmm28", "%xmm29", "%xmm30", "%xmm31"
3244 };
3245
3246 static const char **names_ymm;
3247 static const char *intel_names_ymm[] = {
3248   "ymm0", "ymm1", "ymm2", "ymm3",
3249   "ymm4", "ymm5", "ymm6", "ymm7",
3250   "ymm8", "ymm9", "ymm10", "ymm11",
3251   "ymm12", "ymm13", "ymm14", "ymm15",
3252   "ymm16", "ymm17", "ymm18", "ymm19",
3253   "ymm20", "ymm21", "ymm22", "ymm23",
3254   "ymm24", "ymm25", "ymm26", "ymm27",
3255   "ymm28", "ymm29", "ymm30", "ymm31"
3256 };
3257 static const char *att_names_ymm[] = {
3258   "%ymm0", "%ymm1", "%ymm2", "%ymm3",
3259   "%ymm4", "%ymm5", "%ymm6", "%ymm7",
3260   "%ymm8", "%ymm9", "%ymm10", "%ymm11",
3261   "%ymm12", "%ymm13", "%ymm14", "%ymm15",
3262   "%ymm16", "%ymm17", "%ymm18", "%ymm19",
3263   "%ymm20", "%ymm21", "%ymm22", "%ymm23",
3264   "%ymm24", "%ymm25", "%ymm26", "%ymm27",
3265   "%ymm28", "%ymm29", "%ymm30", "%ymm31"
3266 };
3267
3268 static const char **names_zmm;
3269 static const char *intel_names_zmm[] = {
3270   "zmm0", "zmm1", "zmm2", "zmm3",
3271   "zmm4", "zmm5", "zmm6", "zmm7",
3272   "zmm8", "zmm9", "zmm10", "zmm11",
3273   "zmm12", "zmm13", "zmm14", "zmm15",
3274   "zmm16", "zmm17", "zmm18", "zmm19",
3275   "zmm20", "zmm21", "zmm22", "zmm23",
3276   "zmm24", "zmm25", "zmm26", "zmm27",
3277   "zmm28", "zmm29", "zmm30", "zmm31"
3278 };
3279 static const char *att_names_zmm[] = {
3280   "%zmm0", "%zmm1", "%zmm2", "%zmm3",
3281   "%zmm4", "%zmm5", "%zmm6", "%zmm7",
3282   "%zmm8", "%zmm9", "%zmm10", "%zmm11",
3283   "%zmm12", "%zmm13", "%zmm14", "%zmm15",
3284   "%zmm16", "%zmm17", "%zmm18", "%zmm19",
3285   "%zmm20", "%zmm21", "%zmm22", "%zmm23",
3286   "%zmm24", "%zmm25", "%zmm26", "%zmm27",
3287   "%zmm28", "%zmm29", "%zmm30", "%zmm31"
3288 };
3289
3290 static const char **names_mask;
3291 static const char *intel_names_mask[] = {
3292   "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7"
3293 };
3294 static const char *att_names_mask[] = {
3295   "%k0", "%k1", "%k2", "%k3", "%k4", "%k5", "%k6", "%k7"
3296 };
3297
3298 static const char *names_rounding[] =
3299 {
3300   "{rn-sae}",
3301   "{rd-sae}",
3302   "{ru-sae}",
3303   "{rz-sae}"
3304 };
3305
3306 static const struct dis386 reg_table[][8] = {
3307   /* REG_80 */
3308   {
3309     { "addA",   { Ebh1, Ib }, 0 },
3310     { "orA",    { Ebh1, Ib }, 0 },
3311     { "adcA",   { Ebh1, Ib }, 0 },
3312     { "sbbA",   { Ebh1, Ib }, 0 },
3313     { "andA",   { Ebh1, Ib }, 0 },
3314     { "subA",   { Ebh1, Ib }, 0 },
3315     { "xorA",   { Ebh1, Ib }, 0 },
3316     { "cmpA",   { Eb, Ib }, 0 },
3317   },
3318   /* REG_81 */
3319   {
3320     { "addQ",   { Evh1, Iv }, 0 },
3321     { "orQ",    { Evh1, Iv }, 0 },
3322     { "adcQ",   { Evh1, Iv }, 0 },
3323     { "sbbQ",   { Evh1, Iv }, 0 },
3324     { "andQ",   { Evh1, Iv }, 0 },
3325     { "subQ",   { Evh1, Iv }, 0 },
3326     { "xorQ",   { Evh1, Iv }, 0 },
3327     { "cmpQ",   { Ev, Iv }, 0 },
3328   },
3329   /* REG_82 */
3330   {
3331     { "addQ",   { Evh1, sIb }, 0 },
3332     { "orQ",    { Evh1, sIb }, 0 },
3333     { "adcQ",   { Evh1, sIb }, 0 },
3334     { "sbbQ",   { Evh1, sIb }, 0 },
3335     { "andQ",   { Evh1, sIb }, 0 },
3336     { "subQ",   { Evh1, sIb }, 0 },
3337     { "xorQ",   { Evh1, sIb }, 0 },
3338     { "cmpQ",   { Ev, sIb }, 0 },
3339   },
3340   /* REG_8F */
3341   {
3342     { "popU",   { stackEv }, 0 },
3343     { XOP_8F_TABLE (XOP_09) },
3344     { Bad_Opcode },
3345     { Bad_Opcode },
3346     { Bad_Opcode },
3347     { XOP_8F_TABLE (XOP_09) },
3348   },
3349   /* REG_C0 */
3350   {
3351     { "rolA",   { Eb, Ib }, 0 },
3352     { "rorA",   { Eb, Ib }, 0 },
3353     { "rclA",   { Eb, Ib }, 0 },
3354     { "rcrA",   { Eb, Ib }, 0 },
3355     { "shlA",   { Eb, Ib }, 0 },
3356     { "shrA",   { Eb, Ib }, 0 },
3357     { Bad_Opcode },
3358     { "sarA",   { Eb, Ib }, 0 },
3359   },
3360   /* REG_C1 */
3361   {
3362     { "rolQ",   { Ev, Ib }, 0 },
3363     { "rorQ",   { Ev, Ib }, 0 },
3364     { "rclQ",   { Ev, Ib }, 0 },
3365     { "rcrQ",   { Ev, Ib }, 0 },
3366     { "shlQ",   { Ev, Ib }, 0 },
3367     { "shrQ",   { Ev, Ib }, 0 },
3368     { Bad_Opcode },
3369     { "sarQ",   { Ev, Ib }, 0 },
3370   },
3371   /* REG_C6 */
3372   {
3373     { "movA",   { Ebh3, Ib }, 0 },
3374     { Bad_Opcode },
3375     { Bad_Opcode },
3376     { Bad_Opcode },
3377     { Bad_Opcode },
3378     { Bad_Opcode },
3379     { Bad_Opcode },
3380     { MOD_TABLE (MOD_C6_REG_7) },
3381   },
3382   /* REG_C7 */
3383   {
3384     { "movQ",   { Evh3, Iv }, 0 },
3385     { Bad_Opcode },
3386     { Bad_Opcode },
3387     { Bad_Opcode },
3388     { Bad_Opcode },
3389     { Bad_Opcode },
3390     { Bad_Opcode },
3391     { MOD_TABLE (MOD_C7_REG_7) },
3392   },
3393   /* REG_D0 */
3394   {
3395     { "rolA",   { Eb, I1 }, 0 },
3396     { "rorA",   { Eb, I1 }, 0 },
3397     { "rclA",   { Eb, I1 }, 0 },
3398     { "rcrA",   { Eb, I1 }, 0 },
3399     { "shlA",   { Eb, I1 }, 0 },
3400     { "shrA",   { Eb, I1 }, 0 },
3401     { Bad_Opcode },
3402     { "sarA",   { Eb, I1 }, 0 },
3403   },
3404   /* REG_D1 */
3405   {
3406     { "rolQ",   { Ev, I1 }, 0 },
3407     { "rorQ",   { Ev, I1 }, 0 },
3408     { "rclQ",   { Ev, I1 }, 0 },
3409     { "rcrQ",   { Ev, I1 }, 0 },
3410     { "shlQ",   { Ev, I1 }, 0 },
3411     { "shrQ",   { Ev, I1 }, 0 },
3412     { Bad_Opcode },
3413     { "sarQ",   { Ev, I1 }, 0 },
3414   },
3415   /* REG_D2 */
3416   {
3417     { "rolA",   { Eb, CL }, 0 },
3418     { "rorA",   { Eb, CL }, 0 },
3419     { "rclA",   { Eb, CL }, 0 },
3420     { "rcrA",   { Eb, CL }, 0 },
3421     { "shlA",   { Eb, CL }, 0 },
3422     { "shrA",   { Eb, CL }, 0 },
3423     { Bad_Opcode },
3424     { "sarA",   { Eb, CL }, 0 },
3425   },
3426   /* REG_D3 */
3427   {
3428     { "rolQ",   { Ev, CL }, 0 },
3429     { "rorQ",   { Ev, CL }, 0 },
3430     { "rclQ",   { Ev, CL }, 0 },
3431     { "rcrQ",   { Ev, CL }, 0 },
3432     { "shlQ",   { Ev, CL }, 0 },
3433     { "shrQ",   { Ev, CL }, 0 },
3434     { Bad_Opcode },
3435     { "sarQ",   { Ev, CL }, 0 },
3436   },
3437   /* REG_F6 */
3438   {
3439     { "testA",  { Eb, Ib }, 0 },
3440     { Bad_Opcode },
3441     { "notA",   { Ebh1 }, 0 },
3442     { "negA",   { Ebh1 }, 0 },
3443     { "mulA",   { Eb }, 0 },    /* Don't print the implicit %al register,  */
3444     { "imulA",  { Eb }, 0 },    /* to distinguish these opcodes from other */
3445     { "divA",   { Eb }, 0 },    /* mul/imul opcodes.  Do the same for div  */
3446     { "idivA",  { Eb }, 0 },    /* and idiv for consistency.               */
3447   },
3448   /* REG_F7 */
3449   {
3450     { "testQ",  { Ev, Iv }, 0 },
3451     { Bad_Opcode },
3452     { "notQ",   { Evh1 }, 0 },
3453     { "negQ",   { Evh1 }, 0 },
3454     { "mulQ",   { Ev }, 0 },    /* Don't print the implicit register.  */
3455     { "imulQ",  { Ev }, 0 },
3456     { "divQ",   { Ev }, 0 },
3457     { "idivQ",  { Ev }, 0 },
3458   },
3459   /* REG_FE */
3460   {
3461     { "incA",   { Ebh1 }, 0 },
3462     { "decA",   { Ebh1 }, 0 },
3463   },
3464   /* REG_FF */
3465   {
3466     { "incQ",   { Evh1 }, 0 },
3467     { "decQ",   { Evh1 }, 0 },
3468     { "call{T|}", { indirEv, BND }, 0 },
3469     { MOD_TABLE (MOD_FF_REG_3) },
3470     { "jmp{T|}", { indirEv, BND }, 0 },
3471     { MOD_TABLE (MOD_FF_REG_5) },
3472     { "pushU",  { stackEv }, 0 },
3473     { Bad_Opcode },
3474   },
3475   /* REG_0F00 */
3476   {
3477     { "sldtD",  { Sv }, 0 },
3478     { "strD",   { Sv }, 0 },
3479     { "lldt",   { Ew }, 0 },
3480     { "ltr",    { Ew }, 0 },
3481     { "verr",   { Ew }, 0 },
3482     { "verw",   { Ew }, 0 },
3483     { Bad_Opcode },
3484     { Bad_Opcode },
3485   },
3486   /* REG_0F01 */
3487   {
3488     { MOD_TABLE (MOD_0F01_REG_0) },
3489     { MOD_TABLE (MOD_0F01_REG_1) },
3490     { MOD_TABLE (MOD_0F01_REG_2) },
3491     { MOD_TABLE (MOD_0F01_REG_3) },
3492     { "smswD",  { Sv }, 0 },
3493     { Bad_Opcode },
3494     { "lmsw",   { Ew }, 0 },
3495     { MOD_TABLE (MOD_0F01_REG_7) },
3496   },
3497   /* REG_0F0D */
3498   {
3499     { "prefetch",       { Mb }, 0 },
3500     { "prefetchw",      { Mb }, 0 },
3501     { "prefetchwt1",    { Mb }, 0 },
3502     { "prefetch",       { Mb }, 0 },
3503     { "prefetch",       { Mb }, 0 },
3504     { "prefetch",       { Mb }, 0 },
3505     { "prefetch",       { Mb }, 0 },
3506     { "prefetch",       { Mb }, 0 },
3507   },
3508   /* REG_0F18 */
3509   {
3510     { MOD_TABLE (MOD_0F18_REG_0) },
3511     { MOD_TABLE (MOD_0F18_REG_1) },
3512     { MOD_TABLE (MOD_0F18_REG_2) },
3513     { MOD_TABLE (MOD_0F18_REG_3) },
3514     { MOD_TABLE (MOD_0F18_REG_4) },
3515     { MOD_TABLE (MOD_0F18_REG_5) },
3516     { MOD_TABLE (MOD_0F18_REG_6) },
3517     { MOD_TABLE (MOD_0F18_REG_7) },
3518   },
3519   /* REG_0F71 */
3520   {
3521     { Bad_Opcode },
3522     { Bad_Opcode },
3523     { MOD_TABLE (MOD_0F71_REG_2) },
3524     { Bad_Opcode },
3525     { MOD_TABLE (MOD_0F71_REG_4) },
3526     { Bad_Opcode },
3527     { MOD_TABLE (MOD_0F71_REG_6) },
3528   },
3529   /* REG_0F72 */
3530   {
3531     { Bad_Opcode },
3532     { Bad_Opcode },
3533     { MOD_TABLE (MOD_0F72_REG_2) },
3534     { Bad_Opcode },
3535     { MOD_TABLE (MOD_0F72_REG_4) },
3536     { Bad_Opcode },
3537     { MOD_TABLE (MOD_0F72_REG_6) },
3538   },
3539   /* REG_0F73 */
3540   {
3541     { Bad_Opcode },
3542     { Bad_Opcode },
3543     { MOD_TABLE (MOD_0F73_REG_2) },
3544     { MOD_TABLE (MOD_0F73_REG_3) },
3545     { Bad_Opcode },
3546     { Bad_Opcode },
3547     { MOD_TABLE (MOD_0F73_REG_6) },
3548     { MOD_TABLE (MOD_0F73_REG_7) },
3549   },
3550   /* REG_0FA6 */
3551   {
3552     { "montmul",        { { OP_0f07, 0 } }, 0 },
3553     { "xsha1",          { { OP_0f07, 0 } }, 0 },
3554     { "xsha256",        { { OP_0f07, 0 } }, 0 },
3555   },
3556   /* REG_0FA7 */
3557   {
3558     { "xstore-rng",     { { OP_0f07, 0 } }, 0 },
3559     { "xcrypt-ecb",     { { OP_0f07, 0 } }, 0 },
3560     { "xcrypt-cbc",     { { OP_0f07, 0 } }, 0 },
3561     { "xcrypt-ctr",     { { OP_0f07, 0 } }, 0 },
3562     { "xcrypt-cfb",     { { OP_0f07, 0 } }, 0 },
3563     { "xcrypt-ofb",     { { OP_0f07, 0 } }, 0 },
3564   },
3565   /* REG_0FAE */
3566   {
3567     { MOD_TABLE (MOD_0FAE_REG_0) },
3568     { MOD_TABLE (MOD_0FAE_REG_1) },
3569     { MOD_TABLE (MOD_0FAE_REG_2) },
3570     { MOD_TABLE (MOD_0FAE_REG_3) },
3571     { MOD_TABLE (MOD_0FAE_REG_4) },
3572     { MOD_TABLE (MOD_0FAE_REG_5) },
3573     { MOD_TABLE (MOD_0FAE_REG_6) },
3574     { MOD_TABLE (MOD_0FAE_REG_7) },
3575   },
3576   /* REG_0FBA */
3577   {
3578     { Bad_Opcode },
3579     { Bad_Opcode },
3580     { Bad_Opcode },
3581     { Bad_Opcode },
3582     { "btQ",    { Ev, Ib }, 0 },
3583     { "btsQ",   { Evh1, Ib }, 0 },
3584     { "btrQ",   { Evh1, Ib }, 0 },
3585     { "btcQ",   { Evh1, Ib }, 0 },
3586   },
3587   /* REG_0FC7 */
3588   {
3589     { Bad_Opcode },
3590     { "cmpxchg8b", { { CMPXCHG8B_Fixup, q_mode } }, 0 },
3591     { Bad_Opcode },
3592     { MOD_TABLE (MOD_0FC7_REG_3) },
3593     { MOD_TABLE (MOD_0FC7_REG_4) },
3594     { MOD_TABLE (MOD_0FC7_REG_5) },
3595     { MOD_TABLE (MOD_0FC7_REG_6) },
3596     { MOD_TABLE (MOD_0FC7_REG_7) },
3597   },
3598   /* REG_VEX_0F71 */
3599   {
3600     { Bad_Opcode },
3601     { Bad_Opcode },
3602     { MOD_TABLE (MOD_VEX_0F71_REG_2) },
3603     { Bad_Opcode },
3604     { MOD_TABLE (MOD_VEX_0F71_REG_4) },
3605     { Bad_Opcode },
3606     { MOD_TABLE (MOD_VEX_0F71_REG_6) },
3607   },
3608   /* REG_VEX_0F72 */
3609   {
3610     { Bad_Opcode },
3611     { Bad_Opcode },
3612     { MOD_TABLE (MOD_VEX_0F72_REG_2) },
3613     { Bad_Opcode },
3614     { MOD_TABLE (MOD_VEX_0F72_REG_4) },
3615     { Bad_Opcode },
3616     { MOD_TABLE (MOD_VEX_0F72_REG_6) },
3617   },
3618   /* REG_VEX_0F73 */
3619   {
3620     { Bad_Opcode },
3621     { Bad_Opcode },
3622     { MOD_TABLE (MOD_VEX_0F73_REG_2) },
3623     { MOD_TABLE (MOD_VEX_0F73_REG_3) },
3624     { Bad_Opcode },
3625     { Bad_Opcode },
3626     { MOD_TABLE (MOD_VEX_0F73_REG_6) },
3627     { MOD_TABLE (MOD_VEX_0F73_REG_7) },
3628   },
3629   /* REG_VEX_0FAE */
3630   {
3631     { Bad_Opcode },
3632     { Bad_Opcode },
3633     { MOD_TABLE (MOD_VEX_0FAE_REG_2) },
3634     { MOD_TABLE (MOD_VEX_0FAE_REG_3) },
3635   },
3636   /* REG_VEX_0F38F3 */
3637   {
3638     { Bad_Opcode },
3639     { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_1) },
3640     { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_2) },
3641     { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_3) },
3642   },
3643   /* REG_XOP_LWPCB */
3644   {
3645     { "llwpcb", { { OP_LWPCB_E, 0 } }, 0 },
3646     { "slwpcb", { { OP_LWPCB_E, 0 } }, 0 },
3647   },
3648   /* REG_XOP_LWP */
3649   {
3650     { "lwpins", { { OP_LWP_E, 0 }, Ed, Iq }, 0 },
3651     { "lwpval", { { OP_LWP_E, 0 }, Ed, Iq }, 0 },
3652   },
3653   /* REG_XOP_TBM_01 */
3654   {
3655     { Bad_Opcode },
3656     { "blcfill",        { { OP_LWP_E, 0 }, Ev }, 0 },
3657     { "blsfill",        { { OP_LWP_E, 0 }, Ev }, 0 },
3658     { "blcs",   { { OP_LWP_E, 0 }, Ev }, 0 },
3659     { "tzmsk",  { { OP_LWP_E, 0 }, Ev }, 0 },
3660     { "blcic",  { { OP_LWP_E, 0 }, Ev }, 0 },
3661     { "blsic",  { { OP_LWP_E, 0 }, Ev }, 0 },
3662     { "t1mskc", { { OP_LWP_E, 0 }, Ev }, 0 },
3663   },
3664   /* REG_XOP_TBM_02 */
3665   {
3666     { Bad_Opcode },
3667     { "blcmsk", { { OP_LWP_E, 0 }, Ev }, 0 },
3668     { Bad_Opcode },
3669     { Bad_Opcode },
3670     { Bad_Opcode },
3671     { Bad_Opcode },
3672     { "blci",   { { OP_LWP_E, 0 }, Ev }, 0 },
3673   },
3674 #define NEED_REG_TABLE
3675 #include "i386-dis-evex.h"
3676 #undef NEED_REG_TABLE
3677 };
3678
3679 static const struct dis386 prefix_table[][4] = {
3680   /* PREFIX_90 */
3681   {
3682     { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } }, 0 },
3683     { "pause", { XX }, 0 },
3684     { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } }, 0 },
3685     { NULL, { { NULL, 0 } }, PREFIX_IGNORED }
3686   },
3687
3688   /* PREFIX_0F10 */
3689   {
3690     { "movups", { XM, EXx }, PREFIX_OPCODE },
3691     { "movss",  { XM, EXd }, PREFIX_OPCODE },
3692     { "movupd", { XM, EXx }, PREFIX_OPCODE },
3693     { "movsd",  { XM, EXq }, PREFIX_OPCODE },
3694   },
3695
3696   /* PREFIX_0F11 */
3697   {
3698     { "movups", { EXxS, XM }, PREFIX_OPCODE },
3699     { "movss",  { EXdS, XM }, PREFIX_OPCODE },
3700     { "movupd", { EXxS, XM }, PREFIX_OPCODE },
3701     { "movsd",  { EXqS, XM }, PREFIX_OPCODE },
3702   },
3703
3704   /* PREFIX_0F12 */
3705   {
3706     { MOD_TABLE (MOD_0F12_PREFIX_0) },
3707     { "movsldup", { XM, EXx }, PREFIX_OPCODE },
3708     { "movlpd", { XM, EXq }, PREFIX_OPCODE },
3709     { "movddup", { XM, EXq }, PREFIX_OPCODE },
3710   },
3711
3712   /* PREFIX_0F16 */
3713   {
3714     { MOD_TABLE (MOD_0F16_PREFIX_0) },
3715     { "movshdup", { XM, EXx }, PREFIX_OPCODE },
3716     { "movhpd", { XM, EXq }, PREFIX_OPCODE },
3717   },
3718
3719   /* PREFIX_0F1A */
3720   {
3721     { MOD_TABLE (MOD_0F1A_PREFIX_0) },
3722     { "bndcl",  { Gbnd, Ev_bnd }, 0 },
3723     { "bndmov", { Gbnd, Ebnd }, 0 },
3724     { "bndcu",  { Gbnd, Ev_bnd }, 0 },
3725   },
3726
3727   /* PREFIX_0F1B */
3728   {
3729     { MOD_TABLE (MOD_0F1B_PREFIX_0) },
3730     { MOD_TABLE (MOD_0F1B_PREFIX_1) },
3731     { "bndmov", { Ebnd, Gbnd }, 0 },
3732     { "bndcn",  { Gbnd, Ev_bnd }, 0 },
3733   },
3734
3735   /* PREFIX_0F2A */
3736   {
3737     { "cvtpi2ps", { XM, EMCq }, PREFIX_OPCODE },
3738     { "cvtsi2ss%LQ", { XM, Ev }, PREFIX_OPCODE },
3739     { "cvtpi2pd", { XM, EMCq }, PREFIX_OPCODE },
3740     { "cvtsi2sd%LQ", { XM, Ev }, 0 },
3741   },
3742
3743   /* PREFIX_0F2B */
3744   {
3745     { MOD_TABLE (MOD_0F2B_PREFIX_0) },
3746     { MOD_TABLE (MOD_0F2B_PREFIX_1) },
3747     { MOD_TABLE (MOD_0F2B_PREFIX_2) },
3748     { MOD_TABLE (MOD_0F2B_PREFIX_3) },
3749   },
3750
3751   /* PREFIX_0F2C */
3752   {
3753     { "cvttps2pi", { MXC, EXq }, PREFIX_OPCODE },
3754     { "cvttss2siY", { Gv, EXd }, PREFIX_OPCODE },
3755     { "cvttpd2pi", { MXC, EXx }, PREFIX_OPCODE },
3756     { "cvttsd2siY", { Gv, EXq }, PREFIX_OPCODE },
3757   },
3758
3759   /* PREFIX_0F2D */
3760   {
3761     { "cvtps2pi", { MXC, EXq }, PREFIX_OPCODE },
3762     { "cvtss2siY", { Gv, EXd }, PREFIX_OPCODE },
3763     { "cvtpd2pi", { MXC, EXx }, PREFIX_OPCODE },
3764     { "cvtsd2siY", { Gv, EXq }, PREFIX_OPCODE },
3765   },
3766
3767   /* PREFIX_0F2E */
3768   {
3769     { "ucomiss",{ XM, EXd }, 0 },
3770     { Bad_Opcode },
3771     { "ucomisd",{ XM, EXq }, 0 },
3772   },
3773
3774   /* PREFIX_0F2F */
3775   {
3776     { "comiss", { XM, EXd }, 0 },
3777     { Bad_Opcode },
3778     { "comisd", { XM, EXq }, 0 },
3779   },
3780
3781   /* PREFIX_0F51 */
3782   {
3783     { "sqrtps", { XM, EXx }, PREFIX_OPCODE },
3784     { "sqrtss", { XM, EXd }, PREFIX_OPCODE },
3785     { "sqrtpd", { XM, EXx }, PREFIX_OPCODE },
3786     { "sqrtsd", { XM, EXq }, PREFIX_OPCODE },
3787   },
3788
3789   /* PREFIX_0F52 */
3790   {
3791     { "rsqrtps",{ XM, EXx }, PREFIX_OPCODE },
3792     { "rsqrtss",{ XM, EXd }, PREFIX_OPCODE },
3793   },
3794
3795   /* PREFIX_0F53 */
3796   {
3797     { "rcpps",  { XM, EXx }, PREFIX_OPCODE },
3798     { "rcpss",  { XM, EXd }, PREFIX_OPCODE },
3799   },
3800
3801   /* PREFIX_0F58 */
3802   {
3803     { "addps", { XM, EXx }, PREFIX_OPCODE },
3804     { "addss", { XM, EXd }, PREFIX_OPCODE },
3805     { "addpd", { XM, EXx }, PREFIX_OPCODE },
3806     { "addsd", { XM, EXq }, PREFIX_OPCODE },
3807   },
3808
3809   /* PREFIX_0F59 */
3810   {
3811     { "mulps",  { XM, EXx }, PREFIX_OPCODE },
3812     { "mulss",  { XM, EXd }, PREFIX_OPCODE },
3813     { "mulpd",  { XM, EXx }, PREFIX_OPCODE },
3814     { "mulsd",  { XM, EXq }, PREFIX_OPCODE },
3815   },
3816
3817   /* PREFIX_0F5A */
3818   {
3819     { "cvtps2pd", { XM, EXq }, PREFIX_OPCODE },
3820     { "cvtss2sd", { XM, EXd }, PREFIX_OPCODE },
3821     { "cvtpd2ps", { XM, EXx }, PREFIX_OPCODE },
3822     { "cvtsd2ss", { XM, EXq }, PREFIX_OPCODE },
3823   },
3824
3825   /* PREFIX_0F5B */
3826   {
3827     { "cvtdq2ps", { XM, EXx }, PREFIX_OPCODE },
3828     { "cvttps2dq", { XM, EXx }, PREFIX_OPCODE },
3829     { "cvtps2dq", { XM, EXx }, PREFIX_OPCODE },
3830   },
3831
3832   /* PREFIX_0F5C */
3833   {
3834     { "subps",  { XM, EXx }, PREFIX_OPCODE },
3835     { "subss",  { XM, EXd }, PREFIX_OPCODE },
3836     { "subpd",  { XM, EXx }, PREFIX_OPCODE },
3837     { "subsd",  { XM, EXq }, PREFIX_OPCODE },
3838   },
3839
3840   /* PREFIX_0F5D */
3841   {
3842     { "minps",  { XM, EXx }, PREFIX_OPCODE },
3843     { "minss",  { XM, EXd }, PREFIX_OPCODE },
3844     { "minpd",  { XM, EXx }, PREFIX_OPCODE },
3845     { "minsd",  { XM, EXq }, PREFIX_OPCODE },
3846   },
3847
3848   /* PREFIX_0F5E */
3849   {
3850     { "divps",  { XM, EXx }, PREFIX_OPCODE },
3851     { "divss",  { XM, EXd }, PREFIX_OPCODE },
3852     { "divpd",  { XM, EXx }, PREFIX_OPCODE },
3853     { "divsd",  { XM, EXq }, PREFIX_OPCODE },
3854   },
3855
3856   /* PREFIX_0F5F */
3857   {
3858     { "maxps",  { XM, EXx }, PREFIX_OPCODE },
3859     { "maxss",  { XM, EXd }, PREFIX_OPCODE },
3860     { "maxpd",  { XM, EXx }, PREFIX_OPCODE },
3861     { "maxsd",  { XM, EXq }, PREFIX_OPCODE },
3862   },
3863
3864   /* PREFIX_0F60 */
3865   {
3866     { "punpcklbw",{ MX, EMd }, PREFIX_OPCODE },
3867     { Bad_Opcode },
3868     { "punpcklbw",{ MX, EMx }, PREFIX_OPCODE },
3869   },
3870
3871   /* PREFIX_0F61 */
3872   {
3873     { "punpcklwd",{ MX, EMd }, PREFIX_OPCODE },
3874     { Bad_Opcode },
3875     { "punpcklwd",{ MX, EMx }, PREFIX_OPCODE },
3876   },
3877
3878   /* PREFIX_0F62 */
3879   {
3880     { "punpckldq",{ MX, EMd }, PREFIX_OPCODE },
3881     { Bad_Opcode },
3882     { "punpckldq",{ MX, EMx }, PREFIX_OPCODE },
3883   },
3884
3885   /* PREFIX_0F6C */
3886   {
3887     { Bad_Opcode },
3888     { Bad_Opcode },
3889     { "punpcklqdq", { XM, EXx }, PREFIX_OPCODE },
3890   },
3891
3892   /* PREFIX_0F6D */
3893   {
3894     { Bad_Opcode },
3895     { Bad_Opcode },
3896     { "punpckhqdq", { XM, EXx }, PREFIX_OPCODE },
3897   },
3898
3899   /* PREFIX_0F6F */
3900   {
3901     { "movq",   { MX, EM }, PREFIX_OPCODE },
3902     { "movdqu", { XM, EXx }, PREFIX_OPCODE },
3903     { "movdqa", { XM, EXx }, PREFIX_OPCODE },
3904   },
3905
3906   /* PREFIX_0F70 */
3907   {
3908     { "pshufw", { MX, EM, Ib }, PREFIX_OPCODE },
3909     { "pshufhw",{ XM, EXx, Ib }, PREFIX_OPCODE },
3910     { "pshufd", { XM, EXx, Ib }, PREFIX_OPCODE },
3911     { "pshuflw",{ XM, EXx, Ib }, PREFIX_OPCODE },
3912   },
3913
3914   /* PREFIX_0F73_REG_3 */
3915   {
3916     { Bad_Opcode },
3917     { Bad_Opcode },
3918     { "psrldq", { XS, Ib }, 0 },
3919   },
3920
3921   /* PREFIX_0F73_REG_7 */
3922   {
3923     { Bad_Opcode },
3924     { Bad_Opcode },
3925     { "pslldq", { XS, Ib }, 0 },
3926   },
3927
3928   /* PREFIX_0F78 */
3929   {
3930     {"vmread",  { Em, Gm }, 0 },
3931     { Bad_Opcode },
3932     {"extrq",   { XS, Ib, Ib }, 0 },
3933     {"insertq", { XM, XS, Ib, Ib }, 0 },
3934   },
3935
3936   /* PREFIX_0F79 */
3937   {
3938     {"vmwrite", { Gm, Em }, 0 },
3939     { Bad_Opcode },
3940     {"extrq",   { XM, XS }, 0 },
3941     {"insertq", { XM, XS }, 0 },
3942   },
3943
3944   /* PREFIX_0F7C */
3945   {
3946     { Bad_Opcode },
3947     { Bad_Opcode },
3948     { "haddpd", { XM, EXx }, PREFIX_OPCODE },
3949     { "haddps", { XM, EXx }, PREFIX_OPCODE },
3950   },
3951
3952   /* PREFIX_0F7D */
3953   {
3954     { Bad_Opcode },
3955     { Bad_Opcode },
3956     { "hsubpd", { XM, EXx }, PREFIX_OPCODE },
3957     { "hsubps", { XM, EXx }, PREFIX_OPCODE },
3958   },
3959
3960   /* PREFIX_0F7E */
3961   {
3962     { "movK",   { Edq, MX }, PREFIX_OPCODE },
3963     { "movq",   { XM, EXq }, PREFIX_OPCODE },
3964     { "movK",   { Edq, XM }, PREFIX_OPCODE },
3965   },
3966
3967   /* PREFIX_0F7F */
3968   {
3969     { "movq",   { EMS, MX }, PREFIX_OPCODE },
3970     { "movdqu", { EXxS, XM }, PREFIX_OPCODE },
3971     { "movdqa", { EXxS, XM }, PREFIX_OPCODE },
3972   },
3973
3974   /* PREFIX_0FAE_REG_0 */
3975   {
3976     { Bad_Opcode },
3977     { "rdfsbase", { Ev }, 0 },
3978   },
3979
3980   /* PREFIX_0FAE_REG_1 */
3981   {
3982     { Bad_Opcode },
3983     { "rdgsbase", { Ev }, 0 },
3984   },
3985
3986   /* PREFIX_0FAE_REG_2 */
3987   {
3988     { Bad_Opcode },
3989     { "wrfsbase", { Ev }, 0 },
3990   },
3991
3992   /* PREFIX_0FAE_REG_3 */
3993   {
3994     { Bad_Opcode },
3995     { "wrgsbase", { Ev }, 0 },
3996   },
3997
3998   /* PREFIX_0FAE_REG_6 */
3999   {
4000     { "xsaveopt",      { FXSAVE }, 0 },
4001     { Bad_Opcode },
4002     { "clwb",   { Mb }, 0 },
4003   },
4004
4005   /* PREFIX_0FAE_REG_7 */
4006   {
4007     { "clflush",        { Mb }, 0 },
4008     { Bad_Opcode },
4009     { "clflushopt",     { Mb }, 0 },
4010   },
4011
4012   /* PREFIX_RM_0_0FAE_REG_7 */
4013   {
4014     { "sfence",         { Skip_MODRM }, 0 },
4015     { Bad_Opcode },
4016     { "pcommit",                { Skip_MODRM }, 0 },
4017   },
4018
4019   /* PREFIX_0FB8 */
4020   {
4021     { Bad_Opcode },
4022     { "popcntS", { Gv, Ev }, 0 },
4023   },
4024
4025   /* PREFIX_0FBC */
4026   {
4027     { "bsfS",   { Gv, Ev }, 0 },
4028     { "tzcntS", { Gv, Ev }, 0 },
4029     { "bsfS",   { Gv, Ev }, 0 },
4030   },
4031
4032   /* PREFIX_0FBD */
4033   {
4034     { "bsrS",   { Gv, Ev }, 0 },
4035     { "lzcntS", { Gv, Ev }, 0 },
4036     { "bsrS",   { Gv, Ev }, 0 },
4037   },
4038
4039   /* PREFIX_0FC2 */
4040   {
4041     { "cmpps",  { XM, EXx, CMP }, PREFIX_OPCODE },
4042     { "cmpss",  { XM, EXd, CMP }, PREFIX_OPCODE },
4043     { "cmppd",  { XM, EXx, CMP }, PREFIX_OPCODE },
4044     { "cmpsd",  { XM, EXq, CMP }, PREFIX_OPCODE },
4045   },
4046
4047   /* PREFIX_0FC3 */
4048   {
4049     { "movntiS", { Ma, Gv }, PREFIX_OPCODE },
4050   },
4051
4052   /* PREFIX_MOD_0_0FC7_REG_6 */
4053   {
4054     { "vmptrld",{ Mq }, 0 },
4055     { "vmxon",  { Mq }, 0 },
4056     { "vmclear",{ Mq }, 0 },
4057   },
4058
4059   /* PREFIX_MOD_3_0FC7_REG_6 */
4060   {
4061     { "rdrand", { Ev }, 0 },
4062     { Bad_Opcode },
4063     { "rdrand", { Ev }, 0 }
4064   },
4065
4066   /* PREFIX_MOD_3_0FC7_REG_7 */
4067   {
4068     { "rdseed", { Ev }, 0 },
4069     { Bad_Opcode },
4070     { "rdseed", { Ev }, 0 },
4071   },
4072
4073   /* PREFIX_0FD0 */
4074   {
4075     { Bad_Opcode },
4076     { Bad_Opcode },
4077     { "addsubpd", { XM, EXx }, 0 },
4078     { "addsubps", { XM, EXx }, 0 },
4079   },
4080
4081   /* PREFIX_0FD6 */
4082   {
4083     { Bad_Opcode },
4084     { "movq2dq",{ XM, MS }, 0 },
4085     { "movq",   { EXqS, XM }, 0 },
4086     { "movdq2q",{ MX, XS }, 0 },
4087   },
4088
4089   /* PREFIX_0FE6 */
4090   {
4091     { Bad_Opcode },
4092     { "cvtdq2pd", { XM, EXq }, PREFIX_OPCODE },
4093     { "cvttpd2dq", { XM, EXx }, PREFIX_OPCODE },
4094     { "cvtpd2dq", { XM, EXx }, PREFIX_OPCODE },
4095   },
4096
4097   /* PREFIX_0FE7 */
4098   {
4099     { "movntq", { Mq, MX }, PREFIX_OPCODE },
4100     { Bad_Opcode },
4101     { MOD_TABLE (MOD_0FE7_PREFIX_2) },
4102   },
4103
4104   /* PREFIX_0FF0 */
4105   {
4106     { Bad_Opcode },
4107     { Bad_Opcode },
4108     { Bad_Opcode },
4109     { MOD_TABLE (MOD_0FF0_PREFIX_3) },
4110   },
4111
4112   /* PREFIX_0FF7 */
4113   {
4114     { "maskmovq", { MX, MS }, PREFIX_OPCODE },
4115     { Bad_Opcode },
4116     { "maskmovdqu", { XM, XS }, PREFIX_OPCODE },
4117   },
4118
4119   /* PREFIX_0F3810 */
4120   {
4121     { Bad_Opcode },
4122     { Bad_Opcode },
4123     { "pblendvb", { XM, EXx, XMM0 }, PREFIX_OPCODE },
4124   },
4125
4126   /* PREFIX_0F3814 */
4127   {
4128     { Bad_Opcode },
4129     { Bad_Opcode },
4130     { "blendvps", { XM, EXx, XMM0 }, PREFIX_OPCODE },
4131   },
4132
4133   /* PREFIX_0F3815 */
4134   {
4135     { Bad_Opcode },
4136     { Bad_Opcode },
4137     { "blendvpd", { XM, EXx, XMM0 }, PREFIX_OPCODE },
4138   },
4139
4140   /* PREFIX_0F3817 */
4141   {
4142     { Bad_Opcode },
4143     { Bad_Opcode },
4144     { "ptest",  { XM, EXx }, PREFIX_OPCODE },
4145   },
4146
4147   /* PREFIX_0F3820 */
4148   {
4149     { Bad_Opcode },
4150     { Bad_Opcode },
4151     { "pmovsxbw", { XM, EXq }, PREFIX_OPCODE },
4152   },
4153
4154   /* PREFIX_0F3821 */
4155   {
4156     { Bad_Opcode },
4157     { Bad_Opcode },
4158     { "pmovsxbd", { XM, EXd }, PREFIX_OPCODE },
4159   },
4160
4161   /* PREFIX_0F3822 */
4162   {
4163     { Bad_Opcode },
4164     { Bad_Opcode },
4165     { "pmovsxbq", { XM, EXw }, PREFIX_OPCODE },
4166   },
4167
4168   /* PREFIX_0F3823 */
4169   {
4170     { Bad_Opcode },
4171     { Bad_Opcode },
4172     { "pmovsxwd", { XM, EXq }, PREFIX_OPCODE },
4173   },
4174
4175   /* PREFIX_0F3824 */
4176   {
4177     { Bad_Opcode },
4178     { Bad_Opcode },
4179     { "pmovsxwq", { XM, EXd }, PREFIX_OPCODE },
4180   },
4181
4182   /* PREFIX_0F3825 */
4183   {
4184     { Bad_Opcode },
4185     { Bad_Opcode },
4186     { "pmovsxdq", { XM, EXq }, PREFIX_OPCODE },
4187   },
4188
4189   /* PREFIX_0F3828 */
4190   {
4191     { Bad_Opcode },
4192     { Bad_Opcode },
4193     { "pmuldq", { XM, EXx }, PREFIX_OPCODE },
4194   },
4195
4196   /* PREFIX_0F3829 */
4197   {
4198     { Bad_Opcode },
4199     { Bad_Opcode },
4200     { "pcmpeqq", { XM, EXx }, PREFIX_OPCODE },
4201   },
4202
4203   /* PREFIX_0F382A */
4204   {
4205     { Bad_Opcode },
4206     { Bad_Opcode },
4207     { MOD_TABLE (MOD_0F382A_PREFIX_2) },
4208   },
4209
4210   /* PREFIX_0F382B */
4211   {
4212     { Bad_Opcode },
4213     { Bad_Opcode },
4214     { "packusdw", { XM, EXx }, PREFIX_OPCODE },
4215   },
4216
4217   /* PREFIX_0F3830 */
4218   {
4219     { Bad_Opcode },
4220     { Bad_Opcode },
4221     { "pmovzxbw", { XM, EXq }, PREFIX_OPCODE },
4222   },
4223
4224   /* PREFIX_0F3831 */
4225   {
4226     { Bad_Opcode },
4227     { Bad_Opcode },
4228     { "pmovzxbd", { XM, EXd }, PREFIX_OPCODE },
4229   },
4230
4231   /* PREFIX_0F3832 */
4232   {
4233     { Bad_Opcode },
4234     { Bad_Opcode },
4235     { "pmovzxbq", { XM, EXw }, PREFIX_OPCODE },
4236   },
4237
4238   /* PREFIX_0F3833 */
4239   {
4240     { Bad_Opcode },
4241     { Bad_Opcode },
4242     { "pmovzxwd", { XM, EXq }, PREFIX_OPCODE },
4243   },
4244
4245   /* PREFIX_0F3834 */
4246   {
4247     { Bad_Opcode },
4248     { Bad_Opcode },
4249     { "pmovzxwq", { XM, EXd }, PREFIX_OPCODE },
4250   },
4251
4252   /* PREFIX_0F3835 */
4253   {
4254     { Bad_Opcode },
4255     { Bad_Opcode },
4256     { "pmovzxdq", { XM, EXq }, PREFIX_OPCODE },
4257   },
4258
4259   /* PREFIX_0F3837 */
4260   {
4261     { Bad_Opcode },
4262     { Bad_Opcode },
4263     { "pcmpgtq", { XM, EXx }, PREFIX_OPCODE },
4264   },
4265
4266   /* PREFIX_0F3838 */
4267   {
4268     { Bad_Opcode },
4269     { Bad_Opcode },
4270     { "pminsb", { XM, EXx }, PREFIX_OPCODE },
4271   },
4272
4273   /* PREFIX_0F3839 */
4274   {
4275     { Bad_Opcode },
4276     { Bad_Opcode },
4277     { "pminsd", { XM, EXx }, PREFIX_OPCODE },
4278   },
4279
4280   /* PREFIX_0F383A */
4281   {
4282     { Bad_Opcode },
4283     { Bad_Opcode },
4284     { "pminuw", { XM, EXx }, PREFIX_OPCODE },
4285   },
4286
4287   /* PREFIX_0F383B */
4288   {
4289     { Bad_Opcode },
4290     { Bad_Opcode },
4291     { "pminud", { XM, EXx }, PREFIX_OPCODE },
4292   },
4293
4294   /* PREFIX_0F383C */
4295   {
4296     { Bad_Opcode },
4297     { Bad_Opcode },
4298     { "pmaxsb", { XM, EXx }, PREFIX_OPCODE },
4299   },
4300
4301   /* PREFIX_0F383D */
4302   {
4303     { Bad_Opcode },
4304     { Bad_Opcode },
4305     { "pmaxsd", { XM, EXx }, PREFIX_OPCODE },
4306   },
4307
4308   /* PREFIX_0F383E */
4309   {
4310     { Bad_Opcode },
4311     { Bad_Opcode },
4312     { "pmaxuw", { XM, EXx }, PREFIX_OPCODE },
4313   },
4314
4315   /* PREFIX_0F383F */
4316   {
4317     { Bad_Opcode },
4318     { Bad_Opcode },
4319     { "pmaxud", { XM, EXx }, PREFIX_OPCODE },
4320   },
4321
4322   /* PREFIX_0F3840 */
4323   {
4324     { Bad_Opcode },
4325     { Bad_Opcode },
4326     { "pmulld", { XM, EXx }, PREFIX_OPCODE },
4327   },
4328
4329   /* PREFIX_0F3841 */
4330   {
4331     { Bad_Opcode },
4332     { Bad_Opcode },
4333     { "phminposuw", { XM, EXx }, PREFIX_OPCODE },
4334   },
4335
4336   /* PREFIX_0F3880 */
4337   {
4338     { Bad_Opcode },
4339     { Bad_Opcode },
4340     { "invept", { Gm, Mo }, PREFIX_OPCODE },
4341   },
4342
4343   /* PREFIX_0F3881 */
4344   {
4345     { Bad_Opcode },
4346     { Bad_Opcode },
4347     { "invvpid", { Gm, Mo }, PREFIX_OPCODE },
4348   },
4349
4350   /* PREFIX_0F3882 */
4351   {
4352     { Bad_Opcode },
4353     { Bad_Opcode },
4354     { "invpcid", { Gm, M }, PREFIX_OPCODE },
4355   },
4356
4357   /* PREFIX_0F38C8 */
4358   {
4359     { "sha1nexte", { XM, EXxmm }, PREFIX_OPCODE },
4360   },
4361
4362   /* PREFIX_0F38C9 */
4363   {
4364     { "sha1msg1", { XM, EXxmm }, PREFIX_OPCODE },
4365   },
4366
4367   /* PREFIX_0F38CA */
4368   {
4369     { "sha1msg2", { XM, EXxmm }, PREFIX_OPCODE },
4370   },
4371
4372   /* PREFIX_0F38CB */
4373   {
4374     { "sha256rnds2", { XM, EXxmm, XMM0 }, PREFIX_OPCODE },
4375   },
4376
4377   /* PREFIX_0F38CC */
4378   {
4379     { "sha256msg1", { XM, EXxmm }, PREFIX_OPCODE },
4380   },
4381
4382   /* PREFIX_0F38CD */
4383   {
4384     { "sha256msg2", { XM, EXxmm }, PREFIX_OPCODE },
4385   },
4386
4387   /* PREFIX_0F38DB */
4388   {
4389     { Bad_Opcode },
4390     { Bad_Opcode },
4391     { "aesimc", { XM, EXx }, PREFIX_OPCODE },
4392   },
4393
4394   /* PREFIX_0F38DC */
4395   {
4396     { Bad_Opcode },
4397     { Bad_Opcode },
4398     { "aesenc", { XM, EXx }, PREFIX_OPCODE },
4399   },
4400
4401   /* PREFIX_0F38DD */
4402   {
4403     { Bad_Opcode },
4404     { Bad_Opcode },
4405     { "aesenclast", { XM, EXx }, PREFIX_OPCODE },
4406   },
4407
4408   /* PREFIX_0F38DE */
4409   {
4410     { Bad_Opcode },
4411     { Bad_Opcode },
4412     { "aesdec", { XM, EXx }, PREFIX_OPCODE },
4413   },
4414
4415   /* PREFIX_0F38DF */
4416   {
4417     { Bad_Opcode },
4418     { Bad_Opcode },
4419     { "aesdeclast", { XM, EXx }, PREFIX_OPCODE },
4420   },
4421
4422   /* PREFIX_0F38F0 */
4423   {
4424     { "movbeS", { Gv, { MOVBE_Fixup, v_mode } }, PREFIX_OPCODE },
4425     { Bad_Opcode },
4426     { "movbeS", { Gv, { MOVBE_Fixup, v_mode } }, PREFIX_OPCODE },
4427     { "crc32",  { Gdq, { CRC32_Fixup, b_mode } }, PREFIX_OPCODE },
4428   },
4429
4430   /* PREFIX_0F38F1 */
4431   {
4432     { "movbeS", { { MOVBE_Fixup, v_mode }, Gv }, PREFIX_OPCODE },
4433     { Bad_Opcode },
4434     { "movbeS", { { MOVBE_Fixup, v_mode }, Gv }, PREFIX_OPCODE },
4435     { "crc32",  { Gdq, { CRC32_Fixup, v_mode } }, PREFIX_OPCODE },
4436   },
4437
4438   /* PREFIX_0F38F6 */
4439   {
4440     { Bad_Opcode },
4441     { "adoxS",  { Gdq, Edq}, PREFIX_OPCODE },
4442     { "adcxS",  { Gdq, Edq}, PREFIX_OPCODE },
4443     { Bad_Opcode },
4444   },
4445
4446   /* PREFIX_0F3A08 */
4447   {
4448     { Bad_Opcode },
4449     { Bad_Opcode },
4450     { "roundps", { XM, EXx, Ib }, PREFIX_OPCODE },
4451   },
4452
4453   /* PREFIX_0F3A09 */
4454   {
4455     { Bad_Opcode },
4456     { Bad_Opcode },
4457     { "roundpd", { XM, EXx, Ib }, PREFIX_OPCODE },
4458   },
4459
4460   /* PREFIX_0F3A0A */
4461   {
4462     { Bad_Opcode },
4463     { Bad_Opcode },
4464     { "roundss", { XM, EXd, Ib }, PREFIX_OPCODE },
4465   },
4466
4467   /* PREFIX_0F3A0B */
4468   {
4469     { Bad_Opcode },
4470     { Bad_Opcode },
4471     { "roundsd", { XM, EXq, Ib }, PREFIX_OPCODE },
4472   },
4473
4474   /* PREFIX_0F3A0C */
4475   {
4476     { Bad_Opcode },
4477     { Bad_Opcode },
4478     { "blendps", { XM, EXx, Ib }, PREFIX_OPCODE },
4479   },
4480
4481   /* PREFIX_0F3A0D */
4482   {
4483     { Bad_Opcode },
4484     { Bad_Opcode },
4485     { "blendpd", { XM, EXx, Ib }, PREFIX_OPCODE },
4486   },
4487
4488   /* PREFIX_0F3A0E */
4489   {
4490     { Bad_Opcode },
4491     { Bad_Opcode },
4492     { "pblendw", { XM, EXx, Ib }, PREFIX_OPCODE },
4493   },
4494
4495   /* PREFIX_0F3A14 */
4496   {
4497     { Bad_Opcode },
4498     { Bad_Opcode },
4499     { "pextrb", { Edqb, XM, Ib }, PREFIX_OPCODE },
4500   },
4501
4502   /* PREFIX_0F3A15 */
4503   {
4504     { Bad_Opcode },
4505     { Bad_Opcode },
4506     { "pextrw", { Edqw, XM, Ib }, PREFIX_OPCODE },
4507   },
4508
4509   /* PREFIX_0F3A16 */
4510   {
4511     { Bad_Opcode },
4512     { Bad_Opcode },
4513     { "pextrK", { Edq, XM, Ib }, PREFIX_OPCODE },
4514   },
4515
4516   /* PREFIX_0F3A17 */
4517   {
4518     { Bad_Opcode },
4519     { Bad_Opcode },
4520     { "extractps", { Edqd, XM, Ib }, PREFIX_OPCODE },
4521   },
4522
4523   /* PREFIX_0F3A20 */
4524   {
4525     { Bad_Opcode },
4526     { Bad_Opcode },
4527     { "pinsrb", { XM, Edqb, Ib }, PREFIX_OPCODE },
4528   },
4529
4530   /* PREFIX_0F3A21 */
4531   {
4532     { Bad_Opcode },
4533     { Bad_Opcode },
4534     { "insertps", { XM, EXd, Ib }, PREFIX_OPCODE },
4535   },
4536
4537   /* PREFIX_0F3A22 */
4538   {
4539     { Bad_Opcode },
4540     { Bad_Opcode },
4541     { "pinsrK", { XM, Edq, Ib }, PREFIX_OPCODE },
4542   },
4543
4544   /* PREFIX_0F3A40 */
4545   {
4546     { Bad_Opcode },
4547     { Bad_Opcode },
4548     { "dpps",   { XM, EXx, Ib }, PREFIX_OPCODE },
4549   },
4550
4551   /* PREFIX_0F3A41 */
4552   {
4553     { Bad_Opcode },
4554     { Bad_Opcode },
4555     { "dppd",   { XM, EXx, Ib }, PREFIX_OPCODE },
4556   },
4557
4558   /* PREFIX_0F3A42 */
4559   {
4560     { Bad_Opcode },
4561     { Bad_Opcode },
4562     { "mpsadbw", { XM, EXx, Ib }, PREFIX_OPCODE },
4563   },
4564
4565   /* PREFIX_0F3A44 */
4566   {
4567     { Bad_Opcode },
4568     { Bad_Opcode },
4569     { "pclmulqdq", { XM, EXx, PCLMUL }, PREFIX_OPCODE },
4570   },
4571
4572   /* PREFIX_0F3A60 */
4573   {
4574     { Bad_Opcode },
4575     { Bad_Opcode },
4576     { "pcmpestrm", { XM, EXx, Ib }, PREFIX_OPCODE },
4577   },
4578
4579   /* PREFIX_0F3A61 */
4580   {
4581     { Bad_Opcode },
4582     { Bad_Opcode },
4583     { "pcmpestri", { XM, EXx, Ib }, PREFIX_OPCODE },
4584   },
4585
4586   /* PREFIX_0F3A62 */
4587   {
4588     { Bad_Opcode },
4589     { Bad_Opcode },
4590     { "pcmpistrm", { XM, EXx, Ib }, PREFIX_OPCODE },
4591   },
4592
4593   /* PREFIX_0F3A63 */
4594   {
4595     { Bad_Opcode },
4596     { Bad_Opcode },
4597     { "pcmpistri", { XM, EXx, Ib }, PREFIX_OPCODE },
4598   },
4599
4600   /* PREFIX_0F3ACC */
4601   {
4602     { "sha1rnds4", { XM, EXxmm, Ib }, PREFIX_OPCODE },
4603   },
4604
4605   /* PREFIX_0F3ADF */
4606   {
4607     { Bad_Opcode },
4608     { Bad_Opcode },
4609     { "aeskeygenassist", { XM, EXx, Ib }, PREFIX_OPCODE },
4610   },
4611
4612   /* PREFIX_VEX_0F10 */
4613   {
4614     { VEX_W_TABLE (VEX_W_0F10_P_0) },
4615     { VEX_LEN_TABLE (VEX_LEN_0F10_P_1) },
4616     { VEX_W_TABLE (VEX_W_0F10_P_2) },
4617     { VEX_LEN_TABLE (VEX_LEN_0F10_P_3) },
4618   },
4619
4620   /* PREFIX_VEX_0F11 */
4621   {
4622     { VEX_W_TABLE (VEX_W_0F11_P_0) },
4623     { VEX_LEN_TABLE (VEX_LEN_0F11_P_1) },
4624     { VEX_W_TABLE (VEX_W_0F11_P_2) },
4625     { VEX_LEN_TABLE (VEX_LEN_0F11_P_3) },
4626   },
4627
4628   /* PREFIX_VEX_0F12 */
4629   {
4630     { MOD_TABLE (MOD_VEX_0F12_PREFIX_0) },
4631     { VEX_W_TABLE (VEX_W_0F12_P_1) },
4632     { VEX_LEN_TABLE (VEX_LEN_0F12_P_2) },
4633     { VEX_W_TABLE (VEX_W_0F12_P_3) },
4634   },
4635
4636   /* PREFIX_VEX_0F16 */
4637   {
4638     { MOD_TABLE (MOD_VEX_0F16_PREFIX_0) },
4639     { VEX_W_TABLE (VEX_W_0F16_P_1) },
4640     { VEX_LEN_TABLE (VEX_LEN_0F16_P_2) },
4641   },
4642
4643   /* PREFIX_VEX_0F2A */
4644   {
4645     { Bad_Opcode },
4646     { VEX_LEN_TABLE (VEX_LEN_0F2A_P_1) },
4647     { Bad_Opcode },
4648     { VEX_LEN_TABLE (VEX_LEN_0F2A_P_3) },
4649   },
4650
4651   /* PREFIX_VEX_0F2C */
4652   {
4653     { Bad_Opcode },
4654     { VEX_LEN_TABLE (VEX_LEN_0F2C_P_1) },
4655     { Bad_Opcode },
4656     { VEX_LEN_TABLE (VEX_LEN_0F2C_P_3) },
4657   },
4658
4659   /* PREFIX_VEX_0F2D */
4660   {
4661     { Bad_Opcode },
4662     { VEX_LEN_TABLE (VEX_LEN_0F2D_P_1) },
4663     { Bad_Opcode },
4664     { VEX_LEN_TABLE (VEX_LEN_0F2D_P_3) },
4665   },
4666
4667   /* PREFIX_VEX_0F2E */
4668   {
4669     { VEX_LEN_TABLE (VEX_LEN_0F2E_P_0) },
4670     { Bad_Opcode },
4671     { VEX_LEN_TABLE (VEX_LEN_0F2E_P_2) },
4672   },
4673
4674   /* PREFIX_VEX_0F2F */
4675   {
4676     { VEX_LEN_TABLE (VEX_LEN_0F2F_P_0) },
4677     { Bad_Opcode },
4678     { VEX_LEN_TABLE (VEX_LEN_0F2F_P_2) },
4679   },
4680
4681   /* PREFIX_VEX_0F41 */
4682   {
4683     { VEX_LEN_TABLE (VEX_LEN_0F41_P_0) },
4684     { Bad_Opcode },
4685     { VEX_LEN_TABLE (VEX_LEN_0F41_P_2) },
4686   },
4687
4688   /* PREFIX_VEX_0F42 */
4689   {
4690     { VEX_LEN_TABLE (VEX_LEN_0F42_P_0) },
4691     { Bad_Opcode },
4692     { VEX_LEN_TABLE (VEX_LEN_0F42_P_2) },
4693   },
4694
4695   /* PREFIX_VEX_0F44 */
4696   {
4697     { VEX_LEN_TABLE (VEX_LEN_0F44_P_0) },
4698     { Bad_Opcode },
4699     { VEX_LEN_TABLE (VEX_LEN_0F44_P_2) },
4700   },
4701
4702   /* PREFIX_VEX_0F45 */
4703   {
4704     { VEX_LEN_TABLE (VEX_LEN_0F45_P_0) },
4705     { Bad_Opcode },
4706     { VEX_LEN_TABLE (VEX_LEN_0F45_P_2) },
4707   },
4708
4709   /* PREFIX_VEX_0F46 */
4710   {
4711     { VEX_LEN_TABLE (VEX_LEN_0F46_P_0) },
4712     { Bad_Opcode },
4713     { VEX_LEN_TABLE (VEX_LEN_0F46_P_2) },
4714   },
4715
4716   /* PREFIX_VEX_0F47 */
4717   {
4718     { VEX_LEN_TABLE (VEX_LEN_0F47_P_0) },
4719     { Bad_Opcode },
4720     { VEX_LEN_TABLE (VEX_LEN_0F47_P_2) },
4721   },
4722
4723   /* PREFIX_VEX_0F4A */
4724   {
4725     { VEX_LEN_TABLE (VEX_LEN_0F4A_P_0) },
4726     { Bad_Opcode },
4727     { VEX_LEN_TABLE (VEX_LEN_0F4A_P_2) },
4728   },
4729
4730   /* PREFIX_VEX_0F4B */
4731   {
4732     { VEX_LEN_TABLE (VEX_LEN_0F4B_P_0) },
4733     { Bad_Opcode },
4734     { VEX_LEN_TABLE (VEX_LEN_0F4B_P_2) },
4735   },
4736
4737   /* PREFIX_VEX_0F51 */
4738   {
4739     { VEX_W_TABLE (VEX_W_0F51_P_0) },
4740     { VEX_LEN_TABLE (VEX_LEN_0F51_P_1) },
4741     { VEX_W_TABLE (VEX_W_0F51_P_2) },
4742     { VEX_LEN_TABLE (VEX_LEN_0F51_P_3) },
4743   },
4744
4745   /* PREFIX_VEX_0F52 */
4746   {
4747     { VEX_W_TABLE (VEX_W_0F52_P_0) },
4748     { VEX_LEN_TABLE (VEX_LEN_0F52_P_1) },
4749   },
4750
4751   /* PREFIX_VEX_0F53 */
4752   {
4753     { VEX_W_TABLE (VEX_W_0F53_P_0) },
4754     { VEX_LEN_TABLE (VEX_LEN_0F53_P_1) },
4755   },
4756
4757   /* PREFIX_VEX_0F58 */
4758   {
4759     { VEX_W_TABLE (VEX_W_0F58_P_0) },
4760     { VEX_LEN_TABLE (VEX_LEN_0F58_P_1) },
4761     { VEX_W_TABLE (VEX_W_0F58_P_2) },
4762     { VEX_LEN_TABLE (VEX_LEN_0F58_P_3) },
4763   },
4764
4765   /* PREFIX_VEX_0F59 */
4766   {
4767     { VEX_W_TABLE (VEX_W_0F59_P_0) },
4768     { VEX_LEN_TABLE (VEX_LEN_0F59_P_1) },
4769     { VEX_W_TABLE (VEX_W_0F59_P_2) },
4770     { VEX_LEN_TABLE (VEX_LEN_0F59_P_3) },
4771   },
4772
4773   /* PREFIX_VEX_0F5A */
4774   {
4775     { VEX_W_TABLE (VEX_W_0F5A_P_0) },
4776     { VEX_LEN_TABLE (VEX_LEN_0F5A_P_1) },
4777     { "vcvtpd2ps%XY", { XMM, EXx }, 0 },
4778     { VEX_LEN_TABLE (VEX_LEN_0F5A_P_3) },
4779   },
4780
4781   /* PREFIX_VEX_0F5B */
4782   {
4783     { VEX_W_TABLE (VEX_W_0F5B_P_0) },
4784     { VEX_W_TABLE (VEX_W_0F5B_P_1) },
4785     { VEX_W_TABLE (VEX_W_0F5B_P_2) },
4786   },
4787
4788   /* PREFIX_VEX_0F5C */
4789   {
4790     { VEX_W_TABLE (VEX_W_0F5C_P_0) },
4791     { VEX_LEN_TABLE (VEX_LEN_0F5C_P_1) },
4792     { VEX_W_TABLE (VEX_W_0F5C_P_2) },
4793     { VEX_LEN_TABLE (VEX_LEN_0F5C_P_3) },
4794   },
4795
4796   /* PREFIX_VEX_0F5D */
4797   {
4798     { VEX_W_TABLE (VEX_W_0F5D_P_0) },
4799     { VEX_LEN_TABLE (VEX_LEN_0F5D_P_1) },
4800     { VEX_W_TABLE (VEX_W_0F5D_P_2) },
4801     { VEX_LEN_TABLE (VEX_LEN_0F5D_P_3) },
4802   },
4803
4804   /* PREFIX_VEX_0F5E */
4805   {
4806     { VEX_W_TABLE (VEX_W_0F5E_P_0) },
4807     { VEX_LEN_TABLE (VEX_LEN_0F5E_P_1) },
4808     { VEX_W_TABLE (VEX_W_0F5E_P_2) },
4809     { VEX_LEN_TABLE (VEX_LEN_0F5E_P_3) },
4810   },
4811
4812   /* PREFIX_VEX_0F5F */
4813   {
4814     { VEX_W_TABLE (VEX_W_0F5F_P_0) },
4815     { VEX_LEN_TABLE (VEX_LEN_0F5F_P_1) },
4816     { VEX_W_TABLE (VEX_W_0F5F_P_2) },
4817     { VEX_LEN_TABLE (VEX_LEN_0F5F_P_3) },
4818   },
4819
4820   /* PREFIX_VEX_0F60 */
4821   {
4822     { Bad_Opcode },
4823     { Bad_Opcode },
4824     { VEX_W_TABLE (VEX_W_0F60_P_2) },
4825   },
4826
4827   /* PREFIX_VEX_0F61 */
4828   {
4829     { Bad_Opcode },
4830     { Bad_Opcode },
4831     { VEX_W_TABLE (VEX_W_0F61_P_2) },
4832   },
4833
4834   /* PREFIX_VEX_0F62 */
4835   {
4836     { Bad_Opcode },
4837     { Bad_Opcode },
4838     { VEX_W_TABLE (VEX_W_0F62_P_2) },
4839   },
4840
4841   /* PREFIX_VEX_0F63 */
4842   {
4843     { Bad_Opcode },
4844     { Bad_Opcode },
4845     { VEX_W_TABLE (VEX_W_0F63_P_2) },
4846   },
4847
4848   /* PREFIX_VEX_0F64 */
4849   {
4850     { Bad_Opcode },
4851     { Bad_Opcode },
4852     { VEX_W_TABLE (VEX_W_0F64_P_2) },
4853   },
4854
4855   /* PREFIX_VEX_0F65 */
4856   {
4857     { Bad_Opcode },
4858     { Bad_Opcode },
4859     { VEX_W_TABLE (VEX_W_0F65_P_2) },
4860   },
4861
4862   /* PREFIX_VEX_0F66 */
4863   {
4864     { Bad_Opcode },
4865     { Bad_Opcode },
4866     { VEX_W_TABLE (VEX_W_0F66_P_2) },
4867   },
4868
4869   /* PREFIX_VEX_0F67 */
4870   {
4871     { Bad_Opcode },
4872     { Bad_Opcode },
4873     { VEX_W_TABLE (VEX_W_0F67_P_2) },
4874   },
4875
4876   /* PREFIX_VEX_0F68 */
4877   {
4878     { Bad_Opcode },
4879     { Bad_Opcode },
4880     { VEX_W_TABLE (VEX_W_0F68_P_2) },
4881   },
4882
4883   /* PREFIX_VEX_0F69 */
4884   {
4885     { Bad_Opcode },
4886     { Bad_Opcode },
4887     { VEX_W_TABLE (VEX_W_0F69_P_2) },
4888   },
4889
4890   /* PREFIX_VEX_0F6A */
4891   {
4892     { Bad_Opcode },
4893     { Bad_Opcode },
4894     { VEX_W_TABLE (VEX_W_0F6A_P_2) },
4895   },
4896
4897   /* PREFIX_VEX_0F6B */
4898   {
4899     { Bad_Opcode },
4900     { Bad_Opcode },
4901     { VEX_W_TABLE (VEX_W_0F6B_P_2) },
4902   },
4903
4904   /* PREFIX_VEX_0F6C */
4905   {
4906     { Bad_Opcode },
4907     { Bad_Opcode },
4908     { VEX_W_TABLE (VEX_W_0F6C_P_2) },
4909   },
4910
4911   /* PREFIX_VEX_0F6D */
4912   {
4913     { Bad_Opcode },
4914     { Bad_Opcode },
4915     { VEX_W_TABLE (VEX_W_0F6D_P_2) },
4916   },
4917
4918   /* PREFIX_VEX_0F6E */
4919   {
4920     { Bad_Opcode },
4921     { Bad_Opcode },
4922     { VEX_LEN_TABLE (VEX_LEN_0F6E_P_2) },
4923   },
4924
4925   /* PREFIX_VEX_0F6F */
4926   {
4927     { Bad_Opcode },
4928     { VEX_W_TABLE (VEX_W_0F6F_P_1) },
4929     { VEX_W_TABLE (VEX_W_0F6F_P_2) },
4930   },
4931
4932   /* PREFIX_VEX_0F70 */
4933   {
4934     { Bad_Opcode },
4935     { VEX_W_TABLE (VEX_W_0F70_P_1) },
4936     { VEX_W_TABLE (VEX_W_0F70_P_2) },
4937     { VEX_W_TABLE (VEX_W_0F70_P_3) },
4938   },
4939
4940   /* PREFIX_VEX_0F71_REG_2 */
4941   {
4942     { Bad_Opcode },
4943     { Bad_Opcode },
4944     { VEX_W_TABLE (VEX_W_0F71_R_2_P_2) },
4945   },
4946
4947   /* PREFIX_VEX_0F71_REG_4 */
4948   {
4949     { Bad_Opcode },
4950     { Bad_Opcode },
4951     { VEX_W_TABLE (VEX_W_0F71_R_4_P_2) },
4952   },
4953
4954   /* PREFIX_VEX_0F71_REG_6 */
4955   {
4956     { Bad_Opcode },
4957     { Bad_Opcode },
4958     { VEX_W_TABLE (VEX_W_0F71_R_6_P_2) },
4959   },
4960
4961   /* PREFIX_VEX_0F72_REG_2 */
4962   {
4963     { Bad_Opcode },
4964     { Bad_Opcode },
4965     { VEX_W_TABLE (VEX_W_0F72_R_2_P_2) },
4966   },
4967
4968   /* PREFIX_VEX_0F72_REG_4 */
4969   {
4970     { Bad_Opcode },
4971     { Bad_Opcode },
4972     { VEX_W_TABLE (VEX_W_0F72_R_4_P_2) },
4973   },
4974
4975   /* PREFIX_VEX_0F72_REG_6 */
4976   {
4977     { Bad_Opcode },
4978     { Bad_Opcode },
4979     { VEX_W_TABLE (VEX_W_0F72_R_6_P_2) },
4980   },
4981
4982   /* PREFIX_VEX_0F73_REG_2 */
4983   {
4984     { Bad_Opcode },
4985     { Bad_Opcode },
4986     { VEX_W_TABLE (VEX_W_0F73_R_2_P_2) },
4987   },
4988
4989   /* PREFIX_VEX_0F73_REG_3 */
4990   {
4991     { Bad_Opcode },
4992     { Bad_Opcode },
4993     { VEX_W_TABLE (VEX_W_0F73_R_3_P_2) },
4994   },
4995
4996   /* PREFIX_VEX_0F73_REG_6 */
4997   {
4998     { Bad_Opcode },
4999     { Bad_Opcode },
5000     { VEX_W_TABLE (VEX_W_0F73_R_6_P_2) },
5001   },
5002
5003   /* PREFIX_VEX_0F73_REG_7 */
5004   {
5005     { Bad_Opcode },
5006     { Bad_Opcode },
5007     { VEX_W_TABLE (VEX_W_0F73_R_7_P_2) },
5008   },
5009
5010   /* PREFIX_VEX_0F74 */
5011   {
5012     { Bad_Opcode },
5013     { Bad_Opcode },
5014     { VEX_W_TABLE (VEX_W_0F74_P_2) },
5015   },
5016
5017   /* PREFIX_VEX_0F75 */
5018   {
5019     { Bad_Opcode },
5020     { Bad_Opcode },
5021     { VEX_W_TABLE (VEX_W_0F75_P_2) },
5022   },
5023
5024   /* PREFIX_VEX_0F76 */
5025   {
5026     { Bad_Opcode },
5027     { Bad_Opcode },
5028     { VEX_W_TABLE (VEX_W_0F76_P_2) },
5029   },
5030
5031   /* PREFIX_VEX_0F77 */
5032   {
5033     { VEX_W_TABLE (VEX_W_0F77_P_0) },
5034   },
5035
5036   /* PREFIX_VEX_0F7C */
5037   {
5038     { Bad_Opcode },
5039     { Bad_Opcode },
5040     { VEX_W_TABLE (VEX_W_0F7C_P_2) },
5041     { VEX_W_TABLE (VEX_W_0F7C_P_3) },
5042   },
5043
5044   /* PREFIX_VEX_0F7D */
5045   {
5046     { Bad_Opcode },
5047     { Bad_Opcode },
5048     { VEX_W_TABLE (VEX_W_0F7D_P_2) },
5049     { VEX_W_TABLE (VEX_W_0F7D_P_3) },
5050   },
5051
5052   /* PREFIX_VEX_0F7E */
5053   {
5054     { Bad_Opcode },
5055     { VEX_LEN_TABLE (VEX_LEN_0F7E_P_1) },
5056     { VEX_LEN_TABLE (VEX_LEN_0F7E_P_2) },
5057   },
5058
5059   /* PREFIX_VEX_0F7F */
5060   {
5061     { Bad_Opcode },
5062     { VEX_W_TABLE (VEX_W_0F7F_P_1) },
5063     { VEX_W_TABLE (VEX_W_0F7F_P_2) },
5064   },
5065
5066   /* PREFIX_VEX_0F90 */
5067   {
5068     { VEX_LEN_TABLE (VEX_LEN_0F90_P_0) },
5069     { Bad_Opcode },
5070     { VEX_LEN_TABLE (VEX_LEN_0F90_P_2) },
5071   },
5072
5073   /* PREFIX_VEX_0F91 */
5074   {
5075     { VEX_LEN_TABLE (VEX_LEN_0F91_P_0) },
5076     { Bad_Opcode },
5077     { VEX_LEN_TABLE (VEX_LEN_0F91_P_2) },
5078   },
5079
5080   /* PREFIX_VEX_0F92 */
5081   {
5082     { VEX_LEN_TABLE (VEX_LEN_0F92_P_0) },
5083     { Bad_Opcode },
5084     { VEX_LEN_TABLE (VEX_LEN_0F92_P_2) },
5085     { VEX_LEN_TABLE (VEX_LEN_0F92_P_3) },
5086   },
5087
5088   /* PREFIX_VEX_0F93 */
5089   {
5090     { VEX_LEN_TABLE (VEX_LEN_0F93_P_0) },
5091     { Bad_Opcode },
5092     { VEX_LEN_TABLE (VEX_LEN_0F93_P_2) },
5093     { VEX_LEN_TABLE (VEX_LEN_0F93_P_3) },
5094   },
5095
5096   /* PREFIX_VEX_0F98 */
5097   {
5098     { VEX_LEN_TABLE (VEX_LEN_0F98_P_0) },
5099     { Bad_Opcode },
5100     { VEX_LEN_TABLE (VEX_LEN_0F98_P_2) },
5101   },
5102
5103   /* PREFIX_VEX_0F99 */
5104   {
5105     { VEX_LEN_TABLE (VEX_LEN_0F99_P_0) },
5106     { Bad_Opcode },
5107     { VEX_LEN_TABLE (VEX_LEN_0F99_P_2) },
5108   },
5109
5110   /* PREFIX_VEX_0FC2 */
5111   {
5112     { VEX_W_TABLE (VEX_W_0FC2_P_0) },
5113     { VEX_LEN_TABLE (VEX_LEN_0FC2_P_1) },
5114     { VEX_W_TABLE (VEX_W_0FC2_P_2) },
5115     { VEX_LEN_TABLE (VEX_LEN_0FC2_P_3) },
5116   },
5117
5118   /* PREFIX_VEX_0FC4 */
5119   {
5120     { Bad_Opcode },
5121     { Bad_Opcode },
5122     { VEX_LEN_TABLE (VEX_LEN_0FC4_P_2) },
5123   },
5124
5125   /* PREFIX_VEX_0FC5 */
5126   {
5127     { Bad_Opcode },
5128     { Bad_Opcode },
5129     { VEX_LEN_TABLE (VEX_LEN_0FC5_P_2) },
5130   },
5131
5132   /* PREFIX_VEX_0FD0 */
5133   {
5134     { Bad_Opcode },
5135     { Bad_Opcode },
5136     { VEX_W_TABLE (VEX_W_0FD0_P_2) },
5137     { VEX_W_TABLE (VEX_W_0FD0_P_3) },
5138   },
5139
5140   /* PREFIX_VEX_0FD1 */
5141   {
5142     { Bad_Opcode },
5143     { Bad_Opcode },
5144     { VEX_W_TABLE (VEX_W_0FD1_P_2) },
5145   },
5146
5147   /* PREFIX_VEX_0FD2 */
5148   {
5149     { Bad_Opcode },
5150     { Bad_Opcode },
5151     { VEX_W_TABLE (VEX_W_0FD2_P_2) },
5152   },
5153
5154   /* PREFIX_VEX_0FD3 */
5155   {
5156     { Bad_Opcode },
5157     { Bad_Opcode },
5158     { VEX_W_TABLE (VEX_W_0FD3_P_2) },
5159   },
5160
5161   /* PREFIX_VEX_0FD4 */
5162   {
5163     { Bad_Opcode },
5164     { Bad_Opcode },
5165     { VEX_W_TABLE (VEX_W_0FD4_P_2) },
5166   },
5167
5168   /* PREFIX_VEX_0FD5 */
5169   {
5170     { Bad_Opcode },
5171     { Bad_Opcode },
5172     { VEX_W_TABLE (VEX_W_0FD5_P_2) },
5173   },
5174
5175   /* PREFIX_VEX_0FD6 */
5176   {
5177     { Bad_Opcode },
5178     { Bad_Opcode },
5179     { VEX_LEN_TABLE (VEX_LEN_0FD6_P_2) },
5180   },
5181
5182   /* PREFIX_VEX_0FD7 */
5183   {
5184     { Bad_Opcode },
5185     { Bad_Opcode },
5186     { MOD_TABLE (MOD_VEX_0FD7_PREFIX_2) },
5187   },
5188
5189   /* PREFIX_VEX_0FD8 */
5190   {
5191     { Bad_Opcode },
5192     { Bad_Opcode },
5193     { VEX_W_TABLE (VEX_W_0FD8_P_2) },
5194   },
5195
5196   /* PREFIX_VEX_0FD9 */
5197   {
5198     { Bad_Opcode },
5199     { Bad_Opcode },
5200     { VEX_W_TABLE (VEX_W_0FD9_P_2) },
5201   },
5202
5203   /* PREFIX_VEX_0FDA */
5204   {
5205     { Bad_Opcode },
5206     { Bad_Opcode },
5207     { VEX_W_TABLE (VEX_W_0FDA_P_2) },
5208   },
5209
5210   /* PREFIX_VEX_0FDB */
5211   {
5212     { Bad_Opcode },
5213     { Bad_Opcode },
5214     { VEX_W_TABLE (VEX_W_0FDB_P_2) },
5215   },
5216
5217   /* PREFIX_VEX_0FDC */
5218   {
5219     { Bad_Opcode },
5220     { Bad_Opcode },
5221     { VEX_W_TABLE (VEX_W_0FDC_P_2) },
5222   },
5223
5224   /* PREFIX_VEX_0FDD */
5225   {
5226     { Bad_Opcode },
5227     { Bad_Opcode },
5228     { VEX_W_TABLE (VEX_W_0FDD_P_2) },
5229   },
5230
5231   /* PREFIX_VEX_0FDE */
5232   {
5233     { Bad_Opcode },
5234     { Bad_Opcode },
5235     { VEX_W_TABLE (VEX_W_0FDE_P_2) },
5236   },
5237
5238   /* PREFIX_VEX_0FDF */
5239   {
5240     { Bad_Opcode },
5241     { Bad_Opcode },
5242     { VEX_W_TABLE (VEX_W_0FDF_P_2) },
5243   },
5244
5245   /* PREFIX_VEX_0FE0 */
5246   {
5247     { Bad_Opcode },
5248     { Bad_Opcode },
5249     { VEX_W_TABLE (VEX_W_0FE0_P_2) },
5250   },
5251
5252   /* PREFIX_VEX_0FE1 */
5253   {
5254     { Bad_Opcode },
5255     { Bad_Opcode },
5256     { VEX_W_TABLE (VEX_W_0FE1_P_2) },
5257   },
5258
5259   /* PREFIX_VEX_0FE2 */
5260   {
5261     { Bad_Opcode },
5262     { Bad_Opcode },
5263     { VEX_W_TABLE (VEX_W_0FE2_P_2) },
5264   },
5265
5266   /* PREFIX_VEX_0FE3 */
5267   {
5268     { Bad_Opcode },
5269     { Bad_Opcode },
5270     { VEX_W_TABLE (VEX_W_0FE3_P_2) },
5271   },
5272
5273   /* PREFIX_VEX_0FE4 */
5274   {
5275     { Bad_Opcode },
5276     { Bad_Opcode },
5277     { VEX_W_TABLE (VEX_W_0FE4_P_2) },
5278   },
5279
5280   /* PREFIX_VEX_0FE5 */
5281   {
5282     { Bad_Opcode },
5283     { Bad_Opcode },
5284     { VEX_W_TABLE (VEX_W_0FE5_P_2) },
5285   },
5286
5287   /* PREFIX_VEX_0FE6 */
5288   {
5289     { Bad_Opcode },
5290     { VEX_W_TABLE (VEX_W_0FE6_P_1) },
5291     { VEX_W_TABLE (VEX_W_0FE6_P_2) },
5292     { VEX_W_TABLE (VEX_W_0FE6_P_3) },
5293   },
5294
5295   /* PREFIX_VEX_0FE7 */
5296   {
5297     { Bad_Opcode },
5298     { Bad_Opcode },
5299     { MOD_TABLE (MOD_VEX_0FE7_PREFIX_2) },
5300   },
5301
5302   /* PREFIX_VEX_0FE8 */
5303   {
5304     { Bad_Opcode },
5305     { Bad_Opcode },
5306     { VEX_W_TABLE (VEX_W_0FE8_P_2) },
5307   },
5308
5309   /* PREFIX_VEX_0FE9 */
5310   {
5311     { Bad_Opcode },
5312     { Bad_Opcode },
5313     { VEX_W_TABLE (VEX_W_0FE9_P_2) },
5314   },
5315
5316   /* PREFIX_VEX_0FEA */
5317   {
5318     { Bad_Opcode },
5319     { Bad_Opcode },
5320     { VEX_W_TABLE (VEX_W_0FEA_P_2) },
5321   },
5322
5323   /* PREFIX_VEX_0FEB */
5324   {
5325     { Bad_Opcode },
5326     { Bad_Opcode },
5327     { VEX_W_TABLE (VEX_W_0FEB_P_2) },
5328   },
5329
5330   /* PREFIX_VEX_0FEC */
5331   {
5332     { Bad_Opcode },
5333     { Bad_Opcode },
5334     { VEX_W_TABLE (VEX_W_0FEC_P_2) },
5335   },
5336
5337   /* PREFIX_VEX_0FED */
5338   {
5339     { Bad_Opcode },
5340     { Bad_Opcode },
5341     { VEX_W_TABLE (VEX_W_0FED_P_2) },
5342   },
5343
5344   /* PREFIX_VEX_0FEE */
5345   {
5346     { Bad_Opcode },
5347     { Bad_Opcode },
5348     { VEX_W_TABLE (VEX_W_0FEE_P_2) },
5349   },
5350
5351   /* PREFIX_VEX_0FEF */
5352   {
5353     { Bad_Opcode },
5354     { Bad_Opcode },
5355     { VEX_W_TABLE (VEX_W_0FEF_P_2) },
5356   },
5357
5358   /* PREFIX_VEX_0FF0 */
5359   {
5360     { Bad_Opcode },
5361     { Bad_Opcode },
5362     { Bad_Opcode },
5363     { MOD_TABLE (MOD_VEX_0FF0_PREFIX_3) },
5364   },
5365
5366   /* PREFIX_VEX_0FF1 */
5367   {
5368     { Bad_Opcode },
5369     { Bad_Opcode },
5370     { VEX_W_TABLE (VEX_W_0FF1_P_2) },
5371   },
5372
5373   /* PREFIX_VEX_0FF2 */
5374   {
5375     { Bad_Opcode },
5376     { Bad_Opcode },
5377     { VEX_W_TABLE (VEX_W_0FF2_P_2) },
5378   },
5379
5380   /* PREFIX_VEX_0FF3 */
5381   {
5382     { Bad_Opcode },
5383     { Bad_Opcode },
5384     { VEX_W_TABLE (VEX_W_0FF3_P_2) },
5385   },
5386
5387   /* PREFIX_VEX_0FF4 */
5388   {
5389     { Bad_Opcode },
5390     { Bad_Opcode },
5391     { VEX_W_TABLE (VEX_W_0FF4_P_2) },
5392   },
5393
5394   /* PREFIX_VEX_0FF5 */
5395   {
5396     { Bad_Opcode },
5397     { Bad_Opcode },
5398     { VEX_W_TABLE (VEX_W_0FF5_P_2) },
5399   },
5400
5401   /* PREFIX_VEX_0FF6 */
5402   {
5403     { Bad_Opcode },
5404     { Bad_Opcode },
5405     { VEX_W_TABLE (VEX_W_0FF6_P_2) },
5406   },
5407
5408   /* PREFIX_VEX_0FF7 */
5409   {
5410     { Bad_Opcode },
5411     { Bad_Opcode },
5412     { VEX_LEN_TABLE (VEX_LEN_0FF7_P_2) },
5413   },
5414
5415   /* PREFIX_VEX_0FF8 */
5416   {
5417     { Bad_Opcode },
5418     { Bad_Opcode },
5419     { VEX_W_TABLE (VEX_W_0FF8_P_2) },
5420   },
5421
5422   /* PREFIX_VEX_0FF9 */
5423   {
5424     { Bad_Opcode },
5425     { Bad_Opcode },
5426     { VEX_W_TABLE (VEX_W_0FF9_P_2) },
5427   },
5428
5429   /* PREFIX_VEX_0FFA */
5430   {
5431     { Bad_Opcode },
5432     { Bad_Opcode },
5433     { VEX_W_TABLE (VEX_W_0FFA_P_2) },
5434   },
5435
5436   /* PREFIX_VEX_0FFB */
5437   {
5438     { Bad_Opcode },
5439     { Bad_Opcode },
5440     { VEX_W_TABLE (VEX_W_0FFB_P_2) },
5441   },
5442
5443   /* PREFIX_VEX_0FFC */
5444   {
5445     { Bad_Opcode },
5446     { Bad_Opcode },
5447     { VEX_W_TABLE (VEX_W_0FFC_P_2) },
5448   },
5449
5450   /* PREFIX_VEX_0FFD */
5451   {
5452     { Bad_Opcode },
5453     { Bad_Opcode },
5454     { VEX_W_TABLE (VEX_W_0FFD_P_2) },
5455   },
5456
5457   /* PREFIX_VEX_0FFE */
5458   {
5459     { Bad_Opcode },
5460     { Bad_Opcode },
5461     { VEX_W_TABLE (VEX_W_0FFE_P_2) },
5462   },
5463
5464   /* PREFIX_VEX_0F3800 */
5465   {
5466     { Bad_Opcode },
5467     { Bad_Opcode },
5468     { VEX_W_TABLE (VEX_W_0F3800_P_2) },
5469   },
5470
5471   /* PREFIX_VEX_0F3801 */
5472   {
5473     { Bad_Opcode },
5474     { Bad_Opcode },
5475     { VEX_W_TABLE (VEX_W_0F3801_P_2) },
5476   },
5477
5478   /* PREFIX_VEX_0F3802 */
5479   {
5480     { Bad_Opcode },
5481     { Bad_Opcode },
5482     { VEX_W_TABLE (VEX_W_0F3802_P_2) },
5483   },
5484
5485   /* PREFIX_VEX_0F3803 */
5486   {
5487     { Bad_Opcode },
5488     { Bad_Opcode },
5489     { VEX_W_TABLE (VEX_W_0F3803_P_2) },
5490   },
5491
5492   /* PREFIX_VEX_0F3804 */
5493   {
5494     { Bad_Opcode },
5495     { Bad_Opcode },
5496     { VEX_W_TABLE (VEX_W_0F3804_P_2) },
5497   },
5498
5499   /* PREFIX_VEX_0F3805 */
5500   {
5501     { Bad_Opcode },
5502     { Bad_Opcode },
5503     { VEX_W_TABLE (VEX_W_0F3805_P_2) },
5504   },
5505
5506   /* PREFIX_VEX_0F3806 */
5507   {
5508     { Bad_Opcode },
5509     { Bad_Opcode },
5510     { VEX_W_TABLE (VEX_W_0F3806_P_2) },
5511   },
5512
5513   /* PREFIX_VEX_0F3807 */
5514   {
5515     { Bad_Opcode },
5516     { Bad_Opcode },
5517     { VEX_W_TABLE (VEX_W_0F3807_P_2) },
5518   },
5519
5520   /* PREFIX_VEX_0F3808 */
5521   {
5522     { Bad_Opcode },
5523     { Bad_Opcode },
5524     { VEX_W_TABLE (VEX_W_0F3808_P_2) },
5525   },
5526
5527   /* PREFIX_VEX_0F3809 */
5528   {
5529     { Bad_Opcode },
5530     { Bad_Opcode },
5531     { VEX_W_TABLE (VEX_W_0F3809_P_2) },
5532   },
5533
5534   /* PREFIX_VEX_0F380A */
5535   {
5536     { Bad_Opcode },
5537     { Bad_Opcode },
5538     { VEX_W_TABLE (VEX_W_0F380A_P_2) },
5539   },
5540
5541   /* PREFIX_VEX_0F380B */
5542   {
5543     { Bad_Opcode },
5544     { Bad_Opcode },
5545     { VEX_W_TABLE (VEX_W_0F380B_P_2) },
5546   },
5547
5548   /* PREFIX_VEX_0F380C */
5549   {
5550     { Bad_Opcode },
5551     { Bad_Opcode },
5552     { VEX_W_TABLE (VEX_W_0F380C_P_2) },
5553   },
5554
5555   /* PREFIX_VEX_0F380D */
5556   {
5557     { Bad_Opcode },
5558     { Bad_Opcode },
5559     { VEX_W_TABLE (VEX_W_0F380D_P_2) },
5560   },
5561
5562   /* PREFIX_VEX_0F380E */
5563   {
5564     { Bad_Opcode },
5565     { Bad_Opcode },
5566     { VEX_W_TABLE (VEX_W_0F380E_P_2) },
5567   },
5568
5569   /* PREFIX_VEX_0F380F */
5570   {
5571     { Bad_Opcode },
5572     { Bad_Opcode },
5573     { VEX_W_TABLE (VEX_W_0F380F_P_2) },
5574   },
5575
5576   /* PREFIX_VEX_0F3813 */
5577   {
5578     { Bad_Opcode },
5579     { Bad_Opcode },
5580     { "vcvtph2ps", { XM, EXxmmq }, 0 },
5581   },
5582
5583   /* PREFIX_VEX_0F3816 */
5584   {
5585     { Bad_Opcode },
5586     { Bad_Opcode },
5587     { VEX_LEN_TABLE (VEX_LEN_0F3816_P_2) },
5588   },
5589
5590   /* PREFIX_VEX_0F3817 */
5591   {
5592     { Bad_Opcode },
5593     { Bad_Opcode },
5594     { VEX_W_TABLE (VEX_W_0F3817_P_2) },
5595   },
5596
5597   /* PREFIX_VEX_0F3818 */
5598   {
5599     { Bad_Opcode },
5600     { Bad_Opcode },
5601     { VEX_W_TABLE (VEX_W_0F3818_P_2) },
5602   },
5603
5604   /* PREFIX_VEX_0F3819 */
5605   {
5606     { Bad_Opcode },
5607     { Bad_Opcode },
5608     { VEX_LEN_TABLE (VEX_LEN_0F3819_P_2) },
5609   },
5610
5611   /* PREFIX_VEX_0F381A */
5612   {
5613     { Bad_Opcode },
5614     { Bad_Opcode },
5615     { MOD_TABLE (MOD_VEX_0F381A_PREFIX_2) },
5616   },
5617
5618   /* PREFIX_VEX_0F381C */
5619   {
5620     { Bad_Opcode },
5621     { Bad_Opcode },
5622     { VEX_W_TABLE (VEX_W_0F381C_P_2) },
5623   },
5624
5625   /* PREFIX_VEX_0F381D */
5626   {
5627     { Bad_Opcode },
5628     { Bad_Opcode },
5629     { VEX_W_TABLE (VEX_W_0F381D_P_2) },
5630   },
5631
5632   /* PREFIX_VEX_0F381E */
5633   {
5634     { Bad_Opcode },
5635     { Bad_Opcode },
5636     { VEX_W_TABLE (VEX_W_0F381E_P_2) },
5637   },
5638
5639   /* PREFIX_VEX_0F3820 */
5640   {
5641     { Bad_Opcode },
5642     { Bad_Opcode },
5643     { VEX_W_TABLE (VEX_W_0F3820_P_2) },
5644   },
5645
5646   /* PREFIX_VEX_0F3821 */
5647   {
5648     { Bad_Opcode },
5649     { Bad_Opcode },
5650     { VEX_W_TABLE (VEX_W_0F3821_P_2) },
5651   },
5652
5653   /* PREFIX_VEX_0F3822 */
5654   {
5655     { Bad_Opcode },
5656     { Bad_Opcode },
5657     { VEX_W_TABLE (VEX_W_0F3822_P_2) },
5658   },
5659
5660   /* PREFIX_VEX_0F3823 */
5661   {
5662     { Bad_Opcode },
5663     { Bad_Opcode },
5664     { VEX_W_TABLE (VEX_W_0F3823_P_2) },
5665   },
5666
5667   /* PREFIX_VEX_0F3824 */
5668   {
5669     { Bad_Opcode },
5670     { Bad_Opcode },
5671     { VEX_W_TABLE (VEX_W_0F3824_P_2) },
5672   },
5673
5674   /* PREFIX_VEX_0F3825 */
5675   {
5676     { Bad_Opcode },
5677     { Bad_Opcode },
5678     { VEX_W_TABLE (VEX_W_0F3825_P_2) },
5679   },
5680
5681   /* PREFIX_VEX_0F3828 */
5682   {
5683     { Bad_Opcode },
5684     { Bad_Opcode },
5685     { VEX_W_TABLE (VEX_W_0F3828_P_2) },
5686   },
5687
5688   /* PREFIX_VEX_0F3829 */
5689   {
5690     { Bad_Opcode },
5691     { Bad_Opcode },
5692     { VEX_W_TABLE (VEX_W_0F3829_P_2) },
5693   },
5694
5695   /* PREFIX_VEX_0F382A */
5696   {
5697     { Bad_Opcode },
5698     { Bad_Opcode },
5699     { MOD_TABLE (MOD_VEX_0F382A_PREFIX_2) },
5700   },
5701
5702   /* PREFIX_VEX_0F382B */
5703   {
5704     { Bad_Opcode },
5705     { Bad_Opcode },
5706     { VEX_W_TABLE (VEX_W_0F382B_P_2) },
5707   },
5708
5709   /* PREFIX_VEX_0F382C */
5710   {
5711     { Bad_Opcode },
5712     { Bad_Opcode },
5713      { MOD_TABLE (MOD_VEX_0F382C_PREFIX_2) },
5714   },
5715
5716   /* PREFIX_VEX_0F382D */
5717   {
5718     { Bad_Opcode },
5719     { Bad_Opcode },
5720      { MOD_TABLE (MOD_VEX_0F382D_PREFIX_2) },
5721   },
5722
5723   /* PREFIX_VEX_0F382E */
5724   {
5725     { Bad_Opcode },
5726     { Bad_Opcode },
5727      { MOD_TABLE (MOD_VEX_0F382E_PREFIX_2) },
5728   },
5729
5730   /* PREFIX_VEX_0F382F */
5731   {
5732     { Bad_Opcode },
5733     { Bad_Opcode },
5734      { MOD_TABLE (MOD_VEX_0F382F_PREFIX_2) },
5735   },
5736
5737   /* PREFIX_VEX_0F3830 */
5738   {
5739     { Bad_Opcode },
5740     { Bad_Opcode },
5741     { VEX_W_TABLE (VEX_W_0F3830_P_2) },
5742   },
5743
5744   /* PREFIX_VEX_0F3831 */
5745   {
5746     { Bad_Opcode },
5747     { Bad_Opcode },
5748     { VEX_W_TABLE (VEX_W_0F3831_P_2) },
5749   },
5750
5751   /* PREFIX_VEX_0F3832 */
5752   {
5753     { Bad_Opcode },
5754     { Bad_Opcode },
5755     { VEX_W_TABLE (VEX_W_0F3832_P_2) },
5756   },
5757
5758   /* PREFIX_VEX_0F3833 */
5759   {
5760     { Bad_Opcode },
5761     { Bad_Opcode },
5762     { VEX_W_TABLE (VEX_W_0F3833_P_2) },
5763   },
5764
5765   /* PREFIX_VEX_0F3834 */
5766   {
5767     { Bad_Opcode },
5768     { Bad_Opcode },
5769     { VEX_W_TABLE (VEX_W_0F3834_P_2) },
5770   },
5771
5772   /* PREFIX_VEX_0F3835 */
5773   {
5774     { Bad_Opcode },
5775     { Bad_Opcode },
5776     { VEX_W_TABLE (VEX_W_0F3835_P_2) },
5777   },
5778
5779   /* PREFIX_VEX_0F3836 */
5780   {
5781     { Bad_Opcode },
5782     { Bad_Opcode },
5783     { VEX_LEN_TABLE (VEX_LEN_0F3836_P_2) },
5784   },
5785
5786   /* PREFIX_VEX_0F3837 */
5787   {
5788     { Bad_Opcode },
5789     { Bad_Opcode },
5790     { VEX_W_TABLE (VEX_W_0F3837_P_2) },
5791   },
5792
5793   /* PREFIX_VEX_0F3838 */
5794   {
5795     { Bad_Opcode },
5796     { Bad_Opcode },
5797     { VEX_W_TABLE (VEX_W_0F3838_P_2) },
5798   },
5799
5800   /* PREFIX_VEX_0F3839 */
5801   {
5802     { Bad_Opcode },
5803     { Bad_Opcode },
5804     { VEX_W_TABLE (VEX_W_0F3839_P_2) },
5805   },
5806
5807   /* PREFIX_VEX_0F383A */
5808   {
5809     { Bad_Opcode },
5810     { Bad_Opcode },
5811     { VEX_W_TABLE (VEX_W_0F383A_P_2) },
5812   },
5813
5814   /* PREFIX_VEX_0F383B */
5815   {
5816     { Bad_Opcode },
5817     { Bad_Opcode },
5818     { VEX_W_TABLE (VEX_W_0F383B_P_2) },
5819   },
5820
5821   /* PREFIX_VEX_0F383C */
5822   {
5823     { Bad_Opcode },
5824     { Bad_Opcode },
5825     { VEX_W_TABLE (VEX_W_0F383C_P_2) },
5826   },
5827
5828   /* PREFIX_VEX_0F383D */
5829   {
5830     { Bad_Opcode },
5831     { Bad_Opcode },
5832     { VEX_W_TABLE (VEX_W_0F383D_P_2) },
5833   },
5834
5835   /* PREFIX_VEX_0F383E */
5836   {
5837     { Bad_Opcode },
5838     { Bad_Opcode },
5839     { VEX_W_TABLE (VEX_W_0F383E_P_2) },
5840   },
5841
5842   /* PREFIX_VEX_0F383F */
5843   {
5844     { Bad_Opcode },
5845     { Bad_Opcode },
5846     { VEX_W_TABLE (VEX_W_0F383F_P_2) },
5847   },
5848
5849   /* PREFIX_VEX_0F3840 */
5850   {
5851     { Bad_Opcode },
5852     { Bad_Opcode },
5853     { VEX_W_TABLE (VEX_W_0F3840_P_2) },
5854   },
5855
5856   /* PREFIX_VEX_0F3841 */
5857   {
5858     { Bad_Opcode },
5859     { Bad_Opcode },
5860     { VEX_LEN_TABLE (VEX_LEN_0F3841_P_2) },
5861   },
5862
5863   /* PREFIX_VEX_0F3845 */
5864   {
5865     { Bad_Opcode },
5866     { Bad_Opcode },
5867     { "vpsrlv%LW", { XM, Vex, EXx }, 0 },
5868   },
5869
5870   /* PREFIX_VEX_0F3846 */
5871   {
5872     { Bad_Opcode },
5873     { Bad_Opcode },
5874     { VEX_W_TABLE (VEX_W_0F3846_P_2) },
5875   },
5876
5877   /* PREFIX_VEX_0F3847 */
5878   {
5879     { Bad_Opcode },
5880     { Bad_Opcode },
5881     { "vpsllv%LW", { XM, Vex, EXx }, 0 },
5882   },
5883
5884   /* PREFIX_VEX_0F3858 */
5885   {
5886     { Bad_Opcode },
5887     { Bad_Opcode },
5888     { VEX_W_TABLE (VEX_W_0F3858_P_2) },
5889   },
5890
5891   /* PREFIX_VEX_0F3859 */
5892   {
5893     { Bad_Opcode },
5894     { Bad_Opcode },
5895     { VEX_W_TABLE (VEX_W_0F3859_P_2) },
5896   },
5897
5898   /* PREFIX_VEX_0F385A */
5899   {
5900     { Bad_Opcode },
5901     { Bad_Opcode },
5902     { MOD_TABLE (MOD_VEX_0F385A_PREFIX_2) },
5903   },
5904
5905   /* PREFIX_VEX_0F3878 */
5906   {
5907     { Bad_Opcode },
5908     { Bad_Opcode },
5909     { VEX_W_TABLE (VEX_W_0F3878_P_2) },
5910   },
5911
5912   /* PREFIX_VEX_0F3879 */
5913   {
5914     { Bad_Opcode },
5915     { Bad_Opcode },
5916     { VEX_W_TABLE (VEX_W_0F3879_P_2) },
5917   },
5918
5919   /* PREFIX_VEX_0F388C */
5920   {
5921     { Bad_Opcode },
5922     { Bad_Opcode },
5923     { MOD_TABLE (MOD_VEX_0F388C_PREFIX_2) },
5924   },
5925
5926   /* PREFIX_VEX_0F388E */
5927   {
5928     { Bad_Opcode },
5929     { Bad_Opcode },
5930     { MOD_TABLE (MOD_VEX_0F388E_PREFIX_2) },
5931   },
5932
5933   /* PREFIX_VEX_0F3890 */
5934   {
5935     { Bad_Opcode },
5936     { Bad_Opcode },
5937     { "vpgatherd%LW", { XM, MVexVSIBDWpX, Vex }, 0 },
5938   },
5939
5940   /* PREFIX_VEX_0F3891 */
5941   {
5942     { Bad_Opcode },
5943     { Bad_Opcode },
5944     { "vpgatherq%LW", { XMGatherQ, MVexVSIBQWpX, VexGatherQ }, 0 },
5945   },
5946
5947   /* PREFIX_VEX_0F3892 */
5948   {
5949     { Bad_Opcode },
5950     { Bad_Opcode },
5951     { "vgatherdp%XW", { XM, MVexVSIBDWpX, Vex }, 0 },
5952   },
5953
5954   /* PREFIX_VEX_0F3893 */
5955   {
5956     { Bad_Opcode },
5957     { Bad_Opcode },
5958     { "vgatherqp%XW", { XMGatherQ, MVexVSIBQWpX, VexGatherQ }, 0 },
5959   },
5960
5961   /* PREFIX_VEX_0F3896 */
5962   {
5963     { Bad_Opcode },
5964     { Bad_Opcode },
5965     { "vfmaddsub132p%XW", { XM, Vex, EXx }, 0 },
5966   },
5967
5968   /* PREFIX_VEX_0F3897 */
5969   {
5970     { Bad_Opcode },
5971     { Bad_Opcode },
5972     { "vfmsubadd132p%XW", { XM, Vex, EXx }, 0 },
5973   },
5974
5975   /* PREFIX_VEX_0F3898 */
5976   {
5977     { Bad_Opcode },
5978     { Bad_Opcode },
5979     { "vfmadd132p%XW", { XM, Vex, EXx }, 0 },
5980   },
5981
5982   /* PREFIX_VEX_0F3899 */
5983   {
5984     { Bad_Opcode },
5985     { Bad_Opcode },
5986     { "vfmadd132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
5987   },
5988
5989   /* PREFIX_VEX_0F389A */
5990   {
5991     { Bad_Opcode },
5992     { Bad_Opcode },
5993     { "vfmsub132p%XW", { XM, Vex, EXx }, 0 },
5994   },
5995
5996   /* PREFIX_VEX_0F389B */
5997   {
5998     { Bad_Opcode },
5999     { Bad_Opcode },
6000     { "vfmsub132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6001   },
6002
6003   /* PREFIX_VEX_0F389C */
6004   {
6005     { Bad_Opcode },
6006     { Bad_Opcode },
6007     { "vfnmadd132p%XW", { XM, Vex, EXx }, 0 },
6008   },
6009
6010   /* PREFIX_VEX_0F389D */
6011   {
6012     { Bad_Opcode },
6013     { Bad_Opcode },
6014     { "vfnmadd132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6015   },
6016
6017   /* PREFIX_VEX_0F389E */
6018   {
6019     { Bad_Opcode },
6020     { Bad_Opcode },
6021     { "vfnmsub132p%XW", { XM, Vex, EXx }, 0 },
6022   },
6023
6024   /* PREFIX_VEX_0F389F */
6025   {
6026     { Bad_Opcode },
6027     { Bad_Opcode },
6028     { "vfnmsub132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6029   },
6030
6031   /* PREFIX_VEX_0F38A6 */
6032   {
6033     { Bad_Opcode },
6034     { Bad_Opcode },
6035     { "vfmaddsub213p%XW", { XM, Vex, EXx }, 0 },
6036     { Bad_Opcode },
6037   },
6038
6039   /* PREFIX_VEX_0F38A7 */
6040   {
6041     { Bad_Opcode },
6042     { Bad_Opcode },
6043     { "vfmsubadd213p%XW", { XM, Vex, EXx }, 0 },
6044   },
6045
6046   /* PREFIX_VEX_0F38A8 */
6047   {
6048     { Bad_Opcode },
6049     { Bad_Opcode },
6050     { "vfmadd213p%XW", { XM, Vex, EXx }, 0 },
6051   },
6052
6053   /* PREFIX_VEX_0F38A9 */
6054   {
6055     { Bad_Opcode },
6056     { Bad_Opcode },
6057     { "vfmadd213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6058   },
6059
6060   /* PREFIX_VEX_0F38AA */
6061   {
6062     { Bad_Opcode },
6063     { Bad_Opcode },
6064     { "vfmsub213p%XW", { XM, Vex, EXx }, 0 },
6065   },
6066
6067   /* PREFIX_VEX_0F38AB */
6068   {
6069     { Bad_Opcode },
6070     { Bad_Opcode },
6071     { "vfmsub213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6072   },
6073
6074   /* PREFIX_VEX_0F38AC */
6075   {
6076     { Bad_Opcode },
6077     { Bad_Opcode },
6078     { "vfnmadd213p%XW", { XM, Vex, EXx }, 0 },
6079   },
6080
6081   /* PREFIX_VEX_0F38AD */
6082   {
6083     { Bad_Opcode },
6084     { Bad_Opcode },
6085     { "vfnmadd213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6086   },
6087
6088   /* PREFIX_VEX_0F38AE */
6089   {
6090     { Bad_Opcode },
6091     { Bad_Opcode },
6092     { "vfnmsub213p%XW", { XM, Vex, EXx }, 0 },
6093   },
6094
6095   /* PREFIX_VEX_0F38AF */
6096   {
6097     { Bad_Opcode },
6098     { Bad_Opcode },
6099     { "vfnmsub213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6100   },
6101
6102   /* PREFIX_VEX_0F38B6 */
6103   {
6104     { Bad_Opcode },
6105     { Bad_Opcode },
6106     { "vfmaddsub231p%XW", { XM, Vex, EXx }, 0 },
6107   },
6108
6109   /* PREFIX_VEX_0F38B7 */
6110   {
6111     { Bad_Opcode },
6112     { Bad_Opcode },
6113     { "vfmsubadd231p%XW", { XM, Vex, EXx }, 0 },
6114   },
6115
6116   /* PREFIX_VEX_0F38B8 */
6117   {
6118     { Bad_Opcode },
6119     { Bad_Opcode },
6120     { "vfmadd231p%XW", { XM, Vex, EXx }, 0 },
6121   },
6122
6123   /* PREFIX_VEX_0F38B9 */
6124   {
6125     { Bad_Opcode },
6126     { Bad_Opcode },
6127     { "vfmadd231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6128   },
6129
6130   /* PREFIX_VEX_0F38BA */
6131   {
6132     { Bad_Opcode },
6133     { Bad_Opcode },
6134     { "vfmsub231p%XW", { XM, Vex, EXx }, 0 },
6135   },
6136
6137   /* PREFIX_VEX_0F38BB */
6138   {
6139     { Bad_Opcode },
6140     { Bad_Opcode },
6141     { "vfmsub231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6142   },
6143
6144   /* PREFIX_VEX_0F38BC */
6145   {
6146     { Bad_Opcode },
6147     { Bad_Opcode },
6148     { "vfnmadd231p%XW", { XM, Vex, EXx }, 0 },
6149   },
6150
6151   /* PREFIX_VEX_0F38BD */
6152   {
6153     { Bad_Opcode },
6154     { Bad_Opcode },
6155     { "vfnmadd231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6156   },
6157
6158   /* PREFIX_VEX_0F38BE */
6159   {
6160     { Bad_Opcode },
6161     { Bad_Opcode },
6162     { "vfnmsub231p%XW", { XM, Vex, EXx }, 0 },
6163   },
6164
6165   /* PREFIX_VEX_0F38BF */
6166   {
6167     { Bad_Opcode },
6168     { Bad_Opcode },
6169     { "vfnmsub231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6170   },
6171
6172   /* PREFIX_VEX_0F38DB */
6173   {
6174     { Bad_Opcode },
6175     { Bad_Opcode },
6176     { VEX_LEN_TABLE (VEX_LEN_0F38DB_P_2) },
6177   },
6178
6179   /* PREFIX_VEX_0F38DC */
6180   {
6181     { Bad_Opcode },
6182     { Bad_Opcode },
6183     { VEX_LEN_TABLE (VEX_LEN_0F38DC_P_2) },
6184   },
6185
6186   /* PREFIX_VEX_0F38DD */
6187   {
6188     { Bad_Opcode },
6189     { Bad_Opcode },
6190     { VEX_LEN_TABLE (VEX_LEN_0F38DD_P_2) },
6191   },
6192
6193   /* PREFIX_VEX_0F38DE */
6194   {
6195     { Bad_Opcode },
6196     { Bad_Opcode },
6197     { VEX_LEN_TABLE (VEX_LEN_0F38DE_P_2) },
6198   },
6199
6200   /* PREFIX_VEX_0F38DF */
6201   {
6202     { Bad_Opcode },
6203     { Bad_Opcode },
6204     { VEX_LEN_TABLE (VEX_LEN_0F38DF_P_2) },
6205   },
6206
6207   /* PREFIX_VEX_0F38F2 */
6208   {
6209     { VEX_LEN_TABLE (VEX_LEN_0F38F2_P_0) },
6210   },
6211
6212   /* PREFIX_VEX_0F38F3_REG_1 */
6213   {
6214     { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_1_P_0) },
6215   },
6216
6217   /* PREFIX_VEX_0F38F3_REG_2 */
6218   {
6219     { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_2_P_0) },
6220   },
6221
6222   /* PREFIX_VEX_0F38F3_REG_3 */
6223   {
6224     { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_3_P_0) },
6225   },
6226
6227   /* PREFIX_VEX_0F38F5 */
6228   {
6229     { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_0) },
6230     { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_1) },
6231     { Bad_Opcode },
6232     { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_3) },
6233   },
6234
6235   /* PREFIX_VEX_0F38F6 */
6236   {
6237     { Bad_Opcode },
6238     { Bad_Opcode },
6239     { Bad_Opcode },
6240     { VEX_LEN_TABLE (VEX_LEN_0F38F6_P_3) },
6241   },
6242
6243   /* PREFIX_VEX_0F38F7 */
6244   {
6245     { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_0) },
6246     { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_1) },
6247     { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_2) },
6248     { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_3) },
6249   },
6250
6251   /* PREFIX_VEX_0F3A00 */
6252   {
6253     { Bad_Opcode },
6254     { Bad_Opcode },
6255     { VEX_LEN_TABLE (VEX_LEN_0F3A00_P_2) },
6256   },
6257
6258   /* PREFIX_VEX_0F3A01 */
6259   {
6260     { Bad_Opcode },
6261     { Bad_Opcode },
6262     { VEX_LEN_TABLE (VEX_LEN_0F3A01_P_2) },
6263   },
6264
6265   /* PREFIX_VEX_0F3A02 */
6266   {
6267     { Bad_Opcode },
6268     { Bad_Opcode },
6269     { VEX_W_TABLE (VEX_W_0F3A02_P_2) },
6270   },
6271
6272   /* PREFIX_VEX_0F3A04 */
6273   {
6274     { Bad_Opcode },
6275     { Bad_Opcode },
6276     { VEX_W_TABLE (VEX_W_0F3A04_P_2) },
6277   },
6278
6279   /* PREFIX_VEX_0F3A05 */
6280   {
6281     { Bad_Opcode },
6282     { Bad_Opcode },
6283     { VEX_W_TABLE (VEX_W_0F3A05_P_2) },
6284   },
6285
6286   /* PREFIX_VEX_0F3A06 */
6287   {
6288     { Bad_Opcode },
6289     { Bad_Opcode },
6290     { VEX_LEN_TABLE (VEX_LEN_0F3A06_P_2) },
6291   },
6292
6293   /* PREFIX_VEX_0F3A08 */
6294   {
6295     { Bad_Opcode },
6296     { Bad_Opcode },
6297     { VEX_W_TABLE (VEX_W_0F3A08_P_2) },
6298   },
6299
6300   /* PREFIX_VEX_0F3A09 */
6301   {
6302     { Bad_Opcode },
6303     { Bad_Opcode },
6304     { VEX_W_TABLE (VEX_W_0F3A09_P_2) },
6305   },
6306
6307   /* PREFIX_VEX_0F3A0A */
6308   {
6309     { Bad_Opcode },
6310     { Bad_Opcode },
6311     { VEX_LEN_TABLE (VEX_LEN_0F3A0A_P_2) },
6312   },
6313
6314   /* PREFIX_VEX_0F3A0B */
6315   {
6316     { Bad_Opcode },
6317     { Bad_Opcode },
6318     { VEX_LEN_TABLE (VEX_LEN_0F3A0B_P_2) },
6319   },
6320
6321   /* PREFIX_VEX_0F3A0C */
6322   {
6323     { Bad_Opcode },
6324     { Bad_Opcode },
6325     { VEX_W_TABLE (VEX_W_0F3A0C_P_2) },
6326   },
6327
6328   /* PREFIX_VEX_0F3A0D */
6329   {
6330     { Bad_Opcode },
6331     { Bad_Opcode },
6332     { VEX_W_TABLE (VEX_W_0F3A0D_P_2) },
6333   },
6334
6335   /* PREFIX_VEX_0F3A0E */
6336   {
6337     { Bad_Opcode },
6338     { Bad_Opcode },
6339     { VEX_W_TABLE (VEX_W_0F3A0E_P_2) },
6340   },
6341
6342   /* PREFIX_VEX_0F3A0F */
6343   {
6344     { Bad_Opcode },
6345     { Bad_Opcode },
6346     { VEX_W_TABLE (VEX_W_0F3A0F_P_2) },
6347   },
6348
6349   /* PREFIX_VEX_0F3A14 */
6350   {
6351     { Bad_Opcode },
6352     { Bad_Opcode },
6353     { VEX_LEN_TABLE (VEX_LEN_0F3A14_P_2) },
6354   },
6355
6356   /* PREFIX_VEX_0F3A15 */
6357   {
6358     { Bad_Opcode },
6359     { Bad_Opcode },
6360     { VEX_LEN_TABLE (VEX_LEN_0F3A15_P_2) },
6361   },
6362
6363   /* PREFIX_VEX_0F3A16 */
6364   {
6365     { Bad_Opcode },
6366     { Bad_Opcode },
6367     { VEX_LEN_TABLE (VEX_LEN_0F3A16_P_2) },
6368   },
6369
6370   /* PREFIX_VEX_0F3A17 */
6371   {
6372     { Bad_Opcode },
6373     { Bad_Opcode },
6374     { VEX_LEN_TABLE (VEX_LEN_0F3A17_P_2) },
6375   },
6376
6377   /* PREFIX_VEX_0F3A18 */
6378   {
6379     { Bad_Opcode },
6380     { Bad_Opcode },
6381     { VEX_LEN_TABLE (VEX_LEN_0F3A18_P_2) },
6382   },
6383
6384   /* PREFIX_VEX_0F3A19 */
6385   {
6386     { Bad_Opcode },
6387     { Bad_Opcode },
6388     { VEX_LEN_TABLE (VEX_LEN_0F3A19_P_2) },
6389   },
6390
6391   /* PREFIX_VEX_0F3A1D */
6392   {
6393     { Bad_Opcode },
6394     { Bad_Opcode },
6395     { "vcvtps2ph", { EXxmmq, XM, Ib }, 0 },
6396   },
6397
6398   /* PREFIX_VEX_0F3A20 */
6399   {
6400     { Bad_Opcode },
6401     { Bad_Opcode },
6402     { VEX_LEN_TABLE (VEX_LEN_0F3A20_P_2) },
6403   },
6404
6405   /* PREFIX_VEX_0F3A21 */
6406   {
6407     { Bad_Opcode },
6408     { Bad_Opcode },
6409     { VEX_LEN_TABLE (VEX_LEN_0F3A21_P_2) },
6410   },
6411
6412   /* PREFIX_VEX_0F3A22 */
6413   {
6414     { Bad_Opcode },
6415     { Bad_Opcode },
6416     { VEX_LEN_TABLE (VEX_LEN_0F3A22_P_2) },
6417   },
6418
6419   /* PREFIX_VEX_0F3A30 */
6420   {
6421     { Bad_Opcode },
6422     { Bad_Opcode },
6423     { VEX_LEN_TABLE (VEX_LEN_0F3A30_P_2) },
6424   },
6425
6426   /* PREFIX_VEX_0F3A31 */
6427   {
6428     { Bad_Opcode },
6429     { Bad_Opcode },
6430     { VEX_LEN_TABLE (VEX_LEN_0F3A31_P_2) },
6431   },
6432
6433   /* PREFIX_VEX_0F3A32 */
6434   {
6435     { Bad_Opcode },
6436     { Bad_Opcode },
6437     { VEX_LEN_TABLE (VEX_LEN_0F3A32_P_2) },
6438   },
6439
6440   /* PREFIX_VEX_0F3A33 */
6441   {
6442     { Bad_Opcode },
6443     { Bad_Opcode },
6444     { VEX_LEN_TABLE (VEX_LEN_0F3A33_P_2) },
6445   },
6446
6447   /* PREFIX_VEX_0F3A38 */
6448   {
6449     { Bad_Opcode },
6450     { Bad_Opcode },
6451     { VEX_LEN_TABLE (VEX_LEN_0F3A38_P_2) },
6452   },
6453
6454   /* PREFIX_VEX_0F3A39 */
6455   {
6456     { Bad_Opcode },
6457     { Bad_Opcode },
6458     { VEX_LEN_TABLE (VEX_LEN_0F3A39_P_2) },
6459   },
6460
6461   /* PREFIX_VEX_0F3A40 */
6462   {
6463     { Bad_Opcode },
6464     { Bad_Opcode },
6465     { VEX_W_TABLE (VEX_W_0F3A40_P_2) },
6466   },
6467
6468   /* PREFIX_VEX_0F3A41 */
6469   {
6470     { Bad_Opcode },
6471     { Bad_Opcode },
6472     { VEX_LEN_TABLE (VEX_LEN_0F3A41_P_2) },
6473   },
6474
6475   /* PREFIX_VEX_0F3A42 */
6476   {
6477     { Bad_Opcode },
6478     { Bad_Opcode },
6479     { VEX_W_TABLE (VEX_W_0F3A42_P_2) },
6480   },
6481
6482   /* PREFIX_VEX_0F3A44 */
6483   {
6484     { Bad_Opcode },
6485     { Bad_Opcode },
6486     { VEX_LEN_TABLE (VEX_LEN_0F3A44_P_2) },
6487   },
6488
6489   /* PREFIX_VEX_0F3A46 */
6490   {
6491     { Bad_Opcode },
6492     { Bad_Opcode },
6493     { VEX_LEN_TABLE (VEX_LEN_0F3A46_P_2) },
6494   },
6495
6496   /* PREFIX_VEX_0F3A48 */
6497   {
6498     { Bad_Opcode },
6499     { Bad_Opcode },
6500     { VEX_W_TABLE (VEX_W_0F3A48_P_2) },
6501   },
6502
6503   /* PREFIX_VEX_0F3A49 */
6504   {
6505     { Bad_Opcode },
6506     { Bad_Opcode },
6507     { VEX_W_TABLE (VEX_W_0F3A49_P_2) },
6508   },
6509
6510   /* PREFIX_VEX_0F3A4A */
6511   {
6512     { Bad_Opcode },
6513     { Bad_Opcode },
6514     { VEX_W_TABLE (VEX_W_0F3A4A_P_2) },
6515   },
6516
6517   /* PREFIX_VEX_0F3A4B */
6518   {
6519     { Bad_Opcode },
6520     { Bad_Opcode },
6521     { VEX_W_TABLE (VEX_W_0F3A4B_P_2) },
6522   },
6523
6524   /* PREFIX_VEX_0F3A4C */
6525   {
6526     { Bad_Opcode },
6527     { Bad_Opcode },
6528     { VEX_W_TABLE (VEX_W_0F3A4C_P_2) },
6529   },
6530
6531   /* PREFIX_VEX_0F3A5C */
6532   {
6533     { Bad_Opcode },
6534     { Bad_Opcode },
6535     { "vfmaddsubps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
6536   },
6537
6538   /* PREFIX_VEX_0F3A5D */
6539   {
6540     { Bad_Opcode },
6541     { Bad_Opcode },
6542     { "vfmaddsubpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
6543   },
6544
6545   /* PREFIX_VEX_0F3A5E */
6546   {
6547     { Bad_Opcode },
6548     { Bad_Opcode },
6549     { "vfmsubaddps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
6550   },
6551
6552   /* PREFIX_VEX_0F3A5F */
6553   {
6554     { Bad_Opcode },
6555     { Bad_Opcode },
6556     { "vfmsubaddpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
6557   },
6558
6559   /* PREFIX_VEX_0F3A60 */
6560   {
6561     { Bad_Opcode },
6562     { Bad_Opcode },
6563     { VEX_LEN_TABLE (VEX_LEN_0F3A60_P_2) },
6564     { Bad_Opcode },
6565   },
6566
6567   /* PREFIX_VEX_0F3A61 */
6568   {
6569     { Bad_Opcode },
6570     { Bad_Opcode },
6571     { VEX_LEN_TABLE (VEX_LEN_0F3A61_P_2) },
6572   },
6573
6574   /* PREFIX_VEX_0F3A62 */
6575   {
6576     { Bad_Opcode },
6577     { Bad_Opcode },
6578     { VEX_LEN_TABLE (VEX_LEN_0F3A62_P_2) },
6579   },
6580
6581   /* PREFIX_VEX_0F3A63 */
6582   {
6583     { Bad_Opcode },
6584     { Bad_Opcode },
6585     { VEX_LEN_TABLE (VEX_LEN_0F3A63_P_2) },
6586   },
6587
6588   /* PREFIX_VEX_0F3A68 */
6589   {
6590     { Bad_Opcode },
6591     { Bad_Opcode },
6592     { "vfmaddps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
6593   },
6594
6595   /* PREFIX_VEX_0F3A69 */
6596   {
6597     { Bad_Opcode },
6598     { Bad_Opcode },
6599     { "vfmaddpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
6600   },
6601
6602   /* PREFIX_VEX_0F3A6A */
6603   {
6604     { Bad_Opcode },
6605     { Bad_Opcode },
6606     { VEX_LEN_TABLE (VEX_LEN_0F3A6A_P_2) },
6607   },
6608
6609   /* PREFIX_VEX_0F3A6B */
6610   {
6611     { Bad_Opcode },
6612     { Bad_Opcode },
6613     { VEX_LEN_TABLE (VEX_LEN_0F3A6B_P_2) },
6614   },
6615
6616   /* PREFIX_VEX_0F3A6C */
6617   {
6618     { Bad_Opcode },
6619     { Bad_Opcode },
6620     { "vfmsubps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
6621   },
6622
6623   /* PREFIX_VEX_0F3A6D */
6624   {
6625     { Bad_Opcode },
6626     { Bad_Opcode },
6627     { "vfmsubpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
6628   },
6629
6630   /* PREFIX_VEX_0F3A6E */
6631   {
6632     { Bad_Opcode },
6633     { Bad_Opcode },
6634     { VEX_LEN_TABLE (VEX_LEN_0F3A6E_P_2) },
6635   },
6636
6637   /* PREFIX_VEX_0F3A6F */
6638   {
6639     { Bad_Opcode },
6640     { Bad_Opcode },
6641     { VEX_LEN_TABLE (VEX_LEN_0F3A6F_P_2) },
6642   },
6643
6644   /* PREFIX_VEX_0F3A78 */
6645   {
6646     { Bad_Opcode },
6647     { Bad_Opcode },
6648     { "vfnmaddps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
6649   },
6650
6651   /* PREFIX_VEX_0F3A79 */
6652   {
6653     { Bad_Opcode },
6654     { Bad_Opcode },
6655     { "vfnmaddpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
6656   },
6657
6658   /* PREFIX_VEX_0F3A7A */
6659   {
6660     { Bad_Opcode },
6661     { Bad_Opcode },
6662     { VEX_LEN_TABLE (VEX_LEN_0F3A7A_P_2) },
6663   },
6664
6665   /* PREFIX_VEX_0F3A7B */
6666   {
6667     { Bad_Opcode },
6668     { Bad_Opcode },
6669     { VEX_LEN_TABLE (VEX_LEN_0F3A7B_P_2) },
6670   },
6671
6672   /* PREFIX_VEX_0F3A7C */
6673   {
6674     { Bad_Opcode },
6675     { Bad_Opcode },
6676     { "vfnmsubps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
6677     { Bad_Opcode },
6678   },
6679
6680   /* PREFIX_VEX_0F3A7D */
6681   {
6682     { Bad_Opcode },
6683     { Bad_Opcode },
6684     { "vfnmsubpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
6685   },
6686
6687   /* PREFIX_VEX_0F3A7E */
6688   {
6689     { Bad_Opcode },
6690     { Bad_Opcode },
6691     { VEX_LEN_TABLE (VEX_LEN_0F3A7E_P_2) },
6692   },
6693
6694   /* PREFIX_VEX_0F3A7F */
6695   {
6696     { Bad_Opcode },
6697     { Bad_Opcode },
6698     { VEX_LEN_TABLE (VEX_LEN_0F3A7F_P_2) },
6699   },
6700
6701   /* PREFIX_VEX_0F3ADF */
6702   {
6703     { Bad_Opcode },
6704     { Bad_Opcode },
6705     { VEX_LEN_TABLE (VEX_LEN_0F3ADF_P_2) },
6706   },
6707
6708   /* PREFIX_VEX_0F3AF0 */
6709   {
6710     { Bad_Opcode },
6711     { Bad_Opcode },
6712     { Bad_Opcode },
6713     { VEX_LEN_TABLE (VEX_LEN_0F3AF0_P_3) },
6714   },
6715
6716 #define NEED_PREFIX_TABLE
6717 #include "i386-dis-evex.h"
6718 #undef NEED_PREFIX_TABLE
6719 };
6720
6721 static const struct dis386 x86_64_table[][2] = {
6722   /* X86_64_06 */
6723   {
6724     { "pushP", { es }, 0 },
6725   },
6726
6727   /* X86_64_07 */
6728   {
6729     { "popP", { es }, 0 },
6730   },
6731
6732   /* X86_64_0D */
6733   {
6734     { "pushP", { cs }, 0 },
6735   },
6736
6737   /* X86_64_16 */
6738   {
6739     { "pushP", { ss }, 0 },
6740   },
6741
6742   /* X86_64_17 */
6743   {
6744     { "popP", { ss }, 0 },
6745   },
6746
6747   /* X86_64_1E */
6748   {
6749     { "pushP", { ds }, 0 },
6750   },
6751
6752   /* X86_64_1F */
6753   {
6754     { "popP", { ds }, 0 },
6755   },
6756
6757   /* X86_64_27 */
6758   {
6759     { "daa", { XX }, 0 },
6760   },
6761
6762   /* X86_64_2F */
6763   {
6764     { "das", { XX }, 0 },
6765   },
6766
6767   /* X86_64_37 */
6768   {
6769     { "aaa", { XX }, 0 },
6770   },
6771
6772   /* X86_64_3F */
6773   {
6774     { "aas", { XX }, 0 },
6775   },
6776
6777   /* X86_64_60 */
6778   {
6779     { "pushaP", { XX }, 0 },
6780   },
6781
6782   /* X86_64_61 */
6783   {
6784     { "popaP", { XX }, 0 },
6785   },
6786
6787   /* X86_64_62 */
6788   {
6789     { MOD_TABLE (MOD_62_32BIT) },
6790     { EVEX_TABLE (EVEX_0F) },
6791   },
6792
6793   /* X86_64_63 */
6794   {
6795     { "arpl", { Ew, Gw }, 0 },
6796     { "movs{lq|xd}", { Gv, Ed }, 0 },
6797   },
6798
6799   /* X86_64_6D */
6800   {
6801     { "ins{R|}", { Yzr, indirDX }, 0 },
6802     { "ins{G|}", { Yzr, indirDX }, 0 },
6803   },
6804
6805   /* X86_64_6F */
6806   {
6807     { "outs{R|}", { indirDXr, Xz }, 0 },
6808     { "outs{G|}", { indirDXr, Xz }, 0 },
6809   },
6810
6811   /* X86_64_9A */
6812   {
6813     { "Jcall{T|}", { Ap }, 0 },
6814   },
6815
6816   /* X86_64_C4 */
6817   {
6818     { MOD_TABLE (MOD_C4_32BIT) },
6819     { VEX_C4_TABLE (VEX_0F) },
6820   },
6821
6822   /* X86_64_C5 */
6823   {
6824     { MOD_TABLE (MOD_C5_32BIT) },
6825     { VEX_C5_TABLE (VEX_0F) },
6826   },
6827
6828   /* X86_64_CE */
6829   {
6830     { "into", { XX }, 0 },
6831   },
6832
6833   /* X86_64_D4 */
6834   {
6835     { "aam", { Ib }, 0 },
6836   },
6837
6838   /* X86_64_D5 */
6839   {
6840     { "aad", { Ib }, 0 },
6841   },
6842
6843   /* X86_64_EA */
6844   {
6845     { "Jjmp{T|}", { Ap }, 0 },
6846   },
6847
6848   /* X86_64_0F01_REG_0 */
6849   {
6850     { "sgdt{Q|IQ}", { M }, 0 },
6851     { "sgdt", { M }, 0 },
6852   },
6853
6854   /* X86_64_0F01_REG_1 */
6855   {
6856     { "sidt{Q|IQ}", { M }, 0 },
6857     { "sidt", { M }, 0 },
6858   },
6859
6860   /* X86_64_0F01_REG_2 */
6861   {
6862     { "lgdt{Q|Q}", { M }, 0 },
6863     { "lgdt", { M }, 0 },
6864   },
6865
6866   /* X86_64_0F01_REG_3 */
6867   {
6868     { "lidt{Q|Q}", { M }, 0 },
6869     { "lidt", { M }, 0 },
6870   },
6871 };
6872
6873 static const struct dis386 three_byte_table[][256] = {
6874
6875   /* THREE_BYTE_0F38 */
6876   {
6877     /* 00 */
6878     { "pshufb",         { MX, EM }, PREFIX_OPCODE },
6879     { "phaddw",         { MX, EM }, PREFIX_OPCODE },
6880     { "phaddd",         { MX, EM }, PREFIX_OPCODE },
6881     { "phaddsw",        { MX, EM }, PREFIX_OPCODE },
6882     { "pmaddubsw",      { MX, EM }, PREFIX_OPCODE },
6883     { "phsubw",         { MX, EM }, PREFIX_OPCODE },
6884     { "phsubd",         { MX, EM }, PREFIX_OPCODE },
6885     { "phsubsw",        { MX, EM }, PREFIX_OPCODE },
6886     /* 08 */
6887     { "psignb",         { MX, EM }, PREFIX_OPCODE },
6888     { "psignw",         { MX, EM }, PREFIX_OPCODE },
6889     { "psignd",         { MX, EM }, PREFIX_OPCODE },
6890     { "pmulhrsw",       { MX, EM }, PREFIX_OPCODE },
6891     { Bad_Opcode },
6892     { Bad_Opcode },
6893     { Bad_Opcode },
6894     { Bad_Opcode },
6895     /* 10 */
6896     { PREFIX_TABLE (PREFIX_0F3810) },
6897     { Bad_Opcode },
6898     { Bad_Opcode },
6899     { Bad_Opcode },
6900     { PREFIX_TABLE (PREFIX_0F3814) },
6901     { PREFIX_TABLE (PREFIX_0F3815) },
6902     { Bad_Opcode },
6903     { PREFIX_TABLE (PREFIX_0F3817) },
6904     /* 18 */
6905     { Bad_Opcode },
6906     { Bad_Opcode },
6907     { Bad_Opcode },
6908     { Bad_Opcode },
6909     { "pabsb",          { MX, EM }, PREFIX_OPCODE },
6910     { "pabsw",          { MX, EM }, PREFIX_OPCODE },
6911     { "pabsd",          { MX, EM }, PREFIX_OPCODE },
6912     { Bad_Opcode },
6913     /* 20 */
6914     { PREFIX_TABLE (PREFIX_0F3820) },
6915     { PREFIX_TABLE (PREFIX_0F3821) },
6916     { PREFIX_TABLE (PREFIX_0F3822) },
6917     { PREFIX_TABLE (PREFIX_0F3823) },
6918     { PREFIX_TABLE (PREFIX_0F3824) },
6919     { PREFIX_TABLE (PREFIX_0F3825) },
6920     { Bad_Opcode },
6921     { Bad_Opcode },
6922     /* 28 */
6923     { PREFIX_TABLE (PREFIX_0F3828) },
6924     { PREFIX_TABLE (PREFIX_0F3829) },
6925     { PREFIX_TABLE (PREFIX_0F382A) },
6926     { PREFIX_TABLE (PREFIX_0F382B) },
6927     { Bad_Opcode },
6928     { Bad_Opcode },
6929     { Bad_Opcode },
6930     { Bad_Opcode },
6931     /* 30 */
6932     { PREFIX_TABLE (PREFIX_0F3830) },
6933     { PREFIX_TABLE (PREFIX_0F3831) },
6934     { PREFIX_TABLE (PREFIX_0F3832) },
6935     { PREFIX_TABLE (PREFIX_0F3833) },
6936     { PREFIX_TABLE (PREFIX_0F3834) },
6937     { PREFIX_TABLE (PREFIX_0F3835) },
6938     { Bad_Opcode },
6939     { PREFIX_TABLE (PREFIX_0F3837) },
6940     /* 38 */
6941     { PREFIX_TABLE (PREFIX_0F3838) },
6942     { PREFIX_TABLE (PREFIX_0F3839) },
6943     { PREFIX_TABLE (PREFIX_0F383A) },
6944     { PREFIX_TABLE (PREFIX_0F383B) },
6945     { PREFIX_TABLE (PREFIX_0F383C) },
6946     { PREFIX_TABLE (PREFIX_0F383D) },
6947     { PREFIX_TABLE (PREFIX_0F383E) },
6948     { PREFIX_TABLE (PREFIX_0F383F) },
6949     /* 40 */
6950     { PREFIX_TABLE (PREFIX_0F3840) },
6951     { PREFIX_TABLE (PREFIX_0F3841) },
6952     { Bad_Opcode },
6953     { Bad_Opcode },
6954     { Bad_Opcode },
6955     { Bad_Opcode },
6956     { Bad_Opcode },
6957     { Bad_Opcode },
6958     /* 48 */
6959     { Bad_Opcode },
6960     { Bad_Opcode },
6961     { Bad_Opcode },
6962     { Bad_Opcode },
6963     { Bad_Opcode },
6964     { Bad_Opcode },
6965     { Bad_Opcode },
6966     { Bad_Opcode },
6967     /* 50 */
6968     { Bad_Opcode },
6969     { Bad_Opcode },
6970     { Bad_Opcode },
6971     { Bad_Opcode },
6972     { Bad_Opcode },
6973     { Bad_Opcode },
6974     { Bad_Opcode },
6975     { Bad_Opcode },
6976     /* 58 */
6977     { Bad_Opcode },
6978     { Bad_Opcode },
6979     { Bad_Opcode },
6980     { Bad_Opcode },
6981     { Bad_Opcode },
6982     { Bad_Opcode },
6983     { Bad_Opcode },
6984     { Bad_Opcode },
6985     /* 60 */
6986     { Bad_Opcode },
6987     { Bad_Opcode },
6988     { Bad_Opcode },
6989     { Bad_Opcode },
6990     { Bad_Opcode },
6991     { Bad_Opcode },
6992     { Bad_Opcode },
6993     { Bad_Opcode },
6994     /* 68 */
6995     { Bad_Opcode },
6996     { Bad_Opcode },
6997     { Bad_Opcode },
6998     { Bad_Opcode },
6999     { Bad_Opcode },
7000     { Bad_Opcode },
7001     { Bad_Opcode },
7002     { Bad_Opcode },
7003     /* 70 */
7004     { Bad_Opcode },
7005     { Bad_Opcode },
7006     { Bad_Opcode },
7007     { Bad_Opcode },
7008     { Bad_Opcode },
7009     { Bad_Opcode },
7010     { Bad_Opcode },
7011     { Bad_Opcode },
7012     /* 78 */
7013     { Bad_Opcode },
7014     { Bad_Opcode },
7015     { Bad_Opcode },
7016     { Bad_Opcode },
7017     { Bad_Opcode },
7018     { Bad_Opcode },
7019     { Bad_Opcode },
7020     { Bad_Opcode },
7021     /* 80 */
7022     { PREFIX_TABLE (PREFIX_0F3880) },
7023     { PREFIX_TABLE (PREFIX_0F3881) },
7024     { PREFIX_TABLE (PREFIX_0F3882) },
7025     { Bad_Opcode },
7026     { Bad_Opcode },
7027     { Bad_Opcode },
7028     { Bad_Opcode },
7029     { Bad_Opcode },
7030     /* 88 */
7031     { Bad_Opcode },
7032     { Bad_Opcode },
7033     { Bad_Opcode },
7034     { Bad_Opcode },
7035     { Bad_Opcode },
7036     { Bad_Opcode },
7037     { Bad_Opcode },
7038     { Bad_Opcode },
7039     /* 90 */
7040     { Bad_Opcode },
7041     { Bad_Opcode },
7042     { Bad_Opcode },
7043     { Bad_Opcode },
7044     { Bad_Opcode },
7045     { Bad_Opcode },
7046     { Bad_Opcode },
7047     { Bad_Opcode },
7048     /* 98 */
7049     { Bad_Opcode },
7050     { Bad_Opcode },
7051     { Bad_Opcode },
7052     { Bad_Opcode },
7053     { Bad_Opcode },
7054     { Bad_Opcode },
7055     { Bad_Opcode },
7056     { Bad_Opcode },
7057     /* a0 */
7058     { Bad_Opcode },
7059     { Bad_Opcode },
7060     { Bad_Opcode },
7061     { Bad_Opcode },
7062     { Bad_Opcode },
7063     { Bad_Opcode },
7064     { Bad_Opcode },
7065     { Bad_Opcode },
7066     /* a8 */
7067     { Bad_Opcode },
7068     { Bad_Opcode },
7069     { Bad_Opcode },
7070     { Bad_Opcode },
7071     { Bad_Opcode },
7072     { Bad_Opcode },
7073     { Bad_Opcode },
7074     { Bad_Opcode },
7075     /* b0 */
7076     { Bad_Opcode },
7077     { Bad_Opcode },
7078     { Bad_Opcode },
7079     { Bad_Opcode },
7080     { Bad_Opcode },
7081     { Bad_Opcode },
7082     { Bad_Opcode },
7083     { Bad_Opcode },
7084     /* b8 */
7085     { Bad_Opcode },
7086     { Bad_Opcode },
7087     { Bad_Opcode },
7088     { Bad_Opcode },
7089     { Bad_Opcode },
7090     { Bad_Opcode },
7091     { Bad_Opcode },
7092     { Bad_Opcode },
7093     /* c0 */
7094     { Bad_Opcode },
7095     { Bad_Opcode },
7096     { Bad_Opcode },
7097     { Bad_Opcode },
7098     { Bad_Opcode },
7099     { Bad_Opcode },
7100     { Bad_Opcode },
7101     { Bad_Opcode },
7102     /* c8 */
7103     { PREFIX_TABLE (PREFIX_0F38C8) },
7104     { PREFIX_TABLE (PREFIX_0F38C9) },
7105     { PREFIX_TABLE (PREFIX_0F38CA) },
7106     { PREFIX_TABLE (PREFIX_0F38CB) },
7107     { PREFIX_TABLE (PREFIX_0F38CC) },
7108     { PREFIX_TABLE (PREFIX_0F38CD) },
7109     { Bad_Opcode },
7110     { Bad_Opcode },
7111     /* d0 */
7112     { Bad_Opcode },
7113     { Bad_Opcode },
7114     { Bad_Opcode },
7115     { Bad_Opcode },
7116     { Bad_Opcode },
7117     { Bad_Opcode },
7118     { Bad_Opcode },
7119     { Bad_Opcode },
7120     /* d8 */
7121     { Bad_Opcode },
7122     { Bad_Opcode },
7123     { Bad_Opcode },
7124     { PREFIX_TABLE (PREFIX_0F38DB) },
7125     { PREFIX_TABLE (PREFIX_0F38DC) },
7126     { PREFIX_TABLE (PREFIX_0F38DD) },
7127     { PREFIX_TABLE (PREFIX_0F38DE) },
7128     { PREFIX_TABLE (PREFIX_0F38DF) },
7129     /* e0 */
7130     { Bad_Opcode },
7131     { Bad_Opcode },
7132     { Bad_Opcode },
7133     { Bad_Opcode },
7134     { Bad_Opcode },
7135     { Bad_Opcode },
7136     { Bad_Opcode },
7137     { Bad_Opcode },
7138     /* e8 */
7139     { Bad_Opcode },
7140     { Bad_Opcode },
7141     { Bad_Opcode },
7142     { Bad_Opcode },
7143     { Bad_Opcode },
7144     { Bad_Opcode },
7145     { Bad_Opcode },
7146     { Bad_Opcode },
7147     /* f0 */
7148     { PREFIX_TABLE (PREFIX_0F38F0) },
7149     { PREFIX_TABLE (PREFIX_0F38F1) },
7150     { Bad_Opcode },
7151     { Bad_Opcode },
7152     { Bad_Opcode },
7153     { Bad_Opcode },
7154     { PREFIX_TABLE (PREFIX_0F38F6) },
7155     { Bad_Opcode },
7156     /* f8 */
7157     { Bad_Opcode },
7158     { Bad_Opcode },
7159     { Bad_Opcode },
7160     { Bad_Opcode },
7161     { Bad_Opcode },
7162     { Bad_Opcode },
7163     { Bad_Opcode },
7164     { Bad_Opcode },
7165   },
7166   /* THREE_BYTE_0F3A */
7167   {
7168     /* 00 */
7169     { Bad_Opcode },
7170     { Bad_Opcode },
7171     { Bad_Opcode },
7172     { Bad_Opcode },
7173     { Bad_Opcode },
7174     { Bad_Opcode },
7175     { Bad_Opcode },
7176     { Bad_Opcode },
7177     /* 08 */
7178     { PREFIX_TABLE (PREFIX_0F3A08) },
7179     { PREFIX_TABLE (PREFIX_0F3A09) },
7180     { PREFIX_TABLE (PREFIX_0F3A0A) },
7181     { PREFIX_TABLE (PREFIX_0F3A0B) },
7182     { PREFIX_TABLE (PREFIX_0F3A0C) },
7183     { PREFIX_TABLE (PREFIX_0F3A0D) },
7184     { PREFIX_TABLE (PREFIX_0F3A0E) },
7185     { "palignr",        { MX, EM, Ib }, PREFIX_OPCODE },
7186     /* 10 */
7187     { Bad_Opcode },
7188     { Bad_Opcode },
7189     { Bad_Opcode },
7190     { Bad_Opcode },
7191     { PREFIX_TABLE (PREFIX_0F3A14) },
7192     { PREFIX_TABLE (PREFIX_0F3A15) },
7193     { PREFIX_TABLE (PREFIX_0F3A16) },
7194     { PREFIX_TABLE (PREFIX_0F3A17) },
7195     /* 18 */
7196     { Bad_Opcode },
7197     { Bad_Opcode },
7198     { Bad_Opcode },
7199     { Bad_Opcode },
7200     { Bad_Opcode },
7201     { Bad_Opcode },
7202     { Bad_Opcode },
7203     { Bad_Opcode },
7204     /* 20 */
7205     { PREFIX_TABLE (PREFIX_0F3A20) },
7206     { PREFIX_TABLE (PREFIX_0F3A21) },
7207     { PREFIX_TABLE (PREFIX_0F3A22) },
7208     { Bad_Opcode },
7209     { Bad_Opcode },
7210     { Bad_Opcode },
7211     { Bad_Opcode },
7212     { Bad_Opcode },
7213     /* 28 */
7214     { Bad_Opcode },
7215     { Bad_Opcode },
7216     { Bad_Opcode },
7217     { Bad_Opcode },
7218     { Bad_Opcode },
7219     { Bad_Opcode },
7220     { Bad_Opcode },
7221     { Bad_Opcode },
7222     /* 30 */
7223     { Bad_Opcode },
7224     { Bad_Opcode },
7225     { Bad_Opcode },
7226     { Bad_Opcode },
7227     { Bad_Opcode },
7228     { Bad_Opcode },
7229     { Bad_Opcode },
7230     { Bad_Opcode },
7231     /* 38 */
7232     { Bad_Opcode },
7233     { Bad_Opcode },
7234     { Bad_Opcode },
7235     { Bad_Opcode },
7236     { Bad_Opcode },
7237     { Bad_Opcode },
7238     { Bad_Opcode },
7239     { Bad_Opcode },
7240     /* 40 */
7241     { PREFIX_TABLE (PREFIX_0F3A40) },
7242     { PREFIX_TABLE (PREFIX_0F3A41) },
7243     { PREFIX_TABLE (PREFIX_0F3A42) },
7244     { Bad_Opcode },
7245     { PREFIX_TABLE (PREFIX_0F3A44) },
7246     { Bad_Opcode },
7247     { Bad_Opcode },
7248     { Bad_Opcode },
7249     /* 48 */
7250     { Bad_Opcode },
7251     { Bad_Opcode },
7252     { Bad_Opcode },
7253     { Bad_Opcode },
7254     { Bad_Opcode },
7255     { Bad_Opcode },
7256     { Bad_Opcode },
7257     { Bad_Opcode },
7258     /* 50 */
7259     { Bad_Opcode },
7260     { Bad_Opcode },
7261     { Bad_Opcode },
7262     { Bad_Opcode },
7263     { Bad_Opcode },
7264     { Bad_Opcode },
7265     { Bad_Opcode },
7266     { Bad_Opcode },
7267     /* 58 */
7268     { Bad_Opcode },
7269     { Bad_Opcode },
7270     { Bad_Opcode },
7271     { Bad_Opcode },
7272     { Bad_Opcode },
7273     { Bad_Opcode },
7274     { Bad_Opcode },
7275     { Bad_Opcode },
7276     /* 60 */
7277     { PREFIX_TABLE (PREFIX_0F3A60) },
7278     { PREFIX_TABLE (PREFIX_0F3A61) },
7279     { PREFIX_TABLE (PREFIX_0F3A62) },
7280     { PREFIX_TABLE (PREFIX_0F3A63) },
7281     { Bad_Opcode },
7282     { Bad_Opcode },
7283     { Bad_Opcode },
7284     { Bad_Opcode },
7285     /* 68 */
7286     { Bad_Opcode },
7287     { Bad_Opcode },
7288     { Bad_Opcode },
7289     { Bad_Opcode },
7290     { Bad_Opcode },
7291     { Bad_Opcode },
7292     { Bad_Opcode },
7293     { Bad_Opcode },
7294     /* 70 */
7295     { Bad_Opcode },
7296     { Bad_Opcode },
7297     { Bad_Opcode },
7298     { Bad_Opcode },
7299     { Bad_Opcode },
7300     { Bad_Opcode },
7301     { Bad_Opcode },
7302     { Bad_Opcode },
7303     /* 78 */
7304     { Bad_Opcode },
7305     { Bad_Opcode },
7306     { Bad_Opcode },
7307     { Bad_Opcode },
7308     { Bad_Opcode },
7309     { Bad_Opcode },
7310     { Bad_Opcode },
7311     { Bad_Opcode },
7312     /* 80 */
7313     { Bad_Opcode },
7314     { Bad_Opcode },
7315     { Bad_Opcode },
7316     { Bad_Opcode },
7317     { Bad_Opcode },
7318     { Bad_Opcode },
7319     { Bad_Opcode },
7320     { Bad_Opcode },
7321     /* 88 */
7322     { Bad_Opcode },
7323     { Bad_Opcode },
7324     { Bad_Opcode },
7325     { Bad_Opcode },
7326     { Bad_Opcode },
7327     { Bad_Opcode },
7328     { Bad_Opcode },
7329     { Bad_Opcode },
7330     /* 90 */
7331     { Bad_Opcode },
7332     { Bad_Opcode },
7333     { Bad_Opcode },
7334     { Bad_Opcode },
7335     { Bad_Opcode },
7336     { Bad_Opcode },
7337     { Bad_Opcode },
7338     { Bad_Opcode },
7339     /* 98 */
7340     { Bad_Opcode },
7341     { Bad_Opcode },
7342     { Bad_Opcode },
7343     { Bad_Opcode },
7344     { Bad_Opcode },
7345     { Bad_Opcode },
7346     { Bad_Opcode },
7347     { Bad_Opcode },
7348     /* a0 */
7349     { Bad_Opcode },
7350     { Bad_Opcode },
7351     { Bad_Opcode },
7352     { Bad_Opcode },
7353     { Bad_Opcode },
7354     { Bad_Opcode },
7355     { Bad_Opcode },
7356     { Bad_Opcode },
7357     /* a8 */
7358     { Bad_Opcode },
7359     { Bad_Opcode },
7360     { Bad_Opcode },
7361     { Bad_Opcode },
7362     { Bad_Opcode },
7363     { Bad_Opcode },
7364     { Bad_Opcode },
7365     { Bad_Opcode },
7366     /* b0 */
7367     { Bad_Opcode },
7368     { Bad_Opcode },
7369     { Bad_Opcode },
7370     { Bad_Opcode },
7371     { Bad_Opcode },
7372     { Bad_Opcode },
7373     { Bad_Opcode },
7374     { Bad_Opcode },
7375     /* b8 */
7376     { Bad_Opcode },
7377     { Bad_Opcode },
7378     { Bad_Opcode },
7379     { Bad_Opcode },
7380     { Bad_Opcode },
7381     { Bad_Opcode },
7382     { Bad_Opcode },
7383     { Bad_Opcode },
7384     /* c0 */
7385     { Bad_Opcode },
7386     { Bad_Opcode },
7387     { Bad_Opcode },
7388     { Bad_Opcode },
7389     { Bad_Opcode },
7390     { Bad_Opcode },
7391     { Bad_Opcode },
7392     { Bad_Opcode },
7393     /* c8 */
7394     { Bad_Opcode },
7395     { Bad_Opcode },
7396     { Bad_Opcode },
7397     { Bad_Opcode },
7398     { PREFIX_TABLE (PREFIX_0F3ACC) },
7399     { Bad_Opcode },
7400     { Bad_Opcode },
7401     { Bad_Opcode },
7402     /* d0 */
7403     { Bad_Opcode },
7404     { Bad_Opcode },
7405     { Bad_Opcode },
7406     { Bad_Opcode },
7407     { Bad_Opcode },
7408     { Bad_Opcode },
7409     { Bad_Opcode },
7410     { Bad_Opcode },
7411     /* d8 */
7412     { Bad_Opcode },
7413     { Bad_Opcode },
7414     { Bad_Opcode },
7415     { Bad_Opcode },
7416     { Bad_Opcode },
7417     { Bad_Opcode },
7418     { Bad_Opcode },
7419     { PREFIX_TABLE (PREFIX_0F3ADF) },
7420     /* e0 */
7421     { Bad_Opcode },
7422     { Bad_Opcode },
7423     { Bad_Opcode },
7424     { Bad_Opcode },
7425     { Bad_Opcode },
7426     { Bad_Opcode },
7427     { Bad_Opcode },
7428     { Bad_Opcode },
7429     /* e8 */
7430     { Bad_Opcode },
7431     { Bad_Opcode },
7432     { Bad_Opcode },
7433     { Bad_Opcode },
7434     { Bad_Opcode },
7435     { Bad_Opcode },
7436     { Bad_Opcode },
7437     { Bad_Opcode },
7438     /* f0 */
7439     { Bad_Opcode },
7440     { Bad_Opcode },
7441     { Bad_Opcode },
7442     { Bad_Opcode },
7443     { Bad_Opcode },
7444     { Bad_Opcode },
7445     { Bad_Opcode },
7446     { Bad_Opcode },
7447     /* f8 */
7448     { Bad_Opcode },
7449     { Bad_Opcode },
7450     { Bad_Opcode },
7451     { Bad_Opcode },
7452     { Bad_Opcode },
7453     { Bad_Opcode },
7454     { Bad_Opcode },
7455     { Bad_Opcode },
7456   },
7457
7458   /* THREE_BYTE_0F7A */
7459   {
7460     /* 00 */
7461     { Bad_Opcode },
7462     { Bad_Opcode },
7463     { Bad_Opcode },
7464     { Bad_Opcode },
7465     { Bad_Opcode },
7466     { Bad_Opcode },
7467     { Bad_Opcode },
7468     { Bad_Opcode },
7469     /* 08 */
7470     { Bad_Opcode },
7471     { Bad_Opcode },
7472     { Bad_Opcode },
7473     { Bad_Opcode },
7474     { Bad_Opcode },
7475     { Bad_Opcode },
7476     { Bad_Opcode },
7477     { Bad_Opcode },
7478     /* 10 */
7479     { Bad_Opcode },
7480     { Bad_Opcode },
7481     { Bad_Opcode },
7482     { Bad_Opcode },
7483     { Bad_Opcode },
7484     { Bad_Opcode },
7485     { Bad_Opcode },
7486     { Bad_Opcode },
7487     /* 18 */
7488     { Bad_Opcode },
7489     { Bad_Opcode },
7490     { Bad_Opcode },
7491     { Bad_Opcode },
7492     { Bad_Opcode },
7493     { Bad_Opcode },
7494     { Bad_Opcode },
7495     { Bad_Opcode },
7496     /* 20 */
7497     { "ptest",          { XX }, PREFIX_OPCODE },
7498     { Bad_Opcode },
7499     { Bad_Opcode },
7500     { Bad_Opcode },
7501     { Bad_Opcode },
7502     { Bad_Opcode },
7503     { Bad_Opcode },
7504     { Bad_Opcode },
7505     /* 28 */
7506     { Bad_Opcode },
7507     { Bad_Opcode },
7508     { Bad_Opcode },
7509     { Bad_Opcode },
7510     { Bad_Opcode },
7511     { Bad_Opcode },
7512     { Bad_Opcode },
7513     { Bad_Opcode },
7514     /* 30 */
7515     { Bad_Opcode },
7516     { Bad_Opcode },
7517     { Bad_Opcode },
7518     { Bad_Opcode },
7519     { Bad_Opcode },
7520     { Bad_Opcode },
7521     { Bad_Opcode },
7522     { Bad_Opcode },
7523     /* 38 */
7524     { Bad_Opcode },
7525     { Bad_Opcode },
7526     { Bad_Opcode },
7527     { Bad_Opcode },
7528     { Bad_Opcode },
7529     { Bad_Opcode },
7530     { Bad_Opcode },
7531     { Bad_Opcode },
7532     /* 40 */
7533     { Bad_Opcode },
7534     { "phaddbw",        { XM, EXq }, PREFIX_OPCODE },
7535     { "phaddbd",        { XM, EXq }, PREFIX_OPCODE },
7536     { "phaddbq",        { XM, EXq }, PREFIX_OPCODE },
7537     { Bad_Opcode },
7538     { Bad_Opcode },
7539     { "phaddwd",        { XM, EXq }, PREFIX_OPCODE },
7540     { "phaddwq",        { XM, EXq }, PREFIX_OPCODE },
7541     /* 48 */
7542     { Bad_Opcode },
7543     { Bad_Opcode },
7544     { Bad_Opcode },
7545     { "phadddq",        { XM, EXq }, PREFIX_OPCODE },
7546     { Bad_Opcode },
7547     { Bad_Opcode },
7548     { Bad_Opcode },
7549     { Bad_Opcode },
7550     /* 50 */
7551     { Bad_Opcode },
7552     { "phaddubw",       { XM, EXq }, PREFIX_OPCODE },
7553     { "phaddubd",       { XM, EXq }, PREFIX_OPCODE },
7554     { "phaddubq",       { XM, EXq }, PREFIX_OPCODE },
7555     { Bad_Opcode },
7556     { Bad_Opcode },
7557     { "phadduwd",       { XM, EXq }, PREFIX_OPCODE },
7558     { "phadduwq",       { XM, EXq }, PREFIX_OPCODE },
7559     /* 58 */
7560     { Bad_Opcode },
7561     { Bad_Opcode },
7562     { Bad_Opcode },
7563     { "phaddudq",       { XM, EXq }, PREFIX_OPCODE },
7564     { Bad_Opcode },
7565     { Bad_Opcode },
7566     { Bad_Opcode },
7567     { Bad_Opcode },
7568     /* 60 */
7569     { Bad_Opcode },
7570     { "phsubbw",        { XM, EXq }, PREFIX_OPCODE },
7571     { "phsubbd",        { XM, EXq }, PREFIX_OPCODE },
7572     { "phsubbq",        { XM, EXq }, PREFIX_OPCODE },
7573     { Bad_Opcode },
7574     { Bad_Opcode },
7575     { Bad_Opcode },
7576     { Bad_Opcode },
7577     /* 68 */
7578     { Bad_Opcode },
7579     { Bad_Opcode },
7580     { Bad_Opcode },
7581     { Bad_Opcode },
7582     { Bad_Opcode },
7583     { Bad_Opcode },
7584     { Bad_Opcode },
7585     { Bad_Opcode },
7586     /* 70 */
7587     { Bad_Opcode },
7588     { Bad_Opcode },
7589     { Bad_Opcode },
7590     { Bad_Opcode },
7591     { Bad_Opcode },
7592     { Bad_Opcode },
7593     { Bad_Opcode },
7594     { Bad_Opcode },
7595     /* 78 */
7596     { Bad_Opcode },
7597     { Bad_Opcode },
7598     { Bad_Opcode },
7599     { Bad_Opcode },
7600     { Bad_Opcode },
7601     { Bad_Opcode },
7602     { Bad_Opcode },
7603     { Bad_Opcode },
7604     /* 80 */
7605     { Bad_Opcode },
7606     { Bad_Opcode },
7607     { Bad_Opcode },
7608     { Bad_Opcode },
7609     { Bad_Opcode },
7610     { Bad_Opcode },
7611     { Bad_Opcode },
7612     { Bad_Opcode },
7613     /* 88 */
7614     { Bad_Opcode },
7615     { Bad_Opcode },
7616     { Bad_Opcode },
7617     { Bad_Opcode },
7618     { Bad_Opcode },
7619     { Bad_Opcode },
7620     { Bad_Opcode },
7621     { Bad_Opcode },
7622     /* 90 */
7623     { Bad_Opcode },
7624     { Bad_Opcode },
7625     { Bad_Opcode },
7626     { Bad_Opcode },
7627     { Bad_Opcode },
7628     { Bad_Opcode },
7629     { Bad_Opcode },
7630     { Bad_Opcode },
7631     /* 98 */
7632     { Bad_Opcode },
7633     { Bad_Opcode },
7634     { Bad_Opcode },
7635     { Bad_Opcode },
7636     { Bad_Opcode },
7637     { Bad_Opcode },
7638     { Bad_Opcode },
7639     { Bad_Opcode },
7640     /* a0 */
7641     { Bad_Opcode },
7642     { Bad_Opcode },
7643     { Bad_Opcode },
7644     { Bad_Opcode },
7645     { Bad_Opcode },
7646     { Bad_Opcode },
7647     { Bad_Opcode },
7648     { Bad_Opcode },
7649     /* a8 */
7650     { Bad_Opcode },
7651     { Bad_Opcode },
7652     { Bad_Opcode },
7653     { Bad_Opcode },
7654     { Bad_Opcode },
7655     { Bad_Opcode },
7656     { Bad_Opcode },
7657     { Bad_Opcode },
7658     /* b0 */
7659     { Bad_Opcode },
7660     { Bad_Opcode },
7661     { Bad_Opcode },
7662     { Bad_Opcode },
7663     { Bad_Opcode },
7664     { Bad_Opcode },
7665     { Bad_Opcode },
7666     { Bad_Opcode },
7667     /* b8 */
7668     { Bad_Opcode },
7669     { Bad_Opcode },
7670     { Bad_Opcode },
7671     { Bad_Opcode },
7672     { Bad_Opcode },
7673     { Bad_Opcode },
7674     { Bad_Opcode },
7675     { Bad_Opcode },
7676     /* c0 */
7677     { Bad_Opcode },
7678     { Bad_Opcode },
7679     { Bad_Opcode },
7680     { Bad_Opcode },
7681     { Bad_Opcode },
7682     { Bad_Opcode },
7683     { Bad_Opcode },
7684     { Bad_Opcode },
7685     /* c8 */
7686     { Bad_Opcode },
7687     { Bad_Opcode },
7688     { Bad_Opcode },
7689     { Bad_Opcode },
7690     { Bad_Opcode },
7691     { Bad_Opcode },
7692     { Bad_Opcode },
7693     { Bad_Opcode },
7694     /* d0 */
7695     { Bad_Opcode },
7696     { Bad_Opcode },
7697     { Bad_Opcode },
7698     { Bad_Opcode },
7699     { Bad_Opcode },
7700     { Bad_Opcode },
7701     { Bad_Opcode },
7702     { Bad_Opcode },
7703     /* d8 */
7704     { Bad_Opcode },
7705     { Bad_Opcode },
7706     { Bad_Opcode },
7707     { Bad_Opcode },
7708     { Bad_Opcode },
7709     { Bad_Opcode },
7710     { Bad_Opcode },
7711     { Bad_Opcode },
7712     /* e0 */
7713     { Bad_Opcode },
7714     { Bad_Opcode },
7715     { Bad_Opcode },
7716     { Bad_Opcode },
7717     { Bad_Opcode },
7718     { Bad_Opcode },
7719     { Bad_Opcode },
7720     { Bad_Opcode },
7721     /* e8 */
7722     { Bad_Opcode },
7723     { Bad_Opcode },
7724     { Bad_Opcode },
7725     { Bad_Opcode },
7726     { Bad_Opcode },
7727     { Bad_Opcode },
7728     { Bad_Opcode },
7729     { Bad_Opcode },
7730     /* f0 */
7731     { Bad_Opcode },
7732     { Bad_Opcode },
7733     { Bad_Opcode },
7734     { Bad_Opcode },
7735     { Bad_Opcode },
7736     { Bad_Opcode },
7737     { Bad_Opcode },
7738     { Bad_Opcode },
7739     /* f8 */
7740     { Bad_Opcode },
7741     { Bad_Opcode },
7742     { Bad_Opcode },
7743     { Bad_Opcode },
7744     { Bad_Opcode },
7745     { Bad_Opcode },
7746     { Bad_Opcode },
7747     { Bad_Opcode },
7748   },
7749 };
7750
7751 static const struct dis386 xop_table[][256] = {
7752   /* XOP_08 */
7753   {
7754     /* 00 */
7755     { Bad_Opcode },
7756     { Bad_Opcode },
7757     { Bad_Opcode },
7758     { Bad_Opcode },
7759     { Bad_Opcode },
7760     { Bad_Opcode },
7761     { Bad_Opcode },
7762     { Bad_Opcode },
7763     /* 08 */
7764     { Bad_Opcode },
7765     { Bad_Opcode },
7766     { Bad_Opcode },
7767     { Bad_Opcode },
7768     { Bad_Opcode },
7769     { Bad_Opcode },
7770     { Bad_Opcode },
7771     { Bad_Opcode },
7772     /* 10 */
7773     { Bad_Opcode },
7774     { Bad_Opcode },
7775     { Bad_Opcode },
7776     { Bad_Opcode },
7777     { Bad_Opcode },
7778     { Bad_Opcode },
7779     { Bad_Opcode },
7780     { Bad_Opcode },
7781     /* 18 */
7782     { Bad_Opcode },
7783     { Bad_Opcode },
7784     { Bad_Opcode },
7785     { Bad_Opcode },
7786     { Bad_Opcode },
7787     { Bad_Opcode },
7788     { Bad_Opcode },
7789     { Bad_Opcode },
7790     /* 20 */
7791     { Bad_Opcode },
7792     { Bad_Opcode },
7793     { Bad_Opcode },
7794     { Bad_Opcode },
7795     { Bad_Opcode },
7796     { Bad_Opcode },
7797     { Bad_Opcode },
7798     { Bad_Opcode },
7799     /* 28 */
7800     { Bad_Opcode },
7801     { Bad_Opcode },
7802     { Bad_Opcode },
7803     { Bad_Opcode },
7804     { Bad_Opcode },
7805     { Bad_Opcode },
7806     { Bad_Opcode },
7807     { Bad_Opcode },
7808     /* 30 */
7809     { Bad_Opcode },
7810     { Bad_Opcode },
7811     { Bad_Opcode },
7812     { Bad_Opcode },
7813     { Bad_Opcode },
7814     { Bad_Opcode },
7815     { Bad_Opcode },
7816     { Bad_Opcode },
7817     /* 38 */
7818     { Bad_Opcode },
7819     { Bad_Opcode },
7820     { Bad_Opcode },
7821     { Bad_Opcode },
7822     { Bad_Opcode },
7823     { Bad_Opcode },
7824     { Bad_Opcode },
7825     { Bad_Opcode },
7826     /* 40 */
7827     { Bad_Opcode },
7828     { Bad_Opcode },
7829     { Bad_Opcode },
7830     { Bad_Opcode },
7831     { Bad_Opcode },
7832     { Bad_Opcode },
7833     { Bad_Opcode },
7834     { Bad_Opcode },
7835     /* 48 */
7836     { Bad_Opcode },
7837     { Bad_Opcode },
7838     { Bad_Opcode },
7839     { Bad_Opcode },
7840     { Bad_Opcode },
7841     { Bad_Opcode },
7842     { Bad_Opcode },
7843     { Bad_Opcode },
7844     /* 50 */
7845     { Bad_Opcode },
7846     { Bad_Opcode },
7847     { Bad_Opcode },
7848     { Bad_Opcode },
7849     { Bad_Opcode },
7850     { Bad_Opcode },
7851     { Bad_Opcode },
7852     { Bad_Opcode },
7853     /* 58 */
7854     { Bad_Opcode },
7855     { Bad_Opcode },
7856     { Bad_Opcode },
7857     { Bad_Opcode },
7858     { Bad_Opcode },
7859     { Bad_Opcode },
7860     { Bad_Opcode },
7861     { Bad_Opcode },
7862     /* 60 */
7863     { Bad_Opcode },
7864     { Bad_Opcode },
7865     { Bad_Opcode },
7866     { Bad_Opcode },
7867     { Bad_Opcode },
7868     { Bad_Opcode },
7869     { Bad_Opcode },
7870     { Bad_Opcode },
7871     /* 68 */
7872     { Bad_Opcode },
7873     { Bad_Opcode },
7874     { Bad_Opcode },
7875     { Bad_Opcode },
7876     { Bad_Opcode },
7877     { Bad_Opcode },
7878     { Bad_Opcode },
7879     { Bad_Opcode },
7880     /* 70 */
7881     { Bad_Opcode },
7882     { Bad_Opcode },
7883     { Bad_Opcode },
7884     { Bad_Opcode },
7885     { Bad_Opcode },
7886     { Bad_Opcode },
7887     { Bad_Opcode },
7888     { Bad_Opcode },
7889     /* 78 */
7890     { Bad_Opcode },
7891     { Bad_Opcode },
7892     { Bad_Opcode },
7893     { Bad_Opcode },
7894     { Bad_Opcode },
7895     { Bad_Opcode },
7896     { Bad_Opcode },
7897     { Bad_Opcode },
7898     /* 80 */
7899     { Bad_Opcode },
7900     { Bad_Opcode },
7901     { Bad_Opcode },
7902     { Bad_Opcode },
7903     { Bad_Opcode },
7904     { "vpmacssww",      { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7905     { "vpmacsswd",      { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7906     { "vpmacssdql",     { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7907     /* 88 */
7908     { Bad_Opcode },
7909     { Bad_Opcode },
7910     { Bad_Opcode },
7911     { Bad_Opcode },
7912     { Bad_Opcode },
7913     { Bad_Opcode },
7914     { "vpmacssdd",      { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7915     { "vpmacssdqh",     { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7916     /* 90 */
7917     { Bad_Opcode },
7918     { Bad_Opcode },
7919     { Bad_Opcode },
7920     { Bad_Opcode },
7921     { Bad_Opcode },
7922     { "vpmacsww",       { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7923     { "vpmacswd",       { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7924     { "vpmacsdql",      { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7925     /* 98 */
7926     { Bad_Opcode },
7927     { Bad_Opcode },
7928     { Bad_Opcode },
7929     { Bad_Opcode },
7930     { Bad_Opcode },
7931     { Bad_Opcode },
7932     { "vpmacsdd",       { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7933     { "vpmacsdqh",      { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7934     /* a0 */
7935     { Bad_Opcode },
7936     { Bad_Opcode },
7937     { "vpcmov",         { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7938     { "vpperm",         { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7939     { Bad_Opcode },
7940     { Bad_Opcode },
7941     { "vpmadcsswd",     { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7942     { Bad_Opcode },
7943     /* a8 */
7944     { Bad_Opcode },
7945     { Bad_Opcode },
7946     { Bad_Opcode },
7947     { Bad_Opcode },
7948     { Bad_Opcode },
7949     { Bad_Opcode },
7950     { Bad_Opcode },
7951     { Bad_Opcode },
7952     /* b0 */
7953     { Bad_Opcode },
7954     { Bad_Opcode },
7955     { Bad_Opcode },
7956     { Bad_Opcode },
7957     { Bad_Opcode },
7958     { Bad_Opcode },
7959     { "vpmadcswd",      { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7960     { Bad_Opcode },
7961     /* b8 */
7962     { Bad_Opcode },
7963     { Bad_Opcode },
7964     { Bad_Opcode },
7965     { Bad_Opcode },
7966     { Bad_Opcode },
7967     { Bad_Opcode },
7968     { Bad_Opcode },
7969     { Bad_Opcode },
7970     /* c0 */
7971     { "vprotb",         { XM, Vex_2src_1, Ib }, 0 },
7972     { "vprotw",         { XM, Vex_2src_1, Ib }, 0 },
7973     { "vprotd",         { XM, Vex_2src_1, Ib }, 0 },
7974     { "vprotq",         { XM, Vex_2src_1, Ib }, 0 },
7975     { Bad_Opcode },
7976     { Bad_Opcode },
7977     { Bad_Opcode },
7978     { Bad_Opcode },
7979     /* c8 */
7980     { Bad_Opcode },
7981     { Bad_Opcode },
7982     { Bad_Opcode },
7983     { Bad_Opcode },
7984     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CC) },
7985     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CD) },
7986     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CE) },
7987     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CF) },
7988     /* d0 */
7989     { Bad_Opcode },
7990     { Bad_Opcode },
7991     { Bad_Opcode },
7992     { Bad_Opcode },
7993     { Bad_Opcode },
7994     { Bad_Opcode },
7995     { Bad_Opcode },
7996     { Bad_Opcode },
7997     /* d8 */
7998     { Bad_Opcode },
7999     { Bad_Opcode },
8000     { Bad_Opcode },
8001     { Bad_Opcode },
8002     { Bad_Opcode },
8003     { Bad_Opcode },
8004     { Bad_Opcode },
8005     { Bad_Opcode },
8006     /* e0 */
8007     { Bad_Opcode },
8008     { Bad_Opcode },
8009     { Bad_Opcode },
8010     { Bad_Opcode },
8011     { Bad_Opcode },
8012     { Bad_Opcode },
8013     { Bad_Opcode },
8014     { Bad_Opcode },
8015     /* e8 */
8016     { Bad_Opcode },
8017     { Bad_Opcode },
8018     { Bad_Opcode },
8019     { Bad_Opcode },
8020     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EC) },
8021     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_ED) },
8022     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EE) },
8023     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EF) },
8024     /* f0 */
8025     { Bad_Opcode },
8026     { Bad_Opcode },
8027     { Bad_Opcode },
8028     { Bad_Opcode },
8029     { Bad_Opcode },
8030     { Bad_Opcode },
8031     { Bad_Opcode },
8032     { Bad_Opcode },
8033     /* f8 */
8034     { Bad_Opcode },
8035     { Bad_Opcode },
8036     { Bad_Opcode },
8037     { Bad_Opcode },
8038     { Bad_Opcode },
8039     { Bad_Opcode },
8040     { Bad_Opcode },
8041     { Bad_Opcode },
8042   },
8043   /* XOP_09 */
8044   {
8045     /* 00 */
8046     { Bad_Opcode },
8047     { REG_TABLE (REG_XOP_TBM_01) },
8048     { REG_TABLE (REG_XOP_TBM_02) },
8049     { Bad_Opcode },
8050     { Bad_Opcode },
8051     { Bad_Opcode },
8052     { Bad_Opcode },
8053     { Bad_Opcode },
8054     /* 08 */
8055     { Bad_Opcode },
8056     { Bad_Opcode },
8057     { Bad_Opcode },
8058     { Bad_Opcode },
8059     { Bad_Opcode },
8060     { Bad_Opcode },
8061     { Bad_Opcode },
8062     { Bad_Opcode },
8063     /* 10 */
8064     { Bad_Opcode },
8065     { Bad_Opcode },
8066     { REG_TABLE (REG_XOP_LWPCB) },
8067     { Bad_Opcode },
8068     { Bad_Opcode },
8069     { Bad_Opcode },
8070     { Bad_Opcode },
8071     { Bad_Opcode },
8072     /* 18 */
8073     { Bad_Opcode },
8074     { Bad_Opcode },
8075     { Bad_Opcode },
8076     { Bad_Opcode },
8077     { Bad_Opcode },
8078     { Bad_Opcode },
8079     { Bad_Opcode },
8080     { Bad_Opcode },
8081     /* 20 */
8082     { Bad_Opcode },
8083     { Bad_Opcode },
8084     { Bad_Opcode },
8085     { Bad_Opcode },
8086     { Bad_Opcode },
8087     { Bad_Opcode },
8088     { Bad_Opcode },
8089     { Bad_Opcode },
8090     /* 28 */
8091     { Bad_Opcode },
8092     { Bad_Opcode },
8093     { Bad_Opcode },
8094     { Bad_Opcode },
8095     { Bad_Opcode },
8096     { Bad_Opcode },
8097     { Bad_Opcode },
8098     { Bad_Opcode },
8099     /* 30 */
8100     { Bad_Opcode },
8101     { Bad_Opcode },
8102     { Bad_Opcode },
8103     { Bad_Opcode },
8104     { Bad_Opcode },
8105     { Bad_Opcode },
8106     { Bad_Opcode },
8107     { Bad_Opcode },
8108     /* 38 */
8109     { Bad_Opcode },
8110     { Bad_Opcode },
8111     { Bad_Opcode },
8112     { Bad_Opcode },
8113     { Bad_Opcode },
8114     { Bad_Opcode },
8115     { Bad_Opcode },
8116     { Bad_Opcode },
8117     /* 40 */
8118     { Bad_Opcode },
8119     { Bad_Opcode },
8120     { Bad_Opcode },
8121     { Bad_Opcode },
8122     { Bad_Opcode },
8123     { Bad_Opcode },
8124     { Bad_Opcode },
8125     { Bad_Opcode },
8126     /* 48 */
8127     { Bad_Opcode },
8128     { Bad_Opcode },
8129     { Bad_Opcode },
8130     { Bad_Opcode },
8131     { Bad_Opcode },
8132     { Bad_Opcode },
8133     { Bad_Opcode },
8134     { Bad_Opcode },
8135     /* 50 */
8136     { Bad_Opcode },
8137     { Bad_Opcode },
8138     { Bad_Opcode },
8139     { Bad_Opcode },
8140     { Bad_Opcode },
8141     { Bad_Opcode },
8142     { Bad_Opcode },
8143     { Bad_Opcode },
8144     /* 58 */
8145     { Bad_Opcode },
8146     { Bad_Opcode },
8147     { Bad_Opcode },
8148     { Bad_Opcode },
8149     { Bad_Opcode },
8150     { Bad_Opcode },
8151     { Bad_Opcode },
8152     { Bad_Opcode },
8153     /* 60 */
8154     { Bad_Opcode },
8155     { Bad_Opcode },
8156     { Bad_Opcode },
8157     { Bad_Opcode },
8158     { Bad_Opcode },
8159     { Bad_Opcode },
8160     { Bad_Opcode },
8161     { Bad_Opcode },
8162     /* 68 */
8163     { Bad_Opcode },
8164     { Bad_Opcode },
8165     { Bad_Opcode },
8166     { Bad_Opcode },
8167     { Bad_Opcode },
8168     { Bad_Opcode },
8169     { Bad_Opcode },
8170     { Bad_Opcode },
8171     /* 70 */
8172     { Bad_Opcode },
8173     { Bad_Opcode },
8174     { Bad_Opcode },
8175     { Bad_Opcode },
8176     { Bad_Opcode },
8177     { Bad_Opcode },
8178     { Bad_Opcode },
8179     { Bad_Opcode },
8180     /* 78 */
8181     { Bad_Opcode },
8182     { Bad_Opcode },
8183     { Bad_Opcode },
8184     { Bad_Opcode },
8185     { Bad_Opcode },
8186     { Bad_Opcode },
8187     { Bad_Opcode },
8188     { Bad_Opcode },
8189     /* 80 */
8190     { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_80) },
8191     { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_81) },
8192     { "vfrczss",        { XM, EXd }, 0 },
8193     { "vfrczsd",        { XM, EXq }, 0 },
8194     { Bad_Opcode },
8195     { Bad_Opcode },
8196     { Bad_Opcode },
8197     { Bad_Opcode },
8198     /* 88 */
8199     { Bad_Opcode },
8200     { Bad_Opcode },
8201     { Bad_Opcode },
8202     { Bad_Opcode },
8203     { Bad_Opcode },
8204     { Bad_Opcode },
8205     { Bad_Opcode },
8206     { Bad_Opcode },
8207     /* 90 */
8208     { "vprotb",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8209     { "vprotw",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8210     { "vprotd",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8211     { "vprotq",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8212     { "vpshlb",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8213     { "vpshlw",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8214     { "vpshld",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8215     { "vpshlq",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8216     /* 98 */
8217     { "vpshab",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8218     { "vpshaw",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8219     { "vpshad",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8220     { "vpshaq",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8221     { Bad_Opcode },
8222     { Bad_Opcode },
8223     { Bad_Opcode },
8224     { Bad_Opcode },
8225     /* a0 */
8226     { Bad_Opcode },
8227     { Bad_Opcode },
8228     { Bad_Opcode },
8229     { Bad_Opcode },
8230     { Bad_Opcode },
8231     { Bad_Opcode },
8232     { Bad_Opcode },
8233     { Bad_Opcode },
8234     /* a8 */
8235     { Bad_Opcode },
8236     { Bad_Opcode },
8237     { Bad_Opcode },
8238     { Bad_Opcode },
8239     { Bad_Opcode },
8240     { Bad_Opcode },
8241     { Bad_Opcode },
8242     { Bad_Opcode },
8243     /* b0 */
8244     { Bad_Opcode },
8245     { Bad_Opcode },
8246     { Bad_Opcode },
8247     { Bad_Opcode },
8248     { Bad_Opcode },
8249     { Bad_Opcode },
8250     { Bad_Opcode },
8251     { Bad_Opcode },
8252     /* b8 */
8253     { Bad_Opcode },
8254     { Bad_Opcode },
8255     { Bad_Opcode },
8256     { Bad_Opcode },
8257     { Bad_Opcode },
8258     { Bad_Opcode },
8259     { Bad_Opcode },
8260     { Bad_Opcode },
8261     /* c0 */
8262     { Bad_Opcode },
8263     { "vphaddbw",       { XM, EXxmm }, 0 },
8264     { "vphaddbd",       { XM, EXxmm }, 0 },
8265     { "vphaddbq",       { XM, EXxmm }, 0 },
8266     { Bad_Opcode },
8267     { Bad_Opcode },
8268     { "vphaddwd",       { XM, EXxmm }, 0 },
8269     { "vphaddwq",       { XM, EXxmm }, 0 },
8270     /* c8 */
8271     { Bad_Opcode },
8272     { Bad_Opcode },
8273     { Bad_Opcode },
8274     { "vphadddq",       { XM, EXxmm }, 0 },
8275     { Bad_Opcode },
8276     { Bad_Opcode },
8277     { Bad_Opcode },
8278     { Bad_Opcode },
8279     /* d0 */
8280     { Bad_Opcode },
8281     { "vphaddubw",      { XM, EXxmm }, 0 },
8282     { "vphaddubd",      { XM, EXxmm }, 0 },
8283     { "vphaddubq",      { XM, EXxmm }, 0 },
8284     { Bad_Opcode },
8285     { Bad_Opcode },
8286     { "vphadduwd",      { XM, EXxmm }, 0 },
8287     { "vphadduwq",      { XM, EXxmm }, 0 },
8288     /* d8 */
8289     { Bad_Opcode },
8290     { Bad_Opcode },
8291     { Bad_Opcode },
8292     { "vphaddudq",      { XM, EXxmm }, 0 },
8293     { Bad_Opcode },
8294     { Bad_Opcode },
8295     { Bad_Opcode },
8296     { Bad_Opcode },
8297     /* e0 */
8298     { Bad_Opcode },
8299     { "vphsubbw",       { XM, EXxmm }, 0 },
8300     { "vphsubwd",       { XM, EXxmm }, 0 },
8301     { "vphsubdq",       { XM, EXxmm }, 0 },
8302     { Bad_Opcode },
8303     { Bad_Opcode },
8304     { Bad_Opcode },
8305     { Bad_Opcode },
8306     /* e8 */
8307     { Bad_Opcode },
8308     { Bad_Opcode },
8309     { Bad_Opcode },
8310     { Bad_Opcode },
8311     { Bad_Opcode },
8312     { Bad_Opcode },
8313     { Bad_Opcode },
8314     { Bad_Opcode },
8315     /* f0 */
8316     { Bad_Opcode },
8317     { Bad_Opcode },
8318     { Bad_Opcode },
8319     { Bad_Opcode },
8320     { Bad_Opcode },
8321     { Bad_Opcode },
8322     { Bad_Opcode },
8323     { Bad_Opcode },
8324     /* f8 */
8325     { Bad_Opcode },
8326     { Bad_Opcode },
8327     { Bad_Opcode },
8328     { Bad_Opcode },
8329     { Bad_Opcode },
8330     { Bad_Opcode },
8331     { Bad_Opcode },
8332     { Bad_Opcode },
8333   },
8334   /* XOP_0A */
8335   {
8336     /* 00 */
8337     { Bad_Opcode },
8338     { Bad_Opcode },
8339     { Bad_Opcode },
8340     { Bad_Opcode },
8341     { Bad_Opcode },
8342     { Bad_Opcode },
8343     { Bad_Opcode },
8344     { Bad_Opcode },
8345     /* 08 */
8346     { Bad_Opcode },
8347     { Bad_Opcode },
8348     { Bad_Opcode },
8349     { Bad_Opcode },
8350     { Bad_Opcode },
8351     { Bad_Opcode },
8352     { Bad_Opcode },
8353     { Bad_Opcode },
8354     /* 10 */
8355     { "bextr",  { Gv, Ev, Iq }, 0 },
8356     { Bad_Opcode },
8357     { REG_TABLE (REG_XOP_LWP) },
8358     { Bad_Opcode },
8359     { Bad_Opcode },
8360     { Bad_Opcode },
8361     { Bad_Opcode },
8362     { Bad_Opcode },
8363     /* 18 */
8364     { Bad_Opcode },
8365     { Bad_Opcode },
8366     { Bad_Opcode },
8367     { Bad_Opcode },
8368     { Bad_Opcode },
8369     { Bad_Opcode },
8370     { Bad_Opcode },
8371     { Bad_Opcode },
8372     /* 20 */
8373     { Bad_Opcode },
8374     { Bad_Opcode },
8375     { Bad_Opcode },
8376     { Bad_Opcode },
8377     { Bad_Opcode },
8378     { Bad_Opcode },
8379     { Bad_Opcode },
8380     { Bad_Opcode },
8381     /* 28 */
8382     { Bad_Opcode },
8383     { Bad_Opcode },
8384     { Bad_Opcode },
8385     { Bad_Opcode },
8386     { Bad_Opcode },
8387     { Bad_Opcode },
8388     { Bad_Opcode },
8389     { Bad_Opcode },
8390     /* 30 */
8391     { Bad_Opcode },
8392     { Bad_Opcode },
8393     { Bad_Opcode },
8394     { Bad_Opcode },
8395     { Bad_Opcode },
8396     { Bad_Opcode },
8397     { Bad_Opcode },
8398     { Bad_Opcode },
8399     /* 38 */
8400     { Bad_Opcode },
8401     { Bad_Opcode },
8402     { Bad_Opcode },
8403     { Bad_Opcode },
8404     { Bad_Opcode },
8405     { Bad_Opcode },
8406     { Bad_Opcode },
8407     { Bad_Opcode },
8408     /* 40 */
8409     { Bad_Opcode },
8410     { Bad_Opcode },
8411     { Bad_Opcode },
8412     { Bad_Opcode },
8413     { Bad_Opcode },
8414     { Bad_Opcode },
8415     { Bad_Opcode },
8416     { Bad_Opcode },
8417     /* 48 */
8418     { Bad_Opcode },
8419     { Bad_Opcode },
8420     { Bad_Opcode },
8421     { Bad_Opcode },
8422     { Bad_Opcode },
8423     { Bad_Opcode },
8424     { Bad_Opcode },
8425     { Bad_Opcode },
8426     /* 50 */
8427     { Bad_Opcode },
8428     { Bad_Opcode },
8429     { Bad_Opcode },
8430     { Bad_Opcode },
8431     { Bad_Opcode },
8432     { Bad_Opcode },
8433     { Bad_Opcode },
8434     { Bad_Opcode },
8435     /* 58 */
8436     { Bad_Opcode },
8437     { Bad_Opcode },
8438     { Bad_Opcode },
8439     { Bad_Opcode },
8440     { Bad_Opcode },
8441     { Bad_Opcode },
8442     { Bad_Opcode },
8443     { Bad_Opcode },
8444     /* 60 */
8445     { Bad_Opcode },
8446     { Bad_Opcode },
8447     { Bad_Opcode },
8448     { Bad_Opcode },
8449     { Bad_Opcode },
8450     { Bad_Opcode },
8451     { Bad_Opcode },
8452     { Bad_Opcode },
8453     /* 68 */
8454     { Bad_Opcode },
8455     { Bad_Opcode },
8456     { Bad_Opcode },
8457     { Bad_Opcode },
8458     { Bad_Opcode },
8459     { Bad_Opcode },
8460     { Bad_Opcode },
8461     { Bad_Opcode },
8462     /* 70 */
8463     { Bad_Opcode },
8464     { Bad_Opcode },
8465     { Bad_Opcode },
8466     { Bad_Opcode },
8467     { Bad_Opcode },
8468     { Bad_Opcode },
8469     { Bad_Opcode },
8470     { Bad_Opcode },
8471     /* 78 */
8472     { Bad_Opcode },
8473     { Bad_Opcode },
8474     { Bad_Opcode },
8475     { Bad_Opcode },
8476     { Bad_Opcode },
8477     { Bad_Opcode },
8478     { Bad_Opcode },
8479     { Bad_Opcode },
8480     /* 80 */
8481     { Bad_Opcode },
8482     { Bad_Opcode },
8483     { Bad_Opcode },
8484     { Bad_Opcode },
8485     { Bad_Opcode },
8486     { Bad_Opcode },
8487     { Bad_Opcode },
8488     { Bad_Opcode },
8489     /* 88 */
8490     { Bad_Opcode },
8491     { Bad_Opcode },
8492     { Bad_Opcode },
8493     { Bad_Opcode },
8494     { Bad_Opcode },
8495     { Bad_Opcode },
8496     { Bad_Opcode },
8497     { Bad_Opcode },
8498     /* 90 */
8499     { Bad_Opcode },
8500     { Bad_Opcode },
8501     { Bad_Opcode },
8502     { Bad_Opcode },
8503     { Bad_Opcode },
8504     { Bad_Opcode },
8505     { Bad_Opcode },
8506     { Bad_Opcode },
8507     /* 98 */
8508     { Bad_Opcode },
8509     { Bad_Opcode },
8510     { Bad_Opcode },
8511     { Bad_Opcode },
8512     { Bad_Opcode },
8513     { Bad_Opcode },
8514     { Bad_Opcode },
8515     { Bad_Opcode },
8516     /* a0 */
8517     { Bad_Opcode },
8518     { Bad_Opcode },
8519     { Bad_Opcode },
8520     { Bad_Opcode },
8521     { Bad_Opcode },
8522     { Bad_Opcode },
8523     { Bad_Opcode },
8524     { Bad_Opcode },
8525     /* a8 */
8526     { Bad_Opcode },
8527     { Bad_Opcode },
8528     { Bad_Opcode },
8529     { Bad_Opcode },
8530     { Bad_Opcode },
8531     { Bad_Opcode },
8532     { Bad_Opcode },
8533     { Bad_Opcode },
8534     /* b0 */
8535     { Bad_Opcode },
8536     { Bad_Opcode },
8537     { Bad_Opcode },
8538     { Bad_Opcode },
8539     { Bad_Opcode },
8540     { Bad_Opcode },
8541     { Bad_Opcode },
8542     { Bad_Opcode },
8543     /* b8 */
8544     { Bad_Opcode },
8545     { Bad_Opcode },
8546     { Bad_Opcode },
8547     { Bad_Opcode },
8548     { Bad_Opcode },
8549     { Bad_Opcode },
8550     { Bad_Opcode },
8551     { Bad_Opcode },
8552     /* c0 */
8553     { Bad_Opcode },
8554     { Bad_Opcode },
8555     { Bad_Opcode },
8556     { Bad_Opcode },
8557     { Bad_Opcode },
8558     { Bad_Opcode },
8559     { Bad_Opcode },
8560     { Bad_Opcode },
8561     /* c8 */
8562     { Bad_Opcode },
8563     { Bad_Opcode },
8564     { Bad_Opcode },
8565     { Bad_Opcode },
8566     { Bad_Opcode },
8567     { Bad_Opcode },
8568     { Bad_Opcode },
8569     { Bad_Opcode },
8570     /* d0 */
8571     { Bad_Opcode },
8572     { Bad_Opcode },
8573     { Bad_Opcode },
8574     { Bad_Opcode },
8575     { Bad_Opcode },
8576     { Bad_Opcode },
8577     { Bad_Opcode },
8578     { Bad_Opcode },
8579     /* d8 */
8580     { Bad_Opcode },
8581     { Bad_Opcode },
8582     { Bad_Opcode },
8583     { Bad_Opcode },
8584     { Bad_Opcode },
8585     { Bad_Opcode },
8586     { Bad_Opcode },
8587     { Bad_Opcode },
8588     /* e0 */
8589     { Bad_Opcode },
8590     { Bad_Opcode },
8591     { Bad_Opcode },
8592     { Bad_Opcode },
8593     { Bad_Opcode },
8594     { Bad_Opcode },
8595     { Bad_Opcode },
8596     { Bad_Opcode },
8597     /* e8 */
8598     { Bad_Opcode },
8599     { Bad_Opcode },
8600     { Bad_Opcode },
8601     { Bad_Opcode },
8602     { Bad_Opcode },
8603     { Bad_Opcode },
8604     { Bad_Opcode },
8605     { Bad_Opcode },
8606     /* f0 */
8607     { Bad_Opcode },
8608     { Bad_Opcode },
8609     { Bad_Opcode },
8610     { Bad_Opcode },
8611     { Bad_Opcode },
8612     { Bad_Opcode },
8613     { Bad_Opcode },
8614     { Bad_Opcode },
8615     /* f8 */
8616     { Bad_Opcode },
8617     { Bad_Opcode },
8618     { Bad_Opcode },
8619     { Bad_Opcode },
8620     { Bad_Opcode },
8621     { Bad_Opcode },
8622     { Bad_Opcode },
8623     { Bad_Opcode },
8624   },
8625 };
8626
8627 static const struct dis386 vex_table[][256] = {
8628   /* VEX_0F */
8629   {
8630     /* 00 */
8631     { Bad_Opcode },
8632     { Bad_Opcode },
8633     { Bad_Opcode },
8634     { Bad_Opcode },
8635     { Bad_Opcode },
8636     { Bad_Opcode },
8637     { Bad_Opcode },
8638     { Bad_Opcode },
8639     /* 08 */
8640     { Bad_Opcode },
8641     { Bad_Opcode },
8642     { Bad_Opcode },
8643     { Bad_Opcode },
8644     { Bad_Opcode },
8645     { Bad_Opcode },
8646     { Bad_Opcode },
8647     { Bad_Opcode },
8648     /* 10 */
8649     { PREFIX_TABLE (PREFIX_VEX_0F10) },
8650     { PREFIX_TABLE (PREFIX_VEX_0F11) },
8651     { PREFIX_TABLE (PREFIX_VEX_0F12) },
8652     { MOD_TABLE (MOD_VEX_0F13) },
8653     { VEX_W_TABLE (VEX_W_0F14) },
8654     { VEX_W_TABLE (VEX_W_0F15) },
8655     { PREFIX_TABLE (PREFIX_VEX_0F16) },
8656     { MOD_TABLE (MOD_VEX_0F17) },
8657     /* 18 */
8658     { Bad_Opcode },
8659     { Bad_Opcode },
8660     { Bad_Opcode },
8661     { Bad_Opcode },
8662     { Bad_Opcode },
8663     { Bad_Opcode },
8664     { Bad_Opcode },
8665     { Bad_Opcode },
8666     /* 20 */
8667     { Bad_Opcode },
8668     { Bad_Opcode },
8669     { Bad_Opcode },
8670     { Bad_Opcode },
8671     { Bad_Opcode },
8672     { Bad_Opcode },
8673     { Bad_Opcode },
8674     { Bad_Opcode },
8675     /* 28 */
8676     { VEX_W_TABLE (VEX_W_0F28) },
8677     { VEX_W_TABLE (VEX_W_0F29) },
8678     { PREFIX_TABLE (PREFIX_VEX_0F2A) },
8679     { MOD_TABLE (MOD_VEX_0F2B) },
8680     { PREFIX_TABLE (PREFIX_VEX_0F2C) },
8681     { PREFIX_TABLE (PREFIX_VEX_0F2D) },
8682     { PREFIX_TABLE (PREFIX_VEX_0F2E) },
8683     { PREFIX_TABLE (PREFIX_VEX_0F2F) },
8684     /* 30 */
8685     { Bad_Opcode },
8686     { Bad_Opcode },
8687     { Bad_Opcode },
8688     { Bad_Opcode },
8689     { Bad_Opcode },
8690     { Bad_Opcode },
8691     { Bad_Opcode },
8692     { Bad_Opcode },
8693     /* 38 */
8694     { Bad_Opcode },
8695     { Bad_Opcode },
8696     { Bad_Opcode },
8697     { Bad_Opcode },
8698     { Bad_Opcode },
8699     { Bad_Opcode },
8700     { Bad_Opcode },
8701     { Bad_Opcode },
8702     /* 40 */
8703     { Bad_Opcode },
8704     { PREFIX_TABLE (PREFIX_VEX_0F41) },
8705     { PREFIX_TABLE (PREFIX_VEX_0F42) },
8706     { Bad_Opcode },
8707     { PREFIX_TABLE (PREFIX_VEX_0F44) },
8708     { PREFIX_TABLE (PREFIX_VEX_0F45) },
8709     { PREFIX_TABLE (PREFIX_VEX_0F46) },
8710     { PREFIX_TABLE (PREFIX_VEX_0F47) },
8711     /* 48 */
8712     { Bad_Opcode },
8713     { Bad_Opcode },
8714     { PREFIX_TABLE (PREFIX_VEX_0F4A) },
8715     { PREFIX_TABLE (PREFIX_VEX_0F4B) },
8716     { Bad_Opcode },
8717     { Bad_Opcode },
8718     { Bad_Opcode },
8719     { Bad_Opcode },
8720     /* 50 */
8721     { MOD_TABLE (MOD_VEX_0F50) },
8722     { PREFIX_TABLE (PREFIX_VEX_0F51) },
8723     { PREFIX_TABLE (PREFIX_VEX_0F52) },
8724     { PREFIX_TABLE (PREFIX_VEX_0F53) },
8725     { "vandpX",         { XM, Vex, EXx }, 0 },
8726     { "vandnpX",        { XM, Vex, EXx }, 0 },
8727     { "vorpX",          { XM, Vex, EXx }, 0 },
8728     { "vxorpX",         { XM, Vex, EXx }, 0 },
8729     /* 58 */
8730     { PREFIX_TABLE (PREFIX_VEX_0F58) },
8731     { PREFIX_TABLE (PREFIX_VEX_0F59) },
8732     { PREFIX_TABLE (PREFIX_VEX_0F5A) },
8733     { PREFIX_TABLE (PREFIX_VEX_0F5B) },
8734     { PREFIX_TABLE (PREFIX_VEX_0F5C) },
8735     { PREFIX_TABLE (PREFIX_VEX_0F5D) },
8736     { PREFIX_TABLE (PREFIX_VEX_0F5E) },
8737     { PREFIX_TABLE (PREFIX_VEX_0F5F) },
8738     /* 60 */
8739     { PREFIX_TABLE (PREFIX_VEX_0F60) },
8740     { PREFIX_TABLE (PREFIX_VEX_0F61) },
8741     { PREFIX_TABLE (PREFIX_VEX_0F62) },
8742     { PREFIX_TABLE (PREFIX_VEX_0F63) },
8743     { PREFIX_TABLE (PREFIX_VEX_0F64) },
8744     { PREFIX_TABLE (PREFIX_VEX_0F65) },
8745     { PREFIX_TABLE (PREFIX_VEX_0F66) },
8746     { PREFIX_TABLE (PREFIX_VEX_0F67) },
8747     /* 68 */
8748     { PREFIX_TABLE (PREFIX_VEX_0F68) },
8749     { PREFIX_TABLE (PREFIX_VEX_0F69) },
8750     { PREFIX_TABLE (PREFIX_VEX_0F6A) },
8751     { PREFIX_TABLE (PREFIX_VEX_0F6B) },
8752     { PREFIX_TABLE (PREFIX_VEX_0F6C) },
8753     { PREFIX_TABLE (PREFIX_VEX_0F6D) },
8754     { PREFIX_TABLE (PREFIX_VEX_0F6E) },
8755     { PREFIX_TABLE (PREFIX_VEX_0F6F) },
8756     /* 70 */
8757     { PREFIX_TABLE (PREFIX_VEX_0F70) },
8758     { REG_TABLE (REG_VEX_0F71) },
8759     { REG_TABLE (REG_VEX_0F72) },
8760     { REG_TABLE (REG_VEX_0F73) },
8761     { PREFIX_TABLE (PREFIX_VEX_0F74) },
8762     { PREFIX_TABLE (PREFIX_VEX_0F75) },
8763     { PREFIX_TABLE (PREFIX_VEX_0F76) },
8764     { PREFIX_TABLE (PREFIX_VEX_0F77) },
8765     /* 78 */
8766     { Bad_Opcode },
8767     { Bad_Opcode },
8768     { Bad_Opcode },
8769     { Bad_Opcode },
8770     { PREFIX_TABLE (PREFIX_VEX_0F7C) },
8771     { PREFIX_TABLE (PREFIX_VEX_0F7D) },
8772     { PREFIX_TABLE (PREFIX_VEX_0F7E) },
8773     { PREFIX_TABLE (PREFIX_VEX_0F7F) },
8774     /* 80 */
8775     { Bad_Opcode },
8776     { Bad_Opcode },
8777     { Bad_Opcode },
8778     { Bad_Opcode },
8779     { Bad_Opcode },
8780     { Bad_Opcode },
8781     { Bad_Opcode },
8782     { Bad_Opcode },
8783     /* 88 */
8784     { Bad_Opcode },
8785     { Bad_Opcode },
8786     { Bad_Opcode },
8787     { Bad_Opcode },
8788     { Bad_Opcode },
8789     { Bad_Opcode },
8790     { Bad_Opcode },
8791     { Bad_Opcode },
8792     /* 90 */
8793     { PREFIX_TABLE (PREFIX_VEX_0F90) },
8794     { PREFIX_TABLE (PREFIX_VEX_0F91) },
8795     { PREFIX_TABLE (PREFIX_VEX_0F92) },
8796     { PREFIX_TABLE (PREFIX_VEX_0F93) },
8797     { Bad_Opcode },
8798     { Bad_Opcode },
8799     { Bad_Opcode },
8800     { Bad_Opcode },
8801     /* 98 */
8802     { PREFIX_TABLE (PREFIX_VEX_0F98) },
8803     { PREFIX_TABLE (PREFIX_VEX_0F99) },
8804     { Bad_Opcode },
8805     { Bad_Opcode },
8806     { Bad_Opcode },
8807     { Bad_Opcode },
8808     { Bad_Opcode },
8809     { Bad_Opcode },
8810     /* a0 */
8811     { Bad_Opcode },
8812     { Bad_Opcode },
8813     { Bad_Opcode },
8814     { Bad_Opcode },
8815     { Bad_Opcode },
8816     { Bad_Opcode },
8817     { Bad_Opcode },
8818     { Bad_Opcode },
8819     /* a8 */
8820     { Bad_Opcode },
8821     { Bad_Opcode },
8822     { Bad_Opcode },
8823     { Bad_Opcode },
8824     { Bad_Opcode },
8825     { Bad_Opcode },
8826     { REG_TABLE (REG_VEX_0FAE) },
8827     { Bad_Opcode },
8828     /* b0 */
8829     { Bad_Opcode },
8830     { Bad_Opcode },
8831     { Bad_Opcode },
8832     { Bad_Opcode },
8833     { Bad_Opcode },
8834     { Bad_Opcode },
8835     { Bad_Opcode },
8836     { Bad_Opcode },
8837     /* b8 */
8838     { Bad_Opcode },
8839     { Bad_Opcode },
8840     { Bad_Opcode },
8841     { Bad_Opcode },
8842     { Bad_Opcode },
8843     { Bad_Opcode },
8844     { Bad_Opcode },
8845     { Bad_Opcode },
8846     /* c0 */
8847     { Bad_Opcode },
8848     { Bad_Opcode },
8849     { PREFIX_TABLE (PREFIX_VEX_0FC2) },
8850     { Bad_Opcode },
8851     { PREFIX_TABLE (PREFIX_VEX_0FC4) },
8852     { PREFIX_TABLE (PREFIX_VEX_0FC5) },
8853     { "vshufpX",        { XM, Vex, EXx, Ib }, 0 },
8854     { Bad_Opcode },
8855     /* c8 */
8856     { Bad_Opcode },
8857     { Bad_Opcode },
8858     { Bad_Opcode },
8859     { Bad_Opcode },
8860     { Bad_Opcode },
8861     { Bad_Opcode },
8862     { Bad_Opcode },
8863     { Bad_Opcode },
8864     /* d0 */
8865     { PREFIX_TABLE (PREFIX_VEX_0FD0) },
8866     { PREFIX_TABLE (PREFIX_VEX_0FD1) },
8867     { PREFIX_TABLE (PREFIX_VEX_0FD2) },
8868     { PREFIX_TABLE (PREFIX_VEX_0FD3) },
8869     { PREFIX_TABLE (PREFIX_VEX_0FD4) },
8870     { PREFIX_TABLE (PREFIX_VEX_0FD5) },
8871     { PREFIX_TABLE (PREFIX_VEX_0FD6) },
8872     { PREFIX_TABLE (PREFIX_VEX_0FD7) },
8873     /* d8 */
8874     { PREFIX_TABLE (PREFIX_VEX_0FD8) },
8875     { PREFIX_TABLE (PREFIX_VEX_0FD9) },
8876     { PREFIX_TABLE (PREFIX_VEX_0FDA) },
8877     { PREFIX_TABLE (PREFIX_VEX_0FDB) },
8878     { PREFIX_TABLE (PREFIX_VEX_0FDC) },
8879     { PREFIX_TABLE (PREFIX_VEX_0FDD) },
8880     { PREFIX_TABLE (PREFIX_VEX_0FDE) },
8881     { PREFIX_TABLE (PREFIX_VEX_0FDF) },
8882     /* e0 */
8883     { PREFIX_TABLE (PREFIX_VEX_0FE0) },
8884     { PREFIX_TABLE (PREFIX_VEX_0FE1) },
8885     { PREFIX_TABLE (PREFIX_VEX_0FE2) },
8886     { PREFIX_TABLE (PREFIX_VEX_0FE3) },
8887     { PREFIX_TABLE (PREFIX_VEX_0FE4) },
8888     { PREFIX_TABLE (PREFIX_VEX_0FE5) },
8889     { PREFIX_TABLE (PREFIX_VEX_0FE6) },
8890     { PREFIX_TABLE (PREFIX_VEX_0FE7) },
8891     /* e8 */
8892     { PREFIX_TABLE (PREFIX_VEX_0FE8) },
8893     { PREFIX_TABLE (PREFIX_VEX_0FE9) },
8894     { PREFIX_TABLE (PREFIX_VEX_0FEA) },
8895     { PREFIX_TABLE (PREFIX_VEX_0FEB) },
8896     { PREFIX_TABLE (PREFIX_VEX_0FEC) },
8897     { PREFIX_TABLE (PREFIX_VEX_0FED) },
8898     { PREFIX_TABLE (PREFIX_VEX_0FEE) },
8899     { PREFIX_TABLE (PREFIX_VEX_0FEF) },
8900     /* f0 */
8901     { PREFIX_TABLE (PREFIX_VEX_0FF0) },
8902     { PREFIX_TABLE (PREFIX_VEX_0FF1) },
8903     { PREFIX_TABLE (PREFIX_VEX_0FF2) },
8904     { PREFIX_TABLE (PREFIX_VEX_0FF3) },
8905     { PREFIX_TABLE (PREFIX_VEX_0FF4) },
8906     { PREFIX_TABLE (PREFIX_VEX_0FF5) },
8907     { PREFIX_TABLE (PREFIX_VEX_0FF6) },
8908     { PREFIX_TABLE (PREFIX_VEX_0FF7) },
8909     /* f8 */
8910     { PREFIX_TABLE (PREFIX_VEX_0FF8) },
8911     { PREFIX_TABLE (PREFIX_VEX_0FF9) },
8912     { PREFIX_TABLE (PREFIX_VEX_0FFA) },
8913     { PREFIX_TABLE (PREFIX_VEX_0FFB) },
8914     { PREFIX_TABLE (PREFIX_VEX_0FFC) },
8915     { PREFIX_TABLE (PREFIX_VEX_0FFD) },
8916     { PREFIX_TABLE (PREFIX_VEX_0FFE) },
8917     { Bad_Opcode },
8918   },
8919   /* VEX_0F38 */
8920   {
8921     /* 00 */
8922     { PREFIX_TABLE (PREFIX_VEX_0F3800) },
8923     { PREFIX_TABLE (PREFIX_VEX_0F3801) },
8924     { PREFIX_TABLE (PREFIX_VEX_0F3802) },
8925     { PREFIX_TABLE (PREFIX_VEX_0F3803) },
8926     { PREFIX_TABLE (PREFIX_VEX_0F3804) },
8927     { PREFIX_TABLE (PREFIX_VEX_0F3805) },
8928     { PREFIX_TABLE (PREFIX_VEX_0F3806) },
8929     { PREFIX_TABLE (PREFIX_VEX_0F3807) },
8930     /* 08 */
8931     { PREFIX_TABLE (PREFIX_VEX_0F3808) },
8932     { PREFIX_TABLE (PREFIX_VEX_0F3809) },
8933     { PREFIX_TABLE (PREFIX_VEX_0F380A) },
8934     { PREFIX_TABLE (PREFIX_VEX_0F380B) },
8935     { PREFIX_TABLE (PREFIX_VEX_0F380C) },
8936     { PREFIX_TABLE (PREFIX_VEX_0F380D) },
8937     { PREFIX_TABLE (PREFIX_VEX_0F380E) },
8938     { PREFIX_TABLE (PREFIX_VEX_0F380F) },
8939     /* 10 */
8940     { Bad_Opcode },
8941     { Bad_Opcode },
8942     { Bad_Opcode },
8943     { PREFIX_TABLE (PREFIX_VEX_0F3813) },
8944     { Bad_Opcode },
8945     { Bad_Opcode },
8946     { PREFIX_TABLE (PREFIX_VEX_0F3816) },
8947     { PREFIX_TABLE (PREFIX_VEX_0F3817) },
8948     /* 18 */
8949     { PREFIX_TABLE (PREFIX_VEX_0F3818) },
8950     { PREFIX_TABLE (PREFIX_VEX_0F3819) },
8951     { PREFIX_TABLE (PREFIX_VEX_0F381A) },
8952     { Bad_Opcode },
8953     { PREFIX_TABLE (PREFIX_VEX_0F381C) },
8954     { PREFIX_TABLE (PREFIX_VEX_0F381D) },
8955     { PREFIX_TABLE (PREFIX_VEX_0F381E) },
8956     { Bad_Opcode },
8957     /* 20 */
8958     { PREFIX_TABLE (PREFIX_VEX_0F3820) },
8959     { PREFIX_TABLE (PREFIX_VEX_0F3821) },
8960     { PREFIX_TABLE (PREFIX_VEX_0F3822) },
8961     { PREFIX_TABLE (PREFIX_VEX_0F3823) },
8962     { PREFIX_TABLE (PREFIX_VEX_0F3824) },
8963     { PREFIX_TABLE (PREFIX_VEX_0F3825) },
8964     { Bad_Opcode },
8965     { Bad_Opcode },
8966     /* 28 */
8967     { PREFIX_TABLE (PREFIX_VEX_0F3828) },
8968     { PREFIX_TABLE (PREFIX_VEX_0F3829) },
8969     { PREFIX_TABLE (PREFIX_VEX_0F382A) },
8970     { PREFIX_TABLE (PREFIX_VEX_0F382B) },
8971     { PREFIX_TABLE (PREFIX_VEX_0F382C) },
8972     { PREFIX_TABLE (PREFIX_VEX_0F382D) },
8973     { PREFIX_TABLE (PREFIX_VEX_0F382E) },
8974     { PREFIX_TABLE (PREFIX_VEX_0F382F) },
8975     /* 30 */
8976     { PREFIX_TABLE (PREFIX_VEX_0F3830) },
8977     { PREFIX_TABLE (PREFIX_VEX_0F3831) },
8978     { PREFIX_TABLE (PREFIX_VEX_0F3832) },
8979     { PREFIX_TABLE (PREFIX_VEX_0F3833) },
8980     { PREFIX_TABLE (PREFIX_VEX_0F3834) },
8981     { PREFIX_TABLE (PREFIX_VEX_0F3835) },
8982     { PREFIX_TABLE (PREFIX_VEX_0F3836) },
8983     { PREFIX_TABLE (PREFIX_VEX_0F3837) },
8984     /* 38 */
8985     { PREFIX_TABLE (PREFIX_VEX_0F3838) },
8986     { PREFIX_TABLE (PREFIX_VEX_0F3839) },
8987     { PREFIX_TABLE (PREFIX_VEX_0F383A) },
8988     { PREFIX_TABLE (PREFIX_VEX_0F383B) },
8989     { PREFIX_TABLE (PREFIX_VEX_0F383C) },
8990     { PREFIX_TABLE (PREFIX_VEX_0F383D) },
8991     { PREFIX_TABLE (PREFIX_VEX_0F383E) },
8992     { PREFIX_TABLE (PREFIX_VEX_0F383F) },
8993     /* 40 */
8994     { PREFIX_TABLE (PREFIX_VEX_0F3840) },
8995     { PREFIX_TABLE (PREFIX_VEX_0F3841) },
8996     { Bad_Opcode },
8997     { Bad_Opcode },
8998     { Bad_Opcode },
8999     { PREFIX_TABLE (PREFIX_VEX_0F3845) },
9000     { PREFIX_TABLE (PREFIX_VEX_0F3846) },
9001     { PREFIX_TABLE (PREFIX_VEX_0F3847) },
9002     /* 48 */
9003     { Bad_Opcode },
9004     { Bad_Opcode },
9005     { Bad_Opcode },
9006     { Bad_Opcode },
9007     { Bad_Opcode },
9008     { Bad_Opcode },
9009     { Bad_Opcode },
9010     { Bad_Opcode },
9011     /* 50 */
9012     { Bad_Opcode },
9013     { Bad_Opcode },
9014     { Bad_Opcode },
9015     { Bad_Opcode },
9016     { Bad_Opcode },
9017     { Bad_Opcode },
9018     { Bad_Opcode },
9019     { Bad_Opcode },
9020     /* 58 */
9021     { PREFIX_TABLE (PREFIX_VEX_0F3858) },
9022     { PREFIX_TABLE (PREFIX_VEX_0F3859) },
9023     { PREFIX_TABLE (PREFIX_VEX_0F385A) },
9024     { Bad_Opcode },
9025     { Bad_Opcode },
9026     { Bad_Opcode },
9027     { Bad_Opcode },
9028     { Bad_Opcode },
9029     /* 60 */
9030     { Bad_Opcode },
9031     { Bad_Opcode },
9032     { Bad_Opcode },
9033     { Bad_Opcode },
9034     { Bad_Opcode },
9035     { Bad_Opcode },
9036     { Bad_Opcode },
9037     { Bad_Opcode },
9038     /* 68 */
9039     { Bad_Opcode },
9040     { Bad_Opcode },
9041     { Bad_Opcode },
9042     { Bad_Opcode },
9043     { Bad_Opcode },
9044     { Bad_Opcode },
9045     { Bad_Opcode },
9046     { Bad_Opcode },
9047     /* 70 */
9048     { Bad_Opcode },
9049     { Bad_Opcode },
9050     { Bad_Opcode },
9051     { Bad_Opcode },
9052     { Bad_Opcode },
9053     { Bad_Opcode },
9054     { Bad_Opcode },
9055     { Bad_Opcode },
9056     /* 78 */
9057     { PREFIX_TABLE (PREFIX_VEX_0F3878) },
9058     { PREFIX_TABLE (PREFIX_VEX_0F3879) },
9059     { Bad_Opcode },
9060     { Bad_Opcode },
9061     { Bad_Opcode },
9062     { Bad_Opcode },
9063     { Bad_Opcode },
9064     { Bad_Opcode },
9065     /* 80 */
9066     { Bad_Opcode },
9067     { Bad_Opcode },
9068     { Bad_Opcode },
9069     { Bad_Opcode },
9070     { Bad_Opcode },
9071     { Bad_Opcode },
9072     { Bad_Opcode },
9073     { Bad_Opcode },
9074     /* 88 */
9075     { Bad_Opcode },
9076     { Bad_Opcode },
9077     { Bad_Opcode },
9078     { Bad_Opcode },
9079     { PREFIX_TABLE (PREFIX_VEX_0F388C) },
9080     { Bad_Opcode },
9081     { PREFIX_TABLE (PREFIX_VEX_0F388E) },
9082     { Bad_Opcode },
9083     /* 90 */
9084     { PREFIX_TABLE (PREFIX_VEX_0F3890) },
9085     { PREFIX_TABLE (PREFIX_VEX_0F3891) },
9086     { PREFIX_TABLE (PREFIX_VEX_0F3892) },
9087     { PREFIX_TABLE (PREFIX_VEX_0F3893) },
9088     { Bad_Opcode },
9089     { Bad_Opcode },
9090     { PREFIX_TABLE (PREFIX_VEX_0F3896) },
9091     { PREFIX_TABLE (PREFIX_VEX_0F3897) },
9092     /* 98 */
9093     { PREFIX_TABLE (PREFIX_VEX_0F3898) },
9094     { PREFIX_TABLE (PREFIX_VEX_0F3899) },
9095     { PREFIX_TABLE (PREFIX_VEX_0F389A) },
9096     { PREFIX_TABLE (PREFIX_VEX_0F389B) },
9097     { PREFIX_TABLE (PREFIX_VEX_0F389C) },
9098     { PREFIX_TABLE (PREFIX_VEX_0F389D) },
9099     { PREFIX_TABLE (PREFIX_VEX_0F389E) },
9100     { PREFIX_TABLE (PREFIX_VEX_0F389F) },
9101     /* a0 */
9102     { Bad_Opcode },
9103     { Bad_Opcode },
9104     { Bad_Opcode },
9105     { Bad_Opcode },
9106     { Bad_Opcode },
9107     { Bad_Opcode },
9108     { PREFIX_TABLE (PREFIX_VEX_0F38A6) },
9109     { PREFIX_TABLE (PREFIX_VEX_0F38A7) },
9110     /* a8 */
9111     { PREFIX_TABLE (PREFIX_VEX_0F38A8) },
9112     { PREFIX_TABLE (PREFIX_VEX_0F38A9) },
9113     { PREFIX_TABLE (PREFIX_VEX_0F38AA) },
9114     { PREFIX_TABLE (PREFIX_VEX_0F38AB) },
9115     { PREFIX_TABLE (PREFIX_VEX_0F38AC) },
9116     { PREFIX_TABLE (PREFIX_VEX_0F38AD) },
9117     { PREFIX_TABLE (PREFIX_VEX_0F38AE) },
9118     { PREFIX_TABLE (PREFIX_VEX_0F38AF) },
9119     /* b0 */
9120     { Bad_Opcode },
9121     { Bad_Opcode },
9122     { Bad_Opcode },
9123     { Bad_Opcode },
9124     { Bad_Opcode },
9125     { Bad_Opcode },
9126     { PREFIX_TABLE (PREFIX_VEX_0F38B6) },
9127     { PREFIX_TABLE (PREFIX_VEX_0F38B7) },
9128     /* b8 */
9129     { PREFIX_TABLE (PREFIX_VEX_0F38B8) },
9130     { PREFIX_TABLE (PREFIX_VEX_0F38B9) },
9131     { PREFIX_TABLE (PREFIX_VEX_0F38BA) },
9132     { PREFIX_TABLE (PREFIX_VEX_0F38BB) },
9133     { PREFIX_TABLE (PREFIX_VEX_0F38BC) },
9134     { PREFIX_TABLE (PREFIX_VEX_0F38BD) },
9135     { PREFIX_TABLE (PREFIX_VEX_0F38BE) },
9136     { PREFIX_TABLE (PREFIX_VEX_0F38BF) },
9137     /* c0 */
9138     { Bad_Opcode },
9139     { Bad_Opcode },
9140     { Bad_Opcode },
9141     { Bad_Opcode },
9142     { Bad_Opcode },
9143     { Bad_Opcode },
9144     { Bad_Opcode },
9145     { Bad_Opcode },
9146     /* c8 */
9147     { Bad_Opcode },
9148     { Bad_Opcode },
9149     { Bad_Opcode },
9150     { Bad_Opcode },
9151     { Bad_Opcode },
9152     { Bad_Opcode },
9153     { Bad_Opcode },
9154     { Bad_Opcode },
9155     /* d0 */
9156     { Bad_Opcode },
9157     { Bad_Opcode },
9158     { Bad_Opcode },
9159     { Bad_Opcode },
9160     { Bad_Opcode },
9161     { Bad_Opcode },
9162     { Bad_Opcode },
9163     { Bad_Opcode },
9164     /* d8 */
9165     { Bad_Opcode },
9166     { Bad_Opcode },
9167     { Bad_Opcode },
9168     { PREFIX_TABLE (PREFIX_VEX_0F38DB) },
9169     { PREFIX_TABLE (PREFIX_VEX_0F38DC) },
9170     { PREFIX_TABLE (PREFIX_VEX_0F38DD) },
9171     { PREFIX_TABLE (PREFIX_VEX_0F38DE) },
9172     { PREFIX_TABLE (PREFIX_VEX_0F38DF) },
9173     /* e0 */
9174     { Bad_Opcode },
9175     { Bad_Opcode },
9176     { Bad_Opcode },
9177     { Bad_Opcode },
9178     { Bad_Opcode },
9179     { Bad_Opcode },
9180     { Bad_Opcode },
9181     { Bad_Opcode },
9182     /* e8 */
9183     { Bad_Opcode },
9184     { Bad_Opcode },
9185     { Bad_Opcode },
9186     { Bad_Opcode },
9187     { Bad_Opcode },
9188     { Bad_Opcode },
9189     { Bad_Opcode },
9190     { Bad_Opcode },
9191     /* f0 */
9192     { Bad_Opcode },
9193     { Bad_Opcode },
9194     { PREFIX_TABLE (PREFIX_VEX_0F38F2) },
9195     { REG_TABLE (REG_VEX_0F38F3) },
9196     { Bad_Opcode },
9197     { PREFIX_TABLE (PREFIX_VEX_0F38F5) },
9198     { PREFIX_TABLE (PREFIX_VEX_0F38F6) },
9199     { PREFIX_TABLE (PREFIX_VEX_0F38F7) },
9200     /* f8 */
9201     { Bad_Opcode },
9202     { Bad_Opcode },
9203     { Bad_Opcode },
9204     { Bad_Opcode },
9205     { Bad_Opcode },
9206     { Bad_Opcode },
9207     { Bad_Opcode },
9208     { Bad_Opcode },
9209   },
9210   /* VEX_0F3A */
9211   {
9212     /* 00 */
9213     { PREFIX_TABLE (PREFIX_VEX_0F3A00) },
9214     { PREFIX_TABLE (PREFIX_VEX_0F3A01) },
9215     { PREFIX_TABLE (PREFIX_VEX_0F3A02) },
9216     { Bad_Opcode },
9217     { PREFIX_TABLE (PREFIX_VEX_0F3A04) },
9218     { PREFIX_TABLE (PREFIX_VEX_0F3A05) },
9219     { PREFIX_TABLE (PREFIX_VEX_0F3A06) },
9220     { Bad_Opcode },
9221     /* 08 */
9222     { PREFIX_TABLE (PREFIX_VEX_0F3A08) },
9223     { PREFIX_TABLE (PREFIX_VEX_0F3A09) },
9224     { PREFIX_TABLE (PREFIX_VEX_0F3A0A) },
9225     { PREFIX_TABLE (PREFIX_VEX_0F3A0B) },
9226     { PREFIX_TABLE (PREFIX_VEX_0F3A0C) },
9227     { PREFIX_TABLE (PREFIX_VEX_0F3A0D) },
9228     { PREFIX_TABLE (PREFIX_VEX_0F3A0E) },
9229     { PREFIX_TABLE (PREFIX_VEX_0F3A0F) },
9230     /* 10 */
9231     { Bad_Opcode },
9232     { Bad_Opcode },
9233     { Bad_Opcode },
9234     { Bad_Opcode },
9235     { PREFIX_TABLE (PREFIX_VEX_0F3A14) },
9236     { PREFIX_TABLE (PREFIX_VEX_0F3A15) },
9237     { PREFIX_TABLE (PREFIX_VEX_0F3A16) },
9238     { PREFIX_TABLE (PREFIX_VEX_0F3A17) },
9239     /* 18 */
9240     { PREFIX_TABLE (PREFIX_VEX_0F3A18) },
9241     { PREFIX_TABLE (PREFIX_VEX_0F3A19) },
9242     { Bad_Opcode },
9243     { Bad_Opcode },
9244     { Bad_Opcode },
9245     { PREFIX_TABLE (PREFIX_VEX_0F3A1D) },
9246     { Bad_Opcode },
9247     { Bad_Opcode },
9248     /* 20 */
9249     { PREFIX_TABLE (PREFIX_VEX_0F3A20) },
9250     { PREFIX_TABLE (PREFIX_VEX_0F3A21) },
9251     { PREFIX_TABLE (PREFIX_VEX_0F3A22) },
9252     { Bad_Opcode },
9253     { Bad_Opcode },
9254     { Bad_Opcode },
9255     { Bad_Opcode },
9256     { Bad_Opcode },
9257     /* 28 */
9258     { Bad_Opcode },
9259     { Bad_Opcode },
9260     { Bad_Opcode },
9261     { Bad_Opcode },
9262     { Bad_Opcode },
9263     { Bad_Opcode },
9264     { Bad_Opcode },
9265     { Bad_Opcode },
9266     /* 30 */
9267     { PREFIX_TABLE (PREFIX_VEX_0F3A30) },
9268     { PREFIX_TABLE (PREFIX_VEX_0F3A31) },
9269     { PREFIX_TABLE (PREFIX_VEX_0F3A32) },
9270     { PREFIX_TABLE (PREFIX_VEX_0F3A33) },
9271     { Bad_Opcode },
9272     { Bad_Opcode },
9273     { Bad_Opcode },
9274     { Bad_Opcode },
9275     /* 38 */
9276     { PREFIX_TABLE (PREFIX_VEX_0F3A38) },
9277     { PREFIX_TABLE (PREFIX_VEX_0F3A39) },
9278     { Bad_Opcode },
9279     { Bad_Opcode },
9280     { Bad_Opcode },
9281     { Bad_Opcode },
9282     { Bad_Opcode },
9283     { Bad_Opcode },
9284     /* 40 */
9285     { PREFIX_TABLE (PREFIX_VEX_0F3A40) },
9286     { PREFIX_TABLE (PREFIX_VEX_0F3A41) },
9287     { PREFIX_TABLE (PREFIX_VEX_0F3A42) },
9288     { Bad_Opcode },
9289     { PREFIX_TABLE (PREFIX_VEX_0F3A44) },
9290     { Bad_Opcode },
9291     { PREFIX_TABLE (PREFIX_VEX_0F3A46) },
9292     { Bad_Opcode },
9293     /* 48 */
9294     { PREFIX_TABLE (PREFIX_VEX_0F3A48) },
9295     { PREFIX_TABLE (PREFIX_VEX_0F3A49) },
9296     { PREFIX_TABLE (PREFIX_VEX_0F3A4A) },
9297     { PREFIX_TABLE (PREFIX_VEX_0F3A4B) },
9298     { PREFIX_TABLE (PREFIX_VEX_0F3A4C) },
9299     { Bad_Opcode },
9300     { Bad_Opcode },
9301     { Bad_Opcode },
9302     /* 50 */
9303     { Bad_Opcode },
9304     { Bad_Opcode },
9305     { Bad_Opcode },
9306     { Bad_Opcode },
9307     { Bad_Opcode },
9308     { Bad_Opcode },
9309     { Bad_Opcode },
9310     { Bad_Opcode },
9311     /* 58 */
9312     { Bad_Opcode },
9313     { Bad_Opcode },
9314     { Bad_Opcode },
9315     { Bad_Opcode },
9316     { PREFIX_TABLE (PREFIX_VEX_0F3A5C) },
9317     { PREFIX_TABLE (PREFIX_VEX_0F3A5D) },
9318     { PREFIX_TABLE (PREFIX_VEX_0F3A5E) },
9319     { PREFIX_TABLE (PREFIX_VEX_0F3A5F) },
9320     /* 60 */
9321     { PREFIX_TABLE (PREFIX_VEX_0F3A60) },
9322     { PREFIX_TABLE (PREFIX_VEX_0F3A61) },
9323     { PREFIX_TABLE (PREFIX_VEX_0F3A62) },
9324     { PREFIX_TABLE (PREFIX_VEX_0F3A63) },
9325     { Bad_Opcode },
9326     { Bad_Opcode },
9327     { Bad_Opcode },
9328     { Bad_Opcode },
9329     /* 68 */
9330     { PREFIX_TABLE (PREFIX_VEX_0F3A68) },
9331     { PREFIX_TABLE (PREFIX_VEX_0F3A69) },
9332     { PREFIX_TABLE (PREFIX_VEX_0F3A6A) },
9333     { PREFIX_TABLE (PREFIX_VEX_0F3A6B) },
9334     { PREFIX_TABLE (PREFIX_VEX_0F3A6C) },
9335     { PREFIX_TABLE (PREFIX_VEX_0F3A6D) },
9336     { PREFIX_TABLE (PREFIX_VEX_0F3A6E) },
9337     { PREFIX_TABLE (PREFIX_VEX_0F3A6F) },
9338     /* 70 */
9339     { Bad_Opcode },
9340     { Bad_Opcode },
9341     { Bad_Opcode },
9342     { Bad_Opcode },
9343     { Bad_Opcode },
9344     { Bad_Opcode },
9345     { Bad_Opcode },
9346     { Bad_Opcode },
9347     /* 78 */
9348     { PREFIX_TABLE (PREFIX_VEX_0F3A78) },
9349     { PREFIX_TABLE (PREFIX_VEX_0F3A79) },
9350     { PREFIX_TABLE (PREFIX_VEX_0F3A7A) },
9351     { PREFIX_TABLE (PREFIX_VEX_0F3A7B) },
9352     { PREFIX_TABLE (PREFIX_VEX_0F3A7C) },
9353     { PREFIX_TABLE (PREFIX_VEX_0F3A7D) },
9354     { PREFIX_TABLE (PREFIX_VEX_0F3A7E) },
9355     { PREFIX_TABLE (PREFIX_VEX_0F3A7F) },
9356     /* 80 */
9357     { Bad_Opcode },
9358     { Bad_Opcode },
9359     { Bad_Opcode },
9360     { Bad_Opcode },
9361     { Bad_Opcode },
9362     { Bad_Opcode },
9363     { Bad_Opcode },
9364     { Bad_Opcode },
9365     /* 88 */
9366     { Bad_Opcode },
9367     { Bad_Opcode },
9368     { Bad_Opcode },
9369     { Bad_Opcode },
9370     { Bad_Opcode },
9371     { Bad_Opcode },
9372     { Bad_Opcode },
9373     { Bad_Opcode },
9374     /* 90 */
9375     { Bad_Opcode },
9376     { Bad_Opcode },
9377     { Bad_Opcode },
9378     { Bad_Opcode },
9379     { Bad_Opcode },
9380     { Bad_Opcode },
9381     { Bad_Opcode },
9382     { Bad_Opcode },
9383     /* 98 */
9384     { Bad_Opcode },
9385     { Bad_Opcode },
9386     { Bad_Opcode },
9387     { Bad_Opcode },
9388     { Bad_Opcode },
9389     { Bad_Opcode },
9390     { Bad_Opcode },
9391     { Bad_Opcode },
9392     /* a0 */
9393     { Bad_Opcode },
9394     { Bad_Opcode },
9395     { Bad_Opcode },
9396     { Bad_Opcode },
9397     { Bad_Opcode },
9398     { Bad_Opcode },
9399     { Bad_Opcode },
9400     { Bad_Opcode },
9401     /* a8 */
9402     { Bad_Opcode },
9403     { Bad_Opcode },
9404     { Bad_Opcode },
9405     { Bad_Opcode },
9406     { Bad_Opcode },
9407     { Bad_Opcode },
9408     { Bad_Opcode },
9409     { Bad_Opcode },
9410     /* b0 */
9411     { Bad_Opcode },
9412     { Bad_Opcode },
9413     { Bad_Opcode },
9414     { Bad_Opcode },
9415     { Bad_Opcode },
9416     { Bad_Opcode },
9417     { Bad_Opcode },
9418     { Bad_Opcode },
9419     /* b8 */
9420     { Bad_Opcode },
9421     { Bad_Opcode },
9422     { Bad_Opcode },
9423     { Bad_Opcode },
9424     { Bad_Opcode },
9425     { Bad_Opcode },
9426     { Bad_Opcode },
9427     { Bad_Opcode },
9428     /* c0 */
9429     { Bad_Opcode },
9430     { Bad_Opcode },
9431     { Bad_Opcode },
9432     { Bad_Opcode },
9433     { Bad_Opcode },
9434     { Bad_Opcode },
9435     { Bad_Opcode },
9436     { Bad_Opcode },
9437     /* c8 */
9438     { Bad_Opcode },
9439     { Bad_Opcode },
9440     { Bad_Opcode },
9441     { Bad_Opcode },
9442     { Bad_Opcode },
9443     { Bad_Opcode },
9444     { Bad_Opcode },
9445     { Bad_Opcode },
9446     /* d0 */
9447     { Bad_Opcode },
9448     { Bad_Opcode },
9449     { Bad_Opcode },
9450     { Bad_Opcode },
9451     { Bad_Opcode },
9452     { Bad_Opcode },
9453     { Bad_Opcode },
9454     { Bad_Opcode },
9455     /* d8 */
9456     { Bad_Opcode },
9457     { Bad_Opcode },
9458     { Bad_Opcode },
9459     { Bad_Opcode },
9460     { Bad_Opcode },
9461     { Bad_Opcode },
9462     { Bad_Opcode },
9463     { PREFIX_TABLE (PREFIX_VEX_0F3ADF) },
9464     /* e0 */
9465     { Bad_Opcode },
9466     { Bad_Opcode },
9467     { Bad_Opcode },
9468     { Bad_Opcode },
9469     { Bad_Opcode },
9470     { Bad_Opcode },
9471     { Bad_Opcode },
9472     { Bad_Opcode },
9473     /* e8 */
9474     { Bad_Opcode },
9475     { Bad_Opcode },
9476     { Bad_Opcode },
9477     { Bad_Opcode },
9478     { Bad_Opcode },
9479     { Bad_Opcode },
9480     { Bad_Opcode },
9481     { Bad_Opcode },
9482     /* f0 */
9483     { PREFIX_TABLE (PREFIX_VEX_0F3AF0) },
9484     { Bad_Opcode },
9485     { Bad_Opcode },
9486     { Bad_Opcode },
9487     { Bad_Opcode },
9488     { Bad_Opcode },
9489     { Bad_Opcode },
9490     { Bad_Opcode },
9491     /* f8 */
9492     { Bad_Opcode },
9493     { Bad_Opcode },
9494     { Bad_Opcode },
9495     { Bad_Opcode },
9496     { Bad_Opcode },
9497     { Bad_Opcode },
9498     { Bad_Opcode },
9499     { Bad_Opcode },
9500   },
9501 };
9502
9503 #define NEED_OPCODE_TABLE
9504 #include "i386-dis-evex.h"
9505 #undef NEED_OPCODE_TABLE
9506 static const struct dis386 vex_len_table[][2] = {
9507   /* VEX_LEN_0F10_P_1 */
9508   {
9509     { VEX_W_TABLE (VEX_W_0F10_P_1) },
9510     { VEX_W_TABLE (VEX_W_0F10_P_1) },
9511   },
9512
9513   /* VEX_LEN_0F10_P_3 */
9514   {
9515     { VEX_W_TABLE (VEX_W_0F10_P_3) },
9516     { VEX_W_TABLE (VEX_W_0F10_P_3) },
9517   },
9518
9519   /* VEX_LEN_0F11_P_1 */
9520   {
9521     { VEX_W_TABLE (VEX_W_0F11_P_1) },
9522     { VEX_W_TABLE (VEX_W_0F11_P_1) },
9523   },
9524
9525   /* VEX_LEN_0F11_P_3 */
9526   {
9527     { VEX_W_TABLE (VEX_W_0F11_P_3) },
9528     { VEX_W_TABLE (VEX_W_0F11_P_3) },
9529   },
9530
9531   /* VEX_LEN_0F12_P_0_M_0 */
9532   {
9533     { VEX_W_TABLE (VEX_W_0F12_P_0_M_0) },
9534   },
9535
9536   /* VEX_LEN_0F12_P_0_M_1 */
9537   {
9538     { VEX_W_TABLE (VEX_W_0F12_P_0_M_1) },
9539   },
9540
9541   /* VEX_LEN_0F12_P_2 */
9542   {
9543     { VEX_W_TABLE (VEX_W_0F12_P_2) },
9544   },
9545
9546   /* VEX_LEN_0F13_M_0 */
9547   {
9548     { VEX_W_TABLE (VEX_W_0F13_M_0) },
9549   },
9550
9551   /* VEX_LEN_0F16_P_0_M_0 */
9552   {
9553     { VEX_W_TABLE (VEX_W_0F16_P_0_M_0) },
9554   },
9555
9556   /* VEX_LEN_0F16_P_0_M_1 */
9557   {
9558     { VEX_W_TABLE (VEX_W_0F16_P_0_M_1) },
9559   },
9560
9561   /* VEX_LEN_0F16_P_2 */
9562   {
9563     { VEX_W_TABLE (VEX_W_0F16_P_2) },
9564   },
9565
9566   /* VEX_LEN_0F17_M_0 */
9567   {
9568     { VEX_W_TABLE (VEX_W_0F17_M_0) },
9569   },
9570
9571   /* VEX_LEN_0F2A_P_1 */
9572   {
9573     { "vcvtsi2ss%LQ",   { XMScalar, VexScalar, Ev }, 0 },
9574     { "vcvtsi2ss%LQ",   { XMScalar, VexScalar, Ev }, 0 },
9575   },
9576
9577   /* VEX_LEN_0F2A_P_3 */
9578   {
9579     { "vcvtsi2sd%LQ",   { XMScalar, VexScalar, Ev }, 0 },
9580     { "vcvtsi2sd%LQ",   { XMScalar, VexScalar, Ev }, 0 },
9581   },
9582
9583   /* VEX_LEN_0F2C_P_1 */
9584   {
9585     { "vcvttss2siY",    { Gv, EXdScalar }, 0 },
9586     { "vcvttss2siY",    { Gv, EXdScalar }, 0 },
9587   },
9588
9589   /* VEX_LEN_0F2C_P_3 */
9590   {
9591     { "vcvttsd2siY",    { Gv, EXqScalar }, 0 },
9592     { "vcvttsd2siY",    { Gv, EXqScalar }, 0 },
9593   },
9594
9595   /* VEX_LEN_0F2D_P_1 */
9596   {
9597     { "vcvtss2siY",     { Gv, EXdScalar }, 0 },
9598     { "vcvtss2siY",     { Gv, EXdScalar }, 0 },
9599   },
9600
9601   /* VEX_LEN_0F2D_P_3 */
9602   {
9603     { "vcvtsd2siY",     { Gv, EXqScalar }, 0 },
9604     { "vcvtsd2siY",     { Gv, EXqScalar }, 0 },
9605   },
9606
9607   /* VEX_LEN_0F2E_P_0 */
9608   {
9609     { VEX_W_TABLE (VEX_W_0F2E_P_0) },
9610     { VEX_W_TABLE (VEX_W_0F2E_P_0) },
9611   },
9612
9613   /* VEX_LEN_0F2E_P_2 */
9614   {
9615     { VEX_W_TABLE (VEX_W_0F2E_P_2) },
9616     { VEX_W_TABLE (VEX_W_0F2E_P_2) },
9617   },
9618
9619   /* VEX_LEN_0F2F_P_0 */
9620   {
9621     { VEX_W_TABLE (VEX_W_0F2F_P_0) },
9622     { VEX_W_TABLE (VEX_W_0F2F_P_0) },
9623   },
9624
9625   /* VEX_LEN_0F2F_P_2 */
9626   {
9627     { VEX_W_TABLE (VEX_W_0F2F_P_2) },
9628     { VEX_W_TABLE (VEX_W_0F2F_P_2) },
9629   },
9630
9631   /* VEX_LEN_0F41_P_0 */
9632   {
9633     { Bad_Opcode },
9634     { VEX_W_TABLE (VEX_W_0F41_P_0_LEN_1) },
9635   },
9636   /* VEX_LEN_0F41_P_2 */
9637   {
9638     { Bad_Opcode },
9639     { VEX_W_TABLE (VEX_W_0F41_P_2_LEN_1) },
9640   },
9641   /* VEX_LEN_0F42_P_0 */
9642   {
9643     { Bad_Opcode },
9644     { VEX_W_TABLE (VEX_W_0F42_P_0_LEN_1) },
9645   },
9646   /* VEX_LEN_0F42_P_2 */
9647   {
9648     { Bad_Opcode },
9649     { VEX_W_TABLE (VEX_W_0F42_P_2_LEN_1) },
9650   },
9651   /* VEX_LEN_0F44_P_0 */
9652   {
9653     { VEX_W_TABLE (VEX_W_0F44_P_0_LEN_0) },
9654   },
9655   /* VEX_LEN_0F44_P_2 */
9656   {
9657     { VEX_W_TABLE (VEX_W_0F44_P_2_LEN_0) },
9658   },
9659   /* VEX_LEN_0F45_P_0 */
9660   {
9661     { Bad_Opcode },
9662     { VEX_W_TABLE (VEX_W_0F45_P_0_LEN_1) },
9663   },
9664   /* VEX_LEN_0F45_P_2 */
9665   {
9666     { Bad_Opcode },
9667     { VEX_W_TABLE (VEX_W_0F45_P_2_LEN_1) },
9668   },
9669   /* VEX_LEN_0F46_P_0 */
9670   {
9671     { Bad_Opcode },
9672     { VEX_W_TABLE (VEX_W_0F46_P_0_LEN_1) },
9673   },
9674   /* VEX_LEN_0F46_P_2 */
9675   {
9676     { Bad_Opcode },
9677     { VEX_W_TABLE (VEX_W_0F46_P_2_LEN_1) },
9678   },
9679   /* VEX_LEN_0F47_P_0 */
9680   {
9681     { Bad_Opcode },
9682     { VEX_W_TABLE (VEX_W_0F47_P_0_LEN_1) },
9683   },
9684   /* VEX_LEN_0F47_P_2 */
9685   {
9686     { Bad_Opcode },
9687     { VEX_W_TABLE (VEX_W_0F47_P_2_LEN_1) },
9688   },
9689   /* VEX_LEN_0F4A_P_0 */
9690   {
9691     { Bad_Opcode },
9692     { VEX_W_TABLE (VEX_W_0F4A_P_0_LEN_1) },
9693   },
9694   /* VEX_LEN_0F4A_P_2 */
9695   {
9696     { Bad_Opcode },
9697     { VEX_W_TABLE (VEX_W_0F4A_P_2_LEN_1) },
9698   },
9699   /* VEX_LEN_0F4B_P_0 */
9700   {
9701     { Bad_Opcode },
9702     { VEX_W_TABLE (VEX_W_0F4B_P_0_LEN_1) },
9703   },
9704   /* VEX_LEN_0F4B_P_2 */
9705   {
9706     { Bad_Opcode },
9707     { VEX_W_TABLE (VEX_W_0F4B_P_2_LEN_1) },
9708   },
9709
9710   /* VEX_LEN_0F51_P_1 */
9711   {
9712     { VEX_W_TABLE (VEX_W_0F51_P_1) },
9713     { VEX_W_TABLE (VEX_W_0F51_P_1) },
9714   },
9715
9716   /* VEX_LEN_0F51_P_3 */
9717   {
9718     { VEX_W_TABLE (VEX_W_0F51_P_3) },
9719     { VEX_W_TABLE (VEX_W_0F51_P_3) },
9720   },
9721
9722   /* VEX_LEN_0F52_P_1 */
9723   {
9724     { VEX_W_TABLE (VEX_W_0F52_P_1) },
9725     { VEX_W_TABLE (VEX_W_0F52_P_1) },
9726   },
9727
9728   /* VEX_LEN_0F53_P_1 */
9729   {
9730     { VEX_W_TABLE (VEX_W_0F53_P_1) },
9731     { VEX_W_TABLE (VEX_W_0F53_P_1) },
9732   },
9733
9734   /* VEX_LEN_0F58_P_1 */
9735   {
9736     { VEX_W_TABLE (VEX_W_0F58_P_1) },
9737     { VEX_W_TABLE (VEX_W_0F58_P_1) },
9738   },
9739
9740   /* VEX_LEN_0F58_P_3 */
9741   {
9742     { VEX_W_TABLE (VEX_W_0F58_P_3) },
9743     { VEX_W_TABLE (VEX_W_0F58_P_3) },
9744   },
9745
9746   /* VEX_LEN_0F59_P_1 */
9747   {
9748     { VEX_W_TABLE (VEX_W_0F59_P_1) },
9749     { VEX_W_TABLE (VEX_W_0F59_P_1) },
9750   },
9751
9752   /* VEX_LEN_0F59_P_3 */
9753   {
9754     { VEX_W_TABLE (VEX_W_0F59_P_3) },
9755     { VEX_W_TABLE (VEX_W_0F59_P_3) },
9756   },
9757
9758   /* VEX_LEN_0F5A_P_1 */
9759   {
9760     { VEX_W_TABLE (VEX_W_0F5A_P_1) },
9761     { VEX_W_TABLE (VEX_W_0F5A_P_1) },
9762   },
9763
9764   /* VEX_LEN_0F5A_P_3 */
9765   {
9766     { VEX_W_TABLE (VEX_W_0F5A_P_3) },
9767     { VEX_W_TABLE (VEX_W_0F5A_P_3) },
9768   },
9769
9770   /* VEX_LEN_0F5C_P_1 */
9771   {
9772     { VEX_W_TABLE (VEX_W_0F5C_P_1) },
9773     { VEX_W_TABLE (VEX_W_0F5C_P_1) },
9774   },
9775
9776   /* VEX_LEN_0F5C_P_3 */
9777   {
9778     { VEX_W_TABLE (VEX_W_0F5C_P_3) },
9779     { VEX_W_TABLE (VEX_W_0F5C_P_3) },
9780   },
9781
9782   /* VEX_LEN_0F5D_P_1 */
9783   {
9784     { VEX_W_TABLE (VEX_W_0F5D_P_1) },
9785     { VEX_W_TABLE (VEX_W_0F5D_P_1) },
9786   },
9787
9788   /* VEX_LEN_0F5D_P_3 */
9789   {
9790     { VEX_W_TABLE (VEX_W_0F5D_P_3) },
9791     { VEX_W_TABLE (VEX_W_0F5D_P_3) },
9792   },
9793
9794   /* VEX_LEN_0F5E_P_1 */
9795   {
9796     { VEX_W_TABLE (VEX_W_0F5E_P_1) },
9797     { VEX_W_TABLE (VEX_W_0F5E_P_1) },
9798   },
9799
9800   /* VEX_LEN_0F5E_P_3 */
9801   {
9802     { VEX_W_TABLE (VEX_W_0F5E_P_3) },
9803     { VEX_W_TABLE (VEX_W_0F5E_P_3) },
9804   },
9805
9806   /* VEX_LEN_0F5F_P_1 */
9807   {
9808     { VEX_W_TABLE (VEX_W_0F5F_P_1) },
9809     { VEX_W_TABLE (VEX_W_0F5F_P_1) },
9810   },
9811
9812   /* VEX_LEN_0F5F_P_3 */
9813   {
9814     { VEX_W_TABLE (VEX_W_0F5F_P_3) },
9815     { VEX_W_TABLE (VEX_W_0F5F_P_3) },
9816   },
9817
9818   /* VEX_LEN_0F6E_P_2 */
9819   {
9820     { "vmovK",          { XMScalar, Edq }, 0 },
9821     { "vmovK",          { XMScalar, Edq }, 0 },
9822   },
9823
9824   /* VEX_LEN_0F7E_P_1 */
9825   {
9826     { VEX_W_TABLE (VEX_W_0F7E_P_1) },
9827     { VEX_W_TABLE (VEX_W_0F7E_P_1) },
9828   },
9829
9830   /* VEX_LEN_0F7E_P_2 */
9831   {
9832     { "vmovK",          { Edq, XMScalar }, 0 },
9833     { "vmovK",          { Edq, XMScalar }, 0 },
9834   },
9835
9836   /* VEX_LEN_0F90_P_0 */
9837   {
9838     { VEX_W_TABLE (VEX_W_0F90_P_0_LEN_0) },
9839   },
9840
9841   /* VEX_LEN_0F90_P_2 */
9842   {
9843     { VEX_W_TABLE (VEX_W_0F90_P_2_LEN_0) },
9844   },
9845
9846   /* VEX_LEN_0F91_P_0 */
9847   {
9848     { VEX_W_TABLE (VEX_W_0F91_P_0_LEN_0) },
9849   },
9850
9851   /* VEX_LEN_0F91_P_2 */
9852   {
9853     { VEX_W_TABLE (VEX_W_0F91_P_2_LEN_0) },
9854   },
9855
9856   /* VEX_LEN_0F92_P_0 */
9857   {
9858     { VEX_W_TABLE (VEX_W_0F92_P_0_LEN_0) },
9859   },
9860
9861   /* VEX_LEN_0F92_P_2 */
9862   {
9863     { VEX_W_TABLE (VEX_W_0F92_P_2_LEN_0) },
9864   },
9865
9866   /* VEX_LEN_0F92_P_3 */
9867   {
9868     { VEX_W_TABLE (VEX_W_0F92_P_3_LEN_0) },
9869   },
9870
9871   /* VEX_LEN_0F93_P_0 */
9872   {
9873     { VEX_W_TABLE (VEX_W_0F93_P_0_LEN_0) },
9874   },
9875
9876   /* VEX_LEN_0F93_P_2 */
9877   {
9878     { VEX_W_TABLE (VEX_W_0F93_P_2_LEN_0) },
9879   },
9880
9881   /* VEX_LEN_0F93_P_3 */
9882   {
9883     { VEX_W_TABLE (VEX_W_0F93_P_3_LEN_0) },
9884   },
9885
9886   /* VEX_LEN_0F98_P_0 */
9887   {
9888     { VEX_W_TABLE (VEX_W_0F98_P_0_LEN_0) },
9889   },
9890
9891   /* VEX_LEN_0F98_P_2 */
9892   {
9893     { VEX_W_TABLE (VEX_W_0F98_P_2_LEN_0) },
9894   },
9895
9896   /* VEX_LEN_0F99_P_0 */
9897   {
9898     { VEX_W_TABLE (VEX_W_0F99_P_0_LEN_0) },
9899   },
9900
9901   /* VEX_LEN_0F99_P_2 */
9902   {
9903     { VEX_W_TABLE (VEX_W_0F99_P_2_LEN_0) },
9904   },
9905
9906   /* VEX_LEN_0FAE_R_2_M_0 */
9907   {
9908     { VEX_W_TABLE (VEX_W_0FAE_R_2_M_0) },
9909   },
9910
9911   /* VEX_LEN_0FAE_R_3_M_0 */
9912   {
9913     { VEX_W_TABLE (VEX_W_0FAE_R_3_M_0) },
9914   },
9915
9916   /* VEX_LEN_0FC2_P_1 */
9917   {
9918     { VEX_W_TABLE (VEX_W_0FC2_P_1) },
9919     { VEX_W_TABLE (VEX_W_0FC2_P_1) },
9920   },
9921
9922   /* VEX_LEN_0FC2_P_3 */
9923   {
9924     { VEX_W_TABLE (VEX_W_0FC2_P_3) },
9925     { VEX_W_TABLE (VEX_W_0FC2_P_3) },
9926   },
9927
9928   /* VEX_LEN_0FC4_P_2 */
9929   {
9930     { VEX_W_TABLE (VEX_W_0FC4_P_2) },
9931   },
9932
9933   /* VEX_LEN_0FC5_P_2 */
9934   {
9935     { VEX_W_TABLE (VEX_W_0FC5_P_2) },
9936   },
9937
9938   /* VEX_LEN_0FD6_P_2 */
9939   {
9940     { VEX_W_TABLE (VEX_W_0FD6_P_2) },
9941     { VEX_W_TABLE (VEX_W_0FD6_P_2) },
9942   },
9943
9944   /* VEX_LEN_0FF7_P_2 */
9945   {
9946     { VEX_W_TABLE (VEX_W_0FF7_P_2) },
9947   },
9948
9949   /* VEX_LEN_0F3816_P_2 */
9950   {
9951     { Bad_Opcode },
9952     { VEX_W_TABLE (VEX_W_0F3816_P_2) },
9953   },
9954
9955   /* VEX_LEN_0F3819_P_2 */
9956   {
9957     { Bad_Opcode },
9958     { VEX_W_TABLE (VEX_W_0F3819_P_2) },
9959   },
9960
9961   /* VEX_LEN_0F381A_P_2_M_0 */
9962   {
9963     { Bad_Opcode },
9964     { VEX_W_TABLE (VEX_W_0F381A_P_2_M_0) },
9965   },
9966
9967   /* VEX_LEN_0F3836_P_2 */
9968   {
9969     { Bad_Opcode },
9970     { VEX_W_TABLE (VEX_W_0F3836_P_2) },
9971   },
9972
9973   /* VEX_LEN_0F3841_P_2 */
9974   {
9975     { VEX_W_TABLE (VEX_W_0F3841_P_2) },
9976   },
9977
9978   /* VEX_LEN_0F385A_P_2_M_0 */
9979   {
9980     { Bad_Opcode },
9981     { VEX_W_TABLE (VEX_W_0F385A_P_2_M_0) },
9982   },
9983
9984   /* VEX_LEN_0F38DB_P_2 */
9985   {
9986     { VEX_W_TABLE (VEX_W_0F38DB_P_2) },
9987   },
9988
9989   /* VEX_LEN_0F38DC_P_2 */
9990   {
9991     { VEX_W_TABLE (VEX_W_0F38DC_P_2) },
9992   },
9993
9994   /* VEX_LEN_0F38DD_P_2 */
9995   {
9996     { VEX_W_TABLE (VEX_W_0F38DD_P_2) },
9997   },
9998
9999   /* VEX_LEN_0F38DE_P_2 */
10000   {
10001     { VEX_W_TABLE (VEX_W_0F38DE_P_2) },
10002   },
10003
10004   /* VEX_LEN_0F38DF_P_2 */
10005   {
10006     { VEX_W_TABLE (VEX_W_0F38DF_P_2) },
10007   },
10008
10009   /* VEX_LEN_0F38F2_P_0 */
10010   {
10011     { "andnS",          { Gdq, VexGdq, Edq }, 0 },
10012   },
10013
10014   /* VEX_LEN_0F38F3_R_1_P_0 */
10015   {
10016     { "blsrS",          { VexGdq, Edq }, 0 },
10017   },
10018
10019   /* VEX_LEN_0F38F3_R_2_P_0 */
10020   {
10021     { "blsmskS",        { VexGdq, Edq }, 0 },
10022   },
10023
10024   /* VEX_LEN_0F38F3_R_3_P_0 */
10025   {
10026     { "blsiS",          { VexGdq, Edq }, 0 },
10027   },
10028
10029   /* VEX_LEN_0F38F5_P_0 */
10030   {
10031     { "bzhiS",          { Gdq, Edq, VexGdq }, 0 },
10032   },
10033
10034   /* VEX_LEN_0F38F5_P_1 */
10035   {
10036     { "pextS",          { Gdq, VexGdq, Edq }, 0 },
10037   },
10038
10039   /* VEX_LEN_0F38F5_P_3 */
10040   {
10041     { "pdepS",          { Gdq, VexGdq, Edq }, 0 },
10042   },
10043
10044   /* VEX_LEN_0F38F6_P_3 */
10045   {
10046     { "mulxS",          { Gdq, VexGdq, Edq }, 0 },
10047   },
10048
10049   /* VEX_LEN_0F38F7_P_0 */
10050   {
10051     { "bextrS",         { Gdq, Edq, VexGdq }, 0 },
10052   },
10053
10054   /* VEX_LEN_0F38F7_P_1 */
10055   {
10056     { "sarxS",          { Gdq, Edq, VexGdq }, 0 },
10057   },
10058
10059   /* VEX_LEN_0F38F7_P_2 */
10060   {
10061     { "shlxS",          { Gdq, Edq, VexGdq }, 0 },
10062   },
10063
10064   /* VEX_LEN_0F38F7_P_3 */
10065   {
10066     { "shrxS",          { Gdq, Edq, VexGdq }, 0 },
10067   },
10068
10069   /* VEX_LEN_0F3A00_P_2 */
10070   {
10071     { Bad_Opcode },
10072     { VEX_W_TABLE (VEX_W_0F3A00_P_2) },
10073   },
10074
10075   /* VEX_LEN_0F3A01_P_2 */
10076   {
10077     { Bad_Opcode },
10078     { VEX_W_TABLE (VEX_W_0F3A01_P_2) },
10079   },
10080
10081   /* VEX_LEN_0F3A06_P_2 */
10082   {
10083     { Bad_Opcode },
10084     { VEX_W_TABLE (VEX_W_0F3A06_P_2) },
10085   },
10086
10087   /* VEX_LEN_0F3A0A_P_2 */
10088   {
10089     { VEX_W_TABLE (VEX_W_0F3A0A_P_2) },
10090     { VEX_W_TABLE (VEX_W_0F3A0A_P_2) },
10091   },
10092
10093   /* VEX_LEN_0F3A0B_P_2 */
10094   {
10095     { VEX_W_TABLE (VEX_W_0F3A0B_P_2) },
10096     { VEX_W_TABLE (VEX_W_0F3A0B_P_2) },
10097   },
10098
10099   /* VEX_LEN_0F3A14_P_2 */
10100   {
10101     { VEX_W_TABLE (VEX_W_0F3A14_P_2) },
10102   },
10103
10104   /* VEX_LEN_0F3A15_P_2 */
10105   {
10106     { VEX_W_TABLE (VEX_W_0F3A15_P_2) },
10107   },
10108
10109   /* VEX_LEN_0F3A16_P_2  */
10110   {
10111     { "vpextrK",        { Edq, XM, Ib }, 0 },
10112   },
10113
10114   /* VEX_LEN_0F3A17_P_2 */
10115   {
10116     { "vextractps",     { Edqd, XM, Ib }, 0 },
10117   },
10118
10119   /* VEX_LEN_0F3A18_P_2 */
10120   {
10121     { Bad_Opcode },
10122     { VEX_W_TABLE (VEX_W_0F3A18_P_2) },
10123   },
10124
10125   /* VEX_LEN_0F3A19_P_2 */
10126   {
10127     { Bad_Opcode },
10128     { VEX_W_TABLE (VEX_W_0F3A19_P_2) },
10129   },
10130
10131   /* VEX_LEN_0F3A20_P_2 */
10132   {
10133     { VEX_W_TABLE (VEX_W_0F3A20_P_2) },
10134   },
10135
10136   /* VEX_LEN_0F3A21_P_2 */
10137   {
10138     { VEX_W_TABLE (VEX_W_0F3A21_P_2) },
10139   },
10140
10141   /* VEX_LEN_0F3A22_P_2 */
10142   {
10143     { "vpinsrK",        { XM, Vex128, Edq, Ib }, 0 },
10144   },
10145
10146   /* VEX_LEN_0F3A30_P_2 */
10147   {
10148     { VEX_W_TABLE (VEX_W_0F3A30_P_2_LEN_0) },
10149   },
10150
10151   /* VEX_LEN_0F3A31_P_2 */
10152   {
10153     { VEX_W_TABLE (VEX_W_0F3A31_P_2_LEN_0) },
10154   },
10155
10156   /* VEX_LEN_0F3A32_P_2 */
10157   {
10158     { VEX_W_TABLE (VEX_W_0F3A32_P_2_LEN_0) },
10159   },
10160
10161   /* VEX_LEN_0F3A33_P_2 */
10162   {
10163     { VEX_W_TABLE (VEX_W_0F3A33_P_2_LEN_0) },
10164   },
10165
10166   /* VEX_LEN_0F3A38_P_2 */
10167   {
10168     { Bad_Opcode },
10169     { VEX_W_TABLE (VEX_W_0F3A38_P_2) },
10170   },
10171
10172   /* VEX_LEN_0F3A39_P_2 */
10173   {
10174     { Bad_Opcode },
10175     { VEX_W_TABLE (VEX_W_0F3A39_P_2) },
10176   },
10177
10178   /* VEX_LEN_0F3A41_P_2 */
10179   {
10180     { VEX_W_TABLE (VEX_W_0F3A41_P_2) },
10181   },
10182
10183   /* VEX_LEN_0F3A44_P_2 */
10184   {
10185     { VEX_W_TABLE (VEX_W_0F3A44_P_2) },
10186   },
10187
10188   /* VEX_LEN_0F3A46_P_2 */
10189   {
10190     { Bad_Opcode },
10191     { VEX_W_TABLE (VEX_W_0F3A46_P_2) },
10192   },
10193
10194   /* VEX_LEN_0F3A60_P_2 */
10195   {
10196     { VEX_W_TABLE (VEX_W_0F3A60_P_2) },
10197   },
10198
10199   /* VEX_LEN_0F3A61_P_2 */
10200   {
10201     { VEX_W_TABLE (VEX_W_0F3A61_P_2) },
10202   },
10203
10204   /* VEX_LEN_0F3A62_P_2 */
10205   {
10206     { VEX_W_TABLE (VEX_W_0F3A62_P_2) },
10207   },
10208
10209   /* VEX_LEN_0F3A63_P_2 */
10210   {
10211     { VEX_W_TABLE (VEX_W_0F3A63_P_2) },
10212   },
10213
10214   /* VEX_LEN_0F3A6A_P_2 */
10215   {
10216     { "vfmaddss",       { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 }, 0 },
10217   },
10218
10219   /* VEX_LEN_0F3A6B_P_2 */
10220   {
10221     { "vfmaddsd",       { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 }, 0 },
10222   },
10223
10224   /* VEX_LEN_0F3A6E_P_2 */
10225   {
10226     { "vfmsubss",       { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 }, 0 },
10227   },
10228
10229   /* VEX_LEN_0F3A6F_P_2 */
10230   {
10231     { "vfmsubsd",       { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 }, 0 },
10232   },
10233
10234   /* VEX_LEN_0F3A7A_P_2 */
10235   {
10236     { "vfnmaddss",      { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 }, 0 },
10237   },
10238
10239   /* VEX_LEN_0F3A7B_P_2 */
10240   {
10241     { "vfnmaddsd",      { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 }, 0 },
10242   },
10243
10244   /* VEX_LEN_0F3A7E_P_2 */
10245   {
10246     { "vfnmsubss",      { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 }, 0 },
10247   },
10248
10249   /* VEX_LEN_0F3A7F_P_2 */
10250   {
10251     { "vfnmsubsd",      { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 }, 0 },
10252   },
10253
10254   /* VEX_LEN_0F3ADF_P_2 */
10255   {
10256     { VEX_W_TABLE (VEX_W_0F3ADF_P_2) },
10257   },
10258
10259   /* VEX_LEN_0F3AF0_P_3 */
10260   {
10261     { "rorxS",          { Gdq, Edq, Ib }, 0 },
10262   },
10263
10264   /* VEX_LEN_0FXOP_08_CC */
10265   {
10266      { "vpcomb",        { XM, Vex128, EXx, Ib }, 0 },
10267   },
10268
10269   /* VEX_LEN_0FXOP_08_CD */
10270   {
10271      { "vpcomw",        { XM, Vex128, EXx, Ib }, 0 },
10272   },
10273
10274   /* VEX_LEN_0FXOP_08_CE */
10275   {
10276      { "vpcomd",        { XM, Vex128, EXx, Ib }, 0 },
10277   },
10278
10279   /* VEX_LEN_0FXOP_08_CF */
10280   {
10281      { "vpcomq",        { XM, Vex128, EXx, Ib }, 0 },
10282   },
10283
10284   /* VEX_LEN_0FXOP_08_EC */
10285   {
10286      { "vpcomub",       { XM, Vex128, EXx, Ib }, 0 },
10287   },
10288
10289   /* VEX_LEN_0FXOP_08_ED */
10290   {
10291      { "vpcomuw",       { XM, Vex128, EXx, Ib }, 0 },
10292   },
10293
10294   /* VEX_LEN_0FXOP_08_EE */
10295   {
10296      { "vpcomud",       { XM, Vex128, EXx, Ib }, 0 },
10297   },
10298
10299   /* VEX_LEN_0FXOP_08_EF */
10300   {
10301      { "vpcomuq",       { XM, Vex128, EXx, Ib }, 0 },
10302   },
10303
10304   /* VEX_LEN_0FXOP_09_80 */
10305   {
10306     { "vfrczps",        { XM, EXxmm }, 0 },
10307     { "vfrczps",        { XM, EXymmq }, 0 },
10308   },
10309
10310   /* VEX_LEN_0FXOP_09_81 */
10311   {
10312     { "vfrczpd",        { XM, EXxmm }, 0 },
10313     { "vfrczpd",        { XM, EXymmq }, 0 },
10314   },
10315 };
10316
10317 static const struct dis386 vex_w_table[][2] = {
10318   {
10319     /* VEX_W_0F10_P_0 */
10320     { "vmovups",        { XM, EXx }, 0 },
10321   },
10322   {
10323     /* VEX_W_0F10_P_1 */
10324     { "vmovss",         { XMVexScalar, VexScalar, EXdScalar }, 0 },
10325   },
10326   {
10327     /* VEX_W_0F10_P_2 */
10328     { "vmovupd",        { XM, EXx }, 0 },
10329   },
10330   {
10331     /* VEX_W_0F10_P_3 */
10332     { "vmovsd",         { XMVexScalar, VexScalar, EXqScalar }, 0 },
10333   },
10334   {
10335     /* VEX_W_0F11_P_0 */
10336     { "vmovups",        { EXxS, XM }, 0 },
10337   },
10338   {
10339     /* VEX_W_0F11_P_1 */
10340     { "vmovss",         { EXdVexScalarS, VexScalar, XMScalar }, 0 },
10341   },
10342   {
10343     /* VEX_W_0F11_P_2 */
10344     { "vmovupd",        { EXxS, XM }, 0 },
10345   },
10346   {
10347     /* VEX_W_0F11_P_3 */
10348     { "vmovsd",         { EXqVexScalarS, VexScalar, XMScalar }, 0 },
10349   },
10350   {
10351     /* VEX_W_0F12_P_0_M_0 */
10352     { "vmovlps",        { XM, Vex128, EXq }, 0 },
10353   },
10354   {
10355     /* VEX_W_0F12_P_0_M_1 */
10356     { "vmovhlps",       { XM, Vex128, EXq }, 0 },
10357   },
10358   {
10359     /* VEX_W_0F12_P_1 */
10360     { "vmovsldup",      { XM, EXx }, 0 },
10361   },
10362   {
10363     /* VEX_W_0F12_P_2 */
10364     { "vmovlpd",        { XM, Vex128, EXq }, 0 },
10365   },
10366   {
10367     /* VEX_W_0F12_P_3 */
10368     { "vmovddup",       { XM, EXymmq }, 0 },
10369   },
10370   {
10371     /* VEX_W_0F13_M_0 */
10372     { "vmovlpX",        { EXq, XM }, 0 },
10373   },
10374   {
10375     /* VEX_W_0F14 */
10376     { "vunpcklpX",      { XM, Vex, EXx }, 0 },
10377   },
10378   {
10379     /* VEX_W_0F15 */
10380     { "vunpckhpX",      { XM, Vex, EXx }, 0 },
10381   },
10382   {
10383     /* VEX_W_0F16_P_0_M_0 */
10384     { "vmovhps",        { XM, Vex128, EXq }, 0 },
10385   },
10386   {
10387     /* VEX_W_0F16_P_0_M_1 */
10388     { "vmovlhps",       { XM, Vex128, EXq }, 0 },
10389   },
10390   {
10391     /* VEX_W_0F16_P_1 */
10392     { "vmovshdup",      { XM, EXx }, 0 },
10393   },
10394   {
10395     /* VEX_W_0F16_P_2 */
10396     { "vmovhpd",        { XM, Vex128, EXq }, 0 },
10397   },
10398   {
10399     /* VEX_W_0F17_M_0 */
10400     { "vmovhpX",        { EXq, XM }, 0 },
10401   },
10402   {
10403     /* VEX_W_0F28 */
10404     { "vmovapX",        { XM, EXx }, 0 },
10405   },
10406   {
10407     /* VEX_W_0F29 */
10408     { "vmovapX",        { EXxS, XM }, 0 },
10409   },
10410   {
10411     /* VEX_W_0F2B_M_0 */
10412     { "vmovntpX",       { Mx, XM }, 0 },
10413   },
10414   {
10415     /* VEX_W_0F2E_P_0 */
10416     { "vucomiss",       { XMScalar, EXdScalar }, 0 },
10417   },
10418   {
10419     /* VEX_W_0F2E_P_2 */
10420     { "vucomisd",       { XMScalar, EXqScalar }, 0 },
10421   },
10422   {
10423     /* VEX_W_0F2F_P_0 */
10424     { "vcomiss",        { XMScalar, EXdScalar }, 0 },
10425   },
10426   {
10427     /* VEX_W_0F2F_P_2 */
10428     { "vcomisd",        { XMScalar, EXqScalar }, 0 },
10429   },
10430   {
10431     /* VEX_W_0F41_P_0_LEN_1 */
10432     { "kandw",          { MaskG, MaskVex, MaskR }, 0 },
10433     { "kandq",          { MaskG, MaskVex, MaskR }, 0 },
10434   },
10435   {
10436     /* VEX_W_0F41_P_2_LEN_1 */
10437     { "kandb",          { MaskG, MaskVex, MaskR }, 0 },
10438     { "kandd",          { MaskG, MaskVex, MaskR }, 0 },
10439   },
10440   {
10441     /* VEX_W_0F42_P_0_LEN_1 */
10442     { "kandnw",         { MaskG, MaskVex, MaskR }, 0 },
10443     { "kandnq",         { MaskG, MaskVex, MaskR }, 0 },
10444   },
10445   {
10446     /* VEX_W_0F42_P_2_LEN_1 */
10447     { "kandnb",         { MaskG, MaskVex, MaskR }, 0 },
10448     { "kandnd",         { MaskG, MaskVex, MaskR }, 0 },
10449   },
10450   {
10451     /* VEX_W_0F44_P_0_LEN_0 */
10452     { "knotw",          { MaskG, MaskR }, 0 },
10453     { "knotq",          { MaskG, MaskR }, 0 },
10454   },
10455   {
10456     /* VEX_W_0F44_P_2_LEN_0 */
10457     { "knotb",          { MaskG, MaskR }, 0 },
10458     { "knotd",          { MaskG, MaskR }, 0 },
10459   },
10460   {
10461     /* VEX_W_0F45_P_0_LEN_1 */
10462     { "korw",           { MaskG, MaskVex, MaskR }, 0 },
10463     { "korq",           { MaskG, MaskVex, MaskR }, 0 },
10464   },
10465   {
10466     /* VEX_W_0F45_P_2_LEN_1 */
10467     { "korb",           { MaskG, MaskVex, MaskR }, 0 },
10468     { "kord",           { MaskG, MaskVex, MaskR }, 0 },
10469   },
10470   {
10471     /* VEX_W_0F46_P_0_LEN_1 */
10472     { "kxnorw",         { MaskG, MaskVex, MaskR }, 0 },
10473     { "kxnorq",         { MaskG, MaskVex, MaskR }, 0 },
10474   },
10475   {
10476     /* VEX_W_0F46_P_2_LEN_1 */
10477     { "kxnorb",         { MaskG, MaskVex, MaskR }, 0 },
10478     { "kxnord",         { MaskG, MaskVex, MaskR }, 0 },
10479   },
10480   {
10481     /* VEX_W_0F47_P_0_LEN_1 */
10482     { "kxorw",          { MaskG, MaskVex, MaskR }, 0 },
10483     { "kxorq",          { MaskG, MaskVex, MaskR }, 0 },
10484   },
10485   {
10486     /* VEX_W_0F47_P_2_LEN_1 */
10487     { "kxorb",          { MaskG, MaskVex, MaskR }, 0 },
10488     { "kxord",          { MaskG, MaskVex, MaskR }, 0 },
10489   },
10490   {
10491     /* VEX_W_0F4A_P_0_LEN_1 */
10492     { "kaddw",          { MaskG, MaskVex, MaskR }, 0 },
10493     { "kaddq",          { MaskG, MaskVex, MaskR }, 0 },
10494   },
10495   {
10496     /* VEX_W_0F4A_P_2_LEN_1 */
10497     { "kaddb",          { MaskG, MaskVex, MaskR }, 0 },
10498     { "kaddd",          { MaskG, MaskVex, MaskR }, 0 },
10499   },
10500   {
10501     /* VEX_W_0F4B_P_0_LEN_1 */
10502     { "kunpckwd",       { MaskG, MaskVex, MaskR }, 0 },
10503     { "kunpckdq",       { MaskG, MaskVex, MaskR }, 0 },
10504   },
10505   {
10506     /* VEX_W_0F4B_P_2_LEN_1 */
10507     { "kunpckbw",       { MaskG, MaskVex, MaskR }, 0 },
10508   },
10509   {
10510     /* VEX_W_0F50_M_0 */
10511     { "vmovmskpX",      { Gdq, XS }, 0 },
10512   },
10513   {
10514     /* VEX_W_0F51_P_0 */
10515     { "vsqrtps",        { XM, EXx }, 0 },
10516   },
10517   {
10518     /* VEX_W_0F51_P_1 */
10519     { "vsqrtss",        { XMScalar, VexScalar, EXdScalar }, 0 },
10520   },
10521   {
10522     /* VEX_W_0F51_P_2  */
10523     { "vsqrtpd",        { XM, EXx }, 0 },
10524   },
10525   {
10526     /* VEX_W_0F51_P_3 */
10527     { "vsqrtsd",        { XMScalar, VexScalar, EXqScalar }, 0 },
10528   },
10529   {
10530     /* VEX_W_0F52_P_0 */
10531     { "vrsqrtps",       { XM, EXx }, 0 },
10532   },
10533   {
10534     /* VEX_W_0F52_P_1 */
10535     { "vrsqrtss",       { XMScalar, VexScalar, EXdScalar }, 0 },
10536   },
10537   {
10538     /* VEX_W_0F53_P_0  */
10539     { "vrcpps",         { XM, EXx }, 0 },
10540   },
10541   {
10542     /* VEX_W_0F53_P_1  */
10543     { "vrcpss",         { XMScalar, VexScalar, EXdScalar }, 0 },
10544   },
10545   {
10546     /* VEX_W_0F58_P_0  */
10547     { "vaddps",         { XM, Vex, EXx }, 0 },
10548   },
10549   {
10550     /* VEX_W_0F58_P_1  */
10551     { "vaddss",         { XMScalar, VexScalar, EXdScalar }, 0 },
10552   },
10553   {
10554     /* VEX_W_0F58_P_2  */
10555     { "vaddpd",         { XM, Vex, EXx }, 0 },
10556   },
10557   {
10558     /* VEX_W_0F58_P_3  */
10559     { "vaddsd",         { XMScalar, VexScalar, EXqScalar }, 0 },
10560   },
10561   {
10562     /* VEX_W_0F59_P_0  */
10563     { "vmulps",         { XM, Vex, EXx }, 0 },
10564   },
10565   {
10566     /* VEX_W_0F59_P_1  */
10567     { "vmulss",         { XMScalar, VexScalar, EXdScalar }, 0 },
10568   },
10569   {
10570     /* VEX_W_0F59_P_2  */
10571     { "vmulpd",         { XM, Vex, EXx }, 0 },
10572   },
10573   {
10574     /* VEX_W_0F59_P_3  */
10575     { "vmulsd",         { XMScalar, VexScalar, EXqScalar }, 0 },
10576   },
10577   {
10578     /* VEX_W_0F5A_P_0  */
10579     { "vcvtps2pd",      { XM, EXxmmq }, 0 },
10580   },
10581   {
10582     /* VEX_W_0F5A_P_1  */
10583     { "vcvtss2sd",      { XMScalar, VexScalar, EXdScalar }, 0 },
10584   },
10585   {
10586     /* VEX_W_0F5A_P_3  */
10587     { "vcvtsd2ss",      { XMScalar, VexScalar, EXqScalar }, 0 },
10588   },
10589   {
10590     /* VEX_W_0F5B_P_0  */
10591     { "vcvtdq2ps",      { XM, EXx }, 0 },
10592   },
10593   {
10594     /* VEX_W_0F5B_P_1  */
10595     { "vcvttps2dq",     { XM, EXx }, 0 },
10596   },
10597   {
10598     /* VEX_W_0F5B_P_2  */
10599     { "vcvtps2dq",      { XM, EXx }, 0 },
10600   },
10601   {
10602     /* VEX_W_0F5C_P_0  */
10603     { "vsubps",         { XM, Vex, EXx }, 0 },
10604   },
10605   {
10606     /* VEX_W_0F5C_P_1  */
10607     { "vsubss",         { XMScalar, VexScalar, EXdScalar }, 0 },
10608   },
10609   {
10610     /* VEX_W_0F5C_P_2  */
10611     { "vsubpd",         { XM, Vex, EXx }, 0 },
10612   },
10613   {
10614     /* VEX_W_0F5C_P_3  */
10615     { "vsubsd",         { XMScalar, VexScalar, EXqScalar }, 0 },
10616   },
10617   {
10618     /* VEX_W_0F5D_P_0  */
10619     { "vminps",         { XM, Vex, EXx }, 0 },
10620   },
10621   {
10622     /* VEX_W_0F5D_P_1  */
10623     { "vminss",         { XMScalar, VexScalar, EXdScalar }, 0 },
10624   },
10625   {
10626     /* VEX_W_0F5D_P_2  */
10627     { "vminpd",         { XM, Vex, EXx }, 0 },
10628   },
10629   {
10630     /* VEX_W_0F5D_P_3  */
10631     { "vminsd",         { XMScalar, VexScalar, EXqScalar }, 0 },
10632   },
10633   {
10634     /* VEX_W_0F5E_P_0  */
10635     { "vdivps",         { XM, Vex, EXx }, 0 },
10636   },
10637   {
10638     /* VEX_W_0F5E_P_1  */
10639     { "vdivss",         { XMScalar, VexScalar, EXdScalar }, 0 },
10640   },
10641   {
10642     /* VEX_W_0F5E_P_2  */
10643     { "vdivpd",         { XM, Vex, EXx }, 0 },
10644   },
10645   {
10646     /* VEX_W_0F5E_P_3  */
10647     { "vdivsd",         { XMScalar, VexScalar, EXqScalar }, 0 },
10648   },
10649   {
10650     /* VEX_W_0F5F_P_0  */
10651     { "vmaxps",         { XM, Vex, EXx }, 0 },
10652   },
10653   {
10654     /* VEX_W_0F5F_P_1  */
10655     { "vmaxss",         { XMScalar, VexScalar, EXdScalar }, 0 },
10656   },
10657   {
10658     /* VEX_W_0F5F_P_2  */
10659     { "vmaxpd",         { XM, Vex, EXx }, 0 },
10660   },
10661   {
10662     /* VEX_W_0F5F_P_3  */
10663     { "vmaxsd",         { XMScalar, VexScalar, EXqScalar }, 0 },
10664   },
10665   {
10666     /* VEX_W_0F60_P_2  */
10667     { "vpunpcklbw",     { XM, Vex, EXx }, 0 },
10668   },
10669   {
10670     /* VEX_W_0F61_P_2  */
10671     { "vpunpcklwd",     { XM, Vex, EXx }, 0 },
10672   },
10673   {
10674     /* VEX_W_0F62_P_2  */
10675     { "vpunpckldq",     { XM, Vex, EXx }, 0 },
10676   },
10677   {
10678     /* VEX_W_0F63_P_2  */
10679     { "vpacksswb",      { XM, Vex, EXx }, 0 },
10680   },
10681   {
10682     /* VEX_W_0F64_P_2  */
10683     { "vpcmpgtb",       { XM, Vex, EXx }, 0 },
10684   },
10685   {
10686     /* VEX_W_0F65_P_2  */
10687     { "vpcmpgtw",       { XM, Vex, EXx }, 0 },
10688   },
10689   {
10690     /* VEX_W_0F66_P_2  */
10691     { "vpcmpgtd",       { XM, Vex, EXx }, 0 },
10692   },
10693   {
10694     /* VEX_W_0F67_P_2  */
10695     { "vpackuswb",      { XM, Vex, EXx }, 0 },
10696   },
10697   {
10698     /* VEX_W_0F68_P_2  */
10699     { "vpunpckhbw",     { XM, Vex, EXx }, 0 },
10700   },
10701   {
10702     /* VEX_W_0F69_P_2  */
10703     { "vpunpckhwd",     { XM, Vex, EXx }, 0 },
10704   },
10705   {
10706     /* VEX_W_0F6A_P_2  */
10707     { "vpunpckhdq",     { XM, Vex, EXx }, 0 },
10708   },
10709   {
10710     /* VEX_W_0F6B_P_2  */
10711     { "vpackssdw",      { XM, Vex, EXx }, 0 },
10712   },
10713   {
10714     /* VEX_W_0F6C_P_2  */
10715     { "vpunpcklqdq",    { XM, Vex, EXx }, 0 },
10716   },
10717   {
10718     /* VEX_W_0F6D_P_2  */
10719     { "vpunpckhqdq",    { XM, Vex, EXx }, 0 },
10720   },
10721   {
10722     /* VEX_W_0F6F_P_1  */
10723     { "vmovdqu",        { XM, EXx }, 0 },
10724   },
10725   {
10726     /* VEX_W_0F6F_P_2  */
10727     { "vmovdqa",        { XM, EXx }, 0 },
10728   },
10729   {
10730     /* VEX_W_0F70_P_1 */
10731     { "vpshufhw",       { XM, EXx, Ib }, 0 },
10732   },
10733   {
10734     /* VEX_W_0F70_P_2 */
10735     { "vpshufd",        { XM, EXx, Ib }, 0 },
10736   },
10737   {
10738     /* VEX_W_0F70_P_3 */
10739     { "vpshuflw",       { XM, EXx, Ib }, 0 },
10740   },
10741   {
10742     /* VEX_W_0F71_R_2_P_2  */
10743     { "vpsrlw",         { Vex, XS, Ib }, 0 },
10744   },
10745   {
10746     /* VEX_W_0F71_R_4_P_2  */
10747     { "vpsraw",         { Vex, XS, Ib }, 0 },
10748   },
10749   {
10750     /* VEX_W_0F71_R_6_P_2  */
10751     { "vpsllw",         { Vex, XS, Ib }, 0 },
10752   },
10753   {
10754     /* VEX_W_0F72_R_2_P_2  */
10755     { "vpsrld",         { Vex, XS, Ib }, 0 },
10756   },
10757   {
10758     /* VEX_W_0F72_R_4_P_2  */
10759     { "vpsrad",         { Vex, XS, Ib }, 0 },
10760   },
10761   {
10762     /* VEX_W_0F72_R_6_P_2  */
10763     { "vpslld",         { Vex, XS, Ib }, 0 },
10764   },
10765   {
10766     /* VEX_W_0F73_R_2_P_2  */
10767     { "vpsrlq",         { Vex, XS, Ib }, 0 },
10768   },
10769   {
10770     /* VEX_W_0F73_R_3_P_2  */
10771     { "vpsrldq",        { Vex, XS, Ib }, 0 },
10772   },
10773   {
10774     /* VEX_W_0F73_R_6_P_2  */
10775     { "vpsllq",         { Vex, XS, Ib }, 0 },
10776   },
10777   {
10778     /* VEX_W_0F73_R_7_P_2  */
10779     { "vpslldq",        { Vex, XS, Ib }, 0 },
10780   },
10781   {
10782     /* VEX_W_0F74_P_2 */
10783     { "vpcmpeqb",       { XM, Vex, EXx }, 0 },
10784   },
10785   {
10786     /* VEX_W_0F75_P_2 */
10787     { "vpcmpeqw",       { XM, Vex, EXx }, 0 },
10788   },
10789   {
10790     /* VEX_W_0F76_P_2 */
10791     { "vpcmpeqd",       { XM, Vex, EXx }, 0 },
10792   },
10793   {
10794     /* VEX_W_0F77_P_0 */
10795     { "",               { VZERO }, 0 },
10796   },
10797   {
10798     /* VEX_W_0F7C_P_2 */
10799     { "vhaddpd",        { XM, Vex, EXx }, 0 },
10800   },
10801   {
10802     /* VEX_W_0F7C_P_3 */
10803     { "vhaddps",        { XM, Vex, EXx }, 0 },
10804   },
10805   {
10806     /* VEX_W_0F7D_P_2 */
10807     { "vhsubpd",        { XM, Vex, EXx }, 0 },
10808   },
10809   {
10810     /* VEX_W_0F7D_P_3 */
10811     { "vhsubps",        { XM, Vex, EXx }, 0 },
10812   },
10813   {
10814     /* VEX_W_0F7E_P_1 */
10815     { "vmovq",          { XMScalar, EXqScalar }, 0 },
10816   },
10817   {
10818     /* VEX_W_0F7F_P_1 */
10819     { "vmovdqu",        { EXxS, XM }, 0 },
10820   },
10821   {
10822     /* VEX_W_0F7F_P_2 */
10823     { "vmovdqa",        { EXxS, XM }, 0 },
10824   },
10825   {
10826     /* VEX_W_0F90_P_0_LEN_0 */
10827     { "kmovw",          { MaskG, MaskE }, 0 },
10828     { "kmovq",          { MaskG, MaskE }, 0 },
10829   },
10830   {
10831     /* VEX_W_0F90_P_2_LEN_0 */
10832     { "kmovb",          { MaskG, MaskBDE }, 0 },
10833     { "kmovd",          { MaskG, MaskBDE }, 0 },
10834   },
10835   {
10836     /* VEX_W_0F91_P_0_LEN_0 */
10837     { "kmovw",          { Ew, MaskG }, 0 },
10838     { "kmovq",          { Eq, MaskG }, 0 },
10839   },
10840   {
10841     /* VEX_W_0F91_P_2_LEN_0 */
10842     { "kmovb",          { Eb, MaskG }, 0 },
10843     { "kmovd",          { Ed, MaskG }, 0 },
10844   },
10845   {
10846     /* VEX_W_0F92_P_0_LEN_0 */
10847     { "kmovw",          { MaskG, Rdq }, 0 },
10848   },
10849   {
10850     /* VEX_W_0F92_P_2_LEN_0 */
10851     { "kmovb",          { MaskG, Rdq }, 0 },
10852   },
10853   {
10854     /* VEX_W_0F92_P_3_LEN_0 */
10855     { "kmovd",          { MaskG, Rdq }, 0 },
10856     { "kmovq",          { MaskG, Rdq }, 0 },
10857   },
10858   {
10859     /* VEX_W_0F93_P_0_LEN_0 */
10860     { "kmovw",          { Gdq, MaskR }, 0 },
10861   },
10862   {
10863     /* VEX_W_0F93_P_2_LEN_0 */
10864     { "kmovb",          { Gdq, MaskR }, 0 },
10865   },
10866   {
10867     /* VEX_W_0F93_P_3_LEN_0 */
10868     { "kmovd",          { Gdq, MaskR }, 0 },
10869     { "kmovq",          { Gdq, MaskR }, 0 },
10870   },
10871   {
10872     /* VEX_W_0F98_P_0_LEN_0 */
10873     { "kortestw",       { MaskG, MaskR }, 0 },
10874     { "kortestq",       { MaskG, MaskR }, 0 },
10875   },
10876   {
10877     /* VEX_W_0F98_P_2_LEN_0 */
10878     { "kortestb",       { MaskG, MaskR }, 0 },
10879     { "kortestd",       { MaskG, MaskR }, 0 },
10880   },
10881   {
10882     /* VEX_W_0F99_P_0_LEN_0 */
10883     { "ktestw", { MaskG, MaskR }, 0 },
10884     { "ktestq", { MaskG, MaskR }, 0 },
10885   },
10886   {
10887     /* VEX_W_0F99_P_2_LEN_0 */
10888     { "ktestb", { MaskG, MaskR }, 0 },
10889     { "ktestd", { MaskG, MaskR }, 0 },
10890   },
10891   {
10892     /* VEX_W_0FAE_R_2_M_0 */
10893     { "vldmxcsr",       { Md }, 0 },
10894   },
10895   {
10896     /* VEX_W_0FAE_R_3_M_0 */
10897     { "vstmxcsr",       { Md }, 0 },
10898   },
10899   {
10900     /* VEX_W_0FC2_P_0 */
10901     { "vcmpps",         { XM, Vex, EXx, VCMP }, 0 },
10902   },
10903   {
10904     /* VEX_W_0FC2_P_1 */
10905     { "vcmpss",         { XMScalar, VexScalar, EXdScalar, VCMP }, 0 },
10906   },
10907   {
10908     /* VEX_W_0FC2_P_2 */
10909     { "vcmppd",         { XM, Vex, EXx, VCMP }, 0 },
10910   },
10911   {
10912     /* VEX_W_0FC2_P_3 */
10913     { "vcmpsd",         { XMScalar, VexScalar, EXqScalar, VCMP }, 0 },
10914   },
10915   {
10916     /* VEX_W_0FC4_P_2 */
10917     { "vpinsrw",        { XM, Vex128, Edqw, Ib }, 0 },
10918   },
10919   {
10920     /* VEX_W_0FC5_P_2 */
10921     { "vpextrw",        { Gdq, XS, Ib }, 0 },
10922   },
10923   {
10924     /* VEX_W_0FD0_P_2 */
10925     { "vaddsubpd",      { XM, Vex, EXx }, 0 },
10926   },
10927   {
10928     /* VEX_W_0FD0_P_3 */
10929     { "vaddsubps",      { XM, Vex, EXx }, 0 },
10930   },
10931   {
10932     /* VEX_W_0FD1_P_2 */
10933     { "vpsrlw",         { XM, Vex, EXxmm }, 0 },
10934   },
10935   {
10936     /* VEX_W_0FD2_P_2 */
10937     { "vpsrld",         { XM, Vex, EXxmm }, 0 },
10938   },
10939   {
10940     /* VEX_W_0FD3_P_2 */
10941     { "vpsrlq",         { XM, Vex, EXxmm }, 0 },
10942   },
10943   {
10944     /* VEX_W_0FD4_P_2 */
10945     { "vpaddq",         { XM, Vex, EXx }, 0 },
10946   },
10947   {
10948     /* VEX_W_0FD5_P_2 */
10949     { "vpmullw",        { XM, Vex, EXx }, 0 },
10950   },
10951   {
10952     /* VEX_W_0FD6_P_2 */
10953     { "vmovq",          { EXqScalarS, XMScalar }, 0 },
10954   },
10955   {
10956     /* VEX_W_0FD7_P_2_M_1 */
10957     { "vpmovmskb",      { Gdq, XS }, 0 },
10958   },
10959   {
10960     /* VEX_W_0FD8_P_2 */
10961     { "vpsubusb",       { XM, Vex, EXx }, 0 },
10962   },
10963   {
10964     /* VEX_W_0FD9_P_2 */
10965     { "vpsubusw",       { XM, Vex, EXx }, 0 },
10966   },
10967   {
10968     /* VEX_W_0FDA_P_2 */
10969     { "vpminub",        { XM, Vex, EXx }, 0 },
10970   },
10971   {
10972     /* VEX_W_0FDB_P_2 */
10973     { "vpand",          { XM, Vex, EXx }, 0 },
10974   },
10975   {
10976     /* VEX_W_0FDC_P_2 */
10977     { "vpaddusb",       { XM, Vex, EXx }, 0 },
10978   },
10979   {
10980     /* VEX_W_0FDD_P_2 */
10981     { "vpaddusw",       { XM, Vex, EXx }, 0 },
10982   },
10983   {
10984     /* VEX_W_0FDE_P_2 */
10985     { "vpmaxub",        { XM, Vex, EXx }, 0 },
10986   },
10987   {
10988     /* VEX_W_0FDF_P_2 */
10989     { "vpandn",         { XM, Vex, EXx }, 0 },
10990   },
10991   {
10992     /* VEX_W_0FE0_P_2  */
10993     { "vpavgb",         { XM, Vex, EXx }, 0 },
10994   },
10995   {
10996     /* VEX_W_0FE1_P_2  */
10997     { "vpsraw",         { XM, Vex, EXxmm }, 0 },
10998   },
10999   {
11000     /* VEX_W_0FE2_P_2  */
11001     { "vpsrad",         { XM, Vex, EXxmm }, 0 },
11002   },
11003   {
11004     /* VEX_W_0FE3_P_2  */
11005     { "vpavgw",         { XM, Vex, EXx }, 0 },
11006   },
11007   {
11008     /* VEX_W_0FE4_P_2  */
11009     { "vpmulhuw",       { XM, Vex, EXx }, 0 },
11010   },
11011   {
11012     /* VEX_W_0FE5_P_2  */
11013     { "vpmulhw",        { XM, Vex, EXx }, 0 },
11014   },
11015   {
11016     /* VEX_W_0FE6_P_1  */
11017     { "vcvtdq2pd",      { XM, EXxmmq }, 0 },
11018   },
11019   {
11020     /* VEX_W_0FE6_P_2  */
11021     { "vcvttpd2dq%XY",  { XMM, EXx }, 0 },
11022   },
11023   {
11024     /* VEX_W_0FE6_P_3  */
11025     { "vcvtpd2dq%XY",   { XMM, EXx }, 0 },
11026   },
11027   {
11028     /* VEX_W_0FE7_P_2_M_0 */
11029     { "vmovntdq",       { Mx, XM }, 0 },
11030   },
11031   {
11032     /* VEX_W_0FE8_P_2  */
11033     { "vpsubsb",        { XM, Vex, EXx }, 0 },
11034   },
11035   {
11036     /* VEX_W_0FE9_P_2  */
11037     { "vpsubsw",        { XM, Vex, EXx }, 0 },
11038   },
11039   {
11040     /* VEX_W_0FEA_P_2  */
11041     { "vpminsw",        { XM, Vex, EXx }, 0 },
11042   },
11043   {
11044     /* VEX_W_0FEB_P_2  */
11045     { "vpor",           { XM, Vex, EXx }, 0 },
11046   },
11047   {
11048     /* VEX_W_0FEC_P_2  */
11049     { "vpaddsb",        { XM, Vex, EXx }, 0 },
11050   },
11051   {
11052     /* VEX_W_0FED_P_2  */
11053     { "vpaddsw",        { XM, Vex, EXx }, 0 },
11054   },
11055   {
11056     /* VEX_W_0FEE_P_2  */
11057     { "vpmaxsw",        { XM, Vex, EXx }, 0 },
11058   },
11059   {
11060     /* VEX_W_0FEF_P_2  */
11061     { "vpxor",          { XM, Vex, EXx }, 0 },
11062   },
11063   {
11064     /* VEX_W_0FF0_P_3_M_0 */
11065     { "vlddqu",         { XM, M }, 0 },
11066   },
11067   {
11068     /* VEX_W_0FF1_P_2 */
11069     { "vpsllw",         { XM, Vex, EXxmm }, 0 },
11070   },
11071   {
11072     /* VEX_W_0FF2_P_2 */
11073     { "vpslld",         { XM, Vex, EXxmm }, 0 },
11074   },
11075   {
11076     /* VEX_W_0FF3_P_2 */
11077     { "vpsllq",         { XM, Vex, EXxmm }, 0 },
11078   },
11079   {
11080     /* VEX_W_0FF4_P_2 */
11081     { "vpmuludq",       { XM, Vex, EXx }, 0 },
11082   },
11083   {
11084     /* VEX_W_0FF5_P_2 */
11085     { "vpmaddwd",       { XM, Vex, EXx }, 0 },
11086   },
11087   {
11088     /* VEX_W_0FF6_P_2 */
11089     { "vpsadbw",        { XM, Vex, EXx }, 0 },
11090   },
11091   {
11092     /* VEX_W_0FF7_P_2 */
11093     { "vmaskmovdqu",    { XM, XS }, 0 },
11094   },
11095   {
11096     /* VEX_W_0FF8_P_2 */
11097     { "vpsubb",         { XM, Vex, EXx }, 0 },
11098   },
11099   {
11100     /* VEX_W_0FF9_P_2 */
11101     { "vpsubw",         { XM, Vex, EXx }, 0 },
11102   },
11103   {
11104     /* VEX_W_0FFA_P_2 */
11105     { "vpsubd",         { XM, Vex, EXx }, 0 },
11106   },
11107   {
11108     /* VEX_W_0FFB_P_2 */
11109     { "vpsubq",         { XM, Vex, EXx }, 0 },
11110   },
11111   {
11112     /* VEX_W_0FFC_P_2 */
11113     { "vpaddb",         { XM, Vex, EXx }, 0 },
11114   },
11115   {
11116     /* VEX_W_0FFD_P_2 */
11117     { "vpaddw",         { XM, Vex, EXx }, 0 },
11118   },
11119   {
11120     /* VEX_W_0FFE_P_2 */
11121     { "vpaddd",         { XM, Vex, EXx }, 0 },
11122   },
11123   {
11124     /* VEX_W_0F3800_P_2  */
11125     { "vpshufb",        { XM, Vex, EXx }, 0 },
11126   },
11127   {
11128     /* VEX_W_0F3801_P_2  */
11129     { "vphaddw",        { XM, Vex, EXx }, 0 },
11130   },
11131   {
11132     /* VEX_W_0F3802_P_2  */
11133     { "vphaddd",        { XM, Vex, EXx }, 0 },
11134   },
11135   {
11136     /* VEX_W_0F3803_P_2  */
11137     { "vphaddsw",       { XM, Vex, EXx }, 0 },
11138   },
11139   {
11140     /* VEX_W_0F3804_P_2  */
11141     { "vpmaddubsw",     { XM, Vex, EXx }, 0 },
11142   },
11143   {
11144     /* VEX_W_0F3805_P_2  */
11145     { "vphsubw",        { XM, Vex, EXx }, 0 },
11146   },
11147   {
11148     /* VEX_W_0F3806_P_2  */
11149     { "vphsubd",        { XM, Vex, EXx }, 0 },
11150   },
11151   {
11152     /* VEX_W_0F3807_P_2  */
11153     { "vphsubsw",       { XM, Vex, EXx }, 0 },
11154   },
11155   {
11156     /* VEX_W_0F3808_P_2  */
11157     { "vpsignb",        { XM, Vex, EXx }, 0 },
11158   },
11159   {
11160     /* VEX_W_0F3809_P_2  */
11161     { "vpsignw",        { XM, Vex, EXx }, 0 },
11162   },
11163   {
11164     /* VEX_W_0F380A_P_2  */
11165     { "vpsignd",        { XM, Vex, EXx }, 0 },
11166   },
11167   {
11168     /* VEX_W_0F380B_P_2  */
11169     { "vpmulhrsw",      { XM, Vex, EXx }, 0 },
11170   },
11171   {
11172     /* VEX_W_0F380C_P_2  */
11173     { "vpermilps",      { XM, Vex, EXx }, 0 },
11174   },
11175   {
11176     /* VEX_W_0F380D_P_2  */
11177     { "vpermilpd",      { XM, Vex, EXx }, 0 },
11178   },
11179   {
11180     /* VEX_W_0F380E_P_2  */
11181     { "vtestps",        { XM, EXx }, 0 },
11182   },
11183   {
11184     /* VEX_W_0F380F_P_2  */
11185     { "vtestpd",        { XM, EXx }, 0 },
11186   },
11187   {
11188     /* VEX_W_0F3816_P_2  */
11189     { "vpermps",        { XM, Vex, EXx }, 0 },
11190   },
11191   {
11192     /* VEX_W_0F3817_P_2 */
11193     { "vptest",         { XM, EXx }, 0 },
11194   },
11195   {
11196     /* VEX_W_0F3818_P_2 */
11197     { "vbroadcastss",   { XM, EXxmm_md }, 0 },
11198   },
11199   {
11200     /* VEX_W_0F3819_P_2 */
11201     { "vbroadcastsd",   { XM, EXxmm_mq }, 0 },
11202   },
11203   {
11204     /* VEX_W_0F381A_P_2_M_0 */
11205     { "vbroadcastf128", { XM, Mxmm }, 0 },
11206   },
11207   {
11208     /* VEX_W_0F381C_P_2 */
11209     { "vpabsb",         { XM, EXx }, 0 },
11210   },
11211   {
11212     /* VEX_W_0F381D_P_2 */
11213     { "vpabsw",         { XM, EXx }, 0 },
11214   },
11215   {
11216     /* VEX_W_0F381E_P_2 */
11217     { "vpabsd",         { XM, EXx }, 0 },
11218   },
11219   {
11220     /* VEX_W_0F3820_P_2 */
11221     { "vpmovsxbw",      { XM, EXxmmq }, 0 },
11222   },
11223   {
11224     /* VEX_W_0F3821_P_2 */
11225     { "vpmovsxbd",      { XM, EXxmmqd }, 0 },
11226   },
11227   {
11228     /* VEX_W_0F3822_P_2 */
11229     { "vpmovsxbq",      { XM, EXxmmdw }, 0 },
11230   },
11231   {
11232     /* VEX_W_0F3823_P_2 */
11233     { "vpmovsxwd",      { XM, EXxmmq }, 0 },
11234   },
11235   {
11236     /* VEX_W_0F3824_P_2 */
11237     { "vpmovsxwq",      { XM, EXxmmqd }, 0 },
11238   },
11239   {
11240     /* VEX_W_0F3825_P_2 */
11241     { "vpmovsxdq",      { XM, EXxmmq }, 0 },
11242   },
11243   {
11244     /* VEX_W_0F3828_P_2 */
11245     { "vpmuldq",        { XM, Vex, EXx }, 0 },
11246   },
11247   {
11248     /* VEX_W_0F3829_P_2 */
11249     { "vpcmpeqq",       { XM, Vex, EXx }, 0 },
11250   },
11251   {
11252     /* VEX_W_0F382A_P_2_M_0 */
11253     { "vmovntdqa",      { XM, Mx }, 0 },
11254   },
11255   {
11256     /* VEX_W_0F382B_P_2 */
11257     { "vpackusdw",      { XM, Vex, EXx }, 0 },
11258   },
11259   {
11260     /* VEX_W_0F382C_P_2_M_0 */
11261     { "vmaskmovps",     { XM, Vex, Mx }, 0 },
11262   },
11263   {
11264     /* VEX_W_0F382D_P_2_M_0 */
11265     { "vmaskmovpd",     { XM, Vex, Mx }, 0 },
11266   },
11267   {
11268     /* VEX_W_0F382E_P_2_M_0 */
11269     { "vmaskmovps",     { Mx, Vex, XM }, 0 },
11270   },
11271   {
11272     /* VEX_W_0F382F_P_2_M_0 */
11273     { "vmaskmovpd",     { Mx, Vex, XM }, 0 },
11274   },
11275   {
11276     /* VEX_W_0F3830_P_2 */
11277     { "vpmovzxbw",      { XM, EXxmmq }, 0 },
11278   },
11279   {
11280     /* VEX_W_0F3831_P_2 */
11281     { "vpmovzxbd",      { XM, EXxmmqd }, 0 },
11282   },
11283   {
11284     /* VEX_W_0F3832_P_2 */
11285     { "vpmovzxbq",      { XM, EXxmmdw }, 0 },
11286   },
11287   {
11288     /* VEX_W_0F3833_P_2 */
11289     { "vpmovzxwd",      { XM, EXxmmq }, 0 },
11290   },
11291   {
11292     /* VEX_W_0F3834_P_2 */
11293     { "vpmovzxwq",      { XM, EXxmmqd }, 0 },
11294   },
11295   {
11296     /* VEX_W_0F3835_P_2 */
11297     { "vpmovzxdq",      { XM, EXxmmq }, 0 },
11298   },
11299   {
11300     /* VEX_W_0F3836_P_2  */
11301     { "vpermd",         { XM, Vex, EXx }, 0 },
11302   },
11303   {
11304     /* VEX_W_0F3837_P_2 */
11305     { "vpcmpgtq",       { XM, Vex, EXx }, 0 },
11306   },
11307   {
11308     /* VEX_W_0F3838_P_2 */
11309     { "vpminsb",        { XM, Vex, EXx }, 0 },
11310   },
11311   {
11312     /* VEX_W_0F3839_P_2 */
11313     { "vpminsd",        { XM, Vex, EXx }, 0 },
11314   },
11315   {
11316     /* VEX_W_0F383A_P_2 */
11317     { "vpminuw",        { XM, Vex, EXx }, 0 },
11318   },
11319   {
11320     /* VEX_W_0F383B_P_2 */
11321     { "vpminud",        { XM, Vex, EXx }, 0 },
11322   },
11323   {
11324     /* VEX_W_0F383C_P_2 */
11325     { "vpmaxsb",        { XM, Vex, EXx }, 0 },
11326   },
11327   {
11328     /* VEX_W_0F383D_P_2 */
11329     { "vpmaxsd",        { XM, Vex, EXx }, 0 },
11330   },
11331   {
11332     /* VEX_W_0F383E_P_2 */
11333     { "vpmaxuw",        { XM, Vex, EXx }, 0 },
11334   },
11335   {
11336     /* VEX_W_0F383F_P_2 */
11337     { "vpmaxud",        { XM, Vex, EXx }, 0 },
11338   },
11339   {
11340     /* VEX_W_0F3840_P_2 */
11341     { "vpmulld",        { XM, Vex, EXx }, 0 },
11342   },
11343   {
11344     /* VEX_W_0F3841_P_2 */
11345     { "vphminposuw",    { XM, EXx }, 0 },
11346   },
11347   {
11348     /* VEX_W_0F3846_P_2 */
11349     { "vpsravd",        { XM, Vex, EXx }, 0 },
11350   },
11351   {
11352     /* VEX_W_0F3858_P_2 */
11353     { "vpbroadcastd", { XM, EXxmm_md }, 0 },
11354   },
11355   {
11356     /* VEX_W_0F3859_P_2 */
11357     { "vpbroadcastq",   { XM, EXxmm_mq }, 0 },
11358   },
11359   {
11360     /* VEX_W_0F385A_P_2_M_0 */
11361     { "vbroadcasti128", { XM, Mxmm }, 0 },
11362   },
11363   {
11364     /* VEX_W_0F3878_P_2 */
11365     { "vpbroadcastb",   { XM, EXxmm_mb }, 0 },
11366   },
11367   {
11368     /* VEX_W_0F3879_P_2 */
11369     { "vpbroadcastw",   { XM, EXxmm_mw }, 0 },
11370   },
11371   {
11372     /* VEX_W_0F38DB_P_2 */
11373     { "vaesimc",        { XM, EXx }, 0 },
11374   },
11375   {
11376     /* VEX_W_0F38DC_P_2 */
11377     { "vaesenc",        { XM, Vex128, EXx }, 0 },
11378   },
11379   {
11380     /* VEX_W_0F38DD_P_2 */
11381     { "vaesenclast",    { XM, Vex128, EXx }, 0 },
11382   },
11383   {
11384     /* VEX_W_0F38DE_P_2 */
11385     { "vaesdec",        { XM, Vex128, EXx }, 0 },
11386   },
11387   {
11388     /* VEX_W_0F38DF_P_2 */
11389     { "vaesdeclast",    { XM, Vex128, EXx }, 0 },
11390   },
11391   {
11392     /* VEX_W_0F3A00_P_2 */
11393     { Bad_Opcode },
11394     { "vpermq",         { XM, EXx, Ib }, 0 },
11395   },
11396   {
11397     /* VEX_W_0F3A01_P_2 */
11398     { Bad_Opcode },
11399     { "vpermpd",        { XM, EXx, Ib }, 0 },
11400   },
11401   {
11402     /* VEX_W_0F3A02_P_2 */
11403     { "vpblendd",       { XM, Vex, EXx, Ib }, 0 },
11404   },
11405   {
11406     /* VEX_W_0F3A04_P_2 */
11407     { "vpermilps",      { XM, EXx, Ib }, 0 },
11408   },
11409   {
11410     /* VEX_W_0F3A05_P_2 */
11411     { "vpermilpd",      { XM, EXx, Ib }, 0 },
11412   },
11413   {
11414     /* VEX_W_0F3A06_P_2 */
11415     { "vperm2f128",     { XM, Vex256, EXx, Ib }, 0 },
11416   },
11417   {
11418     /* VEX_W_0F3A08_P_2 */
11419     { "vroundps",       { XM, EXx, Ib }, 0 },
11420   },
11421   {
11422     /* VEX_W_0F3A09_P_2 */
11423     { "vroundpd",       { XM, EXx, Ib }, 0 },
11424   },
11425   {
11426     /* VEX_W_0F3A0A_P_2 */
11427     { "vroundss",       { XMScalar, VexScalar, EXdScalar, Ib }, 0 },
11428   },
11429   {
11430     /* VEX_W_0F3A0B_P_2 */
11431     { "vroundsd",       { XMScalar, VexScalar, EXqScalar, Ib }, 0 },
11432   },
11433   {
11434     /* VEX_W_0F3A0C_P_2 */
11435     { "vblendps",       { XM, Vex, EXx, Ib }, 0 },
11436   },
11437   {
11438     /* VEX_W_0F3A0D_P_2 */
11439     { "vblendpd",       { XM, Vex, EXx, Ib }, 0 },
11440   },
11441   {
11442     /* VEX_W_0F3A0E_P_2 */
11443     { "vpblendw",       { XM, Vex, EXx, Ib }, 0 },
11444   },
11445   {
11446     /* VEX_W_0F3A0F_P_2 */
11447     { "vpalignr",       { XM, Vex, EXx, Ib }, 0 },
11448   },
11449   {
11450     /* VEX_W_0F3A14_P_2 */
11451     { "vpextrb",        { Edqb, XM, Ib }, 0 },
11452   },
11453   {
11454     /* VEX_W_0F3A15_P_2 */
11455     { "vpextrw",        { Edqw, XM, Ib }, 0 },
11456   },
11457   {
11458     /* VEX_W_0F3A18_P_2 */
11459     { "vinsertf128",    { XM, Vex256, EXxmm, Ib }, 0 },
11460   },
11461   {
11462     /* VEX_W_0F3A19_P_2 */
11463     { "vextractf128",   { EXxmm, XM, Ib }, 0 },
11464   },
11465   {
11466     /* VEX_W_0F3A20_P_2 */
11467     { "vpinsrb",        { XM, Vex128, Edqb, Ib }, 0 },
11468   },
11469   {
11470     /* VEX_W_0F3A21_P_2 */
11471     { "vinsertps",      { XM, Vex128, EXd, Ib }, 0 },
11472   },
11473   {
11474     /* VEX_W_0F3A30_P_2_LEN_0 */
11475     { "kshiftrb",       { MaskG, MaskR, Ib }, 0 },
11476     { "kshiftrw",       { MaskG, MaskR, Ib }, 0 },
11477   },
11478   {
11479     /* VEX_W_0F3A31_P_2_LEN_0 */
11480     { "kshiftrd",       { MaskG, MaskR, Ib }, 0 },
11481     { "kshiftrq",       { MaskG, MaskR, Ib }, 0 },
11482   },
11483   {
11484     /* VEX_W_0F3A32_P_2_LEN_0 */
11485     { "kshiftlb",       { MaskG, MaskR, Ib }, 0 },
11486     { "kshiftlw",       { MaskG, MaskR, Ib }, 0 },
11487   },
11488   {
11489     /* VEX_W_0F3A33_P_2_LEN_0 */
11490     { "kshiftld",       { MaskG, MaskR, Ib }, 0 },
11491     { "kshiftlq",       { MaskG, MaskR, Ib }, 0 },
11492   },
11493   {
11494     /* VEX_W_0F3A38_P_2 */
11495     { "vinserti128",    { XM, Vex256, EXxmm, Ib }, 0 },
11496   },
11497   {
11498     /* VEX_W_0F3A39_P_2 */
11499     { "vextracti128",   { EXxmm, XM, Ib }, 0 },
11500   },
11501   {
11502     /* VEX_W_0F3A40_P_2 */
11503     { "vdpps",          { XM, Vex, EXx, Ib }, 0 },
11504   },
11505   {
11506     /* VEX_W_0F3A41_P_2 */
11507     { "vdppd",          { XM, Vex128, EXx, Ib }, 0 },
11508   },
11509   {
11510     /* VEX_W_0F3A42_P_2 */
11511     { "vmpsadbw",       { XM, Vex, EXx, Ib }, 0 },
11512   },
11513   {
11514     /* VEX_W_0F3A44_P_2 */
11515     { "vpclmulqdq",     { XM, Vex128, EXx, PCLMUL }, 0 },
11516   },
11517   {
11518     /* VEX_W_0F3A46_P_2 */
11519     { "vperm2i128",     { XM, Vex256, EXx, Ib }, 0 },
11520   },
11521   {
11522     /* VEX_W_0F3A48_P_2 */
11523     { "vpermil2ps",     { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW }, 0 },
11524     { "vpermil2ps",     { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW }, 0 },
11525   },
11526   {
11527     /* VEX_W_0F3A49_P_2 */
11528     { "vpermil2pd",     { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW }, 0 },
11529     { "vpermil2pd",     { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW }, 0 },
11530   },
11531   {
11532     /* VEX_W_0F3A4A_P_2 */
11533     { "vblendvps",      { XM, Vex, EXx, XMVexI4 }, 0 },
11534   },
11535   {
11536     /* VEX_W_0F3A4B_P_2 */
11537     { "vblendvpd",      { XM, Vex, EXx, XMVexI4 }, 0 },
11538   },
11539   {
11540     /* VEX_W_0F3A4C_P_2 */
11541     { "vpblendvb",      { XM, Vex, EXx, XMVexI4 }, 0 },
11542   },
11543   {
11544     /* VEX_W_0F3A60_P_2 */
11545     { "vpcmpestrm",     { XM, EXx, Ib }, 0 },
11546   },
11547   {
11548     /* VEX_W_0F3A61_P_2 */
11549     { "vpcmpestri",     { XM, EXx, Ib }, 0 },
11550   },
11551   {
11552     /* VEX_W_0F3A62_P_2 */
11553     { "vpcmpistrm",     { XM, EXx, Ib }, 0 },
11554   },
11555   {
11556     /* VEX_W_0F3A63_P_2 */
11557     { "vpcmpistri",     { XM, EXx, Ib }, 0 },
11558   },
11559   {
11560     /* VEX_W_0F3ADF_P_2 */
11561     { "vaeskeygenassist", { XM, EXx, Ib }, 0 },
11562   },
11563 #define NEED_VEX_W_TABLE
11564 #include "i386-dis-evex.h"
11565 #undef NEED_VEX_W_TABLE
11566 };
11567
11568 static const struct dis386 mod_table[][2] = {
11569   {
11570     /* MOD_8D */
11571     { "leaS",           { Gv, M }, 0 },
11572   },
11573   {
11574     /* MOD_C6_REG_7 */
11575     { Bad_Opcode },
11576     { RM_TABLE (RM_C6_REG_7) },
11577   },
11578   {
11579     /* MOD_C7_REG_7 */
11580     { Bad_Opcode },
11581     { RM_TABLE (RM_C7_REG_7) },
11582   },
11583   {
11584     /* MOD_FF_REG_3 */
11585     { "Jcall{T|}", { indirEp }, 0 },
11586   },
11587   {
11588     /* MOD_FF_REG_5 */
11589     { "Jjmp{T|}", { indirEp }, 0 },
11590   },
11591   {
11592     /* MOD_0F01_REG_0 */
11593     { X86_64_TABLE (X86_64_0F01_REG_0) },
11594     { RM_TABLE (RM_0F01_REG_0) },
11595   },
11596   {
11597     /* MOD_0F01_REG_1 */
11598     { X86_64_TABLE (X86_64_0F01_REG_1) },
11599     { RM_TABLE (RM_0F01_REG_1) },
11600   },
11601   {
11602     /* MOD_0F01_REG_2 */
11603     { X86_64_TABLE (X86_64_0F01_REG_2) },
11604     { RM_TABLE (RM_0F01_REG_2) },
11605   },
11606   {
11607     /* MOD_0F01_REG_3 */
11608     { X86_64_TABLE (X86_64_0F01_REG_3) },
11609     { RM_TABLE (RM_0F01_REG_3) },
11610   },
11611   {
11612     /* MOD_0F01_REG_7 */
11613     { "invlpg",         { Mb }, 0 },
11614     { RM_TABLE (RM_0F01_REG_7) },
11615   },
11616   {
11617     /* MOD_0F12_PREFIX_0 */
11618     { "movlps",         { XM, EXq }, PREFIX_OPCODE },
11619     { "movhlps",        { XM, EXq }, PREFIX_OPCODE },
11620   },
11621   {
11622     /* MOD_0F13 */
11623     { "movlpX",         { EXq, XM }, PREFIX_OPCODE },
11624   },
11625   {
11626     /* MOD_0F16_PREFIX_0 */
11627     { "movhps",         { XM, EXq }, 0 },
11628     { "movlhps",        { XM, EXq }, 0 },
11629   },
11630   {
11631     /* MOD_0F17 */
11632     { "movhpX",         { EXq, XM }, PREFIX_OPCODE },
11633   },
11634   {
11635     /* MOD_0F18_REG_0 */
11636     { "prefetchnta",    { Mb }, 0 },
11637   },
11638   {
11639     /* MOD_0F18_REG_1 */
11640     { "prefetcht0",     { Mb }, 0 },
11641   },
11642   {
11643     /* MOD_0F18_REG_2 */
11644     { "prefetcht1",     { Mb }, 0 },
11645   },
11646   {
11647     /* MOD_0F18_REG_3 */
11648     { "prefetcht2",     { Mb }, 0 },
11649   },
11650   {
11651     /* MOD_0F18_REG_4 */
11652     { "nop/reserved",   { Mb }, 0 },
11653   },
11654   {
11655     /* MOD_0F18_REG_5 */
11656     { "nop/reserved",   { Mb }, 0 },
11657   },
11658   {
11659     /* MOD_0F18_REG_6 */
11660     { "nop/reserved",   { Mb }, 0 },
11661   },
11662   {
11663     /* MOD_0F18_REG_7 */
11664     { "nop/reserved",   { Mb }, 0 },
11665   },
11666   {
11667     /* MOD_0F1A_PREFIX_0 */
11668     { "bndldx",         { Gbnd, Ev_bnd }, 0 },
11669     { "nopQ",           { Ev }, 0 },
11670   },
11671   {
11672     /* MOD_0F1B_PREFIX_0 */
11673     { "bndstx",         { Ev_bnd, Gbnd }, 0 },
11674     { "nopQ",           { Ev }, 0 },
11675   },
11676   {
11677     /* MOD_0F1B_PREFIX_1 */
11678     { "bndmk",          { Gbnd, Ev_bnd }, 0 },
11679     { "nopQ",           { Ev }, 0 },
11680   },
11681   {
11682     /* MOD_0F24 */
11683     { Bad_Opcode },
11684     { "movL",           { Rd, Td }, 0 },
11685   },
11686   {
11687     /* MOD_0F26 */
11688     { Bad_Opcode },
11689     { "movL",           { Td, Rd }, 0 },
11690   },
11691   {
11692     /* MOD_0F2B_PREFIX_0 */
11693     {"movntps",         { Mx, XM }, PREFIX_OPCODE },
11694   },
11695   {
11696     /* MOD_0F2B_PREFIX_1 */
11697     {"movntss",         { Md, XM }, PREFIX_OPCODE },
11698   },
11699   {
11700     /* MOD_0F2B_PREFIX_2 */
11701     {"movntpd",         { Mx, XM }, PREFIX_OPCODE },
11702   },
11703   {
11704     /* MOD_0F2B_PREFIX_3 */
11705     {"movntsd",         { Mq, XM }, PREFIX_OPCODE },
11706   },
11707   {
11708     /* MOD_0F51 */
11709     { Bad_Opcode },
11710     { "movmskpX",       { Gdq, XS }, PREFIX_OPCODE },
11711   },
11712   {
11713     /* MOD_0F71_REG_2 */
11714     { Bad_Opcode },
11715     { "psrlw",          { MS, Ib }, 0 },
11716   },
11717   {
11718     /* MOD_0F71_REG_4 */
11719     { Bad_Opcode },
11720     { "psraw",          { MS, Ib }, 0 },
11721   },
11722   {
11723     /* MOD_0F71_REG_6 */
11724     { Bad_Opcode },
11725     { "psllw",          { MS, Ib }, 0 },
11726   },
11727   {
11728     /* MOD_0F72_REG_2 */
11729     { Bad_Opcode },
11730     { "psrld",          { MS, Ib }, 0 },
11731   },
11732   {
11733     /* MOD_0F72_REG_4 */
11734     { Bad_Opcode },
11735     { "psrad",          { MS, Ib }, 0 },
11736   },
11737   {
11738     /* MOD_0F72_REG_6 */
11739     { Bad_Opcode },
11740     { "pslld",          { MS, Ib }, 0 },
11741   },
11742   {
11743     /* MOD_0F73_REG_2 */
11744     { Bad_Opcode },
11745     { "psrlq",          { MS, Ib }, 0 },
11746   },
11747   {
11748     /* MOD_0F73_REG_3 */
11749     { Bad_Opcode },
11750     { PREFIX_TABLE (PREFIX_0F73_REG_3) },
11751   },
11752   {
11753     /* MOD_0F73_REG_6 */
11754     { Bad_Opcode },
11755     { "psllq",          { MS, Ib }, 0 },
11756   },
11757   {
11758     /* MOD_0F73_REG_7 */
11759     { Bad_Opcode },
11760     { PREFIX_TABLE (PREFIX_0F73_REG_7) },
11761   },
11762   {
11763     /* MOD_0FAE_REG_0 */
11764     { "fxsave",         { FXSAVE }, 0 },
11765     { PREFIX_TABLE (PREFIX_0FAE_REG_0) },
11766   },
11767   {
11768     /* MOD_0FAE_REG_1 */
11769     { "fxrstor",        { FXSAVE }, 0 },
11770     { PREFIX_TABLE (PREFIX_0FAE_REG_1) },
11771   },
11772   {
11773     /* MOD_0FAE_REG_2 */
11774     { "ldmxcsr",        { Md }, 0 },
11775     { PREFIX_TABLE (PREFIX_0FAE_REG_2) },
11776   },
11777   {
11778     /* MOD_0FAE_REG_3 */
11779     { "stmxcsr",        { Md }, 0 },
11780     { PREFIX_TABLE (PREFIX_0FAE_REG_3) },
11781   },
11782   {
11783     /* MOD_0FAE_REG_4 */
11784     { "xsave",          { FXSAVE }, 0 },
11785   },
11786   {
11787     /* MOD_0FAE_REG_5 */
11788     { "xrstor",         { FXSAVE }, 0 },
11789     { RM_TABLE (RM_0FAE_REG_5) },
11790   },
11791   {
11792     /* MOD_0FAE_REG_6 */
11793     { PREFIX_TABLE (PREFIX_0FAE_REG_6) },
11794     { RM_TABLE (RM_0FAE_REG_6) },
11795   },
11796   {
11797     /* MOD_0FAE_REG_7 */
11798     { PREFIX_TABLE (PREFIX_0FAE_REG_7) },
11799     { RM_TABLE (RM_0FAE_REG_7) },
11800   },
11801   {
11802     /* MOD_0FB2 */
11803     { "lssS",           { Gv, Mp }, 0 },
11804   },
11805   {
11806     /* MOD_0FB4 */
11807     { "lfsS",           { Gv, Mp }, 0 },
11808   },
11809   {
11810     /* MOD_0FB5 */
11811     { "lgsS",           { Gv, Mp }, 0 },
11812   },
11813   {
11814     /* MOD_0FC7_REG_3 */
11815     { "xrstors",                { FXSAVE }, 0 },
11816   },
11817   {
11818     /* MOD_0FC7_REG_4 */
11819     { "xsavec",         { FXSAVE }, 0 },
11820   },
11821   {
11822     /* MOD_0FC7_REG_5 */
11823     { "xsaves",         { FXSAVE }, 0 },
11824   },
11825   {
11826     /* MOD_0FC7_REG_6 */
11827     { PREFIX_TABLE (PREFIX_MOD_0_0FC7_REG_6) },
11828     { PREFIX_TABLE (PREFIX_MOD_3_0FC7_REG_6) }
11829   },
11830   {
11831     /* MOD_0FC7_REG_7 */
11832     { "vmptrst",        { Mq }, 0 },
11833     { PREFIX_TABLE (PREFIX_MOD_3_0FC7_REG_7) }
11834   },
11835   {
11836     /* MOD_0FD7 */
11837     { Bad_Opcode },
11838     { "pmovmskb",       { Gdq, MS }, 0 },
11839   },
11840   {
11841     /* MOD_0FE7_PREFIX_2 */
11842     { "movntdq",        { Mx, XM }, 0 },
11843   },
11844   {
11845     /* MOD_0FF0_PREFIX_3 */
11846     { "lddqu",          { XM, M }, 0 },
11847   },
11848   {
11849     /* MOD_0F382A_PREFIX_2 */
11850     { "movntdqa",       { XM, Mx }, 0 },
11851   },
11852   {
11853     /* MOD_62_32BIT */
11854     { "bound{S|}",      { Gv, Ma }, 0 },
11855     { EVEX_TABLE (EVEX_0F) },
11856   },
11857   {
11858     /* MOD_C4_32BIT */
11859     { "lesS",           { Gv, Mp }, 0 },
11860     { VEX_C4_TABLE (VEX_0F) },
11861   },
11862   {
11863     /* MOD_C5_32BIT */
11864     { "ldsS",           { Gv, Mp }, 0 },
11865     { VEX_C5_TABLE (VEX_0F) },
11866   },
11867   {
11868     /* MOD_VEX_0F12_PREFIX_0 */
11869     { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_0) },
11870     { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_1) },
11871   },
11872   {
11873     /* MOD_VEX_0F13 */
11874     { VEX_LEN_TABLE (VEX_LEN_0F13_M_0) },
11875   },
11876   {
11877     /* MOD_VEX_0F16_PREFIX_0 */
11878     { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_0) },
11879     { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_1) },
11880   },
11881   {
11882     /* MOD_VEX_0F17 */
11883     { VEX_LEN_TABLE (VEX_LEN_0F17_M_0) },
11884   },
11885   {
11886     /* MOD_VEX_0F2B */
11887     { VEX_W_TABLE (VEX_W_0F2B_M_0) },
11888   },
11889   {
11890     /* MOD_VEX_0F50 */
11891     { Bad_Opcode },
11892     { VEX_W_TABLE (VEX_W_0F50_M_0) },
11893   },
11894   {
11895     /* MOD_VEX_0F71_REG_2 */
11896     { Bad_Opcode },
11897     { PREFIX_TABLE (PREFIX_VEX_0F71_REG_2) },
11898   },
11899   {
11900     /* MOD_VEX_0F71_REG_4 */
11901     { Bad_Opcode },
11902     { PREFIX_TABLE (PREFIX_VEX_0F71_REG_4) },
11903   },
11904   {
11905     /* MOD_VEX_0F71_REG_6 */
11906     { Bad_Opcode },
11907     { PREFIX_TABLE (PREFIX_VEX_0F71_REG_6) },
11908   },
11909   {
11910     /* MOD_VEX_0F72_REG_2 */
11911     { Bad_Opcode },
11912     { PREFIX_TABLE (PREFIX_VEX_0F72_REG_2) },
11913   },
11914   {
11915     /* MOD_VEX_0F72_REG_4 */
11916     { Bad_Opcode },
11917     { PREFIX_TABLE (PREFIX_VEX_0F72_REG_4) },
11918   },
11919   {
11920     /* MOD_VEX_0F72_REG_6 */
11921     { Bad_Opcode },
11922     { PREFIX_TABLE (PREFIX_VEX_0F72_REG_6) },
11923   },
11924   {
11925     /* MOD_VEX_0F73_REG_2 */
11926     { Bad_Opcode },
11927     { PREFIX_TABLE (PREFIX_VEX_0F73_REG_2) },
11928   },
11929   {
11930     /* MOD_VEX_0F73_REG_3 */
11931     { Bad_Opcode },
11932     { PREFIX_TABLE (PREFIX_VEX_0F73_REG_3) },
11933   },
11934   {
11935     /* MOD_VEX_0F73_REG_6 */
11936     { Bad_Opcode },
11937     { PREFIX_TABLE (PREFIX_VEX_0F73_REG_6) },
11938   },
11939   {
11940     /* MOD_VEX_0F73_REG_7 */
11941     { Bad_Opcode },
11942     { PREFIX_TABLE (PREFIX_VEX_0F73_REG_7) },
11943   },
11944   {
11945     /* MOD_VEX_0FAE_REG_2 */
11946     { VEX_LEN_TABLE (VEX_LEN_0FAE_R_2_M_0) },
11947   },
11948   {
11949     /* MOD_VEX_0FAE_REG_3 */
11950     { VEX_LEN_TABLE (VEX_LEN_0FAE_R_3_M_0) },
11951   },
11952   {
11953     /* MOD_VEX_0FD7_PREFIX_2 */
11954     { Bad_Opcode },
11955     { VEX_W_TABLE (VEX_W_0FD7_P_2_M_1) },
11956   },
11957   {
11958     /* MOD_VEX_0FE7_PREFIX_2 */
11959     { VEX_W_TABLE (VEX_W_0FE7_P_2_M_0) },
11960   },
11961   {
11962     /* MOD_VEX_0FF0_PREFIX_3 */
11963     { VEX_W_TABLE (VEX_W_0FF0_P_3_M_0) },
11964   },
11965   {
11966     /* MOD_VEX_0F381A_PREFIX_2 */
11967     { VEX_LEN_TABLE (VEX_LEN_0F381A_P_2_M_0) },
11968   },
11969   {
11970     /* MOD_VEX_0F382A_PREFIX_2 */
11971     { VEX_W_TABLE (VEX_W_0F382A_P_2_M_0) },
11972   },
11973   {
11974     /* MOD_VEX_0F382C_PREFIX_2 */
11975     { VEX_W_TABLE (VEX_W_0F382C_P_2_M_0) },
11976   },
11977   {
11978     /* MOD_VEX_0F382D_PREFIX_2 */
11979     { VEX_W_TABLE (VEX_W_0F382D_P_2_M_0) },
11980   },
11981   {
11982     /* MOD_VEX_0F382E_PREFIX_2 */
11983     { VEX_W_TABLE (VEX_W_0F382E_P_2_M_0) },
11984   },
11985   {
11986     /* MOD_VEX_0F382F_PREFIX_2 */
11987     { VEX_W_TABLE (VEX_W_0F382F_P_2_M_0) },
11988   },
11989   {
11990     /* MOD_VEX_0F385A_PREFIX_2 */
11991     { VEX_LEN_TABLE (VEX_LEN_0F385A_P_2_M_0) },
11992   },
11993   {
11994     /* MOD_VEX_0F388C_PREFIX_2 */
11995     { "vpmaskmov%LW",   { XM, Vex, Mx }, 0 },
11996   },
11997   {
11998     /* MOD_VEX_0F388E_PREFIX_2 */
11999     { "vpmaskmov%LW",   { Mx, Vex, XM }, 0 },
12000   },
12001 #define NEED_MOD_TABLE
12002 #include "i386-dis-evex.h"
12003 #undef NEED_MOD_TABLE
12004 };
12005
12006 static const struct dis386 rm_table[][8] = {
12007   {
12008     /* RM_C6_REG_7 */
12009     { "xabort",         { Skip_MODRM, Ib }, 0 },
12010   },
12011   {
12012     /* RM_C7_REG_7 */
12013     { "xbeginT",        { Skip_MODRM, Jv }, 0 },
12014   },
12015   {
12016     /* RM_0F01_REG_0 */
12017     { Bad_Opcode },
12018     { "vmcall",         { Skip_MODRM }, 0 },
12019     { "vmlaunch",       { Skip_MODRM }, 0 },
12020     { "vmresume",       { Skip_MODRM }, 0 },
12021     { "vmxoff",         { Skip_MODRM }, 0 },
12022   },
12023   {
12024     /* RM_0F01_REG_1 */
12025     { "monitor",        { { OP_Monitor, 0 } }, 0 },
12026     { "mwait",          { { OP_Mwait, 0 } }, 0 },
12027     { "clac",           { Skip_MODRM }, 0 },
12028     { "stac",           { Skip_MODRM }, 0 },
12029     { Bad_Opcode },
12030     { Bad_Opcode },
12031     { Bad_Opcode },
12032     { "encls",          { Skip_MODRM }, 0 },
12033   },
12034   {
12035     /* RM_0F01_REG_2 */
12036     { "xgetbv",         { Skip_MODRM }, 0 },
12037     { "xsetbv",         { Skip_MODRM }, 0 },
12038     { Bad_Opcode },
12039     { Bad_Opcode },
12040     { "vmfunc",         { Skip_MODRM }, 0 },
12041     { "xend",           { Skip_MODRM }, 0 },
12042     { "xtest",          { Skip_MODRM }, 0 },
12043     { "enclu",          { Skip_MODRM }, 0 },
12044   },
12045   {
12046     /* RM_0F01_REG_3 */
12047     { "vmrun",          { Skip_MODRM }, 0 },
12048     { "vmmcall",        { Skip_MODRM }, 0 },
12049     { "vmload",         { Skip_MODRM }, 0 },
12050     { "vmsave",         { Skip_MODRM }, 0 },
12051     { "stgi",           { Skip_MODRM }, 0 },
12052     { "clgi",           { Skip_MODRM }, 0 },
12053     { "skinit",         { Skip_MODRM }, 0 },
12054     { "invlpga",        { Skip_MODRM }, 0 },
12055   },
12056   {
12057     /* RM_0F01_REG_7 */
12058     { "swapgs",         { Skip_MODRM }, 0  },
12059     { "rdtscp",         { Skip_MODRM }, 0  },
12060     { Bad_Opcode },
12061     { Bad_Opcode },
12062     { "clzero",         { Skip_MODRM }, 0  },
12063   },
12064   {
12065     /* RM_0FAE_REG_5 */
12066     { "lfence",         { Skip_MODRM }, 0 },
12067   },
12068   {
12069     /* RM_0FAE_REG_6 */
12070     { "mfence",         { Skip_MODRM }, 0 },
12071   },
12072   {
12073     /* RM_0FAE_REG_7 */
12074     { PREFIX_TABLE (PREFIX_RM_0_0FAE_REG_7) },
12075   },
12076 };
12077
12078 #define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
12079
12080 /* We use the high bit to indicate different name for the same
12081    prefix.  */
12082 #define REP_PREFIX      (0xf3 | 0x100)
12083 #define XACQUIRE_PREFIX (0xf2 | 0x200)
12084 #define XRELEASE_PREFIX (0xf3 | 0x400)
12085 #define BND_PREFIX      (0xf2 | 0x400)
12086
12087 static int
12088 ckprefix (void)
12089 {
12090   int newrex, i, length;
12091   rex = 0;
12092   rex_ignored = 0;
12093   prefixes = 0;
12094   used_prefixes = 0;
12095   rex_used = 0;
12096   last_lock_prefix = -1;
12097   last_repz_prefix = -1;
12098   last_repnz_prefix = -1;
12099   last_data_prefix = -1;
12100   last_addr_prefix = -1;
12101   last_rex_prefix = -1;
12102   last_seg_prefix = -1;
12103   fwait_prefix = -1;
12104   active_seg_prefix = 0;
12105   for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
12106     all_prefixes[i] = 0;
12107   i = 0;
12108   length = 0;
12109   /* The maximum instruction length is 15bytes.  */
12110   while (length < MAX_CODE_LENGTH - 1)
12111     {
12112       FETCH_DATA (the_info, codep + 1);
12113       newrex = 0;
12114       switch (*codep)
12115         {
12116         /* REX prefixes family.  */
12117         case 0x40:
12118         case 0x41:
12119         case 0x42:
12120         case 0x43:
12121         case 0x44:
12122         case 0x45:
12123         case 0x46:
12124         case 0x47:
12125         case 0x48:
12126         case 0x49:
12127         case 0x4a:
12128         case 0x4b:
12129         case 0x4c:
12130         case 0x4d:
12131         case 0x4e:
12132         case 0x4f:
12133           if (address_mode == mode_64bit)
12134             newrex = *codep;
12135           else
12136             return 1;
12137           last_rex_prefix = i;
12138           break;
12139         case 0xf3:
12140           prefixes |= PREFIX_REPZ;
12141           last_repz_prefix = i;
12142           break;
12143         case 0xf2:
12144           prefixes |= PREFIX_REPNZ;
12145           last_repnz_prefix = i;
12146           break;
12147         case 0xf0:
12148           prefixes |= PREFIX_LOCK;
12149           last_lock_prefix = i;
12150           break;
12151         case 0x2e:
12152           prefixes |= PREFIX_CS;
12153           last_seg_prefix = i;
12154           active_seg_prefix = PREFIX_CS;
12155           break;
12156         case 0x36:
12157           prefixes |= PREFIX_SS;
12158           last_seg_prefix = i;
12159           active_seg_prefix = PREFIX_SS;
12160           break;
12161         case 0x3e:
12162           prefixes |= PREFIX_DS;
12163           last_seg_prefix = i;
12164           active_seg_prefix = PREFIX_DS;
12165           break;
12166         case 0x26:
12167           prefixes |= PREFIX_ES;
12168           last_seg_prefix = i;
12169           active_seg_prefix = PREFIX_ES;
12170           break;
12171         case 0x64:
12172           prefixes |= PREFIX_FS;
12173           last_seg_prefix = i;
12174           active_seg_prefix = PREFIX_FS;
12175           break;
12176         case 0x65:
12177           prefixes |= PREFIX_GS;
12178           last_seg_prefix = i;
12179           active_seg_prefix = PREFIX_GS;
12180           break;
12181         case 0x66:
12182           prefixes |= PREFIX_DATA;
12183           last_data_prefix = i;
12184           break;
12185         case 0x67:
12186           prefixes |= PREFIX_ADDR;
12187           last_addr_prefix = i;
12188           break;
12189         case FWAIT_OPCODE:
12190           /* fwait is really an instruction.  If there are prefixes
12191              before the fwait, they belong to the fwait, *not* to the
12192              following instruction.  */
12193           fwait_prefix = i;
12194           if (prefixes || rex)
12195             {
12196               prefixes |= PREFIX_FWAIT;
12197               codep++;
12198               /* This ensures that the previous REX prefixes are noticed
12199                  as unused prefixes, as in the return case below.  */
12200               rex_used = rex;
12201               return 1;
12202             }
12203           prefixes = PREFIX_FWAIT;
12204           break;
12205         default:
12206           return 1;
12207         }
12208       /* Rex is ignored when followed by another prefix.  */
12209       if (rex)
12210         {
12211           rex_used = rex;
12212           return 1;
12213         }
12214       if (*codep != FWAIT_OPCODE)
12215         all_prefixes[i++] = *codep;
12216       rex = newrex;
12217       codep++;
12218       length++;
12219     }
12220   return 0;
12221 }
12222
12223 /* Return the name of the prefix byte PREF, or NULL if PREF is not a
12224    prefix byte.  */
12225
12226 static const char *
12227 prefix_name (int pref, int sizeflag)
12228 {
12229   static const char *rexes [16] =
12230     {
12231       "rex",            /* 0x40 */
12232       "rex.B",          /* 0x41 */
12233       "rex.X",          /* 0x42 */
12234       "rex.XB",         /* 0x43 */
12235       "rex.R",          /* 0x44 */
12236       "rex.RB",         /* 0x45 */
12237       "rex.RX",         /* 0x46 */
12238       "rex.RXB",        /* 0x47 */
12239       "rex.W",          /* 0x48 */
12240       "rex.WB",         /* 0x49 */
12241       "rex.WX",         /* 0x4a */
12242       "rex.WXB",        /* 0x4b */
12243       "rex.WR",         /* 0x4c */
12244       "rex.WRB",        /* 0x4d */
12245       "rex.WRX",        /* 0x4e */
12246       "rex.WRXB",       /* 0x4f */
12247     };
12248
12249   switch (pref)
12250     {
12251     /* REX prefixes family.  */
12252     case 0x40:
12253     case 0x41:
12254     case 0x42:
12255     case 0x43:
12256     case 0x44:
12257     case 0x45:
12258     case 0x46:
12259     case 0x47:
12260     case 0x48:
12261     case 0x49:
12262     case 0x4a:
12263     case 0x4b:
12264     case 0x4c:
12265     case 0x4d:
12266     case 0x4e:
12267     case 0x4f:
12268       return rexes [pref - 0x40];
12269     case 0xf3:
12270       return "repz";
12271     case 0xf2:
12272       return "repnz";
12273     case 0xf0:
12274       return "lock";
12275     case 0x2e:
12276       return "cs";
12277     case 0x36:
12278       return "ss";
12279     case 0x3e:
12280       return "ds";
12281     case 0x26:
12282       return "es";
12283     case 0x64:
12284       return "fs";
12285     case 0x65:
12286       return "gs";
12287     case 0x66:
12288       return (sizeflag & DFLAG) ? "data16" : "data32";
12289     case 0x67:
12290       if (address_mode == mode_64bit)
12291         return (sizeflag & AFLAG) ? "addr32" : "addr64";
12292       else
12293         return (sizeflag & AFLAG) ? "addr16" : "addr32";
12294     case FWAIT_OPCODE:
12295       return "fwait";
12296     case REP_PREFIX:
12297       return "rep";
12298     case XACQUIRE_PREFIX:
12299       return "xacquire";
12300     case XRELEASE_PREFIX:
12301       return "xrelease";
12302     case BND_PREFIX:
12303       return "bnd";
12304     default:
12305       return NULL;
12306     }
12307 }
12308
12309 static char op_out[MAX_OPERANDS][100];
12310 static int op_ad, op_index[MAX_OPERANDS];
12311 static int two_source_ops;
12312 static bfd_vma op_address[MAX_OPERANDS];
12313 static bfd_vma op_riprel[MAX_OPERANDS];
12314 static bfd_vma start_pc;
12315
12316 /*
12317  *   On the 386's of 1988, the maximum length of an instruction is 15 bytes.
12318  *   (see topic "Redundant prefixes" in the "Differences from 8086"
12319  *   section of the "Virtual 8086 Mode" chapter.)
12320  * 'pc' should be the address of this instruction, it will
12321  *   be used to print the target address if this is a relative jump or call
12322  * The function returns the length of this instruction in bytes.
12323  */
12324
12325 static char intel_syntax;
12326 static char intel_mnemonic = !SYSV386_COMPAT;
12327 static char open_char;
12328 static char close_char;
12329 static char separator_char;
12330 static char scale_char;
12331
12332 /* Here for backwards compatibility.  When gdb stops using
12333    print_insn_i386_att and print_insn_i386_intel these functions can
12334    disappear, and print_insn_i386 be merged into print_insn.  */
12335 int
12336 print_insn_i386_att (bfd_vma pc, disassemble_info *info)
12337 {
12338   intel_syntax = 0;
12339
12340   return print_insn (pc, info);
12341 }
12342
12343 int
12344 print_insn_i386_intel (bfd_vma pc, disassemble_info *info)
12345 {
12346   intel_syntax = 1;
12347
12348   return print_insn (pc, info);
12349 }
12350
12351 int
12352 print_insn_i386 (bfd_vma pc, disassemble_info *info)
12353 {
12354   intel_syntax = -1;
12355
12356   return print_insn (pc, info);
12357 }
12358
12359 void
12360 print_i386_disassembler_options (FILE *stream)
12361 {
12362   fprintf (stream, _("\n\
12363 The following i386/x86-64 specific disassembler options are supported for use\n\
12364 with the -M switch (multiple options should be separated by commas):\n"));
12365
12366   fprintf (stream, _("  x86-64      Disassemble in 64bit mode\n"));
12367   fprintf (stream, _("  i386        Disassemble in 32bit mode\n"));
12368   fprintf (stream, _("  i8086       Disassemble in 16bit mode\n"));
12369   fprintf (stream, _("  att         Display instruction in AT&T syntax\n"));
12370   fprintf (stream, _("  intel       Display instruction in Intel syntax\n"));
12371   fprintf (stream, _("  att-mnemonic\n"
12372                      "              Display instruction in AT&T mnemonic\n"));
12373   fprintf (stream, _("  intel-mnemonic\n"
12374                      "              Display instruction in Intel mnemonic\n"));
12375   fprintf (stream, _("  addr64      Assume 64bit address size\n"));
12376   fprintf (stream, _("  addr32      Assume 32bit address size\n"));
12377   fprintf (stream, _("  addr16      Assume 16bit address size\n"));
12378   fprintf (stream, _("  data32      Assume 32bit data size\n"));
12379   fprintf (stream, _("  data16      Assume 16bit data size\n"));
12380   fprintf (stream, _("  suffix      Always display instruction suffix in AT&T syntax\n"));
12381 }
12382
12383 /* Bad opcode.  */
12384 static const struct dis386 bad_opcode = { "(bad)", { XX }, 0 };
12385
12386 /* Get a pointer to struct dis386 with a valid name.  */
12387
12388 static const struct dis386 *
12389 get_valid_dis386 (const struct dis386 *dp, disassemble_info *info)
12390 {
12391   int vindex, vex_table_index;
12392
12393   if (dp->name != NULL)
12394     return dp;
12395
12396   switch (dp->op[0].bytemode)
12397     {
12398     case USE_REG_TABLE:
12399       dp = &reg_table[dp->op[1].bytemode][modrm.reg];
12400       break;
12401
12402     case USE_MOD_TABLE:
12403       vindex = modrm.mod == 0x3 ? 1 : 0;
12404       dp = &mod_table[dp->op[1].bytemode][vindex];
12405       break;
12406
12407     case USE_RM_TABLE:
12408       dp = &rm_table[dp->op[1].bytemode][modrm.rm];
12409       break;
12410
12411     case USE_PREFIX_TABLE:
12412       if (need_vex)
12413         {
12414           /* The prefix in VEX is implicit.  */
12415           switch (vex.prefix)
12416             {
12417             case 0:
12418               vindex = 0;
12419               break;
12420             case REPE_PREFIX_OPCODE:
12421               vindex = 1;
12422               break;
12423             case DATA_PREFIX_OPCODE:
12424               vindex = 2;
12425               break;
12426             case REPNE_PREFIX_OPCODE:
12427               vindex = 3;
12428               break;
12429             default:
12430               abort ();
12431               break;
12432             }
12433         }
12434       else
12435         {
12436           int last_prefix = -1;
12437           int prefix = 0;
12438           vindex = 0;
12439           /* We check PREFIX_REPNZ and PREFIX_REPZ before PREFIX_DATA.
12440              When there are multiple PREFIX_REPNZ and PREFIX_REPZ, the
12441              last one wins.  */
12442           if ((prefixes & (PREFIX_REPZ | PREFIX_REPNZ)) != 0)
12443             {
12444               if (last_repz_prefix > last_repnz_prefix)
12445                 {
12446                   vindex = 1;
12447                   prefix = PREFIX_REPZ;
12448                   last_prefix = last_repz_prefix;
12449                 }
12450               else
12451                 {
12452                   vindex = 3;
12453                   prefix = PREFIX_REPNZ;
12454                   last_prefix = last_repnz_prefix;
12455                 }
12456
12457               /* Check if prefix should be ignored.  */
12458               if ((((prefix_table[dp->op[1].bytemode][vindex].prefix_requirement
12459                      & PREFIX_IGNORED) >> PREFIX_IGNORED_SHIFT)
12460                    & prefix) != 0)
12461                 vindex = 0;
12462             }
12463
12464           if (vindex == 0 && (prefixes & PREFIX_DATA) != 0)
12465             {
12466               vindex = 2;
12467               prefix = PREFIX_DATA;
12468               last_prefix = last_data_prefix;
12469             }
12470
12471           if (vindex != 0)
12472             {
12473               used_prefixes |= prefix;
12474               all_prefixes[last_prefix] = 0;
12475             }
12476         }
12477       dp = &prefix_table[dp->op[1].bytemode][vindex];
12478       break;
12479
12480     case USE_X86_64_TABLE:
12481       vindex = address_mode == mode_64bit ? 1 : 0;
12482       dp = &x86_64_table[dp->op[1].bytemode][vindex];
12483       break;
12484
12485     case USE_3BYTE_TABLE:
12486       FETCH_DATA (info, codep + 2);
12487       vindex = *codep++;
12488       dp = &three_byte_table[dp->op[1].bytemode][vindex];
12489       end_codep = codep;
12490       modrm.mod = (*codep >> 6) & 3;
12491       modrm.reg = (*codep >> 3) & 7;
12492       modrm.rm = *codep & 7;
12493       break;
12494
12495     case USE_VEX_LEN_TABLE:
12496       if (!need_vex)
12497         abort ();
12498
12499       switch (vex.length)
12500         {
12501         case 128:
12502           vindex = 0;
12503           break;
12504         case 256:
12505           vindex = 1;
12506           break;
12507         default:
12508           abort ();
12509           break;
12510         }
12511
12512       dp = &vex_len_table[dp->op[1].bytemode][vindex];
12513       break;
12514
12515     case USE_XOP_8F_TABLE:
12516       FETCH_DATA (info, codep + 3);
12517       /* All bits in the REX prefix are ignored.  */
12518       rex_ignored = rex;
12519       rex = ~(*codep >> 5) & 0x7;
12520
12521       /* VEX_TABLE_INDEX is the mmmmm part of the XOP byte 1 "RCB.mmmmm".  */
12522       switch ((*codep & 0x1f))
12523         {
12524         default:
12525           dp = &bad_opcode;
12526           return dp;
12527         case 0x8:
12528           vex_table_index = XOP_08;
12529           break;
12530         case 0x9:
12531           vex_table_index = XOP_09;
12532           break;
12533         case 0xa:
12534           vex_table_index = XOP_0A;
12535           break;
12536         }
12537       codep++;
12538       vex.w = *codep & 0x80;
12539       if (vex.w && address_mode == mode_64bit)
12540         rex |= REX_W;
12541
12542       vex.register_specifier = (~(*codep >> 3)) & 0xf;
12543       if (address_mode != mode_64bit
12544           && vex.register_specifier > 0x7)
12545         {
12546           dp = &bad_opcode;
12547           return dp;
12548         }
12549
12550       vex.length = (*codep & 0x4) ? 256 : 128;
12551       switch ((*codep & 0x3))
12552         {
12553         case 0:
12554           vex.prefix = 0;
12555           break;
12556         case 1:
12557           vex.prefix = DATA_PREFIX_OPCODE;
12558           break;
12559         case 2:
12560           vex.prefix = REPE_PREFIX_OPCODE;
12561           break;
12562         case 3:
12563           vex.prefix = REPNE_PREFIX_OPCODE;
12564           break;
12565         }
12566       need_vex = 1;
12567       need_vex_reg = 1;
12568       codep++;
12569       vindex = *codep++;
12570       dp = &xop_table[vex_table_index][vindex];
12571
12572       end_codep = codep;
12573       FETCH_DATA (info, codep + 1);
12574       modrm.mod = (*codep >> 6) & 3;
12575       modrm.reg = (*codep >> 3) & 7;
12576       modrm.rm = *codep & 7;
12577       break;
12578
12579     case USE_VEX_C4_TABLE:
12580       /* VEX prefix.  */
12581       FETCH_DATA (info, codep + 3);
12582       /* All bits in the REX prefix are ignored.  */
12583       rex_ignored = rex;
12584       rex = ~(*codep >> 5) & 0x7;
12585       switch ((*codep & 0x1f))
12586         {
12587         default:
12588           dp = &bad_opcode;
12589           return dp;
12590         case 0x1:
12591           vex_table_index = VEX_0F;
12592           break;
12593         case 0x2:
12594           vex_table_index = VEX_0F38;
12595           break;
12596         case 0x3:
12597           vex_table_index = VEX_0F3A;
12598           break;
12599         }
12600       codep++;
12601       vex.w = *codep & 0x80;
12602       if (vex.w && address_mode == mode_64bit)
12603         rex |= REX_W;
12604
12605       vex.register_specifier = (~(*codep >> 3)) & 0xf;
12606       if (address_mode != mode_64bit
12607           && vex.register_specifier > 0x7)
12608         {
12609           dp = &bad_opcode;
12610           return dp;
12611         }
12612
12613       vex.length = (*codep & 0x4) ? 256 : 128;
12614       switch ((*codep & 0x3))
12615         {
12616         case 0:
12617           vex.prefix = 0;
12618           break;
12619         case 1:
12620           vex.prefix = DATA_PREFIX_OPCODE;
12621           break;
12622         case 2:
12623           vex.prefix = REPE_PREFIX_OPCODE;
12624           break;
12625         case 3:
12626           vex.prefix = REPNE_PREFIX_OPCODE;
12627           break;
12628         }
12629       need_vex = 1;
12630       need_vex_reg = 1;
12631       codep++;
12632       vindex = *codep++;
12633       dp = &vex_table[vex_table_index][vindex];
12634       end_codep = codep;
12635       /* There is no MODRM byte for VEX [82|77].  */
12636       if (vindex != 0x77 && vindex != 0x82)
12637         {
12638           FETCH_DATA (info, codep + 1);
12639           modrm.mod = (*codep >> 6) & 3;
12640           modrm.reg = (*codep >> 3) & 7;
12641           modrm.rm = *codep & 7;
12642         }
12643       break;
12644
12645     case USE_VEX_C5_TABLE:
12646       /* VEX prefix.  */
12647       FETCH_DATA (info, codep + 2);
12648       /* All bits in the REX prefix are ignored.  */
12649       rex_ignored = rex;
12650       rex = (*codep & 0x80) ? 0 : REX_R;
12651
12652       vex.register_specifier = (~(*codep >> 3)) & 0xf;
12653       if (address_mode != mode_64bit
12654           && vex.register_specifier > 0x7)
12655         {
12656           dp = &bad_opcode;
12657           return dp;
12658         }
12659
12660       vex.w = 0;
12661
12662       vex.length = (*codep & 0x4) ? 256 : 128;
12663       switch ((*codep & 0x3))
12664         {
12665         case 0:
12666           vex.prefix = 0;
12667           break;
12668         case 1:
12669           vex.prefix = DATA_PREFIX_OPCODE;
12670           break;
12671         case 2:
12672           vex.prefix = REPE_PREFIX_OPCODE;
12673           break;
12674         case 3:
12675           vex.prefix = REPNE_PREFIX_OPCODE;
12676           break;
12677         }
12678       need_vex = 1;
12679       need_vex_reg = 1;
12680       codep++;
12681       vindex = *codep++;
12682       dp = &vex_table[dp->op[1].bytemode][vindex];
12683       end_codep = codep;
12684       /* There is no MODRM byte for VEX [82|77].  */
12685       if (vindex != 0x77 && vindex != 0x82)
12686         {
12687           FETCH_DATA (info, codep + 1);
12688           modrm.mod = (*codep >> 6) & 3;
12689           modrm.reg = (*codep >> 3) & 7;
12690           modrm.rm = *codep & 7;
12691         }
12692       break;
12693
12694     case USE_VEX_W_TABLE:
12695       if (!need_vex)
12696         abort ();
12697
12698       dp = &vex_w_table[dp->op[1].bytemode][vex.w ? 1 : 0];
12699       break;
12700
12701     case USE_EVEX_TABLE:
12702       two_source_ops = 0;
12703       /* EVEX prefix.  */
12704       vex.evex = 1;
12705       FETCH_DATA (info, codep + 4);
12706       /* All bits in the REX prefix are ignored.  */
12707       rex_ignored = rex;
12708       /* The first byte after 0x62.  */
12709       rex = ~(*codep >> 5) & 0x7;
12710       vex.r = *codep & 0x10;
12711       switch ((*codep & 0xf))
12712         {
12713         default:
12714           return &bad_opcode;
12715         case 0x1:
12716           vex_table_index = EVEX_0F;
12717           break;
12718         case 0x2:
12719           vex_table_index = EVEX_0F38;
12720           break;
12721         case 0x3:
12722           vex_table_index = EVEX_0F3A;
12723           break;
12724         }
12725
12726       /* The second byte after 0x62.  */
12727       codep++;
12728       vex.w = *codep & 0x80;
12729       if (vex.w && address_mode == mode_64bit)
12730         rex |= REX_W;
12731
12732       vex.register_specifier = (~(*codep >> 3)) & 0xf;
12733       if (address_mode != mode_64bit)
12734         {
12735           /* In 16/32-bit mode silently ignore following bits.  */
12736           rex &= ~REX_B;
12737           vex.r = 1;
12738           vex.v = 1;
12739           vex.register_specifier &= 0x7;
12740         }
12741
12742       /* The U bit.  */
12743       if (!(*codep & 0x4))
12744         return &bad_opcode;
12745
12746       switch ((*codep & 0x3))
12747         {
12748         case 0:
12749           vex.prefix = 0;
12750           break;
12751         case 1:
12752           vex.prefix = DATA_PREFIX_OPCODE;
12753           break;
12754         case 2:
12755           vex.prefix = REPE_PREFIX_OPCODE;
12756           break;
12757         case 3:
12758           vex.prefix = REPNE_PREFIX_OPCODE;
12759           break;
12760         }
12761
12762       /* The third byte after 0x62.  */
12763       codep++;
12764
12765       /* Remember the static rounding bits.  */
12766       vex.ll = (*codep >> 5) & 3;
12767       vex.b = (*codep & 0x10) != 0;
12768
12769       vex.v = *codep & 0x8;
12770       vex.mask_register_specifier = *codep & 0x7;
12771       vex.zeroing = *codep & 0x80;
12772
12773       need_vex = 1;
12774       need_vex_reg = 1;
12775       codep++;
12776       vindex = *codep++;
12777       dp = &evex_table[vex_table_index][vindex];
12778       end_codep = codep;
12779       FETCH_DATA (info, codep + 1);
12780       modrm.mod = (*codep >> 6) & 3;
12781       modrm.reg = (*codep >> 3) & 7;
12782       modrm.rm = *codep & 7;
12783
12784       /* Set vector length.  */
12785       if (modrm.mod == 3 && vex.b)
12786         vex.length = 512;
12787       else
12788         {
12789           switch (vex.ll)
12790             {
12791             case 0x0:
12792               vex.length = 128;
12793               break;
12794             case 0x1:
12795               vex.length = 256;
12796               break;
12797             case 0x2:
12798               vex.length = 512;
12799               break;
12800             default:
12801               return &bad_opcode;
12802             }
12803         }
12804       break;
12805
12806     case 0:
12807       dp = &bad_opcode;
12808       break;
12809
12810     default:
12811       abort ();
12812     }
12813
12814   if (dp->name != NULL)
12815     return dp;
12816   else
12817     return get_valid_dis386 (dp, info);
12818 }
12819
12820 static void
12821 get_sib (disassemble_info *info, int sizeflag)
12822 {
12823   /* If modrm.mod == 3, operand must be register.  */
12824   if (need_modrm
12825       && ((sizeflag & AFLAG) || address_mode == mode_64bit)
12826       && modrm.mod != 3
12827       && modrm.rm == 4)
12828     {
12829       FETCH_DATA (info, codep + 2);
12830       sib.index = (codep [1] >> 3) & 7;
12831       sib.scale = (codep [1] >> 6) & 3;
12832       sib.base = codep [1] & 7;
12833     }
12834 }
12835
12836 static int
12837 print_insn (bfd_vma pc, disassemble_info *info)
12838 {
12839   const struct dis386 *dp;
12840   int i;
12841   char *op_txt[MAX_OPERANDS];
12842   int needcomma;
12843   int sizeflag, orig_sizeflag;
12844   const char *p;
12845   struct dis_private priv;
12846   int prefix_length;
12847
12848   priv.orig_sizeflag = AFLAG | DFLAG;
12849   if ((info->mach & bfd_mach_i386_i386) != 0)
12850     address_mode = mode_32bit;
12851   else if (info->mach == bfd_mach_i386_i8086)
12852     {
12853       address_mode = mode_16bit;
12854       priv.orig_sizeflag = 0;
12855     }
12856   else
12857     address_mode = mode_64bit;
12858
12859   if (intel_syntax == (char) -1)
12860     intel_syntax = (info->mach & bfd_mach_i386_intel_syntax) != 0;
12861
12862   for (p = info->disassembler_options; p != NULL; )
12863     {
12864       if (CONST_STRNEQ (p, "x86-64"))
12865         {
12866           address_mode = mode_64bit;
12867           priv.orig_sizeflag = AFLAG | DFLAG;
12868         }
12869       else if (CONST_STRNEQ (p, "i386"))
12870         {
12871           address_mode = mode_32bit;
12872           priv.orig_sizeflag = AFLAG | DFLAG;
12873         }
12874       else if (CONST_STRNEQ (p, "i8086"))
12875         {
12876           address_mode = mode_16bit;
12877           priv.orig_sizeflag = 0;
12878         }
12879       else if (CONST_STRNEQ (p, "intel"))
12880         {
12881           intel_syntax = 1;
12882           if (CONST_STRNEQ (p + 5, "-mnemonic"))
12883             intel_mnemonic = 1;
12884         }
12885       else if (CONST_STRNEQ (p, "att"))
12886         {
12887           intel_syntax = 0;
12888           if (CONST_STRNEQ (p + 3, "-mnemonic"))
12889             intel_mnemonic = 0;
12890         }
12891       else if (CONST_STRNEQ (p, "addr"))
12892         {
12893           if (address_mode == mode_64bit)
12894             {
12895               if (p[4] == '3' && p[5] == '2')
12896                 priv.orig_sizeflag &= ~AFLAG;
12897               else if (p[4] == '6' && p[5] == '4')
12898                 priv.orig_sizeflag |= AFLAG;
12899             }
12900           else
12901             {
12902               if (p[4] == '1' && p[5] == '6')
12903                 priv.orig_sizeflag &= ~AFLAG;
12904               else if (p[4] == '3' && p[5] == '2')
12905                 priv.orig_sizeflag |= AFLAG;
12906             }
12907         }
12908       else if (CONST_STRNEQ (p, "data"))
12909         {
12910           if (p[4] == '1' && p[5] == '6')
12911             priv.orig_sizeflag &= ~DFLAG;
12912           else if (p[4] == '3' && p[5] == '2')
12913             priv.orig_sizeflag |= DFLAG;
12914         }
12915       else if (CONST_STRNEQ (p, "suffix"))
12916         priv.orig_sizeflag |= SUFFIX_ALWAYS;
12917
12918       p = strchr (p, ',');
12919       if (p != NULL)
12920         p++;
12921     }
12922
12923   if (intel_syntax)
12924     {
12925       names64 = intel_names64;
12926       names32 = intel_names32;
12927       names16 = intel_names16;
12928       names8 = intel_names8;
12929       names8rex = intel_names8rex;
12930       names_seg = intel_names_seg;
12931       names_mm = intel_names_mm;
12932       names_bnd = intel_names_bnd;
12933       names_xmm = intel_names_xmm;
12934       names_ymm = intel_names_ymm;
12935       names_zmm = intel_names_zmm;
12936       index64 = intel_index64;
12937       index32 = intel_index32;
12938       names_mask = intel_names_mask;
12939       index16 = intel_index16;
12940       open_char = '[';
12941       close_char = ']';
12942       separator_char = '+';
12943       scale_char = '*';
12944     }
12945   else
12946     {
12947       names64 = att_names64;
12948       names32 = att_names32;
12949       names16 = att_names16;
12950       names8 = att_names8;
12951       names8rex = att_names8rex;
12952       names_seg = att_names_seg;
12953       names_mm = att_names_mm;
12954       names_bnd = att_names_bnd;
12955       names_xmm = att_names_xmm;
12956       names_ymm = att_names_ymm;
12957       names_zmm = att_names_zmm;
12958       index64 = att_index64;
12959       index32 = att_index32;
12960       names_mask = att_names_mask;
12961       index16 = att_index16;
12962       open_char = '(';
12963       close_char =  ')';
12964       separator_char = ',';
12965       scale_char = ',';
12966     }
12967
12968   /* The output looks better if we put 7 bytes on a line, since that
12969      puts most long word instructions on a single line.  Use 8 bytes
12970      for Intel L1OM.  */
12971   if ((info->mach & bfd_mach_l1om) != 0)
12972     info->bytes_per_line = 8;
12973   else
12974     info->bytes_per_line = 7;
12975
12976   info->private_data = &priv;
12977   priv.max_fetched = priv.the_buffer;
12978   priv.insn_start = pc;
12979
12980   obuf[0] = 0;
12981   for (i = 0; i < MAX_OPERANDS; ++i)
12982     {
12983       op_out[i][0] = 0;
12984       op_index[i] = -1;
12985     }
12986
12987   the_info = info;
12988   start_pc = pc;
12989   start_codep = priv.the_buffer;
12990   codep = priv.the_buffer;
12991
12992   if (OPCODES_SIGSETJMP (priv.bailout) != 0)
12993     {
12994       const char *name;
12995
12996       /* Getting here means we tried for data but didn't get it.  That
12997          means we have an incomplete instruction of some sort.  Just
12998          print the first byte as a prefix or a .byte pseudo-op.  */
12999       if (codep > priv.the_buffer)
13000         {
13001           name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
13002           if (name != NULL)
13003             (*info->fprintf_func) (info->stream, "%s", name);
13004           else
13005             {
13006               /* Just print the first byte as a .byte instruction.  */
13007               (*info->fprintf_func) (info->stream, ".byte 0x%x",
13008                                      (unsigned int) priv.the_buffer[0]);
13009             }
13010
13011           return 1;
13012         }
13013
13014       return -1;
13015     }
13016
13017   obufp = obuf;
13018   sizeflag = priv.orig_sizeflag;
13019
13020   if (!ckprefix () || rex_used)
13021     {
13022       /* Too many prefixes or unused REX prefixes.  */
13023       for (i = 0;
13024            i < (int) ARRAY_SIZE (all_prefixes) && all_prefixes[i];
13025            i++)
13026         (*info->fprintf_func) (info->stream, "%s%s",
13027                                i == 0 ? "" : " ",
13028                                prefix_name (all_prefixes[i], sizeflag));
13029       return i;
13030     }
13031
13032   insn_codep = codep;
13033
13034   FETCH_DATA (info, codep + 1);
13035   two_source_ops = (*codep == 0x62) || (*codep == 0xc8);
13036
13037   if (((prefixes & PREFIX_FWAIT)
13038        && ((*codep < 0xd8) || (*codep > 0xdf))))
13039     {
13040       /* Handle prefixes before fwait.  */
13041       for (i = 0; i < fwait_prefix && all_prefixes[i];
13042            i++)
13043         (*info->fprintf_func) (info->stream, "%s ",
13044                                prefix_name (all_prefixes[i], sizeflag));
13045       (*info->fprintf_func) (info->stream, "fwait");
13046       return i + 1;
13047     }
13048
13049   if (*codep == 0x0f)
13050     {
13051       unsigned char threebyte;
13052       FETCH_DATA (info, codep + 2);
13053       threebyte = *++codep;
13054       dp = &dis386_twobyte[threebyte];
13055       need_modrm = twobyte_has_modrm[*codep];
13056       prefix_requirement = dp->prefix_requirement;
13057       codep++;
13058     }
13059   else
13060     {
13061       dp = &dis386[*codep];
13062       need_modrm = onebyte_has_modrm[*codep];
13063       prefix_requirement = 0;
13064       codep++;
13065     }
13066
13067   /* Save sizeflag for printing the extra prefixes later before updating
13068      it for mnemonic and operand processing.  The prefix names depend
13069      only on the address mode.  */
13070   orig_sizeflag = sizeflag;
13071   if (prefixes & PREFIX_ADDR)
13072     sizeflag ^= AFLAG;
13073   if ((prefixes & PREFIX_DATA))
13074     sizeflag ^= DFLAG;
13075
13076   end_codep = codep;
13077   if (need_modrm)
13078     {
13079       FETCH_DATA (info, codep + 1);
13080       modrm.mod = (*codep >> 6) & 3;
13081       modrm.reg = (*codep >> 3) & 7;
13082       modrm.rm = *codep & 7;
13083     }
13084
13085   need_vex = 0;
13086   need_vex_reg = 0;
13087   vex_w_done = 0;
13088   vex.evex = 0;
13089
13090   if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE)
13091     {
13092       get_sib (info, sizeflag);
13093       dofloat (sizeflag);
13094     }
13095   else
13096     {
13097       dp = get_valid_dis386 (dp, info);
13098       if (dp != NULL && putop (dp->name, sizeflag) == 0)
13099         {
13100           get_sib (info, sizeflag);
13101           for (i = 0; i < MAX_OPERANDS; ++i)
13102             {
13103               obufp = op_out[i];
13104               op_ad = MAX_OPERANDS - 1 - i;
13105               if (dp->op[i].rtn)
13106                 (*dp->op[i].rtn) (dp->op[i].bytemode, sizeflag);
13107               /* For EVEX instruction after the last operand masking
13108                  should be printed.  */
13109               if (i == 0 && vex.evex)
13110                 {
13111                   /* Don't print {%k0}.  */
13112                   if (vex.mask_register_specifier)
13113                     {
13114                       oappend ("{");
13115                       oappend (names_mask[vex.mask_register_specifier]);
13116                       oappend ("}");
13117                     }
13118                   if (vex.zeroing)
13119                     oappend ("{z}");
13120                 }
13121             }
13122         }
13123     }
13124
13125   /* Check if the REX prefix is used.  */
13126   if (rex_ignored == 0 && (rex ^ rex_used) == 0 && last_rex_prefix >= 0)
13127     all_prefixes[last_rex_prefix] = 0;
13128
13129   /* Check if the SEG prefix is used.  */
13130   if ((prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS | PREFIX_ES
13131                    | PREFIX_FS | PREFIX_GS)) != 0
13132       && (used_prefixes & active_seg_prefix) != 0)
13133     all_prefixes[last_seg_prefix] = 0;
13134
13135   /* Check if the ADDR prefix is used.  */
13136   if ((prefixes & PREFIX_ADDR) != 0
13137       && (used_prefixes & PREFIX_ADDR) != 0)
13138     all_prefixes[last_addr_prefix] = 0;
13139
13140   /* Check if the DATA prefix is used.  */
13141   if ((prefixes & PREFIX_DATA) != 0
13142       && (used_prefixes & PREFIX_DATA) != 0)
13143     all_prefixes[last_data_prefix] = 0;
13144
13145   /* Print the extra prefixes.  */
13146   prefix_length = 0;
13147   for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
13148     if (all_prefixes[i])
13149       {
13150         const char *name;
13151         name = prefix_name (all_prefixes[i], orig_sizeflag);
13152         if (name == NULL)
13153           abort ();
13154         prefix_length += strlen (name) + 1;
13155         (*info->fprintf_func) (info->stream, "%s ", name);
13156       }
13157
13158   /* If the mandatory PREFIX_REPZ/PREFIX_REPNZ/PREFIX_DATA prefix is
13159      unused, opcode is invalid.  Since the PREFIX_DATA prefix may be
13160      used by putop and MMX/SSE operand and may be overriden by the
13161      PREFIX_REPZ/PREFIX_REPNZ fix, we check the PREFIX_DATA prefix
13162      separately.  */
13163   if (prefix_requirement == PREFIX_OPCODE
13164       && dp != &bad_opcode
13165       && (((prefixes
13166             & (PREFIX_REPZ | PREFIX_REPNZ)) != 0
13167            && (used_prefixes
13168                & (PREFIX_REPZ | PREFIX_REPNZ)) == 0)
13169           || ((((prefixes
13170                  & (PREFIX_REPZ | PREFIX_REPNZ | PREFIX_DATA))
13171                 == PREFIX_DATA)
13172                && (used_prefixes & PREFIX_DATA) == 0))))
13173     {
13174       (*info->fprintf_func) (info->stream, "(bad)");
13175       return end_codep - priv.the_buffer;
13176     }
13177
13178   /* Check maximum code length.  */
13179   if ((codep - start_codep) > MAX_CODE_LENGTH)
13180     {
13181       (*info->fprintf_func) (info->stream, "(bad)");
13182       return MAX_CODE_LENGTH;
13183     }
13184
13185   obufp = mnemonicendp;
13186   for (i = strlen (obuf) + prefix_length; i < 6; i++)
13187     oappend (" ");
13188   oappend (" ");
13189   (*info->fprintf_func) (info->stream, "%s", obuf);
13190
13191   /* The enter and bound instructions are printed with operands in the same
13192      order as the intel book; everything else is printed in reverse order.  */
13193   if (intel_syntax || two_source_ops)
13194     {
13195       bfd_vma riprel;
13196
13197       for (i = 0; i < MAX_OPERANDS; ++i)
13198         op_txt[i] = op_out[i];
13199
13200       for (i = 0; i < (MAX_OPERANDS >> 1); ++i)
13201         {
13202           op_ad = op_index[i];
13203           op_index[i] = op_index[MAX_OPERANDS - 1 - i];
13204           op_index[MAX_OPERANDS - 1 - i] = op_ad;
13205           riprel = op_riprel[i];
13206           op_riprel[i] = op_riprel [MAX_OPERANDS - 1 - i];
13207           op_riprel[MAX_OPERANDS - 1 - i] = riprel;
13208         }
13209     }
13210   else
13211     {
13212       for (i = 0; i < MAX_OPERANDS; ++i)
13213         op_txt[MAX_OPERANDS - 1 - i] = op_out[i];
13214     }
13215
13216   needcomma = 0;
13217   for (i = 0; i < MAX_OPERANDS; ++i)
13218     if (*op_txt[i])
13219       {
13220         if (needcomma)
13221           (*info->fprintf_func) (info->stream, ",");
13222         if (op_index[i] != -1 && !op_riprel[i])
13223           (*info->print_address_func) ((bfd_vma) op_address[op_index[i]], info);
13224         else
13225           (*info->fprintf_func) (info->stream, "%s", op_txt[i]);
13226         needcomma = 1;
13227       }
13228
13229   for (i = 0; i < MAX_OPERANDS; i++)
13230     if (op_index[i] != -1 && op_riprel[i])
13231       {
13232         (*info->fprintf_func) (info->stream, "        # ");
13233         (*info->print_address_func) ((bfd_vma) (start_pc + codep - start_codep
13234                                                 + op_address[op_index[i]]), info);
13235         break;
13236       }
13237   return codep - priv.the_buffer;
13238 }
13239
13240 static const char *float_mem[] = {
13241   /* d8 */
13242   "fadd{s|}",
13243   "fmul{s|}",
13244   "fcom{s|}",
13245   "fcomp{s|}",
13246   "fsub{s|}",
13247   "fsubr{s|}",
13248   "fdiv{s|}",
13249   "fdivr{s|}",
13250   /* d9 */
13251   "fld{s|}",
13252   "(bad)",
13253   "fst{s|}",
13254   "fstp{s|}",
13255   "fldenvIC",
13256   "fldcw",
13257   "fNstenvIC",
13258   "fNstcw",
13259   /* da */
13260   "fiadd{l|}",
13261   "fimul{l|}",
13262   "ficom{l|}",
13263   "ficomp{l|}",
13264   "fisub{l|}",
13265   "fisubr{l|}",
13266   "fidiv{l|}",
13267   "fidivr{l|}",
13268   /* db */
13269   "fild{l|}",
13270   "fisttp{l|}",
13271   "fist{l|}",
13272   "fistp{l|}",
13273   "(bad)",
13274   "fld{t||t|}",
13275   "(bad)",
13276   "fstp{t||t|}",
13277   /* dc */
13278   "fadd{l|}",
13279   "fmul{l|}",
13280   "fcom{l|}",
13281   "fcomp{l|}",
13282   "fsub{l|}",
13283   "fsubr{l|}",
13284   "fdiv{l|}",
13285   "fdivr{l|}",
13286   /* dd */
13287   "fld{l|}",
13288   "fisttp{ll|}",
13289   "fst{l||}",
13290   "fstp{l|}",
13291   "frstorIC",
13292   "(bad)",
13293   "fNsaveIC",
13294   "fNstsw",
13295   /* de */
13296   "fiadd",
13297   "fimul",
13298   "ficom",
13299   "ficomp",
13300   "fisub",
13301   "fisubr",
13302   "fidiv",
13303   "fidivr",
13304   /* df */
13305   "fild",
13306   "fisttp",
13307   "fist",
13308   "fistp",
13309   "fbld",
13310   "fild{ll|}",
13311   "fbstp",
13312   "fistp{ll|}",
13313 };
13314
13315 static const unsigned char float_mem_mode[] = {
13316   /* d8 */
13317   d_mode,
13318   d_mode,
13319   d_mode,
13320   d_mode,
13321   d_mode,
13322   d_mode,
13323   d_mode,
13324   d_mode,
13325   /* d9 */
13326   d_mode,
13327   0,
13328   d_mode,
13329   d_mode,
13330   0,
13331   w_mode,
13332   0,
13333   w_mode,
13334   /* da */
13335   d_mode,
13336   d_mode,
13337   d_mode,
13338   d_mode,
13339   d_mode,
13340   d_mode,
13341   d_mode,
13342   d_mode,
13343   /* db */
13344   d_mode,
13345   d_mode,
13346   d_mode,
13347   d_mode,
13348   0,
13349   t_mode,
13350   0,
13351   t_mode,
13352   /* dc */
13353   q_mode,
13354   q_mode,
13355   q_mode,
13356   q_mode,
13357   q_mode,
13358   q_mode,
13359   q_mode,
13360   q_mode,
13361   /* dd */
13362   q_mode,
13363   q_mode,
13364   q_mode,
13365   q_mode,
13366   0,
13367   0,
13368   0,
13369   w_mode,
13370   /* de */
13371   w_mode,
13372   w_mode,
13373   w_mode,
13374   w_mode,
13375   w_mode,
13376   w_mode,
13377   w_mode,
13378   w_mode,
13379   /* df */
13380   w_mode,
13381   w_mode,
13382   w_mode,
13383   w_mode,
13384   t_mode,
13385   q_mode,
13386   t_mode,
13387   q_mode
13388 };
13389
13390 #define ST { OP_ST, 0 }
13391 #define STi { OP_STi, 0 }
13392
13393 #define FGRPd9_2 NULL, { { NULL, 0 } }, 0
13394 #define FGRPd9_4 NULL, { { NULL, 1 } }, 0
13395 #define FGRPd9_5 NULL, { { NULL, 2 } }, 0
13396 #define FGRPd9_6 NULL, { { NULL, 3 } }, 0
13397 #define FGRPd9_7 NULL, { { NULL, 4 } }, 0
13398 #define FGRPda_5 NULL, { { NULL, 5 } }, 0
13399 #define FGRPdb_4 NULL, { { NULL, 6 } }, 0
13400 #define FGRPde_3 NULL, { { NULL, 7 } }, 0
13401 #define FGRPdf_4 NULL, { { NULL, 8 } }, 0
13402
13403 static const struct dis386 float_reg[][8] = {
13404   /* d8 */
13405   {
13406     { "fadd",   { ST, STi }, 0 },
13407     { "fmul",   { ST, STi }, 0 },
13408     { "fcom",   { STi }, 0 },
13409     { "fcomp",  { STi }, 0 },
13410     { "fsub",   { ST, STi }, 0 },
13411     { "fsubr",  { ST, STi }, 0 },
13412     { "fdiv",   { ST, STi }, 0 },
13413     { "fdivr",  { ST, STi }, 0 },
13414   },
13415   /* d9 */
13416   {
13417     { "fld",    { STi }, 0 },
13418     { "fxch",   { STi }, 0 },
13419     { FGRPd9_2 },
13420     { Bad_Opcode },
13421     { FGRPd9_4 },
13422     { FGRPd9_5 },
13423     { FGRPd9_6 },
13424     { FGRPd9_7 },
13425   },
13426   /* da */
13427   {
13428     { "fcmovb", { ST, STi }, 0 },
13429     { "fcmove", { ST, STi }, 0 },
13430     { "fcmovbe",{ ST, STi }, 0 },
13431     { "fcmovu", { ST, STi }, 0 },
13432     { Bad_Opcode },
13433     { FGRPda_5 },
13434     { Bad_Opcode },
13435     { Bad_Opcode },
13436   },
13437   /* db */
13438   {
13439     { "fcmovnb",{ ST, STi }, 0 },
13440     { "fcmovne",{ ST, STi }, 0 },
13441     { "fcmovnbe",{ ST, STi }, 0 },
13442     { "fcmovnu",{ ST, STi }, 0 },
13443     { FGRPdb_4 },
13444     { "fucomi", { ST, STi }, 0 },
13445     { "fcomi",  { ST, STi }, 0 },
13446     { Bad_Opcode },
13447   },
13448   /* dc */
13449   {
13450     { "fadd",   { STi, ST }, 0 },
13451     { "fmul",   { STi, ST }, 0 },
13452     { Bad_Opcode },
13453     { Bad_Opcode },
13454     { "fsub!M", { STi, ST }, 0 },
13455     { "fsubM",  { STi, ST }, 0 },
13456     { "fdiv!M", { STi, ST }, 0 },
13457     { "fdivM",  { STi, ST }, 0 },
13458   },
13459   /* dd */
13460   {
13461     { "ffree",  { STi }, 0 },
13462     { Bad_Opcode },
13463     { "fst",    { STi }, 0 },
13464     { "fstp",   { STi }, 0 },
13465     { "fucom",  { STi }, 0 },
13466     { "fucomp", { STi }, 0 },
13467     { Bad_Opcode },
13468     { Bad_Opcode },
13469   },
13470   /* de */
13471   {
13472     { "faddp",  { STi, ST }, 0 },
13473     { "fmulp",  { STi, ST }, 0 },
13474     { Bad_Opcode },
13475     { FGRPde_3 },
13476     { "fsub!Mp", { STi, ST }, 0 },
13477     { "fsubMp", { STi, ST }, 0 },
13478     { "fdiv!Mp", { STi, ST }, 0 },
13479     { "fdivMp", { STi, ST }, 0 },
13480   },
13481   /* df */
13482   {
13483     { "ffreep", { STi }, 0 },
13484     { Bad_Opcode },
13485     { Bad_Opcode },
13486     { Bad_Opcode },
13487     { FGRPdf_4 },
13488     { "fucomip", { ST, STi }, 0 },
13489     { "fcomip", { ST, STi }, 0 },
13490     { Bad_Opcode },
13491   },
13492 };
13493
13494 static char *fgrps[][8] = {
13495   /* d9_2  0 */
13496   {
13497     "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
13498   },
13499
13500   /* d9_4  1 */
13501   {
13502     "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
13503   },
13504
13505   /* d9_5  2 */
13506   {
13507     "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
13508   },
13509
13510   /* d9_6  3 */
13511   {
13512     "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
13513   },
13514
13515   /* d9_7  4 */
13516   {
13517     "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
13518   },
13519
13520   /* da_5  5 */
13521   {
13522     "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
13523   },
13524
13525   /* db_4  6 */
13526   {
13527     "fNeni(8087 only)","fNdisi(8087 only)","fNclex","fNinit",
13528     "fNsetpm(287 only)","frstpm(287 only)","(bad)","(bad)",
13529   },
13530
13531   /* de_3  7 */
13532   {
13533     "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
13534   },
13535
13536   /* df_4  8 */
13537   {
13538     "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
13539   },
13540 };
13541
13542 static void
13543 swap_operand (void)
13544 {
13545   mnemonicendp[0] = '.';
13546   mnemonicendp[1] = 's';
13547   mnemonicendp += 2;
13548 }
13549
13550 static void
13551 OP_Skip_MODRM (int bytemode ATTRIBUTE_UNUSED,
13552                int sizeflag ATTRIBUTE_UNUSED)
13553 {
13554   /* Skip mod/rm byte.  */
13555   MODRM_CHECK;
13556   codep++;
13557 }
13558
13559 static void
13560 dofloat (int sizeflag)
13561 {
13562   const struct dis386 *dp;
13563   unsigned char floatop;
13564
13565   floatop = codep[-1];
13566
13567   if (modrm.mod != 3)
13568     {
13569       int fp_indx = (floatop - 0xd8) * 8 + modrm.reg;
13570
13571       putop (float_mem[fp_indx], sizeflag);
13572       obufp = op_out[0];
13573       op_ad = 2;
13574       OP_E (float_mem_mode[fp_indx], sizeflag);
13575       return;
13576     }
13577   /* Skip mod/rm byte.  */
13578   MODRM_CHECK;
13579   codep++;
13580
13581   dp = &float_reg[floatop - 0xd8][modrm.reg];
13582   if (dp->name == NULL)
13583     {
13584       putop (fgrps[dp->op[0].bytemode][modrm.rm], sizeflag);
13585
13586       /* Instruction fnstsw is only one with strange arg.  */
13587       if (floatop == 0xdf && codep[-1] == 0xe0)
13588         strcpy (op_out[0], names16[0]);
13589     }
13590   else
13591     {
13592       putop (dp->name, sizeflag);
13593
13594       obufp = op_out[0];
13595       op_ad = 2;
13596       if (dp->op[0].rtn)
13597         (*dp->op[0].rtn) (dp->op[0].bytemode, sizeflag);
13598
13599       obufp = op_out[1];
13600       op_ad = 1;
13601       if (dp->op[1].rtn)
13602         (*dp->op[1].rtn) (dp->op[1].bytemode, sizeflag);
13603     }
13604 }
13605
13606 /* Like oappend (below), but S is a string starting with '%'.
13607    In Intel syntax, the '%' is elided.  */
13608 static void
13609 oappend_maybe_intel (const char *s)
13610 {
13611   oappend (s + intel_syntax);
13612 }
13613
13614 static void
13615 OP_ST (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13616 {
13617   oappend_maybe_intel ("%st");
13618 }
13619
13620 static void
13621 OP_STi (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13622 {
13623   sprintf (scratchbuf, "%%st(%d)", modrm.rm);
13624   oappend_maybe_intel (scratchbuf);
13625 }
13626
13627 /* Capital letters in template are macros.  */
13628 static int
13629 putop (const char *in_template, int sizeflag)
13630 {
13631   const char *p;
13632   int alt = 0;
13633   int cond = 1;
13634   unsigned int l = 0, len = 1;
13635   char last[4];
13636
13637 #define SAVE_LAST(c)                    \
13638   if (l < len && l < sizeof (last))     \
13639     last[l++] = c;                      \
13640   else                                  \
13641     abort ();
13642
13643   for (p = in_template; *p; p++)
13644     {
13645       switch (*p)
13646         {
13647         default:
13648           *obufp++ = *p;
13649           break;
13650         case '%':
13651           len++;
13652           break;
13653         case '!':
13654           cond = 0;
13655           break;
13656         case '{':
13657           alt = 0;
13658           if (intel_syntax)
13659             {
13660               while (*++p != '|')
13661                 if (*p == '}' || *p == '\0')
13662                   abort ();
13663             }
13664           /* Fall through.  */
13665         case 'I':
13666           alt = 1;
13667           continue;
13668         case '|':
13669           while (*++p != '}')
13670             {
13671               if (*p == '\0')
13672                 abort ();
13673             }
13674           break;
13675         case '}':
13676           break;
13677         case 'A':
13678           if (intel_syntax)
13679             break;
13680           if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
13681             *obufp++ = 'b';
13682           break;
13683         case 'B':
13684           if (l == 0 && len == 1)
13685             {
13686 case_B:
13687               if (intel_syntax)
13688                 break;
13689               if (sizeflag & SUFFIX_ALWAYS)
13690                 *obufp++ = 'b';
13691             }
13692           else
13693             {
13694               if (l != 1
13695                   || len != 2
13696                   || last[0] != 'L')
13697                 {
13698                   SAVE_LAST (*p);
13699                   break;
13700                 }
13701
13702               if (address_mode == mode_64bit
13703                   && !(prefixes & PREFIX_ADDR))
13704                 {
13705                   *obufp++ = 'a';
13706                   *obufp++ = 'b';
13707                   *obufp++ = 's';
13708                 }
13709
13710               goto case_B;
13711             }
13712           break;
13713         case 'C':
13714           if (intel_syntax && !alt)
13715             break;
13716           if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
13717             {
13718               if (sizeflag & DFLAG)
13719                 *obufp++ = intel_syntax ? 'd' : 'l';
13720               else
13721                 *obufp++ = intel_syntax ? 'w' : 's';
13722               used_prefixes |= (prefixes & PREFIX_DATA);
13723             }
13724           break;
13725         case 'D':
13726           if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
13727             break;
13728           USED_REX (REX_W);
13729           if (modrm.mod == 3)
13730             {
13731               if (rex & REX_W)
13732                 *obufp++ = 'q';
13733               else
13734                 {
13735                   if (sizeflag & DFLAG)
13736                     *obufp++ = intel_syntax ? 'd' : 'l';
13737                   else
13738                     *obufp++ = 'w';
13739                   used_prefixes |= (prefixes & PREFIX_DATA);
13740                 }
13741             }
13742           else
13743             *obufp++ = 'w';
13744           break;
13745         case 'E':               /* For jcxz/jecxz */
13746           if (address_mode == mode_64bit)
13747             {
13748               if (sizeflag & AFLAG)
13749                 *obufp++ = 'r';
13750               else
13751                 *obufp++ = 'e';
13752             }
13753           else
13754             if (sizeflag & AFLAG)
13755               *obufp++ = 'e';
13756           used_prefixes |= (prefixes & PREFIX_ADDR);
13757           break;
13758         case 'F':
13759           if (intel_syntax)
13760             break;
13761           if ((prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS))
13762             {
13763               if (sizeflag & AFLAG)
13764                 *obufp++ = address_mode == mode_64bit ? 'q' : 'l';
13765               else
13766                 *obufp++ = address_mode == mode_64bit ? 'l' : 'w';
13767               used_prefixes |= (prefixes & PREFIX_ADDR);
13768             }
13769           break;
13770         case 'G':
13771           if (intel_syntax || (obufp[-1] != 's' && !(sizeflag & SUFFIX_ALWAYS)))
13772             break;
13773           if ((rex & REX_W) || (sizeflag & DFLAG))
13774             *obufp++ = 'l';
13775           else
13776             *obufp++ = 'w';
13777           if (!(rex & REX_W))
13778             used_prefixes |= (prefixes & PREFIX_DATA);
13779           break;
13780         case 'H':
13781           if (intel_syntax)
13782             break;
13783           if ((prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS
13784               || (prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS)
13785             {
13786               used_prefixes |= prefixes & (PREFIX_CS | PREFIX_DS);
13787               *obufp++ = ',';
13788               *obufp++ = 'p';
13789               if (prefixes & PREFIX_DS)
13790                 *obufp++ = 't';
13791               else
13792                 *obufp++ = 'n';
13793             }
13794           break;
13795         case 'J':
13796           if (intel_syntax)
13797             break;
13798           *obufp++ = 'l';
13799           break;
13800         case 'K':
13801           USED_REX (REX_W);
13802           if (rex & REX_W)
13803             *obufp++ = 'q';
13804           else
13805             *obufp++ = 'd';
13806           break;
13807         case 'Z':
13808           if (intel_syntax)
13809             break;
13810           if (address_mode == mode_64bit && (sizeflag & SUFFIX_ALWAYS))
13811             {
13812               *obufp++ = 'q';
13813               break;
13814             }
13815           /* Fall through.  */
13816           goto case_L;
13817         case 'L':
13818           if (l != 0 || len != 1)
13819             {
13820               SAVE_LAST (*p);
13821               break;
13822             }
13823 case_L:
13824           if (intel_syntax)
13825             break;
13826           if (sizeflag & SUFFIX_ALWAYS)
13827             *obufp++ = 'l';
13828           break;
13829         case 'M':
13830           if (intel_mnemonic != cond)
13831             *obufp++ = 'r';
13832           break;
13833         case 'N':
13834           if ((prefixes & PREFIX_FWAIT) == 0)
13835             *obufp++ = 'n';
13836           else
13837             used_prefixes |= PREFIX_FWAIT;
13838           break;
13839         case 'O':
13840           USED_REX (REX_W);
13841           if (rex & REX_W)
13842             *obufp++ = 'o';
13843           else if (intel_syntax && (sizeflag & DFLAG))
13844             *obufp++ = 'q';
13845           else
13846             *obufp++ = 'd';
13847           if (!(rex & REX_W))
13848             used_prefixes |= (prefixes & PREFIX_DATA);
13849           break;
13850         case 'T':
13851           if (!intel_syntax
13852               && address_mode == mode_64bit
13853               && ((sizeflag & DFLAG) || (rex & REX_W)))
13854             {
13855               *obufp++ = 'q';
13856               break;
13857             }
13858           /* Fall through.  */
13859           goto case_P;
13860         case 'P':
13861           if (l == 0 && len == 1)
13862             {
13863 case_P:
13864               if (intel_syntax)
13865                 {
13866                   if ((rex & REX_W) == 0
13867                       && (prefixes & PREFIX_DATA))
13868                     {
13869                       if ((sizeflag & DFLAG) == 0)
13870                         *obufp++ = 'w';
13871                       used_prefixes |= (prefixes & PREFIX_DATA);
13872                     }
13873                   break;
13874                 }
13875               if ((prefixes & PREFIX_DATA)
13876                   || (rex & REX_W)
13877                   || (sizeflag & SUFFIX_ALWAYS))
13878                 {
13879                   USED_REX (REX_W);
13880                   if (rex & REX_W)
13881                     *obufp++ = 'q';
13882                   else
13883                     {
13884                       if (sizeflag & DFLAG)
13885                         *obufp++ = 'l';
13886                       else
13887                         *obufp++ = 'w';
13888                       used_prefixes |= (prefixes & PREFIX_DATA);
13889                     }
13890                 }
13891             }
13892           else
13893             {
13894               if (l != 1 || len != 2 || last[0] != 'L')
13895                 {
13896                   SAVE_LAST (*p);
13897                   break;
13898                 }
13899
13900               if ((prefixes & PREFIX_DATA)
13901                   || (rex & REX_W)
13902                   || (sizeflag & SUFFIX_ALWAYS))
13903                 {
13904                   USED_REX (REX_W);
13905                   if (rex & REX_W)
13906                     *obufp++ = 'q';
13907                   else
13908                     {
13909                       if (sizeflag & DFLAG)
13910                         *obufp++ = intel_syntax ? 'd' : 'l';
13911                       else
13912                         *obufp++ = 'w';
13913                       used_prefixes |= (prefixes & PREFIX_DATA);
13914                     }
13915                 }
13916             }
13917           break;
13918         case 'U':
13919           if (intel_syntax)
13920             break;
13921           if (address_mode == mode_64bit
13922               && ((sizeflag & DFLAG) || (rex & REX_W)))
13923             {
13924               if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
13925                 *obufp++ = 'q';
13926               break;
13927             }
13928           /* Fall through.  */
13929           goto case_Q;
13930         case 'Q':
13931           if (l == 0 && len == 1)
13932             {
13933 case_Q:
13934               if (intel_syntax && !alt)
13935                 break;
13936               USED_REX (REX_W);
13937               if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
13938                 {
13939                   if (rex & REX_W)
13940                     *obufp++ = 'q';
13941                   else
13942                     {
13943                       if (sizeflag & DFLAG)
13944                         *obufp++ = intel_syntax ? 'd' : 'l';
13945                       else
13946                         *obufp++ = 'w';
13947                       used_prefixes |= (prefixes & PREFIX_DATA);
13948                     }
13949                 }
13950             }
13951           else
13952             {
13953               if (l != 1 || len != 2 || last[0] != 'L')
13954                 {
13955                   SAVE_LAST (*p);
13956                   break;
13957                 }
13958               if (intel_syntax
13959                   || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
13960                 break;
13961               if ((rex & REX_W))
13962                 {
13963                   USED_REX (REX_W);
13964                   *obufp++ = 'q';
13965                 }
13966               else
13967                 *obufp++ = 'l';
13968             }
13969           break;
13970         case 'R':
13971           USED_REX (REX_W);
13972           if (rex & REX_W)
13973             *obufp++ = 'q';
13974           else if (sizeflag & DFLAG)
13975             {
13976               if (intel_syntax)
13977                   *obufp++ = 'd';
13978               else
13979                   *obufp++ = 'l';
13980             }
13981           else
13982             *obufp++ = 'w';
13983           if (intel_syntax && !p[1]
13984               && ((rex & REX_W) || (sizeflag & DFLAG)))
13985             *obufp++ = 'e';
13986           if (!(rex & REX_W))
13987             used_prefixes |= (prefixes & PREFIX_DATA);
13988           break;
13989         case 'V':
13990           if (l == 0 && len == 1)
13991             {
13992               if (intel_syntax)
13993                 break;
13994               if (address_mode == mode_64bit
13995                   && ((sizeflag & DFLAG) || (rex & REX_W)))
13996                 {
13997                   if (sizeflag & SUFFIX_ALWAYS)
13998                     *obufp++ = 'q';
13999                   break;
14000                 }
14001             }
14002           else
14003             {
14004               if (l != 1
14005                   || len != 2
14006                   || last[0] != 'L')
14007                 {
14008                   SAVE_LAST (*p);
14009                   break;
14010                 }
14011
14012               if (rex & REX_W)
14013                 {
14014                   *obufp++ = 'a';
14015                   *obufp++ = 'b';
14016                   *obufp++ = 's';
14017                 }
14018             }
14019           /* Fall through.  */
14020           goto case_S;
14021         case 'S':
14022           if (l == 0 && len == 1)
14023             {
14024 case_S:
14025               if (intel_syntax)
14026                 break;
14027               if (sizeflag & SUFFIX_ALWAYS)
14028                 {
14029                   if (rex & REX_W)
14030                     *obufp++ = 'q';
14031                   else
14032                     {
14033                       if (sizeflag & DFLAG)
14034                         *obufp++ = 'l';
14035                       else
14036                         *obufp++ = 'w';
14037                       used_prefixes |= (prefixes & PREFIX_DATA);
14038                     }
14039                 }
14040             }
14041           else
14042             {
14043               if (l != 1
14044                   || len != 2
14045                   || last[0] != 'L')
14046                 {
14047                   SAVE_LAST (*p);
14048                   break;
14049                 }
14050
14051               if (address_mode == mode_64bit
14052                   && !(prefixes & PREFIX_ADDR))
14053                 {
14054                   *obufp++ = 'a';
14055                   *obufp++ = 'b';
14056                   *obufp++ = 's';
14057                 }
14058
14059               goto case_S;
14060             }
14061           break;
14062         case 'X':
14063           if (l != 0 || len != 1)
14064             {
14065               SAVE_LAST (*p);
14066               break;
14067             }
14068           if (need_vex && vex.prefix)
14069             {
14070               if (vex.prefix == DATA_PREFIX_OPCODE)
14071                 *obufp++ = 'd';
14072               else
14073                 *obufp++ = 's';
14074             }
14075           else
14076             {
14077               if (prefixes & PREFIX_DATA)
14078                 *obufp++ = 'd';
14079               else
14080                 *obufp++ = 's';
14081               used_prefixes |= (prefixes & PREFIX_DATA);
14082             }
14083           break;
14084         case 'Y':
14085           if (l == 0 && len == 1)
14086             {
14087               if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
14088                 break;
14089               if (rex & REX_W)
14090                 {
14091                   USED_REX (REX_W);
14092                   *obufp++ = 'q';
14093                 }
14094               break;
14095             }
14096           else
14097             {
14098               if (l != 1 || len != 2 || last[0] != 'X')
14099                 {
14100                   SAVE_LAST (*p);
14101                   break;
14102                 }
14103               if (!need_vex)
14104                 abort ();
14105               if (intel_syntax
14106                   || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
14107                 break;
14108               switch (vex.length)
14109                 {
14110                 case 128:
14111                   *obufp++ = 'x';
14112                   break;
14113                 case 256:
14114                   *obufp++ = 'y';
14115                   break;
14116                 default:
14117                   abort ();
14118                 }
14119             }
14120           break;
14121         case 'W':
14122           if (l == 0 && len == 1)
14123             {
14124               /* operand size flag for cwtl, cbtw */
14125               USED_REX (REX_W);
14126               if (rex & REX_W)
14127                 {
14128                   if (intel_syntax)
14129                     *obufp++ = 'd';
14130                   else
14131                     *obufp++ = 'l';
14132                 }
14133               else if (sizeflag & DFLAG)
14134                 *obufp++ = 'w';
14135               else
14136                 *obufp++ = 'b';
14137               if (!(rex & REX_W))
14138                 used_prefixes |= (prefixes & PREFIX_DATA);
14139             }
14140           else
14141             {
14142               if (l != 1
14143                   || len != 2
14144                   || (last[0] != 'X'
14145                       && last[0] != 'L'))
14146                 {
14147                   SAVE_LAST (*p);
14148                   break;
14149                 }
14150               if (!need_vex)
14151                 abort ();
14152               if (last[0] == 'X')
14153                 *obufp++ = vex.w ? 'd': 's';
14154               else
14155                 *obufp++ = vex.w ? 'q': 'd';
14156             }
14157           break;
14158         }
14159       alt = 0;
14160     }
14161   *obufp = 0;
14162   mnemonicendp = obufp;
14163   return 0;
14164 }
14165
14166 static void
14167 oappend (const char *s)
14168 {
14169   obufp = stpcpy (obufp, s);
14170 }
14171
14172 static void
14173 append_seg (void)
14174 {
14175   /* Only print the active segment register.  */
14176   if (!active_seg_prefix)
14177     return;
14178
14179   used_prefixes |= active_seg_prefix;
14180   switch (active_seg_prefix)
14181     {
14182     case PREFIX_CS:
14183       oappend_maybe_intel ("%cs:");
14184       break;
14185     case PREFIX_DS:
14186       oappend_maybe_intel ("%ds:");
14187       break;
14188     case PREFIX_SS:
14189       oappend_maybe_intel ("%ss:");
14190       break;
14191     case PREFIX_ES:
14192       oappend_maybe_intel ("%es:");
14193       break;
14194     case PREFIX_FS:
14195       oappend_maybe_intel ("%fs:");
14196       break;
14197     case PREFIX_GS:
14198       oappend_maybe_intel ("%gs:");
14199       break;
14200     default:
14201       break;
14202     }
14203 }
14204
14205 static void
14206 OP_indirE (int bytemode, int sizeflag)
14207 {
14208   if (!intel_syntax)
14209     oappend ("*");
14210   OP_E (bytemode, sizeflag);
14211 }
14212
14213 static void
14214 print_operand_value (char *buf, int hex, bfd_vma disp)
14215 {
14216   if (address_mode == mode_64bit)
14217     {
14218       if (hex)
14219         {
14220           char tmp[30];
14221           int i;
14222           buf[0] = '0';
14223           buf[1] = 'x';
14224           sprintf_vma (tmp, disp);
14225           for (i = 0; tmp[i] == '0' && tmp[i + 1]; i++);
14226           strcpy (buf + 2, tmp + i);
14227         }
14228       else
14229         {
14230           bfd_signed_vma v = disp;
14231           char tmp[30];
14232           int i;
14233           if (v < 0)
14234             {
14235               *(buf++) = '-';
14236               v = -disp;
14237               /* Check for possible overflow on 0x8000000000000000.  */
14238               if (v < 0)
14239                 {
14240                   strcpy (buf, "9223372036854775808");
14241                   return;
14242                 }
14243             }
14244           if (!v)
14245             {
14246               strcpy (buf, "0");
14247               return;
14248             }
14249
14250           i = 0;
14251           tmp[29] = 0;
14252           while (v)
14253             {
14254               tmp[28 - i] = (v % 10) + '0';
14255               v /= 10;
14256               i++;
14257             }
14258           strcpy (buf, tmp + 29 - i);
14259         }
14260     }
14261   else
14262     {
14263       if (hex)
14264         sprintf (buf, "0x%x", (unsigned int) disp);
14265       else
14266         sprintf (buf, "%d", (int) disp);
14267     }
14268 }
14269
14270 /* Put DISP in BUF as signed hex number.  */
14271
14272 static void
14273 print_displacement (char *buf, bfd_vma disp)
14274 {
14275   bfd_signed_vma val = disp;
14276   char tmp[30];
14277   int i, j = 0;
14278
14279   if (val < 0)
14280     {
14281       buf[j++] = '-';
14282       val = -disp;
14283
14284       /* Check for possible overflow.  */
14285       if (val < 0)
14286         {
14287           switch (address_mode)
14288             {
14289             case mode_64bit:
14290               strcpy (buf + j, "0x8000000000000000");
14291               break;
14292             case mode_32bit:
14293               strcpy (buf + j, "0x80000000");
14294               break;
14295             case mode_16bit:
14296               strcpy (buf + j, "0x8000");
14297               break;
14298             }
14299           return;
14300         }
14301     }
14302
14303   buf[j++] = '0';
14304   buf[j++] = 'x';
14305
14306   sprintf_vma (tmp, (bfd_vma) val);
14307   for (i = 0; tmp[i] == '0'; i++)
14308     continue;
14309   if (tmp[i] == '\0')
14310     i--;
14311   strcpy (buf + j, tmp + i);
14312 }
14313
14314 static void
14315 intel_operand_size (int bytemode, int sizeflag)
14316 {
14317   if (vex.evex
14318       && vex.b
14319       && (bytemode == x_mode
14320           || bytemode == evex_half_bcst_xmmq_mode))
14321     {
14322       if (vex.w)
14323         oappend ("QWORD PTR ");
14324       else
14325         oappend ("DWORD PTR ");
14326       return;
14327     }
14328   switch (bytemode)
14329     {
14330     case b_mode:
14331     case b_swap_mode:
14332     case dqb_mode:
14333     case db_mode:
14334       oappend ("BYTE PTR ");
14335       break;
14336     case w_mode:
14337     case dw_mode:
14338     case dqw_mode:
14339     case dqw_swap_mode:
14340       oappend ("WORD PTR ");
14341       break;
14342     case stack_v_mode:
14343       if (address_mode == mode_64bit && ((sizeflag & DFLAG) || (rex & REX_W)))
14344         {
14345           oappend ("QWORD PTR ");
14346           break;
14347         }
14348       /* FALLTHRU */
14349     case v_mode:
14350     case v_swap_mode:
14351     case dq_mode:
14352       USED_REX (REX_W);
14353       if (rex & REX_W)
14354         oappend ("QWORD PTR ");
14355       else
14356         {
14357           if ((sizeflag & DFLAG) || bytemode == dq_mode)
14358             oappend ("DWORD PTR ");
14359           else
14360             oappend ("WORD PTR ");
14361           used_prefixes |= (prefixes & PREFIX_DATA);
14362         }
14363       break;
14364     case z_mode:
14365       if ((rex & REX_W) || (sizeflag & DFLAG))
14366         *obufp++ = 'D';
14367       oappend ("WORD PTR ");
14368       if (!(rex & REX_W))
14369         used_prefixes |= (prefixes & PREFIX_DATA);
14370       break;
14371     case a_mode:
14372       if (sizeflag & DFLAG)
14373         oappend ("QWORD PTR ");
14374       else
14375         oappend ("DWORD PTR ");
14376       used_prefixes |= (prefixes & PREFIX_DATA);
14377       break;
14378     case d_mode:
14379     case d_scalar_mode:
14380     case d_scalar_swap_mode:
14381     case d_swap_mode:
14382     case dqd_mode:
14383       oappend ("DWORD PTR ");
14384       break;
14385     case q_mode:
14386     case q_scalar_mode:
14387     case q_scalar_swap_mode:
14388     case q_swap_mode:
14389       oappend ("QWORD PTR ");
14390       break;
14391     case m_mode:
14392       if (address_mode == mode_64bit)
14393         oappend ("QWORD PTR ");
14394       else
14395         oappend ("DWORD PTR ");
14396       break;
14397     case f_mode:
14398       if (sizeflag & DFLAG)
14399         oappend ("FWORD PTR ");
14400       else
14401         oappend ("DWORD PTR ");
14402       used_prefixes |= (prefixes & PREFIX_DATA);
14403       break;
14404     case t_mode:
14405       oappend ("TBYTE PTR ");
14406       break;
14407     case x_mode:
14408     case x_swap_mode:
14409     case evex_x_gscat_mode:
14410     case evex_x_nobcst_mode:
14411       if (need_vex)
14412         {
14413           switch (vex.length)
14414             {
14415             case 128:
14416               oappend ("XMMWORD PTR ");
14417               break;
14418             case 256:
14419               oappend ("YMMWORD PTR ");
14420               break;
14421             case 512:
14422               oappend ("ZMMWORD PTR ");
14423               break;
14424             default:
14425               abort ();
14426             }
14427         }
14428       else
14429         oappend ("XMMWORD PTR ");
14430       break;
14431     case xmm_mode:
14432       oappend ("XMMWORD PTR ");
14433       break;
14434     case ymm_mode:
14435       oappend ("YMMWORD PTR ");
14436       break;
14437     case xmmq_mode:
14438     case evex_half_bcst_xmmq_mode:
14439       if (!need_vex)
14440         abort ();
14441
14442       switch (vex.length)
14443         {
14444         case 128:
14445           oappend ("QWORD PTR ");
14446           break;
14447         case 256:
14448           oappend ("XMMWORD PTR ");
14449           break;
14450         case 512:
14451           oappend ("YMMWORD PTR ");
14452           break;
14453         default:
14454           abort ();
14455         }
14456       break;
14457     case xmm_mb_mode:
14458       if (!need_vex)
14459         abort ();
14460
14461       switch (vex.length)
14462         {
14463         case 128:
14464         case 256:
14465         case 512:
14466           oappend ("BYTE PTR ");
14467           break;
14468         default:
14469           abort ();
14470         }
14471       break;
14472     case xmm_mw_mode:
14473       if (!need_vex)
14474         abort ();
14475
14476       switch (vex.length)
14477         {
14478         case 128:
14479         case 256:
14480         case 512:
14481           oappend ("WORD PTR ");
14482           break;
14483         default:
14484           abort ();
14485         }
14486       break;
14487     case xmm_md_mode:
14488       if (!need_vex)
14489         abort ();
14490
14491       switch (vex.length)
14492         {
14493         case 128:
14494         case 256:
14495         case 512:
14496           oappend ("DWORD PTR ");
14497           break;
14498         default:
14499           abort ();
14500         }
14501       break;
14502     case xmm_mq_mode:
14503       if (!need_vex)
14504         abort ();
14505
14506       switch (vex.length)
14507         {
14508         case 128:
14509         case 256:
14510         case 512:
14511           oappend ("QWORD PTR ");
14512           break;
14513         default:
14514           abort ();
14515         }
14516       break;
14517     case xmmdw_mode:
14518       if (!need_vex)
14519         abort ();
14520
14521       switch (vex.length)
14522         {
14523         case 128:
14524           oappend ("WORD PTR ");
14525           break;
14526         case 256:
14527           oappend ("DWORD PTR ");
14528           break;
14529         case 512:
14530           oappend ("QWORD PTR ");
14531           break;
14532         default:
14533           abort ();
14534         }
14535       break;
14536     case xmmqd_mode:
14537       if (!need_vex)
14538         abort ();
14539
14540       switch (vex.length)
14541         {
14542         case 128:
14543           oappend ("DWORD PTR ");
14544           break;
14545         case 256:
14546           oappend ("QWORD PTR ");
14547           break;
14548         case 512:
14549           oappend ("XMMWORD PTR ");
14550           break;
14551         default:
14552           abort ();
14553         }
14554       break;
14555     case ymmq_mode:
14556       if (!need_vex)
14557         abort ();
14558
14559       switch (vex.length)
14560         {
14561         case 128:
14562           oappend ("QWORD PTR ");
14563           break;
14564         case 256:
14565           oappend ("YMMWORD PTR ");
14566           break;
14567         case 512:
14568           oappend ("ZMMWORD PTR ");
14569           break;
14570         default:
14571           abort ();
14572         }
14573       break;
14574     case ymmxmm_mode:
14575       if (!need_vex)
14576         abort ();
14577
14578       switch (vex.length)
14579         {
14580         case 128:
14581         case 256:
14582           oappend ("XMMWORD PTR ");
14583           break;
14584         default:
14585           abort ();
14586         }
14587       break;
14588     case o_mode:
14589       oappend ("OWORD PTR ");
14590       break;
14591     case xmm_mdq_mode:
14592     case vex_w_dq_mode:
14593     case vex_scalar_w_dq_mode:
14594       if (!need_vex)
14595         abort ();
14596
14597       if (vex.w)
14598         oappend ("QWORD PTR ");
14599       else
14600         oappend ("DWORD PTR ");
14601       break;
14602     case vex_vsib_d_w_dq_mode:
14603     case vex_vsib_q_w_dq_mode:
14604       if (!need_vex)
14605         abort ();
14606
14607       if (!vex.evex)
14608         {
14609           if (vex.w)
14610             oappend ("QWORD PTR ");
14611           else
14612             oappend ("DWORD PTR ");
14613         }
14614       else
14615         {
14616           switch (vex.length)
14617             {
14618             case 128:
14619               oappend ("XMMWORD PTR ");
14620               break;
14621             case 256:
14622               oappend ("YMMWORD PTR ");
14623               break;
14624             case 512:
14625               oappend ("ZMMWORD PTR ");
14626               break;
14627             default:
14628               abort ();
14629             }
14630         }
14631       break;
14632     case vex_vsib_q_w_d_mode:
14633     case vex_vsib_d_w_d_mode:
14634       if (!need_vex || !vex.evex)
14635         abort ();
14636
14637       switch (vex.length)
14638         {
14639         case 128:
14640           oappend ("QWORD PTR ");
14641           break;
14642         case 256:
14643           oappend ("XMMWORD PTR ");
14644           break;
14645         case 512:
14646           oappend ("YMMWORD PTR ");
14647           break;
14648         default:
14649           abort ();
14650         }
14651
14652       break;
14653     case mask_bd_mode:
14654       if (!need_vex || vex.length != 128)
14655         abort ();
14656       if (vex.w)
14657         oappend ("DWORD PTR ");
14658       else
14659         oappend ("BYTE PTR ");
14660       break;
14661     case mask_mode:
14662       if (!need_vex)
14663         abort ();
14664       if (vex.w)
14665         oappend ("QWORD PTR ");
14666       else
14667         oappend ("WORD PTR ");
14668       break;
14669     case v_bnd_mode:
14670     default:
14671       break;
14672     }
14673 }
14674
14675 static void
14676 OP_E_register (int bytemode, int sizeflag)
14677 {
14678   int reg = modrm.rm;
14679   const char **names;
14680
14681   USED_REX (REX_B);
14682   if ((rex & REX_B))
14683     reg += 8;
14684
14685   if ((sizeflag & SUFFIX_ALWAYS)
14686       && (bytemode == b_swap_mode
14687           || bytemode == v_swap_mode
14688           || bytemode == dqw_swap_mode))
14689     swap_operand ();
14690
14691   switch (bytemode)
14692     {
14693     case b_mode:
14694     case b_swap_mode:
14695       USED_REX (0);
14696       if (rex)
14697         names = names8rex;
14698       else
14699         names = names8;
14700       break;
14701     case w_mode:
14702       names = names16;
14703       break;
14704     case d_mode:
14705     case dw_mode:
14706     case db_mode:
14707       names = names32;
14708       break;
14709     case q_mode:
14710       names = names64;
14711       break;
14712     case m_mode:
14713     case v_bnd_mode:
14714       names = address_mode == mode_64bit ? names64 : names32;
14715       break;
14716     case bnd_mode:
14717       names = names_bnd;
14718       break;
14719     case stack_v_mode:
14720       if (address_mode == mode_64bit && ((sizeflag & DFLAG) || (rex & REX_W)))
14721         {
14722           names = names64;
14723           break;
14724         }
14725       bytemode = v_mode;
14726       /* FALLTHRU */
14727     case v_mode:
14728     case v_swap_mode:
14729     case dq_mode:
14730     case dqb_mode:
14731     case dqd_mode:
14732     case dqw_mode:
14733     case dqw_swap_mode:
14734       USED_REX (REX_W);
14735       if (rex & REX_W)
14736         names = names64;
14737       else
14738         {
14739           if ((sizeflag & DFLAG)
14740               || (bytemode != v_mode
14741                   && bytemode != v_swap_mode))
14742             names = names32;
14743           else
14744             names = names16;
14745           used_prefixes |= (prefixes & PREFIX_DATA);
14746         }
14747       break;
14748     case mask_bd_mode:
14749     case mask_mode:
14750       names = names_mask;
14751       break;
14752     case 0:
14753       return;
14754     default:
14755       oappend (INTERNAL_DISASSEMBLER_ERROR);
14756       return;
14757     }
14758   oappend (names[reg]);
14759 }
14760
14761 static void
14762 OP_E_memory (int bytemode, int sizeflag)
14763 {
14764   bfd_vma disp = 0;
14765   int add = (rex & REX_B) ? 8 : 0;
14766   int riprel = 0;
14767   int shift;
14768
14769   if (vex.evex)
14770     {
14771       /* In EVEX, if operand doesn't allow broadcast, vex.b should be 0.  */
14772       if (vex.b
14773           && bytemode != x_mode
14774           && bytemode != xmmq_mode
14775           && bytemode != evex_half_bcst_xmmq_mode)
14776         {
14777           BadOp ();
14778           return;
14779         }
14780       switch (bytemode)
14781         {
14782         case dqw_mode:
14783         case dw_mode:
14784         case dqw_swap_mode:
14785           shift = 1;
14786           break;
14787         case dqb_mode:
14788         case db_mode:
14789           shift = 0;
14790           break;
14791         case vex_vsib_d_w_dq_mode:
14792         case vex_vsib_d_w_d_mode:
14793         case vex_vsib_q_w_dq_mode:
14794         case vex_vsib_q_w_d_mode:
14795         case evex_x_gscat_mode:
14796         case xmm_mdq_mode:
14797           shift = vex.w ? 3 : 2;
14798           break;
14799         case x_mode:
14800         case evex_half_bcst_xmmq_mode:
14801         case xmmq_mode:
14802           if (vex.b)
14803             {
14804               shift = vex.w ? 3 : 2;
14805               break;
14806             }
14807           /* Fall through if vex.b == 0.  */
14808         case xmmqd_mode:
14809         case xmmdw_mode:
14810         case ymmq_mode:
14811         case evex_x_nobcst_mode:
14812         case x_swap_mode:
14813           switch (vex.length)
14814             {
14815             case 128:
14816               shift = 4;
14817               break;
14818             case 256:
14819               shift = 5;
14820               break;
14821             case 512:
14822               shift = 6;
14823               break;
14824             default:
14825               abort ();
14826             }
14827           break;
14828         case ymm_mode:
14829           shift = 5;
14830           break;
14831         case xmm_mode:
14832           shift = 4;
14833           break;
14834         case xmm_mq_mode:
14835         case q_mode:
14836         case q_scalar_mode:
14837         case q_swap_mode:
14838         case q_scalar_swap_mode:
14839           shift = 3;
14840           break;
14841         case dqd_mode:
14842         case xmm_md_mode:
14843         case d_mode:
14844         case d_scalar_mode:
14845         case d_swap_mode:
14846         case d_scalar_swap_mode:
14847           shift = 2;
14848           break;
14849         case xmm_mw_mode:
14850           shift = 1;
14851           break;
14852         case xmm_mb_mode:
14853           shift = 0;
14854           break;
14855         default:
14856           abort ();
14857         }
14858       /* Make necessary corrections to shift for modes that need it.
14859          For these modes we currently have shift 4, 5 or 6 depending on
14860          vex.length (it corresponds to xmmword, ymmword or zmmword
14861          operand).  We might want to make it 3, 4 or 5 (e.g. for
14862          xmmq_mode).  In case of broadcast enabled the corrections
14863          aren't needed, as element size is always 32 or 64 bits.  */
14864       if (!vex.b
14865           && (bytemode == xmmq_mode
14866               || bytemode == evex_half_bcst_xmmq_mode))
14867         shift -= 1;
14868       else if (bytemode == xmmqd_mode)
14869         shift -= 2;
14870       else if (bytemode == xmmdw_mode)
14871         shift -= 3;
14872       else if (bytemode == ymmq_mode && vex.length == 128)
14873         shift -= 1;
14874     }
14875   else
14876     shift = 0;
14877
14878   USED_REX (REX_B);
14879   if (intel_syntax)
14880     intel_operand_size (bytemode, sizeflag);
14881   append_seg ();
14882
14883   if ((sizeflag & AFLAG) || address_mode == mode_64bit)
14884     {
14885       /* 32/64 bit address mode */
14886       int havedisp;
14887       int havesib;
14888       int havebase;
14889       int haveindex;
14890       int needindex;
14891       int base, rbase;
14892       int vindex = 0;
14893       int scale = 0;
14894       int addr32flag = !((sizeflag & AFLAG)
14895                          || bytemode == v_bnd_mode
14896                          || bytemode == bnd_mode);
14897       const char **indexes64 = names64;
14898       const char **indexes32 = names32;
14899
14900       havesib = 0;
14901       havebase = 1;
14902       haveindex = 0;
14903       base = modrm.rm;
14904
14905       if (base == 4)
14906         {
14907           havesib = 1;
14908           vindex = sib.index;
14909           USED_REX (REX_X);
14910           if (rex & REX_X)
14911             vindex += 8;
14912           switch (bytemode)
14913             {
14914             case vex_vsib_d_w_dq_mode:
14915             case vex_vsib_d_w_d_mode:
14916             case vex_vsib_q_w_dq_mode:
14917             case vex_vsib_q_w_d_mode:
14918               if (!need_vex)
14919                 abort ();
14920               if (vex.evex)
14921                 {
14922                   if (!vex.v)
14923                     vindex += 16;
14924                 }
14925
14926               haveindex = 1;
14927               switch (vex.length)
14928                 {
14929                 case 128:
14930                   indexes64 = indexes32 = names_xmm;
14931                   break;
14932                 case 256:
14933                   if (!vex.w
14934                       || bytemode == vex_vsib_q_w_dq_mode
14935                       || bytemode == vex_vsib_q_w_d_mode)
14936                     indexes64 = indexes32 = names_ymm;
14937                   else
14938                     indexes64 = indexes32 = names_xmm;
14939                   break;
14940                 case 512:
14941                   if (!vex.w
14942                       || bytemode == vex_vsib_q_w_dq_mode
14943                       || bytemode == vex_vsib_q_w_d_mode)
14944                     indexes64 = indexes32 = names_zmm;
14945                   else
14946                     indexes64 = indexes32 = names_ymm;
14947                   break;
14948                 default:
14949                   abort ();
14950                 }
14951               break;
14952             default:
14953               haveindex = vindex != 4;
14954               break;
14955             }
14956           scale = sib.scale;
14957           base = sib.base;
14958           codep++;
14959         }
14960       rbase = base + add;
14961
14962       switch (modrm.mod)
14963         {
14964         case 0:
14965           if (base == 5)
14966             {
14967               havebase = 0;
14968               if (address_mode == mode_64bit && !havesib)
14969                 riprel = 1;
14970               disp = get32s ();
14971             }
14972           break;
14973         case 1:
14974           FETCH_DATA (the_info, codep + 1);
14975           disp = *codep++;
14976           if ((disp & 0x80) != 0)
14977             disp -= 0x100;
14978           if (vex.evex && shift > 0)
14979             disp <<= shift;
14980           break;
14981         case 2:
14982           disp = get32s ();
14983           break;
14984         }
14985
14986       /* In 32bit mode, we need index register to tell [offset] from
14987          [eiz*1 + offset].  */
14988       needindex = (havesib
14989                    && !havebase
14990                    && !haveindex
14991                    && address_mode == mode_32bit);
14992       havedisp = (havebase
14993                   || needindex
14994                   || (havesib && (haveindex || scale != 0)));
14995
14996       if (!intel_syntax)
14997         if (modrm.mod != 0 || base == 5)
14998           {
14999             if (havedisp || riprel)
15000               print_displacement (scratchbuf, disp);
15001             else
15002               print_operand_value (scratchbuf, 1, disp);
15003             oappend (scratchbuf);
15004             if (riprel)
15005               {
15006                 set_op (disp, 1);
15007                 oappend (sizeflag & AFLAG ? "(%rip)" : "(%eip)");
15008               }
15009           }
15010
15011       if ((havebase || haveindex || riprel)
15012           && (bytemode != v_bnd_mode)
15013           && (bytemode != bnd_mode))
15014         used_prefixes |= PREFIX_ADDR;
15015
15016       if (havedisp || (intel_syntax && riprel))
15017         {
15018           *obufp++ = open_char;
15019           if (intel_syntax && riprel)
15020             {
15021               set_op (disp, 1);
15022               oappend (sizeflag & AFLAG ? "rip" : "eip");
15023             }
15024           *obufp = '\0';
15025           if (havebase)
15026             oappend (address_mode == mode_64bit && !addr32flag
15027                      ? names64[rbase] : names32[rbase]);
15028           if (havesib)
15029             {
15030               /* ESP/RSP won't allow index.  If base isn't ESP/RSP,
15031                  print index to tell base + index from base.  */
15032               if (scale != 0
15033                   || needindex
15034                   || haveindex
15035                   || (havebase && base != ESP_REG_NUM))
15036                 {
15037                   if (!intel_syntax || havebase)
15038                     {
15039                       *obufp++ = separator_char;
15040                       *obufp = '\0';
15041                     }
15042                   if (haveindex)
15043                     oappend (address_mode == mode_64bit && !addr32flag
15044                              ? indexes64[vindex] : indexes32[vindex]);
15045                   else
15046                     oappend (address_mode == mode_64bit && !addr32flag
15047                              ? index64 : index32);
15048
15049                   *obufp++ = scale_char;
15050                   *obufp = '\0';
15051                   sprintf (scratchbuf, "%d", 1 << scale);
15052                   oappend (scratchbuf);
15053                 }
15054             }
15055           if (intel_syntax
15056               && (disp || modrm.mod != 0 || base == 5))
15057             {
15058               if (!havedisp || (bfd_signed_vma) disp >= 0)
15059                 {
15060                   *obufp++ = '+';
15061                   *obufp = '\0';
15062                 }
15063               else if (modrm.mod != 1 && disp != -disp)
15064                 {
15065                   *obufp++ = '-';
15066                   *obufp = '\0';
15067                   disp = - (bfd_signed_vma) disp;
15068                 }
15069
15070               if (havedisp)
15071                 print_displacement (scratchbuf, disp);
15072               else
15073                 print_operand_value (scratchbuf, 1, disp);
15074               oappend (scratchbuf);
15075             }
15076
15077           *obufp++ = close_char;
15078           *obufp = '\0';
15079         }
15080       else if (intel_syntax)
15081         {
15082           if (modrm.mod != 0 || base == 5)
15083             {
15084               if (!active_seg_prefix)
15085                 {
15086                   oappend (names_seg[ds_reg - es_reg]);
15087                   oappend (":");
15088                 }
15089               print_operand_value (scratchbuf, 1, disp);
15090               oappend (scratchbuf);
15091             }
15092         }
15093     }
15094   else
15095     {
15096       /* 16 bit address mode */
15097       used_prefixes |= prefixes & PREFIX_ADDR;
15098       switch (modrm.mod)
15099         {
15100         case 0:
15101           if (modrm.rm == 6)
15102             {
15103               disp = get16 ();
15104               if ((disp & 0x8000) != 0)
15105                 disp -= 0x10000;
15106             }
15107           break;
15108         case 1:
15109           FETCH_DATA (the_info, codep + 1);
15110           disp = *codep++;
15111           if ((disp & 0x80) != 0)
15112             disp -= 0x100;
15113           break;
15114         case 2:
15115           disp = get16 ();
15116           if ((disp & 0x8000) != 0)
15117             disp -= 0x10000;
15118           break;
15119         }
15120
15121       if (!intel_syntax)
15122         if (modrm.mod != 0 || modrm.rm == 6)
15123           {
15124             print_displacement (scratchbuf, disp);
15125             oappend (scratchbuf);
15126           }
15127
15128       if (modrm.mod != 0 || modrm.rm != 6)
15129         {
15130           *obufp++ = open_char;
15131           *obufp = '\0';
15132           oappend (index16[modrm.rm]);
15133           if (intel_syntax
15134               && (disp || modrm.mod != 0 || modrm.rm == 6))
15135             {
15136               if ((bfd_signed_vma) disp >= 0)
15137                 {
15138                   *obufp++ = '+';
15139                   *obufp = '\0';
15140                 }
15141               else if (modrm.mod != 1)
15142                 {
15143                   *obufp++ = '-';
15144                   *obufp = '\0';
15145                   disp = - (bfd_signed_vma) disp;
15146                 }
15147
15148               print_displacement (scratchbuf, disp);
15149               oappend (scratchbuf);
15150             }
15151
15152           *obufp++ = close_char;
15153           *obufp = '\0';
15154         }
15155       else if (intel_syntax)
15156         {
15157           if (!active_seg_prefix)
15158             {
15159               oappend (names_seg[ds_reg - es_reg]);
15160               oappend (":");
15161             }
15162           print_operand_value (scratchbuf, 1, disp & 0xffff);
15163           oappend (scratchbuf);
15164         }
15165     }
15166   if (vex.evex && vex.b
15167       && (bytemode == x_mode
15168           || bytemode == xmmq_mode
15169           || bytemode == evex_half_bcst_xmmq_mode))
15170     {
15171       if (vex.w
15172           || bytemode == xmmq_mode
15173           || bytemode == evex_half_bcst_xmmq_mode)
15174         {
15175           switch (vex.length)
15176             {
15177             case 128:
15178               oappend ("{1to2}");
15179               break;
15180             case 256:
15181               oappend ("{1to4}");
15182               break;
15183             case 512:
15184               oappend ("{1to8}");
15185               break;
15186             default:
15187               abort ();
15188             }
15189         }
15190       else
15191         {
15192           switch (vex.length)
15193             {
15194             case 128:
15195               oappend ("{1to4}");
15196               break;
15197             case 256:
15198               oappend ("{1to8}");
15199               break;
15200             case 512:
15201               oappend ("{1to16}");
15202               break;
15203             default:
15204               abort ();
15205             }
15206         }
15207     }
15208 }
15209
15210 static void
15211 OP_E (int bytemode, int sizeflag)
15212 {
15213   /* Skip mod/rm byte.  */
15214   MODRM_CHECK;
15215   codep++;
15216
15217   if (modrm.mod == 3)
15218     OP_E_register (bytemode, sizeflag);
15219   else
15220     OP_E_memory (bytemode, sizeflag);
15221 }
15222
15223 static void
15224 OP_G (int bytemode, int sizeflag)
15225 {
15226   int add = 0;
15227   USED_REX (REX_R);
15228   if (rex & REX_R)
15229     add += 8;
15230   switch (bytemode)
15231     {
15232     case b_mode:
15233       USED_REX (0);
15234       if (rex)
15235         oappend (names8rex[modrm.reg + add]);
15236       else
15237         oappend (names8[modrm.reg + add]);
15238       break;
15239     case w_mode:
15240       oappend (names16[modrm.reg + add]);
15241       break;
15242     case d_mode:
15243     case db_mode:
15244     case dw_mode:
15245       oappend (names32[modrm.reg + add]);
15246       break;
15247     case q_mode:
15248       oappend (names64[modrm.reg + add]);
15249       break;
15250     case bnd_mode:
15251       oappend (names_bnd[modrm.reg]);
15252       break;
15253     case v_mode:
15254     case dq_mode:
15255     case dqb_mode:
15256     case dqd_mode:
15257     case dqw_mode:
15258     case dqw_swap_mode:
15259       USED_REX (REX_W);
15260       if (rex & REX_W)
15261         oappend (names64[modrm.reg + add]);
15262       else
15263         {
15264           if ((sizeflag & DFLAG) || bytemode != v_mode)
15265             oappend (names32[modrm.reg + add]);
15266           else
15267             oappend (names16[modrm.reg + add]);
15268           used_prefixes |= (prefixes & PREFIX_DATA);
15269         }
15270       break;
15271     case m_mode:
15272       if (address_mode == mode_64bit)
15273         oappend (names64[modrm.reg + add]);
15274       else
15275         oappend (names32[modrm.reg + add]);
15276       break;
15277     case mask_bd_mode:
15278     case mask_mode:
15279       oappend (names_mask[modrm.reg + add]);
15280       break;
15281     default:
15282       oappend (INTERNAL_DISASSEMBLER_ERROR);
15283       break;
15284     }
15285 }
15286
15287 static bfd_vma
15288 get64 (void)
15289 {
15290   bfd_vma x;
15291 #ifdef BFD64
15292   unsigned int a;
15293   unsigned int b;
15294
15295   FETCH_DATA (the_info, codep + 8);
15296   a = *codep++ & 0xff;
15297   a |= (*codep++ & 0xff) << 8;
15298   a |= (*codep++ & 0xff) << 16;
15299   a |= (*codep++ & 0xff) << 24;
15300   b = *codep++ & 0xff;
15301   b |= (*codep++ & 0xff) << 8;
15302   b |= (*codep++ & 0xff) << 16;
15303   b |= (*codep++ & 0xff) << 24;
15304   x = a + ((bfd_vma) b << 32);
15305 #else
15306   abort ();
15307   x = 0;
15308 #endif
15309   return x;
15310 }
15311
15312 static bfd_signed_vma
15313 get32 (void)
15314 {
15315   bfd_signed_vma x = 0;
15316
15317   FETCH_DATA (the_info, codep + 4);
15318   x = *codep++ & (bfd_signed_vma) 0xff;
15319   x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
15320   x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
15321   x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
15322   return x;
15323 }
15324
15325 static bfd_signed_vma
15326 get32s (void)
15327 {
15328   bfd_signed_vma x = 0;
15329
15330   FETCH_DATA (the_info, codep + 4);
15331   x = *codep++ & (bfd_signed_vma) 0xff;
15332   x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
15333   x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
15334   x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
15335
15336   x = (x ^ ((bfd_signed_vma) 1 << 31)) - ((bfd_signed_vma) 1 << 31);
15337
15338   return x;
15339 }
15340
15341 static int
15342 get16 (void)
15343 {
15344   int x = 0;
15345
15346   FETCH_DATA (the_info, codep + 2);
15347   x = *codep++ & 0xff;
15348   x |= (*codep++ & 0xff) << 8;
15349   return x;
15350 }
15351
15352 static void
15353 set_op (bfd_vma op, int riprel)
15354 {
15355   op_index[op_ad] = op_ad;
15356   if (address_mode == mode_64bit)
15357     {
15358       op_address[op_ad] = op;
15359       op_riprel[op_ad] = riprel;
15360     }
15361   else
15362     {
15363       /* Mask to get a 32-bit address.  */
15364       op_address[op_ad] = op & 0xffffffff;
15365       op_riprel[op_ad] = riprel & 0xffffffff;
15366     }
15367 }
15368
15369 static void
15370 OP_REG (int code, int sizeflag)
15371 {
15372   const char *s;
15373   int add;
15374
15375   switch (code)
15376     {
15377     case es_reg: case ss_reg: case cs_reg:
15378     case ds_reg: case fs_reg: case gs_reg:
15379       oappend (names_seg[code - es_reg]);
15380       return;
15381     }
15382
15383   USED_REX (REX_B);
15384   if (rex & REX_B)
15385     add = 8;
15386   else
15387     add = 0;
15388
15389   switch (code)
15390     {
15391     case ax_reg: case cx_reg: case dx_reg: case bx_reg:
15392     case sp_reg: case bp_reg: case si_reg: case di_reg:
15393       s = names16[code - ax_reg + add];
15394       break;
15395     case al_reg: case ah_reg: case cl_reg: case ch_reg:
15396     case dl_reg: case dh_reg: case bl_reg: case bh_reg:
15397       USED_REX (0);
15398       if (rex)
15399         s = names8rex[code - al_reg + add];
15400       else
15401         s = names8[code - al_reg];
15402       break;
15403     case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
15404     case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
15405       if (address_mode == mode_64bit
15406           && ((sizeflag & DFLAG) || (rex & REX_W)))
15407         {
15408           s = names64[code - rAX_reg + add];
15409           break;
15410         }
15411       code += eAX_reg - rAX_reg;
15412       /* Fall through.  */
15413     case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
15414     case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
15415       USED_REX (REX_W);
15416       if (rex & REX_W)
15417         s = names64[code - eAX_reg + add];
15418       else
15419         {
15420           if (sizeflag & DFLAG)
15421             s = names32[code - eAX_reg + add];
15422           else
15423             s = names16[code - eAX_reg + add];
15424           used_prefixes |= (prefixes & PREFIX_DATA);
15425         }
15426       break;
15427     default:
15428       s = INTERNAL_DISASSEMBLER_ERROR;
15429       break;
15430     }
15431   oappend (s);
15432 }
15433
15434 static void
15435 OP_IMREG (int code, int sizeflag)
15436 {
15437   const char *s;
15438
15439   switch (code)
15440     {
15441     case indir_dx_reg:
15442       if (intel_syntax)
15443         s = "dx";
15444       else
15445         s = "(%dx)";
15446       break;
15447     case ax_reg: case cx_reg: case dx_reg: case bx_reg:
15448     case sp_reg: case bp_reg: case si_reg: case di_reg:
15449       s = names16[code - ax_reg];
15450       break;
15451     case es_reg: case ss_reg: case cs_reg:
15452     case ds_reg: case fs_reg: case gs_reg:
15453       s = names_seg[code - es_reg];
15454       break;
15455     case al_reg: case ah_reg: case cl_reg: case ch_reg:
15456     case dl_reg: case dh_reg: case bl_reg: case bh_reg:
15457       USED_REX (0);
15458       if (rex)
15459         s = names8rex[code - al_reg];
15460       else
15461         s = names8[code - al_reg];
15462       break;
15463     case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
15464     case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
15465       USED_REX (REX_W);
15466       if (rex & REX_W)
15467         s = names64[code - eAX_reg];
15468       else
15469         {
15470           if (sizeflag & DFLAG)
15471             s = names32[code - eAX_reg];
15472           else
15473             s = names16[code - eAX_reg];
15474           used_prefixes |= (prefixes & PREFIX_DATA);
15475         }
15476       break;
15477     case z_mode_ax_reg:
15478       if ((rex & REX_W) || (sizeflag & DFLAG))
15479         s = *names32;
15480       else
15481         s = *names16;
15482       if (!(rex & REX_W))
15483         used_prefixes |= (prefixes & PREFIX_DATA);
15484       break;
15485     default:
15486       s = INTERNAL_DISASSEMBLER_ERROR;
15487       break;
15488     }
15489   oappend (s);
15490 }
15491
15492 static void
15493 OP_I (int bytemode, int sizeflag)
15494 {
15495   bfd_signed_vma op;
15496   bfd_signed_vma mask = -1;
15497
15498   switch (bytemode)
15499     {
15500     case b_mode:
15501       FETCH_DATA (the_info, codep + 1);
15502       op = *codep++;
15503       mask = 0xff;
15504       break;
15505     case q_mode:
15506       if (address_mode == mode_64bit)
15507         {
15508           op = get32s ();
15509           break;
15510         }
15511       /* Fall through.  */
15512     case v_mode:
15513       USED_REX (REX_W);
15514       if (rex & REX_W)
15515         op = get32s ();
15516       else
15517         {
15518           if (sizeflag & DFLAG)
15519             {
15520               op = get32 ();
15521               mask = 0xffffffff;
15522             }
15523           else
15524             {
15525               op = get16 ();
15526               mask = 0xfffff;
15527             }
15528           used_prefixes |= (prefixes & PREFIX_DATA);
15529         }
15530       break;
15531     case w_mode:
15532       mask = 0xfffff;
15533       op = get16 ();
15534       break;
15535     case const_1_mode:
15536       if (intel_syntax)
15537         oappend ("1");
15538       return;
15539     default:
15540       oappend (INTERNAL_DISASSEMBLER_ERROR);
15541       return;
15542     }
15543
15544   op &= mask;
15545   scratchbuf[0] = '$';
15546   print_operand_value (scratchbuf + 1, 1, op);
15547   oappend_maybe_intel (scratchbuf);
15548   scratchbuf[0] = '\0';
15549 }
15550
15551 static void
15552 OP_I64 (int bytemode, int sizeflag)
15553 {
15554   bfd_signed_vma op;
15555   bfd_signed_vma mask = -1;
15556
15557   if (address_mode != mode_64bit)
15558     {
15559       OP_I (bytemode, sizeflag);
15560       return;
15561     }
15562
15563   switch (bytemode)
15564     {
15565     case b_mode:
15566       FETCH_DATA (the_info, codep + 1);
15567       op = *codep++;
15568       mask = 0xff;
15569       break;
15570     case v_mode:
15571       USED_REX (REX_W);
15572       if (rex & REX_W)
15573         op = get64 ();
15574       else
15575         {
15576           if (sizeflag & DFLAG)
15577             {
15578               op = get32 ();
15579               mask = 0xffffffff;
15580             }
15581           else
15582             {
15583               op = get16 ();
15584               mask = 0xfffff;
15585             }
15586           used_prefixes |= (prefixes & PREFIX_DATA);
15587         }
15588       break;
15589     case w_mode:
15590       mask = 0xfffff;
15591       op = get16 ();
15592       break;
15593     default:
15594       oappend (INTERNAL_DISASSEMBLER_ERROR);
15595       return;
15596     }
15597
15598   op &= mask;
15599   scratchbuf[0] = '$';
15600   print_operand_value (scratchbuf + 1, 1, op);
15601   oappend_maybe_intel (scratchbuf);
15602   scratchbuf[0] = '\0';
15603 }
15604
15605 static void
15606 OP_sI (int bytemode, int sizeflag)
15607 {
15608   bfd_signed_vma op;
15609
15610   switch (bytemode)
15611     {
15612     case b_mode:
15613     case b_T_mode:
15614       FETCH_DATA (the_info, codep + 1);
15615       op = *codep++;
15616       if ((op & 0x80) != 0)
15617         op -= 0x100;
15618       if (bytemode == b_T_mode)
15619         {
15620           if (address_mode != mode_64bit
15621               || !((sizeflag & DFLAG) || (rex & REX_W)))
15622             {
15623               /* The operand-size prefix is overridden by a REX prefix.  */
15624               if ((sizeflag & DFLAG) || (rex & REX_W))
15625                 op &= 0xffffffff;
15626               else
15627                 op &= 0xffff;
15628           }
15629         }
15630       else
15631         {
15632           if (!(rex & REX_W))
15633             {
15634               if (sizeflag & DFLAG)
15635                 op &= 0xffffffff;
15636               else
15637                 op &= 0xffff;
15638             }
15639         }
15640       break;
15641     case v_mode:
15642       /* The operand-size prefix is overridden by a REX prefix.  */
15643       if ((sizeflag & DFLAG) || (rex & REX_W))
15644         op = get32s ();
15645       else
15646         op = get16 ();
15647       break;
15648     default:
15649       oappend (INTERNAL_DISASSEMBLER_ERROR);
15650       return;
15651     }
15652
15653   scratchbuf[0] = '$';
15654   print_operand_value (scratchbuf + 1, 1, op);
15655   oappend_maybe_intel (scratchbuf);
15656 }
15657
15658 static void
15659 OP_J (int bytemode, int sizeflag)
15660 {
15661   bfd_vma disp;
15662   bfd_vma mask = -1;
15663   bfd_vma segment = 0;
15664
15665   switch (bytemode)
15666     {
15667     case b_mode:
15668       FETCH_DATA (the_info, codep + 1);
15669       disp = *codep++;
15670       if ((disp & 0x80) != 0)
15671         disp -= 0x100;
15672       break;
15673     case v_mode:
15674       USED_REX (REX_W);
15675       if ((sizeflag & DFLAG) || (rex & REX_W))
15676         disp = get32s ();
15677       else
15678         {
15679           disp = get16 ();
15680           if ((disp & 0x8000) != 0)
15681             disp -= 0x10000;
15682           /* In 16bit mode, address is wrapped around at 64k within
15683              the same segment.  Otherwise, a data16 prefix on a jump
15684              instruction means that the pc is masked to 16 bits after
15685              the displacement is added!  */
15686           mask = 0xffff;
15687           if ((prefixes & PREFIX_DATA) == 0)
15688             segment = ((start_pc + codep - start_codep)
15689                        & ~((bfd_vma) 0xffff));
15690         }
15691       if (!(rex & REX_W))
15692         used_prefixes |= (prefixes & PREFIX_DATA);
15693       break;
15694     default:
15695       oappend (INTERNAL_DISASSEMBLER_ERROR);
15696       return;
15697     }
15698   disp = ((start_pc + (codep - start_codep) + disp) & mask) | segment;
15699   set_op (disp, 0);
15700   print_operand_value (scratchbuf, 1, disp);
15701   oappend (scratchbuf);
15702 }
15703
15704 static void
15705 OP_SEG (int bytemode, int sizeflag)
15706 {
15707   if (bytemode == w_mode)
15708     oappend (names_seg[modrm.reg]);
15709   else
15710     OP_E (modrm.mod == 3 ? bytemode : w_mode, sizeflag);
15711 }
15712
15713 static void
15714 OP_DIR (int dummy ATTRIBUTE_UNUSED, int sizeflag)
15715 {
15716   int seg, offset;
15717
15718   if (sizeflag & DFLAG)
15719     {
15720       offset = get32 ();
15721       seg = get16 ();
15722     }
15723   else
15724     {
15725       offset = get16 ();
15726       seg = get16 ();
15727     }
15728   used_prefixes |= (prefixes & PREFIX_DATA);
15729   if (intel_syntax)
15730     sprintf (scratchbuf, "0x%x:0x%x", seg, offset);
15731   else
15732     sprintf (scratchbuf, "$0x%x,$0x%x", seg, offset);
15733   oappend (scratchbuf);
15734 }
15735
15736 static void
15737 OP_OFF (int bytemode, int sizeflag)
15738 {
15739   bfd_vma off;
15740
15741   if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
15742     intel_operand_size (bytemode, sizeflag);
15743   append_seg ();
15744
15745   if ((sizeflag & AFLAG) || address_mode == mode_64bit)
15746     off = get32 ();
15747   else
15748     off = get16 ();
15749
15750   if (intel_syntax)
15751     {
15752       if (!active_seg_prefix)
15753         {
15754           oappend (names_seg[ds_reg - es_reg]);
15755           oappend (":");
15756         }
15757     }
15758   print_operand_value (scratchbuf, 1, off);
15759   oappend (scratchbuf);
15760 }
15761
15762 static void
15763 OP_OFF64 (int bytemode, int sizeflag)
15764 {
15765   bfd_vma off;
15766
15767   if (address_mode != mode_64bit
15768       || (prefixes & PREFIX_ADDR))
15769     {
15770       OP_OFF (bytemode, sizeflag);
15771       return;
15772     }
15773
15774   if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
15775     intel_operand_size (bytemode, sizeflag);
15776   append_seg ();
15777
15778   off = get64 ();
15779
15780   if (intel_syntax)
15781     {
15782       if (!active_seg_prefix)
15783         {
15784           oappend (names_seg[ds_reg - es_reg]);
15785           oappend (":");
15786         }
15787     }
15788   print_operand_value (scratchbuf, 1, off);
15789   oappend (scratchbuf);
15790 }
15791
15792 static void
15793 ptr_reg (int code, int sizeflag)
15794 {
15795   const char *s;
15796
15797   *obufp++ = open_char;
15798   used_prefixes |= (prefixes & PREFIX_ADDR);
15799   if (address_mode == mode_64bit)
15800     {
15801       if (!(sizeflag & AFLAG))
15802         s = names32[code - eAX_reg];
15803       else
15804         s = names64[code - eAX_reg];
15805     }
15806   else if (sizeflag & AFLAG)
15807     s = names32[code - eAX_reg];
15808   else
15809     s = names16[code - eAX_reg];
15810   oappend (s);
15811   *obufp++ = close_char;
15812   *obufp = 0;
15813 }
15814
15815 static void
15816 OP_ESreg (int code, int sizeflag)
15817 {
15818   if (intel_syntax)
15819     {
15820       switch (codep[-1])
15821         {
15822         case 0x6d:      /* insw/insl */
15823           intel_operand_size (z_mode, sizeflag);
15824           break;
15825         case 0xa5:      /* movsw/movsl/movsq */
15826         case 0xa7:      /* cmpsw/cmpsl/cmpsq */
15827         case 0xab:      /* stosw/stosl */
15828         case 0xaf:      /* scasw/scasl */
15829           intel_operand_size (v_mode, sizeflag);
15830           break;
15831         default:
15832           intel_operand_size (b_mode, sizeflag);
15833         }
15834     }
15835   oappend_maybe_intel ("%es:");
15836   ptr_reg (code, sizeflag);
15837 }
15838
15839 static void
15840 OP_DSreg (int code, int sizeflag)
15841 {
15842   if (intel_syntax)
15843     {
15844       switch (codep[-1])
15845         {
15846         case 0x6f:      /* outsw/outsl */
15847           intel_operand_size (z_mode, sizeflag);
15848           break;
15849         case 0xa5:      /* movsw/movsl/movsq */
15850         case 0xa7:      /* cmpsw/cmpsl/cmpsq */
15851         case 0xad:      /* lodsw/lodsl/lodsq */
15852           intel_operand_size (v_mode, sizeflag);
15853           break;
15854         default:
15855           intel_operand_size (b_mode, sizeflag);
15856         }
15857     }
15858   /* Set active_seg_prefix to PREFIX_DS if it is unset so that the
15859      default segment register DS is printed.  */
15860   if (!active_seg_prefix)
15861     active_seg_prefix = PREFIX_DS;
15862   append_seg ();
15863   ptr_reg (code, sizeflag);
15864 }
15865
15866 static void
15867 OP_C (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15868 {
15869   int add;
15870   if (rex & REX_R)
15871     {
15872       USED_REX (REX_R);
15873       add = 8;
15874     }
15875   else if (address_mode != mode_64bit && (prefixes & PREFIX_LOCK))
15876     {
15877       all_prefixes[last_lock_prefix] = 0;
15878       used_prefixes |= PREFIX_LOCK;
15879       add = 8;
15880     }
15881   else
15882     add = 0;
15883   sprintf (scratchbuf, "%%cr%d", modrm.reg + add);
15884   oappend_maybe_intel (scratchbuf);
15885 }
15886
15887 static void
15888 OP_D (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15889 {
15890   int add;
15891   USED_REX (REX_R);
15892   if (rex & REX_R)
15893     add = 8;
15894   else
15895     add = 0;
15896   if (intel_syntax)
15897     sprintf (scratchbuf, "db%d", modrm.reg + add);
15898   else
15899     sprintf (scratchbuf, "%%db%d", modrm.reg + add);
15900   oappend (scratchbuf);
15901 }
15902
15903 static void
15904 OP_T (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15905 {
15906   sprintf (scratchbuf, "%%tr%d", modrm.reg);
15907   oappend_maybe_intel (scratchbuf);
15908 }
15909
15910 static void
15911 OP_R (int bytemode, int sizeflag)
15912 {
15913   /* Skip mod/rm byte.  */
15914   MODRM_CHECK;
15915   codep++;
15916   OP_E_register (bytemode, sizeflag);
15917 }
15918
15919 static void
15920 OP_MMX (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15921 {
15922   int reg = modrm.reg;
15923   const char **names;
15924
15925   used_prefixes |= (prefixes & PREFIX_DATA);
15926   if (prefixes & PREFIX_DATA)
15927     {
15928       names = names_xmm;
15929       USED_REX (REX_R);
15930       if (rex & REX_R)
15931         reg += 8;
15932     }
15933   else
15934     names = names_mm;
15935   oappend (names[reg]);
15936 }
15937
15938 static void
15939 OP_XMM (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
15940 {
15941   int reg = modrm.reg;
15942   const char **names;
15943
15944   USED_REX (REX_R);
15945   if (rex & REX_R)
15946     reg += 8;
15947   if (vex.evex)
15948     {
15949       if (!vex.r)
15950         reg += 16;
15951     }
15952
15953   if (need_vex
15954       && bytemode != xmm_mode
15955       && bytemode != xmmq_mode
15956       && bytemode != evex_half_bcst_xmmq_mode
15957       && bytemode != ymm_mode
15958       && bytemode != scalar_mode)
15959     {
15960       switch (vex.length)
15961         {
15962         case 128:
15963           names = names_xmm;
15964           break;
15965         case 256:
15966           if (vex.w
15967               || (bytemode != vex_vsib_q_w_dq_mode
15968                   && bytemode != vex_vsib_q_w_d_mode))
15969             names = names_ymm;
15970           else
15971             names = names_xmm;
15972           break;
15973         case 512:
15974           names = names_zmm;
15975           break;
15976         default:
15977           abort ();
15978         }
15979     }
15980   else if (bytemode == xmmq_mode
15981            || bytemode == evex_half_bcst_xmmq_mode)
15982     {
15983       switch (vex.length)
15984         {
15985         case 128:
15986         case 256:
15987           names = names_xmm;
15988           break;
15989         case 512:
15990           names = names_ymm;
15991           break;
15992         default:
15993           abort ();
15994         }
15995     }
15996   else if (bytemode == ymm_mode)
15997     names = names_ymm;
15998   else
15999     names = names_xmm;
16000   oappend (names[reg]);
16001 }
16002
16003 static void
16004 OP_EM (int bytemode, int sizeflag)
16005 {
16006   int reg;
16007   const char **names;
16008
16009   if (modrm.mod != 3)
16010     {
16011       if (intel_syntax
16012           && (bytemode == v_mode || bytemode == v_swap_mode))
16013         {
16014           bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
16015           used_prefixes |= (prefixes & PREFIX_DATA);
16016         }
16017       OP_E (bytemode, sizeflag);
16018       return;
16019     }
16020
16021   if ((sizeflag & SUFFIX_ALWAYS) && bytemode == v_swap_mode)
16022     swap_operand ();
16023
16024   /* Skip mod/rm byte.  */
16025   MODRM_CHECK;
16026   codep++;
16027   used_prefixes |= (prefixes & PREFIX_DATA);
16028   reg = modrm.rm;
16029   if (prefixes & PREFIX_DATA)
16030     {
16031       names = names_xmm;
16032       USED_REX (REX_B);
16033       if (rex & REX_B)
16034         reg += 8;
16035     }
16036   else
16037     names = names_mm;
16038   oappend (names[reg]);
16039 }
16040
16041 /* cvt* are the only instructions in sse2 which have
16042    both SSE and MMX operands and also have 0x66 prefix
16043    in their opcode. 0x66 was originally used to differentiate
16044    between SSE and MMX instruction(operands). So we have to handle the
16045    cvt* separately using OP_EMC and OP_MXC */
16046 static void
16047 OP_EMC (int bytemode, int sizeflag)
16048 {
16049   if (modrm.mod != 3)
16050     {
16051       if (intel_syntax && bytemode == v_mode)
16052         {
16053           bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
16054           used_prefixes |= (prefixes & PREFIX_DATA);
16055         }
16056       OP_E (bytemode, sizeflag);
16057       return;
16058     }
16059
16060   /* Skip mod/rm byte.  */
16061   MODRM_CHECK;
16062   codep++;
16063   used_prefixes |= (prefixes & PREFIX_DATA);
16064   oappend (names_mm[modrm.rm]);
16065 }
16066
16067 static void
16068 OP_MXC (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
16069 {
16070   used_prefixes |= (prefixes & PREFIX_DATA);
16071   oappend (names_mm[modrm.reg]);
16072 }
16073
16074 static void
16075 OP_EX (int bytemode, int sizeflag)
16076 {
16077   int reg;
16078   const char **names;
16079
16080   /* Skip mod/rm byte.  */
16081   MODRM_CHECK;
16082   codep++;
16083
16084   if (modrm.mod != 3)
16085     {
16086       OP_E_memory (bytemode, sizeflag);
16087       return;
16088     }
16089
16090   reg = modrm.rm;
16091   USED_REX (REX_B);
16092   if (rex & REX_B)
16093     reg += 8;
16094   if (vex.evex)
16095     {
16096       USED_REX (REX_X);
16097       if ((rex & REX_X))
16098         reg += 16;
16099     }
16100
16101   if ((sizeflag & SUFFIX_ALWAYS)
16102       && (bytemode == x_swap_mode
16103           || bytemode == d_swap_mode
16104           || bytemode == dqw_swap_mode
16105           || bytemode == d_scalar_swap_mode
16106           || bytemode == q_swap_mode
16107           || bytemode == q_scalar_swap_mode))
16108     swap_operand ();
16109
16110   if (need_vex
16111       && bytemode != xmm_mode
16112       && bytemode != xmmdw_mode
16113       && bytemode != xmmqd_mode
16114       && bytemode != xmm_mb_mode
16115       && bytemode != xmm_mw_mode
16116       && bytemode != xmm_md_mode
16117       && bytemode != xmm_mq_mode
16118       && bytemode != xmm_mdq_mode
16119       && bytemode != xmmq_mode
16120       && bytemode != evex_half_bcst_xmmq_mode
16121       && bytemode != ymm_mode
16122       && bytemode != d_scalar_mode
16123       && bytemode != d_scalar_swap_mode
16124       && bytemode != q_scalar_mode
16125       && bytemode != q_scalar_swap_mode
16126       && bytemode != vex_scalar_w_dq_mode)
16127     {
16128       switch (vex.length)
16129         {
16130         case 128:
16131           names = names_xmm;
16132           break;
16133         case 256:
16134           names = names_ymm;
16135           break;
16136         case 512:
16137           names = names_zmm;
16138           break;
16139         default:
16140           abort ();
16141         }
16142     }
16143   else if (bytemode == xmmq_mode
16144            || bytemode == evex_half_bcst_xmmq_mode)
16145     {
16146       switch (vex.length)
16147         {
16148         case 128:
16149         case 256:
16150           names = names_xmm;
16151           break;
16152         case 512:
16153           names = names_ymm;
16154           break;
16155         default:
16156           abort ();
16157         }
16158     }
16159   else if (bytemode == ymm_mode)
16160     names = names_ymm;
16161   else
16162     names = names_xmm;
16163   oappend (names[reg]);
16164 }
16165
16166 static void
16167 OP_MS (int bytemode, int sizeflag)
16168 {
16169   if (modrm.mod == 3)
16170     OP_EM (bytemode, sizeflag);
16171   else
16172     BadOp ();
16173 }
16174
16175 static void
16176 OP_XS (int bytemode, int sizeflag)
16177 {
16178   if (modrm.mod == 3)
16179     OP_EX (bytemode, sizeflag);
16180   else
16181     BadOp ();
16182 }
16183
16184 static void
16185 OP_M (int bytemode, int sizeflag)
16186 {
16187   if (modrm.mod == 3)
16188     /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
16189     BadOp ();
16190   else
16191     OP_E (bytemode, sizeflag);
16192 }
16193
16194 static void
16195 OP_0f07 (int bytemode, int sizeflag)
16196 {
16197   if (modrm.mod != 3 || modrm.rm != 0)
16198     BadOp ();
16199   else
16200     OP_E (bytemode, sizeflag);
16201 }
16202
16203 /* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
16204    32bit mode and "xchg %rax,%rax" in 64bit mode.  */
16205
16206 static void
16207 NOP_Fixup1 (int bytemode, int sizeflag)
16208 {
16209   if ((prefixes & PREFIX_DATA) != 0
16210       || (rex != 0
16211           && rex != 0x48
16212           && address_mode == mode_64bit))
16213     OP_REG (bytemode, sizeflag);
16214   else
16215     strcpy (obuf, "nop");
16216 }
16217
16218 static void
16219 NOP_Fixup2 (int bytemode, int sizeflag)
16220 {
16221   if ((prefixes & PREFIX_DATA) != 0
16222       || (rex != 0
16223           && rex != 0x48
16224           && address_mode == mode_64bit))
16225     OP_IMREG (bytemode, sizeflag);
16226 }
16227
16228 static const char *const Suffix3DNow[] = {
16229 /* 00 */        NULL,           NULL,           NULL,           NULL,
16230 /* 04 */        NULL,           NULL,           NULL,           NULL,
16231 /* 08 */        NULL,           NULL,           NULL,           NULL,
16232 /* 0C */        "pi2fw",        "pi2fd",        NULL,           NULL,
16233 /* 10 */        NULL,           NULL,           NULL,           NULL,
16234 /* 14 */        NULL,           NULL,           NULL,           NULL,
16235 /* 18 */        NULL,           NULL,           NULL,           NULL,
16236 /* 1C */        "pf2iw",        "pf2id",        NULL,           NULL,
16237 /* 20 */        NULL,           NULL,           NULL,           NULL,
16238 /* 24 */        NULL,           NULL,           NULL,           NULL,
16239 /* 28 */        NULL,           NULL,           NULL,           NULL,
16240 /* 2C */        NULL,           NULL,           NULL,           NULL,
16241 /* 30 */        NULL,           NULL,           NULL,           NULL,
16242 /* 34 */        NULL,           NULL,           NULL,           NULL,
16243 /* 38 */        NULL,           NULL,           NULL,           NULL,
16244 /* 3C */        NULL,           NULL,           NULL,           NULL,
16245 /* 40 */        NULL,           NULL,           NULL,           NULL,
16246 /* 44 */        NULL,           NULL,           NULL,           NULL,
16247 /* 48 */        NULL,           NULL,           NULL,           NULL,
16248 /* 4C */        NULL,           NULL,           NULL,           NULL,
16249 /* 50 */        NULL,           NULL,           NULL,           NULL,
16250 /* 54 */        NULL,           NULL,           NULL,           NULL,
16251 /* 58 */        NULL,           NULL,           NULL,           NULL,
16252 /* 5C */        NULL,           NULL,           NULL,           NULL,
16253 /* 60 */        NULL,           NULL,           NULL,           NULL,
16254 /* 64 */        NULL,           NULL,           NULL,           NULL,
16255 /* 68 */        NULL,           NULL,           NULL,           NULL,
16256 /* 6C */        NULL,           NULL,           NULL,           NULL,
16257 /* 70 */        NULL,           NULL,           NULL,           NULL,
16258 /* 74 */        NULL,           NULL,           NULL,           NULL,
16259 /* 78 */        NULL,           NULL,           NULL,           NULL,
16260 /* 7C */        NULL,           NULL,           NULL,           NULL,
16261 /* 80 */        NULL,           NULL,           NULL,           NULL,
16262 /* 84 */        NULL,           NULL,           NULL,           NULL,
16263 /* 88 */        NULL,           NULL,           "pfnacc",       NULL,
16264 /* 8C */        NULL,           NULL,           "pfpnacc",      NULL,
16265 /* 90 */        "pfcmpge",      NULL,           NULL,           NULL,
16266 /* 94 */        "pfmin",        NULL,           "pfrcp",        "pfrsqrt",
16267 /* 98 */        NULL,           NULL,           "pfsub",        NULL,
16268 /* 9C */        NULL,           NULL,           "pfadd",        NULL,
16269 /* A0 */        "pfcmpgt",      NULL,           NULL,           NULL,
16270 /* A4 */        "pfmax",        NULL,           "pfrcpit1",     "pfrsqit1",
16271 /* A8 */        NULL,           NULL,           "pfsubr",       NULL,
16272 /* AC */        NULL,           NULL,           "pfacc",        NULL,
16273 /* B0 */        "pfcmpeq",      NULL,           NULL,           NULL,
16274 /* B4 */        "pfmul",        NULL,           "pfrcpit2",     "pmulhrw",
16275 /* B8 */        NULL,           NULL,           NULL,           "pswapd",
16276 /* BC */        NULL,           NULL,           NULL,           "pavgusb",
16277 /* C0 */        NULL,           NULL,           NULL,           NULL,
16278 /* C4 */        NULL,           NULL,           NULL,           NULL,
16279 /* C8 */        NULL,           NULL,           NULL,           NULL,
16280 /* CC */        NULL,           NULL,           NULL,           NULL,
16281 /* D0 */        NULL,           NULL,           NULL,           NULL,
16282 /* D4 */        NULL,           NULL,           NULL,           NULL,
16283 /* D8 */        NULL,           NULL,           NULL,           NULL,
16284 /* DC */        NULL,           NULL,           NULL,           NULL,
16285 /* E0 */        NULL,           NULL,           NULL,           NULL,
16286 /* E4 */        NULL,           NULL,           NULL,           NULL,
16287 /* E8 */        NULL,           NULL,           NULL,           NULL,
16288 /* EC */        NULL,           NULL,           NULL,           NULL,
16289 /* F0 */        NULL,           NULL,           NULL,           NULL,
16290 /* F4 */        NULL,           NULL,           NULL,           NULL,
16291 /* F8 */        NULL,           NULL,           NULL,           NULL,
16292 /* FC */        NULL,           NULL,           NULL,           NULL,
16293 };
16294
16295 static void
16296 OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
16297 {
16298   const char *mnemonic;
16299
16300   FETCH_DATA (the_info, codep + 1);
16301   /* AMD 3DNow! instructions are specified by an opcode suffix in the
16302      place where an 8-bit immediate would normally go.  ie. the last
16303      byte of the instruction.  */
16304   obufp = mnemonicendp;
16305   mnemonic = Suffix3DNow[*codep++ & 0xff];
16306   if (mnemonic)
16307     oappend (mnemonic);
16308   else
16309     {
16310       /* Since a variable sized modrm/sib chunk is between the start
16311          of the opcode (0x0f0f) and the opcode suffix, we need to do
16312          all the modrm processing first, and don't know until now that
16313          we have a bad opcode.  This necessitates some cleaning up.  */
16314       op_out[0][0] = '\0';
16315       op_out[1][0] = '\0';
16316       BadOp ();
16317     }
16318   mnemonicendp = obufp;
16319 }
16320
16321 static struct op simd_cmp_op[] =
16322 {
16323   { STRING_COMMA_LEN ("eq") },
16324   { STRING_COMMA_LEN ("lt") },
16325   { STRING_COMMA_LEN ("le") },
16326   { STRING_COMMA_LEN ("unord") },
16327   { STRING_COMMA_LEN ("neq") },
16328   { STRING_COMMA_LEN ("nlt") },
16329   { STRING_COMMA_LEN ("nle") },
16330   { STRING_COMMA_LEN ("ord") }
16331 };
16332
16333 static void
16334 CMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
16335 {
16336   unsigned int cmp_type;
16337
16338   FETCH_DATA (the_info, codep + 1);
16339   cmp_type = *codep++ & 0xff;
16340   if (cmp_type < ARRAY_SIZE (simd_cmp_op))
16341     {
16342       char suffix [3];
16343       char *p = mnemonicendp - 2;
16344       suffix[0] = p[0];
16345       suffix[1] = p[1];
16346       suffix[2] = '\0';
16347       sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
16348       mnemonicendp += simd_cmp_op[cmp_type].len;
16349     }
16350   else
16351     {
16352       /* We have a reserved extension byte.  Output it directly.  */
16353       scratchbuf[0] = '$';
16354       print_operand_value (scratchbuf + 1, 1, cmp_type);
16355       oappend_maybe_intel (scratchbuf);
16356       scratchbuf[0] = '\0';
16357     }
16358 }
16359
16360 static void
16361 OP_Mwait (int bytemode ATTRIBUTE_UNUSED,
16362           int sizeflag ATTRIBUTE_UNUSED)
16363 {
16364   /* mwait %eax,%ecx  */
16365   if (!intel_syntax)
16366     {
16367       const char **names = (address_mode == mode_64bit
16368                             ? names64 : names32);
16369       strcpy (op_out[0], names[0]);
16370       strcpy (op_out[1], names[1]);
16371       two_source_ops = 1;
16372     }
16373   /* Skip mod/rm byte.  */
16374   MODRM_CHECK;
16375   codep++;
16376 }
16377
16378 static void
16379 OP_Monitor (int bytemode ATTRIBUTE_UNUSED,
16380             int sizeflag ATTRIBUTE_UNUSED)
16381 {
16382   /* monitor %eax,%ecx,%edx"  */
16383   if (!intel_syntax)
16384     {
16385       const char **op1_names;
16386       const char **names = (address_mode == mode_64bit
16387                             ? names64 : names32);
16388
16389       if (!(prefixes & PREFIX_ADDR))
16390         op1_names = (address_mode == mode_16bit
16391                      ? names16 : names);
16392       else
16393         {
16394           /* Remove "addr16/addr32".  */
16395           all_prefixes[last_addr_prefix] = 0;
16396           op1_names = (address_mode != mode_32bit
16397                        ? names32 : names16);
16398           used_prefixes |= PREFIX_ADDR;
16399         }
16400       strcpy (op_out[0], op1_names[0]);
16401       strcpy (op_out[1], names[1]);
16402       strcpy (op_out[2], names[2]);
16403       two_source_ops = 1;
16404     }
16405   /* Skip mod/rm byte.  */
16406   MODRM_CHECK;
16407   codep++;
16408 }
16409
16410 static void
16411 BadOp (void)
16412 {
16413   /* Throw away prefixes and 1st. opcode byte.  */
16414   codep = insn_codep + 1;
16415   oappend ("(bad)");
16416 }
16417
16418 static void
16419 REP_Fixup (int bytemode, int sizeflag)
16420 {
16421   /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
16422      lods and stos.  */
16423   if (prefixes & PREFIX_REPZ)
16424     all_prefixes[last_repz_prefix] = REP_PREFIX;
16425
16426   switch (bytemode)
16427     {
16428     case al_reg:
16429     case eAX_reg:
16430     case indir_dx_reg:
16431       OP_IMREG (bytemode, sizeflag);
16432       break;
16433     case eDI_reg:
16434       OP_ESreg (bytemode, sizeflag);
16435       break;
16436     case eSI_reg:
16437       OP_DSreg (bytemode, sizeflag);
16438       break;
16439     default:
16440       abort ();
16441       break;
16442     }
16443 }
16444
16445 /* For BND-prefixed instructions 0xF2 prefix should be displayed as
16446    "bnd".  */
16447
16448 static void
16449 BND_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
16450 {
16451   if (prefixes & PREFIX_REPNZ)
16452     all_prefixes[last_repnz_prefix] = BND_PREFIX;
16453 }
16454
16455 /* Similar to OP_E.  But the 0xf2/0xf3 prefixes should be displayed as
16456    "xacquire"/"xrelease" for memory operand if there is a LOCK prefix.
16457  */
16458
16459 static void
16460 HLE_Fixup1 (int bytemode, int sizeflag)
16461 {
16462   if (modrm.mod != 3
16463       && (prefixes & PREFIX_LOCK) != 0)
16464     {
16465       if (prefixes & PREFIX_REPZ)
16466         all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
16467       if (prefixes & PREFIX_REPNZ)
16468         all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
16469     }
16470
16471   OP_E (bytemode, sizeflag);
16472 }
16473
16474 /* Similar to OP_E.  But the 0xf2/0xf3 prefixes should be displayed as
16475    "xacquire"/"xrelease" for memory operand.  No check for LOCK prefix.
16476  */
16477
16478 static void
16479 HLE_Fixup2 (int bytemode, int sizeflag)
16480 {
16481   if (modrm.mod != 3)
16482     {
16483       if (prefixes & PREFIX_REPZ)
16484         all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
16485       if (prefixes & PREFIX_REPNZ)
16486         all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
16487     }
16488
16489   OP_E (bytemode, sizeflag);
16490 }
16491
16492 /* Similar to OP_E.  But the 0xf3 prefixes should be displayed as
16493    "xrelease" for memory operand.  No check for LOCK prefix.   */
16494
16495 static void
16496 HLE_Fixup3 (int bytemode, int sizeflag)
16497 {
16498   if (modrm.mod != 3
16499       && last_repz_prefix > last_repnz_prefix
16500       && (prefixes & PREFIX_REPZ) != 0)
16501     all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
16502
16503   OP_E (bytemode, sizeflag);
16504 }
16505
16506 static void
16507 CMPXCHG8B_Fixup (int bytemode, int sizeflag)
16508 {
16509   USED_REX (REX_W);
16510   if (rex & REX_W)
16511     {
16512       /* Change cmpxchg8b to cmpxchg16b.  */
16513       char *p = mnemonicendp - 2;
16514       mnemonicendp = stpcpy (p, "16b");
16515       bytemode = o_mode;
16516     }
16517   else if ((prefixes & PREFIX_LOCK) != 0)
16518     {
16519       if (prefixes & PREFIX_REPZ)
16520         all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
16521       if (prefixes & PREFIX_REPNZ)
16522         all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
16523     }
16524
16525   OP_M (bytemode, sizeflag);
16526 }
16527
16528 static void
16529 XMM_Fixup (int reg, int sizeflag ATTRIBUTE_UNUSED)
16530 {
16531   const char **names;
16532
16533   if (need_vex)
16534     {
16535       switch (vex.length)
16536         {
16537         case 128:
16538           names = names_xmm;
16539           break;
16540         case 256:
16541           names = names_ymm;
16542           break;
16543         default:
16544           abort ();
16545         }
16546     }
16547   else
16548     names = names_xmm;
16549   oappend (names[reg]);
16550 }
16551
16552 static void
16553 CRC32_Fixup (int bytemode, int sizeflag)
16554 {
16555   /* Add proper suffix to "crc32".  */
16556   char *p = mnemonicendp;
16557
16558   switch (bytemode)
16559     {
16560     case b_mode:
16561       if (intel_syntax)
16562         goto skip;
16563
16564       *p++ = 'b';
16565       break;
16566     case v_mode:
16567       if (intel_syntax)
16568         goto skip;
16569
16570       USED_REX (REX_W);
16571       if (rex & REX_W)
16572         *p++ = 'q';
16573       else
16574         {
16575           if (sizeflag & DFLAG)
16576             *p++ = 'l';
16577           else
16578             *p++ = 'w';
16579           used_prefixes |= (prefixes & PREFIX_DATA);
16580         }
16581       break;
16582     default:
16583       oappend (INTERNAL_DISASSEMBLER_ERROR);
16584       break;
16585     }
16586   mnemonicendp = p;
16587   *p = '\0';
16588
16589 skip:
16590   if (modrm.mod == 3)
16591     {
16592       int add;
16593
16594       /* Skip mod/rm byte.  */
16595       MODRM_CHECK;
16596       codep++;
16597
16598       USED_REX (REX_B);
16599       add = (rex & REX_B) ? 8 : 0;
16600       if (bytemode == b_mode)
16601         {
16602           USED_REX (0);
16603           if (rex)
16604             oappend (names8rex[modrm.rm + add]);
16605           else
16606             oappend (names8[modrm.rm + add]);
16607         }
16608       else
16609         {
16610           USED_REX (REX_W);
16611           if (rex & REX_W)
16612             oappend (names64[modrm.rm + add]);
16613           else if ((prefixes & PREFIX_DATA))
16614             oappend (names16[modrm.rm + add]);
16615           else
16616             oappend (names32[modrm.rm + add]);
16617         }
16618     }
16619   else
16620     OP_E (bytemode, sizeflag);
16621 }
16622
16623 static void
16624 FXSAVE_Fixup (int bytemode, int sizeflag)
16625 {
16626   /* Add proper suffix to "fxsave" and "fxrstor".  */
16627   USED_REX (REX_W);
16628   if (rex & REX_W)
16629     {
16630       char *p = mnemonicendp;
16631       *p++ = '6';
16632       *p++ = '4';
16633       *p = '\0';
16634       mnemonicendp = p;
16635     }
16636   OP_M (bytemode, sizeflag);
16637 }
16638
16639 /* Display the destination register operand for instructions with
16640    VEX. */
16641
16642 static void
16643 OP_VEX (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
16644 {
16645   int reg;
16646   const char **names;
16647
16648   if (!need_vex)
16649     abort ();
16650
16651   if (!need_vex_reg)
16652     return;
16653
16654   reg = vex.register_specifier;
16655   if (vex.evex)
16656     {
16657       if (!vex.v)
16658         reg += 16;
16659     }
16660
16661   if (bytemode == vex_scalar_mode)
16662     {
16663       oappend (names_xmm[reg]);
16664       return;
16665     }
16666
16667   switch (vex.length)
16668     {
16669     case 128:
16670       switch (bytemode)
16671         {
16672         case vex_mode:
16673         case vex128_mode:
16674         case vex_vsib_q_w_dq_mode:
16675         case vex_vsib_q_w_d_mode:
16676           names = names_xmm;
16677           break;
16678         case dq_mode:
16679           if (vex.w)
16680             names = names64;
16681           else
16682             names = names32;
16683           break;
16684         case mask_bd_mode:
16685         case mask_mode:
16686           names = names_mask;
16687           break;
16688         default:
16689           abort ();
16690           return;
16691         }
16692       break;
16693     case 256:
16694       switch (bytemode)
16695         {
16696         case vex_mode:
16697         case vex256_mode:
16698           names = names_ymm;
16699           break;
16700         case vex_vsib_q_w_dq_mode:
16701         case vex_vsib_q_w_d_mode:
16702           names = vex.w ? names_ymm : names_xmm;
16703           break;
16704         case mask_bd_mode:
16705         case mask_mode:
16706           names = names_mask;
16707           break;
16708         default:
16709           abort ();
16710           return;
16711         }
16712       break;
16713     case 512:
16714       names = names_zmm;
16715       break;
16716     default:
16717       abort ();
16718       break;
16719     }
16720   oappend (names[reg]);
16721 }
16722
16723 /* Get the VEX immediate byte without moving codep.  */
16724
16725 static unsigned char
16726 get_vex_imm8 (int sizeflag, int opnum)
16727 {
16728   int bytes_before_imm = 0;
16729
16730   if (modrm.mod != 3)
16731     {
16732       /* There are SIB/displacement bytes.  */
16733       if ((sizeflag & AFLAG) || address_mode == mode_64bit)
16734         {
16735           /* 32/64 bit address mode */
16736           int base = modrm.rm;
16737
16738           /* Check SIB byte.  */
16739           if (base == 4)
16740             {
16741               FETCH_DATA (the_info, codep + 1);
16742               base = *codep & 7;
16743               /* When decoding the third source, don't increase
16744                  bytes_before_imm as this has already been incremented
16745                  by one in OP_E_memory while decoding the second
16746                  source operand.  */
16747               if (opnum == 0)
16748                 bytes_before_imm++;
16749             }
16750
16751           /* Don't increase bytes_before_imm when decoding the third source,
16752              it has already been incremented by OP_E_memory while decoding
16753              the second source operand.  */
16754           if (opnum == 0)
16755             {
16756               switch (modrm.mod)
16757                 {
16758                   case 0:
16759                     /* When modrm.rm == 5 or modrm.rm == 4 and base in
16760                        SIB == 5, there is a 4 byte displacement.  */
16761                     if (base != 5)
16762                       /* No displacement. */
16763                       break;
16764                   case 2:
16765                     /* 4 byte displacement.  */
16766                     bytes_before_imm += 4;
16767                     break;
16768                   case 1:
16769                     /* 1 byte displacement.  */
16770                     bytes_before_imm++;
16771                     break;
16772                 }
16773             }
16774         }
16775       else
16776         {
16777           /* 16 bit address mode */
16778           /* Don't increase bytes_before_imm when decoding the third source,
16779              it has already been incremented by OP_E_memory while decoding
16780              the second source operand.  */
16781           if (opnum == 0)
16782             {
16783               switch (modrm.mod)
16784                 {
16785                 case 0:
16786                   /* When modrm.rm == 6, there is a 2 byte displacement.  */
16787                   if (modrm.rm != 6)
16788                     /* No displacement. */
16789                     break;
16790                 case 2:
16791                   /* 2 byte displacement.  */
16792                   bytes_before_imm += 2;
16793                   break;
16794                 case 1:
16795                   /* 1 byte displacement: when decoding the third source,
16796                      don't increase bytes_before_imm as this has already
16797                      been incremented by one in OP_E_memory while decoding
16798                      the second source operand.  */
16799                   if (opnum == 0)
16800                     bytes_before_imm++;
16801
16802                   break;
16803                 }
16804             }
16805         }
16806     }
16807
16808   FETCH_DATA (the_info, codep + bytes_before_imm + 1);
16809   return codep [bytes_before_imm];
16810 }
16811
16812 static void
16813 OP_EX_VexReg (int bytemode, int sizeflag, int reg)
16814 {
16815   const char **names;
16816
16817   if (reg == -1 && modrm.mod != 3)
16818     {
16819       OP_E_memory (bytemode, sizeflag);
16820       return;
16821     }
16822   else
16823     {
16824       if (reg == -1)
16825         {
16826           reg = modrm.rm;
16827           USED_REX (REX_B);
16828           if (rex & REX_B)
16829             reg += 8;
16830         }
16831       else if (reg > 7 && address_mode != mode_64bit)
16832         BadOp ();
16833     }
16834
16835   switch (vex.length)
16836     {
16837     case 128:
16838       names = names_xmm;
16839       break;
16840     case 256:
16841       names = names_ymm;
16842       break;
16843     default:
16844       abort ();
16845     }
16846   oappend (names[reg]);
16847 }
16848
16849 static void
16850 OP_EX_VexImmW (int bytemode, int sizeflag)
16851 {
16852   int reg = -1;
16853   static unsigned char vex_imm8;
16854
16855   if (vex_w_done == 0)
16856     {
16857       vex_w_done = 1;
16858
16859       /* Skip mod/rm byte.  */
16860       MODRM_CHECK;
16861       codep++;
16862
16863       vex_imm8 = get_vex_imm8 (sizeflag, 0);
16864
16865       if (vex.w)
16866           reg = vex_imm8 >> 4;
16867
16868       OP_EX_VexReg (bytemode, sizeflag, reg);
16869     }
16870   else if (vex_w_done == 1)
16871     {
16872       vex_w_done = 2;
16873
16874       if (!vex.w)
16875           reg = vex_imm8 >> 4;
16876
16877       OP_EX_VexReg (bytemode, sizeflag, reg);
16878     }
16879   else
16880     {
16881       /* Output the imm8 directly.  */
16882       scratchbuf[0] = '$';
16883       print_operand_value (scratchbuf + 1, 1, vex_imm8 & 0xf);
16884       oappend_maybe_intel (scratchbuf);
16885       scratchbuf[0] = '\0';
16886       codep++;
16887     }
16888 }
16889
16890 static void
16891 OP_Vex_2src (int bytemode, int sizeflag)
16892 {
16893   if (modrm.mod == 3)
16894     {
16895       int reg = modrm.rm;
16896       USED_REX (REX_B);
16897       if (rex & REX_B)
16898         reg += 8;
16899       oappend (names_xmm[reg]);
16900     }
16901   else
16902     {
16903       if (intel_syntax
16904           && (bytemode == v_mode || bytemode == v_swap_mode))
16905         {
16906           bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
16907           used_prefixes |= (prefixes & PREFIX_DATA);
16908         }
16909       OP_E (bytemode, sizeflag);
16910     }
16911 }
16912
16913 static void
16914 OP_Vex_2src_1 (int bytemode, int sizeflag)
16915 {
16916   if (modrm.mod == 3)
16917     {
16918       /* Skip mod/rm byte.   */
16919       MODRM_CHECK;
16920       codep++;
16921     }
16922
16923   if (vex.w)
16924     oappend (names_xmm[vex.register_specifier]);
16925   else
16926     OP_Vex_2src (bytemode, sizeflag);
16927 }
16928
16929 static void
16930 OP_Vex_2src_2 (int bytemode, int sizeflag)
16931 {
16932   if (vex.w)
16933     OP_Vex_2src (bytemode, sizeflag);
16934   else
16935     oappend (names_xmm[vex.register_specifier]);
16936 }
16937
16938 static void
16939 OP_EX_VexW (int bytemode, int sizeflag)
16940 {
16941   int reg = -1;
16942
16943   if (!vex_w_done)
16944     {
16945       vex_w_done = 1;
16946
16947       /* Skip mod/rm byte.  */
16948       MODRM_CHECK;
16949       codep++;
16950
16951       if (vex.w)
16952         reg = get_vex_imm8 (sizeflag, 0) >> 4;
16953     }
16954   else
16955     {
16956       if (!vex.w)
16957         reg = get_vex_imm8 (sizeflag, 1) >> 4;
16958     }
16959
16960   OP_EX_VexReg (bytemode, sizeflag, reg);
16961 }
16962
16963 static void
16964 VEXI4_Fixup (int bytemode ATTRIBUTE_UNUSED,
16965              int sizeflag ATTRIBUTE_UNUSED)
16966 {
16967   /* Skip the immediate byte and check for invalid bits.  */
16968   FETCH_DATA (the_info, codep + 1);
16969   if (*codep++ & 0xf)
16970     BadOp ();
16971 }
16972
16973 static void
16974 OP_REG_VexI4 (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
16975 {
16976   int reg;
16977   const char **names;
16978
16979   FETCH_DATA (the_info, codep + 1);
16980   reg = *codep++;
16981
16982   if (bytemode != x_mode)
16983     abort ();
16984
16985   if (reg & 0xf)
16986       BadOp ();
16987
16988   reg >>= 4;
16989   if (reg > 7 && address_mode != mode_64bit)
16990     BadOp ();
16991
16992   switch (vex.length)
16993     {
16994     case 128:
16995       names = names_xmm;
16996       break;
16997     case 256:
16998       names = names_ymm;
16999       break;
17000     default:
17001       abort ();
17002     }
17003   oappend (names[reg]);
17004 }
17005
17006 static void
17007 OP_XMM_VexW (int bytemode, int sizeflag)
17008 {
17009   /* Turn off the REX.W bit since it is used for swapping operands
17010      now.  */
17011   rex &= ~REX_W;
17012   OP_XMM (bytemode, sizeflag);
17013 }
17014
17015 static void
17016 OP_EX_Vex (int bytemode, int sizeflag)
17017 {
17018   if (modrm.mod != 3)
17019     {
17020       if (vex.register_specifier != 0)
17021         BadOp ();
17022       need_vex_reg = 0;
17023     }
17024   OP_EX (bytemode, sizeflag);
17025 }
17026
17027 static void
17028 OP_XMM_Vex (int bytemode, int sizeflag)
17029 {
17030   if (modrm.mod != 3)
17031     {
17032       if (vex.register_specifier != 0)
17033         BadOp ();
17034       need_vex_reg = 0;
17035     }
17036   OP_XMM (bytemode, sizeflag);
17037 }
17038
17039 static void
17040 VZERO_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
17041 {
17042   switch (vex.length)
17043     {
17044     case 128:
17045       mnemonicendp = stpcpy (obuf, "vzeroupper");
17046       break;
17047     case 256:
17048       mnemonicendp = stpcpy (obuf, "vzeroall");
17049       break;
17050     default:
17051       abort ();
17052     }
17053 }
17054
17055 static struct op vex_cmp_op[] =
17056 {
17057   { STRING_COMMA_LEN ("eq") },
17058   { STRING_COMMA_LEN ("lt") },
17059   { STRING_COMMA_LEN ("le") },
17060   { STRING_COMMA_LEN ("unord") },
17061   { STRING_COMMA_LEN ("neq") },
17062   { STRING_COMMA_LEN ("nlt") },
17063   { STRING_COMMA_LEN ("nle") },
17064   { STRING_COMMA_LEN ("ord") },
17065   { STRING_COMMA_LEN ("eq_uq") },
17066   { STRING_COMMA_LEN ("nge") },
17067   { STRING_COMMA_LEN ("ngt") },
17068   { STRING_COMMA_LEN ("false") },
17069   { STRING_COMMA_LEN ("neq_oq") },
17070   { STRING_COMMA_LEN ("ge") },
17071   { STRING_COMMA_LEN ("gt") },
17072   { STRING_COMMA_LEN ("true") },
17073   { STRING_COMMA_LEN ("eq_os") },
17074   { STRING_COMMA_LEN ("lt_oq") },
17075   { STRING_COMMA_LEN ("le_oq") },
17076   { STRING_COMMA_LEN ("unord_s") },
17077   { STRING_COMMA_LEN ("neq_us") },
17078   { STRING_COMMA_LEN ("nlt_uq") },
17079   { STRING_COMMA_LEN ("nle_uq") },
17080   { STRING_COMMA_LEN ("ord_s") },
17081   { STRING_COMMA_LEN ("eq_us") },
17082   { STRING_COMMA_LEN ("nge_uq") },
17083   { STRING_COMMA_LEN ("ngt_uq") },
17084   { STRING_COMMA_LEN ("false_os") },
17085   { STRING_COMMA_LEN ("neq_os") },
17086   { STRING_COMMA_LEN ("ge_oq") },
17087   { STRING_COMMA_LEN ("gt_oq") },
17088   { STRING_COMMA_LEN ("true_us") },
17089 };
17090
17091 static void
17092 VCMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
17093 {
17094   unsigned int cmp_type;
17095
17096   FETCH_DATA (the_info, codep + 1);
17097   cmp_type = *codep++ & 0xff;
17098   if (cmp_type < ARRAY_SIZE (vex_cmp_op))
17099     {
17100       char suffix [3];
17101       char *p = mnemonicendp - 2;
17102       suffix[0] = p[0];
17103       suffix[1] = p[1];
17104       suffix[2] = '\0';
17105       sprintf (p, "%s%s", vex_cmp_op[cmp_type].name, suffix);
17106       mnemonicendp += vex_cmp_op[cmp_type].len;
17107     }
17108   else
17109     {
17110       /* We have a reserved extension byte.  Output it directly.  */
17111       scratchbuf[0] = '$';
17112       print_operand_value (scratchbuf + 1, 1, cmp_type);
17113       oappend_maybe_intel (scratchbuf);
17114       scratchbuf[0] = '\0';
17115     }
17116 }
17117
17118 static void
17119 VPCMP_Fixup (int bytemode ATTRIBUTE_UNUSED,
17120              int sizeflag ATTRIBUTE_UNUSED)
17121 {
17122   unsigned int cmp_type;
17123
17124   if (!vex.evex)
17125     abort ();
17126
17127   FETCH_DATA (the_info, codep + 1);
17128   cmp_type = *codep++ & 0xff;
17129   /* There are aliases for immediates 0, 1, 2, 4, 5, 6.
17130      If it's the case, print suffix, otherwise - print the immediate.  */
17131   if (cmp_type < ARRAY_SIZE (simd_cmp_op)
17132       && cmp_type != 3
17133       && cmp_type != 7)
17134     {
17135       char suffix [3];
17136       char *p = mnemonicendp - 2;
17137
17138       /* vpcmp* can have both one- and two-lettered suffix.  */
17139       if (p[0] == 'p')
17140         {
17141           p++;
17142           suffix[0] = p[0];
17143           suffix[1] = '\0';
17144         }
17145       else
17146         {
17147           suffix[0] = p[0];
17148           suffix[1] = p[1];
17149           suffix[2] = '\0';
17150         }
17151
17152       sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
17153       mnemonicendp += simd_cmp_op[cmp_type].len;
17154     }
17155   else
17156     {
17157       /* We have a reserved extension byte.  Output it directly.  */
17158       scratchbuf[0] = '$';
17159       print_operand_value (scratchbuf + 1, 1, cmp_type);
17160       oappend_maybe_intel (scratchbuf);
17161       scratchbuf[0] = '\0';
17162     }
17163 }
17164
17165 static const struct op pclmul_op[] =
17166 {
17167   { STRING_COMMA_LEN ("lql") },
17168   { STRING_COMMA_LEN ("hql") },
17169   { STRING_COMMA_LEN ("lqh") },
17170   { STRING_COMMA_LEN ("hqh") }
17171 };
17172
17173 static void
17174 PCLMUL_Fixup (int bytemode ATTRIBUTE_UNUSED,
17175               int sizeflag ATTRIBUTE_UNUSED)
17176 {
17177   unsigned int pclmul_type;
17178
17179   FETCH_DATA (the_info, codep + 1);
17180   pclmul_type = *codep++ & 0xff;
17181   switch (pclmul_type)
17182     {
17183     case 0x10:
17184       pclmul_type = 2;
17185       break;
17186     case 0x11:
17187       pclmul_type = 3;
17188       break;
17189     default:
17190       break;
17191     }
17192   if (pclmul_type < ARRAY_SIZE (pclmul_op))
17193     {
17194       char suffix [4];
17195       char *p = mnemonicendp - 3;
17196       suffix[0] = p[0];
17197       suffix[1] = p[1];
17198       suffix[2] = p[2];
17199       suffix[3] = '\0';
17200       sprintf (p, "%s%s", pclmul_op[pclmul_type].name, suffix);
17201       mnemonicendp += pclmul_op[pclmul_type].len;
17202     }
17203   else
17204     {
17205       /* We have a reserved extension byte.  Output it directly.  */
17206       scratchbuf[0] = '$';
17207       print_operand_value (scratchbuf + 1, 1, pclmul_type);
17208       oappend_maybe_intel (scratchbuf);
17209       scratchbuf[0] = '\0';
17210     }
17211 }
17212
17213 static void
17214 MOVBE_Fixup (int bytemode, int sizeflag)
17215 {
17216   /* Add proper suffix to "movbe".  */
17217   char *p = mnemonicendp;
17218
17219   switch (bytemode)
17220     {
17221     case v_mode:
17222       if (intel_syntax)
17223         goto skip;
17224
17225       USED_REX (REX_W);
17226       if (sizeflag & SUFFIX_ALWAYS)
17227         {
17228           if (rex & REX_W)
17229             *p++ = 'q';
17230           else
17231             {
17232               if (sizeflag & DFLAG)
17233                 *p++ = 'l';
17234               else
17235                 *p++ = 'w';
17236               used_prefixes |= (prefixes & PREFIX_DATA);
17237             }
17238         }
17239       break;
17240     default:
17241       oappend (INTERNAL_DISASSEMBLER_ERROR);
17242       break;
17243     }
17244   mnemonicendp = p;
17245   *p = '\0';
17246
17247 skip:
17248   OP_M (bytemode, sizeflag);
17249 }
17250
17251 static void
17252 OP_LWPCB_E (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
17253 {
17254   int reg;
17255   const char **names;
17256
17257   /* Skip mod/rm byte.  */
17258   MODRM_CHECK;
17259   codep++;
17260
17261   if (vex.w)
17262     names = names64;
17263   else
17264     names = names32;
17265
17266   reg = modrm.rm;
17267   USED_REX (REX_B);
17268   if (rex & REX_B)
17269     reg += 8;
17270
17271   oappend (names[reg]);
17272 }
17273
17274 static void
17275 OP_LWP_E (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
17276 {
17277   const char **names;
17278
17279   if (vex.w)
17280     names = names64;
17281   else
17282     names = names32;
17283
17284   oappend (names[vex.register_specifier]);
17285 }
17286
17287 static void
17288 OP_Mask (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
17289 {
17290   if (!vex.evex
17291       || (bytemode != mask_mode && bytemode != mask_bd_mode))
17292     abort ();
17293
17294   USED_REX (REX_R);
17295   if ((rex & REX_R) != 0 || !vex.r)
17296     {
17297       BadOp ();
17298       return;
17299     }
17300
17301   oappend (names_mask [modrm.reg]);
17302 }
17303
17304 static void
17305 OP_Rounding (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
17306 {
17307   if (!vex.evex
17308       || (bytemode != evex_rounding_mode
17309           && bytemode != evex_sae_mode))
17310     abort ();
17311   if (modrm.mod == 3 && vex.b)
17312     switch (bytemode)
17313       {
17314       case evex_rounding_mode:
17315         oappend (names_rounding[vex.ll]);
17316         break;
17317       case evex_sae_mode:
17318         oappend ("{sae}");
17319         break;
17320       default:
17321         break;
17322       }
17323 }