1 /* Print i386 instructions for GDB, the GNU debugger.
2 Copyright (C) 1988-2020 Free Software Foundation, Inc.
4 This file is part of the GNU opcodes library.
6 This library is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3, or (at your option)
11 It is distributed in the hope that it will be useful, but WITHOUT
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
14 License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19 MA 02110-1301, USA. */
22 /* 80386 instruction printer by Pace Willisson (pace@prep.ai.mit.edu)
24 modified by John Hassey (hassey@dg-rtp.dg.com)
25 x86-64 support added by Jan Hubicka (jh@suse.cz)
26 VIA PadLock support by Michal Ludvig (mludvig@suse.cz). */
28 /* The main tables describing the instructions is essentially a copy
29 of the "Opcode Map" chapter (Appendix A) of the Intel 80386
30 Programmers Manual. Usually, there is a capital letter, followed
31 by a small letter. The capital letter tell the addressing mode,
32 and the small letter tells about the operand size. Refer to
33 the Intel manual for details. */
36 #include "disassemble.h"
38 #include "opcode/i386.h"
39 #include "libiberty.h"
40 #include "safe-ctype.h"
44 static int print_insn (bfd_vma
, disassemble_info
*);
45 static void dofloat (int);
46 static void OP_ST (int, int);
47 static void OP_STi (int, int);
48 static int putop (const char *, int);
49 static void oappend (const char *);
50 static void append_seg (void);
51 static void OP_indirE (int, int);
52 static void print_operand_value (char *, int, bfd_vma
);
53 static void OP_E_register (int, int);
54 static void OP_E_memory (int, int);
55 static void print_displacement (char *, bfd_vma
);
56 static void OP_E (int, int);
57 static void OP_G (int, int);
58 static bfd_vma
get64 (void);
59 static bfd_signed_vma
get32 (void);
60 static bfd_signed_vma
get32s (void);
61 static int get16 (void);
62 static void set_op (bfd_vma
, int);
63 static void OP_Skip_MODRM (int, int);
64 static void OP_REG (int, int);
65 static void OP_IMREG (int, int);
66 static void OP_I (int, int);
67 static void OP_I64 (int, int);
68 static void OP_sI (int, int);
69 static void OP_J (int, int);
70 static void OP_SEG (int, int);
71 static void OP_DIR (int, int);
72 static void OP_OFF (int, int);
73 static void OP_OFF64 (int, int);
74 static void ptr_reg (int, int);
75 static void OP_ESreg (int, int);
76 static void OP_DSreg (int, int);
77 static void OP_C (int, int);
78 static void OP_D (int, int);
79 static void OP_T (int, int);
80 static void OP_R (int, int);
81 static void OP_MMX (int, int);
82 static void OP_XMM (int, int);
83 static void OP_EM (int, int);
84 static void OP_EX (int, int);
85 static void OP_EMC (int,int);
86 static void OP_MXC (int,int);
87 static void OP_MS (int, int);
88 static void OP_XS (int, int);
89 static void OP_M (int, int);
90 static void OP_VEX (int, int);
91 static void OP_EX_Vex (int, int);
92 static void OP_XMM_Vex (int, int);
93 static void OP_Rounding (int, int);
94 static void OP_REG_VexI4 (int, int);
95 static void OP_VexI4 (int, int);
96 static void PCLMUL_Fixup (int, int);
97 static void VCMP_Fixup (int, int);
98 static void VPCMP_Fixup (int, int);
99 static void VPCOM_Fixup (int, int);
100 static void OP_0f07 (int, int);
101 static void OP_Monitor (int, int);
102 static void OP_Mwait (int, int);
103 static void NOP_Fixup1 (int, int);
104 static void NOP_Fixup2 (int, int);
105 static void OP_3DNowSuffix (int, int);
106 static void CMP_Fixup (int, int);
107 static void BadOp (void);
108 static void REP_Fixup (int, int);
109 static void SEP_Fixup (int, int);
110 static void BND_Fixup (int, int);
111 static void NOTRACK_Fixup (int, int);
112 static void HLE_Fixup1 (int, int);
113 static void HLE_Fixup2 (int, int);
114 static void HLE_Fixup3 (int, int);
115 static void CMPXCHG8B_Fixup (int, int);
116 static void XMM_Fixup (int, int);
117 static void CRC32_Fixup (int, int);
118 static void FXSAVE_Fixup (int, int);
119 static void PCMPESTR_Fixup (int, int);
120 static void OP_LWPCB_E (int, int);
121 static void OP_LWP_E (int, int);
122 static void OP_Vex_2src_1 (int, int);
123 static void OP_Vex_2src_2 (int, int);
125 static void MOVBE_Fixup (int, int);
126 static void MOVSXD_Fixup (int, int);
128 static void OP_Mask (int, int);
131 /* Points to first byte not fetched. */
132 bfd_byte
*max_fetched
;
133 bfd_byte the_buffer
[MAX_MNEM_SIZE
];
136 OPCODES_SIGJMP_BUF bailout
;
146 enum address_mode address_mode
;
148 /* Flags for the prefixes for the current instruction. See below. */
151 /* REX prefix the current instruction. See below. */
153 /* Bits of REX we've already used. */
155 /* Mark parts used in the REX prefix. When we are testing for
156 empty prefix (for 8bit register REX extension), just mask it
157 out. Otherwise test for REX bit is excuse for existence of REX
158 only in case value is nonzero. */
159 #define USED_REX(value) \
164 rex_used |= (value) | REX_OPCODE; \
167 rex_used |= REX_OPCODE; \
170 /* Flags for prefixes which we somehow handled when printing the
171 current instruction. */
172 static int used_prefixes
;
174 /* Flags stored in PREFIXES. */
175 #define PREFIX_REPZ 1
176 #define PREFIX_REPNZ 2
177 #define PREFIX_LOCK 4
179 #define PREFIX_SS 0x10
180 #define PREFIX_DS 0x20
181 #define PREFIX_ES 0x40
182 #define PREFIX_FS 0x80
183 #define PREFIX_GS 0x100
184 #define PREFIX_DATA 0x200
185 #define PREFIX_ADDR 0x400
186 #define PREFIX_FWAIT 0x800
188 /* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
189 to ADDR (exclusive) are valid. Returns 1 for success, longjmps
191 #define FETCH_DATA(info, addr) \
192 ((addr) <= ((struct dis_private *) (info->private_data))->max_fetched \
193 ? 1 : fetch_data ((info), (addr)))
196 fetch_data (struct disassemble_info
*info
, bfd_byte
*addr
)
199 struct dis_private
*priv
= (struct dis_private
*) info
->private_data
;
200 bfd_vma start
= priv
->insn_start
+ (priv
->max_fetched
- priv
->the_buffer
);
202 if (addr
<= priv
->the_buffer
+ MAX_MNEM_SIZE
)
203 status
= (*info
->read_memory_func
) (start
,
205 addr
- priv
->max_fetched
,
211 /* If we did manage to read at least one byte, then
212 print_insn_i386 will do something sensible. Otherwise, print
213 an error. We do that here because this is where we know
215 if (priv
->max_fetched
== priv
->the_buffer
)
216 (*info
->memory_error_func
) (status
, start
, info
);
217 OPCODES_SIGLONGJMP (priv
->bailout
, 1);
220 priv
->max_fetched
= addr
;
224 /* Possible values for prefix requirement. */
225 #define PREFIX_IGNORED_SHIFT 16
226 #define PREFIX_IGNORED_REPZ (PREFIX_REPZ << PREFIX_IGNORED_SHIFT)
227 #define PREFIX_IGNORED_REPNZ (PREFIX_REPNZ << PREFIX_IGNORED_SHIFT)
228 #define PREFIX_IGNORED_DATA (PREFIX_DATA << PREFIX_IGNORED_SHIFT)
229 #define PREFIX_IGNORED_ADDR (PREFIX_ADDR << PREFIX_IGNORED_SHIFT)
230 #define PREFIX_IGNORED_LOCK (PREFIX_LOCK << PREFIX_IGNORED_SHIFT)
232 /* Opcode prefixes. */
233 #define PREFIX_OPCODE (PREFIX_REPZ \
237 /* Prefixes ignored. */
238 #define PREFIX_IGNORED (PREFIX_IGNORED_REPZ \
239 | PREFIX_IGNORED_REPNZ \
240 | PREFIX_IGNORED_DATA)
242 #define XX { NULL, 0 }
243 #define Bad_Opcode NULL, { { NULL, 0 } }, 0
245 #define Eb { OP_E, b_mode }
246 #define Ebnd { OP_E, bnd_mode }
247 #define EbS { OP_E, b_swap_mode }
248 #define EbndS { OP_E, bnd_swap_mode }
249 #define Ev { OP_E, v_mode }
250 #define Eva { OP_E, va_mode }
251 #define Ev_bnd { OP_E, v_bnd_mode }
252 #define EvS { OP_E, v_swap_mode }
253 #define Ed { OP_E, d_mode }
254 #define Edq { OP_E, dq_mode }
255 #define Edqw { OP_E, dqw_mode }
256 #define Edqb { OP_E, dqb_mode }
257 #define Edb { OP_E, db_mode }
258 #define Edw { OP_E, dw_mode }
259 #define Edqd { OP_E, dqd_mode }
260 #define Eq { OP_E, q_mode }
261 #define indirEv { OP_indirE, indir_v_mode }
262 #define indirEp { OP_indirE, f_mode }
263 #define stackEv { OP_E, stack_v_mode }
264 #define Em { OP_E, m_mode }
265 #define Ew { OP_E, w_mode }
266 #define M { OP_M, 0 } /* lea, lgdt, etc. */
267 #define Ma { OP_M, a_mode }
268 #define Mb { OP_M, b_mode }
269 #define Md { OP_M, d_mode }
270 #define Mo { OP_M, o_mode }
271 #define Mp { OP_M, f_mode } /* 32 or 48 bit memory operand for LDS, LES etc */
272 #define Mq { OP_M, q_mode }
273 #define Mv_bnd { OP_M, v_bndmk_mode }
274 #define Mx { OP_M, x_mode }
275 #define Mxmm { OP_M, xmm_mode }
276 #define Gb { OP_G, b_mode }
277 #define Gbnd { OP_G, bnd_mode }
278 #define Gv { OP_G, v_mode }
279 #define Gd { OP_G, d_mode }
280 #define Gdq { OP_G, dq_mode }
281 #define Gm { OP_G, m_mode }
282 #define Gva { OP_G, va_mode }
283 #define Gw { OP_G, w_mode }
284 #define Rd { OP_R, d_mode }
285 #define Rdq { OP_R, dq_mode }
286 #define Rm { OP_R, m_mode }
287 #define Ib { OP_I, b_mode }
288 #define sIb { OP_sI, b_mode } /* sign extened byte */
289 #define sIbT { OP_sI, b_T_mode } /* sign extened byte like 'T' */
290 #define Iv { OP_I, v_mode }
291 #define sIv { OP_sI, v_mode }
292 #define Iv64 { OP_I64, v_mode }
293 #define Id { OP_I, d_mode }
294 #define Iw { OP_I, w_mode }
295 #define I1 { OP_I, const_1_mode }
296 #define Jb { OP_J, b_mode }
297 #define Jv { OP_J, v_mode }
298 #define Jdqw { OP_J, dqw_mode }
299 #define Cm { OP_C, m_mode }
300 #define Dm { OP_D, m_mode }
301 #define Td { OP_T, d_mode }
302 #define Skip_MODRM { OP_Skip_MODRM, 0 }
304 #define RMeAX { OP_REG, eAX_reg }
305 #define RMeBX { OP_REG, eBX_reg }
306 #define RMeCX { OP_REG, eCX_reg }
307 #define RMeDX { OP_REG, eDX_reg }
308 #define RMeSP { OP_REG, eSP_reg }
309 #define RMeBP { OP_REG, eBP_reg }
310 #define RMeSI { OP_REG, eSI_reg }
311 #define RMeDI { OP_REG, eDI_reg }
312 #define RMrAX { OP_REG, rAX_reg }
313 #define RMrBX { OP_REG, rBX_reg }
314 #define RMrCX { OP_REG, rCX_reg }
315 #define RMrDX { OP_REG, rDX_reg }
316 #define RMrSP { OP_REG, rSP_reg }
317 #define RMrBP { OP_REG, rBP_reg }
318 #define RMrSI { OP_REG, rSI_reg }
319 #define RMrDI { OP_REG, rDI_reg }
320 #define RMAL { OP_REG, al_reg }
321 #define RMCL { OP_REG, cl_reg }
322 #define RMDL { OP_REG, dl_reg }
323 #define RMBL { OP_REG, bl_reg }
324 #define RMAH { OP_REG, ah_reg }
325 #define RMCH { OP_REG, ch_reg }
326 #define RMDH { OP_REG, dh_reg }
327 #define RMBH { OP_REG, bh_reg }
328 #define RMAX { OP_REG, ax_reg }
329 #define RMDX { OP_REG, dx_reg }
331 #define eAX { OP_IMREG, eAX_reg }
332 #define eBX { OP_IMREG, eBX_reg }
333 #define eCX { OP_IMREG, eCX_reg }
334 #define eDX { OP_IMREG, eDX_reg }
335 #define eSP { OP_IMREG, eSP_reg }
336 #define eBP { OP_IMREG, eBP_reg }
337 #define eSI { OP_IMREG, eSI_reg }
338 #define eDI { OP_IMREG, eDI_reg }
339 #define AL { OP_IMREG, al_reg }
340 #define CL { OP_IMREG, cl_reg }
341 #define DL { OP_IMREG, dl_reg }
342 #define BL { OP_IMREG, bl_reg }
343 #define AH { OP_IMREG, ah_reg }
344 #define CH { OP_IMREG, ch_reg }
345 #define DH { OP_IMREG, dh_reg }
346 #define BH { OP_IMREG, bh_reg }
347 #define AX { OP_IMREG, ax_reg }
348 #define DX { OP_IMREG, dx_reg }
349 #define zAX { OP_IMREG, z_mode_ax_reg }
350 #define indirDX { OP_IMREG, indir_dx_reg }
352 #define Sw { OP_SEG, w_mode }
353 #define Sv { OP_SEG, v_mode }
354 #define Ap { OP_DIR, 0 }
355 #define Ob { OP_OFF64, b_mode }
356 #define Ov { OP_OFF64, v_mode }
357 #define Xb { OP_DSreg, eSI_reg }
358 #define Xv { OP_DSreg, eSI_reg }
359 #define Xz { OP_DSreg, eSI_reg }
360 #define Yb { OP_ESreg, eDI_reg }
361 #define Yv { OP_ESreg, eDI_reg }
362 #define DSBX { OP_DSreg, eBX_reg }
364 #define es { OP_REG, es_reg }
365 #define ss { OP_REG, ss_reg }
366 #define cs { OP_REG, cs_reg }
367 #define ds { OP_REG, ds_reg }
368 #define fs { OP_REG, fs_reg }
369 #define gs { OP_REG, gs_reg }
371 #define MX { OP_MMX, 0 }
372 #define XM { OP_XMM, 0 }
373 #define XMScalar { OP_XMM, scalar_mode }
374 #define XMGatherQ { OP_XMM, vex_vsib_q_w_dq_mode }
375 #define XMM { OP_XMM, xmm_mode }
376 #define XMxmmq { OP_XMM, xmmq_mode }
377 #define EM { OP_EM, v_mode }
378 #define EMS { OP_EM, v_swap_mode }
379 #define EMd { OP_EM, d_mode }
380 #define EMx { OP_EM, x_mode }
381 #define EXbScalar { OP_EX, b_scalar_mode }
382 #define EXw { OP_EX, w_mode }
383 #define EXwScalar { OP_EX, w_scalar_mode }
384 #define EXd { OP_EX, d_mode }
385 #define EXdS { OP_EX, d_swap_mode }
386 #define EXq { OP_EX, q_mode }
387 #define EXqS { OP_EX, q_swap_mode }
388 #define EXx { OP_EX, x_mode }
389 #define EXxS { OP_EX, x_swap_mode }
390 #define EXxmm { OP_EX, xmm_mode }
391 #define EXymm { OP_EX, ymm_mode }
392 #define EXxmmq { OP_EX, xmmq_mode }
393 #define EXEvexHalfBcstXmmq { OP_EX, evex_half_bcst_xmmq_mode }
394 #define EXxmm_mb { OP_EX, xmm_mb_mode }
395 #define EXxmm_mw { OP_EX, xmm_mw_mode }
396 #define EXxmm_md { OP_EX, xmm_md_mode }
397 #define EXxmm_mq { OP_EX, xmm_mq_mode }
398 #define EXxmmdw { OP_EX, xmmdw_mode }
399 #define EXxmmqd { OP_EX, xmmqd_mode }
400 #define EXymmq { OP_EX, ymmq_mode }
401 #define EXVexWdqScalar { OP_EX, vex_scalar_w_dq_mode }
402 #define EXEvexXGscat { OP_EX, evex_x_gscat_mode }
403 #define EXEvexXNoBcst { OP_EX, evex_x_nobcst_mode }
404 #define MS { OP_MS, v_mode }
405 #define XS { OP_XS, v_mode }
406 #define EMCq { OP_EMC, q_mode }
407 #define MXC { OP_MXC, 0 }
408 #define OPSUF { OP_3DNowSuffix, 0 }
409 #define SEP { SEP_Fixup, 0 }
410 #define CMP { CMP_Fixup, 0 }
411 #define XMM0 { XMM_Fixup, 0 }
412 #define FXSAVE { FXSAVE_Fixup, 0 }
413 #define Vex_2src_1 { OP_Vex_2src_1, 0 }
414 #define Vex_2src_2 { OP_Vex_2src_2, 0 }
416 #define Vex { OP_VEX, vex_mode }
417 #define VexScalar { OP_VEX, vex_scalar_mode }
418 #define VexGatherQ { OP_VEX, vex_vsib_q_w_dq_mode }
419 #define Vex128 { OP_VEX, vex128_mode }
420 #define Vex256 { OP_VEX, vex256_mode }
421 #define VexGdq { OP_VEX, dq_mode }
422 #define EXdVexScalarS { OP_EX_Vex, d_scalar_swap_mode }
423 #define EXqVexScalarS { OP_EX_Vex, q_scalar_swap_mode }
424 #define XMVexScalar { OP_XMM_Vex, scalar_mode }
425 #define XMVexI4 { OP_REG_VexI4, x_mode }
426 #define VexI4 { OP_VexI4, 0 }
427 #define PCLMUL { PCLMUL_Fixup, 0 }
428 #define VCMP { VCMP_Fixup, 0 }
429 #define VPCMP { VPCMP_Fixup, 0 }
430 #define VPCOM { VPCOM_Fixup, 0 }
432 #define EXxEVexR { OP_Rounding, evex_rounding_mode }
433 #define EXxEVexR64 { OP_Rounding, evex_rounding_64_mode }
434 #define EXxEVexS { OP_Rounding, evex_sae_mode }
436 #define XMask { OP_Mask, mask_mode }
437 #define MaskG { OP_G, mask_mode }
438 #define MaskE { OP_E, mask_mode }
439 #define MaskBDE { OP_E, mask_bd_mode }
440 #define MaskR { OP_R, mask_mode }
441 #define MaskVex { OP_VEX, mask_mode }
443 #define MVexVSIBDWpX { OP_M, vex_vsib_d_w_dq_mode }
444 #define MVexVSIBDQWpX { OP_M, vex_vsib_d_w_d_mode }
445 #define MVexVSIBQWpX { OP_M, vex_vsib_q_w_dq_mode }
446 #define MVexVSIBQDWpX { OP_M, vex_vsib_q_w_d_mode }
448 /* Used handle "rep" prefix for string instructions. */
449 #define Xbr { REP_Fixup, eSI_reg }
450 #define Xvr { REP_Fixup, eSI_reg }
451 #define Ybr { REP_Fixup, eDI_reg }
452 #define Yvr { REP_Fixup, eDI_reg }
453 #define Yzr { REP_Fixup, eDI_reg }
454 #define indirDXr { REP_Fixup, indir_dx_reg }
455 #define ALr { REP_Fixup, al_reg }
456 #define eAXr { REP_Fixup, eAX_reg }
458 /* Used handle HLE prefix for lockable instructions. */
459 #define Ebh1 { HLE_Fixup1, b_mode }
460 #define Evh1 { HLE_Fixup1, v_mode }
461 #define Ebh2 { HLE_Fixup2, b_mode }
462 #define Evh2 { HLE_Fixup2, v_mode }
463 #define Ebh3 { HLE_Fixup3, b_mode }
464 #define Evh3 { HLE_Fixup3, v_mode }
466 #define BND { BND_Fixup, 0 }
467 #define NOTRACK { NOTRACK_Fixup, 0 }
469 #define cond_jump_flag { NULL, cond_jump_mode }
470 #define loop_jcxz_flag { NULL, loop_jcxz_mode }
472 /* bits in sizeflag */
473 #define SUFFIX_ALWAYS 4
481 /* byte operand with operand swapped */
483 /* byte operand, sign extend like 'T' suffix */
485 /* operand size depends on prefixes */
487 /* operand size depends on prefixes with operand swapped */
489 /* operand size depends on address prefix */
493 /* double word operand */
495 /* double word operand with operand swapped */
497 /* quad word operand */
499 /* quad word operand with operand swapped */
501 /* ten-byte operand */
503 /* 16-byte XMM, 32-byte YMM or 64-byte ZMM operand. In EVEX with
504 broadcast enabled. */
506 /* Similar to x_mode, but with different EVEX mem shifts. */
508 /* Similar to x_mode, but with disabled broadcast. */
510 /* Similar to x_mode, but with operands swapped and disabled broadcast
513 /* 16-byte XMM operand */
515 /* XMM, XMM or YMM register operand, or quad word, xmmword or ymmword
516 memory operand (depending on vector length). Broadcast isn't
519 /* Same as xmmq_mode, but broadcast is allowed. */
520 evex_half_bcst_xmmq_mode
,
521 /* XMM register or byte memory operand */
523 /* XMM register or word memory operand */
525 /* XMM register or double word memory operand */
527 /* XMM register or quad word memory operand */
529 /* 16-byte XMM, word, double word or quad word operand. */
531 /* 16-byte XMM, double word, quad word operand or xmm word operand. */
533 /* 32-byte YMM operand */
535 /* quad word, ymmword or zmmword memory operand. */
537 /* 32-byte YMM or 16-byte word operand */
539 /* d_mode in 32bit, q_mode in 64bit mode. */
541 /* pair of v_mode operands */
547 /* like v_bnd_mode in 32bit, no RIP-rel in 64bit mode. */
549 /* operand size depends on REX prefixes. */
551 /* registers like dq_mode, memory like w_mode, displacements like
552 v_mode without considering Intel64 ISA. */
556 /* bounds operand with operand swapped */
558 /* 4- or 6-byte pointer operand */
561 /* v_mode for indirect branch opcodes. */
563 /* v_mode for stack-related opcodes. */
565 /* non-quad operand size depends on prefixes */
567 /* 16-byte operand */
569 /* registers like dq_mode, memory like b_mode. */
571 /* registers like d_mode, memory like b_mode. */
573 /* registers like d_mode, memory like w_mode. */
575 /* registers like dq_mode, memory like d_mode. */
577 /* normal vex mode */
579 /* 128bit vex mode */
581 /* 256bit vex mode */
584 /* Operand size depends on the VEX.W bit, with VSIB dword indices. */
585 vex_vsib_d_w_dq_mode
,
586 /* Similar to vex_vsib_d_w_dq_mode, with smaller memory. */
588 /* Operand size depends on the VEX.W bit, with VSIB qword indices. */
589 vex_vsib_q_w_dq_mode
,
590 /* Similar to vex_vsib_q_w_dq_mode, with smaller memory. */
593 /* scalar, ignore vector length. */
595 /* like b_mode, ignore vector length. */
597 /* like w_mode, ignore vector length. */
599 /* like d_swap_mode, ignore vector length. */
601 /* like q_swap_mode, ignore vector length. */
603 /* like vex_mode, ignore vector length. */
605 /* Operand size depends on the VEX.W bit, ignore vector length. */
606 vex_scalar_w_dq_mode
,
608 /* Static rounding. */
610 /* Static rounding, 64-bit mode only. */
611 evex_rounding_64_mode
,
612 /* Supress all exceptions. */
615 /* Mask register operand. */
617 /* Mask register operand. */
685 #define FLOAT NULL, { { NULL, FLOATCODE } }, 0
687 #define DIS386(T, I) NULL, { { NULL, (T)}, { NULL, (I) } }, 0
688 #define DIS386_PREFIX(T, I, P) NULL, { { NULL, (T)}, { NULL, (I) } }, P
689 #define REG_TABLE(I) DIS386 (USE_REG_TABLE, (I))
690 #define MOD_TABLE(I) DIS386 (USE_MOD_TABLE, (I))
691 #define RM_TABLE(I) DIS386 (USE_RM_TABLE, (I))
692 #define PREFIX_TABLE(I) DIS386 (USE_PREFIX_TABLE, (I))
693 #define X86_64_TABLE(I) DIS386 (USE_X86_64_TABLE, (I))
694 #define THREE_BYTE_TABLE(I) DIS386 (USE_3BYTE_TABLE, (I))
695 #define THREE_BYTE_TABLE_PREFIX(I, P) DIS386_PREFIX (USE_3BYTE_TABLE, (I), P)
696 #define XOP_8F_TABLE(I) DIS386 (USE_XOP_8F_TABLE, (I))
697 #define VEX_C4_TABLE(I) DIS386 (USE_VEX_C4_TABLE, (I))
698 #define VEX_C5_TABLE(I) DIS386 (USE_VEX_C5_TABLE, (I))
699 #define VEX_LEN_TABLE(I) DIS386 (USE_VEX_LEN_TABLE, (I))
700 #define VEX_W_TABLE(I) DIS386 (USE_VEX_W_TABLE, (I))
701 #define EVEX_TABLE(I) DIS386 (USE_EVEX_TABLE, (I))
702 #define EVEX_LEN_TABLE(I) DIS386 (USE_EVEX_LEN_TABLE, (I))
832 MOD_VEX_0F12_PREFIX_0
,
833 MOD_VEX_0F12_PREFIX_2
,
835 MOD_VEX_0F16_PREFIX_0
,
836 MOD_VEX_0F16_PREFIX_2
,
839 MOD_VEX_W_0_0F41_P_0_LEN_1
,
840 MOD_VEX_W_1_0F41_P_0_LEN_1
,
841 MOD_VEX_W_0_0F41_P_2_LEN_1
,
842 MOD_VEX_W_1_0F41_P_2_LEN_1
,
843 MOD_VEX_W_0_0F42_P_0_LEN_1
,
844 MOD_VEX_W_1_0F42_P_0_LEN_1
,
845 MOD_VEX_W_0_0F42_P_2_LEN_1
,
846 MOD_VEX_W_1_0F42_P_2_LEN_1
,
847 MOD_VEX_W_0_0F44_P_0_LEN_1
,
848 MOD_VEX_W_1_0F44_P_0_LEN_1
,
849 MOD_VEX_W_0_0F44_P_2_LEN_1
,
850 MOD_VEX_W_1_0F44_P_2_LEN_1
,
851 MOD_VEX_W_0_0F45_P_0_LEN_1
,
852 MOD_VEX_W_1_0F45_P_0_LEN_1
,
853 MOD_VEX_W_0_0F45_P_2_LEN_1
,
854 MOD_VEX_W_1_0F45_P_2_LEN_1
,
855 MOD_VEX_W_0_0F46_P_0_LEN_1
,
856 MOD_VEX_W_1_0F46_P_0_LEN_1
,
857 MOD_VEX_W_0_0F46_P_2_LEN_1
,
858 MOD_VEX_W_1_0F46_P_2_LEN_1
,
859 MOD_VEX_W_0_0F47_P_0_LEN_1
,
860 MOD_VEX_W_1_0F47_P_0_LEN_1
,
861 MOD_VEX_W_0_0F47_P_2_LEN_1
,
862 MOD_VEX_W_1_0F47_P_2_LEN_1
,
863 MOD_VEX_W_0_0F4A_P_0_LEN_1
,
864 MOD_VEX_W_1_0F4A_P_0_LEN_1
,
865 MOD_VEX_W_0_0F4A_P_2_LEN_1
,
866 MOD_VEX_W_1_0F4A_P_2_LEN_1
,
867 MOD_VEX_W_0_0F4B_P_0_LEN_1
,
868 MOD_VEX_W_1_0F4B_P_0_LEN_1
,
869 MOD_VEX_W_0_0F4B_P_2_LEN_1
,
881 MOD_VEX_W_0_0F91_P_0_LEN_0
,
882 MOD_VEX_W_1_0F91_P_0_LEN_0
,
883 MOD_VEX_W_0_0F91_P_2_LEN_0
,
884 MOD_VEX_W_1_0F91_P_2_LEN_0
,
885 MOD_VEX_W_0_0F92_P_0_LEN_0
,
886 MOD_VEX_W_0_0F92_P_2_LEN_0
,
887 MOD_VEX_0F92_P_3_LEN_0
,
888 MOD_VEX_W_0_0F93_P_0_LEN_0
,
889 MOD_VEX_W_0_0F93_P_2_LEN_0
,
890 MOD_VEX_0F93_P_3_LEN_0
,
891 MOD_VEX_W_0_0F98_P_0_LEN_0
,
892 MOD_VEX_W_1_0F98_P_0_LEN_0
,
893 MOD_VEX_W_0_0F98_P_2_LEN_0
,
894 MOD_VEX_W_1_0F98_P_2_LEN_0
,
895 MOD_VEX_W_0_0F99_P_0_LEN_0
,
896 MOD_VEX_W_1_0F99_P_0_LEN_0
,
897 MOD_VEX_W_0_0F99_P_2_LEN_0
,
898 MOD_VEX_W_1_0F99_P_2_LEN_0
,
901 MOD_VEX_0FD7_PREFIX_2
,
902 MOD_VEX_0FE7_PREFIX_2
,
903 MOD_VEX_0FF0_PREFIX_3
,
904 MOD_VEX_0F381A_PREFIX_2
,
905 MOD_VEX_0F382A_PREFIX_2
,
906 MOD_VEX_0F382C_PREFIX_2
,
907 MOD_VEX_0F382D_PREFIX_2
,
908 MOD_VEX_0F382E_PREFIX_2
,
909 MOD_VEX_0F382F_PREFIX_2
,
910 MOD_VEX_0F385A_PREFIX_2
,
911 MOD_VEX_0F388C_PREFIX_2
,
912 MOD_VEX_0F388E_PREFIX_2
,
913 MOD_VEX_W_0_0F3A30_P_2_LEN_0
,
914 MOD_VEX_W_1_0F3A30_P_2_LEN_0
,
915 MOD_VEX_W_0_0F3A31_P_2_LEN_0
,
916 MOD_VEX_W_1_0F3A31_P_2_LEN_0
,
917 MOD_VEX_W_0_0F3A32_P_2_LEN_0
,
918 MOD_VEX_W_1_0F3A32_P_2_LEN_0
,
919 MOD_VEX_W_0_0F3A33_P_2_LEN_0
,
920 MOD_VEX_W_1_0F3A33_P_2_LEN_0
,
922 MOD_EVEX_0F12_PREFIX_0
,
923 MOD_EVEX_0F12_PREFIX_2
,
925 MOD_EVEX_0F16_PREFIX_0
,
926 MOD_EVEX_0F16_PREFIX_2
,
929 MOD_EVEX_0F381A_P_2_W_0
,
930 MOD_EVEX_0F381A_P_2_W_1
,
931 MOD_EVEX_0F381B_P_2_W_0
,
932 MOD_EVEX_0F381B_P_2_W_1
,
933 MOD_EVEX_0F385A_P_2_W_0
,
934 MOD_EVEX_0F385A_P_2_W_1
,
935 MOD_EVEX_0F385B_P_2_W_0
,
936 MOD_EVEX_0F385B_P_2_W_1
,
937 MOD_EVEX_0F38C6_REG_1
,
938 MOD_EVEX_0F38C6_REG_2
,
939 MOD_EVEX_0F38C6_REG_5
,
940 MOD_EVEX_0F38C6_REG_6
,
941 MOD_EVEX_0F38C7_REG_1
,
942 MOD_EVEX_0F38C7_REG_2
,
943 MOD_EVEX_0F38C7_REG_5
,
944 MOD_EVEX_0F38C7_REG_6
957 RM_0F1E_P_1_MOD_3_REG_7
,
958 RM_0FAE_REG_6_MOD_3_P_0
,
965 PREFIX_0F01_REG_3_RM_1
,
966 PREFIX_0F01_REG_5_MOD_0
,
967 PREFIX_0F01_REG_5_MOD_3_RM_0
,
968 PREFIX_0F01_REG_5_MOD_3_RM_1
,
969 PREFIX_0F01_REG_5_MOD_3_RM_2
,
970 PREFIX_0F01_REG_7_MOD_3_RM_2
,
971 PREFIX_0F01_REG_7_MOD_3_RM_3
,
1013 PREFIX_0FAE_REG_0_MOD_3
,
1014 PREFIX_0FAE_REG_1_MOD_3
,
1015 PREFIX_0FAE_REG_2_MOD_3
,
1016 PREFIX_0FAE_REG_3_MOD_3
,
1017 PREFIX_0FAE_REG_4_MOD_0
,
1018 PREFIX_0FAE_REG_4_MOD_3
,
1019 PREFIX_0FAE_REG_5_MOD_0
,
1020 PREFIX_0FAE_REG_5_MOD_3
,
1021 PREFIX_0FAE_REG_6_MOD_0
,
1022 PREFIX_0FAE_REG_6_MOD_3
,
1023 PREFIX_0FAE_REG_7_MOD_0
,
1029 PREFIX_0FC7_REG_6_MOD_0
,
1030 PREFIX_0FC7_REG_6_MOD_3
,
1031 PREFIX_0FC7_REG_7_MOD_3
,
1161 PREFIX_VEX_0F71_REG_2
,
1162 PREFIX_VEX_0F71_REG_4
,
1163 PREFIX_VEX_0F71_REG_6
,
1164 PREFIX_VEX_0F72_REG_2
,
1165 PREFIX_VEX_0F72_REG_4
,
1166 PREFIX_VEX_0F72_REG_6
,
1167 PREFIX_VEX_0F73_REG_2
,
1168 PREFIX_VEX_0F73_REG_3
,
1169 PREFIX_VEX_0F73_REG_6
,
1170 PREFIX_VEX_0F73_REG_7
,
1343 PREFIX_VEX_0F38F3_REG_1
,
1344 PREFIX_VEX_0F38F3_REG_2
,
1345 PREFIX_VEX_0F38F3_REG_3
,
1442 PREFIX_EVEX_0F71_REG_2
,
1443 PREFIX_EVEX_0F71_REG_4
,
1444 PREFIX_EVEX_0F71_REG_6
,
1445 PREFIX_EVEX_0F72_REG_0
,
1446 PREFIX_EVEX_0F72_REG_1
,
1447 PREFIX_EVEX_0F72_REG_2
,
1448 PREFIX_EVEX_0F72_REG_4
,
1449 PREFIX_EVEX_0F72_REG_6
,
1450 PREFIX_EVEX_0F73_REG_2
,
1451 PREFIX_EVEX_0F73_REG_3
,
1452 PREFIX_EVEX_0F73_REG_6
,
1453 PREFIX_EVEX_0F73_REG_7
,
1575 PREFIX_EVEX_0F38C6_REG_1
,
1576 PREFIX_EVEX_0F38C6_REG_2
,
1577 PREFIX_EVEX_0F38C6_REG_5
,
1578 PREFIX_EVEX_0F38C6_REG_6
,
1579 PREFIX_EVEX_0F38C7_REG_1
,
1580 PREFIX_EVEX_0F38C7_REG_2
,
1581 PREFIX_EVEX_0F38C7_REG_5
,
1582 PREFIX_EVEX_0F38C7_REG_6
,
1675 THREE_BYTE_0F38
= 0,
1702 VEX_LEN_0F12_P_0_M_0
= 0,
1703 VEX_LEN_0F12_P_0_M_1
,
1704 #define VEX_LEN_0F12_P_2_M_0 VEX_LEN_0F12_P_0_M_0
1706 VEX_LEN_0F16_P_0_M_0
,
1707 VEX_LEN_0F16_P_0_M_1
,
1708 #define VEX_LEN_0F16_P_2_M_0 VEX_LEN_0F16_P_0_M_0
1744 VEX_LEN_0FAE_R_2_M_0
,
1745 VEX_LEN_0FAE_R_3_M_0
,
1752 VEX_LEN_0F381A_P_2_M_0
,
1755 VEX_LEN_0F385A_P_2_M_0
,
1758 VEX_LEN_0F38F3_R_1_P_0
,
1759 VEX_LEN_0F38F3_R_2_P_0
,
1760 VEX_LEN_0F38F3_R_3_P_0
,
1803 VEX_LEN_0FXOP_08_CC
,
1804 VEX_LEN_0FXOP_08_CD
,
1805 VEX_LEN_0FXOP_08_CE
,
1806 VEX_LEN_0FXOP_08_CF
,
1807 VEX_LEN_0FXOP_08_EC
,
1808 VEX_LEN_0FXOP_08_ED
,
1809 VEX_LEN_0FXOP_08_EE
,
1810 VEX_LEN_0FXOP_08_EF
,
1811 VEX_LEN_0FXOP_09_82_W_0
,
1812 VEX_LEN_0FXOP_09_83_W_0
,
1817 EVEX_LEN_0F6E_P_2
= 0,
1823 EVEX_LEN_0F3816_P_2
,
1824 EVEX_LEN_0F3819_P_2_W_0
,
1825 EVEX_LEN_0F3819_P_2_W_1
,
1826 EVEX_LEN_0F381A_P_2_W_0_M_0
,
1827 EVEX_LEN_0F381A_P_2_W_1_M_0
,
1828 EVEX_LEN_0F381B_P_2_W_0_M_0
,
1829 EVEX_LEN_0F381B_P_2_W_1_M_0
,
1830 EVEX_LEN_0F3836_P_2
,
1831 EVEX_LEN_0F385A_P_2_W_0_M_0
,
1832 EVEX_LEN_0F385A_P_2_W_1_M_0
,
1833 EVEX_LEN_0F385B_P_2_W_0_M_0
,
1834 EVEX_LEN_0F385B_P_2_W_1_M_0
,
1835 EVEX_LEN_0F38C6_REG_1_PREFIX_2
,
1836 EVEX_LEN_0F38C6_REG_2_PREFIX_2
,
1837 EVEX_LEN_0F38C6_REG_5_PREFIX_2
,
1838 EVEX_LEN_0F38C6_REG_6_PREFIX_2
,
1839 EVEX_LEN_0F38C7_R_1_P_2_W_0
,
1840 EVEX_LEN_0F38C7_R_1_P_2_W_1
,
1841 EVEX_LEN_0F38C7_R_2_P_2_W_0
,
1842 EVEX_LEN_0F38C7_R_2_P_2_W_1
,
1843 EVEX_LEN_0F38C7_R_5_P_2_W_0
,
1844 EVEX_LEN_0F38C7_R_5_P_2_W_1
,
1845 EVEX_LEN_0F38C7_R_6_P_2_W_0
,
1846 EVEX_LEN_0F38C7_R_6_P_2_W_1
,
1847 EVEX_LEN_0F3A00_P_2_W_1
,
1848 EVEX_LEN_0F3A01_P_2_W_1
,
1849 EVEX_LEN_0F3A14_P_2
,
1850 EVEX_LEN_0F3A15_P_2
,
1851 EVEX_LEN_0F3A16_P_2
,
1852 EVEX_LEN_0F3A17_P_2
,
1853 EVEX_LEN_0F3A18_P_2_W_0
,
1854 EVEX_LEN_0F3A18_P_2_W_1
,
1855 EVEX_LEN_0F3A19_P_2_W_0
,
1856 EVEX_LEN_0F3A19_P_2_W_1
,
1857 EVEX_LEN_0F3A1A_P_2_W_0
,
1858 EVEX_LEN_0F3A1A_P_2_W_1
,
1859 EVEX_LEN_0F3A1B_P_2_W_0
,
1860 EVEX_LEN_0F3A1B_P_2_W_1
,
1861 EVEX_LEN_0F3A20_P_2
,
1862 EVEX_LEN_0F3A21_P_2_W_0
,
1863 EVEX_LEN_0F3A22_P_2
,
1864 EVEX_LEN_0F3A23_P_2_W_0
,
1865 EVEX_LEN_0F3A23_P_2_W_1
,
1866 EVEX_LEN_0F3A38_P_2_W_0
,
1867 EVEX_LEN_0F3A38_P_2_W_1
,
1868 EVEX_LEN_0F3A39_P_2_W_0
,
1869 EVEX_LEN_0F3A39_P_2_W_1
,
1870 EVEX_LEN_0F3A3A_P_2_W_0
,
1871 EVEX_LEN_0F3A3A_P_2_W_1
,
1872 EVEX_LEN_0F3A3B_P_2_W_0
,
1873 EVEX_LEN_0F3A3B_P_2_W_1
,
1874 EVEX_LEN_0F3A43_P_2_W_0
,
1875 EVEX_LEN_0F3A43_P_2_W_1
1880 VEX_W_0F41_P_0_LEN_1
= 0,
1881 VEX_W_0F41_P_2_LEN_1
,
1882 VEX_W_0F42_P_0_LEN_1
,
1883 VEX_W_0F42_P_2_LEN_1
,
1884 VEX_W_0F44_P_0_LEN_0
,
1885 VEX_W_0F44_P_2_LEN_0
,
1886 VEX_W_0F45_P_0_LEN_1
,
1887 VEX_W_0F45_P_2_LEN_1
,
1888 VEX_W_0F46_P_0_LEN_1
,
1889 VEX_W_0F46_P_2_LEN_1
,
1890 VEX_W_0F47_P_0_LEN_1
,
1891 VEX_W_0F47_P_2_LEN_1
,
1892 VEX_W_0F4A_P_0_LEN_1
,
1893 VEX_W_0F4A_P_2_LEN_1
,
1894 VEX_W_0F4B_P_0_LEN_1
,
1895 VEX_W_0F4B_P_2_LEN_1
,
1896 VEX_W_0F90_P_0_LEN_0
,
1897 VEX_W_0F90_P_2_LEN_0
,
1898 VEX_W_0F91_P_0_LEN_0
,
1899 VEX_W_0F91_P_2_LEN_0
,
1900 VEX_W_0F92_P_0_LEN_0
,
1901 VEX_W_0F92_P_2_LEN_0
,
1902 VEX_W_0F93_P_0_LEN_0
,
1903 VEX_W_0F93_P_2_LEN_0
,
1904 VEX_W_0F98_P_0_LEN_0
,
1905 VEX_W_0F98_P_2_LEN_0
,
1906 VEX_W_0F99_P_0_LEN_0
,
1907 VEX_W_0F99_P_2_LEN_0
,
1916 VEX_W_0F381A_P_2_M_0
,
1917 VEX_W_0F382C_P_2_M_0
,
1918 VEX_W_0F382D_P_2_M_0
,
1919 VEX_W_0F382E_P_2_M_0
,
1920 VEX_W_0F382F_P_2_M_0
,
1925 VEX_W_0F385A_P_2_M_0
,
1938 VEX_W_0F3A30_P_2_LEN_0
,
1939 VEX_W_0F3A31_P_2_LEN_0
,
1940 VEX_W_0F3A32_P_2_LEN_0
,
1941 VEX_W_0F3A33_P_2_LEN_0
,
1960 EVEX_W_0F12_P_0_M_1
,
1963 EVEX_W_0F16_P_0_M_1
,
1997 EVEX_W_0F72_R_2_P_2
,
1998 EVEX_W_0F72_R_6_P_2
,
1999 EVEX_W_0F73_R_2_P_2
,
2000 EVEX_W_0F73_R_6_P_2
,
2085 EVEX_W_0F38C7_R_1_P_2
,
2086 EVEX_W_0F38C7_R_2_P_2
,
2087 EVEX_W_0F38C7_R_5_P_2
,
2088 EVEX_W_0F38C7_R_6_P_2
,
2113 typedef void (*op_rtn
) (int bytemode
, int sizeflag
);
2122 unsigned int prefix_requirement
;
2125 /* Upper case letters in the instruction names here are macros.
2126 'A' => print 'b' if no register operands or suffix_always is true
2127 'B' => print 'b' if suffix_always is true
2128 'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
2130 'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
2131 suffix_always is true
2132 'E' => print 'e' if 32-bit form of jcxz
2133 'F' => print 'w' or 'l' depending on address size prefix (loop insns)
2134 'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
2135 'H' => print ",pt" or ",pn" branch hint
2138 'K' => print 'd' or 'q' if rex prefix is present.
2139 'L' => print 'l' if suffix_always is true
2140 'M' => print 'r' if intel_mnemonic is false.
2141 'N' => print 'n' if instruction has no wait "prefix"
2142 'O' => print 'd' or 'o' (or 'q' in Intel mode)
2143 'P' => print 'w', 'l' or 'q' if instruction has an operand size prefix,
2144 or suffix_always is true. print 'q' if rex prefix is present.
2145 'Q' => print 'w', 'l' or 'q' for memory operand or suffix_always
2147 'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
2148 'S' => print 'w', 'l' or 'q' if suffix_always is true
2149 'T' => print 'q' in 64bit mode if instruction has no operand size
2150 prefix and behave as 'P' otherwise
2151 'U' => print 'q' in 64bit mode if instruction has no operand size
2152 prefix and behave as 'Q' otherwise
2153 'V' => print 'q' in 64bit mode if instruction has no operand size
2154 prefix and behave as 'S' otherwise
2155 'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
2156 'X' => print 's', 'd' depending on data16 prefix (for XMM)
2158 'Z' => print 'q' in 64bit mode and behave as 'L' otherwise
2159 '!' => change condition from true to false or from false to true.
2160 '%' => add 1 upper case letter to the macro.
2161 '^' => print 'w', 'l', or 'q' (Intel64 ISA only) depending on operand size
2162 prefix or suffix_always is true (lcall/ljmp).
2163 '@' => print 'q' for Intel64 ISA, 'w' or 'q' for AMD64 ISA depending
2164 on operand size prefix.
2165 '&' => print 'q' in 64bit mode for Intel64 ISA or if instruction
2166 has no operand size prefix for AMD64 ISA, behave as 'P'
2169 2 upper case letter macros:
2170 "XY" => print 'x' or 'y' if suffix_always is true or no register
2171 operands and no broadcast.
2172 "XZ" => print 'x', 'y', or 'z' if suffix_always is true or no
2173 register operands and no broadcast.
2174 "XW" => print 's', 'd' depending on the VEX.W bit (for FMA)
2175 "LQ" => print 'l' ('d' in Intel mode) or 'q' for memory
2176 operand or no operand at all in 64bit mode, or if suffix_always
2178 "LB" => print "abs" in 64bit mode and behave as 'B' otherwise
2179 "LS" => print "abs" in 64bit mode and behave as 'S' otherwise
2180 "LV" => print "abs" for 64bit operand and behave as 'S' otherwise
2181 "LW" => print 'd', 'q' depending on the VEX.W bit
2182 "BW" => print 'b' or 'w' depending on the EVEX.W bit
2183 "LP" => print 'w' or 'l' ('d' in Intel mode) if instruction has
2184 an operand size prefix, or suffix_always is true. print
2185 'q' if rex prefix is present.
2187 Many of the above letters print nothing in Intel mode. See "putop"
2190 Braces '{' and '}', and vertical bars '|', indicate alternative
2191 mnemonic strings for AT&T and Intel. */
2193 static const struct dis386 dis386
[] = {
2195 { "addB", { Ebh1
, Gb
}, 0 },
2196 { "addS", { Evh1
, Gv
}, 0 },
2197 { "addB", { Gb
, EbS
}, 0 },
2198 { "addS", { Gv
, EvS
}, 0 },
2199 { "addB", { AL
, Ib
}, 0 },
2200 { "addS", { eAX
, Iv
}, 0 },
2201 { X86_64_TABLE (X86_64_06
) },
2202 { X86_64_TABLE (X86_64_07
) },
2204 { "orB", { Ebh1
, Gb
}, 0 },
2205 { "orS", { Evh1
, Gv
}, 0 },
2206 { "orB", { Gb
, EbS
}, 0 },
2207 { "orS", { Gv
, EvS
}, 0 },
2208 { "orB", { AL
, Ib
}, 0 },
2209 { "orS", { eAX
, Iv
}, 0 },
2210 { X86_64_TABLE (X86_64_0E
) },
2211 { Bad_Opcode
}, /* 0x0f extended opcode escape */
2213 { "adcB", { Ebh1
, Gb
}, 0 },
2214 { "adcS", { Evh1
, Gv
}, 0 },
2215 { "adcB", { Gb
, EbS
}, 0 },
2216 { "adcS", { Gv
, EvS
}, 0 },
2217 { "adcB", { AL
, Ib
}, 0 },
2218 { "adcS", { eAX
, Iv
}, 0 },
2219 { X86_64_TABLE (X86_64_16
) },
2220 { X86_64_TABLE (X86_64_17
) },
2222 { "sbbB", { Ebh1
, Gb
}, 0 },
2223 { "sbbS", { Evh1
, Gv
}, 0 },
2224 { "sbbB", { Gb
, EbS
}, 0 },
2225 { "sbbS", { Gv
, EvS
}, 0 },
2226 { "sbbB", { AL
, Ib
}, 0 },
2227 { "sbbS", { eAX
, Iv
}, 0 },
2228 { X86_64_TABLE (X86_64_1E
) },
2229 { X86_64_TABLE (X86_64_1F
) },
2231 { "andB", { Ebh1
, Gb
}, 0 },
2232 { "andS", { Evh1
, Gv
}, 0 },
2233 { "andB", { Gb
, EbS
}, 0 },
2234 { "andS", { Gv
, EvS
}, 0 },
2235 { "andB", { AL
, Ib
}, 0 },
2236 { "andS", { eAX
, Iv
}, 0 },
2237 { Bad_Opcode
}, /* SEG ES prefix */
2238 { X86_64_TABLE (X86_64_27
) },
2240 { "subB", { Ebh1
, Gb
}, 0 },
2241 { "subS", { Evh1
, Gv
}, 0 },
2242 { "subB", { Gb
, EbS
}, 0 },
2243 { "subS", { Gv
, EvS
}, 0 },
2244 { "subB", { AL
, Ib
}, 0 },
2245 { "subS", { eAX
, Iv
}, 0 },
2246 { Bad_Opcode
}, /* SEG CS prefix */
2247 { X86_64_TABLE (X86_64_2F
) },
2249 { "xorB", { Ebh1
, Gb
}, 0 },
2250 { "xorS", { Evh1
, Gv
}, 0 },
2251 { "xorB", { Gb
, EbS
}, 0 },
2252 { "xorS", { Gv
, EvS
}, 0 },
2253 { "xorB", { AL
, Ib
}, 0 },
2254 { "xorS", { eAX
, Iv
}, 0 },
2255 { Bad_Opcode
}, /* SEG SS prefix */
2256 { X86_64_TABLE (X86_64_37
) },
2258 { "cmpB", { Eb
, Gb
}, 0 },
2259 { "cmpS", { Ev
, Gv
}, 0 },
2260 { "cmpB", { Gb
, EbS
}, 0 },
2261 { "cmpS", { Gv
, EvS
}, 0 },
2262 { "cmpB", { AL
, Ib
}, 0 },
2263 { "cmpS", { eAX
, Iv
}, 0 },
2264 { Bad_Opcode
}, /* SEG DS prefix */
2265 { X86_64_TABLE (X86_64_3F
) },
2267 { "inc{S|}", { RMeAX
}, 0 },
2268 { "inc{S|}", { RMeCX
}, 0 },
2269 { "inc{S|}", { RMeDX
}, 0 },
2270 { "inc{S|}", { RMeBX
}, 0 },
2271 { "inc{S|}", { RMeSP
}, 0 },
2272 { "inc{S|}", { RMeBP
}, 0 },
2273 { "inc{S|}", { RMeSI
}, 0 },
2274 { "inc{S|}", { RMeDI
}, 0 },
2276 { "dec{S|}", { RMeAX
}, 0 },
2277 { "dec{S|}", { RMeCX
}, 0 },
2278 { "dec{S|}", { RMeDX
}, 0 },
2279 { "dec{S|}", { RMeBX
}, 0 },
2280 { "dec{S|}", { RMeSP
}, 0 },
2281 { "dec{S|}", { RMeBP
}, 0 },
2282 { "dec{S|}", { RMeSI
}, 0 },
2283 { "dec{S|}", { RMeDI
}, 0 },
2285 { "pushV", { RMrAX
}, 0 },
2286 { "pushV", { RMrCX
}, 0 },
2287 { "pushV", { RMrDX
}, 0 },
2288 { "pushV", { RMrBX
}, 0 },
2289 { "pushV", { RMrSP
}, 0 },
2290 { "pushV", { RMrBP
}, 0 },
2291 { "pushV", { RMrSI
}, 0 },
2292 { "pushV", { RMrDI
}, 0 },
2294 { "popV", { RMrAX
}, 0 },
2295 { "popV", { RMrCX
}, 0 },
2296 { "popV", { RMrDX
}, 0 },
2297 { "popV", { RMrBX
}, 0 },
2298 { "popV", { RMrSP
}, 0 },
2299 { "popV", { RMrBP
}, 0 },
2300 { "popV", { RMrSI
}, 0 },
2301 { "popV", { RMrDI
}, 0 },
2303 { X86_64_TABLE (X86_64_60
) },
2304 { X86_64_TABLE (X86_64_61
) },
2305 { X86_64_TABLE (X86_64_62
) },
2306 { X86_64_TABLE (X86_64_63
) },
2307 { Bad_Opcode
}, /* seg fs */
2308 { Bad_Opcode
}, /* seg gs */
2309 { Bad_Opcode
}, /* op size prefix */
2310 { Bad_Opcode
}, /* adr size prefix */
2312 { "pushT", { sIv
}, 0 },
2313 { "imulS", { Gv
, Ev
, Iv
}, 0 },
2314 { "pushT", { sIbT
}, 0 },
2315 { "imulS", { Gv
, Ev
, sIb
}, 0 },
2316 { "ins{b|}", { Ybr
, indirDX
}, 0 },
2317 { X86_64_TABLE (X86_64_6D
) },
2318 { "outs{b|}", { indirDXr
, Xb
}, 0 },
2319 { X86_64_TABLE (X86_64_6F
) },
2321 { "joH", { Jb
, BND
, cond_jump_flag
}, 0 },
2322 { "jnoH", { Jb
, BND
, cond_jump_flag
}, 0 },
2323 { "jbH", { Jb
, BND
, cond_jump_flag
}, 0 },
2324 { "jaeH", { Jb
, BND
, cond_jump_flag
}, 0 },
2325 { "jeH", { Jb
, BND
, cond_jump_flag
}, 0 },
2326 { "jneH", { Jb
, BND
, cond_jump_flag
}, 0 },
2327 { "jbeH", { Jb
, BND
, cond_jump_flag
}, 0 },
2328 { "jaH", { Jb
, BND
, cond_jump_flag
}, 0 },
2330 { "jsH", { Jb
, BND
, cond_jump_flag
}, 0 },
2331 { "jnsH", { Jb
, BND
, cond_jump_flag
}, 0 },
2332 { "jpH", { Jb
, BND
, cond_jump_flag
}, 0 },
2333 { "jnpH", { Jb
, BND
, cond_jump_flag
}, 0 },
2334 { "jlH", { Jb
, BND
, cond_jump_flag
}, 0 },
2335 { "jgeH", { Jb
, BND
, cond_jump_flag
}, 0 },
2336 { "jleH", { Jb
, BND
, cond_jump_flag
}, 0 },
2337 { "jgH", { Jb
, BND
, cond_jump_flag
}, 0 },
2339 { REG_TABLE (REG_80
) },
2340 { REG_TABLE (REG_81
) },
2341 { X86_64_TABLE (X86_64_82
) },
2342 { REG_TABLE (REG_83
) },
2343 { "testB", { Eb
, Gb
}, 0 },
2344 { "testS", { Ev
, Gv
}, 0 },
2345 { "xchgB", { Ebh2
, Gb
}, 0 },
2346 { "xchgS", { Evh2
, Gv
}, 0 },
2348 { "movB", { Ebh3
, Gb
}, 0 },
2349 { "movS", { Evh3
, Gv
}, 0 },
2350 { "movB", { Gb
, EbS
}, 0 },
2351 { "movS", { Gv
, EvS
}, 0 },
2352 { "movD", { Sv
, Sw
}, 0 },
2353 { MOD_TABLE (MOD_8D
) },
2354 { "movD", { Sw
, Sv
}, 0 },
2355 { REG_TABLE (REG_8F
) },
2357 { PREFIX_TABLE (PREFIX_90
) },
2358 { "xchgS", { RMeCX
, eAX
}, 0 },
2359 { "xchgS", { RMeDX
, eAX
}, 0 },
2360 { "xchgS", { RMeBX
, eAX
}, 0 },
2361 { "xchgS", { RMeSP
, eAX
}, 0 },
2362 { "xchgS", { RMeBP
, eAX
}, 0 },
2363 { "xchgS", { RMeSI
, eAX
}, 0 },
2364 { "xchgS", { RMeDI
, eAX
}, 0 },
2366 { "cW{t|}R", { XX
}, 0 },
2367 { "cR{t|}O", { XX
}, 0 },
2368 { X86_64_TABLE (X86_64_9A
) },
2369 { Bad_Opcode
}, /* fwait */
2370 { "pushfT", { XX
}, 0 },
2371 { "popfT", { XX
}, 0 },
2372 { "sahf", { XX
}, 0 },
2373 { "lahf", { XX
}, 0 },
2375 { "mov%LB", { AL
, Ob
}, 0 },
2376 { "mov%LS", { eAX
, Ov
}, 0 },
2377 { "mov%LB", { Ob
, AL
}, 0 },
2378 { "mov%LS", { Ov
, eAX
}, 0 },
2379 { "movs{b|}", { Ybr
, Xb
}, 0 },
2380 { "movs{R|}", { Yvr
, Xv
}, 0 },
2381 { "cmps{b|}", { Xb
, Yb
}, 0 },
2382 { "cmps{R|}", { Xv
, Yv
}, 0 },
2384 { "testB", { AL
, Ib
}, 0 },
2385 { "testS", { eAX
, Iv
}, 0 },
2386 { "stosB", { Ybr
, AL
}, 0 },
2387 { "stosS", { Yvr
, eAX
}, 0 },
2388 { "lodsB", { ALr
, Xb
}, 0 },
2389 { "lodsS", { eAXr
, Xv
}, 0 },
2390 { "scasB", { AL
, Yb
}, 0 },
2391 { "scasS", { eAX
, Yv
}, 0 },
2393 { "movB", { RMAL
, Ib
}, 0 },
2394 { "movB", { RMCL
, Ib
}, 0 },
2395 { "movB", { RMDL
, Ib
}, 0 },
2396 { "movB", { RMBL
, Ib
}, 0 },
2397 { "movB", { RMAH
, Ib
}, 0 },
2398 { "movB", { RMCH
, Ib
}, 0 },
2399 { "movB", { RMDH
, Ib
}, 0 },
2400 { "movB", { RMBH
, Ib
}, 0 },
2402 { "mov%LV", { RMeAX
, Iv64
}, 0 },
2403 { "mov%LV", { RMeCX
, Iv64
}, 0 },
2404 { "mov%LV", { RMeDX
, Iv64
}, 0 },
2405 { "mov%LV", { RMeBX
, Iv64
}, 0 },
2406 { "mov%LV", { RMeSP
, Iv64
}, 0 },
2407 { "mov%LV", { RMeBP
, Iv64
}, 0 },
2408 { "mov%LV", { RMeSI
, Iv64
}, 0 },
2409 { "mov%LV", { RMeDI
, Iv64
}, 0 },
2411 { REG_TABLE (REG_C0
) },
2412 { REG_TABLE (REG_C1
) },
2413 { X86_64_TABLE (X86_64_C2
) },
2414 { X86_64_TABLE (X86_64_C3
) },
2415 { X86_64_TABLE (X86_64_C4
) },
2416 { X86_64_TABLE (X86_64_C5
) },
2417 { REG_TABLE (REG_C6
) },
2418 { REG_TABLE (REG_C7
) },
2420 { "enterT", { Iw
, Ib
}, 0 },
2421 { "leaveT", { XX
}, 0 },
2422 { "{l|}ret{|f}P", { Iw
}, 0 },
2423 { "{l|}ret{|f}P", { XX
}, 0 },
2424 { "int3", { XX
}, 0 },
2425 { "int", { Ib
}, 0 },
2426 { X86_64_TABLE (X86_64_CE
) },
2427 { "iret%LP", { XX
}, 0 },
2429 { REG_TABLE (REG_D0
) },
2430 { REG_TABLE (REG_D1
) },
2431 { REG_TABLE (REG_D2
) },
2432 { REG_TABLE (REG_D3
) },
2433 { X86_64_TABLE (X86_64_D4
) },
2434 { X86_64_TABLE (X86_64_D5
) },
2436 { "xlat", { DSBX
}, 0 },
2447 { "loopneFH", { Jb
, XX
, loop_jcxz_flag
}, 0 },
2448 { "loopeFH", { Jb
, XX
, loop_jcxz_flag
}, 0 },
2449 { "loopFH", { Jb
, XX
, loop_jcxz_flag
}, 0 },
2450 { "jEcxzH", { Jb
, XX
, loop_jcxz_flag
}, 0 },
2451 { "inB", { AL
, Ib
}, 0 },
2452 { "inG", { zAX
, Ib
}, 0 },
2453 { "outB", { Ib
, AL
}, 0 },
2454 { "outG", { Ib
, zAX
}, 0 },
2456 { X86_64_TABLE (X86_64_E8
) },
2457 { X86_64_TABLE (X86_64_E9
) },
2458 { X86_64_TABLE (X86_64_EA
) },
2459 { "jmp", { Jb
, BND
}, 0 },
2460 { "inB", { AL
, indirDX
}, 0 },
2461 { "inG", { zAX
, indirDX
}, 0 },
2462 { "outB", { indirDX
, AL
}, 0 },
2463 { "outG", { indirDX
, zAX
}, 0 },
2465 { Bad_Opcode
}, /* lock prefix */
2466 { "icebp", { XX
}, 0 },
2467 { Bad_Opcode
}, /* repne */
2468 { Bad_Opcode
}, /* repz */
2469 { "hlt", { XX
}, 0 },
2470 { "cmc", { XX
}, 0 },
2471 { REG_TABLE (REG_F6
) },
2472 { REG_TABLE (REG_F7
) },
2474 { "clc", { XX
}, 0 },
2475 { "stc", { XX
}, 0 },
2476 { "cli", { XX
}, 0 },
2477 { "sti", { XX
}, 0 },
2478 { "cld", { XX
}, 0 },
2479 { "std", { XX
}, 0 },
2480 { REG_TABLE (REG_FE
) },
2481 { REG_TABLE (REG_FF
) },
2484 static const struct dis386 dis386_twobyte
[] = {
2486 { REG_TABLE (REG_0F00
) },
2487 { REG_TABLE (REG_0F01
) },
2488 { "larS", { Gv
, Ew
}, 0 },
2489 { "lslS", { Gv
, Ew
}, 0 },
2491 { "syscall", { XX
}, 0 },
2492 { "clts", { XX
}, 0 },
2493 { "sysret%LQ", { XX
}, 0 },
2495 { "invd", { XX
}, 0 },
2496 { PREFIX_TABLE (PREFIX_0F09
) },
2498 { "ud2", { XX
}, 0 },
2500 { REG_TABLE (REG_0F0D
) },
2501 { "femms", { XX
}, 0 },
2502 { "", { MX
, EM
, OPSUF
}, 0 }, /* See OP_3DNowSuffix. */
2504 { PREFIX_TABLE (PREFIX_0F10
) },
2505 { PREFIX_TABLE (PREFIX_0F11
) },
2506 { PREFIX_TABLE (PREFIX_0F12
) },
2507 { MOD_TABLE (MOD_0F13
) },
2508 { "unpcklpX", { XM
, EXx
}, PREFIX_OPCODE
},
2509 { "unpckhpX", { XM
, EXx
}, PREFIX_OPCODE
},
2510 { PREFIX_TABLE (PREFIX_0F16
) },
2511 { MOD_TABLE (MOD_0F17
) },
2513 { REG_TABLE (REG_0F18
) },
2514 { "nopQ", { Ev
}, 0 },
2515 { PREFIX_TABLE (PREFIX_0F1A
) },
2516 { PREFIX_TABLE (PREFIX_0F1B
) },
2517 { PREFIX_TABLE (PREFIX_0F1C
) },
2518 { "nopQ", { Ev
}, 0 },
2519 { PREFIX_TABLE (PREFIX_0F1E
) },
2520 { "nopQ", { Ev
}, 0 },
2522 { "movZ", { Rm
, Cm
}, 0 },
2523 { "movZ", { Rm
, Dm
}, 0 },
2524 { "movZ", { Cm
, Rm
}, 0 },
2525 { "movZ", { Dm
, Rm
}, 0 },
2526 { MOD_TABLE (MOD_0F24
) },
2528 { MOD_TABLE (MOD_0F26
) },
2531 { "movapX", { XM
, EXx
}, PREFIX_OPCODE
},
2532 { "movapX", { EXxS
, XM
}, PREFIX_OPCODE
},
2533 { PREFIX_TABLE (PREFIX_0F2A
) },
2534 { PREFIX_TABLE (PREFIX_0F2B
) },
2535 { PREFIX_TABLE (PREFIX_0F2C
) },
2536 { PREFIX_TABLE (PREFIX_0F2D
) },
2537 { PREFIX_TABLE (PREFIX_0F2E
) },
2538 { PREFIX_TABLE (PREFIX_0F2F
) },
2540 { "wrmsr", { XX
}, 0 },
2541 { "rdtsc", { XX
}, 0 },
2542 { "rdmsr", { XX
}, 0 },
2543 { "rdpmc", { XX
}, 0 },
2544 { "sysenter", { SEP
}, 0 },
2545 { "sysexit", { SEP
}, 0 },
2547 { "getsec", { XX
}, 0 },
2549 { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F38
, PREFIX_OPCODE
) },
2551 { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F3A
, PREFIX_OPCODE
) },
2558 { "cmovoS", { Gv
, Ev
}, 0 },
2559 { "cmovnoS", { Gv
, Ev
}, 0 },
2560 { "cmovbS", { Gv
, Ev
}, 0 },
2561 { "cmovaeS", { Gv
, Ev
}, 0 },
2562 { "cmoveS", { Gv
, Ev
}, 0 },
2563 { "cmovneS", { Gv
, Ev
}, 0 },
2564 { "cmovbeS", { Gv
, Ev
}, 0 },
2565 { "cmovaS", { Gv
, Ev
}, 0 },
2567 { "cmovsS", { Gv
, Ev
}, 0 },
2568 { "cmovnsS", { Gv
, Ev
}, 0 },
2569 { "cmovpS", { Gv
, Ev
}, 0 },
2570 { "cmovnpS", { Gv
, Ev
}, 0 },
2571 { "cmovlS", { Gv
, Ev
}, 0 },
2572 { "cmovgeS", { Gv
, Ev
}, 0 },
2573 { "cmovleS", { Gv
, Ev
}, 0 },
2574 { "cmovgS", { Gv
, Ev
}, 0 },
2576 { MOD_TABLE (MOD_0F50
) },
2577 { PREFIX_TABLE (PREFIX_0F51
) },
2578 { PREFIX_TABLE (PREFIX_0F52
) },
2579 { PREFIX_TABLE (PREFIX_0F53
) },
2580 { "andpX", { XM
, EXx
}, PREFIX_OPCODE
},
2581 { "andnpX", { XM
, EXx
}, PREFIX_OPCODE
},
2582 { "orpX", { XM
, EXx
}, PREFIX_OPCODE
},
2583 { "xorpX", { XM
, EXx
}, PREFIX_OPCODE
},
2585 { PREFIX_TABLE (PREFIX_0F58
) },
2586 { PREFIX_TABLE (PREFIX_0F59
) },
2587 { PREFIX_TABLE (PREFIX_0F5A
) },
2588 { PREFIX_TABLE (PREFIX_0F5B
) },
2589 { PREFIX_TABLE (PREFIX_0F5C
) },
2590 { PREFIX_TABLE (PREFIX_0F5D
) },
2591 { PREFIX_TABLE (PREFIX_0F5E
) },
2592 { PREFIX_TABLE (PREFIX_0F5F
) },
2594 { PREFIX_TABLE (PREFIX_0F60
) },
2595 { PREFIX_TABLE (PREFIX_0F61
) },
2596 { PREFIX_TABLE (PREFIX_0F62
) },
2597 { "packsswb", { MX
, EM
}, PREFIX_OPCODE
},
2598 { "pcmpgtb", { MX
, EM
}, PREFIX_OPCODE
},
2599 { "pcmpgtw", { MX
, EM
}, PREFIX_OPCODE
},
2600 { "pcmpgtd", { MX
, EM
}, PREFIX_OPCODE
},
2601 { "packuswb", { MX
, EM
}, PREFIX_OPCODE
},
2603 { "punpckhbw", { MX
, EM
}, PREFIX_OPCODE
},
2604 { "punpckhwd", { MX
, EM
}, PREFIX_OPCODE
},
2605 { "punpckhdq", { MX
, EM
}, PREFIX_OPCODE
},
2606 { "packssdw", { MX
, EM
}, PREFIX_OPCODE
},
2607 { PREFIX_TABLE (PREFIX_0F6C
) },
2608 { PREFIX_TABLE (PREFIX_0F6D
) },
2609 { "movK", { MX
, Edq
}, PREFIX_OPCODE
},
2610 { PREFIX_TABLE (PREFIX_0F6F
) },
2612 { PREFIX_TABLE (PREFIX_0F70
) },
2613 { REG_TABLE (REG_0F71
) },
2614 { REG_TABLE (REG_0F72
) },
2615 { REG_TABLE (REG_0F73
) },
2616 { "pcmpeqb", { MX
, EM
}, PREFIX_OPCODE
},
2617 { "pcmpeqw", { MX
, EM
}, PREFIX_OPCODE
},
2618 { "pcmpeqd", { MX
, EM
}, PREFIX_OPCODE
},
2619 { "emms", { XX
}, PREFIX_OPCODE
},
2621 { PREFIX_TABLE (PREFIX_0F78
) },
2622 { PREFIX_TABLE (PREFIX_0F79
) },
2625 { PREFIX_TABLE (PREFIX_0F7C
) },
2626 { PREFIX_TABLE (PREFIX_0F7D
) },
2627 { PREFIX_TABLE (PREFIX_0F7E
) },
2628 { PREFIX_TABLE (PREFIX_0F7F
) },
2630 { "joH", { Jv
, BND
, cond_jump_flag
}, 0 },
2631 { "jnoH", { Jv
, BND
, cond_jump_flag
}, 0 },
2632 { "jbH", { Jv
, BND
, cond_jump_flag
}, 0 },
2633 { "jaeH", { Jv
, BND
, cond_jump_flag
}, 0 },
2634 { "jeH", { Jv
, BND
, cond_jump_flag
}, 0 },
2635 { "jneH", { Jv
, BND
, cond_jump_flag
}, 0 },
2636 { "jbeH", { Jv
, BND
, cond_jump_flag
}, 0 },
2637 { "jaH", { Jv
, BND
, cond_jump_flag
}, 0 },
2639 { "jsH", { Jv
, BND
, cond_jump_flag
}, 0 },
2640 { "jnsH", { Jv
, BND
, cond_jump_flag
}, 0 },
2641 { "jpH", { Jv
, BND
, cond_jump_flag
}, 0 },
2642 { "jnpH", { Jv
, BND
, cond_jump_flag
}, 0 },
2643 { "jlH", { Jv
, BND
, cond_jump_flag
}, 0 },
2644 { "jgeH", { Jv
, BND
, cond_jump_flag
}, 0 },
2645 { "jleH", { Jv
, BND
, cond_jump_flag
}, 0 },
2646 { "jgH", { Jv
, BND
, cond_jump_flag
}, 0 },
2648 { "seto", { Eb
}, 0 },
2649 { "setno", { Eb
}, 0 },
2650 { "setb", { Eb
}, 0 },
2651 { "setae", { Eb
}, 0 },
2652 { "sete", { Eb
}, 0 },
2653 { "setne", { Eb
}, 0 },
2654 { "setbe", { Eb
}, 0 },
2655 { "seta", { Eb
}, 0 },
2657 { "sets", { Eb
}, 0 },
2658 { "setns", { Eb
}, 0 },
2659 { "setp", { Eb
}, 0 },
2660 { "setnp", { Eb
}, 0 },
2661 { "setl", { Eb
}, 0 },
2662 { "setge", { Eb
}, 0 },
2663 { "setle", { Eb
}, 0 },
2664 { "setg", { Eb
}, 0 },
2666 { "pushT", { fs
}, 0 },
2667 { "popT", { fs
}, 0 },
2668 { "cpuid", { XX
}, 0 },
2669 { "btS", { Ev
, Gv
}, 0 },
2670 { "shldS", { Ev
, Gv
, Ib
}, 0 },
2671 { "shldS", { Ev
, Gv
, CL
}, 0 },
2672 { REG_TABLE (REG_0FA6
) },
2673 { REG_TABLE (REG_0FA7
) },
2675 { "pushT", { gs
}, 0 },
2676 { "popT", { gs
}, 0 },
2677 { "rsm", { XX
}, 0 },
2678 { "btsS", { Evh1
, Gv
}, 0 },
2679 { "shrdS", { Ev
, Gv
, Ib
}, 0 },
2680 { "shrdS", { Ev
, Gv
, CL
}, 0 },
2681 { REG_TABLE (REG_0FAE
) },
2682 { "imulS", { Gv
, Ev
}, 0 },
2684 { "cmpxchgB", { Ebh1
, Gb
}, 0 },
2685 { "cmpxchgS", { Evh1
, Gv
}, 0 },
2686 { MOD_TABLE (MOD_0FB2
) },
2687 { "btrS", { Evh1
, Gv
}, 0 },
2688 { MOD_TABLE (MOD_0FB4
) },
2689 { MOD_TABLE (MOD_0FB5
) },
2690 { "movz{bR|x}", { Gv
, Eb
}, 0 },
2691 { "movz{wR|x}", { Gv
, Ew
}, 0 }, /* yes, there really is movzww ! */
2693 { PREFIX_TABLE (PREFIX_0FB8
) },
2694 { "ud1S", { Gv
, Ev
}, 0 },
2695 { REG_TABLE (REG_0FBA
) },
2696 { "btcS", { Evh1
, Gv
}, 0 },
2697 { PREFIX_TABLE (PREFIX_0FBC
) },
2698 { PREFIX_TABLE (PREFIX_0FBD
) },
2699 { "movs{bR|x}", { Gv
, Eb
}, 0 },
2700 { "movs{wR|x}", { Gv
, Ew
}, 0 }, /* yes, there really is movsww ! */
2702 { "xaddB", { Ebh1
, Gb
}, 0 },
2703 { "xaddS", { Evh1
, Gv
}, 0 },
2704 { PREFIX_TABLE (PREFIX_0FC2
) },
2705 { MOD_TABLE (MOD_0FC3
) },
2706 { "pinsrw", { MX
, Edqw
, Ib
}, PREFIX_OPCODE
},
2707 { "pextrw", { Gdq
, MS
, Ib
}, PREFIX_OPCODE
},
2708 { "shufpX", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
2709 { REG_TABLE (REG_0FC7
) },
2711 { "bswap", { RMeAX
}, 0 },
2712 { "bswap", { RMeCX
}, 0 },
2713 { "bswap", { RMeDX
}, 0 },
2714 { "bswap", { RMeBX
}, 0 },
2715 { "bswap", { RMeSP
}, 0 },
2716 { "bswap", { RMeBP
}, 0 },
2717 { "bswap", { RMeSI
}, 0 },
2718 { "bswap", { RMeDI
}, 0 },
2720 { PREFIX_TABLE (PREFIX_0FD0
) },
2721 { "psrlw", { MX
, EM
}, PREFIX_OPCODE
},
2722 { "psrld", { MX
, EM
}, PREFIX_OPCODE
},
2723 { "psrlq", { MX
, EM
}, PREFIX_OPCODE
},
2724 { "paddq", { MX
, EM
}, PREFIX_OPCODE
},
2725 { "pmullw", { MX
, EM
}, PREFIX_OPCODE
},
2726 { PREFIX_TABLE (PREFIX_0FD6
) },
2727 { MOD_TABLE (MOD_0FD7
) },
2729 { "psubusb", { MX
, EM
}, PREFIX_OPCODE
},
2730 { "psubusw", { MX
, EM
}, PREFIX_OPCODE
},
2731 { "pminub", { MX
, EM
}, PREFIX_OPCODE
},
2732 { "pand", { MX
, EM
}, PREFIX_OPCODE
},
2733 { "paddusb", { MX
, EM
}, PREFIX_OPCODE
},
2734 { "paddusw", { MX
, EM
}, PREFIX_OPCODE
},
2735 { "pmaxub", { MX
, EM
}, PREFIX_OPCODE
},
2736 { "pandn", { MX
, EM
}, PREFIX_OPCODE
},
2738 { "pavgb", { MX
, EM
}, PREFIX_OPCODE
},
2739 { "psraw", { MX
, EM
}, PREFIX_OPCODE
},
2740 { "psrad", { MX
, EM
}, PREFIX_OPCODE
},
2741 { "pavgw", { MX
, EM
}, PREFIX_OPCODE
},
2742 { "pmulhuw", { MX
, EM
}, PREFIX_OPCODE
},
2743 { "pmulhw", { MX
, EM
}, PREFIX_OPCODE
},
2744 { PREFIX_TABLE (PREFIX_0FE6
) },
2745 { PREFIX_TABLE (PREFIX_0FE7
) },
2747 { "psubsb", { MX
, EM
}, PREFIX_OPCODE
},
2748 { "psubsw", { MX
, EM
}, PREFIX_OPCODE
},
2749 { "pminsw", { MX
, EM
}, PREFIX_OPCODE
},
2750 { "por", { MX
, EM
}, PREFIX_OPCODE
},
2751 { "paddsb", { MX
, EM
}, PREFIX_OPCODE
},
2752 { "paddsw", { MX
, EM
}, PREFIX_OPCODE
},
2753 { "pmaxsw", { MX
, EM
}, PREFIX_OPCODE
},
2754 { "pxor", { MX
, EM
}, PREFIX_OPCODE
},
2756 { PREFIX_TABLE (PREFIX_0FF0
) },
2757 { "psllw", { MX
, EM
}, PREFIX_OPCODE
},
2758 { "pslld", { MX
, EM
}, PREFIX_OPCODE
},
2759 { "psllq", { MX
, EM
}, PREFIX_OPCODE
},
2760 { "pmuludq", { MX
, EM
}, PREFIX_OPCODE
},
2761 { "pmaddwd", { MX
, EM
}, PREFIX_OPCODE
},
2762 { "psadbw", { MX
, EM
}, PREFIX_OPCODE
},
2763 { PREFIX_TABLE (PREFIX_0FF7
) },
2765 { "psubb", { MX
, EM
}, PREFIX_OPCODE
},
2766 { "psubw", { MX
, EM
}, PREFIX_OPCODE
},
2767 { "psubd", { MX
, EM
}, PREFIX_OPCODE
},
2768 { "psubq", { MX
, EM
}, PREFIX_OPCODE
},
2769 { "paddb", { MX
, EM
}, PREFIX_OPCODE
},
2770 { "paddw", { MX
, EM
}, PREFIX_OPCODE
},
2771 { "paddd", { MX
, EM
}, PREFIX_OPCODE
},
2772 { "ud0S", { Gv
, Ev
}, 0 },
2775 static const unsigned char onebyte_has_modrm
[256] = {
2776 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2777 /* ------------------------------- */
2778 /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
2779 /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
2780 /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
2781 /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
2782 /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
2783 /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
2784 /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
2785 /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
2786 /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
2787 /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
2788 /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
2789 /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
2790 /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
2791 /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
2792 /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
2793 /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1 /* f0 */
2794 /* ------------------------------- */
2795 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2798 static const unsigned char twobyte_has_modrm
[256] = {
2799 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2800 /* ------------------------------- */
2801 /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
2802 /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
2803 /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
2804 /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
2805 /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
2806 /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
2807 /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
2808 /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
2809 /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
2810 /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
2811 /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
2812 /* b0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* bf */
2813 /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
2814 /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
2815 /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
2816 /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 /* ff */
2817 /* ------------------------------- */
2818 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2821 static char obuf
[100];
2823 static char *mnemonicendp
;
2824 static char scratchbuf
[100];
2825 static unsigned char *start_codep
;
2826 static unsigned char *insn_codep
;
2827 static unsigned char *codep
;
2828 static unsigned char *end_codep
;
2829 static int last_lock_prefix
;
2830 static int last_repz_prefix
;
2831 static int last_repnz_prefix
;
2832 static int last_data_prefix
;
2833 static int last_addr_prefix
;
2834 static int last_rex_prefix
;
2835 static int last_seg_prefix
;
2836 static int fwait_prefix
;
2837 /* The active segment register prefix. */
2838 static int active_seg_prefix
;
2839 #define MAX_CODE_LENGTH 15
2840 /* We can up to 14 prefixes since the maximum instruction length is
2842 static int all_prefixes
[MAX_CODE_LENGTH
- 1];
2843 static disassemble_info
*the_info
;
2851 static unsigned char need_modrm
;
2861 int register_specifier
;
2868 int mask_register_specifier
;
2874 static unsigned char need_vex
;
2875 static unsigned char need_vex_reg
;
2883 /* If we are accessing mod/rm/reg without need_modrm set, then the
2884 values are stale. Hitting this abort likely indicates that you
2885 need to update onebyte_has_modrm or twobyte_has_modrm. */
2886 #define MODRM_CHECK if (!need_modrm) abort ()
2888 static const char **names64
;
2889 static const char **names32
;
2890 static const char **names16
;
2891 static const char **names8
;
2892 static const char **names8rex
;
2893 static const char **names_seg
;
2894 static const char *index64
;
2895 static const char *index32
;
2896 static const char **index16
;
2897 static const char **names_bnd
;
2899 static const char *intel_names64
[] = {
2900 "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
2901 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2903 static const char *intel_names32
[] = {
2904 "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
2905 "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
2907 static const char *intel_names16
[] = {
2908 "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
2909 "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
2911 static const char *intel_names8
[] = {
2912 "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
2914 static const char *intel_names8rex
[] = {
2915 "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
2916 "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
2918 static const char *intel_names_seg
[] = {
2919 "es", "cs", "ss", "ds", "fs", "gs", "?", "?",
2921 static const char *intel_index64
= "riz";
2922 static const char *intel_index32
= "eiz";
2923 static const char *intel_index16
[] = {
2924 "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
2927 static const char *att_names64
[] = {
2928 "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
2929 "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
2931 static const char *att_names32
[] = {
2932 "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
2933 "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
2935 static const char *att_names16
[] = {
2936 "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
2937 "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
2939 static const char *att_names8
[] = {
2940 "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
2942 static const char *att_names8rex
[] = {
2943 "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
2944 "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
2946 static const char *att_names_seg
[] = {
2947 "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
2949 static const char *att_index64
= "%riz";
2950 static const char *att_index32
= "%eiz";
2951 static const char *att_index16
[] = {
2952 "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
2955 static const char **names_mm
;
2956 static const char *intel_names_mm
[] = {
2957 "mm0", "mm1", "mm2", "mm3",
2958 "mm4", "mm5", "mm6", "mm7"
2960 static const char *att_names_mm
[] = {
2961 "%mm0", "%mm1", "%mm2", "%mm3",
2962 "%mm4", "%mm5", "%mm6", "%mm7"
2965 static const char *intel_names_bnd
[] = {
2966 "bnd0", "bnd1", "bnd2", "bnd3"
2969 static const char *att_names_bnd
[] = {
2970 "%bnd0", "%bnd1", "%bnd2", "%bnd3"
2973 static const char **names_xmm
;
2974 static const char *intel_names_xmm
[] = {
2975 "xmm0", "xmm1", "xmm2", "xmm3",
2976 "xmm4", "xmm5", "xmm6", "xmm7",
2977 "xmm8", "xmm9", "xmm10", "xmm11",
2978 "xmm12", "xmm13", "xmm14", "xmm15",
2979 "xmm16", "xmm17", "xmm18", "xmm19",
2980 "xmm20", "xmm21", "xmm22", "xmm23",
2981 "xmm24", "xmm25", "xmm26", "xmm27",
2982 "xmm28", "xmm29", "xmm30", "xmm31"
2984 static const char *att_names_xmm
[] = {
2985 "%xmm0", "%xmm1", "%xmm2", "%xmm3",
2986 "%xmm4", "%xmm5", "%xmm6", "%xmm7",
2987 "%xmm8", "%xmm9", "%xmm10", "%xmm11",
2988 "%xmm12", "%xmm13", "%xmm14", "%xmm15",
2989 "%xmm16", "%xmm17", "%xmm18", "%xmm19",
2990 "%xmm20", "%xmm21", "%xmm22", "%xmm23",
2991 "%xmm24", "%xmm25", "%xmm26", "%xmm27",
2992 "%xmm28", "%xmm29", "%xmm30", "%xmm31"
2995 static const char **names_ymm
;
2996 static const char *intel_names_ymm
[] = {
2997 "ymm0", "ymm1", "ymm2", "ymm3",
2998 "ymm4", "ymm5", "ymm6", "ymm7",
2999 "ymm8", "ymm9", "ymm10", "ymm11",
3000 "ymm12", "ymm13", "ymm14", "ymm15",
3001 "ymm16", "ymm17", "ymm18", "ymm19",
3002 "ymm20", "ymm21", "ymm22", "ymm23",
3003 "ymm24", "ymm25", "ymm26", "ymm27",
3004 "ymm28", "ymm29", "ymm30", "ymm31"
3006 static const char *att_names_ymm
[] = {
3007 "%ymm0", "%ymm1", "%ymm2", "%ymm3",
3008 "%ymm4", "%ymm5", "%ymm6", "%ymm7",
3009 "%ymm8", "%ymm9", "%ymm10", "%ymm11",
3010 "%ymm12", "%ymm13", "%ymm14", "%ymm15",
3011 "%ymm16", "%ymm17", "%ymm18", "%ymm19",
3012 "%ymm20", "%ymm21", "%ymm22", "%ymm23",
3013 "%ymm24", "%ymm25", "%ymm26", "%ymm27",
3014 "%ymm28", "%ymm29", "%ymm30", "%ymm31"
3017 static const char **names_zmm
;
3018 static const char *intel_names_zmm
[] = {
3019 "zmm0", "zmm1", "zmm2", "zmm3",
3020 "zmm4", "zmm5", "zmm6", "zmm7",
3021 "zmm8", "zmm9", "zmm10", "zmm11",
3022 "zmm12", "zmm13", "zmm14", "zmm15",
3023 "zmm16", "zmm17", "zmm18", "zmm19",
3024 "zmm20", "zmm21", "zmm22", "zmm23",
3025 "zmm24", "zmm25", "zmm26", "zmm27",
3026 "zmm28", "zmm29", "zmm30", "zmm31"
3028 static const char *att_names_zmm
[] = {
3029 "%zmm0", "%zmm1", "%zmm2", "%zmm3",
3030 "%zmm4", "%zmm5", "%zmm6", "%zmm7",
3031 "%zmm8", "%zmm9", "%zmm10", "%zmm11",
3032 "%zmm12", "%zmm13", "%zmm14", "%zmm15",
3033 "%zmm16", "%zmm17", "%zmm18", "%zmm19",
3034 "%zmm20", "%zmm21", "%zmm22", "%zmm23",
3035 "%zmm24", "%zmm25", "%zmm26", "%zmm27",
3036 "%zmm28", "%zmm29", "%zmm30", "%zmm31"
3039 static const char **names_mask
;
3040 static const char *intel_names_mask
[] = {
3041 "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7"
3043 static const char *att_names_mask
[] = {
3044 "%k0", "%k1", "%k2", "%k3", "%k4", "%k5", "%k6", "%k7"
3047 static const char *names_rounding
[] =
3055 static const struct dis386 reg_table
[][8] = {
3058 { "addA", { Ebh1
, Ib
}, 0 },
3059 { "orA", { Ebh1
, Ib
}, 0 },
3060 { "adcA", { Ebh1
, Ib
}, 0 },
3061 { "sbbA", { Ebh1
, Ib
}, 0 },
3062 { "andA", { Ebh1
, Ib
}, 0 },
3063 { "subA", { Ebh1
, Ib
}, 0 },
3064 { "xorA", { Ebh1
, Ib
}, 0 },
3065 { "cmpA", { Eb
, Ib
}, 0 },
3069 { "addQ", { Evh1
, Iv
}, 0 },
3070 { "orQ", { Evh1
, Iv
}, 0 },
3071 { "adcQ", { Evh1
, Iv
}, 0 },
3072 { "sbbQ", { Evh1
, Iv
}, 0 },
3073 { "andQ", { Evh1
, Iv
}, 0 },
3074 { "subQ", { Evh1
, Iv
}, 0 },
3075 { "xorQ", { Evh1
, Iv
}, 0 },
3076 { "cmpQ", { Ev
, Iv
}, 0 },
3080 { "addQ", { Evh1
, sIb
}, 0 },
3081 { "orQ", { Evh1
, sIb
}, 0 },
3082 { "adcQ", { Evh1
, sIb
}, 0 },
3083 { "sbbQ", { Evh1
, sIb
}, 0 },
3084 { "andQ", { Evh1
, sIb
}, 0 },
3085 { "subQ", { Evh1
, sIb
}, 0 },
3086 { "xorQ", { Evh1
, sIb
}, 0 },
3087 { "cmpQ", { Ev
, sIb
}, 0 },
3091 { "popU", { stackEv
}, 0 },
3092 { XOP_8F_TABLE (XOP_09
) },
3096 { XOP_8F_TABLE (XOP_09
) },
3100 { "rolA", { Eb
, Ib
}, 0 },
3101 { "rorA", { Eb
, Ib
}, 0 },
3102 { "rclA", { Eb
, Ib
}, 0 },
3103 { "rcrA", { Eb
, Ib
}, 0 },
3104 { "shlA", { Eb
, Ib
}, 0 },
3105 { "shrA", { Eb
, Ib
}, 0 },
3106 { "shlA", { Eb
, Ib
}, 0 },
3107 { "sarA", { Eb
, Ib
}, 0 },
3111 { "rolQ", { Ev
, Ib
}, 0 },
3112 { "rorQ", { Ev
, Ib
}, 0 },
3113 { "rclQ", { Ev
, Ib
}, 0 },
3114 { "rcrQ", { Ev
, Ib
}, 0 },
3115 { "shlQ", { Ev
, Ib
}, 0 },
3116 { "shrQ", { Ev
, Ib
}, 0 },
3117 { "shlQ", { Ev
, Ib
}, 0 },
3118 { "sarQ", { Ev
, Ib
}, 0 },
3122 { "movA", { Ebh3
, Ib
}, 0 },
3129 { MOD_TABLE (MOD_C6_REG_7
) },
3133 { "movQ", { Evh3
, Iv
}, 0 },
3140 { MOD_TABLE (MOD_C7_REG_7
) },
3144 { "rolA", { Eb
, I1
}, 0 },
3145 { "rorA", { Eb
, I1
}, 0 },
3146 { "rclA", { Eb
, I1
}, 0 },
3147 { "rcrA", { Eb
, I1
}, 0 },
3148 { "shlA", { Eb
, I1
}, 0 },
3149 { "shrA", { Eb
, I1
}, 0 },
3150 { "shlA", { Eb
, I1
}, 0 },
3151 { "sarA", { Eb
, I1
}, 0 },
3155 { "rolQ", { Ev
, I1
}, 0 },
3156 { "rorQ", { Ev
, I1
}, 0 },
3157 { "rclQ", { Ev
, I1
}, 0 },
3158 { "rcrQ", { Ev
, I1
}, 0 },
3159 { "shlQ", { Ev
, I1
}, 0 },
3160 { "shrQ", { Ev
, I1
}, 0 },
3161 { "shlQ", { Ev
, I1
}, 0 },
3162 { "sarQ", { Ev
, I1
}, 0 },
3166 { "rolA", { Eb
, CL
}, 0 },
3167 { "rorA", { Eb
, CL
}, 0 },
3168 { "rclA", { Eb
, CL
}, 0 },
3169 { "rcrA", { Eb
, CL
}, 0 },
3170 { "shlA", { Eb
, CL
}, 0 },
3171 { "shrA", { Eb
, CL
}, 0 },
3172 { "shlA", { Eb
, CL
}, 0 },
3173 { "sarA", { Eb
, CL
}, 0 },
3177 { "rolQ", { Ev
, CL
}, 0 },
3178 { "rorQ", { Ev
, CL
}, 0 },
3179 { "rclQ", { Ev
, CL
}, 0 },
3180 { "rcrQ", { Ev
, CL
}, 0 },
3181 { "shlQ", { Ev
, CL
}, 0 },
3182 { "shrQ", { Ev
, CL
}, 0 },
3183 { "shlQ", { Ev
, CL
}, 0 },
3184 { "sarQ", { Ev
, CL
}, 0 },
3188 { "testA", { Eb
, Ib
}, 0 },
3189 { "testA", { Eb
, Ib
}, 0 },
3190 { "notA", { Ebh1
}, 0 },
3191 { "negA", { Ebh1
}, 0 },
3192 { "mulA", { Eb
}, 0 }, /* Don't print the implicit %al register, */
3193 { "imulA", { Eb
}, 0 }, /* to distinguish these opcodes from other */
3194 { "divA", { Eb
}, 0 }, /* mul/imul opcodes. Do the same for div */
3195 { "idivA", { Eb
}, 0 }, /* and idiv for consistency. */
3199 { "testQ", { Ev
, Iv
}, 0 },
3200 { "testQ", { Ev
, Iv
}, 0 },
3201 { "notQ", { Evh1
}, 0 },
3202 { "negQ", { Evh1
}, 0 },
3203 { "mulQ", { Ev
}, 0 }, /* Don't print the implicit register. */
3204 { "imulQ", { Ev
}, 0 },
3205 { "divQ", { Ev
}, 0 },
3206 { "idivQ", { Ev
}, 0 },
3210 { "incA", { Ebh1
}, 0 },
3211 { "decA", { Ebh1
}, 0 },
3215 { "incQ", { Evh1
}, 0 },
3216 { "decQ", { Evh1
}, 0 },
3217 { "call{&|}", { NOTRACK
, indirEv
, BND
}, 0 },
3218 { MOD_TABLE (MOD_FF_REG_3
) },
3219 { "jmp{&|}", { NOTRACK
, indirEv
, BND
}, 0 },
3220 { MOD_TABLE (MOD_FF_REG_5
) },
3221 { "pushU", { stackEv
}, 0 },
3226 { "sldtD", { Sv
}, 0 },
3227 { "strD", { Sv
}, 0 },
3228 { "lldt", { Ew
}, 0 },
3229 { "ltr", { Ew
}, 0 },
3230 { "verr", { Ew
}, 0 },
3231 { "verw", { Ew
}, 0 },
3237 { MOD_TABLE (MOD_0F01_REG_0
) },
3238 { MOD_TABLE (MOD_0F01_REG_1
) },
3239 { MOD_TABLE (MOD_0F01_REG_2
) },
3240 { MOD_TABLE (MOD_0F01_REG_3
) },
3241 { "smswD", { Sv
}, 0 },
3242 { MOD_TABLE (MOD_0F01_REG_5
) },
3243 { "lmsw", { Ew
}, 0 },
3244 { MOD_TABLE (MOD_0F01_REG_7
) },
3248 { "prefetch", { Mb
}, 0 },
3249 { "prefetchw", { Mb
}, 0 },
3250 { "prefetchwt1", { Mb
}, 0 },
3251 { "prefetch", { Mb
}, 0 },
3252 { "prefetch", { Mb
}, 0 },
3253 { "prefetch", { Mb
}, 0 },
3254 { "prefetch", { Mb
}, 0 },
3255 { "prefetch", { Mb
}, 0 },
3259 { MOD_TABLE (MOD_0F18_REG_0
) },
3260 { MOD_TABLE (MOD_0F18_REG_1
) },
3261 { MOD_TABLE (MOD_0F18_REG_2
) },
3262 { MOD_TABLE (MOD_0F18_REG_3
) },
3263 { MOD_TABLE (MOD_0F18_REG_4
) },
3264 { MOD_TABLE (MOD_0F18_REG_5
) },
3265 { MOD_TABLE (MOD_0F18_REG_6
) },
3266 { MOD_TABLE (MOD_0F18_REG_7
) },
3268 /* REG_0F1C_P_0_MOD_0 */
3270 { "cldemote", { Mb
}, 0 },
3271 { "nopQ", { Ev
}, 0 },
3272 { "nopQ", { Ev
}, 0 },
3273 { "nopQ", { Ev
}, 0 },
3274 { "nopQ", { Ev
}, 0 },
3275 { "nopQ", { Ev
}, 0 },
3276 { "nopQ", { Ev
}, 0 },
3277 { "nopQ", { Ev
}, 0 },
3279 /* REG_0F1E_P_1_MOD_3 */
3281 { "nopQ", { Ev
}, 0 },
3282 { "rdsspK", { Rdq
}, PREFIX_OPCODE
},
3283 { "nopQ", { Ev
}, 0 },
3284 { "nopQ", { Ev
}, 0 },
3285 { "nopQ", { Ev
}, 0 },
3286 { "nopQ", { Ev
}, 0 },
3287 { "nopQ", { Ev
}, 0 },
3288 { RM_TABLE (RM_0F1E_P_1_MOD_3_REG_7
) },
3294 { MOD_TABLE (MOD_0F71_REG_2
) },
3296 { MOD_TABLE (MOD_0F71_REG_4
) },
3298 { MOD_TABLE (MOD_0F71_REG_6
) },
3304 { MOD_TABLE (MOD_0F72_REG_2
) },
3306 { MOD_TABLE (MOD_0F72_REG_4
) },
3308 { MOD_TABLE (MOD_0F72_REG_6
) },
3314 { MOD_TABLE (MOD_0F73_REG_2
) },
3315 { MOD_TABLE (MOD_0F73_REG_3
) },
3318 { MOD_TABLE (MOD_0F73_REG_6
) },
3319 { MOD_TABLE (MOD_0F73_REG_7
) },
3323 { "montmul", { { OP_0f07
, 0 } }, 0 },
3324 { "xsha1", { { OP_0f07
, 0 } }, 0 },
3325 { "xsha256", { { OP_0f07
, 0 } }, 0 },
3329 { "xstore-rng", { { OP_0f07
, 0 } }, 0 },
3330 { "xcrypt-ecb", { { OP_0f07
, 0 } }, 0 },
3331 { "xcrypt-cbc", { { OP_0f07
, 0 } }, 0 },
3332 { "xcrypt-ctr", { { OP_0f07
, 0 } }, 0 },
3333 { "xcrypt-cfb", { { OP_0f07
, 0 } }, 0 },
3334 { "xcrypt-ofb", { { OP_0f07
, 0 } }, 0 },
3338 { MOD_TABLE (MOD_0FAE_REG_0
) },
3339 { MOD_TABLE (MOD_0FAE_REG_1
) },
3340 { MOD_TABLE (MOD_0FAE_REG_2
) },
3341 { MOD_TABLE (MOD_0FAE_REG_3
) },
3342 { MOD_TABLE (MOD_0FAE_REG_4
) },
3343 { MOD_TABLE (MOD_0FAE_REG_5
) },
3344 { MOD_TABLE (MOD_0FAE_REG_6
) },
3345 { MOD_TABLE (MOD_0FAE_REG_7
) },
3353 { "btQ", { Ev
, Ib
}, 0 },
3354 { "btsQ", { Evh1
, Ib
}, 0 },
3355 { "btrQ", { Evh1
, Ib
}, 0 },
3356 { "btcQ", { Evh1
, Ib
}, 0 },
3361 { "cmpxchg8b", { { CMPXCHG8B_Fixup
, q_mode
} }, 0 },
3363 { MOD_TABLE (MOD_0FC7_REG_3
) },
3364 { MOD_TABLE (MOD_0FC7_REG_4
) },
3365 { MOD_TABLE (MOD_0FC7_REG_5
) },
3366 { MOD_TABLE (MOD_0FC7_REG_6
) },
3367 { MOD_TABLE (MOD_0FC7_REG_7
) },
3373 { MOD_TABLE (MOD_VEX_0F71_REG_2
) },
3375 { MOD_TABLE (MOD_VEX_0F71_REG_4
) },
3377 { MOD_TABLE (MOD_VEX_0F71_REG_6
) },
3383 { MOD_TABLE (MOD_VEX_0F72_REG_2
) },
3385 { MOD_TABLE (MOD_VEX_0F72_REG_4
) },
3387 { MOD_TABLE (MOD_VEX_0F72_REG_6
) },
3393 { MOD_TABLE (MOD_VEX_0F73_REG_2
) },
3394 { MOD_TABLE (MOD_VEX_0F73_REG_3
) },
3397 { MOD_TABLE (MOD_VEX_0F73_REG_6
) },
3398 { MOD_TABLE (MOD_VEX_0F73_REG_7
) },
3404 { MOD_TABLE (MOD_VEX_0FAE_REG_2
) },
3405 { MOD_TABLE (MOD_VEX_0FAE_REG_3
) },
3407 /* REG_VEX_0F38F3 */
3410 { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_1
) },
3411 { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_2
) },
3412 { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_3
) },
3416 { "llwpcb", { { OP_LWPCB_E
, 0 } }, 0 },
3417 { "slwpcb", { { OP_LWPCB_E
, 0 } }, 0 },
3421 { "lwpins", { { OP_LWP_E
, 0 }, Ed
, Id
}, 0 },
3422 { "lwpval", { { OP_LWP_E
, 0 }, Ed
, Id
}, 0 },
3424 /* REG_XOP_TBM_01 */
3427 { "blcfill", { { OP_LWP_E
, 0 }, Edq
}, 0 },
3428 { "blsfill", { { OP_LWP_E
, 0 }, Edq
}, 0 },
3429 { "blcs", { { OP_LWP_E
, 0 }, Edq
}, 0 },
3430 { "tzmsk", { { OP_LWP_E
, 0 }, Edq
}, 0 },
3431 { "blcic", { { OP_LWP_E
, 0 }, Edq
}, 0 },
3432 { "blsic", { { OP_LWP_E
, 0 }, Edq
}, 0 },
3433 { "t1mskc", { { OP_LWP_E
, 0 }, Edq
}, 0 },
3435 /* REG_XOP_TBM_02 */
3438 { "blcmsk", { { OP_LWP_E
, 0 }, Edq
}, 0 },
3443 { "blci", { { OP_LWP_E
, 0 }, Edq
}, 0 },
3446 #include "i386-dis-evex-reg.h"
3449 static const struct dis386 prefix_table
[][4] = {
3452 { "xchgS", { { NOP_Fixup1
, eAX_reg
}, { NOP_Fixup2
, eAX_reg
} }, 0 },
3453 { "pause", { XX
}, 0 },
3454 { "xchgS", { { NOP_Fixup1
, eAX_reg
}, { NOP_Fixup2
, eAX_reg
} }, 0 },
3455 { NULL
, { { NULL
, 0 } }, PREFIX_IGNORED
}
3458 /* PREFIX_0F01_REG_3_RM_1 */
3460 { "vmmcall", { Skip_MODRM
}, 0 },
3461 { "vmgexit", { Skip_MODRM
}, 0 },
3463 { "vmgexit", { Skip_MODRM
}, 0 },
3466 /* PREFIX_0F01_REG_5_MOD_0 */
3469 { "rstorssp", { Mq
}, PREFIX_OPCODE
},
3472 /* PREFIX_0F01_REG_5_MOD_3_RM_0 */
3474 { "serialize", { Skip_MODRM
}, PREFIX_OPCODE
},
3475 { "setssbsy", { Skip_MODRM
}, PREFIX_OPCODE
},
3477 { "xsusldtrk", { Skip_MODRM
}, PREFIX_OPCODE
},
3480 /* PREFIX_0F01_REG_5_MOD_3_RM_1 */
3485 { "xresldtrk", { Skip_MODRM
}, PREFIX_OPCODE
},
3488 /* PREFIX_0F01_REG_5_MOD_3_RM_2 */
3491 { "saveprevssp", { Skip_MODRM
}, PREFIX_OPCODE
},
3494 /* PREFIX_0F01_REG_7_MOD_3_RM_2 */
3496 { "monitorx", { { OP_Monitor
, 0 } }, 0 },
3497 { "mcommit", { Skip_MODRM
}, 0 },
3500 /* PREFIX_0F01_REG_7_MOD_3_RM_3 */
3502 { "mwaitx", { { OP_Mwait
, eBX_reg
} }, 0 },
3507 { "wbinvd", { XX
}, 0 },
3508 { "wbnoinvd", { XX
}, 0 },
3513 { "movups", { XM
, EXx
}, PREFIX_OPCODE
},
3514 { "movss", { XM
, EXd
}, PREFIX_OPCODE
},
3515 { "movupd", { XM
, EXx
}, PREFIX_OPCODE
},
3516 { "movsd", { XM
, EXq
}, PREFIX_OPCODE
},
3521 { "movups", { EXxS
, XM
}, PREFIX_OPCODE
},
3522 { "movss", { EXdS
, XM
}, PREFIX_OPCODE
},
3523 { "movupd", { EXxS
, XM
}, PREFIX_OPCODE
},
3524 { "movsd", { EXqS
, XM
}, PREFIX_OPCODE
},
3529 { MOD_TABLE (MOD_0F12_PREFIX_0
) },
3530 { "movsldup", { XM
, EXx
}, PREFIX_OPCODE
},
3531 { MOD_TABLE (MOD_0F12_PREFIX_2
) },
3532 { "movddup", { XM
, EXq
}, PREFIX_OPCODE
},
3537 { MOD_TABLE (MOD_0F16_PREFIX_0
) },
3538 { "movshdup", { XM
, EXx
}, PREFIX_OPCODE
},
3539 { MOD_TABLE (MOD_0F16_PREFIX_2
) },
3544 { MOD_TABLE (MOD_0F1A_PREFIX_0
) },
3545 { "bndcl", { Gbnd
, Ev_bnd
}, 0 },
3546 { "bndmov", { Gbnd
, Ebnd
}, 0 },
3547 { "bndcu", { Gbnd
, Ev_bnd
}, 0 },
3552 { MOD_TABLE (MOD_0F1B_PREFIX_0
) },
3553 { MOD_TABLE (MOD_0F1B_PREFIX_1
) },
3554 { "bndmov", { EbndS
, Gbnd
}, 0 },
3555 { "bndcn", { Gbnd
, Ev_bnd
}, 0 },
3560 { MOD_TABLE (MOD_0F1C_PREFIX_0
) },
3561 { "nopQ", { Ev
}, PREFIX_OPCODE
},
3562 { "nopQ", { Ev
}, PREFIX_OPCODE
},
3563 { "nopQ", { Ev
}, PREFIX_OPCODE
},
3568 { "nopQ", { Ev
}, PREFIX_OPCODE
},
3569 { MOD_TABLE (MOD_0F1E_PREFIX_1
) },
3570 { "nopQ", { Ev
}, PREFIX_OPCODE
},
3571 { "nopQ", { Ev
}, PREFIX_OPCODE
},
3576 { "cvtpi2ps", { XM
, EMCq
}, PREFIX_OPCODE
},
3577 { "cvtsi2ss%LQ", { XM
, Edq
}, PREFIX_OPCODE
},
3578 { "cvtpi2pd", { XM
, EMCq
}, PREFIX_OPCODE
},
3579 { "cvtsi2sd%LQ", { XM
, Edq
}, 0 },
3584 { MOD_TABLE (MOD_0F2B_PREFIX_0
) },
3585 { MOD_TABLE (MOD_0F2B_PREFIX_1
) },
3586 { MOD_TABLE (MOD_0F2B_PREFIX_2
) },
3587 { MOD_TABLE (MOD_0F2B_PREFIX_3
) },
3592 { "cvttps2pi", { MXC
, EXq
}, PREFIX_OPCODE
},
3593 { "cvttss2si", { Gdq
, EXd
}, PREFIX_OPCODE
},
3594 { "cvttpd2pi", { MXC
, EXx
}, PREFIX_OPCODE
},
3595 { "cvttsd2si", { Gdq
, EXq
}, PREFIX_OPCODE
},
3600 { "cvtps2pi", { MXC
, EXq
}, PREFIX_OPCODE
},
3601 { "cvtss2si", { Gdq
, EXd
}, PREFIX_OPCODE
},
3602 { "cvtpd2pi", { MXC
, EXx
}, PREFIX_OPCODE
},
3603 { "cvtsd2si", { Gdq
, EXq
}, PREFIX_OPCODE
},
3608 { "ucomiss",{ XM
, EXd
}, 0 },
3610 { "ucomisd",{ XM
, EXq
}, 0 },
3615 { "comiss", { XM
, EXd
}, 0 },
3617 { "comisd", { XM
, EXq
}, 0 },
3622 { "sqrtps", { XM
, EXx
}, PREFIX_OPCODE
},
3623 { "sqrtss", { XM
, EXd
}, PREFIX_OPCODE
},
3624 { "sqrtpd", { XM
, EXx
}, PREFIX_OPCODE
},
3625 { "sqrtsd", { XM
, EXq
}, PREFIX_OPCODE
},
3630 { "rsqrtps",{ XM
, EXx
}, PREFIX_OPCODE
},
3631 { "rsqrtss",{ XM
, EXd
}, PREFIX_OPCODE
},
3636 { "rcpps", { XM
, EXx
}, PREFIX_OPCODE
},
3637 { "rcpss", { XM
, EXd
}, PREFIX_OPCODE
},
3642 { "addps", { XM
, EXx
}, PREFIX_OPCODE
},
3643 { "addss", { XM
, EXd
}, PREFIX_OPCODE
},
3644 { "addpd", { XM
, EXx
}, PREFIX_OPCODE
},
3645 { "addsd", { XM
, EXq
}, PREFIX_OPCODE
},
3650 { "mulps", { XM
, EXx
}, PREFIX_OPCODE
},
3651 { "mulss", { XM
, EXd
}, PREFIX_OPCODE
},
3652 { "mulpd", { XM
, EXx
}, PREFIX_OPCODE
},
3653 { "mulsd", { XM
, EXq
}, PREFIX_OPCODE
},
3658 { "cvtps2pd", { XM
, EXq
}, PREFIX_OPCODE
},
3659 { "cvtss2sd", { XM
, EXd
}, PREFIX_OPCODE
},
3660 { "cvtpd2ps", { XM
, EXx
}, PREFIX_OPCODE
},
3661 { "cvtsd2ss", { XM
, EXq
}, PREFIX_OPCODE
},
3666 { "cvtdq2ps", { XM
, EXx
}, PREFIX_OPCODE
},
3667 { "cvttps2dq", { XM
, EXx
}, PREFIX_OPCODE
},
3668 { "cvtps2dq", { XM
, EXx
}, PREFIX_OPCODE
},
3673 { "subps", { XM
, EXx
}, PREFIX_OPCODE
},
3674 { "subss", { XM
, EXd
}, PREFIX_OPCODE
},
3675 { "subpd", { XM
, EXx
}, PREFIX_OPCODE
},
3676 { "subsd", { XM
, EXq
}, PREFIX_OPCODE
},
3681 { "minps", { XM
, EXx
}, PREFIX_OPCODE
},
3682 { "minss", { XM
, EXd
}, PREFIX_OPCODE
},
3683 { "minpd", { XM
, EXx
}, PREFIX_OPCODE
},
3684 { "minsd", { XM
, EXq
}, PREFIX_OPCODE
},
3689 { "divps", { XM
, EXx
}, PREFIX_OPCODE
},
3690 { "divss", { XM
, EXd
}, PREFIX_OPCODE
},
3691 { "divpd", { XM
, EXx
}, PREFIX_OPCODE
},
3692 { "divsd", { XM
, EXq
}, PREFIX_OPCODE
},
3697 { "maxps", { XM
, EXx
}, PREFIX_OPCODE
},
3698 { "maxss", { XM
, EXd
}, PREFIX_OPCODE
},
3699 { "maxpd", { XM
, EXx
}, PREFIX_OPCODE
},
3700 { "maxsd", { XM
, EXq
}, PREFIX_OPCODE
},
3705 { "punpcklbw",{ MX
, EMd
}, PREFIX_OPCODE
},
3707 { "punpcklbw",{ MX
, EMx
}, PREFIX_OPCODE
},
3712 { "punpcklwd",{ MX
, EMd
}, PREFIX_OPCODE
},
3714 { "punpcklwd",{ MX
, EMx
}, PREFIX_OPCODE
},
3719 { "punpckldq",{ MX
, EMd
}, PREFIX_OPCODE
},
3721 { "punpckldq",{ MX
, EMx
}, PREFIX_OPCODE
},
3728 { "punpcklqdq", { XM
, EXx
}, PREFIX_OPCODE
},
3735 { "punpckhqdq", { XM
, EXx
}, PREFIX_OPCODE
},
3740 { "movq", { MX
, EM
}, PREFIX_OPCODE
},
3741 { "movdqu", { XM
, EXx
}, PREFIX_OPCODE
},
3742 { "movdqa", { XM
, EXx
}, PREFIX_OPCODE
},
3747 { "pshufw", { MX
, EM
, Ib
}, PREFIX_OPCODE
},
3748 { "pshufhw",{ XM
, EXx
, Ib
}, PREFIX_OPCODE
},
3749 { "pshufd", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
3750 { "pshuflw",{ XM
, EXx
, Ib
}, PREFIX_OPCODE
},
3753 /* PREFIX_0F73_REG_3 */
3757 { "psrldq", { XS
, Ib
}, 0 },
3760 /* PREFIX_0F73_REG_7 */
3764 { "pslldq", { XS
, Ib
}, 0 },
3769 {"vmread", { Em
, Gm
}, 0 },
3771 {"extrq", { XS
, Ib
, Ib
}, 0 },
3772 {"insertq", { XM
, XS
, Ib
, Ib
}, 0 },
3777 {"vmwrite", { Gm
, Em
}, 0 },
3779 {"extrq", { XM
, XS
}, 0 },
3780 {"insertq", { XM
, XS
}, 0 },
3787 { "haddpd", { XM
, EXx
}, PREFIX_OPCODE
},
3788 { "haddps", { XM
, EXx
}, PREFIX_OPCODE
},
3795 { "hsubpd", { XM
, EXx
}, PREFIX_OPCODE
},
3796 { "hsubps", { XM
, EXx
}, PREFIX_OPCODE
},
3801 { "movK", { Edq
, MX
}, PREFIX_OPCODE
},
3802 { "movq", { XM
, EXq
}, PREFIX_OPCODE
},
3803 { "movK", { Edq
, XM
}, PREFIX_OPCODE
},
3808 { "movq", { EMS
, MX
}, PREFIX_OPCODE
},
3809 { "movdqu", { EXxS
, XM
}, PREFIX_OPCODE
},
3810 { "movdqa", { EXxS
, XM
}, PREFIX_OPCODE
},
3813 /* PREFIX_0FAE_REG_0_MOD_3 */
3816 { "rdfsbase", { Ev
}, 0 },
3819 /* PREFIX_0FAE_REG_1_MOD_3 */
3822 { "rdgsbase", { Ev
}, 0 },
3825 /* PREFIX_0FAE_REG_2_MOD_3 */
3828 { "wrfsbase", { Ev
}, 0 },
3831 /* PREFIX_0FAE_REG_3_MOD_3 */
3834 { "wrgsbase", { Ev
}, 0 },
3837 /* PREFIX_0FAE_REG_4_MOD_0 */
3839 { "xsave", { FXSAVE
}, 0 },
3840 { "ptwrite%LQ", { Edq
}, 0 },
3843 /* PREFIX_0FAE_REG_4_MOD_3 */
3846 { "ptwrite%LQ", { Edq
}, 0 },
3849 /* PREFIX_0FAE_REG_5_MOD_0 */
3851 { "xrstor", { FXSAVE
}, PREFIX_OPCODE
},
3854 /* PREFIX_0FAE_REG_5_MOD_3 */
3856 { "lfence", { Skip_MODRM
}, 0 },
3857 { "incsspK", { Rdq
}, PREFIX_OPCODE
},
3860 /* PREFIX_0FAE_REG_6_MOD_0 */
3862 { "xsaveopt", { FXSAVE
}, PREFIX_OPCODE
},
3863 { "clrssbsy", { Mq
}, PREFIX_OPCODE
},
3864 { "clwb", { Mb
}, PREFIX_OPCODE
},
3867 /* PREFIX_0FAE_REG_6_MOD_3 */
3869 { RM_TABLE (RM_0FAE_REG_6_MOD_3_P_0
) },
3870 { "umonitor", { Eva
}, PREFIX_OPCODE
},
3871 { "tpause", { Edq
}, PREFIX_OPCODE
},
3872 { "umwait", { Edq
}, PREFIX_OPCODE
},
3875 /* PREFIX_0FAE_REG_7_MOD_0 */
3877 { "clflush", { Mb
}, 0 },
3879 { "clflushopt", { Mb
}, 0 },
3885 { "popcntS", { Gv
, Ev
}, 0 },
3890 { "bsfS", { Gv
, Ev
}, 0 },
3891 { "tzcntS", { Gv
, Ev
}, 0 },
3892 { "bsfS", { Gv
, Ev
}, 0 },
3897 { "bsrS", { Gv
, Ev
}, 0 },
3898 { "lzcntS", { Gv
, Ev
}, 0 },
3899 { "bsrS", { Gv
, Ev
}, 0 },
3904 { "cmpps", { XM
, EXx
, CMP
}, PREFIX_OPCODE
},
3905 { "cmpss", { XM
, EXd
, CMP
}, PREFIX_OPCODE
},
3906 { "cmppd", { XM
, EXx
, CMP
}, PREFIX_OPCODE
},
3907 { "cmpsd", { XM
, EXq
, CMP
}, PREFIX_OPCODE
},
3910 /* PREFIX_0FC3_MOD_0 */
3912 { "movntiS", { Edq
, Gdq
}, PREFIX_OPCODE
},
3915 /* PREFIX_0FC7_REG_6_MOD_0 */
3917 { "vmptrld",{ Mq
}, 0 },
3918 { "vmxon", { Mq
}, 0 },
3919 { "vmclear",{ Mq
}, 0 },
3922 /* PREFIX_0FC7_REG_6_MOD_3 */
3924 { "rdrand", { Ev
}, 0 },
3926 { "rdrand", { Ev
}, 0 }
3929 /* PREFIX_0FC7_REG_7_MOD_3 */
3931 { "rdseed", { Ev
}, 0 },
3932 { "rdpid", { Em
}, 0 },
3933 { "rdseed", { Ev
}, 0 },
3940 { "addsubpd", { XM
, EXx
}, 0 },
3941 { "addsubps", { XM
, EXx
}, 0 },
3947 { "movq2dq",{ XM
, MS
}, 0 },
3948 { "movq", { EXqS
, XM
}, 0 },
3949 { "movdq2q",{ MX
, XS
}, 0 },
3955 { "cvtdq2pd", { XM
, EXq
}, PREFIX_OPCODE
},
3956 { "cvttpd2dq", { XM
, EXx
}, PREFIX_OPCODE
},
3957 { "cvtpd2dq", { XM
, EXx
}, PREFIX_OPCODE
},
3962 { "movntq", { Mq
, MX
}, PREFIX_OPCODE
},
3964 { MOD_TABLE (MOD_0FE7_PREFIX_2
) },
3972 { MOD_TABLE (MOD_0FF0_PREFIX_3
) },
3977 { "maskmovq", { MX
, MS
}, PREFIX_OPCODE
},
3979 { "maskmovdqu", { XM
, XS
}, PREFIX_OPCODE
},
3986 { "pblendvb", { XM
, EXx
, XMM0
}, PREFIX_OPCODE
},
3993 { "blendvps", { XM
, EXx
, XMM0
}, PREFIX_OPCODE
},
4000 { "blendvpd", { XM
, EXx
, XMM0
}, PREFIX_OPCODE
},
4007 { "ptest", { XM
, EXx
}, PREFIX_OPCODE
},
4014 { "pmovsxbw", { XM
, EXq
}, PREFIX_OPCODE
},
4021 { "pmovsxbd", { XM
, EXd
}, PREFIX_OPCODE
},
4028 { "pmovsxbq", { XM
, EXw
}, PREFIX_OPCODE
},
4035 { "pmovsxwd", { XM
, EXq
}, PREFIX_OPCODE
},
4042 { "pmovsxwq", { XM
, EXd
}, PREFIX_OPCODE
},
4049 { "pmovsxdq", { XM
, EXq
}, PREFIX_OPCODE
},
4056 { "pmuldq", { XM
, EXx
}, PREFIX_OPCODE
},
4063 { "pcmpeqq", { XM
, EXx
}, PREFIX_OPCODE
},
4070 { MOD_TABLE (MOD_0F382A_PREFIX_2
) },
4077 { "packusdw", { XM
, EXx
}, PREFIX_OPCODE
},
4084 { "pmovzxbw", { XM
, EXq
}, PREFIX_OPCODE
},
4091 { "pmovzxbd", { XM
, EXd
}, PREFIX_OPCODE
},
4098 { "pmovzxbq", { XM
, EXw
}, PREFIX_OPCODE
},
4105 { "pmovzxwd", { XM
, EXq
}, PREFIX_OPCODE
},
4112 { "pmovzxwq", { XM
, EXd
}, PREFIX_OPCODE
},
4119 { "pmovzxdq", { XM
, EXq
}, PREFIX_OPCODE
},
4126 { "pcmpgtq", { XM
, EXx
}, PREFIX_OPCODE
},
4133 { "pminsb", { XM
, EXx
}, PREFIX_OPCODE
},
4140 { "pminsd", { XM
, EXx
}, PREFIX_OPCODE
},
4147 { "pminuw", { XM
, EXx
}, PREFIX_OPCODE
},
4154 { "pminud", { XM
, EXx
}, PREFIX_OPCODE
},
4161 { "pmaxsb", { XM
, EXx
}, PREFIX_OPCODE
},
4168 { "pmaxsd", { XM
, EXx
}, PREFIX_OPCODE
},
4175 { "pmaxuw", { XM
, EXx
}, PREFIX_OPCODE
},
4182 { "pmaxud", { XM
, EXx
}, PREFIX_OPCODE
},
4189 { "pmulld", { XM
, EXx
}, PREFIX_OPCODE
},
4196 { "phminposuw", { XM
, EXx
}, PREFIX_OPCODE
},
4203 { "invept", { Gm
, Mo
}, PREFIX_OPCODE
},
4210 { "invvpid", { Gm
, Mo
}, PREFIX_OPCODE
},
4217 { "invpcid", { Gm
, M
}, PREFIX_OPCODE
},
4222 { "sha1nexte", { XM
, EXxmm
}, PREFIX_OPCODE
},
4227 { "sha1msg1", { XM
, EXxmm
}, PREFIX_OPCODE
},
4232 { "sha1msg2", { XM
, EXxmm
}, PREFIX_OPCODE
},
4237 { "sha256rnds2", { XM
, EXxmm
, XMM0
}, PREFIX_OPCODE
},
4242 { "sha256msg1", { XM
, EXxmm
}, PREFIX_OPCODE
},
4247 { "sha256msg2", { XM
, EXxmm
}, PREFIX_OPCODE
},
4254 { "gf2p8mulb", { XM
, EXxmm
}, PREFIX_OPCODE
},
4261 { "aesimc", { XM
, EXx
}, PREFIX_OPCODE
},
4268 { "aesenc", { XM
, EXx
}, PREFIX_OPCODE
},
4275 { "aesenclast", { XM
, EXx
}, PREFIX_OPCODE
},
4282 { "aesdec", { XM
, EXx
}, PREFIX_OPCODE
},
4289 { "aesdeclast", { XM
, EXx
}, PREFIX_OPCODE
},
4294 { "movbeS", { Gv
, { MOVBE_Fixup
, v_mode
} }, PREFIX_OPCODE
},
4296 { "movbeS", { Gv
, { MOVBE_Fixup
, v_mode
} }, PREFIX_OPCODE
},
4297 { "crc32", { Gdq
, { CRC32_Fixup
, b_mode
} }, PREFIX_OPCODE
},
4302 { "movbeS", { { MOVBE_Fixup
, v_mode
}, Gv
}, PREFIX_OPCODE
},
4304 { "movbeS", { { MOVBE_Fixup
, v_mode
}, Gv
}, PREFIX_OPCODE
},
4305 { "crc32", { Gdq
, { CRC32_Fixup
, v_mode
} }, PREFIX_OPCODE
},
4312 { MOD_TABLE (MOD_0F38F5_PREFIX_2
) },
4317 { MOD_TABLE (MOD_0F38F6_PREFIX_0
) },
4318 { "adoxS", { Gdq
, Edq
}, PREFIX_OPCODE
},
4319 { "adcxS", { Gdq
, Edq
}, PREFIX_OPCODE
},
4326 { MOD_TABLE (MOD_0F38F8_PREFIX_1
) },
4327 { MOD_TABLE (MOD_0F38F8_PREFIX_2
) },
4328 { MOD_TABLE (MOD_0F38F8_PREFIX_3
) },
4333 { MOD_TABLE (MOD_0F38F9_PREFIX_0
) },
4340 { "roundps", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
4347 { "roundpd", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
4354 { "roundss", { XM
, EXd
, Ib
}, PREFIX_OPCODE
},
4361 { "roundsd", { XM
, EXq
, Ib
}, PREFIX_OPCODE
},
4368 { "blendps", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
4375 { "blendpd", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
4382 { "pblendw", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
4389 { "pextrb", { Edqb
, XM
, Ib
}, PREFIX_OPCODE
},
4396 { "pextrw", { Edqw
, XM
, Ib
}, PREFIX_OPCODE
},
4403 { "pextrK", { Edq
, XM
, Ib
}, PREFIX_OPCODE
},
4410 { "extractps", { Edqd
, XM
, Ib
}, PREFIX_OPCODE
},
4417 { "pinsrb", { XM
, Edqb
, Ib
}, PREFIX_OPCODE
},
4424 { "insertps", { XM
, EXd
, Ib
}, PREFIX_OPCODE
},
4431 { "pinsrK", { XM
, Edq
, Ib
}, PREFIX_OPCODE
},
4438 { "dpps", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
4445 { "dppd", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
4452 { "mpsadbw", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
4459 { "pclmulqdq", { XM
, EXx
, PCLMUL
}, PREFIX_OPCODE
},
4466 { "pcmpestrm", { XM
, { PCMPESTR_Fixup
, x_mode
}, Ib
}, PREFIX_OPCODE
},
4473 { "pcmpestri", { XM
, { PCMPESTR_Fixup
, x_mode
}, Ib
}, PREFIX_OPCODE
},
4480 { "pcmpistrm", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
4487 { "pcmpistri", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
4492 { "sha1rnds4", { XM
, EXxmm
, Ib
}, PREFIX_OPCODE
},
4499 { "gf2p8affineqb", { XM
, EXxmm
, Ib
}, PREFIX_OPCODE
},
4506 { "gf2p8affineinvqb", { XM
, EXxmm
, Ib
}, PREFIX_OPCODE
},
4513 { "aeskeygenassist", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
4516 /* PREFIX_VEX_0F10 */
4518 { "vmovups", { XM
, EXx
}, 0 },
4519 { "vmovss", { XMVexScalar
, VexScalar
, EXxmm_md
}, 0 },
4520 { "vmovupd", { XM
, EXx
}, 0 },
4521 { "vmovsd", { XMVexScalar
, VexScalar
, EXxmm_mq
}, 0 },
4524 /* PREFIX_VEX_0F11 */
4526 { "vmovups", { EXxS
, XM
}, 0 },
4527 { "vmovss", { EXdVexScalarS
, VexScalar
, XMScalar
}, 0 },
4528 { "vmovupd", { EXxS
, XM
}, 0 },
4529 { "vmovsd", { EXqVexScalarS
, VexScalar
, XMScalar
}, 0 },
4532 /* PREFIX_VEX_0F12 */
4534 { MOD_TABLE (MOD_VEX_0F12_PREFIX_0
) },
4535 { "vmovsldup", { XM
, EXx
}, 0 },
4536 { MOD_TABLE (MOD_VEX_0F12_PREFIX_2
) },
4537 { "vmovddup", { XM
, EXymmq
}, 0 },
4540 /* PREFIX_VEX_0F16 */
4542 { MOD_TABLE (MOD_VEX_0F16_PREFIX_0
) },
4543 { "vmovshdup", { XM
, EXx
}, 0 },
4544 { MOD_TABLE (MOD_VEX_0F16_PREFIX_2
) },
4547 /* PREFIX_VEX_0F2A */
4550 { "vcvtsi2ss%LQ", { XMScalar
, VexScalar
, Edq
}, 0 },
4552 { "vcvtsi2sd%LQ", { XMScalar
, VexScalar
, Edq
}, 0 },
4555 /* PREFIX_VEX_0F2C */
4558 { "vcvttss2si", { Gdq
, EXxmm_md
}, 0 },
4560 { "vcvttsd2si", { Gdq
, EXxmm_mq
}, 0 },
4563 /* PREFIX_VEX_0F2D */
4566 { "vcvtss2si", { Gdq
, EXxmm_md
}, 0 },
4568 { "vcvtsd2si", { Gdq
, EXxmm_mq
}, 0 },
4571 /* PREFIX_VEX_0F2E */
4573 { "vucomiss", { XMScalar
, EXxmm_md
}, 0 },
4575 { "vucomisd", { XMScalar
, EXxmm_mq
}, 0 },
4578 /* PREFIX_VEX_0F2F */
4580 { "vcomiss", { XMScalar
, EXxmm_md
}, 0 },
4582 { "vcomisd", { XMScalar
, EXxmm_mq
}, 0 },
4585 /* PREFIX_VEX_0F41 */
4587 { VEX_LEN_TABLE (VEX_LEN_0F41_P_0
) },
4589 { VEX_LEN_TABLE (VEX_LEN_0F41_P_2
) },
4592 /* PREFIX_VEX_0F42 */
4594 { VEX_LEN_TABLE (VEX_LEN_0F42_P_0
) },
4596 { VEX_LEN_TABLE (VEX_LEN_0F42_P_2
) },
4599 /* PREFIX_VEX_0F44 */
4601 { VEX_LEN_TABLE (VEX_LEN_0F44_P_0
) },
4603 { VEX_LEN_TABLE (VEX_LEN_0F44_P_2
) },
4606 /* PREFIX_VEX_0F45 */
4608 { VEX_LEN_TABLE (VEX_LEN_0F45_P_0
) },
4610 { VEX_LEN_TABLE (VEX_LEN_0F45_P_2
) },
4613 /* PREFIX_VEX_0F46 */
4615 { VEX_LEN_TABLE (VEX_LEN_0F46_P_0
) },
4617 { VEX_LEN_TABLE (VEX_LEN_0F46_P_2
) },
4620 /* PREFIX_VEX_0F47 */
4622 { VEX_LEN_TABLE (VEX_LEN_0F47_P_0
) },
4624 { VEX_LEN_TABLE (VEX_LEN_0F47_P_2
) },
4627 /* PREFIX_VEX_0F4A */
4629 { VEX_LEN_TABLE (VEX_LEN_0F4A_P_0
) },
4631 { VEX_LEN_TABLE (VEX_LEN_0F4A_P_2
) },
4634 /* PREFIX_VEX_0F4B */
4636 { VEX_LEN_TABLE (VEX_LEN_0F4B_P_0
) },
4638 { VEX_LEN_TABLE (VEX_LEN_0F4B_P_2
) },
4641 /* PREFIX_VEX_0F51 */
4643 { "vsqrtps", { XM
, EXx
}, 0 },
4644 { "vsqrtss", { XMScalar
, VexScalar
, EXxmm_md
}, 0 },
4645 { "vsqrtpd", { XM
, EXx
}, 0 },
4646 { "vsqrtsd", { XMScalar
, VexScalar
, EXxmm_mq
}, 0 },
4649 /* PREFIX_VEX_0F52 */
4651 { "vrsqrtps", { XM
, EXx
}, 0 },
4652 { "vrsqrtss", { XMScalar
, VexScalar
, EXxmm_md
}, 0 },
4655 /* PREFIX_VEX_0F53 */
4657 { "vrcpps", { XM
, EXx
}, 0 },
4658 { "vrcpss", { XMScalar
, VexScalar
, EXxmm_md
}, 0 },
4661 /* PREFIX_VEX_0F58 */
4663 { "vaddps", { XM
, Vex
, EXx
}, 0 },
4664 { "vaddss", { XMScalar
, VexScalar
, EXxmm_md
}, 0 },
4665 { "vaddpd", { XM
, Vex
, EXx
}, 0 },
4666 { "vaddsd", { XMScalar
, VexScalar
, EXxmm_mq
}, 0 },
4669 /* PREFIX_VEX_0F59 */
4671 { "vmulps", { XM
, Vex
, EXx
}, 0 },
4672 { "vmulss", { XMScalar
, VexScalar
, EXxmm_md
}, 0 },
4673 { "vmulpd", { XM
, Vex
, EXx
}, 0 },
4674 { "vmulsd", { XMScalar
, VexScalar
, EXxmm_mq
}, 0 },
4677 /* PREFIX_VEX_0F5A */
4679 { "vcvtps2pd", { XM
, EXxmmq
}, 0 },
4680 { "vcvtss2sd", { XMScalar
, VexScalar
, EXxmm_md
}, 0 },
4681 { "vcvtpd2ps%XY",{ XMM
, EXx
}, 0 },
4682 { "vcvtsd2ss", { XMScalar
, VexScalar
, EXxmm_mq
}, 0 },
4685 /* PREFIX_VEX_0F5B */
4687 { "vcvtdq2ps", { XM
, EXx
}, 0 },
4688 { "vcvttps2dq", { XM
, EXx
}, 0 },
4689 { "vcvtps2dq", { XM
, EXx
}, 0 },
4692 /* PREFIX_VEX_0F5C */
4694 { "vsubps", { XM
, Vex
, EXx
}, 0 },
4695 { "vsubss", { XMScalar
, VexScalar
, EXxmm_md
}, 0 },
4696 { "vsubpd", { XM
, Vex
, EXx
}, 0 },
4697 { "vsubsd", { XMScalar
, VexScalar
, EXxmm_mq
}, 0 },
4700 /* PREFIX_VEX_0F5D */
4702 { "vminps", { XM
, Vex
, EXx
}, 0 },
4703 { "vminss", { XMScalar
, VexScalar
, EXxmm_md
}, 0 },
4704 { "vminpd", { XM
, Vex
, EXx
}, 0 },
4705 { "vminsd", { XMScalar
, VexScalar
, EXxmm_mq
}, 0 },
4708 /* PREFIX_VEX_0F5E */
4710 { "vdivps", { XM
, Vex
, EXx
}, 0 },
4711 { "vdivss", { XMScalar
, VexScalar
, EXxmm_md
}, 0 },
4712 { "vdivpd", { XM
, Vex
, EXx
}, 0 },
4713 { "vdivsd", { XMScalar
, VexScalar
, EXxmm_mq
}, 0 },
4716 /* PREFIX_VEX_0F5F */
4718 { "vmaxps", { XM
, Vex
, EXx
}, 0 },
4719 { "vmaxss", { XMScalar
, VexScalar
, EXxmm_md
}, 0 },
4720 { "vmaxpd", { XM
, Vex
, EXx
}, 0 },
4721 { "vmaxsd", { XMScalar
, VexScalar
, EXxmm_mq
}, 0 },
4724 /* PREFIX_VEX_0F60 */
4728 { "vpunpcklbw", { XM
, Vex
, EXx
}, 0 },
4731 /* PREFIX_VEX_0F61 */
4735 { "vpunpcklwd", { XM
, Vex
, EXx
}, 0 },
4738 /* PREFIX_VEX_0F62 */
4742 { "vpunpckldq", { XM
, Vex
, EXx
}, 0 },
4745 /* PREFIX_VEX_0F63 */
4749 { "vpacksswb", { XM
, Vex
, EXx
}, 0 },
4752 /* PREFIX_VEX_0F64 */
4756 { "vpcmpgtb", { XM
, Vex
, EXx
}, 0 },
4759 /* PREFIX_VEX_0F65 */
4763 { "vpcmpgtw", { XM
, Vex
, EXx
}, 0 },
4766 /* PREFIX_VEX_0F66 */
4770 { "vpcmpgtd", { XM
, Vex
, EXx
}, 0 },
4773 /* PREFIX_VEX_0F67 */
4777 { "vpackuswb", { XM
, Vex
, EXx
}, 0 },
4780 /* PREFIX_VEX_0F68 */
4784 { "vpunpckhbw", { XM
, Vex
, EXx
}, 0 },
4787 /* PREFIX_VEX_0F69 */
4791 { "vpunpckhwd", { XM
, Vex
, EXx
}, 0 },
4794 /* PREFIX_VEX_0F6A */
4798 { "vpunpckhdq", { XM
, Vex
, EXx
}, 0 },
4801 /* PREFIX_VEX_0F6B */
4805 { "vpackssdw", { XM
, Vex
, EXx
}, 0 },
4808 /* PREFIX_VEX_0F6C */
4812 { "vpunpcklqdq", { XM
, Vex
, EXx
}, 0 },
4815 /* PREFIX_VEX_0F6D */
4819 { "vpunpckhqdq", { XM
, Vex
, EXx
}, 0 },
4822 /* PREFIX_VEX_0F6E */
4826 { VEX_LEN_TABLE (VEX_LEN_0F6E_P_2
) },
4829 /* PREFIX_VEX_0F6F */
4832 { "vmovdqu", { XM
, EXx
}, 0 },
4833 { "vmovdqa", { XM
, EXx
}, 0 },
4836 /* PREFIX_VEX_0F70 */
4839 { "vpshufhw", { XM
, EXx
, Ib
}, 0 },
4840 { "vpshufd", { XM
, EXx
, Ib
}, 0 },
4841 { "vpshuflw", { XM
, EXx
, Ib
}, 0 },
4844 /* PREFIX_VEX_0F71_REG_2 */
4848 { "vpsrlw", { Vex
, XS
, Ib
}, 0 },
4851 /* PREFIX_VEX_0F71_REG_4 */
4855 { "vpsraw", { Vex
, XS
, Ib
}, 0 },
4858 /* PREFIX_VEX_0F71_REG_6 */
4862 { "vpsllw", { Vex
, XS
, Ib
}, 0 },
4865 /* PREFIX_VEX_0F72_REG_2 */
4869 { "vpsrld", { Vex
, XS
, Ib
}, 0 },
4872 /* PREFIX_VEX_0F72_REG_4 */
4876 { "vpsrad", { Vex
, XS
, Ib
}, 0 },
4879 /* PREFIX_VEX_0F72_REG_6 */
4883 { "vpslld", { Vex
, XS
, Ib
}, 0 },
4886 /* PREFIX_VEX_0F73_REG_2 */
4890 { "vpsrlq", { Vex
, XS
, Ib
}, 0 },
4893 /* PREFIX_VEX_0F73_REG_3 */
4897 { "vpsrldq", { Vex
, XS
, Ib
}, 0 },
4900 /* PREFIX_VEX_0F73_REG_6 */
4904 { "vpsllq", { Vex
, XS
, Ib
}, 0 },
4907 /* PREFIX_VEX_0F73_REG_7 */
4911 { "vpslldq", { Vex
, XS
, Ib
}, 0 },
4914 /* PREFIX_VEX_0F74 */
4918 { "vpcmpeqb", { XM
, Vex
, EXx
}, 0 },
4921 /* PREFIX_VEX_0F75 */
4925 { "vpcmpeqw", { XM
, Vex
, EXx
}, 0 },
4928 /* PREFIX_VEX_0F76 */
4932 { "vpcmpeqd", { XM
, Vex
, EXx
}, 0 },
4935 /* PREFIX_VEX_0F77 */
4937 { VEX_LEN_TABLE (VEX_LEN_0F77_P_0
) },
4940 /* PREFIX_VEX_0F7C */
4944 { "vhaddpd", { XM
, Vex
, EXx
}, 0 },
4945 { "vhaddps", { XM
, Vex
, EXx
}, 0 },
4948 /* PREFIX_VEX_0F7D */
4952 { "vhsubpd", { XM
, Vex
, EXx
}, 0 },
4953 { "vhsubps", { XM
, Vex
, EXx
}, 0 },
4956 /* PREFIX_VEX_0F7E */
4959 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_1
) },
4960 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_2
) },
4963 /* PREFIX_VEX_0F7F */
4966 { "vmovdqu", { EXxS
, XM
}, 0 },
4967 { "vmovdqa", { EXxS
, XM
}, 0 },
4970 /* PREFIX_VEX_0F90 */
4972 { VEX_LEN_TABLE (VEX_LEN_0F90_P_0
) },
4974 { VEX_LEN_TABLE (VEX_LEN_0F90_P_2
) },
4977 /* PREFIX_VEX_0F91 */
4979 { VEX_LEN_TABLE (VEX_LEN_0F91_P_0
) },
4981 { VEX_LEN_TABLE (VEX_LEN_0F91_P_2
) },
4984 /* PREFIX_VEX_0F92 */
4986 { VEX_LEN_TABLE (VEX_LEN_0F92_P_0
) },
4988 { VEX_LEN_TABLE (VEX_LEN_0F92_P_2
) },
4989 { VEX_LEN_TABLE (VEX_LEN_0F92_P_3
) },
4992 /* PREFIX_VEX_0F93 */
4994 { VEX_LEN_TABLE (VEX_LEN_0F93_P_0
) },
4996 { VEX_LEN_TABLE (VEX_LEN_0F93_P_2
) },
4997 { VEX_LEN_TABLE (VEX_LEN_0F93_P_3
) },
5000 /* PREFIX_VEX_0F98 */
5002 { VEX_LEN_TABLE (VEX_LEN_0F98_P_0
) },
5004 { VEX_LEN_TABLE (VEX_LEN_0F98_P_2
) },
5007 /* PREFIX_VEX_0F99 */
5009 { VEX_LEN_TABLE (VEX_LEN_0F99_P_0
) },
5011 { VEX_LEN_TABLE (VEX_LEN_0F99_P_2
) },
5014 /* PREFIX_VEX_0FC2 */
5016 { "vcmpps", { XM
, Vex
, EXx
, VCMP
}, 0 },
5017 { "vcmpss", { XMScalar
, VexScalar
, EXxmm_md
, VCMP
}, 0 },
5018 { "vcmppd", { XM
, Vex
, EXx
, VCMP
}, 0 },
5019 { "vcmpsd", { XMScalar
, VexScalar
, EXxmm_mq
, VCMP
}, 0 },
5022 /* PREFIX_VEX_0FC4 */
5026 { VEX_LEN_TABLE (VEX_LEN_0FC4_P_2
) },
5029 /* PREFIX_VEX_0FC5 */
5033 { VEX_LEN_TABLE (VEX_LEN_0FC5_P_2
) },
5036 /* PREFIX_VEX_0FD0 */
5040 { "vaddsubpd", { XM
, Vex
, EXx
}, 0 },
5041 { "vaddsubps", { XM
, Vex
, EXx
}, 0 },
5044 /* PREFIX_VEX_0FD1 */
5048 { "vpsrlw", { XM
, Vex
, EXxmm
}, 0 },
5051 /* PREFIX_VEX_0FD2 */
5055 { "vpsrld", { XM
, Vex
, EXxmm
}, 0 },
5058 /* PREFIX_VEX_0FD3 */
5062 { "vpsrlq", { XM
, Vex
, EXxmm
}, 0 },
5065 /* PREFIX_VEX_0FD4 */
5069 { "vpaddq", { XM
, Vex
, EXx
}, 0 },
5072 /* PREFIX_VEX_0FD5 */
5076 { "vpmullw", { XM
, Vex
, EXx
}, 0 },
5079 /* PREFIX_VEX_0FD6 */
5083 { VEX_LEN_TABLE (VEX_LEN_0FD6_P_2
) },
5086 /* PREFIX_VEX_0FD7 */
5090 { MOD_TABLE (MOD_VEX_0FD7_PREFIX_2
) },
5093 /* PREFIX_VEX_0FD8 */
5097 { "vpsubusb", { XM
, Vex
, EXx
}, 0 },
5100 /* PREFIX_VEX_0FD9 */
5104 { "vpsubusw", { XM
, Vex
, EXx
}, 0 },
5107 /* PREFIX_VEX_0FDA */
5111 { "vpminub", { XM
, Vex
, EXx
}, 0 },
5114 /* PREFIX_VEX_0FDB */
5118 { "vpand", { XM
, Vex
, EXx
}, 0 },
5121 /* PREFIX_VEX_0FDC */
5125 { "vpaddusb", { XM
, Vex
, EXx
}, 0 },
5128 /* PREFIX_VEX_0FDD */
5132 { "vpaddusw", { XM
, Vex
, EXx
}, 0 },
5135 /* PREFIX_VEX_0FDE */
5139 { "vpmaxub", { XM
, Vex
, EXx
}, 0 },
5142 /* PREFIX_VEX_0FDF */
5146 { "vpandn", { XM
, Vex
, EXx
}, 0 },
5149 /* PREFIX_VEX_0FE0 */
5153 { "vpavgb", { XM
, Vex
, EXx
}, 0 },
5156 /* PREFIX_VEX_0FE1 */
5160 { "vpsraw", { XM
, Vex
, EXxmm
}, 0 },
5163 /* PREFIX_VEX_0FE2 */
5167 { "vpsrad", { XM
, Vex
, EXxmm
}, 0 },
5170 /* PREFIX_VEX_0FE3 */
5174 { "vpavgw", { XM
, Vex
, EXx
}, 0 },
5177 /* PREFIX_VEX_0FE4 */
5181 { "vpmulhuw", { XM
, Vex
, EXx
}, 0 },
5184 /* PREFIX_VEX_0FE5 */
5188 { "vpmulhw", { XM
, Vex
, EXx
}, 0 },
5191 /* PREFIX_VEX_0FE6 */
5194 { "vcvtdq2pd", { XM
, EXxmmq
}, 0 },
5195 { "vcvttpd2dq%XY", { XMM
, EXx
}, 0 },
5196 { "vcvtpd2dq%XY", { XMM
, EXx
}, 0 },
5199 /* PREFIX_VEX_0FE7 */
5203 { MOD_TABLE (MOD_VEX_0FE7_PREFIX_2
) },
5206 /* PREFIX_VEX_0FE8 */
5210 { "vpsubsb", { XM
, Vex
, EXx
}, 0 },
5213 /* PREFIX_VEX_0FE9 */
5217 { "vpsubsw", { XM
, Vex
, EXx
}, 0 },
5220 /* PREFIX_VEX_0FEA */
5224 { "vpminsw", { XM
, Vex
, EXx
}, 0 },
5227 /* PREFIX_VEX_0FEB */
5231 { "vpor", { XM
, Vex
, EXx
}, 0 },
5234 /* PREFIX_VEX_0FEC */
5238 { "vpaddsb", { XM
, Vex
, EXx
}, 0 },
5241 /* PREFIX_VEX_0FED */
5245 { "vpaddsw", { XM
, Vex
, EXx
}, 0 },
5248 /* PREFIX_VEX_0FEE */
5252 { "vpmaxsw", { XM
, Vex
, EXx
}, 0 },
5255 /* PREFIX_VEX_0FEF */
5259 { "vpxor", { XM
, Vex
, EXx
}, 0 },
5262 /* PREFIX_VEX_0FF0 */
5267 { MOD_TABLE (MOD_VEX_0FF0_PREFIX_3
) },
5270 /* PREFIX_VEX_0FF1 */
5274 { "vpsllw", { XM
, Vex
, EXxmm
}, 0 },
5277 /* PREFIX_VEX_0FF2 */
5281 { "vpslld", { XM
, Vex
, EXxmm
}, 0 },
5284 /* PREFIX_VEX_0FF3 */
5288 { "vpsllq", { XM
, Vex
, EXxmm
}, 0 },
5291 /* PREFIX_VEX_0FF4 */
5295 { "vpmuludq", { XM
, Vex
, EXx
}, 0 },
5298 /* PREFIX_VEX_0FF5 */
5302 { "vpmaddwd", { XM
, Vex
, EXx
}, 0 },
5305 /* PREFIX_VEX_0FF6 */
5309 { "vpsadbw", { XM
, Vex
, EXx
}, 0 },
5312 /* PREFIX_VEX_0FF7 */
5316 { VEX_LEN_TABLE (VEX_LEN_0FF7_P_2
) },
5319 /* PREFIX_VEX_0FF8 */
5323 { "vpsubb", { XM
, Vex
, EXx
}, 0 },
5326 /* PREFIX_VEX_0FF9 */
5330 { "vpsubw", { XM
, Vex
, EXx
}, 0 },
5333 /* PREFIX_VEX_0FFA */
5337 { "vpsubd", { XM
, Vex
, EXx
}, 0 },
5340 /* PREFIX_VEX_0FFB */
5344 { "vpsubq", { XM
, Vex
, EXx
}, 0 },
5347 /* PREFIX_VEX_0FFC */
5351 { "vpaddb", { XM
, Vex
, EXx
}, 0 },
5354 /* PREFIX_VEX_0FFD */
5358 { "vpaddw", { XM
, Vex
, EXx
}, 0 },
5361 /* PREFIX_VEX_0FFE */
5365 { "vpaddd", { XM
, Vex
, EXx
}, 0 },
5368 /* PREFIX_VEX_0F3800 */
5372 { "vpshufb", { XM
, Vex
, EXx
}, 0 },
5375 /* PREFIX_VEX_0F3801 */
5379 { "vphaddw", { XM
, Vex
, EXx
}, 0 },
5382 /* PREFIX_VEX_0F3802 */
5386 { "vphaddd", { XM
, Vex
, EXx
}, 0 },
5389 /* PREFIX_VEX_0F3803 */
5393 { "vphaddsw", { XM
, Vex
, EXx
}, 0 },
5396 /* PREFIX_VEX_0F3804 */
5400 { "vpmaddubsw", { XM
, Vex
, EXx
}, 0 },
5403 /* PREFIX_VEX_0F3805 */
5407 { "vphsubw", { XM
, Vex
, EXx
}, 0 },
5410 /* PREFIX_VEX_0F3806 */
5414 { "vphsubd", { XM
, Vex
, EXx
}, 0 },
5417 /* PREFIX_VEX_0F3807 */
5421 { "vphsubsw", { XM
, Vex
, EXx
}, 0 },
5424 /* PREFIX_VEX_0F3808 */
5428 { "vpsignb", { XM
, Vex
, EXx
}, 0 },
5431 /* PREFIX_VEX_0F3809 */
5435 { "vpsignw", { XM
, Vex
, EXx
}, 0 },
5438 /* PREFIX_VEX_0F380A */
5442 { "vpsignd", { XM
, Vex
, EXx
}, 0 },
5445 /* PREFIX_VEX_0F380B */
5449 { "vpmulhrsw", { XM
, Vex
, EXx
}, 0 },
5452 /* PREFIX_VEX_0F380C */
5456 { VEX_W_TABLE (VEX_W_0F380C_P_2
) },
5459 /* PREFIX_VEX_0F380D */
5463 { VEX_W_TABLE (VEX_W_0F380D_P_2
) },
5466 /* PREFIX_VEX_0F380E */
5470 { VEX_W_TABLE (VEX_W_0F380E_P_2
) },
5473 /* PREFIX_VEX_0F380F */
5477 { VEX_W_TABLE (VEX_W_0F380F_P_2
) },
5480 /* PREFIX_VEX_0F3813 */
5484 { VEX_W_TABLE (VEX_W_0F3813_P_2
) },
5487 /* PREFIX_VEX_0F3816 */
5491 { VEX_LEN_TABLE (VEX_LEN_0F3816_P_2
) },
5494 /* PREFIX_VEX_0F3817 */
5498 { "vptest", { XM
, EXx
}, 0 },
5501 /* PREFIX_VEX_0F3818 */
5505 { VEX_W_TABLE (VEX_W_0F3818_P_2
) },
5508 /* PREFIX_VEX_0F3819 */
5512 { VEX_LEN_TABLE (VEX_LEN_0F3819_P_2
) },
5515 /* PREFIX_VEX_0F381A */
5519 { MOD_TABLE (MOD_VEX_0F381A_PREFIX_2
) },
5522 /* PREFIX_VEX_0F381C */
5526 { "vpabsb", { XM
, EXx
}, 0 },
5529 /* PREFIX_VEX_0F381D */
5533 { "vpabsw", { XM
, EXx
}, 0 },
5536 /* PREFIX_VEX_0F381E */
5540 { "vpabsd", { XM
, EXx
}, 0 },
5543 /* PREFIX_VEX_0F3820 */
5547 { "vpmovsxbw", { XM
, EXxmmq
}, 0 },
5550 /* PREFIX_VEX_0F3821 */
5554 { "vpmovsxbd", { XM
, EXxmmqd
}, 0 },
5557 /* PREFIX_VEX_0F3822 */
5561 { "vpmovsxbq", { XM
, EXxmmdw
}, 0 },
5564 /* PREFIX_VEX_0F3823 */
5568 { "vpmovsxwd", { XM
, EXxmmq
}, 0 },
5571 /* PREFIX_VEX_0F3824 */
5575 { "vpmovsxwq", { XM
, EXxmmqd
}, 0 },
5578 /* PREFIX_VEX_0F3825 */
5582 { "vpmovsxdq", { XM
, EXxmmq
}, 0 },
5585 /* PREFIX_VEX_0F3828 */
5589 { "vpmuldq", { XM
, Vex
, EXx
}, 0 },
5592 /* PREFIX_VEX_0F3829 */
5596 { "vpcmpeqq", { XM
, Vex
, EXx
}, 0 },
5599 /* PREFIX_VEX_0F382A */
5603 { MOD_TABLE (MOD_VEX_0F382A_PREFIX_2
) },
5606 /* PREFIX_VEX_0F382B */
5610 { "vpackusdw", { XM
, Vex
, EXx
}, 0 },
5613 /* PREFIX_VEX_0F382C */
5617 { MOD_TABLE (MOD_VEX_0F382C_PREFIX_2
) },
5620 /* PREFIX_VEX_0F382D */
5624 { MOD_TABLE (MOD_VEX_0F382D_PREFIX_2
) },
5627 /* PREFIX_VEX_0F382E */
5631 { MOD_TABLE (MOD_VEX_0F382E_PREFIX_2
) },
5634 /* PREFIX_VEX_0F382F */
5638 { MOD_TABLE (MOD_VEX_0F382F_PREFIX_2
) },
5641 /* PREFIX_VEX_0F3830 */
5645 { "vpmovzxbw", { XM
, EXxmmq
}, 0 },
5648 /* PREFIX_VEX_0F3831 */
5652 { "vpmovzxbd", { XM
, EXxmmqd
}, 0 },
5655 /* PREFIX_VEX_0F3832 */
5659 { "vpmovzxbq", { XM
, EXxmmdw
}, 0 },
5662 /* PREFIX_VEX_0F3833 */
5666 { "vpmovzxwd", { XM
, EXxmmq
}, 0 },
5669 /* PREFIX_VEX_0F3834 */
5673 { "vpmovzxwq", { XM
, EXxmmqd
}, 0 },
5676 /* PREFIX_VEX_0F3835 */
5680 { "vpmovzxdq", { XM
, EXxmmq
}, 0 },
5683 /* PREFIX_VEX_0F3836 */
5687 { VEX_LEN_TABLE (VEX_LEN_0F3836_P_2
) },
5690 /* PREFIX_VEX_0F3837 */
5694 { "vpcmpgtq", { XM
, Vex
, EXx
}, 0 },
5697 /* PREFIX_VEX_0F3838 */
5701 { "vpminsb", { XM
, Vex
, EXx
}, 0 },
5704 /* PREFIX_VEX_0F3839 */
5708 { "vpminsd", { XM
, Vex
, EXx
}, 0 },
5711 /* PREFIX_VEX_0F383A */
5715 { "vpminuw", { XM
, Vex
, EXx
}, 0 },
5718 /* PREFIX_VEX_0F383B */
5722 { "vpminud", { XM
, Vex
, EXx
}, 0 },
5725 /* PREFIX_VEX_0F383C */
5729 { "vpmaxsb", { XM
, Vex
, EXx
}, 0 },
5732 /* PREFIX_VEX_0F383D */
5736 { "vpmaxsd", { XM
, Vex
, EXx
}, 0 },
5739 /* PREFIX_VEX_0F383E */
5743 { "vpmaxuw", { XM
, Vex
, EXx
}, 0 },
5746 /* PREFIX_VEX_0F383F */
5750 { "vpmaxud", { XM
, Vex
, EXx
}, 0 },
5753 /* PREFIX_VEX_0F3840 */
5757 { "vpmulld", { XM
, Vex
, EXx
}, 0 },
5760 /* PREFIX_VEX_0F3841 */
5764 { VEX_LEN_TABLE (VEX_LEN_0F3841_P_2
) },
5767 /* PREFIX_VEX_0F3845 */
5771 { "vpsrlv%LW", { XM
, Vex
, EXx
}, 0 },
5774 /* PREFIX_VEX_0F3846 */
5778 { VEX_W_TABLE (VEX_W_0F3846_P_2
) },
5781 /* PREFIX_VEX_0F3847 */
5785 { "vpsllv%LW", { XM
, Vex
, EXx
}, 0 },
5788 /* PREFIX_VEX_0F3858 */
5792 { VEX_W_TABLE (VEX_W_0F3858_P_2
) },
5795 /* PREFIX_VEX_0F3859 */
5799 { VEX_W_TABLE (VEX_W_0F3859_P_2
) },
5802 /* PREFIX_VEX_0F385A */
5806 { MOD_TABLE (MOD_VEX_0F385A_PREFIX_2
) },
5809 /* PREFIX_VEX_0F3878 */
5813 { VEX_W_TABLE (VEX_W_0F3878_P_2
) },
5816 /* PREFIX_VEX_0F3879 */
5820 { VEX_W_TABLE (VEX_W_0F3879_P_2
) },
5823 /* PREFIX_VEX_0F388C */
5827 { MOD_TABLE (MOD_VEX_0F388C_PREFIX_2
) },
5830 /* PREFIX_VEX_0F388E */
5834 { MOD_TABLE (MOD_VEX_0F388E_PREFIX_2
) },
5837 /* PREFIX_VEX_0F3890 */
5841 { "vpgatherd%LW", { XM
, MVexVSIBDWpX
, Vex
}, 0 },
5844 /* PREFIX_VEX_0F3891 */
5848 { "vpgatherq%LW", { XMGatherQ
, MVexVSIBQWpX
, VexGatherQ
}, 0 },
5851 /* PREFIX_VEX_0F3892 */
5855 { "vgatherdp%XW", { XM
, MVexVSIBDWpX
, Vex
}, 0 },
5858 /* PREFIX_VEX_0F3893 */
5862 { "vgatherqp%XW", { XMGatherQ
, MVexVSIBQWpX
, VexGatherQ
}, 0 },
5865 /* PREFIX_VEX_0F3896 */
5869 { "vfmaddsub132p%XW", { XM
, Vex
, EXx
, EXxEVexR
}, 0 },
5872 /* PREFIX_VEX_0F3897 */
5876 { "vfmsubadd132p%XW", { XM
, Vex
, EXx
, EXxEVexR
}, 0 },
5879 /* PREFIX_VEX_0F3898 */
5883 { "vfmadd132p%XW", { XM
, Vex
, EXx
, EXxEVexR
}, 0 },
5886 /* PREFIX_VEX_0F3899 */
5890 { "vfmadd132s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
, EXxEVexR
}, 0 },
5893 /* PREFIX_VEX_0F389A */
5897 { "vfmsub132p%XW", { XM
, Vex
, EXx
}, 0 },
5900 /* PREFIX_VEX_0F389B */
5904 { "vfmsub132s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
}, 0 },
5907 /* PREFIX_VEX_0F389C */
5911 { "vfnmadd132p%XW", { XM
, Vex
, EXx
, EXxEVexR
}, 0 },
5914 /* PREFIX_VEX_0F389D */
5918 { "vfnmadd132s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
, EXxEVexR
}, 0 },
5921 /* PREFIX_VEX_0F389E */
5925 { "vfnmsub132p%XW", { XM
, Vex
, EXx
, EXxEVexR
}, 0 },
5928 /* PREFIX_VEX_0F389F */
5932 { "vfnmsub132s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
, EXxEVexR
}, 0 },
5935 /* PREFIX_VEX_0F38A6 */
5939 { "vfmaddsub213p%XW", { XM
, Vex
, EXx
, EXxEVexR
}, 0 },
5943 /* PREFIX_VEX_0F38A7 */
5947 { "vfmsubadd213p%XW", { XM
, Vex
, EXx
, EXxEVexR
}, 0 },
5950 /* PREFIX_VEX_0F38A8 */
5954 { "vfmadd213p%XW", { XM
, Vex
, EXx
, EXxEVexR
}, 0 },
5957 /* PREFIX_VEX_0F38A9 */
5961 { "vfmadd213s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
, EXxEVexR
}, 0 },
5964 /* PREFIX_VEX_0F38AA */
5968 { "vfmsub213p%XW", { XM
, Vex
, EXx
}, 0 },
5971 /* PREFIX_VEX_0F38AB */
5975 { "vfmsub213s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
}, 0 },
5978 /* PREFIX_VEX_0F38AC */
5982 { "vfnmadd213p%XW", { XM
, Vex
, EXx
, EXxEVexR
}, 0 },
5985 /* PREFIX_VEX_0F38AD */
5989 { "vfnmadd213s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
, EXxEVexR
}, 0 },
5992 /* PREFIX_VEX_0F38AE */
5996 { "vfnmsub213p%XW", { XM
, Vex
, EXx
, EXxEVexR
}, 0 },
5999 /* PREFIX_VEX_0F38AF */
6003 { "vfnmsub213s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
, EXxEVexR
}, 0 },
6006 /* PREFIX_VEX_0F38B6 */
6010 { "vfmaddsub231p%XW", { XM
, Vex
, EXx
, EXxEVexR
}, 0 },
6013 /* PREFIX_VEX_0F38B7 */
6017 { "vfmsubadd231p%XW", { XM
, Vex
, EXx
, EXxEVexR
}, 0 },
6020 /* PREFIX_VEX_0F38B8 */
6024 { "vfmadd231p%XW", { XM
, Vex
, EXx
, EXxEVexR
}, 0 },
6027 /* PREFIX_VEX_0F38B9 */
6031 { "vfmadd231s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
, EXxEVexR
}, 0 },
6034 /* PREFIX_VEX_0F38BA */
6038 { "vfmsub231p%XW", { XM
, Vex
, EXx
, EXxEVexR
}, 0 },
6041 /* PREFIX_VEX_0F38BB */
6045 { "vfmsub231s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
, EXxEVexR
}, 0 },
6048 /* PREFIX_VEX_0F38BC */
6052 { "vfnmadd231p%XW", { XM
, Vex
, EXx
, EXxEVexR
}, 0 },
6055 /* PREFIX_VEX_0F38BD */
6059 { "vfnmadd231s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
, EXxEVexR
}, 0 },
6062 /* PREFIX_VEX_0F38BE */
6066 { "vfnmsub231p%XW", { XM
, Vex
, EXx
, EXxEVexR
}, 0 },
6069 /* PREFIX_VEX_0F38BF */
6073 { "vfnmsub231s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
, EXxEVexR
}, 0 },
6076 /* PREFIX_VEX_0F38CF */
6080 { VEX_W_TABLE (VEX_W_0F38CF_P_2
) },
6083 /* PREFIX_VEX_0F38DB */
6087 { VEX_LEN_TABLE (VEX_LEN_0F38DB_P_2
) },
6090 /* PREFIX_VEX_0F38DC */
6094 { "vaesenc", { XM
, Vex
, EXx
}, 0 },
6097 /* PREFIX_VEX_0F38DD */
6101 { "vaesenclast", { XM
, Vex
, EXx
}, 0 },
6104 /* PREFIX_VEX_0F38DE */
6108 { "vaesdec", { XM
, Vex
, EXx
}, 0 },
6111 /* PREFIX_VEX_0F38DF */
6115 { "vaesdeclast", { XM
, Vex
, EXx
}, 0 },
6118 /* PREFIX_VEX_0F38F2 */
6120 { VEX_LEN_TABLE (VEX_LEN_0F38F2_P_0
) },
6123 /* PREFIX_VEX_0F38F3_REG_1 */
6125 { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_1_P_0
) },
6128 /* PREFIX_VEX_0F38F3_REG_2 */
6130 { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_2_P_0
) },
6133 /* PREFIX_VEX_0F38F3_REG_3 */
6135 { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_3_P_0
) },
6138 /* PREFIX_VEX_0F38F5 */
6140 { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_0
) },
6141 { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_1
) },
6143 { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_3
) },
6146 /* PREFIX_VEX_0F38F6 */
6151 { VEX_LEN_TABLE (VEX_LEN_0F38F6_P_3
) },
6154 /* PREFIX_VEX_0F38F7 */
6156 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_0
) },
6157 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_1
) },
6158 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_2
) },
6159 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_3
) },
6162 /* PREFIX_VEX_0F3A00 */
6166 { VEX_LEN_TABLE (VEX_LEN_0F3A00_P_2
) },
6169 /* PREFIX_VEX_0F3A01 */
6173 { VEX_LEN_TABLE (VEX_LEN_0F3A01_P_2
) },
6176 /* PREFIX_VEX_0F3A02 */
6180 { VEX_W_TABLE (VEX_W_0F3A02_P_2
) },
6183 /* PREFIX_VEX_0F3A04 */
6187 { VEX_W_TABLE (VEX_W_0F3A04_P_2
) },
6190 /* PREFIX_VEX_0F3A05 */
6194 { VEX_W_TABLE (VEX_W_0F3A05_P_2
) },
6197 /* PREFIX_VEX_0F3A06 */
6201 { VEX_LEN_TABLE (VEX_LEN_0F3A06_P_2
) },
6204 /* PREFIX_VEX_0F3A08 */
6208 { "vroundps", { XM
, EXx
, Ib
}, 0 },
6211 /* PREFIX_VEX_0F3A09 */
6215 { "vroundpd", { XM
, EXx
, Ib
}, 0 },
6218 /* PREFIX_VEX_0F3A0A */
6222 { "vroundss", { XMScalar
, VexScalar
, EXxmm_md
, Ib
}, 0 },
6225 /* PREFIX_VEX_0F3A0B */
6229 { "vroundsd", { XMScalar
, VexScalar
, EXxmm_mq
, Ib
}, 0 },
6232 /* PREFIX_VEX_0F3A0C */
6236 { "vblendps", { XM
, Vex
, EXx
, Ib
}, 0 },
6239 /* PREFIX_VEX_0F3A0D */
6243 { "vblendpd", { XM
, Vex
, EXx
, Ib
}, 0 },
6246 /* PREFIX_VEX_0F3A0E */
6250 { "vpblendw", { XM
, Vex
, EXx
, Ib
}, 0 },
6253 /* PREFIX_VEX_0F3A0F */
6257 { "vpalignr", { XM
, Vex
, EXx
, Ib
}, 0 },
6260 /* PREFIX_VEX_0F3A14 */
6264 { VEX_LEN_TABLE (VEX_LEN_0F3A14_P_2
) },
6267 /* PREFIX_VEX_0F3A15 */
6271 { VEX_LEN_TABLE (VEX_LEN_0F3A15_P_2
) },
6274 /* PREFIX_VEX_0F3A16 */
6278 { VEX_LEN_TABLE (VEX_LEN_0F3A16_P_2
) },
6281 /* PREFIX_VEX_0F3A17 */
6285 { VEX_LEN_TABLE (VEX_LEN_0F3A17_P_2
) },
6288 /* PREFIX_VEX_0F3A18 */
6292 { VEX_LEN_TABLE (VEX_LEN_0F3A18_P_2
) },
6295 /* PREFIX_VEX_0F3A19 */
6299 { VEX_LEN_TABLE (VEX_LEN_0F3A19_P_2
) },
6302 /* PREFIX_VEX_0F3A1D */
6306 { VEX_W_TABLE (VEX_W_0F3A1D_P_2
) },
6309 /* PREFIX_VEX_0F3A20 */
6313 { VEX_LEN_TABLE (VEX_LEN_0F3A20_P_2
) },
6316 /* PREFIX_VEX_0F3A21 */
6320 { VEX_LEN_TABLE (VEX_LEN_0F3A21_P_2
) },
6323 /* PREFIX_VEX_0F3A22 */
6327 { VEX_LEN_TABLE (VEX_LEN_0F3A22_P_2
) },
6330 /* PREFIX_VEX_0F3A30 */
6334 { VEX_LEN_TABLE (VEX_LEN_0F3A30_P_2
) },
6337 /* PREFIX_VEX_0F3A31 */
6341 { VEX_LEN_TABLE (VEX_LEN_0F3A31_P_2
) },
6344 /* PREFIX_VEX_0F3A32 */
6348 { VEX_LEN_TABLE (VEX_LEN_0F3A32_P_2
) },
6351 /* PREFIX_VEX_0F3A33 */
6355 { VEX_LEN_TABLE (VEX_LEN_0F3A33_P_2
) },
6358 /* PREFIX_VEX_0F3A38 */
6362 { VEX_LEN_TABLE (VEX_LEN_0F3A38_P_2
) },
6365 /* PREFIX_VEX_0F3A39 */
6369 { VEX_LEN_TABLE (VEX_LEN_0F3A39_P_2
) },
6372 /* PREFIX_VEX_0F3A40 */
6376 { "vdpps", { XM
, Vex
, EXx
, Ib
}, 0 },
6379 /* PREFIX_VEX_0F3A41 */
6383 { VEX_LEN_TABLE (VEX_LEN_0F3A41_P_2
) },
6386 /* PREFIX_VEX_0F3A42 */
6390 { "vmpsadbw", { XM
, Vex
, EXx
, Ib
}, 0 },
6393 /* PREFIX_VEX_0F3A44 */
6397 { "vpclmulqdq", { XM
, Vex
, EXx
, PCLMUL
}, 0 },
6400 /* PREFIX_VEX_0F3A46 */
6404 { VEX_LEN_TABLE (VEX_LEN_0F3A46_P_2
) },
6407 /* PREFIX_VEX_0F3A48 */
6411 { "vpermil2ps", { XM
, Vex
, EXx
, XMVexI4
, VexI4
}, 0 },
6414 /* PREFIX_VEX_0F3A49 */
6418 { "vpermil2pd", { XM
, Vex
, EXx
, XMVexI4
, VexI4
}, 0 },
6421 /* PREFIX_VEX_0F3A4A */
6425 { VEX_W_TABLE (VEX_W_0F3A4A_P_2
) },
6428 /* PREFIX_VEX_0F3A4B */
6432 { VEX_W_TABLE (VEX_W_0F3A4B_P_2
) },
6435 /* PREFIX_VEX_0F3A4C */
6439 { VEX_W_TABLE (VEX_W_0F3A4C_P_2
) },
6442 /* PREFIX_VEX_0F3A5C */
6446 { "vfmaddsubps", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
6449 /* PREFIX_VEX_0F3A5D */
6453 { "vfmaddsubpd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
6456 /* PREFIX_VEX_0F3A5E */
6460 { "vfmsubaddps", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
6463 /* PREFIX_VEX_0F3A5F */
6467 { "vfmsubaddpd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
6470 /* PREFIX_VEX_0F3A60 */
6474 { VEX_LEN_TABLE (VEX_LEN_0F3A60_P_2
) },
6478 /* PREFIX_VEX_0F3A61 */
6482 { VEX_LEN_TABLE (VEX_LEN_0F3A61_P_2
) },
6485 /* PREFIX_VEX_0F3A62 */
6489 { VEX_LEN_TABLE (VEX_LEN_0F3A62_P_2
) },
6492 /* PREFIX_VEX_0F3A63 */
6496 { VEX_LEN_TABLE (VEX_LEN_0F3A63_P_2
) },
6499 /* PREFIX_VEX_0F3A68 */
6503 { "vfmaddps", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
6506 /* PREFIX_VEX_0F3A69 */
6510 { "vfmaddpd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
6513 /* PREFIX_VEX_0F3A6A */
6517 { VEX_LEN_TABLE (VEX_LEN_0F3A6A_P_2
) },
6520 /* PREFIX_VEX_0F3A6B */
6524 { VEX_LEN_TABLE (VEX_LEN_0F3A6B_P_2
) },
6527 /* PREFIX_VEX_0F3A6C */
6531 { "vfmsubps", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
6534 /* PREFIX_VEX_0F3A6D */
6538 { "vfmsubpd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
6541 /* PREFIX_VEX_0F3A6E */
6545 { VEX_LEN_TABLE (VEX_LEN_0F3A6E_P_2
) },
6548 /* PREFIX_VEX_0F3A6F */
6552 { VEX_LEN_TABLE (VEX_LEN_0F3A6F_P_2
) },
6555 /* PREFIX_VEX_0F3A78 */
6559 { "vfnmaddps", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
6562 /* PREFIX_VEX_0F3A79 */
6566 { "vfnmaddpd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
6569 /* PREFIX_VEX_0F3A7A */
6573 { VEX_LEN_TABLE (VEX_LEN_0F3A7A_P_2
) },
6576 /* PREFIX_VEX_0F3A7B */
6580 { VEX_LEN_TABLE (VEX_LEN_0F3A7B_P_2
) },
6583 /* PREFIX_VEX_0F3A7C */
6587 { "vfnmsubps", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
6591 /* PREFIX_VEX_0F3A7D */
6595 { "vfnmsubpd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
6598 /* PREFIX_VEX_0F3A7E */
6602 { VEX_LEN_TABLE (VEX_LEN_0F3A7E_P_2
) },
6605 /* PREFIX_VEX_0F3A7F */
6609 { VEX_LEN_TABLE (VEX_LEN_0F3A7F_P_2
) },
6612 /* PREFIX_VEX_0F3ACE */
6616 { VEX_W_TABLE (VEX_W_0F3ACE_P_2
) },
6619 /* PREFIX_VEX_0F3ACF */
6623 { VEX_W_TABLE (VEX_W_0F3ACF_P_2
) },
6626 /* PREFIX_VEX_0F3ADF */
6630 { VEX_LEN_TABLE (VEX_LEN_0F3ADF_P_2
) },
6633 /* PREFIX_VEX_0F3AF0 */
6638 { VEX_LEN_TABLE (VEX_LEN_0F3AF0_P_3
) },
6641 #include "i386-dis-evex-prefix.h"
6644 static const struct dis386 x86_64_table
[][2] = {
6647 { "pushP", { es
}, 0 },
6652 { "popP", { es
}, 0 },
6657 { "pushP", { cs
}, 0 },
6662 { "pushP", { ss
}, 0 },
6667 { "popP", { ss
}, 0 },
6672 { "pushP", { ds
}, 0 },
6677 { "popP", { ds
}, 0 },
6682 { "daa", { XX
}, 0 },
6687 { "das", { XX
}, 0 },
6692 { "aaa", { XX
}, 0 },
6697 { "aas", { XX
}, 0 },
6702 { "pushaP", { XX
}, 0 },
6707 { "popaP", { XX
}, 0 },
6712 { MOD_TABLE (MOD_62_32BIT
) },
6713 { EVEX_TABLE (EVEX_0F
) },
6718 { "arpl", { Ew
, Gw
}, 0 },
6719 { "movs", { { OP_G
, movsxd_mode
}, { MOVSXD_Fixup
, movsxd_mode
} }, 0 },
6724 { "ins{R|}", { Yzr
, indirDX
}, 0 },
6725 { "ins{G|}", { Yzr
, indirDX
}, 0 },
6730 { "outs{R|}", { indirDXr
, Xz
}, 0 },
6731 { "outs{G|}", { indirDXr
, Xz
}, 0 },
6736 /* Opcode 0x82 is an alias of opcode 0x80 in 32-bit mode. */
6737 { REG_TABLE (REG_80
) },
6742 { "{l|}call{T|}", { Ap
}, 0 },
6747 { "retP", { Iw
, BND
}, 0 },
6748 { "ret@", { Iw
, BND
}, 0 },
6753 { "retP", { BND
}, 0 },
6754 { "ret@", { BND
}, 0 },
6759 { MOD_TABLE (MOD_C4_32BIT
) },
6760 { VEX_C4_TABLE (VEX_0F
) },
6765 { MOD_TABLE (MOD_C5_32BIT
) },
6766 { VEX_C5_TABLE (VEX_0F
) },
6771 { "into", { XX
}, 0 },
6776 { "aam", { Ib
}, 0 },
6781 { "aad", { Ib
}, 0 },
6786 { "callP", { Jv
, BND
}, 0 },
6787 { "call@", { Jv
, BND
}, 0 }
6792 { "jmpP", { Jv
, BND
}, 0 },
6793 { "jmp@", { Jv
, BND
}, 0 }
6798 { "{l|}jmp{T|}", { Ap
}, 0 },
6801 /* X86_64_0F01_REG_0 */
6803 { "sgdt{Q|Q}", { M
}, 0 },
6804 { "sgdt", { M
}, 0 },
6807 /* X86_64_0F01_REG_1 */
6809 { "sidt{Q|Q}", { M
}, 0 },
6810 { "sidt", { M
}, 0 },
6813 /* X86_64_0F01_REG_2 */
6815 { "lgdt{Q|Q}", { M
}, 0 },
6816 { "lgdt", { M
}, 0 },
6819 /* X86_64_0F01_REG_3 */
6821 { "lidt{Q|Q}", { M
}, 0 },
6822 { "lidt", { M
}, 0 },
6826 static const struct dis386 three_byte_table
[][256] = {
6828 /* THREE_BYTE_0F38 */
6831 { "pshufb", { MX
, EM
}, PREFIX_OPCODE
},
6832 { "phaddw", { MX
, EM
}, PREFIX_OPCODE
},
6833 { "phaddd", { MX
, EM
}, PREFIX_OPCODE
},
6834 { "phaddsw", { MX
, EM
}, PREFIX_OPCODE
},
6835 { "pmaddubsw", { MX
, EM
}, PREFIX_OPCODE
},
6836 { "phsubw", { MX
, EM
}, PREFIX_OPCODE
},
6837 { "phsubd", { MX
, EM
}, PREFIX_OPCODE
},
6838 { "phsubsw", { MX
, EM
}, PREFIX_OPCODE
},
6840 { "psignb", { MX
, EM
}, PREFIX_OPCODE
},
6841 { "psignw", { MX
, EM
}, PREFIX_OPCODE
},
6842 { "psignd", { MX
, EM
}, PREFIX_OPCODE
},
6843 { "pmulhrsw", { MX
, EM
}, PREFIX_OPCODE
},
6849 { PREFIX_TABLE (PREFIX_0F3810
) },
6853 { PREFIX_TABLE (PREFIX_0F3814
) },
6854 { PREFIX_TABLE (PREFIX_0F3815
) },
6856 { PREFIX_TABLE (PREFIX_0F3817
) },
6862 { "pabsb", { MX
, EM
}, PREFIX_OPCODE
},
6863 { "pabsw", { MX
, EM
}, PREFIX_OPCODE
},
6864 { "pabsd", { MX
, EM
}, PREFIX_OPCODE
},
6867 { PREFIX_TABLE (PREFIX_0F3820
) },
6868 { PREFIX_TABLE (PREFIX_0F3821
) },
6869 { PREFIX_TABLE (PREFIX_0F3822
) },
6870 { PREFIX_TABLE (PREFIX_0F3823
) },
6871 { PREFIX_TABLE (PREFIX_0F3824
) },
6872 { PREFIX_TABLE (PREFIX_0F3825
) },
6876 { PREFIX_TABLE (PREFIX_0F3828
) },
6877 { PREFIX_TABLE (PREFIX_0F3829
) },
6878 { PREFIX_TABLE (PREFIX_0F382A
) },
6879 { PREFIX_TABLE (PREFIX_0F382B
) },
6885 { PREFIX_TABLE (PREFIX_0F3830
) },
6886 { PREFIX_TABLE (PREFIX_0F3831
) },
6887 { PREFIX_TABLE (PREFIX_0F3832
) },
6888 { PREFIX_TABLE (PREFIX_0F3833
) },
6889 { PREFIX_TABLE (PREFIX_0F3834
) },
6890 { PREFIX_TABLE (PREFIX_0F3835
) },
6892 { PREFIX_TABLE (PREFIX_0F3837
) },
6894 { PREFIX_TABLE (PREFIX_0F3838
) },
6895 { PREFIX_TABLE (PREFIX_0F3839
) },
6896 { PREFIX_TABLE (PREFIX_0F383A
) },
6897 { PREFIX_TABLE (PREFIX_0F383B
) },
6898 { PREFIX_TABLE (PREFIX_0F383C
) },
6899 { PREFIX_TABLE (PREFIX_0F383D
) },
6900 { PREFIX_TABLE (PREFIX_0F383E
) },
6901 { PREFIX_TABLE (PREFIX_0F383F
) },
6903 { PREFIX_TABLE (PREFIX_0F3840
) },
6904 { PREFIX_TABLE (PREFIX_0F3841
) },
6975 { PREFIX_TABLE (PREFIX_0F3880
) },
6976 { PREFIX_TABLE (PREFIX_0F3881
) },
6977 { PREFIX_TABLE (PREFIX_0F3882
) },
7056 { PREFIX_TABLE (PREFIX_0F38C8
) },
7057 { PREFIX_TABLE (PREFIX_0F38C9
) },
7058 { PREFIX_TABLE (PREFIX_0F38CA
) },
7059 { PREFIX_TABLE (PREFIX_0F38CB
) },
7060 { PREFIX_TABLE (PREFIX_0F38CC
) },
7061 { PREFIX_TABLE (PREFIX_0F38CD
) },
7063 { PREFIX_TABLE (PREFIX_0F38CF
) },
7077 { PREFIX_TABLE (PREFIX_0F38DB
) },
7078 { PREFIX_TABLE (PREFIX_0F38DC
) },
7079 { PREFIX_TABLE (PREFIX_0F38DD
) },
7080 { PREFIX_TABLE (PREFIX_0F38DE
) },
7081 { PREFIX_TABLE (PREFIX_0F38DF
) },
7101 { PREFIX_TABLE (PREFIX_0F38F0
) },
7102 { PREFIX_TABLE (PREFIX_0F38F1
) },
7106 { PREFIX_TABLE (PREFIX_0F38F5
) },
7107 { PREFIX_TABLE (PREFIX_0F38F6
) },
7110 { PREFIX_TABLE (PREFIX_0F38F8
) },
7111 { PREFIX_TABLE (PREFIX_0F38F9
) },
7119 /* THREE_BYTE_0F3A */
7131 { PREFIX_TABLE (PREFIX_0F3A08
) },
7132 { PREFIX_TABLE (PREFIX_0F3A09
) },
7133 { PREFIX_TABLE (PREFIX_0F3A0A
) },
7134 { PREFIX_TABLE (PREFIX_0F3A0B
) },
7135 { PREFIX_TABLE (PREFIX_0F3A0C
) },
7136 { PREFIX_TABLE (PREFIX_0F3A0D
) },
7137 { PREFIX_TABLE (PREFIX_0F3A0E
) },
7138 { "palignr", { MX
, EM
, Ib
}, PREFIX_OPCODE
},
7144 { PREFIX_TABLE (PREFIX_0F3A14
) },
7145 { PREFIX_TABLE (PREFIX_0F3A15
) },
7146 { PREFIX_TABLE (PREFIX_0F3A16
) },
7147 { PREFIX_TABLE (PREFIX_0F3A17
) },
7158 { PREFIX_TABLE (PREFIX_0F3A20
) },
7159 { PREFIX_TABLE (PREFIX_0F3A21
) },
7160 { PREFIX_TABLE (PREFIX_0F3A22
) },
7194 { PREFIX_TABLE (PREFIX_0F3A40
) },
7195 { PREFIX_TABLE (PREFIX_0F3A41
) },
7196 { PREFIX_TABLE (PREFIX_0F3A42
) },
7198 { PREFIX_TABLE (PREFIX_0F3A44
) },
7230 { PREFIX_TABLE (PREFIX_0F3A60
) },
7231 { PREFIX_TABLE (PREFIX_0F3A61
) },
7232 { PREFIX_TABLE (PREFIX_0F3A62
) },
7233 { PREFIX_TABLE (PREFIX_0F3A63
) },
7351 { PREFIX_TABLE (PREFIX_0F3ACC
) },
7353 { PREFIX_TABLE (PREFIX_0F3ACE
) },
7354 { PREFIX_TABLE (PREFIX_0F3ACF
) },
7372 { PREFIX_TABLE (PREFIX_0F3ADF
) },
7412 static const struct dis386 xop_table
[][256] = {
7565 { "vpmacssww", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7566 { "vpmacsswd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7567 { "vpmacssdql", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7575 { "vpmacssdd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7576 { "vpmacssdqh", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7583 { "vpmacsww", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7584 { "vpmacswd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7585 { "vpmacsdql", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7593 { "vpmacsdd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7594 { "vpmacsdqh", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7598 { "vpcmov", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7599 { "vpperm", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7602 { "vpmadcsswd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7620 { "vpmadcswd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7632 { "vprotb", { XM
, Vex_2src_1
, Ib
}, 0 },
7633 { "vprotw", { XM
, Vex_2src_1
, Ib
}, 0 },
7634 { "vprotd", { XM
, Vex_2src_1
, Ib
}, 0 },
7635 { "vprotq", { XM
, Vex_2src_1
, Ib
}, 0 },
7645 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CC
) },
7646 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CD
) },
7647 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CE
) },
7648 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CF
) },
7681 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EC
) },
7682 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_ED
) },
7683 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EE
) },
7684 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EF
) },
7708 { REG_TABLE (REG_XOP_TBM_01
) },
7709 { REG_TABLE (REG_XOP_TBM_02
) },
7727 { REG_TABLE (REG_XOP_LWPCB
) },
7851 { VEX_W_TABLE (VEX_W_0FXOP_09_80
) },
7852 { VEX_W_TABLE (VEX_W_0FXOP_09_81
) },
7853 { VEX_W_TABLE (VEX_W_0FXOP_09_82
) },
7854 { VEX_W_TABLE (VEX_W_0FXOP_09_83
) },
7869 { "vprotb", { XM
, Vex_2src_1
, Vex_2src_2
}, 0 },
7870 { "vprotw", { XM
, Vex_2src_1
, Vex_2src_2
}, 0 },
7871 { "vprotd", { XM
, Vex_2src_1
, Vex_2src_2
}, 0 },
7872 { "vprotq", { XM
, Vex_2src_1
, Vex_2src_2
}, 0 },
7873 { "vpshlb", { XM
, Vex_2src_1
, Vex_2src_2
}, 0 },
7874 { "vpshlw", { XM
, Vex_2src_1
, Vex_2src_2
}, 0 },
7875 { "vpshld", { XM
, Vex_2src_1
, Vex_2src_2
}, 0 },
7876 { "vpshlq", { XM
, Vex_2src_1
, Vex_2src_2
}, 0 },
7878 { "vpshab", { XM
, Vex_2src_1
, Vex_2src_2
}, 0 },
7879 { "vpshaw", { XM
, Vex_2src_1
, Vex_2src_2
}, 0 },
7880 { "vpshad", { XM
, Vex_2src_1
, Vex_2src_2
}, 0 },
7881 { "vpshaq", { XM
, Vex_2src_1
, Vex_2src_2
}, 0 },
7924 { "vphaddbw", { XM
, EXxmm
}, 0 },
7925 { "vphaddbd", { XM
, EXxmm
}, 0 },
7926 { "vphaddbq", { XM
, EXxmm
}, 0 },
7929 { "vphaddwd", { XM
, EXxmm
}, 0 },
7930 { "vphaddwq", { XM
, EXxmm
}, 0 },
7935 { "vphadddq", { XM
, EXxmm
}, 0 },
7942 { "vphaddubw", { XM
, EXxmm
}, 0 },
7943 { "vphaddubd", { XM
, EXxmm
}, 0 },
7944 { "vphaddubq", { XM
, EXxmm
}, 0 },
7947 { "vphadduwd", { XM
, EXxmm
}, 0 },
7948 { "vphadduwq", { XM
, EXxmm
}, 0 },
7953 { "vphaddudq", { XM
, EXxmm
}, 0 },
7960 { "vphsubbw", { XM
, EXxmm
}, 0 },
7961 { "vphsubwd", { XM
, EXxmm
}, 0 },
7962 { "vphsubdq", { XM
, EXxmm
}, 0 },
8016 { "bextrS", { Gdq
, Edq
, Id
}, 0 },
8018 { REG_TABLE (REG_XOP_LWP
) },
8288 static const struct dis386 vex_table
[][256] = {
8310 { PREFIX_TABLE (PREFIX_VEX_0F10
) },
8311 { PREFIX_TABLE (PREFIX_VEX_0F11
) },
8312 { PREFIX_TABLE (PREFIX_VEX_0F12
) },
8313 { MOD_TABLE (MOD_VEX_0F13
) },
8314 { "vunpcklpX", { XM
, Vex
, EXx
}, PREFIX_OPCODE
},
8315 { "vunpckhpX", { XM
, Vex
, EXx
}, PREFIX_OPCODE
},
8316 { PREFIX_TABLE (PREFIX_VEX_0F16
) },
8317 { MOD_TABLE (MOD_VEX_0F17
) },
8337 { "vmovapX", { XM
, EXx
}, PREFIX_OPCODE
},
8338 { "vmovapX", { EXxS
, XM
}, PREFIX_OPCODE
},
8339 { PREFIX_TABLE (PREFIX_VEX_0F2A
) },
8340 { MOD_TABLE (MOD_VEX_0F2B
) },
8341 { PREFIX_TABLE (PREFIX_VEX_0F2C
) },
8342 { PREFIX_TABLE (PREFIX_VEX_0F2D
) },
8343 { PREFIX_TABLE (PREFIX_VEX_0F2E
) },
8344 { PREFIX_TABLE (PREFIX_VEX_0F2F
) },
8365 { PREFIX_TABLE (PREFIX_VEX_0F41
) },
8366 { PREFIX_TABLE (PREFIX_VEX_0F42
) },
8368 { PREFIX_TABLE (PREFIX_VEX_0F44
) },
8369 { PREFIX_TABLE (PREFIX_VEX_0F45
) },
8370 { PREFIX_TABLE (PREFIX_VEX_0F46
) },
8371 { PREFIX_TABLE (PREFIX_VEX_0F47
) },
8375 { PREFIX_TABLE (PREFIX_VEX_0F4A
) },
8376 { PREFIX_TABLE (PREFIX_VEX_0F4B
) },
8382 { MOD_TABLE (MOD_VEX_0F50
) },
8383 { PREFIX_TABLE (PREFIX_VEX_0F51
) },
8384 { PREFIX_TABLE (PREFIX_VEX_0F52
) },
8385 { PREFIX_TABLE (PREFIX_VEX_0F53
) },
8386 { "vandpX", { XM
, Vex
, EXx
}, PREFIX_OPCODE
},
8387 { "vandnpX", { XM
, Vex
, EXx
}, PREFIX_OPCODE
},
8388 { "vorpX", { XM
, Vex
, EXx
}, PREFIX_OPCODE
},
8389 { "vxorpX", { XM
, Vex
, EXx
}, PREFIX_OPCODE
},
8391 { PREFIX_TABLE (PREFIX_VEX_0F58
) },
8392 { PREFIX_TABLE (PREFIX_VEX_0F59
) },
8393 { PREFIX_TABLE (PREFIX_VEX_0F5A
) },
8394 { PREFIX_TABLE (PREFIX_VEX_0F5B
) },
8395 { PREFIX_TABLE (PREFIX_VEX_0F5C
) },
8396 { PREFIX_TABLE (PREFIX_VEX_0F5D
) },
8397 { PREFIX_TABLE (PREFIX_VEX_0F5E
) },
8398 { PREFIX_TABLE (PREFIX_VEX_0F5F
) },
8400 { PREFIX_TABLE (PREFIX_VEX_0F60
) },
8401 { PREFIX_TABLE (PREFIX_VEX_0F61
) },
8402 { PREFIX_TABLE (PREFIX_VEX_0F62
) },
8403 { PREFIX_TABLE (PREFIX_VEX_0F63
) },
8404 { PREFIX_TABLE (PREFIX_VEX_0F64
) },
8405 { PREFIX_TABLE (PREFIX_VEX_0F65
) },
8406 { PREFIX_TABLE (PREFIX_VEX_0F66
) },
8407 { PREFIX_TABLE (PREFIX_VEX_0F67
) },
8409 { PREFIX_TABLE (PREFIX_VEX_0F68
) },
8410 { PREFIX_TABLE (PREFIX_VEX_0F69
) },
8411 { PREFIX_TABLE (PREFIX_VEX_0F6A
) },
8412 { PREFIX_TABLE (PREFIX_VEX_0F6B
) },
8413 { PREFIX_TABLE (PREFIX_VEX_0F6C
) },
8414 { PREFIX_TABLE (PREFIX_VEX_0F6D
) },
8415 { PREFIX_TABLE (PREFIX_VEX_0F6E
) },
8416 { PREFIX_TABLE (PREFIX_VEX_0F6F
) },
8418 { PREFIX_TABLE (PREFIX_VEX_0F70
) },
8419 { REG_TABLE (REG_VEX_0F71
) },
8420 { REG_TABLE (REG_VEX_0F72
) },
8421 { REG_TABLE (REG_VEX_0F73
) },
8422 { PREFIX_TABLE (PREFIX_VEX_0F74
) },
8423 { PREFIX_TABLE (PREFIX_VEX_0F75
) },
8424 { PREFIX_TABLE (PREFIX_VEX_0F76
) },
8425 { PREFIX_TABLE (PREFIX_VEX_0F77
) },
8431 { PREFIX_TABLE (PREFIX_VEX_0F7C
) },
8432 { PREFIX_TABLE (PREFIX_VEX_0F7D
) },
8433 { PREFIX_TABLE (PREFIX_VEX_0F7E
) },
8434 { PREFIX_TABLE (PREFIX_VEX_0F7F
) },
8454 { PREFIX_TABLE (PREFIX_VEX_0F90
) },
8455 { PREFIX_TABLE (PREFIX_VEX_0F91
) },
8456 { PREFIX_TABLE (PREFIX_VEX_0F92
) },
8457 { PREFIX_TABLE (PREFIX_VEX_0F93
) },
8463 { PREFIX_TABLE (PREFIX_VEX_0F98
) },
8464 { PREFIX_TABLE (PREFIX_VEX_0F99
) },
8487 { REG_TABLE (REG_VEX_0FAE
) },
8510 { PREFIX_TABLE (PREFIX_VEX_0FC2
) },
8512 { PREFIX_TABLE (PREFIX_VEX_0FC4
) },
8513 { PREFIX_TABLE (PREFIX_VEX_0FC5
) },
8514 { "vshufpX", { XM
, Vex
, EXx
, Ib
}, PREFIX_OPCODE
},
8526 { PREFIX_TABLE (PREFIX_VEX_0FD0
) },
8527 { PREFIX_TABLE (PREFIX_VEX_0FD1
) },
8528 { PREFIX_TABLE (PREFIX_VEX_0FD2
) },
8529 { PREFIX_TABLE (PREFIX_VEX_0FD3
) },
8530 { PREFIX_TABLE (PREFIX_VEX_0FD4
) },
8531 { PREFIX_TABLE (PREFIX_VEX_0FD5
) },
8532 { PREFIX_TABLE (PREFIX_VEX_0FD6
) },
8533 { PREFIX_TABLE (PREFIX_VEX_0FD7
) },
8535 { PREFIX_TABLE (PREFIX_VEX_0FD8
) },
8536 { PREFIX_TABLE (PREFIX_VEX_0FD9
) },
8537 { PREFIX_TABLE (PREFIX_VEX_0FDA
) },
8538 { PREFIX_TABLE (PREFIX_VEX_0FDB
) },
8539 { PREFIX_TABLE (PREFIX_VEX_0FDC
) },
8540 { PREFIX_TABLE (PREFIX_VEX_0FDD
) },
8541 { PREFIX_TABLE (PREFIX_VEX_0FDE
) },
8542 { PREFIX_TABLE (PREFIX_VEX_0FDF
) },
8544 { PREFIX_TABLE (PREFIX_VEX_0FE0
) },
8545 { PREFIX_TABLE (PREFIX_VEX_0FE1
) },
8546 { PREFIX_TABLE (PREFIX_VEX_0FE2
) },
8547 { PREFIX_TABLE (PREFIX_VEX_0FE3
) },
8548 { PREFIX_TABLE (PREFIX_VEX_0FE4
) },
8549 { PREFIX_TABLE (PREFIX_VEX_0FE5
) },
8550 { PREFIX_TABLE (PREFIX_VEX_0FE6
) },
8551 { PREFIX_TABLE (PREFIX_VEX_0FE7
) },
8553 { PREFIX_TABLE (PREFIX_VEX_0FE8
) },
8554 { PREFIX_TABLE (PREFIX_VEX_0FE9
) },
8555 { PREFIX_TABLE (PREFIX_VEX_0FEA
) },
8556 { PREFIX_TABLE (PREFIX_VEX_0FEB
) },
8557 { PREFIX_TABLE (PREFIX_VEX_0FEC
) },
8558 { PREFIX_TABLE (PREFIX_VEX_0FED
) },
8559 { PREFIX_TABLE (PREFIX_VEX_0FEE
) },
8560 { PREFIX_TABLE (PREFIX_VEX_0FEF
) },
8562 { PREFIX_TABLE (PREFIX_VEX_0FF0
) },
8563 { PREFIX_TABLE (PREFIX_VEX_0FF1
) },
8564 { PREFIX_TABLE (PREFIX_VEX_0FF2
) },
8565 { PREFIX_TABLE (PREFIX_VEX_0FF3
) },
8566 { PREFIX_TABLE (PREFIX_VEX_0FF4
) },
8567 { PREFIX_TABLE (PREFIX_VEX_0FF5
) },
8568 { PREFIX_TABLE (PREFIX_VEX_0FF6
) },
8569 { PREFIX_TABLE (PREFIX_VEX_0FF7
) },
8571 { PREFIX_TABLE (PREFIX_VEX_0FF8
) },
8572 { PREFIX_TABLE (PREFIX_VEX_0FF9
) },
8573 { PREFIX_TABLE (PREFIX_VEX_0FFA
) },
8574 { PREFIX_TABLE (PREFIX_VEX_0FFB
) },
8575 { PREFIX_TABLE (PREFIX_VEX_0FFC
) },
8576 { PREFIX_TABLE (PREFIX_VEX_0FFD
) },
8577 { PREFIX_TABLE (PREFIX_VEX_0FFE
) },
8583 { PREFIX_TABLE (PREFIX_VEX_0F3800
) },
8584 { PREFIX_TABLE (PREFIX_VEX_0F3801
) },
8585 { PREFIX_TABLE (PREFIX_VEX_0F3802
) },
8586 { PREFIX_TABLE (PREFIX_VEX_0F3803
) },
8587 { PREFIX_TABLE (PREFIX_VEX_0F3804
) },
8588 { PREFIX_TABLE (PREFIX_VEX_0F3805
) },
8589 { PREFIX_TABLE (PREFIX_VEX_0F3806
) },
8590 { PREFIX_TABLE (PREFIX_VEX_0F3807
) },
8592 { PREFIX_TABLE (PREFIX_VEX_0F3808
) },
8593 { PREFIX_TABLE (PREFIX_VEX_0F3809
) },
8594 { PREFIX_TABLE (PREFIX_VEX_0F380A
) },
8595 { PREFIX_TABLE (PREFIX_VEX_0F380B
) },
8596 { PREFIX_TABLE (PREFIX_VEX_0F380C
) },
8597 { PREFIX_TABLE (PREFIX_VEX_0F380D
) },
8598 { PREFIX_TABLE (PREFIX_VEX_0F380E
) },
8599 { PREFIX_TABLE (PREFIX_VEX_0F380F
) },
8604 { PREFIX_TABLE (PREFIX_VEX_0F3813
) },
8607 { PREFIX_TABLE (PREFIX_VEX_0F3816
) },
8608 { PREFIX_TABLE (PREFIX_VEX_0F3817
) },
8610 { PREFIX_TABLE (PREFIX_VEX_0F3818
) },
8611 { PREFIX_TABLE (PREFIX_VEX_0F3819
) },
8612 { PREFIX_TABLE (PREFIX_VEX_0F381A
) },
8614 { PREFIX_TABLE (PREFIX_VEX_0F381C
) },
8615 { PREFIX_TABLE (PREFIX_VEX_0F381D
) },
8616 { PREFIX_TABLE (PREFIX_VEX_0F381E
) },
8619 { PREFIX_TABLE (PREFIX_VEX_0F3820
) },
8620 { PREFIX_TABLE (PREFIX_VEX_0F3821
) },
8621 { PREFIX_TABLE (PREFIX_VEX_0F3822
) },
8622 { PREFIX_TABLE (PREFIX_VEX_0F3823
) },
8623 { PREFIX_TABLE (PREFIX_VEX_0F3824
) },
8624 { PREFIX_TABLE (PREFIX_VEX_0F3825
) },
8628 { PREFIX_TABLE (PREFIX_VEX_0F3828
) },
8629 { PREFIX_TABLE (PREFIX_VEX_0F3829
) },
8630 { PREFIX_TABLE (PREFIX_VEX_0F382A
) },
8631 { PREFIX_TABLE (PREFIX_VEX_0F382B
) },
8632 { PREFIX_TABLE (PREFIX_VEX_0F382C
) },
8633 { PREFIX_TABLE (PREFIX_VEX_0F382D
) },
8634 { PREFIX_TABLE (PREFIX_VEX_0F382E
) },
8635 { PREFIX_TABLE (PREFIX_VEX_0F382F
) },
8637 { PREFIX_TABLE (PREFIX_VEX_0F3830
) },
8638 { PREFIX_TABLE (PREFIX_VEX_0F3831
) },
8639 { PREFIX_TABLE (PREFIX_VEX_0F3832
) },
8640 { PREFIX_TABLE (PREFIX_VEX_0F3833
) },
8641 { PREFIX_TABLE (PREFIX_VEX_0F3834
) },
8642 { PREFIX_TABLE (PREFIX_VEX_0F3835
) },
8643 { PREFIX_TABLE (PREFIX_VEX_0F3836
) },
8644 { PREFIX_TABLE (PREFIX_VEX_0F3837
) },
8646 { PREFIX_TABLE (PREFIX_VEX_0F3838
) },
8647 { PREFIX_TABLE (PREFIX_VEX_0F3839
) },
8648 { PREFIX_TABLE (PREFIX_VEX_0F383A
) },
8649 { PREFIX_TABLE (PREFIX_VEX_0F383B
) },
8650 { PREFIX_TABLE (PREFIX_VEX_0F383C
) },
8651 { PREFIX_TABLE (PREFIX_VEX_0F383D
) },
8652 { PREFIX_TABLE (PREFIX_VEX_0F383E
) },
8653 { PREFIX_TABLE (PREFIX_VEX_0F383F
) },
8655 { PREFIX_TABLE (PREFIX_VEX_0F3840
) },
8656 { PREFIX_TABLE (PREFIX_VEX_0F3841
) },
8660 { PREFIX_TABLE (PREFIX_VEX_0F3845
) },
8661 { PREFIX_TABLE (PREFIX_VEX_0F3846
) },
8662 { PREFIX_TABLE (PREFIX_VEX_0F3847
) },
8682 { PREFIX_TABLE (PREFIX_VEX_0F3858
) },
8683 { PREFIX_TABLE (PREFIX_VEX_0F3859
) },
8684 { PREFIX_TABLE (PREFIX_VEX_0F385A
) },
8718 { PREFIX_TABLE (PREFIX_VEX_0F3878
) },
8719 { PREFIX_TABLE (PREFIX_VEX_0F3879
) },
8740 { PREFIX_TABLE (PREFIX_VEX_0F388C
) },
8742 { PREFIX_TABLE (PREFIX_VEX_0F388E
) },
8745 { PREFIX_TABLE (PREFIX_VEX_0F3890
) },
8746 { PREFIX_TABLE (PREFIX_VEX_0F3891
) },
8747 { PREFIX_TABLE (PREFIX_VEX_0F3892
) },
8748 { PREFIX_TABLE (PREFIX_VEX_0F3893
) },
8751 { PREFIX_TABLE (PREFIX_VEX_0F3896
) },
8752 { PREFIX_TABLE (PREFIX_VEX_0F3897
) },
8754 { PREFIX_TABLE (PREFIX_VEX_0F3898
) },
8755 { PREFIX_TABLE (PREFIX_VEX_0F3899
) },
8756 { PREFIX_TABLE (PREFIX_VEX_0F389A
) },
8757 { PREFIX_TABLE (PREFIX_VEX_0F389B
) },
8758 { PREFIX_TABLE (PREFIX_VEX_0F389C
) },
8759 { PREFIX_TABLE (PREFIX_VEX_0F389D
) },
8760 { PREFIX_TABLE (PREFIX_VEX_0F389E
) },
8761 { PREFIX_TABLE (PREFIX_VEX_0F389F
) },
8769 { PREFIX_TABLE (PREFIX_VEX_0F38A6
) },
8770 { PREFIX_TABLE (PREFIX_VEX_0F38A7
) },
8772 { PREFIX_TABLE (PREFIX_VEX_0F38A8
) },
8773 { PREFIX_TABLE (PREFIX_VEX_0F38A9
) },
8774 { PREFIX_TABLE (PREFIX_VEX_0F38AA
) },
8775 { PREFIX_TABLE (PREFIX_VEX_0F38AB
) },
8776 { PREFIX_TABLE (PREFIX_VEX_0F38AC
) },
8777 { PREFIX_TABLE (PREFIX_VEX_0F38AD
) },
8778 { PREFIX_TABLE (PREFIX_VEX_0F38AE
) },
8779 { PREFIX_TABLE (PREFIX_VEX_0F38AF
) },
8787 { PREFIX_TABLE (PREFIX_VEX_0F38B6
) },
8788 { PREFIX_TABLE (PREFIX_VEX_0F38B7
) },
8790 { PREFIX_TABLE (PREFIX_VEX_0F38B8
) },
8791 { PREFIX_TABLE (PREFIX_VEX_0F38B9
) },
8792 { PREFIX_TABLE (PREFIX_VEX_0F38BA
) },
8793 { PREFIX_TABLE (PREFIX_VEX_0F38BB
) },
8794 { PREFIX_TABLE (PREFIX_VEX_0F38BC
) },
8795 { PREFIX_TABLE (PREFIX_VEX_0F38BD
) },
8796 { PREFIX_TABLE (PREFIX_VEX_0F38BE
) },
8797 { PREFIX_TABLE (PREFIX_VEX_0F38BF
) },
8815 { PREFIX_TABLE (PREFIX_VEX_0F38CF
) },
8829 { PREFIX_TABLE (PREFIX_VEX_0F38DB
) },
8830 { PREFIX_TABLE (PREFIX_VEX_0F38DC
) },
8831 { PREFIX_TABLE (PREFIX_VEX_0F38DD
) },
8832 { PREFIX_TABLE (PREFIX_VEX_0F38DE
) },
8833 { PREFIX_TABLE (PREFIX_VEX_0F38DF
) },
8855 { PREFIX_TABLE (PREFIX_VEX_0F38F2
) },
8856 { REG_TABLE (REG_VEX_0F38F3
) },
8858 { PREFIX_TABLE (PREFIX_VEX_0F38F5
) },
8859 { PREFIX_TABLE (PREFIX_VEX_0F38F6
) },
8860 { PREFIX_TABLE (PREFIX_VEX_0F38F7
) },
8874 { PREFIX_TABLE (PREFIX_VEX_0F3A00
) },
8875 { PREFIX_TABLE (PREFIX_VEX_0F3A01
) },
8876 { PREFIX_TABLE (PREFIX_VEX_0F3A02
) },
8878 { PREFIX_TABLE (PREFIX_VEX_0F3A04
) },
8879 { PREFIX_TABLE (PREFIX_VEX_0F3A05
) },
8880 { PREFIX_TABLE (PREFIX_VEX_0F3A06
) },
8883 { PREFIX_TABLE (PREFIX_VEX_0F3A08
) },
8884 { PREFIX_TABLE (PREFIX_VEX_0F3A09
) },
8885 { PREFIX_TABLE (PREFIX_VEX_0F3A0A
) },
8886 { PREFIX_TABLE (PREFIX_VEX_0F3A0B
) },
8887 { PREFIX_TABLE (PREFIX_VEX_0F3A0C
) },
8888 { PREFIX_TABLE (PREFIX_VEX_0F3A0D
) },
8889 { PREFIX_TABLE (PREFIX_VEX_0F3A0E
) },
8890 { PREFIX_TABLE (PREFIX_VEX_0F3A0F
) },
8896 { PREFIX_TABLE (PREFIX_VEX_0F3A14
) },
8897 { PREFIX_TABLE (PREFIX_VEX_0F3A15
) },
8898 { PREFIX_TABLE (PREFIX_VEX_0F3A16
) },
8899 { PREFIX_TABLE (PREFIX_VEX_0F3A17
) },
8901 { PREFIX_TABLE (PREFIX_VEX_0F3A18
) },
8902 { PREFIX_TABLE (PREFIX_VEX_0F3A19
) },
8906 { PREFIX_TABLE (PREFIX_VEX_0F3A1D
) },
8910 { PREFIX_TABLE (PREFIX_VEX_0F3A20
) },
8911 { PREFIX_TABLE (PREFIX_VEX_0F3A21
) },
8912 { PREFIX_TABLE (PREFIX_VEX_0F3A22
) },
8928 { PREFIX_TABLE (PREFIX_VEX_0F3A30
) },
8929 { PREFIX_TABLE (PREFIX_VEX_0F3A31
) },
8930 { PREFIX_TABLE (PREFIX_VEX_0F3A32
) },
8931 { PREFIX_TABLE (PREFIX_VEX_0F3A33
) },
8937 { PREFIX_TABLE (PREFIX_VEX_0F3A38
) },
8938 { PREFIX_TABLE (PREFIX_VEX_0F3A39
) },
8946 { PREFIX_TABLE (PREFIX_VEX_0F3A40
) },
8947 { PREFIX_TABLE (PREFIX_VEX_0F3A41
) },
8948 { PREFIX_TABLE (PREFIX_VEX_0F3A42
) },
8950 { PREFIX_TABLE (PREFIX_VEX_0F3A44
) },
8952 { PREFIX_TABLE (PREFIX_VEX_0F3A46
) },
8955 { PREFIX_TABLE (PREFIX_VEX_0F3A48
) },
8956 { PREFIX_TABLE (PREFIX_VEX_0F3A49
) },
8957 { PREFIX_TABLE (PREFIX_VEX_0F3A4A
) },
8958 { PREFIX_TABLE (PREFIX_VEX_0F3A4B
) },
8959 { PREFIX_TABLE (PREFIX_VEX_0F3A4C
) },
8977 { PREFIX_TABLE (PREFIX_VEX_0F3A5C
) },
8978 { PREFIX_TABLE (PREFIX_VEX_0F3A5D
) },
8979 { PREFIX_TABLE (PREFIX_VEX_0F3A5E
) },
8980 { PREFIX_TABLE (PREFIX_VEX_0F3A5F
) },
8982 { PREFIX_TABLE (PREFIX_VEX_0F3A60
) },
8983 { PREFIX_TABLE (PREFIX_VEX_0F3A61
) },
8984 { PREFIX_TABLE (PREFIX_VEX_0F3A62
) },
8985 { PREFIX_TABLE (PREFIX_VEX_0F3A63
) },
8991 { PREFIX_TABLE (PREFIX_VEX_0F3A68
) },
8992 { PREFIX_TABLE (PREFIX_VEX_0F3A69
) },
8993 { PREFIX_TABLE (PREFIX_VEX_0F3A6A
) },
8994 { PREFIX_TABLE (PREFIX_VEX_0F3A6B
) },
8995 { PREFIX_TABLE (PREFIX_VEX_0F3A6C
) },
8996 { PREFIX_TABLE (PREFIX_VEX_0F3A6D
) },
8997 { PREFIX_TABLE (PREFIX_VEX_0F3A6E
) },
8998 { PREFIX_TABLE (PREFIX_VEX_0F3A6F
) },
9009 { PREFIX_TABLE (PREFIX_VEX_0F3A78
) },
9010 { PREFIX_TABLE (PREFIX_VEX_0F3A79
) },
9011 { PREFIX_TABLE (PREFIX_VEX_0F3A7A
) },
9012 { PREFIX_TABLE (PREFIX_VEX_0F3A7B
) },
9013 { PREFIX_TABLE (PREFIX_VEX_0F3A7C
) },
9014 { PREFIX_TABLE (PREFIX_VEX_0F3A7D
) },
9015 { PREFIX_TABLE (PREFIX_VEX_0F3A7E
) },
9016 { PREFIX_TABLE (PREFIX_VEX_0F3A7F
) },
9105 { PREFIX_TABLE(PREFIX_VEX_0F3ACE
) },
9106 { PREFIX_TABLE(PREFIX_VEX_0F3ACF
) },
9124 { PREFIX_TABLE (PREFIX_VEX_0F3ADF
) },
9144 { PREFIX_TABLE (PREFIX_VEX_0F3AF0
) },
9164 #include "i386-dis-evex.h"
9166 static const struct dis386 vex_len_table
[][2] = {
9167 /* VEX_LEN_0F12_P_0_M_0 / VEX_LEN_0F12_P_2_M_0 */
9169 { "vmovlpX", { XM
, Vex128
, EXq
}, 0 },
9172 /* VEX_LEN_0F12_P_0_M_1 */
9174 { "vmovhlps", { XM
, Vex128
, EXq
}, 0 },
9177 /* VEX_LEN_0F13_M_0 */
9179 { "vmovlpX", { EXq
, XM
}, PREFIX_OPCODE
},
9182 /* VEX_LEN_0F16_P_0_M_0 / VEX_LEN_0F16_P_2_M_0 */
9184 { "vmovhpX", { XM
, Vex128
, EXq
}, 0 },
9187 /* VEX_LEN_0F16_P_0_M_1 */
9189 { "vmovlhps", { XM
, Vex128
, EXq
}, 0 },
9192 /* VEX_LEN_0F17_M_0 */
9194 { "vmovhpX", { EXq
, XM
}, PREFIX_OPCODE
},
9197 /* VEX_LEN_0F41_P_0 */
9200 { VEX_W_TABLE (VEX_W_0F41_P_0_LEN_1
) },
9202 /* VEX_LEN_0F41_P_2 */
9205 { VEX_W_TABLE (VEX_W_0F41_P_2_LEN_1
) },
9207 /* VEX_LEN_0F42_P_0 */
9210 { VEX_W_TABLE (VEX_W_0F42_P_0_LEN_1
) },
9212 /* VEX_LEN_0F42_P_2 */
9215 { VEX_W_TABLE (VEX_W_0F42_P_2_LEN_1
) },
9217 /* VEX_LEN_0F44_P_0 */
9219 { VEX_W_TABLE (VEX_W_0F44_P_0_LEN_0
) },
9221 /* VEX_LEN_0F44_P_2 */
9223 { VEX_W_TABLE (VEX_W_0F44_P_2_LEN_0
) },
9225 /* VEX_LEN_0F45_P_0 */
9228 { VEX_W_TABLE (VEX_W_0F45_P_0_LEN_1
) },
9230 /* VEX_LEN_0F45_P_2 */
9233 { VEX_W_TABLE (VEX_W_0F45_P_2_LEN_1
) },
9235 /* VEX_LEN_0F46_P_0 */
9238 { VEX_W_TABLE (VEX_W_0F46_P_0_LEN_1
) },
9240 /* VEX_LEN_0F46_P_2 */
9243 { VEX_W_TABLE (VEX_W_0F46_P_2_LEN_1
) },
9245 /* VEX_LEN_0F47_P_0 */
9248 { VEX_W_TABLE (VEX_W_0F47_P_0_LEN_1
) },
9250 /* VEX_LEN_0F47_P_2 */
9253 { VEX_W_TABLE (VEX_W_0F47_P_2_LEN_1
) },
9255 /* VEX_LEN_0F4A_P_0 */
9258 { VEX_W_TABLE (VEX_W_0F4A_P_0_LEN_1
) },
9260 /* VEX_LEN_0F4A_P_2 */
9263 { VEX_W_TABLE (VEX_W_0F4A_P_2_LEN_1
) },
9265 /* VEX_LEN_0F4B_P_0 */
9268 { VEX_W_TABLE (VEX_W_0F4B_P_0_LEN_1
) },
9270 /* VEX_LEN_0F4B_P_2 */
9273 { VEX_W_TABLE (VEX_W_0F4B_P_2_LEN_1
) },
9276 /* VEX_LEN_0F6E_P_2 */
9278 { "vmovK", { XMScalar
, Edq
}, 0 },
9281 /* VEX_LEN_0F77_P_1 */
9283 { "vzeroupper", { XX
}, 0 },
9284 { "vzeroall", { XX
}, 0 },
9287 /* VEX_LEN_0F7E_P_1 */
9289 { "vmovq", { XMScalar
, EXxmm_mq
}, 0 },
9292 /* VEX_LEN_0F7E_P_2 */
9294 { "vmovK", { Edq
, XMScalar
}, 0 },
9297 /* VEX_LEN_0F90_P_0 */
9299 { VEX_W_TABLE (VEX_W_0F90_P_0_LEN_0
) },
9302 /* VEX_LEN_0F90_P_2 */
9304 { VEX_W_TABLE (VEX_W_0F90_P_2_LEN_0
) },
9307 /* VEX_LEN_0F91_P_0 */
9309 { VEX_W_TABLE (VEX_W_0F91_P_0_LEN_0
) },
9312 /* VEX_LEN_0F91_P_2 */
9314 { VEX_W_TABLE (VEX_W_0F91_P_2_LEN_0
) },
9317 /* VEX_LEN_0F92_P_0 */
9319 { VEX_W_TABLE (VEX_W_0F92_P_0_LEN_0
) },
9322 /* VEX_LEN_0F92_P_2 */
9324 { VEX_W_TABLE (VEX_W_0F92_P_2_LEN_0
) },
9327 /* VEX_LEN_0F92_P_3 */
9329 { MOD_TABLE (MOD_VEX_0F92_P_3_LEN_0
) },
9332 /* VEX_LEN_0F93_P_0 */
9334 { VEX_W_TABLE (VEX_W_0F93_P_0_LEN_0
) },
9337 /* VEX_LEN_0F93_P_2 */
9339 { VEX_W_TABLE (VEX_W_0F93_P_2_LEN_0
) },
9342 /* VEX_LEN_0F93_P_3 */
9344 { MOD_TABLE (MOD_VEX_0F93_P_3_LEN_0
) },
9347 /* VEX_LEN_0F98_P_0 */
9349 { VEX_W_TABLE (VEX_W_0F98_P_0_LEN_0
) },
9352 /* VEX_LEN_0F98_P_2 */
9354 { VEX_W_TABLE (VEX_W_0F98_P_2_LEN_0
) },
9357 /* VEX_LEN_0F99_P_0 */
9359 { VEX_W_TABLE (VEX_W_0F99_P_0_LEN_0
) },
9362 /* VEX_LEN_0F99_P_2 */
9364 { VEX_W_TABLE (VEX_W_0F99_P_2_LEN_0
) },
9367 /* VEX_LEN_0FAE_R_2_M_0 */
9369 { "vldmxcsr", { Md
}, 0 },
9372 /* VEX_LEN_0FAE_R_3_M_0 */
9374 { "vstmxcsr", { Md
}, 0 },
9377 /* VEX_LEN_0FC4_P_2 */
9379 { "vpinsrw", { XM
, Vex128
, Edqw
, Ib
}, 0 },
9382 /* VEX_LEN_0FC5_P_2 */
9384 { "vpextrw", { Gdq
, XS
, Ib
}, 0 },
9387 /* VEX_LEN_0FD6_P_2 */
9389 { "vmovq", { EXqVexScalarS
, XMScalar
}, 0 },
9392 /* VEX_LEN_0FF7_P_2 */
9394 { "vmaskmovdqu", { XM
, XS
}, 0 },
9397 /* VEX_LEN_0F3816_P_2 */
9400 { VEX_W_TABLE (VEX_W_0F3816_P_2
) },
9403 /* VEX_LEN_0F3819_P_2 */
9406 { VEX_W_TABLE (VEX_W_0F3819_P_2
) },
9409 /* VEX_LEN_0F381A_P_2_M_0 */
9412 { VEX_W_TABLE (VEX_W_0F381A_P_2_M_0
) },
9415 /* VEX_LEN_0F3836_P_2 */
9418 { VEX_W_TABLE (VEX_W_0F3836_P_2
) },
9421 /* VEX_LEN_0F3841_P_2 */
9423 { "vphminposuw", { XM
, EXx
}, 0 },
9426 /* VEX_LEN_0F385A_P_2_M_0 */
9429 { VEX_W_TABLE (VEX_W_0F385A_P_2_M_0
) },
9432 /* VEX_LEN_0F38DB_P_2 */
9434 { "vaesimc", { XM
, EXx
}, 0 },
9437 /* VEX_LEN_0F38F2_P_0 */
9439 { "andnS", { Gdq
, VexGdq
, Edq
}, 0 },
9442 /* VEX_LEN_0F38F3_R_1_P_0 */
9444 { "blsrS", { VexGdq
, Edq
}, 0 },
9447 /* VEX_LEN_0F38F3_R_2_P_0 */
9449 { "blsmskS", { VexGdq
, Edq
}, 0 },
9452 /* VEX_LEN_0F38F3_R_3_P_0 */
9454 { "blsiS", { VexGdq
, Edq
}, 0 },
9457 /* VEX_LEN_0F38F5_P_0 */
9459 { "bzhiS", { Gdq
, Edq
, VexGdq
}, 0 },
9462 /* VEX_LEN_0F38F5_P_1 */
9464 { "pextS", { Gdq
, VexGdq
, Edq
}, 0 },
9467 /* VEX_LEN_0F38F5_P_3 */
9469 { "pdepS", { Gdq
, VexGdq
, Edq
}, 0 },
9472 /* VEX_LEN_0F38F6_P_3 */
9474 { "mulxS", { Gdq
, VexGdq
, Edq
}, 0 },
9477 /* VEX_LEN_0F38F7_P_0 */
9479 { "bextrS", { Gdq
, Edq
, VexGdq
}, 0 },
9482 /* VEX_LEN_0F38F7_P_1 */
9484 { "sarxS", { Gdq
, Edq
, VexGdq
}, 0 },
9487 /* VEX_LEN_0F38F7_P_2 */
9489 { "shlxS", { Gdq
, Edq
, VexGdq
}, 0 },
9492 /* VEX_LEN_0F38F7_P_3 */
9494 { "shrxS", { Gdq
, Edq
, VexGdq
}, 0 },
9497 /* VEX_LEN_0F3A00_P_2 */
9500 { VEX_W_TABLE (VEX_W_0F3A00_P_2
) },
9503 /* VEX_LEN_0F3A01_P_2 */
9506 { VEX_W_TABLE (VEX_W_0F3A01_P_2
) },
9509 /* VEX_LEN_0F3A06_P_2 */
9512 { VEX_W_TABLE (VEX_W_0F3A06_P_2
) },
9515 /* VEX_LEN_0F3A14_P_2 */
9517 { "vpextrb", { Edqb
, XM
, Ib
}, 0 },
9520 /* VEX_LEN_0F3A15_P_2 */
9522 { "vpextrw", { Edqw
, XM
, Ib
}, 0 },
9525 /* VEX_LEN_0F3A16_P_2 */
9527 { "vpextrK", { Edq
, XM
, Ib
}, 0 },
9530 /* VEX_LEN_0F3A17_P_2 */
9532 { "vextractps", { Edqd
, XM
, Ib
}, 0 },
9535 /* VEX_LEN_0F3A18_P_2 */
9538 { VEX_W_TABLE (VEX_W_0F3A18_P_2
) },
9541 /* VEX_LEN_0F3A19_P_2 */
9544 { VEX_W_TABLE (VEX_W_0F3A19_P_2
) },
9547 /* VEX_LEN_0F3A20_P_2 */
9549 { "vpinsrb", { XM
, Vex128
, Edqb
, Ib
}, 0 },
9552 /* VEX_LEN_0F3A21_P_2 */
9554 { "vinsertps", { XM
, Vex128
, EXd
, Ib
}, 0 },
9557 /* VEX_LEN_0F3A22_P_2 */
9559 { "vpinsrK", { XM
, Vex128
, Edq
, Ib
}, 0 },
9562 /* VEX_LEN_0F3A30_P_2 */
9564 { VEX_W_TABLE (VEX_W_0F3A30_P_2_LEN_0
) },
9567 /* VEX_LEN_0F3A31_P_2 */
9569 { VEX_W_TABLE (VEX_W_0F3A31_P_2_LEN_0
) },
9572 /* VEX_LEN_0F3A32_P_2 */
9574 { VEX_W_TABLE (VEX_W_0F3A32_P_2_LEN_0
) },
9577 /* VEX_LEN_0F3A33_P_2 */
9579 { VEX_W_TABLE (VEX_W_0F3A33_P_2_LEN_0
) },
9582 /* VEX_LEN_0F3A38_P_2 */
9585 { VEX_W_TABLE (VEX_W_0F3A38_P_2
) },
9588 /* VEX_LEN_0F3A39_P_2 */
9591 { VEX_W_TABLE (VEX_W_0F3A39_P_2
) },
9594 /* VEX_LEN_0F3A41_P_2 */
9596 { "vdppd", { XM
, Vex128
, EXx
, Ib
}, 0 },
9599 /* VEX_LEN_0F3A46_P_2 */
9602 { VEX_W_TABLE (VEX_W_0F3A46_P_2
) },
9605 /* VEX_LEN_0F3A60_P_2 */
9607 { "vpcmpestrm", { XM
, { PCMPESTR_Fixup
, x_mode
}, Ib
}, 0 },
9610 /* VEX_LEN_0F3A61_P_2 */
9612 { "vpcmpestri", { XM
, { PCMPESTR_Fixup
, x_mode
}, Ib
}, 0 },
9615 /* VEX_LEN_0F3A62_P_2 */
9617 { "vpcmpistrm", { XM
, EXx
, Ib
}, 0 },
9620 /* VEX_LEN_0F3A63_P_2 */
9622 { "vpcmpistri", { XM
, EXx
, Ib
}, 0 },
9625 /* VEX_LEN_0F3A6A_P_2 */
9627 { "vfmaddss", { XMScalar
, VexScalar
, EXxmm_md
, XMVexI4
}, 0 },
9630 /* VEX_LEN_0F3A6B_P_2 */
9632 { "vfmaddsd", { XMScalar
, VexScalar
, EXxmm_mq
, XMVexI4
}, 0 },
9635 /* VEX_LEN_0F3A6E_P_2 */
9637 { "vfmsubss", { XMScalar
, VexScalar
, EXxmm_md
, XMVexI4
}, 0 },
9640 /* VEX_LEN_0F3A6F_P_2 */
9642 { "vfmsubsd", { XMScalar
, VexScalar
, EXxmm_mq
, XMVexI4
}, 0 },
9645 /* VEX_LEN_0F3A7A_P_2 */
9647 { "vfnmaddss", { XMScalar
, VexScalar
, EXxmm_md
, XMVexI4
}, 0 },
9650 /* VEX_LEN_0F3A7B_P_2 */
9652 { "vfnmaddsd", { XMScalar
, VexScalar
, EXxmm_mq
, XMVexI4
}, 0 },
9655 /* VEX_LEN_0F3A7E_P_2 */
9657 { "vfnmsubss", { XMScalar
, VexScalar
, EXxmm_md
, XMVexI4
}, 0 },
9660 /* VEX_LEN_0F3A7F_P_2 */
9662 { "vfnmsubsd", { XMScalar
, VexScalar
, EXxmm_mq
, XMVexI4
}, 0 },
9665 /* VEX_LEN_0F3ADF_P_2 */
9667 { "vaeskeygenassist", { XM
, EXx
, Ib
}, 0 },
9670 /* VEX_LEN_0F3AF0_P_3 */
9672 { "rorxS", { Gdq
, Edq
, Ib
}, 0 },
9675 /* VEX_LEN_0FXOP_08_CC */
9677 { "vpcomb", { XM
, Vex128
, EXx
, VPCOM
}, 0 },
9680 /* VEX_LEN_0FXOP_08_CD */
9682 { "vpcomw", { XM
, Vex128
, EXx
, VPCOM
}, 0 },
9685 /* VEX_LEN_0FXOP_08_CE */
9687 { "vpcomd", { XM
, Vex128
, EXx
, VPCOM
}, 0 },
9690 /* VEX_LEN_0FXOP_08_CF */
9692 { "vpcomq", { XM
, Vex128
, EXx
, VPCOM
}, 0 },
9695 /* VEX_LEN_0FXOP_08_EC */
9697 { "vpcomub", { XM
, Vex128
, EXx
, VPCOM
}, 0 },
9700 /* VEX_LEN_0FXOP_08_ED */
9702 { "vpcomuw", { XM
, Vex128
, EXx
, VPCOM
}, 0 },
9705 /* VEX_LEN_0FXOP_08_EE */
9707 { "vpcomud", { XM
, Vex128
, EXx
, VPCOM
}, 0 },
9710 /* VEX_LEN_0FXOP_08_EF */
9712 { "vpcomuq", { XM
, Vex128
, EXx
, VPCOM
}, 0 },
9715 /* VEX_LEN_0FXOP_09_82_W_0 */
9717 { "vfrczss", { XM
, EXd
}, 0 },
9720 /* VEX_LEN_0FXOP_09_83_W_0 */
9722 { "vfrczsd", { XM
, EXq
}, 0 },
9726 #include "i386-dis-evex-len.h"
9728 static const struct dis386 vex_w_table
[][2] = {
9730 /* VEX_W_0F41_P_0_LEN_1 */
9731 { MOD_TABLE (MOD_VEX_W_0_0F41_P_0_LEN_1
) },
9732 { MOD_TABLE (MOD_VEX_W_1_0F41_P_0_LEN_1
) },
9735 /* VEX_W_0F41_P_2_LEN_1 */
9736 { MOD_TABLE (MOD_VEX_W_0_0F41_P_2_LEN_1
) },
9737 { MOD_TABLE (MOD_VEX_W_1_0F41_P_2_LEN_1
) }
9740 /* VEX_W_0F42_P_0_LEN_1 */
9741 { MOD_TABLE (MOD_VEX_W_0_0F42_P_0_LEN_1
) },
9742 { MOD_TABLE (MOD_VEX_W_1_0F42_P_0_LEN_1
) },
9745 /* VEX_W_0F42_P_2_LEN_1 */
9746 { MOD_TABLE (MOD_VEX_W_0_0F42_P_2_LEN_1
) },
9747 { MOD_TABLE (MOD_VEX_W_1_0F42_P_2_LEN_1
) },
9750 /* VEX_W_0F44_P_0_LEN_0 */
9751 { MOD_TABLE (MOD_VEX_W_0_0F44_P_0_LEN_1
) },
9752 { MOD_TABLE (MOD_VEX_W_1_0F44_P_0_LEN_1
) },
9755 /* VEX_W_0F44_P_2_LEN_0 */
9756 { MOD_TABLE (MOD_VEX_W_0_0F44_P_2_LEN_1
) },
9757 { MOD_TABLE (MOD_VEX_W_1_0F44_P_2_LEN_1
) },
9760 /* VEX_W_0F45_P_0_LEN_1 */
9761 { MOD_TABLE (MOD_VEX_W_0_0F45_P_0_LEN_1
) },
9762 { MOD_TABLE (MOD_VEX_W_1_0F45_P_0_LEN_1
) },
9765 /* VEX_W_0F45_P_2_LEN_1 */
9766 { MOD_TABLE (MOD_VEX_W_0_0F45_P_2_LEN_1
) },
9767 { MOD_TABLE (MOD_VEX_W_1_0F45_P_2_LEN_1
) },
9770 /* VEX_W_0F46_P_0_LEN_1 */
9771 { MOD_TABLE (MOD_VEX_W_0_0F46_P_0_LEN_1
) },
9772 { MOD_TABLE (MOD_VEX_W_1_0F46_P_0_LEN_1
) },
9775 /* VEX_W_0F46_P_2_LEN_1 */
9776 { MOD_TABLE (MOD_VEX_W_0_0F46_P_2_LEN_1
) },
9777 { MOD_TABLE (MOD_VEX_W_1_0F46_P_2_LEN_1
) },
9780 /* VEX_W_0F47_P_0_LEN_1 */
9781 { MOD_TABLE (MOD_VEX_W_0_0F47_P_0_LEN_1
) },
9782 { MOD_TABLE (MOD_VEX_W_1_0F47_P_0_LEN_1
) },
9785 /* VEX_W_0F47_P_2_LEN_1 */
9786 { MOD_TABLE (MOD_VEX_W_0_0F47_P_2_LEN_1
) },
9787 { MOD_TABLE (MOD_VEX_W_1_0F47_P_2_LEN_1
) },
9790 /* VEX_W_0F4A_P_0_LEN_1 */
9791 { MOD_TABLE (MOD_VEX_W_0_0F4A_P_0_LEN_1
) },
9792 { MOD_TABLE (MOD_VEX_W_1_0F4A_P_0_LEN_1
) },
9795 /* VEX_W_0F4A_P_2_LEN_1 */
9796 { MOD_TABLE (MOD_VEX_W_0_0F4A_P_2_LEN_1
) },
9797 { MOD_TABLE (MOD_VEX_W_1_0F4A_P_2_LEN_1
) },
9800 /* VEX_W_0F4B_P_0_LEN_1 */
9801 { MOD_TABLE (MOD_VEX_W_0_0F4B_P_0_LEN_1
) },
9802 { MOD_TABLE (MOD_VEX_W_1_0F4B_P_0_LEN_1
) },
9805 /* VEX_W_0F4B_P_2_LEN_1 */
9806 { MOD_TABLE (MOD_VEX_W_0_0F4B_P_2_LEN_1
) },
9809 /* VEX_W_0F90_P_0_LEN_0 */
9810 { "kmovw", { MaskG
, MaskE
}, 0 },
9811 { "kmovq", { MaskG
, MaskE
}, 0 },
9814 /* VEX_W_0F90_P_2_LEN_0 */
9815 { "kmovb", { MaskG
, MaskBDE
}, 0 },
9816 { "kmovd", { MaskG
, MaskBDE
}, 0 },
9819 /* VEX_W_0F91_P_0_LEN_0 */
9820 { MOD_TABLE (MOD_VEX_W_0_0F91_P_0_LEN_0
) },
9821 { MOD_TABLE (MOD_VEX_W_1_0F91_P_0_LEN_0
) },
9824 /* VEX_W_0F91_P_2_LEN_0 */
9825 { MOD_TABLE (MOD_VEX_W_0_0F91_P_2_LEN_0
) },
9826 { MOD_TABLE (MOD_VEX_W_1_0F91_P_2_LEN_0
) },
9829 /* VEX_W_0F92_P_0_LEN_0 */
9830 { MOD_TABLE (MOD_VEX_W_0_0F92_P_0_LEN_0
) },
9833 /* VEX_W_0F92_P_2_LEN_0 */
9834 { MOD_TABLE (MOD_VEX_W_0_0F92_P_2_LEN_0
) },
9837 /* VEX_W_0F93_P_0_LEN_0 */
9838 { MOD_TABLE (MOD_VEX_W_0_0F93_P_0_LEN_0
) },
9841 /* VEX_W_0F93_P_2_LEN_0 */
9842 { MOD_TABLE (MOD_VEX_W_0_0F93_P_2_LEN_0
) },
9845 /* VEX_W_0F98_P_0_LEN_0 */
9846 { MOD_TABLE (MOD_VEX_W_0_0F98_P_0_LEN_0
) },
9847 { MOD_TABLE (MOD_VEX_W_1_0F98_P_0_LEN_0
) },
9850 /* VEX_W_0F98_P_2_LEN_0 */
9851 { MOD_TABLE (MOD_VEX_W_0_0F98_P_2_LEN_0
) },
9852 { MOD_TABLE (MOD_VEX_W_1_0F98_P_2_LEN_0
) },
9855 /* VEX_W_0F99_P_0_LEN_0 */
9856 { MOD_TABLE (MOD_VEX_W_0_0F99_P_0_LEN_0
) },
9857 { MOD_TABLE (MOD_VEX_W_1_0F99_P_0_LEN_0
) },
9860 /* VEX_W_0F99_P_2_LEN_0 */
9861 { MOD_TABLE (MOD_VEX_W_0_0F99_P_2_LEN_0
) },
9862 { MOD_TABLE (MOD_VEX_W_1_0F99_P_2_LEN_0
) },
9865 /* VEX_W_0F380C_P_2 */
9866 { "vpermilps", { XM
, Vex
, EXx
}, 0 },
9869 /* VEX_W_0F380D_P_2 */
9870 { "vpermilpd", { XM
, Vex
, EXx
}, 0 },
9873 /* VEX_W_0F380E_P_2 */
9874 { "vtestps", { XM
, EXx
}, 0 },
9877 /* VEX_W_0F380F_P_2 */
9878 { "vtestpd", { XM
, EXx
}, 0 },
9881 /* VEX_W_0F3813_P_2 */
9882 { "vcvtph2ps", { XM
, EXxmmq
}, 0 },
9885 /* VEX_W_0F3816_P_2 */
9886 { "vpermps", { XM
, Vex
, EXx
}, 0 },
9889 /* VEX_W_0F3818_P_2 */
9890 { "vbroadcastss", { XM
, EXxmm_md
}, 0 },
9893 /* VEX_W_0F3819_P_2 */
9894 { "vbroadcastsd", { XM
, EXxmm_mq
}, 0 },
9897 /* VEX_W_0F381A_P_2_M_0 */
9898 { "vbroadcastf128", { XM
, Mxmm
}, 0 },
9901 /* VEX_W_0F382C_P_2_M_0 */
9902 { "vmaskmovps", { XM
, Vex
, Mx
}, 0 },
9905 /* VEX_W_0F382D_P_2_M_0 */
9906 { "vmaskmovpd", { XM
, Vex
, Mx
}, 0 },
9909 /* VEX_W_0F382E_P_2_M_0 */
9910 { "vmaskmovps", { Mx
, Vex
, XM
}, 0 },
9913 /* VEX_W_0F382F_P_2_M_0 */
9914 { "vmaskmovpd", { Mx
, Vex
, XM
}, 0 },
9917 /* VEX_W_0F3836_P_2 */
9918 { "vpermd", { XM
, Vex
, EXx
}, 0 },
9921 /* VEX_W_0F3846_P_2 */
9922 { "vpsravd", { XM
, Vex
, EXx
}, 0 },
9925 /* VEX_W_0F3858_P_2 */
9926 { "vpbroadcastd", { XM
, EXxmm_md
}, 0 },
9929 /* VEX_W_0F3859_P_2 */
9930 { "vpbroadcastq", { XM
, EXxmm_mq
}, 0 },
9933 /* VEX_W_0F385A_P_2_M_0 */
9934 { "vbroadcasti128", { XM
, Mxmm
}, 0 },
9937 /* VEX_W_0F3878_P_2 */
9938 { "vpbroadcastb", { XM
, EXxmm_mb
}, 0 },
9941 /* VEX_W_0F3879_P_2 */
9942 { "vpbroadcastw", { XM
, EXxmm_mw
}, 0 },
9945 /* VEX_W_0F38CF_P_2 */
9946 { "vgf2p8mulb", { XM
, Vex
, EXx
}, 0 },
9949 /* VEX_W_0F3A00_P_2 */
9951 { "vpermq", { XM
, EXx
, Ib
}, 0 },
9954 /* VEX_W_0F3A01_P_2 */
9956 { "vpermpd", { XM
, EXx
, Ib
}, 0 },
9959 /* VEX_W_0F3A02_P_2 */
9960 { "vpblendd", { XM
, Vex
, EXx
, Ib
}, 0 },
9963 /* VEX_W_0F3A04_P_2 */
9964 { "vpermilps", { XM
, EXx
, Ib
}, 0 },
9967 /* VEX_W_0F3A05_P_2 */
9968 { "vpermilpd", { XM
, EXx
, Ib
}, 0 },
9971 /* VEX_W_0F3A06_P_2 */
9972 { "vperm2f128", { XM
, Vex256
, EXx
, Ib
}, 0 },
9975 /* VEX_W_0F3A18_P_2 */
9976 { "vinsertf128", { XM
, Vex256
, EXxmm
, Ib
}, 0 },
9979 /* VEX_W_0F3A19_P_2 */
9980 { "vextractf128", { EXxmm
, XM
, Ib
}, 0 },
9983 /* VEX_W_0F3A1D_P_2 */
9984 { "vcvtps2ph", { EXxmmq
, XM
, EXxEVexS
, Ib
}, 0 },
9987 /* VEX_W_0F3A30_P_2_LEN_0 */
9988 { MOD_TABLE (MOD_VEX_W_0_0F3A30_P_2_LEN_0
) },
9989 { MOD_TABLE (MOD_VEX_W_1_0F3A30_P_2_LEN_0
) },
9992 /* VEX_W_0F3A31_P_2_LEN_0 */
9993 { MOD_TABLE (MOD_VEX_W_0_0F3A31_P_2_LEN_0
) },
9994 { MOD_TABLE (MOD_VEX_W_1_0F3A31_P_2_LEN_0
) },
9997 /* VEX_W_0F3A32_P_2_LEN_0 */
9998 { MOD_TABLE (MOD_VEX_W_0_0F3A32_P_2_LEN_0
) },
9999 { MOD_TABLE (MOD_VEX_W_1_0F3A32_P_2_LEN_0
) },
10002 /* VEX_W_0F3A33_P_2_LEN_0 */
10003 { MOD_TABLE (MOD_VEX_W_0_0F3A33_P_2_LEN_0
) },
10004 { MOD_TABLE (MOD_VEX_W_1_0F3A33_P_2_LEN_0
) },
10007 /* VEX_W_0F3A38_P_2 */
10008 { "vinserti128", { XM
, Vex256
, EXxmm
, Ib
}, 0 },
10011 /* VEX_W_0F3A39_P_2 */
10012 { "vextracti128", { EXxmm
, XM
, Ib
}, 0 },
10015 /* VEX_W_0F3A46_P_2 */
10016 { "vperm2i128", { XM
, Vex256
, EXx
, Ib
}, 0 },
10019 /* VEX_W_0F3A4A_P_2 */
10020 { "vblendvps", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
10023 /* VEX_W_0F3A4B_P_2 */
10024 { "vblendvpd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
10027 /* VEX_W_0F3A4C_P_2 */
10028 { "vpblendvb", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
10031 /* VEX_W_0F3ACE_P_2 */
10033 { "vgf2p8affineqb", { XM
, Vex
, EXx
, Ib
}, 0 },
10036 /* VEX_W_0F3ACF_P_2 */
10038 { "vgf2p8affineinvqb", { XM
, Vex
, EXx
, Ib
}, 0 },
10040 /* VEX_W_0FXOP_09_80 */
10042 { "vfrczps", { XM
, EXx
}, 0 },
10044 /* VEX_W_0FXOP_09_81 */
10046 { "vfrczpd", { XM
, EXx
}, 0 },
10048 /* VEX_W_0FXOP_09_82 */
10050 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_82_W_0
) },
10052 /* VEX_W_0FXOP_09_83 */
10054 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_83_W_0
) },
10057 #include "i386-dis-evex-w.h"
10060 static const struct dis386 mod_table
[][2] = {
10063 { "leaS", { Gv
, M
}, 0 },
10068 { RM_TABLE (RM_C6_REG_7
) },
10073 { RM_TABLE (RM_C7_REG_7
) },
10077 { "{l|}call^", { indirEp
}, 0 },
10081 { "{l|}jmp^", { indirEp
}, 0 },
10084 /* MOD_0F01_REG_0 */
10085 { X86_64_TABLE (X86_64_0F01_REG_0
) },
10086 { RM_TABLE (RM_0F01_REG_0
) },
10089 /* MOD_0F01_REG_1 */
10090 { X86_64_TABLE (X86_64_0F01_REG_1
) },
10091 { RM_TABLE (RM_0F01_REG_1
) },
10094 /* MOD_0F01_REG_2 */
10095 { X86_64_TABLE (X86_64_0F01_REG_2
) },
10096 { RM_TABLE (RM_0F01_REG_2
) },
10099 /* MOD_0F01_REG_3 */
10100 { X86_64_TABLE (X86_64_0F01_REG_3
) },
10101 { RM_TABLE (RM_0F01_REG_3
) },
10104 /* MOD_0F01_REG_5 */
10105 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_0
) },
10106 { RM_TABLE (RM_0F01_REG_5_MOD_3
) },
10109 /* MOD_0F01_REG_7 */
10110 { "invlpg", { Mb
}, 0 },
10111 { RM_TABLE (RM_0F01_REG_7_MOD_3
) },
10114 /* MOD_0F12_PREFIX_0 */
10115 { "movlpX", { XM
, EXq
}, 0 },
10116 { "movhlps", { XM
, EXq
}, 0 },
10119 /* MOD_0F12_PREFIX_2 */
10120 { "movlpX", { XM
, EXq
}, 0 },
10124 { "movlpX", { EXq
, XM
}, PREFIX_OPCODE
},
10127 /* MOD_0F16_PREFIX_0 */
10128 { "movhpX", { XM
, EXq
}, 0 },
10129 { "movlhps", { XM
, EXq
}, 0 },
10132 /* MOD_0F16_PREFIX_2 */
10133 { "movhpX", { XM
, EXq
}, 0 },
10137 { "movhpX", { EXq
, XM
}, PREFIX_OPCODE
},
10140 /* MOD_0F18_REG_0 */
10141 { "prefetchnta", { Mb
}, 0 },
10144 /* MOD_0F18_REG_1 */
10145 { "prefetcht0", { Mb
}, 0 },
10148 /* MOD_0F18_REG_2 */
10149 { "prefetcht1", { Mb
}, 0 },
10152 /* MOD_0F18_REG_3 */
10153 { "prefetcht2", { Mb
}, 0 },
10156 /* MOD_0F18_REG_4 */
10157 { "nop/reserved", { Mb
}, 0 },
10160 /* MOD_0F18_REG_5 */
10161 { "nop/reserved", { Mb
}, 0 },
10164 /* MOD_0F18_REG_6 */
10165 { "nop/reserved", { Mb
}, 0 },
10168 /* MOD_0F18_REG_7 */
10169 { "nop/reserved", { Mb
}, 0 },
10172 /* MOD_0F1A_PREFIX_0 */
10173 { "bndldx", { Gbnd
, Mv_bnd
}, 0 },
10174 { "nopQ", { Ev
}, 0 },
10177 /* MOD_0F1B_PREFIX_0 */
10178 { "bndstx", { Mv_bnd
, Gbnd
}, 0 },
10179 { "nopQ", { Ev
}, 0 },
10182 /* MOD_0F1B_PREFIX_1 */
10183 { "bndmk", { Gbnd
, Mv_bnd
}, 0 },
10184 { "nopQ", { Ev
}, 0 },
10187 /* MOD_0F1C_PREFIX_0 */
10188 { REG_TABLE (REG_0F1C_P_0_MOD_0
) },
10189 { "nopQ", { Ev
}, 0 },
10192 /* MOD_0F1E_PREFIX_1 */
10193 { "nopQ", { Ev
}, 0 },
10194 { REG_TABLE (REG_0F1E_P_1_MOD_3
) },
10199 { "movL", { Rd
, Td
}, 0 },
10204 { "movL", { Td
, Rd
}, 0 },
10207 /* MOD_0F2B_PREFIX_0 */
10208 {"movntps", { Mx
, XM
}, PREFIX_OPCODE
},
10211 /* MOD_0F2B_PREFIX_1 */
10212 {"movntss", { Md
, XM
}, PREFIX_OPCODE
},
10215 /* MOD_0F2B_PREFIX_2 */
10216 {"movntpd", { Mx
, XM
}, PREFIX_OPCODE
},
10219 /* MOD_0F2B_PREFIX_3 */
10220 {"movntsd", { Mq
, XM
}, PREFIX_OPCODE
},
10225 { "movmskpX", { Gdq
, XS
}, PREFIX_OPCODE
},
10228 /* MOD_0F71_REG_2 */
10230 { "psrlw", { MS
, Ib
}, 0 },
10233 /* MOD_0F71_REG_4 */
10235 { "psraw", { MS
, Ib
}, 0 },
10238 /* MOD_0F71_REG_6 */
10240 { "psllw", { MS
, Ib
}, 0 },
10243 /* MOD_0F72_REG_2 */
10245 { "psrld", { MS
, Ib
}, 0 },
10248 /* MOD_0F72_REG_4 */
10250 { "psrad", { MS
, Ib
}, 0 },
10253 /* MOD_0F72_REG_6 */
10255 { "pslld", { MS
, Ib
}, 0 },
10258 /* MOD_0F73_REG_2 */
10260 { "psrlq", { MS
, Ib
}, 0 },
10263 /* MOD_0F73_REG_3 */
10265 { PREFIX_TABLE (PREFIX_0F73_REG_3
) },
10268 /* MOD_0F73_REG_6 */
10270 { "psllq", { MS
, Ib
}, 0 },
10273 /* MOD_0F73_REG_7 */
10275 { PREFIX_TABLE (PREFIX_0F73_REG_7
) },
10278 /* MOD_0FAE_REG_0 */
10279 { "fxsave", { FXSAVE
}, 0 },
10280 { PREFIX_TABLE (PREFIX_0FAE_REG_0_MOD_3
) },
10283 /* MOD_0FAE_REG_1 */
10284 { "fxrstor", { FXSAVE
}, 0 },
10285 { PREFIX_TABLE (PREFIX_0FAE_REG_1_MOD_3
) },
10288 /* MOD_0FAE_REG_2 */
10289 { "ldmxcsr", { Md
}, 0 },
10290 { PREFIX_TABLE (PREFIX_0FAE_REG_2_MOD_3
) },
10293 /* MOD_0FAE_REG_3 */
10294 { "stmxcsr", { Md
}, 0 },
10295 { PREFIX_TABLE (PREFIX_0FAE_REG_3_MOD_3
) },
10298 /* MOD_0FAE_REG_4 */
10299 { PREFIX_TABLE (PREFIX_0FAE_REG_4_MOD_0
) },
10300 { PREFIX_TABLE (PREFIX_0FAE_REG_4_MOD_3
) },
10303 /* MOD_0FAE_REG_5 */
10304 { PREFIX_TABLE (PREFIX_0FAE_REG_5_MOD_0
) },
10305 { PREFIX_TABLE (PREFIX_0FAE_REG_5_MOD_3
) },
10308 /* MOD_0FAE_REG_6 */
10309 { PREFIX_TABLE (PREFIX_0FAE_REG_6_MOD_0
) },
10310 { PREFIX_TABLE (PREFIX_0FAE_REG_6_MOD_3
) },
10313 /* MOD_0FAE_REG_7 */
10314 { PREFIX_TABLE (PREFIX_0FAE_REG_7_MOD_0
) },
10315 { RM_TABLE (RM_0FAE_REG_7_MOD_3
) },
10319 { "lssS", { Gv
, Mp
}, 0 },
10323 { "lfsS", { Gv
, Mp
}, 0 },
10327 { "lgsS", { Gv
, Mp
}, 0 },
10331 { PREFIX_TABLE (PREFIX_0FC3_MOD_0
) },
10334 /* MOD_0FC7_REG_3 */
10335 { "xrstors", { FXSAVE
}, 0 },
10338 /* MOD_0FC7_REG_4 */
10339 { "xsavec", { FXSAVE
}, 0 },
10342 /* MOD_0FC7_REG_5 */
10343 { "xsaves", { FXSAVE
}, 0 },
10346 /* MOD_0FC7_REG_6 */
10347 { PREFIX_TABLE (PREFIX_0FC7_REG_6_MOD_0
) },
10348 { PREFIX_TABLE (PREFIX_0FC7_REG_6_MOD_3
) }
10351 /* MOD_0FC7_REG_7 */
10352 { "vmptrst", { Mq
}, 0 },
10353 { PREFIX_TABLE (PREFIX_0FC7_REG_7_MOD_3
) }
10358 { "pmovmskb", { Gdq
, MS
}, 0 },
10361 /* MOD_0FE7_PREFIX_2 */
10362 { "movntdq", { Mx
, XM
}, 0 },
10365 /* MOD_0FF0_PREFIX_3 */
10366 { "lddqu", { XM
, M
}, 0 },
10369 /* MOD_0F382A_PREFIX_2 */
10370 { "movntdqa", { XM
, Mx
}, 0 },
10373 /* MOD_0F38F5_PREFIX_2 */
10374 { "wrussK", { M
, Gdq
}, PREFIX_OPCODE
},
10377 /* MOD_0F38F6_PREFIX_0 */
10378 { "wrssK", { M
, Gdq
}, PREFIX_OPCODE
},
10381 /* MOD_0F38F8_PREFIX_1 */
10382 { "enqcmds", { Gva
, M
}, PREFIX_OPCODE
},
10385 /* MOD_0F38F8_PREFIX_2 */
10386 { "movdir64b", { Gva
, M
}, PREFIX_OPCODE
},
10389 /* MOD_0F38F8_PREFIX_3 */
10390 { "enqcmd", { Gva
, M
}, PREFIX_OPCODE
},
10393 /* MOD_0F38F9_PREFIX_0 */
10394 { "movdiri", { Ev
, Gv
}, PREFIX_OPCODE
},
10398 { "bound{S|}", { Gv
, Ma
}, 0 },
10399 { EVEX_TABLE (EVEX_0F
) },
10403 { "lesS", { Gv
, Mp
}, 0 },
10404 { VEX_C4_TABLE (VEX_0F
) },
10408 { "ldsS", { Gv
, Mp
}, 0 },
10409 { VEX_C5_TABLE (VEX_0F
) },
10412 /* MOD_VEX_0F12_PREFIX_0 */
10413 { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_0
) },
10414 { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_1
) },
10417 /* MOD_VEX_0F12_PREFIX_2 */
10418 { VEX_LEN_TABLE (VEX_LEN_0F12_P_2_M_0
) },
10422 { VEX_LEN_TABLE (VEX_LEN_0F13_M_0
) },
10425 /* MOD_VEX_0F16_PREFIX_0 */
10426 { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_0
) },
10427 { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_1
) },
10430 /* MOD_VEX_0F16_PREFIX_2 */
10431 { VEX_LEN_TABLE (VEX_LEN_0F16_P_2_M_0
) },
10435 { VEX_LEN_TABLE (VEX_LEN_0F17_M_0
) },
10439 { "vmovntpX", { Mx
, XM
}, PREFIX_OPCODE
},
10442 /* MOD_VEX_W_0_0F41_P_0_LEN_1 */
10444 { "kandw", { MaskG
, MaskVex
, MaskR
}, 0 },
10447 /* MOD_VEX_W_1_0F41_P_0_LEN_1 */
10449 { "kandq", { MaskG
, MaskVex
, MaskR
}, 0 },
10452 /* MOD_VEX_W_0_0F41_P_2_LEN_1 */
10454 { "kandb", { MaskG
, MaskVex
, MaskR
}, 0 },
10457 /* MOD_VEX_W_1_0F41_P_2_LEN_1 */
10459 { "kandd", { MaskG
, MaskVex
, MaskR
}, 0 },
10462 /* MOD_VEX_W_0_0F42_P_0_LEN_1 */
10464 { "kandnw", { MaskG
, MaskVex
, MaskR
}, 0 },
10467 /* MOD_VEX_W_1_0F42_P_0_LEN_1 */
10469 { "kandnq", { MaskG
, MaskVex
, MaskR
}, 0 },
10472 /* MOD_VEX_W_0_0F42_P_2_LEN_1 */
10474 { "kandnb", { MaskG
, MaskVex
, MaskR
}, 0 },
10477 /* MOD_VEX_W_1_0F42_P_2_LEN_1 */
10479 { "kandnd", { MaskG
, MaskVex
, MaskR
}, 0 },
10482 /* MOD_VEX_W_0_0F44_P_0_LEN_0 */
10484 { "knotw", { MaskG
, MaskR
}, 0 },
10487 /* MOD_VEX_W_1_0F44_P_0_LEN_0 */
10489 { "knotq", { MaskG
, MaskR
}, 0 },
10492 /* MOD_VEX_W_0_0F44_P_2_LEN_0 */
10494 { "knotb", { MaskG
, MaskR
}, 0 },
10497 /* MOD_VEX_W_1_0F44_P_2_LEN_0 */
10499 { "knotd", { MaskG
, MaskR
}, 0 },
10502 /* MOD_VEX_W_0_0F45_P_0_LEN_1 */
10504 { "korw", { MaskG
, MaskVex
, MaskR
}, 0 },
10507 /* MOD_VEX_W_1_0F45_P_0_LEN_1 */
10509 { "korq", { MaskG
, MaskVex
, MaskR
}, 0 },
10512 /* MOD_VEX_W_0_0F45_P_2_LEN_1 */
10514 { "korb", { MaskG
, MaskVex
, MaskR
}, 0 },
10517 /* MOD_VEX_W_1_0F45_P_2_LEN_1 */
10519 { "kord", { MaskG
, MaskVex
, MaskR
}, 0 },
10522 /* MOD_VEX_W_0_0F46_P_0_LEN_1 */
10524 { "kxnorw", { MaskG
, MaskVex
, MaskR
}, 0 },
10527 /* MOD_VEX_W_1_0F46_P_0_LEN_1 */
10529 { "kxnorq", { MaskG
, MaskVex
, MaskR
}, 0 },
10532 /* MOD_VEX_W_0_0F46_P_2_LEN_1 */
10534 { "kxnorb", { MaskG
, MaskVex
, MaskR
}, 0 },
10537 /* MOD_VEX_W_1_0F46_P_2_LEN_1 */
10539 { "kxnord", { MaskG
, MaskVex
, MaskR
}, 0 },
10542 /* MOD_VEX_W_0_0F47_P_0_LEN_1 */
10544 { "kxorw", { MaskG
, MaskVex
, MaskR
}, 0 },
10547 /* MOD_VEX_W_1_0F47_P_0_LEN_1 */
10549 { "kxorq", { MaskG
, MaskVex
, MaskR
}, 0 },
10552 /* MOD_VEX_W_0_0F47_P_2_LEN_1 */
10554 { "kxorb", { MaskG
, MaskVex
, MaskR
}, 0 },
10557 /* MOD_VEX_W_1_0F47_P_2_LEN_1 */
10559 { "kxord", { MaskG
, MaskVex
, MaskR
}, 0 },
10562 /* MOD_VEX_W_0_0F4A_P_0_LEN_1 */
10564 { "kaddw", { MaskG
, MaskVex
, MaskR
}, 0 },
10567 /* MOD_VEX_W_1_0F4A_P_0_LEN_1 */
10569 { "kaddq", { MaskG
, MaskVex
, MaskR
}, 0 },
10572 /* MOD_VEX_W_0_0F4A_P_2_LEN_1 */
10574 { "kaddb", { MaskG
, MaskVex
, MaskR
}, 0 },
10577 /* MOD_VEX_W_1_0F4A_P_2_LEN_1 */
10579 { "kaddd", { MaskG
, MaskVex
, MaskR
}, 0 },
10582 /* MOD_VEX_W_0_0F4B_P_0_LEN_1 */
10584 { "kunpckwd", { MaskG
, MaskVex
, MaskR
}, 0 },
10587 /* MOD_VEX_W_1_0F4B_P_0_LEN_1 */
10589 { "kunpckdq", { MaskG
, MaskVex
, MaskR
}, 0 },
10592 /* MOD_VEX_W_0_0F4B_P_2_LEN_1 */
10594 { "kunpckbw", { MaskG
, MaskVex
, MaskR
}, 0 },
10599 { "vmovmskpX", { Gdq
, XS
}, PREFIX_OPCODE
},
10602 /* MOD_VEX_0F71_REG_2 */
10604 { PREFIX_TABLE (PREFIX_VEX_0F71_REG_2
) },
10607 /* MOD_VEX_0F71_REG_4 */
10609 { PREFIX_TABLE (PREFIX_VEX_0F71_REG_4
) },
10612 /* MOD_VEX_0F71_REG_6 */
10614 { PREFIX_TABLE (PREFIX_VEX_0F71_REG_6
) },
10617 /* MOD_VEX_0F72_REG_2 */
10619 { PREFIX_TABLE (PREFIX_VEX_0F72_REG_2
) },
10622 /* MOD_VEX_0F72_REG_4 */
10624 { PREFIX_TABLE (PREFIX_VEX_0F72_REG_4
) },
10627 /* MOD_VEX_0F72_REG_6 */
10629 { PREFIX_TABLE (PREFIX_VEX_0F72_REG_6
) },
10632 /* MOD_VEX_0F73_REG_2 */
10634 { PREFIX_TABLE (PREFIX_VEX_0F73_REG_2
) },
10637 /* MOD_VEX_0F73_REG_3 */
10639 { PREFIX_TABLE (PREFIX_VEX_0F73_REG_3
) },
10642 /* MOD_VEX_0F73_REG_6 */
10644 { PREFIX_TABLE (PREFIX_VEX_0F73_REG_6
) },
10647 /* MOD_VEX_0F73_REG_7 */
10649 { PREFIX_TABLE (PREFIX_VEX_0F73_REG_7
) },
10652 /* MOD_VEX_W_0_0F91_P_0_LEN_0 */
10653 { "kmovw", { Ew
, MaskG
}, 0 },
10657 /* MOD_VEX_W_0_0F91_P_0_LEN_0 */
10658 { "kmovq", { Eq
, MaskG
}, 0 },
10662 /* MOD_VEX_W_0_0F91_P_2_LEN_0 */
10663 { "kmovb", { Eb
, MaskG
}, 0 },
10667 /* MOD_VEX_W_0_0F91_P_2_LEN_0 */
10668 { "kmovd", { Ed
, MaskG
}, 0 },
10672 /* MOD_VEX_W_0_0F92_P_0_LEN_0 */
10674 { "kmovw", { MaskG
, Rdq
}, 0 },
10677 /* MOD_VEX_W_0_0F92_P_2_LEN_0 */
10679 { "kmovb", { MaskG
, Rdq
}, 0 },
10682 /* MOD_VEX_0F92_P_3_LEN_0 */
10684 { "kmovK", { MaskG
, Rdq
}, 0 },
10687 /* MOD_VEX_W_0_0F93_P_0_LEN_0 */
10689 { "kmovw", { Gdq
, MaskR
}, 0 },
10692 /* MOD_VEX_W_0_0F93_P_2_LEN_0 */
10694 { "kmovb", { Gdq
, MaskR
}, 0 },
10697 /* MOD_VEX_0F93_P_3_LEN_0 */
10699 { "kmovK", { Gdq
, MaskR
}, 0 },
10702 /* MOD_VEX_W_0_0F98_P_0_LEN_0 */
10704 { "kortestw", { MaskG
, MaskR
}, 0 },
10707 /* MOD_VEX_W_1_0F98_P_0_LEN_0 */
10709 { "kortestq", { MaskG
, MaskR
}, 0 },
10712 /* MOD_VEX_W_0_0F98_P_2_LEN_0 */
10714 { "kortestb", { MaskG
, MaskR
}, 0 },
10717 /* MOD_VEX_W_1_0F98_P_2_LEN_0 */
10719 { "kortestd", { MaskG
, MaskR
}, 0 },
10722 /* MOD_VEX_W_0_0F99_P_0_LEN_0 */
10724 { "ktestw", { MaskG
, MaskR
}, 0 },
10727 /* MOD_VEX_W_1_0F99_P_0_LEN_0 */
10729 { "ktestq", { MaskG
, MaskR
}, 0 },
10732 /* MOD_VEX_W_0_0F99_P_2_LEN_0 */
10734 { "ktestb", { MaskG
, MaskR
}, 0 },
10737 /* MOD_VEX_W_1_0F99_P_2_LEN_0 */
10739 { "ktestd", { MaskG
, MaskR
}, 0 },
10742 /* MOD_VEX_0FAE_REG_2 */
10743 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_2_M_0
) },
10746 /* MOD_VEX_0FAE_REG_3 */
10747 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_3_M_0
) },
10750 /* MOD_VEX_0FD7_PREFIX_2 */
10752 { "vpmovmskb", { Gdq
, XS
}, 0 },
10755 /* MOD_VEX_0FE7_PREFIX_2 */
10756 { "vmovntdq", { Mx
, XM
}, 0 },
10759 /* MOD_VEX_0FF0_PREFIX_3 */
10760 { "vlddqu", { XM
, M
}, 0 },
10763 /* MOD_VEX_0F381A_PREFIX_2 */
10764 { VEX_LEN_TABLE (VEX_LEN_0F381A_P_2_M_0
) },
10767 /* MOD_VEX_0F382A_PREFIX_2 */
10768 { "vmovntdqa", { XM
, Mx
}, 0 },
10771 /* MOD_VEX_0F382C_PREFIX_2 */
10772 { VEX_W_TABLE (VEX_W_0F382C_P_2_M_0
) },
10775 /* MOD_VEX_0F382D_PREFIX_2 */
10776 { VEX_W_TABLE (VEX_W_0F382D_P_2_M_0
) },
10779 /* MOD_VEX_0F382E_PREFIX_2 */
10780 { VEX_W_TABLE (VEX_W_0F382E_P_2_M_0
) },
10783 /* MOD_VEX_0F382F_PREFIX_2 */
10784 { VEX_W_TABLE (VEX_W_0F382F_P_2_M_0
) },
10787 /* MOD_VEX_0F385A_PREFIX_2 */
10788 { VEX_LEN_TABLE (VEX_LEN_0F385A_P_2_M_0
) },
10791 /* MOD_VEX_0F388C_PREFIX_2 */
10792 { "vpmaskmov%LW", { XM
, Vex
, Mx
}, 0 },
10795 /* MOD_VEX_0F388E_PREFIX_2 */
10796 { "vpmaskmov%LW", { Mx
, Vex
, XM
}, 0 },
10799 /* MOD_VEX_W_0_0F3A30_P_2_LEN_0 */
10801 { "kshiftrb", { MaskG
, MaskR
, Ib
}, 0 },
10804 /* MOD_VEX_W_1_0F3A30_P_2_LEN_0 */
10806 { "kshiftrw", { MaskG
, MaskR
, Ib
}, 0 },
10809 /* MOD_VEX_W_0_0F3A31_P_2_LEN_0 */
10811 { "kshiftrd", { MaskG
, MaskR
, Ib
}, 0 },
10814 /* MOD_VEX_W_1_0F3A31_P_2_LEN_0 */
10816 { "kshiftrq", { MaskG
, MaskR
, Ib
}, 0 },
10819 /* MOD_VEX_W_0_0F3A32_P_2_LEN_0 */
10821 { "kshiftlb", { MaskG
, MaskR
, Ib
}, 0 },
10824 /* MOD_VEX_W_1_0F3A32_P_2_LEN_0 */
10826 { "kshiftlw", { MaskG
, MaskR
, Ib
}, 0 },
10829 /* MOD_VEX_W_0_0F3A33_P_2_LEN_0 */
10831 { "kshiftld", { MaskG
, MaskR
, Ib
}, 0 },
10834 /* MOD_VEX_W_1_0F3A33_P_2_LEN_0 */
10836 { "kshiftlq", { MaskG
, MaskR
, Ib
}, 0 },
10839 #include "i386-dis-evex-mod.h"
10842 static const struct dis386 rm_table
[][8] = {
10845 { "xabort", { Skip_MODRM
, Ib
}, 0 },
10849 { "xbeginT", { Skip_MODRM
, Jdqw
}, 0 },
10852 /* RM_0F01_REG_0 */
10853 { "enclv", { Skip_MODRM
}, 0 },
10854 { "vmcall", { Skip_MODRM
}, 0 },
10855 { "vmlaunch", { Skip_MODRM
}, 0 },
10856 { "vmresume", { Skip_MODRM
}, 0 },
10857 { "vmxoff", { Skip_MODRM
}, 0 },
10858 { "pconfig", { Skip_MODRM
}, 0 },
10861 /* RM_0F01_REG_1 */
10862 { "monitor", { { OP_Monitor
, 0 } }, 0 },
10863 { "mwait", { { OP_Mwait
, 0 } }, 0 },
10864 { "clac", { Skip_MODRM
}, 0 },
10865 { "stac", { Skip_MODRM
}, 0 },
10869 { "encls", { Skip_MODRM
}, 0 },
10872 /* RM_0F01_REG_2 */
10873 { "xgetbv", { Skip_MODRM
}, 0 },
10874 { "xsetbv", { Skip_MODRM
}, 0 },
10877 { "vmfunc", { Skip_MODRM
}, 0 },
10878 { "xend", { Skip_MODRM
}, 0 },
10879 { "xtest", { Skip_MODRM
}, 0 },
10880 { "enclu", { Skip_MODRM
}, 0 },
10883 /* RM_0F01_REG_3 */
10884 { "vmrun", { Skip_MODRM
}, 0 },
10885 { PREFIX_TABLE (PREFIX_0F01_REG_3_RM_1
) },
10886 { "vmload", { Skip_MODRM
}, 0 },
10887 { "vmsave", { Skip_MODRM
}, 0 },
10888 { "stgi", { Skip_MODRM
}, 0 },
10889 { "clgi", { Skip_MODRM
}, 0 },
10890 { "skinit", { Skip_MODRM
}, 0 },
10891 { "invlpga", { Skip_MODRM
}, 0 },
10894 /* RM_0F01_REG_5_MOD_3 */
10895 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_0
) },
10896 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_1
) },
10897 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_2
) },
10901 { "rdpkru", { Skip_MODRM
}, 0 },
10902 { "wrpkru", { Skip_MODRM
}, 0 },
10905 /* RM_0F01_REG_7_MOD_3 */
10906 { "swapgs", { Skip_MODRM
}, 0 },
10907 { "rdtscp", { Skip_MODRM
}, 0 },
10908 { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_2
) },
10909 { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_3
) },
10910 { "clzero", { Skip_MODRM
}, 0 },
10911 { "rdpru", { Skip_MODRM
}, 0 },
10914 /* RM_0F1E_P_1_MOD_3_REG_7 */
10915 { "nopQ", { Ev
}, 0 },
10916 { "nopQ", { Ev
}, 0 },
10917 { "endbr64", { Skip_MODRM
}, PREFIX_OPCODE
},
10918 { "endbr32", { Skip_MODRM
}, PREFIX_OPCODE
},
10919 { "nopQ", { Ev
}, 0 },
10920 { "nopQ", { Ev
}, 0 },
10921 { "nopQ", { Ev
}, 0 },
10922 { "nopQ", { Ev
}, 0 },
10925 /* RM_0FAE_REG_6_MOD_3 */
10926 { "mfence", { Skip_MODRM
}, 0 },
10929 /* RM_0FAE_REG_7_MOD_3 */
10930 { "sfence", { Skip_MODRM
}, 0 },
10935 #define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
10937 /* We use the high bit to indicate different name for the same
10939 #define REP_PREFIX (0xf3 | 0x100)
10940 #define XACQUIRE_PREFIX (0xf2 | 0x200)
10941 #define XRELEASE_PREFIX (0xf3 | 0x400)
10942 #define BND_PREFIX (0xf2 | 0x400)
10943 #define NOTRACK_PREFIX (0x3e | 0x100)
10945 /* Remember if the current op is a jump instruction. */
10946 static bfd_boolean op_is_jump
= FALSE
;
10951 int newrex
, i
, length
;
10956 last_lock_prefix
= -1;
10957 last_repz_prefix
= -1;
10958 last_repnz_prefix
= -1;
10959 last_data_prefix
= -1;
10960 last_addr_prefix
= -1;
10961 last_rex_prefix
= -1;
10962 last_seg_prefix
= -1;
10964 active_seg_prefix
= 0;
10965 for (i
= 0; i
< (int) ARRAY_SIZE (all_prefixes
); i
++)
10966 all_prefixes
[i
] = 0;
10969 /* The maximum instruction length is 15bytes. */
10970 while (length
< MAX_CODE_LENGTH
- 1)
10972 FETCH_DATA (the_info
, codep
+ 1);
10976 /* REX prefixes family. */
10993 if (address_mode
== mode_64bit
)
10997 last_rex_prefix
= i
;
11000 prefixes
|= PREFIX_REPZ
;
11001 last_repz_prefix
= i
;
11004 prefixes
|= PREFIX_REPNZ
;
11005 last_repnz_prefix
= i
;
11008 prefixes
|= PREFIX_LOCK
;
11009 last_lock_prefix
= i
;
11012 prefixes
|= PREFIX_CS
;
11013 last_seg_prefix
= i
;
11014 active_seg_prefix
= PREFIX_CS
;
11017 prefixes
|= PREFIX_SS
;
11018 last_seg_prefix
= i
;
11019 active_seg_prefix
= PREFIX_SS
;
11022 prefixes
|= PREFIX_DS
;
11023 last_seg_prefix
= i
;
11024 active_seg_prefix
= PREFIX_DS
;
11027 prefixes
|= PREFIX_ES
;
11028 last_seg_prefix
= i
;
11029 active_seg_prefix
= PREFIX_ES
;
11032 prefixes
|= PREFIX_FS
;
11033 last_seg_prefix
= i
;
11034 active_seg_prefix
= PREFIX_FS
;
11037 prefixes
|= PREFIX_GS
;
11038 last_seg_prefix
= i
;
11039 active_seg_prefix
= PREFIX_GS
;
11042 prefixes
|= PREFIX_DATA
;
11043 last_data_prefix
= i
;
11046 prefixes
|= PREFIX_ADDR
;
11047 last_addr_prefix
= i
;
11050 /* fwait is really an instruction. If there are prefixes
11051 before the fwait, they belong to the fwait, *not* to the
11052 following instruction. */
11054 if (prefixes
|| rex
)
11056 prefixes
|= PREFIX_FWAIT
;
11058 /* This ensures that the previous REX prefixes are noticed
11059 as unused prefixes, as in the return case below. */
11063 prefixes
= PREFIX_FWAIT
;
11068 /* Rex is ignored when followed by another prefix. */
11074 if (*codep
!= FWAIT_OPCODE
)
11075 all_prefixes
[i
++] = *codep
;
11083 /* Return the name of the prefix byte PREF, or NULL if PREF is not a
11086 static const char *
11087 prefix_name (int pref
, int sizeflag
)
11089 static const char *rexes
[16] =
11092 "rex.B", /* 0x41 */
11093 "rex.X", /* 0x42 */
11094 "rex.XB", /* 0x43 */
11095 "rex.R", /* 0x44 */
11096 "rex.RB", /* 0x45 */
11097 "rex.RX", /* 0x46 */
11098 "rex.RXB", /* 0x47 */
11099 "rex.W", /* 0x48 */
11100 "rex.WB", /* 0x49 */
11101 "rex.WX", /* 0x4a */
11102 "rex.WXB", /* 0x4b */
11103 "rex.WR", /* 0x4c */
11104 "rex.WRB", /* 0x4d */
11105 "rex.WRX", /* 0x4e */
11106 "rex.WRXB", /* 0x4f */
11111 /* REX prefixes family. */
11128 return rexes
[pref
- 0x40];
11148 return (sizeflag
& DFLAG
) ? "data16" : "data32";
11150 if (address_mode
== mode_64bit
)
11151 return (sizeflag
& AFLAG
) ? "addr32" : "addr64";
11153 return (sizeflag
& AFLAG
) ? "addr16" : "addr32";
11158 case XACQUIRE_PREFIX
:
11160 case XRELEASE_PREFIX
:
11164 case NOTRACK_PREFIX
:
11171 static char op_out
[MAX_OPERANDS
][100];
11172 static int op_ad
, op_index
[MAX_OPERANDS
];
11173 static int two_source_ops
;
11174 static bfd_vma op_address
[MAX_OPERANDS
];
11175 static bfd_vma op_riprel
[MAX_OPERANDS
];
11176 static bfd_vma start_pc
;
11179 * On the 386's of 1988, the maximum length of an instruction is 15 bytes.
11180 * (see topic "Redundant prefixes" in the "Differences from 8086"
11181 * section of the "Virtual 8086 Mode" chapter.)
11182 * 'pc' should be the address of this instruction, it will
11183 * be used to print the target address if this is a relative jump or call
11184 * The function returns the length of this instruction in bytes.
11187 static char intel_syntax
;
11188 static char intel_mnemonic
= !SYSV386_COMPAT
;
11189 static char open_char
;
11190 static char close_char
;
11191 static char separator_char
;
11192 static char scale_char
;
11200 static enum x86_64_isa isa64
;
11202 /* Here for backwards compatibility. When gdb stops using
11203 print_insn_i386_att and print_insn_i386_intel these functions can
11204 disappear, and print_insn_i386 be merged into print_insn. */
11206 print_insn_i386_att (bfd_vma pc
, disassemble_info
*info
)
11210 return print_insn (pc
, info
);
11214 print_insn_i386_intel (bfd_vma pc
, disassemble_info
*info
)
11218 return print_insn (pc
, info
);
11222 print_insn_i386 (bfd_vma pc
, disassemble_info
*info
)
11226 return print_insn (pc
, info
);
11230 print_i386_disassembler_options (FILE *stream
)
11232 fprintf (stream
, _("\n\
11233 The following i386/x86-64 specific disassembler options are supported for use\n\
11234 with the -M switch (multiple options should be separated by commas):\n"));
11236 fprintf (stream
, _(" x86-64 Disassemble in 64bit mode\n"));
11237 fprintf (stream
, _(" i386 Disassemble in 32bit mode\n"));
11238 fprintf (stream
, _(" i8086 Disassemble in 16bit mode\n"));
11239 fprintf (stream
, _(" att Display instruction in AT&T syntax\n"));
11240 fprintf (stream
, _(" intel Display instruction in Intel syntax\n"));
11241 fprintf (stream
, _(" att-mnemonic\n"
11242 " Display instruction in AT&T mnemonic\n"));
11243 fprintf (stream
, _(" intel-mnemonic\n"
11244 " Display instruction in Intel mnemonic\n"));
11245 fprintf (stream
, _(" addr64 Assume 64bit address size\n"));
11246 fprintf (stream
, _(" addr32 Assume 32bit address size\n"));
11247 fprintf (stream
, _(" addr16 Assume 16bit address size\n"));
11248 fprintf (stream
, _(" data32 Assume 32bit data size\n"));
11249 fprintf (stream
, _(" data16 Assume 16bit data size\n"));
11250 fprintf (stream
, _(" suffix Always display instruction suffix in AT&T syntax\n"));
11251 fprintf (stream
, _(" amd64 Display instruction in AMD64 ISA\n"));
11252 fprintf (stream
, _(" intel64 Display instruction in Intel64 ISA\n"));
11256 static const struct dis386 bad_opcode
= { "(bad)", { XX
}, 0 };
11258 /* Get a pointer to struct dis386 with a valid name. */
11260 static const struct dis386
*
11261 get_valid_dis386 (const struct dis386
*dp
, disassemble_info
*info
)
11263 int vindex
, vex_table_index
;
11265 if (dp
->name
!= NULL
)
11268 switch (dp
->op
[0].bytemode
)
11270 case USE_REG_TABLE
:
11271 dp
= ®_table
[dp
->op
[1].bytemode
][modrm
.reg
];
11274 case USE_MOD_TABLE
:
11275 vindex
= modrm
.mod
== 0x3 ? 1 : 0;
11276 dp
= &mod_table
[dp
->op
[1].bytemode
][vindex
];
11280 dp
= &rm_table
[dp
->op
[1].bytemode
][modrm
.rm
];
11283 case USE_PREFIX_TABLE
:
11286 /* The prefix in VEX is implicit. */
11287 switch (vex
.prefix
)
11292 case REPE_PREFIX_OPCODE
:
11295 case DATA_PREFIX_OPCODE
:
11298 case REPNE_PREFIX_OPCODE
:
11308 int last_prefix
= -1;
11311 /* We check PREFIX_REPNZ and PREFIX_REPZ before PREFIX_DATA.
11312 When there are multiple PREFIX_REPNZ and PREFIX_REPZ, the
11314 if ((prefixes
& (PREFIX_REPZ
| PREFIX_REPNZ
)) != 0)
11316 if (last_repz_prefix
> last_repnz_prefix
)
11319 prefix
= PREFIX_REPZ
;
11320 last_prefix
= last_repz_prefix
;
11325 prefix
= PREFIX_REPNZ
;
11326 last_prefix
= last_repnz_prefix
;
11329 /* Check if prefix should be ignored. */
11330 if ((((prefix_table
[dp
->op
[1].bytemode
][vindex
].prefix_requirement
11331 & PREFIX_IGNORED
) >> PREFIX_IGNORED_SHIFT
)
11336 if (vindex
== 0 && (prefixes
& PREFIX_DATA
) != 0)
11339 prefix
= PREFIX_DATA
;
11340 last_prefix
= last_data_prefix
;
11345 used_prefixes
|= prefix
;
11346 all_prefixes
[last_prefix
] = 0;
11349 dp
= &prefix_table
[dp
->op
[1].bytemode
][vindex
];
11352 case USE_X86_64_TABLE
:
11353 vindex
= address_mode
== mode_64bit
? 1 : 0;
11354 dp
= &x86_64_table
[dp
->op
[1].bytemode
][vindex
];
11357 case USE_3BYTE_TABLE
:
11358 FETCH_DATA (info
, codep
+ 2);
11360 dp
= &three_byte_table
[dp
->op
[1].bytemode
][vindex
];
11362 modrm
.mod
= (*codep
>> 6) & 3;
11363 modrm
.reg
= (*codep
>> 3) & 7;
11364 modrm
.rm
= *codep
& 7;
11367 case USE_VEX_LEN_TABLE
:
11371 switch (vex
.length
)
11384 dp
= &vex_len_table
[dp
->op
[1].bytemode
][vindex
];
11387 case USE_EVEX_LEN_TABLE
:
11391 switch (vex
.length
)
11407 dp
= &evex_len_table
[dp
->op
[1].bytemode
][vindex
];
11410 case USE_XOP_8F_TABLE
:
11411 FETCH_DATA (info
, codep
+ 3);
11412 rex
= ~(*codep
>> 5) & 0x7;
11414 /* VEX_TABLE_INDEX is the mmmmm part of the XOP byte 1 "RCB.mmmmm". */
11415 switch ((*codep
& 0x1f))
11421 vex_table_index
= XOP_08
;
11424 vex_table_index
= XOP_09
;
11427 vex_table_index
= XOP_0A
;
11431 vex
.w
= *codep
& 0x80;
11432 if (vex
.w
&& address_mode
== mode_64bit
)
11435 vex
.register_specifier
= (~(*codep
>> 3)) & 0xf;
11436 if (address_mode
!= mode_64bit
)
11438 /* In 16/32-bit mode REX_B is silently ignored. */
11442 vex
.length
= (*codep
& 0x4) ? 256 : 128;
11443 switch ((*codep
& 0x3))
11448 vex
.prefix
= DATA_PREFIX_OPCODE
;
11451 vex
.prefix
= REPE_PREFIX_OPCODE
;
11454 vex
.prefix
= REPNE_PREFIX_OPCODE
;
11461 dp
= &xop_table
[vex_table_index
][vindex
];
11464 FETCH_DATA (info
, codep
+ 1);
11465 modrm
.mod
= (*codep
>> 6) & 3;
11466 modrm
.reg
= (*codep
>> 3) & 7;
11467 modrm
.rm
= *codep
& 7;
11469 /* No XOP encoding so far allows for a non-zero embedded prefix. Avoid
11470 having to decode the bits for every otherwise valid encoding. */
11472 return &bad_opcode
;
11475 case USE_VEX_C4_TABLE
:
11477 FETCH_DATA (info
, codep
+ 3);
11478 rex
= ~(*codep
>> 5) & 0x7;
11479 switch ((*codep
& 0x1f))
11485 vex_table_index
= VEX_0F
;
11488 vex_table_index
= VEX_0F38
;
11491 vex_table_index
= VEX_0F3A
;
11495 vex
.w
= *codep
& 0x80;
11496 if (address_mode
== mode_64bit
)
11503 /* For the 3-byte VEX prefix in 32-bit mode, the REX_B bit
11504 is ignored, other REX bits are 0 and the highest bit in
11505 VEX.vvvv is also ignored (but we mustn't clear it here). */
11508 vex
.register_specifier
= (~(*codep
>> 3)) & 0xf;
11509 vex
.length
= (*codep
& 0x4) ? 256 : 128;
11510 switch ((*codep
& 0x3))
11515 vex
.prefix
= DATA_PREFIX_OPCODE
;
11518 vex
.prefix
= REPE_PREFIX_OPCODE
;
11521 vex
.prefix
= REPNE_PREFIX_OPCODE
;
11528 dp
= &vex_table
[vex_table_index
][vindex
];
11530 /* There is no MODRM byte for VEX0F 77. */
11531 if (vex_table_index
!= VEX_0F
|| vindex
!= 0x77)
11533 FETCH_DATA (info
, codep
+ 1);
11534 modrm
.mod
= (*codep
>> 6) & 3;
11535 modrm
.reg
= (*codep
>> 3) & 7;
11536 modrm
.rm
= *codep
& 7;
11540 case USE_VEX_C5_TABLE
:
11542 FETCH_DATA (info
, codep
+ 2);
11543 rex
= (*codep
& 0x80) ? 0 : REX_R
;
11545 /* For the 2-byte VEX prefix in 32-bit mode, the highest bit in
11547 vex
.register_specifier
= (~(*codep
>> 3)) & 0xf;
11548 vex
.length
= (*codep
& 0x4) ? 256 : 128;
11549 switch ((*codep
& 0x3))
11554 vex
.prefix
= DATA_PREFIX_OPCODE
;
11557 vex
.prefix
= REPE_PREFIX_OPCODE
;
11560 vex
.prefix
= REPNE_PREFIX_OPCODE
;
11567 dp
= &vex_table
[dp
->op
[1].bytemode
][vindex
];
11569 /* There is no MODRM byte for VEX 77. */
11570 if (vindex
!= 0x77)
11572 FETCH_DATA (info
, codep
+ 1);
11573 modrm
.mod
= (*codep
>> 6) & 3;
11574 modrm
.reg
= (*codep
>> 3) & 7;
11575 modrm
.rm
= *codep
& 7;
11579 case USE_VEX_W_TABLE
:
11583 dp
= &vex_w_table
[dp
->op
[1].bytemode
][vex
.w
? 1 : 0];
11586 case USE_EVEX_TABLE
:
11587 two_source_ops
= 0;
11590 FETCH_DATA (info
, codep
+ 4);
11591 /* The first byte after 0x62. */
11592 rex
= ~(*codep
>> 5) & 0x7;
11593 vex
.r
= *codep
& 0x10;
11594 switch ((*codep
& 0xf))
11597 return &bad_opcode
;
11599 vex_table_index
= EVEX_0F
;
11602 vex_table_index
= EVEX_0F38
;
11605 vex_table_index
= EVEX_0F3A
;
11609 /* The second byte after 0x62. */
11611 vex
.w
= *codep
& 0x80;
11612 if (vex
.w
&& address_mode
== mode_64bit
)
11615 vex
.register_specifier
= (~(*codep
>> 3)) & 0xf;
11618 if (!(*codep
& 0x4))
11619 return &bad_opcode
;
11621 switch ((*codep
& 0x3))
11626 vex
.prefix
= DATA_PREFIX_OPCODE
;
11629 vex
.prefix
= REPE_PREFIX_OPCODE
;
11632 vex
.prefix
= REPNE_PREFIX_OPCODE
;
11636 /* The third byte after 0x62. */
11639 /* Remember the static rounding bits. */
11640 vex
.ll
= (*codep
>> 5) & 3;
11641 vex
.b
= (*codep
& 0x10) != 0;
11643 vex
.v
= *codep
& 0x8;
11644 vex
.mask_register_specifier
= *codep
& 0x7;
11645 vex
.zeroing
= *codep
& 0x80;
11647 if (address_mode
!= mode_64bit
)
11649 /* In 16/32-bit mode silently ignore following bits. */
11659 dp
= &evex_table
[vex_table_index
][vindex
];
11661 FETCH_DATA (info
, codep
+ 1);
11662 modrm
.mod
= (*codep
>> 6) & 3;
11663 modrm
.reg
= (*codep
>> 3) & 7;
11664 modrm
.rm
= *codep
& 7;
11666 /* Set vector length. */
11667 if (modrm
.mod
== 3 && vex
.b
)
11683 return &bad_opcode
;
11696 if (dp
->name
!= NULL
)
11699 return get_valid_dis386 (dp
, info
);
11703 get_sib (disassemble_info
*info
, int sizeflag
)
11705 /* If modrm.mod == 3, operand must be register. */
11707 && ((sizeflag
& AFLAG
) || address_mode
== mode_64bit
)
11711 FETCH_DATA (info
, codep
+ 2);
11712 sib
.index
= (codep
[1] >> 3) & 7;
11713 sib
.scale
= (codep
[1] >> 6) & 3;
11714 sib
.base
= codep
[1] & 7;
11719 print_insn (bfd_vma pc
, disassemble_info
*info
)
11721 const struct dis386
*dp
;
11723 char *op_txt
[MAX_OPERANDS
];
11725 int sizeflag
, orig_sizeflag
;
11727 struct dis_private priv
;
11730 priv
.orig_sizeflag
= AFLAG
| DFLAG
;
11731 if ((info
->mach
& bfd_mach_i386_i386
) != 0)
11732 address_mode
= mode_32bit
;
11733 else if (info
->mach
== bfd_mach_i386_i8086
)
11735 address_mode
= mode_16bit
;
11736 priv
.orig_sizeflag
= 0;
11739 address_mode
= mode_64bit
;
11741 if (intel_syntax
== (char) -1)
11742 intel_syntax
= (info
->mach
& bfd_mach_i386_intel_syntax
) != 0;
11744 for (p
= info
->disassembler_options
; p
!= NULL
; )
11746 if (CONST_STRNEQ (p
, "amd64"))
11748 else if (CONST_STRNEQ (p
, "intel64"))
11750 else if (CONST_STRNEQ (p
, "x86-64"))
11752 address_mode
= mode_64bit
;
11753 priv
.orig_sizeflag
|= AFLAG
| DFLAG
;
11755 else if (CONST_STRNEQ (p
, "i386"))
11757 address_mode
= mode_32bit
;
11758 priv
.orig_sizeflag
|= AFLAG
| DFLAG
;
11760 else if (CONST_STRNEQ (p
, "i8086"))
11762 address_mode
= mode_16bit
;
11763 priv
.orig_sizeflag
&= ~(AFLAG
| DFLAG
);
11765 else if (CONST_STRNEQ (p
, "intel"))
11768 if (CONST_STRNEQ (p
+ 5, "-mnemonic"))
11769 intel_mnemonic
= 1;
11771 else if (CONST_STRNEQ (p
, "att"))
11774 if (CONST_STRNEQ (p
+ 3, "-mnemonic"))
11775 intel_mnemonic
= 0;
11777 else if (CONST_STRNEQ (p
, "addr"))
11779 if (address_mode
== mode_64bit
)
11781 if (p
[4] == '3' && p
[5] == '2')
11782 priv
.orig_sizeflag
&= ~AFLAG
;
11783 else if (p
[4] == '6' && p
[5] == '4')
11784 priv
.orig_sizeflag
|= AFLAG
;
11788 if (p
[4] == '1' && p
[5] == '6')
11789 priv
.orig_sizeflag
&= ~AFLAG
;
11790 else if (p
[4] == '3' && p
[5] == '2')
11791 priv
.orig_sizeflag
|= AFLAG
;
11794 else if (CONST_STRNEQ (p
, "data"))
11796 if (p
[4] == '1' && p
[5] == '6')
11797 priv
.orig_sizeflag
&= ~DFLAG
;
11798 else if (p
[4] == '3' && p
[5] == '2')
11799 priv
.orig_sizeflag
|= DFLAG
;
11801 else if (CONST_STRNEQ (p
, "suffix"))
11802 priv
.orig_sizeflag
|= SUFFIX_ALWAYS
;
11804 p
= strchr (p
, ',');
11809 if (address_mode
== mode_64bit
&& sizeof (bfd_vma
) < 8)
11811 (*info
->fprintf_func
) (info
->stream
,
11812 _("64-bit address is disabled"));
11818 names64
= intel_names64
;
11819 names32
= intel_names32
;
11820 names16
= intel_names16
;
11821 names8
= intel_names8
;
11822 names8rex
= intel_names8rex
;
11823 names_seg
= intel_names_seg
;
11824 names_mm
= intel_names_mm
;
11825 names_bnd
= intel_names_bnd
;
11826 names_xmm
= intel_names_xmm
;
11827 names_ymm
= intel_names_ymm
;
11828 names_zmm
= intel_names_zmm
;
11829 index64
= intel_index64
;
11830 index32
= intel_index32
;
11831 names_mask
= intel_names_mask
;
11832 index16
= intel_index16
;
11835 separator_char
= '+';
11840 names64
= att_names64
;
11841 names32
= att_names32
;
11842 names16
= att_names16
;
11843 names8
= att_names8
;
11844 names8rex
= att_names8rex
;
11845 names_seg
= att_names_seg
;
11846 names_mm
= att_names_mm
;
11847 names_bnd
= att_names_bnd
;
11848 names_xmm
= att_names_xmm
;
11849 names_ymm
= att_names_ymm
;
11850 names_zmm
= att_names_zmm
;
11851 index64
= att_index64
;
11852 index32
= att_index32
;
11853 names_mask
= att_names_mask
;
11854 index16
= att_index16
;
11857 separator_char
= ',';
11861 /* The output looks better if we put 7 bytes on a line, since that
11862 puts most long word instructions on a single line. Use 8 bytes
11864 if ((info
->mach
& bfd_mach_l1om
) != 0)
11865 info
->bytes_per_line
= 8;
11867 info
->bytes_per_line
= 7;
11869 info
->private_data
= &priv
;
11870 priv
.max_fetched
= priv
.the_buffer
;
11871 priv
.insn_start
= pc
;
11874 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
11882 start_codep
= priv
.the_buffer
;
11883 codep
= priv
.the_buffer
;
11885 if (OPCODES_SIGSETJMP (priv
.bailout
) != 0)
11889 /* Getting here means we tried for data but didn't get it. That
11890 means we have an incomplete instruction of some sort. Just
11891 print the first byte as a prefix or a .byte pseudo-op. */
11892 if (codep
> priv
.the_buffer
)
11894 name
= prefix_name (priv
.the_buffer
[0], priv
.orig_sizeflag
);
11896 (*info
->fprintf_func
) (info
->stream
, "%s", name
);
11899 /* Just print the first byte as a .byte instruction. */
11900 (*info
->fprintf_func
) (info
->stream
, ".byte 0x%x",
11901 (unsigned int) priv
.the_buffer
[0]);
11911 sizeflag
= priv
.orig_sizeflag
;
11913 if (!ckprefix () || rex_used
)
11915 /* Too many prefixes or unused REX prefixes. */
11917 i
< (int) ARRAY_SIZE (all_prefixes
) && all_prefixes
[i
];
11919 (*info
->fprintf_func
) (info
->stream
, "%s%s",
11921 prefix_name (all_prefixes
[i
], sizeflag
));
11925 insn_codep
= codep
;
11927 FETCH_DATA (info
, codep
+ 1);
11928 two_source_ops
= (*codep
== 0x62) || (*codep
== 0xc8);
11930 if (((prefixes
& PREFIX_FWAIT
)
11931 && ((*codep
< 0xd8) || (*codep
> 0xdf))))
11933 /* Handle prefixes before fwait. */
11934 for (i
= 0; i
< fwait_prefix
&& all_prefixes
[i
];
11936 (*info
->fprintf_func
) (info
->stream
, "%s ",
11937 prefix_name (all_prefixes
[i
], sizeflag
));
11938 (*info
->fprintf_func
) (info
->stream
, "fwait");
11942 if (*codep
== 0x0f)
11944 unsigned char threebyte
;
11947 FETCH_DATA (info
, codep
+ 1);
11948 threebyte
= *codep
;
11949 dp
= &dis386_twobyte
[threebyte
];
11950 need_modrm
= twobyte_has_modrm
[*codep
];
11955 dp
= &dis386
[*codep
];
11956 need_modrm
= onebyte_has_modrm
[*codep
];
11960 /* Save sizeflag for printing the extra prefixes later before updating
11961 it for mnemonic and operand processing. The prefix names depend
11962 only on the address mode. */
11963 orig_sizeflag
= sizeflag
;
11964 if (prefixes
& PREFIX_ADDR
)
11966 if ((prefixes
& PREFIX_DATA
))
11972 FETCH_DATA (info
, codep
+ 1);
11973 modrm
.mod
= (*codep
>> 6) & 3;
11974 modrm
.reg
= (*codep
>> 3) & 7;
11975 modrm
.rm
= *codep
& 7;
11980 memset (&vex
, 0, sizeof (vex
));
11982 if (dp
->name
== NULL
&& dp
->op
[0].bytemode
== FLOATCODE
)
11984 get_sib (info
, sizeflag
);
11985 dofloat (sizeflag
);
11989 dp
= get_valid_dis386 (dp
, info
);
11990 if (dp
!= NULL
&& putop (dp
->name
, sizeflag
) == 0)
11992 get_sib (info
, sizeflag
);
11993 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
11996 op_ad
= MAX_OPERANDS
- 1 - i
;
11998 (*dp
->op
[i
].rtn
) (dp
->op
[i
].bytemode
, sizeflag
);
11999 /* For EVEX instruction after the last operand masking
12000 should be printed. */
12001 if (i
== 0 && vex
.evex
)
12003 /* Don't print {%k0}. */
12004 if (vex
.mask_register_specifier
)
12007 oappend (names_mask
[vex
.mask_register_specifier
]);
12017 /* Clear instruction information. */
12020 the_info
->insn_info_valid
= 0;
12021 the_info
->branch_delay_insns
= 0;
12022 the_info
->data_size
= 0;
12023 the_info
->insn_type
= dis_noninsn
;
12024 the_info
->target
= 0;
12025 the_info
->target2
= 0;
12028 /* Reset jump operation indicator. */
12029 op_is_jump
= FALSE
;
12032 int jump_detection
= 0;
12034 /* Extract flags. */
12035 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
12037 if ((dp
->op
[i
].rtn
== OP_J
)
12038 || (dp
->op
[i
].rtn
== OP_indirE
))
12039 jump_detection
|= 1;
12040 else if ((dp
->op
[i
].rtn
== BND_Fixup
)
12041 || (!dp
->op
[i
].rtn
&& !dp
->op
[i
].bytemode
))
12042 jump_detection
|= 2;
12043 else if ((dp
->op
[i
].bytemode
== cond_jump_mode
)
12044 || (dp
->op
[i
].bytemode
== loop_jcxz_mode
))
12045 jump_detection
|= 4;
12048 /* Determine if this is a jump or branch. */
12049 if ((jump_detection
& 0x3) == 0x3)
12052 if (jump_detection
& 0x4)
12053 the_info
->insn_type
= dis_condbranch
;
12055 the_info
->insn_type
=
12056 (dp
->name
&& !strncmp(dp
->name
, "call", 4))
12057 ? dis_jsr
: dis_branch
;
12061 /* If VEX.vvvv and EVEX.vvvv are unused, they must be all 1s, which
12062 are all 0s in inverted form. */
12063 if (need_vex
&& vex
.register_specifier
!= 0)
12065 (*info
->fprintf_func
) (info
->stream
, "(bad)");
12066 return end_codep
- priv
.the_buffer
;
12069 /* Check if the REX prefix is used. */
12070 if ((rex
^ rex_used
) == 0 && !need_vex
&& last_rex_prefix
>= 0)
12071 all_prefixes
[last_rex_prefix
] = 0;
12073 /* Check if the SEG prefix is used. */
12074 if ((prefixes
& (PREFIX_CS
| PREFIX_SS
| PREFIX_DS
| PREFIX_ES
12075 | PREFIX_FS
| PREFIX_GS
)) != 0
12076 && (used_prefixes
& active_seg_prefix
) != 0)
12077 all_prefixes
[last_seg_prefix
] = 0;
12079 /* Check if the ADDR prefix is used. */
12080 if ((prefixes
& PREFIX_ADDR
) != 0
12081 && (used_prefixes
& PREFIX_ADDR
) != 0)
12082 all_prefixes
[last_addr_prefix
] = 0;
12084 /* Check if the DATA prefix is used. */
12085 if ((prefixes
& PREFIX_DATA
) != 0
12086 && (used_prefixes
& PREFIX_DATA
) != 0
12088 all_prefixes
[last_data_prefix
] = 0;
12090 /* Print the extra prefixes. */
12092 for (i
= 0; i
< (int) ARRAY_SIZE (all_prefixes
); i
++)
12093 if (all_prefixes
[i
])
12096 name
= prefix_name (all_prefixes
[i
], orig_sizeflag
);
12099 prefix_length
+= strlen (name
) + 1;
12100 (*info
->fprintf_func
) (info
->stream
, "%s ", name
);
12103 /* If the mandatory PREFIX_REPZ/PREFIX_REPNZ/PREFIX_DATA prefix is
12104 unused, opcode is invalid. Since the PREFIX_DATA prefix may be
12105 used by putop and MMX/SSE operand and may be overriden by the
12106 PREFIX_REPZ/PREFIX_REPNZ fix, we check the PREFIX_DATA prefix
12108 if (dp
->prefix_requirement
== PREFIX_OPCODE
12110 ? vex
.prefix
== REPE_PREFIX_OPCODE
12111 || vex
.prefix
== REPNE_PREFIX_OPCODE
12113 & (PREFIX_REPZ
| PREFIX_REPNZ
)) != 0)
12115 & (PREFIX_REPZ
| PREFIX_REPNZ
)) == 0)
12117 ? vex
.prefix
== DATA_PREFIX_OPCODE
12119 & (PREFIX_REPZ
| PREFIX_REPNZ
| PREFIX_DATA
))
12121 && (used_prefixes
& PREFIX_DATA
) == 0))
12122 || (vex
.evex
&& !vex
.w
!= !(used_prefixes
& PREFIX_DATA
))))
12124 (*info
->fprintf_func
) (info
->stream
, "(bad)");
12125 return end_codep
- priv
.the_buffer
;
12128 /* Check maximum code length. */
12129 if ((codep
- start_codep
) > MAX_CODE_LENGTH
)
12131 (*info
->fprintf_func
) (info
->stream
, "(bad)");
12132 return MAX_CODE_LENGTH
;
12135 obufp
= mnemonicendp
;
12136 for (i
= strlen (obuf
) + prefix_length
; i
< 6; i
++)
12139 (*info
->fprintf_func
) (info
->stream
, "%s", obuf
);
12141 /* The enter and bound instructions are printed with operands in the same
12142 order as the intel book; everything else is printed in reverse order. */
12143 if (intel_syntax
|| two_source_ops
)
12147 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
12148 op_txt
[i
] = op_out
[i
];
12150 if (intel_syntax
&& dp
&& dp
->op
[2].rtn
== OP_Rounding
12151 && dp
->op
[3].rtn
== OP_E
&& dp
->op
[4].rtn
== NULL
)
12153 op_txt
[2] = op_out
[3];
12154 op_txt
[3] = op_out
[2];
12157 for (i
= 0; i
< (MAX_OPERANDS
>> 1); ++i
)
12159 op_ad
= op_index
[i
];
12160 op_index
[i
] = op_index
[MAX_OPERANDS
- 1 - i
];
12161 op_index
[MAX_OPERANDS
- 1 - i
] = op_ad
;
12162 riprel
= op_riprel
[i
];
12163 op_riprel
[i
] = op_riprel
[MAX_OPERANDS
- 1 - i
];
12164 op_riprel
[MAX_OPERANDS
- 1 - i
] = riprel
;
12169 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
12170 op_txt
[MAX_OPERANDS
- 1 - i
] = op_out
[i
];
12174 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
12178 (*info
->fprintf_func
) (info
->stream
, ",");
12179 if (op_index
[i
] != -1 && !op_riprel
[i
])
12181 bfd_vma target
= (bfd_vma
) op_address
[op_index
[i
]];
12183 if (the_info
&& op_is_jump
)
12185 the_info
->insn_info_valid
= 1;
12186 the_info
->branch_delay_insns
= 0;
12187 the_info
->data_size
= 0;
12188 the_info
->target
= target
;
12189 the_info
->target2
= 0;
12191 (*info
->print_address_func
) (target
, info
);
12194 (*info
->fprintf_func
) (info
->stream
, "%s", op_txt
[i
]);
12198 for (i
= 0; i
< MAX_OPERANDS
; i
++)
12199 if (op_index
[i
] != -1 && op_riprel
[i
])
12201 (*info
->fprintf_func
) (info
->stream
, " # ");
12202 (*info
->print_address_func
) ((bfd_vma
) (start_pc
+ (codep
- start_codep
)
12203 + op_address
[op_index
[i
]]), info
);
12206 return codep
- priv
.the_buffer
;
12209 static const char *float_mem
[] = {
12284 static const unsigned char float_mem_mode
[] = {
12359 #define ST { OP_ST, 0 }
12360 #define STi { OP_STi, 0 }
12362 #define FGRPd9_2 NULL, { { NULL, 1 } }, 0
12363 #define FGRPd9_4 NULL, { { NULL, 2 } }, 0
12364 #define FGRPd9_5 NULL, { { NULL, 3 } }, 0
12365 #define FGRPd9_6 NULL, { { NULL, 4 } }, 0
12366 #define FGRPd9_7 NULL, { { NULL, 5 } }, 0
12367 #define FGRPda_5 NULL, { { NULL, 6 } }, 0
12368 #define FGRPdb_4 NULL, { { NULL, 7 } }, 0
12369 #define FGRPde_3 NULL, { { NULL, 8 } }, 0
12370 #define FGRPdf_4 NULL, { { NULL, 9 } }, 0
12372 static const struct dis386 float_reg
[][8] = {
12375 { "fadd", { ST
, STi
}, 0 },
12376 { "fmul", { ST
, STi
}, 0 },
12377 { "fcom", { STi
}, 0 },
12378 { "fcomp", { STi
}, 0 },
12379 { "fsub", { ST
, STi
}, 0 },
12380 { "fsubr", { ST
, STi
}, 0 },
12381 { "fdiv", { ST
, STi
}, 0 },
12382 { "fdivr", { ST
, STi
}, 0 },
12386 { "fld", { STi
}, 0 },
12387 { "fxch", { STi
}, 0 },
12397 { "fcmovb", { ST
, STi
}, 0 },
12398 { "fcmove", { ST
, STi
}, 0 },
12399 { "fcmovbe",{ ST
, STi
}, 0 },
12400 { "fcmovu", { ST
, STi
}, 0 },
12408 { "fcmovnb",{ ST
, STi
}, 0 },
12409 { "fcmovne",{ ST
, STi
}, 0 },
12410 { "fcmovnbe",{ ST
, STi
}, 0 },
12411 { "fcmovnu",{ ST
, STi
}, 0 },
12413 { "fucomi", { ST
, STi
}, 0 },
12414 { "fcomi", { ST
, STi
}, 0 },
12419 { "fadd", { STi
, ST
}, 0 },
12420 { "fmul", { STi
, ST
}, 0 },
12423 { "fsub{!M|r}", { STi
, ST
}, 0 },
12424 { "fsub{M|}", { STi
, ST
}, 0 },
12425 { "fdiv{!M|r}", { STi
, ST
}, 0 },
12426 { "fdiv{M|}", { STi
, ST
}, 0 },
12430 { "ffree", { STi
}, 0 },
12432 { "fst", { STi
}, 0 },
12433 { "fstp", { STi
}, 0 },
12434 { "fucom", { STi
}, 0 },
12435 { "fucomp", { STi
}, 0 },
12441 { "faddp", { STi
, ST
}, 0 },
12442 { "fmulp", { STi
, ST
}, 0 },
12445 { "fsub{!M|r}p", { STi
, ST
}, 0 },
12446 { "fsub{M|}p", { STi
, ST
}, 0 },
12447 { "fdiv{!M|r}p", { STi
, ST
}, 0 },
12448 { "fdiv{M|}p", { STi
, ST
}, 0 },
12452 { "ffreep", { STi
}, 0 },
12457 { "fucomip", { ST
, STi
}, 0 },
12458 { "fcomip", { ST
, STi
}, 0 },
12463 static char *fgrps
[][8] = {
12466 "(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
12471 "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
12476 "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
12481 "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
12486 "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
12491 "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
12496 "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
12501 "fNeni(8087 only)","fNdisi(8087 only)","fNclex","fNinit",
12502 "fNsetpm(287 only)","frstpm(287 only)","(bad)","(bad)",
12507 "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
12512 "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
12517 swap_operand (void)
12519 mnemonicendp
[0] = '.';
12520 mnemonicendp
[1] = 's';
12525 OP_Skip_MODRM (int bytemode ATTRIBUTE_UNUSED
,
12526 int sizeflag ATTRIBUTE_UNUSED
)
12528 /* Skip mod/rm byte. */
12534 dofloat (int sizeflag
)
12536 const struct dis386
*dp
;
12537 unsigned char floatop
;
12539 floatop
= codep
[-1];
12541 if (modrm
.mod
!= 3)
12543 int fp_indx
= (floatop
- 0xd8) * 8 + modrm
.reg
;
12545 putop (float_mem
[fp_indx
], sizeflag
);
12548 OP_E (float_mem_mode
[fp_indx
], sizeflag
);
12551 /* Skip mod/rm byte. */
12555 dp
= &float_reg
[floatop
- 0xd8][modrm
.reg
];
12556 if (dp
->name
== NULL
)
12558 putop (fgrps
[dp
->op
[0].bytemode
][modrm
.rm
], sizeflag
);
12560 /* Instruction fnstsw is only one with strange arg. */
12561 if (floatop
== 0xdf && codep
[-1] == 0xe0)
12562 strcpy (op_out
[0], names16
[0]);
12566 putop (dp
->name
, sizeflag
);
12571 (*dp
->op
[0].rtn
) (dp
->op
[0].bytemode
, sizeflag
);
12576 (*dp
->op
[1].rtn
) (dp
->op
[1].bytemode
, sizeflag
);
12580 /* Like oappend (below), but S is a string starting with '%'.
12581 In Intel syntax, the '%' is elided. */
12583 oappend_maybe_intel (const char *s
)
12585 oappend (s
+ intel_syntax
);
12589 OP_ST (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
12591 oappend_maybe_intel ("%st");
12595 OP_STi (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
12597 sprintf (scratchbuf
, "%%st(%d)", modrm
.rm
);
12598 oappend_maybe_intel (scratchbuf
);
12601 /* Capital letters in template are macros. */
12603 putop (const char *in_template
, int sizeflag
)
12608 unsigned int l
= 0, len
= 0;
12611 for (p
= in_template
; *p
; p
++)
12615 if (l
>= sizeof (last
) || !ISUPPER (*p
))
12634 while (*++p
!= '|')
12635 if (*p
== '}' || *p
== '\0')
12641 while (*++p
!= '}')
12653 if (modrm
.mod
!= 3 || (sizeflag
& SUFFIX_ALWAYS
))
12662 if (sizeflag
& SUFFIX_ALWAYS
)
12665 else if (l
== 1 && last
[0] == 'L')
12667 if (address_mode
== mode_64bit
12668 && !(prefixes
& PREFIX_ADDR
))
12681 if (intel_syntax
&& !alt
)
12683 if ((prefixes
& PREFIX_DATA
) || (sizeflag
& SUFFIX_ALWAYS
))
12685 if (sizeflag
& DFLAG
)
12686 *obufp
++ = intel_syntax
? 'd' : 'l';
12688 *obufp
++ = intel_syntax
? 'w' : 's';
12689 used_prefixes
|= (prefixes
& PREFIX_DATA
);
12693 if (intel_syntax
|| !(sizeflag
& SUFFIX_ALWAYS
))
12696 if (modrm
.mod
== 3)
12702 if (sizeflag
& DFLAG
)
12703 *obufp
++ = intel_syntax
? 'd' : 'l';
12706 used_prefixes
|= (prefixes
& PREFIX_DATA
);
12712 case 'E': /* For jcxz/jecxz */
12713 if (address_mode
== mode_64bit
)
12715 if (sizeflag
& AFLAG
)
12721 if (sizeflag
& AFLAG
)
12723 used_prefixes
|= (prefixes
& PREFIX_ADDR
);
12728 if ((prefixes
& PREFIX_ADDR
) || (sizeflag
& SUFFIX_ALWAYS
))
12730 if (sizeflag
& AFLAG
)
12731 *obufp
++ = address_mode
== mode_64bit
? 'q' : 'l';
12733 *obufp
++ = address_mode
== mode_64bit
? 'l' : 'w';
12734 used_prefixes
|= (prefixes
& PREFIX_ADDR
);
12738 if (intel_syntax
|| (obufp
[-1] != 's' && !(sizeflag
& SUFFIX_ALWAYS
)))
12740 if ((rex
& REX_W
) || (sizeflag
& DFLAG
))
12744 if (!(rex
& REX_W
))
12745 used_prefixes
|= (prefixes
& PREFIX_DATA
);
12750 if ((prefixes
& (PREFIX_CS
| PREFIX_DS
)) == PREFIX_CS
12751 || (prefixes
& (PREFIX_CS
| PREFIX_DS
)) == PREFIX_DS
)
12753 used_prefixes
|= prefixes
& (PREFIX_CS
| PREFIX_DS
);
12756 if (prefixes
& PREFIX_DS
)
12772 if (l
!= 1 || last
[0] != 'X')
12774 if (!need_vex
|| !vex
.evex
)
12777 || ((modrm
.mod
== 3 || vex
.b
) && !(sizeflag
& SUFFIX_ALWAYS
)))
12779 switch (vex
.length
)
12797 if (address_mode
== mode_64bit
&& (sizeflag
& SUFFIX_ALWAYS
))
12802 /* Fall through. */
12810 if (sizeflag
& SUFFIX_ALWAYS
)
12814 if (intel_mnemonic
!= cond
)
12818 if ((prefixes
& PREFIX_FWAIT
) == 0)
12821 used_prefixes
|= PREFIX_FWAIT
;
12827 else if (intel_syntax
&& (sizeflag
& DFLAG
))
12831 if (!(rex
& REX_W
))
12832 used_prefixes
|= (prefixes
& PREFIX_DATA
);
12836 && address_mode
== mode_64bit
12837 && isa64
== intel64
)
12842 /* Fall through. */
12845 && address_mode
== mode_64bit
12846 && ((sizeflag
& DFLAG
) || (rex
& REX_W
)))
12851 /* Fall through. */
12859 if ((rex
& REX_W
) == 0
12860 && (prefixes
& PREFIX_DATA
))
12862 if ((sizeflag
& DFLAG
) == 0)
12864 used_prefixes
|= (prefixes
& PREFIX_DATA
);
12868 if ((prefixes
& PREFIX_DATA
)
12870 || (sizeflag
& SUFFIX_ALWAYS
))
12877 if (sizeflag
& DFLAG
)
12881 used_prefixes
|= (prefixes
& PREFIX_DATA
);
12885 else if (l
== 1 && last
[0] == 'L')
12887 if ((prefixes
& PREFIX_DATA
)
12889 || (sizeflag
& SUFFIX_ALWAYS
))
12896 if (sizeflag
& DFLAG
)
12897 *obufp
++ = intel_syntax
? 'd' : 'l';
12900 used_prefixes
|= (prefixes
& PREFIX_DATA
);
12910 if (address_mode
== mode_64bit
12911 && ((sizeflag
& DFLAG
) || (rex
& REX_W
)))
12913 if (modrm
.mod
!= 3 || (sizeflag
& SUFFIX_ALWAYS
))
12917 /* Fall through. */
12923 if (intel_syntax
&& !alt
)
12926 if (modrm
.mod
!= 3 || (sizeflag
& SUFFIX_ALWAYS
))
12932 if (sizeflag
& DFLAG
)
12933 *obufp
++ = intel_syntax
? 'd' : 'l';
12936 used_prefixes
|= (prefixes
& PREFIX_DATA
);
12940 else if (l
== 1 && last
[0] == 'L')
12942 if ((intel_syntax
&& need_modrm
)
12943 || (modrm
.mod
== 3 && !(sizeflag
& SUFFIX_ALWAYS
)))
12950 else if((address_mode
== mode_64bit
&& need_modrm
)
12951 || (sizeflag
& SUFFIX_ALWAYS
))
12952 *obufp
++ = intel_syntax
? 'd' : 'l';
12961 else if (sizeflag
& DFLAG
)
12970 if (intel_syntax
&& !p
[1]
12971 && ((rex
& REX_W
) || (sizeflag
& DFLAG
)))
12973 if (!(rex
& REX_W
))
12974 used_prefixes
|= (prefixes
& PREFIX_DATA
);
12981 if (address_mode
== mode_64bit
12982 && ((sizeflag
& DFLAG
) || (rex
& REX_W
)))
12984 if (sizeflag
& SUFFIX_ALWAYS
)
12989 else if (l
== 1 && last
[0] == 'L')
13000 /* Fall through. */
13008 if (sizeflag
& SUFFIX_ALWAYS
)
13014 if (sizeflag
& DFLAG
)
13018 used_prefixes
|= (prefixes
& PREFIX_DATA
);
13022 else if (l
== 1 && last
[0] == 'L')
13024 if (address_mode
== mode_64bit
13025 && !(prefixes
& PREFIX_ADDR
))
13041 ? vex
.prefix
== DATA_PREFIX_OPCODE
13042 : prefixes
& PREFIX_DATA
)
13045 used_prefixes
|= PREFIX_DATA
;
13051 if (l
== 1 && last
[0] == 'X')
13056 || ((modrm
.mod
== 3 || vex
.b
) && !(sizeflag
& SUFFIX_ALWAYS
)))
13058 switch (vex
.length
)
13078 /* operand size flag for cwtl, cbtw */
13087 else if (sizeflag
& DFLAG
)
13091 if (!(rex
& REX_W
))
13092 used_prefixes
|= (prefixes
& PREFIX_DATA
);
13098 if (last
[0] == 'X')
13099 *obufp
++ = vex
.w
? 'd': 's';
13100 else if (last
[0] == 'L')
13101 *obufp
++ = vex
.w
? 'q': 'd';
13102 else if (last
[0] == 'B')
13103 *obufp
++ = vex
.w
? 'w': 'b';
13113 if (isa64
== intel64
&& (rex
& REX_W
))
13119 if ((prefixes
& PREFIX_DATA
) || (sizeflag
& SUFFIX_ALWAYS
))
13121 if (sizeflag
& DFLAG
)
13125 used_prefixes
|= (prefixes
& PREFIX_DATA
);
13131 if (address_mode
== mode_64bit
13132 && (isa64
== intel64
13133 || ((sizeflag
& DFLAG
) || (rex
& REX_W
))))
13135 else if ((prefixes
& PREFIX_DATA
))
13137 if (!(sizeflag
& DFLAG
))
13139 used_prefixes
|= (prefixes
& PREFIX_DATA
);
13148 mnemonicendp
= obufp
;
13153 oappend (const char *s
)
13155 obufp
= stpcpy (obufp
, s
);
13161 /* Only print the active segment register. */
13162 if (!active_seg_prefix
)
13165 used_prefixes
|= active_seg_prefix
;
13166 switch (active_seg_prefix
)
13169 oappend_maybe_intel ("%cs:");
13172 oappend_maybe_intel ("%ds:");
13175 oappend_maybe_intel ("%ss:");
13178 oappend_maybe_intel ("%es:");
13181 oappend_maybe_intel ("%fs:");
13184 oappend_maybe_intel ("%gs:");
13192 OP_indirE (int bytemode
, int sizeflag
)
13196 OP_E (bytemode
, sizeflag
);
13200 print_operand_value (char *buf
, int hex
, bfd_vma disp
)
13202 if (address_mode
== mode_64bit
)
13210 sprintf_vma (tmp
, disp
);
13211 for (i
= 0; tmp
[i
] == '0' && tmp
[i
+ 1]; i
++);
13212 strcpy (buf
+ 2, tmp
+ i
);
13216 bfd_signed_vma v
= disp
;
13223 /* Check for possible overflow on 0x8000000000000000. */
13226 strcpy (buf
, "9223372036854775808");
13240 tmp
[28 - i
] = (v
% 10) + '0';
13244 strcpy (buf
, tmp
+ 29 - i
);
13250 sprintf (buf
, "0x%x", (unsigned int) disp
);
13252 sprintf (buf
, "%d", (int) disp
);
13256 /* Put DISP in BUF as signed hex number. */
13259 print_displacement (char *buf
, bfd_vma disp
)
13261 bfd_signed_vma val
= disp
;
13270 /* Check for possible overflow. */
13273 switch (address_mode
)
13276 strcpy (buf
+ j
, "0x8000000000000000");
13279 strcpy (buf
+ j
, "0x80000000");
13282 strcpy (buf
+ j
, "0x8000");
13292 sprintf_vma (tmp
, (bfd_vma
) val
);
13293 for (i
= 0; tmp
[i
] == '0'; i
++)
13295 if (tmp
[i
] == '\0')
13297 strcpy (buf
+ j
, tmp
+ i
);
13301 intel_operand_size (int bytemode
, int sizeflag
)
13305 && (bytemode
== x_mode
13306 || bytemode
== evex_half_bcst_xmmq_mode
))
13309 oappend ("QWORD PTR ");
13311 oappend ("DWORD PTR ");
13320 oappend ("BYTE PTR ");
13325 oappend ("WORD PTR ");
13328 if (address_mode
== mode_64bit
&& isa64
== intel64
)
13330 oappend ("QWORD PTR ");
13333 /* Fall through. */
13335 if (address_mode
== mode_64bit
&& ((sizeflag
& DFLAG
) || (rex
& REX_W
)))
13337 oappend ("QWORD PTR ");
13340 /* Fall through. */
13346 oappend ("QWORD PTR ");
13349 if ((sizeflag
& DFLAG
) || bytemode
== dq_mode
)
13350 oappend ("DWORD PTR ");
13352 oappend ("WORD PTR ");
13353 used_prefixes
|= (prefixes
& PREFIX_DATA
);
13357 if ((rex
& REX_W
) || (sizeflag
& DFLAG
))
13359 oappend ("WORD PTR ");
13360 if (!(rex
& REX_W
))
13361 used_prefixes
|= (prefixes
& PREFIX_DATA
);
13364 if (sizeflag
& DFLAG
)
13365 oappend ("QWORD PTR ");
13367 oappend ("DWORD PTR ");
13368 used_prefixes
|= (prefixes
& PREFIX_DATA
);
13371 if (!(sizeflag
& DFLAG
) && isa64
== intel64
)
13372 oappend ("WORD PTR ");
13374 oappend ("DWORD PTR ");
13375 used_prefixes
|= (prefixes
& PREFIX_DATA
);
13378 case d_scalar_swap_mode
:
13381 oappend ("DWORD PTR ");
13384 case q_scalar_swap_mode
:
13386 oappend ("QWORD PTR ");
13389 if (address_mode
== mode_64bit
)
13390 oappend ("QWORD PTR ");
13392 oappend ("DWORD PTR ");
13395 if (sizeflag
& DFLAG
)
13396 oappend ("FWORD PTR ");
13398 oappend ("DWORD PTR ");
13399 used_prefixes
|= (prefixes
& PREFIX_DATA
);
13402 oappend ("TBYTE PTR ");
13406 case evex_x_gscat_mode
:
13407 case evex_x_nobcst_mode
:
13408 case b_scalar_mode
:
13409 case w_scalar_mode
:
13412 switch (vex
.length
)
13415 oappend ("XMMWORD PTR ");
13418 oappend ("YMMWORD PTR ");
13421 oappend ("ZMMWORD PTR ");
13428 oappend ("XMMWORD PTR ");
13431 oappend ("XMMWORD PTR ");
13434 oappend ("YMMWORD PTR ");
13437 case evex_half_bcst_xmmq_mode
:
13441 switch (vex
.length
)
13444 oappend ("QWORD PTR ");
13447 oappend ("XMMWORD PTR ");
13450 oappend ("YMMWORD PTR ");
13460 switch (vex
.length
)
13465 oappend ("BYTE PTR ");
13475 switch (vex
.length
)
13480 oappend ("WORD PTR ");
13490 switch (vex
.length
)
13495 oappend ("DWORD PTR ");
13505 switch (vex
.length
)
13510 oappend ("QWORD PTR ");
13520 switch (vex
.length
)
13523 oappend ("WORD PTR ");
13526 oappend ("DWORD PTR ");
13529 oappend ("QWORD PTR ");
13539 switch (vex
.length
)
13542 oappend ("DWORD PTR ");
13545 oappend ("QWORD PTR ");
13548 oappend ("XMMWORD PTR ");
13558 switch (vex
.length
)
13561 oappend ("QWORD PTR ");
13564 oappend ("YMMWORD PTR ");
13567 oappend ("ZMMWORD PTR ");
13577 switch (vex
.length
)
13581 oappend ("XMMWORD PTR ");
13588 oappend ("OWORD PTR ");
13590 case vex_scalar_w_dq_mode
:
13595 oappend ("QWORD PTR ");
13597 oappend ("DWORD PTR ");
13599 case vex_vsib_d_w_dq_mode
:
13600 case vex_vsib_q_w_dq_mode
:
13607 oappend ("QWORD PTR ");
13609 oappend ("DWORD PTR ");
13613 switch (vex
.length
)
13616 oappend ("XMMWORD PTR ");
13619 oappend ("YMMWORD PTR ");
13622 oappend ("ZMMWORD PTR ");
13629 case vex_vsib_q_w_d_mode
:
13630 case vex_vsib_d_w_d_mode
:
13631 if (!need_vex
|| !vex
.evex
)
13634 switch (vex
.length
)
13637 oappend ("QWORD PTR ");
13640 oappend ("XMMWORD PTR ");
13643 oappend ("YMMWORD PTR ");
13651 if (!need_vex
|| vex
.length
!= 128)
13654 oappend ("DWORD PTR ");
13656 oappend ("BYTE PTR ");
13662 oappend ("QWORD PTR ");
13664 oappend ("WORD PTR ");
13674 OP_E_register (int bytemode
, int sizeflag
)
13676 int reg
= modrm
.rm
;
13677 const char **names
;
13683 if ((sizeflag
& SUFFIX_ALWAYS
)
13684 && (bytemode
== b_swap_mode
13685 || bytemode
== bnd_swap_mode
13686 || bytemode
== v_swap_mode
))
13712 names
= address_mode
== mode_64bit
? names64
: names32
;
13715 case bnd_swap_mode
:
13724 if (address_mode
== mode_64bit
&& isa64
== intel64
)
13729 /* Fall through. */
13731 if (address_mode
== mode_64bit
&& ((sizeflag
& DFLAG
) || (rex
& REX_W
)))
13737 /* Fall through. */
13749 if ((sizeflag
& DFLAG
)
13750 || (bytemode
!= v_mode
13751 && bytemode
!= v_swap_mode
))
13755 used_prefixes
|= (prefixes
& PREFIX_DATA
);
13759 if (!(sizeflag
& DFLAG
) && isa64
== intel64
)
13763 used_prefixes
|= (prefixes
& PREFIX_DATA
);
13766 names
= (address_mode
== mode_64bit
13767 ? names64
: names32
);
13768 if (!(prefixes
& PREFIX_ADDR
))
13769 names
= (address_mode
== mode_16bit
13770 ? names16
: names
);
13773 /* Remove "addr16/addr32". */
13774 all_prefixes
[last_addr_prefix
] = 0;
13775 names
= (address_mode
!= mode_32bit
13776 ? names32
: names16
);
13777 used_prefixes
|= PREFIX_ADDR
;
13787 names
= names_mask
;
13792 oappend (INTERNAL_DISASSEMBLER_ERROR
);
13795 oappend (names
[reg
]);
13799 OP_E_memory (int bytemode
, int sizeflag
)
13802 int add
= (rex
& REX_B
) ? 8 : 0;
13808 /* In EVEX, if operand doesn't allow broadcast, vex.b should be 0. */
13810 && bytemode
!= x_mode
13811 && bytemode
!= xmmq_mode
13812 && bytemode
!= evex_half_bcst_xmmq_mode
)
13828 if (address_mode
!= mode_64bit
)
13834 case vex_scalar_w_dq_mode
:
13835 case vex_vsib_d_w_dq_mode
:
13836 case vex_vsib_d_w_d_mode
:
13837 case vex_vsib_q_w_dq_mode
:
13838 case vex_vsib_q_w_d_mode
:
13839 case evex_x_gscat_mode
:
13840 shift
= vex
.w
? 3 : 2;
13843 case evex_half_bcst_xmmq_mode
:
13847 shift
= vex
.w
? 3 : 2;
13850 /* Fall through. */
13854 case evex_x_nobcst_mode
:
13856 switch (vex
.length
)
13880 case q_scalar_swap_mode
:
13887 case d_scalar_swap_mode
:
13890 case w_scalar_mode
:
13894 case b_scalar_mode
:
13901 /* Make necessary corrections to shift for modes that need it.
13902 For these modes we currently have shift 4, 5 or 6 depending on
13903 vex.length (it corresponds to xmmword, ymmword or zmmword
13904 operand). We might want to make it 3, 4 or 5 (e.g. for
13905 xmmq_mode). In case of broadcast enabled the corrections
13906 aren't needed, as element size is always 32 or 64 bits. */
13908 && (bytemode
== xmmq_mode
13909 || bytemode
== evex_half_bcst_xmmq_mode
))
13911 else if (bytemode
== xmmqd_mode
)
13913 else if (bytemode
== xmmdw_mode
)
13915 else if (bytemode
== ymmq_mode
&& vex
.length
== 128)
13923 intel_operand_size (bytemode
, sizeflag
);
13926 if ((sizeflag
& AFLAG
) || address_mode
== mode_64bit
)
13928 /* 32/64 bit address mode */
13938 int addr32flag
= !((sizeflag
& AFLAG
)
13939 || bytemode
== v_bnd_mode
13940 || bytemode
== v_bndmk_mode
13941 || bytemode
== bnd_mode
13942 || bytemode
== bnd_swap_mode
);
13943 const char **indexes64
= names64
;
13944 const char **indexes32
= names32
;
13954 vindex
= sib
.index
;
13960 case vex_vsib_d_w_dq_mode
:
13961 case vex_vsib_d_w_d_mode
:
13962 case vex_vsib_q_w_dq_mode
:
13963 case vex_vsib_q_w_d_mode
:
13973 switch (vex
.length
)
13976 indexes64
= indexes32
= names_xmm
;
13980 || bytemode
== vex_vsib_q_w_dq_mode
13981 || bytemode
== vex_vsib_q_w_d_mode
)
13982 indexes64
= indexes32
= names_ymm
;
13984 indexes64
= indexes32
= names_xmm
;
13988 || bytemode
== vex_vsib_q_w_dq_mode
13989 || bytemode
== vex_vsib_q_w_d_mode
)
13990 indexes64
= indexes32
= names_zmm
;
13992 indexes64
= indexes32
= names_ymm
;
13999 haveindex
= vindex
!= 4;
14006 rbase
= base
+ add
;
14014 if (address_mode
== mode_64bit
&& !havesib
)
14017 if (riprel
&& bytemode
== v_bndmk_mode
)
14025 FETCH_DATA (the_info
, codep
+ 1);
14027 if ((disp
& 0x80) != 0)
14029 if (vex
.evex
&& shift
> 0)
14042 && address_mode
!= mode_16bit
)
14044 if (address_mode
== mode_64bit
)
14046 /* Display eiz instead of addr32. */
14047 needindex
= addr32flag
;
14052 /* In 32-bit mode, we need index register to tell [offset]
14053 from [eiz*1 + offset]. */
14058 havedisp
= (havebase
14060 || (havesib
&& (haveindex
|| scale
!= 0)));
14063 if (modrm
.mod
!= 0 || base
== 5)
14065 if (havedisp
|| riprel
)
14066 print_displacement (scratchbuf
, disp
);
14068 print_operand_value (scratchbuf
, 1, disp
);
14069 oappend (scratchbuf
);
14073 oappend (!addr32flag
? "(%rip)" : "(%eip)");
14077 if ((havebase
|| haveindex
|| needindex
|| needaddr32
|| riprel
)
14078 && (address_mode
!= mode_64bit
14079 || ((bytemode
!= v_bnd_mode
)
14080 && (bytemode
!= v_bndmk_mode
)
14081 && (bytemode
!= bnd_mode
)
14082 && (bytemode
!= bnd_swap_mode
))))
14083 used_prefixes
|= PREFIX_ADDR
;
14085 if (havedisp
|| (intel_syntax
&& riprel
))
14087 *obufp
++ = open_char
;
14088 if (intel_syntax
&& riprel
)
14091 oappend (!addr32flag
? "rip" : "eip");
14095 oappend (address_mode
== mode_64bit
&& !addr32flag
14096 ? names64
[rbase
] : names32
[rbase
]);
14099 /* ESP/RSP won't allow index. If base isn't ESP/RSP,
14100 print index to tell base + index from base. */
14104 || (havebase
&& base
!= ESP_REG_NUM
))
14106 if (!intel_syntax
|| havebase
)
14108 *obufp
++ = separator_char
;
14112 oappend (address_mode
== mode_64bit
&& !addr32flag
14113 ? indexes64
[vindex
] : indexes32
[vindex
]);
14115 oappend (address_mode
== mode_64bit
&& !addr32flag
14116 ? index64
: index32
);
14118 *obufp
++ = scale_char
;
14120 sprintf (scratchbuf
, "%d", 1 << scale
);
14121 oappend (scratchbuf
);
14125 && (disp
|| modrm
.mod
!= 0 || base
== 5))
14127 if (!havedisp
|| (bfd_signed_vma
) disp
>= 0)
14132 else if (modrm
.mod
!= 1 && disp
!= -disp
)
14136 disp
= - (bfd_signed_vma
) disp
;
14140 print_displacement (scratchbuf
, disp
);
14142 print_operand_value (scratchbuf
, 1, disp
);
14143 oappend (scratchbuf
);
14146 *obufp
++ = close_char
;
14149 else if (intel_syntax
)
14151 if (modrm
.mod
!= 0 || base
== 5)
14153 if (!active_seg_prefix
)
14155 oappend (names_seg
[ds_reg
- es_reg
]);
14158 print_operand_value (scratchbuf
, 1, disp
);
14159 oappend (scratchbuf
);
14163 else if (bytemode
== v_bnd_mode
14164 || bytemode
== v_bndmk_mode
14165 || bytemode
== bnd_mode
14166 || bytemode
== bnd_swap_mode
)
14173 /* 16 bit address mode */
14174 used_prefixes
|= prefixes
& PREFIX_ADDR
;
14181 if ((disp
& 0x8000) != 0)
14186 FETCH_DATA (the_info
, codep
+ 1);
14188 if ((disp
& 0x80) != 0)
14190 if (vex
.evex
&& shift
> 0)
14195 if ((disp
& 0x8000) != 0)
14201 if (modrm
.mod
!= 0 || modrm
.rm
== 6)
14203 print_displacement (scratchbuf
, disp
);
14204 oappend (scratchbuf
);
14207 if (modrm
.mod
!= 0 || modrm
.rm
!= 6)
14209 *obufp
++ = open_char
;
14211 oappend (index16
[modrm
.rm
]);
14213 && (disp
|| modrm
.mod
!= 0 || modrm
.rm
== 6))
14215 if ((bfd_signed_vma
) disp
>= 0)
14220 else if (modrm
.mod
!= 1)
14224 disp
= - (bfd_signed_vma
) disp
;
14227 print_displacement (scratchbuf
, disp
);
14228 oappend (scratchbuf
);
14231 *obufp
++ = close_char
;
14234 else if (intel_syntax
)
14236 if (!active_seg_prefix
)
14238 oappend (names_seg
[ds_reg
- es_reg
]);
14241 print_operand_value (scratchbuf
, 1, disp
& 0xffff);
14242 oappend (scratchbuf
);
14245 if (vex
.evex
&& vex
.b
14246 && (bytemode
== x_mode
14247 || bytemode
== xmmq_mode
14248 || bytemode
== evex_half_bcst_xmmq_mode
))
14251 || bytemode
== xmmq_mode
14252 || bytemode
== evex_half_bcst_xmmq_mode
)
14254 switch (vex
.length
)
14257 oappend ("{1to2}");
14260 oappend ("{1to4}");
14263 oappend ("{1to8}");
14271 switch (vex
.length
)
14274 oappend ("{1to4}");
14277 oappend ("{1to8}");
14280 oappend ("{1to16}");
14290 OP_E (int bytemode
, int sizeflag
)
14292 /* Skip mod/rm byte. */
14296 if (modrm
.mod
== 3)
14297 OP_E_register (bytemode
, sizeflag
);
14299 OP_E_memory (bytemode
, sizeflag
);
14303 OP_G (int bytemode
, int sizeflag
)
14306 const char **names
;
14315 oappend (names8rex
[modrm
.reg
+ add
]);
14317 oappend (names8
[modrm
.reg
+ add
]);
14320 oappend (names16
[modrm
.reg
+ add
]);
14325 oappend (names32
[modrm
.reg
+ add
]);
14328 oappend (names64
[modrm
.reg
+ add
]);
14331 if (modrm
.reg
> 0x3)
14336 oappend (names_bnd
[modrm
.reg
]);
14346 oappend (names64
[modrm
.reg
+ add
]);
14349 if ((sizeflag
& DFLAG
)
14350 || (bytemode
!= v_mode
&& bytemode
!= movsxd_mode
))
14351 oappend (names32
[modrm
.reg
+ add
]);
14353 oappend (names16
[modrm
.reg
+ add
]);
14354 used_prefixes
|= (prefixes
& PREFIX_DATA
);
14358 names
= (address_mode
== mode_64bit
14359 ? names64
: names32
);
14360 if (!(prefixes
& PREFIX_ADDR
))
14362 if (address_mode
== mode_16bit
)
14367 /* Remove "addr16/addr32". */
14368 all_prefixes
[last_addr_prefix
] = 0;
14369 names
= (address_mode
!= mode_32bit
14370 ? names32
: names16
);
14371 used_prefixes
|= PREFIX_ADDR
;
14373 oappend (names
[modrm
.reg
+ add
]);
14376 if (address_mode
== mode_64bit
)
14377 oappend (names64
[modrm
.reg
+ add
]);
14379 oappend (names32
[modrm
.reg
+ add
]);
14383 if ((modrm
.reg
+ add
) > 0x7)
14388 oappend (names_mask
[modrm
.reg
+ add
]);
14391 oappend (INTERNAL_DISASSEMBLER_ERROR
);
14404 FETCH_DATA (the_info
, codep
+ 8);
14405 a
= *codep
++ & 0xff;
14406 a
|= (*codep
++ & 0xff) << 8;
14407 a
|= (*codep
++ & 0xff) << 16;
14408 a
|= (*codep
++ & 0xffu
) << 24;
14409 b
= *codep
++ & 0xff;
14410 b
|= (*codep
++ & 0xff) << 8;
14411 b
|= (*codep
++ & 0xff) << 16;
14412 b
|= (*codep
++ & 0xffu
) << 24;
14413 x
= a
+ ((bfd_vma
) b
<< 32);
14421 static bfd_signed_vma
14424 bfd_signed_vma x
= 0;
14426 FETCH_DATA (the_info
, codep
+ 4);
14427 x
= *codep
++ & (bfd_signed_vma
) 0xff;
14428 x
|= (*codep
++ & (bfd_signed_vma
) 0xff) << 8;
14429 x
|= (*codep
++ & (bfd_signed_vma
) 0xff) << 16;
14430 x
|= (*codep
++ & (bfd_signed_vma
) 0xff) << 24;
14434 static bfd_signed_vma
14437 bfd_signed_vma x
= 0;
14439 FETCH_DATA (the_info
, codep
+ 4);
14440 x
= *codep
++ & (bfd_signed_vma
) 0xff;
14441 x
|= (*codep
++ & (bfd_signed_vma
) 0xff) << 8;
14442 x
|= (*codep
++ & (bfd_signed_vma
) 0xff) << 16;
14443 x
|= (*codep
++ & (bfd_signed_vma
) 0xff) << 24;
14445 x
= (x
^ ((bfd_signed_vma
) 1 << 31)) - ((bfd_signed_vma
) 1 << 31);
14455 FETCH_DATA (the_info
, codep
+ 2);
14456 x
= *codep
++ & 0xff;
14457 x
|= (*codep
++ & 0xff) << 8;
14462 set_op (bfd_vma op
, int riprel
)
14464 op_index
[op_ad
] = op_ad
;
14465 if (address_mode
== mode_64bit
)
14467 op_address
[op_ad
] = op
;
14468 op_riprel
[op_ad
] = riprel
;
14472 /* Mask to get a 32-bit address. */
14473 op_address
[op_ad
] = op
& 0xffffffff;
14474 op_riprel
[op_ad
] = riprel
& 0xffffffff;
14479 OP_REG (int code
, int sizeflag
)
14486 case es_reg
: case ss_reg
: case cs_reg
:
14487 case ds_reg
: case fs_reg
: case gs_reg
:
14488 oappend (names_seg
[code
- es_reg
]);
14500 case ax_reg
: case cx_reg
: case dx_reg
: case bx_reg
:
14501 case sp_reg
: case bp_reg
: case si_reg
: case di_reg
:
14502 s
= names16
[code
- ax_reg
+ add
];
14504 case al_reg
: case ah_reg
: case cl_reg
: case ch_reg
:
14505 case dl_reg
: case dh_reg
: case bl_reg
: case bh_reg
:
14508 s
= names8rex
[code
- al_reg
+ add
];
14510 s
= names8
[code
- al_reg
];
14512 case rAX_reg
: case rCX_reg
: case rDX_reg
: case rBX_reg
:
14513 case rSP_reg
: case rBP_reg
: case rSI_reg
: case rDI_reg
:
14514 if (address_mode
== mode_64bit
14515 && ((sizeflag
& DFLAG
) || (rex
& REX_W
)))
14517 s
= names64
[code
- rAX_reg
+ add
];
14520 code
+= eAX_reg
- rAX_reg
;
14521 /* Fall through. */
14522 case eAX_reg
: case eCX_reg
: case eDX_reg
: case eBX_reg
:
14523 case eSP_reg
: case eBP_reg
: case eSI_reg
: case eDI_reg
:
14526 s
= names64
[code
- eAX_reg
+ add
];
14529 if (sizeflag
& DFLAG
)
14530 s
= names32
[code
- eAX_reg
+ add
];
14532 s
= names16
[code
- eAX_reg
+ add
];
14533 used_prefixes
|= (prefixes
& PREFIX_DATA
);
14537 s
= INTERNAL_DISASSEMBLER_ERROR
;
14544 OP_IMREG (int code
, int sizeflag
)
14556 case ax_reg
: case cx_reg
: case dx_reg
: case bx_reg
:
14557 case sp_reg
: case bp_reg
: case si_reg
: case di_reg
:
14558 s
= names16
[code
- ax_reg
];
14560 case es_reg
: case ss_reg
: case cs_reg
:
14561 case ds_reg
: case fs_reg
: case gs_reg
:
14562 s
= names_seg
[code
- es_reg
];
14564 case al_reg
: case ah_reg
: case cl_reg
: case ch_reg
:
14565 case dl_reg
: case dh_reg
: case bl_reg
: case bh_reg
:
14568 s
= names8rex
[code
- al_reg
];
14570 s
= names8
[code
- al_reg
];
14572 case eAX_reg
: case eCX_reg
: case eDX_reg
: case eBX_reg
:
14573 case eSP_reg
: case eBP_reg
: case eSI_reg
: case eDI_reg
:
14576 s
= names64
[code
- eAX_reg
];
14579 if (sizeflag
& DFLAG
)
14580 s
= names32
[code
- eAX_reg
];
14582 s
= names16
[code
- eAX_reg
];
14583 used_prefixes
|= (prefixes
& PREFIX_DATA
);
14586 case z_mode_ax_reg
:
14587 if ((rex
& REX_W
) || (sizeflag
& DFLAG
))
14591 if (!(rex
& REX_W
))
14592 used_prefixes
|= (prefixes
& PREFIX_DATA
);
14595 s
= INTERNAL_DISASSEMBLER_ERROR
;
14602 OP_I (int bytemode
, int sizeflag
)
14605 bfd_signed_vma mask
= -1;
14610 FETCH_DATA (the_info
, codep
+ 1);
14620 if (sizeflag
& DFLAG
)
14630 used_prefixes
|= (prefixes
& PREFIX_DATA
);
14646 oappend (INTERNAL_DISASSEMBLER_ERROR
);
14651 scratchbuf
[0] = '$';
14652 print_operand_value (scratchbuf
+ 1, 1, op
);
14653 oappend_maybe_intel (scratchbuf
);
14654 scratchbuf
[0] = '\0';
14658 OP_I64 (int bytemode
, int sizeflag
)
14660 if (bytemode
!= v_mode
|| address_mode
!= mode_64bit
|| !(rex
& REX_W
))
14662 OP_I (bytemode
, sizeflag
);
14668 scratchbuf
[0] = '$';
14669 print_operand_value (scratchbuf
+ 1, 1, get64 ());
14670 oappend_maybe_intel (scratchbuf
);
14671 scratchbuf
[0] = '\0';
14675 OP_sI (int bytemode
, int sizeflag
)
14683 FETCH_DATA (the_info
, codep
+ 1);
14685 if ((op
& 0x80) != 0)
14687 if (bytemode
== b_T_mode
)
14689 if (address_mode
!= mode_64bit
14690 || !((sizeflag
& DFLAG
) || (rex
& REX_W
)))
14692 /* The operand-size prefix is overridden by a REX prefix. */
14693 if ((sizeflag
& DFLAG
) || (rex
& REX_W
))
14701 if (!(rex
& REX_W
))
14703 if (sizeflag
& DFLAG
)
14711 /* The operand-size prefix is overridden by a REX prefix. */
14712 if ((sizeflag
& DFLAG
) || (rex
& REX_W
))
14718 oappend (INTERNAL_DISASSEMBLER_ERROR
);
14722 scratchbuf
[0] = '$';
14723 print_operand_value (scratchbuf
+ 1, 1, op
);
14724 oappend_maybe_intel (scratchbuf
);
14728 OP_J (int bytemode
, int sizeflag
)
14732 bfd_vma segment
= 0;
14737 FETCH_DATA (the_info
, codep
+ 1);
14739 if ((disp
& 0x80) != 0)
14743 if (isa64
!= intel64
)
14746 if ((sizeflag
& DFLAG
)
14747 || (address_mode
== mode_64bit
14748 && ((isa64
== intel64
&& bytemode
!= dqw_mode
)
14749 || (rex
& REX_W
))))
14754 if ((disp
& 0x8000) != 0)
14756 /* In 16bit mode, address is wrapped around at 64k within
14757 the same segment. Otherwise, a data16 prefix on a jump
14758 instruction means that the pc is masked to 16 bits after
14759 the displacement is added! */
14761 if ((prefixes
& PREFIX_DATA
) == 0)
14762 segment
= ((start_pc
+ (codep
- start_codep
))
14763 & ~((bfd_vma
) 0xffff));
14765 if (address_mode
!= mode_64bit
14766 || (isa64
!= intel64
&& !(rex
& REX_W
)))
14767 used_prefixes
|= (prefixes
& PREFIX_DATA
);
14770 oappend (INTERNAL_DISASSEMBLER_ERROR
);
14773 disp
= ((start_pc
+ (codep
- start_codep
) + disp
) & mask
) | segment
;
14775 print_operand_value (scratchbuf
, 1, disp
);
14776 oappend (scratchbuf
);
14780 OP_SEG (int bytemode
, int sizeflag
)
14782 if (bytemode
== w_mode
)
14783 oappend (names_seg
[modrm
.reg
]);
14785 OP_E (modrm
.mod
== 3 ? bytemode
: w_mode
, sizeflag
);
14789 OP_DIR (int dummy ATTRIBUTE_UNUSED
, int sizeflag
)
14793 if (sizeflag
& DFLAG
)
14803 used_prefixes
|= (prefixes
& PREFIX_DATA
);
14805 sprintf (scratchbuf
, "0x%x:0x%x", seg
, offset
);
14807 sprintf (scratchbuf
, "$0x%x,$0x%x", seg
, offset
);
14808 oappend (scratchbuf
);
14812 OP_OFF (int bytemode
, int sizeflag
)
14816 if (intel_syntax
&& (sizeflag
& SUFFIX_ALWAYS
))
14817 intel_operand_size (bytemode
, sizeflag
);
14820 if ((sizeflag
& AFLAG
) || address_mode
== mode_64bit
)
14827 if (!active_seg_prefix
)
14829 oappend (names_seg
[ds_reg
- es_reg
]);
14833 print_operand_value (scratchbuf
, 1, off
);
14834 oappend (scratchbuf
);
14838 OP_OFF64 (int bytemode
, int sizeflag
)
14842 if (address_mode
!= mode_64bit
14843 || (prefixes
& PREFIX_ADDR
))
14845 OP_OFF (bytemode
, sizeflag
);
14849 if (intel_syntax
&& (sizeflag
& SUFFIX_ALWAYS
))
14850 intel_operand_size (bytemode
, sizeflag
);
14857 if (!active_seg_prefix
)
14859 oappend (names_seg
[ds_reg
- es_reg
]);
14863 print_operand_value (scratchbuf
, 1, off
);
14864 oappend (scratchbuf
);
14868 ptr_reg (int code
, int sizeflag
)
14872 *obufp
++ = open_char
;
14873 used_prefixes
|= (prefixes
& PREFIX_ADDR
);
14874 if (address_mode
== mode_64bit
)
14876 if (!(sizeflag
& AFLAG
))
14877 s
= names32
[code
- eAX_reg
];
14879 s
= names64
[code
- eAX_reg
];
14881 else if (sizeflag
& AFLAG
)
14882 s
= names32
[code
- eAX_reg
];
14884 s
= names16
[code
- eAX_reg
];
14886 *obufp
++ = close_char
;
14891 OP_ESreg (int code
, int sizeflag
)
14897 case 0x6d: /* insw/insl */
14898 intel_operand_size (z_mode
, sizeflag
);
14900 case 0xa5: /* movsw/movsl/movsq */
14901 case 0xa7: /* cmpsw/cmpsl/cmpsq */
14902 case 0xab: /* stosw/stosl */
14903 case 0xaf: /* scasw/scasl */
14904 intel_operand_size (v_mode
, sizeflag
);
14907 intel_operand_size (b_mode
, sizeflag
);
14910 oappend_maybe_intel ("%es:");
14911 ptr_reg (code
, sizeflag
);
14915 OP_DSreg (int code
, int sizeflag
)
14921 case 0x6f: /* outsw/outsl */
14922 intel_operand_size (z_mode
, sizeflag
);
14924 case 0xa5: /* movsw/movsl/movsq */
14925 case 0xa7: /* cmpsw/cmpsl/cmpsq */
14926 case 0xad: /* lodsw/lodsl/lodsq */
14927 intel_operand_size (v_mode
, sizeflag
);
14930 intel_operand_size (b_mode
, sizeflag
);
14933 /* Set active_seg_prefix to PREFIX_DS if it is unset so that the
14934 default segment register DS is printed. */
14935 if (!active_seg_prefix
)
14936 active_seg_prefix
= PREFIX_DS
;
14938 ptr_reg (code
, sizeflag
);
14942 OP_C (int dummy ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
14950 else if (address_mode
!= mode_64bit
&& (prefixes
& PREFIX_LOCK
))
14952 all_prefixes
[last_lock_prefix
] = 0;
14953 used_prefixes
|= PREFIX_LOCK
;
14958 sprintf (scratchbuf
, "%%cr%d", modrm
.reg
+ add
);
14959 oappend_maybe_intel (scratchbuf
);
14963 OP_D (int dummy ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
14972 sprintf (scratchbuf
, "db%d", modrm
.reg
+ add
);
14974 sprintf (scratchbuf
, "%%db%d", modrm
.reg
+ add
);
14975 oappend (scratchbuf
);
14979 OP_T (int dummy ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
14981 sprintf (scratchbuf
, "%%tr%d", modrm
.reg
);
14982 oappend_maybe_intel (scratchbuf
);
14986 OP_R (int bytemode
, int sizeflag
)
14988 /* Skip mod/rm byte. */
14991 OP_E_register (bytemode
, sizeflag
);
14995 OP_MMX (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
14997 int reg
= modrm
.reg
;
14998 const char **names
;
15000 used_prefixes
|= (prefixes
& PREFIX_DATA
);
15001 if (prefixes
& PREFIX_DATA
)
15010 oappend (names
[reg
]);
15014 OP_XMM (int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
15016 int reg
= modrm
.reg
;
15017 const char **names
;
15029 && bytemode
!= xmm_mode
15030 && bytemode
!= xmmq_mode
15031 && bytemode
!= evex_half_bcst_xmmq_mode
15032 && bytemode
!= ymm_mode
15033 && bytemode
!= scalar_mode
)
15035 switch (vex
.length
)
15042 || (bytemode
!= vex_vsib_q_w_dq_mode
15043 && bytemode
!= vex_vsib_q_w_d_mode
))
15055 else if (bytemode
== xmmq_mode
15056 || bytemode
== evex_half_bcst_xmmq_mode
)
15058 switch (vex
.length
)
15071 else if (bytemode
== ymm_mode
)
15075 oappend (names
[reg
]);
15079 OP_EM (int bytemode
, int sizeflag
)
15082 const char **names
;
15084 if (modrm
.mod
!= 3)
15087 && (bytemode
== v_mode
|| bytemode
== v_swap_mode
))
15089 bytemode
= (prefixes
& PREFIX_DATA
) ? x_mode
: q_mode
;
15090 used_prefixes
|= (prefixes
& PREFIX_DATA
);
15092 OP_E (bytemode
, sizeflag
);
15096 if ((sizeflag
& SUFFIX_ALWAYS
) && bytemode
== v_swap_mode
)
15099 /* Skip mod/rm byte. */
15102 used_prefixes
|= (prefixes
& PREFIX_DATA
);
15104 if (prefixes
& PREFIX_DATA
)
15113 oappend (names
[reg
]);
15116 /* cvt* are the only instructions in sse2 which have
15117 both SSE and MMX operands and also have 0x66 prefix
15118 in their opcode. 0x66 was originally used to differentiate
15119 between SSE and MMX instruction(operands). So we have to handle the
15120 cvt* separately using OP_EMC and OP_MXC */
15122 OP_EMC (int bytemode
, int sizeflag
)
15124 if (modrm
.mod
!= 3)
15126 if (intel_syntax
&& bytemode
== v_mode
)
15128 bytemode
= (prefixes
& PREFIX_DATA
) ? x_mode
: q_mode
;
15129 used_prefixes
|= (prefixes
& PREFIX_DATA
);
15131 OP_E (bytemode
, sizeflag
);
15135 /* Skip mod/rm byte. */
15138 used_prefixes
|= (prefixes
& PREFIX_DATA
);
15139 oappend (names_mm
[modrm
.rm
]);
15143 OP_MXC (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
15145 used_prefixes
|= (prefixes
& PREFIX_DATA
);
15146 oappend (names_mm
[modrm
.reg
]);
15150 OP_EX (int bytemode
, int sizeflag
)
15153 const char **names
;
15155 /* Skip mod/rm byte. */
15159 if (modrm
.mod
!= 3)
15161 OP_E_memory (bytemode
, sizeflag
);
15176 if ((sizeflag
& SUFFIX_ALWAYS
)
15177 && (bytemode
== x_swap_mode
15178 || bytemode
== d_swap_mode
15179 || bytemode
== d_scalar_swap_mode
15180 || bytemode
== q_swap_mode
15181 || bytemode
== q_scalar_swap_mode
))
15185 && bytemode
!= xmm_mode
15186 && bytemode
!= xmmdw_mode
15187 && bytemode
!= xmmqd_mode
15188 && bytemode
!= xmm_mb_mode
15189 && bytemode
!= xmm_mw_mode
15190 && bytemode
!= xmm_md_mode
15191 && bytemode
!= xmm_mq_mode
15192 && bytemode
!= xmmq_mode
15193 && bytemode
!= evex_half_bcst_xmmq_mode
15194 && bytemode
!= ymm_mode
15195 && bytemode
!= d_scalar_swap_mode
15196 && bytemode
!= q_scalar_swap_mode
15197 && bytemode
!= vex_scalar_w_dq_mode
)
15199 switch (vex
.length
)
15214 else if (bytemode
== xmmq_mode
15215 || bytemode
== evex_half_bcst_xmmq_mode
)
15217 switch (vex
.length
)
15230 else if (bytemode
== ymm_mode
)
15234 oappend (names
[reg
]);
15238 OP_MS (int bytemode
, int sizeflag
)
15240 if (modrm
.mod
== 3)
15241 OP_EM (bytemode
, sizeflag
);
15247 OP_XS (int bytemode
, int sizeflag
)
15249 if (modrm
.mod
== 3)
15250 OP_EX (bytemode
, sizeflag
);
15256 OP_M (int bytemode
, int sizeflag
)
15258 if (modrm
.mod
== 3)
15259 /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
15262 OP_E (bytemode
, sizeflag
);
15266 OP_0f07 (int bytemode
, int sizeflag
)
15268 if (modrm
.mod
!= 3 || modrm
.rm
!= 0)
15271 OP_E (bytemode
, sizeflag
);
15274 /* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
15275 32bit mode and "xchg %rax,%rax" in 64bit mode. */
15278 NOP_Fixup1 (int bytemode
, int sizeflag
)
15280 if ((prefixes
& PREFIX_DATA
) != 0
15283 && address_mode
== mode_64bit
))
15284 OP_REG (bytemode
, sizeflag
);
15286 strcpy (obuf
, "nop");
15290 NOP_Fixup2 (int bytemode
, int sizeflag
)
15292 if ((prefixes
& PREFIX_DATA
) != 0
15295 && address_mode
== mode_64bit
))
15296 OP_IMREG (bytemode
, sizeflag
);
15299 static const char *const Suffix3DNow
[] = {
15300 /* 00 */ NULL
, NULL
, NULL
, NULL
,
15301 /* 04 */ NULL
, NULL
, NULL
, NULL
,
15302 /* 08 */ NULL
, NULL
, NULL
, NULL
,
15303 /* 0C */ "pi2fw", "pi2fd", NULL
, NULL
,
15304 /* 10 */ NULL
, NULL
, NULL
, NULL
,
15305 /* 14 */ NULL
, NULL
, NULL
, NULL
,
15306 /* 18 */ NULL
, NULL
, NULL
, NULL
,
15307 /* 1C */ "pf2iw", "pf2id", NULL
, NULL
,
15308 /* 20 */ NULL
, NULL
, NULL
, NULL
,
15309 /* 24 */ NULL
, NULL
, NULL
, NULL
,
15310 /* 28 */ NULL
, NULL
, NULL
, NULL
,
15311 /* 2C */ NULL
, NULL
, NULL
, NULL
,
15312 /* 30 */ NULL
, NULL
, NULL
, NULL
,
15313 /* 34 */ NULL
, NULL
, NULL
, NULL
,
15314 /* 38 */ NULL
, NULL
, NULL
, NULL
,
15315 /* 3C */ NULL
, NULL
, NULL
, NULL
,
15316 /* 40 */ NULL
, NULL
, NULL
, NULL
,
15317 /* 44 */ NULL
, NULL
, NULL
, NULL
,
15318 /* 48 */ NULL
, NULL
, NULL
, NULL
,
15319 /* 4C */ NULL
, NULL
, NULL
, NULL
,
15320 /* 50 */ NULL
, NULL
, NULL
, NULL
,
15321 /* 54 */ NULL
, NULL
, NULL
, NULL
,
15322 /* 58 */ NULL
, NULL
, NULL
, NULL
,
15323 /* 5C */ NULL
, NULL
, NULL
, NULL
,
15324 /* 60 */ NULL
, NULL
, NULL
, NULL
,
15325 /* 64 */ NULL
, NULL
, NULL
, NULL
,
15326 /* 68 */ NULL
, NULL
, NULL
, NULL
,
15327 /* 6C */ NULL
, NULL
, NULL
, NULL
,
15328 /* 70 */ NULL
, NULL
, NULL
, NULL
,
15329 /* 74 */ NULL
, NULL
, NULL
, NULL
,
15330 /* 78 */ NULL
, NULL
, NULL
, NULL
,
15331 /* 7C */ NULL
, NULL
, NULL
, NULL
,
15332 /* 80 */ NULL
, NULL
, NULL
, NULL
,
15333 /* 84 */ NULL
, NULL
, NULL
, NULL
,
15334 /* 88 */ NULL
, NULL
, "pfnacc", NULL
,
15335 /* 8C */ NULL
, NULL
, "pfpnacc", NULL
,
15336 /* 90 */ "pfcmpge", NULL
, NULL
, NULL
,
15337 /* 94 */ "pfmin", NULL
, "pfrcp", "pfrsqrt",
15338 /* 98 */ NULL
, NULL
, "pfsub", NULL
,
15339 /* 9C */ NULL
, NULL
, "pfadd", NULL
,
15340 /* A0 */ "pfcmpgt", NULL
, NULL
, NULL
,
15341 /* A4 */ "pfmax", NULL
, "pfrcpit1", "pfrsqit1",
15342 /* A8 */ NULL
, NULL
, "pfsubr", NULL
,
15343 /* AC */ NULL
, NULL
, "pfacc", NULL
,
15344 /* B0 */ "pfcmpeq", NULL
, NULL
, NULL
,
15345 /* B4 */ "pfmul", NULL
, "pfrcpit2", "pmulhrw",
15346 /* B8 */ NULL
, NULL
, NULL
, "pswapd",
15347 /* BC */ NULL
, NULL
, NULL
, "pavgusb",
15348 /* C0 */ NULL
, NULL
, NULL
, NULL
,
15349 /* C4 */ NULL
, NULL
, NULL
, NULL
,
15350 /* C8 */ NULL
, NULL
, NULL
, NULL
,
15351 /* CC */ NULL
, NULL
, NULL
, NULL
,
15352 /* D0 */ NULL
, NULL
, NULL
, NULL
,
15353 /* D4 */ NULL
, NULL
, NULL
, NULL
,
15354 /* D8 */ NULL
, NULL
, NULL
, NULL
,
15355 /* DC */ NULL
, NULL
, NULL
, NULL
,
15356 /* E0 */ NULL
, NULL
, NULL
, NULL
,
15357 /* E4 */ NULL
, NULL
, NULL
, NULL
,
15358 /* E8 */ NULL
, NULL
, NULL
, NULL
,
15359 /* EC */ NULL
, NULL
, NULL
, NULL
,
15360 /* F0 */ NULL
, NULL
, NULL
, NULL
,
15361 /* F4 */ NULL
, NULL
, NULL
, NULL
,
15362 /* F8 */ NULL
, NULL
, NULL
, NULL
,
15363 /* FC */ NULL
, NULL
, NULL
, NULL
,
15367 OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
15369 const char *mnemonic
;
15371 FETCH_DATA (the_info
, codep
+ 1);
15372 /* AMD 3DNow! instructions are specified by an opcode suffix in the
15373 place where an 8-bit immediate would normally go. ie. the last
15374 byte of the instruction. */
15375 obufp
= mnemonicendp
;
15376 mnemonic
= Suffix3DNow
[*codep
++ & 0xff];
15378 oappend (mnemonic
);
15381 /* Since a variable sized modrm/sib chunk is between the start
15382 of the opcode (0x0f0f) and the opcode suffix, we need to do
15383 all the modrm processing first, and don't know until now that
15384 we have a bad opcode. This necessitates some cleaning up. */
15385 op_out
[0][0] = '\0';
15386 op_out
[1][0] = '\0';
15389 mnemonicendp
= obufp
;
15392 static struct op simd_cmp_op
[] =
15394 { STRING_COMMA_LEN ("eq") },
15395 { STRING_COMMA_LEN ("lt") },
15396 { STRING_COMMA_LEN ("le") },
15397 { STRING_COMMA_LEN ("unord") },
15398 { STRING_COMMA_LEN ("neq") },
15399 { STRING_COMMA_LEN ("nlt") },
15400 { STRING_COMMA_LEN ("nle") },
15401 { STRING_COMMA_LEN ("ord") }
15405 CMP_Fixup (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
15407 unsigned int cmp_type
;
15409 FETCH_DATA (the_info
, codep
+ 1);
15410 cmp_type
= *codep
++ & 0xff;
15411 if (cmp_type
< ARRAY_SIZE (simd_cmp_op
))
15414 char *p
= mnemonicendp
- 2;
15418 sprintf (p
, "%s%s", simd_cmp_op
[cmp_type
].name
, suffix
);
15419 mnemonicendp
+= simd_cmp_op
[cmp_type
].len
;
15423 /* We have a reserved extension byte. Output it directly. */
15424 scratchbuf
[0] = '$';
15425 print_operand_value (scratchbuf
+ 1, 1, cmp_type
);
15426 oappend_maybe_intel (scratchbuf
);
15427 scratchbuf
[0] = '\0';
15432 OP_Mwait (int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
15434 /* mwait %eax,%ecx / mwaitx %eax,%ecx,%ebx */
15437 strcpy (op_out
[0], names32
[0]);
15438 strcpy (op_out
[1], names32
[1]);
15439 if (bytemode
== eBX_reg
)
15440 strcpy (op_out
[2], names32
[3]);
15441 two_source_ops
= 1;
15443 /* Skip mod/rm byte. */
15449 OP_Monitor (int bytemode ATTRIBUTE_UNUSED
,
15450 int sizeflag ATTRIBUTE_UNUSED
)
15452 /* monitor %{e,r,}ax,%ecx,%edx" */
15455 const char **names
= (address_mode
== mode_64bit
15456 ? names64
: names32
);
15458 if (prefixes
& PREFIX_ADDR
)
15460 /* Remove "addr16/addr32". */
15461 all_prefixes
[last_addr_prefix
] = 0;
15462 names
= (address_mode
!= mode_32bit
15463 ? names32
: names16
);
15464 used_prefixes
|= PREFIX_ADDR
;
15466 else if (address_mode
== mode_16bit
)
15468 strcpy (op_out
[0], names
[0]);
15469 strcpy (op_out
[1], names32
[1]);
15470 strcpy (op_out
[2], names32
[2]);
15471 two_source_ops
= 1;
15473 /* Skip mod/rm byte. */
15481 /* Throw away prefixes and 1st. opcode byte. */
15482 codep
= insn_codep
+ 1;
15487 REP_Fixup (int bytemode
, int sizeflag
)
15489 /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
15491 if (prefixes
& PREFIX_REPZ
)
15492 all_prefixes
[last_repz_prefix
] = REP_PREFIX
;
15499 OP_IMREG (bytemode
, sizeflag
);
15502 OP_ESreg (bytemode
, sizeflag
);
15505 OP_DSreg (bytemode
, sizeflag
);
15514 SEP_Fixup (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
15516 if ( isa64
!= amd64
)
15521 mnemonicendp
= obufp
;
15525 /* For BND-prefixed instructions 0xF2 prefix should be displayed as
15529 BND_Fixup (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
15531 if (prefixes
& PREFIX_REPNZ
)
15532 all_prefixes
[last_repnz_prefix
] = BND_PREFIX
;
15535 /* For NOTRACK-prefixed instructions, 0x3E prefix should be displayed as
15539 NOTRACK_Fixup (int bytemode ATTRIBUTE_UNUSED
,
15540 int sizeflag ATTRIBUTE_UNUSED
)
15542 if (active_seg_prefix
== PREFIX_DS
15543 && (address_mode
!= mode_64bit
|| last_data_prefix
< 0))
15545 /* NOTRACK prefix is only valid on indirect branch instructions.
15546 NB: DATA prefix is unsupported for Intel64. */
15547 active_seg_prefix
= 0;
15548 all_prefixes
[last_seg_prefix
] = NOTRACK_PREFIX
;
15552 /* Similar to OP_E. But the 0xf2/0xf3 prefixes should be displayed as
15553 "xacquire"/"xrelease" for memory operand if there is a LOCK prefix.
15557 HLE_Fixup1 (int bytemode
, int sizeflag
)
15560 && (prefixes
& PREFIX_LOCK
) != 0)
15562 if (prefixes
& PREFIX_REPZ
)
15563 all_prefixes
[last_repz_prefix
] = XRELEASE_PREFIX
;
15564 if (prefixes
& PREFIX_REPNZ
)
15565 all_prefixes
[last_repnz_prefix
] = XACQUIRE_PREFIX
;
15568 OP_E (bytemode
, sizeflag
);
15571 /* Similar to OP_E. But the 0xf2/0xf3 prefixes should be displayed as
15572 "xacquire"/"xrelease" for memory operand. No check for LOCK prefix.
15576 HLE_Fixup2 (int bytemode
, int sizeflag
)
15578 if (modrm
.mod
!= 3)
15580 if (prefixes
& PREFIX_REPZ
)
15581 all_prefixes
[last_repz_prefix
] = XRELEASE_PREFIX
;
15582 if (prefixes
& PREFIX_REPNZ
)
15583 all_prefixes
[last_repnz_prefix
] = XACQUIRE_PREFIX
;
15586 OP_E (bytemode
, sizeflag
);
15589 /* Similar to OP_E. But the 0xf3 prefixes should be displayed as
15590 "xrelease" for memory operand. No check for LOCK prefix. */
15593 HLE_Fixup3 (int bytemode
, int sizeflag
)
15596 && last_repz_prefix
> last_repnz_prefix
15597 && (prefixes
& PREFIX_REPZ
) != 0)
15598 all_prefixes
[last_repz_prefix
] = XRELEASE_PREFIX
;
15600 OP_E (bytemode
, sizeflag
);
15604 CMPXCHG8B_Fixup (int bytemode
, int sizeflag
)
15609 /* Change cmpxchg8b to cmpxchg16b. */
15610 char *p
= mnemonicendp
- 2;
15611 mnemonicendp
= stpcpy (p
, "16b");
15614 else if ((prefixes
& PREFIX_LOCK
) != 0)
15616 if (prefixes
& PREFIX_REPZ
)
15617 all_prefixes
[last_repz_prefix
] = XRELEASE_PREFIX
;
15618 if (prefixes
& PREFIX_REPNZ
)
15619 all_prefixes
[last_repnz_prefix
] = XACQUIRE_PREFIX
;
15622 OP_M (bytemode
, sizeflag
);
15626 XMM_Fixup (int reg
, int sizeflag ATTRIBUTE_UNUSED
)
15628 const char **names
;
15632 switch (vex
.length
)
15646 oappend (names
[reg
]);
15650 CRC32_Fixup (int bytemode
, int sizeflag
)
15652 /* Add proper suffix to "crc32". */
15653 char *p
= mnemonicendp
;
15672 if (sizeflag
& DFLAG
)
15676 used_prefixes
|= (prefixes
& PREFIX_DATA
);
15680 oappend (INTERNAL_DISASSEMBLER_ERROR
);
15687 if (modrm
.mod
== 3)
15691 /* Skip mod/rm byte. */
15696 add
= (rex
& REX_B
) ? 8 : 0;
15697 if (bytemode
== b_mode
)
15701 oappend (names8rex
[modrm
.rm
+ add
]);
15703 oappend (names8
[modrm
.rm
+ add
]);
15709 oappend (names64
[modrm
.rm
+ add
]);
15710 else if ((prefixes
& PREFIX_DATA
))
15711 oappend (names16
[modrm
.rm
+ add
]);
15713 oappend (names32
[modrm
.rm
+ add
]);
15717 OP_E (bytemode
, sizeflag
);
15721 FXSAVE_Fixup (int bytemode
, int sizeflag
)
15723 /* Add proper suffix to "fxsave" and "fxrstor". */
15727 char *p
= mnemonicendp
;
15733 OP_M (bytemode
, sizeflag
);
15737 PCMPESTR_Fixup (int bytemode
, int sizeflag
)
15739 /* Add proper suffix to "{,v}pcmpestr{i,m}". */
15742 char *p
= mnemonicendp
;
15747 else if (sizeflag
& SUFFIX_ALWAYS
)
15754 OP_EX (bytemode
, sizeflag
);
15757 /* Display the destination register operand for instructions with
15761 OP_VEX (int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
15764 const char **names
;
15772 reg
= vex
.register_specifier
;
15773 vex
.register_specifier
= 0;
15774 if (address_mode
!= mode_64bit
)
15776 else if (vex
.evex
&& !vex
.v
)
15779 if (bytemode
== vex_scalar_mode
)
15781 oappend (names_xmm
[reg
]);
15785 switch (vex
.length
)
15792 case vex_vsib_q_w_dq_mode
:
15793 case vex_vsib_q_w_d_mode
:
15809 names
= names_mask
;
15823 case vex_vsib_q_w_dq_mode
:
15824 case vex_vsib_q_w_d_mode
:
15825 names
= vex
.w
? names_ymm
: names_xmm
;
15834 names
= names_mask
;
15837 /* See PR binutils/20893 for a reproducer. */
15849 oappend (names
[reg
]);
15853 OP_Vex_2src (int bytemode
, int sizeflag
)
15855 if (modrm
.mod
== 3)
15857 int reg
= modrm
.rm
;
15861 oappend (names_xmm
[reg
]);
15866 && (bytemode
== v_mode
|| bytemode
== v_swap_mode
))
15868 bytemode
= (prefixes
& PREFIX_DATA
) ? x_mode
: q_mode
;
15869 used_prefixes
|= (prefixes
& PREFIX_DATA
);
15871 OP_E (bytemode
, sizeflag
);
15876 OP_Vex_2src_1 (int bytemode
, int sizeflag
)
15878 if (modrm
.mod
== 3)
15880 /* Skip mod/rm byte. */
15887 unsigned int reg
= vex
.register_specifier
;
15888 vex
.register_specifier
= 0;
15890 if (address_mode
!= mode_64bit
)
15892 oappend (names_xmm
[reg
]);
15895 OP_Vex_2src (bytemode
, sizeflag
);
15899 OP_Vex_2src_2 (int bytemode
, int sizeflag
)
15902 OP_Vex_2src (bytemode
, sizeflag
);
15905 unsigned int reg
= vex
.register_specifier
;
15906 vex
.register_specifier
= 0;
15908 if (address_mode
!= mode_64bit
)
15910 oappend (names_xmm
[reg
]);
15915 OP_REG_VexI4 (int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
15918 const char **names
;
15920 FETCH_DATA (the_info
, codep
+ 1);
15923 if (bytemode
!= x_mode
)
15927 if (address_mode
!= mode_64bit
)
15930 switch (vex
.length
)
15941 oappend (names
[reg
]);
15945 /* Swap 3rd and 4th operands. */
15946 strcpy (scratchbuf
, op_out
[3]);
15947 strcpy (op_out
[3], op_out
[2]);
15948 strcpy (op_out
[2], scratchbuf
);
15953 OP_VexI4 (int bytemode ATTRIBUTE_UNUSED
,
15954 int sizeflag ATTRIBUTE_UNUSED
)
15956 scratchbuf
[0] = '$';
15957 print_operand_value (scratchbuf
+ 1, 1, codep
[-1] & 0xf);
15958 oappend_maybe_intel (scratchbuf
);
15962 OP_EX_Vex (int bytemode
, int sizeflag
)
15964 if (modrm
.mod
!= 3)
15966 OP_EX (bytemode
, sizeflag
);
15970 OP_XMM_Vex (int bytemode
, int sizeflag
)
15972 if (modrm
.mod
!= 3)
15974 OP_XMM (bytemode
, sizeflag
);
15977 static struct op vex_cmp_op
[] =
15979 { STRING_COMMA_LEN ("eq") },
15980 { STRING_COMMA_LEN ("lt") },
15981 { STRING_COMMA_LEN ("le") },
15982 { STRING_COMMA_LEN ("unord") },
15983 { STRING_COMMA_LEN ("neq") },
15984 { STRING_COMMA_LEN ("nlt") },
15985 { STRING_COMMA_LEN ("nle") },
15986 { STRING_COMMA_LEN ("ord") },
15987 { STRING_COMMA_LEN ("eq_uq") },
15988 { STRING_COMMA_LEN ("nge") },
15989 { STRING_COMMA_LEN ("ngt") },
15990 { STRING_COMMA_LEN ("false") },
15991 { STRING_COMMA_LEN ("neq_oq") },
15992 { STRING_COMMA_LEN ("ge") },
15993 { STRING_COMMA_LEN ("gt") },
15994 { STRING_COMMA_LEN ("true") },
15995 { STRING_COMMA_LEN ("eq_os") },
15996 { STRING_COMMA_LEN ("lt_oq") },
15997 { STRING_COMMA_LEN ("le_oq") },
15998 { STRING_COMMA_LEN ("unord_s") },
15999 { STRING_COMMA_LEN ("neq_us") },
16000 { STRING_COMMA_LEN ("nlt_uq") },
16001 { STRING_COMMA_LEN ("nle_uq") },
16002 { STRING_COMMA_LEN ("ord_s") },
16003 { STRING_COMMA_LEN ("eq_us") },
16004 { STRING_COMMA_LEN ("nge_uq") },
16005 { STRING_COMMA_LEN ("ngt_uq") },
16006 { STRING_COMMA_LEN ("false_os") },
16007 { STRING_COMMA_LEN ("neq_os") },
16008 { STRING_COMMA_LEN ("ge_oq") },
16009 { STRING_COMMA_LEN ("gt_oq") },
16010 { STRING_COMMA_LEN ("true_us") },
16014 VCMP_Fixup (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
16016 unsigned int cmp_type
;
16018 FETCH_DATA (the_info
, codep
+ 1);
16019 cmp_type
= *codep
++ & 0xff;
16020 if (cmp_type
< ARRAY_SIZE (vex_cmp_op
))
16023 char *p
= mnemonicendp
- 2;
16027 sprintf (p
, "%s%s", vex_cmp_op
[cmp_type
].name
, suffix
);
16028 mnemonicendp
+= vex_cmp_op
[cmp_type
].len
;
16032 /* We have a reserved extension byte. Output it directly. */
16033 scratchbuf
[0] = '$';
16034 print_operand_value (scratchbuf
+ 1, 1, cmp_type
);
16035 oappend_maybe_intel (scratchbuf
);
16036 scratchbuf
[0] = '\0';
16041 VPCMP_Fixup (int bytemode ATTRIBUTE_UNUSED
,
16042 int sizeflag ATTRIBUTE_UNUSED
)
16044 unsigned int cmp_type
;
16049 FETCH_DATA (the_info
, codep
+ 1);
16050 cmp_type
= *codep
++ & 0xff;
16051 /* There are aliases for immediates 0, 1, 2, 4, 5, 6.
16052 If it's the case, print suffix, otherwise - print the immediate. */
16053 if (cmp_type
< ARRAY_SIZE (simd_cmp_op
)
16058 char *p
= mnemonicendp
- 2;
16060 /* vpcmp* can have both one- and two-lettered suffix. */
16074 sprintf (p
, "%s%s", simd_cmp_op
[cmp_type
].name
, suffix
);
16075 mnemonicendp
+= simd_cmp_op
[cmp_type
].len
;
16079 /* We have a reserved extension byte. Output it directly. */
16080 scratchbuf
[0] = '$';
16081 print_operand_value (scratchbuf
+ 1, 1, cmp_type
);
16082 oappend_maybe_intel (scratchbuf
);
16083 scratchbuf
[0] = '\0';
16087 static const struct op xop_cmp_op
[] =
16089 { STRING_COMMA_LEN ("lt") },
16090 { STRING_COMMA_LEN ("le") },
16091 { STRING_COMMA_LEN ("gt") },
16092 { STRING_COMMA_LEN ("ge") },
16093 { STRING_COMMA_LEN ("eq") },
16094 { STRING_COMMA_LEN ("neq") },
16095 { STRING_COMMA_LEN ("false") },
16096 { STRING_COMMA_LEN ("true") }
16100 VPCOM_Fixup (int bytemode ATTRIBUTE_UNUSED
,
16101 int sizeflag ATTRIBUTE_UNUSED
)
16103 unsigned int cmp_type
;
16105 FETCH_DATA (the_info
, codep
+ 1);
16106 cmp_type
= *codep
++ & 0xff;
16107 if (cmp_type
< ARRAY_SIZE (xop_cmp_op
))
16110 char *p
= mnemonicendp
- 2;
16112 /* vpcom* can have both one- and two-lettered suffix. */
16126 sprintf (p
, "%s%s", xop_cmp_op
[cmp_type
].name
, suffix
);
16127 mnemonicendp
+= xop_cmp_op
[cmp_type
].len
;
16131 /* We have a reserved extension byte. Output it directly. */
16132 scratchbuf
[0] = '$';
16133 print_operand_value (scratchbuf
+ 1, 1, cmp_type
);
16134 oappend_maybe_intel (scratchbuf
);
16135 scratchbuf
[0] = '\0';
16139 static const struct op pclmul_op
[] =
16141 { STRING_COMMA_LEN ("lql") },
16142 { STRING_COMMA_LEN ("hql") },
16143 { STRING_COMMA_LEN ("lqh") },
16144 { STRING_COMMA_LEN ("hqh") }
16148 PCLMUL_Fixup (int bytemode ATTRIBUTE_UNUSED
,
16149 int sizeflag ATTRIBUTE_UNUSED
)
16151 unsigned int pclmul_type
;
16153 FETCH_DATA (the_info
, codep
+ 1);
16154 pclmul_type
= *codep
++ & 0xff;
16155 switch (pclmul_type
)
16166 if (pclmul_type
< ARRAY_SIZE (pclmul_op
))
16169 char *p
= mnemonicendp
- 3;
16174 sprintf (p
, "%s%s", pclmul_op
[pclmul_type
].name
, suffix
);
16175 mnemonicendp
+= pclmul_op
[pclmul_type
].len
;
16179 /* We have a reserved extension byte. Output it directly. */
16180 scratchbuf
[0] = '$';
16181 print_operand_value (scratchbuf
+ 1, 1, pclmul_type
);
16182 oappend_maybe_intel (scratchbuf
);
16183 scratchbuf
[0] = '\0';
16188 MOVBE_Fixup (int bytemode
, int sizeflag
)
16190 /* Add proper suffix to "movbe". */
16191 char *p
= mnemonicendp
;
16200 if (sizeflag
& SUFFIX_ALWAYS
)
16206 if (sizeflag
& DFLAG
)
16210 used_prefixes
|= (prefixes
& PREFIX_DATA
);
16215 oappend (INTERNAL_DISASSEMBLER_ERROR
);
16222 OP_M (bytemode
, sizeflag
);
16226 MOVSXD_Fixup (int bytemode
, int sizeflag
)
16228 /* Add proper suffix to "movsxd". */
16229 char *p
= mnemonicendp
;
16254 oappend (INTERNAL_DISASSEMBLER_ERROR
);
16261 OP_E (bytemode
, sizeflag
);
16265 OP_LWPCB_E (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
16268 const char **names
;
16270 /* Skip mod/rm byte. */
16284 oappend (names
[reg
]);
16288 OP_LWP_E (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
16290 const char **names
;
16291 unsigned int reg
= vex
.register_specifier
;
16292 vex
.register_specifier
= 0;
16299 if (address_mode
!= mode_64bit
)
16301 oappend (names
[reg
]);
16305 OP_Mask (int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
16308 || (bytemode
!= mask_mode
&& bytemode
!= mask_bd_mode
))
16312 if ((rex
& REX_R
) != 0 || !vex
.r
)
16318 oappend (names_mask
[modrm
.reg
]);
16322 OP_Rounding (int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
16324 if (modrm
.mod
== 3 && vex
.b
)
16327 case evex_rounding_64_mode
:
16328 if (address_mode
!= mode_64bit
)
16333 /* Fall through. */
16334 case evex_rounding_mode
:
16335 oappend (names_rounding
[vex
.ll
]);
16337 case evex_sae_mode
: