]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - opcodes/i386-dis.c
Fix shift for AVX512F gather/scatter instructions
[thirdparty/binutils-gdb.git] / opcodes / i386-dis.c
1 /* Print i386 instructions for GDB, the GNU debugger.
2 Copyright 1988, 1989, 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013
4 Free Software Foundation, Inc.
5
6 This file is part of the GNU opcodes library.
7
8 This library is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3, or (at your option)
11 any later version.
12
13 It is distributed in the hope that it will be useful, but WITHOUT
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
16 License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21 MA 02110-1301, USA. */
22
23
24 /* 80386 instruction printer by Pace Willisson (pace@prep.ai.mit.edu)
25 July 1988
26 modified by John Hassey (hassey@dg-rtp.dg.com)
27 x86-64 support added by Jan Hubicka (jh@suse.cz)
28 VIA PadLock support by Michal Ludvig (mludvig@suse.cz). */
29
30 /* The main tables describing the instructions is essentially a copy
31 of the "Opcode Map" chapter (Appendix A) of the Intel 80386
32 Programmers Manual. Usually, there is a capital letter, followed
33 by a small letter. The capital letter tell the addressing mode,
34 and the small letter tells about the operand size. Refer to
35 the Intel manual for details. */
36
37 #include "sysdep.h"
38 #include "dis-asm.h"
39 #include "opintl.h"
40 #include "opcode/i386.h"
41 #include "libiberty.h"
42
43 #include <setjmp.h>
44
45 static int print_insn (bfd_vma, disassemble_info *);
46 static void dofloat (int);
47 static void OP_ST (int, int);
48 static void OP_STi (int, int);
49 static int putop (const char *, int);
50 static void oappend (const char *);
51 static void append_seg (void);
52 static void OP_indirE (int, int);
53 static void print_operand_value (char *, int, bfd_vma);
54 static void OP_E_register (int, int);
55 static void OP_E_memory (int, int);
56 static void print_displacement (char *, bfd_vma);
57 static void OP_E (int, int);
58 static void OP_G (int, int);
59 static bfd_vma get64 (void);
60 static bfd_signed_vma get32 (void);
61 static bfd_signed_vma get32s (void);
62 static int get16 (void);
63 static void set_op (bfd_vma, int);
64 static void OP_Skip_MODRM (int, int);
65 static void OP_REG (int, int);
66 static void OP_IMREG (int, int);
67 static void OP_I (int, int);
68 static void OP_I64 (int, int);
69 static void OP_sI (int, int);
70 static void OP_J (int, int);
71 static void OP_SEG (int, int);
72 static void OP_DIR (int, int);
73 static void OP_OFF (int, int);
74 static void OP_OFF64 (int, int);
75 static void ptr_reg (int, int);
76 static void OP_ESreg (int, int);
77 static void OP_DSreg (int, int);
78 static void OP_C (int, int);
79 static void OP_D (int, int);
80 static void OP_T (int, int);
81 static void OP_R (int, int);
82 static void OP_MMX (int, int);
83 static void OP_XMM (int, int);
84 static void OP_EM (int, int);
85 static void OP_EX (int, int);
86 static void OP_EMC (int,int);
87 static void OP_MXC (int,int);
88 static void OP_MS (int, int);
89 static void OP_XS (int, int);
90 static void OP_M (int, int);
91 static void OP_VEX (int, int);
92 static void OP_EX_Vex (int, int);
93 static void OP_EX_VexW (int, int);
94 static void OP_EX_VexImmW (int, int);
95 static void OP_XMM_Vex (int, int);
96 static void OP_XMM_VexW (int, int);
97 static void OP_Rounding (int, int);
98 static void OP_REG_VexI4 (int, int);
99 static void PCLMUL_Fixup (int, int);
100 static void VEXI4_Fixup (int, int);
101 static void VZERO_Fixup (int, int);
102 static void VCMP_Fixup (int, int);
103 static void VPCMP_Fixup (int, int);
104 static void OP_0f07 (int, int);
105 static void OP_Monitor (int, int);
106 static void OP_Mwait (int, int);
107 static void NOP_Fixup1 (int, int);
108 static void NOP_Fixup2 (int, int);
109 static void OP_3DNowSuffix (int, int);
110 static void CMP_Fixup (int, int);
111 static void BadOp (void);
112 static void REP_Fixup (int, int);
113 static void BND_Fixup (int, int);
114 static void HLE_Fixup1 (int, int);
115 static void HLE_Fixup2 (int, int);
116 static void HLE_Fixup3 (int, int);
117 static void CMPXCHG8B_Fixup (int, int);
118 static void XMM_Fixup (int, int);
119 static void CRC32_Fixup (int, int);
120 static void FXSAVE_Fixup (int, int);
121 static void OP_LWPCB_E (int, int);
122 static void OP_LWP_E (int, int);
123 static void OP_Vex_2src_1 (int, int);
124 static void OP_Vex_2src_2 (int, int);
125
126 static void MOVBE_Fixup (int, int);
127
128 static void OP_Mask (int, int);
129
130 struct dis_private {
131 /* Points to first byte not fetched. */
132 bfd_byte *max_fetched;
133 bfd_byte the_buffer[MAX_MNEM_SIZE];
134 bfd_vma insn_start;
135 int orig_sizeflag;
136 jmp_buf bailout;
137 };
138
139 enum address_mode
140 {
141 mode_16bit,
142 mode_32bit,
143 mode_64bit
144 };
145
146 enum address_mode address_mode;
147
148 /* Flags for the prefixes for the current instruction. See below. */
149 static int prefixes;
150
151 /* REX prefix the current instruction. See below. */
152 static int rex;
153 /* Bits of REX we've already used. */
154 static int rex_used;
155 /* REX bits in original REX prefix ignored. */
156 static int rex_ignored;
157 /* Mark parts used in the REX prefix. When we are testing for
158 empty prefix (for 8bit register REX extension), just mask it
159 out. Otherwise test for REX bit is excuse for existence of REX
160 only in case value is nonzero. */
161 #define USED_REX(value) \
162 { \
163 if (value) \
164 { \
165 if ((rex & value)) \
166 rex_used |= (value) | REX_OPCODE; \
167 } \
168 else \
169 rex_used |= REX_OPCODE; \
170 }
171
172 /* Flags for prefixes which we somehow handled when printing the
173 current instruction. */
174 static int used_prefixes;
175
176 /* Flags stored in PREFIXES. */
177 #define PREFIX_REPZ 1
178 #define PREFIX_REPNZ 2
179 #define PREFIX_LOCK 4
180 #define PREFIX_CS 8
181 #define PREFIX_SS 0x10
182 #define PREFIX_DS 0x20
183 #define PREFIX_ES 0x40
184 #define PREFIX_FS 0x80
185 #define PREFIX_GS 0x100
186 #define PREFIX_DATA 0x200
187 #define PREFIX_ADDR 0x400
188 #define PREFIX_FWAIT 0x800
189
190 /* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
191 to ADDR (exclusive) are valid. Returns 1 for success, longjmps
192 on error. */
193 #define FETCH_DATA(info, addr) \
194 ((addr) <= ((struct dis_private *) (info->private_data))->max_fetched \
195 ? 1 : fetch_data ((info), (addr)))
196
197 static int
198 fetch_data (struct disassemble_info *info, bfd_byte *addr)
199 {
200 int status;
201 struct dis_private *priv = (struct dis_private *) info->private_data;
202 bfd_vma start = priv->insn_start + (priv->max_fetched - priv->the_buffer);
203
204 if (addr <= priv->the_buffer + MAX_MNEM_SIZE)
205 status = (*info->read_memory_func) (start,
206 priv->max_fetched,
207 addr - priv->max_fetched,
208 info);
209 else
210 status = -1;
211 if (status != 0)
212 {
213 /* If we did manage to read at least one byte, then
214 print_insn_i386 will do something sensible. Otherwise, print
215 an error. We do that here because this is where we know
216 STATUS. */
217 if (priv->max_fetched == priv->the_buffer)
218 (*info->memory_error_func) (status, start, info);
219 longjmp (priv->bailout, 1);
220 }
221 else
222 priv->max_fetched = addr;
223 return 1;
224 }
225
226 #define XX { NULL, 0 }
227 #define Bad_Opcode NULL, { { NULL, 0 } }
228
229 #define Eb { OP_E, b_mode }
230 #define Ebnd { OP_E, bnd_mode }
231 #define EbS { OP_E, b_swap_mode }
232 #define Ev { OP_E, v_mode }
233 #define Ev_bnd { OP_E, v_bnd_mode }
234 #define EvS { OP_E, v_swap_mode }
235 #define Ed { OP_E, d_mode }
236 #define Edq { OP_E, dq_mode }
237 #define Edqw { OP_E, dqw_mode }
238 #define Edqb { OP_E, dqb_mode }
239 #define Edqd { OP_E, dqd_mode }
240 #define Eq { OP_E, q_mode }
241 #define indirEv { OP_indirE, stack_v_mode }
242 #define indirEp { OP_indirE, f_mode }
243 #define stackEv { OP_E, stack_v_mode }
244 #define Em { OP_E, m_mode }
245 #define Ew { OP_E, w_mode }
246 #define M { OP_M, 0 } /* lea, lgdt, etc. */
247 #define Ma { OP_M, a_mode }
248 #define Mb { OP_M, b_mode }
249 #define Md { OP_M, d_mode }
250 #define Mo { OP_M, o_mode }
251 #define Mp { OP_M, f_mode } /* 32 or 48 bit memory operand for LDS, LES etc */
252 #define Mq { OP_M, q_mode }
253 #define Mx { OP_M, x_mode }
254 #define Mxmm { OP_M, xmm_mode }
255 #define Gb { OP_G, b_mode }
256 #define Gbnd { OP_G, bnd_mode }
257 #define Gv { OP_G, v_mode }
258 #define Gd { OP_G, d_mode }
259 #define Gdq { OP_G, dq_mode }
260 #define Gm { OP_G, m_mode }
261 #define Gw { OP_G, w_mode }
262 #define Rd { OP_R, d_mode }
263 #define Rdq { OP_R, dq_mode }
264 #define Rm { OP_R, m_mode }
265 #define Ib { OP_I, b_mode }
266 #define sIb { OP_sI, b_mode } /* sign extened byte */
267 #define sIbT { OP_sI, b_T_mode } /* sign extened byte like 'T' */
268 #define Iv { OP_I, v_mode }
269 #define sIv { OP_sI, v_mode }
270 #define Iq { OP_I, q_mode }
271 #define Iv64 { OP_I64, v_mode }
272 #define Iw { OP_I, w_mode }
273 #define I1 { OP_I, const_1_mode }
274 #define Jb { OP_J, b_mode }
275 #define Jv { OP_J, v_mode }
276 #define Cm { OP_C, m_mode }
277 #define Dm { OP_D, m_mode }
278 #define Td { OP_T, d_mode }
279 #define Skip_MODRM { OP_Skip_MODRM, 0 }
280
281 #define RMeAX { OP_REG, eAX_reg }
282 #define RMeBX { OP_REG, eBX_reg }
283 #define RMeCX { OP_REG, eCX_reg }
284 #define RMeDX { OP_REG, eDX_reg }
285 #define RMeSP { OP_REG, eSP_reg }
286 #define RMeBP { OP_REG, eBP_reg }
287 #define RMeSI { OP_REG, eSI_reg }
288 #define RMeDI { OP_REG, eDI_reg }
289 #define RMrAX { OP_REG, rAX_reg }
290 #define RMrBX { OP_REG, rBX_reg }
291 #define RMrCX { OP_REG, rCX_reg }
292 #define RMrDX { OP_REG, rDX_reg }
293 #define RMrSP { OP_REG, rSP_reg }
294 #define RMrBP { OP_REG, rBP_reg }
295 #define RMrSI { OP_REG, rSI_reg }
296 #define RMrDI { OP_REG, rDI_reg }
297 #define RMAL { OP_REG, al_reg }
298 #define RMCL { OP_REG, cl_reg }
299 #define RMDL { OP_REG, dl_reg }
300 #define RMBL { OP_REG, bl_reg }
301 #define RMAH { OP_REG, ah_reg }
302 #define RMCH { OP_REG, ch_reg }
303 #define RMDH { OP_REG, dh_reg }
304 #define RMBH { OP_REG, bh_reg }
305 #define RMAX { OP_REG, ax_reg }
306 #define RMDX { OP_REG, dx_reg }
307
308 #define eAX { OP_IMREG, eAX_reg }
309 #define eBX { OP_IMREG, eBX_reg }
310 #define eCX { OP_IMREG, eCX_reg }
311 #define eDX { OP_IMREG, eDX_reg }
312 #define eSP { OP_IMREG, eSP_reg }
313 #define eBP { OP_IMREG, eBP_reg }
314 #define eSI { OP_IMREG, eSI_reg }
315 #define eDI { OP_IMREG, eDI_reg }
316 #define AL { OP_IMREG, al_reg }
317 #define CL { OP_IMREG, cl_reg }
318 #define DL { OP_IMREG, dl_reg }
319 #define BL { OP_IMREG, bl_reg }
320 #define AH { OP_IMREG, ah_reg }
321 #define CH { OP_IMREG, ch_reg }
322 #define DH { OP_IMREG, dh_reg }
323 #define BH { OP_IMREG, bh_reg }
324 #define AX { OP_IMREG, ax_reg }
325 #define DX { OP_IMREG, dx_reg }
326 #define zAX { OP_IMREG, z_mode_ax_reg }
327 #define indirDX { OP_IMREG, indir_dx_reg }
328
329 #define Sw { OP_SEG, w_mode }
330 #define Sv { OP_SEG, v_mode }
331 #define Ap { OP_DIR, 0 }
332 #define Ob { OP_OFF64, b_mode }
333 #define Ov { OP_OFF64, v_mode }
334 #define Xb { OP_DSreg, eSI_reg }
335 #define Xv { OP_DSreg, eSI_reg }
336 #define Xz { OP_DSreg, eSI_reg }
337 #define Yb { OP_ESreg, eDI_reg }
338 #define Yv { OP_ESreg, eDI_reg }
339 #define DSBX { OP_DSreg, eBX_reg }
340
341 #define es { OP_REG, es_reg }
342 #define ss { OP_REG, ss_reg }
343 #define cs { OP_REG, cs_reg }
344 #define ds { OP_REG, ds_reg }
345 #define fs { OP_REG, fs_reg }
346 #define gs { OP_REG, gs_reg }
347
348 #define MX { OP_MMX, 0 }
349 #define XM { OP_XMM, 0 }
350 #define XMScalar { OP_XMM, scalar_mode }
351 #define XMGatherQ { OP_XMM, vex_vsib_q_w_dq_mode }
352 #define XMM { OP_XMM, xmm_mode }
353 #define XMxmmq { OP_XMM, xmmq_mode }
354 #define EM { OP_EM, v_mode }
355 #define EMS { OP_EM, v_swap_mode }
356 #define EMd { OP_EM, d_mode }
357 #define EMx { OP_EM, x_mode }
358 #define EXw { OP_EX, w_mode }
359 #define EXd { OP_EX, d_mode }
360 #define EXdScalar { OP_EX, d_scalar_mode }
361 #define EXdS { OP_EX, d_swap_mode }
362 #define EXdScalarS { OP_EX, d_scalar_swap_mode }
363 #define EXq { OP_EX, q_mode }
364 #define EXqScalar { OP_EX, q_scalar_mode }
365 #define EXqScalarS { OP_EX, q_scalar_swap_mode }
366 #define EXqS { OP_EX, q_swap_mode }
367 #define EXx { OP_EX, x_mode }
368 #define EXxS { OP_EX, x_swap_mode }
369 #define EXxmm { OP_EX, xmm_mode }
370 #define EXymm { OP_EX, ymm_mode }
371 #define EXxmmq { OP_EX, xmmq_mode }
372 #define EXEvexHalfBcstXmmq { OP_EX, evex_half_bcst_xmmq_mode }
373 #define EXxmm_mb { OP_EX, xmm_mb_mode }
374 #define EXxmm_mw { OP_EX, xmm_mw_mode }
375 #define EXxmm_md { OP_EX, xmm_md_mode }
376 #define EXxmm_mq { OP_EX, xmm_mq_mode }
377 #define EXxmm_mdq { OP_EX, xmm_mdq_mode }
378 #define EXxmmdw { OP_EX, xmmdw_mode }
379 #define EXxmmqd { OP_EX, xmmqd_mode }
380 #define EXymmq { OP_EX, ymmq_mode }
381 #define EXVexWdq { OP_EX, vex_w_dq_mode }
382 #define EXVexWdqScalar { OP_EX, vex_scalar_w_dq_mode }
383 #define EXEvexXGscat { OP_EX, evex_x_gscat_mode }
384 #define EXEvexXNoBcst { OP_EX, evex_x_nobcst_mode }
385 #define MS { OP_MS, v_mode }
386 #define XS { OP_XS, v_mode }
387 #define EMCq { OP_EMC, q_mode }
388 #define MXC { OP_MXC, 0 }
389 #define OPSUF { OP_3DNowSuffix, 0 }
390 #define CMP { CMP_Fixup, 0 }
391 #define XMM0 { XMM_Fixup, 0 }
392 #define FXSAVE { FXSAVE_Fixup, 0 }
393 #define Vex_2src_1 { OP_Vex_2src_1, 0 }
394 #define Vex_2src_2 { OP_Vex_2src_2, 0 }
395
396 #define Vex { OP_VEX, vex_mode }
397 #define VexScalar { OP_VEX, vex_scalar_mode }
398 #define VexGatherQ { OP_VEX, vex_vsib_q_w_dq_mode }
399 #define Vex128 { OP_VEX, vex128_mode }
400 #define Vex256 { OP_VEX, vex256_mode }
401 #define VexGdq { OP_VEX, dq_mode }
402 #define VexI4 { VEXI4_Fixup, 0}
403 #define EXdVex { OP_EX_Vex, d_mode }
404 #define EXdVexS { OP_EX_Vex, d_swap_mode }
405 #define EXdVexScalarS { OP_EX_Vex, d_scalar_swap_mode }
406 #define EXqVex { OP_EX_Vex, q_mode }
407 #define EXqVexS { OP_EX_Vex, q_swap_mode }
408 #define EXqVexScalarS { OP_EX_Vex, q_scalar_swap_mode }
409 #define EXVexW { OP_EX_VexW, x_mode }
410 #define EXdVexW { OP_EX_VexW, d_mode }
411 #define EXqVexW { OP_EX_VexW, q_mode }
412 #define EXVexImmW { OP_EX_VexImmW, x_mode }
413 #define XMVex { OP_XMM_Vex, 0 }
414 #define XMVexScalar { OP_XMM_Vex, scalar_mode }
415 #define XMVexW { OP_XMM_VexW, 0 }
416 #define XMVexI4 { OP_REG_VexI4, x_mode }
417 #define PCLMUL { PCLMUL_Fixup, 0 }
418 #define VZERO { VZERO_Fixup, 0 }
419 #define VCMP { VCMP_Fixup, 0 }
420 #define VPCMP { VPCMP_Fixup, 0 }
421
422 #define EXxEVexR { OP_Rounding, evex_rounding_mode }
423 #define EXxEVexS { OP_Rounding, evex_sae_mode }
424
425 #define XMask { OP_Mask, mask_mode }
426 #define MaskG { OP_G, mask_mode }
427 #define MaskE { OP_E, mask_mode }
428 #define MaskR { OP_R, mask_mode }
429 #define MaskVex { OP_VEX, mask_mode }
430
431 #define MVexVSIBDWpX { OP_M, vex_vsib_d_w_dq_mode }
432 #define MVexVSIBQWpX { OP_M, vex_vsib_q_w_dq_mode }
433
434 /* Used handle "rep" prefix for string instructions. */
435 #define Xbr { REP_Fixup, eSI_reg }
436 #define Xvr { REP_Fixup, eSI_reg }
437 #define Ybr { REP_Fixup, eDI_reg }
438 #define Yvr { REP_Fixup, eDI_reg }
439 #define Yzr { REP_Fixup, eDI_reg }
440 #define indirDXr { REP_Fixup, indir_dx_reg }
441 #define ALr { REP_Fixup, al_reg }
442 #define eAXr { REP_Fixup, eAX_reg }
443
444 /* Used handle HLE prefix for lockable instructions. */
445 #define Ebh1 { HLE_Fixup1, b_mode }
446 #define Evh1 { HLE_Fixup1, v_mode }
447 #define Ebh2 { HLE_Fixup2, b_mode }
448 #define Evh2 { HLE_Fixup2, v_mode }
449 #define Ebh3 { HLE_Fixup3, b_mode }
450 #define Evh3 { HLE_Fixup3, v_mode }
451
452 #define BND { BND_Fixup, 0 }
453
454 #define cond_jump_flag { NULL, cond_jump_mode }
455 #define loop_jcxz_flag { NULL, loop_jcxz_mode }
456
457 /* bits in sizeflag */
458 #define SUFFIX_ALWAYS 4
459 #define AFLAG 2
460 #define DFLAG 1
461
462 enum
463 {
464 /* byte operand */
465 b_mode = 1,
466 /* byte operand with operand swapped */
467 b_swap_mode,
468 /* byte operand, sign extend like 'T' suffix */
469 b_T_mode,
470 /* operand size depends on prefixes */
471 v_mode,
472 /* operand size depends on prefixes with operand swapped */
473 v_swap_mode,
474 /* word operand */
475 w_mode,
476 /* double word operand */
477 d_mode,
478 /* double word operand with operand swapped */
479 d_swap_mode,
480 /* quad word operand */
481 q_mode,
482 /* quad word operand with operand swapped */
483 q_swap_mode,
484 /* ten-byte operand */
485 t_mode,
486 /* 16-byte XMM, 32-byte YMM or 64-byte ZMM operand. In EVEX with
487 broadcast enabled. */
488 x_mode,
489 /* Similar to x_mode, but with different EVEX mem shifts. */
490 evex_x_gscat_mode,
491 /* Similar to x_mode, but with disabled broadcast. */
492 evex_x_nobcst_mode,
493 /* Similar to x_mode, but with operands swapped and disabled broadcast
494 in EVEX. */
495 x_swap_mode,
496 /* 16-byte XMM operand */
497 xmm_mode,
498 /* XMM, XMM or YMM register operand, or quad word, xmmword or ymmword
499 memory operand (depending on vector length). Broadcast isn't
500 allowed. */
501 xmmq_mode,
502 /* Same as xmmq_mode, but broadcast is allowed. */
503 evex_half_bcst_xmmq_mode,
504 /* XMM register or byte memory operand */
505 xmm_mb_mode,
506 /* XMM register or word memory operand */
507 xmm_mw_mode,
508 /* XMM register or double word memory operand */
509 xmm_md_mode,
510 /* XMM register or quad word memory operand */
511 xmm_mq_mode,
512 /* XMM register or double/quad word memory operand, depending on
513 VEX.W. */
514 xmm_mdq_mode,
515 /* 16-byte XMM, word, double word or quad word operand. */
516 xmmdw_mode,
517 /* 16-byte XMM, double word, quad word operand or xmm word operand. */
518 xmmqd_mode,
519 /* 32-byte YMM operand */
520 ymm_mode,
521 /* quad word, ymmword or zmmword memory operand. */
522 ymmq_mode,
523 /* 32-byte YMM or 16-byte word operand */
524 ymmxmm_mode,
525 /* d_mode in 32bit, q_mode in 64bit mode. */
526 m_mode,
527 /* pair of v_mode operands */
528 a_mode,
529 cond_jump_mode,
530 loop_jcxz_mode,
531 v_bnd_mode,
532 /* operand size depends on REX prefixes. */
533 dq_mode,
534 /* registers like dq_mode, memory like w_mode. */
535 dqw_mode,
536 bnd_mode,
537 /* 4- or 6-byte pointer operand */
538 f_mode,
539 const_1_mode,
540 /* v_mode for stack-related opcodes. */
541 stack_v_mode,
542 /* non-quad operand size depends on prefixes */
543 z_mode,
544 /* 16-byte operand */
545 o_mode,
546 /* registers like dq_mode, memory like b_mode. */
547 dqb_mode,
548 /* registers like dq_mode, memory like d_mode. */
549 dqd_mode,
550 /* normal vex mode */
551 vex_mode,
552 /* 128bit vex mode */
553 vex128_mode,
554 /* 256bit vex mode */
555 vex256_mode,
556 /* operand size depends on the VEX.W bit. */
557 vex_w_dq_mode,
558
559 /* Similar to vex_w_dq_mode, with VSIB dword indices. */
560 vex_vsib_d_w_dq_mode,
561 /* Similar to vex_w_dq_mode, with VSIB qword indices. */
562 vex_vsib_q_w_dq_mode,
563
564 /* scalar, ignore vector length. */
565 scalar_mode,
566 /* like d_mode, ignore vector length. */
567 d_scalar_mode,
568 /* like d_swap_mode, ignore vector length. */
569 d_scalar_swap_mode,
570 /* like q_mode, ignore vector length. */
571 q_scalar_mode,
572 /* like q_swap_mode, ignore vector length. */
573 q_scalar_swap_mode,
574 /* like vex_mode, ignore vector length. */
575 vex_scalar_mode,
576 /* like vex_w_dq_mode, ignore vector length. */
577 vex_scalar_w_dq_mode,
578
579 /* Static rounding. */
580 evex_rounding_mode,
581 /* Supress all exceptions. */
582 evex_sae_mode,
583
584 /* Mask register operand. */
585 mask_mode,
586
587 es_reg,
588 cs_reg,
589 ss_reg,
590 ds_reg,
591 fs_reg,
592 gs_reg,
593
594 eAX_reg,
595 eCX_reg,
596 eDX_reg,
597 eBX_reg,
598 eSP_reg,
599 eBP_reg,
600 eSI_reg,
601 eDI_reg,
602
603 al_reg,
604 cl_reg,
605 dl_reg,
606 bl_reg,
607 ah_reg,
608 ch_reg,
609 dh_reg,
610 bh_reg,
611
612 ax_reg,
613 cx_reg,
614 dx_reg,
615 bx_reg,
616 sp_reg,
617 bp_reg,
618 si_reg,
619 di_reg,
620
621 rAX_reg,
622 rCX_reg,
623 rDX_reg,
624 rBX_reg,
625 rSP_reg,
626 rBP_reg,
627 rSI_reg,
628 rDI_reg,
629
630 z_mode_ax_reg,
631 indir_dx_reg
632 };
633
634 enum
635 {
636 FLOATCODE = 1,
637 USE_REG_TABLE,
638 USE_MOD_TABLE,
639 USE_RM_TABLE,
640 USE_PREFIX_TABLE,
641 USE_X86_64_TABLE,
642 USE_3BYTE_TABLE,
643 USE_XOP_8F_TABLE,
644 USE_VEX_C4_TABLE,
645 USE_VEX_C5_TABLE,
646 USE_VEX_LEN_TABLE,
647 USE_VEX_W_TABLE,
648 USE_EVEX_TABLE
649 };
650
651 #define FLOAT NULL, { { NULL, FLOATCODE } }
652
653 #define DIS386(T, I) NULL, { { NULL, (T)}, { NULL, (I) } }
654 #define REG_TABLE(I) DIS386 (USE_REG_TABLE, (I))
655 #define MOD_TABLE(I) DIS386 (USE_MOD_TABLE, (I))
656 #define RM_TABLE(I) DIS386 (USE_RM_TABLE, (I))
657 #define PREFIX_TABLE(I) DIS386 (USE_PREFIX_TABLE, (I))
658 #define X86_64_TABLE(I) DIS386 (USE_X86_64_TABLE, (I))
659 #define THREE_BYTE_TABLE(I) DIS386 (USE_3BYTE_TABLE, (I))
660 #define XOP_8F_TABLE(I) DIS386 (USE_XOP_8F_TABLE, (I))
661 #define VEX_C4_TABLE(I) DIS386 (USE_VEX_C4_TABLE, (I))
662 #define VEX_C5_TABLE(I) DIS386 (USE_VEX_C5_TABLE, (I))
663 #define VEX_LEN_TABLE(I) DIS386 (USE_VEX_LEN_TABLE, (I))
664 #define VEX_W_TABLE(I) DIS386 (USE_VEX_W_TABLE, (I))
665 #define EVEX_TABLE(I) DIS386 (USE_EVEX_TABLE, (I))
666
667 enum
668 {
669 REG_80 = 0,
670 REG_81,
671 REG_82,
672 REG_8F,
673 REG_C0,
674 REG_C1,
675 REG_C6,
676 REG_C7,
677 REG_D0,
678 REG_D1,
679 REG_D2,
680 REG_D3,
681 REG_F6,
682 REG_F7,
683 REG_FE,
684 REG_FF,
685 REG_0F00,
686 REG_0F01,
687 REG_0F0D,
688 REG_0F18,
689 REG_0F71,
690 REG_0F72,
691 REG_0F73,
692 REG_0FA6,
693 REG_0FA7,
694 REG_0FAE,
695 REG_0FBA,
696 REG_0FC7,
697 REG_VEX_0F71,
698 REG_VEX_0F72,
699 REG_VEX_0F73,
700 REG_VEX_0FAE,
701 REG_VEX_0F38F3,
702 REG_XOP_LWPCB,
703 REG_XOP_LWP,
704 REG_XOP_TBM_01,
705 REG_XOP_TBM_02,
706
707 REG_EVEX_0F72,
708 REG_EVEX_0F73,
709 REG_EVEX_0F38C6,
710 REG_EVEX_0F38C7
711 };
712
713 enum
714 {
715 MOD_8D = 0,
716 MOD_C6_REG_7,
717 MOD_C7_REG_7,
718 MOD_FF_REG_3,
719 MOD_FF_REG_5,
720 MOD_0F01_REG_0,
721 MOD_0F01_REG_1,
722 MOD_0F01_REG_2,
723 MOD_0F01_REG_3,
724 MOD_0F01_REG_7,
725 MOD_0F12_PREFIX_0,
726 MOD_0F13,
727 MOD_0F16_PREFIX_0,
728 MOD_0F17,
729 MOD_0F18_REG_0,
730 MOD_0F18_REG_1,
731 MOD_0F18_REG_2,
732 MOD_0F18_REG_3,
733 MOD_0F18_REG_4,
734 MOD_0F18_REG_5,
735 MOD_0F18_REG_6,
736 MOD_0F18_REG_7,
737 MOD_0F1A_PREFIX_0,
738 MOD_0F1B_PREFIX_0,
739 MOD_0F1B_PREFIX_1,
740 MOD_0F20,
741 MOD_0F21,
742 MOD_0F22,
743 MOD_0F23,
744 MOD_0F24,
745 MOD_0F26,
746 MOD_0F2B_PREFIX_0,
747 MOD_0F2B_PREFIX_1,
748 MOD_0F2B_PREFIX_2,
749 MOD_0F2B_PREFIX_3,
750 MOD_0F51,
751 MOD_0F71_REG_2,
752 MOD_0F71_REG_4,
753 MOD_0F71_REG_6,
754 MOD_0F72_REG_2,
755 MOD_0F72_REG_4,
756 MOD_0F72_REG_6,
757 MOD_0F73_REG_2,
758 MOD_0F73_REG_3,
759 MOD_0F73_REG_6,
760 MOD_0F73_REG_7,
761 MOD_0FAE_REG_0,
762 MOD_0FAE_REG_1,
763 MOD_0FAE_REG_2,
764 MOD_0FAE_REG_3,
765 MOD_0FAE_REG_4,
766 MOD_0FAE_REG_5,
767 MOD_0FAE_REG_6,
768 MOD_0FAE_REG_7,
769 MOD_0FB2,
770 MOD_0FB4,
771 MOD_0FB5,
772 MOD_0FC7_REG_6,
773 MOD_0FC7_REG_7,
774 MOD_0FD7,
775 MOD_0FE7_PREFIX_2,
776 MOD_0FF0_PREFIX_3,
777 MOD_0F382A_PREFIX_2,
778 MOD_62_32BIT,
779 MOD_C4_32BIT,
780 MOD_C5_32BIT,
781 MOD_VEX_0F12_PREFIX_0,
782 MOD_VEX_0F13,
783 MOD_VEX_0F16_PREFIX_0,
784 MOD_VEX_0F17,
785 MOD_VEX_0F2B,
786 MOD_VEX_0F50,
787 MOD_VEX_0F71_REG_2,
788 MOD_VEX_0F71_REG_4,
789 MOD_VEX_0F71_REG_6,
790 MOD_VEX_0F72_REG_2,
791 MOD_VEX_0F72_REG_4,
792 MOD_VEX_0F72_REG_6,
793 MOD_VEX_0F73_REG_2,
794 MOD_VEX_0F73_REG_3,
795 MOD_VEX_0F73_REG_6,
796 MOD_VEX_0F73_REG_7,
797 MOD_VEX_0FAE_REG_2,
798 MOD_VEX_0FAE_REG_3,
799 MOD_VEX_0FD7_PREFIX_2,
800 MOD_VEX_0FE7_PREFIX_2,
801 MOD_VEX_0FF0_PREFIX_3,
802 MOD_VEX_0F381A_PREFIX_2,
803 MOD_VEX_0F382A_PREFIX_2,
804 MOD_VEX_0F382C_PREFIX_2,
805 MOD_VEX_0F382D_PREFIX_2,
806 MOD_VEX_0F382E_PREFIX_2,
807 MOD_VEX_0F382F_PREFIX_2,
808 MOD_VEX_0F385A_PREFIX_2,
809 MOD_VEX_0F388C_PREFIX_2,
810 MOD_VEX_0F388E_PREFIX_2,
811
812 MOD_EVEX_0F10_PREFIX_1,
813 MOD_EVEX_0F10_PREFIX_3,
814 MOD_EVEX_0F11_PREFIX_1,
815 MOD_EVEX_0F11_PREFIX_3,
816 MOD_EVEX_0F12_PREFIX_0,
817 MOD_EVEX_0F16_PREFIX_0,
818 MOD_EVEX_0F38C6_REG_1,
819 MOD_EVEX_0F38C6_REG_2,
820 MOD_EVEX_0F38C6_REG_5,
821 MOD_EVEX_0F38C6_REG_6,
822 MOD_EVEX_0F38C7_REG_1,
823 MOD_EVEX_0F38C7_REG_2,
824 MOD_EVEX_0F38C7_REG_5,
825 MOD_EVEX_0F38C7_REG_6
826 };
827
828 enum
829 {
830 RM_C6_REG_7 = 0,
831 RM_C7_REG_7,
832 RM_0F01_REG_0,
833 RM_0F01_REG_1,
834 RM_0F01_REG_2,
835 RM_0F01_REG_3,
836 RM_0F01_REG_7,
837 RM_0FAE_REG_5,
838 RM_0FAE_REG_6,
839 RM_0FAE_REG_7
840 };
841
842 enum
843 {
844 PREFIX_90 = 0,
845 PREFIX_0F10,
846 PREFIX_0F11,
847 PREFIX_0F12,
848 PREFIX_0F16,
849 PREFIX_0F1A,
850 PREFIX_0F1B,
851 PREFIX_0F2A,
852 PREFIX_0F2B,
853 PREFIX_0F2C,
854 PREFIX_0F2D,
855 PREFIX_0F2E,
856 PREFIX_0F2F,
857 PREFIX_0F51,
858 PREFIX_0F52,
859 PREFIX_0F53,
860 PREFIX_0F58,
861 PREFIX_0F59,
862 PREFIX_0F5A,
863 PREFIX_0F5B,
864 PREFIX_0F5C,
865 PREFIX_0F5D,
866 PREFIX_0F5E,
867 PREFIX_0F5F,
868 PREFIX_0F60,
869 PREFIX_0F61,
870 PREFIX_0F62,
871 PREFIX_0F6C,
872 PREFIX_0F6D,
873 PREFIX_0F6F,
874 PREFIX_0F70,
875 PREFIX_0F73_REG_3,
876 PREFIX_0F73_REG_7,
877 PREFIX_0F78,
878 PREFIX_0F79,
879 PREFIX_0F7C,
880 PREFIX_0F7D,
881 PREFIX_0F7E,
882 PREFIX_0F7F,
883 PREFIX_0FAE_REG_0,
884 PREFIX_0FAE_REG_1,
885 PREFIX_0FAE_REG_2,
886 PREFIX_0FAE_REG_3,
887 PREFIX_0FB8,
888 PREFIX_0FBC,
889 PREFIX_0FBD,
890 PREFIX_0FC2,
891 PREFIX_0FC3,
892 PREFIX_0FC7_REG_6,
893 PREFIX_0FD0,
894 PREFIX_0FD6,
895 PREFIX_0FE6,
896 PREFIX_0FE7,
897 PREFIX_0FF0,
898 PREFIX_0FF7,
899 PREFIX_0F3810,
900 PREFIX_0F3814,
901 PREFIX_0F3815,
902 PREFIX_0F3817,
903 PREFIX_0F3820,
904 PREFIX_0F3821,
905 PREFIX_0F3822,
906 PREFIX_0F3823,
907 PREFIX_0F3824,
908 PREFIX_0F3825,
909 PREFIX_0F3828,
910 PREFIX_0F3829,
911 PREFIX_0F382A,
912 PREFIX_0F382B,
913 PREFIX_0F3830,
914 PREFIX_0F3831,
915 PREFIX_0F3832,
916 PREFIX_0F3833,
917 PREFIX_0F3834,
918 PREFIX_0F3835,
919 PREFIX_0F3837,
920 PREFIX_0F3838,
921 PREFIX_0F3839,
922 PREFIX_0F383A,
923 PREFIX_0F383B,
924 PREFIX_0F383C,
925 PREFIX_0F383D,
926 PREFIX_0F383E,
927 PREFIX_0F383F,
928 PREFIX_0F3840,
929 PREFIX_0F3841,
930 PREFIX_0F3880,
931 PREFIX_0F3881,
932 PREFIX_0F3882,
933 PREFIX_0F38C8,
934 PREFIX_0F38C9,
935 PREFIX_0F38CA,
936 PREFIX_0F38CB,
937 PREFIX_0F38CC,
938 PREFIX_0F38CD,
939 PREFIX_0F38DB,
940 PREFIX_0F38DC,
941 PREFIX_0F38DD,
942 PREFIX_0F38DE,
943 PREFIX_0F38DF,
944 PREFIX_0F38F0,
945 PREFIX_0F38F1,
946 PREFIX_0F38F6,
947 PREFIX_0F3A08,
948 PREFIX_0F3A09,
949 PREFIX_0F3A0A,
950 PREFIX_0F3A0B,
951 PREFIX_0F3A0C,
952 PREFIX_0F3A0D,
953 PREFIX_0F3A0E,
954 PREFIX_0F3A14,
955 PREFIX_0F3A15,
956 PREFIX_0F3A16,
957 PREFIX_0F3A17,
958 PREFIX_0F3A20,
959 PREFIX_0F3A21,
960 PREFIX_0F3A22,
961 PREFIX_0F3A40,
962 PREFIX_0F3A41,
963 PREFIX_0F3A42,
964 PREFIX_0F3A44,
965 PREFIX_0F3A60,
966 PREFIX_0F3A61,
967 PREFIX_0F3A62,
968 PREFIX_0F3A63,
969 PREFIX_0F3ACC,
970 PREFIX_0F3ADF,
971 PREFIX_VEX_0F10,
972 PREFIX_VEX_0F11,
973 PREFIX_VEX_0F12,
974 PREFIX_VEX_0F16,
975 PREFIX_VEX_0F2A,
976 PREFIX_VEX_0F2C,
977 PREFIX_VEX_0F2D,
978 PREFIX_VEX_0F2E,
979 PREFIX_VEX_0F2F,
980 PREFIX_VEX_0F41,
981 PREFIX_VEX_0F42,
982 PREFIX_VEX_0F44,
983 PREFIX_VEX_0F45,
984 PREFIX_VEX_0F46,
985 PREFIX_VEX_0F47,
986 PREFIX_VEX_0F4B,
987 PREFIX_VEX_0F51,
988 PREFIX_VEX_0F52,
989 PREFIX_VEX_0F53,
990 PREFIX_VEX_0F58,
991 PREFIX_VEX_0F59,
992 PREFIX_VEX_0F5A,
993 PREFIX_VEX_0F5B,
994 PREFIX_VEX_0F5C,
995 PREFIX_VEX_0F5D,
996 PREFIX_VEX_0F5E,
997 PREFIX_VEX_0F5F,
998 PREFIX_VEX_0F60,
999 PREFIX_VEX_0F61,
1000 PREFIX_VEX_0F62,
1001 PREFIX_VEX_0F63,
1002 PREFIX_VEX_0F64,
1003 PREFIX_VEX_0F65,
1004 PREFIX_VEX_0F66,
1005 PREFIX_VEX_0F67,
1006 PREFIX_VEX_0F68,
1007 PREFIX_VEX_0F69,
1008 PREFIX_VEX_0F6A,
1009 PREFIX_VEX_0F6B,
1010 PREFIX_VEX_0F6C,
1011 PREFIX_VEX_0F6D,
1012 PREFIX_VEX_0F6E,
1013 PREFIX_VEX_0F6F,
1014 PREFIX_VEX_0F70,
1015 PREFIX_VEX_0F71_REG_2,
1016 PREFIX_VEX_0F71_REG_4,
1017 PREFIX_VEX_0F71_REG_6,
1018 PREFIX_VEX_0F72_REG_2,
1019 PREFIX_VEX_0F72_REG_4,
1020 PREFIX_VEX_0F72_REG_6,
1021 PREFIX_VEX_0F73_REG_2,
1022 PREFIX_VEX_0F73_REG_3,
1023 PREFIX_VEX_0F73_REG_6,
1024 PREFIX_VEX_0F73_REG_7,
1025 PREFIX_VEX_0F74,
1026 PREFIX_VEX_0F75,
1027 PREFIX_VEX_0F76,
1028 PREFIX_VEX_0F77,
1029 PREFIX_VEX_0F7C,
1030 PREFIX_VEX_0F7D,
1031 PREFIX_VEX_0F7E,
1032 PREFIX_VEX_0F7F,
1033 PREFIX_VEX_0F90,
1034 PREFIX_VEX_0F91,
1035 PREFIX_VEX_0F92,
1036 PREFIX_VEX_0F93,
1037 PREFIX_VEX_0F98,
1038 PREFIX_VEX_0FC2,
1039 PREFIX_VEX_0FC4,
1040 PREFIX_VEX_0FC5,
1041 PREFIX_VEX_0FD0,
1042 PREFIX_VEX_0FD1,
1043 PREFIX_VEX_0FD2,
1044 PREFIX_VEX_0FD3,
1045 PREFIX_VEX_0FD4,
1046 PREFIX_VEX_0FD5,
1047 PREFIX_VEX_0FD6,
1048 PREFIX_VEX_0FD7,
1049 PREFIX_VEX_0FD8,
1050 PREFIX_VEX_0FD9,
1051 PREFIX_VEX_0FDA,
1052 PREFIX_VEX_0FDB,
1053 PREFIX_VEX_0FDC,
1054 PREFIX_VEX_0FDD,
1055 PREFIX_VEX_0FDE,
1056 PREFIX_VEX_0FDF,
1057 PREFIX_VEX_0FE0,
1058 PREFIX_VEX_0FE1,
1059 PREFIX_VEX_0FE2,
1060 PREFIX_VEX_0FE3,
1061 PREFIX_VEX_0FE4,
1062 PREFIX_VEX_0FE5,
1063 PREFIX_VEX_0FE6,
1064 PREFIX_VEX_0FE7,
1065 PREFIX_VEX_0FE8,
1066 PREFIX_VEX_0FE9,
1067 PREFIX_VEX_0FEA,
1068 PREFIX_VEX_0FEB,
1069 PREFIX_VEX_0FEC,
1070 PREFIX_VEX_0FED,
1071 PREFIX_VEX_0FEE,
1072 PREFIX_VEX_0FEF,
1073 PREFIX_VEX_0FF0,
1074 PREFIX_VEX_0FF1,
1075 PREFIX_VEX_0FF2,
1076 PREFIX_VEX_0FF3,
1077 PREFIX_VEX_0FF4,
1078 PREFIX_VEX_0FF5,
1079 PREFIX_VEX_0FF6,
1080 PREFIX_VEX_0FF7,
1081 PREFIX_VEX_0FF8,
1082 PREFIX_VEX_0FF9,
1083 PREFIX_VEX_0FFA,
1084 PREFIX_VEX_0FFB,
1085 PREFIX_VEX_0FFC,
1086 PREFIX_VEX_0FFD,
1087 PREFIX_VEX_0FFE,
1088 PREFIX_VEX_0F3800,
1089 PREFIX_VEX_0F3801,
1090 PREFIX_VEX_0F3802,
1091 PREFIX_VEX_0F3803,
1092 PREFIX_VEX_0F3804,
1093 PREFIX_VEX_0F3805,
1094 PREFIX_VEX_0F3806,
1095 PREFIX_VEX_0F3807,
1096 PREFIX_VEX_0F3808,
1097 PREFIX_VEX_0F3809,
1098 PREFIX_VEX_0F380A,
1099 PREFIX_VEX_0F380B,
1100 PREFIX_VEX_0F380C,
1101 PREFIX_VEX_0F380D,
1102 PREFIX_VEX_0F380E,
1103 PREFIX_VEX_0F380F,
1104 PREFIX_VEX_0F3813,
1105 PREFIX_VEX_0F3816,
1106 PREFIX_VEX_0F3817,
1107 PREFIX_VEX_0F3818,
1108 PREFIX_VEX_0F3819,
1109 PREFIX_VEX_0F381A,
1110 PREFIX_VEX_0F381C,
1111 PREFIX_VEX_0F381D,
1112 PREFIX_VEX_0F381E,
1113 PREFIX_VEX_0F3820,
1114 PREFIX_VEX_0F3821,
1115 PREFIX_VEX_0F3822,
1116 PREFIX_VEX_0F3823,
1117 PREFIX_VEX_0F3824,
1118 PREFIX_VEX_0F3825,
1119 PREFIX_VEX_0F3828,
1120 PREFIX_VEX_0F3829,
1121 PREFIX_VEX_0F382A,
1122 PREFIX_VEX_0F382B,
1123 PREFIX_VEX_0F382C,
1124 PREFIX_VEX_0F382D,
1125 PREFIX_VEX_0F382E,
1126 PREFIX_VEX_0F382F,
1127 PREFIX_VEX_0F3830,
1128 PREFIX_VEX_0F3831,
1129 PREFIX_VEX_0F3832,
1130 PREFIX_VEX_0F3833,
1131 PREFIX_VEX_0F3834,
1132 PREFIX_VEX_0F3835,
1133 PREFIX_VEX_0F3836,
1134 PREFIX_VEX_0F3837,
1135 PREFIX_VEX_0F3838,
1136 PREFIX_VEX_0F3839,
1137 PREFIX_VEX_0F383A,
1138 PREFIX_VEX_0F383B,
1139 PREFIX_VEX_0F383C,
1140 PREFIX_VEX_0F383D,
1141 PREFIX_VEX_0F383E,
1142 PREFIX_VEX_0F383F,
1143 PREFIX_VEX_0F3840,
1144 PREFIX_VEX_0F3841,
1145 PREFIX_VEX_0F3845,
1146 PREFIX_VEX_0F3846,
1147 PREFIX_VEX_0F3847,
1148 PREFIX_VEX_0F3858,
1149 PREFIX_VEX_0F3859,
1150 PREFIX_VEX_0F385A,
1151 PREFIX_VEX_0F3878,
1152 PREFIX_VEX_0F3879,
1153 PREFIX_VEX_0F388C,
1154 PREFIX_VEX_0F388E,
1155 PREFIX_VEX_0F3890,
1156 PREFIX_VEX_0F3891,
1157 PREFIX_VEX_0F3892,
1158 PREFIX_VEX_0F3893,
1159 PREFIX_VEX_0F3896,
1160 PREFIX_VEX_0F3897,
1161 PREFIX_VEX_0F3898,
1162 PREFIX_VEX_0F3899,
1163 PREFIX_VEX_0F389A,
1164 PREFIX_VEX_0F389B,
1165 PREFIX_VEX_0F389C,
1166 PREFIX_VEX_0F389D,
1167 PREFIX_VEX_0F389E,
1168 PREFIX_VEX_0F389F,
1169 PREFIX_VEX_0F38A6,
1170 PREFIX_VEX_0F38A7,
1171 PREFIX_VEX_0F38A8,
1172 PREFIX_VEX_0F38A9,
1173 PREFIX_VEX_0F38AA,
1174 PREFIX_VEX_0F38AB,
1175 PREFIX_VEX_0F38AC,
1176 PREFIX_VEX_0F38AD,
1177 PREFIX_VEX_0F38AE,
1178 PREFIX_VEX_0F38AF,
1179 PREFIX_VEX_0F38B6,
1180 PREFIX_VEX_0F38B7,
1181 PREFIX_VEX_0F38B8,
1182 PREFIX_VEX_0F38B9,
1183 PREFIX_VEX_0F38BA,
1184 PREFIX_VEX_0F38BB,
1185 PREFIX_VEX_0F38BC,
1186 PREFIX_VEX_0F38BD,
1187 PREFIX_VEX_0F38BE,
1188 PREFIX_VEX_0F38BF,
1189 PREFIX_VEX_0F38DB,
1190 PREFIX_VEX_0F38DC,
1191 PREFIX_VEX_0F38DD,
1192 PREFIX_VEX_0F38DE,
1193 PREFIX_VEX_0F38DF,
1194 PREFIX_VEX_0F38F2,
1195 PREFIX_VEX_0F38F3_REG_1,
1196 PREFIX_VEX_0F38F3_REG_2,
1197 PREFIX_VEX_0F38F3_REG_3,
1198 PREFIX_VEX_0F38F5,
1199 PREFIX_VEX_0F38F6,
1200 PREFIX_VEX_0F38F7,
1201 PREFIX_VEX_0F3A00,
1202 PREFIX_VEX_0F3A01,
1203 PREFIX_VEX_0F3A02,
1204 PREFIX_VEX_0F3A04,
1205 PREFIX_VEX_0F3A05,
1206 PREFIX_VEX_0F3A06,
1207 PREFIX_VEX_0F3A08,
1208 PREFIX_VEX_0F3A09,
1209 PREFIX_VEX_0F3A0A,
1210 PREFIX_VEX_0F3A0B,
1211 PREFIX_VEX_0F3A0C,
1212 PREFIX_VEX_0F3A0D,
1213 PREFIX_VEX_0F3A0E,
1214 PREFIX_VEX_0F3A0F,
1215 PREFIX_VEX_0F3A14,
1216 PREFIX_VEX_0F3A15,
1217 PREFIX_VEX_0F3A16,
1218 PREFIX_VEX_0F3A17,
1219 PREFIX_VEX_0F3A18,
1220 PREFIX_VEX_0F3A19,
1221 PREFIX_VEX_0F3A1D,
1222 PREFIX_VEX_0F3A20,
1223 PREFIX_VEX_0F3A21,
1224 PREFIX_VEX_0F3A22,
1225 PREFIX_VEX_0F3A30,
1226 PREFIX_VEX_0F3A32,
1227 PREFIX_VEX_0F3A38,
1228 PREFIX_VEX_0F3A39,
1229 PREFIX_VEX_0F3A40,
1230 PREFIX_VEX_0F3A41,
1231 PREFIX_VEX_0F3A42,
1232 PREFIX_VEX_0F3A44,
1233 PREFIX_VEX_0F3A46,
1234 PREFIX_VEX_0F3A48,
1235 PREFIX_VEX_0F3A49,
1236 PREFIX_VEX_0F3A4A,
1237 PREFIX_VEX_0F3A4B,
1238 PREFIX_VEX_0F3A4C,
1239 PREFIX_VEX_0F3A5C,
1240 PREFIX_VEX_0F3A5D,
1241 PREFIX_VEX_0F3A5E,
1242 PREFIX_VEX_0F3A5F,
1243 PREFIX_VEX_0F3A60,
1244 PREFIX_VEX_0F3A61,
1245 PREFIX_VEX_0F3A62,
1246 PREFIX_VEX_0F3A63,
1247 PREFIX_VEX_0F3A68,
1248 PREFIX_VEX_0F3A69,
1249 PREFIX_VEX_0F3A6A,
1250 PREFIX_VEX_0F3A6B,
1251 PREFIX_VEX_0F3A6C,
1252 PREFIX_VEX_0F3A6D,
1253 PREFIX_VEX_0F3A6E,
1254 PREFIX_VEX_0F3A6F,
1255 PREFIX_VEX_0F3A78,
1256 PREFIX_VEX_0F3A79,
1257 PREFIX_VEX_0F3A7A,
1258 PREFIX_VEX_0F3A7B,
1259 PREFIX_VEX_0F3A7C,
1260 PREFIX_VEX_0F3A7D,
1261 PREFIX_VEX_0F3A7E,
1262 PREFIX_VEX_0F3A7F,
1263 PREFIX_VEX_0F3ADF,
1264 PREFIX_VEX_0F3AF0,
1265
1266 PREFIX_EVEX_0F10,
1267 PREFIX_EVEX_0F11,
1268 PREFIX_EVEX_0F12,
1269 PREFIX_EVEX_0F13,
1270 PREFIX_EVEX_0F14,
1271 PREFIX_EVEX_0F15,
1272 PREFIX_EVEX_0F16,
1273 PREFIX_EVEX_0F17,
1274 PREFIX_EVEX_0F28,
1275 PREFIX_EVEX_0F29,
1276 PREFIX_EVEX_0F2A,
1277 PREFIX_EVEX_0F2B,
1278 PREFIX_EVEX_0F2C,
1279 PREFIX_EVEX_0F2D,
1280 PREFIX_EVEX_0F2E,
1281 PREFIX_EVEX_0F2F,
1282 PREFIX_EVEX_0F51,
1283 PREFIX_EVEX_0F58,
1284 PREFIX_EVEX_0F59,
1285 PREFIX_EVEX_0F5A,
1286 PREFIX_EVEX_0F5B,
1287 PREFIX_EVEX_0F5C,
1288 PREFIX_EVEX_0F5D,
1289 PREFIX_EVEX_0F5E,
1290 PREFIX_EVEX_0F5F,
1291 PREFIX_EVEX_0F62,
1292 PREFIX_EVEX_0F66,
1293 PREFIX_EVEX_0F6A,
1294 PREFIX_EVEX_0F6C,
1295 PREFIX_EVEX_0F6D,
1296 PREFIX_EVEX_0F6E,
1297 PREFIX_EVEX_0F6F,
1298 PREFIX_EVEX_0F70,
1299 PREFIX_EVEX_0F72_REG_0,
1300 PREFIX_EVEX_0F72_REG_1,
1301 PREFIX_EVEX_0F72_REG_2,
1302 PREFIX_EVEX_0F72_REG_4,
1303 PREFIX_EVEX_0F72_REG_6,
1304 PREFIX_EVEX_0F73_REG_2,
1305 PREFIX_EVEX_0F73_REG_6,
1306 PREFIX_EVEX_0F76,
1307 PREFIX_EVEX_0F78,
1308 PREFIX_EVEX_0F79,
1309 PREFIX_EVEX_0F7A,
1310 PREFIX_EVEX_0F7B,
1311 PREFIX_EVEX_0F7E,
1312 PREFIX_EVEX_0F7F,
1313 PREFIX_EVEX_0FC2,
1314 PREFIX_EVEX_0FC6,
1315 PREFIX_EVEX_0FD2,
1316 PREFIX_EVEX_0FD3,
1317 PREFIX_EVEX_0FD4,
1318 PREFIX_EVEX_0FD6,
1319 PREFIX_EVEX_0FDB,
1320 PREFIX_EVEX_0FDF,
1321 PREFIX_EVEX_0FE2,
1322 PREFIX_EVEX_0FE6,
1323 PREFIX_EVEX_0FE7,
1324 PREFIX_EVEX_0FEB,
1325 PREFIX_EVEX_0FEF,
1326 PREFIX_EVEX_0FF2,
1327 PREFIX_EVEX_0FF3,
1328 PREFIX_EVEX_0FF4,
1329 PREFIX_EVEX_0FFA,
1330 PREFIX_EVEX_0FFB,
1331 PREFIX_EVEX_0FFE,
1332 PREFIX_EVEX_0F380C,
1333 PREFIX_EVEX_0F380D,
1334 PREFIX_EVEX_0F3811,
1335 PREFIX_EVEX_0F3812,
1336 PREFIX_EVEX_0F3813,
1337 PREFIX_EVEX_0F3814,
1338 PREFIX_EVEX_0F3815,
1339 PREFIX_EVEX_0F3816,
1340 PREFIX_EVEX_0F3818,
1341 PREFIX_EVEX_0F3819,
1342 PREFIX_EVEX_0F381A,
1343 PREFIX_EVEX_0F381B,
1344 PREFIX_EVEX_0F381E,
1345 PREFIX_EVEX_0F381F,
1346 PREFIX_EVEX_0F3821,
1347 PREFIX_EVEX_0F3822,
1348 PREFIX_EVEX_0F3823,
1349 PREFIX_EVEX_0F3824,
1350 PREFIX_EVEX_0F3825,
1351 PREFIX_EVEX_0F3827,
1352 PREFIX_EVEX_0F3828,
1353 PREFIX_EVEX_0F3829,
1354 PREFIX_EVEX_0F382A,
1355 PREFIX_EVEX_0F382C,
1356 PREFIX_EVEX_0F382D,
1357 PREFIX_EVEX_0F3831,
1358 PREFIX_EVEX_0F3832,
1359 PREFIX_EVEX_0F3833,
1360 PREFIX_EVEX_0F3834,
1361 PREFIX_EVEX_0F3835,
1362 PREFIX_EVEX_0F3836,
1363 PREFIX_EVEX_0F3837,
1364 PREFIX_EVEX_0F3839,
1365 PREFIX_EVEX_0F383A,
1366 PREFIX_EVEX_0F383B,
1367 PREFIX_EVEX_0F383D,
1368 PREFIX_EVEX_0F383F,
1369 PREFIX_EVEX_0F3840,
1370 PREFIX_EVEX_0F3842,
1371 PREFIX_EVEX_0F3843,
1372 PREFIX_EVEX_0F3844,
1373 PREFIX_EVEX_0F3845,
1374 PREFIX_EVEX_0F3846,
1375 PREFIX_EVEX_0F3847,
1376 PREFIX_EVEX_0F384C,
1377 PREFIX_EVEX_0F384D,
1378 PREFIX_EVEX_0F384E,
1379 PREFIX_EVEX_0F384F,
1380 PREFIX_EVEX_0F3858,
1381 PREFIX_EVEX_0F3859,
1382 PREFIX_EVEX_0F385A,
1383 PREFIX_EVEX_0F385B,
1384 PREFIX_EVEX_0F3864,
1385 PREFIX_EVEX_0F3865,
1386 PREFIX_EVEX_0F3876,
1387 PREFIX_EVEX_0F3877,
1388 PREFIX_EVEX_0F387C,
1389 PREFIX_EVEX_0F387E,
1390 PREFIX_EVEX_0F387F,
1391 PREFIX_EVEX_0F3888,
1392 PREFIX_EVEX_0F3889,
1393 PREFIX_EVEX_0F388A,
1394 PREFIX_EVEX_0F388B,
1395 PREFIX_EVEX_0F3890,
1396 PREFIX_EVEX_0F3891,
1397 PREFIX_EVEX_0F3892,
1398 PREFIX_EVEX_0F3893,
1399 PREFIX_EVEX_0F3896,
1400 PREFIX_EVEX_0F3897,
1401 PREFIX_EVEX_0F3898,
1402 PREFIX_EVEX_0F3899,
1403 PREFIX_EVEX_0F389A,
1404 PREFIX_EVEX_0F389B,
1405 PREFIX_EVEX_0F389C,
1406 PREFIX_EVEX_0F389D,
1407 PREFIX_EVEX_0F389E,
1408 PREFIX_EVEX_0F389F,
1409 PREFIX_EVEX_0F38A0,
1410 PREFIX_EVEX_0F38A1,
1411 PREFIX_EVEX_0F38A2,
1412 PREFIX_EVEX_0F38A3,
1413 PREFIX_EVEX_0F38A6,
1414 PREFIX_EVEX_0F38A7,
1415 PREFIX_EVEX_0F38A8,
1416 PREFIX_EVEX_0F38A9,
1417 PREFIX_EVEX_0F38AA,
1418 PREFIX_EVEX_0F38AB,
1419 PREFIX_EVEX_0F38AC,
1420 PREFIX_EVEX_0F38AD,
1421 PREFIX_EVEX_0F38AE,
1422 PREFIX_EVEX_0F38AF,
1423 PREFIX_EVEX_0F38B6,
1424 PREFIX_EVEX_0F38B7,
1425 PREFIX_EVEX_0F38B8,
1426 PREFIX_EVEX_0F38B9,
1427 PREFIX_EVEX_0F38BA,
1428 PREFIX_EVEX_0F38BB,
1429 PREFIX_EVEX_0F38BC,
1430 PREFIX_EVEX_0F38BD,
1431 PREFIX_EVEX_0F38BE,
1432 PREFIX_EVEX_0F38BF,
1433 PREFIX_EVEX_0F38C4,
1434 PREFIX_EVEX_0F38C6_REG_1,
1435 PREFIX_EVEX_0F38C6_REG_2,
1436 PREFIX_EVEX_0F38C6_REG_5,
1437 PREFIX_EVEX_0F38C6_REG_6,
1438 PREFIX_EVEX_0F38C7_REG_1,
1439 PREFIX_EVEX_0F38C7_REG_2,
1440 PREFIX_EVEX_0F38C7_REG_5,
1441 PREFIX_EVEX_0F38C7_REG_6,
1442 PREFIX_EVEX_0F38C8,
1443 PREFIX_EVEX_0F38CA,
1444 PREFIX_EVEX_0F38CB,
1445 PREFIX_EVEX_0F38CC,
1446 PREFIX_EVEX_0F38CD,
1447
1448 PREFIX_EVEX_0F3A00,
1449 PREFIX_EVEX_0F3A01,
1450 PREFIX_EVEX_0F3A03,
1451 PREFIX_EVEX_0F3A04,
1452 PREFIX_EVEX_0F3A05,
1453 PREFIX_EVEX_0F3A08,
1454 PREFIX_EVEX_0F3A09,
1455 PREFIX_EVEX_0F3A0A,
1456 PREFIX_EVEX_0F3A0B,
1457 PREFIX_EVEX_0F3A17,
1458 PREFIX_EVEX_0F3A18,
1459 PREFIX_EVEX_0F3A19,
1460 PREFIX_EVEX_0F3A1A,
1461 PREFIX_EVEX_0F3A1B,
1462 PREFIX_EVEX_0F3A1D,
1463 PREFIX_EVEX_0F3A1E,
1464 PREFIX_EVEX_0F3A1F,
1465 PREFIX_EVEX_0F3A21,
1466 PREFIX_EVEX_0F3A23,
1467 PREFIX_EVEX_0F3A25,
1468 PREFIX_EVEX_0F3A26,
1469 PREFIX_EVEX_0F3A27,
1470 PREFIX_EVEX_0F3A38,
1471 PREFIX_EVEX_0F3A39,
1472 PREFIX_EVEX_0F3A3A,
1473 PREFIX_EVEX_0F3A3B,
1474 PREFIX_EVEX_0F3A43,
1475 PREFIX_EVEX_0F3A54,
1476 PREFIX_EVEX_0F3A55,
1477 };
1478
1479 enum
1480 {
1481 X86_64_06 = 0,
1482 X86_64_07,
1483 X86_64_0D,
1484 X86_64_16,
1485 X86_64_17,
1486 X86_64_1E,
1487 X86_64_1F,
1488 X86_64_27,
1489 X86_64_2F,
1490 X86_64_37,
1491 X86_64_3F,
1492 X86_64_60,
1493 X86_64_61,
1494 X86_64_62,
1495 X86_64_63,
1496 X86_64_6D,
1497 X86_64_6F,
1498 X86_64_9A,
1499 X86_64_C4,
1500 X86_64_C5,
1501 X86_64_CE,
1502 X86_64_D4,
1503 X86_64_D5,
1504 X86_64_EA,
1505 X86_64_0F01_REG_0,
1506 X86_64_0F01_REG_1,
1507 X86_64_0F01_REG_2,
1508 X86_64_0F01_REG_3
1509 };
1510
1511 enum
1512 {
1513 THREE_BYTE_0F38 = 0,
1514 THREE_BYTE_0F3A,
1515 THREE_BYTE_0F7A
1516 };
1517
1518 enum
1519 {
1520 XOP_08 = 0,
1521 XOP_09,
1522 XOP_0A
1523 };
1524
1525 enum
1526 {
1527 VEX_0F = 0,
1528 VEX_0F38,
1529 VEX_0F3A
1530 };
1531
1532 enum
1533 {
1534 EVEX_0F = 0,
1535 EVEX_0F38,
1536 EVEX_0F3A
1537 };
1538
1539 enum
1540 {
1541 VEX_LEN_0F10_P_1 = 0,
1542 VEX_LEN_0F10_P_3,
1543 VEX_LEN_0F11_P_1,
1544 VEX_LEN_0F11_P_3,
1545 VEX_LEN_0F12_P_0_M_0,
1546 VEX_LEN_0F12_P_0_M_1,
1547 VEX_LEN_0F12_P_2,
1548 VEX_LEN_0F13_M_0,
1549 VEX_LEN_0F16_P_0_M_0,
1550 VEX_LEN_0F16_P_0_M_1,
1551 VEX_LEN_0F16_P_2,
1552 VEX_LEN_0F17_M_0,
1553 VEX_LEN_0F2A_P_1,
1554 VEX_LEN_0F2A_P_3,
1555 VEX_LEN_0F2C_P_1,
1556 VEX_LEN_0F2C_P_3,
1557 VEX_LEN_0F2D_P_1,
1558 VEX_LEN_0F2D_P_3,
1559 VEX_LEN_0F2E_P_0,
1560 VEX_LEN_0F2E_P_2,
1561 VEX_LEN_0F2F_P_0,
1562 VEX_LEN_0F2F_P_2,
1563 VEX_LEN_0F41_P_0,
1564 VEX_LEN_0F42_P_0,
1565 VEX_LEN_0F44_P_0,
1566 VEX_LEN_0F45_P_0,
1567 VEX_LEN_0F46_P_0,
1568 VEX_LEN_0F47_P_0,
1569 VEX_LEN_0F4B_P_2,
1570 VEX_LEN_0F51_P_1,
1571 VEX_LEN_0F51_P_3,
1572 VEX_LEN_0F52_P_1,
1573 VEX_LEN_0F53_P_1,
1574 VEX_LEN_0F58_P_1,
1575 VEX_LEN_0F58_P_3,
1576 VEX_LEN_0F59_P_1,
1577 VEX_LEN_0F59_P_3,
1578 VEX_LEN_0F5A_P_1,
1579 VEX_LEN_0F5A_P_3,
1580 VEX_LEN_0F5C_P_1,
1581 VEX_LEN_0F5C_P_3,
1582 VEX_LEN_0F5D_P_1,
1583 VEX_LEN_0F5D_P_3,
1584 VEX_LEN_0F5E_P_1,
1585 VEX_LEN_0F5E_P_3,
1586 VEX_LEN_0F5F_P_1,
1587 VEX_LEN_0F5F_P_3,
1588 VEX_LEN_0F6E_P_2,
1589 VEX_LEN_0F7E_P_1,
1590 VEX_LEN_0F7E_P_2,
1591 VEX_LEN_0F90_P_0,
1592 VEX_LEN_0F91_P_0,
1593 VEX_LEN_0F92_P_0,
1594 VEX_LEN_0F93_P_0,
1595 VEX_LEN_0F98_P_0,
1596 VEX_LEN_0FAE_R_2_M_0,
1597 VEX_LEN_0FAE_R_3_M_0,
1598 VEX_LEN_0FC2_P_1,
1599 VEX_LEN_0FC2_P_3,
1600 VEX_LEN_0FC4_P_2,
1601 VEX_LEN_0FC5_P_2,
1602 VEX_LEN_0FD6_P_2,
1603 VEX_LEN_0FF7_P_2,
1604 VEX_LEN_0F3816_P_2,
1605 VEX_LEN_0F3819_P_2,
1606 VEX_LEN_0F381A_P_2_M_0,
1607 VEX_LEN_0F3836_P_2,
1608 VEX_LEN_0F3841_P_2,
1609 VEX_LEN_0F385A_P_2_M_0,
1610 VEX_LEN_0F38DB_P_2,
1611 VEX_LEN_0F38DC_P_2,
1612 VEX_LEN_0F38DD_P_2,
1613 VEX_LEN_0F38DE_P_2,
1614 VEX_LEN_0F38DF_P_2,
1615 VEX_LEN_0F38F2_P_0,
1616 VEX_LEN_0F38F3_R_1_P_0,
1617 VEX_LEN_0F38F3_R_2_P_0,
1618 VEX_LEN_0F38F3_R_3_P_0,
1619 VEX_LEN_0F38F5_P_0,
1620 VEX_LEN_0F38F5_P_1,
1621 VEX_LEN_0F38F5_P_3,
1622 VEX_LEN_0F38F6_P_3,
1623 VEX_LEN_0F38F7_P_0,
1624 VEX_LEN_0F38F7_P_1,
1625 VEX_LEN_0F38F7_P_2,
1626 VEX_LEN_0F38F7_P_3,
1627 VEX_LEN_0F3A00_P_2,
1628 VEX_LEN_0F3A01_P_2,
1629 VEX_LEN_0F3A06_P_2,
1630 VEX_LEN_0F3A0A_P_2,
1631 VEX_LEN_0F3A0B_P_2,
1632 VEX_LEN_0F3A14_P_2,
1633 VEX_LEN_0F3A15_P_2,
1634 VEX_LEN_0F3A16_P_2,
1635 VEX_LEN_0F3A17_P_2,
1636 VEX_LEN_0F3A18_P_2,
1637 VEX_LEN_0F3A19_P_2,
1638 VEX_LEN_0F3A20_P_2,
1639 VEX_LEN_0F3A21_P_2,
1640 VEX_LEN_0F3A22_P_2,
1641 VEX_LEN_0F3A30_P_2,
1642 VEX_LEN_0F3A32_P_2,
1643 VEX_LEN_0F3A38_P_2,
1644 VEX_LEN_0F3A39_P_2,
1645 VEX_LEN_0F3A41_P_2,
1646 VEX_LEN_0F3A44_P_2,
1647 VEX_LEN_0F3A46_P_2,
1648 VEX_LEN_0F3A60_P_2,
1649 VEX_LEN_0F3A61_P_2,
1650 VEX_LEN_0F3A62_P_2,
1651 VEX_LEN_0F3A63_P_2,
1652 VEX_LEN_0F3A6A_P_2,
1653 VEX_LEN_0F3A6B_P_2,
1654 VEX_LEN_0F3A6E_P_2,
1655 VEX_LEN_0F3A6F_P_2,
1656 VEX_LEN_0F3A7A_P_2,
1657 VEX_LEN_0F3A7B_P_2,
1658 VEX_LEN_0F3A7E_P_2,
1659 VEX_LEN_0F3A7F_P_2,
1660 VEX_LEN_0F3ADF_P_2,
1661 VEX_LEN_0F3AF0_P_3,
1662 VEX_LEN_0FXOP_08_CC,
1663 VEX_LEN_0FXOP_08_CD,
1664 VEX_LEN_0FXOP_08_CE,
1665 VEX_LEN_0FXOP_08_CF,
1666 VEX_LEN_0FXOP_08_EC,
1667 VEX_LEN_0FXOP_08_ED,
1668 VEX_LEN_0FXOP_08_EE,
1669 VEX_LEN_0FXOP_08_EF,
1670 VEX_LEN_0FXOP_09_80,
1671 VEX_LEN_0FXOP_09_81
1672 };
1673
1674 enum
1675 {
1676 VEX_W_0F10_P_0 = 0,
1677 VEX_W_0F10_P_1,
1678 VEX_W_0F10_P_2,
1679 VEX_W_0F10_P_3,
1680 VEX_W_0F11_P_0,
1681 VEX_W_0F11_P_1,
1682 VEX_W_0F11_P_2,
1683 VEX_W_0F11_P_3,
1684 VEX_W_0F12_P_0_M_0,
1685 VEX_W_0F12_P_0_M_1,
1686 VEX_W_0F12_P_1,
1687 VEX_W_0F12_P_2,
1688 VEX_W_0F12_P_3,
1689 VEX_W_0F13_M_0,
1690 VEX_W_0F14,
1691 VEX_W_0F15,
1692 VEX_W_0F16_P_0_M_0,
1693 VEX_W_0F16_P_0_M_1,
1694 VEX_W_0F16_P_1,
1695 VEX_W_0F16_P_2,
1696 VEX_W_0F17_M_0,
1697 VEX_W_0F28,
1698 VEX_W_0F29,
1699 VEX_W_0F2B_M_0,
1700 VEX_W_0F2E_P_0,
1701 VEX_W_0F2E_P_2,
1702 VEX_W_0F2F_P_0,
1703 VEX_W_0F2F_P_2,
1704 VEX_W_0F41_P_0_LEN_1,
1705 VEX_W_0F42_P_0_LEN_1,
1706 VEX_W_0F44_P_0_LEN_0,
1707 VEX_W_0F45_P_0_LEN_1,
1708 VEX_W_0F46_P_0_LEN_1,
1709 VEX_W_0F47_P_0_LEN_1,
1710 VEX_W_0F4B_P_2_LEN_1,
1711 VEX_W_0F50_M_0,
1712 VEX_W_0F51_P_0,
1713 VEX_W_0F51_P_1,
1714 VEX_W_0F51_P_2,
1715 VEX_W_0F51_P_3,
1716 VEX_W_0F52_P_0,
1717 VEX_W_0F52_P_1,
1718 VEX_W_0F53_P_0,
1719 VEX_W_0F53_P_1,
1720 VEX_W_0F58_P_0,
1721 VEX_W_0F58_P_1,
1722 VEX_W_0F58_P_2,
1723 VEX_W_0F58_P_3,
1724 VEX_W_0F59_P_0,
1725 VEX_W_0F59_P_1,
1726 VEX_W_0F59_P_2,
1727 VEX_W_0F59_P_3,
1728 VEX_W_0F5A_P_0,
1729 VEX_W_0F5A_P_1,
1730 VEX_W_0F5A_P_3,
1731 VEX_W_0F5B_P_0,
1732 VEX_W_0F5B_P_1,
1733 VEX_W_0F5B_P_2,
1734 VEX_W_0F5C_P_0,
1735 VEX_W_0F5C_P_1,
1736 VEX_W_0F5C_P_2,
1737 VEX_W_0F5C_P_3,
1738 VEX_W_0F5D_P_0,
1739 VEX_W_0F5D_P_1,
1740 VEX_W_0F5D_P_2,
1741 VEX_W_0F5D_P_3,
1742 VEX_W_0F5E_P_0,
1743 VEX_W_0F5E_P_1,
1744 VEX_W_0F5E_P_2,
1745 VEX_W_0F5E_P_3,
1746 VEX_W_0F5F_P_0,
1747 VEX_W_0F5F_P_1,
1748 VEX_W_0F5F_P_2,
1749 VEX_W_0F5F_P_3,
1750 VEX_W_0F60_P_2,
1751 VEX_W_0F61_P_2,
1752 VEX_W_0F62_P_2,
1753 VEX_W_0F63_P_2,
1754 VEX_W_0F64_P_2,
1755 VEX_W_0F65_P_2,
1756 VEX_W_0F66_P_2,
1757 VEX_W_0F67_P_2,
1758 VEX_W_0F68_P_2,
1759 VEX_W_0F69_P_2,
1760 VEX_W_0F6A_P_2,
1761 VEX_W_0F6B_P_2,
1762 VEX_W_0F6C_P_2,
1763 VEX_W_0F6D_P_2,
1764 VEX_W_0F6F_P_1,
1765 VEX_W_0F6F_P_2,
1766 VEX_W_0F70_P_1,
1767 VEX_W_0F70_P_2,
1768 VEX_W_0F70_P_3,
1769 VEX_W_0F71_R_2_P_2,
1770 VEX_W_0F71_R_4_P_2,
1771 VEX_W_0F71_R_6_P_2,
1772 VEX_W_0F72_R_2_P_2,
1773 VEX_W_0F72_R_4_P_2,
1774 VEX_W_0F72_R_6_P_2,
1775 VEX_W_0F73_R_2_P_2,
1776 VEX_W_0F73_R_3_P_2,
1777 VEX_W_0F73_R_6_P_2,
1778 VEX_W_0F73_R_7_P_2,
1779 VEX_W_0F74_P_2,
1780 VEX_W_0F75_P_2,
1781 VEX_W_0F76_P_2,
1782 VEX_W_0F77_P_0,
1783 VEX_W_0F7C_P_2,
1784 VEX_W_0F7C_P_3,
1785 VEX_W_0F7D_P_2,
1786 VEX_W_0F7D_P_3,
1787 VEX_W_0F7E_P_1,
1788 VEX_W_0F7F_P_1,
1789 VEX_W_0F7F_P_2,
1790 VEX_W_0F90_P_0_LEN_0,
1791 VEX_W_0F91_P_0_LEN_0,
1792 VEX_W_0F92_P_0_LEN_0,
1793 VEX_W_0F93_P_0_LEN_0,
1794 VEX_W_0F98_P_0_LEN_0,
1795 VEX_W_0FAE_R_2_M_0,
1796 VEX_W_0FAE_R_3_M_0,
1797 VEX_W_0FC2_P_0,
1798 VEX_W_0FC2_P_1,
1799 VEX_W_0FC2_P_2,
1800 VEX_W_0FC2_P_3,
1801 VEX_W_0FC4_P_2,
1802 VEX_W_0FC5_P_2,
1803 VEX_W_0FD0_P_2,
1804 VEX_W_0FD0_P_3,
1805 VEX_W_0FD1_P_2,
1806 VEX_W_0FD2_P_2,
1807 VEX_W_0FD3_P_2,
1808 VEX_W_0FD4_P_2,
1809 VEX_W_0FD5_P_2,
1810 VEX_W_0FD6_P_2,
1811 VEX_W_0FD7_P_2_M_1,
1812 VEX_W_0FD8_P_2,
1813 VEX_W_0FD9_P_2,
1814 VEX_W_0FDA_P_2,
1815 VEX_W_0FDB_P_2,
1816 VEX_W_0FDC_P_2,
1817 VEX_W_0FDD_P_2,
1818 VEX_W_0FDE_P_2,
1819 VEX_W_0FDF_P_2,
1820 VEX_W_0FE0_P_2,
1821 VEX_W_0FE1_P_2,
1822 VEX_W_0FE2_P_2,
1823 VEX_W_0FE3_P_2,
1824 VEX_W_0FE4_P_2,
1825 VEX_W_0FE5_P_2,
1826 VEX_W_0FE6_P_1,
1827 VEX_W_0FE6_P_2,
1828 VEX_W_0FE6_P_3,
1829 VEX_W_0FE7_P_2_M_0,
1830 VEX_W_0FE8_P_2,
1831 VEX_W_0FE9_P_2,
1832 VEX_W_0FEA_P_2,
1833 VEX_W_0FEB_P_2,
1834 VEX_W_0FEC_P_2,
1835 VEX_W_0FED_P_2,
1836 VEX_W_0FEE_P_2,
1837 VEX_W_0FEF_P_2,
1838 VEX_W_0FF0_P_3_M_0,
1839 VEX_W_0FF1_P_2,
1840 VEX_W_0FF2_P_2,
1841 VEX_W_0FF3_P_2,
1842 VEX_W_0FF4_P_2,
1843 VEX_W_0FF5_P_2,
1844 VEX_W_0FF6_P_2,
1845 VEX_W_0FF7_P_2,
1846 VEX_W_0FF8_P_2,
1847 VEX_W_0FF9_P_2,
1848 VEX_W_0FFA_P_2,
1849 VEX_W_0FFB_P_2,
1850 VEX_W_0FFC_P_2,
1851 VEX_W_0FFD_P_2,
1852 VEX_W_0FFE_P_2,
1853 VEX_W_0F3800_P_2,
1854 VEX_W_0F3801_P_2,
1855 VEX_W_0F3802_P_2,
1856 VEX_W_0F3803_P_2,
1857 VEX_W_0F3804_P_2,
1858 VEX_W_0F3805_P_2,
1859 VEX_W_0F3806_P_2,
1860 VEX_W_0F3807_P_2,
1861 VEX_W_0F3808_P_2,
1862 VEX_W_0F3809_P_2,
1863 VEX_W_0F380A_P_2,
1864 VEX_W_0F380B_P_2,
1865 VEX_W_0F380C_P_2,
1866 VEX_W_0F380D_P_2,
1867 VEX_W_0F380E_P_2,
1868 VEX_W_0F380F_P_2,
1869 VEX_W_0F3816_P_2,
1870 VEX_W_0F3817_P_2,
1871 VEX_W_0F3818_P_2,
1872 VEX_W_0F3819_P_2,
1873 VEX_W_0F381A_P_2_M_0,
1874 VEX_W_0F381C_P_2,
1875 VEX_W_0F381D_P_2,
1876 VEX_W_0F381E_P_2,
1877 VEX_W_0F3820_P_2,
1878 VEX_W_0F3821_P_2,
1879 VEX_W_0F3822_P_2,
1880 VEX_W_0F3823_P_2,
1881 VEX_W_0F3824_P_2,
1882 VEX_W_0F3825_P_2,
1883 VEX_W_0F3828_P_2,
1884 VEX_W_0F3829_P_2,
1885 VEX_W_0F382A_P_2_M_0,
1886 VEX_W_0F382B_P_2,
1887 VEX_W_0F382C_P_2_M_0,
1888 VEX_W_0F382D_P_2_M_0,
1889 VEX_W_0F382E_P_2_M_0,
1890 VEX_W_0F382F_P_2_M_0,
1891 VEX_W_0F3830_P_2,
1892 VEX_W_0F3831_P_2,
1893 VEX_W_0F3832_P_2,
1894 VEX_W_0F3833_P_2,
1895 VEX_W_0F3834_P_2,
1896 VEX_W_0F3835_P_2,
1897 VEX_W_0F3836_P_2,
1898 VEX_W_0F3837_P_2,
1899 VEX_W_0F3838_P_2,
1900 VEX_W_0F3839_P_2,
1901 VEX_W_0F383A_P_2,
1902 VEX_W_0F383B_P_2,
1903 VEX_W_0F383C_P_2,
1904 VEX_W_0F383D_P_2,
1905 VEX_W_0F383E_P_2,
1906 VEX_W_0F383F_P_2,
1907 VEX_W_0F3840_P_2,
1908 VEX_W_0F3841_P_2,
1909 VEX_W_0F3846_P_2,
1910 VEX_W_0F3858_P_2,
1911 VEX_W_0F3859_P_2,
1912 VEX_W_0F385A_P_2_M_0,
1913 VEX_W_0F3878_P_2,
1914 VEX_W_0F3879_P_2,
1915 VEX_W_0F38DB_P_2,
1916 VEX_W_0F38DC_P_2,
1917 VEX_W_0F38DD_P_2,
1918 VEX_W_0F38DE_P_2,
1919 VEX_W_0F38DF_P_2,
1920 VEX_W_0F3A00_P_2,
1921 VEX_W_0F3A01_P_2,
1922 VEX_W_0F3A02_P_2,
1923 VEX_W_0F3A04_P_2,
1924 VEX_W_0F3A05_P_2,
1925 VEX_W_0F3A06_P_2,
1926 VEX_W_0F3A08_P_2,
1927 VEX_W_0F3A09_P_2,
1928 VEX_W_0F3A0A_P_2,
1929 VEX_W_0F3A0B_P_2,
1930 VEX_W_0F3A0C_P_2,
1931 VEX_W_0F3A0D_P_2,
1932 VEX_W_0F3A0E_P_2,
1933 VEX_W_0F3A0F_P_2,
1934 VEX_W_0F3A14_P_2,
1935 VEX_W_0F3A15_P_2,
1936 VEX_W_0F3A18_P_2,
1937 VEX_W_0F3A19_P_2,
1938 VEX_W_0F3A20_P_2,
1939 VEX_W_0F3A21_P_2,
1940 VEX_W_0F3A30_P_2_LEN_0,
1941 VEX_W_0F3A32_P_2_LEN_0,
1942 VEX_W_0F3A38_P_2,
1943 VEX_W_0F3A39_P_2,
1944 VEX_W_0F3A40_P_2,
1945 VEX_W_0F3A41_P_2,
1946 VEX_W_0F3A42_P_2,
1947 VEX_W_0F3A44_P_2,
1948 VEX_W_0F3A46_P_2,
1949 VEX_W_0F3A48_P_2,
1950 VEX_W_0F3A49_P_2,
1951 VEX_W_0F3A4A_P_2,
1952 VEX_W_0F3A4B_P_2,
1953 VEX_W_0F3A4C_P_2,
1954 VEX_W_0F3A60_P_2,
1955 VEX_W_0F3A61_P_2,
1956 VEX_W_0F3A62_P_2,
1957 VEX_W_0F3A63_P_2,
1958 VEX_W_0F3ADF_P_2,
1959
1960 EVEX_W_0F10_P_0,
1961 EVEX_W_0F10_P_1_M_0,
1962 EVEX_W_0F10_P_1_M_1,
1963 EVEX_W_0F10_P_2,
1964 EVEX_W_0F10_P_3_M_0,
1965 EVEX_W_0F10_P_3_M_1,
1966 EVEX_W_0F11_P_0,
1967 EVEX_W_0F11_P_1_M_0,
1968 EVEX_W_0F11_P_1_M_1,
1969 EVEX_W_0F11_P_2,
1970 EVEX_W_0F11_P_3_M_0,
1971 EVEX_W_0F11_P_3_M_1,
1972 EVEX_W_0F12_P_0_M_0,
1973 EVEX_W_0F12_P_0_M_1,
1974 EVEX_W_0F12_P_1,
1975 EVEX_W_0F12_P_2,
1976 EVEX_W_0F12_P_3,
1977 EVEX_W_0F13_P_0,
1978 EVEX_W_0F13_P_2,
1979 EVEX_W_0F14_P_0,
1980 EVEX_W_0F14_P_2,
1981 EVEX_W_0F15_P_0,
1982 EVEX_W_0F15_P_2,
1983 EVEX_W_0F16_P_0_M_0,
1984 EVEX_W_0F16_P_0_M_1,
1985 EVEX_W_0F16_P_1,
1986 EVEX_W_0F16_P_2,
1987 EVEX_W_0F17_P_0,
1988 EVEX_W_0F17_P_2,
1989 EVEX_W_0F28_P_0,
1990 EVEX_W_0F28_P_2,
1991 EVEX_W_0F29_P_0,
1992 EVEX_W_0F29_P_2,
1993 EVEX_W_0F2A_P_1,
1994 EVEX_W_0F2A_P_3,
1995 EVEX_W_0F2B_P_0,
1996 EVEX_W_0F2B_P_2,
1997 EVEX_W_0F2E_P_0,
1998 EVEX_W_0F2E_P_2,
1999 EVEX_W_0F2F_P_0,
2000 EVEX_W_0F2F_P_2,
2001 EVEX_W_0F51_P_0,
2002 EVEX_W_0F51_P_1,
2003 EVEX_W_0F51_P_2,
2004 EVEX_W_0F51_P_3,
2005 EVEX_W_0F58_P_0,
2006 EVEX_W_0F58_P_1,
2007 EVEX_W_0F58_P_2,
2008 EVEX_W_0F58_P_3,
2009 EVEX_W_0F59_P_0,
2010 EVEX_W_0F59_P_1,
2011 EVEX_W_0F59_P_2,
2012 EVEX_W_0F59_P_3,
2013 EVEX_W_0F5A_P_0,
2014 EVEX_W_0F5A_P_1,
2015 EVEX_W_0F5A_P_2,
2016 EVEX_W_0F5A_P_3,
2017 EVEX_W_0F5B_P_0,
2018 EVEX_W_0F5B_P_1,
2019 EVEX_W_0F5B_P_2,
2020 EVEX_W_0F5C_P_0,
2021 EVEX_W_0F5C_P_1,
2022 EVEX_W_0F5C_P_2,
2023 EVEX_W_0F5C_P_3,
2024 EVEX_W_0F5D_P_0,
2025 EVEX_W_0F5D_P_1,
2026 EVEX_W_0F5D_P_2,
2027 EVEX_W_0F5D_P_3,
2028 EVEX_W_0F5E_P_0,
2029 EVEX_W_0F5E_P_1,
2030 EVEX_W_0F5E_P_2,
2031 EVEX_W_0F5E_P_3,
2032 EVEX_W_0F5F_P_0,
2033 EVEX_W_0F5F_P_1,
2034 EVEX_W_0F5F_P_2,
2035 EVEX_W_0F5F_P_3,
2036 EVEX_W_0F62_P_2,
2037 EVEX_W_0F66_P_2,
2038 EVEX_W_0F6A_P_2,
2039 EVEX_W_0F6C_P_2,
2040 EVEX_W_0F6D_P_2,
2041 EVEX_W_0F6E_P_2,
2042 EVEX_W_0F6F_P_1,
2043 EVEX_W_0F6F_P_2,
2044 EVEX_W_0F70_P_2,
2045 EVEX_W_0F72_R_2_P_2,
2046 EVEX_W_0F72_R_6_P_2,
2047 EVEX_W_0F73_R_2_P_2,
2048 EVEX_W_0F73_R_6_P_2,
2049 EVEX_W_0F76_P_2,
2050 EVEX_W_0F78_P_0,
2051 EVEX_W_0F79_P_0,
2052 EVEX_W_0F7A_P_1,
2053 EVEX_W_0F7A_P_3,
2054 EVEX_W_0F7B_P_1,
2055 EVEX_W_0F7B_P_3,
2056 EVEX_W_0F7E_P_1,
2057 EVEX_W_0F7E_P_2,
2058 EVEX_W_0F7F_P_1,
2059 EVEX_W_0F7F_P_2,
2060 EVEX_W_0FC2_P_0,
2061 EVEX_W_0FC2_P_1,
2062 EVEX_W_0FC2_P_2,
2063 EVEX_W_0FC2_P_3,
2064 EVEX_W_0FC6_P_0,
2065 EVEX_W_0FC6_P_2,
2066 EVEX_W_0FD2_P_2,
2067 EVEX_W_0FD3_P_2,
2068 EVEX_W_0FD4_P_2,
2069 EVEX_W_0FD6_P_2,
2070 EVEX_W_0FE6_P_1,
2071 EVEX_W_0FE6_P_2,
2072 EVEX_W_0FE6_P_3,
2073 EVEX_W_0FE7_P_2,
2074 EVEX_W_0FF2_P_2,
2075 EVEX_W_0FF3_P_2,
2076 EVEX_W_0FF4_P_2,
2077 EVEX_W_0FFA_P_2,
2078 EVEX_W_0FFB_P_2,
2079 EVEX_W_0FFE_P_2,
2080 EVEX_W_0F380C_P_2,
2081 EVEX_W_0F380D_P_2,
2082 EVEX_W_0F3811_P_1,
2083 EVEX_W_0F3812_P_1,
2084 EVEX_W_0F3813_P_1,
2085 EVEX_W_0F3813_P_2,
2086 EVEX_W_0F3814_P_1,
2087 EVEX_W_0F3815_P_1,
2088 EVEX_W_0F3818_P_2,
2089 EVEX_W_0F3819_P_2,
2090 EVEX_W_0F381A_P_2,
2091 EVEX_W_0F381B_P_2,
2092 EVEX_W_0F381E_P_2,
2093 EVEX_W_0F381F_P_2,
2094 EVEX_W_0F3821_P_1,
2095 EVEX_W_0F3822_P_1,
2096 EVEX_W_0F3823_P_1,
2097 EVEX_W_0F3824_P_1,
2098 EVEX_W_0F3825_P_1,
2099 EVEX_W_0F3825_P_2,
2100 EVEX_W_0F3828_P_2,
2101 EVEX_W_0F3829_P_2,
2102 EVEX_W_0F382A_P_1,
2103 EVEX_W_0F382A_P_2,
2104 EVEX_W_0F3831_P_1,
2105 EVEX_W_0F3832_P_1,
2106 EVEX_W_0F3833_P_1,
2107 EVEX_W_0F3834_P_1,
2108 EVEX_W_0F3835_P_1,
2109 EVEX_W_0F3835_P_2,
2110 EVEX_W_0F3837_P_2,
2111 EVEX_W_0F383A_P_1,
2112 EVEX_W_0F3840_P_2,
2113 EVEX_W_0F3858_P_2,
2114 EVEX_W_0F3859_P_2,
2115 EVEX_W_0F385A_P_2,
2116 EVEX_W_0F385B_P_2,
2117 EVEX_W_0F3891_P_2,
2118 EVEX_W_0F3893_P_2,
2119 EVEX_W_0F38A1_P_2,
2120 EVEX_W_0F38A3_P_2,
2121 EVEX_W_0F38C7_R_1_P_2,
2122 EVEX_W_0F38C7_R_2_P_2,
2123 EVEX_W_0F38C7_R_5_P_2,
2124 EVEX_W_0F38C7_R_6_P_2,
2125
2126 EVEX_W_0F3A00_P_2,
2127 EVEX_W_0F3A01_P_2,
2128 EVEX_W_0F3A04_P_2,
2129 EVEX_W_0F3A05_P_2,
2130 EVEX_W_0F3A08_P_2,
2131 EVEX_W_0F3A09_P_2,
2132 EVEX_W_0F3A0A_P_2,
2133 EVEX_W_0F3A0B_P_2,
2134 EVEX_W_0F3A18_P_2,
2135 EVEX_W_0F3A19_P_2,
2136 EVEX_W_0F3A1A_P_2,
2137 EVEX_W_0F3A1B_P_2,
2138 EVEX_W_0F3A1D_P_2,
2139 EVEX_W_0F3A21_P_2,
2140 EVEX_W_0F3A23_P_2,
2141 EVEX_W_0F3A38_P_2,
2142 EVEX_W_0F3A39_P_2,
2143 EVEX_W_0F3A3A_P_2,
2144 EVEX_W_0F3A3B_P_2,
2145 EVEX_W_0F3A43_P_2,
2146 };
2147
2148 typedef void (*op_rtn) (int bytemode, int sizeflag);
2149
2150 struct dis386 {
2151 const char *name;
2152 struct
2153 {
2154 op_rtn rtn;
2155 int bytemode;
2156 } op[MAX_OPERANDS];
2157 };
2158
2159 /* Upper case letters in the instruction names here are macros.
2160 'A' => print 'b' if no register operands or suffix_always is true
2161 'B' => print 'b' if suffix_always is true
2162 'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
2163 size prefix
2164 'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
2165 suffix_always is true
2166 'E' => print 'e' if 32-bit form of jcxz
2167 'F' => print 'w' or 'l' depending on address size prefix (loop insns)
2168 'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
2169 'H' => print ",pt" or ",pn" branch hint
2170 'I' => honor following macro letter even in Intel mode (implemented only
2171 for some of the macro letters)
2172 'J' => print 'l'
2173 'K' => print 'd' or 'q' if rex prefix is present.
2174 'L' => print 'l' if suffix_always is true
2175 'M' => print 'r' if intel_mnemonic is false.
2176 'N' => print 'n' if instruction has no wait "prefix"
2177 'O' => print 'd' or 'o' (or 'q' in Intel mode)
2178 'P' => print 'w', 'l' or 'q' if instruction has an operand size prefix,
2179 or suffix_always is true. print 'q' if rex prefix is present.
2180 'Q' => print 'w', 'l' or 'q' for memory operand or suffix_always
2181 is true
2182 'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
2183 'S' => print 'w', 'l' or 'q' if suffix_always is true
2184 'T' => print 'q' in 64bit mode and behave as 'P' otherwise
2185 'U' => print 'q' in 64bit mode and behave as 'Q' otherwise
2186 'V' => print 'q' in 64bit mode and behave as 'S' otherwise
2187 'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
2188 'X' => print 's', 'd' depending on data16 prefix (for XMM)
2189 'Y' => 'q' if instruction has an REX 64bit overwrite prefix and
2190 suffix_always is true.
2191 'Z' => print 'q' in 64bit mode and behave as 'L' otherwise
2192 '!' => change condition from true to false or from false to true.
2193 '%' => add 1 upper case letter to the macro.
2194
2195 2 upper case letter macros:
2196 "XY" => print 'x' or 'y' if no register operands or suffix_always
2197 is true.
2198 "XW" => print 's', 'd' depending on the VEX.W bit (for FMA)
2199 "LQ" => print 'l' ('d' in Intel mode) or 'q' for memory operand
2200 or suffix_always is true
2201 "LB" => print "abs" in 64bit mode and behave as 'B' otherwise
2202 "LS" => print "abs" in 64bit mode and behave as 'S' otherwise
2203 "LV" => print "abs" for 64bit operand and behave as 'S' otherwise
2204 "LW" => print 'd', 'q' depending on the VEX.W bit
2205
2206 Many of the above letters print nothing in Intel mode. See "putop"
2207 for the details.
2208
2209 Braces '{' and '}', and vertical bars '|', indicate alternative
2210 mnemonic strings for AT&T and Intel. */
2211
2212 static const struct dis386 dis386[] = {
2213 /* 00 */
2214 { "addB", { Ebh1, Gb } },
2215 { "addS", { Evh1, Gv } },
2216 { "addB", { Gb, EbS } },
2217 { "addS", { Gv, EvS } },
2218 { "addB", { AL, Ib } },
2219 { "addS", { eAX, Iv } },
2220 { X86_64_TABLE (X86_64_06) },
2221 { X86_64_TABLE (X86_64_07) },
2222 /* 08 */
2223 { "orB", { Ebh1, Gb } },
2224 { "orS", { Evh1, Gv } },
2225 { "orB", { Gb, EbS } },
2226 { "orS", { Gv, EvS } },
2227 { "orB", { AL, Ib } },
2228 { "orS", { eAX, Iv } },
2229 { X86_64_TABLE (X86_64_0D) },
2230 { Bad_Opcode }, /* 0x0f extended opcode escape */
2231 /* 10 */
2232 { "adcB", { Ebh1, Gb } },
2233 { "adcS", { Evh1, Gv } },
2234 { "adcB", { Gb, EbS } },
2235 { "adcS", { Gv, EvS } },
2236 { "adcB", { AL, Ib } },
2237 { "adcS", { eAX, Iv } },
2238 { X86_64_TABLE (X86_64_16) },
2239 { X86_64_TABLE (X86_64_17) },
2240 /* 18 */
2241 { "sbbB", { Ebh1, Gb } },
2242 { "sbbS", { Evh1, Gv } },
2243 { "sbbB", { Gb, EbS } },
2244 { "sbbS", { Gv, EvS } },
2245 { "sbbB", { AL, Ib } },
2246 { "sbbS", { eAX, Iv } },
2247 { X86_64_TABLE (X86_64_1E) },
2248 { X86_64_TABLE (X86_64_1F) },
2249 /* 20 */
2250 { "andB", { Ebh1, Gb } },
2251 { "andS", { Evh1, Gv } },
2252 { "andB", { Gb, EbS } },
2253 { "andS", { Gv, EvS } },
2254 { "andB", { AL, Ib } },
2255 { "andS", { eAX, Iv } },
2256 { Bad_Opcode }, /* SEG ES prefix */
2257 { X86_64_TABLE (X86_64_27) },
2258 /* 28 */
2259 { "subB", { Ebh1, Gb } },
2260 { "subS", { Evh1, Gv } },
2261 { "subB", { Gb, EbS } },
2262 { "subS", { Gv, EvS } },
2263 { "subB", { AL, Ib } },
2264 { "subS", { eAX, Iv } },
2265 { Bad_Opcode }, /* SEG CS prefix */
2266 { X86_64_TABLE (X86_64_2F) },
2267 /* 30 */
2268 { "xorB", { Ebh1, Gb } },
2269 { "xorS", { Evh1, Gv } },
2270 { "xorB", { Gb, EbS } },
2271 { "xorS", { Gv, EvS } },
2272 { "xorB", { AL, Ib } },
2273 { "xorS", { eAX, Iv } },
2274 { Bad_Opcode }, /* SEG SS prefix */
2275 { X86_64_TABLE (X86_64_37) },
2276 /* 38 */
2277 { "cmpB", { Eb, Gb } },
2278 { "cmpS", { Ev, Gv } },
2279 { "cmpB", { Gb, EbS } },
2280 { "cmpS", { Gv, EvS } },
2281 { "cmpB", { AL, Ib } },
2282 { "cmpS", { eAX, Iv } },
2283 { Bad_Opcode }, /* SEG DS prefix */
2284 { X86_64_TABLE (X86_64_3F) },
2285 /* 40 */
2286 { "inc{S|}", { RMeAX } },
2287 { "inc{S|}", { RMeCX } },
2288 { "inc{S|}", { RMeDX } },
2289 { "inc{S|}", { RMeBX } },
2290 { "inc{S|}", { RMeSP } },
2291 { "inc{S|}", { RMeBP } },
2292 { "inc{S|}", { RMeSI } },
2293 { "inc{S|}", { RMeDI } },
2294 /* 48 */
2295 { "dec{S|}", { RMeAX } },
2296 { "dec{S|}", { RMeCX } },
2297 { "dec{S|}", { RMeDX } },
2298 { "dec{S|}", { RMeBX } },
2299 { "dec{S|}", { RMeSP } },
2300 { "dec{S|}", { RMeBP } },
2301 { "dec{S|}", { RMeSI } },
2302 { "dec{S|}", { RMeDI } },
2303 /* 50 */
2304 { "pushV", { RMrAX } },
2305 { "pushV", { RMrCX } },
2306 { "pushV", { RMrDX } },
2307 { "pushV", { RMrBX } },
2308 { "pushV", { RMrSP } },
2309 { "pushV", { RMrBP } },
2310 { "pushV", { RMrSI } },
2311 { "pushV", { RMrDI } },
2312 /* 58 */
2313 { "popV", { RMrAX } },
2314 { "popV", { RMrCX } },
2315 { "popV", { RMrDX } },
2316 { "popV", { RMrBX } },
2317 { "popV", { RMrSP } },
2318 { "popV", { RMrBP } },
2319 { "popV", { RMrSI } },
2320 { "popV", { RMrDI } },
2321 /* 60 */
2322 { X86_64_TABLE (X86_64_60) },
2323 { X86_64_TABLE (X86_64_61) },
2324 { X86_64_TABLE (X86_64_62) },
2325 { X86_64_TABLE (X86_64_63) },
2326 { Bad_Opcode }, /* seg fs */
2327 { Bad_Opcode }, /* seg gs */
2328 { Bad_Opcode }, /* op size prefix */
2329 { Bad_Opcode }, /* adr size prefix */
2330 /* 68 */
2331 { "pushT", { sIv } },
2332 { "imulS", { Gv, Ev, Iv } },
2333 { "pushT", { sIbT } },
2334 { "imulS", { Gv, Ev, sIb } },
2335 { "ins{b|}", { Ybr, indirDX } },
2336 { X86_64_TABLE (X86_64_6D) },
2337 { "outs{b|}", { indirDXr, Xb } },
2338 { X86_64_TABLE (X86_64_6F) },
2339 /* 70 */
2340 { "joH", { Jb, BND, cond_jump_flag } },
2341 { "jnoH", { Jb, BND, cond_jump_flag } },
2342 { "jbH", { Jb, BND, cond_jump_flag } },
2343 { "jaeH", { Jb, BND, cond_jump_flag } },
2344 { "jeH", { Jb, BND, cond_jump_flag } },
2345 { "jneH", { Jb, BND, cond_jump_flag } },
2346 { "jbeH", { Jb, BND, cond_jump_flag } },
2347 { "jaH", { Jb, BND, cond_jump_flag } },
2348 /* 78 */
2349 { "jsH", { Jb, BND, cond_jump_flag } },
2350 { "jnsH", { Jb, BND, cond_jump_flag } },
2351 { "jpH", { Jb, BND, cond_jump_flag } },
2352 { "jnpH", { Jb, BND, cond_jump_flag } },
2353 { "jlH", { Jb, BND, cond_jump_flag } },
2354 { "jgeH", { Jb, BND, cond_jump_flag } },
2355 { "jleH", { Jb, BND, cond_jump_flag } },
2356 { "jgH", { Jb, BND, cond_jump_flag } },
2357 /* 80 */
2358 { REG_TABLE (REG_80) },
2359 { REG_TABLE (REG_81) },
2360 { Bad_Opcode },
2361 { REG_TABLE (REG_82) },
2362 { "testB", { Eb, Gb } },
2363 { "testS", { Ev, Gv } },
2364 { "xchgB", { Ebh2, Gb } },
2365 { "xchgS", { Evh2, Gv } },
2366 /* 88 */
2367 { "movB", { Ebh3, Gb } },
2368 { "movS", { Evh3, Gv } },
2369 { "movB", { Gb, EbS } },
2370 { "movS", { Gv, EvS } },
2371 { "movD", { Sv, Sw } },
2372 { MOD_TABLE (MOD_8D) },
2373 { "movD", { Sw, Sv } },
2374 { REG_TABLE (REG_8F) },
2375 /* 90 */
2376 { PREFIX_TABLE (PREFIX_90) },
2377 { "xchgS", { RMeCX, eAX } },
2378 { "xchgS", { RMeDX, eAX } },
2379 { "xchgS", { RMeBX, eAX } },
2380 { "xchgS", { RMeSP, eAX } },
2381 { "xchgS", { RMeBP, eAX } },
2382 { "xchgS", { RMeSI, eAX } },
2383 { "xchgS", { RMeDI, eAX } },
2384 /* 98 */
2385 { "cW{t|}R", { XX } },
2386 { "cR{t|}O", { XX } },
2387 { X86_64_TABLE (X86_64_9A) },
2388 { Bad_Opcode }, /* fwait */
2389 { "pushfT", { XX } },
2390 { "popfT", { XX } },
2391 { "sahf", { XX } },
2392 { "lahf", { XX } },
2393 /* a0 */
2394 { "mov%LB", { AL, Ob } },
2395 { "mov%LS", { eAX, Ov } },
2396 { "mov%LB", { Ob, AL } },
2397 { "mov%LS", { Ov, eAX } },
2398 { "movs{b|}", { Ybr, Xb } },
2399 { "movs{R|}", { Yvr, Xv } },
2400 { "cmps{b|}", { Xb, Yb } },
2401 { "cmps{R|}", { Xv, Yv } },
2402 /* a8 */
2403 { "testB", { AL, Ib } },
2404 { "testS", { eAX, Iv } },
2405 { "stosB", { Ybr, AL } },
2406 { "stosS", { Yvr, eAX } },
2407 { "lodsB", { ALr, Xb } },
2408 { "lodsS", { eAXr, Xv } },
2409 { "scasB", { AL, Yb } },
2410 { "scasS", { eAX, Yv } },
2411 /* b0 */
2412 { "movB", { RMAL, Ib } },
2413 { "movB", { RMCL, Ib } },
2414 { "movB", { RMDL, Ib } },
2415 { "movB", { RMBL, Ib } },
2416 { "movB", { RMAH, Ib } },
2417 { "movB", { RMCH, Ib } },
2418 { "movB", { RMDH, Ib } },
2419 { "movB", { RMBH, Ib } },
2420 /* b8 */
2421 { "mov%LV", { RMeAX, Iv64 } },
2422 { "mov%LV", { RMeCX, Iv64 } },
2423 { "mov%LV", { RMeDX, Iv64 } },
2424 { "mov%LV", { RMeBX, Iv64 } },
2425 { "mov%LV", { RMeSP, Iv64 } },
2426 { "mov%LV", { RMeBP, Iv64 } },
2427 { "mov%LV", { RMeSI, Iv64 } },
2428 { "mov%LV", { RMeDI, Iv64 } },
2429 /* c0 */
2430 { REG_TABLE (REG_C0) },
2431 { REG_TABLE (REG_C1) },
2432 { "retT", { Iw, BND } },
2433 { "retT", { BND } },
2434 { X86_64_TABLE (X86_64_C4) },
2435 { X86_64_TABLE (X86_64_C5) },
2436 { REG_TABLE (REG_C6) },
2437 { REG_TABLE (REG_C7) },
2438 /* c8 */
2439 { "enterT", { Iw, Ib } },
2440 { "leaveT", { XX } },
2441 { "Jret{|f}P", { Iw } },
2442 { "Jret{|f}P", { XX } },
2443 { "int3", { XX } },
2444 { "int", { Ib } },
2445 { X86_64_TABLE (X86_64_CE) },
2446 { "iretP", { XX } },
2447 /* d0 */
2448 { REG_TABLE (REG_D0) },
2449 { REG_TABLE (REG_D1) },
2450 { REG_TABLE (REG_D2) },
2451 { REG_TABLE (REG_D3) },
2452 { X86_64_TABLE (X86_64_D4) },
2453 { X86_64_TABLE (X86_64_D5) },
2454 { Bad_Opcode },
2455 { "xlat", { DSBX } },
2456 /* d8 */
2457 { FLOAT },
2458 { FLOAT },
2459 { FLOAT },
2460 { FLOAT },
2461 { FLOAT },
2462 { FLOAT },
2463 { FLOAT },
2464 { FLOAT },
2465 /* e0 */
2466 { "loopneFH", { Jb, XX, loop_jcxz_flag } },
2467 { "loopeFH", { Jb, XX, loop_jcxz_flag } },
2468 { "loopFH", { Jb, XX, loop_jcxz_flag } },
2469 { "jEcxzH", { Jb, XX, loop_jcxz_flag } },
2470 { "inB", { AL, Ib } },
2471 { "inG", { zAX, Ib } },
2472 { "outB", { Ib, AL } },
2473 { "outG", { Ib, zAX } },
2474 /* e8 */
2475 { "callT", { Jv, BND } },
2476 { "jmpT", { Jv, BND } },
2477 { X86_64_TABLE (X86_64_EA) },
2478 { "jmp", { Jb, BND } },
2479 { "inB", { AL, indirDX } },
2480 { "inG", { zAX, indirDX } },
2481 { "outB", { indirDX, AL } },
2482 { "outG", { indirDX, zAX } },
2483 /* f0 */
2484 { Bad_Opcode }, /* lock prefix */
2485 { "icebp", { XX } },
2486 { Bad_Opcode }, /* repne */
2487 { Bad_Opcode }, /* repz */
2488 { "hlt", { XX } },
2489 { "cmc", { XX } },
2490 { REG_TABLE (REG_F6) },
2491 { REG_TABLE (REG_F7) },
2492 /* f8 */
2493 { "clc", { XX } },
2494 { "stc", { XX } },
2495 { "cli", { XX } },
2496 { "sti", { XX } },
2497 { "cld", { XX } },
2498 { "std", { XX } },
2499 { REG_TABLE (REG_FE) },
2500 { REG_TABLE (REG_FF) },
2501 };
2502
2503 static const struct dis386 dis386_twobyte[] = {
2504 /* 00 */
2505 { REG_TABLE (REG_0F00 ) },
2506 { REG_TABLE (REG_0F01 ) },
2507 { "larS", { Gv, Ew } },
2508 { "lslS", { Gv, Ew } },
2509 { Bad_Opcode },
2510 { "syscall", { XX } },
2511 { "clts", { XX } },
2512 { "sysretP", { XX } },
2513 /* 08 */
2514 { "invd", { XX } },
2515 { "wbinvd", { XX } },
2516 { Bad_Opcode },
2517 { "ud2", { XX } },
2518 { Bad_Opcode },
2519 { REG_TABLE (REG_0F0D) },
2520 { "femms", { XX } },
2521 { "", { MX, EM, OPSUF } }, /* See OP_3DNowSuffix. */
2522 /* 10 */
2523 { PREFIX_TABLE (PREFIX_0F10) },
2524 { PREFIX_TABLE (PREFIX_0F11) },
2525 { PREFIX_TABLE (PREFIX_0F12) },
2526 { MOD_TABLE (MOD_0F13) },
2527 { "unpcklpX", { XM, EXx } },
2528 { "unpckhpX", { XM, EXx } },
2529 { PREFIX_TABLE (PREFIX_0F16) },
2530 { MOD_TABLE (MOD_0F17) },
2531 /* 18 */
2532 { REG_TABLE (REG_0F18) },
2533 { "nopQ", { Ev } },
2534 { PREFIX_TABLE (PREFIX_0F1A) },
2535 { PREFIX_TABLE (PREFIX_0F1B) },
2536 { "nopQ", { Ev } },
2537 { "nopQ", { Ev } },
2538 { "nopQ", { Ev } },
2539 { "nopQ", { Ev } },
2540 /* 20 */
2541 { MOD_TABLE (MOD_0F20) },
2542 { MOD_TABLE (MOD_0F21) },
2543 { MOD_TABLE (MOD_0F22) },
2544 { MOD_TABLE (MOD_0F23) },
2545 { MOD_TABLE (MOD_0F24) },
2546 { Bad_Opcode },
2547 { MOD_TABLE (MOD_0F26) },
2548 { Bad_Opcode },
2549 /* 28 */
2550 { "movapX", { XM, EXx } },
2551 { "movapX", { EXxS, XM } },
2552 { PREFIX_TABLE (PREFIX_0F2A) },
2553 { PREFIX_TABLE (PREFIX_0F2B) },
2554 { PREFIX_TABLE (PREFIX_0F2C) },
2555 { PREFIX_TABLE (PREFIX_0F2D) },
2556 { PREFIX_TABLE (PREFIX_0F2E) },
2557 { PREFIX_TABLE (PREFIX_0F2F) },
2558 /* 30 */
2559 { "wrmsr", { XX } },
2560 { "rdtsc", { XX } },
2561 { "rdmsr", { XX } },
2562 { "rdpmc", { XX } },
2563 { "sysenter", { XX } },
2564 { "sysexit", { XX } },
2565 { Bad_Opcode },
2566 { "getsec", { XX } },
2567 /* 38 */
2568 { THREE_BYTE_TABLE (THREE_BYTE_0F38) },
2569 { Bad_Opcode },
2570 { THREE_BYTE_TABLE (THREE_BYTE_0F3A) },
2571 { Bad_Opcode },
2572 { Bad_Opcode },
2573 { Bad_Opcode },
2574 { Bad_Opcode },
2575 { Bad_Opcode },
2576 /* 40 */
2577 { "cmovoS", { Gv, Ev } },
2578 { "cmovnoS", { Gv, Ev } },
2579 { "cmovbS", { Gv, Ev } },
2580 { "cmovaeS", { Gv, Ev } },
2581 { "cmoveS", { Gv, Ev } },
2582 { "cmovneS", { Gv, Ev } },
2583 { "cmovbeS", { Gv, Ev } },
2584 { "cmovaS", { Gv, Ev } },
2585 /* 48 */
2586 { "cmovsS", { Gv, Ev } },
2587 { "cmovnsS", { Gv, Ev } },
2588 { "cmovpS", { Gv, Ev } },
2589 { "cmovnpS", { Gv, Ev } },
2590 { "cmovlS", { Gv, Ev } },
2591 { "cmovgeS", { Gv, Ev } },
2592 { "cmovleS", { Gv, Ev } },
2593 { "cmovgS", { Gv, Ev } },
2594 /* 50 */
2595 { MOD_TABLE (MOD_0F51) },
2596 { PREFIX_TABLE (PREFIX_0F51) },
2597 { PREFIX_TABLE (PREFIX_0F52) },
2598 { PREFIX_TABLE (PREFIX_0F53) },
2599 { "andpX", { XM, EXx } },
2600 { "andnpX", { XM, EXx } },
2601 { "orpX", { XM, EXx } },
2602 { "xorpX", { XM, EXx } },
2603 /* 58 */
2604 { PREFIX_TABLE (PREFIX_0F58) },
2605 { PREFIX_TABLE (PREFIX_0F59) },
2606 { PREFIX_TABLE (PREFIX_0F5A) },
2607 { PREFIX_TABLE (PREFIX_0F5B) },
2608 { PREFIX_TABLE (PREFIX_0F5C) },
2609 { PREFIX_TABLE (PREFIX_0F5D) },
2610 { PREFIX_TABLE (PREFIX_0F5E) },
2611 { PREFIX_TABLE (PREFIX_0F5F) },
2612 /* 60 */
2613 { PREFIX_TABLE (PREFIX_0F60) },
2614 { PREFIX_TABLE (PREFIX_0F61) },
2615 { PREFIX_TABLE (PREFIX_0F62) },
2616 { "packsswb", { MX, EM } },
2617 { "pcmpgtb", { MX, EM } },
2618 { "pcmpgtw", { MX, EM } },
2619 { "pcmpgtd", { MX, EM } },
2620 { "packuswb", { MX, EM } },
2621 /* 68 */
2622 { "punpckhbw", { MX, EM } },
2623 { "punpckhwd", { MX, EM } },
2624 { "punpckhdq", { MX, EM } },
2625 { "packssdw", { MX, EM } },
2626 { PREFIX_TABLE (PREFIX_0F6C) },
2627 { PREFIX_TABLE (PREFIX_0F6D) },
2628 { "movK", { MX, Edq } },
2629 { PREFIX_TABLE (PREFIX_0F6F) },
2630 /* 70 */
2631 { PREFIX_TABLE (PREFIX_0F70) },
2632 { REG_TABLE (REG_0F71) },
2633 { REG_TABLE (REG_0F72) },
2634 { REG_TABLE (REG_0F73) },
2635 { "pcmpeqb", { MX, EM } },
2636 { "pcmpeqw", { MX, EM } },
2637 { "pcmpeqd", { MX, EM } },
2638 { "emms", { XX } },
2639 /* 78 */
2640 { PREFIX_TABLE (PREFIX_0F78) },
2641 { PREFIX_TABLE (PREFIX_0F79) },
2642 { THREE_BYTE_TABLE (THREE_BYTE_0F7A) },
2643 { Bad_Opcode },
2644 { PREFIX_TABLE (PREFIX_0F7C) },
2645 { PREFIX_TABLE (PREFIX_0F7D) },
2646 { PREFIX_TABLE (PREFIX_0F7E) },
2647 { PREFIX_TABLE (PREFIX_0F7F) },
2648 /* 80 */
2649 { "joH", { Jv, BND, cond_jump_flag } },
2650 { "jnoH", { Jv, BND, cond_jump_flag } },
2651 { "jbH", { Jv, BND, cond_jump_flag } },
2652 { "jaeH", { Jv, BND, cond_jump_flag } },
2653 { "jeH", { Jv, BND, cond_jump_flag } },
2654 { "jneH", { Jv, BND, cond_jump_flag } },
2655 { "jbeH", { Jv, BND, cond_jump_flag } },
2656 { "jaH", { Jv, BND, cond_jump_flag } },
2657 /* 88 */
2658 { "jsH", { Jv, BND, cond_jump_flag } },
2659 { "jnsH", { Jv, BND, cond_jump_flag } },
2660 { "jpH", { Jv, BND, cond_jump_flag } },
2661 { "jnpH", { Jv, BND, cond_jump_flag } },
2662 { "jlH", { Jv, BND, cond_jump_flag } },
2663 { "jgeH", { Jv, BND, cond_jump_flag } },
2664 { "jleH", { Jv, BND, cond_jump_flag } },
2665 { "jgH", { Jv, BND, cond_jump_flag } },
2666 /* 90 */
2667 { "seto", { Eb } },
2668 { "setno", { Eb } },
2669 { "setb", { Eb } },
2670 { "setae", { Eb } },
2671 { "sete", { Eb } },
2672 { "setne", { Eb } },
2673 { "setbe", { Eb } },
2674 { "seta", { Eb } },
2675 /* 98 */
2676 { "sets", { Eb } },
2677 { "setns", { Eb } },
2678 { "setp", { Eb } },
2679 { "setnp", { Eb } },
2680 { "setl", { Eb } },
2681 { "setge", { Eb } },
2682 { "setle", { Eb } },
2683 { "setg", { Eb } },
2684 /* a0 */
2685 { "pushT", { fs } },
2686 { "popT", { fs } },
2687 { "cpuid", { XX } },
2688 { "btS", { Ev, Gv } },
2689 { "shldS", { Ev, Gv, Ib } },
2690 { "shldS", { Ev, Gv, CL } },
2691 { REG_TABLE (REG_0FA6) },
2692 { REG_TABLE (REG_0FA7) },
2693 /* a8 */
2694 { "pushT", { gs } },
2695 { "popT", { gs } },
2696 { "rsm", { XX } },
2697 { "btsS", { Evh1, Gv } },
2698 { "shrdS", { Ev, Gv, Ib } },
2699 { "shrdS", { Ev, Gv, CL } },
2700 { REG_TABLE (REG_0FAE) },
2701 { "imulS", { Gv, Ev } },
2702 /* b0 */
2703 { "cmpxchgB", { Ebh1, Gb } },
2704 { "cmpxchgS", { Evh1, Gv } },
2705 { MOD_TABLE (MOD_0FB2) },
2706 { "btrS", { Evh1, Gv } },
2707 { MOD_TABLE (MOD_0FB4) },
2708 { MOD_TABLE (MOD_0FB5) },
2709 { "movz{bR|x}", { Gv, Eb } },
2710 { "movz{wR|x}", { Gv, Ew } }, /* yes, there really is movzww ! */
2711 /* b8 */
2712 { PREFIX_TABLE (PREFIX_0FB8) },
2713 { "ud1", { XX } },
2714 { REG_TABLE (REG_0FBA) },
2715 { "btcS", { Evh1, Gv } },
2716 { PREFIX_TABLE (PREFIX_0FBC) },
2717 { PREFIX_TABLE (PREFIX_0FBD) },
2718 { "movs{bR|x}", { Gv, Eb } },
2719 { "movs{wR|x}", { Gv, Ew } }, /* yes, there really is movsww ! */
2720 /* c0 */
2721 { "xaddB", { Ebh1, Gb } },
2722 { "xaddS", { Evh1, Gv } },
2723 { PREFIX_TABLE (PREFIX_0FC2) },
2724 { PREFIX_TABLE (PREFIX_0FC3) },
2725 { "pinsrw", { MX, Edqw, Ib } },
2726 { "pextrw", { Gdq, MS, Ib } },
2727 { "shufpX", { XM, EXx, Ib } },
2728 { REG_TABLE (REG_0FC7) },
2729 /* c8 */
2730 { "bswap", { RMeAX } },
2731 { "bswap", { RMeCX } },
2732 { "bswap", { RMeDX } },
2733 { "bswap", { RMeBX } },
2734 { "bswap", { RMeSP } },
2735 { "bswap", { RMeBP } },
2736 { "bswap", { RMeSI } },
2737 { "bswap", { RMeDI } },
2738 /* d0 */
2739 { PREFIX_TABLE (PREFIX_0FD0) },
2740 { "psrlw", { MX, EM } },
2741 { "psrld", { MX, EM } },
2742 { "psrlq", { MX, EM } },
2743 { "paddq", { MX, EM } },
2744 { "pmullw", { MX, EM } },
2745 { PREFIX_TABLE (PREFIX_0FD6) },
2746 { MOD_TABLE (MOD_0FD7) },
2747 /* d8 */
2748 { "psubusb", { MX, EM } },
2749 { "psubusw", { MX, EM } },
2750 { "pminub", { MX, EM } },
2751 { "pand", { MX, EM } },
2752 { "paddusb", { MX, EM } },
2753 { "paddusw", { MX, EM } },
2754 { "pmaxub", { MX, EM } },
2755 { "pandn", { MX, EM } },
2756 /* e0 */
2757 { "pavgb", { MX, EM } },
2758 { "psraw", { MX, EM } },
2759 { "psrad", { MX, EM } },
2760 { "pavgw", { MX, EM } },
2761 { "pmulhuw", { MX, EM } },
2762 { "pmulhw", { MX, EM } },
2763 { PREFIX_TABLE (PREFIX_0FE6) },
2764 { PREFIX_TABLE (PREFIX_0FE7) },
2765 /* e8 */
2766 { "psubsb", { MX, EM } },
2767 { "psubsw", { MX, EM } },
2768 { "pminsw", { MX, EM } },
2769 { "por", { MX, EM } },
2770 { "paddsb", { MX, EM } },
2771 { "paddsw", { MX, EM } },
2772 { "pmaxsw", { MX, EM } },
2773 { "pxor", { MX, EM } },
2774 /* f0 */
2775 { PREFIX_TABLE (PREFIX_0FF0) },
2776 { "psllw", { MX, EM } },
2777 { "pslld", { MX, EM } },
2778 { "psllq", { MX, EM } },
2779 { "pmuludq", { MX, EM } },
2780 { "pmaddwd", { MX, EM } },
2781 { "psadbw", { MX, EM } },
2782 { PREFIX_TABLE (PREFIX_0FF7) },
2783 /* f8 */
2784 { "psubb", { MX, EM } },
2785 { "psubw", { MX, EM } },
2786 { "psubd", { MX, EM } },
2787 { "psubq", { MX, EM } },
2788 { "paddb", { MX, EM } },
2789 { "paddw", { MX, EM } },
2790 { "paddd", { MX, EM } },
2791 { Bad_Opcode },
2792 };
2793
2794 static const unsigned char onebyte_has_modrm[256] = {
2795 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2796 /* ------------------------------- */
2797 /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
2798 /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
2799 /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
2800 /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
2801 /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
2802 /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
2803 /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
2804 /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
2805 /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
2806 /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
2807 /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
2808 /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
2809 /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
2810 /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
2811 /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
2812 /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1 /* f0 */
2813 /* ------------------------------- */
2814 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2815 };
2816
2817 static const unsigned char twobyte_has_modrm[256] = {
2818 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2819 /* ------------------------------- */
2820 /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
2821 /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
2822 /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
2823 /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
2824 /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
2825 /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
2826 /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
2827 /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
2828 /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
2829 /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
2830 /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
2831 /* b0 */ 1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1, /* bf */
2832 /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
2833 /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
2834 /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
2835 /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0 /* ff */
2836 /* ------------------------------- */
2837 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2838 };
2839
2840 static char obuf[100];
2841 static char *obufp;
2842 static char *mnemonicendp;
2843 static char scratchbuf[100];
2844 static unsigned char *start_codep;
2845 static unsigned char *insn_codep;
2846 static unsigned char *codep;
2847 static int last_lock_prefix;
2848 static int last_repz_prefix;
2849 static int last_repnz_prefix;
2850 static int last_data_prefix;
2851 static int last_addr_prefix;
2852 static int last_rex_prefix;
2853 static int last_seg_prefix;
2854 #define MAX_CODE_LENGTH 15
2855 /* We can up to 14 prefixes since the maximum instruction length is
2856 15bytes. */
2857 static int all_prefixes[MAX_CODE_LENGTH - 1];
2858 static disassemble_info *the_info;
2859 static struct
2860 {
2861 int mod;
2862 int reg;
2863 int rm;
2864 }
2865 modrm;
2866 static unsigned char need_modrm;
2867 static struct
2868 {
2869 int scale;
2870 int index;
2871 int base;
2872 }
2873 sib;
2874 static struct
2875 {
2876 int register_specifier;
2877 int length;
2878 int prefix;
2879 int w;
2880 int evex;
2881 int r;
2882 int v;
2883 int mask_register_specifier;
2884 int zeroing;
2885 int ll;
2886 int b;
2887 }
2888 vex;
2889 static unsigned char need_vex;
2890 static unsigned char need_vex_reg;
2891 static unsigned char vex_w_done;
2892
2893 struct op
2894 {
2895 const char *name;
2896 unsigned int len;
2897 };
2898
2899 /* If we are accessing mod/rm/reg without need_modrm set, then the
2900 values are stale. Hitting this abort likely indicates that you
2901 need to update onebyte_has_modrm or twobyte_has_modrm. */
2902 #define MODRM_CHECK if (!need_modrm) abort ()
2903
2904 static const char **names64;
2905 static const char **names32;
2906 static const char **names16;
2907 static const char **names8;
2908 static const char **names8rex;
2909 static const char **names_seg;
2910 static const char *index64;
2911 static const char *index32;
2912 static const char **index16;
2913 static const char **names_bnd;
2914
2915 static const char *intel_names64[] = {
2916 "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
2917 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2918 };
2919 static const char *intel_names32[] = {
2920 "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
2921 "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
2922 };
2923 static const char *intel_names16[] = {
2924 "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
2925 "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
2926 };
2927 static const char *intel_names8[] = {
2928 "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
2929 };
2930 static const char *intel_names8rex[] = {
2931 "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
2932 "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
2933 };
2934 static const char *intel_names_seg[] = {
2935 "es", "cs", "ss", "ds", "fs", "gs", "?", "?",
2936 };
2937 static const char *intel_index64 = "riz";
2938 static const char *intel_index32 = "eiz";
2939 static const char *intel_index16[] = {
2940 "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
2941 };
2942
2943 static const char *att_names64[] = {
2944 "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
2945 "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
2946 };
2947 static const char *att_names32[] = {
2948 "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
2949 "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
2950 };
2951 static const char *att_names16[] = {
2952 "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
2953 "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
2954 };
2955 static const char *att_names8[] = {
2956 "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
2957 };
2958 static const char *att_names8rex[] = {
2959 "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
2960 "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
2961 };
2962 static const char *att_names_seg[] = {
2963 "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
2964 };
2965 static const char *att_index64 = "%riz";
2966 static const char *att_index32 = "%eiz";
2967 static const char *att_index16[] = {
2968 "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
2969 };
2970
2971 static const char **names_mm;
2972 static const char *intel_names_mm[] = {
2973 "mm0", "mm1", "mm2", "mm3",
2974 "mm4", "mm5", "mm6", "mm7"
2975 };
2976 static const char *att_names_mm[] = {
2977 "%mm0", "%mm1", "%mm2", "%mm3",
2978 "%mm4", "%mm5", "%mm6", "%mm7"
2979 };
2980
2981 static const char *intel_names_bnd[] = {
2982 "bnd0", "bnd1", "bnd2", "bnd3"
2983 };
2984
2985 static const char *att_names_bnd[] = {
2986 "%bnd0", "%bnd1", "%bnd2", "%bnd3"
2987 };
2988
2989 static const char **names_xmm;
2990 static const char *intel_names_xmm[] = {
2991 "xmm0", "xmm1", "xmm2", "xmm3",
2992 "xmm4", "xmm5", "xmm6", "xmm7",
2993 "xmm8", "xmm9", "xmm10", "xmm11",
2994 "xmm12", "xmm13", "xmm14", "xmm15",
2995 "xmm16", "xmm17", "xmm18", "xmm19",
2996 "xmm20", "xmm21", "xmm22", "xmm23",
2997 "xmm24", "xmm25", "xmm26", "xmm27",
2998 "xmm28", "xmm29", "xmm30", "xmm31"
2999 };
3000 static const char *att_names_xmm[] = {
3001 "%xmm0", "%xmm1", "%xmm2", "%xmm3",
3002 "%xmm4", "%xmm5", "%xmm6", "%xmm7",
3003 "%xmm8", "%xmm9", "%xmm10", "%xmm11",
3004 "%xmm12", "%xmm13", "%xmm14", "%xmm15",
3005 "%xmm16", "%xmm17", "%xmm18", "%xmm19",
3006 "%xmm20", "%xmm21", "%xmm22", "%xmm23",
3007 "%xmm24", "%xmm25", "%xmm26", "%xmm27",
3008 "%xmm28", "%xmm29", "%xmm30", "%xmm31"
3009 };
3010
3011 static const char **names_ymm;
3012 static const char *intel_names_ymm[] = {
3013 "ymm0", "ymm1", "ymm2", "ymm3",
3014 "ymm4", "ymm5", "ymm6", "ymm7",
3015 "ymm8", "ymm9", "ymm10", "ymm11",
3016 "ymm12", "ymm13", "ymm14", "ymm15",
3017 "ymm16", "ymm17", "ymm18", "ymm19",
3018 "ymm20", "ymm21", "ymm22", "ymm23",
3019 "ymm24", "ymm25", "ymm26", "ymm27",
3020 "ymm28", "ymm29", "ymm30", "ymm31"
3021 };
3022 static const char *att_names_ymm[] = {
3023 "%ymm0", "%ymm1", "%ymm2", "%ymm3",
3024 "%ymm4", "%ymm5", "%ymm6", "%ymm7",
3025 "%ymm8", "%ymm9", "%ymm10", "%ymm11",
3026 "%ymm12", "%ymm13", "%ymm14", "%ymm15",
3027 "%ymm16", "%ymm17", "%ymm18", "%ymm19",
3028 "%ymm20", "%ymm21", "%ymm22", "%ymm23",
3029 "%ymm24", "%ymm25", "%ymm26", "%ymm27",
3030 "%ymm28", "%ymm29", "%ymm30", "%ymm31"
3031 };
3032
3033 static const char **names_zmm;
3034 static const char *intel_names_zmm[] = {
3035 "zmm0", "zmm1", "zmm2", "zmm3",
3036 "zmm4", "zmm5", "zmm6", "zmm7",
3037 "zmm8", "zmm9", "zmm10", "zmm11",
3038 "zmm12", "zmm13", "zmm14", "zmm15",
3039 "zmm16", "zmm17", "zmm18", "zmm19",
3040 "zmm20", "zmm21", "zmm22", "zmm23",
3041 "zmm24", "zmm25", "zmm26", "zmm27",
3042 "zmm28", "zmm29", "zmm30", "zmm31"
3043 };
3044 static const char *att_names_zmm[] = {
3045 "%zmm0", "%zmm1", "%zmm2", "%zmm3",
3046 "%zmm4", "%zmm5", "%zmm6", "%zmm7",
3047 "%zmm8", "%zmm9", "%zmm10", "%zmm11",
3048 "%zmm12", "%zmm13", "%zmm14", "%zmm15",
3049 "%zmm16", "%zmm17", "%zmm18", "%zmm19",
3050 "%zmm20", "%zmm21", "%zmm22", "%zmm23",
3051 "%zmm24", "%zmm25", "%zmm26", "%zmm27",
3052 "%zmm28", "%zmm29", "%zmm30", "%zmm31"
3053 };
3054
3055 static const char **names_mask;
3056 static const char *intel_names_mask[] = {
3057 "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7"
3058 };
3059 static const char *att_names_mask[] = {
3060 "%k0", "%k1", "%k2", "%k3", "%k4", "%k5", "%k6", "%k7"
3061 };
3062
3063 static const char *names_rounding[] =
3064 {
3065 "{rn-sae}",
3066 "{rd-sae}",
3067 "{ru-sae}",
3068 "{rz-sae}"
3069 };
3070
3071 static const struct dis386 reg_table[][8] = {
3072 /* REG_80 */
3073 {
3074 { "addA", { Ebh1, Ib } },
3075 { "orA", { Ebh1, Ib } },
3076 { "adcA", { Ebh1, Ib } },
3077 { "sbbA", { Ebh1, Ib } },
3078 { "andA", { Ebh1, Ib } },
3079 { "subA", { Ebh1, Ib } },
3080 { "xorA", { Ebh1, Ib } },
3081 { "cmpA", { Eb, Ib } },
3082 },
3083 /* REG_81 */
3084 {
3085 { "addQ", { Evh1, Iv } },
3086 { "orQ", { Evh1, Iv } },
3087 { "adcQ", { Evh1, Iv } },
3088 { "sbbQ", { Evh1, Iv } },
3089 { "andQ", { Evh1, Iv } },
3090 { "subQ", { Evh1, Iv } },
3091 { "xorQ", { Evh1, Iv } },
3092 { "cmpQ", { Ev, Iv } },
3093 },
3094 /* REG_82 */
3095 {
3096 { "addQ", { Evh1, sIb } },
3097 { "orQ", { Evh1, sIb } },
3098 { "adcQ", { Evh1, sIb } },
3099 { "sbbQ", { Evh1, sIb } },
3100 { "andQ", { Evh1, sIb } },
3101 { "subQ", { Evh1, sIb } },
3102 { "xorQ", { Evh1, sIb } },
3103 { "cmpQ", { Ev, sIb } },
3104 },
3105 /* REG_8F */
3106 {
3107 { "popU", { stackEv } },
3108 { XOP_8F_TABLE (XOP_09) },
3109 { Bad_Opcode },
3110 { Bad_Opcode },
3111 { Bad_Opcode },
3112 { XOP_8F_TABLE (XOP_09) },
3113 },
3114 /* REG_C0 */
3115 {
3116 { "rolA", { Eb, Ib } },
3117 { "rorA", { Eb, Ib } },
3118 { "rclA", { Eb, Ib } },
3119 { "rcrA", { Eb, Ib } },
3120 { "shlA", { Eb, Ib } },
3121 { "shrA", { Eb, Ib } },
3122 { Bad_Opcode },
3123 { "sarA", { Eb, Ib } },
3124 },
3125 /* REG_C1 */
3126 {
3127 { "rolQ", { Ev, Ib } },
3128 { "rorQ", { Ev, Ib } },
3129 { "rclQ", { Ev, Ib } },
3130 { "rcrQ", { Ev, Ib } },
3131 { "shlQ", { Ev, Ib } },
3132 { "shrQ", { Ev, Ib } },
3133 { Bad_Opcode },
3134 { "sarQ", { Ev, Ib } },
3135 },
3136 /* REG_C6 */
3137 {
3138 { "movA", { Ebh3, Ib } },
3139 { Bad_Opcode },
3140 { Bad_Opcode },
3141 { Bad_Opcode },
3142 { Bad_Opcode },
3143 { Bad_Opcode },
3144 { Bad_Opcode },
3145 { MOD_TABLE (MOD_C6_REG_7) },
3146 },
3147 /* REG_C7 */
3148 {
3149 { "movQ", { Evh3, Iv } },
3150 { Bad_Opcode },
3151 { Bad_Opcode },
3152 { Bad_Opcode },
3153 { Bad_Opcode },
3154 { Bad_Opcode },
3155 { Bad_Opcode },
3156 { MOD_TABLE (MOD_C7_REG_7) },
3157 },
3158 /* REG_D0 */
3159 {
3160 { "rolA", { Eb, I1 } },
3161 { "rorA", { Eb, I1 } },
3162 { "rclA", { Eb, I1 } },
3163 { "rcrA", { Eb, I1 } },
3164 { "shlA", { Eb, I1 } },
3165 { "shrA", { Eb, I1 } },
3166 { Bad_Opcode },
3167 { "sarA", { Eb, I1 } },
3168 },
3169 /* REG_D1 */
3170 {
3171 { "rolQ", { Ev, I1 } },
3172 { "rorQ", { Ev, I1 } },
3173 { "rclQ", { Ev, I1 } },
3174 { "rcrQ", { Ev, I1 } },
3175 { "shlQ", { Ev, I1 } },
3176 { "shrQ", { Ev, I1 } },
3177 { Bad_Opcode },
3178 { "sarQ", { Ev, I1 } },
3179 },
3180 /* REG_D2 */
3181 {
3182 { "rolA", { Eb, CL } },
3183 { "rorA", { Eb, CL } },
3184 { "rclA", { Eb, CL } },
3185 { "rcrA", { Eb, CL } },
3186 { "shlA", { Eb, CL } },
3187 { "shrA", { Eb, CL } },
3188 { Bad_Opcode },
3189 { "sarA", { Eb, CL } },
3190 },
3191 /* REG_D3 */
3192 {
3193 { "rolQ", { Ev, CL } },
3194 { "rorQ", { Ev, CL } },
3195 { "rclQ", { Ev, CL } },
3196 { "rcrQ", { Ev, CL } },
3197 { "shlQ", { Ev, CL } },
3198 { "shrQ", { Ev, CL } },
3199 { Bad_Opcode },
3200 { "sarQ", { Ev, CL } },
3201 },
3202 /* REG_F6 */
3203 {
3204 { "testA", { Eb, Ib } },
3205 { Bad_Opcode },
3206 { "notA", { Ebh1 } },
3207 { "negA", { Ebh1 } },
3208 { "mulA", { Eb } }, /* Don't print the implicit %al register, */
3209 { "imulA", { Eb } }, /* to distinguish these opcodes from other */
3210 { "divA", { Eb } }, /* mul/imul opcodes. Do the same for div */
3211 { "idivA", { Eb } }, /* and idiv for consistency. */
3212 },
3213 /* REG_F7 */
3214 {
3215 { "testQ", { Ev, Iv } },
3216 { Bad_Opcode },
3217 { "notQ", { Evh1 } },
3218 { "negQ", { Evh1 } },
3219 { "mulQ", { Ev } }, /* Don't print the implicit register. */
3220 { "imulQ", { Ev } },
3221 { "divQ", { Ev } },
3222 { "idivQ", { Ev } },
3223 },
3224 /* REG_FE */
3225 {
3226 { "incA", { Ebh1 } },
3227 { "decA", { Ebh1 } },
3228 },
3229 /* REG_FF */
3230 {
3231 { "incQ", { Evh1 } },
3232 { "decQ", { Evh1 } },
3233 { "call{T|}", { indirEv, BND } },
3234 { MOD_TABLE (MOD_FF_REG_3) },
3235 { "jmp{T|}", { indirEv, BND } },
3236 { MOD_TABLE (MOD_FF_REG_5) },
3237 { "pushU", { stackEv } },
3238 { Bad_Opcode },
3239 },
3240 /* REG_0F00 */
3241 {
3242 { "sldtD", { Sv } },
3243 { "strD", { Sv } },
3244 { "lldt", { Ew } },
3245 { "ltr", { Ew } },
3246 { "verr", { Ew } },
3247 { "verw", { Ew } },
3248 { Bad_Opcode },
3249 { Bad_Opcode },
3250 },
3251 /* REG_0F01 */
3252 {
3253 { MOD_TABLE (MOD_0F01_REG_0) },
3254 { MOD_TABLE (MOD_0F01_REG_1) },
3255 { MOD_TABLE (MOD_0F01_REG_2) },
3256 { MOD_TABLE (MOD_0F01_REG_3) },
3257 { "smswD", { Sv } },
3258 { Bad_Opcode },
3259 { "lmsw", { Ew } },
3260 { MOD_TABLE (MOD_0F01_REG_7) },
3261 },
3262 /* REG_0F0D */
3263 {
3264 { "prefetch", { Mb } },
3265 { "prefetchw", { Mb } },
3266 { "prefetchwt1", { Mb } },
3267 { "prefetch", { Mb } },
3268 { "prefetch", { Mb } },
3269 { "prefetch", { Mb } },
3270 { "prefetch", { Mb } },
3271 { "prefetch", { Mb } },
3272 },
3273 /* REG_0F18 */
3274 {
3275 { MOD_TABLE (MOD_0F18_REG_0) },
3276 { MOD_TABLE (MOD_0F18_REG_1) },
3277 { MOD_TABLE (MOD_0F18_REG_2) },
3278 { MOD_TABLE (MOD_0F18_REG_3) },
3279 { MOD_TABLE (MOD_0F18_REG_4) },
3280 { MOD_TABLE (MOD_0F18_REG_5) },
3281 { MOD_TABLE (MOD_0F18_REG_6) },
3282 { MOD_TABLE (MOD_0F18_REG_7) },
3283 },
3284 /* REG_0F71 */
3285 {
3286 { Bad_Opcode },
3287 { Bad_Opcode },
3288 { MOD_TABLE (MOD_0F71_REG_2) },
3289 { Bad_Opcode },
3290 { MOD_TABLE (MOD_0F71_REG_4) },
3291 { Bad_Opcode },
3292 { MOD_TABLE (MOD_0F71_REG_6) },
3293 },
3294 /* REG_0F72 */
3295 {
3296 { Bad_Opcode },
3297 { Bad_Opcode },
3298 { MOD_TABLE (MOD_0F72_REG_2) },
3299 { Bad_Opcode },
3300 { MOD_TABLE (MOD_0F72_REG_4) },
3301 { Bad_Opcode },
3302 { MOD_TABLE (MOD_0F72_REG_6) },
3303 },
3304 /* REG_0F73 */
3305 {
3306 { Bad_Opcode },
3307 { Bad_Opcode },
3308 { MOD_TABLE (MOD_0F73_REG_2) },
3309 { MOD_TABLE (MOD_0F73_REG_3) },
3310 { Bad_Opcode },
3311 { Bad_Opcode },
3312 { MOD_TABLE (MOD_0F73_REG_6) },
3313 { MOD_TABLE (MOD_0F73_REG_7) },
3314 },
3315 /* REG_0FA6 */
3316 {
3317 { "montmul", { { OP_0f07, 0 } } },
3318 { "xsha1", { { OP_0f07, 0 } } },
3319 { "xsha256", { { OP_0f07, 0 } } },
3320 },
3321 /* REG_0FA7 */
3322 {
3323 { "xstore-rng", { { OP_0f07, 0 } } },
3324 { "xcrypt-ecb", { { OP_0f07, 0 } } },
3325 { "xcrypt-cbc", { { OP_0f07, 0 } } },
3326 { "xcrypt-ctr", { { OP_0f07, 0 } } },
3327 { "xcrypt-cfb", { { OP_0f07, 0 } } },
3328 { "xcrypt-ofb", { { OP_0f07, 0 } } },
3329 },
3330 /* REG_0FAE */
3331 {
3332 { MOD_TABLE (MOD_0FAE_REG_0) },
3333 { MOD_TABLE (MOD_0FAE_REG_1) },
3334 { MOD_TABLE (MOD_0FAE_REG_2) },
3335 { MOD_TABLE (MOD_0FAE_REG_3) },
3336 { MOD_TABLE (MOD_0FAE_REG_4) },
3337 { MOD_TABLE (MOD_0FAE_REG_5) },
3338 { MOD_TABLE (MOD_0FAE_REG_6) },
3339 { MOD_TABLE (MOD_0FAE_REG_7) },
3340 },
3341 /* REG_0FBA */
3342 {
3343 { Bad_Opcode },
3344 { Bad_Opcode },
3345 { Bad_Opcode },
3346 { Bad_Opcode },
3347 { "btQ", { Ev, Ib } },
3348 { "btsQ", { Evh1, Ib } },
3349 { "btrQ", { Evh1, Ib } },
3350 { "btcQ", { Evh1, Ib } },
3351 },
3352 /* REG_0FC7 */
3353 {
3354 { Bad_Opcode },
3355 { "cmpxchg8b", { { CMPXCHG8B_Fixup, q_mode } } },
3356 { Bad_Opcode },
3357 { Bad_Opcode },
3358 { Bad_Opcode },
3359 { Bad_Opcode },
3360 { MOD_TABLE (MOD_0FC7_REG_6) },
3361 { MOD_TABLE (MOD_0FC7_REG_7) },
3362 },
3363 /* REG_VEX_0F71 */
3364 {
3365 { Bad_Opcode },
3366 { Bad_Opcode },
3367 { MOD_TABLE (MOD_VEX_0F71_REG_2) },
3368 { Bad_Opcode },
3369 { MOD_TABLE (MOD_VEX_0F71_REG_4) },
3370 { Bad_Opcode },
3371 { MOD_TABLE (MOD_VEX_0F71_REG_6) },
3372 },
3373 /* REG_VEX_0F72 */
3374 {
3375 { Bad_Opcode },
3376 { Bad_Opcode },
3377 { MOD_TABLE (MOD_VEX_0F72_REG_2) },
3378 { Bad_Opcode },
3379 { MOD_TABLE (MOD_VEX_0F72_REG_4) },
3380 { Bad_Opcode },
3381 { MOD_TABLE (MOD_VEX_0F72_REG_6) },
3382 },
3383 /* REG_VEX_0F73 */
3384 {
3385 { Bad_Opcode },
3386 { Bad_Opcode },
3387 { MOD_TABLE (MOD_VEX_0F73_REG_2) },
3388 { MOD_TABLE (MOD_VEX_0F73_REG_3) },
3389 { Bad_Opcode },
3390 { Bad_Opcode },
3391 { MOD_TABLE (MOD_VEX_0F73_REG_6) },
3392 { MOD_TABLE (MOD_VEX_0F73_REG_7) },
3393 },
3394 /* REG_VEX_0FAE */
3395 {
3396 { Bad_Opcode },
3397 { Bad_Opcode },
3398 { MOD_TABLE (MOD_VEX_0FAE_REG_2) },
3399 { MOD_TABLE (MOD_VEX_0FAE_REG_3) },
3400 },
3401 /* REG_VEX_0F38F3 */
3402 {
3403 { Bad_Opcode },
3404 { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_1) },
3405 { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_2) },
3406 { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_3) },
3407 },
3408 /* REG_XOP_LWPCB */
3409 {
3410 { "llwpcb", { { OP_LWPCB_E, 0 } } },
3411 { "slwpcb", { { OP_LWPCB_E, 0 } } },
3412 },
3413 /* REG_XOP_LWP */
3414 {
3415 { "lwpins", { { OP_LWP_E, 0 }, Ed, Iq } },
3416 { "lwpval", { { OP_LWP_E, 0 }, Ed, Iq } },
3417 },
3418 /* REG_XOP_TBM_01 */
3419 {
3420 { Bad_Opcode },
3421 { "blcfill", { { OP_LWP_E, 0 }, Ev } },
3422 { "blsfill", { { OP_LWP_E, 0 }, Ev } },
3423 { "blcs", { { OP_LWP_E, 0 }, Ev } },
3424 { "tzmsk", { { OP_LWP_E, 0 }, Ev } },
3425 { "blcic", { { OP_LWP_E, 0 }, Ev } },
3426 { "blsic", { { OP_LWP_E, 0 }, Ev } },
3427 { "t1mskc", { { OP_LWP_E, 0 }, Ev } },
3428 },
3429 /* REG_XOP_TBM_02 */
3430 {
3431 { Bad_Opcode },
3432 { "blcmsk", { { OP_LWP_E, 0 }, Ev } },
3433 { Bad_Opcode },
3434 { Bad_Opcode },
3435 { Bad_Opcode },
3436 { Bad_Opcode },
3437 { "blci", { { OP_LWP_E, 0 }, Ev } },
3438 },
3439 #define NEED_REG_TABLE
3440 #include "i386-dis-evex.h"
3441 #undef NEED_REG_TABLE
3442 };
3443
3444 static const struct dis386 prefix_table[][4] = {
3445 /* PREFIX_90 */
3446 {
3447 { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } } },
3448 { "pause", { XX } },
3449 { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } } },
3450 },
3451
3452 /* PREFIX_0F10 */
3453 {
3454 { "movups", { XM, EXx } },
3455 { "movss", { XM, EXd } },
3456 { "movupd", { XM, EXx } },
3457 { "movsd", { XM, EXq } },
3458 },
3459
3460 /* PREFIX_0F11 */
3461 {
3462 { "movups", { EXxS, XM } },
3463 { "movss", { EXdS, XM } },
3464 { "movupd", { EXxS, XM } },
3465 { "movsd", { EXqS, XM } },
3466 },
3467
3468 /* PREFIX_0F12 */
3469 {
3470 { MOD_TABLE (MOD_0F12_PREFIX_0) },
3471 { "movsldup", { XM, EXx } },
3472 { "movlpd", { XM, EXq } },
3473 { "movddup", { XM, EXq } },
3474 },
3475
3476 /* PREFIX_0F16 */
3477 {
3478 { MOD_TABLE (MOD_0F16_PREFIX_0) },
3479 { "movshdup", { XM, EXx } },
3480 { "movhpd", { XM, EXq } },
3481 },
3482
3483 /* PREFIX_0F1A */
3484 {
3485 { MOD_TABLE (MOD_0F1A_PREFIX_0) },
3486 { "bndcl", { Gbnd, Ev_bnd } },
3487 { "bndmov", { Gbnd, Ebnd } },
3488 { "bndcu", { Gbnd, Ev_bnd } },
3489 },
3490
3491 /* PREFIX_0F1B */
3492 {
3493 { MOD_TABLE (MOD_0F1B_PREFIX_0) },
3494 { MOD_TABLE (MOD_0F1B_PREFIX_1) },
3495 { "bndmov", { Ebnd, Gbnd } },
3496 { "bndcn", { Gbnd, Ev_bnd } },
3497 },
3498
3499 /* PREFIX_0F2A */
3500 {
3501 { "cvtpi2ps", { XM, EMCq } },
3502 { "cvtsi2ss%LQ", { XM, Ev } },
3503 { "cvtpi2pd", { XM, EMCq } },
3504 { "cvtsi2sd%LQ", { XM, Ev } },
3505 },
3506
3507 /* PREFIX_0F2B */
3508 {
3509 { MOD_TABLE (MOD_0F2B_PREFIX_0) },
3510 { MOD_TABLE (MOD_0F2B_PREFIX_1) },
3511 { MOD_TABLE (MOD_0F2B_PREFIX_2) },
3512 { MOD_TABLE (MOD_0F2B_PREFIX_3) },
3513 },
3514
3515 /* PREFIX_0F2C */
3516 {
3517 { "cvttps2pi", { MXC, EXq } },
3518 { "cvttss2siY", { Gv, EXd } },
3519 { "cvttpd2pi", { MXC, EXx } },
3520 { "cvttsd2siY", { Gv, EXq } },
3521 },
3522
3523 /* PREFIX_0F2D */
3524 {
3525 { "cvtps2pi", { MXC, EXq } },
3526 { "cvtss2siY", { Gv, EXd } },
3527 { "cvtpd2pi", { MXC, EXx } },
3528 { "cvtsd2siY", { Gv, EXq } },
3529 },
3530
3531 /* PREFIX_0F2E */
3532 {
3533 { "ucomiss",{ XM, EXd } },
3534 { Bad_Opcode },
3535 { "ucomisd",{ XM, EXq } },
3536 },
3537
3538 /* PREFIX_0F2F */
3539 {
3540 { "comiss", { XM, EXd } },
3541 { Bad_Opcode },
3542 { "comisd", { XM, EXq } },
3543 },
3544
3545 /* PREFIX_0F51 */
3546 {
3547 { "sqrtps", { XM, EXx } },
3548 { "sqrtss", { XM, EXd } },
3549 { "sqrtpd", { XM, EXx } },
3550 { "sqrtsd", { XM, EXq } },
3551 },
3552
3553 /* PREFIX_0F52 */
3554 {
3555 { "rsqrtps",{ XM, EXx } },
3556 { "rsqrtss",{ XM, EXd } },
3557 },
3558
3559 /* PREFIX_0F53 */
3560 {
3561 { "rcpps", { XM, EXx } },
3562 { "rcpss", { XM, EXd } },
3563 },
3564
3565 /* PREFIX_0F58 */
3566 {
3567 { "addps", { XM, EXx } },
3568 { "addss", { XM, EXd } },
3569 { "addpd", { XM, EXx } },
3570 { "addsd", { XM, EXq } },
3571 },
3572
3573 /* PREFIX_0F59 */
3574 {
3575 { "mulps", { XM, EXx } },
3576 { "mulss", { XM, EXd } },
3577 { "mulpd", { XM, EXx } },
3578 { "mulsd", { XM, EXq } },
3579 },
3580
3581 /* PREFIX_0F5A */
3582 {
3583 { "cvtps2pd", { XM, EXq } },
3584 { "cvtss2sd", { XM, EXd } },
3585 { "cvtpd2ps", { XM, EXx } },
3586 { "cvtsd2ss", { XM, EXq } },
3587 },
3588
3589 /* PREFIX_0F5B */
3590 {
3591 { "cvtdq2ps", { XM, EXx } },
3592 { "cvttps2dq", { XM, EXx } },
3593 { "cvtps2dq", { XM, EXx } },
3594 },
3595
3596 /* PREFIX_0F5C */
3597 {
3598 { "subps", { XM, EXx } },
3599 { "subss", { XM, EXd } },
3600 { "subpd", { XM, EXx } },
3601 { "subsd", { XM, EXq } },
3602 },
3603
3604 /* PREFIX_0F5D */
3605 {
3606 { "minps", { XM, EXx } },
3607 { "minss", { XM, EXd } },
3608 { "minpd", { XM, EXx } },
3609 { "minsd", { XM, EXq } },
3610 },
3611
3612 /* PREFIX_0F5E */
3613 {
3614 { "divps", { XM, EXx } },
3615 { "divss", { XM, EXd } },
3616 { "divpd", { XM, EXx } },
3617 { "divsd", { XM, EXq } },
3618 },
3619
3620 /* PREFIX_0F5F */
3621 {
3622 { "maxps", { XM, EXx } },
3623 { "maxss", { XM, EXd } },
3624 { "maxpd", { XM, EXx } },
3625 { "maxsd", { XM, EXq } },
3626 },
3627
3628 /* PREFIX_0F60 */
3629 {
3630 { "punpcklbw",{ MX, EMd } },
3631 { Bad_Opcode },
3632 { "punpcklbw",{ MX, EMx } },
3633 },
3634
3635 /* PREFIX_0F61 */
3636 {
3637 { "punpcklwd",{ MX, EMd } },
3638 { Bad_Opcode },
3639 { "punpcklwd",{ MX, EMx } },
3640 },
3641
3642 /* PREFIX_0F62 */
3643 {
3644 { "punpckldq",{ MX, EMd } },
3645 { Bad_Opcode },
3646 { "punpckldq",{ MX, EMx } },
3647 },
3648
3649 /* PREFIX_0F6C */
3650 {
3651 { Bad_Opcode },
3652 { Bad_Opcode },
3653 { "punpcklqdq", { XM, EXx } },
3654 },
3655
3656 /* PREFIX_0F6D */
3657 {
3658 { Bad_Opcode },
3659 { Bad_Opcode },
3660 { "punpckhqdq", { XM, EXx } },
3661 },
3662
3663 /* PREFIX_0F6F */
3664 {
3665 { "movq", { MX, EM } },
3666 { "movdqu", { XM, EXx } },
3667 { "movdqa", { XM, EXx } },
3668 },
3669
3670 /* PREFIX_0F70 */
3671 {
3672 { "pshufw", { MX, EM, Ib } },
3673 { "pshufhw",{ XM, EXx, Ib } },
3674 { "pshufd", { XM, EXx, Ib } },
3675 { "pshuflw",{ XM, EXx, Ib } },
3676 },
3677
3678 /* PREFIX_0F73_REG_3 */
3679 {
3680 { Bad_Opcode },
3681 { Bad_Opcode },
3682 { "psrldq", { XS, Ib } },
3683 },
3684
3685 /* PREFIX_0F73_REG_7 */
3686 {
3687 { Bad_Opcode },
3688 { Bad_Opcode },
3689 { "pslldq", { XS, Ib } },
3690 },
3691
3692 /* PREFIX_0F78 */
3693 {
3694 {"vmread", { Em, Gm } },
3695 { Bad_Opcode },
3696 {"extrq", { XS, Ib, Ib } },
3697 {"insertq", { XM, XS, Ib, Ib } },
3698 },
3699
3700 /* PREFIX_0F79 */
3701 {
3702 {"vmwrite", { Gm, Em } },
3703 { Bad_Opcode },
3704 {"extrq", { XM, XS } },
3705 {"insertq", { XM, XS } },
3706 },
3707
3708 /* PREFIX_0F7C */
3709 {
3710 { Bad_Opcode },
3711 { Bad_Opcode },
3712 { "haddpd", { XM, EXx } },
3713 { "haddps", { XM, EXx } },
3714 },
3715
3716 /* PREFIX_0F7D */
3717 {
3718 { Bad_Opcode },
3719 { Bad_Opcode },
3720 { "hsubpd", { XM, EXx } },
3721 { "hsubps", { XM, EXx } },
3722 },
3723
3724 /* PREFIX_0F7E */
3725 {
3726 { "movK", { Edq, MX } },
3727 { "movq", { XM, EXq } },
3728 { "movK", { Edq, XM } },
3729 },
3730
3731 /* PREFIX_0F7F */
3732 {
3733 { "movq", { EMS, MX } },
3734 { "movdqu", { EXxS, XM } },
3735 { "movdqa", { EXxS, XM } },
3736 },
3737
3738 /* PREFIX_0FAE_REG_0 */
3739 {
3740 { Bad_Opcode },
3741 { "rdfsbase", { Ev } },
3742 },
3743
3744 /* PREFIX_0FAE_REG_1 */
3745 {
3746 { Bad_Opcode },
3747 { "rdgsbase", { Ev } },
3748 },
3749
3750 /* PREFIX_0FAE_REG_2 */
3751 {
3752 { Bad_Opcode },
3753 { "wrfsbase", { Ev } },
3754 },
3755
3756 /* PREFIX_0FAE_REG_3 */
3757 {
3758 { Bad_Opcode },
3759 { "wrgsbase", { Ev } },
3760 },
3761
3762 /* PREFIX_0FB8 */
3763 {
3764 { Bad_Opcode },
3765 { "popcntS", { Gv, Ev } },
3766 },
3767
3768 /* PREFIX_0FBC */
3769 {
3770 { "bsfS", { Gv, Ev } },
3771 { "tzcntS", { Gv, Ev } },
3772 { "bsfS", { Gv, Ev } },
3773 },
3774
3775 /* PREFIX_0FBD */
3776 {
3777 { "bsrS", { Gv, Ev } },
3778 { "lzcntS", { Gv, Ev } },
3779 { "bsrS", { Gv, Ev } },
3780 },
3781
3782 /* PREFIX_0FC2 */
3783 {
3784 { "cmpps", { XM, EXx, CMP } },
3785 { "cmpss", { XM, EXd, CMP } },
3786 { "cmppd", { XM, EXx, CMP } },
3787 { "cmpsd", { XM, EXq, CMP } },
3788 },
3789
3790 /* PREFIX_0FC3 */
3791 {
3792 { "movntiS", { Ma, Gv } },
3793 },
3794
3795 /* PREFIX_0FC7_REG_6 */
3796 {
3797 { "vmptrld",{ Mq } },
3798 { "vmxon", { Mq } },
3799 { "vmclear",{ Mq } },
3800 },
3801
3802 /* PREFIX_0FD0 */
3803 {
3804 { Bad_Opcode },
3805 { Bad_Opcode },
3806 { "addsubpd", { XM, EXx } },
3807 { "addsubps", { XM, EXx } },
3808 },
3809
3810 /* PREFIX_0FD6 */
3811 {
3812 { Bad_Opcode },
3813 { "movq2dq",{ XM, MS } },
3814 { "movq", { EXqS, XM } },
3815 { "movdq2q",{ MX, XS } },
3816 },
3817
3818 /* PREFIX_0FE6 */
3819 {
3820 { Bad_Opcode },
3821 { "cvtdq2pd", { XM, EXq } },
3822 { "cvttpd2dq", { XM, EXx } },
3823 { "cvtpd2dq", { XM, EXx } },
3824 },
3825
3826 /* PREFIX_0FE7 */
3827 {
3828 { "movntq", { Mq, MX } },
3829 { Bad_Opcode },
3830 { MOD_TABLE (MOD_0FE7_PREFIX_2) },
3831 },
3832
3833 /* PREFIX_0FF0 */
3834 {
3835 { Bad_Opcode },
3836 { Bad_Opcode },
3837 { Bad_Opcode },
3838 { MOD_TABLE (MOD_0FF0_PREFIX_3) },
3839 },
3840
3841 /* PREFIX_0FF7 */
3842 {
3843 { "maskmovq", { MX, MS } },
3844 { Bad_Opcode },
3845 { "maskmovdqu", { XM, XS } },
3846 },
3847
3848 /* PREFIX_0F3810 */
3849 {
3850 { Bad_Opcode },
3851 { Bad_Opcode },
3852 { "pblendvb", { XM, EXx, XMM0 } },
3853 },
3854
3855 /* PREFIX_0F3814 */
3856 {
3857 { Bad_Opcode },
3858 { Bad_Opcode },
3859 { "blendvps", { XM, EXx, XMM0 } },
3860 },
3861
3862 /* PREFIX_0F3815 */
3863 {
3864 { Bad_Opcode },
3865 { Bad_Opcode },
3866 { "blendvpd", { XM, EXx, XMM0 } },
3867 },
3868
3869 /* PREFIX_0F3817 */
3870 {
3871 { Bad_Opcode },
3872 { Bad_Opcode },
3873 { "ptest", { XM, EXx } },
3874 },
3875
3876 /* PREFIX_0F3820 */
3877 {
3878 { Bad_Opcode },
3879 { Bad_Opcode },
3880 { "pmovsxbw", { XM, EXq } },
3881 },
3882
3883 /* PREFIX_0F3821 */
3884 {
3885 { Bad_Opcode },
3886 { Bad_Opcode },
3887 { "pmovsxbd", { XM, EXd } },
3888 },
3889
3890 /* PREFIX_0F3822 */
3891 {
3892 { Bad_Opcode },
3893 { Bad_Opcode },
3894 { "pmovsxbq", { XM, EXw } },
3895 },
3896
3897 /* PREFIX_0F3823 */
3898 {
3899 { Bad_Opcode },
3900 { Bad_Opcode },
3901 { "pmovsxwd", { XM, EXq } },
3902 },
3903
3904 /* PREFIX_0F3824 */
3905 {
3906 { Bad_Opcode },
3907 { Bad_Opcode },
3908 { "pmovsxwq", { XM, EXd } },
3909 },
3910
3911 /* PREFIX_0F3825 */
3912 {
3913 { Bad_Opcode },
3914 { Bad_Opcode },
3915 { "pmovsxdq", { XM, EXq } },
3916 },
3917
3918 /* PREFIX_0F3828 */
3919 {
3920 { Bad_Opcode },
3921 { Bad_Opcode },
3922 { "pmuldq", { XM, EXx } },
3923 },
3924
3925 /* PREFIX_0F3829 */
3926 {
3927 { Bad_Opcode },
3928 { Bad_Opcode },
3929 { "pcmpeqq", { XM, EXx } },
3930 },
3931
3932 /* PREFIX_0F382A */
3933 {
3934 { Bad_Opcode },
3935 { Bad_Opcode },
3936 { MOD_TABLE (MOD_0F382A_PREFIX_2) },
3937 },
3938
3939 /* PREFIX_0F382B */
3940 {
3941 { Bad_Opcode },
3942 { Bad_Opcode },
3943 { "packusdw", { XM, EXx } },
3944 },
3945
3946 /* PREFIX_0F3830 */
3947 {
3948 { Bad_Opcode },
3949 { Bad_Opcode },
3950 { "pmovzxbw", { XM, EXq } },
3951 },
3952
3953 /* PREFIX_0F3831 */
3954 {
3955 { Bad_Opcode },
3956 { Bad_Opcode },
3957 { "pmovzxbd", { XM, EXd } },
3958 },
3959
3960 /* PREFIX_0F3832 */
3961 {
3962 { Bad_Opcode },
3963 { Bad_Opcode },
3964 { "pmovzxbq", { XM, EXw } },
3965 },
3966
3967 /* PREFIX_0F3833 */
3968 {
3969 { Bad_Opcode },
3970 { Bad_Opcode },
3971 { "pmovzxwd", { XM, EXq } },
3972 },
3973
3974 /* PREFIX_0F3834 */
3975 {
3976 { Bad_Opcode },
3977 { Bad_Opcode },
3978 { "pmovzxwq", { XM, EXd } },
3979 },
3980
3981 /* PREFIX_0F3835 */
3982 {
3983 { Bad_Opcode },
3984 { Bad_Opcode },
3985 { "pmovzxdq", { XM, EXq } },
3986 },
3987
3988 /* PREFIX_0F3837 */
3989 {
3990 { Bad_Opcode },
3991 { Bad_Opcode },
3992 { "pcmpgtq", { XM, EXx } },
3993 },
3994
3995 /* PREFIX_0F3838 */
3996 {
3997 { Bad_Opcode },
3998 { Bad_Opcode },
3999 { "pminsb", { XM, EXx } },
4000 },
4001
4002 /* PREFIX_0F3839 */
4003 {
4004 { Bad_Opcode },
4005 { Bad_Opcode },
4006 { "pminsd", { XM, EXx } },
4007 },
4008
4009 /* PREFIX_0F383A */
4010 {
4011 { Bad_Opcode },
4012 { Bad_Opcode },
4013 { "pminuw", { XM, EXx } },
4014 },
4015
4016 /* PREFIX_0F383B */
4017 {
4018 { Bad_Opcode },
4019 { Bad_Opcode },
4020 { "pminud", { XM, EXx } },
4021 },
4022
4023 /* PREFIX_0F383C */
4024 {
4025 { Bad_Opcode },
4026 { Bad_Opcode },
4027 { "pmaxsb", { XM, EXx } },
4028 },
4029
4030 /* PREFIX_0F383D */
4031 {
4032 { Bad_Opcode },
4033 { Bad_Opcode },
4034 { "pmaxsd", { XM, EXx } },
4035 },
4036
4037 /* PREFIX_0F383E */
4038 {
4039 { Bad_Opcode },
4040 { Bad_Opcode },
4041 { "pmaxuw", { XM, EXx } },
4042 },
4043
4044 /* PREFIX_0F383F */
4045 {
4046 { Bad_Opcode },
4047 { Bad_Opcode },
4048 { "pmaxud", { XM, EXx } },
4049 },
4050
4051 /* PREFIX_0F3840 */
4052 {
4053 { Bad_Opcode },
4054 { Bad_Opcode },
4055 { "pmulld", { XM, EXx } },
4056 },
4057
4058 /* PREFIX_0F3841 */
4059 {
4060 { Bad_Opcode },
4061 { Bad_Opcode },
4062 { "phminposuw", { XM, EXx } },
4063 },
4064
4065 /* PREFIX_0F3880 */
4066 {
4067 { Bad_Opcode },
4068 { Bad_Opcode },
4069 { "invept", { Gm, Mo } },
4070 },
4071
4072 /* PREFIX_0F3881 */
4073 {
4074 { Bad_Opcode },
4075 { Bad_Opcode },
4076 { "invvpid", { Gm, Mo } },
4077 },
4078
4079 /* PREFIX_0F3882 */
4080 {
4081 { Bad_Opcode },
4082 { Bad_Opcode },
4083 { "invpcid", { Gm, M } },
4084 },
4085
4086 /* PREFIX_0F38C8 */
4087 {
4088 { "sha1nexte", { XM, EXxmm } },
4089 },
4090
4091 /* PREFIX_0F38C9 */
4092 {
4093 { "sha1msg1", { XM, EXxmm } },
4094 },
4095
4096 /* PREFIX_0F38CA */
4097 {
4098 { "sha1msg2", { XM, EXxmm } },
4099 },
4100
4101 /* PREFIX_0F38CB */
4102 {
4103 { "sha256rnds2", { XM, EXxmm, XMM0 } },
4104 },
4105
4106 /* PREFIX_0F38CC */
4107 {
4108 { "sha256msg1", { XM, EXxmm } },
4109 },
4110
4111 /* PREFIX_0F38CD */
4112 {
4113 { "sha256msg2", { XM, EXxmm } },
4114 },
4115
4116 /* PREFIX_0F38DB */
4117 {
4118 { Bad_Opcode },
4119 { Bad_Opcode },
4120 { "aesimc", { XM, EXx } },
4121 },
4122
4123 /* PREFIX_0F38DC */
4124 {
4125 { Bad_Opcode },
4126 { Bad_Opcode },
4127 { "aesenc", { XM, EXx } },
4128 },
4129
4130 /* PREFIX_0F38DD */
4131 {
4132 { Bad_Opcode },
4133 { Bad_Opcode },
4134 { "aesenclast", { XM, EXx } },
4135 },
4136
4137 /* PREFIX_0F38DE */
4138 {
4139 { Bad_Opcode },
4140 { Bad_Opcode },
4141 { "aesdec", { XM, EXx } },
4142 },
4143
4144 /* PREFIX_0F38DF */
4145 {
4146 { Bad_Opcode },
4147 { Bad_Opcode },
4148 { "aesdeclast", { XM, EXx } },
4149 },
4150
4151 /* PREFIX_0F38F0 */
4152 {
4153 { "movbeS", { Gv, { MOVBE_Fixup, v_mode } } },
4154 { Bad_Opcode },
4155 { "movbeS", { Gv, { MOVBE_Fixup, v_mode } } },
4156 { "crc32", { Gdq, { CRC32_Fixup, b_mode } } },
4157 },
4158
4159 /* PREFIX_0F38F1 */
4160 {
4161 { "movbeS", { { MOVBE_Fixup, v_mode }, Gv } },
4162 { Bad_Opcode },
4163 { "movbeS", { { MOVBE_Fixup, v_mode }, Gv } },
4164 { "crc32", { Gdq, { CRC32_Fixup, v_mode } } },
4165 },
4166
4167 /* PREFIX_0F38F6 */
4168 {
4169 { Bad_Opcode },
4170 { "adoxS", { Gdq, Edq} },
4171 { "adcxS", { Gdq, Edq} },
4172 { Bad_Opcode },
4173 },
4174
4175 /* PREFIX_0F3A08 */
4176 {
4177 { Bad_Opcode },
4178 { Bad_Opcode },
4179 { "roundps", { XM, EXx, Ib } },
4180 },
4181
4182 /* PREFIX_0F3A09 */
4183 {
4184 { Bad_Opcode },
4185 { Bad_Opcode },
4186 { "roundpd", { XM, EXx, Ib } },
4187 },
4188
4189 /* PREFIX_0F3A0A */
4190 {
4191 { Bad_Opcode },
4192 { Bad_Opcode },
4193 { "roundss", { XM, EXd, Ib } },
4194 },
4195
4196 /* PREFIX_0F3A0B */
4197 {
4198 { Bad_Opcode },
4199 { Bad_Opcode },
4200 { "roundsd", { XM, EXq, Ib } },
4201 },
4202
4203 /* PREFIX_0F3A0C */
4204 {
4205 { Bad_Opcode },
4206 { Bad_Opcode },
4207 { "blendps", { XM, EXx, Ib } },
4208 },
4209
4210 /* PREFIX_0F3A0D */
4211 {
4212 { Bad_Opcode },
4213 { Bad_Opcode },
4214 { "blendpd", { XM, EXx, Ib } },
4215 },
4216
4217 /* PREFIX_0F3A0E */
4218 {
4219 { Bad_Opcode },
4220 { Bad_Opcode },
4221 { "pblendw", { XM, EXx, Ib } },
4222 },
4223
4224 /* PREFIX_0F3A14 */
4225 {
4226 { Bad_Opcode },
4227 { Bad_Opcode },
4228 { "pextrb", { Edqb, XM, Ib } },
4229 },
4230
4231 /* PREFIX_0F3A15 */
4232 {
4233 { Bad_Opcode },
4234 { Bad_Opcode },
4235 { "pextrw", { Edqw, XM, Ib } },
4236 },
4237
4238 /* PREFIX_0F3A16 */
4239 {
4240 { Bad_Opcode },
4241 { Bad_Opcode },
4242 { "pextrK", { Edq, XM, Ib } },
4243 },
4244
4245 /* PREFIX_0F3A17 */
4246 {
4247 { Bad_Opcode },
4248 { Bad_Opcode },
4249 { "extractps", { Edqd, XM, Ib } },
4250 },
4251
4252 /* PREFIX_0F3A20 */
4253 {
4254 { Bad_Opcode },
4255 { Bad_Opcode },
4256 { "pinsrb", { XM, Edqb, Ib } },
4257 },
4258
4259 /* PREFIX_0F3A21 */
4260 {
4261 { Bad_Opcode },
4262 { Bad_Opcode },
4263 { "insertps", { XM, EXd, Ib } },
4264 },
4265
4266 /* PREFIX_0F3A22 */
4267 {
4268 { Bad_Opcode },
4269 { Bad_Opcode },
4270 { "pinsrK", { XM, Edq, Ib } },
4271 },
4272
4273 /* PREFIX_0F3A40 */
4274 {
4275 { Bad_Opcode },
4276 { Bad_Opcode },
4277 { "dpps", { XM, EXx, Ib } },
4278 },
4279
4280 /* PREFIX_0F3A41 */
4281 {
4282 { Bad_Opcode },
4283 { Bad_Opcode },
4284 { "dppd", { XM, EXx, Ib } },
4285 },
4286
4287 /* PREFIX_0F3A42 */
4288 {
4289 { Bad_Opcode },
4290 { Bad_Opcode },
4291 { "mpsadbw", { XM, EXx, Ib } },
4292 },
4293
4294 /* PREFIX_0F3A44 */
4295 {
4296 { Bad_Opcode },
4297 { Bad_Opcode },
4298 { "pclmulqdq", { XM, EXx, PCLMUL } },
4299 },
4300
4301 /* PREFIX_0F3A60 */
4302 {
4303 { Bad_Opcode },
4304 { Bad_Opcode },
4305 { "pcmpestrm", { XM, EXx, Ib } },
4306 },
4307
4308 /* PREFIX_0F3A61 */
4309 {
4310 { Bad_Opcode },
4311 { Bad_Opcode },
4312 { "pcmpestri", { XM, EXx, Ib } },
4313 },
4314
4315 /* PREFIX_0F3A62 */
4316 {
4317 { Bad_Opcode },
4318 { Bad_Opcode },
4319 { "pcmpistrm", { XM, EXx, Ib } },
4320 },
4321
4322 /* PREFIX_0F3A63 */
4323 {
4324 { Bad_Opcode },
4325 { Bad_Opcode },
4326 { "pcmpistri", { XM, EXx, Ib } },
4327 },
4328
4329 /* PREFIX_0F3ACC */
4330 {
4331 { "sha1rnds4", { XM, EXxmm, Ib } },
4332 },
4333
4334 /* PREFIX_0F3ADF */
4335 {
4336 { Bad_Opcode },
4337 { Bad_Opcode },
4338 { "aeskeygenassist", { XM, EXx, Ib } },
4339 },
4340
4341 /* PREFIX_VEX_0F10 */
4342 {
4343 { VEX_W_TABLE (VEX_W_0F10_P_0) },
4344 { VEX_LEN_TABLE (VEX_LEN_0F10_P_1) },
4345 { VEX_W_TABLE (VEX_W_0F10_P_2) },
4346 { VEX_LEN_TABLE (VEX_LEN_0F10_P_3) },
4347 },
4348
4349 /* PREFIX_VEX_0F11 */
4350 {
4351 { VEX_W_TABLE (VEX_W_0F11_P_0) },
4352 { VEX_LEN_TABLE (VEX_LEN_0F11_P_1) },
4353 { VEX_W_TABLE (VEX_W_0F11_P_2) },
4354 { VEX_LEN_TABLE (VEX_LEN_0F11_P_3) },
4355 },
4356
4357 /* PREFIX_VEX_0F12 */
4358 {
4359 { MOD_TABLE (MOD_VEX_0F12_PREFIX_0) },
4360 { VEX_W_TABLE (VEX_W_0F12_P_1) },
4361 { VEX_LEN_TABLE (VEX_LEN_0F12_P_2) },
4362 { VEX_W_TABLE (VEX_W_0F12_P_3) },
4363 },
4364
4365 /* PREFIX_VEX_0F16 */
4366 {
4367 { MOD_TABLE (MOD_VEX_0F16_PREFIX_0) },
4368 { VEX_W_TABLE (VEX_W_0F16_P_1) },
4369 { VEX_LEN_TABLE (VEX_LEN_0F16_P_2) },
4370 },
4371
4372 /* PREFIX_VEX_0F2A */
4373 {
4374 { Bad_Opcode },
4375 { VEX_LEN_TABLE (VEX_LEN_0F2A_P_1) },
4376 { Bad_Opcode },
4377 { VEX_LEN_TABLE (VEX_LEN_0F2A_P_3) },
4378 },
4379
4380 /* PREFIX_VEX_0F2C */
4381 {
4382 { Bad_Opcode },
4383 { VEX_LEN_TABLE (VEX_LEN_0F2C_P_1) },
4384 { Bad_Opcode },
4385 { VEX_LEN_TABLE (VEX_LEN_0F2C_P_3) },
4386 },
4387
4388 /* PREFIX_VEX_0F2D */
4389 {
4390 { Bad_Opcode },
4391 { VEX_LEN_TABLE (VEX_LEN_0F2D_P_1) },
4392 { Bad_Opcode },
4393 { VEX_LEN_TABLE (VEX_LEN_0F2D_P_3) },
4394 },
4395
4396 /* PREFIX_VEX_0F2E */
4397 {
4398 { VEX_LEN_TABLE (VEX_LEN_0F2E_P_0) },
4399 { Bad_Opcode },
4400 { VEX_LEN_TABLE (VEX_LEN_0F2E_P_2) },
4401 },
4402
4403 /* PREFIX_VEX_0F2F */
4404 {
4405 { VEX_LEN_TABLE (VEX_LEN_0F2F_P_0) },
4406 { Bad_Opcode },
4407 { VEX_LEN_TABLE (VEX_LEN_0F2F_P_2) },
4408 },
4409
4410 /* PREFIX_VEX_0F41 */
4411 {
4412 { VEX_LEN_TABLE (VEX_LEN_0F41_P_0) },
4413 },
4414
4415 /* PREFIX_VEX_0F42 */
4416 {
4417 { VEX_LEN_TABLE (VEX_LEN_0F42_P_0) },
4418 },
4419
4420 /* PREFIX_VEX_0F44 */
4421 {
4422 { VEX_LEN_TABLE (VEX_LEN_0F44_P_0) },
4423 },
4424
4425 /* PREFIX_VEX_0F45 */
4426 {
4427 { VEX_LEN_TABLE (VEX_LEN_0F45_P_0) },
4428 },
4429
4430 /* PREFIX_VEX_0F46 */
4431 {
4432 { VEX_LEN_TABLE (VEX_LEN_0F46_P_0) },
4433 },
4434
4435 /* PREFIX_VEX_0F47 */
4436 {
4437 { VEX_LEN_TABLE (VEX_LEN_0F47_P_0) },
4438 },
4439
4440 /* PREFIX_VEX_0F4B */
4441 {
4442 { Bad_Opcode },
4443 { Bad_Opcode },
4444 { VEX_LEN_TABLE (VEX_LEN_0F4B_P_2) },
4445 },
4446
4447 /* PREFIX_VEX_0F51 */
4448 {
4449 { VEX_W_TABLE (VEX_W_0F51_P_0) },
4450 { VEX_LEN_TABLE (VEX_LEN_0F51_P_1) },
4451 { VEX_W_TABLE (VEX_W_0F51_P_2) },
4452 { VEX_LEN_TABLE (VEX_LEN_0F51_P_3) },
4453 },
4454
4455 /* PREFIX_VEX_0F52 */
4456 {
4457 { VEX_W_TABLE (VEX_W_0F52_P_0) },
4458 { VEX_LEN_TABLE (VEX_LEN_0F52_P_1) },
4459 },
4460
4461 /* PREFIX_VEX_0F53 */
4462 {
4463 { VEX_W_TABLE (VEX_W_0F53_P_0) },
4464 { VEX_LEN_TABLE (VEX_LEN_0F53_P_1) },
4465 },
4466
4467 /* PREFIX_VEX_0F58 */
4468 {
4469 { VEX_W_TABLE (VEX_W_0F58_P_0) },
4470 { VEX_LEN_TABLE (VEX_LEN_0F58_P_1) },
4471 { VEX_W_TABLE (VEX_W_0F58_P_2) },
4472 { VEX_LEN_TABLE (VEX_LEN_0F58_P_3) },
4473 },
4474
4475 /* PREFIX_VEX_0F59 */
4476 {
4477 { VEX_W_TABLE (VEX_W_0F59_P_0) },
4478 { VEX_LEN_TABLE (VEX_LEN_0F59_P_1) },
4479 { VEX_W_TABLE (VEX_W_0F59_P_2) },
4480 { VEX_LEN_TABLE (VEX_LEN_0F59_P_3) },
4481 },
4482
4483 /* PREFIX_VEX_0F5A */
4484 {
4485 { VEX_W_TABLE (VEX_W_0F5A_P_0) },
4486 { VEX_LEN_TABLE (VEX_LEN_0F5A_P_1) },
4487 { "vcvtpd2ps%XY", { XMM, EXx } },
4488 { VEX_LEN_TABLE (VEX_LEN_0F5A_P_3) },
4489 },
4490
4491 /* PREFIX_VEX_0F5B */
4492 {
4493 { VEX_W_TABLE (VEX_W_0F5B_P_0) },
4494 { VEX_W_TABLE (VEX_W_0F5B_P_1) },
4495 { VEX_W_TABLE (VEX_W_0F5B_P_2) },
4496 },
4497
4498 /* PREFIX_VEX_0F5C */
4499 {
4500 { VEX_W_TABLE (VEX_W_0F5C_P_0) },
4501 { VEX_LEN_TABLE (VEX_LEN_0F5C_P_1) },
4502 { VEX_W_TABLE (VEX_W_0F5C_P_2) },
4503 { VEX_LEN_TABLE (VEX_LEN_0F5C_P_3) },
4504 },
4505
4506 /* PREFIX_VEX_0F5D */
4507 {
4508 { VEX_W_TABLE (VEX_W_0F5D_P_0) },
4509 { VEX_LEN_TABLE (VEX_LEN_0F5D_P_1) },
4510 { VEX_W_TABLE (VEX_W_0F5D_P_2) },
4511 { VEX_LEN_TABLE (VEX_LEN_0F5D_P_3) },
4512 },
4513
4514 /* PREFIX_VEX_0F5E */
4515 {
4516 { VEX_W_TABLE (VEX_W_0F5E_P_0) },
4517 { VEX_LEN_TABLE (VEX_LEN_0F5E_P_1) },
4518 { VEX_W_TABLE (VEX_W_0F5E_P_2) },
4519 { VEX_LEN_TABLE (VEX_LEN_0F5E_P_3) },
4520 },
4521
4522 /* PREFIX_VEX_0F5F */
4523 {
4524 { VEX_W_TABLE (VEX_W_0F5F_P_0) },
4525 { VEX_LEN_TABLE (VEX_LEN_0F5F_P_1) },
4526 { VEX_W_TABLE (VEX_W_0F5F_P_2) },
4527 { VEX_LEN_TABLE (VEX_LEN_0F5F_P_3) },
4528 },
4529
4530 /* PREFIX_VEX_0F60 */
4531 {
4532 { Bad_Opcode },
4533 { Bad_Opcode },
4534 { VEX_W_TABLE (VEX_W_0F60_P_2) },
4535 },
4536
4537 /* PREFIX_VEX_0F61 */
4538 {
4539 { Bad_Opcode },
4540 { Bad_Opcode },
4541 { VEX_W_TABLE (VEX_W_0F61_P_2) },
4542 },
4543
4544 /* PREFIX_VEX_0F62 */
4545 {
4546 { Bad_Opcode },
4547 { Bad_Opcode },
4548 { VEX_W_TABLE (VEX_W_0F62_P_2) },
4549 },
4550
4551 /* PREFIX_VEX_0F63 */
4552 {
4553 { Bad_Opcode },
4554 { Bad_Opcode },
4555 { VEX_W_TABLE (VEX_W_0F63_P_2) },
4556 },
4557
4558 /* PREFIX_VEX_0F64 */
4559 {
4560 { Bad_Opcode },
4561 { Bad_Opcode },
4562 { VEX_W_TABLE (VEX_W_0F64_P_2) },
4563 },
4564
4565 /* PREFIX_VEX_0F65 */
4566 {
4567 { Bad_Opcode },
4568 { Bad_Opcode },
4569 { VEX_W_TABLE (VEX_W_0F65_P_2) },
4570 },
4571
4572 /* PREFIX_VEX_0F66 */
4573 {
4574 { Bad_Opcode },
4575 { Bad_Opcode },
4576 { VEX_W_TABLE (VEX_W_0F66_P_2) },
4577 },
4578
4579 /* PREFIX_VEX_0F67 */
4580 {
4581 { Bad_Opcode },
4582 { Bad_Opcode },
4583 { VEX_W_TABLE (VEX_W_0F67_P_2) },
4584 },
4585
4586 /* PREFIX_VEX_0F68 */
4587 {
4588 { Bad_Opcode },
4589 { Bad_Opcode },
4590 { VEX_W_TABLE (VEX_W_0F68_P_2) },
4591 },
4592
4593 /* PREFIX_VEX_0F69 */
4594 {
4595 { Bad_Opcode },
4596 { Bad_Opcode },
4597 { VEX_W_TABLE (VEX_W_0F69_P_2) },
4598 },
4599
4600 /* PREFIX_VEX_0F6A */
4601 {
4602 { Bad_Opcode },
4603 { Bad_Opcode },
4604 { VEX_W_TABLE (VEX_W_0F6A_P_2) },
4605 },
4606
4607 /* PREFIX_VEX_0F6B */
4608 {
4609 { Bad_Opcode },
4610 { Bad_Opcode },
4611 { VEX_W_TABLE (VEX_W_0F6B_P_2) },
4612 },
4613
4614 /* PREFIX_VEX_0F6C */
4615 {
4616 { Bad_Opcode },
4617 { Bad_Opcode },
4618 { VEX_W_TABLE (VEX_W_0F6C_P_2) },
4619 },
4620
4621 /* PREFIX_VEX_0F6D */
4622 {
4623 { Bad_Opcode },
4624 { Bad_Opcode },
4625 { VEX_W_TABLE (VEX_W_0F6D_P_2) },
4626 },
4627
4628 /* PREFIX_VEX_0F6E */
4629 {
4630 { Bad_Opcode },
4631 { Bad_Opcode },
4632 { VEX_LEN_TABLE (VEX_LEN_0F6E_P_2) },
4633 },
4634
4635 /* PREFIX_VEX_0F6F */
4636 {
4637 { Bad_Opcode },
4638 { VEX_W_TABLE (VEX_W_0F6F_P_1) },
4639 { VEX_W_TABLE (VEX_W_0F6F_P_2) },
4640 },
4641
4642 /* PREFIX_VEX_0F70 */
4643 {
4644 { Bad_Opcode },
4645 { VEX_W_TABLE (VEX_W_0F70_P_1) },
4646 { VEX_W_TABLE (VEX_W_0F70_P_2) },
4647 { VEX_W_TABLE (VEX_W_0F70_P_3) },
4648 },
4649
4650 /* PREFIX_VEX_0F71_REG_2 */
4651 {
4652 { Bad_Opcode },
4653 { Bad_Opcode },
4654 { VEX_W_TABLE (VEX_W_0F71_R_2_P_2) },
4655 },
4656
4657 /* PREFIX_VEX_0F71_REG_4 */
4658 {
4659 { Bad_Opcode },
4660 { Bad_Opcode },
4661 { VEX_W_TABLE (VEX_W_0F71_R_4_P_2) },
4662 },
4663
4664 /* PREFIX_VEX_0F71_REG_6 */
4665 {
4666 { Bad_Opcode },
4667 { Bad_Opcode },
4668 { VEX_W_TABLE (VEX_W_0F71_R_6_P_2) },
4669 },
4670
4671 /* PREFIX_VEX_0F72_REG_2 */
4672 {
4673 { Bad_Opcode },
4674 { Bad_Opcode },
4675 { VEX_W_TABLE (VEX_W_0F72_R_2_P_2) },
4676 },
4677
4678 /* PREFIX_VEX_0F72_REG_4 */
4679 {
4680 { Bad_Opcode },
4681 { Bad_Opcode },
4682 { VEX_W_TABLE (VEX_W_0F72_R_4_P_2) },
4683 },
4684
4685 /* PREFIX_VEX_0F72_REG_6 */
4686 {
4687 { Bad_Opcode },
4688 { Bad_Opcode },
4689 { VEX_W_TABLE (VEX_W_0F72_R_6_P_2) },
4690 },
4691
4692 /* PREFIX_VEX_0F73_REG_2 */
4693 {
4694 { Bad_Opcode },
4695 { Bad_Opcode },
4696 { VEX_W_TABLE (VEX_W_0F73_R_2_P_2) },
4697 },
4698
4699 /* PREFIX_VEX_0F73_REG_3 */
4700 {
4701 { Bad_Opcode },
4702 { Bad_Opcode },
4703 { VEX_W_TABLE (VEX_W_0F73_R_3_P_2) },
4704 },
4705
4706 /* PREFIX_VEX_0F73_REG_6 */
4707 {
4708 { Bad_Opcode },
4709 { Bad_Opcode },
4710 { VEX_W_TABLE (VEX_W_0F73_R_6_P_2) },
4711 },
4712
4713 /* PREFIX_VEX_0F73_REG_7 */
4714 {
4715 { Bad_Opcode },
4716 { Bad_Opcode },
4717 { VEX_W_TABLE (VEX_W_0F73_R_7_P_2) },
4718 },
4719
4720 /* PREFIX_VEX_0F74 */
4721 {
4722 { Bad_Opcode },
4723 { Bad_Opcode },
4724 { VEX_W_TABLE (VEX_W_0F74_P_2) },
4725 },
4726
4727 /* PREFIX_VEX_0F75 */
4728 {
4729 { Bad_Opcode },
4730 { Bad_Opcode },
4731 { VEX_W_TABLE (VEX_W_0F75_P_2) },
4732 },
4733
4734 /* PREFIX_VEX_0F76 */
4735 {
4736 { Bad_Opcode },
4737 { Bad_Opcode },
4738 { VEX_W_TABLE (VEX_W_0F76_P_2) },
4739 },
4740
4741 /* PREFIX_VEX_0F77 */
4742 {
4743 { VEX_W_TABLE (VEX_W_0F77_P_0) },
4744 },
4745
4746 /* PREFIX_VEX_0F7C */
4747 {
4748 { Bad_Opcode },
4749 { Bad_Opcode },
4750 { VEX_W_TABLE (VEX_W_0F7C_P_2) },
4751 { VEX_W_TABLE (VEX_W_0F7C_P_3) },
4752 },
4753
4754 /* PREFIX_VEX_0F7D */
4755 {
4756 { Bad_Opcode },
4757 { Bad_Opcode },
4758 { VEX_W_TABLE (VEX_W_0F7D_P_2) },
4759 { VEX_W_TABLE (VEX_W_0F7D_P_3) },
4760 },
4761
4762 /* PREFIX_VEX_0F7E */
4763 {
4764 { Bad_Opcode },
4765 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_1) },
4766 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_2) },
4767 },
4768
4769 /* PREFIX_VEX_0F7F */
4770 {
4771 { Bad_Opcode },
4772 { VEX_W_TABLE (VEX_W_0F7F_P_1) },
4773 { VEX_W_TABLE (VEX_W_0F7F_P_2) },
4774 },
4775
4776 /* PREFIX_VEX_0F90 */
4777 {
4778 { VEX_LEN_TABLE (VEX_LEN_0F90_P_0) },
4779 },
4780
4781 /* PREFIX_VEX_0F91 */
4782 {
4783 { VEX_LEN_TABLE (VEX_LEN_0F91_P_0) },
4784 },
4785
4786 /* PREFIX_VEX_0F92 */
4787 {
4788 { VEX_LEN_TABLE (VEX_LEN_0F92_P_0) },
4789 },
4790
4791 /* PREFIX_VEX_0F93 */
4792 {
4793 { VEX_LEN_TABLE (VEX_LEN_0F93_P_0) },
4794 },
4795
4796 /* PREFIX_VEX_0F98 */
4797 {
4798 { VEX_LEN_TABLE (VEX_LEN_0F98_P_0) },
4799 },
4800
4801 /* PREFIX_VEX_0FC2 */
4802 {
4803 { VEX_W_TABLE (VEX_W_0FC2_P_0) },
4804 { VEX_LEN_TABLE (VEX_LEN_0FC2_P_1) },
4805 { VEX_W_TABLE (VEX_W_0FC2_P_2) },
4806 { VEX_LEN_TABLE (VEX_LEN_0FC2_P_3) },
4807 },
4808
4809 /* PREFIX_VEX_0FC4 */
4810 {
4811 { Bad_Opcode },
4812 { Bad_Opcode },
4813 { VEX_LEN_TABLE (VEX_LEN_0FC4_P_2) },
4814 },
4815
4816 /* PREFIX_VEX_0FC5 */
4817 {
4818 { Bad_Opcode },
4819 { Bad_Opcode },
4820 { VEX_LEN_TABLE (VEX_LEN_0FC5_P_2) },
4821 },
4822
4823 /* PREFIX_VEX_0FD0 */
4824 {
4825 { Bad_Opcode },
4826 { Bad_Opcode },
4827 { VEX_W_TABLE (VEX_W_0FD0_P_2) },
4828 { VEX_W_TABLE (VEX_W_0FD0_P_3) },
4829 },
4830
4831 /* PREFIX_VEX_0FD1 */
4832 {
4833 { Bad_Opcode },
4834 { Bad_Opcode },
4835 { VEX_W_TABLE (VEX_W_0FD1_P_2) },
4836 },
4837
4838 /* PREFIX_VEX_0FD2 */
4839 {
4840 { Bad_Opcode },
4841 { Bad_Opcode },
4842 { VEX_W_TABLE (VEX_W_0FD2_P_2) },
4843 },
4844
4845 /* PREFIX_VEX_0FD3 */
4846 {
4847 { Bad_Opcode },
4848 { Bad_Opcode },
4849 { VEX_W_TABLE (VEX_W_0FD3_P_2) },
4850 },
4851
4852 /* PREFIX_VEX_0FD4 */
4853 {
4854 { Bad_Opcode },
4855 { Bad_Opcode },
4856 { VEX_W_TABLE (VEX_W_0FD4_P_2) },
4857 },
4858
4859 /* PREFIX_VEX_0FD5 */
4860 {
4861 { Bad_Opcode },
4862 { Bad_Opcode },
4863 { VEX_W_TABLE (VEX_W_0FD5_P_2) },
4864 },
4865
4866 /* PREFIX_VEX_0FD6 */
4867 {
4868 { Bad_Opcode },
4869 { Bad_Opcode },
4870 { VEX_LEN_TABLE (VEX_LEN_0FD6_P_2) },
4871 },
4872
4873 /* PREFIX_VEX_0FD7 */
4874 {
4875 { Bad_Opcode },
4876 { Bad_Opcode },
4877 { MOD_TABLE (MOD_VEX_0FD7_PREFIX_2) },
4878 },
4879
4880 /* PREFIX_VEX_0FD8 */
4881 {
4882 { Bad_Opcode },
4883 { Bad_Opcode },
4884 { VEX_W_TABLE (VEX_W_0FD8_P_2) },
4885 },
4886
4887 /* PREFIX_VEX_0FD9 */
4888 {
4889 { Bad_Opcode },
4890 { Bad_Opcode },
4891 { VEX_W_TABLE (VEX_W_0FD9_P_2) },
4892 },
4893
4894 /* PREFIX_VEX_0FDA */
4895 {
4896 { Bad_Opcode },
4897 { Bad_Opcode },
4898 { VEX_W_TABLE (VEX_W_0FDA_P_2) },
4899 },
4900
4901 /* PREFIX_VEX_0FDB */
4902 {
4903 { Bad_Opcode },
4904 { Bad_Opcode },
4905 { VEX_W_TABLE (VEX_W_0FDB_P_2) },
4906 },
4907
4908 /* PREFIX_VEX_0FDC */
4909 {
4910 { Bad_Opcode },
4911 { Bad_Opcode },
4912 { VEX_W_TABLE (VEX_W_0FDC_P_2) },
4913 },
4914
4915 /* PREFIX_VEX_0FDD */
4916 {
4917 { Bad_Opcode },
4918 { Bad_Opcode },
4919 { VEX_W_TABLE (VEX_W_0FDD_P_2) },
4920 },
4921
4922 /* PREFIX_VEX_0FDE */
4923 {
4924 { Bad_Opcode },
4925 { Bad_Opcode },
4926 { VEX_W_TABLE (VEX_W_0FDE_P_2) },
4927 },
4928
4929 /* PREFIX_VEX_0FDF */
4930 {
4931 { Bad_Opcode },
4932 { Bad_Opcode },
4933 { VEX_W_TABLE (VEX_W_0FDF_P_2) },
4934 },
4935
4936 /* PREFIX_VEX_0FE0 */
4937 {
4938 { Bad_Opcode },
4939 { Bad_Opcode },
4940 { VEX_W_TABLE (VEX_W_0FE0_P_2) },
4941 },
4942
4943 /* PREFIX_VEX_0FE1 */
4944 {
4945 { Bad_Opcode },
4946 { Bad_Opcode },
4947 { VEX_W_TABLE (VEX_W_0FE1_P_2) },
4948 },
4949
4950 /* PREFIX_VEX_0FE2 */
4951 {
4952 { Bad_Opcode },
4953 { Bad_Opcode },
4954 { VEX_W_TABLE (VEX_W_0FE2_P_2) },
4955 },
4956
4957 /* PREFIX_VEX_0FE3 */
4958 {
4959 { Bad_Opcode },
4960 { Bad_Opcode },
4961 { VEX_W_TABLE (VEX_W_0FE3_P_2) },
4962 },
4963
4964 /* PREFIX_VEX_0FE4 */
4965 {
4966 { Bad_Opcode },
4967 { Bad_Opcode },
4968 { VEX_W_TABLE (VEX_W_0FE4_P_2) },
4969 },
4970
4971 /* PREFIX_VEX_0FE5 */
4972 {
4973 { Bad_Opcode },
4974 { Bad_Opcode },
4975 { VEX_W_TABLE (VEX_W_0FE5_P_2) },
4976 },
4977
4978 /* PREFIX_VEX_0FE6 */
4979 {
4980 { Bad_Opcode },
4981 { VEX_W_TABLE (VEX_W_0FE6_P_1) },
4982 { VEX_W_TABLE (VEX_W_0FE6_P_2) },
4983 { VEX_W_TABLE (VEX_W_0FE6_P_3) },
4984 },
4985
4986 /* PREFIX_VEX_0FE7 */
4987 {
4988 { Bad_Opcode },
4989 { Bad_Opcode },
4990 { MOD_TABLE (MOD_VEX_0FE7_PREFIX_2) },
4991 },
4992
4993 /* PREFIX_VEX_0FE8 */
4994 {
4995 { Bad_Opcode },
4996 { Bad_Opcode },
4997 { VEX_W_TABLE (VEX_W_0FE8_P_2) },
4998 },
4999
5000 /* PREFIX_VEX_0FE9 */
5001 {
5002 { Bad_Opcode },
5003 { Bad_Opcode },
5004 { VEX_W_TABLE (VEX_W_0FE9_P_2) },
5005 },
5006
5007 /* PREFIX_VEX_0FEA */
5008 {
5009 { Bad_Opcode },
5010 { Bad_Opcode },
5011 { VEX_W_TABLE (VEX_W_0FEA_P_2) },
5012 },
5013
5014 /* PREFIX_VEX_0FEB */
5015 {
5016 { Bad_Opcode },
5017 { Bad_Opcode },
5018 { VEX_W_TABLE (VEX_W_0FEB_P_2) },
5019 },
5020
5021 /* PREFIX_VEX_0FEC */
5022 {
5023 { Bad_Opcode },
5024 { Bad_Opcode },
5025 { VEX_W_TABLE (VEX_W_0FEC_P_2) },
5026 },
5027
5028 /* PREFIX_VEX_0FED */
5029 {
5030 { Bad_Opcode },
5031 { Bad_Opcode },
5032 { VEX_W_TABLE (VEX_W_0FED_P_2) },
5033 },
5034
5035 /* PREFIX_VEX_0FEE */
5036 {
5037 { Bad_Opcode },
5038 { Bad_Opcode },
5039 { VEX_W_TABLE (VEX_W_0FEE_P_2) },
5040 },
5041
5042 /* PREFIX_VEX_0FEF */
5043 {
5044 { Bad_Opcode },
5045 { Bad_Opcode },
5046 { VEX_W_TABLE (VEX_W_0FEF_P_2) },
5047 },
5048
5049 /* PREFIX_VEX_0FF0 */
5050 {
5051 { Bad_Opcode },
5052 { Bad_Opcode },
5053 { Bad_Opcode },
5054 { MOD_TABLE (MOD_VEX_0FF0_PREFIX_3) },
5055 },
5056
5057 /* PREFIX_VEX_0FF1 */
5058 {
5059 { Bad_Opcode },
5060 { Bad_Opcode },
5061 { VEX_W_TABLE (VEX_W_0FF1_P_2) },
5062 },
5063
5064 /* PREFIX_VEX_0FF2 */
5065 {
5066 { Bad_Opcode },
5067 { Bad_Opcode },
5068 { VEX_W_TABLE (VEX_W_0FF2_P_2) },
5069 },
5070
5071 /* PREFIX_VEX_0FF3 */
5072 {
5073 { Bad_Opcode },
5074 { Bad_Opcode },
5075 { VEX_W_TABLE (VEX_W_0FF3_P_2) },
5076 },
5077
5078 /* PREFIX_VEX_0FF4 */
5079 {
5080 { Bad_Opcode },
5081 { Bad_Opcode },
5082 { VEX_W_TABLE (VEX_W_0FF4_P_2) },
5083 },
5084
5085 /* PREFIX_VEX_0FF5 */
5086 {
5087 { Bad_Opcode },
5088 { Bad_Opcode },
5089 { VEX_W_TABLE (VEX_W_0FF5_P_2) },
5090 },
5091
5092 /* PREFIX_VEX_0FF6 */
5093 {
5094 { Bad_Opcode },
5095 { Bad_Opcode },
5096 { VEX_W_TABLE (VEX_W_0FF6_P_2) },
5097 },
5098
5099 /* PREFIX_VEX_0FF7 */
5100 {
5101 { Bad_Opcode },
5102 { Bad_Opcode },
5103 { VEX_LEN_TABLE (VEX_LEN_0FF7_P_2) },
5104 },
5105
5106 /* PREFIX_VEX_0FF8 */
5107 {
5108 { Bad_Opcode },
5109 { Bad_Opcode },
5110 { VEX_W_TABLE (VEX_W_0FF8_P_2) },
5111 },
5112
5113 /* PREFIX_VEX_0FF9 */
5114 {
5115 { Bad_Opcode },
5116 { Bad_Opcode },
5117 { VEX_W_TABLE (VEX_W_0FF9_P_2) },
5118 },
5119
5120 /* PREFIX_VEX_0FFA */
5121 {
5122 { Bad_Opcode },
5123 { Bad_Opcode },
5124 { VEX_W_TABLE (VEX_W_0FFA_P_2) },
5125 },
5126
5127 /* PREFIX_VEX_0FFB */
5128 {
5129 { Bad_Opcode },
5130 { Bad_Opcode },
5131 { VEX_W_TABLE (VEX_W_0FFB_P_2) },
5132 },
5133
5134 /* PREFIX_VEX_0FFC */
5135 {
5136 { Bad_Opcode },
5137 { Bad_Opcode },
5138 { VEX_W_TABLE (VEX_W_0FFC_P_2) },
5139 },
5140
5141 /* PREFIX_VEX_0FFD */
5142 {
5143 { Bad_Opcode },
5144 { Bad_Opcode },
5145 { VEX_W_TABLE (VEX_W_0FFD_P_2) },
5146 },
5147
5148 /* PREFIX_VEX_0FFE */
5149 {
5150 { Bad_Opcode },
5151 { Bad_Opcode },
5152 { VEX_W_TABLE (VEX_W_0FFE_P_2) },
5153 },
5154
5155 /* PREFIX_VEX_0F3800 */
5156 {
5157 { Bad_Opcode },
5158 { Bad_Opcode },
5159 { VEX_W_TABLE (VEX_W_0F3800_P_2) },
5160 },
5161
5162 /* PREFIX_VEX_0F3801 */
5163 {
5164 { Bad_Opcode },
5165 { Bad_Opcode },
5166 { VEX_W_TABLE (VEX_W_0F3801_P_2) },
5167 },
5168
5169 /* PREFIX_VEX_0F3802 */
5170 {
5171 { Bad_Opcode },
5172 { Bad_Opcode },
5173 { VEX_W_TABLE (VEX_W_0F3802_P_2) },
5174 },
5175
5176 /* PREFIX_VEX_0F3803 */
5177 {
5178 { Bad_Opcode },
5179 { Bad_Opcode },
5180 { VEX_W_TABLE (VEX_W_0F3803_P_2) },
5181 },
5182
5183 /* PREFIX_VEX_0F3804 */
5184 {
5185 { Bad_Opcode },
5186 { Bad_Opcode },
5187 { VEX_W_TABLE (VEX_W_0F3804_P_2) },
5188 },
5189
5190 /* PREFIX_VEX_0F3805 */
5191 {
5192 { Bad_Opcode },
5193 { Bad_Opcode },
5194 { VEX_W_TABLE (VEX_W_0F3805_P_2) },
5195 },
5196
5197 /* PREFIX_VEX_0F3806 */
5198 {
5199 { Bad_Opcode },
5200 { Bad_Opcode },
5201 { VEX_W_TABLE (VEX_W_0F3806_P_2) },
5202 },
5203
5204 /* PREFIX_VEX_0F3807 */
5205 {
5206 { Bad_Opcode },
5207 { Bad_Opcode },
5208 { VEX_W_TABLE (VEX_W_0F3807_P_2) },
5209 },
5210
5211 /* PREFIX_VEX_0F3808 */
5212 {
5213 { Bad_Opcode },
5214 { Bad_Opcode },
5215 { VEX_W_TABLE (VEX_W_0F3808_P_2) },
5216 },
5217
5218 /* PREFIX_VEX_0F3809 */
5219 {
5220 { Bad_Opcode },
5221 { Bad_Opcode },
5222 { VEX_W_TABLE (VEX_W_0F3809_P_2) },
5223 },
5224
5225 /* PREFIX_VEX_0F380A */
5226 {
5227 { Bad_Opcode },
5228 { Bad_Opcode },
5229 { VEX_W_TABLE (VEX_W_0F380A_P_2) },
5230 },
5231
5232 /* PREFIX_VEX_0F380B */
5233 {
5234 { Bad_Opcode },
5235 { Bad_Opcode },
5236 { VEX_W_TABLE (VEX_W_0F380B_P_2) },
5237 },
5238
5239 /* PREFIX_VEX_0F380C */
5240 {
5241 { Bad_Opcode },
5242 { Bad_Opcode },
5243 { VEX_W_TABLE (VEX_W_0F380C_P_2) },
5244 },
5245
5246 /* PREFIX_VEX_0F380D */
5247 {
5248 { Bad_Opcode },
5249 { Bad_Opcode },
5250 { VEX_W_TABLE (VEX_W_0F380D_P_2) },
5251 },
5252
5253 /* PREFIX_VEX_0F380E */
5254 {
5255 { Bad_Opcode },
5256 { Bad_Opcode },
5257 { VEX_W_TABLE (VEX_W_0F380E_P_2) },
5258 },
5259
5260 /* PREFIX_VEX_0F380F */
5261 {
5262 { Bad_Opcode },
5263 { Bad_Opcode },
5264 { VEX_W_TABLE (VEX_W_0F380F_P_2) },
5265 },
5266
5267 /* PREFIX_VEX_0F3813 */
5268 {
5269 { Bad_Opcode },
5270 { Bad_Opcode },
5271 { "vcvtph2ps", { XM, EXxmmq } },
5272 },
5273
5274 /* PREFIX_VEX_0F3816 */
5275 {
5276 { Bad_Opcode },
5277 { Bad_Opcode },
5278 { VEX_LEN_TABLE (VEX_LEN_0F3816_P_2) },
5279 },
5280
5281 /* PREFIX_VEX_0F3817 */
5282 {
5283 { Bad_Opcode },
5284 { Bad_Opcode },
5285 { VEX_W_TABLE (VEX_W_0F3817_P_2) },
5286 },
5287
5288 /* PREFIX_VEX_0F3818 */
5289 {
5290 { Bad_Opcode },
5291 { Bad_Opcode },
5292 { VEX_W_TABLE (VEX_W_0F3818_P_2) },
5293 },
5294
5295 /* PREFIX_VEX_0F3819 */
5296 {
5297 { Bad_Opcode },
5298 { Bad_Opcode },
5299 { VEX_LEN_TABLE (VEX_LEN_0F3819_P_2) },
5300 },
5301
5302 /* PREFIX_VEX_0F381A */
5303 {
5304 { Bad_Opcode },
5305 { Bad_Opcode },
5306 { MOD_TABLE (MOD_VEX_0F381A_PREFIX_2) },
5307 },
5308
5309 /* PREFIX_VEX_0F381C */
5310 {
5311 { Bad_Opcode },
5312 { Bad_Opcode },
5313 { VEX_W_TABLE (VEX_W_0F381C_P_2) },
5314 },
5315
5316 /* PREFIX_VEX_0F381D */
5317 {
5318 { Bad_Opcode },
5319 { Bad_Opcode },
5320 { VEX_W_TABLE (VEX_W_0F381D_P_2) },
5321 },
5322
5323 /* PREFIX_VEX_0F381E */
5324 {
5325 { Bad_Opcode },
5326 { Bad_Opcode },
5327 { VEX_W_TABLE (VEX_W_0F381E_P_2) },
5328 },
5329
5330 /* PREFIX_VEX_0F3820 */
5331 {
5332 { Bad_Opcode },
5333 { Bad_Opcode },
5334 { VEX_W_TABLE (VEX_W_0F3820_P_2) },
5335 },
5336
5337 /* PREFIX_VEX_0F3821 */
5338 {
5339 { Bad_Opcode },
5340 { Bad_Opcode },
5341 { VEX_W_TABLE (VEX_W_0F3821_P_2) },
5342 },
5343
5344 /* PREFIX_VEX_0F3822 */
5345 {
5346 { Bad_Opcode },
5347 { Bad_Opcode },
5348 { VEX_W_TABLE (VEX_W_0F3822_P_2) },
5349 },
5350
5351 /* PREFIX_VEX_0F3823 */
5352 {
5353 { Bad_Opcode },
5354 { Bad_Opcode },
5355 { VEX_W_TABLE (VEX_W_0F3823_P_2) },
5356 },
5357
5358 /* PREFIX_VEX_0F3824 */
5359 {
5360 { Bad_Opcode },
5361 { Bad_Opcode },
5362 { VEX_W_TABLE (VEX_W_0F3824_P_2) },
5363 },
5364
5365 /* PREFIX_VEX_0F3825 */
5366 {
5367 { Bad_Opcode },
5368 { Bad_Opcode },
5369 { VEX_W_TABLE (VEX_W_0F3825_P_2) },
5370 },
5371
5372 /* PREFIX_VEX_0F3828 */
5373 {
5374 { Bad_Opcode },
5375 { Bad_Opcode },
5376 { VEX_W_TABLE (VEX_W_0F3828_P_2) },
5377 },
5378
5379 /* PREFIX_VEX_0F3829 */
5380 {
5381 { Bad_Opcode },
5382 { Bad_Opcode },
5383 { VEX_W_TABLE (VEX_W_0F3829_P_2) },
5384 },
5385
5386 /* PREFIX_VEX_0F382A */
5387 {
5388 { Bad_Opcode },
5389 { Bad_Opcode },
5390 { MOD_TABLE (MOD_VEX_0F382A_PREFIX_2) },
5391 },
5392
5393 /* PREFIX_VEX_0F382B */
5394 {
5395 { Bad_Opcode },
5396 { Bad_Opcode },
5397 { VEX_W_TABLE (VEX_W_0F382B_P_2) },
5398 },
5399
5400 /* PREFIX_VEX_0F382C */
5401 {
5402 { Bad_Opcode },
5403 { Bad_Opcode },
5404 { MOD_TABLE (MOD_VEX_0F382C_PREFIX_2) },
5405 },
5406
5407 /* PREFIX_VEX_0F382D */
5408 {
5409 { Bad_Opcode },
5410 { Bad_Opcode },
5411 { MOD_TABLE (MOD_VEX_0F382D_PREFIX_2) },
5412 },
5413
5414 /* PREFIX_VEX_0F382E */
5415 {
5416 { Bad_Opcode },
5417 { Bad_Opcode },
5418 { MOD_TABLE (MOD_VEX_0F382E_PREFIX_2) },
5419 },
5420
5421 /* PREFIX_VEX_0F382F */
5422 {
5423 { Bad_Opcode },
5424 { Bad_Opcode },
5425 { MOD_TABLE (MOD_VEX_0F382F_PREFIX_2) },
5426 },
5427
5428 /* PREFIX_VEX_0F3830 */
5429 {
5430 { Bad_Opcode },
5431 { Bad_Opcode },
5432 { VEX_W_TABLE (VEX_W_0F3830_P_2) },
5433 },
5434
5435 /* PREFIX_VEX_0F3831 */
5436 {
5437 { Bad_Opcode },
5438 { Bad_Opcode },
5439 { VEX_W_TABLE (VEX_W_0F3831_P_2) },
5440 },
5441
5442 /* PREFIX_VEX_0F3832 */
5443 {
5444 { Bad_Opcode },
5445 { Bad_Opcode },
5446 { VEX_W_TABLE (VEX_W_0F3832_P_2) },
5447 },
5448
5449 /* PREFIX_VEX_0F3833 */
5450 {
5451 { Bad_Opcode },
5452 { Bad_Opcode },
5453 { VEX_W_TABLE (VEX_W_0F3833_P_2) },
5454 },
5455
5456 /* PREFIX_VEX_0F3834 */
5457 {
5458 { Bad_Opcode },
5459 { Bad_Opcode },
5460 { VEX_W_TABLE (VEX_W_0F3834_P_2) },
5461 },
5462
5463 /* PREFIX_VEX_0F3835 */
5464 {
5465 { Bad_Opcode },
5466 { Bad_Opcode },
5467 { VEX_W_TABLE (VEX_W_0F3835_P_2) },
5468 },
5469
5470 /* PREFIX_VEX_0F3836 */
5471 {
5472 { Bad_Opcode },
5473 { Bad_Opcode },
5474 { VEX_LEN_TABLE (VEX_LEN_0F3836_P_2) },
5475 },
5476
5477 /* PREFIX_VEX_0F3837 */
5478 {
5479 { Bad_Opcode },
5480 { Bad_Opcode },
5481 { VEX_W_TABLE (VEX_W_0F3837_P_2) },
5482 },
5483
5484 /* PREFIX_VEX_0F3838 */
5485 {
5486 { Bad_Opcode },
5487 { Bad_Opcode },
5488 { VEX_W_TABLE (VEX_W_0F3838_P_2) },
5489 },
5490
5491 /* PREFIX_VEX_0F3839 */
5492 {
5493 { Bad_Opcode },
5494 { Bad_Opcode },
5495 { VEX_W_TABLE (VEX_W_0F3839_P_2) },
5496 },
5497
5498 /* PREFIX_VEX_0F383A */
5499 {
5500 { Bad_Opcode },
5501 { Bad_Opcode },
5502 { VEX_W_TABLE (VEX_W_0F383A_P_2) },
5503 },
5504
5505 /* PREFIX_VEX_0F383B */
5506 {
5507 { Bad_Opcode },
5508 { Bad_Opcode },
5509 { VEX_W_TABLE (VEX_W_0F383B_P_2) },
5510 },
5511
5512 /* PREFIX_VEX_0F383C */
5513 {
5514 { Bad_Opcode },
5515 { Bad_Opcode },
5516 { VEX_W_TABLE (VEX_W_0F383C_P_2) },
5517 },
5518
5519 /* PREFIX_VEX_0F383D */
5520 {
5521 { Bad_Opcode },
5522 { Bad_Opcode },
5523 { VEX_W_TABLE (VEX_W_0F383D_P_2) },
5524 },
5525
5526 /* PREFIX_VEX_0F383E */
5527 {
5528 { Bad_Opcode },
5529 { Bad_Opcode },
5530 { VEX_W_TABLE (VEX_W_0F383E_P_2) },
5531 },
5532
5533 /* PREFIX_VEX_0F383F */
5534 {
5535 { Bad_Opcode },
5536 { Bad_Opcode },
5537 { VEX_W_TABLE (VEX_W_0F383F_P_2) },
5538 },
5539
5540 /* PREFIX_VEX_0F3840 */
5541 {
5542 { Bad_Opcode },
5543 { Bad_Opcode },
5544 { VEX_W_TABLE (VEX_W_0F3840_P_2) },
5545 },
5546
5547 /* PREFIX_VEX_0F3841 */
5548 {
5549 { Bad_Opcode },
5550 { Bad_Opcode },
5551 { VEX_LEN_TABLE (VEX_LEN_0F3841_P_2) },
5552 },
5553
5554 /* PREFIX_VEX_0F3845 */
5555 {
5556 { Bad_Opcode },
5557 { Bad_Opcode },
5558 { "vpsrlv%LW", { XM, Vex, EXx } },
5559 },
5560
5561 /* PREFIX_VEX_0F3846 */
5562 {
5563 { Bad_Opcode },
5564 { Bad_Opcode },
5565 { VEX_W_TABLE (VEX_W_0F3846_P_2) },
5566 },
5567
5568 /* PREFIX_VEX_0F3847 */
5569 {
5570 { Bad_Opcode },
5571 { Bad_Opcode },
5572 { "vpsllv%LW", { XM, Vex, EXx } },
5573 },
5574
5575 /* PREFIX_VEX_0F3858 */
5576 {
5577 { Bad_Opcode },
5578 { Bad_Opcode },
5579 { VEX_W_TABLE (VEX_W_0F3858_P_2) },
5580 },
5581
5582 /* PREFIX_VEX_0F3859 */
5583 {
5584 { Bad_Opcode },
5585 { Bad_Opcode },
5586 { VEX_W_TABLE (VEX_W_0F3859_P_2) },
5587 },
5588
5589 /* PREFIX_VEX_0F385A */
5590 {
5591 { Bad_Opcode },
5592 { Bad_Opcode },
5593 { MOD_TABLE (MOD_VEX_0F385A_PREFIX_2) },
5594 },
5595
5596 /* PREFIX_VEX_0F3878 */
5597 {
5598 { Bad_Opcode },
5599 { Bad_Opcode },
5600 { VEX_W_TABLE (VEX_W_0F3878_P_2) },
5601 },
5602
5603 /* PREFIX_VEX_0F3879 */
5604 {
5605 { Bad_Opcode },
5606 { Bad_Opcode },
5607 { VEX_W_TABLE (VEX_W_0F3879_P_2) },
5608 },
5609
5610 /* PREFIX_VEX_0F388C */
5611 {
5612 { Bad_Opcode },
5613 { Bad_Opcode },
5614 { MOD_TABLE (MOD_VEX_0F388C_PREFIX_2) },
5615 },
5616
5617 /* PREFIX_VEX_0F388E */
5618 {
5619 { Bad_Opcode },
5620 { Bad_Opcode },
5621 { MOD_TABLE (MOD_VEX_0F388E_PREFIX_2) },
5622 },
5623
5624 /* PREFIX_VEX_0F3890 */
5625 {
5626 { Bad_Opcode },
5627 { Bad_Opcode },
5628 { "vpgatherd%LW", { XM, MVexVSIBDWpX, Vex } },
5629 },
5630
5631 /* PREFIX_VEX_0F3891 */
5632 {
5633 { Bad_Opcode },
5634 { Bad_Opcode },
5635 { "vpgatherq%LW", { XMGatherQ, MVexVSIBQWpX, VexGatherQ } },
5636 },
5637
5638 /* PREFIX_VEX_0F3892 */
5639 {
5640 { Bad_Opcode },
5641 { Bad_Opcode },
5642 { "vgatherdp%XW", { XM, MVexVSIBDWpX, Vex } },
5643 },
5644
5645 /* PREFIX_VEX_0F3893 */
5646 {
5647 { Bad_Opcode },
5648 { Bad_Opcode },
5649 { "vgatherqp%XW", { XMGatherQ, MVexVSIBQWpX, VexGatherQ } },
5650 },
5651
5652 /* PREFIX_VEX_0F3896 */
5653 {
5654 { Bad_Opcode },
5655 { Bad_Opcode },
5656 { "vfmaddsub132p%XW", { XM, Vex, EXx } },
5657 },
5658
5659 /* PREFIX_VEX_0F3897 */
5660 {
5661 { Bad_Opcode },
5662 { Bad_Opcode },
5663 { "vfmsubadd132p%XW", { XM, Vex, EXx } },
5664 },
5665
5666 /* PREFIX_VEX_0F3898 */
5667 {
5668 { Bad_Opcode },
5669 { Bad_Opcode },
5670 { "vfmadd132p%XW", { XM, Vex, EXx } },
5671 },
5672
5673 /* PREFIX_VEX_0F3899 */
5674 {
5675 { Bad_Opcode },
5676 { Bad_Opcode },
5677 { "vfmadd132s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
5678 },
5679
5680 /* PREFIX_VEX_0F389A */
5681 {
5682 { Bad_Opcode },
5683 { Bad_Opcode },
5684 { "vfmsub132p%XW", { XM, Vex, EXx } },
5685 },
5686
5687 /* PREFIX_VEX_0F389B */
5688 {
5689 { Bad_Opcode },
5690 { Bad_Opcode },
5691 { "vfmsub132s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
5692 },
5693
5694 /* PREFIX_VEX_0F389C */
5695 {
5696 { Bad_Opcode },
5697 { Bad_Opcode },
5698 { "vfnmadd132p%XW", { XM, Vex, EXx } },
5699 },
5700
5701 /* PREFIX_VEX_0F389D */
5702 {
5703 { Bad_Opcode },
5704 { Bad_Opcode },
5705 { "vfnmadd132s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
5706 },
5707
5708 /* PREFIX_VEX_0F389E */
5709 {
5710 { Bad_Opcode },
5711 { Bad_Opcode },
5712 { "vfnmsub132p%XW", { XM, Vex, EXx } },
5713 },
5714
5715 /* PREFIX_VEX_0F389F */
5716 {
5717 { Bad_Opcode },
5718 { Bad_Opcode },
5719 { "vfnmsub132s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
5720 },
5721
5722 /* PREFIX_VEX_0F38A6 */
5723 {
5724 { Bad_Opcode },
5725 { Bad_Opcode },
5726 { "vfmaddsub213p%XW", { XM, Vex, EXx } },
5727 { Bad_Opcode },
5728 },
5729
5730 /* PREFIX_VEX_0F38A7 */
5731 {
5732 { Bad_Opcode },
5733 { Bad_Opcode },
5734 { "vfmsubadd213p%XW", { XM, Vex, EXx } },
5735 },
5736
5737 /* PREFIX_VEX_0F38A8 */
5738 {
5739 { Bad_Opcode },
5740 { Bad_Opcode },
5741 { "vfmadd213p%XW", { XM, Vex, EXx } },
5742 },
5743
5744 /* PREFIX_VEX_0F38A9 */
5745 {
5746 { Bad_Opcode },
5747 { Bad_Opcode },
5748 { "vfmadd213s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
5749 },
5750
5751 /* PREFIX_VEX_0F38AA */
5752 {
5753 { Bad_Opcode },
5754 { Bad_Opcode },
5755 { "vfmsub213p%XW", { XM, Vex, EXx } },
5756 },
5757
5758 /* PREFIX_VEX_0F38AB */
5759 {
5760 { Bad_Opcode },
5761 { Bad_Opcode },
5762 { "vfmsub213s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
5763 },
5764
5765 /* PREFIX_VEX_0F38AC */
5766 {
5767 { Bad_Opcode },
5768 { Bad_Opcode },
5769 { "vfnmadd213p%XW", { XM, Vex, EXx } },
5770 },
5771
5772 /* PREFIX_VEX_0F38AD */
5773 {
5774 { Bad_Opcode },
5775 { Bad_Opcode },
5776 { "vfnmadd213s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
5777 },
5778
5779 /* PREFIX_VEX_0F38AE */
5780 {
5781 { Bad_Opcode },
5782 { Bad_Opcode },
5783 { "vfnmsub213p%XW", { XM, Vex, EXx } },
5784 },
5785
5786 /* PREFIX_VEX_0F38AF */
5787 {
5788 { Bad_Opcode },
5789 { Bad_Opcode },
5790 { "vfnmsub213s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
5791 },
5792
5793 /* PREFIX_VEX_0F38B6 */
5794 {
5795 { Bad_Opcode },
5796 { Bad_Opcode },
5797 { "vfmaddsub231p%XW", { XM, Vex, EXx } },
5798 },
5799
5800 /* PREFIX_VEX_0F38B7 */
5801 {
5802 { Bad_Opcode },
5803 { Bad_Opcode },
5804 { "vfmsubadd231p%XW", { XM, Vex, EXx } },
5805 },
5806
5807 /* PREFIX_VEX_0F38B8 */
5808 {
5809 { Bad_Opcode },
5810 { Bad_Opcode },
5811 { "vfmadd231p%XW", { XM, Vex, EXx } },
5812 },
5813
5814 /* PREFIX_VEX_0F38B9 */
5815 {
5816 { Bad_Opcode },
5817 { Bad_Opcode },
5818 { "vfmadd231s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
5819 },
5820
5821 /* PREFIX_VEX_0F38BA */
5822 {
5823 { Bad_Opcode },
5824 { Bad_Opcode },
5825 { "vfmsub231p%XW", { XM, Vex, EXx } },
5826 },
5827
5828 /* PREFIX_VEX_0F38BB */
5829 {
5830 { Bad_Opcode },
5831 { Bad_Opcode },
5832 { "vfmsub231s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
5833 },
5834
5835 /* PREFIX_VEX_0F38BC */
5836 {
5837 { Bad_Opcode },
5838 { Bad_Opcode },
5839 { "vfnmadd231p%XW", { XM, Vex, EXx } },
5840 },
5841
5842 /* PREFIX_VEX_0F38BD */
5843 {
5844 { Bad_Opcode },
5845 { Bad_Opcode },
5846 { "vfnmadd231s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
5847 },
5848
5849 /* PREFIX_VEX_0F38BE */
5850 {
5851 { Bad_Opcode },
5852 { Bad_Opcode },
5853 { "vfnmsub231p%XW", { XM, Vex, EXx } },
5854 },
5855
5856 /* PREFIX_VEX_0F38BF */
5857 {
5858 { Bad_Opcode },
5859 { Bad_Opcode },
5860 { "vfnmsub231s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
5861 },
5862
5863 /* PREFIX_VEX_0F38DB */
5864 {
5865 { Bad_Opcode },
5866 { Bad_Opcode },
5867 { VEX_LEN_TABLE (VEX_LEN_0F38DB_P_2) },
5868 },
5869
5870 /* PREFIX_VEX_0F38DC */
5871 {
5872 { Bad_Opcode },
5873 { Bad_Opcode },
5874 { VEX_LEN_TABLE (VEX_LEN_0F38DC_P_2) },
5875 },
5876
5877 /* PREFIX_VEX_0F38DD */
5878 {
5879 { Bad_Opcode },
5880 { Bad_Opcode },
5881 { VEX_LEN_TABLE (VEX_LEN_0F38DD_P_2) },
5882 },
5883
5884 /* PREFIX_VEX_0F38DE */
5885 {
5886 { Bad_Opcode },
5887 { Bad_Opcode },
5888 { VEX_LEN_TABLE (VEX_LEN_0F38DE_P_2) },
5889 },
5890
5891 /* PREFIX_VEX_0F38DF */
5892 {
5893 { Bad_Opcode },
5894 { Bad_Opcode },
5895 { VEX_LEN_TABLE (VEX_LEN_0F38DF_P_2) },
5896 },
5897
5898 /* PREFIX_VEX_0F38F2 */
5899 {
5900 { VEX_LEN_TABLE (VEX_LEN_0F38F2_P_0) },
5901 },
5902
5903 /* PREFIX_VEX_0F38F3_REG_1 */
5904 {
5905 { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_1_P_0) },
5906 },
5907
5908 /* PREFIX_VEX_0F38F3_REG_2 */
5909 {
5910 { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_2_P_0) },
5911 },
5912
5913 /* PREFIX_VEX_0F38F3_REG_3 */
5914 {
5915 { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_3_P_0) },
5916 },
5917
5918 /* PREFIX_VEX_0F38F5 */
5919 {
5920 { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_0) },
5921 { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_1) },
5922 { Bad_Opcode },
5923 { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_3) },
5924 },
5925
5926 /* PREFIX_VEX_0F38F6 */
5927 {
5928 { Bad_Opcode },
5929 { Bad_Opcode },
5930 { Bad_Opcode },
5931 { VEX_LEN_TABLE (VEX_LEN_0F38F6_P_3) },
5932 },
5933
5934 /* PREFIX_VEX_0F38F7 */
5935 {
5936 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_0) },
5937 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_1) },
5938 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_2) },
5939 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_3) },
5940 },
5941
5942 /* PREFIX_VEX_0F3A00 */
5943 {
5944 { Bad_Opcode },
5945 { Bad_Opcode },
5946 { VEX_LEN_TABLE (VEX_LEN_0F3A00_P_2) },
5947 },
5948
5949 /* PREFIX_VEX_0F3A01 */
5950 {
5951 { Bad_Opcode },
5952 { Bad_Opcode },
5953 { VEX_LEN_TABLE (VEX_LEN_0F3A01_P_2) },
5954 },
5955
5956 /* PREFIX_VEX_0F3A02 */
5957 {
5958 { Bad_Opcode },
5959 { Bad_Opcode },
5960 { VEX_W_TABLE (VEX_W_0F3A02_P_2) },
5961 },
5962
5963 /* PREFIX_VEX_0F3A04 */
5964 {
5965 { Bad_Opcode },
5966 { Bad_Opcode },
5967 { VEX_W_TABLE (VEX_W_0F3A04_P_2) },
5968 },
5969
5970 /* PREFIX_VEX_0F3A05 */
5971 {
5972 { Bad_Opcode },
5973 { Bad_Opcode },
5974 { VEX_W_TABLE (VEX_W_0F3A05_P_2) },
5975 },
5976
5977 /* PREFIX_VEX_0F3A06 */
5978 {
5979 { Bad_Opcode },
5980 { Bad_Opcode },
5981 { VEX_LEN_TABLE (VEX_LEN_0F3A06_P_2) },
5982 },
5983
5984 /* PREFIX_VEX_0F3A08 */
5985 {
5986 { Bad_Opcode },
5987 { Bad_Opcode },
5988 { VEX_W_TABLE (VEX_W_0F3A08_P_2) },
5989 },
5990
5991 /* PREFIX_VEX_0F3A09 */
5992 {
5993 { Bad_Opcode },
5994 { Bad_Opcode },
5995 { VEX_W_TABLE (VEX_W_0F3A09_P_2) },
5996 },
5997
5998 /* PREFIX_VEX_0F3A0A */
5999 {
6000 { Bad_Opcode },
6001 { Bad_Opcode },
6002 { VEX_LEN_TABLE (VEX_LEN_0F3A0A_P_2) },
6003 },
6004
6005 /* PREFIX_VEX_0F3A0B */
6006 {
6007 { Bad_Opcode },
6008 { Bad_Opcode },
6009 { VEX_LEN_TABLE (VEX_LEN_0F3A0B_P_2) },
6010 },
6011
6012 /* PREFIX_VEX_0F3A0C */
6013 {
6014 { Bad_Opcode },
6015 { Bad_Opcode },
6016 { VEX_W_TABLE (VEX_W_0F3A0C_P_2) },
6017 },
6018
6019 /* PREFIX_VEX_0F3A0D */
6020 {
6021 { Bad_Opcode },
6022 { Bad_Opcode },
6023 { VEX_W_TABLE (VEX_W_0F3A0D_P_2) },
6024 },
6025
6026 /* PREFIX_VEX_0F3A0E */
6027 {
6028 { Bad_Opcode },
6029 { Bad_Opcode },
6030 { VEX_W_TABLE (VEX_W_0F3A0E_P_2) },
6031 },
6032
6033 /* PREFIX_VEX_0F3A0F */
6034 {
6035 { Bad_Opcode },
6036 { Bad_Opcode },
6037 { VEX_W_TABLE (VEX_W_0F3A0F_P_2) },
6038 },
6039
6040 /* PREFIX_VEX_0F3A14 */
6041 {
6042 { Bad_Opcode },
6043 { Bad_Opcode },
6044 { VEX_LEN_TABLE (VEX_LEN_0F3A14_P_2) },
6045 },
6046
6047 /* PREFIX_VEX_0F3A15 */
6048 {
6049 { Bad_Opcode },
6050 { Bad_Opcode },
6051 { VEX_LEN_TABLE (VEX_LEN_0F3A15_P_2) },
6052 },
6053
6054 /* PREFIX_VEX_0F3A16 */
6055 {
6056 { Bad_Opcode },
6057 { Bad_Opcode },
6058 { VEX_LEN_TABLE (VEX_LEN_0F3A16_P_2) },
6059 },
6060
6061 /* PREFIX_VEX_0F3A17 */
6062 {
6063 { Bad_Opcode },
6064 { Bad_Opcode },
6065 { VEX_LEN_TABLE (VEX_LEN_0F3A17_P_2) },
6066 },
6067
6068 /* PREFIX_VEX_0F3A18 */
6069 {
6070 { Bad_Opcode },
6071 { Bad_Opcode },
6072 { VEX_LEN_TABLE (VEX_LEN_0F3A18_P_2) },
6073 },
6074
6075 /* PREFIX_VEX_0F3A19 */
6076 {
6077 { Bad_Opcode },
6078 { Bad_Opcode },
6079 { VEX_LEN_TABLE (VEX_LEN_0F3A19_P_2) },
6080 },
6081
6082 /* PREFIX_VEX_0F3A1D */
6083 {
6084 { Bad_Opcode },
6085 { Bad_Opcode },
6086 { "vcvtps2ph", { EXxmmq, XM, Ib } },
6087 },
6088
6089 /* PREFIX_VEX_0F3A20 */
6090 {
6091 { Bad_Opcode },
6092 { Bad_Opcode },
6093 { VEX_LEN_TABLE (VEX_LEN_0F3A20_P_2) },
6094 },
6095
6096 /* PREFIX_VEX_0F3A21 */
6097 {
6098 { Bad_Opcode },
6099 { Bad_Opcode },
6100 { VEX_LEN_TABLE (VEX_LEN_0F3A21_P_2) },
6101 },
6102
6103 /* PREFIX_VEX_0F3A22 */
6104 {
6105 { Bad_Opcode },
6106 { Bad_Opcode },
6107 { VEX_LEN_TABLE (VEX_LEN_0F3A22_P_2) },
6108 },
6109
6110 /* PREFIX_VEX_0F3A30 */
6111 {
6112 { Bad_Opcode },
6113 { Bad_Opcode },
6114 { VEX_LEN_TABLE (VEX_LEN_0F3A30_P_2) },
6115 },
6116
6117 /* PREFIX_VEX_0F3A32 */
6118 {
6119 { Bad_Opcode },
6120 { Bad_Opcode },
6121 { VEX_LEN_TABLE (VEX_LEN_0F3A32_P_2) },
6122 },
6123
6124 /* PREFIX_VEX_0F3A38 */
6125 {
6126 { Bad_Opcode },
6127 { Bad_Opcode },
6128 { VEX_LEN_TABLE (VEX_LEN_0F3A38_P_2) },
6129 },
6130
6131 /* PREFIX_VEX_0F3A39 */
6132 {
6133 { Bad_Opcode },
6134 { Bad_Opcode },
6135 { VEX_LEN_TABLE (VEX_LEN_0F3A39_P_2) },
6136 },
6137
6138 /* PREFIX_VEX_0F3A40 */
6139 {
6140 { Bad_Opcode },
6141 { Bad_Opcode },
6142 { VEX_W_TABLE (VEX_W_0F3A40_P_2) },
6143 },
6144
6145 /* PREFIX_VEX_0F3A41 */
6146 {
6147 { Bad_Opcode },
6148 { Bad_Opcode },
6149 { VEX_LEN_TABLE (VEX_LEN_0F3A41_P_2) },
6150 },
6151
6152 /* PREFIX_VEX_0F3A42 */
6153 {
6154 { Bad_Opcode },
6155 { Bad_Opcode },
6156 { VEX_W_TABLE (VEX_W_0F3A42_P_2) },
6157 },
6158
6159 /* PREFIX_VEX_0F3A44 */
6160 {
6161 { Bad_Opcode },
6162 { Bad_Opcode },
6163 { VEX_LEN_TABLE (VEX_LEN_0F3A44_P_2) },
6164 },
6165
6166 /* PREFIX_VEX_0F3A46 */
6167 {
6168 { Bad_Opcode },
6169 { Bad_Opcode },
6170 { VEX_LEN_TABLE (VEX_LEN_0F3A46_P_2) },
6171 },
6172
6173 /* PREFIX_VEX_0F3A48 */
6174 {
6175 { Bad_Opcode },
6176 { Bad_Opcode },
6177 { VEX_W_TABLE (VEX_W_0F3A48_P_2) },
6178 },
6179
6180 /* PREFIX_VEX_0F3A49 */
6181 {
6182 { Bad_Opcode },
6183 { Bad_Opcode },
6184 { VEX_W_TABLE (VEX_W_0F3A49_P_2) },
6185 },
6186
6187 /* PREFIX_VEX_0F3A4A */
6188 {
6189 { Bad_Opcode },
6190 { Bad_Opcode },
6191 { VEX_W_TABLE (VEX_W_0F3A4A_P_2) },
6192 },
6193
6194 /* PREFIX_VEX_0F3A4B */
6195 {
6196 { Bad_Opcode },
6197 { Bad_Opcode },
6198 { VEX_W_TABLE (VEX_W_0F3A4B_P_2) },
6199 },
6200
6201 /* PREFIX_VEX_0F3A4C */
6202 {
6203 { Bad_Opcode },
6204 { Bad_Opcode },
6205 { VEX_W_TABLE (VEX_W_0F3A4C_P_2) },
6206 },
6207
6208 /* PREFIX_VEX_0F3A5C */
6209 {
6210 { Bad_Opcode },
6211 { Bad_Opcode },
6212 { "vfmaddsubps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6213 },
6214
6215 /* PREFIX_VEX_0F3A5D */
6216 {
6217 { Bad_Opcode },
6218 { Bad_Opcode },
6219 { "vfmaddsubpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6220 },
6221
6222 /* PREFIX_VEX_0F3A5E */
6223 {
6224 { Bad_Opcode },
6225 { Bad_Opcode },
6226 { "vfmsubaddps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6227 },
6228
6229 /* PREFIX_VEX_0F3A5F */
6230 {
6231 { Bad_Opcode },
6232 { Bad_Opcode },
6233 { "vfmsubaddpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6234 },
6235
6236 /* PREFIX_VEX_0F3A60 */
6237 {
6238 { Bad_Opcode },
6239 { Bad_Opcode },
6240 { VEX_LEN_TABLE (VEX_LEN_0F3A60_P_2) },
6241 { Bad_Opcode },
6242 },
6243
6244 /* PREFIX_VEX_0F3A61 */
6245 {
6246 { Bad_Opcode },
6247 { Bad_Opcode },
6248 { VEX_LEN_TABLE (VEX_LEN_0F3A61_P_2) },
6249 },
6250
6251 /* PREFIX_VEX_0F3A62 */
6252 {
6253 { Bad_Opcode },
6254 { Bad_Opcode },
6255 { VEX_LEN_TABLE (VEX_LEN_0F3A62_P_2) },
6256 },
6257
6258 /* PREFIX_VEX_0F3A63 */
6259 {
6260 { Bad_Opcode },
6261 { Bad_Opcode },
6262 { VEX_LEN_TABLE (VEX_LEN_0F3A63_P_2) },
6263 },
6264
6265 /* PREFIX_VEX_0F3A68 */
6266 {
6267 { Bad_Opcode },
6268 { Bad_Opcode },
6269 { "vfmaddps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6270 },
6271
6272 /* PREFIX_VEX_0F3A69 */
6273 {
6274 { Bad_Opcode },
6275 { Bad_Opcode },
6276 { "vfmaddpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6277 },
6278
6279 /* PREFIX_VEX_0F3A6A */
6280 {
6281 { Bad_Opcode },
6282 { Bad_Opcode },
6283 { VEX_LEN_TABLE (VEX_LEN_0F3A6A_P_2) },
6284 },
6285
6286 /* PREFIX_VEX_0F3A6B */
6287 {
6288 { Bad_Opcode },
6289 { Bad_Opcode },
6290 { VEX_LEN_TABLE (VEX_LEN_0F3A6B_P_2) },
6291 },
6292
6293 /* PREFIX_VEX_0F3A6C */
6294 {
6295 { Bad_Opcode },
6296 { Bad_Opcode },
6297 { "vfmsubps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6298 },
6299
6300 /* PREFIX_VEX_0F3A6D */
6301 {
6302 { Bad_Opcode },
6303 { Bad_Opcode },
6304 { "vfmsubpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6305 },
6306
6307 /* PREFIX_VEX_0F3A6E */
6308 {
6309 { Bad_Opcode },
6310 { Bad_Opcode },
6311 { VEX_LEN_TABLE (VEX_LEN_0F3A6E_P_2) },
6312 },
6313
6314 /* PREFIX_VEX_0F3A6F */
6315 {
6316 { Bad_Opcode },
6317 { Bad_Opcode },
6318 { VEX_LEN_TABLE (VEX_LEN_0F3A6F_P_2) },
6319 },
6320
6321 /* PREFIX_VEX_0F3A78 */
6322 {
6323 { Bad_Opcode },
6324 { Bad_Opcode },
6325 { "vfnmaddps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6326 },
6327
6328 /* PREFIX_VEX_0F3A79 */
6329 {
6330 { Bad_Opcode },
6331 { Bad_Opcode },
6332 { "vfnmaddpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6333 },
6334
6335 /* PREFIX_VEX_0F3A7A */
6336 {
6337 { Bad_Opcode },
6338 { Bad_Opcode },
6339 { VEX_LEN_TABLE (VEX_LEN_0F3A7A_P_2) },
6340 },
6341
6342 /* PREFIX_VEX_0F3A7B */
6343 {
6344 { Bad_Opcode },
6345 { Bad_Opcode },
6346 { VEX_LEN_TABLE (VEX_LEN_0F3A7B_P_2) },
6347 },
6348
6349 /* PREFIX_VEX_0F3A7C */
6350 {
6351 { Bad_Opcode },
6352 { Bad_Opcode },
6353 { "vfnmsubps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6354 { Bad_Opcode },
6355 },
6356
6357 /* PREFIX_VEX_0F3A7D */
6358 {
6359 { Bad_Opcode },
6360 { Bad_Opcode },
6361 { "vfnmsubpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6362 },
6363
6364 /* PREFIX_VEX_0F3A7E */
6365 {
6366 { Bad_Opcode },
6367 { Bad_Opcode },
6368 { VEX_LEN_TABLE (VEX_LEN_0F3A7E_P_2) },
6369 },
6370
6371 /* PREFIX_VEX_0F3A7F */
6372 {
6373 { Bad_Opcode },
6374 { Bad_Opcode },
6375 { VEX_LEN_TABLE (VEX_LEN_0F3A7F_P_2) },
6376 },
6377
6378 /* PREFIX_VEX_0F3ADF */
6379 {
6380 { Bad_Opcode },
6381 { Bad_Opcode },
6382 { VEX_LEN_TABLE (VEX_LEN_0F3ADF_P_2) },
6383 },
6384
6385 /* PREFIX_VEX_0F3AF0 */
6386 {
6387 { Bad_Opcode },
6388 { Bad_Opcode },
6389 { Bad_Opcode },
6390 { VEX_LEN_TABLE (VEX_LEN_0F3AF0_P_3) },
6391 },
6392
6393 #define NEED_PREFIX_TABLE
6394 #include "i386-dis-evex.h"
6395 #undef NEED_PREFIX_TABLE
6396 };
6397
6398 static const struct dis386 x86_64_table[][2] = {
6399 /* X86_64_06 */
6400 {
6401 { "pushP", { es } },
6402 },
6403
6404 /* X86_64_07 */
6405 {
6406 { "popP", { es } },
6407 },
6408
6409 /* X86_64_0D */
6410 {
6411 { "pushP", { cs } },
6412 },
6413
6414 /* X86_64_16 */
6415 {
6416 { "pushP", { ss } },
6417 },
6418
6419 /* X86_64_17 */
6420 {
6421 { "popP", { ss } },
6422 },
6423
6424 /* X86_64_1E */
6425 {
6426 { "pushP", { ds } },
6427 },
6428
6429 /* X86_64_1F */
6430 {
6431 { "popP", { ds } },
6432 },
6433
6434 /* X86_64_27 */
6435 {
6436 { "daa", { XX } },
6437 },
6438
6439 /* X86_64_2F */
6440 {
6441 { "das", { XX } },
6442 },
6443
6444 /* X86_64_37 */
6445 {
6446 { "aaa", { XX } },
6447 },
6448
6449 /* X86_64_3F */
6450 {
6451 { "aas", { XX } },
6452 },
6453
6454 /* X86_64_60 */
6455 {
6456 { "pushaP", { XX } },
6457 },
6458
6459 /* X86_64_61 */
6460 {
6461 { "popaP", { XX } },
6462 },
6463
6464 /* X86_64_62 */
6465 {
6466 { MOD_TABLE (MOD_62_32BIT) },
6467 { EVEX_TABLE (EVEX_0F) },
6468 },
6469
6470 /* X86_64_63 */
6471 {
6472 { "arpl", { Ew, Gw } },
6473 { "movs{lq|xd}", { Gv, Ed } },
6474 },
6475
6476 /* X86_64_6D */
6477 {
6478 { "ins{R|}", { Yzr, indirDX } },
6479 { "ins{G|}", { Yzr, indirDX } },
6480 },
6481
6482 /* X86_64_6F */
6483 {
6484 { "outs{R|}", { indirDXr, Xz } },
6485 { "outs{G|}", { indirDXr, Xz } },
6486 },
6487
6488 /* X86_64_9A */
6489 {
6490 { "Jcall{T|}", { Ap } },
6491 },
6492
6493 /* X86_64_C4 */
6494 {
6495 { MOD_TABLE (MOD_C4_32BIT) },
6496 { VEX_C4_TABLE (VEX_0F) },
6497 },
6498
6499 /* X86_64_C5 */
6500 {
6501 { MOD_TABLE (MOD_C5_32BIT) },
6502 { VEX_C5_TABLE (VEX_0F) },
6503 },
6504
6505 /* X86_64_CE */
6506 {
6507 { "into", { XX } },
6508 },
6509
6510 /* X86_64_D4 */
6511 {
6512 { "aam", { Ib } },
6513 },
6514
6515 /* X86_64_D5 */
6516 {
6517 { "aad", { Ib } },
6518 },
6519
6520 /* X86_64_EA */
6521 {
6522 { "Jjmp{T|}", { Ap } },
6523 },
6524
6525 /* X86_64_0F01_REG_0 */
6526 {
6527 { "sgdt{Q|IQ}", { M } },
6528 { "sgdt", { M } },
6529 },
6530
6531 /* X86_64_0F01_REG_1 */
6532 {
6533 { "sidt{Q|IQ}", { M } },
6534 { "sidt", { M } },
6535 },
6536
6537 /* X86_64_0F01_REG_2 */
6538 {
6539 { "lgdt{Q|Q}", { M } },
6540 { "lgdt", { M } },
6541 },
6542
6543 /* X86_64_0F01_REG_3 */
6544 {
6545 { "lidt{Q|Q}", { M } },
6546 { "lidt", { M } },
6547 },
6548 };
6549
6550 static const struct dis386 three_byte_table[][256] = {
6551
6552 /* THREE_BYTE_0F38 */
6553 {
6554 /* 00 */
6555 { "pshufb", { MX, EM } },
6556 { "phaddw", { MX, EM } },
6557 { "phaddd", { MX, EM } },
6558 { "phaddsw", { MX, EM } },
6559 { "pmaddubsw", { MX, EM } },
6560 { "phsubw", { MX, EM } },
6561 { "phsubd", { MX, EM } },
6562 { "phsubsw", { MX, EM } },
6563 /* 08 */
6564 { "psignb", { MX, EM } },
6565 { "psignw", { MX, EM } },
6566 { "psignd", { MX, EM } },
6567 { "pmulhrsw", { MX, EM } },
6568 { Bad_Opcode },
6569 { Bad_Opcode },
6570 { Bad_Opcode },
6571 { Bad_Opcode },
6572 /* 10 */
6573 { PREFIX_TABLE (PREFIX_0F3810) },
6574 { Bad_Opcode },
6575 { Bad_Opcode },
6576 { Bad_Opcode },
6577 { PREFIX_TABLE (PREFIX_0F3814) },
6578 { PREFIX_TABLE (PREFIX_0F3815) },
6579 { Bad_Opcode },
6580 { PREFIX_TABLE (PREFIX_0F3817) },
6581 /* 18 */
6582 { Bad_Opcode },
6583 { Bad_Opcode },
6584 { Bad_Opcode },
6585 { Bad_Opcode },
6586 { "pabsb", { MX, EM } },
6587 { "pabsw", { MX, EM } },
6588 { "pabsd", { MX, EM } },
6589 { Bad_Opcode },
6590 /* 20 */
6591 { PREFIX_TABLE (PREFIX_0F3820) },
6592 { PREFIX_TABLE (PREFIX_0F3821) },
6593 { PREFIX_TABLE (PREFIX_0F3822) },
6594 { PREFIX_TABLE (PREFIX_0F3823) },
6595 { PREFIX_TABLE (PREFIX_0F3824) },
6596 { PREFIX_TABLE (PREFIX_0F3825) },
6597 { Bad_Opcode },
6598 { Bad_Opcode },
6599 /* 28 */
6600 { PREFIX_TABLE (PREFIX_0F3828) },
6601 { PREFIX_TABLE (PREFIX_0F3829) },
6602 { PREFIX_TABLE (PREFIX_0F382A) },
6603 { PREFIX_TABLE (PREFIX_0F382B) },
6604 { Bad_Opcode },
6605 { Bad_Opcode },
6606 { Bad_Opcode },
6607 { Bad_Opcode },
6608 /* 30 */
6609 { PREFIX_TABLE (PREFIX_0F3830) },
6610 { PREFIX_TABLE (PREFIX_0F3831) },
6611 { PREFIX_TABLE (PREFIX_0F3832) },
6612 { PREFIX_TABLE (PREFIX_0F3833) },
6613 { PREFIX_TABLE (PREFIX_0F3834) },
6614 { PREFIX_TABLE (PREFIX_0F3835) },
6615 { Bad_Opcode },
6616 { PREFIX_TABLE (PREFIX_0F3837) },
6617 /* 38 */
6618 { PREFIX_TABLE (PREFIX_0F3838) },
6619 { PREFIX_TABLE (PREFIX_0F3839) },
6620 { PREFIX_TABLE (PREFIX_0F383A) },
6621 { PREFIX_TABLE (PREFIX_0F383B) },
6622 { PREFIX_TABLE (PREFIX_0F383C) },
6623 { PREFIX_TABLE (PREFIX_0F383D) },
6624 { PREFIX_TABLE (PREFIX_0F383E) },
6625 { PREFIX_TABLE (PREFIX_0F383F) },
6626 /* 40 */
6627 { PREFIX_TABLE (PREFIX_0F3840) },
6628 { PREFIX_TABLE (PREFIX_0F3841) },
6629 { Bad_Opcode },
6630 { Bad_Opcode },
6631 { Bad_Opcode },
6632 { Bad_Opcode },
6633 { Bad_Opcode },
6634 { Bad_Opcode },
6635 /* 48 */
6636 { Bad_Opcode },
6637 { Bad_Opcode },
6638 { Bad_Opcode },
6639 { Bad_Opcode },
6640 { Bad_Opcode },
6641 { Bad_Opcode },
6642 { Bad_Opcode },
6643 { Bad_Opcode },
6644 /* 50 */
6645 { Bad_Opcode },
6646 { Bad_Opcode },
6647 { Bad_Opcode },
6648 { Bad_Opcode },
6649 { Bad_Opcode },
6650 { Bad_Opcode },
6651 { Bad_Opcode },
6652 { Bad_Opcode },
6653 /* 58 */
6654 { Bad_Opcode },
6655 { Bad_Opcode },
6656 { Bad_Opcode },
6657 { Bad_Opcode },
6658 { Bad_Opcode },
6659 { Bad_Opcode },
6660 { Bad_Opcode },
6661 { Bad_Opcode },
6662 /* 60 */
6663 { Bad_Opcode },
6664 { Bad_Opcode },
6665 { Bad_Opcode },
6666 { Bad_Opcode },
6667 { Bad_Opcode },
6668 { Bad_Opcode },
6669 { Bad_Opcode },
6670 { Bad_Opcode },
6671 /* 68 */
6672 { Bad_Opcode },
6673 { Bad_Opcode },
6674 { Bad_Opcode },
6675 { Bad_Opcode },
6676 { Bad_Opcode },
6677 { Bad_Opcode },
6678 { Bad_Opcode },
6679 { Bad_Opcode },
6680 /* 70 */
6681 { Bad_Opcode },
6682 { Bad_Opcode },
6683 { Bad_Opcode },
6684 { Bad_Opcode },
6685 { Bad_Opcode },
6686 { Bad_Opcode },
6687 { Bad_Opcode },
6688 { Bad_Opcode },
6689 /* 78 */
6690 { Bad_Opcode },
6691 { Bad_Opcode },
6692 { Bad_Opcode },
6693 { Bad_Opcode },
6694 { Bad_Opcode },
6695 { Bad_Opcode },
6696 { Bad_Opcode },
6697 { Bad_Opcode },
6698 /* 80 */
6699 { PREFIX_TABLE (PREFIX_0F3880) },
6700 { PREFIX_TABLE (PREFIX_0F3881) },
6701 { PREFIX_TABLE (PREFIX_0F3882) },
6702 { Bad_Opcode },
6703 { Bad_Opcode },
6704 { Bad_Opcode },
6705 { Bad_Opcode },
6706 { Bad_Opcode },
6707 /* 88 */
6708 { Bad_Opcode },
6709 { Bad_Opcode },
6710 { Bad_Opcode },
6711 { Bad_Opcode },
6712 { Bad_Opcode },
6713 { Bad_Opcode },
6714 { Bad_Opcode },
6715 { Bad_Opcode },
6716 /* 90 */
6717 { Bad_Opcode },
6718 { Bad_Opcode },
6719 { Bad_Opcode },
6720 { Bad_Opcode },
6721 { Bad_Opcode },
6722 { Bad_Opcode },
6723 { Bad_Opcode },
6724 { Bad_Opcode },
6725 /* 98 */
6726 { Bad_Opcode },
6727 { Bad_Opcode },
6728 { Bad_Opcode },
6729 { Bad_Opcode },
6730 { Bad_Opcode },
6731 { Bad_Opcode },
6732 { Bad_Opcode },
6733 { Bad_Opcode },
6734 /* a0 */
6735 { Bad_Opcode },
6736 { Bad_Opcode },
6737 { Bad_Opcode },
6738 { Bad_Opcode },
6739 { Bad_Opcode },
6740 { Bad_Opcode },
6741 { Bad_Opcode },
6742 { Bad_Opcode },
6743 /* a8 */
6744 { Bad_Opcode },
6745 { Bad_Opcode },
6746 { Bad_Opcode },
6747 { Bad_Opcode },
6748 { Bad_Opcode },
6749 { Bad_Opcode },
6750 { Bad_Opcode },
6751 { Bad_Opcode },
6752 /* b0 */
6753 { Bad_Opcode },
6754 { Bad_Opcode },
6755 { Bad_Opcode },
6756 { Bad_Opcode },
6757 { Bad_Opcode },
6758 { Bad_Opcode },
6759 { Bad_Opcode },
6760 { Bad_Opcode },
6761 /* b8 */
6762 { Bad_Opcode },
6763 { Bad_Opcode },
6764 { Bad_Opcode },
6765 { Bad_Opcode },
6766 { Bad_Opcode },
6767 { Bad_Opcode },
6768 { Bad_Opcode },
6769 { Bad_Opcode },
6770 /* c0 */
6771 { Bad_Opcode },
6772 { Bad_Opcode },
6773 { Bad_Opcode },
6774 { Bad_Opcode },
6775 { Bad_Opcode },
6776 { Bad_Opcode },
6777 { Bad_Opcode },
6778 { Bad_Opcode },
6779 /* c8 */
6780 { PREFIX_TABLE (PREFIX_0F38C8) },
6781 { PREFIX_TABLE (PREFIX_0F38C9) },
6782 { PREFIX_TABLE (PREFIX_0F38CA) },
6783 { PREFIX_TABLE (PREFIX_0F38CB) },
6784 { PREFIX_TABLE (PREFIX_0F38CC) },
6785 { PREFIX_TABLE (PREFIX_0F38CD) },
6786 { Bad_Opcode },
6787 { Bad_Opcode },
6788 /* d0 */
6789 { Bad_Opcode },
6790 { Bad_Opcode },
6791 { Bad_Opcode },
6792 { Bad_Opcode },
6793 { Bad_Opcode },
6794 { Bad_Opcode },
6795 { Bad_Opcode },
6796 { Bad_Opcode },
6797 /* d8 */
6798 { Bad_Opcode },
6799 { Bad_Opcode },
6800 { Bad_Opcode },
6801 { PREFIX_TABLE (PREFIX_0F38DB) },
6802 { PREFIX_TABLE (PREFIX_0F38DC) },
6803 { PREFIX_TABLE (PREFIX_0F38DD) },
6804 { PREFIX_TABLE (PREFIX_0F38DE) },
6805 { PREFIX_TABLE (PREFIX_0F38DF) },
6806 /* e0 */
6807 { Bad_Opcode },
6808 { Bad_Opcode },
6809 { Bad_Opcode },
6810 { Bad_Opcode },
6811 { Bad_Opcode },
6812 { Bad_Opcode },
6813 { Bad_Opcode },
6814 { Bad_Opcode },
6815 /* e8 */
6816 { Bad_Opcode },
6817 { Bad_Opcode },
6818 { Bad_Opcode },
6819 { Bad_Opcode },
6820 { Bad_Opcode },
6821 { Bad_Opcode },
6822 { Bad_Opcode },
6823 { Bad_Opcode },
6824 /* f0 */
6825 { PREFIX_TABLE (PREFIX_0F38F0) },
6826 { PREFIX_TABLE (PREFIX_0F38F1) },
6827 { Bad_Opcode },
6828 { Bad_Opcode },
6829 { Bad_Opcode },
6830 { Bad_Opcode },
6831 { PREFIX_TABLE (PREFIX_0F38F6) },
6832 { Bad_Opcode },
6833 /* f8 */
6834 { Bad_Opcode },
6835 { Bad_Opcode },
6836 { Bad_Opcode },
6837 { Bad_Opcode },
6838 { Bad_Opcode },
6839 { Bad_Opcode },
6840 { Bad_Opcode },
6841 { Bad_Opcode },
6842 },
6843 /* THREE_BYTE_0F3A */
6844 {
6845 /* 00 */
6846 { Bad_Opcode },
6847 { Bad_Opcode },
6848 { Bad_Opcode },
6849 { Bad_Opcode },
6850 { Bad_Opcode },
6851 { Bad_Opcode },
6852 { Bad_Opcode },
6853 { Bad_Opcode },
6854 /* 08 */
6855 { PREFIX_TABLE (PREFIX_0F3A08) },
6856 { PREFIX_TABLE (PREFIX_0F3A09) },
6857 { PREFIX_TABLE (PREFIX_0F3A0A) },
6858 { PREFIX_TABLE (PREFIX_0F3A0B) },
6859 { PREFIX_TABLE (PREFIX_0F3A0C) },
6860 { PREFIX_TABLE (PREFIX_0F3A0D) },
6861 { PREFIX_TABLE (PREFIX_0F3A0E) },
6862 { "palignr", { MX, EM, Ib } },
6863 /* 10 */
6864 { Bad_Opcode },
6865 { Bad_Opcode },
6866 { Bad_Opcode },
6867 { Bad_Opcode },
6868 { PREFIX_TABLE (PREFIX_0F3A14) },
6869 { PREFIX_TABLE (PREFIX_0F3A15) },
6870 { PREFIX_TABLE (PREFIX_0F3A16) },
6871 { PREFIX_TABLE (PREFIX_0F3A17) },
6872 /* 18 */
6873 { Bad_Opcode },
6874 { Bad_Opcode },
6875 { Bad_Opcode },
6876 { Bad_Opcode },
6877 { Bad_Opcode },
6878 { Bad_Opcode },
6879 { Bad_Opcode },
6880 { Bad_Opcode },
6881 /* 20 */
6882 { PREFIX_TABLE (PREFIX_0F3A20) },
6883 { PREFIX_TABLE (PREFIX_0F3A21) },
6884 { PREFIX_TABLE (PREFIX_0F3A22) },
6885 { Bad_Opcode },
6886 { Bad_Opcode },
6887 { Bad_Opcode },
6888 { Bad_Opcode },
6889 { Bad_Opcode },
6890 /* 28 */
6891 { Bad_Opcode },
6892 { Bad_Opcode },
6893 { Bad_Opcode },
6894 { Bad_Opcode },
6895 { Bad_Opcode },
6896 { Bad_Opcode },
6897 { Bad_Opcode },
6898 { Bad_Opcode },
6899 /* 30 */
6900 { Bad_Opcode },
6901 { Bad_Opcode },
6902 { Bad_Opcode },
6903 { Bad_Opcode },
6904 { Bad_Opcode },
6905 { Bad_Opcode },
6906 { Bad_Opcode },
6907 { Bad_Opcode },
6908 /* 38 */
6909 { Bad_Opcode },
6910 { Bad_Opcode },
6911 { Bad_Opcode },
6912 { Bad_Opcode },
6913 { Bad_Opcode },
6914 { Bad_Opcode },
6915 { Bad_Opcode },
6916 { Bad_Opcode },
6917 /* 40 */
6918 { PREFIX_TABLE (PREFIX_0F3A40) },
6919 { PREFIX_TABLE (PREFIX_0F3A41) },
6920 { PREFIX_TABLE (PREFIX_0F3A42) },
6921 { Bad_Opcode },
6922 { PREFIX_TABLE (PREFIX_0F3A44) },
6923 { Bad_Opcode },
6924 { Bad_Opcode },
6925 { Bad_Opcode },
6926 /* 48 */
6927 { Bad_Opcode },
6928 { Bad_Opcode },
6929 { Bad_Opcode },
6930 { Bad_Opcode },
6931 { Bad_Opcode },
6932 { Bad_Opcode },
6933 { Bad_Opcode },
6934 { Bad_Opcode },
6935 /* 50 */
6936 { Bad_Opcode },
6937 { Bad_Opcode },
6938 { Bad_Opcode },
6939 { Bad_Opcode },
6940 { Bad_Opcode },
6941 { Bad_Opcode },
6942 { Bad_Opcode },
6943 { Bad_Opcode },
6944 /* 58 */
6945 { Bad_Opcode },
6946 { Bad_Opcode },
6947 { Bad_Opcode },
6948 { Bad_Opcode },
6949 { Bad_Opcode },
6950 { Bad_Opcode },
6951 { Bad_Opcode },
6952 { Bad_Opcode },
6953 /* 60 */
6954 { PREFIX_TABLE (PREFIX_0F3A60) },
6955 { PREFIX_TABLE (PREFIX_0F3A61) },
6956 { PREFIX_TABLE (PREFIX_0F3A62) },
6957 { PREFIX_TABLE (PREFIX_0F3A63) },
6958 { Bad_Opcode },
6959 { Bad_Opcode },
6960 { Bad_Opcode },
6961 { Bad_Opcode },
6962 /* 68 */
6963 { Bad_Opcode },
6964 { Bad_Opcode },
6965 { Bad_Opcode },
6966 { Bad_Opcode },
6967 { Bad_Opcode },
6968 { Bad_Opcode },
6969 { Bad_Opcode },
6970 { Bad_Opcode },
6971 /* 70 */
6972 { Bad_Opcode },
6973 { Bad_Opcode },
6974 { Bad_Opcode },
6975 { Bad_Opcode },
6976 { Bad_Opcode },
6977 { Bad_Opcode },
6978 { Bad_Opcode },
6979 { Bad_Opcode },
6980 /* 78 */
6981 { Bad_Opcode },
6982 { Bad_Opcode },
6983 { Bad_Opcode },
6984 { Bad_Opcode },
6985 { Bad_Opcode },
6986 { Bad_Opcode },
6987 { Bad_Opcode },
6988 { Bad_Opcode },
6989 /* 80 */
6990 { Bad_Opcode },
6991 { Bad_Opcode },
6992 { Bad_Opcode },
6993 { Bad_Opcode },
6994 { Bad_Opcode },
6995 { Bad_Opcode },
6996 { Bad_Opcode },
6997 { Bad_Opcode },
6998 /* 88 */
6999 { Bad_Opcode },
7000 { Bad_Opcode },
7001 { Bad_Opcode },
7002 { Bad_Opcode },
7003 { Bad_Opcode },
7004 { Bad_Opcode },
7005 { Bad_Opcode },
7006 { Bad_Opcode },
7007 /* 90 */
7008 { Bad_Opcode },
7009 { Bad_Opcode },
7010 { Bad_Opcode },
7011 { Bad_Opcode },
7012 { Bad_Opcode },
7013 { Bad_Opcode },
7014 { Bad_Opcode },
7015 { Bad_Opcode },
7016 /* 98 */
7017 { Bad_Opcode },
7018 { Bad_Opcode },
7019 { Bad_Opcode },
7020 { Bad_Opcode },
7021 { Bad_Opcode },
7022 { Bad_Opcode },
7023 { Bad_Opcode },
7024 { Bad_Opcode },
7025 /* a0 */
7026 { Bad_Opcode },
7027 { Bad_Opcode },
7028 { Bad_Opcode },
7029 { Bad_Opcode },
7030 { Bad_Opcode },
7031 { Bad_Opcode },
7032 { Bad_Opcode },
7033 { Bad_Opcode },
7034 /* a8 */
7035 { Bad_Opcode },
7036 { Bad_Opcode },
7037 { Bad_Opcode },
7038 { Bad_Opcode },
7039 { Bad_Opcode },
7040 { Bad_Opcode },
7041 { Bad_Opcode },
7042 { Bad_Opcode },
7043 /* b0 */
7044 { Bad_Opcode },
7045 { Bad_Opcode },
7046 { Bad_Opcode },
7047 { Bad_Opcode },
7048 { Bad_Opcode },
7049 { Bad_Opcode },
7050 { Bad_Opcode },
7051 { Bad_Opcode },
7052 /* b8 */
7053 { Bad_Opcode },
7054 { Bad_Opcode },
7055 { Bad_Opcode },
7056 { Bad_Opcode },
7057 { Bad_Opcode },
7058 { Bad_Opcode },
7059 { Bad_Opcode },
7060 { Bad_Opcode },
7061 /* c0 */
7062 { Bad_Opcode },
7063 { Bad_Opcode },
7064 { Bad_Opcode },
7065 { Bad_Opcode },
7066 { Bad_Opcode },
7067 { Bad_Opcode },
7068 { Bad_Opcode },
7069 { Bad_Opcode },
7070 /* c8 */
7071 { Bad_Opcode },
7072 { Bad_Opcode },
7073 { Bad_Opcode },
7074 { Bad_Opcode },
7075 { PREFIX_TABLE (PREFIX_0F3ACC) },
7076 { Bad_Opcode },
7077 { Bad_Opcode },
7078 { Bad_Opcode },
7079 /* d0 */
7080 { Bad_Opcode },
7081 { Bad_Opcode },
7082 { Bad_Opcode },
7083 { Bad_Opcode },
7084 { Bad_Opcode },
7085 { Bad_Opcode },
7086 { Bad_Opcode },
7087 { Bad_Opcode },
7088 /* d8 */
7089 { Bad_Opcode },
7090 { Bad_Opcode },
7091 { Bad_Opcode },
7092 { Bad_Opcode },
7093 { Bad_Opcode },
7094 { Bad_Opcode },
7095 { Bad_Opcode },
7096 { PREFIX_TABLE (PREFIX_0F3ADF) },
7097 /* e0 */
7098 { Bad_Opcode },
7099 { Bad_Opcode },
7100 { Bad_Opcode },
7101 { Bad_Opcode },
7102 { Bad_Opcode },
7103 { Bad_Opcode },
7104 { Bad_Opcode },
7105 { Bad_Opcode },
7106 /* e8 */
7107 { Bad_Opcode },
7108 { Bad_Opcode },
7109 { Bad_Opcode },
7110 { Bad_Opcode },
7111 { Bad_Opcode },
7112 { Bad_Opcode },
7113 { Bad_Opcode },
7114 { Bad_Opcode },
7115 /* f0 */
7116 { Bad_Opcode },
7117 { Bad_Opcode },
7118 { Bad_Opcode },
7119 { Bad_Opcode },
7120 { Bad_Opcode },
7121 { Bad_Opcode },
7122 { Bad_Opcode },
7123 { Bad_Opcode },
7124 /* f8 */
7125 { Bad_Opcode },
7126 { Bad_Opcode },
7127 { Bad_Opcode },
7128 { Bad_Opcode },
7129 { Bad_Opcode },
7130 { Bad_Opcode },
7131 { Bad_Opcode },
7132 { Bad_Opcode },
7133 },
7134
7135 /* THREE_BYTE_0F7A */
7136 {
7137 /* 00 */
7138 { Bad_Opcode },
7139 { Bad_Opcode },
7140 { Bad_Opcode },
7141 { Bad_Opcode },
7142 { Bad_Opcode },
7143 { Bad_Opcode },
7144 { Bad_Opcode },
7145 { Bad_Opcode },
7146 /* 08 */
7147 { Bad_Opcode },
7148 { Bad_Opcode },
7149 { Bad_Opcode },
7150 { Bad_Opcode },
7151 { Bad_Opcode },
7152 { Bad_Opcode },
7153 { Bad_Opcode },
7154 { Bad_Opcode },
7155 /* 10 */
7156 { Bad_Opcode },
7157 { Bad_Opcode },
7158 { Bad_Opcode },
7159 { Bad_Opcode },
7160 { Bad_Opcode },
7161 { Bad_Opcode },
7162 { Bad_Opcode },
7163 { Bad_Opcode },
7164 /* 18 */
7165 { Bad_Opcode },
7166 { Bad_Opcode },
7167 { Bad_Opcode },
7168 { Bad_Opcode },
7169 { Bad_Opcode },
7170 { Bad_Opcode },
7171 { Bad_Opcode },
7172 { Bad_Opcode },
7173 /* 20 */
7174 { "ptest", { XX } },
7175 { Bad_Opcode },
7176 { Bad_Opcode },
7177 { Bad_Opcode },
7178 { Bad_Opcode },
7179 { Bad_Opcode },
7180 { Bad_Opcode },
7181 { Bad_Opcode },
7182 /* 28 */
7183 { Bad_Opcode },
7184 { Bad_Opcode },
7185 { Bad_Opcode },
7186 { Bad_Opcode },
7187 { Bad_Opcode },
7188 { Bad_Opcode },
7189 { Bad_Opcode },
7190 { Bad_Opcode },
7191 /* 30 */
7192 { Bad_Opcode },
7193 { Bad_Opcode },
7194 { Bad_Opcode },
7195 { Bad_Opcode },
7196 { Bad_Opcode },
7197 { Bad_Opcode },
7198 { Bad_Opcode },
7199 { Bad_Opcode },
7200 /* 38 */
7201 { Bad_Opcode },
7202 { Bad_Opcode },
7203 { Bad_Opcode },
7204 { Bad_Opcode },
7205 { Bad_Opcode },
7206 { Bad_Opcode },
7207 { Bad_Opcode },
7208 { Bad_Opcode },
7209 /* 40 */
7210 { Bad_Opcode },
7211 { "phaddbw", { XM, EXq } },
7212 { "phaddbd", { XM, EXq } },
7213 { "phaddbq", { XM, EXq } },
7214 { Bad_Opcode },
7215 { Bad_Opcode },
7216 { "phaddwd", { XM, EXq } },
7217 { "phaddwq", { XM, EXq } },
7218 /* 48 */
7219 { Bad_Opcode },
7220 { Bad_Opcode },
7221 { Bad_Opcode },
7222 { "phadddq", { XM, EXq } },
7223 { Bad_Opcode },
7224 { Bad_Opcode },
7225 { Bad_Opcode },
7226 { Bad_Opcode },
7227 /* 50 */
7228 { Bad_Opcode },
7229 { "phaddubw", { XM, EXq } },
7230 { "phaddubd", { XM, EXq } },
7231 { "phaddubq", { XM, EXq } },
7232 { Bad_Opcode },
7233 { Bad_Opcode },
7234 { "phadduwd", { XM, EXq } },
7235 { "phadduwq", { XM, EXq } },
7236 /* 58 */
7237 { Bad_Opcode },
7238 { Bad_Opcode },
7239 { Bad_Opcode },
7240 { "phaddudq", { XM, EXq } },
7241 { Bad_Opcode },
7242 { Bad_Opcode },
7243 { Bad_Opcode },
7244 { Bad_Opcode },
7245 /* 60 */
7246 { Bad_Opcode },
7247 { "phsubbw", { XM, EXq } },
7248 { "phsubbd", { XM, EXq } },
7249 { "phsubbq", { XM, EXq } },
7250 { Bad_Opcode },
7251 { Bad_Opcode },
7252 { Bad_Opcode },
7253 { Bad_Opcode },
7254 /* 68 */
7255 { Bad_Opcode },
7256 { Bad_Opcode },
7257 { Bad_Opcode },
7258 { Bad_Opcode },
7259 { Bad_Opcode },
7260 { Bad_Opcode },
7261 { Bad_Opcode },
7262 { Bad_Opcode },
7263 /* 70 */
7264 { Bad_Opcode },
7265 { Bad_Opcode },
7266 { Bad_Opcode },
7267 { Bad_Opcode },
7268 { Bad_Opcode },
7269 { Bad_Opcode },
7270 { Bad_Opcode },
7271 { Bad_Opcode },
7272 /* 78 */
7273 { Bad_Opcode },
7274 { Bad_Opcode },
7275 { Bad_Opcode },
7276 { Bad_Opcode },
7277 { Bad_Opcode },
7278 { Bad_Opcode },
7279 { Bad_Opcode },
7280 { Bad_Opcode },
7281 /* 80 */
7282 { Bad_Opcode },
7283 { Bad_Opcode },
7284 { Bad_Opcode },
7285 { Bad_Opcode },
7286 { Bad_Opcode },
7287 { Bad_Opcode },
7288 { Bad_Opcode },
7289 { Bad_Opcode },
7290 /* 88 */
7291 { Bad_Opcode },
7292 { Bad_Opcode },
7293 { Bad_Opcode },
7294 { Bad_Opcode },
7295 { Bad_Opcode },
7296 { Bad_Opcode },
7297 { Bad_Opcode },
7298 { Bad_Opcode },
7299 /* 90 */
7300 { Bad_Opcode },
7301 { Bad_Opcode },
7302 { Bad_Opcode },
7303 { Bad_Opcode },
7304 { Bad_Opcode },
7305 { Bad_Opcode },
7306 { Bad_Opcode },
7307 { Bad_Opcode },
7308 /* 98 */
7309 { Bad_Opcode },
7310 { Bad_Opcode },
7311 { Bad_Opcode },
7312 { Bad_Opcode },
7313 { Bad_Opcode },
7314 { Bad_Opcode },
7315 { Bad_Opcode },
7316 { Bad_Opcode },
7317 /* a0 */
7318 { Bad_Opcode },
7319 { Bad_Opcode },
7320 { Bad_Opcode },
7321 { Bad_Opcode },
7322 { Bad_Opcode },
7323 { Bad_Opcode },
7324 { Bad_Opcode },
7325 { Bad_Opcode },
7326 /* a8 */
7327 { Bad_Opcode },
7328 { Bad_Opcode },
7329 { Bad_Opcode },
7330 { Bad_Opcode },
7331 { Bad_Opcode },
7332 { Bad_Opcode },
7333 { Bad_Opcode },
7334 { Bad_Opcode },
7335 /* b0 */
7336 { Bad_Opcode },
7337 { Bad_Opcode },
7338 { Bad_Opcode },
7339 { Bad_Opcode },
7340 { Bad_Opcode },
7341 { Bad_Opcode },
7342 { Bad_Opcode },
7343 { Bad_Opcode },
7344 /* b8 */
7345 { Bad_Opcode },
7346 { Bad_Opcode },
7347 { Bad_Opcode },
7348 { Bad_Opcode },
7349 { Bad_Opcode },
7350 { Bad_Opcode },
7351 { Bad_Opcode },
7352 { Bad_Opcode },
7353 /* c0 */
7354 { Bad_Opcode },
7355 { Bad_Opcode },
7356 { Bad_Opcode },
7357 { Bad_Opcode },
7358 { Bad_Opcode },
7359 { Bad_Opcode },
7360 { Bad_Opcode },
7361 { Bad_Opcode },
7362 /* c8 */
7363 { Bad_Opcode },
7364 { Bad_Opcode },
7365 { Bad_Opcode },
7366 { Bad_Opcode },
7367 { Bad_Opcode },
7368 { Bad_Opcode },
7369 { Bad_Opcode },
7370 { Bad_Opcode },
7371 /* d0 */
7372 { Bad_Opcode },
7373 { Bad_Opcode },
7374 { Bad_Opcode },
7375 { Bad_Opcode },
7376 { Bad_Opcode },
7377 { Bad_Opcode },
7378 { Bad_Opcode },
7379 { Bad_Opcode },
7380 /* d8 */
7381 { Bad_Opcode },
7382 { Bad_Opcode },
7383 { Bad_Opcode },
7384 { Bad_Opcode },
7385 { Bad_Opcode },
7386 { Bad_Opcode },
7387 { Bad_Opcode },
7388 { Bad_Opcode },
7389 /* e0 */
7390 { Bad_Opcode },
7391 { Bad_Opcode },
7392 { Bad_Opcode },
7393 { Bad_Opcode },
7394 { Bad_Opcode },
7395 { Bad_Opcode },
7396 { Bad_Opcode },
7397 { Bad_Opcode },
7398 /* e8 */
7399 { Bad_Opcode },
7400 { Bad_Opcode },
7401 { Bad_Opcode },
7402 { Bad_Opcode },
7403 { Bad_Opcode },
7404 { Bad_Opcode },
7405 { Bad_Opcode },
7406 { Bad_Opcode },
7407 /* f0 */
7408 { Bad_Opcode },
7409 { Bad_Opcode },
7410 { Bad_Opcode },
7411 { Bad_Opcode },
7412 { Bad_Opcode },
7413 { Bad_Opcode },
7414 { Bad_Opcode },
7415 { Bad_Opcode },
7416 /* f8 */
7417 { Bad_Opcode },
7418 { Bad_Opcode },
7419 { Bad_Opcode },
7420 { Bad_Opcode },
7421 { Bad_Opcode },
7422 { Bad_Opcode },
7423 { Bad_Opcode },
7424 { Bad_Opcode },
7425 },
7426 };
7427
7428 static const struct dis386 xop_table[][256] = {
7429 /* XOP_08 */
7430 {
7431 /* 00 */
7432 { Bad_Opcode },
7433 { Bad_Opcode },
7434 { Bad_Opcode },
7435 { Bad_Opcode },
7436 { Bad_Opcode },
7437 { Bad_Opcode },
7438 { Bad_Opcode },
7439 { Bad_Opcode },
7440 /* 08 */
7441 { Bad_Opcode },
7442 { Bad_Opcode },
7443 { Bad_Opcode },
7444 { Bad_Opcode },
7445 { Bad_Opcode },
7446 { Bad_Opcode },
7447 { Bad_Opcode },
7448 { Bad_Opcode },
7449 /* 10 */
7450 { Bad_Opcode },
7451 { Bad_Opcode },
7452 { Bad_Opcode },
7453 { Bad_Opcode },
7454 { Bad_Opcode },
7455 { Bad_Opcode },
7456 { Bad_Opcode },
7457 { Bad_Opcode },
7458 /* 18 */
7459 { Bad_Opcode },
7460 { Bad_Opcode },
7461 { Bad_Opcode },
7462 { Bad_Opcode },
7463 { Bad_Opcode },
7464 { Bad_Opcode },
7465 { Bad_Opcode },
7466 { Bad_Opcode },
7467 /* 20 */
7468 { Bad_Opcode },
7469 { Bad_Opcode },
7470 { Bad_Opcode },
7471 { Bad_Opcode },
7472 { Bad_Opcode },
7473 { Bad_Opcode },
7474 { Bad_Opcode },
7475 { Bad_Opcode },
7476 /* 28 */
7477 { Bad_Opcode },
7478 { Bad_Opcode },
7479 { Bad_Opcode },
7480 { Bad_Opcode },
7481 { Bad_Opcode },
7482 { Bad_Opcode },
7483 { Bad_Opcode },
7484 { Bad_Opcode },
7485 /* 30 */
7486 { Bad_Opcode },
7487 { Bad_Opcode },
7488 { Bad_Opcode },
7489 { Bad_Opcode },
7490 { Bad_Opcode },
7491 { Bad_Opcode },
7492 { Bad_Opcode },
7493 { Bad_Opcode },
7494 /* 38 */
7495 { Bad_Opcode },
7496 { Bad_Opcode },
7497 { Bad_Opcode },
7498 { Bad_Opcode },
7499 { Bad_Opcode },
7500 { Bad_Opcode },
7501 { Bad_Opcode },
7502 { Bad_Opcode },
7503 /* 40 */
7504 { Bad_Opcode },
7505 { Bad_Opcode },
7506 { Bad_Opcode },
7507 { Bad_Opcode },
7508 { Bad_Opcode },
7509 { Bad_Opcode },
7510 { Bad_Opcode },
7511 { Bad_Opcode },
7512 /* 48 */
7513 { Bad_Opcode },
7514 { Bad_Opcode },
7515 { Bad_Opcode },
7516 { Bad_Opcode },
7517 { Bad_Opcode },
7518 { Bad_Opcode },
7519 { Bad_Opcode },
7520 { Bad_Opcode },
7521 /* 50 */
7522 { Bad_Opcode },
7523 { Bad_Opcode },
7524 { Bad_Opcode },
7525 { Bad_Opcode },
7526 { Bad_Opcode },
7527 { Bad_Opcode },
7528 { Bad_Opcode },
7529 { Bad_Opcode },
7530 /* 58 */
7531 { Bad_Opcode },
7532 { Bad_Opcode },
7533 { Bad_Opcode },
7534 { Bad_Opcode },
7535 { Bad_Opcode },
7536 { Bad_Opcode },
7537 { Bad_Opcode },
7538 { Bad_Opcode },
7539 /* 60 */
7540 { Bad_Opcode },
7541 { Bad_Opcode },
7542 { Bad_Opcode },
7543 { Bad_Opcode },
7544 { Bad_Opcode },
7545 { Bad_Opcode },
7546 { Bad_Opcode },
7547 { Bad_Opcode },
7548 /* 68 */
7549 { Bad_Opcode },
7550 { Bad_Opcode },
7551 { Bad_Opcode },
7552 { Bad_Opcode },
7553 { Bad_Opcode },
7554 { Bad_Opcode },
7555 { Bad_Opcode },
7556 { Bad_Opcode },
7557 /* 70 */
7558 { Bad_Opcode },
7559 { Bad_Opcode },
7560 { Bad_Opcode },
7561 { Bad_Opcode },
7562 { Bad_Opcode },
7563 { Bad_Opcode },
7564 { Bad_Opcode },
7565 { Bad_Opcode },
7566 /* 78 */
7567 { Bad_Opcode },
7568 { Bad_Opcode },
7569 { Bad_Opcode },
7570 { Bad_Opcode },
7571 { Bad_Opcode },
7572 { Bad_Opcode },
7573 { Bad_Opcode },
7574 { Bad_Opcode },
7575 /* 80 */
7576 { Bad_Opcode },
7577 { Bad_Opcode },
7578 { Bad_Opcode },
7579 { Bad_Opcode },
7580 { Bad_Opcode },
7581 { "vpmacssww", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
7582 { "vpmacsswd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
7583 { "vpmacssdql", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
7584 /* 88 */
7585 { Bad_Opcode },
7586 { Bad_Opcode },
7587 { Bad_Opcode },
7588 { Bad_Opcode },
7589 { Bad_Opcode },
7590 { Bad_Opcode },
7591 { "vpmacssdd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
7592 { "vpmacssdqh", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
7593 /* 90 */
7594 { Bad_Opcode },
7595 { Bad_Opcode },
7596 { Bad_Opcode },
7597 { Bad_Opcode },
7598 { Bad_Opcode },
7599 { "vpmacsww", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
7600 { "vpmacswd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
7601 { "vpmacsdql", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
7602 /* 98 */
7603 { Bad_Opcode },
7604 { Bad_Opcode },
7605 { Bad_Opcode },
7606 { Bad_Opcode },
7607 { Bad_Opcode },
7608 { Bad_Opcode },
7609 { "vpmacsdd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
7610 { "vpmacsdqh", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
7611 /* a0 */
7612 { Bad_Opcode },
7613 { Bad_Opcode },
7614 { "vpcmov", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
7615 { "vpperm", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
7616 { Bad_Opcode },
7617 { Bad_Opcode },
7618 { "vpmadcsswd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
7619 { Bad_Opcode },
7620 /* a8 */
7621 { Bad_Opcode },
7622 { Bad_Opcode },
7623 { Bad_Opcode },
7624 { Bad_Opcode },
7625 { Bad_Opcode },
7626 { Bad_Opcode },
7627 { Bad_Opcode },
7628 { Bad_Opcode },
7629 /* b0 */
7630 { Bad_Opcode },
7631 { Bad_Opcode },
7632 { Bad_Opcode },
7633 { Bad_Opcode },
7634 { Bad_Opcode },
7635 { Bad_Opcode },
7636 { "vpmadcswd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
7637 { Bad_Opcode },
7638 /* b8 */
7639 { Bad_Opcode },
7640 { Bad_Opcode },
7641 { Bad_Opcode },
7642 { Bad_Opcode },
7643 { Bad_Opcode },
7644 { Bad_Opcode },
7645 { Bad_Opcode },
7646 { Bad_Opcode },
7647 /* c0 */
7648 { "vprotb", { XM, Vex_2src_1, Ib } },
7649 { "vprotw", { XM, Vex_2src_1, Ib } },
7650 { "vprotd", { XM, Vex_2src_1, Ib } },
7651 { "vprotq", { XM, Vex_2src_1, Ib } },
7652 { Bad_Opcode },
7653 { Bad_Opcode },
7654 { Bad_Opcode },
7655 { Bad_Opcode },
7656 /* c8 */
7657 { Bad_Opcode },
7658 { Bad_Opcode },
7659 { Bad_Opcode },
7660 { Bad_Opcode },
7661 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CC) },
7662 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CD) },
7663 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CE) },
7664 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CF) },
7665 /* d0 */
7666 { Bad_Opcode },
7667 { Bad_Opcode },
7668 { Bad_Opcode },
7669 { Bad_Opcode },
7670 { Bad_Opcode },
7671 { Bad_Opcode },
7672 { Bad_Opcode },
7673 { Bad_Opcode },
7674 /* d8 */
7675 { Bad_Opcode },
7676 { Bad_Opcode },
7677 { Bad_Opcode },
7678 { Bad_Opcode },
7679 { Bad_Opcode },
7680 { Bad_Opcode },
7681 { Bad_Opcode },
7682 { Bad_Opcode },
7683 /* e0 */
7684 { Bad_Opcode },
7685 { Bad_Opcode },
7686 { Bad_Opcode },
7687 { Bad_Opcode },
7688 { Bad_Opcode },
7689 { Bad_Opcode },
7690 { Bad_Opcode },
7691 { Bad_Opcode },
7692 /* e8 */
7693 { Bad_Opcode },
7694 { Bad_Opcode },
7695 { Bad_Opcode },
7696 { Bad_Opcode },
7697 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EC) },
7698 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_ED) },
7699 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EE) },
7700 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EF) },
7701 /* f0 */
7702 { Bad_Opcode },
7703 { Bad_Opcode },
7704 { Bad_Opcode },
7705 { Bad_Opcode },
7706 { Bad_Opcode },
7707 { Bad_Opcode },
7708 { Bad_Opcode },
7709 { Bad_Opcode },
7710 /* f8 */
7711 { Bad_Opcode },
7712 { Bad_Opcode },
7713 { Bad_Opcode },
7714 { Bad_Opcode },
7715 { Bad_Opcode },
7716 { Bad_Opcode },
7717 { Bad_Opcode },
7718 { Bad_Opcode },
7719 },
7720 /* XOP_09 */
7721 {
7722 /* 00 */
7723 { Bad_Opcode },
7724 { REG_TABLE (REG_XOP_TBM_01) },
7725 { REG_TABLE (REG_XOP_TBM_02) },
7726 { Bad_Opcode },
7727 { Bad_Opcode },
7728 { Bad_Opcode },
7729 { Bad_Opcode },
7730 { Bad_Opcode },
7731 /* 08 */
7732 { Bad_Opcode },
7733 { Bad_Opcode },
7734 { Bad_Opcode },
7735 { Bad_Opcode },
7736 { Bad_Opcode },
7737 { Bad_Opcode },
7738 { Bad_Opcode },
7739 { Bad_Opcode },
7740 /* 10 */
7741 { Bad_Opcode },
7742 { Bad_Opcode },
7743 { REG_TABLE (REG_XOP_LWPCB) },
7744 { Bad_Opcode },
7745 { Bad_Opcode },
7746 { Bad_Opcode },
7747 { Bad_Opcode },
7748 { Bad_Opcode },
7749 /* 18 */
7750 { Bad_Opcode },
7751 { Bad_Opcode },
7752 { Bad_Opcode },
7753 { Bad_Opcode },
7754 { Bad_Opcode },
7755 { Bad_Opcode },
7756 { Bad_Opcode },
7757 { Bad_Opcode },
7758 /* 20 */
7759 { Bad_Opcode },
7760 { Bad_Opcode },
7761 { Bad_Opcode },
7762 { Bad_Opcode },
7763 { Bad_Opcode },
7764 { Bad_Opcode },
7765 { Bad_Opcode },
7766 { Bad_Opcode },
7767 /* 28 */
7768 { Bad_Opcode },
7769 { Bad_Opcode },
7770 { Bad_Opcode },
7771 { Bad_Opcode },
7772 { Bad_Opcode },
7773 { Bad_Opcode },
7774 { Bad_Opcode },
7775 { Bad_Opcode },
7776 /* 30 */
7777 { Bad_Opcode },
7778 { Bad_Opcode },
7779 { Bad_Opcode },
7780 { Bad_Opcode },
7781 { Bad_Opcode },
7782 { Bad_Opcode },
7783 { Bad_Opcode },
7784 { Bad_Opcode },
7785 /* 38 */
7786 { Bad_Opcode },
7787 { Bad_Opcode },
7788 { Bad_Opcode },
7789 { Bad_Opcode },
7790 { Bad_Opcode },
7791 { Bad_Opcode },
7792 { Bad_Opcode },
7793 { Bad_Opcode },
7794 /* 40 */
7795 { Bad_Opcode },
7796 { Bad_Opcode },
7797 { Bad_Opcode },
7798 { Bad_Opcode },
7799 { Bad_Opcode },
7800 { Bad_Opcode },
7801 { Bad_Opcode },
7802 { Bad_Opcode },
7803 /* 48 */
7804 { Bad_Opcode },
7805 { Bad_Opcode },
7806 { Bad_Opcode },
7807 { Bad_Opcode },
7808 { Bad_Opcode },
7809 { Bad_Opcode },
7810 { Bad_Opcode },
7811 { Bad_Opcode },
7812 /* 50 */
7813 { Bad_Opcode },
7814 { Bad_Opcode },
7815 { Bad_Opcode },
7816 { Bad_Opcode },
7817 { Bad_Opcode },
7818 { Bad_Opcode },
7819 { Bad_Opcode },
7820 { Bad_Opcode },
7821 /* 58 */
7822 { Bad_Opcode },
7823 { Bad_Opcode },
7824 { Bad_Opcode },
7825 { Bad_Opcode },
7826 { Bad_Opcode },
7827 { Bad_Opcode },
7828 { Bad_Opcode },
7829 { Bad_Opcode },
7830 /* 60 */
7831 { Bad_Opcode },
7832 { Bad_Opcode },
7833 { Bad_Opcode },
7834 { Bad_Opcode },
7835 { Bad_Opcode },
7836 { Bad_Opcode },
7837 { Bad_Opcode },
7838 { Bad_Opcode },
7839 /* 68 */
7840 { Bad_Opcode },
7841 { Bad_Opcode },
7842 { Bad_Opcode },
7843 { Bad_Opcode },
7844 { Bad_Opcode },
7845 { Bad_Opcode },
7846 { Bad_Opcode },
7847 { Bad_Opcode },
7848 /* 70 */
7849 { Bad_Opcode },
7850 { Bad_Opcode },
7851 { Bad_Opcode },
7852 { Bad_Opcode },
7853 { Bad_Opcode },
7854 { Bad_Opcode },
7855 { Bad_Opcode },
7856 { Bad_Opcode },
7857 /* 78 */
7858 { Bad_Opcode },
7859 { Bad_Opcode },
7860 { Bad_Opcode },
7861 { Bad_Opcode },
7862 { Bad_Opcode },
7863 { Bad_Opcode },
7864 { Bad_Opcode },
7865 { Bad_Opcode },
7866 /* 80 */
7867 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_80) },
7868 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_81) },
7869 { "vfrczss", { XM, EXd } },
7870 { "vfrczsd", { XM, EXq } },
7871 { Bad_Opcode },
7872 { Bad_Opcode },
7873 { Bad_Opcode },
7874 { Bad_Opcode },
7875 /* 88 */
7876 { Bad_Opcode },
7877 { Bad_Opcode },
7878 { Bad_Opcode },
7879 { Bad_Opcode },
7880 { Bad_Opcode },
7881 { Bad_Opcode },
7882 { Bad_Opcode },
7883 { Bad_Opcode },
7884 /* 90 */
7885 { "vprotb", { XM, Vex_2src_1, Vex_2src_2 } },
7886 { "vprotw", { XM, Vex_2src_1, Vex_2src_2 } },
7887 { "vprotd", { XM, Vex_2src_1, Vex_2src_2 } },
7888 { "vprotq", { XM, Vex_2src_1, Vex_2src_2 } },
7889 { "vpshlb", { XM, Vex_2src_1, Vex_2src_2 } },
7890 { "vpshlw", { XM, Vex_2src_1, Vex_2src_2 } },
7891 { "vpshld", { XM, Vex_2src_1, Vex_2src_2 } },
7892 { "vpshlq", { XM, Vex_2src_1, Vex_2src_2 } },
7893 /* 98 */
7894 { "vpshab", { XM, Vex_2src_1, Vex_2src_2 } },
7895 { "vpshaw", { XM, Vex_2src_1, Vex_2src_2 } },
7896 { "vpshad", { XM, Vex_2src_1, Vex_2src_2 } },
7897 { "vpshaq", { XM, Vex_2src_1, Vex_2src_2 } },
7898 { Bad_Opcode },
7899 { Bad_Opcode },
7900 { Bad_Opcode },
7901 { Bad_Opcode },
7902 /* a0 */
7903 { Bad_Opcode },
7904 { Bad_Opcode },
7905 { Bad_Opcode },
7906 { Bad_Opcode },
7907 { Bad_Opcode },
7908 { Bad_Opcode },
7909 { Bad_Opcode },
7910 { Bad_Opcode },
7911 /* a8 */
7912 { Bad_Opcode },
7913 { Bad_Opcode },
7914 { Bad_Opcode },
7915 { Bad_Opcode },
7916 { Bad_Opcode },
7917 { Bad_Opcode },
7918 { Bad_Opcode },
7919 { Bad_Opcode },
7920 /* b0 */
7921 { Bad_Opcode },
7922 { Bad_Opcode },
7923 { Bad_Opcode },
7924 { Bad_Opcode },
7925 { Bad_Opcode },
7926 { Bad_Opcode },
7927 { Bad_Opcode },
7928 { Bad_Opcode },
7929 /* b8 */
7930 { Bad_Opcode },
7931 { Bad_Opcode },
7932 { Bad_Opcode },
7933 { Bad_Opcode },
7934 { Bad_Opcode },
7935 { Bad_Opcode },
7936 { Bad_Opcode },
7937 { Bad_Opcode },
7938 /* c0 */
7939 { Bad_Opcode },
7940 { "vphaddbw", { XM, EXxmm } },
7941 { "vphaddbd", { XM, EXxmm } },
7942 { "vphaddbq", { XM, EXxmm } },
7943 { Bad_Opcode },
7944 { Bad_Opcode },
7945 { "vphaddwd", { XM, EXxmm } },
7946 { "vphaddwq", { XM, EXxmm } },
7947 /* c8 */
7948 { Bad_Opcode },
7949 { Bad_Opcode },
7950 { Bad_Opcode },
7951 { "vphadddq", { XM, EXxmm } },
7952 { Bad_Opcode },
7953 { Bad_Opcode },
7954 { Bad_Opcode },
7955 { Bad_Opcode },
7956 /* d0 */
7957 { Bad_Opcode },
7958 { "vphaddubw", { XM, EXxmm } },
7959 { "vphaddubd", { XM, EXxmm } },
7960 { "vphaddubq", { XM, EXxmm } },
7961 { Bad_Opcode },
7962 { Bad_Opcode },
7963 { "vphadduwd", { XM, EXxmm } },
7964 { "vphadduwq", { XM, EXxmm } },
7965 /* d8 */
7966 { Bad_Opcode },
7967 { Bad_Opcode },
7968 { Bad_Opcode },
7969 { "vphaddudq", { XM, EXxmm } },
7970 { Bad_Opcode },
7971 { Bad_Opcode },
7972 { Bad_Opcode },
7973 { Bad_Opcode },
7974 /* e0 */
7975 { Bad_Opcode },
7976 { "vphsubbw", { XM, EXxmm } },
7977 { "vphsubwd", { XM, EXxmm } },
7978 { "vphsubdq", { XM, EXxmm } },
7979 { Bad_Opcode },
7980 { Bad_Opcode },
7981 { Bad_Opcode },
7982 { Bad_Opcode },
7983 /* e8 */
7984 { Bad_Opcode },
7985 { Bad_Opcode },
7986 { Bad_Opcode },
7987 { Bad_Opcode },
7988 { Bad_Opcode },
7989 { Bad_Opcode },
7990 { Bad_Opcode },
7991 { Bad_Opcode },
7992 /* f0 */
7993 { Bad_Opcode },
7994 { Bad_Opcode },
7995 { Bad_Opcode },
7996 { Bad_Opcode },
7997 { Bad_Opcode },
7998 { Bad_Opcode },
7999 { Bad_Opcode },
8000 { Bad_Opcode },
8001 /* f8 */
8002 { Bad_Opcode },
8003 { Bad_Opcode },
8004 { Bad_Opcode },
8005 { Bad_Opcode },
8006 { Bad_Opcode },
8007 { Bad_Opcode },
8008 { Bad_Opcode },
8009 { Bad_Opcode },
8010 },
8011 /* XOP_0A */
8012 {
8013 /* 00 */
8014 { Bad_Opcode },
8015 { Bad_Opcode },
8016 { Bad_Opcode },
8017 { Bad_Opcode },
8018 { Bad_Opcode },
8019 { Bad_Opcode },
8020 { Bad_Opcode },
8021 { Bad_Opcode },
8022 /* 08 */
8023 { Bad_Opcode },
8024 { Bad_Opcode },
8025 { Bad_Opcode },
8026 { Bad_Opcode },
8027 { Bad_Opcode },
8028 { Bad_Opcode },
8029 { Bad_Opcode },
8030 { Bad_Opcode },
8031 /* 10 */
8032 { "bextr", { Gv, Ev, Iq } },
8033 { Bad_Opcode },
8034 { REG_TABLE (REG_XOP_LWP) },
8035 { Bad_Opcode },
8036 { Bad_Opcode },
8037 { Bad_Opcode },
8038 { Bad_Opcode },
8039 { Bad_Opcode },
8040 /* 18 */
8041 { Bad_Opcode },
8042 { Bad_Opcode },
8043 { Bad_Opcode },
8044 { Bad_Opcode },
8045 { Bad_Opcode },
8046 { Bad_Opcode },
8047 { Bad_Opcode },
8048 { Bad_Opcode },
8049 /* 20 */
8050 { Bad_Opcode },
8051 { Bad_Opcode },
8052 { Bad_Opcode },
8053 { Bad_Opcode },
8054 { Bad_Opcode },
8055 { Bad_Opcode },
8056 { Bad_Opcode },
8057 { Bad_Opcode },
8058 /* 28 */
8059 { Bad_Opcode },
8060 { Bad_Opcode },
8061 { Bad_Opcode },
8062 { Bad_Opcode },
8063 { Bad_Opcode },
8064 { Bad_Opcode },
8065 { Bad_Opcode },
8066 { Bad_Opcode },
8067 /* 30 */
8068 { Bad_Opcode },
8069 { Bad_Opcode },
8070 { Bad_Opcode },
8071 { Bad_Opcode },
8072 { Bad_Opcode },
8073 { Bad_Opcode },
8074 { Bad_Opcode },
8075 { Bad_Opcode },
8076 /* 38 */
8077 { Bad_Opcode },
8078 { Bad_Opcode },
8079 { Bad_Opcode },
8080 { Bad_Opcode },
8081 { Bad_Opcode },
8082 { Bad_Opcode },
8083 { Bad_Opcode },
8084 { Bad_Opcode },
8085 /* 40 */
8086 { Bad_Opcode },
8087 { Bad_Opcode },
8088 { Bad_Opcode },
8089 { Bad_Opcode },
8090 { Bad_Opcode },
8091 { Bad_Opcode },
8092 { Bad_Opcode },
8093 { Bad_Opcode },
8094 /* 48 */
8095 { Bad_Opcode },
8096 { Bad_Opcode },
8097 { Bad_Opcode },
8098 { Bad_Opcode },
8099 { Bad_Opcode },
8100 { Bad_Opcode },
8101 { Bad_Opcode },
8102 { Bad_Opcode },
8103 /* 50 */
8104 { Bad_Opcode },
8105 { Bad_Opcode },
8106 { Bad_Opcode },
8107 { Bad_Opcode },
8108 { Bad_Opcode },
8109 { Bad_Opcode },
8110 { Bad_Opcode },
8111 { Bad_Opcode },
8112 /* 58 */
8113 { Bad_Opcode },
8114 { Bad_Opcode },
8115 { Bad_Opcode },
8116 { Bad_Opcode },
8117 { Bad_Opcode },
8118 { Bad_Opcode },
8119 { Bad_Opcode },
8120 { Bad_Opcode },
8121 /* 60 */
8122 { Bad_Opcode },
8123 { Bad_Opcode },
8124 { Bad_Opcode },
8125 { Bad_Opcode },
8126 { Bad_Opcode },
8127 { Bad_Opcode },
8128 { Bad_Opcode },
8129 { Bad_Opcode },
8130 /* 68 */
8131 { Bad_Opcode },
8132 { Bad_Opcode },
8133 { Bad_Opcode },
8134 { Bad_Opcode },
8135 { Bad_Opcode },
8136 { Bad_Opcode },
8137 { Bad_Opcode },
8138 { Bad_Opcode },
8139 /* 70 */
8140 { Bad_Opcode },
8141 { Bad_Opcode },
8142 { Bad_Opcode },
8143 { Bad_Opcode },
8144 { Bad_Opcode },
8145 { Bad_Opcode },
8146 { Bad_Opcode },
8147 { Bad_Opcode },
8148 /* 78 */
8149 { Bad_Opcode },
8150 { Bad_Opcode },
8151 { Bad_Opcode },
8152 { Bad_Opcode },
8153 { Bad_Opcode },
8154 { Bad_Opcode },
8155 { Bad_Opcode },
8156 { Bad_Opcode },
8157 /* 80 */
8158 { Bad_Opcode },
8159 { Bad_Opcode },
8160 { Bad_Opcode },
8161 { Bad_Opcode },
8162 { Bad_Opcode },
8163 { Bad_Opcode },
8164 { Bad_Opcode },
8165 { Bad_Opcode },
8166 /* 88 */
8167 { Bad_Opcode },
8168 { Bad_Opcode },
8169 { Bad_Opcode },
8170 { Bad_Opcode },
8171 { Bad_Opcode },
8172 { Bad_Opcode },
8173 { Bad_Opcode },
8174 { Bad_Opcode },
8175 /* 90 */
8176 { Bad_Opcode },
8177 { Bad_Opcode },
8178 { Bad_Opcode },
8179 { Bad_Opcode },
8180 { Bad_Opcode },
8181 { Bad_Opcode },
8182 { Bad_Opcode },
8183 { Bad_Opcode },
8184 /* 98 */
8185 { Bad_Opcode },
8186 { Bad_Opcode },
8187 { Bad_Opcode },
8188 { Bad_Opcode },
8189 { Bad_Opcode },
8190 { Bad_Opcode },
8191 { Bad_Opcode },
8192 { Bad_Opcode },
8193 /* a0 */
8194 { Bad_Opcode },
8195 { Bad_Opcode },
8196 { Bad_Opcode },
8197 { Bad_Opcode },
8198 { Bad_Opcode },
8199 { Bad_Opcode },
8200 { Bad_Opcode },
8201 { Bad_Opcode },
8202 /* a8 */
8203 { Bad_Opcode },
8204 { Bad_Opcode },
8205 { Bad_Opcode },
8206 { Bad_Opcode },
8207 { Bad_Opcode },
8208 { Bad_Opcode },
8209 { Bad_Opcode },
8210 { Bad_Opcode },
8211 /* b0 */
8212 { Bad_Opcode },
8213 { Bad_Opcode },
8214 { Bad_Opcode },
8215 { Bad_Opcode },
8216 { Bad_Opcode },
8217 { Bad_Opcode },
8218 { Bad_Opcode },
8219 { Bad_Opcode },
8220 /* b8 */
8221 { Bad_Opcode },
8222 { Bad_Opcode },
8223 { Bad_Opcode },
8224 { Bad_Opcode },
8225 { Bad_Opcode },
8226 { Bad_Opcode },
8227 { Bad_Opcode },
8228 { Bad_Opcode },
8229 /* c0 */
8230 { Bad_Opcode },
8231 { Bad_Opcode },
8232 { Bad_Opcode },
8233 { Bad_Opcode },
8234 { Bad_Opcode },
8235 { Bad_Opcode },
8236 { Bad_Opcode },
8237 { Bad_Opcode },
8238 /* c8 */
8239 { Bad_Opcode },
8240 { Bad_Opcode },
8241 { Bad_Opcode },
8242 { Bad_Opcode },
8243 { Bad_Opcode },
8244 { Bad_Opcode },
8245 { Bad_Opcode },
8246 { Bad_Opcode },
8247 /* d0 */
8248 { Bad_Opcode },
8249 { Bad_Opcode },
8250 { Bad_Opcode },
8251 { Bad_Opcode },
8252 { Bad_Opcode },
8253 { Bad_Opcode },
8254 { Bad_Opcode },
8255 { Bad_Opcode },
8256 /* d8 */
8257 { Bad_Opcode },
8258 { Bad_Opcode },
8259 { Bad_Opcode },
8260 { Bad_Opcode },
8261 { Bad_Opcode },
8262 { Bad_Opcode },
8263 { Bad_Opcode },
8264 { Bad_Opcode },
8265 /* e0 */
8266 { Bad_Opcode },
8267 { Bad_Opcode },
8268 { Bad_Opcode },
8269 { Bad_Opcode },
8270 { Bad_Opcode },
8271 { Bad_Opcode },
8272 { Bad_Opcode },
8273 { Bad_Opcode },
8274 /* e8 */
8275 { Bad_Opcode },
8276 { Bad_Opcode },
8277 { Bad_Opcode },
8278 { Bad_Opcode },
8279 { Bad_Opcode },
8280 { Bad_Opcode },
8281 { Bad_Opcode },
8282 { Bad_Opcode },
8283 /* f0 */
8284 { Bad_Opcode },
8285 { Bad_Opcode },
8286 { Bad_Opcode },
8287 { Bad_Opcode },
8288 { Bad_Opcode },
8289 { Bad_Opcode },
8290 { Bad_Opcode },
8291 { Bad_Opcode },
8292 /* f8 */
8293 { Bad_Opcode },
8294 { Bad_Opcode },
8295 { Bad_Opcode },
8296 { Bad_Opcode },
8297 { Bad_Opcode },
8298 { Bad_Opcode },
8299 { Bad_Opcode },
8300 { Bad_Opcode },
8301 },
8302 };
8303
8304 static const struct dis386 vex_table[][256] = {
8305 /* VEX_0F */
8306 {
8307 /* 00 */
8308 { Bad_Opcode },
8309 { Bad_Opcode },
8310 { Bad_Opcode },
8311 { Bad_Opcode },
8312 { Bad_Opcode },
8313 { Bad_Opcode },
8314 { Bad_Opcode },
8315 { Bad_Opcode },
8316 /* 08 */
8317 { Bad_Opcode },
8318 { Bad_Opcode },
8319 { Bad_Opcode },
8320 { Bad_Opcode },
8321 { Bad_Opcode },
8322 { Bad_Opcode },
8323 { Bad_Opcode },
8324 { Bad_Opcode },
8325 /* 10 */
8326 { PREFIX_TABLE (PREFIX_VEX_0F10) },
8327 { PREFIX_TABLE (PREFIX_VEX_0F11) },
8328 { PREFIX_TABLE (PREFIX_VEX_0F12) },
8329 { MOD_TABLE (MOD_VEX_0F13) },
8330 { VEX_W_TABLE (VEX_W_0F14) },
8331 { VEX_W_TABLE (VEX_W_0F15) },
8332 { PREFIX_TABLE (PREFIX_VEX_0F16) },
8333 { MOD_TABLE (MOD_VEX_0F17) },
8334 /* 18 */
8335 { Bad_Opcode },
8336 { Bad_Opcode },
8337 { Bad_Opcode },
8338 { Bad_Opcode },
8339 { Bad_Opcode },
8340 { Bad_Opcode },
8341 { Bad_Opcode },
8342 { Bad_Opcode },
8343 /* 20 */
8344 { Bad_Opcode },
8345 { Bad_Opcode },
8346 { Bad_Opcode },
8347 { Bad_Opcode },
8348 { Bad_Opcode },
8349 { Bad_Opcode },
8350 { Bad_Opcode },
8351 { Bad_Opcode },
8352 /* 28 */
8353 { VEX_W_TABLE (VEX_W_0F28) },
8354 { VEX_W_TABLE (VEX_W_0F29) },
8355 { PREFIX_TABLE (PREFIX_VEX_0F2A) },
8356 { MOD_TABLE (MOD_VEX_0F2B) },
8357 { PREFIX_TABLE (PREFIX_VEX_0F2C) },
8358 { PREFIX_TABLE (PREFIX_VEX_0F2D) },
8359 { PREFIX_TABLE (PREFIX_VEX_0F2E) },
8360 { PREFIX_TABLE (PREFIX_VEX_0F2F) },
8361 /* 30 */
8362 { Bad_Opcode },
8363 { Bad_Opcode },
8364 { Bad_Opcode },
8365 { Bad_Opcode },
8366 { Bad_Opcode },
8367 { Bad_Opcode },
8368 { Bad_Opcode },
8369 { Bad_Opcode },
8370 /* 38 */
8371 { Bad_Opcode },
8372 { Bad_Opcode },
8373 { Bad_Opcode },
8374 { Bad_Opcode },
8375 { Bad_Opcode },
8376 { Bad_Opcode },
8377 { Bad_Opcode },
8378 { Bad_Opcode },
8379 /* 40 */
8380 { Bad_Opcode },
8381 { PREFIX_TABLE (PREFIX_VEX_0F41) },
8382 { PREFIX_TABLE (PREFIX_VEX_0F42) },
8383 { Bad_Opcode },
8384 { PREFIX_TABLE (PREFIX_VEX_0F44) },
8385 { PREFIX_TABLE (PREFIX_VEX_0F45) },
8386 { PREFIX_TABLE (PREFIX_VEX_0F46) },
8387 { PREFIX_TABLE (PREFIX_VEX_0F47) },
8388 /* 48 */
8389 { Bad_Opcode },
8390 { Bad_Opcode },
8391 { Bad_Opcode },
8392 { PREFIX_TABLE (PREFIX_VEX_0F4B) },
8393 { Bad_Opcode },
8394 { Bad_Opcode },
8395 { Bad_Opcode },
8396 { Bad_Opcode },
8397 /* 50 */
8398 { MOD_TABLE (MOD_VEX_0F50) },
8399 { PREFIX_TABLE (PREFIX_VEX_0F51) },
8400 { PREFIX_TABLE (PREFIX_VEX_0F52) },
8401 { PREFIX_TABLE (PREFIX_VEX_0F53) },
8402 { "vandpX", { XM, Vex, EXx } },
8403 { "vandnpX", { XM, Vex, EXx } },
8404 { "vorpX", { XM, Vex, EXx } },
8405 { "vxorpX", { XM, Vex, EXx } },
8406 /* 58 */
8407 { PREFIX_TABLE (PREFIX_VEX_0F58) },
8408 { PREFIX_TABLE (PREFIX_VEX_0F59) },
8409 { PREFIX_TABLE (PREFIX_VEX_0F5A) },
8410 { PREFIX_TABLE (PREFIX_VEX_0F5B) },
8411 { PREFIX_TABLE (PREFIX_VEX_0F5C) },
8412 { PREFIX_TABLE (PREFIX_VEX_0F5D) },
8413 { PREFIX_TABLE (PREFIX_VEX_0F5E) },
8414 { PREFIX_TABLE (PREFIX_VEX_0F5F) },
8415 /* 60 */
8416 { PREFIX_TABLE (PREFIX_VEX_0F60) },
8417 { PREFIX_TABLE (PREFIX_VEX_0F61) },
8418 { PREFIX_TABLE (PREFIX_VEX_0F62) },
8419 { PREFIX_TABLE (PREFIX_VEX_0F63) },
8420 { PREFIX_TABLE (PREFIX_VEX_0F64) },
8421 { PREFIX_TABLE (PREFIX_VEX_0F65) },
8422 { PREFIX_TABLE (PREFIX_VEX_0F66) },
8423 { PREFIX_TABLE (PREFIX_VEX_0F67) },
8424 /* 68 */
8425 { PREFIX_TABLE (PREFIX_VEX_0F68) },
8426 { PREFIX_TABLE (PREFIX_VEX_0F69) },
8427 { PREFIX_TABLE (PREFIX_VEX_0F6A) },
8428 { PREFIX_TABLE (PREFIX_VEX_0F6B) },
8429 { PREFIX_TABLE (PREFIX_VEX_0F6C) },
8430 { PREFIX_TABLE (PREFIX_VEX_0F6D) },
8431 { PREFIX_TABLE (PREFIX_VEX_0F6E) },
8432 { PREFIX_TABLE (PREFIX_VEX_0F6F) },
8433 /* 70 */
8434 { PREFIX_TABLE (PREFIX_VEX_0F70) },
8435 { REG_TABLE (REG_VEX_0F71) },
8436 { REG_TABLE (REG_VEX_0F72) },
8437 { REG_TABLE (REG_VEX_0F73) },
8438 { PREFIX_TABLE (PREFIX_VEX_0F74) },
8439 { PREFIX_TABLE (PREFIX_VEX_0F75) },
8440 { PREFIX_TABLE (PREFIX_VEX_0F76) },
8441 { PREFIX_TABLE (PREFIX_VEX_0F77) },
8442 /* 78 */
8443 { Bad_Opcode },
8444 { Bad_Opcode },
8445 { Bad_Opcode },
8446 { Bad_Opcode },
8447 { PREFIX_TABLE (PREFIX_VEX_0F7C) },
8448 { PREFIX_TABLE (PREFIX_VEX_0F7D) },
8449 { PREFIX_TABLE (PREFIX_VEX_0F7E) },
8450 { PREFIX_TABLE (PREFIX_VEX_0F7F) },
8451 /* 80 */
8452 { Bad_Opcode },
8453 { Bad_Opcode },
8454 { Bad_Opcode },
8455 { Bad_Opcode },
8456 { Bad_Opcode },
8457 { Bad_Opcode },
8458 { Bad_Opcode },
8459 { Bad_Opcode },
8460 /* 88 */
8461 { Bad_Opcode },
8462 { Bad_Opcode },
8463 { Bad_Opcode },
8464 { Bad_Opcode },
8465 { Bad_Opcode },
8466 { Bad_Opcode },
8467 { Bad_Opcode },
8468 { Bad_Opcode },
8469 /* 90 */
8470 { PREFIX_TABLE (PREFIX_VEX_0F90) },
8471 { PREFIX_TABLE (PREFIX_VEX_0F91) },
8472 { PREFIX_TABLE (PREFIX_VEX_0F92) },
8473 { PREFIX_TABLE (PREFIX_VEX_0F93) },
8474 { Bad_Opcode },
8475 { Bad_Opcode },
8476 { Bad_Opcode },
8477 { Bad_Opcode },
8478 /* 98 */
8479 { PREFIX_TABLE (PREFIX_VEX_0F98) },
8480 { Bad_Opcode },
8481 { Bad_Opcode },
8482 { Bad_Opcode },
8483 { Bad_Opcode },
8484 { Bad_Opcode },
8485 { Bad_Opcode },
8486 { Bad_Opcode },
8487 /* a0 */
8488 { Bad_Opcode },
8489 { Bad_Opcode },
8490 { Bad_Opcode },
8491 { Bad_Opcode },
8492 { Bad_Opcode },
8493 { Bad_Opcode },
8494 { Bad_Opcode },
8495 { Bad_Opcode },
8496 /* a8 */
8497 { Bad_Opcode },
8498 { Bad_Opcode },
8499 { Bad_Opcode },
8500 { Bad_Opcode },
8501 { Bad_Opcode },
8502 { Bad_Opcode },
8503 { REG_TABLE (REG_VEX_0FAE) },
8504 { Bad_Opcode },
8505 /* b0 */
8506 { Bad_Opcode },
8507 { Bad_Opcode },
8508 { Bad_Opcode },
8509 { Bad_Opcode },
8510 { Bad_Opcode },
8511 { Bad_Opcode },
8512 { Bad_Opcode },
8513 { Bad_Opcode },
8514 /* b8 */
8515 { Bad_Opcode },
8516 { Bad_Opcode },
8517 { Bad_Opcode },
8518 { Bad_Opcode },
8519 { Bad_Opcode },
8520 { Bad_Opcode },
8521 { Bad_Opcode },
8522 { Bad_Opcode },
8523 /* c0 */
8524 { Bad_Opcode },
8525 { Bad_Opcode },
8526 { PREFIX_TABLE (PREFIX_VEX_0FC2) },
8527 { Bad_Opcode },
8528 { PREFIX_TABLE (PREFIX_VEX_0FC4) },
8529 { PREFIX_TABLE (PREFIX_VEX_0FC5) },
8530 { "vshufpX", { XM, Vex, EXx, Ib } },
8531 { Bad_Opcode },
8532 /* c8 */
8533 { Bad_Opcode },
8534 { Bad_Opcode },
8535 { Bad_Opcode },
8536 { Bad_Opcode },
8537 { Bad_Opcode },
8538 { Bad_Opcode },
8539 { Bad_Opcode },
8540 { Bad_Opcode },
8541 /* d0 */
8542 { PREFIX_TABLE (PREFIX_VEX_0FD0) },
8543 { PREFIX_TABLE (PREFIX_VEX_0FD1) },
8544 { PREFIX_TABLE (PREFIX_VEX_0FD2) },
8545 { PREFIX_TABLE (PREFIX_VEX_0FD3) },
8546 { PREFIX_TABLE (PREFIX_VEX_0FD4) },
8547 { PREFIX_TABLE (PREFIX_VEX_0FD5) },
8548 { PREFIX_TABLE (PREFIX_VEX_0FD6) },
8549 { PREFIX_TABLE (PREFIX_VEX_0FD7) },
8550 /* d8 */
8551 { PREFIX_TABLE (PREFIX_VEX_0FD8) },
8552 { PREFIX_TABLE (PREFIX_VEX_0FD9) },
8553 { PREFIX_TABLE (PREFIX_VEX_0FDA) },
8554 { PREFIX_TABLE (PREFIX_VEX_0FDB) },
8555 { PREFIX_TABLE (PREFIX_VEX_0FDC) },
8556 { PREFIX_TABLE (PREFIX_VEX_0FDD) },
8557 { PREFIX_TABLE (PREFIX_VEX_0FDE) },
8558 { PREFIX_TABLE (PREFIX_VEX_0FDF) },
8559 /* e0 */
8560 { PREFIX_TABLE (PREFIX_VEX_0FE0) },
8561 { PREFIX_TABLE (PREFIX_VEX_0FE1) },
8562 { PREFIX_TABLE (PREFIX_VEX_0FE2) },
8563 { PREFIX_TABLE (PREFIX_VEX_0FE3) },
8564 { PREFIX_TABLE (PREFIX_VEX_0FE4) },
8565 { PREFIX_TABLE (PREFIX_VEX_0FE5) },
8566 { PREFIX_TABLE (PREFIX_VEX_0FE6) },
8567 { PREFIX_TABLE (PREFIX_VEX_0FE7) },
8568 /* e8 */
8569 { PREFIX_TABLE (PREFIX_VEX_0FE8) },
8570 { PREFIX_TABLE (PREFIX_VEX_0FE9) },
8571 { PREFIX_TABLE (PREFIX_VEX_0FEA) },
8572 { PREFIX_TABLE (PREFIX_VEX_0FEB) },
8573 { PREFIX_TABLE (PREFIX_VEX_0FEC) },
8574 { PREFIX_TABLE (PREFIX_VEX_0FED) },
8575 { PREFIX_TABLE (PREFIX_VEX_0FEE) },
8576 { PREFIX_TABLE (PREFIX_VEX_0FEF) },
8577 /* f0 */
8578 { PREFIX_TABLE (PREFIX_VEX_0FF0) },
8579 { PREFIX_TABLE (PREFIX_VEX_0FF1) },
8580 { PREFIX_TABLE (PREFIX_VEX_0FF2) },
8581 { PREFIX_TABLE (PREFIX_VEX_0FF3) },
8582 { PREFIX_TABLE (PREFIX_VEX_0FF4) },
8583 { PREFIX_TABLE (PREFIX_VEX_0FF5) },
8584 { PREFIX_TABLE (PREFIX_VEX_0FF6) },
8585 { PREFIX_TABLE (PREFIX_VEX_0FF7) },
8586 /* f8 */
8587 { PREFIX_TABLE (PREFIX_VEX_0FF8) },
8588 { PREFIX_TABLE (PREFIX_VEX_0FF9) },
8589 { PREFIX_TABLE (PREFIX_VEX_0FFA) },
8590 { PREFIX_TABLE (PREFIX_VEX_0FFB) },
8591 { PREFIX_TABLE (PREFIX_VEX_0FFC) },
8592 { PREFIX_TABLE (PREFIX_VEX_0FFD) },
8593 { PREFIX_TABLE (PREFIX_VEX_0FFE) },
8594 { Bad_Opcode },
8595 },
8596 /* VEX_0F38 */
8597 {
8598 /* 00 */
8599 { PREFIX_TABLE (PREFIX_VEX_0F3800) },
8600 { PREFIX_TABLE (PREFIX_VEX_0F3801) },
8601 { PREFIX_TABLE (PREFIX_VEX_0F3802) },
8602 { PREFIX_TABLE (PREFIX_VEX_0F3803) },
8603 { PREFIX_TABLE (PREFIX_VEX_0F3804) },
8604 { PREFIX_TABLE (PREFIX_VEX_0F3805) },
8605 { PREFIX_TABLE (PREFIX_VEX_0F3806) },
8606 { PREFIX_TABLE (PREFIX_VEX_0F3807) },
8607 /* 08 */
8608 { PREFIX_TABLE (PREFIX_VEX_0F3808) },
8609 { PREFIX_TABLE (PREFIX_VEX_0F3809) },
8610 { PREFIX_TABLE (PREFIX_VEX_0F380A) },
8611 { PREFIX_TABLE (PREFIX_VEX_0F380B) },
8612 { PREFIX_TABLE (PREFIX_VEX_0F380C) },
8613 { PREFIX_TABLE (PREFIX_VEX_0F380D) },
8614 { PREFIX_TABLE (PREFIX_VEX_0F380E) },
8615 { PREFIX_TABLE (PREFIX_VEX_0F380F) },
8616 /* 10 */
8617 { Bad_Opcode },
8618 { Bad_Opcode },
8619 { Bad_Opcode },
8620 { PREFIX_TABLE (PREFIX_VEX_0F3813) },
8621 { Bad_Opcode },
8622 { Bad_Opcode },
8623 { PREFIX_TABLE (PREFIX_VEX_0F3816) },
8624 { PREFIX_TABLE (PREFIX_VEX_0F3817) },
8625 /* 18 */
8626 { PREFIX_TABLE (PREFIX_VEX_0F3818) },
8627 { PREFIX_TABLE (PREFIX_VEX_0F3819) },
8628 { PREFIX_TABLE (PREFIX_VEX_0F381A) },
8629 { Bad_Opcode },
8630 { PREFIX_TABLE (PREFIX_VEX_0F381C) },
8631 { PREFIX_TABLE (PREFIX_VEX_0F381D) },
8632 { PREFIX_TABLE (PREFIX_VEX_0F381E) },
8633 { Bad_Opcode },
8634 /* 20 */
8635 { PREFIX_TABLE (PREFIX_VEX_0F3820) },
8636 { PREFIX_TABLE (PREFIX_VEX_0F3821) },
8637 { PREFIX_TABLE (PREFIX_VEX_0F3822) },
8638 { PREFIX_TABLE (PREFIX_VEX_0F3823) },
8639 { PREFIX_TABLE (PREFIX_VEX_0F3824) },
8640 { PREFIX_TABLE (PREFIX_VEX_0F3825) },
8641 { Bad_Opcode },
8642 { Bad_Opcode },
8643 /* 28 */
8644 { PREFIX_TABLE (PREFIX_VEX_0F3828) },
8645 { PREFIX_TABLE (PREFIX_VEX_0F3829) },
8646 { PREFIX_TABLE (PREFIX_VEX_0F382A) },
8647 { PREFIX_TABLE (PREFIX_VEX_0F382B) },
8648 { PREFIX_TABLE (PREFIX_VEX_0F382C) },
8649 { PREFIX_TABLE (PREFIX_VEX_0F382D) },
8650 { PREFIX_TABLE (PREFIX_VEX_0F382E) },
8651 { PREFIX_TABLE (PREFIX_VEX_0F382F) },
8652 /* 30 */
8653 { PREFIX_TABLE (PREFIX_VEX_0F3830) },
8654 { PREFIX_TABLE (PREFIX_VEX_0F3831) },
8655 { PREFIX_TABLE (PREFIX_VEX_0F3832) },
8656 { PREFIX_TABLE (PREFIX_VEX_0F3833) },
8657 { PREFIX_TABLE (PREFIX_VEX_0F3834) },
8658 { PREFIX_TABLE (PREFIX_VEX_0F3835) },
8659 { PREFIX_TABLE (PREFIX_VEX_0F3836) },
8660 { PREFIX_TABLE (PREFIX_VEX_0F3837) },
8661 /* 38 */
8662 { PREFIX_TABLE (PREFIX_VEX_0F3838) },
8663 { PREFIX_TABLE (PREFIX_VEX_0F3839) },
8664 { PREFIX_TABLE (PREFIX_VEX_0F383A) },
8665 { PREFIX_TABLE (PREFIX_VEX_0F383B) },
8666 { PREFIX_TABLE (PREFIX_VEX_0F383C) },
8667 { PREFIX_TABLE (PREFIX_VEX_0F383D) },
8668 { PREFIX_TABLE (PREFIX_VEX_0F383E) },
8669 { PREFIX_TABLE (PREFIX_VEX_0F383F) },
8670 /* 40 */
8671 { PREFIX_TABLE (PREFIX_VEX_0F3840) },
8672 { PREFIX_TABLE (PREFIX_VEX_0F3841) },
8673 { Bad_Opcode },
8674 { Bad_Opcode },
8675 { Bad_Opcode },
8676 { PREFIX_TABLE (PREFIX_VEX_0F3845) },
8677 { PREFIX_TABLE (PREFIX_VEX_0F3846) },
8678 { PREFIX_TABLE (PREFIX_VEX_0F3847) },
8679 /* 48 */
8680 { Bad_Opcode },
8681 { Bad_Opcode },
8682 { Bad_Opcode },
8683 { Bad_Opcode },
8684 { Bad_Opcode },
8685 { Bad_Opcode },
8686 { Bad_Opcode },
8687 { Bad_Opcode },
8688 /* 50 */
8689 { Bad_Opcode },
8690 { Bad_Opcode },
8691 { Bad_Opcode },
8692 { Bad_Opcode },
8693 { Bad_Opcode },
8694 { Bad_Opcode },
8695 { Bad_Opcode },
8696 { Bad_Opcode },
8697 /* 58 */
8698 { PREFIX_TABLE (PREFIX_VEX_0F3858) },
8699 { PREFIX_TABLE (PREFIX_VEX_0F3859) },
8700 { PREFIX_TABLE (PREFIX_VEX_0F385A) },
8701 { Bad_Opcode },
8702 { Bad_Opcode },
8703 { Bad_Opcode },
8704 { Bad_Opcode },
8705 { Bad_Opcode },
8706 /* 60 */
8707 { Bad_Opcode },
8708 { Bad_Opcode },
8709 { Bad_Opcode },
8710 { Bad_Opcode },
8711 { Bad_Opcode },
8712 { Bad_Opcode },
8713 { Bad_Opcode },
8714 { Bad_Opcode },
8715 /* 68 */
8716 { Bad_Opcode },
8717 { Bad_Opcode },
8718 { Bad_Opcode },
8719 { Bad_Opcode },
8720 { Bad_Opcode },
8721 { Bad_Opcode },
8722 { Bad_Opcode },
8723 { Bad_Opcode },
8724 /* 70 */
8725 { Bad_Opcode },
8726 { Bad_Opcode },
8727 { Bad_Opcode },
8728 { Bad_Opcode },
8729 { Bad_Opcode },
8730 { Bad_Opcode },
8731 { Bad_Opcode },
8732 { Bad_Opcode },
8733 /* 78 */
8734 { PREFIX_TABLE (PREFIX_VEX_0F3878) },
8735 { PREFIX_TABLE (PREFIX_VEX_0F3879) },
8736 { Bad_Opcode },
8737 { Bad_Opcode },
8738 { Bad_Opcode },
8739 { Bad_Opcode },
8740 { Bad_Opcode },
8741 { Bad_Opcode },
8742 /* 80 */
8743 { Bad_Opcode },
8744 { Bad_Opcode },
8745 { Bad_Opcode },
8746 { Bad_Opcode },
8747 { Bad_Opcode },
8748 { Bad_Opcode },
8749 { Bad_Opcode },
8750 { Bad_Opcode },
8751 /* 88 */
8752 { Bad_Opcode },
8753 { Bad_Opcode },
8754 { Bad_Opcode },
8755 { Bad_Opcode },
8756 { PREFIX_TABLE (PREFIX_VEX_0F388C) },
8757 { Bad_Opcode },
8758 { PREFIX_TABLE (PREFIX_VEX_0F388E) },
8759 { Bad_Opcode },
8760 /* 90 */
8761 { PREFIX_TABLE (PREFIX_VEX_0F3890) },
8762 { PREFIX_TABLE (PREFIX_VEX_0F3891) },
8763 { PREFIX_TABLE (PREFIX_VEX_0F3892) },
8764 { PREFIX_TABLE (PREFIX_VEX_0F3893) },
8765 { Bad_Opcode },
8766 { Bad_Opcode },
8767 { PREFIX_TABLE (PREFIX_VEX_0F3896) },
8768 { PREFIX_TABLE (PREFIX_VEX_0F3897) },
8769 /* 98 */
8770 { PREFIX_TABLE (PREFIX_VEX_0F3898) },
8771 { PREFIX_TABLE (PREFIX_VEX_0F3899) },
8772 { PREFIX_TABLE (PREFIX_VEX_0F389A) },
8773 { PREFIX_TABLE (PREFIX_VEX_0F389B) },
8774 { PREFIX_TABLE (PREFIX_VEX_0F389C) },
8775 { PREFIX_TABLE (PREFIX_VEX_0F389D) },
8776 { PREFIX_TABLE (PREFIX_VEX_0F389E) },
8777 { PREFIX_TABLE (PREFIX_VEX_0F389F) },
8778 /* a0 */
8779 { Bad_Opcode },
8780 { Bad_Opcode },
8781 { Bad_Opcode },
8782 { Bad_Opcode },
8783 { Bad_Opcode },
8784 { Bad_Opcode },
8785 { PREFIX_TABLE (PREFIX_VEX_0F38A6) },
8786 { PREFIX_TABLE (PREFIX_VEX_0F38A7) },
8787 /* a8 */
8788 { PREFIX_TABLE (PREFIX_VEX_0F38A8) },
8789 { PREFIX_TABLE (PREFIX_VEX_0F38A9) },
8790 { PREFIX_TABLE (PREFIX_VEX_0F38AA) },
8791 { PREFIX_TABLE (PREFIX_VEX_0F38AB) },
8792 { PREFIX_TABLE (PREFIX_VEX_0F38AC) },
8793 { PREFIX_TABLE (PREFIX_VEX_0F38AD) },
8794 { PREFIX_TABLE (PREFIX_VEX_0F38AE) },
8795 { PREFIX_TABLE (PREFIX_VEX_0F38AF) },
8796 /* b0 */
8797 { Bad_Opcode },
8798 { Bad_Opcode },
8799 { Bad_Opcode },
8800 { Bad_Opcode },
8801 { Bad_Opcode },
8802 { Bad_Opcode },
8803 { PREFIX_TABLE (PREFIX_VEX_0F38B6) },
8804 { PREFIX_TABLE (PREFIX_VEX_0F38B7) },
8805 /* b8 */
8806 { PREFIX_TABLE (PREFIX_VEX_0F38B8) },
8807 { PREFIX_TABLE (PREFIX_VEX_0F38B9) },
8808 { PREFIX_TABLE (PREFIX_VEX_0F38BA) },
8809 { PREFIX_TABLE (PREFIX_VEX_0F38BB) },
8810 { PREFIX_TABLE (PREFIX_VEX_0F38BC) },
8811 { PREFIX_TABLE (PREFIX_VEX_0F38BD) },
8812 { PREFIX_TABLE (PREFIX_VEX_0F38BE) },
8813 { PREFIX_TABLE (PREFIX_VEX_0F38BF) },
8814 /* c0 */
8815 { Bad_Opcode },
8816 { Bad_Opcode },
8817 { Bad_Opcode },
8818 { Bad_Opcode },
8819 { Bad_Opcode },
8820 { Bad_Opcode },
8821 { Bad_Opcode },
8822 { Bad_Opcode },
8823 /* c8 */
8824 { Bad_Opcode },
8825 { Bad_Opcode },
8826 { Bad_Opcode },
8827 { Bad_Opcode },
8828 { Bad_Opcode },
8829 { Bad_Opcode },
8830 { Bad_Opcode },
8831 { Bad_Opcode },
8832 /* d0 */
8833 { Bad_Opcode },
8834 { Bad_Opcode },
8835 { Bad_Opcode },
8836 { Bad_Opcode },
8837 { Bad_Opcode },
8838 { Bad_Opcode },
8839 { Bad_Opcode },
8840 { Bad_Opcode },
8841 /* d8 */
8842 { Bad_Opcode },
8843 { Bad_Opcode },
8844 { Bad_Opcode },
8845 { PREFIX_TABLE (PREFIX_VEX_0F38DB) },
8846 { PREFIX_TABLE (PREFIX_VEX_0F38DC) },
8847 { PREFIX_TABLE (PREFIX_VEX_0F38DD) },
8848 { PREFIX_TABLE (PREFIX_VEX_0F38DE) },
8849 { PREFIX_TABLE (PREFIX_VEX_0F38DF) },
8850 /* e0 */
8851 { Bad_Opcode },
8852 { Bad_Opcode },
8853 { Bad_Opcode },
8854 { Bad_Opcode },
8855 { Bad_Opcode },
8856 { Bad_Opcode },
8857 { Bad_Opcode },
8858 { Bad_Opcode },
8859 /* e8 */
8860 { Bad_Opcode },
8861 { Bad_Opcode },
8862 { Bad_Opcode },
8863 { Bad_Opcode },
8864 { Bad_Opcode },
8865 { Bad_Opcode },
8866 { Bad_Opcode },
8867 { Bad_Opcode },
8868 /* f0 */
8869 { Bad_Opcode },
8870 { Bad_Opcode },
8871 { PREFIX_TABLE (PREFIX_VEX_0F38F2) },
8872 { REG_TABLE (REG_VEX_0F38F3) },
8873 { Bad_Opcode },
8874 { PREFIX_TABLE (PREFIX_VEX_0F38F5) },
8875 { PREFIX_TABLE (PREFIX_VEX_0F38F6) },
8876 { PREFIX_TABLE (PREFIX_VEX_0F38F7) },
8877 /* f8 */
8878 { Bad_Opcode },
8879 { Bad_Opcode },
8880 { Bad_Opcode },
8881 { Bad_Opcode },
8882 { Bad_Opcode },
8883 { Bad_Opcode },
8884 { Bad_Opcode },
8885 { Bad_Opcode },
8886 },
8887 /* VEX_0F3A */
8888 {
8889 /* 00 */
8890 { PREFIX_TABLE (PREFIX_VEX_0F3A00) },
8891 { PREFIX_TABLE (PREFIX_VEX_0F3A01) },
8892 { PREFIX_TABLE (PREFIX_VEX_0F3A02) },
8893 { Bad_Opcode },
8894 { PREFIX_TABLE (PREFIX_VEX_0F3A04) },
8895 { PREFIX_TABLE (PREFIX_VEX_0F3A05) },
8896 { PREFIX_TABLE (PREFIX_VEX_0F3A06) },
8897 { Bad_Opcode },
8898 /* 08 */
8899 { PREFIX_TABLE (PREFIX_VEX_0F3A08) },
8900 { PREFIX_TABLE (PREFIX_VEX_0F3A09) },
8901 { PREFIX_TABLE (PREFIX_VEX_0F3A0A) },
8902 { PREFIX_TABLE (PREFIX_VEX_0F3A0B) },
8903 { PREFIX_TABLE (PREFIX_VEX_0F3A0C) },
8904 { PREFIX_TABLE (PREFIX_VEX_0F3A0D) },
8905 { PREFIX_TABLE (PREFIX_VEX_0F3A0E) },
8906 { PREFIX_TABLE (PREFIX_VEX_0F3A0F) },
8907 /* 10 */
8908 { Bad_Opcode },
8909 { Bad_Opcode },
8910 { Bad_Opcode },
8911 { Bad_Opcode },
8912 { PREFIX_TABLE (PREFIX_VEX_0F3A14) },
8913 { PREFIX_TABLE (PREFIX_VEX_0F3A15) },
8914 { PREFIX_TABLE (PREFIX_VEX_0F3A16) },
8915 { PREFIX_TABLE (PREFIX_VEX_0F3A17) },
8916 /* 18 */
8917 { PREFIX_TABLE (PREFIX_VEX_0F3A18) },
8918 { PREFIX_TABLE (PREFIX_VEX_0F3A19) },
8919 { Bad_Opcode },
8920 { Bad_Opcode },
8921 { Bad_Opcode },
8922 { PREFIX_TABLE (PREFIX_VEX_0F3A1D) },
8923 { Bad_Opcode },
8924 { Bad_Opcode },
8925 /* 20 */
8926 { PREFIX_TABLE (PREFIX_VEX_0F3A20) },
8927 { PREFIX_TABLE (PREFIX_VEX_0F3A21) },
8928 { PREFIX_TABLE (PREFIX_VEX_0F3A22) },
8929 { Bad_Opcode },
8930 { Bad_Opcode },
8931 { Bad_Opcode },
8932 { Bad_Opcode },
8933 { Bad_Opcode },
8934 /* 28 */
8935 { Bad_Opcode },
8936 { Bad_Opcode },
8937 { Bad_Opcode },
8938 { Bad_Opcode },
8939 { Bad_Opcode },
8940 { Bad_Opcode },
8941 { Bad_Opcode },
8942 { Bad_Opcode },
8943 /* 30 */
8944 { PREFIX_TABLE (PREFIX_VEX_0F3A30) },
8945 { Bad_Opcode },
8946 { PREFIX_TABLE (PREFIX_VEX_0F3A32) },
8947 { Bad_Opcode },
8948 { Bad_Opcode },
8949 { Bad_Opcode },
8950 { Bad_Opcode },
8951 { Bad_Opcode },
8952 /* 38 */
8953 { PREFIX_TABLE (PREFIX_VEX_0F3A38) },
8954 { PREFIX_TABLE (PREFIX_VEX_0F3A39) },
8955 { Bad_Opcode },
8956 { Bad_Opcode },
8957 { Bad_Opcode },
8958 { Bad_Opcode },
8959 { Bad_Opcode },
8960 { Bad_Opcode },
8961 /* 40 */
8962 { PREFIX_TABLE (PREFIX_VEX_0F3A40) },
8963 { PREFIX_TABLE (PREFIX_VEX_0F3A41) },
8964 { PREFIX_TABLE (PREFIX_VEX_0F3A42) },
8965 { Bad_Opcode },
8966 { PREFIX_TABLE (PREFIX_VEX_0F3A44) },
8967 { Bad_Opcode },
8968 { PREFIX_TABLE (PREFIX_VEX_0F3A46) },
8969 { Bad_Opcode },
8970 /* 48 */
8971 { PREFIX_TABLE (PREFIX_VEX_0F3A48) },
8972 { PREFIX_TABLE (PREFIX_VEX_0F3A49) },
8973 { PREFIX_TABLE (PREFIX_VEX_0F3A4A) },
8974 { PREFIX_TABLE (PREFIX_VEX_0F3A4B) },
8975 { PREFIX_TABLE (PREFIX_VEX_0F3A4C) },
8976 { Bad_Opcode },
8977 { Bad_Opcode },
8978 { Bad_Opcode },
8979 /* 50 */
8980 { Bad_Opcode },
8981 { Bad_Opcode },
8982 { Bad_Opcode },
8983 { Bad_Opcode },
8984 { Bad_Opcode },
8985 { Bad_Opcode },
8986 { Bad_Opcode },
8987 { Bad_Opcode },
8988 /* 58 */
8989 { Bad_Opcode },
8990 { Bad_Opcode },
8991 { Bad_Opcode },
8992 { Bad_Opcode },
8993 { PREFIX_TABLE (PREFIX_VEX_0F3A5C) },
8994 { PREFIX_TABLE (PREFIX_VEX_0F3A5D) },
8995 { PREFIX_TABLE (PREFIX_VEX_0F3A5E) },
8996 { PREFIX_TABLE (PREFIX_VEX_0F3A5F) },
8997 /* 60 */
8998 { PREFIX_TABLE (PREFIX_VEX_0F3A60) },
8999 { PREFIX_TABLE (PREFIX_VEX_0F3A61) },
9000 { PREFIX_TABLE (PREFIX_VEX_0F3A62) },
9001 { PREFIX_TABLE (PREFIX_VEX_0F3A63) },
9002 { Bad_Opcode },
9003 { Bad_Opcode },
9004 { Bad_Opcode },
9005 { Bad_Opcode },
9006 /* 68 */
9007 { PREFIX_TABLE (PREFIX_VEX_0F3A68) },
9008 { PREFIX_TABLE (PREFIX_VEX_0F3A69) },
9009 { PREFIX_TABLE (PREFIX_VEX_0F3A6A) },
9010 { PREFIX_TABLE (PREFIX_VEX_0F3A6B) },
9011 { PREFIX_TABLE (PREFIX_VEX_0F3A6C) },
9012 { PREFIX_TABLE (PREFIX_VEX_0F3A6D) },
9013 { PREFIX_TABLE (PREFIX_VEX_0F3A6E) },
9014 { PREFIX_TABLE (PREFIX_VEX_0F3A6F) },
9015 /* 70 */
9016 { Bad_Opcode },
9017 { Bad_Opcode },
9018 { Bad_Opcode },
9019 { Bad_Opcode },
9020 { Bad_Opcode },
9021 { Bad_Opcode },
9022 { Bad_Opcode },
9023 { Bad_Opcode },
9024 /* 78 */
9025 { PREFIX_TABLE (PREFIX_VEX_0F3A78) },
9026 { PREFIX_TABLE (PREFIX_VEX_0F3A79) },
9027 { PREFIX_TABLE (PREFIX_VEX_0F3A7A) },
9028 { PREFIX_TABLE (PREFIX_VEX_0F3A7B) },
9029 { PREFIX_TABLE (PREFIX_VEX_0F3A7C) },
9030 { PREFIX_TABLE (PREFIX_VEX_0F3A7D) },
9031 { PREFIX_TABLE (PREFIX_VEX_0F3A7E) },
9032 { PREFIX_TABLE (PREFIX_VEX_0F3A7F) },
9033 /* 80 */
9034 { Bad_Opcode },
9035 { Bad_Opcode },
9036 { Bad_Opcode },
9037 { Bad_Opcode },
9038 { Bad_Opcode },
9039 { Bad_Opcode },
9040 { Bad_Opcode },
9041 { Bad_Opcode },
9042 /* 88 */
9043 { Bad_Opcode },
9044 { Bad_Opcode },
9045 { Bad_Opcode },
9046 { Bad_Opcode },
9047 { Bad_Opcode },
9048 { Bad_Opcode },
9049 { Bad_Opcode },
9050 { Bad_Opcode },
9051 /* 90 */
9052 { Bad_Opcode },
9053 { Bad_Opcode },
9054 { Bad_Opcode },
9055 { Bad_Opcode },
9056 { Bad_Opcode },
9057 { Bad_Opcode },
9058 { Bad_Opcode },
9059 { Bad_Opcode },
9060 /* 98 */
9061 { Bad_Opcode },
9062 { Bad_Opcode },
9063 { Bad_Opcode },
9064 { Bad_Opcode },
9065 { Bad_Opcode },
9066 { Bad_Opcode },
9067 { Bad_Opcode },
9068 { Bad_Opcode },
9069 /* a0 */
9070 { Bad_Opcode },
9071 { Bad_Opcode },
9072 { Bad_Opcode },
9073 { Bad_Opcode },
9074 { Bad_Opcode },
9075 { Bad_Opcode },
9076 { Bad_Opcode },
9077 { Bad_Opcode },
9078 /* a8 */
9079 { Bad_Opcode },
9080 { Bad_Opcode },
9081 { Bad_Opcode },
9082 { Bad_Opcode },
9083 { Bad_Opcode },
9084 { Bad_Opcode },
9085 { Bad_Opcode },
9086 { Bad_Opcode },
9087 /* b0 */
9088 { Bad_Opcode },
9089 { Bad_Opcode },
9090 { Bad_Opcode },
9091 { Bad_Opcode },
9092 { Bad_Opcode },
9093 { Bad_Opcode },
9094 { Bad_Opcode },
9095 { Bad_Opcode },
9096 /* b8 */
9097 { Bad_Opcode },
9098 { Bad_Opcode },
9099 { Bad_Opcode },
9100 { Bad_Opcode },
9101 { Bad_Opcode },
9102 { Bad_Opcode },
9103 { Bad_Opcode },
9104 { Bad_Opcode },
9105 /* c0 */
9106 { Bad_Opcode },
9107 { Bad_Opcode },
9108 { Bad_Opcode },
9109 { Bad_Opcode },
9110 { Bad_Opcode },
9111 { Bad_Opcode },
9112 { Bad_Opcode },
9113 { Bad_Opcode },
9114 /* c8 */
9115 { Bad_Opcode },
9116 { Bad_Opcode },
9117 { Bad_Opcode },
9118 { Bad_Opcode },
9119 { Bad_Opcode },
9120 { Bad_Opcode },
9121 { Bad_Opcode },
9122 { Bad_Opcode },
9123 /* d0 */
9124 { Bad_Opcode },
9125 { Bad_Opcode },
9126 { Bad_Opcode },
9127 { Bad_Opcode },
9128 { Bad_Opcode },
9129 { Bad_Opcode },
9130 { Bad_Opcode },
9131 { Bad_Opcode },
9132 /* d8 */
9133 { Bad_Opcode },
9134 { Bad_Opcode },
9135 { Bad_Opcode },
9136 { Bad_Opcode },
9137 { Bad_Opcode },
9138 { Bad_Opcode },
9139 { Bad_Opcode },
9140 { PREFIX_TABLE (PREFIX_VEX_0F3ADF) },
9141 /* e0 */
9142 { Bad_Opcode },
9143 { Bad_Opcode },
9144 { Bad_Opcode },
9145 { Bad_Opcode },
9146 { Bad_Opcode },
9147 { Bad_Opcode },
9148 { Bad_Opcode },
9149 { Bad_Opcode },
9150 /* e8 */
9151 { Bad_Opcode },
9152 { Bad_Opcode },
9153 { Bad_Opcode },
9154 { Bad_Opcode },
9155 { Bad_Opcode },
9156 { Bad_Opcode },
9157 { Bad_Opcode },
9158 { Bad_Opcode },
9159 /* f0 */
9160 { PREFIX_TABLE (PREFIX_VEX_0F3AF0) },
9161 { Bad_Opcode },
9162 { Bad_Opcode },
9163 { Bad_Opcode },
9164 { Bad_Opcode },
9165 { Bad_Opcode },
9166 { Bad_Opcode },
9167 { Bad_Opcode },
9168 /* f8 */
9169 { Bad_Opcode },
9170 { Bad_Opcode },
9171 { Bad_Opcode },
9172 { Bad_Opcode },
9173 { Bad_Opcode },
9174 { Bad_Opcode },
9175 { Bad_Opcode },
9176 { Bad_Opcode },
9177 },
9178 };
9179
9180 #define NEED_OPCODE_TABLE
9181 #include "i386-dis-evex.h"
9182 #undef NEED_OPCODE_TABLE
9183 static const struct dis386 vex_len_table[][2] = {
9184 /* VEX_LEN_0F10_P_1 */
9185 {
9186 { VEX_W_TABLE (VEX_W_0F10_P_1) },
9187 { VEX_W_TABLE (VEX_W_0F10_P_1) },
9188 },
9189
9190 /* VEX_LEN_0F10_P_3 */
9191 {
9192 { VEX_W_TABLE (VEX_W_0F10_P_3) },
9193 { VEX_W_TABLE (VEX_W_0F10_P_3) },
9194 },
9195
9196 /* VEX_LEN_0F11_P_1 */
9197 {
9198 { VEX_W_TABLE (VEX_W_0F11_P_1) },
9199 { VEX_W_TABLE (VEX_W_0F11_P_1) },
9200 },
9201
9202 /* VEX_LEN_0F11_P_3 */
9203 {
9204 { VEX_W_TABLE (VEX_W_0F11_P_3) },
9205 { VEX_W_TABLE (VEX_W_0F11_P_3) },
9206 },
9207
9208 /* VEX_LEN_0F12_P_0_M_0 */
9209 {
9210 { VEX_W_TABLE (VEX_W_0F12_P_0_M_0) },
9211 },
9212
9213 /* VEX_LEN_0F12_P_0_M_1 */
9214 {
9215 { VEX_W_TABLE (VEX_W_0F12_P_0_M_1) },
9216 },
9217
9218 /* VEX_LEN_0F12_P_2 */
9219 {
9220 { VEX_W_TABLE (VEX_W_0F12_P_2) },
9221 },
9222
9223 /* VEX_LEN_0F13_M_0 */
9224 {
9225 { VEX_W_TABLE (VEX_W_0F13_M_0) },
9226 },
9227
9228 /* VEX_LEN_0F16_P_0_M_0 */
9229 {
9230 { VEX_W_TABLE (VEX_W_0F16_P_0_M_0) },
9231 },
9232
9233 /* VEX_LEN_0F16_P_0_M_1 */
9234 {
9235 { VEX_W_TABLE (VEX_W_0F16_P_0_M_1) },
9236 },
9237
9238 /* VEX_LEN_0F16_P_2 */
9239 {
9240 { VEX_W_TABLE (VEX_W_0F16_P_2) },
9241 },
9242
9243 /* VEX_LEN_0F17_M_0 */
9244 {
9245 { VEX_W_TABLE (VEX_W_0F17_M_0) },
9246 },
9247
9248 /* VEX_LEN_0F2A_P_1 */
9249 {
9250 { "vcvtsi2ss%LQ", { XMScalar, VexScalar, Ev } },
9251 { "vcvtsi2ss%LQ", { XMScalar, VexScalar, Ev } },
9252 },
9253
9254 /* VEX_LEN_0F2A_P_3 */
9255 {
9256 { "vcvtsi2sd%LQ", { XMScalar, VexScalar, Ev } },
9257 { "vcvtsi2sd%LQ", { XMScalar, VexScalar, Ev } },
9258 },
9259
9260 /* VEX_LEN_0F2C_P_1 */
9261 {
9262 { "vcvttss2siY", { Gv, EXdScalar } },
9263 { "vcvttss2siY", { Gv, EXdScalar } },
9264 },
9265
9266 /* VEX_LEN_0F2C_P_3 */
9267 {
9268 { "vcvttsd2siY", { Gv, EXqScalar } },
9269 { "vcvttsd2siY", { Gv, EXqScalar } },
9270 },
9271
9272 /* VEX_LEN_0F2D_P_1 */
9273 {
9274 { "vcvtss2siY", { Gv, EXdScalar } },
9275 { "vcvtss2siY", { Gv, EXdScalar } },
9276 },
9277
9278 /* VEX_LEN_0F2D_P_3 */
9279 {
9280 { "vcvtsd2siY", { Gv, EXqScalar } },
9281 { "vcvtsd2siY", { Gv, EXqScalar } },
9282 },
9283
9284 /* VEX_LEN_0F2E_P_0 */
9285 {
9286 { VEX_W_TABLE (VEX_W_0F2E_P_0) },
9287 { VEX_W_TABLE (VEX_W_0F2E_P_0) },
9288 },
9289
9290 /* VEX_LEN_0F2E_P_2 */
9291 {
9292 { VEX_W_TABLE (VEX_W_0F2E_P_2) },
9293 { VEX_W_TABLE (VEX_W_0F2E_P_2) },
9294 },
9295
9296 /* VEX_LEN_0F2F_P_0 */
9297 {
9298 { VEX_W_TABLE (VEX_W_0F2F_P_0) },
9299 { VEX_W_TABLE (VEX_W_0F2F_P_0) },
9300 },
9301
9302 /* VEX_LEN_0F2F_P_2 */
9303 {
9304 { VEX_W_TABLE (VEX_W_0F2F_P_2) },
9305 { VEX_W_TABLE (VEX_W_0F2F_P_2) },
9306 },
9307
9308 /* VEX_LEN_0F41_P_0 */
9309 {
9310 { Bad_Opcode },
9311 { VEX_W_TABLE (VEX_W_0F41_P_0_LEN_1) },
9312 },
9313 /* VEX_LEN_0F42_P_0 */
9314 {
9315 { Bad_Opcode },
9316 { VEX_W_TABLE (VEX_W_0F42_P_0_LEN_1) },
9317 },
9318 /* VEX_LEN_0F44_P_0 */
9319 {
9320 { VEX_W_TABLE (VEX_W_0F44_P_0_LEN_0) },
9321 },
9322 /* VEX_LEN_0F45_P_0 */
9323 {
9324 { Bad_Opcode },
9325 { VEX_W_TABLE (VEX_W_0F45_P_0_LEN_1) },
9326 },
9327 /* VEX_LEN_0F46_P_0 */
9328 {
9329 { Bad_Opcode },
9330 { VEX_W_TABLE (VEX_W_0F46_P_0_LEN_1) },
9331 },
9332 /* VEX_LEN_0F47_P_0 */
9333 {
9334 { Bad_Opcode },
9335 { VEX_W_TABLE (VEX_W_0F47_P_0_LEN_1) },
9336 },
9337 /* VEX_LEN_0F4B_P_2 */
9338 {
9339 { Bad_Opcode },
9340 { VEX_W_TABLE (VEX_W_0F4B_P_2_LEN_1) },
9341 },
9342
9343 /* VEX_LEN_0F51_P_1 */
9344 {
9345 { VEX_W_TABLE (VEX_W_0F51_P_1) },
9346 { VEX_W_TABLE (VEX_W_0F51_P_1) },
9347 },
9348
9349 /* VEX_LEN_0F51_P_3 */
9350 {
9351 { VEX_W_TABLE (VEX_W_0F51_P_3) },
9352 { VEX_W_TABLE (VEX_W_0F51_P_3) },
9353 },
9354
9355 /* VEX_LEN_0F52_P_1 */
9356 {
9357 { VEX_W_TABLE (VEX_W_0F52_P_1) },
9358 { VEX_W_TABLE (VEX_W_0F52_P_1) },
9359 },
9360
9361 /* VEX_LEN_0F53_P_1 */
9362 {
9363 { VEX_W_TABLE (VEX_W_0F53_P_1) },
9364 { VEX_W_TABLE (VEX_W_0F53_P_1) },
9365 },
9366
9367 /* VEX_LEN_0F58_P_1 */
9368 {
9369 { VEX_W_TABLE (VEX_W_0F58_P_1) },
9370 { VEX_W_TABLE (VEX_W_0F58_P_1) },
9371 },
9372
9373 /* VEX_LEN_0F58_P_3 */
9374 {
9375 { VEX_W_TABLE (VEX_W_0F58_P_3) },
9376 { VEX_W_TABLE (VEX_W_0F58_P_3) },
9377 },
9378
9379 /* VEX_LEN_0F59_P_1 */
9380 {
9381 { VEX_W_TABLE (VEX_W_0F59_P_1) },
9382 { VEX_W_TABLE (VEX_W_0F59_P_1) },
9383 },
9384
9385 /* VEX_LEN_0F59_P_3 */
9386 {
9387 { VEX_W_TABLE (VEX_W_0F59_P_3) },
9388 { VEX_W_TABLE (VEX_W_0F59_P_3) },
9389 },
9390
9391 /* VEX_LEN_0F5A_P_1 */
9392 {
9393 { VEX_W_TABLE (VEX_W_0F5A_P_1) },
9394 { VEX_W_TABLE (VEX_W_0F5A_P_1) },
9395 },
9396
9397 /* VEX_LEN_0F5A_P_3 */
9398 {
9399 { VEX_W_TABLE (VEX_W_0F5A_P_3) },
9400 { VEX_W_TABLE (VEX_W_0F5A_P_3) },
9401 },
9402
9403 /* VEX_LEN_0F5C_P_1 */
9404 {
9405 { VEX_W_TABLE (VEX_W_0F5C_P_1) },
9406 { VEX_W_TABLE (VEX_W_0F5C_P_1) },
9407 },
9408
9409 /* VEX_LEN_0F5C_P_3 */
9410 {
9411 { VEX_W_TABLE (VEX_W_0F5C_P_3) },
9412 { VEX_W_TABLE (VEX_W_0F5C_P_3) },
9413 },
9414
9415 /* VEX_LEN_0F5D_P_1 */
9416 {
9417 { VEX_W_TABLE (VEX_W_0F5D_P_1) },
9418 { VEX_W_TABLE (VEX_W_0F5D_P_1) },
9419 },
9420
9421 /* VEX_LEN_0F5D_P_3 */
9422 {
9423 { VEX_W_TABLE (VEX_W_0F5D_P_3) },
9424 { VEX_W_TABLE (VEX_W_0F5D_P_3) },
9425 },
9426
9427 /* VEX_LEN_0F5E_P_1 */
9428 {
9429 { VEX_W_TABLE (VEX_W_0F5E_P_1) },
9430 { VEX_W_TABLE (VEX_W_0F5E_P_1) },
9431 },
9432
9433 /* VEX_LEN_0F5E_P_3 */
9434 {
9435 { VEX_W_TABLE (VEX_W_0F5E_P_3) },
9436 { VEX_W_TABLE (VEX_W_0F5E_P_3) },
9437 },
9438
9439 /* VEX_LEN_0F5F_P_1 */
9440 {
9441 { VEX_W_TABLE (VEX_W_0F5F_P_1) },
9442 { VEX_W_TABLE (VEX_W_0F5F_P_1) },
9443 },
9444
9445 /* VEX_LEN_0F5F_P_3 */
9446 {
9447 { VEX_W_TABLE (VEX_W_0F5F_P_3) },
9448 { VEX_W_TABLE (VEX_W_0F5F_P_3) },
9449 },
9450
9451 /* VEX_LEN_0F6E_P_2 */
9452 {
9453 { "vmovK", { XMScalar, Edq } },
9454 { "vmovK", { XMScalar, Edq } },
9455 },
9456
9457 /* VEX_LEN_0F7E_P_1 */
9458 {
9459 { VEX_W_TABLE (VEX_W_0F7E_P_1) },
9460 { VEX_W_TABLE (VEX_W_0F7E_P_1) },
9461 },
9462
9463 /* VEX_LEN_0F7E_P_2 */
9464 {
9465 { "vmovK", { Edq, XMScalar } },
9466 { "vmovK", { Edq, XMScalar } },
9467 },
9468
9469 /* VEX_LEN_0F90_P_0 */
9470 {
9471 { VEX_W_TABLE (VEX_W_0F90_P_0_LEN_0) },
9472 },
9473
9474 /* VEX_LEN_0F91_P_0 */
9475 {
9476 { VEX_W_TABLE (VEX_W_0F91_P_0_LEN_0) },
9477 },
9478
9479 /* VEX_LEN_0F92_P_0 */
9480 {
9481 { VEX_W_TABLE (VEX_W_0F92_P_0_LEN_0) },
9482 },
9483
9484 /* VEX_LEN_0F93_P_0 */
9485 {
9486 { VEX_W_TABLE (VEX_W_0F93_P_0_LEN_0) },
9487 },
9488
9489 /* VEX_LEN_0F98_P_0 */
9490 {
9491 { VEX_W_TABLE (VEX_W_0F98_P_0_LEN_0) },
9492 },
9493
9494 /* VEX_LEN_0FAE_R_2_M_0 */
9495 {
9496 { VEX_W_TABLE (VEX_W_0FAE_R_2_M_0) },
9497 },
9498
9499 /* VEX_LEN_0FAE_R_3_M_0 */
9500 {
9501 { VEX_W_TABLE (VEX_W_0FAE_R_3_M_0) },
9502 },
9503
9504 /* VEX_LEN_0FC2_P_1 */
9505 {
9506 { VEX_W_TABLE (VEX_W_0FC2_P_1) },
9507 { VEX_W_TABLE (VEX_W_0FC2_P_1) },
9508 },
9509
9510 /* VEX_LEN_0FC2_P_3 */
9511 {
9512 { VEX_W_TABLE (VEX_W_0FC2_P_3) },
9513 { VEX_W_TABLE (VEX_W_0FC2_P_3) },
9514 },
9515
9516 /* VEX_LEN_0FC4_P_2 */
9517 {
9518 { VEX_W_TABLE (VEX_W_0FC4_P_2) },
9519 },
9520
9521 /* VEX_LEN_0FC5_P_2 */
9522 {
9523 { VEX_W_TABLE (VEX_W_0FC5_P_2) },
9524 },
9525
9526 /* VEX_LEN_0FD6_P_2 */
9527 {
9528 { VEX_W_TABLE (VEX_W_0FD6_P_2) },
9529 { VEX_W_TABLE (VEX_W_0FD6_P_2) },
9530 },
9531
9532 /* VEX_LEN_0FF7_P_2 */
9533 {
9534 { VEX_W_TABLE (VEX_W_0FF7_P_2) },
9535 },
9536
9537 /* VEX_LEN_0F3816_P_2 */
9538 {
9539 { Bad_Opcode },
9540 { VEX_W_TABLE (VEX_W_0F3816_P_2) },
9541 },
9542
9543 /* VEX_LEN_0F3819_P_2 */
9544 {
9545 { Bad_Opcode },
9546 { VEX_W_TABLE (VEX_W_0F3819_P_2) },
9547 },
9548
9549 /* VEX_LEN_0F381A_P_2_M_0 */
9550 {
9551 { Bad_Opcode },
9552 { VEX_W_TABLE (VEX_W_0F381A_P_2_M_0) },
9553 },
9554
9555 /* VEX_LEN_0F3836_P_2 */
9556 {
9557 { Bad_Opcode },
9558 { VEX_W_TABLE (VEX_W_0F3836_P_2) },
9559 },
9560
9561 /* VEX_LEN_0F3841_P_2 */
9562 {
9563 { VEX_W_TABLE (VEX_W_0F3841_P_2) },
9564 },
9565
9566 /* VEX_LEN_0F385A_P_2_M_0 */
9567 {
9568 { Bad_Opcode },
9569 { VEX_W_TABLE (VEX_W_0F385A_P_2_M_0) },
9570 },
9571
9572 /* VEX_LEN_0F38DB_P_2 */
9573 {
9574 { VEX_W_TABLE (VEX_W_0F38DB_P_2) },
9575 },
9576
9577 /* VEX_LEN_0F38DC_P_2 */
9578 {
9579 { VEX_W_TABLE (VEX_W_0F38DC_P_2) },
9580 },
9581
9582 /* VEX_LEN_0F38DD_P_2 */
9583 {
9584 { VEX_W_TABLE (VEX_W_0F38DD_P_2) },
9585 },
9586
9587 /* VEX_LEN_0F38DE_P_2 */
9588 {
9589 { VEX_W_TABLE (VEX_W_0F38DE_P_2) },
9590 },
9591
9592 /* VEX_LEN_0F38DF_P_2 */
9593 {
9594 { VEX_W_TABLE (VEX_W_0F38DF_P_2) },
9595 },
9596
9597 /* VEX_LEN_0F38F2_P_0 */
9598 {
9599 { "andnS", { Gdq, VexGdq, Edq } },
9600 },
9601
9602 /* VEX_LEN_0F38F3_R_1_P_0 */
9603 {
9604 { "blsrS", { VexGdq, Edq } },
9605 },
9606
9607 /* VEX_LEN_0F38F3_R_2_P_0 */
9608 {
9609 { "blsmskS", { VexGdq, Edq } },
9610 },
9611
9612 /* VEX_LEN_0F38F3_R_3_P_0 */
9613 {
9614 { "blsiS", { VexGdq, Edq } },
9615 },
9616
9617 /* VEX_LEN_0F38F5_P_0 */
9618 {
9619 { "bzhiS", { Gdq, Edq, VexGdq } },
9620 },
9621
9622 /* VEX_LEN_0F38F5_P_1 */
9623 {
9624 { "pextS", { Gdq, VexGdq, Edq } },
9625 },
9626
9627 /* VEX_LEN_0F38F5_P_3 */
9628 {
9629 { "pdepS", { Gdq, VexGdq, Edq } },
9630 },
9631
9632 /* VEX_LEN_0F38F6_P_3 */
9633 {
9634 { "mulxS", { Gdq, VexGdq, Edq } },
9635 },
9636
9637 /* VEX_LEN_0F38F7_P_0 */
9638 {
9639 { "bextrS", { Gdq, Edq, VexGdq } },
9640 },
9641
9642 /* VEX_LEN_0F38F7_P_1 */
9643 {
9644 { "sarxS", { Gdq, Edq, VexGdq } },
9645 },
9646
9647 /* VEX_LEN_0F38F7_P_2 */
9648 {
9649 { "shlxS", { Gdq, Edq, VexGdq } },
9650 },
9651
9652 /* VEX_LEN_0F38F7_P_3 */
9653 {
9654 { "shrxS", { Gdq, Edq, VexGdq } },
9655 },
9656
9657 /* VEX_LEN_0F3A00_P_2 */
9658 {
9659 { Bad_Opcode },
9660 { VEX_W_TABLE (VEX_W_0F3A00_P_2) },
9661 },
9662
9663 /* VEX_LEN_0F3A01_P_2 */
9664 {
9665 { Bad_Opcode },
9666 { VEX_W_TABLE (VEX_W_0F3A01_P_2) },
9667 },
9668
9669 /* VEX_LEN_0F3A06_P_2 */
9670 {
9671 { Bad_Opcode },
9672 { VEX_W_TABLE (VEX_W_0F3A06_P_2) },
9673 },
9674
9675 /* VEX_LEN_0F3A0A_P_2 */
9676 {
9677 { VEX_W_TABLE (VEX_W_0F3A0A_P_2) },
9678 { VEX_W_TABLE (VEX_W_0F3A0A_P_2) },
9679 },
9680
9681 /* VEX_LEN_0F3A0B_P_2 */
9682 {
9683 { VEX_W_TABLE (VEX_W_0F3A0B_P_2) },
9684 { VEX_W_TABLE (VEX_W_0F3A0B_P_2) },
9685 },
9686
9687 /* VEX_LEN_0F3A14_P_2 */
9688 {
9689 { VEX_W_TABLE (VEX_W_0F3A14_P_2) },
9690 },
9691
9692 /* VEX_LEN_0F3A15_P_2 */
9693 {
9694 { VEX_W_TABLE (VEX_W_0F3A15_P_2) },
9695 },
9696
9697 /* VEX_LEN_0F3A16_P_2 */
9698 {
9699 { "vpextrK", { Edq, XM, Ib } },
9700 },
9701
9702 /* VEX_LEN_0F3A17_P_2 */
9703 {
9704 { "vextractps", { Edqd, XM, Ib } },
9705 },
9706
9707 /* VEX_LEN_0F3A18_P_2 */
9708 {
9709 { Bad_Opcode },
9710 { VEX_W_TABLE (VEX_W_0F3A18_P_2) },
9711 },
9712
9713 /* VEX_LEN_0F3A19_P_2 */
9714 {
9715 { Bad_Opcode },
9716 { VEX_W_TABLE (VEX_W_0F3A19_P_2) },
9717 },
9718
9719 /* VEX_LEN_0F3A20_P_2 */
9720 {
9721 { VEX_W_TABLE (VEX_W_0F3A20_P_2) },
9722 },
9723
9724 /* VEX_LEN_0F3A21_P_2 */
9725 {
9726 { VEX_W_TABLE (VEX_W_0F3A21_P_2) },
9727 },
9728
9729 /* VEX_LEN_0F3A22_P_2 */
9730 {
9731 { "vpinsrK", { XM, Vex128, Edq, Ib } },
9732 },
9733
9734 /* VEX_LEN_0F3A30_P_2 */
9735 {
9736 { VEX_W_TABLE (VEX_W_0F3A30_P_2_LEN_0) },
9737 },
9738
9739 /* VEX_LEN_0F3A32_P_2 */
9740 {
9741 { VEX_W_TABLE (VEX_W_0F3A32_P_2_LEN_0) },
9742 },
9743
9744 /* VEX_LEN_0F3A38_P_2 */
9745 {
9746 { Bad_Opcode },
9747 { VEX_W_TABLE (VEX_W_0F3A38_P_2) },
9748 },
9749
9750 /* VEX_LEN_0F3A39_P_2 */
9751 {
9752 { Bad_Opcode },
9753 { VEX_W_TABLE (VEX_W_0F3A39_P_2) },
9754 },
9755
9756 /* VEX_LEN_0F3A41_P_2 */
9757 {
9758 { VEX_W_TABLE (VEX_W_0F3A41_P_2) },
9759 },
9760
9761 /* VEX_LEN_0F3A44_P_2 */
9762 {
9763 { VEX_W_TABLE (VEX_W_0F3A44_P_2) },
9764 },
9765
9766 /* VEX_LEN_0F3A46_P_2 */
9767 {
9768 { Bad_Opcode },
9769 { VEX_W_TABLE (VEX_W_0F3A46_P_2) },
9770 },
9771
9772 /* VEX_LEN_0F3A60_P_2 */
9773 {
9774 { VEX_W_TABLE (VEX_W_0F3A60_P_2) },
9775 },
9776
9777 /* VEX_LEN_0F3A61_P_2 */
9778 {
9779 { VEX_W_TABLE (VEX_W_0F3A61_P_2) },
9780 },
9781
9782 /* VEX_LEN_0F3A62_P_2 */
9783 {
9784 { VEX_W_TABLE (VEX_W_0F3A62_P_2) },
9785 },
9786
9787 /* VEX_LEN_0F3A63_P_2 */
9788 {
9789 { VEX_W_TABLE (VEX_W_0F3A63_P_2) },
9790 },
9791
9792 /* VEX_LEN_0F3A6A_P_2 */
9793 {
9794 { "vfmaddss", { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
9795 },
9796
9797 /* VEX_LEN_0F3A6B_P_2 */
9798 {
9799 { "vfmaddsd", { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
9800 },
9801
9802 /* VEX_LEN_0F3A6E_P_2 */
9803 {
9804 { "vfmsubss", { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
9805 },
9806
9807 /* VEX_LEN_0F3A6F_P_2 */
9808 {
9809 { "vfmsubsd", { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
9810 },
9811
9812 /* VEX_LEN_0F3A7A_P_2 */
9813 {
9814 { "vfnmaddss", { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
9815 },
9816
9817 /* VEX_LEN_0F3A7B_P_2 */
9818 {
9819 { "vfnmaddsd", { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
9820 },
9821
9822 /* VEX_LEN_0F3A7E_P_2 */
9823 {
9824 { "vfnmsubss", { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
9825 },
9826
9827 /* VEX_LEN_0F3A7F_P_2 */
9828 {
9829 { "vfnmsubsd", { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
9830 },
9831
9832 /* VEX_LEN_0F3ADF_P_2 */
9833 {
9834 { VEX_W_TABLE (VEX_W_0F3ADF_P_2) },
9835 },
9836
9837 /* VEX_LEN_0F3AF0_P_3 */
9838 {
9839 { "rorxS", { Gdq, Edq, Ib } },
9840 },
9841
9842 /* VEX_LEN_0FXOP_08_CC */
9843 {
9844 { "vpcomb", { XM, Vex128, EXx, Ib } },
9845 },
9846
9847 /* VEX_LEN_0FXOP_08_CD */
9848 {
9849 { "vpcomw", { XM, Vex128, EXx, Ib } },
9850 },
9851
9852 /* VEX_LEN_0FXOP_08_CE */
9853 {
9854 { "vpcomd", { XM, Vex128, EXx, Ib } },
9855 },
9856
9857 /* VEX_LEN_0FXOP_08_CF */
9858 {
9859 { "vpcomq", { XM, Vex128, EXx, Ib } },
9860 },
9861
9862 /* VEX_LEN_0FXOP_08_EC */
9863 {
9864 { "vpcomub", { XM, Vex128, EXx, Ib } },
9865 },
9866
9867 /* VEX_LEN_0FXOP_08_ED */
9868 {
9869 { "vpcomuw", { XM, Vex128, EXx, Ib } },
9870 },
9871
9872 /* VEX_LEN_0FXOP_08_EE */
9873 {
9874 { "vpcomud", { XM, Vex128, EXx, Ib } },
9875 },
9876
9877 /* VEX_LEN_0FXOP_08_EF */
9878 {
9879 { "vpcomuq", { XM, Vex128, EXx, Ib } },
9880 },
9881
9882 /* VEX_LEN_0FXOP_09_80 */
9883 {
9884 { "vfrczps", { XM, EXxmm } },
9885 { "vfrczps", { XM, EXymmq } },
9886 },
9887
9888 /* VEX_LEN_0FXOP_09_81 */
9889 {
9890 { "vfrczpd", { XM, EXxmm } },
9891 { "vfrczpd", { XM, EXymmq } },
9892 },
9893 };
9894
9895 static const struct dis386 vex_w_table[][2] = {
9896 {
9897 /* VEX_W_0F10_P_0 */
9898 { "vmovups", { XM, EXx } },
9899 },
9900 {
9901 /* VEX_W_0F10_P_1 */
9902 { "vmovss", { XMVexScalar, VexScalar, EXdScalar } },
9903 },
9904 {
9905 /* VEX_W_0F10_P_2 */
9906 { "vmovupd", { XM, EXx } },
9907 },
9908 {
9909 /* VEX_W_0F10_P_3 */
9910 { "vmovsd", { XMVexScalar, VexScalar, EXqScalar } },
9911 },
9912 {
9913 /* VEX_W_0F11_P_0 */
9914 { "vmovups", { EXxS, XM } },
9915 },
9916 {
9917 /* VEX_W_0F11_P_1 */
9918 { "vmovss", { EXdVexScalarS, VexScalar, XMScalar } },
9919 },
9920 {
9921 /* VEX_W_0F11_P_2 */
9922 { "vmovupd", { EXxS, XM } },
9923 },
9924 {
9925 /* VEX_W_0F11_P_3 */
9926 { "vmovsd", { EXqVexScalarS, VexScalar, XMScalar } },
9927 },
9928 {
9929 /* VEX_W_0F12_P_0_M_0 */
9930 { "vmovlps", { XM, Vex128, EXq } },
9931 },
9932 {
9933 /* VEX_W_0F12_P_0_M_1 */
9934 { "vmovhlps", { XM, Vex128, EXq } },
9935 },
9936 {
9937 /* VEX_W_0F12_P_1 */
9938 { "vmovsldup", { XM, EXx } },
9939 },
9940 {
9941 /* VEX_W_0F12_P_2 */
9942 { "vmovlpd", { XM, Vex128, EXq } },
9943 },
9944 {
9945 /* VEX_W_0F12_P_3 */
9946 { "vmovddup", { XM, EXymmq } },
9947 },
9948 {
9949 /* VEX_W_0F13_M_0 */
9950 { "vmovlpX", { EXq, XM } },
9951 },
9952 {
9953 /* VEX_W_0F14 */
9954 { "vunpcklpX", { XM, Vex, EXx } },
9955 },
9956 {
9957 /* VEX_W_0F15 */
9958 { "vunpckhpX", { XM, Vex, EXx } },
9959 },
9960 {
9961 /* VEX_W_0F16_P_0_M_0 */
9962 { "vmovhps", { XM, Vex128, EXq } },
9963 },
9964 {
9965 /* VEX_W_0F16_P_0_M_1 */
9966 { "vmovlhps", { XM, Vex128, EXq } },
9967 },
9968 {
9969 /* VEX_W_0F16_P_1 */
9970 { "vmovshdup", { XM, EXx } },
9971 },
9972 {
9973 /* VEX_W_0F16_P_2 */
9974 { "vmovhpd", { XM, Vex128, EXq } },
9975 },
9976 {
9977 /* VEX_W_0F17_M_0 */
9978 { "vmovhpX", { EXq, XM } },
9979 },
9980 {
9981 /* VEX_W_0F28 */
9982 { "vmovapX", { XM, EXx } },
9983 },
9984 {
9985 /* VEX_W_0F29 */
9986 { "vmovapX", { EXxS, XM } },
9987 },
9988 {
9989 /* VEX_W_0F2B_M_0 */
9990 { "vmovntpX", { Mx, XM } },
9991 },
9992 {
9993 /* VEX_W_0F2E_P_0 */
9994 { "vucomiss", { XMScalar, EXdScalar } },
9995 },
9996 {
9997 /* VEX_W_0F2E_P_2 */
9998 { "vucomisd", { XMScalar, EXqScalar } },
9999 },
10000 {
10001 /* VEX_W_0F2F_P_0 */
10002 { "vcomiss", { XMScalar, EXdScalar } },
10003 },
10004 {
10005 /* VEX_W_0F2F_P_2 */
10006 { "vcomisd", { XMScalar, EXqScalar } },
10007 },
10008 {
10009 /* VEX_W_0F41_P_0_LEN_1 */
10010 { "kandw", { MaskG, MaskVex, MaskR } },
10011 },
10012 {
10013 /* VEX_W_0F42_P_0_LEN_1 */
10014 { "kandnw", { MaskG, MaskVex, MaskR } },
10015 },
10016 {
10017 /* VEX_W_0F44_P_0_LEN_0 */
10018 { "knotw", { MaskG, MaskR } },
10019 },
10020 {
10021 /* VEX_W_0F45_P_0_LEN_1 */
10022 { "korw", { MaskG, MaskVex, MaskR } },
10023 },
10024 {
10025 /* VEX_W_0F46_P_0_LEN_1 */
10026 { "kxnorw", { MaskG, MaskVex, MaskR } },
10027 },
10028 {
10029 /* VEX_W_0F47_P_0_LEN_1 */
10030 { "kxorw", { MaskG, MaskVex, MaskR } },
10031 },
10032 {
10033 /* VEX_W_0F4B_P_2_LEN_1 */
10034 { "kunpckbw", { MaskG, MaskVex, MaskR } },
10035 },
10036 {
10037 /* VEX_W_0F50_M_0 */
10038 { "vmovmskpX", { Gdq, XS } },
10039 },
10040 {
10041 /* VEX_W_0F51_P_0 */
10042 { "vsqrtps", { XM, EXx } },
10043 },
10044 {
10045 /* VEX_W_0F51_P_1 */
10046 { "vsqrtss", { XMScalar, VexScalar, EXdScalar } },
10047 },
10048 {
10049 /* VEX_W_0F51_P_2 */
10050 { "vsqrtpd", { XM, EXx } },
10051 },
10052 {
10053 /* VEX_W_0F51_P_3 */
10054 { "vsqrtsd", { XMScalar, VexScalar, EXqScalar } },
10055 },
10056 {
10057 /* VEX_W_0F52_P_0 */
10058 { "vrsqrtps", { XM, EXx } },
10059 },
10060 {
10061 /* VEX_W_0F52_P_1 */
10062 { "vrsqrtss", { XMScalar, VexScalar, EXdScalar } },
10063 },
10064 {
10065 /* VEX_W_0F53_P_0 */
10066 { "vrcpps", { XM, EXx } },
10067 },
10068 {
10069 /* VEX_W_0F53_P_1 */
10070 { "vrcpss", { XMScalar, VexScalar, EXdScalar } },
10071 },
10072 {
10073 /* VEX_W_0F58_P_0 */
10074 { "vaddps", { XM, Vex, EXx } },
10075 },
10076 {
10077 /* VEX_W_0F58_P_1 */
10078 { "vaddss", { XMScalar, VexScalar, EXdScalar } },
10079 },
10080 {
10081 /* VEX_W_0F58_P_2 */
10082 { "vaddpd", { XM, Vex, EXx } },
10083 },
10084 {
10085 /* VEX_W_0F58_P_3 */
10086 { "vaddsd", { XMScalar, VexScalar, EXqScalar } },
10087 },
10088 {
10089 /* VEX_W_0F59_P_0 */
10090 { "vmulps", { XM, Vex, EXx } },
10091 },
10092 {
10093 /* VEX_W_0F59_P_1 */
10094 { "vmulss", { XMScalar, VexScalar, EXdScalar } },
10095 },
10096 {
10097 /* VEX_W_0F59_P_2 */
10098 { "vmulpd", { XM, Vex, EXx } },
10099 },
10100 {
10101 /* VEX_W_0F59_P_3 */
10102 { "vmulsd", { XMScalar, VexScalar, EXqScalar } },
10103 },
10104 {
10105 /* VEX_W_0F5A_P_0 */
10106 { "vcvtps2pd", { XM, EXxmmq } },
10107 },
10108 {
10109 /* VEX_W_0F5A_P_1 */
10110 { "vcvtss2sd", { XMScalar, VexScalar, EXdScalar } },
10111 },
10112 {
10113 /* VEX_W_0F5A_P_3 */
10114 { "vcvtsd2ss", { XMScalar, VexScalar, EXqScalar } },
10115 },
10116 {
10117 /* VEX_W_0F5B_P_0 */
10118 { "vcvtdq2ps", { XM, EXx } },
10119 },
10120 {
10121 /* VEX_W_0F5B_P_1 */
10122 { "vcvttps2dq", { XM, EXx } },
10123 },
10124 {
10125 /* VEX_W_0F5B_P_2 */
10126 { "vcvtps2dq", { XM, EXx } },
10127 },
10128 {
10129 /* VEX_W_0F5C_P_0 */
10130 { "vsubps", { XM, Vex, EXx } },
10131 },
10132 {
10133 /* VEX_W_0F5C_P_1 */
10134 { "vsubss", { XMScalar, VexScalar, EXdScalar } },
10135 },
10136 {
10137 /* VEX_W_0F5C_P_2 */
10138 { "vsubpd", { XM, Vex, EXx } },
10139 },
10140 {
10141 /* VEX_W_0F5C_P_3 */
10142 { "vsubsd", { XMScalar, VexScalar, EXqScalar } },
10143 },
10144 {
10145 /* VEX_W_0F5D_P_0 */
10146 { "vminps", { XM, Vex, EXx } },
10147 },
10148 {
10149 /* VEX_W_0F5D_P_1 */
10150 { "vminss", { XMScalar, VexScalar, EXdScalar } },
10151 },
10152 {
10153 /* VEX_W_0F5D_P_2 */
10154 { "vminpd", { XM, Vex, EXx } },
10155 },
10156 {
10157 /* VEX_W_0F5D_P_3 */
10158 { "vminsd", { XMScalar, VexScalar, EXqScalar } },
10159 },
10160 {
10161 /* VEX_W_0F5E_P_0 */
10162 { "vdivps", { XM, Vex, EXx } },
10163 },
10164 {
10165 /* VEX_W_0F5E_P_1 */
10166 { "vdivss", { XMScalar, VexScalar, EXdScalar } },
10167 },
10168 {
10169 /* VEX_W_0F5E_P_2 */
10170 { "vdivpd", { XM, Vex, EXx } },
10171 },
10172 {
10173 /* VEX_W_0F5E_P_3 */
10174 { "vdivsd", { XMScalar, VexScalar, EXqScalar } },
10175 },
10176 {
10177 /* VEX_W_0F5F_P_0 */
10178 { "vmaxps", { XM, Vex, EXx } },
10179 },
10180 {
10181 /* VEX_W_0F5F_P_1 */
10182 { "vmaxss", { XMScalar, VexScalar, EXdScalar } },
10183 },
10184 {
10185 /* VEX_W_0F5F_P_2 */
10186 { "vmaxpd", { XM, Vex, EXx } },
10187 },
10188 {
10189 /* VEX_W_0F5F_P_3 */
10190 { "vmaxsd", { XMScalar, VexScalar, EXqScalar } },
10191 },
10192 {
10193 /* VEX_W_0F60_P_2 */
10194 { "vpunpcklbw", { XM, Vex, EXx } },
10195 },
10196 {
10197 /* VEX_W_0F61_P_2 */
10198 { "vpunpcklwd", { XM, Vex, EXx } },
10199 },
10200 {
10201 /* VEX_W_0F62_P_2 */
10202 { "vpunpckldq", { XM, Vex, EXx } },
10203 },
10204 {
10205 /* VEX_W_0F63_P_2 */
10206 { "vpacksswb", { XM, Vex, EXx } },
10207 },
10208 {
10209 /* VEX_W_0F64_P_2 */
10210 { "vpcmpgtb", { XM, Vex, EXx } },
10211 },
10212 {
10213 /* VEX_W_0F65_P_2 */
10214 { "vpcmpgtw", { XM, Vex, EXx } },
10215 },
10216 {
10217 /* VEX_W_0F66_P_2 */
10218 { "vpcmpgtd", { XM, Vex, EXx } },
10219 },
10220 {
10221 /* VEX_W_0F67_P_2 */
10222 { "vpackuswb", { XM, Vex, EXx } },
10223 },
10224 {
10225 /* VEX_W_0F68_P_2 */
10226 { "vpunpckhbw", { XM, Vex, EXx } },
10227 },
10228 {
10229 /* VEX_W_0F69_P_2 */
10230 { "vpunpckhwd", { XM, Vex, EXx } },
10231 },
10232 {
10233 /* VEX_W_0F6A_P_2 */
10234 { "vpunpckhdq", { XM, Vex, EXx } },
10235 },
10236 {
10237 /* VEX_W_0F6B_P_2 */
10238 { "vpackssdw", { XM, Vex, EXx } },
10239 },
10240 {
10241 /* VEX_W_0F6C_P_2 */
10242 { "vpunpcklqdq", { XM, Vex, EXx } },
10243 },
10244 {
10245 /* VEX_W_0F6D_P_2 */
10246 { "vpunpckhqdq", { XM, Vex, EXx } },
10247 },
10248 {
10249 /* VEX_W_0F6F_P_1 */
10250 { "vmovdqu", { XM, EXx } },
10251 },
10252 {
10253 /* VEX_W_0F6F_P_2 */
10254 { "vmovdqa", { XM, EXx } },
10255 },
10256 {
10257 /* VEX_W_0F70_P_1 */
10258 { "vpshufhw", { XM, EXx, Ib } },
10259 },
10260 {
10261 /* VEX_W_0F70_P_2 */
10262 { "vpshufd", { XM, EXx, Ib } },
10263 },
10264 {
10265 /* VEX_W_0F70_P_3 */
10266 { "vpshuflw", { XM, EXx, Ib } },
10267 },
10268 {
10269 /* VEX_W_0F71_R_2_P_2 */
10270 { "vpsrlw", { Vex, XS, Ib } },
10271 },
10272 {
10273 /* VEX_W_0F71_R_4_P_2 */
10274 { "vpsraw", { Vex, XS, Ib } },
10275 },
10276 {
10277 /* VEX_W_0F71_R_6_P_2 */
10278 { "vpsllw", { Vex, XS, Ib } },
10279 },
10280 {
10281 /* VEX_W_0F72_R_2_P_2 */
10282 { "vpsrld", { Vex, XS, Ib } },
10283 },
10284 {
10285 /* VEX_W_0F72_R_4_P_2 */
10286 { "vpsrad", { Vex, XS, Ib } },
10287 },
10288 {
10289 /* VEX_W_0F72_R_6_P_2 */
10290 { "vpslld", { Vex, XS, Ib } },
10291 },
10292 {
10293 /* VEX_W_0F73_R_2_P_2 */
10294 { "vpsrlq", { Vex, XS, Ib } },
10295 },
10296 {
10297 /* VEX_W_0F73_R_3_P_2 */
10298 { "vpsrldq", { Vex, XS, Ib } },
10299 },
10300 {
10301 /* VEX_W_0F73_R_6_P_2 */
10302 { "vpsllq", { Vex, XS, Ib } },
10303 },
10304 {
10305 /* VEX_W_0F73_R_7_P_2 */
10306 { "vpslldq", { Vex, XS, Ib } },
10307 },
10308 {
10309 /* VEX_W_0F74_P_2 */
10310 { "vpcmpeqb", { XM, Vex, EXx } },
10311 },
10312 {
10313 /* VEX_W_0F75_P_2 */
10314 { "vpcmpeqw", { XM, Vex, EXx } },
10315 },
10316 {
10317 /* VEX_W_0F76_P_2 */
10318 { "vpcmpeqd", { XM, Vex, EXx } },
10319 },
10320 {
10321 /* VEX_W_0F77_P_0 */
10322 { "", { VZERO } },
10323 },
10324 {
10325 /* VEX_W_0F7C_P_2 */
10326 { "vhaddpd", { XM, Vex, EXx } },
10327 },
10328 {
10329 /* VEX_W_0F7C_P_3 */
10330 { "vhaddps", { XM, Vex, EXx } },
10331 },
10332 {
10333 /* VEX_W_0F7D_P_2 */
10334 { "vhsubpd", { XM, Vex, EXx } },
10335 },
10336 {
10337 /* VEX_W_0F7D_P_3 */
10338 { "vhsubps", { XM, Vex, EXx } },
10339 },
10340 {
10341 /* VEX_W_0F7E_P_1 */
10342 { "vmovq", { XMScalar, EXqScalar } },
10343 },
10344 {
10345 /* VEX_W_0F7F_P_1 */
10346 { "vmovdqu", { EXxS, XM } },
10347 },
10348 {
10349 /* VEX_W_0F7F_P_2 */
10350 { "vmovdqa", { EXxS, XM } },
10351 },
10352 {
10353 /* VEX_W_0F90_P_0_LEN_0 */
10354 { "kmovw", { MaskG, MaskE } },
10355 },
10356 {
10357 /* VEX_W_0F91_P_0_LEN_0 */
10358 { "kmovw", { Ew, MaskG } },
10359 },
10360 {
10361 /* VEX_W_0F92_P_0_LEN_0 */
10362 { "kmovw", { MaskG, Rdq } },
10363 },
10364 {
10365 /* VEX_W_0F93_P_0_LEN_0 */
10366 { "kmovw", { Gdq, MaskR } },
10367 },
10368 {
10369 /* VEX_W_0F98_P_0_LEN_0 */
10370 { "kortestw", { MaskG, MaskR } },
10371 },
10372 {
10373 /* VEX_W_0FAE_R_2_M_0 */
10374 { "vldmxcsr", { Md } },
10375 },
10376 {
10377 /* VEX_W_0FAE_R_3_M_0 */
10378 { "vstmxcsr", { Md } },
10379 },
10380 {
10381 /* VEX_W_0FC2_P_0 */
10382 { "vcmpps", { XM, Vex, EXx, VCMP } },
10383 },
10384 {
10385 /* VEX_W_0FC2_P_1 */
10386 { "vcmpss", { XMScalar, VexScalar, EXdScalar, VCMP } },
10387 },
10388 {
10389 /* VEX_W_0FC2_P_2 */
10390 { "vcmppd", { XM, Vex, EXx, VCMP } },
10391 },
10392 {
10393 /* VEX_W_0FC2_P_3 */
10394 { "vcmpsd", { XMScalar, VexScalar, EXqScalar, VCMP } },
10395 },
10396 {
10397 /* VEX_W_0FC4_P_2 */
10398 { "vpinsrw", { XM, Vex128, Edqw, Ib } },
10399 },
10400 {
10401 /* VEX_W_0FC5_P_2 */
10402 { "vpextrw", { Gdq, XS, Ib } },
10403 },
10404 {
10405 /* VEX_W_0FD0_P_2 */
10406 { "vaddsubpd", { XM, Vex, EXx } },
10407 },
10408 {
10409 /* VEX_W_0FD0_P_3 */
10410 { "vaddsubps", { XM, Vex, EXx } },
10411 },
10412 {
10413 /* VEX_W_0FD1_P_2 */
10414 { "vpsrlw", { XM, Vex, EXxmm } },
10415 },
10416 {
10417 /* VEX_W_0FD2_P_2 */
10418 { "vpsrld", { XM, Vex, EXxmm } },
10419 },
10420 {
10421 /* VEX_W_0FD3_P_2 */
10422 { "vpsrlq", { XM, Vex, EXxmm } },
10423 },
10424 {
10425 /* VEX_W_0FD4_P_2 */
10426 { "vpaddq", { XM, Vex, EXx } },
10427 },
10428 {
10429 /* VEX_W_0FD5_P_2 */
10430 { "vpmullw", { XM, Vex, EXx } },
10431 },
10432 {
10433 /* VEX_W_0FD6_P_2 */
10434 { "vmovq", { EXqScalarS, XMScalar } },
10435 },
10436 {
10437 /* VEX_W_0FD7_P_2_M_1 */
10438 { "vpmovmskb", { Gdq, XS } },
10439 },
10440 {
10441 /* VEX_W_0FD8_P_2 */
10442 { "vpsubusb", { XM, Vex, EXx } },
10443 },
10444 {
10445 /* VEX_W_0FD9_P_2 */
10446 { "vpsubusw", { XM, Vex, EXx } },
10447 },
10448 {
10449 /* VEX_W_0FDA_P_2 */
10450 { "vpminub", { XM, Vex, EXx } },
10451 },
10452 {
10453 /* VEX_W_0FDB_P_2 */
10454 { "vpand", { XM, Vex, EXx } },
10455 },
10456 {
10457 /* VEX_W_0FDC_P_2 */
10458 { "vpaddusb", { XM, Vex, EXx } },
10459 },
10460 {
10461 /* VEX_W_0FDD_P_2 */
10462 { "vpaddusw", { XM, Vex, EXx } },
10463 },
10464 {
10465 /* VEX_W_0FDE_P_2 */
10466 { "vpmaxub", { XM, Vex, EXx } },
10467 },
10468 {
10469 /* VEX_W_0FDF_P_2 */
10470 { "vpandn", { XM, Vex, EXx } },
10471 },
10472 {
10473 /* VEX_W_0FE0_P_2 */
10474 { "vpavgb", { XM, Vex, EXx } },
10475 },
10476 {
10477 /* VEX_W_0FE1_P_2 */
10478 { "vpsraw", { XM, Vex, EXxmm } },
10479 },
10480 {
10481 /* VEX_W_0FE2_P_2 */
10482 { "vpsrad", { XM, Vex, EXxmm } },
10483 },
10484 {
10485 /* VEX_W_0FE3_P_2 */
10486 { "vpavgw", { XM, Vex, EXx } },
10487 },
10488 {
10489 /* VEX_W_0FE4_P_2 */
10490 { "vpmulhuw", { XM, Vex, EXx } },
10491 },
10492 {
10493 /* VEX_W_0FE5_P_2 */
10494 { "vpmulhw", { XM, Vex, EXx } },
10495 },
10496 {
10497 /* VEX_W_0FE6_P_1 */
10498 { "vcvtdq2pd", { XM, EXxmmq } },
10499 },
10500 {
10501 /* VEX_W_0FE6_P_2 */
10502 { "vcvttpd2dq%XY", { XMM, EXx } },
10503 },
10504 {
10505 /* VEX_W_0FE6_P_3 */
10506 { "vcvtpd2dq%XY", { XMM, EXx } },
10507 },
10508 {
10509 /* VEX_W_0FE7_P_2_M_0 */
10510 { "vmovntdq", { Mx, XM } },
10511 },
10512 {
10513 /* VEX_W_0FE8_P_2 */
10514 { "vpsubsb", { XM, Vex, EXx } },
10515 },
10516 {
10517 /* VEX_W_0FE9_P_2 */
10518 { "vpsubsw", { XM, Vex, EXx } },
10519 },
10520 {
10521 /* VEX_W_0FEA_P_2 */
10522 { "vpminsw", { XM, Vex, EXx } },
10523 },
10524 {
10525 /* VEX_W_0FEB_P_2 */
10526 { "vpor", { XM, Vex, EXx } },
10527 },
10528 {
10529 /* VEX_W_0FEC_P_2 */
10530 { "vpaddsb", { XM, Vex, EXx } },
10531 },
10532 {
10533 /* VEX_W_0FED_P_2 */
10534 { "vpaddsw", { XM, Vex, EXx } },
10535 },
10536 {
10537 /* VEX_W_0FEE_P_2 */
10538 { "vpmaxsw", { XM, Vex, EXx } },
10539 },
10540 {
10541 /* VEX_W_0FEF_P_2 */
10542 { "vpxor", { XM, Vex, EXx } },
10543 },
10544 {
10545 /* VEX_W_0FF0_P_3_M_0 */
10546 { "vlddqu", { XM, M } },
10547 },
10548 {
10549 /* VEX_W_0FF1_P_2 */
10550 { "vpsllw", { XM, Vex, EXxmm } },
10551 },
10552 {
10553 /* VEX_W_0FF2_P_2 */
10554 { "vpslld", { XM, Vex, EXxmm } },
10555 },
10556 {
10557 /* VEX_W_0FF3_P_2 */
10558 { "vpsllq", { XM, Vex, EXxmm } },
10559 },
10560 {
10561 /* VEX_W_0FF4_P_2 */
10562 { "vpmuludq", { XM, Vex, EXx } },
10563 },
10564 {
10565 /* VEX_W_0FF5_P_2 */
10566 { "vpmaddwd", { XM, Vex, EXx } },
10567 },
10568 {
10569 /* VEX_W_0FF6_P_2 */
10570 { "vpsadbw", { XM, Vex, EXx } },
10571 },
10572 {
10573 /* VEX_W_0FF7_P_2 */
10574 { "vmaskmovdqu", { XM, XS } },
10575 },
10576 {
10577 /* VEX_W_0FF8_P_2 */
10578 { "vpsubb", { XM, Vex, EXx } },
10579 },
10580 {
10581 /* VEX_W_0FF9_P_2 */
10582 { "vpsubw", { XM, Vex, EXx } },
10583 },
10584 {
10585 /* VEX_W_0FFA_P_2 */
10586 { "vpsubd", { XM, Vex, EXx } },
10587 },
10588 {
10589 /* VEX_W_0FFB_P_2 */
10590 { "vpsubq", { XM, Vex, EXx } },
10591 },
10592 {
10593 /* VEX_W_0FFC_P_2 */
10594 { "vpaddb", { XM, Vex, EXx } },
10595 },
10596 {
10597 /* VEX_W_0FFD_P_2 */
10598 { "vpaddw", { XM, Vex, EXx } },
10599 },
10600 {
10601 /* VEX_W_0FFE_P_2 */
10602 { "vpaddd", { XM, Vex, EXx } },
10603 },
10604 {
10605 /* VEX_W_0F3800_P_2 */
10606 { "vpshufb", { XM, Vex, EXx } },
10607 },
10608 {
10609 /* VEX_W_0F3801_P_2 */
10610 { "vphaddw", { XM, Vex, EXx } },
10611 },
10612 {
10613 /* VEX_W_0F3802_P_2 */
10614 { "vphaddd", { XM, Vex, EXx } },
10615 },
10616 {
10617 /* VEX_W_0F3803_P_2 */
10618 { "vphaddsw", { XM, Vex, EXx } },
10619 },
10620 {
10621 /* VEX_W_0F3804_P_2 */
10622 { "vpmaddubsw", { XM, Vex, EXx } },
10623 },
10624 {
10625 /* VEX_W_0F3805_P_2 */
10626 { "vphsubw", { XM, Vex, EXx } },
10627 },
10628 {
10629 /* VEX_W_0F3806_P_2 */
10630 { "vphsubd", { XM, Vex, EXx } },
10631 },
10632 {
10633 /* VEX_W_0F3807_P_2 */
10634 { "vphsubsw", { XM, Vex, EXx } },
10635 },
10636 {
10637 /* VEX_W_0F3808_P_2 */
10638 { "vpsignb", { XM, Vex, EXx } },
10639 },
10640 {
10641 /* VEX_W_0F3809_P_2 */
10642 { "vpsignw", { XM, Vex, EXx } },
10643 },
10644 {
10645 /* VEX_W_0F380A_P_2 */
10646 { "vpsignd", { XM, Vex, EXx } },
10647 },
10648 {
10649 /* VEX_W_0F380B_P_2 */
10650 { "vpmulhrsw", { XM, Vex, EXx } },
10651 },
10652 {
10653 /* VEX_W_0F380C_P_2 */
10654 { "vpermilps", { XM, Vex, EXx } },
10655 },
10656 {
10657 /* VEX_W_0F380D_P_2 */
10658 { "vpermilpd", { XM, Vex, EXx } },
10659 },
10660 {
10661 /* VEX_W_0F380E_P_2 */
10662 { "vtestps", { XM, EXx } },
10663 },
10664 {
10665 /* VEX_W_0F380F_P_2 */
10666 { "vtestpd", { XM, EXx } },
10667 },
10668 {
10669 /* VEX_W_0F3816_P_2 */
10670 { "vpermps", { XM, Vex, EXx } },
10671 },
10672 {
10673 /* VEX_W_0F3817_P_2 */
10674 { "vptest", { XM, EXx } },
10675 },
10676 {
10677 /* VEX_W_0F3818_P_2 */
10678 { "vbroadcastss", { XM, EXxmm_md } },
10679 },
10680 {
10681 /* VEX_W_0F3819_P_2 */
10682 { "vbroadcastsd", { XM, EXxmm_mq } },
10683 },
10684 {
10685 /* VEX_W_0F381A_P_2_M_0 */
10686 { "vbroadcastf128", { XM, Mxmm } },
10687 },
10688 {
10689 /* VEX_W_0F381C_P_2 */
10690 { "vpabsb", { XM, EXx } },
10691 },
10692 {
10693 /* VEX_W_0F381D_P_2 */
10694 { "vpabsw", { XM, EXx } },
10695 },
10696 {
10697 /* VEX_W_0F381E_P_2 */
10698 { "vpabsd", { XM, EXx } },
10699 },
10700 {
10701 /* VEX_W_0F3820_P_2 */
10702 { "vpmovsxbw", { XM, EXxmmq } },
10703 },
10704 {
10705 /* VEX_W_0F3821_P_2 */
10706 { "vpmovsxbd", { XM, EXxmmqd } },
10707 },
10708 {
10709 /* VEX_W_0F3822_P_2 */
10710 { "vpmovsxbq", { XM, EXxmmdw } },
10711 },
10712 {
10713 /* VEX_W_0F3823_P_2 */
10714 { "vpmovsxwd", { XM, EXxmmq } },
10715 },
10716 {
10717 /* VEX_W_0F3824_P_2 */
10718 { "vpmovsxwq", { XM, EXxmmqd } },
10719 },
10720 {
10721 /* VEX_W_0F3825_P_2 */
10722 { "vpmovsxdq", { XM, EXxmmq } },
10723 },
10724 {
10725 /* VEX_W_0F3828_P_2 */
10726 { "vpmuldq", { XM, Vex, EXx } },
10727 },
10728 {
10729 /* VEX_W_0F3829_P_2 */
10730 { "vpcmpeqq", { XM, Vex, EXx } },
10731 },
10732 {
10733 /* VEX_W_0F382A_P_2_M_0 */
10734 { "vmovntdqa", { XM, Mx } },
10735 },
10736 {
10737 /* VEX_W_0F382B_P_2 */
10738 { "vpackusdw", { XM, Vex, EXx } },
10739 },
10740 {
10741 /* VEX_W_0F382C_P_2_M_0 */
10742 { "vmaskmovps", { XM, Vex, Mx } },
10743 },
10744 {
10745 /* VEX_W_0F382D_P_2_M_0 */
10746 { "vmaskmovpd", { XM, Vex, Mx } },
10747 },
10748 {
10749 /* VEX_W_0F382E_P_2_M_0 */
10750 { "vmaskmovps", { Mx, Vex, XM } },
10751 },
10752 {
10753 /* VEX_W_0F382F_P_2_M_0 */
10754 { "vmaskmovpd", { Mx, Vex, XM } },
10755 },
10756 {
10757 /* VEX_W_0F3830_P_2 */
10758 { "vpmovzxbw", { XM, EXxmmq } },
10759 },
10760 {
10761 /* VEX_W_0F3831_P_2 */
10762 { "vpmovzxbd", { XM, EXxmmqd } },
10763 },
10764 {
10765 /* VEX_W_0F3832_P_2 */
10766 { "vpmovzxbq", { XM, EXxmmdw } },
10767 },
10768 {
10769 /* VEX_W_0F3833_P_2 */
10770 { "vpmovzxwd", { XM, EXxmmq } },
10771 },
10772 {
10773 /* VEX_W_0F3834_P_2 */
10774 { "vpmovzxwq", { XM, EXxmmqd } },
10775 },
10776 {
10777 /* VEX_W_0F3835_P_2 */
10778 { "vpmovzxdq", { XM, EXxmmq } },
10779 },
10780 {
10781 /* VEX_W_0F3836_P_2 */
10782 { "vpermd", { XM, Vex, EXx } },
10783 },
10784 {
10785 /* VEX_W_0F3837_P_2 */
10786 { "vpcmpgtq", { XM, Vex, EXx } },
10787 },
10788 {
10789 /* VEX_W_0F3838_P_2 */
10790 { "vpminsb", { XM, Vex, EXx } },
10791 },
10792 {
10793 /* VEX_W_0F3839_P_2 */
10794 { "vpminsd", { XM, Vex, EXx } },
10795 },
10796 {
10797 /* VEX_W_0F383A_P_2 */
10798 { "vpminuw", { XM, Vex, EXx } },
10799 },
10800 {
10801 /* VEX_W_0F383B_P_2 */
10802 { "vpminud", { XM, Vex, EXx } },
10803 },
10804 {
10805 /* VEX_W_0F383C_P_2 */
10806 { "vpmaxsb", { XM, Vex, EXx } },
10807 },
10808 {
10809 /* VEX_W_0F383D_P_2 */
10810 { "vpmaxsd", { XM, Vex, EXx } },
10811 },
10812 {
10813 /* VEX_W_0F383E_P_2 */
10814 { "vpmaxuw", { XM, Vex, EXx } },
10815 },
10816 {
10817 /* VEX_W_0F383F_P_2 */
10818 { "vpmaxud", { XM, Vex, EXx } },
10819 },
10820 {
10821 /* VEX_W_0F3840_P_2 */
10822 { "vpmulld", { XM, Vex, EXx } },
10823 },
10824 {
10825 /* VEX_W_0F3841_P_2 */
10826 { "vphminposuw", { XM, EXx } },
10827 },
10828 {
10829 /* VEX_W_0F3846_P_2 */
10830 { "vpsravd", { XM, Vex, EXx } },
10831 },
10832 {
10833 /* VEX_W_0F3858_P_2 */
10834 { "vpbroadcastd", { XM, EXxmm_md } },
10835 },
10836 {
10837 /* VEX_W_0F3859_P_2 */
10838 { "vpbroadcastq", { XM, EXxmm_mq } },
10839 },
10840 {
10841 /* VEX_W_0F385A_P_2_M_0 */
10842 { "vbroadcasti128", { XM, Mxmm } },
10843 },
10844 {
10845 /* VEX_W_0F3878_P_2 */
10846 { "vpbroadcastb", { XM, EXxmm_mb } },
10847 },
10848 {
10849 /* VEX_W_0F3879_P_2 */
10850 { "vpbroadcastw", { XM, EXxmm_mw } },
10851 },
10852 {
10853 /* VEX_W_0F38DB_P_2 */
10854 { "vaesimc", { XM, EXx } },
10855 },
10856 {
10857 /* VEX_W_0F38DC_P_2 */
10858 { "vaesenc", { XM, Vex128, EXx } },
10859 },
10860 {
10861 /* VEX_W_0F38DD_P_2 */
10862 { "vaesenclast", { XM, Vex128, EXx } },
10863 },
10864 {
10865 /* VEX_W_0F38DE_P_2 */
10866 { "vaesdec", { XM, Vex128, EXx } },
10867 },
10868 {
10869 /* VEX_W_0F38DF_P_2 */
10870 { "vaesdeclast", { XM, Vex128, EXx } },
10871 },
10872 {
10873 /* VEX_W_0F3A00_P_2 */
10874 { Bad_Opcode },
10875 { "vpermq", { XM, EXx, Ib } },
10876 },
10877 {
10878 /* VEX_W_0F3A01_P_2 */
10879 { Bad_Opcode },
10880 { "vpermpd", { XM, EXx, Ib } },
10881 },
10882 {
10883 /* VEX_W_0F3A02_P_2 */
10884 { "vpblendd", { XM, Vex, EXx, Ib } },
10885 },
10886 {
10887 /* VEX_W_0F3A04_P_2 */
10888 { "vpermilps", { XM, EXx, Ib } },
10889 },
10890 {
10891 /* VEX_W_0F3A05_P_2 */
10892 { "vpermilpd", { XM, EXx, Ib } },
10893 },
10894 {
10895 /* VEX_W_0F3A06_P_2 */
10896 { "vperm2f128", { XM, Vex256, EXx, Ib } },
10897 },
10898 {
10899 /* VEX_W_0F3A08_P_2 */
10900 { "vroundps", { XM, EXx, Ib } },
10901 },
10902 {
10903 /* VEX_W_0F3A09_P_2 */
10904 { "vroundpd", { XM, EXx, Ib } },
10905 },
10906 {
10907 /* VEX_W_0F3A0A_P_2 */
10908 { "vroundss", { XMScalar, VexScalar, EXdScalar, Ib } },
10909 },
10910 {
10911 /* VEX_W_0F3A0B_P_2 */
10912 { "vroundsd", { XMScalar, VexScalar, EXqScalar, Ib } },
10913 },
10914 {
10915 /* VEX_W_0F3A0C_P_2 */
10916 { "vblendps", { XM, Vex, EXx, Ib } },
10917 },
10918 {
10919 /* VEX_W_0F3A0D_P_2 */
10920 { "vblendpd", { XM, Vex, EXx, Ib } },
10921 },
10922 {
10923 /* VEX_W_0F3A0E_P_2 */
10924 { "vpblendw", { XM, Vex, EXx, Ib } },
10925 },
10926 {
10927 /* VEX_W_0F3A0F_P_2 */
10928 { "vpalignr", { XM, Vex, EXx, Ib } },
10929 },
10930 {
10931 /* VEX_W_0F3A14_P_2 */
10932 { "vpextrb", { Edqb, XM, Ib } },
10933 },
10934 {
10935 /* VEX_W_0F3A15_P_2 */
10936 { "vpextrw", { Edqw, XM, Ib } },
10937 },
10938 {
10939 /* VEX_W_0F3A18_P_2 */
10940 { "vinsertf128", { XM, Vex256, EXxmm, Ib } },
10941 },
10942 {
10943 /* VEX_W_0F3A19_P_2 */
10944 { "vextractf128", { EXxmm, XM, Ib } },
10945 },
10946 {
10947 /* VEX_W_0F3A20_P_2 */
10948 { "vpinsrb", { XM, Vex128, Edqb, Ib } },
10949 },
10950 {
10951 /* VEX_W_0F3A21_P_2 */
10952 { "vinsertps", { XM, Vex128, EXd, Ib } },
10953 },
10954 {
10955 /* VEX_W_0F3A30_P_2 */
10956 { Bad_Opcode },
10957 { "kshiftrw", { MaskG, MaskR, Ib } },
10958 },
10959 {
10960 /* VEX_W_0F3A32_P_2 */
10961 { Bad_Opcode },
10962 { "kshiftlw", { MaskG, MaskR, Ib } },
10963 },
10964 {
10965 /* VEX_W_0F3A38_P_2 */
10966 { "vinserti128", { XM, Vex256, EXxmm, Ib } },
10967 },
10968 {
10969 /* VEX_W_0F3A39_P_2 */
10970 { "vextracti128", { EXxmm, XM, Ib } },
10971 },
10972 {
10973 /* VEX_W_0F3A40_P_2 */
10974 { "vdpps", { XM, Vex, EXx, Ib } },
10975 },
10976 {
10977 /* VEX_W_0F3A41_P_2 */
10978 { "vdppd", { XM, Vex128, EXx, Ib } },
10979 },
10980 {
10981 /* VEX_W_0F3A42_P_2 */
10982 { "vmpsadbw", { XM, Vex, EXx, Ib } },
10983 },
10984 {
10985 /* VEX_W_0F3A44_P_2 */
10986 { "vpclmulqdq", { XM, Vex128, EXx, PCLMUL } },
10987 },
10988 {
10989 /* VEX_W_0F3A46_P_2 */
10990 { "vperm2i128", { XM, Vex256, EXx, Ib } },
10991 },
10992 {
10993 /* VEX_W_0F3A48_P_2 */
10994 { "vpermil2ps", { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW } },
10995 { "vpermil2ps", { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW } },
10996 },
10997 {
10998 /* VEX_W_0F3A49_P_2 */
10999 { "vpermil2pd", { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW } },
11000 { "vpermil2pd", { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW } },
11001 },
11002 {
11003 /* VEX_W_0F3A4A_P_2 */
11004 { "vblendvps", { XM, Vex, EXx, XMVexI4 } },
11005 },
11006 {
11007 /* VEX_W_0F3A4B_P_2 */
11008 { "vblendvpd", { XM, Vex, EXx, XMVexI4 } },
11009 },
11010 {
11011 /* VEX_W_0F3A4C_P_2 */
11012 { "vpblendvb", { XM, Vex, EXx, XMVexI4 } },
11013 },
11014 {
11015 /* VEX_W_0F3A60_P_2 */
11016 { "vpcmpestrm", { XM, EXx, Ib } },
11017 },
11018 {
11019 /* VEX_W_0F3A61_P_2 */
11020 { "vpcmpestri", { XM, EXx, Ib } },
11021 },
11022 {
11023 /* VEX_W_0F3A62_P_2 */
11024 { "vpcmpistrm", { XM, EXx, Ib } },
11025 },
11026 {
11027 /* VEX_W_0F3A63_P_2 */
11028 { "vpcmpistri", { XM, EXx, Ib } },
11029 },
11030 {
11031 /* VEX_W_0F3ADF_P_2 */
11032 { "vaeskeygenassist", { XM, EXx, Ib } },
11033 },
11034 #define NEED_VEX_W_TABLE
11035 #include "i386-dis-evex.h"
11036 #undef NEED_VEX_W_TABLE
11037 };
11038
11039 static const struct dis386 mod_table[][2] = {
11040 {
11041 /* MOD_8D */
11042 { "leaS", { Gv, M } },
11043 },
11044 {
11045 /* MOD_C6_REG_7 */
11046 { Bad_Opcode },
11047 { RM_TABLE (RM_C6_REG_7) },
11048 },
11049 {
11050 /* MOD_C7_REG_7 */
11051 { Bad_Opcode },
11052 { RM_TABLE (RM_C7_REG_7) },
11053 },
11054 {
11055 /* MOD_FF_REG_3 */
11056 { "Jcall{T|}", { indirEp } },
11057 },
11058 {
11059 /* MOD_FF_REG_5 */
11060 { "Jjmp{T|}", { indirEp } },
11061 },
11062 {
11063 /* MOD_0F01_REG_0 */
11064 { X86_64_TABLE (X86_64_0F01_REG_0) },
11065 { RM_TABLE (RM_0F01_REG_0) },
11066 },
11067 {
11068 /* MOD_0F01_REG_1 */
11069 { X86_64_TABLE (X86_64_0F01_REG_1) },
11070 { RM_TABLE (RM_0F01_REG_1) },
11071 },
11072 {
11073 /* MOD_0F01_REG_2 */
11074 { X86_64_TABLE (X86_64_0F01_REG_2) },
11075 { RM_TABLE (RM_0F01_REG_2) },
11076 },
11077 {
11078 /* MOD_0F01_REG_3 */
11079 { X86_64_TABLE (X86_64_0F01_REG_3) },
11080 { RM_TABLE (RM_0F01_REG_3) },
11081 },
11082 {
11083 /* MOD_0F01_REG_7 */
11084 { "invlpg", { Mb } },
11085 { RM_TABLE (RM_0F01_REG_7) },
11086 },
11087 {
11088 /* MOD_0F12_PREFIX_0 */
11089 { "movlps", { XM, EXq } },
11090 { "movhlps", { XM, EXq } },
11091 },
11092 {
11093 /* MOD_0F13 */
11094 { "movlpX", { EXq, XM } },
11095 },
11096 {
11097 /* MOD_0F16_PREFIX_0 */
11098 { "movhps", { XM, EXq } },
11099 { "movlhps", { XM, EXq } },
11100 },
11101 {
11102 /* MOD_0F17 */
11103 { "movhpX", { EXq, XM } },
11104 },
11105 {
11106 /* MOD_0F18_REG_0 */
11107 { "prefetchnta", { Mb } },
11108 },
11109 {
11110 /* MOD_0F18_REG_1 */
11111 { "prefetcht0", { Mb } },
11112 },
11113 {
11114 /* MOD_0F18_REG_2 */
11115 { "prefetcht1", { Mb } },
11116 },
11117 {
11118 /* MOD_0F18_REG_3 */
11119 { "prefetcht2", { Mb } },
11120 },
11121 {
11122 /* MOD_0F18_REG_4 */
11123 { "nop/reserved", { Mb } },
11124 },
11125 {
11126 /* MOD_0F18_REG_5 */
11127 { "nop/reserved", { Mb } },
11128 },
11129 {
11130 /* MOD_0F18_REG_6 */
11131 { "nop/reserved", { Mb } },
11132 },
11133 {
11134 /* MOD_0F18_REG_7 */
11135 { "nop/reserved", { Mb } },
11136 },
11137 {
11138 /* MOD_0F1A_PREFIX_0 */
11139 { "bndldx", { Gbnd, Ev_bnd } },
11140 { "nopQ", { Ev } },
11141 },
11142 {
11143 /* MOD_0F1B_PREFIX_0 */
11144 { "bndstx", { Ev_bnd, Gbnd } },
11145 { "nopQ", { Ev } },
11146 },
11147 {
11148 /* MOD_0F1B_PREFIX_1 */
11149 { "bndmk", { Gbnd, Ev_bnd } },
11150 { "nopQ", { Ev } },
11151 },
11152 {
11153 /* MOD_0F20 */
11154 { Bad_Opcode },
11155 { "movZ", { Rm, Cm } },
11156 },
11157 {
11158 /* MOD_0F21 */
11159 { Bad_Opcode },
11160 { "movZ", { Rm, Dm } },
11161 },
11162 {
11163 /* MOD_0F22 */
11164 { Bad_Opcode },
11165 { "movZ", { Cm, Rm } },
11166 },
11167 {
11168 /* MOD_0F23 */
11169 { Bad_Opcode },
11170 { "movZ", { Dm, Rm } },
11171 },
11172 {
11173 /* MOD_0F24 */
11174 { Bad_Opcode },
11175 { "movL", { Rd, Td } },
11176 },
11177 {
11178 /* MOD_0F26 */
11179 { Bad_Opcode },
11180 { "movL", { Td, Rd } },
11181 },
11182 {
11183 /* MOD_0F2B_PREFIX_0 */
11184 {"movntps", { Mx, XM } },
11185 },
11186 {
11187 /* MOD_0F2B_PREFIX_1 */
11188 {"movntss", { Md, XM } },
11189 },
11190 {
11191 /* MOD_0F2B_PREFIX_2 */
11192 {"movntpd", { Mx, XM } },
11193 },
11194 {
11195 /* MOD_0F2B_PREFIX_3 */
11196 {"movntsd", { Mq, XM } },
11197 },
11198 {
11199 /* MOD_0F51 */
11200 { Bad_Opcode },
11201 { "movmskpX", { Gdq, XS } },
11202 },
11203 {
11204 /* MOD_0F71_REG_2 */
11205 { Bad_Opcode },
11206 { "psrlw", { MS, Ib } },
11207 },
11208 {
11209 /* MOD_0F71_REG_4 */
11210 { Bad_Opcode },
11211 { "psraw", { MS, Ib } },
11212 },
11213 {
11214 /* MOD_0F71_REG_6 */
11215 { Bad_Opcode },
11216 { "psllw", { MS, Ib } },
11217 },
11218 {
11219 /* MOD_0F72_REG_2 */
11220 { Bad_Opcode },
11221 { "psrld", { MS, Ib } },
11222 },
11223 {
11224 /* MOD_0F72_REG_4 */
11225 { Bad_Opcode },
11226 { "psrad", { MS, Ib } },
11227 },
11228 {
11229 /* MOD_0F72_REG_6 */
11230 { Bad_Opcode },
11231 { "pslld", { MS, Ib } },
11232 },
11233 {
11234 /* MOD_0F73_REG_2 */
11235 { Bad_Opcode },
11236 { "psrlq", { MS, Ib } },
11237 },
11238 {
11239 /* MOD_0F73_REG_3 */
11240 { Bad_Opcode },
11241 { PREFIX_TABLE (PREFIX_0F73_REG_3) },
11242 },
11243 {
11244 /* MOD_0F73_REG_6 */
11245 { Bad_Opcode },
11246 { "psllq", { MS, Ib } },
11247 },
11248 {
11249 /* MOD_0F73_REG_7 */
11250 { Bad_Opcode },
11251 { PREFIX_TABLE (PREFIX_0F73_REG_7) },
11252 },
11253 {
11254 /* MOD_0FAE_REG_0 */
11255 { "fxsave", { FXSAVE } },
11256 { PREFIX_TABLE (PREFIX_0FAE_REG_0) },
11257 },
11258 {
11259 /* MOD_0FAE_REG_1 */
11260 { "fxrstor", { FXSAVE } },
11261 { PREFIX_TABLE (PREFIX_0FAE_REG_1) },
11262 },
11263 {
11264 /* MOD_0FAE_REG_2 */
11265 { "ldmxcsr", { Md } },
11266 { PREFIX_TABLE (PREFIX_0FAE_REG_2) },
11267 },
11268 {
11269 /* MOD_0FAE_REG_3 */
11270 { "stmxcsr", { Md } },
11271 { PREFIX_TABLE (PREFIX_0FAE_REG_3) },
11272 },
11273 {
11274 /* MOD_0FAE_REG_4 */
11275 { "xsave", { FXSAVE } },
11276 },
11277 {
11278 /* MOD_0FAE_REG_5 */
11279 { "xrstor", { FXSAVE } },
11280 { RM_TABLE (RM_0FAE_REG_5) },
11281 },
11282 {
11283 /* MOD_0FAE_REG_6 */
11284 { "xsaveopt", { FXSAVE } },
11285 { RM_TABLE (RM_0FAE_REG_6) },
11286 },
11287 {
11288 /* MOD_0FAE_REG_7 */
11289 { "clflush", { Mb } },
11290 { RM_TABLE (RM_0FAE_REG_7) },
11291 },
11292 {
11293 /* MOD_0FB2 */
11294 { "lssS", { Gv, Mp } },
11295 },
11296 {
11297 /* MOD_0FB4 */
11298 { "lfsS", { Gv, Mp } },
11299 },
11300 {
11301 /* MOD_0FB5 */
11302 { "lgsS", { Gv, Mp } },
11303 },
11304 {
11305 /* MOD_0FC7_REG_6 */
11306 { PREFIX_TABLE (PREFIX_0FC7_REG_6) },
11307 { "rdrand", { Ev } },
11308 },
11309 {
11310 /* MOD_0FC7_REG_7 */
11311 { "vmptrst", { Mq } },
11312 { "rdseed", { Ev } },
11313 },
11314 {
11315 /* MOD_0FD7 */
11316 { Bad_Opcode },
11317 { "pmovmskb", { Gdq, MS } },
11318 },
11319 {
11320 /* MOD_0FE7_PREFIX_2 */
11321 { "movntdq", { Mx, XM } },
11322 },
11323 {
11324 /* MOD_0FF0_PREFIX_3 */
11325 { "lddqu", { XM, M } },
11326 },
11327 {
11328 /* MOD_0F382A_PREFIX_2 */
11329 { "movntdqa", { XM, Mx } },
11330 },
11331 {
11332 /* MOD_62_32BIT */
11333 { "bound{S|}", { Gv, Ma } },
11334 { EVEX_TABLE (EVEX_0F) },
11335 },
11336 {
11337 /* MOD_C4_32BIT */
11338 { "lesS", { Gv, Mp } },
11339 { VEX_C4_TABLE (VEX_0F) },
11340 },
11341 {
11342 /* MOD_C5_32BIT */
11343 { "ldsS", { Gv, Mp } },
11344 { VEX_C5_TABLE (VEX_0F) },
11345 },
11346 {
11347 /* MOD_VEX_0F12_PREFIX_0 */
11348 { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_0) },
11349 { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_1) },
11350 },
11351 {
11352 /* MOD_VEX_0F13 */
11353 { VEX_LEN_TABLE (VEX_LEN_0F13_M_0) },
11354 },
11355 {
11356 /* MOD_VEX_0F16_PREFIX_0 */
11357 { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_0) },
11358 { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_1) },
11359 },
11360 {
11361 /* MOD_VEX_0F17 */
11362 { VEX_LEN_TABLE (VEX_LEN_0F17_M_0) },
11363 },
11364 {
11365 /* MOD_VEX_0F2B */
11366 { VEX_W_TABLE (VEX_W_0F2B_M_0) },
11367 },
11368 {
11369 /* MOD_VEX_0F50 */
11370 { Bad_Opcode },
11371 { VEX_W_TABLE (VEX_W_0F50_M_0) },
11372 },
11373 {
11374 /* MOD_VEX_0F71_REG_2 */
11375 { Bad_Opcode },
11376 { PREFIX_TABLE (PREFIX_VEX_0F71_REG_2) },
11377 },
11378 {
11379 /* MOD_VEX_0F71_REG_4 */
11380 { Bad_Opcode },
11381 { PREFIX_TABLE (PREFIX_VEX_0F71_REG_4) },
11382 },
11383 {
11384 /* MOD_VEX_0F71_REG_6 */
11385 { Bad_Opcode },
11386 { PREFIX_TABLE (PREFIX_VEX_0F71_REG_6) },
11387 },
11388 {
11389 /* MOD_VEX_0F72_REG_2 */
11390 { Bad_Opcode },
11391 { PREFIX_TABLE (PREFIX_VEX_0F72_REG_2) },
11392 },
11393 {
11394 /* MOD_VEX_0F72_REG_4 */
11395 { Bad_Opcode },
11396 { PREFIX_TABLE (PREFIX_VEX_0F72_REG_4) },
11397 },
11398 {
11399 /* MOD_VEX_0F72_REG_6 */
11400 { Bad_Opcode },
11401 { PREFIX_TABLE (PREFIX_VEX_0F72_REG_6) },
11402 },
11403 {
11404 /* MOD_VEX_0F73_REG_2 */
11405 { Bad_Opcode },
11406 { PREFIX_TABLE (PREFIX_VEX_0F73_REG_2) },
11407 },
11408 {
11409 /* MOD_VEX_0F73_REG_3 */
11410 { Bad_Opcode },
11411 { PREFIX_TABLE (PREFIX_VEX_0F73_REG_3) },
11412 },
11413 {
11414 /* MOD_VEX_0F73_REG_6 */
11415 { Bad_Opcode },
11416 { PREFIX_TABLE (PREFIX_VEX_0F73_REG_6) },
11417 },
11418 {
11419 /* MOD_VEX_0F73_REG_7 */
11420 { Bad_Opcode },
11421 { PREFIX_TABLE (PREFIX_VEX_0F73_REG_7) },
11422 },
11423 {
11424 /* MOD_VEX_0FAE_REG_2 */
11425 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_2_M_0) },
11426 },
11427 {
11428 /* MOD_VEX_0FAE_REG_3 */
11429 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_3_M_0) },
11430 },
11431 {
11432 /* MOD_VEX_0FD7_PREFIX_2 */
11433 { Bad_Opcode },
11434 { VEX_W_TABLE (VEX_W_0FD7_P_2_M_1) },
11435 },
11436 {
11437 /* MOD_VEX_0FE7_PREFIX_2 */
11438 { VEX_W_TABLE (VEX_W_0FE7_P_2_M_0) },
11439 },
11440 {
11441 /* MOD_VEX_0FF0_PREFIX_3 */
11442 { VEX_W_TABLE (VEX_W_0FF0_P_3_M_0) },
11443 },
11444 {
11445 /* MOD_VEX_0F381A_PREFIX_2 */
11446 { VEX_LEN_TABLE (VEX_LEN_0F381A_P_2_M_0) },
11447 },
11448 {
11449 /* MOD_VEX_0F382A_PREFIX_2 */
11450 { VEX_W_TABLE (VEX_W_0F382A_P_2_M_0) },
11451 },
11452 {
11453 /* MOD_VEX_0F382C_PREFIX_2 */
11454 { VEX_W_TABLE (VEX_W_0F382C_P_2_M_0) },
11455 },
11456 {
11457 /* MOD_VEX_0F382D_PREFIX_2 */
11458 { VEX_W_TABLE (VEX_W_0F382D_P_2_M_0) },
11459 },
11460 {
11461 /* MOD_VEX_0F382E_PREFIX_2 */
11462 { VEX_W_TABLE (VEX_W_0F382E_P_2_M_0) },
11463 },
11464 {
11465 /* MOD_VEX_0F382F_PREFIX_2 */
11466 { VEX_W_TABLE (VEX_W_0F382F_P_2_M_0) },
11467 },
11468 {
11469 /* MOD_VEX_0F385A_PREFIX_2 */
11470 { VEX_LEN_TABLE (VEX_LEN_0F385A_P_2_M_0) },
11471 },
11472 {
11473 /* MOD_VEX_0F388C_PREFIX_2 */
11474 { "vpmaskmov%LW", { XM, Vex, Mx } },
11475 },
11476 {
11477 /* MOD_VEX_0F388E_PREFIX_2 */
11478 { "vpmaskmov%LW", { Mx, Vex, XM } },
11479 },
11480 #define NEED_MOD_TABLE
11481 #include "i386-dis-evex.h"
11482 #undef NEED_MOD_TABLE
11483 };
11484
11485 static const struct dis386 rm_table[][8] = {
11486 {
11487 /* RM_C6_REG_7 */
11488 { "xabort", { Skip_MODRM, Ib } },
11489 },
11490 {
11491 /* RM_C7_REG_7 */
11492 { "xbeginT", { Skip_MODRM, Jv } },
11493 },
11494 {
11495 /* RM_0F01_REG_0 */
11496 { Bad_Opcode },
11497 { "vmcall", { Skip_MODRM } },
11498 { "vmlaunch", { Skip_MODRM } },
11499 { "vmresume", { Skip_MODRM } },
11500 { "vmxoff", { Skip_MODRM } },
11501 },
11502 {
11503 /* RM_0F01_REG_1 */
11504 { "monitor", { { OP_Monitor, 0 } } },
11505 { "mwait", { { OP_Mwait, 0 } } },
11506 { "clac", { Skip_MODRM } },
11507 { "stac", { Skip_MODRM } },
11508 },
11509 {
11510 /* RM_0F01_REG_2 */
11511 { "xgetbv", { Skip_MODRM } },
11512 { "xsetbv", { Skip_MODRM } },
11513 { Bad_Opcode },
11514 { Bad_Opcode },
11515 { "vmfunc", { Skip_MODRM } },
11516 { "xend", { Skip_MODRM } },
11517 { "xtest", { Skip_MODRM } },
11518 { Bad_Opcode },
11519 },
11520 {
11521 /* RM_0F01_REG_3 */
11522 { "vmrun", { Skip_MODRM } },
11523 { "vmmcall", { Skip_MODRM } },
11524 { "vmload", { Skip_MODRM } },
11525 { "vmsave", { Skip_MODRM } },
11526 { "stgi", { Skip_MODRM } },
11527 { "clgi", { Skip_MODRM } },
11528 { "skinit", { Skip_MODRM } },
11529 { "invlpga", { Skip_MODRM } },
11530 },
11531 {
11532 /* RM_0F01_REG_7 */
11533 { "swapgs", { Skip_MODRM } },
11534 { "rdtscp", { Skip_MODRM } },
11535 },
11536 {
11537 /* RM_0FAE_REG_5 */
11538 { "lfence", { Skip_MODRM } },
11539 },
11540 {
11541 /* RM_0FAE_REG_6 */
11542 { "mfence", { Skip_MODRM } },
11543 },
11544 {
11545 /* RM_0FAE_REG_7 */
11546 { "sfence", { Skip_MODRM } },
11547 },
11548 };
11549
11550 #define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
11551
11552 /* We use the high bit to indicate different name for the same
11553 prefix. */
11554 #define ADDR16_PREFIX (0x67 | 0x100)
11555 #define ADDR32_PREFIX (0x67 | 0x200)
11556 #define DATA16_PREFIX (0x66 | 0x100)
11557 #define DATA32_PREFIX (0x66 | 0x200)
11558 #define REP_PREFIX (0xf3 | 0x100)
11559 #define XACQUIRE_PREFIX (0xf2 | 0x200)
11560 #define XRELEASE_PREFIX (0xf3 | 0x400)
11561 #define BND_PREFIX (0xf2 | 0x400)
11562
11563 static int
11564 ckprefix (void)
11565 {
11566 int newrex, i, length;
11567 rex = 0;
11568 rex_ignored = 0;
11569 prefixes = 0;
11570 used_prefixes = 0;
11571 rex_used = 0;
11572 last_lock_prefix = -1;
11573 last_repz_prefix = -1;
11574 last_repnz_prefix = -1;
11575 last_data_prefix = -1;
11576 last_addr_prefix = -1;
11577 last_rex_prefix = -1;
11578 last_seg_prefix = -1;
11579 for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
11580 all_prefixes[i] = 0;
11581 i = 0;
11582 length = 0;
11583 /* The maximum instruction length is 15bytes. */
11584 while (length < MAX_CODE_LENGTH - 1)
11585 {
11586 FETCH_DATA (the_info, codep + 1);
11587 newrex = 0;
11588 switch (*codep)
11589 {
11590 /* REX prefixes family. */
11591 case 0x40:
11592 case 0x41:
11593 case 0x42:
11594 case 0x43:
11595 case 0x44:
11596 case 0x45:
11597 case 0x46:
11598 case 0x47:
11599 case 0x48:
11600 case 0x49:
11601 case 0x4a:
11602 case 0x4b:
11603 case 0x4c:
11604 case 0x4d:
11605 case 0x4e:
11606 case 0x4f:
11607 if (address_mode == mode_64bit)
11608 newrex = *codep;
11609 else
11610 return 1;
11611 last_rex_prefix = i;
11612 break;
11613 case 0xf3:
11614 prefixes |= PREFIX_REPZ;
11615 last_repz_prefix = i;
11616 break;
11617 case 0xf2:
11618 prefixes |= PREFIX_REPNZ;
11619 last_repnz_prefix = i;
11620 break;
11621 case 0xf0:
11622 prefixes |= PREFIX_LOCK;
11623 last_lock_prefix = i;
11624 break;
11625 case 0x2e:
11626 prefixes |= PREFIX_CS;
11627 last_seg_prefix = i;
11628 break;
11629 case 0x36:
11630 prefixes |= PREFIX_SS;
11631 last_seg_prefix = i;
11632 break;
11633 case 0x3e:
11634 prefixes |= PREFIX_DS;
11635 last_seg_prefix = i;
11636 break;
11637 case 0x26:
11638 prefixes |= PREFIX_ES;
11639 last_seg_prefix = i;
11640 break;
11641 case 0x64:
11642 prefixes |= PREFIX_FS;
11643 last_seg_prefix = i;
11644 break;
11645 case 0x65:
11646 prefixes |= PREFIX_GS;
11647 last_seg_prefix = i;
11648 break;
11649 case 0x66:
11650 prefixes |= PREFIX_DATA;
11651 last_data_prefix = i;
11652 break;
11653 case 0x67:
11654 prefixes |= PREFIX_ADDR;
11655 last_addr_prefix = i;
11656 break;
11657 case FWAIT_OPCODE:
11658 /* fwait is really an instruction. If there are prefixes
11659 before the fwait, they belong to the fwait, *not* to the
11660 following instruction. */
11661 if (prefixes || rex)
11662 {
11663 prefixes |= PREFIX_FWAIT;
11664 codep++;
11665 /* This ensures that the previous REX prefixes are noticed
11666 as unused prefixes, as in the return case below. */
11667 rex_used = rex;
11668 return 1;
11669 }
11670 prefixes = PREFIX_FWAIT;
11671 break;
11672 default:
11673 return 1;
11674 }
11675 /* Rex is ignored when followed by another prefix. */
11676 if (rex)
11677 {
11678 rex_used = rex;
11679 return 1;
11680 }
11681 if (*codep != FWAIT_OPCODE)
11682 all_prefixes[i++] = *codep;
11683 rex = newrex;
11684 codep++;
11685 length++;
11686 }
11687 return 0;
11688 }
11689
11690 static int
11691 seg_prefix (int pref)
11692 {
11693 switch (pref)
11694 {
11695 case 0x2e:
11696 return PREFIX_CS;
11697 case 0x36:
11698 return PREFIX_SS;
11699 case 0x3e:
11700 return PREFIX_DS;
11701 case 0x26:
11702 return PREFIX_ES;
11703 case 0x64:
11704 return PREFIX_FS;
11705 case 0x65:
11706 return PREFIX_GS;
11707 default:
11708 return 0;
11709 }
11710 }
11711
11712 /* Return the name of the prefix byte PREF, or NULL if PREF is not a
11713 prefix byte. */
11714
11715 static const char *
11716 prefix_name (int pref, int sizeflag)
11717 {
11718 static const char *rexes [16] =
11719 {
11720 "rex", /* 0x40 */
11721 "rex.B", /* 0x41 */
11722 "rex.X", /* 0x42 */
11723 "rex.XB", /* 0x43 */
11724 "rex.R", /* 0x44 */
11725 "rex.RB", /* 0x45 */
11726 "rex.RX", /* 0x46 */
11727 "rex.RXB", /* 0x47 */
11728 "rex.W", /* 0x48 */
11729 "rex.WB", /* 0x49 */
11730 "rex.WX", /* 0x4a */
11731 "rex.WXB", /* 0x4b */
11732 "rex.WR", /* 0x4c */
11733 "rex.WRB", /* 0x4d */
11734 "rex.WRX", /* 0x4e */
11735 "rex.WRXB", /* 0x4f */
11736 };
11737
11738 switch (pref)
11739 {
11740 /* REX prefixes family. */
11741 case 0x40:
11742 case 0x41:
11743 case 0x42:
11744 case 0x43:
11745 case 0x44:
11746 case 0x45:
11747 case 0x46:
11748 case 0x47:
11749 case 0x48:
11750 case 0x49:
11751 case 0x4a:
11752 case 0x4b:
11753 case 0x4c:
11754 case 0x4d:
11755 case 0x4e:
11756 case 0x4f:
11757 return rexes [pref - 0x40];
11758 case 0xf3:
11759 return "repz";
11760 case 0xf2:
11761 return "repnz";
11762 case 0xf0:
11763 return "lock";
11764 case 0x2e:
11765 return "cs";
11766 case 0x36:
11767 return "ss";
11768 case 0x3e:
11769 return "ds";
11770 case 0x26:
11771 return "es";
11772 case 0x64:
11773 return "fs";
11774 case 0x65:
11775 return "gs";
11776 case 0x66:
11777 return (sizeflag & DFLAG) ? "data16" : "data32";
11778 case 0x67:
11779 if (address_mode == mode_64bit)
11780 return (sizeflag & AFLAG) ? "addr32" : "addr64";
11781 else
11782 return (sizeflag & AFLAG) ? "addr16" : "addr32";
11783 case FWAIT_OPCODE:
11784 return "fwait";
11785 case ADDR16_PREFIX:
11786 return "addr16";
11787 case ADDR32_PREFIX:
11788 return "addr32";
11789 case DATA16_PREFIX:
11790 return "data16";
11791 case DATA32_PREFIX:
11792 return "data32";
11793 case REP_PREFIX:
11794 return "rep";
11795 case XACQUIRE_PREFIX:
11796 return "xacquire";
11797 case XRELEASE_PREFIX:
11798 return "xrelease";
11799 case BND_PREFIX:
11800 return "bnd";
11801 default:
11802 return NULL;
11803 }
11804 }
11805
11806 static char op_out[MAX_OPERANDS][100];
11807 static int op_ad, op_index[MAX_OPERANDS];
11808 static int two_source_ops;
11809 static bfd_vma op_address[MAX_OPERANDS];
11810 static bfd_vma op_riprel[MAX_OPERANDS];
11811 static bfd_vma start_pc;
11812
11813 /*
11814 * On the 386's of 1988, the maximum length of an instruction is 15 bytes.
11815 * (see topic "Redundant prefixes" in the "Differences from 8086"
11816 * section of the "Virtual 8086 Mode" chapter.)
11817 * 'pc' should be the address of this instruction, it will
11818 * be used to print the target address if this is a relative jump or call
11819 * The function returns the length of this instruction in bytes.
11820 */
11821
11822 static char intel_syntax;
11823 static char intel_mnemonic = !SYSV386_COMPAT;
11824 static char open_char;
11825 static char close_char;
11826 static char separator_char;
11827 static char scale_char;
11828
11829 /* Here for backwards compatibility. When gdb stops using
11830 print_insn_i386_att and print_insn_i386_intel these functions can
11831 disappear, and print_insn_i386 be merged into print_insn. */
11832 int
11833 print_insn_i386_att (bfd_vma pc, disassemble_info *info)
11834 {
11835 intel_syntax = 0;
11836
11837 return print_insn (pc, info);
11838 }
11839
11840 int
11841 print_insn_i386_intel (bfd_vma pc, disassemble_info *info)
11842 {
11843 intel_syntax = 1;
11844
11845 return print_insn (pc, info);
11846 }
11847
11848 int
11849 print_insn_i386 (bfd_vma pc, disassemble_info *info)
11850 {
11851 intel_syntax = -1;
11852
11853 return print_insn (pc, info);
11854 }
11855
11856 void
11857 print_i386_disassembler_options (FILE *stream)
11858 {
11859 fprintf (stream, _("\n\
11860 The following i386/x86-64 specific disassembler options are supported for use\n\
11861 with the -M switch (multiple options should be separated by commas):\n"));
11862
11863 fprintf (stream, _(" x86-64 Disassemble in 64bit mode\n"));
11864 fprintf (stream, _(" i386 Disassemble in 32bit mode\n"));
11865 fprintf (stream, _(" i8086 Disassemble in 16bit mode\n"));
11866 fprintf (stream, _(" att Display instruction in AT&T syntax\n"));
11867 fprintf (stream, _(" intel Display instruction in Intel syntax\n"));
11868 fprintf (stream, _(" att-mnemonic\n"
11869 " Display instruction in AT&T mnemonic\n"));
11870 fprintf (stream, _(" intel-mnemonic\n"
11871 " Display instruction in Intel mnemonic\n"));
11872 fprintf (stream, _(" addr64 Assume 64bit address size\n"));
11873 fprintf (stream, _(" addr32 Assume 32bit address size\n"));
11874 fprintf (stream, _(" addr16 Assume 16bit address size\n"));
11875 fprintf (stream, _(" data32 Assume 32bit data size\n"));
11876 fprintf (stream, _(" data16 Assume 16bit data size\n"));
11877 fprintf (stream, _(" suffix Always display instruction suffix in AT&T syntax\n"));
11878 }
11879
11880 /* Bad opcode. */
11881 static const struct dis386 bad_opcode = { "(bad)", { XX } };
11882
11883 /* Get a pointer to struct dis386 with a valid name. */
11884
11885 static const struct dis386 *
11886 get_valid_dis386 (const struct dis386 *dp, disassemble_info *info)
11887 {
11888 int vindex, vex_table_index;
11889
11890 if (dp->name != NULL)
11891 return dp;
11892
11893 switch (dp->op[0].bytemode)
11894 {
11895 case USE_REG_TABLE:
11896 dp = &reg_table[dp->op[1].bytemode][modrm.reg];
11897 break;
11898
11899 case USE_MOD_TABLE:
11900 vindex = modrm.mod == 0x3 ? 1 : 0;
11901 dp = &mod_table[dp->op[1].bytemode][vindex];
11902 break;
11903
11904 case USE_RM_TABLE:
11905 dp = &rm_table[dp->op[1].bytemode][modrm.rm];
11906 break;
11907
11908 case USE_PREFIX_TABLE:
11909 if (need_vex)
11910 {
11911 /* The prefix in VEX is implicit. */
11912 switch (vex.prefix)
11913 {
11914 case 0:
11915 vindex = 0;
11916 break;
11917 case REPE_PREFIX_OPCODE:
11918 vindex = 1;
11919 break;
11920 case DATA_PREFIX_OPCODE:
11921 vindex = 2;
11922 break;
11923 case REPNE_PREFIX_OPCODE:
11924 vindex = 3;
11925 break;
11926 default:
11927 abort ();
11928 break;
11929 }
11930 }
11931 else
11932 {
11933 vindex = 0;
11934 used_prefixes |= (prefixes & PREFIX_REPZ);
11935 if (prefixes & PREFIX_REPZ)
11936 {
11937 vindex = 1;
11938 all_prefixes[last_repz_prefix] = 0;
11939 }
11940 else
11941 {
11942 /* We should check PREFIX_REPNZ and PREFIX_REPZ before
11943 PREFIX_DATA. */
11944 used_prefixes |= (prefixes & PREFIX_REPNZ);
11945 if (prefixes & PREFIX_REPNZ)
11946 {
11947 vindex = 3;
11948 all_prefixes[last_repnz_prefix] = 0;
11949 }
11950 else
11951 {
11952 used_prefixes |= (prefixes & PREFIX_DATA);
11953 if (prefixes & PREFIX_DATA)
11954 {
11955 vindex = 2;
11956 all_prefixes[last_data_prefix] = 0;
11957 }
11958 }
11959 }
11960 }
11961 dp = &prefix_table[dp->op[1].bytemode][vindex];
11962 break;
11963
11964 case USE_X86_64_TABLE:
11965 vindex = address_mode == mode_64bit ? 1 : 0;
11966 dp = &x86_64_table[dp->op[1].bytemode][vindex];
11967 break;
11968
11969 case USE_3BYTE_TABLE:
11970 FETCH_DATA (info, codep + 2);
11971 vindex = *codep++;
11972 dp = &three_byte_table[dp->op[1].bytemode][vindex];
11973 modrm.mod = (*codep >> 6) & 3;
11974 modrm.reg = (*codep >> 3) & 7;
11975 modrm.rm = *codep & 7;
11976 break;
11977
11978 case USE_VEX_LEN_TABLE:
11979 if (!need_vex)
11980 abort ();
11981
11982 switch (vex.length)
11983 {
11984 case 128:
11985 vindex = 0;
11986 break;
11987 case 256:
11988 vindex = 1;
11989 break;
11990 default:
11991 abort ();
11992 break;
11993 }
11994
11995 dp = &vex_len_table[dp->op[1].bytemode][vindex];
11996 break;
11997
11998 case USE_XOP_8F_TABLE:
11999 FETCH_DATA (info, codep + 3);
12000 /* All bits in the REX prefix are ignored. */
12001 rex_ignored = rex;
12002 rex = ~(*codep >> 5) & 0x7;
12003
12004 /* VEX_TABLE_INDEX is the mmmmm part of the XOP byte 1 "RCB.mmmmm". */
12005 switch ((*codep & 0x1f))
12006 {
12007 default:
12008 dp = &bad_opcode;
12009 return dp;
12010 case 0x8:
12011 vex_table_index = XOP_08;
12012 break;
12013 case 0x9:
12014 vex_table_index = XOP_09;
12015 break;
12016 case 0xa:
12017 vex_table_index = XOP_0A;
12018 break;
12019 }
12020 codep++;
12021 vex.w = *codep & 0x80;
12022 if (vex.w && address_mode == mode_64bit)
12023 rex |= REX_W;
12024
12025 vex.register_specifier = (~(*codep >> 3)) & 0xf;
12026 if (address_mode != mode_64bit
12027 && vex.register_specifier > 0x7)
12028 {
12029 dp = &bad_opcode;
12030 return dp;
12031 }
12032
12033 vex.length = (*codep & 0x4) ? 256 : 128;
12034 switch ((*codep & 0x3))
12035 {
12036 case 0:
12037 vex.prefix = 0;
12038 break;
12039 case 1:
12040 vex.prefix = DATA_PREFIX_OPCODE;
12041 break;
12042 case 2:
12043 vex.prefix = REPE_PREFIX_OPCODE;
12044 break;
12045 case 3:
12046 vex.prefix = REPNE_PREFIX_OPCODE;
12047 break;
12048 }
12049 need_vex = 1;
12050 need_vex_reg = 1;
12051 codep++;
12052 vindex = *codep++;
12053 dp = &xop_table[vex_table_index][vindex];
12054
12055 FETCH_DATA (info, codep + 1);
12056 modrm.mod = (*codep >> 6) & 3;
12057 modrm.reg = (*codep >> 3) & 7;
12058 modrm.rm = *codep & 7;
12059 break;
12060
12061 case USE_VEX_C4_TABLE:
12062 /* VEX prefix. */
12063 FETCH_DATA (info, codep + 3);
12064 /* All bits in the REX prefix are ignored. */
12065 rex_ignored = rex;
12066 rex = ~(*codep >> 5) & 0x7;
12067 switch ((*codep & 0x1f))
12068 {
12069 default:
12070 dp = &bad_opcode;
12071 return dp;
12072 case 0x1:
12073 vex_table_index = VEX_0F;
12074 break;
12075 case 0x2:
12076 vex_table_index = VEX_0F38;
12077 break;
12078 case 0x3:
12079 vex_table_index = VEX_0F3A;
12080 break;
12081 }
12082 codep++;
12083 vex.w = *codep & 0x80;
12084 if (vex.w && address_mode == mode_64bit)
12085 rex |= REX_W;
12086
12087 vex.register_specifier = (~(*codep >> 3)) & 0xf;
12088 if (address_mode != mode_64bit
12089 && vex.register_specifier > 0x7)
12090 {
12091 dp = &bad_opcode;
12092 return dp;
12093 }
12094
12095 vex.length = (*codep & 0x4) ? 256 : 128;
12096 switch ((*codep & 0x3))
12097 {
12098 case 0:
12099 vex.prefix = 0;
12100 break;
12101 case 1:
12102 vex.prefix = DATA_PREFIX_OPCODE;
12103 break;
12104 case 2:
12105 vex.prefix = REPE_PREFIX_OPCODE;
12106 break;
12107 case 3:
12108 vex.prefix = REPNE_PREFIX_OPCODE;
12109 break;
12110 }
12111 need_vex = 1;
12112 need_vex_reg = 1;
12113 codep++;
12114 vindex = *codep++;
12115 dp = &vex_table[vex_table_index][vindex];
12116 /* There is no MODRM byte for VEX [82|77]. */
12117 if (vindex != 0x77 && vindex != 0x82)
12118 {
12119 FETCH_DATA (info, codep + 1);
12120 modrm.mod = (*codep >> 6) & 3;
12121 modrm.reg = (*codep >> 3) & 7;
12122 modrm.rm = *codep & 7;
12123 }
12124 break;
12125
12126 case USE_VEX_C5_TABLE:
12127 /* VEX prefix. */
12128 FETCH_DATA (info, codep + 2);
12129 /* All bits in the REX prefix are ignored. */
12130 rex_ignored = rex;
12131 rex = (*codep & 0x80) ? 0 : REX_R;
12132
12133 vex.register_specifier = (~(*codep >> 3)) & 0xf;
12134 if (address_mode != mode_64bit
12135 && vex.register_specifier > 0x7)
12136 {
12137 dp = &bad_opcode;
12138 return dp;
12139 }
12140
12141 vex.w = 0;
12142
12143 vex.length = (*codep & 0x4) ? 256 : 128;
12144 switch ((*codep & 0x3))
12145 {
12146 case 0:
12147 vex.prefix = 0;
12148 break;
12149 case 1:
12150 vex.prefix = DATA_PREFIX_OPCODE;
12151 break;
12152 case 2:
12153 vex.prefix = REPE_PREFIX_OPCODE;
12154 break;
12155 case 3:
12156 vex.prefix = REPNE_PREFIX_OPCODE;
12157 break;
12158 }
12159 need_vex = 1;
12160 need_vex_reg = 1;
12161 codep++;
12162 vindex = *codep++;
12163 dp = &vex_table[dp->op[1].bytemode][vindex];
12164 /* There is no MODRM byte for VEX [82|77]. */
12165 if (vindex != 0x77 && vindex != 0x82)
12166 {
12167 FETCH_DATA (info, codep + 1);
12168 modrm.mod = (*codep >> 6) & 3;
12169 modrm.reg = (*codep >> 3) & 7;
12170 modrm.rm = *codep & 7;
12171 }
12172 break;
12173
12174 case USE_VEX_W_TABLE:
12175 if (!need_vex)
12176 abort ();
12177
12178 dp = &vex_w_table[dp->op[1].bytemode][vex.w ? 1 : 0];
12179 break;
12180
12181 case USE_EVEX_TABLE:
12182 two_source_ops = 0;
12183 /* EVEX prefix. */
12184 vex.evex = 1;
12185 FETCH_DATA (info, codep + 4);
12186 /* All bits in the REX prefix are ignored. */
12187 rex_ignored = rex;
12188 /* The first byte after 0x62. */
12189 rex = ~(*codep >> 5) & 0x7;
12190 vex.r = *codep & 0x10;
12191 switch ((*codep & 0xf))
12192 {
12193 default:
12194 return &bad_opcode;
12195 case 0x1:
12196 vex_table_index = EVEX_0F;
12197 break;
12198 case 0x2:
12199 vex_table_index = EVEX_0F38;
12200 break;
12201 case 0x3:
12202 vex_table_index = EVEX_0F3A;
12203 break;
12204 }
12205
12206 /* The second byte after 0x62. */
12207 codep++;
12208 vex.w = *codep & 0x80;
12209 if (vex.w && address_mode == mode_64bit)
12210 rex |= REX_W;
12211
12212 vex.register_specifier = (~(*codep >> 3)) & 0xf;
12213 if (address_mode != mode_64bit)
12214 {
12215 /* In 16/32-bit mode silently ignore following bits. */
12216 rex &= ~REX_B;
12217 vex.r = 1;
12218 vex.v = 1;
12219 vex.register_specifier &= 0x7;
12220 }
12221
12222 /* The U bit. */
12223 if (!(*codep & 0x4))
12224 return &bad_opcode;
12225
12226 switch ((*codep & 0x3))
12227 {
12228 case 0:
12229 vex.prefix = 0;
12230 break;
12231 case 1:
12232 vex.prefix = DATA_PREFIX_OPCODE;
12233 break;
12234 case 2:
12235 vex.prefix = REPE_PREFIX_OPCODE;
12236 break;
12237 case 3:
12238 vex.prefix = REPNE_PREFIX_OPCODE;
12239 break;
12240 }
12241
12242 /* The third byte after 0x62. */
12243 codep++;
12244
12245 /* Remember the static rounding bits. */
12246 vex.ll = (*codep >> 5) & 3;
12247 vex.b = (*codep & 0x10) != 0;
12248
12249 vex.v = *codep & 0x8;
12250 vex.mask_register_specifier = *codep & 0x7;
12251 vex.zeroing = *codep & 0x80;
12252
12253 need_vex = 1;
12254 need_vex_reg = 1;
12255 codep++;
12256 vindex = *codep++;
12257 dp = &evex_table[vex_table_index][vindex];
12258 FETCH_DATA (info, codep + 1);
12259 modrm.mod = (*codep >> 6) & 3;
12260 modrm.reg = (*codep >> 3) & 7;
12261 modrm.rm = *codep & 7;
12262
12263 /* Set vector length. */
12264 if (modrm.mod == 3 && vex.b)
12265 vex.length = 512;
12266 else
12267 {
12268 switch (vex.ll)
12269 {
12270 case 0x0:
12271 vex.length = 128;
12272 break;
12273 case 0x1:
12274 vex.length = 256;
12275 break;
12276 case 0x2:
12277 vex.length = 512;
12278 break;
12279 default:
12280 return &bad_opcode;
12281 }
12282 }
12283 break;
12284
12285 case 0:
12286 dp = &bad_opcode;
12287 break;
12288
12289 default:
12290 abort ();
12291 }
12292
12293 if (dp->name != NULL)
12294 return dp;
12295 else
12296 return get_valid_dis386 (dp, info);
12297 }
12298
12299 static void
12300 get_sib (disassemble_info *info, int sizeflag)
12301 {
12302 /* If modrm.mod == 3, operand must be register. */
12303 if (need_modrm
12304 && ((sizeflag & AFLAG) || address_mode == mode_64bit)
12305 && modrm.mod != 3
12306 && modrm.rm == 4)
12307 {
12308 FETCH_DATA (info, codep + 2);
12309 sib.index = (codep [1] >> 3) & 7;
12310 sib.scale = (codep [1] >> 6) & 3;
12311 sib.base = codep [1] & 7;
12312 }
12313 }
12314
12315 static int
12316 print_insn (bfd_vma pc, disassemble_info *info)
12317 {
12318 const struct dis386 *dp;
12319 int i;
12320 char *op_txt[MAX_OPERANDS];
12321 int needcomma;
12322 int sizeflag;
12323 const char *p;
12324 struct dis_private priv;
12325 int prefix_length;
12326 int default_prefixes;
12327
12328 priv.orig_sizeflag = AFLAG | DFLAG;
12329 if ((info->mach & bfd_mach_i386_i386) != 0)
12330 address_mode = mode_32bit;
12331 else if (info->mach == bfd_mach_i386_i8086)
12332 {
12333 address_mode = mode_16bit;
12334 priv.orig_sizeflag = 0;
12335 }
12336 else
12337 address_mode = mode_64bit;
12338
12339 if (intel_syntax == (char) -1)
12340 intel_syntax = (info->mach & bfd_mach_i386_intel_syntax) != 0;
12341
12342 for (p = info->disassembler_options; p != NULL; )
12343 {
12344 if (CONST_STRNEQ (p, "x86-64"))
12345 {
12346 address_mode = mode_64bit;
12347 priv.orig_sizeflag = AFLAG | DFLAG;
12348 }
12349 else if (CONST_STRNEQ (p, "i386"))
12350 {
12351 address_mode = mode_32bit;
12352 priv.orig_sizeflag = AFLAG | DFLAG;
12353 }
12354 else if (CONST_STRNEQ (p, "i8086"))
12355 {
12356 address_mode = mode_16bit;
12357 priv.orig_sizeflag = 0;
12358 }
12359 else if (CONST_STRNEQ (p, "intel"))
12360 {
12361 intel_syntax = 1;
12362 if (CONST_STRNEQ (p + 5, "-mnemonic"))
12363 intel_mnemonic = 1;
12364 }
12365 else if (CONST_STRNEQ (p, "att"))
12366 {
12367 intel_syntax = 0;
12368 if (CONST_STRNEQ (p + 3, "-mnemonic"))
12369 intel_mnemonic = 0;
12370 }
12371 else if (CONST_STRNEQ (p, "addr"))
12372 {
12373 if (address_mode == mode_64bit)
12374 {
12375 if (p[4] == '3' && p[5] == '2')
12376 priv.orig_sizeflag &= ~AFLAG;
12377 else if (p[4] == '6' && p[5] == '4')
12378 priv.orig_sizeflag |= AFLAG;
12379 }
12380 else
12381 {
12382 if (p[4] == '1' && p[5] == '6')
12383 priv.orig_sizeflag &= ~AFLAG;
12384 else if (p[4] == '3' && p[5] == '2')
12385 priv.orig_sizeflag |= AFLAG;
12386 }
12387 }
12388 else if (CONST_STRNEQ (p, "data"))
12389 {
12390 if (p[4] == '1' && p[5] == '6')
12391 priv.orig_sizeflag &= ~DFLAG;
12392 else if (p[4] == '3' && p[5] == '2')
12393 priv.orig_sizeflag |= DFLAG;
12394 }
12395 else if (CONST_STRNEQ (p, "suffix"))
12396 priv.orig_sizeflag |= SUFFIX_ALWAYS;
12397
12398 p = strchr (p, ',');
12399 if (p != NULL)
12400 p++;
12401 }
12402
12403 if (intel_syntax)
12404 {
12405 names64 = intel_names64;
12406 names32 = intel_names32;
12407 names16 = intel_names16;
12408 names8 = intel_names8;
12409 names8rex = intel_names8rex;
12410 names_seg = intel_names_seg;
12411 names_mm = intel_names_mm;
12412 names_bnd = intel_names_bnd;
12413 names_xmm = intel_names_xmm;
12414 names_ymm = intel_names_ymm;
12415 names_zmm = intel_names_zmm;
12416 index64 = intel_index64;
12417 index32 = intel_index32;
12418 names_mask = intel_names_mask;
12419 index16 = intel_index16;
12420 open_char = '[';
12421 close_char = ']';
12422 separator_char = '+';
12423 scale_char = '*';
12424 }
12425 else
12426 {
12427 names64 = att_names64;
12428 names32 = att_names32;
12429 names16 = att_names16;
12430 names8 = att_names8;
12431 names8rex = att_names8rex;
12432 names_seg = att_names_seg;
12433 names_mm = att_names_mm;
12434 names_bnd = att_names_bnd;
12435 names_xmm = att_names_xmm;
12436 names_ymm = att_names_ymm;
12437 names_zmm = att_names_zmm;
12438 index64 = att_index64;
12439 index32 = att_index32;
12440 names_mask = att_names_mask;
12441 index16 = att_index16;
12442 open_char = '(';
12443 close_char = ')';
12444 separator_char = ',';
12445 scale_char = ',';
12446 }
12447
12448 /* The output looks better if we put 7 bytes on a line, since that
12449 puts most long word instructions on a single line. Use 8 bytes
12450 for Intel L1OM. */
12451 if ((info->mach & bfd_mach_l1om) != 0)
12452 info->bytes_per_line = 8;
12453 else
12454 info->bytes_per_line = 7;
12455
12456 info->private_data = &priv;
12457 priv.max_fetched = priv.the_buffer;
12458 priv.insn_start = pc;
12459
12460 obuf[0] = 0;
12461 for (i = 0; i < MAX_OPERANDS; ++i)
12462 {
12463 op_out[i][0] = 0;
12464 op_index[i] = -1;
12465 }
12466
12467 the_info = info;
12468 start_pc = pc;
12469 start_codep = priv.the_buffer;
12470 codep = priv.the_buffer;
12471
12472 if (setjmp (priv.bailout) != 0)
12473 {
12474 const char *name;
12475
12476 /* Getting here means we tried for data but didn't get it. That
12477 means we have an incomplete instruction of some sort. Just
12478 print the first byte as a prefix or a .byte pseudo-op. */
12479 if (codep > priv.the_buffer)
12480 {
12481 name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
12482 if (name != NULL)
12483 (*info->fprintf_func) (info->stream, "%s", name);
12484 else
12485 {
12486 /* Just print the first byte as a .byte instruction. */
12487 (*info->fprintf_func) (info->stream, ".byte 0x%x",
12488 (unsigned int) priv.the_buffer[0]);
12489 }
12490
12491 return 1;
12492 }
12493
12494 return -1;
12495 }
12496
12497 obufp = obuf;
12498 sizeflag = priv.orig_sizeflag;
12499
12500 if (!ckprefix () || rex_used)
12501 {
12502 /* Too many prefixes or unused REX prefixes. */
12503 for (i = 0;
12504 i < (int) ARRAY_SIZE (all_prefixes) && all_prefixes[i];
12505 i++)
12506 (*info->fprintf_func) (info->stream, "%s%s",
12507 i == 0 ? "" : " ",
12508 prefix_name (all_prefixes[i], sizeflag));
12509 return i;
12510 }
12511
12512 insn_codep = codep;
12513
12514 FETCH_DATA (info, codep + 1);
12515 two_source_ops = (*codep == 0x62) || (*codep == 0xc8);
12516
12517 if (((prefixes & PREFIX_FWAIT)
12518 && ((*codep < 0xd8) || (*codep > 0xdf))))
12519 {
12520 (*info->fprintf_func) (info->stream, "fwait");
12521 return 1;
12522 }
12523
12524 if (*codep == 0x0f)
12525 {
12526 unsigned char threebyte;
12527 FETCH_DATA (info, codep + 2);
12528 threebyte = *++codep;
12529 dp = &dis386_twobyte[threebyte];
12530 need_modrm = twobyte_has_modrm[*codep];
12531 codep++;
12532 }
12533 else
12534 {
12535 dp = &dis386[*codep];
12536 need_modrm = onebyte_has_modrm[*codep];
12537 codep++;
12538 }
12539
12540 if ((prefixes & PREFIX_REPZ))
12541 used_prefixes |= PREFIX_REPZ;
12542 if ((prefixes & PREFIX_REPNZ))
12543 used_prefixes |= PREFIX_REPNZ;
12544 if ((prefixes & PREFIX_LOCK))
12545 used_prefixes |= PREFIX_LOCK;
12546
12547 default_prefixes = 0;
12548 if (prefixes & PREFIX_ADDR)
12549 {
12550 sizeflag ^= AFLAG;
12551 if (dp->op[2].bytemode != loop_jcxz_mode || intel_syntax)
12552 {
12553 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
12554 all_prefixes[last_addr_prefix] = ADDR32_PREFIX;
12555 else
12556 all_prefixes[last_addr_prefix] = ADDR16_PREFIX;
12557 default_prefixes |= PREFIX_ADDR;
12558 }
12559 }
12560
12561 if ((prefixes & PREFIX_DATA))
12562 {
12563 sizeflag ^= DFLAG;
12564 if (dp->op[2].bytemode == cond_jump_mode
12565 && dp->op[0].bytemode == v_mode
12566 && !intel_syntax)
12567 {
12568 if (sizeflag & DFLAG)
12569 all_prefixes[last_data_prefix] = DATA32_PREFIX;
12570 else
12571 all_prefixes[last_data_prefix] = DATA16_PREFIX;
12572 default_prefixes |= PREFIX_DATA;
12573 }
12574 else if (rex & REX_W)
12575 {
12576 /* REX_W will override PREFIX_DATA. */
12577 default_prefixes |= PREFIX_DATA;
12578 }
12579 }
12580
12581 if (need_modrm)
12582 {
12583 FETCH_DATA (info, codep + 1);
12584 modrm.mod = (*codep >> 6) & 3;
12585 modrm.reg = (*codep >> 3) & 7;
12586 modrm.rm = *codep & 7;
12587 }
12588
12589 need_vex = 0;
12590 need_vex_reg = 0;
12591 vex_w_done = 0;
12592 vex.evex = 0;
12593
12594 if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE)
12595 {
12596 get_sib (info, sizeflag);
12597 dofloat (sizeflag);
12598 }
12599 else
12600 {
12601 dp = get_valid_dis386 (dp, info);
12602 if (dp != NULL && putop (dp->name, sizeflag) == 0)
12603 {
12604 get_sib (info, sizeflag);
12605 for (i = 0; i < MAX_OPERANDS; ++i)
12606 {
12607 obufp = op_out[i];
12608 op_ad = MAX_OPERANDS - 1 - i;
12609 if (dp->op[i].rtn)
12610 (*dp->op[i].rtn) (dp->op[i].bytemode, sizeflag);
12611 /* For EVEX instruction after the last operand masking
12612 should be printed. */
12613 if (i == 0 && vex.evex)
12614 {
12615 /* Don't print {%k0}. */
12616 if (vex.mask_register_specifier)
12617 {
12618 oappend ("{");
12619 oappend (names_mask[vex.mask_register_specifier]);
12620 oappend ("}");
12621 }
12622 if (vex.zeroing)
12623 oappend ("{z}");
12624 }
12625 }
12626 }
12627 }
12628
12629 /* See if any prefixes were not used. If so, print the first one
12630 separately. If we don't do this, we'll wind up printing an
12631 instruction stream which does not precisely correspond to the
12632 bytes we are disassembling. */
12633 if ((prefixes & ~(used_prefixes | default_prefixes)) != 0)
12634 {
12635 for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
12636 if (all_prefixes[i])
12637 {
12638 const char *name;
12639 name = prefix_name (all_prefixes[i], priv.orig_sizeflag);
12640 if (name == NULL)
12641 name = INTERNAL_DISASSEMBLER_ERROR;
12642 (*info->fprintf_func) (info->stream, "%s", name);
12643 return 1;
12644 }
12645 }
12646
12647 /* Check if the REX prefix is used. */
12648 if (rex_ignored == 0 && (rex ^ rex_used) == 0 && last_rex_prefix >= 0)
12649 all_prefixes[last_rex_prefix] = 0;
12650
12651 /* Check if the SEG prefix is used. */
12652 if ((prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS | PREFIX_ES
12653 | PREFIX_FS | PREFIX_GS)) != 0
12654 && (used_prefixes
12655 & seg_prefix (all_prefixes[last_seg_prefix])) != 0)
12656 all_prefixes[last_seg_prefix] = 0;
12657
12658 /* Check if the ADDR prefix is used. */
12659 if ((prefixes & PREFIX_ADDR) != 0
12660 && (used_prefixes & PREFIX_ADDR) != 0)
12661 all_prefixes[last_addr_prefix] = 0;
12662
12663 /* Check if the DATA prefix is used. */
12664 if ((prefixes & PREFIX_DATA) != 0
12665 && (used_prefixes & PREFIX_DATA) != 0)
12666 all_prefixes[last_data_prefix] = 0;
12667
12668 prefix_length = 0;
12669 for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
12670 if (all_prefixes[i])
12671 {
12672 const char *name;
12673 name = prefix_name (all_prefixes[i], sizeflag);
12674 if (name == NULL)
12675 abort ();
12676 prefix_length += strlen (name) + 1;
12677 (*info->fprintf_func) (info->stream, "%s ", name);
12678 }
12679
12680 /* Check maximum code length. */
12681 if ((codep - start_codep) > MAX_CODE_LENGTH)
12682 {
12683 (*info->fprintf_func) (info->stream, "(bad)");
12684 return MAX_CODE_LENGTH;
12685 }
12686
12687 obufp = mnemonicendp;
12688 for (i = strlen (obuf) + prefix_length; i < 6; i++)
12689 oappend (" ");
12690 oappend (" ");
12691 (*info->fprintf_func) (info->stream, "%s", obuf);
12692
12693 /* The enter and bound instructions are printed with operands in the same
12694 order as the intel book; everything else is printed in reverse order. */
12695 if (intel_syntax || two_source_ops)
12696 {
12697 bfd_vma riprel;
12698
12699 for (i = 0; i < MAX_OPERANDS; ++i)
12700 op_txt[i] = op_out[i];
12701
12702 for (i = 0; i < (MAX_OPERANDS >> 1); ++i)
12703 {
12704 op_ad = op_index[i];
12705 op_index[i] = op_index[MAX_OPERANDS - 1 - i];
12706 op_index[MAX_OPERANDS - 1 - i] = op_ad;
12707 riprel = op_riprel[i];
12708 op_riprel[i] = op_riprel [MAX_OPERANDS - 1 - i];
12709 op_riprel[MAX_OPERANDS - 1 - i] = riprel;
12710 }
12711 }
12712 else
12713 {
12714 for (i = 0; i < MAX_OPERANDS; ++i)
12715 op_txt[MAX_OPERANDS - 1 - i] = op_out[i];
12716 }
12717
12718 needcomma = 0;
12719 for (i = 0; i < MAX_OPERANDS; ++i)
12720 if (*op_txt[i])
12721 {
12722 if (needcomma)
12723 (*info->fprintf_func) (info->stream, ",");
12724 if (op_index[i] != -1 && !op_riprel[i])
12725 (*info->print_address_func) ((bfd_vma) op_address[op_index[i]], info);
12726 else
12727 (*info->fprintf_func) (info->stream, "%s", op_txt[i]);
12728 needcomma = 1;
12729 }
12730
12731 for (i = 0; i < MAX_OPERANDS; i++)
12732 if (op_index[i] != -1 && op_riprel[i])
12733 {
12734 (*info->fprintf_func) (info->stream, " # ");
12735 (*info->print_address_func) ((bfd_vma) (start_pc + codep - start_codep
12736 + op_address[op_index[i]]), info);
12737 break;
12738 }
12739 return codep - priv.the_buffer;
12740 }
12741
12742 static const char *float_mem[] = {
12743 /* d8 */
12744 "fadd{s|}",
12745 "fmul{s|}",
12746 "fcom{s|}",
12747 "fcomp{s|}",
12748 "fsub{s|}",
12749 "fsubr{s|}",
12750 "fdiv{s|}",
12751 "fdivr{s|}",
12752 /* d9 */
12753 "fld{s|}",
12754 "(bad)",
12755 "fst{s|}",
12756 "fstp{s|}",
12757 "fldenvIC",
12758 "fldcw",
12759 "fNstenvIC",
12760 "fNstcw",
12761 /* da */
12762 "fiadd{l|}",
12763 "fimul{l|}",
12764 "ficom{l|}",
12765 "ficomp{l|}",
12766 "fisub{l|}",
12767 "fisubr{l|}",
12768 "fidiv{l|}",
12769 "fidivr{l|}",
12770 /* db */
12771 "fild{l|}",
12772 "fisttp{l|}",
12773 "fist{l|}",
12774 "fistp{l|}",
12775 "(bad)",
12776 "fld{t||t|}",
12777 "(bad)",
12778 "fstp{t||t|}",
12779 /* dc */
12780 "fadd{l|}",
12781 "fmul{l|}",
12782 "fcom{l|}",
12783 "fcomp{l|}",
12784 "fsub{l|}",
12785 "fsubr{l|}",
12786 "fdiv{l|}",
12787 "fdivr{l|}",
12788 /* dd */
12789 "fld{l|}",
12790 "fisttp{ll|}",
12791 "fst{l||}",
12792 "fstp{l|}",
12793 "frstorIC",
12794 "(bad)",
12795 "fNsaveIC",
12796 "fNstsw",
12797 /* de */
12798 "fiadd",
12799 "fimul",
12800 "ficom",
12801 "ficomp",
12802 "fisub",
12803 "fisubr",
12804 "fidiv",
12805 "fidivr",
12806 /* df */
12807 "fild",
12808 "fisttp",
12809 "fist",
12810 "fistp",
12811 "fbld",
12812 "fild{ll|}",
12813 "fbstp",
12814 "fistp{ll|}",
12815 };
12816
12817 static const unsigned char float_mem_mode[] = {
12818 /* d8 */
12819 d_mode,
12820 d_mode,
12821 d_mode,
12822 d_mode,
12823 d_mode,
12824 d_mode,
12825 d_mode,
12826 d_mode,
12827 /* d9 */
12828 d_mode,
12829 0,
12830 d_mode,
12831 d_mode,
12832 0,
12833 w_mode,
12834 0,
12835 w_mode,
12836 /* da */
12837 d_mode,
12838 d_mode,
12839 d_mode,
12840 d_mode,
12841 d_mode,
12842 d_mode,
12843 d_mode,
12844 d_mode,
12845 /* db */
12846 d_mode,
12847 d_mode,
12848 d_mode,
12849 d_mode,
12850 0,
12851 t_mode,
12852 0,
12853 t_mode,
12854 /* dc */
12855 q_mode,
12856 q_mode,
12857 q_mode,
12858 q_mode,
12859 q_mode,
12860 q_mode,
12861 q_mode,
12862 q_mode,
12863 /* dd */
12864 q_mode,
12865 q_mode,
12866 q_mode,
12867 q_mode,
12868 0,
12869 0,
12870 0,
12871 w_mode,
12872 /* de */
12873 w_mode,
12874 w_mode,
12875 w_mode,
12876 w_mode,
12877 w_mode,
12878 w_mode,
12879 w_mode,
12880 w_mode,
12881 /* df */
12882 w_mode,
12883 w_mode,
12884 w_mode,
12885 w_mode,
12886 t_mode,
12887 q_mode,
12888 t_mode,
12889 q_mode
12890 };
12891
12892 #define ST { OP_ST, 0 }
12893 #define STi { OP_STi, 0 }
12894
12895 #define FGRPd9_2 NULL, { { NULL, 0 } }
12896 #define FGRPd9_4 NULL, { { NULL, 1 } }
12897 #define FGRPd9_5 NULL, { { NULL, 2 } }
12898 #define FGRPd9_6 NULL, { { NULL, 3 } }
12899 #define FGRPd9_7 NULL, { { NULL, 4 } }
12900 #define FGRPda_5 NULL, { { NULL, 5 } }
12901 #define FGRPdb_4 NULL, { { NULL, 6 } }
12902 #define FGRPde_3 NULL, { { NULL, 7 } }
12903 #define FGRPdf_4 NULL, { { NULL, 8 } }
12904
12905 static const struct dis386 float_reg[][8] = {
12906 /* d8 */
12907 {
12908 { "fadd", { ST, STi } },
12909 { "fmul", { ST, STi } },
12910 { "fcom", { STi } },
12911 { "fcomp", { STi } },
12912 { "fsub", { ST, STi } },
12913 { "fsubr", { ST, STi } },
12914 { "fdiv", { ST, STi } },
12915 { "fdivr", { ST, STi } },
12916 },
12917 /* d9 */
12918 {
12919 { "fld", { STi } },
12920 { "fxch", { STi } },
12921 { FGRPd9_2 },
12922 { Bad_Opcode },
12923 { FGRPd9_4 },
12924 { FGRPd9_5 },
12925 { FGRPd9_6 },
12926 { FGRPd9_7 },
12927 },
12928 /* da */
12929 {
12930 { "fcmovb", { ST, STi } },
12931 { "fcmove", { ST, STi } },
12932 { "fcmovbe",{ ST, STi } },
12933 { "fcmovu", { ST, STi } },
12934 { Bad_Opcode },
12935 { FGRPda_5 },
12936 { Bad_Opcode },
12937 { Bad_Opcode },
12938 },
12939 /* db */
12940 {
12941 { "fcmovnb",{ ST, STi } },
12942 { "fcmovne",{ ST, STi } },
12943 { "fcmovnbe",{ ST, STi } },
12944 { "fcmovnu",{ ST, STi } },
12945 { FGRPdb_4 },
12946 { "fucomi", { ST, STi } },
12947 { "fcomi", { ST, STi } },
12948 { Bad_Opcode },
12949 },
12950 /* dc */
12951 {
12952 { "fadd", { STi, ST } },
12953 { "fmul", { STi, ST } },
12954 { Bad_Opcode },
12955 { Bad_Opcode },
12956 { "fsub!M", { STi, ST } },
12957 { "fsubM", { STi, ST } },
12958 { "fdiv!M", { STi, ST } },
12959 { "fdivM", { STi, ST } },
12960 },
12961 /* dd */
12962 {
12963 { "ffree", { STi } },
12964 { Bad_Opcode },
12965 { "fst", { STi } },
12966 { "fstp", { STi } },
12967 { "fucom", { STi } },
12968 { "fucomp", { STi } },
12969 { Bad_Opcode },
12970 { Bad_Opcode },
12971 },
12972 /* de */
12973 {
12974 { "faddp", { STi, ST } },
12975 { "fmulp", { STi, ST } },
12976 { Bad_Opcode },
12977 { FGRPde_3 },
12978 { "fsub!Mp", { STi, ST } },
12979 { "fsubMp", { STi, ST } },
12980 { "fdiv!Mp", { STi, ST } },
12981 { "fdivMp", { STi, ST } },
12982 },
12983 /* df */
12984 {
12985 { "ffreep", { STi } },
12986 { Bad_Opcode },
12987 { Bad_Opcode },
12988 { Bad_Opcode },
12989 { FGRPdf_4 },
12990 { "fucomip", { ST, STi } },
12991 { "fcomip", { ST, STi } },
12992 { Bad_Opcode },
12993 },
12994 };
12995
12996 static char *fgrps[][8] = {
12997 /* d9_2 0 */
12998 {
12999 "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
13000 },
13001
13002 /* d9_4 1 */
13003 {
13004 "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
13005 },
13006
13007 /* d9_5 2 */
13008 {
13009 "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
13010 },
13011
13012 /* d9_6 3 */
13013 {
13014 "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
13015 },
13016
13017 /* d9_7 4 */
13018 {
13019 "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
13020 },
13021
13022 /* da_5 5 */
13023 {
13024 "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
13025 },
13026
13027 /* db_4 6 */
13028 {
13029 "fNeni(8087 only)","fNdisi(8087 only)","fNclex","fNinit",
13030 "fNsetpm(287 only)","frstpm(287 only)","(bad)","(bad)",
13031 },
13032
13033 /* de_3 7 */
13034 {
13035 "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
13036 },
13037
13038 /* df_4 8 */
13039 {
13040 "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
13041 },
13042 };
13043
13044 static void
13045 swap_operand (void)
13046 {
13047 mnemonicendp[0] = '.';
13048 mnemonicendp[1] = 's';
13049 mnemonicendp += 2;
13050 }
13051
13052 static void
13053 OP_Skip_MODRM (int bytemode ATTRIBUTE_UNUSED,
13054 int sizeflag ATTRIBUTE_UNUSED)
13055 {
13056 /* Skip mod/rm byte. */
13057 MODRM_CHECK;
13058 codep++;
13059 }
13060
13061 static void
13062 dofloat (int sizeflag)
13063 {
13064 const struct dis386 *dp;
13065 unsigned char floatop;
13066
13067 floatop = codep[-1];
13068
13069 if (modrm.mod != 3)
13070 {
13071 int fp_indx = (floatop - 0xd8) * 8 + modrm.reg;
13072
13073 putop (float_mem[fp_indx], sizeflag);
13074 obufp = op_out[0];
13075 op_ad = 2;
13076 OP_E (float_mem_mode[fp_indx], sizeflag);
13077 return;
13078 }
13079 /* Skip mod/rm byte. */
13080 MODRM_CHECK;
13081 codep++;
13082
13083 dp = &float_reg[floatop - 0xd8][modrm.reg];
13084 if (dp->name == NULL)
13085 {
13086 putop (fgrps[dp->op[0].bytemode][modrm.rm], sizeflag);
13087
13088 /* Instruction fnstsw is only one with strange arg. */
13089 if (floatop == 0xdf && codep[-1] == 0xe0)
13090 strcpy (op_out[0], names16[0]);
13091 }
13092 else
13093 {
13094 putop (dp->name, sizeflag);
13095
13096 obufp = op_out[0];
13097 op_ad = 2;
13098 if (dp->op[0].rtn)
13099 (*dp->op[0].rtn) (dp->op[0].bytemode, sizeflag);
13100
13101 obufp = op_out[1];
13102 op_ad = 1;
13103 if (dp->op[1].rtn)
13104 (*dp->op[1].rtn) (dp->op[1].bytemode, sizeflag);
13105 }
13106 }
13107
13108 /* Like oappend (below), but S is a string starting with '%'.
13109 In Intel syntax, the '%' is elided. */
13110 static void
13111 oappend_maybe_intel (const char *s)
13112 {
13113 oappend (s + intel_syntax);
13114 }
13115
13116 static void
13117 OP_ST (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13118 {
13119 oappend_maybe_intel ("%st");
13120 }
13121
13122 static void
13123 OP_STi (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13124 {
13125 sprintf (scratchbuf, "%%st(%d)", modrm.rm);
13126 oappend_maybe_intel (scratchbuf);
13127 }
13128
13129 /* Capital letters in template are macros. */
13130 static int
13131 putop (const char *in_template, int sizeflag)
13132 {
13133 const char *p;
13134 int alt = 0;
13135 int cond = 1;
13136 unsigned int l = 0, len = 1;
13137 char last[4];
13138
13139 #define SAVE_LAST(c) \
13140 if (l < len && l < sizeof (last)) \
13141 last[l++] = c; \
13142 else \
13143 abort ();
13144
13145 for (p = in_template; *p; p++)
13146 {
13147 switch (*p)
13148 {
13149 default:
13150 *obufp++ = *p;
13151 break;
13152 case '%':
13153 len++;
13154 break;
13155 case '!':
13156 cond = 0;
13157 break;
13158 case '{':
13159 alt = 0;
13160 if (intel_syntax)
13161 {
13162 while (*++p != '|')
13163 if (*p == '}' || *p == '\0')
13164 abort ();
13165 }
13166 /* Fall through. */
13167 case 'I':
13168 alt = 1;
13169 continue;
13170 case '|':
13171 while (*++p != '}')
13172 {
13173 if (*p == '\0')
13174 abort ();
13175 }
13176 break;
13177 case '}':
13178 break;
13179 case 'A':
13180 if (intel_syntax)
13181 break;
13182 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
13183 *obufp++ = 'b';
13184 break;
13185 case 'B':
13186 if (l == 0 && len == 1)
13187 {
13188 case_B:
13189 if (intel_syntax)
13190 break;
13191 if (sizeflag & SUFFIX_ALWAYS)
13192 *obufp++ = 'b';
13193 }
13194 else
13195 {
13196 if (l != 1
13197 || len != 2
13198 || last[0] != 'L')
13199 {
13200 SAVE_LAST (*p);
13201 break;
13202 }
13203
13204 if (address_mode == mode_64bit
13205 && !(prefixes & PREFIX_ADDR))
13206 {
13207 *obufp++ = 'a';
13208 *obufp++ = 'b';
13209 *obufp++ = 's';
13210 }
13211
13212 goto case_B;
13213 }
13214 break;
13215 case 'C':
13216 if (intel_syntax && !alt)
13217 break;
13218 if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
13219 {
13220 if (sizeflag & DFLAG)
13221 *obufp++ = intel_syntax ? 'd' : 'l';
13222 else
13223 *obufp++ = intel_syntax ? 'w' : 's';
13224 used_prefixes |= (prefixes & PREFIX_DATA);
13225 }
13226 break;
13227 case 'D':
13228 if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
13229 break;
13230 USED_REX (REX_W);
13231 if (modrm.mod == 3)
13232 {
13233 if (rex & REX_W)
13234 *obufp++ = 'q';
13235 else
13236 {
13237 if (sizeflag & DFLAG)
13238 *obufp++ = intel_syntax ? 'd' : 'l';
13239 else
13240 *obufp++ = 'w';
13241 used_prefixes |= (prefixes & PREFIX_DATA);
13242 }
13243 }
13244 else
13245 *obufp++ = 'w';
13246 break;
13247 case 'E': /* For jcxz/jecxz */
13248 if (address_mode == mode_64bit)
13249 {
13250 if (sizeflag & AFLAG)
13251 *obufp++ = 'r';
13252 else
13253 *obufp++ = 'e';
13254 }
13255 else
13256 if (sizeflag & AFLAG)
13257 *obufp++ = 'e';
13258 used_prefixes |= (prefixes & PREFIX_ADDR);
13259 break;
13260 case 'F':
13261 if (intel_syntax)
13262 break;
13263 if ((prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS))
13264 {
13265 if (sizeflag & AFLAG)
13266 *obufp++ = address_mode == mode_64bit ? 'q' : 'l';
13267 else
13268 *obufp++ = address_mode == mode_64bit ? 'l' : 'w';
13269 used_prefixes |= (prefixes & PREFIX_ADDR);
13270 }
13271 break;
13272 case 'G':
13273 if (intel_syntax || (obufp[-1] != 's' && !(sizeflag & SUFFIX_ALWAYS)))
13274 break;
13275 if ((rex & REX_W) || (sizeflag & DFLAG))
13276 *obufp++ = 'l';
13277 else
13278 *obufp++ = 'w';
13279 if (!(rex & REX_W))
13280 used_prefixes |= (prefixes & PREFIX_DATA);
13281 break;
13282 case 'H':
13283 if (intel_syntax)
13284 break;
13285 if ((prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS
13286 || (prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS)
13287 {
13288 used_prefixes |= prefixes & (PREFIX_CS | PREFIX_DS);
13289 *obufp++ = ',';
13290 *obufp++ = 'p';
13291 if (prefixes & PREFIX_DS)
13292 *obufp++ = 't';
13293 else
13294 *obufp++ = 'n';
13295 }
13296 break;
13297 case 'J':
13298 if (intel_syntax)
13299 break;
13300 *obufp++ = 'l';
13301 break;
13302 case 'K':
13303 USED_REX (REX_W);
13304 if (rex & REX_W)
13305 *obufp++ = 'q';
13306 else
13307 *obufp++ = 'd';
13308 break;
13309 case 'Z':
13310 if (intel_syntax)
13311 break;
13312 if (address_mode == mode_64bit && (sizeflag & SUFFIX_ALWAYS))
13313 {
13314 *obufp++ = 'q';
13315 break;
13316 }
13317 /* Fall through. */
13318 goto case_L;
13319 case 'L':
13320 if (l != 0 || len != 1)
13321 {
13322 SAVE_LAST (*p);
13323 break;
13324 }
13325 case_L:
13326 if (intel_syntax)
13327 break;
13328 if (sizeflag & SUFFIX_ALWAYS)
13329 *obufp++ = 'l';
13330 break;
13331 case 'M':
13332 if (intel_mnemonic != cond)
13333 *obufp++ = 'r';
13334 break;
13335 case 'N':
13336 if ((prefixes & PREFIX_FWAIT) == 0)
13337 *obufp++ = 'n';
13338 else
13339 used_prefixes |= PREFIX_FWAIT;
13340 break;
13341 case 'O':
13342 USED_REX (REX_W);
13343 if (rex & REX_W)
13344 *obufp++ = 'o';
13345 else if (intel_syntax && (sizeflag & DFLAG))
13346 *obufp++ = 'q';
13347 else
13348 *obufp++ = 'd';
13349 if (!(rex & REX_W))
13350 used_prefixes |= (prefixes & PREFIX_DATA);
13351 break;
13352 case 'T':
13353 if (!intel_syntax
13354 && address_mode == mode_64bit
13355 && ((sizeflag & DFLAG) || (rex & REX_W)))
13356 {
13357 *obufp++ = 'q';
13358 break;
13359 }
13360 /* Fall through. */
13361 case 'P':
13362 if (intel_syntax)
13363 {
13364 if ((rex & REX_W) == 0
13365 && (prefixes & PREFIX_DATA))
13366 {
13367 if ((sizeflag & DFLAG) == 0)
13368 *obufp++ = 'w';
13369 used_prefixes |= (prefixes & PREFIX_DATA);
13370 }
13371 break;
13372 }
13373 if ((prefixes & PREFIX_DATA)
13374 || (rex & REX_W)
13375 || (sizeflag & SUFFIX_ALWAYS))
13376 {
13377 USED_REX (REX_W);
13378 if (rex & REX_W)
13379 *obufp++ = 'q';
13380 else
13381 {
13382 if (sizeflag & DFLAG)
13383 *obufp++ = 'l';
13384 else
13385 *obufp++ = 'w';
13386 used_prefixes |= (prefixes & PREFIX_DATA);
13387 }
13388 }
13389 break;
13390 case 'U':
13391 if (intel_syntax)
13392 break;
13393 if (address_mode == mode_64bit
13394 && ((sizeflag & DFLAG) || (rex & REX_W)))
13395 {
13396 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
13397 *obufp++ = 'q';
13398 break;
13399 }
13400 /* Fall through. */
13401 goto case_Q;
13402 case 'Q':
13403 if (l == 0 && len == 1)
13404 {
13405 case_Q:
13406 if (intel_syntax && !alt)
13407 break;
13408 USED_REX (REX_W);
13409 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
13410 {
13411 if (rex & REX_W)
13412 *obufp++ = 'q';
13413 else
13414 {
13415 if (sizeflag & DFLAG)
13416 *obufp++ = intel_syntax ? 'd' : 'l';
13417 else
13418 *obufp++ = 'w';
13419 used_prefixes |= (prefixes & PREFIX_DATA);
13420 }
13421 }
13422 }
13423 else
13424 {
13425 if (l != 1 || len != 2 || last[0] != 'L')
13426 {
13427 SAVE_LAST (*p);
13428 break;
13429 }
13430 if (intel_syntax
13431 || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
13432 break;
13433 if ((rex & REX_W))
13434 {
13435 USED_REX (REX_W);
13436 *obufp++ = 'q';
13437 }
13438 else
13439 *obufp++ = 'l';
13440 }
13441 break;
13442 case 'R':
13443 USED_REX (REX_W);
13444 if (rex & REX_W)
13445 *obufp++ = 'q';
13446 else if (sizeflag & DFLAG)
13447 {
13448 if (intel_syntax)
13449 *obufp++ = 'd';
13450 else
13451 *obufp++ = 'l';
13452 }
13453 else
13454 *obufp++ = 'w';
13455 if (intel_syntax && !p[1]
13456 && ((rex & REX_W) || (sizeflag & DFLAG)))
13457 *obufp++ = 'e';
13458 if (!(rex & REX_W))
13459 used_prefixes |= (prefixes & PREFIX_DATA);
13460 break;
13461 case 'V':
13462 if (l == 0 && len == 1)
13463 {
13464 if (intel_syntax)
13465 break;
13466 if (address_mode == mode_64bit
13467 && ((sizeflag & DFLAG) || (rex & REX_W)))
13468 {
13469 if (sizeflag & SUFFIX_ALWAYS)
13470 *obufp++ = 'q';
13471 break;
13472 }
13473 }
13474 else
13475 {
13476 if (l != 1
13477 || len != 2
13478 || last[0] != 'L')
13479 {
13480 SAVE_LAST (*p);
13481 break;
13482 }
13483
13484 if (rex & REX_W)
13485 {
13486 *obufp++ = 'a';
13487 *obufp++ = 'b';
13488 *obufp++ = 's';
13489 }
13490 }
13491 /* Fall through. */
13492 goto case_S;
13493 case 'S':
13494 if (l == 0 && len == 1)
13495 {
13496 case_S:
13497 if (intel_syntax)
13498 break;
13499 if (sizeflag & SUFFIX_ALWAYS)
13500 {
13501 if (rex & REX_W)
13502 *obufp++ = 'q';
13503 else
13504 {
13505 if (sizeflag & DFLAG)
13506 *obufp++ = 'l';
13507 else
13508 *obufp++ = 'w';
13509 used_prefixes |= (prefixes & PREFIX_DATA);
13510 }
13511 }
13512 }
13513 else
13514 {
13515 if (l != 1
13516 || len != 2
13517 || last[0] != 'L')
13518 {
13519 SAVE_LAST (*p);
13520 break;
13521 }
13522
13523 if (address_mode == mode_64bit
13524 && !(prefixes & PREFIX_ADDR))
13525 {
13526 *obufp++ = 'a';
13527 *obufp++ = 'b';
13528 *obufp++ = 's';
13529 }
13530
13531 goto case_S;
13532 }
13533 break;
13534 case 'X':
13535 if (l != 0 || len != 1)
13536 {
13537 SAVE_LAST (*p);
13538 break;
13539 }
13540 if (need_vex && vex.prefix)
13541 {
13542 if (vex.prefix == DATA_PREFIX_OPCODE)
13543 *obufp++ = 'd';
13544 else
13545 *obufp++ = 's';
13546 }
13547 else
13548 {
13549 if (prefixes & PREFIX_DATA)
13550 *obufp++ = 'd';
13551 else
13552 *obufp++ = 's';
13553 used_prefixes |= (prefixes & PREFIX_DATA);
13554 }
13555 break;
13556 case 'Y':
13557 if (l == 0 && len == 1)
13558 {
13559 if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
13560 break;
13561 if (rex & REX_W)
13562 {
13563 USED_REX (REX_W);
13564 *obufp++ = 'q';
13565 }
13566 break;
13567 }
13568 else
13569 {
13570 if (l != 1 || len != 2 || last[0] != 'X')
13571 {
13572 SAVE_LAST (*p);
13573 break;
13574 }
13575 if (!need_vex)
13576 abort ();
13577 if (intel_syntax
13578 || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
13579 break;
13580 switch (vex.length)
13581 {
13582 case 128:
13583 *obufp++ = 'x';
13584 break;
13585 case 256:
13586 *obufp++ = 'y';
13587 break;
13588 default:
13589 abort ();
13590 }
13591 }
13592 break;
13593 case 'W':
13594 if (l == 0 && len == 1)
13595 {
13596 /* operand size flag for cwtl, cbtw */
13597 USED_REX (REX_W);
13598 if (rex & REX_W)
13599 {
13600 if (intel_syntax)
13601 *obufp++ = 'd';
13602 else
13603 *obufp++ = 'l';
13604 }
13605 else if (sizeflag & DFLAG)
13606 *obufp++ = 'w';
13607 else
13608 *obufp++ = 'b';
13609 if (!(rex & REX_W))
13610 used_prefixes |= (prefixes & PREFIX_DATA);
13611 }
13612 else
13613 {
13614 if (l != 1
13615 || len != 2
13616 || (last[0] != 'X'
13617 && last[0] != 'L'))
13618 {
13619 SAVE_LAST (*p);
13620 break;
13621 }
13622 if (!need_vex)
13623 abort ();
13624 if (last[0] == 'X')
13625 *obufp++ = vex.w ? 'd': 's';
13626 else
13627 *obufp++ = vex.w ? 'q': 'd';
13628 }
13629 break;
13630 }
13631 alt = 0;
13632 }
13633 *obufp = 0;
13634 mnemonicendp = obufp;
13635 return 0;
13636 }
13637
13638 static void
13639 oappend (const char *s)
13640 {
13641 obufp = stpcpy (obufp, s);
13642 }
13643
13644 static void
13645 append_seg (void)
13646 {
13647 if (prefixes & PREFIX_CS)
13648 {
13649 used_prefixes |= PREFIX_CS;
13650 oappend_maybe_intel ("%cs:");
13651 }
13652 if (prefixes & PREFIX_DS)
13653 {
13654 used_prefixes |= PREFIX_DS;
13655 oappend_maybe_intel ("%ds:");
13656 }
13657 if (prefixes & PREFIX_SS)
13658 {
13659 used_prefixes |= PREFIX_SS;
13660 oappend_maybe_intel ("%ss:");
13661 }
13662 if (prefixes & PREFIX_ES)
13663 {
13664 used_prefixes |= PREFIX_ES;
13665 oappend_maybe_intel ("%es:");
13666 }
13667 if (prefixes & PREFIX_FS)
13668 {
13669 used_prefixes |= PREFIX_FS;
13670 oappend_maybe_intel ("%fs:");
13671 }
13672 if (prefixes & PREFIX_GS)
13673 {
13674 used_prefixes |= PREFIX_GS;
13675 oappend_maybe_intel ("%gs:");
13676 }
13677 }
13678
13679 static void
13680 OP_indirE (int bytemode, int sizeflag)
13681 {
13682 if (!intel_syntax)
13683 oappend ("*");
13684 OP_E (bytemode, sizeflag);
13685 }
13686
13687 static void
13688 print_operand_value (char *buf, int hex, bfd_vma disp)
13689 {
13690 if (address_mode == mode_64bit)
13691 {
13692 if (hex)
13693 {
13694 char tmp[30];
13695 int i;
13696 buf[0] = '0';
13697 buf[1] = 'x';
13698 sprintf_vma (tmp, disp);
13699 for (i = 0; tmp[i] == '0' && tmp[i + 1]; i++);
13700 strcpy (buf + 2, tmp + i);
13701 }
13702 else
13703 {
13704 bfd_signed_vma v = disp;
13705 char tmp[30];
13706 int i;
13707 if (v < 0)
13708 {
13709 *(buf++) = '-';
13710 v = -disp;
13711 /* Check for possible overflow on 0x8000000000000000. */
13712 if (v < 0)
13713 {
13714 strcpy (buf, "9223372036854775808");
13715 return;
13716 }
13717 }
13718 if (!v)
13719 {
13720 strcpy (buf, "0");
13721 return;
13722 }
13723
13724 i = 0;
13725 tmp[29] = 0;
13726 while (v)
13727 {
13728 tmp[28 - i] = (v % 10) + '0';
13729 v /= 10;
13730 i++;
13731 }
13732 strcpy (buf, tmp + 29 - i);
13733 }
13734 }
13735 else
13736 {
13737 if (hex)
13738 sprintf (buf, "0x%x", (unsigned int) disp);
13739 else
13740 sprintf (buf, "%d", (int) disp);
13741 }
13742 }
13743
13744 /* Put DISP in BUF as signed hex number. */
13745
13746 static void
13747 print_displacement (char *buf, bfd_vma disp)
13748 {
13749 bfd_signed_vma val = disp;
13750 char tmp[30];
13751 int i, j = 0;
13752
13753 if (val < 0)
13754 {
13755 buf[j++] = '-';
13756 val = -disp;
13757
13758 /* Check for possible overflow. */
13759 if (val < 0)
13760 {
13761 switch (address_mode)
13762 {
13763 case mode_64bit:
13764 strcpy (buf + j, "0x8000000000000000");
13765 break;
13766 case mode_32bit:
13767 strcpy (buf + j, "0x80000000");
13768 break;
13769 case mode_16bit:
13770 strcpy (buf + j, "0x8000");
13771 break;
13772 }
13773 return;
13774 }
13775 }
13776
13777 buf[j++] = '0';
13778 buf[j++] = 'x';
13779
13780 sprintf_vma (tmp, (bfd_vma) val);
13781 for (i = 0; tmp[i] == '0'; i++)
13782 continue;
13783 if (tmp[i] == '\0')
13784 i--;
13785 strcpy (buf + j, tmp + i);
13786 }
13787
13788 static void
13789 intel_operand_size (int bytemode, int sizeflag)
13790 {
13791 if (vex.evex
13792 && vex.b
13793 && (bytemode == x_mode
13794 || bytemode == evex_half_bcst_xmmq_mode))
13795 {
13796 if (vex.w)
13797 oappend ("QWORD PTR ");
13798 else
13799 oappend ("DWORD PTR ");
13800 return;
13801 }
13802 switch (bytemode)
13803 {
13804 case b_mode:
13805 case b_swap_mode:
13806 case dqb_mode:
13807 oappend ("BYTE PTR ");
13808 break;
13809 case w_mode:
13810 case dqw_mode:
13811 oappend ("WORD PTR ");
13812 break;
13813 case stack_v_mode:
13814 if (address_mode == mode_64bit && ((sizeflag & DFLAG) || (rex & REX_W)))
13815 {
13816 oappend ("QWORD PTR ");
13817 break;
13818 }
13819 /* FALLTHRU */
13820 case v_mode:
13821 case v_swap_mode:
13822 case dq_mode:
13823 USED_REX (REX_W);
13824 if (rex & REX_W)
13825 oappend ("QWORD PTR ");
13826 else
13827 {
13828 if ((sizeflag & DFLAG) || bytemode == dq_mode)
13829 oappend ("DWORD PTR ");
13830 else
13831 oappend ("WORD PTR ");
13832 used_prefixes |= (prefixes & PREFIX_DATA);
13833 }
13834 break;
13835 case z_mode:
13836 if ((rex & REX_W) || (sizeflag & DFLAG))
13837 *obufp++ = 'D';
13838 oappend ("WORD PTR ");
13839 if (!(rex & REX_W))
13840 used_prefixes |= (prefixes & PREFIX_DATA);
13841 break;
13842 case a_mode:
13843 if (sizeflag & DFLAG)
13844 oappend ("QWORD PTR ");
13845 else
13846 oappend ("DWORD PTR ");
13847 used_prefixes |= (prefixes & PREFIX_DATA);
13848 break;
13849 case d_mode:
13850 case d_scalar_mode:
13851 case d_scalar_swap_mode:
13852 case d_swap_mode:
13853 case dqd_mode:
13854 oappend ("DWORD PTR ");
13855 break;
13856 case q_mode:
13857 case q_scalar_mode:
13858 case q_scalar_swap_mode:
13859 case q_swap_mode:
13860 oappend ("QWORD PTR ");
13861 break;
13862 case m_mode:
13863 if (address_mode == mode_64bit)
13864 oappend ("QWORD PTR ");
13865 else
13866 oappend ("DWORD PTR ");
13867 break;
13868 case f_mode:
13869 if (sizeflag & DFLAG)
13870 oappend ("FWORD PTR ");
13871 else
13872 oappend ("DWORD PTR ");
13873 used_prefixes |= (prefixes & PREFIX_DATA);
13874 break;
13875 case t_mode:
13876 oappend ("TBYTE PTR ");
13877 break;
13878 case x_mode:
13879 case x_swap_mode:
13880 case evex_x_gscat_mode:
13881 case evex_x_nobcst_mode:
13882 if (need_vex)
13883 {
13884 switch (vex.length)
13885 {
13886 case 128:
13887 oappend ("XMMWORD PTR ");
13888 break;
13889 case 256:
13890 oappend ("YMMWORD PTR ");
13891 break;
13892 case 512:
13893 oappend ("ZMMWORD PTR ");
13894 break;
13895 default:
13896 abort ();
13897 }
13898 }
13899 else
13900 oappend ("XMMWORD PTR ");
13901 break;
13902 case xmm_mode:
13903 oappend ("XMMWORD PTR ");
13904 break;
13905 case ymm_mode:
13906 oappend ("YMMWORD PTR ");
13907 break;
13908 case xmmq_mode:
13909 case evex_half_bcst_xmmq_mode:
13910 if (!need_vex)
13911 abort ();
13912
13913 switch (vex.length)
13914 {
13915 case 128:
13916 oappend ("QWORD PTR ");
13917 break;
13918 case 256:
13919 oappend ("XMMWORD PTR ");
13920 break;
13921 case 512:
13922 oappend ("YMMWORD PTR ");
13923 break;
13924 default:
13925 abort ();
13926 }
13927 break;
13928 case xmm_mb_mode:
13929 if (!need_vex)
13930 abort ();
13931
13932 switch (vex.length)
13933 {
13934 case 128:
13935 case 256:
13936 case 512:
13937 oappend ("BYTE PTR ");
13938 break;
13939 default:
13940 abort ();
13941 }
13942 break;
13943 case xmm_mw_mode:
13944 if (!need_vex)
13945 abort ();
13946
13947 switch (vex.length)
13948 {
13949 case 128:
13950 case 256:
13951 case 512:
13952 oappend ("WORD PTR ");
13953 break;
13954 default:
13955 abort ();
13956 }
13957 break;
13958 case xmm_md_mode:
13959 if (!need_vex)
13960 abort ();
13961
13962 switch (vex.length)
13963 {
13964 case 128:
13965 case 256:
13966 case 512:
13967 oappend ("DWORD PTR ");
13968 break;
13969 default:
13970 abort ();
13971 }
13972 break;
13973 case xmm_mq_mode:
13974 if (!need_vex)
13975 abort ();
13976
13977 switch (vex.length)
13978 {
13979 case 128:
13980 case 256:
13981 case 512:
13982 oappend ("QWORD PTR ");
13983 break;
13984 default:
13985 abort ();
13986 }
13987 break;
13988 case xmmdw_mode:
13989 if (!need_vex)
13990 abort ();
13991
13992 switch (vex.length)
13993 {
13994 case 128:
13995 oappend ("WORD PTR ");
13996 break;
13997 case 256:
13998 oappend ("DWORD PTR ");
13999 break;
14000 case 512:
14001 oappend ("QWORD PTR ");
14002 break;
14003 default:
14004 abort ();
14005 }
14006 break;
14007 case xmmqd_mode:
14008 if (!need_vex)
14009 abort ();
14010
14011 switch (vex.length)
14012 {
14013 case 128:
14014 oappend ("DWORD PTR ");
14015 break;
14016 case 256:
14017 oappend ("QWORD PTR ");
14018 break;
14019 case 512:
14020 oappend ("XMMWORD PTR ");
14021 break;
14022 default:
14023 abort ();
14024 }
14025 break;
14026 case ymmq_mode:
14027 if (!need_vex)
14028 abort ();
14029
14030 switch (vex.length)
14031 {
14032 case 128:
14033 oappend ("QWORD PTR ");
14034 break;
14035 case 256:
14036 oappend ("YMMWORD PTR ");
14037 break;
14038 case 512:
14039 oappend ("ZMMWORD PTR ");
14040 break;
14041 default:
14042 abort ();
14043 }
14044 break;
14045 case ymmxmm_mode:
14046 if (!need_vex)
14047 abort ();
14048
14049 switch (vex.length)
14050 {
14051 case 128:
14052 case 256:
14053 oappend ("XMMWORD PTR ");
14054 break;
14055 default:
14056 abort ();
14057 }
14058 break;
14059 case o_mode:
14060 oappend ("OWORD PTR ");
14061 break;
14062 case xmm_mdq_mode:
14063 case vex_w_dq_mode:
14064 case vex_scalar_w_dq_mode:
14065 if (!need_vex)
14066 abort ();
14067
14068 if (vex.w)
14069 oappend ("QWORD PTR ");
14070 else
14071 oappend ("DWORD PTR ");
14072 break;
14073 case vex_vsib_d_w_dq_mode:
14074 case vex_vsib_q_w_dq_mode:
14075 if (!need_vex)
14076 abort ();
14077
14078 if (!vex.evex)
14079 {
14080 if (vex.w)
14081 oappend ("QWORD PTR ");
14082 else
14083 oappend ("DWORD PTR ");
14084 }
14085 else
14086 {
14087 if (vex.length != 512)
14088 abort ();
14089 oappend ("ZMMWORD PTR ");
14090 }
14091 break;
14092 case mask_mode:
14093 if (!need_vex)
14094 abort ();
14095 /* Currently the only instructions, which allows either mask or
14096 memory operand, are AVX512's KMOVW instructions. They need
14097 Word-sized operand. */
14098 if (vex.w || vex.length != 128)
14099 abort ();
14100 oappend ("WORD PTR ");
14101 break;
14102 case v_bnd_mode:
14103 default:
14104 break;
14105 }
14106 }
14107
14108 static void
14109 OP_E_register (int bytemode, int sizeflag)
14110 {
14111 int reg = modrm.rm;
14112 const char **names;
14113
14114 USED_REX (REX_B);
14115 if ((rex & REX_B))
14116 reg += 8;
14117
14118 if ((sizeflag & SUFFIX_ALWAYS)
14119 && (bytemode == b_swap_mode || bytemode == v_swap_mode))
14120 swap_operand ();
14121
14122 switch (bytemode)
14123 {
14124 case b_mode:
14125 case b_swap_mode:
14126 USED_REX (0);
14127 if (rex)
14128 names = names8rex;
14129 else
14130 names = names8;
14131 break;
14132 case w_mode:
14133 names = names16;
14134 break;
14135 case d_mode:
14136 names = names32;
14137 break;
14138 case q_mode:
14139 names = names64;
14140 break;
14141 case m_mode:
14142 case v_bnd_mode:
14143 names = address_mode == mode_64bit ? names64 : names32;
14144 break;
14145 case bnd_mode:
14146 names = names_bnd;
14147 break;
14148 case stack_v_mode:
14149 if (address_mode == mode_64bit && ((sizeflag & DFLAG) || (rex & REX_W)))
14150 {
14151 names = names64;
14152 break;
14153 }
14154 bytemode = v_mode;
14155 /* FALLTHRU */
14156 case v_mode:
14157 case v_swap_mode:
14158 case dq_mode:
14159 case dqb_mode:
14160 case dqd_mode:
14161 case dqw_mode:
14162 USED_REX (REX_W);
14163 if (rex & REX_W)
14164 names = names64;
14165 else
14166 {
14167 if ((sizeflag & DFLAG)
14168 || (bytemode != v_mode
14169 && bytemode != v_swap_mode))
14170 names = names32;
14171 else
14172 names = names16;
14173 used_prefixes |= (prefixes & PREFIX_DATA);
14174 }
14175 break;
14176 case mask_mode:
14177 names = names_mask;
14178 break;
14179 case 0:
14180 return;
14181 default:
14182 oappend (INTERNAL_DISASSEMBLER_ERROR);
14183 return;
14184 }
14185 oappend (names[reg]);
14186 }
14187
14188 static void
14189 OP_E_memory (int bytemode, int sizeflag)
14190 {
14191 bfd_vma disp = 0;
14192 int add = (rex & REX_B) ? 8 : 0;
14193 int riprel = 0;
14194 int shift;
14195
14196 if (vex.evex)
14197 {
14198 /* In EVEX, if operand doesn't allow broadcast, vex.b should be 0. */
14199 if (vex.b
14200 && bytemode != x_mode
14201 && bytemode != evex_half_bcst_xmmq_mode)
14202 {
14203 BadOp ();
14204 return;
14205 }
14206 switch (bytemode)
14207 {
14208 case vex_vsib_d_w_dq_mode:
14209 case vex_vsib_q_w_dq_mode:
14210 case evex_x_gscat_mode:
14211 case xmm_mdq_mode:
14212 shift = vex.w ? 3 : 2;
14213 break;
14214 case x_mode:
14215 case evex_half_bcst_xmmq_mode:
14216 if (vex.b)
14217 {
14218 shift = vex.w ? 3 : 2;
14219 break;
14220 }
14221 /* Fall through if vex.b == 0. */
14222 case xmmqd_mode:
14223 case xmmdw_mode:
14224 case xmmq_mode:
14225 case ymmq_mode:
14226 case evex_x_nobcst_mode:
14227 case x_swap_mode:
14228 switch (vex.length)
14229 {
14230 case 128:
14231 shift = 4;
14232 break;
14233 case 256:
14234 shift = 5;
14235 break;
14236 case 512:
14237 shift = 6;
14238 break;
14239 default:
14240 abort ();
14241 }
14242 break;
14243 case ymm_mode:
14244 shift = 5;
14245 break;
14246 case xmm_mode:
14247 shift = 4;
14248 break;
14249 case xmm_mq_mode:
14250 case q_mode:
14251 case q_scalar_mode:
14252 case q_swap_mode:
14253 case q_scalar_swap_mode:
14254 shift = 3;
14255 break;
14256 case dqd_mode:
14257 case xmm_md_mode:
14258 case d_mode:
14259 case d_scalar_mode:
14260 case d_swap_mode:
14261 case d_scalar_swap_mode:
14262 shift = 2;
14263 break;
14264 case xmm_mw_mode:
14265 shift = 1;
14266 break;
14267 case xmm_mb_mode:
14268 shift = 0;
14269 break;
14270 default:
14271 abort ();
14272 }
14273 /* Make necessary corrections to shift for modes that need it.
14274 For these modes we currently have shift 4, 5 or 6 depending on
14275 vex.length (it corresponds to xmmword, ymmword or zmmword
14276 operand). We might want to make it 3, 4 or 5 (e.g. for
14277 xmmq_mode). In case of broadcast enabled the corrections
14278 aren't needed, as element size is always 32 or 64 bits. */
14279 if (bytemode == xmmq_mode
14280 || (bytemode == evex_half_bcst_xmmq_mode
14281 && !vex.b))
14282 shift -= 1;
14283 else if (bytemode == xmmqd_mode)
14284 shift -= 2;
14285 else if (bytemode == xmmdw_mode)
14286 shift -= 3;
14287 }
14288 else
14289 shift = 0;
14290
14291 USED_REX (REX_B);
14292 if (intel_syntax)
14293 intel_operand_size (bytemode, sizeflag);
14294 append_seg ();
14295
14296 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
14297 {
14298 /* 32/64 bit address mode */
14299 int havedisp;
14300 int havesib;
14301 int havebase;
14302 int haveindex;
14303 int needindex;
14304 int base, rbase;
14305 int vindex = 0;
14306 int scale = 0;
14307 int addr32flag = !((sizeflag & AFLAG)
14308 || bytemode == v_bnd_mode
14309 || bytemode == bnd_mode);
14310 const char **indexes64 = names64;
14311 const char **indexes32 = names32;
14312
14313 havesib = 0;
14314 havebase = 1;
14315 haveindex = 0;
14316 base = modrm.rm;
14317
14318 if (base == 4)
14319 {
14320 havesib = 1;
14321 vindex = sib.index;
14322 USED_REX (REX_X);
14323 if (rex & REX_X)
14324 vindex += 8;
14325 switch (bytemode)
14326 {
14327 case vex_vsib_d_w_dq_mode:
14328 case vex_vsib_q_w_dq_mode:
14329 if (!need_vex)
14330 abort ();
14331 if (vex.evex)
14332 {
14333 if (!vex.v)
14334 vindex += 16;
14335 }
14336
14337 haveindex = 1;
14338 switch (vex.length)
14339 {
14340 case 128:
14341 indexes64 = indexes32 = names_xmm;
14342 break;
14343 case 256:
14344 if (!vex.w || bytemode == vex_vsib_q_w_dq_mode)
14345 indexes64 = indexes32 = names_ymm;
14346 else
14347 indexes64 = indexes32 = names_xmm;
14348 break;
14349 case 512:
14350 if (!vex.w || bytemode == vex_vsib_q_w_dq_mode)
14351 indexes64 = indexes32 = names_zmm;
14352 else
14353 indexes64 = indexes32 = names_ymm;
14354 break;
14355 default:
14356 abort ();
14357 }
14358 break;
14359 default:
14360 haveindex = vindex != 4;
14361 break;
14362 }
14363 scale = sib.scale;
14364 base = sib.base;
14365 codep++;
14366 }
14367 rbase = base + add;
14368
14369 switch (modrm.mod)
14370 {
14371 case 0:
14372 if (base == 5)
14373 {
14374 havebase = 0;
14375 if (address_mode == mode_64bit && !havesib)
14376 riprel = 1;
14377 disp = get32s ();
14378 }
14379 break;
14380 case 1:
14381 FETCH_DATA (the_info, codep + 1);
14382 disp = *codep++;
14383 if ((disp & 0x80) != 0)
14384 disp -= 0x100;
14385 if (vex.evex && shift > 0)
14386 disp <<= shift;
14387 break;
14388 case 2:
14389 disp = get32s ();
14390 break;
14391 }
14392
14393 /* In 32bit mode, we need index register to tell [offset] from
14394 [eiz*1 + offset]. */
14395 needindex = (havesib
14396 && !havebase
14397 && !haveindex
14398 && address_mode == mode_32bit);
14399 havedisp = (havebase
14400 || needindex
14401 || (havesib && (haveindex || scale != 0)));
14402
14403 if (!intel_syntax)
14404 if (modrm.mod != 0 || base == 5)
14405 {
14406 if (havedisp || riprel)
14407 print_displacement (scratchbuf, disp);
14408 else
14409 print_operand_value (scratchbuf, 1, disp);
14410 oappend (scratchbuf);
14411 if (riprel)
14412 {
14413 set_op (disp, 1);
14414 oappend (sizeflag & AFLAG ? "(%rip)" : "(%eip)");
14415 }
14416 }
14417
14418 if ((havebase || haveindex || riprel)
14419 && (bytemode != v_bnd_mode)
14420 && (bytemode != bnd_mode))
14421 used_prefixes |= PREFIX_ADDR;
14422
14423 if (havedisp || (intel_syntax && riprel))
14424 {
14425 *obufp++ = open_char;
14426 if (intel_syntax && riprel)
14427 {
14428 set_op (disp, 1);
14429 oappend (sizeflag & AFLAG ? "rip" : "eip");
14430 }
14431 *obufp = '\0';
14432 if (havebase)
14433 oappend (address_mode == mode_64bit && !addr32flag
14434 ? names64[rbase] : names32[rbase]);
14435 if (havesib)
14436 {
14437 /* ESP/RSP won't allow index. If base isn't ESP/RSP,
14438 print index to tell base + index from base. */
14439 if (scale != 0
14440 || needindex
14441 || haveindex
14442 || (havebase && base != ESP_REG_NUM))
14443 {
14444 if (!intel_syntax || havebase)
14445 {
14446 *obufp++ = separator_char;
14447 *obufp = '\0';
14448 }
14449 if (haveindex)
14450 oappend (address_mode == mode_64bit && !addr32flag
14451 ? indexes64[vindex] : indexes32[vindex]);
14452 else
14453 oappend (address_mode == mode_64bit && !addr32flag
14454 ? index64 : index32);
14455
14456 *obufp++ = scale_char;
14457 *obufp = '\0';
14458 sprintf (scratchbuf, "%d", 1 << scale);
14459 oappend (scratchbuf);
14460 }
14461 }
14462 if (intel_syntax
14463 && (disp || modrm.mod != 0 || base == 5))
14464 {
14465 if (!havedisp || (bfd_signed_vma) disp >= 0)
14466 {
14467 *obufp++ = '+';
14468 *obufp = '\0';
14469 }
14470 else if (modrm.mod != 1 && disp != -disp)
14471 {
14472 *obufp++ = '-';
14473 *obufp = '\0';
14474 disp = - (bfd_signed_vma) disp;
14475 }
14476
14477 if (havedisp)
14478 print_displacement (scratchbuf, disp);
14479 else
14480 print_operand_value (scratchbuf, 1, disp);
14481 oappend (scratchbuf);
14482 }
14483
14484 *obufp++ = close_char;
14485 *obufp = '\0';
14486 }
14487 else if (intel_syntax)
14488 {
14489 if (modrm.mod != 0 || base == 5)
14490 {
14491 if (prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
14492 | PREFIX_ES | PREFIX_FS | PREFIX_GS))
14493 ;
14494 else
14495 {
14496 oappend (names_seg[ds_reg - es_reg]);
14497 oappend (":");
14498 }
14499 print_operand_value (scratchbuf, 1, disp);
14500 oappend (scratchbuf);
14501 }
14502 }
14503 }
14504 else
14505 {
14506 /* 16 bit address mode */
14507 used_prefixes |= prefixes & PREFIX_ADDR;
14508 switch (modrm.mod)
14509 {
14510 case 0:
14511 if (modrm.rm == 6)
14512 {
14513 disp = get16 ();
14514 if ((disp & 0x8000) != 0)
14515 disp -= 0x10000;
14516 }
14517 break;
14518 case 1:
14519 FETCH_DATA (the_info, codep + 1);
14520 disp = *codep++;
14521 if ((disp & 0x80) != 0)
14522 disp -= 0x100;
14523 break;
14524 case 2:
14525 disp = get16 ();
14526 if ((disp & 0x8000) != 0)
14527 disp -= 0x10000;
14528 break;
14529 }
14530
14531 if (!intel_syntax)
14532 if (modrm.mod != 0 || modrm.rm == 6)
14533 {
14534 print_displacement (scratchbuf, disp);
14535 oappend (scratchbuf);
14536 }
14537
14538 if (modrm.mod != 0 || modrm.rm != 6)
14539 {
14540 *obufp++ = open_char;
14541 *obufp = '\0';
14542 oappend (index16[modrm.rm]);
14543 if (intel_syntax
14544 && (disp || modrm.mod != 0 || modrm.rm == 6))
14545 {
14546 if ((bfd_signed_vma) disp >= 0)
14547 {
14548 *obufp++ = '+';
14549 *obufp = '\0';
14550 }
14551 else if (modrm.mod != 1)
14552 {
14553 *obufp++ = '-';
14554 *obufp = '\0';
14555 disp = - (bfd_signed_vma) disp;
14556 }
14557
14558 print_displacement (scratchbuf, disp);
14559 oappend (scratchbuf);
14560 }
14561
14562 *obufp++ = close_char;
14563 *obufp = '\0';
14564 }
14565 else if (intel_syntax)
14566 {
14567 if (prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
14568 | PREFIX_ES | PREFIX_FS | PREFIX_GS))
14569 ;
14570 else
14571 {
14572 oappend (names_seg[ds_reg - es_reg]);
14573 oappend (":");
14574 }
14575 print_operand_value (scratchbuf, 1, disp & 0xffff);
14576 oappend (scratchbuf);
14577 }
14578 }
14579 if (vex.evex && vex.b
14580 && (bytemode == x_mode
14581 || bytemode == evex_half_bcst_xmmq_mode))
14582 {
14583 if (vex.w || bytemode == evex_half_bcst_xmmq_mode)
14584 oappend ("{1to8}");
14585 else
14586 oappend ("{1to16}");
14587 }
14588 }
14589
14590 static void
14591 OP_E (int bytemode, int sizeflag)
14592 {
14593 /* Skip mod/rm byte. */
14594 MODRM_CHECK;
14595 codep++;
14596
14597 if (modrm.mod == 3)
14598 OP_E_register (bytemode, sizeflag);
14599 else
14600 OP_E_memory (bytemode, sizeflag);
14601 }
14602
14603 static void
14604 OP_G (int bytemode, int sizeflag)
14605 {
14606 int add = 0;
14607 USED_REX (REX_R);
14608 if (rex & REX_R)
14609 add += 8;
14610 switch (bytemode)
14611 {
14612 case b_mode:
14613 USED_REX (0);
14614 if (rex)
14615 oappend (names8rex[modrm.reg + add]);
14616 else
14617 oappend (names8[modrm.reg + add]);
14618 break;
14619 case w_mode:
14620 oappend (names16[modrm.reg + add]);
14621 break;
14622 case d_mode:
14623 oappend (names32[modrm.reg + add]);
14624 break;
14625 case q_mode:
14626 oappend (names64[modrm.reg + add]);
14627 break;
14628 case bnd_mode:
14629 oappend (names_bnd[modrm.reg]);
14630 break;
14631 case v_mode:
14632 case dq_mode:
14633 case dqb_mode:
14634 case dqd_mode:
14635 case dqw_mode:
14636 USED_REX (REX_W);
14637 if (rex & REX_W)
14638 oappend (names64[modrm.reg + add]);
14639 else
14640 {
14641 if ((sizeflag & DFLAG) || bytemode != v_mode)
14642 oappend (names32[modrm.reg + add]);
14643 else
14644 oappend (names16[modrm.reg + add]);
14645 used_prefixes |= (prefixes & PREFIX_DATA);
14646 }
14647 break;
14648 case m_mode:
14649 if (address_mode == mode_64bit)
14650 oappend (names64[modrm.reg + add]);
14651 else
14652 oappend (names32[modrm.reg + add]);
14653 break;
14654 case mask_mode:
14655 oappend (names_mask[modrm.reg + add]);
14656 break;
14657 default:
14658 oappend (INTERNAL_DISASSEMBLER_ERROR);
14659 break;
14660 }
14661 }
14662
14663 static bfd_vma
14664 get64 (void)
14665 {
14666 bfd_vma x;
14667 #ifdef BFD64
14668 unsigned int a;
14669 unsigned int b;
14670
14671 FETCH_DATA (the_info, codep + 8);
14672 a = *codep++ & 0xff;
14673 a |= (*codep++ & 0xff) << 8;
14674 a |= (*codep++ & 0xff) << 16;
14675 a |= (*codep++ & 0xff) << 24;
14676 b = *codep++ & 0xff;
14677 b |= (*codep++ & 0xff) << 8;
14678 b |= (*codep++ & 0xff) << 16;
14679 b |= (*codep++ & 0xff) << 24;
14680 x = a + ((bfd_vma) b << 32);
14681 #else
14682 abort ();
14683 x = 0;
14684 #endif
14685 return x;
14686 }
14687
14688 static bfd_signed_vma
14689 get32 (void)
14690 {
14691 bfd_signed_vma x = 0;
14692
14693 FETCH_DATA (the_info, codep + 4);
14694 x = *codep++ & (bfd_signed_vma) 0xff;
14695 x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
14696 x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
14697 x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
14698 return x;
14699 }
14700
14701 static bfd_signed_vma
14702 get32s (void)
14703 {
14704 bfd_signed_vma x = 0;
14705
14706 FETCH_DATA (the_info, codep + 4);
14707 x = *codep++ & (bfd_signed_vma) 0xff;
14708 x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
14709 x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
14710 x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
14711
14712 x = (x ^ ((bfd_signed_vma) 1 << 31)) - ((bfd_signed_vma) 1 << 31);
14713
14714 return x;
14715 }
14716
14717 static int
14718 get16 (void)
14719 {
14720 int x = 0;
14721
14722 FETCH_DATA (the_info, codep + 2);
14723 x = *codep++ & 0xff;
14724 x |= (*codep++ & 0xff) << 8;
14725 return x;
14726 }
14727
14728 static void
14729 set_op (bfd_vma op, int riprel)
14730 {
14731 op_index[op_ad] = op_ad;
14732 if (address_mode == mode_64bit)
14733 {
14734 op_address[op_ad] = op;
14735 op_riprel[op_ad] = riprel;
14736 }
14737 else
14738 {
14739 /* Mask to get a 32-bit address. */
14740 op_address[op_ad] = op & 0xffffffff;
14741 op_riprel[op_ad] = riprel & 0xffffffff;
14742 }
14743 }
14744
14745 static void
14746 OP_REG (int code, int sizeflag)
14747 {
14748 const char *s;
14749 int add;
14750
14751 switch (code)
14752 {
14753 case es_reg: case ss_reg: case cs_reg:
14754 case ds_reg: case fs_reg: case gs_reg:
14755 oappend (names_seg[code - es_reg]);
14756 return;
14757 }
14758
14759 USED_REX (REX_B);
14760 if (rex & REX_B)
14761 add = 8;
14762 else
14763 add = 0;
14764
14765 switch (code)
14766 {
14767 case ax_reg: case cx_reg: case dx_reg: case bx_reg:
14768 case sp_reg: case bp_reg: case si_reg: case di_reg:
14769 s = names16[code - ax_reg + add];
14770 break;
14771 case al_reg: case ah_reg: case cl_reg: case ch_reg:
14772 case dl_reg: case dh_reg: case bl_reg: case bh_reg:
14773 USED_REX (0);
14774 if (rex)
14775 s = names8rex[code - al_reg + add];
14776 else
14777 s = names8[code - al_reg];
14778 break;
14779 case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
14780 case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
14781 if (address_mode == mode_64bit
14782 && ((sizeflag & DFLAG) || (rex & REX_W)))
14783 {
14784 s = names64[code - rAX_reg + add];
14785 break;
14786 }
14787 code += eAX_reg - rAX_reg;
14788 /* Fall through. */
14789 case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
14790 case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
14791 USED_REX (REX_W);
14792 if (rex & REX_W)
14793 s = names64[code - eAX_reg + add];
14794 else
14795 {
14796 if (sizeflag & DFLAG)
14797 s = names32[code - eAX_reg + add];
14798 else
14799 s = names16[code - eAX_reg + add];
14800 used_prefixes |= (prefixes & PREFIX_DATA);
14801 }
14802 break;
14803 default:
14804 s = INTERNAL_DISASSEMBLER_ERROR;
14805 break;
14806 }
14807 oappend (s);
14808 }
14809
14810 static void
14811 OP_IMREG (int code, int sizeflag)
14812 {
14813 const char *s;
14814
14815 switch (code)
14816 {
14817 case indir_dx_reg:
14818 if (intel_syntax)
14819 s = "dx";
14820 else
14821 s = "(%dx)";
14822 break;
14823 case ax_reg: case cx_reg: case dx_reg: case bx_reg:
14824 case sp_reg: case bp_reg: case si_reg: case di_reg:
14825 s = names16[code - ax_reg];
14826 break;
14827 case es_reg: case ss_reg: case cs_reg:
14828 case ds_reg: case fs_reg: case gs_reg:
14829 s = names_seg[code - es_reg];
14830 break;
14831 case al_reg: case ah_reg: case cl_reg: case ch_reg:
14832 case dl_reg: case dh_reg: case bl_reg: case bh_reg:
14833 USED_REX (0);
14834 if (rex)
14835 s = names8rex[code - al_reg];
14836 else
14837 s = names8[code - al_reg];
14838 break;
14839 case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
14840 case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
14841 USED_REX (REX_W);
14842 if (rex & REX_W)
14843 s = names64[code - eAX_reg];
14844 else
14845 {
14846 if (sizeflag & DFLAG)
14847 s = names32[code - eAX_reg];
14848 else
14849 s = names16[code - eAX_reg];
14850 used_prefixes |= (prefixes & PREFIX_DATA);
14851 }
14852 break;
14853 case z_mode_ax_reg:
14854 if ((rex & REX_W) || (sizeflag & DFLAG))
14855 s = *names32;
14856 else
14857 s = *names16;
14858 if (!(rex & REX_W))
14859 used_prefixes |= (prefixes & PREFIX_DATA);
14860 break;
14861 default:
14862 s = INTERNAL_DISASSEMBLER_ERROR;
14863 break;
14864 }
14865 oappend (s);
14866 }
14867
14868 static void
14869 OP_I (int bytemode, int sizeflag)
14870 {
14871 bfd_signed_vma op;
14872 bfd_signed_vma mask = -1;
14873
14874 switch (bytemode)
14875 {
14876 case b_mode:
14877 FETCH_DATA (the_info, codep + 1);
14878 op = *codep++;
14879 mask = 0xff;
14880 break;
14881 case q_mode:
14882 if (address_mode == mode_64bit)
14883 {
14884 op = get32s ();
14885 break;
14886 }
14887 /* Fall through. */
14888 case v_mode:
14889 USED_REX (REX_W);
14890 if (rex & REX_W)
14891 op = get32s ();
14892 else
14893 {
14894 if (sizeflag & DFLAG)
14895 {
14896 op = get32 ();
14897 mask = 0xffffffff;
14898 }
14899 else
14900 {
14901 op = get16 ();
14902 mask = 0xfffff;
14903 }
14904 used_prefixes |= (prefixes & PREFIX_DATA);
14905 }
14906 break;
14907 case w_mode:
14908 mask = 0xfffff;
14909 op = get16 ();
14910 break;
14911 case const_1_mode:
14912 if (intel_syntax)
14913 oappend ("1");
14914 return;
14915 default:
14916 oappend (INTERNAL_DISASSEMBLER_ERROR);
14917 return;
14918 }
14919
14920 op &= mask;
14921 scratchbuf[0] = '$';
14922 print_operand_value (scratchbuf + 1, 1, op);
14923 oappend_maybe_intel (scratchbuf);
14924 scratchbuf[0] = '\0';
14925 }
14926
14927 static void
14928 OP_I64 (int bytemode, int sizeflag)
14929 {
14930 bfd_signed_vma op;
14931 bfd_signed_vma mask = -1;
14932
14933 if (address_mode != mode_64bit)
14934 {
14935 OP_I (bytemode, sizeflag);
14936 return;
14937 }
14938
14939 switch (bytemode)
14940 {
14941 case b_mode:
14942 FETCH_DATA (the_info, codep + 1);
14943 op = *codep++;
14944 mask = 0xff;
14945 break;
14946 case v_mode:
14947 USED_REX (REX_W);
14948 if (rex & REX_W)
14949 op = get64 ();
14950 else
14951 {
14952 if (sizeflag & DFLAG)
14953 {
14954 op = get32 ();
14955 mask = 0xffffffff;
14956 }
14957 else
14958 {
14959 op = get16 ();
14960 mask = 0xfffff;
14961 }
14962 used_prefixes |= (prefixes & PREFIX_DATA);
14963 }
14964 break;
14965 case w_mode:
14966 mask = 0xfffff;
14967 op = get16 ();
14968 break;
14969 default:
14970 oappend (INTERNAL_DISASSEMBLER_ERROR);
14971 return;
14972 }
14973
14974 op &= mask;
14975 scratchbuf[0] = '$';
14976 print_operand_value (scratchbuf + 1, 1, op);
14977 oappend_maybe_intel (scratchbuf);
14978 scratchbuf[0] = '\0';
14979 }
14980
14981 static void
14982 OP_sI (int bytemode, int sizeflag)
14983 {
14984 bfd_signed_vma op;
14985
14986 switch (bytemode)
14987 {
14988 case b_mode:
14989 case b_T_mode:
14990 FETCH_DATA (the_info, codep + 1);
14991 op = *codep++;
14992 if ((op & 0x80) != 0)
14993 op -= 0x100;
14994 if (bytemode == b_T_mode)
14995 {
14996 if (address_mode != mode_64bit
14997 || !((sizeflag & DFLAG) || (rex & REX_W)))
14998 {
14999 /* The operand-size prefix is overridden by a REX prefix. */
15000 if ((sizeflag & DFLAG) || (rex & REX_W))
15001 op &= 0xffffffff;
15002 else
15003 op &= 0xffff;
15004 }
15005 }
15006 else
15007 {
15008 if (!(rex & REX_W))
15009 {
15010 if (sizeflag & DFLAG)
15011 op &= 0xffffffff;
15012 else
15013 op &= 0xffff;
15014 }
15015 }
15016 break;
15017 case v_mode:
15018 /* The operand-size prefix is overridden by a REX prefix. */
15019 if ((sizeflag & DFLAG) || (rex & REX_W))
15020 op = get32s ();
15021 else
15022 op = get16 ();
15023 break;
15024 default:
15025 oappend (INTERNAL_DISASSEMBLER_ERROR);
15026 return;
15027 }
15028
15029 scratchbuf[0] = '$';
15030 print_operand_value (scratchbuf + 1, 1, op);
15031 oappend_maybe_intel (scratchbuf);
15032 }
15033
15034 static void
15035 OP_J (int bytemode, int sizeflag)
15036 {
15037 bfd_vma disp;
15038 bfd_vma mask = -1;
15039 bfd_vma segment = 0;
15040
15041 switch (bytemode)
15042 {
15043 case b_mode:
15044 FETCH_DATA (the_info, codep + 1);
15045 disp = *codep++;
15046 if ((disp & 0x80) != 0)
15047 disp -= 0x100;
15048 break;
15049 case v_mode:
15050 USED_REX (REX_W);
15051 if ((sizeflag & DFLAG) || (rex & REX_W))
15052 disp = get32s ();
15053 else
15054 {
15055 disp = get16 ();
15056 if ((disp & 0x8000) != 0)
15057 disp -= 0x10000;
15058 /* In 16bit mode, address is wrapped around at 64k within
15059 the same segment. Otherwise, a data16 prefix on a jump
15060 instruction means that the pc is masked to 16 bits after
15061 the displacement is added! */
15062 mask = 0xffff;
15063 if ((prefixes & PREFIX_DATA) == 0)
15064 segment = ((start_pc + codep - start_codep)
15065 & ~((bfd_vma) 0xffff));
15066 }
15067 if (!(rex & REX_W))
15068 used_prefixes |= (prefixes & PREFIX_DATA);
15069 break;
15070 default:
15071 oappend (INTERNAL_DISASSEMBLER_ERROR);
15072 return;
15073 }
15074 disp = ((start_pc + (codep - start_codep) + disp) & mask) | segment;
15075 set_op (disp, 0);
15076 print_operand_value (scratchbuf, 1, disp);
15077 oappend (scratchbuf);
15078 }
15079
15080 static void
15081 OP_SEG (int bytemode, int sizeflag)
15082 {
15083 if (bytemode == w_mode)
15084 oappend (names_seg[modrm.reg]);
15085 else
15086 OP_E (modrm.mod == 3 ? bytemode : w_mode, sizeflag);
15087 }
15088
15089 static void
15090 OP_DIR (int dummy ATTRIBUTE_UNUSED, int sizeflag)
15091 {
15092 int seg, offset;
15093
15094 if (sizeflag & DFLAG)
15095 {
15096 offset = get32 ();
15097 seg = get16 ();
15098 }
15099 else
15100 {
15101 offset = get16 ();
15102 seg = get16 ();
15103 }
15104 used_prefixes |= (prefixes & PREFIX_DATA);
15105 if (intel_syntax)
15106 sprintf (scratchbuf, "0x%x:0x%x", seg, offset);
15107 else
15108 sprintf (scratchbuf, "$0x%x,$0x%x", seg, offset);
15109 oappend (scratchbuf);
15110 }
15111
15112 static void
15113 OP_OFF (int bytemode, int sizeflag)
15114 {
15115 bfd_vma off;
15116
15117 if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
15118 intel_operand_size (bytemode, sizeflag);
15119 append_seg ();
15120
15121 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
15122 off = get32 ();
15123 else
15124 off = get16 ();
15125
15126 if (intel_syntax)
15127 {
15128 if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
15129 | PREFIX_ES | PREFIX_FS | PREFIX_GS)))
15130 {
15131 oappend (names_seg[ds_reg - es_reg]);
15132 oappend (":");
15133 }
15134 }
15135 print_operand_value (scratchbuf, 1, off);
15136 oappend (scratchbuf);
15137 }
15138
15139 static void
15140 OP_OFF64 (int bytemode, int sizeflag)
15141 {
15142 bfd_vma off;
15143
15144 if (address_mode != mode_64bit
15145 || (prefixes & PREFIX_ADDR))
15146 {
15147 OP_OFF (bytemode, sizeflag);
15148 return;
15149 }
15150
15151 if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
15152 intel_operand_size (bytemode, sizeflag);
15153 append_seg ();
15154
15155 off = get64 ();
15156
15157 if (intel_syntax)
15158 {
15159 if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
15160 | PREFIX_ES | PREFIX_FS | PREFIX_GS)))
15161 {
15162 oappend (names_seg[ds_reg - es_reg]);
15163 oappend (":");
15164 }
15165 }
15166 print_operand_value (scratchbuf, 1, off);
15167 oappend (scratchbuf);
15168 }
15169
15170 static void
15171 ptr_reg (int code, int sizeflag)
15172 {
15173 const char *s;
15174
15175 *obufp++ = open_char;
15176 used_prefixes |= (prefixes & PREFIX_ADDR);
15177 if (address_mode == mode_64bit)
15178 {
15179 if (!(sizeflag & AFLAG))
15180 s = names32[code - eAX_reg];
15181 else
15182 s = names64[code - eAX_reg];
15183 }
15184 else if (sizeflag & AFLAG)
15185 s = names32[code - eAX_reg];
15186 else
15187 s = names16[code - eAX_reg];
15188 oappend (s);
15189 *obufp++ = close_char;
15190 *obufp = 0;
15191 }
15192
15193 static void
15194 OP_ESreg (int code, int sizeflag)
15195 {
15196 if (intel_syntax)
15197 {
15198 switch (codep[-1])
15199 {
15200 case 0x6d: /* insw/insl */
15201 intel_operand_size (z_mode, sizeflag);
15202 break;
15203 case 0xa5: /* movsw/movsl/movsq */
15204 case 0xa7: /* cmpsw/cmpsl/cmpsq */
15205 case 0xab: /* stosw/stosl */
15206 case 0xaf: /* scasw/scasl */
15207 intel_operand_size (v_mode, sizeflag);
15208 break;
15209 default:
15210 intel_operand_size (b_mode, sizeflag);
15211 }
15212 }
15213 oappend_maybe_intel ("%es:");
15214 ptr_reg (code, sizeflag);
15215 }
15216
15217 static void
15218 OP_DSreg (int code, int sizeflag)
15219 {
15220 if (intel_syntax)
15221 {
15222 switch (codep[-1])
15223 {
15224 case 0x6f: /* outsw/outsl */
15225 intel_operand_size (z_mode, sizeflag);
15226 break;
15227 case 0xa5: /* movsw/movsl/movsq */
15228 case 0xa7: /* cmpsw/cmpsl/cmpsq */
15229 case 0xad: /* lodsw/lodsl/lodsq */
15230 intel_operand_size (v_mode, sizeflag);
15231 break;
15232 default:
15233 intel_operand_size (b_mode, sizeflag);
15234 }
15235 }
15236 if ((prefixes
15237 & (PREFIX_CS
15238 | PREFIX_DS
15239 | PREFIX_SS
15240 | PREFIX_ES
15241 | PREFIX_FS
15242 | PREFIX_GS)) == 0)
15243 prefixes |= PREFIX_DS;
15244 append_seg ();
15245 ptr_reg (code, sizeflag);
15246 }
15247
15248 static void
15249 OP_C (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15250 {
15251 int add;
15252 if (rex & REX_R)
15253 {
15254 USED_REX (REX_R);
15255 add = 8;
15256 }
15257 else if (address_mode != mode_64bit && (prefixes & PREFIX_LOCK))
15258 {
15259 all_prefixes[last_lock_prefix] = 0;
15260 used_prefixes |= PREFIX_LOCK;
15261 add = 8;
15262 }
15263 else
15264 add = 0;
15265 sprintf (scratchbuf, "%%cr%d", modrm.reg + add);
15266 oappend_maybe_intel (scratchbuf);
15267 }
15268
15269 static void
15270 OP_D (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15271 {
15272 int add;
15273 USED_REX (REX_R);
15274 if (rex & REX_R)
15275 add = 8;
15276 else
15277 add = 0;
15278 if (intel_syntax)
15279 sprintf (scratchbuf, "db%d", modrm.reg + add);
15280 else
15281 sprintf (scratchbuf, "%%db%d", modrm.reg + add);
15282 oappend (scratchbuf);
15283 }
15284
15285 static void
15286 OP_T (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15287 {
15288 sprintf (scratchbuf, "%%tr%d", modrm.reg);
15289 oappend_maybe_intel (scratchbuf);
15290 }
15291
15292 static void
15293 OP_R (int bytemode, int sizeflag)
15294 {
15295 if (modrm.mod == 3)
15296 OP_E (bytemode, sizeflag);
15297 else
15298 BadOp ();
15299 }
15300
15301 static void
15302 OP_MMX (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15303 {
15304 int reg = modrm.reg;
15305 const char **names;
15306
15307 used_prefixes |= (prefixes & PREFIX_DATA);
15308 if (prefixes & PREFIX_DATA)
15309 {
15310 names = names_xmm;
15311 USED_REX (REX_R);
15312 if (rex & REX_R)
15313 reg += 8;
15314 }
15315 else
15316 names = names_mm;
15317 oappend (names[reg]);
15318 }
15319
15320 static void
15321 OP_XMM (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
15322 {
15323 int reg = modrm.reg;
15324 const char **names;
15325
15326 USED_REX (REX_R);
15327 if (rex & REX_R)
15328 reg += 8;
15329 if (vex.evex)
15330 {
15331 if (!vex.r)
15332 reg += 16;
15333 }
15334
15335 if (need_vex
15336 && bytemode != xmm_mode
15337 && bytemode != xmmq_mode
15338 && bytemode != evex_half_bcst_xmmq_mode
15339 && bytemode != ymm_mode
15340 && bytemode != scalar_mode)
15341 {
15342 switch (vex.length)
15343 {
15344 case 128:
15345 names = names_xmm;
15346 break;
15347 case 256:
15348 if (vex.w || bytemode != vex_vsib_q_w_dq_mode)
15349 names = names_ymm;
15350 else
15351 names = names_xmm;
15352 break;
15353 case 512:
15354 names = names_zmm;
15355 break;
15356 default:
15357 abort ();
15358 }
15359 }
15360 else if (bytemode == xmmq_mode
15361 || bytemode == evex_half_bcst_xmmq_mode)
15362 {
15363 switch (vex.length)
15364 {
15365 case 128:
15366 case 256:
15367 names = names_xmm;
15368 break;
15369 case 512:
15370 names = names_ymm;
15371 break;
15372 default:
15373 abort ();
15374 }
15375 }
15376 else if (bytemode == ymm_mode)
15377 names = names_ymm;
15378 else
15379 names = names_xmm;
15380 oappend (names[reg]);
15381 }
15382
15383 static void
15384 OP_EM (int bytemode, int sizeflag)
15385 {
15386 int reg;
15387 const char **names;
15388
15389 if (modrm.mod != 3)
15390 {
15391 if (intel_syntax
15392 && (bytemode == v_mode || bytemode == v_swap_mode))
15393 {
15394 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
15395 used_prefixes |= (prefixes & PREFIX_DATA);
15396 }
15397 OP_E (bytemode, sizeflag);
15398 return;
15399 }
15400
15401 if ((sizeflag & SUFFIX_ALWAYS) && bytemode == v_swap_mode)
15402 swap_operand ();
15403
15404 /* Skip mod/rm byte. */
15405 MODRM_CHECK;
15406 codep++;
15407 used_prefixes |= (prefixes & PREFIX_DATA);
15408 reg = modrm.rm;
15409 if (prefixes & PREFIX_DATA)
15410 {
15411 names = names_xmm;
15412 USED_REX (REX_B);
15413 if (rex & REX_B)
15414 reg += 8;
15415 }
15416 else
15417 names = names_mm;
15418 oappend (names[reg]);
15419 }
15420
15421 /* cvt* are the only instructions in sse2 which have
15422 both SSE and MMX operands and also have 0x66 prefix
15423 in their opcode. 0x66 was originally used to differentiate
15424 between SSE and MMX instruction(operands). So we have to handle the
15425 cvt* separately using OP_EMC and OP_MXC */
15426 static void
15427 OP_EMC (int bytemode, int sizeflag)
15428 {
15429 if (modrm.mod != 3)
15430 {
15431 if (intel_syntax && bytemode == v_mode)
15432 {
15433 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
15434 used_prefixes |= (prefixes & PREFIX_DATA);
15435 }
15436 OP_E (bytemode, sizeflag);
15437 return;
15438 }
15439
15440 /* Skip mod/rm byte. */
15441 MODRM_CHECK;
15442 codep++;
15443 used_prefixes |= (prefixes & PREFIX_DATA);
15444 oappend (names_mm[modrm.rm]);
15445 }
15446
15447 static void
15448 OP_MXC (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15449 {
15450 used_prefixes |= (prefixes & PREFIX_DATA);
15451 oappend (names_mm[modrm.reg]);
15452 }
15453
15454 static void
15455 OP_EX (int bytemode, int sizeflag)
15456 {
15457 int reg;
15458 const char **names;
15459
15460 /* Skip mod/rm byte. */
15461 MODRM_CHECK;
15462 codep++;
15463
15464 if (modrm.mod != 3)
15465 {
15466 OP_E_memory (bytemode, sizeflag);
15467 return;
15468 }
15469
15470 reg = modrm.rm;
15471 USED_REX (REX_B);
15472 if (rex & REX_B)
15473 reg += 8;
15474 if (vex.evex)
15475 {
15476 USED_REX (REX_X);
15477 if ((rex & REX_X))
15478 reg += 16;
15479 }
15480
15481 if ((sizeflag & SUFFIX_ALWAYS)
15482 && (bytemode == x_swap_mode
15483 || bytemode == d_swap_mode
15484 || bytemode == d_scalar_swap_mode
15485 || bytemode == q_swap_mode
15486 || bytemode == q_scalar_swap_mode))
15487 swap_operand ();
15488
15489 if (need_vex
15490 && bytemode != xmm_mode
15491 && bytemode != xmmdw_mode
15492 && bytemode != xmmqd_mode
15493 && bytemode != xmm_mb_mode
15494 && bytemode != xmm_mw_mode
15495 && bytemode != xmm_md_mode
15496 && bytemode != xmm_mq_mode
15497 && bytemode != xmm_mdq_mode
15498 && bytemode != xmmq_mode
15499 && bytemode != evex_half_bcst_xmmq_mode
15500 && bytemode != ymm_mode
15501 && bytemode != d_scalar_mode
15502 && bytemode != d_scalar_swap_mode
15503 && bytemode != q_scalar_mode
15504 && bytemode != q_scalar_swap_mode
15505 && bytemode != vex_scalar_w_dq_mode)
15506 {
15507 switch (vex.length)
15508 {
15509 case 128:
15510 names = names_xmm;
15511 break;
15512 case 256:
15513 names = names_ymm;
15514 break;
15515 case 512:
15516 names = names_zmm;
15517 break;
15518 default:
15519 abort ();
15520 }
15521 }
15522 else if (bytemode == xmmq_mode
15523 || bytemode == evex_half_bcst_xmmq_mode)
15524 {
15525 switch (vex.length)
15526 {
15527 case 128:
15528 case 256:
15529 names = names_xmm;
15530 break;
15531 case 512:
15532 names = names_ymm;
15533 break;
15534 default:
15535 abort ();
15536 }
15537 }
15538 else if (bytemode == ymm_mode)
15539 names = names_ymm;
15540 else
15541 names = names_xmm;
15542 oappend (names[reg]);
15543 }
15544
15545 static void
15546 OP_MS (int bytemode, int sizeflag)
15547 {
15548 if (modrm.mod == 3)
15549 OP_EM (bytemode, sizeflag);
15550 else
15551 BadOp ();
15552 }
15553
15554 static void
15555 OP_XS (int bytemode, int sizeflag)
15556 {
15557 if (modrm.mod == 3)
15558 OP_EX (bytemode, sizeflag);
15559 else
15560 BadOp ();
15561 }
15562
15563 static void
15564 OP_M (int bytemode, int sizeflag)
15565 {
15566 if (modrm.mod == 3)
15567 /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
15568 BadOp ();
15569 else
15570 OP_E (bytemode, sizeflag);
15571 }
15572
15573 static void
15574 OP_0f07 (int bytemode, int sizeflag)
15575 {
15576 if (modrm.mod != 3 || modrm.rm != 0)
15577 BadOp ();
15578 else
15579 OP_E (bytemode, sizeflag);
15580 }
15581
15582 /* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
15583 32bit mode and "xchg %rax,%rax" in 64bit mode. */
15584
15585 static void
15586 NOP_Fixup1 (int bytemode, int sizeflag)
15587 {
15588 if ((prefixes & PREFIX_DATA) != 0
15589 || (rex != 0
15590 && rex != 0x48
15591 && address_mode == mode_64bit))
15592 OP_REG (bytemode, sizeflag);
15593 else
15594 strcpy (obuf, "nop");
15595 }
15596
15597 static void
15598 NOP_Fixup2 (int bytemode, int sizeflag)
15599 {
15600 if ((prefixes & PREFIX_DATA) != 0
15601 || (rex != 0
15602 && rex != 0x48
15603 && address_mode == mode_64bit))
15604 OP_IMREG (bytemode, sizeflag);
15605 }
15606
15607 static const char *const Suffix3DNow[] = {
15608 /* 00 */ NULL, NULL, NULL, NULL,
15609 /* 04 */ NULL, NULL, NULL, NULL,
15610 /* 08 */ NULL, NULL, NULL, NULL,
15611 /* 0C */ "pi2fw", "pi2fd", NULL, NULL,
15612 /* 10 */ NULL, NULL, NULL, NULL,
15613 /* 14 */ NULL, NULL, NULL, NULL,
15614 /* 18 */ NULL, NULL, NULL, NULL,
15615 /* 1C */ "pf2iw", "pf2id", NULL, NULL,
15616 /* 20 */ NULL, NULL, NULL, NULL,
15617 /* 24 */ NULL, NULL, NULL, NULL,
15618 /* 28 */ NULL, NULL, NULL, NULL,
15619 /* 2C */ NULL, NULL, NULL, NULL,
15620 /* 30 */ NULL, NULL, NULL, NULL,
15621 /* 34 */ NULL, NULL, NULL, NULL,
15622 /* 38 */ NULL, NULL, NULL, NULL,
15623 /* 3C */ NULL, NULL, NULL, NULL,
15624 /* 40 */ NULL, NULL, NULL, NULL,
15625 /* 44 */ NULL, NULL, NULL, NULL,
15626 /* 48 */ NULL, NULL, NULL, NULL,
15627 /* 4C */ NULL, NULL, NULL, NULL,
15628 /* 50 */ NULL, NULL, NULL, NULL,
15629 /* 54 */ NULL, NULL, NULL, NULL,
15630 /* 58 */ NULL, NULL, NULL, NULL,
15631 /* 5C */ NULL, NULL, NULL, NULL,
15632 /* 60 */ NULL, NULL, NULL, NULL,
15633 /* 64 */ NULL, NULL, NULL, NULL,
15634 /* 68 */ NULL, NULL, NULL, NULL,
15635 /* 6C */ NULL, NULL, NULL, NULL,
15636 /* 70 */ NULL, NULL, NULL, NULL,
15637 /* 74 */ NULL, NULL, NULL, NULL,
15638 /* 78 */ NULL, NULL, NULL, NULL,
15639 /* 7C */ NULL, NULL, NULL, NULL,
15640 /* 80 */ NULL, NULL, NULL, NULL,
15641 /* 84 */ NULL, NULL, NULL, NULL,
15642 /* 88 */ NULL, NULL, "pfnacc", NULL,
15643 /* 8C */ NULL, NULL, "pfpnacc", NULL,
15644 /* 90 */ "pfcmpge", NULL, NULL, NULL,
15645 /* 94 */ "pfmin", NULL, "pfrcp", "pfrsqrt",
15646 /* 98 */ NULL, NULL, "pfsub", NULL,
15647 /* 9C */ NULL, NULL, "pfadd", NULL,
15648 /* A0 */ "pfcmpgt", NULL, NULL, NULL,
15649 /* A4 */ "pfmax", NULL, "pfrcpit1", "pfrsqit1",
15650 /* A8 */ NULL, NULL, "pfsubr", NULL,
15651 /* AC */ NULL, NULL, "pfacc", NULL,
15652 /* B0 */ "pfcmpeq", NULL, NULL, NULL,
15653 /* B4 */ "pfmul", NULL, "pfrcpit2", "pmulhrw",
15654 /* B8 */ NULL, NULL, NULL, "pswapd",
15655 /* BC */ NULL, NULL, NULL, "pavgusb",
15656 /* C0 */ NULL, NULL, NULL, NULL,
15657 /* C4 */ NULL, NULL, NULL, NULL,
15658 /* C8 */ NULL, NULL, NULL, NULL,
15659 /* CC */ NULL, NULL, NULL, NULL,
15660 /* D0 */ NULL, NULL, NULL, NULL,
15661 /* D4 */ NULL, NULL, NULL, NULL,
15662 /* D8 */ NULL, NULL, NULL, NULL,
15663 /* DC */ NULL, NULL, NULL, NULL,
15664 /* E0 */ NULL, NULL, NULL, NULL,
15665 /* E4 */ NULL, NULL, NULL, NULL,
15666 /* E8 */ NULL, NULL, NULL, NULL,
15667 /* EC */ NULL, NULL, NULL, NULL,
15668 /* F0 */ NULL, NULL, NULL, NULL,
15669 /* F4 */ NULL, NULL, NULL, NULL,
15670 /* F8 */ NULL, NULL, NULL, NULL,
15671 /* FC */ NULL, NULL, NULL, NULL,
15672 };
15673
15674 static void
15675 OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15676 {
15677 const char *mnemonic;
15678
15679 FETCH_DATA (the_info, codep + 1);
15680 /* AMD 3DNow! instructions are specified by an opcode suffix in the
15681 place where an 8-bit immediate would normally go. ie. the last
15682 byte of the instruction. */
15683 obufp = mnemonicendp;
15684 mnemonic = Suffix3DNow[*codep++ & 0xff];
15685 if (mnemonic)
15686 oappend (mnemonic);
15687 else
15688 {
15689 /* Since a variable sized modrm/sib chunk is between the start
15690 of the opcode (0x0f0f) and the opcode suffix, we need to do
15691 all the modrm processing first, and don't know until now that
15692 we have a bad opcode. This necessitates some cleaning up. */
15693 op_out[0][0] = '\0';
15694 op_out[1][0] = '\0';
15695 BadOp ();
15696 }
15697 mnemonicendp = obufp;
15698 }
15699
15700 static struct op simd_cmp_op[] =
15701 {
15702 { STRING_COMMA_LEN ("eq") },
15703 { STRING_COMMA_LEN ("lt") },
15704 { STRING_COMMA_LEN ("le") },
15705 { STRING_COMMA_LEN ("unord") },
15706 { STRING_COMMA_LEN ("neq") },
15707 { STRING_COMMA_LEN ("nlt") },
15708 { STRING_COMMA_LEN ("nle") },
15709 { STRING_COMMA_LEN ("ord") }
15710 };
15711
15712 static void
15713 CMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15714 {
15715 unsigned int cmp_type;
15716
15717 FETCH_DATA (the_info, codep + 1);
15718 cmp_type = *codep++ & 0xff;
15719 if (cmp_type < ARRAY_SIZE (simd_cmp_op))
15720 {
15721 char suffix [3];
15722 char *p = mnemonicendp - 2;
15723 suffix[0] = p[0];
15724 suffix[1] = p[1];
15725 suffix[2] = '\0';
15726 sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
15727 mnemonicendp += simd_cmp_op[cmp_type].len;
15728 }
15729 else
15730 {
15731 /* We have a reserved extension byte. Output it directly. */
15732 scratchbuf[0] = '$';
15733 print_operand_value (scratchbuf + 1, 1, cmp_type);
15734 oappend_maybe_intel (scratchbuf);
15735 scratchbuf[0] = '\0';
15736 }
15737 }
15738
15739 static void
15740 OP_Mwait (int bytemode ATTRIBUTE_UNUSED,
15741 int sizeflag ATTRIBUTE_UNUSED)
15742 {
15743 /* mwait %eax,%ecx */
15744 if (!intel_syntax)
15745 {
15746 const char **names = (address_mode == mode_64bit
15747 ? names64 : names32);
15748 strcpy (op_out[0], names[0]);
15749 strcpy (op_out[1], names[1]);
15750 two_source_ops = 1;
15751 }
15752 /* Skip mod/rm byte. */
15753 MODRM_CHECK;
15754 codep++;
15755 }
15756
15757 static void
15758 OP_Monitor (int bytemode ATTRIBUTE_UNUSED,
15759 int sizeflag ATTRIBUTE_UNUSED)
15760 {
15761 /* monitor %eax,%ecx,%edx" */
15762 if (!intel_syntax)
15763 {
15764 const char **op1_names;
15765 const char **names = (address_mode == mode_64bit
15766 ? names64 : names32);
15767
15768 if (!(prefixes & PREFIX_ADDR))
15769 op1_names = (address_mode == mode_16bit
15770 ? names16 : names);
15771 else
15772 {
15773 /* Remove "addr16/addr32". */
15774 all_prefixes[last_addr_prefix] = 0;
15775 op1_names = (address_mode != mode_32bit
15776 ? names32 : names16);
15777 used_prefixes |= PREFIX_ADDR;
15778 }
15779 strcpy (op_out[0], op1_names[0]);
15780 strcpy (op_out[1], names[1]);
15781 strcpy (op_out[2], names[2]);
15782 two_source_ops = 1;
15783 }
15784 /* Skip mod/rm byte. */
15785 MODRM_CHECK;
15786 codep++;
15787 }
15788
15789 static void
15790 BadOp (void)
15791 {
15792 /* Throw away prefixes and 1st. opcode byte. */
15793 codep = insn_codep + 1;
15794 oappend ("(bad)");
15795 }
15796
15797 static void
15798 REP_Fixup (int bytemode, int sizeflag)
15799 {
15800 /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
15801 lods and stos. */
15802 if (prefixes & PREFIX_REPZ)
15803 all_prefixes[last_repz_prefix] = REP_PREFIX;
15804
15805 switch (bytemode)
15806 {
15807 case al_reg:
15808 case eAX_reg:
15809 case indir_dx_reg:
15810 OP_IMREG (bytemode, sizeflag);
15811 break;
15812 case eDI_reg:
15813 OP_ESreg (bytemode, sizeflag);
15814 break;
15815 case eSI_reg:
15816 OP_DSreg (bytemode, sizeflag);
15817 break;
15818 default:
15819 abort ();
15820 break;
15821 }
15822 }
15823
15824 /* For BND-prefixed instructions 0xF2 prefix should be displayed as
15825 "bnd". */
15826
15827 static void
15828 BND_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15829 {
15830 if (prefixes & PREFIX_REPNZ)
15831 all_prefixes[last_repnz_prefix] = BND_PREFIX;
15832 }
15833
15834 /* Similar to OP_E. But the 0xf2/0xf3 prefixes should be displayed as
15835 "xacquire"/"xrelease" for memory operand if there is a LOCK prefix.
15836 */
15837
15838 static void
15839 HLE_Fixup1 (int bytemode, int sizeflag)
15840 {
15841 if (modrm.mod != 3
15842 && (prefixes & PREFIX_LOCK) != 0)
15843 {
15844 if (prefixes & PREFIX_REPZ)
15845 all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
15846 if (prefixes & PREFIX_REPNZ)
15847 all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
15848 }
15849
15850 OP_E (bytemode, sizeflag);
15851 }
15852
15853 /* Similar to OP_E. But the 0xf2/0xf3 prefixes should be displayed as
15854 "xacquire"/"xrelease" for memory operand. No check for LOCK prefix.
15855 */
15856
15857 static void
15858 HLE_Fixup2 (int bytemode, int sizeflag)
15859 {
15860 if (modrm.mod != 3)
15861 {
15862 if (prefixes & PREFIX_REPZ)
15863 all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
15864 if (prefixes & PREFIX_REPNZ)
15865 all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
15866 }
15867
15868 OP_E (bytemode, sizeflag);
15869 }
15870
15871 /* Similar to OP_E. But the 0xf3 prefixes should be displayed as
15872 "xrelease" for memory operand. No check for LOCK prefix. */
15873
15874 static void
15875 HLE_Fixup3 (int bytemode, int sizeflag)
15876 {
15877 if (modrm.mod != 3
15878 && last_repz_prefix > last_repnz_prefix
15879 && (prefixes & PREFIX_REPZ) != 0)
15880 all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
15881
15882 OP_E (bytemode, sizeflag);
15883 }
15884
15885 static void
15886 CMPXCHG8B_Fixup (int bytemode, int sizeflag)
15887 {
15888 USED_REX (REX_W);
15889 if (rex & REX_W)
15890 {
15891 /* Change cmpxchg8b to cmpxchg16b. */
15892 char *p = mnemonicendp - 2;
15893 mnemonicendp = stpcpy (p, "16b");
15894 bytemode = o_mode;
15895 }
15896 else if ((prefixes & PREFIX_LOCK) != 0)
15897 {
15898 if (prefixes & PREFIX_REPZ)
15899 all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
15900 if (prefixes & PREFIX_REPNZ)
15901 all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
15902 }
15903
15904 OP_M (bytemode, sizeflag);
15905 }
15906
15907 static void
15908 XMM_Fixup (int reg, int sizeflag ATTRIBUTE_UNUSED)
15909 {
15910 const char **names;
15911
15912 if (need_vex)
15913 {
15914 switch (vex.length)
15915 {
15916 case 128:
15917 names = names_xmm;
15918 break;
15919 case 256:
15920 names = names_ymm;
15921 break;
15922 default:
15923 abort ();
15924 }
15925 }
15926 else
15927 names = names_xmm;
15928 oappend (names[reg]);
15929 }
15930
15931 static void
15932 CRC32_Fixup (int bytemode, int sizeflag)
15933 {
15934 /* Add proper suffix to "crc32". */
15935 char *p = mnemonicendp;
15936
15937 switch (bytemode)
15938 {
15939 case b_mode:
15940 if (intel_syntax)
15941 goto skip;
15942
15943 *p++ = 'b';
15944 break;
15945 case v_mode:
15946 if (intel_syntax)
15947 goto skip;
15948
15949 USED_REX (REX_W);
15950 if (rex & REX_W)
15951 *p++ = 'q';
15952 else
15953 {
15954 if (sizeflag & DFLAG)
15955 *p++ = 'l';
15956 else
15957 *p++ = 'w';
15958 used_prefixes |= (prefixes & PREFIX_DATA);
15959 }
15960 break;
15961 default:
15962 oappend (INTERNAL_DISASSEMBLER_ERROR);
15963 break;
15964 }
15965 mnemonicendp = p;
15966 *p = '\0';
15967
15968 skip:
15969 if (modrm.mod == 3)
15970 {
15971 int add;
15972
15973 /* Skip mod/rm byte. */
15974 MODRM_CHECK;
15975 codep++;
15976
15977 USED_REX (REX_B);
15978 add = (rex & REX_B) ? 8 : 0;
15979 if (bytemode == b_mode)
15980 {
15981 USED_REX (0);
15982 if (rex)
15983 oappend (names8rex[modrm.rm + add]);
15984 else
15985 oappend (names8[modrm.rm + add]);
15986 }
15987 else
15988 {
15989 USED_REX (REX_W);
15990 if (rex & REX_W)
15991 oappend (names64[modrm.rm + add]);
15992 else if ((prefixes & PREFIX_DATA))
15993 oappend (names16[modrm.rm + add]);
15994 else
15995 oappend (names32[modrm.rm + add]);
15996 }
15997 }
15998 else
15999 OP_E (bytemode, sizeflag);
16000 }
16001
16002 static void
16003 FXSAVE_Fixup (int bytemode, int sizeflag)
16004 {
16005 /* Add proper suffix to "fxsave" and "fxrstor". */
16006 USED_REX (REX_W);
16007 if (rex & REX_W)
16008 {
16009 char *p = mnemonicendp;
16010 *p++ = '6';
16011 *p++ = '4';
16012 *p = '\0';
16013 mnemonicendp = p;
16014 }
16015 OP_M (bytemode, sizeflag);
16016 }
16017
16018 /* Display the destination register operand for instructions with
16019 VEX. */
16020
16021 static void
16022 OP_VEX (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
16023 {
16024 int reg;
16025 const char **names;
16026
16027 if (!need_vex)
16028 abort ();
16029
16030 if (!need_vex_reg)
16031 return;
16032
16033 reg = vex.register_specifier;
16034 if (vex.evex)
16035 {
16036 if (!vex.v)
16037 reg += 16;
16038 }
16039
16040 if (bytemode == vex_scalar_mode)
16041 {
16042 oappend (names_xmm[reg]);
16043 return;
16044 }
16045
16046 switch (vex.length)
16047 {
16048 case 128:
16049 switch (bytemode)
16050 {
16051 case vex_mode:
16052 case vex128_mode:
16053 case vex_vsib_q_w_dq_mode:
16054 names = names_xmm;
16055 break;
16056 case dq_mode:
16057 if (vex.w)
16058 names = names64;
16059 else
16060 names = names32;
16061 break;
16062 case mask_mode:
16063 names = names_mask;
16064 break;
16065 default:
16066 abort ();
16067 return;
16068 }
16069 break;
16070 case 256:
16071 switch (bytemode)
16072 {
16073 case vex_mode:
16074 case vex256_mode:
16075 names = names_ymm;
16076 break;
16077 case vex_vsib_q_w_dq_mode:
16078 names = vex.w ? names_ymm : names_xmm;
16079 break;
16080 case mask_mode:
16081 names = names_mask;
16082 break;
16083 default:
16084 abort ();
16085 return;
16086 }
16087 break;
16088 case 512:
16089 names = names_zmm;
16090 break;
16091 default:
16092 abort ();
16093 break;
16094 }
16095 oappend (names[reg]);
16096 }
16097
16098 /* Get the VEX immediate byte without moving codep. */
16099
16100 static unsigned char
16101 get_vex_imm8 (int sizeflag, int opnum)
16102 {
16103 int bytes_before_imm = 0;
16104
16105 if (modrm.mod != 3)
16106 {
16107 /* There are SIB/displacement bytes. */
16108 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
16109 {
16110 /* 32/64 bit address mode */
16111 int base = modrm.rm;
16112
16113 /* Check SIB byte. */
16114 if (base == 4)
16115 {
16116 FETCH_DATA (the_info, codep + 1);
16117 base = *codep & 7;
16118 /* When decoding the third source, don't increase
16119 bytes_before_imm as this has already been incremented
16120 by one in OP_E_memory while decoding the second
16121 source operand. */
16122 if (opnum == 0)
16123 bytes_before_imm++;
16124 }
16125
16126 /* Don't increase bytes_before_imm when decoding the third source,
16127 it has already been incremented by OP_E_memory while decoding
16128 the second source operand. */
16129 if (opnum == 0)
16130 {
16131 switch (modrm.mod)
16132 {
16133 case 0:
16134 /* When modrm.rm == 5 or modrm.rm == 4 and base in
16135 SIB == 5, there is a 4 byte displacement. */
16136 if (base != 5)
16137 /* No displacement. */
16138 break;
16139 case 2:
16140 /* 4 byte displacement. */
16141 bytes_before_imm += 4;
16142 break;
16143 case 1:
16144 /* 1 byte displacement. */
16145 bytes_before_imm++;
16146 break;
16147 }
16148 }
16149 }
16150 else
16151 {
16152 /* 16 bit address mode */
16153 /* Don't increase bytes_before_imm when decoding the third source,
16154 it has already been incremented by OP_E_memory while decoding
16155 the second source operand. */
16156 if (opnum == 0)
16157 {
16158 switch (modrm.mod)
16159 {
16160 case 0:
16161 /* When modrm.rm == 6, there is a 2 byte displacement. */
16162 if (modrm.rm != 6)
16163 /* No displacement. */
16164 break;
16165 case 2:
16166 /* 2 byte displacement. */
16167 bytes_before_imm += 2;
16168 break;
16169 case 1:
16170 /* 1 byte displacement: when decoding the third source,
16171 don't increase bytes_before_imm as this has already
16172 been incremented by one in OP_E_memory while decoding
16173 the second source operand. */
16174 if (opnum == 0)
16175 bytes_before_imm++;
16176
16177 break;
16178 }
16179 }
16180 }
16181 }
16182
16183 FETCH_DATA (the_info, codep + bytes_before_imm + 1);
16184 return codep [bytes_before_imm];
16185 }
16186
16187 static void
16188 OP_EX_VexReg (int bytemode, int sizeflag, int reg)
16189 {
16190 const char **names;
16191
16192 if (reg == -1 && modrm.mod != 3)
16193 {
16194 OP_E_memory (bytemode, sizeflag);
16195 return;
16196 }
16197 else
16198 {
16199 if (reg == -1)
16200 {
16201 reg = modrm.rm;
16202 USED_REX (REX_B);
16203 if (rex & REX_B)
16204 reg += 8;
16205 }
16206 else if (reg > 7 && address_mode != mode_64bit)
16207 BadOp ();
16208 }
16209
16210 switch (vex.length)
16211 {
16212 case 128:
16213 names = names_xmm;
16214 break;
16215 case 256:
16216 names = names_ymm;
16217 break;
16218 default:
16219 abort ();
16220 }
16221 oappend (names[reg]);
16222 }
16223
16224 static void
16225 OP_EX_VexImmW (int bytemode, int sizeflag)
16226 {
16227 int reg = -1;
16228 static unsigned char vex_imm8;
16229
16230 if (vex_w_done == 0)
16231 {
16232 vex_w_done = 1;
16233
16234 /* Skip mod/rm byte. */
16235 MODRM_CHECK;
16236 codep++;
16237
16238 vex_imm8 = get_vex_imm8 (sizeflag, 0);
16239
16240 if (vex.w)
16241 reg = vex_imm8 >> 4;
16242
16243 OP_EX_VexReg (bytemode, sizeflag, reg);
16244 }
16245 else if (vex_w_done == 1)
16246 {
16247 vex_w_done = 2;
16248
16249 if (!vex.w)
16250 reg = vex_imm8 >> 4;
16251
16252 OP_EX_VexReg (bytemode, sizeflag, reg);
16253 }
16254 else
16255 {
16256 /* Output the imm8 directly. */
16257 scratchbuf[0] = '$';
16258 print_operand_value (scratchbuf + 1, 1, vex_imm8 & 0xf);
16259 oappend_maybe_intel (scratchbuf);
16260 scratchbuf[0] = '\0';
16261 codep++;
16262 }
16263 }
16264
16265 static void
16266 OP_Vex_2src (int bytemode, int sizeflag)
16267 {
16268 if (modrm.mod == 3)
16269 {
16270 int reg = modrm.rm;
16271 USED_REX (REX_B);
16272 if (rex & REX_B)
16273 reg += 8;
16274 oappend (names_xmm[reg]);
16275 }
16276 else
16277 {
16278 if (intel_syntax
16279 && (bytemode == v_mode || bytemode == v_swap_mode))
16280 {
16281 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
16282 used_prefixes |= (prefixes & PREFIX_DATA);
16283 }
16284 OP_E (bytemode, sizeflag);
16285 }
16286 }
16287
16288 static void
16289 OP_Vex_2src_1 (int bytemode, int sizeflag)
16290 {
16291 if (modrm.mod == 3)
16292 {
16293 /* Skip mod/rm byte. */
16294 MODRM_CHECK;
16295 codep++;
16296 }
16297
16298 if (vex.w)
16299 oappend (names_xmm[vex.register_specifier]);
16300 else
16301 OP_Vex_2src (bytemode, sizeflag);
16302 }
16303
16304 static void
16305 OP_Vex_2src_2 (int bytemode, int sizeflag)
16306 {
16307 if (vex.w)
16308 OP_Vex_2src (bytemode, sizeflag);
16309 else
16310 oappend (names_xmm[vex.register_specifier]);
16311 }
16312
16313 static void
16314 OP_EX_VexW (int bytemode, int sizeflag)
16315 {
16316 int reg = -1;
16317
16318 if (!vex_w_done)
16319 {
16320 vex_w_done = 1;
16321
16322 /* Skip mod/rm byte. */
16323 MODRM_CHECK;
16324 codep++;
16325
16326 if (vex.w)
16327 reg = get_vex_imm8 (sizeflag, 0) >> 4;
16328 }
16329 else
16330 {
16331 if (!vex.w)
16332 reg = get_vex_imm8 (sizeflag, 1) >> 4;
16333 }
16334
16335 OP_EX_VexReg (bytemode, sizeflag, reg);
16336 }
16337
16338 static void
16339 VEXI4_Fixup (int bytemode ATTRIBUTE_UNUSED,
16340 int sizeflag ATTRIBUTE_UNUSED)
16341 {
16342 /* Skip the immediate byte and check for invalid bits. */
16343 FETCH_DATA (the_info, codep + 1);
16344 if (*codep++ & 0xf)
16345 BadOp ();
16346 }
16347
16348 static void
16349 OP_REG_VexI4 (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
16350 {
16351 int reg;
16352 const char **names;
16353
16354 FETCH_DATA (the_info, codep + 1);
16355 reg = *codep++;
16356
16357 if (bytemode != x_mode)
16358 abort ();
16359
16360 if (reg & 0xf)
16361 BadOp ();
16362
16363 reg >>= 4;
16364 if (reg > 7 && address_mode != mode_64bit)
16365 BadOp ();
16366
16367 switch (vex.length)
16368 {
16369 case 128:
16370 names = names_xmm;
16371 break;
16372 case 256:
16373 names = names_ymm;
16374 break;
16375 default:
16376 abort ();
16377 }
16378 oappend (names[reg]);
16379 }
16380
16381 static void
16382 OP_XMM_VexW (int bytemode, int sizeflag)
16383 {
16384 /* Turn off the REX.W bit since it is used for swapping operands
16385 now. */
16386 rex &= ~REX_W;
16387 OP_XMM (bytemode, sizeflag);
16388 }
16389
16390 static void
16391 OP_EX_Vex (int bytemode, int sizeflag)
16392 {
16393 if (modrm.mod != 3)
16394 {
16395 if (vex.register_specifier != 0)
16396 BadOp ();
16397 need_vex_reg = 0;
16398 }
16399 OP_EX (bytemode, sizeflag);
16400 }
16401
16402 static void
16403 OP_XMM_Vex (int bytemode, int sizeflag)
16404 {
16405 if (modrm.mod != 3)
16406 {
16407 if (vex.register_specifier != 0)
16408 BadOp ();
16409 need_vex_reg = 0;
16410 }
16411 OP_XMM (bytemode, sizeflag);
16412 }
16413
16414 static void
16415 VZERO_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
16416 {
16417 switch (vex.length)
16418 {
16419 case 128:
16420 mnemonicendp = stpcpy (obuf, "vzeroupper");
16421 break;
16422 case 256:
16423 mnemonicendp = stpcpy (obuf, "vzeroall");
16424 break;
16425 default:
16426 abort ();
16427 }
16428 }
16429
16430 static struct op vex_cmp_op[] =
16431 {
16432 { STRING_COMMA_LEN ("eq") },
16433 { STRING_COMMA_LEN ("lt") },
16434 { STRING_COMMA_LEN ("le") },
16435 { STRING_COMMA_LEN ("unord") },
16436 { STRING_COMMA_LEN ("neq") },
16437 { STRING_COMMA_LEN ("nlt") },
16438 { STRING_COMMA_LEN ("nle") },
16439 { STRING_COMMA_LEN ("ord") },
16440 { STRING_COMMA_LEN ("eq_uq") },
16441 { STRING_COMMA_LEN ("nge") },
16442 { STRING_COMMA_LEN ("ngt") },
16443 { STRING_COMMA_LEN ("false") },
16444 { STRING_COMMA_LEN ("neq_oq") },
16445 { STRING_COMMA_LEN ("ge") },
16446 { STRING_COMMA_LEN ("gt") },
16447 { STRING_COMMA_LEN ("true") },
16448 { STRING_COMMA_LEN ("eq_os") },
16449 { STRING_COMMA_LEN ("lt_oq") },
16450 { STRING_COMMA_LEN ("le_oq") },
16451 { STRING_COMMA_LEN ("unord_s") },
16452 { STRING_COMMA_LEN ("neq_us") },
16453 { STRING_COMMA_LEN ("nlt_uq") },
16454 { STRING_COMMA_LEN ("nle_uq") },
16455 { STRING_COMMA_LEN ("ord_s") },
16456 { STRING_COMMA_LEN ("eq_us") },
16457 { STRING_COMMA_LEN ("nge_uq") },
16458 { STRING_COMMA_LEN ("ngt_uq") },
16459 { STRING_COMMA_LEN ("false_os") },
16460 { STRING_COMMA_LEN ("neq_os") },
16461 { STRING_COMMA_LEN ("ge_oq") },
16462 { STRING_COMMA_LEN ("gt_oq") },
16463 { STRING_COMMA_LEN ("true_us") },
16464 };
16465
16466 static void
16467 VCMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
16468 {
16469 unsigned int cmp_type;
16470
16471 FETCH_DATA (the_info, codep + 1);
16472 cmp_type = *codep++ & 0xff;
16473 if (cmp_type < ARRAY_SIZE (vex_cmp_op))
16474 {
16475 char suffix [3];
16476 char *p = mnemonicendp - 2;
16477 suffix[0] = p[0];
16478 suffix[1] = p[1];
16479 suffix[2] = '\0';
16480 sprintf (p, "%s%s", vex_cmp_op[cmp_type].name, suffix);
16481 mnemonicendp += vex_cmp_op[cmp_type].len;
16482 }
16483 else
16484 {
16485 /* We have a reserved extension byte. Output it directly. */
16486 scratchbuf[0] = '$';
16487 print_operand_value (scratchbuf + 1, 1, cmp_type);
16488 oappend_maybe_intel (scratchbuf);
16489 scratchbuf[0] = '\0';
16490 }
16491 }
16492
16493 static void
16494 VPCMP_Fixup (int bytemode ATTRIBUTE_UNUSED,
16495 int sizeflag ATTRIBUTE_UNUSED)
16496 {
16497 unsigned int cmp_type;
16498
16499 if (!vex.evex)
16500 abort ();
16501
16502 FETCH_DATA (the_info, codep + 1);
16503 cmp_type = *codep++ & 0xff;
16504 /* There are aliases for immediates 0, 1, 2, 4, 5, 6.
16505 If it's the case, print suffix, otherwise - print the immediate. */
16506 if (cmp_type < ARRAY_SIZE (simd_cmp_op)
16507 && cmp_type != 3
16508 && cmp_type != 7)
16509 {
16510 char suffix [3];
16511 char *p = mnemonicendp - 2;
16512
16513 /* vpcmp* can have both one- and two-lettered suffix. */
16514 if (p[0] == 'p')
16515 {
16516 p++;
16517 suffix[0] = p[0];
16518 suffix[1] = '\0';
16519 }
16520 else
16521 {
16522 suffix[0] = p[0];
16523 suffix[1] = p[1];
16524 suffix[2] = '\0';
16525 }
16526
16527 sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
16528 mnemonicendp += simd_cmp_op[cmp_type].len;
16529 }
16530 else
16531 {
16532 /* We have a reserved extension byte. Output it directly. */
16533 scratchbuf[0] = '$';
16534 print_operand_value (scratchbuf + 1, 1, cmp_type);
16535 oappend_maybe_intel (scratchbuf);
16536 scratchbuf[0] = '\0';
16537 }
16538 }
16539
16540 static const struct op pclmul_op[] =
16541 {
16542 { STRING_COMMA_LEN ("lql") },
16543 { STRING_COMMA_LEN ("hql") },
16544 { STRING_COMMA_LEN ("lqh") },
16545 { STRING_COMMA_LEN ("hqh") }
16546 };
16547
16548 static void
16549 PCLMUL_Fixup (int bytemode ATTRIBUTE_UNUSED,
16550 int sizeflag ATTRIBUTE_UNUSED)
16551 {
16552 unsigned int pclmul_type;
16553
16554 FETCH_DATA (the_info, codep + 1);
16555 pclmul_type = *codep++ & 0xff;
16556 switch (pclmul_type)
16557 {
16558 case 0x10:
16559 pclmul_type = 2;
16560 break;
16561 case 0x11:
16562 pclmul_type = 3;
16563 break;
16564 default:
16565 break;
16566 }
16567 if (pclmul_type < ARRAY_SIZE (pclmul_op))
16568 {
16569 char suffix [4];
16570 char *p = mnemonicendp - 3;
16571 suffix[0] = p[0];
16572 suffix[1] = p[1];
16573 suffix[2] = p[2];
16574 suffix[3] = '\0';
16575 sprintf (p, "%s%s", pclmul_op[pclmul_type].name, suffix);
16576 mnemonicendp += pclmul_op[pclmul_type].len;
16577 }
16578 else
16579 {
16580 /* We have a reserved extension byte. Output it directly. */
16581 scratchbuf[0] = '$';
16582 print_operand_value (scratchbuf + 1, 1, pclmul_type);
16583 oappend_maybe_intel (scratchbuf);
16584 scratchbuf[0] = '\0';
16585 }
16586 }
16587
16588 static void
16589 MOVBE_Fixup (int bytemode, int sizeflag)
16590 {
16591 /* Add proper suffix to "movbe". */
16592 char *p = mnemonicendp;
16593
16594 switch (bytemode)
16595 {
16596 case v_mode:
16597 if (intel_syntax)
16598 goto skip;
16599
16600 USED_REX (REX_W);
16601 if (sizeflag & SUFFIX_ALWAYS)
16602 {
16603 if (rex & REX_W)
16604 *p++ = 'q';
16605 else
16606 {
16607 if (sizeflag & DFLAG)
16608 *p++ = 'l';
16609 else
16610 *p++ = 'w';
16611 used_prefixes |= (prefixes & PREFIX_DATA);
16612 }
16613 }
16614 break;
16615 default:
16616 oappend (INTERNAL_DISASSEMBLER_ERROR);
16617 break;
16618 }
16619 mnemonicendp = p;
16620 *p = '\0';
16621
16622 skip:
16623 OP_M (bytemode, sizeflag);
16624 }
16625
16626 static void
16627 OP_LWPCB_E (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
16628 {
16629 int reg;
16630 const char **names;
16631
16632 /* Skip mod/rm byte. */
16633 MODRM_CHECK;
16634 codep++;
16635
16636 if (vex.w)
16637 names = names64;
16638 else
16639 names = names32;
16640
16641 reg = modrm.rm;
16642 USED_REX (REX_B);
16643 if (rex & REX_B)
16644 reg += 8;
16645
16646 oappend (names[reg]);
16647 }
16648
16649 static void
16650 OP_LWP_E (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
16651 {
16652 const char **names;
16653
16654 if (vex.w)
16655 names = names64;
16656 else
16657 names = names32;
16658
16659 oappend (names[vex.register_specifier]);
16660 }
16661
16662 static void
16663 OP_Mask (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
16664 {
16665 if (!vex.evex
16666 || bytemode != mask_mode)
16667 abort ();
16668
16669 USED_REX (REX_R);
16670 if ((rex & REX_R) != 0 || !vex.r)
16671 {
16672 BadOp ();
16673 return;
16674 }
16675
16676 oappend (names_mask [modrm.reg]);
16677 }
16678
16679 static void
16680 OP_Rounding (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
16681 {
16682 if (!vex.evex
16683 || (bytemode != evex_rounding_mode
16684 && bytemode != evex_sae_mode))
16685 abort ();
16686 if (modrm.mod == 3 && vex.b)
16687 switch (bytemode)
16688 {
16689 case evex_rounding_mode:
16690 oappend (names_rounding[vex.ll]);
16691 break;
16692 case evex_sae_mode:
16693 oappend ("{sae}");
16694 break;
16695 default:
16696 break;
16697 }
16698 }