1 /* Print i386 instructions for GDB, the GNU debugger.
2 Copyright (C) 1988-2022 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"
43 typedef struct instr_info instr_info
;
45 static void dofloat (instr_info
*, int);
46 static void OP_ST (instr_info
*, int, int);
47 static void OP_STi (instr_info
*, int, int);
48 static int putop (instr_info
*, const char *, int);
49 static void oappend_with_style (instr_info
*, const char *,
50 enum disassembler_style
);
51 static void oappend (instr_info
*, const char *);
52 static void append_seg (instr_info
*);
53 static void OP_indirE (instr_info
*, int, int);
54 static void OP_E_memory (instr_info
*, int, int);
55 static void OP_E (instr_info
*, int, int);
56 static void OP_G (instr_info
*, int, int);
57 static bfd_vma
get64 (instr_info
*);
58 static bfd_signed_vma
get32 (instr_info
*);
59 static bfd_signed_vma
get32s (instr_info
*);
60 static int get16 (instr_info
*);
61 static void set_op (instr_info
*, bfd_vma
, bool);
62 static void OP_Skip_MODRM (instr_info
*, int, int);
63 static void OP_REG (instr_info
*, int, int);
64 static void OP_IMREG (instr_info
*, int, int);
65 static void OP_I (instr_info
*, int, int);
66 static void OP_I64 (instr_info
*, int, int);
67 static void OP_sI (instr_info
*, int, int);
68 static void OP_J (instr_info
*, int, int);
69 static void OP_SEG (instr_info
*, int, int);
70 static void OP_DIR (instr_info
*, int, int);
71 static void OP_OFF (instr_info
*, int, int);
72 static void OP_OFF64 (instr_info
*, int, int);
73 static void ptr_reg (instr_info
*, int, int);
74 static void OP_ESreg (instr_info
*, int, int);
75 static void OP_DSreg (instr_info
*, int, int);
76 static void OP_C (instr_info
*, int, int);
77 static void OP_D (instr_info
*, int, int);
78 static void OP_T (instr_info
*, int, int);
79 static void OP_MMX (instr_info
*, int, int);
80 static void OP_XMM (instr_info
*, int, int);
81 static void OP_EM (instr_info
*, int, int);
82 static void OP_EX (instr_info
*, int, int);
83 static void OP_EMC (instr_info
*, int,int);
84 static void OP_MXC (instr_info
*, int,int);
85 static void OP_MS (instr_info
*, int, int);
86 static void OP_XS (instr_info
*, int, int);
87 static void OP_M (instr_info
*, int, int);
88 static void OP_VEX (instr_info
*, int, int);
89 static void OP_VexR (instr_info
*, int, int);
90 static void OP_VexW (instr_info
*, int, int);
91 static void OP_Rounding (instr_info
*, int, int);
92 static void OP_REG_VexI4 (instr_info
*, int, int);
93 static void OP_VexI4 (instr_info
*, int, int);
94 static void PCLMUL_Fixup (instr_info
*, int, int);
95 static void VPCMP_Fixup (instr_info
*, int, int);
96 static void VPCOM_Fixup (instr_info
*, int, int);
97 static void OP_0f07 (instr_info
*, int, int);
98 static void OP_Monitor (instr_info
*, int, int);
99 static void OP_Mwait (instr_info
*, int, int);
100 static void NOP_Fixup (instr_info
*, int, int);
101 static void OP_3DNowSuffix (instr_info
*, int, int);
102 static void CMP_Fixup (instr_info
*, int, int);
103 static void BadOp (instr_info
*);
104 static void REP_Fixup (instr_info
*, int, int);
105 static void SEP_Fixup (instr_info
*, int, int);
106 static void BND_Fixup (instr_info
*, int, int);
107 static void NOTRACK_Fixup (instr_info
*, int, int);
108 static void HLE_Fixup1 (instr_info
*, int, int);
109 static void HLE_Fixup2 (instr_info
*, int, int);
110 static void HLE_Fixup3 (instr_info
*, int, int);
111 static void CMPXCHG8B_Fixup (instr_info
*, int, int);
112 static void XMM_Fixup (instr_info
*, int, int);
113 static void FXSAVE_Fixup (instr_info
*, int, int);
115 static void MOVSXD_Fixup (instr_info
*, int, int);
116 static void DistinctDest_Fixup (instr_info
*, int, int);
117 static void PREFETCHI_Fixup (instr_info
*, int, int);
119 /* This character is used to encode style information within the output
120 buffers. See oappend_insert_style for more details. */
121 #define STYLE_MARKER_CHAR '\002'
123 /* The maximum operand buffer size. */
124 #define MAX_OPERAND_BUFFER_SIZE 128
127 /* Points to first byte not fetched. */
128 bfd_byte
*max_fetched
;
129 bfd_byte the_buffer
[MAX_MNEM_SIZE
];
132 OPCODES_SIGJMP_BUF bailout
;
150 enum address_mode address_mode
;
152 /* Flags for the prefixes for the current instruction. See below. */
155 /* REX prefix the current instruction. See below. */
157 /* Bits of REX we've already used. */
158 unsigned char rex_used
;
164 /* Flags for ins->prefixes which we somehow handled when printing the
165 current instruction. */
168 /* Flags for EVEX bits which we somehow handled when printing the
169 current instruction. */
172 char obuf
[MAX_OPERAND_BUFFER_SIZE
];
175 unsigned char *start_codep
;
176 unsigned char *insn_codep
;
177 unsigned char *codep
;
178 unsigned char *end_codep
;
179 signed char last_lock_prefix
;
180 signed char last_repz_prefix
;
181 signed char last_repnz_prefix
;
182 signed char last_data_prefix
;
183 signed char last_addr_prefix
;
184 signed char last_rex_prefix
;
185 signed char last_seg_prefix
;
186 signed char fwait_prefix
;
187 /* The active segment register prefix. */
188 unsigned char active_seg_prefix
;
190 #define MAX_CODE_LENGTH 15
191 /* We can up to 14 ins->prefixes since the maximum instruction length is
193 unsigned char all_prefixes
[MAX_CODE_LENGTH
- 1];
194 disassemble_info
*info
;
214 int register_specifier
;
217 int mask_register_specifier
;
229 /* Remember if the current op is a jump instruction. */
235 signed char op_index
[MAX_OPERANDS
];
236 bool op_riprel
[MAX_OPERANDS
];
237 char *op_out
[MAX_OPERANDS
];
238 bfd_vma op_address
[MAX_OPERANDS
];
241 /* On the 386's of 1988, the maximum length of an instruction is 15 bytes.
242 * (see topic "Redundant ins->prefixes" in the "Differences from 8086"
243 * section of the "Virtual 8086 Mode" chapter.)
244 * 'pc' should be the address of this instruction, it will
245 * be used to print the target address if this is a relative jump or call
246 * The function returns the length of this instruction in bytes.
255 enum x86_64_isa isa64
;
258 /* Mark parts used in the REX prefix. When we are testing for
259 empty prefix (for 8bit register REX extension), just mask it
260 out. Otherwise test for REX bit is excuse for existence of REX
261 only in case value is nonzero. */
262 #define USED_REX(value) \
266 if ((ins->rex & value)) \
267 ins->rex_used |= (value) | REX_OPCODE; \
270 ins->rex_used |= REX_OPCODE; \
274 #define EVEX_b_used 1
275 #define EVEX_len_used 2
277 /* Flags stored in PREFIXES. */
278 #define PREFIX_REPZ 1
279 #define PREFIX_REPNZ 2
282 #define PREFIX_DS 0x10
283 #define PREFIX_ES 0x20
284 #define PREFIX_FS 0x40
285 #define PREFIX_GS 0x80
286 #define PREFIX_LOCK 0x100
287 #define PREFIX_DATA 0x200
288 #define PREFIX_ADDR 0x400
289 #define PREFIX_FWAIT 0x800
291 /* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
292 to ADDR (exclusive) are valid. Returns 1 for success, longjmps
294 #define FETCH_DATA(info, addr) \
295 ((addr) <= ((struct dis_private *) (info->private_data))->max_fetched \
296 ? 1 : fetch_data ((info), (addr)))
299 fetch_data (struct disassemble_info
*info
, bfd_byte
*addr
)
302 struct dis_private
*priv
= (struct dis_private
*) info
->private_data
;
303 bfd_vma start
= priv
->insn_start
+ (priv
->max_fetched
- priv
->the_buffer
);
305 if (addr
<= priv
->the_buffer
+ MAX_MNEM_SIZE
)
306 status
= (*info
->read_memory_func
) (start
,
308 addr
- priv
->max_fetched
,
314 /* If we did manage to read at least one byte, then
315 print_insn_i386 will do something sensible. Otherwise, print
316 an error. We do that here because this is where we know
318 if (priv
->max_fetched
== priv
->the_buffer
)
319 (*info
->memory_error_func
) (status
, start
, info
);
320 OPCODES_SIGLONGJMP (priv
->bailout
, 1);
323 priv
->max_fetched
= addr
;
327 /* Possible values for prefix requirement. */
328 #define PREFIX_IGNORED_SHIFT 16
329 #define PREFIX_IGNORED_REPZ (PREFIX_REPZ << PREFIX_IGNORED_SHIFT)
330 #define PREFIX_IGNORED_REPNZ (PREFIX_REPNZ << PREFIX_IGNORED_SHIFT)
331 #define PREFIX_IGNORED_DATA (PREFIX_DATA << PREFIX_IGNORED_SHIFT)
332 #define PREFIX_IGNORED_ADDR (PREFIX_ADDR << PREFIX_IGNORED_SHIFT)
333 #define PREFIX_IGNORED_LOCK (PREFIX_LOCK << PREFIX_IGNORED_SHIFT)
335 /* Opcode prefixes. */
336 #define PREFIX_OPCODE (PREFIX_REPZ \
340 /* Prefixes ignored. */
341 #define PREFIX_IGNORED (PREFIX_IGNORED_REPZ \
342 | PREFIX_IGNORED_REPNZ \
343 | PREFIX_IGNORED_DATA)
345 #define XX { NULL, 0 }
346 #define Bad_Opcode NULL, { { NULL, 0 } }, 0
348 #define Eb { OP_E, b_mode }
349 #define Ebnd { OP_E, bnd_mode }
350 #define EbS { OP_E, b_swap_mode }
351 #define EbndS { OP_E, bnd_swap_mode }
352 #define Ev { OP_E, v_mode }
353 #define Eva { OP_E, va_mode }
354 #define Ev_bnd { OP_E, v_bnd_mode }
355 #define EvS { OP_E, v_swap_mode }
356 #define Ed { OP_E, d_mode }
357 #define Edq { OP_E, dq_mode }
358 #define Edb { OP_E, db_mode }
359 #define Edw { OP_E, dw_mode }
360 #define Eq { OP_E, q_mode }
361 #define indirEv { OP_indirE, indir_v_mode }
362 #define indirEp { OP_indirE, f_mode }
363 #define stackEv { OP_E, stack_v_mode }
364 #define Em { OP_E, m_mode }
365 #define Ew { OP_E, w_mode }
366 #define M { OP_M, 0 } /* lea, lgdt, etc. */
367 #define Ma { OP_M, a_mode }
368 #define Mb { OP_M, b_mode }
369 #define Md { OP_M, d_mode }
370 #define Mdq { OP_M, dq_mode }
371 #define Mo { OP_M, o_mode }
372 #define Mp { OP_M, f_mode } /* 32 or 48 bit memory operand for LDS, LES etc */
373 #define Mq { OP_M, q_mode }
374 #define Mv { OP_M, v_mode }
375 #define Mv_bnd { OP_M, v_bndmk_mode }
376 #define Mw { OP_M, w_mode }
377 #define Mx { OP_M, x_mode }
378 #define Mxmm { OP_M, xmm_mode }
379 #define Gb { OP_G, b_mode }
380 #define Gbnd { OP_G, bnd_mode }
381 #define Gv { OP_G, v_mode }
382 #define Gd { OP_G, d_mode }
383 #define Gdq { OP_G, dq_mode }
384 #define Gm { OP_G, m_mode }
385 #define Gva { OP_G, va_mode }
386 #define Gw { OP_G, w_mode }
387 #define Ib { OP_I, b_mode }
388 #define sIb { OP_sI, b_mode } /* sign extened byte */
389 #define sIbT { OP_sI, b_T_mode } /* sign extened byte like 'T' */
390 #define Iv { OP_I, v_mode }
391 #define sIv { OP_sI, v_mode }
392 #define Iv64 { OP_I64, v_mode }
393 #define Id { OP_I, d_mode }
394 #define Iw { OP_I, w_mode }
395 #define I1 { OP_I, const_1_mode }
396 #define Jb { OP_J, b_mode }
397 #define Jv { OP_J, v_mode }
398 #define Jdqw { OP_J, dqw_mode }
399 #define Cm { OP_C, m_mode }
400 #define Dm { OP_D, m_mode }
401 #define Td { OP_T, d_mode }
402 #define Skip_MODRM { OP_Skip_MODRM, 0 }
404 #define RMeAX { OP_REG, eAX_reg }
405 #define RMeBX { OP_REG, eBX_reg }
406 #define RMeCX { OP_REG, eCX_reg }
407 #define RMeDX { OP_REG, eDX_reg }
408 #define RMeSP { OP_REG, eSP_reg }
409 #define RMeBP { OP_REG, eBP_reg }
410 #define RMeSI { OP_REG, eSI_reg }
411 #define RMeDI { OP_REG, eDI_reg }
412 #define RMrAX { OP_REG, rAX_reg }
413 #define RMrBX { OP_REG, rBX_reg }
414 #define RMrCX { OP_REG, rCX_reg }
415 #define RMrDX { OP_REG, rDX_reg }
416 #define RMrSP { OP_REG, rSP_reg }
417 #define RMrBP { OP_REG, rBP_reg }
418 #define RMrSI { OP_REG, rSI_reg }
419 #define RMrDI { OP_REG, rDI_reg }
420 #define RMAL { OP_REG, al_reg }
421 #define RMCL { OP_REG, cl_reg }
422 #define RMDL { OP_REG, dl_reg }
423 #define RMBL { OP_REG, bl_reg }
424 #define RMAH { OP_REG, ah_reg }
425 #define RMCH { OP_REG, ch_reg }
426 #define RMDH { OP_REG, dh_reg }
427 #define RMBH { OP_REG, bh_reg }
428 #define RMAX { OP_REG, ax_reg }
429 #define RMDX { OP_REG, dx_reg }
431 #define eAX { OP_IMREG, eAX_reg }
432 #define AL { OP_IMREG, al_reg }
433 #define CL { OP_IMREG, cl_reg }
434 #define zAX { OP_IMREG, z_mode_ax_reg }
435 #define indirDX { OP_IMREG, indir_dx_reg }
437 #define Sw { OP_SEG, w_mode }
438 #define Sv { OP_SEG, v_mode }
439 #define Ap { OP_DIR, 0 }
440 #define Ob { OP_OFF64, b_mode }
441 #define Ov { OP_OFF64, v_mode }
442 #define Xb { OP_DSreg, eSI_reg }
443 #define Xv { OP_DSreg, eSI_reg }
444 #define Xz { OP_DSreg, eSI_reg }
445 #define Yb { OP_ESreg, eDI_reg }
446 #define Yv { OP_ESreg, eDI_reg }
447 #define DSBX { OP_DSreg, eBX_reg }
449 #define es { OP_REG, es_reg }
450 #define ss { OP_REG, ss_reg }
451 #define cs { OP_REG, cs_reg }
452 #define ds { OP_REG, ds_reg }
453 #define fs { OP_REG, fs_reg }
454 #define gs { OP_REG, gs_reg }
456 #define MX { OP_MMX, 0 }
457 #define XM { OP_XMM, 0 }
458 #define XMScalar { OP_XMM, scalar_mode }
459 #define XMGatherD { OP_XMM, vex_vsib_d_w_dq_mode }
460 #define XMGatherQ { OP_XMM, vex_vsib_q_w_dq_mode }
461 #define XMM { OP_XMM, xmm_mode }
462 #define TMM { OP_XMM, tmm_mode }
463 #define XMxmmq { OP_XMM, xmmq_mode }
464 #define EM { OP_EM, v_mode }
465 #define EMS { OP_EM, v_swap_mode }
466 #define EMd { OP_EM, d_mode }
467 #define EMx { OP_EM, x_mode }
468 #define EXbwUnit { OP_EX, bw_unit_mode }
469 #define EXb { OP_EX, b_mode }
470 #define EXw { OP_EX, w_mode }
471 #define EXd { OP_EX, d_mode }
472 #define EXdS { OP_EX, d_swap_mode }
473 #define EXwS { OP_EX, w_swap_mode }
474 #define EXq { OP_EX, q_mode }
475 #define EXqS { OP_EX, q_swap_mode }
476 #define EXdq { OP_EX, dq_mode }
477 #define EXx { OP_EX, x_mode }
478 #define EXxh { OP_EX, xh_mode }
479 #define EXxS { OP_EX, x_swap_mode }
480 #define EXxmm { OP_EX, xmm_mode }
481 #define EXymm { OP_EX, ymm_mode }
482 #define EXtmm { OP_EX, tmm_mode }
483 #define EXxmmq { OP_EX, xmmq_mode }
484 #define EXxmmqh { OP_EX, evex_half_bcst_xmmqh_mode }
485 #define EXEvexHalfBcstXmmq { OP_EX, evex_half_bcst_xmmq_mode }
486 #define EXxmmdw { OP_EX, xmmdw_mode }
487 #define EXxmmqd { OP_EX, xmmqd_mode }
488 #define EXxmmqdh { OP_EX, evex_half_bcst_xmmqdh_mode }
489 #define EXymmq { OP_EX, ymmq_mode }
490 #define EXEvexXGscat { OP_EX, evex_x_gscat_mode }
491 #define EXEvexXNoBcst { OP_EX, evex_x_nobcst_mode }
492 #define MS { OP_MS, v_mode }
493 #define XS { OP_XS, v_mode }
494 #define EMCq { OP_EMC, q_mode }
495 #define MXC { OP_MXC, 0 }
496 #define OPSUF { OP_3DNowSuffix, 0 }
497 #define SEP { SEP_Fixup, 0 }
498 #define CMP { CMP_Fixup, 0 }
499 #define XMM0 { XMM_Fixup, 0 }
500 #define FXSAVE { FXSAVE_Fixup, 0 }
502 #define Vex { OP_VEX, x_mode }
503 #define VexW { OP_VexW, x_mode }
504 #define VexScalar { OP_VEX, scalar_mode }
505 #define VexScalarR { OP_VexR, scalar_mode }
506 #define VexGatherD { OP_VEX, vex_vsib_d_w_dq_mode }
507 #define VexGatherQ { OP_VEX, vex_vsib_q_w_dq_mode }
508 #define VexGdq { OP_VEX, dq_mode }
509 #define VexTmm { OP_VEX, tmm_mode }
510 #define XMVexI4 { OP_REG_VexI4, x_mode }
511 #define XMVexScalarI4 { OP_REG_VexI4, scalar_mode }
512 #define VexI4 { OP_VexI4, 0 }
513 #define PCLMUL { PCLMUL_Fixup, 0 }
514 #define VPCMP { VPCMP_Fixup, 0 }
515 #define VPCOM { VPCOM_Fixup, 0 }
517 #define EXxEVexR { OP_Rounding, evex_rounding_mode }
518 #define EXxEVexR64 { OP_Rounding, evex_rounding_64_mode }
519 #define EXxEVexS { OP_Rounding, evex_sae_mode }
521 #define MaskG { OP_G, mask_mode }
522 #define MaskE { OP_E, mask_mode }
523 #define MaskBDE { OP_E, mask_bd_mode }
524 #define MaskVex { OP_VEX, mask_mode }
526 #define MVexVSIBDWpX { OP_M, vex_vsib_d_w_dq_mode }
527 #define MVexVSIBQWpX { OP_M, vex_vsib_q_w_dq_mode }
529 #define MVexSIBMEM { OP_M, vex_sibmem_mode }
531 /* Used handle "rep" prefix for string instructions. */
532 #define Xbr { REP_Fixup, eSI_reg }
533 #define Xvr { REP_Fixup, eSI_reg }
534 #define Ybr { REP_Fixup, eDI_reg }
535 #define Yvr { REP_Fixup, eDI_reg }
536 #define Yzr { REP_Fixup, eDI_reg }
537 #define indirDXr { REP_Fixup, indir_dx_reg }
538 #define ALr { REP_Fixup, al_reg }
539 #define eAXr { REP_Fixup, eAX_reg }
541 /* Used handle HLE prefix for lockable instructions. */
542 #define Ebh1 { HLE_Fixup1, b_mode }
543 #define Evh1 { HLE_Fixup1, v_mode }
544 #define Ebh2 { HLE_Fixup2, b_mode }
545 #define Evh2 { HLE_Fixup2, v_mode }
546 #define Ebh3 { HLE_Fixup3, b_mode }
547 #define Evh3 { HLE_Fixup3, v_mode }
549 #define BND { BND_Fixup, 0 }
550 #define NOTRACK { NOTRACK_Fixup, 0 }
552 #define cond_jump_flag { NULL, cond_jump_mode }
553 #define loop_jcxz_flag { NULL, loop_jcxz_mode }
555 /* bits in sizeflag */
556 #define SUFFIX_ALWAYS 4
564 /* byte operand with operand swapped */
566 /* byte operand, sign extend like 'T' suffix */
568 /* operand size depends on prefixes */
570 /* operand size depends on prefixes with operand swapped */
572 /* operand size depends on address prefix */
576 /* double word operand */
578 /* word operand with operand swapped */
580 /* double word operand with operand swapped */
582 /* quad word operand */
584 /* quad word operand with operand swapped */
586 /* ten-byte operand */
588 /* 16-byte XMM, 32-byte YMM or 64-byte ZMM operand. In EVEX with
589 broadcast enabled. */
591 /* Similar to x_mode, but with different EVEX mem shifts. */
593 /* Similar to x_mode, but with yet different EVEX mem shifts. */
595 /* Similar to x_mode, but with disabled broadcast. */
597 /* Similar to x_mode, but with operands swapped and disabled broadcast
600 /* 16-byte XMM, 32-byte YMM or 64-byte ZMM operand. In EVEX with
601 broadcast of 16bit enabled. */
603 /* 16-byte XMM operand */
605 /* XMM, XMM or YMM register operand, or quad word, xmmword or ymmword
606 memory operand (depending on vector length). Broadcast isn't
609 /* Same as xmmq_mode, but broadcast is allowed. */
610 evex_half_bcst_xmmq_mode
,
611 /* XMM, XMM or YMM register operand, or quad word, xmmword or ymmword
612 memory operand (depending on vector length). 16bit broadcast. */
613 evex_half_bcst_xmmqh_mode
,
614 /* 16-byte XMM, word, double word or quad word operand. */
616 /* 16-byte XMM, double word, quad word operand or xmm word operand. */
618 /* 16-byte XMM, double word, quad word operand or xmm word operand.
620 evex_half_bcst_xmmqdh_mode
,
621 /* 32-byte YMM operand */
623 /* quad word, ymmword or zmmword memory operand. */
627 /* d_mode in 32bit, q_mode in 64bit mode. */
629 /* pair of v_mode operands */
635 /* like v_bnd_mode in 32bit, no RIP-rel in 64bit mode. */
637 /* operand size depends on REX.W / VEX.W. */
639 /* Displacements like v_mode without considering Intel64 ISA. */
643 /* bounds operand with operand swapped */
645 /* 4- or 6-byte pointer operand */
648 /* v_mode for indirect branch opcodes. */
650 /* v_mode for stack-related opcodes. */
652 /* non-quad operand size depends on prefixes */
654 /* 16-byte operand */
656 /* registers like d_mode, memory like b_mode. */
658 /* registers like d_mode, memory like w_mode. */
661 /* Operand size depends on the VEX.W bit, with VSIB dword indices. */
662 vex_vsib_d_w_dq_mode
,
663 /* Operand size depends on the VEX.W bit, with VSIB qword indices. */
664 vex_vsib_q_w_dq_mode
,
665 /* mandatory non-vector SIB. */
668 /* scalar, ignore vector length. */
671 /* Static rounding. */
673 /* Static rounding, 64-bit mode only. */
674 evex_rounding_64_mode
,
675 /* Supress all exceptions. */
678 /* Mask register operand. */
680 /* Mask register operand. */
748 #define FLOAT NULL, { { NULL, FLOATCODE } }, 0
750 #define DIS386(T, I) NULL, { { NULL, (T)}, { NULL, (I) } }, 0
751 #define DIS386_PREFIX(T, I, P) NULL, { { NULL, (T)}, { NULL, (I) } }, P
752 #define REG_TABLE(I) DIS386 (USE_REG_TABLE, (I))
753 #define MOD_TABLE(I) DIS386 (USE_MOD_TABLE, (I))
754 #define RM_TABLE(I) DIS386 (USE_RM_TABLE, (I))
755 #define PREFIX_TABLE(I) DIS386 (USE_PREFIX_TABLE, (I))
756 #define X86_64_TABLE(I) DIS386 (USE_X86_64_TABLE, (I))
757 #define THREE_BYTE_TABLE(I) DIS386 (USE_3BYTE_TABLE, (I))
758 #define THREE_BYTE_TABLE_PREFIX(I, P) DIS386_PREFIX (USE_3BYTE_TABLE, (I), P)
759 #define XOP_8F_TABLE(I) DIS386 (USE_XOP_8F_TABLE, (I))
760 #define VEX_C4_TABLE(I) DIS386 (USE_VEX_C4_TABLE, (I))
761 #define VEX_C5_TABLE(I) DIS386 (USE_VEX_C5_TABLE, (I))
762 #define VEX_LEN_TABLE(I) DIS386 (USE_VEX_LEN_TABLE, (I))
763 #define VEX_W_TABLE(I) DIS386 (USE_VEX_W_TABLE, (I))
764 #define EVEX_TABLE(I) DIS386 (USE_EVEX_TABLE, (I))
765 #define EVEX_LEN_TABLE(I) DIS386 (USE_EVEX_LEN_TABLE, (I))
792 REG_0F3A0F_PREFIX_1_MOD_3
,
805 REG_VEX_0F3849_X86_64_P_0_W_0_M_1
,
810 REG_XOP_09_12_M_1_L_0
,
816 REG_EVEX_0F38C6_M_0_L_2
,
817 REG_EVEX_0F38C7_M_0_L_2
896 MOD_VEX_0F12_PREFIX_0
,
897 MOD_VEX_0F12_PREFIX_2
,
899 MOD_VEX_0F16_PREFIX_0
,
900 MOD_VEX_0F16_PREFIX_2
,
924 MOD_VEX_0FF0_PREFIX_3
,
931 MOD_VEX_0F3849_X86_64_P_0_W_0
,
932 MOD_VEX_0F3849_X86_64_P_2_W_0
,
933 MOD_VEX_0F3849_X86_64_P_3_W_0
,
934 MOD_VEX_0F384B_X86_64_P_1_W_0
,
935 MOD_VEX_0F384B_X86_64_P_2_W_0
,
936 MOD_VEX_0F384B_X86_64_P_3_W_0
,
938 MOD_VEX_0F385C_X86_64_P_1_W_0
,
939 MOD_VEX_0F385C_X86_64_P_3_W_0
,
940 MOD_VEX_0F385E_X86_64_P_0_W_0
,
941 MOD_VEX_0F385E_X86_64_P_1_W_0
,
942 MOD_VEX_0F385E_X86_64_P_2_W_0
,
943 MOD_VEX_0F385E_X86_64_P_3_W_0
,
956 MOD_EVEX_0F382A_P_1_W_1
,
958 MOD_EVEX_0F383A_P_1_W_0
,
978 RM_0F1E_P_1_MOD_3_REG_7
,
979 RM_0FAE_REG_6_MOD_3_P_0
,
981 RM_0F3A0F_P_1_MOD_3_REG_0
,
983 RM_VEX_0F3849_X86_64_P_0_W_0_M_1_R_0
989 PREFIX_0F01_REG_0_MOD_3_RM_6
,
990 PREFIX_0F01_REG_1_RM_4
,
991 PREFIX_0F01_REG_1_RM_5
,
992 PREFIX_0F01_REG_1_RM_6
,
993 PREFIX_0F01_REG_1_RM_7
,
994 PREFIX_0F01_REG_3_RM_1
,
995 PREFIX_0F01_REG_5_MOD_0
,
996 PREFIX_0F01_REG_5_MOD_3_RM_0
,
997 PREFIX_0F01_REG_5_MOD_3_RM_1
,
998 PREFIX_0F01_REG_5_MOD_3_RM_2
,
999 PREFIX_0F01_REG_5_MOD_3_RM_4
,
1000 PREFIX_0F01_REG_5_MOD_3_RM_5
,
1001 PREFIX_0F01_REG_5_MOD_3_RM_6
,
1002 PREFIX_0F01_REG_5_MOD_3_RM_7
,
1003 PREFIX_0F01_REG_7_MOD_3_RM_2
,
1004 PREFIX_0F01_REG_7_MOD_3_RM_5
,
1005 PREFIX_0F01_REG_7_MOD_3_RM_6
,
1006 PREFIX_0F01_REG_7_MOD_3_RM_7
,
1012 PREFIX_0F18_REG_6_MOD_0_X86_64
,
1013 PREFIX_0F18_REG_7_MOD_0_X86_64
,
1046 PREFIX_0FAE_REG_0_MOD_3
,
1047 PREFIX_0FAE_REG_1_MOD_3
,
1048 PREFIX_0FAE_REG_2_MOD_3
,
1049 PREFIX_0FAE_REG_3_MOD_3
,
1050 PREFIX_0FAE_REG_4_MOD_0
,
1051 PREFIX_0FAE_REG_4_MOD_3
,
1052 PREFIX_0FAE_REG_5_MOD_3
,
1053 PREFIX_0FAE_REG_6_MOD_0
,
1054 PREFIX_0FAE_REG_6_MOD_3
,
1055 PREFIX_0FAE_REG_7_MOD_0
,
1060 PREFIX_0FC7_REG_6_MOD_0
,
1061 PREFIX_0FC7_REG_6_MOD_3
,
1062 PREFIX_0FC7_REG_7_MOD_3
,
1091 PREFIX_VEX_0F41_L_1_M_1_W_0
,
1092 PREFIX_VEX_0F41_L_1_M_1_W_1
,
1093 PREFIX_VEX_0F42_L_1_M_1_W_0
,
1094 PREFIX_VEX_0F42_L_1_M_1_W_1
,
1095 PREFIX_VEX_0F44_L_0_M_1_W_0
,
1096 PREFIX_VEX_0F44_L_0_M_1_W_1
,
1097 PREFIX_VEX_0F45_L_1_M_1_W_0
,
1098 PREFIX_VEX_0F45_L_1_M_1_W_1
,
1099 PREFIX_VEX_0F46_L_1_M_1_W_0
,
1100 PREFIX_VEX_0F46_L_1_M_1_W_1
,
1101 PREFIX_VEX_0F47_L_1_M_1_W_0
,
1102 PREFIX_VEX_0F47_L_1_M_1_W_1
,
1103 PREFIX_VEX_0F4A_L_1_M_1_W_0
,
1104 PREFIX_VEX_0F4A_L_1_M_1_W_1
,
1105 PREFIX_VEX_0F4B_L_1_M_1_W_0
,
1106 PREFIX_VEX_0F4B_L_1_M_1_W_1
,
1124 PREFIX_VEX_0F90_L_0_W_0
,
1125 PREFIX_VEX_0F90_L_0_W_1
,
1126 PREFIX_VEX_0F91_L_0_M_0_W_0
,
1127 PREFIX_VEX_0F91_L_0_M_0_W_1
,
1128 PREFIX_VEX_0F92_L_0_M_1_W_0
,
1129 PREFIX_VEX_0F92_L_0_M_1_W_1
,
1130 PREFIX_VEX_0F93_L_0_M_1_W_0
,
1131 PREFIX_VEX_0F93_L_0_M_1_W_1
,
1132 PREFIX_VEX_0F98_L_0_M_1_W_0
,
1133 PREFIX_VEX_0F98_L_0_M_1_W_1
,
1134 PREFIX_VEX_0F99_L_0_M_1_W_0
,
1135 PREFIX_VEX_0F99_L_0_M_1_W_1
,
1140 PREFIX_VEX_0F3849_X86_64
,
1141 PREFIX_VEX_0F384B_X86_64
,
1142 PREFIX_VEX_0F3850_W_0
,
1143 PREFIX_VEX_0F3851_W_0
,
1144 PREFIX_VEX_0F385C_X86_64
,
1145 PREFIX_VEX_0F385E_X86_64
,
1147 PREFIX_VEX_0F38B0_W_0
,
1148 PREFIX_VEX_0F38B1_W_0
,
1149 PREFIX_VEX_0F38F5_L_0
,
1150 PREFIX_VEX_0F38F6_L_0
,
1151 PREFIX_VEX_0F38F7_L_0
,
1152 PREFIX_VEX_0F3AF0_L_0
,
1210 PREFIX_EVEX_MAP5_10
,
1211 PREFIX_EVEX_MAP5_11
,
1212 PREFIX_EVEX_MAP5_1D
,
1213 PREFIX_EVEX_MAP5_2A
,
1214 PREFIX_EVEX_MAP5_2C
,
1215 PREFIX_EVEX_MAP5_2D
,
1216 PREFIX_EVEX_MAP5_2E
,
1217 PREFIX_EVEX_MAP5_2F
,
1218 PREFIX_EVEX_MAP5_51
,
1219 PREFIX_EVEX_MAP5_58
,
1220 PREFIX_EVEX_MAP5_59
,
1221 PREFIX_EVEX_MAP5_5A
,
1222 PREFIX_EVEX_MAP5_5B
,
1223 PREFIX_EVEX_MAP5_5C
,
1224 PREFIX_EVEX_MAP5_5D
,
1225 PREFIX_EVEX_MAP5_5E
,
1226 PREFIX_EVEX_MAP5_5F
,
1227 PREFIX_EVEX_MAP5_78
,
1228 PREFIX_EVEX_MAP5_79
,
1229 PREFIX_EVEX_MAP5_7A
,
1230 PREFIX_EVEX_MAP5_7B
,
1231 PREFIX_EVEX_MAP5_7C
,
1232 PREFIX_EVEX_MAP5_7D
,
1234 PREFIX_EVEX_MAP6_13
,
1235 PREFIX_EVEX_MAP6_56
,
1236 PREFIX_EVEX_MAP6_57
,
1237 PREFIX_EVEX_MAP6_D6
,
1238 PREFIX_EVEX_MAP6_D7
,
1273 X86_64_0F01_REG_0_MOD_3_RM_6_P_1
,
1274 X86_64_0F01_REG_0_MOD_3_RM_6_P_3
,
1276 X86_64_0F01_REG_1_RM_5_PREFIX_2
,
1277 X86_64_0F01_REG_1_RM_6_PREFIX_2
,
1278 X86_64_0F01_REG_1_RM_7_PREFIX_2
,
1281 X86_64_0F01_REG_5_MOD_3_RM_4_PREFIX_1
,
1282 X86_64_0F01_REG_5_MOD_3_RM_5_PREFIX_1
,
1283 X86_64_0F01_REG_5_MOD_3_RM_6_PREFIX_1
,
1284 X86_64_0F01_REG_5_MOD_3_RM_7_PREFIX_1
,
1285 X86_64_0F01_REG_7_MOD_3_RM_5_PREFIX_1
,
1286 X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_1
,
1287 X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3
,
1288 X86_64_0F01_REG_7_MOD_3_RM_7_PREFIX_1
,
1289 X86_64_0F18_REG_6_MOD_0
,
1290 X86_64_0F18_REG_7_MOD_0
,
1293 X86_64_0FC7_REG_6_MOD_3_PREFIX_1
,
1319 THREE_BYTE_0F38
= 0,
1348 VEX_LEN_0F12_P_0_M_0
= 0,
1349 VEX_LEN_0F12_P_0_M_1
,
1350 #define VEX_LEN_0F12_P_2_M_0 VEX_LEN_0F12_P_0_M_0
1352 VEX_LEN_0F16_P_0_M_0
,
1353 VEX_LEN_0F16_P_0_M_1
,
1354 #define VEX_LEN_0F16_P_2_M_0 VEX_LEN_0F16_P_0_M_0
1374 VEX_LEN_0FAE_R_2_M_0
,
1375 VEX_LEN_0FAE_R_3_M_0
,
1385 VEX_LEN_0F3849_X86_64_P_0_W_0_M_0
,
1386 VEX_LEN_0F3849_X86_64_P_0_W_0_M_1_REG_0_RM_0
,
1387 VEX_LEN_0F3849_X86_64_P_2_W_0_M_0
,
1388 VEX_LEN_0F3849_X86_64_P_3_W_0_M_0
,
1389 VEX_LEN_0F384B_X86_64_P_1_W_0_M_0
,
1390 VEX_LEN_0F384B_X86_64_P_2_W_0_M_0
,
1391 VEX_LEN_0F384B_X86_64_P_3_W_0_M_0
,
1393 VEX_LEN_0F385C_X86_64_P_1_W_0_M_0
,
1394 VEX_LEN_0F385C_X86_64_P_3_W_0_M_0
,
1395 VEX_LEN_0F385E_X86_64_P_0_W_0_M_0
,
1396 VEX_LEN_0F385E_X86_64_P_1_W_0_M_0
,
1397 VEX_LEN_0F385E_X86_64_P_2_W_0_M_0
,
1398 VEX_LEN_0F385E_X86_64_P_3_W_0_M_0
,
1431 VEX_LEN_0FXOP_08_85
,
1432 VEX_LEN_0FXOP_08_86
,
1433 VEX_LEN_0FXOP_08_87
,
1434 VEX_LEN_0FXOP_08_8E
,
1435 VEX_LEN_0FXOP_08_8F
,
1436 VEX_LEN_0FXOP_08_95
,
1437 VEX_LEN_0FXOP_08_96
,
1438 VEX_LEN_0FXOP_08_97
,
1439 VEX_LEN_0FXOP_08_9E
,
1440 VEX_LEN_0FXOP_08_9F
,
1441 VEX_LEN_0FXOP_08_A3
,
1442 VEX_LEN_0FXOP_08_A6
,
1443 VEX_LEN_0FXOP_08_B6
,
1444 VEX_LEN_0FXOP_08_C0
,
1445 VEX_LEN_0FXOP_08_C1
,
1446 VEX_LEN_0FXOP_08_C2
,
1447 VEX_LEN_0FXOP_08_C3
,
1448 VEX_LEN_0FXOP_08_CC
,
1449 VEX_LEN_0FXOP_08_CD
,
1450 VEX_LEN_0FXOP_08_CE
,
1451 VEX_LEN_0FXOP_08_CF
,
1452 VEX_LEN_0FXOP_08_EC
,
1453 VEX_LEN_0FXOP_08_ED
,
1454 VEX_LEN_0FXOP_08_EE
,
1455 VEX_LEN_0FXOP_08_EF
,
1456 VEX_LEN_0FXOP_09_01
,
1457 VEX_LEN_0FXOP_09_02
,
1458 VEX_LEN_0FXOP_09_12_M_1
,
1459 VEX_LEN_0FXOP_09_82_W_0
,
1460 VEX_LEN_0FXOP_09_83_W_0
,
1461 VEX_LEN_0FXOP_09_90
,
1462 VEX_LEN_0FXOP_09_91
,
1463 VEX_LEN_0FXOP_09_92
,
1464 VEX_LEN_0FXOP_09_93
,
1465 VEX_LEN_0FXOP_09_94
,
1466 VEX_LEN_0FXOP_09_95
,
1467 VEX_LEN_0FXOP_09_96
,
1468 VEX_LEN_0FXOP_09_97
,
1469 VEX_LEN_0FXOP_09_98
,
1470 VEX_LEN_0FXOP_09_99
,
1471 VEX_LEN_0FXOP_09_9A
,
1472 VEX_LEN_0FXOP_09_9B
,
1473 VEX_LEN_0FXOP_09_C1
,
1474 VEX_LEN_0FXOP_09_C2
,
1475 VEX_LEN_0FXOP_09_C3
,
1476 VEX_LEN_0FXOP_09_C6
,
1477 VEX_LEN_0FXOP_09_C7
,
1478 VEX_LEN_0FXOP_09_CB
,
1479 VEX_LEN_0FXOP_09_D1
,
1480 VEX_LEN_0FXOP_09_D2
,
1481 VEX_LEN_0FXOP_09_D3
,
1482 VEX_LEN_0FXOP_09_D6
,
1483 VEX_LEN_0FXOP_09_D7
,
1484 VEX_LEN_0FXOP_09_DB
,
1485 VEX_LEN_0FXOP_09_E1
,
1486 VEX_LEN_0FXOP_09_E2
,
1487 VEX_LEN_0FXOP_09_E3
,
1488 VEX_LEN_0FXOP_0A_12
,
1493 EVEX_LEN_0F3816
= 0,
1495 EVEX_LEN_0F381A_M_0
,
1496 EVEX_LEN_0F381B_M_0
,
1498 EVEX_LEN_0F385A_M_0
,
1499 EVEX_LEN_0F385B_M_0
,
1500 EVEX_LEN_0F38C6_M_0
,
1501 EVEX_LEN_0F38C7_M_0
,
1518 VEX_W_0F41_L_1_M_1
= 0,
1540 VEX_W_0F381A_M_0_L_1
,
1547 VEX_W_0F3849_X86_64_P_0
,
1548 VEX_W_0F3849_X86_64_P_2
,
1549 VEX_W_0F3849_X86_64_P_3
,
1550 VEX_W_0F384B_X86_64_P_1
,
1551 VEX_W_0F384B_X86_64_P_2
,
1552 VEX_W_0F384B_X86_64_P_3
,
1559 VEX_W_0F385A_M_0_L_0
,
1560 VEX_W_0F385C_X86_64_P_1
,
1561 VEX_W_0F385C_X86_64_P_3
,
1562 VEX_W_0F385E_X86_64_P_0
,
1563 VEX_W_0F385E_X86_64_P_1
,
1564 VEX_W_0F385E_X86_64_P_2
,
1565 VEX_W_0F385E_X86_64_P_3
,
1592 VEX_W_0FXOP_08_85_L_0
,
1593 VEX_W_0FXOP_08_86_L_0
,
1594 VEX_W_0FXOP_08_87_L_0
,
1595 VEX_W_0FXOP_08_8E_L_0
,
1596 VEX_W_0FXOP_08_8F_L_0
,
1597 VEX_W_0FXOP_08_95_L_0
,
1598 VEX_W_0FXOP_08_96_L_0
,
1599 VEX_W_0FXOP_08_97_L_0
,
1600 VEX_W_0FXOP_08_9E_L_0
,
1601 VEX_W_0FXOP_08_9F_L_0
,
1602 VEX_W_0FXOP_08_A6_L_0
,
1603 VEX_W_0FXOP_08_B6_L_0
,
1604 VEX_W_0FXOP_08_C0_L_0
,
1605 VEX_W_0FXOP_08_C1_L_0
,
1606 VEX_W_0FXOP_08_C2_L_0
,
1607 VEX_W_0FXOP_08_C3_L_0
,
1608 VEX_W_0FXOP_08_CC_L_0
,
1609 VEX_W_0FXOP_08_CD_L_0
,
1610 VEX_W_0FXOP_08_CE_L_0
,
1611 VEX_W_0FXOP_08_CF_L_0
,
1612 VEX_W_0FXOP_08_EC_L_0
,
1613 VEX_W_0FXOP_08_ED_L_0
,
1614 VEX_W_0FXOP_08_EE_L_0
,
1615 VEX_W_0FXOP_08_EF_L_0
,
1621 VEX_W_0FXOP_09_C1_L_0
,
1622 VEX_W_0FXOP_09_C2_L_0
,
1623 VEX_W_0FXOP_09_C3_L_0
,
1624 VEX_W_0FXOP_09_C6_L_0
,
1625 VEX_W_0FXOP_09_C7_L_0
,
1626 VEX_W_0FXOP_09_CB_L_0
,
1627 VEX_W_0FXOP_09_D1_L_0
,
1628 VEX_W_0FXOP_09_D2_L_0
,
1629 VEX_W_0FXOP_09_D3_L_0
,
1630 VEX_W_0FXOP_09_D6_L_0
,
1631 VEX_W_0FXOP_09_D7_L_0
,
1632 VEX_W_0FXOP_09_DB_L_0
,
1633 VEX_W_0FXOP_09_E1_L_0
,
1634 VEX_W_0FXOP_09_E2_L_0
,
1635 VEX_W_0FXOP_09_E3_L_0
,
1688 EVEX_W_0F381A_M_0_L_n
,
1689 EVEX_W_0F381B_M_0_L_2
,
1714 EVEX_W_0F385A_M_0_L_n
,
1715 EVEX_W_0F385B_M_0_L_2
,
1741 typedef void (*op_rtn
) (instr_info
*ins
, int bytemode
, int sizeflag
);
1750 unsigned int prefix_requirement
;
1753 /* Upper case letters in the instruction names here are macros.
1754 'A' => print 'b' if no register operands or suffix_always is true
1755 'B' => print 'b' if suffix_always is true
1756 'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
1758 'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
1759 suffix_always is true
1760 'E' => print 'e' if 32-bit form of jcxz
1761 'F' => print 'w' or 'l' depending on address size prefix (loop insns)
1762 'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
1763 'H' => print ",pt" or ",pn" branch hint
1766 'K' => print 'd' or 'q' if rex prefix is present.
1768 'M' => print 'r' if intel_mnemonic is false.
1769 'N' => print 'n' if instruction has no wait "prefix"
1770 'O' => print 'd' or 'o' (or 'q' in Intel mode)
1771 'P' => behave as 'T' except with register operand outside of suffix_always
1773 'Q' => print 'w', 'l' or 'q' for memory operand or suffix_always
1775 'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
1776 'S' => print 'w', 'l' or 'q' if suffix_always is true
1777 'T' => print 'w', 'l'/'d', or 'q' if instruction has an operand size
1778 prefix or if suffix_always is true.
1781 'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
1782 'X' => print 's', 'd' depending on data16 prefix (for XMM)
1784 'Z' => print 'q' in 64bit mode and 'l' otherwise, if suffix_always is true.
1785 '!' => change condition from true to false or from false to true.
1786 '%' => add 1 upper case letter to the macro.
1787 '^' => print 'w', 'l', or 'q' (Intel64 ISA only) depending on operand size
1788 prefix or suffix_always is true (lcall/ljmp).
1789 '@' => in 64bit mode for Intel64 ISA or if instruction
1790 has no operand sizing prefix, print 'q' if suffix_always is true or
1791 nothing otherwise; behave as 'P' in all other cases
1793 2 upper case letter macros:
1794 "XY" => print 'x' or 'y' if suffix_always is true or no register
1795 operands and no broadcast.
1796 "XZ" => print 'x', 'y', or 'z' if suffix_always is true or no
1797 register operands and no broadcast.
1798 "XW" => print 's', 'd' depending on the VEX.W bit (for FMA)
1799 "XD" => print 'd' if !EVEX or EVEX.W=1, EVEX.W=0 is not a valid encoding
1800 "XH" => print 'h' if EVEX.W=0, EVEX.W=1 is not a valid encoding (for FP16)
1801 "XS" => print 's' if !EVEX or EVEX.W=0, EVEX.W=1 is not a valid encoding
1802 "XV" => print "{vex} " pseudo prefix
1803 "XE" => print "{evex} " pseudo prefix if no EVEX-specific functionality is
1804 is used by an EVEX-encoded (AVX512VL) instruction.
1805 "LQ" => print 'l' ('d' in Intel mode) or 'q' for memory operand, cond
1806 being false, or no operand at all in 64bit mode, or if suffix_always
1808 "LB" => print "abs" in 64bit mode and behave as 'B' otherwise
1809 "LS" => print "abs" in 64bit mode and behave as 'S' otherwise
1810 "LV" => print "abs" for 64bit operand and behave as 'S' otherwise
1811 "DQ" => print 'd' or 'q' depending on the VEX.W bit
1812 "BW" => print 'b' or 'w' depending on the VEX.W bit
1813 "LP" => print 'w' or 'l' ('d' in Intel mode) if instruction has
1814 an operand size prefix, or suffix_always is true. print
1815 'q' if rex prefix is present.
1817 Many of the above letters print nothing in Intel mode. See "putop"
1820 Braces '{' and '}', and vertical bars '|', indicate alternative
1821 mnemonic strings for AT&T and Intel. */
1823 static const struct dis386 dis386
[] = {
1825 { "addB", { Ebh1
, Gb
}, 0 },
1826 { "addS", { Evh1
, Gv
}, 0 },
1827 { "addB", { Gb
, EbS
}, 0 },
1828 { "addS", { Gv
, EvS
}, 0 },
1829 { "addB", { AL
, Ib
}, 0 },
1830 { "addS", { eAX
, Iv
}, 0 },
1831 { X86_64_TABLE (X86_64_06
) },
1832 { X86_64_TABLE (X86_64_07
) },
1834 { "orB", { Ebh1
, Gb
}, 0 },
1835 { "orS", { Evh1
, Gv
}, 0 },
1836 { "orB", { Gb
, EbS
}, 0 },
1837 { "orS", { Gv
, EvS
}, 0 },
1838 { "orB", { AL
, Ib
}, 0 },
1839 { "orS", { eAX
, Iv
}, 0 },
1840 { X86_64_TABLE (X86_64_0E
) },
1841 { Bad_Opcode
}, /* 0x0f extended opcode escape */
1843 { "adcB", { Ebh1
, Gb
}, 0 },
1844 { "adcS", { Evh1
, Gv
}, 0 },
1845 { "adcB", { Gb
, EbS
}, 0 },
1846 { "adcS", { Gv
, EvS
}, 0 },
1847 { "adcB", { AL
, Ib
}, 0 },
1848 { "adcS", { eAX
, Iv
}, 0 },
1849 { X86_64_TABLE (X86_64_16
) },
1850 { X86_64_TABLE (X86_64_17
) },
1852 { "sbbB", { Ebh1
, Gb
}, 0 },
1853 { "sbbS", { Evh1
, Gv
}, 0 },
1854 { "sbbB", { Gb
, EbS
}, 0 },
1855 { "sbbS", { Gv
, EvS
}, 0 },
1856 { "sbbB", { AL
, Ib
}, 0 },
1857 { "sbbS", { eAX
, Iv
}, 0 },
1858 { X86_64_TABLE (X86_64_1E
) },
1859 { X86_64_TABLE (X86_64_1F
) },
1861 { "andB", { Ebh1
, Gb
}, 0 },
1862 { "andS", { Evh1
, Gv
}, 0 },
1863 { "andB", { Gb
, EbS
}, 0 },
1864 { "andS", { Gv
, EvS
}, 0 },
1865 { "andB", { AL
, Ib
}, 0 },
1866 { "andS", { eAX
, Iv
}, 0 },
1867 { Bad_Opcode
}, /* SEG ES prefix */
1868 { X86_64_TABLE (X86_64_27
) },
1870 { "subB", { Ebh1
, Gb
}, 0 },
1871 { "subS", { Evh1
, Gv
}, 0 },
1872 { "subB", { Gb
, EbS
}, 0 },
1873 { "subS", { Gv
, EvS
}, 0 },
1874 { "subB", { AL
, Ib
}, 0 },
1875 { "subS", { eAX
, Iv
}, 0 },
1876 { Bad_Opcode
}, /* SEG CS prefix */
1877 { X86_64_TABLE (X86_64_2F
) },
1879 { "xorB", { Ebh1
, Gb
}, 0 },
1880 { "xorS", { Evh1
, Gv
}, 0 },
1881 { "xorB", { Gb
, EbS
}, 0 },
1882 { "xorS", { Gv
, EvS
}, 0 },
1883 { "xorB", { AL
, Ib
}, 0 },
1884 { "xorS", { eAX
, Iv
}, 0 },
1885 { Bad_Opcode
}, /* SEG SS prefix */
1886 { X86_64_TABLE (X86_64_37
) },
1888 { "cmpB", { Eb
, Gb
}, 0 },
1889 { "cmpS", { Ev
, Gv
}, 0 },
1890 { "cmpB", { Gb
, EbS
}, 0 },
1891 { "cmpS", { Gv
, EvS
}, 0 },
1892 { "cmpB", { AL
, Ib
}, 0 },
1893 { "cmpS", { eAX
, Iv
}, 0 },
1894 { Bad_Opcode
}, /* SEG DS prefix */
1895 { X86_64_TABLE (X86_64_3F
) },
1897 { "inc{S|}", { RMeAX
}, 0 },
1898 { "inc{S|}", { RMeCX
}, 0 },
1899 { "inc{S|}", { RMeDX
}, 0 },
1900 { "inc{S|}", { RMeBX
}, 0 },
1901 { "inc{S|}", { RMeSP
}, 0 },
1902 { "inc{S|}", { RMeBP
}, 0 },
1903 { "inc{S|}", { RMeSI
}, 0 },
1904 { "inc{S|}", { RMeDI
}, 0 },
1906 { "dec{S|}", { RMeAX
}, 0 },
1907 { "dec{S|}", { RMeCX
}, 0 },
1908 { "dec{S|}", { RMeDX
}, 0 },
1909 { "dec{S|}", { RMeBX
}, 0 },
1910 { "dec{S|}", { RMeSP
}, 0 },
1911 { "dec{S|}", { RMeBP
}, 0 },
1912 { "dec{S|}", { RMeSI
}, 0 },
1913 { "dec{S|}", { RMeDI
}, 0 },
1915 { "push{!P|}", { RMrAX
}, 0 },
1916 { "push{!P|}", { RMrCX
}, 0 },
1917 { "push{!P|}", { RMrDX
}, 0 },
1918 { "push{!P|}", { RMrBX
}, 0 },
1919 { "push{!P|}", { RMrSP
}, 0 },
1920 { "push{!P|}", { RMrBP
}, 0 },
1921 { "push{!P|}", { RMrSI
}, 0 },
1922 { "push{!P|}", { RMrDI
}, 0 },
1924 { "pop{!P|}", { RMrAX
}, 0 },
1925 { "pop{!P|}", { RMrCX
}, 0 },
1926 { "pop{!P|}", { RMrDX
}, 0 },
1927 { "pop{!P|}", { RMrBX
}, 0 },
1928 { "pop{!P|}", { RMrSP
}, 0 },
1929 { "pop{!P|}", { RMrBP
}, 0 },
1930 { "pop{!P|}", { RMrSI
}, 0 },
1931 { "pop{!P|}", { RMrDI
}, 0 },
1933 { X86_64_TABLE (X86_64_60
) },
1934 { X86_64_TABLE (X86_64_61
) },
1935 { X86_64_TABLE (X86_64_62
) },
1936 { X86_64_TABLE (X86_64_63
) },
1937 { Bad_Opcode
}, /* seg fs */
1938 { Bad_Opcode
}, /* seg gs */
1939 { Bad_Opcode
}, /* op size prefix */
1940 { Bad_Opcode
}, /* adr size prefix */
1942 { "pushP", { sIv
}, 0 },
1943 { "imulS", { Gv
, Ev
, Iv
}, 0 },
1944 { "pushP", { sIbT
}, 0 },
1945 { "imulS", { Gv
, Ev
, sIb
}, 0 },
1946 { "ins{b|}", { Ybr
, indirDX
}, 0 },
1947 { X86_64_TABLE (X86_64_6D
) },
1948 { "outs{b|}", { indirDXr
, Xb
}, 0 },
1949 { X86_64_TABLE (X86_64_6F
) },
1951 { "joH", { Jb
, BND
, cond_jump_flag
}, 0 },
1952 { "jnoH", { Jb
, BND
, cond_jump_flag
}, 0 },
1953 { "jbH", { Jb
, BND
, cond_jump_flag
}, 0 },
1954 { "jaeH", { Jb
, BND
, cond_jump_flag
}, 0 },
1955 { "jeH", { Jb
, BND
, cond_jump_flag
}, 0 },
1956 { "jneH", { Jb
, BND
, cond_jump_flag
}, 0 },
1957 { "jbeH", { Jb
, BND
, cond_jump_flag
}, 0 },
1958 { "jaH", { Jb
, BND
, cond_jump_flag
}, 0 },
1960 { "jsH", { Jb
, BND
, cond_jump_flag
}, 0 },
1961 { "jnsH", { Jb
, BND
, cond_jump_flag
}, 0 },
1962 { "jpH", { Jb
, BND
, cond_jump_flag
}, 0 },
1963 { "jnpH", { Jb
, BND
, cond_jump_flag
}, 0 },
1964 { "jlH", { Jb
, BND
, cond_jump_flag
}, 0 },
1965 { "jgeH", { Jb
, BND
, cond_jump_flag
}, 0 },
1966 { "jleH", { Jb
, BND
, cond_jump_flag
}, 0 },
1967 { "jgH", { Jb
, BND
, cond_jump_flag
}, 0 },
1969 { REG_TABLE (REG_80
) },
1970 { REG_TABLE (REG_81
) },
1971 { X86_64_TABLE (X86_64_82
) },
1972 { REG_TABLE (REG_83
) },
1973 { "testB", { Eb
, Gb
}, 0 },
1974 { "testS", { Ev
, Gv
}, 0 },
1975 { "xchgB", { Ebh2
, Gb
}, 0 },
1976 { "xchgS", { Evh2
, Gv
}, 0 },
1978 { "movB", { Ebh3
, Gb
}, 0 },
1979 { "movS", { Evh3
, Gv
}, 0 },
1980 { "movB", { Gb
, EbS
}, 0 },
1981 { "movS", { Gv
, EvS
}, 0 },
1982 { "movD", { Sv
, Sw
}, 0 },
1983 { MOD_TABLE (MOD_8D
) },
1984 { "movD", { Sw
, Sv
}, 0 },
1985 { REG_TABLE (REG_8F
) },
1987 { PREFIX_TABLE (PREFIX_90
) },
1988 { "xchgS", { RMeCX
, eAX
}, 0 },
1989 { "xchgS", { RMeDX
, eAX
}, 0 },
1990 { "xchgS", { RMeBX
, eAX
}, 0 },
1991 { "xchgS", { RMeSP
, eAX
}, 0 },
1992 { "xchgS", { RMeBP
, eAX
}, 0 },
1993 { "xchgS", { RMeSI
, eAX
}, 0 },
1994 { "xchgS", { RMeDI
, eAX
}, 0 },
1996 { "cW{t|}R", { XX
}, 0 },
1997 { "cR{t|}O", { XX
}, 0 },
1998 { X86_64_TABLE (X86_64_9A
) },
1999 { Bad_Opcode
}, /* fwait */
2000 { "pushfP", { XX
}, 0 },
2001 { "popfP", { XX
}, 0 },
2002 { "sahf", { XX
}, 0 },
2003 { "lahf", { XX
}, 0 },
2005 { "mov%LB", { AL
, Ob
}, 0 },
2006 { "mov%LS", { eAX
, Ov
}, 0 },
2007 { "mov%LB", { Ob
, AL
}, 0 },
2008 { "mov%LS", { Ov
, eAX
}, 0 },
2009 { "movs{b|}", { Ybr
, Xb
}, 0 },
2010 { "movs{R|}", { Yvr
, Xv
}, 0 },
2011 { "cmps{b|}", { Xb
, Yb
}, 0 },
2012 { "cmps{R|}", { Xv
, Yv
}, 0 },
2014 { "testB", { AL
, Ib
}, 0 },
2015 { "testS", { eAX
, Iv
}, 0 },
2016 { "stosB", { Ybr
, AL
}, 0 },
2017 { "stosS", { Yvr
, eAX
}, 0 },
2018 { "lodsB", { ALr
, Xb
}, 0 },
2019 { "lodsS", { eAXr
, Xv
}, 0 },
2020 { "scasB", { AL
, Yb
}, 0 },
2021 { "scasS", { eAX
, Yv
}, 0 },
2023 { "movB", { RMAL
, Ib
}, 0 },
2024 { "movB", { RMCL
, Ib
}, 0 },
2025 { "movB", { RMDL
, Ib
}, 0 },
2026 { "movB", { RMBL
, Ib
}, 0 },
2027 { "movB", { RMAH
, Ib
}, 0 },
2028 { "movB", { RMCH
, Ib
}, 0 },
2029 { "movB", { RMDH
, Ib
}, 0 },
2030 { "movB", { RMBH
, Ib
}, 0 },
2032 { "mov%LV", { RMeAX
, Iv64
}, 0 },
2033 { "mov%LV", { RMeCX
, Iv64
}, 0 },
2034 { "mov%LV", { RMeDX
, Iv64
}, 0 },
2035 { "mov%LV", { RMeBX
, Iv64
}, 0 },
2036 { "mov%LV", { RMeSP
, Iv64
}, 0 },
2037 { "mov%LV", { RMeBP
, Iv64
}, 0 },
2038 { "mov%LV", { RMeSI
, Iv64
}, 0 },
2039 { "mov%LV", { RMeDI
, Iv64
}, 0 },
2041 { REG_TABLE (REG_C0
) },
2042 { REG_TABLE (REG_C1
) },
2043 { X86_64_TABLE (X86_64_C2
) },
2044 { X86_64_TABLE (X86_64_C3
) },
2045 { X86_64_TABLE (X86_64_C4
) },
2046 { X86_64_TABLE (X86_64_C5
) },
2047 { REG_TABLE (REG_C6
) },
2048 { REG_TABLE (REG_C7
) },
2050 { "enterP", { Iw
, Ib
}, 0 },
2051 { "leaveP", { XX
}, 0 },
2052 { "{l|}ret{|f}%LP", { Iw
}, 0 },
2053 { "{l|}ret{|f}%LP", { XX
}, 0 },
2054 { "int3", { XX
}, 0 },
2055 { "int", { Ib
}, 0 },
2056 { X86_64_TABLE (X86_64_CE
) },
2057 { "iret%LP", { XX
}, 0 },
2059 { REG_TABLE (REG_D0
) },
2060 { REG_TABLE (REG_D1
) },
2061 { REG_TABLE (REG_D2
) },
2062 { REG_TABLE (REG_D3
) },
2063 { X86_64_TABLE (X86_64_D4
) },
2064 { X86_64_TABLE (X86_64_D5
) },
2066 { "xlat", { DSBX
}, 0 },
2077 { "loopneFH", { Jb
, XX
, loop_jcxz_flag
}, 0 },
2078 { "loopeFH", { Jb
, XX
, loop_jcxz_flag
}, 0 },
2079 { "loopFH", { Jb
, XX
, loop_jcxz_flag
}, 0 },
2080 { "jEcxzH", { Jb
, XX
, loop_jcxz_flag
}, 0 },
2081 { "inB", { AL
, Ib
}, 0 },
2082 { "inG", { zAX
, Ib
}, 0 },
2083 { "outB", { Ib
, AL
}, 0 },
2084 { "outG", { Ib
, zAX
}, 0 },
2086 { X86_64_TABLE (X86_64_E8
) },
2087 { X86_64_TABLE (X86_64_E9
) },
2088 { X86_64_TABLE (X86_64_EA
) },
2089 { "jmp", { Jb
, BND
}, 0 },
2090 { "inB", { AL
, indirDX
}, 0 },
2091 { "inG", { zAX
, indirDX
}, 0 },
2092 { "outB", { indirDX
, AL
}, 0 },
2093 { "outG", { indirDX
, zAX
}, 0 },
2095 { Bad_Opcode
}, /* lock prefix */
2096 { "int1", { XX
}, 0 },
2097 { Bad_Opcode
}, /* repne */
2098 { Bad_Opcode
}, /* repz */
2099 { "hlt", { XX
}, 0 },
2100 { "cmc", { XX
}, 0 },
2101 { REG_TABLE (REG_F6
) },
2102 { REG_TABLE (REG_F7
) },
2104 { "clc", { XX
}, 0 },
2105 { "stc", { XX
}, 0 },
2106 { "cli", { XX
}, 0 },
2107 { "sti", { XX
}, 0 },
2108 { "cld", { XX
}, 0 },
2109 { "std", { XX
}, 0 },
2110 { REG_TABLE (REG_FE
) },
2111 { REG_TABLE (REG_FF
) },
2114 static const struct dis386 dis386_twobyte
[] = {
2116 { REG_TABLE (REG_0F00
) },
2117 { REG_TABLE (REG_0F01
) },
2118 { "larS", { Gv
, Ew
}, 0 },
2119 { "lslS", { Gv
, Ew
}, 0 },
2121 { "syscall", { XX
}, 0 },
2122 { "clts", { XX
}, 0 },
2123 { "sysret%LQ", { XX
}, 0 },
2125 { "invd", { XX
}, 0 },
2126 { PREFIX_TABLE (PREFIX_0F09
) },
2128 { "ud2", { XX
}, 0 },
2130 { REG_TABLE (REG_0F0D
) },
2131 { "femms", { XX
}, 0 },
2132 { "", { MX
, EM
, OPSUF
}, 0 }, /* See OP_3DNowSuffix. */
2134 { PREFIX_TABLE (PREFIX_0F10
) },
2135 { PREFIX_TABLE (PREFIX_0F11
) },
2136 { PREFIX_TABLE (PREFIX_0F12
) },
2137 { MOD_TABLE (MOD_0F13
) },
2138 { "unpcklpX", { XM
, EXx
}, PREFIX_OPCODE
},
2139 { "unpckhpX", { XM
, EXx
}, PREFIX_OPCODE
},
2140 { PREFIX_TABLE (PREFIX_0F16
) },
2141 { MOD_TABLE (MOD_0F17
) },
2143 { REG_TABLE (REG_0F18
) },
2144 { "nopQ", { Ev
}, 0 },
2145 { PREFIX_TABLE (PREFIX_0F1A
) },
2146 { PREFIX_TABLE (PREFIX_0F1B
) },
2147 { PREFIX_TABLE (PREFIX_0F1C
) },
2148 { "nopQ", { Ev
}, 0 },
2149 { PREFIX_TABLE (PREFIX_0F1E
) },
2150 { "nopQ", { Ev
}, 0 },
2152 { "movZ", { Em
, Cm
}, 0 },
2153 { "movZ", { Em
, Dm
}, 0 },
2154 { "movZ", { Cm
, Em
}, 0 },
2155 { "movZ", { Dm
, Em
}, 0 },
2156 { X86_64_TABLE (X86_64_0F24
) },
2158 { X86_64_TABLE (X86_64_0F26
) },
2161 { "movapX", { XM
, EXx
}, PREFIX_OPCODE
},
2162 { "movapX", { EXxS
, XM
}, PREFIX_OPCODE
},
2163 { PREFIX_TABLE (PREFIX_0F2A
) },
2164 { PREFIX_TABLE (PREFIX_0F2B
) },
2165 { PREFIX_TABLE (PREFIX_0F2C
) },
2166 { PREFIX_TABLE (PREFIX_0F2D
) },
2167 { PREFIX_TABLE (PREFIX_0F2E
) },
2168 { PREFIX_TABLE (PREFIX_0F2F
) },
2170 { "wrmsr", { XX
}, 0 },
2171 { "rdtsc", { XX
}, 0 },
2172 { "rdmsr", { XX
}, 0 },
2173 { "rdpmc", { XX
}, 0 },
2174 { "sysenter", { SEP
}, 0 },
2175 { "sysexit%LQ", { SEP
}, 0 },
2177 { "getsec", { XX
}, 0 },
2179 { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F38
, PREFIX_OPCODE
) },
2181 { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F3A
, PREFIX_OPCODE
) },
2188 { "cmovoS", { Gv
, Ev
}, 0 },
2189 { "cmovnoS", { Gv
, Ev
}, 0 },
2190 { "cmovbS", { Gv
, Ev
}, 0 },
2191 { "cmovaeS", { Gv
, Ev
}, 0 },
2192 { "cmoveS", { Gv
, Ev
}, 0 },
2193 { "cmovneS", { Gv
, Ev
}, 0 },
2194 { "cmovbeS", { Gv
, Ev
}, 0 },
2195 { "cmovaS", { Gv
, Ev
}, 0 },
2197 { "cmovsS", { Gv
, Ev
}, 0 },
2198 { "cmovnsS", { Gv
, Ev
}, 0 },
2199 { "cmovpS", { Gv
, Ev
}, 0 },
2200 { "cmovnpS", { Gv
, Ev
}, 0 },
2201 { "cmovlS", { Gv
, Ev
}, 0 },
2202 { "cmovgeS", { Gv
, Ev
}, 0 },
2203 { "cmovleS", { Gv
, Ev
}, 0 },
2204 { "cmovgS", { Gv
, Ev
}, 0 },
2206 { MOD_TABLE (MOD_0F50
) },
2207 { PREFIX_TABLE (PREFIX_0F51
) },
2208 { PREFIX_TABLE (PREFIX_0F52
) },
2209 { PREFIX_TABLE (PREFIX_0F53
) },
2210 { "andpX", { XM
, EXx
}, PREFIX_OPCODE
},
2211 { "andnpX", { XM
, EXx
}, PREFIX_OPCODE
},
2212 { "orpX", { XM
, EXx
}, PREFIX_OPCODE
},
2213 { "xorpX", { XM
, EXx
}, PREFIX_OPCODE
},
2215 { PREFIX_TABLE (PREFIX_0F58
) },
2216 { PREFIX_TABLE (PREFIX_0F59
) },
2217 { PREFIX_TABLE (PREFIX_0F5A
) },
2218 { PREFIX_TABLE (PREFIX_0F5B
) },
2219 { PREFIX_TABLE (PREFIX_0F5C
) },
2220 { PREFIX_TABLE (PREFIX_0F5D
) },
2221 { PREFIX_TABLE (PREFIX_0F5E
) },
2222 { PREFIX_TABLE (PREFIX_0F5F
) },
2224 { PREFIX_TABLE (PREFIX_0F60
) },
2225 { PREFIX_TABLE (PREFIX_0F61
) },
2226 { PREFIX_TABLE (PREFIX_0F62
) },
2227 { "packsswb", { MX
, EM
}, PREFIX_OPCODE
},
2228 { "pcmpgtb", { MX
, EM
}, PREFIX_OPCODE
},
2229 { "pcmpgtw", { MX
, EM
}, PREFIX_OPCODE
},
2230 { "pcmpgtd", { MX
, EM
}, PREFIX_OPCODE
},
2231 { "packuswb", { MX
, EM
}, PREFIX_OPCODE
},
2233 { "punpckhbw", { MX
, EM
}, PREFIX_OPCODE
},
2234 { "punpckhwd", { MX
, EM
}, PREFIX_OPCODE
},
2235 { "punpckhdq", { MX
, EM
}, PREFIX_OPCODE
},
2236 { "packssdw", { MX
, EM
}, PREFIX_OPCODE
},
2237 { "punpcklqdq", { XM
, EXx
}, PREFIX_DATA
},
2238 { "punpckhqdq", { XM
, EXx
}, PREFIX_DATA
},
2239 { "movK", { MX
, Edq
}, PREFIX_OPCODE
},
2240 { PREFIX_TABLE (PREFIX_0F6F
) },
2242 { PREFIX_TABLE (PREFIX_0F70
) },
2243 { MOD_TABLE (MOD_0F71
) },
2244 { MOD_TABLE (MOD_0F72
) },
2245 { MOD_TABLE (MOD_0F73
) },
2246 { "pcmpeqb", { MX
, EM
}, PREFIX_OPCODE
},
2247 { "pcmpeqw", { MX
, EM
}, PREFIX_OPCODE
},
2248 { "pcmpeqd", { MX
, EM
}, PREFIX_OPCODE
},
2249 { "emms", { XX
}, PREFIX_OPCODE
},
2251 { PREFIX_TABLE (PREFIX_0F78
) },
2252 { PREFIX_TABLE (PREFIX_0F79
) },
2255 { PREFIX_TABLE (PREFIX_0F7C
) },
2256 { PREFIX_TABLE (PREFIX_0F7D
) },
2257 { PREFIX_TABLE (PREFIX_0F7E
) },
2258 { PREFIX_TABLE (PREFIX_0F7F
) },
2260 { "joH", { Jv
, BND
, cond_jump_flag
}, 0 },
2261 { "jnoH", { Jv
, BND
, cond_jump_flag
}, 0 },
2262 { "jbH", { Jv
, BND
, cond_jump_flag
}, 0 },
2263 { "jaeH", { Jv
, BND
, cond_jump_flag
}, 0 },
2264 { "jeH", { Jv
, BND
, cond_jump_flag
}, 0 },
2265 { "jneH", { Jv
, BND
, cond_jump_flag
}, 0 },
2266 { "jbeH", { Jv
, BND
, cond_jump_flag
}, 0 },
2267 { "jaH", { Jv
, BND
, cond_jump_flag
}, 0 },
2269 { "jsH", { Jv
, BND
, cond_jump_flag
}, 0 },
2270 { "jnsH", { Jv
, BND
, cond_jump_flag
}, 0 },
2271 { "jpH", { Jv
, BND
, cond_jump_flag
}, 0 },
2272 { "jnpH", { Jv
, BND
, cond_jump_flag
}, 0 },
2273 { "jlH", { Jv
, BND
, cond_jump_flag
}, 0 },
2274 { "jgeH", { Jv
, BND
, cond_jump_flag
}, 0 },
2275 { "jleH", { Jv
, BND
, cond_jump_flag
}, 0 },
2276 { "jgH", { Jv
, BND
, cond_jump_flag
}, 0 },
2278 { "seto", { Eb
}, 0 },
2279 { "setno", { Eb
}, 0 },
2280 { "setb", { Eb
}, 0 },
2281 { "setae", { Eb
}, 0 },
2282 { "sete", { Eb
}, 0 },
2283 { "setne", { Eb
}, 0 },
2284 { "setbe", { Eb
}, 0 },
2285 { "seta", { Eb
}, 0 },
2287 { "sets", { Eb
}, 0 },
2288 { "setns", { Eb
}, 0 },
2289 { "setp", { Eb
}, 0 },
2290 { "setnp", { Eb
}, 0 },
2291 { "setl", { Eb
}, 0 },
2292 { "setge", { Eb
}, 0 },
2293 { "setle", { Eb
}, 0 },
2294 { "setg", { Eb
}, 0 },
2296 { "pushP", { fs
}, 0 },
2297 { "popP", { fs
}, 0 },
2298 { "cpuid", { XX
}, 0 },
2299 { "btS", { Ev
, Gv
}, 0 },
2300 { "shldS", { Ev
, Gv
, Ib
}, 0 },
2301 { "shldS", { Ev
, Gv
, CL
}, 0 },
2302 { REG_TABLE (REG_0FA6
) },
2303 { REG_TABLE (REG_0FA7
) },
2305 { "pushP", { gs
}, 0 },
2306 { "popP", { gs
}, 0 },
2307 { "rsm", { XX
}, 0 },
2308 { "btsS", { Evh1
, Gv
}, 0 },
2309 { "shrdS", { Ev
, Gv
, Ib
}, 0 },
2310 { "shrdS", { Ev
, Gv
, CL
}, 0 },
2311 { REG_TABLE (REG_0FAE
) },
2312 { "imulS", { Gv
, Ev
}, 0 },
2314 { "cmpxchgB", { Ebh1
, Gb
}, 0 },
2315 { "cmpxchgS", { Evh1
, Gv
}, 0 },
2316 { MOD_TABLE (MOD_0FB2
) },
2317 { "btrS", { Evh1
, Gv
}, 0 },
2318 { MOD_TABLE (MOD_0FB4
) },
2319 { MOD_TABLE (MOD_0FB5
) },
2320 { "movz{bR|x}", { Gv
, Eb
}, 0 },
2321 { "movz{wR|x}", { Gv
, Ew
}, 0 }, /* yes, there really is movzww ! */
2323 { PREFIX_TABLE (PREFIX_0FB8
) },
2324 { "ud1S", { Gv
, Ev
}, 0 },
2325 { REG_TABLE (REG_0FBA
) },
2326 { "btcS", { Evh1
, Gv
}, 0 },
2327 { PREFIX_TABLE (PREFIX_0FBC
) },
2328 { PREFIX_TABLE (PREFIX_0FBD
) },
2329 { "movs{bR|x}", { Gv
, Eb
}, 0 },
2330 { "movs{wR|x}", { Gv
, Ew
}, 0 }, /* yes, there really is movsww ! */
2332 { "xaddB", { Ebh1
, Gb
}, 0 },
2333 { "xaddS", { Evh1
, Gv
}, 0 },
2334 { PREFIX_TABLE (PREFIX_0FC2
) },
2335 { MOD_TABLE (MOD_0FC3
) },
2336 { "pinsrw", { MX
, Edw
, Ib
}, PREFIX_OPCODE
},
2337 { "pextrw", { Gd
, MS
, Ib
}, PREFIX_OPCODE
},
2338 { "shufpX", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
2339 { REG_TABLE (REG_0FC7
) },
2341 { "bswap", { RMeAX
}, 0 },
2342 { "bswap", { RMeCX
}, 0 },
2343 { "bswap", { RMeDX
}, 0 },
2344 { "bswap", { RMeBX
}, 0 },
2345 { "bswap", { RMeSP
}, 0 },
2346 { "bswap", { RMeBP
}, 0 },
2347 { "bswap", { RMeSI
}, 0 },
2348 { "bswap", { RMeDI
}, 0 },
2350 { PREFIX_TABLE (PREFIX_0FD0
) },
2351 { "psrlw", { MX
, EM
}, PREFIX_OPCODE
},
2352 { "psrld", { MX
, EM
}, PREFIX_OPCODE
},
2353 { "psrlq", { MX
, EM
}, PREFIX_OPCODE
},
2354 { "paddq", { MX
, EM
}, PREFIX_OPCODE
},
2355 { "pmullw", { MX
, EM
}, PREFIX_OPCODE
},
2356 { PREFIX_TABLE (PREFIX_0FD6
) },
2357 { MOD_TABLE (MOD_0FD7
) },
2359 { "psubusb", { MX
, EM
}, PREFIX_OPCODE
},
2360 { "psubusw", { MX
, EM
}, PREFIX_OPCODE
},
2361 { "pminub", { MX
, EM
}, PREFIX_OPCODE
},
2362 { "pand", { MX
, EM
}, PREFIX_OPCODE
},
2363 { "paddusb", { MX
, EM
}, PREFIX_OPCODE
},
2364 { "paddusw", { MX
, EM
}, PREFIX_OPCODE
},
2365 { "pmaxub", { MX
, EM
}, PREFIX_OPCODE
},
2366 { "pandn", { MX
, EM
}, PREFIX_OPCODE
},
2368 { "pavgb", { MX
, EM
}, PREFIX_OPCODE
},
2369 { "psraw", { MX
, EM
}, PREFIX_OPCODE
},
2370 { "psrad", { MX
, EM
}, PREFIX_OPCODE
},
2371 { "pavgw", { MX
, EM
}, PREFIX_OPCODE
},
2372 { "pmulhuw", { MX
, EM
}, PREFIX_OPCODE
},
2373 { "pmulhw", { MX
, EM
}, PREFIX_OPCODE
},
2374 { PREFIX_TABLE (PREFIX_0FE6
) },
2375 { PREFIX_TABLE (PREFIX_0FE7
) },
2377 { "psubsb", { MX
, EM
}, PREFIX_OPCODE
},
2378 { "psubsw", { MX
, EM
}, PREFIX_OPCODE
},
2379 { "pminsw", { MX
, EM
}, PREFIX_OPCODE
},
2380 { "por", { MX
, EM
}, PREFIX_OPCODE
},
2381 { "paddsb", { MX
, EM
}, PREFIX_OPCODE
},
2382 { "paddsw", { MX
, EM
}, PREFIX_OPCODE
},
2383 { "pmaxsw", { MX
, EM
}, PREFIX_OPCODE
},
2384 { "pxor", { MX
, EM
}, PREFIX_OPCODE
},
2386 { PREFIX_TABLE (PREFIX_0FF0
) },
2387 { "psllw", { MX
, EM
}, PREFIX_OPCODE
},
2388 { "pslld", { MX
, EM
}, PREFIX_OPCODE
},
2389 { "psllq", { MX
, EM
}, PREFIX_OPCODE
},
2390 { "pmuludq", { MX
, EM
}, PREFIX_OPCODE
},
2391 { "pmaddwd", { MX
, EM
}, PREFIX_OPCODE
},
2392 { "psadbw", { MX
, EM
}, PREFIX_OPCODE
},
2393 { PREFIX_TABLE (PREFIX_0FF7
) },
2395 { "psubb", { MX
, EM
}, PREFIX_OPCODE
},
2396 { "psubw", { MX
, EM
}, PREFIX_OPCODE
},
2397 { "psubd", { MX
, EM
}, PREFIX_OPCODE
},
2398 { "psubq", { MX
, EM
}, PREFIX_OPCODE
},
2399 { "paddb", { MX
, EM
}, PREFIX_OPCODE
},
2400 { "paddw", { MX
, EM
}, PREFIX_OPCODE
},
2401 { "paddd", { MX
, EM
}, PREFIX_OPCODE
},
2402 { "ud0S", { Gv
, Ev
}, 0 },
2405 static const bool onebyte_has_modrm
[256] = {
2406 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2407 /* ------------------------------- */
2408 /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
2409 /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
2410 /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
2411 /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
2412 /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
2413 /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
2414 /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
2415 /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
2416 /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
2417 /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
2418 /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
2419 /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
2420 /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
2421 /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
2422 /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
2423 /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1 /* f0 */
2424 /* ------------------------------- */
2425 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2428 static const bool twobyte_has_modrm
[256] = {
2429 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2430 /* ------------------------------- */
2431 /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
2432 /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
2433 /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
2434 /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
2435 /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
2436 /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
2437 /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
2438 /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
2439 /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
2440 /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
2441 /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
2442 /* b0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* bf */
2443 /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
2444 /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
2445 /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
2446 /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 /* ff */
2447 /* ------------------------------- */
2448 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2458 /* If we are accessing mod/rm/reg without need_modrm set, then the
2459 values are stale. Hitting this abort likely indicates that you
2460 need to update onebyte_has_modrm or twobyte_has_modrm. */
2461 #define MODRM_CHECK if (!ins->need_modrm) abort ()
2463 static const char *const intel_index16
[] = {
2464 "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
2467 static const char *const att_names64
[] = {
2468 "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
2469 "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
2471 static const char *const att_names32
[] = {
2472 "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
2473 "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
2475 static const char *const att_names16
[] = {
2476 "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
2477 "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
2479 static const char *const att_names8
[] = {
2480 "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
2482 static const char *const att_names8rex
[] = {
2483 "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
2484 "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
2486 static const char *const att_names_seg
[] = {
2487 "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
2489 static const char att_index64
[] = "%riz";
2490 static const char att_index32
[] = "%eiz";
2491 static const char *const att_index16
[] = {
2492 "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
2495 static const char *const att_names_mm
[] = {
2496 "%mm0", "%mm1", "%mm2", "%mm3",
2497 "%mm4", "%mm5", "%mm6", "%mm7"
2500 static const char *const att_names_bnd
[] = {
2501 "%bnd0", "%bnd1", "%bnd2", "%bnd3"
2504 static const char *const att_names_xmm
[] = {
2505 "%xmm0", "%xmm1", "%xmm2", "%xmm3",
2506 "%xmm4", "%xmm5", "%xmm6", "%xmm7",
2507 "%xmm8", "%xmm9", "%xmm10", "%xmm11",
2508 "%xmm12", "%xmm13", "%xmm14", "%xmm15",
2509 "%xmm16", "%xmm17", "%xmm18", "%xmm19",
2510 "%xmm20", "%xmm21", "%xmm22", "%xmm23",
2511 "%xmm24", "%xmm25", "%xmm26", "%xmm27",
2512 "%xmm28", "%xmm29", "%xmm30", "%xmm31"
2515 static const char *const att_names_ymm
[] = {
2516 "%ymm0", "%ymm1", "%ymm2", "%ymm3",
2517 "%ymm4", "%ymm5", "%ymm6", "%ymm7",
2518 "%ymm8", "%ymm9", "%ymm10", "%ymm11",
2519 "%ymm12", "%ymm13", "%ymm14", "%ymm15",
2520 "%ymm16", "%ymm17", "%ymm18", "%ymm19",
2521 "%ymm20", "%ymm21", "%ymm22", "%ymm23",
2522 "%ymm24", "%ymm25", "%ymm26", "%ymm27",
2523 "%ymm28", "%ymm29", "%ymm30", "%ymm31"
2526 static const char *const att_names_zmm
[] = {
2527 "%zmm0", "%zmm1", "%zmm2", "%zmm3",
2528 "%zmm4", "%zmm5", "%zmm6", "%zmm7",
2529 "%zmm8", "%zmm9", "%zmm10", "%zmm11",
2530 "%zmm12", "%zmm13", "%zmm14", "%zmm15",
2531 "%zmm16", "%zmm17", "%zmm18", "%zmm19",
2532 "%zmm20", "%zmm21", "%zmm22", "%zmm23",
2533 "%zmm24", "%zmm25", "%zmm26", "%zmm27",
2534 "%zmm28", "%zmm29", "%zmm30", "%zmm31"
2537 static const char *const att_names_tmm
[] = {
2538 "%tmm0", "%tmm1", "%tmm2", "%tmm3",
2539 "%tmm4", "%tmm5", "%tmm6", "%tmm7"
2542 static const char *const att_names_mask
[] = {
2543 "%k0", "%k1", "%k2", "%k3", "%k4", "%k5", "%k6", "%k7"
2546 static const char *const names_rounding
[] =
2554 static const struct dis386 reg_table
[][8] = {
2557 { "addA", { Ebh1
, Ib
}, 0 },
2558 { "orA", { Ebh1
, Ib
}, 0 },
2559 { "adcA", { Ebh1
, Ib
}, 0 },
2560 { "sbbA", { Ebh1
, Ib
}, 0 },
2561 { "andA", { Ebh1
, Ib
}, 0 },
2562 { "subA", { Ebh1
, Ib
}, 0 },
2563 { "xorA", { Ebh1
, Ib
}, 0 },
2564 { "cmpA", { Eb
, Ib
}, 0 },
2568 { "addQ", { Evh1
, Iv
}, 0 },
2569 { "orQ", { Evh1
, Iv
}, 0 },
2570 { "adcQ", { Evh1
, Iv
}, 0 },
2571 { "sbbQ", { Evh1
, Iv
}, 0 },
2572 { "andQ", { Evh1
, Iv
}, 0 },
2573 { "subQ", { Evh1
, Iv
}, 0 },
2574 { "xorQ", { Evh1
, Iv
}, 0 },
2575 { "cmpQ", { Ev
, Iv
}, 0 },
2579 { "addQ", { Evh1
, sIb
}, 0 },
2580 { "orQ", { Evh1
, sIb
}, 0 },
2581 { "adcQ", { Evh1
, sIb
}, 0 },
2582 { "sbbQ", { Evh1
, sIb
}, 0 },
2583 { "andQ", { Evh1
, sIb
}, 0 },
2584 { "subQ", { Evh1
, sIb
}, 0 },
2585 { "xorQ", { Evh1
, sIb
}, 0 },
2586 { "cmpQ", { Ev
, sIb
}, 0 },
2590 { "pop{P|}", { stackEv
}, 0 },
2591 { XOP_8F_TABLE (XOP_09
) },
2595 { XOP_8F_TABLE (XOP_09
) },
2599 { "rolA", { Eb
, Ib
}, 0 },
2600 { "rorA", { Eb
, Ib
}, 0 },
2601 { "rclA", { Eb
, Ib
}, 0 },
2602 { "rcrA", { Eb
, Ib
}, 0 },
2603 { "shlA", { Eb
, Ib
}, 0 },
2604 { "shrA", { Eb
, Ib
}, 0 },
2605 { "shlA", { Eb
, Ib
}, 0 },
2606 { "sarA", { Eb
, Ib
}, 0 },
2610 { "rolQ", { Ev
, Ib
}, 0 },
2611 { "rorQ", { Ev
, Ib
}, 0 },
2612 { "rclQ", { Ev
, Ib
}, 0 },
2613 { "rcrQ", { Ev
, Ib
}, 0 },
2614 { "shlQ", { Ev
, Ib
}, 0 },
2615 { "shrQ", { Ev
, Ib
}, 0 },
2616 { "shlQ", { Ev
, Ib
}, 0 },
2617 { "sarQ", { Ev
, Ib
}, 0 },
2621 { "movA", { Ebh3
, Ib
}, 0 },
2628 { MOD_TABLE (MOD_C6_REG_7
) },
2632 { "movQ", { Evh3
, Iv
}, 0 },
2639 { MOD_TABLE (MOD_C7_REG_7
) },
2643 { "rolA", { Eb
, I1
}, 0 },
2644 { "rorA", { Eb
, I1
}, 0 },
2645 { "rclA", { Eb
, I1
}, 0 },
2646 { "rcrA", { Eb
, I1
}, 0 },
2647 { "shlA", { Eb
, I1
}, 0 },
2648 { "shrA", { Eb
, I1
}, 0 },
2649 { "shlA", { Eb
, I1
}, 0 },
2650 { "sarA", { Eb
, I1
}, 0 },
2654 { "rolQ", { Ev
, I1
}, 0 },
2655 { "rorQ", { Ev
, I1
}, 0 },
2656 { "rclQ", { Ev
, I1
}, 0 },
2657 { "rcrQ", { Ev
, I1
}, 0 },
2658 { "shlQ", { Ev
, I1
}, 0 },
2659 { "shrQ", { Ev
, I1
}, 0 },
2660 { "shlQ", { Ev
, I1
}, 0 },
2661 { "sarQ", { Ev
, I1
}, 0 },
2665 { "rolA", { Eb
, CL
}, 0 },
2666 { "rorA", { Eb
, CL
}, 0 },
2667 { "rclA", { Eb
, CL
}, 0 },
2668 { "rcrA", { Eb
, CL
}, 0 },
2669 { "shlA", { Eb
, CL
}, 0 },
2670 { "shrA", { Eb
, CL
}, 0 },
2671 { "shlA", { Eb
, CL
}, 0 },
2672 { "sarA", { Eb
, CL
}, 0 },
2676 { "rolQ", { Ev
, CL
}, 0 },
2677 { "rorQ", { Ev
, CL
}, 0 },
2678 { "rclQ", { Ev
, CL
}, 0 },
2679 { "rcrQ", { Ev
, CL
}, 0 },
2680 { "shlQ", { Ev
, CL
}, 0 },
2681 { "shrQ", { Ev
, CL
}, 0 },
2682 { "shlQ", { Ev
, CL
}, 0 },
2683 { "sarQ", { Ev
, CL
}, 0 },
2687 { "testA", { Eb
, Ib
}, 0 },
2688 { "testA", { Eb
, Ib
}, 0 },
2689 { "notA", { Ebh1
}, 0 },
2690 { "negA", { Ebh1
}, 0 },
2691 { "mulA", { Eb
}, 0 }, /* Don't print the implicit %al register, */
2692 { "imulA", { Eb
}, 0 }, /* to distinguish these opcodes from other */
2693 { "divA", { Eb
}, 0 }, /* mul/imul opcodes. Do the same for div */
2694 { "idivA", { Eb
}, 0 }, /* and idiv for consistency. */
2698 { "testQ", { Ev
, Iv
}, 0 },
2699 { "testQ", { Ev
, Iv
}, 0 },
2700 { "notQ", { Evh1
}, 0 },
2701 { "negQ", { Evh1
}, 0 },
2702 { "mulQ", { Ev
}, 0 }, /* Don't print the implicit register. */
2703 { "imulQ", { Ev
}, 0 },
2704 { "divQ", { Ev
}, 0 },
2705 { "idivQ", { Ev
}, 0 },
2709 { "incA", { Ebh1
}, 0 },
2710 { "decA", { Ebh1
}, 0 },
2714 { "incQ", { Evh1
}, 0 },
2715 { "decQ", { Evh1
}, 0 },
2716 { "call{@|}", { NOTRACK
, indirEv
, BND
}, 0 },
2717 { MOD_TABLE (MOD_FF_REG_3
) },
2718 { "jmp{@|}", { NOTRACK
, indirEv
, BND
}, 0 },
2719 { MOD_TABLE (MOD_FF_REG_5
) },
2720 { "push{P|}", { stackEv
}, 0 },
2725 { "sldtD", { Sv
}, 0 },
2726 { "strD", { Sv
}, 0 },
2727 { "lldt", { Ew
}, 0 },
2728 { "ltr", { Ew
}, 0 },
2729 { "verr", { Ew
}, 0 },
2730 { "verw", { Ew
}, 0 },
2736 { MOD_TABLE (MOD_0F01_REG_0
) },
2737 { MOD_TABLE (MOD_0F01_REG_1
) },
2738 { MOD_TABLE (MOD_0F01_REG_2
) },
2739 { MOD_TABLE (MOD_0F01_REG_3
) },
2740 { "smswD", { Sv
}, 0 },
2741 { MOD_TABLE (MOD_0F01_REG_5
) },
2742 { "lmsw", { Ew
}, 0 },
2743 { MOD_TABLE (MOD_0F01_REG_7
) },
2747 { "prefetch", { Mb
}, 0 },
2748 { "prefetchw", { Mb
}, 0 },
2749 { "prefetchwt1", { Mb
}, 0 },
2750 { "prefetch", { Mb
}, 0 },
2751 { "prefetch", { Mb
}, 0 },
2752 { "prefetch", { Mb
}, 0 },
2753 { "prefetch", { Mb
}, 0 },
2754 { "prefetch", { Mb
}, 0 },
2758 { MOD_TABLE (MOD_0F18_REG_0
) },
2759 { MOD_TABLE (MOD_0F18_REG_1
) },
2760 { MOD_TABLE (MOD_0F18_REG_2
) },
2761 { MOD_TABLE (MOD_0F18_REG_3
) },
2762 { "nopQ", { Ev
}, 0 },
2763 { "nopQ", { Ev
}, 0 },
2764 { MOD_TABLE (MOD_0F18_REG_6
) },
2765 { MOD_TABLE (MOD_0F18_REG_7
) },
2767 /* REG_0F1C_P_0_MOD_0 */
2769 { "cldemote", { Mb
}, 0 },
2770 { "nopQ", { Ev
}, 0 },
2771 { "nopQ", { Ev
}, 0 },
2772 { "nopQ", { Ev
}, 0 },
2773 { "nopQ", { Ev
}, 0 },
2774 { "nopQ", { Ev
}, 0 },
2775 { "nopQ", { Ev
}, 0 },
2776 { "nopQ", { Ev
}, 0 },
2778 /* REG_0F1E_P_1_MOD_3 */
2780 { "nopQ", { Ev
}, PREFIX_IGNORED
},
2781 { "rdsspK", { Edq
}, 0 },
2782 { "nopQ", { Ev
}, PREFIX_IGNORED
},
2783 { "nopQ", { Ev
}, PREFIX_IGNORED
},
2784 { "nopQ", { Ev
}, PREFIX_IGNORED
},
2785 { "nopQ", { Ev
}, PREFIX_IGNORED
},
2786 { "nopQ", { Ev
}, PREFIX_IGNORED
},
2787 { RM_TABLE (RM_0F1E_P_1_MOD_3_REG_7
) },
2789 /* REG_0F38D8_PREFIX_1 */
2791 { "aesencwide128kl", { M
}, 0 },
2792 { "aesdecwide128kl", { M
}, 0 },
2793 { "aesencwide256kl", { M
}, 0 },
2794 { "aesdecwide256kl", { M
}, 0 },
2796 /* REG_0F3A0F_PREFIX_1_MOD_3 */
2798 { RM_TABLE (RM_0F3A0F_P_1_MOD_3_REG_0
) },
2800 /* REG_0F71_MOD_0 */
2804 { "psrlw", { MS
, Ib
}, PREFIX_OPCODE
},
2806 { "psraw", { MS
, Ib
}, PREFIX_OPCODE
},
2808 { "psllw", { MS
, Ib
}, PREFIX_OPCODE
},
2810 /* REG_0F72_MOD_0 */
2814 { "psrld", { MS
, Ib
}, PREFIX_OPCODE
},
2816 { "psrad", { MS
, Ib
}, PREFIX_OPCODE
},
2818 { "pslld", { MS
, Ib
}, PREFIX_OPCODE
},
2820 /* REG_0F73_MOD_0 */
2824 { "psrlq", { MS
, Ib
}, PREFIX_OPCODE
},
2825 { "psrldq", { XS
, Ib
}, PREFIX_DATA
},
2828 { "psllq", { MS
, Ib
}, PREFIX_OPCODE
},
2829 { "pslldq", { XS
, Ib
}, PREFIX_DATA
},
2833 { "montmul", { { OP_0f07
, 0 } }, 0 },
2834 { "xsha1", { { OP_0f07
, 0 } }, 0 },
2835 { "xsha256", { { OP_0f07
, 0 } }, 0 },
2839 { "xstore-rng", { { OP_0f07
, 0 } }, 0 },
2840 { "xcrypt-ecb", { { OP_0f07
, 0 } }, 0 },
2841 { "xcrypt-cbc", { { OP_0f07
, 0 } }, 0 },
2842 { "xcrypt-ctr", { { OP_0f07
, 0 } }, 0 },
2843 { "xcrypt-cfb", { { OP_0f07
, 0 } }, 0 },
2844 { "xcrypt-ofb", { { OP_0f07
, 0 } }, 0 },
2848 { MOD_TABLE (MOD_0FAE_REG_0
) },
2849 { MOD_TABLE (MOD_0FAE_REG_1
) },
2850 { MOD_TABLE (MOD_0FAE_REG_2
) },
2851 { MOD_TABLE (MOD_0FAE_REG_3
) },
2852 { MOD_TABLE (MOD_0FAE_REG_4
) },
2853 { MOD_TABLE (MOD_0FAE_REG_5
) },
2854 { MOD_TABLE (MOD_0FAE_REG_6
) },
2855 { MOD_TABLE (MOD_0FAE_REG_7
) },
2863 { "btQ", { Ev
, Ib
}, 0 },
2864 { "btsQ", { Evh1
, Ib
}, 0 },
2865 { "btrQ", { Evh1
, Ib
}, 0 },
2866 { "btcQ", { Evh1
, Ib
}, 0 },
2871 { "cmpxchg8b", { { CMPXCHG8B_Fixup
, q_mode
} }, 0 },
2873 { MOD_TABLE (MOD_0FC7_REG_3
) },
2874 { MOD_TABLE (MOD_0FC7_REG_4
) },
2875 { MOD_TABLE (MOD_0FC7_REG_5
) },
2876 { MOD_TABLE (MOD_0FC7_REG_6
) },
2877 { MOD_TABLE (MOD_0FC7_REG_7
) },
2879 /* REG_VEX_0F71_M_0 */
2883 { "vpsrlw", { Vex
, XS
, Ib
}, PREFIX_DATA
},
2885 { "vpsraw", { Vex
, XS
, Ib
}, PREFIX_DATA
},
2887 { "vpsllw", { Vex
, XS
, Ib
}, PREFIX_DATA
},
2889 /* REG_VEX_0F72_M_0 */
2893 { "vpsrld", { Vex
, XS
, Ib
}, PREFIX_DATA
},
2895 { "vpsrad", { Vex
, XS
, Ib
}, PREFIX_DATA
},
2897 { "vpslld", { Vex
, XS
, Ib
}, PREFIX_DATA
},
2899 /* REG_VEX_0F73_M_0 */
2903 { "vpsrlq", { Vex
, XS
, Ib
}, PREFIX_DATA
},
2904 { "vpsrldq", { Vex
, XS
, Ib
}, PREFIX_DATA
},
2907 { "vpsllq", { Vex
, XS
, Ib
}, PREFIX_DATA
},
2908 { "vpslldq", { Vex
, XS
, Ib
}, PREFIX_DATA
},
2914 { MOD_TABLE (MOD_VEX_0FAE_REG_2
) },
2915 { MOD_TABLE (MOD_VEX_0FAE_REG_3
) },
2917 /* REG_VEX_0F3849_X86_64_P_0_W_0_M_1 */
2919 { RM_TABLE (RM_VEX_0F3849_X86_64_P_0_W_0_M_1_R_0
) },
2921 /* REG_VEX_0F38F3_L_0 */
2924 { "blsrS", { VexGdq
, Edq
}, PREFIX_OPCODE
},
2925 { "blsmskS", { VexGdq
, Edq
}, PREFIX_OPCODE
},
2926 { "blsiS", { VexGdq
, Edq
}, PREFIX_OPCODE
},
2928 /* REG_XOP_09_01_L_0 */
2931 { "blcfill", { VexGdq
, Edq
}, 0 },
2932 { "blsfill", { VexGdq
, Edq
}, 0 },
2933 { "blcs", { VexGdq
, Edq
}, 0 },
2934 { "tzmsk", { VexGdq
, Edq
}, 0 },
2935 { "blcic", { VexGdq
, Edq
}, 0 },
2936 { "blsic", { VexGdq
, Edq
}, 0 },
2937 { "t1mskc", { VexGdq
, Edq
}, 0 },
2939 /* REG_XOP_09_02_L_0 */
2942 { "blcmsk", { VexGdq
, Edq
}, 0 },
2947 { "blci", { VexGdq
, Edq
}, 0 },
2949 /* REG_XOP_09_12_M_1_L_0 */
2951 { "llwpcb", { Edq
}, 0 },
2952 { "slwpcb", { Edq
}, 0 },
2954 /* REG_XOP_0A_12_L_0 */
2956 { "lwpins", { VexGdq
, Ed
, Id
}, 0 },
2957 { "lwpval", { VexGdq
, Ed
, Id
}, 0 },
2960 #include "i386-dis-evex-reg.h"
2963 static const struct dis386 prefix_table
[][4] = {
2966 { "xchgS", { { NOP_Fixup
, 0 }, { NOP_Fixup
, 1 } }, 0 },
2967 { "pause", { XX
}, 0 },
2968 { "xchgS", { { NOP_Fixup
, 0 }, { NOP_Fixup
, 1 } }, 0 },
2969 { NULL
, { { NULL
, 0 } }, PREFIX_IGNORED
}
2972 /* PREFIX_0F01_REG_0_MOD_3_RM_6 */
2974 { "wrmsrns", { Skip_MODRM
}, 0 },
2975 { X86_64_TABLE (X86_64_0F01_REG_0_MOD_3_RM_6_P_1
) },
2977 { X86_64_TABLE (X86_64_0F01_REG_0_MOD_3_RM_6_P_3
) },
2980 /* PREFIX_0F01_REG_1_RM_4 */
2984 { "tdcall", { Skip_MODRM
}, 0 },
2988 /* PREFIX_0F01_REG_1_RM_5 */
2992 { X86_64_TABLE (X86_64_0F01_REG_1_RM_5_PREFIX_2
) },
2996 /* PREFIX_0F01_REG_1_RM_6 */
3000 { X86_64_TABLE (X86_64_0F01_REG_1_RM_6_PREFIX_2
) },
3004 /* PREFIX_0F01_REG_1_RM_7 */
3006 { "encls", { Skip_MODRM
}, 0 },
3008 { X86_64_TABLE (X86_64_0F01_REG_1_RM_7_PREFIX_2
) },
3012 /* PREFIX_0F01_REG_3_RM_1 */
3014 { "vmmcall", { Skip_MODRM
}, 0 },
3015 { "vmgexit", { Skip_MODRM
}, 0 },
3017 { "vmgexit", { Skip_MODRM
}, 0 },
3020 /* PREFIX_0F01_REG_5_MOD_0 */
3023 { "rstorssp", { Mq
}, PREFIX_OPCODE
},
3026 /* PREFIX_0F01_REG_5_MOD_3_RM_0 */
3028 { "serialize", { Skip_MODRM
}, PREFIX_OPCODE
},
3029 { "setssbsy", { Skip_MODRM
}, PREFIX_OPCODE
},
3031 { "xsusldtrk", { Skip_MODRM
}, PREFIX_OPCODE
},
3034 /* PREFIX_0F01_REG_5_MOD_3_RM_1 */
3039 { "xresldtrk", { Skip_MODRM
}, PREFIX_OPCODE
},
3042 /* PREFIX_0F01_REG_5_MOD_3_RM_2 */
3045 { "saveprevssp", { Skip_MODRM
}, PREFIX_OPCODE
},
3048 /* PREFIX_0F01_REG_5_MOD_3_RM_4 */
3051 { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_4_PREFIX_1
) },
3054 /* PREFIX_0F01_REG_5_MOD_3_RM_5 */
3057 { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_5_PREFIX_1
) },
3060 /* PREFIX_0F01_REG_5_MOD_3_RM_6 */
3062 { "rdpkru", { Skip_MODRM
}, 0 },
3063 { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_6_PREFIX_1
) },
3066 /* PREFIX_0F01_REG_5_MOD_3_RM_7 */
3068 { "wrpkru", { Skip_MODRM
}, 0 },
3069 { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_7_PREFIX_1
) },
3072 /* PREFIX_0F01_REG_7_MOD_3_RM_2 */
3074 { "monitorx", { { OP_Monitor
, 0 } }, 0 },
3075 { "mcommit", { Skip_MODRM
}, 0 },
3078 /* PREFIX_0F01_REG_7_MOD_3_RM_5 */
3080 { "rdpru", { Skip_MODRM
}, 0 },
3081 { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_5_PREFIX_1
) },
3084 /* PREFIX_0F01_REG_7_MOD_3_RM_6 */
3086 { "invlpgb", { Skip_MODRM
}, 0 },
3087 { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_1
) },
3089 { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3
) },
3092 /* PREFIX_0F01_REG_7_MOD_3_RM_7 */
3094 { "tlbsync", { Skip_MODRM
}, 0 },
3095 { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_7_PREFIX_1
) },
3097 { "pvalidate", { Skip_MODRM
}, 0 },
3102 { "wbinvd", { XX
}, 0 },
3103 { "wbnoinvd", { XX
}, 0 },
3108 { "movups", { XM
, EXx
}, PREFIX_OPCODE
},
3109 { "movss", { XM
, EXd
}, PREFIX_OPCODE
},
3110 { "movupd", { XM
, EXx
}, PREFIX_OPCODE
},
3111 { "movsd", { XM
, EXq
}, PREFIX_OPCODE
},
3116 { "movups", { EXxS
, XM
}, PREFIX_OPCODE
},
3117 { "movss", { EXdS
, XM
}, PREFIX_OPCODE
},
3118 { "movupd", { EXxS
, XM
}, PREFIX_OPCODE
},
3119 { "movsd", { EXqS
, XM
}, PREFIX_OPCODE
},
3124 { MOD_TABLE (MOD_0F12_PREFIX_0
) },
3125 { "movsldup", { XM
, EXx
}, PREFIX_OPCODE
},
3126 { MOD_TABLE (MOD_0F12_PREFIX_2
) },
3127 { "movddup", { XM
, EXq
}, PREFIX_OPCODE
},
3132 { MOD_TABLE (MOD_0F16_PREFIX_0
) },
3133 { "movshdup", { XM
, EXx
}, PREFIX_OPCODE
},
3134 { MOD_TABLE (MOD_0F16_PREFIX_2
) },
3137 /* PREFIX_0F18_REG_6_MOD_0_X86_64 */
3139 { "prefetchit1", { { PREFETCHI_Fixup
, b_mode
} }, 0 },
3140 { "nopQ", { Ev
}, 0 },
3141 { "nopQ", { Ev
}, 0 },
3142 { "nopQ", { Ev
}, 0 },
3145 /* PREFIX_0F18_REG_7_MOD_0_X86_64 */
3147 { "prefetchit0", { { PREFETCHI_Fixup
, b_mode
} }, 0 },
3148 { "nopQ", { Ev
}, 0 },
3149 { "nopQ", { Ev
}, 0 },
3150 { "nopQ", { Ev
}, 0 },
3155 { MOD_TABLE (MOD_0F1A_PREFIX_0
) },
3156 { "bndcl", { Gbnd
, Ev_bnd
}, 0 },
3157 { "bndmov", { Gbnd
, Ebnd
}, 0 },
3158 { "bndcu", { Gbnd
, Ev_bnd
}, 0 },
3163 { MOD_TABLE (MOD_0F1B_PREFIX_0
) },
3164 { MOD_TABLE (MOD_0F1B_PREFIX_1
) },
3165 { "bndmov", { EbndS
, Gbnd
}, 0 },
3166 { "bndcn", { Gbnd
, Ev_bnd
}, 0 },
3171 { MOD_TABLE (MOD_0F1C_PREFIX_0
) },
3172 { "nopQ", { Ev
}, PREFIX_IGNORED
},
3173 { "nopQ", { Ev
}, 0 },
3174 { "nopQ", { Ev
}, PREFIX_IGNORED
},
3179 { "nopQ", { Ev
}, 0 },
3180 { MOD_TABLE (MOD_0F1E_PREFIX_1
) },
3181 { "nopQ", { Ev
}, 0 },
3182 { NULL
, { XX
}, PREFIX_IGNORED
},
3187 { "cvtpi2ps", { XM
, EMCq
}, PREFIX_OPCODE
},
3188 { "cvtsi2ss{%LQ|}", { XM
, Edq
}, PREFIX_OPCODE
},
3189 { "cvtpi2pd", { XM
, EMCq
}, PREFIX_OPCODE
},
3190 { "cvtsi2sd{%LQ|}", { XM
, Edq
}, 0 },
3195 { MOD_TABLE (MOD_0F2B_PREFIX_0
) },
3196 { MOD_TABLE (MOD_0F2B_PREFIX_1
) },
3197 { MOD_TABLE (MOD_0F2B_PREFIX_2
) },
3198 { MOD_TABLE (MOD_0F2B_PREFIX_3
) },
3203 { "cvttps2pi", { MXC
, EXq
}, PREFIX_OPCODE
},
3204 { "cvttss2si", { Gdq
, EXd
}, PREFIX_OPCODE
},
3205 { "cvttpd2pi", { MXC
, EXx
}, PREFIX_OPCODE
},
3206 { "cvttsd2si", { Gdq
, EXq
}, PREFIX_OPCODE
},
3211 { "cvtps2pi", { MXC
, EXq
}, PREFIX_OPCODE
},
3212 { "cvtss2si", { Gdq
, EXd
}, PREFIX_OPCODE
},
3213 { "cvtpd2pi", { MXC
, EXx
}, PREFIX_OPCODE
},
3214 { "cvtsd2si", { Gdq
, EXq
}, PREFIX_OPCODE
},
3219 { "ucomiss",{ XM
, EXd
}, 0 },
3221 { "ucomisd",{ XM
, EXq
}, 0 },
3226 { "comiss", { XM
, EXd
}, 0 },
3228 { "comisd", { XM
, EXq
}, 0 },
3233 { "sqrtps", { XM
, EXx
}, PREFIX_OPCODE
},
3234 { "sqrtss", { XM
, EXd
}, PREFIX_OPCODE
},
3235 { "sqrtpd", { XM
, EXx
}, PREFIX_OPCODE
},
3236 { "sqrtsd", { XM
, EXq
}, PREFIX_OPCODE
},
3241 { "rsqrtps",{ XM
, EXx
}, PREFIX_OPCODE
},
3242 { "rsqrtss",{ XM
, EXd
}, PREFIX_OPCODE
},
3247 { "rcpps", { XM
, EXx
}, PREFIX_OPCODE
},
3248 { "rcpss", { XM
, EXd
}, PREFIX_OPCODE
},
3253 { "addps", { XM
, EXx
}, PREFIX_OPCODE
},
3254 { "addss", { XM
, EXd
}, PREFIX_OPCODE
},
3255 { "addpd", { XM
, EXx
}, PREFIX_OPCODE
},
3256 { "addsd", { XM
, EXq
}, PREFIX_OPCODE
},
3261 { "mulps", { XM
, EXx
}, PREFIX_OPCODE
},
3262 { "mulss", { XM
, EXd
}, PREFIX_OPCODE
},
3263 { "mulpd", { XM
, EXx
}, PREFIX_OPCODE
},
3264 { "mulsd", { XM
, EXq
}, PREFIX_OPCODE
},
3269 { "cvtps2pd", { XM
, EXq
}, PREFIX_OPCODE
},
3270 { "cvtss2sd", { XM
, EXd
}, PREFIX_OPCODE
},
3271 { "cvtpd2ps", { XM
, EXx
}, PREFIX_OPCODE
},
3272 { "cvtsd2ss", { XM
, EXq
}, PREFIX_OPCODE
},
3277 { "cvtdq2ps", { XM
, EXx
}, PREFIX_OPCODE
},
3278 { "cvttps2dq", { XM
, EXx
}, PREFIX_OPCODE
},
3279 { "cvtps2dq", { XM
, EXx
}, PREFIX_OPCODE
},
3284 { "subps", { XM
, EXx
}, PREFIX_OPCODE
},
3285 { "subss", { XM
, EXd
}, PREFIX_OPCODE
},
3286 { "subpd", { XM
, EXx
}, PREFIX_OPCODE
},
3287 { "subsd", { XM
, EXq
}, PREFIX_OPCODE
},
3292 { "minps", { XM
, EXx
}, PREFIX_OPCODE
},
3293 { "minss", { XM
, EXd
}, PREFIX_OPCODE
},
3294 { "minpd", { XM
, EXx
}, PREFIX_OPCODE
},
3295 { "minsd", { XM
, EXq
}, PREFIX_OPCODE
},
3300 { "divps", { XM
, EXx
}, PREFIX_OPCODE
},
3301 { "divss", { XM
, EXd
}, PREFIX_OPCODE
},
3302 { "divpd", { XM
, EXx
}, PREFIX_OPCODE
},
3303 { "divsd", { XM
, EXq
}, PREFIX_OPCODE
},
3308 { "maxps", { XM
, EXx
}, PREFIX_OPCODE
},
3309 { "maxss", { XM
, EXd
}, PREFIX_OPCODE
},
3310 { "maxpd", { XM
, EXx
}, PREFIX_OPCODE
},
3311 { "maxsd", { XM
, EXq
}, PREFIX_OPCODE
},
3316 { "punpcklbw",{ MX
, EMd
}, PREFIX_OPCODE
},
3318 { "punpcklbw",{ MX
, EMx
}, PREFIX_OPCODE
},
3323 { "punpcklwd",{ MX
, EMd
}, PREFIX_OPCODE
},
3325 { "punpcklwd",{ MX
, EMx
}, PREFIX_OPCODE
},
3330 { "punpckldq",{ MX
, EMd
}, PREFIX_OPCODE
},
3332 { "punpckldq",{ MX
, EMx
}, PREFIX_OPCODE
},
3337 { "movq", { MX
, EM
}, PREFIX_OPCODE
},
3338 { "movdqu", { XM
, EXx
}, PREFIX_OPCODE
},
3339 { "movdqa", { XM
, EXx
}, PREFIX_OPCODE
},
3344 { "pshufw", { MX
, EM
, Ib
}, PREFIX_OPCODE
},
3345 { "pshufhw",{ XM
, EXx
, Ib
}, PREFIX_OPCODE
},
3346 { "pshufd", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
3347 { "pshuflw",{ XM
, EXx
, Ib
}, PREFIX_OPCODE
},
3352 {"vmread", { Em
, Gm
}, 0 },
3354 {"extrq", { XS
, Ib
, Ib
}, 0 },
3355 {"insertq", { XM
, XS
, Ib
, Ib
}, 0 },
3360 {"vmwrite", { Gm
, Em
}, 0 },
3362 {"extrq", { XM
, XS
}, 0 },
3363 {"insertq", { XM
, XS
}, 0 },
3370 { "haddpd", { XM
, EXx
}, PREFIX_OPCODE
},
3371 { "haddps", { XM
, EXx
}, PREFIX_OPCODE
},
3378 { "hsubpd", { XM
, EXx
}, PREFIX_OPCODE
},
3379 { "hsubps", { XM
, EXx
}, PREFIX_OPCODE
},
3384 { "movK", { Edq
, MX
}, PREFIX_OPCODE
},
3385 { "movq", { XM
, EXq
}, PREFIX_OPCODE
},
3386 { "movK", { Edq
, XM
}, PREFIX_OPCODE
},
3391 { "movq", { EMS
, MX
}, PREFIX_OPCODE
},
3392 { "movdqu", { EXxS
, XM
}, PREFIX_OPCODE
},
3393 { "movdqa", { EXxS
, XM
}, PREFIX_OPCODE
},
3396 /* PREFIX_0FAE_REG_0_MOD_3 */
3399 { "rdfsbase", { Ev
}, 0 },
3402 /* PREFIX_0FAE_REG_1_MOD_3 */
3405 { "rdgsbase", { Ev
}, 0 },
3408 /* PREFIX_0FAE_REG_2_MOD_3 */
3411 { "wrfsbase", { Ev
}, 0 },
3414 /* PREFIX_0FAE_REG_3_MOD_3 */
3417 { "wrgsbase", { Ev
}, 0 },
3420 /* PREFIX_0FAE_REG_4_MOD_0 */
3422 { "xsave", { FXSAVE
}, 0 },
3423 { "ptwrite{%LQ|}", { Edq
}, 0 },
3426 /* PREFIX_0FAE_REG_4_MOD_3 */
3429 { "ptwrite{%LQ|}", { Edq
}, 0 },
3432 /* PREFIX_0FAE_REG_5_MOD_3 */
3434 { "lfence", { Skip_MODRM
}, 0 },
3435 { "incsspK", { Edq
}, PREFIX_OPCODE
},
3438 /* PREFIX_0FAE_REG_6_MOD_0 */
3440 { "xsaveopt", { FXSAVE
}, PREFIX_OPCODE
},
3441 { "clrssbsy", { Mq
}, PREFIX_OPCODE
},
3442 { "clwb", { Mb
}, PREFIX_OPCODE
},
3445 /* PREFIX_0FAE_REG_6_MOD_3 */
3447 { RM_TABLE (RM_0FAE_REG_6_MOD_3_P_0
) },
3448 { "umonitor", { Eva
}, PREFIX_OPCODE
},
3449 { "tpause", { Edq
}, PREFIX_OPCODE
},
3450 { "umwait", { Edq
}, PREFIX_OPCODE
},
3453 /* PREFIX_0FAE_REG_7_MOD_0 */
3455 { "clflush", { Mb
}, 0 },
3457 { "clflushopt", { Mb
}, 0 },
3463 { "popcntS", { Gv
, Ev
}, 0 },
3468 { "bsfS", { Gv
, Ev
}, 0 },
3469 { "tzcntS", { Gv
, Ev
}, 0 },
3470 { "bsfS", { Gv
, Ev
}, 0 },
3475 { "bsrS", { Gv
, Ev
}, 0 },
3476 { "lzcntS", { Gv
, Ev
}, 0 },
3477 { "bsrS", { Gv
, Ev
}, 0 },
3482 { "cmpps", { XM
, EXx
, CMP
}, PREFIX_OPCODE
},
3483 { "cmpss", { XM
, EXd
, CMP
}, PREFIX_OPCODE
},
3484 { "cmppd", { XM
, EXx
, CMP
}, PREFIX_OPCODE
},
3485 { "cmpsd", { XM
, EXq
, CMP
}, PREFIX_OPCODE
},
3488 /* PREFIX_0FC7_REG_6_MOD_0 */
3490 { "vmptrld",{ Mq
}, 0 },
3491 { "vmxon", { Mq
}, 0 },
3492 { "vmclear",{ Mq
}, 0 },
3495 /* PREFIX_0FC7_REG_6_MOD_3 */
3497 { "rdrand", { Ev
}, 0 },
3498 { X86_64_TABLE (X86_64_0FC7_REG_6_MOD_3_PREFIX_1
) },
3499 { "rdrand", { Ev
}, 0 }
3502 /* PREFIX_0FC7_REG_7_MOD_3 */
3504 { "rdseed", { Ev
}, 0 },
3505 { "rdpid", { Em
}, 0 },
3506 { "rdseed", { Ev
}, 0 },
3513 { "addsubpd", { XM
, EXx
}, 0 },
3514 { "addsubps", { XM
, EXx
}, 0 },
3520 { "movq2dq",{ XM
, MS
}, 0 },
3521 { "movq", { EXqS
, XM
}, 0 },
3522 { "movdq2q",{ MX
, XS
}, 0 },
3528 { "cvtdq2pd", { XM
, EXq
}, PREFIX_OPCODE
},
3529 { "cvttpd2dq", { XM
, EXx
}, PREFIX_OPCODE
},
3530 { "cvtpd2dq", { XM
, EXx
}, PREFIX_OPCODE
},
3535 { "movntq", { Mq
, MX
}, PREFIX_OPCODE
},
3537 { MOD_TABLE (MOD_0FE7_PREFIX_2
) },
3545 { MOD_TABLE (MOD_0FF0_PREFIX_3
) },
3550 { "maskmovq", { MX
, MS
}, PREFIX_OPCODE
},
3552 { "maskmovdqu", { XM
, XS
}, PREFIX_OPCODE
},
3558 { REG_TABLE (REG_0F38D8_PREFIX_1
) },
3564 { MOD_TABLE (MOD_0F38DC_PREFIX_1
) },
3565 { "aesenc", { XM
, EXx
}, 0 },
3571 { MOD_TABLE (MOD_0F38DD_PREFIX_1
) },
3572 { "aesenclast", { XM
, EXx
}, 0 },
3578 { MOD_TABLE (MOD_0F38DE_PREFIX_1
) },
3579 { "aesdec", { XM
, EXx
}, 0 },
3585 { MOD_TABLE (MOD_0F38DF_PREFIX_1
) },
3586 { "aesdeclast", { XM
, EXx
}, 0 },
3591 { "movbeS", { Gv
, Mv
}, PREFIX_OPCODE
},
3593 { "movbeS", { Gv
, Mv
}, PREFIX_OPCODE
},
3594 { "crc32A", { Gdq
, Eb
}, PREFIX_OPCODE
},
3599 { "movbeS", { Mv
, Gv
}, PREFIX_OPCODE
},
3601 { "movbeS", { Mv
, Gv
}, PREFIX_OPCODE
},
3602 { "crc32Q", { Gdq
, Ev
}, PREFIX_OPCODE
},
3607 { MOD_TABLE (MOD_0F38F6_PREFIX_0
) },
3608 { "adoxS", { Gdq
, Edq
}, PREFIX_OPCODE
},
3609 { "adcxS", { Gdq
, Edq
}, PREFIX_OPCODE
},
3616 { MOD_TABLE (MOD_0F38F8_PREFIX_1
) },
3617 { MOD_TABLE (MOD_0F38F8_PREFIX_2
) },
3618 { MOD_TABLE (MOD_0F38F8_PREFIX_3
) },
3623 { MOD_TABLE (MOD_0F38FA_PREFIX_1
) },
3629 { MOD_TABLE (MOD_0F38FB_PREFIX_1
) },
3634 { "aadd", { Mdq
, Gdq
}, 0 },
3635 { "axor", { Mdq
, Gdq
}, 0 },
3636 { "aand", { Mdq
, Gdq
}, 0 },
3637 { "aor", { Mdq
, Gdq
}, 0 },
3643 { MOD_TABLE (MOD_0F3A0F_PREFIX_1
)},
3646 /* PREFIX_VEX_0F10 */
3648 { "%XEvmovupX", { XM
, EXEvexXNoBcst
}, 0 },
3649 { "%XEvmovs%XS", { XMScalar
, VexScalarR
, EXd
}, 0 },
3650 { "%XEvmovupX", { XM
, EXEvexXNoBcst
}, 0 },
3651 { "%XEvmovs%XD", { XMScalar
, VexScalarR
, EXq
}, 0 },
3654 /* PREFIX_VEX_0F11 */
3656 { "%XEvmovupX", { EXxS
, XM
}, 0 },
3657 { "%XEvmovs%XS", { EXdS
, VexScalarR
, XMScalar
}, 0 },
3658 { "%XEvmovupX", { EXxS
, XM
}, 0 },
3659 { "%XEvmovs%XD", { EXqS
, VexScalarR
, XMScalar
}, 0 },
3662 /* PREFIX_VEX_0F12 */
3664 { MOD_TABLE (MOD_VEX_0F12_PREFIX_0
) },
3665 { "%XEvmov%XSldup", { XM
, EXEvexXNoBcst
}, 0 },
3666 { MOD_TABLE (MOD_VEX_0F12_PREFIX_2
) },
3667 { "%XEvmov%XDdup", { XM
, EXymmq
}, 0 },
3670 /* PREFIX_VEX_0F16 */
3672 { MOD_TABLE (MOD_VEX_0F16_PREFIX_0
) },
3673 { "%XEvmov%XShdup", { XM
, EXEvexXNoBcst
}, 0 },
3674 { MOD_TABLE (MOD_VEX_0F16_PREFIX_2
) },
3677 /* PREFIX_VEX_0F2A */
3680 { "%XEvcvtsi2ss{%LQ|}", { XMScalar
, VexScalar
, EXxEVexR
, Edq
}, 0 },
3682 { "%XEvcvtsi2sd{%LQ|}", { XMScalar
, VexScalar
, EXxEVexR64
, Edq
}, 0 },
3685 /* PREFIX_VEX_0F2C */
3688 { "%XEvcvttss2si", { Gdq
, EXd
, EXxEVexS
}, 0 },
3690 { "%XEvcvttsd2si", { Gdq
, EXq
, EXxEVexS
}, 0 },
3693 /* PREFIX_VEX_0F2D */
3696 { "%XEvcvtss2si", { Gdq
, EXd
, EXxEVexR
}, 0 },
3698 { "%XEvcvtsd2si", { Gdq
, EXq
, EXxEVexR
}, 0 },
3701 /* PREFIX_VEX_0F2E */
3703 { "%XEvucomisX", { XMScalar
, EXd
, EXxEVexS
}, 0 },
3705 { "%XEvucomisX", { XMScalar
, EXq
, EXxEVexS
}, 0 },
3708 /* PREFIX_VEX_0F2F */
3710 { "%XEvcomisX", { XMScalar
, EXd
, EXxEVexS
}, 0 },
3712 { "%XEvcomisX", { XMScalar
, EXq
, EXxEVexS
}, 0 },
3715 /* PREFIX_VEX_0F41_L_1_M_1_W_0 */
3717 { "kandw", { MaskG
, MaskVex
, MaskE
}, 0 },
3719 { "kandb", { MaskG
, MaskVex
, MaskE
}, 0 },
3722 /* PREFIX_VEX_0F41_L_1_M_1_W_1 */
3724 { "kandq", { MaskG
, MaskVex
, MaskE
}, 0 },
3726 { "kandd", { MaskG
, MaskVex
, MaskE
}, 0 },
3729 /* PREFIX_VEX_0F42_L_1_M_1_W_0 */
3731 { "kandnw", { MaskG
, MaskVex
, MaskE
}, 0 },
3733 { "kandnb", { MaskG
, MaskVex
, MaskE
}, 0 },
3736 /* PREFIX_VEX_0F42_L_1_M_1_W_1 */
3738 { "kandnq", { MaskG
, MaskVex
, MaskE
}, 0 },
3740 { "kandnd", { MaskG
, MaskVex
, MaskE
}, 0 },
3743 /* PREFIX_VEX_0F44_L_0_M_1_W_0 */
3745 { "knotw", { MaskG
, MaskE
}, 0 },
3747 { "knotb", { MaskG
, MaskE
}, 0 },
3750 /* PREFIX_VEX_0F44_L_0_M_1_W_1 */
3752 { "knotq", { MaskG
, MaskE
}, 0 },
3754 { "knotd", { MaskG
, MaskE
}, 0 },
3757 /* PREFIX_VEX_0F45_L_1_M_1_W_0 */
3759 { "korw", { MaskG
, MaskVex
, MaskE
}, 0 },
3761 { "korb", { MaskG
, MaskVex
, MaskE
}, 0 },
3764 /* PREFIX_VEX_0F45_L_1_M_1_W_1 */
3766 { "korq", { MaskG
, MaskVex
, MaskE
}, 0 },
3768 { "kord", { MaskG
, MaskVex
, MaskE
}, 0 },
3771 /* PREFIX_VEX_0F46_L_1_M_1_W_0 */
3773 { "kxnorw", { MaskG
, MaskVex
, MaskE
}, 0 },
3775 { "kxnorb", { MaskG
, MaskVex
, MaskE
}, 0 },
3778 /* PREFIX_VEX_0F46_L_1_M_1_W_1 */
3780 { "kxnorq", { MaskG
, MaskVex
, MaskE
}, 0 },
3782 { "kxnord", { MaskG
, MaskVex
, MaskE
}, 0 },
3785 /* PREFIX_VEX_0F47_L_1_M_1_W_0 */
3787 { "kxorw", { MaskG
, MaskVex
, MaskE
}, 0 },
3789 { "kxorb", { MaskG
, MaskVex
, MaskE
}, 0 },
3792 /* PREFIX_VEX_0F47_L_1_M_1_W_1 */
3794 { "kxorq", { MaskG
, MaskVex
, MaskE
}, 0 },
3796 { "kxord", { MaskG
, MaskVex
, MaskE
}, 0 },
3799 /* PREFIX_VEX_0F4A_L_1_M_1_W_0 */
3801 { "kaddw", { MaskG
, MaskVex
, MaskE
}, 0 },
3803 { "kaddb", { MaskG
, MaskVex
, MaskE
}, 0 },
3806 /* PREFIX_VEX_0F4A_L_1_M_1_W_1 */
3808 { "kaddq", { MaskG
, MaskVex
, MaskE
}, 0 },
3810 { "kaddd", { MaskG
, MaskVex
, MaskE
}, 0 },
3813 /* PREFIX_VEX_0F4B_L_1_M_1_W_0 */
3815 { "kunpckwd", { MaskG
, MaskVex
, MaskE
}, 0 },
3817 { "kunpckbw", { MaskG
, MaskVex
, MaskE
}, 0 },
3820 /* PREFIX_VEX_0F4B_L_1_M_1_W_1 */
3822 { "kunpckdq", { MaskG
, MaskVex
, MaskE
}, 0 },
3825 /* PREFIX_VEX_0F51 */
3827 { "%XEvsqrtpX", { XM
, EXx
, EXxEVexR
}, 0 },
3828 { "%XEvsqrts%XS", { XMScalar
, VexScalar
, EXd
, EXxEVexR
}, 0 },
3829 { "%XEvsqrtpX", { XM
, EXx
, EXxEVexR
}, 0 },
3830 { "%XEvsqrts%XD", { XMScalar
, VexScalar
, EXq
, EXxEVexR
}, 0 },
3833 /* PREFIX_VEX_0F52 */
3835 { "vrsqrtps", { XM
, EXx
}, 0 },
3836 { "vrsqrtss", { XMScalar
, VexScalar
, EXd
}, 0 },
3839 /* PREFIX_VEX_0F53 */
3841 { "vrcpps", { XM
, EXx
}, 0 },
3842 { "vrcpss", { XMScalar
, VexScalar
, EXd
}, 0 },
3845 /* PREFIX_VEX_0F58 */
3847 { "%XEvaddpX", { XM
, Vex
, EXx
, EXxEVexR
}, 0 },
3848 { "%XEvadds%XS", { XMScalar
, VexScalar
, EXd
, EXxEVexR
}, 0 },
3849 { "%XEvaddpX", { XM
, Vex
, EXx
, EXxEVexR
}, 0 },
3850 { "%XEvadds%XD", { XMScalar
, VexScalar
, EXq
, EXxEVexR
}, 0 },
3853 /* PREFIX_VEX_0F59 */
3855 { "%XEvmulpX", { XM
, Vex
, EXx
, EXxEVexR
}, 0 },
3856 { "%XEvmuls%XS", { XMScalar
, VexScalar
, EXd
, EXxEVexR
}, 0 },
3857 { "%XEvmulpX", { XM
, Vex
, EXx
, EXxEVexR
}, 0 },
3858 { "%XEvmuls%XD", { XMScalar
, VexScalar
, EXq
, EXxEVexR
}, 0 },
3861 /* PREFIX_VEX_0F5A */
3863 { "%XEvcvtp%XS2pd", { XM
, EXEvexHalfBcstXmmq
, EXxEVexS
}, 0 },
3864 { "%XEvcvts%XS2sd", { XMScalar
, VexScalar
, EXd
, EXxEVexS
}, 0 },
3865 { "%XEvcvtp%XD2ps%XY", { XMxmmq
, EXx
, EXxEVexR
}, 0 },
3866 { "%XEvcvts%XD2ss", { XMScalar
, VexScalar
, EXq
, EXxEVexR
}, 0 },
3869 /* PREFIX_VEX_0F5B */
3871 { "vcvtdq2ps", { XM
, EXx
}, 0 },
3872 { "vcvttps2dq", { XM
, EXx
}, 0 },
3873 { "vcvtps2dq", { XM
, EXx
}, 0 },
3876 /* PREFIX_VEX_0F5C */
3878 { "%XEvsubpX", { XM
, Vex
, EXx
, EXxEVexR
}, 0 },
3879 { "%XEvsubs%XS", { XMScalar
, VexScalar
, EXd
, EXxEVexR
}, 0 },
3880 { "%XEvsubpX", { XM
, Vex
, EXx
, EXxEVexR
}, 0 },
3881 { "%XEvsubs%XD", { XMScalar
, VexScalar
, EXq
, EXxEVexR
}, 0 },
3884 /* PREFIX_VEX_0F5D */
3886 { "%XEvminpX", { XM
, Vex
, EXx
, EXxEVexS
}, 0 },
3887 { "%XEvmins%XS", { XMScalar
, VexScalar
, EXd
, EXxEVexS
}, 0 },
3888 { "%XEvminpX", { XM
, Vex
, EXx
, EXxEVexS
}, 0 },
3889 { "%XEvmins%XD", { XMScalar
, VexScalar
, EXq
, EXxEVexS
}, 0 },
3892 /* PREFIX_VEX_0F5E */
3894 { "%XEvdivpX", { XM
, Vex
, EXx
, EXxEVexR
}, 0 },
3895 { "%XEvdivs%XS", { XMScalar
, VexScalar
, EXd
, EXxEVexR
}, 0 },
3896 { "%XEvdivpX", { XM
, Vex
, EXx
, EXxEVexR
}, 0 },
3897 { "%XEvdivs%XD", { XMScalar
, VexScalar
, EXq
, EXxEVexR
}, 0 },
3900 /* PREFIX_VEX_0F5F */
3902 { "%XEvmaxpX", { XM
, Vex
, EXx
, EXxEVexS
}, 0 },
3903 { "%XEvmaxs%XS", { XMScalar
, VexScalar
, EXd
, EXxEVexS
}, 0 },
3904 { "%XEvmaxpX", { XM
, Vex
, EXx
, EXxEVexS
}, 0 },
3905 { "%XEvmaxs%XD", { XMScalar
, VexScalar
, EXq
, EXxEVexS
}, 0 },
3908 /* PREFIX_VEX_0F6F */
3911 { "vmovdqu", { XM
, EXx
}, 0 },
3912 { "vmovdqa", { XM
, EXx
}, 0 },
3915 /* PREFIX_VEX_0F70 */
3918 { "vpshufhw", { XM
, EXx
, Ib
}, 0 },
3919 { "vpshufd", { XM
, EXx
, Ib
}, 0 },
3920 { "vpshuflw", { XM
, EXx
, Ib
}, 0 },
3923 /* PREFIX_VEX_0F7C */
3927 { "vhaddpd", { XM
, Vex
, EXx
}, 0 },
3928 { "vhaddps", { XM
, Vex
, EXx
}, 0 },
3931 /* PREFIX_VEX_0F7D */
3935 { "vhsubpd", { XM
, Vex
, EXx
}, 0 },
3936 { "vhsubps", { XM
, Vex
, EXx
}, 0 },
3939 /* PREFIX_VEX_0F7E */
3942 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_1
) },
3943 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_2
) },
3946 /* PREFIX_VEX_0F7F */
3949 { "vmovdqu", { EXxS
, XM
}, 0 },
3950 { "vmovdqa", { EXxS
, XM
}, 0 },
3953 /* PREFIX_VEX_0F90_L_0_W_0 */
3955 { "kmovw", { MaskG
, MaskE
}, 0 },
3957 { "kmovb", { MaskG
, MaskBDE
}, 0 },
3960 /* PREFIX_VEX_0F90_L_0_W_1 */
3962 { "kmovq", { MaskG
, MaskE
}, 0 },
3964 { "kmovd", { MaskG
, MaskBDE
}, 0 },
3967 /* PREFIX_VEX_0F91_L_0_M_0_W_0 */
3969 { "kmovw", { Ew
, MaskG
}, 0 },
3971 { "kmovb", { Eb
, MaskG
}, 0 },
3974 /* PREFIX_VEX_0F91_L_0_M_0_W_1 */
3976 { "kmovq", { Eq
, MaskG
}, 0 },
3978 { "kmovd", { Ed
, MaskG
}, 0 },
3981 /* PREFIX_VEX_0F92_L_0_M_1_W_0 */
3983 { "kmovw", { MaskG
, Edq
}, 0 },
3985 { "kmovb", { MaskG
, Edq
}, 0 },
3986 { "kmovd", { MaskG
, Edq
}, 0 },
3989 /* PREFIX_VEX_0F92_L_0_M_1_W_1 */
3994 { "kmovK", { MaskG
, Edq
}, 0 },
3997 /* PREFIX_VEX_0F93_L_0_M_1_W_0 */
3999 { "kmovw", { Gdq
, MaskE
}, 0 },
4001 { "kmovb", { Gdq
, MaskE
}, 0 },
4002 { "kmovd", { Gdq
, MaskE
}, 0 },
4005 /* PREFIX_VEX_0F93_L_0_M_1_W_1 */
4010 { "kmovK", { Gdq
, MaskE
}, 0 },
4013 /* PREFIX_VEX_0F98_L_0_M_1_W_0 */
4015 { "kortestw", { MaskG
, MaskE
}, 0 },
4017 { "kortestb", { MaskG
, MaskE
}, 0 },
4020 /* PREFIX_VEX_0F98_L_0_M_1_W_1 */
4022 { "kortestq", { MaskG
, MaskE
}, 0 },
4024 { "kortestd", { MaskG
, MaskE
}, 0 },
4027 /* PREFIX_VEX_0F99_L_0_M_1_W_0 */
4029 { "ktestw", { MaskG
, MaskE
}, 0 },
4031 { "ktestb", { MaskG
, MaskE
}, 0 },
4034 /* PREFIX_VEX_0F99_L_0_M_1_W_1 */
4036 { "ktestq", { MaskG
, MaskE
}, 0 },
4038 { "ktestd", { MaskG
, MaskE
}, 0 },
4041 /* PREFIX_VEX_0FC2 */
4043 { "vcmpps", { XM
, Vex
, EXx
, CMP
}, 0 },
4044 { "vcmpss", { XMScalar
, VexScalar
, EXd
, CMP
}, 0 },
4045 { "vcmppd", { XM
, Vex
, EXx
, CMP
}, 0 },
4046 { "vcmpsd", { XMScalar
, VexScalar
, EXq
, CMP
}, 0 },
4049 /* PREFIX_VEX_0FD0 */
4053 { "vaddsubpd", { XM
, Vex
, EXx
}, 0 },
4054 { "vaddsubps", { XM
, Vex
, EXx
}, 0 },
4057 /* PREFIX_VEX_0FE6 */
4060 { "vcvtdq2pd", { XM
, EXxmmq
}, 0 },
4061 { "vcvttpd2dq%XY", { XMM
, EXx
}, 0 },
4062 { "vcvtpd2dq%XY", { XMM
, EXx
}, 0 },
4065 /* PREFIX_VEX_0FF0 */
4070 { MOD_TABLE (MOD_VEX_0FF0_PREFIX_3
) },
4073 /* PREFIX_VEX_0F3849_X86_64 */
4075 { VEX_W_TABLE (VEX_W_0F3849_X86_64_P_0
) },
4077 { VEX_W_TABLE (VEX_W_0F3849_X86_64_P_2
) },
4078 { VEX_W_TABLE (VEX_W_0F3849_X86_64_P_3
) },
4081 /* PREFIX_VEX_0F384B_X86_64 */
4084 { VEX_W_TABLE (VEX_W_0F384B_X86_64_P_1
) },
4085 { VEX_W_TABLE (VEX_W_0F384B_X86_64_P_2
) },
4086 { VEX_W_TABLE (VEX_W_0F384B_X86_64_P_3
) },
4089 /* PREFIX_VEX_0F3850_W_0 */
4091 { "vpdpbuud", { XM
, Vex
, EXx
}, 0 },
4092 { "vpdpbsud", { XM
, Vex
, EXx
}, 0 },
4093 { "%XVvpdpbusd", { XM
, Vex
, EXx
}, 0 },
4094 { "vpdpbssd", { XM
, Vex
, EXx
}, 0 },
4097 /* PREFIX_VEX_0F3851_W_0 */
4099 { "vpdpbuuds", { XM
, Vex
, EXx
}, 0 },
4100 { "vpdpbsuds", { XM
, Vex
, EXx
}, 0 },
4101 { "%XVvpdpbusds", { XM
, Vex
, EXx
}, 0 },
4102 { "vpdpbssds", { XM
, Vex
, EXx
}, 0 },
4104 /* PREFIX_VEX_0F385C_X86_64 */
4107 { VEX_W_TABLE (VEX_W_0F385C_X86_64_P_1
) },
4109 { VEX_W_TABLE (VEX_W_0F385C_X86_64_P_3
) },
4112 /* PREFIX_VEX_0F385E_X86_64 */
4114 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_0
) },
4115 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_1
) },
4116 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_2
) },
4117 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_3
) },
4120 /* PREFIX_VEX_0F3872 */
4123 { VEX_W_TABLE (VEX_W_0F3872_P_1
) },
4126 /* PREFIX_VEX_0F38B0_W_0 */
4128 { "vcvtneoph2ps", { XM
, Mx
}, 0 },
4129 { "vcvtneebf162ps", { XM
, Mx
}, 0 },
4130 { "vcvtneeph2ps", { XM
, Mx
}, 0 },
4131 { "vcvtneobf162ps", { XM
, Mx
}, 0 },
4134 /* PREFIX_VEX_0F38B1_W_0 */
4137 { "vbcstnebf162ps", { XM
, Mw
}, 0 },
4138 { "vbcstnesh2ps", { XM
, Mw
}, 0 },
4141 /* PREFIX_VEX_0F38F5_L_0 */
4143 { "bzhiS", { Gdq
, Edq
, VexGdq
}, 0 },
4144 { "pextS", { Gdq
, VexGdq
, Edq
}, 0 },
4146 { "pdepS", { Gdq
, VexGdq
, Edq
}, 0 },
4149 /* PREFIX_VEX_0F38F6_L_0 */
4154 { "mulxS", { Gdq
, VexGdq
, Edq
}, 0 },
4157 /* PREFIX_VEX_0F38F7_L_0 */
4159 { "bextrS", { Gdq
, Edq
, VexGdq
}, 0 },
4160 { "sarxS", { Gdq
, Edq
, VexGdq
}, 0 },
4161 { "shlxS", { Gdq
, Edq
, VexGdq
}, 0 },
4162 { "shrxS", { Gdq
, Edq
, VexGdq
}, 0 },
4165 /* PREFIX_VEX_0F3AF0_L_0 */
4170 { "rorxS", { Gdq
, Edq
, Ib
}, 0 },
4173 #include "i386-dis-evex-prefix.h"
4176 static const struct dis386 x86_64_table
[][2] = {
4179 { "pushP", { es
}, 0 },
4184 { "popP", { es
}, 0 },
4189 { "pushP", { cs
}, 0 },
4194 { "pushP", { ss
}, 0 },
4199 { "popP", { ss
}, 0 },
4204 { "pushP", { ds
}, 0 },
4209 { "popP", { ds
}, 0 },
4214 { "daa", { XX
}, 0 },
4219 { "das", { XX
}, 0 },
4224 { "aaa", { XX
}, 0 },
4229 { "aas", { XX
}, 0 },
4234 { "pushaP", { XX
}, 0 },
4239 { "popaP", { XX
}, 0 },
4244 { MOD_TABLE (MOD_62_32BIT
) },
4245 { EVEX_TABLE (EVEX_0F
) },
4250 { "arpl", { Ew
, Gw
}, 0 },
4251 { "movs", { Gv
, { MOVSXD_Fixup
, movsxd_mode
} }, 0 },
4256 { "ins{R|}", { Yzr
, indirDX
}, 0 },
4257 { "ins{G|}", { Yzr
, indirDX
}, 0 },
4262 { "outs{R|}", { indirDXr
, Xz
}, 0 },
4263 { "outs{G|}", { indirDXr
, Xz
}, 0 },
4268 /* Opcode 0x82 is an alias of opcode 0x80 in 32-bit mode. */
4269 { REG_TABLE (REG_80
) },
4274 { "{l|}call{P|}", { Ap
}, 0 },
4279 { "retP", { Iw
, BND
}, 0 },
4280 { "ret@", { Iw
, BND
}, 0 },
4285 { "retP", { BND
}, 0 },
4286 { "ret@", { BND
}, 0 },
4291 { MOD_TABLE (MOD_C4_32BIT
) },
4292 { VEX_C4_TABLE (VEX_0F
) },
4297 { MOD_TABLE (MOD_C5_32BIT
) },
4298 { VEX_C5_TABLE (VEX_0F
) },
4303 { "into", { XX
}, 0 },
4308 { "aam", { Ib
}, 0 },
4313 { "aad", { Ib
}, 0 },
4318 { "callP", { Jv
, BND
}, 0 },
4319 { "call@", { Jv
, BND
}, 0 }
4324 { "jmpP", { Jv
, BND
}, 0 },
4325 { "jmp@", { Jv
, BND
}, 0 }
4330 { "{l|}jmp{P|}", { Ap
}, 0 },
4333 /* X86_64_0F01_REG_0 */
4335 { "sgdt{Q|Q}", { M
}, 0 },
4336 { "sgdt", { M
}, 0 },
4339 /* X86_64_0F01_REG_0_MOD_3_RM_6_P_1 */
4342 { "wrmsrlist", { Skip_MODRM
}, 0 },
4345 /* X86_64_0F01_REG_0_MOD_3_RM_6_P_3 */
4348 { "rdmsrlist", { Skip_MODRM
}, 0 },
4351 /* X86_64_0F01_REG_1 */
4353 { "sidt{Q|Q}", { M
}, 0 },
4354 { "sidt", { M
}, 0 },
4357 /* X86_64_0F01_REG_1_RM_5_PREFIX_2 */
4360 { "seamret", { Skip_MODRM
}, 0 },
4363 /* X86_64_0F01_REG_1_RM_6_PREFIX_2 */
4366 { "seamops", { Skip_MODRM
}, 0 },
4369 /* X86_64_0F01_REG_1_RM_7_PREFIX_2 */
4372 { "seamcall", { Skip_MODRM
}, 0 },
4375 /* X86_64_0F01_REG_2 */
4377 { "lgdt{Q|Q}", { M
}, 0 },
4378 { "lgdt", { M
}, 0 },
4381 /* X86_64_0F01_REG_3 */
4383 { "lidt{Q|Q}", { M
}, 0 },
4384 { "lidt", { M
}, 0 },
4387 /* X86_64_0F01_REG_5_MOD_3_RM_4_PREFIX_1 */
4390 { "uiret", { Skip_MODRM
}, 0 },
4393 /* X86_64_0F01_REG_5_MOD_3_RM_5_PREFIX_1 */
4396 { "testui", { Skip_MODRM
}, 0 },
4399 /* X86_64_0F01_REG_5_MOD_3_RM_6_PREFIX_1 */
4402 { "clui", { Skip_MODRM
}, 0 },
4405 /* X86_64_0F01_REG_5_MOD_3_RM_7_PREFIX_1 */
4408 { "stui", { Skip_MODRM
}, 0 },
4411 /* X86_64_0F01_REG_7_MOD_3_RM_5_PREFIX_1 */
4414 { "rmpquery", { Skip_MODRM
}, 0 },
4417 /* X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_1 */
4420 { "rmpadjust", { Skip_MODRM
}, 0 },
4423 /* X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3 */
4426 { "rmpupdate", { Skip_MODRM
}, 0 },
4429 /* X86_64_0F01_REG_7_MOD_3_RM_7_PREFIX_1 */
4432 { "psmash", { Skip_MODRM
}, 0 },
4435 /* X86_64_0F18_REG_6_MOD_0 */
4437 { "nopQ", { Ev
}, 0 },
4438 { PREFIX_TABLE (PREFIX_0F18_REG_6_MOD_0_X86_64
) },
4441 /* X86_64_0F18_REG_7_MOD_0 */
4443 { "nopQ", { Ev
}, 0 },
4444 { PREFIX_TABLE (PREFIX_0F18_REG_7_MOD_0_X86_64
) },
4449 { "movZ", { Em
, Td
}, 0 },
4454 { "movZ", { Td
, Em
}, 0 },
4457 /* X86_64_0FC7_REG_6_MOD_3_PREFIX_1 */
4460 { "senduipi", { Eq
}, 0 },
4463 /* X86_64_VEX_0F3849 */
4466 { PREFIX_TABLE (PREFIX_VEX_0F3849_X86_64
) },
4469 /* X86_64_VEX_0F384B */
4472 { PREFIX_TABLE (PREFIX_VEX_0F384B_X86_64
) },
4475 /* X86_64_VEX_0F385C */
4478 { PREFIX_TABLE (PREFIX_VEX_0F385C_X86_64
) },
4481 /* X86_64_VEX_0F385E */
4484 { PREFIX_TABLE (PREFIX_VEX_0F385E_X86_64
) },
4487 /* X86_64_VEX_0F38E0 */
4490 { "cmpoxadd", { Mdq
, Gdq
, VexGdq
}, PREFIX_DATA
},
4493 /* X86_64_VEX_0F38E1 */
4496 { "cmpnoxadd", { Mdq
, Gdq
, VexGdq
}, PREFIX_DATA
},
4499 /* X86_64_VEX_0F38E2 */
4502 { "cmpbxadd", { Mdq
, Gdq
, VexGdq
}, PREFIX_DATA
},
4505 /* X86_64_VEX_0F38E3 */
4508 { "cmpnbxadd", { Mdq
, Gdq
, VexGdq
}, PREFIX_DATA
},
4511 /* X86_64_VEX_0F38E4 */
4514 { "cmpzxadd", { Mdq
, Gdq
, VexGdq
}, PREFIX_DATA
},
4517 /* X86_64_VEX_0F38E5 */
4520 { "cmpnzxadd", { Mdq
, Gdq
, VexGdq
}, PREFIX_DATA
},
4523 /* X86_64_VEX_0F38E6 */
4526 { "cmpbexadd", { Mdq
, Gdq
, VexGdq
}, PREFIX_DATA
},
4529 /* X86_64_VEX_0F38E7 */
4532 { "cmpnbexadd", { Mdq
, Gdq
, VexGdq
}, PREFIX_DATA
},
4535 /* X86_64_VEX_0F38E8 */
4538 { "cmpsxadd", { Mdq
, Gdq
, VexGdq
}, PREFIX_DATA
},
4541 /* X86_64_VEX_0F38E9 */
4544 { "cmpnsxadd", { Mdq
, Gdq
, VexGdq
}, PREFIX_DATA
},
4547 /* X86_64_VEX_0F38EA */
4550 { "cmppxadd", { Mdq
, Gdq
, VexGdq
}, PREFIX_DATA
},
4553 /* X86_64_VEX_0F38EB */
4556 { "cmpnpxadd", { Mdq
, Gdq
, VexGdq
}, PREFIX_DATA
},
4559 /* X86_64_VEX_0F38EC */
4562 { "cmplxadd", { Mdq
, Gdq
, VexGdq
}, PREFIX_DATA
},
4565 /* X86_64_VEX_0F38ED */
4568 { "cmpnlxadd", { Mdq
, Gdq
, VexGdq
}, PREFIX_DATA
},
4571 /* X86_64_VEX_0F38EE */
4574 { "cmplexadd", { Mdq
, Gdq
, VexGdq
}, PREFIX_DATA
},
4577 /* X86_64_VEX_0F38EF */
4580 { "cmpnlexadd", { Mdq
, Gdq
, VexGdq
}, PREFIX_DATA
},
4584 static const struct dis386 three_byte_table
[][256] = {
4586 /* THREE_BYTE_0F38 */
4589 { "pshufb", { MX
, EM
}, PREFIX_OPCODE
},
4590 { "phaddw", { MX
, EM
}, PREFIX_OPCODE
},
4591 { "phaddd", { MX
, EM
}, PREFIX_OPCODE
},
4592 { "phaddsw", { MX
, EM
}, PREFIX_OPCODE
},
4593 { "pmaddubsw", { MX
, EM
}, PREFIX_OPCODE
},
4594 { "phsubw", { MX
, EM
}, PREFIX_OPCODE
},
4595 { "phsubd", { MX
, EM
}, PREFIX_OPCODE
},
4596 { "phsubsw", { MX
, EM
}, PREFIX_OPCODE
},
4598 { "psignb", { MX
, EM
}, PREFIX_OPCODE
},
4599 { "psignw", { MX
, EM
}, PREFIX_OPCODE
},
4600 { "psignd", { MX
, EM
}, PREFIX_OPCODE
},
4601 { "pmulhrsw", { MX
, EM
}, PREFIX_OPCODE
},
4607 { "pblendvb", { XM
, EXx
, XMM0
}, PREFIX_DATA
},
4611 { "blendvps", { XM
, EXx
, XMM0
}, PREFIX_DATA
},
4612 { "blendvpd", { XM
, EXx
, XMM0
}, PREFIX_DATA
},
4614 { "ptest", { XM
, EXx
}, PREFIX_DATA
},
4620 { "pabsb", { MX
, EM
}, PREFIX_OPCODE
},
4621 { "pabsw", { MX
, EM
}, PREFIX_OPCODE
},
4622 { "pabsd", { MX
, EM
}, PREFIX_OPCODE
},
4625 { "pmovsxbw", { XM
, EXq
}, PREFIX_DATA
},
4626 { "pmovsxbd", { XM
, EXd
}, PREFIX_DATA
},
4627 { "pmovsxbq", { XM
, EXw
}, PREFIX_DATA
},
4628 { "pmovsxwd", { XM
, EXq
}, PREFIX_DATA
},
4629 { "pmovsxwq", { XM
, EXd
}, PREFIX_DATA
},
4630 { "pmovsxdq", { XM
, EXq
}, PREFIX_DATA
},
4634 { "pmuldq", { XM
, EXx
}, PREFIX_DATA
},
4635 { "pcmpeqq", { XM
, EXx
}, PREFIX_DATA
},
4636 { MOD_TABLE (MOD_0F382A
) },
4637 { "packusdw", { XM
, EXx
}, PREFIX_DATA
},
4643 { "pmovzxbw", { XM
, EXq
}, PREFIX_DATA
},
4644 { "pmovzxbd", { XM
, EXd
}, PREFIX_DATA
},
4645 { "pmovzxbq", { XM
, EXw
}, PREFIX_DATA
},
4646 { "pmovzxwd", { XM
, EXq
}, PREFIX_DATA
},
4647 { "pmovzxwq", { XM
, EXd
}, PREFIX_DATA
},
4648 { "pmovzxdq", { XM
, EXq
}, PREFIX_DATA
},
4650 { "pcmpgtq", { XM
, EXx
}, PREFIX_DATA
},
4652 { "pminsb", { XM
, EXx
}, PREFIX_DATA
},
4653 { "pminsd", { XM
, EXx
}, PREFIX_DATA
},
4654 { "pminuw", { XM
, EXx
}, PREFIX_DATA
},
4655 { "pminud", { XM
, EXx
}, PREFIX_DATA
},
4656 { "pmaxsb", { XM
, EXx
}, PREFIX_DATA
},
4657 { "pmaxsd", { XM
, EXx
}, PREFIX_DATA
},
4658 { "pmaxuw", { XM
, EXx
}, PREFIX_DATA
},
4659 { "pmaxud", { XM
, EXx
}, PREFIX_DATA
},
4661 { "pmulld", { XM
, EXx
}, PREFIX_DATA
},
4662 { "phminposuw", { XM
, EXx
}, PREFIX_DATA
},
4733 { "invept", { Gm
, Mo
}, PREFIX_DATA
},
4734 { "invvpid", { Gm
, Mo
}, PREFIX_DATA
},
4735 { "invpcid", { Gm
, M
}, PREFIX_DATA
},
4814 { "sha1nexte", { XM
, EXxmm
}, PREFIX_OPCODE
},
4815 { "sha1msg1", { XM
, EXxmm
}, PREFIX_OPCODE
},
4816 { "sha1msg2", { XM
, EXxmm
}, PREFIX_OPCODE
},
4817 { "sha256rnds2", { XM
, EXxmm
, XMM0
}, PREFIX_OPCODE
},
4818 { "sha256msg1", { XM
, EXxmm
}, PREFIX_OPCODE
},
4819 { "sha256msg2", { XM
, EXxmm
}, PREFIX_OPCODE
},
4821 { "gf2p8mulb", { XM
, EXxmm
}, PREFIX_DATA
},
4832 { PREFIX_TABLE (PREFIX_0F38D8
) },
4835 { "aesimc", { XM
, EXx
}, PREFIX_DATA
},
4836 { PREFIX_TABLE (PREFIX_0F38DC
) },
4837 { PREFIX_TABLE (PREFIX_0F38DD
) },
4838 { PREFIX_TABLE (PREFIX_0F38DE
) },
4839 { PREFIX_TABLE (PREFIX_0F38DF
) },
4859 { PREFIX_TABLE (PREFIX_0F38F0
) },
4860 { PREFIX_TABLE (PREFIX_0F38F1
) },
4864 { MOD_TABLE (MOD_0F38F5
) },
4865 { PREFIX_TABLE (PREFIX_0F38F6
) },
4868 { PREFIX_TABLE (PREFIX_0F38F8
) },
4869 { MOD_TABLE (MOD_0F38F9
) },
4870 { PREFIX_TABLE (PREFIX_0F38FA
) },
4871 { PREFIX_TABLE (PREFIX_0F38FB
) },
4872 { PREFIX_TABLE (PREFIX_0F38FC
) },
4877 /* THREE_BYTE_0F3A */
4889 { "roundps", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4890 { "roundpd", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4891 { "roundss", { XM
, EXd
, Ib
}, PREFIX_DATA
},
4892 { "roundsd", { XM
, EXq
, Ib
}, PREFIX_DATA
},
4893 { "blendps", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4894 { "blendpd", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4895 { "pblendw", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4896 { "palignr", { MX
, EM
, Ib
}, PREFIX_OPCODE
},
4902 { "pextrb", { Edb
, XM
, Ib
}, PREFIX_DATA
},
4903 { "pextrw", { Edw
, XM
, Ib
}, PREFIX_DATA
},
4904 { "pextrK", { Edq
, XM
, Ib
}, PREFIX_DATA
},
4905 { "extractps", { Ed
, XM
, Ib
}, PREFIX_DATA
},
4916 { "pinsrb", { XM
, Edb
, Ib
}, PREFIX_DATA
},
4917 { "insertps", { XM
, EXd
, Ib
}, PREFIX_DATA
},
4918 { "pinsrK", { XM
, Edq
, Ib
}, PREFIX_DATA
},
4952 { "dpps", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4953 { "dppd", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4954 { "mpsadbw", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4956 { "pclmulqdq", { XM
, EXx
, PCLMUL
}, PREFIX_DATA
},
4988 { "pcmpestrm!%LQ", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4989 { "pcmpestri!%LQ", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4990 { "pcmpistrm", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4991 { "pcmpistri", { XM
, EXx
, Ib
}, PREFIX_DATA
},
5109 { "sha1rnds4", { XM
, EXxmm
, Ib
}, PREFIX_OPCODE
},
5111 { "gf2p8affineqb", { XM
, EXxmm
, Ib
}, PREFIX_DATA
},
5112 { "gf2p8affineinvqb", { XM
, EXxmm
, Ib
}, PREFIX_DATA
},
5130 { "aeskeygenassist", { XM
, EXx
, Ib
}, PREFIX_DATA
},
5150 { PREFIX_TABLE (PREFIX_0F3A0F
) },
5170 static const struct dis386 xop_table
[][256] = {
5323 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_85
) },
5324 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_86
) },
5325 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_87
) },
5333 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_8E
) },
5334 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_8F
) },
5341 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_95
) },
5342 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_96
) },
5343 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_97
) },
5351 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_9E
) },
5352 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_9F
) },
5356 { "vpcmov", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
5357 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_A3
) },
5360 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_A6
) },
5378 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_B6
) },
5390 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C0
) },
5391 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C1
) },
5392 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C2
) },
5393 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C3
) },
5403 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CC
) },
5404 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CD
) },
5405 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CE
) },
5406 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CF
) },
5439 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EC
) },
5440 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_ED
) },
5441 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EE
) },
5442 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EF
) },
5466 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_01
) },
5467 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_02
) },
5485 { MOD_TABLE (MOD_XOP_09_12
) },
5609 { VEX_W_TABLE (VEX_W_0FXOP_09_80
) },
5610 { VEX_W_TABLE (VEX_W_0FXOP_09_81
) },
5611 { VEX_W_TABLE (VEX_W_0FXOP_09_82
) },
5612 { VEX_W_TABLE (VEX_W_0FXOP_09_83
) },
5627 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_90
) },
5628 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_91
) },
5629 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_92
) },
5630 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_93
) },
5631 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_94
) },
5632 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_95
) },
5633 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_96
) },
5634 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_97
) },
5636 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_98
) },
5637 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_99
) },
5638 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_9A
) },
5639 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_9B
) },
5682 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C1
) },
5683 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C2
) },
5684 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C3
) },
5687 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C6
) },
5688 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C7
) },
5693 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_CB
) },
5700 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D1
) },
5701 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D2
) },
5702 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D3
) },
5705 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D6
) },
5706 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D7
) },
5711 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_DB
) },
5718 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_E1
) },
5719 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_E2
) },
5720 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_E3
) },
5774 { "bextrS", { Gdq
, Edq
, Id
}, 0 },
5776 { VEX_LEN_TABLE (VEX_LEN_0FXOP_0A_12
) },
6046 static const struct dis386 vex_table
[][256] = {
6068 { PREFIX_TABLE (PREFIX_VEX_0F10
) },
6069 { PREFIX_TABLE (PREFIX_VEX_0F11
) },
6070 { PREFIX_TABLE (PREFIX_VEX_0F12
) },
6071 { MOD_TABLE (MOD_VEX_0F13
) },
6072 { "vunpcklpX", { XM
, Vex
, EXx
}, PREFIX_OPCODE
},
6073 { "vunpckhpX", { XM
, Vex
, EXx
}, PREFIX_OPCODE
},
6074 { PREFIX_TABLE (PREFIX_VEX_0F16
) },
6075 { MOD_TABLE (MOD_VEX_0F17
) },
6095 { "vmovapX", { XM
, EXx
}, PREFIX_OPCODE
},
6096 { "vmovapX", { EXxS
, XM
}, PREFIX_OPCODE
},
6097 { PREFIX_TABLE (PREFIX_VEX_0F2A
) },
6098 { MOD_TABLE (MOD_VEX_0F2B
) },
6099 { PREFIX_TABLE (PREFIX_VEX_0F2C
) },
6100 { PREFIX_TABLE (PREFIX_VEX_0F2D
) },
6101 { PREFIX_TABLE (PREFIX_VEX_0F2E
) },
6102 { PREFIX_TABLE (PREFIX_VEX_0F2F
) },
6123 { VEX_LEN_TABLE (VEX_LEN_0F41
) },
6124 { VEX_LEN_TABLE (VEX_LEN_0F42
) },
6126 { VEX_LEN_TABLE (VEX_LEN_0F44
) },
6127 { VEX_LEN_TABLE (VEX_LEN_0F45
) },
6128 { VEX_LEN_TABLE (VEX_LEN_0F46
) },
6129 { VEX_LEN_TABLE (VEX_LEN_0F47
) },
6133 { VEX_LEN_TABLE (VEX_LEN_0F4A
) },
6134 { VEX_LEN_TABLE (VEX_LEN_0F4B
) },
6140 { MOD_TABLE (MOD_VEX_0F50
) },
6141 { PREFIX_TABLE (PREFIX_VEX_0F51
) },
6142 { PREFIX_TABLE (PREFIX_VEX_0F52
) },
6143 { PREFIX_TABLE (PREFIX_VEX_0F53
) },
6144 { "vandpX", { XM
, Vex
, EXx
}, PREFIX_OPCODE
},
6145 { "vandnpX", { XM
, Vex
, EXx
}, PREFIX_OPCODE
},
6146 { "vorpX", { XM
, Vex
, EXx
}, PREFIX_OPCODE
},
6147 { "vxorpX", { XM
, Vex
, EXx
}, PREFIX_OPCODE
},
6149 { PREFIX_TABLE (PREFIX_VEX_0F58
) },
6150 { PREFIX_TABLE (PREFIX_VEX_0F59
) },
6151 { PREFIX_TABLE (PREFIX_VEX_0F5A
) },
6152 { PREFIX_TABLE (PREFIX_VEX_0F5B
) },
6153 { PREFIX_TABLE (PREFIX_VEX_0F5C
) },
6154 { PREFIX_TABLE (PREFIX_VEX_0F5D
) },
6155 { PREFIX_TABLE (PREFIX_VEX_0F5E
) },
6156 { PREFIX_TABLE (PREFIX_VEX_0F5F
) },
6158 { "vpunpcklbw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6159 { "vpunpcklwd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6160 { "vpunpckldq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6161 { "vpacksswb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6162 { "vpcmpgtb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6163 { "vpcmpgtw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6164 { "vpcmpgtd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6165 { "vpackuswb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6167 { "vpunpckhbw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6168 { "vpunpckhwd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6169 { "vpunpckhdq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6170 { "vpackssdw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6171 { "vpunpcklqdq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6172 { "vpunpckhqdq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6173 { VEX_LEN_TABLE (VEX_LEN_0F6E
) },
6174 { PREFIX_TABLE (PREFIX_VEX_0F6F
) },
6176 { PREFIX_TABLE (PREFIX_VEX_0F70
) },
6177 { MOD_TABLE (MOD_VEX_0F71
) },
6178 { MOD_TABLE (MOD_VEX_0F72
) },
6179 { MOD_TABLE (MOD_VEX_0F73
) },
6180 { "vpcmpeqb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6181 { "vpcmpeqw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6182 { "vpcmpeqd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6183 { VEX_LEN_TABLE (VEX_LEN_0F77
) },
6189 { PREFIX_TABLE (PREFIX_VEX_0F7C
) },
6190 { PREFIX_TABLE (PREFIX_VEX_0F7D
) },
6191 { PREFIX_TABLE (PREFIX_VEX_0F7E
) },
6192 { PREFIX_TABLE (PREFIX_VEX_0F7F
) },
6212 { VEX_LEN_TABLE (VEX_LEN_0F90
) },
6213 { VEX_LEN_TABLE (VEX_LEN_0F91
) },
6214 { VEX_LEN_TABLE (VEX_LEN_0F92
) },
6215 { VEX_LEN_TABLE (VEX_LEN_0F93
) },
6221 { VEX_LEN_TABLE (VEX_LEN_0F98
) },
6222 { VEX_LEN_TABLE (VEX_LEN_0F99
) },
6245 { REG_TABLE (REG_VEX_0FAE
) },
6268 { PREFIX_TABLE (PREFIX_VEX_0FC2
) },
6270 { VEX_LEN_TABLE (VEX_LEN_0FC4
) },
6271 { VEX_LEN_TABLE (VEX_LEN_0FC5
) },
6272 { "vshufpX", { XM
, Vex
, EXx
, Ib
}, PREFIX_OPCODE
},
6284 { PREFIX_TABLE (PREFIX_VEX_0FD0
) },
6285 { "vpsrlw", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
6286 { "vpsrld", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
6287 { "vpsrlq", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
6288 { "vpaddq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6289 { "vpmullw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6290 { VEX_LEN_TABLE (VEX_LEN_0FD6
) },
6291 { MOD_TABLE (MOD_VEX_0FD7
) },
6293 { "vpsubusb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6294 { "vpsubusw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6295 { "vpminub", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6296 { "vpand", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6297 { "vpaddusb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6298 { "vpaddusw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6299 { "vpmaxub", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6300 { "vpandn", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6302 { "vpavgb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6303 { "vpsraw", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
6304 { "vpsrad", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
6305 { "vpavgw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6306 { "vpmulhuw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6307 { "vpmulhw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6308 { PREFIX_TABLE (PREFIX_VEX_0FE6
) },
6309 { MOD_TABLE (MOD_VEX_0FE7
) },
6311 { "vpsubsb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6312 { "vpsubsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6313 { "vpminsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6314 { "vpor", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6315 { "vpaddsb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6316 { "vpaddsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6317 { "vpmaxsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6318 { "vpxor", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6320 { PREFIX_TABLE (PREFIX_VEX_0FF0
) },
6321 { "vpsllw", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
6322 { "vpslld", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
6323 { "vpsllq", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
6324 { "vpmuludq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6325 { "vpmaddwd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6326 { "vpsadbw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6327 { VEX_LEN_TABLE (VEX_LEN_0FF7
) },
6329 { "vpsubb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6330 { "vpsubw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6331 { "vpsubd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6332 { "vpsubq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6333 { "vpaddb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6334 { "vpaddw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6335 { "vpaddd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6341 { "vpshufb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6342 { "vphaddw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6343 { "vphaddd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6344 { "vphaddsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6345 { "vpmaddubsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6346 { "vphsubw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6347 { "vphsubd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6348 { "vphsubsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6350 { "vpsignb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6351 { "vpsignw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6352 { "vpsignd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6353 { "vpmulhrsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6354 { VEX_W_TABLE (VEX_W_0F380C
) },
6355 { VEX_W_TABLE (VEX_W_0F380D
) },
6356 { VEX_W_TABLE (VEX_W_0F380E
) },
6357 { VEX_W_TABLE (VEX_W_0F380F
) },
6362 { VEX_W_TABLE (VEX_W_0F3813
) },
6365 { VEX_LEN_TABLE (VEX_LEN_0F3816
) },
6366 { "vptest", { XM
, EXx
}, PREFIX_DATA
},
6368 { VEX_W_TABLE (VEX_W_0F3818
) },
6369 { VEX_LEN_TABLE (VEX_LEN_0F3819
) },
6370 { MOD_TABLE (MOD_VEX_0F381A
) },
6372 { "vpabsb", { XM
, EXx
}, PREFIX_DATA
},
6373 { "vpabsw", { XM
, EXx
}, PREFIX_DATA
},
6374 { "vpabsd", { XM
, EXx
}, PREFIX_DATA
},
6377 { "vpmovsxbw", { XM
, EXxmmq
}, PREFIX_DATA
},
6378 { "vpmovsxbd", { XM
, EXxmmqd
}, PREFIX_DATA
},
6379 { "vpmovsxbq", { XM
, EXxmmdw
}, PREFIX_DATA
},
6380 { "vpmovsxwd", { XM
, EXxmmq
}, PREFIX_DATA
},
6381 { "vpmovsxwq", { XM
, EXxmmqd
}, PREFIX_DATA
},
6382 { "vpmovsxdq", { XM
, EXxmmq
}, PREFIX_DATA
},
6386 { "vpmuldq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6387 { "vpcmpeqq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6388 { MOD_TABLE (MOD_VEX_0F382A
) },
6389 { "vpackusdw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6390 { MOD_TABLE (MOD_VEX_0F382C
) },
6391 { MOD_TABLE (MOD_VEX_0F382D
) },
6392 { MOD_TABLE (MOD_VEX_0F382E
) },
6393 { MOD_TABLE (MOD_VEX_0F382F
) },
6395 { "vpmovzxbw", { XM
, EXxmmq
}, PREFIX_DATA
},
6396 { "vpmovzxbd", { XM
, EXxmmqd
}, PREFIX_DATA
},
6397 { "vpmovzxbq", { XM
, EXxmmdw
}, PREFIX_DATA
},
6398 { "vpmovzxwd", { XM
, EXxmmq
}, PREFIX_DATA
},
6399 { "vpmovzxwq", { XM
, EXxmmqd
}, PREFIX_DATA
},
6400 { "vpmovzxdq", { XM
, EXxmmq
}, PREFIX_DATA
},
6401 { VEX_LEN_TABLE (VEX_LEN_0F3836
) },
6402 { "vpcmpgtq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6404 { "vpminsb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6405 { "vpminsd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6406 { "vpminuw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6407 { "vpminud", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6408 { "vpmaxsb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6409 { "vpmaxsd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6410 { "vpmaxuw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6411 { "vpmaxud", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6413 { "vpmulld", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6414 { VEX_LEN_TABLE (VEX_LEN_0F3841
) },
6418 { "vpsrlv%DQ", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6419 { VEX_W_TABLE (VEX_W_0F3846
) },
6420 { "vpsllv%DQ", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6423 { X86_64_TABLE (X86_64_VEX_0F3849
) },
6425 { X86_64_TABLE (X86_64_VEX_0F384B
) },
6431 { VEX_W_TABLE (VEX_W_0F3850
) },
6432 { VEX_W_TABLE (VEX_W_0F3851
) },
6433 { VEX_W_TABLE (VEX_W_0F3852
) },
6434 { VEX_W_TABLE (VEX_W_0F3853
) },
6440 { VEX_W_TABLE (VEX_W_0F3858
) },
6441 { VEX_W_TABLE (VEX_W_0F3859
) },
6442 { MOD_TABLE (MOD_VEX_0F385A
) },
6444 { X86_64_TABLE (X86_64_VEX_0F385C
) },
6446 { X86_64_TABLE (X86_64_VEX_0F385E
) },
6469 { PREFIX_TABLE (PREFIX_VEX_0F3872
) },
6476 { VEX_W_TABLE (VEX_W_0F3878
) },
6477 { VEX_W_TABLE (VEX_W_0F3879
) },
6498 { MOD_TABLE (MOD_VEX_0F388C
) },
6500 { MOD_TABLE (MOD_VEX_0F388E
) },
6503 { "vpgatherd%DQ", { XM
, MVexVSIBDWpX
, VexGatherD
}, PREFIX_DATA
},
6504 { "vpgatherq%DQ", { XMGatherQ
, MVexVSIBQWpX
, VexGatherQ
}, PREFIX_DATA
},
6505 { "vgatherdp%XW", { XM
, MVexVSIBDWpX
, VexGatherD
}, PREFIX_DATA
},
6506 { "vgatherqp%XW", { XMGatherQ
, MVexVSIBQWpX
, VexGatherQ
}, PREFIX_DATA
},
6509 { "vfmaddsub132p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6510 { "vfmsubadd132p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6512 { "vfmadd132p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6513 { "vfmadd132s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6514 { "vfmsub132p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6515 { "vfmsub132s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6516 { "vfnmadd132p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6517 { "vfnmadd132s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6518 { "vfnmsub132p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6519 { "vfnmsub132s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6527 { "vfmaddsub213p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6528 { "vfmsubadd213p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6530 { "vfmadd213p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6531 { "vfmadd213s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6532 { "vfmsub213p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6533 { "vfmsub213s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6534 { "vfnmadd213p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6535 { "vfnmadd213s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6536 { "vfnmsub213p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6537 { "vfnmsub213s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6539 { VEX_W_TABLE (VEX_W_0F38B0
) },
6540 { VEX_W_TABLE (VEX_W_0F38B1
) },
6543 { VEX_W_TABLE (VEX_W_0F38B4
) },
6544 { VEX_W_TABLE (VEX_W_0F38B5
) },
6545 { "vfmaddsub231p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6546 { "vfmsubadd231p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6548 { "vfmadd231p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6549 { "vfmadd231s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6550 { "vfmsub231p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6551 { "vfmsub231s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6552 { "vfnmadd231p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6553 { "vfnmadd231s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6554 { "vfnmsub231p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6555 { "vfnmsub231s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6573 { VEX_W_TABLE (VEX_W_0F38CF
) },
6587 { VEX_LEN_TABLE (VEX_LEN_0F38DB
) },
6588 { "vaesenc", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6589 { "vaesenclast", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6590 { "vaesdec", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6591 { "vaesdeclast", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6593 { X86_64_TABLE (X86_64_VEX_0F38E0
) },
6594 { X86_64_TABLE (X86_64_VEX_0F38E1
) },
6595 { X86_64_TABLE (X86_64_VEX_0F38E2
) },
6596 { X86_64_TABLE (X86_64_VEX_0F38E3
) },
6597 { X86_64_TABLE (X86_64_VEX_0F38E4
) },
6598 { X86_64_TABLE (X86_64_VEX_0F38E5
) },
6599 { X86_64_TABLE (X86_64_VEX_0F38E6
) },
6600 { X86_64_TABLE (X86_64_VEX_0F38E7
) },
6602 { X86_64_TABLE (X86_64_VEX_0F38E8
) },
6603 { X86_64_TABLE (X86_64_VEX_0F38E9
) },
6604 { X86_64_TABLE (X86_64_VEX_0F38EA
) },
6605 { X86_64_TABLE (X86_64_VEX_0F38EB
) },
6606 { X86_64_TABLE (X86_64_VEX_0F38EC
) },
6607 { X86_64_TABLE (X86_64_VEX_0F38ED
) },
6608 { X86_64_TABLE (X86_64_VEX_0F38EE
) },
6609 { X86_64_TABLE (X86_64_VEX_0F38EF
) },
6613 { VEX_LEN_TABLE (VEX_LEN_0F38F2
) },
6614 { VEX_LEN_TABLE (VEX_LEN_0F38F3
) },
6616 { VEX_LEN_TABLE (VEX_LEN_0F38F5
) },
6617 { VEX_LEN_TABLE (VEX_LEN_0F38F6
) },
6618 { VEX_LEN_TABLE (VEX_LEN_0F38F7
) },
6632 { VEX_LEN_TABLE (VEX_LEN_0F3A00
) },
6633 { VEX_LEN_TABLE (VEX_LEN_0F3A01
) },
6634 { VEX_W_TABLE (VEX_W_0F3A02
) },
6636 { VEX_W_TABLE (VEX_W_0F3A04
) },
6637 { VEX_W_TABLE (VEX_W_0F3A05
) },
6638 { VEX_LEN_TABLE (VEX_LEN_0F3A06
) },
6641 { "vroundps", { XM
, EXx
, Ib
}, PREFIX_DATA
},
6642 { "vroundpd", { XM
, EXx
, Ib
}, PREFIX_DATA
},
6643 { "vroundss", { XMScalar
, VexScalar
, EXd
, Ib
}, PREFIX_DATA
},
6644 { "vroundsd", { XMScalar
, VexScalar
, EXq
, Ib
}, PREFIX_DATA
},
6645 { "vblendps", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
6646 { "vblendpd", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
6647 { "vpblendw", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
6648 { "vpalignr", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
6654 { VEX_LEN_TABLE (VEX_LEN_0F3A14
) },
6655 { VEX_LEN_TABLE (VEX_LEN_0F3A15
) },
6656 { VEX_LEN_TABLE (VEX_LEN_0F3A16
) },
6657 { VEX_LEN_TABLE (VEX_LEN_0F3A17
) },
6659 { VEX_LEN_TABLE (VEX_LEN_0F3A18
) },
6660 { VEX_LEN_TABLE (VEX_LEN_0F3A19
) },
6664 { VEX_W_TABLE (VEX_W_0F3A1D
) },
6668 { VEX_LEN_TABLE (VEX_LEN_0F3A20
) },
6669 { VEX_LEN_TABLE (VEX_LEN_0F3A21
) },
6670 { VEX_LEN_TABLE (VEX_LEN_0F3A22
) },
6686 { VEX_LEN_TABLE (VEX_LEN_0F3A30
) },
6687 { VEX_LEN_TABLE (VEX_LEN_0F3A31
) },
6688 { VEX_LEN_TABLE (VEX_LEN_0F3A32
) },
6689 { VEX_LEN_TABLE (VEX_LEN_0F3A33
) },
6695 { VEX_LEN_TABLE (VEX_LEN_0F3A38
) },
6696 { VEX_LEN_TABLE (VEX_LEN_0F3A39
) },
6704 { "vdpps", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
6705 { VEX_LEN_TABLE (VEX_LEN_0F3A41
) },
6706 { "vmpsadbw", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
6708 { "vpclmulqdq", { XM
, Vex
, EXx
, PCLMUL
}, PREFIX_DATA
},
6710 { VEX_LEN_TABLE (VEX_LEN_0F3A46
) },
6713 { "vpermil2ps", { XM
, Vex
, EXx
, XMVexI4
, VexI4
}, PREFIX_DATA
},
6714 { "vpermil2pd", { XM
, Vex
, EXx
, XMVexI4
, VexI4
}, PREFIX_DATA
},
6715 { VEX_W_TABLE (VEX_W_0F3A4A
) },
6716 { VEX_W_TABLE (VEX_W_0F3A4B
) },
6717 { VEX_W_TABLE (VEX_W_0F3A4C
) },
6735 { "vfmaddsubps", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6736 { "vfmaddsubpd", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6737 { "vfmsubaddps", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6738 { "vfmsubaddpd", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6740 { VEX_LEN_TABLE (VEX_LEN_0F3A60
) },
6741 { VEX_LEN_TABLE (VEX_LEN_0F3A61
) },
6742 { VEX_LEN_TABLE (VEX_LEN_0F3A62
) },
6743 { VEX_LEN_TABLE (VEX_LEN_0F3A63
) },
6749 { "vfmaddps", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6750 { "vfmaddpd", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6751 { "vfmaddss", { XMScalar
, VexScalar
, EXd
, XMVexScalarI4
}, PREFIX_DATA
},
6752 { "vfmaddsd", { XMScalar
, VexScalar
, EXq
, XMVexScalarI4
}, PREFIX_DATA
},
6753 { "vfmsubps", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6754 { "vfmsubpd", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6755 { "vfmsubss", { XMScalar
, VexScalar
, EXd
, XMVexScalarI4
}, PREFIX_DATA
},
6756 { "vfmsubsd", { XMScalar
, VexScalar
, EXq
, XMVexScalarI4
}, PREFIX_DATA
},
6767 { "vfnmaddps", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6768 { "vfnmaddpd", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6769 { "vfnmaddss", { XMScalar
, VexScalar
, EXd
, XMVexScalarI4
}, PREFIX_DATA
},
6770 { "vfnmaddsd", { XMScalar
, VexScalar
, EXq
, XMVexScalarI4
}, PREFIX_DATA
},
6771 { "vfnmsubps", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6772 { "vfnmsubpd", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6773 { "vfnmsubss", { XMScalar
, VexScalar
, EXd
, XMVexScalarI4
}, PREFIX_DATA
},
6774 { "vfnmsubsd", { XMScalar
, VexScalar
, EXq
, XMVexScalarI4
}, PREFIX_DATA
},
6863 { VEX_W_TABLE (VEX_W_0F3ACE
) },
6864 { VEX_W_TABLE (VEX_W_0F3ACF
) },
6882 { VEX_LEN_TABLE (VEX_LEN_0F3ADF
) },
6902 { VEX_LEN_TABLE (VEX_LEN_0F3AF0
) },
6922 #include "i386-dis-evex.h"
6924 static const struct dis386 vex_len_table
[][2] = {
6925 /* VEX_LEN_0F12_P_0_M_0 / VEX_LEN_0F12_P_2_M_0 */
6927 { "%XEvmovlpX", { XM
, Vex
, EXq
}, 0 },
6930 /* VEX_LEN_0F12_P_0_M_1 */
6932 { "%XEvmovhlp%XS", { XM
, Vex
, EXq
}, 0 },
6935 /* VEX_LEN_0F13_M_0 */
6937 { "%XEvmovlpX", { EXq
, XM
}, PREFIX_OPCODE
},
6940 /* VEX_LEN_0F16_P_0_M_0 / VEX_LEN_0F16_P_2_M_0 */
6942 { "%XEvmovhpX", { XM
, Vex
, EXq
}, 0 },
6945 /* VEX_LEN_0F16_P_0_M_1 */
6947 { "%XEvmovlhp%XS", { XM
, Vex
, EXq
}, 0 },
6950 /* VEX_LEN_0F17_M_0 */
6952 { "%XEvmovhpX", { EXq
, XM
}, PREFIX_OPCODE
},
6958 { MOD_TABLE (MOD_VEX_0F41_L_1
) },
6964 { MOD_TABLE (MOD_VEX_0F42_L_1
) },
6969 { MOD_TABLE (MOD_VEX_0F44_L_0
) },
6975 { MOD_TABLE (MOD_VEX_0F45_L_1
) },
6981 { MOD_TABLE (MOD_VEX_0F46_L_1
) },
6987 { MOD_TABLE (MOD_VEX_0F47_L_1
) },
6993 { MOD_TABLE (MOD_VEX_0F4A_L_1
) },
6999 { MOD_TABLE (MOD_VEX_0F4B_L_1
) },
7004 { "%XEvmovK", { XMScalar
, Edq
}, PREFIX_DATA
},
7009 { "vzeroupper", { XX
}, 0 },
7010 { "vzeroall", { XX
}, 0 },
7013 /* VEX_LEN_0F7E_P_1 */
7015 { "%XEvmovq", { XMScalar
, EXq
}, 0 },
7018 /* VEX_LEN_0F7E_P_2 */
7020 { "%XEvmovK", { Edq
, XMScalar
}, 0 },
7025 { VEX_W_TABLE (VEX_W_0F90_L_0
) },
7030 { MOD_TABLE (MOD_VEX_0F91_L_0
) },
7035 { MOD_TABLE (MOD_VEX_0F92_L_0
) },
7040 { MOD_TABLE (MOD_VEX_0F93_L_0
) },
7045 { MOD_TABLE (MOD_VEX_0F98_L_0
) },
7050 { MOD_TABLE (MOD_VEX_0F99_L_0
) },
7053 /* VEX_LEN_0FAE_R_2_M_0 */
7055 { "vldmxcsr", { Md
}, 0 },
7058 /* VEX_LEN_0FAE_R_3_M_0 */
7060 { "vstmxcsr", { Md
}, 0 },
7065 { "%XEvpinsrw", { XM
, Vex
, Edw
, Ib
}, PREFIX_DATA
},
7070 { "%XEvpextrw", { Gd
, XS
, Ib
}, PREFIX_DATA
},
7075 { "%XEvmovq", { EXqS
, XMScalar
}, PREFIX_DATA
},
7080 { "vmaskmovdqu", { XM
, XS
}, PREFIX_DATA
},
7083 /* VEX_LEN_0F3816 */
7086 { VEX_W_TABLE (VEX_W_0F3816_L_1
) },
7089 /* VEX_LEN_0F3819 */
7092 { VEX_W_TABLE (VEX_W_0F3819_L_1
) },
7095 /* VEX_LEN_0F381A_M_0 */
7098 { VEX_W_TABLE (VEX_W_0F381A_M_0_L_1
) },
7101 /* VEX_LEN_0F3836 */
7104 { VEX_W_TABLE (VEX_W_0F3836
) },
7107 /* VEX_LEN_0F3841 */
7109 { "vphminposuw", { XM
, EXx
}, PREFIX_DATA
},
7112 /* VEX_LEN_0F3849_X86_64_P_0_W_0_M_0 */
7114 { "ldtilecfg", { M
}, 0 },
7117 /* VEX_LEN_0F3849_X86_64_P_0_W_0_M_1_REG_0_RM_0 */
7119 { "tilerelease", { Skip_MODRM
}, 0 },
7122 /* VEX_LEN_0F3849_X86_64_P_2_W_0_M_0 */
7124 { "sttilecfg", { M
}, 0 },
7127 /* VEX_LEN_0F3849_X86_64_P_3_W_0_M_0 */
7129 { "tilezero", { TMM
, Skip_MODRM
}, 0 },
7132 /* VEX_LEN_0F384B_X86_64_P_1_W_0_M_0 */
7134 { "tilestored", { MVexSIBMEM
, TMM
}, 0 },
7136 /* VEX_LEN_0F384B_X86_64_P_2_W_0_M_0 */
7138 { "tileloaddt1", { TMM
, MVexSIBMEM
}, 0 },
7141 /* VEX_LEN_0F384B_X86_64_P_3_W_0_M_0 */
7143 { "tileloadd", { TMM
, MVexSIBMEM
}, 0 },
7146 /* VEX_LEN_0F385A_M_0 */
7149 { VEX_W_TABLE (VEX_W_0F385A_M_0_L_0
) },
7152 /* VEX_LEN_0F385C_X86_64_P_1_W_0_M_0 */
7154 { "tdpbf16ps", { TMM
, EXtmm
, VexTmm
}, 0 },
7157 /* VEX_LEN_0F385C_X86_64_P_3_W_0_M_0 */
7159 { "tdpfp16ps", { TMM
, EXtmm
, VexTmm
}, 0 },
7162 /* VEX_LEN_0F385E_X86_64_P_0_W_0_M_0 */
7164 { "tdpbuud", {TMM
, EXtmm
, VexTmm
}, 0 },
7167 /* VEX_LEN_0F385E_X86_64_P_1_W_0_M_0 */
7169 { "tdpbsud", {TMM
, EXtmm
, VexTmm
}, 0 },
7172 /* VEX_LEN_0F385E_X86_64_P_2_W_0_M_0 */
7174 { "tdpbusd", {TMM
, EXtmm
, VexTmm
}, 0 },
7177 /* VEX_LEN_0F385E_X86_64_P_3_W_0_M_0 */
7179 { "tdpbssd", {TMM
, EXtmm
, VexTmm
}, 0 },
7182 /* VEX_LEN_0F38DB */
7184 { "vaesimc", { XM
, EXx
}, PREFIX_DATA
},
7187 /* VEX_LEN_0F38F2 */
7189 { "andnS", { Gdq
, VexGdq
, Edq
}, PREFIX_OPCODE
},
7192 /* VEX_LEN_0F38F3 */
7194 { REG_TABLE(REG_VEX_0F38F3_L_0
) },
7197 /* VEX_LEN_0F38F5 */
7199 { PREFIX_TABLE(PREFIX_VEX_0F38F5_L_0
) },
7202 /* VEX_LEN_0F38F6 */
7204 { PREFIX_TABLE(PREFIX_VEX_0F38F6_L_0
) },
7207 /* VEX_LEN_0F38F7 */
7209 { PREFIX_TABLE(PREFIX_VEX_0F38F7_L_0
) },
7212 /* VEX_LEN_0F3A00 */
7215 { VEX_W_TABLE (VEX_W_0F3A00_L_1
) },
7218 /* VEX_LEN_0F3A01 */
7221 { VEX_W_TABLE (VEX_W_0F3A01_L_1
) },
7224 /* VEX_LEN_0F3A06 */
7227 { VEX_W_TABLE (VEX_W_0F3A06_L_1
) },
7230 /* VEX_LEN_0F3A14 */
7232 { "%XEvpextrb", { Edb
, XM
, Ib
}, PREFIX_DATA
},
7235 /* VEX_LEN_0F3A15 */
7237 { "%XEvpextrw", { Edw
, XM
, Ib
}, PREFIX_DATA
},
7240 /* VEX_LEN_0F3A16 */
7242 { "%XEvpextrK", { Edq
, XM
, Ib
}, PREFIX_DATA
},
7245 /* VEX_LEN_0F3A17 */
7247 { "%XEvextractps", { Ed
, XM
, Ib
}, PREFIX_DATA
},
7250 /* VEX_LEN_0F3A18 */
7253 { VEX_W_TABLE (VEX_W_0F3A18_L_1
) },
7256 /* VEX_LEN_0F3A19 */
7259 { VEX_W_TABLE (VEX_W_0F3A19_L_1
) },
7262 /* VEX_LEN_0F3A20 */
7264 { "%XEvpinsrb", { XM
, Vex
, Edb
, Ib
}, PREFIX_DATA
},
7267 /* VEX_LEN_0F3A21 */
7269 { "%XEvinsertps", { XM
, Vex
, EXd
, Ib
}, PREFIX_DATA
},
7272 /* VEX_LEN_0F3A22 */
7274 { "%XEvpinsrK", { XM
, Vex
, Edq
, Ib
}, PREFIX_DATA
},
7277 /* VEX_LEN_0F3A30 */
7279 { MOD_TABLE (MOD_VEX_0F3A30_L_0
) },
7282 /* VEX_LEN_0F3A31 */
7284 { MOD_TABLE (MOD_VEX_0F3A31_L_0
) },
7287 /* VEX_LEN_0F3A32 */
7289 { MOD_TABLE (MOD_VEX_0F3A32_L_0
) },
7292 /* VEX_LEN_0F3A33 */
7294 { MOD_TABLE (MOD_VEX_0F3A33_L_0
) },
7297 /* VEX_LEN_0F3A38 */
7300 { VEX_W_TABLE (VEX_W_0F3A38_L_1
) },
7303 /* VEX_LEN_0F3A39 */
7306 { VEX_W_TABLE (VEX_W_0F3A39_L_1
) },
7309 /* VEX_LEN_0F3A41 */
7311 { "vdppd", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
7314 /* VEX_LEN_0F3A46 */
7317 { VEX_W_TABLE (VEX_W_0F3A46_L_1
) },
7320 /* VEX_LEN_0F3A60 */
7322 { "vpcmpestrm!%LQ", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7325 /* VEX_LEN_0F3A61 */
7327 { "vpcmpestri!%LQ", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7330 /* VEX_LEN_0F3A62 */
7332 { "vpcmpistrm", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7335 /* VEX_LEN_0F3A63 */
7337 { "vpcmpistri", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7340 /* VEX_LEN_0F3ADF */
7342 { "vaeskeygenassist", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7345 /* VEX_LEN_0F3AF0 */
7347 { PREFIX_TABLE (PREFIX_VEX_0F3AF0_L_0
) },
7350 /* VEX_LEN_0FXOP_08_85 */
7352 { VEX_W_TABLE (VEX_W_0FXOP_08_85_L_0
) },
7355 /* VEX_LEN_0FXOP_08_86 */
7357 { VEX_W_TABLE (VEX_W_0FXOP_08_86_L_0
) },
7360 /* VEX_LEN_0FXOP_08_87 */
7362 { VEX_W_TABLE (VEX_W_0FXOP_08_87_L_0
) },
7365 /* VEX_LEN_0FXOP_08_8E */
7367 { VEX_W_TABLE (VEX_W_0FXOP_08_8E_L_0
) },
7370 /* VEX_LEN_0FXOP_08_8F */
7372 { VEX_W_TABLE (VEX_W_0FXOP_08_8F_L_0
) },
7375 /* VEX_LEN_0FXOP_08_95 */
7377 { VEX_W_TABLE (VEX_W_0FXOP_08_95_L_0
) },
7380 /* VEX_LEN_0FXOP_08_96 */
7382 { VEX_W_TABLE (VEX_W_0FXOP_08_96_L_0
) },
7385 /* VEX_LEN_0FXOP_08_97 */
7387 { VEX_W_TABLE (VEX_W_0FXOP_08_97_L_0
) },
7390 /* VEX_LEN_0FXOP_08_9E */
7392 { VEX_W_TABLE (VEX_W_0FXOP_08_9E_L_0
) },
7395 /* VEX_LEN_0FXOP_08_9F */
7397 { VEX_W_TABLE (VEX_W_0FXOP_08_9F_L_0
) },
7400 /* VEX_LEN_0FXOP_08_A3 */
7402 { "vpperm", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7405 /* VEX_LEN_0FXOP_08_A6 */
7407 { VEX_W_TABLE (VEX_W_0FXOP_08_A6_L_0
) },
7410 /* VEX_LEN_0FXOP_08_B6 */
7412 { VEX_W_TABLE (VEX_W_0FXOP_08_B6_L_0
) },
7415 /* VEX_LEN_0FXOP_08_C0 */
7417 { VEX_W_TABLE (VEX_W_0FXOP_08_C0_L_0
) },
7420 /* VEX_LEN_0FXOP_08_C1 */
7422 { VEX_W_TABLE (VEX_W_0FXOP_08_C1_L_0
) },
7425 /* VEX_LEN_0FXOP_08_C2 */
7427 { VEX_W_TABLE (VEX_W_0FXOP_08_C2_L_0
) },
7430 /* VEX_LEN_0FXOP_08_C3 */
7432 { VEX_W_TABLE (VEX_W_0FXOP_08_C3_L_0
) },
7435 /* VEX_LEN_0FXOP_08_CC */
7437 { VEX_W_TABLE (VEX_W_0FXOP_08_CC_L_0
) },
7440 /* VEX_LEN_0FXOP_08_CD */
7442 { VEX_W_TABLE (VEX_W_0FXOP_08_CD_L_0
) },
7445 /* VEX_LEN_0FXOP_08_CE */
7447 { VEX_W_TABLE (VEX_W_0FXOP_08_CE_L_0
) },
7450 /* VEX_LEN_0FXOP_08_CF */
7452 { VEX_W_TABLE (VEX_W_0FXOP_08_CF_L_0
) },
7455 /* VEX_LEN_0FXOP_08_EC */
7457 { VEX_W_TABLE (VEX_W_0FXOP_08_EC_L_0
) },
7460 /* VEX_LEN_0FXOP_08_ED */
7462 { VEX_W_TABLE (VEX_W_0FXOP_08_ED_L_0
) },
7465 /* VEX_LEN_0FXOP_08_EE */
7467 { VEX_W_TABLE (VEX_W_0FXOP_08_EE_L_0
) },
7470 /* VEX_LEN_0FXOP_08_EF */
7472 { VEX_W_TABLE (VEX_W_0FXOP_08_EF_L_0
) },
7475 /* VEX_LEN_0FXOP_09_01 */
7477 { REG_TABLE (REG_XOP_09_01_L_0
) },
7480 /* VEX_LEN_0FXOP_09_02 */
7482 { REG_TABLE (REG_XOP_09_02_L_0
) },
7485 /* VEX_LEN_0FXOP_09_12_M_1 */
7487 { REG_TABLE (REG_XOP_09_12_M_1_L_0
) },
7490 /* VEX_LEN_0FXOP_09_82_W_0 */
7492 { "vfrczss", { XM
, EXd
}, 0 },
7495 /* VEX_LEN_0FXOP_09_83_W_0 */
7497 { "vfrczsd", { XM
, EXq
}, 0 },
7500 /* VEX_LEN_0FXOP_09_90 */
7502 { "vprotb", { XM
, EXx
, VexW
}, 0 },
7505 /* VEX_LEN_0FXOP_09_91 */
7507 { "vprotw", { XM
, EXx
, VexW
}, 0 },
7510 /* VEX_LEN_0FXOP_09_92 */
7512 { "vprotd", { XM
, EXx
, VexW
}, 0 },
7515 /* VEX_LEN_0FXOP_09_93 */
7517 { "vprotq", { XM
, EXx
, VexW
}, 0 },
7520 /* VEX_LEN_0FXOP_09_94 */
7522 { "vpshlb", { XM
, EXx
, VexW
}, 0 },
7525 /* VEX_LEN_0FXOP_09_95 */
7527 { "vpshlw", { XM
, EXx
, VexW
}, 0 },
7530 /* VEX_LEN_0FXOP_09_96 */
7532 { "vpshld", { XM
, EXx
, VexW
}, 0 },
7535 /* VEX_LEN_0FXOP_09_97 */
7537 { "vpshlq", { XM
, EXx
, VexW
}, 0 },
7540 /* VEX_LEN_0FXOP_09_98 */
7542 { "vpshab", { XM
, EXx
, VexW
}, 0 },
7545 /* VEX_LEN_0FXOP_09_99 */
7547 { "vpshaw", { XM
, EXx
, VexW
}, 0 },
7550 /* VEX_LEN_0FXOP_09_9A */
7552 { "vpshad", { XM
, EXx
, VexW
}, 0 },
7555 /* VEX_LEN_0FXOP_09_9B */
7557 { "vpshaq", { XM
, EXx
, VexW
}, 0 },
7560 /* VEX_LEN_0FXOP_09_C1 */
7562 { VEX_W_TABLE (VEX_W_0FXOP_09_C1_L_0
) },
7565 /* VEX_LEN_0FXOP_09_C2 */
7567 { VEX_W_TABLE (VEX_W_0FXOP_09_C2_L_0
) },
7570 /* VEX_LEN_0FXOP_09_C3 */
7572 { VEX_W_TABLE (VEX_W_0FXOP_09_C3_L_0
) },
7575 /* VEX_LEN_0FXOP_09_C6 */
7577 { VEX_W_TABLE (VEX_W_0FXOP_09_C6_L_0
) },
7580 /* VEX_LEN_0FXOP_09_C7 */
7582 { VEX_W_TABLE (VEX_W_0FXOP_09_C7_L_0
) },
7585 /* VEX_LEN_0FXOP_09_CB */
7587 { VEX_W_TABLE (VEX_W_0FXOP_09_CB_L_0
) },
7590 /* VEX_LEN_0FXOP_09_D1 */
7592 { VEX_W_TABLE (VEX_W_0FXOP_09_D1_L_0
) },
7595 /* VEX_LEN_0FXOP_09_D2 */
7597 { VEX_W_TABLE (VEX_W_0FXOP_09_D2_L_0
) },
7600 /* VEX_LEN_0FXOP_09_D3 */
7602 { VEX_W_TABLE (VEX_W_0FXOP_09_D3_L_0
) },
7605 /* VEX_LEN_0FXOP_09_D6 */
7607 { VEX_W_TABLE (VEX_W_0FXOP_09_D6_L_0
) },
7610 /* VEX_LEN_0FXOP_09_D7 */
7612 { VEX_W_TABLE (VEX_W_0FXOP_09_D7_L_0
) },
7615 /* VEX_LEN_0FXOP_09_DB */
7617 { VEX_W_TABLE (VEX_W_0FXOP_09_DB_L_0
) },
7620 /* VEX_LEN_0FXOP_09_E1 */
7622 { VEX_W_TABLE (VEX_W_0FXOP_09_E1_L_0
) },
7625 /* VEX_LEN_0FXOP_09_E2 */
7627 { VEX_W_TABLE (VEX_W_0FXOP_09_E2_L_0
) },
7630 /* VEX_LEN_0FXOP_09_E3 */
7632 { VEX_W_TABLE (VEX_W_0FXOP_09_E3_L_0
) },
7635 /* VEX_LEN_0FXOP_0A_12 */
7637 { REG_TABLE (REG_XOP_0A_12_L_0
) },
7641 #include "i386-dis-evex-len.h"
7643 static const struct dis386 vex_w_table
[][2] = {
7645 /* VEX_W_0F41_L_1_M_1 */
7646 { PREFIX_TABLE (PREFIX_VEX_0F41_L_1_M_1_W_0
) },
7647 { PREFIX_TABLE (PREFIX_VEX_0F41_L_1_M_1_W_1
) },
7650 /* VEX_W_0F42_L_1_M_1 */
7651 { PREFIX_TABLE (PREFIX_VEX_0F42_L_1_M_1_W_0
) },
7652 { PREFIX_TABLE (PREFIX_VEX_0F42_L_1_M_1_W_1
) },
7655 /* VEX_W_0F44_L_0_M_1 */
7656 { PREFIX_TABLE (PREFIX_VEX_0F44_L_0_M_1_W_0
) },
7657 { PREFIX_TABLE (PREFIX_VEX_0F44_L_0_M_1_W_1
) },
7660 /* VEX_W_0F45_L_1_M_1 */
7661 { PREFIX_TABLE (PREFIX_VEX_0F45_L_1_M_1_W_0
) },
7662 { PREFIX_TABLE (PREFIX_VEX_0F45_L_1_M_1_W_1
) },
7665 /* VEX_W_0F46_L_1_M_1 */
7666 { PREFIX_TABLE (PREFIX_VEX_0F46_L_1_M_1_W_0
) },
7667 { PREFIX_TABLE (PREFIX_VEX_0F46_L_1_M_1_W_1
) },
7670 /* VEX_W_0F47_L_1_M_1 */
7671 { PREFIX_TABLE (PREFIX_VEX_0F47_L_1_M_1_W_0
) },
7672 { PREFIX_TABLE (PREFIX_VEX_0F47_L_1_M_1_W_1
) },
7675 /* VEX_W_0F4A_L_1_M_1 */
7676 { PREFIX_TABLE (PREFIX_VEX_0F4A_L_1_M_1_W_0
) },
7677 { PREFIX_TABLE (PREFIX_VEX_0F4A_L_1_M_1_W_1
) },
7680 /* VEX_W_0F4B_L_1_M_1 */
7681 { PREFIX_TABLE (PREFIX_VEX_0F4B_L_1_M_1_W_0
) },
7682 { PREFIX_TABLE (PREFIX_VEX_0F4B_L_1_M_1_W_1
) },
7685 /* VEX_W_0F90_L_0 */
7686 { PREFIX_TABLE (PREFIX_VEX_0F90_L_0_W_0
) },
7687 { PREFIX_TABLE (PREFIX_VEX_0F90_L_0_W_1
) },
7690 /* VEX_W_0F91_L_0_M_0 */
7691 { PREFIX_TABLE (PREFIX_VEX_0F91_L_0_M_0_W_0
) },
7692 { PREFIX_TABLE (PREFIX_VEX_0F91_L_0_M_0_W_1
) },
7695 /* VEX_W_0F92_L_0_M_1 */
7696 { PREFIX_TABLE (PREFIX_VEX_0F92_L_0_M_1_W_0
) },
7697 { PREFIX_TABLE (PREFIX_VEX_0F92_L_0_M_1_W_1
) },
7700 /* VEX_W_0F93_L_0_M_1 */
7701 { PREFIX_TABLE (PREFIX_VEX_0F93_L_0_M_1_W_0
) },
7702 { PREFIX_TABLE (PREFIX_VEX_0F93_L_0_M_1_W_1
) },
7705 /* VEX_W_0F98_L_0_M_1 */
7706 { PREFIX_TABLE (PREFIX_VEX_0F98_L_0_M_1_W_0
) },
7707 { PREFIX_TABLE (PREFIX_VEX_0F98_L_0_M_1_W_1
) },
7710 /* VEX_W_0F99_L_0_M_1 */
7711 { PREFIX_TABLE (PREFIX_VEX_0F99_L_0_M_1_W_0
) },
7712 { PREFIX_TABLE (PREFIX_VEX_0F99_L_0_M_1_W_1
) },
7716 { "%XEvpermilps", { XM
, Vex
, EXx
}, PREFIX_DATA
},
7720 { "vpermilpd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
7724 { "vtestps", { XM
, EXx
}, PREFIX_DATA
},
7728 { "vtestpd", { XM
, EXx
}, PREFIX_DATA
},
7732 { "vcvtph2ps", { XM
, EXxmmq
}, PREFIX_DATA
},
7735 /* VEX_W_0F3816_L_1 */
7736 { "vpermps", { XM
, Vex
, EXx
}, PREFIX_DATA
},
7740 { "%XEvbroadcastss", { XM
, EXd
}, PREFIX_DATA
},
7743 /* VEX_W_0F3819_L_1 */
7744 { "vbroadcastsd", { XM
, EXq
}, PREFIX_DATA
},
7747 /* VEX_W_0F381A_M_0_L_1 */
7748 { "vbroadcastf128", { XM
, Mxmm
}, PREFIX_DATA
},
7751 /* VEX_W_0F382C_M_0 */
7752 { "vmaskmovps", { XM
, Vex
, Mx
}, PREFIX_DATA
},
7755 /* VEX_W_0F382D_M_0 */
7756 { "vmaskmovpd", { XM
, Vex
, Mx
}, PREFIX_DATA
},
7759 /* VEX_W_0F382E_M_0 */
7760 { "vmaskmovps", { Mx
, Vex
, XM
}, PREFIX_DATA
},
7763 /* VEX_W_0F382F_M_0 */
7764 { "vmaskmovpd", { Mx
, Vex
, XM
}, PREFIX_DATA
},
7768 { "vpermd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
7772 { "vpsravd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
7775 /* VEX_W_0F3849_X86_64_P_0 */
7776 { MOD_TABLE (MOD_VEX_0F3849_X86_64_P_0_W_0
) },
7779 /* VEX_W_0F3849_X86_64_P_2 */
7780 { MOD_TABLE (MOD_VEX_0F3849_X86_64_P_2_W_0
) },
7783 /* VEX_W_0F3849_X86_64_P_3 */
7784 { MOD_TABLE (MOD_VEX_0F3849_X86_64_P_3_W_0
) },
7787 /* VEX_W_0F384B_X86_64_P_1 */
7788 { MOD_TABLE (MOD_VEX_0F384B_X86_64_P_1_W_0
) },
7791 /* VEX_W_0F384B_X86_64_P_2 */
7792 { MOD_TABLE (MOD_VEX_0F384B_X86_64_P_2_W_0
) },
7795 /* VEX_W_0F384B_X86_64_P_3 */
7796 { MOD_TABLE (MOD_VEX_0F384B_X86_64_P_3_W_0
) },
7800 { PREFIX_TABLE (PREFIX_VEX_0F3850_W_0
) },
7804 { PREFIX_TABLE (PREFIX_VEX_0F3851_W_0
) },
7808 { "%XVvpdpwssd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
7812 { "%XVvpdpwssds", { XM
, Vex
, EXx
}, PREFIX_DATA
},
7816 { "%XEvpbroadcastd", { XM
, EXd
}, PREFIX_DATA
},
7820 { "vpbroadcastq", { XM
, EXq
}, PREFIX_DATA
},
7823 /* VEX_W_0F385A_M_0_L_0 */
7824 { "vbroadcasti128", { XM
, Mxmm
}, PREFIX_DATA
},
7827 /* VEX_W_0F385C_X86_64_P_1 */
7828 { MOD_TABLE (MOD_VEX_0F385C_X86_64_P_1_W_0
) },
7831 /* VEX_W_0F385C_X86_64_P_3 */
7832 { MOD_TABLE (MOD_VEX_0F385C_X86_64_P_3_W_0
) },
7835 /* VEX_W_0F385E_X86_64_P_0 */
7836 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_0_W_0
) },
7839 /* VEX_W_0F385E_X86_64_P_1 */
7840 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_1_W_0
) },
7843 /* VEX_W_0F385E_X86_64_P_2 */
7844 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_2_W_0
) },
7847 /* VEX_W_0F385E_X86_64_P_3 */
7848 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_3_W_0
) },
7851 /* VEX_W_0F3872_P_1 */
7852 { "%XVvcvtneps2bf16%XY", { XMM
, EXx
}, 0 },
7856 { "%XEvpbroadcastb", { XM
, EXb
}, PREFIX_DATA
},
7860 { "%XEvpbroadcastw", { XM
, EXw
}, PREFIX_DATA
},
7864 { PREFIX_TABLE (PREFIX_VEX_0F38B0_W_0
) },
7868 { PREFIX_TABLE (PREFIX_VEX_0F38B1_W_0
) },
7873 { "%XVvpmadd52luq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
7878 { "%XVvpmadd52huq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
7882 { "%XEvgf2p8mulb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
7885 /* VEX_W_0F3A00_L_1 */
7887 { "%XEvpermq", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7890 /* VEX_W_0F3A01_L_1 */
7892 { "%XEvpermpd", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7896 { "vpblendd", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
7900 { "%XEvpermilps", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7904 { "vpermilpd", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7907 /* VEX_W_0F3A06_L_1 */
7908 { "vperm2f128", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
7911 /* VEX_W_0F3A18_L_1 */
7912 { "vinsertf128", { XM
, Vex
, EXxmm
, Ib
}, PREFIX_DATA
},
7915 /* VEX_W_0F3A19_L_1 */
7916 { "vextractf128", { EXxmm
, XM
, Ib
}, PREFIX_DATA
},
7920 { "%XEvcvtps2ph", { EXxmmq
, XM
, EXxEVexS
, Ib
}, PREFIX_DATA
},
7923 /* VEX_W_0F3A38_L_1 */
7924 { "vinserti128", { XM
, Vex
, EXxmm
, Ib
}, PREFIX_DATA
},
7927 /* VEX_W_0F3A39_L_1 */
7928 { "vextracti128", { EXxmm
, XM
, Ib
}, PREFIX_DATA
},
7931 /* VEX_W_0F3A46_L_1 */
7932 { "vperm2i128", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
7936 { "vblendvps", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
7940 { "vblendvpd", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
7944 { "vpblendvb", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
7949 { "%XEvgf2p8affineqb", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
7954 { "%XEvgf2p8affineinvqb", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
7956 /* VEX_W_0FXOP_08_85_L_0 */
7958 { "vpmacssww", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7960 /* VEX_W_0FXOP_08_86_L_0 */
7962 { "vpmacsswd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7964 /* VEX_W_0FXOP_08_87_L_0 */
7966 { "vpmacssdql", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7968 /* VEX_W_0FXOP_08_8E_L_0 */
7970 { "vpmacssdd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7972 /* VEX_W_0FXOP_08_8F_L_0 */
7974 { "vpmacssdqh", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7976 /* VEX_W_0FXOP_08_95_L_0 */
7978 { "vpmacsww", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7980 /* VEX_W_0FXOP_08_96_L_0 */
7982 { "vpmacswd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7984 /* VEX_W_0FXOP_08_97_L_0 */
7986 { "vpmacsdql", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7988 /* VEX_W_0FXOP_08_9E_L_0 */
7990 { "vpmacsdd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7992 /* VEX_W_0FXOP_08_9F_L_0 */
7994 { "vpmacsdqh", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7996 /* VEX_W_0FXOP_08_A6_L_0 */
7998 { "vpmadcsswd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
8000 /* VEX_W_0FXOP_08_B6_L_0 */
8002 { "vpmadcswd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
8004 /* VEX_W_0FXOP_08_C0_L_0 */
8006 { "vprotb", { XM
, EXx
, Ib
}, 0 },
8008 /* VEX_W_0FXOP_08_C1_L_0 */
8010 { "vprotw", { XM
, EXx
, Ib
}, 0 },
8012 /* VEX_W_0FXOP_08_C2_L_0 */
8014 { "vprotd", { XM
, EXx
, Ib
}, 0 },
8016 /* VEX_W_0FXOP_08_C3_L_0 */
8018 { "vprotq", { XM
, EXx
, Ib
}, 0 },
8020 /* VEX_W_0FXOP_08_CC_L_0 */
8022 { "vpcomb", { XM
, Vex
, EXx
, VPCOM
}, 0 },
8024 /* VEX_W_0FXOP_08_CD_L_0 */
8026 { "vpcomw", { XM
, Vex
, EXx
, VPCOM
}, 0 },
8028 /* VEX_W_0FXOP_08_CE_L_0 */
8030 { "vpcomd", { XM
, Vex
, EXx
, VPCOM
}, 0 },
8032 /* VEX_W_0FXOP_08_CF_L_0 */
8034 { "vpcomq", { XM
, Vex
, EXx
, VPCOM
}, 0 },
8036 /* VEX_W_0FXOP_08_EC_L_0 */
8038 { "vpcomub", { XM
, Vex
, EXx
, VPCOM
}, 0 },
8040 /* VEX_W_0FXOP_08_ED_L_0 */
8042 { "vpcomuw", { XM
, Vex
, EXx
, VPCOM
}, 0 },
8044 /* VEX_W_0FXOP_08_EE_L_0 */
8046 { "vpcomud", { XM
, Vex
, EXx
, VPCOM
}, 0 },
8048 /* VEX_W_0FXOP_08_EF_L_0 */
8050 { "vpcomuq", { XM
, Vex
, EXx
, VPCOM
}, 0 },
8052 /* VEX_W_0FXOP_09_80 */
8054 { "vfrczps", { XM
, EXx
}, 0 },
8056 /* VEX_W_0FXOP_09_81 */
8058 { "vfrczpd", { XM
, EXx
}, 0 },
8060 /* VEX_W_0FXOP_09_82 */
8062 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_82_W_0
) },
8064 /* VEX_W_0FXOP_09_83 */
8066 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_83_W_0
) },
8068 /* VEX_W_0FXOP_09_C1_L_0 */
8070 { "vphaddbw", { XM
, EXxmm
}, 0 },
8072 /* VEX_W_0FXOP_09_C2_L_0 */
8074 { "vphaddbd", { XM
, EXxmm
}, 0 },
8076 /* VEX_W_0FXOP_09_C3_L_0 */
8078 { "vphaddbq", { XM
, EXxmm
}, 0 },
8080 /* VEX_W_0FXOP_09_C6_L_0 */
8082 { "vphaddwd", { XM
, EXxmm
}, 0 },
8084 /* VEX_W_0FXOP_09_C7_L_0 */
8086 { "vphaddwq", { XM
, EXxmm
}, 0 },
8088 /* VEX_W_0FXOP_09_CB_L_0 */
8090 { "vphadddq", { XM
, EXxmm
}, 0 },
8092 /* VEX_W_0FXOP_09_D1_L_0 */
8094 { "vphaddubw", { XM
, EXxmm
}, 0 },
8096 /* VEX_W_0FXOP_09_D2_L_0 */
8098 { "vphaddubd", { XM
, EXxmm
}, 0 },
8100 /* VEX_W_0FXOP_09_D3_L_0 */
8102 { "vphaddubq", { XM
, EXxmm
}, 0 },
8104 /* VEX_W_0FXOP_09_D6_L_0 */
8106 { "vphadduwd", { XM
, EXxmm
}, 0 },
8108 /* VEX_W_0FXOP_09_D7_L_0 */
8110 { "vphadduwq", { XM
, EXxmm
}, 0 },
8112 /* VEX_W_0FXOP_09_DB_L_0 */
8114 { "vphaddudq", { XM
, EXxmm
}, 0 },
8116 /* VEX_W_0FXOP_09_E1_L_0 */
8118 { "vphsubbw", { XM
, EXxmm
}, 0 },
8120 /* VEX_W_0FXOP_09_E2_L_0 */
8122 { "vphsubwd", { XM
, EXxmm
}, 0 },
8124 /* VEX_W_0FXOP_09_E3_L_0 */
8126 { "vphsubdq", { XM
, EXxmm
}, 0 },
8129 #include "i386-dis-evex-w.h"
8132 static const struct dis386 mod_table
[][2] = {
8135 { "bound{S|}", { Gv
, Ma
}, 0 },
8136 { EVEX_TABLE (EVEX_0F
) },
8140 { "leaS", { Gv
, M
}, 0 },
8144 { "lesS", { Gv
, Mp
}, 0 },
8145 { VEX_C4_TABLE (VEX_0F
) },
8149 { "ldsS", { Gv
, Mp
}, 0 },
8150 { VEX_C5_TABLE (VEX_0F
) },
8155 { RM_TABLE (RM_C6_REG_7
) },
8160 { RM_TABLE (RM_C7_REG_7
) },
8164 { "{l|}call^", { indirEp
}, 0 },
8168 { "{l|}jmp^", { indirEp
}, 0 },
8171 /* MOD_0F01_REG_0 */
8172 { X86_64_TABLE (X86_64_0F01_REG_0
) },
8173 { RM_TABLE (RM_0F01_REG_0
) },
8176 /* MOD_0F01_REG_1 */
8177 { X86_64_TABLE (X86_64_0F01_REG_1
) },
8178 { RM_TABLE (RM_0F01_REG_1
) },
8181 /* MOD_0F01_REG_2 */
8182 { X86_64_TABLE (X86_64_0F01_REG_2
) },
8183 { RM_TABLE (RM_0F01_REG_2
) },
8186 /* MOD_0F01_REG_3 */
8187 { X86_64_TABLE (X86_64_0F01_REG_3
) },
8188 { RM_TABLE (RM_0F01_REG_3
) },
8191 /* MOD_0F01_REG_5 */
8192 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_0
) },
8193 { RM_TABLE (RM_0F01_REG_5_MOD_3
) },
8196 /* MOD_0F01_REG_7 */
8197 { "invlpg", { Mb
}, 0 },
8198 { RM_TABLE (RM_0F01_REG_7_MOD_3
) },
8201 /* MOD_0F12_PREFIX_0 */
8202 { "movlpX", { XM
, EXq
}, 0 },
8203 { "movhlps", { XM
, EXq
}, 0 },
8206 /* MOD_0F12_PREFIX_2 */
8207 { "movlpX", { XM
, EXq
}, 0 },
8211 { "movlpX", { EXq
, XM
}, PREFIX_OPCODE
},
8214 /* MOD_0F16_PREFIX_0 */
8215 { "movhpX", { XM
, EXq
}, 0 },
8216 { "movlhps", { XM
, EXq
}, 0 },
8219 /* MOD_0F16_PREFIX_2 */
8220 { "movhpX", { XM
, EXq
}, 0 },
8224 { "movhpX", { EXq
, XM
}, PREFIX_OPCODE
},
8227 /* MOD_0F18_REG_0 */
8228 { "prefetchnta", { Mb
}, 0 },
8229 { "nopQ", { Ev
}, 0 },
8232 /* MOD_0F18_REG_1 */
8233 { "prefetcht0", { Mb
}, 0 },
8234 { "nopQ", { Ev
}, 0 },
8237 /* MOD_0F18_REG_2 */
8238 { "prefetcht1", { Mb
}, 0 },
8239 { "nopQ", { Ev
}, 0 },
8242 /* MOD_0F18_REG_3 */
8243 { "prefetcht2", { Mb
}, 0 },
8244 { "nopQ", { Ev
}, 0 },
8247 /* MOD_0F18_REG_6 */
8248 { X86_64_TABLE (X86_64_0F18_REG_6_MOD_0
) },
8249 { "nopQ", { Ev
}, 0 },
8252 /* MOD_0F18_REG_7 */
8253 { X86_64_TABLE (X86_64_0F18_REG_7_MOD_0
) },
8254 { "nopQ", { Ev
}, 0 },
8257 /* MOD_0F1A_PREFIX_0 */
8258 { "bndldx", { Gbnd
, Mv_bnd
}, 0 },
8259 { "nopQ", { Ev
}, 0 },
8262 /* MOD_0F1B_PREFIX_0 */
8263 { "bndstx", { Mv_bnd
, Gbnd
}, 0 },
8264 { "nopQ", { Ev
}, 0 },
8267 /* MOD_0F1B_PREFIX_1 */
8268 { "bndmk", { Gbnd
, Mv_bnd
}, 0 },
8269 { "nopQ", { Ev
}, PREFIX_IGNORED
},
8272 /* MOD_0F1C_PREFIX_0 */
8273 { REG_TABLE (REG_0F1C_P_0_MOD_0
) },
8274 { "nopQ", { Ev
}, 0 },
8277 /* MOD_0F1E_PREFIX_1 */
8278 { "nopQ", { Ev
}, PREFIX_IGNORED
},
8279 { REG_TABLE (REG_0F1E_P_1_MOD_3
) },
8282 /* MOD_0F2B_PREFIX_0 */
8283 {"movntps", { Mx
, XM
}, PREFIX_OPCODE
},
8286 /* MOD_0F2B_PREFIX_1 */
8287 {"movntss", { Md
, XM
}, PREFIX_OPCODE
},
8290 /* MOD_0F2B_PREFIX_2 */
8291 {"movntpd", { Mx
, XM
}, PREFIX_OPCODE
},
8294 /* MOD_0F2B_PREFIX_3 */
8295 {"movntsd", { Mq
, XM
}, PREFIX_OPCODE
},
8300 { "movmskpX", { Gdq
, XS
}, PREFIX_OPCODE
},
8305 { REG_TABLE (REG_0F71_MOD_0
) },
8310 { REG_TABLE (REG_0F72_MOD_0
) },
8315 { REG_TABLE (REG_0F73_MOD_0
) },
8318 /* MOD_0FAE_REG_0 */
8319 { "fxsave", { FXSAVE
}, 0 },
8320 { PREFIX_TABLE (PREFIX_0FAE_REG_0_MOD_3
) },
8323 /* MOD_0FAE_REG_1 */
8324 { "fxrstor", { FXSAVE
}, 0 },
8325 { PREFIX_TABLE (PREFIX_0FAE_REG_1_MOD_3
) },
8328 /* MOD_0FAE_REG_2 */
8329 { "ldmxcsr", { Md
}, 0 },
8330 { PREFIX_TABLE (PREFIX_0FAE_REG_2_MOD_3
) },
8333 /* MOD_0FAE_REG_3 */
8334 { "stmxcsr", { Md
}, 0 },
8335 { PREFIX_TABLE (PREFIX_0FAE_REG_3_MOD_3
) },
8338 /* MOD_0FAE_REG_4 */
8339 { PREFIX_TABLE (PREFIX_0FAE_REG_4_MOD_0
) },
8340 { PREFIX_TABLE (PREFIX_0FAE_REG_4_MOD_3
) },
8343 /* MOD_0FAE_REG_5 */
8344 { "xrstor", { FXSAVE
}, PREFIX_OPCODE
},
8345 { PREFIX_TABLE (PREFIX_0FAE_REG_5_MOD_3
) },
8348 /* MOD_0FAE_REG_6 */
8349 { PREFIX_TABLE (PREFIX_0FAE_REG_6_MOD_0
) },
8350 { PREFIX_TABLE (PREFIX_0FAE_REG_6_MOD_3
) },
8353 /* MOD_0FAE_REG_7 */
8354 { PREFIX_TABLE (PREFIX_0FAE_REG_7_MOD_0
) },
8355 { RM_TABLE (RM_0FAE_REG_7_MOD_3
) },
8359 { "lssS", { Gv
, Mp
}, 0 },
8363 { "lfsS", { Gv
, Mp
}, 0 },
8367 { "lgsS", { Gv
, Mp
}, 0 },
8371 { "movntiS", { Edq
, Gdq
}, PREFIX_OPCODE
},
8374 /* MOD_0FC7_REG_3 */
8375 { "xrstors", { FXSAVE
}, 0 },
8378 /* MOD_0FC7_REG_4 */
8379 { "xsavec", { FXSAVE
}, 0 },
8382 /* MOD_0FC7_REG_5 */
8383 { "xsaves", { FXSAVE
}, 0 },
8386 /* MOD_0FC7_REG_6 */
8387 { PREFIX_TABLE (PREFIX_0FC7_REG_6_MOD_0
) },
8388 { PREFIX_TABLE (PREFIX_0FC7_REG_6_MOD_3
) }
8391 /* MOD_0FC7_REG_7 */
8392 { "vmptrst", { Mq
}, 0 },
8393 { PREFIX_TABLE (PREFIX_0FC7_REG_7_MOD_3
) }
8398 { "pmovmskb", { Gdq
, MS
}, 0 },
8401 /* MOD_0FE7_PREFIX_2 */
8402 { "movntdq", { Mx
, XM
}, 0 },
8405 /* MOD_0FF0_PREFIX_3 */
8406 { "lddqu", { XM
, M
}, 0 },
8410 { "movntdqa", { XM
, Mx
}, PREFIX_DATA
},
8413 /* MOD_0F38DC_PREFIX_1 */
8414 { "aesenc128kl", { XM
, M
}, 0 },
8415 { "loadiwkey", { XM
, EXx
}, 0 },
8418 /* MOD_0F38DD_PREFIX_1 */
8419 { "aesdec128kl", { XM
, M
}, 0 },
8422 /* MOD_0F38DE_PREFIX_1 */
8423 { "aesenc256kl", { XM
, M
}, 0 },
8426 /* MOD_0F38DF_PREFIX_1 */
8427 { "aesdec256kl", { XM
, M
}, 0 },
8431 { "wrussK", { M
, Gdq
}, PREFIX_DATA
},
8434 /* MOD_0F38F6_PREFIX_0 */
8435 { "wrssK", { M
, Gdq
}, PREFIX_OPCODE
},
8438 /* MOD_0F38F8_PREFIX_1 */
8439 { "enqcmds", { Gva
, M
}, PREFIX_OPCODE
},
8442 /* MOD_0F38F8_PREFIX_2 */
8443 { "movdir64b", { Gva
, M
}, PREFIX_OPCODE
},
8446 /* MOD_0F38F8_PREFIX_3 */
8447 { "enqcmd", { Gva
, M
}, PREFIX_OPCODE
},
8451 { "movdiri", { Edq
, Gdq
}, PREFIX_OPCODE
},
8454 /* MOD_0F38FA_PREFIX_1 */
8456 { "encodekey128", { Gd
, Ed
}, 0 },
8459 /* MOD_0F38FB_PREFIX_1 */
8461 { "encodekey256", { Gd
, Ed
}, 0 },
8464 /* MOD_0F3A0F_PREFIX_1 */
8466 { REG_TABLE (REG_0F3A0F_PREFIX_1_MOD_3
) },
8469 /* MOD_VEX_0F12_PREFIX_0 */
8470 { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_0
) },
8471 { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_1
) },
8474 /* MOD_VEX_0F12_PREFIX_2 */
8475 { VEX_LEN_TABLE (VEX_LEN_0F12_P_2_M_0
) },
8479 { VEX_LEN_TABLE (VEX_LEN_0F13_M_0
) },
8482 /* MOD_VEX_0F16_PREFIX_0 */
8483 { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_0
) },
8484 { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_1
) },
8487 /* MOD_VEX_0F16_PREFIX_2 */
8488 { VEX_LEN_TABLE (VEX_LEN_0F16_P_2_M_0
) },
8492 { VEX_LEN_TABLE (VEX_LEN_0F17_M_0
) },
8496 { "%XEvmovntpX", { Mx
, XM
}, PREFIX_OPCODE
},
8499 /* MOD_VEX_0F41_L_1 */
8501 { VEX_W_TABLE (VEX_W_0F41_L_1_M_1
) },
8504 /* MOD_VEX_0F42_L_1 */
8506 { VEX_W_TABLE (VEX_W_0F42_L_1_M_1
) },
8509 /* MOD_VEX_0F44_L_0 */
8511 { VEX_W_TABLE (VEX_W_0F44_L_0_M_1
) },
8514 /* MOD_VEX_0F45_L_1 */
8516 { VEX_W_TABLE (VEX_W_0F45_L_1_M_1
) },
8519 /* MOD_VEX_0F46_L_1 */
8521 { VEX_W_TABLE (VEX_W_0F46_L_1_M_1
) },
8524 /* MOD_VEX_0F47_L_1 */
8526 { VEX_W_TABLE (VEX_W_0F47_L_1_M_1
) },
8529 /* MOD_VEX_0F4A_L_1 */
8531 { VEX_W_TABLE (VEX_W_0F4A_L_1_M_1
) },
8534 /* MOD_VEX_0F4B_L_1 */
8536 { VEX_W_TABLE (VEX_W_0F4B_L_1_M_1
) },
8541 { "vmovmskpX", { Gdq
, XS
}, PREFIX_OPCODE
},
8546 { REG_TABLE (REG_VEX_0F71_M_0
) },
8551 { REG_TABLE (REG_VEX_0F72_M_0
) },
8556 { REG_TABLE (REG_VEX_0F73_M_0
) },
8559 /* MOD_VEX_0F91_L_0 */
8560 { VEX_W_TABLE (VEX_W_0F91_L_0_M_0
) },
8563 /* MOD_VEX_0F92_L_0 */
8565 { VEX_W_TABLE (VEX_W_0F92_L_0_M_1
) },
8568 /* MOD_VEX_0F93_L_0 */
8570 { VEX_W_TABLE (VEX_W_0F93_L_0_M_1
) },
8573 /* MOD_VEX_0F98_L_0 */
8575 { VEX_W_TABLE (VEX_W_0F98_L_0_M_1
) },
8578 /* MOD_VEX_0F99_L_0 */
8580 { VEX_W_TABLE (VEX_W_0F99_L_0_M_1
) },
8583 /* MOD_VEX_0FAE_REG_2 */
8584 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_2_M_0
) },
8587 /* MOD_VEX_0FAE_REG_3 */
8588 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_3_M_0
) },
8593 { "vpmovmskb", { Gdq
, XS
}, PREFIX_DATA
},
8597 { "vmovntdq", { Mx
, XM
}, PREFIX_DATA
},
8600 /* MOD_VEX_0FF0_PREFIX_3 */
8601 { "vlddqu", { XM
, M
}, 0 },
8604 /* MOD_VEX_0F381A */
8605 { VEX_LEN_TABLE (VEX_LEN_0F381A_M_0
) },
8608 /* MOD_VEX_0F382A */
8609 { "vmovntdqa", { XM
, Mx
}, PREFIX_DATA
},
8612 /* MOD_VEX_0F382C */
8613 { VEX_W_TABLE (VEX_W_0F382C_M_0
) },
8616 /* MOD_VEX_0F382D */
8617 { VEX_W_TABLE (VEX_W_0F382D_M_0
) },
8620 /* MOD_VEX_0F382E */
8621 { VEX_W_TABLE (VEX_W_0F382E_M_0
) },
8624 /* MOD_VEX_0F382F */
8625 { VEX_W_TABLE (VEX_W_0F382F_M_0
) },
8628 /* MOD_VEX_0F3849_X86_64_P_0_W_0 */
8629 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_0_W_0_M_0
) },
8630 { REG_TABLE (REG_VEX_0F3849_X86_64_P_0_W_0_M_1
) },
8633 /* MOD_VEX_0F3849_X86_64_P_2_W_0 */
8634 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_2_W_0_M_0
) },
8637 /* MOD_VEX_0F3849_X86_64_P_3_W_0 */
8639 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_3_W_0_M_0
) },
8642 /* MOD_VEX_0F384B_X86_64_P_1_W_0 */
8643 { VEX_LEN_TABLE (VEX_LEN_0F384B_X86_64_P_1_W_0_M_0
) },
8646 /* MOD_VEX_0F384B_X86_64_P_2_W_0 */
8647 { VEX_LEN_TABLE (VEX_LEN_0F384B_X86_64_P_2_W_0_M_0
) },
8650 /* MOD_VEX_0F384B_X86_64_P_3_W_0 */
8651 { VEX_LEN_TABLE (VEX_LEN_0F384B_X86_64_P_3_W_0_M_0
) },
8654 /* MOD_VEX_0F385A */
8655 { VEX_LEN_TABLE (VEX_LEN_0F385A_M_0
) },
8658 /* MOD_VEX_0F385C_X86_64_P_1_W_0 */
8660 { VEX_LEN_TABLE (VEX_LEN_0F385C_X86_64_P_1_W_0_M_0
) },
8663 /* MOD_VEX_0F385C_X86_64_P_3_W_0 */
8665 { VEX_LEN_TABLE (VEX_LEN_0F385C_X86_64_P_3_W_0_M_0
) },
8668 /* MOD_VEX_0F385E_X86_64_P_0_W_0 */
8670 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_0_W_0_M_0
) },
8673 /* MOD_VEX_0F385E_X86_64_P_1_W_0 */
8675 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_1_W_0_M_0
) },
8678 /* MOD_VEX_0F385E_X86_64_P_2_W_0 */
8680 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_2_W_0_M_0
) },
8683 /* MOD_VEX_0F385E_X86_64_P_3_W_0 */
8685 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_3_W_0_M_0
) },
8688 /* MOD_VEX_0F388C */
8689 { "vpmaskmov%DQ", { XM
, Vex
, Mx
}, PREFIX_DATA
},
8692 /* MOD_VEX_0F388E */
8693 { "vpmaskmov%DQ", { Mx
, Vex
, XM
}, PREFIX_DATA
},
8696 /* MOD_VEX_0F3A30_L_0 */
8698 { "kshiftr%BW", { MaskG
, MaskE
, Ib
}, PREFIX_DATA
},
8701 /* MOD_VEX_0F3A31_L_0 */
8703 { "kshiftr%DQ", { MaskG
, MaskE
, Ib
}, PREFIX_DATA
},
8706 /* MOD_VEX_0F3A32_L_0 */
8708 { "kshiftl%BW", { MaskG
, MaskE
, Ib
}, PREFIX_DATA
},
8711 /* MOD_VEX_0F3A33_L_0 */
8713 { "kshiftl%DQ", { MaskG
, MaskE
, Ib
}, PREFIX_DATA
},
8718 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_12_M_1
) },
8721 #include "i386-dis-evex-mod.h"
8724 static const struct dis386 rm_table
[][8] = {
8727 { "xabort", { Skip_MODRM
, Ib
}, 0 },
8731 { "xbeginT", { Skip_MODRM
, Jdqw
}, 0 },
8735 { "enclv", { Skip_MODRM
}, 0 },
8736 { "vmcall", { Skip_MODRM
}, 0 },
8737 { "vmlaunch", { Skip_MODRM
}, 0 },
8738 { "vmresume", { Skip_MODRM
}, 0 },
8739 { "vmxoff", { Skip_MODRM
}, 0 },
8740 { "pconfig", { Skip_MODRM
}, 0 },
8741 { PREFIX_TABLE (PREFIX_0F01_REG_0_MOD_3_RM_6
) },
8745 { "monitor", { { OP_Monitor
, 0 } }, 0 },
8746 { "mwait", { { OP_Mwait
, 0 } }, 0 },
8747 { "clac", { Skip_MODRM
}, 0 },
8748 { "stac", { Skip_MODRM
}, 0 },
8749 { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_4
) },
8750 { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_5
) },
8751 { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_6
) },
8752 { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_7
) },
8756 { "xgetbv", { Skip_MODRM
}, 0 },
8757 { "xsetbv", { Skip_MODRM
}, 0 },
8760 { "vmfunc", { Skip_MODRM
}, 0 },
8761 { "xend", { Skip_MODRM
}, 0 },
8762 { "xtest", { Skip_MODRM
}, 0 },
8763 { "enclu", { Skip_MODRM
}, 0 },
8767 { "vmrun", { Skip_MODRM
}, 0 },
8768 { PREFIX_TABLE (PREFIX_0F01_REG_3_RM_1
) },
8769 { "vmload", { Skip_MODRM
}, 0 },
8770 { "vmsave", { Skip_MODRM
}, 0 },
8771 { "stgi", { Skip_MODRM
}, 0 },
8772 { "clgi", { Skip_MODRM
}, 0 },
8773 { "skinit", { Skip_MODRM
}, 0 },
8774 { "invlpga", { Skip_MODRM
}, 0 },
8777 /* RM_0F01_REG_5_MOD_3 */
8778 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_0
) },
8779 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_1
) },
8780 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_2
) },
8782 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_4
) },
8783 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_5
) },
8784 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_6
) },
8785 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_7
) },
8788 /* RM_0F01_REG_7_MOD_3 */
8789 { "swapgs", { Skip_MODRM
}, 0 },
8790 { "rdtscp", { Skip_MODRM
}, 0 },
8791 { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_2
) },
8792 { "mwaitx", { { OP_Mwait
, eBX_reg
} }, PREFIX_OPCODE
},
8793 { "clzero", { Skip_MODRM
}, 0 },
8794 { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_5
) },
8795 { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_6
) },
8796 { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_7
) },
8799 /* RM_0F1E_P_1_MOD_3_REG_7 */
8800 { "nopQ", { Ev
}, PREFIX_IGNORED
},
8801 { "nopQ", { Ev
}, PREFIX_IGNORED
},
8802 { "endbr64", { Skip_MODRM
}, 0 },
8803 { "endbr32", { Skip_MODRM
}, 0 },
8804 { "nopQ", { Ev
}, PREFIX_IGNORED
},
8805 { "nopQ", { Ev
}, PREFIX_IGNORED
},
8806 { "nopQ", { Ev
}, PREFIX_IGNORED
},
8807 { "nopQ", { Ev
}, PREFIX_IGNORED
},
8810 /* RM_0FAE_REG_6_MOD_3 */
8811 { "mfence", { Skip_MODRM
}, 0 },
8814 /* RM_0FAE_REG_7_MOD_3 */
8815 { "sfence", { Skip_MODRM
}, 0 },
8818 /* RM_0F3A0F_P_1_MOD_3_REG_0 */
8819 { "hreset", { Skip_MODRM
, Ib
}, 0 },
8822 /* RM_VEX_0F3849_X86_64_P_0_W_0_M_1_R_0 */
8823 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_0_W_0_M_1_REG_0_RM_0
) },
8827 #define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
8829 /* The values used here must be non-zero, fit in 'unsigned char', and not be
8830 in conflict with actual prefix opcodes. */
8831 #define REP_PREFIX 0x01
8832 #define XACQUIRE_PREFIX 0x02
8833 #define XRELEASE_PREFIX 0x03
8834 #define BND_PREFIX 0x04
8835 #define NOTRACK_PREFIX 0x05
8838 ckprefix (instr_info
*ins
)
8840 int newrex
, i
, length
;
8844 /* The maximum instruction length is 15bytes. */
8845 while (length
< MAX_CODE_LENGTH
- 1)
8847 FETCH_DATA (ins
->info
, ins
->codep
+ 1);
8849 switch (*ins
->codep
)
8851 /* REX prefixes family. */
8868 if (ins
->address_mode
== mode_64bit
)
8869 newrex
= *ins
->codep
;
8872 ins
->last_rex_prefix
= i
;
8875 ins
->prefixes
|= PREFIX_REPZ
;
8876 ins
->last_repz_prefix
= i
;
8879 ins
->prefixes
|= PREFIX_REPNZ
;
8880 ins
->last_repnz_prefix
= i
;
8883 ins
->prefixes
|= PREFIX_LOCK
;
8884 ins
->last_lock_prefix
= i
;
8887 ins
->prefixes
|= PREFIX_CS
;
8888 ins
->last_seg_prefix
= i
;
8889 if (ins
->address_mode
!= mode_64bit
)
8890 ins
->active_seg_prefix
= PREFIX_CS
;
8893 ins
->prefixes
|= PREFIX_SS
;
8894 ins
->last_seg_prefix
= i
;
8895 if (ins
->address_mode
!= mode_64bit
)
8896 ins
->active_seg_prefix
= PREFIX_SS
;
8899 ins
->prefixes
|= PREFIX_DS
;
8900 ins
->last_seg_prefix
= i
;
8901 if (ins
->address_mode
!= mode_64bit
)
8902 ins
->active_seg_prefix
= PREFIX_DS
;
8905 ins
->prefixes
|= PREFIX_ES
;
8906 ins
->last_seg_prefix
= i
;
8907 if (ins
->address_mode
!= mode_64bit
)
8908 ins
->active_seg_prefix
= PREFIX_ES
;
8911 ins
->prefixes
|= PREFIX_FS
;
8912 ins
->last_seg_prefix
= i
;
8913 ins
->active_seg_prefix
= PREFIX_FS
;
8916 ins
->prefixes
|= PREFIX_GS
;
8917 ins
->last_seg_prefix
= i
;
8918 ins
->active_seg_prefix
= PREFIX_GS
;
8921 ins
->prefixes
|= PREFIX_DATA
;
8922 ins
->last_data_prefix
= i
;
8925 ins
->prefixes
|= PREFIX_ADDR
;
8926 ins
->last_addr_prefix
= i
;
8929 /* fwait is really an instruction. If there are prefixes
8930 before the fwait, they belong to the fwait, *not* to the
8931 following instruction. */
8932 ins
->fwait_prefix
= i
;
8933 if (ins
->prefixes
|| ins
->rex
)
8935 ins
->prefixes
|= PREFIX_FWAIT
;
8937 /* This ensures that the previous REX prefixes are noticed
8938 as unused prefixes, as in the return case below. */
8939 ins
->rex_used
= ins
->rex
;
8942 ins
->prefixes
= PREFIX_FWAIT
;
8947 /* Rex is ignored when followed by another prefix. */
8950 ins
->rex_used
= ins
->rex
;
8953 if (*ins
->codep
!= FWAIT_OPCODE
)
8954 ins
->all_prefixes
[i
++] = *ins
->codep
;
8962 /* Return the name of the prefix byte PREF, or NULL if PREF is not a
8966 prefix_name (instr_info
*ins
, int pref
, int sizeflag
)
8968 static const char *rexes
[16] =
8973 "rex.XB", /* 0x43 */
8975 "rex.RB", /* 0x45 */
8976 "rex.RX", /* 0x46 */
8977 "rex.RXB", /* 0x47 */
8979 "rex.WB", /* 0x49 */
8980 "rex.WX", /* 0x4a */
8981 "rex.WXB", /* 0x4b */
8982 "rex.WR", /* 0x4c */
8983 "rex.WRB", /* 0x4d */
8984 "rex.WRX", /* 0x4e */
8985 "rex.WRXB", /* 0x4f */
8990 /* REX prefixes family. */
9007 return rexes
[pref
- 0x40];
9027 return (sizeflag
& DFLAG
) ? "data16" : "data32";
9029 if (ins
->address_mode
== mode_64bit
)
9030 return (sizeflag
& AFLAG
) ? "addr32" : "addr64";
9032 return (sizeflag
& AFLAG
) ? "addr16" : "addr32";
9037 case XACQUIRE_PREFIX
:
9039 case XRELEASE_PREFIX
:
9043 case NOTRACK_PREFIX
:
9051 print_i386_disassembler_options (FILE *stream
)
9053 fprintf (stream
, _("\n\
9054 The following i386/x86-64 specific disassembler options are supported for use\n\
9055 with the -M switch (multiple options should be separated by commas):\n"));
9057 fprintf (stream
, _(" x86-64 Disassemble in 64bit mode\n"));
9058 fprintf (stream
, _(" i386 Disassemble in 32bit mode\n"));
9059 fprintf (stream
, _(" i8086 Disassemble in 16bit mode\n"));
9060 fprintf (stream
, _(" att Display instruction in AT&T syntax\n"));
9061 fprintf (stream
, _(" intel Display instruction in Intel syntax\n"));
9062 fprintf (stream
, _(" att-mnemonic\n"
9063 " Display instruction in AT&T mnemonic\n"));
9064 fprintf (stream
, _(" intel-mnemonic\n"
9065 " Display instruction in Intel mnemonic\n"));
9066 fprintf (stream
, _(" addr64 Assume 64bit address size\n"));
9067 fprintf (stream
, _(" addr32 Assume 32bit address size\n"));
9068 fprintf (stream
, _(" addr16 Assume 16bit address size\n"));
9069 fprintf (stream
, _(" data32 Assume 32bit data size\n"));
9070 fprintf (stream
, _(" data16 Assume 16bit data size\n"));
9071 fprintf (stream
, _(" suffix Always display instruction suffix in AT&T syntax\n"));
9072 fprintf (stream
, _(" amd64 Display instruction in AMD64 ISA\n"));
9073 fprintf (stream
, _(" intel64 Display instruction in Intel64 ISA\n"));
9077 static const struct dis386 bad_opcode
= { "(bad)", { XX
}, 0 };
9079 /* Get a pointer to struct dis386 with a valid name. */
9081 static const struct dis386
*
9082 get_valid_dis386 (const struct dis386
*dp
, instr_info
*ins
)
9084 int vindex
, vex_table_index
;
9086 if (dp
->name
!= NULL
)
9089 switch (dp
->op
[0].bytemode
)
9092 dp
= ®_table
[dp
->op
[1].bytemode
][ins
->modrm
.reg
];
9096 vindex
= ins
->modrm
.mod
== 0x3 ? 1 : 0;
9097 dp
= &mod_table
[dp
->op
[1].bytemode
][vindex
];
9101 dp
= &rm_table
[dp
->op
[1].bytemode
][ins
->modrm
.rm
];
9104 case USE_PREFIX_TABLE
:
9107 /* The prefix in VEX is implicit. */
9108 switch (ins
->vex
.prefix
)
9113 case REPE_PREFIX_OPCODE
:
9116 case DATA_PREFIX_OPCODE
:
9119 case REPNE_PREFIX_OPCODE
:
9129 int last_prefix
= -1;
9132 /* We check PREFIX_REPNZ and PREFIX_REPZ before PREFIX_DATA.
9133 When there are multiple PREFIX_REPNZ and PREFIX_REPZ, the
9135 if ((ins
->prefixes
& (PREFIX_REPZ
| PREFIX_REPNZ
)) != 0)
9137 if (ins
->last_repz_prefix
> ins
->last_repnz_prefix
)
9140 prefix
= PREFIX_REPZ
;
9141 last_prefix
= ins
->last_repz_prefix
;
9146 prefix
= PREFIX_REPNZ
;
9147 last_prefix
= ins
->last_repnz_prefix
;
9150 /* Check if prefix should be ignored. */
9151 if ((((prefix_table
[dp
->op
[1].bytemode
][vindex
].prefix_requirement
9152 & PREFIX_IGNORED
) >> PREFIX_IGNORED_SHIFT
)
9154 && !prefix_table
[dp
->op
[1].bytemode
][vindex
].name
)
9158 if (vindex
== 0 && (ins
->prefixes
& PREFIX_DATA
) != 0)
9161 prefix
= PREFIX_DATA
;
9162 last_prefix
= ins
->last_data_prefix
;
9167 ins
->used_prefixes
|= prefix
;
9168 ins
->all_prefixes
[last_prefix
] = 0;
9171 dp
= &prefix_table
[dp
->op
[1].bytemode
][vindex
];
9174 case USE_X86_64_TABLE
:
9175 vindex
= ins
->address_mode
== mode_64bit
? 1 : 0;
9176 dp
= &x86_64_table
[dp
->op
[1].bytemode
][vindex
];
9179 case USE_3BYTE_TABLE
:
9180 FETCH_DATA (ins
->info
, ins
->codep
+ 2);
9181 vindex
= *ins
->codep
++;
9182 dp
= &three_byte_table
[dp
->op
[1].bytemode
][vindex
];
9183 ins
->end_codep
= ins
->codep
;
9184 ins
->modrm
.mod
= (*ins
->codep
>> 6) & 3;
9185 ins
->modrm
.reg
= (*ins
->codep
>> 3) & 7;
9186 ins
->modrm
.rm
= *ins
->codep
& 7;
9189 case USE_VEX_LEN_TABLE
:
9193 switch (ins
->vex
.length
)
9199 /* This allows re-using in particular table entries where only
9200 128-bit operand size (VEX.L=0 / EVEX.L'L=0) are valid. */
9213 dp
= &vex_len_table
[dp
->op
[1].bytemode
][vindex
];
9216 case USE_EVEX_LEN_TABLE
:
9220 switch (ins
->vex
.length
)
9236 dp
= &evex_len_table
[dp
->op
[1].bytemode
][vindex
];
9239 case USE_XOP_8F_TABLE
:
9240 FETCH_DATA (ins
->info
, ins
->codep
+ 3);
9241 ins
->rex
= ~(*ins
->codep
>> 5) & 0x7;
9243 /* VEX_TABLE_INDEX is the mmmmm part of the XOP byte 1 "RCB.mmmmm". */
9244 switch ((*ins
->codep
& 0x1f))
9250 vex_table_index
= XOP_08
;
9253 vex_table_index
= XOP_09
;
9256 vex_table_index
= XOP_0A
;
9260 ins
->vex
.w
= *ins
->codep
& 0x80;
9261 if (ins
->vex
.w
&& ins
->address_mode
== mode_64bit
)
9264 ins
->vex
.register_specifier
= (~(*ins
->codep
>> 3)) & 0xf;
9265 if (ins
->address_mode
!= mode_64bit
)
9267 /* In 16/32-bit mode REX_B is silently ignored. */
9271 ins
->vex
.length
= (*ins
->codep
& 0x4) ? 256 : 128;
9272 switch ((*ins
->codep
& 0x3))
9277 ins
->vex
.prefix
= DATA_PREFIX_OPCODE
;
9280 ins
->vex
.prefix
= REPE_PREFIX_OPCODE
;
9283 ins
->vex
.prefix
= REPNE_PREFIX_OPCODE
;
9286 ins
->need_vex
= true;
9288 vindex
= *ins
->codep
++;
9289 dp
= &xop_table
[vex_table_index
][vindex
];
9291 ins
->end_codep
= ins
->codep
;
9292 FETCH_DATA (ins
->info
, ins
->codep
+ 1);
9293 ins
->modrm
.mod
= (*ins
->codep
>> 6) & 3;
9294 ins
->modrm
.reg
= (*ins
->codep
>> 3) & 7;
9295 ins
->modrm
.rm
= *ins
->codep
& 7;
9297 /* No XOP encoding so far allows for a non-zero embedded prefix. Avoid
9298 having to decode the bits for every otherwise valid encoding. */
9299 if (ins
->vex
.prefix
)
9303 case USE_VEX_C4_TABLE
:
9305 FETCH_DATA (ins
->info
, ins
->codep
+ 3);
9306 ins
->rex
= ~(*ins
->codep
>> 5) & 0x7;
9307 switch ((*ins
->codep
& 0x1f))
9313 vex_table_index
= VEX_0F
;
9316 vex_table_index
= VEX_0F38
;
9319 vex_table_index
= VEX_0F3A
;
9323 ins
->vex
.w
= *ins
->codep
& 0x80;
9324 if (ins
->address_mode
== mode_64bit
)
9331 /* For the 3-byte VEX prefix in 32-bit mode, the REX_B bit
9332 is ignored, other REX bits are 0 and the highest bit in
9333 VEX.vvvv is also ignored (but we mustn't clear it here). */
9336 ins
->vex
.register_specifier
= (~(*ins
->codep
>> 3)) & 0xf;
9337 ins
->vex
.length
= (*ins
->codep
& 0x4) ? 256 : 128;
9338 switch ((*ins
->codep
& 0x3))
9343 ins
->vex
.prefix
= DATA_PREFIX_OPCODE
;
9346 ins
->vex
.prefix
= REPE_PREFIX_OPCODE
;
9349 ins
->vex
.prefix
= REPNE_PREFIX_OPCODE
;
9352 ins
->need_vex
= true;
9354 vindex
= *ins
->codep
++;
9355 dp
= &vex_table
[vex_table_index
][vindex
];
9356 ins
->end_codep
= ins
->codep
;
9357 /* There is no MODRM byte for VEX0F 77. */
9358 if (vex_table_index
!= VEX_0F
|| vindex
!= 0x77)
9360 FETCH_DATA (ins
->info
, ins
->codep
+ 1);
9361 ins
->modrm
.mod
= (*ins
->codep
>> 6) & 3;
9362 ins
->modrm
.reg
= (*ins
->codep
>> 3) & 7;
9363 ins
->modrm
.rm
= *ins
->codep
& 7;
9367 case USE_VEX_C5_TABLE
:
9369 FETCH_DATA (ins
->info
, ins
->codep
+ 2);
9370 ins
->rex
= (*ins
->codep
& 0x80) ? 0 : REX_R
;
9372 /* For the 2-byte VEX prefix in 32-bit mode, the highest bit in
9374 ins
->vex
.register_specifier
= (~(*ins
->codep
>> 3)) & 0xf;
9375 ins
->vex
.length
= (*ins
->codep
& 0x4) ? 256 : 128;
9376 switch ((*ins
->codep
& 0x3))
9381 ins
->vex
.prefix
= DATA_PREFIX_OPCODE
;
9384 ins
->vex
.prefix
= REPE_PREFIX_OPCODE
;
9387 ins
->vex
.prefix
= REPNE_PREFIX_OPCODE
;
9390 ins
->need_vex
= true;
9392 vindex
= *ins
->codep
++;
9393 dp
= &vex_table
[dp
->op
[1].bytemode
][vindex
];
9394 ins
->end_codep
= ins
->codep
;
9395 /* There is no MODRM byte for VEX 77. */
9398 FETCH_DATA (ins
->info
, ins
->codep
+ 1);
9399 ins
->modrm
.mod
= (*ins
->codep
>> 6) & 3;
9400 ins
->modrm
.reg
= (*ins
->codep
>> 3) & 7;
9401 ins
->modrm
.rm
= *ins
->codep
& 7;
9405 case USE_VEX_W_TABLE
:
9409 dp
= &vex_w_table
[dp
->op
[1].bytemode
][ins
->vex
.w
];
9412 case USE_EVEX_TABLE
:
9413 ins
->two_source_ops
= false;
9415 ins
->vex
.evex
= true;
9416 FETCH_DATA (ins
->info
, ins
->codep
+ 4);
9417 /* The first byte after 0x62. */
9418 ins
->rex
= ~(*ins
->codep
>> 5) & 0x7;
9419 ins
->vex
.r
= *ins
->codep
& 0x10;
9420 switch ((*ins
->codep
& 0xf))
9425 vex_table_index
= EVEX_0F
;
9428 vex_table_index
= EVEX_0F38
;
9431 vex_table_index
= EVEX_0F3A
;
9434 vex_table_index
= EVEX_MAP5
;
9437 vex_table_index
= EVEX_MAP6
;
9441 /* The second byte after 0x62. */
9443 ins
->vex
.w
= *ins
->codep
& 0x80;
9444 if (ins
->vex
.w
&& ins
->address_mode
== mode_64bit
)
9447 ins
->vex
.register_specifier
= (~(*ins
->codep
>> 3)) & 0xf;
9450 if (!(*ins
->codep
& 0x4))
9453 switch ((*ins
->codep
& 0x3))
9458 ins
->vex
.prefix
= DATA_PREFIX_OPCODE
;
9461 ins
->vex
.prefix
= REPE_PREFIX_OPCODE
;
9464 ins
->vex
.prefix
= REPNE_PREFIX_OPCODE
;
9468 /* The third byte after 0x62. */
9471 /* Remember the static rounding bits. */
9472 ins
->vex
.ll
= (*ins
->codep
>> 5) & 3;
9473 ins
->vex
.b
= *ins
->codep
& 0x10;
9475 ins
->vex
.v
= *ins
->codep
& 0x8;
9476 ins
->vex
.mask_register_specifier
= *ins
->codep
& 0x7;
9477 ins
->vex
.zeroing
= *ins
->codep
& 0x80;
9479 if (ins
->address_mode
!= mode_64bit
)
9481 /* In 16/32-bit mode silently ignore following bits. */
9486 ins
->need_vex
= true;
9488 vindex
= *ins
->codep
++;
9489 dp
= &evex_table
[vex_table_index
][vindex
];
9490 ins
->end_codep
= ins
->codep
;
9491 FETCH_DATA (ins
->info
, ins
->codep
+ 1);
9492 ins
->modrm
.mod
= (*ins
->codep
>> 6) & 3;
9493 ins
->modrm
.reg
= (*ins
->codep
>> 3) & 7;
9494 ins
->modrm
.rm
= *ins
->codep
& 7;
9496 /* Set vector length. */
9497 if (ins
->modrm
.mod
== 3 && ins
->vex
.b
)
9498 ins
->vex
.length
= 512;
9501 switch (ins
->vex
.ll
)
9504 ins
->vex
.length
= 128;
9507 ins
->vex
.length
= 256;
9510 ins
->vex
.length
= 512;
9526 if (dp
->name
!= NULL
)
9529 return get_valid_dis386 (dp
, ins
);
9533 get_sib (instr_info
*ins
, int sizeflag
)
9535 /* If modrm.mod == 3, operand must be register. */
9537 && ((sizeflag
& AFLAG
) || ins
->address_mode
== mode_64bit
)
9538 && ins
->modrm
.mod
!= 3
9539 && ins
->modrm
.rm
== 4)
9541 FETCH_DATA (ins
->info
, ins
->codep
+ 2);
9542 ins
->sib
.index
= (ins
->codep
[1] >> 3) & 7;
9543 ins
->sib
.scale
= (ins
->codep
[1] >> 6) & 3;
9544 ins
->sib
.base
= ins
->codep
[1] & 7;
9545 ins
->has_sib
= true;
9548 ins
->has_sib
= false;
9551 /* Like oappend (below), but S is a string starting with '%'. In
9552 Intel syntax, the '%' is elided. */
9555 oappend_register (instr_info
*ins
, const char *s
)
9557 oappend_with_style (ins
, s
+ ins
->intel_syntax
, dis_style_register
);
9560 /* Wrap around a call to INS->info->fprintf_styled_func, printing FMT.
9561 STYLE is the default style to use in the fprintf_styled_func calls,
9562 however, FMT might include embedded style markers (see oappend_style),
9563 these embedded markers are not printed, but instead change the style
9564 used in the next fprintf_styled_func call. */
9566 static void ATTRIBUTE_PRINTF_3
9567 i386_dis_printf (instr_info
*ins
, enum disassembler_style style
,
9568 const char *fmt
, ...)
9571 enum disassembler_style curr_style
= style
;
9572 const char *start
, *curr
;
9573 char staging_area
[40];
9576 /* In particular print_insn()'s processing of op_txt[] can hand rather long
9577 strings here. Bypass vsnprintf() in such cases to avoid capacity issues
9578 with the staging area. */
9579 if (strcmp (fmt
, "%s"))
9581 int res
= vsnprintf (staging_area
, sizeof (staging_area
), fmt
, ap
);
9588 if ((size_t) res
>= sizeof (staging_area
))
9591 start
= curr
= staging_area
;
9595 start
= curr
= va_arg (ap
, const char *);
9602 || (*curr
== STYLE_MARKER_CHAR
9603 && ISXDIGIT (*(curr
+ 1))
9604 && *(curr
+ 2) == STYLE_MARKER_CHAR
))
9606 /* Output content between our START position and CURR. */
9607 int len
= curr
- start
;
9608 int n
= (*ins
->info
->fprintf_styled_func
) (ins
->info
->stream
,
9610 "%.*s", len
, start
);
9617 /* Skip over the initial STYLE_MARKER_CHAR. */
9620 /* Update the CURR_STYLE. As there are less than 16 styles, it
9621 is possible, that if the input is corrupted in some way, that
9622 we might set CURR_STYLE to an invalid value. Don't worry
9623 though, we check for this situation. */
9624 if (*curr
>= '0' && *curr
<= '9')
9625 curr_style
= (enum disassembler_style
) (*curr
- '0');
9626 else if (*curr
>= 'a' && *curr
<= 'f')
9627 curr_style
= (enum disassembler_style
) (*curr
- 'a' + 10);
9629 curr_style
= dis_style_text
;
9631 /* Check for an invalid style having been selected. This should
9632 never happen, but it doesn't hurt to be a little paranoid. */
9633 if (curr_style
> dis_style_comment_start
)
9634 curr_style
= dis_style_text
;
9636 /* Skip the hex character, and the closing STYLE_MARKER_CHAR. */
9639 /* Reset the START to after the style marker. */
9649 print_insn (bfd_vma pc
, disassemble_info
*info
, int intel_syntax
)
9651 const struct dis386
*dp
;
9653 char *op_txt
[MAX_OPERANDS
];
9655 bool intel_swap_2_3
;
9656 int sizeflag
, orig_sizeflag
;
9658 struct dis_private priv
;
9663 .intel_syntax
= intel_syntax
>= 0
9665 : (info
->mach
& bfd_mach_i386_intel_syntax
) != 0,
9666 .intel_mnemonic
= !SYSV386_COMPAT
,
9667 .op_index
[0 ... MAX_OPERANDS
- 1] = -1,
9669 .start_codep
= priv
.the_buffer
,
9670 .codep
= priv
.the_buffer
,
9672 .last_lock_prefix
= -1,
9673 .last_repz_prefix
= -1,
9674 .last_repnz_prefix
= -1,
9675 .last_data_prefix
= -1,
9676 .last_addr_prefix
= -1,
9677 .last_rex_prefix
= -1,
9678 .last_seg_prefix
= -1,
9681 char op_out
[MAX_OPERANDS
][MAX_OPERAND_BUFFER_SIZE
];
9683 priv
.orig_sizeflag
= AFLAG
| DFLAG
;
9684 if ((info
->mach
& bfd_mach_i386_i386
) != 0)
9685 ins
.address_mode
= mode_32bit
;
9686 else if (info
->mach
== bfd_mach_i386_i8086
)
9688 ins
.address_mode
= mode_16bit
;
9689 priv
.orig_sizeflag
= 0;
9692 ins
.address_mode
= mode_64bit
;
9694 for (p
= info
->disassembler_options
; p
!= NULL
;)
9696 if (startswith (p
, "amd64"))
9698 else if (startswith (p
, "intel64"))
9699 ins
.isa64
= intel64
;
9700 else if (startswith (p
, "x86-64"))
9702 ins
.address_mode
= mode_64bit
;
9703 priv
.orig_sizeflag
|= AFLAG
| DFLAG
;
9705 else if (startswith (p
, "i386"))
9707 ins
.address_mode
= mode_32bit
;
9708 priv
.orig_sizeflag
|= AFLAG
| DFLAG
;
9710 else if (startswith (p
, "i8086"))
9712 ins
.address_mode
= mode_16bit
;
9713 priv
.orig_sizeflag
&= ~(AFLAG
| DFLAG
);
9715 else if (startswith (p
, "intel"))
9717 ins
.intel_syntax
= 1;
9718 if (startswith (p
+ 5, "-mnemonic"))
9719 ins
.intel_mnemonic
= true;
9721 else if (startswith (p
, "att"))
9723 ins
.intel_syntax
= 0;
9724 if (startswith (p
+ 3, "-mnemonic"))
9725 ins
.intel_mnemonic
= false;
9727 else if (startswith (p
, "addr"))
9729 if (ins
.address_mode
== mode_64bit
)
9731 if (p
[4] == '3' && p
[5] == '2')
9732 priv
.orig_sizeflag
&= ~AFLAG
;
9733 else if (p
[4] == '6' && p
[5] == '4')
9734 priv
.orig_sizeflag
|= AFLAG
;
9738 if (p
[4] == '1' && p
[5] == '6')
9739 priv
.orig_sizeflag
&= ~AFLAG
;
9740 else if (p
[4] == '3' && p
[5] == '2')
9741 priv
.orig_sizeflag
|= AFLAG
;
9744 else if (startswith (p
, "data"))
9746 if (p
[4] == '1' && p
[5] == '6')
9747 priv
.orig_sizeflag
&= ~DFLAG
;
9748 else if (p
[4] == '3' && p
[5] == '2')
9749 priv
.orig_sizeflag
|= DFLAG
;
9751 else if (startswith (p
, "suffix"))
9752 priv
.orig_sizeflag
|= SUFFIX_ALWAYS
;
9754 p
= strchr (p
, ',');
9759 if (ins
.address_mode
== mode_64bit
&& sizeof (bfd_vma
) < 8)
9761 i386_dis_printf (&ins
, dis_style_text
, _("64-bit address is disabled"));
9765 if (ins
.intel_syntax
)
9767 ins
.open_char
= '[';
9768 ins
.close_char
= ']';
9769 ins
.separator_char
= '+';
9770 ins
.scale_char
= '*';
9774 ins
.open_char
= '(';
9775 ins
.close_char
= ')';
9776 ins
.separator_char
= ',';
9777 ins
.scale_char
= ',';
9780 /* The output looks better if we put 7 bytes on a line, since that
9781 puts most long word instructions on a single line. */
9782 info
->bytes_per_line
= 7;
9784 info
->private_data
= &priv
;
9785 priv
.max_fetched
= priv
.the_buffer
;
9786 priv
.insn_start
= pc
;
9788 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
9791 ins
.op_out
[i
] = op_out
[i
];
9794 if (OPCODES_SIGSETJMP (priv
.bailout
) != 0)
9796 /* Getting here means we tried for data but didn't get it. That
9797 means we have an incomplete instruction of some sort. Just
9798 print the first byte as a prefix or a .byte pseudo-op. */
9799 if (ins
.codep
> priv
.the_buffer
)
9801 const char *name
= NULL
;
9803 if (ins
.prefixes
|| ins
.fwait_prefix
>= 0 || (ins
.rex
& REX_OPCODE
))
9804 name
= prefix_name (&ins
, priv
.the_buffer
[0], priv
.orig_sizeflag
);
9806 i386_dis_printf (&ins
, dis_style_mnemonic
, "%s", name
);
9809 /* Just print the first byte as a .byte instruction. */
9810 i386_dis_printf (&ins
, dis_style_assembler_directive
,
9812 i386_dis_printf (&ins
, dis_style_immediate
, "0x%x",
9813 (unsigned int) priv
.the_buffer
[0]);
9822 sizeflag
= priv
.orig_sizeflag
;
9824 if (!ckprefix (&ins
) || ins
.rex_used
)
9826 /* Too many prefixes or unused REX prefixes. */
9828 i
< (int) ARRAY_SIZE (ins
.all_prefixes
) && ins
.all_prefixes
[i
];
9830 i386_dis_printf (&ins
, dis_style_mnemonic
, "%s%s",
9831 (i
== 0 ? "" : " "),
9832 prefix_name (&ins
, ins
.all_prefixes
[i
], sizeflag
));
9836 ins
.insn_codep
= ins
.codep
;
9838 FETCH_DATA (info
, ins
.codep
+ 1);
9839 ins
.two_source_ops
= (*ins
.codep
== 0x62) || (*ins
.codep
== 0xc8);
9841 if (((ins
.prefixes
& PREFIX_FWAIT
)
9842 && ((*ins
.codep
< 0xd8) || (*ins
.codep
> 0xdf))))
9844 /* Handle ins.prefixes before fwait. */
9845 for (i
= 0; i
< ins
.fwait_prefix
&& ins
.all_prefixes
[i
];
9847 i386_dis_printf (&ins
, dis_style_mnemonic
, "%s ",
9848 prefix_name (&ins
, ins
.all_prefixes
[i
], sizeflag
));
9849 i386_dis_printf (&ins
, dis_style_mnemonic
, "fwait");
9853 if (*ins
.codep
== 0x0f)
9855 unsigned char threebyte
;
9858 FETCH_DATA (info
, ins
.codep
+ 1);
9859 threebyte
= *ins
.codep
;
9860 dp
= &dis386_twobyte
[threebyte
];
9861 ins
.need_modrm
= twobyte_has_modrm
[threebyte
];
9866 dp
= &dis386
[*ins
.codep
];
9867 ins
.need_modrm
= onebyte_has_modrm
[*ins
.codep
];
9871 /* Save sizeflag for printing the extra ins.prefixes later before updating
9872 it for mnemonic and operand processing. The prefix names depend
9873 only on the address mode. */
9874 orig_sizeflag
= sizeflag
;
9875 if (ins
.prefixes
& PREFIX_ADDR
)
9877 if ((ins
.prefixes
& PREFIX_DATA
))
9880 ins
.end_codep
= ins
.codep
;
9883 FETCH_DATA (info
, ins
.codep
+ 1);
9884 ins
.modrm
.mod
= (*ins
.codep
>> 6) & 3;
9885 ins
.modrm
.reg
= (*ins
.codep
>> 3) & 7;
9886 ins
.modrm
.rm
= *ins
.codep
& 7;
9889 if (dp
->name
== NULL
&& dp
->op
[0].bytemode
== FLOATCODE
)
9891 get_sib (&ins
, sizeflag
);
9892 dofloat (&ins
, sizeflag
);
9896 dp
= get_valid_dis386 (dp
, &ins
);
9897 if (dp
!= NULL
&& putop (&ins
, dp
->name
, sizeflag
) == 0)
9899 get_sib (&ins
, sizeflag
);
9900 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
9902 ins
.obufp
= ins
.op_out
[i
];
9903 ins
.op_ad
= MAX_OPERANDS
- 1 - i
;
9905 (*dp
->op
[i
].rtn
) (&ins
, dp
->op
[i
].bytemode
, sizeflag
);
9906 /* For EVEX instruction after the last operand masking
9907 should be printed. */
9908 if (i
== 0 && ins
.vex
.evex
)
9910 /* Don't print {%k0}. */
9911 if (ins
.vex
.mask_register_specifier
)
9913 const char *reg_name
9914 = att_names_mask
[ins
.vex
.mask_register_specifier
];
9916 oappend (&ins
, "{");
9917 oappend_register (&ins
, reg_name
);
9918 oappend (&ins
, "}");
9920 if (ins
.vex
.zeroing
)
9921 oappend (&ins
, "{z}");
9923 /* S/G insns require a mask and don't allow
9925 if ((dp
->op
[0].bytemode
== vex_vsib_d_w_dq_mode
9926 || dp
->op
[0].bytemode
== vex_vsib_q_w_dq_mode
)
9927 && (ins
.vex
.mask_register_specifier
== 0
9928 || ins
.vex
.zeroing
))
9929 oappend (&ins
, "/(bad)");
9933 /* Check whether rounding control was enabled for an insn not
9935 if (ins
.modrm
.mod
== 3 && ins
.vex
.b
9936 && !(ins
.evex_used
& EVEX_b_used
))
9938 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
9940 ins
.obufp
= ins
.op_out
[i
];
9943 oappend (&ins
, names_rounding
[ins
.vex
.ll
]);
9944 oappend (&ins
, "bad}");
9951 /* Clear instruction information. */
9952 info
->insn_info_valid
= 0;
9953 info
->branch_delay_insns
= 0;
9954 info
->data_size
= 0;
9955 info
->insn_type
= dis_noninsn
;
9959 /* Reset jump operation indicator. */
9960 ins
.op_is_jump
= false;
9962 int jump_detection
= 0;
9964 /* Extract flags. */
9965 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
9967 if ((dp
->op
[i
].rtn
== OP_J
)
9968 || (dp
->op
[i
].rtn
== OP_indirE
))
9969 jump_detection
|= 1;
9970 else if ((dp
->op
[i
].rtn
== BND_Fixup
)
9971 || (!dp
->op
[i
].rtn
&& !dp
->op
[i
].bytemode
))
9972 jump_detection
|= 2;
9973 else if ((dp
->op
[i
].bytemode
== cond_jump_mode
)
9974 || (dp
->op
[i
].bytemode
== loop_jcxz_mode
))
9975 jump_detection
|= 4;
9978 /* Determine if this is a jump or branch. */
9979 if ((jump_detection
& 0x3) == 0x3)
9981 ins
.op_is_jump
= true;
9982 if (jump_detection
& 0x4)
9983 info
->insn_type
= dis_condbranch
;
9985 info
->insn_type
= (dp
->name
&& !strncmp (dp
->name
, "call", 4))
9986 ? dis_jsr
: dis_branch
;
9990 /* If VEX.vvvv and EVEX.vvvv are unused, they must be all 1s, which
9991 are all 0s in inverted form. */
9992 if (ins
.need_vex
&& ins
.vex
.register_specifier
!= 0)
9994 i386_dis_printf (&ins
, dis_style_text
, "(bad)");
9995 return ins
.end_codep
- priv
.the_buffer
;
9998 /* If EVEX.z is set, there must be an actual mask register in use. */
9999 if (ins
.vex
.zeroing
&& ins
.vex
.mask_register_specifier
== 0)
10001 i386_dis_printf (&ins
, dis_style_text
, "(bad)");
10002 return ins
.end_codep
- priv
.the_buffer
;
10005 switch (dp
->prefix_requirement
)
10008 /* If only the data prefix is marked as mandatory, its absence renders
10009 the encoding invalid. Most other PREFIX_OPCODE rules still apply. */
10010 if (ins
.need_vex
? !ins
.vex
.prefix
: !(ins
.prefixes
& PREFIX_DATA
))
10012 i386_dis_printf (&ins
, dis_style_text
, "(bad)");
10013 return ins
.end_codep
- priv
.the_buffer
;
10015 ins
.used_prefixes
|= PREFIX_DATA
;
10016 /* Fall through. */
10017 case PREFIX_OPCODE
:
10018 /* If the mandatory PREFIX_REPZ/PREFIX_REPNZ/PREFIX_DATA prefix is
10019 unused, opcode is invalid. Since the PREFIX_DATA prefix may be
10020 used by putop and MMX/SSE operand and may be overridden by the
10021 PREFIX_REPZ/PREFIX_REPNZ fix, we check the PREFIX_DATA prefix
10024 ? ins
.vex
.prefix
== REPE_PREFIX_OPCODE
10025 || ins
.vex
.prefix
== REPNE_PREFIX_OPCODE
10027 & (PREFIX_REPZ
| PREFIX_REPNZ
)) != 0)
10028 && (ins
.used_prefixes
10029 & (PREFIX_REPZ
| PREFIX_REPNZ
)) == 0)
10031 ? ins
.vex
.prefix
== DATA_PREFIX_OPCODE
10033 & (PREFIX_REPZ
| PREFIX_REPNZ
| PREFIX_DATA
))
10035 && (ins
.used_prefixes
& PREFIX_DATA
) == 0))
10036 || (ins
.vex
.evex
&& dp
->prefix_requirement
!= PREFIX_DATA
10037 && !ins
.vex
.w
!= !(ins
.used_prefixes
& PREFIX_DATA
)))
10039 i386_dis_printf (&ins
, dis_style_text
, "(bad)");
10040 return ins
.end_codep
- priv
.the_buffer
;
10044 case PREFIX_IGNORED
:
10045 /* Zap data size and rep prefixes from used_prefixes and reinstate their
10046 origins in all_prefixes. */
10047 ins
.used_prefixes
&= ~PREFIX_OPCODE
;
10048 if (ins
.last_data_prefix
>= 0)
10049 ins
.all_prefixes
[ins
.last_data_prefix
] = 0x66;
10050 if (ins
.last_repz_prefix
>= 0)
10051 ins
.all_prefixes
[ins
.last_repz_prefix
] = 0xf3;
10052 if (ins
.last_repnz_prefix
>= 0)
10053 ins
.all_prefixes
[ins
.last_repnz_prefix
] = 0xf2;
10057 /* Check if the REX prefix is used. */
10058 if ((ins
.rex
^ ins
.rex_used
) == 0
10059 && !ins
.need_vex
&& ins
.last_rex_prefix
>= 0)
10060 ins
.all_prefixes
[ins
.last_rex_prefix
] = 0;
10062 /* Check if the SEG prefix is used. */
10063 if ((ins
.prefixes
& (PREFIX_CS
| PREFIX_SS
| PREFIX_DS
| PREFIX_ES
10064 | PREFIX_FS
| PREFIX_GS
)) != 0
10065 && (ins
.used_prefixes
& ins
.active_seg_prefix
) != 0)
10066 ins
.all_prefixes
[ins
.last_seg_prefix
] = 0;
10068 /* Check if the ADDR prefix is used. */
10069 if ((ins
.prefixes
& PREFIX_ADDR
) != 0
10070 && (ins
.used_prefixes
& PREFIX_ADDR
) != 0)
10071 ins
.all_prefixes
[ins
.last_addr_prefix
] = 0;
10073 /* Check if the DATA prefix is used. */
10074 if ((ins
.prefixes
& PREFIX_DATA
) != 0
10075 && (ins
.used_prefixes
& PREFIX_DATA
) != 0
10077 ins
.all_prefixes
[ins
.last_data_prefix
] = 0;
10079 /* Print the extra ins.prefixes. */
10081 for (i
= 0; i
< (int) ARRAY_SIZE (ins
.all_prefixes
); i
++)
10082 if (ins
.all_prefixes
[i
])
10085 name
= prefix_name (&ins
, ins
.all_prefixes
[i
], orig_sizeflag
);
10088 prefix_length
+= strlen (name
) + 1;
10089 i386_dis_printf (&ins
, dis_style_mnemonic
, "%s ", name
);
10092 /* Check maximum code length. */
10093 if ((ins
.codep
- ins
.start_codep
) > MAX_CODE_LENGTH
)
10095 i386_dis_printf (&ins
, dis_style_text
, "(bad)");
10096 return MAX_CODE_LENGTH
;
10099 /* Calculate the number of operands this instruction has. */
10101 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
10102 if (*ins
.op_out
[i
] != '\0')
10105 /* Calculate the number of spaces to print after the mnemonic. */
10106 ins
.obufp
= ins
.mnemonicendp
;
10109 i
= strlen (ins
.obuf
) + prefix_length
;
10118 /* Print the instruction mnemonic along with any trailing whitespace. */
10119 i386_dis_printf (&ins
, dis_style_mnemonic
, "%s%*s", ins
.obuf
, i
, "");
10121 /* The enter and bound instructions are printed with operands in the same
10122 order as the intel book; everything else is printed in reverse order. */
10123 intel_swap_2_3
= false;
10124 if (ins
.intel_syntax
|| ins
.two_source_ops
)
10126 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
10127 op_txt
[i
] = ins
.op_out
[i
];
10129 if (ins
.intel_syntax
&& dp
&& dp
->op
[2].rtn
== OP_Rounding
10130 && dp
->op
[3].rtn
== OP_E
&& dp
->op
[4].rtn
== NULL
)
10132 op_txt
[2] = ins
.op_out
[3];
10133 op_txt
[3] = ins
.op_out
[2];
10134 intel_swap_2_3
= true;
10137 for (i
= 0; i
< (MAX_OPERANDS
>> 1); ++i
)
10141 ins
.op_ad
= ins
.op_index
[i
];
10142 ins
.op_index
[i
] = ins
.op_index
[MAX_OPERANDS
- 1 - i
];
10143 ins
.op_index
[MAX_OPERANDS
- 1 - i
] = ins
.op_ad
;
10144 riprel
= ins
.op_riprel
[i
];
10145 ins
.op_riprel
[i
] = ins
.op_riprel
[MAX_OPERANDS
- 1 - i
];
10146 ins
.op_riprel
[MAX_OPERANDS
- 1 - i
] = riprel
;
10151 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
10152 op_txt
[MAX_OPERANDS
- 1 - i
] = ins
.op_out
[i
];
10156 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
10159 /* In Intel syntax embedded rounding / SAE are not separate operands.
10160 Instead they're attached to the prior register operand. Simply
10161 suppress emission of the comma to achieve that effect. */
10162 switch (i
& -(ins
.intel_syntax
&& dp
))
10165 if (dp
->op
[2].rtn
== OP_Rounding
&& !intel_swap_2_3
)
10169 if (dp
->op
[3].rtn
== OP_Rounding
|| intel_swap_2_3
)
10174 i386_dis_printf (&ins
, dis_style_text
, ",");
10175 if (ins
.op_index
[i
] != -1 && !ins
.op_riprel
[i
])
10177 bfd_vma target
= (bfd_vma
) ins
.op_address
[ins
.op_index
[i
]];
10179 if (ins
.op_is_jump
)
10181 info
->insn_info_valid
= 1;
10182 info
->branch_delay_insns
= 0;
10183 info
->data_size
= 0;
10184 info
->target
= target
;
10187 (*info
->print_address_func
) (target
, info
);
10190 i386_dis_printf (&ins
, dis_style_text
, "%s", op_txt
[i
]);
10194 for (i
= 0; i
< MAX_OPERANDS
; i
++)
10195 if (ins
.op_index
[i
] != -1 && ins
.op_riprel
[i
])
10197 i386_dis_printf (&ins
, dis_style_comment_start
, " # ");
10198 (*info
->print_address_func
)
10199 ((bfd_vma
)(ins
.start_pc
+ (ins
.codep
- ins
.start_codep
)
10200 + ins
.op_address
[ins
.op_index
[i
]]),
10204 return ins
.codep
- priv
.the_buffer
;
10207 /* Here for backwards compatibility. When gdb stops using
10208 print_insn_i386_att and print_insn_i386_intel these functions can
10209 disappear, and print_insn_i386 be merged into print_insn. */
10211 print_insn_i386_att (bfd_vma pc
, disassemble_info
*info
)
10213 return print_insn (pc
, info
, 0);
10217 print_insn_i386_intel (bfd_vma pc
, disassemble_info
*info
)
10219 return print_insn (pc
, info
, 1);
10223 print_insn_i386 (bfd_vma pc
, disassemble_info
*info
)
10225 return print_insn (pc
, info
, -1);
10228 static const char *float_mem
[] = {
10303 static const unsigned char float_mem_mode
[] = {
10378 #define ST { OP_ST, 0 }
10379 #define STi { OP_STi, 0 }
10381 #define FGRPd9_2 NULL, { { NULL, 1 } }, 0
10382 #define FGRPd9_4 NULL, { { NULL, 2 } }, 0
10383 #define FGRPd9_5 NULL, { { NULL, 3 } }, 0
10384 #define FGRPd9_6 NULL, { { NULL, 4 } }, 0
10385 #define FGRPd9_7 NULL, { { NULL, 5 } }, 0
10386 #define FGRPda_5 NULL, { { NULL, 6 } }, 0
10387 #define FGRPdb_4 NULL, { { NULL, 7 } }, 0
10388 #define FGRPde_3 NULL, { { NULL, 8 } }, 0
10389 #define FGRPdf_4 NULL, { { NULL, 9 } }, 0
10391 static const struct dis386 float_reg
[][8] = {
10394 { "fadd", { ST
, STi
}, 0 },
10395 { "fmul", { ST
, STi
}, 0 },
10396 { "fcom", { STi
}, 0 },
10397 { "fcomp", { STi
}, 0 },
10398 { "fsub", { ST
, STi
}, 0 },
10399 { "fsubr", { ST
, STi
}, 0 },
10400 { "fdiv", { ST
, STi
}, 0 },
10401 { "fdivr", { ST
, STi
}, 0 },
10405 { "fld", { STi
}, 0 },
10406 { "fxch", { STi
}, 0 },
10416 { "fcmovb", { ST
, STi
}, 0 },
10417 { "fcmove", { ST
, STi
}, 0 },
10418 { "fcmovbe",{ ST
, STi
}, 0 },
10419 { "fcmovu", { ST
, STi
}, 0 },
10427 { "fcmovnb",{ ST
, STi
}, 0 },
10428 { "fcmovne",{ ST
, STi
}, 0 },
10429 { "fcmovnbe",{ ST
, STi
}, 0 },
10430 { "fcmovnu",{ ST
, STi
}, 0 },
10432 { "fucomi", { ST
, STi
}, 0 },
10433 { "fcomi", { ST
, STi
}, 0 },
10438 { "fadd", { STi
, ST
}, 0 },
10439 { "fmul", { STi
, ST
}, 0 },
10442 { "fsub{!M|r}", { STi
, ST
}, 0 },
10443 { "fsub{M|}", { STi
, ST
}, 0 },
10444 { "fdiv{!M|r}", { STi
, ST
}, 0 },
10445 { "fdiv{M|}", { STi
, ST
}, 0 },
10449 { "ffree", { STi
}, 0 },
10451 { "fst", { STi
}, 0 },
10452 { "fstp", { STi
}, 0 },
10453 { "fucom", { STi
}, 0 },
10454 { "fucomp", { STi
}, 0 },
10460 { "faddp", { STi
, ST
}, 0 },
10461 { "fmulp", { STi
, ST
}, 0 },
10464 { "fsub{!M|r}p", { STi
, ST
}, 0 },
10465 { "fsub{M|}p", { STi
, ST
}, 0 },
10466 { "fdiv{!M|r}p", { STi
, ST
}, 0 },
10467 { "fdiv{M|}p", { STi
, ST
}, 0 },
10471 { "ffreep", { STi
}, 0 },
10476 { "fucomip", { ST
, STi
}, 0 },
10477 { "fcomip", { ST
, STi
}, 0 },
10482 static const char *const fgrps
[][8] = {
10485 "(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10490 "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10495 "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
10500 "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
10505 "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
10510 "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
10515 "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10520 "fNeni(8087 only)","fNdisi(8087 only)","fNclex","fNinit",
10521 "fNsetpm(287 only)","frstpm(287 only)","(bad)","(bad)",
10526 "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10531 "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10536 swap_operand (instr_info
*ins
)
10538 ins
->mnemonicendp
[0] = '.';
10539 ins
->mnemonicendp
[1] = 's';
10540 ins
->mnemonicendp
[2] = '\0';
10541 ins
->mnemonicendp
+= 2;
10545 OP_Skip_MODRM (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
10546 int sizeflag ATTRIBUTE_UNUSED
)
10548 /* Skip mod/rm byte. */
10554 dofloat (instr_info
*ins
, int sizeflag
)
10556 const struct dis386
*dp
;
10557 unsigned char floatop
;
10559 floatop
= ins
->codep
[-1];
10561 if (ins
->modrm
.mod
!= 3)
10563 int fp_indx
= (floatop
- 0xd8) * 8 + ins
->modrm
.reg
;
10565 putop (ins
, float_mem
[fp_indx
], sizeflag
);
10566 ins
->obufp
= ins
->op_out
[0];
10568 OP_E (ins
, float_mem_mode
[fp_indx
], sizeflag
);
10571 /* Skip mod/rm byte. */
10575 dp
= &float_reg
[floatop
- 0xd8][ins
->modrm
.reg
];
10576 if (dp
->name
== NULL
)
10578 putop (ins
, fgrps
[dp
->op
[0].bytemode
][ins
->modrm
.rm
], sizeflag
);
10580 /* Instruction fnstsw is only one with strange arg. */
10581 if (floatop
== 0xdf && ins
->codep
[-1] == 0xe0)
10582 strcpy (ins
->op_out
[0], att_names16
[0] + ins
->intel_syntax
);
10586 putop (ins
, dp
->name
, sizeflag
);
10588 ins
->obufp
= ins
->op_out
[0];
10591 (*dp
->op
[0].rtn
) (ins
, dp
->op
[0].bytemode
, sizeflag
);
10593 ins
->obufp
= ins
->op_out
[1];
10596 (*dp
->op
[1].rtn
) (ins
, dp
->op
[1].bytemode
, sizeflag
);
10601 OP_ST (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
10602 int sizeflag ATTRIBUTE_UNUSED
)
10604 oappend_register (ins
, "%st");
10608 OP_STi (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
10609 int sizeflag ATTRIBUTE_UNUSED
)
10612 int res
= snprintf (scratch
, ARRAY_SIZE (scratch
), "%%st(%d)", ins
->modrm
.rm
);
10614 if (res
< 0 || (size_t) res
>= ARRAY_SIZE (scratch
))
10616 oappend_register (ins
, scratch
);
10619 /* Capital letters in template are macros. */
10621 putop (instr_info
*ins
, const char *in_template
, int sizeflag
)
10626 unsigned int l
= 0, len
= 0;
10629 for (p
= in_template
; *p
; p
++)
10633 if (l
>= sizeof (last
) || !ISUPPER (*p
))
10641 *ins
->obufp
++ = *p
;
10650 if (ins
->intel_syntax
)
10652 while (*++p
!= '|')
10653 if (*p
== '}' || *p
== '\0')
10659 while (*++p
!= '}')
10669 if (ins
->intel_syntax
)
10671 if ((ins
->need_modrm
&& ins
->modrm
.mod
!= 3)
10672 || (sizeflag
& SUFFIX_ALWAYS
))
10673 *ins
->obufp
++ = 'b';
10679 if (ins
->intel_syntax
)
10681 if (sizeflag
& SUFFIX_ALWAYS
)
10682 *ins
->obufp
++ = 'b';
10684 else if (l
== 1 && last
[0] == 'L')
10686 if (ins
->address_mode
== mode_64bit
10687 && !(ins
->prefixes
& PREFIX_ADDR
))
10689 *ins
->obufp
++ = 'a';
10690 *ins
->obufp
++ = 'b';
10691 *ins
->obufp
++ = 's';
10700 if (ins
->intel_syntax
&& !alt
)
10702 if ((ins
->prefixes
& PREFIX_DATA
) || (sizeflag
& SUFFIX_ALWAYS
))
10704 if (sizeflag
& DFLAG
)
10705 *ins
->obufp
++ = ins
->intel_syntax
? 'd' : 'l';
10707 *ins
->obufp
++ = ins
->intel_syntax
? 'w' : 's';
10708 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
10717 if (!ins
->vex
.evex
|| ins
->vex
.w
)
10718 *ins
->obufp
++ = 'd';
10720 oappend (ins
, "{bad}");
10729 if (ins
->intel_syntax
|| !(sizeflag
& SUFFIX_ALWAYS
))
10732 if (ins
->modrm
.mod
== 3)
10734 if (ins
->rex
& REX_W
)
10735 *ins
->obufp
++ = 'q';
10738 if (sizeflag
& DFLAG
)
10739 *ins
->obufp
++ = ins
->intel_syntax
? 'd' : 'l';
10741 *ins
->obufp
++ = 'w';
10742 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
10746 *ins
->obufp
++ = 'w';
10754 if (!ins
->vex
.evex
|| ins
->vex
.b
|| ins
->vex
.ll
>= 2
10756 || (ins
->modrm
.mod
== 3 && (ins
->rex
& REX_X
))
10757 || !ins
->vex
.v
|| ins
->vex
.mask_register_specifier
)
10759 /* AVX512 extends a number of V*D insns to also have V*Q variants,
10760 merely distinguished by EVEX.W. Look for a use of the
10761 respective macro. */
10764 const char *pct
= strchr (p
+ 1, '%');
10766 if (pct
!= NULL
&& pct
[1] == 'D' && pct
[2] == 'Q')
10769 *ins
->obufp
++ = '{';
10770 *ins
->obufp
++ = 'e';
10771 *ins
->obufp
++ = 'v';
10772 *ins
->obufp
++ = 'e';
10773 *ins
->obufp
++ = 'x';
10774 *ins
->obufp
++ = '}';
10775 *ins
->obufp
++ = ' ';
10782 /* For jcxz/jecxz */
10783 if (ins
->address_mode
== mode_64bit
)
10785 if (sizeflag
& AFLAG
)
10786 *ins
->obufp
++ = 'r';
10788 *ins
->obufp
++ = 'e';
10791 if (sizeflag
& AFLAG
)
10792 *ins
->obufp
++ = 'e';
10793 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_ADDR
);
10796 if (ins
->intel_syntax
)
10798 if ((ins
->prefixes
& PREFIX_ADDR
) || (sizeflag
& SUFFIX_ALWAYS
))
10800 if (sizeflag
& AFLAG
)
10801 *ins
->obufp
++ = ins
->address_mode
== mode_64bit
? 'q' : 'l';
10803 *ins
->obufp
++ = ins
->address_mode
== mode_64bit
? 'l' : 'w';
10804 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_ADDR
);
10808 if (ins
->intel_syntax
|| (ins
->obufp
[-1] != 's'
10809 && !(sizeflag
& SUFFIX_ALWAYS
)))
10811 if ((ins
->rex
& REX_W
) || (sizeflag
& DFLAG
))
10812 *ins
->obufp
++ = 'l';
10814 *ins
->obufp
++ = 'w';
10815 if (!(ins
->rex
& REX_W
))
10816 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
10821 if (ins
->intel_syntax
)
10823 if ((ins
->prefixes
& (PREFIX_CS
| PREFIX_DS
)) == PREFIX_CS
10824 || (ins
->prefixes
& (PREFIX_CS
| PREFIX_DS
)) == PREFIX_DS
)
10826 ins
->used_prefixes
|= ins
->prefixes
& (PREFIX_CS
| PREFIX_DS
);
10827 *ins
->obufp
++ = ',';
10828 *ins
->obufp
++ = 'p';
10830 /* Set active_seg_prefix even if not set in 64-bit mode
10831 because here it is a valid branch hint. */
10832 if (ins
->prefixes
& PREFIX_DS
)
10834 ins
->active_seg_prefix
= PREFIX_DS
;
10835 *ins
->obufp
++ = 't';
10839 ins
->active_seg_prefix
= PREFIX_CS
;
10840 *ins
->obufp
++ = 'n';
10844 else if (l
== 1 && last
[0] == 'X')
10847 *ins
->obufp
++ = 'h';
10849 oappend (ins
, "{bad}");
10856 if (ins
->rex
& REX_W
)
10857 *ins
->obufp
++ = 'q';
10859 *ins
->obufp
++ = 'd';
10864 if (ins
->intel_mnemonic
!= cond
)
10865 *ins
->obufp
++ = 'r';
10868 if ((ins
->prefixes
& PREFIX_FWAIT
) == 0)
10869 *ins
->obufp
++ = 'n';
10871 ins
->used_prefixes
|= PREFIX_FWAIT
;
10875 if (ins
->rex
& REX_W
)
10876 *ins
->obufp
++ = 'o';
10877 else if (ins
->intel_syntax
&& (sizeflag
& DFLAG
))
10878 *ins
->obufp
++ = 'q';
10880 *ins
->obufp
++ = 'd';
10881 if (!(ins
->rex
& REX_W
))
10882 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
10885 if (ins
->address_mode
== mode_64bit
10886 && (ins
->isa64
== intel64
|| (ins
->rex
& REX_W
)
10887 || !(ins
->prefixes
& PREFIX_DATA
)))
10889 if (sizeflag
& SUFFIX_ALWAYS
)
10890 *ins
->obufp
++ = 'q';
10893 /* Fall through. */
10897 if ((ins
->modrm
.mod
== 3 || !cond
)
10898 && !(sizeflag
& SUFFIX_ALWAYS
))
10900 /* Fall through. */
10902 if ((!(ins
->rex
& REX_W
) && (ins
->prefixes
& PREFIX_DATA
))
10903 || ((sizeflag
& SUFFIX_ALWAYS
)
10904 && ins
->address_mode
!= mode_64bit
))
10906 *ins
->obufp
++ = (sizeflag
& DFLAG
)
10907 ? ins
->intel_syntax
? 'd' : 'l' : 'w';
10908 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
10910 else if (sizeflag
& SUFFIX_ALWAYS
)
10911 *ins
->obufp
++ = 'q';
10913 else if (l
== 1 && last
[0] == 'L')
10915 if ((ins
->prefixes
& PREFIX_DATA
)
10916 || (ins
->rex
& REX_W
)
10917 || (sizeflag
& SUFFIX_ALWAYS
))
10920 if (ins
->rex
& REX_W
)
10921 *ins
->obufp
++ = 'q';
10924 if (sizeflag
& DFLAG
)
10925 *ins
->obufp
++ = ins
->intel_syntax
? 'd' : 'l';
10927 *ins
->obufp
++ = 'w';
10928 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
10938 if (ins
->intel_syntax
&& !alt
)
10941 if ((ins
->need_modrm
&& ins
->modrm
.mod
!= 3)
10942 || (sizeflag
& SUFFIX_ALWAYS
))
10944 if (ins
->rex
& REX_W
)
10945 *ins
->obufp
++ = 'q';
10948 if (sizeflag
& DFLAG
)
10949 *ins
->obufp
++ = ins
->intel_syntax
? 'd' : 'l';
10951 *ins
->obufp
++ = 'w';
10952 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
10956 else if (l
== 1 && last
[0] == 'D')
10957 *ins
->obufp
++ = ins
->vex
.w
? 'q' : 'd';
10958 else if (l
== 1 && last
[0] == 'L')
10960 if (cond
? ins
->modrm
.mod
== 3 && !(sizeflag
& SUFFIX_ALWAYS
)
10961 : ins
->address_mode
!= mode_64bit
)
10963 if ((ins
->rex
& REX_W
))
10966 *ins
->obufp
++ = 'q';
10968 else if ((ins
->address_mode
== mode_64bit
&& cond
)
10969 || (sizeflag
& SUFFIX_ALWAYS
))
10970 *ins
->obufp
++ = ins
->intel_syntax
? 'd' : 'l';
10977 if (ins
->rex
& REX_W
)
10978 *ins
->obufp
++ = 'q';
10979 else if (sizeflag
& DFLAG
)
10981 if (ins
->intel_syntax
)
10982 *ins
->obufp
++ = 'd';
10984 *ins
->obufp
++ = 'l';
10987 *ins
->obufp
++ = 'w';
10988 if (ins
->intel_syntax
&& !p
[1]
10989 && ((ins
->rex
& REX_W
) || (sizeflag
& DFLAG
)))
10990 *ins
->obufp
++ = 'e';
10991 if (!(ins
->rex
& REX_W
))
10992 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
10998 if (ins
->intel_syntax
)
11000 if (sizeflag
& SUFFIX_ALWAYS
)
11002 if (ins
->rex
& REX_W
)
11003 *ins
->obufp
++ = 'q';
11006 if (sizeflag
& DFLAG
)
11007 *ins
->obufp
++ = 'l';
11009 *ins
->obufp
++ = 'w';
11010 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
11020 if (ins
->address_mode
== mode_64bit
11021 && !(ins
->prefixes
& PREFIX_ADDR
))
11023 *ins
->obufp
++ = 'a';
11024 *ins
->obufp
++ = 'b';
11025 *ins
->obufp
++ = 's';
11030 if (!ins
->vex
.evex
|| !ins
->vex
.w
)
11031 *ins
->obufp
++ = 's';
11033 oappend (ins
, "{bad}");
11049 *ins
->obufp
++ = '{';
11050 *ins
->obufp
++ = 'v';
11051 *ins
->obufp
++ = 'e';
11052 *ins
->obufp
++ = 'x';
11053 *ins
->obufp
++ = '}';
11054 *ins
->obufp
++ = ' ';
11057 if (!(ins
->rex
& REX_W
))
11059 *ins
->obufp
++ = 'a';
11060 *ins
->obufp
++ = 'b';
11061 *ins
->obufp
++ = 's';
11073 /* operand size flag for cwtl, cbtw */
11075 if (ins
->rex
& REX_W
)
11077 if (ins
->intel_syntax
)
11078 *ins
->obufp
++ = 'd';
11080 *ins
->obufp
++ = 'l';
11082 else if (sizeflag
& DFLAG
)
11083 *ins
->obufp
++ = 'w';
11085 *ins
->obufp
++ = 'b';
11086 if (!(ins
->rex
& REX_W
))
11087 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
11091 if (!ins
->need_vex
)
11093 if (last
[0] == 'X')
11094 *ins
->obufp
++ = ins
->vex
.w
? 'd': 's';
11095 else if (last
[0] == 'B')
11096 *ins
->obufp
++ = ins
->vex
.w
? 'w': 'b';
11107 ? ins
->vex
.prefix
== DATA_PREFIX_OPCODE
11108 : ins
->prefixes
& PREFIX_DATA
)
11110 *ins
->obufp
++ = 'd';
11111 ins
->used_prefixes
|= PREFIX_DATA
;
11114 *ins
->obufp
++ = 's';
11117 if (l
== 1 && last
[0] == 'X')
11119 if (!ins
->need_vex
)
11121 if (ins
->intel_syntax
11122 || ((ins
->modrm
.mod
== 3 || ins
->vex
.b
)
11123 && !(sizeflag
& SUFFIX_ALWAYS
)))
11125 switch (ins
->vex
.length
)
11128 *ins
->obufp
++ = 'x';
11131 *ins
->obufp
++ = 'y';
11134 if (!ins
->vex
.evex
)
11145 /* These insns ignore ModR/M.mod: Force it to 3 for OP_E(). */
11146 ins
->modrm
.mod
= 3;
11147 if (!ins
->intel_syntax
&& (sizeflag
& SUFFIX_ALWAYS
))
11148 *ins
->obufp
++ = ins
->address_mode
== mode_64bit
? 'q' : 'l';
11150 else if (l
== 1 && last
[0] == 'X')
11152 if (!ins
->vex
.evex
)
11154 if (ins
->intel_syntax
11155 || ((ins
->modrm
.mod
== 3 || ins
->vex
.b
)
11156 && !(sizeflag
& SUFFIX_ALWAYS
)))
11158 switch (ins
->vex
.length
)
11161 *ins
->obufp
++ = 'x';
11164 *ins
->obufp
++ = 'y';
11167 *ins
->obufp
++ = 'z';
11177 if (ins
->intel_syntax
)
11179 if (ins
->isa64
== intel64
&& (ins
->rex
& REX_W
))
11182 *ins
->obufp
++ = 'q';
11185 if ((ins
->prefixes
& PREFIX_DATA
) || (sizeflag
& SUFFIX_ALWAYS
))
11187 if (sizeflag
& DFLAG
)
11188 *ins
->obufp
++ = 'l';
11190 *ins
->obufp
++ = 'w';
11191 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
11200 ins
->mnemonicendp
= ins
->obufp
;
11204 /* Add a style marker to *INS->obufp that encodes STYLE. This assumes that
11205 the buffer pointed to by INS->obufp has space. A style marker is made
11206 from the STYLE_MARKER_CHAR followed by STYLE converted to a single hex
11207 digit, followed by another STYLE_MARKER_CHAR. This function assumes
11208 that the number of styles is not greater than 16. */
11211 oappend_insert_style (instr_info
*ins
, enum disassembler_style style
)
11213 unsigned num
= (unsigned) style
;
11215 /* We currently assume that STYLE can be encoded as a single hex
11216 character. If more styles are added then this might start to fail,
11217 and we'll need to expand this code. */
11221 *ins
->obufp
++ = STYLE_MARKER_CHAR
;
11222 *ins
->obufp
++ = (num
< 10 ? ('0' + num
)
11223 : ((num
< 16) ? ('a' + (num
- 10)) : '0'));
11224 *ins
->obufp
++ = STYLE_MARKER_CHAR
;
11226 /* This final null character is not strictly necessary, after inserting a
11227 style marker we should always be inserting some additional content.
11228 However, having the buffer null terminated doesn't cost much, and make
11229 it easier to debug what's going on. Also, if we do ever forget to add
11230 any additional content after this style marker, then the buffer will
11231 still be well formed. */
11232 *ins
->obufp
= '\0';
11236 oappend_with_style (instr_info
*ins
, const char *s
,
11237 enum disassembler_style style
)
11239 oappend_insert_style (ins
, style
);
11240 ins
->obufp
= stpcpy (ins
->obufp
, s
);
11243 /* Like oappend_with_style but always with text style. */
11246 oappend (instr_info
*ins
, const char *s
)
11248 oappend_with_style (ins
, s
, dis_style_text
);
11251 /* Add a single character C to the buffer pointer to by INS->obufp, marking
11252 the style for the character as STYLE. */
11255 oappend_char_with_style (instr_info
*ins
, const char c
,
11256 enum disassembler_style style
)
11258 oappend_insert_style (ins
, style
);
11260 *ins
->obufp
= '\0';
11263 /* Like oappend_char_with_style, but always uses dis_style_text. */
11266 oappend_char (instr_info
*ins
, const char c
)
11268 oappend_char_with_style (ins
, c
, dis_style_text
);
11272 append_seg (instr_info
*ins
)
11274 /* Only print the active segment register. */
11275 if (!ins
->active_seg_prefix
)
11278 ins
->used_prefixes
|= ins
->active_seg_prefix
;
11279 switch (ins
->active_seg_prefix
)
11282 oappend_register (ins
, "%cs");
11285 oappend_register (ins
, "%ds");
11288 oappend_register (ins
, "%ss");
11291 oappend_register (ins
, "%es");
11294 oappend_register (ins
, "%fs");
11297 oappend_register (ins
, "%gs");
11302 oappend_char (ins
, ':');
11306 OP_indirE (instr_info
*ins
, int bytemode
, int sizeflag
)
11308 if (!ins
->intel_syntax
)
11309 oappend (ins
, "*");
11310 OP_E (ins
, bytemode
, sizeflag
);
11314 print_operand_value (instr_info
*ins
, bfd_vma disp
,
11315 enum disassembler_style style
)
11319 if (ins
->address_mode
== mode_64bit
)
11320 sprintf (tmp
, "0x%" PRIx64
, (uint64_t) disp
);
11322 sprintf (tmp
, "0x%x", (unsigned int) disp
);
11323 oappend_with_style (ins
, tmp
, style
);
11326 /* Like oappend, but called for immediate operands. */
11329 oappend_immediate (instr_info
*ins
, bfd_vma imm
)
11331 if (!ins
->intel_syntax
)
11332 oappend_char_with_style (ins
, '$', dis_style_immediate
);
11333 print_operand_value (ins
, imm
, dis_style_immediate
);
11336 /* Put DISP in BUF as signed hex number. */
11339 print_displacement (instr_info
*ins
, bfd_vma disp
)
11341 bfd_signed_vma val
= disp
;
11346 oappend_char_with_style (ins
, '-', dis_style_address_offset
);
11349 /* Check for possible overflow. */
11352 switch (ins
->address_mode
)
11355 oappend_with_style (ins
, "0x8000000000000000",
11356 dis_style_address_offset
);
11359 oappend_with_style (ins
, "0x80000000",
11360 dis_style_address_offset
);
11363 oappend_with_style (ins
, "0x8000",
11364 dis_style_address_offset
);
11371 sprintf (tmp
, "0x%" PRIx64
, (int64_t) val
);
11372 oappend_with_style (ins
, tmp
, dis_style_address_offset
);
11376 intel_operand_size (instr_info
*ins
, int bytemode
, int sizeflag
)
11380 if (!ins
->vex
.no_broadcast
)
11384 case evex_half_bcst_xmmq_mode
:
11386 oappend (ins
, "QWORD BCST ");
11388 oappend (ins
, "DWORD BCST ");
11391 case evex_half_bcst_xmmqh_mode
:
11392 case evex_half_bcst_xmmqdh_mode
:
11393 oappend (ins
, "WORD BCST ");
11396 ins
->vex
.no_broadcast
= true;
11406 oappend (ins
, "BYTE PTR ");
11411 oappend (ins
, "WORD PTR ");
11414 if (ins
->address_mode
== mode_64bit
&& ins
->isa64
== intel64
)
11416 oappend (ins
, "QWORD PTR ");
11419 /* Fall through. */
11421 if (ins
->address_mode
== mode_64bit
&& ((sizeflag
& DFLAG
)
11422 || (ins
->rex
& REX_W
)))
11424 oappend (ins
, "QWORD PTR ");
11427 /* Fall through. */
11432 if (ins
->rex
& REX_W
)
11433 oappend (ins
, "QWORD PTR ");
11434 else if (bytemode
== dq_mode
)
11435 oappend (ins
, "DWORD PTR ");
11438 if (sizeflag
& DFLAG
)
11439 oappend (ins
, "DWORD PTR ");
11441 oappend (ins
, "WORD PTR ");
11442 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
11446 if ((ins
->rex
& REX_W
) || (sizeflag
& DFLAG
))
11447 *ins
->obufp
++ = 'D';
11448 oappend (ins
, "WORD PTR ");
11449 if (!(ins
->rex
& REX_W
))
11450 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
11453 if (sizeflag
& DFLAG
)
11454 oappend (ins
, "QWORD PTR ");
11456 oappend (ins
, "DWORD PTR ");
11457 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
11460 if (!(sizeflag
& DFLAG
) && ins
->isa64
== intel64
)
11461 oappend (ins
, "WORD PTR ");
11463 oappend (ins
, "DWORD PTR ");
11464 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
11468 oappend (ins
, "DWORD PTR ");
11472 oappend (ins
, "QWORD PTR ");
11475 if (ins
->address_mode
== mode_64bit
)
11476 oappend (ins
, "QWORD PTR ");
11478 oappend (ins
, "DWORD PTR ");
11481 if (sizeflag
& DFLAG
)
11482 oappend (ins
, "FWORD PTR ");
11484 oappend (ins
, "DWORD PTR ");
11485 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
11488 oappend (ins
, "TBYTE PTR ");
11493 case evex_x_gscat_mode
:
11494 case evex_x_nobcst_mode
:
11498 switch (ins
->vex
.length
)
11501 oappend (ins
, "XMMWORD PTR ");
11504 oappend (ins
, "YMMWORD PTR ");
11507 oappend (ins
, "ZMMWORD PTR ");
11514 oappend (ins
, "XMMWORD PTR ");
11517 oappend (ins
, "XMMWORD PTR ");
11520 oappend (ins
, "YMMWORD PTR ");
11523 case evex_half_bcst_xmmqh_mode
:
11524 case evex_half_bcst_xmmq_mode
:
11525 if (!ins
->need_vex
)
11528 switch (ins
->vex
.length
)
11531 oappend (ins
, "QWORD PTR ");
11534 oappend (ins
, "XMMWORD PTR ");
11537 oappend (ins
, "YMMWORD PTR ");
11544 if (!ins
->need_vex
)
11547 switch (ins
->vex
.length
)
11550 oappend (ins
, "WORD PTR ");
11553 oappend (ins
, "DWORD PTR ");
11556 oappend (ins
, "QWORD PTR ");
11563 case evex_half_bcst_xmmqdh_mode
:
11564 if (!ins
->need_vex
)
11567 switch (ins
->vex
.length
)
11570 oappend (ins
, "DWORD PTR ");
11573 oappend (ins
, "QWORD PTR ");
11576 oappend (ins
, "XMMWORD PTR ");
11583 if (!ins
->need_vex
)
11586 switch (ins
->vex
.length
)
11589 oappend (ins
, "QWORD PTR ");
11592 oappend (ins
, "YMMWORD PTR ");
11595 oappend (ins
, "ZMMWORD PTR ");
11602 oappend (ins
, "OWORD PTR ");
11604 case vex_vsib_d_w_dq_mode
:
11605 case vex_vsib_q_w_dq_mode
:
11606 if (!ins
->need_vex
)
11609 oappend (ins
, "QWORD PTR ");
11611 oappend (ins
, "DWORD PTR ");
11614 if (!ins
->need_vex
|| ins
->vex
.length
!= 128)
11617 oappend (ins
, "DWORD PTR ");
11619 oappend (ins
, "BYTE PTR ");
11622 if (!ins
->need_vex
)
11625 oappend (ins
, "QWORD PTR ");
11627 oappend (ins
, "WORD PTR ");
11637 print_register (instr_info
*ins
, unsigned int reg
, unsigned int rexmask
,
11638 int bytemode
, int sizeflag
)
11640 const char *const *names
;
11642 USED_REX (rexmask
);
11643 if (ins
->rex
& rexmask
)
11653 names
= att_names8rex
;
11655 names
= att_names8
;
11658 names
= att_names16
;
11663 names
= att_names32
;
11666 names
= att_names64
;
11670 names
= ins
->address_mode
== mode_64bit
? att_names64
: att_names32
;
11673 case bnd_swap_mode
:
11676 oappend (ins
, "(bad)");
11679 names
= att_names_bnd
;
11682 if (ins
->address_mode
== mode_64bit
&& ins
->isa64
== intel64
)
11684 names
= att_names64
;
11687 /* Fall through. */
11689 if (ins
->address_mode
== mode_64bit
&& ((sizeflag
& DFLAG
)
11690 || (ins
->rex
& REX_W
)))
11692 names
= att_names64
;
11696 /* Fall through. */
11701 if (ins
->rex
& REX_W
)
11702 names
= att_names64
;
11703 else if (bytemode
!= v_mode
&& bytemode
!= v_swap_mode
)
11704 names
= att_names32
;
11707 if (sizeflag
& DFLAG
)
11708 names
= att_names32
;
11710 names
= att_names16
;
11711 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
11715 if (!(sizeflag
& DFLAG
) && ins
->isa64
== intel64
)
11716 names
= att_names16
;
11718 names
= att_names32
;
11719 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
11722 names
= (ins
->address_mode
== mode_64bit
11723 ? att_names64
: att_names32
);
11724 if (!(ins
->prefixes
& PREFIX_ADDR
))
11725 names
= (ins
->address_mode
== mode_16bit
11726 ? att_names16
: names
);
11729 /* Remove "addr16/addr32". */
11730 ins
->all_prefixes
[ins
->last_addr_prefix
] = 0;
11731 names
= (ins
->address_mode
!= mode_32bit
11732 ? att_names32
: att_names16
);
11733 ins
->used_prefixes
|= PREFIX_ADDR
;
11740 oappend (ins
, "(bad)");
11743 names
= att_names_mask
;
11748 oappend (ins
, INTERNAL_DISASSEMBLER_ERROR
);
11751 oappend_register (ins
, names
[reg
]);
11755 OP_E_memory (instr_info
*ins
, int bytemode
, int sizeflag
)
11758 int add
= (ins
->rex
& REX_B
) ? 8 : 0;
11776 if (ins
->address_mode
!= mode_64bit
)
11784 case vex_vsib_d_w_dq_mode
:
11785 case vex_vsib_q_w_dq_mode
:
11786 case evex_x_gscat_mode
:
11787 shift
= ins
->vex
.w
? 3 : 2;
11790 case evex_half_bcst_xmmqh_mode
:
11791 case evex_half_bcst_xmmqdh_mode
:
11794 shift
= ins
->vex
.w
? 2 : 1;
11797 /* Fall through. */
11799 case evex_half_bcst_xmmq_mode
:
11802 shift
= ins
->vex
.w
? 3 : 2;
11805 /* Fall through. */
11810 case evex_x_nobcst_mode
:
11812 switch (ins
->vex
.length
)
11826 /* Make necessary corrections to shift for modes that need it. */
11827 if (bytemode
== xmmq_mode
11828 || bytemode
== evex_half_bcst_xmmqh_mode
11829 || bytemode
== evex_half_bcst_xmmq_mode
11830 || (bytemode
== ymmq_mode
&& ins
->vex
.length
== 128))
11832 else if (bytemode
== xmmqd_mode
11833 || bytemode
== evex_half_bcst_xmmqdh_mode
)
11835 else if (bytemode
== xmmdw_mode
)
11849 shift
= ins
->vex
.w
? 1 : 0;
11859 if (ins
->intel_syntax
)
11860 intel_operand_size (ins
, bytemode
, sizeflag
);
11863 if ((sizeflag
& AFLAG
) || ins
->address_mode
== mode_64bit
)
11865 /* 32/64 bit address mode */
11873 int addr32flag
= !((sizeflag
& AFLAG
)
11874 || bytemode
== v_bnd_mode
11875 || bytemode
== v_bndmk_mode
11876 || bytemode
== bnd_mode
11877 || bytemode
== bnd_swap_mode
);
11878 bool check_gather
= false;
11879 const char *const *indexes
= NULL
;
11882 base
= ins
->modrm
.rm
;
11886 vindex
= ins
->sib
.index
;
11888 if (ins
->rex
& REX_X
)
11892 case vex_vsib_d_w_dq_mode
:
11893 case vex_vsib_q_w_dq_mode
:
11894 if (!ins
->need_vex
)
11900 check_gather
= ins
->obufp
== ins
->op_out
[1];
11903 switch (ins
->vex
.length
)
11906 indexes
= att_names_xmm
;
11910 || bytemode
== vex_vsib_q_w_dq_mode
)
11911 indexes
= att_names_ymm
;
11913 indexes
= att_names_xmm
;
11917 || bytemode
== vex_vsib_q_w_dq_mode
)
11918 indexes
= att_names_zmm
;
11920 indexes
= att_names_ymm
;
11928 indexes
= ins
->address_mode
== mode_64bit
&& !addr32flag
11929 ? att_names64
: att_names32
;
11932 scale
= ins
->sib
.scale
;
11933 base
= ins
->sib
.base
;
11938 /* Check for mandatory SIB. */
11939 if (bytemode
== vex_vsib_d_w_dq_mode
11940 || bytemode
== vex_vsib_q_w_dq_mode
11941 || bytemode
== vex_sibmem_mode
)
11943 oappend (ins
, "(bad)");
11947 rbase
= base
+ add
;
11949 switch (ins
->modrm
.mod
)
11955 if (ins
->address_mode
== mode_64bit
&& !ins
->has_sib
)
11957 disp
= get32s (ins
);
11958 if (riprel
&& bytemode
== v_bndmk_mode
)
11960 oappend (ins
, "(bad)");
11966 FETCH_DATA (ins
->info
, ins
->codep
+ 1);
11967 disp
= *ins
->codep
++;
11968 if ((disp
& 0x80) != 0)
11970 if (ins
->vex
.evex
&& shift
> 0)
11974 disp
= get32s (ins
);
11983 && ins
->address_mode
!= mode_16bit
)
11985 if (ins
->address_mode
== mode_64bit
)
11989 /* Without base nor index registers, zero-extend the
11990 lower 32-bit displacement to 64 bits. */
11991 disp
= (unsigned int) disp
;
11998 /* In 32-bit mode, we need index register to tell [offset]
11999 from [eiz*1 + offset]. */
12004 havedisp
= (havebase
12006 || (ins
->has_sib
&& (indexes
|| scale
!= 0)));
12008 if (!ins
->intel_syntax
)
12009 if (ins
->modrm
.mod
!= 0 || base
== 5)
12011 if (havedisp
|| riprel
)
12012 print_displacement (ins
, disp
);
12014 print_operand_value (ins
, disp
, dis_style_address_offset
);
12017 set_op (ins
, disp
, true);
12018 oappend_char (ins
, '(');
12019 oappend_with_style (ins
, !addr32flag
? "%rip" : "%eip",
12020 dis_style_register
);
12021 oappend_char (ins
, ')');
12025 if ((havebase
|| indexes
|| needindex
|| needaddr32
|| riprel
)
12026 && (ins
->address_mode
!= mode_64bit
12027 || ((bytemode
!= v_bnd_mode
)
12028 && (bytemode
!= v_bndmk_mode
)
12029 && (bytemode
!= bnd_mode
)
12030 && (bytemode
!= bnd_swap_mode
))))
12031 ins
->used_prefixes
|= PREFIX_ADDR
;
12033 if (havedisp
|| (ins
->intel_syntax
&& riprel
))
12035 oappend_char (ins
, ins
->open_char
);
12036 if (ins
->intel_syntax
&& riprel
)
12038 set_op (ins
, disp
, true);
12039 oappend_with_style (ins
, !addr32flag
? "rip" : "eip",
12040 dis_style_register
);
12045 (ins
->address_mode
== mode_64bit
&& !addr32flag
12046 ? att_names64
: att_names32
)[rbase
]);
12049 /* ESP/RSP won't allow index. If base isn't ESP/RSP,
12050 print index to tell base + index from base. */
12054 || (havebase
&& base
!= ESP_REG_NUM
))
12056 if (!ins
->intel_syntax
|| havebase
)
12057 oappend_char (ins
, ins
->separator_char
);
12060 if (ins
->address_mode
== mode_64bit
|| vindex
< 16)
12061 oappend_register (ins
, indexes
[vindex
]);
12063 oappend (ins
, "(bad)");
12066 oappend_register (ins
,
12067 ins
->address_mode
== mode_64bit
12072 oappend_char (ins
, ins
->scale_char
);
12073 oappend_char_with_style (ins
, '0' + (1 << scale
),
12074 dis_style_immediate
);
12077 if (ins
->intel_syntax
12078 && (disp
|| ins
->modrm
.mod
!= 0 || base
== 5))
12080 if (!havedisp
|| (bfd_signed_vma
) disp
>= 0)
12081 oappend_char (ins
, '+');
12082 else if (ins
->modrm
.mod
!= 1 && disp
!= -disp
)
12084 oappend_char (ins
, '-');
12089 print_displacement (ins
, disp
);
12091 print_operand_value (ins
, disp
, dis_style_address_offset
);
12094 oappend_char (ins
, ins
->close_char
);
12098 /* Both XMM/YMM/ZMM registers must be distinct. */
12099 int modrm_reg
= ins
->modrm
.reg
;
12101 if (ins
->rex
& REX_R
)
12105 if (vindex
== modrm_reg
)
12106 oappend (ins
, "/(bad)");
12109 else if (ins
->intel_syntax
)
12111 if (ins
->modrm
.mod
!= 0 || base
== 5)
12113 if (!ins
->active_seg_prefix
)
12115 oappend_register (ins
, att_names_seg
[ds_reg
- es_reg
]);
12116 oappend (ins
, ":");
12118 print_operand_value (ins
, disp
, dis_style_text
);
12122 else if (bytemode
== v_bnd_mode
12123 || bytemode
== v_bndmk_mode
12124 || bytemode
== bnd_mode
12125 || bytemode
== bnd_swap_mode
12126 || bytemode
== vex_vsib_d_w_dq_mode
12127 || bytemode
== vex_vsib_q_w_dq_mode
)
12129 oappend (ins
, "(bad)");
12134 /* 16 bit address mode */
12135 ins
->used_prefixes
|= ins
->prefixes
& PREFIX_ADDR
;
12136 switch (ins
->modrm
.mod
)
12139 if (ins
->modrm
.rm
== 6)
12141 disp
= get16 (ins
);
12142 if ((disp
& 0x8000) != 0)
12147 FETCH_DATA (ins
->info
, ins
->codep
+ 1);
12148 disp
= *ins
->codep
++;
12149 if ((disp
& 0x80) != 0)
12151 if (ins
->vex
.evex
&& shift
> 0)
12155 disp
= get16 (ins
);
12156 if ((disp
& 0x8000) != 0)
12161 if (!ins
->intel_syntax
)
12162 if (ins
->modrm
.mod
!= 0 || ins
->modrm
.rm
== 6)
12163 print_displacement (ins
, disp
);
12165 if (ins
->modrm
.mod
!= 0 || ins
->modrm
.rm
!= 6)
12167 oappend_char (ins
, ins
->open_char
);
12168 oappend (ins
, (ins
->intel_syntax
? intel_index16
12169 : att_index16
)[ins
->modrm
.rm
]);
12170 if (ins
->intel_syntax
12171 && (disp
|| ins
->modrm
.mod
!= 0 || ins
->modrm
.rm
== 6))
12173 if ((bfd_signed_vma
) disp
>= 0)
12174 oappend_char (ins
, '+');
12175 else if (ins
->modrm
.mod
!= 1)
12177 oappend_char (ins
, '-');
12181 print_displacement (ins
, disp
);
12184 oappend_char (ins
, ins
->close_char
);
12186 else if (ins
->intel_syntax
)
12188 if (!ins
->active_seg_prefix
)
12190 oappend_register (ins
, att_names_seg
[ds_reg
- es_reg
]);
12191 oappend (ins
, ":");
12193 print_operand_value (ins
, disp
& 0xffff, dis_style_text
);
12198 ins
->evex_used
|= EVEX_b_used
;
12200 /* Broadcast can only ever be valid for memory sources. */
12201 if (ins
->obufp
== ins
->op_out
[0])
12202 ins
->vex
.no_broadcast
= true;
12204 if (!ins
->vex
.no_broadcast
12205 && (!ins
->intel_syntax
|| !(ins
->evex_used
& EVEX_len_used
)))
12207 if (bytemode
== xh_mode
)
12210 oappend (ins
, "{bad}");
12213 switch (ins
->vex
.length
)
12216 oappend (ins
, "{1to8}");
12219 oappend (ins
, "{1to16}");
12222 oappend (ins
, "{1to32}");
12229 else if (bytemode
== q_mode
12230 || bytemode
== ymmq_mode
)
12231 ins
->vex
.no_broadcast
= true;
12232 else if (ins
->vex
.w
12233 || bytemode
== evex_half_bcst_xmmqdh_mode
12234 || bytemode
== evex_half_bcst_xmmq_mode
)
12236 switch (ins
->vex
.length
)
12239 oappend (ins
, "{1to2}");
12242 oappend (ins
, "{1to4}");
12245 oappend (ins
, "{1to8}");
12251 else if (bytemode
== x_mode
12252 || bytemode
== evex_half_bcst_xmmqh_mode
)
12254 switch (ins
->vex
.length
)
12257 oappend (ins
, "{1to4}");
12260 oappend (ins
, "{1to8}");
12263 oappend (ins
, "{1to16}");
12270 ins
->vex
.no_broadcast
= true;
12272 if (ins
->vex
.no_broadcast
)
12273 oappend (ins
, "{bad}");
12278 OP_E (instr_info
*ins
, int bytemode
, int sizeflag
)
12280 /* Skip mod/rm byte. */
12284 if (ins
->modrm
.mod
== 3)
12286 if ((sizeflag
& SUFFIX_ALWAYS
)
12287 && (bytemode
== b_swap_mode
12288 || bytemode
== bnd_swap_mode
12289 || bytemode
== v_swap_mode
))
12290 swap_operand (ins
);
12292 print_register (ins
, ins
->modrm
.rm
, REX_B
, bytemode
, sizeflag
);
12295 OP_E_memory (ins
, bytemode
, sizeflag
);
12299 OP_G (instr_info
*ins
, int bytemode
, int sizeflag
)
12301 if (ins
->vex
.evex
&& !ins
->vex
.r
&& ins
->address_mode
== mode_64bit
)
12303 oappend (ins
, "(bad)");
12307 print_register (ins
, ins
->modrm
.reg
, REX_R
, bytemode
, sizeflag
);
12312 get64 (instr_info
*ins
)
12318 FETCH_DATA (ins
->info
, ins
->codep
+ 8);
12319 a
= *ins
->codep
++ & 0xff;
12320 a
|= (*ins
->codep
++ & 0xff) << 8;
12321 a
|= (*ins
->codep
++ & 0xff) << 16;
12322 a
|= (*ins
->codep
++ & 0xffu
) << 24;
12323 b
= *ins
->codep
++ & 0xff;
12324 b
|= (*ins
->codep
++ & 0xff) << 8;
12325 b
|= (*ins
->codep
++ & 0xff) << 16;
12326 b
|= (*ins
->codep
++ & 0xffu
) << 24;
12327 x
= a
+ ((bfd_vma
) b
<< 32);
12332 get64 (instr_info
*ins ATTRIBUTE_UNUSED
)
12339 static bfd_signed_vma
12340 get32 (instr_info
*ins
)
12344 FETCH_DATA (ins
->info
, ins
->codep
+ 4);
12345 x
= *ins
->codep
++ & (bfd_vma
) 0xff;
12346 x
|= (*ins
->codep
++ & (bfd_vma
) 0xff) << 8;
12347 x
|= (*ins
->codep
++ & (bfd_vma
) 0xff) << 16;
12348 x
|= (*ins
->codep
++ & (bfd_vma
) 0xff) << 24;
12352 static bfd_signed_vma
12353 get32s (instr_info
*ins
)
12357 FETCH_DATA (ins
->info
, ins
->codep
+ 4);
12358 x
= *ins
->codep
++ & (bfd_vma
) 0xff;
12359 x
|= (*ins
->codep
++ & (bfd_vma
) 0xff) << 8;
12360 x
|= (*ins
->codep
++ & (bfd_vma
) 0xff) << 16;
12361 x
|= (*ins
->codep
++ & (bfd_vma
) 0xff) << 24;
12363 x
= (x
^ ((bfd_vma
) 1 << 31)) - ((bfd_vma
) 1 << 31);
12369 get16 (instr_info
*ins
)
12373 FETCH_DATA (ins
->info
, ins
->codep
+ 2);
12374 x
= *ins
->codep
++ & 0xff;
12375 x
|= (*ins
->codep
++ & 0xff) << 8;
12380 set_op (instr_info
*ins
, bfd_vma op
, bool riprel
)
12382 ins
->op_index
[ins
->op_ad
] = ins
->op_ad
;
12383 if (ins
->address_mode
== mode_64bit
)
12384 ins
->op_address
[ins
->op_ad
] = op
;
12385 else /* Mask to get a 32-bit address. */
12386 ins
->op_address
[ins
->op_ad
] = op
& 0xffffffff;
12387 ins
->op_riprel
[ins
->op_ad
] = riprel
;
12391 OP_REG (instr_info
*ins
, int code
, int sizeflag
)
12398 case es_reg
: case ss_reg
: case cs_reg
:
12399 case ds_reg
: case fs_reg
: case gs_reg
:
12400 oappend_register (ins
, att_names_seg
[code
- es_reg
]);
12405 if (ins
->rex
& REX_B
)
12412 case ax_reg
: case cx_reg
: case dx_reg
: case bx_reg
:
12413 case sp_reg
: case bp_reg
: case si_reg
: case di_reg
:
12414 s
= att_names16
[code
- ax_reg
+ add
];
12416 case ah_reg
: case ch_reg
: case dh_reg
: case bh_reg
:
12418 /* Fall through. */
12419 case al_reg
: case cl_reg
: case dl_reg
: case bl_reg
:
12421 s
= att_names8rex
[code
- al_reg
+ add
];
12423 s
= att_names8
[code
- al_reg
];
12425 case rAX_reg
: case rCX_reg
: case rDX_reg
: case rBX_reg
:
12426 case rSP_reg
: case rBP_reg
: case rSI_reg
: case rDI_reg
:
12427 if (ins
->address_mode
== mode_64bit
12428 && ((sizeflag
& DFLAG
) || (ins
->rex
& REX_W
)))
12430 s
= att_names64
[code
- rAX_reg
+ add
];
12433 code
+= eAX_reg
- rAX_reg
;
12434 /* Fall through. */
12435 case eAX_reg
: case eCX_reg
: case eDX_reg
: case eBX_reg
:
12436 case eSP_reg
: case eBP_reg
: case eSI_reg
: case eDI_reg
:
12438 if (ins
->rex
& REX_W
)
12439 s
= att_names64
[code
- eAX_reg
+ add
];
12442 if (sizeflag
& DFLAG
)
12443 s
= att_names32
[code
- eAX_reg
+ add
];
12445 s
= att_names16
[code
- eAX_reg
+ add
];
12446 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
12450 oappend (ins
, INTERNAL_DISASSEMBLER_ERROR
);
12453 oappend_register (ins
, s
);
12457 OP_IMREG (instr_info
*ins
, int code
, int sizeflag
)
12464 if (!ins
->intel_syntax
)
12466 oappend (ins
, "(%dx)");
12469 s
= att_names16
[dx_reg
- ax_reg
];
12471 case al_reg
: case cl_reg
:
12472 s
= att_names8
[code
- al_reg
];
12476 if (ins
->rex
& REX_W
)
12481 /* Fall through. */
12482 case z_mode_ax_reg
:
12483 if ((ins
->rex
& REX_W
) || (sizeflag
& DFLAG
))
12487 if (!(ins
->rex
& REX_W
))
12488 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
12491 oappend (ins
, INTERNAL_DISASSEMBLER_ERROR
);
12494 oappend_register (ins
, s
);
12498 OP_I (instr_info
*ins
, int bytemode
, int sizeflag
)
12501 bfd_signed_vma mask
= -1;
12506 FETCH_DATA (ins
->info
, ins
->codep
+ 1);
12507 op
= *ins
->codep
++;
12512 if (ins
->rex
& REX_W
)
12516 if (sizeflag
& DFLAG
)
12526 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
12538 if (ins
->intel_syntax
)
12539 oappend (ins
, "1");
12542 oappend (ins
, INTERNAL_DISASSEMBLER_ERROR
);
12547 oappend_immediate (ins
, op
);
12551 OP_I64 (instr_info
*ins
, int bytemode
, int sizeflag
)
12553 if (bytemode
!= v_mode
|| ins
->address_mode
!= mode_64bit
12554 || !(ins
->rex
& REX_W
))
12556 OP_I (ins
, bytemode
, sizeflag
);
12562 oappend_immediate (ins
, get64 (ins
));
12566 OP_sI (instr_info
*ins
, int bytemode
, int sizeflag
)
12574 FETCH_DATA (ins
->info
, ins
->codep
+ 1);
12575 op
= *ins
->codep
++;
12576 if ((op
& 0x80) != 0)
12578 if (bytemode
== b_T_mode
)
12580 if (ins
->address_mode
!= mode_64bit
12581 || !((sizeflag
& DFLAG
) || (ins
->rex
& REX_W
)))
12583 /* The operand-size prefix is overridden by a REX prefix. */
12584 if ((sizeflag
& DFLAG
) || (ins
->rex
& REX_W
))
12592 if (!(ins
->rex
& REX_W
))
12594 if (sizeflag
& DFLAG
)
12602 /* The operand-size prefix is overridden by a REX prefix. */
12603 if ((sizeflag
& DFLAG
) || (ins
->rex
& REX_W
))
12609 oappend (ins
, INTERNAL_DISASSEMBLER_ERROR
);
12613 oappend_immediate (ins
, op
);
12617 OP_J (instr_info
*ins
, int bytemode
, int sizeflag
)
12621 bfd_vma segment
= 0;
12626 FETCH_DATA (ins
->info
, ins
->codep
+ 1);
12627 disp
= *ins
->codep
++;
12628 if ((disp
& 0x80) != 0)
12633 if ((sizeflag
& DFLAG
)
12634 || (ins
->address_mode
== mode_64bit
12635 && ((ins
->isa64
== intel64
&& bytemode
!= dqw_mode
)
12636 || (ins
->rex
& REX_W
))))
12637 disp
= get32s (ins
);
12640 disp
= get16 (ins
);
12641 if ((disp
& 0x8000) != 0)
12643 /* In 16bit mode, address is wrapped around at 64k within
12644 the same segment. Otherwise, a data16 prefix on a jump
12645 instruction means that the pc is masked to 16 bits after
12646 the displacement is added! */
12648 if ((ins
->prefixes
& PREFIX_DATA
) == 0)
12649 segment
= ((ins
->start_pc
+ (ins
->codep
- ins
->start_codep
))
12650 & ~((bfd_vma
) 0xffff));
12652 if (ins
->address_mode
!= mode_64bit
12653 || (ins
->isa64
!= intel64
&& !(ins
->rex
& REX_W
)))
12654 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
12657 oappend (ins
, INTERNAL_DISASSEMBLER_ERROR
);
12660 disp
= ((ins
->start_pc
+ (ins
->codep
- ins
->start_codep
) + disp
) & mask
)
12662 set_op (ins
, disp
, false);
12663 print_operand_value (ins
, disp
, dis_style_text
);
12667 OP_SEG (instr_info
*ins
, int bytemode
, int sizeflag
)
12669 if (bytemode
== w_mode
)
12670 oappend_register (ins
, att_names_seg
[ins
->modrm
.reg
]);
12672 OP_E (ins
, ins
->modrm
.mod
== 3 ? bytemode
: w_mode
, sizeflag
);
12676 OP_DIR (instr_info
*ins
, int dummy ATTRIBUTE_UNUSED
, int sizeflag
)
12678 int seg
, offset
, res
;
12681 if (sizeflag
& DFLAG
)
12683 offset
= get32 (ins
);
12688 offset
= get16 (ins
);
12691 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
12693 res
= snprintf (scratch
, ARRAY_SIZE (scratch
),
12694 ins
->intel_syntax
? "0x%x:0x%x" : "$0x%x,$0x%x",
12696 if (res
< 0 || (size_t) res
>= ARRAY_SIZE (scratch
))
12698 oappend (ins
, scratch
);
12702 OP_OFF (instr_info
*ins
, int bytemode
, int sizeflag
)
12706 if (ins
->intel_syntax
&& (sizeflag
& SUFFIX_ALWAYS
))
12707 intel_operand_size (ins
, bytemode
, sizeflag
);
12710 if ((sizeflag
& AFLAG
) || ins
->address_mode
== mode_64bit
)
12715 if (ins
->intel_syntax
)
12717 if (!ins
->active_seg_prefix
)
12719 oappend_register (ins
, att_names_seg
[ds_reg
- es_reg
]);
12720 oappend (ins
, ":");
12723 print_operand_value (ins
, off
, dis_style_address_offset
);
12727 OP_OFF64 (instr_info
*ins
, int bytemode
, int sizeflag
)
12731 if (ins
->address_mode
!= mode_64bit
12732 || (ins
->prefixes
& PREFIX_ADDR
))
12734 OP_OFF (ins
, bytemode
, sizeflag
);
12738 if (ins
->intel_syntax
&& (sizeflag
& SUFFIX_ALWAYS
))
12739 intel_operand_size (ins
, bytemode
, sizeflag
);
12744 if (ins
->intel_syntax
)
12746 if (!ins
->active_seg_prefix
)
12748 oappend_register (ins
, att_names_seg
[ds_reg
- es_reg
]);
12749 oappend (ins
, ":");
12752 print_operand_value (ins
, off
, dis_style_address_offset
);
12756 ptr_reg (instr_info
*ins
, int code
, int sizeflag
)
12760 *ins
->obufp
++ = ins
->open_char
;
12761 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_ADDR
);
12762 if (ins
->address_mode
== mode_64bit
)
12764 if (!(sizeflag
& AFLAG
))
12765 s
= att_names32
[code
- eAX_reg
];
12767 s
= att_names64
[code
- eAX_reg
];
12769 else if (sizeflag
& AFLAG
)
12770 s
= att_names32
[code
- eAX_reg
];
12772 s
= att_names16
[code
- eAX_reg
];
12773 oappend_register (ins
, s
);
12774 oappend_char (ins
, ins
->close_char
);
12778 OP_ESreg (instr_info
*ins
, int code
, int sizeflag
)
12780 if (ins
->intel_syntax
)
12782 switch (ins
->codep
[-1])
12784 case 0x6d: /* insw/insl */
12785 intel_operand_size (ins
, z_mode
, sizeflag
);
12787 case 0xa5: /* movsw/movsl/movsq */
12788 case 0xa7: /* cmpsw/cmpsl/cmpsq */
12789 case 0xab: /* stosw/stosl */
12790 case 0xaf: /* scasw/scasl */
12791 intel_operand_size (ins
, v_mode
, sizeflag
);
12794 intel_operand_size (ins
, b_mode
, sizeflag
);
12797 oappend_register (ins
, "%es");
12798 oappend_char (ins
, ':');
12799 ptr_reg (ins
, code
, sizeflag
);
12803 OP_DSreg (instr_info
*ins
, int code
, int sizeflag
)
12805 if (ins
->intel_syntax
)
12807 switch (ins
->codep
[-1])
12809 case 0x6f: /* outsw/outsl */
12810 intel_operand_size (ins
, z_mode
, sizeflag
);
12812 case 0xa5: /* movsw/movsl/movsq */
12813 case 0xa7: /* cmpsw/cmpsl/cmpsq */
12814 case 0xad: /* lodsw/lodsl/lodsq */
12815 intel_operand_size (ins
, v_mode
, sizeflag
);
12818 intel_operand_size (ins
, b_mode
, sizeflag
);
12821 /* Set ins->active_seg_prefix to PREFIX_DS if it is unset so that the
12822 default segment register DS is printed. */
12823 if (!ins
->active_seg_prefix
)
12824 ins
->active_seg_prefix
= PREFIX_DS
;
12826 ptr_reg (ins
, code
, sizeflag
);
12830 OP_C (instr_info
*ins
, int dummy ATTRIBUTE_UNUSED
,
12831 int sizeflag ATTRIBUTE_UNUSED
)
12836 if (ins
->rex
& REX_R
)
12841 else if (ins
->address_mode
!= mode_64bit
&& (ins
->prefixes
& PREFIX_LOCK
))
12843 ins
->all_prefixes
[ins
->last_lock_prefix
] = 0;
12844 ins
->used_prefixes
|= PREFIX_LOCK
;
12849 res
= snprintf (scratch
, ARRAY_SIZE (scratch
), "%%cr%d",
12850 ins
->modrm
.reg
+ add
);
12851 if (res
< 0 || (size_t) res
>= ARRAY_SIZE (scratch
))
12853 oappend_register (ins
, scratch
);
12857 OP_D (instr_info
*ins
, int dummy ATTRIBUTE_UNUSED
,
12858 int sizeflag ATTRIBUTE_UNUSED
)
12864 if (ins
->rex
& REX_R
)
12868 res
= snprintf (scratch
, ARRAY_SIZE (scratch
),
12869 ins
->intel_syntax
? "dr%d" : "%%db%d",
12870 ins
->modrm
.reg
+ add
);
12871 if (res
< 0 || (size_t) res
>= ARRAY_SIZE (scratch
))
12873 oappend (ins
, scratch
);
12877 OP_T (instr_info
*ins
, int dummy ATTRIBUTE_UNUSED
,
12878 int sizeflag ATTRIBUTE_UNUSED
)
12883 res
= snprintf (scratch
, ARRAY_SIZE (scratch
), "%%tr%d", ins
->modrm
.reg
);
12884 if (res
< 0 || (size_t) res
>= ARRAY_SIZE (scratch
))
12886 oappend_register (ins
, scratch
);
12890 OP_MMX (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
12891 int sizeflag ATTRIBUTE_UNUSED
)
12893 int reg
= ins
->modrm
.reg
;
12894 const char *const *names
;
12896 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
12897 if (ins
->prefixes
& PREFIX_DATA
)
12899 names
= att_names_xmm
;
12901 if (ins
->rex
& REX_R
)
12905 names
= att_names_mm
;
12906 oappend_register (ins
, names
[reg
]);
12910 print_vector_reg (instr_info
*ins
, unsigned int reg
, int bytemode
)
12912 const char *const *names
;
12914 if (bytemode
== xmmq_mode
12915 || bytemode
== evex_half_bcst_xmmqh_mode
12916 || bytemode
== evex_half_bcst_xmmq_mode
)
12918 switch (ins
->vex
.length
)
12922 names
= att_names_xmm
;
12925 names
= att_names_ymm
;
12926 ins
->evex_used
|= EVEX_len_used
;
12932 else if (bytemode
== ymm_mode
)
12933 names
= att_names_ymm
;
12934 else if (bytemode
== tmm_mode
)
12938 oappend (ins
, "(bad)");
12941 names
= att_names_tmm
;
12943 else if (ins
->need_vex
12944 && bytemode
!= xmm_mode
12945 && bytemode
!= scalar_mode
12946 && bytemode
!= xmmdw_mode
12947 && bytemode
!= xmmqd_mode
12948 && bytemode
!= evex_half_bcst_xmmqdh_mode
12949 && bytemode
!= w_swap_mode
12950 && bytemode
!= b_mode
12951 && bytemode
!= w_mode
12952 && bytemode
!= d_mode
12953 && bytemode
!= q_mode
)
12955 ins
->evex_used
|= EVEX_len_used
;
12956 switch (ins
->vex
.length
)
12959 names
= att_names_xmm
;
12963 || bytemode
!= vex_vsib_q_w_dq_mode
)
12964 names
= att_names_ymm
;
12966 names
= att_names_xmm
;
12970 || bytemode
!= vex_vsib_q_w_dq_mode
)
12971 names
= att_names_zmm
;
12973 names
= att_names_ymm
;
12980 names
= att_names_xmm
;
12981 oappend_register (ins
, names
[reg
]);
12985 OP_XMM (instr_info
*ins
, int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
12987 unsigned int reg
= ins
->modrm
.reg
;
12990 if (ins
->rex
& REX_R
)
12998 if (bytemode
== tmm_mode
)
12999 ins
->modrm
.reg
= reg
;
13000 else if (bytemode
== scalar_mode
)
13001 ins
->vex
.no_broadcast
= true;
13003 print_vector_reg (ins
, reg
, bytemode
);
13007 OP_EM (instr_info
*ins
, int bytemode
, int sizeflag
)
13010 const char *const *names
;
13012 if (ins
->modrm
.mod
!= 3)
13014 if (ins
->intel_syntax
13015 && (bytemode
== v_mode
|| bytemode
== v_swap_mode
))
13017 bytemode
= (ins
->prefixes
& PREFIX_DATA
) ? x_mode
: q_mode
;
13018 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
13020 OP_E (ins
, bytemode
, sizeflag
);
13024 if ((sizeflag
& SUFFIX_ALWAYS
) && bytemode
== v_swap_mode
)
13025 swap_operand (ins
);
13027 /* Skip mod/rm byte. */
13030 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
13031 reg
= ins
->modrm
.rm
;
13032 if (ins
->prefixes
& PREFIX_DATA
)
13034 names
= att_names_xmm
;
13036 if (ins
->rex
& REX_B
)
13040 names
= att_names_mm
;
13041 oappend_register (ins
, names
[reg
]);
13044 /* cvt* are the only instructions in sse2 which have
13045 both SSE and MMX operands and also have 0x66 prefix
13046 in their opcode. 0x66 was originally used to differentiate
13047 between SSE and MMX instruction(operands). So we have to handle the
13048 cvt* separately using OP_EMC and OP_MXC */
13050 OP_EMC (instr_info
*ins
, int bytemode
, int sizeflag
)
13052 if (ins
->modrm
.mod
!= 3)
13054 if (ins
->intel_syntax
&& bytemode
== v_mode
)
13056 bytemode
= (ins
->prefixes
& PREFIX_DATA
) ? x_mode
: q_mode
;
13057 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
13059 OP_E (ins
, bytemode
, sizeflag
);
13063 /* Skip mod/rm byte. */
13066 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
13067 oappend_register (ins
, att_names_mm
[ins
->modrm
.rm
]);
13071 OP_MXC (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
13072 int sizeflag ATTRIBUTE_UNUSED
)
13074 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
13075 oappend_register (ins
, att_names_mm
[ins
->modrm
.reg
]);
13079 OP_EX (instr_info
*ins
, int bytemode
, int sizeflag
)
13083 /* Skip mod/rm byte. */
13087 if (bytemode
== dq_mode
)
13088 bytemode
= ins
->vex
.w
? q_mode
: d_mode
;
13090 if (ins
->modrm
.mod
!= 3)
13092 OP_E_memory (ins
, bytemode
, sizeflag
);
13096 reg
= ins
->modrm
.rm
;
13098 if (ins
->rex
& REX_B
)
13103 if ((ins
->rex
& REX_X
))
13107 if ((sizeflag
& SUFFIX_ALWAYS
)
13108 && (bytemode
== x_swap_mode
13109 || bytemode
== w_swap_mode
13110 || bytemode
== d_swap_mode
13111 || bytemode
== q_swap_mode
))
13112 swap_operand (ins
);
13114 if (bytemode
== tmm_mode
)
13115 ins
->modrm
.rm
= reg
;
13117 print_vector_reg (ins
, reg
, bytemode
);
13121 OP_MS (instr_info
*ins
, int bytemode
, int sizeflag
)
13123 if (ins
->modrm
.mod
== 3)
13124 OP_EM (ins
, bytemode
, sizeflag
);
13130 OP_XS (instr_info
*ins
, int bytemode
, int sizeflag
)
13132 if (ins
->modrm
.mod
== 3)
13133 OP_EX (ins
, bytemode
, sizeflag
);
13139 OP_M (instr_info
*ins
, int bytemode
, int sizeflag
)
13141 if (ins
->modrm
.mod
== 3)
13142 /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
13145 OP_E (ins
, bytemode
, sizeflag
);
13149 OP_0f07 (instr_info
*ins
, int bytemode
, int sizeflag
)
13151 if (ins
->modrm
.mod
!= 3 || ins
->modrm
.rm
!= 0)
13154 OP_E (ins
, bytemode
, sizeflag
);
13157 /* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
13158 32bit mode and "xchg %rax,%rax" in 64bit mode. */
13161 NOP_Fixup (instr_info
*ins
, int opnd
, int sizeflag
)
13163 if ((ins
->prefixes
& PREFIX_DATA
) == 0 && (ins
->rex
& REX_B
) == 0)
13164 ins
->mnemonicendp
= stpcpy (ins
->obuf
, "nop");
13165 else if (opnd
== 0)
13166 OP_REG (ins
, eAX_reg
, sizeflag
);
13168 OP_IMREG (ins
, eAX_reg
, sizeflag
);
13171 static const char *const Suffix3DNow
[] = {
13172 /* 00 */ NULL
, NULL
, NULL
, NULL
,
13173 /* 04 */ NULL
, NULL
, NULL
, NULL
,
13174 /* 08 */ NULL
, NULL
, NULL
, NULL
,
13175 /* 0C */ "pi2fw", "pi2fd", NULL
, NULL
,
13176 /* 10 */ NULL
, NULL
, NULL
, NULL
,
13177 /* 14 */ NULL
, NULL
, NULL
, NULL
,
13178 /* 18 */ NULL
, NULL
, NULL
, NULL
,
13179 /* 1C */ "pf2iw", "pf2id", NULL
, NULL
,
13180 /* 20 */ NULL
, NULL
, NULL
, NULL
,
13181 /* 24 */ NULL
, NULL
, NULL
, NULL
,
13182 /* 28 */ NULL
, NULL
, NULL
, NULL
,
13183 /* 2C */ NULL
, NULL
, NULL
, NULL
,
13184 /* 30 */ NULL
, NULL
, NULL
, NULL
,
13185 /* 34 */ NULL
, NULL
, NULL
, NULL
,
13186 /* 38 */ NULL
, NULL
, NULL
, NULL
,
13187 /* 3C */ NULL
, NULL
, NULL
, NULL
,
13188 /* 40 */ NULL
, NULL
, NULL
, NULL
,
13189 /* 44 */ NULL
, NULL
, NULL
, NULL
,
13190 /* 48 */ NULL
, NULL
, NULL
, NULL
,
13191 /* 4C */ NULL
, NULL
, NULL
, NULL
,
13192 /* 50 */ NULL
, NULL
, NULL
, NULL
,
13193 /* 54 */ NULL
, NULL
, NULL
, NULL
,
13194 /* 58 */ NULL
, NULL
, NULL
, NULL
,
13195 /* 5C */ NULL
, NULL
, NULL
, NULL
,
13196 /* 60 */ NULL
, NULL
, NULL
, NULL
,
13197 /* 64 */ NULL
, NULL
, NULL
, NULL
,
13198 /* 68 */ NULL
, NULL
, NULL
, NULL
,
13199 /* 6C */ NULL
, NULL
, NULL
, NULL
,
13200 /* 70 */ NULL
, NULL
, NULL
, NULL
,
13201 /* 74 */ NULL
, NULL
, NULL
, NULL
,
13202 /* 78 */ NULL
, NULL
, NULL
, NULL
,
13203 /* 7C */ NULL
, NULL
, NULL
, NULL
,
13204 /* 80 */ NULL
, NULL
, NULL
, NULL
,
13205 /* 84 */ NULL
, NULL
, NULL
, NULL
,
13206 /* 88 */ NULL
, NULL
, "pfnacc", NULL
,
13207 /* 8C */ NULL
, NULL
, "pfpnacc", NULL
,
13208 /* 90 */ "pfcmpge", NULL
, NULL
, NULL
,
13209 /* 94 */ "pfmin", NULL
, "pfrcp", "pfrsqrt",
13210 /* 98 */ NULL
, NULL
, "pfsub", NULL
,
13211 /* 9C */ NULL
, NULL
, "pfadd", NULL
,
13212 /* A0 */ "pfcmpgt", NULL
, NULL
, NULL
,
13213 /* A4 */ "pfmax", NULL
, "pfrcpit1", "pfrsqit1",
13214 /* A8 */ NULL
, NULL
, "pfsubr", NULL
,
13215 /* AC */ NULL
, NULL
, "pfacc", NULL
,
13216 /* B0 */ "pfcmpeq", NULL
, NULL
, NULL
,
13217 /* B4 */ "pfmul", NULL
, "pfrcpit2", "pmulhrw",
13218 /* B8 */ NULL
, NULL
, NULL
, "pswapd",
13219 /* BC */ NULL
, NULL
, NULL
, "pavgusb",
13220 /* C0 */ NULL
, NULL
, NULL
, NULL
,
13221 /* C4 */ NULL
, NULL
, NULL
, NULL
,
13222 /* C8 */ NULL
, NULL
, NULL
, NULL
,
13223 /* CC */ NULL
, NULL
, NULL
, NULL
,
13224 /* D0 */ NULL
, NULL
, NULL
, NULL
,
13225 /* D4 */ NULL
, NULL
, NULL
, NULL
,
13226 /* D8 */ NULL
, NULL
, NULL
, NULL
,
13227 /* DC */ NULL
, NULL
, NULL
, NULL
,
13228 /* E0 */ NULL
, NULL
, NULL
, NULL
,
13229 /* E4 */ NULL
, NULL
, NULL
, NULL
,
13230 /* E8 */ NULL
, NULL
, NULL
, NULL
,
13231 /* EC */ NULL
, NULL
, NULL
, NULL
,
13232 /* F0 */ NULL
, NULL
, NULL
, NULL
,
13233 /* F4 */ NULL
, NULL
, NULL
, NULL
,
13234 /* F8 */ NULL
, NULL
, NULL
, NULL
,
13235 /* FC */ NULL
, NULL
, NULL
, NULL
,
13239 OP_3DNowSuffix (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
13240 int sizeflag ATTRIBUTE_UNUSED
)
13242 const char *mnemonic
;
13244 FETCH_DATA (ins
->info
, ins
->codep
+ 1);
13245 /* AMD 3DNow! instructions are specified by an opcode suffix in the
13246 place where an 8-bit immediate would normally go. ie. the last
13247 byte of the instruction. */
13248 ins
->obufp
= ins
->mnemonicendp
;
13249 mnemonic
= Suffix3DNow
[*ins
->codep
++ & 0xff];
13251 ins
->obufp
= stpcpy (ins
->obufp
, mnemonic
);
13254 /* Since a variable sized ins->modrm/ins->sib chunk is between the start
13255 of the opcode (0x0f0f) and the opcode suffix, we need to do
13256 all the ins->modrm processing first, and don't know until now that
13257 we have a bad opcode. This necessitates some cleaning up. */
13258 ins
->op_out
[0][0] = '\0';
13259 ins
->op_out
[1][0] = '\0';
13262 ins
->mnemonicendp
= ins
->obufp
;
13265 static const struct op simd_cmp_op
[] =
13267 { STRING_COMMA_LEN ("eq") },
13268 { STRING_COMMA_LEN ("lt") },
13269 { STRING_COMMA_LEN ("le") },
13270 { STRING_COMMA_LEN ("unord") },
13271 { STRING_COMMA_LEN ("neq") },
13272 { STRING_COMMA_LEN ("nlt") },
13273 { STRING_COMMA_LEN ("nle") },
13274 { STRING_COMMA_LEN ("ord") }
13277 static const struct op vex_cmp_op
[] =
13279 { STRING_COMMA_LEN ("eq_uq") },
13280 { STRING_COMMA_LEN ("nge") },
13281 { STRING_COMMA_LEN ("ngt") },
13282 { STRING_COMMA_LEN ("false") },
13283 { STRING_COMMA_LEN ("neq_oq") },
13284 { STRING_COMMA_LEN ("ge") },
13285 { STRING_COMMA_LEN ("gt") },
13286 { STRING_COMMA_LEN ("true") },
13287 { STRING_COMMA_LEN ("eq_os") },
13288 { STRING_COMMA_LEN ("lt_oq") },
13289 { STRING_COMMA_LEN ("le_oq") },
13290 { STRING_COMMA_LEN ("unord_s") },
13291 { STRING_COMMA_LEN ("neq_us") },
13292 { STRING_COMMA_LEN ("nlt_uq") },
13293 { STRING_COMMA_LEN ("nle_uq") },
13294 { STRING_COMMA_LEN ("ord_s") },
13295 { STRING_COMMA_LEN ("eq_us") },
13296 { STRING_COMMA_LEN ("nge_uq") },
13297 { STRING_COMMA_LEN ("ngt_uq") },
13298 { STRING_COMMA_LEN ("false_os") },
13299 { STRING_COMMA_LEN ("neq_os") },
13300 { STRING_COMMA_LEN ("ge_oq") },
13301 { STRING_COMMA_LEN ("gt_oq") },
13302 { STRING_COMMA_LEN ("true_us") },
13306 CMP_Fixup (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
13307 int sizeflag ATTRIBUTE_UNUSED
)
13309 unsigned int cmp_type
;
13311 FETCH_DATA (ins
->info
, ins
->codep
+ 1);
13312 cmp_type
= *ins
->codep
++ & 0xff;
13313 if (cmp_type
< ARRAY_SIZE (simd_cmp_op
))
13316 char *p
= ins
->mnemonicendp
- 2;
13320 sprintf (p
, "%s%s", simd_cmp_op
[cmp_type
].name
, suffix
);
13321 ins
->mnemonicendp
+= simd_cmp_op
[cmp_type
].len
;
13323 else if (ins
->need_vex
13324 && cmp_type
< ARRAY_SIZE (simd_cmp_op
) + ARRAY_SIZE (vex_cmp_op
))
13327 char *p
= ins
->mnemonicendp
- 2;
13331 cmp_type
-= ARRAY_SIZE (simd_cmp_op
);
13332 sprintf (p
, "%s%s", vex_cmp_op
[cmp_type
].name
, suffix
);
13333 ins
->mnemonicendp
+= vex_cmp_op
[cmp_type
].len
;
13337 /* We have a reserved extension byte. Output it directly. */
13338 oappend_immediate (ins
, cmp_type
);
13343 OP_Mwait (instr_info
*ins
, int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
13345 /* mwait %eax,%ecx / mwaitx %eax,%ecx,%ebx */
13346 if (!ins
->intel_syntax
)
13348 strcpy (ins
->op_out
[0], att_names32
[0] + ins
->intel_syntax
);
13349 strcpy (ins
->op_out
[1], att_names32
[1] + ins
->intel_syntax
);
13350 if (bytemode
== eBX_reg
)
13351 strcpy (ins
->op_out
[2], att_names32
[3] + ins
->intel_syntax
);
13352 ins
->two_source_ops
= true;
13354 /* Skip mod/rm byte. */
13360 OP_Monitor (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
13361 int sizeflag ATTRIBUTE_UNUSED
)
13363 /* monitor %{e,r,}ax,%ecx,%edx" */
13364 if (!ins
->intel_syntax
)
13366 const char *const *names
= (ins
->address_mode
== mode_64bit
13367 ? att_names64
: att_names32
);
13369 if (ins
->prefixes
& PREFIX_ADDR
)
13371 /* Remove "addr16/addr32". */
13372 ins
->all_prefixes
[ins
->last_addr_prefix
] = 0;
13373 names
= (ins
->address_mode
!= mode_32bit
13374 ? att_names32
: att_names16
);
13375 ins
->used_prefixes
|= PREFIX_ADDR
;
13377 else if (ins
->address_mode
== mode_16bit
)
13378 names
= att_names16
;
13379 strcpy (ins
->op_out
[0], names
[0] + ins
->intel_syntax
);
13380 strcpy (ins
->op_out
[1], att_names32
[1] + ins
->intel_syntax
);
13381 strcpy (ins
->op_out
[2], att_names32
[2] + ins
->intel_syntax
);
13382 ins
->two_source_ops
= true;
13384 /* Skip mod/rm byte. */
13390 BadOp (instr_info
*ins
)
13392 /* Throw away prefixes and 1st. opcode byte. */
13393 ins
->codep
= ins
->insn_codep
+ 1;
13394 ins
->obufp
= stpcpy (ins
->obufp
, "(bad)");
13398 REP_Fixup (instr_info
*ins
, int bytemode
, int sizeflag
)
13400 /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
13402 if (ins
->prefixes
& PREFIX_REPZ
)
13403 ins
->all_prefixes
[ins
->last_repz_prefix
] = REP_PREFIX
;
13410 OP_IMREG (ins
, bytemode
, sizeflag
);
13413 OP_ESreg (ins
, bytemode
, sizeflag
);
13416 OP_DSreg (ins
, bytemode
, sizeflag
);
13425 SEP_Fixup (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
13426 int sizeflag ATTRIBUTE_UNUSED
)
13428 if (ins
->isa64
!= amd64
)
13431 ins
->obufp
= ins
->obuf
;
13433 ins
->mnemonicendp
= ins
->obufp
;
13437 /* For BND-prefixed instructions 0xF2 prefix should be displayed as
13441 BND_Fixup (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
13442 int sizeflag ATTRIBUTE_UNUSED
)
13444 if (ins
->prefixes
& PREFIX_REPNZ
)
13445 ins
->all_prefixes
[ins
->last_repnz_prefix
] = BND_PREFIX
;
13448 /* For NOTRACK-prefixed instructions, 0x3E prefix should be displayed as
13452 NOTRACK_Fixup (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
13453 int sizeflag ATTRIBUTE_UNUSED
)
13455 /* Since active_seg_prefix is not set in 64-bit mode, check whether
13456 we've seen a PREFIX_DS. */
13457 if ((ins
->prefixes
& PREFIX_DS
) != 0
13458 && (ins
->address_mode
!= mode_64bit
|| ins
->last_data_prefix
< 0))
13460 /* NOTRACK prefix is only valid on indirect branch instructions.
13461 NB: DATA prefix is unsupported for Intel64. */
13462 ins
->active_seg_prefix
= 0;
13463 ins
->all_prefixes
[ins
->last_seg_prefix
] = NOTRACK_PREFIX
;
13467 /* Similar to OP_E. But the 0xf2/0xf3 ins->prefixes should be displayed as
13468 "xacquire"/"xrelease" for memory operand if there is a LOCK prefix.
13472 HLE_Fixup1 (instr_info
*ins
, int bytemode
, int sizeflag
)
13474 if (ins
->modrm
.mod
!= 3
13475 && (ins
->prefixes
& PREFIX_LOCK
) != 0)
13477 if (ins
->prefixes
& PREFIX_REPZ
)
13478 ins
->all_prefixes
[ins
->last_repz_prefix
] = XRELEASE_PREFIX
;
13479 if (ins
->prefixes
& PREFIX_REPNZ
)
13480 ins
->all_prefixes
[ins
->last_repnz_prefix
] = XACQUIRE_PREFIX
;
13483 OP_E (ins
, bytemode
, sizeflag
);
13486 /* Similar to OP_E. But the 0xf2/0xf3 ins->prefixes should be displayed as
13487 "xacquire"/"xrelease" for memory operand. No check for LOCK prefix.
13491 HLE_Fixup2 (instr_info
*ins
, int bytemode
, int sizeflag
)
13493 if (ins
->modrm
.mod
!= 3)
13495 if (ins
->prefixes
& PREFIX_REPZ
)
13496 ins
->all_prefixes
[ins
->last_repz_prefix
] = XRELEASE_PREFIX
;
13497 if (ins
->prefixes
& PREFIX_REPNZ
)
13498 ins
->all_prefixes
[ins
->last_repnz_prefix
] = XACQUIRE_PREFIX
;
13501 OP_E (ins
, bytemode
, sizeflag
);
13504 /* Similar to OP_E. But the 0xf3 prefixes should be displayed as
13505 "xrelease" for memory operand. No check for LOCK prefix. */
13508 HLE_Fixup3 (instr_info
*ins
, int bytemode
, int sizeflag
)
13510 if (ins
->modrm
.mod
!= 3
13511 && ins
->last_repz_prefix
> ins
->last_repnz_prefix
13512 && (ins
->prefixes
& PREFIX_REPZ
) != 0)
13513 ins
->all_prefixes
[ins
->last_repz_prefix
] = XRELEASE_PREFIX
;
13515 OP_E (ins
, bytemode
, sizeflag
);
13519 CMPXCHG8B_Fixup (instr_info
*ins
, int bytemode
, int sizeflag
)
13522 if (ins
->rex
& REX_W
)
13524 /* Change cmpxchg8b to cmpxchg16b. */
13525 char *p
= ins
->mnemonicendp
- 2;
13526 ins
->mnemonicendp
= stpcpy (p
, "16b");
13529 else if ((ins
->prefixes
& PREFIX_LOCK
) != 0)
13531 if (ins
->prefixes
& PREFIX_REPZ
)
13532 ins
->all_prefixes
[ins
->last_repz_prefix
] = XRELEASE_PREFIX
;
13533 if (ins
->prefixes
& PREFIX_REPNZ
)
13534 ins
->all_prefixes
[ins
->last_repnz_prefix
] = XACQUIRE_PREFIX
;
13537 OP_M (ins
, bytemode
, sizeflag
);
13541 XMM_Fixup (instr_info
*ins
, int reg
, int sizeflag ATTRIBUTE_UNUSED
)
13543 const char *const *names
= att_names_xmm
;
13547 switch (ins
->vex
.length
)
13552 names
= att_names_ymm
;
13558 oappend_register (ins
, names
[reg
]);
13562 FXSAVE_Fixup (instr_info
*ins
, int bytemode
, int sizeflag
)
13564 /* Add proper suffix to "fxsave" and "fxrstor". */
13566 if (ins
->rex
& REX_W
)
13568 char *p
= ins
->mnemonicendp
;
13572 ins
->mnemonicendp
= p
;
13574 OP_M (ins
, bytemode
, sizeflag
);
13577 /* Display the destination register operand for instructions with
13581 OP_VEX (instr_info
*ins
, int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
13583 int reg
, modrm_reg
, sib_index
= -1;
13584 const char *const *names
;
13586 if (!ins
->need_vex
)
13589 reg
= ins
->vex
.register_specifier
;
13590 ins
->vex
.register_specifier
= 0;
13591 if (ins
->address_mode
!= mode_64bit
)
13593 if (ins
->vex
.evex
&& !ins
->vex
.v
)
13595 oappend (ins
, "(bad)");
13601 else if (ins
->vex
.evex
&& !ins
->vex
.v
)
13607 oappend_register (ins
, att_names_xmm
[reg
]);
13610 case vex_vsib_d_w_dq_mode
:
13611 case vex_vsib_q_w_dq_mode
:
13612 /* This must be the 3rd operand. */
13613 if (ins
->obufp
!= ins
->op_out
[2])
13615 if (ins
->vex
.length
== 128
13616 || (bytemode
!= vex_vsib_d_w_dq_mode
13618 oappend_register (ins
, att_names_xmm
[reg
]);
13620 oappend_register (ins
, att_names_ymm
[reg
]);
13622 /* All 3 XMM/YMM registers must be distinct. */
13623 modrm_reg
= ins
->modrm
.reg
;
13624 if (ins
->rex
& REX_R
)
13627 if (ins
->has_sib
&& ins
->modrm
.rm
== 4)
13629 sib_index
= ins
->sib
.index
;
13630 if (ins
->rex
& REX_X
)
13634 if (reg
== modrm_reg
|| reg
== sib_index
)
13635 strcpy (ins
->obufp
, "/(bad)");
13636 if (modrm_reg
== sib_index
|| modrm_reg
== reg
)
13637 strcat (ins
->op_out
[0], "/(bad)");
13638 if (sib_index
== modrm_reg
|| sib_index
== reg
)
13639 strcat (ins
->op_out
[1], "/(bad)");
13644 /* All 3 TMM registers must be distinct. */
13646 oappend (ins
, "(bad)");
13649 /* This must be the 3rd operand. */
13650 if (ins
->obufp
!= ins
->op_out
[2])
13652 oappend_register (ins
, att_names_tmm
[reg
]);
13653 if (reg
== ins
->modrm
.reg
|| reg
== ins
->modrm
.rm
)
13654 strcpy (ins
->obufp
, "/(bad)");
13657 if (ins
->modrm
.reg
== ins
->modrm
.rm
|| ins
->modrm
.reg
== reg
13658 || ins
->modrm
.rm
== reg
)
13660 if (ins
->modrm
.reg
<= 8
13661 && (ins
->modrm
.reg
== ins
->modrm
.rm
|| ins
->modrm
.reg
== reg
))
13662 strcat (ins
->op_out
[0], "/(bad)");
13663 if (ins
->modrm
.rm
<= 8
13664 && (ins
->modrm
.rm
== ins
->modrm
.reg
|| ins
->modrm
.rm
== reg
))
13665 strcat (ins
->op_out
[1], "/(bad)");
13671 switch (ins
->vex
.length
)
13677 names
= att_names_xmm
;
13678 ins
->evex_used
|= EVEX_len_used
;
13681 if (ins
->rex
& REX_W
)
13682 names
= att_names64
;
13684 names
= att_names32
;
13690 oappend (ins
, "(bad)");
13693 names
= att_names_mask
;
13704 names
= att_names_ymm
;
13705 ins
->evex_used
|= EVEX_len_used
;
13711 oappend (ins
, "(bad)");
13714 names
= att_names_mask
;
13717 /* See PR binutils/20893 for a reproducer. */
13718 oappend (ins
, "(bad)");
13723 names
= att_names_zmm
;
13724 ins
->evex_used
|= EVEX_len_used
;
13730 oappend_register (ins
, names
[reg
]);
13734 OP_VexR (instr_info
*ins
, int bytemode
, int sizeflag
)
13736 if (ins
->modrm
.mod
== 3)
13737 OP_VEX (ins
, bytemode
, sizeflag
);
13741 OP_VexW (instr_info
*ins
, int bytemode
, int sizeflag
)
13743 OP_VEX (ins
, bytemode
, sizeflag
);
13747 /* Swap 2nd and 3rd operands. */
13748 char *tmp
= ins
->op_out
[2];
13750 ins
->op_out
[2] = ins
->op_out
[1];
13751 ins
->op_out
[1] = tmp
;
13756 OP_REG_VexI4 (instr_info
*ins
, int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
13759 const char *const *names
= att_names_xmm
;
13761 FETCH_DATA (ins
->info
, ins
->codep
+ 1);
13762 reg
= *ins
->codep
++;
13764 if (bytemode
!= x_mode
&& bytemode
!= scalar_mode
)
13768 if (ins
->address_mode
!= mode_64bit
)
13771 if (bytemode
== x_mode
&& ins
->vex
.length
== 256)
13772 names
= att_names_ymm
;
13774 oappend_register (ins
, names
[reg
]);
13778 /* Swap 3rd and 4th operands. */
13779 char *tmp
= ins
->op_out
[3];
13781 ins
->op_out
[3] = ins
->op_out
[2];
13782 ins
->op_out
[2] = tmp
;
13787 OP_VexI4 (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
13788 int sizeflag ATTRIBUTE_UNUSED
)
13790 oappend_immediate (ins
, ins
->codep
[-1] & 0xf);
13794 VPCMP_Fixup (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
13795 int sizeflag ATTRIBUTE_UNUSED
)
13797 unsigned int cmp_type
;
13799 if (!ins
->vex
.evex
)
13802 FETCH_DATA (ins
->info
, ins
->codep
+ 1);
13803 cmp_type
= *ins
->codep
++ & 0xff;
13804 /* There are aliases for immediates 0, 1, 2, 4, 5, 6.
13805 If it's the case, print suffix, otherwise - print the immediate. */
13806 if (cmp_type
< ARRAY_SIZE (simd_cmp_op
)
13811 char *p
= ins
->mnemonicendp
- 2;
13813 /* vpcmp* can have both one- and two-lettered suffix. */
13827 sprintf (p
, "%s%s", simd_cmp_op
[cmp_type
].name
, suffix
);
13828 ins
->mnemonicendp
+= simd_cmp_op
[cmp_type
].len
;
13832 /* We have a reserved extension byte. Output it directly. */
13833 oappend_immediate (ins
, cmp_type
);
13837 static const struct op xop_cmp_op
[] =
13839 { STRING_COMMA_LEN ("lt") },
13840 { STRING_COMMA_LEN ("le") },
13841 { STRING_COMMA_LEN ("gt") },
13842 { STRING_COMMA_LEN ("ge") },
13843 { STRING_COMMA_LEN ("eq") },
13844 { STRING_COMMA_LEN ("neq") },
13845 { STRING_COMMA_LEN ("false") },
13846 { STRING_COMMA_LEN ("true") }
13850 VPCOM_Fixup (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
13851 int sizeflag ATTRIBUTE_UNUSED
)
13853 unsigned int cmp_type
;
13855 FETCH_DATA (ins
->info
, ins
->codep
+ 1);
13856 cmp_type
= *ins
->codep
++ & 0xff;
13857 if (cmp_type
< ARRAY_SIZE (xop_cmp_op
))
13860 char *p
= ins
->mnemonicendp
- 2;
13862 /* vpcom* can have both one- and two-lettered suffix. */
13876 sprintf (p
, "%s%s", xop_cmp_op
[cmp_type
].name
, suffix
);
13877 ins
->mnemonicendp
+= xop_cmp_op
[cmp_type
].len
;
13881 /* We have a reserved extension byte. Output it directly. */
13882 oappend_immediate (ins
, cmp_type
);
13886 static const struct op pclmul_op
[] =
13888 { STRING_COMMA_LEN ("lql") },
13889 { STRING_COMMA_LEN ("hql") },
13890 { STRING_COMMA_LEN ("lqh") },
13891 { STRING_COMMA_LEN ("hqh") }
13895 PCLMUL_Fixup (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
13896 int sizeflag ATTRIBUTE_UNUSED
)
13898 unsigned int pclmul_type
;
13900 FETCH_DATA (ins
->info
, ins
->codep
+ 1);
13901 pclmul_type
= *ins
->codep
++ & 0xff;
13902 switch (pclmul_type
)
13913 if (pclmul_type
< ARRAY_SIZE (pclmul_op
))
13916 char *p
= ins
->mnemonicendp
- 3;
13921 sprintf (p
, "%s%s", pclmul_op
[pclmul_type
].name
, suffix
);
13922 ins
->mnemonicendp
+= pclmul_op
[pclmul_type
].len
;
13926 /* We have a reserved extension byte. Output it directly. */
13927 oappend_immediate (ins
, pclmul_type
);
13932 MOVSXD_Fixup (instr_info
*ins
, int bytemode
, int sizeflag
)
13934 /* Add proper suffix to "movsxd". */
13935 char *p
= ins
->mnemonicendp
;
13940 if (!ins
->intel_syntax
)
13943 if (ins
->rex
& REX_W
)
13955 oappend (ins
, INTERNAL_DISASSEMBLER_ERROR
);
13959 ins
->mnemonicendp
= p
;
13961 OP_E (ins
, bytemode
, sizeflag
);
13965 DistinctDest_Fixup (instr_info
*ins
, int bytemode
, int sizeflag
)
13967 unsigned int reg
= ins
->vex
.register_specifier
;
13968 unsigned int modrm_reg
= ins
->modrm
.reg
;
13969 unsigned int modrm_rm
= ins
->modrm
.rm
;
13971 /* Calc destination register number. */
13972 if (ins
->rex
& REX_R
)
13977 /* Calc src1 register number. */
13978 if (ins
->address_mode
!= mode_64bit
)
13980 else if (ins
->vex
.evex
&& !ins
->vex
.v
)
13983 /* Calc src2 register number. */
13984 if (ins
->modrm
.mod
== 3)
13986 if (ins
->rex
& REX_B
)
13988 if (ins
->rex
& REX_X
)
13992 /* Destination and source registers must be distinct, output bad if
13993 dest == src1 or dest == src2. */
13994 if (modrm_reg
== reg
13995 || (ins
->modrm
.mod
== 3
13996 && modrm_reg
== modrm_rm
))
13998 oappend (ins
, "(bad)");
14001 OP_XMM (ins
, bytemode
, sizeflag
);
14005 OP_Rounding (instr_info
*ins
, int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
14007 if (ins
->modrm
.mod
!= 3 || !ins
->vex
.b
)
14012 case evex_rounding_64_mode
:
14013 if (ins
->address_mode
!= mode_64bit
|| !ins
->vex
.w
)
14015 /* Fall through. */
14016 case evex_rounding_mode
:
14017 ins
->evex_used
|= EVEX_b_used
;
14018 oappend (ins
, names_rounding
[ins
->vex
.ll
]);
14020 case evex_sae_mode
:
14021 ins
->evex_used
|= EVEX_b_used
;
14022 oappend (ins
, "{");
14027 oappend (ins
, "sae}");
14031 PREFETCHI_Fixup (instr_info
*ins
, int bytemode
, int sizeflag
)
14033 if (ins
->modrm
.mod
!= 0 || ins
->modrm
.rm
!= 5)
14035 if (ins
->intel_syntax
)
14037 ins
->mnemonicendp
= stpcpy (ins
->obuf
, "nop ");
14042 if (ins
->rex
& REX_W
)
14043 ins
->mnemonicendp
= stpcpy (ins
->obuf
, "nopq ");
14046 if (sizeflag
& DFLAG
)
14047 ins
->mnemonicendp
= stpcpy (ins
->obuf
, "nopl ");
14049 ins
->mnemonicendp
= stpcpy (ins
->obuf
, "nopw ");
14050 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
14056 OP_M (ins
, bytemode
, sizeflag
);