x86: Use individual prefix control for each opcode.
[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_MANDATORY_REPZ   PREFIX_REPZ
226 #define PREFIX_MANDATORY_REPNZ  PREFIX_REPNZ
227 #define PREFIX_MANDATORY_DATA   PREFIX_DATA
228 #define PREFIX_MANDATORY_ADDR   PREFIX_ADDR
229 #define PREFIX_MANDATORY_LOCK   PREFIX_LOCK
230 #define PREFIX_UD_SHIFT         16
231 #define PREFIX_UD_REPZ          (PREFIX_MANDATORY_REPZ << PREFIX_UD_SHIFT)
232 #define PREFIX_UD_REPNZ         (PREFIX_MANDATORY_REPNZ << PREFIX_UD_SHIFT)
233 #define PREFIX_UD_DATA          (PREFIX_MANDATORY_DATA << PREFIX_UD_SHIFT)
234 #define PREFIX_UD_ADDR          (PREFIX_MANDATORY_ADDR << PREFIX_UD_SHIFT)
235 #define PREFIX_UD_LOCK          (PREFIX_MANDATORY_LOCK << PREFIX_UD_SHIFT)
236
237 #define PREFIX_MANDATORY        (PREFIX_MANDATORY_REPZ \
238                                  | PREFIX_MANDATORY_REPNZ \
239                                  | PREFIX_MANDATORY_DATA)
240
241 #define XX { NULL, 0 }
242 #define Bad_Opcode NULL, { { NULL, 0 } }, PREFIX_MANDATORY
243
244 #define Eb { OP_E, b_mode }
245 #define Ebnd { OP_E, bnd_mode }
246 #define EbS { OP_E, b_swap_mode }
247 #define Ev { OP_E, v_mode }
248 #define Ev_bnd { OP_E, v_bnd_mode }
249 #define EvS { OP_E, v_swap_mode }
250 #define Ed { OP_E, d_mode }
251 #define Edq { OP_E, dq_mode }
252 #define Edqw { OP_E, dqw_mode }
253 #define EdqwS { OP_E, dqw_swap_mode }
254 #define Edqb { OP_E, dqb_mode }
255 #define Edb { OP_E, db_mode }
256 #define Edw { OP_E, dw_mode }
257 #define Edqd { OP_E, dqd_mode }
258 #define Eq { OP_E, q_mode }
259 #define indirEv { OP_indirE, stack_v_mode }
260 #define indirEp { OP_indirE, f_mode }
261 #define stackEv { OP_E, stack_v_mode }
262 #define Em { OP_E, m_mode }
263 #define Ew { OP_E, w_mode }
264 #define M { OP_M, 0 }           /* lea, lgdt, etc. */
265 #define Ma { OP_M, a_mode }
266 #define Mb { OP_M, b_mode }
267 #define Md { OP_M, d_mode }
268 #define Mo { OP_M, o_mode }
269 #define Mp { OP_M, f_mode }             /* 32 or 48 bit memory operand for LDS, LES etc */
270 #define Mq { OP_M, q_mode }
271 #define Mx { OP_M, x_mode }
272 #define Mxmm { OP_M, xmm_mode }
273 #define Gb { OP_G, b_mode }
274 #define Gbnd { OP_G, bnd_mode }
275 #define Gv { OP_G, v_mode }
276 #define Gd { OP_G, d_mode }
277 #define Gdq { OP_G, dq_mode }
278 #define Gm { OP_G, m_mode }
279 #define Gw { OP_G, w_mode }
280 #define Rd { OP_R, d_mode }
281 #define Rdq { OP_R, dq_mode }
282 #define Rm { OP_R, m_mode }
283 #define Ib { OP_I, b_mode }
284 #define sIb { OP_sI, b_mode }   /* sign extened byte */
285 #define sIbT { OP_sI, b_T_mode } /* sign extened byte like 'T' */
286 #define Iv { OP_I, v_mode }
287 #define sIv { OP_sI, v_mode }
288 #define Iq { OP_I, q_mode }
289 #define Iv64 { OP_I64, v_mode }
290 #define Iw { OP_I, w_mode }
291 #define I1 { OP_I, const_1_mode }
292 #define Jb { OP_J, b_mode }
293 #define Jv { OP_J, v_mode }
294 #define Cm { OP_C, m_mode }
295 #define Dm { OP_D, m_mode }
296 #define Td { OP_T, d_mode }
297 #define Skip_MODRM { OP_Skip_MODRM, 0 }
298
299 #define RMeAX { OP_REG, eAX_reg }
300 #define RMeBX { OP_REG, eBX_reg }
301 #define RMeCX { OP_REG, eCX_reg }
302 #define RMeDX { OP_REG, eDX_reg }
303 #define RMeSP { OP_REG, eSP_reg }
304 #define RMeBP { OP_REG, eBP_reg }
305 #define RMeSI { OP_REG, eSI_reg }
306 #define RMeDI { OP_REG, eDI_reg }
307 #define RMrAX { OP_REG, rAX_reg }
308 #define RMrBX { OP_REG, rBX_reg }
309 #define RMrCX { OP_REG, rCX_reg }
310 #define RMrDX { OP_REG, rDX_reg }
311 #define RMrSP { OP_REG, rSP_reg }
312 #define RMrBP { OP_REG, rBP_reg }
313 #define RMrSI { OP_REG, rSI_reg }
314 #define RMrDI { OP_REG, rDI_reg }
315 #define RMAL { OP_REG, al_reg }
316 #define RMCL { OP_REG, cl_reg }
317 #define RMDL { OP_REG, dl_reg }
318 #define RMBL { OP_REG, bl_reg }
319 #define RMAH { OP_REG, ah_reg }
320 #define RMCH { OP_REG, ch_reg }
321 #define RMDH { OP_REG, dh_reg }
322 #define RMBH { OP_REG, bh_reg }
323 #define RMAX { OP_REG, ax_reg }
324 #define RMDX { OP_REG, dx_reg }
325
326 #define eAX { OP_IMREG, eAX_reg }
327 #define eBX { OP_IMREG, eBX_reg }
328 #define eCX { OP_IMREG, eCX_reg }
329 #define eDX { OP_IMREG, eDX_reg }
330 #define eSP { OP_IMREG, eSP_reg }
331 #define eBP { OP_IMREG, eBP_reg }
332 #define eSI { OP_IMREG, eSI_reg }
333 #define eDI { OP_IMREG, eDI_reg }
334 #define AL { OP_IMREG, al_reg }
335 #define CL { OP_IMREG, cl_reg }
336 #define DL { OP_IMREG, dl_reg }
337 #define BL { OP_IMREG, bl_reg }
338 #define AH { OP_IMREG, ah_reg }
339 #define CH { OP_IMREG, ch_reg }
340 #define DH { OP_IMREG, dh_reg }
341 #define BH { OP_IMREG, bh_reg }
342 #define AX { OP_IMREG, ax_reg }
343 #define DX { OP_IMREG, dx_reg }
344 #define zAX { OP_IMREG, z_mode_ax_reg }
345 #define indirDX { OP_IMREG, indir_dx_reg }
346
347 #define Sw { OP_SEG, w_mode }
348 #define Sv { OP_SEG, v_mode }
349 #define Ap { OP_DIR, 0 }
350 #define Ob { OP_OFF64, b_mode }
351 #define Ov { OP_OFF64, v_mode }
352 #define Xb { OP_DSreg, eSI_reg }
353 #define Xv { OP_DSreg, eSI_reg }
354 #define Xz { OP_DSreg, eSI_reg }
355 #define Yb { OP_ESreg, eDI_reg }
356 #define Yv { OP_ESreg, eDI_reg }
357 #define DSBX { OP_DSreg, eBX_reg }
358
359 #define es { OP_REG, es_reg }
360 #define ss { OP_REG, ss_reg }
361 #define cs { OP_REG, cs_reg }
362 #define ds { OP_REG, ds_reg }
363 #define fs { OP_REG, fs_reg }
364 #define gs { OP_REG, gs_reg }
365
366 #define MX { OP_MMX, 0 }
367 #define XM { OP_XMM, 0 }
368 #define XMScalar { OP_XMM, scalar_mode }
369 #define XMGatherQ { OP_XMM, vex_vsib_q_w_dq_mode }
370 #define XMM { OP_XMM, xmm_mode }
371 #define XMxmmq { OP_XMM, xmmq_mode }
372 #define EM { OP_EM, v_mode }
373 #define EMS { OP_EM, v_swap_mode }
374 #define EMd { OP_EM, d_mode }
375 #define EMx { OP_EM, x_mode }
376 #define EXw { OP_EX, w_mode }
377 #define EXd { OP_EX, d_mode }
378 #define EXdScalar { OP_EX, d_scalar_mode }
379 #define EXdS { OP_EX, d_swap_mode }
380 #define EXdScalarS { OP_EX, d_scalar_swap_mode }
381 #define EXq { OP_EX, q_mode }
382 #define EXqScalar { OP_EX, q_scalar_mode }
383 #define EXqScalarS { OP_EX, q_scalar_swap_mode }
384 #define EXqS { OP_EX, q_swap_mode }
385 #define EXx { OP_EX, x_mode }
386 #define EXxS { OP_EX, x_swap_mode }
387 #define EXxmm { OP_EX, xmm_mode }
388 #define EXymm { OP_EX, ymm_mode }
389 #define EXxmmq { OP_EX, xmmq_mode }
390 #define EXEvexHalfBcstXmmq { OP_EX, evex_half_bcst_xmmq_mode }
391 #define EXxmm_mb { OP_EX, xmm_mb_mode }
392 #define EXxmm_mw { OP_EX, xmm_mw_mode }
393 #define EXxmm_md { OP_EX, xmm_md_mode }
394 #define EXxmm_mq { OP_EX, xmm_mq_mode }
395 #define EXxmm_mdq { OP_EX, xmm_mdq_mode }
396 #define EXxmmdw { OP_EX, xmmdw_mode }
397 #define EXxmmqd { OP_EX, xmmqd_mode }
398 #define EXymmq { OP_EX, ymmq_mode }
399 #define EXVexWdq { OP_EX, vex_w_dq_mode }
400 #define EXVexWdqScalar { OP_EX, vex_scalar_w_dq_mode }
401 #define EXEvexXGscat { OP_EX, evex_x_gscat_mode }
402 #define EXEvexXNoBcst { OP_EX, evex_x_nobcst_mode }
403 #define MS { OP_MS, v_mode }
404 #define XS { OP_XS, v_mode }
405 #define EMCq { OP_EMC, q_mode }
406 #define MXC { OP_MXC, 0 }
407 #define OPSUF { OP_3DNowSuffix, 0 }
408 #define CMP { CMP_Fixup, 0 }
409 #define XMM0 { XMM_Fixup, 0 }
410 #define FXSAVE { FXSAVE_Fixup, 0 }
411 #define Vex_2src_1 { OP_Vex_2src_1, 0 }
412 #define Vex_2src_2 { OP_Vex_2src_2, 0 }
413
414 #define Vex { OP_VEX, vex_mode }
415 #define VexScalar { OP_VEX, vex_scalar_mode }
416 #define VexGatherQ { OP_VEX, vex_vsib_q_w_dq_mode }
417 #define Vex128 { OP_VEX, vex128_mode }
418 #define Vex256 { OP_VEX, vex256_mode }
419 #define VexGdq { OP_VEX, dq_mode }
420 #define VexI4 { VEXI4_Fixup, 0}
421 #define EXdVex { OP_EX_Vex, d_mode }
422 #define EXdVexS { OP_EX_Vex, d_swap_mode }
423 #define EXdVexScalarS { OP_EX_Vex, d_scalar_swap_mode }
424 #define EXqVex { OP_EX_Vex, q_mode }
425 #define EXqVexS { OP_EX_Vex, q_swap_mode }
426 #define EXqVexScalarS { OP_EX_Vex, q_scalar_swap_mode }
427 #define EXVexW { OP_EX_VexW, x_mode }
428 #define EXdVexW { OP_EX_VexW, d_mode }
429 #define EXqVexW { OP_EX_VexW, q_mode }
430 #define EXVexImmW { OP_EX_VexImmW, x_mode }
431 #define XMVex { OP_XMM_Vex, 0 }
432 #define XMVexScalar { OP_XMM_Vex, scalar_mode }
433 #define XMVexW { OP_XMM_VexW, 0 }
434 #define XMVexI4 { OP_REG_VexI4, x_mode }
435 #define PCLMUL { PCLMUL_Fixup, 0 }
436 #define VZERO { VZERO_Fixup, 0 }
437 #define VCMP { VCMP_Fixup, 0 }
438 #define VPCMP { VPCMP_Fixup, 0 }
439
440 #define EXxEVexR { OP_Rounding, evex_rounding_mode }
441 #define EXxEVexS { OP_Rounding, evex_sae_mode }
442
443 #define XMask { OP_Mask, mask_mode }
444 #define MaskG { OP_G, mask_mode }
445 #define MaskE { OP_E, mask_mode }
446 #define MaskBDE { OP_E, mask_bd_mode }
447 #define MaskR { OP_R, mask_mode }
448 #define MaskVex { OP_VEX, mask_mode }
449
450 #define MVexVSIBDWpX { OP_M, vex_vsib_d_w_dq_mode }
451 #define MVexVSIBDQWpX { OP_M, vex_vsib_d_w_d_mode }
452 #define MVexVSIBQWpX { OP_M, vex_vsib_q_w_dq_mode }
453 #define MVexVSIBQDWpX { OP_M, vex_vsib_q_w_d_mode }
454
455 /* Used handle "rep" prefix for string instructions.  */
456 #define Xbr { REP_Fixup, eSI_reg }
457 #define Xvr { REP_Fixup, eSI_reg }
458 #define Ybr { REP_Fixup, eDI_reg }
459 #define Yvr { REP_Fixup, eDI_reg }
460 #define Yzr { REP_Fixup, eDI_reg }
461 #define indirDXr { REP_Fixup, indir_dx_reg }
462 #define ALr { REP_Fixup, al_reg }
463 #define eAXr { REP_Fixup, eAX_reg }
464
465 /* Used handle HLE prefix for lockable instructions.  */
466 #define Ebh1 { HLE_Fixup1, b_mode }
467 #define Evh1 { HLE_Fixup1, v_mode }
468 #define Ebh2 { HLE_Fixup2, b_mode }
469 #define Evh2 { HLE_Fixup2, v_mode }
470 #define Ebh3 { HLE_Fixup3, b_mode }
471 #define Evh3 { HLE_Fixup3, v_mode }
472
473 #define BND { BND_Fixup, 0 }
474
475 #define cond_jump_flag { NULL, cond_jump_mode }
476 #define loop_jcxz_flag { NULL, loop_jcxz_mode }
477
478 /* bits in sizeflag */
479 #define SUFFIX_ALWAYS 4
480 #define AFLAG 2
481 #define DFLAG 1
482
483 enum
484 {
485   /* byte operand */
486   b_mode = 1,
487   /* byte operand with operand swapped */
488   b_swap_mode,
489   /* byte operand, sign extend like 'T' suffix */
490   b_T_mode,
491   /* operand size depends on prefixes */
492   v_mode,
493   /* operand size depends on prefixes with operand swapped */
494   v_swap_mode,
495   /* word operand */
496   w_mode,
497   /* double word operand  */
498   d_mode,
499   /* double word operand with operand swapped */
500   d_swap_mode,
501   /* quad word operand */
502   q_mode,
503   /* quad word operand with operand swapped */
504   q_swap_mode,
505   /* ten-byte operand */
506   t_mode,
507   /* 16-byte XMM, 32-byte YMM or 64-byte ZMM operand.  In EVEX with
508      broadcast enabled.  */
509   x_mode,
510   /* Similar to x_mode, but with different EVEX mem shifts.  */
511   evex_x_gscat_mode,
512   /* Similar to x_mode, but with disabled broadcast.  */
513   evex_x_nobcst_mode,
514   /* Similar to x_mode, but with operands swapped and disabled broadcast
515      in EVEX.  */
516   x_swap_mode,
517   /* 16-byte XMM operand */
518   xmm_mode,
519   /* XMM, XMM or YMM register operand, or quad word, xmmword or ymmword
520      memory operand (depending on vector length).  Broadcast isn't
521      allowed.  */
522   xmmq_mode,
523   /* Same as xmmq_mode, but broadcast is allowed.  */
524   evex_half_bcst_xmmq_mode,
525   /* XMM register or byte memory operand */
526   xmm_mb_mode,
527   /* XMM register or word memory operand */
528   xmm_mw_mode,
529   /* XMM register or double word memory operand */
530   xmm_md_mode,
531   /* XMM register or quad word memory operand */
532   xmm_mq_mode,
533   /* XMM register or double/quad word memory operand, depending on
534      VEX.W.  */
535   xmm_mdq_mode,
536   /* 16-byte XMM, word, double word or quad word operand.  */
537   xmmdw_mode,
538   /* 16-byte XMM, double word, quad word operand or xmm word operand.  */
539   xmmqd_mode,
540   /* 32-byte YMM operand */
541   ymm_mode,
542   /* quad word, ymmword or zmmword memory operand.  */
543   ymmq_mode,
544   /* 32-byte YMM or 16-byte word operand */
545   ymmxmm_mode,
546   /* d_mode in 32bit, q_mode in 64bit mode.  */
547   m_mode,
548   /* pair of v_mode operands */
549   a_mode,
550   cond_jump_mode,
551   loop_jcxz_mode,
552   v_bnd_mode,
553   /* operand size depends on REX prefixes.  */
554   dq_mode,
555   /* registers like dq_mode, memory like w_mode.  */
556   dqw_mode,
557   dqw_swap_mode,
558   bnd_mode,
559   /* 4- or 6-byte pointer operand */
560   f_mode,
561   const_1_mode,
562   /* v_mode for stack-related opcodes.  */
563   stack_v_mode,
564   /* non-quad operand size depends on prefixes */
565   z_mode,
566   /* 16-byte operand */
567   o_mode,
568   /* registers like dq_mode, memory like b_mode.  */
569   dqb_mode,
570   /* registers like d_mode, memory like b_mode.  */
571   db_mode,
572   /* registers like d_mode, memory like w_mode.  */
573   dw_mode,
574   /* registers like dq_mode, memory like d_mode.  */
575   dqd_mode,
576   /* normal vex mode */
577   vex_mode,
578   /* 128bit vex mode */
579   vex128_mode,
580   /* 256bit vex mode */
581   vex256_mode,
582   /* operand size depends on the VEX.W bit.  */
583   vex_w_dq_mode,
584
585   /* Similar to vex_w_dq_mode, with VSIB dword indices.  */
586   vex_vsib_d_w_dq_mode,
587   /* Similar to vex_vsib_d_w_dq_mode, with smaller memory.  */
588   vex_vsib_d_w_d_mode,
589   /* Similar to vex_w_dq_mode, with VSIB qword indices.  */
590   vex_vsib_q_w_dq_mode,
591   /* Similar to vex_vsib_q_w_dq_mode, with smaller memory.  */
592   vex_vsib_q_w_d_mode,
593
594   /* scalar, ignore vector length.  */
595   scalar_mode,
596   /* like d_mode, ignore vector length.  */
597   d_scalar_mode,
598   /* like d_swap_mode, ignore vector length.  */
599   d_scalar_swap_mode,
600   /* like q_mode, ignore vector length.  */
601   q_scalar_mode,
602   /* like q_swap_mode, ignore vector length.  */
603   q_scalar_swap_mode,
604   /* like vex_mode, ignore vector length.  */
605   vex_scalar_mode,
606   /* like vex_w_dq_mode, ignore vector length.  */
607   vex_scalar_w_dq_mode,
608
609   /* Static rounding.  */
610   evex_rounding_mode,
611   /* Supress all exceptions.  */
612   evex_sae_mode,
613
614   /* Mask register operand.  */
615   mask_mode,
616   /* Mask register operand.  */
617   mask_bd_mode,
618
619   es_reg,
620   cs_reg,
621   ss_reg,
622   ds_reg,
623   fs_reg,
624   gs_reg,
625
626   eAX_reg,
627   eCX_reg,
628   eDX_reg,
629   eBX_reg,
630   eSP_reg,
631   eBP_reg,
632   eSI_reg,
633   eDI_reg,
634
635   al_reg,
636   cl_reg,
637   dl_reg,
638   bl_reg,
639   ah_reg,
640   ch_reg,
641   dh_reg,
642   bh_reg,
643
644   ax_reg,
645   cx_reg,
646   dx_reg,
647   bx_reg,
648   sp_reg,
649   bp_reg,
650   si_reg,
651   di_reg,
652
653   rAX_reg,
654   rCX_reg,
655   rDX_reg,
656   rBX_reg,
657   rSP_reg,
658   rBP_reg,
659   rSI_reg,
660   rDI_reg,
661
662   z_mode_ax_reg,
663   indir_dx_reg
664 };
665
666 enum
667 {
668   FLOATCODE = 1,
669   USE_REG_TABLE,
670   USE_MOD_TABLE,
671   USE_RM_TABLE,
672   USE_PREFIX_TABLE,
673   USE_X86_64_TABLE,
674   USE_3BYTE_TABLE,
675   USE_XOP_8F_TABLE,
676   USE_VEX_C4_TABLE,
677   USE_VEX_C5_TABLE,
678   USE_VEX_LEN_TABLE,
679   USE_VEX_W_TABLE,
680   USE_EVEX_TABLE
681 };
682
683 #define FLOAT                   NULL, { { NULL, FLOATCODE } }, 0
684
685 #define DIS386(T, I)            NULL, { { NULL, (T)}, { NULL,  (I) } }, 0
686 #define DIS386_PREFIX(T, I, P)          NULL, { { NULL, (T)}, { NULL,  (I) } }, P
687 #define REG_TABLE(I)            DIS386 (USE_REG_TABLE, (I))
688 #define MOD_TABLE(I)            DIS386 (USE_MOD_TABLE, (I))
689 #define RM_TABLE(I)             DIS386 (USE_RM_TABLE, (I))
690 #define PREFIX_TABLE(I)         DIS386 (USE_PREFIX_TABLE, (I))
691 #define X86_64_TABLE(I)         DIS386 (USE_X86_64_TABLE, (I))
692 #define THREE_BYTE_TABLE(I)     DIS386 (USE_3BYTE_TABLE, (I))
693 #define THREE_BYTE_TABLE_PREFIX(I, P)   DIS386_PREFIX (USE_3BYTE_TABLE, (I), P)
694 #define XOP_8F_TABLE(I)         DIS386 (USE_XOP_8F_TABLE, (I))
695 #define VEX_C4_TABLE(I)         DIS386 (USE_VEX_C4_TABLE, (I))
696 #define VEX_C5_TABLE(I)         DIS386 (USE_VEX_C5_TABLE, (I))
697 #define VEX_LEN_TABLE(I)        DIS386 (USE_VEX_LEN_TABLE, (I))
698 #define VEX_W_TABLE(I)          DIS386 (USE_VEX_W_TABLE, (I))
699 #define EVEX_TABLE(I)           DIS386 (USE_EVEX_TABLE, (I))
700
701 enum
702 {
703   REG_80 = 0,
704   REG_81,
705   REG_82,
706   REG_8F,
707   REG_C0,
708   REG_C1,
709   REG_C6,
710   REG_C7,
711   REG_D0,
712   REG_D1,
713   REG_D2,
714   REG_D3,
715   REG_F6,
716   REG_F7,
717   REG_FE,
718   REG_FF,
719   REG_0F00,
720   REG_0F01,
721   REG_0F0D,
722   REG_0F18,
723   REG_0F71,
724   REG_0F72,
725   REG_0F73,
726   REG_0FA6,
727   REG_0FA7,
728   REG_0FAE,
729   REG_0FBA,
730   REG_0FC7,
731   REG_VEX_0F71,
732   REG_VEX_0F72,
733   REG_VEX_0F73,
734   REG_VEX_0FAE,
735   REG_VEX_0F38F3,
736   REG_XOP_LWPCB,
737   REG_XOP_LWP,
738   REG_XOP_TBM_01,
739   REG_XOP_TBM_02,
740
741   REG_EVEX_0F71,
742   REG_EVEX_0F72,
743   REG_EVEX_0F73,
744   REG_EVEX_0F38C6,
745   REG_EVEX_0F38C7
746 };
747
748 enum
749 {
750   MOD_8D = 0,
751   MOD_C6_REG_7,
752   MOD_C7_REG_7,
753   MOD_FF_REG_3,
754   MOD_FF_REG_5,
755   MOD_0F01_REG_0,
756   MOD_0F01_REG_1,
757   MOD_0F01_REG_2,
758   MOD_0F01_REG_3,
759   MOD_0F01_REG_7,
760   MOD_0F12_PREFIX_0,
761   MOD_0F13,
762   MOD_0F16_PREFIX_0,
763   MOD_0F17,
764   MOD_0F18_REG_0,
765   MOD_0F18_REG_1,
766   MOD_0F18_REG_2,
767   MOD_0F18_REG_3,
768   MOD_0F18_REG_4,
769   MOD_0F18_REG_5,
770   MOD_0F18_REG_6,
771   MOD_0F18_REG_7,
772   MOD_0F1A_PREFIX_0,
773   MOD_0F1B_PREFIX_0,
774   MOD_0F1B_PREFIX_1,
775   MOD_0F24,
776   MOD_0F26,
777   MOD_0F2B_PREFIX_0,
778   MOD_0F2B_PREFIX_1,
779   MOD_0F2B_PREFIX_2,
780   MOD_0F2B_PREFIX_3,
781   MOD_0F51,
782   MOD_0F71_REG_2,
783   MOD_0F71_REG_4,
784   MOD_0F71_REG_6,
785   MOD_0F72_REG_2,
786   MOD_0F72_REG_4,
787   MOD_0F72_REG_6,
788   MOD_0F73_REG_2,
789   MOD_0F73_REG_3,
790   MOD_0F73_REG_6,
791   MOD_0F73_REG_7,
792   MOD_0FAE_REG_0,
793   MOD_0FAE_REG_1,
794   MOD_0FAE_REG_2,
795   MOD_0FAE_REG_3,
796   MOD_0FAE_REG_4,
797   MOD_0FAE_REG_5,
798   MOD_0FAE_REG_6,
799   MOD_0FAE_REG_7,
800   MOD_0FB2,
801   MOD_0FB4,
802   MOD_0FB5,
803   MOD_0FC7_REG_3,
804   MOD_0FC7_REG_4,
805   MOD_0FC7_REG_5,
806   MOD_0FC7_REG_6,
807   MOD_0FC7_REG_7,
808   MOD_0FD7,
809   MOD_0FE7_PREFIX_2,
810   MOD_0FF0_PREFIX_3,
811   MOD_0F382A_PREFIX_2,
812   MOD_62_32BIT,
813   MOD_C4_32BIT,
814   MOD_C5_32BIT,
815   MOD_VEX_0F12_PREFIX_0,
816   MOD_VEX_0F13,
817   MOD_VEX_0F16_PREFIX_0,
818   MOD_VEX_0F17,
819   MOD_VEX_0F2B,
820   MOD_VEX_0F50,
821   MOD_VEX_0F71_REG_2,
822   MOD_VEX_0F71_REG_4,
823   MOD_VEX_0F71_REG_6,
824   MOD_VEX_0F72_REG_2,
825   MOD_VEX_0F72_REG_4,
826   MOD_VEX_0F72_REG_6,
827   MOD_VEX_0F73_REG_2,
828   MOD_VEX_0F73_REG_3,
829   MOD_VEX_0F73_REG_6,
830   MOD_VEX_0F73_REG_7,
831   MOD_VEX_0FAE_REG_2,
832   MOD_VEX_0FAE_REG_3,
833   MOD_VEX_0FD7_PREFIX_2,
834   MOD_VEX_0FE7_PREFIX_2,
835   MOD_VEX_0FF0_PREFIX_3,
836   MOD_VEX_0F381A_PREFIX_2,
837   MOD_VEX_0F382A_PREFIX_2,
838   MOD_VEX_0F382C_PREFIX_2,
839   MOD_VEX_0F382D_PREFIX_2,
840   MOD_VEX_0F382E_PREFIX_2,
841   MOD_VEX_0F382F_PREFIX_2,
842   MOD_VEX_0F385A_PREFIX_2,
843   MOD_VEX_0F388C_PREFIX_2,
844   MOD_VEX_0F388E_PREFIX_2,
845
846   MOD_EVEX_0F10_PREFIX_1,
847   MOD_EVEX_0F10_PREFIX_3,
848   MOD_EVEX_0F11_PREFIX_1,
849   MOD_EVEX_0F11_PREFIX_3,
850   MOD_EVEX_0F12_PREFIX_0,
851   MOD_EVEX_0F16_PREFIX_0,
852   MOD_EVEX_0F38C6_REG_1,
853   MOD_EVEX_0F38C6_REG_2,
854   MOD_EVEX_0F38C6_REG_5,
855   MOD_EVEX_0F38C6_REG_6,
856   MOD_EVEX_0F38C7_REG_1,
857   MOD_EVEX_0F38C7_REG_2,
858   MOD_EVEX_0F38C7_REG_5,
859   MOD_EVEX_0F38C7_REG_6
860 };
861
862 enum
863 {
864   RM_C6_REG_7 = 0,
865   RM_C7_REG_7,
866   RM_0F01_REG_0,
867   RM_0F01_REG_1,
868   RM_0F01_REG_2,
869   RM_0F01_REG_3,
870   RM_0F01_REG_7,
871   RM_0FAE_REG_5,
872   RM_0FAE_REG_6,
873   RM_0FAE_REG_7
874 };
875
876 enum
877 {
878   PREFIX_90 = 0,
879   PREFIX_0F10,
880   PREFIX_0F11,
881   PREFIX_0F12,
882   PREFIX_0F16,
883   PREFIX_0F1A,
884   PREFIX_0F1B,
885   PREFIX_0F2A,
886   PREFIX_0F2B,
887   PREFIX_0F2C,
888   PREFIX_0F2D,
889   PREFIX_0F2E,
890   PREFIX_0F2F,
891   PREFIX_0F51,
892   PREFIX_0F52,
893   PREFIX_0F53,
894   PREFIX_0F58,
895   PREFIX_0F59,
896   PREFIX_0F5A,
897   PREFIX_0F5B,
898   PREFIX_0F5C,
899   PREFIX_0F5D,
900   PREFIX_0F5E,
901   PREFIX_0F5F,
902   PREFIX_0F60,
903   PREFIX_0F61,
904   PREFIX_0F62,
905   PREFIX_0F6C,
906   PREFIX_0F6D,
907   PREFIX_0F6F,
908   PREFIX_0F70,
909   PREFIX_0F73_REG_3,
910   PREFIX_0F73_REG_7,
911   PREFIX_0F78,
912   PREFIX_0F79,
913   PREFIX_0F7C,
914   PREFIX_0F7D,
915   PREFIX_0F7E,
916   PREFIX_0F7F,
917   PREFIX_0FAE_REG_0,
918   PREFIX_0FAE_REG_1,
919   PREFIX_0FAE_REG_2,
920   PREFIX_0FAE_REG_3,
921   PREFIX_0FAE_REG_6,
922   PREFIX_0FAE_REG_7,
923   PREFIX_RM_0_0FAE_REG_7,
924   PREFIX_0FB8,
925   PREFIX_0FBC,
926   PREFIX_0FBD,
927   PREFIX_0FC2,
928   PREFIX_0FC3,
929   PREFIX_0FC7_REG_6,
930   PREFIX_0FD0,
931   PREFIX_0FD6,
932   PREFIX_0FE6,
933   PREFIX_0FE7,
934   PREFIX_0FF0,
935   PREFIX_0FF7,
936   PREFIX_0F3810,
937   PREFIX_0F3814,
938   PREFIX_0F3815,
939   PREFIX_0F3817,
940   PREFIX_0F3820,
941   PREFIX_0F3821,
942   PREFIX_0F3822,
943   PREFIX_0F3823,
944   PREFIX_0F3824,
945   PREFIX_0F3825,
946   PREFIX_0F3828,
947   PREFIX_0F3829,
948   PREFIX_0F382A,
949   PREFIX_0F382B,
950   PREFIX_0F3830,
951   PREFIX_0F3831,
952   PREFIX_0F3832,
953   PREFIX_0F3833,
954   PREFIX_0F3834,
955   PREFIX_0F3835,
956   PREFIX_0F3837,
957   PREFIX_0F3838,
958   PREFIX_0F3839,
959   PREFIX_0F383A,
960   PREFIX_0F383B,
961   PREFIX_0F383C,
962   PREFIX_0F383D,
963   PREFIX_0F383E,
964   PREFIX_0F383F,
965   PREFIX_0F3840,
966   PREFIX_0F3841,
967   PREFIX_0F3880,
968   PREFIX_0F3881,
969   PREFIX_0F3882,
970   PREFIX_0F38C8,
971   PREFIX_0F38C9,
972   PREFIX_0F38CA,
973   PREFIX_0F38CB,
974   PREFIX_0F38CC,
975   PREFIX_0F38CD,
976   PREFIX_0F38DB,
977   PREFIX_0F38DC,
978   PREFIX_0F38DD,
979   PREFIX_0F38DE,
980   PREFIX_0F38DF,
981   PREFIX_0F38F0,
982   PREFIX_0F38F1,
983   PREFIX_0F38F6,
984   PREFIX_0F3A08,
985   PREFIX_0F3A09,
986   PREFIX_0F3A0A,
987   PREFIX_0F3A0B,
988   PREFIX_0F3A0C,
989   PREFIX_0F3A0D,
990   PREFIX_0F3A0E,
991   PREFIX_0F3A14,
992   PREFIX_0F3A15,
993   PREFIX_0F3A16,
994   PREFIX_0F3A17,
995   PREFIX_0F3A20,
996   PREFIX_0F3A21,
997   PREFIX_0F3A22,
998   PREFIX_0F3A40,
999   PREFIX_0F3A41,
1000   PREFIX_0F3A42,
1001   PREFIX_0F3A44,
1002   PREFIX_0F3A60,
1003   PREFIX_0F3A61,
1004   PREFIX_0F3A62,
1005   PREFIX_0F3A63,
1006   PREFIX_0F3ACC,
1007   PREFIX_0F3ADF,
1008   PREFIX_VEX_0F10,
1009   PREFIX_VEX_0F11,
1010   PREFIX_VEX_0F12,
1011   PREFIX_VEX_0F16,
1012   PREFIX_VEX_0F2A,
1013   PREFIX_VEX_0F2C,
1014   PREFIX_VEX_0F2D,
1015   PREFIX_VEX_0F2E,
1016   PREFIX_VEX_0F2F,
1017   PREFIX_VEX_0F41,
1018   PREFIX_VEX_0F42,
1019   PREFIX_VEX_0F44,
1020   PREFIX_VEX_0F45,
1021   PREFIX_VEX_0F46,
1022   PREFIX_VEX_0F47,
1023   PREFIX_VEX_0F4A,
1024   PREFIX_VEX_0F4B,
1025   PREFIX_VEX_0F51,
1026   PREFIX_VEX_0F52,
1027   PREFIX_VEX_0F53,
1028   PREFIX_VEX_0F58,
1029   PREFIX_VEX_0F59,
1030   PREFIX_VEX_0F5A,
1031   PREFIX_VEX_0F5B,
1032   PREFIX_VEX_0F5C,
1033   PREFIX_VEX_0F5D,
1034   PREFIX_VEX_0F5E,
1035   PREFIX_VEX_0F5F,
1036   PREFIX_VEX_0F60,
1037   PREFIX_VEX_0F61,
1038   PREFIX_VEX_0F62,
1039   PREFIX_VEX_0F63,
1040   PREFIX_VEX_0F64,
1041   PREFIX_VEX_0F65,
1042   PREFIX_VEX_0F66,
1043   PREFIX_VEX_0F67,
1044   PREFIX_VEX_0F68,
1045   PREFIX_VEX_0F69,
1046   PREFIX_VEX_0F6A,
1047   PREFIX_VEX_0F6B,
1048   PREFIX_VEX_0F6C,
1049   PREFIX_VEX_0F6D,
1050   PREFIX_VEX_0F6E,
1051   PREFIX_VEX_0F6F,
1052   PREFIX_VEX_0F70,
1053   PREFIX_VEX_0F71_REG_2,
1054   PREFIX_VEX_0F71_REG_4,
1055   PREFIX_VEX_0F71_REG_6,
1056   PREFIX_VEX_0F72_REG_2,
1057   PREFIX_VEX_0F72_REG_4,
1058   PREFIX_VEX_0F72_REG_6,
1059   PREFIX_VEX_0F73_REG_2,
1060   PREFIX_VEX_0F73_REG_3,
1061   PREFIX_VEX_0F73_REG_6,
1062   PREFIX_VEX_0F73_REG_7,
1063   PREFIX_VEX_0F74,
1064   PREFIX_VEX_0F75,
1065   PREFIX_VEX_0F76,
1066   PREFIX_VEX_0F77,
1067   PREFIX_VEX_0F7C,
1068   PREFIX_VEX_0F7D,
1069   PREFIX_VEX_0F7E,
1070   PREFIX_VEX_0F7F,
1071   PREFIX_VEX_0F90,
1072   PREFIX_VEX_0F91,
1073   PREFIX_VEX_0F92,
1074   PREFIX_VEX_0F93,
1075   PREFIX_VEX_0F98,
1076   PREFIX_VEX_0F99,
1077   PREFIX_VEX_0FC2,
1078   PREFIX_VEX_0FC4,
1079   PREFIX_VEX_0FC5,
1080   PREFIX_VEX_0FD0,
1081   PREFIX_VEX_0FD1,
1082   PREFIX_VEX_0FD2,
1083   PREFIX_VEX_0FD3,
1084   PREFIX_VEX_0FD4,
1085   PREFIX_VEX_0FD5,
1086   PREFIX_VEX_0FD6,
1087   PREFIX_VEX_0FD7,
1088   PREFIX_VEX_0FD8,
1089   PREFIX_VEX_0FD9,
1090   PREFIX_VEX_0FDA,
1091   PREFIX_VEX_0FDB,
1092   PREFIX_VEX_0FDC,
1093   PREFIX_VEX_0FDD,
1094   PREFIX_VEX_0FDE,
1095   PREFIX_VEX_0FDF,
1096   PREFIX_VEX_0FE0,
1097   PREFIX_VEX_0FE1,
1098   PREFIX_VEX_0FE2,
1099   PREFIX_VEX_0FE3,
1100   PREFIX_VEX_0FE4,
1101   PREFIX_VEX_0FE5,
1102   PREFIX_VEX_0FE6,
1103   PREFIX_VEX_0FE7,
1104   PREFIX_VEX_0FE8,
1105   PREFIX_VEX_0FE9,
1106   PREFIX_VEX_0FEA,
1107   PREFIX_VEX_0FEB,
1108   PREFIX_VEX_0FEC,
1109   PREFIX_VEX_0FED,
1110   PREFIX_VEX_0FEE,
1111   PREFIX_VEX_0FEF,
1112   PREFIX_VEX_0FF0,
1113   PREFIX_VEX_0FF1,
1114   PREFIX_VEX_0FF2,
1115   PREFIX_VEX_0FF3,
1116   PREFIX_VEX_0FF4,
1117   PREFIX_VEX_0FF5,
1118   PREFIX_VEX_0FF6,
1119   PREFIX_VEX_0FF7,
1120   PREFIX_VEX_0FF8,
1121   PREFIX_VEX_0FF9,
1122   PREFIX_VEX_0FFA,
1123   PREFIX_VEX_0FFB,
1124   PREFIX_VEX_0FFC,
1125   PREFIX_VEX_0FFD,
1126   PREFIX_VEX_0FFE,
1127   PREFIX_VEX_0F3800,
1128   PREFIX_VEX_0F3801,
1129   PREFIX_VEX_0F3802,
1130   PREFIX_VEX_0F3803,
1131   PREFIX_VEX_0F3804,
1132   PREFIX_VEX_0F3805,
1133   PREFIX_VEX_0F3806,
1134   PREFIX_VEX_0F3807,
1135   PREFIX_VEX_0F3808,
1136   PREFIX_VEX_0F3809,
1137   PREFIX_VEX_0F380A,
1138   PREFIX_VEX_0F380B,
1139   PREFIX_VEX_0F380C,
1140   PREFIX_VEX_0F380D,
1141   PREFIX_VEX_0F380E,
1142   PREFIX_VEX_0F380F,
1143   PREFIX_VEX_0F3813,
1144   PREFIX_VEX_0F3816,
1145   PREFIX_VEX_0F3817,
1146   PREFIX_VEX_0F3818,
1147   PREFIX_VEX_0F3819,
1148   PREFIX_VEX_0F381A,
1149   PREFIX_VEX_0F381C,
1150   PREFIX_VEX_0F381D,
1151   PREFIX_VEX_0F381E,
1152   PREFIX_VEX_0F3820,
1153   PREFIX_VEX_0F3821,
1154   PREFIX_VEX_0F3822,
1155   PREFIX_VEX_0F3823,
1156   PREFIX_VEX_0F3824,
1157   PREFIX_VEX_0F3825,
1158   PREFIX_VEX_0F3828,
1159   PREFIX_VEX_0F3829,
1160   PREFIX_VEX_0F382A,
1161   PREFIX_VEX_0F382B,
1162   PREFIX_VEX_0F382C,
1163   PREFIX_VEX_0F382D,
1164   PREFIX_VEX_0F382E,
1165   PREFIX_VEX_0F382F,
1166   PREFIX_VEX_0F3830,
1167   PREFIX_VEX_0F3831,
1168   PREFIX_VEX_0F3832,
1169   PREFIX_VEX_0F3833,
1170   PREFIX_VEX_0F3834,
1171   PREFIX_VEX_0F3835,
1172   PREFIX_VEX_0F3836,
1173   PREFIX_VEX_0F3837,
1174   PREFIX_VEX_0F3838,
1175   PREFIX_VEX_0F3839,
1176   PREFIX_VEX_0F383A,
1177   PREFIX_VEX_0F383B,
1178   PREFIX_VEX_0F383C,
1179   PREFIX_VEX_0F383D,
1180   PREFIX_VEX_0F383E,
1181   PREFIX_VEX_0F383F,
1182   PREFIX_VEX_0F3840,
1183   PREFIX_VEX_0F3841,
1184   PREFIX_VEX_0F3845,
1185   PREFIX_VEX_0F3846,
1186   PREFIX_VEX_0F3847,
1187   PREFIX_VEX_0F3858,
1188   PREFIX_VEX_0F3859,
1189   PREFIX_VEX_0F385A,
1190   PREFIX_VEX_0F3878,
1191   PREFIX_VEX_0F3879,
1192   PREFIX_VEX_0F388C,
1193   PREFIX_VEX_0F388E,
1194   PREFIX_VEX_0F3890,
1195   PREFIX_VEX_0F3891,
1196   PREFIX_VEX_0F3892,
1197   PREFIX_VEX_0F3893,
1198   PREFIX_VEX_0F3896,
1199   PREFIX_VEX_0F3897,
1200   PREFIX_VEX_0F3898,
1201   PREFIX_VEX_0F3899,
1202   PREFIX_VEX_0F389A,
1203   PREFIX_VEX_0F389B,
1204   PREFIX_VEX_0F389C,
1205   PREFIX_VEX_0F389D,
1206   PREFIX_VEX_0F389E,
1207   PREFIX_VEX_0F389F,
1208   PREFIX_VEX_0F38A6,
1209   PREFIX_VEX_0F38A7,
1210   PREFIX_VEX_0F38A8,
1211   PREFIX_VEX_0F38A9,
1212   PREFIX_VEX_0F38AA,
1213   PREFIX_VEX_0F38AB,
1214   PREFIX_VEX_0F38AC,
1215   PREFIX_VEX_0F38AD,
1216   PREFIX_VEX_0F38AE,
1217   PREFIX_VEX_0F38AF,
1218   PREFIX_VEX_0F38B6,
1219   PREFIX_VEX_0F38B7,
1220   PREFIX_VEX_0F38B8,
1221   PREFIX_VEX_0F38B9,
1222   PREFIX_VEX_0F38BA,
1223   PREFIX_VEX_0F38BB,
1224   PREFIX_VEX_0F38BC,
1225   PREFIX_VEX_0F38BD,
1226   PREFIX_VEX_0F38BE,
1227   PREFIX_VEX_0F38BF,
1228   PREFIX_VEX_0F38DB,
1229   PREFIX_VEX_0F38DC,
1230   PREFIX_VEX_0F38DD,
1231   PREFIX_VEX_0F38DE,
1232   PREFIX_VEX_0F38DF,
1233   PREFIX_VEX_0F38F2,
1234   PREFIX_VEX_0F38F3_REG_1,
1235   PREFIX_VEX_0F38F3_REG_2,
1236   PREFIX_VEX_0F38F3_REG_3,
1237   PREFIX_VEX_0F38F5,
1238   PREFIX_VEX_0F38F6,
1239   PREFIX_VEX_0F38F7,
1240   PREFIX_VEX_0F3A00,
1241   PREFIX_VEX_0F3A01,
1242   PREFIX_VEX_0F3A02,
1243   PREFIX_VEX_0F3A04,
1244   PREFIX_VEX_0F3A05,
1245   PREFIX_VEX_0F3A06,
1246   PREFIX_VEX_0F3A08,
1247   PREFIX_VEX_0F3A09,
1248   PREFIX_VEX_0F3A0A,
1249   PREFIX_VEX_0F3A0B,
1250   PREFIX_VEX_0F3A0C,
1251   PREFIX_VEX_0F3A0D,
1252   PREFIX_VEX_0F3A0E,
1253   PREFIX_VEX_0F3A0F,
1254   PREFIX_VEX_0F3A14,
1255   PREFIX_VEX_0F3A15,
1256   PREFIX_VEX_0F3A16,
1257   PREFIX_VEX_0F3A17,
1258   PREFIX_VEX_0F3A18,
1259   PREFIX_VEX_0F3A19,
1260   PREFIX_VEX_0F3A1D,
1261   PREFIX_VEX_0F3A20,
1262   PREFIX_VEX_0F3A21,
1263   PREFIX_VEX_0F3A22,
1264   PREFIX_VEX_0F3A30,
1265   PREFIX_VEX_0F3A31,
1266   PREFIX_VEX_0F3A32,
1267   PREFIX_VEX_0F3A33,
1268   PREFIX_VEX_0F3A38,
1269   PREFIX_VEX_0F3A39,
1270   PREFIX_VEX_0F3A40,
1271   PREFIX_VEX_0F3A41,
1272   PREFIX_VEX_0F3A42,
1273   PREFIX_VEX_0F3A44,
1274   PREFIX_VEX_0F3A46,
1275   PREFIX_VEX_0F3A48,
1276   PREFIX_VEX_0F3A49,
1277   PREFIX_VEX_0F3A4A,
1278   PREFIX_VEX_0F3A4B,
1279   PREFIX_VEX_0F3A4C,
1280   PREFIX_VEX_0F3A5C,
1281   PREFIX_VEX_0F3A5D,
1282   PREFIX_VEX_0F3A5E,
1283   PREFIX_VEX_0F3A5F,
1284   PREFIX_VEX_0F3A60,
1285   PREFIX_VEX_0F3A61,
1286   PREFIX_VEX_0F3A62,
1287   PREFIX_VEX_0F3A63,
1288   PREFIX_VEX_0F3A68,
1289   PREFIX_VEX_0F3A69,
1290   PREFIX_VEX_0F3A6A,
1291   PREFIX_VEX_0F3A6B,
1292   PREFIX_VEX_0F3A6C,
1293   PREFIX_VEX_0F3A6D,
1294   PREFIX_VEX_0F3A6E,
1295   PREFIX_VEX_0F3A6F,
1296   PREFIX_VEX_0F3A78,
1297   PREFIX_VEX_0F3A79,
1298   PREFIX_VEX_0F3A7A,
1299   PREFIX_VEX_0F3A7B,
1300   PREFIX_VEX_0F3A7C,
1301   PREFIX_VEX_0F3A7D,
1302   PREFIX_VEX_0F3A7E,
1303   PREFIX_VEX_0F3A7F,
1304   PREFIX_VEX_0F3ADF,
1305   PREFIX_VEX_0F3AF0,
1306
1307   PREFIX_EVEX_0F10,
1308   PREFIX_EVEX_0F11,
1309   PREFIX_EVEX_0F12,
1310   PREFIX_EVEX_0F13,
1311   PREFIX_EVEX_0F14,
1312   PREFIX_EVEX_0F15,
1313   PREFIX_EVEX_0F16,
1314   PREFIX_EVEX_0F17,
1315   PREFIX_EVEX_0F28,
1316   PREFIX_EVEX_0F29,
1317   PREFIX_EVEX_0F2A,
1318   PREFIX_EVEX_0F2B,
1319   PREFIX_EVEX_0F2C,
1320   PREFIX_EVEX_0F2D,
1321   PREFIX_EVEX_0F2E,
1322   PREFIX_EVEX_0F2F,
1323   PREFIX_EVEX_0F51,
1324   PREFIX_EVEX_0F54,
1325   PREFIX_EVEX_0F55,
1326   PREFIX_EVEX_0F56,
1327   PREFIX_EVEX_0F57,
1328   PREFIX_EVEX_0F58,
1329   PREFIX_EVEX_0F59,
1330   PREFIX_EVEX_0F5A,
1331   PREFIX_EVEX_0F5B,
1332   PREFIX_EVEX_0F5C,
1333   PREFIX_EVEX_0F5D,
1334   PREFIX_EVEX_0F5E,
1335   PREFIX_EVEX_0F5F,
1336   PREFIX_EVEX_0F60,
1337   PREFIX_EVEX_0F61,
1338   PREFIX_EVEX_0F62,
1339   PREFIX_EVEX_0F63,
1340   PREFIX_EVEX_0F64,
1341   PREFIX_EVEX_0F65,
1342   PREFIX_EVEX_0F66,
1343   PREFIX_EVEX_0F67,
1344   PREFIX_EVEX_0F68,
1345   PREFIX_EVEX_0F69,
1346   PREFIX_EVEX_0F6A,
1347   PREFIX_EVEX_0F6B,
1348   PREFIX_EVEX_0F6C,
1349   PREFIX_EVEX_0F6D,
1350   PREFIX_EVEX_0F6E,
1351   PREFIX_EVEX_0F6F,
1352   PREFIX_EVEX_0F70,
1353   PREFIX_EVEX_0F71_REG_2,
1354   PREFIX_EVEX_0F71_REG_4,
1355   PREFIX_EVEX_0F71_REG_6,
1356   PREFIX_EVEX_0F72_REG_0,
1357   PREFIX_EVEX_0F72_REG_1,
1358   PREFIX_EVEX_0F72_REG_2,
1359   PREFIX_EVEX_0F72_REG_4,
1360   PREFIX_EVEX_0F72_REG_6,
1361   PREFIX_EVEX_0F73_REG_2,
1362   PREFIX_EVEX_0F73_REG_3,
1363   PREFIX_EVEX_0F73_REG_6,
1364   PREFIX_EVEX_0F73_REG_7,
1365   PREFIX_EVEX_0F74,
1366   PREFIX_EVEX_0F75,
1367   PREFIX_EVEX_0F76,
1368   PREFIX_EVEX_0F78,
1369   PREFIX_EVEX_0F79,
1370   PREFIX_EVEX_0F7A,
1371   PREFIX_EVEX_0F7B,
1372   PREFIX_EVEX_0F7E,
1373   PREFIX_EVEX_0F7F,
1374   PREFIX_EVEX_0FC2,
1375   PREFIX_EVEX_0FC4,
1376   PREFIX_EVEX_0FC5,
1377   PREFIX_EVEX_0FC6,
1378   PREFIX_EVEX_0FD1,
1379   PREFIX_EVEX_0FD2,
1380   PREFIX_EVEX_0FD3,
1381   PREFIX_EVEX_0FD4,
1382   PREFIX_EVEX_0FD5,
1383   PREFIX_EVEX_0FD6,
1384   PREFIX_EVEX_0FD8,
1385   PREFIX_EVEX_0FD9,
1386   PREFIX_EVEX_0FDA,
1387   PREFIX_EVEX_0FDB,
1388   PREFIX_EVEX_0FDC,
1389   PREFIX_EVEX_0FDD,
1390   PREFIX_EVEX_0FDE,
1391   PREFIX_EVEX_0FDF,
1392   PREFIX_EVEX_0FE0,
1393   PREFIX_EVEX_0FE1,
1394   PREFIX_EVEX_0FE2,
1395   PREFIX_EVEX_0FE3,
1396   PREFIX_EVEX_0FE4,
1397   PREFIX_EVEX_0FE5,
1398   PREFIX_EVEX_0FE6,
1399   PREFIX_EVEX_0FE7,
1400   PREFIX_EVEX_0FE8,
1401   PREFIX_EVEX_0FE9,
1402   PREFIX_EVEX_0FEA,
1403   PREFIX_EVEX_0FEB,
1404   PREFIX_EVEX_0FEC,
1405   PREFIX_EVEX_0FED,
1406   PREFIX_EVEX_0FEE,
1407   PREFIX_EVEX_0FEF,
1408   PREFIX_EVEX_0FF1,
1409   PREFIX_EVEX_0FF2,
1410   PREFIX_EVEX_0FF3,
1411   PREFIX_EVEX_0FF4,
1412   PREFIX_EVEX_0FF5,
1413   PREFIX_EVEX_0FF6,
1414   PREFIX_EVEX_0FF8,
1415   PREFIX_EVEX_0FF9,
1416   PREFIX_EVEX_0FFA,
1417   PREFIX_EVEX_0FFB,
1418   PREFIX_EVEX_0FFC,
1419   PREFIX_EVEX_0FFD,
1420   PREFIX_EVEX_0FFE,
1421   PREFIX_EVEX_0F3800,
1422   PREFIX_EVEX_0F3804,
1423   PREFIX_EVEX_0F380B,
1424   PREFIX_EVEX_0F380C,
1425   PREFIX_EVEX_0F380D,
1426   PREFIX_EVEX_0F3810,
1427   PREFIX_EVEX_0F3811,
1428   PREFIX_EVEX_0F3812,
1429   PREFIX_EVEX_0F3813,
1430   PREFIX_EVEX_0F3814,
1431   PREFIX_EVEX_0F3815,
1432   PREFIX_EVEX_0F3816,
1433   PREFIX_EVEX_0F3818,
1434   PREFIX_EVEX_0F3819,
1435   PREFIX_EVEX_0F381A,
1436   PREFIX_EVEX_0F381B,
1437   PREFIX_EVEX_0F381C,
1438   PREFIX_EVEX_0F381D,
1439   PREFIX_EVEX_0F381E,
1440   PREFIX_EVEX_0F381F,
1441   PREFIX_EVEX_0F3820,
1442   PREFIX_EVEX_0F3821,
1443   PREFIX_EVEX_0F3822,
1444   PREFIX_EVEX_0F3823,
1445   PREFIX_EVEX_0F3824,
1446   PREFIX_EVEX_0F3825,
1447   PREFIX_EVEX_0F3826,
1448   PREFIX_EVEX_0F3827,
1449   PREFIX_EVEX_0F3828,
1450   PREFIX_EVEX_0F3829,
1451   PREFIX_EVEX_0F382A,
1452   PREFIX_EVEX_0F382B,
1453   PREFIX_EVEX_0F382C,
1454   PREFIX_EVEX_0F382D,
1455   PREFIX_EVEX_0F3830,
1456   PREFIX_EVEX_0F3831,
1457   PREFIX_EVEX_0F3832,
1458   PREFIX_EVEX_0F3833,
1459   PREFIX_EVEX_0F3834,
1460   PREFIX_EVEX_0F3835,
1461   PREFIX_EVEX_0F3836,
1462   PREFIX_EVEX_0F3837,
1463   PREFIX_EVEX_0F3838,
1464   PREFIX_EVEX_0F3839,
1465   PREFIX_EVEX_0F383A,
1466   PREFIX_EVEX_0F383B,
1467   PREFIX_EVEX_0F383C,
1468   PREFIX_EVEX_0F383D,
1469   PREFIX_EVEX_0F383E,
1470   PREFIX_EVEX_0F383F,
1471   PREFIX_EVEX_0F3840,
1472   PREFIX_EVEX_0F3842,
1473   PREFIX_EVEX_0F3843,
1474   PREFIX_EVEX_0F3844,
1475   PREFIX_EVEX_0F3845,
1476   PREFIX_EVEX_0F3846,
1477   PREFIX_EVEX_0F3847,
1478   PREFIX_EVEX_0F384C,
1479   PREFIX_EVEX_0F384D,
1480   PREFIX_EVEX_0F384E,
1481   PREFIX_EVEX_0F384F,
1482   PREFIX_EVEX_0F3858,
1483   PREFIX_EVEX_0F3859,
1484   PREFIX_EVEX_0F385A,
1485   PREFIX_EVEX_0F385B,
1486   PREFIX_EVEX_0F3864,
1487   PREFIX_EVEX_0F3865,
1488   PREFIX_EVEX_0F3866,
1489   PREFIX_EVEX_0F3875,
1490   PREFIX_EVEX_0F3876,
1491   PREFIX_EVEX_0F3877,
1492   PREFIX_EVEX_0F3878,
1493   PREFIX_EVEX_0F3879,
1494   PREFIX_EVEX_0F387A,
1495   PREFIX_EVEX_0F387B,
1496   PREFIX_EVEX_0F387C,
1497   PREFIX_EVEX_0F387D,
1498   PREFIX_EVEX_0F387E,
1499   PREFIX_EVEX_0F387F,
1500   PREFIX_EVEX_0F3883,
1501   PREFIX_EVEX_0F3888,
1502   PREFIX_EVEX_0F3889,
1503   PREFIX_EVEX_0F388A,
1504   PREFIX_EVEX_0F388B,
1505   PREFIX_EVEX_0F388D,
1506   PREFIX_EVEX_0F3890,
1507   PREFIX_EVEX_0F3891,
1508   PREFIX_EVEX_0F3892,
1509   PREFIX_EVEX_0F3893,
1510   PREFIX_EVEX_0F3896,
1511   PREFIX_EVEX_0F3897,
1512   PREFIX_EVEX_0F3898,
1513   PREFIX_EVEX_0F3899,
1514   PREFIX_EVEX_0F389A,
1515   PREFIX_EVEX_0F389B,
1516   PREFIX_EVEX_0F389C,
1517   PREFIX_EVEX_0F389D,
1518   PREFIX_EVEX_0F389E,
1519   PREFIX_EVEX_0F389F,
1520   PREFIX_EVEX_0F38A0,
1521   PREFIX_EVEX_0F38A1,
1522   PREFIX_EVEX_0F38A2,
1523   PREFIX_EVEX_0F38A3,
1524   PREFIX_EVEX_0F38A6,
1525   PREFIX_EVEX_0F38A7,
1526   PREFIX_EVEX_0F38A8,
1527   PREFIX_EVEX_0F38A9,
1528   PREFIX_EVEX_0F38AA,
1529   PREFIX_EVEX_0F38AB,
1530   PREFIX_EVEX_0F38AC,
1531   PREFIX_EVEX_0F38AD,
1532   PREFIX_EVEX_0F38AE,
1533   PREFIX_EVEX_0F38AF,
1534   PREFIX_EVEX_0F38B4,
1535   PREFIX_EVEX_0F38B5,
1536   PREFIX_EVEX_0F38B6,
1537   PREFIX_EVEX_0F38B7,
1538   PREFIX_EVEX_0F38B8,
1539   PREFIX_EVEX_0F38B9,
1540   PREFIX_EVEX_0F38BA,
1541   PREFIX_EVEX_0F38BB,
1542   PREFIX_EVEX_0F38BC,
1543   PREFIX_EVEX_0F38BD,
1544   PREFIX_EVEX_0F38BE,
1545   PREFIX_EVEX_0F38BF,
1546   PREFIX_EVEX_0F38C4,
1547   PREFIX_EVEX_0F38C6_REG_1,
1548   PREFIX_EVEX_0F38C6_REG_2,
1549   PREFIX_EVEX_0F38C6_REG_5,
1550   PREFIX_EVEX_0F38C6_REG_6,
1551   PREFIX_EVEX_0F38C7_REG_1,
1552   PREFIX_EVEX_0F38C7_REG_2,
1553   PREFIX_EVEX_0F38C7_REG_5,
1554   PREFIX_EVEX_0F38C7_REG_6,
1555   PREFIX_EVEX_0F38C8,
1556   PREFIX_EVEX_0F38CA,
1557   PREFIX_EVEX_0F38CB,
1558   PREFIX_EVEX_0F38CC,
1559   PREFIX_EVEX_0F38CD,
1560
1561   PREFIX_EVEX_0F3A00,
1562   PREFIX_EVEX_0F3A01,
1563   PREFIX_EVEX_0F3A03,
1564   PREFIX_EVEX_0F3A04,
1565   PREFIX_EVEX_0F3A05,
1566   PREFIX_EVEX_0F3A08,
1567   PREFIX_EVEX_0F3A09,
1568   PREFIX_EVEX_0F3A0A,
1569   PREFIX_EVEX_0F3A0B,
1570   PREFIX_EVEX_0F3A0F,
1571   PREFIX_EVEX_0F3A14,
1572   PREFIX_EVEX_0F3A15,
1573   PREFIX_EVEX_0F3A16,
1574   PREFIX_EVEX_0F3A17,
1575   PREFIX_EVEX_0F3A18,
1576   PREFIX_EVEX_0F3A19,
1577   PREFIX_EVEX_0F3A1A,
1578   PREFIX_EVEX_0F3A1B,
1579   PREFIX_EVEX_0F3A1D,
1580   PREFIX_EVEX_0F3A1E,
1581   PREFIX_EVEX_0F3A1F,
1582   PREFIX_EVEX_0F3A20,
1583   PREFIX_EVEX_0F3A21,
1584   PREFIX_EVEX_0F3A22,
1585   PREFIX_EVEX_0F3A23,
1586   PREFIX_EVEX_0F3A25,
1587   PREFIX_EVEX_0F3A26,
1588   PREFIX_EVEX_0F3A27,
1589   PREFIX_EVEX_0F3A38,
1590   PREFIX_EVEX_0F3A39,
1591   PREFIX_EVEX_0F3A3A,
1592   PREFIX_EVEX_0F3A3B,
1593   PREFIX_EVEX_0F3A3E,
1594   PREFIX_EVEX_0F3A3F,
1595   PREFIX_EVEX_0F3A42,
1596   PREFIX_EVEX_0F3A43,
1597   PREFIX_EVEX_0F3A50,
1598   PREFIX_EVEX_0F3A51,
1599   PREFIX_EVEX_0F3A54,
1600   PREFIX_EVEX_0F3A55,
1601   PREFIX_EVEX_0F3A56,
1602   PREFIX_EVEX_0F3A57,
1603   PREFIX_EVEX_0F3A66,
1604   PREFIX_EVEX_0F3A67
1605 };
1606
1607 enum
1608 {
1609   X86_64_06 = 0,
1610   X86_64_07,
1611   X86_64_0D,
1612   X86_64_16,
1613   X86_64_17,
1614   X86_64_1E,
1615   X86_64_1F,
1616   X86_64_27,
1617   X86_64_2F,
1618   X86_64_37,
1619   X86_64_3F,
1620   X86_64_60,
1621   X86_64_61,
1622   X86_64_62,
1623   X86_64_63,
1624   X86_64_6D,
1625   X86_64_6F,
1626   X86_64_9A,
1627   X86_64_C4,
1628   X86_64_C5,
1629   X86_64_CE,
1630   X86_64_D4,
1631   X86_64_D5,
1632   X86_64_EA,
1633   X86_64_0F01_REG_0,
1634   X86_64_0F01_REG_1,
1635   X86_64_0F01_REG_2,
1636   X86_64_0F01_REG_3
1637 };
1638
1639 enum
1640 {
1641   THREE_BYTE_0F38 = 0,
1642   THREE_BYTE_0F3A,
1643   THREE_BYTE_0F7A
1644 };
1645
1646 enum
1647 {
1648   XOP_08 = 0,
1649   XOP_09,
1650   XOP_0A
1651 };
1652
1653 enum
1654 {
1655   VEX_0F = 0,
1656   VEX_0F38,
1657   VEX_0F3A
1658 };
1659
1660 enum
1661 {
1662   EVEX_0F = 0,
1663   EVEX_0F38,
1664   EVEX_0F3A
1665 };
1666
1667 enum
1668 {
1669   VEX_LEN_0F10_P_1 = 0,
1670   VEX_LEN_0F10_P_3,
1671   VEX_LEN_0F11_P_1,
1672   VEX_LEN_0F11_P_3,
1673   VEX_LEN_0F12_P_0_M_0,
1674   VEX_LEN_0F12_P_0_M_1,
1675   VEX_LEN_0F12_P_2,
1676   VEX_LEN_0F13_M_0,
1677   VEX_LEN_0F16_P_0_M_0,
1678   VEX_LEN_0F16_P_0_M_1,
1679   VEX_LEN_0F16_P_2,
1680   VEX_LEN_0F17_M_0,
1681   VEX_LEN_0F2A_P_1,
1682   VEX_LEN_0F2A_P_3,
1683   VEX_LEN_0F2C_P_1,
1684   VEX_LEN_0F2C_P_3,
1685   VEX_LEN_0F2D_P_1,
1686   VEX_LEN_0F2D_P_3,
1687   VEX_LEN_0F2E_P_0,
1688   VEX_LEN_0F2E_P_2,
1689   VEX_LEN_0F2F_P_0,
1690   VEX_LEN_0F2F_P_2,
1691   VEX_LEN_0F41_P_0,
1692   VEX_LEN_0F41_P_2,
1693   VEX_LEN_0F42_P_0,
1694   VEX_LEN_0F42_P_2,
1695   VEX_LEN_0F44_P_0,
1696   VEX_LEN_0F44_P_2,
1697   VEX_LEN_0F45_P_0,
1698   VEX_LEN_0F45_P_2,
1699   VEX_LEN_0F46_P_0,
1700   VEX_LEN_0F46_P_2,
1701   VEX_LEN_0F47_P_0,
1702   VEX_LEN_0F47_P_2,
1703   VEX_LEN_0F4A_P_0,
1704   VEX_LEN_0F4A_P_2,
1705   VEX_LEN_0F4B_P_0,
1706   VEX_LEN_0F4B_P_2,
1707   VEX_LEN_0F51_P_1,
1708   VEX_LEN_0F51_P_3,
1709   VEX_LEN_0F52_P_1,
1710   VEX_LEN_0F53_P_1,
1711   VEX_LEN_0F58_P_1,
1712   VEX_LEN_0F58_P_3,
1713   VEX_LEN_0F59_P_1,
1714   VEX_LEN_0F59_P_3,
1715   VEX_LEN_0F5A_P_1,
1716   VEX_LEN_0F5A_P_3,
1717   VEX_LEN_0F5C_P_1,
1718   VEX_LEN_0F5C_P_3,
1719   VEX_LEN_0F5D_P_1,
1720   VEX_LEN_0F5D_P_3,
1721   VEX_LEN_0F5E_P_1,
1722   VEX_LEN_0F5E_P_3,
1723   VEX_LEN_0F5F_P_1,
1724   VEX_LEN_0F5F_P_3,
1725   VEX_LEN_0F6E_P_2,
1726   VEX_LEN_0F7E_P_1,
1727   VEX_LEN_0F7E_P_2,
1728   VEX_LEN_0F90_P_0,
1729   VEX_LEN_0F90_P_2,
1730   VEX_LEN_0F91_P_0,
1731   VEX_LEN_0F91_P_2,
1732   VEX_LEN_0F92_P_0,
1733   VEX_LEN_0F92_P_2,
1734   VEX_LEN_0F92_P_3,
1735   VEX_LEN_0F93_P_0,
1736   VEX_LEN_0F93_P_2,
1737   VEX_LEN_0F93_P_3,
1738   VEX_LEN_0F98_P_0,
1739   VEX_LEN_0F98_P_2,
1740   VEX_LEN_0F99_P_0,
1741   VEX_LEN_0F99_P_2,
1742   VEX_LEN_0FAE_R_2_M_0,
1743   VEX_LEN_0FAE_R_3_M_0,
1744   VEX_LEN_0FC2_P_1,
1745   VEX_LEN_0FC2_P_3,
1746   VEX_LEN_0FC4_P_2,
1747   VEX_LEN_0FC5_P_2,
1748   VEX_LEN_0FD6_P_2,
1749   VEX_LEN_0FF7_P_2,
1750   VEX_LEN_0F3816_P_2,
1751   VEX_LEN_0F3819_P_2,
1752   VEX_LEN_0F381A_P_2_M_0,
1753   VEX_LEN_0F3836_P_2,
1754   VEX_LEN_0F3841_P_2,
1755   VEX_LEN_0F385A_P_2_M_0,
1756   VEX_LEN_0F38DB_P_2,
1757   VEX_LEN_0F38DC_P_2,
1758   VEX_LEN_0F38DD_P_2,
1759   VEX_LEN_0F38DE_P_2,
1760   VEX_LEN_0F38DF_P_2,
1761   VEX_LEN_0F38F2_P_0,
1762   VEX_LEN_0F38F3_R_1_P_0,
1763   VEX_LEN_0F38F3_R_2_P_0,
1764   VEX_LEN_0F38F3_R_3_P_0,
1765   VEX_LEN_0F38F5_P_0,
1766   VEX_LEN_0F38F5_P_1,
1767   VEX_LEN_0F38F5_P_3,
1768   VEX_LEN_0F38F6_P_3,
1769   VEX_LEN_0F38F7_P_0,
1770   VEX_LEN_0F38F7_P_1,
1771   VEX_LEN_0F38F7_P_2,
1772   VEX_LEN_0F38F7_P_3,
1773   VEX_LEN_0F3A00_P_2,
1774   VEX_LEN_0F3A01_P_2,
1775   VEX_LEN_0F3A06_P_2,
1776   VEX_LEN_0F3A0A_P_2,
1777   VEX_LEN_0F3A0B_P_2,
1778   VEX_LEN_0F3A14_P_2,
1779   VEX_LEN_0F3A15_P_2,
1780   VEX_LEN_0F3A16_P_2,
1781   VEX_LEN_0F3A17_P_2,
1782   VEX_LEN_0F3A18_P_2,
1783   VEX_LEN_0F3A19_P_2,
1784   VEX_LEN_0F3A20_P_2,
1785   VEX_LEN_0F3A21_P_2,
1786   VEX_LEN_0F3A22_P_2,
1787   VEX_LEN_0F3A30_P_2,
1788   VEX_LEN_0F3A31_P_2,
1789   VEX_LEN_0F3A32_P_2,
1790   VEX_LEN_0F3A33_P_2,
1791   VEX_LEN_0F3A38_P_2,
1792   VEX_LEN_0F3A39_P_2,
1793   VEX_LEN_0F3A41_P_2,
1794   VEX_LEN_0F3A44_P_2,
1795   VEX_LEN_0F3A46_P_2,
1796   VEX_LEN_0F3A60_P_2,
1797   VEX_LEN_0F3A61_P_2,
1798   VEX_LEN_0F3A62_P_2,
1799   VEX_LEN_0F3A63_P_2,
1800   VEX_LEN_0F3A6A_P_2,
1801   VEX_LEN_0F3A6B_P_2,
1802   VEX_LEN_0F3A6E_P_2,
1803   VEX_LEN_0F3A6F_P_2,
1804   VEX_LEN_0F3A7A_P_2,
1805   VEX_LEN_0F3A7B_P_2,
1806   VEX_LEN_0F3A7E_P_2,
1807   VEX_LEN_0F3A7F_P_2,
1808   VEX_LEN_0F3ADF_P_2,
1809   VEX_LEN_0F3AF0_P_3,
1810   VEX_LEN_0FXOP_08_CC,
1811   VEX_LEN_0FXOP_08_CD,
1812   VEX_LEN_0FXOP_08_CE,
1813   VEX_LEN_0FXOP_08_CF,
1814   VEX_LEN_0FXOP_08_EC,
1815   VEX_LEN_0FXOP_08_ED,
1816   VEX_LEN_0FXOP_08_EE,
1817   VEX_LEN_0FXOP_08_EF,
1818   VEX_LEN_0FXOP_09_80,
1819   VEX_LEN_0FXOP_09_81
1820 };
1821
1822 enum
1823 {
1824   VEX_W_0F10_P_0 = 0,
1825   VEX_W_0F10_P_1,
1826   VEX_W_0F10_P_2,
1827   VEX_W_0F10_P_3,
1828   VEX_W_0F11_P_0,
1829   VEX_W_0F11_P_1,
1830   VEX_W_0F11_P_2,
1831   VEX_W_0F11_P_3,
1832   VEX_W_0F12_P_0_M_0,
1833   VEX_W_0F12_P_0_M_1,
1834   VEX_W_0F12_P_1,
1835   VEX_W_0F12_P_2,
1836   VEX_W_0F12_P_3,
1837   VEX_W_0F13_M_0,
1838   VEX_W_0F14,
1839   VEX_W_0F15,
1840   VEX_W_0F16_P_0_M_0,
1841   VEX_W_0F16_P_0_M_1,
1842   VEX_W_0F16_P_1,
1843   VEX_W_0F16_P_2,
1844   VEX_W_0F17_M_0,
1845   VEX_W_0F28,
1846   VEX_W_0F29,
1847   VEX_W_0F2B_M_0,
1848   VEX_W_0F2E_P_0,
1849   VEX_W_0F2E_P_2,
1850   VEX_W_0F2F_P_0,
1851   VEX_W_0F2F_P_2,
1852   VEX_W_0F41_P_0_LEN_1,
1853   VEX_W_0F41_P_2_LEN_1,
1854   VEX_W_0F42_P_0_LEN_1,
1855   VEX_W_0F42_P_2_LEN_1,
1856   VEX_W_0F44_P_0_LEN_0,
1857   VEX_W_0F44_P_2_LEN_0,
1858   VEX_W_0F45_P_0_LEN_1,
1859   VEX_W_0F45_P_2_LEN_1,
1860   VEX_W_0F46_P_0_LEN_1,
1861   VEX_W_0F46_P_2_LEN_1,
1862   VEX_W_0F47_P_0_LEN_1,
1863   VEX_W_0F47_P_2_LEN_1,
1864   VEX_W_0F4A_P_0_LEN_1,
1865   VEX_W_0F4A_P_2_LEN_1,
1866   VEX_W_0F4B_P_0_LEN_1,
1867   VEX_W_0F4B_P_2_LEN_1,
1868   VEX_W_0F50_M_0,
1869   VEX_W_0F51_P_0,
1870   VEX_W_0F51_P_1,
1871   VEX_W_0F51_P_2,
1872   VEX_W_0F51_P_3,
1873   VEX_W_0F52_P_0,
1874   VEX_W_0F52_P_1,
1875   VEX_W_0F53_P_0,
1876   VEX_W_0F53_P_1,
1877   VEX_W_0F58_P_0,
1878   VEX_W_0F58_P_1,
1879   VEX_W_0F58_P_2,
1880   VEX_W_0F58_P_3,
1881   VEX_W_0F59_P_0,
1882   VEX_W_0F59_P_1,
1883   VEX_W_0F59_P_2,
1884   VEX_W_0F59_P_3,
1885   VEX_W_0F5A_P_0,
1886   VEX_W_0F5A_P_1,
1887   VEX_W_0F5A_P_3,
1888   VEX_W_0F5B_P_0,
1889   VEX_W_0F5B_P_1,
1890   VEX_W_0F5B_P_2,
1891   VEX_W_0F5C_P_0,
1892   VEX_W_0F5C_P_1,
1893   VEX_W_0F5C_P_2,
1894   VEX_W_0F5C_P_3,
1895   VEX_W_0F5D_P_0,
1896   VEX_W_0F5D_P_1,
1897   VEX_W_0F5D_P_2,
1898   VEX_W_0F5D_P_3,
1899   VEX_W_0F5E_P_0,
1900   VEX_W_0F5E_P_1,
1901   VEX_W_0F5E_P_2,
1902   VEX_W_0F5E_P_3,
1903   VEX_W_0F5F_P_0,
1904   VEX_W_0F5F_P_1,
1905   VEX_W_0F5F_P_2,
1906   VEX_W_0F5F_P_3,
1907   VEX_W_0F60_P_2,
1908   VEX_W_0F61_P_2,
1909   VEX_W_0F62_P_2,
1910   VEX_W_0F63_P_2,
1911   VEX_W_0F64_P_2,
1912   VEX_W_0F65_P_2,
1913   VEX_W_0F66_P_2,
1914   VEX_W_0F67_P_2,
1915   VEX_W_0F68_P_2,
1916   VEX_W_0F69_P_2,
1917   VEX_W_0F6A_P_2,
1918   VEX_W_0F6B_P_2,
1919   VEX_W_0F6C_P_2,
1920   VEX_W_0F6D_P_2,
1921   VEX_W_0F6F_P_1,
1922   VEX_W_0F6F_P_2,
1923   VEX_W_0F70_P_1,
1924   VEX_W_0F70_P_2,
1925   VEX_W_0F70_P_3,
1926   VEX_W_0F71_R_2_P_2,
1927   VEX_W_0F71_R_4_P_2,
1928   VEX_W_0F71_R_6_P_2,
1929   VEX_W_0F72_R_2_P_2,
1930   VEX_W_0F72_R_4_P_2,
1931   VEX_W_0F72_R_6_P_2,
1932   VEX_W_0F73_R_2_P_2,
1933   VEX_W_0F73_R_3_P_2,
1934   VEX_W_0F73_R_6_P_2,
1935   VEX_W_0F73_R_7_P_2,
1936   VEX_W_0F74_P_2,
1937   VEX_W_0F75_P_2,
1938   VEX_W_0F76_P_2,
1939   VEX_W_0F77_P_0,
1940   VEX_W_0F7C_P_2,
1941   VEX_W_0F7C_P_3,
1942   VEX_W_0F7D_P_2,
1943   VEX_W_0F7D_P_3,
1944   VEX_W_0F7E_P_1,
1945   VEX_W_0F7F_P_1,
1946   VEX_W_0F7F_P_2,
1947   VEX_W_0F90_P_0_LEN_0,
1948   VEX_W_0F90_P_2_LEN_0,
1949   VEX_W_0F91_P_0_LEN_0,
1950   VEX_W_0F91_P_2_LEN_0,
1951   VEX_W_0F92_P_0_LEN_0,
1952   VEX_W_0F92_P_2_LEN_0,
1953   VEX_W_0F92_P_3_LEN_0,
1954   VEX_W_0F93_P_0_LEN_0,
1955   VEX_W_0F93_P_2_LEN_0,
1956   VEX_W_0F93_P_3_LEN_0,
1957   VEX_W_0F98_P_0_LEN_0,
1958   VEX_W_0F98_P_2_LEN_0,
1959   VEX_W_0F99_P_0_LEN_0,
1960   VEX_W_0F99_P_2_LEN_0,
1961   VEX_W_0FAE_R_2_M_0,
1962   VEX_W_0FAE_R_3_M_0,
1963   VEX_W_0FC2_P_0,
1964   VEX_W_0FC2_P_1,
1965   VEX_W_0FC2_P_2,
1966   VEX_W_0FC2_P_3,
1967   VEX_W_0FC4_P_2,
1968   VEX_W_0FC5_P_2,
1969   VEX_W_0FD0_P_2,
1970   VEX_W_0FD0_P_3,
1971   VEX_W_0FD1_P_2,
1972   VEX_W_0FD2_P_2,
1973   VEX_W_0FD3_P_2,
1974   VEX_W_0FD4_P_2,
1975   VEX_W_0FD5_P_2,
1976   VEX_W_0FD6_P_2,
1977   VEX_W_0FD7_P_2_M_1,
1978   VEX_W_0FD8_P_2,
1979   VEX_W_0FD9_P_2,
1980   VEX_W_0FDA_P_2,
1981   VEX_W_0FDB_P_2,
1982   VEX_W_0FDC_P_2,
1983   VEX_W_0FDD_P_2,
1984   VEX_W_0FDE_P_2,
1985   VEX_W_0FDF_P_2,
1986   VEX_W_0FE0_P_2,
1987   VEX_W_0FE1_P_2,
1988   VEX_W_0FE2_P_2,
1989   VEX_W_0FE3_P_2,
1990   VEX_W_0FE4_P_2,
1991   VEX_W_0FE5_P_2,
1992   VEX_W_0FE6_P_1,
1993   VEX_W_0FE6_P_2,
1994   VEX_W_0FE6_P_3,
1995   VEX_W_0FE7_P_2_M_0,
1996   VEX_W_0FE8_P_2,
1997   VEX_W_0FE9_P_2,
1998   VEX_W_0FEA_P_2,
1999   VEX_W_0FEB_P_2,
2000   VEX_W_0FEC_P_2,
2001   VEX_W_0FED_P_2,
2002   VEX_W_0FEE_P_2,
2003   VEX_W_0FEF_P_2,
2004   VEX_W_0FF0_P_3_M_0,
2005   VEX_W_0FF1_P_2,
2006   VEX_W_0FF2_P_2,
2007   VEX_W_0FF3_P_2,
2008   VEX_W_0FF4_P_2,
2009   VEX_W_0FF5_P_2,
2010   VEX_W_0FF6_P_2,
2011   VEX_W_0FF7_P_2,
2012   VEX_W_0FF8_P_2,
2013   VEX_W_0FF9_P_2,
2014   VEX_W_0FFA_P_2,
2015   VEX_W_0FFB_P_2,
2016   VEX_W_0FFC_P_2,
2017   VEX_W_0FFD_P_2,
2018   VEX_W_0FFE_P_2,
2019   VEX_W_0F3800_P_2,
2020   VEX_W_0F3801_P_2,
2021   VEX_W_0F3802_P_2,
2022   VEX_W_0F3803_P_2,
2023   VEX_W_0F3804_P_2,
2024   VEX_W_0F3805_P_2,
2025   VEX_W_0F3806_P_2,
2026   VEX_W_0F3807_P_2,
2027   VEX_W_0F3808_P_2,
2028   VEX_W_0F3809_P_2,
2029   VEX_W_0F380A_P_2,
2030   VEX_W_0F380B_P_2,
2031   VEX_W_0F380C_P_2,
2032   VEX_W_0F380D_P_2,
2033   VEX_W_0F380E_P_2,
2034   VEX_W_0F380F_P_2,
2035   VEX_W_0F3816_P_2,
2036   VEX_W_0F3817_P_2,
2037   VEX_W_0F3818_P_2,
2038   VEX_W_0F3819_P_2,
2039   VEX_W_0F381A_P_2_M_0,
2040   VEX_W_0F381C_P_2,
2041   VEX_W_0F381D_P_2,
2042   VEX_W_0F381E_P_2,
2043   VEX_W_0F3820_P_2,
2044   VEX_W_0F3821_P_2,
2045   VEX_W_0F3822_P_2,
2046   VEX_W_0F3823_P_2,
2047   VEX_W_0F3824_P_2,
2048   VEX_W_0F3825_P_2,
2049   VEX_W_0F3828_P_2,
2050   VEX_W_0F3829_P_2,
2051   VEX_W_0F382A_P_2_M_0,
2052   VEX_W_0F382B_P_2,
2053   VEX_W_0F382C_P_2_M_0,
2054   VEX_W_0F382D_P_2_M_0,
2055   VEX_W_0F382E_P_2_M_0,
2056   VEX_W_0F382F_P_2_M_0,
2057   VEX_W_0F3830_P_2,
2058   VEX_W_0F3831_P_2,
2059   VEX_W_0F3832_P_2,
2060   VEX_W_0F3833_P_2,
2061   VEX_W_0F3834_P_2,
2062   VEX_W_0F3835_P_2,
2063   VEX_W_0F3836_P_2,
2064   VEX_W_0F3837_P_2,
2065   VEX_W_0F3838_P_2,
2066   VEX_W_0F3839_P_2,
2067   VEX_W_0F383A_P_2,
2068   VEX_W_0F383B_P_2,
2069   VEX_W_0F383C_P_2,
2070   VEX_W_0F383D_P_2,
2071   VEX_W_0F383E_P_2,
2072   VEX_W_0F383F_P_2,
2073   VEX_W_0F3840_P_2,
2074   VEX_W_0F3841_P_2,
2075   VEX_W_0F3846_P_2,
2076   VEX_W_0F3858_P_2,
2077   VEX_W_0F3859_P_2,
2078   VEX_W_0F385A_P_2_M_0,
2079   VEX_W_0F3878_P_2,
2080   VEX_W_0F3879_P_2,
2081   VEX_W_0F38DB_P_2,
2082   VEX_W_0F38DC_P_2,
2083   VEX_W_0F38DD_P_2,
2084   VEX_W_0F38DE_P_2,
2085   VEX_W_0F38DF_P_2,
2086   VEX_W_0F3A00_P_2,
2087   VEX_W_0F3A01_P_2,
2088   VEX_W_0F3A02_P_2,
2089   VEX_W_0F3A04_P_2,
2090   VEX_W_0F3A05_P_2,
2091   VEX_W_0F3A06_P_2,
2092   VEX_W_0F3A08_P_2,
2093   VEX_W_0F3A09_P_2,
2094   VEX_W_0F3A0A_P_2,
2095   VEX_W_0F3A0B_P_2,
2096   VEX_W_0F3A0C_P_2,
2097   VEX_W_0F3A0D_P_2,
2098   VEX_W_0F3A0E_P_2,
2099   VEX_W_0F3A0F_P_2,
2100   VEX_W_0F3A14_P_2,
2101   VEX_W_0F3A15_P_2,
2102   VEX_W_0F3A18_P_2,
2103   VEX_W_0F3A19_P_2,
2104   VEX_W_0F3A20_P_2,
2105   VEX_W_0F3A21_P_2,
2106   VEX_W_0F3A30_P_2_LEN_0,
2107   VEX_W_0F3A31_P_2_LEN_0,
2108   VEX_W_0F3A32_P_2_LEN_0,
2109   VEX_W_0F3A33_P_2_LEN_0,
2110   VEX_W_0F3A38_P_2,
2111   VEX_W_0F3A39_P_2,
2112   VEX_W_0F3A40_P_2,
2113   VEX_W_0F3A41_P_2,
2114   VEX_W_0F3A42_P_2,
2115   VEX_W_0F3A44_P_2,
2116   VEX_W_0F3A46_P_2,
2117   VEX_W_0F3A48_P_2,
2118   VEX_W_0F3A49_P_2,
2119   VEX_W_0F3A4A_P_2,
2120   VEX_W_0F3A4B_P_2,
2121   VEX_W_0F3A4C_P_2,
2122   VEX_W_0F3A60_P_2,
2123   VEX_W_0F3A61_P_2,
2124   VEX_W_0F3A62_P_2,
2125   VEX_W_0F3A63_P_2,
2126   VEX_W_0F3ADF_P_2,
2127
2128   EVEX_W_0F10_P_0,
2129   EVEX_W_0F10_P_1_M_0,
2130   EVEX_W_0F10_P_1_M_1,
2131   EVEX_W_0F10_P_2,
2132   EVEX_W_0F10_P_3_M_0,
2133   EVEX_W_0F10_P_3_M_1,
2134   EVEX_W_0F11_P_0,
2135   EVEX_W_0F11_P_1_M_0,
2136   EVEX_W_0F11_P_1_M_1,
2137   EVEX_W_0F11_P_2,
2138   EVEX_W_0F11_P_3_M_0,
2139   EVEX_W_0F11_P_3_M_1,
2140   EVEX_W_0F12_P_0_M_0,
2141   EVEX_W_0F12_P_0_M_1,
2142   EVEX_W_0F12_P_1,
2143   EVEX_W_0F12_P_2,
2144   EVEX_W_0F12_P_3,
2145   EVEX_W_0F13_P_0,
2146   EVEX_W_0F13_P_2,
2147   EVEX_W_0F14_P_0,
2148   EVEX_W_0F14_P_2,
2149   EVEX_W_0F15_P_0,
2150   EVEX_W_0F15_P_2,
2151   EVEX_W_0F16_P_0_M_0,
2152   EVEX_W_0F16_P_0_M_1,
2153   EVEX_W_0F16_P_1,
2154   EVEX_W_0F16_P_2,
2155   EVEX_W_0F17_P_0,
2156   EVEX_W_0F17_P_2,
2157   EVEX_W_0F28_P_0,
2158   EVEX_W_0F28_P_2,
2159   EVEX_W_0F29_P_0,
2160   EVEX_W_0F29_P_2,
2161   EVEX_W_0F2A_P_1,
2162   EVEX_W_0F2A_P_3,
2163   EVEX_W_0F2B_P_0,
2164   EVEX_W_0F2B_P_2,
2165   EVEX_W_0F2E_P_0,
2166   EVEX_W_0F2E_P_2,
2167   EVEX_W_0F2F_P_0,
2168   EVEX_W_0F2F_P_2,
2169   EVEX_W_0F51_P_0,
2170   EVEX_W_0F51_P_1,
2171   EVEX_W_0F51_P_2,
2172   EVEX_W_0F51_P_3,
2173   EVEX_W_0F54_P_0,
2174   EVEX_W_0F54_P_2,
2175   EVEX_W_0F55_P_0,
2176   EVEX_W_0F55_P_2,
2177   EVEX_W_0F56_P_0,
2178   EVEX_W_0F56_P_2,
2179   EVEX_W_0F57_P_0,
2180   EVEX_W_0F57_P_2,
2181   EVEX_W_0F58_P_0,
2182   EVEX_W_0F58_P_1,
2183   EVEX_W_0F58_P_2,
2184   EVEX_W_0F58_P_3,
2185   EVEX_W_0F59_P_0,
2186   EVEX_W_0F59_P_1,
2187   EVEX_W_0F59_P_2,
2188   EVEX_W_0F59_P_3,
2189   EVEX_W_0F5A_P_0,
2190   EVEX_W_0F5A_P_1,
2191   EVEX_W_0F5A_P_2,
2192   EVEX_W_0F5A_P_3,
2193   EVEX_W_0F5B_P_0,
2194   EVEX_W_0F5B_P_1,
2195   EVEX_W_0F5B_P_2,
2196   EVEX_W_0F5C_P_0,
2197   EVEX_W_0F5C_P_1,
2198   EVEX_W_0F5C_P_2,
2199   EVEX_W_0F5C_P_3,
2200   EVEX_W_0F5D_P_0,
2201   EVEX_W_0F5D_P_1,
2202   EVEX_W_0F5D_P_2,
2203   EVEX_W_0F5D_P_3,
2204   EVEX_W_0F5E_P_0,
2205   EVEX_W_0F5E_P_1,
2206   EVEX_W_0F5E_P_2,
2207   EVEX_W_0F5E_P_3,
2208   EVEX_W_0F5F_P_0,
2209   EVEX_W_0F5F_P_1,
2210   EVEX_W_0F5F_P_2,
2211   EVEX_W_0F5F_P_3,
2212   EVEX_W_0F62_P_2,
2213   EVEX_W_0F66_P_2,
2214   EVEX_W_0F6A_P_2,
2215   EVEX_W_0F6B_P_2,
2216   EVEX_W_0F6C_P_2,
2217   EVEX_W_0F6D_P_2,
2218   EVEX_W_0F6E_P_2,
2219   EVEX_W_0F6F_P_1,
2220   EVEX_W_0F6F_P_2,
2221   EVEX_W_0F6F_P_3,
2222   EVEX_W_0F70_P_2,
2223   EVEX_W_0F72_R_2_P_2,
2224   EVEX_W_0F72_R_6_P_2,
2225   EVEX_W_0F73_R_2_P_2,
2226   EVEX_W_0F73_R_6_P_2,
2227   EVEX_W_0F76_P_2,
2228   EVEX_W_0F78_P_0,
2229   EVEX_W_0F78_P_2,
2230   EVEX_W_0F79_P_0,
2231   EVEX_W_0F79_P_2,
2232   EVEX_W_0F7A_P_1,
2233   EVEX_W_0F7A_P_2,
2234   EVEX_W_0F7A_P_3,
2235   EVEX_W_0F7B_P_1,
2236   EVEX_W_0F7B_P_2,
2237   EVEX_W_0F7B_P_3,
2238   EVEX_W_0F7E_P_1,
2239   EVEX_W_0F7E_P_2,
2240   EVEX_W_0F7F_P_1,
2241   EVEX_W_0F7F_P_2,
2242   EVEX_W_0F7F_P_3,
2243   EVEX_W_0FC2_P_0,
2244   EVEX_W_0FC2_P_1,
2245   EVEX_W_0FC2_P_2,
2246   EVEX_W_0FC2_P_3,
2247   EVEX_W_0FC6_P_0,
2248   EVEX_W_0FC6_P_2,
2249   EVEX_W_0FD2_P_2,
2250   EVEX_W_0FD3_P_2,
2251   EVEX_W_0FD4_P_2,
2252   EVEX_W_0FD6_P_2,
2253   EVEX_W_0FE6_P_1,
2254   EVEX_W_0FE6_P_2,
2255   EVEX_W_0FE6_P_3,
2256   EVEX_W_0FE7_P_2,
2257   EVEX_W_0FF2_P_2,
2258   EVEX_W_0FF3_P_2,
2259   EVEX_W_0FF4_P_2,
2260   EVEX_W_0FFA_P_2,
2261   EVEX_W_0FFB_P_2,
2262   EVEX_W_0FFE_P_2,
2263   EVEX_W_0F380C_P_2,
2264   EVEX_W_0F380D_P_2,
2265   EVEX_W_0F3810_P_1,
2266   EVEX_W_0F3810_P_2,
2267   EVEX_W_0F3811_P_1,
2268   EVEX_W_0F3811_P_2,
2269   EVEX_W_0F3812_P_1,
2270   EVEX_W_0F3812_P_2,
2271   EVEX_W_0F3813_P_1,
2272   EVEX_W_0F3813_P_2,
2273   EVEX_W_0F3814_P_1,
2274   EVEX_W_0F3815_P_1,
2275   EVEX_W_0F3818_P_2,
2276   EVEX_W_0F3819_P_2,
2277   EVEX_W_0F381A_P_2,
2278   EVEX_W_0F381B_P_2,
2279   EVEX_W_0F381E_P_2,
2280   EVEX_W_0F381F_P_2,
2281   EVEX_W_0F3820_P_1,
2282   EVEX_W_0F3821_P_1,
2283   EVEX_W_0F3822_P_1,
2284   EVEX_W_0F3823_P_1,
2285   EVEX_W_0F3824_P_1,
2286   EVEX_W_0F3825_P_1,
2287   EVEX_W_0F3825_P_2,
2288   EVEX_W_0F3826_P_1,
2289   EVEX_W_0F3826_P_2,
2290   EVEX_W_0F3828_P_1,
2291   EVEX_W_0F3828_P_2,
2292   EVEX_W_0F3829_P_1,
2293   EVEX_W_0F3829_P_2,
2294   EVEX_W_0F382A_P_1,
2295   EVEX_W_0F382A_P_2,
2296   EVEX_W_0F382B_P_2,
2297   EVEX_W_0F3830_P_1,
2298   EVEX_W_0F3831_P_1,
2299   EVEX_W_0F3832_P_1,
2300   EVEX_W_0F3833_P_1,
2301   EVEX_W_0F3834_P_1,
2302   EVEX_W_0F3835_P_1,
2303   EVEX_W_0F3835_P_2,
2304   EVEX_W_0F3837_P_2,
2305   EVEX_W_0F3838_P_1,
2306   EVEX_W_0F3839_P_1,
2307   EVEX_W_0F383A_P_1,
2308   EVEX_W_0F3840_P_2,
2309   EVEX_W_0F3858_P_2,
2310   EVEX_W_0F3859_P_2,
2311   EVEX_W_0F385A_P_2,
2312   EVEX_W_0F385B_P_2,
2313   EVEX_W_0F3866_P_2,
2314   EVEX_W_0F3875_P_2,
2315   EVEX_W_0F3878_P_2,
2316   EVEX_W_0F3879_P_2,
2317   EVEX_W_0F387A_P_2,
2318   EVEX_W_0F387B_P_2,
2319   EVEX_W_0F387D_P_2,
2320   EVEX_W_0F3883_P_2,
2321   EVEX_W_0F388D_P_2,
2322   EVEX_W_0F3891_P_2,
2323   EVEX_W_0F3893_P_2,
2324   EVEX_W_0F38A1_P_2,
2325   EVEX_W_0F38A3_P_2,
2326   EVEX_W_0F38C7_R_1_P_2,
2327   EVEX_W_0F38C7_R_2_P_2,
2328   EVEX_W_0F38C7_R_5_P_2,
2329   EVEX_W_0F38C7_R_6_P_2,
2330
2331   EVEX_W_0F3A00_P_2,
2332   EVEX_W_0F3A01_P_2,
2333   EVEX_W_0F3A04_P_2,
2334   EVEX_W_0F3A05_P_2,
2335   EVEX_W_0F3A08_P_2,
2336   EVEX_W_0F3A09_P_2,
2337   EVEX_W_0F3A0A_P_2,
2338   EVEX_W_0F3A0B_P_2,
2339   EVEX_W_0F3A16_P_2,
2340   EVEX_W_0F3A18_P_2,
2341   EVEX_W_0F3A19_P_2,
2342   EVEX_W_0F3A1A_P_2,
2343   EVEX_W_0F3A1B_P_2,
2344   EVEX_W_0F3A1D_P_2,
2345   EVEX_W_0F3A21_P_2,
2346   EVEX_W_0F3A22_P_2,
2347   EVEX_W_0F3A23_P_2,
2348   EVEX_W_0F3A38_P_2,
2349   EVEX_W_0F3A39_P_2,
2350   EVEX_W_0F3A3A_P_2,
2351   EVEX_W_0F3A3B_P_2,
2352   EVEX_W_0F3A3E_P_2,
2353   EVEX_W_0F3A3F_P_2,
2354   EVEX_W_0F3A42_P_2,
2355   EVEX_W_0F3A43_P_2,
2356   EVEX_W_0F3A50_P_2,
2357   EVEX_W_0F3A51_P_2,
2358   EVEX_W_0F3A56_P_2,
2359   EVEX_W_0F3A57_P_2,
2360   EVEX_W_0F3A66_P_2,
2361   EVEX_W_0F3A67_P_2
2362 };
2363
2364 typedef void (*op_rtn) (int bytemode, int sizeflag);
2365
2366 struct dis386 {
2367   const char *name;
2368   struct
2369     {
2370       op_rtn rtn;
2371       int bytemode;
2372     } op[MAX_OPERANDS];
2373   unsigned int prefix_requirement;
2374 };
2375
2376 /* Upper case letters in the instruction names here are macros.
2377    'A' => print 'b' if no register operands or suffix_always is true
2378    'B' => print 'b' if suffix_always is true
2379    'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
2380           size prefix
2381    'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
2382           suffix_always is true
2383    'E' => print 'e' if 32-bit form of jcxz
2384    'F' => print 'w' or 'l' depending on address size prefix (loop insns)
2385    'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
2386    'H' => print ",pt" or ",pn" branch hint
2387    'I' => honor following macro letter even in Intel mode (implemented only
2388           for some of the macro letters)
2389    'J' => print 'l'
2390    'K' => print 'd' or 'q' if rex prefix is present.
2391    'L' => print 'l' if suffix_always is true
2392    'M' => print 'r' if intel_mnemonic is false.
2393    'N' => print 'n' if instruction has no wait "prefix"
2394    'O' => print 'd' or 'o' (or 'q' in Intel mode)
2395    'P' => print 'w', 'l' or 'q' if instruction has an operand size prefix,
2396           or suffix_always is true.  print 'q' if rex prefix is present.
2397    'Q' => print 'w', 'l' or 'q' for memory operand or suffix_always
2398           is true
2399    'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
2400    'S' => print 'w', 'l' or 'q' if suffix_always is true
2401    'T' => print 'q' in 64bit mode and behave as 'P' otherwise
2402    'U' => print 'q' in 64bit mode and behave as 'Q' otherwise
2403    'V' => print 'q' in 64bit mode and behave as 'S' otherwise
2404    'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
2405    'X' => print 's', 'd' depending on data16 prefix (for XMM)
2406    'Y' => 'q' if instruction has an REX 64bit overwrite prefix and
2407           suffix_always is true.
2408    'Z' => print 'q' in 64bit mode and behave as 'L' otherwise
2409    '!' => change condition from true to false or from false to true.
2410    '%' => add 1 upper case letter to the macro.
2411
2412    2 upper case letter macros:
2413    "XY" => print 'x' or 'y' if no register operands or suffix_always
2414            is true.
2415    "XW" => print 's', 'd' depending on the VEX.W bit (for FMA)
2416    "LQ" => print 'l' ('d' in Intel mode) or 'q' for memory operand
2417            or suffix_always is true
2418    "LB" => print "abs" in 64bit mode and behave as 'B' otherwise
2419    "LS" => print "abs" in 64bit mode and behave as 'S' otherwise
2420    "LV" => print "abs" for 64bit operand and behave as 'S' otherwise
2421    "LW" => print 'd', 'q' depending on the VEX.W bit
2422    "LP" => print 'w' or 'l' ('d' in Intel mode) if instruction has
2423            an operand size prefix, or suffix_always is true.  print
2424            'q' if rex prefix is present.
2425
2426    Many of the above letters print nothing in Intel mode.  See "putop"
2427    for the details.
2428
2429    Braces '{' and '}', and vertical bars '|', indicate alternative
2430    mnemonic strings for AT&T and Intel.  */
2431
2432 static const struct dis386 dis386[] = {
2433   /* 00 */
2434   { "addB",             { Ebh1, Gb }, 0 },
2435   { "addS",             { Evh1, Gv }, 0 },
2436   { "addB",             { Gb, EbS }, 0 },
2437   { "addS",             { Gv, EvS }, 0 },
2438   { "addB",             { AL, Ib }, 0 },
2439   { "addS",             { eAX, Iv }, 0 },
2440   { X86_64_TABLE (X86_64_06) },
2441   { X86_64_TABLE (X86_64_07) },
2442   /* 08 */
2443   { "orB",              { Ebh1, Gb }, 0 },
2444   { "orS",              { Evh1, Gv }, 0 },
2445   { "orB",              { Gb, EbS }, 0 },
2446   { "orS",              { Gv, EvS }, 0 },
2447   { "orB",              { AL, Ib }, 0 },
2448   { "orS",              { eAX, Iv }, 0 },
2449   { X86_64_TABLE (X86_64_0D) },
2450   { Bad_Opcode },       /* 0x0f extended opcode escape */
2451   /* 10 */
2452   { "adcB",             { Ebh1, Gb }, 0 },
2453   { "adcS",             { Evh1, Gv }, 0 },
2454   { "adcB",             { Gb, EbS }, 0 },
2455   { "adcS",             { Gv, EvS }, 0 },
2456   { "adcB",             { AL, Ib }, 0 },
2457   { "adcS",             { eAX, Iv }, 0 },
2458   { X86_64_TABLE (X86_64_16) },
2459   { X86_64_TABLE (X86_64_17) },
2460   /* 18 */
2461   { "sbbB",             { Ebh1, Gb }, 0 },
2462   { "sbbS",             { Evh1, Gv }, 0 },
2463   { "sbbB",             { Gb, EbS }, 0 },
2464   { "sbbS",             { Gv, EvS }, 0 },
2465   { "sbbB",             { AL, Ib }, 0 },
2466   { "sbbS",             { eAX, Iv }, 0 },
2467   { X86_64_TABLE (X86_64_1E) },
2468   { X86_64_TABLE (X86_64_1F) },
2469   /* 20 */
2470   { "andB",             { Ebh1, Gb }, 0 },
2471   { "andS",             { Evh1, Gv }, 0 },
2472   { "andB",             { Gb, EbS }, 0 },
2473   { "andS",             { Gv, EvS }, 0 },
2474   { "andB",             { AL, Ib }, 0 },
2475   { "andS",             { eAX, Iv }, 0 },
2476   { Bad_Opcode },       /* SEG ES prefix */
2477   { X86_64_TABLE (X86_64_27) },
2478   /* 28 */
2479   { "subB",             { Ebh1, Gb }, 0 },
2480   { "subS",             { Evh1, Gv }, 0 },
2481   { "subB",             { Gb, EbS }, 0 },
2482   { "subS",             { Gv, EvS }, 0 },
2483   { "subB",             { AL, Ib }, 0 },
2484   { "subS",             { eAX, Iv }, 0 },
2485   { Bad_Opcode },       /* SEG CS prefix */
2486   { X86_64_TABLE (X86_64_2F) },
2487   /* 30 */
2488   { "xorB",             { Ebh1, Gb }, 0 },
2489   { "xorS",             { Evh1, Gv }, 0 },
2490   { "xorB",             { Gb, EbS }, 0 },
2491   { "xorS",             { Gv, EvS }, 0 },
2492   { "xorB",             { AL, Ib }, 0 },
2493   { "xorS",             { eAX, Iv }, 0 },
2494   { Bad_Opcode },       /* SEG SS prefix */
2495   { X86_64_TABLE (X86_64_37) },
2496   /* 38 */
2497   { "cmpB",             { Eb, Gb }, 0 },
2498   { "cmpS",             { Ev, Gv }, 0 },
2499   { "cmpB",             { Gb, EbS }, 0 },
2500   { "cmpS",             { Gv, EvS }, 0 },
2501   { "cmpB",             { AL, Ib }, 0 },
2502   { "cmpS",             { eAX, Iv }, 0 },
2503   { Bad_Opcode },       /* SEG DS prefix */
2504   { X86_64_TABLE (X86_64_3F) },
2505   /* 40 */
2506   { "inc{S|}",          { RMeAX }, 0 },
2507   { "inc{S|}",          { RMeCX }, 0 },
2508   { "inc{S|}",          { RMeDX }, 0 },
2509   { "inc{S|}",          { RMeBX }, 0 },
2510   { "inc{S|}",          { RMeSP }, 0 },
2511   { "inc{S|}",          { RMeBP }, 0 },
2512   { "inc{S|}",          { RMeSI }, 0 },
2513   { "inc{S|}",          { RMeDI }, 0 },
2514   /* 48 */
2515   { "dec{S|}",          { RMeAX }, 0 },
2516   { "dec{S|}",          { RMeCX }, 0 },
2517   { "dec{S|}",          { RMeDX }, 0 },
2518   { "dec{S|}",          { RMeBX }, 0 },
2519   { "dec{S|}",          { RMeSP }, 0 },
2520   { "dec{S|}",          { RMeBP }, 0 },
2521   { "dec{S|}",          { RMeSI }, 0 },
2522   { "dec{S|}",          { RMeDI }, 0 },
2523   /* 50 */
2524   { "pushV",            { RMrAX }, 0 },
2525   { "pushV",            { RMrCX }, 0 },
2526   { "pushV",            { RMrDX }, 0 },
2527   { "pushV",            { RMrBX }, 0 },
2528   { "pushV",            { RMrSP }, 0 },
2529   { "pushV",            { RMrBP }, 0 },
2530   { "pushV",            { RMrSI }, 0 },
2531   { "pushV",            { RMrDI }, 0 },
2532   /* 58 */
2533   { "popV",             { RMrAX }, 0 },
2534   { "popV",             { RMrCX }, 0 },
2535   { "popV",             { RMrDX }, 0 },
2536   { "popV",             { RMrBX }, 0 },
2537   { "popV",             { RMrSP }, 0 },
2538   { "popV",             { RMrBP }, 0 },
2539   { "popV",             { RMrSI }, 0 },
2540   { "popV",             { RMrDI }, 0 },
2541   /* 60 */
2542   { X86_64_TABLE (X86_64_60) },
2543   { X86_64_TABLE (X86_64_61) },
2544   { X86_64_TABLE (X86_64_62) },
2545   { X86_64_TABLE (X86_64_63) },
2546   { Bad_Opcode },       /* seg fs */
2547   { Bad_Opcode },       /* seg gs */
2548   { Bad_Opcode },       /* op size prefix */
2549   { Bad_Opcode },       /* adr size prefix */
2550   /* 68 */
2551   { "pushT",            { sIv }, 0 },
2552   { "imulS",            { Gv, Ev, Iv }, 0 },
2553   { "pushT",            { sIbT }, 0 },
2554   { "imulS",            { Gv, Ev, sIb }, 0 },
2555   { "ins{b|}",          { Ybr, indirDX }, 0 },
2556   { X86_64_TABLE (X86_64_6D) },
2557   { "outs{b|}",         { indirDXr, Xb }, 0 },
2558   { X86_64_TABLE (X86_64_6F) },
2559   /* 70 */
2560   { "joH",              { Jb, BND, cond_jump_flag }, 0 },
2561   { "jnoH",             { Jb, BND, cond_jump_flag }, 0 },
2562   { "jbH",              { Jb, BND, cond_jump_flag }, 0 },
2563   { "jaeH",             { Jb, BND, cond_jump_flag }, 0 },
2564   { "jeH",              { Jb, BND, cond_jump_flag }, 0 },
2565   { "jneH",             { Jb, BND, cond_jump_flag }, 0 },
2566   { "jbeH",             { Jb, BND, cond_jump_flag }, 0 },
2567   { "jaH",              { Jb, BND, cond_jump_flag }, 0 },
2568   /* 78 */
2569   { "jsH",              { Jb, BND, cond_jump_flag }, 0 },
2570   { "jnsH",             { Jb, BND, cond_jump_flag }, 0 },
2571   { "jpH",              { Jb, BND, cond_jump_flag }, 0 },
2572   { "jnpH",             { Jb, BND, cond_jump_flag }, 0 },
2573   { "jlH",              { Jb, BND, cond_jump_flag }, 0 },
2574   { "jgeH",             { Jb, BND, cond_jump_flag }, 0 },
2575   { "jleH",             { Jb, BND, cond_jump_flag }, 0 },
2576   { "jgH",              { Jb, BND, cond_jump_flag }, 0 },
2577   /* 80 */
2578   { REG_TABLE (REG_80) },
2579   { REG_TABLE (REG_81) },
2580   { Bad_Opcode },
2581   { REG_TABLE (REG_82) },
2582   { "testB",            { Eb, Gb }, 0 },
2583   { "testS",            { Ev, Gv }, 0 },
2584   { "xchgB",            { Ebh2, Gb }, 0 },
2585   { "xchgS",            { Evh2, Gv }, 0 },
2586   /* 88 */
2587   { "movB",             { Ebh3, Gb }, 0 },
2588   { "movS",             { Evh3, Gv }, 0 },
2589   { "movB",             { Gb, EbS }, 0 },
2590   { "movS",             { Gv, EvS }, 0 },
2591   { "movD",             { Sv, Sw }, 0 },
2592   { MOD_TABLE (MOD_8D) },
2593   { "movD",             { Sw, Sv }, 0 },
2594   { REG_TABLE (REG_8F) },
2595   /* 90 */
2596   { PREFIX_TABLE (PREFIX_90) },
2597   { "xchgS",            { RMeCX, eAX }, 0 },
2598   { "xchgS",            { RMeDX, eAX }, 0 },
2599   { "xchgS",            { RMeBX, eAX }, 0 },
2600   { "xchgS",            { RMeSP, eAX }, 0 },
2601   { "xchgS",            { RMeBP, eAX }, 0 },
2602   { "xchgS",            { RMeSI, eAX }, 0 },
2603   { "xchgS",            { RMeDI, eAX }, 0 },
2604   /* 98 */
2605   { "cW{t|}R",          { XX }, 0 },
2606   { "cR{t|}O",          { XX }, 0 },
2607   { X86_64_TABLE (X86_64_9A) },
2608   { Bad_Opcode },       /* fwait */
2609   { "pushfT",           { XX }, 0 },
2610   { "popfT",            { XX }, 0 },
2611   { "sahf",             { XX }, 0 },
2612   { "lahf",             { XX }, 0 },
2613   /* a0 */
2614   { "mov%LB",           { AL, Ob }, 0 },
2615   { "mov%LS",           { eAX, Ov }, 0 },
2616   { "mov%LB",           { Ob, AL }, 0 },
2617   { "mov%LS",           { Ov, eAX }, 0 },
2618   { "movs{b|}",         { Ybr, Xb }, 0 },
2619   { "movs{R|}",         { Yvr, Xv }, 0 },
2620   { "cmps{b|}",         { Xb, Yb }, 0 },
2621   { "cmps{R|}",         { Xv, Yv }, 0 },
2622   /* a8 */
2623   { "testB",            { AL, Ib }, 0 },
2624   { "testS",            { eAX, Iv }, 0 },
2625   { "stosB",            { Ybr, AL }, 0 },
2626   { "stosS",            { Yvr, eAX }, 0 },
2627   { "lodsB",            { ALr, Xb }, 0 },
2628   { "lodsS",            { eAXr, Xv }, 0 },
2629   { "scasB",            { AL, Yb }, 0 },
2630   { "scasS",            { eAX, Yv }, 0 },
2631   /* b0 */
2632   { "movB",             { RMAL, Ib }, 0 },
2633   { "movB",             { RMCL, Ib }, 0 },
2634   { "movB",             { RMDL, Ib }, 0 },
2635   { "movB",             { RMBL, Ib }, 0 },
2636   { "movB",             { RMAH, Ib }, 0 },
2637   { "movB",             { RMCH, Ib }, 0 },
2638   { "movB",             { RMDH, Ib }, 0 },
2639   { "movB",             { RMBH, Ib }, 0 },
2640   /* b8 */
2641   { "mov%LV",           { RMeAX, Iv64 }, 0 },
2642   { "mov%LV",           { RMeCX, Iv64 }, 0 },
2643   { "mov%LV",           { RMeDX, Iv64 }, 0 },
2644   { "mov%LV",           { RMeBX, Iv64 }, 0 },
2645   { "mov%LV",           { RMeSP, Iv64 }, 0 },
2646   { "mov%LV",           { RMeBP, Iv64 }, 0 },
2647   { "mov%LV",           { RMeSI, Iv64 }, 0 },
2648   { "mov%LV",           { RMeDI, Iv64 }, 0 },
2649   /* c0 */
2650   { REG_TABLE (REG_C0) },
2651   { REG_TABLE (REG_C1) },
2652   { "retT",             { Iw, BND }, 0 },
2653   { "retT",             { BND }, 0 },
2654   { X86_64_TABLE (X86_64_C4) },
2655   { X86_64_TABLE (X86_64_C5) },
2656   { REG_TABLE (REG_C6) },
2657   { REG_TABLE (REG_C7) },
2658   /* c8 */
2659   { "enterT",           { Iw, Ib }, 0 },
2660   { "leaveT",           { XX }, 0 },
2661   { "Jret{|f}P",        { Iw }, 0 },
2662   { "Jret{|f}P",        { XX }, 0 },
2663   { "int3",             { XX }, 0 },
2664   { "int",              { Ib }, 0 },
2665   { X86_64_TABLE (X86_64_CE) },
2666   { "iret%LP",          { XX }, 0 },
2667   /* d0 */
2668   { REG_TABLE (REG_D0) },
2669   { REG_TABLE (REG_D1) },
2670   { REG_TABLE (REG_D2) },
2671   { REG_TABLE (REG_D3) },
2672   { X86_64_TABLE (X86_64_D4) },
2673   { X86_64_TABLE (X86_64_D5) },
2674   { Bad_Opcode },
2675   { "xlat",             { DSBX }, 0 },
2676   /* d8 */
2677   { FLOAT },
2678   { FLOAT },
2679   { FLOAT },
2680   { FLOAT },
2681   { FLOAT },
2682   { FLOAT },
2683   { FLOAT },
2684   { FLOAT },
2685   /* e0 */
2686   { "loopneFH",         { Jb, XX, loop_jcxz_flag }, 0 },
2687   { "loopeFH",          { Jb, XX, loop_jcxz_flag }, 0 },
2688   { "loopFH",           { Jb, XX, loop_jcxz_flag }, 0 },
2689   { "jEcxzH",           { Jb, XX, loop_jcxz_flag }, 0 },
2690   { "inB",              { AL, Ib }, 0 },
2691   { "inG",              { zAX, Ib }, 0 },
2692   { "outB",             { Ib, AL }, 0 },
2693   { "outG",             { Ib, zAX }, 0 },
2694   /* e8 */
2695   { "callT",            { Jv, BND }, 0 },
2696   { "jmpT",             { Jv, BND }, 0 },
2697   { X86_64_TABLE (X86_64_EA) },
2698   { "jmp",              { Jb, BND }, 0 },
2699   { "inB",              { AL, indirDX }, 0 },
2700   { "inG",              { zAX, indirDX }, 0 },
2701   { "outB",             { indirDX, AL }, 0 },
2702   { "outG",             { indirDX, zAX }, 0 },
2703   /* f0 */
2704   { Bad_Opcode },       /* lock prefix */
2705   { "icebp",            { XX }, 0 },
2706   { Bad_Opcode },       /* repne */
2707   { Bad_Opcode },       /* repz */
2708   { "hlt",              { XX }, 0 },
2709   { "cmc",              { XX }, 0 },
2710   { REG_TABLE (REG_F6) },
2711   { REG_TABLE (REG_F7) },
2712   /* f8 */
2713   { "clc",              { XX }, 0 },
2714   { "stc",              { XX }, 0 },
2715   { "cli",              { XX }, 0 },
2716   { "sti",              { XX }, 0 },
2717   { "cld",              { XX }, 0 },
2718   { "std",              { XX }, 0 },
2719   { REG_TABLE (REG_FE) },
2720   { REG_TABLE (REG_FF) },
2721 };
2722
2723 static const struct dis386 dis386_twobyte[] = {
2724   /* 00 */
2725   { REG_TABLE (REG_0F00 ) },
2726   { REG_TABLE (REG_0F01 ) },
2727   { "larS",             { Gv, Ew }, 0 },
2728   { "lslS",             { Gv, Ew }, 0 },
2729   { Bad_Opcode },
2730   { "syscall",          { XX }, 0 },
2731   { "clts",             { XX }, 0 },
2732   { "sysret%LP",                { XX }, 0 },
2733   /* 08 */
2734   { "invd",             { XX }, 0 },
2735   { "wbinvd",           { XX }, 0 },
2736   { Bad_Opcode },
2737   { "ud2",              { XX }, 0 },
2738   { Bad_Opcode },
2739   { REG_TABLE (REG_0F0D) },
2740   { "femms",            { XX }, 0 },
2741   { "",                 { MX, EM, OPSUF }, 0 }, /* See OP_3DNowSuffix.  */
2742   /* 10 */
2743   { PREFIX_TABLE (PREFIX_0F10) },
2744   { PREFIX_TABLE (PREFIX_0F11) },
2745   { PREFIX_TABLE (PREFIX_0F12) },
2746   { MOD_TABLE (MOD_0F13) },
2747   { "unpcklpX",         { XM, EXx }, PREFIX_MANDATORY },
2748   { "unpckhpX",         { XM, EXx }, PREFIX_MANDATORY },
2749   { PREFIX_TABLE (PREFIX_0F16) },
2750   { MOD_TABLE (MOD_0F17) },
2751   /* 18 */
2752   { REG_TABLE (REG_0F18) },
2753   { "nopQ",             { Ev }, 0 },
2754   { PREFIX_TABLE (PREFIX_0F1A) },
2755   { PREFIX_TABLE (PREFIX_0F1B) },
2756   { "nopQ",             { Ev }, 0 },
2757   { "nopQ",             { Ev }, 0 },
2758   { "nopQ",             { Ev }, 0 },
2759   { "nopQ",             { Ev }, 0 },
2760   /* 20 */
2761   { "movZ",             { Rm, Cm }, 0 },
2762   { "movZ",             { Rm, Dm }, 0 },
2763   { "movZ",             { Cm, Rm }, 0 },
2764   { "movZ",             { Dm, Rm }, 0 },
2765   { MOD_TABLE (MOD_0F24) },
2766   { Bad_Opcode },
2767   { MOD_TABLE (MOD_0F26) },
2768   { Bad_Opcode },
2769   /* 28 */
2770   { "movapX",           { XM, EXx }, PREFIX_MANDATORY },
2771   { "movapX",           { EXxS, XM }, PREFIX_MANDATORY },
2772   { PREFIX_TABLE (PREFIX_0F2A) },
2773   { PREFIX_TABLE (PREFIX_0F2B) },
2774   { PREFIX_TABLE (PREFIX_0F2C) },
2775   { PREFIX_TABLE (PREFIX_0F2D) },
2776   { PREFIX_TABLE (PREFIX_0F2E) },
2777   { PREFIX_TABLE (PREFIX_0F2F) },
2778   /* 30 */
2779   { "wrmsr",            { XX }, 0 },
2780   { "rdtsc",            { XX }, 0 },
2781   { "rdmsr",            { XX }, 0 },
2782   { "rdpmc",            { XX }, 0 },
2783   { "sysenter",         { XX }, 0 },
2784   { "sysexit",          { XX }, 0 },
2785   { Bad_Opcode },
2786   { "getsec",           { XX }, 0 },
2787   /* 38 */
2788   { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F38, PREFIX_MANDATORY) },
2789   { Bad_Opcode },
2790   { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F3A, PREFIX_MANDATORY) },
2791   { Bad_Opcode },
2792   { Bad_Opcode },
2793   { Bad_Opcode },
2794   { Bad_Opcode },
2795   { Bad_Opcode },
2796   /* 40 */
2797   { "cmovoS",           { Gv, Ev }, 0 },
2798   { "cmovnoS",          { Gv, Ev }, 0 },
2799   { "cmovbS",           { Gv, Ev }, 0 },
2800   { "cmovaeS",          { Gv, Ev }, 0 },
2801   { "cmoveS",           { Gv, Ev }, 0 },
2802   { "cmovneS",          { Gv, Ev }, 0 },
2803   { "cmovbeS",          { Gv, Ev }, 0 },
2804   { "cmovaS",           { Gv, Ev }, 0 },
2805   /* 48 */
2806   { "cmovsS",           { Gv, Ev }, 0 },
2807   { "cmovnsS",          { Gv, Ev }, 0 },
2808   { "cmovpS",           { Gv, Ev }, 0 },
2809   { "cmovnpS",          { Gv, Ev }, 0 },
2810   { "cmovlS",           { Gv, Ev }, 0 },
2811   { "cmovgeS",          { Gv, Ev }, 0 },
2812   { "cmovleS",          { Gv, Ev }, 0 },
2813   { "cmovgS",           { Gv, Ev }, 0 },
2814   /* 50 */
2815   { MOD_TABLE (MOD_0F51) },
2816   { PREFIX_TABLE (PREFIX_0F51) },
2817   { PREFIX_TABLE (PREFIX_0F52) },
2818   { PREFIX_TABLE (PREFIX_0F53) },
2819   { "andpX",            { XM, EXx }, PREFIX_MANDATORY },
2820   { "andnpX",           { XM, EXx }, PREFIX_MANDATORY },
2821   { "orpX",             { XM, EXx }, PREFIX_MANDATORY },
2822   { "xorpX",            { XM, EXx }, PREFIX_MANDATORY },
2823   /* 58 */
2824   { PREFIX_TABLE (PREFIX_0F58) },
2825   { PREFIX_TABLE (PREFIX_0F59) },
2826   { PREFIX_TABLE (PREFIX_0F5A) },
2827   { PREFIX_TABLE (PREFIX_0F5B) },
2828   { PREFIX_TABLE (PREFIX_0F5C) },
2829   { PREFIX_TABLE (PREFIX_0F5D) },
2830   { PREFIX_TABLE (PREFIX_0F5E) },
2831   { PREFIX_TABLE (PREFIX_0F5F) },
2832   /* 60 */
2833   { PREFIX_TABLE (PREFIX_0F60) },
2834   { PREFIX_TABLE (PREFIX_0F61) },
2835   { PREFIX_TABLE (PREFIX_0F62) },
2836   { "packsswb",         { MX, EM }, PREFIX_MANDATORY },
2837   { "pcmpgtb",          { MX, EM }, PREFIX_MANDATORY },
2838   { "pcmpgtw",          { MX, EM }, PREFIX_MANDATORY },
2839   { "pcmpgtd",          { MX, EM }, PREFIX_MANDATORY },
2840   { "packuswb",         { MX, EM }, PREFIX_MANDATORY },
2841   /* 68 */
2842   { "punpckhbw",        { MX, EM }, PREFIX_MANDATORY },
2843   { "punpckhwd",        { MX, EM }, PREFIX_MANDATORY },
2844   { "punpckhdq",        { MX, EM }, PREFIX_MANDATORY },
2845   { "packssdw",         { MX, EM }, PREFIX_MANDATORY },
2846   { PREFIX_TABLE (PREFIX_0F6C) },
2847   { PREFIX_TABLE (PREFIX_0F6D) },
2848   { "movK",             { MX, Edq }, PREFIX_MANDATORY },
2849   { PREFIX_TABLE (PREFIX_0F6F) },
2850   /* 70 */
2851   { PREFIX_TABLE (PREFIX_0F70) },
2852   { REG_TABLE (REG_0F71) },
2853   { REG_TABLE (REG_0F72) },
2854   { REG_TABLE (REG_0F73) },
2855   { "pcmpeqb",          { MX, EM }, PREFIX_MANDATORY },
2856   { "pcmpeqw",          { MX, EM }, PREFIX_MANDATORY },
2857   { "pcmpeqd",          { MX, EM }, PREFIX_MANDATORY },
2858   { "emms",             { XX }, PREFIX_MANDATORY },
2859   /* 78 */
2860   { PREFIX_TABLE (PREFIX_0F78) },
2861   { PREFIX_TABLE (PREFIX_0F79) },
2862   { THREE_BYTE_TABLE (THREE_BYTE_0F7A) },
2863   { Bad_Opcode },
2864   { PREFIX_TABLE (PREFIX_0F7C) },
2865   { PREFIX_TABLE (PREFIX_0F7D) },
2866   { PREFIX_TABLE (PREFIX_0F7E) },
2867   { PREFIX_TABLE (PREFIX_0F7F) },
2868   /* 80 */
2869   { "joH",              { Jv, BND, cond_jump_flag }, 0 },
2870   { "jnoH",             { Jv, BND, cond_jump_flag }, 0 },
2871   { "jbH",              { Jv, BND, cond_jump_flag }, 0 },
2872   { "jaeH",             { Jv, BND, cond_jump_flag }, 0 },
2873   { "jeH",              { Jv, BND, cond_jump_flag }, 0 },
2874   { "jneH",             { Jv, BND, cond_jump_flag }, 0 },
2875   { "jbeH",             { Jv, BND, cond_jump_flag }, 0 },
2876   { "jaH",              { Jv, BND, cond_jump_flag }, 0 },
2877   /* 88 */
2878   { "jsH",              { Jv, BND, cond_jump_flag }, 0 },
2879   { "jnsH",             { Jv, BND, cond_jump_flag }, 0 },
2880   { "jpH",              { Jv, BND, cond_jump_flag }, 0 },
2881   { "jnpH",             { Jv, BND, cond_jump_flag }, 0 },
2882   { "jlH",              { Jv, BND, cond_jump_flag }, 0 },
2883   { "jgeH",             { Jv, BND, cond_jump_flag }, 0 },
2884   { "jleH",             { Jv, BND, cond_jump_flag }, 0 },
2885   { "jgH",              { Jv, BND, cond_jump_flag }, 0 },
2886   /* 90 */
2887   { "seto",             { Eb }, 0 },
2888   { "setno",            { Eb }, 0 },
2889   { "setb",             { Eb }, 0 },
2890   { "setae",            { Eb }, 0 },
2891   { "sete",             { Eb }, 0 },
2892   { "setne",            { Eb }, 0 },
2893   { "setbe",            { Eb }, 0 },
2894   { "seta",             { Eb }, 0 },
2895   /* 98 */
2896   { "sets",             { Eb }, 0 },
2897   { "setns",            { Eb }, 0 },
2898   { "setp",             { Eb }, 0 },
2899   { "setnp",            { Eb }, 0 },
2900   { "setl",             { Eb }, 0 },
2901   { "setge",            { Eb }, 0 },
2902   { "setle",            { Eb }, 0 },
2903   { "setg",             { Eb }, 0 },
2904   /* a0 */
2905   { "pushT",            { fs }, 0 },
2906   { "popT",             { fs }, 0 },
2907   { "cpuid",            { XX }, 0 },
2908   { "btS",              { Ev, Gv }, 0 },
2909   { "shldS",            { Ev, Gv, Ib }, 0 },
2910   { "shldS",            { Ev, Gv, CL }, 0 },
2911   { REG_TABLE (REG_0FA6) },
2912   { REG_TABLE (REG_0FA7) },
2913   /* a8 */
2914   { "pushT",            { gs }, 0 },
2915   { "popT",             { gs }, 0 },
2916   { "rsm",              { XX }, 0 },
2917   { "btsS",             { Evh1, Gv }, 0 },
2918   { "shrdS",            { Ev, Gv, Ib }, 0 },
2919   { "shrdS",            { Ev, Gv, CL }, 0 },
2920   { REG_TABLE (REG_0FAE) },
2921   { "imulS",            { Gv, Ev }, 0 },
2922   /* b0 */
2923   { "cmpxchgB",         { Ebh1, Gb }, 0 },
2924   { "cmpxchgS",         { Evh1, Gv }, 0 },
2925   { MOD_TABLE (MOD_0FB2) },
2926   { "btrS",             { Evh1, Gv }, 0 },
2927   { MOD_TABLE (MOD_0FB4) },
2928   { MOD_TABLE (MOD_0FB5) },
2929   { "movz{bR|x}",       { Gv, Eb }, 0 },
2930   { "movz{wR|x}",       { Gv, Ew }, 0 }, /* yes, there really is movzww ! */
2931   /* b8 */
2932   { PREFIX_TABLE (PREFIX_0FB8) },
2933   { "ud1",              { XX }, 0 },
2934   { REG_TABLE (REG_0FBA) },
2935   { "btcS",             { Evh1, Gv }, 0 },
2936   { PREFIX_TABLE (PREFIX_0FBC) },
2937   { PREFIX_TABLE (PREFIX_0FBD) },
2938   { "movs{bR|x}",       { Gv, Eb }, 0 },
2939   { "movs{wR|x}",       { Gv, Ew }, 0 }, /* yes, there really is movsww ! */
2940   /* c0 */
2941   { "xaddB",            { Ebh1, Gb }, 0 },
2942   { "xaddS",            { Evh1, Gv }, 0 },
2943   { PREFIX_TABLE (PREFIX_0FC2) },
2944   { PREFIX_TABLE (PREFIX_0FC3) },
2945   { "pinsrw",           { MX, Edqw, Ib }, PREFIX_MANDATORY },
2946   { "pextrw",           { Gdq, MS, Ib }, PREFIX_MANDATORY },
2947   { "shufpX",           { XM, EXx, Ib }, PREFIX_MANDATORY },
2948   { REG_TABLE (REG_0FC7) },
2949   /* c8 */
2950   { "bswap",            { RMeAX }, 0 },
2951   { "bswap",            { RMeCX }, 0 },
2952   { "bswap",            { RMeDX }, 0 },
2953   { "bswap",            { RMeBX }, 0 },
2954   { "bswap",            { RMeSP }, 0 },
2955   { "bswap",            { RMeBP }, 0 },
2956   { "bswap",            { RMeSI }, 0 },
2957   { "bswap",            { RMeDI }, 0 },
2958   /* d0 */
2959   { PREFIX_TABLE (PREFIX_0FD0) },
2960   { "psrlw",            { MX, EM }, PREFIX_MANDATORY },
2961   { "psrld",            { MX, EM }, PREFIX_MANDATORY },
2962   { "psrlq",            { MX, EM }, PREFIX_MANDATORY },
2963   { "paddq",            { MX, EM }, PREFIX_MANDATORY },
2964   { "pmullw",           { MX, EM }, PREFIX_MANDATORY },
2965   { PREFIX_TABLE (PREFIX_0FD6) },
2966   { MOD_TABLE (MOD_0FD7) },
2967   /* d8 */
2968   { "psubusb",          { MX, EM }, PREFIX_MANDATORY },
2969   { "psubusw",          { MX, EM }, PREFIX_MANDATORY },
2970   { "pminub",           { MX, EM }, PREFIX_MANDATORY },
2971   { "pand",             { MX, EM }, PREFIX_MANDATORY },
2972   { "paddusb",          { MX, EM }, PREFIX_MANDATORY },
2973   { "paddusw",          { MX, EM }, PREFIX_MANDATORY },
2974   { "pmaxub",           { MX, EM }, PREFIX_MANDATORY },
2975   { "pandn",            { MX, EM }, PREFIX_MANDATORY },
2976   /* e0 */
2977   { "pavgb",            { MX, EM }, PREFIX_MANDATORY },
2978   { "psraw",            { MX, EM }, PREFIX_MANDATORY },
2979   { "psrad",            { MX, EM }, PREFIX_MANDATORY },
2980   { "pavgw",            { MX, EM }, PREFIX_MANDATORY },
2981   { "pmulhuw",          { MX, EM }, PREFIX_MANDATORY },
2982   { "pmulhw",           { MX, EM }, PREFIX_MANDATORY },
2983   { PREFIX_TABLE (PREFIX_0FE6) },
2984   { PREFIX_TABLE (PREFIX_0FE7) },
2985   /* e8 */
2986   { "psubsb",           { MX, EM }, PREFIX_MANDATORY },
2987   { "psubsw",           { MX, EM }, PREFIX_MANDATORY },
2988   { "pminsw",           { MX, EM }, PREFIX_MANDATORY },
2989   { "por",              { MX, EM }, PREFIX_MANDATORY },
2990   { "paddsb",           { MX, EM }, PREFIX_MANDATORY },
2991   { "paddsw",           { MX, EM }, PREFIX_MANDATORY },
2992   { "pmaxsw",           { MX, EM }, PREFIX_MANDATORY },
2993   { "pxor",             { MX, EM }, PREFIX_MANDATORY },
2994   /* f0 */
2995   { PREFIX_TABLE (PREFIX_0FF0) },
2996   { "psllw",            { MX, EM }, PREFIX_MANDATORY },
2997   { "pslld",            { MX, EM }, PREFIX_MANDATORY },
2998   { "psllq",            { MX, EM }, PREFIX_MANDATORY },
2999   { "pmuludq",          { MX, EM }, PREFIX_MANDATORY },
3000   { "pmaddwd",          { MX, EM }, PREFIX_MANDATORY },
3001   { "psadbw",           { MX, EM }, PREFIX_MANDATORY },
3002   { PREFIX_TABLE (PREFIX_0FF7) },
3003   /* f8 */
3004   { "psubb",            { MX, EM }, PREFIX_MANDATORY },
3005   { "psubw",            { MX, EM }, PREFIX_MANDATORY },
3006   { "psubd",            { MX, EM }, PREFIX_MANDATORY },
3007   { "psubq",            { MX, EM }, PREFIX_MANDATORY },
3008   { "paddb",            { MX, EM }, PREFIX_MANDATORY },
3009   { "paddw",            { MX, EM }, PREFIX_MANDATORY },
3010   { "paddd",            { MX, EM }, PREFIX_MANDATORY },
3011   { Bad_Opcode },
3012 };
3013
3014 static const unsigned char onebyte_has_modrm[256] = {
3015   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
3016   /*       -------------------------------        */
3017   /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
3018   /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
3019   /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
3020   /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
3021   /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
3022   /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
3023   /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
3024   /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
3025   /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
3026   /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
3027   /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
3028   /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
3029   /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
3030   /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
3031   /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
3032   /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1  /* f0 */
3033   /*       -------------------------------        */
3034   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
3035 };
3036
3037 static const unsigned char twobyte_has_modrm[256] = {
3038   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
3039   /*       -------------------------------        */
3040   /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
3041   /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
3042   /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
3043   /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
3044   /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
3045   /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
3046   /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
3047   /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
3048   /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
3049   /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
3050   /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
3051   /* b0 */ 1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1, /* bf */
3052   /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
3053   /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
3054   /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
3055   /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0  /* ff */
3056   /*       -------------------------------        */
3057   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
3058 };
3059
3060 static char obuf[100];
3061 static char *obufp;
3062 static char *mnemonicendp;
3063 static char scratchbuf[100];
3064 static unsigned char *start_codep;
3065 static unsigned char *insn_codep;
3066 static unsigned char *codep;
3067 static unsigned char *end_codep;
3068 static int last_lock_prefix;
3069 static int last_repz_prefix;
3070 static int last_repnz_prefix;
3071 static int last_data_prefix;
3072 static int last_addr_prefix;
3073 static int last_rex_prefix;
3074 static int last_seg_prefix;
3075 static int fwait_prefix;
3076 /* The PREFIX_REPZ/PREFIX_REPNZ/PREFIX_DATA prefix is mandatory.  */
3077 static int mandatory_prefix;
3078 /* The active segment register prefix.  */
3079 static int active_seg_prefix;
3080 #define MAX_CODE_LENGTH 15
3081 /* We can up to 14 prefixes since the maximum instruction length is
3082    15bytes.  */
3083 static int all_prefixes[MAX_CODE_LENGTH - 1];
3084 static disassemble_info *the_info;
3085 static struct
3086   {
3087     int mod;
3088     int reg;
3089     int rm;
3090   }
3091 modrm;
3092 static unsigned char need_modrm;
3093 static struct
3094   {
3095     int scale;
3096     int index;
3097     int base;
3098   }
3099 sib;
3100 static struct
3101   {
3102     int register_specifier;
3103     int length;
3104     int prefix;
3105     int w;
3106     int evex;
3107     int r;
3108     int v;
3109     int mask_register_specifier;
3110     int zeroing;
3111     int ll;
3112     int b;
3113   }
3114 vex;
3115 static unsigned char need_vex;
3116 static unsigned char need_vex_reg;
3117 static unsigned char vex_w_done;
3118
3119 struct op
3120   {
3121     const char *name;
3122     unsigned int len;
3123   };
3124
3125 /* If we are accessing mod/rm/reg without need_modrm set, then the
3126    values are stale.  Hitting this abort likely indicates that you
3127    need to update onebyte_has_modrm or twobyte_has_modrm.  */
3128 #define MODRM_CHECK  if (!need_modrm) abort ()
3129
3130 static const char **names64;
3131 static const char **names32;
3132 static const char **names16;
3133 static const char **names8;
3134 static const char **names8rex;
3135 static const char **names_seg;
3136 static const char *index64;
3137 static const char *index32;
3138 static const char **index16;
3139 static const char **names_bnd;
3140
3141 static const char *intel_names64[] = {
3142   "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
3143   "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
3144 };
3145 static const char *intel_names32[] = {
3146   "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
3147   "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
3148 };
3149 static const char *intel_names16[] = {
3150   "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
3151   "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
3152 };
3153 static const char *intel_names8[] = {
3154   "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
3155 };
3156 static const char *intel_names8rex[] = {
3157   "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
3158   "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
3159 };
3160 static const char *intel_names_seg[] = {
3161   "es", "cs", "ss", "ds", "fs", "gs", "?", "?",
3162 };
3163 static const char *intel_index64 = "riz";
3164 static const char *intel_index32 = "eiz";
3165 static const char *intel_index16[] = {
3166   "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
3167 };
3168
3169 static const char *att_names64[] = {
3170   "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
3171   "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
3172 };
3173 static const char *att_names32[] = {
3174   "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
3175   "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
3176 };
3177 static const char *att_names16[] = {
3178   "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
3179   "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
3180 };
3181 static const char *att_names8[] = {
3182   "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
3183 };
3184 static const char *att_names8rex[] = {
3185   "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
3186   "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
3187 };
3188 static const char *att_names_seg[] = {
3189   "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
3190 };
3191 static const char *att_index64 = "%riz";
3192 static const char *att_index32 = "%eiz";
3193 static const char *att_index16[] = {
3194   "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
3195 };
3196
3197 static const char **names_mm;
3198 static const char *intel_names_mm[] = {
3199   "mm0", "mm1", "mm2", "mm3",
3200   "mm4", "mm5", "mm6", "mm7"
3201 };
3202 static const char *att_names_mm[] = {
3203   "%mm0", "%mm1", "%mm2", "%mm3",
3204   "%mm4", "%mm5", "%mm6", "%mm7"
3205 };
3206
3207 static const char *intel_names_bnd[] = {
3208   "bnd0", "bnd1", "bnd2", "bnd3"
3209 };
3210
3211 static const char *att_names_bnd[] = {
3212   "%bnd0", "%bnd1", "%bnd2", "%bnd3"
3213 };
3214
3215 static const char **names_xmm;
3216 static const char *intel_names_xmm[] = {
3217   "xmm0", "xmm1", "xmm2", "xmm3",
3218   "xmm4", "xmm5", "xmm6", "xmm7",
3219   "xmm8", "xmm9", "xmm10", "xmm11",
3220   "xmm12", "xmm13", "xmm14", "xmm15",
3221   "xmm16", "xmm17", "xmm18", "xmm19",
3222   "xmm20", "xmm21", "xmm22", "xmm23",
3223   "xmm24", "xmm25", "xmm26", "xmm27",
3224   "xmm28", "xmm29", "xmm30", "xmm31"
3225 };
3226 static const char *att_names_xmm[] = {
3227   "%xmm0", "%xmm1", "%xmm2", "%xmm3",
3228   "%xmm4", "%xmm5", "%xmm6", "%xmm7",
3229   "%xmm8", "%xmm9", "%xmm10", "%xmm11",
3230   "%xmm12", "%xmm13", "%xmm14", "%xmm15",
3231   "%xmm16", "%xmm17", "%xmm18", "%xmm19",
3232   "%xmm20", "%xmm21", "%xmm22", "%xmm23",
3233   "%xmm24", "%xmm25", "%xmm26", "%xmm27",
3234   "%xmm28", "%xmm29", "%xmm30", "%xmm31"
3235 };
3236
3237 static const char **names_ymm;
3238 static const char *intel_names_ymm[] = {
3239   "ymm0", "ymm1", "ymm2", "ymm3",
3240   "ymm4", "ymm5", "ymm6", "ymm7",
3241   "ymm8", "ymm9", "ymm10", "ymm11",
3242   "ymm12", "ymm13", "ymm14", "ymm15",
3243   "ymm16", "ymm17", "ymm18", "ymm19",
3244   "ymm20", "ymm21", "ymm22", "ymm23",
3245   "ymm24", "ymm25", "ymm26", "ymm27",
3246   "ymm28", "ymm29", "ymm30", "ymm31"
3247 };
3248 static const char *att_names_ymm[] = {
3249   "%ymm0", "%ymm1", "%ymm2", "%ymm3",
3250   "%ymm4", "%ymm5", "%ymm6", "%ymm7",
3251   "%ymm8", "%ymm9", "%ymm10", "%ymm11",
3252   "%ymm12", "%ymm13", "%ymm14", "%ymm15",
3253   "%ymm16", "%ymm17", "%ymm18", "%ymm19",
3254   "%ymm20", "%ymm21", "%ymm22", "%ymm23",
3255   "%ymm24", "%ymm25", "%ymm26", "%ymm27",
3256   "%ymm28", "%ymm29", "%ymm30", "%ymm31"
3257 };
3258
3259 static const char **names_zmm;
3260 static const char *intel_names_zmm[] = {
3261   "zmm0", "zmm1", "zmm2", "zmm3",
3262   "zmm4", "zmm5", "zmm6", "zmm7",
3263   "zmm8", "zmm9", "zmm10", "zmm11",
3264   "zmm12", "zmm13", "zmm14", "zmm15",
3265   "zmm16", "zmm17", "zmm18", "zmm19",
3266   "zmm20", "zmm21", "zmm22", "zmm23",
3267   "zmm24", "zmm25", "zmm26", "zmm27",
3268   "zmm28", "zmm29", "zmm30", "zmm31"
3269 };
3270 static const char *att_names_zmm[] = {
3271   "%zmm0", "%zmm1", "%zmm2", "%zmm3",
3272   "%zmm4", "%zmm5", "%zmm6", "%zmm7",
3273   "%zmm8", "%zmm9", "%zmm10", "%zmm11",
3274   "%zmm12", "%zmm13", "%zmm14", "%zmm15",
3275   "%zmm16", "%zmm17", "%zmm18", "%zmm19",
3276   "%zmm20", "%zmm21", "%zmm22", "%zmm23",
3277   "%zmm24", "%zmm25", "%zmm26", "%zmm27",
3278   "%zmm28", "%zmm29", "%zmm30", "%zmm31"
3279 };
3280
3281 static const char **names_mask;
3282 static const char *intel_names_mask[] = {
3283   "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7"
3284 };
3285 static const char *att_names_mask[] = {
3286   "%k0", "%k1", "%k2", "%k3", "%k4", "%k5", "%k6", "%k7"
3287 };
3288
3289 static const char *names_rounding[] =
3290 {
3291   "{rn-sae}",
3292   "{rd-sae}",
3293   "{ru-sae}",
3294   "{rz-sae}"
3295 };
3296
3297 static const struct dis386 reg_table[][8] = {
3298   /* REG_80 */
3299   {
3300     { "addA",   { Ebh1, Ib }, 0 },
3301     { "orA",    { Ebh1, Ib }, 0 },
3302     { "adcA",   { Ebh1, Ib }, 0 },
3303     { "sbbA",   { Ebh1, Ib }, 0 },
3304     { "andA",   { Ebh1, Ib }, 0 },
3305     { "subA",   { Ebh1, Ib }, 0 },
3306     { "xorA",   { Ebh1, Ib }, 0 },
3307     { "cmpA",   { Eb, Ib }, 0 },
3308   },
3309   /* REG_81 */
3310   {
3311     { "addQ",   { Evh1, Iv }, 0 },
3312     { "orQ",    { Evh1, Iv }, 0 },
3313     { "adcQ",   { Evh1, Iv }, 0 },
3314     { "sbbQ",   { Evh1, Iv }, 0 },
3315     { "andQ",   { Evh1, Iv }, 0 },
3316     { "subQ",   { Evh1, Iv }, 0 },
3317     { "xorQ",   { Evh1, Iv }, 0 },
3318     { "cmpQ",   { Ev, Iv }, 0 },
3319   },
3320   /* REG_82 */
3321   {
3322     { "addQ",   { Evh1, sIb }, 0 },
3323     { "orQ",    { Evh1, sIb }, 0 },
3324     { "adcQ",   { Evh1, sIb }, 0 },
3325     { "sbbQ",   { Evh1, sIb }, 0 },
3326     { "andQ",   { Evh1, sIb }, 0 },
3327     { "subQ",   { Evh1, sIb }, 0 },
3328     { "xorQ",   { Evh1, sIb }, 0 },
3329     { "cmpQ",   { Ev, sIb }, 0 },
3330   },
3331   /* REG_8F */
3332   {
3333     { "popU",   { stackEv }, 0 },
3334     { XOP_8F_TABLE (XOP_09) },
3335     { Bad_Opcode },
3336     { Bad_Opcode },
3337     { Bad_Opcode },
3338     { XOP_8F_TABLE (XOP_09) },
3339   },
3340   /* REG_C0 */
3341   {
3342     { "rolA",   { Eb, Ib }, 0 },
3343     { "rorA",   { Eb, Ib }, 0 },
3344     { "rclA",   { Eb, Ib }, 0 },
3345     { "rcrA",   { Eb, Ib }, 0 },
3346     { "shlA",   { Eb, Ib }, 0 },
3347     { "shrA",   { Eb, Ib }, 0 },
3348     { Bad_Opcode },
3349     { "sarA",   { Eb, Ib }, 0 },
3350   },
3351   /* REG_C1 */
3352   {
3353     { "rolQ",   { Ev, Ib }, 0 },
3354     { "rorQ",   { Ev, Ib }, 0 },
3355     { "rclQ",   { Ev, Ib }, 0 },
3356     { "rcrQ",   { Ev, Ib }, 0 },
3357     { "shlQ",   { Ev, Ib }, 0 },
3358     { "shrQ",   { Ev, Ib }, 0 },
3359     { Bad_Opcode },
3360     { "sarQ",   { Ev, Ib }, 0 },
3361   },
3362   /* REG_C6 */
3363   {
3364     { "movA",   { Ebh3, Ib }, 0 },
3365     { Bad_Opcode },
3366     { Bad_Opcode },
3367     { Bad_Opcode },
3368     { Bad_Opcode },
3369     { Bad_Opcode },
3370     { Bad_Opcode },
3371     { MOD_TABLE (MOD_C6_REG_7) },
3372   },
3373   /* REG_C7 */
3374   {
3375     { "movQ",   { Evh3, Iv }, 0 },
3376     { Bad_Opcode },
3377     { Bad_Opcode },
3378     { Bad_Opcode },
3379     { Bad_Opcode },
3380     { Bad_Opcode },
3381     { Bad_Opcode },
3382     { MOD_TABLE (MOD_C7_REG_7) },
3383   },
3384   /* REG_D0 */
3385   {
3386     { "rolA",   { Eb, I1 }, 0 },
3387     { "rorA",   { Eb, I1 }, 0 },
3388     { "rclA",   { Eb, I1 }, 0 },
3389     { "rcrA",   { Eb, I1 }, 0 },
3390     { "shlA",   { Eb, I1 }, 0 },
3391     { "shrA",   { Eb, I1 }, 0 },
3392     { Bad_Opcode },
3393     { "sarA",   { Eb, I1 }, 0 },
3394   },
3395   /* REG_D1 */
3396   {
3397     { "rolQ",   { Ev, I1 }, 0 },
3398     { "rorQ",   { Ev, I1 }, 0 },
3399     { "rclQ",   { Ev, I1 }, 0 },
3400     { "rcrQ",   { Ev, I1 }, 0 },
3401     { "shlQ",   { Ev, I1 }, 0 },
3402     { "shrQ",   { Ev, I1 }, 0 },
3403     { Bad_Opcode },
3404     { "sarQ",   { Ev, I1 }, 0 },
3405   },
3406   /* REG_D2 */
3407   {
3408     { "rolA",   { Eb, CL }, 0 },
3409     { "rorA",   { Eb, CL }, 0 },
3410     { "rclA",   { Eb, CL }, 0 },
3411     { "rcrA",   { Eb, CL }, 0 },
3412     { "shlA",   { Eb, CL }, 0 },
3413     { "shrA",   { Eb, CL }, 0 },
3414     { Bad_Opcode },
3415     { "sarA",   { Eb, CL }, 0 },
3416   },
3417   /* REG_D3 */
3418   {
3419     { "rolQ",   { Ev, CL }, 0 },
3420     { "rorQ",   { Ev, CL }, 0 },
3421     { "rclQ",   { Ev, CL }, 0 },
3422     { "rcrQ",   { Ev, CL }, 0 },
3423     { "shlQ",   { Ev, CL }, 0 },
3424     { "shrQ",   { Ev, CL }, 0 },
3425     { Bad_Opcode },
3426     { "sarQ",   { Ev, CL }, 0 },
3427   },
3428   /* REG_F6 */
3429   {
3430     { "testA",  { Eb, Ib }, 0 },
3431     { Bad_Opcode },
3432     { "notA",   { Ebh1 }, 0 },
3433     { "negA",   { Ebh1 }, 0 },
3434     { "mulA",   { Eb }, 0 },    /* Don't print the implicit %al register,  */
3435     { "imulA",  { Eb }, 0 },    /* to distinguish these opcodes from other */
3436     { "divA",   { Eb }, 0 },    /* mul/imul opcodes.  Do the same for div  */
3437     { "idivA",  { Eb }, 0 },    /* and idiv for consistency.               */
3438   },
3439   /* REG_F7 */
3440   {
3441     { "testQ",  { Ev, Iv }, 0 },
3442     { Bad_Opcode },
3443     { "notQ",   { Evh1 }, 0 },
3444     { "negQ",   { Evh1 }, 0 },
3445     { "mulQ",   { Ev }, 0 },    /* Don't print the implicit register.  */
3446     { "imulQ",  { Ev }, 0 },
3447     { "divQ",   { Ev }, 0 },
3448     { "idivQ",  { Ev }, 0 },
3449   },
3450   /* REG_FE */
3451   {
3452     { "incA",   { Ebh1 }, 0 },
3453     { "decA",   { Ebh1 }, 0 },
3454   },
3455   /* REG_FF */
3456   {
3457     { "incQ",   { Evh1 }, 0 },
3458     { "decQ",   { Evh1 }, 0 },
3459     { "call{T|}", { indirEv, BND }, 0 },
3460     { MOD_TABLE (MOD_FF_REG_3) },
3461     { "jmp{T|}", { indirEv, BND }, 0 },
3462     { MOD_TABLE (MOD_FF_REG_5) },
3463     { "pushU",  { stackEv }, 0 },
3464     { Bad_Opcode },
3465   },
3466   /* REG_0F00 */
3467   {
3468     { "sldtD",  { Sv }, 0 },
3469     { "strD",   { Sv }, 0 },
3470     { "lldt",   { Ew }, 0 },
3471     { "ltr",    { Ew }, 0 },
3472     { "verr",   { Ew }, 0 },
3473     { "verw",   { Ew }, 0 },
3474     { Bad_Opcode },
3475     { Bad_Opcode },
3476   },
3477   /* REG_0F01 */
3478   {
3479     { MOD_TABLE (MOD_0F01_REG_0) },
3480     { MOD_TABLE (MOD_0F01_REG_1) },
3481     { MOD_TABLE (MOD_0F01_REG_2) },
3482     { MOD_TABLE (MOD_0F01_REG_3) },
3483     { "smswD",  { Sv }, 0 },
3484     { Bad_Opcode },
3485     { "lmsw",   { Ew }, 0 },
3486     { MOD_TABLE (MOD_0F01_REG_7) },
3487   },
3488   /* REG_0F0D */
3489   {
3490     { "prefetch",       { Mb }, 0 },
3491     { "prefetchw",      { Mb }, 0 },
3492     { "prefetchwt1",    { Mb }, 0 },
3493     { "prefetch",       { Mb }, 0 },
3494     { "prefetch",       { Mb }, 0 },
3495     { "prefetch",       { Mb }, 0 },
3496     { "prefetch",       { Mb }, 0 },
3497     { "prefetch",       { Mb }, 0 },
3498   },
3499   /* REG_0F18 */
3500   {
3501     { MOD_TABLE (MOD_0F18_REG_0) },
3502     { MOD_TABLE (MOD_0F18_REG_1) },
3503     { MOD_TABLE (MOD_0F18_REG_2) },
3504     { MOD_TABLE (MOD_0F18_REG_3) },
3505     { MOD_TABLE (MOD_0F18_REG_4) },
3506     { MOD_TABLE (MOD_0F18_REG_5) },
3507     { MOD_TABLE (MOD_0F18_REG_6) },
3508     { MOD_TABLE (MOD_0F18_REG_7) },
3509   },
3510   /* REG_0F71 */
3511   {
3512     { Bad_Opcode },
3513     { Bad_Opcode },
3514     { MOD_TABLE (MOD_0F71_REG_2) },
3515     { Bad_Opcode },
3516     { MOD_TABLE (MOD_0F71_REG_4) },
3517     { Bad_Opcode },
3518     { MOD_TABLE (MOD_0F71_REG_6) },
3519   },
3520   /* REG_0F72 */
3521   {
3522     { Bad_Opcode },
3523     { Bad_Opcode },
3524     { MOD_TABLE (MOD_0F72_REG_2) },
3525     { Bad_Opcode },
3526     { MOD_TABLE (MOD_0F72_REG_4) },
3527     { Bad_Opcode },
3528     { MOD_TABLE (MOD_0F72_REG_6) },
3529   },
3530   /* REG_0F73 */
3531   {
3532     { Bad_Opcode },
3533     { Bad_Opcode },
3534     { MOD_TABLE (MOD_0F73_REG_2) },
3535     { MOD_TABLE (MOD_0F73_REG_3) },
3536     { Bad_Opcode },
3537     { Bad_Opcode },
3538     { MOD_TABLE (MOD_0F73_REG_6) },
3539     { MOD_TABLE (MOD_0F73_REG_7) },
3540   },
3541   /* REG_0FA6 */
3542   {
3543     { "montmul",        { { OP_0f07, 0 } }, 0 },
3544     { "xsha1",          { { OP_0f07, 0 } }, 0 },
3545     { "xsha256",        { { OP_0f07, 0 } }, 0 },
3546   },
3547   /* REG_0FA7 */
3548   {
3549     { "xstore-rng",     { { OP_0f07, 0 } }, 0 },
3550     { "xcrypt-ecb",     { { OP_0f07, 0 } }, 0 },
3551     { "xcrypt-cbc",     { { OP_0f07, 0 } }, 0 },
3552     { "xcrypt-ctr",     { { OP_0f07, 0 } }, 0 },
3553     { "xcrypt-cfb",     { { OP_0f07, 0 } }, 0 },
3554     { "xcrypt-ofb",     { { OP_0f07, 0 } }, 0 },
3555   },
3556   /* REG_0FAE */
3557   {
3558     { MOD_TABLE (MOD_0FAE_REG_0) },
3559     { MOD_TABLE (MOD_0FAE_REG_1) },
3560     { MOD_TABLE (MOD_0FAE_REG_2) },
3561     { MOD_TABLE (MOD_0FAE_REG_3) },
3562     { MOD_TABLE (MOD_0FAE_REG_4) },
3563     { MOD_TABLE (MOD_0FAE_REG_5) },
3564     { MOD_TABLE (MOD_0FAE_REG_6) },
3565     { MOD_TABLE (MOD_0FAE_REG_7) },
3566   },
3567   /* REG_0FBA */
3568   {
3569     { Bad_Opcode },
3570     { Bad_Opcode },
3571     { Bad_Opcode },
3572     { Bad_Opcode },
3573     { "btQ",    { Ev, Ib }, 0 },
3574     { "btsQ",   { Evh1, Ib }, 0 },
3575     { "btrQ",   { Evh1, Ib }, 0 },
3576     { "btcQ",   { Evh1, Ib }, 0 },
3577   },
3578   /* REG_0FC7 */
3579   {
3580     { Bad_Opcode },
3581     { "cmpxchg8b", { { CMPXCHG8B_Fixup, q_mode } }, 0 },
3582     { Bad_Opcode },
3583     { MOD_TABLE (MOD_0FC7_REG_3) },
3584     { MOD_TABLE (MOD_0FC7_REG_4) },
3585     { MOD_TABLE (MOD_0FC7_REG_5) },
3586     { MOD_TABLE (MOD_0FC7_REG_6) },
3587     { MOD_TABLE (MOD_0FC7_REG_7) },
3588   },
3589   /* REG_VEX_0F71 */
3590   {
3591     { Bad_Opcode },
3592     { Bad_Opcode },
3593     { MOD_TABLE (MOD_VEX_0F71_REG_2) },
3594     { Bad_Opcode },
3595     { MOD_TABLE (MOD_VEX_0F71_REG_4) },
3596     { Bad_Opcode },
3597     { MOD_TABLE (MOD_VEX_0F71_REG_6) },
3598   },
3599   /* REG_VEX_0F72 */
3600   {
3601     { Bad_Opcode },
3602     { Bad_Opcode },
3603     { MOD_TABLE (MOD_VEX_0F72_REG_2) },
3604     { Bad_Opcode },
3605     { MOD_TABLE (MOD_VEX_0F72_REG_4) },
3606     { Bad_Opcode },
3607     { MOD_TABLE (MOD_VEX_0F72_REG_6) },
3608   },
3609   /* REG_VEX_0F73 */
3610   {
3611     { Bad_Opcode },
3612     { Bad_Opcode },
3613     { MOD_TABLE (MOD_VEX_0F73_REG_2) },
3614     { MOD_TABLE (MOD_VEX_0F73_REG_3) },
3615     { Bad_Opcode },
3616     { Bad_Opcode },
3617     { MOD_TABLE (MOD_VEX_0F73_REG_6) },
3618     { MOD_TABLE (MOD_VEX_0F73_REG_7) },
3619   },
3620   /* REG_VEX_0FAE */
3621   {
3622     { Bad_Opcode },
3623     { Bad_Opcode },
3624     { MOD_TABLE (MOD_VEX_0FAE_REG_2) },
3625     { MOD_TABLE (MOD_VEX_0FAE_REG_3) },
3626   },
3627   /* REG_VEX_0F38F3 */
3628   {
3629     { Bad_Opcode },
3630     { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_1) },
3631     { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_2) },
3632     { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_3) },
3633   },
3634   /* REG_XOP_LWPCB */
3635   {
3636     { "llwpcb", { { OP_LWPCB_E, 0 } }, 0 },
3637     { "slwpcb", { { OP_LWPCB_E, 0 } }, 0 },
3638   },
3639   /* REG_XOP_LWP */
3640   {
3641     { "lwpins", { { OP_LWP_E, 0 }, Ed, Iq }, 0 },
3642     { "lwpval", { { OP_LWP_E, 0 }, Ed, Iq }, 0 },
3643   },
3644   /* REG_XOP_TBM_01 */
3645   {
3646     { Bad_Opcode },
3647     { "blcfill",        { { OP_LWP_E, 0 }, Ev }, 0 },
3648     { "blsfill",        { { OP_LWP_E, 0 }, Ev }, 0 },
3649     { "blcs",   { { OP_LWP_E, 0 }, Ev }, 0 },
3650     { "tzmsk",  { { OP_LWP_E, 0 }, Ev }, 0 },
3651     { "blcic",  { { OP_LWP_E, 0 }, Ev }, 0 },
3652     { "blsic",  { { OP_LWP_E, 0 }, Ev }, 0 },
3653     { "t1mskc", { { OP_LWP_E, 0 }, Ev }, 0 },
3654   },
3655   /* REG_XOP_TBM_02 */
3656   {
3657     { Bad_Opcode },
3658     { "blcmsk", { { OP_LWP_E, 0 }, Ev }, 0 },
3659     { Bad_Opcode },
3660     { Bad_Opcode },
3661     { Bad_Opcode },
3662     { Bad_Opcode },
3663     { "blci",   { { OP_LWP_E, 0 }, Ev }, 0 },
3664   },
3665 #define NEED_REG_TABLE
3666 #include "i386-dis-evex.h"
3667 #undef NEED_REG_TABLE
3668 };
3669
3670 static const struct dis386 prefix_table[][4] = {
3671   /* PREFIX_90 */
3672   {
3673     { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } }, 0 },
3674     { "pause", { XX }, 0 },
3675     { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } }, 0 },
3676   },
3677
3678   /* PREFIX_0F10 */
3679   {
3680     { "movups", { XM, EXx }, PREFIX_MANDATORY },
3681     { "movss",  { XM, EXd }, PREFIX_MANDATORY },
3682     { "movupd", { XM, EXx }, PREFIX_MANDATORY },
3683     { "movsd",  { XM, EXq }, PREFIX_MANDATORY },
3684   },
3685
3686   /* PREFIX_0F11 */
3687   {
3688     { "movups", { EXxS, XM }, PREFIX_MANDATORY },
3689     { "movss",  { EXdS, XM }, PREFIX_MANDATORY },
3690     { "movupd", { EXxS, XM }, PREFIX_MANDATORY },
3691     { "movsd",  { EXqS, XM }, PREFIX_MANDATORY },
3692   },
3693
3694   /* PREFIX_0F12 */
3695   {
3696     { MOD_TABLE (MOD_0F12_PREFIX_0) },
3697     { "movsldup", { XM, EXx }, PREFIX_MANDATORY },
3698     { "movlpd", { XM, EXq }, PREFIX_MANDATORY },
3699     { "movddup", { XM, EXq }, PREFIX_MANDATORY },
3700   },
3701
3702   /* PREFIX_0F16 */
3703   {
3704     { MOD_TABLE (MOD_0F16_PREFIX_0) },
3705     { "movshdup", { XM, EXx }, PREFIX_MANDATORY },
3706     { "movhpd", { XM, EXq }, PREFIX_MANDATORY },
3707   },
3708
3709   /* PREFIX_0F1A */
3710   {
3711     { MOD_TABLE (MOD_0F1A_PREFIX_0) },
3712     { "bndcl",  { Gbnd, Ev_bnd }, 0 },
3713     { "bndmov", { Gbnd, Ebnd }, 0 },
3714     { "bndcu",  { Gbnd, Ev_bnd }, 0 },
3715   },
3716
3717   /* PREFIX_0F1B */
3718   {
3719     { MOD_TABLE (MOD_0F1B_PREFIX_0) },
3720     { MOD_TABLE (MOD_0F1B_PREFIX_1) },
3721     { "bndmov", { Ebnd, Gbnd }, 0 },
3722     { "bndcn",  { Gbnd, Ev_bnd }, 0 },
3723   },
3724
3725   /* PREFIX_0F2A */
3726   {
3727     { "cvtpi2ps", { XM, EMCq }, PREFIX_MANDATORY },
3728     { "cvtsi2ss%LQ", { XM, Ev }, PREFIX_MANDATORY },
3729     { "cvtpi2pd", { XM, EMCq }, PREFIX_MANDATORY },
3730     { "cvtsi2sd%LQ", { XM, Ev }, 0 },
3731   },
3732
3733   /* PREFIX_0F2B */
3734   {
3735     { MOD_TABLE (MOD_0F2B_PREFIX_0) },
3736     { MOD_TABLE (MOD_0F2B_PREFIX_1) },
3737     { MOD_TABLE (MOD_0F2B_PREFIX_2) },
3738     { MOD_TABLE (MOD_0F2B_PREFIX_3) },
3739   },
3740
3741   /* PREFIX_0F2C */
3742   {
3743     { "cvttps2pi", { MXC, EXq }, PREFIX_MANDATORY },
3744     { "cvttss2siY", { Gv, EXd }, PREFIX_MANDATORY },
3745     { "cvttpd2pi", { MXC, EXx }, PREFIX_MANDATORY },
3746     { "cvttsd2siY", { Gv, EXq }, PREFIX_MANDATORY },
3747   },
3748
3749   /* PREFIX_0F2D */
3750   {
3751     { "cvtps2pi", { MXC, EXq }, PREFIX_MANDATORY },
3752     { "cvtss2siY", { Gv, EXd }, PREFIX_MANDATORY },
3753     { "cvtpd2pi", { MXC, EXx }, PREFIX_MANDATORY },
3754     { "cvtsd2siY", { Gv, EXq }, PREFIX_MANDATORY },
3755   },
3756
3757   /* PREFIX_0F2E */
3758   {
3759     { "ucomiss",{ XM, EXd }, 0 },
3760     { Bad_Opcode },
3761     { "ucomisd",{ XM, EXq }, 0 },
3762   },
3763
3764   /* PREFIX_0F2F */
3765   {
3766     { "comiss", { XM, EXd }, 0 },
3767     { Bad_Opcode },
3768     { "comisd", { XM, EXq }, 0 },
3769   },
3770
3771   /* PREFIX_0F51 */
3772   {
3773     { "sqrtps", { XM, EXx }, PREFIX_MANDATORY },
3774     { "sqrtss", { XM, EXd }, PREFIX_MANDATORY },
3775     { "sqrtpd", { XM, EXx }, PREFIX_MANDATORY },
3776     { "sqrtsd", { XM, EXq }, PREFIX_MANDATORY },
3777   },
3778
3779   /* PREFIX_0F52 */
3780   {
3781     { "rsqrtps",{ XM, EXx }, PREFIX_MANDATORY },
3782     { "rsqrtss",{ XM, EXd }, PREFIX_MANDATORY },
3783   },
3784
3785   /* PREFIX_0F53 */
3786   {
3787     { "rcpps",  { XM, EXx }, PREFIX_MANDATORY },
3788     { "rcpss",  { XM, EXd }, PREFIX_MANDATORY },
3789   },
3790
3791   /* PREFIX_0F58 */
3792   {
3793     { "addps", { XM, EXx }, PREFIX_MANDATORY },
3794     { "addss", { XM, EXd }, PREFIX_MANDATORY },
3795     { "addpd", { XM, EXx }, PREFIX_MANDATORY },
3796     { "addsd", { XM, EXq }, PREFIX_MANDATORY },
3797   },
3798
3799   /* PREFIX_0F59 */
3800   {
3801     { "mulps",  { XM, EXx }, PREFIX_MANDATORY },
3802     { "mulss",  { XM, EXd }, PREFIX_MANDATORY },
3803     { "mulpd",  { XM, EXx }, PREFIX_MANDATORY },
3804     { "mulsd",  { XM, EXq }, PREFIX_MANDATORY },
3805   },
3806
3807   /* PREFIX_0F5A */
3808   {
3809     { "cvtps2pd", { XM, EXq }, PREFIX_MANDATORY },
3810     { "cvtss2sd", { XM, EXd }, PREFIX_MANDATORY },
3811     { "cvtpd2ps", { XM, EXx }, PREFIX_MANDATORY },
3812     { "cvtsd2ss", { XM, EXq }, PREFIX_MANDATORY },
3813   },
3814
3815   /* PREFIX_0F5B */
3816   {
3817     { "cvtdq2ps", { XM, EXx }, PREFIX_MANDATORY },
3818     { "cvttps2dq", { XM, EXx }, PREFIX_MANDATORY },
3819     { "cvtps2dq", { XM, EXx }, PREFIX_MANDATORY },
3820   },
3821
3822   /* PREFIX_0F5C */
3823   {
3824     { "subps",  { XM, EXx }, PREFIX_MANDATORY },
3825     { "subss",  { XM, EXd }, PREFIX_MANDATORY },
3826     { "subpd",  { XM, EXx }, PREFIX_MANDATORY },
3827     { "subsd",  { XM, EXq }, PREFIX_MANDATORY },
3828   },
3829
3830   /* PREFIX_0F5D */
3831   {
3832     { "minps",  { XM, EXx }, PREFIX_MANDATORY },
3833     { "minss",  { XM, EXd }, PREFIX_MANDATORY },
3834     { "minpd",  { XM, EXx }, PREFIX_MANDATORY },
3835     { "minsd",  { XM, EXq }, PREFIX_MANDATORY },
3836   },
3837
3838   /* PREFIX_0F5E */
3839   {
3840     { "divps",  { XM, EXx }, PREFIX_MANDATORY },
3841     { "divss",  { XM, EXd }, PREFIX_MANDATORY },
3842     { "divpd",  { XM, EXx }, PREFIX_MANDATORY },
3843     { "divsd",  { XM, EXq }, PREFIX_MANDATORY },
3844   },
3845
3846   /* PREFIX_0F5F */
3847   {
3848     { "maxps",  { XM, EXx }, PREFIX_MANDATORY },
3849     { "maxss",  { XM, EXd }, PREFIX_MANDATORY },
3850     { "maxpd",  { XM, EXx }, PREFIX_MANDATORY },
3851     { "maxsd",  { XM, EXq }, PREFIX_MANDATORY },
3852   },
3853
3854   /* PREFIX_0F60 */
3855   {
3856     { "punpcklbw",{ MX, EMd }, PREFIX_MANDATORY },
3857     { Bad_Opcode },
3858     { "punpcklbw",{ MX, EMx }, PREFIX_MANDATORY },
3859   },
3860
3861   /* PREFIX_0F61 */
3862   {
3863     { "punpcklwd",{ MX, EMd }, PREFIX_MANDATORY },
3864     { Bad_Opcode },
3865     { "punpcklwd",{ MX, EMx }, PREFIX_MANDATORY },
3866   },
3867
3868   /* PREFIX_0F62 */
3869   {
3870     { "punpckldq",{ MX, EMd }, PREFIX_MANDATORY },
3871     { Bad_Opcode },
3872     { "punpckldq",{ MX, EMx }, PREFIX_MANDATORY },
3873   },
3874
3875   /* PREFIX_0F6C */
3876   {
3877     { Bad_Opcode },
3878     { Bad_Opcode },
3879     { "punpcklqdq", { XM, EXx }, PREFIX_MANDATORY },
3880   },
3881
3882   /* PREFIX_0F6D */
3883   {
3884     { Bad_Opcode },
3885     { Bad_Opcode },
3886     { "punpckhqdq", { XM, EXx }, PREFIX_MANDATORY },
3887   },
3888
3889   /* PREFIX_0F6F */
3890   {
3891     { "movq",   { MX, EM }, PREFIX_MANDATORY },
3892     { "movdqu", { XM, EXx }, PREFIX_MANDATORY },
3893     { "movdqa", { XM, EXx }, PREFIX_MANDATORY },
3894   },
3895
3896   /* PREFIX_0F70 */
3897   {
3898     { "pshufw", { MX, EM, Ib }, PREFIX_MANDATORY },
3899     { "pshufhw",{ XM, EXx, Ib }, PREFIX_MANDATORY },
3900     { "pshufd", { XM, EXx, Ib }, PREFIX_MANDATORY },
3901     { "pshuflw",{ XM, EXx, Ib }, PREFIX_MANDATORY },
3902   },
3903
3904   /* PREFIX_0F73_REG_3 */
3905   {
3906     { Bad_Opcode },
3907     { Bad_Opcode },
3908     { "psrldq", { XS, Ib }, 0 },
3909   },
3910
3911   /* PREFIX_0F73_REG_7 */
3912   {
3913     { Bad_Opcode },
3914     { Bad_Opcode },
3915     { "pslldq", { XS, Ib }, 0 },
3916   },
3917
3918   /* PREFIX_0F78 */
3919   {
3920     {"vmread",  { Em, Gm }, 0 },
3921     { Bad_Opcode },
3922     {"extrq",   { XS, Ib, Ib }, 0 },
3923     {"insertq", { XM, XS, Ib, Ib }, 0 },
3924   },
3925
3926   /* PREFIX_0F79 */
3927   {
3928     {"vmwrite", { Gm, Em }, 0 },
3929     { Bad_Opcode },
3930     {"extrq",   { XM, XS }, 0 },
3931     {"insertq", { XM, XS }, 0 },
3932   },
3933
3934   /* PREFIX_0F7C */
3935   {
3936     { Bad_Opcode },
3937     { Bad_Opcode },
3938     { "haddpd", { XM, EXx }, PREFIX_MANDATORY },
3939     { "haddps", { XM, EXx }, PREFIX_MANDATORY },
3940   },
3941
3942   /* PREFIX_0F7D */
3943   {
3944     { Bad_Opcode },
3945     { Bad_Opcode },
3946     { "hsubpd", { XM, EXx }, PREFIX_MANDATORY },
3947     { "hsubps", { XM, EXx }, PREFIX_MANDATORY },
3948   },
3949
3950   /* PREFIX_0F7E */
3951   {
3952     { "movK",   { Edq, MX }, PREFIX_MANDATORY },
3953     { "movq",   { XM, EXq }, PREFIX_MANDATORY },
3954     { "movK",   { Edq, XM }, PREFIX_MANDATORY },
3955   },
3956
3957   /* PREFIX_0F7F */
3958   {
3959     { "movq",   { EMS, MX }, PREFIX_MANDATORY },
3960     { "movdqu", { EXxS, XM }, PREFIX_MANDATORY },
3961     { "movdqa", { EXxS, XM }, PREFIX_MANDATORY },
3962   },
3963
3964   /* PREFIX_0FAE_REG_0 */
3965   {
3966     { Bad_Opcode },
3967     { "rdfsbase", { Ev }, 0 },
3968   },
3969
3970   /* PREFIX_0FAE_REG_1 */
3971   {
3972     { Bad_Opcode },
3973     { "rdgsbase", { Ev }, 0 },
3974   },
3975
3976   /* PREFIX_0FAE_REG_2 */
3977   {
3978     { Bad_Opcode },
3979     { "wrfsbase", { Ev }, 0 },
3980   },
3981
3982   /* PREFIX_0FAE_REG_3 */
3983   {
3984     { Bad_Opcode },
3985     { "wrgsbase", { Ev }, 0 },
3986   },
3987
3988   /* PREFIX_0FAE_REG_6 */
3989   {
3990     { "xsaveopt",      { FXSAVE }, 0 },
3991     { Bad_Opcode },
3992     { "clwb",   { Mb }, 0 },
3993   },
3994
3995   /* PREFIX_0FAE_REG_7 */
3996   {
3997     { "clflush",        { Mb }, 0 },
3998     { Bad_Opcode },
3999     { "clflushopt",     { Mb }, 0 },
4000   },
4001
4002   /* PREFIX_RM_0_0FAE_REG_7 */
4003   {
4004     { "sfence",         { Skip_MODRM }, 0 },
4005     { Bad_Opcode },
4006     { "pcommit",                { Skip_MODRM }, 0 },
4007   },
4008
4009   /* PREFIX_0FB8 */
4010   {
4011     { Bad_Opcode },
4012     { "popcntS", { Gv, Ev }, 0 },
4013   },
4014
4015   /* PREFIX_0FBC */
4016   {
4017     { "bsfS",   { Gv, Ev }, 0 },
4018     { "tzcntS", { Gv, Ev }, 0 },
4019     { "bsfS",   { Gv, Ev }, 0 },
4020   },
4021
4022   /* PREFIX_0FBD */
4023   {
4024     { "bsrS",   { Gv, Ev }, 0 },
4025     { "lzcntS", { Gv, Ev }, 0 },
4026     { "bsrS",   { Gv, Ev }, 0 },
4027   },
4028
4029   /* PREFIX_0FC2 */
4030   {
4031     { "cmpps",  { XM, EXx, CMP }, PREFIX_MANDATORY },
4032     { "cmpss",  { XM, EXd, CMP }, PREFIX_MANDATORY },
4033     { "cmppd",  { XM, EXx, CMP }, PREFIX_MANDATORY },
4034     { "cmpsd",  { XM, EXq, CMP }, PREFIX_MANDATORY },
4035   },
4036
4037   /* PREFIX_0FC3 */
4038   {
4039     { "movntiS", { Ma, Gv }, PREFIX_MANDATORY },
4040   },
4041
4042   /* PREFIX_0FC7_REG_6 */
4043   {
4044     { "vmptrld",{ Mq }, 0 },
4045     { "vmxon",  { Mq }, 0 },
4046     { "vmclear",{ Mq }, 0 },
4047   },
4048
4049   /* PREFIX_0FD0 */
4050   {
4051     { Bad_Opcode },
4052     { Bad_Opcode },
4053     { "addsubpd", { XM, EXx }, 0 },
4054     { "addsubps", { XM, EXx }, 0 },
4055   },
4056
4057   /* PREFIX_0FD6 */
4058   {
4059     { Bad_Opcode },
4060     { "movq2dq",{ XM, MS }, 0 },
4061     { "movq",   { EXqS, XM }, 0 },
4062     { "movdq2q",{ MX, XS }, 0 },
4063   },
4064
4065   /* PREFIX_0FE6 */
4066   {
4067     { Bad_Opcode },
4068     { "cvtdq2pd", { XM, EXq }, PREFIX_MANDATORY },
4069     { "cvttpd2dq", { XM, EXx }, PREFIX_MANDATORY },
4070     { "cvtpd2dq", { XM, EXx }, PREFIX_MANDATORY },
4071   },
4072
4073   /* PREFIX_0FE7 */
4074   {
4075     { "movntq", { Mq, MX }, PREFIX_MANDATORY },
4076     { Bad_Opcode },
4077     { MOD_TABLE (MOD_0FE7_PREFIX_2) },
4078   },
4079
4080   /* PREFIX_0FF0 */
4081   {
4082     { Bad_Opcode },
4083     { Bad_Opcode },
4084     { Bad_Opcode },
4085     { MOD_TABLE (MOD_0FF0_PREFIX_3) },
4086   },
4087
4088   /* PREFIX_0FF7 */
4089   {
4090     { "maskmovq", { MX, MS }, PREFIX_MANDATORY },
4091     { Bad_Opcode },
4092     { "maskmovdqu", { XM, XS }, PREFIX_MANDATORY },
4093   },
4094
4095   /* PREFIX_0F3810 */
4096   {
4097     { Bad_Opcode },
4098     { Bad_Opcode },
4099     { "pblendvb", { XM, EXx, XMM0 }, PREFIX_MANDATORY },
4100   },
4101
4102   /* PREFIX_0F3814 */
4103   {
4104     { Bad_Opcode },
4105     { Bad_Opcode },
4106     { "blendvps", { XM, EXx, XMM0 }, PREFIX_MANDATORY },
4107   },
4108
4109   /* PREFIX_0F3815 */
4110   {
4111     { Bad_Opcode },
4112     { Bad_Opcode },
4113     { "blendvpd", { XM, EXx, XMM0 }, PREFIX_MANDATORY },
4114   },
4115
4116   /* PREFIX_0F3817 */
4117   {
4118     { Bad_Opcode },
4119     { Bad_Opcode },
4120     { "ptest",  { XM, EXx }, PREFIX_MANDATORY },
4121   },
4122
4123   /* PREFIX_0F3820 */
4124   {
4125     { Bad_Opcode },
4126     { Bad_Opcode },
4127     { "pmovsxbw", { XM, EXq }, PREFIX_MANDATORY },
4128   },
4129
4130   /* PREFIX_0F3821 */
4131   {
4132     { Bad_Opcode },
4133     { Bad_Opcode },
4134     { "pmovsxbd", { XM, EXd }, PREFIX_MANDATORY },
4135   },
4136
4137   /* PREFIX_0F3822 */
4138   {
4139     { Bad_Opcode },
4140     { Bad_Opcode },
4141     { "pmovsxbq", { XM, EXw }, PREFIX_MANDATORY },
4142   },
4143
4144   /* PREFIX_0F3823 */
4145   {
4146     { Bad_Opcode },
4147     { Bad_Opcode },
4148     { "pmovsxwd", { XM, EXq }, PREFIX_MANDATORY },
4149   },
4150
4151   /* PREFIX_0F3824 */
4152   {
4153     { Bad_Opcode },
4154     { Bad_Opcode },
4155     { "pmovsxwq", { XM, EXd }, PREFIX_MANDATORY },
4156   },
4157
4158   /* PREFIX_0F3825 */
4159   {
4160     { Bad_Opcode },
4161     { Bad_Opcode },
4162     { "pmovsxdq", { XM, EXq }, PREFIX_MANDATORY },
4163   },
4164
4165   /* PREFIX_0F3828 */
4166   {
4167     { Bad_Opcode },
4168     { Bad_Opcode },
4169     { "pmuldq", { XM, EXx }, PREFIX_MANDATORY },
4170   },
4171
4172   /* PREFIX_0F3829 */
4173   {
4174     { Bad_Opcode },
4175     { Bad_Opcode },
4176     { "pcmpeqq", { XM, EXx }, PREFIX_MANDATORY },
4177   },
4178
4179   /* PREFIX_0F382A */
4180   {
4181     { Bad_Opcode },
4182     { Bad_Opcode },
4183     { MOD_TABLE (MOD_0F382A_PREFIX_2) },
4184   },
4185
4186   /* PREFIX_0F382B */
4187   {
4188     { Bad_Opcode },
4189     { Bad_Opcode },
4190     { "packusdw", { XM, EXx }, PREFIX_MANDATORY },
4191   },
4192
4193   /* PREFIX_0F3830 */
4194   {
4195     { Bad_Opcode },
4196     { Bad_Opcode },
4197     { "pmovzxbw", { XM, EXq }, PREFIX_MANDATORY },
4198   },
4199
4200   /* PREFIX_0F3831 */
4201   {
4202     { Bad_Opcode },
4203     { Bad_Opcode },
4204     { "pmovzxbd", { XM, EXd }, PREFIX_MANDATORY },
4205   },
4206
4207   /* PREFIX_0F3832 */
4208   {
4209     { Bad_Opcode },
4210     { Bad_Opcode },
4211     { "pmovzxbq", { XM, EXw }, PREFIX_MANDATORY },
4212   },
4213
4214   /* PREFIX_0F3833 */
4215   {
4216     { Bad_Opcode },
4217     { Bad_Opcode },
4218     { "pmovzxwd", { XM, EXq }, PREFIX_MANDATORY },
4219   },
4220
4221   /* PREFIX_0F3834 */
4222   {
4223     { Bad_Opcode },
4224     { Bad_Opcode },
4225     { "pmovzxwq", { XM, EXd }, PREFIX_MANDATORY },
4226   },
4227
4228   /* PREFIX_0F3835 */
4229   {
4230     { Bad_Opcode },
4231     { Bad_Opcode },
4232     { "pmovzxdq", { XM, EXq }, PREFIX_MANDATORY },
4233   },
4234
4235   /* PREFIX_0F3837 */
4236   {
4237     { Bad_Opcode },
4238     { Bad_Opcode },
4239     { "pcmpgtq", { XM, EXx }, PREFIX_MANDATORY },
4240   },
4241
4242   /* PREFIX_0F3838 */
4243   {
4244     { Bad_Opcode },
4245     { Bad_Opcode },
4246     { "pminsb", { XM, EXx }, PREFIX_MANDATORY },
4247   },
4248
4249   /* PREFIX_0F3839 */
4250   {
4251     { Bad_Opcode },
4252     { Bad_Opcode },
4253     { "pminsd", { XM, EXx }, PREFIX_MANDATORY },
4254   },
4255
4256   /* PREFIX_0F383A */
4257   {
4258     { Bad_Opcode },
4259     { Bad_Opcode },
4260     { "pminuw", { XM, EXx }, PREFIX_MANDATORY },
4261   },
4262
4263   /* PREFIX_0F383B */
4264   {
4265     { Bad_Opcode },
4266     { Bad_Opcode },
4267     { "pminud", { XM, EXx }, PREFIX_MANDATORY },
4268   },
4269
4270   /* PREFIX_0F383C */
4271   {
4272     { Bad_Opcode },
4273     { Bad_Opcode },
4274     { "pmaxsb", { XM, EXx }, PREFIX_MANDATORY },
4275   },
4276
4277   /* PREFIX_0F383D */
4278   {
4279     { Bad_Opcode },
4280     { Bad_Opcode },
4281     { "pmaxsd", { XM, EXx }, PREFIX_MANDATORY },
4282   },
4283
4284   /* PREFIX_0F383E */
4285   {
4286     { Bad_Opcode },
4287     { Bad_Opcode },
4288     { "pmaxuw", { XM, EXx }, PREFIX_MANDATORY },
4289   },
4290
4291   /* PREFIX_0F383F */
4292   {
4293     { Bad_Opcode },
4294     { Bad_Opcode },
4295     { "pmaxud", { XM, EXx }, PREFIX_MANDATORY },
4296   },
4297
4298   /* PREFIX_0F3840 */
4299   {
4300     { Bad_Opcode },
4301     { Bad_Opcode },
4302     { "pmulld", { XM, EXx }, PREFIX_MANDATORY },
4303   },
4304
4305   /* PREFIX_0F3841 */
4306   {
4307     { Bad_Opcode },
4308     { Bad_Opcode },
4309     { "phminposuw", { XM, EXx }, PREFIX_MANDATORY },
4310   },
4311
4312   /* PREFIX_0F3880 */
4313   {
4314     { Bad_Opcode },
4315     { Bad_Opcode },
4316     { "invept", { Gm, Mo }, PREFIX_MANDATORY },
4317   },
4318
4319   /* PREFIX_0F3881 */
4320   {
4321     { Bad_Opcode },
4322     { Bad_Opcode },
4323     { "invvpid", { Gm, Mo }, PREFIX_MANDATORY },
4324   },
4325
4326   /* PREFIX_0F3882 */
4327   {
4328     { Bad_Opcode },
4329     { Bad_Opcode },
4330     { "invpcid", { Gm, M }, PREFIX_MANDATORY },
4331   },
4332
4333   /* PREFIX_0F38C8 */
4334   {
4335     { "sha1nexte", { XM, EXxmm }, PREFIX_MANDATORY },
4336   },
4337
4338   /* PREFIX_0F38C9 */
4339   {
4340     { "sha1msg1", { XM, EXxmm }, PREFIX_MANDATORY },
4341   },
4342
4343   /* PREFIX_0F38CA */
4344   {
4345     { "sha1msg2", { XM, EXxmm }, PREFIX_MANDATORY },
4346   },
4347
4348   /* PREFIX_0F38CB */
4349   {
4350     { "sha256rnds2", { XM, EXxmm, XMM0 }, PREFIX_MANDATORY },
4351   },
4352
4353   /* PREFIX_0F38CC */
4354   {
4355     { "sha256msg1", { XM, EXxmm }, PREFIX_MANDATORY },
4356   },
4357
4358   /* PREFIX_0F38CD */
4359   {
4360     { "sha256msg2", { XM, EXxmm }, PREFIX_MANDATORY },
4361   },
4362
4363   /* PREFIX_0F38DB */
4364   {
4365     { Bad_Opcode },
4366     { Bad_Opcode },
4367     { "aesimc", { XM, EXx }, PREFIX_MANDATORY },
4368   },
4369
4370   /* PREFIX_0F38DC */
4371   {
4372     { Bad_Opcode },
4373     { Bad_Opcode },
4374     { "aesenc", { XM, EXx }, PREFIX_MANDATORY },
4375   },
4376
4377   /* PREFIX_0F38DD */
4378   {
4379     { Bad_Opcode },
4380     { Bad_Opcode },
4381     { "aesenclast", { XM, EXx }, PREFIX_MANDATORY },
4382   },
4383
4384   /* PREFIX_0F38DE */
4385   {
4386     { Bad_Opcode },
4387     { Bad_Opcode },
4388     { "aesdec", { XM, EXx }, PREFIX_MANDATORY },
4389   },
4390
4391   /* PREFIX_0F38DF */
4392   {
4393     { Bad_Opcode },
4394     { Bad_Opcode },
4395     { "aesdeclast", { XM, EXx }, PREFIX_MANDATORY },
4396   },
4397
4398   /* PREFIX_0F38F0 */
4399   {
4400     { "movbeS", { Gv, { MOVBE_Fixup, v_mode } }, PREFIX_MANDATORY },
4401     { Bad_Opcode },
4402     { "movbeS", { Gv, { MOVBE_Fixup, v_mode } }, PREFIX_MANDATORY },
4403     { "crc32",  { Gdq, { CRC32_Fixup, b_mode } }, PREFIX_MANDATORY },
4404   },
4405
4406   /* PREFIX_0F38F1 */
4407   {
4408     { "movbeS", { { MOVBE_Fixup, v_mode }, Gv }, PREFIX_MANDATORY },
4409     { Bad_Opcode },
4410     { "movbeS", { { MOVBE_Fixup, v_mode }, Gv }, PREFIX_MANDATORY },
4411     { "crc32",  { Gdq, { CRC32_Fixup, v_mode } }, PREFIX_MANDATORY },
4412   },
4413
4414   /* PREFIX_0F38F6 */
4415   {
4416     { Bad_Opcode },
4417     { "adoxS",  { Gdq, Edq}, PREFIX_MANDATORY },
4418     { "adcxS",  { Gdq, Edq}, PREFIX_MANDATORY },
4419     { Bad_Opcode },
4420   },
4421
4422   /* PREFIX_0F3A08 */
4423   {
4424     { Bad_Opcode },
4425     { Bad_Opcode },
4426     { "roundps", { XM, EXx, Ib }, PREFIX_MANDATORY },
4427   },
4428
4429   /* PREFIX_0F3A09 */
4430   {
4431     { Bad_Opcode },
4432     { Bad_Opcode },
4433     { "roundpd", { XM, EXx, Ib }, PREFIX_MANDATORY },
4434   },
4435
4436   /* PREFIX_0F3A0A */
4437   {
4438     { Bad_Opcode },
4439     { Bad_Opcode },
4440     { "roundss", { XM, EXd, Ib }, PREFIX_MANDATORY },
4441   },
4442
4443   /* PREFIX_0F3A0B */
4444   {
4445     { Bad_Opcode },
4446     { Bad_Opcode },
4447     { "roundsd", { XM, EXq, Ib }, PREFIX_MANDATORY },
4448   },
4449
4450   /* PREFIX_0F3A0C */
4451   {
4452     { Bad_Opcode },
4453     { Bad_Opcode },
4454     { "blendps", { XM, EXx, Ib }, PREFIX_MANDATORY },
4455   },
4456
4457   /* PREFIX_0F3A0D */
4458   {
4459     { Bad_Opcode },
4460     { Bad_Opcode },
4461     { "blendpd", { XM, EXx, Ib }, PREFIX_MANDATORY },
4462   },
4463
4464   /* PREFIX_0F3A0E */
4465   {
4466     { Bad_Opcode },
4467     { Bad_Opcode },
4468     { "pblendw", { XM, EXx, Ib }, PREFIX_MANDATORY },
4469   },
4470
4471   /* PREFIX_0F3A14 */
4472   {
4473     { Bad_Opcode },
4474     { Bad_Opcode },
4475     { "pextrb", { Edqb, XM, Ib }, PREFIX_MANDATORY },
4476   },
4477
4478   /* PREFIX_0F3A15 */
4479   {
4480     { Bad_Opcode },
4481     { Bad_Opcode },
4482     { "pextrw", { Edqw, XM, Ib }, PREFIX_MANDATORY },
4483   },
4484
4485   /* PREFIX_0F3A16 */
4486   {
4487     { Bad_Opcode },
4488     { Bad_Opcode },
4489     { "pextrK", { Edq, XM, Ib }, PREFIX_MANDATORY },
4490   },
4491
4492   /* PREFIX_0F3A17 */
4493   {
4494     { Bad_Opcode },
4495     { Bad_Opcode },
4496     { "extractps", { Edqd, XM, Ib }, PREFIX_MANDATORY },
4497   },
4498
4499   /* PREFIX_0F3A20 */
4500   {
4501     { Bad_Opcode },
4502     { Bad_Opcode },
4503     { "pinsrb", { XM, Edqb, Ib }, PREFIX_MANDATORY },
4504   },
4505
4506   /* PREFIX_0F3A21 */
4507   {
4508     { Bad_Opcode },
4509     { Bad_Opcode },
4510     { "insertps", { XM, EXd, Ib }, PREFIX_MANDATORY },
4511   },
4512
4513   /* PREFIX_0F3A22 */
4514   {
4515     { Bad_Opcode },
4516     { Bad_Opcode },
4517     { "pinsrK", { XM, Edq, Ib }, PREFIX_MANDATORY },
4518   },
4519
4520   /* PREFIX_0F3A40 */
4521   {
4522     { Bad_Opcode },
4523     { Bad_Opcode },
4524     { "dpps",   { XM, EXx, Ib }, PREFIX_MANDATORY },
4525   },
4526
4527   /* PREFIX_0F3A41 */
4528   {
4529     { Bad_Opcode },
4530     { Bad_Opcode },
4531     { "dppd",   { XM, EXx, Ib }, PREFIX_MANDATORY },
4532   },
4533
4534   /* PREFIX_0F3A42 */
4535   {
4536     { Bad_Opcode },
4537     { Bad_Opcode },
4538     { "mpsadbw", { XM, EXx, Ib }, PREFIX_MANDATORY },
4539   },
4540
4541   /* PREFIX_0F3A44 */
4542   {
4543     { Bad_Opcode },
4544     { Bad_Opcode },
4545     { "pclmulqdq", { XM, EXx, PCLMUL }, PREFIX_MANDATORY },
4546   },
4547
4548   /* PREFIX_0F3A60 */
4549   {
4550     { Bad_Opcode },
4551     { Bad_Opcode },
4552     { "pcmpestrm", { XM, EXx, Ib }, PREFIX_MANDATORY },
4553   },
4554
4555   /* PREFIX_0F3A61 */
4556   {
4557     { Bad_Opcode },
4558     { Bad_Opcode },
4559     { "pcmpestri", { XM, EXx, Ib }, PREFIX_MANDATORY },
4560   },
4561
4562   /* PREFIX_0F3A62 */
4563   {
4564     { Bad_Opcode },
4565     { Bad_Opcode },
4566     { "pcmpistrm", { XM, EXx, Ib }, PREFIX_MANDATORY },
4567   },
4568
4569   /* PREFIX_0F3A63 */
4570   {
4571     { Bad_Opcode },
4572     { Bad_Opcode },
4573     { "pcmpistri", { XM, EXx, Ib }, PREFIX_MANDATORY },
4574   },
4575
4576   /* PREFIX_0F3ACC */
4577   {
4578     { "sha1rnds4", { XM, EXxmm, Ib }, PREFIX_MANDATORY },
4579   },
4580
4581   /* PREFIX_0F3ADF */
4582   {
4583     { Bad_Opcode },
4584     { Bad_Opcode },
4585     { "aeskeygenassist", { XM, EXx, Ib }, PREFIX_MANDATORY },
4586   },
4587
4588   /* PREFIX_VEX_0F10 */
4589   {
4590     { VEX_W_TABLE (VEX_W_0F10_P_0) },
4591     { VEX_LEN_TABLE (VEX_LEN_0F10_P_1) },
4592     { VEX_W_TABLE (VEX_W_0F10_P_2) },
4593     { VEX_LEN_TABLE (VEX_LEN_0F10_P_3) },
4594   },
4595
4596   /* PREFIX_VEX_0F11 */
4597   {
4598     { VEX_W_TABLE (VEX_W_0F11_P_0) },
4599     { VEX_LEN_TABLE (VEX_LEN_0F11_P_1) },
4600     { VEX_W_TABLE (VEX_W_0F11_P_2) },
4601     { VEX_LEN_TABLE (VEX_LEN_0F11_P_3) },
4602   },
4603
4604   /* PREFIX_VEX_0F12 */
4605   {
4606     { MOD_TABLE (MOD_VEX_0F12_PREFIX_0) },
4607     { VEX_W_TABLE (VEX_W_0F12_P_1) },
4608     { VEX_LEN_TABLE (VEX_LEN_0F12_P_2) },
4609     { VEX_W_TABLE (VEX_W_0F12_P_3) },
4610   },
4611
4612   /* PREFIX_VEX_0F16 */
4613   {
4614     { MOD_TABLE (MOD_VEX_0F16_PREFIX_0) },
4615     { VEX_W_TABLE (VEX_W_0F16_P_1) },
4616     { VEX_LEN_TABLE (VEX_LEN_0F16_P_2) },
4617   },
4618
4619   /* PREFIX_VEX_0F2A */
4620   {
4621     { Bad_Opcode },
4622     { VEX_LEN_TABLE (VEX_LEN_0F2A_P_1) },
4623     { Bad_Opcode },
4624     { VEX_LEN_TABLE (VEX_LEN_0F2A_P_3) },
4625   },
4626
4627   /* PREFIX_VEX_0F2C */
4628   {
4629     { Bad_Opcode },
4630     { VEX_LEN_TABLE (VEX_LEN_0F2C_P_1) },
4631     { Bad_Opcode },
4632     { VEX_LEN_TABLE (VEX_LEN_0F2C_P_3) },
4633   },
4634
4635   /* PREFIX_VEX_0F2D */
4636   {
4637     { Bad_Opcode },
4638     { VEX_LEN_TABLE (VEX_LEN_0F2D_P_1) },
4639     { Bad_Opcode },
4640     { VEX_LEN_TABLE (VEX_LEN_0F2D_P_3) },
4641   },
4642
4643   /* PREFIX_VEX_0F2E */
4644   {
4645     { VEX_LEN_TABLE (VEX_LEN_0F2E_P_0) },
4646     { Bad_Opcode },
4647     { VEX_LEN_TABLE (VEX_LEN_0F2E_P_2) },
4648   },
4649
4650   /* PREFIX_VEX_0F2F */
4651   {
4652     { VEX_LEN_TABLE (VEX_LEN_0F2F_P_0) },
4653     { Bad_Opcode },
4654     { VEX_LEN_TABLE (VEX_LEN_0F2F_P_2) },
4655   },
4656
4657   /* PREFIX_VEX_0F41 */
4658   {
4659     { VEX_LEN_TABLE (VEX_LEN_0F41_P_0) },
4660     { Bad_Opcode },
4661     { VEX_LEN_TABLE (VEX_LEN_0F41_P_2) },
4662   },
4663
4664   /* PREFIX_VEX_0F42 */
4665   {
4666     { VEX_LEN_TABLE (VEX_LEN_0F42_P_0) },
4667     { Bad_Opcode },
4668     { VEX_LEN_TABLE (VEX_LEN_0F42_P_2) },
4669   },
4670
4671   /* PREFIX_VEX_0F44 */
4672   {
4673     { VEX_LEN_TABLE (VEX_LEN_0F44_P_0) },
4674     { Bad_Opcode },
4675     { VEX_LEN_TABLE (VEX_LEN_0F44_P_2) },
4676   },
4677
4678   /* PREFIX_VEX_0F45 */
4679   {
4680     { VEX_LEN_TABLE (VEX_LEN_0F45_P_0) },
4681     { Bad_Opcode },
4682     { VEX_LEN_TABLE (VEX_LEN_0F45_P_2) },
4683   },
4684
4685   /* PREFIX_VEX_0F46 */
4686   {
4687     { VEX_LEN_TABLE (VEX_LEN_0F46_P_0) },
4688     { Bad_Opcode },
4689     { VEX_LEN_TABLE (VEX_LEN_0F46_P_2) },
4690   },
4691
4692   /* PREFIX_VEX_0F47 */
4693   {
4694     { VEX_LEN_TABLE (VEX_LEN_0F47_P_0) },
4695     { Bad_Opcode },
4696     { VEX_LEN_TABLE (VEX_LEN_0F47_P_2) },
4697   },
4698
4699   /* PREFIX_VEX_0F4A */
4700   {
4701     { VEX_LEN_TABLE (VEX_LEN_0F4A_P_0) },
4702     { Bad_Opcode },
4703     { VEX_LEN_TABLE (VEX_LEN_0F4A_P_2) },
4704   },
4705
4706   /* PREFIX_VEX_0F4B */
4707   {
4708     { VEX_LEN_TABLE (VEX_LEN_0F4B_P_0) },
4709     { Bad_Opcode },
4710     { VEX_LEN_TABLE (VEX_LEN_0F4B_P_2) },
4711   },
4712
4713   /* PREFIX_VEX_0F51 */
4714   {
4715     { VEX_W_TABLE (VEX_W_0F51_P_0) },
4716     { VEX_LEN_TABLE (VEX_LEN_0F51_P_1) },
4717     { VEX_W_TABLE (VEX_W_0F51_P_2) },
4718     { VEX_LEN_TABLE (VEX_LEN_0F51_P_3) },
4719   },
4720
4721   /* PREFIX_VEX_0F52 */
4722   {
4723     { VEX_W_TABLE (VEX_W_0F52_P_0) },
4724     { VEX_LEN_TABLE (VEX_LEN_0F52_P_1) },
4725   },
4726
4727   /* PREFIX_VEX_0F53 */
4728   {
4729     { VEX_W_TABLE (VEX_W_0F53_P_0) },
4730     { VEX_LEN_TABLE (VEX_LEN_0F53_P_1) },
4731   },
4732
4733   /* PREFIX_VEX_0F58 */
4734   {
4735     { VEX_W_TABLE (VEX_W_0F58_P_0) },
4736     { VEX_LEN_TABLE (VEX_LEN_0F58_P_1) },
4737     { VEX_W_TABLE (VEX_W_0F58_P_2) },
4738     { VEX_LEN_TABLE (VEX_LEN_0F58_P_3) },
4739   },
4740
4741   /* PREFIX_VEX_0F59 */
4742   {
4743     { VEX_W_TABLE (VEX_W_0F59_P_0) },
4744     { VEX_LEN_TABLE (VEX_LEN_0F59_P_1) },
4745     { VEX_W_TABLE (VEX_W_0F59_P_2) },
4746     { VEX_LEN_TABLE (VEX_LEN_0F59_P_3) },
4747   },
4748
4749   /* PREFIX_VEX_0F5A */
4750   {
4751     { VEX_W_TABLE (VEX_W_0F5A_P_0) },
4752     { VEX_LEN_TABLE (VEX_LEN_0F5A_P_1) },
4753     { "vcvtpd2ps%XY", { XMM, EXx }, 0 },
4754     { VEX_LEN_TABLE (VEX_LEN_0F5A_P_3) },
4755   },
4756
4757   /* PREFIX_VEX_0F5B */
4758   {
4759     { VEX_W_TABLE (VEX_W_0F5B_P_0) },
4760     { VEX_W_TABLE (VEX_W_0F5B_P_1) },
4761     { VEX_W_TABLE (VEX_W_0F5B_P_2) },
4762   },
4763
4764   /* PREFIX_VEX_0F5C */
4765   {
4766     { VEX_W_TABLE (VEX_W_0F5C_P_0) },
4767     { VEX_LEN_TABLE (VEX_LEN_0F5C_P_1) },
4768     { VEX_W_TABLE (VEX_W_0F5C_P_2) },
4769     { VEX_LEN_TABLE (VEX_LEN_0F5C_P_3) },
4770   },
4771
4772   /* PREFIX_VEX_0F5D */
4773   {
4774     { VEX_W_TABLE (VEX_W_0F5D_P_0) },
4775     { VEX_LEN_TABLE (VEX_LEN_0F5D_P_1) },
4776     { VEX_W_TABLE (VEX_W_0F5D_P_2) },
4777     { VEX_LEN_TABLE (VEX_LEN_0F5D_P_3) },
4778   },
4779
4780   /* PREFIX_VEX_0F5E */
4781   {
4782     { VEX_W_TABLE (VEX_W_0F5E_P_0) },
4783     { VEX_LEN_TABLE (VEX_LEN_0F5E_P_1) },
4784     { VEX_W_TABLE (VEX_W_0F5E_P_2) },
4785     { VEX_LEN_TABLE (VEX_LEN_0F5E_P_3) },
4786   },
4787
4788   /* PREFIX_VEX_0F5F */
4789   {
4790     { VEX_W_TABLE (VEX_W_0F5F_P_0) },
4791     { VEX_LEN_TABLE (VEX_LEN_0F5F_P_1) },
4792     { VEX_W_TABLE (VEX_W_0F5F_P_2) },
4793     { VEX_LEN_TABLE (VEX_LEN_0F5F_P_3) },
4794   },
4795
4796   /* PREFIX_VEX_0F60 */
4797   {
4798     { Bad_Opcode },
4799     { Bad_Opcode },
4800     { VEX_W_TABLE (VEX_W_0F60_P_2) },
4801   },
4802
4803   /* PREFIX_VEX_0F61 */
4804   {
4805     { Bad_Opcode },
4806     { Bad_Opcode },
4807     { VEX_W_TABLE (VEX_W_0F61_P_2) },
4808   },
4809
4810   /* PREFIX_VEX_0F62 */
4811   {
4812     { Bad_Opcode },
4813     { Bad_Opcode },
4814     { VEX_W_TABLE (VEX_W_0F62_P_2) },
4815   },
4816
4817   /* PREFIX_VEX_0F63 */
4818   {
4819     { Bad_Opcode },
4820     { Bad_Opcode },
4821     { VEX_W_TABLE (VEX_W_0F63_P_2) },
4822   },
4823
4824   /* PREFIX_VEX_0F64 */
4825   {
4826     { Bad_Opcode },
4827     { Bad_Opcode },
4828     { VEX_W_TABLE (VEX_W_0F64_P_2) },
4829   },
4830
4831   /* PREFIX_VEX_0F65 */
4832   {
4833     { Bad_Opcode },
4834     { Bad_Opcode },
4835     { VEX_W_TABLE (VEX_W_0F65_P_2) },
4836   },
4837
4838   /* PREFIX_VEX_0F66 */
4839   {
4840     { Bad_Opcode },
4841     { Bad_Opcode },
4842     { VEX_W_TABLE (VEX_W_0F66_P_2) },
4843   },
4844
4845   /* PREFIX_VEX_0F67 */
4846   {
4847     { Bad_Opcode },
4848     { Bad_Opcode },
4849     { VEX_W_TABLE (VEX_W_0F67_P_2) },
4850   },
4851
4852   /* PREFIX_VEX_0F68 */
4853   {
4854     { Bad_Opcode },
4855     { Bad_Opcode },
4856     { VEX_W_TABLE (VEX_W_0F68_P_2) },
4857   },
4858
4859   /* PREFIX_VEX_0F69 */
4860   {
4861     { Bad_Opcode },
4862     { Bad_Opcode },
4863     { VEX_W_TABLE (VEX_W_0F69_P_2) },
4864   },
4865
4866   /* PREFIX_VEX_0F6A */
4867   {
4868     { Bad_Opcode },
4869     { Bad_Opcode },
4870     { VEX_W_TABLE (VEX_W_0F6A_P_2) },
4871   },
4872
4873   /* PREFIX_VEX_0F6B */
4874   {
4875     { Bad_Opcode },
4876     { Bad_Opcode },
4877     { VEX_W_TABLE (VEX_W_0F6B_P_2) },
4878   },
4879
4880   /* PREFIX_VEX_0F6C */
4881   {
4882     { Bad_Opcode },
4883     { Bad_Opcode },
4884     { VEX_W_TABLE (VEX_W_0F6C_P_2) },
4885   },
4886
4887   /* PREFIX_VEX_0F6D */
4888   {
4889     { Bad_Opcode },
4890     { Bad_Opcode },
4891     { VEX_W_TABLE (VEX_W_0F6D_P_2) },
4892   },
4893
4894   /* PREFIX_VEX_0F6E */
4895   {
4896     { Bad_Opcode },
4897     { Bad_Opcode },
4898     { VEX_LEN_TABLE (VEX_LEN_0F6E_P_2) },
4899   },
4900
4901   /* PREFIX_VEX_0F6F */
4902   {
4903     { Bad_Opcode },
4904     { VEX_W_TABLE (VEX_W_0F6F_P_1) },
4905     { VEX_W_TABLE (VEX_W_0F6F_P_2) },
4906   },
4907
4908   /* PREFIX_VEX_0F70 */
4909   {
4910     { Bad_Opcode },
4911     { VEX_W_TABLE (VEX_W_0F70_P_1) },
4912     { VEX_W_TABLE (VEX_W_0F70_P_2) },
4913     { VEX_W_TABLE (VEX_W_0F70_P_3) },
4914   },
4915
4916   /* PREFIX_VEX_0F71_REG_2 */
4917   {
4918     { Bad_Opcode },
4919     { Bad_Opcode },
4920     { VEX_W_TABLE (VEX_W_0F71_R_2_P_2) },
4921   },
4922
4923   /* PREFIX_VEX_0F71_REG_4 */
4924   {
4925     { Bad_Opcode },
4926     { Bad_Opcode },
4927     { VEX_W_TABLE (VEX_W_0F71_R_4_P_2) },
4928   },
4929
4930   /* PREFIX_VEX_0F71_REG_6 */
4931   {
4932     { Bad_Opcode },
4933     { Bad_Opcode },
4934     { VEX_W_TABLE (VEX_W_0F71_R_6_P_2) },
4935   },
4936
4937   /* PREFIX_VEX_0F72_REG_2 */
4938   {
4939     { Bad_Opcode },
4940     { Bad_Opcode },
4941     { VEX_W_TABLE (VEX_W_0F72_R_2_P_2) },
4942   },
4943
4944   /* PREFIX_VEX_0F72_REG_4 */
4945   {
4946     { Bad_Opcode },
4947     { Bad_Opcode },
4948     { VEX_W_TABLE (VEX_W_0F72_R_4_P_2) },
4949   },
4950
4951   /* PREFIX_VEX_0F72_REG_6 */
4952   {
4953     { Bad_Opcode },
4954     { Bad_Opcode },
4955     { VEX_W_TABLE (VEX_W_0F72_R_6_P_2) },
4956   },
4957
4958   /* PREFIX_VEX_0F73_REG_2 */
4959   {
4960     { Bad_Opcode },
4961     { Bad_Opcode },
4962     { VEX_W_TABLE (VEX_W_0F73_R_2_P_2) },
4963   },
4964
4965   /* PREFIX_VEX_0F73_REG_3 */
4966   {
4967     { Bad_Opcode },
4968     { Bad_Opcode },
4969     { VEX_W_TABLE (VEX_W_0F73_R_3_P_2) },
4970   },
4971
4972   /* PREFIX_VEX_0F73_REG_6 */
4973   {
4974     { Bad_Opcode },
4975     { Bad_Opcode },
4976     { VEX_W_TABLE (VEX_W_0F73_R_6_P_2) },
4977   },
4978
4979   /* PREFIX_VEX_0F73_REG_7 */
4980   {
4981     { Bad_Opcode },
4982     { Bad_Opcode },
4983     { VEX_W_TABLE (VEX_W_0F73_R_7_P_2) },
4984   },
4985
4986   /* PREFIX_VEX_0F74 */
4987   {
4988     { Bad_Opcode },
4989     { Bad_Opcode },
4990     { VEX_W_TABLE (VEX_W_0F74_P_2) },
4991   },
4992
4993   /* PREFIX_VEX_0F75 */
4994   {
4995     { Bad_Opcode },
4996     { Bad_Opcode },
4997     { VEX_W_TABLE (VEX_W_0F75_P_2) },
4998   },
4999
5000   /* PREFIX_VEX_0F76 */
5001   {
5002     { Bad_Opcode },
5003     { Bad_Opcode },
5004     { VEX_W_TABLE (VEX_W_0F76_P_2) },
5005   },
5006
5007   /* PREFIX_VEX_0F77 */
5008   {
5009     { VEX_W_TABLE (VEX_W_0F77_P_0) },
5010   },
5011
5012   /* PREFIX_VEX_0F7C */
5013   {
5014     { Bad_Opcode },
5015     { Bad_Opcode },
5016     { VEX_W_TABLE (VEX_W_0F7C_P_2) },
5017     { VEX_W_TABLE (VEX_W_0F7C_P_3) },
5018   },
5019
5020   /* PREFIX_VEX_0F7D */
5021   {
5022     { Bad_Opcode },
5023     { Bad_Opcode },
5024     { VEX_W_TABLE (VEX_W_0F7D_P_2) },
5025     { VEX_W_TABLE (VEX_W_0F7D_P_3) },
5026   },
5027
5028   /* PREFIX_VEX_0F7E */
5029   {
5030     { Bad_Opcode },
5031     { VEX_LEN_TABLE (VEX_LEN_0F7E_P_1) },
5032     { VEX_LEN_TABLE (VEX_LEN_0F7E_P_2) },
5033   },
5034
5035   /* PREFIX_VEX_0F7F */
5036   {
5037     { Bad_Opcode },
5038     { VEX_W_TABLE (VEX_W_0F7F_P_1) },
5039     { VEX_W_TABLE (VEX_W_0F7F_P_2) },
5040   },
5041
5042   /* PREFIX_VEX_0F90 */
5043   {
5044     { VEX_LEN_TABLE (VEX_LEN_0F90_P_0) },
5045     { Bad_Opcode },
5046     { VEX_LEN_TABLE (VEX_LEN_0F90_P_2) },
5047   },
5048
5049   /* PREFIX_VEX_0F91 */
5050   {
5051     { VEX_LEN_TABLE (VEX_LEN_0F91_P_0) },
5052     { Bad_Opcode },
5053     { VEX_LEN_TABLE (VEX_LEN_0F91_P_2) },
5054   },
5055
5056   /* PREFIX_VEX_0F92 */
5057   {
5058     { VEX_LEN_TABLE (VEX_LEN_0F92_P_0) },
5059     { Bad_Opcode },
5060     { VEX_LEN_TABLE (VEX_LEN_0F92_P_2) },
5061     { VEX_LEN_TABLE (VEX_LEN_0F92_P_3) },
5062   },
5063
5064   /* PREFIX_VEX_0F93 */
5065   {
5066     { VEX_LEN_TABLE (VEX_LEN_0F93_P_0) },
5067     { Bad_Opcode },
5068     { VEX_LEN_TABLE (VEX_LEN_0F93_P_2) },
5069     { VEX_LEN_TABLE (VEX_LEN_0F93_P_3) },
5070   },
5071
5072   /* PREFIX_VEX_0F98 */
5073   {
5074     { VEX_LEN_TABLE (VEX_LEN_0F98_P_0) },
5075     { Bad_Opcode },
5076     { VEX_LEN_TABLE (VEX_LEN_0F98_P_2) },
5077   },
5078
5079   /* PREFIX_VEX_0F99 */
5080   {
5081     { VEX_LEN_TABLE (VEX_LEN_0F99_P_0) },
5082     { Bad_Opcode },
5083     { VEX_LEN_TABLE (VEX_LEN_0F99_P_2) },
5084   },
5085
5086   /* PREFIX_VEX_0FC2 */
5087   {
5088     { VEX_W_TABLE (VEX_W_0FC2_P_0) },
5089     { VEX_LEN_TABLE (VEX_LEN_0FC2_P_1) },
5090     { VEX_W_TABLE (VEX_W_0FC2_P_2) },
5091     { VEX_LEN_TABLE (VEX_LEN_0FC2_P_3) },
5092   },
5093
5094   /* PREFIX_VEX_0FC4 */
5095   {
5096     { Bad_Opcode },
5097     { Bad_Opcode },
5098     { VEX_LEN_TABLE (VEX_LEN_0FC4_P_2) },
5099   },
5100
5101   /* PREFIX_VEX_0FC5 */
5102   {
5103     { Bad_Opcode },
5104     { Bad_Opcode },
5105     { VEX_LEN_TABLE (VEX_LEN_0FC5_P_2) },
5106   },
5107
5108   /* PREFIX_VEX_0FD0 */
5109   {
5110     { Bad_Opcode },
5111     { Bad_Opcode },
5112     { VEX_W_TABLE (VEX_W_0FD0_P_2) },
5113     { VEX_W_TABLE (VEX_W_0FD0_P_3) },
5114   },
5115
5116   /* PREFIX_VEX_0FD1 */
5117   {
5118     { Bad_Opcode },
5119     { Bad_Opcode },
5120     { VEX_W_TABLE (VEX_W_0FD1_P_2) },
5121   },
5122
5123   /* PREFIX_VEX_0FD2 */
5124   {
5125     { Bad_Opcode },
5126     { Bad_Opcode },
5127     { VEX_W_TABLE (VEX_W_0FD2_P_2) },
5128   },
5129
5130   /* PREFIX_VEX_0FD3 */
5131   {
5132     { Bad_Opcode },
5133     { Bad_Opcode },
5134     { VEX_W_TABLE (VEX_W_0FD3_P_2) },
5135   },
5136
5137   /* PREFIX_VEX_0FD4 */
5138   {
5139     { Bad_Opcode },
5140     { Bad_Opcode },
5141     { VEX_W_TABLE (VEX_W_0FD4_P_2) },
5142   },
5143
5144   /* PREFIX_VEX_0FD5 */
5145   {
5146     { Bad_Opcode },
5147     { Bad_Opcode },
5148     { VEX_W_TABLE (VEX_W_0FD5_P_2) },
5149   },
5150
5151   /* PREFIX_VEX_0FD6 */
5152   {
5153     { Bad_Opcode },
5154     { Bad_Opcode },
5155     { VEX_LEN_TABLE (VEX_LEN_0FD6_P_2) },
5156   },
5157
5158   /* PREFIX_VEX_0FD7 */
5159   {
5160     { Bad_Opcode },
5161     { Bad_Opcode },
5162     { MOD_TABLE (MOD_VEX_0FD7_PREFIX_2) },
5163   },
5164
5165   /* PREFIX_VEX_0FD8 */
5166   {
5167     { Bad_Opcode },
5168     { Bad_Opcode },
5169     { VEX_W_TABLE (VEX_W_0FD8_P_2) },
5170   },
5171
5172   /* PREFIX_VEX_0FD9 */
5173   {
5174     { Bad_Opcode },
5175     { Bad_Opcode },
5176     { VEX_W_TABLE (VEX_W_0FD9_P_2) },
5177   },
5178
5179   /* PREFIX_VEX_0FDA */
5180   {
5181     { Bad_Opcode },
5182     { Bad_Opcode },
5183     { VEX_W_TABLE (VEX_W_0FDA_P_2) },
5184   },
5185
5186   /* PREFIX_VEX_0FDB */
5187   {
5188     { Bad_Opcode },
5189     { Bad_Opcode },
5190     { VEX_W_TABLE (VEX_W_0FDB_P_2) },
5191   },
5192
5193   /* PREFIX_VEX_0FDC */
5194   {
5195     { Bad_Opcode },
5196     { Bad_Opcode },
5197     { VEX_W_TABLE (VEX_W_0FDC_P_2) },
5198   },
5199
5200   /* PREFIX_VEX_0FDD */
5201   {
5202     { Bad_Opcode },
5203     { Bad_Opcode },
5204     { VEX_W_TABLE (VEX_W_0FDD_P_2) },
5205   },
5206
5207   /* PREFIX_VEX_0FDE */
5208   {
5209     { Bad_Opcode },
5210     { Bad_Opcode },
5211     { VEX_W_TABLE (VEX_W_0FDE_P_2) },
5212   },
5213
5214   /* PREFIX_VEX_0FDF */
5215   {
5216     { Bad_Opcode },
5217     { Bad_Opcode },
5218     { VEX_W_TABLE (VEX_W_0FDF_P_2) },
5219   },
5220
5221   /* PREFIX_VEX_0FE0 */
5222   {
5223     { Bad_Opcode },
5224     { Bad_Opcode },
5225     { VEX_W_TABLE (VEX_W_0FE0_P_2) },
5226   },
5227
5228   /* PREFIX_VEX_0FE1 */
5229   {
5230     { Bad_Opcode },
5231     { Bad_Opcode },
5232     { VEX_W_TABLE (VEX_W_0FE1_P_2) },
5233   },
5234
5235   /* PREFIX_VEX_0FE2 */
5236   {
5237     { Bad_Opcode },
5238     { Bad_Opcode },
5239     { VEX_W_TABLE (VEX_W_0FE2_P_2) },
5240   },
5241
5242   /* PREFIX_VEX_0FE3 */
5243   {
5244     { Bad_Opcode },
5245     { Bad_Opcode },
5246     { VEX_W_TABLE (VEX_W_0FE3_P_2) },
5247   },
5248
5249   /* PREFIX_VEX_0FE4 */
5250   {
5251     { Bad_Opcode },
5252     { Bad_Opcode },
5253     { VEX_W_TABLE (VEX_W_0FE4_P_2) },
5254   },
5255
5256   /* PREFIX_VEX_0FE5 */
5257   {
5258     { Bad_Opcode },
5259     { Bad_Opcode },
5260     { VEX_W_TABLE (VEX_W_0FE5_P_2) },
5261   },
5262
5263   /* PREFIX_VEX_0FE6 */
5264   {
5265     { Bad_Opcode },
5266     { VEX_W_TABLE (VEX_W_0FE6_P_1) },
5267     { VEX_W_TABLE (VEX_W_0FE6_P_2) },
5268     { VEX_W_TABLE (VEX_W_0FE6_P_3) },
5269   },
5270
5271   /* PREFIX_VEX_0FE7 */
5272   {
5273     { Bad_Opcode },
5274     { Bad_Opcode },
5275     { MOD_TABLE (MOD_VEX_0FE7_PREFIX_2) },
5276   },
5277
5278   /* PREFIX_VEX_0FE8 */
5279   {
5280     { Bad_Opcode },
5281     { Bad_Opcode },
5282     { VEX_W_TABLE (VEX_W_0FE8_P_2) },
5283   },
5284
5285   /* PREFIX_VEX_0FE9 */
5286   {
5287     { Bad_Opcode },
5288     { Bad_Opcode },
5289     { VEX_W_TABLE (VEX_W_0FE9_P_2) },
5290   },
5291
5292   /* PREFIX_VEX_0FEA */
5293   {
5294     { Bad_Opcode },
5295     { Bad_Opcode },
5296     { VEX_W_TABLE (VEX_W_0FEA_P_2) },
5297   },
5298
5299   /* PREFIX_VEX_0FEB */
5300   {
5301     { Bad_Opcode },
5302     { Bad_Opcode },
5303     { VEX_W_TABLE (VEX_W_0FEB_P_2) },
5304   },
5305
5306   /* PREFIX_VEX_0FEC */
5307   {
5308     { Bad_Opcode },
5309     { Bad_Opcode },
5310     { VEX_W_TABLE (VEX_W_0FEC_P_2) },
5311   },
5312
5313   /* PREFIX_VEX_0FED */
5314   {
5315     { Bad_Opcode },
5316     { Bad_Opcode },
5317     { VEX_W_TABLE (VEX_W_0FED_P_2) },
5318   },
5319
5320   /* PREFIX_VEX_0FEE */
5321   {
5322     { Bad_Opcode },
5323     { Bad_Opcode },
5324     { VEX_W_TABLE (VEX_W_0FEE_P_2) },
5325   },
5326
5327   /* PREFIX_VEX_0FEF */
5328   {
5329     { Bad_Opcode },
5330     { Bad_Opcode },
5331     { VEX_W_TABLE (VEX_W_0FEF_P_2) },
5332   },
5333
5334   /* PREFIX_VEX_0FF0 */
5335   {
5336     { Bad_Opcode },
5337     { Bad_Opcode },
5338     { Bad_Opcode },
5339     { MOD_TABLE (MOD_VEX_0FF0_PREFIX_3) },
5340   },
5341
5342   /* PREFIX_VEX_0FF1 */
5343   {
5344     { Bad_Opcode },
5345     { Bad_Opcode },
5346     { VEX_W_TABLE (VEX_W_0FF1_P_2) },
5347   },
5348
5349   /* PREFIX_VEX_0FF2 */
5350   {
5351     { Bad_Opcode },
5352     { Bad_Opcode },
5353     { VEX_W_TABLE (VEX_W_0FF2_P_2) },
5354   },
5355
5356   /* PREFIX_VEX_0FF3 */
5357   {
5358     { Bad_Opcode },
5359     { Bad_Opcode },
5360     { VEX_W_TABLE (VEX_W_0FF3_P_2) },
5361   },
5362
5363   /* PREFIX_VEX_0FF4 */
5364   {
5365     { Bad_Opcode },
5366     { Bad_Opcode },
5367     { VEX_W_TABLE (VEX_W_0FF4_P_2) },
5368   },
5369
5370   /* PREFIX_VEX_0FF5 */
5371   {
5372     { Bad_Opcode },
5373     { Bad_Opcode },
5374     { VEX_W_TABLE (VEX_W_0FF5_P_2) },
5375   },
5376
5377   /* PREFIX_VEX_0FF6 */
5378   {
5379     { Bad_Opcode },
5380     { Bad_Opcode },
5381     { VEX_W_TABLE (VEX_W_0FF6_P_2) },
5382   },
5383
5384   /* PREFIX_VEX_0FF7 */
5385   {
5386     { Bad_Opcode },
5387     { Bad_Opcode },
5388     { VEX_LEN_TABLE (VEX_LEN_0FF7_P_2) },
5389   },
5390
5391   /* PREFIX_VEX_0FF8 */
5392   {
5393     { Bad_Opcode },
5394     { Bad_Opcode },
5395     { VEX_W_TABLE (VEX_W_0FF8_P_2) },
5396   },
5397
5398   /* PREFIX_VEX_0FF9 */
5399   {
5400     { Bad_Opcode },
5401     { Bad_Opcode },
5402     { VEX_W_TABLE (VEX_W_0FF9_P_2) },
5403   },
5404
5405   /* PREFIX_VEX_0FFA */
5406   {
5407     { Bad_Opcode },
5408     { Bad_Opcode },
5409     { VEX_W_TABLE (VEX_W_0FFA_P_2) },
5410   },
5411
5412   /* PREFIX_VEX_0FFB */
5413   {
5414     { Bad_Opcode },
5415     { Bad_Opcode },
5416     { VEX_W_TABLE (VEX_W_0FFB_P_2) },
5417   },
5418
5419   /* PREFIX_VEX_0FFC */
5420   {
5421     { Bad_Opcode },
5422     { Bad_Opcode },
5423     { VEX_W_TABLE (VEX_W_0FFC_P_2) },
5424   },
5425
5426   /* PREFIX_VEX_0FFD */
5427   {
5428     { Bad_Opcode },
5429     { Bad_Opcode },
5430     { VEX_W_TABLE (VEX_W_0FFD_P_2) },
5431   },
5432
5433   /* PREFIX_VEX_0FFE */
5434   {
5435     { Bad_Opcode },
5436     { Bad_Opcode },
5437     { VEX_W_TABLE (VEX_W_0FFE_P_2) },
5438   },
5439
5440   /* PREFIX_VEX_0F3800 */
5441   {
5442     { Bad_Opcode },
5443     { Bad_Opcode },
5444     { VEX_W_TABLE (VEX_W_0F3800_P_2) },
5445   },
5446
5447   /* PREFIX_VEX_0F3801 */
5448   {
5449     { Bad_Opcode },
5450     { Bad_Opcode },
5451     { VEX_W_TABLE (VEX_W_0F3801_P_2) },
5452   },
5453
5454   /* PREFIX_VEX_0F3802 */
5455   {
5456     { Bad_Opcode },
5457     { Bad_Opcode },
5458     { VEX_W_TABLE (VEX_W_0F3802_P_2) },
5459   },
5460
5461   /* PREFIX_VEX_0F3803 */
5462   {
5463     { Bad_Opcode },
5464     { Bad_Opcode },
5465     { VEX_W_TABLE (VEX_W_0F3803_P_2) },
5466   },
5467
5468   /* PREFIX_VEX_0F3804 */
5469   {
5470     { Bad_Opcode },
5471     { Bad_Opcode },
5472     { VEX_W_TABLE (VEX_W_0F3804_P_2) },
5473   },
5474
5475   /* PREFIX_VEX_0F3805 */
5476   {
5477     { Bad_Opcode },
5478     { Bad_Opcode },
5479     { VEX_W_TABLE (VEX_W_0F3805_P_2) },
5480   },
5481
5482   /* PREFIX_VEX_0F3806 */
5483   {
5484     { Bad_Opcode },
5485     { Bad_Opcode },
5486     { VEX_W_TABLE (VEX_W_0F3806_P_2) },
5487   },
5488
5489   /* PREFIX_VEX_0F3807 */
5490   {
5491     { Bad_Opcode },
5492     { Bad_Opcode },
5493     { VEX_W_TABLE (VEX_W_0F3807_P_2) },
5494   },
5495
5496   /* PREFIX_VEX_0F3808 */
5497   {
5498     { Bad_Opcode },
5499     { Bad_Opcode },
5500     { VEX_W_TABLE (VEX_W_0F3808_P_2) },
5501   },
5502
5503   /* PREFIX_VEX_0F3809 */
5504   {
5505     { Bad_Opcode },
5506     { Bad_Opcode },
5507     { VEX_W_TABLE (VEX_W_0F3809_P_2) },
5508   },
5509
5510   /* PREFIX_VEX_0F380A */
5511   {
5512     { Bad_Opcode },
5513     { Bad_Opcode },
5514     { VEX_W_TABLE (VEX_W_0F380A_P_2) },
5515   },
5516
5517   /* PREFIX_VEX_0F380B */
5518   {
5519     { Bad_Opcode },
5520     { Bad_Opcode },
5521     { VEX_W_TABLE (VEX_W_0F380B_P_2) },
5522   },
5523
5524   /* PREFIX_VEX_0F380C */
5525   {
5526     { Bad_Opcode },
5527     { Bad_Opcode },
5528     { VEX_W_TABLE (VEX_W_0F380C_P_2) },
5529   },
5530
5531   /* PREFIX_VEX_0F380D */
5532   {
5533     { Bad_Opcode },
5534     { Bad_Opcode },
5535     { VEX_W_TABLE (VEX_W_0F380D_P_2) },
5536   },
5537
5538   /* PREFIX_VEX_0F380E */
5539   {
5540     { Bad_Opcode },
5541     { Bad_Opcode },
5542     { VEX_W_TABLE (VEX_W_0F380E_P_2) },
5543   },
5544
5545   /* PREFIX_VEX_0F380F */
5546   {
5547     { Bad_Opcode },
5548     { Bad_Opcode },
5549     { VEX_W_TABLE (VEX_W_0F380F_P_2) },
5550   },
5551
5552   /* PREFIX_VEX_0F3813 */
5553   {
5554     { Bad_Opcode },
5555     { Bad_Opcode },
5556     { "vcvtph2ps", { XM, EXxmmq }, 0 },
5557   },
5558
5559   /* PREFIX_VEX_0F3816 */
5560   {
5561     { Bad_Opcode },
5562     { Bad_Opcode },
5563     { VEX_LEN_TABLE (VEX_LEN_0F3816_P_2) },
5564   },
5565
5566   /* PREFIX_VEX_0F3817 */
5567   {
5568     { Bad_Opcode },
5569     { Bad_Opcode },
5570     { VEX_W_TABLE (VEX_W_0F3817_P_2) },
5571   },
5572
5573   /* PREFIX_VEX_0F3818 */
5574   {
5575     { Bad_Opcode },
5576     { Bad_Opcode },
5577     { VEX_W_TABLE (VEX_W_0F3818_P_2) },
5578   },
5579
5580   /* PREFIX_VEX_0F3819 */
5581   {
5582     { Bad_Opcode },
5583     { Bad_Opcode },
5584     { VEX_LEN_TABLE (VEX_LEN_0F3819_P_2) },
5585   },
5586
5587   /* PREFIX_VEX_0F381A */
5588   {
5589     { Bad_Opcode },
5590     { Bad_Opcode },
5591     { MOD_TABLE (MOD_VEX_0F381A_PREFIX_2) },
5592   },
5593
5594   /* PREFIX_VEX_0F381C */
5595   {
5596     { Bad_Opcode },
5597     { Bad_Opcode },
5598     { VEX_W_TABLE (VEX_W_0F381C_P_2) },
5599   },
5600
5601   /* PREFIX_VEX_0F381D */
5602   {
5603     { Bad_Opcode },
5604     { Bad_Opcode },
5605     { VEX_W_TABLE (VEX_W_0F381D_P_2) },
5606   },
5607
5608   /* PREFIX_VEX_0F381E */
5609   {
5610     { Bad_Opcode },
5611     { Bad_Opcode },
5612     { VEX_W_TABLE (VEX_W_0F381E_P_2) },
5613   },
5614
5615   /* PREFIX_VEX_0F3820 */
5616   {
5617     { Bad_Opcode },
5618     { Bad_Opcode },
5619     { VEX_W_TABLE (VEX_W_0F3820_P_2) },
5620   },
5621
5622   /* PREFIX_VEX_0F3821 */
5623   {
5624     { Bad_Opcode },
5625     { Bad_Opcode },
5626     { VEX_W_TABLE (VEX_W_0F3821_P_2) },
5627   },
5628
5629   /* PREFIX_VEX_0F3822 */
5630   {
5631     { Bad_Opcode },
5632     { Bad_Opcode },
5633     { VEX_W_TABLE (VEX_W_0F3822_P_2) },
5634   },
5635
5636   /* PREFIX_VEX_0F3823 */
5637   {
5638     { Bad_Opcode },
5639     { Bad_Opcode },
5640     { VEX_W_TABLE (VEX_W_0F3823_P_2) },
5641   },
5642
5643   /* PREFIX_VEX_0F3824 */
5644   {
5645     { Bad_Opcode },
5646     { Bad_Opcode },
5647     { VEX_W_TABLE (VEX_W_0F3824_P_2) },
5648   },
5649
5650   /* PREFIX_VEX_0F3825 */
5651   {
5652     { Bad_Opcode },
5653     { Bad_Opcode },
5654     { VEX_W_TABLE (VEX_W_0F3825_P_2) },
5655   },
5656
5657   /* PREFIX_VEX_0F3828 */
5658   {
5659     { Bad_Opcode },
5660     { Bad_Opcode },
5661     { VEX_W_TABLE (VEX_W_0F3828_P_2) },
5662   },
5663
5664   /* PREFIX_VEX_0F3829 */
5665   {
5666     { Bad_Opcode },
5667     { Bad_Opcode },
5668     { VEX_W_TABLE (VEX_W_0F3829_P_2) },
5669   },
5670
5671   /* PREFIX_VEX_0F382A */
5672   {
5673     { Bad_Opcode },
5674     { Bad_Opcode },
5675     { MOD_TABLE (MOD_VEX_0F382A_PREFIX_2) },
5676   },
5677
5678   /* PREFIX_VEX_0F382B */
5679   {
5680     { Bad_Opcode },
5681     { Bad_Opcode },
5682     { VEX_W_TABLE (VEX_W_0F382B_P_2) },
5683   },
5684
5685   /* PREFIX_VEX_0F382C */
5686   {
5687     { Bad_Opcode },
5688     { Bad_Opcode },
5689      { MOD_TABLE (MOD_VEX_0F382C_PREFIX_2) },
5690   },
5691
5692   /* PREFIX_VEX_0F382D */
5693   {
5694     { Bad_Opcode },
5695     { Bad_Opcode },
5696      { MOD_TABLE (MOD_VEX_0F382D_PREFIX_2) },
5697   },
5698
5699   /* PREFIX_VEX_0F382E */
5700   {
5701     { Bad_Opcode },
5702     { Bad_Opcode },
5703      { MOD_TABLE (MOD_VEX_0F382E_PREFIX_2) },
5704   },
5705
5706   /* PREFIX_VEX_0F382F */
5707   {
5708     { Bad_Opcode },
5709     { Bad_Opcode },
5710      { MOD_TABLE (MOD_VEX_0F382F_PREFIX_2) },
5711   },
5712
5713   /* PREFIX_VEX_0F3830 */
5714   {
5715     { Bad_Opcode },
5716     { Bad_Opcode },
5717     { VEX_W_TABLE (VEX_W_0F3830_P_2) },
5718   },
5719
5720   /* PREFIX_VEX_0F3831 */
5721   {
5722     { Bad_Opcode },
5723     { Bad_Opcode },
5724     { VEX_W_TABLE (VEX_W_0F3831_P_2) },
5725   },
5726
5727   /* PREFIX_VEX_0F3832 */
5728   {
5729     { Bad_Opcode },
5730     { Bad_Opcode },
5731     { VEX_W_TABLE (VEX_W_0F3832_P_2) },
5732   },
5733
5734   /* PREFIX_VEX_0F3833 */
5735   {
5736     { Bad_Opcode },
5737     { Bad_Opcode },
5738     { VEX_W_TABLE (VEX_W_0F3833_P_2) },
5739   },
5740
5741   /* PREFIX_VEX_0F3834 */
5742   {
5743     { Bad_Opcode },
5744     { Bad_Opcode },
5745     { VEX_W_TABLE (VEX_W_0F3834_P_2) },
5746   },
5747
5748   /* PREFIX_VEX_0F3835 */
5749   {
5750     { Bad_Opcode },
5751     { Bad_Opcode },
5752     { VEX_W_TABLE (VEX_W_0F3835_P_2) },
5753   },
5754
5755   /* PREFIX_VEX_0F3836 */
5756   {
5757     { Bad_Opcode },
5758     { Bad_Opcode },
5759     { VEX_LEN_TABLE (VEX_LEN_0F3836_P_2) },
5760   },
5761
5762   /* PREFIX_VEX_0F3837 */
5763   {
5764     { Bad_Opcode },
5765     { Bad_Opcode },
5766     { VEX_W_TABLE (VEX_W_0F3837_P_2) },
5767   },
5768
5769   /* PREFIX_VEX_0F3838 */
5770   {
5771     { Bad_Opcode },
5772     { Bad_Opcode },
5773     { VEX_W_TABLE (VEX_W_0F3838_P_2) },
5774   },
5775
5776   /* PREFIX_VEX_0F3839 */
5777   {
5778     { Bad_Opcode },
5779     { Bad_Opcode },
5780     { VEX_W_TABLE (VEX_W_0F3839_P_2) },
5781   },
5782
5783   /* PREFIX_VEX_0F383A */
5784   {
5785     { Bad_Opcode },
5786     { Bad_Opcode },
5787     { VEX_W_TABLE (VEX_W_0F383A_P_2) },
5788   },
5789
5790   /* PREFIX_VEX_0F383B */
5791   {
5792     { Bad_Opcode },
5793     { Bad_Opcode },
5794     { VEX_W_TABLE (VEX_W_0F383B_P_2) },
5795   },
5796
5797   /* PREFIX_VEX_0F383C */
5798   {
5799     { Bad_Opcode },
5800     { Bad_Opcode },
5801     { VEX_W_TABLE (VEX_W_0F383C_P_2) },
5802   },
5803
5804   /* PREFIX_VEX_0F383D */
5805   {
5806     { Bad_Opcode },
5807     { Bad_Opcode },
5808     { VEX_W_TABLE (VEX_W_0F383D_P_2) },
5809   },
5810
5811   /* PREFIX_VEX_0F383E */
5812   {
5813     { Bad_Opcode },
5814     { Bad_Opcode },
5815     { VEX_W_TABLE (VEX_W_0F383E_P_2) },
5816   },
5817
5818   /* PREFIX_VEX_0F383F */
5819   {
5820     { Bad_Opcode },
5821     { Bad_Opcode },
5822     { VEX_W_TABLE (VEX_W_0F383F_P_2) },
5823   },
5824
5825   /* PREFIX_VEX_0F3840 */
5826   {
5827     { Bad_Opcode },
5828     { Bad_Opcode },
5829     { VEX_W_TABLE (VEX_W_0F3840_P_2) },
5830   },
5831
5832   /* PREFIX_VEX_0F3841 */
5833   {
5834     { Bad_Opcode },
5835     { Bad_Opcode },
5836     { VEX_LEN_TABLE (VEX_LEN_0F3841_P_2) },
5837   },
5838
5839   /* PREFIX_VEX_0F3845 */
5840   {
5841     { Bad_Opcode },
5842     { Bad_Opcode },
5843     { "vpsrlv%LW", { XM, Vex, EXx }, 0 },
5844   },
5845
5846   /* PREFIX_VEX_0F3846 */
5847   {
5848     { Bad_Opcode },
5849     { Bad_Opcode },
5850     { VEX_W_TABLE (VEX_W_0F3846_P_2) },
5851   },
5852
5853   /* PREFIX_VEX_0F3847 */
5854   {
5855     { Bad_Opcode },
5856     { Bad_Opcode },
5857     { "vpsllv%LW", { XM, Vex, EXx }, 0 },
5858   },
5859
5860   /* PREFIX_VEX_0F3858 */
5861   {
5862     { Bad_Opcode },
5863     { Bad_Opcode },
5864     { VEX_W_TABLE (VEX_W_0F3858_P_2) },
5865   },
5866
5867   /* PREFIX_VEX_0F3859 */
5868   {
5869     { Bad_Opcode },
5870     { Bad_Opcode },
5871     { VEX_W_TABLE (VEX_W_0F3859_P_2) },
5872   },
5873
5874   /* PREFIX_VEX_0F385A */
5875   {
5876     { Bad_Opcode },
5877     { Bad_Opcode },
5878     { MOD_TABLE (MOD_VEX_0F385A_PREFIX_2) },
5879   },
5880
5881   /* PREFIX_VEX_0F3878 */
5882   {
5883     { Bad_Opcode },
5884     { Bad_Opcode },
5885     { VEX_W_TABLE (VEX_W_0F3878_P_2) },
5886   },
5887
5888   /* PREFIX_VEX_0F3879 */
5889   {
5890     { Bad_Opcode },
5891     { Bad_Opcode },
5892     { VEX_W_TABLE (VEX_W_0F3879_P_2) },
5893   },
5894
5895   /* PREFIX_VEX_0F388C */
5896   {
5897     { Bad_Opcode },
5898     { Bad_Opcode },
5899     { MOD_TABLE (MOD_VEX_0F388C_PREFIX_2) },
5900   },
5901
5902   /* PREFIX_VEX_0F388E */
5903   {
5904     { Bad_Opcode },
5905     { Bad_Opcode },
5906     { MOD_TABLE (MOD_VEX_0F388E_PREFIX_2) },
5907   },
5908
5909   /* PREFIX_VEX_0F3890 */
5910   {
5911     { Bad_Opcode },
5912     { Bad_Opcode },
5913     { "vpgatherd%LW", { XM, MVexVSIBDWpX, Vex }, 0 },
5914   },
5915
5916   /* PREFIX_VEX_0F3891 */
5917   {
5918     { Bad_Opcode },
5919     { Bad_Opcode },
5920     { "vpgatherq%LW", { XMGatherQ, MVexVSIBQWpX, VexGatherQ }, 0 },
5921   },
5922
5923   /* PREFIX_VEX_0F3892 */
5924   {
5925     { Bad_Opcode },
5926     { Bad_Opcode },
5927     { "vgatherdp%XW", { XM, MVexVSIBDWpX, Vex }, 0 },
5928   },
5929
5930   /* PREFIX_VEX_0F3893 */
5931   {
5932     { Bad_Opcode },
5933     { Bad_Opcode },
5934     { "vgatherqp%XW", { XMGatherQ, MVexVSIBQWpX, VexGatherQ }, 0 },
5935   },
5936
5937   /* PREFIX_VEX_0F3896 */
5938   {
5939     { Bad_Opcode },
5940     { Bad_Opcode },
5941     { "vfmaddsub132p%XW", { XM, Vex, EXx }, 0 },
5942   },
5943
5944   /* PREFIX_VEX_0F3897 */
5945   {
5946     { Bad_Opcode },
5947     { Bad_Opcode },
5948     { "vfmsubadd132p%XW", { XM, Vex, EXx }, 0 },
5949   },
5950
5951   /* PREFIX_VEX_0F3898 */
5952   {
5953     { Bad_Opcode },
5954     { Bad_Opcode },
5955     { "vfmadd132p%XW", { XM, Vex, EXx }, 0 },
5956   },
5957
5958   /* PREFIX_VEX_0F3899 */
5959   {
5960     { Bad_Opcode },
5961     { Bad_Opcode },
5962     { "vfmadd132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
5963   },
5964
5965   /* PREFIX_VEX_0F389A */
5966   {
5967     { Bad_Opcode },
5968     { Bad_Opcode },
5969     { "vfmsub132p%XW", { XM, Vex, EXx }, 0 },
5970   },
5971
5972   /* PREFIX_VEX_0F389B */
5973   {
5974     { Bad_Opcode },
5975     { Bad_Opcode },
5976     { "vfmsub132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
5977   },
5978
5979   /* PREFIX_VEX_0F389C */
5980   {
5981     { Bad_Opcode },
5982     { Bad_Opcode },
5983     { "vfnmadd132p%XW", { XM, Vex, EXx }, 0 },
5984   },
5985
5986   /* PREFIX_VEX_0F389D */
5987   {
5988     { Bad_Opcode },
5989     { Bad_Opcode },
5990     { "vfnmadd132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
5991   },
5992
5993   /* PREFIX_VEX_0F389E */
5994   {
5995     { Bad_Opcode },
5996     { Bad_Opcode },
5997     { "vfnmsub132p%XW", { XM, Vex, EXx }, 0 },
5998   },
5999
6000   /* PREFIX_VEX_0F389F */
6001   {
6002     { Bad_Opcode },
6003     { Bad_Opcode },
6004     { "vfnmsub132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6005   },
6006
6007   /* PREFIX_VEX_0F38A6 */
6008   {
6009     { Bad_Opcode },
6010     { Bad_Opcode },
6011     { "vfmaddsub213p%XW", { XM, Vex, EXx }, 0 },
6012     { Bad_Opcode },
6013   },
6014
6015   /* PREFIX_VEX_0F38A7 */
6016   {
6017     { Bad_Opcode },
6018     { Bad_Opcode },
6019     { "vfmsubadd213p%XW", { XM, Vex, EXx }, 0 },
6020   },
6021
6022   /* PREFIX_VEX_0F38A8 */
6023   {
6024     { Bad_Opcode },
6025     { Bad_Opcode },
6026     { "vfmadd213p%XW", { XM, Vex, EXx }, 0 },
6027   },
6028
6029   /* PREFIX_VEX_0F38A9 */
6030   {
6031     { Bad_Opcode },
6032     { Bad_Opcode },
6033     { "vfmadd213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6034   },
6035
6036   /* PREFIX_VEX_0F38AA */
6037   {
6038     { Bad_Opcode },
6039     { Bad_Opcode },
6040     { "vfmsub213p%XW", { XM, Vex, EXx }, 0 },
6041   },
6042
6043   /* PREFIX_VEX_0F38AB */
6044   {
6045     { Bad_Opcode },
6046     { Bad_Opcode },
6047     { "vfmsub213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6048   },
6049
6050   /* PREFIX_VEX_0F38AC */
6051   {
6052     { Bad_Opcode },
6053     { Bad_Opcode },
6054     { "vfnmadd213p%XW", { XM, Vex, EXx }, 0 },
6055   },
6056
6057   /* PREFIX_VEX_0F38AD */
6058   {
6059     { Bad_Opcode },
6060     { Bad_Opcode },
6061     { "vfnmadd213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6062   },
6063
6064   /* PREFIX_VEX_0F38AE */
6065   {
6066     { Bad_Opcode },
6067     { Bad_Opcode },
6068     { "vfnmsub213p%XW", { XM, Vex, EXx }, 0 },
6069   },
6070
6071   /* PREFIX_VEX_0F38AF */
6072   {
6073     { Bad_Opcode },
6074     { Bad_Opcode },
6075     { "vfnmsub213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6076   },
6077
6078   /* PREFIX_VEX_0F38B6 */
6079   {
6080     { Bad_Opcode },
6081     { Bad_Opcode },
6082     { "vfmaddsub231p%XW", { XM, Vex, EXx }, 0 },
6083   },
6084
6085   /* PREFIX_VEX_0F38B7 */
6086   {
6087     { Bad_Opcode },
6088     { Bad_Opcode },
6089     { "vfmsubadd231p%XW", { XM, Vex, EXx }, 0 },
6090   },
6091
6092   /* PREFIX_VEX_0F38B8 */
6093   {
6094     { Bad_Opcode },
6095     { Bad_Opcode },
6096     { "vfmadd231p%XW", { XM, Vex, EXx }, 0 },
6097   },
6098
6099   /* PREFIX_VEX_0F38B9 */
6100   {
6101     { Bad_Opcode },
6102     { Bad_Opcode },
6103     { "vfmadd231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6104   },
6105
6106   /* PREFIX_VEX_0F38BA */
6107   {
6108     { Bad_Opcode },
6109     { Bad_Opcode },
6110     { "vfmsub231p%XW", { XM, Vex, EXx }, 0 },
6111   },
6112
6113   /* PREFIX_VEX_0F38BB */
6114   {
6115     { Bad_Opcode },
6116     { Bad_Opcode },
6117     { "vfmsub231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6118   },
6119
6120   /* PREFIX_VEX_0F38BC */
6121   {
6122     { Bad_Opcode },
6123     { Bad_Opcode },
6124     { "vfnmadd231p%XW", { XM, Vex, EXx }, 0 },
6125   },
6126
6127   /* PREFIX_VEX_0F38BD */
6128   {
6129     { Bad_Opcode },
6130     { Bad_Opcode },
6131     { "vfnmadd231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6132   },
6133
6134   /* PREFIX_VEX_0F38BE */
6135   {
6136     { Bad_Opcode },
6137     { Bad_Opcode },
6138     { "vfnmsub231p%XW", { XM, Vex, EXx }, 0 },
6139   },
6140
6141   /* PREFIX_VEX_0F38BF */
6142   {
6143     { Bad_Opcode },
6144     { Bad_Opcode },
6145     { "vfnmsub231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6146   },
6147
6148   /* PREFIX_VEX_0F38DB */
6149   {
6150     { Bad_Opcode },
6151     { Bad_Opcode },
6152     { VEX_LEN_TABLE (VEX_LEN_0F38DB_P_2) },
6153   },
6154
6155   /* PREFIX_VEX_0F38DC */
6156   {
6157     { Bad_Opcode },
6158     { Bad_Opcode },
6159     { VEX_LEN_TABLE (VEX_LEN_0F38DC_P_2) },
6160   },
6161
6162   /* PREFIX_VEX_0F38DD */
6163   {
6164     { Bad_Opcode },
6165     { Bad_Opcode },
6166     { VEX_LEN_TABLE (VEX_LEN_0F38DD_P_2) },
6167   },
6168
6169   /* PREFIX_VEX_0F38DE */
6170   {
6171     { Bad_Opcode },
6172     { Bad_Opcode },
6173     { VEX_LEN_TABLE (VEX_LEN_0F38DE_P_2) },
6174   },
6175
6176   /* PREFIX_VEX_0F38DF */
6177   {
6178     { Bad_Opcode },
6179     { Bad_Opcode },
6180     { VEX_LEN_TABLE (VEX_LEN_0F38DF_P_2) },
6181   },
6182
6183   /* PREFIX_VEX_0F38F2 */
6184   {
6185     { VEX_LEN_TABLE (VEX_LEN_0F38F2_P_0) },
6186   },
6187
6188   /* PREFIX_VEX_0F38F3_REG_1 */
6189   {
6190     { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_1_P_0) },
6191   },
6192
6193   /* PREFIX_VEX_0F38F3_REG_2 */
6194   {
6195     { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_2_P_0) },
6196   },
6197
6198   /* PREFIX_VEX_0F38F3_REG_3 */
6199   {
6200     { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_3_P_0) },
6201   },
6202
6203   /* PREFIX_VEX_0F38F5 */
6204   {
6205     { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_0) },
6206     { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_1) },
6207     { Bad_Opcode },
6208     { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_3) },
6209   },
6210
6211   /* PREFIX_VEX_0F38F6 */
6212   {
6213     { Bad_Opcode },
6214     { Bad_Opcode },
6215     { Bad_Opcode },
6216     { VEX_LEN_TABLE (VEX_LEN_0F38F6_P_3) },
6217   },
6218
6219   /* PREFIX_VEX_0F38F7 */
6220   {
6221     { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_0) },
6222     { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_1) },
6223     { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_2) },
6224     { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_3) },
6225   },
6226
6227   /* PREFIX_VEX_0F3A00 */
6228   {
6229     { Bad_Opcode },
6230     { Bad_Opcode },
6231     { VEX_LEN_TABLE (VEX_LEN_0F3A00_P_2) },
6232   },
6233
6234   /* PREFIX_VEX_0F3A01 */
6235   {
6236     { Bad_Opcode },
6237     { Bad_Opcode },
6238     { VEX_LEN_TABLE (VEX_LEN_0F3A01_P_2) },
6239   },
6240
6241   /* PREFIX_VEX_0F3A02 */
6242   {
6243     { Bad_Opcode },
6244     { Bad_Opcode },
6245     { VEX_W_TABLE (VEX_W_0F3A02_P_2) },
6246   },
6247
6248   /* PREFIX_VEX_0F3A04 */
6249   {
6250     { Bad_Opcode },
6251     { Bad_Opcode },
6252     { VEX_W_TABLE (VEX_W_0F3A04_P_2) },
6253   },
6254
6255   /* PREFIX_VEX_0F3A05 */
6256   {
6257     { Bad_Opcode },
6258     { Bad_Opcode },
6259     { VEX_W_TABLE (VEX_W_0F3A05_P_2) },
6260   },
6261
6262   /* PREFIX_VEX_0F3A06 */
6263   {
6264     { Bad_Opcode },
6265     { Bad_Opcode },
6266     { VEX_LEN_TABLE (VEX_LEN_0F3A06_P_2) },
6267   },
6268
6269   /* PREFIX_VEX_0F3A08 */
6270   {
6271     { Bad_Opcode },
6272     { Bad_Opcode },
6273     { VEX_W_TABLE (VEX_W_0F3A08_P_2) },
6274   },
6275
6276   /* PREFIX_VEX_0F3A09 */
6277   {
6278     { Bad_Opcode },
6279     { Bad_Opcode },
6280     { VEX_W_TABLE (VEX_W_0F3A09_P_2) },
6281   },
6282
6283   /* PREFIX_VEX_0F3A0A */
6284   {
6285     { Bad_Opcode },
6286     { Bad_Opcode },
6287     { VEX_LEN_TABLE (VEX_LEN_0F3A0A_P_2) },
6288   },
6289
6290   /* PREFIX_VEX_0F3A0B */
6291   {
6292     { Bad_Opcode },
6293     { Bad_Opcode },
6294     { VEX_LEN_TABLE (VEX_LEN_0F3A0B_P_2) },
6295   },
6296
6297   /* PREFIX_VEX_0F3A0C */
6298   {
6299     { Bad_Opcode },
6300     { Bad_Opcode },
6301     { VEX_W_TABLE (VEX_W_0F3A0C_P_2) },
6302   },
6303
6304   /* PREFIX_VEX_0F3A0D */
6305   {
6306     { Bad_Opcode },
6307     { Bad_Opcode },
6308     { VEX_W_TABLE (VEX_W_0F3A0D_P_2) },
6309   },
6310
6311   /* PREFIX_VEX_0F3A0E */
6312   {
6313     { Bad_Opcode },
6314     { Bad_Opcode },
6315     { VEX_W_TABLE (VEX_W_0F3A0E_P_2) },
6316   },
6317
6318   /* PREFIX_VEX_0F3A0F */
6319   {
6320     { Bad_Opcode },
6321     { Bad_Opcode },
6322     { VEX_W_TABLE (VEX_W_0F3A0F_P_2) },
6323   },
6324
6325   /* PREFIX_VEX_0F3A14 */
6326   {
6327     { Bad_Opcode },
6328     { Bad_Opcode },
6329     { VEX_LEN_TABLE (VEX_LEN_0F3A14_P_2) },
6330   },
6331
6332   /* PREFIX_VEX_0F3A15 */
6333   {
6334     { Bad_Opcode },
6335     { Bad_Opcode },
6336     { VEX_LEN_TABLE (VEX_LEN_0F3A15_P_2) },
6337   },
6338
6339   /* PREFIX_VEX_0F3A16 */
6340   {
6341     { Bad_Opcode },
6342     { Bad_Opcode },
6343     { VEX_LEN_TABLE (VEX_LEN_0F3A16_P_2) },
6344   },
6345
6346   /* PREFIX_VEX_0F3A17 */
6347   {
6348     { Bad_Opcode },
6349     { Bad_Opcode },
6350     { VEX_LEN_TABLE (VEX_LEN_0F3A17_P_2) },
6351   },
6352
6353   /* PREFIX_VEX_0F3A18 */
6354   {
6355     { Bad_Opcode },
6356     { Bad_Opcode },
6357     { VEX_LEN_TABLE (VEX_LEN_0F3A18_P_2) },
6358   },
6359
6360   /* PREFIX_VEX_0F3A19 */
6361   {
6362     { Bad_Opcode },
6363     { Bad_Opcode },
6364     { VEX_LEN_TABLE (VEX_LEN_0F3A19_P_2) },
6365   },
6366
6367   /* PREFIX_VEX_0F3A1D */
6368   {
6369     { Bad_Opcode },
6370     { Bad_Opcode },
6371     { "vcvtps2ph", { EXxmmq, XM, Ib }, 0 },
6372   },
6373
6374   /* PREFIX_VEX_0F3A20 */
6375   {
6376     { Bad_Opcode },
6377     { Bad_Opcode },
6378     { VEX_LEN_TABLE (VEX_LEN_0F3A20_P_2) },
6379   },
6380
6381   /* PREFIX_VEX_0F3A21 */
6382   {
6383     { Bad_Opcode },
6384     { Bad_Opcode },
6385     { VEX_LEN_TABLE (VEX_LEN_0F3A21_P_2) },
6386   },
6387
6388   /* PREFIX_VEX_0F3A22 */
6389   {
6390     { Bad_Opcode },
6391     { Bad_Opcode },
6392     { VEX_LEN_TABLE (VEX_LEN_0F3A22_P_2) },
6393   },
6394
6395   /* PREFIX_VEX_0F3A30 */
6396   {
6397     { Bad_Opcode },
6398     { Bad_Opcode },
6399     { VEX_LEN_TABLE (VEX_LEN_0F3A30_P_2) },
6400   },
6401
6402   /* PREFIX_VEX_0F3A31 */
6403   {
6404     { Bad_Opcode },
6405     { Bad_Opcode },
6406     { VEX_LEN_TABLE (VEX_LEN_0F3A31_P_2) },
6407   },
6408
6409   /* PREFIX_VEX_0F3A32 */
6410   {
6411     { Bad_Opcode },
6412     { Bad_Opcode },
6413     { VEX_LEN_TABLE (VEX_LEN_0F3A32_P_2) },
6414   },
6415
6416   /* PREFIX_VEX_0F3A33 */
6417   {
6418     { Bad_Opcode },
6419     { Bad_Opcode },
6420     { VEX_LEN_TABLE (VEX_LEN_0F3A33_P_2) },
6421   },
6422
6423   /* PREFIX_VEX_0F3A38 */
6424   {
6425     { Bad_Opcode },
6426     { Bad_Opcode },
6427     { VEX_LEN_TABLE (VEX_LEN_0F3A38_P_2) },
6428   },
6429
6430   /* PREFIX_VEX_0F3A39 */
6431   {
6432     { Bad_Opcode },
6433     { Bad_Opcode },
6434     { VEX_LEN_TABLE (VEX_LEN_0F3A39_P_2) },
6435   },
6436
6437   /* PREFIX_VEX_0F3A40 */
6438   {
6439     { Bad_Opcode },
6440     { Bad_Opcode },
6441     { VEX_W_TABLE (VEX_W_0F3A40_P_2) },
6442   },
6443
6444   /* PREFIX_VEX_0F3A41 */
6445   {
6446     { Bad_Opcode },
6447     { Bad_Opcode },
6448     { VEX_LEN_TABLE (VEX_LEN_0F3A41_P_2) },
6449   },
6450
6451   /* PREFIX_VEX_0F3A42 */
6452   {
6453     { Bad_Opcode },
6454     { Bad_Opcode },
6455     { VEX_W_TABLE (VEX_W_0F3A42_P_2) },
6456   },
6457
6458   /* PREFIX_VEX_0F3A44 */
6459   {
6460     { Bad_Opcode },
6461     { Bad_Opcode },
6462     { VEX_LEN_TABLE (VEX_LEN_0F3A44_P_2) },
6463   },
6464
6465   /* PREFIX_VEX_0F3A46 */
6466   {
6467     { Bad_Opcode },
6468     { Bad_Opcode },
6469     { VEX_LEN_TABLE (VEX_LEN_0F3A46_P_2) },
6470   },
6471
6472   /* PREFIX_VEX_0F3A48 */
6473   {
6474     { Bad_Opcode },
6475     { Bad_Opcode },
6476     { VEX_W_TABLE (VEX_W_0F3A48_P_2) },
6477   },
6478
6479   /* PREFIX_VEX_0F3A49 */
6480   {
6481     { Bad_Opcode },
6482     { Bad_Opcode },
6483     { VEX_W_TABLE (VEX_W_0F3A49_P_2) },
6484   },
6485
6486   /* PREFIX_VEX_0F3A4A */
6487   {
6488     { Bad_Opcode },
6489     { Bad_Opcode },
6490     { VEX_W_TABLE (VEX_W_0F3A4A_P_2) },
6491   },
6492
6493   /* PREFIX_VEX_0F3A4B */
6494   {
6495     { Bad_Opcode },
6496     { Bad_Opcode },
6497     { VEX_W_TABLE (VEX_W_0F3A4B_P_2) },
6498   },
6499
6500   /* PREFIX_VEX_0F3A4C */
6501   {
6502     { Bad_Opcode },
6503     { Bad_Opcode },
6504     { VEX_W_TABLE (VEX_W_0F3A4C_P_2) },
6505   },
6506
6507   /* PREFIX_VEX_0F3A5C */
6508   {
6509     { Bad_Opcode },
6510     { Bad_Opcode },
6511     { "vfmaddsubps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
6512   },
6513
6514   /* PREFIX_VEX_0F3A5D */
6515   {
6516     { Bad_Opcode },
6517     { Bad_Opcode },
6518     { "vfmaddsubpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
6519   },
6520
6521   /* PREFIX_VEX_0F3A5E */
6522   {
6523     { Bad_Opcode },
6524     { Bad_Opcode },
6525     { "vfmsubaddps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
6526   },
6527
6528   /* PREFIX_VEX_0F3A5F */
6529   {
6530     { Bad_Opcode },
6531     { Bad_Opcode },
6532     { "vfmsubaddpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
6533   },
6534
6535   /* PREFIX_VEX_0F3A60 */
6536   {
6537     { Bad_Opcode },
6538     { Bad_Opcode },
6539     { VEX_LEN_TABLE (VEX_LEN_0F3A60_P_2) },
6540     { Bad_Opcode },
6541   },
6542
6543   /* PREFIX_VEX_0F3A61 */
6544   {
6545     { Bad_Opcode },
6546     { Bad_Opcode },
6547     { VEX_LEN_TABLE (VEX_LEN_0F3A61_P_2) },
6548   },
6549
6550   /* PREFIX_VEX_0F3A62 */
6551   {
6552     { Bad_Opcode },
6553     { Bad_Opcode },
6554     { VEX_LEN_TABLE (VEX_LEN_0F3A62_P_2) },
6555   },
6556
6557   /* PREFIX_VEX_0F3A63 */
6558   {
6559     { Bad_Opcode },
6560     { Bad_Opcode },
6561     { VEX_LEN_TABLE (VEX_LEN_0F3A63_P_2) },
6562   },
6563
6564   /* PREFIX_VEX_0F3A68 */
6565   {
6566     { Bad_Opcode },
6567     { Bad_Opcode },
6568     { "vfmaddps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
6569   },
6570
6571   /* PREFIX_VEX_0F3A69 */
6572   {
6573     { Bad_Opcode },
6574     { Bad_Opcode },
6575     { "vfmaddpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
6576   },
6577
6578   /* PREFIX_VEX_0F3A6A */
6579   {
6580     { Bad_Opcode },
6581     { Bad_Opcode },
6582     { VEX_LEN_TABLE (VEX_LEN_0F3A6A_P_2) },
6583   },
6584
6585   /* PREFIX_VEX_0F3A6B */
6586   {
6587     { Bad_Opcode },
6588     { Bad_Opcode },
6589     { VEX_LEN_TABLE (VEX_LEN_0F3A6B_P_2) },
6590   },
6591
6592   /* PREFIX_VEX_0F3A6C */
6593   {
6594     { Bad_Opcode },
6595     { Bad_Opcode },
6596     { "vfmsubps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
6597   },
6598
6599   /* PREFIX_VEX_0F3A6D */
6600   {
6601     { Bad_Opcode },
6602     { Bad_Opcode },
6603     { "vfmsubpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
6604   },
6605
6606   /* PREFIX_VEX_0F3A6E */
6607   {
6608     { Bad_Opcode },
6609     { Bad_Opcode },
6610     { VEX_LEN_TABLE (VEX_LEN_0F3A6E_P_2) },
6611   },
6612
6613   /* PREFIX_VEX_0F3A6F */
6614   {
6615     { Bad_Opcode },
6616     { Bad_Opcode },
6617     { VEX_LEN_TABLE (VEX_LEN_0F3A6F_P_2) },
6618   },
6619
6620   /* PREFIX_VEX_0F3A78 */
6621   {
6622     { Bad_Opcode },
6623     { Bad_Opcode },
6624     { "vfnmaddps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
6625   },
6626
6627   /* PREFIX_VEX_0F3A79 */
6628   {
6629     { Bad_Opcode },
6630     { Bad_Opcode },
6631     { "vfnmaddpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
6632   },
6633
6634   /* PREFIX_VEX_0F3A7A */
6635   {
6636     { Bad_Opcode },
6637     { Bad_Opcode },
6638     { VEX_LEN_TABLE (VEX_LEN_0F3A7A_P_2) },
6639   },
6640
6641   /* PREFIX_VEX_0F3A7B */
6642   {
6643     { Bad_Opcode },
6644     { Bad_Opcode },
6645     { VEX_LEN_TABLE (VEX_LEN_0F3A7B_P_2) },
6646   },
6647
6648   /* PREFIX_VEX_0F3A7C */
6649   {
6650     { Bad_Opcode },
6651     { Bad_Opcode },
6652     { "vfnmsubps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
6653     { Bad_Opcode },
6654   },
6655
6656   /* PREFIX_VEX_0F3A7D */
6657   {
6658     { Bad_Opcode },
6659     { Bad_Opcode },
6660     { "vfnmsubpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
6661   },
6662
6663   /* PREFIX_VEX_0F3A7E */
6664   {
6665     { Bad_Opcode },
6666     { Bad_Opcode },
6667     { VEX_LEN_TABLE (VEX_LEN_0F3A7E_P_2) },
6668   },
6669
6670   /* PREFIX_VEX_0F3A7F */
6671   {
6672     { Bad_Opcode },
6673     { Bad_Opcode },
6674     { VEX_LEN_TABLE (VEX_LEN_0F3A7F_P_2) },
6675   },
6676
6677   /* PREFIX_VEX_0F3ADF */
6678   {
6679     { Bad_Opcode },
6680     { Bad_Opcode },
6681     { VEX_LEN_TABLE (VEX_LEN_0F3ADF_P_2) },
6682   },
6683
6684   /* PREFIX_VEX_0F3AF0 */
6685   {
6686     { Bad_Opcode },
6687     { Bad_Opcode },
6688     { Bad_Opcode },
6689     { VEX_LEN_TABLE (VEX_LEN_0F3AF0_P_3) },
6690   },
6691
6692 #define NEED_PREFIX_TABLE
6693 #include "i386-dis-evex.h"
6694 #undef NEED_PREFIX_TABLE
6695 };
6696
6697 static const struct dis386 x86_64_table[][2] = {
6698   /* X86_64_06 */
6699   {
6700     { "pushP", { es }, 0 },
6701   },
6702
6703   /* X86_64_07 */
6704   {
6705     { "popP", { es }, 0 },
6706   },
6707
6708   /* X86_64_0D */
6709   {
6710     { "pushP", { cs }, 0 },
6711   },
6712
6713   /* X86_64_16 */
6714   {
6715     { "pushP", { ss }, 0 },
6716   },
6717
6718   /* X86_64_17 */
6719   {
6720     { "popP", { ss }, 0 },
6721   },
6722
6723   /* X86_64_1E */
6724   {
6725     { "pushP", { ds }, 0 },
6726   },
6727
6728   /* X86_64_1F */
6729   {
6730     { "popP", { ds }, 0 },
6731   },
6732
6733   /* X86_64_27 */
6734   {
6735     { "daa", { XX }, 0 },
6736   },
6737
6738   /* X86_64_2F */
6739   {
6740     { "das", { XX }, 0 },
6741   },
6742
6743   /* X86_64_37 */
6744   {
6745     { "aaa", { XX }, 0 },
6746   },
6747
6748   /* X86_64_3F */
6749   {
6750     { "aas", { XX }, 0 },
6751   },
6752
6753   /* X86_64_60 */
6754   {
6755     { "pushaP", { XX }, 0 },
6756   },
6757
6758   /* X86_64_61 */
6759   {
6760     { "popaP", { XX }, 0 },
6761   },
6762
6763   /* X86_64_62 */
6764   {
6765     { MOD_TABLE (MOD_62_32BIT) },
6766     { EVEX_TABLE (EVEX_0F) },
6767   },
6768
6769   /* X86_64_63 */
6770   {
6771     { "arpl", { Ew, Gw }, 0 },
6772     { "movs{lq|xd}", { Gv, Ed }, 0 },
6773   },
6774
6775   /* X86_64_6D */
6776   {
6777     { "ins{R|}", { Yzr, indirDX }, 0 },
6778     { "ins{G|}", { Yzr, indirDX }, 0 },
6779   },
6780
6781   /* X86_64_6F */
6782   {
6783     { "outs{R|}", { indirDXr, Xz }, 0 },
6784     { "outs{G|}", { indirDXr, Xz }, 0 },
6785   },
6786
6787   /* X86_64_9A */
6788   {
6789     { "Jcall{T|}", { Ap }, 0 },
6790   },
6791
6792   /* X86_64_C4 */
6793   {
6794     { MOD_TABLE (MOD_C4_32BIT) },
6795     { VEX_C4_TABLE (VEX_0F) },
6796   },
6797
6798   /* X86_64_C5 */
6799   {
6800     { MOD_TABLE (MOD_C5_32BIT) },
6801     { VEX_C5_TABLE (VEX_0F) },
6802   },
6803
6804   /* X86_64_CE */
6805   {
6806     { "into", { XX }, 0 },
6807   },
6808
6809   /* X86_64_D4 */
6810   {
6811     { "aam", { Ib }, 0 },
6812   },
6813
6814   /* X86_64_D5 */
6815   {
6816     { "aad", { Ib }, 0 },
6817   },
6818
6819   /* X86_64_EA */
6820   {
6821     { "Jjmp{T|}", { Ap }, 0 },
6822   },
6823
6824   /* X86_64_0F01_REG_0 */
6825   {
6826     { "sgdt{Q|IQ}", { M }, 0 },
6827     { "sgdt", { M }, 0 },
6828   },
6829
6830   /* X86_64_0F01_REG_1 */
6831   {
6832     { "sidt{Q|IQ}", { M }, 0 },
6833     { "sidt", { M }, 0 },
6834   },
6835
6836   /* X86_64_0F01_REG_2 */
6837   {
6838     { "lgdt{Q|Q}", { M }, 0 },
6839     { "lgdt", { M }, 0 },
6840   },
6841
6842   /* X86_64_0F01_REG_3 */
6843   {
6844     { "lidt{Q|Q}", { M }, 0 },
6845     { "lidt", { M }, 0 },
6846   },
6847 };
6848
6849 static const struct dis386 three_byte_table[][256] = {
6850
6851   /* THREE_BYTE_0F38 */
6852   {
6853     /* 00 */
6854     { "pshufb",         { MX, EM }, PREFIX_MANDATORY },
6855     { "phaddw",         { MX, EM }, PREFIX_MANDATORY },
6856     { "phaddd",         { MX, EM }, PREFIX_MANDATORY },
6857     { "phaddsw",        { MX, EM }, PREFIX_MANDATORY },
6858     { "pmaddubsw",      { MX, EM }, PREFIX_MANDATORY },
6859     { "phsubw",         { MX, EM }, PREFIX_MANDATORY },
6860     { "phsubd",         { MX, EM }, PREFIX_MANDATORY },
6861     { "phsubsw",        { MX, EM }, PREFIX_MANDATORY },
6862     /* 08 */
6863     { "psignb",         { MX, EM }, PREFIX_MANDATORY },
6864     { "psignw",         { MX, EM }, PREFIX_MANDATORY },
6865     { "psignd",         { MX, EM }, PREFIX_MANDATORY },
6866     { "pmulhrsw",       { MX, EM }, PREFIX_MANDATORY },
6867     { Bad_Opcode },
6868     { Bad_Opcode },
6869     { Bad_Opcode },
6870     { Bad_Opcode },
6871     /* 10 */
6872     { PREFIX_TABLE (PREFIX_0F3810) },
6873     { Bad_Opcode },
6874     { Bad_Opcode },
6875     { Bad_Opcode },
6876     { PREFIX_TABLE (PREFIX_0F3814) },
6877     { PREFIX_TABLE (PREFIX_0F3815) },
6878     { Bad_Opcode },
6879     { PREFIX_TABLE (PREFIX_0F3817) },
6880     /* 18 */
6881     { Bad_Opcode },
6882     { Bad_Opcode },
6883     { Bad_Opcode },
6884     { Bad_Opcode },
6885     { "pabsb",          { MX, EM }, PREFIX_MANDATORY },
6886     { "pabsw",          { MX, EM }, PREFIX_MANDATORY },
6887     { "pabsd",          { MX, EM }, PREFIX_MANDATORY },
6888     { Bad_Opcode },
6889     /* 20 */
6890     { PREFIX_TABLE (PREFIX_0F3820) },
6891     { PREFIX_TABLE (PREFIX_0F3821) },
6892     { PREFIX_TABLE (PREFIX_0F3822) },
6893     { PREFIX_TABLE (PREFIX_0F3823) },
6894     { PREFIX_TABLE (PREFIX_0F3824) },
6895     { PREFIX_TABLE (PREFIX_0F3825) },
6896     { Bad_Opcode },
6897     { Bad_Opcode },
6898     /* 28 */
6899     { PREFIX_TABLE (PREFIX_0F3828) },
6900     { PREFIX_TABLE (PREFIX_0F3829) },
6901     { PREFIX_TABLE (PREFIX_0F382A) },
6902     { PREFIX_TABLE (PREFIX_0F382B) },
6903     { Bad_Opcode },
6904     { Bad_Opcode },
6905     { Bad_Opcode },
6906     { Bad_Opcode },
6907     /* 30 */
6908     { PREFIX_TABLE (PREFIX_0F3830) },
6909     { PREFIX_TABLE (PREFIX_0F3831) },
6910     { PREFIX_TABLE (PREFIX_0F3832) },
6911     { PREFIX_TABLE (PREFIX_0F3833) },
6912     { PREFIX_TABLE (PREFIX_0F3834) },
6913     { PREFIX_TABLE (PREFIX_0F3835) },
6914     { Bad_Opcode },
6915     { PREFIX_TABLE (PREFIX_0F3837) },
6916     /* 38 */
6917     { PREFIX_TABLE (PREFIX_0F3838) },
6918     { PREFIX_TABLE (PREFIX_0F3839) },
6919     { PREFIX_TABLE (PREFIX_0F383A) },
6920     { PREFIX_TABLE (PREFIX_0F383B) },
6921     { PREFIX_TABLE (PREFIX_0F383C) },
6922     { PREFIX_TABLE (PREFIX_0F383D) },
6923     { PREFIX_TABLE (PREFIX_0F383E) },
6924     { PREFIX_TABLE (PREFIX_0F383F) },
6925     /* 40 */
6926     { PREFIX_TABLE (PREFIX_0F3840) },
6927     { PREFIX_TABLE (PREFIX_0F3841) },
6928     { Bad_Opcode },
6929     { Bad_Opcode },
6930     { Bad_Opcode },
6931     { Bad_Opcode },
6932     { Bad_Opcode },
6933     { Bad_Opcode },
6934     /* 48 */
6935     { Bad_Opcode },
6936     { Bad_Opcode },
6937     { Bad_Opcode },
6938     { Bad_Opcode },
6939     { Bad_Opcode },
6940     { Bad_Opcode },
6941     { Bad_Opcode },
6942     { Bad_Opcode },
6943     /* 50 */
6944     { Bad_Opcode },
6945     { Bad_Opcode },
6946     { Bad_Opcode },
6947     { Bad_Opcode },
6948     { Bad_Opcode },
6949     { Bad_Opcode },
6950     { Bad_Opcode },
6951     { Bad_Opcode },
6952     /* 58 */
6953     { Bad_Opcode },
6954     { Bad_Opcode },
6955     { Bad_Opcode },
6956     { Bad_Opcode },
6957     { Bad_Opcode },
6958     { Bad_Opcode },
6959     { Bad_Opcode },
6960     { Bad_Opcode },
6961     /* 60 */
6962     { Bad_Opcode },
6963     { Bad_Opcode },
6964     { Bad_Opcode },
6965     { Bad_Opcode },
6966     { Bad_Opcode },
6967     { Bad_Opcode },
6968     { Bad_Opcode },
6969     { Bad_Opcode },
6970     /* 68 */
6971     { Bad_Opcode },
6972     { Bad_Opcode },
6973     { Bad_Opcode },
6974     { Bad_Opcode },
6975     { Bad_Opcode },
6976     { Bad_Opcode },
6977     { Bad_Opcode },
6978     { Bad_Opcode },
6979     /* 70 */
6980     { Bad_Opcode },
6981     { Bad_Opcode },
6982     { Bad_Opcode },
6983     { Bad_Opcode },
6984     { Bad_Opcode },
6985     { Bad_Opcode },
6986     { Bad_Opcode },
6987     { Bad_Opcode },
6988     /* 78 */
6989     { Bad_Opcode },
6990     { Bad_Opcode },
6991     { Bad_Opcode },
6992     { Bad_Opcode },
6993     { Bad_Opcode },
6994     { Bad_Opcode },
6995     { Bad_Opcode },
6996     { Bad_Opcode },
6997     /* 80 */
6998     { PREFIX_TABLE (PREFIX_0F3880) },
6999     { PREFIX_TABLE (PREFIX_0F3881) },
7000     { PREFIX_TABLE (PREFIX_0F3882) },
7001     { Bad_Opcode },
7002     { Bad_Opcode },
7003     { Bad_Opcode },
7004     { Bad_Opcode },
7005     { Bad_Opcode },
7006     /* 88 */
7007     { Bad_Opcode },
7008     { Bad_Opcode },
7009     { Bad_Opcode },
7010     { Bad_Opcode },
7011     { Bad_Opcode },
7012     { Bad_Opcode },
7013     { Bad_Opcode },
7014     { Bad_Opcode },
7015     /* 90 */
7016     { Bad_Opcode },
7017     { Bad_Opcode },
7018     { Bad_Opcode },
7019     { Bad_Opcode },
7020     { Bad_Opcode },
7021     { Bad_Opcode },
7022     { Bad_Opcode },
7023     { Bad_Opcode },
7024     /* 98 */
7025     { Bad_Opcode },
7026     { Bad_Opcode },
7027     { Bad_Opcode },
7028     { Bad_Opcode },
7029     { Bad_Opcode },
7030     { Bad_Opcode },
7031     { Bad_Opcode },
7032     { Bad_Opcode },
7033     /* a0 */
7034     { Bad_Opcode },
7035     { Bad_Opcode },
7036     { Bad_Opcode },
7037     { Bad_Opcode },
7038     { Bad_Opcode },
7039     { Bad_Opcode },
7040     { Bad_Opcode },
7041     { Bad_Opcode },
7042     /* a8 */
7043     { Bad_Opcode },
7044     { Bad_Opcode },
7045     { Bad_Opcode },
7046     { Bad_Opcode },
7047     { Bad_Opcode },
7048     { Bad_Opcode },
7049     { Bad_Opcode },
7050     { Bad_Opcode },
7051     /* b0 */
7052     { Bad_Opcode },
7053     { Bad_Opcode },
7054     { Bad_Opcode },
7055     { Bad_Opcode },
7056     { Bad_Opcode },
7057     { Bad_Opcode },
7058     { Bad_Opcode },
7059     { Bad_Opcode },
7060     /* b8 */
7061     { Bad_Opcode },
7062     { Bad_Opcode },
7063     { Bad_Opcode },
7064     { Bad_Opcode },
7065     { Bad_Opcode },
7066     { Bad_Opcode },
7067     { Bad_Opcode },
7068     { Bad_Opcode },
7069     /* c0 */
7070     { Bad_Opcode },
7071     { Bad_Opcode },
7072     { Bad_Opcode },
7073     { Bad_Opcode },
7074     { Bad_Opcode },
7075     { Bad_Opcode },
7076     { Bad_Opcode },
7077     { Bad_Opcode },
7078     /* c8 */
7079     { PREFIX_TABLE (PREFIX_0F38C8) },
7080     { PREFIX_TABLE (PREFIX_0F38C9) },
7081     { PREFIX_TABLE (PREFIX_0F38CA) },
7082     { PREFIX_TABLE (PREFIX_0F38CB) },
7083     { PREFIX_TABLE (PREFIX_0F38CC) },
7084     { PREFIX_TABLE (PREFIX_0F38CD) },
7085     { Bad_Opcode },
7086     { Bad_Opcode },
7087     /* d0 */
7088     { Bad_Opcode },
7089     { Bad_Opcode },
7090     { Bad_Opcode },
7091     { Bad_Opcode },
7092     { Bad_Opcode },
7093     { Bad_Opcode },
7094     { Bad_Opcode },
7095     { Bad_Opcode },
7096     /* d8 */
7097     { Bad_Opcode },
7098     { Bad_Opcode },
7099     { Bad_Opcode },
7100     { PREFIX_TABLE (PREFIX_0F38DB) },
7101     { PREFIX_TABLE (PREFIX_0F38DC) },
7102     { PREFIX_TABLE (PREFIX_0F38DD) },
7103     { PREFIX_TABLE (PREFIX_0F38DE) },
7104     { PREFIX_TABLE (PREFIX_0F38DF) },
7105     /* e0 */
7106     { Bad_Opcode },
7107     { Bad_Opcode },
7108     { Bad_Opcode },
7109     { Bad_Opcode },
7110     { Bad_Opcode },
7111     { Bad_Opcode },
7112     { Bad_Opcode },
7113     { Bad_Opcode },
7114     /* e8 */
7115     { Bad_Opcode },
7116     { Bad_Opcode },
7117     { Bad_Opcode },
7118     { Bad_Opcode },
7119     { Bad_Opcode },
7120     { Bad_Opcode },
7121     { Bad_Opcode },
7122     { Bad_Opcode },
7123     /* f0 */
7124     { PREFIX_TABLE (PREFIX_0F38F0) },
7125     { PREFIX_TABLE (PREFIX_0F38F1) },
7126     { Bad_Opcode },
7127     { Bad_Opcode },
7128     { Bad_Opcode },
7129     { Bad_Opcode },
7130     { PREFIX_TABLE (PREFIX_0F38F6) },
7131     { Bad_Opcode },
7132     /* f8 */
7133     { Bad_Opcode },
7134     { Bad_Opcode },
7135     { Bad_Opcode },
7136     { Bad_Opcode },
7137     { Bad_Opcode },
7138     { Bad_Opcode },
7139     { Bad_Opcode },
7140     { Bad_Opcode },
7141   },
7142   /* THREE_BYTE_0F3A */
7143   {
7144     /* 00 */
7145     { Bad_Opcode },
7146     { Bad_Opcode },
7147     { Bad_Opcode },
7148     { Bad_Opcode },
7149     { Bad_Opcode },
7150     { Bad_Opcode },
7151     { Bad_Opcode },
7152     { Bad_Opcode },
7153     /* 08 */
7154     { PREFIX_TABLE (PREFIX_0F3A08) },
7155     { PREFIX_TABLE (PREFIX_0F3A09) },
7156     { PREFIX_TABLE (PREFIX_0F3A0A) },
7157     { PREFIX_TABLE (PREFIX_0F3A0B) },
7158     { PREFIX_TABLE (PREFIX_0F3A0C) },
7159     { PREFIX_TABLE (PREFIX_0F3A0D) },
7160     { PREFIX_TABLE (PREFIX_0F3A0E) },
7161     { "palignr",        { MX, EM, Ib }, PREFIX_MANDATORY },
7162     /* 10 */
7163     { Bad_Opcode },
7164     { Bad_Opcode },
7165     { Bad_Opcode },
7166     { Bad_Opcode },
7167     { PREFIX_TABLE (PREFIX_0F3A14) },
7168     { PREFIX_TABLE (PREFIX_0F3A15) },
7169     { PREFIX_TABLE (PREFIX_0F3A16) },
7170     { PREFIX_TABLE (PREFIX_0F3A17) },
7171     /* 18 */
7172     { Bad_Opcode },
7173     { Bad_Opcode },
7174     { Bad_Opcode },
7175     { Bad_Opcode },
7176     { Bad_Opcode },
7177     { Bad_Opcode },
7178     { Bad_Opcode },
7179     { Bad_Opcode },
7180     /* 20 */
7181     { PREFIX_TABLE (PREFIX_0F3A20) },
7182     { PREFIX_TABLE (PREFIX_0F3A21) },
7183     { PREFIX_TABLE (PREFIX_0F3A22) },
7184     { Bad_Opcode },
7185     { Bad_Opcode },
7186     { Bad_Opcode },
7187     { Bad_Opcode },
7188     { Bad_Opcode },
7189     /* 28 */
7190     { Bad_Opcode },
7191     { Bad_Opcode },
7192     { Bad_Opcode },
7193     { Bad_Opcode },
7194     { Bad_Opcode },
7195     { Bad_Opcode },
7196     { Bad_Opcode },
7197     { Bad_Opcode },
7198     /* 30 */
7199     { Bad_Opcode },
7200     { Bad_Opcode },
7201     { Bad_Opcode },
7202     { Bad_Opcode },
7203     { Bad_Opcode },
7204     { Bad_Opcode },
7205     { Bad_Opcode },
7206     { Bad_Opcode },
7207     /* 38 */
7208     { Bad_Opcode },
7209     { Bad_Opcode },
7210     { Bad_Opcode },
7211     { Bad_Opcode },
7212     { Bad_Opcode },
7213     { Bad_Opcode },
7214     { Bad_Opcode },
7215     { Bad_Opcode },
7216     /* 40 */
7217     { PREFIX_TABLE (PREFIX_0F3A40) },
7218     { PREFIX_TABLE (PREFIX_0F3A41) },
7219     { PREFIX_TABLE (PREFIX_0F3A42) },
7220     { Bad_Opcode },
7221     { PREFIX_TABLE (PREFIX_0F3A44) },
7222     { Bad_Opcode },
7223     { Bad_Opcode },
7224     { Bad_Opcode },
7225     /* 48 */
7226     { Bad_Opcode },
7227     { Bad_Opcode },
7228     { Bad_Opcode },
7229     { Bad_Opcode },
7230     { Bad_Opcode },
7231     { Bad_Opcode },
7232     { Bad_Opcode },
7233     { Bad_Opcode },
7234     /* 50 */
7235     { Bad_Opcode },
7236     { Bad_Opcode },
7237     { Bad_Opcode },
7238     { Bad_Opcode },
7239     { Bad_Opcode },
7240     { Bad_Opcode },
7241     { Bad_Opcode },
7242     { Bad_Opcode },
7243     /* 58 */
7244     { Bad_Opcode },
7245     { Bad_Opcode },
7246     { Bad_Opcode },
7247     { Bad_Opcode },
7248     { Bad_Opcode },
7249     { Bad_Opcode },
7250     { Bad_Opcode },
7251     { Bad_Opcode },
7252     /* 60 */
7253     { PREFIX_TABLE (PREFIX_0F3A60) },
7254     { PREFIX_TABLE (PREFIX_0F3A61) },
7255     { PREFIX_TABLE (PREFIX_0F3A62) },
7256     { PREFIX_TABLE (PREFIX_0F3A63) },
7257     { Bad_Opcode },
7258     { Bad_Opcode },
7259     { Bad_Opcode },
7260     { Bad_Opcode },
7261     /* 68 */
7262     { Bad_Opcode },
7263     { Bad_Opcode },
7264     { Bad_Opcode },
7265     { Bad_Opcode },
7266     { Bad_Opcode },
7267     { Bad_Opcode },
7268     { Bad_Opcode },
7269     { Bad_Opcode },
7270     /* 70 */
7271     { Bad_Opcode },
7272     { Bad_Opcode },
7273     { Bad_Opcode },
7274     { Bad_Opcode },
7275     { Bad_Opcode },
7276     { Bad_Opcode },
7277     { Bad_Opcode },
7278     { Bad_Opcode },
7279     /* 78 */
7280     { Bad_Opcode },
7281     { Bad_Opcode },
7282     { Bad_Opcode },
7283     { Bad_Opcode },
7284     { Bad_Opcode },
7285     { Bad_Opcode },
7286     { Bad_Opcode },
7287     { Bad_Opcode },
7288     /* 80 */
7289     { Bad_Opcode },
7290     { Bad_Opcode },
7291     { Bad_Opcode },
7292     { Bad_Opcode },
7293     { Bad_Opcode },
7294     { Bad_Opcode },
7295     { Bad_Opcode },
7296     { Bad_Opcode },
7297     /* 88 */
7298     { Bad_Opcode },
7299     { Bad_Opcode },
7300     { Bad_Opcode },
7301     { Bad_Opcode },
7302     { Bad_Opcode },
7303     { Bad_Opcode },
7304     { Bad_Opcode },
7305     { Bad_Opcode },
7306     /* 90 */
7307     { Bad_Opcode },
7308     { Bad_Opcode },
7309     { Bad_Opcode },
7310     { Bad_Opcode },
7311     { Bad_Opcode },
7312     { Bad_Opcode },
7313     { Bad_Opcode },
7314     { Bad_Opcode },
7315     /* 98 */
7316     { Bad_Opcode },
7317     { Bad_Opcode },
7318     { Bad_Opcode },
7319     { Bad_Opcode },
7320     { Bad_Opcode },
7321     { Bad_Opcode },
7322     { Bad_Opcode },
7323     { Bad_Opcode },
7324     /* a0 */
7325     { Bad_Opcode },
7326     { Bad_Opcode },
7327     { Bad_Opcode },
7328     { Bad_Opcode },
7329     { Bad_Opcode },
7330     { Bad_Opcode },
7331     { Bad_Opcode },
7332     { Bad_Opcode },
7333     /* a8 */
7334     { Bad_Opcode },
7335     { Bad_Opcode },
7336     { Bad_Opcode },
7337     { Bad_Opcode },
7338     { Bad_Opcode },
7339     { Bad_Opcode },
7340     { Bad_Opcode },
7341     { Bad_Opcode },
7342     /* b0 */
7343     { Bad_Opcode },
7344     { Bad_Opcode },
7345     { Bad_Opcode },
7346     { Bad_Opcode },
7347     { Bad_Opcode },
7348     { Bad_Opcode },
7349     { Bad_Opcode },
7350     { Bad_Opcode },
7351     /* b8 */
7352     { Bad_Opcode },
7353     { Bad_Opcode },
7354     { Bad_Opcode },
7355     { Bad_Opcode },
7356     { Bad_Opcode },
7357     { Bad_Opcode },
7358     { Bad_Opcode },
7359     { Bad_Opcode },
7360     /* c0 */
7361     { Bad_Opcode },
7362     { Bad_Opcode },
7363     { Bad_Opcode },
7364     { Bad_Opcode },
7365     { Bad_Opcode },
7366     { Bad_Opcode },
7367     { Bad_Opcode },
7368     { Bad_Opcode },
7369     /* c8 */
7370     { Bad_Opcode },
7371     { Bad_Opcode },
7372     { Bad_Opcode },
7373     { Bad_Opcode },
7374     { PREFIX_TABLE (PREFIX_0F3ACC) },
7375     { Bad_Opcode },
7376     { Bad_Opcode },
7377     { Bad_Opcode },
7378     /* d0 */
7379     { Bad_Opcode },
7380     { Bad_Opcode },
7381     { Bad_Opcode },
7382     { Bad_Opcode },
7383     { Bad_Opcode },
7384     { Bad_Opcode },
7385     { Bad_Opcode },
7386     { Bad_Opcode },
7387     /* d8 */
7388     { Bad_Opcode },
7389     { Bad_Opcode },
7390     { Bad_Opcode },
7391     { Bad_Opcode },
7392     { Bad_Opcode },
7393     { Bad_Opcode },
7394     { Bad_Opcode },
7395     { PREFIX_TABLE (PREFIX_0F3ADF) },
7396     /* e0 */
7397     { Bad_Opcode },
7398     { Bad_Opcode },
7399     { Bad_Opcode },
7400     { Bad_Opcode },
7401     { Bad_Opcode },
7402     { Bad_Opcode },
7403     { Bad_Opcode },
7404     { Bad_Opcode },
7405     /* e8 */
7406     { Bad_Opcode },
7407     { Bad_Opcode },
7408     { Bad_Opcode },
7409     { Bad_Opcode },
7410     { Bad_Opcode },
7411     { Bad_Opcode },
7412     { Bad_Opcode },
7413     { Bad_Opcode },
7414     /* f0 */
7415     { Bad_Opcode },
7416     { Bad_Opcode },
7417     { Bad_Opcode },
7418     { Bad_Opcode },
7419     { Bad_Opcode },
7420     { Bad_Opcode },
7421     { Bad_Opcode },
7422     { Bad_Opcode },
7423     /* f8 */
7424     { Bad_Opcode },
7425     { Bad_Opcode },
7426     { Bad_Opcode },
7427     { Bad_Opcode },
7428     { Bad_Opcode },
7429     { Bad_Opcode },
7430     { Bad_Opcode },
7431     { Bad_Opcode },
7432   },
7433
7434   /* THREE_BYTE_0F7A */
7435   {
7436     /* 00 */
7437     { Bad_Opcode },
7438     { Bad_Opcode },
7439     { Bad_Opcode },
7440     { Bad_Opcode },
7441     { Bad_Opcode },
7442     { Bad_Opcode },
7443     { Bad_Opcode },
7444     { Bad_Opcode },
7445     /* 08 */
7446     { Bad_Opcode },
7447     { Bad_Opcode },
7448     { Bad_Opcode },
7449     { Bad_Opcode },
7450     { Bad_Opcode },
7451     { Bad_Opcode },
7452     { Bad_Opcode },
7453     { Bad_Opcode },
7454     /* 10 */
7455     { Bad_Opcode },
7456     { Bad_Opcode },
7457     { Bad_Opcode },
7458     { Bad_Opcode },
7459     { Bad_Opcode },
7460     { Bad_Opcode },
7461     { Bad_Opcode },
7462     { Bad_Opcode },
7463     /* 18 */
7464     { Bad_Opcode },
7465     { Bad_Opcode },
7466     { Bad_Opcode },
7467     { Bad_Opcode },
7468     { Bad_Opcode },
7469     { Bad_Opcode },
7470     { Bad_Opcode },
7471     { Bad_Opcode },
7472     /* 20 */
7473     { "ptest",          { XX }, PREFIX_MANDATORY },
7474     { Bad_Opcode },
7475     { Bad_Opcode },
7476     { Bad_Opcode },
7477     { Bad_Opcode },
7478     { Bad_Opcode },
7479     { Bad_Opcode },
7480     { Bad_Opcode },
7481     /* 28 */
7482     { Bad_Opcode },
7483     { Bad_Opcode },
7484     { Bad_Opcode },
7485     { Bad_Opcode },
7486     { Bad_Opcode },
7487     { Bad_Opcode },
7488     { Bad_Opcode },
7489     { Bad_Opcode },
7490     /* 30 */
7491     { Bad_Opcode },
7492     { Bad_Opcode },
7493     { Bad_Opcode },
7494     { Bad_Opcode },
7495     { Bad_Opcode },
7496     { Bad_Opcode },
7497     { Bad_Opcode },
7498     { Bad_Opcode },
7499     /* 38 */
7500     { Bad_Opcode },
7501     { Bad_Opcode },
7502     { Bad_Opcode },
7503     { Bad_Opcode },
7504     { Bad_Opcode },
7505     { Bad_Opcode },
7506     { Bad_Opcode },
7507     { Bad_Opcode },
7508     /* 40 */
7509     { Bad_Opcode },
7510     { "phaddbw",        { XM, EXq }, PREFIX_MANDATORY },
7511     { "phaddbd",        { XM, EXq }, PREFIX_MANDATORY },
7512     { "phaddbq",        { XM, EXq }, PREFIX_MANDATORY },
7513     { Bad_Opcode },
7514     { Bad_Opcode },
7515     { "phaddwd",        { XM, EXq }, PREFIX_MANDATORY },
7516     { "phaddwq",        { XM, EXq }, PREFIX_MANDATORY },
7517     /* 48 */
7518     { Bad_Opcode },
7519     { Bad_Opcode },
7520     { Bad_Opcode },
7521     { "phadddq",        { XM, EXq }, PREFIX_MANDATORY },
7522     { Bad_Opcode },
7523     { Bad_Opcode },
7524     { Bad_Opcode },
7525     { Bad_Opcode },
7526     /* 50 */
7527     { Bad_Opcode },
7528     { "phaddubw",       { XM, EXq }, PREFIX_MANDATORY },
7529     { "phaddubd",       { XM, EXq }, PREFIX_MANDATORY },
7530     { "phaddubq",       { XM, EXq }, PREFIX_MANDATORY },
7531     { Bad_Opcode },
7532     { Bad_Opcode },
7533     { "phadduwd",       { XM, EXq }, PREFIX_MANDATORY },
7534     { "phadduwq",       { XM, EXq }, PREFIX_MANDATORY },
7535     /* 58 */
7536     { Bad_Opcode },
7537     { Bad_Opcode },
7538     { Bad_Opcode },
7539     { "phaddudq",       { XM, EXq }, PREFIX_MANDATORY },
7540     { Bad_Opcode },
7541     { Bad_Opcode },
7542     { Bad_Opcode },
7543     { Bad_Opcode },
7544     /* 60 */
7545     { Bad_Opcode },
7546     { "phsubbw",        { XM, EXq }, PREFIX_MANDATORY },
7547     { "phsubbd",        { XM, EXq }, PREFIX_MANDATORY },
7548     { "phsubbq",        { XM, EXq }, PREFIX_MANDATORY },
7549     { Bad_Opcode },
7550     { Bad_Opcode },
7551     { Bad_Opcode },
7552     { Bad_Opcode },
7553     /* 68 */
7554     { Bad_Opcode },
7555     { Bad_Opcode },
7556     { Bad_Opcode },
7557     { Bad_Opcode },
7558     { Bad_Opcode },
7559     { Bad_Opcode },
7560     { Bad_Opcode },
7561     { Bad_Opcode },
7562     /* 70 */
7563     { Bad_Opcode },
7564     { Bad_Opcode },
7565     { Bad_Opcode },
7566     { Bad_Opcode },
7567     { Bad_Opcode },
7568     { Bad_Opcode },
7569     { Bad_Opcode },
7570     { Bad_Opcode },
7571     /* 78 */
7572     { Bad_Opcode },
7573     { Bad_Opcode },
7574     { Bad_Opcode },
7575     { Bad_Opcode },
7576     { Bad_Opcode },
7577     { Bad_Opcode },
7578     { Bad_Opcode },
7579     { Bad_Opcode },
7580     /* 80 */
7581     { Bad_Opcode },
7582     { Bad_Opcode },
7583     { Bad_Opcode },
7584     { Bad_Opcode },
7585     { Bad_Opcode },
7586     { Bad_Opcode },
7587     { Bad_Opcode },
7588     { Bad_Opcode },
7589     /* 88 */
7590     { Bad_Opcode },
7591     { Bad_Opcode },
7592     { Bad_Opcode },
7593     { Bad_Opcode },
7594     { Bad_Opcode },
7595     { Bad_Opcode },
7596     { Bad_Opcode },
7597     { Bad_Opcode },
7598     /* 90 */
7599     { Bad_Opcode },
7600     { Bad_Opcode },
7601     { Bad_Opcode },
7602     { Bad_Opcode },
7603     { Bad_Opcode },
7604     { Bad_Opcode },
7605     { Bad_Opcode },
7606     { Bad_Opcode },
7607     /* 98 */
7608     { Bad_Opcode },
7609     { Bad_Opcode },
7610     { Bad_Opcode },
7611     { Bad_Opcode },
7612     { Bad_Opcode },
7613     { Bad_Opcode },
7614     { Bad_Opcode },
7615     { Bad_Opcode },
7616     /* a0 */
7617     { Bad_Opcode },
7618     { Bad_Opcode },
7619     { Bad_Opcode },
7620     { Bad_Opcode },
7621     { Bad_Opcode },
7622     { Bad_Opcode },
7623     { Bad_Opcode },
7624     { Bad_Opcode },
7625     /* a8 */
7626     { Bad_Opcode },
7627     { Bad_Opcode },
7628     { Bad_Opcode },
7629     { Bad_Opcode },
7630     { Bad_Opcode },
7631     { Bad_Opcode },
7632     { Bad_Opcode },
7633     { Bad_Opcode },
7634     /* b0 */
7635     { Bad_Opcode },
7636     { Bad_Opcode },
7637     { Bad_Opcode },
7638     { Bad_Opcode },
7639     { Bad_Opcode },
7640     { Bad_Opcode },
7641     { Bad_Opcode },
7642     { Bad_Opcode },
7643     /* b8 */
7644     { Bad_Opcode },
7645     { Bad_Opcode },
7646     { Bad_Opcode },
7647     { Bad_Opcode },
7648     { Bad_Opcode },
7649     { Bad_Opcode },
7650     { Bad_Opcode },
7651     { Bad_Opcode },
7652     /* c0 */
7653     { Bad_Opcode },
7654     { Bad_Opcode },
7655     { Bad_Opcode },
7656     { Bad_Opcode },
7657     { Bad_Opcode },
7658     { Bad_Opcode },
7659     { Bad_Opcode },
7660     { Bad_Opcode },
7661     /* c8 */
7662     { Bad_Opcode },
7663     { Bad_Opcode },
7664     { Bad_Opcode },
7665     { Bad_Opcode },
7666     { Bad_Opcode },
7667     { Bad_Opcode },
7668     { Bad_Opcode },
7669     { Bad_Opcode },
7670     /* d0 */
7671     { Bad_Opcode },
7672     { Bad_Opcode },
7673     { Bad_Opcode },
7674     { Bad_Opcode },
7675     { Bad_Opcode },
7676     { Bad_Opcode },
7677     { Bad_Opcode },
7678     { Bad_Opcode },
7679     /* d8 */
7680     { Bad_Opcode },
7681     { Bad_Opcode },
7682     { Bad_Opcode },
7683     { Bad_Opcode },
7684     { Bad_Opcode },
7685     { Bad_Opcode },
7686     { Bad_Opcode },
7687     { Bad_Opcode },
7688     /* e0 */
7689     { Bad_Opcode },
7690     { Bad_Opcode },
7691     { Bad_Opcode },
7692     { Bad_Opcode },
7693     { Bad_Opcode },
7694     { Bad_Opcode },
7695     { Bad_Opcode },
7696     { Bad_Opcode },
7697     /* e8 */
7698     { Bad_Opcode },
7699     { Bad_Opcode },
7700     { Bad_Opcode },
7701     { Bad_Opcode },
7702     { Bad_Opcode },
7703     { Bad_Opcode },
7704     { Bad_Opcode },
7705     { Bad_Opcode },
7706     /* f0 */
7707     { Bad_Opcode },
7708     { Bad_Opcode },
7709     { Bad_Opcode },
7710     { Bad_Opcode },
7711     { Bad_Opcode },
7712     { Bad_Opcode },
7713     { Bad_Opcode },
7714     { Bad_Opcode },
7715     /* f8 */
7716     { Bad_Opcode },
7717     { Bad_Opcode },
7718     { Bad_Opcode },
7719     { Bad_Opcode },
7720     { Bad_Opcode },
7721     { Bad_Opcode },
7722     { Bad_Opcode },
7723     { Bad_Opcode },
7724   },
7725 };
7726
7727 static const struct dis386 xop_table[][256] = {
7728   /* XOP_08 */
7729   {
7730     /* 00 */
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     /* 08 */
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     /* 10 */
7749     { Bad_Opcode },
7750     { Bad_Opcode },
7751     { Bad_Opcode },
7752     { Bad_Opcode },
7753     { Bad_Opcode },
7754     { Bad_Opcode },
7755     { Bad_Opcode },
7756     { Bad_Opcode },
7757     /* 18 */
7758     { Bad_Opcode },
7759     { Bad_Opcode },
7760     { Bad_Opcode },
7761     { Bad_Opcode },
7762     { Bad_Opcode },
7763     { Bad_Opcode },
7764     { Bad_Opcode },
7765     { Bad_Opcode },
7766     /* 20 */
7767     { Bad_Opcode },
7768     { Bad_Opcode },
7769     { Bad_Opcode },
7770     { Bad_Opcode },
7771     { Bad_Opcode },
7772     { Bad_Opcode },
7773     { Bad_Opcode },
7774     { Bad_Opcode },
7775     /* 28 */
7776     { Bad_Opcode },
7777     { Bad_Opcode },
7778     { Bad_Opcode },
7779     { Bad_Opcode },
7780     { Bad_Opcode },
7781     { Bad_Opcode },
7782     { Bad_Opcode },
7783     { Bad_Opcode },
7784     /* 30 */
7785     { Bad_Opcode },
7786     { Bad_Opcode },
7787     { Bad_Opcode },
7788     { Bad_Opcode },
7789     { Bad_Opcode },
7790     { Bad_Opcode },
7791     { Bad_Opcode },
7792     { Bad_Opcode },
7793     /* 38 */
7794     { Bad_Opcode },
7795     { Bad_Opcode },
7796     { Bad_Opcode },
7797     { Bad_Opcode },
7798     { Bad_Opcode },
7799     { Bad_Opcode },
7800     { Bad_Opcode },
7801     { Bad_Opcode },
7802     /* 40 */
7803     { Bad_Opcode },
7804     { Bad_Opcode },
7805     { Bad_Opcode },
7806     { Bad_Opcode },
7807     { Bad_Opcode },
7808     { Bad_Opcode },
7809     { Bad_Opcode },
7810     { Bad_Opcode },
7811     /* 48 */
7812     { Bad_Opcode },
7813     { Bad_Opcode },
7814     { Bad_Opcode },
7815     { Bad_Opcode },
7816     { Bad_Opcode },
7817     { Bad_Opcode },
7818     { Bad_Opcode },
7819     { Bad_Opcode },
7820     /* 50 */
7821     { Bad_Opcode },
7822     { Bad_Opcode },
7823     { Bad_Opcode },
7824     { Bad_Opcode },
7825     { Bad_Opcode },
7826     { Bad_Opcode },
7827     { Bad_Opcode },
7828     { Bad_Opcode },
7829     /* 58 */
7830     { Bad_Opcode },
7831     { Bad_Opcode },
7832     { Bad_Opcode },
7833     { Bad_Opcode },
7834     { Bad_Opcode },
7835     { Bad_Opcode },
7836     { Bad_Opcode },
7837     { Bad_Opcode },
7838     /* 60 */
7839     { Bad_Opcode },
7840     { Bad_Opcode },
7841     { Bad_Opcode },
7842     { Bad_Opcode },
7843     { Bad_Opcode },
7844     { Bad_Opcode },
7845     { Bad_Opcode },
7846     { Bad_Opcode },
7847     /* 68 */
7848     { Bad_Opcode },
7849     { Bad_Opcode },
7850     { Bad_Opcode },
7851     { Bad_Opcode },
7852     { Bad_Opcode },
7853     { Bad_Opcode },
7854     { Bad_Opcode },
7855     { Bad_Opcode },
7856     /* 70 */
7857     { Bad_Opcode },
7858     { Bad_Opcode },
7859     { Bad_Opcode },
7860     { Bad_Opcode },
7861     { Bad_Opcode },
7862     { Bad_Opcode },
7863     { Bad_Opcode },
7864     { Bad_Opcode },
7865     /* 78 */
7866     { Bad_Opcode },
7867     { Bad_Opcode },
7868     { Bad_Opcode },
7869     { Bad_Opcode },
7870     { Bad_Opcode },
7871     { Bad_Opcode },
7872     { Bad_Opcode },
7873     { Bad_Opcode },
7874     /* 80 */
7875     { Bad_Opcode },
7876     { Bad_Opcode },
7877     { Bad_Opcode },
7878     { Bad_Opcode },
7879     { Bad_Opcode },
7880     { "vpmacssww",      { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7881     { "vpmacsswd",      { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7882     { "vpmacssdql",     { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7883     /* 88 */
7884     { Bad_Opcode },
7885     { Bad_Opcode },
7886     { Bad_Opcode },
7887     { Bad_Opcode },
7888     { Bad_Opcode },
7889     { Bad_Opcode },
7890     { "vpmacssdd",      { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7891     { "vpmacssdqh",     { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7892     /* 90 */
7893     { Bad_Opcode },
7894     { Bad_Opcode },
7895     { Bad_Opcode },
7896     { Bad_Opcode },
7897     { Bad_Opcode },
7898     { "vpmacsww",       { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7899     { "vpmacswd",       { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7900     { "vpmacsdql",      { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7901     /* 98 */
7902     { Bad_Opcode },
7903     { Bad_Opcode },
7904     { Bad_Opcode },
7905     { Bad_Opcode },
7906     { Bad_Opcode },
7907     { Bad_Opcode },
7908     { "vpmacsdd",       { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7909     { "vpmacsdqh",      { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7910     /* a0 */
7911     { Bad_Opcode },
7912     { Bad_Opcode },
7913     { "vpcmov",         { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7914     { "vpperm",         { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7915     { Bad_Opcode },
7916     { Bad_Opcode },
7917     { "vpmadcsswd",     { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7918     { Bad_Opcode },
7919     /* a8 */
7920     { Bad_Opcode },
7921     { Bad_Opcode },
7922     { Bad_Opcode },
7923     { Bad_Opcode },
7924     { Bad_Opcode },
7925     { Bad_Opcode },
7926     { Bad_Opcode },
7927     { Bad_Opcode },
7928     /* b0 */
7929     { Bad_Opcode },
7930     { Bad_Opcode },
7931     { Bad_Opcode },
7932     { Bad_Opcode },
7933     { Bad_Opcode },
7934     { Bad_Opcode },
7935     { "vpmadcswd",      { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7936     { Bad_Opcode },
7937     /* b8 */
7938     { Bad_Opcode },
7939     { Bad_Opcode },
7940     { Bad_Opcode },
7941     { Bad_Opcode },
7942     { Bad_Opcode },
7943     { Bad_Opcode },
7944     { Bad_Opcode },
7945     { Bad_Opcode },
7946     /* c0 */
7947     { "vprotb",         { XM, Vex_2src_1, Ib }, 0 },
7948     { "vprotw",         { XM, Vex_2src_1, Ib }, 0 },
7949     { "vprotd",         { XM, Vex_2src_1, Ib }, 0 },
7950     { "vprotq",         { XM, Vex_2src_1, Ib }, 0 },
7951     { Bad_Opcode },
7952     { Bad_Opcode },
7953     { Bad_Opcode },
7954     { Bad_Opcode },
7955     /* c8 */
7956     { Bad_Opcode },
7957     { Bad_Opcode },
7958     { Bad_Opcode },
7959     { Bad_Opcode },
7960     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CC) },
7961     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CD) },
7962     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CE) },
7963     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CF) },
7964     /* d0 */
7965     { Bad_Opcode },
7966     { Bad_Opcode },
7967     { Bad_Opcode },
7968     { Bad_Opcode },
7969     { Bad_Opcode },
7970     { Bad_Opcode },
7971     { Bad_Opcode },
7972     { Bad_Opcode },
7973     /* d8 */
7974     { Bad_Opcode },
7975     { Bad_Opcode },
7976     { Bad_Opcode },
7977     { Bad_Opcode },
7978     { Bad_Opcode },
7979     { Bad_Opcode },
7980     { Bad_Opcode },
7981     { Bad_Opcode },
7982     /* e0 */
7983     { Bad_Opcode },
7984     { Bad_Opcode },
7985     { Bad_Opcode },
7986     { Bad_Opcode },
7987     { Bad_Opcode },
7988     { Bad_Opcode },
7989     { Bad_Opcode },
7990     { Bad_Opcode },
7991     /* e8 */
7992     { Bad_Opcode },
7993     { Bad_Opcode },
7994     { Bad_Opcode },
7995     { Bad_Opcode },
7996     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EC) },
7997     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_ED) },
7998     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EE) },
7999     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EF) },
8000     /* f0 */
8001     { Bad_Opcode },
8002     { Bad_Opcode },
8003     { Bad_Opcode },
8004     { Bad_Opcode },
8005     { Bad_Opcode },
8006     { Bad_Opcode },
8007     { Bad_Opcode },
8008     { Bad_Opcode },
8009     /* f8 */
8010     { Bad_Opcode },
8011     { Bad_Opcode },
8012     { Bad_Opcode },
8013     { Bad_Opcode },
8014     { Bad_Opcode },
8015     { Bad_Opcode },
8016     { Bad_Opcode },
8017     { Bad_Opcode },
8018   },
8019   /* XOP_09 */
8020   {
8021     /* 00 */
8022     { Bad_Opcode },
8023     { REG_TABLE (REG_XOP_TBM_01) },
8024     { REG_TABLE (REG_XOP_TBM_02) },
8025     { Bad_Opcode },
8026     { Bad_Opcode },
8027     { Bad_Opcode },
8028     { Bad_Opcode },
8029     { Bad_Opcode },
8030     /* 08 */
8031     { Bad_Opcode },
8032     { Bad_Opcode },
8033     { Bad_Opcode },
8034     { Bad_Opcode },
8035     { Bad_Opcode },
8036     { Bad_Opcode },
8037     { Bad_Opcode },
8038     { Bad_Opcode },
8039     /* 10 */
8040     { Bad_Opcode },
8041     { Bad_Opcode },
8042     { REG_TABLE (REG_XOP_LWPCB) },
8043     { Bad_Opcode },
8044     { Bad_Opcode },
8045     { Bad_Opcode },
8046     { Bad_Opcode },
8047     { Bad_Opcode },
8048     /* 18 */
8049     { Bad_Opcode },
8050     { Bad_Opcode },
8051     { Bad_Opcode },
8052     { Bad_Opcode },
8053     { Bad_Opcode },
8054     { Bad_Opcode },
8055     { Bad_Opcode },
8056     { Bad_Opcode },
8057     /* 20 */
8058     { Bad_Opcode },
8059     { Bad_Opcode },
8060     { Bad_Opcode },
8061     { Bad_Opcode },
8062     { Bad_Opcode },
8063     { Bad_Opcode },
8064     { Bad_Opcode },
8065     { Bad_Opcode },
8066     /* 28 */
8067     { Bad_Opcode },
8068     { Bad_Opcode },
8069     { Bad_Opcode },
8070     { Bad_Opcode },
8071     { Bad_Opcode },
8072     { Bad_Opcode },
8073     { Bad_Opcode },
8074     { Bad_Opcode },
8075     /* 30 */
8076     { Bad_Opcode },
8077     { Bad_Opcode },
8078     { Bad_Opcode },
8079     { Bad_Opcode },
8080     { Bad_Opcode },
8081     { Bad_Opcode },
8082     { Bad_Opcode },
8083     { Bad_Opcode },
8084     /* 38 */
8085     { Bad_Opcode },
8086     { Bad_Opcode },
8087     { Bad_Opcode },
8088     { Bad_Opcode },
8089     { Bad_Opcode },
8090     { Bad_Opcode },
8091     { Bad_Opcode },
8092     { Bad_Opcode },
8093     /* 40 */
8094     { Bad_Opcode },
8095     { Bad_Opcode },
8096     { Bad_Opcode },
8097     { Bad_Opcode },
8098     { Bad_Opcode },
8099     { Bad_Opcode },
8100     { Bad_Opcode },
8101     { Bad_Opcode },
8102     /* 48 */
8103     { Bad_Opcode },
8104     { Bad_Opcode },
8105     { Bad_Opcode },
8106     { Bad_Opcode },
8107     { Bad_Opcode },
8108     { Bad_Opcode },
8109     { Bad_Opcode },
8110     { Bad_Opcode },
8111     /* 50 */
8112     { Bad_Opcode },
8113     { Bad_Opcode },
8114     { Bad_Opcode },
8115     { Bad_Opcode },
8116     { Bad_Opcode },
8117     { Bad_Opcode },
8118     { Bad_Opcode },
8119     { Bad_Opcode },
8120     /* 58 */
8121     { Bad_Opcode },
8122     { Bad_Opcode },
8123     { Bad_Opcode },
8124     { Bad_Opcode },
8125     { Bad_Opcode },
8126     { Bad_Opcode },
8127     { Bad_Opcode },
8128     { Bad_Opcode },
8129     /* 60 */
8130     { Bad_Opcode },
8131     { Bad_Opcode },
8132     { Bad_Opcode },
8133     { Bad_Opcode },
8134     { Bad_Opcode },
8135     { Bad_Opcode },
8136     { Bad_Opcode },
8137     { Bad_Opcode },
8138     /* 68 */
8139     { Bad_Opcode },
8140     { Bad_Opcode },
8141     { Bad_Opcode },
8142     { Bad_Opcode },
8143     { Bad_Opcode },
8144     { Bad_Opcode },
8145     { Bad_Opcode },
8146     { Bad_Opcode },
8147     /* 70 */
8148     { Bad_Opcode },
8149     { Bad_Opcode },
8150     { Bad_Opcode },
8151     { Bad_Opcode },
8152     { Bad_Opcode },
8153     { Bad_Opcode },
8154     { Bad_Opcode },
8155     { Bad_Opcode },
8156     /* 78 */
8157     { Bad_Opcode },
8158     { Bad_Opcode },
8159     { Bad_Opcode },
8160     { Bad_Opcode },
8161     { Bad_Opcode },
8162     { Bad_Opcode },
8163     { Bad_Opcode },
8164     { Bad_Opcode },
8165     /* 80 */
8166     { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_80) },
8167     { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_81) },
8168     { "vfrczss",        { XM, EXd }, 0 },
8169     { "vfrczsd",        { XM, EXq }, 0 },
8170     { Bad_Opcode },
8171     { Bad_Opcode },
8172     { Bad_Opcode },
8173     { Bad_Opcode },
8174     /* 88 */
8175     { Bad_Opcode },
8176     { Bad_Opcode },
8177     { Bad_Opcode },
8178     { Bad_Opcode },
8179     { Bad_Opcode },
8180     { Bad_Opcode },
8181     { Bad_Opcode },
8182     { Bad_Opcode },
8183     /* 90 */
8184     { "vprotb",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8185     { "vprotw",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8186     { "vprotd",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8187     { "vprotq",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8188     { "vpshlb",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8189     { "vpshlw",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8190     { "vpshld",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8191     { "vpshlq",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8192     /* 98 */
8193     { "vpshab",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8194     { "vpshaw",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8195     { "vpshad",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8196     { "vpshaq",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8197     { Bad_Opcode },
8198     { Bad_Opcode },
8199     { Bad_Opcode },
8200     { Bad_Opcode },
8201     /* a0 */
8202     { Bad_Opcode },
8203     { Bad_Opcode },
8204     { Bad_Opcode },
8205     { Bad_Opcode },
8206     { Bad_Opcode },
8207     { Bad_Opcode },
8208     { Bad_Opcode },
8209     { Bad_Opcode },
8210     /* a8 */
8211     { Bad_Opcode },
8212     { Bad_Opcode },
8213     { Bad_Opcode },
8214     { Bad_Opcode },
8215     { Bad_Opcode },
8216     { Bad_Opcode },
8217     { Bad_Opcode },
8218     { Bad_Opcode },
8219     /* b0 */
8220     { Bad_Opcode },
8221     { Bad_Opcode },
8222     { Bad_Opcode },
8223     { Bad_Opcode },
8224     { Bad_Opcode },
8225     { Bad_Opcode },
8226     { Bad_Opcode },
8227     { Bad_Opcode },
8228     /* b8 */
8229     { Bad_Opcode },
8230     { Bad_Opcode },
8231     { Bad_Opcode },
8232     { Bad_Opcode },
8233     { Bad_Opcode },
8234     { Bad_Opcode },
8235     { Bad_Opcode },
8236     { Bad_Opcode },
8237     /* c0 */
8238     { Bad_Opcode },
8239     { "vphaddbw",       { XM, EXxmm }, 0 },
8240     { "vphaddbd",       { XM, EXxmm }, 0 },
8241     { "vphaddbq",       { XM, EXxmm }, 0 },
8242     { Bad_Opcode },
8243     { Bad_Opcode },
8244     { "vphaddwd",       { XM, EXxmm }, 0 },
8245     { "vphaddwq",       { XM, EXxmm }, 0 },
8246     /* c8 */
8247     { Bad_Opcode },
8248     { Bad_Opcode },
8249     { Bad_Opcode },
8250     { "vphadddq",       { XM, EXxmm }, 0 },
8251     { Bad_Opcode },
8252     { Bad_Opcode },
8253     { Bad_Opcode },
8254     { Bad_Opcode },
8255     /* d0 */
8256     { Bad_Opcode },
8257     { "vphaddubw",      { XM, EXxmm }, 0 },
8258     { "vphaddubd",      { XM, EXxmm }, 0 },
8259     { "vphaddubq",      { XM, EXxmm }, 0 },
8260     { Bad_Opcode },
8261     { Bad_Opcode },
8262     { "vphadduwd",      { XM, EXxmm }, 0 },
8263     { "vphadduwq",      { XM, EXxmm }, 0 },
8264     /* d8 */
8265     { Bad_Opcode },
8266     { Bad_Opcode },
8267     { Bad_Opcode },
8268     { "vphaddudq",      { XM, EXxmm }, 0 },
8269     { Bad_Opcode },
8270     { Bad_Opcode },
8271     { Bad_Opcode },
8272     { Bad_Opcode },
8273     /* e0 */
8274     { Bad_Opcode },
8275     { "vphsubbw",       { XM, EXxmm }, 0 },
8276     { "vphsubwd",       { XM, EXxmm }, 0 },
8277     { "vphsubdq",       { XM, EXxmm }, 0 },
8278     { Bad_Opcode },
8279     { Bad_Opcode },
8280     { Bad_Opcode },
8281     { Bad_Opcode },
8282     /* e8 */
8283     { Bad_Opcode },
8284     { Bad_Opcode },
8285     { Bad_Opcode },
8286     { Bad_Opcode },
8287     { Bad_Opcode },
8288     { Bad_Opcode },
8289     { Bad_Opcode },
8290     { Bad_Opcode },
8291     /* f0 */
8292     { Bad_Opcode },
8293     { Bad_Opcode },
8294     { Bad_Opcode },
8295     { Bad_Opcode },
8296     { Bad_Opcode },
8297     { Bad_Opcode },
8298     { Bad_Opcode },
8299     { Bad_Opcode },
8300     /* f8 */
8301     { Bad_Opcode },
8302     { Bad_Opcode },
8303     { Bad_Opcode },
8304     { Bad_Opcode },
8305     { Bad_Opcode },
8306     { Bad_Opcode },
8307     { Bad_Opcode },
8308     { Bad_Opcode },
8309   },
8310   /* XOP_0A */
8311   {
8312     /* 00 */
8313     { Bad_Opcode },
8314     { Bad_Opcode },
8315     { Bad_Opcode },
8316     { Bad_Opcode },
8317     { Bad_Opcode },
8318     { Bad_Opcode },
8319     { Bad_Opcode },
8320     { Bad_Opcode },
8321     /* 08 */
8322     { Bad_Opcode },
8323     { Bad_Opcode },
8324     { Bad_Opcode },
8325     { Bad_Opcode },
8326     { Bad_Opcode },
8327     { Bad_Opcode },
8328     { Bad_Opcode },
8329     { Bad_Opcode },
8330     /* 10 */
8331     { "bextr",  { Gv, Ev, Iq }, 0 },
8332     { Bad_Opcode },
8333     { REG_TABLE (REG_XOP_LWP) },
8334     { Bad_Opcode },
8335     { Bad_Opcode },
8336     { Bad_Opcode },
8337     { Bad_Opcode },
8338     { Bad_Opcode },
8339     /* 18 */
8340     { Bad_Opcode },
8341     { Bad_Opcode },
8342     { Bad_Opcode },
8343     { Bad_Opcode },
8344     { Bad_Opcode },
8345     { Bad_Opcode },
8346     { Bad_Opcode },
8347     { Bad_Opcode },
8348     /* 20 */
8349     { Bad_Opcode },
8350     { Bad_Opcode },
8351     { Bad_Opcode },
8352     { Bad_Opcode },
8353     { Bad_Opcode },
8354     { Bad_Opcode },
8355     { Bad_Opcode },
8356     { Bad_Opcode },
8357     /* 28 */
8358     { Bad_Opcode },
8359     { Bad_Opcode },
8360     { Bad_Opcode },
8361     { Bad_Opcode },
8362     { Bad_Opcode },
8363     { Bad_Opcode },
8364     { Bad_Opcode },
8365     { Bad_Opcode },
8366     /* 30 */
8367     { Bad_Opcode },
8368     { Bad_Opcode },
8369     { Bad_Opcode },
8370     { Bad_Opcode },
8371     { Bad_Opcode },
8372     { Bad_Opcode },
8373     { Bad_Opcode },
8374     { Bad_Opcode },
8375     /* 38 */
8376     { Bad_Opcode },
8377     { Bad_Opcode },
8378     { Bad_Opcode },
8379     { Bad_Opcode },
8380     { Bad_Opcode },
8381     { Bad_Opcode },
8382     { Bad_Opcode },
8383     { Bad_Opcode },
8384     /* 40 */
8385     { Bad_Opcode },
8386     { Bad_Opcode },
8387     { Bad_Opcode },
8388     { Bad_Opcode },
8389     { Bad_Opcode },
8390     { Bad_Opcode },
8391     { Bad_Opcode },
8392     { Bad_Opcode },
8393     /* 48 */
8394     { Bad_Opcode },
8395     { Bad_Opcode },
8396     { Bad_Opcode },
8397     { Bad_Opcode },
8398     { Bad_Opcode },
8399     { Bad_Opcode },
8400     { Bad_Opcode },
8401     { Bad_Opcode },
8402     /* 50 */
8403     { Bad_Opcode },
8404     { Bad_Opcode },
8405     { Bad_Opcode },
8406     { Bad_Opcode },
8407     { Bad_Opcode },
8408     { Bad_Opcode },
8409     { Bad_Opcode },
8410     { Bad_Opcode },
8411     /* 58 */
8412     { Bad_Opcode },
8413     { Bad_Opcode },
8414     { Bad_Opcode },
8415     { Bad_Opcode },
8416     { Bad_Opcode },
8417     { Bad_Opcode },
8418     { Bad_Opcode },
8419     { Bad_Opcode },
8420     /* 60 */
8421     { Bad_Opcode },
8422     { Bad_Opcode },
8423     { Bad_Opcode },
8424     { Bad_Opcode },
8425     { Bad_Opcode },
8426     { Bad_Opcode },
8427     { Bad_Opcode },
8428     { Bad_Opcode },
8429     /* 68 */
8430     { Bad_Opcode },
8431     { Bad_Opcode },
8432     { Bad_Opcode },
8433     { Bad_Opcode },
8434     { Bad_Opcode },
8435     { Bad_Opcode },
8436     { Bad_Opcode },
8437     { Bad_Opcode },
8438     /* 70 */
8439     { Bad_Opcode },
8440     { Bad_Opcode },
8441     { Bad_Opcode },
8442     { Bad_Opcode },
8443     { Bad_Opcode },
8444     { Bad_Opcode },
8445     { Bad_Opcode },
8446     { Bad_Opcode },
8447     /* 78 */
8448     { Bad_Opcode },
8449     { Bad_Opcode },
8450     { Bad_Opcode },
8451     { Bad_Opcode },
8452     { Bad_Opcode },
8453     { Bad_Opcode },
8454     { Bad_Opcode },
8455     { Bad_Opcode },
8456     /* 80 */
8457     { Bad_Opcode },
8458     { Bad_Opcode },
8459     { Bad_Opcode },
8460     { Bad_Opcode },
8461     { Bad_Opcode },
8462     { Bad_Opcode },
8463     { Bad_Opcode },
8464     { Bad_Opcode },
8465     /* 88 */
8466     { Bad_Opcode },
8467     { Bad_Opcode },
8468     { Bad_Opcode },
8469     { Bad_Opcode },
8470     { Bad_Opcode },
8471     { Bad_Opcode },
8472     { Bad_Opcode },
8473     { Bad_Opcode },
8474     /* 90 */
8475     { Bad_Opcode },
8476     { Bad_Opcode },
8477     { Bad_Opcode },
8478     { Bad_Opcode },
8479     { Bad_Opcode },
8480     { Bad_Opcode },
8481     { Bad_Opcode },
8482     { Bad_Opcode },
8483     /* 98 */
8484     { Bad_Opcode },
8485     { Bad_Opcode },
8486     { Bad_Opcode },
8487     { Bad_Opcode },
8488     { Bad_Opcode },
8489     { Bad_Opcode },
8490     { Bad_Opcode },
8491     { Bad_Opcode },
8492     /* a0 */
8493     { Bad_Opcode },
8494     { Bad_Opcode },
8495     { Bad_Opcode },
8496     { Bad_Opcode },
8497     { Bad_Opcode },
8498     { Bad_Opcode },
8499     { Bad_Opcode },
8500     { Bad_Opcode },
8501     /* a8 */
8502     { Bad_Opcode },
8503     { Bad_Opcode },
8504     { Bad_Opcode },
8505     { Bad_Opcode },
8506     { Bad_Opcode },
8507     { Bad_Opcode },
8508     { Bad_Opcode },
8509     { Bad_Opcode },
8510     /* b0 */
8511     { Bad_Opcode },
8512     { Bad_Opcode },
8513     { Bad_Opcode },
8514     { Bad_Opcode },
8515     { Bad_Opcode },
8516     { Bad_Opcode },
8517     { Bad_Opcode },
8518     { Bad_Opcode },
8519     /* b8 */
8520     { Bad_Opcode },
8521     { Bad_Opcode },
8522     { Bad_Opcode },
8523     { Bad_Opcode },
8524     { Bad_Opcode },
8525     { Bad_Opcode },
8526     { Bad_Opcode },
8527     { Bad_Opcode },
8528     /* c0 */
8529     { Bad_Opcode },
8530     { Bad_Opcode },
8531     { Bad_Opcode },
8532     { Bad_Opcode },
8533     { Bad_Opcode },
8534     { Bad_Opcode },
8535     { Bad_Opcode },
8536     { Bad_Opcode },
8537     /* c8 */
8538     { Bad_Opcode },
8539     { Bad_Opcode },
8540     { Bad_Opcode },
8541     { Bad_Opcode },
8542     { Bad_Opcode },
8543     { Bad_Opcode },
8544     { Bad_Opcode },
8545     { Bad_Opcode },
8546     /* d0 */
8547     { Bad_Opcode },
8548     { Bad_Opcode },
8549     { Bad_Opcode },
8550     { Bad_Opcode },
8551     { Bad_Opcode },
8552     { Bad_Opcode },
8553     { Bad_Opcode },
8554     { Bad_Opcode },
8555     /* d8 */
8556     { Bad_Opcode },
8557     { Bad_Opcode },
8558     { Bad_Opcode },
8559     { Bad_Opcode },
8560     { Bad_Opcode },
8561     { Bad_Opcode },
8562     { Bad_Opcode },
8563     { Bad_Opcode },
8564     /* e0 */
8565     { Bad_Opcode },
8566     { Bad_Opcode },
8567     { Bad_Opcode },
8568     { Bad_Opcode },
8569     { Bad_Opcode },
8570     { Bad_Opcode },
8571     { Bad_Opcode },
8572     { Bad_Opcode },
8573     /* e8 */
8574     { Bad_Opcode },
8575     { Bad_Opcode },
8576     { Bad_Opcode },
8577     { Bad_Opcode },
8578     { Bad_Opcode },
8579     { Bad_Opcode },
8580     { Bad_Opcode },
8581     { Bad_Opcode },
8582     /* f0 */
8583     { Bad_Opcode },
8584     { Bad_Opcode },
8585     { Bad_Opcode },
8586     { Bad_Opcode },
8587     { Bad_Opcode },
8588     { Bad_Opcode },
8589     { Bad_Opcode },
8590     { Bad_Opcode },
8591     /* f8 */
8592     { Bad_Opcode },
8593     { Bad_Opcode },
8594     { Bad_Opcode },
8595     { Bad_Opcode },
8596     { Bad_Opcode },
8597     { Bad_Opcode },
8598     { Bad_Opcode },
8599     { Bad_Opcode },
8600   },
8601 };
8602
8603 static const struct dis386 vex_table[][256] = {
8604   /* VEX_0F */
8605   {
8606     /* 00 */
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     /* 08 */
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     /* 10 */
8625     { PREFIX_TABLE (PREFIX_VEX_0F10) },
8626     { PREFIX_TABLE (PREFIX_VEX_0F11) },
8627     { PREFIX_TABLE (PREFIX_VEX_0F12) },
8628     { MOD_TABLE (MOD_VEX_0F13) },
8629     { VEX_W_TABLE (VEX_W_0F14) },
8630     { VEX_W_TABLE (VEX_W_0F15) },
8631     { PREFIX_TABLE (PREFIX_VEX_0F16) },
8632     { MOD_TABLE (MOD_VEX_0F17) },
8633     /* 18 */
8634     { Bad_Opcode },
8635     { Bad_Opcode },
8636     { Bad_Opcode },
8637     { Bad_Opcode },
8638     { Bad_Opcode },
8639     { Bad_Opcode },
8640     { Bad_Opcode },
8641     { Bad_Opcode },
8642     /* 20 */
8643     { Bad_Opcode },
8644     { Bad_Opcode },
8645     { Bad_Opcode },
8646     { Bad_Opcode },
8647     { Bad_Opcode },
8648     { Bad_Opcode },
8649     { Bad_Opcode },
8650     { Bad_Opcode },
8651     /* 28 */
8652     { VEX_W_TABLE (VEX_W_0F28) },
8653     { VEX_W_TABLE (VEX_W_0F29) },
8654     { PREFIX_TABLE (PREFIX_VEX_0F2A) },
8655     { MOD_TABLE (MOD_VEX_0F2B) },
8656     { PREFIX_TABLE (PREFIX_VEX_0F2C) },
8657     { PREFIX_TABLE (PREFIX_VEX_0F2D) },
8658     { PREFIX_TABLE (PREFIX_VEX_0F2E) },
8659     { PREFIX_TABLE (PREFIX_VEX_0F2F) },
8660     /* 30 */
8661     { Bad_Opcode },
8662     { Bad_Opcode },
8663     { Bad_Opcode },
8664     { Bad_Opcode },
8665     { Bad_Opcode },
8666     { Bad_Opcode },
8667     { Bad_Opcode },
8668     { Bad_Opcode },
8669     /* 38 */
8670     { Bad_Opcode },
8671     { Bad_Opcode },
8672     { Bad_Opcode },
8673     { Bad_Opcode },
8674     { Bad_Opcode },
8675     { Bad_Opcode },
8676     { Bad_Opcode },
8677     { Bad_Opcode },
8678     /* 40 */
8679     { Bad_Opcode },
8680     { PREFIX_TABLE (PREFIX_VEX_0F41) },
8681     { PREFIX_TABLE (PREFIX_VEX_0F42) },
8682     { Bad_Opcode },
8683     { PREFIX_TABLE (PREFIX_VEX_0F44) },
8684     { PREFIX_TABLE (PREFIX_VEX_0F45) },
8685     { PREFIX_TABLE (PREFIX_VEX_0F46) },
8686     { PREFIX_TABLE (PREFIX_VEX_0F47) },
8687     /* 48 */
8688     { Bad_Opcode },
8689     { Bad_Opcode },
8690     { PREFIX_TABLE (PREFIX_VEX_0F4A) },
8691     { PREFIX_TABLE (PREFIX_VEX_0F4B) },
8692     { Bad_Opcode },
8693     { Bad_Opcode },
8694     { Bad_Opcode },
8695     { Bad_Opcode },
8696     /* 50 */
8697     { MOD_TABLE (MOD_VEX_0F50) },
8698     { PREFIX_TABLE (PREFIX_VEX_0F51) },
8699     { PREFIX_TABLE (PREFIX_VEX_0F52) },
8700     { PREFIX_TABLE (PREFIX_VEX_0F53) },
8701     { "vandpX",         { XM, Vex, EXx }, 0 },
8702     { "vandnpX",        { XM, Vex, EXx }, 0 },
8703     { "vorpX",          { XM, Vex, EXx }, 0 },
8704     { "vxorpX",         { XM, Vex, EXx }, 0 },
8705     /* 58 */
8706     { PREFIX_TABLE (PREFIX_VEX_0F58) },
8707     { PREFIX_TABLE (PREFIX_VEX_0F59) },
8708     { PREFIX_TABLE (PREFIX_VEX_0F5A) },
8709     { PREFIX_TABLE (PREFIX_VEX_0F5B) },
8710     { PREFIX_TABLE (PREFIX_VEX_0F5C) },
8711     { PREFIX_TABLE (PREFIX_VEX_0F5D) },
8712     { PREFIX_TABLE (PREFIX_VEX_0F5E) },
8713     { PREFIX_TABLE (PREFIX_VEX_0F5F) },
8714     /* 60 */
8715     { PREFIX_TABLE (PREFIX_VEX_0F60) },
8716     { PREFIX_TABLE (PREFIX_VEX_0F61) },
8717     { PREFIX_TABLE (PREFIX_VEX_0F62) },
8718     { PREFIX_TABLE (PREFIX_VEX_0F63) },
8719     { PREFIX_TABLE (PREFIX_VEX_0F64) },
8720     { PREFIX_TABLE (PREFIX_VEX_0F65) },
8721     { PREFIX_TABLE (PREFIX_VEX_0F66) },
8722     { PREFIX_TABLE (PREFIX_VEX_0F67) },
8723     /* 68 */
8724     { PREFIX_TABLE (PREFIX_VEX_0F68) },
8725     { PREFIX_TABLE (PREFIX_VEX_0F69) },
8726     { PREFIX_TABLE (PREFIX_VEX_0F6A) },
8727     { PREFIX_TABLE (PREFIX_VEX_0F6B) },
8728     { PREFIX_TABLE (PREFIX_VEX_0F6C) },
8729     { PREFIX_TABLE (PREFIX_VEX_0F6D) },
8730     { PREFIX_TABLE (PREFIX_VEX_0F6E) },
8731     { PREFIX_TABLE (PREFIX_VEX_0F6F) },
8732     /* 70 */
8733     { PREFIX_TABLE (PREFIX_VEX_0F70) },
8734     { REG_TABLE (REG_VEX_0F71) },
8735     { REG_TABLE (REG_VEX_0F72) },
8736     { REG_TABLE (REG_VEX_0F73) },
8737     { PREFIX_TABLE (PREFIX_VEX_0F74) },
8738     { PREFIX_TABLE (PREFIX_VEX_0F75) },
8739     { PREFIX_TABLE (PREFIX_VEX_0F76) },
8740     { PREFIX_TABLE (PREFIX_VEX_0F77) },
8741     /* 78 */
8742     { Bad_Opcode },
8743     { Bad_Opcode },
8744     { Bad_Opcode },
8745     { Bad_Opcode },
8746     { PREFIX_TABLE (PREFIX_VEX_0F7C) },
8747     { PREFIX_TABLE (PREFIX_VEX_0F7D) },
8748     { PREFIX_TABLE (PREFIX_VEX_0F7E) },
8749     { PREFIX_TABLE (PREFIX_VEX_0F7F) },
8750     /* 80 */
8751     { Bad_Opcode },
8752     { Bad_Opcode },
8753     { Bad_Opcode },
8754     { Bad_Opcode },
8755     { Bad_Opcode },
8756     { Bad_Opcode },
8757     { Bad_Opcode },
8758     { Bad_Opcode },
8759     /* 88 */
8760     { Bad_Opcode },
8761     { Bad_Opcode },
8762     { Bad_Opcode },
8763     { Bad_Opcode },
8764     { Bad_Opcode },
8765     { Bad_Opcode },
8766     { Bad_Opcode },
8767     { Bad_Opcode },
8768     /* 90 */
8769     { PREFIX_TABLE (PREFIX_VEX_0F90) },
8770     { PREFIX_TABLE (PREFIX_VEX_0F91) },
8771     { PREFIX_TABLE (PREFIX_VEX_0F92) },
8772     { PREFIX_TABLE (PREFIX_VEX_0F93) },
8773     { Bad_Opcode },
8774     { Bad_Opcode },
8775     { Bad_Opcode },
8776     { Bad_Opcode },
8777     /* 98 */
8778     { PREFIX_TABLE (PREFIX_VEX_0F98) },
8779     { PREFIX_TABLE (PREFIX_VEX_0F99) },
8780     { Bad_Opcode },
8781     { Bad_Opcode },
8782     { Bad_Opcode },
8783     { Bad_Opcode },
8784     { Bad_Opcode },
8785     { Bad_Opcode },
8786     /* a0 */
8787     { Bad_Opcode },
8788     { Bad_Opcode },
8789     { Bad_Opcode },
8790     { Bad_Opcode },
8791     { Bad_Opcode },
8792     { Bad_Opcode },
8793     { Bad_Opcode },
8794     { Bad_Opcode },
8795     /* a8 */
8796     { Bad_Opcode },
8797     { Bad_Opcode },
8798     { Bad_Opcode },
8799     { Bad_Opcode },
8800     { Bad_Opcode },
8801     { Bad_Opcode },
8802     { REG_TABLE (REG_VEX_0FAE) },
8803     { Bad_Opcode },
8804     /* b0 */
8805     { Bad_Opcode },
8806     { Bad_Opcode },
8807     { Bad_Opcode },
8808     { Bad_Opcode },
8809     { Bad_Opcode },
8810     { Bad_Opcode },
8811     { Bad_Opcode },
8812     { Bad_Opcode },
8813     /* b8 */
8814     { Bad_Opcode },
8815     { Bad_Opcode },
8816     { Bad_Opcode },
8817     { Bad_Opcode },
8818     { Bad_Opcode },
8819     { Bad_Opcode },
8820     { Bad_Opcode },
8821     { Bad_Opcode },
8822     /* c0 */
8823     { Bad_Opcode },
8824     { Bad_Opcode },
8825     { PREFIX_TABLE (PREFIX_VEX_0FC2) },
8826     { Bad_Opcode },
8827     { PREFIX_TABLE (PREFIX_VEX_0FC4) },
8828     { PREFIX_TABLE (PREFIX_VEX_0FC5) },
8829     { "vshufpX",        { XM, Vex, EXx, Ib }, 0 },
8830     { Bad_Opcode },
8831     /* c8 */
8832     { Bad_Opcode },
8833     { Bad_Opcode },
8834     { Bad_Opcode },
8835     { Bad_Opcode },
8836     { Bad_Opcode },
8837     { Bad_Opcode },
8838     { Bad_Opcode },
8839     { Bad_Opcode },
8840     /* d0 */
8841     { PREFIX_TABLE (PREFIX_VEX_0FD0) },
8842     { PREFIX_TABLE (PREFIX_VEX_0FD1) },
8843     { PREFIX_TABLE (PREFIX_VEX_0FD2) },
8844     { PREFIX_TABLE (PREFIX_VEX_0FD3) },
8845     { PREFIX_TABLE (PREFIX_VEX_0FD4) },
8846     { PREFIX_TABLE (PREFIX_VEX_0FD5) },
8847     { PREFIX_TABLE (PREFIX_VEX_0FD6) },
8848     { PREFIX_TABLE (PREFIX_VEX_0FD7) },
8849     /* d8 */
8850     { PREFIX_TABLE (PREFIX_VEX_0FD8) },
8851     { PREFIX_TABLE (PREFIX_VEX_0FD9) },
8852     { PREFIX_TABLE (PREFIX_VEX_0FDA) },
8853     { PREFIX_TABLE (PREFIX_VEX_0FDB) },
8854     { PREFIX_TABLE (PREFIX_VEX_0FDC) },
8855     { PREFIX_TABLE (PREFIX_VEX_0FDD) },
8856     { PREFIX_TABLE (PREFIX_VEX_0FDE) },
8857     { PREFIX_TABLE (PREFIX_VEX_0FDF) },
8858     /* e0 */
8859     { PREFIX_TABLE (PREFIX_VEX_0FE0) },
8860     { PREFIX_TABLE (PREFIX_VEX_0FE1) },
8861     { PREFIX_TABLE (PREFIX_VEX_0FE2) },
8862     { PREFIX_TABLE (PREFIX_VEX_0FE3) },
8863     { PREFIX_TABLE (PREFIX_VEX_0FE4) },
8864     { PREFIX_TABLE (PREFIX_VEX_0FE5) },
8865     { PREFIX_TABLE (PREFIX_VEX_0FE6) },
8866     { PREFIX_TABLE (PREFIX_VEX_0FE7) },
8867     /* e8 */
8868     { PREFIX_TABLE (PREFIX_VEX_0FE8) },
8869     { PREFIX_TABLE (PREFIX_VEX_0FE9) },
8870     { PREFIX_TABLE (PREFIX_VEX_0FEA) },
8871     { PREFIX_TABLE (PREFIX_VEX_0FEB) },
8872     { PREFIX_TABLE (PREFIX_VEX_0FEC) },
8873     { PREFIX_TABLE (PREFIX_VEX_0FED) },
8874     { PREFIX_TABLE (PREFIX_VEX_0FEE) },
8875     { PREFIX_TABLE (PREFIX_VEX_0FEF) },
8876     /* f0 */
8877     { PREFIX_TABLE (PREFIX_VEX_0FF0) },
8878     { PREFIX_TABLE (PREFIX_VEX_0FF1) },
8879     { PREFIX_TABLE (PREFIX_VEX_0FF2) },
8880     { PREFIX_TABLE (PREFIX_VEX_0FF3) },
8881     { PREFIX_TABLE (PREFIX_VEX_0FF4) },
8882     { PREFIX_TABLE (PREFIX_VEX_0FF5) },
8883     { PREFIX_TABLE (PREFIX_VEX_0FF6) },
8884     { PREFIX_TABLE (PREFIX_VEX_0FF7) },
8885     /* f8 */
8886     { PREFIX_TABLE (PREFIX_VEX_0FF8) },
8887     { PREFIX_TABLE (PREFIX_VEX_0FF9) },
8888     { PREFIX_TABLE (PREFIX_VEX_0FFA) },
8889     { PREFIX_TABLE (PREFIX_VEX_0FFB) },
8890     { PREFIX_TABLE (PREFIX_VEX_0FFC) },
8891     { PREFIX_TABLE (PREFIX_VEX_0FFD) },
8892     { PREFIX_TABLE (PREFIX_VEX_0FFE) },
8893     { Bad_Opcode },
8894   },
8895   /* VEX_0F38 */
8896   {
8897     /* 00 */
8898     { PREFIX_TABLE (PREFIX_VEX_0F3800) },
8899     { PREFIX_TABLE (PREFIX_VEX_0F3801) },
8900     { PREFIX_TABLE (PREFIX_VEX_0F3802) },
8901     { PREFIX_TABLE (PREFIX_VEX_0F3803) },
8902     { PREFIX_TABLE (PREFIX_VEX_0F3804) },
8903     { PREFIX_TABLE (PREFIX_VEX_0F3805) },
8904     { PREFIX_TABLE (PREFIX_VEX_0F3806) },
8905     { PREFIX_TABLE (PREFIX_VEX_0F3807) },
8906     /* 08 */
8907     { PREFIX_TABLE (PREFIX_VEX_0F3808) },
8908     { PREFIX_TABLE (PREFIX_VEX_0F3809) },
8909     { PREFIX_TABLE (PREFIX_VEX_0F380A) },
8910     { PREFIX_TABLE (PREFIX_VEX_0F380B) },
8911     { PREFIX_TABLE (PREFIX_VEX_0F380C) },
8912     { PREFIX_TABLE (PREFIX_VEX_0F380D) },
8913     { PREFIX_TABLE (PREFIX_VEX_0F380E) },
8914     { PREFIX_TABLE (PREFIX_VEX_0F380F) },
8915     /* 10 */
8916     { Bad_Opcode },
8917     { Bad_Opcode },
8918     { Bad_Opcode },
8919     { PREFIX_TABLE (PREFIX_VEX_0F3813) },
8920     { Bad_Opcode },
8921     { Bad_Opcode },
8922     { PREFIX_TABLE (PREFIX_VEX_0F3816) },
8923     { PREFIX_TABLE (PREFIX_VEX_0F3817) },
8924     /* 18 */
8925     { PREFIX_TABLE (PREFIX_VEX_0F3818) },
8926     { PREFIX_TABLE (PREFIX_VEX_0F3819) },
8927     { PREFIX_TABLE (PREFIX_VEX_0F381A) },
8928     { Bad_Opcode },
8929     { PREFIX_TABLE (PREFIX_VEX_0F381C) },
8930     { PREFIX_TABLE (PREFIX_VEX_0F381D) },
8931     { PREFIX_TABLE (PREFIX_VEX_0F381E) },
8932     { Bad_Opcode },
8933     /* 20 */
8934     { PREFIX_TABLE (PREFIX_VEX_0F3820) },
8935     { PREFIX_TABLE (PREFIX_VEX_0F3821) },
8936     { PREFIX_TABLE (PREFIX_VEX_0F3822) },
8937     { PREFIX_TABLE (PREFIX_VEX_0F3823) },
8938     { PREFIX_TABLE (PREFIX_VEX_0F3824) },
8939     { PREFIX_TABLE (PREFIX_VEX_0F3825) },
8940     { Bad_Opcode },
8941     { Bad_Opcode },
8942     /* 28 */
8943     { PREFIX_TABLE (PREFIX_VEX_0F3828) },
8944     { PREFIX_TABLE (PREFIX_VEX_0F3829) },
8945     { PREFIX_TABLE (PREFIX_VEX_0F382A) },
8946     { PREFIX_TABLE (PREFIX_VEX_0F382B) },
8947     { PREFIX_TABLE (PREFIX_VEX_0F382C) },
8948     { PREFIX_TABLE (PREFIX_VEX_0F382D) },
8949     { PREFIX_TABLE (PREFIX_VEX_0F382E) },
8950     { PREFIX_TABLE (PREFIX_VEX_0F382F) },
8951     /* 30 */
8952     { PREFIX_TABLE (PREFIX_VEX_0F3830) },
8953     { PREFIX_TABLE (PREFIX_VEX_0F3831) },
8954     { PREFIX_TABLE (PREFIX_VEX_0F3832) },
8955     { PREFIX_TABLE (PREFIX_VEX_0F3833) },
8956     { PREFIX_TABLE (PREFIX_VEX_0F3834) },
8957     { PREFIX_TABLE (PREFIX_VEX_0F3835) },
8958     { PREFIX_TABLE (PREFIX_VEX_0F3836) },
8959     { PREFIX_TABLE (PREFIX_VEX_0F3837) },
8960     /* 38 */
8961     { PREFIX_TABLE (PREFIX_VEX_0F3838) },
8962     { PREFIX_TABLE (PREFIX_VEX_0F3839) },
8963     { PREFIX_TABLE (PREFIX_VEX_0F383A) },
8964     { PREFIX_TABLE (PREFIX_VEX_0F383B) },
8965     { PREFIX_TABLE (PREFIX_VEX_0F383C) },
8966     { PREFIX_TABLE (PREFIX_VEX_0F383D) },
8967     { PREFIX_TABLE (PREFIX_VEX_0F383E) },
8968     { PREFIX_TABLE (PREFIX_VEX_0F383F) },
8969     /* 40 */
8970     { PREFIX_TABLE (PREFIX_VEX_0F3840) },
8971     { PREFIX_TABLE (PREFIX_VEX_0F3841) },
8972     { Bad_Opcode },
8973     { Bad_Opcode },
8974     { Bad_Opcode },
8975     { PREFIX_TABLE (PREFIX_VEX_0F3845) },
8976     { PREFIX_TABLE (PREFIX_VEX_0F3846) },
8977     { PREFIX_TABLE (PREFIX_VEX_0F3847) },
8978     /* 48 */
8979     { Bad_Opcode },
8980     { Bad_Opcode },
8981     { Bad_Opcode },
8982     { Bad_Opcode },
8983     { Bad_Opcode },
8984     { Bad_Opcode },
8985     { Bad_Opcode },
8986     { Bad_Opcode },
8987     /* 50 */
8988     { Bad_Opcode },
8989     { Bad_Opcode },
8990     { Bad_Opcode },
8991     { Bad_Opcode },
8992     { Bad_Opcode },
8993     { Bad_Opcode },
8994     { Bad_Opcode },
8995     { Bad_Opcode },
8996     /* 58 */
8997     { PREFIX_TABLE (PREFIX_VEX_0F3858) },
8998     { PREFIX_TABLE (PREFIX_VEX_0F3859) },
8999     { PREFIX_TABLE (PREFIX_VEX_0F385A) },
9000     { Bad_Opcode },
9001     { Bad_Opcode },
9002     { Bad_Opcode },
9003     { Bad_Opcode },
9004     { Bad_Opcode },
9005     /* 60 */
9006     { Bad_Opcode },
9007     { Bad_Opcode },
9008     { Bad_Opcode },
9009     { Bad_Opcode },
9010     { Bad_Opcode },
9011     { Bad_Opcode },
9012     { Bad_Opcode },
9013     { Bad_Opcode },
9014     /* 68 */
9015     { Bad_Opcode },
9016     { Bad_Opcode },
9017     { Bad_Opcode },
9018     { Bad_Opcode },
9019     { Bad_Opcode },
9020     { Bad_Opcode },
9021     { Bad_Opcode },
9022     { Bad_Opcode },
9023     /* 70 */
9024     { Bad_Opcode },
9025     { Bad_Opcode },
9026     { Bad_Opcode },
9027     { Bad_Opcode },
9028     { Bad_Opcode },
9029     { Bad_Opcode },
9030     { Bad_Opcode },
9031     { Bad_Opcode },
9032     /* 78 */
9033     { PREFIX_TABLE (PREFIX_VEX_0F3878) },
9034     { PREFIX_TABLE (PREFIX_VEX_0F3879) },
9035     { Bad_Opcode },
9036     { Bad_Opcode },
9037     { Bad_Opcode },
9038     { Bad_Opcode },
9039     { Bad_Opcode },
9040     { Bad_Opcode },
9041     /* 80 */
9042     { Bad_Opcode },
9043     { Bad_Opcode },
9044     { Bad_Opcode },
9045     { Bad_Opcode },
9046     { Bad_Opcode },
9047     { Bad_Opcode },
9048     { Bad_Opcode },
9049     { Bad_Opcode },
9050     /* 88 */
9051     { Bad_Opcode },
9052     { Bad_Opcode },
9053     { Bad_Opcode },
9054     { Bad_Opcode },
9055     { PREFIX_TABLE (PREFIX_VEX_0F388C) },
9056     { Bad_Opcode },
9057     { PREFIX_TABLE (PREFIX_VEX_0F388E) },
9058     { Bad_Opcode },
9059     /* 90 */
9060     { PREFIX_TABLE (PREFIX_VEX_0F3890) },
9061     { PREFIX_TABLE (PREFIX_VEX_0F3891) },
9062     { PREFIX_TABLE (PREFIX_VEX_0F3892) },
9063     { PREFIX_TABLE (PREFIX_VEX_0F3893) },
9064     { Bad_Opcode },
9065     { Bad_Opcode },
9066     { PREFIX_TABLE (PREFIX_VEX_0F3896) },
9067     { PREFIX_TABLE (PREFIX_VEX_0F3897) },
9068     /* 98 */
9069     { PREFIX_TABLE (PREFIX_VEX_0F3898) },
9070     { PREFIX_TABLE (PREFIX_VEX_0F3899) },
9071     { PREFIX_TABLE (PREFIX_VEX_0F389A) },
9072     { PREFIX_TABLE (PREFIX_VEX_0F389B) },
9073     { PREFIX_TABLE (PREFIX_VEX_0F389C) },
9074     { PREFIX_TABLE (PREFIX_VEX_0F389D) },
9075     { PREFIX_TABLE (PREFIX_VEX_0F389E) },
9076     { PREFIX_TABLE (PREFIX_VEX_0F389F) },
9077     /* a0 */
9078     { Bad_Opcode },
9079     { Bad_Opcode },
9080     { Bad_Opcode },
9081     { Bad_Opcode },
9082     { Bad_Opcode },
9083     { Bad_Opcode },
9084     { PREFIX_TABLE (PREFIX_VEX_0F38A6) },
9085     { PREFIX_TABLE (PREFIX_VEX_0F38A7) },
9086     /* a8 */
9087     { PREFIX_TABLE (PREFIX_VEX_0F38A8) },
9088     { PREFIX_TABLE (PREFIX_VEX_0F38A9) },
9089     { PREFIX_TABLE (PREFIX_VEX_0F38AA) },
9090     { PREFIX_TABLE (PREFIX_VEX_0F38AB) },
9091     { PREFIX_TABLE (PREFIX_VEX_0F38AC) },
9092     { PREFIX_TABLE (PREFIX_VEX_0F38AD) },
9093     { PREFIX_TABLE (PREFIX_VEX_0F38AE) },
9094     { PREFIX_TABLE (PREFIX_VEX_0F38AF) },
9095     /* b0 */
9096     { Bad_Opcode },
9097     { Bad_Opcode },
9098     { Bad_Opcode },
9099     { Bad_Opcode },
9100     { Bad_Opcode },
9101     { Bad_Opcode },
9102     { PREFIX_TABLE (PREFIX_VEX_0F38B6) },
9103     { PREFIX_TABLE (PREFIX_VEX_0F38B7) },
9104     /* b8 */
9105     { PREFIX_TABLE (PREFIX_VEX_0F38B8) },
9106     { PREFIX_TABLE (PREFIX_VEX_0F38B9) },
9107     { PREFIX_TABLE (PREFIX_VEX_0F38BA) },
9108     { PREFIX_TABLE (PREFIX_VEX_0F38BB) },
9109     { PREFIX_TABLE (PREFIX_VEX_0F38BC) },
9110     { PREFIX_TABLE (PREFIX_VEX_0F38BD) },
9111     { PREFIX_TABLE (PREFIX_VEX_0F38BE) },
9112     { PREFIX_TABLE (PREFIX_VEX_0F38BF) },
9113     /* c0 */
9114     { Bad_Opcode },
9115     { Bad_Opcode },
9116     { Bad_Opcode },
9117     { Bad_Opcode },
9118     { Bad_Opcode },
9119     { Bad_Opcode },
9120     { Bad_Opcode },
9121     { Bad_Opcode },
9122     /* c8 */
9123     { Bad_Opcode },
9124     { Bad_Opcode },
9125     { Bad_Opcode },
9126     { Bad_Opcode },
9127     { Bad_Opcode },
9128     { Bad_Opcode },
9129     { Bad_Opcode },
9130     { Bad_Opcode },
9131     /* d0 */
9132     { Bad_Opcode },
9133     { Bad_Opcode },
9134     { Bad_Opcode },
9135     { Bad_Opcode },
9136     { Bad_Opcode },
9137     { Bad_Opcode },
9138     { Bad_Opcode },
9139     { Bad_Opcode },
9140     /* d8 */
9141     { Bad_Opcode },
9142     { Bad_Opcode },
9143     { Bad_Opcode },
9144     { PREFIX_TABLE (PREFIX_VEX_0F38DB) },
9145     { PREFIX_TABLE (PREFIX_VEX_0F38DC) },
9146     { PREFIX_TABLE (PREFIX_VEX_0F38DD) },
9147     { PREFIX_TABLE (PREFIX_VEX_0F38DE) },
9148     { PREFIX_TABLE (PREFIX_VEX_0F38DF) },
9149     /* e0 */
9150     { Bad_Opcode },
9151     { Bad_Opcode },
9152     { Bad_Opcode },
9153     { Bad_Opcode },
9154     { Bad_Opcode },
9155     { Bad_Opcode },
9156     { Bad_Opcode },
9157     { Bad_Opcode },
9158     /* e8 */
9159     { Bad_Opcode },
9160     { Bad_Opcode },
9161     { Bad_Opcode },
9162     { Bad_Opcode },
9163     { Bad_Opcode },
9164     { Bad_Opcode },
9165     { Bad_Opcode },
9166     { Bad_Opcode },
9167     /* f0 */
9168     { Bad_Opcode },
9169     { Bad_Opcode },
9170     { PREFIX_TABLE (PREFIX_VEX_0F38F2) },
9171     { REG_TABLE (REG_VEX_0F38F3) },
9172     { Bad_Opcode },
9173     { PREFIX_TABLE (PREFIX_VEX_0F38F5) },
9174     { PREFIX_TABLE (PREFIX_VEX_0F38F6) },
9175     { PREFIX_TABLE (PREFIX_VEX_0F38F7) },
9176     /* f8 */
9177     { Bad_Opcode },
9178     { Bad_Opcode },
9179     { Bad_Opcode },
9180     { Bad_Opcode },
9181     { Bad_Opcode },
9182     { Bad_Opcode },
9183     { Bad_Opcode },
9184     { Bad_Opcode },
9185   },
9186   /* VEX_0F3A */
9187   {
9188     /* 00 */
9189     { PREFIX_TABLE (PREFIX_VEX_0F3A00) },
9190     { PREFIX_TABLE (PREFIX_VEX_0F3A01) },
9191     { PREFIX_TABLE (PREFIX_VEX_0F3A02) },
9192     { Bad_Opcode },
9193     { PREFIX_TABLE (PREFIX_VEX_0F3A04) },
9194     { PREFIX_TABLE (PREFIX_VEX_0F3A05) },
9195     { PREFIX_TABLE (PREFIX_VEX_0F3A06) },
9196     { Bad_Opcode },
9197     /* 08 */
9198     { PREFIX_TABLE (PREFIX_VEX_0F3A08) },
9199     { PREFIX_TABLE (PREFIX_VEX_0F3A09) },
9200     { PREFIX_TABLE (PREFIX_VEX_0F3A0A) },
9201     { PREFIX_TABLE (PREFIX_VEX_0F3A0B) },
9202     { PREFIX_TABLE (PREFIX_VEX_0F3A0C) },
9203     { PREFIX_TABLE (PREFIX_VEX_0F3A0D) },
9204     { PREFIX_TABLE (PREFIX_VEX_0F3A0E) },
9205     { PREFIX_TABLE (PREFIX_VEX_0F3A0F) },
9206     /* 10 */
9207     { Bad_Opcode },
9208     { Bad_Opcode },
9209     { Bad_Opcode },
9210     { Bad_Opcode },
9211     { PREFIX_TABLE (PREFIX_VEX_0F3A14) },
9212     { PREFIX_TABLE (PREFIX_VEX_0F3A15) },
9213     { PREFIX_TABLE (PREFIX_VEX_0F3A16) },
9214     { PREFIX_TABLE (PREFIX_VEX_0F3A17) },
9215     /* 18 */
9216     { PREFIX_TABLE (PREFIX_VEX_0F3A18) },
9217     { PREFIX_TABLE (PREFIX_VEX_0F3A19) },
9218     { Bad_Opcode },
9219     { Bad_Opcode },
9220     { Bad_Opcode },
9221     { PREFIX_TABLE (PREFIX_VEX_0F3A1D) },
9222     { Bad_Opcode },
9223     { Bad_Opcode },
9224     /* 20 */
9225     { PREFIX_TABLE (PREFIX_VEX_0F3A20) },
9226     { PREFIX_TABLE (PREFIX_VEX_0F3A21) },
9227     { PREFIX_TABLE (PREFIX_VEX_0F3A22) },
9228     { Bad_Opcode },
9229     { Bad_Opcode },
9230     { Bad_Opcode },
9231     { Bad_Opcode },
9232     { Bad_Opcode },
9233     /* 28 */
9234     { Bad_Opcode },
9235     { Bad_Opcode },
9236     { Bad_Opcode },
9237     { Bad_Opcode },
9238     { Bad_Opcode },
9239     { Bad_Opcode },
9240     { Bad_Opcode },
9241     { Bad_Opcode },
9242     /* 30 */
9243     { PREFIX_TABLE (PREFIX_VEX_0F3A30) },
9244     { PREFIX_TABLE (PREFIX_VEX_0F3A31) },
9245     { PREFIX_TABLE (PREFIX_VEX_0F3A32) },
9246     { PREFIX_TABLE (PREFIX_VEX_0F3A33) },
9247     { Bad_Opcode },
9248     { Bad_Opcode },
9249     { Bad_Opcode },
9250     { Bad_Opcode },
9251     /* 38 */
9252     { PREFIX_TABLE (PREFIX_VEX_0F3A38) },
9253     { PREFIX_TABLE (PREFIX_VEX_0F3A39) },
9254     { Bad_Opcode },
9255     { Bad_Opcode },
9256     { Bad_Opcode },
9257     { Bad_Opcode },
9258     { Bad_Opcode },
9259     { Bad_Opcode },
9260     /* 40 */
9261     { PREFIX_TABLE (PREFIX_VEX_0F3A40) },
9262     { PREFIX_TABLE (PREFIX_VEX_0F3A41) },
9263     { PREFIX_TABLE (PREFIX_VEX_0F3A42) },
9264     { Bad_Opcode },
9265     { PREFIX_TABLE (PREFIX_VEX_0F3A44) },
9266     { Bad_Opcode },
9267     { PREFIX_TABLE (PREFIX_VEX_0F3A46) },
9268     { Bad_Opcode },
9269     /* 48 */
9270     { PREFIX_TABLE (PREFIX_VEX_0F3A48) },
9271     { PREFIX_TABLE (PREFIX_VEX_0F3A49) },
9272     { PREFIX_TABLE (PREFIX_VEX_0F3A4A) },
9273     { PREFIX_TABLE (PREFIX_VEX_0F3A4B) },
9274     { PREFIX_TABLE (PREFIX_VEX_0F3A4C) },
9275     { Bad_Opcode },
9276     { Bad_Opcode },
9277     { Bad_Opcode },
9278     /* 50 */
9279     { Bad_Opcode },
9280     { Bad_Opcode },
9281     { Bad_Opcode },
9282     { Bad_Opcode },
9283     { Bad_Opcode },
9284     { Bad_Opcode },
9285     { Bad_Opcode },
9286     { Bad_Opcode },
9287     /* 58 */
9288     { Bad_Opcode },
9289     { Bad_Opcode },
9290     { Bad_Opcode },
9291     { Bad_Opcode },
9292     { PREFIX_TABLE (PREFIX_VEX_0F3A5C) },
9293     { PREFIX_TABLE (PREFIX_VEX_0F3A5D) },
9294     { PREFIX_TABLE (PREFIX_VEX_0F3A5E) },
9295     { PREFIX_TABLE (PREFIX_VEX_0F3A5F) },
9296     /* 60 */
9297     { PREFIX_TABLE (PREFIX_VEX_0F3A60) },
9298     { PREFIX_TABLE (PREFIX_VEX_0F3A61) },
9299     { PREFIX_TABLE (PREFIX_VEX_0F3A62) },
9300     { PREFIX_TABLE (PREFIX_VEX_0F3A63) },
9301     { Bad_Opcode },
9302     { Bad_Opcode },
9303     { Bad_Opcode },
9304     { Bad_Opcode },
9305     /* 68 */
9306     { PREFIX_TABLE (PREFIX_VEX_0F3A68) },
9307     { PREFIX_TABLE (PREFIX_VEX_0F3A69) },
9308     { PREFIX_TABLE (PREFIX_VEX_0F3A6A) },
9309     { PREFIX_TABLE (PREFIX_VEX_0F3A6B) },
9310     { PREFIX_TABLE (PREFIX_VEX_0F3A6C) },
9311     { PREFIX_TABLE (PREFIX_VEX_0F3A6D) },
9312     { PREFIX_TABLE (PREFIX_VEX_0F3A6E) },
9313     { PREFIX_TABLE (PREFIX_VEX_0F3A6F) },
9314     /* 70 */
9315     { Bad_Opcode },
9316     { Bad_Opcode },
9317     { Bad_Opcode },
9318     { Bad_Opcode },
9319     { Bad_Opcode },
9320     { Bad_Opcode },
9321     { Bad_Opcode },
9322     { Bad_Opcode },
9323     /* 78 */
9324     { PREFIX_TABLE (PREFIX_VEX_0F3A78) },
9325     { PREFIX_TABLE (PREFIX_VEX_0F3A79) },
9326     { PREFIX_TABLE (PREFIX_VEX_0F3A7A) },
9327     { PREFIX_TABLE (PREFIX_VEX_0F3A7B) },
9328     { PREFIX_TABLE (PREFIX_VEX_0F3A7C) },
9329     { PREFIX_TABLE (PREFIX_VEX_0F3A7D) },
9330     { PREFIX_TABLE (PREFIX_VEX_0F3A7E) },
9331     { PREFIX_TABLE (PREFIX_VEX_0F3A7F) },
9332     /* 80 */
9333     { Bad_Opcode },
9334     { Bad_Opcode },
9335     { Bad_Opcode },
9336     { Bad_Opcode },
9337     { Bad_Opcode },
9338     { Bad_Opcode },
9339     { Bad_Opcode },
9340     { Bad_Opcode },
9341     /* 88 */
9342     { Bad_Opcode },
9343     { Bad_Opcode },
9344     { Bad_Opcode },
9345     { Bad_Opcode },
9346     { Bad_Opcode },
9347     { Bad_Opcode },
9348     { Bad_Opcode },
9349     { Bad_Opcode },
9350     /* 90 */
9351     { Bad_Opcode },
9352     { Bad_Opcode },
9353     { Bad_Opcode },
9354     { Bad_Opcode },
9355     { Bad_Opcode },
9356     { Bad_Opcode },
9357     { Bad_Opcode },
9358     { Bad_Opcode },
9359     /* 98 */
9360     { Bad_Opcode },
9361     { Bad_Opcode },
9362     { Bad_Opcode },
9363     { Bad_Opcode },
9364     { Bad_Opcode },
9365     { Bad_Opcode },
9366     { Bad_Opcode },
9367     { Bad_Opcode },
9368     /* a0 */
9369     { Bad_Opcode },
9370     { Bad_Opcode },
9371     { Bad_Opcode },
9372     { Bad_Opcode },
9373     { Bad_Opcode },
9374     { Bad_Opcode },
9375     { Bad_Opcode },
9376     { Bad_Opcode },
9377     /* a8 */
9378     { Bad_Opcode },
9379     { Bad_Opcode },
9380     { Bad_Opcode },
9381     { Bad_Opcode },
9382     { Bad_Opcode },
9383     { Bad_Opcode },
9384     { Bad_Opcode },
9385     { Bad_Opcode },
9386     /* b0 */
9387     { Bad_Opcode },
9388     { Bad_Opcode },
9389     { Bad_Opcode },
9390     { Bad_Opcode },
9391     { Bad_Opcode },
9392     { Bad_Opcode },
9393     { Bad_Opcode },
9394     { Bad_Opcode },
9395     /* b8 */
9396     { Bad_Opcode },
9397     { Bad_Opcode },
9398     { Bad_Opcode },
9399     { Bad_Opcode },
9400     { Bad_Opcode },
9401     { Bad_Opcode },
9402     { Bad_Opcode },
9403     { Bad_Opcode },
9404     /* c0 */
9405     { Bad_Opcode },
9406     { Bad_Opcode },
9407     { Bad_Opcode },
9408     { Bad_Opcode },
9409     { Bad_Opcode },
9410     { Bad_Opcode },
9411     { Bad_Opcode },
9412     { Bad_Opcode },
9413     /* c8 */
9414     { Bad_Opcode },
9415     { Bad_Opcode },
9416     { Bad_Opcode },
9417     { Bad_Opcode },
9418     { Bad_Opcode },
9419     { Bad_Opcode },
9420     { Bad_Opcode },
9421     { Bad_Opcode },
9422     /* d0 */
9423     { Bad_Opcode },
9424     { Bad_Opcode },
9425     { Bad_Opcode },
9426     { Bad_Opcode },
9427     { Bad_Opcode },
9428     { Bad_Opcode },
9429     { Bad_Opcode },
9430     { Bad_Opcode },
9431     /* d8 */
9432     { Bad_Opcode },
9433     { Bad_Opcode },
9434     { Bad_Opcode },
9435     { Bad_Opcode },
9436     { Bad_Opcode },
9437     { Bad_Opcode },
9438     { Bad_Opcode },
9439     { PREFIX_TABLE (PREFIX_VEX_0F3ADF) },
9440     /* e0 */
9441     { Bad_Opcode },
9442     { Bad_Opcode },
9443     { Bad_Opcode },
9444     { Bad_Opcode },
9445     { Bad_Opcode },
9446     { Bad_Opcode },
9447     { Bad_Opcode },
9448     { Bad_Opcode },
9449     /* e8 */
9450     { Bad_Opcode },
9451     { Bad_Opcode },
9452     { Bad_Opcode },
9453     { Bad_Opcode },
9454     { Bad_Opcode },
9455     { Bad_Opcode },
9456     { Bad_Opcode },
9457     { Bad_Opcode },
9458     /* f0 */
9459     { PREFIX_TABLE (PREFIX_VEX_0F3AF0) },
9460     { Bad_Opcode },
9461     { Bad_Opcode },
9462     { Bad_Opcode },
9463     { Bad_Opcode },
9464     { Bad_Opcode },
9465     { Bad_Opcode },
9466     { Bad_Opcode },
9467     /* f8 */
9468     { Bad_Opcode },
9469     { Bad_Opcode },
9470     { Bad_Opcode },
9471     { Bad_Opcode },
9472     { Bad_Opcode },
9473     { Bad_Opcode },
9474     { Bad_Opcode },
9475     { Bad_Opcode },
9476   },
9477 };
9478
9479 #define NEED_OPCODE_TABLE
9480 #include "i386-dis-evex.h"
9481 #undef NEED_OPCODE_TABLE
9482 static const struct dis386 vex_len_table[][2] = {
9483   /* VEX_LEN_0F10_P_1 */
9484   {
9485     { VEX_W_TABLE (VEX_W_0F10_P_1) },
9486     { VEX_W_TABLE (VEX_W_0F10_P_1) },
9487   },
9488
9489   /* VEX_LEN_0F10_P_3 */
9490   {
9491     { VEX_W_TABLE (VEX_W_0F10_P_3) },
9492     { VEX_W_TABLE (VEX_W_0F10_P_3) },
9493   },
9494
9495   /* VEX_LEN_0F11_P_1 */
9496   {
9497     { VEX_W_TABLE (VEX_W_0F11_P_1) },
9498     { VEX_W_TABLE (VEX_W_0F11_P_1) },
9499   },
9500
9501   /* VEX_LEN_0F11_P_3 */
9502   {
9503     { VEX_W_TABLE (VEX_W_0F11_P_3) },
9504     { VEX_W_TABLE (VEX_W_0F11_P_3) },
9505   },
9506
9507   /* VEX_LEN_0F12_P_0_M_0 */
9508   {
9509     { VEX_W_TABLE (VEX_W_0F12_P_0_M_0) },
9510   },
9511
9512   /* VEX_LEN_0F12_P_0_M_1 */
9513   {
9514     { VEX_W_TABLE (VEX_W_0F12_P_0_M_1) },
9515   },
9516
9517   /* VEX_LEN_0F12_P_2 */
9518   {
9519     { VEX_W_TABLE (VEX_W_0F12_P_2) },
9520   },
9521
9522   /* VEX_LEN_0F13_M_0 */
9523   {
9524     { VEX_W_TABLE (VEX_W_0F13_M_0) },
9525   },
9526
9527   /* VEX_LEN_0F16_P_0_M_0 */
9528   {
9529     { VEX_W_TABLE (VEX_W_0F16_P_0_M_0) },
9530   },
9531
9532   /* VEX_LEN_0F16_P_0_M_1 */
9533   {
9534     { VEX_W_TABLE (VEX_W_0F16_P_0_M_1) },
9535   },
9536
9537   /* VEX_LEN_0F16_P_2 */
9538   {
9539     { VEX_W_TABLE (VEX_W_0F16_P_2) },
9540   },
9541
9542   /* VEX_LEN_0F17_M_0 */
9543   {
9544     { VEX_W_TABLE (VEX_W_0F17_M_0) },
9545   },
9546
9547   /* VEX_LEN_0F2A_P_1 */
9548   {
9549     { "vcvtsi2ss%LQ",   { XMScalar, VexScalar, Ev }, 0 },
9550     { "vcvtsi2ss%LQ",   { XMScalar, VexScalar, Ev }, 0 },
9551   },
9552
9553   /* VEX_LEN_0F2A_P_3 */
9554   {
9555     { "vcvtsi2sd%LQ",   { XMScalar, VexScalar, Ev }, 0 },
9556     { "vcvtsi2sd%LQ",   { XMScalar, VexScalar, Ev }, 0 },
9557   },
9558
9559   /* VEX_LEN_0F2C_P_1 */
9560   {
9561     { "vcvttss2siY",    { Gv, EXdScalar }, 0 },
9562     { "vcvttss2siY",    { Gv, EXdScalar }, 0 },
9563   },
9564
9565   /* VEX_LEN_0F2C_P_3 */
9566   {
9567     { "vcvttsd2siY",    { Gv, EXqScalar }, 0 },
9568     { "vcvttsd2siY",    { Gv, EXqScalar }, 0 },
9569   },
9570
9571   /* VEX_LEN_0F2D_P_1 */
9572   {
9573     { "vcvtss2siY",     { Gv, EXdScalar }, 0 },
9574     { "vcvtss2siY",     { Gv, EXdScalar }, 0 },
9575   },
9576
9577   /* VEX_LEN_0F2D_P_3 */
9578   {
9579     { "vcvtsd2siY",     { Gv, EXqScalar }, 0 },
9580     { "vcvtsd2siY",     { Gv, EXqScalar }, 0 },
9581   },
9582
9583   /* VEX_LEN_0F2E_P_0 */
9584   {
9585     { VEX_W_TABLE (VEX_W_0F2E_P_0) },
9586     { VEX_W_TABLE (VEX_W_0F2E_P_0) },
9587   },
9588
9589   /* VEX_LEN_0F2E_P_2 */
9590   {
9591     { VEX_W_TABLE (VEX_W_0F2E_P_2) },
9592     { VEX_W_TABLE (VEX_W_0F2E_P_2) },
9593   },
9594
9595   /* VEX_LEN_0F2F_P_0 */
9596   {
9597     { VEX_W_TABLE (VEX_W_0F2F_P_0) },
9598     { VEX_W_TABLE (VEX_W_0F2F_P_0) },
9599   },
9600
9601   /* VEX_LEN_0F2F_P_2 */
9602   {
9603     { VEX_W_TABLE (VEX_W_0F2F_P_2) },
9604     { VEX_W_TABLE (VEX_W_0F2F_P_2) },
9605   },
9606
9607   /* VEX_LEN_0F41_P_0 */
9608   {
9609     { Bad_Opcode },
9610     { VEX_W_TABLE (VEX_W_0F41_P_0_LEN_1) },
9611   },
9612   /* VEX_LEN_0F41_P_2 */
9613   {
9614     { Bad_Opcode },
9615     { VEX_W_TABLE (VEX_W_0F41_P_2_LEN_1) },
9616   },
9617   /* VEX_LEN_0F42_P_0 */
9618   {
9619     { Bad_Opcode },
9620     { VEX_W_TABLE (VEX_W_0F42_P_0_LEN_1) },
9621   },
9622   /* VEX_LEN_0F42_P_2 */
9623   {
9624     { Bad_Opcode },
9625     { VEX_W_TABLE (VEX_W_0F42_P_2_LEN_1) },
9626   },
9627   /* VEX_LEN_0F44_P_0 */
9628   {
9629     { VEX_W_TABLE (VEX_W_0F44_P_0_LEN_0) },
9630   },
9631   /* VEX_LEN_0F44_P_2 */
9632   {
9633     { VEX_W_TABLE (VEX_W_0F44_P_2_LEN_0) },
9634   },
9635   /* VEX_LEN_0F45_P_0 */
9636   {
9637     { Bad_Opcode },
9638     { VEX_W_TABLE (VEX_W_0F45_P_0_LEN_1) },
9639   },
9640   /* VEX_LEN_0F45_P_2 */
9641   {
9642     { Bad_Opcode },
9643     { VEX_W_TABLE (VEX_W_0F45_P_2_LEN_1) },
9644   },
9645   /* VEX_LEN_0F46_P_0 */
9646   {
9647     { Bad_Opcode },
9648     { VEX_W_TABLE (VEX_W_0F46_P_0_LEN_1) },
9649   },
9650   /* VEX_LEN_0F46_P_2 */
9651   {
9652     { Bad_Opcode },
9653     { VEX_W_TABLE (VEX_W_0F46_P_2_LEN_1) },
9654   },
9655   /* VEX_LEN_0F47_P_0 */
9656   {
9657     { Bad_Opcode },
9658     { VEX_W_TABLE (VEX_W_0F47_P_0_LEN_1) },
9659   },
9660   /* VEX_LEN_0F47_P_2 */
9661   {
9662     { Bad_Opcode },
9663     { VEX_W_TABLE (VEX_W_0F47_P_2_LEN_1) },
9664   },
9665   /* VEX_LEN_0F4A_P_0 */
9666   {
9667     { Bad_Opcode },
9668     { VEX_W_TABLE (VEX_W_0F4A_P_0_LEN_1) },
9669   },
9670   /* VEX_LEN_0F4A_P_2 */
9671   {
9672     { Bad_Opcode },
9673     { VEX_W_TABLE (VEX_W_0F4A_P_2_LEN_1) },
9674   },
9675   /* VEX_LEN_0F4B_P_0 */
9676   {
9677     { Bad_Opcode },
9678     { VEX_W_TABLE (VEX_W_0F4B_P_0_LEN_1) },
9679   },
9680   /* VEX_LEN_0F4B_P_2 */
9681   {
9682     { Bad_Opcode },
9683     { VEX_W_TABLE (VEX_W_0F4B_P_2_LEN_1) },
9684   },
9685
9686   /* VEX_LEN_0F51_P_1 */
9687   {
9688     { VEX_W_TABLE (VEX_W_0F51_P_1) },
9689     { VEX_W_TABLE (VEX_W_0F51_P_1) },
9690   },
9691
9692   /* VEX_LEN_0F51_P_3 */
9693   {
9694     { VEX_W_TABLE (VEX_W_0F51_P_3) },
9695     { VEX_W_TABLE (VEX_W_0F51_P_3) },
9696   },
9697
9698   /* VEX_LEN_0F52_P_1 */
9699   {
9700     { VEX_W_TABLE (VEX_W_0F52_P_1) },
9701     { VEX_W_TABLE (VEX_W_0F52_P_1) },
9702   },
9703
9704   /* VEX_LEN_0F53_P_1 */
9705   {
9706     { VEX_W_TABLE (VEX_W_0F53_P_1) },
9707     { VEX_W_TABLE (VEX_W_0F53_P_1) },
9708   },
9709
9710   /* VEX_LEN_0F58_P_1 */
9711   {
9712     { VEX_W_TABLE (VEX_W_0F58_P_1) },
9713     { VEX_W_TABLE (VEX_W_0F58_P_1) },
9714   },
9715
9716   /* VEX_LEN_0F58_P_3 */
9717   {
9718     { VEX_W_TABLE (VEX_W_0F58_P_3) },
9719     { VEX_W_TABLE (VEX_W_0F58_P_3) },
9720   },
9721
9722   /* VEX_LEN_0F59_P_1 */
9723   {
9724     { VEX_W_TABLE (VEX_W_0F59_P_1) },
9725     { VEX_W_TABLE (VEX_W_0F59_P_1) },
9726   },
9727
9728   /* VEX_LEN_0F59_P_3 */
9729   {
9730     { VEX_W_TABLE (VEX_W_0F59_P_3) },
9731     { VEX_W_TABLE (VEX_W_0F59_P_3) },
9732   },
9733
9734   /* VEX_LEN_0F5A_P_1 */
9735   {
9736     { VEX_W_TABLE (VEX_W_0F5A_P_1) },
9737     { VEX_W_TABLE (VEX_W_0F5A_P_1) },
9738   },
9739
9740   /* VEX_LEN_0F5A_P_3 */
9741   {
9742     { VEX_W_TABLE (VEX_W_0F5A_P_3) },
9743     { VEX_W_TABLE (VEX_W_0F5A_P_3) },
9744   },
9745
9746   /* VEX_LEN_0F5C_P_1 */
9747   {
9748     { VEX_W_TABLE (VEX_W_0F5C_P_1) },
9749     { VEX_W_TABLE (VEX_W_0F5C_P_1) },
9750   },
9751
9752   /* VEX_LEN_0F5C_P_3 */
9753   {
9754     { VEX_W_TABLE (VEX_W_0F5C_P_3) },
9755     { VEX_W_TABLE (VEX_W_0F5C_P_3) },
9756   },
9757
9758   /* VEX_LEN_0F5D_P_1 */
9759   {
9760     { VEX_W_TABLE (VEX_W_0F5D_P_1) },
9761     { VEX_W_TABLE (VEX_W_0F5D_P_1) },
9762   },
9763
9764   /* VEX_LEN_0F5D_P_3 */
9765   {
9766     { VEX_W_TABLE (VEX_W_0F5D_P_3) },
9767     { VEX_W_TABLE (VEX_W_0F5D_P_3) },
9768   },
9769
9770   /* VEX_LEN_0F5E_P_1 */
9771   {
9772     { VEX_W_TABLE (VEX_W_0F5E_P_1) },
9773     { VEX_W_TABLE (VEX_W_0F5E_P_1) },
9774   },
9775
9776   /* VEX_LEN_0F5E_P_3 */
9777   {
9778     { VEX_W_TABLE (VEX_W_0F5E_P_3) },
9779     { VEX_W_TABLE (VEX_W_0F5E_P_3) },
9780   },
9781
9782   /* VEX_LEN_0F5F_P_1 */
9783   {
9784     { VEX_W_TABLE (VEX_W_0F5F_P_1) },
9785     { VEX_W_TABLE (VEX_W_0F5F_P_1) },
9786   },
9787
9788   /* VEX_LEN_0F5F_P_3 */
9789   {
9790     { VEX_W_TABLE (VEX_W_0F5F_P_3) },
9791     { VEX_W_TABLE (VEX_W_0F5F_P_3) },
9792   },
9793
9794   /* VEX_LEN_0F6E_P_2 */
9795   {
9796     { "vmovK",          { XMScalar, Edq }, 0 },
9797     { "vmovK",          { XMScalar, Edq }, 0 },
9798   },
9799
9800   /* VEX_LEN_0F7E_P_1 */
9801   {
9802     { VEX_W_TABLE (VEX_W_0F7E_P_1) },
9803     { VEX_W_TABLE (VEX_W_0F7E_P_1) },
9804   },
9805
9806   /* VEX_LEN_0F7E_P_2 */
9807   {
9808     { "vmovK",          { Edq, XMScalar }, 0 },
9809     { "vmovK",          { Edq, XMScalar }, 0 },
9810   },
9811
9812   /* VEX_LEN_0F90_P_0 */
9813   {
9814     { VEX_W_TABLE (VEX_W_0F90_P_0_LEN_0) },
9815   },
9816
9817   /* VEX_LEN_0F90_P_2 */
9818   {
9819     { VEX_W_TABLE (VEX_W_0F90_P_2_LEN_0) },
9820   },
9821
9822   /* VEX_LEN_0F91_P_0 */
9823   {
9824     { VEX_W_TABLE (VEX_W_0F91_P_0_LEN_0) },
9825   },
9826
9827   /* VEX_LEN_0F91_P_2 */
9828   {
9829     { VEX_W_TABLE (VEX_W_0F91_P_2_LEN_0) },
9830   },
9831
9832   /* VEX_LEN_0F92_P_0 */
9833   {
9834     { VEX_W_TABLE (VEX_W_0F92_P_0_LEN_0) },
9835   },
9836
9837   /* VEX_LEN_0F92_P_2 */
9838   {
9839     { VEX_W_TABLE (VEX_W_0F92_P_2_LEN_0) },
9840   },
9841
9842   /* VEX_LEN_0F92_P_3 */
9843   {
9844     { VEX_W_TABLE (VEX_W_0F92_P_3_LEN_0) },
9845   },
9846
9847   /* VEX_LEN_0F93_P_0 */
9848   {
9849     { VEX_W_TABLE (VEX_W_0F93_P_0_LEN_0) },
9850   },
9851
9852   /* VEX_LEN_0F93_P_2 */
9853   {
9854     { VEX_W_TABLE (VEX_W_0F93_P_2_LEN_0) },
9855   },
9856
9857   /* VEX_LEN_0F93_P_3 */
9858   {
9859     { VEX_W_TABLE (VEX_W_0F93_P_3_LEN_0) },
9860   },
9861
9862   /* VEX_LEN_0F98_P_0 */
9863   {
9864     { VEX_W_TABLE (VEX_W_0F98_P_0_LEN_0) },
9865   },
9866
9867   /* VEX_LEN_0F98_P_2 */
9868   {
9869     { VEX_W_TABLE (VEX_W_0F98_P_2_LEN_0) },
9870   },
9871
9872   /* VEX_LEN_0F99_P_0 */
9873   {
9874     { VEX_W_TABLE (VEX_W_0F99_P_0_LEN_0) },
9875   },
9876
9877   /* VEX_LEN_0F99_P_2 */
9878   {
9879     { VEX_W_TABLE (VEX_W_0F99_P_2_LEN_0) },
9880   },
9881
9882   /* VEX_LEN_0FAE_R_2_M_0 */
9883   {
9884     { VEX_W_TABLE (VEX_W_0FAE_R_2_M_0) },
9885   },
9886
9887   /* VEX_LEN_0FAE_R_3_M_0 */
9888   {
9889     { VEX_W_TABLE (VEX_W_0FAE_R_3_M_0) },
9890   },
9891
9892   /* VEX_LEN_0FC2_P_1 */
9893   {
9894     { VEX_W_TABLE (VEX_W_0FC2_P_1) },
9895     { VEX_W_TABLE (VEX_W_0FC2_P_1) },
9896   },
9897
9898   /* VEX_LEN_0FC2_P_3 */
9899   {
9900     { VEX_W_TABLE (VEX_W_0FC2_P_3) },
9901     { VEX_W_TABLE (VEX_W_0FC2_P_3) },
9902   },
9903
9904   /* VEX_LEN_0FC4_P_2 */
9905   {
9906     { VEX_W_TABLE (VEX_W_0FC4_P_2) },
9907   },
9908
9909   /* VEX_LEN_0FC5_P_2 */
9910   {
9911     { VEX_W_TABLE (VEX_W_0FC5_P_2) },
9912   },
9913
9914   /* VEX_LEN_0FD6_P_2 */
9915   {
9916     { VEX_W_TABLE (VEX_W_0FD6_P_2) },
9917     { VEX_W_TABLE (VEX_W_0FD6_P_2) },
9918   },
9919
9920   /* VEX_LEN_0FF7_P_2 */
9921   {
9922     { VEX_W_TABLE (VEX_W_0FF7_P_2) },
9923   },
9924
9925   /* VEX_LEN_0F3816_P_2 */
9926   {
9927     { Bad_Opcode },
9928     { VEX_W_TABLE (VEX_W_0F3816_P_2) },
9929   },
9930
9931   /* VEX_LEN_0F3819_P_2 */
9932   {
9933     { Bad_Opcode },
9934     { VEX_W_TABLE (VEX_W_0F3819_P_2) },
9935   },
9936
9937   /* VEX_LEN_0F381A_P_2_M_0 */
9938   {
9939     { Bad_Opcode },
9940     { VEX_W_TABLE (VEX_W_0F381A_P_2_M_0) },
9941   },
9942
9943   /* VEX_LEN_0F3836_P_2 */
9944   {
9945     { Bad_Opcode },
9946     { VEX_W_TABLE (VEX_W_0F3836_P_2) },
9947   },
9948
9949   /* VEX_LEN_0F3841_P_2 */
9950   {
9951     { VEX_W_TABLE (VEX_W_0F3841_P_2) },
9952   },
9953
9954   /* VEX_LEN_0F385A_P_2_M_0 */
9955   {
9956     { Bad_Opcode },
9957     { VEX_W_TABLE (VEX_W_0F385A_P_2_M_0) },
9958   },
9959
9960   /* VEX_LEN_0F38DB_P_2 */
9961   {
9962     { VEX_W_TABLE (VEX_W_0F38DB_P_2) },
9963   },
9964
9965   /* VEX_LEN_0F38DC_P_2 */
9966   {
9967     { VEX_W_TABLE (VEX_W_0F38DC_P_2) },
9968   },
9969
9970   /* VEX_LEN_0F38DD_P_2 */
9971   {
9972     { VEX_W_TABLE (VEX_W_0F38DD_P_2) },
9973   },
9974
9975   /* VEX_LEN_0F38DE_P_2 */
9976   {
9977     { VEX_W_TABLE (VEX_W_0F38DE_P_2) },
9978   },
9979
9980   /* VEX_LEN_0F38DF_P_2 */
9981   {
9982     { VEX_W_TABLE (VEX_W_0F38DF_P_2) },
9983   },
9984
9985   /* VEX_LEN_0F38F2_P_0 */
9986   {
9987     { "andnS",          { Gdq, VexGdq, Edq }, 0 },
9988   },
9989
9990   /* VEX_LEN_0F38F3_R_1_P_0 */
9991   {
9992     { "blsrS",          { VexGdq, Edq }, 0 },
9993   },
9994
9995   /* VEX_LEN_0F38F3_R_2_P_0 */
9996   {
9997     { "blsmskS",        { VexGdq, Edq }, 0 },
9998   },
9999
10000   /* VEX_LEN_0F38F3_R_3_P_0 */
10001   {
10002     { "blsiS",          { VexGdq, Edq }, 0 },
10003   },
10004
10005   /* VEX_LEN_0F38F5_P_0 */
10006   {
10007     { "bzhiS",          { Gdq, Edq, VexGdq }, 0 },
10008   },
10009
10010   /* VEX_LEN_0F38F5_P_1 */
10011   {
10012     { "pextS",          { Gdq, VexGdq, Edq }, 0 },
10013   },
10014
10015   /* VEX_LEN_0F38F5_P_3 */
10016   {
10017     { "pdepS",          { Gdq, VexGdq, Edq }, 0 },
10018   },
10019
10020   /* VEX_LEN_0F38F6_P_3 */
10021   {
10022     { "mulxS",          { Gdq, VexGdq, Edq }, 0 },
10023   },
10024
10025   /* VEX_LEN_0F38F7_P_0 */
10026   {
10027     { "bextrS",         { Gdq, Edq, VexGdq }, 0 },
10028   },
10029
10030   /* VEX_LEN_0F38F7_P_1 */
10031   {
10032     { "sarxS",          { Gdq, Edq, VexGdq }, 0 },
10033   },
10034
10035   /* VEX_LEN_0F38F7_P_2 */
10036   {
10037     { "shlxS",          { Gdq, Edq, VexGdq }, 0 },
10038   },
10039
10040   /* VEX_LEN_0F38F7_P_3 */
10041   {
10042     { "shrxS",          { Gdq, Edq, VexGdq }, 0 },
10043   },
10044
10045   /* VEX_LEN_0F3A00_P_2 */
10046   {
10047     { Bad_Opcode },
10048     { VEX_W_TABLE (VEX_W_0F3A00_P_2) },
10049   },
10050
10051   /* VEX_LEN_0F3A01_P_2 */
10052   {
10053     { Bad_Opcode },
10054     { VEX_W_TABLE (VEX_W_0F3A01_P_2) },
10055   },
10056
10057   /* VEX_LEN_0F3A06_P_2 */
10058   {
10059     { Bad_Opcode },
10060     { VEX_W_TABLE (VEX_W_0F3A06_P_2) },
10061   },
10062
10063   /* VEX_LEN_0F3A0A_P_2 */
10064   {
10065     { VEX_W_TABLE (VEX_W_0F3A0A_P_2) },
10066     { VEX_W_TABLE (VEX_W_0F3A0A_P_2) },
10067   },
10068
10069   /* VEX_LEN_0F3A0B_P_2 */
10070   {
10071     { VEX_W_TABLE (VEX_W_0F3A0B_P_2) },
10072     { VEX_W_TABLE (VEX_W_0F3A0B_P_2) },
10073   },
10074
10075   /* VEX_LEN_0F3A14_P_2 */
10076   {
10077     { VEX_W_TABLE (VEX_W_0F3A14_P_2) },
10078   },
10079
10080   /* VEX_LEN_0F3A15_P_2 */
10081   {
10082     { VEX_W_TABLE (VEX_W_0F3A15_P_2) },
10083   },
10084
10085   /* VEX_LEN_0F3A16_P_2  */
10086   {
10087     { "vpextrK",        { Edq, XM, Ib }, 0 },
10088   },
10089
10090   /* VEX_LEN_0F3A17_P_2 */
10091   {
10092     { "vextractps",     { Edqd, XM, Ib }, 0 },
10093   },
10094
10095   /* VEX_LEN_0F3A18_P_2 */
10096   {
10097     { Bad_Opcode },
10098     { VEX_W_TABLE (VEX_W_0F3A18_P_2) },
10099   },
10100
10101   /* VEX_LEN_0F3A19_P_2 */
10102   {
10103     { Bad_Opcode },
10104     { VEX_W_TABLE (VEX_W_0F3A19_P_2) },
10105   },
10106
10107   /* VEX_LEN_0F3A20_P_2 */
10108   {
10109     { VEX_W_TABLE (VEX_W_0F3A20_P_2) },
10110   },
10111
10112   /* VEX_LEN_0F3A21_P_2 */
10113   {
10114     { VEX_W_TABLE (VEX_W_0F3A21_P_2) },
10115   },
10116
10117   /* VEX_LEN_0F3A22_P_2 */
10118   {
10119     { "vpinsrK",        { XM, Vex128, Edq, Ib }, 0 },
10120   },
10121
10122   /* VEX_LEN_0F3A30_P_2 */
10123   {
10124     { VEX_W_TABLE (VEX_W_0F3A30_P_2_LEN_0) },
10125   },
10126
10127   /* VEX_LEN_0F3A31_P_2 */
10128   {
10129     { VEX_W_TABLE (VEX_W_0F3A31_P_2_LEN_0) },
10130   },
10131
10132   /* VEX_LEN_0F3A32_P_2 */
10133   {
10134     { VEX_W_TABLE (VEX_W_0F3A32_P_2_LEN_0) },
10135   },
10136
10137   /* VEX_LEN_0F3A33_P_2 */
10138   {
10139     { VEX_W_TABLE (VEX_W_0F3A33_P_2_LEN_0) },
10140   },
10141
10142   /* VEX_LEN_0F3A38_P_2 */
10143   {
10144     { Bad_Opcode },
10145     { VEX_W_TABLE (VEX_W_0F3A38_P_2) },
10146   },
10147
10148   /* VEX_LEN_0F3A39_P_2 */
10149   {
10150     { Bad_Opcode },
10151     { VEX_W_TABLE (VEX_W_0F3A39_P_2) },
10152   },
10153
10154   /* VEX_LEN_0F3A41_P_2 */
10155   {
10156     { VEX_W_TABLE (VEX_W_0F3A41_P_2) },
10157   },
10158
10159   /* VEX_LEN_0F3A44_P_2 */
10160   {
10161     { VEX_W_TABLE (VEX_W_0F3A44_P_2) },
10162   },
10163
10164   /* VEX_LEN_0F3A46_P_2 */
10165   {
10166     { Bad_Opcode },
10167     { VEX_W_TABLE (VEX_W_0F3A46_P_2) },
10168   },
10169
10170   /* VEX_LEN_0F3A60_P_2 */
10171   {
10172     { VEX_W_TABLE (VEX_W_0F3A60_P_2) },
10173   },
10174
10175   /* VEX_LEN_0F3A61_P_2 */
10176   {
10177     { VEX_W_TABLE (VEX_W_0F3A61_P_2) },
10178   },
10179
10180   /* VEX_LEN_0F3A62_P_2 */
10181   {
10182     { VEX_W_TABLE (VEX_W_0F3A62_P_2) },
10183   },
10184
10185   /* VEX_LEN_0F3A63_P_2 */
10186   {
10187     { VEX_W_TABLE (VEX_W_0F3A63_P_2) },
10188   },
10189
10190   /* VEX_LEN_0F3A6A_P_2 */
10191   {
10192     { "vfmaddss",       { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 }, 0 },
10193   },
10194
10195   /* VEX_LEN_0F3A6B_P_2 */
10196   {
10197     { "vfmaddsd",       { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 }, 0 },
10198   },
10199
10200   /* VEX_LEN_0F3A6E_P_2 */
10201   {
10202     { "vfmsubss",       { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 }, 0 },
10203   },
10204
10205   /* VEX_LEN_0F3A6F_P_2 */
10206   {
10207     { "vfmsubsd",       { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 }, 0 },
10208   },
10209
10210   /* VEX_LEN_0F3A7A_P_2 */
10211   {
10212     { "vfnmaddss",      { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 }, 0 },
10213   },
10214
10215   /* VEX_LEN_0F3A7B_P_2 */
10216   {
10217     { "vfnmaddsd",      { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 }, 0 },
10218   },
10219
10220   /* VEX_LEN_0F3A7E_P_2 */
10221   {
10222     { "vfnmsubss",      { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 }, 0 },
10223   },
10224
10225   /* VEX_LEN_0F3A7F_P_2 */
10226   {
10227     { "vfnmsubsd",      { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 }, 0 },
10228   },
10229
10230   /* VEX_LEN_0F3ADF_P_2 */
10231   {
10232     { VEX_W_TABLE (VEX_W_0F3ADF_P_2) },
10233   },
10234
10235   /* VEX_LEN_0F3AF0_P_3 */
10236   {
10237     { "rorxS",          { Gdq, Edq, Ib }, 0 },
10238   },
10239
10240   /* VEX_LEN_0FXOP_08_CC */
10241   {
10242      { "vpcomb",        { XM, Vex128, EXx, Ib }, 0 },
10243   },
10244
10245   /* VEX_LEN_0FXOP_08_CD */
10246   {
10247      { "vpcomw",        { XM, Vex128, EXx, Ib }, 0 },
10248   },
10249
10250   /* VEX_LEN_0FXOP_08_CE */
10251   {
10252      { "vpcomd",        { XM, Vex128, EXx, Ib }, 0 },
10253   },
10254
10255   /* VEX_LEN_0FXOP_08_CF */
10256   {
10257      { "vpcomq",        { XM, Vex128, EXx, Ib }, 0 },
10258   },
10259
10260   /* VEX_LEN_0FXOP_08_EC */
10261   {
10262      { "vpcomub",       { XM, Vex128, EXx, Ib }, 0 },
10263   },
10264
10265   /* VEX_LEN_0FXOP_08_ED */
10266   {
10267      { "vpcomuw",       { XM, Vex128, EXx, Ib }, 0 },
10268   },
10269
10270   /* VEX_LEN_0FXOP_08_EE */
10271   {
10272      { "vpcomud",       { XM, Vex128, EXx, Ib }, 0 },
10273   },
10274
10275   /* VEX_LEN_0FXOP_08_EF */
10276   {
10277      { "vpcomuq",       { XM, Vex128, EXx, Ib }, 0 },
10278   },
10279
10280   /* VEX_LEN_0FXOP_09_80 */
10281   {
10282     { "vfrczps",        { XM, EXxmm }, 0 },
10283     { "vfrczps",        { XM, EXymmq }, 0 },
10284   },
10285
10286   /* VEX_LEN_0FXOP_09_81 */
10287   {
10288     { "vfrczpd",        { XM, EXxmm }, 0 },
10289     { "vfrczpd",        { XM, EXymmq }, 0 },
10290   },
10291 };
10292
10293 static const struct dis386 vex_w_table[][2] = {
10294   {
10295     /* VEX_W_0F10_P_0 */
10296     { "vmovups",        { XM, EXx }, 0 },
10297   },
10298   {
10299     /* VEX_W_0F10_P_1 */
10300     { "vmovss",         { XMVexScalar, VexScalar, EXdScalar }, 0 },
10301   },
10302   {
10303     /* VEX_W_0F10_P_2 */
10304     { "vmovupd",        { XM, EXx }, 0 },
10305   },
10306   {
10307     /* VEX_W_0F10_P_3 */
10308     { "vmovsd",         { XMVexScalar, VexScalar, EXqScalar }, 0 },
10309   },
10310   {
10311     /* VEX_W_0F11_P_0 */
10312     { "vmovups",        { EXxS, XM }, 0 },
10313   },
10314   {
10315     /* VEX_W_0F11_P_1 */
10316     { "vmovss",         { EXdVexScalarS, VexScalar, XMScalar }, 0 },
10317   },
10318   {
10319     /* VEX_W_0F11_P_2 */
10320     { "vmovupd",        { EXxS, XM }, 0 },
10321   },
10322   {
10323     /* VEX_W_0F11_P_3 */
10324     { "vmovsd",         { EXqVexScalarS, VexScalar, XMScalar }, 0 },
10325   },
10326   {
10327     /* VEX_W_0F12_P_0_M_0 */
10328     { "vmovlps",        { XM, Vex128, EXq }, 0 },
10329   },
10330   {
10331     /* VEX_W_0F12_P_0_M_1 */
10332     { "vmovhlps",       { XM, Vex128, EXq }, 0 },
10333   },
10334   {
10335     /* VEX_W_0F12_P_1 */
10336     { "vmovsldup",      { XM, EXx }, 0 },
10337   },
10338   {
10339     /* VEX_W_0F12_P_2 */
10340     { "vmovlpd",        { XM, Vex128, EXq }, 0 },
10341   },
10342   {
10343     /* VEX_W_0F12_P_3 */
10344     { "vmovddup",       { XM, EXymmq }, 0 },
10345   },
10346   {
10347     /* VEX_W_0F13_M_0 */
10348     { "vmovlpX",        { EXq, XM }, 0 },
10349   },
10350   {
10351     /* VEX_W_0F14 */
10352     { "vunpcklpX",      { XM, Vex, EXx }, 0 },
10353   },
10354   {
10355     /* VEX_W_0F15 */
10356     { "vunpckhpX",      { XM, Vex, EXx }, 0 },
10357   },
10358   {
10359     /* VEX_W_0F16_P_0_M_0 */
10360     { "vmovhps",        { XM, Vex128, EXq }, 0 },
10361   },
10362   {
10363     /* VEX_W_0F16_P_0_M_1 */
10364     { "vmovlhps",       { XM, Vex128, EXq }, 0 },
10365   },
10366   {
10367     /* VEX_W_0F16_P_1 */
10368     { "vmovshdup",      { XM, EXx }, 0 },
10369   },
10370   {
10371     /* VEX_W_0F16_P_2 */
10372     { "vmovhpd",        { XM, Vex128, EXq }, 0 },
10373   },
10374   {
10375     /* VEX_W_0F17_M_0 */
10376     { "vmovhpX",        { EXq, XM }, 0 },
10377   },
10378   {
10379     /* VEX_W_0F28 */
10380     { "vmovapX",        { XM, EXx }, 0 },
10381   },
10382   {
10383     /* VEX_W_0F29 */
10384     { "vmovapX",        { EXxS, XM }, 0 },
10385   },
10386   {
10387     /* VEX_W_0F2B_M_0 */
10388     { "vmovntpX",       { Mx, XM }, 0 },
10389   },
10390   {
10391     /* VEX_W_0F2E_P_0 */
10392     { "vucomiss",       { XMScalar, EXdScalar }, 0 },
10393   },
10394   {
10395     /* VEX_W_0F2E_P_2 */
10396     { "vucomisd",       { XMScalar, EXqScalar }, 0 },
10397   },
10398   {
10399     /* VEX_W_0F2F_P_0 */
10400     { "vcomiss",        { XMScalar, EXdScalar }, 0 },
10401   },
10402   {
10403     /* VEX_W_0F2F_P_2 */
10404     { "vcomisd",        { XMScalar, EXqScalar }, 0 },
10405   },
10406   {
10407     /* VEX_W_0F41_P_0_LEN_1 */
10408     { "kandw",          { MaskG, MaskVex, MaskR }, 0 },
10409     { "kandq",          { MaskG, MaskVex, MaskR }, 0 },
10410   },
10411   {
10412     /* VEX_W_0F41_P_2_LEN_1 */
10413     { "kandb",          { MaskG, MaskVex, MaskR }, 0 },
10414     { "kandd",          { MaskG, MaskVex, MaskR }, 0 },
10415   },
10416   {
10417     /* VEX_W_0F42_P_0_LEN_1 */
10418     { "kandnw",         { MaskG, MaskVex, MaskR }, 0 },
10419     { "kandnq",         { MaskG, MaskVex, MaskR }, 0 },
10420   },
10421   {
10422     /* VEX_W_0F42_P_2_LEN_1 */
10423     { "kandnb",         { MaskG, MaskVex, MaskR }, 0 },
10424     { "kandnd",         { MaskG, MaskVex, MaskR }, 0 },
10425   },
10426   {
10427     /* VEX_W_0F44_P_0_LEN_0 */
10428     { "knotw",          { MaskG, MaskR }, 0 },
10429     { "knotq",          { MaskG, MaskR }, 0 },
10430   },
10431   {
10432     /* VEX_W_0F44_P_2_LEN_0 */
10433     { "knotb",          { MaskG, MaskR }, 0 },
10434     { "knotd",          { MaskG, MaskR }, 0 },
10435   },
10436   {
10437     /* VEX_W_0F45_P_0_LEN_1 */
10438     { "korw",           { MaskG, MaskVex, MaskR }, 0 },
10439     { "korq",           { MaskG, MaskVex, MaskR }, 0 },
10440   },
10441   {
10442     /* VEX_W_0F45_P_2_LEN_1 */
10443     { "korb",           { MaskG, MaskVex, MaskR }, 0 },
10444     { "kord",           { MaskG, MaskVex, MaskR }, 0 },
10445   },
10446   {
10447     /* VEX_W_0F46_P_0_LEN_1 */
10448     { "kxnorw",         { MaskG, MaskVex, MaskR }, 0 },
10449     { "kxnorq",         { MaskG, MaskVex, MaskR }, 0 },
10450   },
10451   {
10452     /* VEX_W_0F46_P_2_LEN_1 */
10453     { "kxnorb",         { MaskG, MaskVex, MaskR }, 0 },
10454     { "kxnord",         { MaskG, MaskVex, MaskR }, 0 },
10455   },
10456   {
10457     /* VEX_W_0F47_P_0_LEN_1 */
10458     { "kxorw",          { MaskG, MaskVex, MaskR }, 0 },
10459     { "kxorq",          { MaskG, MaskVex, MaskR }, 0 },
10460   },
10461   {
10462     /* VEX_W_0F47_P_2_LEN_1 */
10463     { "kxorb",          { MaskG, MaskVex, MaskR }, 0 },
10464     { "kxord",          { MaskG, MaskVex, MaskR }, 0 },
10465   },
10466   {
10467     /* VEX_W_0F4A_P_0_LEN_1 */
10468     { "kaddw",          { MaskG, MaskVex, MaskR }, 0 },
10469     { "kaddq",          { MaskG, MaskVex, MaskR }, 0 },
10470   },
10471   {
10472     /* VEX_W_0F4A_P_2_LEN_1 */
10473     { "kaddb",          { MaskG, MaskVex, MaskR }, 0 },
10474     { "kaddd",          { MaskG, MaskVex, MaskR }, 0 },
10475   },
10476   {
10477     /* VEX_W_0F4B_P_0_LEN_1 */
10478     { "kunpckwd",       { MaskG, MaskVex, MaskR }, 0 },
10479     { "kunpckdq",       { MaskG, MaskVex, MaskR }, 0 },
10480   },
10481   {
10482     /* VEX_W_0F4B_P_2_LEN_1 */
10483     { "kunpckbw",       { MaskG, MaskVex, MaskR }, 0 },
10484   },
10485   {
10486     /* VEX_W_0F50_M_0 */
10487     { "vmovmskpX",      { Gdq, XS }, 0 },
10488   },
10489   {
10490     /* VEX_W_0F51_P_0 */
10491     { "vsqrtps",        { XM, EXx }, 0 },
10492   },
10493   {
10494     /* VEX_W_0F51_P_1 */
10495     { "vsqrtss",        { XMScalar, VexScalar, EXdScalar }, 0 },
10496   },
10497   {
10498     /* VEX_W_0F51_P_2  */
10499     { "vsqrtpd",        { XM, EXx }, 0 },
10500   },
10501   {
10502     /* VEX_W_0F51_P_3 */
10503     { "vsqrtsd",        { XMScalar, VexScalar, EXqScalar }, 0 },
10504   },
10505   {
10506     /* VEX_W_0F52_P_0 */
10507     { "vrsqrtps",       { XM, EXx }, 0 },
10508   },
10509   {
10510     /* VEX_W_0F52_P_1 */
10511     { "vrsqrtss",       { XMScalar, VexScalar, EXdScalar }, 0 },
10512   },
10513   {
10514     /* VEX_W_0F53_P_0  */
10515     { "vrcpps",         { XM, EXx }, 0 },
10516   },
10517   {
10518     /* VEX_W_0F53_P_1  */
10519     { "vrcpss",         { XMScalar, VexScalar, EXdScalar }, 0 },
10520   },
10521   {
10522     /* VEX_W_0F58_P_0  */
10523     { "vaddps",         { XM, Vex, EXx }, 0 },
10524   },
10525   {
10526     /* VEX_W_0F58_P_1  */
10527     { "vaddss",         { XMScalar, VexScalar, EXdScalar }, 0 },
10528   },
10529   {
10530     /* VEX_W_0F58_P_2  */
10531     { "vaddpd",         { XM, Vex, EXx }, 0 },
10532   },
10533   {
10534     /* VEX_W_0F58_P_3  */
10535     { "vaddsd",         { XMScalar, VexScalar, EXqScalar }, 0 },
10536   },
10537   {
10538     /* VEX_W_0F59_P_0  */
10539     { "vmulps",         { XM, Vex, EXx }, 0 },
10540   },
10541   {
10542     /* VEX_W_0F59_P_1  */
10543     { "vmulss",         { XMScalar, VexScalar, EXdScalar }, 0 },
10544   },
10545   {
10546     /* VEX_W_0F59_P_2  */
10547     { "vmulpd",         { XM, Vex, EXx }, 0 },
10548   },
10549   {
10550     /* VEX_W_0F59_P_3  */
10551     { "vmulsd",         { XMScalar, VexScalar, EXqScalar }, 0 },
10552   },
10553   {
10554     /* VEX_W_0F5A_P_0  */
10555     { "vcvtps2pd",      { XM, EXxmmq }, 0 },
10556   },
10557   {
10558     /* VEX_W_0F5A_P_1  */
10559     { "vcvtss2sd",      { XMScalar, VexScalar, EXdScalar }, 0 },
10560   },
10561   {
10562     /* VEX_W_0F5A_P_3  */
10563     { "vcvtsd2ss",      { XMScalar, VexScalar, EXqScalar }, 0 },
10564   },
10565   {
10566     /* VEX_W_0F5B_P_0  */
10567     { "vcvtdq2ps",      { XM, EXx }, 0 },
10568   },
10569   {
10570     /* VEX_W_0F5B_P_1  */
10571     { "vcvttps2dq",     { XM, EXx }, 0 },
10572   },
10573   {
10574     /* VEX_W_0F5B_P_2  */
10575     { "vcvtps2dq",      { XM, EXx }, 0 },
10576   },
10577   {
10578     /* VEX_W_0F5C_P_0  */
10579     { "vsubps",         { XM, Vex, EXx }, 0 },
10580   },
10581   {
10582     /* VEX_W_0F5C_P_1  */
10583     { "vsubss",         { XMScalar, VexScalar, EXdScalar }, 0 },
10584   },
10585   {
10586     /* VEX_W_0F5C_P_2  */
10587     { "vsubpd",         { XM, Vex, EXx }, 0 },
10588   },
10589   {
10590     /* VEX_W_0F5C_P_3  */
10591     { "vsubsd",         { XMScalar, VexScalar, EXqScalar }, 0 },
10592   },
10593   {
10594     /* VEX_W_0F5D_P_0  */
10595     { "vminps",         { XM, Vex, EXx }, 0 },
10596   },
10597   {
10598     /* VEX_W_0F5D_P_1  */
10599     { "vminss",         { XMScalar, VexScalar, EXdScalar }, 0 },
10600   },
10601   {
10602     /* VEX_W_0F5D_P_2  */
10603     { "vminpd",         { XM, Vex, EXx }, 0 },
10604   },
10605   {
10606     /* VEX_W_0F5D_P_3  */
10607     { "vminsd",         { XMScalar, VexScalar, EXqScalar }, 0 },
10608   },
10609   {
10610     /* VEX_W_0F5E_P_0  */
10611     { "vdivps",         { XM, Vex, EXx }, 0 },
10612   },
10613   {
10614     /* VEX_W_0F5E_P_1  */
10615     { "vdivss",         { XMScalar, VexScalar, EXdScalar }, 0 },
10616   },
10617   {
10618     /* VEX_W_0F5E_P_2  */
10619     { "vdivpd",         { XM, Vex, EXx }, 0 },
10620   },
10621   {
10622     /* VEX_W_0F5E_P_3  */
10623     { "vdivsd",         { XMScalar, VexScalar, EXqScalar }, 0 },
10624   },
10625   {
10626     /* VEX_W_0F5F_P_0  */
10627     { "vmaxps",         { XM, Vex, EXx }, 0 },
10628   },
10629   {
10630     /* VEX_W_0F5F_P_1  */
10631     { "vmaxss",         { XMScalar, VexScalar, EXdScalar }, 0 },
10632   },
10633   {
10634     /* VEX_W_0F5F_P_2  */
10635     { "vmaxpd",         { XM, Vex, EXx }, 0 },
10636   },
10637   {
10638     /* VEX_W_0F5F_P_3  */
10639     { "vmaxsd",         { XMScalar, VexScalar, EXqScalar }, 0 },
10640   },
10641   {
10642     /* VEX_W_0F60_P_2  */
10643     { "vpunpcklbw",     { XM, Vex, EXx }, 0 },
10644   },
10645   {
10646     /* VEX_W_0F61_P_2  */
10647     { "vpunpcklwd",     { XM, Vex, EXx }, 0 },
10648   },
10649   {
10650     /* VEX_W_0F62_P_2  */
10651     { "vpunpckldq",     { XM, Vex, EXx }, 0 },
10652   },
10653   {
10654     /* VEX_W_0F63_P_2  */
10655     { "vpacksswb",      { XM, Vex, EXx }, 0 },
10656   },
10657   {
10658     /* VEX_W_0F64_P_2  */
10659     { "vpcmpgtb",       { XM, Vex, EXx }, 0 },
10660   },
10661   {
10662     /* VEX_W_0F65_P_2  */
10663     { "vpcmpgtw",       { XM, Vex, EXx }, 0 },
10664   },
10665   {
10666     /* VEX_W_0F66_P_2  */
10667     { "vpcmpgtd",       { XM, Vex, EXx }, 0 },
10668   },
10669   {
10670     /* VEX_W_0F67_P_2  */
10671     { "vpackuswb",      { XM, Vex, EXx }, 0 },
10672   },
10673   {
10674     /* VEX_W_0F68_P_2  */
10675     { "vpunpckhbw",     { XM, Vex, EXx }, 0 },
10676   },
10677   {
10678     /* VEX_W_0F69_P_2  */
10679     { "vpunpckhwd",     { XM, Vex, EXx }, 0 },
10680   },
10681   {
10682     /* VEX_W_0F6A_P_2  */
10683     { "vpunpckhdq",     { XM, Vex, EXx }, 0 },
10684   },
10685   {
10686     /* VEX_W_0F6B_P_2  */
10687     { "vpackssdw",      { XM, Vex, EXx }, 0 },
10688   },
10689   {
10690     /* VEX_W_0F6C_P_2  */
10691     { "vpunpcklqdq",    { XM, Vex, EXx }, 0 },
10692   },
10693   {
10694     /* VEX_W_0F6D_P_2  */
10695     { "vpunpckhqdq",    { XM, Vex, EXx }, 0 },
10696   },
10697   {
10698     /* VEX_W_0F6F_P_1  */
10699     { "vmovdqu",        { XM, EXx }, 0 },
10700   },
10701   {
10702     /* VEX_W_0F6F_P_2  */
10703     { "vmovdqa",        { XM, EXx }, 0 },
10704   },
10705   {
10706     /* VEX_W_0F70_P_1 */
10707     { "vpshufhw",       { XM, EXx, Ib }, 0 },
10708   },
10709   {
10710     /* VEX_W_0F70_P_2 */
10711     { "vpshufd",        { XM, EXx, Ib }, 0 },
10712   },
10713   {
10714     /* VEX_W_0F70_P_3 */
10715     { "vpshuflw",       { XM, EXx, Ib }, 0 },
10716   },
10717   {
10718     /* VEX_W_0F71_R_2_P_2  */
10719     { "vpsrlw",         { Vex, XS, Ib }, 0 },
10720   },
10721   {
10722     /* VEX_W_0F71_R_4_P_2  */
10723     { "vpsraw",         { Vex, XS, Ib }, 0 },
10724   },
10725   {
10726     /* VEX_W_0F71_R_6_P_2  */
10727     { "vpsllw",         { Vex, XS, Ib }, 0 },
10728   },
10729   {
10730     /* VEX_W_0F72_R_2_P_2  */
10731     { "vpsrld",         { Vex, XS, Ib }, 0 },
10732   },
10733   {
10734     /* VEX_W_0F72_R_4_P_2  */
10735     { "vpsrad",         { Vex, XS, Ib }, 0 },
10736   },
10737   {
10738     /* VEX_W_0F72_R_6_P_2  */
10739     { "vpslld",         { Vex, XS, Ib }, 0 },
10740   },
10741   {
10742     /* VEX_W_0F73_R_2_P_2  */
10743     { "vpsrlq",         { Vex, XS, Ib }, 0 },
10744   },
10745   {
10746     /* VEX_W_0F73_R_3_P_2  */
10747     { "vpsrldq",        { Vex, XS, Ib }, 0 },
10748   },
10749   {
10750     /* VEX_W_0F73_R_6_P_2  */
10751     { "vpsllq",         { Vex, XS, Ib }, 0 },
10752   },
10753   {
10754     /* VEX_W_0F73_R_7_P_2  */
10755     { "vpslldq",        { Vex, XS, Ib }, 0 },
10756   },
10757   {
10758     /* VEX_W_0F74_P_2 */
10759     { "vpcmpeqb",       { XM, Vex, EXx }, 0 },
10760   },
10761   {
10762     /* VEX_W_0F75_P_2 */
10763     { "vpcmpeqw",       { XM, Vex, EXx }, 0 },
10764   },
10765   {
10766     /* VEX_W_0F76_P_2 */
10767     { "vpcmpeqd",       { XM, Vex, EXx }, 0 },
10768   },
10769   {
10770     /* VEX_W_0F77_P_0 */
10771     { "",               { VZERO }, 0 },
10772   },
10773   {
10774     /* VEX_W_0F7C_P_2 */
10775     { "vhaddpd",        { XM, Vex, EXx }, 0 },
10776   },
10777   {
10778     /* VEX_W_0F7C_P_3 */
10779     { "vhaddps",        { XM, Vex, EXx }, 0 },
10780   },
10781   {
10782     /* VEX_W_0F7D_P_2 */
10783     { "vhsubpd",        { XM, Vex, EXx }, 0 },
10784   },
10785   {
10786     /* VEX_W_0F7D_P_3 */
10787     { "vhsubps",        { XM, Vex, EXx }, 0 },
10788   },
10789   {
10790     /* VEX_W_0F7E_P_1 */
10791     { "vmovq",          { XMScalar, EXqScalar }, 0 },
10792   },
10793   {
10794     /* VEX_W_0F7F_P_1 */
10795     { "vmovdqu",        { EXxS, XM }, 0 },
10796   },
10797   {
10798     /* VEX_W_0F7F_P_2 */
10799     { "vmovdqa",        { EXxS, XM }, 0 },
10800   },
10801   {
10802     /* VEX_W_0F90_P_0_LEN_0 */
10803     { "kmovw",          { MaskG, MaskE }, 0 },
10804     { "kmovq",          { MaskG, MaskE }, 0 },
10805   },
10806   {
10807     /* VEX_W_0F90_P_2_LEN_0 */
10808     { "kmovb",          { MaskG, MaskBDE }, 0 },
10809     { "kmovd",          { MaskG, MaskBDE }, 0 },
10810   },
10811   {
10812     /* VEX_W_0F91_P_0_LEN_0 */
10813     { "kmovw",          { Ew, MaskG }, 0 },
10814     { "kmovq",          { Eq, MaskG }, 0 },
10815   },
10816   {
10817     /* VEX_W_0F91_P_2_LEN_0 */
10818     { "kmovb",          { Eb, MaskG }, 0 },
10819     { "kmovd",          { Ed, MaskG }, 0 },
10820   },
10821   {
10822     /* VEX_W_0F92_P_0_LEN_0 */
10823     { "kmovw",          { MaskG, Rdq }, 0 },
10824   },
10825   {
10826     /* VEX_W_0F92_P_2_LEN_0 */
10827     { "kmovb",          { MaskG, Rdq }, 0 },
10828   },
10829   {
10830     /* VEX_W_0F92_P_3_LEN_0 */
10831     { "kmovd",          { MaskG, Rdq }, 0 },
10832     { "kmovq",          { MaskG, Rdq }, 0 },
10833   },
10834   {
10835     /* VEX_W_0F93_P_0_LEN_0 */
10836     { "kmovw",          { Gdq, MaskR }, 0 },
10837   },
10838   {
10839     /* VEX_W_0F93_P_2_LEN_0 */
10840     { "kmovb",          { Gdq, MaskR }, 0 },
10841   },
10842   {
10843     /* VEX_W_0F93_P_3_LEN_0 */
10844     { "kmovd",          { Gdq, MaskR }, 0 },
10845     { "kmovq",          { Gdq, MaskR }, 0 },
10846   },
10847   {
10848     /* VEX_W_0F98_P_0_LEN_0 */
10849     { "kortestw",       { MaskG, MaskR }, 0 },
10850     { "kortestq",       { MaskG, MaskR }, 0 },
10851   },
10852   {
10853     /* VEX_W_0F98_P_2_LEN_0 */
10854     { "kortestb",       { MaskG, MaskR }, 0 },
10855     { "kortestd",       { MaskG, MaskR }, 0 },
10856   },
10857   {
10858     /* VEX_W_0F99_P_0_LEN_0 */
10859     { "ktestw", { MaskG, MaskR }, 0 },
10860     { "ktestq", { MaskG, MaskR }, 0 },
10861   },
10862   {
10863     /* VEX_W_0F99_P_2_LEN_0 */
10864     { "ktestb", { MaskG, MaskR }, 0 },
10865     { "ktestd", { MaskG, MaskR }, 0 },
10866   },
10867   {
10868     /* VEX_W_0FAE_R_2_M_0 */
10869     { "vldmxcsr",       { Md }, 0 },
10870   },
10871   {
10872     /* VEX_W_0FAE_R_3_M_0 */
10873     { "vstmxcsr",       { Md }, 0 },
10874   },
10875   {
10876     /* VEX_W_0FC2_P_0 */
10877     { "vcmpps",         { XM, Vex, EXx, VCMP }, 0 },
10878   },
10879   {
10880     /* VEX_W_0FC2_P_1 */
10881     { "vcmpss",         { XMScalar, VexScalar, EXdScalar, VCMP }, 0 },
10882   },
10883   {
10884     /* VEX_W_0FC2_P_2 */
10885     { "vcmppd",         { XM, Vex, EXx, VCMP }, 0 },
10886   },
10887   {
10888     /* VEX_W_0FC2_P_3 */
10889     { "vcmpsd",         { XMScalar, VexScalar, EXqScalar, VCMP }, 0 },
10890   },
10891   {
10892     /* VEX_W_0FC4_P_2 */
10893     { "vpinsrw",        { XM, Vex128, Edqw, Ib }, 0 },
10894   },
10895   {
10896     /* VEX_W_0FC5_P_2 */
10897     { "vpextrw",        { Gdq, XS, Ib }, 0 },
10898   },
10899   {
10900     /* VEX_W_0FD0_P_2 */
10901     { "vaddsubpd",      { XM, Vex, EXx }, 0 },
10902   },
10903   {
10904     /* VEX_W_0FD0_P_3 */
10905     { "vaddsubps",      { XM, Vex, EXx }, 0 },
10906   },
10907   {
10908     /* VEX_W_0FD1_P_2 */
10909     { "vpsrlw",         { XM, Vex, EXxmm }, 0 },
10910   },
10911   {
10912     /* VEX_W_0FD2_P_2 */
10913     { "vpsrld",         { XM, Vex, EXxmm }, 0 },
10914   },
10915   {
10916     /* VEX_W_0FD3_P_2 */
10917     { "vpsrlq",         { XM, Vex, EXxmm }, 0 },
10918   },
10919   {
10920     /* VEX_W_0FD4_P_2 */
10921     { "vpaddq",         { XM, Vex, EXx }, 0 },
10922   },
10923   {
10924     /* VEX_W_0FD5_P_2 */
10925     { "vpmullw",        { XM, Vex, EXx }, 0 },
10926   },
10927   {
10928     /* VEX_W_0FD6_P_2 */
10929     { "vmovq",          { EXqScalarS, XMScalar }, 0 },
10930   },
10931   {
10932     /* VEX_W_0FD7_P_2_M_1 */
10933     { "vpmovmskb",      { Gdq, XS }, 0 },
10934   },
10935   {
10936     /* VEX_W_0FD8_P_2 */
10937     { "vpsubusb",       { XM, Vex, EXx }, 0 },
10938   },
10939   {
10940     /* VEX_W_0FD9_P_2 */
10941     { "vpsubusw",       { XM, Vex, EXx }, 0 },
10942   },
10943   {
10944     /* VEX_W_0FDA_P_2 */
10945     { "vpminub",        { XM, Vex, EXx }, 0 },
10946   },
10947   {
10948     /* VEX_W_0FDB_P_2 */
10949     { "vpand",          { XM, Vex, EXx }, 0 },
10950   },
10951   {
10952     /* VEX_W_0FDC_P_2 */
10953     { "vpaddusb",       { XM, Vex, EXx }, 0 },
10954   },
10955   {
10956     /* VEX_W_0FDD_P_2 */
10957     { "vpaddusw",       { XM, Vex, EXx }, 0 },
10958   },
10959   {
10960     /* VEX_W_0FDE_P_2 */
10961     { "vpmaxub",        { XM, Vex, EXx }, 0 },
10962   },
10963   {
10964     /* VEX_W_0FDF_P_2 */
10965     { "vpandn",         { XM, Vex, EXx }, 0 },
10966   },
10967   {
10968     /* VEX_W_0FE0_P_2  */
10969     { "vpavgb",         { XM, Vex, EXx }, 0 },
10970   },
10971   {
10972     /* VEX_W_0FE1_P_2  */
10973     { "vpsraw",         { XM, Vex, EXxmm }, 0 },
10974   },
10975   {
10976     /* VEX_W_0FE2_P_2  */
10977     { "vpsrad",         { XM, Vex, EXxmm }, 0 },
10978   },
10979   {
10980     /* VEX_W_0FE3_P_2  */
10981     { "vpavgw",         { XM, Vex, EXx }, 0 },
10982   },
10983   {
10984     /* VEX_W_0FE4_P_2  */
10985     { "vpmulhuw",       { XM, Vex, EXx }, 0 },
10986   },
10987   {
10988     /* VEX_W_0FE5_P_2  */
10989     { "vpmulhw",        { XM, Vex, EXx }, 0 },
10990   },
10991   {
10992     /* VEX_W_0FE6_P_1  */
10993     { "vcvtdq2pd",      { XM, EXxmmq }, 0 },
10994   },
10995   {
10996     /* VEX_W_0FE6_P_2  */
10997     { "vcvttpd2dq%XY",  { XMM, EXx }, 0 },
10998   },
10999   {
11000     /* VEX_W_0FE6_P_3  */
11001     { "vcvtpd2dq%XY",   { XMM, EXx }, 0 },
11002   },
11003   {
11004     /* VEX_W_0FE7_P_2_M_0 */
11005     { "vmovntdq",       { Mx, XM }, 0 },
11006   },
11007   {
11008     /* VEX_W_0FE8_P_2  */
11009     { "vpsubsb",        { XM, Vex, EXx }, 0 },
11010   },
11011   {
11012     /* VEX_W_0FE9_P_2  */
11013     { "vpsubsw",        { XM, Vex, EXx }, 0 },
11014   },
11015   {
11016     /* VEX_W_0FEA_P_2  */
11017     { "vpminsw",        { XM, Vex, EXx }, 0 },
11018   },
11019   {
11020     /* VEX_W_0FEB_P_2  */
11021     { "vpor",           { XM, Vex, EXx }, 0 },
11022   },
11023   {
11024     /* VEX_W_0FEC_P_2  */
11025     { "vpaddsb",        { XM, Vex, EXx }, 0 },
11026   },
11027   {
11028     /* VEX_W_0FED_P_2  */
11029     { "vpaddsw",        { XM, Vex, EXx }, 0 },
11030   },
11031   {
11032     /* VEX_W_0FEE_P_2  */
11033     { "vpmaxsw",        { XM, Vex, EXx }, 0 },
11034   },
11035   {
11036     /* VEX_W_0FEF_P_2  */
11037     { "vpxor",          { XM, Vex, EXx }, 0 },
11038   },
11039   {
11040     /* VEX_W_0FF0_P_3_M_0 */
11041     { "vlddqu",         { XM, M }, 0 },
11042   },
11043   {
11044     /* VEX_W_0FF1_P_2 */
11045     { "vpsllw",         { XM, Vex, EXxmm }, 0 },
11046   },
11047   {
11048     /* VEX_W_0FF2_P_2 */
11049     { "vpslld",         { XM, Vex, EXxmm }, 0 },
11050   },
11051   {
11052     /* VEX_W_0FF3_P_2 */
11053     { "vpsllq",         { XM, Vex, EXxmm }, 0 },
11054   },
11055   {
11056     /* VEX_W_0FF4_P_2 */
11057     { "vpmuludq",       { XM, Vex, EXx }, 0 },
11058   },
11059   {
11060     /* VEX_W_0FF5_P_2 */
11061     { "vpmaddwd",       { XM, Vex, EXx }, 0 },
11062   },
11063   {
11064     /* VEX_W_0FF6_P_2 */
11065     { "vpsadbw",        { XM, Vex, EXx }, 0 },
11066   },
11067   {
11068     /* VEX_W_0FF7_P_2 */
11069     { "vmaskmovdqu",    { XM, XS }, 0 },
11070   },
11071   {
11072     /* VEX_W_0FF8_P_2 */
11073     { "vpsubb",         { XM, Vex, EXx }, 0 },
11074   },
11075   {
11076     /* VEX_W_0FF9_P_2 */
11077     { "vpsubw",         { XM, Vex, EXx }, 0 },
11078   },
11079   {
11080     /* VEX_W_0FFA_P_2 */
11081     { "vpsubd",         { XM, Vex, EXx }, 0 },
11082   },
11083   {
11084     /* VEX_W_0FFB_P_2 */
11085     { "vpsubq",         { XM, Vex, EXx }, 0 },
11086   },
11087   {
11088     /* VEX_W_0FFC_P_2 */
11089     { "vpaddb",         { XM, Vex, EXx }, 0 },
11090   },
11091   {
11092     /* VEX_W_0FFD_P_2 */
11093     { "vpaddw",         { XM, Vex, EXx }, 0 },
11094   },
11095   {
11096     /* VEX_W_0FFE_P_2 */
11097     { "vpaddd",         { XM, Vex, EXx }, 0 },
11098   },
11099   {
11100     /* VEX_W_0F3800_P_2  */
11101     { "vpshufb",        { XM, Vex, EXx }, 0 },
11102   },
11103   {
11104     /* VEX_W_0F3801_P_2  */
11105     { "vphaddw",        { XM, Vex, EXx }, 0 },
11106   },
11107   {
11108     /* VEX_W_0F3802_P_2  */
11109     { "vphaddd",        { XM, Vex, EXx }, 0 },
11110   },
11111   {
11112     /* VEX_W_0F3803_P_2  */
11113     { "vphaddsw",       { XM, Vex, EXx }, 0 },
11114   },
11115   {
11116     /* VEX_W_0F3804_P_2  */
11117     { "vpmaddubsw",     { XM, Vex, EXx }, 0 },
11118   },
11119   {
11120     /* VEX_W_0F3805_P_2  */
11121     { "vphsubw",        { XM, Vex, EXx }, 0 },
11122   },
11123   {
11124     /* VEX_W_0F3806_P_2  */
11125     { "vphsubd",        { XM, Vex, EXx }, 0 },
11126   },
11127   {
11128     /* VEX_W_0F3807_P_2  */
11129     { "vphsubsw",       { XM, Vex, EXx }, 0 },
11130   },
11131   {
11132     /* VEX_W_0F3808_P_2  */
11133     { "vpsignb",        { XM, Vex, EXx }, 0 },
11134   },
11135   {
11136     /* VEX_W_0F3809_P_2  */
11137     { "vpsignw",        { XM, Vex, EXx }, 0 },
11138   },
11139   {
11140     /* VEX_W_0F380A_P_2  */
11141     { "vpsignd",        { XM, Vex, EXx }, 0 },
11142   },
11143   {
11144     /* VEX_W_0F380B_P_2  */
11145     { "vpmulhrsw",      { XM, Vex, EXx }, 0 },
11146   },
11147   {
11148     /* VEX_W_0F380C_P_2  */
11149     { "vpermilps",      { XM, Vex, EXx }, 0 },
11150   },
11151   {
11152     /* VEX_W_0F380D_P_2  */
11153     { "vpermilpd",      { XM, Vex, EXx }, 0 },
11154   },
11155   {
11156     /* VEX_W_0F380E_P_2  */
11157     { "vtestps",        { XM, EXx }, 0 },
11158   },
11159   {
11160     /* VEX_W_0F380F_P_2  */
11161     { "vtestpd",        { XM, EXx }, 0 },
11162   },
11163   {
11164     /* VEX_W_0F3816_P_2  */
11165     { "vpermps",        { XM, Vex, EXx }, 0 },
11166   },
11167   {
11168     /* VEX_W_0F3817_P_2 */
11169     { "vptest",         { XM, EXx }, 0 },
11170   },
11171   {
11172     /* VEX_W_0F3818_P_2 */
11173     { "vbroadcastss",   { XM, EXxmm_md }, 0 },
11174   },
11175   {
11176     /* VEX_W_0F3819_P_2 */
11177     { "vbroadcastsd",   { XM, EXxmm_mq }, 0 },
11178   },
11179   {
11180     /* VEX_W_0F381A_P_2_M_0 */
11181     { "vbroadcastf128", { XM, Mxmm }, 0 },
11182   },
11183   {
11184     /* VEX_W_0F381C_P_2 */
11185     { "vpabsb",         { XM, EXx }, 0 },
11186   },
11187   {
11188     /* VEX_W_0F381D_P_2 */
11189     { "vpabsw",         { XM, EXx }, 0 },
11190   },
11191   {
11192     /* VEX_W_0F381E_P_2 */
11193     { "vpabsd",         { XM, EXx }, 0 },
11194   },
11195   {
11196     /* VEX_W_0F3820_P_2 */
11197     { "vpmovsxbw",      { XM, EXxmmq }, 0 },
11198   },
11199   {
11200     /* VEX_W_0F3821_P_2 */
11201     { "vpmovsxbd",      { XM, EXxmmqd }, 0 },
11202   },
11203   {
11204     /* VEX_W_0F3822_P_2 */
11205     { "vpmovsxbq",      { XM, EXxmmdw }, 0 },
11206   },
11207   {
11208     /* VEX_W_0F3823_P_2 */
11209     { "vpmovsxwd",      { XM, EXxmmq }, 0 },
11210   },
11211   {
11212     /* VEX_W_0F3824_P_2 */
11213     { "vpmovsxwq",      { XM, EXxmmqd }, 0 },
11214   },
11215   {
11216     /* VEX_W_0F3825_P_2 */
11217     { "vpmovsxdq",      { XM, EXxmmq }, 0 },
11218   },
11219   {
11220     /* VEX_W_0F3828_P_2 */
11221     { "vpmuldq",        { XM, Vex, EXx }, 0 },
11222   },
11223   {
11224     /* VEX_W_0F3829_P_2 */
11225     { "vpcmpeqq",       { XM, Vex, EXx }, 0 },
11226   },
11227   {
11228     /* VEX_W_0F382A_P_2_M_0 */
11229     { "vmovntdqa",      { XM, Mx }, 0 },
11230   },
11231   {
11232     /* VEX_W_0F382B_P_2 */
11233     { "vpackusdw",      { XM, Vex, EXx }, 0 },
11234   },
11235   {
11236     /* VEX_W_0F382C_P_2_M_0 */
11237     { "vmaskmovps",     { XM, Vex, Mx }, 0 },
11238   },
11239   {
11240     /* VEX_W_0F382D_P_2_M_0 */
11241     { "vmaskmovpd",     { XM, Vex, Mx }, 0 },
11242   },
11243   {
11244     /* VEX_W_0F382E_P_2_M_0 */
11245     { "vmaskmovps",     { Mx, Vex, XM }, 0 },
11246   },
11247   {
11248     /* VEX_W_0F382F_P_2_M_0 */
11249     { "vmaskmovpd",     { Mx, Vex, XM }, 0 },
11250   },
11251   {
11252     /* VEX_W_0F3830_P_2 */
11253     { "vpmovzxbw",      { XM, EXxmmq }, 0 },
11254   },
11255   {
11256     /* VEX_W_0F3831_P_2 */
11257     { "vpmovzxbd",      { XM, EXxmmqd }, 0 },
11258   },
11259   {
11260     /* VEX_W_0F3832_P_2 */
11261     { "vpmovzxbq",      { XM, EXxmmdw }, 0 },
11262   },
11263   {
11264     /* VEX_W_0F3833_P_2 */
11265     { "vpmovzxwd",      { XM, EXxmmq }, 0 },
11266   },
11267   {
11268     /* VEX_W_0F3834_P_2 */
11269     { "vpmovzxwq",      { XM, EXxmmqd }, 0 },
11270   },
11271   {
11272     /* VEX_W_0F3835_P_2 */
11273     { "vpmovzxdq",      { XM, EXxmmq }, 0 },
11274   },
11275   {
11276     /* VEX_W_0F3836_P_2  */
11277     { "vpermd",         { XM, Vex, EXx }, 0 },
11278   },
11279   {
11280     /* VEX_W_0F3837_P_2 */
11281     { "vpcmpgtq",       { XM, Vex, EXx }, 0 },
11282   },
11283   {
11284     /* VEX_W_0F3838_P_2 */
11285     { "vpminsb",        { XM, Vex, EXx }, 0 },
11286   },
11287   {
11288     /* VEX_W_0F3839_P_2 */
11289     { "vpminsd",        { XM, Vex, EXx }, 0 },
11290   },
11291   {
11292     /* VEX_W_0F383A_P_2 */
11293     { "vpminuw",        { XM, Vex, EXx }, 0 },
11294   },
11295   {
11296     /* VEX_W_0F383B_P_2 */
11297     { "vpminud",        { XM, Vex, EXx }, 0 },
11298   },
11299   {
11300     /* VEX_W_0F383C_P_2 */
11301     { "vpmaxsb",        { XM, Vex, EXx }, 0 },
11302   },
11303   {
11304     /* VEX_W_0F383D_P_2 */
11305     { "vpmaxsd",        { XM, Vex, EXx }, 0 },
11306   },
11307   {
11308     /* VEX_W_0F383E_P_2 */
11309     { "vpmaxuw",        { XM, Vex, EXx }, 0 },
11310   },
11311   {
11312     /* VEX_W_0F383F_P_2 */
11313     { "vpmaxud",        { XM, Vex, EXx }, 0 },
11314   },
11315   {
11316     /* VEX_W_0F3840_P_2 */
11317     { "vpmulld",        { XM, Vex, EXx }, 0 },
11318   },
11319   {
11320     /* VEX_W_0F3841_P_2 */
11321     { "vphminposuw",    { XM, EXx }, 0 },
11322   },
11323   {
11324     /* VEX_W_0F3846_P_2 */
11325     { "vpsravd",        { XM, Vex, EXx }, 0 },
11326   },
11327   {
11328     /* VEX_W_0F3858_P_2 */
11329     { "vpbroadcastd", { XM, EXxmm_md }, 0 },
11330   },
11331   {
11332     /* VEX_W_0F3859_P_2 */
11333     { "vpbroadcastq",   { XM, EXxmm_mq }, 0 },
11334   },
11335   {
11336     /* VEX_W_0F385A_P_2_M_0 */
11337     { "vbroadcasti128", { XM, Mxmm }, 0 },
11338   },
11339   {
11340     /* VEX_W_0F3878_P_2 */
11341     { "vpbroadcastb",   { XM, EXxmm_mb }, 0 },
11342   },
11343   {
11344     /* VEX_W_0F3879_P_2 */
11345     { "vpbroadcastw",   { XM, EXxmm_mw }, 0 },
11346   },
11347   {
11348     /* VEX_W_0F38DB_P_2 */
11349     { "vaesimc",        { XM, EXx }, 0 },
11350   },
11351   {
11352     /* VEX_W_0F38DC_P_2 */
11353     { "vaesenc",        { XM, Vex128, EXx }, 0 },
11354   },
11355   {
11356     /* VEX_W_0F38DD_P_2 */
11357     { "vaesenclast",    { XM, Vex128, EXx }, 0 },
11358   },
11359   {
11360     /* VEX_W_0F38DE_P_2 */
11361     { "vaesdec",        { XM, Vex128, EXx }, 0 },
11362   },
11363   {
11364     /* VEX_W_0F38DF_P_2 */
11365     { "vaesdeclast",    { XM, Vex128, EXx }, 0 },
11366   },
11367   {
11368     /* VEX_W_0F3A00_P_2 */
11369     { Bad_Opcode },
11370     { "vpermq",         { XM, EXx, Ib }, 0 },
11371   },
11372   {
11373     /* VEX_W_0F3A01_P_2 */
11374     { Bad_Opcode },
11375     { "vpermpd",        { XM, EXx, Ib }, 0 },
11376   },
11377   {
11378     /* VEX_W_0F3A02_P_2 */
11379     { "vpblendd",       { XM, Vex, EXx, Ib }, 0 },
11380   },
11381   {
11382     /* VEX_W_0F3A04_P_2 */
11383     { "vpermilps",      { XM, EXx, Ib }, 0 },
11384   },
11385   {
11386     /* VEX_W_0F3A05_P_2 */
11387     { "vpermilpd",      { XM, EXx, Ib }, 0 },
11388   },
11389   {
11390     /* VEX_W_0F3A06_P_2 */
11391     { "vperm2f128",     { XM, Vex256, EXx, Ib }, 0 },
11392   },
11393   {
11394     /* VEX_W_0F3A08_P_2 */
11395     { "vroundps",       { XM, EXx, Ib }, 0 },
11396   },
11397   {
11398     /* VEX_W_0F3A09_P_2 */
11399     { "vroundpd",       { XM, EXx, Ib }, 0 },
11400   },
11401   {
11402     /* VEX_W_0F3A0A_P_2 */
11403     { "vroundss",       { XMScalar, VexScalar, EXdScalar, Ib }, 0 },
11404   },
11405   {
11406     /* VEX_W_0F3A0B_P_2 */
11407     { "vroundsd",       { XMScalar, VexScalar, EXqScalar, Ib }, 0 },
11408   },
11409   {
11410     /* VEX_W_0F3A0C_P_2 */
11411     { "vblendps",       { XM, Vex, EXx, Ib }, 0 },
11412   },
11413   {
11414     /* VEX_W_0F3A0D_P_2 */
11415     { "vblendpd",       { XM, Vex, EXx, Ib }, 0 },
11416   },
11417   {
11418     /* VEX_W_0F3A0E_P_2 */
11419     { "vpblendw",       { XM, Vex, EXx, Ib }, 0 },
11420   },
11421   {
11422     /* VEX_W_0F3A0F_P_2 */
11423     { "vpalignr",       { XM, Vex, EXx, Ib }, 0 },
11424   },
11425   {
11426     /* VEX_W_0F3A14_P_2 */
11427     { "vpextrb",        { Edqb, XM, Ib }, 0 },
11428   },
11429   {
11430     /* VEX_W_0F3A15_P_2 */
11431     { "vpextrw",        { Edqw, XM, Ib }, 0 },
11432   },
11433   {
11434     /* VEX_W_0F3A18_P_2 */
11435     { "vinsertf128",    { XM, Vex256, EXxmm, Ib }, 0 },
11436   },
11437   {
11438     /* VEX_W_0F3A19_P_2 */
11439     { "vextractf128",   { EXxmm, XM, Ib }, 0 },
11440   },
11441   {
11442     /* VEX_W_0F3A20_P_2 */
11443     { "vpinsrb",        { XM, Vex128, Edqb, Ib }, 0 },
11444   },
11445   {
11446     /* VEX_W_0F3A21_P_2 */
11447     { "vinsertps",      { XM, Vex128, EXd, Ib }, 0 },
11448   },
11449   {
11450     /* VEX_W_0F3A30_P_2_LEN_0 */
11451     { "kshiftrb",       { MaskG, MaskR, Ib }, 0 },
11452     { "kshiftrw",       { MaskG, MaskR, Ib }, 0 },
11453   },
11454   {
11455     /* VEX_W_0F3A31_P_2_LEN_0 */
11456     { "kshiftrd",       { MaskG, MaskR, Ib }, 0 },
11457     { "kshiftrq",       { MaskG, MaskR, Ib }, 0 },
11458   },
11459   {
11460     /* VEX_W_0F3A32_P_2_LEN_0 */
11461     { "kshiftlb",       { MaskG, MaskR, Ib }, 0 },
11462     { "kshiftlw",       { MaskG, MaskR, Ib }, 0 },
11463   },
11464   {
11465     /* VEX_W_0F3A33_P_2_LEN_0 */
11466     { "kshiftld",       { MaskG, MaskR, Ib }, 0 },
11467     { "kshiftlq",       { MaskG, MaskR, Ib }, 0 },
11468   },
11469   {
11470     /* VEX_W_0F3A38_P_2 */
11471     { "vinserti128",    { XM, Vex256, EXxmm, Ib }, 0 },
11472   },
11473   {
11474     /* VEX_W_0F3A39_P_2 */
11475     { "vextracti128",   { EXxmm, XM, Ib }, 0 },
11476   },
11477   {
11478     /* VEX_W_0F3A40_P_2 */
11479     { "vdpps",          { XM, Vex, EXx, Ib }, 0 },
11480   },
11481   {
11482     /* VEX_W_0F3A41_P_2 */
11483     { "vdppd",          { XM, Vex128, EXx, Ib }, 0 },
11484   },
11485   {
11486     /* VEX_W_0F3A42_P_2 */
11487     { "vmpsadbw",       { XM, Vex, EXx, Ib }, 0 },
11488   },
11489   {
11490     /* VEX_W_0F3A44_P_2 */
11491     { "vpclmulqdq",     { XM, Vex128, EXx, PCLMUL }, 0 },
11492   },
11493   {
11494     /* VEX_W_0F3A46_P_2 */
11495     { "vperm2i128",     { XM, Vex256, EXx, Ib }, 0 },
11496   },
11497   {
11498     /* VEX_W_0F3A48_P_2 */
11499     { "vpermil2ps",     { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW }, 0 },
11500     { "vpermil2ps",     { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW }, 0 },
11501   },
11502   {
11503     /* VEX_W_0F3A49_P_2 */
11504     { "vpermil2pd",     { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW }, 0 },
11505     { "vpermil2pd",     { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW }, 0 },
11506   },
11507   {
11508     /* VEX_W_0F3A4A_P_2 */
11509     { "vblendvps",      { XM, Vex, EXx, XMVexI4 }, 0 },
11510   },
11511   {
11512     /* VEX_W_0F3A4B_P_2 */
11513     { "vblendvpd",      { XM, Vex, EXx, XMVexI4 }, 0 },
11514   },
11515   {
11516     /* VEX_W_0F3A4C_P_2 */
11517     { "vpblendvb",      { XM, Vex, EXx, XMVexI4 }, 0 },
11518   },
11519   {
11520     /* VEX_W_0F3A60_P_2 */
11521     { "vpcmpestrm",     { XM, EXx, Ib }, 0 },
11522   },
11523   {
11524     /* VEX_W_0F3A61_P_2 */
11525     { "vpcmpestri",     { XM, EXx, Ib }, 0 },
11526   },
11527   {
11528     /* VEX_W_0F3A62_P_2 */
11529     { "vpcmpistrm",     { XM, EXx, Ib }, 0 },
11530   },
11531   {
11532     /* VEX_W_0F3A63_P_2 */
11533     { "vpcmpistri",     { XM, EXx, Ib }, 0 },
11534   },
11535   {
11536     /* VEX_W_0F3ADF_P_2 */
11537     { "vaeskeygenassist", { XM, EXx, Ib }, 0 },
11538   },
11539 #define NEED_VEX_W_TABLE
11540 #include "i386-dis-evex.h"
11541 #undef NEED_VEX_W_TABLE
11542 };
11543
11544 static const struct dis386 mod_table[][2] = {
11545   {
11546     /* MOD_8D */
11547     { "leaS",           { Gv, M }, 0 },
11548   },
11549   {
11550     /* MOD_C6_REG_7 */
11551     { Bad_Opcode },
11552     { RM_TABLE (RM_C6_REG_7) },
11553   },
11554   {
11555     /* MOD_C7_REG_7 */
11556     { Bad_Opcode },
11557     { RM_TABLE (RM_C7_REG_7) },
11558   },
11559   {
11560     /* MOD_FF_REG_3 */
11561     { "Jcall{T|}", { indirEp }, 0 },
11562   },
11563   {
11564     /* MOD_FF_REG_5 */
11565     { "Jjmp{T|}", { indirEp }, 0 },
11566   },
11567   {
11568     /* MOD_0F01_REG_0 */
11569     { X86_64_TABLE (X86_64_0F01_REG_0) },
11570     { RM_TABLE (RM_0F01_REG_0) },
11571   },
11572   {
11573     /* MOD_0F01_REG_1 */
11574     { X86_64_TABLE (X86_64_0F01_REG_1) },
11575     { RM_TABLE (RM_0F01_REG_1) },
11576   },
11577   {
11578     /* MOD_0F01_REG_2 */
11579     { X86_64_TABLE (X86_64_0F01_REG_2) },
11580     { RM_TABLE (RM_0F01_REG_2) },
11581   },
11582   {
11583     /* MOD_0F01_REG_3 */
11584     { X86_64_TABLE (X86_64_0F01_REG_3) },
11585     { RM_TABLE (RM_0F01_REG_3) },
11586   },
11587   {
11588     /* MOD_0F01_REG_7 */
11589     { "invlpg",         { Mb }, 0 },
11590     { RM_TABLE (RM_0F01_REG_7) },
11591   },
11592   {
11593     /* MOD_0F12_PREFIX_0 */
11594     { "movlps",         { XM, EXq }, PREFIX_MANDATORY },
11595     { "movhlps",        { XM, EXq }, PREFIX_MANDATORY },
11596   },
11597   {
11598     /* MOD_0F13 */
11599     { "movlpX",         { EXq, XM }, PREFIX_MANDATORY },
11600   },
11601   {
11602     /* MOD_0F16_PREFIX_0 */
11603     { "movhps",         { XM, EXq }, 0 },
11604     { "movlhps",        { XM, EXq }, 0 },
11605   },
11606   {
11607     /* MOD_0F17 */
11608     { "movhpX",         { EXq, XM }, PREFIX_MANDATORY },
11609   },
11610   {
11611     /* MOD_0F18_REG_0 */
11612     { "prefetchnta",    { Mb }, 0 },
11613   },
11614   {
11615     /* MOD_0F18_REG_1 */
11616     { "prefetcht0",     { Mb }, 0 },
11617   },
11618   {
11619     /* MOD_0F18_REG_2 */
11620     { "prefetcht1",     { Mb }, 0 },
11621   },
11622   {
11623     /* MOD_0F18_REG_3 */
11624     { "prefetcht2",     { Mb }, 0 },
11625   },
11626   {
11627     /* MOD_0F18_REG_4 */
11628     { "nop/reserved",   { Mb }, 0 },
11629   },
11630   {
11631     /* MOD_0F18_REG_5 */
11632     { "nop/reserved",   { Mb }, 0 },
11633   },
11634   {
11635     /* MOD_0F18_REG_6 */
11636     { "nop/reserved",   { Mb }, 0 },
11637   },
11638   {
11639     /* MOD_0F18_REG_7 */
11640     { "nop/reserved",   { Mb }, 0 },
11641   },
11642   {
11643     /* MOD_0F1A_PREFIX_0 */
11644     { "bndldx",         { Gbnd, Ev_bnd }, 0 },
11645     { "nopQ",           { Ev }, 0 },
11646   },
11647   {
11648     /* MOD_0F1B_PREFIX_0 */
11649     { "bndstx",         { Ev_bnd, Gbnd }, 0 },
11650     { "nopQ",           { Ev }, 0 },
11651   },
11652   {
11653     /* MOD_0F1B_PREFIX_1 */
11654     { "bndmk",          { Gbnd, Ev_bnd }, 0 },
11655     { "nopQ",           { Ev }, 0 },
11656   },
11657   {
11658     /* MOD_0F24 */
11659     { Bad_Opcode },
11660     { "movL",           { Rd, Td }, 0 },
11661   },
11662   {
11663     /* MOD_0F26 */
11664     { Bad_Opcode },
11665     { "movL",           { Td, Rd }, 0 },
11666   },
11667   {
11668     /* MOD_0F2B_PREFIX_0 */
11669     {"movntps",         { Mx, XM }, PREFIX_MANDATORY },
11670   },
11671   {
11672     /* MOD_0F2B_PREFIX_1 */
11673     {"movntss",         { Md, XM }, PREFIX_MANDATORY },
11674   },
11675   {
11676     /* MOD_0F2B_PREFIX_2 */
11677     {"movntpd",         { Mx, XM }, PREFIX_MANDATORY },
11678   },
11679   {
11680     /* MOD_0F2B_PREFIX_3 */
11681     {"movntsd",         { Mq, XM }, PREFIX_MANDATORY },
11682   },
11683   {
11684     /* MOD_0F51 */
11685     { Bad_Opcode },
11686     { "movmskpX",       { Gdq, XS }, PREFIX_MANDATORY },
11687   },
11688   {
11689     /* MOD_0F71_REG_2 */
11690     { Bad_Opcode },
11691     { "psrlw",          { MS, Ib }, 0 },
11692   },
11693   {
11694     /* MOD_0F71_REG_4 */
11695     { Bad_Opcode },
11696     { "psraw",          { MS, Ib }, 0 },
11697   },
11698   {
11699     /* MOD_0F71_REG_6 */
11700     { Bad_Opcode },
11701     { "psllw",          { MS, Ib }, 0 },
11702   },
11703   {
11704     /* MOD_0F72_REG_2 */
11705     { Bad_Opcode },
11706     { "psrld",          { MS, Ib }, 0 },
11707   },
11708   {
11709     /* MOD_0F72_REG_4 */
11710     { Bad_Opcode },
11711     { "psrad",          { MS, Ib }, 0 },
11712   },
11713   {
11714     /* MOD_0F72_REG_6 */
11715     { Bad_Opcode },
11716     { "pslld",          { MS, Ib }, 0 },
11717   },
11718   {
11719     /* MOD_0F73_REG_2 */
11720     { Bad_Opcode },
11721     { "psrlq",          { MS, Ib }, 0 },
11722   },
11723   {
11724     /* MOD_0F73_REG_3 */
11725     { Bad_Opcode },
11726     { PREFIX_TABLE (PREFIX_0F73_REG_3) },
11727   },
11728   {
11729     /* MOD_0F73_REG_6 */
11730     { Bad_Opcode },
11731     { "psllq",          { MS, Ib }, 0 },
11732   },
11733   {
11734     /* MOD_0F73_REG_7 */
11735     { Bad_Opcode },
11736     { PREFIX_TABLE (PREFIX_0F73_REG_7) },
11737   },
11738   {
11739     /* MOD_0FAE_REG_0 */
11740     { "fxsave",         { FXSAVE }, 0 },
11741     { PREFIX_TABLE (PREFIX_0FAE_REG_0) },
11742   },
11743   {
11744     /* MOD_0FAE_REG_1 */
11745     { "fxrstor",        { FXSAVE }, 0 },
11746     { PREFIX_TABLE (PREFIX_0FAE_REG_1) },
11747   },
11748   {
11749     /* MOD_0FAE_REG_2 */
11750     { "ldmxcsr",        { Md }, 0 },
11751     { PREFIX_TABLE (PREFIX_0FAE_REG_2) },
11752   },
11753   {
11754     /* MOD_0FAE_REG_3 */
11755     { "stmxcsr",        { Md }, 0 },
11756     { PREFIX_TABLE (PREFIX_0FAE_REG_3) },
11757   },
11758   {
11759     /* MOD_0FAE_REG_4 */
11760     { "xsave",          { FXSAVE }, 0 },
11761   },
11762   {
11763     /* MOD_0FAE_REG_5 */
11764     { "xrstor",         { FXSAVE }, 0 },
11765     { RM_TABLE (RM_0FAE_REG_5) },
11766   },
11767   {
11768     /* MOD_0FAE_REG_6 */
11769     { PREFIX_TABLE (PREFIX_0FAE_REG_6) },
11770     { RM_TABLE (RM_0FAE_REG_6) },
11771   },
11772   {
11773     /* MOD_0FAE_REG_7 */
11774     { PREFIX_TABLE (PREFIX_0FAE_REG_7) },
11775     { RM_TABLE (RM_0FAE_REG_7) },
11776   },
11777   {
11778     /* MOD_0FB2 */
11779     { "lssS",           { Gv, Mp }, 0 },
11780   },
11781   {
11782     /* MOD_0FB4 */
11783     { "lfsS",           { Gv, Mp }, 0 },
11784   },
11785   {
11786     /* MOD_0FB5 */
11787     { "lgsS",           { Gv, Mp }, 0 },
11788   },
11789   {
11790     /* MOD_0FC7_REG_3 */
11791     { "xrstors",                { FXSAVE }, 0 },
11792   },
11793   {
11794     /* MOD_0FC7_REG_4 */
11795     { "xsavec",         { FXSAVE }, 0 },
11796   },
11797   {
11798     /* MOD_0FC7_REG_5 */
11799     { "xsaves",         { FXSAVE }, 0 },
11800   },
11801   {
11802     /* MOD_0FC7_REG_6 */
11803     { PREFIX_TABLE (PREFIX_0FC7_REG_6) },
11804     { "rdrand",         { Ev }, 0 },
11805   },
11806   {
11807     /* MOD_0FC7_REG_7 */
11808     { "vmptrst",        { Mq }, 0 },
11809     { "rdseed",         { Ev }, 0 },
11810   },
11811   {
11812     /* MOD_0FD7 */
11813     { Bad_Opcode },
11814     { "pmovmskb",       { Gdq, MS }, 0 },
11815   },
11816   {
11817     /* MOD_0FE7_PREFIX_2 */
11818     { "movntdq",        { Mx, XM }, 0 },
11819   },
11820   {
11821     /* MOD_0FF0_PREFIX_3 */
11822     { "lddqu",          { XM, M }, 0 },
11823   },
11824   {
11825     /* MOD_0F382A_PREFIX_2 */
11826     { "movntdqa",       { XM, Mx }, 0 },
11827   },
11828   {
11829     /* MOD_62_32BIT */
11830     { "bound{S|}",      { Gv, Ma }, 0 },
11831     { EVEX_TABLE (EVEX_0F) },
11832   },
11833   {
11834     /* MOD_C4_32BIT */
11835     { "lesS",           { Gv, Mp }, 0 },
11836     { VEX_C4_TABLE (VEX_0F) },
11837   },
11838   {
11839     /* MOD_C5_32BIT */
11840     { "ldsS",           { Gv, Mp }, 0 },
11841     { VEX_C5_TABLE (VEX_0F) },
11842   },
11843   {
11844     /* MOD_VEX_0F12_PREFIX_0 */
11845     { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_0) },
11846     { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_1) },
11847   },
11848   {
11849     /* MOD_VEX_0F13 */
11850     { VEX_LEN_TABLE (VEX_LEN_0F13_M_0) },
11851   },
11852   {
11853     /* MOD_VEX_0F16_PREFIX_0 */
11854     { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_0) },
11855     { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_1) },
11856   },
11857   {
11858     /* MOD_VEX_0F17 */
11859     { VEX_LEN_TABLE (VEX_LEN_0F17_M_0) },
11860   },
11861   {
11862     /* MOD_VEX_0F2B */
11863     { VEX_W_TABLE (VEX_W_0F2B_M_0) },
11864   },
11865   {
11866     /* MOD_VEX_0F50 */
11867     { Bad_Opcode },
11868     { VEX_W_TABLE (VEX_W_0F50_M_0) },
11869   },
11870   {
11871     /* MOD_VEX_0F71_REG_2 */
11872     { Bad_Opcode },
11873     { PREFIX_TABLE (PREFIX_VEX_0F71_REG_2) },
11874   },
11875   {
11876     /* MOD_VEX_0F71_REG_4 */
11877     { Bad_Opcode },
11878     { PREFIX_TABLE (PREFIX_VEX_0F71_REG_4) },
11879   },
11880   {
11881     /* MOD_VEX_0F71_REG_6 */
11882     { Bad_Opcode },
11883     { PREFIX_TABLE (PREFIX_VEX_0F71_REG_6) },
11884   },
11885   {
11886     /* MOD_VEX_0F72_REG_2 */
11887     { Bad_Opcode },
11888     { PREFIX_TABLE (PREFIX_VEX_0F72_REG_2) },
11889   },
11890   {
11891     /* MOD_VEX_0F72_REG_4 */
11892     { Bad_Opcode },
11893     { PREFIX_TABLE (PREFIX_VEX_0F72_REG_4) },
11894   },
11895   {
11896     /* MOD_VEX_0F72_REG_6 */
11897     { Bad_Opcode },
11898     { PREFIX_TABLE (PREFIX_VEX_0F72_REG_6) },
11899   },
11900   {
11901     /* MOD_VEX_0F73_REG_2 */
11902     { Bad_Opcode },
11903     { PREFIX_TABLE (PREFIX_VEX_0F73_REG_2) },
11904   },
11905   {
11906     /* MOD_VEX_0F73_REG_3 */
11907     { Bad_Opcode },
11908     { PREFIX_TABLE (PREFIX_VEX_0F73_REG_3) },
11909   },
11910   {
11911     /* MOD_VEX_0F73_REG_6 */
11912     { Bad_Opcode },
11913     { PREFIX_TABLE (PREFIX_VEX_0F73_REG_6) },
11914   },
11915   {
11916     /* MOD_VEX_0F73_REG_7 */
11917     { Bad_Opcode },
11918     { PREFIX_TABLE (PREFIX_VEX_0F73_REG_7) },
11919   },
11920   {
11921     /* MOD_VEX_0FAE_REG_2 */
11922     { VEX_LEN_TABLE (VEX_LEN_0FAE_R_2_M_0) },
11923   },
11924   {
11925     /* MOD_VEX_0FAE_REG_3 */
11926     { VEX_LEN_TABLE (VEX_LEN_0FAE_R_3_M_0) },
11927   },
11928   {
11929     /* MOD_VEX_0FD7_PREFIX_2 */
11930     { Bad_Opcode },
11931     { VEX_W_TABLE (VEX_W_0FD7_P_2_M_1) },
11932   },
11933   {
11934     /* MOD_VEX_0FE7_PREFIX_2 */
11935     { VEX_W_TABLE (VEX_W_0FE7_P_2_M_0) },
11936   },
11937   {
11938     /* MOD_VEX_0FF0_PREFIX_3 */
11939     { VEX_W_TABLE (VEX_W_0FF0_P_3_M_0) },
11940   },
11941   {
11942     /* MOD_VEX_0F381A_PREFIX_2 */
11943     { VEX_LEN_TABLE (VEX_LEN_0F381A_P_2_M_0) },
11944   },
11945   {
11946     /* MOD_VEX_0F382A_PREFIX_2 */
11947     { VEX_W_TABLE (VEX_W_0F382A_P_2_M_0) },
11948   },
11949   {
11950     /* MOD_VEX_0F382C_PREFIX_2 */
11951     { VEX_W_TABLE (VEX_W_0F382C_P_2_M_0) },
11952   },
11953   {
11954     /* MOD_VEX_0F382D_PREFIX_2 */
11955     { VEX_W_TABLE (VEX_W_0F382D_P_2_M_0) },
11956   },
11957   {
11958     /* MOD_VEX_0F382E_PREFIX_2 */
11959     { VEX_W_TABLE (VEX_W_0F382E_P_2_M_0) },
11960   },
11961   {
11962     /* MOD_VEX_0F382F_PREFIX_2 */
11963     { VEX_W_TABLE (VEX_W_0F382F_P_2_M_0) },
11964   },
11965   {
11966     /* MOD_VEX_0F385A_PREFIX_2 */
11967     { VEX_LEN_TABLE (VEX_LEN_0F385A_P_2_M_0) },
11968   },
11969   {
11970     /* MOD_VEX_0F388C_PREFIX_2 */
11971     { "vpmaskmov%LW",   { XM, Vex, Mx }, 0 },
11972   },
11973   {
11974     /* MOD_VEX_0F388E_PREFIX_2 */
11975     { "vpmaskmov%LW",   { Mx, Vex, XM }, 0 },
11976   },
11977 #define NEED_MOD_TABLE
11978 #include "i386-dis-evex.h"
11979 #undef NEED_MOD_TABLE
11980 };
11981
11982 static const struct dis386 rm_table[][8] = {
11983   {
11984     /* RM_C6_REG_7 */
11985     { "xabort",         { Skip_MODRM, Ib }, 0 },
11986   },
11987   {
11988     /* RM_C7_REG_7 */
11989     { "xbeginT",        { Skip_MODRM, Jv }, 0 },
11990   },
11991   {
11992     /* RM_0F01_REG_0 */
11993     { Bad_Opcode },
11994     { "vmcall",         { Skip_MODRM }, 0 },
11995     { "vmlaunch",       { Skip_MODRM }, 0 },
11996     { "vmresume",       { Skip_MODRM }, 0 },
11997     { "vmxoff",         { Skip_MODRM }, 0 },
11998   },
11999   {
12000     /* RM_0F01_REG_1 */
12001     { "monitor",        { { OP_Monitor, 0 } }, 0 },
12002     { "mwait",          { { OP_Mwait, 0 } }, 0 },
12003     { "clac",           { Skip_MODRM }, 0 },
12004     { "stac",           { Skip_MODRM }, 0 },
12005     { Bad_Opcode },
12006     { Bad_Opcode },
12007     { Bad_Opcode },
12008     { "encls",          { Skip_MODRM }, 0 },
12009   },
12010   {
12011     /* RM_0F01_REG_2 */
12012     { "xgetbv",         { Skip_MODRM }, 0 },
12013     { "xsetbv",         { Skip_MODRM }, 0 },
12014     { Bad_Opcode },
12015     { Bad_Opcode },
12016     { "vmfunc",         { Skip_MODRM }, 0 },
12017     { "xend",           { Skip_MODRM }, 0 },
12018     { "xtest",          { Skip_MODRM }, 0 },
12019     { "enclu",          { Skip_MODRM }, 0 },
12020   },
12021   {
12022     /* RM_0F01_REG_3 */
12023     { "vmrun",          { Skip_MODRM }, 0 },
12024     { "vmmcall",        { Skip_MODRM }, 0 },
12025     { "vmload",         { Skip_MODRM }, 0 },
12026     { "vmsave",         { Skip_MODRM }, 0 },
12027     { "stgi",           { Skip_MODRM }, 0 },
12028     { "clgi",           { Skip_MODRM }, 0 },
12029     { "skinit",         { Skip_MODRM }, 0 },
12030     { "invlpga",        { Skip_MODRM }, 0 },
12031   },
12032   {
12033     /* RM_0F01_REG_7 */
12034     { "swapgs",         { Skip_MODRM }, 0  },
12035     { "rdtscp",         { Skip_MODRM }, 0  },
12036     { Bad_Opcode },
12037     { Bad_Opcode },
12038     { "clzero",         { Skip_MODRM }, 0  },
12039   },
12040   {
12041     /* RM_0FAE_REG_5 */
12042     { "lfence",         { Skip_MODRM }, 0 },
12043   },
12044   {
12045     /* RM_0FAE_REG_6 */
12046     { "mfence",         { Skip_MODRM }, 0 },
12047   },
12048   {
12049     /* RM_0FAE_REG_7 */
12050     { PREFIX_TABLE (PREFIX_RM_0_0FAE_REG_7) },
12051   },
12052 };
12053
12054 #define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
12055
12056 /* We use the high bit to indicate different name for the same
12057    prefix.  */
12058 #define REP_PREFIX      (0xf3 | 0x100)
12059 #define XACQUIRE_PREFIX (0xf2 | 0x200)
12060 #define XRELEASE_PREFIX (0xf3 | 0x400)
12061 #define BND_PREFIX      (0xf2 | 0x400)
12062
12063 static int
12064 ckprefix (void)
12065 {
12066   int newrex, i, length;
12067   rex = 0;
12068   rex_ignored = 0;
12069   prefixes = 0;
12070   used_prefixes = 0;
12071   rex_used = 0;
12072   last_lock_prefix = -1;
12073   last_repz_prefix = -1;
12074   last_repnz_prefix = -1;
12075   last_data_prefix = -1;
12076   last_addr_prefix = -1;
12077   last_rex_prefix = -1;
12078   last_seg_prefix = -1;
12079   fwait_prefix = -1;
12080   active_seg_prefix = 0;
12081   for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
12082     all_prefixes[i] = 0;
12083   i = 0;
12084   length = 0;
12085   /* The maximum instruction length is 15bytes.  */
12086   while (length < MAX_CODE_LENGTH - 1)
12087     {
12088       FETCH_DATA (the_info, codep + 1);
12089       newrex = 0;
12090       switch (*codep)
12091         {
12092         /* REX prefixes family.  */
12093         case 0x40:
12094         case 0x41:
12095         case 0x42:
12096         case 0x43:
12097         case 0x44:
12098         case 0x45:
12099         case 0x46:
12100         case 0x47:
12101         case 0x48:
12102         case 0x49:
12103         case 0x4a:
12104         case 0x4b:
12105         case 0x4c:
12106         case 0x4d:
12107         case 0x4e:
12108         case 0x4f:
12109           if (address_mode == mode_64bit)
12110             newrex = *codep;
12111           else
12112             return 1;
12113           last_rex_prefix = i;
12114           break;
12115         case 0xf3:
12116           prefixes |= PREFIX_REPZ;
12117           last_repz_prefix = i;
12118           break;
12119         case 0xf2:
12120           prefixes |= PREFIX_REPNZ;
12121           last_repnz_prefix = i;
12122           break;
12123         case 0xf0:
12124           prefixes |= PREFIX_LOCK;
12125           last_lock_prefix = i;
12126           break;
12127         case 0x2e:
12128           prefixes |= PREFIX_CS;
12129           last_seg_prefix = i;
12130           active_seg_prefix = PREFIX_CS;
12131           break;
12132         case 0x36:
12133           prefixes |= PREFIX_SS;
12134           last_seg_prefix = i;
12135           active_seg_prefix = PREFIX_SS;
12136           break;
12137         case 0x3e:
12138           prefixes |= PREFIX_DS;
12139           last_seg_prefix = i;
12140           active_seg_prefix = PREFIX_DS;
12141           break;
12142         case 0x26:
12143           prefixes |= PREFIX_ES;
12144           last_seg_prefix = i;
12145           active_seg_prefix = PREFIX_ES;
12146           break;
12147         case 0x64:
12148           prefixes |= PREFIX_FS;
12149           last_seg_prefix = i;
12150           active_seg_prefix = PREFIX_FS;
12151           break;
12152         case 0x65:
12153           prefixes |= PREFIX_GS;
12154           last_seg_prefix = i;
12155           active_seg_prefix = PREFIX_GS;
12156           break;
12157         case 0x66:
12158           prefixes |= PREFIX_DATA;
12159           last_data_prefix = i;
12160           break;
12161         case 0x67:
12162           prefixes |= PREFIX_ADDR;
12163           last_addr_prefix = i;
12164           break;
12165         case FWAIT_OPCODE:
12166           /* fwait is really an instruction.  If there are prefixes
12167              before the fwait, they belong to the fwait, *not* to the
12168              following instruction.  */
12169           fwait_prefix = i;
12170           if (prefixes || rex)
12171             {
12172               prefixes |= PREFIX_FWAIT;
12173               codep++;
12174               /* This ensures that the previous REX prefixes are noticed
12175                  as unused prefixes, as in the return case below.  */
12176               rex_used = rex;
12177               return 1;
12178             }
12179           prefixes = PREFIX_FWAIT;
12180           break;
12181         default:
12182           return 1;
12183         }
12184       /* Rex is ignored when followed by another prefix.  */
12185       if (rex)
12186         {
12187           rex_used = rex;
12188           return 1;
12189         }
12190       if (*codep != FWAIT_OPCODE)
12191         all_prefixes[i++] = *codep;
12192       rex = newrex;
12193       codep++;
12194       length++;
12195     }
12196   return 0;
12197 }
12198
12199 /* Return the name of the prefix byte PREF, or NULL if PREF is not a
12200    prefix byte.  */
12201
12202 static const char *
12203 prefix_name (int pref, int sizeflag)
12204 {
12205   static const char *rexes [16] =
12206     {
12207       "rex",            /* 0x40 */
12208       "rex.B",          /* 0x41 */
12209       "rex.X",          /* 0x42 */
12210       "rex.XB",         /* 0x43 */
12211       "rex.R",          /* 0x44 */
12212       "rex.RB",         /* 0x45 */
12213       "rex.RX",         /* 0x46 */
12214       "rex.RXB",        /* 0x47 */
12215       "rex.W",          /* 0x48 */
12216       "rex.WB",         /* 0x49 */
12217       "rex.WX",         /* 0x4a */
12218       "rex.WXB",        /* 0x4b */
12219       "rex.WR",         /* 0x4c */
12220       "rex.WRB",        /* 0x4d */
12221       "rex.WRX",        /* 0x4e */
12222       "rex.WRXB",       /* 0x4f */
12223     };
12224
12225   switch (pref)
12226     {
12227     /* REX prefixes family.  */
12228     case 0x40:
12229     case 0x41:
12230     case 0x42:
12231     case 0x43:
12232     case 0x44:
12233     case 0x45:
12234     case 0x46:
12235     case 0x47:
12236     case 0x48:
12237     case 0x49:
12238     case 0x4a:
12239     case 0x4b:
12240     case 0x4c:
12241     case 0x4d:
12242     case 0x4e:
12243     case 0x4f:
12244       return rexes [pref - 0x40];
12245     case 0xf3:
12246       return "repz";
12247     case 0xf2:
12248       return "repnz";
12249     case 0xf0:
12250       return "lock";
12251     case 0x2e:
12252       return "cs";
12253     case 0x36:
12254       return "ss";
12255     case 0x3e:
12256       return "ds";
12257     case 0x26:
12258       return "es";
12259     case 0x64:
12260       return "fs";
12261     case 0x65:
12262       return "gs";
12263     case 0x66:
12264       return (sizeflag & DFLAG) ? "data16" : "data32";
12265     case 0x67:
12266       if (address_mode == mode_64bit)
12267         return (sizeflag & AFLAG) ? "addr32" : "addr64";
12268       else
12269         return (sizeflag & AFLAG) ? "addr16" : "addr32";
12270     case FWAIT_OPCODE:
12271       return "fwait";
12272     case REP_PREFIX:
12273       return "rep";
12274     case XACQUIRE_PREFIX:
12275       return "xacquire";
12276     case XRELEASE_PREFIX:
12277       return "xrelease";
12278     case BND_PREFIX:
12279       return "bnd";
12280     default:
12281       return NULL;
12282     }
12283 }
12284
12285 static char op_out[MAX_OPERANDS][100];
12286 static int op_ad, op_index[MAX_OPERANDS];
12287 static int two_source_ops;
12288 static bfd_vma op_address[MAX_OPERANDS];
12289 static bfd_vma op_riprel[MAX_OPERANDS];
12290 static bfd_vma start_pc;
12291
12292 /*
12293  *   On the 386's of 1988, the maximum length of an instruction is 15 bytes.
12294  *   (see topic "Redundant prefixes" in the "Differences from 8086"
12295  *   section of the "Virtual 8086 Mode" chapter.)
12296  * 'pc' should be the address of this instruction, it will
12297  *   be used to print the target address if this is a relative jump or call
12298  * The function returns the length of this instruction in bytes.
12299  */
12300
12301 static char intel_syntax;
12302 static char intel_mnemonic = !SYSV386_COMPAT;
12303 static char open_char;
12304 static char close_char;
12305 static char separator_char;
12306 static char scale_char;
12307
12308 /* Here for backwards compatibility.  When gdb stops using
12309    print_insn_i386_att and print_insn_i386_intel these functions can
12310    disappear, and print_insn_i386 be merged into print_insn.  */
12311 int
12312 print_insn_i386_att (bfd_vma pc, disassemble_info *info)
12313 {
12314   intel_syntax = 0;
12315
12316   return print_insn (pc, info);
12317 }
12318
12319 int
12320 print_insn_i386_intel (bfd_vma pc, disassemble_info *info)
12321 {
12322   intel_syntax = 1;
12323
12324   return print_insn (pc, info);
12325 }
12326
12327 int
12328 print_insn_i386 (bfd_vma pc, disassemble_info *info)
12329 {
12330   intel_syntax = -1;
12331
12332   return print_insn (pc, info);
12333 }
12334
12335 void
12336 print_i386_disassembler_options (FILE *stream)
12337 {
12338   fprintf (stream, _("\n\
12339 The following i386/x86-64 specific disassembler options are supported for use\n\
12340 with the -M switch (multiple options should be separated by commas):\n"));
12341
12342   fprintf (stream, _("  x86-64      Disassemble in 64bit mode\n"));
12343   fprintf (stream, _("  i386        Disassemble in 32bit mode\n"));
12344   fprintf (stream, _("  i8086       Disassemble in 16bit mode\n"));
12345   fprintf (stream, _("  att         Display instruction in AT&T syntax\n"));
12346   fprintf (stream, _("  intel       Display instruction in Intel syntax\n"));
12347   fprintf (stream, _("  att-mnemonic\n"
12348                      "              Display instruction in AT&T mnemonic\n"));
12349   fprintf (stream, _("  intel-mnemonic\n"
12350                      "              Display instruction in Intel mnemonic\n"));
12351   fprintf (stream, _("  addr64      Assume 64bit address size\n"));
12352   fprintf (stream, _("  addr32      Assume 32bit address size\n"));
12353   fprintf (stream, _("  addr16      Assume 16bit address size\n"));
12354   fprintf (stream, _("  data32      Assume 32bit data size\n"));
12355   fprintf (stream, _("  data16      Assume 16bit data size\n"));
12356   fprintf (stream, _("  suffix      Always display instruction suffix in AT&T syntax\n"));
12357 }
12358
12359 /* Bad opcode.  */
12360 static const struct dis386 bad_opcode = { "(bad)", { XX }, 0 };
12361
12362 /* Get a pointer to struct dis386 with a valid name.  */
12363
12364 static const struct dis386 *
12365 get_valid_dis386 (const struct dis386 *dp, disassemble_info *info)
12366 {
12367   int vindex, vex_table_index;
12368
12369   if (dp->name != NULL)
12370     return dp;
12371
12372   switch (dp->op[0].bytemode)
12373     {
12374     case USE_REG_TABLE:
12375       dp = &reg_table[dp->op[1].bytemode][modrm.reg];
12376       break;
12377
12378     case USE_MOD_TABLE:
12379       vindex = modrm.mod == 0x3 ? 1 : 0;
12380       dp = &mod_table[dp->op[1].bytemode][vindex];
12381       break;
12382
12383     case USE_RM_TABLE:
12384       dp = &rm_table[dp->op[1].bytemode][modrm.rm];
12385       break;
12386
12387     case USE_PREFIX_TABLE:
12388       if (need_vex)
12389         {
12390           /* The prefix in VEX is implicit.  */
12391           switch (vex.prefix)
12392             {
12393             case 0:
12394               vindex = 0;
12395               break;
12396             case REPE_PREFIX_OPCODE:
12397               vindex = 1;
12398               break;
12399             case DATA_PREFIX_OPCODE:
12400               vindex = 2;
12401               break;
12402             case REPNE_PREFIX_OPCODE:
12403               vindex = 3;
12404               break;
12405             default:
12406               abort ();
12407               break;
12408             }
12409         }
12410       else
12411         {
12412           int last_prefix = -1;
12413           int prefix = 0;
12414           vindex = 0;
12415           /* We check PREFIX_REPNZ and PREFIX_REPZ before PREFIX_DATA.
12416              When there are multiple PREFIX_REPNZ and PREFIX_REPZ, the
12417              last one wins.  */
12418           if ((prefixes & (PREFIX_REPZ | PREFIX_REPNZ)) != 0)
12419             {
12420               if (last_repz_prefix > last_repnz_prefix)
12421                 {
12422                   vindex = 1;
12423                   prefix = PREFIX_REPZ;
12424                   last_prefix = last_repz_prefix;
12425                 }
12426               else
12427                 {
12428                   vindex = 3;
12429                   prefix = PREFIX_REPNZ;
12430                   last_prefix = last_repnz_prefix;
12431                 }
12432
12433               /* Ignore the invalid index if it isn't mandatory.  */
12434               if (!mandatory_prefix
12435                   && (prefix_table[dp->op[1].bytemode][vindex].name
12436                       == NULL)
12437                   && (prefix_table[dp->op[1].bytemode][vindex].op[0].bytemode
12438                       == 0))
12439                 vindex = 0;
12440             }
12441
12442           if (vindex == 0 && (prefixes & PREFIX_DATA) != 0)
12443             {
12444               vindex = 2;
12445               prefix = PREFIX_DATA;
12446               last_prefix = last_data_prefix;
12447             }
12448
12449           if (vindex != 0)
12450             {
12451               used_prefixes |= prefix;
12452               all_prefixes[last_prefix] = 0;
12453             }
12454         }
12455       dp = &prefix_table[dp->op[1].bytemode][vindex];
12456       break;
12457
12458     case USE_X86_64_TABLE:
12459       vindex = address_mode == mode_64bit ? 1 : 0;
12460       dp = &x86_64_table[dp->op[1].bytemode][vindex];
12461       break;
12462
12463     case USE_3BYTE_TABLE:
12464       FETCH_DATA (info, codep + 2);
12465       vindex = *codep++;
12466       dp = &three_byte_table[dp->op[1].bytemode][vindex];
12467       end_codep = codep;
12468       modrm.mod = (*codep >> 6) & 3;
12469       modrm.reg = (*codep >> 3) & 7;
12470       modrm.rm = *codep & 7;
12471       break;
12472
12473     case USE_VEX_LEN_TABLE:
12474       if (!need_vex)
12475         abort ();
12476
12477       switch (vex.length)
12478         {
12479         case 128:
12480           vindex = 0;
12481           break;
12482         case 256:
12483           vindex = 1;
12484           break;
12485         default:
12486           abort ();
12487           break;
12488         }
12489
12490       dp = &vex_len_table[dp->op[1].bytemode][vindex];
12491       break;
12492
12493     case USE_XOP_8F_TABLE:
12494       FETCH_DATA (info, codep + 3);
12495       /* All bits in the REX prefix are ignored.  */
12496       rex_ignored = rex;
12497       rex = ~(*codep >> 5) & 0x7;
12498
12499       /* VEX_TABLE_INDEX is the mmmmm part of the XOP byte 1 "RCB.mmmmm".  */
12500       switch ((*codep & 0x1f))
12501         {
12502         default:
12503           dp = &bad_opcode;
12504           return dp;
12505         case 0x8:
12506           vex_table_index = XOP_08;
12507           break;
12508         case 0x9:
12509           vex_table_index = XOP_09;
12510           break;
12511         case 0xa:
12512           vex_table_index = XOP_0A;
12513           break;
12514         }
12515       codep++;
12516       vex.w = *codep & 0x80;
12517       if (vex.w && address_mode == mode_64bit)
12518         rex |= REX_W;
12519
12520       vex.register_specifier = (~(*codep >> 3)) & 0xf;
12521       if (address_mode != mode_64bit
12522           && vex.register_specifier > 0x7)
12523         {
12524           dp = &bad_opcode;
12525           return dp;
12526         }
12527
12528       vex.length = (*codep & 0x4) ? 256 : 128;
12529       switch ((*codep & 0x3))
12530         {
12531         case 0:
12532           vex.prefix = 0;
12533           break;
12534         case 1:
12535           vex.prefix = DATA_PREFIX_OPCODE;
12536           break;
12537         case 2:
12538           vex.prefix = REPE_PREFIX_OPCODE;
12539           break;
12540         case 3:
12541           vex.prefix = REPNE_PREFIX_OPCODE;
12542           break;
12543         }
12544       need_vex = 1;
12545       need_vex_reg = 1;
12546       codep++;
12547       vindex = *codep++;
12548       dp = &xop_table[vex_table_index][vindex];
12549
12550       end_codep = codep;
12551       FETCH_DATA (info, codep + 1);
12552       modrm.mod = (*codep >> 6) & 3;
12553       modrm.reg = (*codep >> 3) & 7;
12554       modrm.rm = *codep & 7;
12555       break;
12556
12557     case USE_VEX_C4_TABLE:
12558       /* VEX prefix.  */
12559       FETCH_DATA (info, codep + 3);
12560       /* All bits in the REX prefix are ignored.  */
12561       rex_ignored = rex;
12562       rex = ~(*codep >> 5) & 0x7;
12563       switch ((*codep & 0x1f))
12564         {
12565         default:
12566           dp = &bad_opcode;
12567           return dp;
12568         case 0x1:
12569           vex_table_index = VEX_0F;
12570           break;
12571         case 0x2:
12572           vex_table_index = VEX_0F38;
12573           break;
12574         case 0x3:
12575           vex_table_index = VEX_0F3A;
12576           break;
12577         }
12578       codep++;
12579       vex.w = *codep & 0x80;
12580       if (vex.w && address_mode == mode_64bit)
12581         rex |= REX_W;
12582
12583       vex.register_specifier = (~(*codep >> 3)) & 0xf;
12584       if (address_mode != mode_64bit
12585           && vex.register_specifier > 0x7)
12586         {
12587           dp = &bad_opcode;
12588           return dp;
12589         }
12590
12591       vex.length = (*codep & 0x4) ? 256 : 128;
12592       switch ((*codep & 0x3))
12593         {
12594         case 0:
12595           vex.prefix = 0;
12596           break;
12597         case 1:
12598           vex.prefix = DATA_PREFIX_OPCODE;
12599           break;
12600         case 2:
12601           vex.prefix = REPE_PREFIX_OPCODE;
12602           break;
12603         case 3:
12604           vex.prefix = REPNE_PREFIX_OPCODE;
12605           break;
12606         }
12607       need_vex = 1;
12608       need_vex_reg = 1;
12609       codep++;
12610       vindex = *codep++;
12611       dp = &vex_table[vex_table_index][vindex];
12612       end_codep = codep;
12613       /* There is no MODRM byte for VEX [82|77].  */
12614       if (vindex != 0x77 && vindex != 0x82)
12615         {
12616           FETCH_DATA (info, codep + 1);
12617           modrm.mod = (*codep >> 6) & 3;
12618           modrm.reg = (*codep >> 3) & 7;
12619           modrm.rm = *codep & 7;
12620         }
12621       break;
12622
12623     case USE_VEX_C5_TABLE:
12624       /* VEX prefix.  */
12625       FETCH_DATA (info, codep + 2);
12626       /* All bits in the REX prefix are ignored.  */
12627       rex_ignored = rex;
12628       rex = (*codep & 0x80) ? 0 : REX_R;
12629
12630       vex.register_specifier = (~(*codep >> 3)) & 0xf;
12631       if (address_mode != mode_64bit
12632           && vex.register_specifier > 0x7)
12633         {
12634           dp = &bad_opcode;
12635           return dp;
12636         }
12637
12638       vex.w = 0;
12639
12640       vex.length = (*codep & 0x4) ? 256 : 128;
12641       switch ((*codep & 0x3))
12642         {
12643         case 0:
12644           vex.prefix = 0;
12645           break;
12646         case 1:
12647           vex.prefix = DATA_PREFIX_OPCODE;
12648           break;
12649         case 2:
12650           vex.prefix = REPE_PREFIX_OPCODE;
12651           break;
12652         case 3:
12653           vex.prefix = REPNE_PREFIX_OPCODE;
12654           break;
12655         }
12656       need_vex = 1;
12657       need_vex_reg = 1;
12658       codep++;
12659       vindex = *codep++;
12660       dp = &vex_table[dp->op[1].bytemode][vindex];
12661       end_codep = codep;
12662       /* There is no MODRM byte for VEX [82|77].  */
12663       if (vindex != 0x77 && vindex != 0x82)
12664         {
12665           FETCH_DATA (info, codep + 1);
12666           modrm.mod = (*codep >> 6) & 3;
12667           modrm.reg = (*codep >> 3) & 7;
12668           modrm.rm = *codep & 7;
12669         }
12670       break;
12671
12672     case USE_VEX_W_TABLE:
12673       if (!need_vex)
12674         abort ();
12675
12676       dp = &vex_w_table[dp->op[1].bytemode][vex.w ? 1 : 0];
12677       break;
12678
12679     case USE_EVEX_TABLE:
12680       two_source_ops = 0;
12681       /* EVEX prefix.  */
12682       vex.evex = 1;
12683       FETCH_DATA (info, codep + 4);
12684       /* All bits in the REX prefix are ignored.  */
12685       rex_ignored = rex;
12686       /* The first byte after 0x62.  */
12687       rex = ~(*codep >> 5) & 0x7;
12688       vex.r = *codep & 0x10;
12689       switch ((*codep & 0xf))
12690         {
12691         default:
12692           return &bad_opcode;
12693         case 0x1:
12694           vex_table_index = EVEX_0F;
12695           break;
12696         case 0x2:
12697           vex_table_index = EVEX_0F38;
12698           break;
12699         case 0x3:
12700           vex_table_index = EVEX_0F3A;
12701           break;
12702         }
12703
12704       /* The second byte after 0x62.  */
12705       codep++;
12706       vex.w = *codep & 0x80;
12707       if (vex.w && address_mode == mode_64bit)
12708         rex |= REX_W;
12709
12710       vex.register_specifier = (~(*codep >> 3)) & 0xf;
12711       if (address_mode != mode_64bit)
12712         {
12713           /* In 16/32-bit mode silently ignore following bits.  */
12714           rex &= ~REX_B;
12715           vex.r = 1;
12716           vex.v = 1;
12717           vex.register_specifier &= 0x7;
12718         }
12719
12720       /* The U bit.  */
12721       if (!(*codep & 0x4))
12722         return &bad_opcode;
12723
12724       switch ((*codep & 0x3))
12725         {
12726         case 0:
12727           vex.prefix = 0;
12728           break;
12729         case 1:
12730           vex.prefix = DATA_PREFIX_OPCODE;
12731           break;
12732         case 2:
12733           vex.prefix = REPE_PREFIX_OPCODE;
12734           break;
12735         case 3:
12736           vex.prefix = REPNE_PREFIX_OPCODE;
12737           break;
12738         }
12739
12740       /* The third byte after 0x62.  */
12741       codep++;
12742
12743       /* Remember the static rounding bits.  */
12744       vex.ll = (*codep >> 5) & 3;
12745       vex.b = (*codep & 0x10) != 0;
12746
12747       vex.v = *codep & 0x8;
12748       vex.mask_register_specifier = *codep & 0x7;
12749       vex.zeroing = *codep & 0x80;
12750
12751       need_vex = 1;
12752       need_vex_reg = 1;
12753       codep++;
12754       vindex = *codep++;
12755       dp = &evex_table[vex_table_index][vindex];
12756       end_codep = codep;
12757       FETCH_DATA (info, codep + 1);
12758       modrm.mod = (*codep >> 6) & 3;
12759       modrm.reg = (*codep >> 3) & 7;
12760       modrm.rm = *codep & 7;
12761
12762       /* Set vector length.  */
12763       if (modrm.mod == 3 && vex.b)
12764         vex.length = 512;
12765       else
12766         {
12767           switch (vex.ll)
12768             {
12769             case 0x0:
12770               vex.length = 128;
12771               break;
12772             case 0x1:
12773               vex.length = 256;
12774               break;
12775             case 0x2:
12776               vex.length = 512;
12777               break;
12778             default:
12779               return &bad_opcode;
12780             }
12781         }
12782       break;
12783
12784     case 0:
12785       dp = &bad_opcode;
12786       break;
12787
12788     default:
12789       abort ();
12790     }
12791
12792   if (dp->name != NULL)
12793     return dp;
12794   else
12795     return get_valid_dis386 (dp, info);
12796 }
12797
12798 static void
12799 get_sib (disassemble_info *info, int sizeflag)
12800 {
12801   /* If modrm.mod == 3, operand must be register.  */
12802   if (need_modrm
12803       && ((sizeflag & AFLAG) || address_mode == mode_64bit)
12804       && modrm.mod != 3
12805       && modrm.rm == 4)
12806     {
12807       FETCH_DATA (info, codep + 2);
12808       sib.index = (codep [1] >> 3) & 7;
12809       sib.scale = (codep [1] >> 6) & 3;
12810       sib.base = codep [1] & 7;
12811     }
12812 }
12813
12814 static int
12815 print_insn (bfd_vma pc, disassemble_info *info)
12816 {
12817   const struct dis386 *dp;
12818   int i;
12819   char *op_txt[MAX_OPERANDS];
12820   int needcomma;
12821   int sizeflag, orig_sizeflag;
12822   const char *p;
12823   struct dis_private priv;
12824   int prefix_length;
12825
12826   priv.orig_sizeflag = AFLAG | DFLAG;
12827   if ((info->mach & bfd_mach_i386_i386) != 0)
12828     address_mode = mode_32bit;
12829   else if (info->mach == bfd_mach_i386_i8086)
12830     {
12831       address_mode = mode_16bit;
12832       priv.orig_sizeflag = 0;
12833     }
12834   else
12835     address_mode = mode_64bit;
12836
12837   if (intel_syntax == (char) -1)
12838     intel_syntax = (info->mach & bfd_mach_i386_intel_syntax) != 0;
12839
12840   for (p = info->disassembler_options; p != NULL; )
12841     {
12842       if (CONST_STRNEQ (p, "x86-64"))
12843         {
12844           address_mode = mode_64bit;
12845           priv.orig_sizeflag = AFLAG | DFLAG;
12846         }
12847       else if (CONST_STRNEQ (p, "i386"))
12848         {
12849           address_mode = mode_32bit;
12850           priv.orig_sizeflag = AFLAG | DFLAG;
12851         }
12852       else if (CONST_STRNEQ (p, "i8086"))
12853         {
12854           address_mode = mode_16bit;
12855           priv.orig_sizeflag = 0;
12856         }
12857       else if (CONST_STRNEQ (p, "intel"))
12858         {
12859           intel_syntax = 1;
12860           if (CONST_STRNEQ (p + 5, "-mnemonic"))
12861             intel_mnemonic = 1;
12862         }
12863       else if (CONST_STRNEQ (p, "att"))
12864         {
12865           intel_syntax = 0;
12866           if (CONST_STRNEQ (p + 3, "-mnemonic"))
12867             intel_mnemonic = 0;
12868         }
12869       else if (CONST_STRNEQ (p, "addr"))
12870         {
12871           if (address_mode == mode_64bit)
12872             {
12873               if (p[4] == '3' && p[5] == '2')
12874                 priv.orig_sizeflag &= ~AFLAG;
12875               else if (p[4] == '6' && p[5] == '4')
12876                 priv.orig_sizeflag |= AFLAG;
12877             }
12878           else
12879             {
12880               if (p[4] == '1' && p[5] == '6')
12881                 priv.orig_sizeflag &= ~AFLAG;
12882               else if (p[4] == '3' && p[5] == '2')
12883                 priv.orig_sizeflag |= AFLAG;
12884             }
12885         }
12886       else if (CONST_STRNEQ (p, "data"))
12887         {
12888           if (p[4] == '1' && p[5] == '6')
12889             priv.orig_sizeflag &= ~DFLAG;
12890           else if (p[4] == '3' && p[5] == '2')
12891             priv.orig_sizeflag |= DFLAG;
12892         }
12893       else if (CONST_STRNEQ (p, "suffix"))
12894         priv.orig_sizeflag |= SUFFIX_ALWAYS;
12895
12896       p = strchr (p, ',');
12897       if (p != NULL)
12898         p++;
12899     }
12900
12901   if (intel_syntax)
12902     {
12903       names64 = intel_names64;
12904       names32 = intel_names32;
12905       names16 = intel_names16;
12906       names8 = intel_names8;
12907       names8rex = intel_names8rex;
12908       names_seg = intel_names_seg;
12909       names_mm = intel_names_mm;
12910       names_bnd = intel_names_bnd;
12911       names_xmm = intel_names_xmm;
12912       names_ymm = intel_names_ymm;
12913       names_zmm = intel_names_zmm;
12914       index64 = intel_index64;
12915       index32 = intel_index32;
12916       names_mask = intel_names_mask;
12917       index16 = intel_index16;
12918       open_char = '[';
12919       close_char = ']';
12920       separator_char = '+';
12921       scale_char = '*';
12922     }
12923   else
12924     {
12925       names64 = att_names64;
12926       names32 = att_names32;
12927       names16 = att_names16;
12928       names8 = att_names8;
12929       names8rex = att_names8rex;
12930       names_seg = att_names_seg;
12931       names_mm = att_names_mm;
12932       names_bnd = att_names_bnd;
12933       names_xmm = att_names_xmm;
12934       names_ymm = att_names_ymm;
12935       names_zmm = att_names_zmm;
12936       index64 = att_index64;
12937       index32 = att_index32;
12938       names_mask = att_names_mask;
12939       index16 = att_index16;
12940       open_char = '(';
12941       close_char =  ')';
12942       separator_char = ',';
12943       scale_char = ',';
12944     }
12945
12946   /* The output looks better if we put 7 bytes on a line, since that
12947      puts most long word instructions on a single line.  Use 8 bytes
12948      for Intel L1OM.  */
12949   if ((info->mach & bfd_mach_l1om) != 0)
12950     info->bytes_per_line = 8;
12951   else
12952     info->bytes_per_line = 7;
12953
12954   info->private_data = &priv;
12955   priv.max_fetched = priv.the_buffer;
12956   priv.insn_start = pc;
12957
12958   obuf[0] = 0;
12959   for (i = 0; i < MAX_OPERANDS; ++i)
12960     {
12961       op_out[i][0] = 0;
12962       op_index[i] = -1;
12963     }
12964
12965   the_info = info;
12966   start_pc = pc;
12967   start_codep = priv.the_buffer;
12968   codep = priv.the_buffer;
12969
12970   if (OPCODES_SIGSETJMP (priv.bailout) != 0)
12971     {
12972       const char *name;
12973
12974       /* Getting here means we tried for data but didn't get it.  That
12975          means we have an incomplete instruction of some sort.  Just
12976          print the first byte as a prefix or a .byte pseudo-op.  */
12977       if (codep > priv.the_buffer)
12978         {
12979           name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
12980           if (name != NULL)
12981             (*info->fprintf_func) (info->stream, "%s", name);
12982           else
12983             {
12984               /* Just print the first byte as a .byte instruction.  */
12985               (*info->fprintf_func) (info->stream, ".byte 0x%x",
12986                                      (unsigned int) priv.the_buffer[0]);
12987             }
12988
12989           return 1;
12990         }
12991
12992       return -1;
12993     }
12994
12995   obufp = obuf;
12996   sizeflag = priv.orig_sizeflag;
12997
12998   if (!ckprefix () || rex_used)
12999     {
13000       /* Too many prefixes or unused REX prefixes.  */
13001       for (i = 0;
13002            i < (int) ARRAY_SIZE (all_prefixes) && all_prefixes[i];
13003            i++)
13004         (*info->fprintf_func) (info->stream, "%s%s",
13005                                i == 0 ? "" : " ",
13006                                prefix_name (all_prefixes[i], sizeflag));
13007       return i;
13008     }
13009
13010   insn_codep = codep;
13011
13012   FETCH_DATA (info, codep + 1);
13013   two_source_ops = (*codep == 0x62) || (*codep == 0xc8);
13014
13015   if (((prefixes & PREFIX_FWAIT)
13016        && ((*codep < 0xd8) || (*codep > 0xdf))))
13017     {
13018       /* Handle prefixes before fwait.  */
13019       for (i = 0; i < fwait_prefix && all_prefixes[i];
13020            i++)
13021         (*info->fprintf_func) (info->stream, "%s ",
13022                                prefix_name (all_prefixes[i], sizeflag));
13023       (*info->fprintf_func) (info->stream, "fwait");
13024       return i + 1;
13025     }
13026
13027   if (*codep == 0x0f)
13028     {
13029       unsigned char threebyte;
13030       FETCH_DATA (info, codep + 2);
13031       threebyte = *++codep;
13032       dp = &dis386_twobyte[threebyte];
13033       need_modrm = twobyte_has_modrm[*codep];
13034       mandatory_prefix = dp->prefix_requirement;
13035       codep++;
13036     }
13037   else
13038     {
13039       dp = &dis386[*codep];
13040       need_modrm = onebyte_has_modrm[*codep];
13041       mandatory_prefix = 0;
13042       codep++;
13043     }
13044
13045   /* Save sizeflag for printing the extra prefixes later before updating
13046      it for mnemonic and operand processing.  The prefix names depend
13047      only on the address mode.  */
13048   orig_sizeflag = sizeflag;
13049   if (prefixes & PREFIX_ADDR)
13050     sizeflag ^= AFLAG;
13051   if ((prefixes & PREFIX_DATA))
13052     sizeflag ^= DFLAG;
13053
13054   end_codep = codep;
13055   if (need_modrm)
13056     {
13057       FETCH_DATA (info, codep + 1);
13058       modrm.mod = (*codep >> 6) & 3;
13059       modrm.reg = (*codep >> 3) & 7;
13060       modrm.rm = *codep & 7;
13061     }
13062
13063   need_vex = 0;
13064   need_vex_reg = 0;
13065   vex_w_done = 0;
13066   vex.evex = 0;
13067
13068   if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE)
13069     {
13070       get_sib (info, sizeflag);
13071       dofloat (sizeflag);
13072     }
13073   else
13074     {
13075       dp = get_valid_dis386 (dp, info);
13076       if (dp != NULL && putop (dp->name, sizeflag) == 0)
13077         {
13078           get_sib (info, sizeflag);
13079           for (i = 0; i < MAX_OPERANDS; ++i)
13080             {
13081               obufp = op_out[i];
13082               op_ad = MAX_OPERANDS - 1 - i;
13083               if (dp->op[i].rtn)
13084                 (*dp->op[i].rtn) (dp->op[i].bytemode, sizeflag);
13085               /* For EVEX instruction after the last operand masking
13086                  should be printed.  */
13087               if (i == 0 && vex.evex)
13088                 {
13089                   /* Don't print {%k0}.  */
13090                   if (vex.mask_register_specifier)
13091                     {
13092                       oappend ("{");
13093                       oappend (names_mask[vex.mask_register_specifier]);
13094                       oappend ("}");
13095                     }
13096                   if (vex.zeroing)
13097                     oappend ("{z}");
13098                 }
13099             }
13100         }
13101     }
13102
13103   /* Check if the REX prefix is used.  */
13104   if (rex_ignored == 0 && (rex ^ rex_used) == 0 && last_rex_prefix >= 0)
13105     all_prefixes[last_rex_prefix] = 0;
13106
13107   /* Check if the SEG prefix is used.  */
13108   if ((prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS | PREFIX_ES
13109                    | PREFIX_FS | PREFIX_GS)) != 0
13110       && (used_prefixes & active_seg_prefix) != 0)
13111     all_prefixes[last_seg_prefix] = 0;
13112
13113   /* Check if the ADDR prefix is used.  */
13114   if ((prefixes & PREFIX_ADDR) != 0
13115       && (used_prefixes & PREFIX_ADDR) != 0)
13116     all_prefixes[last_addr_prefix] = 0;
13117
13118   /* Check if the DATA prefix is used.  */
13119   if ((prefixes & PREFIX_DATA) != 0
13120       && (used_prefixes & PREFIX_DATA) != 0)
13121     all_prefixes[last_data_prefix] = 0;
13122
13123   /* Print the extra prefixes.  */
13124   prefix_length = 0;
13125   for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
13126     if (all_prefixes[i])
13127       {
13128         const char *name;
13129         name = prefix_name (all_prefixes[i], orig_sizeflag);
13130         if (name == NULL)
13131           abort ();
13132         prefix_length += strlen (name) + 1;
13133         (*info->fprintf_func) (info->stream, "%s ", name);
13134       }
13135
13136   /* If the mandatory PREFIX_REPZ/PREFIX_REPNZ/PREFIX_DATA prefix is
13137      unused, opcode is invalid.  Since the PREFIX_DATA prefix may be
13138      used by putop and MMX/SSE operand and may be overriden by the
13139      PREFIX_REPZ/PREFIX_REPNZ fix, we check the PREFIX_DATA prefix
13140      separately.  */
13141   /* TODO we should check which prefix is mandatory.  */
13142   if (mandatory_prefix
13143       && dp != &bad_opcode
13144       && (((prefixes
13145             & (PREFIX_REPZ | PREFIX_REPNZ)) != 0
13146            && (used_prefixes
13147                & (PREFIX_REPZ | PREFIX_REPNZ)) == 0)
13148           || ((((prefixes
13149                  & (PREFIX_REPZ | PREFIX_REPNZ | PREFIX_DATA))
13150                 == PREFIX_DATA)
13151                && (used_prefixes & PREFIX_DATA) == 0))))
13152     {
13153       (*info->fprintf_func) (info->stream, "(bad)");
13154       return end_codep - priv.the_buffer;
13155     }
13156
13157   /* Check maximum code length.  */
13158   if ((codep - start_codep) > MAX_CODE_LENGTH)
13159     {
13160       (*info->fprintf_func) (info->stream, "(bad)");
13161       return MAX_CODE_LENGTH;
13162     }
13163
13164   obufp = mnemonicendp;
13165   for (i = strlen (obuf) + prefix_length; i < 6; i++)
13166     oappend (" ");
13167   oappend (" ");
13168   (*info->fprintf_func) (info->stream, "%s", obuf);
13169
13170   /* The enter and bound instructions are printed with operands in the same
13171      order as the intel book; everything else is printed in reverse order.  */
13172   if (intel_syntax || two_source_ops)
13173     {
13174       bfd_vma riprel;
13175
13176       for (i = 0; i < MAX_OPERANDS; ++i)
13177         op_txt[i] = op_out[i];
13178
13179       for (i = 0; i < (MAX_OPERANDS >> 1); ++i)
13180         {
13181           op_ad = op_index[i];
13182           op_index[i] = op_index[MAX_OPERANDS - 1 - i];
13183           op_index[MAX_OPERANDS - 1 - i] = op_ad;
13184           riprel = op_riprel[i];
13185           op_riprel[i] = op_riprel [MAX_OPERANDS - 1 - i];
13186           op_riprel[MAX_OPERANDS - 1 - i] = riprel;
13187         }
13188     }
13189   else
13190     {
13191       for (i = 0; i < MAX_OPERANDS; ++i)
13192         op_txt[MAX_OPERANDS - 1 - i] = op_out[i];
13193     }
13194
13195   needcomma = 0;
13196   for (i = 0; i < MAX_OPERANDS; ++i)
13197     if (*op_txt[i])
13198       {
13199         if (needcomma)
13200           (*info->fprintf_func) (info->stream, ",");
13201         if (op_index[i] != -1 && !op_riprel[i])
13202           (*info->print_address_func) ((bfd_vma) op_address[op_index[i]], info);
13203         else
13204           (*info->fprintf_func) (info->stream, "%s", op_txt[i]);
13205         needcomma = 1;
13206       }
13207
13208   for (i = 0; i < MAX_OPERANDS; i++)
13209     if (op_index[i] != -1 && op_riprel[i])
13210       {
13211         (*info->fprintf_func) (info->stream, "        # ");
13212         (*info->print_address_func) ((bfd_vma) (start_pc + codep - start_codep
13213                                                 + op_address[op_index[i]]), info);
13214         break;
13215       }
13216   return codep - priv.the_buffer;
13217 }
13218
13219 static const char *float_mem[] = {
13220   /* d8 */
13221   "fadd{s|}",
13222   "fmul{s|}",
13223   "fcom{s|}",
13224   "fcomp{s|}",
13225   "fsub{s|}",
13226   "fsubr{s|}",
13227   "fdiv{s|}",
13228   "fdivr{s|}",
13229   /* d9 */
13230   "fld{s|}",
13231   "(bad)",
13232   "fst{s|}",
13233   "fstp{s|}",
13234   "fldenvIC",
13235   "fldcw",
13236   "fNstenvIC",
13237   "fNstcw",
13238   /* da */
13239   "fiadd{l|}",
13240   "fimul{l|}",
13241   "ficom{l|}",
13242   "ficomp{l|}",
13243   "fisub{l|}",
13244   "fisubr{l|}",
13245   "fidiv{l|}",
13246   "fidivr{l|}",
13247   /* db */
13248   "fild{l|}",
13249   "fisttp{l|}",
13250   "fist{l|}",
13251   "fistp{l|}",
13252   "(bad)",
13253   "fld{t||t|}",
13254   "(bad)",
13255   "fstp{t||t|}",
13256   /* dc */
13257   "fadd{l|}",
13258   "fmul{l|}",
13259   "fcom{l|}",
13260   "fcomp{l|}",
13261   "fsub{l|}",
13262   "fsubr{l|}",
13263   "fdiv{l|}",
13264   "fdivr{l|}",
13265   /* dd */
13266   "fld{l|}",
13267   "fisttp{ll|}",
13268   "fst{l||}",
13269   "fstp{l|}",
13270   "frstorIC",
13271   "(bad)",
13272   "fNsaveIC",
13273   "fNstsw",
13274   /* de */
13275   "fiadd",
13276   "fimul",
13277   "ficom",
13278   "ficomp",
13279   "fisub",
13280   "fisubr",
13281   "fidiv",
13282   "fidivr",
13283   /* df */
13284   "fild",
13285   "fisttp",
13286   "fist",
13287   "fistp",
13288   "fbld",
13289   "fild{ll|}",
13290   "fbstp",
13291   "fistp{ll|}",
13292 };
13293
13294 static const unsigned char float_mem_mode[] = {
13295   /* d8 */
13296   d_mode,
13297   d_mode,
13298   d_mode,
13299   d_mode,
13300   d_mode,
13301   d_mode,
13302   d_mode,
13303   d_mode,
13304   /* d9 */
13305   d_mode,
13306   0,
13307   d_mode,
13308   d_mode,
13309   0,
13310   w_mode,
13311   0,
13312   w_mode,
13313   /* da */
13314   d_mode,
13315   d_mode,
13316   d_mode,
13317   d_mode,
13318   d_mode,
13319   d_mode,
13320   d_mode,
13321   d_mode,
13322   /* db */
13323   d_mode,
13324   d_mode,
13325   d_mode,
13326   d_mode,
13327   0,
13328   t_mode,
13329   0,
13330   t_mode,
13331   /* dc */
13332   q_mode,
13333   q_mode,
13334   q_mode,
13335   q_mode,
13336   q_mode,
13337   q_mode,
13338   q_mode,
13339   q_mode,
13340   /* dd */
13341   q_mode,
13342   q_mode,
13343   q_mode,
13344   q_mode,
13345   0,
13346   0,
13347   0,
13348   w_mode,
13349   /* de */
13350   w_mode,
13351   w_mode,
13352   w_mode,
13353   w_mode,
13354   w_mode,
13355   w_mode,
13356   w_mode,
13357   w_mode,
13358   /* df */
13359   w_mode,
13360   w_mode,
13361   w_mode,
13362   w_mode,
13363   t_mode,
13364   q_mode,
13365   t_mode,
13366   q_mode
13367 };
13368
13369 #define ST { OP_ST, 0 }
13370 #define STi { OP_STi, 0 }
13371
13372 #define FGRPd9_2 NULL, { { NULL, 0 } }, 0
13373 #define FGRPd9_4 NULL, { { NULL, 1 } }, 0
13374 #define FGRPd9_5 NULL, { { NULL, 2 } }, 0
13375 #define FGRPd9_6 NULL, { { NULL, 3 } }, 0
13376 #define FGRPd9_7 NULL, { { NULL, 4 } }, 0
13377 #define FGRPda_5 NULL, { { NULL, 5 } }, 0
13378 #define FGRPdb_4 NULL, { { NULL, 6 } }, 0
13379 #define FGRPde_3 NULL, { { NULL, 7 } }, 0
13380 #define FGRPdf_4 NULL, { { NULL, 8 } }, 0
13381
13382 static const struct dis386 float_reg[][8] = {
13383   /* d8 */
13384   {
13385     { "fadd",   { ST, STi }, 0 },
13386     { "fmul",   { ST, STi }, 0 },
13387     { "fcom",   { STi }, 0 },
13388     { "fcomp",  { STi }, 0 },
13389     { "fsub",   { ST, STi }, 0 },
13390     { "fsubr",  { ST, STi }, 0 },
13391     { "fdiv",   { ST, STi }, 0 },
13392     { "fdivr",  { ST, STi }, 0 },
13393   },
13394   /* d9 */
13395   {
13396     { "fld",    { STi }, 0 },
13397     { "fxch",   { STi }, 0 },
13398     { FGRPd9_2 },
13399     { Bad_Opcode },
13400     { FGRPd9_4 },
13401     { FGRPd9_5 },
13402     { FGRPd9_6 },
13403     { FGRPd9_7 },
13404   },
13405   /* da */
13406   {
13407     { "fcmovb", { ST, STi }, 0 },
13408     { "fcmove", { ST, STi }, 0 },
13409     { "fcmovbe",{ ST, STi }, 0 },
13410     { "fcmovu", { ST, STi }, 0 },
13411     { Bad_Opcode },
13412     { FGRPda_5 },
13413     { Bad_Opcode },
13414     { Bad_Opcode },
13415   },
13416   /* db */
13417   {
13418     { "fcmovnb",{ ST, STi }, 0 },
13419     { "fcmovne",{ ST, STi }, 0 },
13420     { "fcmovnbe",{ ST, STi }, 0 },
13421     { "fcmovnu",{ ST, STi }, 0 },
13422     { FGRPdb_4 },
13423     { "fucomi", { ST, STi }, 0 },
13424     { "fcomi",  { ST, STi }, 0 },
13425     { Bad_Opcode },
13426   },
13427   /* dc */
13428   {
13429     { "fadd",   { STi, ST }, 0 },
13430     { "fmul",   { STi, ST }, 0 },
13431     { Bad_Opcode },
13432     { Bad_Opcode },
13433     { "fsub!M", { STi, ST }, 0 },
13434     { "fsubM",  { STi, ST }, 0 },
13435     { "fdiv!M", { STi, ST }, 0 },
13436     { "fdivM",  { STi, ST }, 0 },
13437   },
13438   /* dd */
13439   {
13440     { "ffree",  { STi }, 0 },
13441     { Bad_Opcode },
13442     { "fst",    { STi }, 0 },
13443     { "fstp",   { STi }, 0 },
13444     { "fucom",  { STi }, 0 },
13445     { "fucomp", { STi }, 0 },
13446     { Bad_Opcode },
13447     { Bad_Opcode },
13448   },
13449   /* de */
13450   {
13451     { "faddp",  { STi, ST }, 0 },
13452     { "fmulp",  { STi, ST }, 0 },
13453     { Bad_Opcode },
13454     { FGRPde_3 },
13455     { "fsub!Mp", { STi, ST }, 0 },
13456     { "fsubMp", { STi, ST }, 0 },
13457     { "fdiv!Mp", { STi, ST }, 0 },
13458     { "fdivMp", { STi, ST }, 0 },
13459   },
13460   /* df */
13461   {
13462     { "ffreep", { STi }, 0 },
13463     { Bad_Opcode },
13464     { Bad_Opcode },
13465     { Bad_Opcode },
13466     { FGRPdf_4 },
13467     { "fucomip", { ST, STi }, 0 },
13468     { "fcomip", { ST, STi }, 0 },
13469     { Bad_Opcode },
13470   },
13471 };
13472
13473 static char *fgrps[][8] = {
13474   /* d9_2  0 */
13475   {
13476     "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
13477   },
13478
13479   /* d9_4  1 */
13480   {
13481     "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
13482   },
13483
13484   /* d9_5  2 */
13485   {
13486     "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
13487   },
13488
13489   /* d9_6  3 */
13490   {
13491     "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
13492   },
13493
13494   /* d9_7  4 */
13495   {
13496     "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
13497   },
13498
13499   /* da_5  5 */
13500   {
13501     "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
13502   },
13503
13504   /* db_4  6 */
13505   {
13506     "fNeni(8087 only)","fNdisi(8087 only)","fNclex","fNinit",
13507     "fNsetpm(287 only)","frstpm(287 only)","(bad)","(bad)",
13508   },
13509
13510   /* de_3  7 */
13511   {
13512     "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
13513   },
13514
13515   /* df_4  8 */
13516   {
13517     "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
13518   },
13519 };
13520
13521 static void
13522 swap_operand (void)
13523 {
13524   mnemonicendp[0] = '.';
13525   mnemonicendp[1] = 's';
13526   mnemonicendp += 2;
13527 }
13528
13529 static void
13530 OP_Skip_MODRM (int bytemode ATTRIBUTE_UNUSED,
13531                int sizeflag ATTRIBUTE_UNUSED)
13532 {
13533   /* Skip mod/rm byte.  */
13534   MODRM_CHECK;
13535   codep++;
13536 }
13537
13538 static void
13539 dofloat (int sizeflag)
13540 {
13541   const struct dis386 *dp;
13542   unsigned char floatop;
13543
13544   floatop = codep[-1];
13545
13546   if (modrm.mod != 3)
13547     {
13548       int fp_indx = (floatop - 0xd8) * 8 + modrm.reg;
13549
13550       putop (float_mem[fp_indx], sizeflag);
13551       obufp = op_out[0];
13552       op_ad = 2;
13553       OP_E (float_mem_mode[fp_indx], sizeflag);
13554       return;
13555     }
13556   /* Skip mod/rm byte.  */
13557   MODRM_CHECK;
13558   codep++;
13559
13560   dp = &float_reg[floatop - 0xd8][modrm.reg];
13561   if (dp->name == NULL)
13562     {
13563       putop (fgrps[dp->op[0].bytemode][modrm.rm], sizeflag);
13564
13565       /* Instruction fnstsw is only one with strange arg.  */
13566       if (floatop == 0xdf && codep[-1] == 0xe0)
13567         strcpy (op_out[0], names16[0]);
13568     }
13569   else
13570     {
13571       putop (dp->name, sizeflag);
13572
13573       obufp = op_out[0];
13574       op_ad = 2;
13575       if (dp->op[0].rtn)
13576         (*dp->op[0].rtn) (dp->op[0].bytemode, sizeflag);
13577
13578       obufp = op_out[1];
13579       op_ad = 1;
13580       if (dp->op[1].rtn)
13581         (*dp->op[1].rtn) (dp->op[1].bytemode, sizeflag);
13582     }
13583 }
13584
13585 /* Like oappend (below), but S is a string starting with '%'.
13586    In Intel syntax, the '%' is elided.  */
13587 static void
13588 oappend_maybe_intel (const char *s)
13589 {
13590   oappend (s + intel_syntax);
13591 }
13592
13593 static void
13594 OP_ST (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13595 {
13596   oappend_maybe_intel ("%st");
13597 }
13598
13599 static void
13600 OP_STi (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13601 {
13602   sprintf (scratchbuf, "%%st(%d)", modrm.rm);
13603   oappend_maybe_intel (scratchbuf);
13604 }
13605
13606 /* Capital letters in template are macros.  */
13607 static int
13608 putop (const char *in_template, int sizeflag)
13609 {
13610   const char *p;
13611   int alt = 0;
13612   int cond = 1;
13613   unsigned int l = 0, len = 1;
13614   char last[4];
13615
13616 #define SAVE_LAST(c)                    \
13617   if (l < len && l < sizeof (last))     \
13618     last[l++] = c;                      \
13619   else                                  \
13620     abort ();
13621
13622   for (p = in_template; *p; p++)
13623     {
13624       switch (*p)
13625         {
13626         default:
13627           *obufp++ = *p;
13628           break;
13629         case '%':
13630           len++;
13631           break;
13632         case '!':
13633           cond = 0;
13634           break;
13635         case '{':
13636           alt = 0;
13637           if (intel_syntax)
13638             {
13639               while (*++p != '|')
13640                 if (*p == '}' || *p == '\0')
13641                   abort ();
13642             }
13643           /* Fall through.  */
13644         case 'I':
13645           alt = 1;
13646           continue;
13647         case '|':
13648           while (*++p != '}')
13649             {
13650               if (*p == '\0')
13651                 abort ();
13652             }
13653           break;
13654         case '}':
13655           break;
13656         case 'A':
13657           if (intel_syntax)
13658             break;
13659           if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
13660             *obufp++ = 'b';
13661           break;
13662         case 'B':
13663           if (l == 0 && len == 1)
13664             {
13665 case_B:
13666               if (intel_syntax)
13667                 break;
13668               if (sizeflag & SUFFIX_ALWAYS)
13669                 *obufp++ = 'b';
13670             }
13671           else
13672             {
13673               if (l != 1
13674                   || len != 2
13675                   || last[0] != 'L')
13676                 {
13677                   SAVE_LAST (*p);
13678                   break;
13679                 }
13680
13681               if (address_mode == mode_64bit
13682                   && !(prefixes & PREFIX_ADDR))
13683                 {
13684                   *obufp++ = 'a';
13685                   *obufp++ = 'b';
13686                   *obufp++ = 's';
13687                 }
13688
13689               goto case_B;
13690             }
13691           break;
13692         case 'C':
13693           if (intel_syntax && !alt)
13694             break;
13695           if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
13696             {
13697               if (sizeflag & DFLAG)
13698                 *obufp++ = intel_syntax ? 'd' : 'l';
13699               else
13700                 *obufp++ = intel_syntax ? 'w' : 's';
13701               used_prefixes |= (prefixes & PREFIX_DATA);
13702             }
13703           break;
13704         case 'D':
13705           if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
13706             break;
13707           USED_REX (REX_W);
13708           if (modrm.mod == 3)
13709             {
13710               if (rex & REX_W)
13711                 *obufp++ = 'q';
13712               else
13713                 {
13714                   if (sizeflag & DFLAG)
13715                     *obufp++ = intel_syntax ? 'd' : 'l';
13716                   else
13717                     *obufp++ = 'w';
13718                   used_prefixes |= (prefixes & PREFIX_DATA);
13719                 }
13720             }
13721           else
13722             *obufp++ = 'w';
13723           break;
13724         case 'E':               /* For jcxz/jecxz */
13725           if (address_mode == mode_64bit)
13726             {
13727               if (sizeflag & AFLAG)
13728                 *obufp++ = 'r';
13729               else
13730                 *obufp++ = 'e';
13731             }
13732           else
13733             if (sizeflag & AFLAG)
13734               *obufp++ = 'e';
13735           used_prefixes |= (prefixes & PREFIX_ADDR);
13736           break;
13737         case 'F':
13738           if (intel_syntax)
13739             break;
13740           if ((prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS))
13741             {
13742               if (sizeflag & AFLAG)
13743                 *obufp++ = address_mode == mode_64bit ? 'q' : 'l';
13744               else
13745                 *obufp++ = address_mode == mode_64bit ? 'l' : 'w';
13746               used_prefixes |= (prefixes & PREFIX_ADDR);
13747             }
13748           break;
13749         case 'G':
13750           if (intel_syntax || (obufp[-1] != 's' && !(sizeflag & SUFFIX_ALWAYS)))
13751             break;
13752           if ((rex & REX_W) || (sizeflag & DFLAG))
13753             *obufp++ = 'l';
13754           else
13755             *obufp++ = 'w';
13756           if (!(rex & REX_W))
13757             used_prefixes |= (prefixes & PREFIX_DATA);
13758           break;
13759         case 'H':
13760           if (intel_syntax)
13761             break;
13762           if ((prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS
13763               || (prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS)
13764             {
13765               used_prefixes |= prefixes & (PREFIX_CS | PREFIX_DS);
13766               *obufp++ = ',';
13767               *obufp++ = 'p';
13768               if (prefixes & PREFIX_DS)
13769                 *obufp++ = 't';
13770               else
13771                 *obufp++ = 'n';
13772             }
13773           break;
13774         case 'J':
13775           if (intel_syntax)
13776             break;
13777           *obufp++ = 'l';
13778           break;
13779         case 'K':
13780           USED_REX (REX_W);
13781           if (rex & REX_W)
13782             *obufp++ = 'q';
13783           else
13784             *obufp++ = 'd';
13785           break;
13786         case 'Z':
13787           if (intel_syntax)
13788             break;
13789           if (address_mode == mode_64bit && (sizeflag & SUFFIX_ALWAYS))
13790             {
13791               *obufp++ = 'q';
13792               break;
13793             }
13794           /* Fall through.  */
13795           goto case_L;
13796         case 'L':
13797           if (l != 0 || len != 1)
13798             {
13799               SAVE_LAST (*p);
13800               break;
13801             }
13802 case_L:
13803           if (intel_syntax)
13804             break;
13805           if (sizeflag & SUFFIX_ALWAYS)
13806             *obufp++ = 'l';
13807           break;
13808         case 'M':
13809           if (intel_mnemonic != cond)
13810             *obufp++ = 'r';
13811           break;
13812         case 'N':
13813           if ((prefixes & PREFIX_FWAIT) == 0)
13814             *obufp++ = 'n';
13815           else
13816             used_prefixes |= PREFIX_FWAIT;
13817           break;
13818         case 'O':
13819           USED_REX (REX_W);
13820           if (rex & REX_W)
13821             *obufp++ = 'o';
13822           else if (intel_syntax && (sizeflag & DFLAG))
13823             *obufp++ = 'q';
13824           else
13825             *obufp++ = 'd';
13826           if (!(rex & REX_W))
13827             used_prefixes |= (prefixes & PREFIX_DATA);
13828           break;
13829         case 'T':
13830           if (!intel_syntax
13831               && address_mode == mode_64bit
13832               && ((sizeflag & DFLAG) || (rex & REX_W)))
13833             {
13834               *obufp++ = 'q';
13835               break;
13836             }
13837           /* Fall through.  */
13838           goto case_P;
13839         case 'P':
13840           if (l == 0 && len == 1)
13841             {
13842 case_P:
13843               if (intel_syntax)
13844                 {
13845                   if ((rex & REX_W) == 0
13846                       && (prefixes & PREFIX_DATA))
13847                     {
13848                       if ((sizeflag & DFLAG) == 0)
13849                         *obufp++ = 'w';
13850                       used_prefixes |= (prefixes & PREFIX_DATA);
13851                     }
13852                   break;
13853                 }
13854               if ((prefixes & PREFIX_DATA)
13855                   || (rex & REX_W)
13856                   || (sizeflag & SUFFIX_ALWAYS))
13857                 {
13858                   USED_REX (REX_W);
13859                   if (rex & REX_W)
13860                     *obufp++ = 'q';
13861                   else
13862                     {
13863                       if (sizeflag & DFLAG)
13864                         *obufp++ = 'l';
13865                       else
13866                         *obufp++ = 'w';
13867                       used_prefixes |= (prefixes & PREFIX_DATA);
13868                     }
13869                 }
13870             }
13871           else
13872             {
13873               if (l != 1 || len != 2 || last[0] != 'L')
13874                 {
13875                   SAVE_LAST (*p);
13876                   break;
13877                 }
13878
13879               if ((prefixes & PREFIX_DATA)
13880                   || (rex & REX_W)
13881                   || (sizeflag & SUFFIX_ALWAYS))
13882                 {
13883                   USED_REX (REX_W);
13884                   if (rex & REX_W)
13885                     *obufp++ = 'q';
13886                   else
13887                     {
13888                       if (sizeflag & DFLAG)
13889                         *obufp++ = intel_syntax ? 'd' : 'l';
13890                       else
13891                         *obufp++ = 'w';
13892                       used_prefixes |= (prefixes & PREFIX_DATA);
13893                     }
13894                 }
13895             }
13896           break;
13897         case 'U':
13898           if (intel_syntax)
13899             break;
13900           if (address_mode == mode_64bit
13901               && ((sizeflag & DFLAG) || (rex & REX_W)))
13902             {
13903               if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
13904                 *obufp++ = 'q';
13905               break;
13906             }
13907           /* Fall through.  */
13908           goto case_Q;
13909         case 'Q':
13910           if (l == 0 && len == 1)
13911             {
13912 case_Q:
13913               if (intel_syntax && !alt)
13914                 break;
13915               USED_REX (REX_W);
13916               if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
13917                 {
13918                   if (rex & REX_W)
13919                     *obufp++ = 'q';
13920                   else
13921                     {
13922                       if (sizeflag & DFLAG)
13923                         *obufp++ = intel_syntax ? 'd' : 'l';
13924                       else
13925                         *obufp++ = 'w';
13926                       used_prefixes |= (prefixes & PREFIX_DATA);
13927                     }
13928                 }
13929             }
13930           else
13931             {
13932               if (l != 1 || len != 2 || last[0] != 'L')
13933                 {
13934                   SAVE_LAST (*p);
13935                   break;
13936                 }
13937               if (intel_syntax
13938                   || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
13939                 break;
13940               if ((rex & REX_W))
13941                 {
13942                   USED_REX (REX_W);
13943                   *obufp++ = 'q';
13944                 }
13945               else
13946                 *obufp++ = 'l';
13947             }
13948           break;
13949         case 'R':
13950           USED_REX (REX_W);
13951           if (rex & REX_W)
13952             *obufp++ = 'q';
13953           else if (sizeflag & DFLAG)
13954             {
13955               if (intel_syntax)
13956                   *obufp++ = 'd';
13957               else
13958                   *obufp++ = 'l';
13959             }
13960           else
13961             *obufp++ = 'w';
13962           if (intel_syntax && !p[1]
13963               && ((rex & REX_W) || (sizeflag & DFLAG)))
13964             *obufp++ = 'e';
13965           if (!(rex & REX_W))
13966             used_prefixes |= (prefixes & PREFIX_DATA);
13967           break;
13968         case 'V':
13969           if (l == 0 && len == 1)
13970             {
13971               if (intel_syntax)
13972                 break;
13973               if (address_mode == mode_64bit
13974                   && ((sizeflag & DFLAG) || (rex & REX_W)))
13975                 {
13976                   if (sizeflag & SUFFIX_ALWAYS)
13977                     *obufp++ = 'q';
13978                   break;
13979                 }
13980             }
13981           else
13982             {
13983               if (l != 1
13984                   || len != 2
13985                   || last[0] != 'L')
13986                 {
13987                   SAVE_LAST (*p);
13988                   break;
13989                 }
13990
13991               if (rex & REX_W)
13992                 {
13993                   *obufp++ = 'a';
13994                   *obufp++ = 'b';
13995                   *obufp++ = 's';
13996                 }
13997             }
13998           /* Fall through.  */
13999           goto case_S;
14000         case 'S':
14001           if (l == 0 && len == 1)
14002             {
14003 case_S:
14004               if (intel_syntax)
14005                 break;
14006               if (sizeflag & SUFFIX_ALWAYS)
14007                 {
14008                   if (rex & REX_W)
14009                     *obufp++ = 'q';
14010                   else
14011                     {
14012                       if (sizeflag & DFLAG)
14013                         *obufp++ = 'l';
14014                       else
14015                         *obufp++ = 'w';
14016                       used_prefixes |= (prefixes & PREFIX_DATA);
14017                     }
14018                 }
14019             }
14020           else
14021             {
14022               if (l != 1
14023                   || len != 2
14024                   || last[0] != 'L')
14025                 {
14026                   SAVE_LAST (*p);
14027                   break;
14028                 }
14029
14030               if (address_mode == mode_64bit
14031                   && !(prefixes & PREFIX_ADDR))
14032                 {
14033                   *obufp++ = 'a';
14034                   *obufp++ = 'b';
14035                   *obufp++ = 's';
14036                 }
14037
14038               goto case_S;
14039             }
14040           break;
14041         case 'X':
14042           if (l != 0 || len != 1)
14043             {
14044               SAVE_LAST (*p);
14045               break;
14046             }
14047           if (need_vex && vex.prefix)
14048             {
14049               if (vex.prefix == DATA_PREFIX_OPCODE)
14050                 *obufp++ = 'd';
14051               else
14052                 *obufp++ = 's';
14053             }
14054           else
14055             {
14056               if (prefixes & PREFIX_DATA)
14057                 *obufp++ = 'd';
14058               else
14059                 *obufp++ = 's';
14060               used_prefixes |= (prefixes & PREFIX_DATA);
14061             }
14062           break;
14063         case 'Y':
14064           if (l == 0 && len == 1)
14065             {
14066               if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
14067                 break;
14068               if (rex & REX_W)
14069                 {
14070                   USED_REX (REX_W);
14071                   *obufp++ = 'q';
14072                 }
14073               break;
14074             }
14075           else
14076             {
14077               if (l != 1 || len != 2 || last[0] != 'X')
14078                 {
14079                   SAVE_LAST (*p);
14080                   break;
14081                 }
14082               if (!need_vex)
14083                 abort ();
14084               if (intel_syntax
14085                   || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
14086                 break;
14087               switch (vex.length)
14088                 {
14089                 case 128:
14090                   *obufp++ = 'x';
14091                   break;
14092                 case 256:
14093                   *obufp++ = 'y';
14094                   break;
14095                 default:
14096                   abort ();
14097                 }
14098             }
14099           break;
14100         case 'W':
14101           if (l == 0 && len == 1)
14102             {
14103               /* operand size flag for cwtl, cbtw */
14104               USED_REX (REX_W);
14105               if (rex & REX_W)
14106                 {
14107                   if (intel_syntax)
14108                     *obufp++ = 'd';
14109                   else
14110                     *obufp++ = 'l';
14111                 }
14112               else if (sizeflag & DFLAG)
14113                 *obufp++ = 'w';
14114               else
14115                 *obufp++ = 'b';
14116               if (!(rex & REX_W))
14117                 used_prefixes |= (prefixes & PREFIX_DATA);
14118             }
14119           else
14120             {
14121               if (l != 1
14122                   || len != 2
14123                   || (last[0] != 'X'
14124                       && last[0] != 'L'))
14125                 {
14126                   SAVE_LAST (*p);
14127                   break;
14128                 }
14129               if (!need_vex)
14130                 abort ();
14131               if (last[0] == 'X')
14132                 *obufp++ = vex.w ? 'd': 's';
14133               else
14134                 *obufp++ = vex.w ? 'q': 'd';
14135             }
14136           break;
14137         }
14138       alt = 0;
14139     }
14140   *obufp = 0;
14141   mnemonicendp = obufp;
14142   return 0;
14143 }
14144
14145 static void
14146 oappend (const char *s)
14147 {
14148   obufp = stpcpy (obufp, s);
14149 }
14150
14151 static void
14152 append_seg (void)
14153 {
14154   /* Only print the active segment register.  */
14155   if (!active_seg_prefix)
14156     return;
14157
14158   used_prefixes |= active_seg_prefix;
14159   switch (active_seg_prefix)
14160     {
14161     case PREFIX_CS:
14162       oappend_maybe_intel ("%cs:");
14163       break;
14164     case PREFIX_DS:
14165       oappend_maybe_intel ("%ds:");
14166       break;
14167     case PREFIX_SS:
14168       oappend_maybe_intel ("%ss:");
14169       break;
14170     case PREFIX_ES:
14171       oappend_maybe_intel ("%es:");
14172       break;
14173     case PREFIX_FS:
14174       oappend_maybe_intel ("%fs:");
14175       break;
14176     case PREFIX_GS:
14177       oappend_maybe_intel ("%gs:");
14178       break;
14179     default:
14180       break;
14181     }
14182 }
14183
14184 static void
14185 OP_indirE (int bytemode, int sizeflag)
14186 {
14187   if (!intel_syntax)
14188     oappend ("*");
14189   OP_E (bytemode, sizeflag);
14190 }
14191
14192 static void
14193 print_operand_value (char *buf, int hex, bfd_vma disp)
14194 {
14195   if (address_mode == mode_64bit)
14196     {
14197       if (hex)
14198         {
14199           char tmp[30];
14200           int i;
14201           buf[0] = '0';
14202           buf[1] = 'x';
14203           sprintf_vma (tmp, disp);
14204           for (i = 0; tmp[i] == '0' && tmp[i + 1]; i++);
14205           strcpy (buf + 2, tmp + i);
14206         }
14207       else
14208         {
14209           bfd_signed_vma v = disp;
14210           char tmp[30];
14211           int i;
14212           if (v < 0)
14213             {
14214               *(buf++) = '-';
14215               v = -disp;
14216               /* Check for possible overflow on 0x8000000000000000.  */
14217               if (v < 0)
14218                 {
14219                   strcpy (buf, "9223372036854775808");
14220                   return;
14221                 }
14222             }
14223           if (!v)
14224             {
14225               strcpy (buf, "0");
14226               return;
14227             }
14228
14229           i = 0;
14230           tmp[29] = 0;
14231           while (v)
14232             {
14233               tmp[28 - i] = (v % 10) + '0';
14234               v /= 10;
14235               i++;
14236             }
14237           strcpy (buf, tmp + 29 - i);
14238         }
14239     }
14240   else
14241     {
14242       if (hex)
14243         sprintf (buf, "0x%x", (unsigned int) disp);
14244       else
14245         sprintf (buf, "%d", (int) disp);
14246     }
14247 }
14248
14249 /* Put DISP in BUF as signed hex number.  */
14250
14251 static void
14252 print_displacement (char *buf, bfd_vma disp)
14253 {
14254   bfd_signed_vma val = disp;
14255   char tmp[30];
14256   int i, j = 0;
14257
14258   if (val < 0)
14259     {
14260       buf[j++] = '-';
14261       val = -disp;
14262
14263       /* Check for possible overflow.  */
14264       if (val < 0)
14265         {
14266           switch (address_mode)
14267             {
14268             case mode_64bit:
14269               strcpy (buf + j, "0x8000000000000000");
14270               break;
14271             case mode_32bit:
14272               strcpy (buf + j, "0x80000000");
14273               break;
14274             case mode_16bit:
14275               strcpy (buf + j, "0x8000");
14276               break;
14277             }
14278           return;
14279         }
14280     }
14281
14282   buf[j++] = '0';
14283   buf[j++] = 'x';
14284
14285   sprintf_vma (tmp, (bfd_vma) val);
14286   for (i = 0; tmp[i] == '0'; i++)
14287     continue;
14288   if (tmp[i] == '\0')
14289     i--;
14290   strcpy (buf + j, tmp + i);
14291 }
14292
14293 static void
14294 intel_operand_size (int bytemode, int sizeflag)
14295 {
14296   if (vex.evex
14297       && vex.b
14298       && (bytemode == x_mode
14299           || bytemode == evex_half_bcst_xmmq_mode))
14300     {
14301       if (vex.w)
14302         oappend ("QWORD PTR ");
14303       else
14304         oappend ("DWORD PTR ");
14305       return;
14306     }
14307   switch (bytemode)
14308     {
14309     case b_mode:
14310     case b_swap_mode:
14311     case dqb_mode:
14312     case db_mode:
14313       oappend ("BYTE PTR ");
14314       break;
14315     case w_mode:
14316     case dw_mode:
14317     case dqw_mode:
14318     case dqw_swap_mode:
14319       oappend ("WORD PTR ");
14320       break;
14321     case stack_v_mode:
14322       if (address_mode == mode_64bit && ((sizeflag & DFLAG) || (rex & REX_W)))
14323         {
14324           oappend ("QWORD PTR ");
14325           break;
14326         }
14327       /* FALLTHRU */
14328     case v_mode:
14329     case v_swap_mode:
14330     case dq_mode:
14331       USED_REX (REX_W);
14332       if (rex & REX_W)
14333         oappend ("QWORD PTR ");
14334       else
14335         {
14336           if ((sizeflag & DFLAG) || bytemode == dq_mode)
14337             oappend ("DWORD PTR ");
14338           else
14339             oappend ("WORD PTR ");
14340           used_prefixes |= (prefixes & PREFIX_DATA);
14341         }
14342       break;
14343     case z_mode:
14344       if ((rex & REX_W) || (sizeflag & DFLAG))
14345         *obufp++ = 'D';
14346       oappend ("WORD PTR ");
14347       if (!(rex & REX_W))
14348         used_prefixes |= (prefixes & PREFIX_DATA);
14349       break;
14350     case a_mode:
14351       if (sizeflag & DFLAG)
14352         oappend ("QWORD PTR ");
14353       else
14354         oappend ("DWORD PTR ");
14355       used_prefixes |= (prefixes & PREFIX_DATA);
14356       break;
14357     case d_mode:
14358     case d_scalar_mode:
14359     case d_scalar_swap_mode:
14360     case d_swap_mode:
14361     case dqd_mode:
14362       oappend ("DWORD PTR ");
14363       break;
14364     case q_mode:
14365     case q_scalar_mode:
14366     case q_scalar_swap_mode:
14367     case q_swap_mode:
14368       oappend ("QWORD PTR ");
14369       break;
14370     case m_mode:
14371       if (address_mode == mode_64bit)
14372         oappend ("QWORD PTR ");
14373       else
14374         oappend ("DWORD PTR ");
14375       break;
14376     case f_mode:
14377       if (sizeflag & DFLAG)
14378         oappend ("FWORD PTR ");
14379       else
14380         oappend ("DWORD PTR ");
14381       used_prefixes |= (prefixes & PREFIX_DATA);
14382       break;
14383     case t_mode:
14384       oappend ("TBYTE PTR ");
14385       break;
14386     case x_mode:
14387     case x_swap_mode:
14388     case evex_x_gscat_mode:
14389     case evex_x_nobcst_mode:
14390       if (need_vex)
14391         {
14392           switch (vex.length)
14393             {
14394             case 128:
14395               oappend ("XMMWORD PTR ");
14396               break;
14397             case 256:
14398               oappend ("YMMWORD PTR ");
14399               break;
14400             case 512:
14401               oappend ("ZMMWORD PTR ");
14402               break;
14403             default:
14404               abort ();
14405             }
14406         }
14407       else
14408         oappend ("XMMWORD PTR ");
14409       break;
14410     case xmm_mode:
14411       oappend ("XMMWORD PTR ");
14412       break;
14413     case ymm_mode:
14414       oappend ("YMMWORD PTR ");
14415       break;
14416     case xmmq_mode:
14417     case evex_half_bcst_xmmq_mode:
14418       if (!need_vex)
14419         abort ();
14420
14421       switch (vex.length)
14422         {
14423         case 128:
14424           oappend ("QWORD PTR ");
14425           break;
14426         case 256:
14427           oappend ("XMMWORD PTR ");
14428           break;
14429         case 512:
14430           oappend ("YMMWORD PTR ");
14431           break;
14432         default:
14433           abort ();
14434         }
14435       break;
14436     case xmm_mb_mode:
14437       if (!need_vex)
14438         abort ();
14439
14440       switch (vex.length)
14441         {
14442         case 128:
14443         case 256:
14444         case 512:
14445           oappend ("BYTE PTR ");
14446           break;
14447         default:
14448           abort ();
14449         }
14450       break;
14451     case xmm_mw_mode:
14452       if (!need_vex)
14453         abort ();
14454
14455       switch (vex.length)
14456         {
14457         case 128:
14458         case 256:
14459         case 512:
14460           oappend ("WORD PTR ");
14461           break;
14462         default:
14463           abort ();
14464         }
14465       break;
14466     case xmm_md_mode:
14467       if (!need_vex)
14468         abort ();
14469
14470       switch (vex.length)
14471         {
14472         case 128:
14473         case 256:
14474         case 512:
14475           oappend ("DWORD PTR ");
14476           break;
14477         default:
14478           abort ();
14479         }
14480       break;
14481     case xmm_mq_mode:
14482       if (!need_vex)
14483         abort ();
14484
14485       switch (vex.length)
14486         {
14487         case 128:
14488         case 256:
14489         case 512:
14490           oappend ("QWORD PTR ");
14491           break;
14492         default:
14493           abort ();
14494         }
14495       break;
14496     case xmmdw_mode:
14497       if (!need_vex)
14498         abort ();
14499
14500       switch (vex.length)
14501         {
14502         case 128:
14503           oappend ("WORD PTR ");
14504           break;
14505         case 256:
14506           oappend ("DWORD PTR ");
14507           break;
14508         case 512:
14509           oappend ("QWORD PTR ");
14510           break;
14511         default:
14512           abort ();
14513         }
14514       break;
14515     case xmmqd_mode:
14516       if (!need_vex)
14517         abort ();
14518
14519       switch (vex.length)
14520         {
14521         case 128:
14522           oappend ("DWORD PTR ");
14523           break;
14524         case 256:
14525           oappend ("QWORD PTR ");
14526           break;
14527         case 512:
14528           oappend ("XMMWORD PTR ");
14529           break;
14530         default:
14531           abort ();
14532         }
14533       break;
14534     case ymmq_mode:
14535       if (!need_vex)
14536         abort ();
14537
14538       switch (vex.length)
14539         {
14540         case 128:
14541           oappend ("QWORD PTR ");
14542           break;
14543         case 256:
14544           oappend ("YMMWORD PTR ");
14545           break;
14546         case 512:
14547           oappend ("ZMMWORD PTR ");
14548           break;
14549         default:
14550           abort ();
14551         }
14552       break;
14553     case ymmxmm_mode:
14554       if (!need_vex)
14555         abort ();
14556
14557       switch (vex.length)
14558         {
14559         case 128:
14560         case 256:
14561           oappend ("XMMWORD PTR ");
14562           break;
14563         default:
14564           abort ();
14565         }
14566       break;
14567     case o_mode:
14568       oappend ("OWORD PTR ");
14569       break;
14570     case xmm_mdq_mode:
14571     case vex_w_dq_mode:
14572     case vex_scalar_w_dq_mode:
14573       if (!need_vex)
14574         abort ();
14575
14576       if (vex.w)
14577         oappend ("QWORD PTR ");
14578       else
14579         oappend ("DWORD PTR ");
14580       break;
14581     case vex_vsib_d_w_dq_mode:
14582     case vex_vsib_q_w_dq_mode:
14583       if (!need_vex)
14584         abort ();
14585
14586       if (!vex.evex)
14587         {
14588           if (vex.w)
14589             oappend ("QWORD PTR ");
14590           else
14591             oappend ("DWORD PTR ");
14592         }
14593       else
14594         {
14595           switch (vex.length)
14596             {
14597             case 128:
14598               oappend ("XMMWORD PTR ");
14599               break;
14600             case 256:
14601               oappend ("YMMWORD PTR ");
14602               break;
14603             case 512:
14604               oappend ("ZMMWORD PTR ");
14605               break;
14606             default:
14607               abort ();
14608             }
14609         }
14610       break;
14611     case vex_vsib_q_w_d_mode:
14612     case vex_vsib_d_w_d_mode:
14613       if (!need_vex || !vex.evex)
14614         abort ();
14615
14616       switch (vex.length)
14617         {
14618         case 128:
14619           oappend ("QWORD PTR ");
14620           break;
14621         case 256:
14622           oappend ("XMMWORD PTR ");
14623           break;
14624         case 512:
14625           oappend ("YMMWORD PTR ");
14626           break;
14627         default:
14628           abort ();
14629         }
14630
14631       break;
14632     case mask_bd_mode:
14633       if (!need_vex || vex.length != 128)
14634         abort ();
14635       if (vex.w)
14636         oappend ("DWORD PTR ");
14637       else
14638         oappend ("BYTE PTR ");
14639       break;
14640     case mask_mode:
14641       if (!need_vex)
14642         abort ();
14643       if (vex.w)
14644         oappend ("QWORD PTR ");
14645       else
14646         oappend ("WORD PTR ");
14647       break;
14648     case v_bnd_mode:
14649     default:
14650       break;
14651     }
14652 }
14653
14654 static void
14655 OP_E_register (int bytemode, int sizeflag)
14656 {
14657   int reg = modrm.rm;
14658   const char **names;
14659
14660   USED_REX (REX_B);
14661   if ((rex & REX_B))
14662     reg += 8;
14663
14664   if ((sizeflag & SUFFIX_ALWAYS)
14665       && (bytemode == b_swap_mode
14666           || bytemode == v_swap_mode
14667           || bytemode == dqw_swap_mode))
14668     swap_operand ();
14669
14670   switch (bytemode)
14671     {
14672     case b_mode:
14673     case b_swap_mode:
14674       USED_REX (0);
14675       if (rex)
14676         names = names8rex;
14677       else
14678         names = names8;
14679       break;
14680     case w_mode:
14681       names = names16;
14682       break;
14683     case d_mode:
14684     case dw_mode:
14685     case db_mode:
14686       names = names32;
14687       break;
14688     case q_mode:
14689       names = names64;
14690       break;
14691     case m_mode:
14692     case v_bnd_mode:
14693       names = address_mode == mode_64bit ? names64 : names32;
14694       break;
14695     case bnd_mode:
14696       names = names_bnd;
14697       break;
14698     case stack_v_mode:
14699       if (address_mode == mode_64bit && ((sizeflag & DFLAG) || (rex & REX_W)))
14700         {
14701           names = names64;
14702           break;
14703         }
14704       bytemode = v_mode;
14705       /* FALLTHRU */
14706     case v_mode:
14707     case v_swap_mode:
14708     case dq_mode:
14709     case dqb_mode:
14710     case dqd_mode:
14711     case dqw_mode:
14712     case dqw_swap_mode:
14713       USED_REX (REX_W);
14714       if (rex & REX_W)
14715         names = names64;
14716       else
14717         {
14718           if ((sizeflag & DFLAG)
14719               || (bytemode != v_mode
14720                   && bytemode != v_swap_mode))
14721             names = names32;
14722           else
14723             names = names16;
14724           used_prefixes |= (prefixes & PREFIX_DATA);
14725         }
14726       break;
14727     case mask_bd_mode:
14728     case mask_mode:
14729       names = names_mask;
14730       break;
14731     case 0:
14732       return;
14733     default:
14734       oappend (INTERNAL_DISASSEMBLER_ERROR);
14735       return;
14736     }
14737   oappend (names[reg]);
14738 }
14739
14740 static void
14741 OP_E_memory (int bytemode, int sizeflag)
14742 {
14743   bfd_vma disp = 0;
14744   int add = (rex & REX_B) ? 8 : 0;
14745   int riprel = 0;
14746   int shift;
14747
14748   if (vex.evex)
14749     {
14750       /* In EVEX, if operand doesn't allow broadcast, vex.b should be 0.  */
14751       if (vex.b
14752           && bytemode != x_mode
14753           && bytemode != xmmq_mode
14754           && bytemode != evex_half_bcst_xmmq_mode)
14755         {
14756           BadOp ();
14757           return;
14758         }
14759       switch (bytemode)
14760         {
14761         case dqw_mode:
14762         case dw_mode:
14763         case dqw_swap_mode:
14764           shift = 1;
14765           break;
14766         case dqb_mode:
14767         case db_mode:
14768           shift = 0;
14769           break;
14770         case vex_vsib_d_w_dq_mode:
14771         case vex_vsib_d_w_d_mode:
14772         case vex_vsib_q_w_dq_mode:
14773         case vex_vsib_q_w_d_mode:
14774         case evex_x_gscat_mode:
14775         case xmm_mdq_mode:
14776           shift = vex.w ? 3 : 2;
14777           break;
14778         case x_mode:
14779         case evex_half_bcst_xmmq_mode:
14780         case xmmq_mode:
14781           if (vex.b)
14782             {
14783               shift = vex.w ? 3 : 2;
14784               break;
14785             }
14786           /* Fall through if vex.b == 0.  */
14787         case xmmqd_mode:
14788         case xmmdw_mode:
14789         case ymmq_mode:
14790         case evex_x_nobcst_mode:
14791         case x_swap_mode:
14792           switch (vex.length)
14793             {
14794             case 128:
14795               shift = 4;
14796               break;
14797             case 256:
14798               shift = 5;
14799               break;
14800             case 512:
14801               shift = 6;
14802               break;
14803             default:
14804               abort ();
14805             }
14806           break;
14807         case ymm_mode:
14808           shift = 5;
14809           break;
14810         case xmm_mode:
14811           shift = 4;
14812           break;
14813         case xmm_mq_mode:
14814         case q_mode:
14815         case q_scalar_mode:
14816         case q_swap_mode:
14817         case q_scalar_swap_mode:
14818           shift = 3;
14819           break;
14820         case dqd_mode:
14821         case xmm_md_mode:
14822         case d_mode:
14823         case d_scalar_mode:
14824         case d_swap_mode:
14825         case d_scalar_swap_mode:
14826           shift = 2;
14827           break;
14828         case xmm_mw_mode:
14829           shift = 1;
14830           break;
14831         case xmm_mb_mode:
14832           shift = 0;
14833           break;
14834         default:
14835           abort ();
14836         }
14837       /* Make necessary corrections to shift for modes that need it.
14838          For these modes we currently have shift 4, 5 or 6 depending on
14839          vex.length (it corresponds to xmmword, ymmword or zmmword
14840          operand).  We might want to make it 3, 4 or 5 (e.g. for
14841          xmmq_mode).  In case of broadcast enabled the corrections
14842          aren't needed, as element size is always 32 or 64 bits.  */
14843       if (!vex.b
14844           && (bytemode == xmmq_mode
14845               || bytemode == evex_half_bcst_xmmq_mode))
14846         shift -= 1;
14847       else if (bytemode == xmmqd_mode)
14848         shift -= 2;
14849       else if (bytemode == xmmdw_mode)
14850         shift -= 3;
14851       else if (bytemode == ymmq_mode && vex.length == 128)
14852         shift -= 1;
14853     }
14854   else
14855     shift = 0;
14856
14857   USED_REX (REX_B);
14858   if (intel_syntax)
14859     intel_operand_size (bytemode, sizeflag);
14860   append_seg ();
14861
14862   if ((sizeflag & AFLAG) || address_mode == mode_64bit)
14863     {
14864       /* 32/64 bit address mode */
14865       int havedisp;
14866       int havesib;
14867       int havebase;
14868       int haveindex;
14869       int needindex;
14870       int base, rbase;
14871       int vindex = 0;
14872       int scale = 0;
14873       int addr32flag = !((sizeflag & AFLAG)
14874                          || bytemode == v_bnd_mode
14875                          || bytemode == bnd_mode);
14876       const char **indexes64 = names64;
14877       const char **indexes32 = names32;
14878
14879       havesib = 0;
14880       havebase = 1;
14881       haveindex = 0;
14882       base = modrm.rm;
14883
14884       if (base == 4)
14885         {
14886           havesib = 1;
14887           vindex = sib.index;
14888           USED_REX (REX_X);
14889           if (rex & REX_X)
14890             vindex += 8;
14891           switch (bytemode)
14892             {
14893             case vex_vsib_d_w_dq_mode:
14894             case vex_vsib_d_w_d_mode:
14895             case vex_vsib_q_w_dq_mode:
14896             case vex_vsib_q_w_d_mode:
14897               if (!need_vex)
14898                 abort ();
14899               if (vex.evex)
14900                 {
14901                   if (!vex.v)
14902                     vindex += 16;
14903                 }
14904
14905               haveindex = 1;
14906               switch (vex.length)
14907                 {
14908                 case 128:
14909                   indexes64 = indexes32 = names_xmm;
14910                   break;
14911                 case 256:
14912                   if (!vex.w
14913                       || bytemode == vex_vsib_q_w_dq_mode
14914                       || bytemode == vex_vsib_q_w_d_mode)
14915                     indexes64 = indexes32 = names_ymm;
14916                   else
14917                     indexes64 = indexes32 = names_xmm;
14918                   break;
14919                 case 512:
14920                   if (!vex.w
14921                       || bytemode == vex_vsib_q_w_dq_mode
14922                       || bytemode == vex_vsib_q_w_d_mode)
14923                     indexes64 = indexes32 = names_zmm;
14924                   else
14925                     indexes64 = indexes32 = names_ymm;
14926                   break;
14927                 default:
14928                   abort ();
14929                 }
14930               break;
14931             default:
14932               haveindex = vindex != 4;
14933               break;
14934             }
14935           scale = sib.scale;
14936           base = sib.base;
14937           codep++;
14938         }
14939       rbase = base + add;
14940
14941       switch (modrm.mod)
14942         {
14943         case 0:
14944           if (base == 5)
14945             {
14946               havebase = 0;
14947               if (address_mode == mode_64bit && !havesib)
14948                 riprel = 1;
14949               disp = get32s ();
14950             }
14951           break;
14952         case 1:
14953           FETCH_DATA (the_info, codep + 1);
14954           disp = *codep++;
14955           if ((disp & 0x80) != 0)
14956             disp -= 0x100;
14957           if (vex.evex && shift > 0)
14958             disp <<= shift;
14959           break;
14960         case 2:
14961           disp = get32s ();
14962           break;
14963         }
14964
14965       /* In 32bit mode, we need index register to tell [offset] from
14966          [eiz*1 + offset].  */
14967       needindex = (havesib
14968                    && !havebase
14969                    && !haveindex
14970                    && address_mode == mode_32bit);
14971       havedisp = (havebase
14972                   || needindex
14973                   || (havesib && (haveindex || scale != 0)));
14974
14975       if (!intel_syntax)
14976         if (modrm.mod != 0 || base == 5)
14977           {
14978             if (havedisp || riprel)
14979               print_displacement (scratchbuf, disp);
14980             else
14981               print_operand_value (scratchbuf, 1, disp);
14982             oappend (scratchbuf);
14983             if (riprel)
14984               {
14985                 set_op (disp, 1);
14986                 oappend (sizeflag & AFLAG ? "(%rip)" : "(%eip)");
14987               }
14988           }
14989
14990       if ((havebase || haveindex || riprel)
14991           && (bytemode != v_bnd_mode)
14992           && (bytemode != bnd_mode))
14993         used_prefixes |= PREFIX_ADDR;
14994
14995       if (havedisp || (intel_syntax && riprel))
14996         {
14997           *obufp++ = open_char;
14998           if (intel_syntax && riprel)
14999             {
15000               set_op (disp, 1);
15001               oappend (sizeflag & AFLAG ? "rip" : "eip");
15002             }
15003           *obufp = '\0';
15004           if (havebase)
15005             oappend (address_mode == mode_64bit && !addr32flag
15006                      ? names64[rbase] : names32[rbase]);
15007           if (havesib)
15008             {
15009               /* ESP/RSP won't allow index.  If base isn't ESP/RSP,
15010                  print index to tell base + index from base.  */
15011               if (scale != 0
15012                   || needindex
15013                   || haveindex
15014                   || (havebase && base != ESP_REG_NUM))
15015                 {
15016                   if (!intel_syntax || havebase)
15017                     {
15018                       *obufp++ = separator_char;
15019                       *obufp = '\0';
15020                     }
15021                   if (haveindex)
15022                     oappend (address_mode == mode_64bit && !addr32flag
15023                              ? indexes64[vindex] : indexes32[vindex]);
15024                   else
15025                     oappend (address_mode == mode_64bit && !addr32flag
15026                              ? index64 : index32);
15027
15028                   *obufp++ = scale_char;
15029                   *obufp = '\0';
15030                   sprintf (scratchbuf, "%d", 1 << scale);
15031                   oappend (scratchbuf);
15032                 }
15033             }
15034           if (intel_syntax
15035               && (disp || modrm.mod != 0 || base == 5))
15036             {
15037               if (!havedisp || (bfd_signed_vma) disp >= 0)
15038                 {
15039                   *obufp++ = '+';
15040                   *obufp = '\0';
15041                 }
15042               else if (modrm.mod != 1 && disp != -disp)
15043                 {
15044                   *obufp++ = '-';
15045                   *obufp = '\0';
15046                   disp = - (bfd_signed_vma) disp;
15047                 }
15048
15049               if (havedisp)
15050                 print_displacement (scratchbuf, disp);
15051               else
15052                 print_operand_value (scratchbuf, 1, disp);
15053               oappend (scratchbuf);
15054             }
15055
15056           *obufp++ = close_char;
15057           *obufp = '\0';
15058         }
15059       else if (intel_syntax)
15060         {
15061           if (modrm.mod != 0 || base == 5)
15062             {
15063               if (!active_seg_prefix)
15064                 {
15065                   oappend (names_seg[ds_reg - es_reg]);
15066                   oappend (":");
15067                 }
15068               print_operand_value (scratchbuf, 1, disp);
15069               oappend (scratchbuf);
15070             }
15071         }
15072     }
15073   else
15074     {
15075       /* 16 bit address mode */
15076       used_prefixes |= prefixes & PREFIX_ADDR;
15077       switch (modrm.mod)
15078         {
15079         case 0:
15080           if (modrm.rm == 6)
15081             {
15082               disp = get16 ();
15083               if ((disp & 0x8000) != 0)
15084                 disp -= 0x10000;
15085             }
15086           break;
15087         case 1:
15088           FETCH_DATA (the_info, codep + 1);
15089           disp = *codep++;
15090           if ((disp & 0x80) != 0)
15091             disp -= 0x100;
15092           break;
15093         case 2:
15094           disp = get16 ();
15095           if ((disp & 0x8000) != 0)
15096             disp -= 0x10000;
15097           break;
15098         }
15099
15100       if (!intel_syntax)
15101         if (modrm.mod != 0 || modrm.rm == 6)
15102           {
15103             print_displacement (scratchbuf, disp);
15104             oappend (scratchbuf);
15105           }
15106
15107       if (modrm.mod != 0 || modrm.rm != 6)
15108         {
15109           *obufp++ = open_char;
15110           *obufp = '\0';
15111           oappend (index16[modrm.rm]);
15112           if (intel_syntax
15113               && (disp || modrm.mod != 0 || modrm.rm == 6))
15114             {
15115               if ((bfd_signed_vma) disp >= 0)
15116                 {
15117                   *obufp++ = '+';
15118                   *obufp = '\0';
15119                 }
15120               else if (modrm.mod != 1)
15121                 {
15122                   *obufp++ = '-';
15123                   *obufp = '\0';
15124                   disp = - (bfd_signed_vma) disp;
15125                 }
15126
15127               print_displacement (scratchbuf, disp);
15128               oappend (scratchbuf);
15129             }
15130
15131           *obufp++ = close_char;
15132           *obufp = '\0';
15133         }
15134       else if (intel_syntax)
15135         {
15136           if (!active_seg_prefix)
15137             {
15138               oappend (names_seg[ds_reg - es_reg]);
15139               oappend (":");
15140             }
15141           print_operand_value (scratchbuf, 1, disp & 0xffff);
15142           oappend (scratchbuf);
15143         }
15144     }
15145   if (vex.evex && vex.b
15146       && (bytemode == x_mode
15147           || bytemode == xmmq_mode
15148           || bytemode == evex_half_bcst_xmmq_mode))
15149     {
15150       if (vex.w
15151           || bytemode == xmmq_mode
15152           || bytemode == evex_half_bcst_xmmq_mode)
15153         {
15154           switch (vex.length)
15155             {
15156             case 128:
15157               oappend ("{1to2}");
15158               break;
15159             case 256:
15160               oappend ("{1to4}");
15161               break;
15162             case 512:
15163               oappend ("{1to8}");
15164               break;
15165             default:
15166               abort ();
15167             }
15168         }
15169       else
15170         {
15171           switch (vex.length)
15172             {
15173             case 128:
15174               oappend ("{1to4}");
15175               break;
15176             case 256:
15177               oappend ("{1to8}");
15178               break;
15179             case 512:
15180               oappend ("{1to16}");
15181               break;
15182             default:
15183               abort ();
15184             }
15185         }
15186     }
15187 }
15188
15189 static void
15190 OP_E (int bytemode, int sizeflag)
15191 {
15192   /* Skip mod/rm byte.  */
15193   MODRM_CHECK;
15194   codep++;
15195
15196   if (modrm.mod == 3)
15197     OP_E_register (bytemode, sizeflag);
15198   else
15199     OP_E_memory (bytemode, sizeflag);
15200 }
15201
15202 static void
15203 OP_G (int bytemode, int sizeflag)
15204 {
15205   int add = 0;
15206   USED_REX (REX_R);
15207   if (rex & REX_R)
15208     add += 8;
15209   switch (bytemode)
15210     {
15211     case b_mode:
15212       USED_REX (0);
15213       if (rex)
15214         oappend (names8rex[modrm.reg + add]);
15215       else
15216         oappend (names8[modrm.reg + add]);
15217       break;
15218     case w_mode:
15219       oappend (names16[modrm.reg + add]);
15220       break;
15221     case d_mode:
15222     case db_mode:
15223     case dw_mode:
15224       oappend (names32[modrm.reg + add]);
15225       break;
15226     case q_mode:
15227       oappend (names64[modrm.reg + add]);
15228       break;
15229     case bnd_mode:
15230       oappend (names_bnd[modrm.reg]);
15231       break;
15232     case v_mode:
15233     case dq_mode:
15234     case dqb_mode:
15235     case dqd_mode:
15236     case dqw_mode:
15237     case dqw_swap_mode:
15238       USED_REX (REX_W);
15239       if (rex & REX_W)
15240         oappend (names64[modrm.reg + add]);
15241       else
15242         {
15243           if ((sizeflag & DFLAG) || bytemode != v_mode)
15244             oappend (names32[modrm.reg + add]);
15245           else
15246             oappend (names16[modrm.reg + add]);
15247           used_prefixes |= (prefixes & PREFIX_DATA);
15248         }
15249       break;
15250     case m_mode:
15251       if (address_mode == mode_64bit)
15252         oappend (names64[modrm.reg + add]);
15253       else
15254         oappend (names32[modrm.reg + add]);
15255       break;
15256     case mask_bd_mode:
15257     case mask_mode:
15258       oappend (names_mask[modrm.reg + add]);
15259       break;
15260     default:
15261       oappend (INTERNAL_DISASSEMBLER_ERROR);
15262       break;
15263     }
15264 }
15265
15266 static bfd_vma
15267 get64 (void)
15268 {
15269   bfd_vma x;
15270 #ifdef BFD64
15271   unsigned int a;
15272   unsigned int b;
15273
15274   FETCH_DATA (the_info, codep + 8);
15275   a = *codep++ & 0xff;
15276   a |= (*codep++ & 0xff) << 8;
15277   a |= (*codep++ & 0xff) << 16;
15278   a |= (*codep++ & 0xff) << 24;
15279   b = *codep++ & 0xff;
15280   b |= (*codep++ & 0xff) << 8;
15281   b |= (*codep++ & 0xff) << 16;
15282   b |= (*codep++ & 0xff) << 24;
15283   x = a + ((bfd_vma) b << 32);
15284 #else
15285   abort ();
15286   x = 0;
15287 #endif
15288   return x;
15289 }
15290
15291 static bfd_signed_vma
15292 get32 (void)
15293 {
15294   bfd_signed_vma x = 0;
15295
15296   FETCH_DATA (the_info, codep + 4);
15297   x = *codep++ & (bfd_signed_vma) 0xff;
15298   x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
15299   x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
15300   x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
15301   return x;
15302 }
15303
15304 static bfd_signed_vma
15305 get32s (void)
15306 {
15307   bfd_signed_vma x = 0;
15308
15309   FETCH_DATA (the_info, codep + 4);
15310   x = *codep++ & (bfd_signed_vma) 0xff;
15311   x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
15312   x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
15313   x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
15314
15315   x = (x ^ ((bfd_signed_vma) 1 << 31)) - ((bfd_signed_vma) 1 << 31);
15316
15317   return x;
15318 }
15319
15320 static int
15321 get16 (void)
15322 {
15323   int x = 0;
15324
15325   FETCH_DATA (the_info, codep + 2);
15326   x = *codep++ & 0xff;
15327   x |= (*codep++ & 0xff) << 8;
15328   return x;
15329 }
15330
15331 static void
15332 set_op (bfd_vma op, int riprel)
15333 {
15334   op_index[op_ad] = op_ad;
15335   if (address_mode == mode_64bit)
15336     {
15337       op_address[op_ad] = op;
15338       op_riprel[op_ad] = riprel;
15339     }
15340   else
15341     {
15342       /* Mask to get a 32-bit address.  */
15343       op_address[op_ad] = op & 0xffffffff;
15344       op_riprel[op_ad] = riprel & 0xffffffff;
15345     }
15346 }
15347
15348 static void
15349 OP_REG (int code, int sizeflag)
15350 {
15351   const char *s;
15352   int add;
15353
15354   switch (code)
15355     {
15356     case es_reg: case ss_reg: case cs_reg:
15357     case ds_reg: case fs_reg: case gs_reg:
15358       oappend (names_seg[code - es_reg]);
15359       return;
15360     }
15361
15362   USED_REX (REX_B);
15363   if (rex & REX_B)
15364     add = 8;
15365   else
15366     add = 0;
15367
15368   switch (code)
15369     {
15370     case ax_reg: case cx_reg: case dx_reg: case bx_reg:
15371     case sp_reg: case bp_reg: case si_reg: case di_reg:
15372       s = names16[code - ax_reg + add];
15373       break;
15374     case al_reg: case ah_reg: case cl_reg: case ch_reg:
15375     case dl_reg: case dh_reg: case bl_reg: case bh_reg:
15376       USED_REX (0);
15377       if (rex)
15378         s = names8rex[code - al_reg + add];
15379       else
15380         s = names8[code - al_reg];
15381       break;
15382     case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
15383     case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
15384       if (address_mode == mode_64bit
15385           && ((sizeflag & DFLAG) || (rex & REX_W)))
15386         {
15387           s = names64[code - rAX_reg + add];
15388           break;
15389         }
15390       code += eAX_reg - rAX_reg;
15391       /* Fall through.  */
15392     case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
15393     case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
15394       USED_REX (REX_W);
15395       if (rex & REX_W)
15396         s = names64[code - eAX_reg + add];
15397       else
15398         {
15399           if (sizeflag & DFLAG)
15400             s = names32[code - eAX_reg + add];
15401           else
15402             s = names16[code - eAX_reg + add];
15403           used_prefixes |= (prefixes & PREFIX_DATA);
15404         }
15405       break;
15406     default:
15407       s = INTERNAL_DISASSEMBLER_ERROR;
15408       break;
15409     }
15410   oappend (s);
15411 }
15412
15413 static void
15414 OP_IMREG (int code, int sizeflag)
15415 {
15416   const char *s;
15417
15418   switch (code)
15419     {
15420     case indir_dx_reg:
15421       if (intel_syntax)
15422         s = "dx";
15423       else
15424         s = "(%dx)";
15425       break;
15426     case ax_reg: case cx_reg: case dx_reg: case bx_reg:
15427     case sp_reg: case bp_reg: case si_reg: case di_reg:
15428       s = names16[code - ax_reg];
15429       break;
15430     case es_reg: case ss_reg: case cs_reg:
15431     case ds_reg: case fs_reg: case gs_reg:
15432       s = names_seg[code - es_reg];
15433       break;
15434     case al_reg: case ah_reg: case cl_reg: case ch_reg:
15435     case dl_reg: case dh_reg: case bl_reg: case bh_reg:
15436       USED_REX (0);
15437       if (rex)
15438         s = names8rex[code - al_reg];
15439       else
15440         s = names8[code - al_reg];
15441       break;
15442     case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
15443     case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
15444       USED_REX (REX_W);
15445       if (rex & REX_W)
15446         s = names64[code - eAX_reg];
15447       else
15448         {
15449           if (sizeflag & DFLAG)
15450             s = names32[code - eAX_reg];
15451           else
15452             s = names16[code - eAX_reg];
15453           used_prefixes |= (prefixes & PREFIX_DATA);
15454         }
15455       break;
15456     case z_mode_ax_reg:
15457       if ((rex & REX_W) || (sizeflag & DFLAG))
15458         s = *names32;
15459       else
15460         s = *names16;
15461       if (!(rex & REX_W))
15462         used_prefixes |= (prefixes & PREFIX_DATA);
15463       break;
15464     default:
15465       s = INTERNAL_DISASSEMBLER_ERROR;
15466       break;
15467     }
15468   oappend (s);
15469 }
15470
15471 static void
15472 OP_I (int bytemode, int sizeflag)
15473 {
15474   bfd_signed_vma op;
15475   bfd_signed_vma mask = -1;
15476
15477   switch (bytemode)
15478     {
15479     case b_mode:
15480       FETCH_DATA (the_info, codep + 1);
15481       op = *codep++;
15482       mask = 0xff;
15483       break;
15484     case q_mode:
15485       if (address_mode == mode_64bit)
15486         {
15487           op = get32s ();
15488           break;
15489         }
15490       /* Fall through.  */
15491     case v_mode:
15492       USED_REX (REX_W);
15493       if (rex & REX_W)
15494         op = get32s ();
15495       else
15496         {
15497           if (sizeflag & DFLAG)
15498             {
15499               op = get32 ();
15500               mask = 0xffffffff;
15501             }
15502           else
15503             {
15504               op = get16 ();
15505               mask = 0xfffff;
15506             }
15507           used_prefixes |= (prefixes & PREFIX_DATA);
15508         }
15509       break;
15510     case w_mode:
15511       mask = 0xfffff;
15512       op = get16 ();
15513       break;
15514     case const_1_mode:
15515       if (intel_syntax)
15516         oappend ("1");
15517       return;
15518     default:
15519       oappend (INTERNAL_DISASSEMBLER_ERROR);
15520       return;
15521     }
15522
15523   op &= mask;
15524   scratchbuf[0] = '$';
15525   print_operand_value (scratchbuf + 1, 1, op);
15526   oappend_maybe_intel (scratchbuf);
15527   scratchbuf[0] = '\0';
15528 }
15529
15530 static void
15531 OP_I64 (int bytemode, int sizeflag)
15532 {
15533   bfd_signed_vma op;
15534   bfd_signed_vma mask = -1;
15535
15536   if (address_mode != mode_64bit)
15537     {
15538       OP_I (bytemode, sizeflag);
15539       return;
15540     }
15541
15542   switch (bytemode)
15543     {
15544     case b_mode:
15545       FETCH_DATA (the_info, codep + 1);
15546       op = *codep++;
15547       mask = 0xff;
15548       break;
15549     case v_mode:
15550       USED_REX (REX_W);
15551       if (rex & REX_W)
15552         op = get64 ();
15553       else
15554         {
15555           if (sizeflag & DFLAG)
15556             {
15557               op = get32 ();
15558               mask = 0xffffffff;
15559             }
15560           else
15561             {
15562               op = get16 ();
15563               mask = 0xfffff;
15564             }
15565           used_prefixes |= (prefixes & PREFIX_DATA);
15566         }
15567       break;
15568     case w_mode:
15569       mask = 0xfffff;
15570       op = get16 ();
15571       break;
15572     default:
15573       oappend (INTERNAL_DISASSEMBLER_ERROR);
15574       return;
15575     }
15576
15577   op &= mask;
15578   scratchbuf[0] = '$';
15579   print_operand_value (scratchbuf + 1, 1, op);
15580   oappend_maybe_intel (scratchbuf);
15581   scratchbuf[0] = '\0';
15582 }
15583
15584 static void
15585 OP_sI (int bytemode, int sizeflag)
15586 {
15587   bfd_signed_vma op;
15588
15589   switch (bytemode)
15590     {
15591     case b_mode:
15592     case b_T_mode:
15593       FETCH_DATA (the_info, codep + 1);
15594       op = *codep++;
15595       if ((op & 0x80) != 0)
15596         op -= 0x100;
15597       if (bytemode == b_T_mode)
15598         {
15599           if (address_mode != mode_64bit
15600               || !((sizeflag & DFLAG) || (rex & REX_W)))
15601             {
15602               /* The operand-size prefix is overridden by a REX prefix.  */
15603               if ((sizeflag & DFLAG) || (rex & REX_W))
15604                 op &= 0xffffffff;
15605               else
15606                 op &= 0xffff;
15607           }
15608         }
15609       else
15610         {
15611           if (!(rex & REX_W))
15612             {
15613               if (sizeflag & DFLAG)
15614                 op &= 0xffffffff;
15615               else
15616                 op &= 0xffff;
15617             }
15618         }
15619       break;
15620     case v_mode:
15621       /* The operand-size prefix is overridden by a REX prefix.  */
15622       if ((sizeflag & DFLAG) || (rex & REX_W))
15623         op = get32s ();
15624       else
15625         op = get16 ();
15626       break;
15627     default:
15628       oappend (INTERNAL_DISASSEMBLER_ERROR);
15629       return;
15630     }
15631
15632   scratchbuf[0] = '$';
15633   print_operand_value (scratchbuf + 1, 1, op);
15634   oappend_maybe_intel (scratchbuf);
15635 }
15636
15637 static void
15638 OP_J (int bytemode, int sizeflag)
15639 {
15640   bfd_vma disp;
15641   bfd_vma mask = -1;
15642   bfd_vma segment = 0;
15643
15644   switch (bytemode)
15645     {
15646     case b_mode:
15647       FETCH_DATA (the_info, codep + 1);
15648       disp = *codep++;
15649       if ((disp & 0x80) != 0)
15650         disp -= 0x100;
15651       break;
15652     case v_mode:
15653       USED_REX (REX_W);
15654       if ((sizeflag & DFLAG) || (rex & REX_W))
15655         disp = get32s ();
15656       else
15657         {
15658           disp = get16 ();
15659           if ((disp & 0x8000) != 0)
15660             disp -= 0x10000;
15661           /* In 16bit mode, address is wrapped around at 64k within
15662              the same segment.  Otherwise, a data16 prefix on a jump
15663              instruction means that the pc is masked to 16 bits after
15664              the displacement is added!  */
15665           mask = 0xffff;
15666           if ((prefixes & PREFIX_DATA) == 0)
15667             segment = ((start_pc + codep - start_codep)
15668                        & ~((bfd_vma) 0xffff));
15669         }
15670       if (!(rex & REX_W))
15671         used_prefixes |= (prefixes & PREFIX_DATA);
15672       break;
15673     default:
15674       oappend (INTERNAL_DISASSEMBLER_ERROR);
15675       return;
15676     }
15677   disp = ((start_pc + (codep - start_codep) + disp) & mask) | segment;
15678   set_op (disp, 0);
15679   print_operand_value (scratchbuf, 1, disp);
15680   oappend (scratchbuf);
15681 }
15682
15683 static void
15684 OP_SEG (int bytemode, int sizeflag)
15685 {
15686   if (bytemode == w_mode)
15687     oappend (names_seg[modrm.reg]);
15688   else
15689     OP_E (modrm.mod == 3 ? bytemode : w_mode, sizeflag);
15690 }
15691
15692 static void
15693 OP_DIR (int dummy ATTRIBUTE_UNUSED, int sizeflag)
15694 {
15695   int seg, offset;
15696
15697   if (sizeflag & DFLAG)
15698     {
15699       offset = get32 ();
15700       seg = get16 ();
15701     }
15702   else
15703     {
15704       offset = get16 ();
15705       seg = get16 ();
15706     }
15707   used_prefixes |= (prefixes & PREFIX_DATA);
15708   if (intel_syntax)
15709     sprintf (scratchbuf, "0x%x:0x%x", seg, offset);
15710   else
15711     sprintf (scratchbuf, "$0x%x,$0x%x", seg, offset);
15712   oappend (scratchbuf);
15713 }
15714
15715 static void
15716 OP_OFF (int bytemode, int sizeflag)
15717 {
15718   bfd_vma off;
15719
15720   if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
15721     intel_operand_size (bytemode, sizeflag);
15722   append_seg ();
15723
15724   if ((sizeflag & AFLAG) || address_mode == mode_64bit)
15725     off = get32 ();
15726   else
15727     off = get16 ();
15728
15729   if (intel_syntax)
15730     {
15731       if (!active_seg_prefix)
15732         {
15733           oappend (names_seg[ds_reg - es_reg]);
15734           oappend (":");
15735         }
15736     }
15737   print_operand_value (scratchbuf, 1, off);
15738   oappend (scratchbuf);
15739 }
15740
15741 static void
15742 OP_OFF64 (int bytemode, int sizeflag)
15743 {
15744   bfd_vma off;
15745
15746   if (address_mode != mode_64bit
15747       || (prefixes & PREFIX_ADDR))
15748     {
15749       OP_OFF (bytemode, sizeflag);
15750       return;
15751     }
15752
15753   if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
15754     intel_operand_size (bytemode, sizeflag);
15755   append_seg ();
15756
15757   off = get64 ();
15758
15759   if (intel_syntax)
15760     {
15761       if (!active_seg_prefix)
15762         {
15763           oappend (names_seg[ds_reg - es_reg]);
15764           oappend (":");
15765         }
15766     }
15767   print_operand_value (scratchbuf, 1, off);
15768   oappend (scratchbuf);
15769 }
15770
15771 static void
15772 ptr_reg (int code, int sizeflag)
15773 {
15774   const char *s;
15775
15776   *obufp++ = open_char;
15777   used_prefixes |= (prefixes & PREFIX_ADDR);
15778   if (address_mode == mode_64bit)
15779     {
15780       if (!(sizeflag & AFLAG))
15781         s = names32[code - eAX_reg];
15782       else
15783         s = names64[code - eAX_reg];
15784     }
15785   else if (sizeflag & AFLAG)
15786     s = names32[code - eAX_reg];
15787   else
15788     s = names16[code - eAX_reg];
15789   oappend (s);
15790   *obufp++ = close_char;
15791   *obufp = 0;
15792 }
15793
15794 static void
15795 OP_ESreg (int code, int sizeflag)
15796 {
15797   if (intel_syntax)
15798     {
15799       switch (codep[-1])
15800         {
15801         case 0x6d:      /* insw/insl */
15802           intel_operand_size (z_mode, sizeflag);
15803           break;
15804         case 0xa5:      /* movsw/movsl/movsq */
15805         case 0xa7:      /* cmpsw/cmpsl/cmpsq */
15806         case 0xab:      /* stosw/stosl */
15807         case 0xaf:      /* scasw/scasl */
15808           intel_operand_size (v_mode, sizeflag);
15809           break;
15810         default:
15811           intel_operand_size (b_mode, sizeflag);
15812         }
15813     }
15814   oappend_maybe_intel ("%es:");
15815   ptr_reg (code, sizeflag);
15816 }
15817
15818 static void
15819 OP_DSreg (int code, int sizeflag)
15820 {
15821   if (intel_syntax)
15822     {
15823       switch (codep[-1])
15824         {
15825         case 0x6f:      /* outsw/outsl */
15826           intel_operand_size (z_mode, sizeflag);
15827           break;
15828         case 0xa5:      /* movsw/movsl/movsq */
15829         case 0xa7:      /* cmpsw/cmpsl/cmpsq */
15830         case 0xad:      /* lodsw/lodsl/lodsq */
15831           intel_operand_size (v_mode, sizeflag);
15832           break;
15833         default:
15834           intel_operand_size (b_mode, sizeflag);
15835         }
15836     }
15837   /* Set active_seg_prefix to PREFIX_DS if it is unset so that the
15838      default segment register DS is printed.  */
15839   if (!active_seg_prefix)
15840     active_seg_prefix = PREFIX_DS;
15841   append_seg ();
15842   ptr_reg (code, sizeflag);
15843 }
15844
15845 static void
15846 OP_C (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15847 {
15848   int add;
15849   if (rex & REX_R)
15850     {
15851       USED_REX (REX_R);
15852       add = 8;
15853     }
15854   else if (address_mode != mode_64bit && (prefixes & PREFIX_LOCK))
15855     {
15856       all_prefixes[last_lock_prefix] = 0;
15857       used_prefixes |= PREFIX_LOCK;
15858       add = 8;
15859     }
15860   else
15861     add = 0;
15862   sprintf (scratchbuf, "%%cr%d", modrm.reg + add);
15863   oappend_maybe_intel (scratchbuf);
15864 }
15865
15866 static void
15867 OP_D (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15868 {
15869   int add;
15870   USED_REX (REX_R);
15871   if (rex & REX_R)
15872     add = 8;
15873   else
15874     add = 0;
15875   if (intel_syntax)
15876     sprintf (scratchbuf, "db%d", modrm.reg + add);
15877   else
15878     sprintf (scratchbuf, "%%db%d", modrm.reg + add);
15879   oappend (scratchbuf);
15880 }
15881
15882 static void
15883 OP_T (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15884 {
15885   sprintf (scratchbuf, "%%tr%d", modrm.reg);
15886   oappend_maybe_intel (scratchbuf);
15887 }
15888
15889 static void
15890 OP_R (int bytemode, int sizeflag)
15891 {
15892   /* Skip mod/rm byte.  */
15893   MODRM_CHECK;
15894   codep++;
15895   OP_E_register (bytemode, sizeflag);
15896 }
15897
15898 static void
15899 OP_MMX (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15900 {
15901   int reg = modrm.reg;
15902   const char **names;
15903
15904   used_prefixes |= (prefixes & PREFIX_DATA);
15905   if (prefixes & PREFIX_DATA)
15906     {
15907       names = names_xmm;
15908       USED_REX (REX_R);
15909       if (rex & REX_R)
15910         reg += 8;
15911     }
15912   else
15913     names = names_mm;
15914   oappend (names[reg]);
15915 }
15916
15917 static void
15918 OP_XMM (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
15919 {
15920   int reg = modrm.reg;
15921   const char **names;
15922
15923   USED_REX (REX_R);
15924   if (rex & REX_R)
15925     reg += 8;
15926   if (vex.evex)
15927     {
15928       if (!vex.r)
15929         reg += 16;
15930     }
15931
15932   if (need_vex
15933       && bytemode != xmm_mode
15934       && bytemode != xmmq_mode
15935       && bytemode != evex_half_bcst_xmmq_mode
15936       && bytemode != ymm_mode
15937       && bytemode != scalar_mode)
15938     {
15939       switch (vex.length)
15940         {
15941         case 128:
15942           names = names_xmm;
15943           break;
15944         case 256:
15945           if (vex.w
15946               || (bytemode != vex_vsib_q_w_dq_mode
15947                   && bytemode != vex_vsib_q_w_d_mode))
15948             names = names_ymm;
15949           else
15950             names = names_xmm;
15951           break;
15952         case 512:
15953           names = names_zmm;
15954           break;
15955         default:
15956           abort ();
15957         }
15958     }
15959   else if (bytemode == xmmq_mode
15960            || bytemode == evex_half_bcst_xmmq_mode)
15961     {
15962       switch (vex.length)
15963         {
15964         case 128:
15965         case 256:
15966           names = names_xmm;
15967           break;
15968         case 512:
15969           names = names_ymm;
15970           break;
15971         default:
15972           abort ();
15973         }
15974     }
15975   else if (bytemode == ymm_mode)
15976     names = names_ymm;
15977   else
15978     names = names_xmm;
15979   oappend (names[reg]);
15980 }
15981
15982 static void
15983 OP_EM (int bytemode, int sizeflag)
15984 {
15985   int reg;
15986   const char **names;
15987
15988   if (modrm.mod != 3)
15989     {
15990       if (intel_syntax
15991           && (bytemode == v_mode || bytemode == v_swap_mode))
15992         {
15993           bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
15994           used_prefixes |= (prefixes & PREFIX_DATA);
15995         }
15996       OP_E (bytemode, sizeflag);
15997       return;
15998     }
15999
16000   if ((sizeflag & SUFFIX_ALWAYS) && bytemode == v_swap_mode)
16001     swap_operand ();
16002
16003   /* Skip mod/rm byte.  */
16004   MODRM_CHECK;
16005   codep++;
16006   used_prefixes |= (prefixes & PREFIX_DATA);
16007   reg = modrm.rm;
16008   if (prefixes & PREFIX_DATA)
16009     {
16010       names = names_xmm;
16011       USED_REX (REX_B);
16012       if (rex & REX_B)
16013         reg += 8;
16014     }
16015   else
16016     names = names_mm;
16017   oappend (names[reg]);
16018 }
16019
16020 /* cvt* are the only instructions in sse2 which have
16021    both SSE and MMX operands and also have 0x66 prefix
16022    in their opcode. 0x66 was originally used to differentiate
16023    between SSE and MMX instruction(operands). So we have to handle the
16024    cvt* separately using OP_EMC and OP_MXC */
16025 static void
16026 OP_EMC (int bytemode, int sizeflag)
16027 {
16028   if (modrm.mod != 3)
16029     {
16030       if (intel_syntax && bytemode == v_mode)
16031         {
16032           bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
16033           used_prefixes |= (prefixes & PREFIX_DATA);
16034         }
16035       OP_E (bytemode, sizeflag);
16036       return;
16037     }
16038
16039   /* Skip mod/rm byte.  */
16040   MODRM_CHECK;
16041   codep++;
16042   used_prefixes |= (prefixes & PREFIX_DATA);
16043   oappend (names_mm[modrm.rm]);
16044 }
16045
16046 static void
16047 OP_MXC (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
16048 {
16049   used_prefixes |= (prefixes & PREFIX_DATA);
16050   oappend (names_mm[modrm.reg]);
16051 }
16052
16053 static void
16054 OP_EX (int bytemode, int sizeflag)
16055 {
16056   int reg;
16057   const char **names;
16058
16059   /* Skip mod/rm byte.  */
16060   MODRM_CHECK;
16061   codep++;
16062
16063   if (modrm.mod != 3)
16064     {
16065       OP_E_memory (bytemode, sizeflag);
16066       return;
16067     }
16068
16069   reg = modrm.rm;
16070   USED_REX (REX_B);
16071   if (rex & REX_B)
16072     reg += 8;
16073   if (vex.evex)
16074     {
16075       USED_REX (REX_X);
16076       if ((rex & REX_X))
16077         reg += 16;
16078     }
16079
16080   if ((sizeflag & SUFFIX_ALWAYS)
16081       && (bytemode == x_swap_mode
16082           || bytemode == d_swap_mode
16083           || bytemode == dqw_swap_mode
16084           || bytemode == d_scalar_swap_mode
16085           || bytemode == q_swap_mode
16086           || bytemode == q_scalar_swap_mode))
16087     swap_operand ();
16088
16089   if (need_vex
16090       && bytemode != xmm_mode
16091       && bytemode != xmmdw_mode
16092       && bytemode != xmmqd_mode
16093       && bytemode != xmm_mb_mode
16094       && bytemode != xmm_mw_mode
16095       && bytemode != xmm_md_mode
16096       && bytemode != xmm_mq_mode
16097       && bytemode != xmm_mdq_mode
16098       && bytemode != xmmq_mode
16099       && bytemode != evex_half_bcst_xmmq_mode
16100       && bytemode != ymm_mode
16101       && bytemode != d_scalar_mode
16102       && bytemode != d_scalar_swap_mode
16103       && bytemode != q_scalar_mode
16104       && bytemode != q_scalar_swap_mode
16105       && bytemode != vex_scalar_w_dq_mode)
16106     {
16107       switch (vex.length)
16108         {
16109         case 128:
16110           names = names_xmm;
16111           break;
16112         case 256:
16113           names = names_ymm;
16114           break;
16115         case 512:
16116           names = names_zmm;
16117           break;
16118         default:
16119           abort ();
16120         }
16121     }
16122   else if (bytemode == xmmq_mode
16123            || bytemode == evex_half_bcst_xmmq_mode)
16124     {
16125       switch (vex.length)
16126         {
16127         case 128:
16128         case 256:
16129           names = names_xmm;
16130           break;
16131         case 512:
16132           names = names_ymm;
16133           break;
16134         default:
16135           abort ();
16136         }
16137     }
16138   else if (bytemode == ymm_mode)
16139     names = names_ymm;
16140   else
16141     names = names_xmm;
16142   oappend (names[reg]);
16143 }
16144
16145 static void
16146 OP_MS (int bytemode, int sizeflag)
16147 {
16148   if (modrm.mod == 3)
16149     OP_EM (bytemode, sizeflag);
16150   else
16151     BadOp ();
16152 }
16153
16154 static void
16155 OP_XS (int bytemode, int sizeflag)
16156 {
16157   if (modrm.mod == 3)
16158     OP_EX (bytemode, sizeflag);
16159   else
16160     BadOp ();
16161 }
16162
16163 static void
16164 OP_M (int bytemode, int sizeflag)
16165 {
16166   if (modrm.mod == 3)
16167     /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
16168     BadOp ();
16169   else
16170     OP_E (bytemode, sizeflag);
16171 }
16172
16173 static void
16174 OP_0f07 (int bytemode, int sizeflag)
16175 {
16176   if (modrm.mod != 3 || modrm.rm != 0)
16177     BadOp ();
16178   else
16179     OP_E (bytemode, sizeflag);
16180 }
16181
16182 /* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
16183    32bit mode and "xchg %rax,%rax" in 64bit mode.  */
16184
16185 static void
16186 NOP_Fixup1 (int bytemode, int sizeflag)
16187 {
16188   if ((prefixes & PREFIX_DATA) != 0
16189       || (rex != 0
16190           && rex != 0x48
16191           && address_mode == mode_64bit))
16192     OP_REG (bytemode, sizeflag);
16193   else
16194     strcpy (obuf, "nop");
16195 }
16196
16197 static void
16198 NOP_Fixup2 (int bytemode, int sizeflag)
16199 {
16200   if ((prefixes & PREFIX_DATA) != 0
16201       || (rex != 0
16202           && rex != 0x48
16203           && address_mode == mode_64bit))
16204     OP_IMREG (bytemode, sizeflag);
16205 }
16206
16207 static const char *const Suffix3DNow[] = {
16208 /* 00 */        NULL,           NULL,           NULL,           NULL,
16209 /* 04 */        NULL,           NULL,           NULL,           NULL,
16210 /* 08 */        NULL,           NULL,           NULL,           NULL,
16211 /* 0C */        "pi2fw",        "pi2fd",        NULL,           NULL,
16212 /* 10 */        NULL,           NULL,           NULL,           NULL,
16213 /* 14 */        NULL,           NULL,           NULL,           NULL,
16214 /* 18 */        NULL,           NULL,           NULL,           NULL,
16215 /* 1C */        "pf2iw",        "pf2id",        NULL,           NULL,
16216 /* 20 */        NULL,           NULL,           NULL,           NULL,
16217 /* 24 */        NULL,           NULL,           NULL,           NULL,
16218 /* 28 */        NULL,           NULL,           NULL,           NULL,
16219 /* 2C */        NULL,           NULL,           NULL,           NULL,
16220 /* 30 */        NULL,           NULL,           NULL,           NULL,
16221 /* 34 */        NULL,           NULL,           NULL,           NULL,
16222 /* 38 */        NULL,           NULL,           NULL,           NULL,
16223 /* 3C */        NULL,           NULL,           NULL,           NULL,
16224 /* 40 */        NULL,           NULL,           NULL,           NULL,
16225 /* 44 */        NULL,           NULL,           NULL,           NULL,
16226 /* 48 */        NULL,           NULL,           NULL,           NULL,
16227 /* 4C */        NULL,           NULL,           NULL,           NULL,
16228 /* 50 */        NULL,           NULL,           NULL,           NULL,
16229 /* 54 */        NULL,           NULL,           NULL,           NULL,
16230 /* 58 */        NULL,           NULL,           NULL,           NULL,
16231 /* 5C */        NULL,           NULL,           NULL,           NULL,
16232 /* 60 */        NULL,           NULL,           NULL,           NULL,
16233 /* 64 */        NULL,           NULL,           NULL,           NULL,
16234 /* 68 */        NULL,           NULL,           NULL,           NULL,
16235 /* 6C */        NULL,           NULL,           NULL,           NULL,
16236 /* 70 */        NULL,           NULL,           NULL,           NULL,
16237 /* 74 */        NULL,           NULL,           NULL,           NULL,
16238 /* 78 */        NULL,           NULL,           NULL,           NULL,
16239 /* 7C */        NULL,           NULL,           NULL,           NULL,
16240 /* 80 */        NULL,           NULL,           NULL,           NULL,
16241 /* 84 */        NULL,           NULL,           NULL,           NULL,
16242 /* 88 */        NULL,           NULL,           "pfnacc",       NULL,
16243 /* 8C */        NULL,           NULL,           "pfpnacc",      NULL,
16244 /* 90 */        "pfcmpge",      NULL,           NULL,           NULL,
16245 /* 94 */        "pfmin",        NULL,           "pfrcp",        "pfrsqrt",
16246 /* 98 */        NULL,           NULL,           "pfsub",        NULL,
16247 /* 9C */        NULL,           NULL,           "pfadd",        NULL,
16248 /* A0 */        "pfcmpgt",      NULL,           NULL,           NULL,
16249 /* A4 */        "pfmax",        NULL,           "pfrcpit1",     "pfrsqit1",
16250 /* A8 */        NULL,           NULL,           "pfsubr",       NULL,
16251 /* AC */        NULL,           NULL,           "pfacc",        NULL,
16252 /* B0 */        "pfcmpeq",      NULL,           NULL,           NULL,
16253 /* B4 */        "pfmul",        NULL,           "pfrcpit2",     "pmulhrw",
16254 /* B8 */        NULL,           NULL,           NULL,           "pswapd",
16255 /* BC */        NULL,           NULL,           NULL,           "pavgusb",
16256 /* C0 */        NULL,           NULL,           NULL,           NULL,
16257 /* C4 */        NULL,           NULL,           NULL,           NULL,
16258 /* C8 */        NULL,           NULL,           NULL,           NULL,
16259 /* CC */        NULL,           NULL,           NULL,           NULL,
16260 /* D0 */        NULL,           NULL,           NULL,           NULL,
16261 /* D4 */        NULL,           NULL,           NULL,           NULL,
16262 /* D8 */        NULL,           NULL,           NULL,           NULL,
16263 /* DC */        NULL,           NULL,           NULL,           NULL,
16264 /* E0 */        NULL,           NULL,           NULL,           NULL,
16265 /* E4 */        NULL,           NULL,           NULL,           NULL,
16266 /* E8 */        NULL,           NULL,           NULL,           NULL,
16267 /* EC */        NULL,           NULL,           NULL,           NULL,
16268 /* F0 */        NULL,           NULL,           NULL,           NULL,
16269 /* F4 */        NULL,           NULL,           NULL,           NULL,
16270 /* F8 */        NULL,           NULL,           NULL,           NULL,
16271 /* FC */        NULL,           NULL,           NULL,           NULL,
16272 };
16273
16274 static void
16275 OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
16276 {
16277   const char *mnemonic;
16278
16279   FETCH_DATA (the_info, codep + 1);
16280   /* AMD 3DNow! instructions are specified by an opcode suffix in the
16281      place where an 8-bit immediate would normally go.  ie. the last
16282      byte of the instruction.  */
16283   obufp = mnemonicendp;
16284   mnemonic = Suffix3DNow[*codep++ & 0xff];
16285   if (mnemonic)
16286     oappend (mnemonic);
16287   else
16288     {
16289       /* Since a variable sized modrm/sib chunk is between the start
16290          of the opcode (0x0f0f) and the opcode suffix, we need to do
16291          all the modrm processing first, and don't know until now that
16292          we have a bad opcode.  This necessitates some cleaning up.  */
16293       op_out[0][0] = '\0';
16294       op_out[1][0] = '\0';
16295       BadOp ();
16296     }
16297   mnemonicendp = obufp;
16298 }
16299
16300 static struct op simd_cmp_op[] =
16301 {
16302   { STRING_COMMA_LEN ("eq") },
16303   { STRING_COMMA_LEN ("lt") },
16304   { STRING_COMMA_LEN ("le") },
16305   { STRING_COMMA_LEN ("unord") },
16306   { STRING_COMMA_LEN ("neq") },
16307   { STRING_COMMA_LEN ("nlt") },
16308   { STRING_COMMA_LEN ("nle") },
16309   { STRING_COMMA_LEN ("ord") }
16310 };
16311
16312 static void
16313 CMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
16314 {
16315   unsigned int cmp_type;
16316
16317   FETCH_DATA (the_info, codep + 1);
16318   cmp_type = *codep++ & 0xff;
16319   if (cmp_type < ARRAY_SIZE (simd_cmp_op))
16320     {
16321       char suffix [3];
16322       char *p = mnemonicendp - 2;
16323       suffix[0] = p[0];
16324       suffix[1] = p[1];
16325       suffix[2] = '\0';
16326       sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
16327       mnemonicendp += simd_cmp_op[cmp_type].len;
16328     }
16329   else
16330     {
16331       /* We have a reserved extension byte.  Output it directly.  */
16332       scratchbuf[0] = '$';
16333       print_operand_value (scratchbuf + 1, 1, cmp_type);
16334       oappend_maybe_intel (scratchbuf);
16335       scratchbuf[0] = '\0';
16336     }
16337 }
16338
16339 static void
16340 OP_Mwait (int bytemode ATTRIBUTE_UNUSED,
16341           int sizeflag ATTRIBUTE_UNUSED)
16342 {
16343   /* mwait %eax,%ecx  */
16344   if (!intel_syntax)
16345     {
16346       const char **names = (address_mode == mode_64bit
16347                             ? names64 : names32);
16348       strcpy (op_out[0], names[0]);
16349       strcpy (op_out[1], names[1]);
16350       two_source_ops = 1;
16351     }
16352   /* Skip mod/rm byte.  */
16353   MODRM_CHECK;
16354   codep++;
16355 }
16356
16357 static void
16358 OP_Monitor (int bytemode ATTRIBUTE_UNUSED,
16359             int sizeflag ATTRIBUTE_UNUSED)
16360 {
16361   /* monitor %eax,%ecx,%edx"  */
16362   if (!intel_syntax)
16363     {
16364       const char **op1_names;
16365       const char **names = (address_mode == mode_64bit
16366                             ? names64 : names32);
16367
16368       if (!(prefixes & PREFIX_ADDR))
16369         op1_names = (address_mode == mode_16bit
16370                      ? names16 : names);
16371       else
16372         {
16373           /* Remove "addr16/addr32".  */
16374           all_prefixes[last_addr_prefix] = 0;
16375           op1_names = (address_mode != mode_32bit
16376                        ? names32 : names16);
16377           used_prefixes |= PREFIX_ADDR;
16378         }
16379       strcpy (op_out[0], op1_names[0]);
16380       strcpy (op_out[1], names[1]);
16381       strcpy (op_out[2], names[2]);
16382       two_source_ops = 1;
16383     }
16384   /* Skip mod/rm byte.  */
16385   MODRM_CHECK;
16386   codep++;
16387 }
16388
16389 static void
16390 BadOp (void)
16391 {
16392   /* Throw away prefixes and 1st. opcode byte.  */
16393   codep = insn_codep + 1;
16394   oappend ("(bad)");
16395 }
16396
16397 static void
16398 REP_Fixup (int bytemode, int sizeflag)
16399 {
16400   /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
16401      lods and stos.  */
16402   if (prefixes & PREFIX_REPZ)
16403     all_prefixes[last_repz_prefix] = REP_PREFIX;
16404
16405   switch (bytemode)
16406     {
16407     case al_reg:
16408     case eAX_reg:
16409     case indir_dx_reg:
16410       OP_IMREG (bytemode, sizeflag);
16411       break;
16412     case eDI_reg:
16413       OP_ESreg (bytemode, sizeflag);
16414       break;
16415     case eSI_reg:
16416       OP_DSreg (bytemode, sizeflag);
16417       break;
16418     default:
16419       abort ();
16420       break;
16421     }
16422 }
16423
16424 /* For BND-prefixed instructions 0xF2 prefix should be displayed as
16425    "bnd".  */
16426
16427 static void
16428 BND_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
16429 {
16430   if (prefixes & PREFIX_REPNZ)
16431     all_prefixes[last_repnz_prefix] = BND_PREFIX;
16432 }
16433
16434 /* Similar to OP_E.  But the 0xf2/0xf3 prefixes should be displayed as
16435    "xacquire"/"xrelease" for memory operand if there is a LOCK prefix.
16436  */
16437
16438 static void
16439 HLE_Fixup1 (int bytemode, int sizeflag)
16440 {
16441   if (modrm.mod != 3
16442       && (prefixes & PREFIX_LOCK) != 0)
16443     {
16444       if (prefixes & PREFIX_REPZ)
16445         all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
16446       if (prefixes & PREFIX_REPNZ)
16447         all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
16448     }
16449
16450   OP_E (bytemode, sizeflag);
16451 }
16452
16453 /* Similar to OP_E.  But the 0xf2/0xf3 prefixes should be displayed as
16454    "xacquire"/"xrelease" for memory operand.  No check for LOCK prefix.
16455  */
16456
16457 static void
16458 HLE_Fixup2 (int bytemode, int sizeflag)
16459 {
16460   if (modrm.mod != 3)
16461     {
16462       if (prefixes & PREFIX_REPZ)
16463         all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
16464       if (prefixes & PREFIX_REPNZ)
16465         all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
16466     }
16467
16468   OP_E (bytemode, sizeflag);
16469 }
16470
16471 /* Similar to OP_E.  But the 0xf3 prefixes should be displayed as
16472    "xrelease" for memory operand.  No check for LOCK prefix.   */
16473
16474 static void
16475 HLE_Fixup3 (int bytemode, int sizeflag)
16476 {
16477   if (modrm.mod != 3
16478       && last_repz_prefix > last_repnz_prefix
16479       && (prefixes & PREFIX_REPZ) != 0)
16480     all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
16481
16482   OP_E (bytemode, sizeflag);
16483 }
16484
16485 static void
16486 CMPXCHG8B_Fixup (int bytemode, int sizeflag)
16487 {
16488   USED_REX (REX_W);
16489   if (rex & REX_W)
16490     {
16491       /* Change cmpxchg8b to cmpxchg16b.  */
16492       char *p = mnemonicendp - 2;
16493       mnemonicendp = stpcpy (p, "16b");
16494       bytemode = o_mode;
16495     }
16496   else if ((prefixes & PREFIX_LOCK) != 0)
16497     {
16498       if (prefixes & PREFIX_REPZ)
16499         all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
16500       if (prefixes & PREFIX_REPNZ)
16501         all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
16502     }
16503
16504   OP_M (bytemode, sizeflag);
16505 }
16506
16507 static void
16508 XMM_Fixup (int reg, int sizeflag ATTRIBUTE_UNUSED)
16509 {
16510   const char **names;
16511
16512   if (need_vex)
16513     {
16514       switch (vex.length)
16515         {
16516         case 128:
16517           names = names_xmm;
16518           break;
16519         case 256:
16520           names = names_ymm;
16521           break;
16522         default:
16523           abort ();
16524         }
16525     }
16526   else
16527     names = names_xmm;
16528   oappend (names[reg]);
16529 }
16530
16531 static void
16532 CRC32_Fixup (int bytemode, int sizeflag)
16533 {
16534   /* Add proper suffix to "crc32".  */
16535   char *p = mnemonicendp;
16536
16537   switch (bytemode)
16538     {
16539     case b_mode:
16540       if (intel_syntax)
16541         goto skip;
16542
16543       *p++ = 'b';
16544       break;
16545     case v_mode:
16546       if (intel_syntax)
16547         goto skip;
16548
16549       USED_REX (REX_W);
16550       if (rex & REX_W)
16551         *p++ = 'q';
16552       else
16553         {
16554           if (sizeflag & DFLAG)
16555             *p++ = 'l';
16556           else
16557             *p++ = 'w';
16558           used_prefixes |= (prefixes & PREFIX_DATA);
16559         }
16560       break;
16561     default:
16562       oappend (INTERNAL_DISASSEMBLER_ERROR);
16563       break;
16564     }
16565   mnemonicendp = p;
16566   *p = '\0';
16567
16568 skip:
16569   if (modrm.mod == 3)
16570     {
16571       int add;
16572
16573       /* Skip mod/rm byte.  */
16574       MODRM_CHECK;
16575       codep++;
16576
16577       USED_REX (REX_B);
16578       add = (rex & REX_B) ? 8 : 0;
16579       if (bytemode == b_mode)
16580         {
16581           USED_REX (0);
16582           if (rex)
16583             oappend (names8rex[modrm.rm + add]);
16584           else
16585             oappend (names8[modrm.rm + add]);
16586         }
16587       else
16588         {
16589           USED_REX (REX_W);
16590           if (rex & REX_W)
16591             oappend (names64[modrm.rm + add]);
16592           else if ((prefixes & PREFIX_DATA))
16593             oappend (names16[modrm.rm + add]);
16594           else
16595             oappend (names32[modrm.rm + add]);
16596         }
16597     }
16598   else
16599     OP_E (bytemode, sizeflag);
16600 }
16601
16602 static void
16603 FXSAVE_Fixup (int bytemode, int sizeflag)
16604 {
16605   /* Add proper suffix to "fxsave" and "fxrstor".  */
16606   USED_REX (REX_W);
16607   if (rex & REX_W)
16608     {
16609       char *p = mnemonicendp;
16610       *p++ = '6';
16611       *p++ = '4';
16612       *p = '\0';
16613       mnemonicendp = p;
16614     }
16615   OP_M (bytemode, sizeflag);
16616 }
16617
16618 /* Display the destination register operand for instructions with
16619    VEX. */
16620
16621 static void
16622 OP_VEX (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
16623 {
16624   int reg;
16625   const char **names;
16626
16627   if (!need_vex)
16628     abort ();
16629
16630   if (!need_vex_reg)
16631     return;
16632
16633   reg = vex.register_specifier;
16634   if (vex.evex)
16635     {
16636       if (!vex.v)
16637         reg += 16;
16638     }
16639
16640   if (bytemode == vex_scalar_mode)
16641     {
16642       oappend (names_xmm[reg]);
16643       return;
16644     }
16645
16646   switch (vex.length)
16647     {
16648     case 128:
16649       switch (bytemode)
16650         {
16651         case vex_mode:
16652         case vex128_mode:
16653         case vex_vsib_q_w_dq_mode:
16654         case vex_vsib_q_w_d_mode:
16655           names = names_xmm;
16656           break;
16657         case dq_mode:
16658           if (vex.w)
16659             names = names64;
16660           else
16661             names = names32;
16662           break;
16663         case mask_bd_mode:
16664         case mask_mode:
16665           names = names_mask;
16666           break;
16667         default:
16668           abort ();
16669           return;
16670         }
16671       break;
16672     case 256:
16673       switch (bytemode)
16674         {
16675         case vex_mode:
16676         case vex256_mode:
16677           names = names_ymm;
16678           break;
16679         case vex_vsib_q_w_dq_mode:
16680         case vex_vsib_q_w_d_mode:
16681           names = vex.w ? names_ymm : names_xmm;
16682           break;
16683         case mask_bd_mode:
16684         case mask_mode:
16685           names = names_mask;
16686           break;
16687         default:
16688           abort ();
16689           return;
16690         }
16691       break;
16692     case 512:
16693       names = names_zmm;
16694       break;
16695     default:
16696       abort ();
16697       break;
16698     }
16699   oappend (names[reg]);
16700 }
16701
16702 /* Get the VEX immediate byte without moving codep.  */
16703
16704 static unsigned char
16705 get_vex_imm8 (int sizeflag, int opnum)
16706 {
16707   int bytes_before_imm = 0;
16708
16709   if (modrm.mod != 3)
16710     {
16711       /* There are SIB/displacement bytes.  */
16712       if ((sizeflag & AFLAG) || address_mode == mode_64bit)
16713         {
16714           /* 32/64 bit address mode */
16715           int base = modrm.rm;
16716
16717           /* Check SIB byte.  */
16718           if (base == 4)
16719             {
16720               FETCH_DATA (the_info, codep + 1);
16721               base = *codep & 7;
16722               /* When decoding the third source, don't increase
16723                  bytes_before_imm as this has already been incremented
16724                  by one in OP_E_memory while decoding the second
16725                  source operand.  */
16726               if (opnum == 0)
16727                 bytes_before_imm++;
16728             }
16729
16730           /* Don't increase bytes_before_imm when decoding the third source,
16731              it has already been incremented by OP_E_memory while decoding
16732              the second source operand.  */
16733           if (opnum == 0)
16734             {
16735               switch (modrm.mod)
16736                 {
16737                   case 0:
16738                     /* When modrm.rm == 5 or modrm.rm == 4 and base in
16739                        SIB == 5, there is a 4 byte displacement.  */
16740                     if (base != 5)
16741                       /* No displacement. */
16742                       break;
16743                   case 2:
16744                     /* 4 byte displacement.  */
16745                     bytes_before_imm += 4;
16746                     break;
16747                   case 1:
16748                     /* 1 byte displacement.  */
16749                     bytes_before_imm++;
16750                     break;
16751                 }
16752             }
16753         }
16754       else
16755         {
16756           /* 16 bit address mode */
16757           /* Don't increase bytes_before_imm when decoding the third source,
16758              it has already been incremented by OP_E_memory while decoding
16759              the second source operand.  */
16760           if (opnum == 0)
16761             {
16762               switch (modrm.mod)
16763                 {
16764                 case 0:
16765                   /* When modrm.rm == 6, there is a 2 byte displacement.  */
16766                   if (modrm.rm != 6)
16767                     /* No displacement. */
16768                     break;
16769                 case 2:
16770                   /* 2 byte displacement.  */
16771                   bytes_before_imm += 2;
16772                   break;
16773                 case 1:
16774                   /* 1 byte displacement: when decoding the third source,
16775                      don't increase bytes_before_imm as this has already
16776                      been incremented by one in OP_E_memory while decoding
16777                      the second source operand.  */
16778                   if (opnum == 0)
16779                     bytes_before_imm++;
16780
16781                   break;
16782                 }
16783             }
16784         }
16785     }
16786
16787   FETCH_DATA (the_info, codep + bytes_before_imm + 1);
16788   return codep [bytes_before_imm];
16789 }
16790
16791 static void
16792 OP_EX_VexReg (int bytemode, int sizeflag, int reg)
16793 {
16794   const char **names;
16795
16796   if (reg == -1 && modrm.mod != 3)
16797     {
16798       OP_E_memory (bytemode, sizeflag);
16799       return;
16800     }
16801   else
16802     {
16803       if (reg == -1)
16804         {
16805           reg = modrm.rm;
16806           USED_REX (REX_B);
16807           if (rex & REX_B)
16808             reg += 8;
16809         }
16810       else if (reg > 7 && address_mode != mode_64bit)
16811         BadOp ();
16812     }
16813
16814   switch (vex.length)
16815     {
16816     case 128:
16817       names = names_xmm;
16818       break;
16819     case 256:
16820       names = names_ymm;
16821       break;
16822     default:
16823       abort ();
16824     }
16825   oappend (names[reg]);
16826 }
16827
16828 static void
16829 OP_EX_VexImmW (int bytemode, int sizeflag)
16830 {
16831   int reg = -1;
16832   static unsigned char vex_imm8;
16833
16834   if (vex_w_done == 0)
16835     {
16836       vex_w_done = 1;
16837
16838       /* Skip mod/rm byte.  */
16839       MODRM_CHECK;
16840       codep++;
16841
16842       vex_imm8 = get_vex_imm8 (sizeflag, 0);
16843
16844       if (vex.w)
16845           reg = vex_imm8 >> 4;
16846
16847       OP_EX_VexReg (bytemode, sizeflag, reg);
16848     }
16849   else if (vex_w_done == 1)
16850     {
16851       vex_w_done = 2;
16852
16853       if (!vex.w)
16854           reg = vex_imm8 >> 4;
16855
16856       OP_EX_VexReg (bytemode, sizeflag, reg);
16857     }
16858   else
16859     {
16860       /* Output the imm8 directly.  */
16861       scratchbuf[0] = '$';
16862       print_operand_value (scratchbuf + 1, 1, vex_imm8 & 0xf);
16863       oappend_maybe_intel (scratchbuf);
16864       scratchbuf[0] = '\0';
16865       codep++;
16866     }
16867 }
16868
16869 static void
16870 OP_Vex_2src (int bytemode, int sizeflag)
16871 {
16872   if (modrm.mod == 3)
16873     {
16874       int reg = modrm.rm;
16875       USED_REX (REX_B);
16876       if (rex & REX_B)
16877         reg += 8;
16878       oappend (names_xmm[reg]);
16879     }
16880   else
16881     {
16882       if (intel_syntax
16883           && (bytemode == v_mode || bytemode == v_swap_mode))
16884         {
16885           bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
16886           used_prefixes |= (prefixes & PREFIX_DATA);
16887         }
16888       OP_E (bytemode, sizeflag);
16889     }
16890 }
16891
16892 static void
16893 OP_Vex_2src_1 (int bytemode, int sizeflag)
16894 {
16895   if (modrm.mod == 3)
16896     {
16897       /* Skip mod/rm byte.   */
16898       MODRM_CHECK;
16899       codep++;
16900     }
16901
16902   if (vex.w)
16903     oappend (names_xmm[vex.register_specifier]);
16904   else
16905     OP_Vex_2src (bytemode, sizeflag);
16906 }
16907
16908 static void
16909 OP_Vex_2src_2 (int bytemode, int sizeflag)
16910 {
16911   if (vex.w)
16912     OP_Vex_2src (bytemode, sizeflag);
16913   else
16914     oappend (names_xmm[vex.register_specifier]);
16915 }
16916
16917 static void
16918 OP_EX_VexW (int bytemode, int sizeflag)
16919 {
16920   int reg = -1;
16921
16922   if (!vex_w_done)
16923     {
16924       vex_w_done = 1;
16925
16926       /* Skip mod/rm byte.  */
16927       MODRM_CHECK;
16928       codep++;
16929
16930       if (vex.w)
16931         reg = get_vex_imm8 (sizeflag, 0) >> 4;
16932     }
16933   else
16934     {
16935       if (!vex.w)
16936         reg = get_vex_imm8 (sizeflag, 1) >> 4;
16937     }
16938
16939   OP_EX_VexReg (bytemode, sizeflag, reg);
16940 }
16941
16942 static void
16943 VEXI4_Fixup (int bytemode ATTRIBUTE_UNUSED,
16944              int sizeflag ATTRIBUTE_UNUSED)
16945 {
16946   /* Skip the immediate byte and check for invalid bits.  */
16947   FETCH_DATA (the_info, codep + 1);
16948   if (*codep++ & 0xf)
16949     BadOp ();
16950 }
16951
16952 static void
16953 OP_REG_VexI4 (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
16954 {
16955   int reg;
16956   const char **names;
16957
16958   FETCH_DATA (the_info, codep + 1);
16959   reg = *codep++;
16960
16961   if (bytemode != x_mode)
16962     abort ();
16963
16964   if (reg & 0xf)
16965       BadOp ();
16966
16967   reg >>= 4;
16968   if (reg > 7 && address_mode != mode_64bit)
16969     BadOp ();
16970
16971   switch (vex.length)
16972     {
16973     case 128:
16974       names = names_xmm;
16975       break;
16976     case 256:
16977       names = names_ymm;
16978       break;
16979     default:
16980       abort ();
16981     }
16982   oappend (names[reg]);
16983 }
16984
16985 static void
16986 OP_XMM_VexW (int bytemode, int sizeflag)
16987 {
16988   /* Turn off the REX.W bit since it is used for swapping operands
16989      now.  */
16990   rex &= ~REX_W;
16991   OP_XMM (bytemode, sizeflag);
16992 }
16993
16994 static void
16995 OP_EX_Vex (int bytemode, int sizeflag)
16996 {
16997   if (modrm.mod != 3)
16998     {
16999       if (vex.register_specifier != 0)
17000         BadOp ();
17001       need_vex_reg = 0;
17002     }
17003   OP_EX (bytemode, sizeflag);
17004 }
17005
17006 static void
17007 OP_XMM_Vex (int bytemode, int sizeflag)
17008 {
17009   if (modrm.mod != 3)
17010     {
17011       if (vex.register_specifier != 0)
17012         BadOp ();
17013       need_vex_reg = 0;
17014     }
17015   OP_XMM (bytemode, sizeflag);
17016 }
17017
17018 static void
17019 VZERO_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
17020 {
17021   switch (vex.length)
17022     {
17023     case 128:
17024       mnemonicendp = stpcpy (obuf, "vzeroupper");
17025       break;
17026     case 256:
17027       mnemonicendp = stpcpy (obuf, "vzeroall");
17028       break;
17029     default:
17030       abort ();
17031     }
17032 }
17033
17034 static struct op vex_cmp_op[] =
17035 {
17036   { STRING_COMMA_LEN ("eq") },
17037   { STRING_COMMA_LEN ("lt") },
17038   { STRING_COMMA_LEN ("le") },
17039   { STRING_COMMA_LEN ("unord") },
17040   { STRING_COMMA_LEN ("neq") },
17041   { STRING_COMMA_LEN ("nlt") },
17042   { STRING_COMMA_LEN ("nle") },
17043   { STRING_COMMA_LEN ("ord") },
17044   { STRING_COMMA_LEN ("eq_uq") },
17045   { STRING_COMMA_LEN ("nge") },
17046   { STRING_COMMA_LEN ("ngt") },
17047   { STRING_COMMA_LEN ("false") },
17048   { STRING_COMMA_LEN ("neq_oq") },
17049   { STRING_COMMA_LEN ("ge") },
17050   { STRING_COMMA_LEN ("gt") },
17051   { STRING_COMMA_LEN ("true") },
17052   { STRING_COMMA_LEN ("eq_os") },
17053   { STRING_COMMA_LEN ("lt_oq") },
17054   { STRING_COMMA_LEN ("le_oq") },
17055   { STRING_COMMA_LEN ("unord_s") },
17056   { STRING_COMMA_LEN ("neq_us") },
17057   { STRING_COMMA_LEN ("nlt_uq") },
17058   { STRING_COMMA_LEN ("nle_uq") },
17059   { STRING_COMMA_LEN ("ord_s") },
17060   { STRING_COMMA_LEN ("eq_us") },
17061   { STRING_COMMA_LEN ("nge_uq") },
17062   { STRING_COMMA_LEN ("ngt_uq") },
17063   { STRING_COMMA_LEN ("false_os") },
17064   { STRING_COMMA_LEN ("neq_os") },
17065   { STRING_COMMA_LEN ("ge_oq") },
17066   { STRING_COMMA_LEN ("gt_oq") },
17067   { STRING_COMMA_LEN ("true_us") },
17068 };
17069
17070 static void
17071 VCMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
17072 {
17073   unsigned int cmp_type;
17074
17075   FETCH_DATA (the_info, codep + 1);
17076   cmp_type = *codep++ & 0xff;
17077   if (cmp_type < ARRAY_SIZE (vex_cmp_op))
17078     {
17079       char suffix [3];
17080       char *p = mnemonicendp - 2;
17081       suffix[0] = p[0];
17082       suffix[1] = p[1];
17083       suffix[2] = '\0';
17084       sprintf (p, "%s%s", vex_cmp_op[cmp_type].name, suffix);
17085       mnemonicendp += vex_cmp_op[cmp_type].len;
17086     }
17087   else
17088     {
17089       /* We have a reserved extension byte.  Output it directly.  */
17090       scratchbuf[0] = '$';
17091       print_operand_value (scratchbuf + 1, 1, cmp_type);
17092       oappend_maybe_intel (scratchbuf);
17093       scratchbuf[0] = '\0';
17094     }
17095 }
17096
17097 static void
17098 VPCMP_Fixup (int bytemode ATTRIBUTE_UNUSED,
17099              int sizeflag ATTRIBUTE_UNUSED)
17100 {
17101   unsigned int cmp_type;
17102
17103   if (!vex.evex)
17104     abort ();
17105
17106   FETCH_DATA (the_info, codep + 1);
17107   cmp_type = *codep++ & 0xff;
17108   /* There are aliases for immediates 0, 1, 2, 4, 5, 6.
17109      If it's the case, print suffix, otherwise - print the immediate.  */
17110   if (cmp_type < ARRAY_SIZE (simd_cmp_op)
17111       && cmp_type != 3
17112       && cmp_type != 7)
17113     {
17114       char suffix [3];
17115       char *p = mnemonicendp - 2;
17116
17117       /* vpcmp* can have both one- and two-lettered suffix.  */
17118       if (p[0] == 'p')
17119         {
17120           p++;
17121           suffix[0] = p[0];
17122           suffix[1] = '\0';
17123         }
17124       else
17125         {
17126           suffix[0] = p[0];
17127           suffix[1] = p[1];
17128           suffix[2] = '\0';
17129         }
17130
17131       sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
17132       mnemonicendp += simd_cmp_op[cmp_type].len;
17133     }
17134   else
17135     {
17136       /* We have a reserved extension byte.  Output it directly.  */
17137       scratchbuf[0] = '$';
17138       print_operand_value (scratchbuf + 1, 1, cmp_type);
17139       oappend_maybe_intel (scratchbuf);
17140       scratchbuf[0] = '\0';
17141     }
17142 }
17143
17144 static const struct op pclmul_op[] =
17145 {
17146   { STRING_COMMA_LEN ("lql") },
17147   { STRING_COMMA_LEN ("hql") },
17148   { STRING_COMMA_LEN ("lqh") },
17149   { STRING_COMMA_LEN ("hqh") }
17150 };
17151
17152 static void
17153 PCLMUL_Fixup (int bytemode ATTRIBUTE_UNUSED,
17154               int sizeflag ATTRIBUTE_UNUSED)
17155 {
17156   unsigned int pclmul_type;
17157
17158   FETCH_DATA (the_info, codep + 1);
17159   pclmul_type = *codep++ & 0xff;
17160   switch (pclmul_type)
17161     {
17162     case 0x10:
17163       pclmul_type = 2;
17164       break;
17165     case 0x11:
17166       pclmul_type = 3;
17167       break;
17168     default:
17169       break;
17170     }
17171   if (pclmul_type < ARRAY_SIZE (pclmul_op))
17172     {
17173       char suffix [4];
17174       char *p = mnemonicendp - 3;
17175       suffix[0] = p[0];
17176       suffix[1] = p[1];
17177       suffix[2] = p[2];
17178       suffix[3] = '\0';
17179       sprintf (p, "%s%s", pclmul_op[pclmul_type].name, suffix);
17180       mnemonicendp += pclmul_op[pclmul_type].len;
17181     }
17182   else
17183     {
17184       /* We have a reserved extension byte.  Output it directly.  */
17185       scratchbuf[0] = '$';
17186       print_operand_value (scratchbuf + 1, 1, pclmul_type);
17187       oappend_maybe_intel (scratchbuf);
17188       scratchbuf[0] = '\0';
17189     }
17190 }
17191
17192 static void
17193 MOVBE_Fixup (int bytemode, int sizeflag)
17194 {
17195   /* Add proper suffix to "movbe".  */
17196   char *p = mnemonicendp;
17197
17198   switch (bytemode)
17199     {
17200     case v_mode:
17201       if (intel_syntax)
17202         goto skip;
17203
17204       USED_REX (REX_W);
17205       if (sizeflag & SUFFIX_ALWAYS)
17206         {
17207           if (rex & REX_W)
17208             *p++ = 'q';
17209           else
17210             {
17211               if (sizeflag & DFLAG)
17212                 *p++ = 'l';
17213               else
17214                 *p++ = 'w';
17215               used_prefixes |= (prefixes & PREFIX_DATA);
17216             }
17217         }
17218       break;
17219     default:
17220       oappend (INTERNAL_DISASSEMBLER_ERROR);
17221       break;
17222     }
17223   mnemonicendp = p;
17224   *p = '\0';
17225
17226 skip:
17227   OP_M (bytemode, sizeflag);
17228 }
17229
17230 static void
17231 OP_LWPCB_E (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
17232 {
17233   int reg;
17234   const char **names;
17235
17236   /* Skip mod/rm byte.  */
17237   MODRM_CHECK;
17238   codep++;
17239
17240   if (vex.w)
17241     names = names64;
17242   else
17243     names = names32;
17244
17245   reg = modrm.rm;
17246   USED_REX (REX_B);
17247   if (rex & REX_B)
17248     reg += 8;
17249
17250   oappend (names[reg]);
17251 }
17252
17253 static void
17254 OP_LWP_E (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
17255 {
17256   const char **names;
17257
17258   if (vex.w)
17259     names = names64;
17260   else
17261     names = names32;
17262
17263   oappend (names[vex.register_specifier]);
17264 }
17265
17266 static void
17267 OP_Mask (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
17268 {
17269   if (!vex.evex
17270       || (bytemode != mask_mode && bytemode != mask_bd_mode))
17271     abort ();
17272
17273   USED_REX (REX_R);
17274   if ((rex & REX_R) != 0 || !vex.r)
17275     {
17276       BadOp ();
17277       return;
17278     }
17279
17280   oappend (names_mask [modrm.reg]);
17281 }
17282
17283 static void
17284 OP_Rounding (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
17285 {
17286   if (!vex.evex
17287       || (bytemode != evex_rounding_mode
17288           && bytemode != evex_sae_mode))
17289     abort ();
17290   if (modrm.mod == 3 && vex.b)
17291     switch (bytemode)
17292       {
17293       case evex_rounding_mode:
17294         oappend (names_rounding[vex.ll]);
17295         break;
17296       case evex_sae_mode:
17297         oappend ("{sae}");
17298         break;
17299       default:
17300         break;
17301       }
17302 }