x86/Intel: disassemble vcvt{,u}si2s{d,s} with correct operand order
[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_IGNORED_SHIFT    16
226 #define PREFIX_IGNORED_REPZ     (PREFIX_REPZ << PREFIX_IGNORED_SHIFT)
227 #define PREFIX_IGNORED_REPNZ    (PREFIX_REPNZ << PREFIX_IGNORED_SHIFT)
228 #define PREFIX_IGNORED_DATA     (PREFIX_DATA << PREFIX_IGNORED_SHIFT)
229 #define PREFIX_IGNORED_ADDR     (PREFIX_ADDR << PREFIX_IGNORED_SHIFT)
230 #define PREFIX_IGNORED_LOCK     (PREFIX_LOCK << PREFIX_IGNORED_SHIFT)
231
232 /* Opcode prefixes.  */
233 #define PREFIX_OPCODE           (PREFIX_REPZ \
234                                  | PREFIX_REPNZ \
235                                  | PREFIX_DATA)
236
237 /* Prefixes ignored.  */
238 #define PREFIX_IGNORED          (PREFIX_IGNORED_REPZ \
239                                  | PREFIX_IGNORED_REPNZ \
240                                  | PREFIX_IGNORED_DATA)
241
242 #define XX { NULL, 0 }
243 #define Bad_Opcode NULL, { { NULL, 0 } }, 0
244
245 #define Eb { OP_E, b_mode }
246 #define Ebnd { OP_E, bnd_mode }
247 #define EbS { OP_E, b_swap_mode }
248 #define Ev { OP_E, v_mode }
249 #define Ev_bnd { OP_E, v_bnd_mode }
250 #define EvS { OP_E, v_swap_mode }
251 #define Ed { OP_E, d_mode }
252 #define Edq { OP_E, dq_mode }
253 #define Edqw { OP_E, dqw_mode }
254 #define EdqwS { OP_E, dqw_swap_mode }
255 #define Edqb { OP_E, dqb_mode }
256 #define Edb { OP_E, db_mode }
257 #define Edw { OP_E, dw_mode }
258 #define Edqd { OP_E, dqd_mode }
259 #define Eq { OP_E, q_mode }
260 #define indirEv { OP_indirE, stack_v_mode }
261 #define indirEp { OP_indirE, f_mode }
262 #define stackEv { OP_E, stack_v_mode }
263 #define Em { OP_E, m_mode }
264 #define Ew { OP_E, w_mode }
265 #define M { OP_M, 0 }           /* lea, lgdt, etc. */
266 #define Ma { OP_M, a_mode }
267 #define Mb { OP_M, b_mode }
268 #define Md { OP_M, d_mode }
269 #define Mo { OP_M, o_mode }
270 #define Mp { OP_M, f_mode }             /* 32 or 48 bit memory operand for LDS, LES etc */
271 #define Mq { OP_M, q_mode }
272 #define Mx { OP_M, x_mode }
273 #define Mxmm { OP_M, xmm_mode }
274 #define Gb { OP_G, b_mode }
275 #define Gbnd { OP_G, bnd_mode }
276 #define Gv { OP_G, v_mode }
277 #define Gd { OP_G, d_mode }
278 #define Gdq { OP_G, dq_mode }
279 #define Gm { OP_G, m_mode }
280 #define Gw { OP_G, w_mode }
281 #define Rd { OP_R, d_mode }
282 #define Rdq { OP_R, dq_mode }
283 #define Rm { OP_R, m_mode }
284 #define Ib { OP_I, b_mode }
285 #define sIb { OP_sI, b_mode }   /* sign extened byte */
286 #define sIbT { OP_sI, b_T_mode } /* sign extened byte like 'T' */
287 #define Iv { OP_I, v_mode }
288 #define sIv { OP_sI, v_mode }
289 #define Iq { OP_I, q_mode }
290 #define Iv64 { OP_I64, v_mode }
291 #define Iw { OP_I, w_mode }
292 #define I1 { OP_I, const_1_mode }
293 #define Jb { OP_J, b_mode }
294 #define Jv { OP_J, v_mode }
295 #define Cm { OP_C, m_mode }
296 #define Dm { OP_D, m_mode }
297 #define Td { OP_T, d_mode }
298 #define Skip_MODRM { OP_Skip_MODRM, 0 }
299
300 #define RMeAX { OP_REG, eAX_reg }
301 #define RMeBX { OP_REG, eBX_reg }
302 #define RMeCX { OP_REG, eCX_reg }
303 #define RMeDX { OP_REG, eDX_reg }
304 #define RMeSP { OP_REG, eSP_reg }
305 #define RMeBP { OP_REG, eBP_reg }
306 #define RMeSI { OP_REG, eSI_reg }
307 #define RMeDI { OP_REG, eDI_reg }
308 #define RMrAX { OP_REG, rAX_reg }
309 #define RMrBX { OP_REG, rBX_reg }
310 #define RMrCX { OP_REG, rCX_reg }
311 #define RMrDX { OP_REG, rDX_reg }
312 #define RMrSP { OP_REG, rSP_reg }
313 #define RMrBP { OP_REG, rBP_reg }
314 #define RMrSI { OP_REG, rSI_reg }
315 #define RMrDI { OP_REG, rDI_reg }
316 #define RMAL { OP_REG, al_reg }
317 #define RMCL { OP_REG, cl_reg }
318 #define RMDL { OP_REG, dl_reg }
319 #define RMBL { OP_REG, bl_reg }
320 #define RMAH { OP_REG, ah_reg }
321 #define RMCH { OP_REG, ch_reg }
322 #define RMDH { OP_REG, dh_reg }
323 #define RMBH { OP_REG, bh_reg }
324 #define RMAX { OP_REG, ax_reg }
325 #define RMDX { OP_REG, dx_reg }
326
327 #define eAX { OP_IMREG, eAX_reg }
328 #define eBX { OP_IMREG, eBX_reg }
329 #define eCX { OP_IMREG, eCX_reg }
330 #define eDX { OP_IMREG, eDX_reg }
331 #define eSP { OP_IMREG, eSP_reg }
332 #define eBP { OP_IMREG, eBP_reg }
333 #define eSI { OP_IMREG, eSI_reg }
334 #define eDI { OP_IMREG, eDI_reg }
335 #define AL { OP_IMREG, al_reg }
336 #define CL { OP_IMREG, cl_reg }
337 #define DL { OP_IMREG, dl_reg }
338 #define BL { OP_IMREG, bl_reg }
339 #define AH { OP_IMREG, ah_reg }
340 #define CH { OP_IMREG, ch_reg }
341 #define DH { OP_IMREG, dh_reg }
342 #define BH { OP_IMREG, bh_reg }
343 #define AX { OP_IMREG, ax_reg }
344 #define DX { OP_IMREG, dx_reg }
345 #define zAX { OP_IMREG, z_mode_ax_reg }
346 #define indirDX { OP_IMREG, indir_dx_reg }
347
348 #define Sw { OP_SEG, w_mode }
349 #define Sv { OP_SEG, v_mode }
350 #define Ap { OP_DIR, 0 }
351 #define Ob { OP_OFF64, b_mode }
352 #define Ov { OP_OFF64, v_mode }
353 #define Xb { OP_DSreg, eSI_reg }
354 #define Xv { OP_DSreg, eSI_reg }
355 #define Xz { OP_DSreg, eSI_reg }
356 #define Yb { OP_ESreg, eDI_reg }
357 #define Yv { OP_ESreg, eDI_reg }
358 #define DSBX { OP_DSreg, eBX_reg }
359
360 #define es { OP_REG, es_reg }
361 #define ss { OP_REG, ss_reg }
362 #define cs { OP_REG, cs_reg }
363 #define ds { OP_REG, ds_reg }
364 #define fs { OP_REG, fs_reg }
365 #define gs { OP_REG, gs_reg }
366
367 #define MX { OP_MMX, 0 }
368 #define XM { OP_XMM, 0 }
369 #define XMScalar { OP_XMM, scalar_mode }
370 #define XMGatherQ { OP_XMM, vex_vsib_q_w_dq_mode }
371 #define XMM { OP_XMM, xmm_mode }
372 #define XMxmmq { OP_XMM, xmmq_mode }
373 #define EM { OP_EM, v_mode }
374 #define EMS { OP_EM, v_swap_mode }
375 #define EMd { OP_EM, d_mode }
376 #define EMx { OP_EM, x_mode }
377 #define EXw { OP_EX, w_mode }
378 #define EXd { OP_EX, d_mode }
379 #define EXdScalar { OP_EX, d_scalar_mode }
380 #define EXdS { OP_EX, d_swap_mode }
381 #define EXdScalarS { OP_EX, d_scalar_swap_mode }
382 #define EXq { OP_EX, q_mode }
383 #define EXqScalar { OP_EX, q_scalar_mode }
384 #define EXqScalarS { OP_EX, q_scalar_swap_mode }
385 #define EXqS { OP_EX, q_swap_mode }
386 #define EXx { OP_EX, x_mode }
387 #define EXxS { OP_EX, x_swap_mode }
388 #define EXxmm { OP_EX, xmm_mode }
389 #define EXymm { OP_EX, ymm_mode }
390 #define EXxmmq { OP_EX, xmmq_mode }
391 #define EXEvexHalfBcstXmmq { OP_EX, evex_half_bcst_xmmq_mode }
392 #define EXxmm_mb { OP_EX, xmm_mb_mode }
393 #define EXxmm_mw { OP_EX, xmm_mw_mode }
394 #define EXxmm_md { OP_EX, xmm_md_mode }
395 #define EXxmm_mq { OP_EX, xmm_mq_mode }
396 #define EXxmm_mdq { OP_EX, xmm_mdq_mode }
397 #define EXxmmdw { OP_EX, xmmdw_mode }
398 #define EXxmmqd { OP_EX, xmmqd_mode }
399 #define EXymmq { OP_EX, ymmq_mode }
400 #define EXVexWdq { OP_EX, vex_w_dq_mode }
401 #define EXVexWdqScalar { OP_EX, vex_scalar_w_dq_mode }
402 #define EXEvexXGscat { OP_EX, evex_x_gscat_mode }
403 #define EXEvexXNoBcst { OP_EX, evex_x_nobcst_mode }
404 #define MS { OP_MS, v_mode }
405 #define XS { OP_XS, v_mode }
406 #define EMCq { OP_EMC, q_mode }
407 #define MXC { OP_MXC, 0 }
408 #define OPSUF { OP_3DNowSuffix, 0 }
409 #define CMP { CMP_Fixup, 0 }
410 #define XMM0 { XMM_Fixup, 0 }
411 #define FXSAVE { FXSAVE_Fixup, 0 }
412 #define Vex_2src_1 { OP_Vex_2src_1, 0 }
413 #define Vex_2src_2 { OP_Vex_2src_2, 0 }
414
415 #define Vex { OP_VEX, vex_mode }
416 #define VexScalar { OP_VEX, vex_scalar_mode }
417 #define VexGatherQ { OP_VEX, vex_vsib_q_w_dq_mode }
418 #define Vex128 { OP_VEX, vex128_mode }
419 #define Vex256 { OP_VEX, vex256_mode }
420 #define VexGdq { OP_VEX, dq_mode }
421 #define VexI4 { VEXI4_Fixup, 0}
422 #define EXdVex { OP_EX_Vex, d_mode }
423 #define EXdVexS { OP_EX_Vex, d_swap_mode }
424 #define EXdVexScalarS { OP_EX_Vex, d_scalar_swap_mode }
425 #define EXqVex { OP_EX_Vex, q_mode }
426 #define EXqVexS { OP_EX_Vex, q_swap_mode }
427 #define EXqVexScalarS { OP_EX_Vex, q_scalar_swap_mode }
428 #define EXVexW { OP_EX_VexW, x_mode }
429 #define EXdVexW { OP_EX_VexW, d_mode }
430 #define EXqVexW { OP_EX_VexW, q_mode }
431 #define EXVexImmW { OP_EX_VexImmW, x_mode }
432 #define XMVex { OP_XMM_Vex, 0 }
433 #define XMVexScalar { OP_XMM_Vex, scalar_mode }
434 #define XMVexW { OP_XMM_VexW, 0 }
435 #define XMVexI4 { OP_REG_VexI4, x_mode }
436 #define PCLMUL { PCLMUL_Fixup, 0 }
437 #define VZERO { VZERO_Fixup, 0 }
438 #define VCMP { VCMP_Fixup, 0 }
439 #define VPCMP { VPCMP_Fixup, 0 }
440
441 #define EXxEVexR { OP_Rounding, evex_rounding_mode }
442 #define EXxEVexS { OP_Rounding, evex_sae_mode }
443
444 #define XMask { OP_Mask, mask_mode }
445 #define MaskG { OP_G, mask_mode }
446 #define MaskE { OP_E, mask_mode }
447 #define MaskBDE { OP_E, mask_bd_mode }
448 #define MaskR { OP_R, mask_mode }
449 #define MaskVex { OP_VEX, mask_mode }
450
451 #define MVexVSIBDWpX { OP_M, vex_vsib_d_w_dq_mode }
452 #define MVexVSIBDQWpX { OP_M, vex_vsib_d_w_d_mode }
453 #define MVexVSIBQWpX { OP_M, vex_vsib_q_w_dq_mode }
454 #define MVexVSIBQDWpX { OP_M, vex_vsib_q_w_d_mode }
455
456 /* Used handle "rep" prefix for string instructions.  */
457 #define Xbr { REP_Fixup, eSI_reg }
458 #define Xvr { REP_Fixup, eSI_reg }
459 #define Ybr { REP_Fixup, eDI_reg }
460 #define Yvr { REP_Fixup, eDI_reg }
461 #define Yzr { REP_Fixup, eDI_reg }
462 #define indirDXr { REP_Fixup, indir_dx_reg }
463 #define ALr { REP_Fixup, al_reg }
464 #define eAXr { REP_Fixup, eAX_reg }
465
466 /* Used handle HLE prefix for lockable instructions.  */
467 #define Ebh1 { HLE_Fixup1, b_mode }
468 #define Evh1 { HLE_Fixup1, v_mode }
469 #define Ebh2 { HLE_Fixup2, b_mode }
470 #define Evh2 { HLE_Fixup2, v_mode }
471 #define Ebh3 { HLE_Fixup3, b_mode }
472 #define Evh3 { HLE_Fixup3, v_mode }
473
474 #define BND { BND_Fixup, 0 }
475
476 #define cond_jump_flag { NULL, cond_jump_mode }
477 #define loop_jcxz_flag { NULL, loop_jcxz_mode }
478
479 /* bits in sizeflag */
480 #define SUFFIX_ALWAYS 4
481 #define AFLAG 2
482 #define DFLAG 1
483
484 enum
485 {
486   /* byte operand */
487   b_mode = 1,
488   /* byte operand with operand swapped */
489   b_swap_mode,
490   /* byte operand, sign extend like 'T' suffix */
491   b_T_mode,
492   /* operand size depends on prefixes */
493   v_mode,
494   /* operand size depends on prefixes with operand swapped */
495   v_swap_mode,
496   /* word operand */
497   w_mode,
498   /* double word operand  */
499   d_mode,
500   /* double word operand with operand swapped */
501   d_swap_mode,
502   /* quad word operand */
503   q_mode,
504   /* quad word operand with operand swapped */
505   q_swap_mode,
506   /* ten-byte operand */
507   t_mode,
508   /* 16-byte XMM, 32-byte YMM or 64-byte ZMM operand.  In EVEX with
509      broadcast enabled.  */
510   x_mode,
511   /* Similar to x_mode, but with different EVEX mem shifts.  */
512   evex_x_gscat_mode,
513   /* Similar to x_mode, but with disabled broadcast.  */
514   evex_x_nobcst_mode,
515   /* Similar to x_mode, but with operands swapped and disabled broadcast
516      in EVEX.  */
517   x_swap_mode,
518   /* 16-byte XMM operand */
519   xmm_mode,
520   /* XMM, XMM or YMM register operand, or quad word, xmmword or ymmword
521      memory operand (depending on vector length).  Broadcast isn't
522      allowed.  */
523   xmmq_mode,
524   /* Same as xmmq_mode, but broadcast is allowed.  */
525   evex_half_bcst_xmmq_mode,
526   /* XMM register or byte memory operand */
527   xmm_mb_mode,
528   /* XMM register or word memory operand */
529   xmm_mw_mode,
530   /* XMM register or double word memory operand */
531   xmm_md_mode,
532   /* XMM register or quad word memory operand */
533   xmm_mq_mode,
534   /* XMM register or double/quad word memory operand, depending on
535      VEX.W.  */
536   xmm_mdq_mode,
537   /* 16-byte XMM, word, double word or quad word operand.  */
538   xmmdw_mode,
539   /* 16-byte XMM, double word, quad word operand or xmm word operand.  */
540   xmmqd_mode,
541   /* 32-byte YMM operand */
542   ymm_mode,
543   /* quad word, ymmword or zmmword memory operand.  */
544   ymmq_mode,
545   /* 32-byte YMM or 16-byte word operand */
546   ymmxmm_mode,
547   /* d_mode in 32bit, q_mode in 64bit mode.  */
548   m_mode,
549   /* pair of v_mode operands */
550   a_mode,
551   cond_jump_mode,
552   loop_jcxz_mode,
553   v_bnd_mode,
554   /* operand size depends on REX prefixes.  */
555   dq_mode,
556   /* registers like dq_mode, memory like w_mode.  */
557   dqw_mode,
558   dqw_swap_mode,
559   bnd_mode,
560   /* 4- or 6-byte pointer operand */
561   f_mode,
562   const_1_mode,
563   /* v_mode for stack-related opcodes.  */
564   stack_v_mode,
565   /* non-quad operand size depends on prefixes */
566   z_mode,
567   /* 16-byte operand */
568   o_mode,
569   /* registers like dq_mode, memory like b_mode.  */
570   dqb_mode,
571   /* registers like d_mode, memory like b_mode.  */
572   db_mode,
573   /* registers like d_mode, memory like w_mode.  */
574   dw_mode,
575   /* registers like dq_mode, memory like d_mode.  */
576   dqd_mode,
577   /* normal vex mode */
578   vex_mode,
579   /* 128bit vex mode */
580   vex128_mode,
581   /* 256bit vex mode */
582   vex256_mode,
583   /* operand size depends on the VEX.W bit.  */
584   vex_w_dq_mode,
585
586   /* Similar to vex_w_dq_mode, with VSIB dword indices.  */
587   vex_vsib_d_w_dq_mode,
588   /* Similar to vex_vsib_d_w_dq_mode, with smaller memory.  */
589   vex_vsib_d_w_d_mode,
590   /* Similar to vex_w_dq_mode, with VSIB qword indices.  */
591   vex_vsib_q_w_dq_mode,
592   /* Similar to vex_vsib_q_w_dq_mode, with smaller memory.  */
593   vex_vsib_q_w_d_mode,
594
595   /* scalar, ignore vector length.  */
596   scalar_mode,
597   /* like d_mode, ignore vector length.  */
598   d_scalar_mode,
599   /* like d_swap_mode, ignore vector length.  */
600   d_scalar_swap_mode,
601   /* like q_mode, ignore vector length.  */
602   q_scalar_mode,
603   /* like q_swap_mode, ignore vector length.  */
604   q_scalar_swap_mode,
605   /* like vex_mode, ignore vector length.  */
606   vex_scalar_mode,
607   /* like vex_w_dq_mode, ignore vector length.  */
608   vex_scalar_w_dq_mode,
609
610   /* Static rounding.  */
611   evex_rounding_mode,
612   /* Supress all exceptions.  */
613   evex_sae_mode,
614
615   /* Mask register operand.  */
616   mask_mode,
617   /* Mask register operand.  */
618   mask_bd_mode,
619
620   es_reg,
621   cs_reg,
622   ss_reg,
623   ds_reg,
624   fs_reg,
625   gs_reg,
626
627   eAX_reg,
628   eCX_reg,
629   eDX_reg,
630   eBX_reg,
631   eSP_reg,
632   eBP_reg,
633   eSI_reg,
634   eDI_reg,
635
636   al_reg,
637   cl_reg,
638   dl_reg,
639   bl_reg,
640   ah_reg,
641   ch_reg,
642   dh_reg,
643   bh_reg,
644
645   ax_reg,
646   cx_reg,
647   dx_reg,
648   bx_reg,
649   sp_reg,
650   bp_reg,
651   si_reg,
652   di_reg,
653
654   rAX_reg,
655   rCX_reg,
656   rDX_reg,
657   rBX_reg,
658   rSP_reg,
659   rBP_reg,
660   rSI_reg,
661   rDI_reg,
662
663   z_mode_ax_reg,
664   indir_dx_reg
665 };
666
667 enum
668 {
669   FLOATCODE = 1,
670   USE_REG_TABLE,
671   USE_MOD_TABLE,
672   USE_RM_TABLE,
673   USE_PREFIX_TABLE,
674   USE_X86_64_TABLE,
675   USE_3BYTE_TABLE,
676   USE_XOP_8F_TABLE,
677   USE_VEX_C4_TABLE,
678   USE_VEX_C5_TABLE,
679   USE_VEX_LEN_TABLE,
680   USE_VEX_W_TABLE,
681   USE_EVEX_TABLE
682 };
683
684 #define FLOAT                   NULL, { { NULL, FLOATCODE } }, 0
685
686 #define DIS386(T, I)            NULL, { { NULL, (T)}, { NULL,  (I) } }, 0
687 #define DIS386_PREFIX(T, I, P)          NULL, { { NULL, (T)}, { NULL,  (I) } }, P
688 #define REG_TABLE(I)            DIS386 (USE_REG_TABLE, (I))
689 #define MOD_TABLE(I)            DIS386 (USE_MOD_TABLE, (I))
690 #define RM_TABLE(I)             DIS386 (USE_RM_TABLE, (I))
691 #define PREFIX_TABLE(I)         DIS386 (USE_PREFIX_TABLE, (I))
692 #define X86_64_TABLE(I)         DIS386 (USE_X86_64_TABLE, (I))
693 #define THREE_BYTE_TABLE(I)     DIS386 (USE_3BYTE_TABLE, (I))
694 #define THREE_BYTE_TABLE_PREFIX(I, P)   DIS386_PREFIX (USE_3BYTE_TABLE, (I), P)
695 #define XOP_8F_TABLE(I)         DIS386 (USE_XOP_8F_TABLE, (I))
696 #define VEX_C4_TABLE(I)         DIS386 (USE_VEX_C4_TABLE, (I))
697 #define VEX_C5_TABLE(I)         DIS386 (USE_VEX_C5_TABLE, (I))
698 #define VEX_LEN_TABLE(I)        DIS386 (USE_VEX_LEN_TABLE, (I))
699 #define VEX_W_TABLE(I)          DIS386 (USE_VEX_W_TABLE, (I))
700 #define EVEX_TABLE(I)           DIS386 (USE_EVEX_TABLE, (I))
701
702 enum
703 {
704   REG_80 = 0,
705   REG_81,
706   REG_82,
707   REG_8F,
708   REG_C0,
709   REG_C1,
710   REG_C6,
711   REG_C7,
712   REG_D0,
713   REG_D1,
714   REG_D2,
715   REG_D3,
716   REG_F6,
717   REG_F7,
718   REG_FE,
719   REG_FF,
720   REG_0F00,
721   REG_0F01,
722   REG_0F0D,
723   REG_0F18,
724   REG_0F71,
725   REG_0F72,
726   REG_0F73,
727   REG_0FA6,
728   REG_0FA7,
729   REG_0FAE,
730   REG_0FBA,
731   REG_0FC7,
732   REG_VEX_0F71,
733   REG_VEX_0F72,
734   REG_VEX_0F73,
735   REG_VEX_0FAE,
736   REG_VEX_0F38F3,
737   REG_XOP_LWPCB,
738   REG_XOP_LWP,
739   REG_XOP_TBM_01,
740   REG_XOP_TBM_02,
741
742   REG_EVEX_0F71,
743   REG_EVEX_0F72,
744   REG_EVEX_0F73,
745   REG_EVEX_0F38C6,
746   REG_EVEX_0F38C7
747 };
748
749 enum
750 {
751   MOD_8D = 0,
752   MOD_C6_REG_7,
753   MOD_C7_REG_7,
754   MOD_FF_REG_3,
755   MOD_FF_REG_5,
756   MOD_0F01_REG_0,
757   MOD_0F01_REG_1,
758   MOD_0F01_REG_2,
759   MOD_0F01_REG_3,
760   MOD_0F01_REG_7,
761   MOD_0F12_PREFIX_0,
762   MOD_0F13,
763   MOD_0F16_PREFIX_0,
764   MOD_0F17,
765   MOD_0F18_REG_0,
766   MOD_0F18_REG_1,
767   MOD_0F18_REG_2,
768   MOD_0F18_REG_3,
769   MOD_0F18_REG_4,
770   MOD_0F18_REG_5,
771   MOD_0F18_REG_6,
772   MOD_0F18_REG_7,
773   MOD_0F1A_PREFIX_0,
774   MOD_0F1B_PREFIX_0,
775   MOD_0F1B_PREFIX_1,
776   MOD_0F24,
777   MOD_0F26,
778   MOD_0F2B_PREFIX_0,
779   MOD_0F2B_PREFIX_1,
780   MOD_0F2B_PREFIX_2,
781   MOD_0F2B_PREFIX_3,
782   MOD_0F51,
783   MOD_0F71_REG_2,
784   MOD_0F71_REG_4,
785   MOD_0F71_REG_6,
786   MOD_0F72_REG_2,
787   MOD_0F72_REG_4,
788   MOD_0F72_REG_6,
789   MOD_0F73_REG_2,
790   MOD_0F73_REG_3,
791   MOD_0F73_REG_6,
792   MOD_0F73_REG_7,
793   MOD_0FAE_REG_0,
794   MOD_0FAE_REG_1,
795   MOD_0FAE_REG_2,
796   MOD_0FAE_REG_3,
797   MOD_0FAE_REG_4,
798   MOD_0FAE_REG_5,
799   MOD_0FAE_REG_6,
800   MOD_0FAE_REG_7,
801   MOD_0FB2,
802   MOD_0FB4,
803   MOD_0FB5,
804   MOD_0FC7_REG_3,
805   MOD_0FC7_REG_4,
806   MOD_0FC7_REG_5,
807   MOD_0FC7_REG_6,
808   MOD_0FC7_REG_7,
809   MOD_0FD7,
810   MOD_0FE7_PREFIX_2,
811   MOD_0FF0_PREFIX_3,
812   MOD_0F382A_PREFIX_2,
813   MOD_62_32BIT,
814   MOD_C4_32BIT,
815   MOD_C5_32BIT,
816   MOD_VEX_0F12_PREFIX_0,
817   MOD_VEX_0F13,
818   MOD_VEX_0F16_PREFIX_0,
819   MOD_VEX_0F17,
820   MOD_VEX_0F2B,
821   MOD_VEX_0F50,
822   MOD_VEX_0F71_REG_2,
823   MOD_VEX_0F71_REG_4,
824   MOD_VEX_0F71_REG_6,
825   MOD_VEX_0F72_REG_2,
826   MOD_VEX_0F72_REG_4,
827   MOD_VEX_0F72_REG_6,
828   MOD_VEX_0F73_REG_2,
829   MOD_VEX_0F73_REG_3,
830   MOD_VEX_0F73_REG_6,
831   MOD_VEX_0F73_REG_7,
832   MOD_VEX_0FAE_REG_2,
833   MOD_VEX_0FAE_REG_3,
834   MOD_VEX_0FD7_PREFIX_2,
835   MOD_VEX_0FE7_PREFIX_2,
836   MOD_VEX_0FF0_PREFIX_3,
837   MOD_VEX_0F381A_PREFIX_2,
838   MOD_VEX_0F382A_PREFIX_2,
839   MOD_VEX_0F382C_PREFIX_2,
840   MOD_VEX_0F382D_PREFIX_2,
841   MOD_VEX_0F382E_PREFIX_2,
842   MOD_VEX_0F382F_PREFIX_2,
843   MOD_VEX_0F385A_PREFIX_2,
844   MOD_VEX_0F388C_PREFIX_2,
845   MOD_VEX_0F388E_PREFIX_2,
846
847   MOD_EVEX_0F10_PREFIX_1,
848   MOD_EVEX_0F10_PREFIX_3,
849   MOD_EVEX_0F11_PREFIX_1,
850   MOD_EVEX_0F11_PREFIX_3,
851   MOD_EVEX_0F12_PREFIX_0,
852   MOD_EVEX_0F16_PREFIX_0,
853   MOD_EVEX_0F38C6_REG_1,
854   MOD_EVEX_0F38C6_REG_2,
855   MOD_EVEX_0F38C6_REG_5,
856   MOD_EVEX_0F38C6_REG_6,
857   MOD_EVEX_0F38C7_REG_1,
858   MOD_EVEX_0F38C7_REG_2,
859   MOD_EVEX_0F38C7_REG_5,
860   MOD_EVEX_0F38C7_REG_6
861 };
862
863 enum
864 {
865   RM_C6_REG_7 = 0,
866   RM_C7_REG_7,
867   RM_0F01_REG_0,
868   RM_0F01_REG_1,
869   RM_0F01_REG_2,
870   RM_0F01_REG_3,
871   RM_0F01_REG_7,
872   RM_0FAE_REG_5,
873   RM_0FAE_REG_6,
874   RM_0FAE_REG_7
875 };
876
877 enum
878 {
879   PREFIX_90 = 0,
880   PREFIX_0F10,
881   PREFIX_0F11,
882   PREFIX_0F12,
883   PREFIX_0F16,
884   PREFIX_0F1A,
885   PREFIX_0F1B,
886   PREFIX_0F2A,
887   PREFIX_0F2B,
888   PREFIX_0F2C,
889   PREFIX_0F2D,
890   PREFIX_0F2E,
891   PREFIX_0F2F,
892   PREFIX_0F51,
893   PREFIX_0F52,
894   PREFIX_0F53,
895   PREFIX_0F58,
896   PREFIX_0F59,
897   PREFIX_0F5A,
898   PREFIX_0F5B,
899   PREFIX_0F5C,
900   PREFIX_0F5D,
901   PREFIX_0F5E,
902   PREFIX_0F5F,
903   PREFIX_0F60,
904   PREFIX_0F61,
905   PREFIX_0F62,
906   PREFIX_0F6C,
907   PREFIX_0F6D,
908   PREFIX_0F6F,
909   PREFIX_0F70,
910   PREFIX_0F73_REG_3,
911   PREFIX_0F73_REG_7,
912   PREFIX_0F78,
913   PREFIX_0F79,
914   PREFIX_0F7C,
915   PREFIX_0F7D,
916   PREFIX_0F7E,
917   PREFIX_0F7F,
918   PREFIX_0FAE_REG_0,
919   PREFIX_0FAE_REG_1,
920   PREFIX_0FAE_REG_2,
921   PREFIX_0FAE_REG_3,
922   PREFIX_0FAE_REG_6,
923   PREFIX_0FAE_REG_7,
924   PREFIX_RM_0_0FAE_REG_7,
925   PREFIX_0FB8,
926   PREFIX_0FBC,
927   PREFIX_0FBD,
928   PREFIX_0FC2,
929   PREFIX_0FC3,
930   PREFIX_MOD_0_0FC7_REG_6,
931   PREFIX_MOD_3_0FC7_REG_6,
932   PREFIX_MOD_3_0FC7_REG_7,
933   PREFIX_0FD0,
934   PREFIX_0FD6,
935   PREFIX_0FE6,
936   PREFIX_0FE7,
937   PREFIX_0FF0,
938   PREFIX_0FF7,
939   PREFIX_0F3810,
940   PREFIX_0F3814,
941   PREFIX_0F3815,
942   PREFIX_0F3817,
943   PREFIX_0F3820,
944   PREFIX_0F3821,
945   PREFIX_0F3822,
946   PREFIX_0F3823,
947   PREFIX_0F3824,
948   PREFIX_0F3825,
949   PREFIX_0F3828,
950   PREFIX_0F3829,
951   PREFIX_0F382A,
952   PREFIX_0F382B,
953   PREFIX_0F3830,
954   PREFIX_0F3831,
955   PREFIX_0F3832,
956   PREFIX_0F3833,
957   PREFIX_0F3834,
958   PREFIX_0F3835,
959   PREFIX_0F3837,
960   PREFIX_0F3838,
961   PREFIX_0F3839,
962   PREFIX_0F383A,
963   PREFIX_0F383B,
964   PREFIX_0F383C,
965   PREFIX_0F383D,
966   PREFIX_0F383E,
967   PREFIX_0F383F,
968   PREFIX_0F3840,
969   PREFIX_0F3841,
970   PREFIX_0F3880,
971   PREFIX_0F3881,
972   PREFIX_0F3882,
973   PREFIX_0F38C8,
974   PREFIX_0F38C9,
975   PREFIX_0F38CA,
976   PREFIX_0F38CB,
977   PREFIX_0F38CC,
978   PREFIX_0F38CD,
979   PREFIX_0F38DB,
980   PREFIX_0F38DC,
981   PREFIX_0F38DD,
982   PREFIX_0F38DE,
983   PREFIX_0F38DF,
984   PREFIX_0F38F0,
985   PREFIX_0F38F1,
986   PREFIX_0F38F6,
987   PREFIX_0F3A08,
988   PREFIX_0F3A09,
989   PREFIX_0F3A0A,
990   PREFIX_0F3A0B,
991   PREFIX_0F3A0C,
992   PREFIX_0F3A0D,
993   PREFIX_0F3A0E,
994   PREFIX_0F3A14,
995   PREFIX_0F3A15,
996   PREFIX_0F3A16,
997   PREFIX_0F3A17,
998   PREFIX_0F3A20,
999   PREFIX_0F3A21,
1000   PREFIX_0F3A22,
1001   PREFIX_0F3A40,
1002   PREFIX_0F3A41,
1003   PREFIX_0F3A42,
1004   PREFIX_0F3A44,
1005   PREFIX_0F3A60,
1006   PREFIX_0F3A61,
1007   PREFIX_0F3A62,
1008   PREFIX_0F3A63,
1009   PREFIX_0F3ACC,
1010   PREFIX_0F3ADF,
1011   PREFIX_VEX_0F10,
1012   PREFIX_VEX_0F11,
1013   PREFIX_VEX_0F12,
1014   PREFIX_VEX_0F16,
1015   PREFIX_VEX_0F2A,
1016   PREFIX_VEX_0F2C,
1017   PREFIX_VEX_0F2D,
1018   PREFIX_VEX_0F2E,
1019   PREFIX_VEX_0F2F,
1020   PREFIX_VEX_0F41,
1021   PREFIX_VEX_0F42,
1022   PREFIX_VEX_0F44,
1023   PREFIX_VEX_0F45,
1024   PREFIX_VEX_0F46,
1025   PREFIX_VEX_0F47,
1026   PREFIX_VEX_0F4A,
1027   PREFIX_VEX_0F4B,
1028   PREFIX_VEX_0F51,
1029   PREFIX_VEX_0F52,
1030   PREFIX_VEX_0F53,
1031   PREFIX_VEX_0F58,
1032   PREFIX_VEX_0F59,
1033   PREFIX_VEX_0F5A,
1034   PREFIX_VEX_0F5B,
1035   PREFIX_VEX_0F5C,
1036   PREFIX_VEX_0F5D,
1037   PREFIX_VEX_0F5E,
1038   PREFIX_VEX_0F5F,
1039   PREFIX_VEX_0F60,
1040   PREFIX_VEX_0F61,
1041   PREFIX_VEX_0F62,
1042   PREFIX_VEX_0F63,
1043   PREFIX_VEX_0F64,
1044   PREFIX_VEX_0F65,
1045   PREFIX_VEX_0F66,
1046   PREFIX_VEX_0F67,
1047   PREFIX_VEX_0F68,
1048   PREFIX_VEX_0F69,
1049   PREFIX_VEX_0F6A,
1050   PREFIX_VEX_0F6B,
1051   PREFIX_VEX_0F6C,
1052   PREFIX_VEX_0F6D,
1053   PREFIX_VEX_0F6E,
1054   PREFIX_VEX_0F6F,
1055   PREFIX_VEX_0F70,
1056   PREFIX_VEX_0F71_REG_2,
1057   PREFIX_VEX_0F71_REG_4,
1058   PREFIX_VEX_0F71_REG_6,
1059   PREFIX_VEX_0F72_REG_2,
1060   PREFIX_VEX_0F72_REG_4,
1061   PREFIX_VEX_0F72_REG_6,
1062   PREFIX_VEX_0F73_REG_2,
1063   PREFIX_VEX_0F73_REG_3,
1064   PREFIX_VEX_0F73_REG_6,
1065   PREFIX_VEX_0F73_REG_7,
1066   PREFIX_VEX_0F74,
1067   PREFIX_VEX_0F75,
1068   PREFIX_VEX_0F76,
1069   PREFIX_VEX_0F77,
1070   PREFIX_VEX_0F7C,
1071   PREFIX_VEX_0F7D,
1072   PREFIX_VEX_0F7E,
1073   PREFIX_VEX_0F7F,
1074   PREFIX_VEX_0F90,
1075   PREFIX_VEX_0F91,
1076   PREFIX_VEX_0F92,
1077   PREFIX_VEX_0F93,
1078   PREFIX_VEX_0F98,
1079   PREFIX_VEX_0F99,
1080   PREFIX_VEX_0FC2,
1081   PREFIX_VEX_0FC4,
1082   PREFIX_VEX_0FC5,
1083   PREFIX_VEX_0FD0,
1084   PREFIX_VEX_0FD1,
1085   PREFIX_VEX_0FD2,
1086   PREFIX_VEX_0FD3,
1087   PREFIX_VEX_0FD4,
1088   PREFIX_VEX_0FD5,
1089   PREFIX_VEX_0FD6,
1090   PREFIX_VEX_0FD7,
1091   PREFIX_VEX_0FD8,
1092   PREFIX_VEX_0FD9,
1093   PREFIX_VEX_0FDA,
1094   PREFIX_VEX_0FDB,
1095   PREFIX_VEX_0FDC,
1096   PREFIX_VEX_0FDD,
1097   PREFIX_VEX_0FDE,
1098   PREFIX_VEX_0FDF,
1099   PREFIX_VEX_0FE0,
1100   PREFIX_VEX_0FE1,
1101   PREFIX_VEX_0FE2,
1102   PREFIX_VEX_0FE3,
1103   PREFIX_VEX_0FE4,
1104   PREFIX_VEX_0FE5,
1105   PREFIX_VEX_0FE6,
1106   PREFIX_VEX_0FE7,
1107   PREFIX_VEX_0FE8,
1108   PREFIX_VEX_0FE9,
1109   PREFIX_VEX_0FEA,
1110   PREFIX_VEX_0FEB,
1111   PREFIX_VEX_0FEC,
1112   PREFIX_VEX_0FED,
1113   PREFIX_VEX_0FEE,
1114   PREFIX_VEX_0FEF,
1115   PREFIX_VEX_0FF0,
1116   PREFIX_VEX_0FF1,
1117   PREFIX_VEX_0FF2,
1118   PREFIX_VEX_0FF3,
1119   PREFIX_VEX_0FF4,
1120   PREFIX_VEX_0FF5,
1121   PREFIX_VEX_0FF6,
1122   PREFIX_VEX_0FF7,
1123   PREFIX_VEX_0FF8,
1124   PREFIX_VEX_0FF9,
1125   PREFIX_VEX_0FFA,
1126   PREFIX_VEX_0FFB,
1127   PREFIX_VEX_0FFC,
1128   PREFIX_VEX_0FFD,
1129   PREFIX_VEX_0FFE,
1130   PREFIX_VEX_0F3800,
1131   PREFIX_VEX_0F3801,
1132   PREFIX_VEX_0F3802,
1133   PREFIX_VEX_0F3803,
1134   PREFIX_VEX_0F3804,
1135   PREFIX_VEX_0F3805,
1136   PREFIX_VEX_0F3806,
1137   PREFIX_VEX_0F3807,
1138   PREFIX_VEX_0F3808,
1139   PREFIX_VEX_0F3809,
1140   PREFIX_VEX_0F380A,
1141   PREFIX_VEX_0F380B,
1142   PREFIX_VEX_0F380C,
1143   PREFIX_VEX_0F380D,
1144   PREFIX_VEX_0F380E,
1145   PREFIX_VEX_0F380F,
1146   PREFIX_VEX_0F3813,
1147   PREFIX_VEX_0F3816,
1148   PREFIX_VEX_0F3817,
1149   PREFIX_VEX_0F3818,
1150   PREFIX_VEX_0F3819,
1151   PREFIX_VEX_0F381A,
1152   PREFIX_VEX_0F381C,
1153   PREFIX_VEX_0F381D,
1154   PREFIX_VEX_0F381E,
1155   PREFIX_VEX_0F3820,
1156   PREFIX_VEX_0F3821,
1157   PREFIX_VEX_0F3822,
1158   PREFIX_VEX_0F3823,
1159   PREFIX_VEX_0F3824,
1160   PREFIX_VEX_0F3825,
1161   PREFIX_VEX_0F3828,
1162   PREFIX_VEX_0F3829,
1163   PREFIX_VEX_0F382A,
1164   PREFIX_VEX_0F382B,
1165   PREFIX_VEX_0F382C,
1166   PREFIX_VEX_0F382D,
1167   PREFIX_VEX_0F382E,
1168   PREFIX_VEX_0F382F,
1169   PREFIX_VEX_0F3830,
1170   PREFIX_VEX_0F3831,
1171   PREFIX_VEX_0F3832,
1172   PREFIX_VEX_0F3833,
1173   PREFIX_VEX_0F3834,
1174   PREFIX_VEX_0F3835,
1175   PREFIX_VEX_0F3836,
1176   PREFIX_VEX_0F3837,
1177   PREFIX_VEX_0F3838,
1178   PREFIX_VEX_0F3839,
1179   PREFIX_VEX_0F383A,
1180   PREFIX_VEX_0F383B,
1181   PREFIX_VEX_0F383C,
1182   PREFIX_VEX_0F383D,
1183   PREFIX_VEX_0F383E,
1184   PREFIX_VEX_0F383F,
1185   PREFIX_VEX_0F3840,
1186   PREFIX_VEX_0F3841,
1187   PREFIX_VEX_0F3845,
1188   PREFIX_VEX_0F3846,
1189   PREFIX_VEX_0F3847,
1190   PREFIX_VEX_0F3858,
1191   PREFIX_VEX_0F3859,
1192   PREFIX_VEX_0F385A,
1193   PREFIX_VEX_0F3878,
1194   PREFIX_VEX_0F3879,
1195   PREFIX_VEX_0F388C,
1196   PREFIX_VEX_0F388E,
1197   PREFIX_VEX_0F3890,
1198   PREFIX_VEX_0F3891,
1199   PREFIX_VEX_0F3892,
1200   PREFIX_VEX_0F3893,
1201   PREFIX_VEX_0F3896,
1202   PREFIX_VEX_0F3897,
1203   PREFIX_VEX_0F3898,
1204   PREFIX_VEX_0F3899,
1205   PREFIX_VEX_0F389A,
1206   PREFIX_VEX_0F389B,
1207   PREFIX_VEX_0F389C,
1208   PREFIX_VEX_0F389D,
1209   PREFIX_VEX_0F389E,
1210   PREFIX_VEX_0F389F,
1211   PREFIX_VEX_0F38A6,
1212   PREFIX_VEX_0F38A7,
1213   PREFIX_VEX_0F38A8,
1214   PREFIX_VEX_0F38A9,
1215   PREFIX_VEX_0F38AA,
1216   PREFIX_VEX_0F38AB,
1217   PREFIX_VEX_0F38AC,
1218   PREFIX_VEX_0F38AD,
1219   PREFIX_VEX_0F38AE,
1220   PREFIX_VEX_0F38AF,
1221   PREFIX_VEX_0F38B6,
1222   PREFIX_VEX_0F38B7,
1223   PREFIX_VEX_0F38B8,
1224   PREFIX_VEX_0F38B9,
1225   PREFIX_VEX_0F38BA,
1226   PREFIX_VEX_0F38BB,
1227   PREFIX_VEX_0F38BC,
1228   PREFIX_VEX_0F38BD,
1229   PREFIX_VEX_0F38BE,
1230   PREFIX_VEX_0F38BF,
1231   PREFIX_VEX_0F38DB,
1232   PREFIX_VEX_0F38DC,
1233   PREFIX_VEX_0F38DD,
1234   PREFIX_VEX_0F38DE,
1235   PREFIX_VEX_0F38DF,
1236   PREFIX_VEX_0F38F2,
1237   PREFIX_VEX_0F38F3_REG_1,
1238   PREFIX_VEX_0F38F3_REG_2,
1239   PREFIX_VEX_0F38F3_REG_3,
1240   PREFIX_VEX_0F38F5,
1241   PREFIX_VEX_0F38F6,
1242   PREFIX_VEX_0F38F7,
1243   PREFIX_VEX_0F3A00,
1244   PREFIX_VEX_0F3A01,
1245   PREFIX_VEX_0F3A02,
1246   PREFIX_VEX_0F3A04,
1247   PREFIX_VEX_0F3A05,
1248   PREFIX_VEX_0F3A06,
1249   PREFIX_VEX_0F3A08,
1250   PREFIX_VEX_0F3A09,
1251   PREFIX_VEX_0F3A0A,
1252   PREFIX_VEX_0F3A0B,
1253   PREFIX_VEX_0F3A0C,
1254   PREFIX_VEX_0F3A0D,
1255   PREFIX_VEX_0F3A0E,
1256   PREFIX_VEX_0F3A0F,
1257   PREFIX_VEX_0F3A14,
1258   PREFIX_VEX_0F3A15,
1259   PREFIX_VEX_0F3A16,
1260   PREFIX_VEX_0F3A17,
1261   PREFIX_VEX_0F3A18,
1262   PREFIX_VEX_0F3A19,
1263   PREFIX_VEX_0F3A1D,
1264   PREFIX_VEX_0F3A20,
1265   PREFIX_VEX_0F3A21,
1266   PREFIX_VEX_0F3A22,
1267   PREFIX_VEX_0F3A30,
1268   PREFIX_VEX_0F3A31,
1269   PREFIX_VEX_0F3A32,
1270   PREFIX_VEX_0F3A33,
1271   PREFIX_VEX_0F3A38,
1272   PREFIX_VEX_0F3A39,
1273   PREFIX_VEX_0F3A40,
1274   PREFIX_VEX_0F3A41,
1275   PREFIX_VEX_0F3A42,
1276   PREFIX_VEX_0F3A44,
1277   PREFIX_VEX_0F3A46,
1278   PREFIX_VEX_0F3A48,
1279   PREFIX_VEX_0F3A49,
1280   PREFIX_VEX_0F3A4A,
1281   PREFIX_VEX_0F3A4B,
1282   PREFIX_VEX_0F3A4C,
1283   PREFIX_VEX_0F3A5C,
1284   PREFIX_VEX_0F3A5D,
1285   PREFIX_VEX_0F3A5E,
1286   PREFIX_VEX_0F3A5F,
1287   PREFIX_VEX_0F3A60,
1288   PREFIX_VEX_0F3A61,
1289   PREFIX_VEX_0F3A62,
1290   PREFIX_VEX_0F3A63,
1291   PREFIX_VEX_0F3A68,
1292   PREFIX_VEX_0F3A69,
1293   PREFIX_VEX_0F3A6A,
1294   PREFIX_VEX_0F3A6B,
1295   PREFIX_VEX_0F3A6C,
1296   PREFIX_VEX_0F3A6D,
1297   PREFIX_VEX_0F3A6E,
1298   PREFIX_VEX_0F3A6F,
1299   PREFIX_VEX_0F3A78,
1300   PREFIX_VEX_0F3A79,
1301   PREFIX_VEX_0F3A7A,
1302   PREFIX_VEX_0F3A7B,
1303   PREFIX_VEX_0F3A7C,
1304   PREFIX_VEX_0F3A7D,
1305   PREFIX_VEX_0F3A7E,
1306   PREFIX_VEX_0F3A7F,
1307   PREFIX_VEX_0F3ADF,
1308   PREFIX_VEX_0F3AF0,
1309
1310   PREFIX_EVEX_0F10,
1311   PREFIX_EVEX_0F11,
1312   PREFIX_EVEX_0F12,
1313   PREFIX_EVEX_0F13,
1314   PREFIX_EVEX_0F14,
1315   PREFIX_EVEX_0F15,
1316   PREFIX_EVEX_0F16,
1317   PREFIX_EVEX_0F17,
1318   PREFIX_EVEX_0F28,
1319   PREFIX_EVEX_0F29,
1320   PREFIX_EVEX_0F2A,
1321   PREFIX_EVEX_0F2B,
1322   PREFIX_EVEX_0F2C,
1323   PREFIX_EVEX_0F2D,
1324   PREFIX_EVEX_0F2E,
1325   PREFIX_EVEX_0F2F,
1326   PREFIX_EVEX_0F51,
1327   PREFIX_EVEX_0F54,
1328   PREFIX_EVEX_0F55,
1329   PREFIX_EVEX_0F56,
1330   PREFIX_EVEX_0F57,
1331   PREFIX_EVEX_0F58,
1332   PREFIX_EVEX_0F59,
1333   PREFIX_EVEX_0F5A,
1334   PREFIX_EVEX_0F5B,
1335   PREFIX_EVEX_0F5C,
1336   PREFIX_EVEX_0F5D,
1337   PREFIX_EVEX_0F5E,
1338   PREFIX_EVEX_0F5F,
1339   PREFIX_EVEX_0F60,
1340   PREFIX_EVEX_0F61,
1341   PREFIX_EVEX_0F62,
1342   PREFIX_EVEX_0F63,
1343   PREFIX_EVEX_0F64,
1344   PREFIX_EVEX_0F65,
1345   PREFIX_EVEX_0F66,
1346   PREFIX_EVEX_0F67,
1347   PREFIX_EVEX_0F68,
1348   PREFIX_EVEX_0F69,
1349   PREFIX_EVEX_0F6A,
1350   PREFIX_EVEX_0F6B,
1351   PREFIX_EVEX_0F6C,
1352   PREFIX_EVEX_0F6D,
1353   PREFIX_EVEX_0F6E,
1354   PREFIX_EVEX_0F6F,
1355   PREFIX_EVEX_0F70,
1356   PREFIX_EVEX_0F71_REG_2,
1357   PREFIX_EVEX_0F71_REG_4,
1358   PREFIX_EVEX_0F71_REG_6,
1359   PREFIX_EVEX_0F72_REG_0,
1360   PREFIX_EVEX_0F72_REG_1,
1361   PREFIX_EVEX_0F72_REG_2,
1362   PREFIX_EVEX_0F72_REG_4,
1363   PREFIX_EVEX_0F72_REG_6,
1364   PREFIX_EVEX_0F73_REG_2,
1365   PREFIX_EVEX_0F73_REG_3,
1366   PREFIX_EVEX_0F73_REG_6,
1367   PREFIX_EVEX_0F73_REG_7,
1368   PREFIX_EVEX_0F74,
1369   PREFIX_EVEX_0F75,
1370   PREFIX_EVEX_0F76,
1371   PREFIX_EVEX_0F78,
1372   PREFIX_EVEX_0F79,
1373   PREFIX_EVEX_0F7A,
1374   PREFIX_EVEX_0F7B,
1375   PREFIX_EVEX_0F7E,
1376   PREFIX_EVEX_0F7F,
1377   PREFIX_EVEX_0FC2,
1378   PREFIX_EVEX_0FC4,
1379   PREFIX_EVEX_0FC5,
1380   PREFIX_EVEX_0FC6,
1381   PREFIX_EVEX_0FD1,
1382   PREFIX_EVEX_0FD2,
1383   PREFIX_EVEX_0FD3,
1384   PREFIX_EVEX_0FD4,
1385   PREFIX_EVEX_0FD5,
1386   PREFIX_EVEX_0FD6,
1387   PREFIX_EVEX_0FD8,
1388   PREFIX_EVEX_0FD9,
1389   PREFIX_EVEX_0FDA,
1390   PREFIX_EVEX_0FDB,
1391   PREFIX_EVEX_0FDC,
1392   PREFIX_EVEX_0FDD,
1393   PREFIX_EVEX_0FDE,
1394   PREFIX_EVEX_0FDF,
1395   PREFIX_EVEX_0FE0,
1396   PREFIX_EVEX_0FE1,
1397   PREFIX_EVEX_0FE2,
1398   PREFIX_EVEX_0FE3,
1399   PREFIX_EVEX_0FE4,
1400   PREFIX_EVEX_0FE5,
1401   PREFIX_EVEX_0FE6,
1402   PREFIX_EVEX_0FE7,
1403   PREFIX_EVEX_0FE8,
1404   PREFIX_EVEX_0FE9,
1405   PREFIX_EVEX_0FEA,
1406   PREFIX_EVEX_0FEB,
1407   PREFIX_EVEX_0FEC,
1408   PREFIX_EVEX_0FED,
1409   PREFIX_EVEX_0FEE,
1410   PREFIX_EVEX_0FEF,
1411   PREFIX_EVEX_0FF1,
1412   PREFIX_EVEX_0FF2,
1413   PREFIX_EVEX_0FF3,
1414   PREFIX_EVEX_0FF4,
1415   PREFIX_EVEX_0FF5,
1416   PREFIX_EVEX_0FF6,
1417   PREFIX_EVEX_0FF8,
1418   PREFIX_EVEX_0FF9,
1419   PREFIX_EVEX_0FFA,
1420   PREFIX_EVEX_0FFB,
1421   PREFIX_EVEX_0FFC,
1422   PREFIX_EVEX_0FFD,
1423   PREFIX_EVEX_0FFE,
1424   PREFIX_EVEX_0F3800,
1425   PREFIX_EVEX_0F3804,
1426   PREFIX_EVEX_0F380B,
1427   PREFIX_EVEX_0F380C,
1428   PREFIX_EVEX_0F380D,
1429   PREFIX_EVEX_0F3810,
1430   PREFIX_EVEX_0F3811,
1431   PREFIX_EVEX_0F3812,
1432   PREFIX_EVEX_0F3813,
1433   PREFIX_EVEX_0F3814,
1434   PREFIX_EVEX_0F3815,
1435   PREFIX_EVEX_0F3816,
1436   PREFIX_EVEX_0F3818,
1437   PREFIX_EVEX_0F3819,
1438   PREFIX_EVEX_0F381A,
1439   PREFIX_EVEX_0F381B,
1440   PREFIX_EVEX_0F381C,
1441   PREFIX_EVEX_0F381D,
1442   PREFIX_EVEX_0F381E,
1443   PREFIX_EVEX_0F381F,
1444   PREFIX_EVEX_0F3820,
1445   PREFIX_EVEX_0F3821,
1446   PREFIX_EVEX_0F3822,
1447   PREFIX_EVEX_0F3823,
1448   PREFIX_EVEX_0F3824,
1449   PREFIX_EVEX_0F3825,
1450   PREFIX_EVEX_0F3826,
1451   PREFIX_EVEX_0F3827,
1452   PREFIX_EVEX_0F3828,
1453   PREFIX_EVEX_0F3829,
1454   PREFIX_EVEX_0F382A,
1455   PREFIX_EVEX_0F382B,
1456   PREFIX_EVEX_0F382C,
1457   PREFIX_EVEX_0F382D,
1458   PREFIX_EVEX_0F3830,
1459   PREFIX_EVEX_0F3831,
1460   PREFIX_EVEX_0F3832,
1461   PREFIX_EVEX_0F3833,
1462   PREFIX_EVEX_0F3834,
1463   PREFIX_EVEX_0F3835,
1464   PREFIX_EVEX_0F3836,
1465   PREFIX_EVEX_0F3837,
1466   PREFIX_EVEX_0F3838,
1467   PREFIX_EVEX_0F3839,
1468   PREFIX_EVEX_0F383A,
1469   PREFIX_EVEX_0F383B,
1470   PREFIX_EVEX_0F383C,
1471   PREFIX_EVEX_0F383D,
1472   PREFIX_EVEX_0F383E,
1473   PREFIX_EVEX_0F383F,
1474   PREFIX_EVEX_0F3840,
1475   PREFIX_EVEX_0F3842,
1476   PREFIX_EVEX_0F3843,
1477   PREFIX_EVEX_0F3844,
1478   PREFIX_EVEX_0F3845,
1479   PREFIX_EVEX_0F3846,
1480   PREFIX_EVEX_0F3847,
1481   PREFIX_EVEX_0F384C,
1482   PREFIX_EVEX_0F384D,
1483   PREFIX_EVEX_0F384E,
1484   PREFIX_EVEX_0F384F,
1485   PREFIX_EVEX_0F3858,
1486   PREFIX_EVEX_0F3859,
1487   PREFIX_EVEX_0F385A,
1488   PREFIX_EVEX_0F385B,
1489   PREFIX_EVEX_0F3864,
1490   PREFIX_EVEX_0F3865,
1491   PREFIX_EVEX_0F3866,
1492   PREFIX_EVEX_0F3875,
1493   PREFIX_EVEX_0F3876,
1494   PREFIX_EVEX_0F3877,
1495   PREFIX_EVEX_0F3878,
1496   PREFIX_EVEX_0F3879,
1497   PREFIX_EVEX_0F387A,
1498   PREFIX_EVEX_0F387B,
1499   PREFIX_EVEX_0F387C,
1500   PREFIX_EVEX_0F387D,
1501   PREFIX_EVEX_0F387E,
1502   PREFIX_EVEX_0F387F,
1503   PREFIX_EVEX_0F3883,
1504   PREFIX_EVEX_0F3888,
1505   PREFIX_EVEX_0F3889,
1506   PREFIX_EVEX_0F388A,
1507   PREFIX_EVEX_0F388B,
1508   PREFIX_EVEX_0F388D,
1509   PREFIX_EVEX_0F3890,
1510   PREFIX_EVEX_0F3891,
1511   PREFIX_EVEX_0F3892,
1512   PREFIX_EVEX_0F3893,
1513   PREFIX_EVEX_0F3896,
1514   PREFIX_EVEX_0F3897,
1515   PREFIX_EVEX_0F3898,
1516   PREFIX_EVEX_0F3899,
1517   PREFIX_EVEX_0F389A,
1518   PREFIX_EVEX_0F389B,
1519   PREFIX_EVEX_0F389C,
1520   PREFIX_EVEX_0F389D,
1521   PREFIX_EVEX_0F389E,
1522   PREFIX_EVEX_0F389F,
1523   PREFIX_EVEX_0F38A0,
1524   PREFIX_EVEX_0F38A1,
1525   PREFIX_EVEX_0F38A2,
1526   PREFIX_EVEX_0F38A3,
1527   PREFIX_EVEX_0F38A6,
1528   PREFIX_EVEX_0F38A7,
1529   PREFIX_EVEX_0F38A8,
1530   PREFIX_EVEX_0F38A9,
1531   PREFIX_EVEX_0F38AA,
1532   PREFIX_EVEX_0F38AB,
1533   PREFIX_EVEX_0F38AC,
1534   PREFIX_EVEX_0F38AD,
1535   PREFIX_EVEX_0F38AE,
1536   PREFIX_EVEX_0F38AF,
1537   PREFIX_EVEX_0F38B4,
1538   PREFIX_EVEX_0F38B5,
1539   PREFIX_EVEX_0F38B6,
1540   PREFIX_EVEX_0F38B7,
1541   PREFIX_EVEX_0F38B8,
1542   PREFIX_EVEX_0F38B9,
1543   PREFIX_EVEX_0F38BA,
1544   PREFIX_EVEX_0F38BB,
1545   PREFIX_EVEX_0F38BC,
1546   PREFIX_EVEX_0F38BD,
1547   PREFIX_EVEX_0F38BE,
1548   PREFIX_EVEX_0F38BF,
1549   PREFIX_EVEX_0F38C4,
1550   PREFIX_EVEX_0F38C6_REG_1,
1551   PREFIX_EVEX_0F38C6_REG_2,
1552   PREFIX_EVEX_0F38C6_REG_5,
1553   PREFIX_EVEX_0F38C6_REG_6,
1554   PREFIX_EVEX_0F38C7_REG_1,
1555   PREFIX_EVEX_0F38C7_REG_2,
1556   PREFIX_EVEX_0F38C7_REG_5,
1557   PREFIX_EVEX_0F38C7_REG_6,
1558   PREFIX_EVEX_0F38C8,
1559   PREFIX_EVEX_0F38CA,
1560   PREFIX_EVEX_0F38CB,
1561   PREFIX_EVEX_0F38CC,
1562   PREFIX_EVEX_0F38CD,
1563
1564   PREFIX_EVEX_0F3A00,
1565   PREFIX_EVEX_0F3A01,
1566   PREFIX_EVEX_0F3A03,
1567   PREFIX_EVEX_0F3A04,
1568   PREFIX_EVEX_0F3A05,
1569   PREFIX_EVEX_0F3A08,
1570   PREFIX_EVEX_0F3A09,
1571   PREFIX_EVEX_0F3A0A,
1572   PREFIX_EVEX_0F3A0B,
1573   PREFIX_EVEX_0F3A0F,
1574   PREFIX_EVEX_0F3A14,
1575   PREFIX_EVEX_0F3A15,
1576   PREFIX_EVEX_0F3A16,
1577   PREFIX_EVEX_0F3A17,
1578   PREFIX_EVEX_0F3A18,
1579   PREFIX_EVEX_0F3A19,
1580   PREFIX_EVEX_0F3A1A,
1581   PREFIX_EVEX_0F3A1B,
1582   PREFIX_EVEX_0F3A1D,
1583   PREFIX_EVEX_0F3A1E,
1584   PREFIX_EVEX_0F3A1F,
1585   PREFIX_EVEX_0F3A20,
1586   PREFIX_EVEX_0F3A21,
1587   PREFIX_EVEX_0F3A22,
1588   PREFIX_EVEX_0F3A23,
1589   PREFIX_EVEX_0F3A25,
1590   PREFIX_EVEX_0F3A26,
1591   PREFIX_EVEX_0F3A27,
1592   PREFIX_EVEX_0F3A38,
1593   PREFIX_EVEX_0F3A39,
1594   PREFIX_EVEX_0F3A3A,
1595   PREFIX_EVEX_0F3A3B,
1596   PREFIX_EVEX_0F3A3E,
1597   PREFIX_EVEX_0F3A3F,
1598   PREFIX_EVEX_0F3A42,
1599   PREFIX_EVEX_0F3A43,
1600   PREFIX_EVEX_0F3A50,
1601   PREFIX_EVEX_0F3A51,
1602   PREFIX_EVEX_0F3A54,
1603   PREFIX_EVEX_0F3A55,
1604   PREFIX_EVEX_0F3A56,
1605   PREFIX_EVEX_0F3A57,
1606   PREFIX_EVEX_0F3A66,
1607   PREFIX_EVEX_0F3A67
1608 };
1609
1610 enum
1611 {
1612   X86_64_06 = 0,
1613   X86_64_07,
1614   X86_64_0D,
1615   X86_64_16,
1616   X86_64_17,
1617   X86_64_1E,
1618   X86_64_1F,
1619   X86_64_27,
1620   X86_64_2F,
1621   X86_64_37,
1622   X86_64_3F,
1623   X86_64_60,
1624   X86_64_61,
1625   X86_64_62,
1626   X86_64_63,
1627   X86_64_6D,
1628   X86_64_6F,
1629   X86_64_9A,
1630   X86_64_C4,
1631   X86_64_C5,
1632   X86_64_CE,
1633   X86_64_D4,
1634   X86_64_D5,
1635   X86_64_E8,
1636   X86_64_E9,
1637   X86_64_EA,
1638   X86_64_0F01_REG_0,
1639   X86_64_0F01_REG_1,
1640   X86_64_0F01_REG_2,
1641   X86_64_0F01_REG_3
1642 };
1643
1644 enum
1645 {
1646   THREE_BYTE_0F38 = 0,
1647   THREE_BYTE_0F3A,
1648   THREE_BYTE_0F7A
1649 };
1650
1651 enum
1652 {
1653   XOP_08 = 0,
1654   XOP_09,
1655   XOP_0A
1656 };
1657
1658 enum
1659 {
1660   VEX_0F = 0,
1661   VEX_0F38,
1662   VEX_0F3A
1663 };
1664
1665 enum
1666 {
1667   EVEX_0F = 0,
1668   EVEX_0F38,
1669   EVEX_0F3A
1670 };
1671
1672 enum
1673 {
1674   VEX_LEN_0F10_P_1 = 0,
1675   VEX_LEN_0F10_P_3,
1676   VEX_LEN_0F11_P_1,
1677   VEX_LEN_0F11_P_3,
1678   VEX_LEN_0F12_P_0_M_0,
1679   VEX_LEN_0F12_P_0_M_1,
1680   VEX_LEN_0F12_P_2,
1681   VEX_LEN_0F13_M_0,
1682   VEX_LEN_0F16_P_0_M_0,
1683   VEX_LEN_0F16_P_0_M_1,
1684   VEX_LEN_0F16_P_2,
1685   VEX_LEN_0F17_M_0,
1686   VEX_LEN_0F2A_P_1,
1687   VEX_LEN_0F2A_P_3,
1688   VEX_LEN_0F2C_P_1,
1689   VEX_LEN_0F2C_P_3,
1690   VEX_LEN_0F2D_P_1,
1691   VEX_LEN_0F2D_P_3,
1692   VEX_LEN_0F2E_P_0,
1693   VEX_LEN_0F2E_P_2,
1694   VEX_LEN_0F2F_P_0,
1695   VEX_LEN_0F2F_P_2,
1696   VEX_LEN_0F41_P_0,
1697   VEX_LEN_0F41_P_2,
1698   VEX_LEN_0F42_P_0,
1699   VEX_LEN_0F42_P_2,
1700   VEX_LEN_0F44_P_0,
1701   VEX_LEN_0F44_P_2,
1702   VEX_LEN_0F45_P_0,
1703   VEX_LEN_0F45_P_2,
1704   VEX_LEN_0F46_P_0,
1705   VEX_LEN_0F46_P_2,
1706   VEX_LEN_0F47_P_0,
1707   VEX_LEN_0F47_P_2,
1708   VEX_LEN_0F4A_P_0,
1709   VEX_LEN_0F4A_P_2,
1710   VEX_LEN_0F4B_P_0,
1711   VEX_LEN_0F4B_P_2,
1712   VEX_LEN_0F51_P_1,
1713   VEX_LEN_0F51_P_3,
1714   VEX_LEN_0F52_P_1,
1715   VEX_LEN_0F53_P_1,
1716   VEX_LEN_0F58_P_1,
1717   VEX_LEN_0F58_P_3,
1718   VEX_LEN_0F59_P_1,
1719   VEX_LEN_0F59_P_3,
1720   VEX_LEN_0F5A_P_1,
1721   VEX_LEN_0F5A_P_3,
1722   VEX_LEN_0F5C_P_1,
1723   VEX_LEN_0F5C_P_3,
1724   VEX_LEN_0F5D_P_1,
1725   VEX_LEN_0F5D_P_3,
1726   VEX_LEN_0F5E_P_1,
1727   VEX_LEN_0F5E_P_3,
1728   VEX_LEN_0F5F_P_1,
1729   VEX_LEN_0F5F_P_3,
1730   VEX_LEN_0F6E_P_2,
1731   VEX_LEN_0F7E_P_1,
1732   VEX_LEN_0F7E_P_2,
1733   VEX_LEN_0F90_P_0,
1734   VEX_LEN_0F90_P_2,
1735   VEX_LEN_0F91_P_0,
1736   VEX_LEN_0F91_P_2,
1737   VEX_LEN_0F92_P_0,
1738   VEX_LEN_0F92_P_2,
1739   VEX_LEN_0F92_P_3,
1740   VEX_LEN_0F93_P_0,
1741   VEX_LEN_0F93_P_2,
1742   VEX_LEN_0F93_P_3,
1743   VEX_LEN_0F98_P_0,
1744   VEX_LEN_0F98_P_2,
1745   VEX_LEN_0F99_P_0,
1746   VEX_LEN_0F99_P_2,
1747   VEX_LEN_0FAE_R_2_M_0,
1748   VEX_LEN_0FAE_R_3_M_0,
1749   VEX_LEN_0FC2_P_1,
1750   VEX_LEN_0FC2_P_3,
1751   VEX_LEN_0FC4_P_2,
1752   VEX_LEN_0FC5_P_2,
1753   VEX_LEN_0FD6_P_2,
1754   VEX_LEN_0FF7_P_2,
1755   VEX_LEN_0F3816_P_2,
1756   VEX_LEN_0F3819_P_2,
1757   VEX_LEN_0F381A_P_2_M_0,
1758   VEX_LEN_0F3836_P_2,
1759   VEX_LEN_0F3841_P_2,
1760   VEX_LEN_0F385A_P_2_M_0,
1761   VEX_LEN_0F38DB_P_2,
1762   VEX_LEN_0F38DC_P_2,
1763   VEX_LEN_0F38DD_P_2,
1764   VEX_LEN_0F38DE_P_2,
1765   VEX_LEN_0F38DF_P_2,
1766   VEX_LEN_0F38F2_P_0,
1767   VEX_LEN_0F38F3_R_1_P_0,
1768   VEX_LEN_0F38F3_R_2_P_0,
1769   VEX_LEN_0F38F3_R_3_P_0,
1770   VEX_LEN_0F38F5_P_0,
1771   VEX_LEN_0F38F5_P_1,
1772   VEX_LEN_0F38F5_P_3,
1773   VEX_LEN_0F38F6_P_3,
1774   VEX_LEN_0F38F7_P_0,
1775   VEX_LEN_0F38F7_P_1,
1776   VEX_LEN_0F38F7_P_2,
1777   VEX_LEN_0F38F7_P_3,
1778   VEX_LEN_0F3A00_P_2,
1779   VEX_LEN_0F3A01_P_2,
1780   VEX_LEN_0F3A06_P_2,
1781   VEX_LEN_0F3A0A_P_2,
1782   VEX_LEN_0F3A0B_P_2,
1783   VEX_LEN_0F3A14_P_2,
1784   VEX_LEN_0F3A15_P_2,
1785   VEX_LEN_0F3A16_P_2,
1786   VEX_LEN_0F3A17_P_2,
1787   VEX_LEN_0F3A18_P_2,
1788   VEX_LEN_0F3A19_P_2,
1789   VEX_LEN_0F3A20_P_2,
1790   VEX_LEN_0F3A21_P_2,
1791   VEX_LEN_0F3A22_P_2,
1792   VEX_LEN_0F3A30_P_2,
1793   VEX_LEN_0F3A31_P_2,
1794   VEX_LEN_0F3A32_P_2,
1795   VEX_LEN_0F3A33_P_2,
1796   VEX_LEN_0F3A38_P_2,
1797   VEX_LEN_0F3A39_P_2,
1798   VEX_LEN_0F3A41_P_2,
1799   VEX_LEN_0F3A44_P_2,
1800   VEX_LEN_0F3A46_P_2,
1801   VEX_LEN_0F3A60_P_2,
1802   VEX_LEN_0F3A61_P_2,
1803   VEX_LEN_0F3A62_P_2,
1804   VEX_LEN_0F3A63_P_2,
1805   VEX_LEN_0F3A6A_P_2,
1806   VEX_LEN_0F3A6B_P_2,
1807   VEX_LEN_0F3A6E_P_2,
1808   VEX_LEN_0F3A6F_P_2,
1809   VEX_LEN_0F3A7A_P_2,
1810   VEX_LEN_0F3A7B_P_2,
1811   VEX_LEN_0F3A7E_P_2,
1812   VEX_LEN_0F3A7F_P_2,
1813   VEX_LEN_0F3ADF_P_2,
1814   VEX_LEN_0F3AF0_P_3,
1815   VEX_LEN_0FXOP_08_CC,
1816   VEX_LEN_0FXOP_08_CD,
1817   VEX_LEN_0FXOP_08_CE,
1818   VEX_LEN_0FXOP_08_CF,
1819   VEX_LEN_0FXOP_08_EC,
1820   VEX_LEN_0FXOP_08_ED,
1821   VEX_LEN_0FXOP_08_EE,
1822   VEX_LEN_0FXOP_08_EF,
1823   VEX_LEN_0FXOP_09_80,
1824   VEX_LEN_0FXOP_09_81
1825 };
1826
1827 enum
1828 {
1829   VEX_W_0F10_P_0 = 0,
1830   VEX_W_0F10_P_1,
1831   VEX_W_0F10_P_2,
1832   VEX_W_0F10_P_3,
1833   VEX_W_0F11_P_0,
1834   VEX_W_0F11_P_1,
1835   VEX_W_0F11_P_2,
1836   VEX_W_0F11_P_3,
1837   VEX_W_0F12_P_0_M_0,
1838   VEX_W_0F12_P_0_M_1,
1839   VEX_W_0F12_P_1,
1840   VEX_W_0F12_P_2,
1841   VEX_W_0F12_P_3,
1842   VEX_W_0F13_M_0,
1843   VEX_W_0F14,
1844   VEX_W_0F15,
1845   VEX_W_0F16_P_0_M_0,
1846   VEX_W_0F16_P_0_M_1,
1847   VEX_W_0F16_P_1,
1848   VEX_W_0F16_P_2,
1849   VEX_W_0F17_M_0,
1850   VEX_W_0F28,
1851   VEX_W_0F29,
1852   VEX_W_0F2B_M_0,
1853   VEX_W_0F2E_P_0,
1854   VEX_W_0F2E_P_2,
1855   VEX_W_0F2F_P_0,
1856   VEX_W_0F2F_P_2,
1857   VEX_W_0F41_P_0_LEN_1,
1858   VEX_W_0F41_P_2_LEN_1,
1859   VEX_W_0F42_P_0_LEN_1,
1860   VEX_W_0F42_P_2_LEN_1,
1861   VEX_W_0F44_P_0_LEN_0,
1862   VEX_W_0F44_P_2_LEN_0,
1863   VEX_W_0F45_P_0_LEN_1,
1864   VEX_W_0F45_P_2_LEN_1,
1865   VEX_W_0F46_P_0_LEN_1,
1866   VEX_W_0F46_P_2_LEN_1,
1867   VEX_W_0F47_P_0_LEN_1,
1868   VEX_W_0F47_P_2_LEN_1,
1869   VEX_W_0F4A_P_0_LEN_1,
1870   VEX_W_0F4A_P_2_LEN_1,
1871   VEX_W_0F4B_P_0_LEN_1,
1872   VEX_W_0F4B_P_2_LEN_1,
1873   VEX_W_0F50_M_0,
1874   VEX_W_0F51_P_0,
1875   VEX_W_0F51_P_1,
1876   VEX_W_0F51_P_2,
1877   VEX_W_0F51_P_3,
1878   VEX_W_0F52_P_0,
1879   VEX_W_0F52_P_1,
1880   VEX_W_0F53_P_0,
1881   VEX_W_0F53_P_1,
1882   VEX_W_0F58_P_0,
1883   VEX_W_0F58_P_1,
1884   VEX_W_0F58_P_2,
1885   VEX_W_0F58_P_3,
1886   VEX_W_0F59_P_0,
1887   VEX_W_0F59_P_1,
1888   VEX_W_0F59_P_2,
1889   VEX_W_0F59_P_3,
1890   VEX_W_0F5A_P_0,
1891   VEX_W_0F5A_P_1,
1892   VEX_W_0F5A_P_3,
1893   VEX_W_0F5B_P_0,
1894   VEX_W_0F5B_P_1,
1895   VEX_W_0F5B_P_2,
1896   VEX_W_0F5C_P_0,
1897   VEX_W_0F5C_P_1,
1898   VEX_W_0F5C_P_2,
1899   VEX_W_0F5C_P_3,
1900   VEX_W_0F5D_P_0,
1901   VEX_W_0F5D_P_1,
1902   VEX_W_0F5D_P_2,
1903   VEX_W_0F5D_P_3,
1904   VEX_W_0F5E_P_0,
1905   VEX_W_0F5E_P_1,
1906   VEX_W_0F5E_P_2,
1907   VEX_W_0F5E_P_3,
1908   VEX_W_0F5F_P_0,
1909   VEX_W_0F5F_P_1,
1910   VEX_W_0F5F_P_2,
1911   VEX_W_0F5F_P_3,
1912   VEX_W_0F60_P_2,
1913   VEX_W_0F61_P_2,
1914   VEX_W_0F62_P_2,
1915   VEX_W_0F63_P_2,
1916   VEX_W_0F64_P_2,
1917   VEX_W_0F65_P_2,
1918   VEX_W_0F66_P_2,
1919   VEX_W_0F67_P_2,
1920   VEX_W_0F68_P_2,
1921   VEX_W_0F69_P_2,
1922   VEX_W_0F6A_P_2,
1923   VEX_W_0F6B_P_2,
1924   VEX_W_0F6C_P_2,
1925   VEX_W_0F6D_P_2,
1926   VEX_W_0F6F_P_1,
1927   VEX_W_0F6F_P_2,
1928   VEX_W_0F70_P_1,
1929   VEX_W_0F70_P_2,
1930   VEX_W_0F70_P_3,
1931   VEX_W_0F71_R_2_P_2,
1932   VEX_W_0F71_R_4_P_2,
1933   VEX_W_0F71_R_6_P_2,
1934   VEX_W_0F72_R_2_P_2,
1935   VEX_W_0F72_R_4_P_2,
1936   VEX_W_0F72_R_6_P_2,
1937   VEX_W_0F73_R_2_P_2,
1938   VEX_W_0F73_R_3_P_2,
1939   VEX_W_0F73_R_6_P_2,
1940   VEX_W_0F73_R_7_P_2,
1941   VEX_W_0F74_P_2,
1942   VEX_W_0F75_P_2,
1943   VEX_W_0F76_P_2,
1944   VEX_W_0F77_P_0,
1945   VEX_W_0F7C_P_2,
1946   VEX_W_0F7C_P_3,
1947   VEX_W_0F7D_P_2,
1948   VEX_W_0F7D_P_3,
1949   VEX_W_0F7E_P_1,
1950   VEX_W_0F7F_P_1,
1951   VEX_W_0F7F_P_2,
1952   VEX_W_0F90_P_0_LEN_0,
1953   VEX_W_0F90_P_2_LEN_0,
1954   VEX_W_0F91_P_0_LEN_0,
1955   VEX_W_0F91_P_2_LEN_0,
1956   VEX_W_0F92_P_0_LEN_0,
1957   VEX_W_0F92_P_2_LEN_0,
1958   VEX_W_0F92_P_3_LEN_0,
1959   VEX_W_0F93_P_0_LEN_0,
1960   VEX_W_0F93_P_2_LEN_0,
1961   VEX_W_0F93_P_3_LEN_0,
1962   VEX_W_0F98_P_0_LEN_0,
1963   VEX_W_0F98_P_2_LEN_0,
1964   VEX_W_0F99_P_0_LEN_0,
1965   VEX_W_0F99_P_2_LEN_0,
1966   VEX_W_0FAE_R_2_M_0,
1967   VEX_W_0FAE_R_3_M_0,
1968   VEX_W_0FC2_P_0,
1969   VEX_W_0FC2_P_1,
1970   VEX_W_0FC2_P_2,
1971   VEX_W_0FC2_P_3,
1972   VEX_W_0FC4_P_2,
1973   VEX_W_0FC5_P_2,
1974   VEX_W_0FD0_P_2,
1975   VEX_W_0FD0_P_3,
1976   VEX_W_0FD1_P_2,
1977   VEX_W_0FD2_P_2,
1978   VEX_W_0FD3_P_2,
1979   VEX_W_0FD4_P_2,
1980   VEX_W_0FD5_P_2,
1981   VEX_W_0FD6_P_2,
1982   VEX_W_0FD7_P_2_M_1,
1983   VEX_W_0FD8_P_2,
1984   VEX_W_0FD9_P_2,
1985   VEX_W_0FDA_P_2,
1986   VEX_W_0FDB_P_2,
1987   VEX_W_0FDC_P_2,
1988   VEX_W_0FDD_P_2,
1989   VEX_W_0FDE_P_2,
1990   VEX_W_0FDF_P_2,
1991   VEX_W_0FE0_P_2,
1992   VEX_W_0FE1_P_2,
1993   VEX_W_0FE2_P_2,
1994   VEX_W_0FE3_P_2,
1995   VEX_W_0FE4_P_2,
1996   VEX_W_0FE5_P_2,
1997   VEX_W_0FE6_P_1,
1998   VEX_W_0FE6_P_2,
1999   VEX_W_0FE6_P_3,
2000   VEX_W_0FE7_P_2_M_0,
2001   VEX_W_0FE8_P_2,
2002   VEX_W_0FE9_P_2,
2003   VEX_W_0FEA_P_2,
2004   VEX_W_0FEB_P_2,
2005   VEX_W_0FEC_P_2,
2006   VEX_W_0FED_P_2,
2007   VEX_W_0FEE_P_2,
2008   VEX_W_0FEF_P_2,
2009   VEX_W_0FF0_P_3_M_0,
2010   VEX_W_0FF1_P_2,
2011   VEX_W_0FF2_P_2,
2012   VEX_W_0FF3_P_2,
2013   VEX_W_0FF4_P_2,
2014   VEX_W_0FF5_P_2,
2015   VEX_W_0FF6_P_2,
2016   VEX_W_0FF7_P_2,
2017   VEX_W_0FF8_P_2,
2018   VEX_W_0FF9_P_2,
2019   VEX_W_0FFA_P_2,
2020   VEX_W_0FFB_P_2,
2021   VEX_W_0FFC_P_2,
2022   VEX_W_0FFD_P_2,
2023   VEX_W_0FFE_P_2,
2024   VEX_W_0F3800_P_2,
2025   VEX_W_0F3801_P_2,
2026   VEX_W_0F3802_P_2,
2027   VEX_W_0F3803_P_2,
2028   VEX_W_0F3804_P_2,
2029   VEX_W_0F3805_P_2,
2030   VEX_W_0F3806_P_2,
2031   VEX_W_0F3807_P_2,
2032   VEX_W_0F3808_P_2,
2033   VEX_W_0F3809_P_2,
2034   VEX_W_0F380A_P_2,
2035   VEX_W_0F380B_P_2,
2036   VEX_W_0F380C_P_2,
2037   VEX_W_0F380D_P_2,
2038   VEX_W_0F380E_P_2,
2039   VEX_W_0F380F_P_2,
2040   VEX_W_0F3816_P_2,
2041   VEX_W_0F3817_P_2,
2042   VEX_W_0F3818_P_2,
2043   VEX_W_0F3819_P_2,
2044   VEX_W_0F381A_P_2_M_0,
2045   VEX_W_0F381C_P_2,
2046   VEX_W_0F381D_P_2,
2047   VEX_W_0F381E_P_2,
2048   VEX_W_0F3820_P_2,
2049   VEX_W_0F3821_P_2,
2050   VEX_W_0F3822_P_2,
2051   VEX_W_0F3823_P_2,
2052   VEX_W_0F3824_P_2,
2053   VEX_W_0F3825_P_2,
2054   VEX_W_0F3828_P_2,
2055   VEX_W_0F3829_P_2,
2056   VEX_W_0F382A_P_2_M_0,
2057   VEX_W_0F382B_P_2,
2058   VEX_W_0F382C_P_2_M_0,
2059   VEX_W_0F382D_P_2_M_0,
2060   VEX_W_0F382E_P_2_M_0,
2061   VEX_W_0F382F_P_2_M_0,
2062   VEX_W_0F3830_P_2,
2063   VEX_W_0F3831_P_2,
2064   VEX_W_0F3832_P_2,
2065   VEX_W_0F3833_P_2,
2066   VEX_W_0F3834_P_2,
2067   VEX_W_0F3835_P_2,
2068   VEX_W_0F3836_P_2,
2069   VEX_W_0F3837_P_2,
2070   VEX_W_0F3838_P_2,
2071   VEX_W_0F3839_P_2,
2072   VEX_W_0F383A_P_2,
2073   VEX_W_0F383B_P_2,
2074   VEX_W_0F383C_P_2,
2075   VEX_W_0F383D_P_2,
2076   VEX_W_0F383E_P_2,
2077   VEX_W_0F383F_P_2,
2078   VEX_W_0F3840_P_2,
2079   VEX_W_0F3841_P_2,
2080   VEX_W_0F3846_P_2,
2081   VEX_W_0F3858_P_2,
2082   VEX_W_0F3859_P_2,
2083   VEX_W_0F385A_P_2_M_0,
2084   VEX_W_0F3878_P_2,
2085   VEX_W_0F3879_P_2,
2086   VEX_W_0F38DB_P_2,
2087   VEX_W_0F38DC_P_2,
2088   VEX_W_0F38DD_P_2,
2089   VEX_W_0F38DE_P_2,
2090   VEX_W_0F38DF_P_2,
2091   VEX_W_0F3A00_P_2,
2092   VEX_W_0F3A01_P_2,
2093   VEX_W_0F3A02_P_2,
2094   VEX_W_0F3A04_P_2,
2095   VEX_W_0F3A05_P_2,
2096   VEX_W_0F3A06_P_2,
2097   VEX_W_0F3A08_P_2,
2098   VEX_W_0F3A09_P_2,
2099   VEX_W_0F3A0A_P_2,
2100   VEX_W_0F3A0B_P_2,
2101   VEX_W_0F3A0C_P_2,
2102   VEX_W_0F3A0D_P_2,
2103   VEX_W_0F3A0E_P_2,
2104   VEX_W_0F3A0F_P_2,
2105   VEX_W_0F3A14_P_2,
2106   VEX_W_0F3A15_P_2,
2107   VEX_W_0F3A18_P_2,
2108   VEX_W_0F3A19_P_2,
2109   VEX_W_0F3A20_P_2,
2110   VEX_W_0F3A21_P_2,
2111   VEX_W_0F3A30_P_2_LEN_0,
2112   VEX_W_0F3A31_P_2_LEN_0,
2113   VEX_W_0F3A32_P_2_LEN_0,
2114   VEX_W_0F3A33_P_2_LEN_0,
2115   VEX_W_0F3A38_P_2,
2116   VEX_W_0F3A39_P_2,
2117   VEX_W_0F3A40_P_2,
2118   VEX_W_0F3A41_P_2,
2119   VEX_W_0F3A42_P_2,
2120   VEX_W_0F3A44_P_2,
2121   VEX_W_0F3A46_P_2,
2122   VEX_W_0F3A48_P_2,
2123   VEX_W_0F3A49_P_2,
2124   VEX_W_0F3A4A_P_2,
2125   VEX_W_0F3A4B_P_2,
2126   VEX_W_0F3A4C_P_2,
2127   VEX_W_0F3A60_P_2,
2128   VEX_W_0F3A61_P_2,
2129   VEX_W_0F3A62_P_2,
2130   VEX_W_0F3A63_P_2,
2131   VEX_W_0F3ADF_P_2,
2132
2133   EVEX_W_0F10_P_0,
2134   EVEX_W_0F10_P_1_M_0,
2135   EVEX_W_0F10_P_1_M_1,
2136   EVEX_W_0F10_P_2,
2137   EVEX_W_0F10_P_3_M_0,
2138   EVEX_W_0F10_P_3_M_1,
2139   EVEX_W_0F11_P_0,
2140   EVEX_W_0F11_P_1_M_0,
2141   EVEX_W_0F11_P_1_M_1,
2142   EVEX_W_0F11_P_2,
2143   EVEX_W_0F11_P_3_M_0,
2144   EVEX_W_0F11_P_3_M_1,
2145   EVEX_W_0F12_P_0_M_0,
2146   EVEX_W_0F12_P_0_M_1,
2147   EVEX_W_0F12_P_1,
2148   EVEX_W_0F12_P_2,
2149   EVEX_W_0F12_P_3,
2150   EVEX_W_0F13_P_0,
2151   EVEX_W_0F13_P_2,
2152   EVEX_W_0F14_P_0,
2153   EVEX_W_0F14_P_2,
2154   EVEX_W_0F15_P_0,
2155   EVEX_W_0F15_P_2,
2156   EVEX_W_0F16_P_0_M_0,
2157   EVEX_W_0F16_P_0_M_1,
2158   EVEX_W_0F16_P_1,
2159   EVEX_W_0F16_P_2,
2160   EVEX_W_0F17_P_0,
2161   EVEX_W_0F17_P_2,
2162   EVEX_W_0F28_P_0,
2163   EVEX_W_0F28_P_2,
2164   EVEX_W_0F29_P_0,
2165   EVEX_W_0F29_P_2,
2166   EVEX_W_0F2A_P_1,
2167   EVEX_W_0F2A_P_3,
2168   EVEX_W_0F2B_P_0,
2169   EVEX_W_0F2B_P_2,
2170   EVEX_W_0F2E_P_0,
2171   EVEX_W_0F2E_P_2,
2172   EVEX_W_0F2F_P_0,
2173   EVEX_W_0F2F_P_2,
2174   EVEX_W_0F51_P_0,
2175   EVEX_W_0F51_P_1,
2176   EVEX_W_0F51_P_2,
2177   EVEX_W_0F51_P_3,
2178   EVEX_W_0F54_P_0,
2179   EVEX_W_0F54_P_2,
2180   EVEX_W_0F55_P_0,
2181   EVEX_W_0F55_P_2,
2182   EVEX_W_0F56_P_0,
2183   EVEX_W_0F56_P_2,
2184   EVEX_W_0F57_P_0,
2185   EVEX_W_0F57_P_2,
2186   EVEX_W_0F58_P_0,
2187   EVEX_W_0F58_P_1,
2188   EVEX_W_0F58_P_2,
2189   EVEX_W_0F58_P_3,
2190   EVEX_W_0F59_P_0,
2191   EVEX_W_0F59_P_1,
2192   EVEX_W_0F59_P_2,
2193   EVEX_W_0F59_P_3,
2194   EVEX_W_0F5A_P_0,
2195   EVEX_W_0F5A_P_1,
2196   EVEX_W_0F5A_P_2,
2197   EVEX_W_0F5A_P_3,
2198   EVEX_W_0F5B_P_0,
2199   EVEX_W_0F5B_P_1,
2200   EVEX_W_0F5B_P_2,
2201   EVEX_W_0F5C_P_0,
2202   EVEX_W_0F5C_P_1,
2203   EVEX_W_0F5C_P_2,
2204   EVEX_W_0F5C_P_3,
2205   EVEX_W_0F5D_P_0,
2206   EVEX_W_0F5D_P_1,
2207   EVEX_W_0F5D_P_2,
2208   EVEX_W_0F5D_P_3,
2209   EVEX_W_0F5E_P_0,
2210   EVEX_W_0F5E_P_1,
2211   EVEX_W_0F5E_P_2,
2212   EVEX_W_0F5E_P_3,
2213   EVEX_W_0F5F_P_0,
2214   EVEX_W_0F5F_P_1,
2215   EVEX_W_0F5F_P_2,
2216   EVEX_W_0F5F_P_3,
2217   EVEX_W_0F62_P_2,
2218   EVEX_W_0F66_P_2,
2219   EVEX_W_0F6A_P_2,
2220   EVEX_W_0F6B_P_2,
2221   EVEX_W_0F6C_P_2,
2222   EVEX_W_0F6D_P_2,
2223   EVEX_W_0F6E_P_2,
2224   EVEX_W_0F6F_P_1,
2225   EVEX_W_0F6F_P_2,
2226   EVEX_W_0F6F_P_3,
2227   EVEX_W_0F70_P_2,
2228   EVEX_W_0F72_R_2_P_2,
2229   EVEX_W_0F72_R_6_P_2,
2230   EVEX_W_0F73_R_2_P_2,
2231   EVEX_W_0F73_R_6_P_2,
2232   EVEX_W_0F76_P_2,
2233   EVEX_W_0F78_P_0,
2234   EVEX_W_0F78_P_2,
2235   EVEX_W_0F79_P_0,
2236   EVEX_W_0F79_P_2,
2237   EVEX_W_0F7A_P_1,
2238   EVEX_W_0F7A_P_2,
2239   EVEX_W_0F7A_P_3,
2240   EVEX_W_0F7B_P_1,
2241   EVEX_W_0F7B_P_2,
2242   EVEX_W_0F7B_P_3,
2243   EVEX_W_0F7E_P_1,
2244   EVEX_W_0F7E_P_2,
2245   EVEX_W_0F7F_P_1,
2246   EVEX_W_0F7F_P_2,
2247   EVEX_W_0F7F_P_3,
2248   EVEX_W_0FC2_P_0,
2249   EVEX_W_0FC2_P_1,
2250   EVEX_W_0FC2_P_2,
2251   EVEX_W_0FC2_P_3,
2252   EVEX_W_0FC6_P_0,
2253   EVEX_W_0FC6_P_2,
2254   EVEX_W_0FD2_P_2,
2255   EVEX_W_0FD3_P_2,
2256   EVEX_W_0FD4_P_2,
2257   EVEX_W_0FD6_P_2,
2258   EVEX_W_0FE6_P_1,
2259   EVEX_W_0FE6_P_2,
2260   EVEX_W_0FE6_P_3,
2261   EVEX_W_0FE7_P_2,
2262   EVEX_W_0FF2_P_2,
2263   EVEX_W_0FF3_P_2,
2264   EVEX_W_0FF4_P_2,
2265   EVEX_W_0FFA_P_2,
2266   EVEX_W_0FFB_P_2,
2267   EVEX_W_0FFE_P_2,
2268   EVEX_W_0F380C_P_2,
2269   EVEX_W_0F380D_P_2,
2270   EVEX_W_0F3810_P_1,
2271   EVEX_W_0F3810_P_2,
2272   EVEX_W_0F3811_P_1,
2273   EVEX_W_0F3811_P_2,
2274   EVEX_W_0F3812_P_1,
2275   EVEX_W_0F3812_P_2,
2276   EVEX_W_0F3813_P_1,
2277   EVEX_W_0F3813_P_2,
2278   EVEX_W_0F3814_P_1,
2279   EVEX_W_0F3815_P_1,
2280   EVEX_W_0F3818_P_2,
2281   EVEX_W_0F3819_P_2,
2282   EVEX_W_0F381A_P_2,
2283   EVEX_W_0F381B_P_2,
2284   EVEX_W_0F381E_P_2,
2285   EVEX_W_0F381F_P_2,
2286   EVEX_W_0F3820_P_1,
2287   EVEX_W_0F3821_P_1,
2288   EVEX_W_0F3822_P_1,
2289   EVEX_W_0F3823_P_1,
2290   EVEX_W_0F3824_P_1,
2291   EVEX_W_0F3825_P_1,
2292   EVEX_W_0F3825_P_2,
2293   EVEX_W_0F3826_P_1,
2294   EVEX_W_0F3826_P_2,
2295   EVEX_W_0F3828_P_1,
2296   EVEX_W_0F3828_P_2,
2297   EVEX_W_0F3829_P_1,
2298   EVEX_W_0F3829_P_2,
2299   EVEX_W_0F382A_P_1,
2300   EVEX_W_0F382A_P_2,
2301   EVEX_W_0F382B_P_2,
2302   EVEX_W_0F3830_P_1,
2303   EVEX_W_0F3831_P_1,
2304   EVEX_W_0F3832_P_1,
2305   EVEX_W_0F3833_P_1,
2306   EVEX_W_0F3834_P_1,
2307   EVEX_W_0F3835_P_1,
2308   EVEX_W_0F3835_P_2,
2309   EVEX_W_0F3837_P_2,
2310   EVEX_W_0F3838_P_1,
2311   EVEX_W_0F3839_P_1,
2312   EVEX_W_0F383A_P_1,
2313   EVEX_W_0F3840_P_2,
2314   EVEX_W_0F3858_P_2,
2315   EVEX_W_0F3859_P_2,
2316   EVEX_W_0F385A_P_2,
2317   EVEX_W_0F385B_P_2,
2318   EVEX_W_0F3866_P_2,
2319   EVEX_W_0F3875_P_2,
2320   EVEX_W_0F3878_P_2,
2321   EVEX_W_0F3879_P_2,
2322   EVEX_W_0F387A_P_2,
2323   EVEX_W_0F387B_P_2,
2324   EVEX_W_0F387D_P_2,
2325   EVEX_W_0F3883_P_2,
2326   EVEX_W_0F388D_P_2,
2327   EVEX_W_0F3891_P_2,
2328   EVEX_W_0F3893_P_2,
2329   EVEX_W_0F38A1_P_2,
2330   EVEX_W_0F38A3_P_2,
2331   EVEX_W_0F38C7_R_1_P_2,
2332   EVEX_W_0F38C7_R_2_P_2,
2333   EVEX_W_0F38C7_R_5_P_2,
2334   EVEX_W_0F38C7_R_6_P_2,
2335
2336   EVEX_W_0F3A00_P_2,
2337   EVEX_W_0F3A01_P_2,
2338   EVEX_W_0F3A04_P_2,
2339   EVEX_W_0F3A05_P_2,
2340   EVEX_W_0F3A08_P_2,
2341   EVEX_W_0F3A09_P_2,
2342   EVEX_W_0F3A0A_P_2,
2343   EVEX_W_0F3A0B_P_2,
2344   EVEX_W_0F3A16_P_2,
2345   EVEX_W_0F3A18_P_2,
2346   EVEX_W_0F3A19_P_2,
2347   EVEX_W_0F3A1A_P_2,
2348   EVEX_W_0F3A1B_P_2,
2349   EVEX_W_0F3A1D_P_2,
2350   EVEX_W_0F3A21_P_2,
2351   EVEX_W_0F3A22_P_2,
2352   EVEX_W_0F3A23_P_2,
2353   EVEX_W_0F3A38_P_2,
2354   EVEX_W_0F3A39_P_2,
2355   EVEX_W_0F3A3A_P_2,
2356   EVEX_W_0F3A3B_P_2,
2357   EVEX_W_0F3A3E_P_2,
2358   EVEX_W_0F3A3F_P_2,
2359   EVEX_W_0F3A42_P_2,
2360   EVEX_W_0F3A43_P_2,
2361   EVEX_W_0F3A50_P_2,
2362   EVEX_W_0F3A51_P_2,
2363   EVEX_W_0F3A56_P_2,
2364   EVEX_W_0F3A57_P_2,
2365   EVEX_W_0F3A66_P_2,
2366   EVEX_W_0F3A67_P_2
2367 };
2368
2369 typedef void (*op_rtn) (int bytemode, int sizeflag);
2370
2371 struct dis386 {
2372   const char *name;
2373   struct
2374     {
2375       op_rtn rtn;
2376       int bytemode;
2377     } op[MAX_OPERANDS];
2378   unsigned int prefix_requirement;
2379 };
2380
2381 /* Upper case letters in the instruction names here are macros.
2382    'A' => print 'b' if no register operands or suffix_always is true
2383    'B' => print 'b' if suffix_always is true
2384    'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
2385           size prefix
2386    'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
2387           suffix_always is true
2388    'E' => print 'e' if 32-bit form of jcxz
2389    'F' => print 'w' or 'l' depending on address size prefix (loop insns)
2390    'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
2391    'H' => print ",pt" or ",pn" branch hint
2392    'I' => honor following macro letter even in Intel mode (implemented only
2393           for some of the macro letters)
2394    'J' => print 'l'
2395    'K' => print 'd' or 'q' if rex prefix is present.
2396    'L' => print 'l' if suffix_always is true
2397    'M' => print 'r' if intel_mnemonic is false.
2398    'N' => print 'n' if instruction has no wait "prefix"
2399    'O' => print 'd' or 'o' (or 'q' in Intel mode)
2400    'P' => print 'w', 'l' or 'q' if instruction has an operand size prefix,
2401           or suffix_always is true.  print 'q' if rex prefix is present.
2402    'Q' => print 'w', 'l' or 'q' for memory operand or suffix_always
2403           is true
2404    'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
2405    'S' => print 'w', 'l' or 'q' if suffix_always is true
2406    'T' => print 'q' in 64bit mode if instruction has no operand size
2407           prefix and behave as 'P' otherwise
2408    'U' => print 'q' in 64bit mode if instruction has no operand size
2409           prefix and behave as 'Q' otherwise
2410    'V' => print 'q' in 64bit mode if instruction has no operand size
2411           prefix and behave as 'S' otherwise
2412    'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
2413    'X' => print 's', 'd' depending on data16 prefix (for XMM)
2414    'Y' => 'q' if instruction has an REX 64bit overwrite prefix and
2415           suffix_always is true.
2416    'Z' => print 'q' in 64bit mode and behave as 'L' otherwise
2417    '!' => change condition from true to false or from false to true.
2418    '%' => add 1 upper case letter to the macro.
2419    '^' => print 'w' or 'l' depending on operand size prefix or
2420           suffix_always is true (lcall/ljmp).
2421    '@' => print 'q' for Intel64 ISA, 'w' or 'q' for AMD64 ISA depending
2422           on operand size prefix.
2423
2424    2 upper case letter macros:
2425    "XY" => print 'x' or 'y' if suffix_always is true or no register
2426            operands and no broadcast.
2427    "XZ" => print 'x', 'y', or 'z' if suffix_always is true or no
2428            register operands and no broadcast.
2429    "XW" => print 's', 'd' depending on the VEX.W bit (for FMA)
2430    "LQ" => print 'l' ('d' in Intel mode) or 'q' for memory operand
2431            or suffix_always is true
2432    "LB" => print "abs" in 64bit mode and behave as 'B' otherwise
2433    "LS" => print "abs" in 64bit mode and behave as 'S' otherwise
2434    "LV" => print "abs" for 64bit operand and behave as 'S' otherwise
2435    "LW" => print 'd', 'q' depending on the VEX.W bit
2436    "LP" => print 'w' or 'l' ('d' in Intel mode) if instruction has
2437            an operand size prefix, or suffix_always is true.  print
2438            'q' if rex prefix is present.
2439
2440    Many of the above letters print nothing in Intel mode.  See "putop"
2441    for the details.
2442
2443    Braces '{' and '}', and vertical bars '|', indicate alternative
2444    mnemonic strings for AT&T and Intel.  */
2445
2446 static const struct dis386 dis386[] = {
2447   /* 00 */
2448   { "addB",             { Ebh1, Gb }, 0 },
2449   { "addS",             { Evh1, Gv }, 0 },
2450   { "addB",             { Gb, EbS }, 0 },
2451   { "addS",             { Gv, EvS }, 0 },
2452   { "addB",             { AL, Ib }, 0 },
2453   { "addS",             { eAX, Iv }, 0 },
2454   { X86_64_TABLE (X86_64_06) },
2455   { X86_64_TABLE (X86_64_07) },
2456   /* 08 */
2457   { "orB",              { Ebh1, Gb }, 0 },
2458   { "orS",              { Evh1, Gv }, 0 },
2459   { "orB",              { Gb, EbS }, 0 },
2460   { "orS",              { Gv, EvS }, 0 },
2461   { "orB",              { AL, Ib }, 0 },
2462   { "orS",              { eAX, Iv }, 0 },
2463   { X86_64_TABLE (X86_64_0D) },
2464   { Bad_Opcode },       /* 0x0f extended opcode escape */
2465   /* 10 */
2466   { "adcB",             { Ebh1, Gb }, 0 },
2467   { "adcS",             { Evh1, Gv }, 0 },
2468   { "adcB",             { Gb, EbS }, 0 },
2469   { "adcS",             { Gv, EvS }, 0 },
2470   { "adcB",             { AL, Ib }, 0 },
2471   { "adcS",             { eAX, Iv }, 0 },
2472   { X86_64_TABLE (X86_64_16) },
2473   { X86_64_TABLE (X86_64_17) },
2474   /* 18 */
2475   { "sbbB",             { Ebh1, Gb }, 0 },
2476   { "sbbS",             { Evh1, Gv }, 0 },
2477   { "sbbB",             { Gb, EbS }, 0 },
2478   { "sbbS",             { Gv, EvS }, 0 },
2479   { "sbbB",             { AL, Ib }, 0 },
2480   { "sbbS",             { eAX, Iv }, 0 },
2481   { X86_64_TABLE (X86_64_1E) },
2482   { X86_64_TABLE (X86_64_1F) },
2483   /* 20 */
2484   { "andB",             { Ebh1, Gb }, 0 },
2485   { "andS",             { Evh1, Gv }, 0 },
2486   { "andB",             { Gb, EbS }, 0 },
2487   { "andS",             { Gv, EvS }, 0 },
2488   { "andB",             { AL, Ib }, 0 },
2489   { "andS",             { eAX, Iv }, 0 },
2490   { Bad_Opcode },       /* SEG ES prefix */
2491   { X86_64_TABLE (X86_64_27) },
2492   /* 28 */
2493   { "subB",             { Ebh1, Gb }, 0 },
2494   { "subS",             { Evh1, Gv }, 0 },
2495   { "subB",             { Gb, EbS }, 0 },
2496   { "subS",             { Gv, EvS }, 0 },
2497   { "subB",             { AL, Ib }, 0 },
2498   { "subS",             { eAX, Iv }, 0 },
2499   { Bad_Opcode },       /* SEG CS prefix */
2500   { X86_64_TABLE (X86_64_2F) },
2501   /* 30 */
2502   { "xorB",             { Ebh1, Gb }, 0 },
2503   { "xorS",             { Evh1, Gv }, 0 },
2504   { "xorB",             { Gb, EbS }, 0 },
2505   { "xorS",             { Gv, EvS }, 0 },
2506   { "xorB",             { AL, Ib }, 0 },
2507   { "xorS",             { eAX, Iv }, 0 },
2508   { Bad_Opcode },       /* SEG SS prefix */
2509   { X86_64_TABLE (X86_64_37) },
2510   /* 38 */
2511   { "cmpB",             { Eb, Gb }, 0 },
2512   { "cmpS",             { Ev, Gv }, 0 },
2513   { "cmpB",             { Gb, EbS }, 0 },
2514   { "cmpS",             { Gv, EvS }, 0 },
2515   { "cmpB",             { AL, Ib }, 0 },
2516   { "cmpS",             { eAX, Iv }, 0 },
2517   { Bad_Opcode },       /* SEG DS prefix */
2518   { X86_64_TABLE (X86_64_3F) },
2519   /* 40 */
2520   { "inc{S|}",          { RMeAX }, 0 },
2521   { "inc{S|}",          { RMeCX }, 0 },
2522   { "inc{S|}",          { RMeDX }, 0 },
2523   { "inc{S|}",          { RMeBX }, 0 },
2524   { "inc{S|}",          { RMeSP }, 0 },
2525   { "inc{S|}",          { RMeBP }, 0 },
2526   { "inc{S|}",          { RMeSI }, 0 },
2527   { "inc{S|}",          { RMeDI }, 0 },
2528   /* 48 */
2529   { "dec{S|}",          { RMeAX }, 0 },
2530   { "dec{S|}",          { RMeCX }, 0 },
2531   { "dec{S|}",          { RMeDX }, 0 },
2532   { "dec{S|}",          { RMeBX }, 0 },
2533   { "dec{S|}",          { RMeSP }, 0 },
2534   { "dec{S|}",          { RMeBP }, 0 },
2535   { "dec{S|}",          { RMeSI }, 0 },
2536   { "dec{S|}",          { RMeDI }, 0 },
2537   /* 50 */
2538   { "pushV",            { RMrAX }, 0 },
2539   { "pushV",            { RMrCX }, 0 },
2540   { "pushV",            { RMrDX }, 0 },
2541   { "pushV",            { RMrBX }, 0 },
2542   { "pushV",            { RMrSP }, 0 },
2543   { "pushV",            { RMrBP }, 0 },
2544   { "pushV",            { RMrSI }, 0 },
2545   { "pushV",            { RMrDI }, 0 },
2546   /* 58 */
2547   { "popV",             { RMrAX }, 0 },
2548   { "popV",             { RMrCX }, 0 },
2549   { "popV",             { RMrDX }, 0 },
2550   { "popV",             { RMrBX }, 0 },
2551   { "popV",             { RMrSP }, 0 },
2552   { "popV",             { RMrBP }, 0 },
2553   { "popV",             { RMrSI }, 0 },
2554   { "popV",             { RMrDI }, 0 },
2555   /* 60 */
2556   { X86_64_TABLE (X86_64_60) },
2557   { X86_64_TABLE (X86_64_61) },
2558   { X86_64_TABLE (X86_64_62) },
2559   { X86_64_TABLE (X86_64_63) },
2560   { Bad_Opcode },       /* seg fs */
2561   { Bad_Opcode },       /* seg gs */
2562   { Bad_Opcode },       /* op size prefix */
2563   { Bad_Opcode },       /* adr size prefix */
2564   /* 68 */
2565   { "pushT",            { sIv }, 0 },
2566   { "imulS",            { Gv, Ev, Iv }, 0 },
2567   { "pushT",            { sIbT }, 0 },
2568   { "imulS",            { Gv, Ev, sIb }, 0 },
2569   { "ins{b|}",          { Ybr, indirDX }, 0 },
2570   { X86_64_TABLE (X86_64_6D) },
2571   { "outs{b|}",         { indirDXr, Xb }, 0 },
2572   { X86_64_TABLE (X86_64_6F) },
2573   /* 70 */
2574   { "joH",              { Jb, BND, cond_jump_flag }, 0 },
2575   { "jnoH",             { Jb, BND, cond_jump_flag }, 0 },
2576   { "jbH",              { Jb, BND, cond_jump_flag }, 0 },
2577   { "jaeH",             { Jb, BND, cond_jump_flag }, 0 },
2578   { "jeH",              { Jb, BND, cond_jump_flag }, 0 },
2579   { "jneH",             { Jb, BND, cond_jump_flag }, 0 },
2580   { "jbeH",             { Jb, BND, cond_jump_flag }, 0 },
2581   { "jaH",              { Jb, BND, cond_jump_flag }, 0 },
2582   /* 78 */
2583   { "jsH",              { Jb, BND, cond_jump_flag }, 0 },
2584   { "jnsH",             { Jb, BND, cond_jump_flag }, 0 },
2585   { "jpH",              { Jb, BND, cond_jump_flag }, 0 },
2586   { "jnpH",             { Jb, BND, cond_jump_flag }, 0 },
2587   { "jlH",              { Jb, BND, cond_jump_flag }, 0 },
2588   { "jgeH",             { Jb, BND, cond_jump_flag }, 0 },
2589   { "jleH",             { Jb, BND, cond_jump_flag }, 0 },
2590   { "jgH",              { Jb, BND, cond_jump_flag }, 0 },
2591   /* 80 */
2592   { REG_TABLE (REG_80) },
2593   { REG_TABLE (REG_81) },
2594   { Bad_Opcode },
2595   { REG_TABLE (REG_82) },
2596   { "testB",            { Eb, Gb }, 0 },
2597   { "testS",            { Ev, Gv }, 0 },
2598   { "xchgB",            { Ebh2, Gb }, 0 },
2599   { "xchgS",            { Evh2, Gv }, 0 },
2600   /* 88 */
2601   { "movB",             { Ebh3, Gb }, 0 },
2602   { "movS",             { Evh3, Gv }, 0 },
2603   { "movB",             { Gb, EbS }, 0 },
2604   { "movS",             { Gv, EvS }, 0 },
2605   { "movD",             { Sv, Sw }, 0 },
2606   { MOD_TABLE (MOD_8D) },
2607   { "movD",             { Sw, Sv }, 0 },
2608   { REG_TABLE (REG_8F) },
2609   /* 90 */
2610   { PREFIX_TABLE (PREFIX_90) },
2611   { "xchgS",            { RMeCX, eAX }, 0 },
2612   { "xchgS",            { RMeDX, eAX }, 0 },
2613   { "xchgS",            { RMeBX, eAX }, 0 },
2614   { "xchgS",            { RMeSP, eAX }, 0 },
2615   { "xchgS",            { RMeBP, eAX }, 0 },
2616   { "xchgS",            { RMeSI, eAX }, 0 },
2617   { "xchgS",            { RMeDI, eAX }, 0 },
2618   /* 98 */
2619   { "cW{t|}R",          { XX }, 0 },
2620   { "cR{t|}O",          { XX }, 0 },
2621   { X86_64_TABLE (X86_64_9A) },
2622   { Bad_Opcode },       /* fwait */
2623   { "pushfT",           { XX }, 0 },
2624   { "popfT",            { XX }, 0 },
2625   { "sahf",             { XX }, 0 },
2626   { "lahf",             { XX }, 0 },
2627   /* a0 */
2628   { "mov%LB",           { AL, Ob }, 0 },
2629   { "mov%LS",           { eAX, Ov }, 0 },
2630   { "mov%LB",           { Ob, AL }, 0 },
2631   { "mov%LS",           { Ov, eAX }, 0 },
2632   { "movs{b|}",         { Ybr, Xb }, 0 },
2633   { "movs{R|}",         { Yvr, Xv }, 0 },
2634   { "cmps{b|}",         { Xb, Yb }, 0 },
2635   { "cmps{R|}",         { Xv, Yv }, 0 },
2636   /* a8 */
2637   { "testB",            { AL, Ib }, 0 },
2638   { "testS",            { eAX, Iv }, 0 },
2639   { "stosB",            { Ybr, AL }, 0 },
2640   { "stosS",            { Yvr, eAX }, 0 },
2641   { "lodsB",            { ALr, Xb }, 0 },
2642   { "lodsS",            { eAXr, Xv }, 0 },
2643   { "scasB",            { AL, Yb }, 0 },
2644   { "scasS",            { eAX, Yv }, 0 },
2645   /* b0 */
2646   { "movB",             { RMAL, Ib }, 0 },
2647   { "movB",             { RMCL, Ib }, 0 },
2648   { "movB",             { RMDL, Ib }, 0 },
2649   { "movB",             { RMBL, Ib }, 0 },
2650   { "movB",             { RMAH, Ib }, 0 },
2651   { "movB",             { RMCH, Ib }, 0 },
2652   { "movB",             { RMDH, Ib }, 0 },
2653   { "movB",             { RMBH, Ib }, 0 },
2654   /* b8 */
2655   { "mov%LV",           { RMeAX, Iv64 }, 0 },
2656   { "mov%LV",           { RMeCX, Iv64 }, 0 },
2657   { "mov%LV",           { RMeDX, Iv64 }, 0 },
2658   { "mov%LV",           { RMeBX, Iv64 }, 0 },
2659   { "mov%LV",           { RMeSP, Iv64 }, 0 },
2660   { "mov%LV",           { RMeBP, Iv64 }, 0 },
2661   { "mov%LV",           { RMeSI, Iv64 }, 0 },
2662   { "mov%LV",           { RMeDI, Iv64 }, 0 },
2663   /* c0 */
2664   { REG_TABLE (REG_C0) },
2665   { REG_TABLE (REG_C1) },
2666   { "retT",             { Iw, BND }, 0 },
2667   { "retT",             { BND }, 0 },
2668   { X86_64_TABLE (X86_64_C4) },
2669   { X86_64_TABLE (X86_64_C5) },
2670   { REG_TABLE (REG_C6) },
2671   { REG_TABLE (REG_C7) },
2672   /* c8 */
2673   { "enterT",           { Iw, Ib }, 0 },
2674   { "leaveT",           { XX }, 0 },
2675   { "Jret{|f}P",        { Iw }, 0 },
2676   { "Jret{|f}P",        { XX }, 0 },
2677   { "int3",             { XX }, 0 },
2678   { "int",              { Ib }, 0 },
2679   { X86_64_TABLE (X86_64_CE) },
2680   { "iret%LP",          { XX }, 0 },
2681   /* d0 */
2682   { REG_TABLE (REG_D0) },
2683   { REG_TABLE (REG_D1) },
2684   { REG_TABLE (REG_D2) },
2685   { REG_TABLE (REG_D3) },
2686   { X86_64_TABLE (X86_64_D4) },
2687   { X86_64_TABLE (X86_64_D5) },
2688   { Bad_Opcode },
2689   { "xlat",             { DSBX }, 0 },
2690   /* d8 */
2691   { FLOAT },
2692   { FLOAT },
2693   { FLOAT },
2694   { FLOAT },
2695   { FLOAT },
2696   { FLOAT },
2697   { FLOAT },
2698   { FLOAT },
2699   /* e0 */
2700   { "loopneFH",         { Jb, XX, loop_jcxz_flag }, 0 },
2701   { "loopeFH",          { Jb, XX, loop_jcxz_flag }, 0 },
2702   { "loopFH",           { Jb, XX, loop_jcxz_flag }, 0 },
2703   { "jEcxzH",           { Jb, XX, loop_jcxz_flag }, 0 },
2704   { "inB",              { AL, Ib }, 0 },
2705   { "inG",              { zAX, Ib }, 0 },
2706   { "outB",             { Ib, AL }, 0 },
2707   { "outG",             { Ib, zAX }, 0 },
2708   /* e8 */
2709   { X86_64_TABLE (X86_64_E8) },
2710   { X86_64_TABLE (X86_64_E9) },
2711   { X86_64_TABLE (X86_64_EA) },
2712   { "jmp",              { Jb, BND }, 0 },
2713   { "inB",              { AL, indirDX }, 0 },
2714   { "inG",              { zAX, indirDX }, 0 },
2715   { "outB",             { indirDX, AL }, 0 },
2716   { "outG",             { indirDX, zAX }, 0 },
2717   /* f0 */
2718   { Bad_Opcode },       /* lock prefix */
2719   { "icebp",            { XX }, 0 },
2720   { Bad_Opcode },       /* repne */
2721   { Bad_Opcode },       /* repz */
2722   { "hlt",              { XX }, 0 },
2723   { "cmc",              { XX }, 0 },
2724   { REG_TABLE (REG_F6) },
2725   { REG_TABLE (REG_F7) },
2726   /* f8 */
2727   { "clc",              { XX }, 0 },
2728   { "stc",              { XX }, 0 },
2729   { "cli",              { XX }, 0 },
2730   { "sti",              { XX }, 0 },
2731   { "cld",              { XX }, 0 },
2732   { "std",              { XX }, 0 },
2733   { REG_TABLE (REG_FE) },
2734   { REG_TABLE (REG_FF) },
2735 };
2736
2737 static const struct dis386 dis386_twobyte[] = {
2738   /* 00 */
2739   { REG_TABLE (REG_0F00 ) },
2740   { REG_TABLE (REG_0F01 ) },
2741   { "larS",             { Gv, Ew }, 0 },
2742   { "lslS",             { Gv, Ew }, 0 },
2743   { Bad_Opcode },
2744   { "syscall",          { XX }, 0 },
2745   { "clts",             { XX }, 0 },
2746   { "sysret%LP",                { XX }, 0 },
2747   /* 08 */
2748   { "invd",             { XX }, 0 },
2749   { "wbinvd",           { XX }, 0 },
2750   { Bad_Opcode },
2751   { "ud2",              { XX }, 0 },
2752   { Bad_Opcode },
2753   { REG_TABLE (REG_0F0D) },
2754   { "femms",            { XX }, 0 },
2755   { "",                 { MX, EM, OPSUF }, 0 }, /* See OP_3DNowSuffix.  */
2756   /* 10 */
2757   { PREFIX_TABLE (PREFIX_0F10) },
2758   { PREFIX_TABLE (PREFIX_0F11) },
2759   { PREFIX_TABLE (PREFIX_0F12) },
2760   { MOD_TABLE (MOD_0F13) },
2761   { "unpcklpX",         { XM, EXx }, PREFIX_OPCODE },
2762   { "unpckhpX",         { XM, EXx }, PREFIX_OPCODE },
2763   { PREFIX_TABLE (PREFIX_0F16) },
2764   { MOD_TABLE (MOD_0F17) },
2765   /* 18 */
2766   { REG_TABLE (REG_0F18) },
2767   { "nopQ",             { Ev }, 0 },
2768   { PREFIX_TABLE (PREFIX_0F1A) },
2769   { PREFIX_TABLE (PREFIX_0F1B) },
2770   { "nopQ",             { Ev }, 0 },
2771   { "nopQ",             { Ev }, 0 },
2772   { "nopQ",             { Ev }, 0 },
2773   { "nopQ",             { Ev }, 0 },
2774   /* 20 */
2775   { "movZ",             { Rm, Cm }, 0 },
2776   { "movZ",             { Rm, Dm }, 0 },
2777   { "movZ",             { Cm, Rm }, 0 },
2778   { "movZ",             { Dm, Rm }, 0 },
2779   { MOD_TABLE (MOD_0F24) },
2780   { Bad_Opcode },
2781   { MOD_TABLE (MOD_0F26) },
2782   { Bad_Opcode },
2783   /* 28 */
2784   { "movapX",           { XM, EXx }, PREFIX_OPCODE },
2785   { "movapX",           { EXxS, XM }, PREFIX_OPCODE },
2786   { PREFIX_TABLE (PREFIX_0F2A) },
2787   { PREFIX_TABLE (PREFIX_0F2B) },
2788   { PREFIX_TABLE (PREFIX_0F2C) },
2789   { PREFIX_TABLE (PREFIX_0F2D) },
2790   { PREFIX_TABLE (PREFIX_0F2E) },
2791   { PREFIX_TABLE (PREFIX_0F2F) },
2792   /* 30 */
2793   { "wrmsr",            { XX }, 0 },
2794   { "rdtsc",            { XX }, 0 },
2795   { "rdmsr",            { XX }, 0 },
2796   { "rdpmc",            { XX }, 0 },
2797   { "sysenter",         { XX }, 0 },
2798   { "sysexit",          { XX }, 0 },
2799   { Bad_Opcode },
2800   { "getsec",           { XX }, 0 },
2801   /* 38 */
2802   { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F38, PREFIX_OPCODE) },
2803   { Bad_Opcode },
2804   { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F3A, PREFIX_OPCODE) },
2805   { Bad_Opcode },
2806   { Bad_Opcode },
2807   { Bad_Opcode },
2808   { Bad_Opcode },
2809   { Bad_Opcode },
2810   /* 40 */
2811   { "cmovoS",           { Gv, Ev }, 0 },
2812   { "cmovnoS",          { Gv, Ev }, 0 },
2813   { "cmovbS",           { Gv, Ev }, 0 },
2814   { "cmovaeS",          { Gv, Ev }, 0 },
2815   { "cmoveS",           { Gv, Ev }, 0 },
2816   { "cmovneS",          { Gv, Ev }, 0 },
2817   { "cmovbeS",          { Gv, Ev }, 0 },
2818   { "cmovaS",           { Gv, Ev }, 0 },
2819   /* 48 */
2820   { "cmovsS",           { Gv, Ev }, 0 },
2821   { "cmovnsS",          { Gv, Ev }, 0 },
2822   { "cmovpS",           { Gv, Ev }, 0 },
2823   { "cmovnpS",          { Gv, Ev }, 0 },
2824   { "cmovlS",           { Gv, Ev }, 0 },
2825   { "cmovgeS",          { Gv, Ev }, 0 },
2826   { "cmovleS",          { Gv, Ev }, 0 },
2827   { "cmovgS",           { Gv, Ev }, 0 },
2828   /* 50 */
2829   { MOD_TABLE (MOD_0F51) },
2830   { PREFIX_TABLE (PREFIX_0F51) },
2831   { PREFIX_TABLE (PREFIX_0F52) },
2832   { PREFIX_TABLE (PREFIX_0F53) },
2833   { "andpX",            { XM, EXx }, PREFIX_OPCODE },
2834   { "andnpX",           { XM, EXx }, PREFIX_OPCODE },
2835   { "orpX",             { XM, EXx }, PREFIX_OPCODE },
2836   { "xorpX",            { XM, EXx }, PREFIX_OPCODE },
2837   /* 58 */
2838   { PREFIX_TABLE (PREFIX_0F58) },
2839   { PREFIX_TABLE (PREFIX_0F59) },
2840   { PREFIX_TABLE (PREFIX_0F5A) },
2841   { PREFIX_TABLE (PREFIX_0F5B) },
2842   { PREFIX_TABLE (PREFIX_0F5C) },
2843   { PREFIX_TABLE (PREFIX_0F5D) },
2844   { PREFIX_TABLE (PREFIX_0F5E) },
2845   { PREFIX_TABLE (PREFIX_0F5F) },
2846   /* 60 */
2847   { PREFIX_TABLE (PREFIX_0F60) },
2848   { PREFIX_TABLE (PREFIX_0F61) },
2849   { PREFIX_TABLE (PREFIX_0F62) },
2850   { "packsswb",         { MX, EM }, PREFIX_OPCODE },
2851   { "pcmpgtb",          { MX, EM }, PREFIX_OPCODE },
2852   { "pcmpgtw",          { MX, EM }, PREFIX_OPCODE },
2853   { "pcmpgtd",          { MX, EM }, PREFIX_OPCODE },
2854   { "packuswb",         { MX, EM }, PREFIX_OPCODE },
2855   /* 68 */
2856   { "punpckhbw",        { MX, EM }, PREFIX_OPCODE },
2857   { "punpckhwd",        { MX, EM }, PREFIX_OPCODE },
2858   { "punpckhdq",        { MX, EM }, PREFIX_OPCODE },
2859   { "packssdw",         { MX, EM }, PREFIX_OPCODE },
2860   { PREFIX_TABLE (PREFIX_0F6C) },
2861   { PREFIX_TABLE (PREFIX_0F6D) },
2862   { "movK",             { MX, Edq }, PREFIX_OPCODE },
2863   { PREFIX_TABLE (PREFIX_0F6F) },
2864   /* 70 */
2865   { PREFIX_TABLE (PREFIX_0F70) },
2866   { REG_TABLE (REG_0F71) },
2867   { REG_TABLE (REG_0F72) },
2868   { REG_TABLE (REG_0F73) },
2869   { "pcmpeqb",          { MX, EM }, PREFIX_OPCODE },
2870   { "pcmpeqw",          { MX, EM }, PREFIX_OPCODE },
2871   { "pcmpeqd",          { MX, EM }, PREFIX_OPCODE },
2872   { "emms",             { XX }, PREFIX_OPCODE },
2873   /* 78 */
2874   { PREFIX_TABLE (PREFIX_0F78) },
2875   { PREFIX_TABLE (PREFIX_0F79) },
2876   { THREE_BYTE_TABLE (THREE_BYTE_0F7A) },
2877   { Bad_Opcode },
2878   { PREFIX_TABLE (PREFIX_0F7C) },
2879   { PREFIX_TABLE (PREFIX_0F7D) },
2880   { PREFIX_TABLE (PREFIX_0F7E) },
2881   { PREFIX_TABLE (PREFIX_0F7F) },
2882   /* 80 */
2883   { "joH",              { Jv, BND, cond_jump_flag }, 0 },
2884   { "jnoH",             { Jv, BND, cond_jump_flag }, 0 },
2885   { "jbH",              { Jv, BND, cond_jump_flag }, 0 },
2886   { "jaeH",             { Jv, BND, cond_jump_flag }, 0 },
2887   { "jeH",              { Jv, BND, cond_jump_flag }, 0 },
2888   { "jneH",             { Jv, BND, cond_jump_flag }, 0 },
2889   { "jbeH",             { Jv, BND, cond_jump_flag }, 0 },
2890   { "jaH",              { Jv, BND, cond_jump_flag }, 0 },
2891   /* 88 */
2892   { "jsH",              { Jv, BND, cond_jump_flag }, 0 },
2893   { "jnsH",             { Jv, BND, cond_jump_flag }, 0 },
2894   { "jpH",              { Jv, BND, cond_jump_flag }, 0 },
2895   { "jnpH",             { Jv, BND, cond_jump_flag }, 0 },
2896   { "jlH",              { Jv, BND, cond_jump_flag }, 0 },
2897   { "jgeH",             { Jv, BND, cond_jump_flag }, 0 },
2898   { "jleH",             { Jv, BND, cond_jump_flag }, 0 },
2899   { "jgH",              { Jv, BND, cond_jump_flag }, 0 },
2900   /* 90 */
2901   { "seto",             { Eb }, 0 },
2902   { "setno",            { Eb }, 0 },
2903   { "setb",             { Eb }, 0 },
2904   { "setae",            { Eb }, 0 },
2905   { "sete",             { Eb }, 0 },
2906   { "setne",            { Eb }, 0 },
2907   { "setbe",            { Eb }, 0 },
2908   { "seta",             { Eb }, 0 },
2909   /* 98 */
2910   { "sets",             { Eb }, 0 },
2911   { "setns",            { Eb }, 0 },
2912   { "setp",             { Eb }, 0 },
2913   { "setnp",            { Eb }, 0 },
2914   { "setl",             { Eb }, 0 },
2915   { "setge",            { Eb }, 0 },
2916   { "setle",            { Eb }, 0 },
2917   { "setg",             { Eb }, 0 },
2918   /* a0 */
2919   { "pushT",            { fs }, 0 },
2920   { "popT",             { fs }, 0 },
2921   { "cpuid",            { XX }, 0 },
2922   { "btS",              { Ev, Gv }, 0 },
2923   { "shldS",            { Ev, Gv, Ib }, 0 },
2924   { "shldS",            { Ev, Gv, CL }, 0 },
2925   { REG_TABLE (REG_0FA6) },
2926   { REG_TABLE (REG_0FA7) },
2927   /* a8 */
2928   { "pushT",            { gs }, 0 },
2929   { "popT",             { gs }, 0 },
2930   { "rsm",              { XX }, 0 },
2931   { "btsS",             { Evh1, Gv }, 0 },
2932   { "shrdS",            { Ev, Gv, Ib }, 0 },
2933   { "shrdS",            { Ev, Gv, CL }, 0 },
2934   { REG_TABLE (REG_0FAE) },
2935   { "imulS",            { Gv, Ev }, 0 },
2936   /* b0 */
2937   { "cmpxchgB",         { Ebh1, Gb }, 0 },
2938   { "cmpxchgS",         { Evh1, Gv }, 0 },
2939   { MOD_TABLE (MOD_0FB2) },
2940   { "btrS",             { Evh1, Gv }, 0 },
2941   { MOD_TABLE (MOD_0FB4) },
2942   { MOD_TABLE (MOD_0FB5) },
2943   { "movz{bR|x}",       { Gv, Eb }, 0 },
2944   { "movz{wR|x}",       { Gv, Ew }, 0 }, /* yes, there really is movzww ! */
2945   /* b8 */
2946   { PREFIX_TABLE (PREFIX_0FB8) },
2947   { "ud1",              { XX }, 0 },
2948   { REG_TABLE (REG_0FBA) },
2949   { "btcS",             { Evh1, Gv }, 0 },
2950   { PREFIX_TABLE (PREFIX_0FBC) },
2951   { PREFIX_TABLE (PREFIX_0FBD) },
2952   { "movs{bR|x}",       { Gv, Eb }, 0 },
2953   { "movs{wR|x}",       { Gv, Ew }, 0 }, /* yes, there really is movsww ! */
2954   /* c0 */
2955   { "xaddB",            { Ebh1, Gb }, 0 },
2956   { "xaddS",            { Evh1, Gv }, 0 },
2957   { PREFIX_TABLE (PREFIX_0FC2) },
2958   { PREFIX_TABLE (PREFIX_0FC3) },
2959   { "pinsrw",           { MX, Edqw, Ib }, PREFIX_OPCODE },
2960   { "pextrw",           { Gdq, MS, Ib }, PREFIX_OPCODE },
2961   { "shufpX",           { XM, EXx, Ib }, PREFIX_OPCODE },
2962   { REG_TABLE (REG_0FC7) },
2963   /* c8 */
2964   { "bswap",            { RMeAX }, 0 },
2965   { "bswap",            { RMeCX }, 0 },
2966   { "bswap",            { RMeDX }, 0 },
2967   { "bswap",            { RMeBX }, 0 },
2968   { "bswap",            { RMeSP }, 0 },
2969   { "bswap",            { RMeBP }, 0 },
2970   { "bswap",            { RMeSI }, 0 },
2971   { "bswap",            { RMeDI }, 0 },
2972   /* d0 */
2973   { PREFIX_TABLE (PREFIX_0FD0) },
2974   { "psrlw",            { MX, EM }, PREFIX_OPCODE },
2975   { "psrld",            { MX, EM }, PREFIX_OPCODE },
2976   { "psrlq",            { MX, EM }, PREFIX_OPCODE },
2977   { "paddq",            { MX, EM }, PREFIX_OPCODE },
2978   { "pmullw",           { MX, EM }, PREFIX_OPCODE },
2979   { PREFIX_TABLE (PREFIX_0FD6) },
2980   { MOD_TABLE (MOD_0FD7) },
2981   /* d8 */
2982   { "psubusb",          { MX, EM }, PREFIX_OPCODE },
2983   { "psubusw",          { MX, EM }, PREFIX_OPCODE },
2984   { "pminub",           { MX, EM }, PREFIX_OPCODE },
2985   { "pand",             { MX, EM }, PREFIX_OPCODE },
2986   { "paddusb",          { MX, EM }, PREFIX_OPCODE },
2987   { "paddusw",          { MX, EM }, PREFIX_OPCODE },
2988   { "pmaxub",           { MX, EM }, PREFIX_OPCODE },
2989   { "pandn",            { MX, EM }, PREFIX_OPCODE },
2990   /* e0 */
2991   { "pavgb",            { MX, EM }, PREFIX_OPCODE },
2992   { "psraw",            { MX, EM }, PREFIX_OPCODE },
2993   { "psrad",            { MX, EM }, PREFIX_OPCODE },
2994   { "pavgw",            { MX, EM }, PREFIX_OPCODE },
2995   { "pmulhuw",          { MX, EM }, PREFIX_OPCODE },
2996   { "pmulhw",           { MX, EM }, PREFIX_OPCODE },
2997   { PREFIX_TABLE (PREFIX_0FE6) },
2998   { PREFIX_TABLE (PREFIX_0FE7) },
2999   /* e8 */
3000   { "psubsb",           { MX, EM }, PREFIX_OPCODE },
3001   { "psubsw",           { MX, EM }, PREFIX_OPCODE },
3002   { "pminsw",           { MX, EM }, PREFIX_OPCODE },
3003   { "por",              { MX, EM }, PREFIX_OPCODE },
3004   { "paddsb",           { MX, EM }, PREFIX_OPCODE },
3005   { "paddsw",           { MX, EM }, PREFIX_OPCODE },
3006   { "pmaxsw",           { MX, EM }, PREFIX_OPCODE },
3007   { "pxor",             { MX, EM }, PREFIX_OPCODE },
3008   /* f0 */
3009   { PREFIX_TABLE (PREFIX_0FF0) },
3010   { "psllw",            { MX, EM }, PREFIX_OPCODE },
3011   { "pslld",            { MX, EM }, PREFIX_OPCODE },
3012   { "psllq",            { MX, EM }, PREFIX_OPCODE },
3013   { "pmuludq",          { MX, EM }, PREFIX_OPCODE },
3014   { "pmaddwd",          { MX, EM }, PREFIX_OPCODE },
3015   { "psadbw",           { MX, EM }, PREFIX_OPCODE },
3016   { PREFIX_TABLE (PREFIX_0FF7) },
3017   /* f8 */
3018   { "psubb",            { MX, EM }, PREFIX_OPCODE },
3019   { "psubw",            { MX, EM }, PREFIX_OPCODE },
3020   { "psubd",            { MX, EM }, PREFIX_OPCODE },
3021   { "psubq",            { MX, EM }, PREFIX_OPCODE },
3022   { "paddb",            { MX, EM }, PREFIX_OPCODE },
3023   { "paddw",            { MX, EM }, PREFIX_OPCODE },
3024   { "paddd",            { MX, EM }, PREFIX_OPCODE },
3025   { Bad_Opcode },
3026 };
3027
3028 static const unsigned char onebyte_has_modrm[256] = {
3029   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
3030   /*       -------------------------------        */
3031   /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
3032   /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
3033   /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
3034   /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
3035   /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
3036   /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
3037   /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
3038   /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
3039   /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
3040   /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
3041   /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
3042   /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
3043   /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
3044   /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
3045   /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
3046   /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1  /* f0 */
3047   /*       -------------------------------        */
3048   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
3049 };
3050
3051 static const unsigned char twobyte_has_modrm[256] = {
3052   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
3053   /*       -------------------------------        */
3054   /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
3055   /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
3056   /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
3057   /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
3058   /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
3059   /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
3060   /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
3061   /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
3062   /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
3063   /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
3064   /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
3065   /* b0 */ 1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1, /* bf */
3066   /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
3067   /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
3068   /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
3069   /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0  /* ff */
3070   /*       -------------------------------        */
3071   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
3072 };
3073
3074 static char obuf[100];
3075 static char *obufp;
3076 static char *mnemonicendp;
3077 static char scratchbuf[100];
3078 static unsigned char *start_codep;
3079 static unsigned char *insn_codep;
3080 static unsigned char *codep;
3081 static unsigned char *end_codep;
3082 static int last_lock_prefix;
3083 static int last_repz_prefix;
3084 static int last_repnz_prefix;
3085 static int last_data_prefix;
3086 static int last_addr_prefix;
3087 static int last_rex_prefix;
3088 static int last_seg_prefix;
3089 static int fwait_prefix;
3090 /* The active segment register prefix.  */
3091 static int active_seg_prefix;
3092 #define MAX_CODE_LENGTH 15
3093 /* We can up to 14 prefixes since the maximum instruction length is
3094    15bytes.  */
3095 static int all_prefixes[MAX_CODE_LENGTH - 1];
3096 static disassemble_info *the_info;
3097 static struct
3098   {
3099     int mod;
3100     int reg;
3101     int rm;
3102   }
3103 modrm;
3104 static unsigned char need_modrm;
3105 static struct
3106   {
3107     int scale;
3108     int index;
3109     int base;
3110   }
3111 sib;
3112 static struct
3113   {
3114     int register_specifier;
3115     int length;
3116     int prefix;
3117     int w;
3118     int evex;
3119     int r;
3120     int v;
3121     int mask_register_specifier;
3122     int zeroing;
3123     int ll;
3124     int b;
3125   }
3126 vex;
3127 static unsigned char need_vex;
3128 static unsigned char need_vex_reg;
3129 static unsigned char vex_w_done;
3130
3131 struct op
3132   {
3133     const char *name;
3134     unsigned int len;
3135   };
3136
3137 /* If we are accessing mod/rm/reg without need_modrm set, then the
3138    values are stale.  Hitting this abort likely indicates that you
3139    need to update onebyte_has_modrm or twobyte_has_modrm.  */
3140 #define MODRM_CHECK  if (!need_modrm) abort ()
3141
3142 static const char **names64;
3143 static const char **names32;
3144 static const char **names16;
3145 static const char **names8;
3146 static const char **names8rex;
3147 static const char **names_seg;
3148 static const char *index64;
3149 static const char *index32;
3150 static const char **index16;
3151 static const char **names_bnd;
3152
3153 static const char *intel_names64[] = {
3154   "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
3155   "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
3156 };
3157 static const char *intel_names32[] = {
3158   "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
3159   "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
3160 };
3161 static const char *intel_names16[] = {
3162   "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
3163   "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
3164 };
3165 static const char *intel_names8[] = {
3166   "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
3167 };
3168 static const char *intel_names8rex[] = {
3169   "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
3170   "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
3171 };
3172 static const char *intel_names_seg[] = {
3173   "es", "cs", "ss", "ds", "fs", "gs", "?", "?",
3174 };
3175 static const char *intel_index64 = "riz";
3176 static const char *intel_index32 = "eiz";
3177 static const char *intel_index16[] = {
3178   "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
3179 };
3180
3181 static const char *att_names64[] = {
3182   "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
3183   "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
3184 };
3185 static const char *att_names32[] = {
3186   "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
3187   "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
3188 };
3189 static const char *att_names16[] = {
3190   "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
3191   "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
3192 };
3193 static const char *att_names8[] = {
3194   "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
3195 };
3196 static const char *att_names8rex[] = {
3197   "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
3198   "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
3199 };
3200 static const char *att_names_seg[] = {
3201   "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
3202 };
3203 static const char *att_index64 = "%riz";
3204 static const char *att_index32 = "%eiz";
3205 static const char *att_index16[] = {
3206   "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
3207 };
3208
3209 static const char **names_mm;
3210 static const char *intel_names_mm[] = {
3211   "mm0", "mm1", "mm2", "mm3",
3212   "mm4", "mm5", "mm6", "mm7"
3213 };
3214 static const char *att_names_mm[] = {
3215   "%mm0", "%mm1", "%mm2", "%mm3",
3216   "%mm4", "%mm5", "%mm6", "%mm7"
3217 };
3218
3219 static const char *intel_names_bnd[] = {
3220   "bnd0", "bnd1", "bnd2", "bnd3"
3221 };
3222
3223 static const char *att_names_bnd[] = {
3224   "%bnd0", "%bnd1", "%bnd2", "%bnd3"
3225 };
3226
3227 static const char **names_xmm;
3228 static const char *intel_names_xmm[] = {
3229   "xmm0", "xmm1", "xmm2", "xmm3",
3230   "xmm4", "xmm5", "xmm6", "xmm7",
3231   "xmm8", "xmm9", "xmm10", "xmm11",
3232   "xmm12", "xmm13", "xmm14", "xmm15",
3233   "xmm16", "xmm17", "xmm18", "xmm19",
3234   "xmm20", "xmm21", "xmm22", "xmm23",
3235   "xmm24", "xmm25", "xmm26", "xmm27",
3236   "xmm28", "xmm29", "xmm30", "xmm31"
3237 };
3238 static const char *att_names_xmm[] = {
3239   "%xmm0", "%xmm1", "%xmm2", "%xmm3",
3240   "%xmm4", "%xmm5", "%xmm6", "%xmm7",
3241   "%xmm8", "%xmm9", "%xmm10", "%xmm11",
3242   "%xmm12", "%xmm13", "%xmm14", "%xmm15",
3243   "%xmm16", "%xmm17", "%xmm18", "%xmm19",
3244   "%xmm20", "%xmm21", "%xmm22", "%xmm23",
3245   "%xmm24", "%xmm25", "%xmm26", "%xmm27",
3246   "%xmm28", "%xmm29", "%xmm30", "%xmm31"
3247 };
3248
3249 static const char **names_ymm;
3250 static const char *intel_names_ymm[] = {
3251   "ymm0", "ymm1", "ymm2", "ymm3",
3252   "ymm4", "ymm5", "ymm6", "ymm7",
3253   "ymm8", "ymm9", "ymm10", "ymm11",
3254   "ymm12", "ymm13", "ymm14", "ymm15",
3255   "ymm16", "ymm17", "ymm18", "ymm19",
3256   "ymm20", "ymm21", "ymm22", "ymm23",
3257   "ymm24", "ymm25", "ymm26", "ymm27",
3258   "ymm28", "ymm29", "ymm30", "ymm31"
3259 };
3260 static const char *att_names_ymm[] = {
3261   "%ymm0", "%ymm1", "%ymm2", "%ymm3",
3262   "%ymm4", "%ymm5", "%ymm6", "%ymm7",
3263   "%ymm8", "%ymm9", "%ymm10", "%ymm11",
3264   "%ymm12", "%ymm13", "%ymm14", "%ymm15",
3265   "%ymm16", "%ymm17", "%ymm18", "%ymm19",
3266   "%ymm20", "%ymm21", "%ymm22", "%ymm23",
3267   "%ymm24", "%ymm25", "%ymm26", "%ymm27",
3268   "%ymm28", "%ymm29", "%ymm30", "%ymm31"
3269 };
3270
3271 static const char **names_zmm;
3272 static const char *intel_names_zmm[] = {
3273   "zmm0", "zmm1", "zmm2", "zmm3",
3274   "zmm4", "zmm5", "zmm6", "zmm7",
3275   "zmm8", "zmm9", "zmm10", "zmm11",
3276   "zmm12", "zmm13", "zmm14", "zmm15",
3277   "zmm16", "zmm17", "zmm18", "zmm19",
3278   "zmm20", "zmm21", "zmm22", "zmm23",
3279   "zmm24", "zmm25", "zmm26", "zmm27",
3280   "zmm28", "zmm29", "zmm30", "zmm31"
3281 };
3282 static const char *att_names_zmm[] = {
3283   "%zmm0", "%zmm1", "%zmm2", "%zmm3",
3284   "%zmm4", "%zmm5", "%zmm6", "%zmm7",
3285   "%zmm8", "%zmm9", "%zmm10", "%zmm11",
3286   "%zmm12", "%zmm13", "%zmm14", "%zmm15",
3287   "%zmm16", "%zmm17", "%zmm18", "%zmm19",
3288   "%zmm20", "%zmm21", "%zmm22", "%zmm23",
3289   "%zmm24", "%zmm25", "%zmm26", "%zmm27",
3290   "%zmm28", "%zmm29", "%zmm30", "%zmm31"
3291 };
3292
3293 static const char **names_mask;
3294 static const char *intel_names_mask[] = {
3295   "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7"
3296 };
3297 static const char *att_names_mask[] = {
3298   "%k0", "%k1", "%k2", "%k3", "%k4", "%k5", "%k6", "%k7"
3299 };
3300
3301 static const char *names_rounding[] =
3302 {
3303   "{rn-sae}",
3304   "{rd-sae}",
3305   "{ru-sae}",
3306   "{rz-sae}"
3307 };
3308
3309 static const struct dis386 reg_table[][8] = {
3310   /* REG_80 */
3311   {
3312     { "addA",   { Ebh1, Ib }, 0 },
3313     { "orA",    { Ebh1, Ib }, 0 },
3314     { "adcA",   { Ebh1, Ib }, 0 },
3315     { "sbbA",   { Ebh1, Ib }, 0 },
3316     { "andA",   { Ebh1, Ib }, 0 },
3317     { "subA",   { Ebh1, Ib }, 0 },
3318     { "xorA",   { Ebh1, Ib }, 0 },
3319     { "cmpA",   { Eb, Ib }, 0 },
3320   },
3321   /* REG_81 */
3322   {
3323     { "addQ",   { Evh1, Iv }, 0 },
3324     { "orQ",    { Evh1, Iv }, 0 },
3325     { "adcQ",   { Evh1, Iv }, 0 },
3326     { "sbbQ",   { Evh1, Iv }, 0 },
3327     { "andQ",   { Evh1, Iv }, 0 },
3328     { "subQ",   { Evh1, Iv }, 0 },
3329     { "xorQ",   { Evh1, Iv }, 0 },
3330     { "cmpQ",   { Ev, Iv }, 0 },
3331   },
3332   /* REG_82 */
3333   {
3334     { "addQ",   { Evh1, sIb }, 0 },
3335     { "orQ",    { Evh1, sIb }, 0 },
3336     { "adcQ",   { Evh1, sIb }, 0 },
3337     { "sbbQ",   { Evh1, sIb }, 0 },
3338     { "andQ",   { Evh1, sIb }, 0 },
3339     { "subQ",   { Evh1, sIb }, 0 },
3340     { "xorQ",   { Evh1, sIb }, 0 },
3341     { "cmpQ",   { Ev, sIb }, 0 },
3342   },
3343   /* REG_8F */
3344   {
3345     { "popU",   { stackEv }, 0 },
3346     { XOP_8F_TABLE (XOP_09) },
3347     { Bad_Opcode },
3348     { Bad_Opcode },
3349     { Bad_Opcode },
3350     { XOP_8F_TABLE (XOP_09) },
3351   },
3352   /* REG_C0 */
3353   {
3354     { "rolA",   { Eb, Ib }, 0 },
3355     { "rorA",   { Eb, Ib }, 0 },
3356     { "rclA",   { Eb, Ib }, 0 },
3357     { "rcrA",   { Eb, Ib }, 0 },
3358     { "shlA",   { Eb, Ib }, 0 },
3359     { "shrA",   { Eb, Ib }, 0 },
3360     { Bad_Opcode },
3361     { "sarA",   { Eb, Ib }, 0 },
3362   },
3363   /* REG_C1 */
3364   {
3365     { "rolQ",   { Ev, Ib }, 0 },
3366     { "rorQ",   { Ev, Ib }, 0 },
3367     { "rclQ",   { Ev, Ib }, 0 },
3368     { "rcrQ",   { Ev, Ib }, 0 },
3369     { "shlQ",   { Ev, Ib }, 0 },
3370     { "shrQ",   { Ev, Ib }, 0 },
3371     { Bad_Opcode },
3372     { "sarQ",   { Ev, Ib }, 0 },
3373   },
3374   /* REG_C6 */
3375   {
3376     { "movA",   { Ebh3, Ib }, 0 },
3377     { Bad_Opcode },
3378     { Bad_Opcode },
3379     { Bad_Opcode },
3380     { Bad_Opcode },
3381     { Bad_Opcode },
3382     { Bad_Opcode },
3383     { MOD_TABLE (MOD_C6_REG_7) },
3384   },
3385   /* REG_C7 */
3386   {
3387     { "movQ",   { Evh3, Iv }, 0 },
3388     { Bad_Opcode },
3389     { Bad_Opcode },
3390     { Bad_Opcode },
3391     { Bad_Opcode },
3392     { Bad_Opcode },
3393     { Bad_Opcode },
3394     { MOD_TABLE (MOD_C7_REG_7) },
3395   },
3396   /* REG_D0 */
3397   {
3398     { "rolA",   { Eb, I1 }, 0 },
3399     { "rorA",   { Eb, I1 }, 0 },
3400     { "rclA",   { Eb, I1 }, 0 },
3401     { "rcrA",   { Eb, I1 }, 0 },
3402     { "shlA",   { Eb, I1 }, 0 },
3403     { "shrA",   { Eb, I1 }, 0 },
3404     { Bad_Opcode },
3405     { "sarA",   { Eb, I1 }, 0 },
3406   },
3407   /* REG_D1 */
3408   {
3409     { "rolQ",   { Ev, I1 }, 0 },
3410     { "rorQ",   { Ev, I1 }, 0 },
3411     { "rclQ",   { Ev, I1 }, 0 },
3412     { "rcrQ",   { Ev, I1 }, 0 },
3413     { "shlQ",   { Ev, I1 }, 0 },
3414     { "shrQ",   { Ev, I1 }, 0 },
3415     { Bad_Opcode },
3416     { "sarQ",   { Ev, I1 }, 0 },
3417   },
3418   /* REG_D2 */
3419   {
3420     { "rolA",   { Eb, CL }, 0 },
3421     { "rorA",   { Eb, CL }, 0 },
3422     { "rclA",   { Eb, CL }, 0 },
3423     { "rcrA",   { Eb, CL }, 0 },
3424     { "shlA",   { Eb, CL }, 0 },
3425     { "shrA",   { Eb, CL }, 0 },
3426     { Bad_Opcode },
3427     { "sarA",   { Eb, CL }, 0 },
3428   },
3429   /* REG_D3 */
3430   {
3431     { "rolQ",   { Ev, CL }, 0 },
3432     { "rorQ",   { Ev, CL }, 0 },
3433     { "rclQ",   { Ev, CL }, 0 },
3434     { "rcrQ",   { Ev, CL }, 0 },
3435     { "shlQ",   { Ev, CL }, 0 },
3436     { "shrQ",   { Ev, CL }, 0 },
3437     { Bad_Opcode },
3438     { "sarQ",   { Ev, CL }, 0 },
3439   },
3440   /* REG_F6 */
3441   {
3442     { "testA",  { Eb, Ib }, 0 },
3443     { Bad_Opcode },
3444     { "notA",   { Ebh1 }, 0 },
3445     { "negA",   { Ebh1 }, 0 },
3446     { "mulA",   { Eb }, 0 },    /* Don't print the implicit %al register,  */
3447     { "imulA",  { Eb }, 0 },    /* to distinguish these opcodes from other */
3448     { "divA",   { Eb }, 0 },    /* mul/imul opcodes.  Do the same for div  */
3449     { "idivA",  { Eb }, 0 },    /* and idiv for consistency.               */
3450   },
3451   /* REG_F7 */
3452   {
3453     { "testQ",  { Ev, Iv }, 0 },
3454     { Bad_Opcode },
3455     { "notQ",   { Evh1 }, 0 },
3456     { "negQ",   { Evh1 }, 0 },
3457     { "mulQ",   { Ev }, 0 },    /* Don't print the implicit register.  */
3458     { "imulQ",  { Ev }, 0 },
3459     { "divQ",   { Ev }, 0 },
3460     { "idivQ",  { Ev }, 0 },
3461   },
3462   /* REG_FE */
3463   {
3464     { "incA",   { Ebh1 }, 0 },
3465     { "decA",   { Ebh1 }, 0 },
3466   },
3467   /* REG_FF */
3468   {
3469     { "incQ",   { Evh1 }, 0 },
3470     { "decQ",   { Evh1 }, 0 },
3471     { "call{T|}", { indirEv, BND }, 0 },
3472     { MOD_TABLE (MOD_FF_REG_3) },
3473     { "jmp{T|}", { indirEv, BND }, 0 },
3474     { MOD_TABLE (MOD_FF_REG_5) },
3475     { "pushU",  { stackEv }, 0 },
3476     { Bad_Opcode },
3477   },
3478   /* REG_0F00 */
3479   {
3480     { "sldtD",  { Sv }, 0 },
3481     { "strD",   { Sv }, 0 },
3482     { "lldt",   { Ew }, 0 },
3483     { "ltr",    { Ew }, 0 },
3484     { "verr",   { Ew }, 0 },
3485     { "verw",   { Ew }, 0 },
3486     { Bad_Opcode },
3487     { Bad_Opcode },
3488   },
3489   /* REG_0F01 */
3490   {
3491     { MOD_TABLE (MOD_0F01_REG_0) },
3492     { MOD_TABLE (MOD_0F01_REG_1) },
3493     { MOD_TABLE (MOD_0F01_REG_2) },
3494     { MOD_TABLE (MOD_0F01_REG_3) },
3495     { "smswD",  { Sv }, 0 },
3496     { Bad_Opcode },
3497     { "lmsw",   { Ew }, 0 },
3498     { MOD_TABLE (MOD_0F01_REG_7) },
3499   },
3500   /* REG_0F0D */
3501   {
3502     { "prefetch",       { Mb }, 0 },
3503     { "prefetchw",      { Mb }, 0 },
3504     { "prefetchwt1",    { Mb }, 0 },
3505     { "prefetch",       { Mb }, 0 },
3506     { "prefetch",       { Mb }, 0 },
3507     { "prefetch",       { Mb }, 0 },
3508     { "prefetch",       { Mb }, 0 },
3509     { "prefetch",       { Mb }, 0 },
3510   },
3511   /* REG_0F18 */
3512   {
3513     { MOD_TABLE (MOD_0F18_REG_0) },
3514     { MOD_TABLE (MOD_0F18_REG_1) },
3515     { MOD_TABLE (MOD_0F18_REG_2) },
3516     { MOD_TABLE (MOD_0F18_REG_3) },
3517     { MOD_TABLE (MOD_0F18_REG_4) },
3518     { MOD_TABLE (MOD_0F18_REG_5) },
3519     { MOD_TABLE (MOD_0F18_REG_6) },
3520     { MOD_TABLE (MOD_0F18_REG_7) },
3521   },
3522   /* REG_0F71 */
3523   {
3524     { Bad_Opcode },
3525     { Bad_Opcode },
3526     { MOD_TABLE (MOD_0F71_REG_2) },
3527     { Bad_Opcode },
3528     { MOD_TABLE (MOD_0F71_REG_4) },
3529     { Bad_Opcode },
3530     { MOD_TABLE (MOD_0F71_REG_6) },
3531   },
3532   /* REG_0F72 */
3533   {
3534     { Bad_Opcode },
3535     { Bad_Opcode },
3536     { MOD_TABLE (MOD_0F72_REG_2) },
3537     { Bad_Opcode },
3538     { MOD_TABLE (MOD_0F72_REG_4) },
3539     { Bad_Opcode },
3540     { MOD_TABLE (MOD_0F72_REG_6) },
3541   },
3542   /* REG_0F73 */
3543   {
3544     { Bad_Opcode },
3545     { Bad_Opcode },
3546     { MOD_TABLE (MOD_0F73_REG_2) },
3547     { MOD_TABLE (MOD_0F73_REG_3) },
3548     { Bad_Opcode },
3549     { Bad_Opcode },
3550     { MOD_TABLE (MOD_0F73_REG_6) },
3551     { MOD_TABLE (MOD_0F73_REG_7) },
3552   },
3553   /* REG_0FA6 */
3554   {
3555     { "montmul",        { { OP_0f07, 0 } }, 0 },
3556     { "xsha1",          { { OP_0f07, 0 } }, 0 },
3557     { "xsha256",        { { OP_0f07, 0 } }, 0 },
3558   },
3559   /* REG_0FA7 */
3560   {
3561     { "xstore-rng",     { { OP_0f07, 0 } }, 0 },
3562     { "xcrypt-ecb",     { { OP_0f07, 0 } }, 0 },
3563     { "xcrypt-cbc",     { { OP_0f07, 0 } }, 0 },
3564     { "xcrypt-ctr",     { { OP_0f07, 0 } }, 0 },
3565     { "xcrypt-cfb",     { { OP_0f07, 0 } }, 0 },
3566     { "xcrypt-ofb",     { { OP_0f07, 0 } }, 0 },
3567   },
3568   /* REG_0FAE */
3569   {
3570     { MOD_TABLE (MOD_0FAE_REG_0) },
3571     { MOD_TABLE (MOD_0FAE_REG_1) },
3572     { MOD_TABLE (MOD_0FAE_REG_2) },
3573     { MOD_TABLE (MOD_0FAE_REG_3) },
3574     { MOD_TABLE (MOD_0FAE_REG_4) },
3575     { MOD_TABLE (MOD_0FAE_REG_5) },
3576     { MOD_TABLE (MOD_0FAE_REG_6) },
3577     { MOD_TABLE (MOD_0FAE_REG_7) },
3578   },
3579   /* REG_0FBA */
3580   {
3581     { Bad_Opcode },
3582     { Bad_Opcode },
3583     { Bad_Opcode },
3584     { Bad_Opcode },
3585     { "btQ",    { Ev, Ib }, 0 },
3586     { "btsQ",   { Evh1, Ib }, 0 },
3587     { "btrQ",   { Evh1, Ib }, 0 },
3588     { "btcQ",   { Evh1, Ib }, 0 },
3589   },
3590   /* REG_0FC7 */
3591   {
3592     { Bad_Opcode },
3593     { "cmpxchg8b", { { CMPXCHG8B_Fixup, q_mode } }, 0 },
3594     { Bad_Opcode },
3595     { MOD_TABLE (MOD_0FC7_REG_3) },
3596     { MOD_TABLE (MOD_0FC7_REG_4) },
3597     { MOD_TABLE (MOD_0FC7_REG_5) },
3598     { MOD_TABLE (MOD_0FC7_REG_6) },
3599     { MOD_TABLE (MOD_0FC7_REG_7) },
3600   },
3601   /* REG_VEX_0F71 */
3602   {
3603     { Bad_Opcode },
3604     { Bad_Opcode },
3605     { MOD_TABLE (MOD_VEX_0F71_REG_2) },
3606     { Bad_Opcode },
3607     { MOD_TABLE (MOD_VEX_0F71_REG_4) },
3608     { Bad_Opcode },
3609     { MOD_TABLE (MOD_VEX_0F71_REG_6) },
3610   },
3611   /* REG_VEX_0F72 */
3612   {
3613     { Bad_Opcode },
3614     { Bad_Opcode },
3615     { MOD_TABLE (MOD_VEX_0F72_REG_2) },
3616     { Bad_Opcode },
3617     { MOD_TABLE (MOD_VEX_0F72_REG_4) },
3618     { Bad_Opcode },
3619     { MOD_TABLE (MOD_VEX_0F72_REG_6) },
3620   },
3621   /* REG_VEX_0F73 */
3622   {
3623     { Bad_Opcode },
3624     { Bad_Opcode },
3625     { MOD_TABLE (MOD_VEX_0F73_REG_2) },
3626     { MOD_TABLE (MOD_VEX_0F73_REG_3) },
3627     { Bad_Opcode },
3628     { Bad_Opcode },
3629     { MOD_TABLE (MOD_VEX_0F73_REG_6) },
3630     { MOD_TABLE (MOD_VEX_0F73_REG_7) },
3631   },
3632   /* REG_VEX_0FAE */
3633   {
3634     { Bad_Opcode },
3635     { Bad_Opcode },
3636     { MOD_TABLE (MOD_VEX_0FAE_REG_2) },
3637     { MOD_TABLE (MOD_VEX_0FAE_REG_3) },
3638   },
3639   /* REG_VEX_0F38F3 */
3640   {
3641     { Bad_Opcode },
3642     { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_1) },
3643     { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_2) },
3644     { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_3) },
3645   },
3646   /* REG_XOP_LWPCB */
3647   {
3648     { "llwpcb", { { OP_LWPCB_E, 0 } }, 0 },
3649     { "slwpcb", { { OP_LWPCB_E, 0 } }, 0 },
3650   },
3651   /* REG_XOP_LWP */
3652   {
3653     { "lwpins", { { OP_LWP_E, 0 }, Ed, Iq }, 0 },
3654     { "lwpval", { { OP_LWP_E, 0 }, Ed, Iq }, 0 },
3655   },
3656   /* REG_XOP_TBM_01 */
3657   {
3658     { Bad_Opcode },
3659     { "blcfill",        { { OP_LWP_E, 0 }, Ev }, 0 },
3660     { "blsfill",        { { OP_LWP_E, 0 }, Ev }, 0 },
3661     { "blcs",   { { OP_LWP_E, 0 }, Ev }, 0 },
3662     { "tzmsk",  { { OP_LWP_E, 0 }, Ev }, 0 },
3663     { "blcic",  { { OP_LWP_E, 0 }, Ev }, 0 },
3664     { "blsic",  { { OP_LWP_E, 0 }, Ev }, 0 },
3665     { "t1mskc", { { OP_LWP_E, 0 }, Ev }, 0 },
3666   },
3667   /* REG_XOP_TBM_02 */
3668   {
3669     { Bad_Opcode },
3670     { "blcmsk", { { OP_LWP_E, 0 }, Ev }, 0 },
3671     { Bad_Opcode },
3672     { Bad_Opcode },
3673     { Bad_Opcode },
3674     { Bad_Opcode },
3675     { "blci",   { { OP_LWP_E, 0 }, Ev }, 0 },
3676   },
3677 #define NEED_REG_TABLE
3678 #include "i386-dis-evex.h"
3679 #undef NEED_REG_TABLE
3680 };
3681
3682 static const struct dis386 prefix_table[][4] = {
3683   /* PREFIX_90 */
3684   {
3685     { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } }, 0 },
3686     { "pause", { XX }, 0 },
3687     { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } }, 0 },
3688     { NULL, { { NULL, 0 } }, PREFIX_IGNORED }
3689   },
3690
3691   /* PREFIX_0F10 */
3692   {
3693     { "movups", { XM, EXx }, PREFIX_OPCODE },
3694     { "movss",  { XM, EXd }, PREFIX_OPCODE },
3695     { "movupd", { XM, EXx }, PREFIX_OPCODE },
3696     { "movsd",  { XM, EXq }, PREFIX_OPCODE },
3697   },
3698
3699   /* PREFIX_0F11 */
3700   {
3701     { "movups", { EXxS, XM }, PREFIX_OPCODE },
3702     { "movss",  { EXdS, XM }, PREFIX_OPCODE },
3703     { "movupd", { EXxS, XM }, PREFIX_OPCODE },
3704     { "movsd",  { EXqS, XM }, PREFIX_OPCODE },
3705   },
3706
3707   /* PREFIX_0F12 */
3708   {
3709     { MOD_TABLE (MOD_0F12_PREFIX_0) },
3710     { "movsldup", { XM, EXx }, PREFIX_OPCODE },
3711     { "movlpd", { XM, EXq }, PREFIX_OPCODE },
3712     { "movddup", { XM, EXq }, PREFIX_OPCODE },
3713   },
3714
3715   /* PREFIX_0F16 */
3716   {
3717     { MOD_TABLE (MOD_0F16_PREFIX_0) },
3718     { "movshdup", { XM, EXx }, PREFIX_OPCODE },
3719     { "movhpd", { XM, EXq }, PREFIX_OPCODE },
3720   },
3721
3722   /* PREFIX_0F1A */
3723   {
3724     { MOD_TABLE (MOD_0F1A_PREFIX_0) },
3725     { "bndcl",  { Gbnd, Ev_bnd }, 0 },
3726     { "bndmov", { Gbnd, Ebnd }, 0 },
3727     { "bndcu",  { Gbnd, Ev_bnd }, 0 },
3728   },
3729
3730   /* PREFIX_0F1B */
3731   {
3732     { MOD_TABLE (MOD_0F1B_PREFIX_0) },
3733     { MOD_TABLE (MOD_0F1B_PREFIX_1) },
3734     { "bndmov", { Ebnd, Gbnd }, 0 },
3735     { "bndcn",  { Gbnd, Ev_bnd }, 0 },
3736   },
3737
3738   /* PREFIX_0F2A */
3739   {
3740     { "cvtpi2ps", { XM, EMCq }, PREFIX_OPCODE },
3741     { "cvtsi2ss%LQ", { XM, Ev }, PREFIX_OPCODE },
3742     { "cvtpi2pd", { XM, EMCq }, PREFIX_OPCODE },
3743     { "cvtsi2sd%LQ", { XM, Ev }, 0 },
3744   },
3745
3746   /* PREFIX_0F2B */
3747   {
3748     { MOD_TABLE (MOD_0F2B_PREFIX_0) },
3749     { MOD_TABLE (MOD_0F2B_PREFIX_1) },
3750     { MOD_TABLE (MOD_0F2B_PREFIX_2) },
3751     { MOD_TABLE (MOD_0F2B_PREFIX_3) },
3752   },
3753
3754   /* PREFIX_0F2C */
3755   {
3756     { "cvttps2pi", { MXC, EXq }, PREFIX_OPCODE },
3757     { "cvttss2siY", { Gv, EXd }, PREFIX_OPCODE },
3758     { "cvttpd2pi", { MXC, EXx }, PREFIX_OPCODE },
3759     { "cvttsd2siY", { Gv, EXq }, PREFIX_OPCODE },
3760   },
3761
3762   /* PREFIX_0F2D */
3763   {
3764     { "cvtps2pi", { MXC, EXq }, PREFIX_OPCODE },
3765     { "cvtss2siY", { Gv, EXd }, PREFIX_OPCODE },
3766     { "cvtpd2pi", { MXC, EXx }, PREFIX_OPCODE },
3767     { "cvtsd2siY", { Gv, EXq }, PREFIX_OPCODE },
3768   },
3769
3770   /* PREFIX_0F2E */
3771   {
3772     { "ucomiss",{ XM, EXd }, 0 },
3773     { Bad_Opcode },
3774     { "ucomisd",{ XM, EXq }, 0 },
3775   },
3776
3777   /* PREFIX_0F2F */
3778   {
3779     { "comiss", { XM, EXd }, 0 },
3780     { Bad_Opcode },
3781     { "comisd", { XM, EXq }, 0 },
3782   },
3783
3784   /* PREFIX_0F51 */
3785   {
3786     { "sqrtps", { XM, EXx }, PREFIX_OPCODE },
3787     { "sqrtss", { XM, EXd }, PREFIX_OPCODE },
3788     { "sqrtpd", { XM, EXx }, PREFIX_OPCODE },
3789     { "sqrtsd", { XM, EXq }, PREFIX_OPCODE },
3790   },
3791
3792   /* PREFIX_0F52 */
3793   {
3794     { "rsqrtps",{ XM, EXx }, PREFIX_OPCODE },
3795     { "rsqrtss",{ XM, EXd }, PREFIX_OPCODE },
3796   },
3797
3798   /* PREFIX_0F53 */
3799   {
3800     { "rcpps",  { XM, EXx }, PREFIX_OPCODE },
3801     { "rcpss",  { XM, EXd }, PREFIX_OPCODE },
3802   },
3803
3804   /* PREFIX_0F58 */
3805   {
3806     { "addps", { XM, EXx }, PREFIX_OPCODE },
3807     { "addss", { XM, EXd }, PREFIX_OPCODE },
3808     { "addpd", { XM, EXx }, PREFIX_OPCODE },
3809     { "addsd", { XM, EXq }, PREFIX_OPCODE },
3810   },
3811
3812   /* PREFIX_0F59 */
3813   {
3814     { "mulps",  { XM, EXx }, PREFIX_OPCODE },
3815     { "mulss",  { XM, EXd }, PREFIX_OPCODE },
3816     { "mulpd",  { XM, EXx }, PREFIX_OPCODE },
3817     { "mulsd",  { XM, EXq }, PREFIX_OPCODE },
3818   },
3819
3820   /* PREFIX_0F5A */
3821   {
3822     { "cvtps2pd", { XM, EXq }, PREFIX_OPCODE },
3823     { "cvtss2sd", { XM, EXd }, PREFIX_OPCODE },
3824     { "cvtpd2ps", { XM, EXx }, PREFIX_OPCODE },
3825     { "cvtsd2ss", { XM, EXq }, PREFIX_OPCODE },
3826   },
3827
3828   /* PREFIX_0F5B */
3829   {
3830     { "cvtdq2ps", { XM, EXx }, PREFIX_OPCODE },
3831     { "cvttps2dq", { XM, EXx }, PREFIX_OPCODE },
3832     { "cvtps2dq", { XM, EXx }, PREFIX_OPCODE },
3833   },
3834
3835   /* PREFIX_0F5C */
3836   {
3837     { "subps",  { XM, EXx }, PREFIX_OPCODE },
3838     { "subss",  { XM, EXd }, PREFIX_OPCODE },
3839     { "subpd",  { XM, EXx }, PREFIX_OPCODE },
3840     { "subsd",  { XM, EXq }, PREFIX_OPCODE },
3841   },
3842
3843   /* PREFIX_0F5D */
3844   {
3845     { "minps",  { XM, EXx }, PREFIX_OPCODE },
3846     { "minss",  { XM, EXd }, PREFIX_OPCODE },
3847     { "minpd",  { XM, EXx }, PREFIX_OPCODE },
3848     { "minsd",  { XM, EXq }, PREFIX_OPCODE },
3849   },
3850
3851   /* PREFIX_0F5E */
3852   {
3853     { "divps",  { XM, EXx }, PREFIX_OPCODE },
3854     { "divss",  { XM, EXd }, PREFIX_OPCODE },
3855     { "divpd",  { XM, EXx }, PREFIX_OPCODE },
3856     { "divsd",  { XM, EXq }, PREFIX_OPCODE },
3857   },
3858
3859   /* PREFIX_0F5F */
3860   {
3861     { "maxps",  { XM, EXx }, PREFIX_OPCODE },
3862     { "maxss",  { XM, EXd }, PREFIX_OPCODE },
3863     { "maxpd",  { XM, EXx }, PREFIX_OPCODE },
3864     { "maxsd",  { XM, EXq }, PREFIX_OPCODE },
3865   },
3866
3867   /* PREFIX_0F60 */
3868   {
3869     { "punpcklbw",{ MX, EMd }, PREFIX_OPCODE },
3870     { Bad_Opcode },
3871     { "punpcklbw",{ MX, EMx }, PREFIX_OPCODE },
3872   },
3873
3874   /* PREFIX_0F61 */
3875   {
3876     { "punpcklwd",{ MX, EMd }, PREFIX_OPCODE },
3877     { Bad_Opcode },
3878     { "punpcklwd",{ MX, EMx }, PREFIX_OPCODE },
3879   },
3880
3881   /* PREFIX_0F62 */
3882   {
3883     { "punpckldq",{ MX, EMd }, PREFIX_OPCODE },
3884     { Bad_Opcode },
3885     { "punpckldq",{ MX, EMx }, PREFIX_OPCODE },
3886   },
3887
3888   /* PREFIX_0F6C */
3889   {
3890     { Bad_Opcode },
3891     { Bad_Opcode },
3892     { "punpcklqdq", { XM, EXx }, PREFIX_OPCODE },
3893   },
3894
3895   /* PREFIX_0F6D */
3896   {
3897     { Bad_Opcode },
3898     { Bad_Opcode },
3899     { "punpckhqdq", { XM, EXx }, PREFIX_OPCODE },
3900   },
3901
3902   /* PREFIX_0F6F */
3903   {
3904     { "movq",   { MX, EM }, PREFIX_OPCODE },
3905     { "movdqu", { XM, EXx }, PREFIX_OPCODE },
3906     { "movdqa", { XM, EXx }, PREFIX_OPCODE },
3907   },
3908
3909   /* PREFIX_0F70 */
3910   {
3911     { "pshufw", { MX, EM, Ib }, PREFIX_OPCODE },
3912     { "pshufhw",{ XM, EXx, Ib }, PREFIX_OPCODE },
3913     { "pshufd", { XM, EXx, Ib }, PREFIX_OPCODE },
3914     { "pshuflw",{ XM, EXx, Ib }, PREFIX_OPCODE },
3915   },
3916
3917   /* PREFIX_0F73_REG_3 */
3918   {
3919     { Bad_Opcode },
3920     { Bad_Opcode },
3921     { "psrldq", { XS, Ib }, 0 },
3922   },
3923
3924   /* PREFIX_0F73_REG_7 */
3925   {
3926     { Bad_Opcode },
3927     { Bad_Opcode },
3928     { "pslldq", { XS, Ib }, 0 },
3929   },
3930
3931   /* PREFIX_0F78 */
3932   {
3933     {"vmread",  { Em, Gm }, 0 },
3934     { Bad_Opcode },
3935     {"extrq",   { XS, Ib, Ib }, 0 },
3936     {"insertq", { XM, XS, Ib, Ib }, 0 },
3937   },
3938
3939   /* PREFIX_0F79 */
3940   {
3941     {"vmwrite", { Gm, Em }, 0 },
3942     { Bad_Opcode },
3943     {"extrq",   { XM, XS }, 0 },
3944     {"insertq", { XM, XS }, 0 },
3945   },
3946
3947   /* PREFIX_0F7C */
3948   {
3949     { Bad_Opcode },
3950     { Bad_Opcode },
3951     { "haddpd", { XM, EXx }, PREFIX_OPCODE },
3952     { "haddps", { XM, EXx }, PREFIX_OPCODE },
3953   },
3954
3955   /* PREFIX_0F7D */
3956   {
3957     { Bad_Opcode },
3958     { Bad_Opcode },
3959     { "hsubpd", { XM, EXx }, PREFIX_OPCODE },
3960     { "hsubps", { XM, EXx }, PREFIX_OPCODE },
3961   },
3962
3963   /* PREFIX_0F7E */
3964   {
3965     { "movK",   { Edq, MX }, PREFIX_OPCODE },
3966     { "movq",   { XM, EXq }, PREFIX_OPCODE },
3967     { "movK",   { Edq, XM }, PREFIX_OPCODE },
3968   },
3969
3970   /* PREFIX_0F7F */
3971   {
3972     { "movq",   { EMS, MX }, PREFIX_OPCODE },
3973     { "movdqu", { EXxS, XM }, PREFIX_OPCODE },
3974     { "movdqa", { EXxS, XM }, PREFIX_OPCODE },
3975   },
3976
3977   /* PREFIX_0FAE_REG_0 */
3978   {
3979     { Bad_Opcode },
3980     { "rdfsbase", { Ev }, 0 },
3981   },
3982
3983   /* PREFIX_0FAE_REG_1 */
3984   {
3985     { Bad_Opcode },
3986     { "rdgsbase", { Ev }, 0 },
3987   },
3988
3989   /* PREFIX_0FAE_REG_2 */
3990   {
3991     { Bad_Opcode },
3992     { "wrfsbase", { Ev }, 0 },
3993   },
3994
3995   /* PREFIX_0FAE_REG_3 */
3996   {
3997     { Bad_Opcode },
3998     { "wrgsbase", { Ev }, 0 },
3999   },
4000
4001   /* PREFIX_0FAE_REG_6 */
4002   {
4003     { "xsaveopt",      { FXSAVE }, 0 },
4004     { Bad_Opcode },
4005     { "clwb",   { Mb }, 0 },
4006   },
4007
4008   /* PREFIX_0FAE_REG_7 */
4009   {
4010     { "clflush",        { Mb }, 0 },
4011     { Bad_Opcode },
4012     { "clflushopt",     { Mb }, 0 },
4013   },
4014
4015   /* PREFIX_RM_0_0FAE_REG_7 */
4016   {
4017     { "sfence",         { Skip_MODRM }, 0 },
4018     { Bad_Opcode },
4019     { "pcommit",                { Skip_MODRM }, 0 },
4020   },
4021
4022   /* PREFIX_0FB8 */
4023   {
4024     { Bad_Opcode },
4025     { "popcntS", { Gv, Ev }, 0 },
4026   },
4027
4028   /* PREFIX_0FBC */
4029   {
4030     { "bsfS",   { Gv, Ev }, 0 },
4031     { "tzcntS", { Gv, Ev }, 0 },
4032     { "bsfS",   { Gv, Ev }, 0 },
4033   },
4034
4035   /* PREFIX_0FBD */
4036   {
4037     { "bsrS",   { Gv, Ev }, 0 },
4038     { "lzcntS", { Gv, Ev }, 0 },
4039     { "bsrS",   { Gv, Ev }, 0 },
4040   },
4041
4042   /* PREFIX_0FC2 */
4043   {
4044     { "cmpps",  { XM, EXx, CMP }, PREFIX_OPCODE },
4045     { "cmpss",  { XM, EXd, CMP }, PREFIX_OPCODE },
4046     { "cmppd",  { XM, EXx, CMP }, PREFIX_OPCODE },
4047     { "cmpsd",  { XM, EXq, CMP }, PREFIX_OPCODE },
4048   },
4049
4050   /* PREFIX_0FC3 */
4051   {
4052     { "movntiS", { Ma, Gv }, PREFIX_OPCODE },
4053   },
4054
4055   /* PREFIX_MOD_0_0FC7_REG_6 */
4056   {
4057     { "vmptrld",{ Mq }, 0 },
4058     { "vmxon",  { Mq }, 0 },
4059     { "vmclear",{ Mq }, 0 },
4060   },
4061
4062   /* PREFIX_MOD_3_0FC7_REG_6 */
4063   {
4064     { "rdrand", { Ev }, 0 },
4065     { Bad_Opcode },
4066     { "rdrand", { Ev }, 0 }
4067   },
4068
4069   /* PREFIX_MOD_3_0FC7_REG_7 */
4070   {
4071     { "rdseed", { Ev }, 0 },
4072     { Bad_Opcode },
4073     { "rdseed", { Ev }, 0 },
4074   },
4075
4076   /* PREFIX_0FD0 */
4077   {
4078     { Bad_Opcode },
4079     { Bad_Opcode },
4080     { "addsubpd", { XM, EXx }, 0 },
4081     { "addsubps", { XM, EXx }, 0 },
4082   },
4083
4084   /* PREFIX_0FD6 */
4085   {
4086     { Bad_Opcode },
4087     { "movq2dq",{ XM, MS }, 0 },
4088     { "movq",   { EXqS, XM }, 0 },
4089     { "movdq2q",{ MX, XS }, 0 },
4090   },
4091
4092   /* PREFIX_0FE6 */
4093   {
4094     { Bad_Opcode },
4095     { "cvtdq2pd", { XM, EXq }, PREFIX_OPCODE },
4096     { "cvttpd2dq", { XM, EXx }, PREFIX_OPCODE },
4097     { "cvtpd2dq", { XM, EXx }, PREFIX_OPCODE },
4098   },
4099
4100   /* PREFIX_0FE7 */
4101   {
4102     { "movntq", { Mq, MX }, PREFIX_OPCODE },
4103     { Bad_Opcode },
4104     { MOD_TABLE (MOD_0FE7_PREFIX_2) },
4105   },
4106
4107   /* PREFIX_0FF0 */
4108   {
4109     { Bad_Opcode },
4110     { Bad_Opcode },
4111     { Bad_Opcode },
4112     { MOD_TABLE (MOD_0FF0_PREFIX_3) },
4113   },
4114
4115   /* PREFIX_0FF7 */
4116   {
4117     { "maskmovq", { MX, MS }, PREFIX_OPCODE },
4118     { Bad_Opcode },
4119     { "maskmovdqu", { XM, XS }, PREFIX_OPCODE },
4120   },
4121
4122   /* PREFIX_0F3810 */
4123   {
4124     { Bad_Opcode },
4125     { Bad_Opcode },
4126     { "pblendvb", { XM, EXx, XMM0 }, PREFIX_OPCODE },
4127   },
4128
4129   /* PREFIX_0F3814 */
4130   {
4131     { Bad_Opcode },
4132     { Bad_Opcode },
4133     { "blendvps", { XM, EXx, XMM0 }, PREFIX_OPCODE },
4134   },
4135
4136   /* PREFIX_0F3815 */
4137   {
4138     { Bad_Opcode },
4139     { Bad_Opcode },
4140     { "blendvpd", { XM, EXx, XMM0 }, PREFIX_OPCODE },
4141   },
4142
4143   /* PREFIX_0F3817 */
4144   {
4145     { Bad_Opcode },
4146     { Bad_Opcode },
4147     { "ptest",  { XM, EXx }, PREFIX_OPCODE },
4148   },
4149
4150   /* PREFIX_0F3820 */
4151   {
4152     { Bad_Opcode },
4153     { Bad_Opcode },
4154     { "pmovsxbw", { XM, EXq }, PREFIX_OPCODE },
4155   },
4156
4157   /* PREFIX_0F3821 */
4158   {
4159     { Bad_Opcode },
4160     { Bad_Opcode },
4161     { "pmovsxbd", { XM, EXd }, PREFIX_OPCODE },
4162   },
4163
4164   /* PREFIX_0F3822 */
4165   {
4166     { Bad_Opcode },
4167     { Bad_Opcode },
4168     { "pmovsxbq", { XM, EXw }, PREFIX_OPCODE },
4169   },
4170
4171   /* PREFIX_0F3823 */
4172   {
4173     { Bad_Opcode },
4174     { Bad_Opcode },
4175     { "pmovsxwd", { XM, EXq }, PREFIX_OPCODE },
4176   },
4177
4178   /* PREFIX_0F3824 */
4179   {
4180     { Bad_Opcode },
4181     { Bad_Opcode },
4182     { "pmovsxwq", { XM, EXd }, PREFIX_OPCODE },
4183   },
4184
4185   /* PREFIX_0F3825 */
4186   {
4187     { Bad_Opcode },
4188     { Bad_Opcode },
4189     { "pmovsxdq", { XM, EXq }, PREFIX_OPCODE },
4190   },
4191
4192   /* PREFIX_0F3828 */
4193   {
4194     { Bad_Opcode },
4195     { Bad_Opcode },
4196     { "pmuldq", { XM, EXx }, PREFIX_OPCODE },
4197   },
4198
4199   /* PREFIX_0F3829 */
4200   {
4201     { Bad_Opcode },
4202     { Bad_Opcode },
4203     { "pcmpeqq", { XM, EXx }, PREFIX_OPCODE },
4204   },
4205
4206   /* PREFIX_0F382A */
4207   {
4208     { Bad_Opcode },
4209     { Bad_Opcode },
4210     { MOD_TABLE (MOD_0F382A_PREFIX_2) },
4211   },
4212
4213   /* PREFIX_0F382B */
4214   {
4215     { Bad_Opcode },
4216     { Bad_Opcode },
4217     { "packusdw", { XM, EXx }, PREFIX_OPCODE },
4218   },
4219
4220   /* PREFIX_0F3830 */
4221   {
4222     { Bad_Opcode },
4223     { Bad_Opcode },
4224     { "pmovzxbw", { XM, EXq }, PREFIX_OPCODE },
4225   },
4226
4227   /* PREFIX_0F3831 */
4228   {
4229     { Bad_Opcode },
4230     { Bad_Opcode },
4231     { "pmovzxbd", { XM, EXd }, PREFIX_OPCODE },
4232   },
4233
4234   /* PREFIX_0F3832 */
4235   {
4236     { Bad_Opcode },
4237     { Bad_Opcode },
4238     { "pmovzxbq", { XM, EXw }, PREFIX_OPCODE },
4239   },
4240
4241   /* PREFIX_0F3833 */
4242   {
4243     { Bad_Opcode },
4244     { Bad_Opcode },
4245     { "pmovzxwd", { XM, EXq }, PREFIX_OPCODE },
4246   },
4247
4248   /* PREFIX_0F3834 */
4249   {
4250     { Bad_Opcode },
4251     { Bad_Opcode },
4252     { "pmovzxwq", { XM, EXd }, PREFIX_OPCODE },
4253   },
4254
4255   /* PREFIX_0F3835 */
4256   {
4257     { Bad_Opcode },
4258     { Bad_Opcode },
4259     { "pmovzxdq", { XM, EXq }, PREFIX_OPCODE },
4260   },
4261
4262   /* PREFIX_0F3837 */
4263   {
4264     { Bad_Opcode },
4265     { Bad_Opcode },
4266     { "pcmpgtq", { XM, EXx }, PREFIX_OPCODE },
4267   },
4268
4269   /* PREFIX_0F3838 */
4270   {
4271     { Bad_Opcode },
4272     { Bad_Opcode },
4273     { "pminsb", { XM, EXx }, PREFIX_OPCODE },
4274   },
4275
4276   /* PREFIX_0F3839 */
4277   {
4278     { Bad_Opcode },
4279     { Bad_Opcode },
4280     { "pminsd", { XM, EXx }, PREFIX_OPCODE },
4281   },
4282
4283   /* PREFIX_0F383A */
4284   {
4285     { Bad_Opcode },
4286     { Bad_Opcode },
4287     { "pminuw", { XM, EXx }, PREFIX_OPCODE },
4288   },
4289
4290   /* PREFIX_0F383B */
4291   {
4292     { Bad_Opcode },
4293     { Bad_Opcode },
4294     { "pminud", { XM, EXx }, PREFIX_OPCODE },
4295   },
4296
4297   /* PREFIX_0F383C */
4298   {
4299     { Bad_Opcode },
4300     { Bad_Opcode },
4301     { "pmaxsb", { XM, EXx }, PREFIX_OPCODE },
4302   },
4303
4304   /* PREFIX_0F383D */
4305   {
4306     { Bad_Opcode },
4307     { Bad_Opcode },
4308     { "pmaxsd", { XM, EXx }, PREFIX_OPCODE },
4309   },
4310
4311   /* PREFIX_0F383E */
4312   {
4313     { Bad_Opcode },
4314     { Bad_Opcode },
4315     { "pmaxuw", { XM, EXx }, PREFIX_OPCODE },
4316   },
4317
4318   /* PREFIX_0F383F */
4319   {
4320     { Bad_Opcode },
4321     { Bad_Opcode },
4322     { "pmaxud", { XM, EXx }, PREFIX_OPCODE },
4323   },
4324
4325   /* PREFIX_0F3840 */
4326   {
4327     { Bad_Opcode },
4328     { Bad_Opcode },
4329     { "pmulld", { XM, EXx }, PREFIX_OPCODE },
4330   },
4331
4332   /* PREFIX_0F3841 */
4333   {
4334     { Bad_Opcode },
4335     { Bad_Opcode },
4336     { "phminposuw", { XM, EXx }, PREFIX_OPCODE },
4337   },
4338
4339   /* PREFIX_0F3880 */
4340   {
4341     { Bad_Opcode },
4342     { Bad_Opcode },
4343     { "invept", { Gm, Mo }, PREFIX_OPCODE },
4344   },
4345
4346   /* PREFIX_0F3881 */
4347   {
4348     { Bad_Opcode },
4349     { Bad_Opcode },
4350     { "invvpid", { Gm, Mo }, PREFIX_OPCODE },
4351   },
4352
4353   /* PREFIX_0F3882 */
4354   {
4355     { Bad_Opcode },
4356     { Bad_Opcode },
4357     { "invpcid", { Gm, M }, PREFIX_OPCODE },
4358   },
4359
4360   /* PREFIX_0F38C8 */
4361   {
4362     { "sha1nexte", { XM, EXxmm }, PREFIX_OPCODE },
4363   },
4364
4365   /* PREFIX_0F38C9 */
4366   {
4367     { "sha1msg1", { XM, EXxmm }, PREFIX_OPCODE },
4368   },
4369
4370   /* PREFIX_0F38CA */
4371   {
4372     { "sha1msg2", { XM, EXxmm }, PREFIX_OPCODE },
4373   },
4374
4375   /* PREFIX_0F38CB */
4376   {
4377     { "sha256rnds2", { XM, EXxmm, XMM0 }, PREFIX_OPCODE },
4378   },
4379
4380   /* PREFIX_0F38CC */
4381   {
4382     { "sha256msg1", { XM, EXxmm }, PREFIX_OPCODE },
4383   },
4384
4385   /* PREFIX_0F38CD */
4386   {
4387     { "sha256msg2", { XM, EXxmm }, PREFIX_OPCODE },
4388   },
4389
4390   /* PREFIX_0F38DB */
4391   {
4392     { Bad_Opcode },
4393     { Bad_Opcode },
4394     { "aesimc", { XM, EXx }, PREFIX_OPCODE },
4395   },
4396
4397   /* PREFIX_0F38DC */
4398   {
4399     { Bad_Opcode },
4400     { Bad_Opcode },
4401     { "aesenc", { XM, EXx }, PREFIX_OPCODE },
4402   },
4403
4404   /* PREFIX_0F38DD */
4405   {
4406     { Bad_Opcode },
4407     { Bad_Opcode },
4408     { "aesenclast", { XM, EXx }, PREFIX_OPCODE },
4409   },
4410
4411   /* PREFIX_0F38DE */
4412   {
4413     { Bad_Opcode },
4414     { Bad_Opcode },
4415     { "aesdec", { XM, EXx }, PREFIX_OPCODE },
4416   },
4417
4418   /* PREFIX_0F38DF */
4419   {
4420     { Bad_Opcode },
4421     { Bad_Opcode },
4422     { "aesdeclast", { XM, EXx }, PREFIX_OPCODE },
4423   },
4424
4425   /* PREFIX_0F38F0 */
4426   {
4427     { "movbeS", { Gv, { MOVBE_Fixup, v_mode } }, PREFIX_OPCODE },
4428     { Bad_Opcode },
4429     { "movbeS", { Gv, { MOVBE_Fixup, v_mode } }, PREFIX_OPCODE },
4430     { "crc32",  { Gdq, { CRC32_Fixup, b_mode } }, PREFIX_OPCODE },
4431   },
4432
4433   /* PREFIX_0F38F1 */
4434   {
4435     { "movbeS", { { MOVBE_Fixup, v_mode }, Gv }, PREFIX_OPCODE },
4436     { Bad_Opcode },
4437     { "movbeS", { { MOVBE_Fixup, v_mode }, Gv }, PREFIX_OPCODE },
4438     { "crc32",  { Gdq, { CRC32_Fixup, v_mode } }, PREFIX_OPCODE },
4439   },
4440
4441   /* PREFIX_0F38F6 */
4442   {
4443     { Bad_Opcode },
4444     { "adoxS",  { Gdq, Edq}, PREFIX_OPCODE },
4445     { "adcxS",  { Gdq, Edq}, PREFIX_OPCODE },
4446     { Bad_Opcode },
4447   },
4448
4449   /* PREFIX_0F3A08 */
4450   {
4451     { Bad_Opcode },
4452     { Bad_Opcode },
4453     { "roundps", { XM, EXx, Ib }, PREFIX_OPCODE },
4454   },
4455
4456   /* PREFIX_0F3A09 */
4457   {
4458     { Bad_Opcode },
4459     { Bad_Opcode },
4460     { "roundpd", { XM, EXx, Ib }, PREFIX_OPCODE },
4461   },
4462
4463   /* PREFIX_0F3A0A */
4464   {
4465     { Bad_Opcode },
4466     { Bad_Opcode },
4467     { "roundss", { XM, EXd, Ib }, PREFIX_OPCODE },
4468   },
4469
4470   /* PREFIX_0F3A0B */
4471   {
4472     { Bad_Opcode },
4473     { Bad_Opcode },
4474     { "roundsd", { XM, EXq, Ib }, PREFIX_OPCODE },
4475   },
4476
4477   /* PREFIX_0F3A0C */
4478   {
4479     { Bad_Opcode },
4480     { Bad_Opcode },
4481     { "blendps", { XM, EXx, Ib }, PREFIX_OPCODE },
4482   },
4483
4484   /* PREFIX_0F3A0D */
4485   {
4486     { Bad_Opcode },
4487     { Bad_Opcode },
4488     { "blendpd", { XM, EXx, Ib }, PREFIX_OPCODE },
4489   },
4490
4491   /* PREFIX_0F3A0E */
4492   {
4493     { Bad_Opcode },
4494     { Bad_Opcode },
4495     { "pblendw", { XM, EXx, Ib }, PREFIX_OPCODE },
4496   },
4497
4498   /* PREFIX_0F3A14 */
4499   {
4500     { Bad_Opcode },
4501     { Bad_Opcode },
4502     { "pextrb", { Edqb, XM, Ib }, PREFIX_OPCODE },
4503   },
4504
4505   /* PREFIX_0F3A15 */
4506   {
4507     { Bad_Opcode },
4508     { Bad_Opcode },
4509     { "pextrw", { Edqw, XM, Ib }, PREFIX_OPCODE },
4510   },
4511
4512   /* PREFIX_0F3A16 */
4513   {
4514     { Bad_Opcode },
4515     { Bad_Opcode },
4516     { "pextrK", { Edq, XM, Ib }, PREFIX_OPCODE },
4517   },
4518
4519   /* PREFIX_0F3A17 */
4520   {
4521     { Bad_Opcode },
4522     { Bad_Opcode },
4523     { "extractps", { Edqd, XM, Ib }, PREFIX_OPCODE },
4524   },
4525
4526   /* PREFIX_0F3A20 */
4527   {
4528     { Bad_Opcode },
4529     { Bad_Opcode },
4530     { "pinsrb", { XM, Edqb, Ib }, PREFIX_OPCODE },
4531   },
4532
4533   /* PREFIX_0F3A21 */
4534   {
4535     { Bad_Opcode },
4536     { Bad_Opcode },
4537     { "insertps", { XM, EXd, Ib }, PREFIX_OPCODE },
4538   },
4539
4540   /* PREFIX_0F3A22 */
4541   {
4542     { Bad_Opcode },
4543     { Bad_Opcode },
4544     { "pinsrK", { XM, Edq, Ib }, PREFIX_OPCODE },
4545   },
4546
4547   /* PREFIX_0F3A40 */
4548   {
4549     { Bad_Opcode },
4550     { Bad_Opcode },
4551     { "dpps",   { XM, EXx, Ib }, PREFIX_OPCODE },
4552   },
4553
4554   /* PREFIX_0F3A41 */
4555   {
4556     { Bad_Opcode },
4557     { Bad_Opcode },
4558     { "dppd",   { XM, EXx, Ib }, PREFIX_OPCODE },
4559   },
4560
4561   /* PREFIX_0F3A42 */
4562   {
4563     { Bad_Opcode },
4564     { Bad_Opcode },
4565     { "mpsadbw", { XM, EXx, Ib }, PREFIX_OPCODE },
4566   },
4567
4568   /* PREFIX_0F3A44 */
4569   {
4570     { Bad_Opcode },
4571     { Bad_Opcode },
4572     { "pclmulqdq", { XM, EXx, PCLMUL }, PREFIX_OPCODE },
4573   },
4574
4575   /* PREFIX_0F3A60 */
4576   {
4577     { Bad_Opcode },
4578     { Bad_Opcode },
4579     { "pcmpestrm", { XM, EXx, Ib }, PREFIX_OPCODE },
4580   },
4581
4582   /* PREFIX_0F3A61 */
4583   {
4584     { Bad_Opcode },
4585     { Bad_Opcode },
4586     { "pcmpestri", { XM, EXx, Ib }, PREFIX_OPCODE },
4587   },
4588
4589   /* PREFIX_0F3A62 */
4590   {
4591     { Bad_Opcode },
4592     { Bad_Opcode },
4593     { "pcmpistrm", { XM, EXx, Ib }, PREFIX_OPCODE },
4594   },
4595
4596   /* PREFIX_0F3A63 */
4597   {
4598     { Bad_Opcode },
4599     { Bad_Opcode },
4600     { "pcmpistri", { XM, EXx, Ib }, PREFIX_OPCODE },
4601   },
4602
4603   /* PREFIX_0F3ACC */
4604   {
4605     { "sha1rnds4", { XM, EXxmm, Ib }, PREFIX_OPCODE },
4606   },
4607
4608   /* PREFIX_0F3ADF */
4609   {
4610     { Bad_Opcode },
4611     { Bad_Opcode },
4612     { "aeskeygenassist", { XM, EXx, Ib }, PREFIX_OPCODE },
4613   },
4614
4615   /* PREFIX_VEX_0F10 */
4616   {
4617     { VEX_W_TABLE (VEX_W_0F10_P_0) },
4618     { VEX_LEN_TABLE (VEX_LEN_0F10_P_1) },
4619     { VEX_W_TABLE (VEX_W_0F10_P_2) },
4620     { VEX_LEN_TABLE (VEX_LEN_0F10_P_3) },
4621   },
4622
4623   /* PREFIX_VEX_0F11 */
4624   {
4625     { VEX_W_TABLE (VEX_W_0F11_P_0) },
4626     { VEX_LEN_TABLE (VEX_LEN_0F11_P_1) },
4627     { VEX_W_TABLE (VEX_W_0F11_P_2) },
4628     { VEX_LEN_TABLE (VEX_LEN_0F11_P_3) },
4629   },
4630
4631   /* PREFIX_VEX_0F12 */
4632   {
4633     { MOD_TABLE (MOD_VEX_0F12_PREFIX_0) },
4634     { VEX_W_TABLE (VEX_W_0F12_P_1) },
4635     { VEX_LEN_TABLE (VEX_LEN_0F12_P_2) },
4636     { VEX_W_TABLE (VEX_W_0F12_P_3) },
4637   },
4638
4639   /* PREFIX_VEX_0F16 */
4640   {
4641     { MOD_TABLE (MOD_VEX_0F16_PREFIX_0) },
4642     { VEX_W_TABLE (VEX_W_0F16_P_1) },
4643     { VEX_LEN_TABLE (VEX_LEN_0F16_P_2) },
4644   },
4645
4646   /* PREFIX_VEX_0F2A */
4647   {
4648     { Bad_Opcode },
4649     { VEX_LEN_TABLE (VEX_LEN_0F2A_P_1) },
4650     { Bad_Opcode },
4651     { VEX_LEN_TABLE (VEX_LEN_0F2A_P_3) },
4652   },
4653
4654   /* PREFIX_VEX_0F2C */
4655   {
4656     { Bad_Opcode },
4657     { VEX_LEN_TABLE (VEX_LEN_0F2C_P_1) },
4658     { Bad_Opcode },
4659     { VEX_LEN_TABLE (VEX_LEN_0F2C_P_3) },
4660   },
4661
4662   /* PREFIX_VEX_0F2D */
4663   {
4664     { Bad_Opcode },
4665     { VEX_LEN_TABLE (VEX_LEN_0F2D_P_1) },
4666     { Bad_Opcode },
4667     { VEX_LEN_TABLE (VEX_LEN_0F2D_P_3) },
4668   },
4669
4670   /* PREFIX_VEX_0F2E */
4671   {
4672     { VEX_LEN_TABLE (VEX_LEN_0F2E_P_0) },
4673     { Bad_Opcode },
4674     { VEX_LEN_TABLE (VEX_LEN_0F2E_P_2) },
4675   },
4676
4677   /* PREFIX_VEX_0F2F */
4678   {
4679     { VEX_LEN_TABLE (VEX_LEN_0F2F_P_0) },
4680     { Bad_Opcode },
4681     { VEX_LEN_TABLE (VEX_LEN_0F2F_P_2) },
4682   },
4683
4684   /* PREFIX_VEX_0F41 */
4685   {
4686     { VEX_LEN_TABLE (VEX_LEN_0F41_P_0) },
4687     { Bad_Opcode },
4688     { VEX_LEN_TABLE (VEX_LEN_0F41_P_2) },
4689   },
4690
4691   /* PREFIX_VEX_0F42 */
4692   {
4693     { VEX_LEN_TABLE (VEX_LEN_0F42_P_0) },
4694     { Bad_Opcode },
4695     { VEX_LEN_TABLE (VEX_LEN_0F42_P_2) },
4696   },
4697
4698   /* PREFIX_VEX_0F44 */
4699   {
4700     { VEX_LEN_TABLE (VEX_LEN_0F44_P_0) },
4701     { Bad_Opcode },
4702     { VEX_LEN_TABLE (VEX_LEN_0F44_P_2) },
4703   },
4704
4705   /* PREFIX_VEX_0F45 */
4706   {
4707     { VEX_LEN_TABLE (VEX_LEN_0F45_P_0) },
4708     { Bad_Opcode },
4709     { VEX_LEN_TABLE (VEX_LEN_0F45_P_2) },
4710   },
4711
4712   /* PREFIX_VEX_0F46 */
4713   {
4714     { VEX_LEN_TABLE (VEX_LEN_0F46_P_0) },
4715     { Bad_Opcode },
4716     { VEX_LEN_TABLE (VEX_LEN_0F46_P_2) },
4717   },
4718
4719   /* PREFIX_VEX_0F47 */
4720   {
4721     { VEX_LEN_TABLE (VEX_LEN_0F47_P_0) },
4722     { Bad_Opcode },
4723     { VEX_LEN_TABLE (VEX_LEN_0F47_P_2) },
4724   },
4725
4726   /* PREFIX_VEX_0F4A */
4727   {
4728     { VEX_LEN_TABLE (VEX_LEN_0F4A_P_0) },
4729     { Bad_Opcode },
4730     { VEX_LEN_TABLE (VEX_LEN_0F4A_P_2) },
4731   },
4732
4733   /* PREFIX_VEX_0F4B */
4734   {
4735     { VEX_LEN_TABLE (VEX_LEN_0F4B_P_0) },
4736     { Bad_Opcode },
4737     { VEX_LEN_TABLE (VEX_LEN_0F4B_P_2) },
4738   },
4739
4740   /* PREFIX_VEX_0F51 */
4741   {
4742     { VEX_W_TABLE (VEX_W_0F51_P_0) },
4743     { VEX_LEN_TABLE (VEX_LEN_0F51_P_1) },
4744     { VEX_W_TABLE (VEX_W_0F51_P_2) },
4745     { VEX_LEN_TABLE (VEX_LEN_0F51_P_3) },
4746   },
4747
4748   /* PREFIX_VEX_0F52 */
4749   {
4750     { VEX_W_TABLE (VEX_W_0F52_P_0) },
4751     { VEX_LEN_TABLE (VEX_LEN_0F52_P_1) },
4752   },
4753
4754   /* PREFIX_VEX_0F53 */
4755   {
4756     { VEX_W_TABLE (VEX_W_0F53_P_0) },
4757     { VEX_LEN_TABLE (VEX_LEN_0F53_P_1) },
4758   },
4759
4760   /* PREFIX_VEX_0F58 */
4761   {
4762     { VEX_W_TABLE (VEX_W_0F58_P_0) },
4763     { VEX_LEN_TABLE (VEX_LEN_0F58_P_1) },
4764     { VEX_W_TABLE (VEX_W_0F58_P_2) },
4765     { VEX_LEN_TABLE (VEX_LEN_0F58_P_3) },
4766   },
4767
4768   /* PREFIX_VEX_0F59 */
4769   {
4770     { VEX_W_TABLE (VEX_W_0F59_P_0) },
4771     { VEX_LEN_TABLE (VEX_LEN_0F59_P_1) },
4772     { VEX_W_TABLE (VEX_W_0F59_P_2) },
4773     { VEX_LEN_TABLE (VEX_LEN_0F59_P_3) },
4774   },
4775
4776   /* PREFIX_VEX_0F5A */
4777   {
4778     { VEX_W_TABLE (VEX_W_0F5A_P_0) },
4779     { VEX_LEN_TABLE (VEX_LEN_0F5A_P_1) },
4780     { "vcvtpd2ps%XY", { XMM, EXx }, 0 },
4781     { VEX_LEN_TABLE (VEX_LEN_0F5A_P_3) },
4782   },
4783
4784   /* PREFIX_VEX_0F5B */
4785   {
4786     { VEX_W_TABLE (VEX_W_0F5B_P_0) },
4787     { VEX_W_TABLE (VEX_W_0F5B_P_1) },
4788     { VEX_W_TABLE (VEX_W_0F5B_P_2) },
4789   },
4790
4791   /* PREFIX_VEX_0F5C */
4792   {
4793     { VEX_W_TABLE (VEX_W_0F5C_P_0) },
4794     { VEX_LEN_TABLE (VEX_LEN_0F5C_P_1) },
4795     { VEX_W_TABLE (VEX_W_0F5C_P_2) },
4796     { VEX_LEN_TABLE (VEX_LEN_0F5C_P_3) },
4797   },
4798
4799   /* PREFIX_VEX_0F5D */
4800   {
4801     { VEX_W_TABLE (VEX_W_0F5D_P_0) },
4802     { VEX_LEN_TABLE (VEX_LEN_0F5D_P_1) },
4803     { VEX_W_TABLE (VEX_W_0F5D_P_2) },
4804     { VEX_LEN_TABLE (VEX_LEN_0F5D_P_3) },
4805   },
4806
4807   /* PREFIX_VEX_0F5E */
4808   {
4809     { VEX_W_TABLE (VEX_W_0F5E_P_0) },
4810     { VEX_LEN_TABLE (VEX_LEN_0F5E_P_1) },
4811     { VEX_W_TABLE (VEX_W_0F5E_P_2) },
4812     { VEX_LEN_TABLE (VEX_LEN_0F5E_P_3) },
4813   },
4814
4815   /* PREFIX_VEX_0F5F */
4816   {
4817     { VEX_W_TABLE (VEX_W_0F5F_P_0) },
4818     { VEX_LEN_TABLE (VEX_LEN_0F5F_P_1) },
4819     { VEX_W_TABLE (VEX_W_0F5F_P_2) },
4820     { VEX_LEN_TABLE (VEX_LEN_0F5F_P_3) },
4821   },
4822
4823   /* PREFIX_VEX_0F60 */
4824   {
4825     { Bad_Opcode },
4826     { Bad_Opcode },
4827     { VEX_W_TABLE (VEX_W_0F60_P_2) },
4828   },
4829
4830   /* PREFIX_VEX_0F61 */
4831   {
4832     { Bad_Opcode },
4833     { Bad_Opcode },
4834     { VEX_W_TABLE (VEX_W_0F61_P_2) },
4835   },
4836
4837   /* PREFIX_VEX_0F62 */
4838   {
4839     { Bad_Opcode },
4840     { Bad_Opcode },
4841     { VEX_W_TABLE (VEX_W_0F62_P_2) },
4842   },
4843
4844   /* PREFIX_VEX_0F63 */
4845   {
4846     { Bad_Opcode },
4847     { Bad_Opcode },
4848     { VEX_W_TABLE (VEX_W_0F63_P_2) },
4849   },
4850
4851   /* PREFIX_VEX_0F64 */
4852   {
4853     { Bad_Opcode },
4854     { Bad_Opcode },
4855     { VEX_W_TABLE (VEX_W_0F64_P_2) },
4856   },
4857
4858   /* PREFIX_VEX_0F65 */
4859   {
4860     { Bad_Opcode },
4861     { Bad_Opcode },
4862     { VEX_W_TABLE (VEX_W_0F65_P_2) },
4863   },
4864
4865   /* PREFIX_VEX_0F66 */
4866   {
4867     { Bad_Opcode },
4868     { Bad_Opcode },
4869     { VEX_W_TABLE (VEX_W_0F66_P_2) },
4870   },
4871
4872   /* PREFIX_VEX_0F67 */
4873   {
4874     { Bad_Opcode },
4875     { Bad_Opcode },
4876     { VEX_W_TABLE (VEX_W_0F67_P_2) },
4877   },
4878
4879   /* PREFIX_VEX_0F68 */
4880   {
4881     { Bad_Opcode },
4882     { Bad_Opcode },
4883     { VEX_W_TABLE (VEX_W_0F68_P_2) },
4884   },
4885
4886   /* PREFIX_VEX_0F69 */
4887   {
4888     { Bad_Opcode },
4889     { Bad_Opcode },
4890     { VEX_W_TABLE (VEX_W_0F69_P_2) },
4891   },
4892
4893   /* PREFIX_VEX_0F6A */
4894   {
4895     { Bad_Opcode },
4896     { Bad_Opcode },
4897     { VEX_W_TABLE (VEX_W_0F6A_P_2) },
4898   },
4899
4900   /* PREFIX_VEX_0F6B */
4901   {
4902     { Bad_Opcode },
4903     { Bad_Opcode },
4904     { VEX_W_TABLE (VEX_W_0F6B_P_2) },
4905   },
4906
4907   /* PREFIX_VEX_0F6C */
4908   {
4909     { Bad_Opcode },
4910     { Bad_Opcode },
4911     { VEX_W_TABLE (VEX_W_0F6C_P_2) },
4912   },
4913
4914   /* PREFIX_VEX_0F6D */
4915   {
4916     { Bad_Opcode },
4917     { Bad_Opcode },
4918     { VEX_W_TABLE (VEX_W_0F6D_P_2) },
4919   },
4920
4921   /* PREFIX_VEX_0F6E */
4922   {
4923     { Bad_Opcode },
4924     { Bad_Opcode },
4925     { VEX_LEN_TABLE (VEX_LEN_0F6E_P_2) },
4926   },
4927
4928   /* PREFIX_VEX_0F6F */
4929   {
4930     { Bad_Opcode },
4931     { VEX_W_TABLE (VEX_W_0F6F_P_1) },
4932     { VEX_W_TABLE (VEX_W_0F6F_P_2) },
4933   },
4934
4935   /* PREFIX_VEX_0F70 */
4936   {
4937     { Bad_Opcode },
4938     { VEX_W_TABLE (VEX_W_0F70_P_1) },
4939     { VEX_W_TABLE (VEX_W_0F70_P_2) },
4940     { VEX_W_TABLE (VEX_W_0F70_P_3) },
4941   },
4942
4943   /* PREFIX_VEX_0F71_REG_2 */
4944   {
4945     { Bad_Opcode },
4946     { Bad_Opcode },
4947     { VEX_W_TABLE (VEX_W_0F71_R_2_P_2) },
4948   },
4949
4950   /* PREFIX_VEX_0F71_REG_4 */
4951   {
4952     { Bad_Opcode },
4953     { Bad_Opcode },
4954     { VEX_W_TABLE (VEX_W_0F71_R_4_P_2) },
4955   },
4956
4957   /* PREFIX_VEX_0F71_REG_6 */
4958   {
4959     { Bad_Opcode },
4960     { Bad_Opcode },
4961     { VEX_W_TABLE (VEX_W_0F71_R_6_P_2) },
4962   },
4963
4964   /* PREFIX_VEX_0F72_REG_2 */
4965   {
4966     { Bad_Opcode },
4967     { Bad_Opcode },
4968     { VEX_W_TABLE (VEX_W_0F72_R_2_P_2) },
4969   },
4970
4971   /* PREFIX_VEX_0F72_REG_4 */
4972   {
4973     { Bad_Opcode },
4974     { Bad_Opcode },
4975     { VEX_W_TABLE (VEX_W_0F72_R_4_P_2) },
4976   },
4977
4978   /* PREFIX_VEX_0F72_REG_6 */
4979   {
4980     { Bad_Opcode },
4981     { Bad_Opcode },
4982     { VEX_W_TABLE (VEX_W_0F72_R_6_P_2) },
4983   },
4984
4985   /* PREFIX_VEX_0F73_REG_2 */
4986   {
4987     { Bad_Opcode },
4988     { Bad_Opcode },
4989     { VEX_W_TABLE (VEX_W_0F73_R_2_P_2) },
4990   },
4991
4992   /* PREFIX_VEX_0F73_REG_3 */
4993   {
4994     { Bad_Opcode },
4995     { Bad_Opcode },
4996     { VEX_W_TABLE (VEX_W_0F73_R_3_P_2) },
4997   },
4998
4999   /* PREFIX_VEX_0F73_REG_6 */
5000   {
5001     { Bad_Opcode },
5002     { Bad_Opcode },
5003     { VEX_W_TABLE (VEX_W_0F73_R_6_P_2) },
5004   },
5005
5006   /* PREFIX_VEX_0F73_REG_7 */
5007   {
5008     { Bad_Opcode },
5009     { Bad_Opcode },
5010     { VEX_W_TABLE (VEX_W_0F73_R_7_P_2) },
5011   },
5012
5013   /* PREFIX_VEX_0F74 */
5014   {
5015     { Bad_Opcode },
5016     { Bad_Opcode },
5017     { VEX_W_TABLE (VEX_W_0F74_P_2) },
5018   },
5019
5020   /* PREFIX_VEX_0F75 */
5021   {
5022     { Bad_Opcode },
5023     { Bad_Opcode },
5024     { VEX_W_TABLE (VEX_W_0F75_P_2) },
5025   },
5026
5027   /* PREFIX_VEX_0F76 */
5028   {
5029     { Bad_Opcode },
5030     { Bad_Opcode },
5031     { VEX_W_TABLE (VEX_W_0F76_P_2) },
5032   },
5033
5034   /* PREFIX_VEX_0F77 */
5035   {
5036     { VEX_W_TABLE (VEX_W_0F77_P_0) },
5037   },
5038
5039   /* PREFIX_VEX_0F7C */
5040   {
5041     { Bad_Opcode },
5042     { Bad_Opcode },
5043     { VEX_W_TABLE (VEX_W_0F7C_P_2) },
5044     { VEX_W_TABLE (VEX_W_0F7C_P_3) },
5045   },
5046
5047   /* PREFIX_VEX_0F7D */
5048   {
5049     { Bad_Opcode },
5050     { Bad_Opcode },
5051     { VEX_W_TABLE (VEX_W_0F7D_P_2) },
5052     { VEX_W_TABLE (VEX_W_0F7D_P_3) },
5053   },
5054
5055   /* PREFIX_VEX_0F7E */
5056   {
5057     { Bad_Opcode },
5058     { VEX_LEN_TABLE (VEX_LEN_0F7E_P_1) },
5059     { VEX_LEN_TABLE (VEX_LEN_0F7E_P_2) },
5060   },
5061
5062   /* PREFIX_VEX_0F7F */
5063   {
5064     { Bad_Opcode },
5065     { VEX_W_TABLE (VEX_W_0F7F_P_1) },
5066     { VEX_W_TABLE (VEX_W_0F7F_P_2) },
5067   },
5068
5069   /* PREFIX_VEX_0F90 */
5070   {
5071     { VEX_LEN_TABLE (VEX_LEN_0F90_P_0) },
5072     { Bad_Opcode },
5073     { VEX_LEN_TABLE (VEX_LEN_0F90_P_2) },
5074   },
5075
5076   /* PREFIX_VEX_0F91 */
5077   {
5078     { VEX_LEN_TABLE (VEX_LEN_0F91_P_0) },
5079     { Bad_Opcode },
5080     { VEX_LEN_TABLE (VEX_LEN_0F91_P_2) },
5081   },
5082
5083   /* PREFIX_VEX_0F92 */
5084   {
5085     { VEX_LEN_TABLE (VEX_LEN_0F92_P_0) },
5086     { Bad_Opcode },
5087     { VEX_LEN_TABLE (VEX_LEN_0F92_P_2) },
5088     { VEX_LEN_TABLE (VEX_LEN_0F92_P_3) },
5089   },
5090
5091   /* PREFIX_VEX_0F93 */
5092   {
5093     { VEX_LEN_TABLE (VEX_LEN_0F93_P_0) },
5094     { Bad_Opcode },
5095     { VEX_LEN_TABLE (VEX_LEN_0F93_P_2) },
5096     { VEX_LEN_TABLE (VEX_LEN_0F93_P_3) },
5097   },
5098
5099   /* PREFIX_VEX_0F98 */
5100   {
5101     { VEX_LEN_TABLE (VEX_LEN_0F98_P_0) },
5102     { Bad_Opcode },
5103     { VEX_LEN_TABLE (VEX_LEN_0F98_P_2) },
5104   },
5105
5106   /* PREFIX_VEX_0F99 */
5107   {
5108     { VEX_LEN_TABLE (VEX_LEN_0F99_P_0) },
5109     { Bad_Opcode },
5110     { VEX_LEN_TABLE (VEX_LEN_0F99_P_2) },
5111   },
5112
5113   /* PREFIX_VEX_0FC2 */
5114   {
5115     { VEX_W_TABLE (VEX_W_0FC2_P_0) },
5116     { VEX_LEN_TABLE (VEX_LEN_0FC2_P_1) },
5117     { VEX_W_TABLE (VEX_W_0FC2_P_2) },
5118     { VEX_LEN_TABLE (VEX_LEN_0FC2_P_3) },
5119   },
5120
5121   /* PREFIX_VEX_0FC4 */
5122   {
5123     { Bad_Opcode },
5124     { Bad_Opcode },
5125     { VEX_LEN_TABLE (VEX_LEN_0FC4_P_2) },
5126   },
5127
5128   /* PREFIX_VEX_0FC5 */
5129   {
5130     { Bad_Opcode },
5131     { Bad_Opcode },
5132     { VEX_LEN_TABLE (VEX_LEN_0FC5_P_2) },
5133   },
5134
5135   /* PREFIX_VEX_0FD0 */
5136   {
5137     { Bad_Opcode },
5138     { Bad_Opcode },
5139     { VEX_W_TABLE (VEX_W_0FD0_P_2) },
5140     { VEX_W_TABLE (VEX_W_0FD0_P_3) },
5141   },
5142
5143   /* PREFIX_VEX_0FD1 */
5144   {
5145     { Bad_Opcode },
5146     { Bad_Opcode },
5147     { VEX_W_TABLE (VEX_W_0FD1_P_2) },
5148   },
5149
5150   /* PREFIX_VEX_0FD2 */
5151   {
5152     { Bad_Opcode },
5153     { Bad_Opcode },
5154     { VEX_W_TABLE (VEX_W_0FD2_P_2) },
5155   },
5156
5157   /* PREFIX_VEX_0FD3 */
5158   {
5159     { Bad_Opcode },
5160     { Bad_Opcode },
5161     { VEX_W_TABLE (VEX_W_0FD3_P_2) },
5162   },
5163
5164   /* PREFIX_VEX_0FD4 */
5165   {
5166     { Bad_Opcode },
5167     { Bad_Opcode },
5168     { VEX_W_TABLE (VEX_W_0FD4_P_2) },
5169   },
5170
5171   /* PREFIX_VEX_0FD5 */
5172   {
5173     { Bad_Opcode },
5174     { Bad_Opcode },
5175     { VEX_W_TABLE (VEX_W_0FD5_P_2) },
5176   },
5177
5178   /* PREFIX_VEX_0FD6 */
5179   {
5180     { Bad_Opcode },
5181     { Bad_Opcode },
5182     { VEX_LEN_TABLE (VEX_LEN_0FD6_P_2) },
5183   },
5184
5185   /* PREFIX_VEX_0FD7 */
5186   {
5187     { Bad_Opcode },
5188     { Bad_Opcode },
5189     { MOD_TABLE (MOD_VEX_0FD7_PREFIX_2) },
5190   },
5191
5192   /* PREFIX_VEX_0FD8 */
5193   {
5194     { Bad_Opcode },
5195     { Bad_Opcode },
5196     { VEX_W_TABLE (VEX_W_0FD8_P_2) },
5197   },
5198
5199   /* PREFIX_VEX_0FD9 */
5200   {
5201     { Bad_Opcode },
5202     { Bad_Opcode },
5203     { VEX_W_TABLE (VEX_W_0FD9_P_2) },
5204   },
5205
5206   /* PREFIX_VEX_0FDA */
5207   {
5208     { Bad_Opcode },
5209     { Bad_Opcode },
5210     { VEX_W_TABLE (VEX_W_0FDA_P_2) },
5211   },
5212
5213   /* PREFIX_VEX_0FDB */
5214   {
5215     { Bad_Opcode },
5216     { Bad_Opcode },
5217     { VEX_W_TABLE (VEX_W_0FDB_P_2) },
5218   },
5219
5220   /* PREFIX_VEX_0FDC */
5221   {
5222     { Bad_Opcode },
5223     { Bad_Opcode },
5224     { VEX_W_TABLE (VEX_W_0FDC_P_2) },
5225   },
5226
5227   /* PREFIX_VEX_0FDD */
5228   {
5229     { Bad_Opcode },
5230     { Bad_Opcode },
5231     { VEX_W_TABLE (VEX_W_0FDD_P_2) },
5232   },
5233
5234   /* PREFIX_VEX_0FDE */
5235   {
5236     { Bad_Opcode },
5237     { Bad_Opcode },
5238     { VEX_W_TABLE (VEX_W_0FDE_P_2) },
5239   },
5240
5241   /* PREFIX_VEX_0FDF */
5242   {
5243     { Bad_Opcode },
5244     { Bad_Opcode },
5245     { VEX_W_TABLE (VEX_W_0FDF_P_2) },
5246   },
5247
5248   /* PREFIX_VEX_0FE0 */
5249   {
5250     { Bad_Opcode },
5251     { Bad_Opcode },
5252     { VEX_W_TABLE (VEX_W_0FE0_P_2) },
5253   },
5254
5255   /* PREFIX_VEX_0FE1 */
5256   {
5257     { Bad_Opcode },
5258     { Bad_Opcode },
5259     { VEX_W_TABLE (VEX_W_0FE1_P_2) },
5260   },
5261
5262   /* PREFIX_VEX_0FE2 */
5263   {
5264     { Bad_Opcode },
5265     { Bad_Opcode },
5266     { VEX_W_TABLE (VEX_W_0FE2_P_2) },
5267   },
5268
5269   /* PREFIX_VEX_0FE3 */
5270   {
5271     { Bad_Opcode },
5272     { Bad_Opcode },
5273     { VEX_W_TABLE (VEX_W_0FE3_P_2) },
5274   },
5275
5276   /* PREFIX_VEX_0FE4 */
5277   {
5278     { Bad_Opcode },
5279     { Bad_Opcode },
5280     { VEX_W_TABLE (VEX_W_0FE4_P_2) },
5281   },
5282
5283   /* PREFIX_VEX_0FE5 */
5284   {
5285     { Bad_Opcode },
5286     { Bad_Opcode },
5287     { VEX_W_TABLE (VEX_W_0FE5_P_2) },
5288   },
5289
5290   /* PREFIX_VEX_0FE6 */
5291   {
5292     { Bad_Opcode },
5293     { VEX_W_TABLE (VEX_W_0FE6_P_1) },
5294     { VEX_W_TABLE (VEX_W_0FE6_P_2) },
5295     { VEX_W_TABLE (VEX_W_0FE6_P_3) },
5296   },
5297
5298   /* PREFIX_VEX_0FE7 */
5299   {
5300     { Bad_Opcode },
5301     { Bad_Opcode },
5302     { MOD_TABLE (MOD_VEX_0FE7_PREFIX_2) },
5303   },
5304
5305   /* PREFIX_VEX_0FE8 */
5306   {
5307     { Bad_Opcode },
5308     { Bad_Opcode },
5309     { VEX_W_TABLE (VEX_W_0FE8_P_2) },
5310   },
5311
5312   /* PREFIX_VEX_0FE9 */
5313   {
5314     { Bad_Opcode },
5315     { Bad_Opcode },
5316     { VEX_W_TABLE (VEX_W_0FE9_P_2) },
5317   },
5318
5319   /* PREFIX_VEX_0FEA */
5320   {
5321     { Bad_Opcode },
5322     { Bad_Opcode },
5323     { VEX_W_TABLE (VEX_W_0FEA_P_2) },
5324   },
5325
5326   /* PREFIX_VEX_0FEB */
5327   {
5328     { Bad_Opcode },
5329     { Bad_Opcode },
5330     { VEX_W_TABLE (VEX_W_0FEB_P_2) },
5331   },
5332
5333   /* PREFIX_VEX_0FEC */
5334   {
5335     { Bad_Opcode },
5336     { Bad_Opcode },
5337     { VEX_W_TABLE (VEX_W_0FEC_P_2) },
5338   },
5339
5340   /* PREFIX_VEX_0FED */
5341   {
5342     { Bad_Opcode },
5343     { Bad_Opcode },
5344     { VEX_W_TABLE (VEX_W_0FED_P_2) },
5345   },
5346
5347   /* PREFIX_VEX_0FEE */
5348   {
5349     { Bad_Opcode },
5350     { Bad_Opcode },
5351     { VEX_W_TABLE (VEX_W_0FEE_P_2) },
5352   },
5353
5354   /* PREFIX_VEX_0FEF */
5355   {
5356     { Bad_Opcode },
5357     { Bad_Opcode },
5358     { VEX_W_TABLE (VEX_W_0FEF_P_2) },
5359   },
5360
5361   /* PREFIX_VEX_0FF0 */
5362   {
5363     { Bad_Opcode },
5364     { Bad_Opcode },
5365     { Bad_Opcode },
5366     { MOD_TABLE (MOD_VEX_0FF0_PREFIX_3) },
5367   },
5368
5369   /* PREFIX_VEX_0FF1 */
5370   {
5371     { Bad_Opcode },
5372     { Bad_Opcode },
5373     { VEX_W_TABLE (VEX_W_0FF1_P_2) },
5374   },
5375
5376   /* PREFIX_VEX_0FF2 */
5377   {
5378     { Bad_Opcode },
5379     { Bad_Opcode },
5380     { VEX_W_TABLE (VEX_W_0FF2_P_2) },
5381   },
5382
5383   /* PREFIX_VEX_0FF3 */
5384   {
5385     { Bad_Opcode },
5386     { Bad_Opcode },
5387     { VEX_W_TABLE (VEX_W_0FF3_P_2) },
5388   },
5389
5390   /* PREFIX_VEX_0FF4 */
5391   {
5392     { Bad_Opcode },
5393     { Bad_Opcode },
5394     { VEX_W_TABLE (VEX_W_0FF4_P_2) },
5395   },
5396
5397   /* PREFIX_VEX_0FF5 */
5398   {
5399     { Bad_Opcode },
5400     { Bad_Opcode },
5401     { VEX_W_TABLE (VEX_W_0FF5_P_2) },
5402   },
5403
5404   /* PREFIX_VEX_0FF6 */
5405   {
5406     { Bad_Opcode },
5407     { Bad_Opcode },
5408     { VEX_W_TABLE (VEX_W_0FF6_P_2) },
5409   },
5410
5411   /* PREFIX_VEX_0FF7 */
5412   {
5413     { Bad_Opcode },
5414     { Bad_Opcode },
5415     { VEX_LEN_TABLE (VEX_LEN_0FF7_P_2) },
5416   },
5417
5418   /* PREFIX_VEX_0FF8 */
5419   {
5420     { Bad_Opcode },
5421     { Bad_Opcode },
5422     { VEX_W_TABLE (VEX_W_0FF8_P_2) },
5423   },
5424
5425   /* PREFIX_VEX_0FF9 */
5426   {
5427     { Bad_Opcode },
5428     { Bad_Opcode },
5429     { VEX_W_TABLE (VEX_W_0FF9_P_2) },
5430   },
5431
5432   /* PREFIX_VEX_0FFA */
5433   {
5434     { Bad_Opcode },
5435     { Bad_Opcode },
5436     { VEX_W_TABLE (VEX_W_0FFA_P_2) },
5437   },
5438
5439   /* PREFIX_VEX_0FFB */
5440   {
5441     { Bad_Opcode },
5442     { Bad_Opcode },
5443     { VEX_W_TABLE (VEX_W_0FFB_P_2) },
5444   },
5445
5446   /* PREFIX_VEX_0FFC */
5447   {
5448     { Bad_Opcode },
5449     { Bad_Opcode },
5450     { VEX_W_TABLE (VEX_W_0FFC_P_2) },
5451   },
5452
5453   /* PREFIX_VEX_0FFD */
5454   {
5455     { Bad_Opcode },
5456     { Bad_Opcode },
5457     { VEX_W_TABLE (VEX_W_0FFD_P_2) },
5458   },
5459
5460   /* PREFIX_VEX_0FFE */
5461   {
5462     { Bad_Opcode },
5463     { Bad_Opcode },
5464     { VEX_W_TABLE (VEX_W_0FFE_P_2) },
5465   },
5466
5467   /* PREFIX_VEX_0F3800 */
5468   {
5469     { Bad_Opcode },
5470     { Bad_Opcode },
5471     { VEX_W_TABLE (VEX_W_0F3800_P_2) },
5472   },
5473
5474   /* PREFIX_VEX_0F3801 */
5475   {
5476     { Bad_Opcode },
5477     { Bad_Opcode },
5478     { VEX_W_TABLE (VEX_W_0F3801_P_2) },
5479   },
5480
5481   /* PREFIX_VEX_0F3802 */
5482   {
5483     { Bad_Opcode },
5484     { Bad_Opcode },
5485     { VEX_W_TABLE (VEX_W_0F3802_P_2) },
5486   },
5487
5488   /* PREFIX_VEX_0F3803 */
5489   {
5490     { Bad_Opcode },
5491     { Bad_Opcode },
5492     { VEX_W_TABLE (VEX_W_0F3803_P_2) },
5493   },
5494
5495   /* PREFIX_VEX_0F3804 */
5496   {
5497     { Bad_Opcode },
5498     { Bad_Opcode },
5499     { VEX_W_TABLE (VEX_W_0F3804_P_2) },
5500   },
5501
5502   /* PREFIX_VEX_0F3805 */
5503   {
5504     { Bad_Opcode },
5505     { Bad_Opcode },
5506     { VEX_W_TABLE (VEX_W_0F3805_P_2) },
5507   },
5508
5509   /* PREFIX_VEX_0F3806 */
5510   {
5511     { Bad_Opcode },
5512     { Bad_Opcode },
5513     { VEX_W_TABLE (VEX_W_0F3806_P_2) },
5514   },
5515
5516   /* PREFIX_VEX_0F3807 */
5517   {
5518     { Bad_Opcode },
5519     { Bad_Opcode },
5520     { VEX_W_TABLE (VEX_W_0F3807_P_2) },
5521   },
5522
5523   /* PREFIX_VEX_0F3808 */
5524   {
5525     { Bad_Opcode },
5526     { Bad_Opcode },
5527     { VEX_W_TABLE (VEX_W_0F3808_P_2) },
5528   },
5529
5530   /* PREFIX_VEX_0F3809 */
5531   {
5532     { Bad_Opcode },
5533     { Bad_Opcode },
5534     { VEX_W_TABLE (VEX_W_0F3809_P_2) },
5535   },
5536
5537   /* PREFIX_VEX_0F380A */
5538   {
5539     { Bad_Opcode },
5540     { Bad_Opcode },
5541     { VEX_W_TABLE (VEX_W_0F380A_P_2) },
5542   },
5543
5544   /* PREFIX_VEX_0F380B */
5545   {
5546     { Bad_Opcode },
5547     { Bad_Opcode },
5548     { VEX_W_TABLE (VEX_W_0F380B_P_2) },
5549   },
5550
5551   /* PREFIX_VEX_0F380C */
5552   {
5553     { Bad_Opcode },
5554     { Bad_Opcode },
5555     { VEX_W_TABLE (VEX_W_0F380C_P_2) },
5556   },
5557
5558   /* PREFIX_VEX_0F380D */
5559   {
5560     { Bad_Opcode },
5561     { Bad_Opcode },
5562     { VEX_W_TABLE (VEX_W_0F380D_P_2) },
5563   },
5564
5565   /* PREFIX_VEX_0F380E */
5566   {
5567     { Bad_Opcode },
5568     { Bad_Opcode },
5569     { VEX_W_TABLE (VEX_W_0F380E_P_2) },
5570   },
5571
5572   /* PREFIX_VEX_0F380F */
5573   {
5574     { Bad_Opcode },
5575     { Bad_Opcode },
5576     { VEX_W_TABLE (VEX_W_0F380F_P_2) },
5577   },
5578
5579   /* PREFIX_VEX_0F3813 */
5580   {
5581     { Bad_Opcode },
5582     { Bad_Opcode },
5583     { "vcvtph2ps", { XM, EXxmmq }, 0 },
5584   },
5585
5586   /* PREFIX_VEX_0F3816 */
5587   {
5588     { Bad_Opcode },
5589     { Bad_Opcode },
5590     { VEX_LEN_TABLE (VEX_LEN_0F3816_P_2) },
5591   },
5592
5593   /* PREFIX_VEX_0F3817 */
5594   {
5595     { Bad_Opcode },
5596     { Bad_Opcode },
5597     { VEX_W_TABLE (VEX_W_0F3817_P_2) },
5598   },
5599
5600   /* PREFIX_VEX_0F3818 */
5601   {
5602     { Bad_Opcode },
5603     { Bad_Opcode },
5604     { VEX_W_TABLE (VEX_W_0F3818_P_2) },
5605   },
5606
5607   /* PREFIX_VEX_0F3819 */
5608   {
5609     { Bad_Opcode },
5610     { Bad_Opcode },
5611     { VEX_LEN_TABLE (VEX_LEN_0F3819_P_2) },
5612   },
5613
5614   /* PREFIX_VEX_0F381A */
5615   {
5616     { Bad_Opcode },
5617     { Bad_Opcode },
5618     { MOD_TABLE (MOD_VEX_0F381A_PREFIX_2) },
5619   },
5620
5621   /* PREFIX_VEX_0F381C */
5622   {
5623     { Bad_Opcode },
5624     { Bad_Opcode },
5625     { VEX_W_TABLE (VEX_W_0F381C_P_2) },
5626   },
5627
5628   /* PREFIX_VEX_0F381D */
5629   {
5630     { Bad_Opcode },
5631     { Bad_Opcode },
5632     { VEX_W_TABLE (VEX_W_0F381D_P_2) },
5633   },
5634
5635   /* PREFIX_VEX_0F381E */
5636   {
5637     { Bad_Opcode },
5638     { Bad_Opcode },
5639     { VEX_W_TABLE (VEX_W_0F381E_P_2) },
5640   },
5641
5642   /* PREFIX_VEX_0F3820 */
5643   {
5644     { Bad_Opcode },
5645     { Bad_Opcode },
5646     { VEX_W_TABLE (VEX_W_0F3820_P_2) },
5647   },
5648
5649   /* PREFIX_VEX_0F3821 */
5650   {
5651     { Bad_Opcode },
5652     { Bad_Opcode },
5653     { VEX_W_TABLE (VEX_W_0F3821_P_2) },
5654   },
5655
5656   /* PREFIX_VEX_0F3822 */
5657   {
5658     { Bad_Opcode },
5659     { Bad_Opcode },
5660     { VEX_W_TABLE (VEX_W_0F3822_P_2) },
5661   },
5662
5663   /* PREFIX_VEX_0F3823 */
5664   {
5665     { Bad_Opcode },
5666     { Bad_Opcode },
5667     { VEX_W_TABLE (VEX_W_0F3823_P_2) },
5668   },
5669
5670   /* PREFIX_VEX_0F3824 */
5671   {
5672     { Bad_Opcode },
5673     { Bad_Opcode },
5674     { VEX_W_TABLE (VEX_W_0F3824_P_2) },
5675   },
5676
5677   /* PREFIX_VEX_0F3825 */
5678   {
5679     { Bad_Opcode },
5680     { Bad_Opcode },
5681     { VEX_W_TABLE (VEX_W_0F3825_P_2) },
5682   },
5683
5684   /* PREFIX_VEX_0F3828 */
5685   {
5686     { Bad_Opcode },
5687     { Bad_Opcode },
5688     { VEX_W_TABLE (VEX_W_0F3828_P_2) },
5689   },
5690
5691   /* PREFIX_VEX_0F3829 */
5692   {
5693     { Bad_Opcode },
5694     { Bad_Opcode },
5695     { VEX_W_TABLE (VEX_W_0F3829_P_2) },
5696   },
5697
5698   /* PREFIX_VEX_0F382A */
5699   {
5700     { Bad_Opcode },
5701     { Bad_Opcode },
5702     { MOD_TABLE (MOD_VEX_0F382A_PREFIX_2) },
5703   },
5704
5705   /* PREFIX_VEX_0F382B */
5706   {
5707     { Bad_Opcode },
5708     { Bad_Opcode },
5709     { VEX_W_TABLE (VEX_W_0F382B_P_2) },
5710   },
5711
5712   /* PREFIX_VEX_0F382C */
5713   {
5714     { Bad_Opcode },
5715     { Bad_Opcode },
5716      { MOD_TABLE (MOD_VEX_0F382C_PREFIX_2) },
5717   },
5718
5719   /* PREFIX_VEX_0F382D */
5720   {
5721     { Bad_Opcode },
5722     { Bad_Opcode },
5723      { MOD_TABLE (MOD_VEX_0F382D_PREFIX_2) },
5724   },
5725
5726   /* PREFIX_VEX_0F382E */
5727   {
5728     { Bad_Opcode },
5729     { Bad_Opcode },
5730      { MOD_TABLE (MOD_VEX_0F382E_PREFIX_2) },
5731   },
5732
5733   /* PREFIX_VEX_0F382F */
5734   {
5735     { Bad_Opcode },
5736     { Bad_Opcode },
5737      { MOD_TABLE (MOD_VEX_0F382F_PREFIX_2) },
5738   },
5739
5740   /* PREFIX_VEX_0F3830 */
5741   {
5742     { Bad_Opcode },
5743     { Bad_Opcode },
5744     { VEX_W_TABLE (VEX_W_0F3830_P_2) },
5745   },
5746
5747   /* PREFIX_VEX_0F3831 */
5748   {
5749     { Bad_Opcode },
5750     { Bad_Opcode },
5751     { VEX_W_TABLE (VEX_W_0F3831_P_2) },
5752   },
5753
5754   /* PREFIX_VEX_0F3832 */
5755   {
5756     { Bad_Opcode },
5757     { Bad_Opcode },
5758     { VEX_W_TABLE (VEX_W_0F3832_P_2) },
5759   },
5760
5761   /* PREFIX_VEX_0F3833 */
5762   {
5763     { Bad_Opcode },
5764     { Bad_Opcode },
5765     { VEX_W_TABLE (VEX_W_0F3833_P_2) },
5766   },
5767
5768   /* PREFIX_VEX_0F3834 */
5769   {
5770     { Bad_Opcode },
5771     { Bad_Opcode },
5772     { VEX_W_TABLE (VEX_W_0F3834_P_2) },
5773   },
5774
5775   /* PREFIX_VEX_0F3835 */
5776   {
5777     { Bad_Opcode },
5778     { Bad_Opcode },
5779     { VEX_W_TABLE (VEX_W_0F3835_P_2) },
5780   },
5781
5782   /* PREFIX_VEX_0F3836 */
5783   {
5784     { Bad_Opcode },
5785     { Bad_Opcode },
5786     { VEX_LEN_TABLE (VEX_LEN_0F3836_P_2) },
5787   },
5788
5789   /* PREFIX_VEX_0F3837 */
5790   {
5791     { Bad_Opcode },
5792     { Bad_Opcode },
5793     { VEX_W_TABLE (VEX_W_0F3837_P_2) },
5794   },
5795
5796   /* PREFIX_VEX_0F3838 */
5797   {
5798     { Bad_Opcode },
5799     { Bad_Opcode },
5800     { VEX_W_TABLE (VEX_W_0F3838_P_2) },
5801   },
5802
5803   /* PREFIX_VEX_0F3839 */
5804   {
5805     { Bad_Opcode },
5806     { Bad_Opcode },
5807     { VEX_W_TABLE (VEX_W_0F3839_P_2) },
5808   },
5809
5810   /* PREFIX_VEX_0F383A */
5811   {
5812     { Bad_Opcode },
5813     { Bad_Opcode },
5814     { VEX_W_TABLE (VEX_W_0F383A_P_2) },
5815   },
5816
5817   /* PREFIX_VEX_0F383B */
5818   {
5819     { Bad_Opcode },
5820     { Bad_Opcode },
5821     { VEX_W_TABLE (VEX_W_0F383B_P_2) },
5822   },
5823
5824   /* PREFIX_VEX_0F383C */
5825   {
5826     { Bad_Opcode },
5827     { Bad_Opcode },
5828     { VEX_W_TABLE (VEX_W_0F383C_P_2) },
5829   },
5830
5831   /* PREFIX_VEX_0F383D */
5832   {
5833     { Bad_Opcode },
5834     { Bad_Opcode },
5835     { VEX_W_TABLE (VEX_W_0F383D_P_2) },
5836   },
5837
5838   /* PREFIX_VEX_0F383E */
5839   {
5840     { Bad_Opcode },
5841     { Bad_Opcode },
5842     { VEX_W_TABLE (VEX_W_0F383E_P_2) },
5843   },
5844
5845   /* PREFIX_VEX_0F383F */
5846   {
5847     { Bad_Opcode },
5848     { Bad_Opcode },
5849     { VEX_W_TABLE (VEX_W_0F383F_P_2) },
5850   },
5851
5852   /* PREFIX_VEX_0F3840 */
5853   {
5854     { Bad_Opcode },
5855     { Bad_Opcode },
5856     { VEX_W_TABLE (VEX_W_0F3840_P_2) },
5857   },
5858
5859   /* PREFIX_VEX_0F3841 */
5860   {
5861     { Bad_Opcode },
5862     { Bad_Opcode },
5863     { VEX_LEN_TABLE (VEX_LEN_0F3841_P_2) },
5864   },
5865
5866   /* PREFIX_VEX_0F3845 */
5867   {
5868     { Bad_Opcode },
5869     { Bad_Opcode },
5870     { "vpsrlv%LW", { XM, Vex, EXx }, 0 },
5871   },
5872
5873   /* PREFIX_VEX_0F3846 */
5874   {
5875     { Bad_Opcode },
5876     { Bad_Opcode },
5877     { VEX_W_TABLE (VEX_W_0F3846_P_2) },
5878   },
5879
5880   /* PREFIX_VEX_0F3847 */
5881   {
5882     { Bad_Opcode },
5883     { Bad_Opcode },
5884     { "vpsllv%LW", { XM, Vex, EXx }, 0 },
5885   },
5886
5887   /* PREFIX_VEX_0F3858 */
5888   {
5889     { Bad_Opcode },
5890     { Bad_Opcode },
5891     { VEX_W_TABLE (VEX_W_0F3858_P_2) },
5892   },
5893
5894   /* PREFIX_VEX_0F3859 */
5895   {
5896     { Bad_Opcode },
5897     { Bad_Opcode },
5898     { VEX_W_TABLE (VEX_W_0F3859_P_2) },
5899   },
5900
5901   /* PREFIX_VEX_0F385A */
5902   {
5903     { Bad_Opcode },
5904     { Bad_Opcode },
5905     { MOD_TABLE (MOD_VEX_0F385A_PREFIX_2) },
5906   },
5907
5908   /* PREFIX_VEX_0F3878 */
5909   {
5910     { Bad_Opcode },
5911     { Bad_Opcode },
5912     { VEX_W_TABLE (VEX_W_0F3878_P_2) },
5913   },
5914
5915   /* PREFIX_VEX_0F3879 */
5916   {
5917     { Bad_Opcode },
5918     { Bad_Opcode },
5919     { VEX_W_TABLE (VEX_W_0F3879_P_2) },
5920   },
5921
5922   /* PREFIX_VEX_0F388C */
5923   {
5924     { Bad_Opcode },
5925     { Bad_Opcode },
5926     { MOD_TABLE (MOD_VEX_0F388C_PREFIX_2) },
5927   },
5928
5929   /* PREFIX_VEX_0F388E */
5930   {
5931     { Bad_Opcode },
5932     { Bad_Opcode },
5933     { MOD_TABLE (MOD_VEX_0F388E_PREFIX_2) },
5934   },
5935
5936   /* PREFIX_VEX_0F3890 */
5937   {
5938     { Bad_Opcode },
5939     { Bad_Opcode },
5940     { "vpgatherd%LW", { XM, MVexVSIBDWpX, Vex }, 0 },
5941   },
5942
5943   /* PREFIX_VEX_0F3891 */
5944   {
5945     { Bad_Opcode },
5946     { Bad_Opcode },
5947     { "vpgatherq%LW", { XMGatherQ, MVexVSIBQWpX, VexGatherQ }, 0 },
5948   },
5949
5950   /* PREFIX_VEX_0F3892 */
5951   {
5952     { Bad_Opcode },
5953     { Bad_Opcode },
5954     { "vgatherdp%XW", { XM, MVexVSIBDWpX, Vex }, 0 },
5955   },
5956
5957   /* PREFIX_VEX_0F3893 */
5958   {
5959     { Bad_Opcode },
5960     { Bad_Opcode },
5961     { "vgatherqp%XW", { XMGatherQ, MVexVSIBQWpX, VexGatherQ }, 0 },
5962   },
5963
5964   /* PREFIX_VEX_0F3896 */
5965   {
5966     { Bad_Opcode },
5967     { Bad_Opcode },
5968     { "vfmaddsub132p%XW", { XM, Vex, EXx }, 0 },
5969   },
5970
5971   /* PREFIX_VEX_0F3897 */
5972   {
5973     { Bad_Opcode },
5974     { Bad_Opcode },
5975     { "vfmsubadd132p%XW", { XM, Vex, EXx }, 0 },
5976   },
5977
5978   /* PREFIX_VEX_0F3898 */
5979   {
5980     { Bad_Opcode },
5981     { Bad_Opcode },
5982     { "vfmadd132p%XW", { XM, Vex, EXx }, 0 },
5983   },
5984
5985   /* PREFIX_VEX_0F3899 */
5986   {
5987     { Bad_Opcode },
5988     { Bad_Opcode },
5989     { "vfmadd132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
5990   },
5991
5992   /* PREFIX_VEX_0F389A */
5993   {
5994     { Bad_Opcode },
5995     { Bad_Opcode },
5996     { "vfmsub132p%XW", { XM, Vex, EXx }, 0 },
5997   },
5998
5999   /* PREFIX_VEX_0F389B */
6000   {
6001     { Bad_Opcode },
6002     { Bad_Opcode },
6003     { "vfmsub132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6004   },
6005
6006   /* PREFIX_VEX_0F389C */
6007   {
6008     { Bad_Opcode },
6009     { Bad_Opcode },
6010     { "vfnmadd132p%XW", { XM, Vex, EXx }, 0 },
6011   },
6012
6013   /* PREFIX_VEX_0F389D */
6014   {
6015     { Bad_Opcode },
6016     { Bad_Opcode },
6017     { "vfnmadd132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6018   },
6019
6020   /* PREFIX_VEX_0F389E */
6021   {
6022     { Bad_Opcode },
6023     { Bad_Opcode },
6024     { "vfnmsub132p%XW", { XM, Vex, EXx }, 0 },
6025   },
6026
6027   /* PREFIX_VEX_0F389F */
6028   {
6029     { Bad_Opcode },
6030     { Bad_Opcode },
6031     { "vfnmsub132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6032   },
6033
6034   /* PREFIX_VEX_0F38A6 */
6035   {
6036     { Bad_Opcode },
6037     { Bad_Opcode },
6038     { "vfmaddsub213p%XW", { XM, Vex, EXx }, 0 },
6039     { Bad_Opcode },
6040   },
6041
6042   /* PREFIX_VEX_0F38A7 */
6043   {
6044     { Bad_Opcode },
6045     { Bad_Opcode },
6046     { "vfmsubadd213p%XW", { XM, Vex, EXx }, 0 },
6047   },
6048
6049   /* PREFIX_VEX_0F38A8 */
6050   {
6051     { Bad_Opcode },
6052     { Bad_Opcode },
6053     { "vfmadd213p%XW", { XM, Vex, EXx }, 0 },
6054   },
6055
6056   /* PREFIX_VEX_0F38A9 */
6057   {
6058     { Bad_Opcode },
6059     { Bad_Opcode },
6060     { "vfmadd213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6061   },
6062
6063   /* PREFIX_VEX_0F38AA */
6064   {
6065     { Bad_Opcode },
6066     { Bad_Opcode },
6067     { "vfmsub213p%XW", { XM, Vex, EXx }, 0 },
6068   },
6069
6070   /* PREFIX_VEX_0F38AB */
6071   {
6072     { Bad_Opcode },
6073     { Bad_Opcode },
6074     { "vfmsub213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6075   },
6076
6077   /* PREFIX_VEX_0F38AC */
6078   {
6079     { Bad_Opcode },
6080     { Bad_Opcode },
6081     { "vfnmadd213p%XW", { XM, Vex, EXx }, 0 },
6082   },
6083
6084   /* PREFIX_VEX_0F38AD */
6085   {
6086     { Bad_Opcode },
6087     { Bad_Opcode },
6088     { "vfnmadd213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6089   },
6090
6091   /* PREFIX_VEX_0F38AE */
6092   {
6093     { Bad_Opcode },
6094     { Bad_Opcode },
6095     { "vfnmsub213p%XW", { XM, Vex, EXx }, 0 },
6096   },
6097
6098   /* PREFIX_VEX_0F38AF */
6099   {
6100     { Bad_Opcode },
6101     { Bad_Opcode },
6102     { "vfnmsub213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6103   },
6104
6105   /* PREFIX_VEX_0F38B6 */
6106   {
6107     { Bad_Opcode },
6108     { Bad_Opcode },
6109     { "vfmaddsub231p%XW", { XM, Vex, EXx }, 0 },
6110   },
6111
6112   /* PREFIX_VEX_0F38B7 */
6113   {
6114     { Bad_Opcode },
6115     { Bad_Opcode },
6116     { "vfmsubadd231p%XW", { XM, Vex, EXx }, 0 },
6117   },
6118
6119   /* PREFIX_VEX_0F38B8 */
6120   {
6121     { Bad_Opcode },
6122     { Bad_Opcode },
6123     { "vfmadd231p%XW", { XM, Vex, EXx }, 0 },
6124   },
6125
6126   /* PREFIX_VEX_0F38B9 */
6127   {
6128     { Bad_Opcode },
6129     { Bad_Opcode },
6130     { "vfmadd231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6131   },
6132
6133   /* PREFIX_VEX_0F38BA */
6134   {
6135     { Bad_Opcode },
6136     { Bad_Opcode },
6137     { "vfmsub231p%XW", { XM, Vex, EXx }, 0 },
6138   },
6139
6140   /* PREFIX_VEX_0F38BB */
6141   {
6142     { Bad_Opcode },
6143     { Bad_Opcode },
6144     { "vfmsub231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6145   },
6146
6147   /* PREFIX_VEX_0F38BC */
6148   {
6149     { Bad_Opcode },
6150     { Bad_Opcode },
6151     { "vfnmadd231p%XW", { XM, Vex, EXx }, 0 },
6152   },
6153
6154   /* PREFIX_VEX_0F38BD */
6155   {
6156     { Bad_Opcode },
6157     { Bad_Opcode },
6158     { "vfnmadd231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6159   },
6160
6161   /* PREFIX_VEX_0F38BE */
6162   {
6163     { Bad_Opcode },
6164     { Bad_Opcode },
6165     { "vfnmsub231p%XW", { XM, Vex, EXx }, 0 },
6166   },
6167
6168   /* PREFIX_VEX_0F38BF */
6169   {
6170     { Bad_Opcode },
6171     { Bad_Opcode },
6172     { "vfnmsub231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6173   },
6174
6175   /* PREFIX_VEX_0F38DB */
6176   {
6177     { Bad_Opcode },
6178     { Bad_Opcode },
6179     { VEX_LEN_TABLE (VEX_LEN_0F38DB_P_2) },
6180   },
6181
6182   /* PREFIX_VEX_0F38DC */
6183   {
6184     { Bad_Opcode },
6185     { Bad_Opcode },
6186     { VEX_LEN_TABLE (VEX_LEN_0F38DC_P_2) },
6187   },
6188
6189   /* PREFIX_VEX_0F38DD */
6190   {
6191     { Bad_Opcode },
6192     { Bad_Opcode },
6193     { VEX_LEN_TABLE (VEX_LEN_0F38DD_P_2) },
6194   },
6195
6196   /* PREFIX_VEX_0F38DE */
6197   {
6198     { Bad_Opcode },
6199     { Bad_Opcode },
6200     { VEX_LEN_TABLE (VEX_LEN_0F38DE_P_2) },
6201   },
6202
6203   /* PREFIX_VEX_0F38DF */
6204   {
6205     { Bad_Opcode },
6206     { Bad_Opcode },
6207     { VEX_LEN_TABLE (VEX_LEN_0F38DF_P_2) },
6208   },
6209
6210   /* PREFIX_VEX_0F38F2 */
6211   {
6212     { VEX_LEN_TABLE (VEX_LEN_0F38F2_P_0) },
6213   },
6214
6215   /* PREFIX_VEX_0F38F3_REG_1 */
6216   {
6217     { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_1_P_0) },
6218   },
6219
6220   /* PREFIX_VEX_0F38F3_REG_2 */
6221   {
6222     { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_2_P_0) },
6223   },
6224
6225   /* PREFIX_VEX_0F38F3_REG_3 */
6226   {
6227     { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_3_P_0) },
6228   },
6229
6230   /* PREFIX_VEX_0F38F5 */
6231   {
6232     { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_0) },
6233     { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_1) },
6234     { Bad_Opcode },
6235     { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_3) },
6236   },
6237
6238   /* PREFIX_VEX_0F38F6 */
6239   {
6240     { Bad_Opcode },
6241     { Bad_Opcode },
6242     { Bad_Opcode },
6243     { VEX_LEN_TABLE (VEX_LEN_0F38F6_P_3) },
6244   },
6245
6246   /* PREFIX_VEX_0F38F7 */
6247   {
6248     { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_0) },
6249     { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_1) },
6250     { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_2) },
6251     { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_3) },
6252   },
6253
6254   /* PREFIX_VEX_0F3A00 */
6255   {
6256     { Bad_Opcode },
6257     { Bad_Opcode },
6258     { VEX_LEN_TABLE (VEX_LEN_0F3A00_P_2) },
6259   },
6260
6261   /* PREFIX_VEX_0F3A01 */
6262   {
6263     { Bad_Opcode },
6264     { Bad_Opcode },
6265     { VEX_LEN_TABLE (VEX_LEN_0F3A01_P_2) },
6266   },
6267
6268   /* PREFIX_VEX_0F3A02 */
6269   {
6270     { Bad_Opcode },
6271     { Bad_Opcode },
6272     { VEX_W_TABLE (VEX_W_0F3A02_P_2) },
6273   },
6274
6275   /* PREFIX_VEX_0F3A04 */
6276   {
6277     { Bad_Opcode },
6278     { Bad_Opcode },
6279     { VEX_W_TABLE (VEX_W_0F3A04_P_2) },
6280   },
6281
6282   /* PREFIX_VEX_0F3A05 */
6283   {
6284     { Bad_Opcode },
6285     { Bad_Opcode },
6286     { VEX_W_TABLE (VEX_W_0F3A05_P_2) },
6287   },
6288
6289   /* PREFIX_VEX_0F3A06 */
6290   {
6291     { Bad_Opcode },
6292     { Bad_Opcode },
6293     { VEX_LEN_TABLE (VEX_LEN_0F3A06_P_2) },
6294   },
6295
6296   /* PREFIX_VEX_0F3A08 */
6297   {
6298     { Bad_Opcode },
6299     { Bad_Opcode },
6300     { VEX_W_TABLE (VEX_W_0F3A08_P_2) },
6301   },
6302
6303   /* PREFIX_VEX_0F3A09 */
6304   {
6305     { Bad_Opcode },
6306     { Bad_Opcode },
6307     { VEX_W_TABLE (VEX_W_0F3A09_P_2) },
6308   },
6309
6310   /* PREFIX_VEX_0F3A0A */
6311   {
6312     { Bad_Opcode },
6313     { Bad_Opcode },
6314     { VEX_LEN_TABLE (VEX_LEN_0F3A0A_P_2) },
6315   },
6316
6317   /* PREFIX_VEX_0F3A0B */
6318   {
6319     { Bad_Opcode },
6320     { Bad_Opcode },
6321     { VEX_LEN_TABLE (VEX_LEN_0F3A0B_P_2) },
6322   },
6323
6324   /* PREFIX_VEX_0F3A0C */
6325   {
6326     { Bad_Opcode },
6327     { Bad_Opcode },
6328     { VEX_W_TABLE (VEX_W_0F3A0C_P_2) },
6329   },
6330
6331   /* PREFIX_VEX_0F3A0D */
6332   {
6333     { Bad_Opcode },
6334     { Bad_Opcode },
6335     { VEX_W_TABLE (VEX_W_0F3A0D_P_2) },
6336   },
6337
6338   /* PREFIX_VEX_0F3A0E */
6339   {
6340     { Bad_Opcode },
6341     { Bad_Opcode },
6342     { VEX_W_TABLE (VEX_W_0F3A0E_P_2) },
6343   },
6344
6345   /* PREFIX_VEX_0F3A0F */
6346   {
6347     { Bad_Opcode },
6348     { Bad_Opcode },
6349     { VEX_W_TABLE (VEX_W_0F3A0F_P_2) },
6350   },
6351
6352   /* PREFIX_VEX_0F3A14 */
6353   {
6354     { Bad_Opcode },
6355     { Bad_Opcode },
6356     { VEX_LEN_TABLE (VEX_LEN_0F3A14_P_2) },
6357   },
6358
6359   /* PREFIX_VEX_0F3A15 */
6360   {
6361     { Bad_Opcode },
6362     { Bad_Opcode },
6363     { VEX_LEN_TABLE (VEX_LEN_0F3A15_P_2) },
6364   },
6365
6366   /* PREFIX_VEX_0F3A16 */
6367   {
6368     { Bad_Opcode },
6369     { Bad_Opcode },
6370     { VEX_LEN_TABLE (VEX_LEN_0F3A16_P_2) },
6371   },
6372
6373   /* PREFIX_VEX_0F3A17 */
6374   {
6375     { Bad_Opcode },
6376     { Bad_Opcode },
6377     { VEX_LEN_TABLE (VEX_LEN_0F3A17_P_2) },
6378   },
6379
6380   /* PREFIX_VEX_0F3A18 */
6381   {
6382     { Bad_Opcode },
6383     { Bad_Opcode },
6384     { VEX_LEN_TABLE (VEX_LEN_0F3A18_P_2) },
6385   },
6386
6387   /* PREFIX_VEX_0F3A19 */
6388   {
6389     { Bad_Opcode },
6390     { Bad_Opcode },
6391     { VEX_LEN_TABLE (VEX_LEN_0F3A19_P_2) },
6392   },
6393
6394   /* PREFIX_VEX_0F3A1D */
6395   {
6396     { Bad_Opcode },
6397     { Bad_Opcode },
6398     { "vcvtps2ph", { EXxmmq, XM, Ib }, 0 },
6399   },
6400
6401   /* PREFIX_VEX_0F3A20 */
6402   {
6403     { Bad_Opcode },
6404     { Bad_Opcode },
6405     { VEX_LEN_TABLE (VEX_LEN_0F3A20_P_2) },
6406   },
6407
6408   /* PREFIX_VEX_0F3A21 */
6409   {
6410     { Bad_Opcode },
6411     { Bad_Opcode },
6412     { VEX_LEN_TABLE (VEX_LEN_0F3A21_P_2) },
6413   },
6414
6415   /* PREFIX_VEX_0F3A22 */
6416   {
6417     { Bad_Opcode },
6418     { Bad_Opcode },
6419     { VEX_LEN_TABLE (VEX_LEN_0F3A22_P_2) },
6420   },
6421
6422   /* PREFIX_VEX_0F3A30 */
6423   {
6424     { Bad_Opcode },
6425     { Bad_Opcode },
6426     { VEX_LEN_TABLE (VEX_LEN_0F3A30_P_2) },
6427   },
6428
6429   /* PREFIX_VEX_0F3A31 */
6430   {
6431     { Bad_Opcode },
6432     { Bad_Opcode },
6433     { VEX_LEN_TABLE (VEX_LEN_0F3A31_P_2) },
6434   },
6435
6436   /* PREFIX_VEX_0F3A32 */
6437   {
6438     { Bad_Opcode },
6439     { Bad_Opcode },
6440     { VEX_LEN_TABLE (VEX_LEN_0F3A32_P_2) },
6441   },
6442
6443   /* PREFIX_VEX_0F3A33 */
6444   {
6445     { Bad_Opcode },
6446     { Bad_Opcode },
6447     { VEX_LEN_TABLE (VEX_LEN_0F3A33_P_2) },
6448   },
6449
6450   /* PREFIX_VEX_0F3A38 */
6451   {
6452     { Bad_Opcode },
6453     { Bad_Opcode },
6454     { VEX_LEN_TABLE (VEX_LEN_0F3A38_P_2) },
6455   },
6456
6457   /* PREFIX_VEX_0F3A39 */
6458   {
6459     { Bad_Opcode },
6460     { Bad_Opcode },
6461     { VEX_LEN_TABLE (VEX_LEN_0F3A39_P_2) },
6462   },
6463
6464   /* PREFIX_VEX_0F3A40 */
6465   {
6466     { Bad_Opcode },
6467     { Bad_Opcode },
6468     { VEX_W_TABLE (VEX_W_0F3A40_P_2) },
6469   },
6470
6471   /* PREFIX_VEX_0F3A41 */
6472   {
6473     { Bad_Opcode },
6474     { Bad_Opcode },
6475     { VEX_LEN_TABLE (VEX_LEN_0F3A41_P_2) },
6476   },
6477
6478   /* PREFIX_VEX_0F3A42 */
6479   {
6480     { Bad_Opcode },
6481     { Bad_Opcode },
6482     { VEX_W_TABLE (VEX_W_0F3A42_P_2) },
6483   },
6484
6485   /* PREFIX_VEX_0F3A44 */
6486   {
6487     { Bad_Opcode },
6488     { Bad_Opcode },
6489     { VEX_LEN_TABLE (VEX_LEN_0F3A44_P_2) },
6490   },
6491
6492   /* PREFIX_VEX_0F3A46 */
6493   {
6494     { Bad_Opcode },
6495     { Bad_Opcode },
6496     { VEX_LEN_TABLE (VEX_LEN_0F3A46_P_2) },
6497   },
6498
6499   /* PREFIX_VEX_0F3A48 */
6500   {
6501     { Bad_Opcode },
6502     { Bad_Opcode },
6503     { VEX_W_TABLE (VEX_W_0F3A48_P_2) },
6504   },
6505
6506   /* PREFIX_VEX_0F3A49 */
6507   {
6508     { Bad_Opcode },
6509     { Bad_Opcode },
6510     { VEX_W_TABLE (VEX_W_0F3A49_P_2) },
6511   },
6512
6513   /* PREFIX_VEX_0F3A4A */
6514   {
6515     { Bad_Opcode },
6516     { Bad_Opcode },
6517     { VEX_W_TABLE (VEX_W_0F3A4A_P_2) },
6518   },
6519
6520   /* PREFIX_VEX_0F3A4B */
6521   {
6522     { Bad_Opcode },
6523     { Bad_Opcode },
6524     { VEX_W_TABLE (VEX_W_0F3A4B_P_2) },
6525   },
6526
6527   /* PREFIX_VEX_0F3A4C */
6528   {
6529     { Bad_Opcode },
6530     { Bad_Opcode },
6531     { VEX_W_TABLE (VEX_W_0F3A4C_P_2) },
6532   },
6533
6534   /* PREFIX_VEX_0F3A5C */
6535   {
6536     { Bad_Opcode },
6537     { Bad_Opcode },
6538     { "vfmaddsubps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
6539   },
6540
6541   /* PREFIX_VEX_0F3A5D */
6542   {
6543     { Bad_Opcode },
6544     { Bad_Opcode },
6545     { "vfmaddsubpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
6546   },
6547
6548   /* PREFIX_VEX_0F3A5E */
6549   {
6550     { Bad_Opcode },
6551     { Bad_Opcode },
6552     { "vfmsubaddps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
6553   },
6554
6555   /* PREFIX_VEX_0F3A5F */
6556   {
6557     { Bad_Opcode },
6558     { Bad_Opcode },
6559     { "vfmsubaddpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
6560   },
6561
6562   /* PREFIX_VEX_0F3A60 */
6563   {
6564     { Bad_Opcode },
6565     { Bad_Opcode },
6566     { VEX_LEN_TABLE (VEX_LEN_0F3A60_P_2) },
6567     { Bad_Opcode },
6568   },
6569
6570   /* PREFIX_VEX_0F3A61 */
6571   {
6572     { Bad_Opcode },
6573     { Bad_Opcode },
6574     { VEX_LEN_TABLE (VEX_LEN_0F3A61_P_2) },
6575   },
6576
6577   /* PREFIX_VEX_0F3A62 */
6578   {
6579     { Bad_Opcode },
6580     { Bad_Opcode },
6581     { VEX_LEN_TABLE (VEX_LEN_0F3A62_P_2) },
6582   },
6583
6584   /* PREFIX_VEX_0F3A63 */
6585   {
6586     { Bad_Opcode },
6587     { Bad_Opcode },
6588     { VEX_LEN_TABLE (VEX_LEN_0F3A63_P_2) },
6589   },
6590
6591   /* PREFIX_VEX_0F3A68 */
6592   {
6593     { Bad_Opcode },
6594     { Bad_Opcode },
6595     { "vfmaddps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
6596   },
6597
6598   /* PREFIX_VEX_0F3A69 */
6599   {
6600     { Bad_Opcode },
6601     { Bad_Opcode },
6602     { "vfmaddpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
6603   },
6604
6605   /* PREFIX_VEX_0F3A6A */
6606   {
6607     { Bad_Opcode },
6608     { Bad_Opcode },
6609     { VEX_LEN_TABLE (VEX_LEN_0F3A6A_P_2) },
6610   },
6611
6612   /* PREFIX_VEX_0F3A6B */
6613   {
6614     { Bad_Opcode },
6615     { Bad_Opcode },
6616     { VEX_LEN_TABLE (VEX_LEN_0F3A6B_P_2) },
6617   },
6618
6619   /* PREFIX_VEX_0F3A6C */
6620   {
6621     { Bad_Opcode },
6622     { Bad_Opcode },
6623     { "vfmsubps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
6624   },
6625
6626   /* PREFIX_VEX_0F3A6D */
6627   {
6628     { Bad_Opcode },
6629     { Bad_Opcode },
6630     { "vfmsubpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
6631   },
6632
6633   /* PREFIX_VEX_0F3A6E */
6634   {
6635     { Bad_Opcode },
6636     { Bad_Opcode },
6637     { VEX_LEN_TABLE (VEX_LEN_0F3A6E_P_2) },
6638   },
6639
6640   /* PREFIX_VEX_0F3A6F */
6641   {
6642     { Bad_Opcode },
6643     { Bad_Opcode },
6644     { VEX_LEN_TABLE (VEX_LEN_0F3A6F_P_2) },
6645   },
6646
6647   /* PREFIX_VEX_0F3A78 */
6648   {
6649     { Bad_Opcode },
6650     { Bad_Opcode },
6651     { "vfnmaddps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
6652   },
6653
6654   /* PREFIX_VEX_0F3A79 */
6655   {
6656     { Bad_Opcode },
6657     { Bad_Opcode },
6658     { "vfnmaddpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
6659   },
6660
6661   /* PREFIX_VEX_0F3A7A */
6662   {
6663     { Bad_Opcode },
6664     { Bad_Opcode },
6665     { VEX_LEN_TABLE (VEX_LEN_0F3A7A_P_2) },
6666   },
6667
6668   /* PREFIX_VEX_0F3A7B */
6669   {
6670     { Bad_Opcode },
6671     { Bad_Opcode },
6672     { VEX_LEN_TABLE (VEX_LEN_0F3A7B_P_2) },
6673   },
6674
6675   /* PREFIX_VEX_0F3A7C */
6676   {
6677     { Bad_Opcode },
6678     { Bad_Opcode },
6679     { "vfnmsubps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
6680     { Bad_Opcode },
6681   },
6682
6683   /* PREFIX_VEX_0F3A7D */
6684   {
6685     { Bad_Opcode },
6686     { Bad_Opcode },
6687     { "vfnmsubpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
6688   },
6689
6690   /* PREFIX_VEX_0F3A7E */
6691   {
6692     { Bad_Opcode },
6693     { Bad_Opcode },
6694     { VEX_LEN_TABLE (VEX_LEN_0F3A7E_P_2) },
6695   },
6696
6697   /* PREFIX_VEX_0F3A7F */
6698   {
6699     { Bad_Opcode },
6700     { Bad_Opcode },
6701     { VEX_LEN_TABLE (VEX_LEN_0F3A7F_P_2) },
6702   },
6703
6704   /* PREFIX_VEX_0F3ADF */
6705   {
6706     { Bad_Opcode },
6707     { Bad_Opcode },
6708     { VEX_LEN_TABLE (VEX_LEN_0F3ADF_P_2) },
6709   },
6710
6711   /* PREFIX_VEX_0F3AF0 */
6712   {
6713     { Bad_Opcode },
6714     { Bad_Opcode },
6715     { Bad_Opcode },
6716     { VEX_LEN_TABLE (VEX_LEN_0F3AF0_P_3) },
6717   },
6718
6719 #define NEED_PREFIX_TABLE
6720 #include "i386-dis-evex.h"
6721 #undef NEED_PREFIX_TABLE
6722 };
6723
6724 static const struct dis386 x86_64_table[][2] = {
6725   /* X86_64_06 */
6726   {
6727     { "pushP", { es }, 0 },
6728   },
6729
6730   /* X86_64_07 */
6731   {
6732     { "popP", { es }, 0 },
6733   },
6734
6735   /* X86_64_0D */
6736   {
6737     { "pushP", { cs }, 0 },
6738   },
6739
6740   /* X86_64_16 */
6741   {
6742     { "pushP", { ss }, 0 },
6743   },
6744
6745   /* X86_64_17 */
6746   {
6747     { "popP", { ss }, 0 },
6748   },
6749
6750   /* X86_64_1E */
6751   {
6752     { "pushP", { ds }, 0 },
6753   },
6754
6755   /* X86_64_1F */
6756   {
6757     { "popP", { ds }, 0 },
6758   },
6759
6760   /* X86_64_27 */
6761   {
6762     { "daa", { XX }, 0 },
6763   },
6764
6765   /* X86_64_2F */
6766   {
6767     { "das", { XX }, 0 },
6768   },
6769
6770   /* X86_64_37 */
6771   {
6772     { "aaa", { XX }, 0 },
6773   },
6774
6775   /* X86_64_3F */
6776   {
6777     { "aas", { XX }, 0 },
6778   },
6779
6780   /* X86_64_60 */
6781   {
6782     { "pushaP", { XX }, 0 },
6783   },
6784
6785   /* X86_64_61 */
6786   {
6787     { "popaP", { XX }, 0 },
6788   },
6789
6790   /* X86_64_62 */
6791   {
6792     { MOD_TABLE (MOD_62_32BIT) },
6793     { EVEX_TABLE (EVEX_0F) },
6794   },
6795
6796   /* X86_64_63 */
6797   {
6798     { "arpl", { Ew, Gw }, 0 },
6799     { "movs{lq|xd}", { Gv, Ed }, 0 },
6800   },
6801
6802   /* X86_64_6D */
6803   {
6804     { "ins{R|}", { Yzr, indirDX }, 0 },
6805     { "ins{G|}", { Yzr, indirDX }, 0 },
6806   },
6807
6808   /* X86_64_6F */
6809   {
6810     { "outs{R|}", { indirDXr, Xz }, 0 },
6811     { "outs{G|}", { indirDXr, Xz }, 0 },
6812   },
6813
6814   /* X86_64_9A */
6815   {
6816     { "Jcall{T|}", { Ap }, 0 },
6817   },
6818
6819   /* X86_64_C4 */
6820   {
6821     { MOD_TABLE (MOD_C4_32BIT) },
6822     { VEX_C4_TABLE (VEX_0F) },
6823   },
6824
6825   /* X86_64_C5 */
6826   {
6827     { MOD_TABLE (MOD_C5_32BIT) },
6828     { VEX_C5_TABLE (VEX_0F) },
6829   },
6830
6831   /* X86_64_CE */
6832   {
6833     { "into", { XX }, 0 },
6834   },
6835
6836   /* X86_64_D4 */
6837   {
6838     { "aam", { Ib }, 0 },
6839   },
6840
6841   /* X86_64_D5 */
6842   {
6843     { "aad", { Ib }, 0 },
6844   },
6845
6846   /* X86_64_E8 */
6847   {
6848     { "callP",          { Jv, BND }, 0 },
6849     { "call@",          { Jv, BND }, 0 }
6850   },
6851
6852   /* X86_64_E9 */
6853   {
6854     { "jmpP",           { Jv, BND }, 0 },
6855     { "jmp@",           { Jv, BND }, 0 }
6856   },
6857
6858   /* X86_64_EA */
6859   {
6860     { "Jjmp{T|}", { Ap }, 0 },
6861   },
6862
6863   /* X86_64_0F01_REG_0 */
6864   {
6865     { "sgdt{Q|IQ}", { M }, 0 },
6866     { "sgdt", { M }, 0 },
6867   },
6868
6869   /* X86_64_0F01_REG_1 */
6870   {
6871     { "sidt{Q|IQ}", { M }, 0 },
6872     { "sidt", { M }, 0 },
6873   },
6874
6875   /* X86_64_0F01_REG_2 */
6876   {
6877     { "lgdt{Q|Q}", { M }, 0 },
6878     { "lgdt", { M }, 0 },
6879   },
6880
6881   /* X86_64_0F01_REG_3 */
6882   {
6883     { "lidt{Q|Q}", { M }, 0 },
6884     { "lidt", { M }, 0 },
6885   },
6886 };
6887
6888 static const struct dis386 three_byte_table[][256] = {
6889
6890   /* THREE_BYTE_0F38 */
6891   {
6892     /* 00 */
6893     { "pshufb",         { MX, EM }, PREFIX_OPCODE },
6894     { "phaddw",         { MX, EM }, PREFIX_OPCODE },
6895     { "phaddd",         { MX, EM }, PREFIX_OPCODE },
6896     { "phaddsw",        { MX, EM }, PREFIX_OPCODE },
6897     { "pmaddubsw",      { MX, EM }, PREFIX_OPCODE },
6898     { "phsubw",         { MX, EM }, PREFIX_OPCODE },
6899     { "phsubd",         { MX, EM }, PREFIX_OPCODE },
6900     { "phsubsw",        { MX, EM }, PREFIX_OPCODE },
6901     /* 08 */
6902     { "psignb",         { MX, EM }, PREFIX_OPCODE },
6903     { "psignw",         { MX, EM }, PREFIX_OPCODE },
6904     { "psignd",         { MX, EM }, PREFIX_OPCODE },
6905     { "pmulhrsw",       { MX, EM }, PREFIX_OPCODE },
6906     { Bad_Opcode },
6907     { Bad_Opcode },
6908     { Bad_Opcode },
6909     { Bad_Opcode },
6910     /* 10 */
6911     { PREFIX_TABLE (PREFIX_0F3810) },
6912     { Bad_Opcode },
6913     { Bad_Opcode },
6914     { Bad_Opcode },
6915     { PREFIX_TABLE (PREFIX_0F3814) },
6916     { PREFIX_TABLE (PREFIX_0F3815) },
6917     { Bad_Opcode },
6918     { PREFIX_TABLE (PREFIX_0F3817) },
6919     /* 18 */
6920     { Bad_Opcode },
6921     { Bad_Opcode },
6922     { Bad_Opcode },
6923     { Bad_Opcode },
6924     { "pabsb",          { MX, EM }, PREFIX_OPCODE },
6925     { "pabsw",          { MX, EM }, PREFIX_OPCODE },
6926     { "pabsd",          { MX, EM }, PREFIX_OPCODE },
6927     { Bad_Opcode },
6928     /* 20 */
6929     { PREFIX_TABLE (PREFIX_0F3820) },
6930     { PREFIX_TABLE (PREFIX_0F3821) },
6931     { PREFIX_TABLE (PREFIX_0F3822) },
6932     { PREFIX_TABLE (PREFIX_0F3823) },
6933     { PREFIX_TABLE (PREFIX_0F3824) },
6934     { PREFIX_TABLE (PREFIX_0F3825) },
6935     { Bad_Opcode },
6936     { Bad_Opcode },
6937     /* 28 */
6938     { PREFIX_TABLE (PREFIX_0F3828) },
6939     { PREFIX_TABLE (PREFIX_0F3829) },
6940     { PREFIX_TABLE (PREFIX_0F382A) },
6941     { PREFIX_TABLE (PREFIX_0F382B) },
6942     { Bad_Opcode },
6943     { Bad_Opcode },
6944     { Bad_Opcode },
6945     { Bad_Opcode },
6946     /* 30 */
6947     { PREFIX_TABLE (PREFIX_0F3830) },
6948     { PREFIX_TABLE (PREFIX_0F3831) },
6949     { PREFIX_TABLE (PREFIX_0F3832) },
6950     { PREFIX_TABLE (PREFIX_0F3833) },
6951     { PREFIX_TABLE (PREFIX_0F3834) },
6952     { PREFIX_TABLE (PREFIX_0F3835) },
6953     { Bad_Opcode },
6954     { PREFIX_TABLE (PREFIX_0F3837) },
6955     /* 38 */
6956     { PREFIX_TABLE (PREFIX_0F3838) },
6957     { PREFIX_TABLE (PREFIX_0F3839) },
6958     { PREFIX_TABLE (PREFIX_0F383A) },
6959     { PREFIX_TABLE (PREFIX_0F383B) },
6960     { PREFIX_TABLE (PREFIX_0F383C) },
6961     { PREFIX_TABLE (PREFIX_0F383D) },
6962     { PREFIX_TABLE (PREFIX_0F383E) },
6963     { PREFIX_TABLE (PREFIX_0F383F) },
6964     /* 40 */
6965     { PREFIX_TABLE (PREFIX_0F3840) },
6966     { PREFIX_TABLE (PREFIX_0F3841) },
6967     { Bad_Opcode },
6968     { Bad_Opcode },
6969     { Bad_Opcode },
6970     { Bad_Opcode },
6971     { Bad_Opcode },
6972     { Bad_Opcode },
6973     /* 48 */
6974     { Bad_Opcode },
6975     { Bad_Opcode },
6976     { Bad_Opcode },
6977     { Bad_Opcode },
6978     { Bad_Opcode },
6979     { Bad_Opcode },
6980     { Bad_Opcode },
6981     { Bad_Opcode },
6982     /* 50 */
6983     { Bad_Opcode },
6984     { Bad_Opcode },
6985     { Bad_Opcode },
6986     { Bad_Opcode },
6987     { Bad_Opcode },
6988     { Bad_Opcode },
6989     { Bad_Opcode },
6990     { Bad_Opcode },
6991     /* 58 */
6992     { Bad_Opcode },
6993     { Bad_Opcode },
6994     { Bad_Opcode },
6995     { Bad_Opcode },
6996     { Bad_Opcode },
6997     { Bad_Opcode },
6998     { Bad_Opcode },
6999     { Bad_Opcode },
7000     /* 60 */
7001     { Bad_Opcode },
7002     { Bad_Opcode },
7003     { Bad_Opcode },
7004     { Bad_Opcode },
7005     { Bad_Opcode },
7006     { Bad_Opcode },
7007     { Bad_Opcode },
7008     { Bad_Opcode },
7009     /* 68 */
7010     { Bad_Opcode },
7011     { Bad_Opcode },
7012     { Bad_Opcode },
7013     { Bad_Opcode },
7014     { Bad_Opcode },
7015     { Bad_Opcode },
7016     { Bad_Opcode },
7017     { Bad_Opcode },
7018     /* 70 */
7019     { Bad_Opcode },
7020     { Bad_Opcode },
7021     { Bad_Opcode },
7022     { Bad_Opcode },
7023     { Bad_Opcode },
7024     { Bad_Opcode },
7025     { Bad_Opcode },
7026     { Bad_Opcode },
7027     /* 78 */
7028     { Bad_Opcode },
7029     { Bad_Opcode },
7030     { Bad_Opcode },
7031     { Bad_Opcode },
7032     { Bad_Opcode },
7033     { Bad_Opcode },
7034     { Bad_Opcode },
7035     { Bad_Opcode },
7036     /* 80 */
7037     { PREFIX_TABLE (PREFIX_0F3880) },
7038     { PREFIX_TABLE (PREFIX_0F3881) },
7039     { PREFIX_TABLE (PREFIX_0F3882) },
7040     { Bad_Opcode },
7041     { Bad_Opcode },
7042     { Bad_Opcode },
7043     { Bad_Opcode },
7044     { Bad_Opcode },
7045     /* 88 */
7046     { Bad_Opcode },
7047     { Bad_Opcode },
7048     { Bad_Opcode },
7049     { Bad_Opcode },
7050     { Bad_Opcode },
7051     { Bad_Opcode },
7052     { Bad_Opcode },
7053     { Bad_Opcode },
7054     /* 90 */
7055     { Bad_Opcode },
7056     { Bad_Opcode },
7057     { Bad_Opcode },
7058     { Bad_Opcode },
7059     { Bad_Opcode },
7060     { Bad_Opcode },
7061     { Bad_Opcode },
7062     { Bad_Opcode },
7063     /* 98 */
7064     { Bad_Opcode },
7065     { Bad_Opcode },
7066     { Bad_Opcode },
7067     { Bad_Opcode },
7068     { Bad_Opcode },
7069     { Bad_Opcode },
7070     { Bad_Opcode },
7071     { Bad_Opcode },
7072     /* a0 */
7073     { Bad_Opcode },
7074     { Bad_Opcode },
7075     { Bad_Opcode },
7076     { Bad_Opcode },
7077     { Bad_Opcode },
7078     { Bad_Opcode },
7079     { Bad_Opcode },
7080     { Bad_Opcode },
7081     /* a8 */
7082     { Bad_Opcode },
7083     { Bad_Opcode },
7084     { Bad_Opcode },
7085     { Bad_Opcode },
7086     { Bad_Opcode },
7087     { Bad_Opcode },
7088     { Bad_Opcode },
7089     { Bad_Opcode },
7090     /* b0 */
7091     { Bad_Opcode },
7092     { Bad_Opcode },
7093     { Bad_Opcode },
7094     { Bad_Opcode },
7095     { Bad_Opcode },
7096     { Bad_Opcode },
7097     { Bad_Opcode },
7098     { Bad_Opcode },
7099     /* b8 */
7100     { Bad_Opcode },
7101     { Bad_Opcode },
7102     { Bad_Opcode },
7103     { Bad_Opcode },
7104     { Bad_Opcode },
7105     { Bad_Opcode },
7106     { Bad_Opcode },
7107     { Bad_Opcode },
7108     /* c0 */
7109     { Bad_Opcode },
7110     { Bad_Opcode },
7111     { Bad_Opcode },
7112     { Bad_Opcode },
7113     { Bad_Opcode },
7114     { Bad_Opcode },
7115     { Bad_Opcode },
7116     { Bad_Opcode },
7117     /* c8 */
7118     { PREFIX_TABLE (PREFIX_0F38C8) },
7119     { PREFIX_TABLE (PREFIX_0F38C9) },
7120     { PREFIX_TABLE (PREFIX_0F38CA) },
7121     { PREFIX_TABLE (PREFIX_0F38CB) },
7122     { PREFIX_TABLE (PREFIX_0F38CC) },
7123     { PREFIX_TABLE (PREFIX_0F38CD) },
7124     { Bad_Opcode },
7125     { Bad_Opcode },
7126     /* d0 */
7127     { Bad_Opcode },
7128     { Bad_Opcode },
7129     { Bad_Opcode },
7130     { Bad_Opcode },
7131     { Bad_Opcode },
7132     { Bad_Opcode },
7133     { Bad_Opcode },
7134     { Bad_Opcode },
7135     /* d8 */
7136     { Bad_Opcode },
7137     { Bad_Opcode },
7138     { Bad_Opcode },
7139     { PREFIX_TABLE (PREFIX_0F38DB) },
7140     { PREFIX_TABLE (PREFIX_0F38DC) },
7141     { PREFIX_TABLE (PREFIX_0F38DD) },
7142     { PREFIX_TABLE (PREFIX_0F38DE) },
7143     { PREFIX_TABLE (PREFIX_0F38DF) },
7144     /* e0 */
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     /* e8 */
7154     { Bad_Opcode },
7155     { Bad_Opcode },
7156     { Bad_Opcode },
7157     { Bad_Opcode },
7158     { Bad_Opcode },
7159     { Bad_Opcode },
7160     { Bad_Opcode },
7161     { Bad_Opcode },
7162     /* f0 */
7163     { PREFIX_TABLE (PREFIX_0F38F0) },
7164     { PREFIX_TABLE (PREFIX_0F38F1) },
7165     { Bad_Opcode },
7166     { Bad_Opcode },
7167     { Bad_Opcode },
7168     { Bad_Opcode },
7169     { PREFIX_TABLE (PREFIX_0F38F6) },
7170     { Bad_Opcode },
7171     /* f8 */
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   },
7181   /* THREE_BYTE_0F3A */
7182   {
7183     /* 00 */
7184     { Bad_Opcode },
7185     { Bad_Opcode },
7186     { Bad_Opcode },
7187     { Bad_Opcode },
7188     { Bad_Opcode },
7189     { Bad_Opcode },
7190     { Bad_Opcode },
7191     { Bad_Opcode },
7192     /* 08 */
7193     { PREFIX_TABLE (PREFIX_0F3A08) },
7194     { PREFIX_TABLE (PREFIX_0F3A09) },
7195     { PREFIX_TABLE (PREFIX_0F3A0A) },
7196     { PREFIX_TABLE (PREFIX_0F3A0B) },
7197     { PREFIX_TABLE (PREFIX_0F3A0C) },
7198     { PREFIX_TABLE (PREFIX_0F3A0D) },
7199     { PREFIX_TABLE (PREFIX_0F3A0E) },
7200     { "palignr",        { MX, EM, Ib }, PREFIX_OPCODE },
7201     /* 10 */
7202     { Bad_Opcode },
7203     { Bad_Opcode },
7204     { Bad_Opcode },
7205     { Bad_Opcode },
7206     { PREFIX_TABLE (PREFIX_0F3A14) },
7207     { PREFIX_TABLE (PREFIX_0F3A15) },
7208     { PREFIX_TABLE (PREFIX_0F3A16) },
7209     { PREFIX_TABLE (PREFIX_0F3A17) },
7210     /* 18 */
7211     { Bad_Opcode },
7212     { Bad_Opcode },
7213     { Bad_Opcode },
7214     { Bad_Opcode },
7215     { Bad_Opcode },
7216     { Bad_Opcode },
7217     { Bad_Opcode },
7218     { Bad_Opcode },
7219     /* 20 */
7220     { PREFIX_TABLE (PREFIX_0F3A20) },
7221     { PREFIX_TABLE (PREFIX_0F3A21) },
7222     { PREFIX_TABLE (PREFIX_0F3A22) },
7223     { Bad_Opcode },
7224     { Bad_Opcode },
7225     { Bad_Opcode },
7226     { Bad_Opcode },
7227     { Bad_Opcode },
7228     /* 28 */
7229     { Bad_Opcode },
7230     { Bad_Opcode },
7231     { Bad_Opcode },
7232     { Bad_Opcode },
7233     { Bad_Opcode },
7234     { Bad_Opcode },
7235     { Bad_Opcode },
7236     { Bad_Opcode },
7237     /* 30 */
7238     { Bad_Opcode },
7239     { Bad_Opcode },
7240     { Bad_Opcode },
7241     { Bad_Opcode },
7242     { Bad_Opcode },
7243     { Bad_Opcode },
7244     { Bad_Opcode },
7245     { Bad_Opcode },
7246     /* 38 */
7247     { Bad_Opcode },
7248     { Bad_Opcode },
7249     { Bad_Opcode },
7250     { Bad_Opcode },
7251     { Bad_Opcode },
7252     { Bad_Opcode },
7253     { Bad_Opcode },
7254     { Bad_Opcode },
7255     /* 40 */
7256     { PREFIX_TABLE (PREFIX_0F3A40) },
7257     { PREFIX_TABLE (PREFIX_0F3A41) },
7258     { PREFIX_TABLE (PREFIX_0F3A42) },
7259     { Bad_Opcode },
7260     { PREFIX_TABLE (PREFIX_0F3A44) },
7261     { Bad_Opcode },
7262     { Bad_Opcode },
7263     { Bad_Opcode },
7264     /* 48 */
7265     { Bad_Opcode },
7266     { Bad_Opcode },
7267     { Bad_Opcode },
7268     { Bad_Opcode },
7269     { Bad_Opcode },
7270     { Bad_Opcode },
7271     { Bad_Opcode },
7272     { Bad_Opcode },
7273     /* 50 */
7274     { Bad_Opcode },
7275     { Bad_Opcode },
7276     { Bad_Opcode },
7277     { Bad_Opcode },
7278     { Bad_Opcode },
7279     { Bad_Opcode },
7280     { Bad_Opcode },
7281     { Bad_Opcode },
7282     /* 58 */
7283     { Bad_Opcode },
7284     { Bad_Opcode },
7285     { Bad_Opcode },
7286     { Bad_Opcode },
7287     { Bad_Opcode },
7288     { Bad_Opcode },
7289     { Bad_Opcode },
7290     { Bad_Opcode },
7291     /* 60 */
7292     { PREFIX_TABLE (PREFIX_0F3A60) },
7293     { PREFIX_TABLE (PREFIX_0F3A61) },
7294     { PREFIX_TABLE (PREFIX_0F3A62) },
7295     { PREFIX_TABLE (PREFIX_0F3A63) },
7296     { Bad_Opcode },
7297     { Bad_Opcode },
7298     { Bad_Opcode },
7299     { Bad_Opcode },
7300     /* 68 */
7301     { Bad_Opcode },
7302     { Bad_Opcode },
7303     { Bad_Opcode },
7304     { Bad_Opcode },
7305     { Bad_Opcode },
7306     { Bad_Opcode },
7307     { Bad_Opcode },
7308     { Bad_Opcode },
7309     /* 70 */
7310     { Bad_Opcode },
7311     { Bad_Opcode },
7312     { Bad_Opcode },
7313     { Bad_Opcode },
7314     { Bad_Opcode },
7315     { Bad_Opcode },
7316     { Bad_Opcode },
7317     { Bad_Opcode },
7318     /* 78 */
7319     { Bad_Opcode },
7320     { Bad_Opcode },
7321     { Bad_Opcode },
7322     { Bad_Opcode },
7323     { Bad_Opcode },
7324     { Bad_Opcode },
7325     { Bad_Opcode },
7326     { Bad_Opcode },
7327     /* 80 */
7328     { Bad_Opcode },
7329     { Bad_Opcode },
7330     { Bad_Opcode },
7331     { Bad_Opcode },
7332     { Bad_Opcode },
7333     { Bad_Opcode },
7334     { Bad_Opcode },
7335     { Bad_Opcode },
7336     /* 88 */
7337     { Bad_Opcode },
7338     { Bad_Opcode },
7339     { Bad_Opcode },
7340     { Bad_Opcode },
7341     { Bad_Opcode },
7342     { Bad_Opcode },
7343     { Bad_Opcode },
7344     { Bad_Opcode },
7345     /* 90 */
7346     { Bad_Opcode },
7347     { Bad_Opcode },
7348     { Bad_Opcode },
7349     { Bad_Opcode },
7350     { Bad_Opcode },
7351     { Bad_Opcode },
7352     { Bad_Opcode },
7353     { Bad_Opcode },
7354     /* 98 */
7355     { Bad_Opcode },
7356     { Bad_Opcode },
7357     { Bad_Opcode },
7358     { Bad_Opcode },
7359     { Bad_Opcode },
7360     { Bad_Opcode },
7361     { Bad_Opcode },
7362     { Bad_Opcode },
7363     /* a0 */
7364     { Bad_Opcode },
7365     { Bad_Opcode },
7366     { Bad_Opcode },
7367     { Bad_Opcode },
7368     { Bad_Opcode },
7369     { Bad_Opcode },
7370     { Bad_Opcode },
7371     { Bad_Opcode },
7372     /* a8 */
7373     { Bad_Opcode },
7374     { Bad_Opcode },
7375     { Bad_Opcode },
7376     { Bad_Opcode },
7377     { Bad_Opcode },
7378     { Bad_Opcode },
7379     { Bad_Opcode },
7380     { Bad_Opcode },
7381     /* b0 */
7382     { Bad_Opcode },
7383     { Bad_Opcode },
7384     { Bad_Opcode },
7385     { Bad_Opcode },
7386     { Bad_Opcode },
7387     { Bad_Opcode },
7388     { Bad_Opcode },
7389     { Bad_Opcode },
7390     /* b8 */
7391     { Bad_Opcode },
7392     { Bad_Opcode },
7393     { Bad_Opcode },
7394     { Bad_Opcode },
7395     { Bad_Opcode },
7396     { Bad_Opcode },
7397     { Bad_Opcode },
7398     { Bad_Opcode },
7399     /* c0 */
7400     { Bad_Opcode },
7401     { Bad_Opcode },
7402     { Bad_Opcode },
7403     { Bad_Opcode },
7404     { Bad_Opcode },
7405     { Bad_Opcode },
7406     { Bad_Opcode },
7407     { Bad_Opcode },
7408     /* c8 */
7409     { Bad_Opcode },
7410     { Bad_Opcode },
7411     { Bad_Opcode },
7412     { Bad_Opcode },
7413     { PREFIX_TABLE (PREFIX_0F3ACC) },
7414     { Bad_Opcode },
7415     { Bad_Opcode },
7416     { Bad_Opcode },
7417     /* d0 */
7418     { Bad_Opcode },
7419     { Bad_Opcode },
7420     { Bad_Opcode },
7421     { Bad_Opcode },
7422     { Bad_Opcode },
7423     { Bad_Opcode },
7424     { Bad_Opcode },
7425     { Bad_Opcode },
7426     /* d8 */
7427     { Bad_Opcode },
7428     { Bad_Opcode },
7429     { Bad_Opcode },
7430     { Bad_Opcode },
7431     { Bad_Opcode },
7432     { Bad_Opcode },
7433     { Bad_Opcode },
7434     { PREFIX_TABLE (PREFIX_0F3ADF) },
7435     /* e0 */
7436     { Bad_Opcode },
7437     { Bad_Opcode },
7438     { Bad_Opcode },
7439     { Bad_Opcode },
7440     { Bad_Opcode },
7441     { Bad_Opcode },
7442     { Bad_Opcode },
7443     { Bad_Opcode },
7444     /* e8 */
7445     { Bad_Opcode },
7446     { Bad_Opcode },
7447     { Bad_Opcode },
7448     { Bad_Opcode },
7449     { Bad_Opcode },
7450     { Bad_Opcode },
7451     { Bad_Opcode },
7452     { Bad_Opcode },
7453     /* f0 */
7454     { Bad_Opcode },
7455     { Bad_Opcode },
7456     { Bad_Opcode },
7457     { Bad_Opcode },
7458     { Bad_Opcode },
7459     { Bad_Opcode },
7460     { Bad_Opcode },
7461     { Bad_Opcode },
7462     /* f8 */
7463     { Bad_Opcode },
7464     { Bad_Opcode },
7465     { Bad_Opcode },
7466     { Bad_Opcode },
7467     { Bad_Opcode },
7468     { Bad_Opcode },
7469     { Bad_Opcode },
7470     { Bad_Opcode },
7471   },
7472
7473   /* THREE_BYTE_0F7A */
7474   {
7475     /* 00 */
7476     { Bad_Opcode },
7477     { Bad_Opcode },
7478     { Bad_Opcode },
7479     { Bad_Opcode },
7480     { Bad_Opcode },
7481     { Bad_Opcode },
7482     { Bad_Opcode },
7483     { Bad_Opcode },
7484     /* 08 */
7485     { Bad_Opcode },
7486     { Bad_Opcode },
7487     { Bad_Opcode },
7488     { Bad_Opcode },
7489     { Bad_Opcode },
7490     { Bad_Opcode },
7491     { Bad_Opcode },
7492     { Bad_Opcode },
7493     /* 10 */
7494     { Bad_Opcode },
7495     { Bad_Opcode },
7496     { Bad_Opcode },
7497     { Bad_Opcode },
7498     { Bad_Opcode },
7499     { Bad_Opcode },
7500     { Bad_Opcode },
7501     { Bad_Opcode },
7502     /* 18 */
7503     { Bad_Opcode },
7504     { Bad_Opcode },
7505     { Bad_Opcode },
7506     { Bad_Opcode },
7507     { Bad_Opcode },
7508     { Bad_Opcode },
7509     { Bad_Opcode },
7510     { Bad_Opcode },
7511     /* 20 */
7512     { "ptest",          { XX }, PREFIX_OPCODE },
7513     { Bad_Opcode },
7514     { Bad_Opcode },
7515     { Bad_Opcode },
7516     { Bad_Opcode },
7517     { Bad_Opcode },
7518     { Bad_Opcode },
7519     { Bad_Opcode },
7520     /* 28 */
7521     { Bad_Opcode },
7522     { Bad_Opcode },
7523     { Bad_Opcode },
7524     { Bad_Opcode },
7525     { Bad_Opcode },
7526     { Bad_Opcode },
7527     { Bad_Opcode },
7528     { Bad_Opcode },
7529     /* 30 */
7530     { Bad_Opcode },
7531     { Bad_Opcode },
7532     { Bad_Opcode },
7533     { Bad_Opcode },
7534     { Bad_Opcode },
7535     { Bad_Opcode },
7536     { Bad_Opcode },
7537     { Bad_Opcode },
7538     /* 38 */
7539     { Bad_Opcode },
7540     { Bad_Opcode },
7541     { Bad_Opcode },
7542     { Bad_Opcode },
7543     { Bad_Opcode },
7544     { Bad_Opcode },
7545     { Bad_Opcode },
7546     { Bad_Opcode },
7547     /* 40 */
7548     { Bad_Opcode },
7549     { "phaddbw",        { XM, EXq }, PREFIX_OPCODE },
7550     { "phaddbd",        { XM, EXq }, PREFIX_OPCODE },
7551     { "phaddbq",        { XM, EXq }, PREFIX_OPCODE },
7552     { Bad_Opcode },
7553     { Bad_Opcode },
7554     { "phaddwd",        { XM, EXq }, PREFIX_OPCODE },
7555     { "phaddwq",        { XM, EXq }, PREFIX_OPCODE },
7556     /* 48 */
7557     { Bad_Opcode },
7558     { Bad_Opcode },
7559     { Bad_Opcode },
7560     { "phadddq",        { XM, EXq }, PREFIX_OPCODE },
7561     { Bad_Opcode },
7562     { Bad_Opcode },
7563     { Bad_Opcode },
7564     { Bad_Opcode },
7565     /* 50 */
7566     { Bad_Opcode },
7567     { "phaddubw",       { XM, EXq }, PREFIX_OPCODE },
7568     { "phaddubd",       { XM, EXq }, PREFIX_OPCODE },
7569     { "phaddubq",       { XM, EXq }, PREFIX_OPCODE },
7570     { Bad_Opcode },
7571     { Bad_Opcode },
7572     { "phadduwd",       { XM, EXq }, PREFIX_OPCODE },
7573     { "phadduwq",       { XM, EXq }, PREFIX_OPCODE },
7574     /* 58 */
7575     { Bad_Opcode },
7576     { Bad_Opcode },
7577     { Bad_Opcode },
7578     { "phaddudq",       { XM, EXq }, PREFIX_OPCODE },
7579     { Bad_Opcode },
7580     { Bad_Opcode },
7581     { Bad_Opcode },
7582     { Bad_Opcode },
7583     /* 60 */
7584     { Bad_Opcode },
7585     { "phsubbw",        { XM, EXq }, PREFIX_OPCODE },
7586     { "phsubbd",        { XM, EXq }, PREFIX_OPCODE },
7587     { "phsubbq",        { XM, EXq }, PREFIX_OPCODE },
7588     { Bad_Opcode },
7589     { Bad_Opcode },
7590     { Bad_Opcode },
7591     { Bad_Opcode },
7592     /* 68 */
7593     { Bad_Opcode },
7594     { Bad_Opcode },
7595     { Bad_Opcode },
7596     { Bad_Opcode },
7597     { Bad_Opcode },
7598     { Bad_Opcode },
7599     { Bad_Opcode },
7600     { Bad_Opcode },
7601     /* 70 */
7602     { Bad_Opcode },
7603     { Bad_Opcode },
7604     { Bad_Opcode },
7605     { Bad_Opcode },
7606     { Bad_Opcode },
7607     { Bad_Opcode },
7608     { Bad_Opcode },
7609     { Bad_Opcode },
7610     /* 78 */
7611     { Bad_Opcode },
7612     { Bad_Opcode },
7613     { Bad_Opcode },
7614     { Bad_Opcode },
7615     { Bad_Opcode },
7616     { Bad_Opcode },
7617     { Bad_Opcode },
7618     { Bad_Opcode },
7619     /* 80 */
7620     { Bad_Opcode },
7621     { Bad_Opcode },
7622     { Bad_Opcode },
7623     { Bad_Opcode },
7624     { Bad_Opcode },
7625     { Bad_Opcode },
7626     { Bad_Opcode },
7627     { Bad_Opcode },
7628     /* 88 */
7629     { Bad_Opcode },
7630     { Bad_Opcode },
7631     { Bad_Opcode },
7632     { Bad_Opcode },
7633     { Bad_Opcode },
7634     { Bad_Opcode },
7635     { Bad_Opcode },
7636     { Bad_Opcode },
7637     /* 90 */
7638     { Bad_Opcode },
7639     { Bad_Opcode },
7640     { Bad_Opcode },
7641     { Bad_Opcode },
7642     { Bad_Opcode },
7643     { Bad_Opcode },
7644     { Bad_Opcode },
7645     { Bad_Opcode },
7646     /* 98 */
7647     { Bad_Opcode },
7648     { Bad_Opcode },
7649     { Bad_Opcode },
7650     { Bad_Opcode },
7651     { Bad_Opcode },
7652     { Bad_Opcode },
7653     { Bad_Opcode },
7654     { Bad_Opcode },
7655     /* a0 */
7656     { Bad_Opcode },
7657     { Bad_Opcode },
7658     { Bad_Opcode },
7659     { Bad_Opcode },
7660     { Bad_Opcode },
7661     { Bad_Opcode },
7662     { Bad_Opcode },
7663     { Bad_Opcode },
7664     /* a8 */
7665     { Bad_Opcode },
7666     { Bad_Opcode },
7667     { Bad_Opcode },
7668     { Bad_Opcode },
7669     { Bad_Opcode },
7670     { Bad_Opcode },
7671     { Bad_Opcode },
7672     { Bad_Opcode },
7673     /* b0 */
7674     { Bad_Opcode },
7675     { Bad_Opcode },
7676     { Bad_Opcode },
7677     { Bad_Opcode },
7678     { Bad_Opcode },
7679     { Bad_Opcode },
7680     { Bad_Opcode },
7681     { Bad_Opcode },
7682     /* b8 */
7683     { Bad_Opcode },
7684     { Bad_Opcode },
7685     { Bad_Opcode },
7686     { Bad_Opcode },
7687     { Bad_Opcode },
7688     { Bad_Opcode },
7689     { Bad_Opcode },
7690     { Bad_Opcode },
7691     /* c0 */
7692     { Bad_Opcode },
7693     { Bad_Opcode },
7694     { Bad_Opcode },
7695     { Bad_Opcode },
7696     { Bad_Opcode },
7697     { Bad_Opcode },
7698     { Bad_Opcode },
7699     { Bad_Opcode },
7700     /* c8 */
7701     { Bad_Opcode },
7702     { Bad_Opcode },
7703     { Bad_Opcode },
7704     { Bad_Opcode },
7705     { Bad_Opcode },
7706     { Bad_Opcode },
7707     { Bad_Opcode },
7708     { Bad_Opcode },
7709     /* d0 */
7710     { Bad_Opcode },
7711     { Bad_Opcode },
7712     { Bad_Opcode },
7713     { Bad_Opcode },
7714     { Bad_Opcode },
7715     { Bad_Opcode },
7716     { Bad_Opcode },
7717     { Bad_Opcode },
7718     /* d8 */
7719     { Bad_Opcode },
7720     { Bad_Opcode },
7721     { Bad_Opcode },
7722     { Bad_Opcode },
7723     { Bad_Opcode },
7724     { Bad_Opcode },
7725     { Bad_Opcode },
7726     { Bad_Opcode },
7727     /* e0 */
7728     { Bad_Opcode },
7729     { Bad_Opcode },
7730     { Bad_Opcode },
7731     { Bad_Opcode },
7732     { Bad_Opcode },
7733     { Bad_Opcode },
7734     { Bad_Opcode },
7735     { Bad_Opcode },
7736     /* e8 */
7737     { Bad_Opcode },
7738     { Bad_Opcode },
7739     { Bad_Opcode },
7740     { Bad_Opcode },
7741     { Bad_Opcode },
7742     { Bad_Opcode },
7743     { Bad_Opcode },
7744     { Bad_Opcode },
7745     /* f0 */
7746     { Bad_Opcode },
7747     { Bad_Opcode },
7748     { Bad_Opcode },
7749     { Bad_Opcode },
7750     { Bad_Opcode },
7751     { Bad_Opcode },
7752     { Bad_Opcode },
7753     { Bad_Opcode },
7754     /* f8 */
7755     { Bad_Opcode },
7756     { Bad_Opcode },
7757     { Bad_Opcode },
7758     { Bad_Opcode },
7759     { Bad_Opcode },
7760     { Bad_Opcode },
7761     { Bad_Opcode },
7762     { Bad_Opcode },
7763   },
7764 };
7765
7766 static const struct dis386 xop_table[][256] = {
7767   /* XOP_08 */
7768   {
7769     /* 00 */
7770     { Bad_Opcode },
7771     { Bad_Opcode },
7772     { Bad_Opcode },
7773     { Bad_Opcode },
7774     { Bad_Opcode },
7775     { Bad_Opcode },
7776     { Bad_Opcode },
7777     { Bad_Opcode },
7778     /* 08 */
7779     { Bad_Opcode },
7780     { Bad_Opcode },
7781     { Bad_Opcode },
7782     { Bad_Opcode },
7783     { Bad_Opcode },
7784     { Bad_Opcode },
7785     { Bad_Opcode },
7786     { Bad_Opcode },
7787     /* 10 */
7788     { Bad_Opcode },
7789     { Bad_Opcode },
7790     { Bad_Opcode },
7791     { Bad_Opcode },
7792     { Bad_Opcode },
7793     { Bad_Opcode },
7794     { Bad_Opcode },
7795     { Bad_Opcode },
7796     /* 18 */
7797     { Bad_Opcode },
7798     { Bad_Opcode },
7799     { Bad_Opcode },
7800     { Bad_Opcode },
7801     { Bad_Opcode },
7802     { Bad_Opcode },
7803     { Bad_Opcode },
7804     { Bad_Opcode },
7805     /* 20 */
7806     { Bad_Opcode },
7807     { Bad_Opcode },
7808     { Bad_Opcode },
7809     { Bad_Opcode },
7810     { Bad_Opcode },
7811     { Bad_Opcode },
7812     { Bad_Opcode },
7813     { Bad_Opcode },
7814     /* 28 */
7815     { Bad_Opcode },
7816     { Bad_Opcode },
7817     { Bad_Opcode },
7818     { Bad_Opcode },
7819     { Bad_Opcode },
7820     { Bad_Opcode },
7821     { Bad_Opcode },
7822     { Bad_Opcode },
7823     /* 30 */
7824     { Bad_Opcode },
7825     { Bad_Opcode },
7826     { Bad_Opcode },
7827     { Bad_Opcode },
7828     { Bad_Opcode },
7829     { Bad_Opcode },
7830     { Bad_Opcode },
7831     { Bad_Opcode },
7832     /* 38 */
7833     { Bad_Opcode },
7834     { Bad_Opcode },
7835     { Bad_Opcode },
7836     { Bad_Opcode },
7837     { Bad_Opcode },
7838     { Bad_Opcode },
7839     { Bad_Opcode },
7840     { Bad_Opcode },
7841     /* 40 */
7842     { Bad_Opcode },
7843     { Bad_Opcode },
7844     { Bad_Opcode },
7845     { Bad_Opcode },
7846     { Bad_Opcode },
7847     { Bad_Opcode },
7848     { Bad_Opcode },
7849     { Bad_Opcode },
7850     /* 48 */
7851     { Bad_Opcode },
7852     { Bad_Opcode },
7853     { Bad_Opcode },
7854     { Bad_Opcode },
7855     { Bad_Opcode },
7856     { Bad_Opcode },
7857     { Bad_Opcode },
7858     { Bad_Opcode },
7859     /* 50 */
7860     { Bad_Opcode },
7861     { Bad_Opcode },
7862     { Bad_Opcode },
7863     { Bad_Opcode },
7864     { Bad_Opcode },
7865     { Bad_Opcode },
7866     { Bad_Opcode },
7867     { Bad_Opcode },
7868     /* 58 */
7869     { Bad_Opcode },
7870     { Bad_Opcode },
7871     { Bad_Opcode },
7872     { Bad_Opcode },
7873     { Bad_Opcode },
7874     { Bad_Opcode },
7875     { Bad_Opcode },
7876     { Bad_Opcode },
7877     /* 60 */
7878     { Bad_Opcode },
7879     { Bad_Opcode },
7880     { Bad_Opcode },
7881     { Bad_Opcode },
7882     { Bad_Opcode },
7883     { Bad_Opcode },
7884     { Bad_Opcode },
7885     { Bad_Opcode },
7886     /* 68 */
7887     { Bad_Opcode },
7888     { Bad_Opcode },
7889     { Bad_Opcode },
7890     { Bad_Opcode },
7891     { Bad_Opcode },
7892     { Bad_Opcode },
7893     { Bad_Opcode },
7894     { Bad_Opcode },
7895     /* 70 */
7896     { Bad_Opcode },
7897     { Bad_Opcode },
7898     { Bad_Opcode },
7899     { Bad_Opcode },
7900     { Bad_Opcode },
7901     { Bad_Opcode },
7902     { Bad_Opcode },
7903     { Bad_Opcode },
7904     /* 78 */
7905     { Bad_Opcode },
7906     { Bad_Opcode },
7907     { Bad_Opcode },
7908     { Bad_Opcode },
7909     { Bad_Opcode },
7910     { Bad_Opcode },
7911     { Bad_Opcode },
7912     { Bad_Opcode },
7913     /* 80 */
7914     { Bad_Opcode },
7915     { Bad_Opcode },
7916     { Bad_Opcode },
7917     { Bad_Opcode },
7918     { Bad_Opcode },
7919     { "vpmacssww",      { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7920     { "vpmacsswd",      { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7921     { "vpmacssdql",     { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7922     /* 88 */
7923     { Bad_Opcode },
7924     { Bad_Opcode },
7925     { Bad_Opcode },
7926     { Bad_Opcode },
7927     { Bad_Opcode },
7928     { Bad_Opcode },
7929     { "vpmacssdd",      { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7930     { "vpmacssdqh",     { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7931     /* 90 */
7932     { Bad_Opcode },
7933     { Bad_Opcode },
7934     { Bad_Opcode },
7935     { Bad_Opcode },
7936     { Bad_Opcode },
7937     { "vpmacsww",       { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7938     { "vpmacswd",       { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7939     { "vpmacsdql",      { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7940     /* 98 */
7941     { Bad_Opcode },
7942     { Bad_Opcode },
7943     { Bad_Opcode },
7944     { Bad_Opcode },
7945     { Bad_Opcode },
7946     { Bad_Opcode },
7947     { "vpmacsdd",       { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7948     { "vpmacsdqh",      { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7949     /* a0 */
7950     { Bad_Opcode },
7951     { Bad_Opcode },
7952     { "vpcmov",         { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7953     { "vpperm",         { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7954     { Bad_Opcode },
7955     { Bad_Opcode },
7956     { "vpmadcsswd",     { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7957     { Bad_Opcode },
7958     /* a8 */
7959     { Bad_Opcode },
7960     { Bad_Opcode },
7961     { Bad_Opcode },
7962     { Bad_Opcode },
7963     { Bad_Opcode },
7964     { Bad_Opcode },
7965     { Bad_Opcode },
7966     { Bad_Opcode },
7967     /* b0 */
7968     { Bad_Opcode },
7969     { Bad_Opcode },
7970     { Bad_Opcode },
7971     { Bad_Opcode },
7972     { Bad_Opcode },
7973     { Bad_Opcode },
7974     { "vpmadcswd",      { XMVexW, Vex, EXVexW, EXVexW, VexI4 }, 0 },
7975     { Bad_Opcode },
7976     /* b8 */
7977     { Bad_Opcode },
7978     { Bad_Opcode },
7979     { Bad_Opcode },
7980     { Bad_Opcode },
7981     { Bad_Opcode },
7982     { Bad_Opcode },
7983     { Bad_Opcode },
7984     { Bad_Opcode },
7985     /* c0 */
7986     { "vprotb",         { XM, Vex_2src_1, Ib }, 0 },
7987     { "vprotw",         { XM, Vex_2src_1, Ib }, 0 },
7988     { "vprotd",         { XM, Vex_2src_1, Ib }, 0 },
7989     { "vprotq",         { XM, Vex_2src_1, Ib }, 0 },
7990     { Bad_Opcode },
7991     { Bad_Opcode },
7992     { Bad_Opcode },
7993     { Bad_Opcode },
7994     /* c8 */
7995     { Bad_Opcode },
7996     { Bad_Opcode },
7997     { Bad_Opcode },
7998     { Bad_Opcode },
7999     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CC) },
8000     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CD) },
8001     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CE) },
8002     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CF) },
8003     /* d0 */
8004     { Bad_Opcode },
8005     { Bad_Opcode },
8006     { Bad_Opcode },
8007     { Bad_Opcode },
8008     { Bad_Opcode },
8009     { Bad_Opcode },
8010     { Bad_Opcode },
8011     { Bad_Opcode },
8012     /* d8 */
8013     { Bad_Opcode },
8014     { Bad_Opcode },
8015     { Bad_Opcode },
8016     { Bad_Opcode },
8017     { Bad_Opcode },
8018     { Bad_Opcode },
8019     { Bad_Opcode },
8020     { Bad_Opcode },
8021     /* e0 */
8022     { Bad_Opcode },
8023     { Bad_Opcode },
8024     { Bad_Opcode },
8025     { Bad_Opcode },
8026     { Bad_Opcode },
8027     { Bad_Opcode },
8028     { Bad_Opcode },
8029     { Bad_Opcode },
8030     /* e8 */
8031     { Bad_Opcode },
8032     { Bad_Opcode },
8033     { Bad_Opcode },
8034     { Bad_Opcode },
8035     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EC) },
8036     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_ED) },
8037     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EE) },
8038     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EF) },
8039     /* f0 */
8040     { Bad_Opcode },
8041     { Bad_Opcode },
8042     { Bad_Opcode },
8043     { Bad_Opcode },
8044     { Bad_Opcode },
8045     { Bad_Opcode },
8046     { Bad_Opcode },
8047     { Bad_Opcode },
8048     /* f8 */
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   },
8058   /* XOP_09 */
8059   {
8060     /* 00 */
8061     { Bad_Opcode },
8062     { REG_TABLE (REG_XOP_TBM_01) },
8063     { REG_TABLE (REG_XOP_TBM_02) },
8064     { Bad_Opcode },
8065     { Bad_Opcode },
8066     { Bad_Opcode },
8067     { Bad_Opcode },
8068     { Bad_Opcode },
8069     /* 08 */
8070     { Bad_Opcode },
8071     { Bad_Opcode },
8072     { Bad_Opcode },
8073     { Bad_Opcode },
8074     { Bad_Opcode },
8075     { Bad_Opcode },
8076     { Bad_Opcode },
8077     { Bad_Opcode },
8078     /* 10 */
8079     { Bad_Opcode },
8080     { Bad_Opcode },
8081     { REG_TABLE (REG_XOP_LWPCB) },
8082     { Bad_Opcode },
8083     { Bad_Opcode },
8084     { Bad_Opcode },
8085     { Bad_Opcode },
8086     { Bad_Opcode },
8087     /* 18 */
8088     { Bad_Opcode },
8089     { Bad_Opcode },
8090     { Bad_Opcode },
8091     { Bad_Opcode },
8092     { Bad_Opcode },
8093     { Bad_Opcode },
8094     { Bad_Opcode },
8095     { Bad_Opcode },
8096     /* 20 */
8097     { Bad_Opcode },
8098     { Bad_Opcode },
8099     { Bad_Opcode },
8100     { Bad_Opcode },
8101     { Bad_Opcode },
8102     { Bad_Opcode },
8103     { Bad_Opcode },
8104     { Bad_Opcode },
8105     /* 28 */
8106     { Bad_Opcode },
8107     { Bad_Opcode },
8108     { Bad_Opcode },
8109     { Bad_Opcode },
8110     { Bad_Opcode },
8111     { Bad_Opcode },
8112     { Bad_Opcode },
8113     { Bad_Opcode },
8114     /* 30 */
8115     { Bad_Opcode },
8116     { Bad_Opcode },
8117     { Bad_Opcode },
8118     { Bad_Opcode },
8119     { Bad_Opcode },
8120     { Bad_Opcode },
8121     { Bad_Opcode },
8122     { Bad_Opcode },
8123     /* 38 */
8124     { Bad_Opcode },
8125     { Bad_Opcode },
8126     { Bad_Opcode },
8127     { Bad_Opcode },
8128     { Bad_Opcode },
8129     { Bad_Opcode },
8130     { Bad_Opcode },
8131     { Bad_Opcode },
8132     /* 40 */
8133     { Bad_Opcode },
8134     { Bad_Opcode },
8135     { Bad_Opcode },
8136     { Bad_Opcode },
8137     { Bad_Opcode },
8138     { Bad_Opcode },
8139     { Bad_Opcode },
8140     { Bad_Opcode },
8141     /* 48 */
8142     { Bad_Opcode },
8143     { Bad_Opcode },
8144     { Bad_Opcode },
8145     { Bad_Opcode },
8146     { Bad_Opcode },
8147     { Bad_Opcode },
8148     { Bad_Opcode },
8149     { Bad_Opcode },
8150     /* 50 */
8151     { Bad_Opcode },
8152     { Bad_Opcode },
8153     { Bad_Opcode },
8154     { Bad_Opcode },
8155     { Bad_Opcode },
8156     { Bad_Opcode },
8157     { Bad_Opcode },
8158     { Bad_Opcode },
8159     /* 58 */
8160     { Bad_Opcode },
8161     { Bad_Opcode },
8162     { Bad_Opcode },
8163     { Bad_Opcode },
8164     { Bad_Opcode },
8165     { Bad_Opcode },
8166     { Bad_Opcode },
8167     { Bad_Opcode },
8168     /* 60 */
8169     { Bad_Opcode },
8170     { Bad_Opcode },
8171     { Bad_Opcode },
8172     { Bad_Opcode },
8173     { Bad_Opcode },
8174     { Bad_Opcode },
8175     { Bad_Opcode },
8176     { Bad_Opcode },
8177     /* 68 */
8178     { Bad_Opcode },
8179     { Bad_Opcode },
8180     { Bad_Opcode },
8181     { Bad_Opcode },
8182     { Bad_Opcode },
8183     { Bad_Opcode },
8184     { Bad_Opcode },
8185     { Bad_Opcode },
8186     /* 70 */
8187     { Bad_Opcode },
8188     { Bad_Opcode },
8189     { Bad_Opcode },
8190     { Bad_Opcode },
8191     { Bad_Opcode },
8192     { Bad_Opcode },
8193     { Bad_Opcode },
8194     { Bad_Opcode },
8195     /* 78 */
8196     { Bad_Opcode },
8197     { Bad_Opcode },
8198     { Bad_Opcode },
8199     { Bad_Opcode },
8200     { Bad_Opcode },
8201     { Bad_Opcode },
8202     { Bad_Opcode },
8203     { Bad_Opcode },
8204     /* 80 */
8205     { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_80) },
8206     { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_81) },
8207     { "vfrczss",        { XM, EXd }, 0 },
8208     { "vfrczsd",        { XM, EXq }, 0 },
8209     { Bad_Opcode },
8210     { Bad_Opcode },
8211     { Bad_Opcode },
8212     { Bad_Opcode },
8213     /* 88 */
8214     { Bad_Opcode },
8215     { Bad_Opcode },
8216     { Bad_Opcode },
8217     { Bad_Opcode },
8218     { Bad_Opcode },
8219     { Bad_Opcode },
8220     { Bad_Opcode },
8221     { Bad_Opcode },
8222     /* 90 */
8223     { "vprotb",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8224     { "vprotw",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8225     { "vprotd",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8226     { "vprotq",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8227     { "vpshlb",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8228     { "vpshlw",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8229     { "vpshld",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8230     { "vpshlq",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8231     /* 98 */
8232     { "vpshab",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8233     { "vpshaw",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8234     { "vpshad",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8235     { "vpshaq",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8236     { Bad_Opcode },
8237     { Bad_Opcode },
8238     { Bad_Opcode },
8239     { Bad_Opcode },
8240     /* a0 */
8241     { Bad_Opcode },
8242     { Bad_Opcode },
8243     { Bad_Opcode },
8244     { Bad_Opcode },
8245     { Bad_Opcode },
8246     { Bad_Opcode },
8247     { Bad_Opcode },
8248     { Bad_Opcode },
8249     /* a8 */
8250     { Bad_Opcode },
8251     { Bad_Opcode },
8252     { Bad_Opcode },
8253     { Bad_Opcode },
8254     { Bad_Opcode },
8255     { Bad_Opcode },
8256     { Bad_Opcode },
8257     { Bad_Opcode },
8258     /* b0 */
8259     { Bad_Opcode },
8260     { Bad_Opcode },
8261     { Bad_Opcode },
8262     { Bad_Opcode },
8263     { Bad_Opcode },
8264     { Bad_Opcode },
8265     { Bad_Opcode },
8266     { Bad_Opcode },
8267     /* b8 */
8268     { Bad_Opcode },
8269     { Bad_Opcode },
8270     { Bad_Opcode },
8271     { Bad_Opcode },
8272     { Bad_Opcode },
8273     { Bad_Opcode },
8274     { Bad_Opcode },
8275     { Bad_Opcode },
8276     /* c0 */
8277     { Bad_Opcode },
8278     { "vphaddbw",       { XM, EXxmm }, 0 },
8279     { "vphaddbd",       { XM, EXxmm }, 0 },
8280     { "vphaddbq",       { XM, EXxmm }, 0 },
8281     { Bad_Opcode },
8282     { Bad_Opcode },
8283     { "vphaddwd",       { XM, EXxmm }, 0 },
8284     { "vphaddwq",       { XM, EXxmm }, 0 },
8285     /* c8 */
8286     { Bad_Opcode },
8287     { Bad_Opcode },
8288     { Bad_Opcode },
8289     { "vphadddq",       { XM, EXxmm }, 0 },
8290     { Bad_Opcode },
8291     { Bad_Opcode },
8292     { Bad_Opcode },
8293     { Bad_Opcode },
8294     /* d0 */
8295     { Bad_Opcode },
8296     { "vphaddubw",      { XM, EXxmm }, 0 },
8297     { "vphaddubd",      { XM, EXxmm }, 0 },
8298     { "vphaddubq",      { XM, EXxmm }, 0 },
8299     { Bad_Opcode },
8300     { Bad_Opcode },
8301     { "vphadduwd",      { XM, EXxmm }, 0 },
8302     { "vphadduwq",      { XM, EXxmm }, 0 },
8303     /* d8 */
8304     { Bad_Opcode },
8305     { Bad_Opcode },
8306     { Bad_Opcode },
8307     { "vphaddudq",      { XM, EXxmm }, 0 },
8308     { Bad_Opcode },
8309     { Bad_Opcode },
8310     { Bad_Opcode },
8311     { Bad_Opcode },
8312     /* e0 */
8313     { Bad_Opcode },
8314     { "vphsubbw",       { XM, EXxmm }, 0 },
8315     { "vphsubwd",       { XM, EXxmm }, 0 },
8316     { "vphsubdq",       { XM, EXxmm }, 0 },
8317     { Bad_Opcode },
8318     { Bad_Opcode },
8319     { Bad_Opcode },
8320     { Bad_Opcode },
8321     /* e8 */
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     /* f0 */
8331     { Bad_Opcode },
8332     { Bad_Opcode },
8333     { Bad_Opcode },
8334     { Bad_Opcode },
8335     { Bad_Opcode },
8336     { Bad_Opcode },
8337     { Bad_Opcode },
8338     { Bad_Opcode },
8339     /* f8 */
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   },
8349   /* XOP_0A */
8350   {
8351     /* 00 */
8352     { Bad_Opcode },
8353     { Bad_Opcode },
8354     { Bad_Opcode },
8355     { Bad_Opcode },
8356     { Bad_Opcode },
8357     { Bad_Opcode },
8358     { Bad_Opcode },
8359     { Bad_Opcode },
8360     /* 08 */
8361     { Bad_Opcode },
8362     { Bad_Opcode },
8363     { Bad_Opcode },
8364     { Bad_Opcode },
8365     { Bad_Opcode },
8366     { Bad_Opcode },
8367     { Bad_Opcode },
8368     { Bad_Opcode },
8369     /* 10 */
8370     { "bextr",  { Gv, Ev, Iq }, 0 },
8371     { Bad_Opcode },
8372     { REG_TABLE (REG_XOP_LWP) },
8373     { Bad_Opcode },
8374     { Bad_Opcode },
8375     { Bad_Opcode },
8376     { Bad_Opcode },
8377     { Bad_Opcode },
8378     /* 18 */
8379     { Bad_Opcode },
8380     { Bad_Opcode },
8381     { Bad_Opcode },
8382     { Bad_Opcode },
8383     { Bad_Opcode },
8384     { Bad_Opcode },
8385     { Bad_Opcode },
8386     { Bad_Opcode },
8387     /* 20 */
8388     { Bad_Opcode },
8389     { Bad_Opcode },
8390     { Bad_Opcode },
8391     { Bad_Opcode },
8392     { Bad_Opcode },
8393     { Bad_Opcode },
8394     { Bad_Opcode },
8395     { Bad_Opcode },
8396     /* 28 */
8397     { Bad_Opcode },
8398     { Bad_Opcode },
8399     { Bad_Opcode },
8400     { Bad_Opcode },
8401     { Bad_Opcode },
8402     { Bad_Opcode },
8403     { Bad_Opcode },
8404     { Bad_Opcode },
8405     /* 30 */
8406     { Bad_Opcode },
8407     { Bad_Opcode },
8408     { Bad_Opcode },
8409     { Bad_Opcode },
8410     { Bad_Opcode },
8411     { Bad_Opcode },
8412     { Bad_Opcode },
8413     { Bad_Opcode },
8414     /* 38 */
8415     { Bad_Opcode },
8416     { Bad_Opcode },
8417     { Bad_Opcode },
8418     { Bad_Opcode },
8419     { Bad_Opcode },
8420     { Bad_Opcode },
8421     { Bad_Opcode },
8422     { Bad_Opcode },
8423     /* 40 */
8424     { Bad_Opcode },
8425     { Bad_Opcode },
8426     { Bad_Opcode },
8427     { Bad_Opcode },
8428     { Bad_Opcode },
8429     { Bad_Opcode },
8430     { Bad_Opcode },
8431     { Bad_Opcode },
8432     /* 48 */
8433     { Bad_Opcode },
8434     { Bad_Opcode },
8435     { Bad_Opcode },
8436     { Bad_Opcode },
8437     { Bad_Opcode },
8438     { Bad_Opcode },
8439     { Bad_Opcode },
8440     { Bad_Opcode },
8441     /* 50 */
8442     { Bad_Opcode },
8443     { Bad_Opcode },
8444     { Bad_Opcode },
8445     { Bad_Opcode },
8446     { Bad_Opcode },
8447     { Bad_Opcode },
8448     { Bad_Opcode },
8449     { Bad_Opcode },
8450     /* 58 */
8451     { Bad_Opcode },
8452     { Bad_Opcode },
8453     { Bad_Opcode },
8454     { Bad_Opcode },
8455     { Bad_Opcode },
8456     { Bad_Opcode },
8457     { Bad_Opcode },
8458     { Bad_Opcode },
8459     /* 60 */
8460     { Bad_Opcode },
8461     { Bad_Opcode },
8462     { Bad_Opcode },
8463     { Bad_Opcode },
8464     { Bad_Opcode },
8465     { Bad_Opcode },
8466     { Bad_Opcode },
8467     { Bad_Opcode },
8468     /* 68 */
8469     { Bad_Opcode },
8470     { Bad_Opcode },
8471     { Bad_Opcode },
8472     { Bad_Opcode },
8473     { Bad_Opcode },
8474     { Bad_Opcode },
8475     { Bad_Opcode },
8476     { Bad_Opcode },
8477     /* 70 */
8478     { Bad_Opcode },
8479     { Bad_Opcode },
8480     { Bad_Opcode },
8481     { Bad_Opcode },
8482     { Bad_Opcode },
8483     { Bad_Opcode },
8484     { Bad_Opcode },
8485     { Bad_Opcode },
8486     /* 78 */
8487     { Bad_Opcode },
8488     { Bad_Opcode },
8489     { Bad_Opcode },
8490     { Bad_Opcode },
8491     { Bad_Opcode },
8492     { Bad_Opcode },
8493     { Bad_Opcode },
8494     { Bad_Opcode },
8495     /* 80 */
8496     { Bad_Opcode },
8497     { Bad_Opcode },
8498     { Bad_Opcode },
8499     { Bad_Opcode },
8500     { Bad_Opcode },
8501     { Bad_Opcode },
8502     { Bad_Opcode },
8503     { Bad_Opcode },
8504     /* 88 */
8505     { Bad_Opcode },
8506     { Bad_Opcode },
8507     { Bad_Opcode },
8508     { Bad_Opcode },
8509     { Bad_Opcode },
8510     { Bad_Opcode },
8511     { Bad_Opcode },
8512     { Bad_Opcode },
8513     /* 90 */
8514     { Bad_Opcode },
8515     { Bad_Opcode },
8516     { Bad_Opcode },
8517     { Bad_Opcode },
8518     { Bad_Opcode },
8519     { Bad_Opcode },
8520     { Bad_Opcode },
8521     { Bad_Opcode },
8522     /* 98 */
8523     { Bad_Opcode },
8524     { Bad_Opcode },
8525     { Bad_Opcode },
8526     { Bad_Opcode },
8527     { Bad_Opcode },
8528     { Bad_Opcode },
8529     { Bad_Opcode },
8530     { Bad_Opcode },
8531     /* a0 */
8532     { Bad_Opcode },
8533     { Bad_Opcode },
8534     { Bad_Opcode },
8535     { Bad_Opcode },
8536     { Bad_Opcode },
8537     { Bad_Opcode },
8538     { Bad_Opcode },
8539     { Bad_Opcode },
8540     /* a8 */
8541     { Bad_Opcode },
8542     { Bad_Opcode },
8543     { Bad_Opcode },
8544     { Bad_Opcode },
8545     { Bad_Opcode },
8546     { Bad_Opcode },
8547     { Bad_Opcode },
8548     { Bad_Opcode },
8549     /* b0 */
8550     { Bad_Opcode },
8551     { Bad_Opcode },
8552     { Bad_Opcode },
8553     { Bad_Opcode },
8554     { Bad_Opcode },
8555     { Bad_Opcode },
8556     { Bad_Opcode },
8557     { Bad_Opcode },
8558     /* b8 */
8559     { Bad_Opcode },
8560     { Bad_Opcode },
8561     { Bad_Opcode },
8562     { Bad_Opcode },
8563     { Bad_Opcode },
8564     { Bad_Opcode },
8565     { Bad_Opcode },
8566     { Bad_Opcode },
8567     /* c0 */
8568     { Bad_Opcode },
8569     { Bad_Opcode },
8570     { Bad_Opcode },
8571     { Bad_Opcode },
8572     { Bad_Opcode },
8573     { Bad_Opcode },
8574     { Bad_Opcode },
8575     { Bad_Opcode },
8576     /* c8 */
8577     { Bad_Opcode },
8578     { Bad_Opcode },
8579     { Bad_Opcode },
8580     { Bad_Opcode },
8581     { Bad_Opcode },
8582     { Bad_Opcode },
8583     { Bad_Opcode },
8584     { Bad_Opcode },
8585     /* d0 */
8586     { Bad_Opcode },
8587     { Bad_Opcode },
8588     { Bad_Opcode },
8589     { Bad_Opcode },
8590     { Bad_Opcode },
8591     { Bad_Opcode },
8592     { Bad_Opcode },
8593     { Bad_Opcode },
8594     /* d8 */
8595     { Bad_Opcode },
8596     { Bad_Opcode },
8597     { Bad_Opcode },
8598     { Bad_Opcode },
8599     { Bad_Opcode },
8600     { Bad_Opcode },
8601     { Bad_Opcode },
8602     { Bad_Opcode },
8603     /* e0 */
8604     { Bad_Opcode },
8605     { Bad_Opcode },
8606     { Bad_Opcode },
8607     { Bad_Opcode },
8608     { Bad_Opcode },
8609     { Bad_Opcode },
8610     { Bad_Opcode },
8611     { Bad_Opcode },
8612     /* e8 */
8613     { Bad_Opcode },
8614     { Bad_Opcode },
8615     { Bad_Opcode },
8616     { Bad_Opcode },
8617     { Bad_Opcode },
8618     { Bad_Opcode },
8619     { Bad_Opcode },
8620     { Bad_Opcode },
8621     /* f0 */
8622     { Bad_Opcode },
8623     { Bad_Opcode },
8624     { Bad_Opcode },
8625     { Bad_Opcode },
8626     { Bad_Opcode },
8627     { Bad_Opcode },
8628     { Bad_Opcode },
8629     { Bad_Opcode },
8630     /* f8 */
8631     { Bad_Opcode },
8632     { Bad_Opcode },
8633     { Bad_Opcode },
8634     { Bad_Opcode },
8635     { Bad_Opcode },
8636     { Bad_Opcode },
8637     { Bad_Opcode },
8638     { Bad_Opcode },
8639   },
8640 };
8641
8642 static const struct dis386 vex_table[][256] = {
8643   /* VEX_0F */
8644   {
8645     /* 00 */
8646     { Bad_Opcode },
8647     { Bad_Opcode },
8648     { Bad_Opcode },
8649     { Bad_Opcode },
8650     { Bad_Opcode },
8651     { Bad_Opcode },
8652     { Bad_Opcode },
8653     { Bad_Opcode },
8654     /* 08 */
8655     { Bad_Opcode },
8656     { Bad_Opcode },
8657     { Bad_Opcode },
8658     { Bad_Opcode },
8659     { Bad_Opcode },
8660     { Bad_Opcode },
8661     { Bad_Opcode },
8662     { Bad_Opcode },
8663     /* 10 */
8664     { PREFIX_TABLE (PREFIX_VEX_0F10) },
8665     { PREFIX_TABLE (PREFIX_VEX_0F11) },
8666     { PREFIX_TABLE (PREFIX_VEX_0F12) },
8667     { MOD_TABLE (MOD_VEX_0F13) },
8668     { VEX_W_TABLE (VEX_W_0F14) },
8669     { VEX_W_TABLE (VEX_W_0F15) },
8670     { PREFIX_TABLE (PREFIX_VEX_0F16) },
8671     { MOD_TABLE (MOD_VEX_0F17) },
8672     /* 18 */
8673     { Bad_Opcode },
8674     { Bad_Opcode },
8675     { Bad_Opcode },
8676     { Bad_Opcode },
8677     { Bad_Opcode },
8678     { Bad_Opcode },
8679     { Bad_Opcode },
8680     { Bad_Opcode },
8681     /* 20 */
8682     { Bad_Opcode },
8683     { Bad_Opcode },
8684     { Bad_Opcode },
8685     { Bad_Opcode },
8686     { Bad_Opcode },
8687     { Bad_Opcode },
8688     { Bad_Opcode },
8689     { Bad_Opcode },
8690     /* 28 */
8691     { VEX_W_TABLE (VEX_W_0F28) },
8692     { VEX_W_TABLE (VEX_W_0F29) },
8693     { PREFIX_TABLE (PREFIX_VEX_0F2A) },
8694     { MOD_TABLE (MOD_VEX_0F2B) },
8695     { PREFIX_TABLE (PREFIX_VEX_0F2C) },
8696     { PREFIX_TABLE (PREFIX_VEX_0F2D) },
8697     { PREFIX_TABLE (PREFIX_VEX_0F2E) },
8698     { PREFIX_TABLE (PREFIX_VEX_0F2F) },
8699     /* 30 */
8700     { Bad_Opcode },
8701     { Bad_Opcode },
8702     { Bad_Opcode },
8703     { Bad_Opcode },
8704     { Bad_Opcode },
8705     { Bad_Opcode },
8706     { Bad_Opcode },
8707     { Bad_Opcode },
8708     /* 38 */
8709     { Bad_Opcode },
8710     { Bad_Opcode },
8711     { Bad_Opcode },
8712     { Bad_Opcode },
8713     { Bad_Opcode },
8714     { Bad_Opcode },
8715     { Bad_Opcode },
8716     { Bad_Opcode },
8717     /* 40 */
8718     { Bad_Opcode },
8719     { PREFIX_TABLE (PREFIX_VEX_0F41) },
8720     { PREFIX_TABLE (PREFIX_VEX_0F42) },
8721     { Bad_Opcode },
8722     { PREFIX_TABLE (PREFIX_VEX_0F44) },
8723     { PREFIX_TABLE (PREFIX_VEX_0F45) },
8724     { PREFIX_TABLE (PREFIX_VEX_0F46) },
8725     { PREFIX_TABLE (PREFIX_VEX_0F47) },
8726     /* 48 */
8727     { Bad_Opcode },
8728     { Bad_Opcode },
8729     { PREFIX_TABLE (PREFIX_VEX_0F4A) },
8730     { PREFIX_TABLE (PREFIX_VEX_0F4B) },
8731     { Bad_Opcode },
8732     { Bad_Opcode },
8733     { Bad_Opcode },
8734     { Bad_Opcode },
8735     /* 50 */
8736     { MOD_TABLE (MOD_VEX_0F50) },
8737     { PREFIX_TABLE (PREFIX_VEX_0F51) },
8738     { PREFIX_TABLE (PREFIX_VEX_0F52) },
8739     { PREFIX_TABLE (PREFIX_VEX_0F53) },
8740     { "vandpX",         { XM, Vex, EXx }, 0 },
8741     { "vandnpX",        { XM, Vex, EXx }, 0 },
8742     { "vorpX",          { XM, Vex, EXx }, 0 },
8743     { "vxorpX",         { XM, Vex, EXx }, 0 },
8744     /* 58 */
8745     { PREFIX_TABLE (PREFIX_VEX_0F58) },
8746     { PREFIX_TABLE (PREFIX_VEX_0F59) },
8747     { PREFIX_TABLE (PREFIX_VEX_0F5A) },
8748     { PREFIX_TABLE (PREFIX_VEX_0F5B) },
8749     { PREFIX_TABLE (PREFIX_VEX_0F5C) },
8750     { PREFIX_TABLE (PREFIX_VEX_0F5D) },
8751     { PREFIX_TABLE (PREFIX_VEX_0F5E) },
8752     { PREFIX_TABLE (PREFIX_VEX_0F5F) },
8753     /* 60 */
8754     { PREFIX_TABLE (PREFIX_VEX_0F60) },
8755     { PREFIX_TABLE (PREFIX_VEX_0F61) },
8756     { PREFIX_TABLE (PREFIX_VEX_0F62) },
8757     { PREFIX_TABLE (PREFIX_VEX_0F63) },
8758     { PREFIX_TABLE (PREFIX_VEX_0F64) },
8759     { PREFIX_TABLE (PREFIX_VEX_0F65) },
8760     { PREFIX_TABLE (PREFIX_VEX_0F66) },
8761     { PREFIX_TABLE (PREFIX_VEX_0F67) },
8762     /* 68 */
8763     { PREFIX_TABLE (PREFIX_VEX_0F68) },
8764     { PREFIX_TABLE (PREFIX_VEX_0F69) },
8765     { PREFIX_TABLE (PREFIX_VEX_0F6A) },
8766     { PREFIX_TABLE (PREFIX_VEX_0F6B) },
8767     { PREFIX_TABLE (PREFIX_VEX_0F6C) },
8768     { PREFIX_TABLE (PREFIX_VEX_0F6D) },
8769     { PREFIX_TABLE (PREFIX_VEX_0F6E) },
8770     { PREFIX_TABLE (PREFIX_VEX_0F6F) },
8771     /* 70 */
8772     { PREFIX_TABLE (PREFIX_VEX_0F70) },
8773     { REG_TABLE (REG_VEX_0F71) },
8774     { REG_TABLE (REG_VEX_0F72) },
8775     { REG_TABLE (REG_VEX_0F73) },
8776     { PREFIX_TABLE (PREFIX_VEX_0F74) },
8777     { PREFIX_TABLE (PREFIX_VEX_0F75) },
8778     { PREFIX_TABLE (PREFIX_VEX_0F76) },
8779     { PREFIX_TABLE (PREFIX_VEX_0F77) },
8780     /* 78 */
8781     { Bad_Opcode },
8782     { Bad_Opcode },
8783     { Bad_Opcode },
8784     { Bad_Opcode },
8785     { PREFIX_TABLE (PREFIX_VEX_0F7C) },
8786     { PREFIX_TABLE (PREFIX_VEX_0F7D) },
8787     { PREFIX_TABLE (PREFIX_VEX_0F7E) },
8788     { PREFIX_TABLE (PREFIX_VEX_0F7F) },
8789     /* 80 */
8790     { Bad_Opcode },
8791     { Bad_Opcode },
8792     { Bad_Opcode },
8793     { Bad_Opcode },
8794     { Bad_Opcode },
8795     { Bad_Opcode },
8796     { Bad_Opcode },
8797     { Bad_Opcode },
8798     /* 88 */
8799     { Bad_Opcode },
8800     { Bad_Opcode },
8801     { Bad_Opcode },
8802     { Bad_Opcode },
8803     { Bad_Opcode },
8804     { Bad_Opcode },
8805     { Bad_Opcode },
8806     { Bad_Opcode },
8807     /* 90 */
8808     { PREFIX_TABLE (PREFIX_VEX_0F90) },
8809     { PREFIX_TABLE (PREFIX_VEX_0F91) },
8810     { PREFIX_TABLE (PREFIX_VEX_0F92) },
8811     { PREFIX_TABLE (PREFIX_VEX_0F93) },
8812     { Bad_Opcode },
8813     { Bad_Opcode },
8814     { Bad_Opcode },
8815     { Bad_Opcode },
8816     /* 98 */
8817     { PREFIX_TABLE (PREFIX_VEX_0F98) },
8818     { PREFIX_TABLE (PREFIX_VEX_0F99) },
8819     { Bad_Opcode },
8820     { Bad_Opcode },
8821     { Bad_Opcode },
8822     { Bad_Opcode },
8823     { Bad_Opcode },
8824     { Bad_Opcode },
8825     /* a0 */
8826     { Bad_Opcode },
8827     { Bad_Opcode },
8828     { Bad_Opcode },
8829     { Bad_Opcode },
8830     { Bad_Opcode },
8831     { Bad_Opcode },
8832     { Bad_Opcode },
8833     { Bad_Opcode },
8834     /* a8 */
8835     { Bad_Opcode },
8836     { Bad_Opcode },
8837     { Bad_Opcode },
8838     { Bad_Opcode },
8839     { Bad_Opcode },
8840     { Bad_Opcode },
8841     { REG_TABLE (REG_VEX_0FAE) },
8842     { Bad_Opcode },
8843     /* b0 */
8844     { Bad_Opcode },
8845     { Bad_Opcode },
8846     { Bad_Opcode },
8847     { Bad_Opcode },
8848     { Bad_Opcode },
8849     { Bad_Opcode },
8850     { Bad_Opcode },
8851     { Bad_Opcode },
8852     /* b8 */
8853     { Bad_Opcode },
8854     { Bad_Opcode },
8855     { Bad_Opcode },
8856     { Bad_Opcode },
8857     { Bad_Opcode },
8858     { Bad_Opcode },
8859     { Bad_Opcode },
8860     { Bad_Opcode },
8861     /* c0 */
8862     { Bad_Opcode },
8863     { Bad_Opcode },
8864     { PREFIX_TABLE (PREFIX_VEX_0FC2) },
8865     { Bad_Opcode },
8866     { PREFIX_TABLE (PREFIX_VEX_0FC4) },
8867     { PREFIX_TABLE (PREFIX_VEX_0FC5) },
8868     { "vshufpX",        { XM, Vex, EXx, Ib }, 0 },
8869     { Bad_Opcode },
8870     /* c8 */
8871     { Bad_Opcode },
8872     { Bad_Opcode },
8873     { Bad_Opcode },
8874     { Bad_Opcode },
8875     { Bad_Opcode },
8876     { Bad_Opcode },
8877     { Bad_Opcode },
8878     { Bad_Opcode },
8879     /* d0 */
8880     { PREFIX_TABLE (PREFIX_VEX_0FD0) },
8881     { PREFIX_TABLE (PREFIX_VEX_0FD1) },
8882     { PREFIX_TABLE (PREFIX_VEX_0FD2) },
8883     { PREFIX_TABLE (PREFIX_VEX_0FD3) },
8884     { PREFIX_TABLE (PREFIX_VEX_0FD4) },
8885     { PREFIX_TABLE (PREFIX_VEX_0FD5) },
8886     { PREFIX_TABLE (PREFIX_VEX_0FD6) },
8887     { PREFIX_TABLE (PREFIX_VEX_0FD7) },
8888     /* d8 */
8889     { PREFIX_TABLE (PREFIX_VEX_0FD8) },
8890     { PREFIX_TABLE (PREFIX_VEX_0FD9) },
8891     { PREFIX_TABLE (PREFIX_VEX_0FDA) },
8892     { PREFIX_TABLE (PREFIX_VEX_0FDB) },
8893     { PREFIX_TABLE (PREFIX_VEX_0FDC) },
8894     { PREFIX_TABLE (PREFIX_VEX_0FDD) },
8895     { PREFIX_TABLE (PREFIX_VEX_0FDE) },
8896     { PREFIX_TABLE (PREFIX_VEX_0FDF) },
8897     /* e0 */
8898     { PREFIX_TABLE (PREFIX_VEX_0FE0) },
8899     { PREFIX_TABLE (PREFIX_VEX_0FE1) },
8900     { PREFIX_TABLE (PREFIX_VEX_0FE2) },
8901     { PREFIX_TABLE (PREFIX_VEX_0FE3) },
8902     { PREFIX_TABLE (PREFIX_VEX_0FE4) },
8903     { PREFIX_TABLE (PREFIX_VEX_0FE5) },
8904     { PREFIX_TABLE (PREFIX_VEX_0FE6) },
8905     { PREFIX_TABLE (PREFIX_VEX_0FE7) },
8906     /* e8 */
8907     { PREFIX_TABLE (PREFIX_VEX_0FE8) },
8908     { PREFIX_TABLE (PREFIX_VEX_0FE9) },
8909     { PREFIX_TABLE (PREFIX_VEX_0FEA) },
8910     { PREFIX_TABLE (PREFIX_VEX_0FEB) },
8911     { PREFIX_TABLE (PREFIX_VEX_0FEC) },
8912     { PREFIX_TABLE (PREFIX_VEX_0FED) },
8913     { PREFIX_TABLE (PREFIX_VEX_0FEE) },
8914     { PREFIX_TABLE (PREFIX_VEX_0FEF) },
8915     /* f0 */
8916     { PREFIX_TABLE (PREFIX_VEX_0FF0) },
8917     { PREFIX_TABLE (PREFIX_VEX_0FF1) },
8918     { PREFIX_TABLE (PREFIX_VEX_0FF2) },
8919     { PREFIX_TABLE (PREFIX_VEX_0FF3) },
8920     { PREFIX_TABLE (PREFIX_VEX_0FF4) },
8921     { PREFIX_TABLE (PREFIX_VEX_0FF5) },
8922     { PREFIX_TABLE (PREFIX_VEX_0FF6) },
8923     { PREFIX_TABLE (PREFIX_VEX_0FF7) },
8924     /* f8 */
8925     { PREFIX_TABLE (PREFIX_VEX_0FF8) },
8926     { PREFIX_TABLE (PREFIX_VEX_0FF9) },
8927     { PREFIX_TABLE (PREFIX_VEX_0FFA) },
8928     { PREFIX_TABLE (PREFIX_VEX_0FFB) },
8929     { PREFIX_TABLE (PREFIX_VEX_0FFC) },
8930     { PREFIX_TABLE (PREFIX_VEX_0FFD) },
8931     { PREFIX_TABLE (PREFIX_VEX_0FFE) },
8932     { Bad_Opcode },
8933   },
8934   /* VEX_0F38 */
8935   {
8936     /* 00 */
8937     { PREFIX_TABLE (PREFIX_VEX_0F3800) },
8938     { PREFIX_TABLE (PREFIX_VEX_0F3801) },
8939     { PREFIX_TABLE (PREFIX_VEX_0F3802) },
8940     { PREFIX_TABLE (PREFIX_VEX_0F3803) },
8941     { PREFIX_TABLE (PREFIX_VEX_0F3804) },
8942     { PREFIX_TABLE (PREFIX_VEX_0F3805) },
8943     { PREFIX_TABLE (PREFIX_VEX_0F3806) },
8944     { PREFIX_TABLE (PREFIX_VEX_0F3807) },
8945     /* 08 */
8946     { PREFIX_TABLE (PREFIX_VEX_0F3808) },
8947     { PREFIX_TABLE (PREFIX_VEX_0F3809) },
8948     { PREFIX_TABLE (PREFIX_VEX_0F380A) },
8949     { PREFIX_TABLE (PREFIX_VEX_0F380B) },
8950     { PREFIX_TABLE (PREFIX_VEX_0F380C) },
8951     { PREFIX_TABLE (PREFIX_VEX_0F380D) },
8952     { PREFIX_TABLE (PREFIX_VEX_0F380E) },
8953     { PREFIX_TABLE (PREFIX_VEX_0F380F) },
8954     /* 10 */
8955     { Bad_Opcode },
8956     { Bad_Opcode },
8957     { Bad_Opcode },
8958     { PREFIX_TABLE (PREFIX_VEX_0F3813) },
8959     { Bad_Opcode },
8960     { Bad_Opcode },
8961     { PREFIX_TABLE (PREFIX_VEX_0F3816) },
8962     { PREFIX_TABLE (PREFIX_VEX_0F3817) },
8963     /* 18 */
8964     { PREFIX_TABLE (PREFIX_VEX_0F3818) },
8965     { PREFIX_TABLE (PREFIX_VEX_0F3819) },
8966     { PREFIX_TABLE (PREFIX_VEX_0F381A) },
8967     { Bad_Opcode },
8968     { PREFIX_TABLE (PREFIX_VEX_0F381C) },
8969     { PREFIX_TABLE (PREFIX_VEX_0F381D) },
8970     { PREFIX_TABLE (PREFIX_VEX_0F381E) },
8971     { Bad_Opcode },
8972     /* 20 */
8973     { PREFIX_TABLE (PREFIX_VEX_0F3820) },
8974     { PREFIX_TABLE (PREFIX_VEX_0F3821) },
8975     { PREFIX_TABLE (PREFIX_VEX_0F3822) },
8976     { PREFIX_TABLE (PREFIX_VEX_0F3823) },
8977     { PREFIX_TABLE (PREFIX_VEX_0F3824) },
8978     { PREFIX_TABLE (PREFIX_VEX_0F3825) },
8979     { Bad_Opcode },
8980     { Bad_Opcode },
8981     /* 28 */
8982     { PREFIX_TABLE (PREFIX_VEX_0F3828) },
8983     { PREFIX_TABLE (PREFIX_VEX_0F3829) },
8984     { PREFIX_TABLE (PREFIX_VEX_0F382A) },
8985     { PREFIX_TABLE (PREFIX_VEX_0F382B) },
8986     { PREFIX_TABLE (PREFIX_VEX_0F382C) },
8987     { PREFIX_TABLE (PREFIX_VEX_0F382D) },
8988     { PREFIX_TABLE (PREFIX_VEX_0F382E) },
8989     { PREFIX_TABLE (PREFIX_VEX_0F382F) },
8990     /* 30 */
8991     { PREFIX_TABLE (PREFIX_VEX_0F3830) },
8992     { PREFIX_TABLE (PREFIX_VEX_0F3831) },
8993     { PREFIX_TABLE (PREFIX_VEX_0F3832) },
8994     { PREFIX_TABLE (PREFIX_VEX_0F3833) },
8995     { PREFIX_TABLE (PREFIX_VEX_0F3834) },
8996     { PREFIX_TABLE (PREFIX_VEX_0F3835) },
8997     { PREFIX_TABLE (PREFIX_VEX_0F3836) },
8998     { PREFIX_TABLE (PREFIX_VEX_0F3837) },
8999     /* 38 */
9000     { PREFIX_TABLE (PREFIX_VEX_0F3838) },
9001     { PREFIX_TABLE (PREFIX_VEX_0F3839) },
9002     { PREFIX_TABLE (PREFIX_VEX_0F383A) },
9003     { PREFIX_TABLE (PREFIX_VEX_0F383B) },
9004     { PREFIX_TABLE (PREFIX_VEX_0F383C) },
9005     { PREFIX_TABLE (PREFIX_VEX_0F383D) },
9006     { PREFIX_TABLE (PREFIX_VEX_0F383E) },
9007     { PREFIX_TABLE (PREFIX_VEX_0F383F) },
9008     /* 40 */
9009     { PREFIX_TABLE (PREFIX_VEX_0F3840) },
9010     { PREFIX_TABLE (PREFIX_VEX_0F3841) },
9011     { Bad_Opcode },
9012     { Bad_Opcode },
9013     { Bad_Opcode },
9014     { PREFIX_TABLE (PREFIX_VEX_0F3845) },
9015     { PREFIX_TABLE (PREFIX_VEX_0F3846) },
9016     { PREFIX_TABLE (PREFIX_VEX_0F3847) },
9017     /* 48 */
9018     { Bad_Opcode },
9019     { Bad_Opcode },
9020     { Bad_Opcode },
9021     { Bad_Opcode },
9022     { Bad_Opcode },
9023     { Bad_Opcode },
9024     { Bad_Opcode },
9025     { Bad_Opcode },
9026     /* 50 */
9027     { Bad_Opcode },
9028     { Bad_Opcode },
9029     { Bad_Opcode },
9030     { Bad_Opcode },
9031     { Bad_Opcode },
9032     { Bad_Opcode },
9033     { Bad_Opcode },
9034     { Bad_Opcode },
9035     /* 58 */
9036     { PREFIX_TABLE (PREFIX_VEX_0F3858) },
9037     { PREFIX_TABLE (PREFIX_VEX_0F3859) },
9038     { PREFIX_TABLE (PREFIX_VEX_0F385A) },
9039     { Bad_Opcode },
9040     { Bad_Opcode },
9041     { Bad_Opcode },
9042     { Bad_Opcode },
9043     { Bad_Opcode },
9044     /* 60 */
9045     { Bad_Opcode },
9046     { Bad_Opcode },
9047     { Bad_Opcode },
9048     { Bad_Opcode },
9049     { Bad_Opcode },
9050     { Bad_Opcode },
9051     { Bad_Opcode },
9052     { Bad_Opcode },
9053     /* 68 */
9054     { Bad_Opcode },
9055     { Bad_Opcode },
9056     { Bad_Opcode },
9057     { Bad_Opcode },
9058     { Bad_Opcode },
9059     { Bad_Opcode },
9060     { Bad_Opcode },
9061     { Bad_Opcode },
9062     /* 70 */
9063     { Bad_Opcode },
9064     { Bad_Opcode },
9065     { Bad_Opcode },
9066     { Bad_Opcode },
9067     { Bad_Opcode },
9068     { Bad_Opcode },
9069     { Bad_Opcode },
9070     { Bad_Opcode },
9071     /* 78 */
9072     { PREFIX_TABLE (PREFIX_VEX_0F3878) },
9073     { PREFIX_TABLE (PREFIX_VEX_0F3879) },
9074     { Bad_Opcode },
9075     { Bad_Opcode },
9076     { Bad_Opcode },
9077     { Bad_Opcode },
9078     { Bad_Opcode },
9079     { Bad_Opcode },
9080     /* 80 */
9081     { Bad_Opcode },
9082     { Bad_Opcode },
9083     { Bad_Opcode },
9084     { Bad_Opcode },
9085     { Bad_Opcode },
9086     { Bad_Opcode },
9087     { Bad_Opcode },
9088     { Bad_Opcode },
9089     /* 88 */
9090     { Bad_Opcode },
9091     { Bad_Opcode },
9092     { Bad_Opcode },
9093     { Bad_Opcode },
9094     { PREFIX_TABLE (PREFIX_VEX_0F388C) },
9095     { Bad_Opcode },
9096     { PREFIX_TABLE (PREFIX_VEX_0F388E) },
9097     { Bad_Opcode },
9098     /* 90 */
9099     { PREFIX_TABLE (PREFIX_VEX_0F3890) },
9100     { PREFIX_TABLE (PREFIX_VEX_0F3891) },
9101     { PREFIX_TABLE (PREFIX_VEX_0F3892) },
9102     { PREFIX_TABLE (PREFIX_VEX_0F3893) },
9103     { Bad_Opcode },
9104     { Bad_Opcode },
9105     { PREFIX_TABLE (PREFIX_VEX_0F3896) },
9106     { PREFIX_TABLE (PREFIX_VEX_0F3897) },
9107     /* 98 */
9108     { PREFIX_TABLE (PREFIX_VEX_0F3898) },
9109     { PREFIX_TABLE (PREFIX_VEX_0F3899) },
9110     { PREFIX_TABLE (PREFIX_VEX_0F389A) },
9111     { PREFIX_TABLE (PREFIX_VEX_0F389B) },
9112     { PREFIX_TABLE (PREFIX_VEX_0F389C) },
9113     { PREFIX_TABLE (PREFIX_VEX_0F389D) },
9114     { PREFIX_TABLE (PREFIX_VEX_0F389E) },
9115     { PREFIX_TABLE (PREFIX_VEX_0F389F) },
9116     /* a0 */
9117     { Bad_Opcode },
9118     { Bad_Opcode },
9119     { Bad_Opcode },
9120     { Bad_Opcode },
9121     { Bad_Opcode },
9122     { Bad_Opcode },
9123     { PREFIX_TABLE (PREFIX_VEX_0F38A6) },
9124     { PREFIX_TABLE (PREFIX_VEX_0F38A7) },
9125     /* a8 */
9126     { PREFIX_TABLE (PREFIX_VEX_0F38A8) },
9127     { PREFIX_TABLE (PREFIX_VEX_0F38A9) },
9128     { PREFIX_TABLE (PREFIX_VEX_0F38AA) },
9129     { PREFIX_TABLE (PREFIX_VEX_0F38AB) },
9130     { PREFIX_TABLE (PREFIX_VEX_0F38AC) },
9131     { PREFIX_TABLE (PREFIX_VEX_0F38AD) },
9132     { PREFIX_TABLE (PREFIX_VEX_0F38AE) },
9133     { PREFIX_TABLE (PREFIX_VEX_0F38AF) },
9134     /* b0 */
9135     { Bad_Opcode },
9136     { Bad_Opcode },
9137     { Bad_Opcode },
9138     { Bad_Opcode },
9139     { Bad_Opcode },
9140     { Bad_Opcode },
9141     { PREFIX_TABLE (PREFIX_VEX_0F38B6) },
9142     { PREFIX_TABLE (PREFIX_VEX_0F38B7) },
9143     /* b8 */
9144     { PREFIX_TABLE (PREFIX_VEX_0F38B8) },
9145     { PREFIX_TABLE (PREFIX_VEX_0F38B9) },
9146     { PREFIX_TABLE (PREFIX_VEX_0F38BA) },
9147     { PREFIX_TABLE (PREFIX_VEX_0F38BB) },
9148     { PREFIX_TABLE (PREFIX_VEX_0F38BC) },
9149     { PREFIX_TABLE (PREFIX_VEX_0F38BD) },
9150     { PREFIX_TABLE (PREFIX_VEX_0F38BE) },
9151     { PREFIX_TABLE (PREFIX_VEX_0F38BF) },
9152     /* c0 */
9153     { Bad_Opcode },
9154     { Bad_Opcode },
9155     { Bad_Opcode },
9156     { Bad_Opcode },
9157     { Bad_Opcode },
9158     { Bad_Opcode },
9159     { Bad_Opcode },
9160     { Bad_Opcode },
9161     /* c8 */
9162     { Bad_Opcode },
9163     { Bad_Opcode },
9164     { Bad_Opcode },
9165     { Bad_Opcode },
9166     { Bad_Opcode },
9167     { Bad_Opcode },
9168     { Bad_Opcode },
9169     { Bad_Opcode },
9170     /* d0 */
9171     { Bad_Opcode },
9172     { Bad_Opcode },
9173     { Bad_Opcode },
9174     { Bad_Opcode },
9175     { Bad_Opcode },
9176     { Bad_Opcode },
9177     { Bad_Opcode },
9178     { Bad_Opcode },
9179     /* d8 */
9180     { Bad_Opcode },
9181     { Bad_Opcode },
9182     { Bad_Opcode },
9183     { PREFIX_TABLE (PREFIX_VEX_0F38DB) },
9184     { PREFIX_TABLE (PREFIX_VEX_0F38DC) },
9185     { PREFIX_TABLE (PREFIX_VEX_0F38DD) },
9186     { PREFIX_TABLE (PREFIX_VEX_0F38DE) },
9187     { PREFIX_TABLE (PREFIX_VEX_0F38DF) },
9188     /* e0 */
9189     { Bad_Opcode },
9190     { Bad_Opcode },
9191     { Bad_Opcode },
9192     { Bad_Opcode },
9193     { Bad_Opcode },
9194     { Bad_Opcode },
9195     { Bad_Opcode },
9196     { Bad_Opcode },
9197     /* e8 */
9198     { Bad_Opcode },
9199     { Bad_Opcode },
9200     { Bad_Opcode },
9201     { Bad_Opcode },
9202     { Bad_Opcode },
9203     { Bad_Opcode },
9204     { Bad_Opcode },
9205     { Bad_Opcode },
9206     /* f0 */
9207     { Bad_Opcode },
9208     { Bad_Opcode },
9209     { PREFIX_TABLE (PREFIX_VEX_0F38F2) },
9210     { REG_TABLE (REG_VEX_0F38F3) },
9211     { Bad_Opcode },
9212     { PREFIX_TABLE (PREFIX_VEX_0F38F5) },
9213     { PREFIX_TABLE (PREFIX_VEX_0F38F6) },
9214     { PREFIX_TABLE (PREFIX_VEX_0F38F7) },
9215     /* f8 */
9216     { Bad_Opcode },
9217     { Bad_Opcode },
9218     { Bad_Opcode },
9219     { Bad_Opcode },
9220     { Bad_Opcode },
9221     { Bad_Opcode },
9222     { Bad_Opcode },
9223     { Bad_Opcode },
9224   },
9225   /* VEX_0F3A */
9226   {
9227     /* 00 */
9228     { PREFIX_TABLE (PREFIX_VEX_0F3A00) },
9229     { PREFIX_TABLE (PREFIX_VEX_0F3A01) },
9230     { PREFIX_TABLE (PREFIX_VEX_0F3A02) },
9231     { Bad_Opcode },
9232     { PREFIX_TABLE (PREFIX_VEX_0F3A04) },
9233     { PREFIX_TABLE (PREFIX_VEX_0F3A05) },
9234     { PREFIX_TABLE (PREFIX_VEX_0F3A06) },
9235     { Bad_Opcode },
9236     /* 08 */
9237     { PREFIX_TABLE (PREFIX_VEX_0F3A08) },
9238     { PREFIX_TABLE (PREFIX_VEX_0F3A09) },
9239     { PREFIX_TABLE (PREFIX_VEX_0F3A0A) },
9240     { PREFIX_TABLE (PREFIX_VEX_0F3A0B) },
9241     { PREFIX_TABLE (PREFIX_VEX_0F3A0C) },
9242     { PREFIX_TABLE (PREFIX_VEX_0F3A0D) },
9243     { PREFIX_TABLE (PREFIX_VEX_0F3A0E) },
9244     { PREFIX_TABLE (PREFIX_VEX_0F3A0F) },
9245     /* 10 */
9246     { Bad_Opcode },
9247     { Bad_Opcode },
9248     { Bad_Opcode },
9249     { Bad_Opcode },
9250     { PREFIX_TABLE (PREFIX_VEX_0F3A14) },
9251     { PREFIX_TABLE (PREFIX_VEX_0F3A15) },
9252     { PREFIX_TABLE (PREFIX_VEX_0F3A16) },
9253     { PREFIX_TABLE (PREFIX_VEX_0F3A17) },
9254     /* 18 */
9255     { PREFIX_TABLE (PREFIX_VEX_0F3A18) },
9256     { PREFIX_TABLE (PREFIX_VEX_0F3A19) },
9257     { Bad_Opcode },
9258     { Bad_Opcode },
9259     { Bad_Opcode },
9260     { PREFIX_TABLE (PREFIX_VEX_0F3A1D) },
9261     { Bad_Opcode },
9262     { Bad_Opcode },
9263     /* 20 */
9264     { PREFIX_TABLE (PREFIX_VEX_0F3A20) },
9265     { PREFIX_TABLE (PREFIX_VEX_0F3A21) },
9266     { PREFIX_TABLE (PREFIX_VEX_0F3A22) },
9267     { Bad_Opcode },
9268     { Bad_Opcode },
9269     { Bad_Opcode },
9270     { Bad_Opcode },
9271     { Bad_Opcode },
9272     /* 28 */
9273     { Bad_Opcode },
9274     { Bad_Opcode },
9275     { Bad_Opcode },
9276     { Bad_Opcode },
9277     { Bad_Opcode },
9278     { Bad_Opcode },
9279     { Bad_Opcode },
9280     { Bad_Opcode },
9281     /* 30 */
9282     { PREFIX_TABLE (PREFIX_VEX_0F3A30) },
9283     { PREFIX_TABLE (PREFIX_VEX_0F3A31) },
9284     { PREFIX_TABLE (PREFIX_VEX_0F3A32) },
9285     { PREFIX_TABLE (PREFIX_VEX_0F3A33) },
9286     { Bad_Opcode },
9287     { Bad_Opcode },
9288     { Bad_Opcode },
9289     { Bad_Opcode },
9290     /* 38 */
9291     { PREFIX_TABLE (PREFIX_VEX_0F3A38) },
9292     { PREFIX_TABLE (PREFIX_VEX_0F3A39) },
9293     { Bad_Opcode },
9294     { Bad_Opcode },
9295     { Bad_Opcode },
9296     { Bad_Opcode },
9297     { Bad_Opcode },
9298     { Bad_Opcode },
9299     /* 40 */
9300     { PREFIX_TABLE (PREFIX_VEX_0F3A40) },
9301     { PREFIX_TABLE (PREFIX_VEX_0F3A41) },
9302     { PREFIX_TABLE (PREFIX_VEX_0F3A42) },
9303     { Bad_Opcode },
9304     { PREFIX_TABLE (PREFIX_VEX_0F3A44) },
9305     { Bad_Opcode },
9306     { PREFIX_TABLE (PREFIX_VEX_0F3A46) },
9307     { Bad_Opcode },
9308     /* 48 */
9309     { PREFIX_TABLE (PREFIX_VEX_0F3A48) },
9310     { PREFIX_TABLE (PREFIX_VEX_0F3A49) },
9311     { PREFIX_TABLE (PREFIX_VEX_0F3A4A) },
9312     { PREFIX_TABLE (PREFIX_VEX_0F3A4B) },
9313     { PREFIX_TABLE (PREFIX_VEX_0F3A4C) },
9314     { Bad_Opcode },
9315     { Bad_Opcode },
9316     { Bad_Opcode },
9317     /* 50 */
9318     { Bad_Opcode },
9319     { Bad_Opcode },
9320     { Bad_Opcode },
9321     { Bad_Opcode },
9322     { Bad_Opcode },
9323     { Bad_Opcode },
9324     { Bad_Opcode },
9325     { Bad_Opcode },
9326     /* 58 */
9327     { Bad_Opcode },
9328     { Bad_Opcode },
9329     { Bad_Opcode },
9330     { Bad_Opcode },
9331     { PREFIX_TABLE (PREFIX_VEX_0F3A5C) },
9332     { PREFIX_TABLE (PREFIX_VEX_0F3A5D) },
9333     { PREFIX_TABLE (PREFIX_VEX_0F3A5E) },
9334     { PREFIX_TABLE (PREFIX_VEX_0F3A5F) },
9335     /* 60 */
9336     { PREFIX_TABLE (PREFIX_VEX_0F3A60) },
9337     { PREFIX_TABLE (PREFIX_VEX_0F3A61) },
9338     { PREFIX_TABLE (PREFIX_VEX_0F3A62) },
9339     { PREFIX_TABLE (PREFIX_VEX_0F3A63) },
9340     { Bad_Opcode },
9341     { Bad_Opcode },
9342     { Bad_Opcode },
9343     { Bad_Opcode },
9344     /* 68 */
9345     { PREFIX_TABLE (PREFIX_VEX_0F3A68) },
9346     { PREFIX_TABLE (PREFIX_VEX_0F3A69) },
9347     { PREFIX_TABLE (PREFIX_VEX_0F3A6A) },
9348     { PREFIX_TABLE (PREFIX_VEX_0F3A6B) },
9349     { PREFIX_TABLE (PREFIX_VEX_0F3A6C) },
9350     { PREFIX_TABLE (PREFIX_VEX_0F3A6D) },
9351     { PREFIX_TABLE (PREFIX_VEX_0F3A6E) },
9352     { PREFIX_TABLE (PREFIX_VEX_0F3A6F) },
9353     /* 70 */
9354     { Bad_Opcode },
9355     { Bad_Opcode },
9356     { Bad_Opcode },
9357     { Bad_Opcode },
9358     { Bad_Opcode },
9359     { Bad_Opcode },
9360     { Bad_Opcode },
9361     { Bad_Opcode },
9362     /* 78 */
9363     { PREFIX_TABLE (PREFIX_VEX_0F3A78) },
9364     { PREFIX_TABLE (PREFIX_VEX_0F3A79) },
9365     { PREFIX_TABLE (PREFIX_VEX_0F3A7A) },
9366     { PREFIX_TABLE (PREFIX_VEX_0F3A7B) },
9367     { PREFIX_TABLE (PREFIX_VEX_0F3A7C) },
9368     { PREFIX_TABLE (PREFIX_VEX_0F3A7D) },
9369     { PREFIX_TABLE (PREFIX_VEX_0F3A7E) },
9370     { PREFIX_TABLE (PREFIX_VEX_0F3A7F) },
9371     /* 80 */
9372     { Bad_Opcode },
9373     { Bad_Opcode },
9374     { Bad_Opcode },
9375     { Bad_Opcode },
9376     { Bad_Opcode },
9377     { Bad_Opcode },
9378     { Bad_Opcode },
9379     { Bad_Opcode },
9380     /* 88 */
9381     { Bad_Opcode },
9382     { Bad_Opcode },
9383     { Bad_Opcode },
9384     { Bad_Opcode },
9385     { Bad_Opcode },
9386     { Bad_Opcode },
9387     { Bad_Opcode },
9388     { Bad_Opcode },
9389     /* 90 */
9390     { Bad_Opcode },
9391     { Bad_Opcode },
9392     { Bad_Opcode },
9393     { Bad_Opcode },
9394     { Bad_Opcode },
9395     { Bad_Opcode },
9396     { Bad_Opcode },
9397     { Bad_Opcode },
9398     /* 98 */
9399     { Bad_Opcode },
9400     { Bad_Opcode },
9401     { Bad_Opcode },
9402     { Bad_Opcode },
9403     { Bad_Opcode },
9404     { Bad_Opcode },
9405     { Bad_Opcode },
9406     { Bad_Opcode },
9407     /* a0 */
9408     { Bad_Opcode },
9409     { Bad_Opcode },
9410     { Bad_Opcode },
9411     { Bad_Opcode },
9412     { Bad_Opcode },
9413     { Bad_Opcode },
9414     { Bad_Opcode },
9415     { Bad_Opcode },
9416     /* a8 */
9417     { Bad_Opcode },
9418     { Bad_Opcode },
9419     { Bad_Opcode },
9420     { Bad_Opcode },
9421     { Bad_Opcode },
9422     { Bad_Opcode },
9423     { Bad_Opcode },
9424     { Bad_Opcode },
9425     /* b0 */
9426     { Bad_Opcode },
9427     { Bad_Opcode },
9428     { Bad_Opcode },
9429     { Bad_Opcode },
9430     { Bad_Opcode },
9431     { Bad_Opcode },
9432     { Bad_Opcode },
9433     { Bad_Opcode },
9434     /* b8 */
9435     { Bad_Opcode },
9436     { Bad_Opcode },
9437     { Bad_Opcode },
9438     { Bad_Opcode },
9439     { Bad_Opcode },
9440     { Bad_Opcode },
9441     { Bad_Opcode },
9442     { Bad_Opcode },
9443     /* c0 */
9444     { Bad_Opcode },
9445     { Bad_Opcode },
9446     { Bad_Opcode },
9447     { Bad_Opcode },
9448     { Bad_Opcode },
9449     { Bad_Opcode },
9450     { Bad_Opcode },
9451     { Bad_Opcode },
9452     /* c8 */
9453     { Bad_Opcode },
9454     { Bad_Opcode },
9455     { Bad_Opcode },
9456     { Bad_Opcode },
9457     { Bad_Opcode },
9458     { Bad_Opcode },
9459     { Bad_Opcode },
9460     { Bad_Opcode },
9461     /* d0 */
9462     { Bad_Opcode },
9463     { Bad_Opcode },
9464     { Bad_Opcode },
9465     { Bad_Opcode },
9466     { Bad_Opcode },
9467     { Bad_Opcode },
9468     { Bad_Opcode },
9469     { Bad_Opcode },
9470     /* d8 */
9471     { Bad_Opcode },
9472     { Bad_Opcode },
9473     { Bad_Opcode },
9474     { Bad_Opcode },
9475     { Bad_Opcode },
9476     { Bad_Opcode },
9477     { Bad_Opcode },
9478     { PREFIX_TABLE (PREFIX_VEX_0F3ADF) },
9479     /* e0 */
9480     { Bad_Opcode },
9481     { Bad_Opcode },
9482     { Bad_Opcode },
9483     { Bad_Opcode },
9484     { Bad_Opcode },
9485     { Bad_Opcode },
9486     { Bad_Opcode },
9487     { Bad_Opcode },
9488     /* e8 */
9489     { Bad_Opcode },
9490     { Bad_Opcode },
9491     { Bad_Opcode },
9492     { Bad_Opcode },
9493     { Bad_Opcode },
9494     { Bad_Opcode },
9495     { Bad_Opcode },
9496     { Bad_Opcode },
9497     /* f0 */
9498     { PREFIX_TABLE (PREFIX_VEX_0F3AF0) },
9499     { Bad_Opcode },
9500     { Bad_Opcode },
9501     { Bad_Opcode },
9502     { Bad_Opcode },
9503     { Bad_Opcode },
9504     { Bad_Opcode },
9505     { Bad_Opcode },
9506     /* f8 */
9507     { Bad_Opcode },
9508     { Bad_Opcode },
9509     { Bad_Opcode },
9510     { Bad_Opcode },
9511     { Bad_Opcode },
9512     { Bad_Opcode },
9513     { Bad_Opcode },
9514     { Bad_Opcode },
9515   },
9516 };
9517
9518 #define NEED_OPCODE_TABLE
9519 #include "i386-dis-evex.h"
9520 #undef NEED_OPCODE_TABLE
9521 static const struct dis386 vex_len_table[][2] = {
9522   /* VEX_LEN_0F10_P_1 */
9523   {
9524     { VEX_W_TABLE (VEX_W_0F10_P_1) },
9525     { VEX_W_TABLE (VEX_W_0F10_P_1) },
9526   },
9527
9528   /* VEX_LEN_0F10_P_3 */
9529   {
9530     { VEX_W_TABLE (VEX_W_0F10_P_3) },
9531     { VEX_W_TABLE (VEX_W_0F10_P_3) },
9532   },
9533
9534   /* VEX_LEN_0F11_P_1 */
9535   {
9536     { VEX_W_TABLE (VEX_W_0F11_P_1) },
9537     { VEX_W_TABLE (VEX_W_0F11_P_1) },
9538   },
9539
9540   /* VEX_LEN_0F11_P_3 */
9541   {
9542     { VEX_W_TABLE (VEX_W_0F11_P_3) },
9543     { VEX_W_TABLE (VEX_W_0F11_P_3) },
9544   },
9545
9546   /* VEX_LEN_0F12_P_0_M_0 */
9547   {
9548     { VEX_W_TABLE (VEX_W_0F12_P_0_M_0) },
9549   },
9550
9551   /* VEX_LEN_0F12_P_0_M_1 */
9552   {
9553     { VEX_W_TABLE (VEX_W_0F12_P_0_M_1) },
9554   },
9555
9556   /* VEX_LEN_0F12_P_2 */
9557   {
9558     { VEX_W_TABLE (VEX_W_0F12_P_2) },
9559   },
9560
9561   /* VEX_LEN_0F13_M_0 */
9562   {
9563     { VEX_W_TABLE (VEX_W_0F13_M_0) },
9564   },
9565
9566   /* VEX_LEN_0F16_P_0_M_0 */
9567   {
9568     { VEX_W_TABLE (VEX_W_0F16_P_0_M_0) },
9569   },
9570
9571   /* VEX_LEN_0F16_P_0_M_1 */
9572   {
9573     { VEX_W_TABLE (VEX_W_0F16_P_0_M_1) },
9574   },
9575
9576   /* VEX_LEN_0F16_P_2 */
9577   {
9578     { VEX_W_TABLE (VEX_W_0F16_P_2) },
9579   },
9580
9581   /* VEX_LEN_0F17_M_0 */
9582   {
9583     { VEX_W_TABLE (VEX_W_0F17_M_0) },
9584   },
9585
9586   /* VEX_LEN_0F2A_P_1 */
9587   {
9588     { "vcvtsi2ss%LQ",   { XMScalar, VexScalar, Ev }, 0 },
9589     { "vcvtsi2ss%LQ",   { XMScalar, VexScalar, Ev }, 0 },
9590   },
9591
9592   /* VEX_LEN_0F2A_P_3 */
9593   {
9594     { "vcvtsi2sd%LQ",   { XMScalar, VexScalar, Ev }, 0 },
9595     { "vcvtsi2sd%LQ",   { XMScalar, VexScalar, Ev }, 0 },
9596   },
9597
9598   /* VEX_LEN_0F2C_P_1 */
9599   {
9600     { "vcvttss2siY",    { Gv, EXdScalar }, 0 },
9601     { "vcvttss2siY",    { Gv, EXdScalar }, 0 },
9602   },
9603
9604   /* VEX_LEN_0F2C_P_3 */
9605   {
9606     { "vcvttsd2siY",    { Gv, EXqScalar }, 0 },
9607     { "vcvttsd2siY",    { Gv, EXqScalar }, 0 },
9608   },
9609
9610   /* VEX_LEN_0F2D_P_1 */
9611   {
9612     { "vcvtss2siY",     { Gv, EXdScalar }, 0 },
9613     { "vcvtss2siY",     { Gv, EXdScalar }, 0 },
9614   },
9615
9616   /* VEX_LEN_0F2D_P_3 */
9617   {
9618     { "vcvtsd2siY",     { Gv, EXqScalar }, 0 },
9619     { "vcvtsd2siY",     { Gv, EXqScalar }, 0 },
9620   },
9621
9622   /* VEX_LEN_0F2E_P_0 */
9623   {
9624     { VEX_W_TABLE (VEX_W_0F2E_P_0) },
9625     { VEX_W_TABLE (VEX_W_0F2E_P_0) },
9626   },
9627
9628   /* VEX_LEN_0F2E_P_2 */
9629   {
9630     { VEX_W_TABLE (VEX_W_0F2E_P_2) },
9631     { VEX_W_TABLE (VEX_W_0F2E_P_2) },
9632   },
9633
9634   /* VEX_LEN_0F2F_P_0 */
9635   {
9636     { VEX_W_TABLE (VEX_W_0F2F_P_0) },
9637     { VEX_W_TABLE (VEX_W_0F2F_P_0) },
9638   },
9639
9640   /* VEX_LEN_0F2F_P_2 */
9641   {
9642     { VEX_W_TABLE (VEX_W_0F2F_P_2) },
9643     { VEX_W_TABLE (VEX_W_0F2F_P_2) },
9644   },
9645
9646   /* VEX_LEN_0F41_P_0 */
9647   {
9648     { Bad_Opcode },
9649     { VEX_W_TABLE (VEX_W_0F41_P_0_LEN_1) },
9650   },
9651   /* VEX_LEN_0F41_P_2 */
9652   {
9653     { Bad_Opcode },
9654     { VEX_W_TABLE (VEX_W_0F41_P_2_LEN_1) },
9655   },
9656   /* VEX_LEN_0F42_P_0 */
9657   {
9658     { Bad_Opcode },
9659     { VEX_W_TABLE (VEX_W_0F42_P_0_LEN_1) },
9660   },
9661   /* VEX_LEN_0F42_P_2 */
9662   {
9663     { Bad_Opcode },
9664     { VEX_W_TABLE (VEX_W_0F42_P_2_LEN_1) },
9665   },
9666   /* VEX_LEN_0F44_P_0 */
9667   {
9668     { VEX_W_TABLE (VEX_W_0F44_P_0_LEN_0) },
9669   },
9670   /* VEX_LEN_0F44_P_2 */
9671   {
9672     { VEX_W_TABLE (VEX_W_0F44_P_2_LEN_0) },
9673   },
9674   /* VEX_LEN_0F45_P_0 */
9675   {
9676     { Bad_Opcode },
9677     { VEX_W_TABLE (VEX_W_0F45_P_0_LEN_1) },
9678   },
9679   /* VEX_LEN_0F45_P_2 */
9680   {
9681     { Bad_Opcode },
9682     { VEX_W_TABLE (VEX_W_0F45_P_2_LEN_1) },
9683   },
9684   /* VEX_LEN_0F46_P_0 */
9685   {
9686     { Bad_Opcode },
9687     { VEX_W_TABLE (VEX_W_0F46_P_0_LEN_1) },
9688   },
9689   /* VEX_LEN_0F46_P_2 */
9690   {
9691     { Bad_Opcode },
9692     { VEX_W_TABLE (VEX_W_0F46_P_2_LEN_1) },
9693   },
9694   /* VEX_LEN_0F47_P_0 */
9695   {
9696     { Bad_Opcode },
9697     { VEX_W_TABLE (VEX_W_0F47_P_0_LEN_1) },
9698   },
9699   /* VEX_LEN_0F47_P_2 */
9700   {
9701     { Bad_Opcode },
9702     { VEX_W_TABLE (VEX_W_0F47_P_2_LEN_1) },
9703   },
9704   /* VEX_LEN_0F4A_P_0 */
9705   {
9706     { Bad_Opcode },
9707     { VEX_W_TABLE (VEX_W_0F4A_P_0_LEN_1) },
9708   },
9709   /* VEX_LEN_0F4A_P_2 */
9710   {
9711     { Bad_Opcode },
9712     { VEX_W_TABLE (VEX_W_0F4A_P_2_LEN_1) },
9713   },
9714   /* VEX_LEN_0F4B_P_0 */
9715   {
9716     { Bad_Opcode },
9717     { VEX_W_TABLE (VEX_W_0F4B_P_0_LEN_1) },
9718   },
9719   /* VEX_LEN_0F4B_P_2 */
9720   {
9721     { Bad_Opcode },
9722     { VEX_W_TABLE (VEX_W_0F4B_P_2_LEN_1) },
9723   },
9724
9725   /* VEX_LEN_0F51_P_1 */
9726   {
9727     { VEX_W_TABLE (VEX_W_0F51_P_1) },
9728     { VEX_W_TABLE (VEX_W_0F51_P_1) },
9729   },
9730
9731   /* VEX_LEN_0F51_P_3 */
9732   {
9733     { VEX_W_TABLE (VEX_W_0F51_P_3) },
9734     { VEX_W_TABLE (VEX_W_0F51_P_3) },
9735   },
9736
9737   /* VEX_LEN_0F52_P_1 */
9738   {
9739     { VEX_W_TABLE (VEX_W_0F52_P_1) },
9740     { VEX_W_TABLE (VEX_W_0F52_P_1) },
9741   },
9742
9743   /* VEX_LEN_0F53_P_1 */
9744   {
9745     { VEX_W_TABLE (VEX_W_0F53_P_1) },
9746     { VEX_W_TABLE (VEX_W_0F53_P_1) },
9747   },
9748
9749   /* VEX_LEN_0F58_P_1 */
9750   {
9751     { VEX_W_TABLE (VEX_W_0F58_P_1) },
9752     { VEX_W_TABLE (VEX_W_0F58_P_1) },
9753   },
9754
9755   /* VEX_LEN_0F58_P_3 */
9756   {
9757     { VEX_W_TABLE (VEX_W_0F58_P_3) },
9758     { VEX_W_TABLE (VEX_W_0F58_P_3) },
9759   },
9760
9761   /* VEX_LEN_0F59_P_1 */
9762   {
9763     { VEX_W_TABLE (VEX_W_0F59_P_1) },
9764     { VEX_W_TABLE (VEX_W_0F59_P_1) },
9765   },
9766
9767   /* VEX_LEN_0F59_P_3 */
9768   {
9769     { VEX_W_TABLE (VEX_W_0F59_P_3) },
9770     { VEX_W_TABLE (VEX_W_0F59_P_3) },
9771   },
9772
9773   /* VEX_LEN_0F5A_P_1 */
9774   {
9775     { VEX_W_TABLE (VEX_W_0F5A_P_1) },
9776     { VEX_W_TABLE (VEX_W_0F5A_P_1) },
9777   },
9778
9779   /* VEX_LEN_0F5A_P_3 */
9780   {
9781     { VEX_W_TABLE (VEX_W_0F5A_P_3) },
9782     { VEX_W_TABLE (VEX_W_0F5A_P_3) },
9783   },
9784
9785   /* VEX_LEN_0F5C_P_1 */
9786   {
9787     { VEX_W_TABLE (VEX_W_0F5C_P_1) },
9788     { VEX_W_TABLE (VEX_W_0F5C_P_1) },
9789   },
9790
9791   /* VEX_LEN_0F5C_P_3 */
9792   {
9793     { VEX_W_TABLE (VEX_W_0F5C_P_3) },
9794     { VEX_W_TABLE (VEX_W_0F5C_P_3) },
9795   },
9796
9797   /* VEX_LEN_0F5D_P_1 */
9798   {
9799     { VEX_W_TABLE (VEX_W_0F5D_P_1) },
9800     { VEX_W_TABLE (VEX_W_0F5D_P_1) },
9801   },
9802
9803   /* VEX_LEN_0F5D_P_3 */
9804   {
9805     { VEX_W_TABLE (VEX_W_0F5D_P_3) },
9806     { VEX_W_TABLE (VEX_W_0F5D_P_3) },
9807   },
9808
9809   /* VEX_LEN_0F5E_P_1 */
9810   {
9811     { VEX_W_TABLE (VEX_W_0F5E_P_1) },
9812     { VEX_W_TABLE (VEX_W_0F5E_P_1) },
9813   },
9814
9815   /* VEX_LEN_0F5E_P_3 */
9816   {
9817     { VEX_W_TABLE (VEX_W_0F5E_P_3) },
9818     { VEX_W_TABLE (VEX_W_0F5E_P_3) },
9819   },
9820
9821   /* VEX_LEN_0F5F_P_1 */
9822   {
9823     { VEX_W_TABLE (VEX_W_0F5F_P_1) },
9824     { VEX_W_TABLE (VEX_W_0F5F_P_1) },
9825   },
9826
9827   /* VEX_LEN_0F5F_P_3 */
9828   {
9829     { VEX_W_TABLE (VEX_W_0F5F_P_3) },
9830     { VEX_W_TABLE (VEX_W_0F5F_P_3) },
9831   },
9832
9833   /* VEX_LEN_0F6E_P_2 */
9834   {
9835     { "vmovK",          { XMScalar, Edq }, 0 },
9836     { "vmovK",          { XMScalar, Edq }, 0 },
9837   },
9838
9839   /* VEX_LEN_0F7E_P_1 */
9840   {
9841     { VEX_W_TABLE (VEX_W_0F7E_P_1) },
9842     { VEX_W_TABLE (VEX_W_0F7E_P_1) },
9843   },
9844
9845   /* VEX_LEN_0F7E_P_2 */
9846   {
9847     { "vmovK",          { Edq, XMScalar }, 0 },
9848     { "vmovK",          { Edq, XMScalar }, 0 },
9849   },
9850
9851   /* VEX_LEN_0F90_P_0 */
9852   {
9853     { VEX_W_TABLE (VEX_W_0F90_P_0_LEN_0) },
9854   },
9855
9856   /* VEX_LEN_0F90_P_2 */
9857   {
9858     { VEX_W_TABLE (VEX_W_0F90_P_2_LEN_0) },
9859   },
9860
9861   /* VEX_LEN_0F91_P_0 */
9862   {
9863     { VEX_W_TABLE (VEX_W_0F91_P_0_LEN_0) },
9864   },
9865
9866   /* VEX_LEN_0F91_P_2 */
9867   {
9868     { VEX_W_TABLE (VEX_W_0F91_P_2_LEN_0) },
9869   },
9870
9871   /* VEX_LEN_0F92_P_0 */
9872   {
9873     { VEX_W_TABLE (VEX_W_0F92_P_0_LEN_0) },
9874   },
9875
9876   /* VEX_LEN_0F92_P_2 */
9877   {
9878     { VEX_W_TABLE (VEX_W_0F92_P_2_LEN_0) },
9879   },
9880
9881   /* VEX_LEN_0F92_P_3 */
9882   {
9883     { VEX_W_TABLE (VEX_W_0F92_P_3_LEN_0) },
9884   },
9885
9886   /* VEX_LEN_0F93_P_0 */
9887   {
9888     { VEX_W_TABLE (VEX_W_0F93_P_0_LEN_0) },
9889   },
9890
9891   /* VEX_LEN_0F93_P_2 */
9892   {
9893     { VEX_W_TABLE (VEX_W_0F93_P_2_LEN_0) },
9894   },
9895
9896   /* VEX_LEN_0F93_P_3 */
9897   {
9898     { VEX_W_TABLE (VEX_W_0F93_P_3_LEN_0) },
9899   },
9900
9901   /* VEX_LEN_0F98_P_0 */
9902   {
9903     { VEX_W_TABLE (VEX_W_0F98_P_0_LEN_0) },
9904   },
9905
9906   /* VEX_LEN_0F98_P_2 */
9907   {
9908     { VEX_W_TABLE (VEX_W_0F98_P_2_LEN_0) },
9909   },
9910
9911   /* VEX_LEN_0F99_P_0 */
9912   {
9913     { VEX_W_TABLE (VEX_W_0F99_P_0_LEN_0) },
9914   },
9915
9916   /* VEX_LEN_0F99_P_2 */
9917   {
9918     { VEX_W_TABLE (VEX_W_0F99_P_2_LEN_0) },
9919   },
9920
9921   /* VEX_LEN_0FAE_R_2_M_0 */
9922   {
9923     { VEX_W_TABLE (VEX_W_0FAE_R_2_M_0) },
9924   },
9925
9926   /* VEX_LEN_0FAE_R_3_M_0 */
9927   {
9928     { VEX_W_TABLE (VEX_W_0FAE_R_3_M_0) },
9929   },
9930
9931   /* VEX_LEN_0FC2_P_1 */
9932   {
9933     { VEX_W_TABLE (VEX_W_0FC2_P_1) },
9934     { VEX_W_TABLE (VEX_W_0FC2_P_1) },
9935   },
9936
9937   /* VEX_LEN_0FC2_P_3 */
9938   {
9939     { VEX_W_TABLE (VEX_W_0FC2_P_3) },
9940     { VEX_W_TABLE (VEX_W_0FC2_P_3) },
9941   },
9942
9943   /* VEX_LEN_0FC4_P_2 */
9944   {
9945     { VEX_W_TABLE (VEX_W_0FC4_P_2) },
9946   },
9947
9948   /* VEX_LEN_0FC5_P_2 */
9949   {
9950     { VEX_W_TABLE (VEX_W_0FC5_P_2) },
9951   },
9952
9953   /* VEX_LEN_0FD6_P_2 */
9954   {
9955     { VEX_W_TABLE (VEX_W_0FD6_P_2) },
9956     { VEX_W_TABLE (VEX_W_0FD6_P_2) },
9957   },
9958
9959   /* VEX_LEN_0FF7_P_2 */
9960   {
9961     { VEX_W_TABLE (VEX_W_0FF7_P_2) },
9962   },
9963
9964   /* VEX_LEN_0F3816_P_2 */
9965   {
9966     { Bad_Opcode },
9967     { VEX_W_TABLE (VEX_W_0F3816_P_2) },
9968   },
9969
9970   /* VEX_LEN_0F3819_P_2 */
9971   {
9972     { Bad_Opcode },
9973     { VEX_W_TABLE (VEX_W_0F3819_P_2) },
9974   },
9975
9976   /* VEX_LEN_0F381A_P_2_M_0 */
9977   {
9978     { Bad_Opcode },
9979     { VEX_W_TABLE (VEX_W_0F381A_P_2_M_0) },
9980   },
9981
9982   /* VEX_LEN_0F3836_P_2 */
9983   {
9984     { Bad_Opcode },
9985     { VEX_W_TABLE (VEX_W_0F3836_P_2) },
9986   },
9987
9988   /* VEX_LEN_0F3841_P_2 */
9989   {
9990     { VEX_W_TABLE (VEX_W_0F3841_P_2) },
9991   },
9992
9993   /* VEX_LEN_0F385A_P_2_M_0 */
9994   {
9995     { Bad_Opcode },
9996     { VEX_W_TABLE (VEX_W_0F385A_P_2_M_0) },
9997   },
9998
9999   /* VEX_LEN_0F38DB_P_2 */
10000   {
10001     { VEX_W_TABLE (VEX_W_0F38DB_P_2) },
10002   },
10003
10004   /* VEX_LEN_0F38DC_P_2 */
10005   {
10006     { VEX_W_TABLE (VEX_W_0F38DC_P_2) },
10007   },
10008
10009   /* VEX_LEN_0F38DD_P_2 */
10010   {
10011     { VEX_W_TABLE (VEX_W_0F38DD_P_2) },
10012   },
10013
10014   /* VEX_LEN_0F38DE_P_2 */
10015   {
10016     { VEX_W_TABLE (VEX_W_0F38DE_P_2) },
10017   },
10018
10019   /* VEX_LEN_0F38DF_P_2 */
10020   {
10021     { VEX_W_TABLE (VEX_W_0F38DF_P_2) },
10022   },
10023
10024   /* VEX_LEN_0F38F2_P_0 */
10025   {
10026     { "andnS",          { Gdq, VexGdq, Edq }, 0 },
10027   },
10028
10029   /* VEX_LEN_0F38F3_R_1_P_0 */
10030   {
10031     { "blsrS",          { VexGdq, Edq }, 0 },
10032   },
10033
10034   /* VEX_LEN_0F38F3_R_2_P_0 */
10035   {
10036     { "blsmskS",        { VexGdq, Edq }, 0 },
10037   },
10038
10039   /* VEX_LEN_0F38F3_R_3_P_0 */
10040   {
10041     { "blsiS",          { VexGdq, Edq }, 0 },
10042   },
10043
10044   /* VEX_LEN_0F38F5_P_0 */
10045   {
10046     { "bzhiS",          { Gdq, Edq, VexGdq }, 0 },
10047   },
10048
10049   /* VEX_LEN_0F38F5_P_1 */
10050   {
10051     { "pextS",          { Gdq, VexGdq, Edq }, 0 },
10052   },
10053
10054   /* VEX_LEN_0F38F5_P_3 */
10055   {
10056     { "pdepS",          { Gdq, VexGdq, Edq }, 0 },
10057   },
10058
10059   /* VEX_LEN_0F38F6_P_3 */
10060   {
10061     { "mulxS",          { Gdq, VexGdq, Edq }, 0 },
10062   },
10063
10064   /* VEX_LEN_0F38F7_P_0 */
10065   {
10066     { "bextrS",         { Gdq, Edq, VexGdq }, 0 },
10067   },
10068
10069   /* VEX_LEN_0F38F7_P_1 */
10070   {
10071     { "sarxS",          { Gdq, Edq, VexGdq }, 0 },
10072   },
10073
10074   /* VEX_LEN_0F38F7_P_2 */
10075   {
10076     { "shlxS",          { Gdq, Edq, VexGdq }, 0 },
10077   },
10078
10079   /* VEX_LEN_0F38F7_P_3 */
10080   {
10081     { "shrxS",          { Gdq, Edq, VexGdq }, 0 },
10082   },
10083
10084   /* VEX_LEN_0F3A00_P_2 */
10085   {
10086     { Bad_Opcode },
10087     { VEX_W_TABLE (VEX_W_0F3A00_P_2) },
10088   },
10089
10090   /* VEX_LEN_0F3A01_P_2 */
10091   {
10092     { Bad_Opcode },
10093     { VEX_W_TABLE (VEX_W_0F3A01_P_2) },
10094   },
10095
10096   /* VEX_LEN_0F3A06_P_2 */
10097   {
10098     { Bad_Opcode },
10099     { VEX_W_TABLE (VEX_W_0F3A06_P_2) },
10100   },
10101
10102   /* VEX_LEN_0F3A0A_P_2 */
10103   {
10104     { VEX_W_TABLE (VEX_W_0F3A0A_P_2) },
10105     { VEX_W_TABLE (VEX_W_0F3A0A_P_2) },
10106   },
10107
10108   /* VEX_LEN_0F3A0B_P_2 */
10109   {
10110     { VEX_W_TABLE (VEX_W_0F3A0B_P_2) },
10111     { VEX_W_TABLE (VEX_W_0F3A0B_P_2) },
10112   },
10113
10114   /* VEX_LEN_0F3A14_P_2 */
10115   {
10116     { VEX_W_TABLE (VEX_W_0F3A14_P_2) },
10117   },
10118
10119   /* VEX_LEN_0F3A15_P_2 */
10120   {
10121     { VEX_W_TABLE (VEX_W_0F3A15_P_2) },
10122   },
10123
10124   /* VEX_LEN_0F3A16_P_2  */
10125   {
10126     { "vpextrK",        { Edq, XM, Ib }, 0 },
10127   },
10128
10129   /* VEX_LEN_0F3A17_P_2 */
10130   {
10131     { "vextractps",     { Edqd, XM, Ib }, 0 },
10132   },
10133
10134   /* VEX_LEN_0F3A18_P_2 */
10135   {
10136     { Bad_Opcode },
10137     { VEX_W_TABLE (VEX_W_0F3A18_P_2) },
10138   },
10139
10140   /* VEX_LEN_0F3A19_P_2 */
10141   {
10142     { Bad_Opcode },
10143     { VEX_W_TABLE (VEX_W_0F3A19_P_2) },
10144   },
10145
10146   /* VEX_LEN_0F3A20_P_2 */
10147   {
10148     { VEX_W_TABLE (VEX_W_0F3A20_P_2) },
10149   },
10150
10151   /* VEX_LEN_0F3A21_P_2 */
10152   {
10153     { VEX_W_TABLE (VEX_W_0F3A21_P_2) },
10154   },
10155
10156   /* VEX_LEN_0F3A22_P_2 */
10157   {
10158     { "vpinsrK",        { XM, Vex128, Edq, Ib }, 0 },
10159   },
10160
10161   /* VEX_LEN_0F3A30_P_2 */
10162   {
10163     { VEX_W_TABLE (VEX_W_0F3A30_P_2_LEN_0) },
10164   },
10165
10166   /* VEX_LEN_0F3A31_P_2 */
10167   {
10168     { VEX_W_TABLE (VEX_W_0F3A31_P_2_LEN_0) },
10169   },
10170
10171   /* VEX_LEN_0F3A32_P_2 */
10172   {
10173     { VEX_W_TABLE (VEX_W_0F3A32_P_2_LEN_0) },
10174   },
10175
10176   /* VEX_LEN_0F3A33_P_2 */
10177   {
10178     { VEX_W_TABLE (VEX_W_0F3A33_P_2_LEN_0) },
10179   },
10180
10181   /* VEX_LEN_0F3A38_P_2 */
10182   {
10183     { Bad_Opcode },
10184     { VEX_W_TABLE (VEX_W_0F3A38_P_2) },
10185   },
10186
10187   /* VEX_LEN_0F3A39_P_2 */
10188   {
10189     { Bad_Opcode },
10190     { VEX_W_TABLE (VEX_W_0F3A39_P_2) },
10191   },
10192
10193   /* VEX_LEN_0F3A41_P_2 */
10194   {
10195     { VEX_W_TABLE (VEX_W_0F3A41_P_2) },
10196   },
10197
10198   /* VEX_LEN_0F3A44_P_2 */
10199   {
10200     { VEX_W_TABLE (VEX_W_0F3A44_P_2) },
10201   },
10202
10203   /* VEX_LEN_0F3A46_P_2 */
10204   {
10205     { Bad_Opcode },
10206     { VEX_W_TABLE (VEX_W_0F3A46_P_2) },
10207   },
10208
10209   /* VEX_LEN_0F3A60_P_2 */
10210   {
10211     { VEX_W_TABLE (VEX_W_0F3A60_P_2) },
10212   },
10213
10214   /* VEX_LEN_0F3A61_P_2 */
10215   {
10216     { VEX_W_TABLE (VEX_W_0F3A61_P_2) },
10217   },
10218
10219   /* VEX_LEN_0F3A62_P_2 */
10220   {
10221     { VEX_W_TABLE (VEX_W_0F3A62_P_2) },
10222   },
10223
10224   /* VEX_LEN_0F3A63_P_2 */
10225   {
10226     { VEX_W_TABLE (VEX_W_0F3A63_P_2) },
10227   },
10228
10229   /* VEX_LEN_0F3A6A_P_2 */
10230   {
10231     { "vfmaddss",       { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 }, 0 },
10232   },
10233
10234   /* VEX_LEN_0F3A6B_P_2 */
10235   {
10236     { "vfmaddsd",       { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 }, 0 },
10237   },
10238
10239   /* VEX_LEN_0F3A6E_P_2 */
10240   {
10241     { "vfmsubss",       { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 }, 0 },
10242   },
10243
10244   /* VEX_LEN_0F3A6F_P_2 */
10245   {
10246     { "vfmsubsd",       { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 }, 0 },
10247   },
10248
10249   /* VEX_LEN_0F3A7A_P_2 */
10250   {
10251     { "vfnmaddss",      { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 }, 0 },
10252   },
10253
10254   /* VEX_LEN_0F3A7B_P_2 */
10255   {
10256     { "vfnmaddsd",      { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 }, 0 },
10257   },
10258
10259   /* VEX_LEN_0F3A7E_P_2 */
10260   {
10261     { "vfnmsubss",      { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 }, 0 },
10262   },
10263
10264   /* VEX_LEN_0F3A7F_P_2 */
10265   {
10266     { "vfnmsubsd",      { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 }, 0 },
10267   },
10268
10269   /* VEX_LEN_0F3ADF_P_2 */
10270   {
10271     { VEX_W_TABLE (VEX_W_0F3ADF_P_2) },
10272   },
10273
10274   /* VEX_LEN_0F3AF0_P_3 */
10275   {
10276     { "rorxS",          { Gdq, Edq, Ib }, 0 },
10277   },
10278
10279   /* VEX_LEN_0FXOP_08_CC */
10280   {
10281      { "vpcomb",        { XM, Vex128, EXx, Ib }, 0 },
10282   },
10283
10284   /* VEX_LEN_0FXOP_08_CD */
10285   {
10286      { "vpcomw",        { XM, Vex128, EXx, Ib }, 0 },
10287   },
10288
10289   /* VEX_LEN_0FXOP_08_CE */
10290   {
10291      { "vpcomd",        { XM, Vex128, EXx, Ib }, 0 },
10292   },
10293
10294   /* VEX_LEN_0FXOP_08_CF */
10295   {
10296      { "vpcomq",        { XM, Vex128, EXx, Ib }, 0 },
10297   },
10298
10299   /* VEX_LEN_0FXOP_08_EC */
10300   {
10301      { "vpcomub",       { XM, Vex128, EXx, Ib }, 0 },
10302   },
10303
10304   /* VEX_LEN_0FXOP_08_ED */
10305   {
10306      { "vpcomuw",       { XM, Vex128, EXx, Ib }, 0 },
10307   },
10308
10309   /* VEX_LEN_0FXOP_08_EE */
10310   {
10311      { "vpcomud",       { XM, Vex128, EXx, Ib }, 0 },
10312   },
10313
10314   /* VEX_LEN_0FXOP_08_EF */
10315   {
10316      { "vpcomuq",       { XM, Vex128, EXx, Ib }, 0 },
10317   },
10318
10319   /* VEX_LEN_0FXOP_09_80 */
10320   {
10321     { "vfrczps",        { XM, EXxmm }, 0 },
10322     { "vfrczps",        { XM, EXymmq }, 0 },
10323   },
10324
10325   /* VEX_LEN_0FXOP_09_81 */
10326   {
10327     { "vfrczpd",        { XM, EXxmm }, 0 },
10328     { "vfrczpd",        { XM, EXymmq }, 0 },
10329   },
10330 };
10331
10332 static const struct dis386 vex_w_table[][2] = {
10333   {
10334     /* VEX_W_0F10_P_0 */
10335     { "vmovups",        { XM, EXx }, 0 },
10336   },
10337   {
10338     /* VEX_W_0F10_P_1 */
10339     { "vmovss",         { XMVexScalar, VexScalar, EXdScalar }, 0 },
10340   },
10341   {
10342     /* VEX_W_0F10_P_2 */
10343     { "vmovupd",        { XM, EXx }, 0 },
10344   },
10345   {
10346     /* VEX_W_0F10_P_3 */
10347     { "vmovsd",         { XMVexScalar, VexScalar, EXqScalar }, 0 },
10348   },
10349   {
10350     /* VEX_W_0F11_P_0 */
10351     { "vmovups",        { EXxS, XM }, 0 },
10352   },
10353   {
10354     /* VEX_W_0F11_P_1 */
10355     { "vmovss",         { EXdVexScalarS, VexScalar, XMScalar }, 0 },
10356   },
10357   {
10358     /* VEX_W_0F11_P_2 */
10359     { "vmovupd",        { EXxS, XM }, 0 },
10360   },
10361   {
10362     /* VEX_W_0F11_P_3 */
10363     { "vmovsd",         { EXqVexScalarS, VexScalar, XMScalar }, 0 },
10364   },
10365   {
10366     /* VEX_W_0F12_P_0_M_0 */
10367     { "vmovlps",        { XM, Vex128, EXq }, 0 },
10368   },
10369   {
10370     /* VEX_W_0F12_P_0_M_1 */
10371     { "vmovhlps",       { XM, Vex128, EXq }, 0 },
10372   },
10373   {
10374     /* VEX_W_0F12_P_1 */
10375     { "vmovsldup",      { XM, EXx }, 0 },
10376   },
10377   {
10378     /* VEX_W_0F12_P_2 */
10379     { "vmovlpd",        { XM, Vex128, EXq }, 0 },
10380   },
10381   {
10382     /* VEX_W_0F12_P_3 */
10383     { "vmovddup",       { XM, EXymmq }, 0 },
10384   },
10385   {
10386     /* VEX_W_0F13_M_0 */
10387     { "vmovlpX",        { EXq, XM }, 0 },
10388   },
10389   {
10390     /* VEX_W_0F14 */
10391     { "vunpcklpX",      { XM, Vex, EXx }, 0 },
10392   },
10393   {
10394     /* VEX_W_0F15 */
10395     { "vunpckhpX",      { XM, Vex, EXx }, 0 },
10396   },
10397   {
10398     /* VEX_W_0F16_P_0_M_0 */
10399     { "vmovhps",        { XM, Vex128, EXq }, 0 },
10400   },
10401   {
10402     /* VEX_W_0F16_P_0_M_1 */
10403     { "vmovlhps",       { XM, Vex128, EXq }, 0 },
10404   },
10405   {
10406     /* VEX_W_0F16_P_1 */
10407     { "vmovshdup",      { XM, EXx }, 0 },
10408   },
10409   {
10410     /* VEX_W_0F16_P_2 */
10411     { "vmovhpd",        { XM, Vex128, EXq }, 0 },
10412   },
10413   {
10414     /* VEX_W_0F17_M_0 */
10415     { "vmovhpX",        { EXq, XM }, 0 },
10416   },
10417   {
10418     /* VEX_W_0F28 */
10419     { "vmovapX",        { XM, EXx }, 0 },
10420   },
10421   {
10422     /* VEX_W_0F29 */
10423     { "vmovapX",        { EXxS, XM }, 0 },
10424   },
10425   {
10426     /* VEX_W_0F2B_M_0 */
10427     { "vmovntpX",       { Mx, XM }, 0 },
10428   },
10429   {
10430     /* VEX_W_0F2E_P_0 */
10431     { "vucomiss",       { XMScalar, EXdScalar }, 0 },
10432   },
10433   {
10434     /* VEX_W_0F2E_P_2 */
10435     { "vucomisd",       { XMScalar, EXqScalar }, 0 },
10436   },
10437   {
10438     /* VEX_W_0F2F_P_0 */
10439     { "vcomiss",        { XMScalar, EXdScalar }, 0 },
10440   },
10441   {
10442     /* VEX_W_0F2F_P_2 */
10443     { "vcomisd",        { XMScalar, EXqScalar }, 0 },
10444   },
10445   {
10446     /* VEX_W_0F41_P_0_LEN_1 */
10447     { "kandw",          { MaskG, MaskVex, MaskR }, 0 },
10448     { "kandq",          { MaskG, MaskVex, MaskR }, 0 },
10449   },
10450   {
10451     /* VEX_W_0F41_P_2_LEN_1 */
10452     { "kandb",          { MaskG, MaskVex, MaskR }, 0 },
10453     { "kandd",          { MaskG, MaskVex, MaskR }, 0 },
10454   },
10455   {
10456     /* VEX_W_0F42_P_0_LEN_1 */
10457     { "kandnw",         { MaskG, MaskVex, MaskR }, 0 },
10458     { "kandnq",         { MaskG, MaskVex, MaskR }, 0 },
10459   },
10460   {
10461     /* VEX_W_0F42_P_2_LEN_1 */
10462     { "kandnb",         { MaskG, MaskVex, MaskR }, 0 },
10463     { "kandnd",         { MaskG, MaskVex, MaskR }, 0 },
10464   },
10465   {
10466     /* VEX_W_0F44_P_0_LEN_0 */
10467     { "knotw",          { MaskG, MaskR }, 0 },
10468     { "knotq",          { MaskG, MaskR }, 0 },
10469   },
10470   {
10471     /* VEX_W_0F44_P_2_LEN_0 */
10472     { "knotb",          { MaskG, MaskR }, 0 },
10473     { "knotd",          { MaskG, MaskR }, 0 },
10474   },
10475   {
10476     /* VEX_W_0F45_P_0_LEN_1 */
10477     { "korw",           { MaskG, MaskVex, MaskR }, 0 },
10478     { "korq",           { MaskG, MaskVex, MaskR }, 0 },
10479   },
10480   {
10481     /* VEX_W_0F45_P_2_LEN_1 */
10482     { "korb",           { MaskG, MaskVex, MaskR }, 0 },
10483     { "kord",           { MaskG, MaskVex, MaskR }, 0 },
10484   },
10485   {
10486     /* VEX_W_0F46_P_0_LEN_1 */
10487     { "kxnorw",         { MaskG, MaskVex, MaskR }, 0 },
10488     { "kxnorq",         { MaskG, MaskVex, MaskR }, 0 },
10489   },
10490   {
10491     /* VEX_W_0F46_P_2_LEN_1 */
10492     { "kxnorb",         { MaskG, MaskVex, MaskR }, 0 },
10493     { "kxnord",         { MaskG, MaskVex, MaskR }, 0 },
10494   },
10495   {
10496     /* VEX_W_0F47_P_0_LEN_1 */
10497     { "kxorw",          { MaskG, MaskVex, MaskR }, 0 },
10498     { "kxorq",          { MaskG, MaskVex, MaskR }, 0 },
10499   },
10500   {
10501     /* VEX_W_0F47_P_2_LEN_1 */
10502     { "kxorb",          { MaskG, MaskVex, MaskR }, 0 },
10503     { "kxord",          { MaskG, MaskVex, MaskR }, 0 },
10504   },
10505   {
10506     /* VEX_W_0F4A_P_0_LEN_1 */
10507     { "kaddw",          { MaskG, MaskVex, MaskR }, 0 },
10508     { "kaddq",          { MaskG, MaskVex, MaskR }, 0 },
10509   },
10510   {
10511     /* VEX_W_0F4A_P_2_LEN_1 */
10512     { "kaddb",          { MaskG, MaskVex, MaskR }, 0 },
10513     { "kaddd",          { MaskG, MaskVex, MaskR }, 0 },
10514   },
10515   {
10516     /* VEX_W_0F4B_P_0_LEN_1 */
10517     { "kunpckwd",       { MaskG, MaskVex, MaskR }, 0 },
10518     { "kunpckdq",       { MaskG, MaskVex, MaskR }, 0 },
10519   },
10520   {
10521     /* VEX_W_0F4B_P_2_LEN_1 */
10522     { "kunpckbw",       { MaskG, MaskVex, MaskR }, 0 },
10523   },
10524   {
10525     /* VEX_W_0F50_M_0 */
10526     { "vmovmskpX",      { Gdq, XS }, 0 },
10527   },
10528   {
10529     /* VEX_W_0F51_P_0 */
10530     { "vsqrtps",        { XM, EXx }, 0 },
10531   },
10532   {
10533     /* VEX_W_0F51_P_1 */
10534     { "vsqrtss",        { XMScalar, VexScalar, EXdScalar }, 0 },
10535   },
10536   {
10537     /* VEX_W_0F51_P_2  */
10538     { "vsqrtpd",        { XM, EXx }, 0 },
10539   },
10540   {
10541     /* VEX_W_0F51_P_3 */
10542     { "vsqrtsd",        { XMScalar, VexScalar, EXqScalar }, 0 },
10543   },
10544   {
10545     /* VEX_W_0F52_P_0 */
10546     { "vrsqrtps",       { XM, EXx }, 0 },
10547   },
10548   {
10549     /* VEX_W_0F52_P_1 */
10550     { "vrsqrtss",       { XMScalar, VexScalar, EXdScalar }, 0 },
10551   },
10552   {
10553     /* VEX_W_0F53_P_0  */
10554     { "vrcpps",         { XM, EXx }, 0 },
10555   },
10556   {
10557     /* VEX_W_0F53_P_1  */
10558     { "vrcpss",         { XMScalar, VexScalar, EXdScalar }, 0 },
10559   },
10560   {
10561     /* VEX_W_0F58_P_0  */
10562     { "vaddps",         { XM, Vex, EXx }, 0 },
10563   },
10564   {
10565     /* VEX_W_0F58_P_1  */
10566     { "vaddss",         { XMScalar, VexScalar, EXdScalar }, 0 },
10567   },
10568   {
10569     /* VEX_W_0F58_P_2  */
10570     { "vaddpd",         { XM, Vex, EXx }, 0 },
10571   },
10572   {
10573     /* VEX_W_0F58_P_3  */
10574     { "vaddsd",         { XMScalar, VexScalar, EXqScalar }, 0 },
10575   },
10576   {
10577     /* VEX_W_0F59_P_0  */
10578     { "vmulps",         { XM, Vex, EXx }, 0 },
10579   },
10580   {
10581     /* VEX_W_0F59_P_1  */
10582     { "vmulss",         { XMScalar, VexScalar, EXdScalar }, 0 },
10583   },
10584   {
10585     /* VEX_W_0F59_P_2  */
10586     { "vmulpd",         { XM, Vex, EXx }, 0 },
10587   },
10588   {
10589     /* VEX_W_0F59_P_3  */
10590     { "vmulsd",         { XMScalar, VexScalar, EXqScalar }, 0 },
10591   },
10592   {
10593     /* VEX_W_0F5A_P_0  */
10594     { "vcvtps2pd",      { XM, EXxmmq }, 0 },
10595   },
10596   {
10597     /* VEX_W_0F5A_P_1  */
10598     { "vcvtss2sd",      { XMScalar, VexScalar, EXdScalar }, 0 },
10599   },
10600   {
10601     /* VEX_W_0F5A_P_3  */
10602     { "vcvtsd2ss",      { XMScalar, VexScalar, EXqScalar }, 0 },
10603   },
10604   {
10605     /* VEX_W_0F5B_P_0  */
10606     { "vcvtdq2ps",      { XM, EXx }, 0 },
10607   },
10608   {
10609     /* VEX_W_0F5B_P_1  */
10610     { "vcvttps2dq",     { XM, EXx }, 0 },
10611   },
10612   {
10613     /* VEX_W_0F5B_P_2  */
10614     { "vcvtps2dq",      { XM, EXx }, 0 },
10615   },
10616   {
10617     /* VEX_W_0F5C_P_0  */
10618     { "vsubps",         { XM, Vex, EXx }, 0 },
10619   },
10620   {
10621     /* VEX_W_0F5C_P_1  */
10622     { "vsubss",         { XMScalar, VexScalar, EXdScalar }, 0 },
10623   },
10624   {
10625     /* VEX_W_0F5C_P_2  */
10626     { "vsubpd",         { XM, Vex, EXx }, 0 },
10627   },
10628   {
10629     /* VEX_W_0F5C_P_3  */
10630     { "vsubsd",         { XMScalar, VexScalar, EXqScalar }, 0 },
10631   },
10632   {
10633     /* VEX_W_0F5D_P_0  */
10634     { "vminps",         { XM, Vex, EXx }, 0 },
10635   },
10636   {
10637     /* VEX_W_0F5D_P_1  */
10638     { "vminss",         { XMScalar, VexScalar, EXdScalar }, 0 },
10639   },
10640   {
10641     /* VEX_W_0F5D_P_2  */
10642     { "vminpd",         { XM, Vex, EXx }, 0 },
10643   },
10644   {
10645     /* VEX_W_0F5D_P_3  */
10646     { "vminsd",         { XMScalar, VexScalar, EXqScalar }, 0 },
10647   },
10648   {
10649     /* VEX_W_0F5E_P_0  */
10650     { "vdivps",         { XM, Vex, EXx }, 0 },
10651   },
10652   {
10653     /* VEX_W_0F5E_P_1  */
10654     { "vdivss",         { XMScalar, VexScalar, EXdScalar }, 0 },
10655   },
10656   {
10657     /* VEX_W_0F5E_P_2  */
10658     { "vdivpd",         { XM, Vex, EXx }, 0 },
10659   },
10660   {
10661     /* VEX_W_0F5E_P_3  */
10662     { "vdivsd",         { XMScalar, VexScalar, EXqScalar }, 0 },
10663   },
10664   {
10665     /* VEX_W_0F5F_P_0  */
10666     { "vmaxps",         { XM, Vex, EXx }, 0 },
10667   },
10668   {
10669     /* VEX_W_0F5F_P_1  */
10670     { "vmaxss",         { XMScalar, VexScalar, EXdScalar }, 0 },
10671   },
10672   {
10673     /* VEX_W_0F5F_P_2  */
10674     { "vmaxpd",         { XM, Vex, EXx }, 0 },
10675   },
10676   {
10677     /* VEX_W_0F5F_P_3  */
10678     { "vmaxsd",         { XMScalar, VexScalar, EXqScalar }, 0 },
10679   },
10680   {
10681     /* VEX_W_0F60_P_2  */
10682     { "vpunpcklbw",     { XM, Vex, EXx }, 0 },
10683   },
10684   {
10685     /* VEX_W_0F61_P_2  */
10686     { "vpunpcklwd",     { XM, Vex, EXx }, 0 },
10687   },
10688   {
10689     /* VEX_W_0F62_P_2  */
10690     { "vpunpckldq",     { XM, Vex, EXx }, 0 },
10691   },
10692   {
10693     /* VEX_W_0F63_P_2  */
10694     { "vpacksswb",      { XM, Vex, EXx }, 0 },
10695   },
10696   {
10697     /* VEX_W_0F64_P_2  */
10698     { "vpcmpgtb",       { XM, Vex, EXx }, 0 },
10699   },
10700   {
10701     /* VEX_W_0F65_P_2  */
10702     { "vpcmpgtw",       { XM, Vex, EXx }, 0 },
10703   },
10704   {
10705     /* VEX_W_0F66_P_2  */
10706     { "vpcmpgtd",       { XM, Vex, EXx }, 0 },
10707   },
10708   {
10709     /* VEX_W_0F67_P_2  */
10710     { "vpackuswb",      { XM, Vex, EXx }, 0 },
10711   },
10712   {
10713     /* VEX_W_0F68_P_2  */
10714     { "vpunpckhbw",     { XM, Vex, EXx }, 0 },
10715   },
10716   {
10717     /* VEX_W_0F69_P_2  */
10718     { "vpunpckhwd",     { XM, Vex, EXx }, 0 },
10719   },
10720   {
10721     /* VEX_W_0F6A_P_2  */
10722     { "vpunpckhdq",     { XM, Vex, EXx }, 0 },
10723   },
10724   {
10725     /* VEX_W_0F6B_P_2  */
10726     { "vpackssdw",      { XM, Vex, EXx }, 0 },
10727   },
10728   {
10729     /* VEX_W_0F6C_P_2  */
10730     { "vpunpcklqdq",    { XM, Vex, EXx }, 0 },
10731   },
10732   {
10733     /* VEX_W_0F6D_P_2  */
10734     { "vpunpckhqdq",    { XM, Vex, EXx }, 0 },
10735   },
10736   {
10737     /* VEX_W_0F6F_P_1  */
10738     { "vmovdqu",        { XM, EXx }, 0 },
10739   },
10740   {
10741     /* VEX_W_0F6F_P_2  */
10742     { "vmovdqa",        { XM, EXx }, 0 },
10743   },
10744   {
10745     /* VEX_W_0F70_P_1 */
10746     { "vpshufhw",       { XM, EXx, Ib }, 0 },
10747   },
10748   {
10749     /* VEX_W_0F70_P_2 */
10750     { "vpshufd",        { XM, EXx, Ib }, 0 },
10751   },
10752   {
10753     /* VEX_W_0F70_P_3 */
10754     { "vpshuflw",       { XM, EXx, Ib }, 0 },
10755   },
10756   {
10757     /* VEX_W_0F71_R_2_P_2  */
10758     { "vpsrlw",         { Vex, XS, Ib }, 0 },
10759   },
10760   {
10761     /* VEX_W_0F71_R_4_P_2  */
10762     { "vpsraw",         { Vex, XS, Ib }, 0 },
10763   },
10764   {
10765     /* VEX_W_0F71_R_6_P_2  */
10766     { "vpsllw",         { Vex, XS, Ib }, 0 },
10767   },
10768   {
10769     /* VEX_W_0F72_R_2_P_2  */
10770     { "vpsrld",         { Vex, XS, Ib }, 0 },
10771   },
10772   {
10773     /* VEX_W_0F72_R_4_P_2  */
10774     { "vpsrad",         { Vex, XS, Ib }, 0 },
10775   },
10776   {
10777     /* VEX_W_0F72_R_6_P_2  */
10778     { "vpslld",         { Vex, XS, Ib }, 0 },
10779   },
10780   {
10781     /* VEX_W_0F73_R_2_P_2  */
10782     { "vpsrlq",         { Vex, XS, Ib }, 0 },
10783   },
10784   {
10785     /* VEX_W_0F73_R_3_P_2  */
10786     { "vpsrldq",        { Vex, XS, Ib }, 0 },
10787   },
10788   {
10789     /* VEX_W_0F73_R_6_P_2  */
10790     { "vpsllq",         { Vex, XS, Ib }, 0 },
10791   },
10792   {
10793     /* VEX_W_0F73_R_7_P_2  */
10794     { "vpslldq",        { Vex, XS, Ib }, 0 },
10795   },
10796   {
10797     /* VEX_W_0F74_P_2 */
10798     { "vpcmpeqb",       { XM, Vex, EXx }, 0 },
10799   },
10800   {
10801     /* VEX_W_0F75_P_2 */
10802     { "vpcmpeqw",       { XM, Vex, EXx }, 0 },
10803   },
10804   {
10805     /* VEX_W_0F76_P_2 */
10806     { "vpcmpeqd",       { XM, Vex, EXx }, 0 },
10807   },
10808   {
10809     /* VEX_W_0F77_P_0 */
10810     { "",               { VZERO }, 0 },
10811   },
10812   {
10813     /* VEX_W_0F7C_P_2 */
10814     { "vhaddpd",        { XM, Vex, EXx }, 0 },
10815   },
10816   {
10817     /* VEX_W_0F7C_P_3 */
10818     { "vhaddps",        { XM, Vex, EXx }, 0 },
10819   },
10820   {
10821     /* VEX_W_0F7D_P_2 */
10822     { "vhsubpd",        { XM, Vex, EXx }, 0 },
10823   },
10824   {
10825     /* VEX_W_0F7D_P_3 */
10826     { "vhsubps",        { XM, Vex, EXx }, 0 },
10827   },
10828   {
10829     /* VEX_W_0F7E_P_1 */
10830     { "vmovq",          { XMScalar, EXqScalar }, 0 },
10831   },
10832   {
10833     /* VEX_W_0F7F_P_1 */
10834     { "vmovdqu",        { EXxS, XM }, 0 },
10835   },
10836   {
10837     /* VEX_W_0F7F_P_2 */
10838     { "vmovdqa",        { EXxS, XM }, 0 },
10839   },
10840   {
10841     /* VEX_W_0F90_P_0_LEN_0 */
10842     { "kmovw",          { MaskG, MaskE }, 0 },
10843     { "kmovq",          { MaskG, MaskE }, 0 },
10844   },
10845   {
10846     /* VEX_W_0F90_P_2_LEN_0 */
10847     { "kmovb",          { MaskG, MaskBDE }, 0 },
10848     { "kmovd",          { MaskG, MaskBDE }, 0 },
10849   },
10850   {
10851     /* VEX_W_0F91_P_0_LEN_0 */
10852     { "kmovw",          { Ew, MaskG }, 0 },
10853     { "kmovq",          { Eq, MaskG }, 0 },
10854   },
10855   {
10856     /* VEX_W_0F91_P_2_LEN_0 */
10857     { "kmovb",          { Eb, MaskG }, 0 },
10858     { "kmovd",          { Ed, MaskG }, 0 },
10859   },
10860   {
10861     /* VEX_W_0F92_P_0_LEN_0 */
10862     { "kmovw",          { MaskG, Rdq }, 0 },
10863   },
10864   {
10865     /* VEX_W_0F92_P_2_LEN_0 */
10866     { "kmovb",          { MaskG, Rdq }, 0 },
10867   },
10868   {
10869     /* VEX_W_0F92_P_3_LEN_0 */
10870     { "kmovd",          { MaskG, Rdq }, 0 },
10871     { "kmovq",          { MaskG, Rdq }, 0 },
10872   },
10873   {
10874     /* VEX_W_0F93_P_0_LEN_0 */
10875     { "kmovw",          { Gdq, MaskR }, 0 },
10876   },
10877   {
10878     /* VEX_W_0F93_P_2_LEN_0 */
10879     { "kmovb",          { Gdq, MaskR }, 0 },
10880   },
10881   {
10882     /* VEX_W_0F93_P_3_LEN_0 */
10883     { "kmovd",          { Gdq, MaskR }, 0 },
10884     { "kmovq",          { Gdq, MaskR }, 0 },
10885   },
10886   {
10887     /* VEX_W_0F98_P_0_LEN_0 */
10888     { "kortestw",       { MaskG, MaskR }, 0 },
10889     { "kortestq",       { MaskG, MaskR }, 0 },
10890   },
10891   {
10892     /* VEX_W_0F98_P_2_LEN_0 */
10893     { "kortestb",       { MaskG, MaskR }, 0 },
10894     { "kortestd",       { MaskG, MaskR }, 0 },
10895   },
10896   {
10897     /* VEX_W_0F99_P_0_LEN_0 */
10898     { "ktestw", { MaskG, MaskR }, 0 },
10899     { "ktestq", { MaskG, MaskR }, 0 },
10900   },
10901   {
10902     /* VEX_W_0F99_P_2_LEN_0 */
10903     { "ktestb", { MaskG, MaskR }, 0 },
10904     { "ktestd", { MaskG, MaskR }, 0 },
10905   },
10906   {
10907     /* VEX_W_0FAE_R_2_M_0 */
10908     { "vldmxcsr",       { Md }, 0 },
10909   },
10910   {
10911     /* VEX_W_0FAE_R_3_M_0 */
10912     { "vstmxcsr",       { Md }, 0 },
10913   },
10914   {
10915     /* VEX_W_0FC2_P_0 */
10916     { "vcmpps",         { XM, Vex, EXx, VCMP }, 0 },
10917   },
10918   {
10919     /* VEX_W_0FC2_P_1 */
10920     { "vcmpss",         { XMScalar, VexScalar, EXdScalar, VCMP }, 0 },
10921   },
10922   {
10923     /* VEX_W_0FC2_P_2 */
10924     { "vcmppd",         { XM, Vex, EXx, VCMP }, 0 },
10925   },
10926   {
10927     /* VEX_W_0FC2_P_3 */
10928     { "vcmpsd",         { XMScalar, VexScalar, EXqScalar, VCMP }, 0 },
10929   },
10930   {
10931     /* VEX_W_0FC4_P_2 */
10932     { "vpinsrw",        { XM, Vex128, Edqw, Ib }, 0 },
10933   },
10934   {
10935     /* VEX_W_0FC5_P_2 */
10936     { "vpextrw",        { Gdq, XS, Ib }, 0 },
10937   },
10938   {
10939     /* VEX_W_0FD0_P_2 */
10940     { "vaddsubpd",      { XM, Vex, EXx }, 0 },
10941   },
10942   {
10943     /* VEX_W_0FD0_P_3 */
10944     { "vaddsubps",      { XM, Vex, EXx }, 0 },
10945   },
10946   {
10947     /* VEX_W_0FD1_P_2 */
10948     { "vpsrlw",         { XM, Vex, EXxmm }, 0 },
10949   },
10950   {
10951     /* VEX_W_0FD2_P_2 */
10952     { "vpsrld",         { XM, Vex, EXxmm }, 0 },
10953   },
10954   {
10955     /* VEX_W_0FD3_P_2 */
10956     { "vpsrlq",         { XM, Vex, EXxmm }, 0 },
10957   },
10958   {
10959     /* VEX_W_0FD4_P_2 */
10960     { "vpaddq",         { XM, Vex, EXx }, 0 },
10961   },
10962   {
10963     /* VEX_W_0FD5_P_2 */
10964     { "vpmullw",        { XM, Vex, EXx }, 0 },
10965   },
10966   {
10967     /* VEX_W_0FD6_P_2 */
10968     { "vmovq",          { EXqScalarS, XMScalar }, 0 },
10969   },
10970   {
10971     /* VEX_W_0FD7_P_2_M_1 */
10972     { "vpmovmskb",      { Gdq, XS }, 0 },
10973   },
10974   {
10975     /* VEX_W_0FD8_P_2 */
10976     { "vpsubusb",       { XM, Vex, EXx }, 0 },
10977   },
10978   {
10979     /* VEX_W_0FD9_P_2 */
10980     { "vpsubusw",       { XM, Vex, EXx }, 0 },
10981   },
10982   {
10983     /* VEX_W_0FDA_P_2 */
10984     { "vpminub",        { XM, Vex, EXx }, 0 },
10985   },
10986   {
10987     /* VEX_W_0FDB_P_2 */
10988     { "vpand",          { XM, Vex, EXx }, 0 },
10989   },
10990   {
10991     /* VEX_W_0FDC_P_2 */
10992     { "vpaddusb",       { XM, Vex, EXx }, 0 },
10993   },
10994   {
10995     /* VEX_W_0FDD_P_2 */
10996     { "vpaddusw",       { XM, Vex, EXx }, 0 },
10997   },
10998   {
10999     /* VEX_W_0FDE_P_2 */
11000     { "vpmaxub",        { XM, Vex, EXx }, 0 },
11001   },
11002   {
11003     /* VEX_W_0FDF_P_2 */
11004     { "vpandn",         { XM, Vex, EXx }, 0 },
11005   },
11006   {
11007     /* VEX_W_0FE0_P_2  */
11008     { "vpavgb",         { XM, Vex, EXx }, 0 },
11009   },
11010   {
11011     /* VEX_W_0FE1_P_2  */
11012     { "vpsraw",         { XM, Vex, EXxmm }, 0 },
11013   },
11014   {
11015     /* VEX_W_0FE2_P_2  */
11016     { "vpsrad",         { XM, Vex, EXxmm }, 0 },
11017   },
11018   {
11019     /* VEX_W_0FE3_P_2  */
11020     { "vpavgw",         { XM, Vex, EXx }, 0 },
11021   },
11022   {
11023     /* VEX_W_0FE4_P_2  */
11024     { "vpmulhuw",       { XM, Vex, EXx }, 0 },
11025   },
11026   {
11027     /* VEX_W_0FE5_P_2  */
11028     { "vpmulhw",        { XM, Vex, EXx }, 0 },
11029   },
11030   {
11031     /* VEX_W_0FE6_P_1  */
11032     { "vcvtdq2pd",      { XM, EXxmmq }, 0 },
11033   },
11034   {
11035     /* VEX_W_0FE6_P_2  */
11036     { "vcvttpd2dq%XY",  { XMM, EXx }, 0 },
11037   },
11038   {
11039     /* VEX_W_0FE6_P_3  */
11040     { "vcvtpd2dq%XY",   { XMM, EXx }, 0 },
11041   },
11042   {
11043     /* VEX_W_0FE7_P_2_M_0 */
11044     { "vmovntdq",       { Mx, XM }, 0 },
11045   },
11046   {
11047     /* VEX_W_0FE8_P_2  */
11048     { "vpsubsb",        { XM, Vex, EXx }, 0 },
11049   },
11050   {
11051     /* VEX_W_0FE9_P_2  */
11052     { "vpsubsw",        { XM, Vex, EXx }, 0 },
11053   },
11054   {
11055     /* VEX_W_0FEA_P_2  */
11056     { "vpminsw",        { XM, Vex, EXx }, 0 },
11057   },
11058   {
11059     /* VEX_W_0FEB_P_2  */
11060     { "vpor",           { XM, Vex, EXx }, 0 },
11061   },
11062   {
11063     /* VEX_W_0FEC_P_2  */
11064     { "vpaddsb",        { XM, Vex, EXx }, 0 },
11065   },
11066   {
11067     /* VEX_W_0FED_P_2  */
11068     { "vpaddsw",        { XM, Vex, EXx }, 0 },
11069   },
11070   {
11071     /* VEX_W_0FEE_P_2  */
11072     { "vpmaxsw",        { XM, Vex, EXx }, 0 },
11073   },
11074   {
11075     /* VEX_W_0FEF_P_2  */
11076     { "vpxor",          { XM, Vex, EXx }, 0 },
11077   },
11078   {
11079     /* VEX_W_0FF0_P_3_M_0 */
11080     { "vlddqu",         { XM, M }, 0 },
11081   },
11082   {
11083     /* VEX_W_0FF1_P_2 */
11084     { "vpsllw",         { XM, Vex, EXxmm }, 0 },
11085   },
11086   {
11087     /* VEX_W_0FF2_P_2 */
11088     { "vpslld",         { XM, Vex, EXxmm }, 0 },
11089   },
11090   {
11091     /* VEX_W_0FF3_P_2 */
11092     { "vpsllq",         { XM, Vex, EXxmm }, 0 },
11093   },
11094   {
11095     /* VEX_W_0FF4_P_2 */
11096     { "vpmuludq",       { XM, Vex, EXx }, 0 },
11097   },
11098   {
11099     /* VEX_W_0FF5_P_2 */
11100     { "vpmaddwd",       { XM, Vex, EXx }, 0 },
11101   },
11102   {
11103     /* VEX_W_0FF6_P_2 */
11104     { "vpsadbw",        { XM, Vex, EXx }, 0 },
11105   },
11106   {
11107     /* VEX_W_0FF7_P_2 */
11108     { "vmaskmovdqu",    { XM, XS }, 0 },
11109   },
11110   {
11111     /* VEX_W_0FF8_P_2 */
11112     { "vpsubb",         { XM, Vex, EXx }, 0 },
11113   },
11114   {
11115     /* VEX_W_0FF9_P_2 */
11116     { "vpsubw",         { XM, Vex, EXx }, 0 },
11117   },
11118   {
11119     /* VEX_W_0FFA_P_2 */
11120     { "vpsubd",         { XM, Vex, EXx }, 0 },
11121   },
11122   {
11123     /* VEX_W_0FFB_P_2 */
11124     { "vpsubq",         { XM, Vex, EXx }, 0 },
11125   },
11126   {
11127     /* VEX_W_0FFC_P_2 */
11128     { "vpaddb",         { XM, Vex, EXx }, 0 },
11129   },
11130   {
11131     /* VEX_W_0FFD_P_2 */
11132     { "vpaddw",         { XM, Vex, EXx }, 0 },
11133   },
11134   {
11135     /* VEX_W_0FFE_P_2 */
11136     { "vpaddd",         { XM, Vex, EXx }, 0 },
11137   },
11138   {
11139     /* VEX_W_0F3800_P_2  */
11140     { "vpshufb",        { XM, Vex, EXx }, 0 },
11141   },
11142   {
11143     /* VEX_W_0F3801_P_2  */
11144     { "vphaddw",        { XM, Vex, EXx }, 0 },
11145   },
11146   {
11147     /* VEX_W_0F3802_P_2  */
11148     { "vphaddd",        { XM, Vex, EXx }, 0 },
11149   },
11150   {
11151     /* VEX_W_0F3803_P_2  */
11152     { "vphaddsw",       { XM, Vex, EXx }, 0 },
11153   },
11154   {
11155     /* VEX_W_0F3804_P_2  */
11156     { "vpmaddubsw",     { XM, Vex, EXx }, 0 },
11157   },
11158   {
11159     /* VEX_W_0F3805_P_2  */
11160     { "vphsubw",        { XM, Vex, EXx }, 0 },
11161   },
11162   {
11163     /* VEX_W_0F3806_P_2  */
11164     { "vphsubd",        { XM, Vex, EXx }, 0 },
11165   },
11166   {
11167     /* VEX_W_0F3807_P_2  */
11168     { "vphsubsw",       { XM, Vex, EXx }, 0 },
11169   },
11170   {
11171     /* VEX_W_0F3808_P_2  */
11172     { "vpsignb",        { XM, Vex, EXx }, 0 },
11173   },
11174   {
11175     /* VEX_W_0F3809_P_2  */
11176     { "vpsignw",        { XM, Vex, EXx }, 0 },
11177   },
11178   {
11179     /* VEX_W_0F380A_P_2  */
11180     { "vpsignd",        { XM, Vex, EXx }, 0 },
11181   },
11182   {
11183     /* VEX_W_0F380B_P_2  */
11184     { "vpmulhrsw",      { XM, Vex, EXx }, 0 },
11185   },
11186   {
11187     /* VEX_W_0F380C_P_2  */
11188     { "vpermilps",      { XM, Vex, EXx }, 0 },
11189   },
11190   {
11191     /* VEX_W_0F380D_P_2  */
11192     { "vpermilpd",      { XM, Vex, EXx }, 0 },
11193   },
11194   {
11195     /* VEX_W_0F380E_P_2  */
11196     { "vtestps",        { XM, EXx }, 0 },
11197   },
11198   {
11199     /* VEX_W_0F380F_P_2  */
11200     { "vtestpd",        { XM, EXx }, 0 },
11201   },
11202   {
11203     /* VEX_W_0F3816_P_2  */
11204     { "vpermps",        { XM, Vex, EXx }, 0 },
11205   },
11206   {
11207     /* VEX_W_0F3817_P_2 */
11208     { "vptest",         { XM, EXx }, 0 },
11209   },
11210   {
11211     /* VEX_W_0F3818_P_2 */
11212     { "vbroadcastss",   { XM, EXxmm_md }, 0 },
11213   },
11214   {
11215     /* VEX_W_0F3819_P_2 */
11216     { "vbroadcastsd",   { XM, EXxmm_mq }, 0 },
11217   },
11218   {
11219     /* VEX_W_0F381A_P_2_M_0 */
11220     { "vbroadcastf128", { XM, Mxmm }, 0 },
11221   },
11222   {
11223     /* VEX_W_0F381C_P_2 */
11224     { "vpabsb",         { XM, EXx }, 0 },
11225   },
11226   {
11227     /* VEX_W_0F381D_P_2 */
11228     { "vpabsw",         { XM, EXx }, 0 },
11229   },
11230   {
11231     /* VEX_W_0F381E_P_2 */
11232     { "vpabsd",         { XM, EXx }, 0 },
11233   },
11234   {
11235     /* VEX_W_0F3820_P_2 */
11236     { "vpmovsxbw",      { XM, EXxmmq }, 0 },
11237   },
11238   {
11239     /* VEX_W_0F3821_P_2 */
11240     { "vpmovsxbd",      { XM, EXxmmqd }, 0 },
11241   },
11242   {
11243     /* VEX_W_0F3822_P_2 */
11244     { "vpmovsxbq",      { XM, EXxmmdw }, 0 },
11245   },
11246   {
11247     /* VEX_W_0F3823_P_2 */
11248     { "vpmovsxwd",      { XM, EXxmmq }, 0 },
11249   },
11250   {
11251     /* VEX_W_0F3824_P_2 */
11252     { "vpmovsxwq",      { XM, EXxmmqd }, 0 },
11253   },
11254   {
11255     /* VEX_W_0F3825_P_2 */
11256     { "vpmovsxdq",      { XM, EXxmmq }, 0 },
11257   },
11258   {
11259     /* VEX_W_0F3828_P_2 */
11260     { "vpmuldq",        { XM, Vex, EXx }, 0 },
11261   },
11262   {
11263     /* VEX_W_0F3829_P_2 */
11264     { "vpcmpeqq",       { XM, Vex, EXx }, 0 },
11265   },
11266   {
11267     /* VEX_W_0F382A_P_2_M_0 */
11268     { "vmovntdqa",      { XM, Mx }, 0 },
11269   },
11270   {
11271     /* VEX_W_0F382B_P_2 */
11272     { "vpackusdw",      { XM, Vex, EXx }, 0 },
11273   },
11274   {
11275     /* VEX_W_0F382C_P_2_M_0 */
11276     { "vmaskmovps",     { XM, Vex, Mx }, 0 },
11277   },
11278   {
11279     /* VEX_W_0F382D_P_2_M_0 */
11280     { "vmaskmovpd",     { XM, Vex, Mx }, 0 },
11281   },
11282   {
11283     /* VEX_W_0F382E_P_2_M_0 */
11284     { "vmaskmovps",     { Mx, Vex, XM }, 0 },
11285   },
11286   {
11287     /* VEX_W_0F382F_P_2_M_0 */
11288     { "vmaskmovpd",     { Mx, Vex, XM }, 0 },
11289   },
11290   {
11291     /* VEX_W_0F3830_P_2 */
11292     { "vpmovzxbw",      { XM, EXxmmq }, 0 },
11293   },
11294   {
11295     /* VEX_W_0F3831_P_2 */
11296     { "vpmovzxbd",      { XM, EXxmmqd }, 0 },
11297   },
11298   {
11299     /* VEX_W_0F3832_P_2 */
11300     { "vpmovzxbq",      { XM, EXxmmdw }, 0 },
11301   },
11302   {
11303     /* VEX_W_0F3833_P_2 */
11304     { "vpmovzxwd",      { XM, EXxmmq }, 0 },
11305   },
11306   {
11307     /* VEX_W_0F3834_P_2 */
11308     { "vpmovzxwq",      { XM, EXxmmqd }, 0 },
11309   },
11310   {
11311     /* VEX_W_0F3835_P_2 */
11312     { "vpmovzxdq",      { XM, EXxmmq }, 0 },
11313   },
11314   {
11315     /* VEX_W_0F3836_P_2  */
11316     { "vpermd",         { XM, Vex, EXx }, 0 },
11317   },
11318   {
11319     /* VEX_W_0F3837_P_2 */
11320     { "vpcmpgtq",       { XM, Vex, EXx }, 0 },
11321   },
11322   {
11323     /* VEX_W_0F3838_P_2 */
11324     { "vpminsb",        { XM, Vex, EXx }, 0 },
11325   },
11326   {
11327     /* VEX_W_0F3839_P_2 */
11328     { "vpminsd",        { XM, Vex, EXx }, 0 },
11329   },
11330   {
11331     /* VEX_W_0F383A_P_2 */
11332     { "vpminuw",        { XM, Vex, EXx }, 0 },
11333   },
11334   {
11335     /* VEX_W_0F383B_P_2 */
11336     { "vpminud",        { XM, Vex, EXx }, 0 },
11337   },
11338   {
11339     /* VEX_W_0F383C_P_2 */
11340     { "vpmaxsb",        { XM, Vex, EXx }, 0 },
11341   },
11342   {
11343     /* VEX_W_0F383D_P_2 */
11344     { "vpmaxsd",        { XM, Vex, EXx }, 0 },
11345   },
11346   {
11347     /* VEX_W_0F383E_P_2 */
11348     { "vpmaxuw",        { XM, Vex, EXx }, 0 },
11349   },
11350   {
11351     /* VEX_W_0F383F_P_2 */
11352     { "vpmaxud",        { XM, Vex, EXx }, 0 },
11353   },
11354   {
11355     /* VEX_W_0F3840_P_2 */
11356     { "vpmulld",        { XM, Vex, EXx }, 0 },
11357   },
11358   {
11359     /* VEX_W_0F3841_P_2 */
11360     { "vphminposuw",    { XM, EXx }, 0 },
11361   },
11362   {
11363     /* VEX_W_0F3846_P_2 */
11364     { "vpsravd",        { XM, Vex, EXx }, 0 },
11365   },
11366   {
11367     /* VEX_W_0F3858_P_2 */
11368     { "vpbroadcastd", { XM, EXxmm_md }, 0 },
11369   },
11370   {
11371     /* VEX_W_0F3859_P_2 */
11372     { "vpbroadcastq",   { XM, EXxmm_mq }, 0 },
11373   },
11374   {
11375     /* VEX_W_0F385A_P_2_M_0 */
11376     { "vbroadcasti128", { XM, Mxmm }, 0 },
11377   },
11378   {
11379     /* VEX_W_0F3878_P_2 */
11380     { "vpbroadcastb",   { XM, EXxmm_mb }, 0 },
11381   },
11382   {
11383     /* VEX_W_0F3879_P_2 */
11384     { "vpbroadcastw",   { XM, EXxmm_mw }, 0 },
11385   },
11386   {
11387     /* VEX_W_0F38DB_P_2 */
11388     { "vaesimc",        { XM, EXx }, 0 },
11389   },
11390   {
11391     /* VEX_W_0F38DC_P_2 */
11392     { "vaesenc",        { XM, Vex128, EXx }, 0 },
11393   },
11394   {
11395     /* VEX_W_0F38DD_P_2 */
11396     { "vaesenclast",    { XM, Vex128, EXx }, 0 },
11397   },
11398   {
11399     /* VEX_W_0F38DE_P_2 */
11400     { "vaesdec",        { XM, Vex128, EXx }, 0 },
11401   },
11402   {
11403     /* VEX_W_0F38DF_P_2 */
11404     { "vaesdeclast",    { XM, Vex128, EXx }, 0 },
11405   },
11406   {
11407     /* VEX_W_0F3A00_P_2 */
11408     { Bad_Opcode },
11409     { "vpermq",         { XM, EXx, Ib }, 0 },
11410   },
11411   {
11412     /* VEX_W_0F3A01_P_2 */
11413     { Bad_Opcode },
11414     { "vpermpd",        { XM, EXx, Ib }, 0 },
11415   },
11416   {
11417     /* VEX_W_0F3A02_P_2 */
11418     { "vpblendd",       { XM, Vex, EXx, Ib }, 0 },
11419   },
11420   {
11421     /* VEX_W_0F3A04_P_2 */
11422     { "vpermilps",      { XM, EXx, Ib }, 0 },
11423   },
11424   {
11425     /* VEX_W_0F3A05_P_2 */
11426     { "vpermilpd",      { XM, EXx, Ib }, 0 },
11427   },
11428   {
11429     /* VEX_W_0F3A06_P_2 */
11430     { "vperm2f128",     { XM, Vex256, EXx, Ib }, 0 },
11431   },
11432   {
11433     /* VEX_W_0F3A08_P_2 */
11434     { "vroundps",       { XM, EXx, Ib }, 0 },
11435   },
11436   {
11437     /* VEX_W_0F3A09_P_2 */
11438     { "vroundpd",       { XM, EXx, Ib }, 0 },
11439   },
11440   {
11441     /* VEX_W_0F3A0A_P_2 */
11442     { "vroundss",       { XMScalar, VexScalar, EXdScalar, Ib }, 0 },
11443   },
11444   {
11445     /* VEX_W_0F3A0B_P_2 */
11446     { "vroundsd",       { XMScalar, VexScalar, EXqScalar, Ib }, 0 },
11447   },
11448   {
11449     /* VEX_W_0F3A0C_P_2 */
11450     { "vblendps",       { XM, Vex, EXx, Ib }, 0 },
11451   },
11452   {
11453     /* VEX_W_0F3A0D_P_2 */
11454     { "vblendpd",       { XM, Vex, EXx, Ib }, 0 },
11455   },
11456   {
11457     /* VEX_W_0F3A0E_P_2 */
11458     { "vpblendw",       { XM, Vex, EXx, Ib }, 0 },
11459   },
11460   {
11461     /* VEX_W_0F3A0F_P_2 */
11462     { "vpalignr",       { XM, Vex, EXx, Ib }, 0 },
11463   },
11464   {
11465     /* VEX_W_0F3A14_P_2 */
11466     { "vpextrb",        { Edqb, XM, Ib }, 0 },
11467   },
11468   {
11469     /* VEX_W_0F3A15_P_2 */
11470     { "vpextrw",        { Edqw, XM, Ib }, 0 },
11471   },
11472   {
11473     /* VEX_W_0F3A18_P_2 */
11474     { "vinsertf128",    { XM, Vex256, EXxmm, Ib }, 0 },
11475   },
11476   {
11477     /* VEX_W_0F3A19_P_2 */
11478     { "vextractf128",   { EXxmm, XM, Ib }, 0 },
11479   },
11480   {
11481     /* VEX_W_0F3A20_P_2 */
11482     { "vpinsrb",        { XM, Vex128, Edqb, Ib }, 0 },
11483   },
11484   {
11485     /* VEX_W_0F3A21_P_2 */
11486     { "vinsertps",      { XM, Vex128, EXd, Ib }, 0 },
11487   },
11488   {
11489     /* VEX_W_0F3A30_P_2_LEN_0 */
11490     { "kshiftrb",       { MaskG, MaskR, Ib }, 0 },
11491     { "kshiftrw",       { MaskG, MaskR, Ib }, 0 },
11492   },
11493   {
11494     /* VEX_W_0F3A31_P_2_LEN_0 */
11495     { "kshiftrd",       { MaskG, MaskR, Ib }, 0 },
11496     { "kshiftrq",       { MaskG, MaskR, Ib }, 0 },
11497   },
11498   {
11499     /* VEX_W_0F3A32_P_2_LEN_0 */
11500     { "kshiftlb",       { MaskG, MaskR, Ib }, 0 },
11501     { "kshiftlw",       { MaskG, MaskR, Ib }, 0 },
11502   },
11503   {
11504     /* VEX_W_0F3A33_P_2_LEN_0 */
11505     { "kshiftld",       { MaskG, MaskR, Ib }, 0 },
11506     { "kshiftlq",       { MaskG, MaskR, Ib }, 0 },
11507   },
11508   {
11509     /* VEX_W_0F3A38_P_2 */
11510     { "vinserti128",    { XM, Vex256, EXxmm, Ib }, 0 },
11511   },
11512   {
11513     /* VEX_W_0F3A39_P_2 */
11514     { "vextracti128",   { EXxmm, XM, Ib }, 0 },
11515   },
11516   {
11517     /* VEX_W_0F3A40_P_2 */
11518     { "vdpps",          { XM, Vex, EXx, Ib }, 0 },
11519   },
11520   {
11521     /* VEX_W_0F3A41_P_2 */
11522     { "vdppd",          { XM, Vex128, EXx, Ib }, 0 },
11523   },
11524   {
11525     /* VEX_W_0F3A42_P_2 */
11526     { "vmpsadbw",       { XM, Vex, EXx, Ib }, 0 },
11527   },
11528   {
11529     /* VEX_W_0F3A44_P_2 */
11530     { "vpclmulqdq",     { XM, Vex128, EXx, PCLMUL }, 0 },
11531   },
11532   {
11533     /* VEX_W_0F3A46_P_2 */
11534     { "vperm2i128",     { XM, Vex256, EXx, Ib }, 0 },
11535   },
11536   {
11537     /* VEX_W_0F3A48_P_2 */
11538     { "vpermil2ps",     { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW }, 0 },
11539     { "vpermil2ps",     { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW }, 0 },
11540   },
11541   {
11542     /* VEX_W_0F3A49_P_2 */
11543     { "vpermil2pd",     { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW }, 0 },
11544     { "vpermil2pd",     { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW }, 0 },
11545   },
11546   {
11547     /* VEX_W_0F3A4A_P_2 */
11548     { "vblendvps",      { XM, Vex, EXx, XMVexI4 }, 0 },
11549   },
11550   {
11551     /* VEX_W_0F3A4B_P_2 */
11552     { "vblendvpd",      { XM, Vex, EXx, XMVexI4 }, 0 },
11553   },
11554   {
11555     /* VEX_W_0F3A4C_P_2 */
11556     { "vpblendvb",      { XM, Vex, EXx, XMVexI4 }, 0 },
11557   },
11558   {
11559     /* VEX_W_0F3A60_P_2 */
11560     { "vpcmpestrm",     { XM, EXx, Ib }, 0 },
11561   },
11562   {
11563     /* VEX_W_0F3A61_P_2 */
11564     { "vpcmpestri",     { XM, EXx, Ib }, 0 },
11565   },
11566   {
11567     /* VEX_W_0F3A62_P_2 */
11568     { "vpcmpistrm",     { XM, EXx, Ib }, 0 },
11569   },
11570   {
11571     /* VEX_W_0F3A63_P_2 */
11572     { "vpcmpistri",     { XM, EXx, Ib }, 0 },
11573   },
11574   {
11575     /* VEX_W_0F3ADF_P_2 */
11576     { "vaeskeygenassist", { XM, EXx, Ib }, 0 },
11577   },
11578 #define NEED_VEX_W_TABLE
11579 #include "i386-dis-evex.h"
11580 #undef NEED_VEX_W_TABLE
11581 };
11582
11583 static const struct dis386 mod_table[][2] = {
11584   {
11585     /* MOD_8D */
11586     { "leaS",           { Gv, M }, 0 },
11587   },
11588   {
11589     /* MOD_C6_REG_7 */
11590     { Bad_Opcode },
11591     { RM_TABLE (RM_C6_REG_7) },
11592   },
11593   {
11594     /* MOD_C7_REG_7 */
11595     { Bad_Opcode },
11596     { RM_TABLE (RM_C7_REG_7) },
11597   },
11598   {
11599     /* MOD_FF_REG_3 */
11600     { "Jcall^", { indirEp }, 0 },
11601   },
11602   {
11603     /* MOD_FF_REG_5 */
11604     { "Jjmp^", { indirEp }, 0 },
11605   },
11606   {
11607     /* MOD_0F01_REG_0 */
11608     { X86_64_TABLE (X86_64_0F01_REG_0) },
11609     { RM_TABLE (RM_0F01_REG_0) },
11610   },
11611   {
11612     /* MOD_0F01_REG_1 */
11613     { X86_64_TABLE (X86_64_0F01_REG_1) },
11614     { RM_TABLE (RM_0F01_REG_1) },
11615   },
11616   {
11617     /* MOD_0F01_REG_2 */
11618     { X86_64_TABLE (X86_64_0F01_REG_2) },
11619     { RM_TABLE (RM_0F01_REG_2) },
11620   },
11621   {
11622     /* MOD_0F01_REG_3 */
11623     { X86_64_TABLE (X86_64_0F01_REG_3) },
11624     { RM_TABLE (RM_0F01_REG_3) },
11625   },
11626   {
11627     /* MOD_0F01_REG_7 */
11628     { "invlpg",         { Mb }, 0 },
11629     { RM_TABLE (RM_0F01_REG_7) },
11630   },
11631   {
11632     /* MOD_0F12_PREFIX_0 */
11633     { "movlps",         { XM, EXq }, PREFIX_OPCODE },
11634     { "movhlps",        { XM, EXq }, PREFIX_OPCODE },
11635   },
11636   {
11637     /* MOD_0F13 */
11638     { "movlpX",         { EXq, XM }, PREFIX_OPCODE },
11639   },
11640   {
11641     /* MOD_0F16_PREFIX_0 */
11642     { "movhps",         { XM, EXq }, 0 },
11643     { "movlhps",        { XM, EXq }, 0 },
11644   },
11645   {
11646     /* MOD_0F17 */
11647     { "movhpX",         { EXq, XM }, PREFIX_OPCODE },
11648   },
11649   {
11650     /* MOD_0F18_REG_0 */
11651     { "prefetchnta",    { Mb }, 0 },
11652   },
11653   {
11654     /* MOD_0F18_REG_1 */
11655     { "prefetcht0",     { Mb }, 0 },
11656   },
11657   {
11658     /* MOD_0F18_REG_2 */
11659     { "prefetcht1",     { Mb }, 0 },
11660   },
11661   {
11662     /* MOD_0F18_REG_3 */
11663     { "prefetcht2",     { Mb }, 0 },
11664   },
11665   {
11666     /* MOD_0F18_REG_4 */
11667     { "nop/reserved",   { Mb }, 0 },
11668   },
11669   {
11670     /* MOD_0F18_REG_5 */
11671     { "nop/reserved",   { Mb }, 0 },
11672   },
11673   {
11674     /* MOD_0F18_REG_6 */
11675     { "nop/reserved",   { Mb }, 0 },
11676   },
11677   {
11678     /* MOD_0F18_REG_7 */
11679     { "nop/reserved",   { Mb }, 0 },
11680   },
11681   {
11682     /* MOD_0F1A_PREFIX_0 */
11683     { "bndldx",         { Gbnd, Ev_bnd }, 0 },
11684     { "nopQ",           { Ev }, 0 },
11685   },
11686   {
11687     /* MOD_0F1B_PREFIX_0 */
11688     { "bndstx",         { Ev_bnd, Gbnd }, 0 },
11689     { "nopQ",           { Ev }, 0 },
11690   },
11691   {
11692     /* MOD_0F1B_PREFIX_1 */
11693     { "bndmk",          { Gbnd, Ev_bnd }, 0 },
11694     { "nopQ",           { Ev }, 0 },
11695   },
11696   {
11697     /* MOD_0F24 */
11698     { Bad_Opcode },
11699     { "movL",           { Rd, Td }, 0 },
11700   },
11701   {
11702     /* MOD_0F26 */
11703     { Bad_Opcode },
11704     { "movL",           { Td, Rd }, 0 },
11705   },
11706   {
11707     /* MOD_0F2B_PREFIX_0 */
11708     {"movntps",         { Mx, XM }, PREFIX_OPCODE },
11709   },
11710   {
11711     /* MOD_0F2B_PREFIX_1 */
11712     {"movntss",         { Md, XM }, PREFIX_OPCODE },
11713   },
11714   {
11715     /* MOD_0F2B_PREFIX_2 */
11716     {"movntpd",         { Mx, XM }, PREFIX_OPCODE },
11717   },
11718   {
11719     /* MOD_0F2B_PREFIX_3 */
11720     {"movntsd",         { Mq, XM }, PREFIX_OPCODE },
11721   },
11722   {
11723     /* MOD_0F51 */
11724     { Bad_Opcode },
11725     { "movmskpX",       { Gdq, XS }, PREFIX_OPCODE },
11726   },
11727   {
11728     /* MOD_0F71_REG_2 */
11729     { Bad_Opcode },
11730     { "psrlw",          { MS, Ib }, 0 },
11731   },
11732   {
11733     /* MOD_0F71_REG_4 */
11734     { Bad_Opcode },
11735     { "psraw",          { MS, Ib }, 0 },
11736   },
11737   {
11738     /* MOD_0F71_REG_6 */
11739     { Bad_Opcode },
11740     { "psllw",          { MS, Ib }, 0 },
11741   },
11742   {
11743     /* MOD_0F72_REG_2 */
11744     { Bad_Opcode },
11745     { "psrld",          { MS, Ib }, 0 },
11746   },
11747   {
11748     /* MOD_0F72_REG_4 */
11749     { Bad_Opcode },
11750     { "psrad",          { MS, Ib }, 0 },
11751   },
11752   {
11753     /* MOD_0F72_REG_6 */
11754     { Bad_Opcode },
11755     { "pslld",          { MS, Ib }, 0 },
11756   },
11757   {
11758     /* MOD_0F73_REG_2 */
11759     { Bad_Opcode },
11760     { "psrlq",          { MS, Ib }, 0 },
11761   },
11762   {
11763     /* MOD_0F73_REG_3 */
11764     { Bad_Opcode },
11765     { PREFIX_TABLE (PREFIX_0F73_REG_3) },
11766   },
11767   {
11768     /* MOD_0F73_REG_6 */
11769     { Bad_Opcode },
11770     { "psllq",          { MS, Ib }, 0 },
11771   },
11772   {
11773     /* MOD_0F73_REG_7 */
11774     { Bad_Opcode },
11775     { PREFIX_TABLE (PREFIX_0F73_REG_7) },
11776   },
11777   {
11778     /* MOD_0FAE_REG_0 */
11779     { "fxsave",         { FXSAVE }, 0 },
11780     { PREFIX_TABLE (PREFIX_0FAE_REG_0) },
11781   },
11782   {
11783     /* MOD_0FAE_REG_1 */
11784     { "fxrstor",        { FXSAVE }, 0 },
11785     { PREFIX_TABLE (PREFIX_0FAE_REG_1) },
11786   },
11787   {
11788     /* MOD_0FAE_REG_2 */
11789     { "ldmxcsr",        { Md }, 0 },
11790     { PREFIX_TABLE (PREFIX_0FAE_REG_2) },
11791   },
11792   {
11793     /* MOD_0FAE_REG_3 */
11794     { "stmxcsr",        { Md }, 0 },
11795     { PREFIX_TABLE (PREFIX_0FAE_REG_3) },
11796   },
11797   {
11798     /* MOD_0FAE_REG_4 */
11799     { "xsave",          { FXSAVE }, 0 },
11800   },
11801   {
11802     /* MOD_0FAE_REG_5 */
11803     { "xrstor",         { FXSAVE }, 0 },
11804     { RM_TABLE (RM_0FAE_REG_5) },
11805   },
11806   {
11807     /* MOD_0FAE_REG_6 */
11808     { PREFIX_TABLE (PREFIX_0FAE_REG_6) },
11809     { RM_TABLE (RM_0FAE_REG_6) },
11810   },
11811   {
11812     /* MOD_0FAE_REG_7 */
11813     { PREFIX_TABLE (PREFIX_0FAE_REG_7) },
11814     { RM_TABLE (RM_0FAE_REG_7) },
11815   },
11816   {
11817     /* MOD_0FB2 */
11818     { "lssS",           { Gv, Mp }, 0 },
11819   },
11820   {
11821     /* MOD_0FB4 */
11822     { "lfsS",           { Gv, Mp }, 0 },
11823   },
11824   {
11825     /* MOD_0FB5 */
11826     { "lgsS",           { Gv, Mp }, 0 },
11827   },
11828   {
11829     /* MOD_0FC7_REG_3 */
11830     { "xrstors",                { FXSAVE }, 0 },
11831   },
11832   {
11833     /* MOD_0FC7_REG_4 */
11834     { "xsavec",         { FXSAVE }, 0 },
11835   },
11836   {
11837     /* MOD_0FC7_REG_5 */
11838     { "xsaves",         { FXSAVE }, 0 },
11839   },
11840   {
11841     /* MOD_0FC7_REG_6 */
11842     { PREFIX_TABLE (PREFIX_MOD_0_0FC7_REG_6) },
11843     { PREFIX_TABLE (PREFIX_MOD_3_0FC7_REG_6) }
11844   },
11845   {
11846     /* MOD_0FC7_REG_7 */
11847     { "vmptrst",        { Mq }, 0 },
11848     { PREFIX_TABLE (PREFIX_MOD_3_0FC7_REG_7) }
11849   },
11850   {
11851     /* MOD_0FD7 */
11852     { Bad_Opcode },
11853     { "pmovmskb",       { Gdq, MS }, 0 },
11854   },
11855   {
11856     /* MOD_0FE7_PREFIX_2 */
11857     { "movntdq",        { Mx, XM }, 0 },
11858   },
11859   {
11860     /* MOD_0FF0_PREFIX_3 */
11861     { "lddqu",          { XM, M }, 0 },
11862   },
11863   {
11864     /* MOD_0F382A_PREFIX_2 */
11865     { "movntdqa",       { XM, Mx }, 0 },
11866   },
11867   {
11868     /* MOD_62_32BIT */
11869     { "bound{S|}",      { Gv, Ma }, 0 },
11870     { EVEX_TABLE (EVEX_0F) },
11871   },
11872   {
11873     /* MOD_C4_32BIT */
11874     { "lesS",           { Gv, Mp }, 0 },
11875     { VEX_C4_TABLE (VEX_0F) },
11876   },
11877   {
11878     /* MOD_C5_32BIT */
11879     { "ldsS",           { Gv, Mp }, 0 },
11880     { VEX_C5_TABLE (VEX_0F) },
11881   },
11882   {
11883     /* MOD_VEX_0F12_PREFIX_0 */
11884     { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_0) },
11885     { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_1) },
11886   },
11887   {
11888     /* MOD_VEX_0F13 */
11889     { VEX_LEN_TABLE (VEX_LEN_0F13_M_0) },
11890   },
11891   {
11892     /* MOD_VEX_0F16_PREFIX_0 */
11893     { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_0) },
11894     { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_1) },
11895   },
11896   {
11897     /* MOD_VEX_0F17 */
11898     { VEX_LEN_TABLE (VEX_LEN_0F17_M_0) },
11899   },
11900   {
11901     /* MOD_VEX_0F2B */
11902     { VEX_W_TABLE (VEX_W_0F2B_M_0) },
11903   },
11904   {
11905     /* MOD_VEX_0F50 */
11906     { Bad_Opcode },
11907     { VEX_W_TABLE (VEX_W_0F50_M_0) },
11908   },
11909   {
11910     /* MOD_VEX_0F71_REG_2 */
11911     { Bad_Opcode },
11912     { PREFIX_TABLE (PREFIX_VEX_0F71_REG_2) },
11913   },
11914   {
11915     /* MOD_VEX_0F71_REG_4 */
11916     { Bad_Opcode },
11917     { PREFIX_TABLE (PREFIX_VEX_0F71_REG_4) },
11918   },
11919   {
11920     /* MOD_VEX_0F71_REG_6 */
11921     { Bad_Opcode },
11922     { PREFIX_TABLE (PREFIX_VEX_0F71_REG_6) },
11923   },
11924   {
11925     /* MOD_VEX_0F72_REG_2 */
11926     { Bad_Opcode },
11927     { PREFIX_TABLE (PREFIX_VEX_0F72_REG_2) },
11928   },
11929   {
11930     /* MOD_VEX_0F72_REG_4 */
11931     { Bad_Opcode },
11932     { PREFIX_TABLE (PREFIX_VEX_0F72_REG_4) },
11933   },
11934   {
11935     /* MOD_VEX_0F72_REG_6 */
11936     { Bad_Opcode },
11937     { PREFIX_TABLE (PREFIX_VEX_0F72_REG_6) },
11938   },
11939   {
11940     /* MOD_VEX_0F73_REG_2 */
11941     { Bad_Opcode },
11942     { PREFIX_TABLE (PREFIX_VEX_0F73_REG_2) },
11943   },
11944   {
11945     /* MOD_VEX_0F73_REG_3 */
11946     { Bad_Opcode },
11947     { PREFIX_TABLE (PREFIX_VEX_0F73_REG_3) },
11948   },
11949   {
11950     /* MOD_VEX_0F73_REG_6 */
11951     { Bad_Opcode },
11952     { PREFIX_TABLE (PREFIX_VEX_0F73_REG_6) },
11953   },
11954   {
11955     /* MOD_VEX_0F73_REG_7 */
11956     { Bad_Opcode },
11957     { PREFIX_TABLE (PREFIX_VEX_0F73_REG_7) },
11958   },
11959   {
11960     /* MOD_VEX_0FAE_REG_2 */
11961     { VEX_LEN_TABLE (VEX_LEN_0FAE_R_2_M_0) },
11962   },
11963   {
11964     /* MOD_VEX_0FAE_REG_3 */
11965     { VEX_LEN_TABLE (VEX_LEN_0FAE_R_3_M_0) },
11966   },
11967   {
11968     /* MOD_VEX_0FD7_PREFIX_2 */
11969     { Bad_Opcode },
11970     { VEX_W_TABLE (VEX_W_0FD7_P_2_M_1) },
11971   },
11972   {
11973     /* MOD_VEX_0FE7_PREFIX_2 */
11974     { VEX_W_TABLE (VEX_W_0FE7_P_2_M_0) },
11975   },
11976   {
11977     /* MOD_VEX_0FF0_PREFIX_3 */
11978     { VEX_W_TABLE (VEX_W_0FF0_P_3_M_0) },
11979   },
11980   {
11981     /* MOD_VEX_0F381A_PREFIX_2 */
11982     { VEX_LEN_TABLE (VEX_LEN_0F381A_P_2_M_0) },
11983   },
11984   {
11985     /* MOD_VEX_0F382A_PREFIX_2 */
11986     { VEX_W_TABLE (VEX_W_0F382A_P_2_M_0) },
11987   },
11988   {
11989     /* MOD_VEX_0F382C_PREFIX_2 */
11990     { VEX_W_TABLE (VEX_W_0F382C_P_2_M_0) },
11991   },
11992   {
11993     /* MOD_VEX_0F382D_PREFIX_2 */
11994     { VEX_W_TABLE (VEX_W_0F382D_P_2_M_0) },
11995   },
11996   {
11997     /* MOD_VEX_0F382E_PREFIX_2 */
11998     { VEX_W_TABLE (VEX_W_0F382E_P_2_M_0) },
11999   },
12000   {
12001     /* MOD_VEX_0F382F_PREFIX_2 */
12002     { VEX_W_TABLE (VEX_W_0F382F_P_2_M_0) },
12003   },
12004   {
12005     /* MOD_VEX_0F385A_PREFIX_2 */
12006     { VEX_LEN_TABLE (VEX_LEN_0F385A_P_2_M_0) },
12007   },
12008   {
12009     /* MOD_VEX_0F388C_PREFIX_2 */
12010     { "vpmaskmov%LW",   { XM, Vex, Mx }, 0 },
12011   },
12012   {
12013     /* MOD_VEX_0F388E_PREFIX_2 */
12014     { "vpmaskmov%LW",   { Mx, Vex, XM }, 0 },
12015   },
12016 #define NEED_MOD_TABLE
12017 #include "i386-dis-evex.h"
12018 #undef NEED_MOD_TABLE
12019 };
12020
12021 static const struct dis386 rm_table[][8] = {
12022   {
12023     /* RM_C6_REG_7 */
12024     { "xabort",         { Skip_MODRM, Ib }, 0 },
12025   },
12026   {
12027     /* RM_C7_REG_7 */
12028     { "xbeginT",        { Skip_MODRM, Jv }, 0 },
12029   },
12030   {
12031     /* RM_0F01_REG_0 */
12032     { Bad_Opcode },
12033     { "vmcall",         { Skip_MODRM }, 0 },
12034     { "vmlaunch",       { Skip_MODRM }, 0 },
12035     { "vmresume",       { Skip_MODRM }, 0 },
12036     { "vmxoff",         { Skip_MODRM }, 0 },
12037   },
12038   {
12039     /* RM_0F01_REG_1 */
12040     { "monitor",        { { OP_Monitor, 0 } }, 0 },
12041     { "mwait",          { { OP_Mwait, 0 } }, 0 },
12042     { "clac",           { Skip_MODRM }, 0 },
12043     { "stac",           { Skip_MODRM }, 0 },
12044     { Bad_Opcode },
12045     { Bad_Opcode },
12046     { Bad_Opcode },
12047     { "encls",          { Skip_MODRM }, 0 },
12048   },
12049   {
12050     /* RM_0F01_REG_2 */
12051     { "xgetbv",         { Skip_MODRM }, 0 },
12052     { "xsetbv",         { Skip_MODRM }, 0 },
12053     { Bad_Opcode },
12054     { Bad_Opcode },
12055     { "vmfunc",         { Skip_MODRM }, 0 },
12056     { "xend",           { Skip_MODRM }, 0 },
12057     { "xtest",          { Skip_MODRM }, 0 },
12058     { "enclu",          { Skip_MODRM }, 0 },
12059   },
12060   {
12061     /* RM_0F01_REG_3 */
12062     { "vmrun",          { Skip_MODRM }, 0 },
12063     { "vmmcall",        { Skip_MODRM }, 0 },
12064     { "vmload",         { Skip_MODRM }, 0 },
12065     { "vmsave",         { Skip_MODRM }, 0 },
12066     { "stgi",           { Skip_MODRM }, 0 },
12067     { "clgi",           { Skip_MODRM }, 0 },
12068     { "skinit",         { Skip_MODRM }, 0 },
12069     { "invlpga",        { Skip_MODRM }, 0 },
12070   },
12071   {
12072     /* RM_0F01_REG_7 */
12073     { "swapgs",         { Skip_MODRM }, 0  },
12074     { "rdtscp",         { Skip_MODRM }, 0  },
12075     { Bad_Opcode },
12076     { Bad_Opcode },
12077     { "clzero",         { Skip_MODRM }, 0  },
12078   },
12079   {
12080     /* RM_0FAE_REG_5 */
12081     { "lfence",         { Skip_MODRM }, 0 },
12082   },
12083   {
12084     /* RM_0FAE_REG_6 */
12085     { "mfence",         { Skip_MODRM }, 0 },
12086   },
12087   {
12088     /* RM_0FAE_REG_7 */
12089     { PREFIX_TABLE (PREFIX_RM_0_0FAE_REG_7) },
12090   },
12091 };
12092
12093 #define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
12094
12095 /* We use the high bit to indicate different name for the same
12096    prefix.  */
12097 #define REP_PREFIX      (0xf3 | 0x100)
12098 #define XACQUIRE_PREFIX (0xf2 | 0x200)
12099 #define XRELEASE_PREFIX (0xf3 | 0x400)
12100 #define BND_PREFIX      (0xf2 | 0x400)
12101
12102 static int
12103 ckprefix (void)
12104 {
12105   int newrex, i, length;
12106   rex = 0;
12107   rex_ignored = 0;
12108   prefixes = 0;
12109   used_prefixes = 0;
12110   rex_used = 0;
12111   last_lock_prefix = -1;
12112   last_repz_prefix = -1;
12113   last_repnz_prefix = -1;
12114   last_data_prefix = -1;
12115   last_addr_prefix = -1;
12116   last_rex_prefix = -1;
12117   last_seg_prefix = -1;
12118   fwait_prefix = -1;
12119   active_seg_prefix = 0;
12120   for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
12121     all_prefixes[i] = 0;
12122   i = 0;
12123   length = 0;
12124   /* The maximum instruction length is 15bytes.  */
12125   while (length < MAX_CODE_LENGTH - 1)
12126     {
12127       FETCH_DATA (the_info, codep + 1);
12128       newrex = 0;
12129       switch (*codep)
12130         {
12131         /* REX prefixes family.  */
12132         case 0x40:
12133         case 0x41:
12134         case 0x42:
12135         case 0x43:
12136         case 0x44:
12137         case 0x45:
12138         case 0x46:
12139         case 0x47:
12140         case 0x48:
12141         case 0x49:
12142         case 0x4a:
12143         case 0x4b:
12144         case 0x4c:
12145         case 0x4d:
12146         case 0x4e:
12147         case 0x4f:
12148           if (address_mode == mode_64bit)
12149             newrex = *codep;
12150           else
12151             return 1;
12152           last_rex_prefix = i;
12153           break;
12154         case 0xf3:
12155           prefixes |= PREFIX_REPZ;
12156           last_repz_prefix = i;
12157           break;
12158         case 0xf2:
12159           prefixes |= PREFIX_REPNZ;
12160           last_repnz_prefix = i;
12161           break;
12162         case 0xf0:
12163           prefixes |= PREFIX_LOCK;
12164           last_lock_prefix = i;
12165           break;
12166         case 0x2e:
12167           prefixes |= PREFIX_CS;
12168           last_seg_prefix = i;
12169           active_seg_prefix = PREFIX_CS;
12170           break;
12171         case 0x36:
12172           prefixes |= PREFIX_SS;
12173           last_seg_prefix = i;
12174           active_seg_prefix = PREFIX_SS;
12175           break;
12176         case 0x3e:
12177           prefixes |= PREFIX_DS;
12178           last_seg_prefix = i;
12179           active_seg_prefix = PREFIX_DS;
12180           break;
12181         case 0x26:
12182           prefixes |= PREFIX_ES;
12183           last_seg_prefix = i;
12184           active_seg_prefix = PREFIX_ES;
12185           break;
12186         case 0x64:
12187           prefixes |= PREFIX_FS;
12188           last_seg_prefix = i;
12189           active_seg_prefix = PREFIX_FS;
12190           break;
12191         case 0x65:
12192           prefixes |= PREFIX_GS;
12193           last_seg_prefix = i;
12194           active_seg_prefix = PREFIX_GS;
12195           break;
12196         case 0x66:
12197           prefixes |= PREFIX_DATA;
12198           last_data_prefix = i;
12199           break;
12200         case 0x67:
12201           prefixes |= PREFIX_ADDR;
12202           last_addr_prefix = i;
12203           break;
12204         case FWAIT_OPCODE:
12205           /* fwait is really an instruction.  If there are prefixes
12206              before the fwait, they belong to the fwait, *not* to the
12207              following instruction.  */
12208           fwait_prefix = i;
12209           if (prefixes || rex)
12210             {
12211               prefixes |= PREFIX_FWAIT;
12212               codep++;
12213               /* This ensures that the previous REX prefixes are noticed
12214                  as unused prefixes, as in the return case below.  */
12215               rex_used = rex;
12216               return 1;
12217             }
12218           prefixes = PREFIX_FWAIT;
12219           break;
12220         default:
12221           return 1;
12222         }
12223       /* Rex is ignored when followed by another prefix.  */
12224       if (rex)
12225         {
12226           rex_used = rex;
12227           return 1;
12228         }
12229       if (*codep != FWAIT_OPCODE)
12230         all_prefixes[i++] = *codep;
12231       rex = newrex;
12232       codep++;
12233       length++;
12234     }
12235   return 0;
12236 }
12237
12238 /* Return the name of the prefix byte PREF, or NULL if PREF is not a
12239    prefix byte.  */
12240
12241 static const char *
12242 prefix_name (int pref, int sizeflag)
12243 {
12244   static const char *rexes [16] =
12245     {
12246       "rex",            /* 0x40 */
12247       "rex.B",          /* 0x41 */
12248       "rex.X",          /* 0x42 */
12249       "rex.XB",         /* 0x43 */
12250       "rex.R",          /* 0x44 */
12251       "rex.RB",         /* 0x45 */
12252       "rex.RX",         /* 0x46 */
12253       "rex.RXB",        /* 0x47 */
12254       "rex.W",          /* 0x48 */
12255       "rex.WB",         /* 0x49 */
12256       "rex.WX",         /* 0x4a */
12257       "rex.WXB",        /* 0x4b */
12258       "rex.WR",         /* 0x4c */
12259       "rex.WRB",        /* 0x4d */
12260       "rex.WRX",        /* 0x4e */
12261       "rex.WRXB",       /* 0x4f */
12262     };
12263
12264   switch (pref)
12265     {
12266     /* REX prefixes family.  */
12267     case 0x40:
12268     case 0x41:
12269     case 0x42:
12270     case 0x43:
12271     case 0x44:
12272     case 0x45:
12273     case 0x46:
12274     case 0x47:
12275     case 0x48:
12276     case 0x49:
12277     case 0x4a:
12278     case 0x4b:
12279     case 0x4c:
12280     case 0x4d:
12281     case 0x4e:
12282     case 0x4f:
12283       return rexes [pref - 0x40];
12284     case 0xf3:
12285       return "repz";
12286     case 0xf2:
12287       return "repnz";
12288     case 0xf0:
12289       return "lock";
12290     case 0x2e:
12291       return "cs";
12292     case 0x36:
12293       return "ss";
12294     case 0x3e:
12295       return "ds";
12296     case 0x26:
12297       return "es";
12298     case 0x64:
12299       return "fs";
12300     case 0x65:
12301       return "gs";
12302     case 0x66:
12303       return (sizeflag & DFLAG) ? "data16" : "data32";
12304     case 0x67:
12305       if (address_mode == mode_64bit)
12306         return (sizeflag & AFLAG) ? "addr32" : "addr64";
12307       else
12308         return (sizeflag & AFLAG) ? "addr16" : "addr32";
12309     case FWAIT_OPCODE:
12310       return "fwait";
12311     case REP_PREFIX:
12312       return "rep";
12313     case XACQUIRE_PREFIX:
12314       return "xacquire";
12315     case XRELEASE_PREFIX:
12316       return "xrelease";
12317     case BND_PREFIX:
12318       return "bnd";
12319     default:
12320       return NULL;
12321     }
12322 }
12323
12324 static char op_out[MAX_OPERANDS][100];
12325 static int op_ad, op_index[MAX_OPERANDS];
12326 static int two_source_ops;
12327 static bfd_vma op_address[MAX_OPERANDS];
12328 static bfd_vma op_riprel[MAX_OPERANDS];
12329 static bfd_vma start_pc;
12330
12331 /*
12332  *   On the 386's of 1988, the maximum length of an instruction is 15 bytes.
12333  *   (see topic "Redundant prefixes" in the "Differences from 8086"
12334  *   section of the "Virtual 8086 Mode" chapter.)
12335  * 'pc' should be the address of this instruction, it will
12336  *   be used to print the target address if this is a relative jump or call
12337  * The function returns the length of this instruction in bytes.
12338  */
12339
12340 static char intel_syntax;
12341 static char intel_mnemonic = !SYSV386_COMPAT;
12342 static char open_char;
12343 static char close_char;
12344 static char separator_char;
12345 static char scale_char;
12346
12347 enum x86_64_isa
12348 {
12349   amd64 = 0,
12350   intel64
12351 };
12352
12353 static enum x86_64_isa isa64;
12354
12355 /* Here for backwards compatibility.  When gdb stops using
12356    print_insn_i386_att and print_insn_i386_intel these functions can
12357    disappear, and print_insn_i386 be merged into print_insn.  */
12358 int
12359 print_insn_i386_att (bfd_vma pc, disassemble_info *info)
12360 {
12361   intel_syntax = 0;
12362
12363   return print_insn (pc, info);
12364 }
12365
12366 int
12367 print_insn_i386_intel (bfd_vma pc, disassemble_info *info)
12368 {
12369   intel_syntax = 1;
12370
12371   return print_insn (pc, info);
12372 }
12373
12374 int
12375 print_insn_i386 (bfd_vma pc, disassemble_info *info)
12376 {
12377   intel_syntax = -1;
12378
12379   return print_insn (pc, info);
12380 }
12381
12382 void
12383 print_i386_disassembler_options (FILE *stream)
12384 {
12385   fprintf (stream, _("\n\
12386 The following i386/x86-64 specific disassembler options are supported for use\n\
12387 with the -M switch (multiple options should be separated by commas):\n"));
12388
12389   fprintf (stream, _("  x86-64      Disassemble in 64bit mode\n"));
12390   fprintf (stream, _("  i386        Disassemble in 32bit mode\n"));
12391   fprintf (stream, _("  i8086       Disassemble in 16bit mode\n"));
12392   fprintf (stream, _("  att         Display instruction in AT&T syntax\n"));
12393   fprintf (stream, _("  intel       Display instruction in Intel syntax\n"));
12394   fprintf (stream, _("  att-mnemonic\n"
12395                      "              Display instruction in AT&T mnemonic\n"));
12396   fprintf (stream, _("  intel-mnemonic\n"
12397                      "              Display instruction in Intel mnemonic\n"));
12398   fprintf (stream, _("  addr64      Assume 64bit address size\n"));
12399   fprintf (stream, _("  addr32      Assume 32bit address size\n"));
12400   fprintf (stream, _("  addr16      Assume 16bit address size\n"));
12401   fprintf (stream, _("  data32      Assume 32bit data size\n"));
12402   fprintf (stream, _("  data16      Assume 16bit data size\n"));
12403   fprintf (stream, _("  suffix      Always display instruction suffix in AT&T syntax\n"));
12404   fprintf (stream, _("  amd64       Display instruction in AMD64 ISA\n"));
12405   fprintf (stream, _("  intel64     Display instruction in Intel64 ISA\n"));
12406 }
12407
12408 /* Bad opcode.  */
12409 static const struct dis386 bad_opcode = { "(bad)", { XX }, 0 };
12410
12411 /* Get a pointer to struct dis386 with a valid name.  */
12412
12413 static const struct dis386 *
12414 get_valid_dis386 (const struct dis386 *dp, disassemble_info *info)
12415 {
12416   int vindex, vex_table_index;
12417
12418   if (dp->name != NULL)
12419     return dp;
12420
12421   switch (dp->op[0].bytemode)
12422     {
12423     case USE_REG_TABLE:
12424       dp = &reg_table[dp->op[1].bytemode][modrm.reg];
12425       break;
12426
12427     case USE_MOD_TABLE:
12428       vindex = modrm.mod == 0x3 ? 1 : 0;
12429       dp = &mod_table[dp->op[1].bytemode][vindex];
12430       break;
12431
12432     case USE_RM_TABLE:
12433       dp = &rm_table[dp->op[1].bytemode][modrm.rm];
12434       break;
12435
12436     case USE_PREFIX_TABLE:
12437       if (need_vex)
12438         {
12439           /* The prefix in VEX is implicit.  */
12440           switch (vex.prefix)
12441             {
12442             case 0:
12443               vindex = 0;
12444               break;
12445             case REPE_PREFIX_OPCODE:
12446               vindex = 1;
12447               break;
12448             case DATA_PREFIX_OPCODE:
12449               vindex = 2;
12450               break;
12451             case REPNE_PREFIX_OPCODE:
12452               vindex = 3;
12453               break;
12454             default:
12455               abort ();
12456               break;
12457             }
12458         }
12459       else
12460         {
12461           int last_prefix = -1;
12462           int prefix = 0;
12463           vindex = 0;
12464           /* We check PREFIX_REPNZ and PREFIX_REPZ before PREFIX_DATA.
12465              When there are multiple PREFIX_REPNZ and PREFIX_REPZ, the
12466              last one wins.  */
12467           if ((prefixes & (PREFIX_REPZ | PREFIX_REPNZ)) != 0)
12468             {
12469               if (last_repz_prefix > last_repnz_prefix)
12470                 {
12471                   vindex = 1;
12472                   prefix = PREFIX_REPZ;
12473                   last_prefix = last_repz_prefix;
12474                 }
12475               else
12476                 {
12477                   vindex = 3;
12478                   prefix = PREFIX_REPNZ;
12479                   last_prefix = last_repnz_prefix;
12480                 }
12481
12482               /* Check if prefix should be ignored.  */
12483               if ((((prefix_table[dp->op[1].bytemode][vindex].prefix_requirement
12484                      & PREFIX_IGNORED) >> PREFIX_IGNORED_SHIFT)
12485                    & prefix) != 0)
12486                 vindex = 0;
12487             }
12488
12489           if (vindex == 0 && (prefixes & PREFIX_DATA) != 0)
12490             {
12491               vindex = 2;
12492               prefix = PREFIX_DATA;
12493               last_prefix = last_data_prefix;
12494             }
12495
12496           if (vindex != 0)
12497             {
12498               used_prefixes |= prefix;
12499               all_prefixes[last_prefix] = 0;
12500             }
12501         }
12502       dp = &prefix_table[dp->op[1].bytemode][vindex];
12503       break;
12504
12505     case USE_X86_64_TABLE:
12506       vindex = address_mode == mode_64bit ? 1 : 0;
12507       dp = &x86_64_table[dp->op[1].bytemode][vindex];
12508       break;
12509
12510     case USE_3BYTE_TABLE:
12511       FETCH_DATA (info, codep + 2);
12512       vindex = *codep++;
12513       dp = &three_byte_table[dp->op[1].bytemode][vindex];
12514       end_codep = codep;
12515       modrm.mod = (*codep >> 6) & 3;
12516       modrm.reg = (*codep >> 3) & 7;
12517       modrm.rm = *codep & 7;
12518       break;
12519
12520     case USE_VEX_LEN_TABLE:
12521       if (!need_vex)
12522         abort ();
12523
12524       switch (vex.length)
12525         {
12526         case 128:
12527           vindex = 0;
12528           break;
12529         case 256:
12530           vindex = 1;
12531           break;
12532         default:
12533           abort ();
12534           break;
12535         }
12536
12537       dp = &vex_len_table[dp->op[1].bytemode][vindex];
12538       break;
12539
12540     case USE_XOP_8F_TABLE:
12541       FETCH_DATA (info, codep + 3);
12542       /* All bits in the REX prefix are ignored.  */
12543       rex_ignored = rex;
12544       rex = ~(*codep >> 5) & 0x7;
12545
12546       /* VEX_TABLE_INDEX is the mmmmm part of the XOP byte 1 "RCB.mmmmm".  */
12547       switch ((*codep & 0x1f))
12548         {
12549         default:
12550           dp = &bad_opcode;
12551           return dp;
12552         case 0x8:
12553           vex_table_index = XOP_08;
12554           break;
12555         case 0x9:
12556           vex_table_index = XOP_09;
12557           break;
12558         case 0xa:
12559           vex_table_index = XOP_0A;
12560           break;
12561         }
12562       codep++;
12563       vex.w = *codep & 0x80;
12564       if (vex.w && address_mode == mode_64bit)
12565         rex |= REX_W;
12566
12567       vex.register_specifier = (~(*codep >> 3)) & 0xf;
12568       if (address_mode != mode_64bit
12569           && vex.register_specifier > 0x7)
12570         {
12571           dp = &bad_opcode;
12572           return dp;
12573         }
12574
12575       vex.length = (*codep & 0x4) ? 256 : 128;
12576       switch ((*codep & 0x3))
12577         {
12578         case 0:
12579           vex.prefix = 0;
12580           break;
12581         case 1:
12582           vex.prefix = DATA_PREFIX_OPCODE;
12583           break;
12584         case 2:
12585           vex.prefix = REPE_PREFIX_OPCODE;
12586           break;
12587         case 3:
12588           vex.prefix = REPNE_PREFIX_OPCODE;
12589           break;
12590         }
12591       need_vex = 1;
12592       need_vex_reg = 1;
12593       codep++;
12594       vindex = *codep++;
12595       dp = &xop_table[vex_table_index][vindex];
12596
12597       end_codep = codep;
12598       FETCH_DATA (info, codep + 1);
12599       modrm.mod = (*codep >> 6) & 3;
12600       modrm.reg = (*codep >> 3) & 7;
12601       modrm.rm = *codep & 7;
12602       break;
12603
12604     case USE_VEX_C4_TABLE:
12605       /* VEX prefix.  */
12606       FETCH_DATA (info, codep + 3);
12607       /* All bits in the REX prefix are ignored.  */
12608       rex_ignored = rex;
12609       rex = ~(*codep >> 5) & 0x7;
12610       switch ((*codep & 0x1f))
12611         {
12612         default:
12613           dp = &bad_opcode;
12614           return dp;
12615         case 0x1:
12616           vex_table_index = VEX_0F;
12617           break;
12618         case 0x2:
12619           vex_table_index = VEX_0F38;
12620           break;
12621         case 0x3:
12622           vex_table_index = VEX_0F3A;
12623           break;
12624         }
12625       codep++;
12626       vex.w = *codep & 0x80;
12627       if (vex.w && address_mode == mode_64bit)
12628         rex |= REX_W;
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.length = (*codep & 0x4) ? 256 : 128;
12639       switch ((*codep & 0x3))
12640         {
12641         case 0:
12642           vex.prefix = 0;
12643           break;
12644         case 1:
12645           vex.prefix = DATA_PREFIX_OPCODE;
12646           break;
12647         case 2:
12648           vex.prefix = REPE_PREFIX_OPCODE;
12649           break;
12650         case 3:
12651           vex.prefix = REPNE_PREFIX_OPCODE;
12652           break;
12653         }
12654       need_vex = 1;
12655       need_vex_reg = 1;
12656       codep++;
12657       vindex = *codep++;
12658       dp = &vex_table[vex_table_index][vindex];
12659       end_codep = codep;
12660       /* There is no MODRM byte for VEX [82|77].  */
12661       if (vindex != 0x77 && vindex != 0x82)
12662         {
12663           FETCH_DATA (info, codep + 1);
12664           modrm.mod = (*codep >> 6) & 3;
12665           modrm.reg = (*codep >> 3) & 7;
12666           modrm.rm = *codep & 7;
12667         }
12668       break;
12669
12670     case USE_VEX_C5_TABLE:
12671       /* VEX prefix.  */
12672       FETCH_DATA (info, codep + 2);
12673       /* All bits in the REX prefix are ignored.  */
12674       rex_ignored = rex;
12675       rex = (*codep & 0x80) ? 0 : REX_R;
12676
12677       vex.register_specifier = (~(*codep >> 3)) & 0xf;
12678       if (address_mode != mode_64bit
12679           && vex.register_specifier > 0x7)
12680         {
12681           dp = &bad_opcode;
12682           return dp;
12683         }
12684
12685       vex.w = 0;
12686
12687       vex.length = (*codep & 0x4) ? 256 : 128;
12688       switch ((*codep & 0x3))
12689         {
12690         case 0:
12691           vex.prefix = 0;
12692           break;
12693         case 1:
12694           vex.prefix = DATA_PREFIX_OPCODE;
12695           break;
12696         case 2:
12697           vex.prefix = REPE_PREFIX_OPCODE;
12698           break;
12699         case 3:
12700           vex.prefix = REPNE_PREFIX_OPCODE;
12701           break;
12702         }
12703       need_vex = 1;
12704       need_vex_reg = 1;
12705       codep++;
12706       vindex = *codep++;
12707       dp = &vex_table[dp->op[1].bytemode][vindex];
12708       end_codep = codep;
12709       /* There is no MODRM byte for VEX [82|77].  */
12710       if (vindex != 0x77 && vindex != 0x82)
12711         {
12712           FETCH_DATA (info, codep + 1);
12713           modrm.mod = (*codep >> 6) & 3;
12714           modrm.reg = (*codep >> 3) & 7;
12715           modrm.rm = *codep & 7;
12716         }
12717       break;
12718
12719     case USE_VEX_W_TABLE:
12720       if (!need_vex)
12721         abort ();
12722
12723       dp = &vex_w_table[dp->op[1].bytemode][vex.w ? 1 : 0];
12724       break;
12725
12726     case USE_EVEX_TABLE:
12727       two_source_ops = 0;
12728       /* EVEX prefix.  */
12729       vex.evex = 1;
12730       FETCH_DATA (info, codep + 4);
12731       /* All bits in the REX prefix are ignored.  */
12732       rex_ignored = rex;
12733       /* The first byte after 0x62.  */
12734       rex = ~(*codep >> 5) & 0x7;
12735       vex.r = *codep & 0x10;
12736       switch ((*codep & 0xf))
12737         {
12738         default:
12739           return &bad_opcode;
12740         case 0x1:
12741           vex_table_index = EVEX_0F;
12742           break;
12743         case 0x2:
12744           vex_table_index = EVEX_0F38;
12745           break;
12746         case 0x3:
12747           vex_table_index = EVEX_0F3A;
12748           break;
12749         }
12750
12751       /* The second byte after 0x62.  */
12752       codep++;
12753       vex.w = *codep & 0x80;
12754       if (vex.w && address_mode == mode_64bit)
12755         rex |= REX_W;
12756
12757       vex.register_specifier = (~(*codep >> 3)) & 0xf;
12758       if (address_mode != mode_64bit)
12759         {
12760           /* In 16/32-bit mode silently ignore following bits.  */
12761           rex &= ~REX_B;
12762           vex.r = 1;
12763           vex.v = 1;
12764           vex.register_specifier &= 0x7;
12765         }
12766
12767       /* The U bit.  */
12768       if (!(*codep & 0x4))
12769         return &bad_opcode;
12770
12771       switch ((*codep & 0x3))
12772         {
12773         case 0:
12774           vex.prefix = 0;
12775           break;
12776         case 1:
12777           vex.prefix = DATA_PREFIX_OPCODE;
12778           break;
12779         case 2:
12780           vex.prefix = REPE_PREFIX_OPCODE;
12781           break;
12782         case 3:
12783           vex.prefix = REPNE_PREFIX_OPCODE;
12784           break;
12785         }
12786
12787       /* The third byte after 0x62.  */
12788       codep++;
12789
12790       /* Remember the static rounding bits.  */
12791       vex.ll = (*codep >> 5) & 3;
12792       vex.b = (*codep & 0x10) != 0;
12793
12794       vex.v = *codep & 0x8;
12795       vex.mask_register_specifier = *codep & 0x7;
12796       vex.zeroing = *codep & 0x80;
12797
12798       need_vex = 1;
12799       need_vex_reg = 1;
12800       codep++;
12801       vindex = *codep++;
12802       dp = &evex_table[vex_table_index][vindex];
12803       end_codep = codep;
12804       FETCH_DATA (info, codep + 1);
12805       modrm.mod = (*codep >> 6) & 3;
12806       modrm.reg = (*codep >> 3) & 7;
12807       modrm.rm = *codep & 7;
12808
12809       /* Set vector length.  */
12810       if (modrm.mod == 3 && vex.b)
12811         vex.length = 512;
12812       else
12813         {
12814           switch (vex.ll)
12815             {
12816             case 0x0:
12817               vex.length = 128;
12818               break;
12819             case 0x1:
12820               vex.length = 256;
12821               break;
12822             case 0x2:
12823               vex.length = 512;
12824               break;
12825             default:
12826               return &bad_opcode;
12827             }
12828         }
12829       break;
12830
12831     case 0:
12832       dp = &bad_opcode;
12833       break;
12834
12835     default:
12836       abort ();
12837     }
12838
12839   if (dp->name != NULL)
12840     return dp;
12841   else
12842     return get_valid_dis386 (dp, info);
12843 }
12844
12845 static void
12846 get_sib (disassemble_info *info, int sizeflag)
12847 {
12848   /* If modrm.mod == 3, operand must be register.  */
12849   if (need_modrm
12850       && ((sizeflag & AFLAG) || address_mode == mode_64bit)
12851       && modrm.mod != 3
12852       && modrm.rm == 4)
12853     {
12854       FETCH_DATA (info, codep + 2);
12855       sib.index = (codep [1] >> 3) & 7;
12856       sib.scale = (codep [1] >> 6) & 3;
12857       sib.base = codep [1] & 7;
12858     }
12859 }
12860
12861 static int
12862 print_insn (bfd_vma pc, disassemble_info *info)
12863 {
12864   const struct dis386 *dp;
12865   int i;
12866   char *op_txt[MAX_OPERANDS];
12867   int needcomma;
12868   int sizeflag, orig_sizeflag;
12869   const char *p;
12870   struct dis_private priv;
12871   int prefix_length;
12872
12873   priv.orig_sizeflag = AFLAG | DFLAG;
12874   if ((info->mach & bfd_mach_i386_i386) != 0)
12875     address_mode = mode_32bit;
12876   else if (info->mach == bfd_mach_i386_i8086)
12877     {
12878       address_mode = mode_16bit;
12879       priv.orig_sizeflag = 0;
12880     }
12881   else
12882     address_mode = mode_64bit;
12883
12884   if (intel_syntax == (char) -1)
12885     intel_syntax = (info->mach & bfd_mach_i386_intel_syntax) != 0;
12886
12887   for (p = info->disassembler_options; p != NULL; )
12888     {
12889       if (CONST_STRNEQ (p, "amd64"))
12890         isa64 = amd64;
12891       else if (CONST_STRNEQ (p, "intel64"))
12892         isa64 = intel64;
12893       else if (CONST_STRNEQ (p, "x86-64"))
12894         {
12895           address_mode = mode_64bit;
12896           priv.orig_sizeflag = AFLAG | DFLAG;
12897         }
12898       else if (CONST_STRNEQ (p, "i386"))
12899         {
12900           address_mode = mode_32bit;
12901           priv.orig_sizeflag = AFLAG | DFLAG;
12902         }
12903       else if (CONST_STRNEQ (p, "i8086"))
12904         {
12905           address_mode = mode_16bit;
12906           priv.orig_sizeflag = 0;
12907         }
12908       else if (CONST_STRNEQ (p, "intel"))
12909         {
12910           intel_syntax = 1;
12911           if (CONST_STRNEQ (p + 5, "-mnemonic"))
12912             intel_mnemonic = 1;
12913         }
12914       else if (CONST_STRNEQ (p, "att"))
12915         {
12916           intel_syntax = 0;
12917           if (CONST_STRNEQ (p + 3, "-mnemonic"))
12918             intel_mnemonic = 0;
12919         }
12920       else if (CONST_STRNEQ (p, "addr"))
12921         {
12922           if (address_mode == mode_64bit)
12923             {
12924               if (p[4] == '3' && p[5] == '2')
12925                 priv.orig_sizeflag &= ~AFLAG;
12926               else if (p[4] == '6' && p[5] == '4')
12927                 priv.orig_sizeflag |= AFLAG;
12928             }
12929           else
12930             {
12931               if (p[4] == '1' && p[5] == '6')
12932                 priv.orig_sizeflag &= ~AFLAG;
12933               else if (p[4] == '3' && p[5] == '2')
12934                 priv.orig_sizeflag |= AFLAG;
12935             }
12936         }
12937       else if (CONST_STRNEQ (p, "data"))
12938         {
12939           if (p[4] == '1' && p[5] == '6')
12940             priv.orig_sizeflag &= ~DFLAG;
12941           else if (p[4] == '3' && p[5] == '2')
12942             priv.orig_sizeflag |= DFLAG;
12943         }
12944       else if (CONST_STRNEQ (p, "suffix"))
12945         priv.orig_sizeflag |= SUFFIX_ALWAYS;
12946
12947       p = strchr (p, ',');
12948       if (p != NULL)
12949         p++;
12950     }
12951
12952   if (intel_syntax)
12953     {
12954       names64 = intel_names64;
12955       names32 = intel_names32;
12956       names16 = intel_names16;
12957       names8 = intel_names8;
12958       names8rex = intel_names8rex;
12959       names_seg = intel_names_seg;
12960       names_mm = intel_names_mm;
12961       names_bnd = intel_names_bnd;
12962       names_xmm = intel_names_xmm;
12963       names_ymm = intel_names_ymm;
12964       names_zmm = intel_names_zmm;
12965       index64 = intel_index64;
12966       index32 = intel_index32;
12967       names_mask = intel_names_mask;
12968       index16 = intel_index16;
12969       open_char = '[';
12970       close_char = ']';
12971       separator_char = '+';
12972       scale_char = '*';
12973     }
12974   else
12975     {
12976       names64 = att_names64;
12977       names32 = att_names32;
12978       names16 = att_names16;
12979       names8 = att_names8;
12980       names8rex = att_names8rex;
12981       names_seg = att_names_seg;
12982       names_mm = att_names_mm;
12983       names_bnd = att_names_bnd;
12984       names_xmm = att_names_xmm;
12985       names_ymm = att_names_ymm;
12986       names_zmm = att_names_zmm;
12987       index64 = att_index64;
12988       index32 = att_index32;
12989       names_mask = att_names_mask;
12990       index16 = att_index16;
12991       open_char = '(';
12992       close_char =  ')';
12993       separator_char = ',';
12994       scale_char = ',';
12995     }
12996
12997   /* The output looks better if we put 7 bytes on a line, since that
12998      puts most long word instructions on a single line.  Use 8 bytes
12999      for Intel L1OM.  */
13000   if ((info->mach & bfd_mach_l1om) != 0)
13001     info->bytes_per_line = 8;
13002   else
13003     info->bytes_per_line = 7;
13004
13005   info->private_data = &priv;
13006   priv.max_fetched = priv.the_buffer;
13007   priv.insn_start = pc;
13008
13009   obuf[0] = 0;
13010   for (i = 0; i < MAX_OPERANDS; ++i)
13011     {
13012       op_out[i][0] = 0;
13013       op_index[i] = -1;
13014     }
13015
13016   the_info = info;
13017   start_pc = pc;
13018   start_codep = priv.the_buffer;
13019   codep = priv.the_buffer;
13020
13021   if (OPCODES_SIGSETJMP (priv.bailout) != 0)
13022     {
13023       const char *name;
13024
13025       /* Getting here means we tried for data but didn't get it.  That
13026          means we have an incomplete instruction of some sort.  Just
13027          print the first byte as a prefix or a .byte pseudo-op.  */
13028       if (codep > priv.the_buffer)
13029         {
13030           name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
13031           if (name != NULL)
13032             (*info->fprintf_func) (info->stream, "%s", name);
13033           else
13034             {
13035               /* Just print the first byte as a .byte instruction.  */
13036               (*info->fprintf_func) (info->stream, ".byte 0x%x",
13037                                      (unsigned int) priv.the_buffer[0]);
13038             }
13039
13040           return 1;
13041         }
13042
13043       return -1;
13044     }
13045
13046   obufp = obuf;
13047   sizeflag = priv.orig_sizeflag;
13048
13049   if (!ckprefix () || rex_used)
13050     {
13051       /* Too many prefixes or unused REX prefixes.  */
13052       for (i = 0;
13053            i < (int) ARRAY_SIZE (all_prefixes) && all_prefixes[i];
13054            i++)
13055         (*info->fprintf_func) (info->stream, "%s%s",
13056                                i == 0 ? "" : " ",
13057                                prefix_name (all_prefixes[i], sizeflag));
13058       return i;
13059     }
13060
13061   insn_codep = codep;
13062
13063   FETCH_DATA (info, codep + 1);
13064   two_source_ops = (*codep == 0x62) || (*codep == 0xc8);
13065
13066   if (((prefixes & PREFIX_FWAIT)
13067        && ((*codep < 0xd8) || (*codep > 0xdf))))
13068     {
13069       /* Handle prefixes before fwait.  */
13070       for (i = 0; i < fwait_prefix && all_prefixes[i];
13071            i++)
13072         (*info->fprintf_func) (info->stream, "%s ",
13073                                prefix_name (all_prefixes[i], sizeflag));
13074       (*info->fprintf_func) (info->stream, "fwait");
13075       return i + 1;
13076     }
13077
13078   if (*codep == 0x0f)
13079     {
13080       unsigned char threebyte;
13081       FETCH_DATA (info, codep + 2);
13082       threebyte = *++codep;
13083       dp = &dis386_twobyte[threebyte];
13084       need_modrm = twobyte_has_modrm[*codep];
13085       codep++;
13086     }
13087   else
13088     {
13089       dp = &dis386[*codep];
13090       need_modrm = onebyte_has_modrm[*codep];
13091       codep++;
13092     }
13093
13094   /* Save sizeflag for printing the extra prefixes later before updating
13095      it for mnemonic and operand processing.  The prefix names depend
13096      only on the address mode.  */
13097   orig_sizeflag = sizeflag;
13098   if (prefixes & PREFIX_ADDR)
13099     sizeflag ^= AFLAG;
13100   if ((prefixes & PREFIX_DATA))
13101     sizeflag ^= DFLAG;
13102
13103   end_codep = codep;
13104   if (need_modrm)
13105     {
13106       FETCH_DATA (info, codep + 1);
13107       modrm.mod = (*codep >> 6) & 3;
13108       modrm.reg = (*codep >> 3) & 7;
13109       modrm.rm = *codep & 7;
13110     }
13111
13112   need_vex = 0;
13113   need_vex_reg = 0;
13114   vex_w_done = 0;
13115   vex.evex = 0;
13116
13117   if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE)
13118     {
13119       get_sib (info, sizeflag);
13120       dofloat (sizeflag);
13121     }
13122   else
13123     {
13124       dp = get_valid_dis386 (dp, info);
13125       if (dp != NULL && putop (dp->name, sizeflag) == 0)
13126         {
13127           get_sib (info, sizeflag);
13128           for (i = 0; i < MAX_OPERANDS; ++i)
13129             {
13130               obufp = op_out[i];
13131               op_ad = MAX_OPERANDS - 1 - i;
13132               if (dp->op[i].rtn)
13133                 (*dp->op[i].rtn) (dp->op[i].bytemode, sizeflag);
13134               /* For EVEX instruction after the last operand masking
13135                  should be printed.  */
13136               if (i == 0 && vex.evex)
13137                 {
13138                   /* Don't print {%k0}.  */
13139                   if (vex.mask_register_specifier)
13140                     {
13141                       oappend ("{");
13142                       oappend (names_mask[vex.mask_register_specifier]);
13143                       oappend ("}");
13144                     }
13145                   if (vex.zeroing)
13146                     oappend ("{z}");
13147                 }
13148             }
13149         }
13150     }
13151
13152   /* Check if the REX prefix is used.  */
13153   if (rex_ignored == 0 && (rex ^ rex_used) == 0 && last_rex_prefix >= 0)
13154     all_prefixes[last_rex_prefix] = 0;
13155
13156   /* Check if the SEG prefix is used.  */
13157   if ((prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS | PREFIX_ES
13158                    | PREFIX_FS | PREFIX_GS)) != 0
13159       && (used_prefixes & active_seg_prefix) != 0)
13160     all_prefixes[last_seg_prefix] = 0;
13161
13162   /* Check if the ADDR prefix is used.  */
13163   if ((prefixes & PREFIX_ADDR) != 0
13164       && (used_prefixes & PREFIX_ADDR) != 0)
13165     all_prefixes[last_addr_prefix] = 0;
13166
13167   /* Check if the DATA prefix is used.  */
13168   if ((prefixes & PREFIX_DATA) != 0
13169       && (used_prefixes & PREFIX_DATA) != 0)
13170     all_prefixes[last_data_prefix] = 0;
13171
13172   /* Print the extra prefixes.  */
13173   prefix_length = 0;
13174   for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
13175     if (all_prefixes[i])
13176       {
13177         const char *name;
13178         name = prefix_name (all_prefixes[i], orig_sizeflag);
13179         if (name == NULL)
13180           abort ();
13181         prefix_length += strlen (name) + 1;
13182         (*info->fprintf_func) (info->stream, "%s ", name);
13183       }
13184
13185   /* If the mandatory PREFIX_REPZ/PREFIX_REPNZ/PREFIX_DATA prefix is
13186      unused, opcode is invalid.  Since the PREFIX_DATA prefix may be
13187      used by putop and MMX/SSE operand and may be overriden by the
13188      PREFIX_REPZ/PREFIX_REPNZ fix, we check the PREFIX_DATA prefix
13189      separately.  */
13190   if (dp->prefix_requirement == PREFIX_OPCODE
13191       && dp != &bad_opcode
13192       && (((prefixes
13193             & (PREFIX_REPZ | PREFIX_REPNZ)) != 0
13194            && (used_prefixes
13195                & (PREFIX_REPZ | PREFIX_REPNZ)) == 0)
13196           || ((((prefixes
13197                  & (PREFIX_REPZ | PREFIX_REPNZ | PREFIX_DATA))
13198                 == PREFIX_DATA)
13199                && (used_prefixes & PREFIX_DATA) == 0))))
13200     {
13201       (*info->fprintf_func) (info->stream, "(bad)");
13202       return end_codep - priv.the_buffer;
13203     }
13204
13205   /* Check maximum code length.  */
13206   if ((codep - start_codep) > MAX_CODE_LENGTH)
13207     {
13208       (*info->fprintf_func) (info->stream, "(bad)");
13209       return MAX_CODE_LENGTH;
13210     }
13211
13212   obufp = mnemonicendp;
13213   for (i = strlen (obuf) + prefix_length; i < 6; i++)
13214     oappend (" ");
13215   oappend (" ");
13216   (*info->fprintf_func) (info->stream, "%s", obuf);
13217
13218   /* The enter and bound instructions are printed with operands in the same
13219      order as the intel book; everything else is printed in reverse order.  */
13220   if (intel_syntax || two_source_ops)
13221     {
13222       bfd_vma riprel;
13223
13224       for (i = 0; i < MAX_OPERANDS; ++i)
13225         op_txt[i] = op_out[i];
13226
13227       if (intel_syntax && dp && dp->op[2].rtn == OP_Rounding
13228           && dp->op[3].rtn == OP_E && dp->op[4].rtn == NULL)
13229         {
13230           op_txt[2] = op_out[3];
13231           op_txt[3] = op_out[2];
13232         }
13233
13234       for (i = 0; i < (MAX_OPERANDS >> 1); ++i)
13235         {
13236           op_ad = op_index[i];
13237           op_index[i] = op_index[MAX_OPERANDS - 1 - i];
13238           op_index[MAX_OPERANDS - 1 - i] = op_ad;
13239           riprel = op_riprel[i];
13240           op_riprel[i] = op_riprel [MAX_OPERANDS - 1 - i];
13241           op_riprel[MAX_OPERANDS - 1 - i] = riprel;
13242         }
13243     }
13244   else
13245     {
13246       for (i = 0; i < MAX_OPERANDS; ++i)
13247         op_txt[MAX_OPERANDS - 1 - i] = op_out[i];
13248     }
13249
13250   needcomma = 0;
13251   for (i = 0; i < MAX_OPERANDS; ++i)
13252     if (*op_txt[i])
13253       {
13254         if (needcomma)
13255           (*info->fprintf_func) (info->stream, ",");
13256         if (op_index[i] != -1 && !op_riprel[i])
13257           (*info->print_address_func) ((bfd_vma) op_address[op_index[i]], info);
13258         else
13259           (*info->fprintf_func) (info->stream, "%s", op_txt[i]);
13260         needcomma = 1;
13261       }
13262
13263   for (i = 0; i < MAX_OPERANDS; i++)
13264     if (op_index[i] != -1 && op_riprel[i])
13265       {
13266         (*info->fprintf_func) (info->stream, "        # ");
13267         (*info->print_address_func) ((bfd_vma) (start_pc + codep - start_codep
13268                                                 + op_address[op_index[i]]), info);
13269         break;
13270       }
13271   return codep - priv.the_buffer;
13272 }
13273
13274 static const char *float_mem[] = {
13275   /* d8 */
13276   "fadd{s|}",
13277   "fmul{s|}",
13278   "fcom{s|}",
13279   "fcomp{s|}",
13280   "fsub{s|}",
13281   "fsubr{s|}",
13282   "fdiv{s|}",
13283   "fdivr{s|}",
13284   /* d9 */
13285   "fld{s|}",
13286   "(bad)",
13287   "fst{s|}",
13288   "fstp{s|}",
13289   "fldenvIC",
13290   "fldcw",
13291   "fNstenvIC",
13292   "fNstcw",
13293   /* da */
13294   "fiadd{l|}",
13295   "fimul{l|}",
13296   "ficom{l|}",
13297   "ficomp{l|}",
13298   "fisub{l|}",
13299   "fisubr{l|}",
13300   "fidiv{l|}",
13301   "fidivr{l|}",
13302   /* db */
13303   "fild{l|}",
13304   "fisttp{l|}",
13305   "fist{l|}",
13306   "fistp{l|}",
13307   "(bad)",
13308   "fld{t||t|}",
13309   "(bad)",
13310   "fstp{t||t|}",
13311   /* dc */
13312   "fadd{l|}",
13313   "fmul{l|}",
13314   "fcom{l|}",
13315   "fcomp{l|}",
13316   "fsub{l|}",
13317   "fsubr{l|}",
13318   "fdiv{l|}",
13319   "fdivr{l|}",
13320   /* dd */
13321   "fld{l|}",
13322   "fisttp{ll|}",
13323   "fst{l||}",
13324   "fstp{l|}",
13325   "frstorIC",
13326   "(bad)",
13327   "fNsaveIC",
13328   "fNstsw",
13329   /* de */
13330   "fiadd",
13331   "fimul",
13332   "ficom",
13333   "ficomp",
13334   "fisub",
13335   "fisubr",
13336   "fidiv",
13337   "fidivr",
13338   /* df */
13339   "fild",
13340   "fisttp",
13341   "fist",
13342   "fistp",
13343   "fbld",
13344   "fild{ll|}",
13345   "fbstp",
13346   "fistp{ll|}",
13347 };
13348
13349 static const unsigned char float_mem_mode[] = {
13350   /* d8 */
13351   d_mode,
13352   d_mode,
13353   d_mode,
13354   d_mode,
13355   d_mode,
13356   d_mode,
13357   d_mode,
13358   d_mode,
13359   /* d9 */
13360   d_mode,
13361   0,
13362   d_mode,
13363   d_mode,
13364   0,
13365   w_mode,
13366   0,
13367   w_mode,
13368   /* da */
13369   d_mode,
13370   d_mode,
13371   d_mode,
13372   d_mode,
13373   d_mode,
13374   d_mode,
13375   d_mode,
13376   d_mode,
13377   /* db */
13378   d_mode,
13379   d_mode,
13380   d_mode,
13381   d_mode,
13382   0,
13383   t_mode,
13384   0,
13385   t_mode,
13386   /* dc */
13387   q_mode,
13388   q_mode,
13389   q_mode,
13390   q_mode,
13391   q_mode,
13392   q_mode,
13393   q_mode,
13394   q_mode,
13395   /* dd */
13396   q_mode,
13397   q_mode,
13398   q_mode,
13399   q_mode,
13400   0,
13401   0,
13402   0,
13403   w_mode,
13404   /* de */
13405   w_mode,
13406   w_mode,
13407   w_mode,
13408   w_mode,
13409   w_mode,
13410   w_mode,
13411   w_mode,
13412   w_mode,
13413   /* df */
13414   w_mode,
13415   w_mode,
13416   w_mode,
13417   w_mode,
13418   t_mode,
13419   q_mode,
13420   t_mode,
13421   q_mode
13422 };
13423
13424 #define ST { OP_ST, 0 }
13425 #define STi { OP_STi, 0 }
13426
13427 #define FGRPd9_2 NULL, { { NULL, 0 } }, 0
13428 #define FGRPd9_4 NULL, { { NULL, 1 } }, 0
13429 #define FGRPd9_5 NULL, { { NULL, 2 } }, 0
13430 #define FGRPd9_6 NULL, { { NULL, 3 } }, 0
13431 #define FGRPd9_7 NULL, { { NULL, 4 } }, 0
13432 #define FGRPda_5 NULL, { { NULL, 5 } }, 0
13433 #define FGRPdb_4 NULL, { { NULL, 6 } }, 0
13434 #define FGRPde_3 NULL, { { NULL, 7 } }, 0
13435 #define FGRPdf_4 NULL, { { NULL, 8 } }, 0
13436
13437 static const struct dis386 float_reg[][8] = {
13438   /* d8 */
13439   {
13440     { "fadd",   { ST, STi }, 0 },
13441     { "fmul",   { ST, STi }, 0 },
13442     { "fcom",   { STi }, 0 },
13443     { "fcomp",  { STi }, 0 },
13444     { "fsub",   { ST, STi }, 0 },
13445     { "fsubr",  { ST, STi }, 0 },
13446     { "fdiv",   { ST, STi }, 0 },
13447     { "fdivr",  { ST, STi }, 0 },
13448   },
13449   /* d9 */
13450   {
13451     { "fld",    { STi }, 0 },
13452     { "fxch",   { STi }, 0 },
13453     { FGRPd9_2 },
13454     { Bad_Opcode },
13455     { FGRPd9_4 },
13456     { FGRPd9_5 },
13457     { FGRPd9_6 },
13458     { FGRPd9_7 },
13459   },
13460   /* da */
13461   {
13462     { "fcmovb", { ST, STi }, 0 },
13463     { "fcmove", { ST, STi }, 0 },
13464     { "fcmovbe",{ ST, STi }, 0 },
13465     { "fcmovu", { ST, STi }, 0 },
13466     { Bad_Opcode },
13467     { FGRPda_5 },
13468     { Bad_Opcode },
13469     { Bad_Opcode },
13470   },
13471   /* db */
13472   {
13473     { "fcmovnb",{ ST, STi }, 0 },
13474     { "fcmovne",{ ST, STi }, 0 },
13475     { "fcmovnbe",{ ST, STi }, 0 },
13476     { "fcmovnu",{ ST, STi }, 0 },
13477     { FGRPdb_4 },
13478     { "fucomi", { ST, STi }, 0 },
13479     { "fcomi",  { ST, STi }, 0 },
13480     { Bad_Opcode },
13481   },
13482   /* dc */
13483   {
13484     { "fadd",   { STi, ST }, 0 },
13485     { "fmul",   { STi, ST }, 0 },
13486     { Bad_Opcode },
13487     { Bad_Opcode },
13488     { "fsub!M", { STi, ST }, 0 },
13489     { "fsubM",  { STi, ST }, 0 },
13490     { "fdiv!M", { STi, ST }, 0 },
13491     { "fdivM",  { STi, ST }, 0 },
13492   },
13493   /* dd */
13494   {
13495     { "ffree",  { STi }, 0 },
13496     { Bad_Opcode },
13497     { "fst",    { STi }, 0 },
13498     { "fstp",   { STi }, 0 },
13499     { "fucom",  { STi }, 0 },
13500     { "fucomp", { STi }, 0 },
13501     { Bad_Opcode },
13502     { Bad_Opcode },
13503   },
13504   /* de */
13505   {
13506     { "faddp",  { STi, ST }, 0 },
13507     { "fmulp",  { STi, ST }, 0 },
13508     { Bad_Opcode },
13509     { FGRPde_3 },
13510     { "fsub!Mp", { STi, ST }, 0 },
13511     { "fsubMp", { STi, ST }, 0 },
13512     { "fdiv!Mp", { STi, ST }, 0 },
13513     { "fdivMp", { STi, ST }, 0 },
13514   },
13515   /* df */
13516   {
13517     { "ffreep", { STi }, 0 },
13518     { Bad_Opcode },
13519     { Bad_Opcode },
13520     { Bad_Opcode },
13521     { FGRPdf_4 },
13522     { "fucomip", { ST, STi }, 0 },
13523     { "fcomip", { ST, STi }, 0 },
13524     { Bad_Opcode },
13525   },
13526 };
13527
13528 static char *fgrps[][8] = {
13529   /* d9_2  0 */
13530   {
13531     "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
13532   },
13533
13534   /* d9_4  1 */
13535   {
13536     "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
13537   },
13538
13539   /* d9_5  2 */
13540   {
13541     "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
13542   },
13543
13544   /* d9_6  3 */
13545   {
13546     "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
13547   },
13548
13549   /* d9_7  4 */
13550   {
13551     "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
13552   },
13553
13554   /* da_5  5 */
13555   {
13556     "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
13557   },
13558
13559   /* db_4  6 */
13560   {
13561     "fNeni(8087 only)","fNdisi(8087 only)","fNclex","fNinit",
13562     "fNsetpm(287 only)","frstpm(287 only)","(bad)","(bad)",
13563   },
13564
13565   /* de_3  7 */
13566   {
13567     "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
13568   },
13569
13570   /* df_4  8 */
13571   {
13572     "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
13573   },
13574 };
13575
13576 static void
13577 swap_operand (void)
13578 {
13579   mnemonicendp[0] = '.';
13580   mnemonicendp[1] = 's';
13581   mnemonicendp += 2;
13582 }
13583
13584 static void
13585 OP_Skip_MODRM (int bytemode ATTRIBUTE_UNUSED,
13586                int sizeflag ATTRIBUTE_UNUSED)
13587 {
13588   /* Skip mod/rm byte.  */
13589   MODRM_CHECK;
13590   codep++;
13591 }
13592
13593 static void
13594 dofloat (int sizeflag)
13595 {
13596   const struct dis386 *dp;
13597   unsigned char floatop;
13598
13599   floatop = codep[-1];
13600
13601   if (modrm.mod != 3)
13602     {
13603       int fp_indx = (floatop - 0xd8) * 8 + modrm.reg;
13604
13605       putop (float_mem[fp_indx], sizeflag);
13606       obufp = op_out[0];
13607       op_ad = 2;
13608       OP_E (float_mem_mode[fp_indx], sizeflag);
13609       return;
13610     }
13611   /* Skip mod/rm byte.  */
13612   MODRM_CHECK;
13613   codep++;
13614
13615   dp = &float_reg[floatop - 0xd8][modrm.reg];
13616   if (dp->name == NULL)
13617     {
13618       putop (fgrps[dp->op[0].bytemode][modrm.rm], sizeflag);
13619
13620       /* Instruction fnstsw is only one with strange arg.  */
13621       if (floatop == 0xdf && codep[-1] == 0xe0)
13622         strcpy (op_out[0], names16[0]);
13623     }
13624   else
13625     {
13626       putop (dp->name, sizeflag);
13627
13628       obufp = op_out[0];
13629       op_ad = 2;
13630       if (dp->op[0].rtn)
13631         (*dp->op[0].rtn) (dp->op[0].bytemode, sizeflag);
13632
13633       obufp = op_out[1];
13634       op_ad = 1;
13635       if (dp->op[1].rtn)
13636         (*dp->op[1].rtn) (dp->op[1].bytemode, sizeflag);
13637     }
13638 }
13639
13640 /* Like oappend (below), but S is a string starting with '%'.
13641    In Intel syntax, the '%' is elided.  */
13642 static void
13643 oappend_maybe_intel (const char *s)
13644 {
13645   oappend (s + intel_syntax);
13646 }
13647
13648 static void
13649 OP_ST (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13650 {
13651   oappend_maybe_intel ("%st");
13652 }
13653
13654 static void
13655 OP_STi (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13656 {
13657   sprintf (scratchbuf, "%%st(%d)", modrm.rm);
13658   oappend_maybe_intel (scratchbuf);
13659 }
13660
13661 /* Capital letters in template are macros.  */
13662 static int
13663 putop (const char *in_template, int sizeflag)
13664 {
13665   const char *p;
13666   int alt = 0;
13667   int cond = 1;
13668   unsigned int l = 0, len = 1;
13669   char last[4];
13670
13671 #define SAVE_LAST(c)                    \
13672   if (l < len && l < sizeof (last))     \
13673     last[l++] = c;                      \
13674   else                                  \
13675     abort ();
13676
13677   for (p = in_template; *p; p++)
13678     {
13679       switch (*p)
13680         {
13681         default:
13682           *obufp++ = *p;
13683           break;
13684         case '%':
13685           len++;
13686           break;
13687         case '!':
13688           cond = 0;
13689           break;
13690         case '{':
13691           alt = 0;
13692           if (intel_syntax)
13693             {
13694               while (*++p != '|')
13695                 if (*p == '}' || *p == '\0')
13696                   abort ();
13697             }
13698           /* Fall through.  */
13699         case 'I':
13700           alt = 1;
13701           continue;
13702         case '|':
13703           while (*++p != '}')
13704             {
13705               if (*p == '\0')
13706                 abort ();
13707             }
13708           break;
13709         case '}':
13710           break;
13711         case 'A':
13712           if (intel_syntax)
13713             break;
13714           if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
13715             *obufp++ = 'b';
13716           break;
13717         case 'B':
13718           if (l == 0 && len == 1)
13719             {
13720 case_B:
13721               if (intel_syntax)
13722                 break;
13723               if (sizeflag & SUFFIX_ALWAYS)
13724                 *obufp++ = 'b';
13725             }
13726           else
13727             {
13728               if (l != 1
13729                   || len != 2
13730                   || last[0] != 'L')
13731                 {
13732                   SAVE_LAST (*p);
13733                   break;
13734                 }
13735
13736               if (address_mode == mode_64bit
13737                   && !(prefixes & PREFIX_ADDR))
13738                 {
13739                   *obufp++ = 'a';
13740                   *obufp++ = 'b';
13741                   *obufp++ = 's';
13742                 }
13743
13744               goto case_B;
13745             }
13746           break;
13747         case 'C':
13748           if (intel_syntax && !alt)
13749             break;
13750           if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
13751             {
13752               if (sizeflag & DFLAG)
13753                 *obufp++ = intel_syntax ? 'd' : 'l';
13754               else
13755                 *obufp++ = intel_syntax ? 'w' : 's';
13756               used_prefixes |= (prefixes & PREFIX_DATA);
13757             }
13758           break;
13759         case 'D':
13760           if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
13761             break;
13762           USED_REX (REX_W);
13763           if (modrm.mod == 3)
13764             {
13765               if (rex & REX_W)
13766                 *obufp++ = 'q';
13767               else
13768                 {
13769                   if (sizeflag & DFLAG)
13770                     *obufp++ = intel_syntax ? 'd' : 'l';
13771                   else
13772                     *obufp++ = 'w';
13773                   used_prefixes |= (prefixes & PREFIX_DATA);
13774                 }
13775             }
13776           else
13777             *obufp++ = 'w';
13778           break;
13779         case 'E':               /* For jcxz/jecxz */
13780           if (address_mode == mode_64bit)
13781             {
13782               if (sizeflag & AFLAG)
13783                 *obufp++ = 'r';
13784               else
13785                 *obufp++ = 'e';
13786             }
13787           else
13788             if (sizeflag & AFLAG)
13789               *obufp++ = 'e';
13790           used_prefixes |= (prefixes & PREFIX_ADDR);
13791           break;
13792         case 'F':
13793           if (intel_syntax)
13794             break;
13795           if ((prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS))
13796             {
13797               if (sizeflag & AFLAG)
13798                 *obufp++ = address_mode == mode_64bit ? 'q' : 'l';
13799               else
13800                 *obufp++ = address_mode == mode_64bit ? 'l' : 'w';
13801               used_prefixes |= (prefixes & PREFIX_ADDR);
13802             }
13803           break;
13804         case 'G':
13805           if (intel_syntax || (obufp[-1] != 's' && !(sizeflag & SUFFIX_ALWAYS)))
13806             break;
13807           if ((rex & REX_W) || (sizeflag & DFLAG))
13808             *obufp++ = 'l';
13809           else
13810             *obufp++ = 'w';
13811           if (!(rex & REX_W))
13812             used_prefixes |= (prefixes & PREFIX_DATA);
13813           break;
13814         case 'H':
13815           if (intel_syntax)
13816             break;
13817           if ((prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS
13818               || (prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS)
13819             {
13820               used_prefixes |= prefixes & (PREFIX_CS | PREFIX_DS);
13821               *obufp++ = ',';
13822               *obufp++ = 'p';
13823               if (prefixes & PREFIX_DS)
13824                 *obufp++ = 't';
13825               else
13826                 *obufp++ = 'n';
13827             }
13828           break;
13829         case 'J':
13830           if (intel_syntax)
13831             break;
13832           *obufp++ = 'l';
13833           break;
13834         case 'K':
13835           USED_REX (REX_W);
13836           if (rex & REX_W)
13837             *obufp++ = 'q';
13838           else
13839             *obufp++ = 'd';
13840           break;
13841         case 'Z':
13842           if (l != 0 || len != 1)
13843             {
13844               if (l != 1 || len != 2 || last[0] != 'X')
13845                 {
13846                   SAVE_LAST (*p);
13847                   break;
13848                 }
13849               if (!need_vex || !vex.evex)
13850                 abort ();
13851               if (intel_syntax
13852                   || ((modrm.mod == 3 || vex.b) && !(sizeflag & SUFFIX_ALWAYS)))
13853                 break;
13854               switch (vex.length)
13855                 {
13856                 case 128:
13857                   *obufp++ = 'x';
13858                   break;
13859                 case 256:
13860                   *obufp++ = 'y';
13861                   break;
13862                 case 512:
13863                   *obufp++ = 'z';
13864                   break;
13865                 default:
13866                   abort ();
13867                 }
13868               break;
13869             }
13870           if (intel_syntax)
13871             break;
13872           if (address_mode == mode_64bit && (sizeflag & SUFFIX_ALWAYS))
13873             {
13874               *obufp++ = 'q';
13875               break;
13876             }
13877           /* Fall through.  */
13878           goto case_L;
13879         case 'L':
13880           if (l != 0 || len != 1)
13881             {
13882               SAVE_LAST (*p);
13883               break;
13884             }
13885 case_L:
13886           if (intel_syntax)
13887             break;
13888           if (sizeflag & SUFFIX_ALWAYS)
13889             *obufp++ = 'l';
13890           break;
13891         case 'M':
13892           if (intel_mnemonic != cond)
13893             *obufp++ = 'r';
13894           break;
13895         case 'N':
13896           if ((prefixes & PREFIX_FWAIT) == 0)
13897             *obufp++ = 'n';
13898           else
13899             used_prefixes |= PREFIX_FWAIT;
13900           break;
13901         case 'O':
13902           USED_REX (REX_W);
13903           if (rex & REX_W)
13904             *obufp++ = 'o';
13905           else if (intel_syntax && (sizeflag & DFLAG))
13906             *obufp++ = 'q';
13907           else
13908             *obufp++ = 'd';
13909           if (!(rex & REX_W))
13910             used_prefixes |= (prefixes & PREFIX_DATA);
13911           break;
13912         case 'T':
13913           if (!intel_syntax
13914               && address_mode == mode_64bit
13915               && ((sizeflag & DFLAG) || (rex & REX_W)))
13916             {
13917               *obufp++ = 'q';
13918               break;
13919             }
13920           /* Fall through.  */
13921           goto case_P;
13922         case 'P':
13923           if (l == 0 && len == 1)
13924             {
13925 case_P:
13926               if (intel_syntax)
13927                 {
13928                   if ((rex & REX_W) == 0
13929                       && (prefixes & PREFIX_DATA))
13930                     {
13931                       if ((sizeflag & DFLAG) == 0)
13932                         *obufp++ = 'w';
13933                       used_prefixes |= (prefixes & PREFIX_DATA);
13934                     }
13935                   break;
13936                 }
13937               if ((prefixes & PREFIX_DATA)
13938                   || (rex & REX_W)
13939                   || (sizeflag & SUFFIX_ALWAYS))
13940                 {
13941                   USED_REX (REX_W);
13942                   if (rex & REX_W)
13943                     *obufp++ = 'q';
13944                   else
13945                     {
13946                       if (sizeflag & DFLAG)
13947                         *obufp++ = 'l';
13948                       else
13949                         *obufp++ = 'w';
13950                       used_prefixes |= (prefixes & PREFIX_DATA);
13951                     }
13952                 }
13953             }
13954           else
13955             {
13956               if (l != 1 || len != 2 || last[0] != 'L')
13957                 {
13958                   SAVE_LAST (*p);
13959                   break;
13960                 }
13961
13962               if ((prefixes & PREFIX_DATA)
13963                   || (rex & REX_W)
13964                   || (sizeflag & SUFFIX_ALWAYS))
13965                 {
13966                   USED_REX (REX_W);
13967                   if (rex & REX_W)
13968                     *obufp++ = 'q';
13969                   else
13970                     {
13971                       if (sizeflag & DFLAG)
13972                         *obufp++ = intel_syntax ? 'd' : 'l';
13973                       else
13974                         *obufp++ = 'w';
13975                       used_prefixes |= (prefixes & PREFIX_DATA);
13976                     }
13977                 }
13978             }
13979           break;
13980         case 'U':
13981           if (intel_syntax)
13982             break;
13983           if (address_mode == mode_64bit
13984               && ((sizeflag & DFLAG) || (rex & REX_W)))
13985             {
13986               if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
13987                 *obufp++ = 'q';
13988               break;
13989             }
13990           /* Fall through.  */
13991           goto case_Q;
13992         case 'Q':
13993           if (l == 0 && len == 1)
13994             {
13995 case_Q:
13996               if (intel_syntax && !alt)
13997                 break;
13998               USED_REX (REX_W);
13999               if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
14000                 {
14001                   if (rex & REX_W)
14002                     *obufp++ = 'q';
14003                   else
14004                     {
14005                       if (sizeflag & DFLAG)
14006                         *obufp++ = intel_syntax ? 'd' : 'l';
14007                       else
14008                         *obufp++ = 'w';
14009                       used_prefixes |= (prefixes & PREFIX_DATA);
14010                     }
14011                 }
14012             }
14013           else
14014             {
14015               if (l != 1 || len != 2 || last[0] != 'L')
14016                 {
14017                   SAVE_LAST (*p);
14018                   break;
14019                 }
14020               if (intel_syntax
14021                   || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
14022                 break;
14023               if ((rex & REX_W))
14024                 {
14025                   USED_REX (REX_W);
14026                   *obufp++ = 'q';
14027                 }
14028               else
14029                 *obufp++ = 'l';
14030             }
14031           break;
14032         case 'R':
14033           USED_REX (REX_W);
14034           if (rex & REX_W)
14035             *obufp++ = 'q';
14036           else if (sizeflag & DFLAG)
14037             {
14038               if (intel_syntax)
14039                   *obufp++ = 'd';
14040               else
14041                   *obufp++ = 'l';
14042             }
14043           else
14044             *obufp++ = 'w';
14045           if (intel_syntax && !p[1]
14046               && ((rex & REX_W) || (sizeflag & DFLAG)))
14047             *obufp++ = 'e';
14048           if (!(rex & REX_W))
14049             used_prefixes |= (prefixes & PREFIX_DATA);
14050           break;
14051         case 'V':
14052           if (l == 0 && len == 1)
14053             {
14054               if (intel_syntax)
14055                 break;
14056               if (address_mode == mode_64bit
14057                   && ((sizeflag & DFLAG) || (rex & REX_W)))
14058                 {
14059                   if (sizeflag & SUFFIX_ALWAYS)
14060                     *obufp++ = 'q';
14061                   break;
14062                 }
14063             }
14064           else
14065             {
14066               if (l != 1
14067                   || len != 2
14068                   || last[0] != 'L')
14069                 {
14070                   SAVE_LAST (*p);
14071                   break;
14072                 }
14073
14074               if (rex & REX_W)
14075                 {
14076                   *obufp++ = 'a';
14077                   *obufp++ = 'b';
14078                   *obufp++ = 's';
14079                 }
14080             }
14081           /* Fall through.  */
14082           goto case_S;
14083         case 'S':
14084           if (l == 0 && len == 1)
14085             {
14086 case_S:
14087               if (intel_syntax)
14088                 break;
14089               if (sizeflag & SUFFIX_ALWAYS)
14090                 {
14091                   if (rex & REX_W)
14092                     *obufp++ = 'q';
14093                   else
14094                     {
14095                       if (sizeflag & DFLAG)
14096                         *obufp++ = 'l';
14097                       else
14098                         *obufp++ = 'w';
14099                       used_prefixes |= (prefixes & PREFIX_DATA);
14100                     }
14101                 }
14102             }
14103           else
14104             {
14105               if (l != 1
14106                   || len != 2
14107                   || last[0] != 'L')
14108                 {
14109                   SAVE_LAST (*p);
14110                   break;
14111                 }
14112
14113               if (address_mode == mode_64bit
14114                   && !(prefixes & PREFIX_ADDR))
14115                 {
14116                   *obufp++ = 'a';
14117                   *obufp++ = 'b';
14118                   *obufp++ = 's';
14119                 }
14120
14121               goto case_S;
14122             }
14123           break;
14124         case 'X':
14125           if (l != 0 || len != 1)
14126             {
14127               SAVE_LAST (*p);
14128               break;
14129             }
14130           if (need_vex && vex.prefix)
14131             {
14132               if (vex.prefix == DATA_PREFIX_OPCODE)
14133                 *obufp++ = 'd';
14134               else
14135                 *obufp++ = 's';
14136             }
14137           else
14138             {
14139               if (prefixes & PREFIX_DATA)
14140                 *obufp++ = 'd';
14141               else
14142                 *obufp++ = 's';
14143               used_prefixes |= (prefixes & PREFIX_DATA);
14144             }
14145           break;
14146         case 'Y':
14147           if (l == 0 && len == 1)
14148             {
14149               if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
14150                 break;
14151               if (rex & REX_W)
14152                 {
14153                   USED_REX (REX_W);
14154                   *obufp++ = 'q';
14155                 }
14156               break;
14157             }
14158           else
14159             {
14160               if (l != 1 || len != 2 || last[0] != 'X')
14161                 {
14162                   SAVE_LAST (*p);
14163                   break;
14164                 }
14165               if (!need_vex)
14166                 abort ();
14167               if (intel_syntax
14168                   || ((modrm.mod == 3 || vex.b) && !(sizeflag & SUFFIX_ALWAYS)))
14169                 break;
14170               switch (vex.length)
14171                 {
14172                 case 128:
14173                   *obufp++ = 'x';
14174                   break;
14175                 case 256:
14176                   *obufp++ = 'y';
14177                   break;
14178                 case 512:
14179                   if (!vex.evex)
14180                 default:
14181                     abort ();
14182                 }
14183             }
14184           break;
14185         case 'W':
14186           if (l == 0 && len == 1)
14187             {
14188               /* operand size flag for cwtl, cbtw */
14189               USED_REX (REX_W);
14190               if (rex & REX_W)
14191                 {
14192                   if (intel_syntax)
14193                     *obufp++ = 'd';
14194                   else
14195                     *obufp++ = 'l';
14196                 }
14197               else if (sizeflag & DFLAG)
14198                 *obufp++ = 'w';
14199               else
14200                 *obufp++ = 'b';
14201               if (!(rex & REX_W))
14202                 used_prefixes |= (prefixes & PREFIX_DATA);
14203             }
14204           else
14205             {
14206               if (l != 1
14207                   || len != 2
14208                   || (last[0] != 'X'
14209                       && last[0] != 'L'))
14210                 {
14211                   SAVE_LAST (*p);
14212                   break;
14213                 }
14214               if (!need_vex)
14215                 abort ();
14216               if (last[0] == 'X')
14217                 *obufp++ = vex.w ? 'd': 's';
14218               else
14219                 *obufp++ = vex.w ? 'q': 'd';
14220             }
14221           break;
14222         case '^':
14223           if (intel_syntax)
14224             break;
14225           if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
14226             {
14227               if (sizeflag & DFLAG)
14228                 *obufp++ = 'l';
14229               else
14230                 *obufp++ = 'w';
14231               used_prefixes |= (prefixes & PREFIX_DATA);
14232             }
14233           break;
14234         case '@':
14235           if (intel_syntax)
14236             break;
14237           if (address_mode == mode_64bit
14238               && (isa64 == intel64
14239                   || ((sizeflag & DFLAG) || (rex & REX_W))))
14240               *obufp++ = 'q';
14241           else if ((prefixes & PREFIX_DATA))
14242             {
14243               if (!(sizeflag & DFLAG))
14244                 *obufp++ = 'w';
14245               used_prefixes |= (prefixes & PREFIX_DATA);
14246             }
14247           break;
14248         }
14249       alt = 0;
14250     }
14251   *obufp = 0;
14252   mnemonicendp = obufp;
14253   return 0;
14254 }
14255
14256 static void
14257 oappend (const char *s)
14258 {
14259   obufp = stpcpy (obufp, s);
14260 }
14261
14262 static void
14263 append_seg (void)
14264 {
14265   /* Only print the active segment register.  */
14266   if (!active_seg_prefix)
14267     return;
14268
14269   used_prefixes |= active_seg_prefix;
14270   switch (active_seg_prefix)
14271     {
14272     case PREFIX_CS:
14273       oappend_maybe_intel ("%cs:");
14274       break;
14275     case PREFIX_DS:
14276       oappend_maybe_intel ("%ds:");
14277       break;
14278     case PREFIX_SS:
14279       oappend_maybe_intel ("%ss:");
14280       break;
14281     case PREFIX_ES:
14282       oappend_maybe_intel ("%es:");
14283       break;
14284     case PREFIX_FS:
14285       oappend_maybe_intel ("%fs:");
14286       break;
14287     case PREFIX_GS:
14288       oappend_maybe_intel ("%gs:");
14289       break;
14290     default:
14291       break;
14292     }
14293 }
14294
14295 static void
14296 OP_indirE (int bytemode, int sizeflag)
14297 {
14298   if (!intel_syntax)
14299     oappend ("*");
14300   OP_E (bytemode, sizeflag);
14301 }
14302
14303 static void
14304 print_operand_value (char *buf, int hex, bfd_vma disp)
14305 {
14306   if (address_mode == mode_64bit)
14307     {
14308       if (hex)
14309         {
14310           char tmp[30];
14311           int i;
14312           buf[0] = '0';
14313           buf[1] = 'x';
14314           sprintf_vma (tmp, disp);
14315           for (i = 0; tmp[i] == '0' && tmp[i + 1]; i++);
14316           strcpy (buf + 2, tmp + i);
14317         }
14318       else
14319         {
14320           bfd_signed_vma v = disp;
14321           char tmp[30];
14322           int i;
14323           if (v < 0)
14324             {
14325               *(buf++) = '-';
14326               v = -disp;
14327               /* Check for possible overflow on 0x8000000000000000.  */
14328               if (v < 0)
14329                 {
14330                   strcpy (buf, "9223372036854775808");
14331                   return;
14332                 }
14333             }
14334           if (!v)
14335             {
14336               strcpy (buf, "0");
14337               return;
14338             }
14339
14340           i = 0;
14341           tmp[29] = 0;
14342           while (v)
14343             {
14344               tmp[28 - i] = (v % 10) + '0';
14345               v /= 10;
14346               i++;
14347             }
14348           strcpy (buf, tmp + 29 - i);
14349         }
14350     }
14351   else
14352     {
14353       if (hex)
14354         sprintf (buf, "0x%x", (unsigned int) disp);
14355       else
14356         sprintf (buf, "%d", (int) disp);
14357     }
14358 }
14359
14360 /* Put DISP in BUF as signed hex number.  */
14361
14362 static void
14363 print_displacement (char *buf, bfd_vma disp)
14364 {
14365   bfd_signed_vma val = disp;
14366   char tmp[30];
14367   int i, j = 0;
14368
14369   if (val < 0)
14370     {
14371       buf[j++] = '-';
14372       val = -disp;
14373
14374       /* Check for possible overflow.  */
14375       if (val < 0)
14376         {
14377           switch (address_mode)
14378             {
14379             case mode_64bit:
14380               strcpy (buf + j, "0x8000000000000000");
14381               break;
14382             case mode_32bit:
14383               strcpy (buf + j, "0x80000000");
14384               break;
14385             case mode_16bit:
14386               strcpy (buf + j, "0x8000");
14387               break;
14388             }
14389           return;
14390         }
14391     }
14392
14393   buf[j++] = '0';
14394   buf[j++] = 'x';
14395
14396   sprintf_vma (tmp, (bfd_vma) val);
14397   for (i = 0; tmp[i] == '0'; i++)
14398     continue;
14399   if (tmp[i] == '\0')
14400     i--;
14401   strcpy (buf + j, tmp + i);
14402 }
14403
14404 static void
14405 intel_operand_size (int bytemode, int sizeflag)
14406 {
14407   if (vex.evex
14408       && vex.b
14409       && (bytemode == x_mode
14410           || bytemode == evex_half_bcst_xmmq_mode))
14411     {
14412       if (vex.w)
14413         oappend ("QWORD PTR ");
14414       else
14415         oappend ("DWORD PTR ");
14416       return;
14417     }
14418   switch (bytemode)
14419     {
14420     case b_mode:
14421     case b_swap_mode:
14422     case dqb_mode:
14423     case db_mode:
14424       oappend ("BYTE PTR ");
14425       break;
14426     case w_mode:
14427     case dw_mode:
14428     case dqw_mode:
14429     case dqw_swap_mode:
14430       oappend ("WORD PTR ");
14431       break;
14432     case stack_v_mode:
14433       if (address_mode == mode_64bit && ((sizeflag & DFLAG) || (rex & REX_W)))
14434         {
14435           oappend ("QWORD PTR ");
14436           break;
14437         }
14438       /* FALLTHRU */
14439     case v_mode:
14440     case v_swap_mode:
14441     case dq_mode:
14442       USED_REX (REX_W);
14443       if (rex & REX_W)
14444         oappend ("QWORD PTR ");
14445       else
14446         {
14447           if ((sizeflag & DFLAG) || bytemode == dq_mode)
14448             oappend ("DWORD PTR ");
14449           else
14450             oappend ("WORD PTR ");
14451           used_prefixes |= (prefixes & PREFIX_DATA);
14452         }
14453       break;
14454     case z_mode:
14455       if ((rex & REX_W) || (sizeflag & DFLAG))
14456         *obufp++ = 'D';
14457       oappend ("WORD PTR ");
14458       if (!(rex & REX_W))
14459         used_prefixes |= (prefixes & PREFIX_DATA);
14460       break;
14461     case a_mode:
14462       if (sizeflag & DFLAG)
14463         oappend ("QWORD PTR ");
14464       else
14465         oappend ("DWORD PTR ");
14466       used_prefixes |= (prefixes & PREFIX_DATA);
14467       break;
14468     case d_mode:
14469     case d_scalar_mode:
14470     case d_scalar_swap_mode:
14471     case d_swap_mode:
14472     case dqd_mode:
14473       oappend ("DWORD PTR ");
14474       break;
14475     case q_mode:
14476     case q_scalar_mode:
14477     case q_scalar_swap_mode:
14478     case q_swap_mode:
14479       oappend ("QWORD PTR ");
14480       break;
14481     case m_mode:
14482       if (address_mode == mode_64bit)
14483         oappend ("QWORD PTR ");
14484       else
14485         oappend ("DWORD PTR ");
14486       break;
14487     case f_mode:
14488       if (sizeflag & DFLAG)
14489         oappend ("FWORD PTR ");
14490       else
14491         oappend ("DWORD PTR ");
14492       used_prefixes |= (prefixes & PREFIX_DATA);
14493       break;
14494     case t_mode:
14495       oappend ("TBYTE PTR ");
14496       break;
14497     case x_mode:
14498     case x_swap_mode:
14499     case evex_x_gscat_mode:
14500     case evex_x_nobcst_mode:
14501       if (need_vex)
14502         {
14503           switch (vex.length)
14504             {
14505             case 128:
14506               oappend ("XMMWORD PTR ");
14507               break;
14508             case 256:
14509               oappend ("YMMWORD PTR ");
14510               break;
14511             case 512:
14512               oappend ("ZMMWORD PTR ");
14513               break;
14514             default:
14515               abort ();
14516             }
14517         }
14518       else
14519         oappend ("XMMWORD PTR ");
14520       break;
14521     case xmm_mode:
14522       oappend ("XMMWORD PTR ");
14523       break;
14524     case ymm_mode:
14525       oappend ("YMMWORD PTR ");
14526       break;
14527     case xmmq_mode:
14528     case evex_half_bcst_xmmq_mode:
14529       if (!need_vex)
14530         abort ();
14531
14532       switch (vex.length)
14533         {
14534         case 128:
14535           oappend ("QWORD PTR ");
14536           break;
14537         case 256:
14538           oappend ("XMMWORD PTR ");
14539           break;
14540         case 512:
14541           oappend ("YMMWORD PTR ");
14542           break;
14543         default:
14544           abort ();
14545         }
14546       break;
14547     case xmm_mb_mode:
14548       if (!need_vex)
14549         abort ();
14550
14551       switch (vex.length)
14552         {
14553         case 128:
14554         case 256:
14555         case 512:
14556           oappend ("BYTE PTR ");
14557           break;
14558         default:
14559           abort ();
14560         }
14561       break;
14562     case xmm_mw_mode:
14563       if (!need_vex)
14564         abort ();
14565
14566       switch (vex.length)
14567         {
14568         case 128:
14569         case 256:
14570         case 512:
14571           oappend ("WORD PTR ");
14572           break;
14573         default:
14574           abort ();
14575         }
14576       break;
14577     case xmm_md_mode:
14578       if (!need_vex)
14579         abort ();
14580
14581       switch (vex.length)
14582         {
14583         case 128:
14584         case 256:
14585         case 512:
14586           oappend ("DWORD PTR ");
14587           break;
14588         default:
14589           abort ();
14590         }
14591       break;
14592     case xmm_mq_mode:
14593       if (!need_vex)
14594         abort ();
14595
14596       switch (vex.length)
14597         {
14598         case 128:
14599         case 256:
14600         case 512:
14601           oappend ("QWORD PTR ");
14602           break;
14603         default:
14604           abort ();
14605         }
14606       break;
14607     case xmmdw_mode:
14608       if (!need_vex)
14609         abort ();
14610
14611       switch (vex.length)
14612         {
14613         case 128:
14614           oappend ("WORD PTR ");
14615           break;
14616         case 256:
14617           oappend ("DWORD PTR ");
14618           break;
14619         case 512:
14620           oappend ("QWORD PTR ");
14621           break;
14622         default:
14623           abort ();
14624         }
14625       break;
14626     case xmmqd_mode:
14627       if (!need_vex)
14628         abort ();
14629
14630       switch (vex.length)
14631         {
14632         case 128:
14633           oappend ("DWORD PTR ");
14634           break;
14635         case 256:
14636           oappend ("QWORD PTR ");
14637           break;
14638         case 512:
14639           oappend ("XMMWORD PTR ");
14640           break;
14641         default:
14642           abort ();
14643         }
14644       break;
14645     case ymmq_mode:
14646       if (!need_vex)
14647         abort ();
14648
14649       switch (vex.length)
14650         {
14651         case 128:
14652           oappend ("QWORD PTR ");
14653           break;
14654         case 256:
14655           oappend ("YMMWORD PTR ");
14656           break;
14657         case 512:
14658           oappend ("ZMMWORD PTR ");
14659           break;
14660         default:
14661           abort ();
14662         }
14663       break;
14664     case ymmxmm_mode:
14665       if (!need_vex)
14666         abort ();
14667
14668       switch (vex.length)
14669         {
14670         case 128:
14671         case 256:
14672           oappend ("XMMWORD PTR ");
14673           break;
14674         default:
14675           abort ();
14676         }
14677       break;
14678     case o_mode:
14679       oappend ("OWORD PTR ");
14680       break;
14681     case xmm_mdq_mode:
14682     case vex_w_dq_mode:
14683     case vex_scalar_w_dq_mode:
14684       if (!need_vex)
14685         abort ();
14686
14687       if (vex.w)
14688         oappend ("QWORD PTR ");
14689       else
14690         oappend ("DWORD PTR ");
14691       break;
14692     case vex_vsib_d_w_dq_mode:
14693     case vex_vsib_q_w_dq_mode:
14694       if (!need_vex)
14695         abort ();
14696
14697       if (!vex.evex)
14698         {
14699           if (vex.w)
14700             oappend ("QWORD PTR ");
14701           else
14702             oappend ("DWORD PTR ");
14703         }
14704       else
14705         {
14706           switch (vex.length)
14707             {
14708             case 128:
14709               oappend ("XMMWORD PTR ");
14710               break;
14711             case 256:
14712               oappend ("YMMWORD PTR ");
14713               break;
14714             case 512:
14715               oappend ("ZMMWORD PTR ");
14716               break;
14717             default:
14718               abort ();
14719             }
14720         }
14721       break;
14722     case vex_vsib_q_w_d_mode:
14723     case vex_vsib_d_w_d_mode:
14724       if (!need_vex || !vex.evex)
14725         abort ();
14726
14727       switch (vex.length)
14728         {
14729         case 128:
14730           oappend ("QWORD PTR ");
14731           break;
14732         case 256:
14733           oappend ("XMMWORD PTR ");
14734           break;
14735         case 512:
14736           oappend ("YMMWORD PTR ");
14737           break;
14738         default:
14739           abort ();
14740         }
14741
14742       break;
14743     case mask_bd_mode:
14744       if (!need_vex || vex.length != 128)
14745         abort ();
14746       if (vex.w)
14747         oappend ("DWORD PTR ");
14748       else
14749         oappend ("BYTE PTR ");
14750       break;
14751     case mask_mode:
14752       if (!need_vex)
14753         abort ();
14754       if (vex.w)
14755         oappend ("QWORD PTR ");
14756       else
14757         oappend ("WORD PTR ");
14758       break;
14759     case v_bnd_mode:
14760     default:
14761       break;
14762     }
14763 }
14764
14765 static void
14766 OP_E_register (int bytemode, int sizeflag)
14767 {
14768   int reg = modrm.rm;
14769   const char **names;
14770
14771   USED_REX (REX_B);
14772   if ((rex & REX_B))
14773     reg += 8;
14774
14775   if ((sizeflag & SUFFIX_ALWAYS)
14776       && (bytemode == b_swap_mode
14777           || bytemode == v_swap_mode
14778           || bytemode == dqw_swap_mode))
14779     swap_operand ();
14780
14781   switch (bytemode)
14782     {
14783     case b_mode:
14784     case b_swap_mode:
14785       USED_REX (0);
14786       if (rex)
14787         names = names8rex;
14788       else
14789         names = names8;
14790       break;
14791     case w_mode:
14792       names = names16;
14793       break;
14794     case d_mode:
14795     case dw_mode:
14796     case db_mode:
14797       names = names32;
14798       break;
14799     case q_mode:
14800       names = names64;
14801       break;
14802     case m_mode:
14803     case v_bnd_mode:
14804       names = address_mode == mode_64bit ? names64 : names32;
14805       break;
14806     case bnd_mode:
14807       names = names_bnd;
14808       break;
14809     case stack_v_mode:
14810       if (address_mode == mode_64bit && ((sizeflag & DFLAG) || (rex & REX_W)))
14811         {
14812           names = names64;
14813           break;
14814         }
14815       bytemode = v_mode;
14816       /* FALLTHRU */
14817     case v_mode:
14818     case v_swap_mode:
14819     case dq_mode:
14820     case dqb_mode:
14821     case dqd_mode:
14822     case dqw_mode:
14823     case dqw_swap_mode:
14824       USED_REX (REX_W);
14825       if (rex & REX_W)
14826         names = names64;
14827       else
14828         {
14829           if ((sizeflag & DFLAG)
14830               || (bytemode != v_mode
14831                   && bytemode != v_swap_mode))
14832             names = names32;
14833           else
14834             names = names16;
14835           used_prefixes |= (prefixes & PREFIX_DATA);
14836         }
14837       break;
14838     case mask_bd_mode:
14839     case mask_mode:
14840       names = names_mask;
14841       break;
14842     case 0:
14843       return;
14844     default:
14845       oappend (INTERNAL_DISASSEMBLER_ERROR);
14846       return;
14847     }
14848   oappend (names[reg]);
14849 }
14850
14851 static void
14852 OP_E_memory (int bytemode, int sizeflag)
14853 {
14854   bfd_vma disp = 0;
14855   int add = (rex & REX_B) ? 8 : 0;
14856   int riprel = 0;
14857   int shift;
14858
14859   if (vex.evex)
14860     {
14861       /* In EVEX, if operand doesn't allow broadcast, vex.b should be 0.  */
14862       if (vex.b
14863           && bytemode != x_mode
14864           && bytemode != xmmq_mode
14865           && bytemode != evex_half_bcst_xmmq_mode)
14866         {
14867           BadOp ();
14868           return;
14869         }
14870       switch (bytemode)
14871         {
14872         case dqw_mode:
14873         case dw_mode:
14874         case dqw_swap_mode:
14875           shift = 1;
14876           break;
14877         case dqb_mode:
14878         case db_mode:
14879           shift = 0;
14880           break;
14881         case vex_vsib_d_w_dq_mode:
14882         case vex_vsib_d_w_d_mode:
14883         case vex_vsib_q_w_dq_mode:
14884         case vex_vsib_q_w_d_mode:
14885         case evex_x_gscat_mode:
14886         case xmm_mdq_mode:
14887           shift = vex.w ? 3 : 2;
14888           break;
14889         case x_mode:
14890         case evex_half_bcst_xmmq_mode:
14891         case xmmq_mode:
14892           if (vex.b)
14893             {
14894               shift = vex.w ? 3 : 2;
14895               break;
14896             }
14897           /* Fall through if vex.b == 0.  */
14898         case xmmqd_mode:
14899         case xmmdw_mode:
14900         case ymmq_mode:
14901         case evex_x_nobcst_mode:
14902         case x_swap_mode:
14903           switch (vex.length)
14904             {
14905             case 128:
14906               shift = 4;
14907               break;
14908             case 256:
14909               shift = 5;
14910               break;
14911             case 512:
14912               shift = 6;
14913               break;
14914             default:
14915               abort ();
14916             }
14917           break;
14918         case ymm_mode:
14919           shift = 5;
14920           break;
14921         case xmm_mode:
14922           shift = 4;
14923           break;
14924         case xmm_mq_mode:
14925         case q_mode:
14926         case q_scalar_mode:
14927         case q_swap_mode:
14928         case q_scalar_swap_mode:
14929           shift = 3;
14930           break;
14931         case dqd_mode:
14932         case xmm_md_mode:
14933         case d_mode:
14934         case d_scalar_mode:
14935         case d_swap_mode:
14936         case d_scalar_swap_mode:
14937           shift = 2;
14938           break;
14939         case xmm_mw_mode:
14940           shift = 1;
14941           break;
14942         case xmm_mb_mode:
14943           shift = 0;
14944           break;
14945         default:
14946           abort ();
14947         }
14948       /* Make necessary corrections to shift for modes that need it.
14949          For these modes we currently have shift 4, 5 or 6 depending on
14950          vex.length (it corresponds to xmmword, ymmword or zmmword
14951          operand).  We might want to make it 3, 4 or 5 (e.g. for
14952          xmmq_mode).  In case of broadcast enabled the corrections
14953          aren't needed, as element size is always 32 or 64 bits.  */
14954       if (!vex.b
14955           && (bytemode == xmmq_mode
14956               || bytemode == evex_half_bcst_xmmq_mode))
14957         shift -= 1;
14958       else if (bytemode == xmmqd_mode)
14959         shift -= 2;
14960       else if (bytemode == xmmdw_mode)
14961         shift -= 3;
14962       else if (bytemode == ymmq_mode && vex.length == 128)
14963         shift -= 1;
14964     }
14965   else
14966     shift = 0;
14967
14968   USED_REX (REX_B);
14969   if (intel_syntax)
14970     intel_operand_size (bytemode, sizeflag);
14971   append_seg ();
14972
14973   if ((sizeflag & AFLAG) || address_mode == mode_64bit)
14974     {
14975       /* 32/64 bit address mode */
14976       int havedisp;
14977       int havesib;
14978       int havebase;
14979       int haveindex;
14980       int needindex;
14981       int base, rbase;
14982       int vindex = 0;
14983       int scale = 0;
14984       int addr32flag = !((sizeflag & AFLAG)
14985                          || bytemode == v_bnd_mode
14986                          || bytemode == bnd_mode);
14987       const char **indexes64 = names64;
14988       const char **indexes32 = names32;
14989
14990       havesib = 0;
14991       havebase = 1;
14992       haveindex = 0;
14993       base = modrm.rm;
14994
14995       if (base == 4)
14996         {
14997           havesib = 1;
14998           vindex = sib.index;
14999           USED_REX (REX_X);
15000           if (rex & REX_X)
15001             vindex += 8;
15002           switch (bytemode)
15003             {
15004             case vex_vsib_d_w_dq_mode:
15005             case vex_vsib_d_w_d_mode:
15006             case vex_vsib_q_w_dq_mode:
15007             case vex_vsib_q_w_d_mode:
15008               if (!need_vex)
15009                 abort ();
15010               if (vex.evex)
15011                 {
15012                   if (!vex.v)
15013                     vindex += 16;
15014                 }
15015
15016               haveindex = 1;
15017               switch (vex.length)
15018                 {
15019                 case 128:
15020                   indexes64 = indexes32 = names_xmm;
15021                   break;
15022                 case 256:
15023                   if (!vex.w
15024                       || bytemode == vex_vsib_q_w_dq_mode
15025                       || bytemode == vex_vsib_q_w_d_mode)
15026                     indexes64 = indexes32 = names_ymm;
15027                   else
15028                     indexes64 = indexes32 = names_xmm;
15029                   break;
15030                 case 512:
15031                   if (!vex.w
15032                       || bytemode == vex_vsib_q_w_dq_mode
15033                       || bytemode == vex_vsib_q_w_d_mode)
15034                     indexes64 = indexes32 = names_zmm;
15035                   else
15036                     indexes64 = indexes32 = names_ymm;
15037                   break;
15038                 default:
15039                   abort ();
15040                 }
15041               break;
15042             default:
15043               haveindex = vindex != 4;
15044               break;
15045             }
15046           scale = sib.scale;
15047           base = sib.base;
15048           codep++;
15049         }
15050       rbase = base + add;
15051
15052       switch (modrm.mod)
15053         {
15054         case 0:
15055           if (base == 5)
15056             {
15057               havebase = 0;
15058               if (address_mode == mode_64bit && !havesib)
15059                 riprel = 1;
15060               disp = get32s ();
15061             }
15062           break;
15063         case 1:
15064           FETCH_DATA (the_info, codep + 1);
15065           disp = *codep++;
15066           if ((disp & 0x80) != 0)
15067             disp -= 0x100;
15068           if (vex.evex && shift > 0)
15069             disp <<= shift;
15070           break;
15071         case 2:
15072           disp = get32s ();
15073           break;
15074         }
15075
15076       /* In 32bit mode, we need index register to tell [offset] from
15077          [eiz*1 + offset].  */
15078       needindex = (havesib
15079                    && !havebase
15080                    && !haveindex
15081                    && address_mode == mode_32bit);
15082       havedisp = (havebase
15083                   || needindex
15084                   || (havesib && (haveindex || scale != 0)));
15085
15086       if (!intel_syntax)
15087         if (modrm.mod != 0 || base == 5)
15088           {
15089             if (havedisp || riprel)
15090               print_displacement (scratchbuf, disp);
15091             else
15092               print_operand_value (scratchbuf, 1, disp);
15093             oappend (scratchbuf);
15094             if (riprel)
15095               {
15096                 set_op (disp, 1);
15097                 oappend (sizeflag & AFLAG ? "(%rip)" : "(%eip)");
15098               }
15099           }
15100
15101       if ((havebase || haveindex || riprel)
15102           && (bytemode != v_bnd_mode)
15103           && (bytemode != bnd_mode))
15104         used_prefixes |= PREFIX_ADDR;
15105
15106       if (havedisp || (intel_syntax && riprel))
15107         {
15108           *obufp++ = open_char;
15109           if (intel_syntax && riprel)
15110             {
15111               set_op (disp, 1);
15112               oappend (sizeflag & AFLAG ? "rip" : "eip");
15113             }
15114           *obufp = '\0';
15115           if (havebase)
15116             oappend (address_mode == mode_64bit && !addr32flag
15117                      ? names64[rbase] : names32[rbase]);
15118           if (havesib)
15119             {
15120               /* ESP/RSP won't allow index.  If base isn't ESP/RSP,
15121                  print index to tell base + index from base.  */
15122               if (scale != 0
15123                   || needindex
15124                   || haveindex
15125                   || (havebase && base != ESP_REG_NUM))
15126                 {
15127                   if (!intel_syntax || havebase)
15128                     {
15129                       *obufp++ = separator_char;
15130                       *obufp = '\0';
15131                     }
15132                   if (haveindex)
15133                     oappend (address_mode == mode_64bit && !addr32flag
15134                              ? indexes64[vindex] : indexes32[vindex]);
15135                   else
15136                     oappend (address_mode == mode_64bit && !addr32flag
15137                              ? index64 : index32);
15138
15139                   *obufp++ = scale_char;
15140                   *obufp = '\0';
15141                   sprintf (scratchbuf, "%d", 1 << scale);
15142                   oappend (scratchbuf);
15143                 }
15144             }
15145           if (intel_syntax
15146               && (disp || modrm.mod != 0 || base == 5))
15147             {
15148               if (!havedisp || (bfd_signed_vma) disp >= 0)
15149                 {
15150                   *obufp++ = '+';
15151                   *obufp = '\0';
15152                 }
15153               else if (modrm.mod != 1 && disp != -disp)
15154                 {
15155                   *obufp++ = '-';
15156                   *obufp = '\0';
15157                   disp = - (bfd_signed_vma) disp;
15158                 }
15159
15160               if (havedisp)
15161                 print_displacement (scratchbuf, disp);
15162               else
15163                 print_operand_value (scratchbuf, 1, disp);
15164               oappend (scratchbuf);
15165             }
15166
15167           *obufp++ = close_char;
15168           *obufp = '\0';
15169         }
15170       else if (intel_syntax)
15171         {
15172           if (modrm.mod != 0 || base == 5)
15173             {
15174               if (!active_seg_prefix)
15175                 {
15176                   oappend (names_seg[ds_reg - es_reg]);
15177                   oappend (":");
15178                 }
15179               print_operand_value (scratchbuf, 1, disp);
15180               oappend (scratchbuf);
15181             }
15182         }
15183     }
15184   else
15185     {
15186       /* 16 bit address mode */
15187       used_prefixes |= prefixes & PREFIX_ADDR;
15188       switch (modrm.mod)
15189         {
15190         case 0:
15191           if (modrm.rm == 6)
15192             {
15193               disp = get16 ();
15194               if ((disp & 0x8000) != 0)
15195                 disp -= 0x10000;
15196             }
15197           break;
15198         case 1:
15199           FETCH_DATA (the_info, codep + 1);
15200           disp = *codep++;
15201           if ((disp & 0x80) != 0)
15202             disp -= 0x100;
15203           break;
15204         case 2:
15205           disp = get16 ();
15206           if ((disp & 0x8000) != 0)
15207             disp -= 0x10000;
15208           break;
15209         }
15210
15211       if (!intel_syntax)
15212         if (modrm.mod != 0 || modrm.rm == 6)
15213           {
15214             print_displacement (scratchbuf, disp);
15215             oappend (scratchbuf);
15216           }
15217
15218       if (modrm.mod != 0 || modrm.rm != 6)
15219         {
15220           *obufp++ = open_char;
15221           *obufp = '\0';
15222           oappend (index16[modrm.rm]);
15223           if (intel_syntax
15224               && (disp || modrm.mod != 0 || modrm.rm == 6))
15225             {
15226               if ((bfd_signed_vma) disp >= 0)
15227                 {
15228                   *obufp++ = '+';
15229                   *obufp = '\0';
15230                 }
15231               else if (modrm.mod != 1)
15232                 {
15233                   *obufp++ = '-';
15234                   *obufp = '\0';
15235                   disp = - (bfd_signed_vma) disp;
15236                 }
15237
15238               print_displacement (scratchbuf, disp);
15239               oappend (scratchbuf);
15240             }
15241
15242           *obufp++ = close_char;
15243           *obufp = '\0';
15244         }
15245       else if (intel_syntax)
15246         {
15247           if (!active_seg_prefix)
15248             {
15249               oappend (names_seg[ds_reg - es_reg]);
15250               oappend (":");
15251             }
15252           print_operand_value (scratchbuf, 1, disp & 0xffff);
15253           oappend (scratchbuf);
15254         }
15255     }
15256   if (vex.evex && vex.b
15257       && (bytemode == x_mode
15258           || bytemode == xmmq_mode
15259           || bytemode == evex_half_bcst_xmmq_mode))
15260     {
15261       if (vex.w
15262           || bytemode == xmmq_mode
15263           || bytemode == evex_half_bcst_xmmq_mode)
15264         {
15265           switch (vex.length)
15266             {
15267             case 128:
15268               oappend ("{1to2}");
15269               break;
15270             case 256:
15271               oappend ("{1to4}");
15272               break;
15273             case 512:
15274               oappend ("{1to8}");
15275               break;
15276             default:
15277               abort ();
15278             }
15279         }
15280       else
15281         {
15282           switch (vex.length)
15283             {
15284             case 128:
15285               oappend ("{1to4}");
15286               break;
15287             case 256:
15288               oappend ("{1to8}");
15289               break;
15290             case 512:
15291               oappend ("{1to16}");
15292               break;
15293             default:
15294               abort ();
15295             }
15296         }
15297     }
15298 }
15299
15300 static void
15301 OP_E (int bytemode, int sizeflag)
15302 {
15303   /* Skip mod/rm byte.  */
15304   MODRM_CHECK;
15305   codep++;
15306
15307   if (modrm.mod == 3)
15308     OP_E_register (bytemode, sizeflag);
15309   else
15310     OP_E_memory (bytemode, sizeflag);
15311 }
15312
15313 static void
15314 OP_G (int bytemode, int sizeflag)
15315 {
15316   int add = 0;
15317   USED_REX (REX_R);
15318   if (rex & REX_R)
15319     add += 8;
15320   switch (bytemode)
15321     {
15322     case b_mode:
15323       USED_REX (0);
15324       if (rex)
15325         oappend (names8rex[modrm.reg + add]);
15326       else
15327         oappend (names8[modrm.reg + add]);
15328       break;
15329     case w_mode:
15330       oappend (names16[modrm.reg + add]);
15331       break;
15332     case d_mode:
15333     case db_mode:
15334     case dw_mode:
15335       oappend (names32[modrm.reg + add]);
15336       break;
15337     case q_mode:
15338       oappend (names64[modrm.reg + add]);
15339       break;
15340     case bnd_mode:
15341       oappend (names_bnd[modrm.reg]);
15342       break;
15343     case v_mode:
15344     case dq_mode:
15345     case dqb_mode:
15346     case dqd_mode:
15347     case dqw_mode:
15348     case dqw_swap_mode:
15349       USED_REX (REX_W);
15350       if (rex & REX_W)
15351         oappend (names64[modrm.reg + add]);
15352       else
15353         {
15354           if ((sizeflag & DFLAG) || bytemode != v_mode)
15355             oappend (names32[modrm.reg + add]);
15356           else
15357             oappend (names16[modrm.reg + add]);
15358           used_prefixes |= (prefixes & PREFIX_DATA);
15359         }
15360       break;
15361     case m_mode:
15362       if (address_mode == mode_64bit)
15363         oappend (names64[modrm.reg + add]);
15364       else
15365         oappend (names32[modrm.reg + add]);
15366       break;
15367     case mask_bd_mode:
15368     case mask_mode:
15369       oappend (names_mask[modrm.reg + add]);
15370       break;
15371     default:
15372       oappend (INTERNAL_DISASSEMBLER_ERROR);
15373       break;
15374     }
15375 }
15376
15377 static bfd_vma
15378 get64 (void)
15379 {
15380   bfd_vma x;
15381 #ifdef BFD64
15382   unsigned int a;
15383   unsigned int b;
15384
15385   FETCH_DATA (the_info, codep + 8);
15386   a = *codep++ & 0xff;
15387   a |= (*codep++ & 0xff) << 8;
15388   a |= (*codep++ & 0xff) << 16;
15389   a |= (*codep++ & 0xff) << 24;
15390   b = *codep++ & 0xff;
15391   b |= (*codep++ & 0xff) << 8;
15392   b |= (*codep++ & 0xff) << 16;
15393   b |= (*codep++ & 0xff) << 24;
15394   x = a + ((bfd_vma) b << 32);
15395 #else
15396   abort ();
15397   x = 0;
15398 #endif
15399   return x;
15400 }
15401
15402 static bfd_signed_vma
15403 get32 (void)
15404 {
15405   bfd_signed_vma x = 0;
15406
15407   FETCH_DATA (the_info, codep + 4);
15408   x = *codep++ & (bfd_signed_vma) 0xff;
15409   x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
15410   x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
15411   x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
15412   return x;
15413 }
15414
15415 static bfd_signed_vma
15416 get32s (void)
15417 {
15418   bfd_signed_vma x = 0;
15419
15420   FETCH_DATA (the_info, codep + 4);
15421   x = *codep++ & (bfd_signed_vma) 0xff;
15422   x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
15423   x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
15424   x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
15425
15426   x = (x ^ ((bfd_signed_vma) 1 << 31)) - ((bfd_signed_vma) 1 << 31);
15427
15428   return x;
15429 }
15430
15431 static int
15432 get16 (void)
15433 {
15434   int x = 0;
15435
15436   FETCH_DATA (the_info, codep + 2);
15437   x = *codep++ & 0xff;
15438   x |= (*codep++ & 0xff) << 8;
15439   return x;
15440 }
15441
15442 static void
15443 set_op (bfd_vma op, int riprel)
15444 {
15445   op_index[op_ad] = op_ad;
15446   if (address_mode == mode_64bit)
15447     {
15448       op_address[op_ad] = op;
15449       op_riprel[op_ad] = riprel;
15450     }
15451   else
15452     {
15453       /* Mask to get a 32-bit address.  */
15454       op_address[op_ad] = op & 0xffffffff;
15455       op_riprel[op_ad] = riprel & 0xffffffff;
15456     }
15457 }
15458
15459 static void
15460 OP_REG (int code, int sizeflag)
15461 {
15462   const char *s;
15463   int add;
15464
15465   switch (code)
15466     {
15467     case es_reg: case ss_reg: case cs_reg:
15468     case ds_reg: case fs_reg: case gs_reg:
15469       oappend (names_seg[code - es_reg]);
15470       return;
15471     }
15472
15473   USED_REX (REX_B);
15474   if (rex & REX_B)
15475     add = 8;
15476   else
15477     add = 0;
15478
15479   switch (code)
15480     {
15481     case ax_reg: case cx_reg: case dx_reg: case bx_reg:
15482     case sp_reg: case bp_reg: case si_reg: case di_reg:
15483       s = names16[code - ax_reg + add];
15484       break;
15485     case al_reg: case ah_reg: case cl_reg: case ch_reg:
15486     case dl_reg: case dh_reg: case bl_reg: case bh_reg:
15487       USED_REX (0);
15488       if (rex)
15489         s = names8rex[code - al_reg + add];
15490       else
15491         s = names8[code - al_reg];
15492       break;
15493     case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
15494     case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
15495       if (address_mode == mode_64bit
15496           && ((sizeflag & DFLAG) || (rex & REX_W)))
15497         {
15498           s = names64[code - rAX_reg + add];
15499           break;
15500         }
15501       code += eAX_reg - rAX_reg;
15502       /* Fall through.  */
15503     case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
15504     case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
15505       USED_REX (REX_W);
15506       if (rex & REX_W)
15507         s = names64[code - eAX_reg + add];
15508       else
15509         {
15510           if (sizeflag & DFLAG)
15511             s = names32[code - eAX_reg + add];
15512           else
15513             s = names16[code - eAX_reg + add];
15514           used_prefixes |= (prefixes & PREFIX_DATA);
15515         }
15516       break;
15517     default:
15518       s = INTERNAL_DISASSEMBLER_ERROR;
15519       break;
15520     }
15521   oappend (s);
15522 }
15523
15524 static void
15525 OP_IMREG (int code, int sizeflag)
15526 {
15527   const char *s;
15528
15529   switch (code)
15530     {
15531     case indir_dx_reg:
15532       if (intel_syntax)
15533         s = "dx";
15534       else
15535         s = "(%dx)";
15536       break;
15537     case ax_reg: case cx_reg: case dx_reg: case bx_reg:
15538     case sp_reg: case bp_reg: case si_reg: case di_reg:
15539       s = names16[code - ax_reg];
15540       break;
15541     case es_reg: case ss_reg: case cs_reg:
15542     case ds_reg: case fs_reg: case gs_reg:
15543       s = names_seg[code - es_reg];
15544       break;
15545     case al_reg: case ah_reg: case cl_reg: case ch_reg:
15546     case dl_reg: case dh_reg: case bl_reg: case bh_reg:
15547       USED_REX (0);
15548       if (rex)
15549         s = names8rex[code - al_reg];
15550       else
15551         s = names8[code - al_reg];
15552       break;
15553     case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
15554     case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
15555       USED_REX (REX_W);
15556       if (rex & REX_W)
15557         s = names64[code - eAX_reg];
15558       else
15559         {
15560           if (sizeflag & DFLAG)
15561             s = names32[code - eAX_reg];
15562           else
15563             s = names16[code - eAX_reg];
15564           used_prefixes |= (prefixes & PREFIX_DATA);
15565         }
15566       break;
15567     case z_mode_ax_reg:
15568       if ((rex & REX_W) || (sizeflag & DFLAG))
15569         s = *names32;
15570       else
15571         s = *names16;
15572       if (!(rex & REX_W))
15573         used_prefixes |= (prefixes & PREFIX_DATA);
15574       break;
15575     default:
15576       s = INTERNAL_DISASSEMBLER_ERROR;
15577       break;
15578     }
15579   oappend (s);
15580 }
15581
15582 static void
15583 OP_I (int bytemode, int sizeflag)
15584 {
15585   bfd_signed_vma op;
15586   bfd_signed_vma mask = -1;
15587
15588   switch (bytemode)
15589     {
15590     case b_mode:
15591       FETCH_DATA (the_info, codep + 1);
15592       op = *codep++;
15593       mask = 0xff;
15594       break;
15595     case q_mode:
15596       if (address_mode == mode_64bit)
15597         {
15598           op = get32s ();
15599           break;
15600         }
15601       /* Fall through.  */
15602     case v_mode:
15603       USED_REX (REX_W);
15604       if (rex & REX_W)
15605         op = get32s ();
15606       else
15607         {
15608           if (sizeflag & DFLAG)
15609             {
15610               op = get32 ();
15611               mask = 0xffffffff;
15612             }
15613           else
15614             {
15615               op = get16 ();
15616               mask = 0xfffff;
15617             }
15618           used_prefixes |= (prefixes & PREFIX_DATA);
15619         }
15620       break;
15621     case w_mode:
15622       mask = 0xfffff;
15623       op = get16 ();
15624       break;
15625     case const_1_mode:
15626       if (intel_syntax)
15627         oappend ("1");
15628       return;
15629     default:
15630       oappend (INTERNAL_DISASSEMBLER_ERROR);
15631       return;
15632     }
15633
15634   op &= mask;
15635   scratchbuf[0] = '$';
15636   print_operand_value (scratchbuf + 1, 1, op);
15637   oappend_maybe_intel (scratchbuf);
15638   scratchbuf[0] = '\0';
15639 }
15640
15641 static void
15642 OP_I64 (int bytemode, int sizeflag)
15643 {
15644   bfd_signed_vma op;
15645   bfd_signed_vma mask = -1;
15646
15647   if (address_mode != mode_64bit)
15648     {
15649       OP_I (bytemode, sizeflag);
15650       return;
15651     }
15652
15653   switch (bytemode)
15654     {
15655     case b_mode:
15656       FETCH_DATA (the_info, codep + 1);
15657       op = *codep++;
15658       mask = 0xff;
15659       break;
15660     case v_mode:
15661       USED_REX (REX_W);
15662       if (rex & REX_W)
15663         op = get64 ();
15664       else
15665         {
15666           if (sizeflag & DFLAG)
15667             {
15668               op = get32 ();
15669               mask = 0xffffffff;
15670             }
15671           else
15672             {
15673               op = get16 ();
15674               mask = 0xfffff;
15675             }
15676           used_prefixes |= (prefixes & PREFIX_DATA);
15677         }
15678       break;
15679     case w_mode:
15680       mask = 0xfffff;
15681       op = get16 ();
15682       break;
15683     default:
15684       oappend (INTERNAL_DISASSEMBLER_ERROR);
15685       return;
15686     }
15687
15688   op &= mask;
15689   scratchbuf[0] = '$';
15690   print_operand_value (scratchbuf + 1, 1, op);
15691   oappend_maybe_intel (scratchbuf);
15692   scratchbuf[0] = '\0';
15693 }
15694
15695 static void
15696 OP_sI (int bytemode, int sizeflag)
15697 {
15698   bfd_signed_vma op;
15699
15700   switch (bytemode)
15701     {
15702     case b_mode:
15703     case b_T_mode:
15704       FETCH_DATA (the_info, codep + 1);
15705       op = *codep++;
15706       if ((op & 0x80) != 0)
15707         op -= 0x100;
15708       if (bytemode == b_T_mode)
15709         {
15710           if (address_mode != mode_64bit
15711               || !((sizeflag & DFLAG) || (rex & REX_W)))
15712             {
15713               /* The operand-size prefix is overridden by a REX prefix.  */
15714               if ((sizeflag & DFLAG) || (rex & REX_W))
15715                 op &= 0xffffffff;
15716               else
15717                 op &= 0xffff;
15718           }
15719         }
15720       else
15721         {
15722           if (!(rex & REX_W))
15723             {
15724               if (sizeflag & DFLAG)
15725                 op &= 0xffffffff;
15726               else
15727                 op &= 0xffff;
15728             }
15729         }
15730       break;
15731     case v_mode:
15732       /* The operand-size prefix is overridden by a REX prefix.  */
15733       if ((sizeflag & DFLAG) || (rex & REX_W))
15734         op = get32s ();
15735       else
15736         op = get16 ();
15737       break;
15738     default:
15739       oappend (INTERNAL_DISASSEMBLER_ERROR);
15740       return;
15741     }
15742
15743   scratchbuf[0] = '$';
15744   print_operand_value (scratchbuf + 1, 1, op);
15745   oappend_maybe_intel (scratchbuf);
15746 }
15747
15748 static void
15749 OP_J (int bytemode, int sizeflag)
15750 {
15751   bfd_vma disp;
15752   bfd_vma mask = -1;
15753   bfd_vma segment = 0;
15754
15755   switch (bytemode)
15756     {
15757     case b_mode:
15758       FETCH_DATA (the_info, codep + 1);
15759       disp = *codep++;
15760       if ((disp & 0x80) != 0)
15761         disp -= 0x100;
15762       break;
15763     case v_mode:
15764       if (isa64 == amd64)
15765         USED_REX (REX_W);
15766       if ((sizeflag & DFLAG)
15767           || (address_mode == mode_64bit
15768               && (isa64 != amd64 || (rex & REX_W))))
15769         disp = get32s ();
15770       else
15771         {
15772           disp = get16 ();
15773           if ((disp & 0x8000) != 0)
15774             disp -= 0x10000;
15775           /* In 16bit mode, address is wrapped around at 64k within
15776              the same segment.  Otherwise, a data16 prefix on a jump
15777              instruction means that the pc is masked to 16 bits after
15778              the displacement is added!  */
15779           mask = 0xffff;
15780           if ((prefixes & PREFIX_DATA) == 0)
15781             segment = ((start_pc + codep - start_codep)
15782                        & ~((bfd_vma) 0xffff));
15783         }
15784       if (address_mode != mode_64bit
15785           || (isa64 == amd64 && !(rex & REX_W)))
15786         used_prefixes |= (prefixes & PREFIX_DATA);
15787       break;
15788     default:
15789       oappend (INTERNAL_DISASSEMBLER_ERROR);
15790       return;
15791     }
15792   disp = ((start_pc + (codep - start_codep) + disp) & mask) | segment;
15793   set_op (disp, 0);
15794   print_operand_value (scratchbuf, 1, disp);
15795   oappend (scratchbuf);
15796 }
15797
15798 static void
15799 OP_SEG (int bytemode, int sizeflag)
15800 {
15801   if (bytemode == w_mode)
15802     oappend (names_seg[modrm.reg]);
15803   else
15804     OP_E (modrm.mod == 3 ? bytemode : w_mode, sizeflag);
15805 }
15806
15807 static void
15808 OP_DIR (int dummy ATTRIBUTE_UNUSED, int sizeflag)
15809 {
15810   int seg, offset;
15811
15812   if (sizeflag & DFLAG)
15813     {
15814       offset = get32 ();
15815       seg = get16 ();
15816     }
15817   else
15818     {
15819       offset = get16 ();
15820       seg = get16 ();
15821     }
15822   used_prefixes |= (prefixes & PREFIX_DATA);
15823   if (intel_syntax)
15824     sprintf (scratchbuf, "0x%x:0x%x", seg, offset);
15825   else
15826     sprintf (scratchbuf, "$0x%x,$0x%x", seg, offset);
15827   oappend (scratchbuf);
15828 }
15829
15830 static void
15831 OP_OFF (int bytemode, int sizeflag)
15832 {
15833   bfd_vma off;
15834
15835   if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
15836     intel_operand_size (bytemode, sizeflag);
15837   append_seg ();
15838
15839   if ((sizeflag & AFLAG) || address_mode == mode_64bit)
15840     off = get32 ();
15841   else
15842     off = get16 ();
15843
15844   if (intel_syntax)
15845     {
15846       if (!active_seg_prefix)
15847         {
15848           oappend (names_seg[ds_reg - es_reg]);
15849           oappend (":");
15850         }
15851     }
15852   print_operand_value (scratchbuf, 1, off);
15853   oappend (scratchbuf);
15854 }
15855
15856 static void
15857 OP_OFF64 (int bytemode, int sizeflag)
15858 {
15859   bfd_vma off;
15860
15861   if (address_mode != mode_64bit
15862       || (prefixes & PREFIX_ADDR))
15863     {
15864       OP_OFF (bytemode, sizeflag);
15865       return;
15866     }
15867
15868   if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
15869     intel_operand_size (bytemode, sizeflag);
15870   append_seg ();
15871
15872   off = get64 ();
15873
15874   if (intel_syntax)
15875     {
15876       if (!active_seg_prefix)
15877         {
15878           oappend (names_seg[ds_reg - es_reg]);
15879           oappend (":");
15880         }
15881     }
15882   print_operand_value (scratchbuf, 1, off);
15883   oappend (scratchbuf);
15884 }
15885
15886 static void
15887 ptr_reg (int code, int sizeflag)
15888 {
15889   const char *s;
15890
15891   *obufp++ = open_char;
15892   used_prefixes |= (prefixes & PREFIX_ADDR);
15893   if (address_mode == mode_64bit)
15894     {
15895       if (!(sizeflag & AFLAG))
15896         s = names32[code - eAX_reg];
15897       else
15898         s = names64[code - eAX_reg];
15899     }
15900   else if (sizeflag & AFLAG)
15901     s = names32[code - eAX_reg];
15902   else
15903     s = names16[code - eAX_reg];
15904   oappend (s);
15905   *obufp++ = close_char;
15906   *obufp = 0;
15907 }
15908
15909 static void
15910 OP_ESreg (int code, int sizeflag)
15911 {
15912   if (intel_syntax)
15913     {
15914       switch (codep[-1])
15915         {
15916         case 0x6d:      /* insw/insl */
15917           intel_operand_size (z_mode, sizeflag);
15918           break;
15919         case 0xa5:      /* movsw/movsl/movsq */
15920         case 0xa7:      /* cmpsw/cmpsl/cmpsq */
15921         case 0xab:      /* stosw/stosl */
15922         case 0xaf:      /* scasw/scasl */
15923           intel_operand_size (v_mode, sizeflag);
15924           break;
15925         default:
15926           intel_operand_size (b_mode, sizeflag);
15927         }
15928     }
15929   oappend_maybe_intel ("%es:");
15930   ptr_reg (code, sizeflag);
15931 }
15932
15933 static void
15934 OP_DSreg (int code, int sizeflag)
15935 {
15936   if (intel_syntax)
15937     {
15938       switch (codep[-1])
15939         {
15940         case 0x6f:      /* outsw/outsl */
15941           intel_operand_size (z_mode, sizeflag);
15942           break;
15943         case 0xa5:      /* movsw/movsl/movsq */
15944         case 0xa7:      /* cmpsw/cmpsl/cmpsq */
15945         case 0xad:      /* lodsw/lodsl/lodsq */
15946           intel_operand_size (v_mode, sizeflag);
15947           break;
15948         default:
15949           intel_operand_size (b_mode, sizeflag);
15950         }
15951     }
15952   /* Set active_seg_prefix to PREFIX_DS if it is unset so that the
15953      default segment register DS is printed.  */
15954   if (!active_seg_prefix)
15955     active_seg_prefix = PREFIX_DS;
15956   append_seg ();
15957   ptr_reg (code, sizeflag);
15958 }
15959
15960 static void
15961 OP_C (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15962 {
15963   int add;
15964   if (rex & REX_R)
15965     {
15966       USED_REX (REX_R);
15967       add = 8;
15968     }
15969   else if (address_mode != mode_64bit && (prefixes & PREFIX_LOCK))
15970     {
15971       all_prefixes[last_lock_prefix] = 0;
15972       used_prefixes |= PREFIX_LOCK;
15973       add = 8;
15974     }
15975   else
15976     add = 0;
15977   sprintf (scratchbuf, "%%cr%d", modrm.reg + add);
15978   oappend_maybe_intel (scratchbuf);
15979 }
15980
15981 static void
15982 OP_D (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15983 {
15984   int add;
15985   USED_REX (REX_R);
15986   if (rex & REX_R)
15987     add = 8;
15988   else
15989     add = 0;
15990   if (intel_syntax)
15991     sprintf (scratchbuf, "db%d", modrm.reg + add);
15992   else
15993     sprintf (scratchbuf, "%%db%d", modrm.reg + add);
15994   oappend (scratchbuf);
15995 }
15996
15997 static void
15998 OP_T (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15999 {
16000   sprintf (scratchbuf, "%%tr%d", modrm.reg);
16001   oappend_maybe_intel (scratchbuf);
16002 }
16003
16004 static void
16005 OP_R (int bytemode, int sizeflag)
16006 {
16007   /* Skip mod/rm byte.  */
16008   MODRM_CHECK;
16009   codep++;
16010   OP_E_register (bytemode, sizeflag);
16011 }
16012
16013 static void
16014 OP_MMX (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
16015 {
16016   int reg = modrm.reg;
16017   const char **names;
16018
16019   used_prefixes |= (prefixes & PREFIX_DATA);
16020   if (prefixes & PREFIX_DATA)
16021     {
16022       names = names_xmm;
16023       USED_REX (REX_R);
16024       if (rex & REX_R)
16025         reg += 8;
16026     }
16027   else
16028     names = names_mm;
16029   oappend (names[reg]);
16030 }
16031
16032 static void
16033 OP_XMM (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
16034 {
16035   int reg = modrm.reg;
16036   const char **names;
16037
16038   USED_REX (REX_R);
16039   if (rex & REX_R)
16040     reg += 8;
16041   if (vex.evex)
16042     {
16043       if (!vex.r)
16044         reg += 16;
16045     }
16046
16047   if (need_vex
16048       && bytemode != xmm_mode
16049       && bytemode != xmmq_mode
16050       && bytemode != evex_half_bcst_xmmq_mode
16051       && bytemode != ymm_mode
16052       && bytemode != scalar_mode)
16053     {
16054       switch (vex.length)
16055         {
16056         case 128:
16057           names = names_xmm;
16058           break;
16059         case 256:
16060           if (vex.w
16061               || (bytemode != vex_vsib_q_w_dq_mode
16062                   && bytemode != vex_vsib_q_w_d_mode))
16063             names = names_ymm;
16064           else
16065             names = names_xmm;
16066           break;
16067         case 512:
16068           names = names_zmm;
16069           break;
16070         default:
16071           abort ();
16072         }
16073     }
16074   else if (bytemode == xmmq_mode
16075            || bytemode == evex_half_bcst_xmmq_mode)
16076     {
16077       switch (vex.length)
16078         {
16079         case 128:
16080         case 256:
16081           names = names_xmm;
16082           break;
16083         case 512:
16084           names = names_ymm;
16085           break;
16086         default:
16087           abort ();
16088         }
16089     }
16090   else if (bytemode == ymm_mode)
16091     names = names_ymm;
16092   else
16093     names = names_xmm;
16094   oappend (names[reg]);
16095 }
16096
16097 static void
16098 OP_EM (int bytemode, int sizeflag)
16099 {
16100   int reg;
16101   const char **names;
16102
16103   if (modrm.mod != 3)
16104     {
16105       if (intel_syntax
16106           && (bytemode == v_mode || bytemode == v_swap_mode))
16107         {
16108           bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
16109           used_prefixes |= (prefixes & PREFIX_DATA);
16110         }
16111       OP_E (bytemode, sizeflag);
16112       return;
16113     }
16114
16115   if ((sizeflag & SUFFIX_ALWAYS) && bytemode == v_swap_mode)
16116     swap_operand ();
16117
16118   /* Skip mod/rm byte.  */
16119   MODRM_CHECK;
16120   codep++;
16121   used_prefixes |= (prefixes & PREFIX_DATA);
16122   reg = modrm.rm;
16123   if (prefixes & PREFIX_DATA)
16124     {
16125       names = names_xmm;
16126       USED_REX (REX_B);
16127       if (rex & REX_B)
16128         reg += 8;
16129     }
16130   else
16131     names = names_mm;
16132   oappend (names[reg]);
16133 }
16134
16135 /* cvt* are the only instructions in sse2 which have
16136    both SSE and MMX operands and also have 0x66 prefix
16137    in their opcode. 0x66 was originally used to differentiate
16138    between SSE and MMX instruction(operands). So we have to handle the
16139    cvt* separately using OP_EMC and OP_MXC */
16140 static void
16141 OP_EMC (int bytemode, int sizeflag)
16142 {
16143   if (modrm.mod != 3)
16144     {
16145       if (intel_syntax && bytemode == v_mode)
16146         {
16147           bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
16148           used_prefixes |= (prefixes & PREFIX_DATA);
16149         }
16150       OP_E (bytemode, sizeflag);
16151       return;
16152     }
16153
16154   /* Skip mod/rm byte.  */
16155   MODRM_CHECK;
16156   codep++;
16157   used_prefixes |= (prefixes & PREFIX_DATA);
16158   oappend (names_mm[modrm.rm]);
16159 }
16160
16161 static void
16162 OP_MXC (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
16163 {
16164   used_prefixes |= (prefixes & PREFIX_DATA);
16165   oappend (names_mm[modrm.reg]);
16166 }
16167
16168 static void
16169 OP_EX (int bytemode, int sizeflag)
16170 {
16171   int reg;
16172   const char **names;
16173
16174   /* Skip mod/rm byte.  */
16175   MODRM_CHECK;
16176   codep++;
16177
16178   if (modrm.mod != 3)
16179     {
16180       OP_E_memory (bytemode, sizeflag);
16181       return;
16182     }
16183
16184   reg = modrm.rm;
16185   USED_REX (REX_B);
16186   if (rex & REX_B)
16187     reg += 8;
16188   if (vex.evex)
16189     {
16190       USED_REX (REX_X);
16191       if ((rex & REX_X))
16192         reg += 16;
16193     }
16194
16195   if ((sizeflag & SUFFIX_ALWAYS)
16196       && (bytemode == x_swap_mode
16197           || bytemode == d_swap_mode
16198           || bytemode == dqw_swap_mode
16199           || bytemode == d_scalar_swap_mode
16200           || bytemode == q_swap_mode
16201           || bytemode == q_scalar_swap_mode))
16202     swap_operand ();
16203
16204   if (need_vex
16205       && bytemode != xmm_mode
16206       && bytemode != xmmdw_mode
16207       && bytemode != xmmqd_mode
16208       && bytemode != xmm_mb_mode
16209       && bytemode != xmm_mw_mode
16210       && bytemode != xmm_md_mode
16211       && bytemode != xmm_mq_mode
16212       && bytemode != xmm_mdq_mode
16213       && bytemode != xmmq_mode
16214       && bytemode != evex_half_bcst_xmmq_mode
16215       && bytemode != ymm_mode
16216       && bytemode != d_scalar_mode
16217       && bytemode != d_scalar_swap_mode
16218       && bytemode != q_scalar_mode
16219       && bytemode != q_scalar_swap_mode
16220       && bytemode != vex_scalar_w_dq_mode)
16221     {
16222       switch (vex.length)
16223         {
16224         case 128:
16225           names = names_xmm;
16226           break;
16227         case 256:
16228           names = names_ymm;
16229           break;
16230         case 512:
16231           names = names_zmm;
16232           break;
16233         default:
16234           abort ();
16235         }
16236     }
16237   else if (bytemode == xmmq_mode
16238            || bytemode == evex_half_bcst_xmmq_mode)
16239     {
16240       switch (vex.length)
16241         {
16242         case 128:
16243         case 256:
16244           names = names_xmm;
16245           break;
16246         case 512:
16247           names = names_ymm;
16248           break;
16249         default:
16250           abort ();
16251         }
16252     }
16253   else if (bytemode == ymm_mode)
16254     names = names_ymm;
16255   else
16256     names = names_xmm;
16257   oappend (names[reg]);
16258 }
16259
16260 static void
16261 OP_MS (int bytemode, int sizeflag)
16262 {
16263   if (modrm.mod == 3)
16264     OP_EM (bytemode, sizeflag);
16265   else
16266     BadOp ();
16267 }
16268
16269 static void
16270 OP_XS (int bytemode, int sizeflag)
16271 {
16272   if (modrm.mod == 3)
16273     OP_EX (bytemode, sizeflag);
16274   else
16275     BadOp ();
16276 }
16277
16278 static void
16279 OP_M (int bytemode, int sizeflag)
16280 {
16281   if (modrm.mod == 3)
16282     /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
16283     BadOp ();
16284   else
16285     OP_E (bytemode, sizeflag);
16286 }
16287
16288 static void
16289 OP_0f07 (int bytemode, int sizeflag)
16290 {
16291   if (modrm.mod != 3 || modrm.rm != 0)
16292     BadOp ();
16293   else
16294     OP_E (bytemode, sizeflag);
16295 }
16296
16297 /* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
16298    32bit mode and "xchg %rax,%rax" in 64bit mode.  */
16299
16300 static void
16301 NOP_Fixup1 (int bytemode, int sizeflag)
16302 {
16303   if ((prefixes & PREFIX_DATA) != 0
16304       || (rex != 0
16305           && rex != 0x48
16306           && address_mode == mode_64bit))
16307     OP_REG (bytemode, sizeflag);
16308   else
16309     strcpy (obuf, "nop");
16310 }
16311
16312 static void
16313 NOP_Fixup2 (int bytemode, int sizeflag)
16314 {
16315   if ((prefixes & PREFIX_DATA) != 0
16316       || (rex != 0
16317           && rex != 0x48
16318           && address_mode == mode_64bit))
16319     OP_IMREG (bytemode, sizeflag);
16320 }
16321
16322 static const char *const Suffix3DNow[] = {
16323 /* 00 */        NULL,           NULL,           NULL,           NULL,
16324 /* 04 */        NULL,           NULL,           NULL,           NULL,
16325 /* 08 */        NULL,           NULL,           NULL,           NULL,
16326 /* 0C */        "pi2fw",        "pi2fd",        NULL,           NULL,
16327 /* 10 */        NULL,           NULL,           NULL,           NULL,
16328 /* 14 */        NULL,           NULL,           NULL,           NULL,
16329 /* 18 */        NULL,           NULL,           NULL,           NULL,
16330 /* 1C */        "pf2iw",        "pf2id",        NULL,           NULL,
16331 /* 20 */        NULL,           NULL,           NULL,           NULL,
16332 /* 24 */        NULL,           NULL,           NULL,           NULL,
16333 /* 28 */        NULL,           NULL,           NULL,           NULL,
16334 /* 2C */        NULL,           NULL,           NULL,           NULL,
16335 /* 30 */        NULL,           NULL,           NULL,           NULL,
16336 /* 34 */        NULL,           NULL,           NULL,           NULL,
16337 /* 38 */        NULL,           NULL,           NULL,           NULL,
16338 /* 3C */        NULL,           NULL,           NULL,           NULL,
16339 /* 40 */        NULL,           NULL,           NULL,           NULL,
16340 /* 44 */        NULL,           NULL,           NULL,           NULL,
16341 /* 48 */        NULL,           NULL,           NULL,           NULL,
16342 /* 4C */        NULL,           NULL,           NULL,           NULL,
16343 /* 50 */        NULL,           NULL,           NULL,           NULL,
16344 /* 54 */        NULL,           NULL,           NULL,           NULL,
16345 /* 58 */        NULL,           NULL,           NULL,           NULL,
16346 /* 5C */        NULL,           NULL,           NULL,           NULL,
16347 /* 60 */        NULL,           NULL,           NULL,           NULL,
16348 /* 64 */        NULL,           NULL,           NULL,           NULL,
16349 /* 68 */        NULL,           NULL,           NULL,           NULL,
16350 /* 6C */        NULL,           NULL,           NULL,           NULL,
16351 /* 70 */        NULL,           NULL,           NULL,           NULL,
16352 /* 74 */        NULL,           NULL,           NULL,           NULL,
16353 /* 78 */        NULL,           NULL,           NULL,           NULL,
16354 /* 7C */        NULL,           NULL,           NULL,           NULL,
16355 /* 80 */        NULL,           NULL,           NULL,           NULL,
16356 /* 84 */        NULL,           NULL,           NULL,           NULL,
16357 /* 88 */        NULL,           NULL,           "pfnacc",       NULL,
16358 /* 8C */        NULL,           NULL,           "pfpnacc",      NULL,
16359 /* 90 */        "pfcmpge",      NULL,           NULL,           NULL,
16360 /* 94 */        "pfmin",        NULL,           "pfrcp",        "pfrsqrt",
16361 /* 98 */        NULL,           NULL,           "pfsub",        NULL,
16362 /* 9C */        NULL,           NULL,           "pfadd",        NULL,
16363 /* A0 */        "pfcmpgt",      NULL,           NULL,           NULL,
16364 /* A4 */        "pfmax",        NULL,           "pfrcpit1",     "pfrsqit1",
16365 /* A8 */        NULL,           NULL,           "pfsubr",       NULL,
16366 /* AC */        NULL,           NULL,           "pfacc",        NULL,
16367 /* B0 */        "pfcmpeq",      NULL,           NULL,           NULL,
16368 /* B4 */        "pfmul",        NULL,           "pfrcpit2",     "pmulhrw",
16369 /* B8 */        NULL,           NULL,           NULL,           "pswapd",
16370 /* BC */        NULL,           NULL,           NULL,           "pavgusb",
16371 /* C0 */        NULL,           NULL,           NULL,           NULL,
16372 /* C4 */        NULL,           NULL,           NULL,           NULL,
16373 /* C8 */        NULL,           NULL,           NULL,           NULL,
16374 /* CC */        NULL,           NULL,           NULL,           NULL,
16375 /* D0 */        NULL,           NULL,           NULL,           NULL,
16376 /* D4 */        NULL,           NULL,           NULL,           NULL,
16377 /* D8 */        NULL,           NULL,           NULL,           NULL,
16378 /* DC */        NULL,           NULL,           NULL,           NULL,
16379 /* E0 */        NULL,           NULL,           NULL,           NULL,
16380 /* E4 */        NULL,           NULL,           NULL,           NULL,
16381 /* E8 */        NULL,           NULL,           NULL,           NULL,
16382 /* EC */        NULL,           NULL,           NULL,           NULL,
16383 /* F0 */        NULL,           NULL,           NULL,           NULL,
16384 /* F4 */        NULL,           NULL,           NULL,           NULL,
16385 /* F8 */        NULL,           NULL,           NULL,           NULL,
16386 /* FC */        NULL,           NULL,           NULL,           NULL,
16387 };
16388
16389 static void
16390 OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
16391 {
16392   const char *mnemonic;
16393
16394   FETCH_DATA (the_info, codep + 1);
16395   /* AMD 3DNow! instructions are specified by an opcode suffix in the
16396      place where an 8-bit immediate would normally go.  ie. the last
16397      byte of the instruction.  */
16398   obufp = mnemonicendp;
16399   mnemonic = Suffix3DNow[*codep++ & 0xff];
16400   if (mnemonic)
16401     oappend (mnemonic);
16402   else
16403     {
16404       /* Since a variable sized modrm/sib chunk is between the start
16405          of the opcode (0x0f0f) and the opcode suffix, we need to do
16406          all the modrm processing first, and don't know until now that
16407          we have a bad opcode.  This necessitates some cleaning up.  */
16408       op_out[0][0] = '\0';
16409       op_out[1][0] = '\0';
16410       BadOp ();
16411     }
16412   mnemonicendp = obufp;
16413 }
16414
16415 static struct op simd_cmp_op[] =
16416 {
16417   { STRING_COMMA_LEN ("eq") },
16418   { STRING_COMMA_LEN ("lt") },
16419   { STRING_COMMA_LEN ("le") },
16420   { STRING_COMMA_LEN ("unord") },
16421   { STRING_COMMA_LEN ("neq") },
16422   { STRING_COMMA_LEN ("nlt") },
16423   { STRING_COMMA_LEN ("nle") },
16424   { STRING_COMMA_LEN ("ord") }
16425 };
16426
16427 static void
16428 CMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
16429 {
16430   unsigned int cmp_type;
16431
16432   FETCH_DATA (the_info, codep + 1);
16433   cmp_type = *codep++ & 0xff;
16434   if (cmp_type < ARRAY_SIZE (simd_cmp_op))
16435     {
16436       char suffix [3];
16437       char *p = mnemonicendp - 2;
16438       suffix[0] = p[0];
16439       suffix[1] = p[1];
16440       suffix[2] = '\0';
16441       sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
16442       mnemonicendp += simd_cmp_op[cmp_type].len;
16443     }
16444   else
16445     {
16446       /* We have a reserved extension byte.  Output it directly.  */
16447       scratchbuf[0] = '$';
16448       print_operand_value (scratchbuf + 1, 1, cmp_type);
16449       oappend_maybe_intel (scratchbuf);
16450       scratchbuf[0] = '\0';
16451     }
16452 }
16453
16454 static void
16455 OP_Mwait (int bytemode ATTRIBUTE_UNUSED,
16456           int sizeflag ATTRIBUTE_UNUSED)
16457 {
16458   /* mwait %eax,%ecx  */
16459   if (!intel_syntax)
16460     {
16461       const char **names = (address_mode == mode_64bit
16462                             ? names64 : names32);
16463       strcpy (op_out[0], names[0]);
16464       strcpy (op_out[1], names[1]);
16465       two_source_ops = 1;
16466     }
16467   /* Skip mod/rm byte.  */
16468   MODRM_CHECK;
16469   codep++;
16470 }
16471
16472 static void
16473 OP_Monitor (int bytemode ATTRIBUTE_UNUSED,
16474             int sizeflag ATTRIBUTE_UNUSED)
16475 {
16476   /* monitor %eax,%ecx,%edx"  */
16477   if (!intel_syntax)
16478     {
16479       const char **op1_names;
16480       const char **names = (address_mode == mode_64bit
16481                             ? names64 : names32);
16482
16483       if (!(prefixes & PREFIX_ADDR))
16484         op1_names = (address_mode == mode_16bit
16485                      ? names16 : names);
16486       else
16487         {
16488           /* Remove "addr16/addr32".  */
16489           all_prefixes[last_addr_prefix] = 0;
16490           op1_names = (address_mode != mode_32bit
16491                        ? names32 : names16);
16492           used_prefixes |= PREFIX_ADDR;
16493         }
16494       strcpy (op_out[0], op1_names[0]);
16495       strcpy (op_out[1], names[1]);
16496       strcpy (op_out[2], names[2]);
16497       two_source_ops = 1;
16498     }
16499   /* Skip mod/rm byte.  */
16500   MODRM_CHECK;
16501   codep++;
16502 }
16503
16504 static void
16505 BadOp (void)
16506 {
16507   /* Throw away prefixes and 1st. opcode byte.  */
16508   codep = insn_codep + 1;
16509   oappend ("(bad)");
16510 }
16511
16512 static void
16513 REP_Fixup (int bytemode, int sizeflag)
16514 {
16515   /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
16516      lods and stos.  */
16517   if (prefixes & PREFIX_REPZ)
16518     all_prefixes[last_repz_prefix] = REP_PREFIX;
16519
16520   switch (bytemode)
16521     {
16522     case al_reg:
16523     case eAX_reg:
16524     case indir_dx_reg:
16525       OP_IMREG (bytemode, sizeflag);
16526       break;
16527     case eDI_reg:
16528       OP_ESreg (bytemode, sizeflag);
16529       break;
16530     case eSI_reg:
16531       OP_DSreg (bytemode, sizeflag);
16532       break;
16533     default:
16534       abort ();
16535       break;
16536     }
16537 }
16538
16539 /* For BND-prefixed instructions 0xF2 prefix should be displayed as
16540    "bnd".  */
16541
16542 static void
16543 BND_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
16544 {
16545   if (prefixes & PREFIX_REPNZ)
16546     all_prefixes[last_repnz_prefix] = BND_PREFIX;
16547 }
16548
16549 /* Similar to OP_E.  But the 0xf2/0xf3 prefixes should be displayed as
16550    "xacquire"/"xrelease" for memory operand if there is a LOCK prefix.
16551  */
16552
16553 static void
16554 HLE_Fixup1 (int bytemode, int sizeflag)
16555 {
16556   if (modrm.mod != 3
16557       && (prefixes & PREFIX_LOCK) != 0)
16558     {
16559       if (prefixes & PREFIX_REPZ)
16560         all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
16561       if (prefixes & PREFIX_REPNZ)
16562         all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
16563     }
16564
16565   OP_E (bytemode, sizeflag);
16566 }
16567
16568 /* Similar to OP_E.  But the 0xf2/0xf3 prefixes should be displayed as
16569    "xacquire"/"xrelease" for memory operand.  No check for LOCK prefix.
16570  */
16571
16572 static void
16573 HLE_Fixup2 (int bytemode, int sizeflag)
16574 {
16575   if (modrm.mod != 3)
16576     {
16577       if (prefixes & PREFIX_REPZ)
16578         all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
16579       if (prefixes & PREFIX_REPNZ)
16580         all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
16581     }
16582
16583   OP_E (bytemode, sizeflag);
16584 }
16585
16586 /* Similar to OP_E.  But the 0xf3 prefixes should be displayed as
16587    "xrelease" for memory operand.  No check for LOCK prefix.   */
16588
16589 static void
16590 HLE_Fixup3 (int bytemode, int sizeflag)
16591 {
16592   if (modrm.mod != 3
16593       && last_repz_prefix > last_repnz_prefix
16594       && (prefixes & PREFIX_REPZ) != 0)
16595     all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
16596
16597   OP_E (bytemode, sizeflag);
16598 }
16599
16600 static void
16601 CMPXCHG8B_Fixup (int bytemode, int sizeflag)
16602 {
16603   USED_REX (REX_W);
16604   if (rex & REX_W)
16605     {
16606       /* Change cmpxchg8b to cmpxchg16b.  */
16607       char *p = mnemonicendp - 2;
16608       mnemonicendp = stpcpy (p, "16b");
16609       bytemode = o_mode;
16610     }
16611   else if ((prefixes & PREFIX_LOCK) != 0)
16612     {
16613       if (prefixes & PREFIX_REPZ)
16614         all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
16615       if (prefixes & PREFIX_REPNZ)
16616         all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
16617     }
16618
16619   OP_M (bytemode, sizeflag);
16620 }
16621
16622 static void
16623 XMM_Fixup (int reg, int sizeflag ATTRIBUTE_UNUSED)
16624 {
16625   const char **names;
16626
16627   if (need_vex)
16628     {
16629       switch (vex.length)
16630         {
16631         case 128:
16632           names = names_xmm;
16633           break;
16634         case 256:
16635           names = names_ymm;
16636           break;
16637         default:
16638           abort ();
16639         }
16640     }
16641   else
16642     names = names_xmm;
16643   oappend (names[reg]);
16644 }
16645
16646 static void
16647 CRC32_Fixup (int bytemode, int sizeflag)
16648 {
16649   /* Add proper suffix to "crc32".  */
16650   char *p = mnemonicendp;
16651
16652   switch (bytemode)
16653     {
16654     case b_mode:
16655       if (intel_syntax)
16656         goto skip;
16657
16658       *p++ = 'b';
16659       break;
16660     case v_mode:
16661       if (intel_syntax)
16662         goto skip;
16663
16664       USED_REX (REX_W);
16665       if (rex & REX_W)
16666         *p++ = 'q';
16667       else
16668         {
16669           if (sizeflag & DFLAG)
16670             *p++ = 'l';
16671           else
16672             *p++ = 'w';
16673           used_prefixes |= (prefixes & PREFIX_DATA);
16674         }
16675       break;
16676     default:
16677       oappend (INTERNAL_DISASSEMBLER_ERROR);
16678       break;
16679     }
16680   mnemonicendp = p;
16681   *p = '\0';
16682
16683 skip:
16684   if (modrm.mod == 3)
16685     {
16686       int add;
16687
16688       /* Skip mod/rm byte.  */
16689       MODRM_CHECK;
16690       codep++;
16691
16692       USED_REX (REX_B);
16693       add = (rex & REX_B) ? 8 : 0;
16694       if (bytemode == b_mode)
16695         {
16696           USED_REX (0);
16697           if (rex)
16698             oappend (names8rex[modrm.rm + add]);
16699           else
16700             oappend (names8[modrm.rm + add]);
16701         }
16702       else
16703         {
16704           USED_REX (REX_W);
16705           if (rex & REX_W)
16706             oappend (names64[modrm.rm + add]);
16707           else if ((prefixes & PREFIX_DATA))
16708             oappend (names16[modrm.rm + add]);
16709           else
16710             oappend (names32[modrm.rm + add]);
16711         }
16712     }
16713   else
16714     OP_E (bytemode, sizeflag);
16715 }
16716
16717 static void
16718 FXSAVE_Fixup (int bytemode, int sizeflag)
16719 {
16720   /* Add proper suffix to "fxsave" and "fxrstor".  */
16721   USED_REX (REX_W);
16722   if (rex & REX_W)
16723     {
16724       char *p = mnemonicendp;
16725       *p++ = '6';
16726       *p++ = '4';
16727       *p = '\0';
16728       mnemonicendp = p;
16729     }
16730   OP_M (bytemode, sizeflag);
16731 }
16732
16733 /* Display the destination register operand for instructions with
16734    VEX. */
16735
16736 static void
16737 OP_VEX (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
16738 {
16739   int reg;
16740   const char **names;
16741
16742   if (!need_vex)
16743     abort ();
16744
16745   if (!need_vex_reg)
16746     return;
16747
16748   reg = vex.register_specifier;
16749   if (vex.evex)
16750     {
16751       if (!vex.v)
16752         reg += 16;
16753     }
16754
16755   if (bytemode == vex_scalar_mode)
16756     {
16757       oappend (names_xmm[reg]);
16758       return;
16759     }
16760
16761   switch (vex.length)
16762     {
16763     case 128:
16764       switch (bytemode)
16765         {
16766         case vex_mode:
16767         case vex128_mode:
16768         case vex_vsib_q_w_dq_mode:
16769         case vex_vsib_q_w_d_mode:
16770           names = names_xmm;
16771           break;
16772         case dq_mode:
16773           if (vex.w)
16774             names = names64;
16775           else
16776             names = names32;
16777           break;
16778         case mask_bd_mode:
16779         case mask_mode:
16780           names = names_mask;
16781           break;
16782         default:
16783           abort ();
16784           return;
16785         }
16786       break;
16787     case 256:
16788       switch (bytemode)
16789         {
16790         case vex_mode:
16791         case vex256_mode:
16792           names = names_ymm;
16793           break;
16794         case vex_vsib_q_w_dq_mode:
16795         case vex_vsib_q_w_d_mode:
16796           names = vex.w ? names_ymm : names_xmm;
16797           break;
16798         case mask_bd_mode:
16799         case mask_mode:
16800           names = names_mask;
16801           break;
16802         default:
16803           abort ();
16804           return;
16805         }
16806       break;
16807     case 512:
16808       names = names_zmm;
16809       break;
16810     default:
16811       abort ();
16812       break;
16813     }
16814   oappend (names[reg]);
16815 }
16816
16817 /* Get the VEX immediate byte without moving codep.  */
16818
16819 static unsigned char
16820 get_vex_imm8 (int sizeflag, int opnum)
16821 {
16822   int bytes_before_imm = 0;
16823
16824   if (modrm.mod != 3)
16825     {
16826       /* There are SIB/displacement bytes.  */
16827       if ((sizeflag & AFLAG) || address_mode == mode_64bit)
16828         {
16829           /* 32/64 bit address mode */
16830           int base = modrm.rm;
16831
16832           /* Check SIB byte.  */
16833           if (base == 4)
16834             {
16835               FETCH_DATA (the_info, codep + 1);
16836               base = *codep & 7;
16837               /* When decoding the third source, don't increase
16838                  bytes_before_imm as this has already been incremented
16839                  by one in OP_E_memory while decoding the second
16840                  source operand.  */
16841               if (opnum == 0)
16842                 bytes_before_imm++;
16843             }
16844
16845           /* Don't increase bytes_before_imm when decoding the third source,
16846              it has already been incremented by OP_E_memory while decoding
16847              the second source operand.  */
16848           if (opnum == 0)
16849             {
16850               switch (modrm.mod)
16851                 {
16852                   case 0:
16853                     /* When modrm.rm == 5 or modrm.rm == 4 and base in
16854                        SIB == 5, there is a 4 byte displacement.  */
16855                     if (base != 5)
16856                       /* No displacement. */
16857                       break;
16858                   case 2:
16859                     /* 4 byte displacement.  */
16860                     bytes_before_imm += 4;
16861                     break;
16862                   case 1:
16863                     /* 1 byte displacement.  */
16864                     bytes_before_imm++;
16865                     break;
16866                 }
16867             }
16868         }
16869       else
16870         {
16871           /* 16 bit address mode */
16872           /* Don't increase bytes_before_imm when decoding the third source,
16873              it has already been incremented by OP_E_memory while decoding
16874              the second source operand.  */
16875           if (opnum == 0)
16876             {
16877               switch (modrm.mod)
16878                 {
16879                 case 0:
16880                   /* When modrm.rm == 6, there is a 2 byte displacement.  */
16881                   if (modrm.rm != 6)
16882                     /* No displacement. */
16883                     break;
16884                 case 2:
16885                   /* 2 byte displacement.  */
16886                   bytes_before_imm += 2;
16887                   break;
16888                 case 1:
16889                   /* 1 byte displacement: when decoding the third source,
16890                      don't increase bytes_before_imm as this has already
16891                      been incremented by one in OP_E_memory while decoding
16892                      the second source operand.  */
16893                   if (opnum == 0)
16894                     bytes_before_imm++;
16895
16896                   break;
16897                 }
16898             }
16899         }
16900     }
16901
16902   FETCH_DATA (the_info, codep + bytes_before_imm + 1);
16903   return codep [bytes_before_imm];
16904 }
16905
16906 static void
16907 OP_EX_VexReg (int bytemode, int sizeflag, int reg)
16908 {
16909   const char **names;
16910
16911   if (reg == -1 && modrm.mod != 3)
16912     {
16913       OP_E_memory (bytemode, sizeflag);
16914       return;
16915     }
16916   else
16917     {
16918       if (reg == -1)
16919         {
16920           reg = modrm.rm;
16921           USED_REX (REX_B);
16922           if (rex & REX_B)
16923             reg += 8;
16924         }
16925       else if (reg > 7 && address_mode != mode_64bit)
16926         BadOp ();
16927     }
16928
16929   switch (vex.length)
16930     {
16931     case 128:
16932       names = names_xmm;
16933       break;
16934     case 256:
16935       names = names_ymm;
16936       break;
16937     default:
16938       abort ();
16939     }
16940   oappend (names[reg]);
16941 }
16942
16943 static void
16944 OP_EX_VexImmW (int bytemode, int sizeflag)
16945 {
16946   int reg = -1;
16947   static unsigned char vex_imm8;
16948
16949   if (vex_w_done == 0)
16950     {
16951       vex_w_done = 1;
16952
16953       /* Skip mod/rm byte.  */
16954       MODRM_CHECK;
16955       codep++;
16956
16957       vex_imm8 = get_vex_imm8 (sizeflag, 0);
16958
16959       if (vex.w)
16960           reg = vex_imm8 >> 4;
16961
16962       OP_EX_VexReg (bytemode, sizeflag, reg);
16963     }
16964   else if (vex_w_done == 1)
16965     {
16966       vex_w_done = 2;
16967
16968       if (!vex.w)
16969           reg = vex_imm8 >> 4;
16970
16971       OP_EX_VexReg (bytemode, sizeflag, reg);
16972     }
16973   else
16974     {
16975       /* Output the imm8 directly.  */
16976       scratchbuf[0] = '$';
16977       print_operand_value (scratchbuf + 1, 1, vex_imm8 & 0xf);
16978       oappend_maybe_intel (scratchbuf);
16979       scratchbuf[0] = '\0';
16980       codep++;
16981     }
16982 }
16983
16984 static void
16985 OP_Vex_2src (int bytemode, int sizeflag)
16986 {
16987   if (modrm.mod == 3)
16988     {
16989       int reg = modrm.rm;
16990       USED_REX (REX_B);
16991       if (rex & REX_B)
16992         reg += 8;
16993       oappend (names_xmm[reg]);
16994     }
16995   else
16996     {
16997       if (intel_syntax
16998           && (bytemode == v_mode || bytemode == v_swap_mode))
16999         {
17000           bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
17001           used_prefixes |= (prefixes & PREFIX_DATA);
17002         }
17003       OP_E (bytemode, sizeflag);
17004     }
17005 }
17006
17007 static void
17008 OP_Vex_2src_1 (int bytemode, int sizeflag)
17009 {
17010   if (modrm.mod == 3)
17011     {
17012       /* Skip mod/rm byte.   */
17013       MODRM_CHECK;
17014       codep++;
17015     }
17016
17017   if (vex.w)
17018     oappend (names_xmm[vex.register_specifier]);
17019   else
17020     OP_Vex_2src (bytemode, sizeflag);
17021 }
17022
17023 static void
17024 OP_Vex_2src_2 (int bytemode, int sizeflag)
17025 {
17026   if (vex.w)
17027     OP_Vex_2src (bytemode, sizeflag);
17028   else
17029     oappend (names_xmm[vex.register_specifier]);
17030 }
17031
17032 static void
17033 OP_EX_VexW (int bytemode, int sizeflag)
17034 {
17035   int reg = -1;
17036
17037   if (!vex_w_done)
17038     {
17039       vex_w_done = 1;
17040
17041       /* Skip mod/rm byte.  */
17042       MODRM_CHECK;
17043       codep++;
17044
17045       if (vex.w)
17046         reg = get_vex_imm8 (sizeflag, 0) >> 4;
17047     }
17048   else
17049     {
17050       if (!vex.w)
17051         reg = get_vex_imm8 (sizeflag, 1) >> 4;
17052     }
17053
17054   OP_EX_VexReg (bytemode, sizeflag, reg);
17055 }
17056
17057 static void
17058 VEXI4_Fixup (int bytemode ATTRIBUTE_UNUSED,
17059              int sizeflag ATTRIBUTE_UNUSED)
17060 {
17061   /* Skip the immediate byte and check for invalid bits.  */
17062   FETCH_DATA (the_info, codep + 1);
17063   if (*codep++ & 0xf)
17064     BadOp ();
17065 }
17066
17067 static void
17068 OP_REG_VexI4 (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
17069 {
17070   int reg;
17071   const char **names;
17072
17073   FETCH_DATA (the_info, codep + 1);
17074   reg = *codep++;
17075
17076   if (bytemode != x_mode)
17077     abort ();
17078
17079   if (reg & 0xf)
17080       BadOp ();
17081
17082   reg >>= 4;
17083   if (reg > 7 && address_mode != mode_64bit)
17084     BadOp ();
17085
17086   switch (vex.length)
17087     {
17088     case 128:
17089       names = names_xmm;
17090       break;
17091     case 256:
17092       names = names_ymm;
17093       break;
17094     default:
17095       abort ();
17096     }
17097   oappend (names[reg]);
17098 }
17099
17100 static void
17101 OP_XMM_VexW (int bytemode, int sizeflag)
17102 {
17103   /* Turn off the REX.W bit since it is used for swapping operands
17104      now.  */
17105   rex &= ~REX_W;
17106   OP_XMM (bytemode, sizeflag);
17107 }
17108
17109 static void
17110 OP_EX_Vex (int bytemode, int sizeflag)
17111 {
17112   if (modrm.mod != 3)
17113     {
17114       if (vex.register_specifier != 0)
17115         BadOp ();
17116       need_vex_reg = 0;
17117     }
17118   OP_EX (bytemode, sizeflag);
17119 }
17120
17121 static void
17122 OP_XMM_Vex (int bytemode, int sizeflag)
17123 {
17124   if (modrm.mod != 3)
17125     {
17126       if (vex.register_specifier != 0)
17127         BadOp ();
17128       need_vex_reg = 0;
17129     }
17130   OP_XMM (bytemode, sizeflag);
17131 }
17132
17133 static void
17134 VZERO_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
17135 {
17136   switch (vex.length)
17137     {
17138     case 128:
17139       mnemonicendp = stpcpy (obuf, "vzeroupper");
17140       break;
17141     case 256:
17142       mnemonicendp = stpcpy (obuf, "vzeroall");
17143       break;
17144     default:
17145       abort ();
17146     }
17147 }
17148
17149 static struct op vex_cmp_op[] =
17150 {
17151   { STRING_COMMA_LEN ("eq") },
17152   { STRING_COMMA_LEN ("lt") },
17153   { STRING_COMMA_LEN ("le") },
17154   { STRING_COMMA_LEN ("unord") },
17155   { STRING_COMMA_LEN ("neq") },
17156   { STRING_COMMA_LEN ("nlt") },
17157   { STRING_COMMA_LEN ("nle") },
17158   { STRING_COMMA_LEN ("ord") },
17159   { STRING_COMMA_LEN ("eq_uq") },
17160   { STRING_COMMA_LEN ("nge") },
17161   { STRING_COMMA_LEN ("ngt") },
17162   { STRING_COMMA_LEN ("false") },
17163   { STRING_COMMA_LEN ("neq_oq") },
17164   { STRING_COMMA_LEN ("ge") },
17165   { STRING_COMMA_LEN ("gt") },
17166   { STRING_COMMA_LEN ("true") },
17167   { STRING_COMMA_LEN ("eq_os") },
17168   { STRING_COMMA_LEN ("lt_oq") },
17169   { STRING_COMMA_LEN ("le_oq") },
17170   { STRING_COMMA_LEN ("unord_s") },
17171   { STRING_COMMA_LEN ("neq_us") },
17172   { STRING_COMMA_LEN ("nlt_uq") },
17173   { STRING_COMMA_LEN ("nle_uq") },
17174   { STRING_COMMA_LEN ("ord_s") },
17175   { STRING_COMMA_LEN ("eq_us") },
17176   { STRING_COMMA_LEN ("nge_uq") },
17177   { STRING_COMMA_LEN ("ngt_uq") },
17178   { STRING_COMMA_LEN ("false_os") },
17179   { STRING_COMMA_LEN ("neq_os") },
17180   { STRING_COMMA_LEN ("ge_oq") },
17181   { STRING_COMMA_LEN ("gt_oq") },
17182   { STRING_COMMA_LEN ("true_us") },
17183 };
17184
17185 static void
17186 VCMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
17187 {
17188   unsigned int cmp_type;
17189
17190   FETCH_DATA (the_info, codep + 1);
17191   cmp_type = *codep++ & 0xff;
17192   if (cmp_type < ARRAY_SIZE (vex_cmp_op))
17193     {
17194       char suffix [3];
17195       char *p = mnemonicendp - 2;
17196       suffix[0] = p[0];
17197       suffix[1] = p[1];
17198       suffix[2] = '\0';
17199       sprintf (p, "%s%s", vex_cmp_op[cmp_type].name, suffix);
17200       mnemonicendp += vex_cmp_op[cmp_type].len;
17201     }
17202   else
17203     {
17204       /* We have a reserved extension byte.  Output it directly.  */
17205       scratchbuf[0] = '$';
17206       print_operand_value (scratchbuf + 1, 1, cmp_type);
17207       oappend_maybe_intel (scratchbuf);
17208       scratchbuf[0] = '\0';
17209     }
17210 }
17211
17212 static void
17213 VPCMP_Fixup (int bytemode ATTRIBUTE_UNUSED,
17214              int sizeflag ATTRIBUTE_UNUSED)
17215 {
17216   unsigned int cmp_type;
17217
17218   if (!vex.evex)
17219     abort ();
17220
17221   FETCH_DATA (the_info, codep + 1);
17222   cmp_type = *codep++ & 0xff;
17223   /* There are aliases for immediates 0, 1, 2, 4, 5, 6.
17224      If it's the case, print suffix, otherwise - print the immediate.  */
17225   if (cmp_type < ARRAY_SIZE (simd_cmp_op)
17226       && cmp_type != 3
17227       && cmp_type != 7)
17228     {
17229       char suffix [3];
17230       char *p = mnemonicendp - 2;
17231
17232       /* vpcmp* can have both one- and two-lettered suffix.  */
17233       if (p[0] == 'p')
17234         {
17235           p++;
17236           suffix[0] = p[0];
17237           suffix[1] = '\0';
17238         }
17239       else
17240         {
17241           suffix[0] = p[0];
17242           suffix[1] = p[1];
17243           suffix[2] = '\0';
17244         }
17245
17246       sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
17247       mnemonicendp += simd_cmp_op[cmp_type].len;
17248     }
17249   else
17250     {
17251       /* We have a reserved extension byte.  Output it directly.  */
17252       scratchbuf[0] = '$';
17253       print_operand_value (scratchbuf + 1, 1, cmp_type);
17254       oappend_maybe_intel (scratchbuf);
17255       scratchbuf[0] = '\0';
17256     }
17257 }
17258
17259 static const struct op pclmul_op[] =
17260 {
17261   { STRING_COMMA_LEN ("lql") },
17262   { STRING_COMMA_LEN ("hql") },
17263   { STRING_COMMA_LEN ("lqh") },
17264   { STRING_COMMA_LEN ("hqh") }
17265 };
17266
17267 static void
17268 PCLMUL_Fixup (int bytemode ATTRIBUTE_UNUSED,
17269               int sizeflag ATTRIBUTE_UNUSED)
17270 {
17271   unsigned int pclmul_type;
17272
17273   FETCH_DATA (the_info, codep + 1);
17274   pclmul_type = *codep++ & 0xff;
17275   switch (pclmul_type)
17276     {
17277     case 0x10:
17278       pclmul_type = 2;
17279       break;
17280     case 0x11:
17281       pclmul_type = 3;
17282       break;
17283     default:
17284       break;
17285     }
17286   if (pclmul_type < ARRAY_SIZE (pclmul_op))
17287     {
17288       char suffix [4];
17289       char *p = mnemonicendp - 3;
17290       suffix[0] = p[0];
17291       suffix[1] = p[1];
17292       suffix[2] = p[2];
17293       suffix[3] = '\0';
17294       sprintf (p, "%s%s", pclmul_op[pclmul_type].name, suffix);
17295       mnemonicendp += pclmul_op[pclmul_type].len;
17296     }
17297   else
17298     {
17299       /* We have a reserved extension byte.  Output it directly.  */
17300       scratchbuf[0] = '$';
17301       print_operand_value (scratchbuf + 1, 1, pclmul_type);
17302       oappend_maybe_intel (scratchbuf);
17303       scratchbuf[0] = '\0';
17304     }
17305 }
17306
17307 static void
17308 MOVBE_Fixup (int bytemode, int sizeflag)
17309 {
17310   /* Add proper suffix to "movbe".  */
17311   char *p = mnemonicendp;
17312
17313   switch (bytemode)
17314     {
17315     case v_mode:
17316       if (intel_syntax)
17317         goto skip;
17318
17319       USED_REX (REX_W);
17320       if (sizeflag & SUFFIX_ALWAYS)
17321         {
17322           if (rex & REX_W)
17323             *p++ = 'q';
17324           else
17325             {
17326               if (sizeflag & DFLAG)
17327                 *p++ = 'l';
17328               else
17329                 *p++ = 'w';
17330               used_prefixes |= (prefixes & PREFIX_DATA);
17331             }
17332         }
17333       break;
17334     default:
17335       oappend (INTERNAL_DISASSEMBLER_ERROR);
17336       break;
17337     }
17338   mnemonicendp = p;
17339   *p = '\0';
17340
17341 skip:
17342   OP_M (bytemode, sizeflag);
17343 }
17344
17345 static void
17346 OP_LWPCB_E (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
17347 {
17348   int reg;
17349   const char **names;
17350
17351   /* Skip mod/rm byte.  */
17352   MODRM_CHECK;
17353   codep++;
17354
17355   if (vex.w)
17356     names = names64;
17357   else
17358     names = names32;
17359
17360   reg = modrm.rm;
17361   USED_REX (REX_B);
17362   if (rex & REX_B)
17363     reg += 8;
17364
17365   oappend (names[reg]);
17366 }
17367
17368 static void
17369 OP_LWP_E (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
17370 {
17371   const char **names;
17372
17373   if (vex.w)
17374     names = names64;
17375   else
17376     names = names32;
17377
17378   oappend (names[vex.register_specifier]);
17379 }
17380
17381 static void
17382 OP_Mask (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
17383 {
17384   if (!vex.evex
17385       || (bytemode != mask_mode && bytemode != mask_bd_mode))
17386     abort ();
17387
17388   USED_REX (REX_R);
17389   if ((rex & REX_R) != 0 || !vex.r)
17390     {
17391       BadOp ();
17392       return;
17393     }
17394
17395   oappend (names_mask [modrm.reg]);
17396 }
17397
17398 static void
17399 OP_Rounding (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
17400 {
17401   if (!vex.evex
17402       || (bytemode != evex_rounding_mode
17403           && bytemode != evex_sae_mode))
17404     abort ();
17405   if (modrm.mod == 3 && vex.b)
17406     switch (bytemode)
17407       {
17408       case evex_rounding_mode:
17409         oappend (names_rounding[vex.ll]);
17410         break;
17411       case evex_sae_mode:
17412         oappend ("{sae}");
17413         break;
17414       default:
17415         break;
17416       }
17417 }