1 /* Print i386 instructions for GDB, the GNU debugger.
2 Copyright (C) 1988-2024 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"
42 typedef struct instr_info instr_info
;
44 static bool dofloat (instr_info
*, int);
45 static int putop (instr_info
*, const char *, int);
46 static void oappend_with_style (instr_info
*, const char *,
47 enum disassembler_style
);
49 static bool OP_E (instr_info
*, int, int);
50 static bool OP_E_memory (instr_info
*, int, int);
51 static bool OP_indirE (instr_info
*, int, int);
52 static bool OP_G (instr_info
*, int, int);
53 static bool OP_ST (instr_info
*, int, int);
54 static bool OP_STi (instr_info
*, int, int);
55 static bool OP_Skip_MODRM (instr_info
*, int, int);
56 static bool OP_REG (instr_info
*, int, int);
57 static bool OP_IMREG (instr_info
*, int, int);
58 static bool OP_I (instr_info
*, int, int);
59 static bool OP_I64 (instr_info
*, int, int);
60 static bool OP_sI (instr_info
*, int, int);
61 static bool OP_J (instr_info
*, int, int);
62 static bool OP_SEG (instr_info
*, int, int);
63 static bool OP_DIR (instr_info
*, int, int);
64 static bool OP_OFF (instr_info
*, int, int);
65 static bool OP_OFF64 (instr_info
*, int, int);
66 static bool OP_ESreg (instr_info
*, int, int);
67 static bool OP_DSreg (instr_info
*, int, int);
68 static bool OP_C (instr_info
*, int, int);
69 static bool OP_D (instr_info
*, int, int);
70 static bool OP_T (instr_info
*, int, int);
71 static bool OP_MMX (instr_info
*, int, int);
72 static bool OP_XMM (instr_info
*, int, int);
73 static bool OP_EM (instr_info
*, int, int);
74 static bool OP_EX (instr_info
*, int, int);
75 static bool OP_EMC (instr_info
*, int,int);
76 static bool OP_MXC (instr_info
*, int,int);
77 static bool OP_R (instr_info
*, int, int);
78 static bool OP_M (instr_info
*, int, int);
79 static bool OP_VEX (instr_info
*, int, int);
80 static bool OP_VexR (instr_info
*, int, int);
81 static bool OP_VexW (instr_info
*, int, int);
82 static bool OP_Rounding (instr_info
*, int, int);
83 static bool OP_REG_VexI4 (instr_info
*, int, int);
84 static bool OP_VexI4 (instr_info
*, int, int);
85 static bool OP_0f07 (instr_info
*, int, int);
86 static bool OP_Monitor (instr_info
*, int, int);
87 static bool OP_Mwait (instr_info
*, int, int);
89 static bool PCLMUL_Fixup (instr_info
*, int, int);
90 static bool VPCMP_Fixup (instr_info
*, int, int);
91 static bool VPCOM_Fixup (instr_info
*, int, int);
92 static bool NOP_Fixup (instr_info
*, int, int);
93 static bool MONTMUL_Fixup (instr_info
*, int, int);
94 static bool OP_3DNowSuffix (instr_info
*, int, int);
95 static bool CMP_Fixup (instr_info
*, int, int);
96 static bool REP_Fixup (instr_info
*, int, int);
97 static bool SEP_Fixup (instr_info
*, int, int);
98 static bool BND_Fixup (instr_info
*, int, int);
99 static bool NOTRACK_Fixup (instr_info
*, int, int);
100 static bool HLE_Fixup1 (instr_info
*, int, int);
101 static bool HLE_Fixup2 (instr_info
*, int, int);
102 static bool HLE_Fixup3 (instr_info
*, int, int);
103 static bool CMPXCHG8B_Fixup (instr_info
*, int, int);
104 static bool XMM_Fixup (instr_info
*, int, int);
105 static bool FXSAVE_Fixup (instr_info
*, int, int);
106 static bool MOVSXD_Fixup (instr_info
*, int, int);
107 static bool DistinctDest_Fixup (instr_info
*, int, int);
108 static bool PREFETCHI_Fixup (instr_info
*, int, int);
109 static bool PUSH2_POP2_Fixup (instr_info
*, int, int);
110 static bool JMPABS_Fixup (instr_info
*, int, int);
111 static bool CFCMOV_Fixup (instr_info
*, int, int);
113 static void ATTRIBUTE_PRINTF_3
i386_dis_printf (const disassemble_info
*,
114 enum disassembler_style
,
117 /* This character is used to encode style information within the output
118 buffers. See oappend_insert_style for more details. */
119 #define STYLE_MARKER_CHAR '\002'
121 /* The maximum operand buffer size. */
122 #define MAX_OPERAND_BUFFER_SIZE 128
131 static const char *prefix_name (enum address_mode
, uint8_t, int);
148 enum address_mode address_mode
;
150 /* Flags for the prefixes for the current instruction. See below. */
153 /* REX prefix the current instruction. See below. */
155 /* Bits of REX we've already used. */
158 /* Record W R4 X4 B4 bits for rex2. */
160 /* Bits of rex2 we've already used. */
161 unsigned char rex2_used
;
162 unsigned char rex2_payload
;
165 unsigned char condition_code
;
166 unsigned char need_vex
;
169 /* Flags for ins->prefixes which we somehow handled when printing the
170 current instruction. */
173 /* Flags for EVEX bits which we somehow handled when printing the
174 current instruction. */
177 char obuf
[MAX_OPERAND_BUFFER_SIZE
];
180 const uint8_t *start_codep
;
182 const uint8_t *end_codep
;
183 unsigned char nr_prefixes
;
184 signed char last_lock_prefix
;
185 signed char last_repz_prefix
;
186 signed char last_repnz_prefix
;
187 signed char last_data_prefix
;
188 signed char last_addr_prefix
;
189 signed char last_rex_prefix
;
190 signed char last_rex2_prefix
;
191 signed char last_seg_prefix
;
192 signed char fwait_prefix
;
193 /* The active segment register prefix. */
194 unsigned char active_seg_prefix
;
196 #define MAX_CODE_LENGTH 15
197 /* We can up to 14 ins->prefixes since the maximum instruction length is
199 uint8_t all_prefixes
[MAX_CODE_LENGTH
- 1];
200 disassemble_info
*info
;
220 int register_specifier
;
223 int mask_register_specifier
;
237 /* For APX EVEX-promoted prefix, EVEX.ND shares the same bit as vex.b. */
240 enum evex_type evex_type
;
242 /* Remember if the current op is a jump instruction. */
247 /* Record whether EVEX masking is used incorrectly. */
248 bool illegal_masking
;
250 /* Record whether the modrm byte has been skipped. */
251 bool has_skipped_modrm
;
254 signed char op_index
[MAX_OPERANDS
];
255 bool op_riprel
[MAX_OPERANDS
];
256 char *op_out
[MAX_OPERANDS
];
257 bfd_vma op_address
[MAX_OPERANDS
];
260 /* On the 386's of 1988, the maximum length of an instruction is 15 bytes.
261 * (see topic "Redundant ins->prefixes" in the "Differences from 8086"
262 * section of the "Virtual 8086 Mode" chapter.)
263 * 'pc' should be the address of this instruction, it will
264 * be used to print the target address if this is a relative jump or call
265 * The function returns the length of this instruction in bytes.
274 enum x86_64_isa isa64
;
281 /* Indexes first byte not fetched. */
282 unsigned int fetched
;
283 uint8_t the_buffer
[2 * MAX_CODE_LENGTH
- 1];
286 /* Mark parts used in the REX prefix. When we are testing for
287 empty prefix (for 8bit register REX extension), just mask it
288 out. Otherwise test for REX bit is excuse for existence of REX
289 only in case value is nonzero. */
290 #define USED_REX(value) \
294 if (ins->rex & value) \
295 ins->rex_used |= (value) | REX_OPCODE; \
296 if (ins->rex2 & value) \
298 ins->rex2_used |= (value); \
299 ins->rex_used |= REX_OPCODE; \
303 ins->rex_used |= REX_OPCODE; \
307 #define EVEX_b_used 1
308 #define EVEX_len_used 2
311 /* {rex2} is not printed when the REX2_SPECIAL is set. */
312 #define REX2_SPECIAL 16
314 /* Flags stored in PREFIXES. */
315 #define PREFIX_REPZ 1
316 #define PREFIX_REPNZ 2
319 #define PREFIX_DS 0x10
320 #define PREFIX_ES 0x20
321 #define PREFIX_FS 0x40
322 #define PREFIX_GS 0x80
323 #define PREFIX_LOCK 0x100
324 #define PREFIX_DATA 0x200
325 #define PREFIX_ADDR 0x400
326 #define PREFIX_FWAIT 0x800
327 #define PREFIX_REX2 0x1000
328 #define PREFIX_NP_OR_DATA 0x2000
329 #define NO_PREFIX 0x4000
331 /* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
332 to ADDR (exclusive) are valid. Returns true for success, false
335 fetch_code (struct disassemble_info
*info
, const uint8_t *until
)
338 struct dis_private
*priv
= info
->private_data
;
339 bfd_vma start
= priv
->insn_start
+ priv
->fetched
;
340 uint8_t *fetch_end
= priv
->the_buffer
+ priv
->fetched
;
341 ptrdiff_t needed
= until
- fetch_end
;
346 if (priv
->fetched
+ (size_t) needed
<= ARRAY_SIZE (priv
->the_buffer
))
347 status
= (*info
->read_memory_func
) (start
, fetch_end
, needed
, info
);
350 /* If we did manage to read at least one byte, then
351 print_insn_i386 will do something sensible. Otherwise, print
352 an error. We do that here because this is where we know
355 (*info
->memory_error_func
) (status
, start
, info
);
359 priv
->fetched
+= needed
;
364 fetch_modrm (instr_info
*ins
)
366 if (!fetch_code (ins
->info
, ins
->codep
+ 1))
369 ins
->modrm
.mod
= (*ins
->codep
>> 6) & 3;
370 ins
->modrm
.reg
= (*ins
->codep
>> 3) & 7;
371 ins
->modrm
.rm
= *ins
->codep
& 7;
377 fetch_error (const instr_info
*ins
)
379 /* Getting here means we tried for data but didn't get it. That
380 means we have an incomplete instruction of some sort. Just
381 print the first byte as a prefix or a .byte pseudo-op. */
382 const struct dis_private
*priv
= ins
->info
->private_data
;
383 const char *name
= NULL
;
385 if (ins
->codep
<= priv
->the_buffer
)
388 if (ins
->prefixes
|| ins
->fwait_prefix
>= 0 || (ins
->rex
& REX_OPCODE
))
389 name
= prefix_name (ins
->address_mode
, priv
->the_buffer
[0],
390 priv
->orig_sizeflag
);
392 i386_dis_printf (ins
->info
, dis_style_mnemonic
, "%s", name
);
395 /* Just print the first byte as a .byte instruction. */
396 i386_dis_printf (ins
->info
, dis_style_assembler_directive
, ".byte ");
397 i386_dis_printf (ins
->info
, dis_style_immediate
, "%#x",
398 (unsigned int) priv
->the_buffer
[0]);
404 /* Possible values for prefix requirement. */
405 #define PREFIX_IGNORED_SHIFT 16
406 #define PREFIX_IGNORED_REPZ (PREFIX_REPZ << PREFIX_IGNORED_SHIFT)
407 #define PREFIX_IGNORED_REPNZ (PREFIX_REPNZ << PREFIX_IGNORED_SHIFT)
408 #define PREFIX_IGNORED_DATA (PREFIX_DATA << PREFIX_IGNORED_SHIFT)
409 #define PREFIX_IGNORED_ADDR (PREFIX_ADDR << PREFIX_IGNORED_SHIFT)
410 #define PREFIX_IGNORED_LOCK (PREFIX_LOCK << PREFIX_IGNORED_SHIFT)
411 #define PREFIX_REX2_ILLEGAL (PREFIX_REX2 << PREFIX_IGNORED_SHIFT)
413 /* Opcode prefixes. */
414 #define PREFIX_OPCODE (PREFIX_REPZ \
418 /* Prefixes ignored. */
419 #define PREFIX_IGNORED (PREFIX_IGNORED_REPZ \
420 | PREFIX_IGNORED_REPNZ \
421 | PREFIX_IGNORED_DATA)
423 #define XX { NULL, 0 }
424 #define Bad_Opcode NULL, { { NULL, 0 } }, 0
426 #define Eb { OP_E, b_mode }
427 #define Ebnd { OP_E, bnd_mode }
428 #define EbS { OP_E, b_swap_mode }
429 #define EbndS { OP_E, bnd_swap_mode }
430 #define Ev { OP_E, v_mode }
431 #define Eva { OP_E, va_mode }
432 #define Ev_bnd { OP_E, v_bnd_mode }
433 #define EvS { OP_E, v_swap_mode }
434 #define Ed { OP_E, d_mode }
435 #define Edq { OP_E, dq_mode }
436 #define Edb { OP_E, db_mode }
437 #define Edw { OP_E, dw_mode }
438 #define Eq { OP_E, q_mode }
439 #define indirEv { OP_indirE, indir_v_mode }
440 #define indirEp { OP_indirE, f_mode }
441 #define stackEv { OP_E, stack_v_mode }
442 #define Em { OP_E, m_mode }
443 #define Ew { OP_E, w_mode }
444 #define M { OP_M, 0 } /* lea, lgdt, etc. */
445 #define Ma { OP_M, a_mode }
446 #define Mb { OP_M, b_mode }
447 #define Md { OP_M, d_mode }
448 #define Mdq { OP_M, dq_mode }
449 #define Mo { OP_M, o_mode }
450 #define Mp { OP_M, f_mode } /* 32 or 48 bit memory operand for LDS, LES etc */
451 #define Mq { OP_M, q_mode }
452 #define Mv { OP_M, v_mode }
453 #define Mv_bnd { OP_M, v_bndmk_mode }
454 #define Mw { OP_M, w_mode }
455 #define Mx { OP_M, x_mode }
456 #define Mxmm { OP_M, xmm_mode }
457 #define Mymm { OP_M, ymm_mode }
458 #define Gb { OP_G, b_mode }
459 #define Gbnd { OP_G, bnd_mode }
460 #define Gv { OP_G, v_mode }
461 #define Gd { OP_G, d_mode }
462 #define Gdq { OP_G, dq_mode }
463 #define Gq { OP_G, q_mode }
464 #define Gm { OP_G, m_mode }
465 #define Gva { OP_G, va_mode }
466 #define Gw { OP_G, w_mode }
467 #define Ib { OP_I, b_mode }
468 #define sIb { OP_sI, b_mode } /* sign extened byte */
469 #define sIbT { OP_sI, b_T_mode } /* sign extened byte like 'T' */
470 #define Iv { OP_I, v_mode }
471 #define sIv { OP_sI, v_mode }
472 #define Iv64 { OP_I64, v_mode }
473 #define Id { OP_I, d_mode }
474 #define Iw { OP_I, w_mode }
475 #define I1 { OP_I, const_1_mode }
476 #define Jb { OP_J, b_mode }
477 #define Jv { OP_J, v_mode }
478 #define Jdqw { OP_J, dqw_mode }
479 #define Cm { OP_C, m_mode }
480 #define Dm { OP_D, m_mode }
481 #define Td { OP_T, d_mode }
482 #define Skip_MODRM { OP_Skip_MODRM, 0 }
484 #define RMeAX { OP_REG, eAX_reg }
485 #define RMeBX { OP_REG, eBX_reg }
486 #define RMeCX { OP_REG, eCX_reg }
487 #define RMeDX { OP_REG, eDX_reg }
488 #define RMeSP { OP_REG, eSP_reg }
489 #define RMeBP { OP_REG, eBP_reg }
490 #define RMeSI { OP_REG, eSI_reg }
491 #define RMeDI { OP_REG, eDI_reg }
492 #define RMrAX { OP_REG, rAX_reg }
493 #define RMrBX { OP_REG, rBX_reg }
494 #define RMrCX { OP_REG, rCX_reg }
495 #define RMrDX { OP_REG, rDX_reg }
496 #define RMrSP { OP_REG, rSP_reg }
497 #define RMrBP { OP_REG, rBP_reg }
498 #define RMrSI { OP_REG, rSI_reg }
499 #define RMrDI { OP_REG, rDI_reg }
500 #define RMAL { OP_REG, al_reg }
501 #define RMCL { OP_REG, cl_reg }
502 #define RMDL { OP_REG, dl_reg }
503 #define RMBL { OP_REG, bl_reg }
504 #define RMAH { OP_REG, ah_reg }
505 #define RMCH { OP_REG, ch_reg }
506 #define RMDH { OP_REG, dh_reg }
507 #define RMBH { OP_REG, bh_reg }
508 #define RMAX { OP_REG, ax_reg }
509 #define RMDX { OP_REG, dx_reg }
511 #define eAX { OP_IMREG, eAX_reg }
512 #define AL { OP_IMREG, al_reg }
513 #define CL { OP_IMREG, cl_reg }
514 #define zAX { OP_IMREG, z_mode_ax_reg }
515 #define indirDX { OP_IMREG, indir_dx_reg }
517 #define Sw { OP_SEG, w_mode }
518 #define Sv { OP_SEG, v_mode }
519 #define Ap { OP_DIR, 0 }
520 #define Ob { OP_OFF64, b_mode }
521 #define Ov { OP_OFF64, v_mode }
522 #define Xb { OP_DSreg, eSI_reg }
523 #define Xv { OP_DSreg, eSI_reg }
524 #define Xz { OP_DSreg, eSI_reg }
525 #define Yb { OP_ESreg, eDI_reg }
526 #define Yv { OP_ESreg, eDI_reg }
527 #define DSBX { OP_DSreg, eBX_reg }
529 #define es { OP_REG, es_reg }
530 #define ss { OP_REG, ss_reg }
531 #define cs { OP_REG, cs_reg }
532 #define ds { OP_REG, ds_reg }
533 #define fs { OP_REG, fs_reg }
534 #define gs { OP_REG, gs_reg }
536 #define MX { OP_MMX, 0 }
537 #define XM { OP_XMM, 0 }
538 #define XMScalar { OP_XMM, scalar_mode }
539 #define XMGatherD { OP_XMM, vex_vsib_d_w_dq_mode }
540 #define XMGatherQ { OP_XMM, vex_vsib_q_w_dq_mode }
541 #define XMM { OP_XMM, xmm_mode }
542 #define TMM { OP_XMM, tmm_mode }
543 #define XMxmmq { OP_XMM, xmmq_mode }
544 #define EM { OP_EM, v_mode }
545 #define EMS { OP_EM, v_swap_mode }
546 #define EMd { OP_EM, d_mode }
547 #define EMx { OP_EM, x_mode }
548 #define EXbwUnit { OP_EX, bw_unit_mode }
549 #define EXb { OP_EX, b_mode }
550 #define EXw { OP_EX, w_mode }
551 #define EXd { OP_EX, d_mode }
552 #define EXdS { OP_EX, d_swap_mode }
553 #define EXwS { OP_EX, w_swap_mode }
554 #define EXq { OP_EX, q_mode }
555 #define EXqS { OP_EX, q_swap_mode }
556 #define EXdq { OP_EX, dq_mode }
557 #define EXx { OP_EX, x_mode }
558 #define EXxh { OP_EX, xh_mode }
559 #define EXxS { OP_EX, x_swap_mode }
560 #define EXxmm { OP_EX, xmm_mode }
561 #define EXymm { OP_EX, ymm_mode }
562 #define EXxmmq { OP_EX, xmmq_mode }
563 #define EXxmmqh { OP_EX, evex_half_bcst_xmmqh_mode }
564 #define EXEvexHalfBcstXmmq { OP_EX, evex_half_bcst_xmmq_mode }
565 #define EXxmmdw { OP_EX, xmmdw_mode }
566 #define EXxmmqd { OP_EX, xmmqd_mode }
567 #define EXxmmqdh { OP_EX, evex_half_bcst_xmmqdh_mode }
568 #define EXymmq { OP_EX, ymmq_mode }
569 #define EXEvexXGscat { OP_EX, evex_x_gscat_mode }
570 #define EXEvexXNoBcst { OP_EX, evex_x_nobcst_mode }
571 #define Rd { OP_R, d_mode }
572 #define Rdq { OP_R, dq_mode }
573 #define Rq { OP_R, q_mode }
574 #define Nq { OP_R, q_mm_mode }
575 #define Ux { OP_R, x_mode }
576 #define Uxmm { OP_R, xmm_mode }
577 #define Rxmmq { OP_R, xmmq_mode }
578 #define Rymm { OP_R, ymm_mode }
579 #define Rtmm { OP_R, tmm_mode }
580 #define EMCq { OP_EMC, q_mode }
581 #define MXC { OP_MXC, 0 }
582 #define OPSUF { OP_3DNowSuffix, 0 }
583 #define SEP { SEP_Fixup, 0 }
584 #define CMP { CMP_Fixup, 0 }
585 #define XMM0 { XMM_Fixup, 0 }
586 #define FXSAVE { FXSAVE_Fixup, 0 }
588 #define Vex { OP_VEX, x_mode }
589 #define VexW { OP_VexW, x_mode }
590 #define VexScalar { OP_VEX, scalar_mode }
591 #define VexScalarR { OP_VexR, scalar_mode }
592 #define VexGatherD { OP_VEX, vex_vsib_d_w_dq_mode }
593 #define VexGatherQ { OP_VEX, vex_vsib_q_w_dq_mode }
594 #define VexGdq { OP_VEX, dq_mode }
595 #define VexGb { OP_VEX, b_mode }
596 #define VexGv { OP_VEX, v_mode }
597 #define VexTmm { OP_VEX, tmm_mode }
598 #define XMVexI4 { OP_REG_VexI4, x_mode }
599 #define XMVexScalarI4 { OP_REG_VexI4, scalar_mode }
600 #define VexI4 { OP_VexI4, 0 }
601 #define PCLMUL { PCLMUL_Fixup, 0 }
602 #define VPCMP { VPCMP_Fixup, 0 }
603 #define VPCOM { VPCOM_Fixup, 0 }
605 #define EXxEVexR { OP_Rounding, evex_rounding_mode }
606 #define EXxEVexR64 { OP_Rounding, evex_rounding_64_mode }
607 #define EXxEVexS { OP_Rounding, evex_sae_mode }
609 #define MaskG { OP_G, mask_mode }
610 #define MaskE { OP_E, mask_mode }
611 #define MaskR { OP_R, mask_mode }
612 #define MaskBDE { OP_E, mask_bd_mode }
613 #define MaskVex { OP_VEX, mask_mode }
615 #define MVexVSIBDWpX { OP_M, vex_vsib_d_w_dq_mode }
616 #define MVexVSIBQWpX { OP_M, vex_vsib_q_w_dq_mode }
618 #define MVexSIBMEM { OP_M, vex_sibmem_mode }
620 /* Used handle "rep" prefix for string instructions. */
621 #define Xbr { REP_Fixup, eSI_reg }
622 #define Xvr { REP_Fixup, eSI_reg }
623 #define Ybr { REP_Fixup, eDI_reg }
624 #define Yvr { REP_Fixup, eDI_reg }
625 #define Yzr { REP_Fixup, eDI_reg }
626 #define indirDXr { REP_Fixup, indir_dx_reg }
627 #define ALr { REP_Fixup, al_reg }
628 #define eAXr { REP_Fixup, eAX_reg }
630 /* Used handle HLE prefix for lockable instructions. */
631 #define Ebh1 { HLE_Fixup1, b_mode }
632 #define Evh1 { HLE_Fixup1, v_mode }
633 #define Ebh2 { HLE_Fixup2, b_mode }
634 #define Evh2 { HLE_Fixup2, v_mode }
635 #define Ebh3 { HLE_Fixup3, b_mode }
636 #define Evh3 { HLE_Fixup3, v_mode }
638 #define BND { BND_Fixup, 0 }
639 #define NOTRACK { NOTRACK_Fixup, 0 }
641 #define cond_jump_flag { NULL, cond_jump_mode }
642 #define loop_jcxz_flag { NULL, loop_jcxz_mode }
644 /* bits in sizeflag */
645 #define SUFFIX_ALWAYS 4
653 /* byte operand with operand swapped */
655 /* byte operand, sign extend like 'T' suffix */
657 /* operand size depends on prefixes */
659 /* operand size depends on prefixes with operand swapped */
661 /* operand size depends on address prefix */
665 /* double word operand */
667 /* word operand with operand swapped */
669 /* double word operand with operand swapped */
671 /* quad word operand */
673 /* 8-byte MM operand */
675 /* quad word operand with operand swapped */
677 /* ten-byte operand */
679 /* 16-byte XMM, 32-byte YMM or 64-byte ZMM operand. In EVEX with
680 broadcast enabled. */
682 /* Similar to x_mode, but with different EVEX mem shifts. */
684 /* Similar to x_mode, but with yet different EVEX mem shifts. */
686 /* Similar to x_mode, but with disabled broadcast. */
688 /* Similar to x_mode, but with operands swapped and disabled broadcast
691 /* 16-byte XMM, 32-byte YMM or 64-byte ZMM operand. In EVEX with
692 broadcast of 16bit enabled. */
694 /* 16-byte XMM operand */
696 /* XMM, XMM or YMM register operand, or quad word, xmmword or ymmword
697 memory operand (depending on vector length). Broadcast isn't
700 /* Same as xmmq_mode, but broadcast is allowed. */
701 evex_half_bcst_xmmq_mode
,
702 /* XMM, XMM or YMM register operand, or quad word, xmmword or ymmword
703 memory operand (depending on vector length). 16bit broadcast. */
704 evex_half_bcst_xmmqh_mode
,
705 /* 16-byte XMM, word, double word or quad word operand. */
707 /* 16-byte XMM, double word, quad word operand or xmm word operand. */
709 /* 16-byte XMM, double word, quad word operand or xmm word operand.
711 evex_half_bcst_xmmqdh_mode
,
712 /* 32-byte YMM operand */
714 /* quad word, ymmword or zmmword memory operand. */
718 /* d_mode in 32bit, q_mode in 64bit mode. */
720 /* pair of v_mode operands */
726 /* like v_bnd_mode in 32bit, no RIP-rel in 64bit mode. */
728 /* operand size depends on REX.W / VEX.W. */
730 /* Displacements like v_mode without considering Intel64 ISA. */
734 /* bounds operand with operand swapped */
736 /* 4- or 6-byte pointer operand */
739 /* v_mode for indirect branch opcodes. */
741 /* v_mode for stack-related opcodes. */
743 /* non-quad operand size depends on prefixes */
745 /* 16-byte operand */
747 /* registers like d_mode, memory like b_mode. */
749 /* registers like d_mode, memory like w_mode. */
752 /* Operand size depends on the VEX.W bit, with VSIB dword indices. */
753 vex_vsib_d_w_dq_mode
,
754 /* Operand size depends on the VEX.W bit, with VSIB qword indices. */
755 vex_vsib_q_w_dq_mode
,
756 /* mandatory non-vector SIB. */
759 /* scalar, ignore vector length. */
762 /* Static rounding. */
764 /* Static rounding, 64-bit mode only. */
765 evex_rounding_64_mode
,
766 /* Supress all exceptions. */
769 /* Mask register operand. */
771 /* Mask register operand. */
829 USE_X86_64_EVEX_FROM_VEX_TABLE
,
830 USE_X86_64_EVEX_PFX_TABLE
,
831 USE_X86_64_EVEX_W_TABLE
,
832 USE_X86_64_EVEX_MEM_W_TABLE
,
843 #define FLOAT NULL, { { NULL, FLOATCODE } }, 0
845 #define DIS386(T, I) NULL, { { NULL, (T)}, { NULL, (I) } }, 0
846 #define REG_TABLE(I) DIS386 (USE_REG_TABLE, (I))
847 #define MOD_TABLE(I) DIS386 (USE_MOD_TABLE, (I))
848 #define RM_TABLE(I) DIS386 (USE_RM_TABLE, (I))
849 #define PREFIX_TABLE(I) DIS386 (USE_PREFIX_TABLE, (I))
850 #define X86_64_TABLE(I) DIS386 (USE_X86_64_TABLE, (I))
851 #define X86_64_EVEX_FROM_VEX_TABLE(I) \
852 DIS386 (USE_X86_64_EVEX_FROM_VEX_TABLE, (I))
853 #define X86_64_EVEX_PFX_TABLE(I) DIS386 (USE_X86_64_EVEX_PFX_TABLE, (I))
854 #define X86_64_EVEX_W_TABLE(I) DIS386 (USE_X86_64_EVEX_W_TABLE, (I))
855 #define X86_64_EVEX_MEM_W_TABLE(I) DIS386 (USE_X86_64_EVEX_MEM_W_TABLE, (I))
856 #define THREE_BYTE_TABLE(I) DIS386 (USE_3BYTE_TABLE, (I))
857 #define XOP_8F_TABLE() DIS386 (USE_XOP_8F_TABLE, 0)
858 #define VEX_C4_TABLE() DIS386 (USE_VEX_C4_TABLE, 0)
859 #define VEX_C5_TABLE() DIS386 (USE_VEX_C5_TABLE, 0)
860 #define VEX_LEN_TABLE(I) DIS386 (USE_VEX_LEN_TABLE, (I))
861 #define VEX_W_TABLE(I) DIS386 (USE_VEX_W_TABLE, (I))
862 #define EVEX_TABLE() DIS386 (USE_EVEX_TABLE, 0)
863 #define EVEX_LEN_TABLE(I) DIS386 (USE_EVEX_LEN_TABLE, (I))
903 REG_VEX_0F3849_X86_64_L_0_W_0_M_1_P_0
,
904 REG_VEX_0F38F3_L_0_P_0
,
905 REG_VEX_MAP7_F8_L_0_W_0
,
964 MOD_VEX_0F3849_X86_64_L_0_W_0
,
968 MOD_EVEX_MAP4_F8_P_1
,
969 MOD_EVEX_MAP4_F8_P_3
,
982 RM_0F1E_P_1_MOD_3_REG_7
,
983 RM_0FAE_REG_6_MOD_3_P_0
,
987 RM_VEX_0F3849_X86_64_L_0_W_0_M_1_P_0_R_0
,
988 RM_VEX_0F3849_X86_64_L_0_W_0_M_1_P_3
,
994 PREFIX_0F00_REG_6_X86_64
,
995 PREFIX_0F01_REG_0_MOD_3_RM_6
,
996 PREFIX_0F01_REG_0_MOD_3_RM_7
,
997 PREFIX_0F01_REG_1_RM_2
,
998 PREFIX_0F01_REG_1_RM_4
,
999 PREFIX_0F01_REG_1_RM_5
,
1000 PREFIX_0F01_REG_1_RM_6
,
1001 PREFIX_0F01_REG_1_RM_7
,
1002 PREFIX_0F01_REG_3_RM_1
,
1003 PREFIX_0F01_REG_5_MOD_0
,
1004 PREFIX_0F01_REG_5_MOD_3_RM_0
,
1005 PREFIX_0F01_REG_5_MOD_3_RM_1
,
1006 PREFIX_0F01_REG_5_MOD_3_RM_2
,
1007 PREFIX_0F01_REG_5_MOD_3_RM_4
,
1008 PREFIX_0F01_REG_5_MOD_3_RM_5
,
1009 PREFIX_0F01_REG_5_MOD_3_RM_6
,
1010 PREFIX_0F01_REG_5_MOD_3_RM_7
,
1011 PREFIX_0F01_REG_7_MOD_3_RM_2
,
1012 PREFIX_0F01_REG_7_MOD_3_RM_5
,
1013 PREFIX_0F01_REG_7_MOD_3_RM_6
,
1014 PREFIX_0F01_REG_7_MOD_3_RM_7
,
1020 PREFIX_0F18_REG_6_MOD_0_X86_64
,
1021 PREFIX_0F18_REG_7_MOD_0_X86_64
,
1057 PREFIX_0FAE_REG_0_MOD_3
,
1058 PREFIX_0FAE_REG_1_MOD_3
,
1059 PREFIX_0FAE_REG_2_MOD_3
,
1060 PREFIX_0FAE_REG_3_MOD_3
,
1061 PREFIX_0FAE_REG_4_MOD_0
,
1062 PREFIX_0FAE_REG_4_MOD_3
,
1063 PREFIX_0FAE_REG_5_MOD_3
,
1064 PREFIX_0FAE_REG_6_MOD_0
,
1065 PREFIX_0FAE_REG_6_MOD_3
,
1066 PREFIX_0FAE_REG_7_MOD_0
,
1071 PREFIX_0FC7_REG_6_MOD_0
,
1072 PREFIX_0FC7_REG_6_MOD_3
,
1073 PREFIX_0FC7_REG_7_MOD_3
,
1089 PREFIX_0F38F8_M_1_X86_64
,
1099 PREFIX_VEX_0F41_L_1_W_0
,
1100 PREFIX_VEX_0F41_L_1_W_1
,
1101 PREFIX_VEX_0F42_L_1_W_0
,
1102 PREFIX_VEX_0F42_L_1_W_1
,
1103 PREFIX_VEX_0F44_L_0_W_0
,
1104 PREFIX_VEX_0F44_L_0_W_1
,
1105 PREFIX_VEX_0F45_L_1_W_0
,
1106 PREFIX_VEX_0F45_L_1_W_1
,
1107 PREFIX_VEX_0F46_L_1_W_0
,
1108 PREFIX_VEX_0F46_L_1_W_1
,
1109 PREFIX_VEX_0F47_L_1_W_0
,
1110 PREFIX_VEX_0F47_L_1_W_1
,
1111 PREFIX_VEX_0F4A_L_1_W_0
,
1112 PREFIX_VEX_0F4A_L_1_W_1
,
1113 PREFIX_VEX_0F4B_L_1_W_0
,
1114 PREFIX_VEX_0F4B_L_1_W_1
,
1119 PREFIX_VEX_0F90_L_0_W_0
,
1120 PREFIX_VEX_0F90_L_0_W_1
,
1121 PREFIX_VEX_0F91_L_0_W_0
,
1122 PREFIX_VEX_0F91_L_0_W_1
,
1123 PREFIX_VEX_0F92_L_0_W_0
,
1124 PREFIX_VEX_0F92_L_0_W_1
,
1125 PREFIX_VEX_0F93_L_0_W_0
,
1126 PREFIX_VEX_0F93_L_0_W_1
,
1127 PREFIX_VEX_0F98_L_0_W_0
,
1128 PREFIX_VEX_0F98_L_0_W_1
,
1129 PREFIX_VEX_0F99_L_0_W_0
,
1130 PREFIX_VEX_0F99_L_0_W_1
,
1131 PREFIX_VEX_0F3849_X86_64_L_0_W_0_M_0
,
1132 PREFIX_VEX_0F3849_X86_64_L_0_W_0_M_1
,
1133 PREFIX_VEX_0F384B_X86_64_L_0_W_0
,
1134 PREFIX_VEX_0F3850_W_0
,
1135 PREFIX_VEX_0F3851_W_0
,
1136 PREFIX_VEX_0F385C_X86_64_L_0_W_0
,
1137 PREFIX_VEX_0F385E_X86_64_L_0_W_0
,
1138 PREFIX_VEX_0F386C_X86_64_L_0_W_0
,
1140 PREFIX_VEX_0F38B0_W_0
,
1141 PREFIX_VEX_0F38B1_W_0
,
1142 PREFIX_VEX_0F38D2_W_0
,
1143 PREFIX_VEX_0F38D3_W_0
,
1147 PREFIX_VEX_0F38DA_W_0
,
1148 PREFIX_VEX_0F38F2_L_0
,
1149 PREFIX_VEX_0F38F3_L_0
,
1150 PREFIX_VEX_0F38F5_L_0
,
1151 PREFIX_VEX_0F38F6_L_0
,
1152 PREFIX_VEX_0F38F7_L_0
,
1153 PREFIX_VEX_0F3AF0_L_0
,
1154 PREFIX_VEX_MAP7_F8_L_0_W_0_R_0_X86_64
,
1207 PREFIX_EVEX_0F3A42_W_0
,
1214 PREFIX_EVEX_MAP4_4x
,
1215 PREFIX_EVEX_MAP4_F0
,
1216 PREFIX_EVEX_MAP4_F1
,
1217 PREFIX_EVEX_MAP4_F2
,
1218 PREFIX_EVEX_MAP4_F8
,
1220 PREFIX_EVEX_MAP5_10
,
1221 PREFIX_EVEX_MAP5_11
,
1222 PREFIX_EVEX_MAP5_18
,
1223 PREFIX_EVEX_MAP5_1B
,
1224 PREFIX_EVEX_MAP5_1D
,
1225 PREFIX_EVEX_MAP5_1E
,
1226 PREFIX_EVEX_MAP5_2A
,
1227 PREFIX_EVEX_MAP5_2C
,
1228 PREFIX_EVEX_MAP5_2D
,
1229 PREFIX_EVEX_MAP5_2E
,
1230 PREFIX_EVEX_MAP5_2F
,
1231 PREFIX_EVEX_MAP5_51
,
1232 PREFIX_EVEX_MAP5_58
,
1233 PREFIX_EVEX_MAP5_59
,
1234 PREFIX_EVEX_MAP5_5A
,
1235 PREFIX_EVEX_MAP5_5B
,
1236 PREFIX_EVEX_MAP5_5C
,
1237 PREFIX_EVEX_MAP5_5D
,
1238 PREFIX_EVEX_MAP5_5E
,
1239 PREFIX_EVEX_MAP5_5F
,
1240 PREFIX_EVEX_MAP5_74
,
1241 PREFIX_EVEX_MAP5_78
,
1242 PREFIX_EVEX_MAP5_79
,
1243 PREFIX_EVEX_MAP5_7A
,
1244 PREFIX_EVEX_MAP5_7B
,
1245 PREFIX_EVEX_MAP5_7C
,
1246 PREFIX_EVEX_MAP5_7D
,
1248 PREFIX_EVEX_MAP6_13
,
1249 PREFIX_EVEX_MAP6_56
,
1250 PREFIX_EVEX_MAP6_57
,
1251 PREFIX_EVEX_MAP6_D6
,
1252 PREFIX_EVEX_MAP6_D7
,
1288 X86_64_0F01_REG_0_MOD_3_RM_6_P_1
,
1289 X86_64_0F01_REG_0_MOD_3_RM_6_P_3
,
1290 X86_64_0F01_REG_0_MOD_3_RM_7_P_0
,
1292 X86_64_0F01_REG_1_RM_2_PREFIX_1
,
1293 X86_64_0F01_REG_1_RM_2_PREFIX_3
,
1294 X86_64_0F01_REG_1_RM_5_PREFIX_2
,
1295 X86_64_0F01_REG_1_RM_6_PREFIX_2
,
1296 X86_64_0F01_REG_1_RM_7_PREFIX_2
,
1299 X86_64_0F01_REG_5_MOD_3_RM_4_PREFIX_1
,
1300 X86_64_0F01_REG_5_MOD_3_RM_5_PREFIX_1
,
1301 X86_64_0F01_REG_5_MOD_3_RM_6_PREFIX_1
,
1302 X86_64_0F01_REG_5_MOD_3_RM_7_PREFIX_1
,
1303 X86_64_0F01_REG_7_MOD_3_RM_5_PREFIX_1
,
1304 X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_1
,
1305 X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3
,
1306 X86_64_0F01_REG_7_MOD_3_RM_7_PREFIX_1
,
1307 X86_64_0F18_REG_6_MOD_0
,
1308 X86_64_0F18_REG_7_MOD_0
,
1312 X86_64_0FC7_REG_6_MOD_3_PREFIX_1
,
1321 X86_64_VEX_MAP7_F8_L_0_W_0_R_0
,
1326 THREE_BYTE_0F38
= 0,
1358 VEX_LEN_0F12_P_0
= 0,
1391 VEX_LEN_0F3849_X86_64
,
1392 VEX_LEN_0F384B_X86_64
,
1394 VEX_LEN_0F385C_X86_64
,
1395 VEX_LEN_0F385E_X86_64
,
1396 VEX_LEN_0F386C_X86_64
,
1397 VEX_LEN_0F38CB_P_3_W_0
,
1398 VEX_LEN_0F38CC_P_3_W_0
,
1399 VEX_LEN_0F38CD_P_3_W_0
,
1400 VEX_LEN_0F38DA_W_0_P_0
,
1401 VEX_LEN_0F38DA_W_0_P_2
,
1464 VEX_LEN_XOP_09_82_W_0
,
1465 VEX_LEN_XOP_09_83_W_0
,
1498 EVEX_LEN_0F3816
= 0,
1552 VEX_W_0F3849_X86_64_L_0
,
1553 VEX_W_0F384B_X86_64_L_0
,
1561 VEX_W_0F385C_X86_64_L_0
,
1562 VEX_W_0F385E_X86_64_L_0
,
1563 VEX_W_0F386C_X86_64_L_0
,
1598 VEX_W_XOP_08_85_L_0
,
1599 VEX_W_XOP_08_86_L_0
,
1600 VEX_W_XOP_08_87_L_0
,
1601 VEX_W_XOP_08_8E_L_0
,
1602 VEX_W_XOP_08_8F_L_0
,
1603 VEX_W_XOP_08_95_L_0
,
1604 VEX_W_XOP_08_96_L_0
,
1605 VEX_W_XOP_08_97_L_0
,
1606 VEX_W_XOP_08_9E_L_0
,
1607 VEX_W_XOP_08_9F_L_0
,
1608 VEX_W_XOP_08_A6_L_0
,
1609 VEX_W_XOP_08_B6_L_0
,
1610 VEX_W_XOP_08_C0_L_0
,
1611 VEX_W_XOP_08_C1_L_0
,
1612 VEX_W_XOP_08_C2_L_0
,
1613 VEX_W_XOP_08_C3_L_0
,
1614 VEX_W_XOP_08_CC_L_0
,
1615 VEX_W_XOP_08_CD_L_0
,
1616 VEX_W_XOP_08_CE_L_0
,
1617 VEX_W_XOP_08_CF_L_0
,
1618 VEX_W_XOP_08_EC_L_0
,
1619 VEX_W_XOP_08_ED_L_0
,
1620 VEX_W_XOP_08_EE_L_0
,
1621 VEX_W_XOP_08_EF_L_0
,
1627 VEX_W_XOP_09_C1_L_0
,
1628 VEX_W_XOP_09_C2_L_0
,
1629 VEX_W_XOP_09_C3_L_0
,
1630 VEX_W_XOP_09_C6_L_0
,
1631 VEX_W_XOP_09_C7_L_0
,
1632 VEX_W_XOP_09_CB_L_0
,
1633 VEX_W_XOP_09_D1_L_0
,
1634 VEX_W_XOP_09_D2_L_0
,
1635 VEX_W_XOP_09_D3_L_0
,
1636 VEX_W_XOP_09_D6_L_0
,
1637 VEX_W_XOP_09_D7_L_0
,
1638 VEX_W_XOP_09_DB_L_0
,
1639 VEX_W_XOP_09_E1_L_0
,
1640 VEX_W_XOP_09_E2_L_0
,
1641 VEX_W_XOP_09_E3_L_0
,
1744 EVEX_W_MAP4_F8_P1_M_1
,
1745 EVEX_W_MAP4_F8_P3_M_1
,
1752 typedef bool (*op_rtn
) (instr_info
*ins
, int bytemode
, int sizeflag
);
1761 unsigned int prefix_requirement
;
1764 /* Upper case letters in the instruction names here are macros.
1765 'A' => print 'b' if no (suitable) register operand or suffix_always is true
1766 'B' => print 'b' if suffix_always is true
1767 'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
1769 'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
1770 suffix_always is true
1771 'E' => print 'e' if 32-bit form of jcxz
1772 'F' => print 'w' or 'l' depending on address size prefix (loop insns)
1773 'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
1774 'H' => print ",pt" or ",pn" branch hint
1777 'K' => print 'd' or 'q' if rex prefix is present.
1778 'L' => print 'l' or 'q' if suffix_always is true
1779 'M' => print 'r' if intel_mnemonic is false.
1780 'N' => print 'n' if instruction has no wait "prefix"
1781 'O' => print 'd' or 'o' (or 'q' in Intel mode)
1782 'P' => behave as 'T' except with register operand outside of suffix_always
1784 'Q' => print 'w', 'l' or 'q' if no (suitable) register operand or
1785 suffix_always is true
1786 'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
1787 'S' => print 'w', 'l' or 'q' if suffix_always is true
1788 'T' => print 'w', 'l'/'d', or 'q' if instruction has an operand size
1789 prefix or if suffix_always is true.
1791 'V' => print 'v' for VEX/EVEX and nothing for legacy encodings.
1792 'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
1793 'X' => print 's', 'd' depending on data16 prefix (for XMM)
1794 'Y' => no output, mark EVEX.aaa != 0 as bad.
1795 'Z' => print 'q' in 64bit mode and 'l' otherwise, if suffix_always is true.
1796 '!' => change condition from true to false or from false to true.
1797 '%' => add 1 upper case letter to the macro.
1798 '^' => print 'w', 'l', or 'q' (Intel64 ISA only) depending on operand size
1799 prefix or suffix_always is true (lcall/ljmp).
1800 '@' => in 64bit mode for Intel64 ISA or if instruction
1801 has no operand sizing prefix, print 'q' if suffix_always is true or
1802 nothing otherwise; behave as 'P' in all other cases
1804 2 upper case letter macros:
1805 "CC" => print condition code
1806 "XY" => print 'x' or 'y' if suffix_always is true or no register
1807 operands and no broadcast.
1808 "XZ" => print 'x', 'y', or 'z' if suffix_always is true or no
1809 register operands and no broadcast.
1810 "XW" => print 's', 'd' depending on the VEX.W bit (for FMA)
1811 "XD" => print 'd' if !EVEX or EVEX.W=1, EVEX.W=0 is not a valid encoding
1812 "XH" => print 'h' if EVEX.W=0, EVEX.W=1 is not a valid encoding (for FP16)
1813 "XS" => print 's' if !EVEX or EVEX.W=0, EVEX.W=1 is not a valid encoding
1814 "XV" => print "{vex} " pseudo prefix
1815 "XE" => print "{evex} " pseudo prefix if no EVEX-specific functionality is
1816 is used by an EVEX-encoded (AVX512VL) instruction.
1817 "NF" => print "{nf} " pseudo prefix when EVEX.NF = 1 and print "{evex} "
1818 pseudo prefix when instructions without NF, EGPR and VVVV,
1819 "NE" => don't print "{evex} " pseudo prefix for some special instructions
1821 "ZU" => print 'zu' if EVEX.ZU=1.
1822 "SC" => print suffix SCC for SCC insns
1823 "YK" keep unused, to avoid ambiguity with the combined use of Y and K.
1824 "YX" keep unused, to avoid ambiguity with the combined use of Y and X.
1825 "LQ" => print 'l' ('d' in Intel mode) or 'q' for memory operand, cond
1826 being false, or no operand at all in 64bit mode, or if suffix_always
1828 "LB" => print "abs" in 64bit mode and behave as 'B' otherwise
1829 "LS" => print "abs" in 64bit mode and behave as 'S' otherwise
1830 "LV" => print "abs" for 64bit operand and behave as 'S' otherwise
1831 "DQ" => print 'd' or 'q' depending on the VEX.W bit
1832 "DF" => print default flag value for SCC insns
1833 "BW" => print 'b' or 'w' depending on the VEX.W bit
1834 "LP" => print 'w' or 'l' ('d' in Intel mode) if instruction has
1835 an operand size prefix, or suffix_always is true. print
1836 'q' if rex prefix is present.
1838 Many of the above letters print nothing in Intel mode. See "putop"
1841 Braces '{' and '}', and vertical bars '|', indicate alternative
1842 mnemonic strings for AT&T and Intel. */
1844 static const struct dis386 dis386
[] = {
1846 { "addB", { Ebh1
, Gb
}, 0 },
1847 { "addS", { Evh1
, Gv
}, 0 },
1848 { "addB", { Gb
, EbS
}, 0 },
1849 { "addS", { Gv
, EvS
}, 0 },
1850 { "addB", { AL
, Ib
}, 0 },
1851 { "addS", { eAX
, Iv
}, 0 },
1852 { X86_64_TABLE (X86_64_06
) },
1853 { X86_64_TABLE (X86_64_07
) },
1855 { "orB", { Ebh1
, Gb
}, 0 },
1856 { "orS", { Evh1
, Gv
}, 0 },
1857 { "orB", { Gb
, EbS
}, 0 },
1858 { "orS", { Gv
, EvS
}, 0 },
1859 { "orB", { AL
, Ib
}, 0 },
1860 { "orS", { eAX
, Iv
}, 0 },
1861 { X86_64_TABLE (X86_64_0E
) },
1862 { Bad_Opcode
}, /* 0x0f extended opcode escape */
1864 { "adcB", { Ebh1
, Gb
}, 0 },
1865 { "adcS", { Evh1
, Gv
}, 0 },
1866 { "adcB", { Gb
, EbS
}, 0 },
1867 { "adcS", { Gv
, EvS
}, 0 },
1868 { "adcB", { AL
, Ib
}, 0 },
1869 { "adcS", { eAX
, Iv
}, 0 },
1870 { X86_64_TABLE (X86_64_16
) },
1871 { X86_64_TABLE (X86_64_17
) },
1873 { "sbbB", { Ebh1
, Gb
}, 0 },
1874 { "sbbS", { Evh1
, Gv
}, 0 },
1875 { "sbbB", { Gb
, EbS
}, 0 },
1876 { "sbbS", { Gv
, EvS
}, 0 },
1877 { "sbbB", { AL
, Ib
}, 0 },
1878 { "sbbS", { eAX
, Iv
}, 0 },
1879 { X86_64_TABLE (X86_64_1E
) },
1880 { X86_64_TABLE (X86_64_1F
) },
1882 { "andB", { Ebh1
, Gb
}, 0 },
1883 { "andS", { Evh1
, Gv
}, 0 },
1884 { "andB", { Gb
, EbS
}, 0 },
1885 { "andS", { Gv
, EvS
}, 0 },
1886 { "andB", { AL
, Ib
}, 0 },
1887 { "andS", { eAX
, Iv
}, 0 },
1888 { Bad_Opcode
}, /* SEG ES prefix */
1889 { X86_64_TABLE (X86_64_27
) },
1891 { "subB", { Ebh1
, Gb
}, 0 },
1892 { "subS", { Evh1
, Gv
}, 0 },
1893 { "subB", { Gb
, EbS
}, 0 },
1894 { "subS", { Gv
, EvS
}, 0 },
1895 { "subB", { AL
, Ib
}, 0 },
1896 { "subS", { eAX
, Iv
}, 0 },
1897 { Bad_Opcode
}, /* SEG CS prefix */
1898 { X86_64_TABLE (X86_64_2F
) },
1900 { "xorB", { Ebh1
, Gb
}, 0 },
1901 { "xorS", { Evh1
, Gv
}, 0 },
1902 { "xorB", { Gb
, EbS
}, 0 },
1903 { "xorS", { Gv
, EvS
}, 0 },
1904 { "xorB", { AL
, Ib
}, 0 },
1905 { "xorS", { eAX
, Iv
}, 0 },
1906 { Bad_Opcode
}, /* SEG SS prefix */
1907 { X86_64_TABLE (X86_64_37
) },
1909 { "cmpB", { Eb
, Gb
}, 0 },
1910 { "cmpS", { Ev
, Gv
}, 0 },
1911 { "cmpB", { Gb
, EbS
}, 0 },
1912 { "cmpS", { Gv
, EvS
}, 0 },
1913 { "cmpB", { AL
, Ib
}, 0 },
1914 { "cmpS", { eAX
, Iv
}, 0 },
1915 { Bad_Opcode
}, /* SEG DS prefix */
1916 { X86_64_TABLE (X86_64_3F
) },
1918 { "inc{S|}", { RMeAX
}, 0 },
1919 { "inc{S|}", { RMeCX
}, 0 },
1920 { "inc{S|}", { RMeDX
}, 0 },
1921 { "inc{S|}", { RMeBX
}, 0 },
1922 { "inc{S|}", { RMeSP
}, 0 },
1923 { "inc{S|}", { RMeBP
}, 0 },
1924 { "inc{S|}", { RMeSI
}, 0 },
1925 { "inc{S|}", { RMeDI
}, 0 },
1927 { "dec{S|}", { RMeAX
}, 0 },
1928 { "dec{S|}", { RMeCX
}, 0 },
1929 { "dec{S|}", { RMeDX
}, 0 },
1930 { "dec{S|}", { RMeBX
}, 0 },
1931 { "dec{S|}", { RMeSP
}, 0 },
1932 { "dec{S|}", { RMeBP
}, 0 },
1933 { "dec{S|}", { RMeSI
}, 0 },
1934 { "dec{S|}", { RMeDI
}, 0 },
1936 { "push!P", { RMrAX
}, 0 },
1937 { "push!P", { RMrCX
}, 0 },
1938 { "push!P", { RMrDX
}, 0 },
1939 { "push!P", { RMrBX
}, 0 },
1940 { "push!P", { RMrSP
}, 0 },
1941 { "push!P", { RMrBP
}, 0 },
1942 { "push!P", { RMrSI
}, 0 },
1943 { "push!P", { RMrDI
}, 0 },
1945 { "pop!P", { RMrAX
}, 0 },
1946 { "pop!P", { RMrCX
}, 0 },
1947 { "pop!P", { RMrDX
}, 0 },
1948 { "pop!P", { RMrBX
}, 0 },
1949 { "pop!P", { RMrSP
}, 0 },
1950 { "pop!P", { RMrBP
}, 0 },
1951 { "pop!P", { RMrSI
}, 0 },
1952 { "pop!P", { RMrDI
}, 0 },
1954 { X86_64_TABLE (X86_64_60
) },
1955 { X86_64_TABLE (X86_64_61
) },
1956 { X86_64_TABLE (X86_64_62
) },
1957 { X86_64_TABLE (X86_64_63
) },
1958 { Bad_Opcode
}, /* seg fs */
1959 { Bad_Opcode
}, /* seg gs */
1960 { Bad_Opcode
}, /* op size prefix */
1961 { Bad_Opcode
}, /* adr size prefix */
1963 { "pushP", { sIv
}, 0 },
1964 { "imulS", { Gv
, Ev
, Iv
}, 0 },
1965 { "pushP", { sIbT
}, 0 },
1966 { "imulS", { Gv
, Ev
, sIb
}, 0 },
1967 { "ins{b|}", { Ybr
, indirDX
}, 0 },
1968 { X86_64_TABLE (X86_64_6D
) },
1969 { "outs{b|}", { indirDXr
, Xb
}, 0 },
1970 { X86_64_TABLE (X86_64_6F
) },
1972 { "joH", { Jb
, BND
, cond_jump_flag
}, PREFIX_REX2_ILLEGAL
},
1973 { "jnoH", { Jb
, BND
, cond_jump_flag
}, PREFIX_REX2_ILLEGAL
},
1974 { "jbH", { Jb
, BND
, cond_jump_flag
}, PREFIX_REX2_ILLEGAL
},
1975 { "jaeH", { Jb
, BND
, cond_jump_flag
}, PREFIX_REX2_ILLEGAL
},
1976 { "jeH", { Jb
, BND
, cond_jump_flag
}, PREFIX_REX2_ILLEGAL
},
1977 { "jneH", { Jb
, BND
, cond_jump_flag
}, PREFIX_REX2_ILLEGAL
},
1978 { "jbeH", { Jb
, BND
, cond_jump_flag
}, PREFIX_REX2_ILLEGAL
},
1979 { "jaH", { Jb
, BND
, cond_jump_flag
}, PREFIX_REX2_ILLEGAL
},
1981 { "jsH", { Jb
, BND
, cond_jump_flag
}, PREFIX_REX2_ILLEGAL
},
1982 { "jnsH", { Jb
, BND
, cond_jump_flag
}, PREFIX_REX2_ILLEGAL
},
1983 { "jpH", { Jb
, BND
, cond_jump_flag
}, PREFIX_REX2_ILLEGAL
},
1984 { "jnpH", { Jb
, BND
, cond_jump_flag
}, PREFIX_REX2_ILLEGAL
},
1985 { "jlH", { Jb
, BND
, cond_jump_flag
}, PREFIX_REX2_ILLEGAL
},
1986 { "jgeH", { Jb
, BND
, cond_jump_flag
}, PREFIX_REX2_ILLEGAL
},
1987 { "jleH", { Jb
, BND
, cond_jump_flag
}, PREFIX_REX2_ILLEGAL
},
1988 { "jgH", { Jb
, BND
, cond_jump_flag
}, PREFIX_REX2_ILLEGAL
},
1990 { REG_TABLE (REG_80
) },
1991 { REG_TABLE (REG_81
) },
1992 { X86_64_TABLE (X86_64_82
) },
1993 { REG_TABLE (REG_83
) },
1994 { "testB", { Eb
, Gb
}, 0 },
1995 { "testS", { Ev
, Gv
}, 0 },
1996 { "xchgB", { Ebh2
, Gb
}, 0 },
1997 { "xchgS", { Evh2
, Gv
}, 0 },
1999 { "movB", { Ebh3
, Gb
}, 0 },
2000 { "movS", { Evh3
, Gv
}, 0 },
2001 { "movB", { Gb
, EbS
}, 0 },
2002 { "movS", { Gv
, EvS
}, 0 },
2003 { "movD", { Sv
, Sw
}, 0 },
2004 { "leaS", { Gv
, M
}, 0 },
2005 { "movD", { Sw
, Sv
}, 0 },
2006 { REG_TABLE (REG_8F
) },
2008 { PREFIX_TABLE (PREFIX_90
) },
2009 { "xchgS", { RMeCX
, eAX
}, 0 },
2010 { "xchgS", { RMeDX
, eAX
}, 0 },
2011 { "xchgS", { RMeBX
, eAX
}, 0 },
2012 { "xchgS", { RMeSP
, eAX
}, 0 },
2013 { "xchgS", { RMeBP
, eAX
}, 0 },
2014 { "xchgS", { RMeSI
, eAX
}, 0 },
2015 { "xchgS", { RMeDI
, eAX
}, 0 },
2017 { "cW{t|}R", { XX
}, 0 },
2018 { "cR{t|}O", { XX
}, 0 },
2019 { X86_64_TABLE (X86_64_9A
) },
2020 { Bad_Opcode
}, /* fwait */
2021 { "pushfP", { XX
}, 0 },
2022 { "popfP", { XX
}, 0 },
2023 { "sahf", { XX
}, 0 },
2024 { "lahf", { XX
}, 0 },
2026 { "mov%LB", { AL
, Ob
}, PREFIX_REX2_ILLEGAL
},
2027 { "mov%LS", { { JMPABS_Fixup
, eAX_reg
}, { JMPABS_Fixup
, v_mode
} }, PREFIX_REX2_ILLEGAL
},
2028 { "mov%LB", { Ob
, AL
}, PREFIX_REX2_ILLEGAL
},
2029 { "mov%LS", { Ov
, eAX
}, PREFIX_REX2_ILLEGAL
},
2030 { "movs{b|}", { Ybr
, Xb
}, PREFIX_REX2_ILLEGAL
},
2031 { "movs{R|}", { Yvr
, Xv
}, PREFIX_REX2_ILLEGAL
},
2032 { "cmps{b|}", { Xb
, Yb
}, PREFIX_REX2_ILLEGAL
},
2033 { "cmps{R|}", { Xv
, Yv
}, PREFIX_REX2_ILLEGAL
},
2035 { "testB", { AL
, Ib
}, PREFIX_REX2_ILLEGAL
},
2036 { "testS", { eAX
, Iv
}, PREFIX_REX2_ILLEGAL
},
2037 { "stosB", { Ybr
, AL
}, PREFIX_REX2_ILLEGAL
},
2038 { "stosS", { Yvr
, eAX
}, PREFIX_REX2_ILLEGAL
},
2039 { "lodsB", { ALr
, Xb
}, PREFIX_REX2_ILLEGAL
},
2040 { "lodsS", { eAXr
, Xv
}, PREFIX_REX2_ILLEGAL
},
2041 { "scasB", { AL
, Yb
}, PREFIX_REX2_ILLEGAL
},
2042 { "scasS", { eAX
, Yv
}, PREFIX_REX2_ILLEGAL
},
2044 { "movB", { RMAL
, Ib
}, 0 },
2045 { "movB", { RMCL
, Ib
}, 0 },
2046 { "movB", { RMDL
, Ib
}, 0 },
2047 { "movB", { RMBL
, Ib
}, 0 },
2048 { "movB", { RMAH
, Ib
}, 0 },
2049 { "movB", { RMCH
, Ib
}, 0 },
2050 { "movB", { RMDH
, Ib
}, 0 },
2051 { "movB", { RMBH
, Ib
}, 0 },
2053 { "mov%LV", { RMeAX
, Iv64
}, 0 },
2054 { "mov%LV", { RMeCX
, Iv64
}, 0 },
2055 { "mov%LV", { RMeDX
, Iv64
}, 0 },
2056 { "mov%LV", { RMeBX
, Iv64
}, 0 },
2057 { "mov%LV", { RMeSP
, Iv64
}, 0 },
2058 { "mov%LV", { RMeBP
, Iv64
}, 0 },
2059 { "mov%LV", { RMeSI
, Iv64
}, 0 },
2060 { "mov%LV", { RMeDI
, Iv64
}, 0 },
2062 { REG_TABLE (REG_C0
) },
2063 { REG_TABLE (REG_C1
) },
2064 { X86_64_TABLE (X86_64_C2
) },
2065 { X86_64_TABLE (X86_64_C3
) },
2066 { X86_64_TABLE (X86_64_C4
) },
2067 { X86_64_TABLE (X86_64_C5
) },
2068 { REG_TABLE (REG_C6
) },
2069 { REG_TABLE (REG_C7
) },
2071 { "enterP", { Iw
, Ib
}, 0 },
2072 { "leaveP", { XX
}, 0 },
2073 { "{l|}ret{|f}%LP", { Iw
}, 0 },
2074 { "{l|}ret{|f}%LP", { XX
}, 0 },
2075 { "int3", { XX
}, 0 },
2076 { "int", { Ib
}, 0 },
2077 { X86_64_TABLE (X86_64_CE
) },
2078 { "iret%LP", { XX
}, 0 },
2080 { REG_TABLE (REG_D0
) },
2081 { REG_TABLE (REG_D1
) },
2082 { REG_TABLE (REG_D2
) },
2083 { REG_TABLE (REG_D3
) },
2084 { X86_64_TABLE (X86_64_D4
) },
2085 { X86_64_TABLE (X86_64_D5
) },
2087 { "xlat", { DSBX
}, 0 },
2098 { "loopneFH", { Jb
, XX
, loop_jcxz_flag
}, PREFIX_REX2_ILLEGAL
},
2099 { "loopeFH", { Jb
, XX
, loop_jcxz_flag
}, PREFIX_REX2_ILLEGAL
},
2100 { "loopFH", { Jb
, XX
, loop_jcxz_flag
}, PREFIX_REX2_ILLEGAL
},
2101 { "jEcxzH", { Jb
, XX
, loop_jcxz_flag
}, PREFIX_REX2_ILLEGAL
},
2102 { "inB", { AL
, Ib
}, PREFIX_REX2_ILLEGAL
},
2103 { "inG", { zAX
, Ib
}, PREFIX_REX2_ILLEGAL
},
2104 { "outB", { Ib
, AL
}, PREFIX_REX2_ILLEGAL
},
2105 { "outG", { Ib
, zAX
}, PREFIX_REX2_ILLEGAL
},
2107 { X86_64_TABLE (X86_64_E8
) },
2108 { X86_64_TABLE (X86_64_E9
) },
2109 { X86_64_TABLE (X86_64_EA
) },
2110 { "jmp", { Jb
, BND
}, PREFIX_REX2_ILLEGAL
},
2111 { "inB", { AL
, indirDX
}, PREFIX_REX2_ILLEGAL
},
2112 { "inG", { zAX
, indirDX
}, PREFIX_REX2_ILLEGAL
},
2113 { "outB", { indirDX
, AL
}, PREFIX_REX2_ILLEGAL
},
2114 { "outG", { indirDX
, zAX
}, PREFIX_REX2_ILLEGAL
},
2116 { Bad_Opcode
}, /* lock prefix */
2117 { "int1", { XX
}, 0 },
2118 { Bad_Opcode
}, /* repne */
2119 { Bad_Opcode
}, /* repz */
2120 { "hlt", { XX
}, 0 },
2121 { "cmc", { XX
}, 0 },
2122 { REG_TABLE (REG_F6
) },
2123 { REG_TABLE (REG_F7
) },
2125 { "clc", { XX
}, 0 },
2126 { "stc", { XX
}, 0 },
2127 { "cli", { XX
}, 0 },
2128 { "sti", { XX
}, 0 },
2129 { "cld", { XX
}, 0 },
2130 { "std", { XX
}, 0 },
2131 { REG_TABLE (REG_FE
) },
2132 { REG_TABLE (REG_FF
) },
2135 static const struct dis386 dis386_twobyte
[] = {
2137 { REG_TABLE (REG_0F00
) },
2138 { REG_TABLE (REG_0F01
) },
2139 { "larS", { Gv
, Sv
}, 0 },
2140 { "lslS", { Gv
, Sv
}, 0 },
2142 { "syscall", { XX
}, 0 },
2143 { "clts", { XX
}, 0 },
2144 { "sysret%LQ", { XX
}, 0 },
2146 { "invd", { XX
}, 0 },
2147 { PREFIX_TABLE (PREFIX_0F09
) },
2149 { "ud2", { XX
}, 0 },
2151 { REG_TABLE (REG_0F0D
) },
2152 { "femms", { XX
}, 0 },
2153 { "", { MX
, EM
, OPSUF
}, 0 }, /* See OP_3DNowSuffix. */
2155 { PREFIX_TABLE (PREFIX_0F10
) },
2156 { PREFIX_TABLE (PREFIX_0F11
) },
2157 { PREFIX_TABLE (PREFIX_0F12
) },
2158 { "movlpX", { Mq
, XM
}, PREFIX_OPCODE
},
2159 { "unpcklpX", { XM
, EXx
}, PREFIX_OPCODE
},
2160 { "unpckhpX", { XM
, EXx
}, PREFIX_OPCODE
},
2161 { PREFIX_TABLE (PREFIX_0F16
) },
2162 { "movhpX", { Mq
, XM
}, PREFIX_OPCODE
},
2164 { REG_TABLE (REG_0F18
) },
2165 { "nopQ", { Ev
}, 0 },
2166 { PREFIX_TABLE (PREFIX_0F1A
) },
2167 { PREFIX_TABLE (PREFIX_0F1B
) },
2168 { PREFIX_TABLE (PREFIX_0F1C
) },
2169 { "nopQ", { Ev
}, 0 },
2170 { PREFIX_TABLE (PREFIX_0F1E
) },
2171 { "nopQ", { Ev
}, 0 },
2173 { "movZ", { Em
, Cm
}, 0 },
2174 { "movZ", { Em
, Dm
}, 0 },
2175 { "movZ", { Cm
, Em
}, 0 },
2176 { "movZ", { Dm
, Em
}, 0 },
2177 { X86_64_TABLE (X86_64_0F24
) },
2179 { X86_64_TABLE (X86_64_0F26
) },
2182 { "movapX", { XM
, EXx
}, PREFIX_OPCODE
},
2183 { "movapX", { EXxS
, XM
}, PREFIX_OPCODE
},
2184 { PREFIX_TABLE (PREFIX_0F2A
) },
2185 { PREFIX_TABLE (PREFIX_0F2B
) },
2186 { PREFIX_TABLE (PREFIX_0F2C
) },
2187 { PREFIX_TABLE (PREFIX_0F2D
) },
2188 { PREFIX_TABLE (PREFIX_0F2E
) },
2189 { PREFIX_TABLE (PREFIX_0F2F
) },
2191 { "wrmsr", { XX
}, PREFIX_REX2_ILLEGAL
},
2192 { "rdtsc", { XX
}, PREFIX_REX2_ILLEGAL
},
2193 { "rdmsr", { XX
}, PREFIX_REX2_ILLEGAL
},
2194 { "rdpmc", { XX
}, PREFIX_REX2_ILLEGAL
},
2195 { "sysenter", { SEP
}, PREFIX_REX2_ILLEGAL
},
2196 { "sysexit%LQ", { SEP
}, PREFIX_REX2_ILLEGAL
},
2198 { "getsec", { XX
}, 0 },
2200 { THREE_BYTE_TABLE (THREE_BYTE_0F38
) },
2202 { THREE_BYTE_TABLE (THREE_BYTE_0F3A
) },
2209 { "cmovoS", { Gv
, Ev
}, 0 },
2210 { "cmovnoS", { Gv
, Ev
}, 0 },
2211 { "cmovbS", { Gv
, Ev
}, 0 },
2212 { "cmovaeS", { Gv
, Ev
}, 0 },
2213 { "cmoveS", { Gv
, Ev
}, 0 },
2214 { "cmovneS", { Gv
, Ev
}, 0 },
2215 { "cmovbeS", { Gv
, Ev
}, 0 },
2216 { "cmovaS", { Gv
, Ev
}, 0 },
2218 { "cmovsS", { Gv
, Ev
}, 0 },
2219 { "cmovnsS", { Gv
, Ev
}, 0 },
2220 { "cmovpS", { Gv
, Ev
}, 0 },
2221 { "cmovnpS", { Gv
, Ev
}, 0 },
2222 { "cmovlS", { Gv
, Ev
}, 0 },
2223 { "cmovgeS", { Gv
, Ev
}, 0 },
2224 { "cmovleS", { Gv
, Ev
}, 0 },
2225 { "cmovgS", { Gv
, Ev
}, 0 },
2227 { "movmskpX", { Gdq
, Ux
}, PREFIX_OPCODE
},
2228 { PREFIX_TABLE (PREFIX_0F51
) },
2229 { PREFIX_TABLE (PREFIX_0F52
) },
2230 { PREFIX_TABLE (PREFIX_0F53
) },
2231 { "andpX", { XM
, EXx
}, PREFIX_OPCODE
},
2232 { "andnpX", { XM
, EXx
}, PREFIX_OPCODE
},
2233 { "orpX", { XM
, EXx
}, PREFIX_OPCODE
},
2234 { "xorpX", { XM
, EXx
}, PREFIX_OPCODE
},
2236 { PREFIX_TABLE (PREFIX_0F58
) },
2237 { PREFIX_TABLE (PREFIX_0F59
) },
2238 { PREFIX_TABLE (PREFIX_0F5A
) },
2239 { PREFIX_TABLE (PREFIX_0F5B
) },
2240 { PREFIX_TABLE (PREFIX_0F5C
) },
2241 { PREFIX_TABLE (PREFIX_0F5D
) },
2242 { PREFIX_TABLE (PREFIX_0F5E
) },
2243 { PREFIX_TABLE (PREFIX_0F5F
) },
2245 { PREFIX_TABLE (PREFIX_0F60
) },
2246 { PREFIX_TABLE (PREFIX_0F61
) },
2247 { PREFIX_TABLE (PREFIX_0F62
) },
2248 { "packsswb", { MX
, EM
}, PREFIX_OPCODE
},
2249 { "pcmpgtb", { MX
, EM
}, PREFIX_OPCODE
},
2250 { "pcmpgtw", { MX
, EM
}, PREFIX_OPCODE
},
2251 { "pcmpgtd", { MX
, EM
}, PREFIX_OPCODE
},
2252 { "packuswb", { MX
, EM
}, PREFIX_OPCODE
},
2254 { "punpckhbw", { MX
, EM
}, PREFIX_OPCODE
},
2255 { "punpckhwd", { MX
, EM
}, PREFIX_OPCODE
},
2256 { "punpckhdq", { MX
, EM
}, PREFIX_OPCODE
},
2257 { "packssdw", { MX
, EM
}, PREFIX_OPCODE
},
2258 { "punpcklqdq", { XM
, EXx
}, PREFIX_DATA
},
2259 { "punpckhqdq", { XM
, EXx
}, PREFIX_DATA
},
2260 { "movK", { MX
, Edq
}, PREFIX_OPCODE
},
2261 { PREFIX_TABLE (PREFIX_0F6F
) },
2263 { PREFIX_TABLE (PREFIX_0F70
) },
2264 { REG_TABLE (REG_0F71
) },
2265 { REG_TABLE (REG_0F72
) },
2266 { REG_TABLE (REG_0F73
) },
2267 { "pcmpeqb", { MX
, EM
}, PREFIX_OPCODE
},
2268 { "pcmpeqw", { MX
, EM
}, PREFIX_OPCODE
},
2269 { "pcmpeqd", { MX
, EM
}, PREFIX_OPCODE
},
2270 { "emms", { XX
}, PREFIX_OPCODE
},
2272 { PREFIX_TABLE (PREFIX_0F78
) },
2273 { PREFIX_TABLE (PREFIX_0F79
) },
2276 { PREFIX_TABLE (PREFIX_0F7C
) },
2277 { PREFIX_TABLE (PREFIX_0F7D
) },
2278 { PREFIX_TABLE (PREFIX_0F7E
) },
2279 { PREFIX_TABLE (PREFIX_0F7F
) },
2281 { "joH", { Jv
, BND
, cond_jump_flag
}, PREFIX_REX2_ILLEGAL
},
2282 { "jnoH", { Jv
, BND
, cond_jump_flag
}, PREFIX_REX2_ILLEGAL
},
2283 { "jbH", { Jv
, BND
, cond_jump_flag
}, PREFIX_REX2_ILLEGAL
},
2284 { "jaeH", { Jv
, BND
, cond_jump_flag
}, PREFIX_REX2_ILLEGAL
},
2285 { "jeH", { Jv
, BND
, cond_jump_flag
}, PREFIX_REX2_ILLEGAL
},
2286 { "jneH", { Jv
, BND
, cond_jump_flag
}, PREFIX_REX2_ILLEGAL
},
2287 { "jbeH", { Jv
, BND
, cond_jump_flag
}, PREFIX_REX2_ILLEGAL
},
2288 { "jaH", { Jv
, BND
, cond_jump_flag
}, PREFIX_REX2_ILLEGAL
},
2290 { "jsH", { Jv
, BND
, cond_jump_flag
}, PREFIX_REX2_ILLEGAL
},
2291 { "jnsH", { Jv
, BND
, cond_jump_flag
}, PREFIX_REX2_ILLEGAL
},
2292 { "jpH", { Jv
, BND
, cond_jump_flag
}, PREFIX_REX2_ILLEGAL
},
2293 { "jnpH", { Jv
, BND
, cond_jump_flag
}, PREFIX_REX2_ILLEGAL
},
2294 { "jlH", { Jv
, BND
, cond_jump_flag
}, PREFIX_REX2_ILLEGAL
},
2295 { "jgeH", { Jv
, BND
, cond_jump_flag
}, PREFIX_REX2_ILLEGAL
},
2296 { "jleH", { Jv
, BND
, cond_jump_flag
}, PREFIX_REX2_ILLEGAL
},
2297 { "jgH", { Jv
, BND
, cond_jump_flag
}, PREFIX_REX2_ILLEGAL
},
2299 { "seto", { Eb
}, 0 },
2300 { "setno", { Eb
}, 0 },
2301 { "setb", { Eb
}, 0 },
2302 { "setae", { Eb
}, 0 },
2303 { "sete", { Eb
}, 0 },
2304 { "setne", { Eb
}, 0 },
2305 { "setbe", { Eb
}, 0 },
2306 { "seta", { Eb
}, 0 },
2308 { "sets", { Eb
}, 0 },
2309 { "setns", { Eb
}, 0 },
2310 { "setp", { Eb
}, 0 },
2311 { "setnp", { Eb
}, 0 },
2312 { "setl", { Eb
}, 0 },
2313 { "setge", { Eb
}, 0 },
2314 { "setle", { Eb
}, 0 },
2315 { "setg", { Eb
}, 0 },
2317 { "pushP", { fs
}, 0 },
2318 { "popP", { fs
}, 0 },
2319 { "cpuid", { XX
}, 0 },
2320 { "btS", { Ev
, Gv
}, 0 },
2321 { "shldS", { Ev
, Gv
, Ib
}, 0 },
2322 { "shldS", { Ev
, Gv
, CL
}, 0 },
2323 { REG_TABLE (REG_0FA6
) },
2324 { REG_TABLE (REG_0FA7
) },
2326 { "pushP", { gs
}, 0 },
2327 { "popP", { gs
}, 0 },
2328 { "rsm", { XX
}, 0 },
2329 { "btsS", { Evh1
, Gv
}, 0 },
2330 { "shrdS", { Ev
, Gv
, Ib
}, 0 },
2331 { "shrdS", { Ev
, Gv
, CL
}, 0 },
2332 { REG_TABLE (REG_0FAE
) },
2333 { "imulS", { Gv
, Ev
}, 0 },
2335 { "cmpxchgB", { Ebh1
, Gb
}, 0 },
2336 { "cmpxchgS", { Evh1
, Gv
}, 0 },
2337 { "lssS", { Gv
, Mp
}, 0 },
2338 { "btrS", { Evh1
, Gv
}, 0 },
2339 { "lfsS", { Gv
, Mp
}, 0 },
2340 { "lgsS", { Gv
, Mp
}, 0 },
2341 { "movz{bR|x}", { Gv
, Eb
}, 0 },
2342 { "movz{wR|x}", { Gv
, Ew
}, 0 }, /* yes, there really is movzww ! */
2344 { PREFIX_TABLE (PREFIX_0FB8
) },
2345 { "ud1S", { Gv
, Ev
}, 0 },
2346 { REG_TABLE (REG_0FBA
) },
2347 { "btcS", { Evh1
, Gv
}, 0 },
2348 { PREFIX_TABLE (PREFIX_0FBC
) },
2349 { PREFIX_TABLE (PREFIX_0FBD
) },
2350 { "movs{bR|x}", { Gv
, Eb
}, 0 },
2351 { "movs{wR|x}", { Gv
, Ew
}, 0 }, /* yes, there really is movsww ! */
2353 { "xaddB", { Ebh1
, Gb
}, 0 },
2354 { "xaddS", { Evh1
, Gv
}, 0 },
2355 { PREFIX_TABLE (PREFIX_0FC2
) },
2356 { "movntiS", { Mdq
, Gdq
}, PREFIX_OPCODE
},
2357 { "pinsrw", { MX
, Edw
, Ib
}, PREFIX_OPCODE
},
2358 { "pextrw", { Gd
, Nq
, Ib
}, PREFIX_OPCODE
},
2359 { "shufpX", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
2360 { REG_TABLE (REG_0FC7
) },
2362 { "bswap", { RMeAX
}, 0 },
2363 { "bswap", { RMeCX
}, 0 },
2364 { "bswap", { RMeDX
}, 0 },
2365 { "bswap", { RMeBX
}, 0 },
2366 { "bswap", { RMeSP
}, 0 },
2367 { "bswap", { RMeBP
}, 0 },
2368 { "bswap", { RMeSI
}, 0 },
2369 { "bswap", { RMeDI
}, 0 },
2371 { PREFIX_TABLE (PREFIX_0FD0
) },
2372 { "psrlw", { MX
, EM
}, PREFIX_OPCODE
},
2373 { "psrld", { MX
, EM
}, PREFIX_OPCODE
},
2374 { "psrlq", { MX
, EM
}, PREFIX_OPCODE
},
2375 { "paddq", { MX
, EM
}, PREFIX_OPCODE
},
2376 { "pmullw", { MX
, EM
}, PREFIX_OPCODE
},
2377 { PREFIX_TABLE (PREFIX_0FD6
) },
2378 { "pmovmskb", { Gdq
, Nq
}, PREFIX_OPCODE
},
2380 { "psubusb", { MX
, EM
}, PREFIX_OPCODE
},
2381 { "psubusw", { MX
, EM
}, PREFIX_OPCODE
},
2382 { "pminub", { MX
, EM
}, PREFIX_OPCODE
},
2383 { "pand", { MX
, EM
}, PREFIX_OPCODE
},
2384 { "paddusb", { MX
, EM
}, PREFIX_OPCODE
},
2385 { "paddusw", { MX
, EM
}, PREFIX_OPCODE
},
2386 { "pmaxub", { MX
, EM
}, PREFIX_OPCODE
},
2387 { "pandn", { MX
, EM
}, PREFIX_OPCODE
},
2389 { "pavgb", { MX
, EM
}, PREFIX_OPCODE
},
2390 { "psraw", { MX
, EM
}, PREFIX_OPCODE
},
2391 { "psrad", { MX
, EM
}, PREFIX_OPCODE
},
2392 { "pavgw", { MX
, EM
}, PREFIX_OPCODE
},
2393 { "pmulhuw", { MX
, EM
}, PREFIX_OPCODE
},
2394 { "pmulhw", { MX
, EM
}, PREFIX_OPCODE
},
2395 { PREFIX_TABLE (PREFIX_0FE6
) },
2396 { PREFIX_TABLE (PREFIX_0FE7
) },
2398 { "psubsb", { MX
, EM
}, PREFIX_OPCODE
},
2399 { "psubsw", { MX
, EM
}, PREFIX_OPCODE
},
2400 { "pminsw", { MX
, EM
}, PREFIX_OPCODE
},
2401 { "por", { MX
, EM
}, PREFIX_OPCODE
},
2402 { "paddsb", { MX
, EM
}, PREFIX_OPCODE
},
2403 { "paddsw", { MX
, EM
}, PREFIX_OPCODE
},
2404 { "pmaxsw", { MX
, EM
}, PREFIX_OPCODE
},
2405 { "pxor", { MX
, EM
}, PREFIX_OPCODE
},
2407 { PREFIX_TABLE (PREFIX_0FF0
) },
2408 { "psllw", { MX
, EM
}, PREFIX_OPCODE
},
2409 { "pslld", { MX
, EM
}, PREFIX_OPCODE
},
2410 { "psllq", { MX
, EM
}, PREFIX_OPCODE
},
2411 { "pmuludq", { MX
, EM
}, PREFIX_OPCODE
},
2412 { "pmaddwd", { MX
, EM
}, PREFIX_OPCODE
},
2413 { "psadbw", { MX
, EM
}, PREFIX_OPCODE
},
2414 { PREFIX_TABLE (PREFIX_0FF7
) },
2416 { "psubb", { MX
, EM
}, PREFIX_OPCODE
},
2417 { "psubw", { MX
, EM
}, PREFIX_OPCODE
},
2418 { "psubd", { MX
, EM
}, PREFIX_OPCODE
},
2419 { "psubq", { MX
, EM
}, PREFIX_OPCODE
},
2420 { "paddb", { MX
, EM
}, PREFIX_OPCODE
},
2421 { "paddw", { MX
, EM
}, PREFIX_OPCODE
},
2422 { "paddd", { MX
, EM
}, PREFIX_OPCODE
},
2423 { "ud0S", { Gv
, Ev
}, 0 },
2426 static const bool onebyte_has_modrm
[256] = {
2427 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2428 /* ------------------------------- */
2429 /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
2430 /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
2431 /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
2432 /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
2433 /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
2434 /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
2435 /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
2436 /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
2437 /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
2438 /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
2439 /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
2440 /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
2441 /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
2442 /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
2443 /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
2444 /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1 /* f0 */
2445 /* ------------------------------- */
2446 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2449 static const bool twobyte_has_modrm
[256] = {
2450 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2451 /* ------------------------------- */
2452 /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
2453 /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
2454 /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
2455 /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
2456 /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
2457 /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
2458 /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
2459 /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
2460 /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
2461 /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
2462 /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
2463 /* b0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* bf */
2464 /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
2465 /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
2466 /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
2467 /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 /* ff */
2468 /* ------------------------------- */
2469 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2479 /* If we are accessing mod/rm/reg without need_modrm set, then the
2480 values are stale. Hitting this abort likely indicates that you
2481 need to update onebyte_has_modrm or twobyte_has_modrm. */
2482 #define MODRM_CHECK if (!ins->need_modrm) abort ()
2484 static const char intel_index16
[][6] = {
2485 "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
2488 static const char att_names64
[][8] = {
2489 "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
2490 "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15",
2491 "%r16", "%r17", "%r18", "%r19", "%r20", "%r21", "%r22", "%r23",
2492 "%r24", "%r25", "%r26", "%r27", "%r28", "%r29", "%r30", "%r31",
2494 static const char att_names32
[][8] = {
2495 "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
2496 "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d",
2497 "%r16d", "%r17d", "%r18d", "%r19d", "%r20d", "%r21d", "%r22d", "%r23d",
2498 "%r24d", "%r25d", "%r26d", "%r27d", "%r28d", "%r29d", "%r30d", "%r31d",
2500 static const char att_names16
[][8] = {
2501 "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
2502 "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w",
2503 "%r16w", "%r17w", "%r18w", "%r19w", "%r20w", "%r21w", "%r22w", "%r23w",
2504 "%r24w", "%r25w", "%r26w", "%r27w", "%r28w", "%r29w", "%r30w", "%r31w",
2506 static const char att_names8
[][8] = {
2507 "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
2509 static const char att_names8rex
[][8] = {
2510 "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
2511 "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b",
2512 "%r16b", "%r17b", "%r18b", "%r19b", "%r20b", "%r21b", "%r22b", "%r23b",
2513 "%r24b", "%r25b", "%r26b", "%r27b", "%r28b", "%r29b", "%r30b", "%r31b",
2515 static const char att_names_seg
[][4] = {
2516 "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
2518 static const char att_index64
[] = "%riz";
2519 static const char att_index32
[] = "%eiz";
2520 static const char att_index16
[][8] = {
2521 "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
2524 static const char att_names_mm
[][8] = {
2525 "%mm0", "%mm1", "%mm2", "%mm3",
2526 "%mm4", "%mm5", "%mm6", "%mm7"
2529 static const char att_names_bnd
[][8] = {
2530 "%bnd0", "%bnd1", "%bnd2", "%bnd3"
2533 static const char att_names_xmm
[][8] = {
2534 "%xmm0", "%xmm1", "%xmm2", "%xmm3",
2535 "%xmm4", "%xmm5", "%xmm6", "%xmm7",
2536 "%xmm8", "%xmm9", "%xmm10", "%xmm11",
2537 "%xmm12", "%xmm13", "%xmm14", "%xmm15",
2538 "%xmm16", "%xmm17", "%xmm18", "%xmm19",
2539 "%xmm20", "%xmm21", "%xmm22", "%xmm23",
2540 "%xmm24", "%xmm25", "%xmm26", "%xmm27",
2541 "%xmm28", "%xmm29", "%xmm30", "%xmm31"
2544 static const char att_names_ymm
[][8] = {
2545 "%ymm0", "%ymm1", "%ymm2", "%ymm3",
2546 "%ymm4", "%ymm5", "%ymm6", "%ymm7",
2547 "%ymm8", "%ymm9", "%ymm10", "%ymm11",
2548 "%ymm12", "%ymm13", "%ymm14", "%ymm15",
2549 "%ymm16", "%ymm17", "%ymm18", "%ymm19",
2550 "%ymm20", "%ymm21", "%ymm22", "%ymm23",
2551 "%ymm24", "%ymm25", "%ymm26", "%ymm27",
2552 "%ymm28", "%ymm29", "%ymm30", "%ymm31"
2555 static const char att_names_zmm
[][8] = {
2556 "%zmm0", "%zmm1", "%zmm2", "%zmm3",
2557 "%zmm4", "%zmm5", "%zmm6", "%zmm7",
2558 "%zmm8", "%zmm9", "%zmm10", "%zmm11",
2559 "%zmm12", "%zmm13", "%zmm14", "%zmm15",
2560 "%zmm16", "%zmm17", "%zmm18", "%zmm19",
2561 "%zmm20", "%zmm21", "%zmm22", "%zmm23",
2562 "%zmm24", "%zmm25", "%zmm26", "%zmm27",
2563 "%zmm28", "%zmm29", "%zmm30", "%zmm31"
2566 static const char att_names_tmm
[][8] = {
2567 "%tmm0", "%tmm1", "%tmm2", "%tmm3",
2568 "%tmm4", "%tmm5", "%tmm6", "%tmm7"
2571 static const char att_names_mask
[][8] = {
2572 "%k0", "%k1", "%k2", "%k3", "%k4", "%k5", "%k6", "%k7"
2575 static const char *const names_rounding
[] =
2583 static const struct dis386 reg_table
[][8] = {
2586 { "addA", { Ebh1
, Ib
}, 0 },
2587 { "orA", { Ebh1
, Ib
}, 0 },
2588 { "adcA", { Ebh1
, Ib
}, 0 },
2589 { "sbbA", { Ebh1
, Ib
}, 0 },
2590 { "andA", { Ebh1
, Ib
}, 0 },
2591 { "subA", { Ebh1
, Ib
}, 0 },
2592 { "xorA", { Ebh1
, Ib
}, 0 },
2593 { "cmpA", { Eb
, Ib
}, 0 },
2597 { "addQ", { Evh1
, Iv
}, 0 },
2598 { "orQ", { Evh1
, Iv
}, 0 },
2599 { "adcQ", { Evh1
, Iv
}, 0 },
2600 { "sbbQ", { Evh1
, Iv
}, 0 },
2601 { "andQ", { Evh1
, Iv
}, 0 },
2602 { "subQ", { Evh1
, Iv
}, 0 },
2603 { "xorQ", { Evh1
, Iv
}, 0 },
2604 { "cmpQ", { Ev
, Iv
}, 0 },
2608 { "addQ", { Evh1
, sIb
}, 0 },
2609 { "orQ", { Evh1
, sIb
}, 0 },
2610 { "adcQ", { Evh1
, sIb
}, 0 },
2611 { "sbbQ", { Evh1
, sIb
}, 0 },
2612 { "andQ", { Evh1
, sIb
}, 0 },
2613 { "subQ", { Evh1
, sIb
}, 0 },
2614 { "xorQ", { Evh1
, sIb
}, 0 },
2615 { "cmpQ", { Ev
, sIb
}, 0 },
2619 { "pop{P|}", { stackEv
}, 0 },
2620 { XOP_8F_TABLE () },
2624 { XOP_8F_TABLE () },
2628 { "%NFrolA", { VexGb
, Eb
, Ib
}, NO_PREFIX
},
2629 { "%NFrorA", { VexGb
, Eb
, Ib
}, NO_PREFIX
},
2630 { "rclA", { VexGb
, Eb
, Ib
}, NO_PREFIX
},
2631 { "rcrA", { VexGb
, Eb
, Ib
}, NO_PREFIX
},
2632 { "%NFshlA", { VexGb
, Eb
, Ib
}, NO_PREFIX
},
2633 { "%NFshrA", { VexGb
, Eb
, Ib
}, NO_PREFIX
},
2634 { "%NFshlA", { VexGb
, Eb
, Ib
}, NO_PREFIX
},
2635 { "%NFsarA", { VexGb
, Eb
, Ib
}, NO_PREFIX
},
2639 { "%NFrolQ", { VexGv
, Ev
, Ib
}, PREFIX_NP_OR_DATA
},
2640 { "%NFrorQ", { VexGv
, Ev
, Ib
}, PREFIX_NP_OR_DATA
},
2641 { "rclQ", { VexGv
, Ev
, Ib
}, PREFIX_NP_OR_DATA
},
2642 { "rcrQ", { VexGv
, Ev
, Ib
}, PREFIX_NP_OR_DATA
},
2643 { "%NFshlQ", { VexGv
, Ev
, Ib
}, PREFIX_NP_OR_DATA
},
2644 { "%NFshrQ", { VexGv
, Ev
, Ib
}, PREFIX_NP_OR_DATA
},
2645 { "%NFshlQ", { VexGv
, Ev
, Ib
}, PREFIX_NP_OR_DATA
},
2646 { "%NFsarQ", { VexGv
, Ev
, Ib
}, PREFIX_NP_OR_DATA
},
2650 { "movA", { Ebh3
, Ib
}, 0 },
2657 { RM_TABLE (RM_C6_REG_7
) },
2661 { "movQ", { Evh3
, Iv
}, 0 },
2668 { RM_TABLE (RM_C7_REG_7
) },
2672 { "%NFrolA", { VexGb
, Eb
, I1
}, NO_PREFIX
},
2673 { "%NFrorA", { VexGb
, Eb
, I1
}, NO_PREFIX
},
2674 { "rclA", { VexGb
, Eb
, I1
}, NO_PREFIX
},
2675 { "rcrA", { VexGb
, Eb
, I1
}, NO_PREFIX
},
2676 { "%NFshlA", { VexGb
, Eb
, I1
}, NO_PREFIX
},
2677 { "%NFshrA", { VexGb
, Eb
, I1
}, NO_PREFIX
},
2678 { "%NFshlA", { VexGb
, Eb
, I1
}, NO_PREFIX
},
2679 { "%NFsarA", { VexGb
, Eb
, I1
}, NO_PREFIX
},
2683 { "%NFrolQ", { VexGv
, Ev
, I1
}, PREFIX_NP_OR_DATA
},
2684 { "%NFrorQ", { VexGv
, Ev
, I1
}, PREFIX_NP_OR_DATA
},
2685 { "rclQ", { VexGv
, Ev
, I1
}, PREFIX_NP_OR_DATA
},
2686 { "rcrQ", { VexGv
, Ev
, I1
}, PREFIX_NP_OR_DATA
},
2687 { "%NFshlQ", { VexGv
, Ev
, I1
}, PREFIX_NP_OR_DATA
},
2688 { "%NFshrQ", { VexGv
, Ev
, I1
}, PREFIX_NP_OR_DATA
},
2689 { "%NFshlQ", { VexGv
, Ev
, I1
}, PREFIX_NP_OR_DATA
},
2690 { "%NFsarQ", { VexGv
, Ev
, I1
}, PREFIX_NP_OR_DATA
},
2694 { "%NFrolA", { VexGb
, Eb
, CL
}, NO_PREFIX
},
2695 { "%NFrorA", { VexGb
, Eb
, CL
}, NO_PREFIX
},
2696 { "rclA", { VexGb
, Eb
, CL
}, NO_PREFIX
},
2697 { "rcrA", { VexGb
, Eb
, CL
}, NO_PREFIX
},
2698 { "%NFshlA", { VexGb
, Eb
, CL
}, NO_PREFIX
},
2699 { "%NFshrA", { VexGb
, Eb
, CL
}, NO_PREFIX
},
2700 { "%NFshlA", { VexGb
, Eb
, CL
}, NO_PREFIX
},
2701 { "%NFsarA", { VexGb
, Eb
, CL
}, NO_PREFIX
},
2705 { "%NFrolQ", { VexGv
, Ev
, CL
}, PREFIX_NP_OR_DATA
},
2706 { "%NFrorQ", { VexGv
, Ev
, CL
}, PREFIX_NP_OR_DATA
},
2707 { "rclQ", { VexGv
, Ev
, CL
}, PREFIX_NP_OR_DATA
},
2708 { "rcrQ", { VexGv
, Ev
, CL
}, PREFIX_NP_OR_DATA
},
2709 { "%NFshlQ", { VexGv
, Ev
, CL
}, PREFIX_NP_OR_DATA
},
2710 { "%NFshrQ", { VexGv
, Ev
, CL
}, PREFIX_NP_OR_DATA
},
2711 { "%NFshlQ", { VexGv
, Ev
, CL
}, PREFIX_NP_OR_DATA
},
2712 { "%NFsarQ", { VexGv
, Ev
, CL
}, PREFIX_NP_OR_DATA
},
2716 { "testA", { Eb
, Ib
}, 0 },
2717 { "testA", { Eb
, Ib
}, 0 },
2718 { "notA", { Ebh1
}, 0 },
2719 { "negA", { Ebh1
}, 0 },
2720 { "mulA", { Eb
}, 0 }, /* Don't print the implicit %al register, */
2721 { "imulA", { Eb
}, 0 }, /* to distinguish these opcodes from other */
2722 { "divA", { Eb
}, 0 }, /* mul/imul opcodes. Do the same for div */
2723 { "idivA", { Eb
}, 0 }, /* and idiv for consistency. */
2727 { "testQ", { Ev
, Iv
}, 0 },
2728 { "testQ", { Ev
, Iv
}, 0 },
2729 { "notQ", { Evh1
}, 0 },
2730 { "negQ", { Evh1
}, 0 },
2731 { "mulQ", { Ev
}, 0 }, /* Don't print the implicit register. */
2732 { "imulQ", { Ev
}, 0 },
2733 { "divQ", { Ev
}, 0 },
2734 { "idivQ", { Ev
}, 0 },
2738 { "incA", { Ebh1
}, 0 },
2739 { "decA", { Ebh1
}, 0 },
2743 { "incQ", { Evh1
}, 0 },
2744 { "decQ", { Evh1
}, 0 },
2745 { "call{@|}", { NOTRACK
, indirEv
, BND
}, 0 },
2746 { "{l|}call^", { indirEp
}, 0 },
2747 { "jmp{@|}", { NOTRACK
, indirEv
, BND
}, 0 },
2748 { "{l|}jmp^", { indirEp
}, 0 },
2749 { "push{P|}", { stackEv
}, 0 },
2754 { "sldtD", { Sv
}, 0 },
2755 { "strD", { Sv
}, 0 },
2756 { "lldtD", { Sv
}, 0 },
2757 { "ltrD", { Sv
}, 0 },
2758 { "verrD", { Sv
}, 0 },
2759 { "verwD", { Sv
}, 0 },
2760 { X86_64_TABLE (X86_64_0F00_REG_6
) },
2765 { MOD_TABLE (MOD_0F01_REG_0
) },
2766 { MOD_TABLE (MOD_0F01_REG_1
) },
2767 { MOD_TABLE (MOD_0F01_REG_2
) },
2768 { MOD_TABLE (MOD_0F01_REG_3
) },
2769 { "smswD", { Sv
}, 0 },
2770 { MOD_TABLE (MOD_0F01_REG_5
) },
2771 { "lmsw", { Ew
}, 0 },
2772 { MOD_TABLE (MOD_0F01_REG_7
) },
2776 { "prefetch", { Mb
}, 0 },
2777 { "prefetchw", { Mb
}, 0 },
2778 { "prefetchwt1", { Mb
}, 0 },
2779 { "prefetch", { Mb
}, 0 },
2780 { "prefetch", { Mb
}, 0 },
2781 { "prefetch", { Mb
}, 0 },
2782 { "prefetch", { Mb
}, 0 },
2783 { "prefetch", { Mb
}, 0 },
2787 { MOD_TABLE (MOD_0F18_REG_0
) },
2788 { MOD_TABLE (MOD_0F18_REG_1
) },
2789 { MOD_TABLE (MOD_0F18_REG_2
) },
2790 { MOD_TABLE (MOD_0F18_REG_3
) },
2791 { "nopQ", { Ev
}, 0 },
2792 { "nopQ", { Ev
}, 0 },
2793 { MOD_TABLE (MOD_0F18_REG_6
) },
2794 { MOD_TABLE (MOD_0F18_REG_7
) },
2796 /* REG_0F1C_P_0_MOD_0 */
2798 { "cldemote", { Mb
}, 0 },
2799 { "nopQ", { Ev
}, 0 },
2800 { "nopQ", { Ev
}, 0 },
2801 { "nopQ", { Ev
}, 0 },
2802 { "nopQ", { Ev
}, 0 },
2803 { "nopQ", { Ev
}, 0 },
2804 { "nopQ", { Ev
}, 0 },
2805 { "nopQ", { Ev
}, 0 },
2807 /* REG_0F1E_P_1_MOD_3 */
2809 { "nopQ", { Ev
}, PREFIX_IGNORED
},
2810 { "rdsspK", { Edq
}, 0 },
2811 { "nopQ", { Ev
}, PREFIX_IGNORED
},
2812 { "nopQ", { Ev
}, PREFIX_IGNORED
},
2813 { "nopQ", { Ev
}, PREFIX_IGNORED
},
2814 { "nopQ", { Ev
}, PREFIX_IGNORED
},
2815 { "nopQ", { Ev
}, PREFIX_IGNORED
},
2816 { RM_TABLE (RM_0F1E_P_1_MOD_3_REG_7
) },
2818 /* REG_0F38D8_PREFIX_1 */
2820 { "aesencwide128kl", { M
}, 0 },
2821 { "aesdecwide128kl", { M
}, 0 },
2822 { "aesencwide256kl", { M
}, 0 },
2823 { "aesdecwide256kl", { M
}, 0 },
2825 /* REG_0F3A0F_P_1 */
2827 { RM_TABLE (RM_0F3A0F_P_1_R_0
) },
2833 { "psrlw", { Nq
, Ib
}, PREFIX_OPCODE
},
2835 { "psraw", { Nq
, Ib
}, PREFIX_OPCODE
},
2837 { "psllw", { Nq
, Ib
}, PREFIX_OPCODE
},
2843 { "psrld", { Nq
, Ib
}, PREFIX_OPCODE
},
2845 { "psrad", { Nq
, Ib
}, PREFIX_OPCODE
},
2847 { "pslld", { Nq
, Ib
}, PREFIX_OPCODE
},
2853 { "psrlq", { Nq
, Ib
}, PREFIX_OPCODE
},
2854 { "psrldq", { Ux
, Ib
}, PREFIX_DATA
},
2857 { "psllq", { Nq
, Ib
}, PREFIX_OPCODE
},
2858 { "pslldq", { Ux
, Ib
}, PREFIX_DATA
},
2862 { PREFIX_TABLE (PREFIX_0FA6_REG_0
) },
2863 { "xsha1", { { OP_0f07
, 0 } }, 0 },
2864 { "xsha256", { { OP_0f07
, 0 } }, 0 },
2867 { PREFIX_TABLE (PREFIX_0FA6_REG_5
) },
2871 { "xstore-rng", { { OP_0f07
, 0 } }, 0 },
2872 { "xcrypt-ecb", { { OP_0f07
, 0 } }, 0 },
2873 { "xcrypt-cbc", { { OP_0f07
, 0 } }, 0 },
2874 { "xcrypt-ctr", { { OP_0f07
, 0 } }, 0 },
2875 { "xcrypt-cfb", { { OP_0f07
, 0 } }, 0 },
2876 { "xcrypt-ofb", { { OP_0f07
, 0 } }, 0 },
2877 { PREFIX_TABLE (PREFIX_0FA7_REG_6
) },
2881 { MOD_TABLE (MOD_0FAE_REG_0
) },
2882 { MOD_TABLE (MOD_0FAE_REG_1
) },
2883 { MOD_TABLE (MOD_0FAE_REG_2
) },
2884 { MOD_TABLE (MOD_0FAE_REG_3
) },
2885 { MOD_TABLE (MOD_0FAE_REG_4
) },
2886 { MOD_TABLE (MOD_0FAE_REG_5
) },
2887 { MOD_TABLE (MOD_0FAE_REG_6
) },
2888 { MOD_TABLE (MOD_0FAE_REG_7
) },
2896 { "btQ", { Ev
, Ib
}, 0 },
2897 { "btsQ", { Evh1
, Ib
}, 0 },
2898 { "btrQ", { Evh1
, Ib
}, 0 },
2899 { "btcQ", { Evh1
, Ib
}, 0 },
2904 { "cmpxchg8b", { { CMPXCHG8B_Fixup
, q_mode
} }, 0 },
2906 { "xrstors", { FXSAVE
}, PREFIX_REX2_ILLEGAL
},
2907 { "xsavec", { FXSAVE
}, PREFIX_REX2_ILLEGAL
},
2908 { "xsaves", { FXSAVE
}, PREFIX_REX2_ILLEGAL
},
2909 { MOD_TABLE (MOD_0FC7_REG_6
) },
2910 { MOD_TABLE (MOD_0FC7_REG_7
) },
2916 { "vpsrlw", { Vex
, Ux
, Ib
}, PREFIX_DATA
},
2918 { "vpsraw", { Vex
, Ux
, Ib
}, PREFIX_DATA
},
2920 { "vpsllw", { Vex
, Ux
, Ib
}, PREFIX_DATA
},
2926 { "vpsrld", { Vex
, Ux
, Ib
}, PREFIX_DATA
},
2928 { "vpsrad", { Vex
, Ux
, Ib
}, PREFIX_DATA
},
2930 { "vpslld", { Vex
, Ux
, Ib
}, PREFIX_DATA
},
2936 { "vpsrlq", { Vex
, Ux
, Ib
}, PREFIX_DATA
},
2937 { "vpsrldq", { Vex
, Ux
, Ib
}, PREFIX_DATA
},
2940 { "vpsllq", { Vex
, Ux
, Ib
}, PREFIX_DATA
},
2941 { "vpslldq", { Vex
, Ux
, Ib
}, PREFIX_DATA
},
2947 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_2
) },
2948 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_3
) },
2950 /* REG_VEX_0F3849_X86_64_L_0_W_0_M_1_P_0 */
2952 { RM_TABLE (RM_VEX_0F3849_X86_64_L_0_W_0_M_1_P_0_R_0
) },
2954 /* REG_VEX_0F38F3_L_0_P_0 */
2957 { "%NFblsrS", { VexGdq
, Edq
}, 0 },
2958 { "%NFblsmskS", { VexGdq
, Edq
}, 0 },
2959 { "%NFblsiS", { VexGdq
, Edq
}, 0 },
2961 /* REG_VEX_MAP7_F8_L_0_W_0 */
2963 { X86_64_TABLE (X86_64_VEX_MAP7_F8_L_0_W_0_R_0
) },
2965 /* REG_XOP_09_01_L_0 */
2968 { "blcfill", { VexGdq
, Edq
}, 0 },
2969 { "blsfill", { VexGdq
, Edq
}, 0 },
2970 { "blcs", { VexGdq
, Edq
}, 0 },
2971 { "tzmsk", { VexGdq
, Edq
}, 0 },
2972 { "blcic", { VexGdq
, Edq
}, 0 },
2973 { "blsic", { VexGdq
, Edq
}, 0 },
2974 { "t1mskc", { VexGdq
, Edq
}, 0 },
2976 /* REG_XOP_09_02_L_0 */
2979 { "blcmsk", { VexGdq
, Edq
}, 0 },
2984 { "blci", { VexGdq
, Edq
}, 0 },
2986 /* REG_XOP_09_12_L_0 */
2988 { "llwpcb", { Rdq
}, 0 },
2989 { "slwpcb", { Rdq
}, 0 },
2991 /* REG_XOP_0A_12_L_0 */
2993 { "lwpins", { VexGdq
, Ed
, Id
}, 0 },
2994 { "lwpval", { VexGdq
, Ed
, Id
}, 0 },
2997 #include "i386-dis-evex-reg.h"
3000 static const struct dis386 prefix_table
[][4] = {
3003 { "xchgS", { { NOP_Fixup
, 0 }, { NOP_Fixup
, 1 } }, 0 },
3004 { "pause", { XX
}, 0 },
3005 { "xchgS", { { NOP_Fixup
, 0 }, { NOP_Fixup
, 1 } }, 0 },
3006 { NULL
, { { NULL
, 0 } }, PREFIX_IGNORED
}
3009 /* PREFIX_0F00_REG_6_X86_64 */
3014 { "lkgsD", { Sv
}, 0 },
3017 /* PREFIX_0F01_REG_0_MOD_3_RM_6 */
3019 { "wrmsrns", { Skip_MODRM
}, 0 },
3020 { X86_64_TABLE (X86_64_0F01_REG_0_MOD_3_RM_6_P_1
) },
3022 { X86_64_TABLE (X86_64_0F01_REG_0_MOD_3_RM_6_P_3
) },
3025 /* PREFIX_0F01_REG_0_MOD_3_RM_7 */
3027 { X86_64_TABLE (X86_64_0F01_REG_0_MOD_3_RM_7_P_0
) },
3030 /* PREFIX_0F01_REG_1_RM_2 */
3032 { "clac", { Skip_MODRM
}, 0 },
3033 { X86_64_TABLE (X86_64_0F01_REG_1_RM_2_PREFIX_1
) },
3035 { X86_64_TABLE (X86_64_0F01_REG_1_RM_2_PREFIX_3
)},
3038 /* PREFIX_0F01_REG_1_RM_4 */
3042 { "tdcall", { Skip_MODRM
}, 0 },
3046 /* PREFIX_0F01_REG_1_RM_5 */
3050 { X86_64_TABLE (X86_64_0F01_REG_1_RM_5_PREFIX_2
) },
3054 /* PREFIX_0F01_REG_1_RM_6 */
3058 { X86_64_TABLE (X86_64_0F01_REG_1_RM_6_PREFIX_2
) },
3062 /* PREFIX_0F01_REG_1_RM_7 */
3064 { "encls", { Skip_MODRM
}, 0 },
3066 { X86_64_TABLE (X86_64_0F01_REG_1_RM_7_PREFIX_2
) },
3070 /* PREFIX_0F01_REG_3_RM_1 */
3072 { "vmmcall", { Skip_MODRM
}, 0 },
3073 { "vmgexit", { Skip_MODRM
}, 0 },
3075 { "vmgexit", { Skip_MODRM
}, 0 },
3078 /* PREFIX_0F01_REG_5_MOD_0 */
3081 { "rstorssp", { Mq
}, PREFIX_OPCODE
},
3084 /* PREFIX_0F01_REG_5_MOD_3_RM_0 */
3086 { "serialize", { Skip_MODRM
}, PREFIX_OPCODE
},
3087 { "setssbsy", { Skip_MODRM
}, PREFIX_OPCODE
},
3089 { "xsusldtrk", { Skip_MODRM
}, PREFIX_OPCODE
},
3092 /* PREFIX_0F01_REG_5_MOD_3_RM_1 */
3097 { "xresldtrk", { Skip_MODRM
}, PREFIX_OPCODE
},
3100 /* PREFIX_0F01_REG_5_MOD_3_RM_2 */
3103 { "saveprevssp", { Skip_MODRM
}, PREFIX_OPCODE
},
3106 /* PREFIX_0F01_REG_5_MOD_3_RM_4 */
3109 { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_4_PREFIX_1
) },
3112 /* PREFIX_0F01_REG_5_MOD_3_RM_5 */
3115 { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_5_PREFIX_1
) },
3118 /* PREFIX_0F01_REG_5_MOD_3_RM_6 */
3120 { "rdpkru", { Skip_MODRM
}, 0 },
3121 { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_6_PREFIX_1
) },
3124 /* PREFIX_0F01_REG_5_MOD_3_RM_7 */
3126 { "wrpkru", { Skip_MODRM
}, 0 },
3127 { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_7_PREFIX_1
) },
3130 /* PREFIX_0F01_REG_7_MOD_3_RM_2 */
3132 { "monitorx", { { OP_Monitor
, 0 } }, 0 },
3133 { "mcommit", { Skip_MODRM
}, 0 },
3136 /* PREFIX_0F01_REG_7_MOD_3_RM_5 */
3138 { "rdpru", { Skip_MODRM
}, 0 },
3139 { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_5_PREFIX_1
) },
3142 /* PREFIX_0F01_REG_7_MOD_3_RM_6 */
3144 { "invlpgb", { Skip_MODRM
}, 0 },
3145 { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_1
) },
3147 { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3
) },
3150 /* PREFIX_0F01_REG_7_MOD_3_RM_7 */
3152 { "tlbsync", { Skip_MODRM
}, 0 },
3153 { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_7_PREFIX_1
) },
3155 { "pvalidate", { Skip_MODRM
}, 0 },
3160 { "wbinvd", { XX
}, 0 },
3161 { "wbnoinvd", { XX
}, 0 },
3166 { "%XEVmovupX", { XM
, EXEvexXNoBcst
}, 0 },
3167 { "%XEVmovs%XS", { XMScalar
, VexScalarR
, EXd
}, 0 },
3168 { "%XEVmovupX", { XM
, EXEvexXNoBcst
}, 0 },
3169 { "%XEVmovs%XD", { XMScalar
, VexScalarR
, EXq
}, 0 },
3174 { "%XEVmovupX", { EXxS
, XM
}, 0 },
3175 { "%XEVmovs%XS", { EXdS
, VexScalarR
, XMScalar
}, 0 },
3176 { "%XEVmovupX", { EXxS
, XM
}, 0 },
3177 { "%XEVmovs%XD", { EXqS
, VexScalarR
, XMScalar
}, 0 },
3182 { MOD_TABLE (MOD_0F12_PREFIX_0
) },
3183 { "movsldup", { XM
, EXx
}, 0 },
3184 { "%XEVmovlpYX", { XM
, Vex
, Mq
}, 0 },
3185 { "movddup", { XM
, EXq
}, 0 },
3190 { MOD_TABLE (MOD_0F16_PREFIX_0
) },
3191 { "movshdup", { XM
, EXx
}, 0 },
3192 { "%XEVmovhpYX", { XM
, Vex
, Mq
}, 0 },
3195 /* PREFIX_0F18_REG_6_MOD_0_X86_64 */
3197 { "prefetchit1", { { PREFETCHI_Fixup
, b_mode
} }, 0 },
3198 { "nopQ", { Ev
}, 0 },
3199 { "nopQ", { Ev
}, 0 },
3200 { "nopQ", { Ev
}, 0 },
3203 /* PREFIX_0F18_REG_7_MOD_0_X86_64 */
3205 { "prefetchit0", { { PREFETCHI_Fixup
, b_mode
} }, 0 },
3206 { "nopQ", { Ev
}, 0 },
3207 { "nopQ", { Ev
}, 0 },
3208 { "nopQ", { Ev
}, 0 },
3213 { MOD_TABLE (MOD_0F1A_PREFIX_0
) },
3214 { "bndcl", { Gbnd
, Ev_bnd
}, 0 },
3215 { "bndmov", { Gbnd
, Ebnd
}, 0 },
3216 { "bndcu", { Gbnd
, Ev_bnd
}, 0 },
3221 { MOD_TABLE (MOD_0F1B_PREFIX_0
) },
3222 { MOD_TABLE (MOD_0F1B_PREFIX_1
) },
3223 { "bndmov", { EbndS
, Gbnd
}, 0 },
3224 { "bndcn", { Gbnd
, Ev_bnd
}, 0 },
3229 { MOD_TABLE (MOD_0F1C_PREFIX_0
) },
3230 { "nopQ", { Ev
}, PREFIX_IGNORED
},
3231 { "nopQ", { Ev
}, 0 },
3232 { "nopQ", { Ev
}, PREFIX_IGNORED
},
3237 { "nopQ", { Ev
}, 0 },
3238 { MOD_TABLE (MOD_0F1E_PREFIX_1
) },
3239 { "nopQ", { Ev
}, 0 },
3240 { NULL
, { XX
}, PREFIX_IGNORED
},
3245 { "cvtpi2ps", { XM
, EMCq
}, PREFIX_OPCODE
},
3246 { "cvtsi2ss{%LQ|}", { XM
, Edq
}, PREFIX_OPCODE
},
3247 { "cvtpi2pd", { XM
, EMCq
}, PREFIX_OPCODE
},
3248 { "cvtsi2sd{%LQ|}", { XM
, Edq
}, 0 },
3253 { "movntps", { Mx
, XM
}, 0 },
3254 { "movntss", { Md
, XM
}, 0 },
3255 { "movntpd", { Mx
, XM
}, 0 },
3256 { "movntsd", { Mq
, XM
}, 0 },
3261 { "cvttps2pi", { MXC
, EXq
}, PREFIX_OPCODE
},
3262 { "cvttss2si", { Gdq
, EXd
}, PREFIX_OPCODE
},
3263 { "cvttpd2pi", { MXC
, EXx
}, PREFIX_OPCODE
},
3264 { "cvttsd2si", { Gdq
, EXq
}, PREFIX_OPCODE
},
3269 { "cvtps2pi", { MXC
, EXq
}, PREFIX_OPCODE
},
3270 { "cvtss2si", { Gdq
, EXd
}, PREFIX_OPCODE
},
3271 { "cvtpd2pi", { MXC
, EXx
}, PREFIX_OPCODE
},
3272 { "cvtsd2si", { Gdq
, EXq
}, PREFIX_OPCODE
},
3277 { "%XEVucomisYX", { XMScalar
, EXd
, EXxEVexS
}, 0 },
3279 { "%XEVucomisYX", { XMScalar
, EXq
, EXxEVexS
}, 0 },
3284 { "%XEVcomisYX", { XMScalar
, EXd
, EXxEVexS
}, 0 },
3286 { "%XEVcomisYX", { XMScalar
, EXq
, EXxEVexS
}, 0 },
3291 { "%XEVsqrtpX", { XM
, EXx
, EXxEVexR
}, 0 },
3292 { "%XEVsqrts%XS", { XMScalar
, VexScalar
, EXd
, EXxEVexR
}, 0 },
3293 { "%XEVsqrtpX", { XM
, EXx
, EXxEVexR
}, 0 },
3294 { "%XEVsqrts%XD", { XMScalar
, VexScalar
, EXq
, EXxEVexR
}, 0 },
3299 { "Vrsqrtps", { XM
, EXx
}, 0 },
3300 { "Vrsqrtss", { XMScalar
, VexScalar
, EXd
}, 0 },
3305 { "Vrcpps", { XM
, EXx
}, 0 },
3306 { "Vrcpss", { XMScalar
, VexScalar
, EXd
}, 0 },
3311 { "%XEVaddpX", { XM
, Vex
, EXx
, EXxEVexR
}, 0 },
3312 { "%XEVadds%XS", { XMScalar
, VexScalar
, EXd
, EXxEVexR
}, 0 },
3313 { "%XEVaddpX", { XM
, Vex
, EXx
, EXxEVexR
}, 0 },
3314 { "%XEVadds%XD", { XMScalar
, VexScalar
, EXq
, EXxEVexR
}, 0 },
3319 { "%XEVmulpX", { XM
, Vex
, EXx
, EXxEVexR
}, 0 },
3320 { "%XEVmuls%XS", { XMScalar
, VexScalar
, EXd
, EXxEVexR
}, 0 },
3321 { "%XEVmulpX", { XM
, Vex
, EXx
, EXxEVexR
}, 0 },
3322 { "%XEVmuls%XD", { XMScalar
, VexScalar
, EXq
, EXxEVexR
}, 0 },
3327 { "%XEVcvtp%XS2pd", { XM
, EXEvexHalfBcstXmmq
, EXxEVexS
}, 0 },
3328 { "%XEVcvts%XS2sd", { XMScalar
, VexScalar
, EXd
, EXxEVexS
}, 0 },
3329 { "%XEVcvtp%XD2ps%XY", { XMxmmq
, EXx
, EXxEVexR
}, 0 },
3330 { "%XEVcvts%XD2ss", { XMScalar
, VexScalar
, EXq
, EXxEVexR
}, 0 },
3335 { "Vcvtdq2ps", { XM
, EXx
}, 0 },
3336 { "Vcvttps2dq", { XM
, EXx
}, 0 },
3337 { "Vcvtps2dq", { XM
, EXx
}, 0 },
3342 { "%XEVsubpX", { XM
, Vex
, EXx
, EXxEVexR
}, 0 },
3343 { "%XEVsubs%XS", { XMScalar
, VexScalar
, EXd
, EXxEVexR
}, 0 },
3344 { "%XEVsubpX", { XM
, Vex
, EXx
, EXxEVexR
}, 0 },
3345 { "%XEVsubs%XD", { XMScalar
, VexScalar
, EXq
, EXxEVexR
}, 0 },
3350 { "%XEVminpX", { XM
, Vex
, EXx
, EXxEVexS
}, 0 },
3351 { "%XEVmins%XS", { XMScalar
, VexScalar
, EXd
, EXxEVexS
}, 0 },
3352 { "%XEVminpX", { XM
, Vex
, EXx
, EXxEVexS
}, 0 },
3353 { "%XEVmins%XD", { XMScalar
, VexScalar
, EXq
, EXxEVexS
}, 0 },
3358 { "%XEVdivpX", { XM
, Vex
, EXx
, EXxEVexR
}, 0 },
3359 { "%XEVdivs%XS", { XMScalar
, VexScalar
, EXd
, EXxEVexR
}, 0 },
3360 { "%XEVdivpX", { XM
, Vex
, EXx
, EXxEVexR
}, 0 },
3361 { "%XEVdivs%XD", { XMScalar
, VexScalar
, EXq
, EXxEVexR
}, 0 },
3366 { "%XEVmaxpX", { XM
, Vex
, EXx
, EXxEVexS
}, 0 },
3367 { "%XEVmaxs%XS", { XMScalar
, VexScalar
, EXd
, EXxEVexS
}, 0 },
3368 { "%XEVmaxpX", { XM
, Vex
, EXx
, EXxEVexS
}, 0 },
3369 { "%XEVmaxs%XD", { XMScalar
, VexScalar
, EXq
, EXxEVexS
}, 0 },
3374 { "punpcklbw",{ MX
, EMd
}, PREFIX_OPCODE
},
3376 { "punpcklbw",{ MX
, EMx
}, PREFIX_OPCODE
},
3381 { "punpcklwd",{ MX
, EMd
}, PREFIX_OPCODE
},
3383 { "punpcklwd",{ MX
, EMx
}, PREFIX_OPCODE
},
3388 { "punpckldq",{ MX
, EMd
}, PREFIX_OPCODE
},
3390 { "punpckldq",{ MX
, EMx
}, PREFIX_OPCODE
},
3395 { "movq", { MX
, EM
}, PREFIX_OPCODE
},
3396 { "movdqu", { XM
, EXx
}, PREFIX_OPCODE
},
3397 { "movdqa", { XM
, EXx
}, PREFIX_OPCODE
},
3402 { "pshufw", { MX
, EM
, Ib
}, PREFIX_OPCODE
},
3403 { "pshufhw",{ XM
, EXx
, Ib
}, PREFIX_OPCODE
},
3404 { "pshufd", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
3405 { "pshuflw",{ XM
, EXx
, Ib
}, PREFIX_OPCODE
},
3410 {"vmread", { Em
, Gm
}, 0 },
3412 {"extrq", { Uxmm
, Ib
, Ib
}, 0 },
3413 {"insertq", { XM
, Uxmm
, Ib
, Ib
}, 0 },
3418 {"vmwrite", { Gm
, Em
}, 0 },
3420 {"extrq", { XM
, Uxmm
}, 0 },
3421 {"insertq", { XM
, Uxmm
}, 0 },
3428 { "Vhaddpd", { XM
, Vex
, EXx
}, 0 },
3429 { "Vhaddps", { XM
, Vex
, EXx
}, 0 },
3436 { "Vhsubpd", { XM
, Vex
, EXx
}, 0 },
3437 { "Vhsubps", { XM
, Vex
, EXx
}, 0 },
3442 { "movK", { Edq
, MX
}, PREFIX_OPCODE
},
3443 { "movq", { XM
, EXq
}, PREFIX_OPCODE
},
3444 { "movK", { Edq
, XM
}, PREFIX_OPCODE
},
3449 { "movq", { EMS
, MX
}, PREFIX_OPCODE
},
3450 { "movdqu", { EXxS
, XM
}, PREFIX_OPCODE
},
3451 { "movdqa", { EXxS
, XM
}, PREFIX_OPCODE
},
3454 /* PREFIX_0FA6_REG_0 */
3457 { "montmul", { { MONTMUL_Fixup
, 0 } }, 0},
3459 { "sm2", { Skip_MODRM
}, 0 },
3462 /* PREFIX_0FA6_REG_5 */
3465 { "sm3", { Skip_MODRM
}, 0 },
3468 /* PREFIX_0FA7_REG_6 */
3471 { "sm4", { Skip_MODRM
}, 0 },
3474 /* PREFIX_0FAE_REG_0_MOD_3 */
3477 { "rdfsbase", { Ev
}, 0 },
3480 /* PREFIX_0FAE_REG_1_MOD_3 */
3483 { "rdgsbase", { Ev
}, 0 },
3486 /* PREFIX_0FAE_REG_2_MOD_3 */
3489 { "wrfsbase", { Ev
}, 0 },
3492 /* PREFIX_0FAE_REG_3_MOD_3 */
3495 { "wrgsbase", { Ev
}, 0 },
3498 /* PREFIX_0FAE_REG_4_MOD_0 */
3500 { "xsave", { FXSAVE
}, PREFIX_REX2_ILLEGAL
},
3501 { "ptwrite{%LQ|}", { Edq
}, 0 },
3504 /* PREFIX_0FAE_REG_4_MOD_3 */
3507 { "ptwrite{%LQ|}", { Edq
}, 0 },
3510 /* PREFIX_0FAE_REG_5_MOD_3 */
3512 { "lfence", { Skip_MODRM
}, 0 },
3513 { "incsspK", { Edq
}, PREFIX_OPCODE
},
3516 /* PREFIX_0FAE_REG_6_MOD_0 */
3518 { "xsaveopt", { FXSAVE
}, PREFIX_OPCODE
| PREFIX_REX2_ILLEGAL
},
3519 { "clrssbsy", { Mq
}, PREFIX_OPCODE
},
3520 { "clwb", { Mb
}, PREFIX_OPCODE
},
3523 /* PREFIX_0FAE_REG_6_MOD_3 */
3525 { RM_TABLE (RM_0FAE_REG_6_MOD_3_P_0
) },
3526 { "umonitor", { Eva
}, PREFIX_OPCODE
},
3527 { "tpause", { Edq
}, PREFIX_OPCODE
},
3528 { "umwait", { Edq
}, PREFIX_OPCODE
},
3531 /* PREFIX_0FAE_REG_7_MOD_0 */
3533 { "clflush", { Mb
}, 0 },
3535 { "clflushopt", { Mb
}, 0 },
3541 { "popcntS", { Gv
, Ev
}, 0 },
3546 { "bsfS", { Gv
, Ev
}, 0 },
3547 { "tzcntS", { Gv
, Ev
}, 0 },
3548 { "bsfS", { Gv
, Ev
}, 0 },
3553 { "bsrS", { Gv
, Ev
}, 0 },
3554 { "lzcntS", { Gv
, Ev
}, 0 },
3555 { "bsrS", { Gv
, Ev
}, 0 },
3560 { "VcmppX", { XM
, Vex
, EXx
, CMP
}, 0 },
3561 { "Vcmpss", { XMScalar
, VexScalar
, EXd
, CMP
}, 0 },
3562 { "VcmppX", { XM
, Vex
, EXx
, CMP
}, 0 },
3563 { "Vcmpsd", { XMScalar
, VexScalar
, EXq
, CMP
}, 0 },
3566 /* PREFIX_0FC7_REG_6_MOD_0 */
3568 { "vmptrld",{ Mq
}, 0 },
3569 { "vmxon", { Mq
}, 0 },
3570 { "vmclear",{ Mq
}, 0 },
3573 /* PREFIX_0FC7_REG_6_MOD_3 */
3575 { "rdrand", { Ev
}, 0 },
3576 { X86_64_TABLE (X86_64_0FC7_REG_6_MOD_3_PREFIX_1
) },
3577 { "rdrand", { Ev
}, 0 }
3580 /* PREFIX_0FC7_REG_7_MOD_3 */
3582 { "rdseed", { Ev
}, 0 },
3583 { "rdpid", { Em
}, 0 },
3584 { "rdseed", { Ev
}, 0 },
3591 { "VaddsubpX", { XM
, Vex
, EXx
}, 0 },
3592 { "VaddsubpX", { XM
, Vex
, EXx
}, 0 },
3598 { "movq2dq",{ XM
, Nq
}, 0 },
3599 { "movq", { EXqS
, XM
}, 0 },
3600 { "movdq2q",{ MX
, Ux
}, 0 },
3606 { "Vcvtdq2pd", { XM
, EXxmmq
}, 0 },
3607 { "Vcvttpd2dq%XY", { XMM
, EXx
}, 0 },
3608 { "Vcvtpd2dq%XY", { XMM
, EXx
}, 0 },
3613 { "movntq", { Mq
, MX
}, 0 },
3615 { "movntdq", { Mx
, XM
}, 0 },
3623 { "Vlddqu", { XM
, M
}, 0 },
3628 { "maskmovq", { MX
, Nq
}, PREFIX_OPCODE
},
3630 { "maskmovdqu", { XM
, Ux
}, PREFIX_OPCODE
},
3636 { REG_TABLE (REG_0F38D8_PREFIX_1
) },
3642 { MOD_TABLE (MOD_0F38DC_PREFIX_1
) },
3643 { "aesenc", { XM
, EXx
}, 0 },
3649 { "aesdec128kl", { XM
, M
}, 0 },
3650 { "aesenclast", { XM
, EXx
}, 0 },
3656 { "aesenc256kl", { XM
, M
}, 0 },
3657 { "aesdec", { XM
, EXx
}, 0 },
3663 { "aesdec256kl", { XM
, M
}, 0 },
3664 { "aesdeclast", { XM
, EXx
}, 0 },
3669 { "movbeS", { Gv
, Mv
}, PREFIX_OPCODE
},
3671 { "movbeS", { Gv
, Mv
}, PREFIX_OPCODE
},
3672 { "crc32A", { Gdq
, Eb
}, PREFIX_OPCODE
},
3677 { "movbeS", { Mv
, Gv
}, PREFIX_OPCODE
},
3679 { "movbeS", { Mv
, Gv
}, PREFIX_OPCODE
},
3680 { "crc32Q", { Gdq
, Ev
}, PREFIX_OPCODE
},
3685 { "wrssK", { M
, Gdq
}, 0 },
3686 { "adoxL", { VexGdq
, Gdq
, Edq
}, 0 },
3687 { "adcxL", { VexGdq
, Gdq
, Edq
}, 0 },
3691 /* PREFIX_0F38F8_M_0 */
3694 { "enqcmds", { Gva
, M
}, 0 },
3695 { "movdir64b", { Gva
, M
}, 0 },
3696 { "enqcmd", { Gva
, M
}, 0 },
3699 /* PREFIX_0F38F8_M_1_X86_64 */
3702 { "uwrmsr", { Gq
, Rq
}, 0 },
3704 { "urdmsr", { Rq
, Gq
}, 0 },
3710 { "encodekey128", { Gd
, Rd
}, 0 },
3716 { "encodekey256", { Gd
, Rd
}, 0 },
3721 { "aadd", { Mdq
, Gdq
}, 0 },
3722 { "axor", { Mdq
, Gdq
}, 0 },
3723 { "aand", { Mdq
, Gdq
}, 0 },
3724 { "aor", { Mdq
, Gdq
}, 0 },
3730 { REG_TABLE (REG_0F3A0F_P_1
) },
3733 /* PREFIX_VEX_0F12 */
3735 { VEX_LEN_TABLE (VEX_LEN_0F12_P_0
) },
3736 { "%XEvmov%XSldup", { XM
, EXEvexXNoBcst
}, 0 },
3737 { VEX_LEN_TABLE (VEX_LEN_0F12_P_2
) },
3738 { "%XEvmov%XDdup", { XM
, EXymmq
}, 0 },
3741 /* PREFIX_VEX_0F16 */
3743 { VEX_LEN_TABLE (VEX_LEN_0F16_P_0
) },
3744 { "%XEvmov%XShdup", { XM
, EXEvexXNoBcst
}, 0 },
3745 { VEX_LEN_TABLE (VEX_LEN_0F16_P_2
) },
3748 /* PREFIX_VEX_0F2A */
3751 { "%XEvcvtsi2ssY{%LQ|}", { XMScalar
, VexScalar
, EXxEVexR
, Edq
}, 0 },
3753 { "%XEvcvtsi2sdY{%LQ|}", { XMScalar
, VexScalar
, EXxEVexR64
, Edq
}, 0 },
3756 /* PREFIX_VEX_0F2C */
3759 { "%XEvcvttss2si", { Gdq
, EXd
, EXxEVexS
}, 0 },
3761 { "%XEvcvttsd2si", { Gdq
, EXq
, EXxEVexS
}, 0 },
3764 /* PREFIX_VEX_0F2D */
3767 { "%XEvcvtss2si", { Gdq
, EXd
, EXxEVexR
}, 0 },
3769 { "%XEvcvtsd2si", { Gdq
, EXq
, EXxEVexR
}, 0 },
3772 /* PREFIX_VEX_0F41_L_1_W_0 */
3774 { "kandw", { MaskG
, MaskVex
, MaskR
}, 0 },
3776 { "kandb", { MaskG
, MaskVex
, MaskR
}, 0 },
3779 /* PREFIX_VEX_0F41_L_1_W_1 */
3781 { "kandq", { MaskG
, MaskVex
, MaskR
}, 0 },
3783 { "kandd", { MaskG
, MaskVex
, MaskR
}, 0 },
3786 /* PREFIX_VEX_0F42_L_1_W_0 */
3788 { "kandnw", { MaskG
, MaskVex
, MaskR
}, 0 },
3790 { "kandnb", { MaskG
, MaskVex
, MaskR
}, 0 },
3793 /* PREFIX_VEX_0F42_L_1_W_1 */
3795 { "kandnq", { MaskG
, MaskVex
, MaskR
}, 0 },
3797 { "kandnd", { MaskG
, MaskVex
, MaskR
}, 0 },
3800 /* PREFIX_VEX_0F44_L_0_W_0 */
3802 { "knotw", { MaskG
, MaskR
}, 0 },
3804 { "knotb", { MaskG
, MaskR
}, 0 },
3807 /* PREFIX_VEX_0F44_L_0_W_1 */
3809 { "knotq", { MaskG
, MaskR
}, 0 },
3811 { "knotd", { MaskG
, MaskR
}, 0 },
3814 /* PREFIX_VEX_0F45_L_1_W_0 */
3816 { "korw", { MaskG
, MaskVex
, MaskR
}, 0 },
3818 { "korb", { MaskG
, MaskVex
, MaskR
}, 0 },
3821 /* PREFIX_VEX_0F45_L_1_W_1 */
3823 { "korq", { MaskG
, MaskVex
, MaskR
}, 0 },
3825 { "kord", { MaskG
, MaskVex
, MaskR
}, 0 },
3828 /* PREFIX_VEX_0F46_L_1_W_0 */
3830 { "kxnorw", { MaskG
, MaskVex
, MaskR
}, 0 },
3832 { "kxnorb", { MaskG
, MaskVex
, MaskR
}, 0 },
3835 /* PREFIX_VEX_0F46_L_1_W_1 */
3837 { "kxnorq", { MaskG
, MaskVex
, MaskR
}, 0 },
3839 { "kxnord", { MaskG
, MaskVex
, MaskR
}, 0 },
3842 /* PREFIX_VEX_0F47_L_1_W_0 */
3844 { "kxorw", { MaskG
, MaskVex
, MaskR
}, 0 },
3846 { "kxorb", { MaskG
, MaskVex
, MaskR
}, 0 },
3849 /* PREFIX_VEX_0F47_L_1_W_1 */
3851 { "kxorq", { MaskG
, MaskVex
, MaskR
}, 0 },
3853 { "kxord", { MaskG
, MaskVex
, MaskR
}, 0 },
3856 /* PREFIX_VEX_0F4A_L_1_W_0 */
3858 { "kaddw", { MaskG
, MaskVex
, MaskR
}, 0 },
3860 { "kaddb", { MaskG
, MaskVex
, MaskR
}, 0 },
3863 /* PREFIX_VEX_0F4A_L_1_W_1 */
3865 { "kaddq", { MaskG
, MaskVex
, MaskR
}, 0 },
3867 { "kaddd", { MaskG
, MaskVex
, MaskR
}, 0 },
3870 /* PREFIX_VEX_0F4B_L_1_W_0 */
3872 { "kunpckwd", { MaskG
, MaskVex
, MaskR
}, 0 },
3874 { "kunpckbw", { MaskG
, MaskVex
, MaskR
}, 0 },
3877 /* PREFIX_VEX_0F4B_L_1_W_1 */
3879 { "kunpckdq", { MaskG
, MaskVex
, MaskR
}, 0 },
3882 /* PREFIX_VEX_0F6F */
3885 { "vmovdqu", { XM
, EXx
}, 0 },
3886 { "vmovdqa", { XM
, EXx
}, 0 },
3889 /* PREFIX_VEX_0F70 */
3892 { "vpshufhw", { XM
, EXx
, Ib
}, 0 },
3893 { "vpshufd", { XM
, EXx
, Ib
}, 0 },
3894 { "vpshuflw", { XM
, EXx
, Ib
}, 0 },
3897 /* PREFIX_VEX_0F7E */
3900 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_1
) },
3901 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_2
) },
3904 /* PREFIX_VEX_0F7F */
3907 { "vmovdqu", { EXxS
, XM
}, 0 },
3908 { "vmovdqa", { EXxS
, XM
}, 0 },
3911 /* PREFIX_VEX_0F90_L_0_W_0 */
3913 { "%XEkmovw", { MaskG
, MaskE
}, 0 },
3915 { "%XEkmovb", { MaskG
, MaskBDE
}, 0 },
3918 /* PREFIX_VEX_0F90_L_0_W_1 */
3920 { "%XEkmovq", { MaskG
, MaskE
}, 0 },
3922 { "%XEkmovd", { MaskG
, MaskBDE
}, 0 },
3925 /* PREFIX_VEX_0F91_L_0_W_0 */
3927 { "%XEkmovw", { Mw
, MaskG
}, 0 },
3929 { "%XEkmovb", { Mb
, MaskG
}, 0 },
3932 /* PREFIX_VEX_0F91_L_0_W_1 */
3934 { "%XEkmovq", { Mq
, MaskG
}, 0 },
3936 { "%XEkmovd", { Md
, MaskG
}, 0 },
3939 /* PREFIX_VEX_0F92_L_0_W_0 */
3941 { "%XEkmovw", { MaskG
, Rdq
}, 0 },
3943 { "%XEkmovb", { MaskG
, Rdq
}, 0 },
3944 { "%XEkmovd", { MaskG
, Rdq
}, 0 },
3947 /* PREFIX_VEX_0F92_L_0_W_1 */
3952 { "%XEkmovK", { MaskG
, Rdq
}, 0 },
3955 /* PREFIX_VEX_0F93_L_0_W_0 */
3957 { "%XEkmovw", { Gdq
, MaskR
}, 0 },
3959 { "%XEkmovb", { Gdq
, MaskR
}, 0 },
3960 { "%XEkmovd", { Gdq
, MaskR
}, 0 },
3963 /* PREFIX_VEX_0F93_L_0_W_1 */
3968 { "%XEkmovK", { Gdq
, MaskR
}, 0 },
3971 /* PREFIX_VEX_0F98_L_0_W_0 */
3973 { "kortestw", { MaskG
, MaskR
}, 0 },
3975 { "kortestb", { MaskG
, MaskR
}, 0 },
3978 /* PREFIX_VEX_0F98_L_0_W_1 */
3980 { "kortestq", { MaskG
, MaskR
}, 0 },
3982 { "kortestd", { MaskG
, MaskR
}, 0 },
3985 /* PREFIX_VEX_0F99_L_0_W_0 */
3987 { "ktestw", { MaskG
, MaskR
}, 0 },
3989 { "ktestb", { MaskG
, MaskR
}, 0 },
3992 /* PREFIX_VEX_0F99_L_0_W_1 */
3994 { "ktestq", { MaskG
, MaskR
}, 0 },
3996 { "ktestd", { MaskG
, MaskR
}, 0 },
3999 /* PREFIX_VEX_0F3849_X86_64_L_0_W_0_M_0 */
4001 { "ldtilecfg", { M
}, 0 },
4003 { "sttilecfg", { M
}, 0 },
4006 /* PREFIX_VEX_0F3849_X86_64_L_0_W_0_M_1 */
4008 { REG_TABLE (REG_VEX_0F3849_X86_64_L_0_W_0_M_1_P_0
) },
4011 { RM_TABLE (RM_VEX_0F3849_X86_64_L_0_W_0_M_1_P_3
) },
4014 /* PREFIX_VEX_0F384B_X86_64_L_0_W_0 */
4017 { "tilestored", { MVexSIBMEM
, TMM
}, 0 },
4018 { "tileloaddt1", { TMM
, MVexSIBMEM
}, 0 },
4019 { "tileloadd", { TMM
, MVexSIBMEM
}, 0 },
4022 /* PREFIX_VEX_0F3850_W_0 */
4024 { "%XEvpdpbuud", { XM
, Vex
, EXx
}, 0 },
4025 { "%XEvpdpbsud", { XM
, Vex
, EXx
}, 0 },
4026 { "%XVvpdpbusd", { XM
, Vex
, EXx
}, 0 },
4027 { "%XEvpdpbssd", { XM
, Vex
, EXx
}, 0 },
4030 /* PREFIX_VEX_0F3851_W_0 */
4032 { "%XEvpdpbuuds", { XM
, Vex
, EXx
}, 0 },
4033 { "%XEvpdpbsuds", { XM
, Vex
, EXx
}, 0 },
4034 { "%XVvpdpbusds", { XM
, Vex
, EXx
}, 0 },
4035 { "%XEvpdpbssds", { XM
, Vex
, EXx
}, 0 },
4037 /* PREFIX_VEX_0F385C_X86_64_L_0_W_0 */
4040 { "tdpbf16ps", { TMM
, Rtmm
, VexTmm
}, 0 },
4042 { "tdpfp16ps", { TMM
, Rtmm
, VexTmm
}, 0 },
4045 /* PREFIX_VEX_0F385E_X86_64_L_0_W_0 */
4047 { "tdpbuud", {TMM
, Rtmm
, VexTmm
}, 0 },
4048 { "tdpbsud", {TMM
, Rtmm
, VexTmm
}, 0 },
4049 { "tdpbusd", {TMM
, Rtmm
, VexTmm
}, 0 },
4050 { "tdpbssd", {TMM
, Rtmm
, VexTmm
}, 0 },
4053 /* PREFIX_VEX_0F386C_X86_64_L_0_W_0 */
4055 { "tcmmrlfp16ps", { TMM
, Rtmm
, VexTmm
}, 0 },
4057 { "tcmmimfp16ps", { TMM
, Rtmm
, VexTmm
}, 0 },
4060 /* PREFIX_VEX_0F3872 */
4063 { VEX_W_TABLE (VEX_W_0F3872_P_1
) },
4066 /* PREFIX_VEX_0F38B0_W_0 */
4068 { "vcvtneoph2ps", { XM
, Mx
}, 0 },
4069 { "vcvtneebf162ps", { XM
, Mx
}, 0 },
4070 { "vcvtneeph2ps", { XM
, Mx
}, 0 },
4071 { "vcvtneobf162ps", { XM
, Mx
}, 0 },
4074 /* PREFIX_VEX_0F38B1_W_0 */
4077 { "vbcstnebf162ps", { XM
, Mw
}, 0 },
4078 { "vbcstnesh2ps", { XM
, Mw
}, 0 },
4081 /* PREFIX_VEX_0F38D2_W_0 */
4083 { "%XEvpdpwuud", { XM
, Vex
, EXx
}, 0 },
4084 { "%XEvpdpwsud", { XM
, Vex
, EXx
}, 0 },
4085 { "%XEvpdpwusd", { XM
, Vex
, EXx
}, 0 },
4088 /* PREFIX_VEX_0F38D3_W_0 */
4090 { "%XEvpdpwuuds", { XM
, Vex
, EXx
}, 0 },
4091 { "%XEvpdpwsuds", { XM
, Vex
, EXx
}, 0 },
4092 { "%XEvpdpwusds", { XM
, Vex
, EXx
}, 0 },
4095 /* PREFIX_VEX_0F38CB */
4100 { VEX_W_TABLE (VEX_W_0F38CB_P_3
) },
4103 /* PREFIX_VEX_0F38CC */
4108 { VEX_W_TABLE (VEX_W_0F38CC_P_3
) },
4111 /* PREFIX_VEX_0F38CD */
4116 { VEX_W_TABLE (VEX_W_0F38CD_P_3
) },
4119 /* PREFIX_VEX_0F38DA_W_0 */
4121 { VEX_LEN_TABLE (VEX_LEN_0F38DA_W_0_P_0
) },
4122 { "vsm4key4", { XM
, Vex
, EXx
}, 0 },
4123 { VEX_LEN_TABLE (VEX_LEN_0F38DA_W_0_P_2
) },
4124 { "vsm4rnds4", { XM
, Vex
, EXx
}, 0 },
4127 /* PREFIX_VEX_0F38F2_L_0 */
4129 { "%NFandnS", { Gdq
, VexGdq
, Edq
}, 0 },
4132 /* PREFIX_VEX_0F38F3_L_0 */
4134 { REG_TABLE (REG_VEX_0F38F3_L_0_P_0
) },
4137 /* PREFIX_VEX_0F38F5_L_0 */
4139 { "%NFbzhiS", { Gdq
, Edq
, VexGdq
}, 0 },
4140 { "%XEpextS", { Gdq
, VexGdq
, Edq
}, 0 },
4142 { "%XEpdepS", { Gdq
, VexGdq
, Edq
}, 0 },
4145 /* PREFIX_VEX_0F38F6_L_0 */
4150 { "%XEmulxS", { Gdq
, VexGdq
, Edq
}, 0 },
4153 /* PREFIX_VEX_0F38F7_L_0 */
4155 { "%NFbextrS", { Gdq
, Edq
, VexGdq
}, 0 },
4156 { "%XEsarxS", { Gdq
, Edq
, VexGdq
}, 0 },
4157 { "%XEshlxS", { Gdq
, Edq
, VexGdq
}, 0 },
4158 { "%XEshrxS", { Gdq
, Edq
, VexGdq
}, 0 },
4161 /* PREFIX_VEX_0F3AF0_L_0 */
4166 { "%XErorxS", { Gdq
, Edq
, Ib
}, 0 },
4169 /* PREFIX_VEX_MAP7_F8_L_0_W_0_R_0_X86_64 */
4172 { "uwrmsr", { Skip_MODRM
, Id
, Rq
}, 0 },
4174 { "urdmsr", { Rq
, Id
}, 0 },
4177 #include "i386-dis-evex-prefix.h"
4180 static const struct dis386 x86_64_table
[][2] = {
4183 { "pushP", { es
}, 0 },
4188 { "popP", { es
}, 0 },
4193 { "pushP", { cs
}, 0 },
4198 { "pushP", { ss
}, 0 },
4203 { "popP", { ss
}, 0 },
4208 { "pushP", { ds
}, 0 },
4213 { "popP", { ds
}, 0 },
4218 { "daa", { XX
}, 0 },
4223 { "das", { XX
}, 0 },
4228 { "aaa", { XX
}, 0 },
4233 { "aas", { XX
}, 0 },
4238 { "pushaP", { XX
}, 0 },
4243 { "popaP", { XX
}, 0 },
4248 { MOD_TABLE (MOD_62_32BIT
) },
4254 { "arplS", { Sv
, Gv
}, 0 },
4255 { "movs", { Gv
, { MOVSXD_Fixup
, movsxd_mode
} }, 0 },
4260 { "ins{R|}", { Yzr
, indirDX
}, 0 },
4261 { "ins{G|}", { Yzr
, indirDX
}, 0 },
4266 { "outs{R|}", { indirDXr
, Xz
}, 0 },
4267 { "outs{G|}", { indirDXr
, Xz
}, 0 },
4272 /* Opcode 0x82 is an alias of opcode 0x80 in 32-bit mode. */
4273 { REG_TABLE (REG_80
) },
4278 { "{l|}call{P|}", { Ap
}, 0 },
4283 { "retP", { Iw
, BND
}, 0 },
4284 { "ret@", { Iw
, BND
}, 0 },
4289 { "retP", { BND
}, 0 },
4290 { "ret@", { BND
}, 0 },
4295 { MOD_TABLE (MOD_C4_32BIT
) },
4296 { VEX_C4_TABLE () },
4301 { MOD_TABLE (MOD_C5_32BIT
) },
4302 { VEX_C5_TABLE () },
4307 { "into", { XX
}, 0 },
4312 { "aam", { Ib
}, 0 },
4317 { "aad", { Ib
}, 0 },
4322 { "callP", { Jv
, BND
}, 0 },
4323 { "call@", { Jv
, BND
}, PREFIX_REX2_ILLEGAL
}
4328 { "jmpP", { Jv
, BND
}, 0 },
4329 { "jmp@", { Jv
, BND
}, PREFIX_REX2_ILLEGAL
}
4334 { "{l|}jmp{P|}", { Ap
}, 0 },
4337 /* X86_64_0F00_REG_6 */
4340 { PREFIX_TABLE (PREFIX_0F00_REG_6_X86_64
) },
4343 /* X86_64_0F01_REG_0 */
4345 { "sgdt{Q|Q}", { M
}, 0 },
4346 { "sgdt", { M
}, 0 },
4349 /* X86_64_0F01_REG_0_MOD_3_RM_6_P_1 */
4352 { "wrmsrlist", { Skip_MODRM
}, 0 },
4355 /* X86_64_0F01_REG_0_MOD_3_RM_6_P_3 */
4358 { "rdmsrlist", { Skip_MODRM
}, 0 },
4361 /* X86_64_0F01_REG_0_MOD_3_RM_7_P_0 */
4364 { "pbndkb", { Skip_MODRM
}, 0 },
4367 /* X86_64_0F01_REG_1 */
4369 { "sidt{Q|Q}", { M
}, 0 },
4370 { "sidt", { M
}, 0 },
4373 /* X86_64_0F01_REG_1_RM_2_PREFIX_1 */
4376 { "eretu", { Skip_MODRM
}, 0 },
4379 /* X86_64_0F01_REG_1_RM_2_PREFIX_3 */
4382 { "erets", { Skip_MODRM
}, 0 },
4385 /* X86_64_0F01_REG_1_RM_5_PREFIX_2 */
4388 { "seamret", { Skip_MODRM
}, 0 },
4391 /* X86_64_0F01_REG_1_RM_6_PREFIX_2 */
4394 { "seamops", { Skip_MODRM
}, 0 },
4397 /* X86_64_0F01_REG_1_RM_7_PREFIX_2 */
4400 { "seamcall", { Skip_MODRM
}, 0 },
4403 /* X86_64_0F01_REG_2 */
4405 { "lgdt{Q|Q}", { M
}, 0 },
4406 { "lgdt", { M
}, 0 },
4409 /* X86_64_0F01_REG_3 */
4411 { "lidt{Q|Q}", { M
}, 0 },
4412 { "lidt", { M
}, 0 },
4415 /* X86_64_0F01_REG_5_MOD_3_RM_4_PREFIX_1 */
4418 { "uiret", { Skip_MODRM
}, 0 },
4421 /* X86_64_0F01_REG_5_MOD_3_RM_5_PREFIX_1 */
4424 { "testui", { Skip_MODRM
}, 0 },
4427 /* X86_64_0F01_REG_5_MOD_3_RM_6_PREFIX_1 */
4430 { "clui", { Skip_MODRM
}, 0 },
4433 /* X86_64_0F01_REG_5_MOD_3_RM_7_PREFIX_1 */
4436 { "stui", { Skip_MODRM
}, 0 },
4439 /* X86_64_0F01_REG_7_MOD_3_RM_5_PREFIX_1 */
4442 { "rmpquery", { Skip_MODRM
}, 0 },
4445 /* X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_1 */
4448 { "rmpadjust", { Skip_MODRM
}, 0 },
4451 /* X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3 */
4454 { "rmpupdate", { Skip_MODRM
}, 0 },
4457 /* X86_64_0F01_REG_7_MOD_3_RM_7_PREFIX_1 */
4460 { "psmash", { Skip_MODRM
}, 0 },
4463 /* X86_64_0F18_REG_6_MOD_0 */
4465 { "nopQ", { Ev
}, 0 },
4466 { PREFIX_TABLE (PREFIX_0F18_REG_6_MOD_0_X86_64
) },
4469 /* X86_64_0F18_REG_7_MOD_0 */
4471 { "nopQ", { Ev
}, 0 },
4472 { PREFIX_TABLE (PREFIX_0F18_REG_7_MOD_0_X86_64
) },
4477 { "movZ", { Em
, Td
}, 0 },
4482 { "movZ", { Td
, Em
}, 0 },
4486 /* X86_64_0F38F8_M_1 */
4488 { PREFIX_TABLE (PREFIX_0F38F8_M_1_X86_64
) },
4491 /* X86_64_0FC7_REG_6_MOD_3_PREFIX_1 */
4494 { "senduipi", { Eq
}, 0 },
4497 /* X86_64_VEX_0F3849 */
4500 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64
) },
4503 /* X86_64_VEX_0F384B */
4506 { VEX_LEN_TABLE (VEX_LEN_0F384B_X86_64
) },
4509 /* X86_64_VEX_0F385C */
4512 { VEX_LEN_TABLE (VEX_LEN_0F385C_X86_64
) },
4515 /* X86_64_VEX_0F385E */
4518 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64
) },
4521 /* X86_64_VEX_0F386C */
4524 { VEX_LEN_TABLE (VEX_LEN_0F386C_X86_64
) },
4527 /* X86_64_VEX_0F38Ex */
4530 { "%XEcmp%CCxadd", { Mdq
, Gdq
, VexGdq
}, PREFIX_DATA
},
4533 /* X86_64_VEX_MAP7_F8_L_0_W_0_R_0 */
4536 { PREFIX_TABLE (PREFIX_VEX_MAP7_F8_L_0_W_0_R_0_X86_64
) },
4540 static const struct dis386 three_byte_table
[][256] = {
4542 /* THREE_BYTE_0F38 */
4545 { "pshufb", { MX
, EM
}, PREFIX_OPCODE
},
4546 { "phaddw", { MX
, EM
}, PREFIX_OPCODE
},
4547 { "phaddd", { MX
, EM
}, PREFIX_OPCODE
},
4548 { "phaddsw", { MX
, EM
}, PREFIX_OPCODE
},
4549 { "pmaddubsw", { MX
, EM
}, PREFIX_OPCODE
},
4550 { "phsubw", { MX
, EM
}, PREFIX_OPCODE
},
4551 { "phsubd", { MX
, EM
}, PREFIX_OPCODE
},
4552 { "phsubsw", { MX
, EM
}, PREFIX_OPCODE
},
4554 { "psignb", { MX
, EM
}, PREFIX_OPCODE
},
4555 { "psignw", { MX
, EM
}, PREFIX_OPCODE
},
4556 { "psignd", { MX
, EM
}, PREFIX_OPCODE
},
4557 { "pmulhrsw", { MX
, EM
}, PREFIX_OPCODE
},
4563 { "pblendvb", { XM
, EXx
, XMM0
}, PREFIX_DATA
},
4567 { "blendvps", { XM
, EXx
, XMM0
}, PREFIX_DATA
},
4568 { "blendvpd", { XM
, EXx
, XMM0
}, PREFIX_DATA
},
4570 { "ptest", { XM
, EXx
}, PREFIX_DATA
},
4576 { "pabsb", { MX
, EM
}, PREFIX_OPCODE
},
4577 { "pabsw", { MX
, EM
}, PREFIX_OPCODE
},
4578 { "pabsd", { MX
, EM
}, PREFIX_OPCODE
},
4581 { "pmovsxbw", { XM
, EXq
}, PREFIX_DATA
},
4582 { "pmovsxbd", { XM
, EXd
}, PREFIX_DATA
},
4583 { "pmovsxbq", { XM
, EXw
}, PREFIX_DATA
},
4584 { "pmovsxwd", { XM
, EXq
}, PREFIX_DATA
},
4585 { "pmovsxwq", { XM
, EXd
}, PREFIX_DATA
},
4586 { "pmovsxdq", { XM
, EXq
}, PREFIX_DATA
},
4590 { "pmuldq", { XM
, EXx
}, PREFIX_DATA
},
4591 { "pcmpeqq", { XM
, EXx
}, PREFIX_DATA
},
4592 { "movntdqa", { XM
, Mx
}, PREFIX_DATA
},
4593 { "packusdw", { XM
, EXx
}, PREFIX_DATA
},
4599 { "pmovzxbw", { XM
, EXq
}, PREFIX_DATA
},
4600 { "pmovzxbd", { XM
, EXd
}, PREFIX_DATA
},
4601 { "pmovzxbq", { XM
, EXw
}, PREFIX_DATA
},
4602 { "pmovzxwd", { XM
, EXq
}, PREFIX_DATA
},
4603 { "pmovzxwq", { XM
, EXd
}, PREFIX_DATA
},
4604 { "pmovzxdq", { XM
, EXq
}, PREFIX_DATA
},
4606 { "pcmpgtq", { XM
, EXx
}, PREFIX_DATA
},
4608 { "pminsb", { XM
, EXx
}, PREFIX_DATA
},
4609 { "pminsd", { XM
, EXx
}, PREFIX_DATA
},
4610 { "pminuw", { XM
, EXx
}, PREFIX_DATA
},
4611 { "pminud", { XM
, EXx
}, PREFIX_DATA
},
4612 { "pmaxsb", { XM
, EXx
}, PREFIX_DATA
},
4613 { "pmaxsd", { XM
, EXx
}, PREFIX_DATA
},
4614 { "pmaxuw", { XM
, EXx
}, PREFIX_DATA
},
4615 { "pmaxud", { XM
, EXx
}, PREFIX_DATA
},
4617 { "pmulld", { XM
, EXx
}, PREFIX_DATA
},
4618 { "phminposuw", { XM
, EXx
}, PREFIX_DATA
},
4689 { "invept", { Gm
, Mo
}, PREFIX_DATA
},
4690 { "invvpid", { Gm
, Mo
}, PREFIX_DATA
},
4691 { "invpcid", { Gm
, M
}, PREFIX_DATA
},
4770 { "sha1nexte", { XM
, EXxmm
}, PREFIX_OPCODE
},
4771 { "sha1msg1", { XM
, EXxmm
}, PREFIX_OPCODE
},
4772 { "sha1msg2", { XM
, EXxmm
}, PREFIX_OPCODE
},
4773 { "sha256rnds2", { XM
, EXxmm
, XMM0
}, PREFIX_OPCODE
},
4774 { "sha256msg1", { XM
, EXxmm
}, PREFIX_OPCODE
},
4775 { "sha256msg2", { XM
, EXxmm
}, PREFIX_OPCODE
},
4777 { "gf2p8mulb", { XM
, EXxmm
}, PREFIX_DATA
},
4788 { PREFIX_TABLE (PREFIX_0F38D8
) },
4791 { "aesimc", { XM
, EXx
}, PREFIX_DATA
},
4792 { PREFIX_TABLE (PREFIX_0F38DC
) },
4793 { PREFIX_TABLE (PREFIX_0F38DD
) },
4794 { PREFIX_TABLE (PREFIX_0F38DE
) },
4795 { PREFIX_TABLE (PREFIX_0F38DF
) },
4815 { PREFIX_TABLE (PREFIX_0F38F0
) },
4816 { PREFIX_TABLE (PREFIX_0F38F1
) },
4820 { "wrussK", { M
, Gdq
}, PREFIX_DATA
},
4821 { PREFIX_TABLE (PREFIX_0F38F6
) },
4824 { MOD_TABLE (MOD_0F38F8
) },
4825 { "movdiri", { Mdq
, Gdq
}, PREFIX_OPCODE
},
4826 { PREFIX_TABLE (PREFIX_0F38FA
) },
4827 { PREFIX_TABLE (PREFIX_0F38FB
) },
4828 { PREFIX_TABLE (PREFIX_0F38FC
) },
4833 /* THREE_BYTE_0F3A */
4845 { "roundps", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4846 { "roundpd", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4847 { "roundss", { XM
, EXd
, Ib
}, PREFIX_DATA
},
4848 { "roundsd", { XM
, EXq
, Ib
}, PREFIX_DATA
},
4849 { "blendps", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4850 { "blendpd", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4851 { "pblendw", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4852 { "palignr", { MX
, EM
, Ib
}, PREFIX_OPCODE
},
4858 { "pextrb", { Edb
, XM
, Ib
}, PREFIX_DATA
},
4859 { "pextrw", { Edw
, XM
, Ib
}, PREFIX_DATA
},
4860 { "pextrK", { Edq
, XM
, Ib
}, PREFIX_DATA
},
4861 { "extractps", { Ed
, XM
, Ib
}, PREFIX_DATA
},
4872 { "pinsrb", { XM
, Edb
, Ib
}, PREFIX_DATA
},
4873 { "insertps", { XM
, EXd
, Ib
}, PREFIX_DATA
},
4874 { "pinsrK", { XM
, Edq
, Ib
}, PREFIX_DATA
},
4908 { "dpps", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4909 { "dppd", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4910 { "mpsadbw", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4912 { "pclmulqdq", { XM
, EXx
, PCLMUL
}, PREFIX_DATA
},
4944 { "pcmpestrm!%LQ", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4945 { "pcmpestri!%LQ", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4946 { "pcmpistrm", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4947 { "pcmpistri", { XM
, EXx
, Ib
}, PREFIX_DATA
},
5065 { "sha1rnds4", { XM
, EXxmm
, Ib
}, PREFIX_OPCODE
},
5067 { "gf2p8affineqb", { XM
, EXxmm
, Ib
}, PREFIX_DATA
},
5068 { "gf2p8affineinvqb", { XM
, EXxmm
, Ib
}, PREFIX_DATA
},
5086 { "aeskeygenassist", { XM
, EXx
, Ib
}, PREFIX_DATA
},
5106 { PREFIX_TABLE (PREFIX_0F3A0F
) },
5126 static const struct dis386 xop_table
[][256] = {
5279 { VEX_LEN_TABLE (VEX_LEN_XOP_08_85
) },
5280 { VEX_LEN_TABLE (VEX_LEN_XOP_08_86
) },
5281 { VEX_LEN_TABLE (VEX_LEN_XOP_08_87
) },
5289 { VEX_LEN_TABLE (VEX_LEN_XOP_08_8E
) },
5290 { VEX_LEN_TABLE (VEX_LEN_XOP_08_8F
) },
5297 { VEX_LEN_TABLE (VEX_LEN_XOP_08_95
) },
5298 { VEX_LEN_TABLE (VEX_LEN_XOP_08_96
) },
5299 { VEX_LEN_TABLE (VEX_LEN_XOP_08_97
) },
5307 { VEX_LEN_TABLE (VEX_LEN_XOP_08_9E
) },
5308 { VEX_LEN_TABLE (VEX_LEN_XOP_08_9F
) },
5312 { "vpcmov", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
5313 { VEX_LEN_TABLE (VEX_LEN_XOP_08_A3
) },
5316 { VEX_LEN_TABLE (VEX_LEN_XOP_08_A6
) },
5334 { VEX_LEN_TABLE (VEX_LEN_XOP_08_B6
) },
5346 { VEX_LEN_TABLE (VEX_LEN_XOP_08_C0
) },
5347 { VEX_LEN_TABLE (VEX_LEN_XOP_08_C1
) },
5348 { VEX_LEN_TABLE (VEX_LEN_XOP_08_C2
) },
5349 { VEX_LEN_TABLE (VEX_LEN_XOP_08_C3
) },
5359 { VEX_LEN_TABLE (VEX_LEN_XOP_08_CC
) },
5360 { VEX_LEN_TABLE (VEX_LEN_XOP_08_CD
) },
5361 { VEX_LEN_TABLE (VEX_LEN_XOP_08_CE
) },
5362 { VEX_LEN_TABLE (VEX_LEN_XOP_08_CF
) },
5395 { VEX_LEN_TABLE (VEX_LEN_XOP_08_EC
) },
5396 { VEX_LEN_TABLE (VEX_LEN_XOP_08_ED
) },
5397 { VEX_LEN_TABLE (VEX_LEN_XOP_08_EE
) },
5398 { VEX_LEN_TABLE (VEX_LEN_XOP_08_EF
) },
5422 { VEX_LEN_TABLE (VEX_LEN_XOP_09_01
) },
5423 { VEX_LEN_TABLE (VEX_LEN_XOP_09_02
) },
5441 { VEX_LEN_TABLE (VEX_LEN_XOP_09_12
) },
5565 { VEX_W_TABLE (VEX_W_XOP_09_80
) },
5566 { VEX_W_TABLE (VEX_W_XOP_09_81
) },
5567 { VEX_W_TABLE (VEX_W_XOP_09_82
) },
5568 { VEX_W_TABLE (VEX_W_XOP_09_83
) },
5583 { VEX_LEN_TABLE (VEX_LEN_XOP_09_90
) },
5584 { VEX_LEN_TABLE (VEX_LEN_XOP_09_91
) },
5585 { VEX_LEN_TABLE (VEX_LEN_XOP_09_92
) },
5586 { VEX_LEN_TABLE (VEX_LEN_XOP_09_93
) },
5587 { VEX_LEN_TABLE (VEX_LEN_XOP_09_94
) },
5588 { VEX_LEN_TABLE (VEX_LEN_XOP_09_95
) },
5589 { VEX_LEN_TABLE (VEX_LEN_XOP_09_96
) },
5590 { VEX_LEN_TABLE (VEX_LEN_XOP_09_97
) },
5592 { VEX_LEN_TABLE (VEX_LEN_XOP_09_98
) },
5593 { VEX_LEN_TABLE (VEX_LEN_XOP_09_99
) },
5594 { VEX_LEN_TABLE (VEX_LEN_XOP_09_9A
) },
5595 { VEX_LEN_TABLE (VEX_LEN_XOP_09_9B
) },
5638 { VEX_LEN_TABLE (VEX_LEN_XOP_09_C1
) },
5639 { VEX_LEN_TABLE (VEX_LEN_XOP_09_C2
) },
5640 { VEX_LEN_TABLE (VEX_LEN_XOP_09_C3
) },
5643 { VEX_LEN_TABLE (VEX_LEN_XOP_09_C6
) },
5644 { VEX_LEN_TABLE (VEX_LEN_XOP_09_C7
) },
5649 { VEX_LEN_TABLE (VEX_LEN_XOP_09_CB
) },
5656 { VEX_LEN_TABLE (VEX_LEN_XOP_09_D1
) },
5657 { VEX_LEN_TABLE (VEX_LEN_XOP_09_D2
) },
5658 { VEX_LEN_TABLE (VEX_LEN_XOP_09_D3
) },
5661 { VEX_LEN_TABLE (VEX_LEN_XOP_09_D6
) },
5662 { VEX_LEN_TABLE (VEX_LEN_XOP_09_D7
) },
5667 { VEX_LEN_TABLE (VEX_LEN_XOP_09_DB
) },
5674 { VEX_LEN_TABLE (VEX_LEN_XOP_09_E1
) },
5675 { VEX_LEN_TABLE (VEX_LEN_XOP_09_E2
) },
5676 { VEX_LEN_TABLE (VEX_LEN_XOP_09_E3
) },
5730 { "bextrS", { Gdq
, Edq
, Id
}, 0 },
5732 { VEX_LEN_TABLE (VEX_LEN_XOP_0A_12
) },
6002 static const struct dis386 vex_table
[][256] = {
6024 { PREFIX_TABLE (PREFIX_0F10
) },
6025 { PREFIX_TABLE (PREFIX_0F11
) },
6026 { PREFIX_TABLE (PREFIX_VEX_0F12
) },
6027 { VEX_LEN_TABLE (VEX_LEN_0F13
) },
6028 { "vunpcklpX", { XM
, Vex
, EXx
}, PREFIX_OPCODE
},
6029 { "vunpckhpX", { XM
, Vex
, EXx
}, PREFIX_OPCODE
},
6030 { PREFIX_TABLE (PREFIX_VEX_0F16
) },
6031 { VEX_LEN_TABLE (VEX_LEN_0F17
) },
6051 { "vmovapX", { XM
, EXx
}, PREFIX_OPCODE
},
6052 { "vmovapX", { EXxS
, XM
}, PREFIX_OPCODE
},
6053 { PREFIX_TABLE (PREFIX_VEX_0F2A
) },
6054 { "vmovntpX", { Mx
, XM
}, PREFIX_OPCODE
},
6055 { PREFIX_TABLE (PREFIX_VEX_0F2C
) },
6056 { PREFIX_TABLE (PREFIX_VEX_0F2D
) },
6057 { PREFIX_TABLE (PREFIX_0F2E
) },
6058 { PREFIX_TABLE (PREFIX_0F2F
) },
6079 { VEX_LEN_TABLE (VEX_LEN_0F41
) },
6080 { VEX_LEN_TABLE (VEX_LEN_0F42
) },
6082 { VEX_LEN_TABLE (VEX_LEN_0F44
) },
6083 { VEX_LEN_TABLE (VEX_LEN_0F45
) },
6084 { VEX_LEN_TABLE (VEX_LEN_0F46
) },
6085 { VEX_LEN_TABLE (VEX_LEN_0F47
) },
6089 { VEX_LEN_TABLE (VEX_LEN_0F4A
) },
6090 { VEX_LEN_TABLE (VEX_LEN_0F4B
) },
6096 { "vmovmskpX", { Gdq
, Ux
}, PREFIX_OPCODE
},
6097 { PREFIX_TABLE (PREFIX_0F51
) },
6098 { PREFIX_TABLE (PREFIX_0F52
) },
6099 { PREFIX_TABLE (PREFIX_0F53
) },
6100 { "vandpX", { XM
, Vex
, EXx
}, PREFIX_OPCODE
},
6101 { "vandnpX", { XM
, Vex
, EXx
}, PREFIX_OPCODE
},
6102 { "vorpX", { XM
, Vex
, EXx
}, PREFIX_OPCODE
},
6103 { "vxorpX", { XM
, Vex
, EXx
}, PREFIX_OPCODE
},
6105 { PREFIX_TABLE (PREFIX_0F58
) },
6106 { PREFIX_TABLE (PREFIX_0F59
) },
6107 { PREFIX_TABLE (PREFIX_0F5A
) },
6108 { PREFIX_TABLE (PREFIX_0F5B
) },
6109 { PREFIX_TABLE (PREFIX_0F5C
) },
6110 { PREFIX_TABLE (PREFIX_0F5D
) },
6111 { PREFIX_TABLE (PREFIX_0F5E
) },
6112 { PREFIX_TABLE (PREFIX_0F5F
) },
6114 { "vpunpcklbw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6115 { "vpunpcklwd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6116 { "vpunpckldq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6117 { "vpacksswb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6118 { "vpcmpgtb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6119 { "vpcmpgtw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6120 { "vpcmpgtd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6121 { "vpackuswb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6123 { "vpunpckhbw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6124 { "vpunpckhwd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6125 { "vpunpckhdq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6126 { "vpackssdw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6127 { "vpunpcklqdq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6128 { "vpunpckhqdq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6129 { VEX_LEN_TABLE (VEX_LEN_0F6E
) },
6130 { PREFIX_TABLE (PREFIX_VEX_0F6F
) },
6132 { PREFIX_TABLE (PREFIX_VEX_0F70
) },
6133 { REG_TABLE (REG_VEX_0F71
) },
6134 { REG_TABLE (REG_VEX_0F72
) },
6135 { REG_TABLE (REG_VEX_0F73
) },
6136 { "vpcmpeqb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6137 { "vpcmpeqw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6138 { "vpcmpeqd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6139 { VEX_LEN_TABLE (VEX_LEN_0F77
) },
6145 { PREFIX_TABLE (PREFIX_0F7C
) },
6146 { PREFIX_TABLE (PREFIX_0F7D
) },
6147 { PREFIX_TABLE (PREFIX_VEX_0F7E
) },
6148 { PREFIX_TABLE (PREFIX_VEX_0F7F
) },
6168 { VEX_LEN_TABLE (VEX_LEN_0F90
) },
6169 { VEX_LEN_TABLE (VEX_LEN_0F91
) },
6170 { VEX_LEN_TABLE (VEX_LEN_0F92
) },
6171 { VEX_LEN_TABLE (VEX_LEN_0F93
) },
6177 { VEX_LEN_TABLE (VEX_LEN_0F98
) },
6178 { VEX_LEN_TABLE (VEX_LEN_0F99
) },
6201 { REG_TABLE (REG_VEX_0FAE
) },
6224 { PREFIX_TABLE (PREFIX_0FC2
) },
6226 { VEX_LEN_TABLE (VEX_LEN_0FC4
) },
6227 { "vpextrw", { Gd
, Uxmm
, Ib
}, PREFIX_DATA
},
6228 { "vshufpX", { XM
, Vex
, EXx
, Ib
}, PREFIX_OPCODE
},
6240 { PREFIX_TABLE (PREFIX_0FD0
) },
6241 { "vpsrlw", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
6242 { "vpsrld", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
6243 { "vpsrlq", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
6244 { "vpaddq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6245 { "vpmullw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6246 { VEX_LEN_TABLE (VEX_LEN_0FD6
) },
6247 { "vpmovmskb", { Gdq
, Ux
}, PREFIX_DATA
},
6249 { "vpsubusb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6250 { "vpsubusw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6251 { "vpminub", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6252 { "vpand", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6253 { "vpaddusb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6254 { "vpaddusw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6255 { "vpmaxub", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6256 { "vpandn", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6258 { "vpavgb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6259 { "vpsraw", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
6260 { "vpsrad", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
6261 { "vpavgw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6262 { "vpmulhuw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6263 { "vpmulhw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6264 { PREFIX_TABLE (PREFIX_0FE6
) },
6265 { "vmovntdq", { Mx
, XM
}, PREFIX_DATA
},
6267 { "vpsubsb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6268 { "vpsubsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6269 { "vpminsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6270 { "vpor", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6271 { "vpaddsb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6272 { "vpaddsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6273 { "vpmaxsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6274 { "vpxor", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6276 { PREFIX_TABLE (PREFIX_0FF0
) },
6277 { "vpsllw", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
6278 { "vpslld", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
6279 { "vpsllq", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
6280 { "vpmuludq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6281 { "vpmaddwd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6282 { "vpsadbw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6283 { "vmaskmovdqu", { XM
, Uxmm
}, PREFIX_DATA
},
6285 { "vpsubb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6286 { "vpsubw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6287 { "vpsubd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6288 { "vpsubq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6289 { "vpaddb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6290 { "vpaddw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6291 { "vpaddd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6297 { "vpshufb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6298 { "vphaddw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6299 { "vphaddd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6300 { "vphaddsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6301 { "vpmaddubsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6302 { "vphsubw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6303 { "vphsubd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6304 { "vphsubsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6306 { "vpsignb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6307 { "vpsignw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6308 { "vpsignd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6309 { "vpmulhrsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6310 { VEX_W_TABLE (VEX_W_0F380C
) },
6311 { VEX_W_TABLE (VEX_W_0F380D
) },
6312 { VEX_W_TABLE (VEX_W_0F380E
) },
6313 { VEX_W_TABLE (VEX_W_0F380F
) },
6318 { VEX_W_TABLE (VEX_W_0F3813
) },
6321 { VEX_LEN_TABLE (VEX_LEN_0F3816
) },
6322 { "vptest", { XM
, EXx
}, PREFIX_DATA
},
6324 { VEX_W_TABLE (VEX_W_0F3818
) },
6325 { VEX_LEN_TABLE (VEX_LEN_0F3819
) },
6326 { VEX_LEN_TABLE (VEX_LEN_0F381A
) },
6328 { "vpabsb", { XM
, EXx
}, PREFIX_DATA
},
6329 { "vpabsw", { XM
, EXx
}, PREFIX_DATA
},
6330 { "vpabsd", { XM
, EXx
}, PREFIX_DATA
},
6333 { "vpmovsxbw", { XM
, EXxmmq
}, PREFIX_DATA
},
6334 { "vpmovsxbd", { XM
, EXxmmqd
}, PREFIX_DATA
},
6335 { "vpmovsxbq", { XM
, EXxmmdw
}, PREFIX_DATA
},
6336 { "vpmovsxwd", { XM
, EXxmmq
}, PREFIX_DATA
},
6337 { "vpmovsxwq", { XM
, EXxmmqd
}, PREFIX_DATA
},
6338 { "vpmovsxdq", { XM
, EXxmmq
}, PREFIX_DATA
},
6342 { "vpmuldq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6343 { "vpcmpeqq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6344 { "vmovntdqa", { XM
, Mx
}, PREFIX_DATA
},
6345 { "vpackusdw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6346 { VEX_W_TABLE (VEX_W_0F382C
) },
6347 { VEX_W_TABLE (VEX_W_0F382D
) },
6348 { VEX_W_TABLE (VEX_W_0F382E
) },
6349 { VEX_W_TABLE (VEX_W_0F382F
) },
6351 { "vpmovzxbw", { XM
, EXxmmq
}, PREFIX_DATA
},
6352 { "vpmovzxbd", { XM
, EXxmmqd
}, PREFIX_DATA
},
6353 { "vpmovzxbq", { XM
, EXxmmdw
}, PREFIX_DATA
},
6354 { "vpmovzxwd", { XM
, EXxmmq
}, PREFIX_DATA
},
6355 { "vpmovzxwq", { XM
, EXxmmqd
}, PREFIX_DATA
},
6356 { "vpmovzxdq", { XM
, EXxmmq
}, PREFIX_DATA
},
6357 { VEX_LEN_TABLE (VEX_LEN_0F3836
) },
6358 { "vpcmpgtq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6360 { "vpminsb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6361 { "vpminsd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6362 { "vpminuw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6363 { "vpminud", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6364 { "vpmaxsb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6365 { "vpmaxsd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6366 { "vpmaxuw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6367 { "vpmaxud", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6369 { "vpmulld", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6370 { VEX_LEN_TABLE (VEX_LEN_0F3841
) },
6374 { "vpsrlv%DQ", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6375 { VEX_W_TABLE (VEX_W_0F3846
) },
6376 { "vpsllv%DQ", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6379 { X86_64_TABLE (X86_64_VEX_0F3849
) },
6381 { X86_64_TABLE (X86_64_VEX_0F384B
) },
6387 { VEX_W_TABLE (VEX_W_0F3850
) },
6388 { VEX_W_TABLE (VEX_W_0F3851
) },
6389 { VEX_W_TABLE (VEX_W_0F3852
) },
6390 { VEX_W_TABLE (VEX_W_0F3853
) },
6396 { VEX_W_TABLE (VEX_W_0F3858
) },
6397 { VEX_W_TABLE (VEX_W_0F3859
) },
6398 { VEX_LEN_TABLE (VEX_LEN_0F385A
) },
6400 { X86_64_TABLE (X86_64_VEX_0F385C
) },
6402 { X86_64_TABLE (X86_64_VEX_0F385E
) },
6418 { X86_64_TABLE (X86_64_VEX_0F386C
) },
6425 { PREFIX_TABLE (PREFIX_VEX_0F3872
) },
6432 { VEX_W_TABLE (VEX_W_0F3878
) },
6433 { VEX_W_TABLE (VEX_W_0F3879
) },
6454 { "vpmaskmov%DQ", { XM
, Vex
, Mx
}, PREFIX_DATA
},
6456 { "vpmaskmov%DQ", { Mx
, Vex
, XM
}, PREFIX_DATA
},
6459 { "vpgatherd%DQ", { XM
, MVexVSIBDWpX
, VexGatherD
}, PREFIX_DATA
},
6460 { "vpgatherq%DQ", { XMGatherQ
, MVexVSIBQWpX
, VexGatherQ
}, PREFIX_DATA
},
6461 { "vgatherdp%XW", { XM
, MVexVSIBDWpX
, VexGatherD
}, PREFIX_DATA
},
6462 { "vgatherqp%XW", { XMGatherQ
, MVexVSIBQWpX
, VexGatherQ
}, PREFIX_DATA
},
6465 { "vfmaddsub132p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6466 { "vfmsubadd132p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6468 { "vfmadd132p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6469 { "vfmadd132s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6470 { "vfmsub132p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6471 { "vfmsub132s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6472 { "vfnmadd132p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6473 { "vfnmadd132s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6474 { "vfnmsub132p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6475 { "vfnmsub132s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6483 { "vfmaddsub213p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6484 { "vfmsubadd213p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6486 { "vfmadd213p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6487 { "vfmadd213s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6488 { "vfmsub213p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6489 { "vfmsub213s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6490 { "vfnmadd213p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6491 { "vfnmadd213s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6492 { "vfnmsub213p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6493 { "vfnmsub213s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6495 { VEX_W_TABLE (VEX_W_0F38B0
) },
6496 { VEX_W_TABLE (VEX_W_0F38B1
) },
6499 { VEX_W_TABLE (VEX_W_0F38B4
) },
6500 { VEX_W_TABLE (VEX_W_0F38B5
) },
6501 { "vfmaddsub231p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6502 { "vfmsubadd231p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6504 { "vfmadd231p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6505 { "vfmadd231s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6506 { "vfmsub231p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6507 { "vfmsub231s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6508 { "vfnmadd231p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6509 { "vfnmadd231s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6510 { "vfnmsub231p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6511 { "vfnmsub231s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6525 { PREFIX_TABLE (PREFIX_VEX_0F38CB
) },
6526 { PREFIX_TABLE (PREFIX_VEX_0F38CC
) },
6527 { PREFIX_TABLE (PREFIX_VEX_0F38CD
) },
6529 { VEX_W_TABLE (VEX_W_0F38CF
) },
6533 { VEX_W_TABLE (VEX_W_0F38D2
) },
6534 { VEX_W_TABLE (VEX_W_0F38D3
) },
6542 { VEX_W_TABLE (VEX_W_0F38DA
) },
6543 { VEX_LEN_TABLE (VEX_LEN_0F38DB
) },
6544 { "vaesenc", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6545 { "vaesenclast", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6546 { "vaesdec", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6547 { "vaesdeclast", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6549 { X86_64_TABLE (X86_64_VEX_0F38Ex
) },
6550 { X86_64_TABLE (X86_64_VEX_0F38Ex
) },
6551 { X86_64_TABLE (X86_64_VEX_0F38Ex
) },
6552 { X86_64_TABLE (X86_64_VEX_0F38Ex
) },
6553 { X86_64_TABLE (X86_64_VEX_0F38Ex
) },
6554 { X86_64_TABLE (X86_64_VEX_0F38Ex
) },
6555 { X86_64_TABLE (X86_64_VEX_0F38Ex
) },
6556 { X86_64_TABLE (X86_64_VEX_0F38Ex
) },
6558 { X86_64_TABLE (X86_64_VEX_0F38Ex
) },
6559 { X86_64_TABLE (X86_64_VEX_0F38Ex
) },
6560 { X86_64_TABLE (X86_64_VEX_0F38Ex
) },
6561 { X86_64_TABLE (X86_64_VEX_0F38Ex
) },
6562 { X86_64_TABLE (X86_64_VEX_0F38Ex
) },
6563 { X86_64_TABLE (X86_64_VEX_0F38Ex
) },
6564 { X86_64_TABLE (X86_64_VEX_0F38Ex
) },
6565 { X86_64_TABLE (X86_64_VEX_0F38Ex
) },
6569 { VEX_LEN_TABLE (VEX_LEN_0F38F2
) },
6570 { VEX_LEN_TABLE (VEX_LEN_0F38F3
) },
6572 { VEX_LEN_TABLE (VEX_LEN_0F38F5
) },
6573 { VEX_LEN_TABLE (VEX_LEN_0F38F6
) },
6574 { VEX_LEN_TABLE (VEX_LEN_0F38F7
) },
6588 { VEX_LEN_TABLE (VEX_LEN_0F3A00
) },
6589 { VEX_LEN_TABLE (VEX_LEN_0F3A01
) },
6590 { VEX_W_TABLE (VEX_W_0F3A02
) },
6592 { VEX_W_TABLE (VEX_W_0F3A04
) },
6593 { VEX_W_TABLE (VEX_W_0F3A05
) },
6594 { VEX_LEN_TABLE (VEX_LEN_0F3A06
) },
6597 { "vroundps", { XM
, EXx
, Ib
}, PREFIX_DATA
},
6598 { "vroundpd", { XM
, EXx
, Ib
}, PREFIX_DATA
},
6599 { "vroundss", { XMScalar
, VexScalar
, EXd
, Ib
}, PREFIX_DATA
},
6600 { "vroundsd", { XMScalar
, VexScalar
, EXq
, Ib
}, PREFIX_DATA
},
6601 { "vblendps", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
6602 { "vblendpd", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
6603 { "vpblendw", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
6604 { "vpalignr", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
6610 { VEX_LEN_TABLE (VEX_LEN_0F3A14
) },
6611 { VEX_LEN_TABLE (VEX_LEN_0F3A15
) },
6612 { VEX_LEN_TABLE (VEX_LEN_0F3A16
) },
6613 { VEX_LEN_TABLE (VEX_LEN_0F3A17
) },
6615 { VEX_LEN_TABLE (VEX_LEN_0F3A18
) },
6616 { VEX_LEN_TABLE (VEX_LEN_0F3A19
) },
6620 { VEX_W_TABLE (VEX_W_0F3A1D
) },
6624 { VEX_LEN_TABLE (VEX_LEN_0F3A20
) },
6625 { VEX_LEN_TABLE (VEX_LEN_0F3A21
) },
6626 { VEX_LEN_TABLE (VEX_LEN_0F3A22
) },
6642 { VEX_LEN_TABLE (VEX_LEN_0F3A30
) },
6643 { VEX_LEN_TABLE (VEX_LEN_0F3A31
) },
6644 { VEX_LEN_TABLE (VEX_LEN_0F3A32
) },
6645 { VEX_LEN_TABLE (VEX_LEN_0F3A33
) },
6651 { VEX_LEN_TABLE (VEX_LEN_0F3A38
) },
6652 { VEX_LEN_TABLE (VEX_LEN_0F3A39
) },
6660 { "vdpps", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
6661 { VEX_LEN_TABLE (VEX_LEN_0F3A41
) },
6662 { "vmpsadbw", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
6664 { "vpclmulqdq", { XM
, Vex
, EXx
, PCLMUL
}, PREFIX_DATA
},
6666 { VEX_LEN_TABLE (VEX_LEN_0F3A46
) },
6669 { "vpermil2ps", { XM
, Vex
, EXx
, XMVexI4
, VexI4
}, PREFIX_DATA
},
6670 { "vpermil2pd", { XM
, Vex
, EXx
, XMVexI4
, VexI4
}, PREFIX_DATA
},
6671 { VEX_W_TABLE (VEX_W_0F3A4A
) },
6672 { VEX_W_TABLE (VEX_W_0F3A4B
) },
6673 { VEX_W_TABLE (VEX_W_0F3A4C
) },
6691 { "vfmaddsubps", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6692 { "vfmaddsubpd", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6693 { "vfmsubaddps", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6694 { "vfmsubaddpd", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6696 { VEX_LEN_TABLE (VEX_LEN_0F3A60
) },
6697 { VEX_LEN_TABLE (VEX_LEN_0F3A61
) },
6698 { VEX_LEN_TABLE (VEX_LEN_0F3A62
) },
6699 { VEX_LEN_TABLE (VEX_LEN_0F3A63
) },
6705 { "vfmaddps", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6706 { "vfmaddpd", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6707 { "vfmaddss", { XMScalar
, VexScalar
, EXd
, XMVexScalarI4
}, PREFIX_DATA
},
6708 { "vfmaddsd", { XMScalar
, VexScalar
, EXq
, XMVexScalarI4
}, PREFIX_DATA
},
6709 { "vfmsubps", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6710 { "vfmsubpd", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6711 { "vfmsubss", { XMScalar
, VexScalar
, EXd
, XMVexScalarI4
}, PREFIX_DATA
},
6712 { "vfmsubsd", { XMScalar
, VexScalar
, EXq
, XMVexScalarI4
}, PREFIX_DATA
},
6723 { "vfnmaddps", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6724 { "vfnmaddpd", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6725 { "vfnmaddss", { XMScalar
, VexScalar
, EXd
, XMVexScalarI4
}, PREFIX_DATA
},
6726 { "vfnmaddsd", { XMScalar
, VexScalar
, EXq
, XMVexScalarI4
}, PREFIX_DATA
},
6727 { "vfnmsubps", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6728 { "vfnmsubpd", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6729 { "vfnmsubss", { XMScalar
, VexScalar
, EXd
, XMVexScalarI4
}, PREFIX_DATA
},
6730 { "vfnmsubsd", { XMScalar
, VexScalar
, EXq
, XMVexScalarI4
}, PREFIX_DATA
},
6819 { VEX_W_TABLE (VEX_W_0F3ACE
) },
6820 { VEX_W_TABLE (VEX_W_0F3ACF
) },
6837 { VEX_W_TABLE (VEX_W_0F3ADE
) },
6838 { VEX_LEN_TABLE (VEX_LEN_0F3ADF
) },
6858 { VEX_LEN_TABLE (VEX_LEN_0F3AF0
) },
6878 #include "i386-dis-evex.h"
6880 static const struct dis386 vex_len_table
[][2] = {
6881 /* VEX_LEN_0F12_P_0 */
6883 { MOD_TABLE (MOD_0F12_PREFIX_0
) },
6886 /* VEX_LEN_0F12_P_2 */
6888 { "%XEVmovlpYX", { XM
, Vex
, Mq
}, 0 },
6893 { "%XEVmovlpYX", { Mq
, XM
}, PREFIX_OPCODE
},
6896 /* VEX_LEN_0F16_P_0 */
6898 { MOD_TABLE (MOD_0F16_PREFIX_0
) },
6901 /* VEX_LEN_0F16_P_2 */
6903 { "%XEVmovhpYX", { XM
, Vex
, Mq
}, 0 },
6908 { "%XEVmovhpYX", { Mq
, XM
}, PREFIX_OPCODE
},
6914 { VEX_W_TABLE (VEX_W_0F41_L_1
) },
6920 { VEX_W_TABLE (VEX_W_0F42_L_1
) },
6925 { VEX_W_TABLE (VEX_W_0F44_L_0
) },
6931 { VEX_W_TABLE (VEX_W_0F45_L_1
) },
6937 { VEX_W_TABLE (VEX_W_0F46_L_1
) },
6943 { VEX_W_TABLE (VEX_W_0F47_L_1
) },
6949 { VEX_W_TABLE (VEX_W_0F4A_L_1
) },
6955 { VEX_W_TABLE (VEX_W_0F4B_L_1
) },
6960 { "%XEvmovYK", { XMScalar
, Edq
}, PREFIX_DATA
},
6965 { "vzeroupper", { XX
}, 0 },
6966 { "vzeroall", { XX
}, 0 },
6969 /* VEX_LEN_0F7E_P_1 */
6971 { "%XEvmovqY", { XMScalar
, EXq
}, 0 },
6974 /* VEX_LEN_0F7E_P_2 */
6976 { "%XEvmovK", { Edq
, XMScalar
}, 0 },
6981 { VEX_W_TABLE (VEX_W_0F90_L_0
) },
6986 { VEX_W_TABLE (VEX_W_0F91_L_0
) },
6991 { VEX_W_TABLE (VEX_W_0F92_L_0
) },
6996 { VEX_W_TABLE (VEX_W_0F93_L_0
) },
7001 { VEX_W_TABLE (VEX_W_0F98_L_0
) },
7006 { VEX_W_TABLE (VEX_W_0F99_L_0
) },
7009 /* VEX_LEN_0FAE_R_2 */
7011 { "vldmxcsr", { Md
}, 0 },
7014 /* VEX_LEN_0FAE_R_3 */
7016 { "vstmxcsr", { Md
}, 0 },
7021 { "%XEvpinsrwY", { XM
, Vex
, Edw
, Ib
}, PREFIX_DATA
},
7026 { "%XEvmovqY", { EXqS
, XMScalar
}, PREFIX_DATA
},
7029 /* VEX_LEN_0F3816 */
7032 { VEX_W_TABLE (VEX_W_0F3816_L_1
) },
7035 /* VEX_LEN_0F3819 */
7038 { VEX_W_TABLE (VEX_W_0F3819_L_1
) },
7041 /* VEX_LEN_0F381A */
7044 { VEX_W_TABLE (VEX_W_0F381A_L_1
) },
7047 /* VEX_LEN_0F3836 */
7050 { VEX_W_TABLE (VEX_W_0F3836
) },
7053 /* VEX_LEN_0F3841 */
7055 { "vphminposuw", { XM
, EXx
}, PREFIX_DATA
},
7058 /* VEX_LEN_0F3849_X86_64 */
7060 { VEX_W_TABLE (VEX_W_0F3849_X86_64_L_0
) },
7063 /* VEX_LEN_0F384B_X86_64 */
7065 { VEX_W_TABLE (VEX_W_0F384B_X86_64_L_0
) },
7068 /* VEX_LEN_0F385A */
7071 { VEX_W_TABLE (VEX_W_0F385A_L_0
) },
7074 /* VEX_LEN_0F385C_X86_64 */
7076 { VEX_W_TABLE (VEX_W_0F385C_X86_64_L_0
) },
7079 /* VEX_LEN_0F385E_X86_64 */
7081 { VEX_W_TABLE (VEX_W_0F385E_X86_64_L_0
) },
7084 /* VEX_LEN_0F386C_X86_64 */
7086 { VEX_W_TABLE (VEX_W_0F386C_X86_64_L_0
) },
7089 /* VEX_LEN_0F38CB_P_3_W_0 */
7092 { "vsha512rnds2", { XM
, Vex
, Rxmmq
}, 0 },
7095 /* VEX_LEN_0F38CC_P_3_W_0 */
7098 { "vsha512msg1", { XM
, Rxmmq
}, 0 },
7101 /* VEX_LEN_0F38CD_P_3_W_0 */
7104 { "vsha512msg2", { XM
, Rymm
}, 0 },
7107 /* VEX_LEN_0F38DA_W_0_P_0 */
7109 { "vsm3msg1", { XM
, Vex
, EXxmm
}, 0 },
7112 /* VEX_LEN_0F38DA_W_0_P_2 */
7114 { "vsm3msg2", { XM
, Vex
, EXxmm
}, 0 },
7117 /* VEX_LEN_0F38DB */
7119 { "vaesimc", { XM
, EXx
}, PREFIX_DATA
},
7122 /* VEX_LEN_0F38F2 */
7124 { PREFIX_TABLE (PREFIX_VEX_0F38F2_L_0
) },
7127 /* VEX_LEN_0F38F3 */
7129 { PREFIX_TABLE (PREFIX_VEX_0F38F3_L_0
) },
7132 /* VEX_LEN_0F38F5 */
7134 { PREFIX_TABLE(PREFIX_VEX_0F38F5_L_0
) },
7137 /* VEX_LEN_0F38F6 */
7139 { PREFIX_TABLE(PREFIX_VEX_0F38F6_L_0
) },
7142 /* VEX_LEN_0F38F7 */
7144 { PREFIX_TABLE(PREFIX_VEX_0F38F7_L_0
) },
7147 /* VEX_LEN_0F3A00 */
7150 { VEX_W_TABLE (VEX_W_0F3A00_L_1
) },
7153 /* VEX_LEN_0F3A01 */
7156 { VEX_W_TABLE (VEX_W_0F3A01_L_1
) },
7159 /* VEX_LEN_0F3A06 */
7162 { VEX_W_TABLE (VEX_W_0F3A06_L_1
) },
7165 /* VEX_LEN_0F3A14 */
7167 { "%XEvpextrb", { Edb
, XM
, Ib
}, PREFIX_DATA
},
7170 /* VEX_LEN_0F3A15 */
7172 { "%XEvpextrw", { Edw
, XM
, Ib
}, PREFIX_DATA
},
7175 /* VEX_LEN_0F3A16 */
7177 { "%XEvpextrK", { Edq
, XM
, Ib
}, PREFIX_DATA
},
7180 /* VEX_LEN_0F3A17 */
7182 { "%XEvextractps", { Ed
, XM
, Ib
}, PREFIX_DATA
},
7185 /* VEX_LEN_0F3A18 */
7188 { VEX_W_TABLE (VEX_W_0F3A18_L_1
) },
7191 /* VEX_LEN_0F3A19 */
7194 { VEX_W_TABLE (VEX_W_0F3A19_L_1
) },
7197 /* VEX_LEN_0F3A20 */
7199 { "%XEvpinsrbY", { XM
, Vex
, Edb
, Ib
}, PREFIX_DATA
},
7202 /* VEX_LEN_0F3A21 */
7204 { "%XEvinsertpsY", { XM
, Vex
, EXd
, Ib
}, PREFIX_DATA
},
7207 /* VEX_LEN_0F3A22 */
7209 { "%XEvpinsrYK", { XM
, Vex
, Edq
, Ib
}, PREFIX_DATA
},
7212 /* VEX_LEN_0F3A30 */
7214 { "kshiftr%BW", { MaskG
, MaskR
, Ib
}, PREFIX_DATA
},
7217 /* VEX_LEN_0F3A31 */
7219 { "kshiftr%DQ", { MaskG
, MaskR
, Ib
}, PREFIX_DATA
},
7222 /* VEX_LEN_0F3A32 */
7224 { "kshiftl%BW", { MaskG
, MaskR
, Ib
}, PREFIX_DATA
},
7227 /* VEX_LEN_0F3A33 */
7229 { "kshiftl%DQ", { MaskG
, MaskR
, Ib
}, PREFIX_DATA
},
7232 /* VEX_LEN_0F3A38 */
7235 { VEX_W_TABLE (VEX_W_0F3A38_L_1
) },
7238 /* VEX_LEN_0F3A39 */
7241 { VEX_W_TABLE (VEX_W_0F3A39_L_1
) },
7244 /* VEX_LEN_0F3A41 */
7246 { "vdppd", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
7249 /* VEX_LEN_0F3A46 */
7252 { VEX_W_TABLE (VEX_W_0F3A46_L_1
) },
7255 /* VEX_LEN_0F3A60 */
7257 { "vpcmpestrm!%LQ", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7260 /* VEX_LEN_0F3A61 */
7262 { "vpcmpestri!%LQ", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7265 /* VEX_LEN_0F3A62 */
7267 { "vpcmpistrm", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7270 /* VEX_LEN_0F3A63 */
7272 { "vpcmpistri", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7275 /* VEX_LEN_0F3ADE_W_0 */
7277 { "vsm3rnds2", { XM
, Vex
, EXxmm
, Ib
}, PREFIX_DATA
},
7280 /* VEX_LEN_0F3ADF */
7282 { "vaeskeygenassist", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7285 /* VEX_LEN_0F3AF0 */
7287 { PREFIX_TABLE (PREFIX_VEX_0F3AF0_L_0
) },
7290 /* VEX_LEN_MAP7_F8 */
7292 { VEX_W_TABLE (VEX_W_MAP7_F8_L_0
) },
7295 /* VEX_LEN_XOP_08_85 */
7297 { VEX_W_TABLE (VEX_W_XOP_08_85_L_0
) },
7300 /* VEX_LEN_XOP_08_86 */
7302 { VEX_W_TABLE (VEX_W_XOP_08_86_L_0
) },
7305 /* VEX_LEN_XOP_08_87 */
7307 { VEX_W_TABLE (VEX_W_XOP_08_87_L_0
) },
7310 /* VEX_LEN_XOP_08_8E */
7312 { VEX_W_TABLE (VEX_W_XOP_08_8E_L_0
) },
7315 /* VEX_LEN_XOP_08_8F */
7317 { VEX_W_TABLE (VEX_W_XOP_08_8F_L_0
) },
7320 /* VEX_LEN_XOP_08_95 */
7322 { VEX_W_TABLE (VEX_W_XOP_08_95_L_0
) },
7325 /* VEX_LEN_XOP_08_96 */
7327 { VEX_W_TABLE (VEX_W_XOP_08_96_L_0
) },
7330 /* VEX_LEN_XOP_08_97 */
7332 { VEX_W_TABLE (VEX_W_XOP_08_97_L_0
) },
7335 /* VEX_LEN_XOP_08_9E */
7337 { VEX_W_TABLE (VEX_W_XOP_08_9E_L_0
) },
7340 /* VEX_LEN_XOP_08_9F */
7342 { VEX_W_TABLE (VEX_W_XOP_08_9F_L_0
) },
7345 /* VEX_LEN_XOP_08_A3 */
7347 { "vpperm", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7350 /* VEX_LEN_XOP_08_A6 */
7352 { VEX_W_TABLE (VEX_W_XOP_08_A6_L_0
) },
7355 /* VEX_LEN_XOP_08_B6 */
7357 { VEX_W_TABLE (VEX_W_XOP_08_B6_L_0
) },
7360 /* VEX_LEN_XOP_08_C0 */
7362 { VEX_W_TABLE (VEX_W_XOP_08_C0_L_0
) },
7365 /* VEX_LEN_XOP_08_C1 */
7367 { VEX_W_TABLE (VEX_W_XOP_08_C1_L_0
) },
7370 /* VEX_LEN_XOP_08_C2 */
7372 { VEX_W_TABLE (VEX_W_XOP_08_C2_L_0
) },
7375 /* VEX_LEN_XOP_08_C3 */
7377 { VEX_W_TABLE (VEX_W_XOP_08_C3_L_0
) },
7380 /* VEX_LEN_XOP_08_CC */
7382 { VEX_W_TABLE (VEX_W_XOP_08_CC_L_0
) },
7385 /* VEX_LEN_XOP_08_CD */
7387 { VEX_W_TABLE (VEX_W_XOP_08_CD_L_0
) },
7390 /* VEX_LEN_XOP_08_CE */
7392 { VEX_W_TABLE (VEX_W_XOP_08_CE_L_0
) },
7395 /* VEX_LEN_XOP_08_CF */
7397 { VEX_W_TABLE (VEX_W_XOP_08_CF_L_0
) },
7400 /* VEX_LEN_XOP_08_EC */
7402 { VEX_W_TABLE (VEX_W_XOP_08_EC_L_0
) },
7405 /* VEX_LEN_XOP_08_ED */
7407 { VEX_W_TABLE (VEX_W_XOP_08_ED_L_0
) },
7410 /* VEX_LEN_XOP_08_EE */
7412 { VEX_W_TABLE (VEX_W_XOP_08_EE_L_0
) },
7415 /* VEX_LEN_XOP_08_EF */
7417 { VEX_W_TABLE (VEX_W_XOP_08_EF_L_0
) },
7420 /* VEX_LEN_XOP_09_01 */
7422 { REG_TABLE (REG_XOP_09_01_L_0
) },
7425 /* VEX_LEN_XOP_09_02 */
7427 { REG_TABLE (REG_XOP_09_02_L_0
) },
7430 /* VEX_LEN_XOP_09_12 */
7432 { REG_TABLE (REG_XOP_09_12_L_0
) },
7435 /* VEX_LEN_XOP_09_82_W_0 */
7437 { "vfrczss", { XM
, EXd
}, 0 },
7440 /* VEX_LEN_XOP_09_83_W_0 */
7442 { "vfrczsd", { XM
, EXq
}, 0 },
7445 /* VEX_LEN_XOP_09_90 */
7447 { "vprotb", { XM
, EXx
, VexW
}, 0 },
7450 /* VEX_LEN_XOP_09_91 */
7452 { "vprotw", { XM
, EXx
, VexW
}, 0 },
7455 /* VEX_LEN_XOP_09_92 */
7457 { "vprotd", { XM
, EXx
, VexW
}, 0 },
7460 /* VEX_LEN_XOP_09_93 */
7462 { "vprotq", { XM
, EXx
, VexW
}, 0 },
7465 /* VEX_LEN_XOP_09_94 */
7467 { "vpshlb", { XM
, EXx
, VexW
}, 0 },
7470 /* VEX_LEN_XOP_09_95 */
7472 { "vpshlw", { XM
, EXx
, VexW
}, 0 },
7475 /* VEX_LEN_XOP_09_96 */
7477 { "vpshld", { XM
, EXx
, VexW
}, 0 },
7480 /* VEX_LEN_XOP_09_97 */
7482 { "vpshlq", { XM
, EXx
, VexW
}, 0 },
7485 /* VEX_LEN_XOP_09_98 */
7487 { "vpshab", { XM
, EXx
, VexW
}, 0 },
7490 /* VEX_LEN_XOP_09_99 */
7492 { "vpshaw", { XM
, EXx
, VexW
}, 0 },
7495 /* VEX_LEN_XOP_09_9A */
7497 { "vpshad", { XM
, EXx
, VexW
}, 0 },
7500 /* VEX_LEN_XOP_09_9B */
7502 { "vpshaq", { XM
, EXx
, VexW
}, 0 },
7505 /* VEX_LEN_XOP_09_C1 */
7507 { VEX_W_TABLE (VEX_W_XOP_09_C1_L_0
) },
7510 /* VEX_LEN_XOP_09_C2 */
7512 { VEX_W_TABLE (VEX_W_XOP_09_C2_L_0
) },
7515 /* VEX_LEN_XOP_09_C3 */
7517 { VEX_W_TABLE (VEX_W_XOP_09_C3_L_0
) },
7520 /* VEX_LEN_XOP_09_C6 */
7522 { VEX_W_TABLE (VEX_W_XOP_09_C6_L_0
) },
7525 /* VEX_LEN_XOP_09_C7 */
7527 { VEX_W_TABLE (VEX_W_XOP_09_C7_L_0
) },
7530 /* VEX_LEN_XOP_09_CB */
7532 { VEX_W_TABLE (VEX_W_XOP_09_CB_L_0
) },
7535 /* VEX_LEN_XOP_09_D1 */
7537 { VEX_W_TABLE (VEX_W_XOP_09_D1_L_0
) },
7540 /* VEX_LEN_XOP_09_D2 */
7542 { VEX_W_TABLE (VEX_W_XOP_09_D2_L_0
) },
7545 /* VEX_LEN_XOP_09_D3 */
7547 { VEX_W_TABLE (VEX_W_XOP_09_D3_L_0
) },
7550 /* VEX_LEN_XOP_09_D6 */
7552 { VEX_W_TABLE (VEX_W_XOP_09_D6_L_0
) },
7555 /* VEX_LEN_XOP_09_D7 */
7557 { VEX_W_TABLE (VEX_W_XOP_09_D7_L_0
) },
7560 /* VEX_LEN_XOP_09_DB */
7562 { VEX_W_TABLE (VEX_W_XOP_09_DB_L_0
) },
7565 /* VEX_LEN_XOP_09_E1 */
7567 { VEX_W_TABLE (VEX_W_XOP_09_E1_L_0
) },
7570 /* VEX_LEN_XOP_09_E2 */
7572 { VEX_W_TABLE (VEX_W_XOP_09_E2_L_0
) },
7575 /* VEX_LEN_XOP_09_E3 */
7577 { VEX_W_TABLE (VEX_W_XOP_09_E3_L_0
) },
7580 /* VEX_LEN_XOP_0A_12 */
7582 { REG_TABLE (REG_XOP_0A_12_L_0
) },
7586 #include "i386-dis-evex-len.h"
7588 static const struct dis386 vex_w_table
[][2] = {
7590 /* VEX_W_0F41_L_1_M_1 */
7591 { PREFIX_TABLE (PREFIX_VEX_0F41_L_1_W_0
) },
7592 { PREFIX_TABLE (PREFIX_VEX_0F41_L_1_W_1
) },
7595 /* VEX_W_0F42_L_1_M_1 */
7596 { PREFIX_TABLE (PREFIX_VEX_0F42_L_1_W_0
) },
7597 { PREFIX_TABLE (PREFIX_VEX_0F42_L_1_W_1
) },
7600 /* VEX_W_0F44_L_0_M_1 */
7601 { PREFIX_TABLE (PREFIX_VEX_0F44_L_0_W_0
) },
7602 { PREFIX_TABLE (PREFIX_VEX_0F44_L_0_W_1
) },
7605 /* VEX_W_0F45_L_1_M_1 */
7606 { PREFIX_TABLE (PREFIX_VEX_0F45_L_1_W_0
) },
7607 { PREFIX_TABLE (PREFIX_VEX_0F45_L_1_W_1
) },
7610 /* VEX_W_0F46_L_1_M_1 */
7611 { PREFIX_TABLE (PREFIX_VEX_0F46_L_1_W_0
) },
7612 { PREFIX_TABLE (PREFIX_VEX_0F46_L_1_W_1
) },
7615 /* VEX_W_0F47_L_1_M_1 */
7616 { PREFIX_TABLE (PREFIX_VEX_0F47_L_1_W_0
) },
7617 { PREFIX_TABLE (PREFIX_VEX_0F47_L_1_W_1
) },
7620 /* VEX_W_0F4A_L_1_M_1 */
7621 { PREFIX_TABLE (PREFIX_VEX_0F4A_L_1_W_0
) },
7622 { PREFIX_TABLE (PREFIX_VEX_0F4A_L_1_W_1
) },
7625 /* VEX_W_0F4B_L_1_M_1 */
7626 { PREFIX_TABLE (PREFIX_VEX_0F4B_L_1_W_0
) },
7627 { PREFIX_TABLE (PREFIX_VEX_0F4B_L_1_W_1
) },
7630 /* VEX_W_0F90_L_0 */
7631 { PREFIX_TABLE (PREFIX_VEX_0F90_L_0_W_0
) },
7632 { PREFIX_TABLE (PREFIX_VEX_0F90_L_0_W_1
) },
7635 /* VEX_W_0F91_L_0_M_0 */
7636 { PREFIX_TABLE (PREFIX_VEX_0F91_L_0_W_0
) },
7637 { PREFIX_TABLE (PREFIX_VEX_0F91_L_0_W_1
) },
7640 /* VEX_W_0F92_L_0_M_1 */
7641 { PREFIX_TABLE (PREFIX_VEX_0F92_L_0_W_0
) },
7642 { PREFIX_TABLE (PREFIX_VEX_0F92_L_0_W_1
) },
7645 /* VEX_W_0F93_L_0_M_1 */
7646 { PREFIX_TABLE (PREFIX_VEX_0F93_L_0_W_0
) },
7647 { PREFIX_TABLE (PREFIX_VEX_0F93_L_0_W_1
) },
7650 /* VEX_W_0F98_L_0_M_1 */
7651 { PREFIX_TABLE (PREFIX_VEX_0F98_L_0_W_0
) },
7652 { PREFIX_TABLE (PREFIX_VEX_0F98_L_0_W_1
) },
7655 /* VEX_W_0F99_L_0_M_1 */
7656 { PREFIX_TABLE (PREFIX_VEX_0F99_L_0_W_0
) },
7657 { PREFIX_TABLE (PREFIX_VEX_0F99_L_0_W_1
) },
7661 { "%XEvpermilps", { XM
, Vex
, EXx
}, PREFIX_DATA
},
7665 { "vpermilpd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
7669 { "vtestps", { XM
, EXx
}, PREFIX_DATA
},
7673 { "vtestpd", { XM
, EXx
}, PREFIX_DATA
},
7677 { "vcvtph2ps", { XM
, EXxmmq
}, PREFIX_DATA
},
7680 /* VEX_W_0F3816_L_1 */
7681 { "vpermps", { XM
, Vex
, EXx
}, PREFIX_DATA
},
7685 { "%XEvbroadcastss", { XM
, EXd
}, PREFIX_DATA
},
7688 /* VEX_W_0F3819_L_1 */
7689 { "vbroadcastsd", { XM
, EXq
}, PREFIX_DATA
},
7692 /* VEX_W_0F381A_L_1 */
7693 { "vbroadcastf128", { XM
, Mxmm
}, PREFIX_DATA
},
7697 { "vmaskmovps", { XM
, Vex
, Mx
}, PREFIX_DATA
},
7701 { "vmaskmovpd", { XM
, Vex
, Mx
}, PREFIX_DATA
},
7705 { "vmaskmovps", { Mx
, Vex
, XM
}, PREFIX_DATA
},
7709 { "vmaskmovpd", { Mx
, Vex
, XM
}, PREFIX_DATA
},
7713 { "vpermd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
7717 { "vpsravd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
7720 /* VEX_W_0F3849_X86_64_L_0 */
7721 { MOD_TABLE (MOD_VEX_0F3849_X86_64_L_0_W_0
) },
7724 /* VEX_W_0F384B_X86_64_L_0 */
7725 { PREFIX_TABLE (PREFIX_VEX_0F384B_X86_64_L_0_W_0
) },
7729 { PREFIX_TABLE (PREFIX_VEX_0F3850_W_0
) },
7733 { PREFIX_TABLE (PREFIX_VEX_0F3851_W_0
) },
7737 { "%XVvpdpwssd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
7741 { "%XVvpdpwssds", { XM
, Vex
, EXx
}, PREFIX_DATA
},
7745 { "%XEvpbroadcastd", { XM
, EXd
}, PREFIX_DATA
},
7749 { "vpbroadcastq", { XM
, EXq
}, PREFIX_DATA
},
7752 /* VEX_W_0F385A_L_0 */
7753 { "vbroadcasti128", { XM
, Mxmm
}, PREFIX_DATA
},
7756 /* VEX_W_0F385C_X86_64_L_0 */
7757 { PREFIX_TABLE (PREFIX_VEX_0F385C_X86_64_L_0_W_0
) },
7760 /* VEX_W_0F385E_X86_64_L_0 */
7761 { PREFIX_TABLE (PREFIX_VEX_0F385E_X86_64_L_0_W_0
) },
7764 /* VEX_W_0F386C_X86_64_L_0 */
7765 { PREFIX_TABLE (PREFIX_VEX_0F386C_X86_64_L_0_W_0
) },
7768 /* VEX_W_0F3872_P_1 */
7769 { "%XVvcvtneps2bf16%XY", { XMM
, EXx
}, 0 },
7773 { "%XEvpbroadcastb", { XM
, EXb
}, PREFIX_DATA
},
7777 { "%XEvpbroadcastw", { XM
, EXw
}, PREFIX_DATA
},
7781 { PREFIX_TABLE (PREFIX_VEX_0F38B0_W_0
) },
7785 { PREFIX_TABLE (PREFIX_VEX_0F38B1_W_0
) },
7790 { "%XVvpmadd52luq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
7795 { "%XVvpmadd52huq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
7798 /* VEX_W_0F38CB_P_3 */
7799 { VEX_LEN_TABLE (VEX_LEN_0F38CB_P_3_W_0
) },
7802 /* VEX_W_0F38CC_P_3 */
7803 { VEX_LEN_TABLE (VEX_LEN_0F38CC_P_3_W_0
) },
7806 /* VEX_W_0F38CD_P_3 */
7807 { VEX_LEN_TABLE (VEX_LEN_0F38CD_P_3_W_0
) },
7811 { "%XEvgf2p8mulb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
7815 { PREFIX_TABLE (PREFIX_VEX_0F38D2_W_0
) },
7819 { PREFIX_TABLE (PREFIX_VEX_0F38D3_W_0
) },
7823 { PREFIX_TABLE (PREFIX_VEX_0F38DA_W_0
) },
7826 /* VEX_W_0F3A00_L_1 */
7828 { "%XEvpermq", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7831 /* VEX_W_0F3A01_L_1 */
7833 { "%XEvpermpd", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7837 { "vpblendd", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
7841 { "%XEvpermilps", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7845 { "vpermilpd", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7848 /* VEX_W_0F3A06_L_1 */
7849 { "vperm2f128", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
7852 /* VEX_W_0F3A18_L_1 */
7853 { "vinsertf128", { XM
, Vex
, EXxmm
, Ib
}, PREFIX_DATA
},
7856 /* VEX_W_0F3A19_L_1 */
7857 { "vextractf128", { EXxmm
, XM
, Ib
}, PREFIX_DATA
},
7861 { "%XEvcvtps2ph", { EXxmmq
, XM
, EXxEVexS
, Ib
}, PREFIX_DATA
},
7864 /* VEX_W_0F3A38_L_1 */
7865 { "vinserti128", { XM
, Vex
, EXxmm
, Ib
}, PREFIX_DATA
},
7868 /* VEX_W_0F3A39_L_1 */
7869 { "vextracti128", { EXxmm
, XM
, Ib
}, PREFIX_DATA
},
7872 /* VEX_W_0F3A46_L_1 */
7873 { "vperm2i128", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
7877 { "vblendvps", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
7881 { "vblendvpd", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
7885 { "vpblendvb", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
7890 { "%XEvgf2p8affineqb", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
7895 { "%XEvgf2p8affineinvqb", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
7899 { VEX_LEN_TABLE (VEX_LEN_0F3ADE_W_0
) },
7902 /* VEX_W_MAP7_F8_L_0 */
7903 { REG_TABLE (REG_VEX_MAP7_F8_L_0_W_0
) },
7905 /* VEX_W_XOP_08_85_L_0 */
7907 { "vpmacssww", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7909 /* VEX_W_XOP_08_86_L_0 */
7911 { "vpmacsswd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7913 /* VEX_W_XOP_08_87_L_0 */
7915 { "vpmacssdql", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7917 /* VEX_W_XOP_08_8E_L_0 */
7919 { "vpmacssdd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7921 /* VEX_W_XOP_08_8F_L_0 */
7923 { "vpmacssdqh", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7925 /* VEX_W_XOP_08_95_L_0 */
7927 { "vpmacsww", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7929 /* VEX_W_XOP_08_96_L_0 */
7931 { "vpmacswd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7933 /* VEX_W_XOP_08_97_L_0 */
7935 { "vpmacsdql", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7937 /* VEX_W_XOP_08_9E_L_0 */
7939 { "vpmacsdd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7941 /* VEX_W_XOP_08_9F_L_0 */
7943 { "vpmacsdqh", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7945 /* VEX_W_XOP_08_A6_L_0 */
7947 { "vpmadcsswd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7949 /* VEX_W_XOP_08_B6_L_0 */
7951 { "vpmadcswd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7953 /* VEX_W_XOP_08_C0_L_0 */
7955 { "vprotb", { XM
, EXx
, Ib
}, 0 },
7957 /* VEX_W_XOP_08_C1_L_0 */
7959 { "vprotw", { XM
, EXx
, Ib
}, 0 },
7961 /* VEX_W_XOP_08_C2_L_0 */
7963 { "vprotd", { XM
, EXx
, Ib
}, 0 },
7965 /* VEX_W_XOP_08_C3_L_0 */
7967 { "vprotq", { XM
, EXx
, Ib
}, 0 },
7969 /* VEX_W_XOP_08_CC_L_0 */
7971 { "vpcomb", { XM
, Vex
, EXx
, VPCOM
}, 0 },
7973 /* VEX_W_XOP_08_CD_L_0 */
7975 { "vpcomw", { XM
, Vex
, EXx
, VPCOM
}, 0 },
7977 /* VEX_W_XOP_08_CE_L_0 */
7979 { "vpcomd", { XM
, Vex
, EXx
, VPCOM
}, 0 },
7981 /* VEX_W_XOP_08_CF_L_0 */
7983 { "vpcomq", { XM
, Vex
, EXx
, VPCOM
}, 0 },
7985 /* VEX_W_XOP_08_EC_L_0 */
7987 { "vpcomub", { XM
, Vex
, EXx
, VPCOM
}, 0 },
7989 /* VEX_W_XOP_08_ED_L_0 */
7991 { "vpcomuw", { XM
, Vex
, EXx
, VPCOM
}, 0 },
7993 /* VEX_W_XOP_08_EE_L_0 */
7995 { "vpcomud", { XM
, Vex
, EXx
, VPCOM
}, 0 },
7997 /* VEX_W_XOP_08_EF_L_0 */
7999 { "vpcomuq", { XM
, Vex
, EXx
, VPCOM
}, 0 },
8001 /* VEX_W_XOP_09_80 */
8003 { "vfrczps", { XM
, EXx
}, 0 },
8005 /* VEX_W_XOP_09_81 */
8007 { "vfrczpd", { XM
, EXx
}, 0 },
8009 /* VEX_W_XOP_09_82 */
8011 { VEX_LEN_TABLE (VEX_LEN_XOP_09_82_W_0
) },
8013 /* VEX_W_XOP_09_83 */
8015 { VEX_LEN_TABLE (VEX_LEN_XOP_09_83_W_0
) },
8017 /* VEX_W_XOP_09_C1_L_0 */
8019 { "vphaddbw", { XM
, EXxmm
}, 0 },
8021 /* VEX_W_XOP_09_C2_L_0 */
8023 { "vphaddbd", { XM
, EXxmm
}, 0 },
8025 /* VEX_W_XOP_09_C3_L_0 */
8027 { "vphaddbq", { XM
, EXxmm
}, 0 },
8029 /* VEX_W_XOP_09_C6_L_0 */
8031 { "vphaddwd", { XM
, EXxmm
}, 0 },
8033 /* VEX_W_XOP_09_C7_L_0 */
8035 { "vphaddwq", { XM
, EXxmm
}, 0 },
8037 /* VEX_W_XOP_09_CB_L_0 */
8039 { "vphadddq", { XM
, EXxmm
}, 0 },
8041 /* VEX_W_XOP_09_D1_L_0 */
8043 { "vphaddubw", { XM
, EXxmm
}, 0 },
8045 /* VEX_W_XOP_09_D2_L_0 */
8047 { "vphaddubd", { XM
, EXxmm
}, 0 },
8049 /* VEX_W_XOP_09_D3_L_0 */
8051 { "vphaddubq", { XM
, EXxmm
}, 0 },
8053 /* VEX_W_XOP_09_D6_L_0 */
8055 { "vphadduwd", { XM
, EXxmm
}, 0 },
8057 /* VEX_W_XOP_09_D7_L_0 */
8059 { "vphadduwq", { XM
, EXxmm
}, 0 },
8061 /* VEX_W_XOP_09_DB_L_0 */
8063 { "vphaddudq", { XM
, EXxmm
}, 0 },
8065 /* VEX_W_XOP_09_E1_L_0 */
8067 { "vphsubbw", { XM
, EXxmm
}, 0 },
8069 /* VEX_W_XOP_09_E2_L_0 */
8071 { "vphsubwd", { XM
, EXxmm
}, 0 },
8073 /* VEX_W_XOP_09_E3_L_0 */
8075 { "vphsubdq", { XM
, EXxmm
}, 0 },
8078 #include "i386-dis-evex-w.h"
8081 static const struct dis386 mod_table
[][2] = {
8084 { "bound{S|}", { Gv
, Ma
}, 0 },
8089 { "lesS", { Gv
, Mp
}, 0 },
8090 { VEX_C4_TABLE () },
8094 { "ldsS", { Gv
, Mp
}, 0 },
8095 { VEX_C5_TABLE () },
8098 /* MOD_0F01_REG_0 */
8099 { X86_64_TABLE (X86_64_0F01_REG_0
) },
8100 { RM_TABLE (RM_0F01_REG_0
) },
8103 /* MOD_0F01_REG_1 */
8104 { X86_64_TABLE (X86_64_0F01_REG_1
) },
8105 { RM_TABLE (RM_0F01_REG_1
) },
8108 /* MOD_0F01_REG_2 */
8109 { X86_64_TABLE (X86_64_0F01_REG_2
) },
8110 { RM_TABLE (RM_0F01_REG_2
) },
8113 /* MOD_0F01_REG_3 */
8114 { X86_64_TABLE (X86_64_0F01_REG_3
) },
8115 { RM_TABLE (RM_0F01_REG_3
) },
8118 /* MOD_0F01_REG_5 */
8119 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_0
) },
8120 { RM_TABLE (RM_0F01_REG_5_MOD_3
) },
8123 /* MOD_0F01_REG_7 */
8124 { "invlpg", { Mb
}, 0 },
8125 { RM_TABLE (RM_0F01_REG_7_MOD_3
) },
8128 /* MOD_0F12_PREFIX_0 */
8129 { "%XEVmovlpYX", { XM
, Vex
, EXq
}, 0 },
8130 { "%XEVmovhlpY%XS", { XM
, Vex
, EXq
}, 0 },
8133 /* MOD_0F16_PREFIX_0 */
8134 { "%XEVmovhpYX", { XM
, Vex
, EXq
}, 0 },
8135 { "%XEVmovlhpY%XS", { XM
, Vex
, EXq
}, 0 },
8138 /* MOD_0F18_REG_0 */
8139 { "prefetchnta", { Mb
}, 0 },
8140 { "nopQ", { Ev
}, 0 },
8143 /* MOD_0F18_REG_1 */
8144 { "prefetcht0", { Mb
}, 0 },
8145 { "nopQ", { Ev
}, 0 },
8148 /* MOD_0F18_REG_2 */
8149 { "prefetcht1", { Mb
}, 0 },
8150 { "nopQ", { Ev
}, 0 },
8153 /* MOD_0F18_REG_3 */
8154 { "prefetcht2", { Mb
}, 0 },
8155 { "nopQ", { Ev
}, 0 },
8158 /* MOD_0F18_REG_6 */
8159 { X86_64_TABLE (X86_64_0F18_REG_6_MOD_0
) },
8160 { "nopQ", { Ev
}, 0 },
8163 /* MOD_0F18_REG_7 */
8164 { X86_64_TABLE (X86_64_0F18_REG_7_MOD_0
) },
8165 { "nopQ", { Ev
}, 0 },
8168 /* MOD_0F1A_PREFIX_0 */
8169 { "bndldx", { Gbnd
, Mv_bnd
}, 0 },
8170 { "nopQ", { Ev
}, 0 },
8173 /* MOD_0F1B_PREFIX_0 */
8174 { "bndstx", { Mv_bnd
, Gbnd
}, 0 },
8175 { "nopQ", { Ev
}, 0 },
8178 /* MOD_0F1B_PREFIX_1 */
8179 { "bndmk", { Gbnd
, Mv_bnd
}, 0 },
8180 { "nopQ", { Ev
}, PREFIX_IGNORED
},
8183 /* MOD_0F1C_PREFIX_0 */
8184 { REG_TABLE (REG_0F1C_P_0_MOD_0
) },
8185 { "nopQ", { Ev
}, 0 },
8188 /* MOD_0F1E_PREFIX_1 */
8189 { "nopQ", { Ev
}, PREFIX_IGNORED
},
8190 { REG_TABLE (REG_0F1E_P_1_MOD_3
) },
8193 /* MOD_0FAE_REG_0 */
8194 { "fxsave", { FXSAVE
}, 0 },
8195 { PREFIX_TABLE (PREFIX_0FAE_REG_0_MOD_3
) },
8198 /* MOD_0FAE_REG_1 */
8199 { "fxrstor", { FXSAVE
}, 0 },
8200 { PREFIX_TABLE (PREFIX_0FAE_REG_1_MOD_3
) },
8203 /* MOD_0FAE_REG_2 */
8204 { "ldmxcsr", { Md
}, 0 },
8205 { PREFIX_TABLE (PREFIX_0FAE_REG_2_MOD_3
) },
8208 /* MOD_0FAE_REG_3 */
8209 { "stmxcsr", { Md
}, 0 },
8210 { PREFIX_TABLE (PREFIX_0FAE_REG_3_MOD_3
) },
8213 /* MOD_0FAE_REG_4 */
8214 { PREFIX_TABLE (PREFIX_0FAE_REG_4_MOD_0
) },
8215 { PREFIX_TABLE (PREFIX_0FAE_REG_4_MOD_3
) },
8218 /* MOD_0FAE_REG_5 */
8219 { "xrstor", { FXSAVE
}, PREFIX_OPCODE
| PREFIX_REX2_ILLEGAL
},
8220 { PREFIX_TABLE (PREFIX_0FAE_REG_5_MOD_3
) },
8223 /* MOD_0FAE_REG_6 */
8224 { PREFIX_TABLE (PREFIX_0FAE_REG_6_MOD_0
) },
8225 { PREFIX_TABLE (PREFIX_0FAE_REG_6_MOD_3
) },
8228 /* MOD_0FAE_REG_7 */
8229 { PREFIX_TABLE (PREFIX_0FAE_REG_7_MOD_0
) },
8230 { RM_TABLE (RM_0FAE_REG_7_MOD_3
) },
8233 /* MOD_0FC7_REG_6 */
8234 { PREFIX_TABLE (PREFIX_0FC7_REG_6_MOD_0
) },
8235 { PREFIX_TABLE (PREFIX_0FC7_REG_6_MOD_3
) }
8238 /* MOD_0FC7_REG_7 */
8239 { "vmptrst", { Mq
}, 0 },
8240 { PREFIX_TABLE (PREFIX_0FC7_REG_7_MOD_3
) }
8243 /* MOD_0F38DC_PREFIX_1 */
8244 { "aesenc128kl", { XM
, M
}, 0 },
8245 { "loadiwkey", { XM
, EXx
}, 0 },
8249 { PREFIX_TABLE (PREFIX_0F38F8_M_0
) },
8250 { X86_64_TABLE (X86_64_0F38F8_M_1
) },
8253 /* MOD_VEX_0F3849_X86_64_L_0_W_0 */
8254 { PREFIX_TABLE (PREFIX_VEX_0F3849_X86_64_L_0_W_0_M_0
) },
8255 { PREFIX_TABLE (PREFIX_VEX_0F3849_X86_64_L_0_W_0_M_1
) },
8258 #include "i386-dis-evex-mod.h"
8261 static const struct dis386 rm_table
[][8] = {
8264 { "xabort", { Skip_MODRM
, Ib
}, 0 },
8268 { "xbeginT", { Skip_MODRM
, Jdqw
}, 0 },
8272 { "enclv", { Skip_MODRM
}, 0 },
8273 { "vmcall", { Skip_MODRM
}, 0 },
8274 { "vmlaunch", { Skip_MODRM
}, 0 },
8275 { "vmresume", { Skip_MODRM
}, 0 },
8276 { "vmxoff", { Skip_MODRM
}, 0 },
8277 { "pconfig", { Skip_MODRM
}, 0 },
8278 { PREFIX_TABLE (PREFIX_0F01_REG_0_MOD_3_RM_6
) },
8279 { PREFIX_TABLE (PREFIX_0F01_REG_0_MOD_3_RM_7
) },
8283 { "monitor", { { OP_Monitor
, 0 } }, 0 },
8284 { "mwait", { { OP_Mwait
, 0 } }, 0 },
8285 { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_2
) },
8286 { "stac", { Skip_MODRM
}, 0 },
8287 { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_4
) },
8288 { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_5
) },
8289 { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_6
) },
8290 { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_7
) },
8294 { "xgetbv", { Skip_MODRM
}, 0 },
8295 { "xsetbv", { Skip_MODRM
}, 0 },
8298 { "vmfunc", { Skip_MODRM
}, 0 },
8299 { "xend", { Skip_MODRM
}, 0 },
8300 { "xtest", { Skip_MODRM
}, 0 },
8301 { "enclu", { Skip_MODRM
}, 0 },
8305 { "vmrun", { Skip_MODRM
}, 0 },
8306 { PREFIX_TABLE (PREFIX_0F01_REG_3_RM_1
) },
8307 { "vmload", { Skip_MODRM
}, 0 },
8308 { "vmsave", { Skip_MODRM
}, 0 },
8309 { "stgi", { Skip_MODRM
}, 0 },
8310 { "clgi", { Skip_MODRM
}, 0 },
8311 { "skinit", { Skip_MODRM
}, 0 },
8312 { "invlpga", { Skip_MODRM
}, 0 },
8315 /* RM_0F01_REG_5_MOD_3 */
8316 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_0
) },
8317 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_1
) },
8318 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_2
) },
8320 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_4
) },
8321 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_5
) },
8322 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_6
) },
8323 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_7
) },
8326 /* RM_0F01_REG_7_MOD_3 */
8327 { "swapgs", { Skip_MODRM
}, 0 },
8328 { "rdtscp", { Skip_MODRM
}, 0 },
8329 { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_2
) },
8330 { "mwaitx", { { OP_Mwait
, eBX_reg
} }, PREFIX_OPCODE
},
8331 { "clzero", { Skip_MODRM
}, 0 },
8332 { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_5
) },
8333 { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_6
) },
8334 { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_7
) },
8337 /* RM_0F1E_P_1_MOD_3_REG_7 */
8338 { "nopQ", { Ev
}, PREFIX_IGNORED
},
8339 { "nopQ", { Ev
}, PREFIX_IGNORED
},
8340 { "endbr64", { Skip_MODRM
}, 0 },
8341 { "endbr32", { Skip_MODRM
}, 0 },
8342 { "nopQ", { Ev
}, PREFIX_IGNORED
},
8343 { "nopQ", { Ev
}, PREFIX_IGNORED
},
8344 { "nopQ", { Ev
}, PREFIX_IGNORED
},
8345 { "nopQ", { Ev
}, PREFIX_IGNORED
},
8348 /* RM_0FAE_REG_6_MOD_3 */
8349 { "mfence", { Skip_MODRM
}, 0 },
8352 /* RM_0FAE_REG_7_MOD_3 */
8353 { "sfence", { Skip_MODRM
}, 0 },
8356 /* RM_0F3A0F_P_1_R_0 */
8357 { "hreset", { Skip_MODRM
, Ib
}, 0 },
8360 /* RM_VEX_0F3849_X86_64_L_0_W_0_M_1_P_0_R_0 */
8361 { "tilerelease", { Skip_MODRM
}, 0 },
8364 /* RM_VEX_0F3849_X86_64_L_0_W_0_M_1_P_3 */
8365 { "tilezero", { TMM
, Skip_MODRM
}, 0 },
8369 #define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
8371 /* The values used here must be non-zero, fit in 'unsigned char', and not be
8372 in conflict with actual prefix opcodes. */
8373 #define REP_PREFIX 0x01
8374 #define XACQUIRE_PREFIX 0x02
8375 #define XRELEASE_PREFIX 0x03
8376 #define BND_PREFIX 0x04
8377 #define NOTRACK_PREFIX 0x05
8384 ckprefix (instr_info
*ins
)
8391 /* The maximum instruction length is 15bytes. */
8392 while (length
< MAX_CODE_LENGTH
- 1)
8394 if (!fetch_code (ins
->info
, ins
->codep
+ 1))
8395 return ckp_fetch_error
;
8397 switch (*ins
->codep
)
8399 /* REX prefixes family. */
8416 if (ins
->address_mode
== mode_64bit
)
8417 newrex
= *ins
->codep
;
8420 ins
->last_rex_prefix
= i
;
8422 /* REX2 must be the last prefix. */
8424 if (ins
->address_mode
== mode_64bit
)
8426 if (ins
->last_rex_prefix
>= 0)
8430 if (!fetch_code (ins
->info
, ins
->codep
+ 1))
8431 return ckp_fetch_error
;
8432 ins
->rex2_payload
= *ins
->codep
;
8433 ins
->rex2
= ins
->rex2_payload
>> 4;
8434 ins
->rex
= (ins
->rex2_payload
& 0xf) | REX_OPCODE
;
8436 ins
->last_rex2_prefix
= i
;
8437 ins
->all_prefixes
[i
] = REX2_OPCODE
;
8441 ins
->prefixes
|= PREFIX_REPZ
;
8442 ins
->last_repz_prefix
= i
;
8445 ins
->prefixes
|= PREFIX_REPNZ
;
8446 ins
->last_repnz_prefix
= i
;
8449 ins
->prefixes
|= PREFIX_LOCK
;
8450 ins
->last_lock_prefix
= i
;
8453 ins
->prefixes
|= PREFIX_CS
;
8454 ins
->last_seg_prefix
= i
;
8455 if (ins
->address_mode
!= mode_64bit
)
8456 ins
->active_seg_prefix
= PREFIX_CS
;
8459 ins
->prefixes
|= PREFIX_SS
;
8460 ins
->last_seg_prefix
= i
;
8461 if (ins
->address_mode
!= mode_64bit
)
8462 ins
->active_seg_prefix
= PREFIX_SS
;
8465 ins
->prefixes
|= PREFIX_DS
;
8466 ins
->last_seg_prefix
= i
;
8467 if (ins
->address_mode
!= mode_64bit
)
8468 ins
->active_seg_prefix
= PREFIX_DS
;
8471 ins
->prefixes
|= PREFIX_ES
;
8472 ins
->last_seg_prefix
= i
;
8473 if (ins
->address_mode
!= mode_64bit
)
8474 ins
->active_seg_prefix
= PREFIX_ES
;
8477 ins
->prefixes
|= PREFIX_FS
;
8478 ins
->last_seg_prefix
= i
;
8479 ins
->active_seg_prefix
= PREFIX_FS
;
8482 ins
->prefixes
|= PREFIX_GS
;
8483 ins
->last_seg_prefix
= i
;
8484 ins
->active_seg_prefix
= PREFIX_GS
;
8487 ins
->prefixes
|= PREFIX_DATA
;
8488 ins
->last_data_prefix
= i
;
8491 ins
->prefixes
|= PREFIX_ADDR
;
8492 ins
->last_addr_prefix
= i
;
8495 /* fwait is really an instruction. If there are prefixes
8496 before the fwait, they belong to the fwait, *not* to the
8497 following instruction. */
8498 ins
->fwait_prefix
= i
;
8499 if (ins
->prefixes
|| ins
->rex
)
8501 ins
->prefixes
|= PREFIX_FWAIT
;
8503 /* This ensures that the previous REX prefixes are noticed
8504 as unused prefixes, as in the return case below. */
8505 return ins
->rex
? ckp_bogus
: ckp_okay
;
8507 ins
->prefixes
= PREFIX_FWAIT
;
8512 /* Rex is ignored when followed by another prefix. */
8515 if (*ins
->codep
!= FWAIT_OPCODE
)
8516 ins
->all_prefixes
[i
++] = *ins
->codep
;
8524 /* Return the name of the prefix byte PREF, or NULL if PREF is not a
8528 prefix_name (enum address_mode mode
, uint8_t pref
, int sizeflag
)
8530 static const char *rexes
[16] =
8535 "rex.XB", /* 0x43 */
8537 "rex.RB", /* 0x45 */
8538 "rex.RX", /* 0x46 */
8539 "rex.RXB", /* 0x47 */
8541 "rex.WB", /* 0x49 */
8542 "rex.WX", /* 0x4a */
8543 "rex.WXB", /* 0x4b */
8544 "rex.WR", /* 0x4c */
8545 "rex.WRB", /* 0x4d */
8546 "rex.WRX", /* 0x4e */
8547 "rex.WRXB", /* 0x4f */
8552 /* REX prefixes family. */
8569 return rexes
[pref
- 0x40];
8589 return (sizeflag
& DFLAG
) ? "data16" : "data32";
8591 if (mode
== mode_64bit
)
8592 return (sizeflag
& AFLAG
) ? "addr32" : "addr64";
8594 return (sizeflag
& AFLAG
) ? "addr16" : "addr32";
8599 case XACQUIRE_PREFIX
:
8601 case XRELEASE_PREFIX
:
8605 case NOTRACK_PREFIX
:
8615 print_i386_disassembler_options (FILE *stream
)
8617 fprintf (stream
, _("\n\
8618 The following i386/x86-64 specific disassembler options are supported for use\n\
8619 with the -M switch (multiple options should be separated by commas):\n"));
8621 fprintf (stream
, _(" x86-64 Disassemble in 64bit mode\n"));
8622 fprintf (stream
, _(" i386 Disassemble in 32bit mode\n"));
8623 fprintf (stream
, _(" i8086 Disassemble in 16bit mode\n"));
8624 fprintf (stream
, _(" att Display instruction in AT&T syntax\n"));
8625 fprintf (stream
, _(" intel Display instruction in Intel syntax\n"));
8626 fprintf (stream
, _(" att-mnemonic (AT&T syntax only)\n"
8627 " Display instruction with AT&T mnemonic\n"));
8628 fprintf (stream
, _(" intel-mnemonic (AT&T syntax only)\n"
8629 " Display instruction with Intel mnemonic\n"));
8630 fprintf (stream
, _(" addr64 Assume 64bit address size\n"));
8631 fprintf (stream
, _(" addr32 Assume 32bit address size\n"));
8632 fprintf (stream
, _(" addr16 Assume 16bit address size\n"));
8633 fprintf (stream
, _(" data32 Assume 32bit data size\n"));
8634 fprintf (stream
, _(" data16 Assume 16bit data size\n"));
8635 fprintf (stream
, _(" suffix Always display instruction suffix in AT&T syntax\n"));
8636 fprintf (stream
, _(" amd64 Display instruction in AMD64 ISA\n"));
8637 fprintf (stream
, _(" intel64 Display instruction in Intel64 ISA\n"));
8641 static const struct dis386 bad_opcode
= { "(bad)", { XX
}, 0 };
8643 /* Fetch error indicator. */
8644 static const struct dis386 err_opcode
= { NULL
, { XX
}, 0 };
8646 static const struct dis386 map7_f8_opcode
= { VEX_LEN_TABLE (VEX_LEN_MAP7_F8
) };
8648 /* Get a pointer to struct dis386 with a valid name. */
8650 static const struct dis386
*
8651 get_valid_dis386 (const struct dis386
*dp
, instr_info
*ins
)
8653 int vindex
, vex_table_index
;
8655 if (dp
->name
!= NULL
)
8658 switch (dp
->op
[0].bytemode
)
8661 dp
= ®_table
[dp
->op
[1].bytemode
][ins
->modrm
.reg
];
8665 vindex
= ins
->modrm
.mod
== 0x3 ? 1 : 0;
8666 dp
= &mod_table
[dp
->op
[1].bytemode
][vindex
];
8670 dp
= &rm_table
[dp
->op
[1].bytemode
][ins
->modrm
.rm
];
8673 case USE_PREFIX_TABLE
:
8677 /* The prefix in VEX is implicit. */
8678 switch (ins
->vex
.prefix
)
8683 case REPE_PREFIX_OPCODE
:
8686 case DATA_PREFIX_OPCODE
:
8689 case REPNE_PREFIX_OPCODE
:
8699 int last_prefix
= -1;
8702 /* We check PREFIX_REPNZ and PREFIX_REPZ before PREFIX_DATA.
8703 When there are multiple PREFIX_REPNZ and PREFIX_REPZ, the
8705 if ((ins
->prefixes
& (PREFIX_REPZ
| PREFIX_REPNZ
)) != 0)
8707 if (ins
->last_repz_prefix
> ins
->last_repnz_prefix
)
8710 prefix
= PREFIX_REPZ
;
8711 last_prefix
= ins
->last_repz_prefix
;
8716 prefix
= PREFIX_REPNZ
;
8717 last_prefix
= ins
->last_repnz_prefix
;
8720 /* Check if prefix should be ignored. */
8721 if ((((prefix_table
[dp
->op
[1].bytemode
][vindex
].prefix_requirement
8722 & PREFIX_IGNORED
) >> PREFIX_IGNORED_SHIFT
)
8724 && !prefix_table
[dp
->op
[1].bytemode
][vindex
].name
)
8728 if (vindex
== 0 && (ins
->prefixes
& PREFIX_DATA
) != 0)
8731 prefix
= PREFIX_DATA
;
8732 last_prefix
= ins
->last_data_prefix
;
8737 ins
->used_prefixes
|= prefix
;
8738 ins
->all_prefixes
[last_prefix
] = 0;
8741 dp
= &prefix_table
[dp
->op
[1].bytemode
][vindex
];
8744 case USE_X86_64_EVEX_FROM_VEX_TABLE
:
8745 case USE_X86_64_EVEX_PFX_TABLE
:
8746 case USE_X86_64_EVEX_W_TABLE
:
8747 case USE_X86_64_EVEX_MEM_W_TABLE
:
8748 ins
->evex_type
= evex_from_vex
;
8749 /* EVEX from VEX instructions are 64-bit only and require that EVEX.z,
8750 EVEX.L'L, EVEX.b, and the lower 2 bits of EVEX.aaa must be 0. */
8751 if (ins
->address_mode
!= mode_64bit
8752 || (ins
->vex
.mask_register_specifier
& 0x3) != 0
8754 || ins
->vex
.zeroing
!= 0
8758 if (dp
->op
[0].bytemode
== USE_X86_64_EVEX_PFX_TABLE
)
8759 goto use_prefix_table
;
8760 if (dp
->op
[0].bytemode
== USE_X86_64_EVEX_W_TABLE
)
8761 goto use_vex_w_table
;
8762 if (dp
->op
[0].bytemode
== USE_X86_64_EVEX_MEM_W_TABLE
)
8764 if (ins
->modrm
.mod
== 3)
8766 goto use_vex_w_table
;
8770 case USE_X86_64_TABLE
:
8771 vindex
= ins
->address_mode
== mode_64bit
? 1 : 0;
8772 dp
= &x86_64_table
[dp
->op
[1].bytemode
][vindex
];
8775 case USE_3BYTE_TABLE
:
8776 if (ins
->last_rex2_prefix
>= 0)
8778 if (!fetch_code (ins
->info
, ins
->codep
+ 2))
8780 vindex
= *ins
->codep
++;
8781 dp
= &three_byte_table
[dp
->op
[1].bytemode
][vindex
];
8782 ins
->end_codep
= ins
->codep
;
8783 if (!fetch_modrm (ins
))
8787 case USE_VEX_LEN_TABLE
:
8791 switch (ins
->vex
.length
)
8797 /* This allows re-using in particular table entries where only
8798 128-bit operand size (VEX.L=0 / EVEX.L'L=0) are valid. */
8811 dp
= &vex_len_table
[dp
->op
[1].bytemode
][vindex
];
8814 case USE_EVEX_LEN_TABLE
:
8818 switch (ins
->vex
.length
)
8834 dp
= &evex_len_table
[dp
->op
[1].bytemode
][vindex
];
8837 case USE_XOP_8F_TABLE
:
8838 if (!fetch_code (ins
->info
, ins
->codep
+ 3))
8840 ins
->rex
= ~(*ins
->codep
>> 5) & 0x7;
8842 /* VEX_TABLE_INDEX is the mmmmm part of the XOP byte 1 "RCB.mmmmm". */
8843 switch ((*ins
->codep
& 0x1f))
8849 vex_table_index
= XOP_08
;
8852 vex_table_index
= XOP_09
;
8855 vex_table_index
= XOP_0A
;
8859 ins
->vex
.w
= *ins
->codep
& 0x80;
8860 if (ins
->vex
.w
&& ins
->address_mode
== mode_64bit
)
8863 ins
->vex
.register_specifier
= (~(*ins
->codep
>> 3)) & 0xf;
8864 if (ins
->address_mode
!= mode_64bit
)
8866 /* In 16/32-bit mode REX_B is silently ignored. */
8870 ins
->vex
.length
= (*ins
->codep
& 0x4) ? 256 : 128;
8871 switch ((*ins
->codep
& 0x3))
8876 ins
->vex
.prefix
= DATA_PREFIX_OPCODE
;
8879 ins
->vex
.prefix
= REPE_PREFIX_OPCODE
;
8882 ins
->vex
.prefix
= REPNE_PREFIX_OPCODE
;
8887 vindex
= *ins
->codep
++;
8888 dp
= &xop_table
[vex_table_index
][vindex
];
8890 ins
->end_codep
= ins
->codep
;
8891 if (!fetch_modrm (ins
))
8894 /* No XOP encoding so far allows for a non-zero embedded prefix. Avoid
8895 having to decode the bits for every otherwise valid encoding. */
8896 if (ins
->vex
.prefix
)
8900 case USE_VEX_C4_TABLE
:
8902 if (!fetch_code (ins
->info
, ins
->codep
+ 3))
8904 ins
->rex
= ~(*ins
->codep
>> 5) & 0x7;
8905 switch ((*ins
->codep
& 0x1f))
8911 vex_table_index
= VEX_0F
;
8914 vex_table_index
= VEX_0F38
;
8917 vex_table_index
= VEX_0F3A
;
8920 vex_table_index
= VEX_MAP7
;
8924 ins
->vex
.w
= *ins
->codep
& 0x80;
8925 if (ins
->address_mode
== mode_64bit
)
8932 /* For the 3-byte VEX prefix in 32-bit mode, the REX_B bit
8933 is ignored, other REX bits are 0 and the highest bit in
8934 VEX.vvvv is also ignored (but we mustn't clear it here). */
8937 ins
->vex
.register_specifier
= (~(*ins
->codep
>> 3)) & 0xf;
8938 ins
->vex
.length
= (*ins
->codep
& 0x4) ? 256 : 128;
8939 switch ((*ins
->codep
& 0x3))
8944 ins
->vex
.prefix
= DATA_PREFIX_OPCODE
;
8947 ins
->vex
.prefix
= REPE_PREFIX_OPCODE
;
8950 ins
->vex
.prefix
= REPNE_PREFIX_OPCODE
;
8955 vindex
= *ins
->codep
++;
8956 ins
->condition_code
= vindex
& 0xf;
8957 if (vex_table_index
!= VEX_MAP7
)
8958 dp
= &vex_table
[vex_table_index
][vindex
];
8959 else if (vindex
== 0xf8)
8960 dp
= &map7_f8_opcode
;
8963 ins
->end_codep
= ins
->codep
;
8964 /* There is no MODRM byte for VEX0F 77. */
8965 if ((vex_table_index
!= VEX_0F
|| vindex
!= 0x77)
8966 && !fetch_modrm (ins
))
8970 case USE_VEX_C5_TABLE
:
8972 if (!fetch_code (ins
->info
, ins
->codep
+ 2))
8974 ins
->rex
= (*ins
->codep
& 0x80) ? 0 : REX_R
;
8976 /* For the 2-byte VEX prefix in 32-bit mode, the highest bit in
8978 ins
->vex
.register_specifier
= (~(*ins
->codep
>> 3)) & 0xf;
8979 ins
->vex
.length
= (*ins
->codep
& 0x4) ? 256 : 128;
8980 switch ((*ins
->codep
& 0x3))
8985 ins
->vex
.prefix
= DATA_PREFIX_OPCODE
;
8988 ins
->vex
.prefix
= REPE_PREFIX_OPCODE
;
8991 ins
->vex
.prefix
= REPNE_PREFIX_OPCODE
;
8996 vindex
= *ins
->codep
++;
8997 dp
= &vex_table
[VEX_0F
][vindex
];
8998 ins
->end_codep
= ins
->codep
;
8999 /* There is no MODRM byte for VEX 77. */
9000 if (vindex
!= 0x77 && !fetch_modrm (ins
))
9004 case USE_VEX_W_TABLE
:
9009 dp
= &vex_w_table
[dp
->op
[1].bytemode
][ins
->vex
.w
];
9012 case USE_EVEX_TABLE
:
9013 ins
->two_source_ops
= false;
9015 ins
->vex
.evex
= true;
9016 if (!fetch_code (ins
->info
, ins
->codep
+ 4))
9018 /* The first byte after 0x62. */
9019 if (*ins
->codep
& 0x8)
9021 if (!(*ins
->codep
& 0x10))
9024 ins
->rex
= ~(*ins
->codep
>> 5) & 0x7;
9025 switch (*ins
->codep
& 0x7)
9030 vex_table_index
= EVEX_0F
;
9033 vex_table_index
= EVEX_0F38
;
9036 vex_table_index
= EVEX_0F3A
;
9039 vex_table_index
= EVEX_MAP4
;
9040 ins
->evex_type
= evex_from_legacy
;
9041 if (ins
->address_mode
!= mode_64bit
)
9043 ins
->rex
|= REX_OPCODE
;
9046 vex_table_index
= EVEX_MAP5
;
9049 vex_table_index
= EVEX_MAP6
;
9052 vex_table_index
= EVEX_MAP7
;
9056 /* The second byte after 0x62. */
9058 ins
->vex
.w
= *ins
->codep
& 0x80;
9059 if (ins
->vex
.w
&& ins
->address_mode
== mode_64bit
)
9062 ins
->vex
.register_specifier
= (~(*ins
->codep
>> 3)) & 0xf;
9064 if (!(*ins
->codep
& 0x4))
9067 ins
->vex
.u
= *ins
->codep
& 0x4;
9069 switch ((*ins
->codep
& 0x3))
9074 ins
->vex
.prefix
= DATA_PREFIX_OPCODE
;
9077 ins
->vex
.prefix
= REPE_PREFIX_OPCODE
;
9080 ins
->vex
.prefix
= REPNE_PREFIX_OPCODE
;
9084 /* The third byte after 0x62. */
9087 /* Remember the static rounding bits. */
9088 ins
->vex
.ll
= (*ins
->codep
>> 5) & 3;
9089 ins
->vex
.b
= *ins
->codep
& 0x10;
9091 ins
->vex
.v
= *ins
->codep
& 0x8;
9092 ins
->vex
.mask_register_specifier
= *ins
->codep
& 0x7;
9093 ins
->vex
.scc
= *ins
->codep
& 0xf;
9094 ins
->vex
.zeroing
= *ins
->codep
& 0x80;
9095 /* Set the NF bit for EVEX-Promoted instructions, this bit will be cleared
9096 when it's an evex_default one. */
9097 ins
->vex
.nf
= *ins
->codep
& 0x4;
9099 if (ins
->address_mode
!= mode_64bit
)
9101 /* Report bad for !evex_default and when two fixed values of evex
9103 if (ins
->evex_type
!= evex_default
|| (ins
->rex2
& REX_B
)
9104 || ((ins
->rex2
& REX_X
) && (ins
->modrm
.mod
!= 3)))
9106 /* In 16/32-bit mode silently ignore following bits. */
9108 ins
->rex2
&= ~REX_R
;
9114 vindex
= *ins
->codep
++;
9115 ins
->condition_code
= vindex
& 0xf;
9116 if (vex_table_index
!= EVEX_MAP7
)
9117 dp
= &evex_table
[vex_table_index
][vindex
];
9118 else if (vindex
== 0xf8)
9119 dp
= &map7_f8_opcode
;
9122 ins
->end_codep
= ins
->codep
;
9123 if (!fetch_modrm (ins
))
9126 /* When modrm.mod != 3, the U bit is used by APX for bit X4.
9127 When modrm.mod == 3, the U bit is used by AVX10. The U bit and
9128 the b bit should not be zero at the same time. */
9129 if (ins
->modrm
.mod
== 3 && !ins
->vex
.u
&& !ins
->vex
.b
)
9132 /* Set vector length. For EVEX-promoted instructions, evex.ll == 0b00,
9133 which has the same encoding as vex.length == 128 and they can share
9134 the same processing with vex.length in OP_VEX. */
9135 if (ins
->modrm
.mod
== 3 && ins
->vex
.b
&& ins
->evex_type
!= evex_from_legacy
)
9138 ins
->vex
.length
= 512;
9140 ins
->vex
.length
= 256;
9144 switch (ins
->vex
.ll
)
9147 ins
->vex
.length
= 128;
9150 ins
->vex
.length
= 256;
9153 ins
->vex
.length
= 512;
9169 if (dp
->name
!= NULL
)
9172 return get_valid_dis386 (dp
, ins
);
9176 get_sib (instr_info
*ins
, int sizeflag
)
9178 /* If modrm.mod == 3, operand must be register. */
9180 && ((sizeflag
& AFLAG
) || ins
->address_mode
== mode_64bit
)
9181 && ins
->modrm
.mod
!= 3
9182 && ins
->modrm
.rm
== 4)
9184 if (!fetch_code (ins
->info
, ins
->codep
+ 2))
9186 ins
->sib
.index
= (ins
->codep
[1] >> 3) & 7;
9187 ins
->sib
.scale
= (ins
->codep
[1] >> 6) & 3;
9188 ins
->sib
.base
= ins
->codep
[1] & 7;
9189 ins
->has_sib
= true;
9192 ins
->has_sib
= false;
9197 /* Like oappend_with_style (below) but always with text style. */
9200 oappend (instr_info
*ins
, const char *s
)
9202 oappend_with_style (ins
, s
, dis_style_text
);
9205 /* Like oappend (above), but S is a string starting with '%'. In
9206 Intel syntax, the '%' is elided. */
9209 oappend_register (instr_info
*ins
, const char *s
)
9211 oappend_with_style (ins
, s
+ ins
->intel_syntax
, dis_style_register
);
9214 /* Wrap around a call to INS->info->fprintf_styled_func, printing FMT.
9215 STYLE is the default style to use in the fprintf_styled_func calls,
9216 however, FMT might include embedded style markers (see oappend_style),
9217 these embedded markers are not printed, but instead change the style
9218 used in the next fprintf_styled_func call. */
9220 static void ATTRIBUTE_PRINTF_3
9221 i386_dis_printf (const disassemble_info
*info
, enum disassembler_style style
,
9222 const char *fmt
, ...)
9225 enum disassembler_style curr_style
= style
;
9226 const char *start
, *curr
;
9227 char staging_area
[50];
9230 /* In particular print_insn()'s processing of op_txt[] can hand rather long
9231 strings here. Bypass vsnprintf() in such cases to avoid capacity issues
9232 with the staging area. */
9233 if (strcmp (fmt
, "%s"))
9235 int res
= vsnprintf (staging_area
, sizeof (staging_area
), fmt
, ap
);
9242 if ((size_t) res
>= sizeof (staging_area
))
9245 start
= curr
= staging_area
;
9249 start
= curr
= va_arg (ap
, const char *);
9256 || (*curr
== STYLE_MARKER_CHAR
9257 && ISXDIGIT (*(curr
+ 1))
9258 && *(curr
+ 2) == STYLE_MARKER_CHAR
))
9260 /* Output content between our START position and CURR. */
9261 int len
= curr
- start
;
9262 int n
= (*info
->fprintf_styled_func
) (info
->stream
, curr_style
,
9263 "%.*s", len
, start
);
9270 /* Skip over the initial STYLE_MARKER_CHAR. */
9273 /* Update the CURR_STYLE. As there are less than 16 styles, it
9274 is possible, that if the input is corrupted in some way, that
9275 we might set CURR_STYLE to an invalid value. Don't worry
9276 though, we check for this situation. */
9277 if (*curr
>= '0' && *curr
<= '9')
9278 curr_style
= (enum disassembler_style
) (*curr
- '0');
9279 else if (*curr
>= 'a' && *curr
<= 'f')
9280 curr_style
= (enum disassembler_style
) (*curr
- 'a' + 10);
9282 curr_style
= dis_style_text
;
9284 /* Check for an invalid style having been selected. This should
9285 never happen, but it doesn't hurt to be a little paranoid. */
9286 if (curr_style
> dis_style_comment_start
)
9287 curr_style
= dis_style_text
;
9289 /* Skip the hex character, and the closing STYLE_MARKER_CHAR. */
9292 /* Reset the START to after the style marker. */
9302 print_insn (bfd_vma pc
, disassemble_info
*info
, int intel_syntax
)
9304 const struct dis386
*dp
;
9307 char *op_txt
[MAX_OPERANDS
];
9309 bool intel_swap_2_3
;
9310 int sizeflag
, orig_sizeflag
;
9312 struct dis_private priv
;
9317 .intel_syntax
= intel_syntax
>= 0
9319 : (info
->mach
& bfd_mach_i386_intel_syntax
) != 0,
9320 .intel_mnemonic
= !SYSV386_COMPAT
,
9321 .op_index
[0 ... MAX_OPERANDS
- 1] = -1,
9323 .start_codep
= priv
.the_buffer
,
9324 .codep
= priv
.the_buffer
,
9326 .last_lock_prefix
= -1,
9327 .last_repz_prefix
= -1,
9328 .last_repnz_prefix
= -1,
9329 .last_data_prefix
= -1,
9330 .last_addr_prefix
= -1,
9331 .last_rex_prefix
= -1,
9332 .last_rex2_prefix
= -1,
9333 .last_seg_prefix
= -1,
9336 char op_out
[MAX_OPERANDS
][MAX_OPERAND_BUFFER_SIZE
];
9338 priv
.orig_sizeflag
= AFLAG
| DFLAG
;
9339 if ((info
->mach
& bfd_mach_i386_i386
) != 0)
9340 ins
.address_mode
= mode_32bit
;
9341 else if (info
->mach
== bfd_mach_i386_i8086
)
9343 ins
.address_mode
= mode_16bit
;
9344 priv
.orig_sizeflag
= 0;
9347 ins
.address_mode
= mode_64bit
;
9349 for (p
= info
->disassembler_options
; p
!= NULL
;)
9351 if (startswith (p
, "amd64"))
9353 else if (startswith (p
, "intel64"))
9354 ins
.isa64
= intel64
;
9355 else if (startswith (p
, "x86-64"))
9357 ins
.address_mode
= mode_64bit
;
9358 priv
.orig_sizeflag
|= AFLAG
| DFLAG
;
9360 else if (startswith (p
, "i386"))
9362 ins
.address_mode
= mode_32bit
;
9363 priv
.orig_sizeflag
|= AFLAG
| DFLAG
;
9365 else if (startswith (p
, "i8086"))
9367 ins
.address_mode
= mode_16bit
;
9368 priv
.orig_sizeflag
&= ~(AFLAG
| DFLAG
);
9370 else if (startswith (p
, "intel"))
9372 if (startswith (p
+ 5, "-mnemonic"))
9373 ins
.intel_mnemonic
= true;
9375 ins
.intel_syntax
= 1;
9377 else if (startswith (p
, "att"))
9379 ins
.intel_syntax
= 0;
9380 if (startswith (p
+ 3, "-mnemonic"))
9381 ins
.intel_mnemonic
= false;
9383 else if (startswith (p
, "addr"))
9385 if (ins
.address_mode
== mode_64bit
)
9387 if (p
[4] == '3' && p
[5] == '2')
9388 priv
.orig_sizeflag
&= ~AFLAG
;
9389 else if (p
[4] == '6' && p
[5] == '4')
9390 priv
.orig_sizeflag
|= AFLAG
;
9394 if (p
[4] == '1' && p
[5] == '6')
9395 priv
.orig_sizeflag
&= ~AFLAG
;
9396 else if (p
[4] == '3' && p
[5] == '2')
9397 priv
.orig_sizeflag
|= AFLAG
;
9400 else if (startswith (p
, "data"))
9402 if (p
[4] == '1' && p
[5] == '6')
9403 priv
.orig_sizeflag
&= ~DFLAG
;
9404 else if (p
[4] == '3' && p
[5] == '2')
9405 priv
.orig_sizeflag
|= DFLAG
;
9407 else if (startswith (p
, "suffix"))
9408 priv
.orig_sizeflag
|= SUFFIX_ALWAYS
;
9410 p
= strchr (p
, ',');
9415 if (ins
.address_mode
== mode_64bit
&& sizeof (bfd_vma
) < 8)
9417 i386_dis_printf (info
, dis_style_text
, _("64-bit address is disabled"));
9421 if (ins
.intel_syntax
)
9423 ins
.open_char
= '[';
9424 ins
.close_char
= ']';
9425 ins
.separator_char
= '+';
9426 ins
.scale_char
= '*';
9430 ins
.open_char
= '(';
9431 ins
.close_char
= ')';
9432 ins
.separator_char
= ',';
9433 ins
.scale_char
= ',';
9436 /* The output looks better if we put 7 bytes on a line, since that
9437 puts most long word instructions on a single line. */
9438 info
->bytes_per_line
= 7;
9440 info
->private_data
= &priv
;
9442 priv
.insn_start
= pc
;
9444 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
9447 ins
.op_out
[i
] = op_out
[i
];
9450 sizeflag
= priv
.orig_sizeflag
;
9452 switch (ckprefix (&ins
))
9458 /* Too many prefixes or unused REX prefixes. */
9460 i
< (int) ARRAY_SIZE (ins
.all_prefixes
) && ins
.all_prefixes
[i
];
9462 i386_dis_printf (info
, dis_style_mnemonic
, "%s%s",
9463 (i
== 0 ? "" : " "),
9464 prefix_name (ins
.address_mode
, ins
.all_prefixes
[i
],
9469 case ckp_fetch_error
:
9470 goto fetch_error_out
;
9473 ins
.nr_prefixes
= ins
.codep
- ins
.start_codep
;
9475 if (!fetch_code (info
, ins
.codep
+ 1))
9478 ret
= fetch_error (&ins
);
9482 ins
.two_source_ops
= (*ins
.codep
== 0x62 || *ins
.codep
== 0xc8);
9484 if ((ins
.prefixes
& PREFIX_FWAIT
)
9485 && (*ins
.codep
< 0xd8 || *ins
.codep
> 0xdf))
9487 /* Handle ins.prefixes before fwait. */
9488 for (i
= 0; i
< ins
.fwait_prefix
&& ins
.all_prefixes
[i
];
9490 i386_dis_printf (info
, dis_style_mnemonic
, "%s ",
9491 prefix_name (ins
.address_mode
, ins
.all_prefixes
[i
],
9493 i386_dis_printf (info
, dis_style_mnemonic
, "fwait");
9498 /* REX2.M in rex2 prefix represents map0 or map1. */
9499 if (ins
.last_rex2_prefix
< 0 ? *ins
.codep
== 0x0f : (ins
.rex2
& REX2_M
))
9504 if (!fetch_code (info
, ins
.codep
+ 1))
9505 goto fetch_error_out
;
9508 dp
= &dis386_twobyte
[*ins
.codep
];
9509 ins
.need_modrm
= twobyte_has_modrm
[*ins
.codep
];
9513 dp
= &dis386
[*ins
.codep
];
9514 ins
.need_modrm
= onebyte_has_modrm
[*ins
.codep
];
9516 ins
.condition_code
= *ins
.codep
& 0xf;
9519 /* Save sizeflag for printing the extra ins.prefixes later before updating
9520 it for mnemonic and operand processing. The prefix names depend
9521 only on the address mode. */
9522 orig_sizeflag
= sizeflag
;
9523 if (ins
.prefixes
& PREFIX_ADDR
)
9525 if ((ins
.prefixes
& PREFIX_DATA
))
9528 ins
.end_codep
= ins
.codep
;
9529 if (ins
.need_modrm
&& !fetch_modrm (&ins
))
9530 goto fetch_error_out
;
9532 if (dp
->name
== NULL
&& dp
->op
[0].bytemode
== FLOATCODE
)
9534 if (!get_sib (&ins
, sizeflag
)
9535 || !dofloat (&ins
, sizeflag
))
9536 goto fetch_error_out
;
9540 dp
= get_valid_dis386 (dp
, &ins
);
9541 if (dp
== &err_opcode
)
9542 goto fetch_error_out
;
9544 /* For APX instructions promoted from legacy maps 0/1, embedded prefix
9545 is interpreted as the operand size override. */
9546 if (ins
.evex_type
== evex_from_legacy
9547 && ins
.vex
.prefix
== DATA_PREFIX_OPCODE
)
9550 if(ins
.evex_type
== evex_default
)
9553 /* For EVEX-promoted formats, we need to clear EVEX.NF (ccmp and ctest
9554 are cleared separately.) in mask_register_specifier and keep the low
9555 2 bits of mask_register_specifier to report errors for invalid cases
9557 ins
.vex
.mask_register_specifier
&= 0x3;
9559 if (dp
!= NULL
&& putop (&ins
, dp
->name
, sizeflag
) == 0)
9561 if (!get_sib (&ins
, sizeflag
))
9562 goto fetch_error_out
;
9563 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
9565 ins
.obufp
= ins
.op_out
[i
];
9566 ins
.op_ad
= MAX_OPERANDS
- 1 - i
;
9568 && !dp
->op
[i
].rtn (&ins
, dp
->op
[i
].bytemode
, sizeflag
))
9569 goto fetch_error_out
;
9570 /* For EVEX instruction after the last operand masking
9571 should be printed. */
9572 if (i
== 0 && ins
.vex
.evex
)
9574 /* Don't print {%k0}. */
9575 if (ins
.vex
.mask_register_specifier
)
9577 const char *reg_name
9578 = att_names_mask
[ins
.vex
.mask_register_specifier
];
9580 oappend (&ins
, "{");
9581 oappend_register (&ins
, reg_name
);
9582 oappend (&ins
, "}");
9584 if (ins
.vex
.zeroing
)
9585 oappend (&ins
, "{z}");
9587 else if (ins
.vex
.zeroing
)
9589 oappend (&ins
, "{bad}");
9593 /* Instructions with a mask register destination allow for
9594 zeroing-masking only (if any masking at all), which is
9595 _not_ expressed by EVEX.z. */
9596 if (ins
.vex
.zeroing
&& dp
->op
[0].bytemode
== mask_mode
)
9597 ins
.illegal_masking
= true;
9599 /* S/G insns require a mask and don't allow
9601 if ((dp
->op
[0].bytemode
== vex_vsib_d_w_dq_mode
9602 || dp
->op
[0].bytemode
== vex_vsib_q_w_dq_mode
)
9603 && (ins
.vex
.mask_register_specifier
== 0
9604 || ins
.vex
.zeroing
))
9605 ins
.illegal_masking
= true;
9607 if (ins
.illegal_masking
)
9608 oappend (&ins
, "/(bad)");
9611 /* vex.nf is cleared after being consumed. */
9613 oappend (&ins
, "{bad-nf}");
9615 /* Check whether rounding control was enabled for an insn not
9616 supporting it, when evex.b is not treated as evex.nd. */
9617 if (ins
.modrm
.mod
== 3 && ins
.vex
.b
&& ins
.evex_type
== evex_default
9618 && !(ins
.evex_used
& EVEX_b_used
))
9620 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
9622 ins
.obufp
= ins
.op_out
[i
];
9625 oappend (&ins
, names_rounding
[ins
.vex
.ll
]);
9626 oappend (&ins
, "bad}");
9633 /* Clear instruction information. */
9634 info
->insn_info_valid
= 0;
9635 info
->branch_delay_insns
= 0;
9636 info
->data_size
= 0;
9637 info
->insn_type
= dis_noninsn
;
9641 /* Reset jump operation indicator. */
9642 ins
.op_is_jump
= false;
9644 int jump_detection
= 0;
9646 /* Extract flags. */
9647 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
9649 if ((dp
->op
[i
].rtn
== OP_J
)
9650 || (dp
->op
[i
].rtn
== OP_indirE
))
9651 jump_detection
|= 1;
9652 else if ((dp
->op
[i
].rtn
== BND_Fixup
)
9653 || (!dp
->op
[i
].rtn
&& !dp
->op
[i
].bytemode
))
9654 jump_detection
|= 2;
9655 else if ((dp
->op
[i
].bytemode
== cond_jump_mode
)
9656 || (dp
->op
[i
].bytemode
== loop_jcxz_mode
))
9657 jump_detection
|= 4;
9660 /* Determine if this is a jump or branch. */
9661 if ((jump_detection
& 0x3) == 0x3)
9663 ins
.op_is_jump
= true;
9664 if (jump_detection
& 0x4)
9665 info
->insn_type
= dis_condbranch
;
9667 info
->insn_type
= (dp
->name
&& !strncmp (dp
->name
, "call", 4))
9668 ? dis_jsr
: dis_branch
;
9671 /* The purpose of placing the check here is to wait for the EVEX prefix for
9672 conditional CMP and TEST to be consumed and cleared, and then make a
9673 unified judgment. Because they are both in map4, we can not distinguish
9674 EVEX prefix for conditional CMP and TEST from others during the
9675 EVEX prefix stage of parsing. */
9676 if (ins
.evex_type
== evex_from_legacy
)
9678 /* EVEX from legacy instructions, when the EVEX.ND bit is 0,
9679 all bits of EVEX.vvvv and EVEX.V' must be 1. */
9680 if (!ins
.vex
.nd
&& (ins
.vex
.register_specifier
|| !ins
.vex
.v
))
9682 i386_dis_printf (info
, dis_style_text
, "(bad)");
9683 ret
= ins
.end_codep
- priv
.the_buffer
;
9687 /* EVEX from legacy instructions require that EVEX.z, EVEX.L’L and the
9688 lower 2 bits of EVEX.aaa must be 0. */
9689 if ((ins
.vex
.mask_register_specifier
& 0x3) != 0
9690 || ins
.vex
.ll
!= 0 || ins
.vex
.zeroing
!= 0)
9692 i386_dis_printf (info
, dis_style_text
, "(bad)");
9693 ret
= ins
.end_codep
- priv
.the_buffer
;
9697 /* If VEX.vvvv and EVEX.vvvv are unused, they must be all 1s, which
9698 are all 0s in inverted form. */
9699 if (ins
.need_vex
&& ins
.vex
.register_specifier
!= 0)
9701 i386_dis_printf (info
, dis_style_text
, "(bad)");
9702 ret
= ins
.end_codep
- priv
.the_buffer
;
9706 if ((dp
->prefix_requirement
& PREFIX_REX2_ILLEGAL
)
9707 && ins
.last_rex2_prefix
>= 0 && (ins
.rex2
& REX2_SPECIAL
) == 0)
9709 i386_dis_printf (info
, dis_style_text
, "(bad)");
9710 ret
= ins
.end_codep
- priv
.the_buffer
;
9714 switch (dp
->prefix_requirement
& ~PREFIX_REX2_ILLEGAL
)
9717 /* If only the data prefix is marked as mandatory, its absence renders
9718 the encoding invalid. Most other PREFIX_OPCODE rules still apply. */
9719 if (ins
.need_vex
? !ins
.vex
.prefix
: !(ins
.prefixes
& PREFIX_DATA
))
9721 i386_dis_printf (info
, dis_style_text
, "(bad)");
9722 ret
= ins
.end_codep
- priv
.the_buffer
;
9725 ins
.used_prefixes
|= PREFIX_DATA
;
9728 /* If the mandatory PREFIX_REPZ/PREFIX_REPNZ/PREFIX_DATA prefix is
9729 unused, opcode is invalid. Since the PREFIX_DATA prefix may be
9730 used by putop and MMX/SSE operand and may be overridden by the
9731 PREFIX_REPZ/PREFIX_REPNZ fix, we check the PREFIX_DATA prefix
9734 ? ins
.vex
.prefix
== REPE_PREFIX_OPCODE
9735 || ins
.vex
.prefix
== REPNE_PREFIX_OPCODE
9737 & (PREFIX_REPZ
| PREFIX_REPNZ
)) != 0)
9738 && (ins
.used_prefixes
9739 & (PREFIX_REPZ
| PREFIX_REPNZ
)) == 0)
9741 ? ins
.vex
.prefix
== DATA_PREFIX_OPCODE
9743 & (PREFIX_REPZ
| PREFIX_REPNZ
| PREFIX_DATA
))
9745 && (ins
.used_prefixes
& PREFIX_DATA
) == 0))
9746 || (ins
.vex
.evex
&& dp
->prefix_requirement
!= PREFIX_DATA
9747 && !ins
.vex
.w
!= !(ins
.used_prefixes
& PREFIX_DATA
)))
9749 i386_dis_printf (info
, dis_style_text
, "(bad)");
9750 ret
= ins
.end_codep
- priv
.the_buffer
;
9755 case PREFIX_IGNORED
:
9756 /* Zap data size and rep prefixes from used_prefixes and reinstate their
9757 origins in all_prefixes. */
9758 ins
.used_prefixes
&= ~PREFIX_OPCODE
;
9759 if (ins
.last_data_prefix
>= 0)
9760 ins
.all_prefixes
[ins
.last_data_prefix
] = 0x66;
9761 if (ins
.last_repz_prefix
>= 0)
9762 ins
.all_prefixes
[ins
.last_repz_prefix
] = 0xf3;
9763 if (ins
.last_repnz_prefix
>= 0)
9764 ins
.all_prefixes
[ins
.last_repnz_prefix
] = 0xf2;
9767 case PREFIX_NP_OR_DATA
:
9768 if (ins
.vex
.prefix
== REPE_PREFIX_OPCODE
9769 || ins
.vex
.prefix
== REPNE_PREFIX_OPCODE
)
9771 i386_dis_printf (info
, dis_style_text
, "(bad)");
9772 ret
= ins
.end_codep
- priv
.the_buffer
;
9780 i386_dis_printf (info
, dis_style_text
, "(bad)");
9781 ret
= ins
.end_codep
- priv
.the_buffer
;
9787 /* Check if the REX prefix is used. */
9788 if ((ins
.rex
^ ins
.rex_used
) == 0
9789 && !ins
.need_vex
&& ins
.last_rex_prefix
>= 0)
9790 ins
.all_prefixes
[ins
.last_rex_prefix
] = 0;
9792 /* Check if the REX2 prefix is used. */
9793 if (ins
.last_rex2_prefix
>= 0
9794 && ((ins
.rex2
& REX2_SPECIAL
)
9795 || (((ins
.rex2
& 7) ^ (ins
.rex2_used
& 7)) == 0
9796 && (ins
.rex
^ ins
.rex_used
) == 0
9797 && (ins
.rex2
& 7))))
9798 ins
.all_prefixes
[ins
.last_rex2_prefix
] = 0;
9800 /* Check if the SEG prefix is used. */
9801 if ((ins
.prefixes
& (PREFIX_CS
| PREFIX_SS
| PREFIX_DS
| PREFIX_ES
9802 | PREFIX_FS
| PREFIX_GS
)) != 0
9803 && (ins
.used_prefixes
& ins
.active_seg_prefix
) != 0)
9804 ins
.all_prefixes
[ins
.last_seg_prefix
] = 0;
9806 /* Check if the ADDR prefix is used. */
9807 if ((ins
.prefixes
& PREFIX_ADDR
) != 0
9808 && (ins
.used_prefixes
& PREFIX_ADDR
) != 0)
9809 ins
.all_prefixes
[ins
.last_addr_prefix
] = 0;
9811 /* Check if the DATA prefix is used. */
9812 if ((ins
.prefixes
& PREFIX_DATA
) != 0
9813 && (ins
.used_prefixes
& PREFIX_DATA
) != 0
9815 ins
.all_prefixes
[ins
.last_data_prefix
] = 0;
9817 /* Print the extra ins.prefixes. */
9819 for (i
= 0; i
< (int) ARRAY_SIZE (ins
.all_prefixes
); i
++)
9820 if (ins
.all_prefixes
[i
])
9822 const char *name
= prefix_name (ins
.address_mode
, ins
.all_prefixes
[i
],
9827 prefix_length
+= strlen (name
) + 1;
9828 if (ins
.all_prefixes
[i
] == REX2_OPCODE
)
9829 i386_dis_printf (info
, dis_style_mnemonic
, "{%s 0x%x} ", name
,
9830 (unsigned int) ins
.rex2_payload
);
9832 i386_dis_printf (info
, dis_style_mnemonic
, "%s ", name
);
9835 /* Check maximum code length. */
9836 if ((ins
.codep
- ins
.start_codep
) > MAX_CODE_LENGTH
)
9838 i386_dis_printf (info
, dis_style_text
, "(bad)");
9839 ret
= MAX_CODE_LENGTH
;
9843 /* Calculate the number of operands this instruction has. */
9845 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
9846 if (*ins
.op_out
[i
] != '\0')
9849 /* Calculate the number of spaces to print after the mnemonic. */
9850 ins
.obufp
= ins
.mnemonicendp
;
9853 i
= strlen (ins
.obuf
) + prefix_length
;
9862 /* Print the instruction mnemonic along with any trailing whitespace. */
9863 i386_dis_printf (info
, dis_style_mnemonic
, "%s%*s", ins
.obuf
, i
, "");
9865 /* The enter and bound instructions are printed with operands in the same
9866 order as the intel book; everything else is printed in reverse order. */
9867 intel_swap_2_3
= false;
9868 if (ins
.intel_syntax
|| ins
.two_source_ops
)
9870 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
9871 op_txt
[i
] = ins
.op_out
[i
];
9873 if (ins
.intel_syntax
&& dp
&& dp
->op
[2].rtn
== OP_Rounding
9874 && dp
->op
[3].rtn
== OP_E
&& dp
->op
[4].rtn
== NULL
)
9876 op_txt
[2] = ins
.op_out
[3];
9877 op_txt
[3] = ins
.op_out
[2];
9878 intel_swap_2_3
= true;
9881 for (i
= 0; i
< (MAX_OPERANDS
>> 1); ++i
)
9885 ins
.op_ad
= ins
.op_index
[i
];
9886 ins
.op_index
[i
] = ins
.op_index
[MAX_OPERANDS
- 1 - i
];
9887 ins
.op_index
[MAX_OPERANDS
- 1 - i
] = ins
.op_ad
;
9888 riprel
= ins
.op_riprel
[i
];
9889 ins
.op_riprel
[i
] = ins
.op_riprel
[MAX_OPERANDS
- 1 - i
];
9890 ins
.op_riprel
[MAX_OPERANDS
- 1 - i
] = riprel
;
9895 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
9896 op_txt
[MAX_OPERANDS
- 1 - i
] = ins
.op_out
[i
];
9900 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
9903 /* In Intel syntax embedded rounding / SAE are not separate operands.
9904 Instead they're attached to the prior register operand. Simply
9905 suppress emission of the comma to achieve that effect. */
9906 switch (i
& -(ins
.intel_syntax
&& dp
))
9909 if (dp
->op
[2].rtn
== OP_Rounding
&& !intel_swap_2_3
)
9913 if (dp
->op
[3].rtn
== OP_Rounding
|| intel_swap_2_3
)
9918 i386_dis_printf (info
, dis_style_text
, ",");
9919 if (ins
.op_index
[i
] != -1 && !ins
.op_riprel
[i
])
9921 bfd_vma target
= (bfd_vma
) ins
.op_address
[ins
.op_index
[i
]];
9925 info
->insn_info_valid
= 1;
9926 info
->branch_delay_insns
= 0;
9927 info
->data_size
= 0;
9928 info
->target
= target
;
9931 (*info
->print_address_func
) (target
, info
);
9934 i386_dis_printf (info
, dis_style_text
, "%s", op_txt
[i
]);
9938 for (i
= 0; i
< MAX_OPERANDS
; i
++)
9939 if (ins
.op_index
[i
] != -1 && ins
.op_riprel
[i
])
9941 i386_dis_printf (info
, dis_style_comment_start
, " # ");
9942 (*info
->print_address_func
)
9943 ((bfd_vma
)(ins
.start_pc
+ (ins
.codep
- ins
.start_codep
)
9944 + ins
.op_address
[ins
.op_index
[i
]]),
9948 ret
= ins
.codep
- priv
.the_buffer
;
9950 info
->private_data
= NULL
;
9954 /* Here for backwards compatibility. When gdb stops using
9955 print_insn_i386_att and print_insn_i386_intel these functions can
9956 disappear, and print_insn_i386 be merged into print_insn. */
9958 print_insn_i386_att (bfd_vma pc
, disassemble_info
*info
)
9960 return print_insn (pc
, info
, 0);
9964 print_insn_i386_intel (bfd_vma pc
, disassemble_info
*info
)
9966 return print_insn (pc
, info
, 1);
9970 print_insn_i386 (bfd_vma pc
, disassemble_info
*info
)
9972 return print_insn (pc
, info
, -1);
9975 static const char *float_mem
[] = {
10050 static const unsigned char float_mem_mode
[] = {
10125 #define ST { OP_ST, 0 }
10126 #define STi { OP_STi, 0 }
10128 #define FGRPd9_2 NULL, { { NULL, 1 } }, 0
10129 #define FGRPd9_4 NULL, { { NULL, 2 } }, 0
10130 #define FGRPd9_5 NULL, { { NULL, 3 } }, 0
10131 #define FGRPd9_6 NULL, { { NULL, 4 } }, 0
10132 #define FGRPd9_7 NULL, { { NULL, 5 } }, 0
10133 #define FGRPda_5 NULL, { { NULL, 6 } }, 0
10134 #define FGRPdb_4 NULL, { { NULL, 7 } }, 0
10135 #define FGRPde_3 NULL, { { NULL, 8 } }, 0
10136 #define FGRPdf_4 NULL, { { NULL, 9 } }, 0
10138 static const struct dis386 float_reg
[][8] = {
10141 { "fadd", { ST
, STi
}, 0 },
10142 { "fmul", { ST
, STi
}, 0 },
10143 { "fcom", { STi
}, 0 },
10144 { "fcomp", { STi
}, 0 },
10145 { "fsub", { ST
, STi
}, 0 },
10146 { "fsubr", { ST
, STi
}, 0 },
10147 { "fdiv", { ST
, STi
}, 0 },
10148 { "fdivr", { ST
, STi
}, 0 },
10152 { "fld", { STi
}, 0 },
10153 { "fxch", { STi
}, 0 },
10163 { "fcmovb", { ST
, STi
}, 0 },
10164 { "fcmove", { ST
, STi
}, 0 },
10165 { "fcmovbe",{ ST
, STi
}, 0 },
10166 { "fcmovu", { ST
, STi
}, 0 },
10174 { "fcmovnb",{ ST
, STi
}, 0 },
10175 { "fcmovne",{ ST
, STi
}, 0 },
10176 { "fcmovnbe",{ ST
, STi
}, 0 },
10177 { "fcmovnu",{ ST
, STi
}, 0 },
10179 { "fucomi", { ST
, STi
}, 0 },
10180 { "fcomi", { ST
, STi
}, 0 },
10185 { "fadd", { STi
, ST
}, 0 },
10186 { "fmul", { STi
, ST
}, 0 },
10189 { "fsub{!M|r}", { STi
, ST
}, 0 },
10190 { "fsub{M|}", { STi
, ST
}, 0 },
10191 { "fdiv{!M|r}", { STi
, ST
}, 0 },
10192 { "fdiv{M|}", { STi
, ST
}, 0 },
10196 { "ffree", { STi
}, 0 },
10198 { "fst", { STi
}, 0 },
10199 { "fstp", { STi
}, 0 },
10200 { "fucom", { STi
}, 0 },
10201 { "fucomp", { STi
}, 0 },
10207 { "faddp", { STi
, ST
}, 0 },
10208 { "fmulp", { STi
, ST
}, 0 },
10211 { "fsub{!M|r}p", { STi
, ST
}, 0 },
10212 { "fsub{M|}p", { STi
, ST
}, 0 },
10213 { "fdiv{!M|r}p", { STi
, ST
}, 0 },
10214 { "fdiv{M|}p", { STi
, ST
}, 0 },
10218 { "ffreep", { STi
}, 0 },
10223 { "fucomip", { ST
, STi
}, 0 },
10224 { "fcomip", { ST
, STi
}, 0 },
10229 static const char *const fgrps
[][8] = {
10232 "(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10237 "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10242 "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
10247 "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
10252 "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
10257 "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
10262 "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10267 "fNeni(8087 only)","fNdisi(8087 only)","fNclex","fNinit",
10268 "fNsetpm(287 only)","frstpm(287 only)","(bad)","(bad)",
10273 "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10278 "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10282 static const char *const oszc_flags
[16] = {
10283 " {dfv=}", " {dfv=cf}", " {dfv=zf}", " {dfv=zf, cf}", " {dfv=sf}",
10284 " {dfv=sf, cf}", " {dfv=sf, zf}", " {dfv=sf, zf, cf}", " {dfv=of}",
10285 " {dfv=of, cf}", " {dfv=of, zf}", " {dfv=of, zf, cf}", " {dfv=of, sf}",
10286 " {dfv=of, sf, cf}", " {dfv=of, sf, zf}", " {dfv=of, sf, zf, cf}"
10289 static const char *const scc_suffix
[16] = {
10290 "o", "no", "b", "ae", "e", "ne", "be", "a", "s", "ns", "t", "f",
10291 "l", "ge", "le", "g"
10295 swap_operand (instr_info
*ins
)
10297 char *p
= ins
->mnemonicendp
;
10301 while (*--p
!= '{')
10303 if (p
<= ins
->obuf
+ 2)
10309 memmove (p
+ 2, p
, ins
->mnemonicendp
- p
+ 1);
10312 ins
->mnemonicendp
+= 2;
10316 dofloat (instr_info
*ins
, int sizeflag
)
10318 const struct dis386
*dp
;
10319 unsigned char floatop
= ins
->codep
[-1];
10321 if (ins
->modrm
.mod
!= 3)
10323 int fp_indx
= (floatop
- 0xd8) * 8 + ins
->modrm
.reg
;
10325 putop (ins
, float_mem
[fp_indx
], sizeflag
);
10326 ins
->obufp
= ins
->op_out
[0];
10328 return OP_E (ins
, float_mem_mode
[fp_indx
], sizeflag
);
10330 /* Skip mod/rm byte. */
10334 dp
= &float_reg
[floatop
- 0xd8][ins
->modrm
.reg
];
10335 if (dp
->name
== NULL
)
10337 putop (ins
, fgrps
[dp
->op
[0].bytemode
][ins
->modrm
.rm
], sizeflag
);
10339 /* Instruction fnstsw is only one with strange arg. */
10340 if (floatop
== 0xdf && ins
->codep
[-1] == 0xe0)
10341 strcpy (ins
->op_out
[0], att_names16
[0] + ins
->intel_syntax
);
10345 putop (ins
, dp
->name
, sizeflag
);
10347 ins
->obufp
= ins
->op_out
[0];
10350 && !dp
->op
[0].rtn (ins
, dp
->op
[0].bytemode
, sizeflag
))
10353 ins
->obufp
= ins
->op_out
[1];
10356 && !dp
->op
[1].rtn (ins
, dp
->op
[1].bytemode
, sizeflag
))
10363 OP_ST (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
10364 int sizeflag ATTRIBUTE_UNUSED
)
10366 oappend_register (ins
, "%st");
10371 OP_STi (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
10372 int sizeflag ATTRIBUTE_UNUSED
)
10375 int res
= snprintf (scratch
, ARRAY_SIZE (scratch
), "%%st(%d)", ins
->modrm
.rm
);
10377 if (res
< 0 || (size_t) res
>= ARRAY_SIZE (scratch
))
10379 oappend_register (ins
, scratch
);
10383 /* Capital letters in template are macros. */
10385 putop (instr_info
*ins
, const char *in_template
, int sizeflag
)
10390 unsigned int l
= 0, len
= 0;
10392 bool evex_printed
= false;
10394 /* We don't want to add any prefix or suffix to (bad), so return early. */
10395 if (!strncmp (in_template
, "(bad)", 5))
10397 oappend (ins
, "(bad)");
10399 ins
->mnemonicendp
= ins
->obufp
;
10403 for (p
= in_template
; *p
; p
++)
10407 if (l
>= sizeof (last
) || !ISUPPER (*p
))
10415 if (ins
->evex_type
== evex_from_legacy
&& !ins
->vex
.nd
10416 && !(ins
->rex2
& 7) && !evex_printed
)
10418 oappend (ins
, "{evex} ");
10419 evex_printed
= true;
10421 *ins
->obufp
++ = *p
;
10430 if (ins
->intel_syntax
)
10432 while (*++p
!= '|')
10433 if (*p
== '}' || *p
== '\0')
10439 while (*++p
!= '}')
10449 if (ins
->intel_syntax
)
10451 if ((ins
->need_modrm
&& ins
->modrm
.mod
!= 3 && !ins
->vex
.nd
)
10452 || (sizeflag
& SUFFIX_ALWAYS
))
10453 *ins
->obufp
++ = 'b';
10459 if (ins
->intel_syntax
)
10461 if (sizeflag
& SUFFIX_ALWAYS
)
10462 *ins
->obufp
++ = 'b';
10464 else if (l
== 1 && last
[0] == 'L')
10466 if (ins
->address_mode
== mode_64bit
10467 && !(ins
->prefixes
& PREFIX_ADDR
))
10469 *ins
->obufp
++ = 'a';
10470 *ins
->obufp
++ = 'b';
10471 *ins
->obufp
++ = 's';
10480 if (l
== 1 && last
[0] == 'C')
10482 /* Condition code (taken from the map-0 Jcc entries). */
10483 for (const char *q
= dis386
[0x70 | ins
->condition_code
].name
+ 1;
10485 *ins
->obufp
++ = *q
;
10488 else if (l
== 1 && last
[0] == 'S')
10490 /* Add scc suffix. */
10491 oappend (ins
, scc_suffix
[ins
->vex
.scc
]);
10493 /* For SCC insns, the ND bit is required to be set to 0. */
10495 oappend (ins
, "(bad)");
10497 /* These bits have been consumed and should be cleared or restored
10498 to default values. */
10500 ins
->vex
.nf
= false;
10501 ins
->vex
.mask_register_specifier
= 0;
10507 if (ins
->intel_syntax
&& !alt
)
10509 if ((ins
->prefixes
& PREFIX_DATA
) || (sizeflag
& SUFFIX_ALWAYS
))
10511 if (sizeflag
& DFLAG
)
10512 *ins
->obufp
++ = ins
->intel_syntax
? 'd' : 'l';
10514 *ins
->obufp
++ = ins
->intel_syntax
? 'w' : 's';
10515 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
10524 if (!ins
->vex
.evex
|| ins
->vex
.w
)
10525 *ins
->obufp
++ = 'd';
10527 oappend (ins
, "{bad}");
10536 if (ins
->intel_syntax
|| !(sizeflag
& SUFFIX_ALWAYS
))
10539 if (ins
->modrm
.mod
== 3)
10541 if (ins
->rex
& REX_W
)
10542 *ins
->obufp
++ = 'q';
10545 if (sizeflag
& DFLAG
)
10546 *ins
->obufp
++ = ins
->intel_syntax
? 'd' : 'l';
10548 *ins
->obufp
++ = 'w';
10549 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
10553 *ins
->obufp
++ = 'w';
10561 if (!ins
->vex
.evex
|| ins
->vex
.b
|| ins
->vex
.ll
>= 2
10563 || (ins
->modrm
.mod
== 3 && (ins
->rex
& REX_X
))
10564 || !ins
->vex
.v
|| ins
->vex
.mask_register_specifier
)
10566 /* AVX512 extends a number of V*D insns to also have V*Q variants,
10567 merely distinguished by EVEX.W. Look for a use of the
10568 respective macro. */
10571 const char *pct
= strchr (p
+ 1, '%');
10573 if (pct
!= NULL
&& pct
[1] == 'D' && pct
[2] == 'Q')
10576 *ins
->obufp
++ = '{';
10577 *ins
->obufp
++ = 'e';
10578 *ins
->obufp
++ = 'v';
10579 *ins
->obufp
++ = 'e';
10580 *ins
->obufp
++ = 'x';
10581 *ins
->obufp
++ = '}';
10582 *ins
->obufp
++ = ' ';
10585 /* Skip printing {evex} for some special instructions in MAP4. */
10586 evex_printed
= true;
10593 /* For jcxz/jecxz */
10594 if (ins
->address_mode
== mode_64bit
)
10596 if (sizeflag
& AFLAG
)
10597 *ins
->obufp
++ = 'r';
10599 *ins
->obufp
++ = 'e';
10602 if (sizeflag
& AFLAG
)
10603 *ins
->obufp
++ = 'e';
10604 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_ADDR
);
10609 if (ins
->intel_syntax
)
10611 if ((ins
->prefixes
& PREFIX_ADDR
) || (sizeflag
& SUFFIX_ALWAYS
))
10613 if (sizeflag
& AFLAG
)
10614 *ins
->obufp
++ = ins
->address_mode
== mode_64bit
? 'q' : 'l';
10616 *ins
->obufp
++ = ins
->address_mode
== mode_64bit
? 'l' : 'w';
10617 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_ADDR
);
10620 else if (l
== 1 && last
[0] == 'C')
10622 if (ins
->vex
.nd
&& !ins
->vex
.nf
)
10624 *ins
->obufp
++ = 'c';
10625 *ins
->obufp
++ = 'f';
10626 /* Skip printing {evex} */
10627 evex_printed
= true;
10629 else if (l
== 1 && last
[0] == 'N')
10633 oappend (ins
, "{nf} ");
10634 /* This bit needs to be cleared after it is consumed. */
10635 ins
->vex
.nf
= false;
10636 evex_printed
= true;
10638 else if (ins
->evex_type
== evex_from_vex
&& !(ins
->rex2
& 7)
10641 oappend (ins
, "{evex} ");
10642 evex_printed
= true;
10645 else if (l
== 1 && last
[0] == 'D')
10647 /* Get oszc flags value from register_specifier. */
10648 int oszc_value
= ~ins
->vex
.register_specifier
& 0xf;
10650 /* Add {dfv=of, sf, zf, cf} flags. */
10651 oappend (ins
, oszc_flags
[oszc_value
]);
10653 /* These bits have been consumed and should be cleared. */
10654 ins
->vex
.register_specifier
= 0;
10660 if (ins
->intel_syntax
|| (ins
->obufp
[-1] != 's'
10661 && !(sizeflag
& SUFFIX_ALWAYS
)))
10663 if ((ins
->rex
& REX_W
) || (sizeflag
& DFLAG
))
10664 *ins
->obufp
++ = 'l';
10666 *ins
->obufp
++ = 'w';
10667 if (!(ins
->rex
& REX_W
))
10668 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
10673 if (ins
->intel_syntax
)
10675 if ((ins
->prefixes
& (PREFIX_CS
| PREFIX_DS
)) == PREFIX_CS
10676 || (ins
->prefixes
& (PREFIX_CS
| PREFIX_DS
)) == PREFIX_DS
)
10678 ins
->used_prefixes
|= ins
->prefixes
& (PREFIX_CS
| PREFIX_DS
);
10679 *ins
->obufp
++ = ',';
10680 *ins
->obufp
++ = 'p';
10682 /* Set active_seg_prefix even if not set in 64-bit mode
10683 because here it is a valid branch hint. */
10684 if (ins
->prefixes
& PREFIX_DS
)
10686 ins
->active_seg_prefix
= PREFIX_DS
;
10687 *ins
->obufp
++ = 't';
10691 ins
->active_seg_prefix
= PREFIX_CS
;
10692 *ins
->obufp
++ = 'n';
10696 else if (l
== 1 && last
[0] == 'X')
10699 *ins
->obufp
++ = 'h';
10701 oappend (ins
, "{bad}");
10708 if (ins
->rex
& REX_W
)
10709 *ins
->obufp
++ = 'q';
10711 *ins
->obufp
++ = 'd';
10714 if (ins
->intel_syntax
)
10716 if (sizeflag
& SUFFIX_ALWAYS
)
10718 if (ins
->rex
& REX_W
)
10719 *ins
->obufp
++ = 'q';
10721 *ins
->obufp
++ = 'l';
10725 if (ins
->intel_mnemonic
!= cond
)
10726 *ins
->obufp
++ = 'r';
10729 if ((ins
->prefixes
& PREFIX_FWAIT
) == 0)
10730 *ins
->obufp
++ = 'n';
10732 ins
->used_prefixes
|= PREFIX_FWAIT
;
10736 if (ins
->rex
& REX_W
)
10737 *ins
->obufp
++ = 'o';
10738 else if (ins
->intel_syntax
&& (sizeflag
& DFLAG
))
10739 *ins
->obufp
++ = 'q';
10741 *ins
->obufp
++ = 'd';
10742 if (!(ins
->rex
& REX_W
))
10743 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
10746 if (ins
->address_mode
== mode_64bit
10747 && (ins
->isa64
== intel64
|| (ins
->rex
& REX_W
)
10748 || !(ins
->prefixes
& PREFIX_DATA
)))
10750 if (sizeflag
& SUFFIX_ALWAYS
)
10751 *ins
->obufp
++ = 'q';
10754 /* Fall through. */
10758 if (!cond
&& ins
->last_rex2_prefix
>= 0 && (ins
->rex
& REX_W
))
10760 /* For pushp and popp, p is printed and do not print {rex2}
10762 *ins
->obufp
++ = 'p';
10763 ins
->rex2
|= REX2_SPECIAL
;
10767 /* For "!P" print nothing else in Intel syntax. */
10768 if (!cond
&& ins
->intel_syntax
)
10771 if ((ins
->modrm
.mod
== 3 || !cond
)
10772 && !(sizeflag
& SUFFIX_ALWAYS
))
10774 /* Fall through. */
10776 if ((!(ins
->rex
& REX_W
) && (ins
->prefixes
& PREFIX_DATA
))
10777 || ((sizeflag
& SUFFIX_ALWAYS
)
10778 && ins
->address_mode
!= mode_64bit
))
10780 *ins
->obufp
++ = (sizeflag
& DFLAG
)
10781 ? ins
->intel_syntax
? 'd' : 'l' : 'w';
10782 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
10784 else if (sizeflag
& SUFFIX_ALWAYS
)
10785 *ins
->obufp
++ = 'q';
10787 else if (l
== 1 && last
[0] == 'L')
10789 if ((ins
->prefixes
& PREFIX_DATA
)
10790 || (ins
->rex
& REX_W
)
10791 || (sizeflag
& SUFFIX_ALWAYS
))
10794 if (ins
->rex
& REX_W
)
10795 *ins
->obufp
++ = 'q';
10798 if (sizeflag
& DFLAG
)
10799 *ins
->obufp
++ = ins
->intel_syntax
? 'd' : 'l';
10801 *ins
->obufp
++ = 'w';
10802 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
10812 if (ins
->intel_syntax
&& !alt
)
10815 if ((ins
->need_modrm
&& ins
->modrm
.mod
!= 3 && !ins
->vex
.nd
)
10816 || (sizeflag
& SUFFIX_ALWAYS
))
10818 if (ins
->rex
& REX_W
)
10819 *ins
->obufp
++ = 'q';
10822 if (sizeflag
& DFLAG
)
10823 *ins
->obufp
++ = ins
->intel_syntax
? 'd' : 'l';
10825 *ins
->obufp
++ = 'w';
10826 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
10830 else if (l
== 1 && last
[0] == 'D')
10831 *ins
->obufp
++ = ins
->vex
.w
? 'q' : 'd';
10832 else if (l
== 1 && last
[0] == 'L')
10834 if (cond
? ins
->modrm
.mod
== 3 && !(sizeflag
& SUFFIX_ALWAYS
)
10835 : ins
->address_mode
!= mode_64bit
)
10837 if ((ins
->rex
& REX_W
))
10840 *ins
->obufp
++ = 'q';
10842 else if ((ins
->address_mode
== mode_64bit
&& cond
)
10843 || (sizeflag
& SUFFIX_ALWAYS
))
10844 *ins
->obufp
++ = ins
->intel_syntax
? 'd' : 'l';
10851 if (ins
->rex
& REX_W
)
10852 *ins
->obufp
++ = 'q';
10853 else if (sizeflag
& DFLAG
)
10855 if (ins
->intel_syntax
)
10856 *ins
->obufp
++ = 'd';
10858 *ins
->obufp
++ = 'l';
10861 *ins
->obufp
++ = 'w';
10862 if (ins
->intel_syntax
&& !p
[1]
10863 && ((ins
->rex
& REX_W
) || (sizeflag
& DFLAG
)))
10864 *ins
->obufp
++ = 'e';
10865 if (!(ins
->rex
& REX_W
))
10866 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
10872 if (ins
->intel_syntax
)
10874 if (sizeflag
& SUFFIX_ALWAYS
)
10876 if (ins
->rex
& REX_W
)
10877 *ins
->obufp
++ = 'q';
10880 if (sizeflag
& DFLAG
)
10881 *ins
->obufp
++ = 'l';
10883 *ins
->obufp
++ = 'w';
10884 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
10894 if (ins
->address_mode
== mode_64bit
10895 && !(ins
->prefixes
& PREFIX_ADDR
))
10897 *ins
->obufp
++ = 'a';
10898 *ins
->obufp
++ = 'b';
10899 *ins
->obufp
++ = 's';
10904 if (!ins
->vex
.evex
|| !ins
->vex
.w
)
10905 *ins
->obufp
++ = 's';
10907 oappend (ins
, "{bad}");
10914 if (l
== 1 && (last
[0] == 'Z'))
10916 /* Although IMUL/SETcc does not support NDD, the EVEX.ND bit is
10917 used to control whether its destination register has its upper
10920 oappend (ins
, "zu");
10929 *ins
->obufp
++ = 'v';
10938 *ins
->obufp
++ = '{';
10939 *ins
->obufp
++ = 'v';
10940 *ins
->obufp
++ = 'e';
10941 *ins
->obufp
++ = 'x';
10942 *ins
->obufp
++ = '}';
10943 *ins
->obufp
++ = ' ';
10946 if (ins
->rex
& REX_W
)
10948 *ins
->obufp
++ = 'a';
10949 *ins
->obufp
++ = 'b';
10950 *ins
->obufp
++ = 's';
10963 /* operand size flag for cwtl, cbtw */
10965 if (ins
->rex
& REX_W
)
10967 if (ins
->intel_syntax
)
10968 *ins
->obufp
++ = 'd';
10970 *ins
->obufp
++ = 'l';
10972 else if (sizeflag
& DFLAG
)
10973 *ins
->obufp
++ = 'w';
10975 *ins
->obufp
++ = 'b';
10976 if (!(ins
->rex
& REX_W
))
10977 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
10981 if (!ins
->need_vex
)
10983 if (last
[0] == 'X')
10984 *ins
->obufp
++ = ins
->vex
.w
? 'd': 's';
10985 else if (last
[0] == 'B')
10986 *ins
->obufp
++ = ins
->vex
.w
? 'w': 'b';
10997 ? ins
->vex
.prefix
== DATA_PREFIX_OPCODE
10998 : ins
->prefixes
& PREFIX_DATA
)
11000 *ins
->obufp
++ = 'd';
11001 ins
->used_prefixes
|= PREFIX_DATA
;
11004 *ins
->obufp
++ = 's';
11009 if (ins
->vex
.mask_register_specifier
)
11010 ins
->illegal_masking
= true;
11012 else if (l
== 1 && last
[0] == 'X')
11014 if (!ins
->need_vex
)
11016 if (ins
->intel_syntax
11017 || ((ins
->modrm
.mod
== 3 || ins
->vex
.b
)
11018 && !(sizeflag
& SUFFIX_ALWAYS
)))
11020 switch (ins
->vex
.length
)
11023 *ins
->obufp
++ = 'x';
11026 *ins
->obufp
++ = 'y';
11029 if (!ins
->vex
.evex
)
11040 /* These insns ignore ModR/M.mod: Force it to 3 for OP_E(). */
11041 ins
->modrm
.mod
= 3;
11042 if (!ins
->intel_syntax
&& (sizeflag
& SUFFIX_ALWAYS
))
11043 *ins
->obufp
++ = ins
->address_mode
== mode_64bit
? 'q' : 'l';
11045 else if (l
== 1 && last
[0] == 'X')
11047 if (!ins
->vex
.evex
)
11049 if (ins
->intel_syntax
11050 || ((ins
->modrm
.mod
== 3 || ins
->vex
.b
)
11051 && !(sizeflag
& SUFFIX_ALWAYS
)))
11053 switch (ins
->vex
.length
)
11056 *ins
->obufp
++ = 'x';
11059 *ins
->obufp
++ = 'y';
11062 *ins
->obufp
++ = 'z';
11072 if (ins
->intel_syntax
)
11074 if (ins
->isa64
== intel64
&& (ins
->rex
& REX_W
))
11077 *ins
->obufp
++ = 'q';
11080 if ((ins
->prefixes
& PREFIX_DATA
) || (sizeflag
& SUFFIX_ALWAYS
))
11082 if (sizeflag
& DFLAG
)
11083 *ins
->obufp
++ = 'l';
11085 *ins
->obufp
++ = 'w';
11086 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
11095 ins
->mnemonicendp
= ins
->obufp
;
11099 /* Add a style marker to *INS->obufp that encodes STYLE. This assumes that
11100 the buffer pointed to by INS->obufp has space. A style marker is made
11101 from the STYLE_MARKER_CHAR followed by STYLE converted to a single hex
11102 digit, followed by another STYLE_MARKER_CHAR. This function assumes
11103 that the number of styles is not greater than 16. */
11106 oappend_insert_style (instr_info
*ins
, enum disassembler_style style
)
11108 unsigned num
= (unsigned) style
;
11110 /* We currently assume that STYLE can be encoded as a single hex
11111 character. If more styles are added then this might start to fail,
11112 and we'll need to expand this code. */
11116 *ins
->obufp
++ = STYLE_MARKER_CHAR
;
11117 *ins
->obufp
++ = (num
< 10 ? ('0' + num
)
11118 : ((num
< 16) ? ('a' + (num
- 10)) : '0'));
11119 *ins
->obufp
++ = STYLE_MARKER_CHAR
;
11121 /* This final null character is not strictly necessary, after inserting a
11122 style marker we should always be inserting some additional content.
11123 However, having the buffer null terminated doesn't cost much, and make
11124 it easier to debug what's going on. Also, if we do ever forget to add
11125 any additional content after this style marker, then the buffer will
11126 still be well formed. */
11127 *ins
->obufp
= '\0';
11131 oappend_with_style (instr_info
*ins
, const char *s
,
11132 enum disassembler_style style
)
11134 oappend_insert_style (ins
, style
);
11135 ins
->obufp
= stpcpy (ins
->obufp
, s
);
11138 /* Add a single character C to the buffer pointer to by INS->obufp, marking
11139 the style for the character as STYLE. */
11142 oappend_char_with_style (instr_info
*ins
, const char c
,
11143 enum disassembler_style style
)
11145 oappend_insert_style (ins
, style
);
11147 *ins
->obufp
= '\0';
11150 /* Like oappend_char_with_style, but always uses dis_style_text. */
11153 oappend_char (instr_info
*ins
, const char c
)
11155 oappend_char_with_style (ins
, c
, dis_style_text
);
11159 append_seg (instr_info
*ins
)
11161 /* Only print the active segment register. */
11162 if (!ins
->active_seg_prefix
)
11165 ins
->used_prefixes
|= ins
->active_seg_prefix
;
11166 switch (ins
->active_seg_prefix
)
11169 oappend_register (ins
, att_names_seg
[1]);
11172 oappend_register (ins
, att_names_seg
[3]);
11175 oappend_register (ins
, att_names_seg
[2]);
11178 oappend_register (ins
, att_names_seg
[0]);
11181 oappend_register (ins
, att_names_seg
[4]);
11184 oappend_register (ins
, att_names_seg
[5]);
11189 oappend_char (ins
, ':');
11193 print_operand_value (instr_info
*ins
, bfd_vma disp
,
11194 enum disassembler_style style
)
11198 if (ins
->address_mode
!= mode_64bit
)
11199 disp
&= 0xffffffff;
11200 sprintf (tmp
, "0x%" PRIx64
, (uint64_t) disp
);
11201 oappend_with_style (ins
, tmp
, style
);
11204 /* Like oappend, but called for immediate operands. */
11207 oappend_immediate (instr_info
*ins
, bfd_vma imm
)
11209 if (!ins
->intel_syntax
)
11210 oappend_char_with_style (ins
, '$', dis_style_immediate
);
11211 print_operand_value (ins
, imm
, dis_style_immediate
);
11214 /* Put DISP in BUF as signed hex number. */
11217 print_displacement (instr_info
*ins
, bfd_signed_vma val
)
11223 oappend_char_with_style (ins
, '-', dis_style_address_offset
);
11224 val
= (bfd_vma
) 0 - val
;
11226 /* Check for possible overflow. */
11229 switch (ins
->address_mode
)
11232 oappend_with_style (ins
, "0x8000000000000000",
11233 dis_style_address_offset
);
11236 oappend_with_style (ins
, "0x80000000",
11237 dis_style_address_offset
);
11240 oappend_with_style (ins
, "0x8000",
11241 dis_style_address_offset
);
11248 sprintf (tmp
, "0x%" PRIx64
, (int64_t) val
);
11249 oappend_with_style (ins
, tmp
, dis_style_address_offset
);
11253 intel_operand_size (instr_info
*ins
, int bytemode
, int sizeflag
)
11255 /* Check if there is a broadcast, when evex.b is not treated as evex.nd. */
11256 if (ins
->vex
.b
&& ins
->evex_type
== evex_default
)
11258 if (!ins
->vex
.no_broadcast
)
11262 case evex_half_bcst_xmmq_mode
:
11264 oappend (ins
, "QWORD BCST ");
11266 oappend (ins
, "DWORD BCST ");
11269 case evex_half_bcst_xmmqh_mode
:
11270 case evex_half_bcst_xmmqdh_mode
:
11271 oappend (ins
, "WORD BCST ");
11274 ins
->vex
.no_broadcast
= true;
11284 oappend (ins
, "BYTE PTR ");
11289 oappend (ins
, "WORD PTR ");
11292 if (ins
->address_mode
== mode_64bit
&& ins
->isa64
== intel64
)
11294 oappend (ins
, "QWORD PTR ");
11297 /* Fall through. */
11299 if (ins
->address_mode
== mode_64bit
&& ((sizeflag
& DFLAG
)
11300 || (ins
->rex
& REX_W
)))
11302 oappend (ins
, "QWORD PTR ");
11305 /* Fall through. */
11310 if (ins
->rex
& REX_W
)
11311 oappend (ins
, "QWORD PTR ");
11312 else if (bytemode
== dq_mode
)
11313 oappend (ins
, "DWORD PTR ");
11316 if (sizeflag
& DFLAG
)
11317 oappend (ins
, "DWORD PTR ");
11319 oappend (ins
, "WORD PTR ");
11320 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
11324 if ((ins
->rex
& REX_W
) || (sizeflag
& DFLAG
))
11325 *ins
->obufp
++ = 'D';
11326 oappend (ins
, "WORD PTR ");
11327 if (!(ins
->rex
& REX_W
))
11328 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
11331 if (sizeflag
& DFLAG
)
11332 oappend (ins
, "QWORD PTR ");
11334 oappend (ins
, "DWORD PTR ");
11335 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
11338 if (!(sizeflag
& DFLAG
) && ins
->isa64
== intel64
)
11339 oappend (ins
, "WORD PTR ");
11341 oappend (ins
, "DWORD PTR ");
11342 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
11346 oappend (ins
, "DWORD PTR ");
11350 oappend (ins
, "QWORD PTR ");
11353 if (ins
->address_mode
== mode_64bit
)
11354 oappend (ins
, "QWORD PTR ");
11356 oappend (ins
, "DWORD PTR ");
11359 if (sizeflag
& DFLAG
)
11360 oappend (ins
, "FWORD PTR ");
11362 oappend (ins
, "DWORD PTR ");
11363 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
11366 oappend (ins
, "TBYTE PTR ");
11371 case evex_x_gscat_mode
:
11372 case evex_x_nobcst_mode
:
11376 switch (ins
->vex
.length
)
11379 oappend (ins
, "XMMWORD PTR ");
11382 oappend (ins
, "YMMWORD PTR ");
11385 oappend (ins
, "ZMMWORD PTR ");
11392 oappend (ins
, "XMMWORD PTR ");
11395 oappend (ins
, "XMMWORD PTR ");
11398 oappend (ins
, "YMMWORD PTR ");
11401 case evex_half_bcst_xmmqh_mode
:
11402 case evex_half_bcst_xmmq_mode
:
11403 switch (ins
->vex
.length
)
11407 oappend (ins
, "QWORD PTR ");
11410 oappend (ins
, "XMMWORD PTR ");
11413 oappend (ins
, "YMMWORD PTR ");
11420 if (!ins
->need_vex
)
11423 switch (ins
->vex
.length
)
11426 oappend (ins
, "WORD PTR ");
11429 oappend (ins
, "DWORD PTR ");
11432 oappend (ins
, "QWORD PTR ");
11439 case evex_half_bcst_xmmqdh_mode
:
11440 if (!ins
->need_vex
)
11443 switch (ins
->vex
.length
)
11446 oappend (ins
, "DWORD PTR ");
11449 oappend (ins
, "QWORD PTR ");
11452 oappend (ins
, "XMMWORD PTR ");
11459 if (!ins
->need_vex
)
11462 switch (ins
->vex
.length
)
11465 oappend (ins
, "QWORD PTR ");
11468 oappend (ins
, "YMMWORD PTR ");
11471 oappend (ins
, "ZMMWORD PTR ");
11478 oappend (ins
, "OWORD PTR ");
11480 case vex_vsib_d_w_dq_mode
:
11481 case vex_vsib_q_w_dq_mode
:
11482 if (!ins
->need_vex
)
11485 oappend (ins
, "QWORD PTR ");
11487 oappend (ins
, "DWORD PTR ");
11490 if (!ins
->need_vex
|| ins
->vex
.length
!= 128)
11493 oappend (ins
, "DWORD PTR ");
11495 oappend (ins
, "BYTE PTR ");
11498 if (!ins
->need_vex
)
11501 oappend (ins
, "QWORD PTR ");
11503 oappend (ins
, "WORD PTR ");
11513 print_register (instr_info
*ins
, unsigned int reg
, unsigned int rexmask
,
11514 int bytemode
, int sizeflag
)
11516 const char (*names
)[8];
11518 /* Masking is invalid for insns with GPR destination. Set the flag uniformly,
11519 as the consumer will inspect it only for the destination operand. */
11520 if (bytemode
!= mask_mode
&& ins
->vex
.mask_register_specifier
)
11521 ins
->illegal_masking
= true;
11523 USED_REX (rexmask
);
11524 if (ins
->rex
& rexmask
)
11526 if (ins
->rex2
& rexmask
)
11535 if (ins
->rex
|| ins
->rex2
)
11536 names
= att_names8rex
;
11538 names
= att_names8
;
11541 names
= att_names16
;
11546 names
= att_names32
;
11549 names
= att_names64
;
11553 names
= ins
->address_mode
== mode_64bit
? att_names64
: att_names32
;
11556 case bnd_swap_mode
:
11559 oappend (ins
, "(bad)");
11562 names
= att_names_bnd
;
11565 if (ins
->address_mode
== mode_64bit
&& ins
->isa64
== intel64
)
11567 names
= att_names64
;
11570 /* Fall through. */
11572 if (ins
->address_mode
== mode_64bit
&& ((sizeflag
& DFLAG
)
11573 || (ins
->rex
& REX_W
)))
11575 names
= att_names64
;
11579 /* Fall through. */
11584 if (ins
->rex
& REX_W
)
11585 names
= att_names64
;
11586 else if (bytemode
!= v_mode
&& bytemode
!= v_swap_mode
)
11587 names
= att_names32
;
11590 if (sizeflag
& DFLAG
)
11591 names
= att_names32
;
11593 names
= att_names16
;
11594 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
11598 if (!(sizeflag
& DFLAG
) && ins
->isa64
== intel64
)
11599 names
= att_names16
;
11601 names
= att_names32
;
11602 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
11605 names
= (ins
->address_mode
== mode_64bit
11606 ? att_names64
: att_names32
);
11607 if (!(ins
->prefixes
& PREFIX_ADDR
))
11608 names
= (ins
->address_mode
== mode_16bit
11609 ? att_names16
: names
);
11612 /* Remove "addr16/addr32". */
11613 ins
->all_prefixes
[ins
->last_addr_prefix
] = 0;
11614 names
= (ins
->address_mode
!= mode_32bit
11615 ? att_names32
: att_names16
);
11616 ins
->used_prefixes
|= PREFIX_ADDR
;
11623 oappend (ins
, "(bad)");
11626 names
= att_names_mask
;
11631 oappend (ins
, INTERNAL_DISASSEMBLER_ERROR
);
11634 oappend_register (ins
, names
[reg
]);
11638 get8s (instr_info
*ins
, bfd_vma
*res
)
11640 if (!fetch_code (ins
->info
, ins
->codep
+ 1))
11642 *res
= ((bfd_vma
) *ins
->codep
++ ^ 0x80) - 0x80;
11647 get16 (instr_info
*ins
, bfd_vma
*res
)
11649 if (!fetch_code (ins
->info
, ins
->codep
+ 2))
11651 *res
= *ins
->codep
++;
11652 *res
|= (bfd_vma
) *ins
->codep
++ << 8;
11657 get16s (instr_info
*ins
, bfd_vma
*res
)
11659 if (!get16 (ins
, res
))
11661 *res
= (*res
^ 0x8000) - 0x8000;
11666 get32 (instr_info
*ins
, bfd_vma
*res
)
11668 if (!fetch_code (ins
->info
, ins
->codep
+ 4))
11670 *res
= *ins
->codep
++;
11671 *res
|= (bfd_vma
) *ins
->codep
++ << 8;
11672 *res
|= (bfd_vma
) *ins
->codep
++ << 16;
11673 *res
|= (bfd_vma
) *ins
->codep
++ << 24;
11678 get32s (instr_info
*ins
, bfd_vma
*res
)
11680 if (!get32 (ins
, res
))
11683 *res
= (*res
^ ((bfd_vma
) 1 << 31)) - ((bfd_vma
) 1 << 31);
11689 get64 (instr_info
*ins
, uint64_t *res
)
11694 if (!fetch_code (ins
->info
, ins
->codep
+ 8))
11697 a
|= (unsigned int) *ins
->codep
++ << 8;
11698 a
|= (unsigned int) *ins
->codep
++ << 16;
11699 a
|= (unsigned int) *ins
->codep
++ << 24;
11701 b
|= (unsigned int) *ins
->codep
++ << 8;
11702 b
|= (unsigned int) *ins
->codep
++ << 16;
11703 b
|= (unsigned int) *ins
->codep
++ << 24;
11704 *res
= a
+ ((uint64_t) b
<< 32);
11709 set_op (instr_info
*ins
, bfd_vma op
, bool riprel
)
11711 ins
->op_index
[ins
->op_ad
] = ins
->op_ad
;
11712 if (ins
->address_mode
== mode_64bit
)
11713 ins
->op_address
[ins
->op_ad
] = op
;
11714 else /* Mask to get a 32-bit address. */
11715 ins
->op_address
[ins
->op_ad
] = op
& 0xffffffff;
11716 ins
->op_riprel
[ins
->op_ad
] = riprel
;
11720 BadOp (instr_info
*ins
)
11722 /* Throw away prefixes and 1st. opcode byte. */
11723 struct dis_private
*priv
= ins
->info
->private_data
;
11725 ins
->codep
= priv
->the_buffer
+ ins
->nr_prefixes
+ ins
->need_vex
+ 1;
11726 ins
->obufp
= stpcpy (ins
->obufp
, "(bad)");
11731 OP_Skip_MODRM (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
11732 int sizeflag ATTRIBUTE_UNUSED
)
11734 if (ins
->modrm
.mod
!= 3)
11735 return BadOp (ins
);
11737 /* Skip mod/rm byte. */
11740 ins
->has_skipped_modrm
= true;
11745 OP_E_memory (instr_info
*ins
, int bytemode
, int sizeflag
)
11747 int add
= (ins
->rex
& REX_B
) ? 8 : 0;
11751 add
+= (ins
->rex2
& REX_B
) ? 16 : 0;
11753 /* Handles EVEX other than APX EVEX-promoted instructions. */
11754 if (ins
->vex
.evex
&& ins
->evex_type
== evex_default
)
11757 /* Zeroing-masking is invalid for memory destinations. Set the flag
11758 uniformly, as the consumer will inspect it only for the destination
11760 if (ins
->vex
.zeroing
)
11761 ins
->illegal_masking
= true;
11775 if (ins
->address_mode
!= mode_64bit
)
11783 case vex_vsib_d_w_dq_mode
:
11784 case vex_vsib_q_w_dq_mode
:
11785 case evex_x_gscat_mode
:
11786 shift
= ins
->vex
.w
? 3 : 2;
11789 case evex_half_bcst_xmmqh_mode
:
11790 case evex_half_bcst_xmmqdh_mode
:
11793 shift
= ins
->vex
.w
? 2 : 1;
11796 /* Fall through. */
11798 case evex_half_bcst_xmmq_mode
:
11801 shift
= ins
->vex
.w
? 3 : 2;
11804 /* Fall through. */
11809 case evex_x_nobcst_mode
:
11811 switch (ins
->vex
.length
)
11825 /* Make necessary corrections to shift for modes that need it. */
11826 if (bytemode
== xmmq_mode
11827 || bytemode
== evex_half_bcst_xmmqh_mode
11828 || bytemode
== evex_half_bcst_xmmq_mode
11829 || (bytemode
== ymmq_mode
&& ins
->vex
.length
== 128))
11831 else if (bytemode
== xmmqd_mode
11832 || bytemode
== evex_half_bcst_xmmqdh_mode
)
11834 else if (bytemode
== xmmdw_mode
)
11848 shift
= ins
->vex
.w
? 1 : 0;
11858 if (ins
->intel_syntax
)
11859 intel_operand_size (ins
, bytemode
, sizeflag
);
11862 if ((sizeflag
& AFLAG
) || ins
->address_mode
== mode_64bit
)
11864 /* 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 (*indexes
)[8] = 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
)
11898 /* S/G EVEX insns require EVEX.X4 not to be set. */
11899 if (ins
->rex2
& REX_X
)
11901 oappend (ins
, "(bad)");
11907 check_gather
= ins
->obufp
== ins
->op_out
[1];
11910 switch (ins
->vex
.length
)
11913 indexes
= att_names_xmm
;
11917 || bytemode
== vex_vsib_q_w_dq_mode
)
11918 indexes
= att_names_ymm
;
11920 indexes
= att_names_xmm
;
11924 || bytemode
== vex_vsib_q_w_dq_mode
)
11925 indexes
= att_names_zmm
;
11927 indexes
= att_names_ymm
;
11934 if (ins
->rex2
& REX_X
)
11938 indexes
= ins
->address_mode
== mode_64bit
&& !addr32flag
11939 ? att_names64
: att_names32
;
11942 scale
= ins
->sib
.scale
;
11943 base
= ins
->sib
.base
;
11948 /* Check for mandatory SIB. */
11949 if (bytemode
== vex_vsib_d_w_dq_mode
11950 || bytemode
== vex_vsib_q_w_dq_mode
11951 || bytemode
== vex_sibmem_mode
)
11953 oappend (ins
, "(bad)");
11957 rbase
= base
+ add
;
11959 switch (ins
->modrm
.mod
)
11965 if (ins
->address_mode
== mode_64bit
&& !ins
->has_sib
)
11967 if (!get32s (ins
, &disp
))
11969 if (riprel
&& bytemode
== v_bndmk_mode
)
11971 oappend (ins
, "(bad)");
11977 if (!get8s (ins
, &disp
))
11979 if (ins
->vex
.evex
&& shift
> 0)
11983 if (!get32s (ins
, &disp
))
11993 && ins
->address_mode
!= mode_16bit
)
11995 if (ins
->address_mode
== mode_64bit
)
11999 /* Without base nor index registers, zero-extend the
12000 lower 32-bit displacement to 64 bits. */
12001 disp
&= 0xffffffff;
12008 /* In 32-bit mode, we need index register to tell [offset]
12009 from [eiz*1 + offset]. */
12014 havedisp
= (havebase
12016 || (ins
->has_sib
&& (indexes
|| scale
!= 0)));
12018 if (!ins
->intel_syntax
)
12019 if (ins
->modrm
.mod
!= 0 || base
== 5)
12021 if (havedisp
|| riprel
)
12022 print_displacement (ins
, disp
);
12024 print_operand_value (ins
, disp
, dis_style_address_offset
);
12027 set_op (ins
, disp
, true);
12028 oappend_char (ins
, '(');
12029 oappend_with_style (ins
, !addr32flag
? "%rip" : "%eip",
12030 dis_style_register
);
12031 oappend_char (ins
, ')');
12035 if ((havebase
|| indexes
|| needindex
|| needaddr32
|| riprel
)
12036 && (ins
->address_mode
!= mode_64bit
12037 || ((bytemode
!= v_bnd_mode
)
12038 && (bytemode
!= v_bndmk_mode
)
12039 && (bytemode
!= bnd_mode
)
12040 && (bytemode
!= bnd_swap_mode
))))
12041 ins
->used_prefixes
|= PREFIX_ADDR
;
12043 if (havedisp
|| (ins
->intel_syntax
&& riprel
))
12045 oappend_char (ins
, ins
->open_char
);
12046 if (ins
->intel_syntax
&& riprel
)
12048 set_op (ins
, disp
, true);
12049 oappend_with_style (ins
, !addr32flag
? "rip" : "eip",
12050 dis_style_register
);
12055 (ins
->address_mode
== mode_64bit
&& !addr32flag
12056 ? att_names64
: att_names32
)[rbase
]);
12059 /* ESP/RSP won't allow index. If base isn't ESP/RSP,
12060 print index to tell base + index from base. */
12064 || (havebase
&& base
!= ESP_REG_NUM
))
12066 if (!ins
->intel_syntax
|| havebase
)
12067 oappend_char (ins
, ins
->separator_char
);
12070 if (ins
->address_mode
== mode_64bit
|| vindex
< 16)
12071 oappend_register (ins
, indexes
[vindex
]);
12073 oappend (ins
, "(bad)");
12076 oappend_register (ins
,
12077 ins
->address_mode
== mode_64bit
12082 oappend_char (ins
, ins
->scale_char
);
12083 oappend_char_with_style (ins
, '0' + (1 << scale
),
12084 dis_style_immediate
);
12087 if (ins
->intel_syntax
12088 && (disp
|| ins
->modrm
.mod
!= 0 || base
== 5))
12090 if (!havedisp
|| (bfd_signed_vma
) disp
>= 0)
12091 oappend_char (ins
, '+');
12093 print_displacement (ins
, disp
);
12095 print_operand_value (ins
, disp
, dis_style_address_offset
);
12098 oappend_char (ins
, ins
->close_char
);
12102 /* Both XMM/YMM/ZMM registers must be distinct. */
12103 int modrm_reg
= ins
->modrm
.reg
;
12105 if (ins
->rex
& REX_R
)
12107 if (ins
->rex2
& REX_R
)
12109 if (vindex
== modrm_reg
)
12110 oappend (ins
, "/(bad)");
12113 else if (ins
->intel_syntax
)
12115 if (ins
->modrm
.mod
!= 0 || base
== 5)
12117 if (!ins
->active_seg_prefix
)
12119 oappend_register (ins
, att_names_seg
[ds_reg
- es_reg
]);
12120 oappend (ins
, ":");
12122 print_operand_value (ins
, disp
, dis_style_text
);
12126 else if (bytemode
== v_bnd_mode
12127 || bytemode
== v_bndmk_mode
12128 || bytemode
== bnd_mode
12129 || bytemode
== bnd_swap_mode
12130 || bytemode
== vex_vsib_d_w_dq_mode
12131 || bytemode
== vex_vsib_q_w_dq_mode
)
12133 oappend (ins
, "(bad)");
12138 /* 16 bit address mode */
12141 ins
->used_prefixes
|= ins
->prefixes
& PREFIX_ADDR
;
12142 switch (ins
->modrm
.mod
)
12145 if (ins
->modrm
.rm
== 6)
12148 if (!get16s (ins
, &disp
))
12153 if (!get8s (ins
, &disp
))
12155 if (ins
->vex
.evex
&& shift
> 0)
12160 if (!ins
->intel_syntax
)
12161 if (ins
->modrm
.mod
!= 0 || ins
->modrm
.rm
== 6)
12162 print_displacement (ins
, disp
);
12164 if (ins
->modrm
.mod
!= 0 || ins
->modrm
.rm
!= 6)
12166 oappend_char (ins
, ins
->open_char
);
12167 oappend (ins
, ins
->intel_syntax
? intel_index16
[ins
->modrm
.rm
]
12168 : att_index16
[ins
->modrm
.rm
]);
12169 if (ins
->intel_syntax
12170 && (disp
|| ins
->modrm
.mod
!= 0 || ins
->modrm
.rm
== 6))
12172 if ((bfd_signed_vma
) disp
>= 0)
12173 oappend_char (ins
, '+');
12174 print_displacement (ins
, disp
);
12177 oappend_char (ins
, ins
->close_char
);
12179 else if (ins
->intel_syntax
)
12181 if (!ins
->active_seg_prefix
)
12183 oappend_register (ins
, att_names_seg
[ds_reg
- es_reg
]);
12184 oappend (ins
, ":");
12186 print_operand_value (ins
, disp
& 0xffff, dis_style_text
);
12189 if (ins
->vex
.b
&& ins
->evex_type
== evex_default
)
12191 ins
->evex_used
|= EVEX_b_used
;
12193 /* Broadcast can only ever be valid for memory sources. */
12194 if (ins
->obufp
== ins
->op_out
[0])
12195 ins
->vex
.no_broadcast
= true;
12197 if (!ins
->vex
.no_broadcast
12198 && (!ins
->intel_syntax
|| !(ins
->evex_used
& EVEX_len_used
)))
12200 if (bytemode
== xh_mode
)
12202 switch (ins
->vex
.length
)
12205 oappend (ins
, "{1to8}");
12208 oappend (ins
, "{1to16}");
12211 oappend (ins
, "{1to32}");
12217 else if (bytemode
== q_mode
12218 || bytemode
== ymmq_mode
)
12219 ins
->vex
.no_broadcast
= true;
12220 else if (ins
->vex
.w
12221 || bytemode
== evex_half_bcst_xmmqdh_mode
12222 || bytemode
== evex_half_bcst_xmmq_mode
)
12224 switch (ins
->vex
.length
)
12227 oappend (ins
, "{1to2}");
12230 oappend (ins
, "{1to4}");
12233 oappend (ins
, "{1to8}");
12239 else if (bytemode
== x_mode
12240 || bytemode
== evex_half_bcst_xmmqh_mode
)
12242 switch (ins
->vex
.length
)
12245 oappend (ins
, "{1to4}");
12248 oappend (ins
, "{1to8}");
12251 oappend (ins
, "{1to16}");
12258 ins
->vex
.no_broadcast
= true;
12260 if (ins
->vex
.no_broadcast
)
12261 oappend (ins
, "{bad}");
12268 OP_E (instr_info
*ins
, int bytemode
, int sizeflag
)
12270 /* Skip mod/rm byte. */
12272 if (!ins
->has_skipped_modrm
)
12275 ins
->has_skipped_modrm
= true;
12278 if (ins
->modrm
.mod
== 3)
12280 if ((sizeflag
& SUFFIX_ALWAYS
)
12281 && (bytemode
== b_swap_mode
12282 || bytemode
== bnd_swap_mode
12283 || bytemode
== v_swap_mode
))
12284 swap_operand (ins
);
12286 print_register (ins
, ins
->modrm
.rm
, REX_B
, bytemode
, sizeflag
);
12290 /* Masking is invalid for insns with GPR-like memory destination. Set the
12291 flag uniformly, as the consumer will inspect it only for the destination
12293 if (ins
->vex
.mask_register_specifier
)
12294 ins
->illegal_masking
= true;
12296 return OP_E_memory (ins
, bytemode
, sizeflag
);
12300 OP_indirE (instr_info
*ins
, int bytemode
, int sizeflag
)
12302 if (ins
->modrm
.mod
== 3 && bytemode
== f_mode
)
12303 /* bad lcall/ljmp */
12304 return BadOp (ins
);
12305 if (!ins
->intel_syntax
)
12306 oappend (ins
, "*");
12307 return OP_E (ins
, bytemode
, sizeflag
);
12311 OP_G (instr_info
*ins
, int bytemode
, int sizeflag
)
12313 print_register (ins
, ins
->modrm
.reg
, REX_R
, bytemode
, sizeflag
);
12318 OP_REG (instr_info
*ins
, int code
, int sizeflag
)
12325 case es_reg
: case ss_reg
: case cs_reg
:
12326 case ds_reg
: case fs_reg
: case gs_reg
:
12327 oappend_register (ins
, att_names_seg
[code
- es_reg
]);
12332 if (ins
->rex
& REX_B
)
12334 if (ins
->rex2
& REX_B
)
12339 case ax_reg
: case cx_reg
: case dx_reg
: case bx_reg
:
12340 case sp_reg
: case bp_reg
: case si_reg
: case di_reg
:
12341 s
= att_names16
[code
- ax_reg
+ add
];
12343 case ah_reg
: case ch_reg
: case dh_reg
: case bh_reg
:
12345 /* Fall through. */
12346 case al_reg
: case cl_reg
: case dl_reg
: case bl_reg
:
12348 s
= att_names8rex
[code
- al_reg
+ add
];
12350 s
= att_names8
[code
- al_reg
];
12352 case rAX_reg
: case rCX_reg
: case rDX_reg
: case rBX_reg
:
12353 case rSP_reg
: case rBP_reg
: case rSI_reg
: case rDI_reg
:
12354 if (ins
->address_mode
== mode_64bit
12355 && ((sizeflag
& DFLAG
) || (ins
->rex
& REX_W
)))
12357 s
= att_names64
[code
- rAX_reg
+ add
];
12360 code
+= eAX_reg
- rAX_reg
;
12361 /* Fall through. */
12362 case eAX_reg
: case eCX_reg
: case eDX_reg
: case eBX_reg
:
12363 case eSP_reg
: case eBP_reg
: case eSI_reg
: case eDI_reg
:
12365 if (ins
->rex
& REX_W
)
12366 s
= att_names64
[code
- eAX_reg
+ add
];
12369 if (sizeflag
& DFLAG
)
12370 s
= att_names32
[code
- eAX_reg
+ add
];
12372 s
= att_names16
[code
- eAX_reg
+ add
];
12373 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
12377 oappend (ins
, INTERNAL_DISASSEMBLER_ERROR
);
12380 oappend_register (ins
, s
);
12385 OP_IMREG (instr_info
*ins
, int code
, int sizeflag
)
12392 if (!ins
->intel_syntax
)
12394 oappend (ins
, "(%dx)");
12397 s
= att_names16
[dx_reg
- ax_reg
];
12399 case al_reg
: case cl_reg
:
12400 s
= att_names8
[code
- al_reg
];
12404 if (ins
->rex
& REX_W
)
12409 /* Fall through. */
12410 case z_mode_ax_reg
:
12411 if ((ins
->rex
& REX_W
) || (sizeflag
& DFLAG
))
12415 if (!(ins
->rex
& REX_W
))
12416 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
12419 oappend (ins
, INTERNAL_DISASSEMBLER_ERROR
);
12422 oappend_register (ins
, s
);
12427 OP_I (instr_info
*ins
, int bytemode
, int sizeflag
)
12434 if (!fetch_code (ins
->info
, ins
->codep
+ 1))
12436 op
= *ins
->codep
++;
12440 if (ins
->rex
& REX_W
)
12442 if (!get32s (ins
, &op
))
12447 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
12448 if (sizeflag
& DFLAG
)
12451 if (!get32 (ins
, &op
))
12456 /* Fall through. */
12458 if (!get16 (ins
, &op
))
12464 if (ins
->intel_syntax
)
12465 oappend_with_style (ins
, "1", dis_style_immediate
);
12467 oappend_with_style (ins
, "$1", dis_style_immediate
);
12470 oappend (ins
, INTERNAL_DISASSEMBLER_ERROR
);
12474 oappend_immediate (ins
, op
);
12479 OP_I64 (instr_info
*ins
, int bytemode
, int sizeflag
)
12483 if (bytemode
!= v_mode
|| ins
->address_mode
!= mode_64bit
12484 || !(ins
->rex
& REX_W
))
12485 return OP_I (ins
, bytemode
, sizeflag
);
12489 if (!get64 (ins
, &op
))
12492 oappend_immediate (ins
, op
);
12497 OP_sI (instr_info
*ins
, int bytemode
, int sizeflag
)
12505 if (!get8s (ins
, &op
))
12507 if (bytemode
== b_T_mode
)
12509 if (ins
->address_mode
!= mode_64bit
12510 || !((sizeflag
& DFLAG
) || (ins
->rex
& REX_W
)))
12512 /* The operand-size prefix is overridden by a REX prefix. */
12513 if ((sizeflag
& DFLAG
) || (ins
->rex
& REX_W
))
12521 if (!(ins
->rex
& REX_W
))
12523 if (sizeflag
& DFLAG
)
12531 /* The operand-size prefix is overridden by a REX prefix. */
12532 if (!(sizeflag
& DFLAG
) && !(ins
->rex
& REX_W
))
12534 if (!get16 (ins
, &op
))
12537 else if (!get32s (ins
, &op
))
12541 oappend (ins
, INTERNAL_DISASSEMBLER_ERROR
);
12545 oappend_immediate (ins
, op
);
12550 OP_J (instr_info
*ins
, int bytemode
, int sizeflag
)
12554 bfd_vma segment
= 0;
12559 if (!get8s (ins
, &disp
))
12564 if ((sizeflag
& DFLAG
)
12565 || (ins
->address_mode
== mode_64bit
12566 && ((ins
->isa64
== intel64
&& bytemode
!= dqw_mode
)
12567 || (ins
->rex
& REX_W
))))
12569 if (!get32s (ins
, &disp
))
12574 if (!get16s (ins
, &disp
))
12576 /* In 16bit mode, address is wrapped around at 64k within
12577 the same segment. Otherwise, a data16 prefix on a jump
12578 instruction means that the pc is masked to 16 bits after
12579 the displacement is added! */
12581 if ((ins
->prefixes
& PREFIX_DATA
) == 0)
12582 segment
= ((ins
->start_pc
+ (ins
->codep
- ins
->start_codep
))
12583 & ~((bfd_vma
) 0xffff));
12585 if (ins
->address_mode
!= mode_64bit
12586 || (ins
->isa64
!= intel64
&& !(ins
->rex
& REX_W
)))
12587 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
12590 oappend (ins
, INTERNAL_DISASSEMBLER_ERROR
);
12593 disp
= ((ins
->start_pc
+ (ins
->codep
- ins
->start_codep
) + disp
) & mask
)
12595 set_op (ins
, disp
, false);
12596 print_operand_value (ins
, disp
, dis_style_text
);
12601 OP_SEG (instr_info
*ins
, int bytemode
, int sizeflag
)
12603 if (bytemode
== w_mode
)
12605 oappend_register (ins
, att_names_seg
[ins
->modrm
.reg
]);
12608 return OP_E (ins
, ins
->modrm
.mod
== 3 ? bytemode
: w_mode
, sizeflag
);
12612 OP_DIR (instr_info
*ins
, int dummy ATTRIBUTE_UNUSED
, int sizeflag
)
12614 bfd_vma seg
, offset
;
12618 if (sizeflag
& DFLAG
)
12620 if (!get32 (ins
, &offset
))
12623 else if (!get16 (ins
, &offset
))
12625 if (!get16 (ins
, &seg
))
12627 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
12629 res
= snprintf (scratch
, ARRAY_SIZE (scratch
),
12630 ins
->intel_syntax
? "0x%x:0x%x" : "$0x%x,$0x%x",
12631 (unsigned) seg
, (unsigned) offset
);
12632 if (res
< 0 || (size_t) res
>= ARRAY_SIZE (scratch
))
12634 oappend (ins
, scratch
);
12639 OP_OFF (instr_info
*ins
, int bytemode
, int sizeflag
)
12643 if (ins
->intel_syntax
&& (sizeflag
& SUFFIX_ALWAYS
))
12644 intel_operand_size (ins
, bytemode
, sizeflag
);
12647 if ((sizeflag
& AFLAG
) || ins
->address_mode
== mode_64bit
)
12649 if (!get32 (ins
, &off
))
12654 if (!get16 (ins
, &off
))
12658 if (ins
->intel_syntax
)
12660 if (!ins
->active_seg_prefix
)
12662 oappend_register (ins
, att_names_seg
[ds_reg
- es_reg
]);
12663 oappend (ins
, ":");
12666 print_operand_value (ins
, off
, dis_style_address_offset
);
12671 OP_OFF64 (instr_info
*ins
, int bytemode
, int sizeflag
)
12675 if (ins
->address_mode
!= mode_64bit
12676 || (ins
->prefixes
& PREFIX_ADDR
))
12677 return OP_OFF (ins
, bytemode
, sizeflag
);
12679 if (ins
->intel_syntax
&& (sizeflag
& SUFFIX_ALWAYS
))
12680 intel_operand_size (ins
, bytemode
, sizeflag
);
12683 if (!get64 (ins
, &off
))
12686 if (ins
->intel_syntax
)
12688 if (!ins
->active_seg_prefix
)
12690 oappend_register (ins
, att_names_seg
[ds_reg
- es_reg
]);
12691 oappend (ins
, ":");
12694 print_operand_value (ins
, off
, dis_style_address_offset
);
12699 ptr_reg (instr_info
*ins
, int code
, int sizeflag
)
12703 *ins
->obufp
++ = ins
->open_char
;
12704 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_ADDR
);
12705 if (ins
->address_mode
== mode_64bit
)
12707 if (!(sizeflag
& AFLAG
))
12708 s
= att_names32
[code
- eAX_reg
];
12710 s
= att_names64
[code
- eAX_reg
];
12712 else if (sizeflag
& AFLAG
)
12713 s
= att_names32
[code
- eAX_reg
];
12715 s
= att_names16
[code
- eAX_reg
];
12716 oappend_register (ins
, s
);
12717 oappend_char (ins
, ins
->close_char
);
12721 OP_ESreg (instr_info
*ins
, int code
, int sizeflag
)
12723 if (ins
->intel_syntax
)
12725 switch (ins
->codep
[-1])
12727 case 0x6d: /* insw/insl */
12728 intel_operand_size (ins
, z_mode
, sizeflag
);
12730 case 0xa5: /* movsw/movsl/movsq */
12731 case 0xa7: /* cmpsw/cmpsl/cmpsq */
12732 case 0xab: /* stosw/stosl */
12733 case 0xaf: /* scasw/scasl */
12734 intel_operand_size (ins
, v_mode
, sizeflag
);
12737 intel_operand_size (ins
, b_mode
, sizeflag
);
12740 oappend_register (ins
, att_names_seg
[0]);
12741 oappend_char (ins
, ':');
12742 ptr_reg (ins
, code
, sizeflag
);
12747 OP_DSreg (instr_info
*ins
, int code
, int sizeflag
)
12749 if (ins
->intel_syntax
)
12751 switch (ins
->codep
[-1])
12753 case 0x6f: /* outsw/outsl */
12754 intel_operand_size (ins
, z_mode
, sizeflag
);
12756 case 0xa5: /* movsw/movsl/movsq */
12757 case 0xa7: /* cmpsw/cmpsl/cmpsq */
12758 case 0xad: /* lodsw/lodsl/lodsq */
12759 intel_operand_size (ins
, v_mode
, sizeflag
);
12762 intel_operand_size (ins
, b_mode
, sizeflag
);
12765 /* Set ins->active_seg_prefix to PREFIX_DS if it is unset so that the
12766 default segment register DS is printed. */
12767 if (!ins
->active_seg_prefix
)
12768 ins
->active_seg_prefix
= PREFIX_DS
;
12770 ptr_reg (ins
, code
, sizeflag
);
12775 OP_C (instr_info
*ins
, int dummy ATTRIBUTE_UNUSED
,
12776 int sizeflag ATTRIBUTE_UNUSED
)
12781 if (ins
->rex
& REX_R
)
12786 else if (ins
->address_mode
!= mode_64bit
&& (ins
->prefixes
& PREFIX_LOCK
))
12788 ins
->all_prefixes
[ins
->last_lock_prefix
] = 0;
12789 ins
->used_prefixes
|= PREFIX_LOCK
;
12794 res
= snprintf (scratch
, ARRAY_SIZE (scratch
), "%%cr%d",
12795 ins
->modrm
.reg
+ add
);
12796 if (res
< 0 || (size_t) res
>= ARRAY_SIZE (scratch
))
12798 oappend_register (ins
, scratch
);
12803 OP_D (instr_info
*ins
, int dummy ATTRIBUTE_UNUSED
,
12804 int sizeflag ATTRIBUTE_UNUSED
)
12810 if (ins
->rex
& REX_R
)
12814 res
= snprintf (scratch
, ARRAY_SIZE (scratch
),
12815 ins
->intel_syntax
? "dr%d" : "%%db%d",
12816 ins
->modrm
.reg
+ add
);
12817 if (res
< 0 || (size_t) res
>= ARRAY_SIZE (scratch
))
12819 oappend (ins
, scratch
);
12824 OP_T (instr_info
*ins
, int dummy ATTRIBUTE_UNUSED
,
12825 int sizeflag ATTRIBUTE_UNUSED
)
12830 res
= snprintf (scratch
, ARRAY_SIZE (scratch
), "%%tr%d", ins
->modrm
.reg
);
12831 if (res
< 0 || (size_t) res
>= ARRAY_SIZE (scratch
))
12833 oappend_register (ins
, scratch
);
12838 OP_MMX (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
12839 int sizeflag ATTRIBUTE_UNUSED
)
12841 int reg
= ins
->modrm
.reg
;
12842 const char (*names
)[8];
12844 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
12845 if (ins
->prefixes
& PREFIX_DATA
)
12847 names
= att_names_xmm
;
12849 if (ins
->rex
& REX_R
)
12853 names
= att_names_mm
;
12854 oappend_register (ins
, names
[reg
]);
12859 print_vector_reg (instr_info
*ins
, unsigned int reg
, int bytemode
)
12861 const char (*names
)[8];
12863 if (bytemode
== xmmq_mode
12864 || bytemode
== evex_half_bcst_xmmqh_mode
12865 || bytemode
== evex_half_bcst_xmmq_mode
)
12867 switch (ins
->vex
.length
)
12872 names
= att_names_xmm
;
12875 names
= att_names_ymm
;
12876 ins
->evex_used
|= EVEX_len_used
;
12882 else if (bytemode
== ymm_mode
)
12883 names
= att_names_ymm
;
12884 else if (bytemode
== tmm_mode
)
12888 oappend (ins
, "(bad)");
12891 names
= att_names_tmm
;
12893 else if (ins
->need_vex
12894 && bytemode
!= xmm_mode
12895 && bytemode
!= scalar_mode
12896 && bytemode
!= xmmdw_mode
12897 && bytemode
!= xmmqd_mode
12898 && bytemode
!= evex_half_bcst_xmmqdh_mode
12899 && bytemode
!= w_swap_mode
12900 && bytemode
!= b_mode
12901 && bytemode
!= w_mode
12902 && bytemode
!= d_mode
12903 && bytemode
!= q_mode
)
12905 ins
->evex_used
|= EVEX_len_used
;
12906 switch (ins
->vex
.length
)
12909 names
= att_names_xmm
;
12913 || bytemode
!= vex_vsib_q_w_dq_mode
)
12914 names
= att_names_ymm
;
12916 names
= att_names_xmm
;
12920 || bytemode
!= vex_vsib_q_w_dq_mode
)
12921 names
= att_names_zmm
;
12923 names
= att_names_ymm
;
12930 names
= att_names_xmm
;
12931 oappend_register (ins
, names
[reg
]);
12935 OP_XMM (instr_info
*ins
, int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
12937 unsigned int reg
= ins
->modrm
.reg
;
12940 if (ins
->rex
& REX_R
)
12944 if (ins
->rex2
& REX_R
)
12948 if (bytemode
== tmm_mode
)
12949 ins
->modrm
.reg
= reg
;
12950 else if (bytemode
== scalar_mode
)
12951 ins
->vex
.no_broadcast
= true;
12953 print_vector_reg (ins
, reg
, bytemode
);
12958 OP_EM (instr_info
*ins
, int bytemode
, int sizeflag
)
12961 const char (*names
)[8];
12963 if (ins
->modrm
.mod
!= 3)
12965 if (ins
->intel_syntax
12966 && (bytemode
== v_mode
|| bytemode
== v_swap_mode
))
12968 bytemode
= (ins
->prefixes
& PREFIX_DATA
) ? x_mode
: q_mode
;
12969 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
12971 return OP_E (ins
, bytemode
, sizeflag
);
12974 if ((sizeflag
& SUFFIX_ALWAYS
) && bytemode
== v_swap_mode
)
12975 swap_operand (ins
);
12977 /* Skip mod/rm byte. */
12980 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
12981 reg
= ins
->modrm
.rm
;
12982 if (ins
->prefixes
& PREFIX_DATA
)
12984 names
= att_names_xmm
;
12986 if (ins
->rex
& REX_B
)
12990 names
= att_names_mm
;
12991 oappend_register (ins
, names
[reg
]);
12995 /* cvt* are the only instructions in sse2 which have
12996 both SSE and MMX operands and also have 0x66 prefix
12997 in their opcode. 0x66 was originally used to differentiate
12998 between SSE and MMX instruction(operands). So we have to handle the
12999 cvt* separately using OP_EMC and OP_MXC */
13001 OP_EMC (instr_info
*ins
, int bytemode
, int sizeflag
)
13003 if (ins
->modrm
.mod
!= 3)
13005 if (ins
->intel_syntax
&& bytemode
== v_mode
)
13007 bytemode
= (ins
->prefixes
& PREFIX_DATA
) ? x_mode
: q_mode
;
13008 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
13010 return OP_E (ins
, bytemode
, sizeflag
);
13013 /* Skip mod/rm byte. */
13016 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
13017 oappend_register (ins
, att_names_mm
[ins
->modrm
.rm
]);
13022 OP_MXC (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
13023 int sizeflag ATTRIBUTE_UNUSED
)
13025 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
13026 oappend_register (ins
, att_names_mm
[ins
->modrm
.reg
]);
13031 OP_EX (instr_info
*ins
, int bytemode
, int sizeflag
)
13035 /* Skip mod/rm byte. */
13039 if (bytemode
== dq_mode
)
13040 bytemode
= ins
->vex
.w
? q_mode
: d_mode
;
13042 if (ins
->modrm
.mod
!= 3)
13043 return OP_E_memory (ins
, bytemode
, sizeflag
);
13045 reg
= ins
->modrm
.rm
;
13047 if (ins
->rex
& REX_B
)
13052 if ((ins
->rex
& REX_X
))
13054 ins
->rex2_used
&= ~REX_B
;
13056 else if (ins
->rex2
& REX_B
)
13059 if ((sizeflag
& SUFFIX_ALWAYS
)
13060 && (bytemode
== x_swap_mode
13061 || bytemode
== w_swap_mode
13062 || bytemode
== d_swap_mode
13063 || bytemode
== q_swap_mode
))
13064 swap_operand (ins
);
13066 if (bytemode
== tmm_mode
)
13067 ins
->modrm
.rm
= reg
;
13069 print_vector_reg (ins
, reg
, bytemode
);
13074 OP_R (instr_info
*ins
, int bytemode
, int sizeflag
)
13076 if (ins
->modrm
.mod
!= 3)
13077 return BadOp (ins
);
13085 return OP_E (ins
, bytemode
, sizeflag
);
13087 return OP_EM (ins
, x_mode
, sizeflag
);
13089 if (ins
->vex
.length
<= 128)
13091 return BadOp (ins
);
13094 return OP_EX (ins
, bytemode
, sizeflag
);
13098 OP_M (instr_info
*ins
, int bytemode
, int sizeflag
)
13100 /* Skip mod/rm byte. */
13104 if (ins
->modrm
.mod
== 3)
13105 /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
13106 return BadOp (ins
);
13108 if (bytemode
== x_mode
)
13109 ins
->vex
.no_broadcast
= true;
13111 return OP_E_memory (ins
, bytemode
, sizeflag
);
13115 OP_0f07 (instr_info
*ins
, int bytemode
, int sizeflag
)
13117 if (ins
->modrm
.mod
!= 3 || ins
->modrm
.rm
!= 0)
13118 return BadOp (ins
);
13119 return OP_E (ins
, bytemode
, sizeflag
);
13122 /* montmul instruction need display repz and skip modrm */
13125 MONTMUL_Fixup (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
13127 if (ins
->modrm
.mod
!= 3 || ins
->modrm
.rm
!= 0)
13128 return BadOp (ins
);
13130 /* The 0xf3 prefix should be displayed as "repz" for montmul. */
13131 if (ins
->prefixes
& PREFIX_REPZ
)
13132 ins
->all_prefixes
[ins
->last_repz_prefix
] = 0xf3;
13134 /* Skip mod/rm byte. */
13140 /* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
13141 32bit mode and "xchg %rax,%rax" in 64bit mode. */
13144 NOP_Fixup (instr_info
*ins
, int opnd
, int sizeflag
)
13146 if ((ins
->prefixes
& PREFIX_DATA
) == 0 && (ins
->rex
& REX_B
) == 0)
13148 ins
->mnemonicendp
= stpcpy (ins
->obuf
, "nop");
13152 return OP_REG (ins
, eAX_reg
, sizeflag
);
13153 return OP_IMREG (ins
, eAX_reg
, sizeflag
);
13156 static const char *const Suffix3DNow
[] = {
13157 /* 00 */ NULL
, NULL
, NULL
, NULL
,
13158 /* 04 */ NULL
, NULL
, NULL
, NULL
,
13159 /* 08 */ NULL
, NULL
, NULL
, NULL
,
13160 /* 0C */ "pi2fw", "pi2fd", NULL
, NULL
,
13161 /* 10 */ NULL
, NULL
, NULL
, NULL
,
13162 /* 14 */ NULL
, NULL
, NULL
, NULL
,
13163 /* 18 */ NULL
, NULL
, NULL
, NULL
,
13164 /* 1C */ "pf2iw", "pf2id", NULL
, NULL
,
13165 /* 20 */ NULL
, NULL
, NULL
, NULL
,
13166 /* 24 */ NULL
, NULL
, NULL
, NULL
,
13167 /* 28 */ NULL
, NULL
, NULL
, NULL
,
13168 /* 2C */ NULL
, NULL
, NULL
, NULL
,
13169 /* 30 */ NULL
, NULL
, NULL
, NULL
,
13170 /* 34 */ NULL
, NULL
, NULL
, NULL
,
13171 /* 38 */ NULL
, NULL
, NULL
, NULL
,
13172 /* 3C */ NULL
, NULL
, NULL
, NULL
,
13173 /* 40 */ NULL
, NULL
, NULL
, NULL
,
13174 /* 44 */ NULL
, NULL
, NULL
, NULL
,
13175 /* 48 */ NULL
, NULL
, NULL
, NULL
,
13176 /* 4C */ NULL
, NULL
, NULL
, NULL
,
13177 /* 50 */ NULL
, NULL
, NULL
, NULL
,
13178 /* 54 */ NULL
, NULL
, NULL
, NULL
,
13179 /* 58 */ NULL
, NULL
, NULL
, NULL
,
13180 /* 5C */ NULL
, NULL
, NULL
, NULL
,
13181 /* 60 */ NULL
, NULL
, NULL
, NULL
,
13182 /* 64 */ NULL
, NULL
, NULL
, NULL
,
13183 /* 68 */ NULL
, NULL
, NULL
, NULL
,
13184 /* 6C */ NULL
, NULL
, NULL
, NULL
,
13185 /* 70 */ NULL
, NULL
, NULL
, NULL
,
13186 /* 74 */ NULL
, NULL
, NULL
, NULL
,
13187 /* 78 */ NULL
, NULL
, NULL
, NULL
,
13188 /* 7C */ NULL
, NULL
, NULL
, NULL
,
13189 /* 80 */ NULL
, NULL
, NULL
, NULL
,
13190 /* 84 */ NULL
, NULL
, NULL
, NULL
,
13191 /* 88 */ NULL
, NULL
, "pfnacc", NULL
,
13192 /* 8C */ NULL
, NULL
, "pfpnacc", NULL
,
13193 /* 90 */ "pfcmpge", NULL
, NULL
, NULL
,
13194 /* 94 */ "pfmin", NULL
, "pfrcp", "pfrsqrt",
13195 /* 98 */ NULL
, NULL
, "pfsub", NULL
,
13196 /* 9C */ NULL
, NULL
, "pfadd", NULL
,
13197 /* A0 */ "pfcmpgt", NULL
, NULL
, NULL
,
13198 /* A4 */ "pfmax", NULL
, "pfrcpit1", "pfrsqit1",
13199 /* A8 */ NULL
, NULL
, "pfsubr", NULL
,
13200 /* AC */ NULL
, NULL
, "pfacc", NULL
,
13201 /* B0 */ "pfcmpeq", NULL
, NULL
, NULL
,
13202 /* B4 */ "pfmul", NULL
, "pfrcpit2", "pmulhrw",
13203 /* B8 */ NULL
, NULL
, NULL
, "pswapd",
13204 /* BC */ NULL
, NULL
, NULL
, "pavgusb",
13205 /* C0 */ NULL
, NULL
, NULL
, NULL
,
13206 /* C4 */ NULL
, NULL
, NULL
, NULL
,
13207 /* C8 */ NULL
, NULL
, NULL
, NULL
,
13208 /* CC */ NULL
, NULL
, NULL
, NULL
,
13209 /* D0 */ NULL
, NULL
, NULL
, NULL
,
13210 /* D4 */ NULL
, NULL
, NULL
, NULL
,
13211 /* D8 */ NULL
, NULL
, NULL
, NULL
,
13212 /* DC */ NULL
, NULL
, NULL
, NULL
,
13213 /* E0 */ NULL
, NULL
, NULL
, NULL
,
13214 /* E4 */ NULL
, NULL
, NULL
, NULL
,
13215 /* E8 */ NULL
, NULL
, NULL
, NULL
,
13216 /* EC */ NULL
, NULL
, NULL
, NULL
,
13217 /* F0 */ NULL
, NULL
, NULL
, NULL
,
13218 /* F4 */ NULL
, NULL
, NULL
, NULL
,
13219 /* F8 */ NULL
, NULL
, NULL
, NULL
,
13220 /* FC */ NULL
, NULL
, NULL
, NULL
,
13224 OP_3DNowSuffix (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
13225 int sizeflag ATTRIBUTE_UNUSED
)
13227 const char *mnemonic
;
13229 if (!fetch_code (ins
->info
, ins
->codep
+ 1))
13231 /* AMD 3DNow! instructions are specified by an opcode suffix in the
13232 place where an 8-bit immediate would normally go. ie. the last
13233 byte of the instruction. */
13234 ins
->obufp
= ins
->mnemonicendp
;
13235 mnemonic
= Suffix3DNow
[*ins
->codep
++];
13237 ins
->obufp
= stpcpy (ins
->obufp
, mnemonic
);
13240 /* Since a variable sized ins->modrm/ins->sib chunk is between the start
13241 of the opcode (0x0f0f) and the opcode suffix, we need to do
13242 all the ins->modrm processing first, and don't know until now that
13243 we have a bad opcode. This necessitates some cleaning up. */
13244 ins
->op_out
[0][0] = '\0';
13245 ins
->op_out
[1][0] = '\0';
13248 ins
->mnemonicendp
= ins
->obufp
;
13252 static const struct op simd_cmp_op
[] =
13254 { STRING_COMMA_LEN ("eq") },
13255 { STRING_COMMA_LEN ("lt") },
13256 { STRING_COMMA_LEN ("le") },
13257 { STRING_COMMA_LEN ("unord") },
13258 { STRING_COMMA_LEN ("neq") },
13259 { STRING_COMMA_LEN ("nlt") },
13260 { STRING_COMMA_LEN ("nle") },
13261 { STRING_COMMA_LEN ("ord") }
13264 static const struct op vex_cmp_op
[] =
13266 { STRING_COMMA_LEN ("eq_uq") },
13267 { STRING_COMMA_LEN ("nge") },
13268 { STRING_COMMA_LEN ("ngt") },
13269 { STRING_COMMA_LEN ("false") },
13270 { STRING_COMMA_LEN ("neq_oq") },
13271 { STRING_COMMA_LEN ("ge") },
13272 { STRING_COMMA_LEN ("gt") },
13273 { STRING_COMMA_LEN ("true") },
13274 { STRING_COMMA_LEN ("eq_os") },
13275 { STRING_COMMA_LEN ("lt_oq") },
13276 { STRING_COMMA_LEN ("le_oq") },
13277 { STRING_COMMA_LEN ("unord_s") },
13278 { STRING_COMMA_LEN ("neq_us") },
13279 { STRING_COMMA_LEN ("nlt_uq") },
13280 { STRING_COMMA_LEN ("nle_uq") },
13281 { STRING_COMMA_LEN ("ord_s") },
13282 { STRING_COMMA_LEN ("eq_us") },
13283 { STRING_COMMA_LEN ("nge_uq") },
13284 { STRING_COMMA_LEN ("ngt_uq") },
13285 { STRING_COMMA_LEN ("false_os") },
13286 { STRING_COMMA_LEN ("neq_os") },
13287 { STRING_COMMA_LEN ("ge_oq") },
13288 { STRING_COMMA_LEN ("gt_oq") },
13289 { STRING_COMMA_LEN ("true_us") },
13293 CMP_Fixup (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
13294 int sizeflag ATTRIBUTE_UNUSED
)
13296 unsigned int cmp_type
;
13298 if (!fetch_code (ins
->info
, ins
->codep
+ 1))
13300 cmp_type
= *ins
->codep
++;
13301 if (cmp_type
< ARRAY_SIZE (simd_cmp_op
))
13304 char *p
= ins
->mnemonicendp
- 2;
13308 sprintf (p
, "%s%s", simd_cmp_op
[cmp_type
].name
, suffix
);
13309 ins
->mnemonicendp
+= simd_cmp_op
[cmp_type
].len
;
13311 else if (ins
->need_vex
13312 && cmp_type
< ARRAY_SIZE (simd_cmp_op
) + ARRAY_SIZE (vex_cmp_op
))
13315 char *p
= ins
->mnemonicendp
- 2;
13319 cmp_type
-= ARRAY_SIZE (simd_cmp_op
);
13320 sprintf (p
, "%s%s", vex_cmp_op
[cmp_type
].name
, suffix
);
13321 ins
->mnemonicendp
+= vex_cmp_op
[cmp_type
].len
;
13325 /* We have a reserved extension byte. Output it directly. */
13326 oappend_immediate (ins
, cmp_type
);
13332 OP_Mwait (instr_info
*ins
, int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
13334 /* mwait %eax,%ecx / mwaitx %eax,%ecx,%ebx */
13335 if (!ins
->intel_syntax
)
13337 strcpy (ins
->op_out
[0], att_names32
[0] + ins
->intel_syntax
);
13338 strcpy (ins
->op_out
[1], att_names32
[1] + ins
->intel_syntax
);
13339 if (bytemode
== eBX_reg
)
13340 strcpy (ins
->op_out
[2], att_names32
[3] + ins
->intel_syntax
);
13341 ins
->two_source_ops
= true;
13343 /* Skip mod/rm byte. */
13350 OP_Monitor (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
13351 int sizeflag ATTRIBUTE_UNUSED
)
13353 /* monitor %{e,r,}ax,%ecx,%edx" */
13354 if (!ins
->intel_syntax
)
13356 const char (*names
)[8] = (ins
->address_mode
== mode_64bit
13357 ? att_names64
: att_names32
);
13359 if (ins
->prefixes
& PREFIX_ADDR
)
13361 /* Remove "addr16/addr32". */
13362 ins
->all_prefixes
[ins
->last_addr_prefix
] = 0;
13363 names
= (ins
->address_mode
!= mode_32bit
13364 ? att_names32
: att_names16
);
13365 ins
->used_prefixes
|= PREFIX_ADDR
;
13367 else if (ins
->address_mode
== mode_16bit
)
13368 names
= att_names16
;
13369 strcpy (ins
->op_out
[0], names
[0] + ins
->intel_syntax
);
13370 strcpy (ins
->op_out
[1], att_names32
[1] + ins
->intel_syntax
);
13371 strcpy (ins
->op_out
[2], att_names32
[2] + ins
->intel_syntax
);
13372 ins
->two_source_ops
= true;
13374 /* Skip mod/rm byte. */
13381 REP_Fixup (instr_info
*ins
, int bytemode
, int sizeflag
)
13383 /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
13385 if (ins
->prefixes
& PREFIX_REPZ
)
13386 ins
->all_prefixes
[ins
->last_repz_prefix
] = REP_PREFIX
;
13393 return OP_IMREG (ins
, bytemode
, sizeflag
);
13395 return OP_ESreg (ins
, bytemode
, sizeflag
);
13397 return OP_DSreg (ins
, bytemode
, sizeflag
);
13406 SEP_Fixup (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
13407 int sizeflag ATTRIBUTE_UNUSED
)
13409 if (ins
->isa64
!= amd64
)
13412 ins
->obufp
= ins
->obuf
;
13414 ins
->mnemonicendp
= ins
->obufp
;
13419 /* For BND-prefixed instructions 0xF2 prefix should be displayed as
13423 BND_Fixup (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
13424 int sizeflag ATTRIBUTE_UNUSED
)
13426 if (ins
->prefixes
& PREFIX_REPNZ
)
13427 ins
->all_prefixes
[ins
->last_repnz_prefix
] = BND_PREFIX
;
13431 /* For NOTRACK-prefixed instructions, 0x3E prefix should be displayed as
13435 NOTRACK_Fixup (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
13436 int sizeflag ATTRIBUTE_UNUSED
)
13438 /* Since active_seg_prefix is not set in 64-bit mode, check whether
13439 we've seen a PREFIX_DS. */
13440 if ((ins
->prefixes
& PREFIX_DS
) != 0
13441 && (ins
->address_mode
!= mode_64bit
|| ins
->last_data_prefix
< 0))
13443 /* NOTRACK prefix is only valid on indirect branch instructions.
13444 NB: DATA prefix is unsupported for Intel64. */
13445 ins
->active_seg_prefix
= 0;
13446 ins
->all_prefixes
[ins
->last_seg_prefix
] = NOTRACK_PREFIX
;
13451 /* Similar to OP_E. But the 0xf2/0xf3 ins->prefixes should be displayed as
13452 "xacquire"/"xrelease" for memory operand if there is a LOCK prefix.
13456 HLE_Fixup1 (instr_info
*ins
, int bytemode
, int sizeflag
)
13458 if (ins
->modrm
.mod
!= 3
13459 && (ins
->prefixes
& PREFIX_LOCK
) != 0)
13461 if (ins
->prefixes
& PREFIX_REPZ
)
13462 ins
->all_prefixes
[ins
->last_repz_prefix
] = XRELEASE_PREFIX
;
13463 if (ins
->prefixes
& PREFIX_REPNZ
)
13464 ins
->all_prefixes
[ins
->last_repnz_prefix
] = XACQUIRE_PREFIX
;
13467 return OP_E (ins
, bytemode
, sizeflag
);
13470 /* Similar to OP_E. But the 0xf2/0xf3 ins->prefixes should be displayed as
13471 "xacquire"/"xrelease" for memory operand. No check for LOCK prefix.
13475 HLE_Fixup2 (instr_info
*ins
, int bytemode
, int sizeflag
)
13477 if (ins
->modrm
.mod
!= 3)
13479 if (ins
->prefixes
& PREFIX_REPZ
)
13480 ins
->all_prefixes
[ins
->last_repz_prefix
] = XRELEASE_PREFIX
;
13481 if (ins
->prefixes
& PREFIX_REPNZ
)
13482 ins
->all_prefixes
[ins
->last_repnz_prefix
] = XACQUIRE_PREFIX
;
13485 return OP_E (ins
, bytemode
, sizeflag
);
13488 /* Similar to OP_E. But the 0xf3 prefixes should be displayed as
13489 "xrelease" for memory operand. No check for LOCK prefix. */
13492 HLE_Fixup3 (instr_info
*ins
, int bytemode
, int sizeflag
)
13494 if (ins
->modrm
.mod
!= 3
13495 && ins
->last_repz_prefix
> ins
->last_repnz_prefix
13496 && (ins
->prefixes
& PREFIX_REPZ
) != 0)
13497 ins
->all_prefixes
[ins
->last_repz_prefix
] = XRELEASE_PREFIX
;
13499 return OP_E (ins
, bytemode
, sizeflag
);
13503 CMPXCHG8B_Fixup (instr_info
*ins
, int bytemode
, int sizeflag
)
13506 if (ins
->rex
& REX_W
)
13508 /* Change cmpxchg8b to cmpxchg16b. */
13509 char *p
= ins
->mnemonicendp
- 2;
13510 ins
->mnemonicendp
= stpcpy (p
, "16b");
13513 else if ((ins
->prefixes
& PREFIX_LOCK
) != 0)
13515 if (ins
->prefixes
& PREFIX_REPZ
)
13516 ins
->all_prefixes
[ins
->last_repz_prefix
] = XRELEASE_PREFIX
;
13517 if (ins
->prefixes
& PREFIX_REPNZ
)
13518 ins
->all_prefixes
[ins
->last_repnz_prefix
] = XACQUIRE_PREFIX
;
13521 return OP_M (ins
, bytemode
, sizeflag
);
13525 XMM_Fixup (instr_info
*ins
, int reg
, int sizeflag ATTRIBUTE_UNUSED
)
13527 const char (*names
)[8] = att_names_xmm
;
13531 switch (ins
->vex
.length
)
13536 names
= att_names_ymm
;
13542 oappend_register (ins
, names
[reg
]);
13547 FXSAVE_Fixup (instr_info
*ins
, int bytemode
, int sizeflag
)
13549 /* Add proper suffix to "fxsave" and "fxrstor". */
13551 if (ins
->rex
& REX_W
)
13553 char *p
= ins
->mnemonicendp
;
13557 ins
->mnemonicendp
= p
;
13559 return OP_M (ins
, bytemode
, sizeflag
);
13562 /* Display the destination register operand for instructions with
13566 OP_VEX (instr_info
*ins
, int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
13568 int reg
, modrm_reg
, sib_index
= -1;
13569 const char (*names
)[8];
13571 if (!ins
->need_vex
)
13574 if (ins
->evex_type
== evex_from_legacy
)
13576 ins
->evex_used
|= EVEX_b_used
;
13581 reg
= ins
->vex
.register_specifier
;
13582 ins
->vex
.register_specifier
= 0;
13583 if (ins
->address_mode
!= mode_64bit
)
13585 if (ins
->vex
.evex
&& !ins
->vex
.v
)
13587 oappend (ins
, "(bad)");
13593 else if (ins
->vex
.evex
&& !ins
->vex
.v
)
13599 oappend_register (ins
, att_names_xmm
[reg
]);
13602 case vex_vsib_d_w_dq_mode
:
13603 case vex_vsib_q_w_dq_mode
:
13604 /* This must be the 3rd operand. */
13605 if (ins
->obufp
!= ins
->op_out
[2])
13607 if (ins
->vex
.length
== 128
13608 || (bytemode
!= vex_vsib_d_w_dq_mode
13610 oappend_register (ins
, att_names_xmm
[reg
]);
13612 oappend_register (ins
, att_names_ymm
[reg
]);
13614 /* All 3 XMM/YMM registers must be distinct. */
13615 modrm_reg
= ins
->modrm
.reg
;
13616 if (ins
->rex
& REX_R
)
13619 if (ins
->has_sib
&& ins
->modrm
.rm
== 4)
13621 sib_index
= ins
->sib
.index
;
13622 if (ins
->rex
& REX_X
)
13626 if (reg
== modrm_reg
|| reg
== sib_index
)
13627 strcpy (ins
->obufp
, "/(bad)");
13628 if (modrm_reg
== sib_index
|| modrm_reg
== reg
)
13629 strcat (ins
->op_out
[0], "/(bad)");
13630 if (sib_index
== modrm_reg
|| sib_index
== reg
)
13631 strcat (ins
->op_out
[1], "/(bad)");
13636 /* All 3 TMM registers must be distinct. */
13638 oappend (ins
, "(bad)");
13641 /* This must be the 3rd operand. */
13642 if (ins
->obufp
!= ins
->op_out
[2])
13644 oappend_register (ins
, att_names_tmm
[reg
]);
13645 if (reg
== ins
->modrm
.reg
|| reg
== ins
->modrm
.rm
)
13646 strcpy (ins
->obufp
, "/(bad)");
13649 if (ins
->modrm
.reg
== ins
->modrm
.rm
|| ins
->modrm
.reg
== reg
13650 || ins
->modrm
.rm
== reg
)
13652 if (ins
->modrm
.reg
<= 8
13653 && (ins
->modrm
.reg
== ins
->modrm
.rm
|| ins
->modrm
.reg
== reg
))
13654 strcat (ins
->op_out
[0], "/(bad)");
13655 if (ins
->modrm
.rm
<= 8
13656 && (ins
->modrm
.rm
== ins
->modrm
.reg
|| ins
->modrm
.rm
== reg
))
13657 strcat (ins
->op_out
[1], "/(bad)");
13663 switch (ins
->vex
.length
)
13669 names
= att_names_xmm
;
13670 ins
->evex_used
|= EVEX_len_used
;
13674 if (ins
->rex
& REX_W
)
13675 names
= att_names64
;
13676 else if (bytemode
== v_mode
13677 && !(sizeflag
& DFLAG
))
13678 names
= att_names16
;
13680 names
= att_names32
;
13683 names
= att_names8rex
;
13686 names
= att_names64
;
13692 oappend (ins
, "(bad)");
13695 names
= att_names_mask
;
13706 names
= att_names_ymm
;
13707 ins
->evex_used
|= EVEX_len_used
;
13713 names
= att_names_mask
;
13716 /* Fall through. */
13718 /* See PR binutils/20893 for a reproducer. */
13719 oappend (ins
, "(bad)");
13724 names
= att_names_zmm
;
13725 ins
->evex_used
|= EVEX_len_used
;
13731 oappend_register (ins
, names
[reg
]);
13736 OP_VexR (instr_info
*ins
, int bytemode
, int sizeflag
)
13738 if (ins
->modrm
.mod
== 3)
13739 return OP_VEX (ins
, bytemode
, sizeflag
);
13744 OP_VexW (instr_info
*ins
, int bytemode
, int sizeflag
)
13746 OP_VEX (ins
, bytemode
, sizeflag
);
13750 /* Swap 2nd and 3rd operands. */
13751 char *tmp
= ins
->op_out
[2];
13753 ins
->op_out
[2] = ins
->op_out
[1];
13754 ins
->op_out
[1] = tmp
;
13760 OP_REG_VexI4 (instr_info
*ins
, int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
13763 const char (*names
)[8] = att_names_xmm
;
13765 if (!fetch_code (ins
->info
, ins
->codep
+ 1))
13767 reg
= *ins
->codep
++;
13769 if (bytemode
!= x_mode
&& bytemode
!= scalar_mode
)
13773 if (ins
->address_mode
!= mode_64bit
)
13776 if (bytemode
== x_mode
&& ins
->vex
.length
== 256)
13777 names
= att_names_ymm
;
13779 oappend_register (ins
, names
[reg
]);
13783 /* Swap 3rd and 4th operands. */
13784 char *tmp
= ins
->op_out
[3];
13786 ins
->op_out
[3] = ins
->op_out
[2];
13787 ins
->op_out
[2] = tmp
;
13793 OP_VexI4 (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
13794 int sizeflag ATTRIBUTE_UNUSED
)
13796 oappend_immediate (ins
, ins
->codep
[-1] & 0xf);
13801 VPCMP_Fixup (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
13802 int sizeflag ATTRIBUTE_UNUSED
)
13804 unsigned int cmp_type
;
13806 if (!ins
->vex
.evex
)
13809 if (!fetch_code (ins
->info
, ins
->codep
+ 1))
13811 cmp_type
= *ins
->codep
++;
13812 /* There are aliases for immediates 0, 1, 2, 4, 5, 6.
13813 If it's the case, print suffix, otherwise - print the immediate. */
13814 if (cmp_type
< ARRAY_SIZE (simd_cmp_op
)
13819 char *p
= ins
->mnemonicendp
- 2;
13821 /* vpcmp* can have both one- and two-lettered suffix. */
13835 sprintf (p
, "%s%s", simd_cmp_op
[cmp_type
].name
, suffix
);
13836 ins
->mnemonicendp
+= simd_cmp_op
[cmp_type
].len
;
13840 /* We have a reserved extension byte. Output it directly. */
13841 oappend_immediate (ins
, cmp_type
);
13846 static const struct op xop_cmp_op
[] =
13848 { STRING_COMMA_LEN ("lt") },
13849 { STRING_COMMA_LEN ("le") },
13850 { STRING_COMMA_LEN ("gt") },
13851 { STRING_COMMA_LEN ("ge") },
13852 { STRING_COMMA_LEN ("eq") },
13853 { STRING_COMMA_LEN ("neq") },
13854 { STRING_COMMA_LEN ("false") },
13855 { STRING_COMMA_LEN ("true") }
13859 VPCOM_Fixup (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
13860 int sizeflag ATTRIBUTE_UNUSED
)
13862 unsigned int cmp_type
;
13864 if (!fetch_code (ins
->info
, ins
->codep
+ 1))
13866 cmp_type
= *ins
->codep
++;
13867 if (cmp_type
< ARRAY_SIZE (xop_cmp_op
))
13870 char *p
= ins
->mnemonicendp
- 2;
13872 /* vpcom* can have both one- and two-lettered suffix. */
13886 sprintf (p
, "%s%s", xop_cmp_op
[cmp_type
].name
, suffix
);
13887 ins
->mnemonicendp
+= xop_cmp_op
[cmp_type
].len
;
13891 /* We have a reserved extension byte. Output it directly. */
13892 oappend_immediate (ins
, cmp_type
);
13897 static const struct op pclmul_op
[] =
13899 { STRING_COMMA_LEN ("lql") },
13900 { STRING_COMMA_LEN ("hql") },
13901 { STRING_COMMA_LEN ("lqh") },
13902 { STRING_COMMA_LEN ("hqh") }
13906 PCLMUL_Fixup (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
13907 int sizeflag ATTRIBUTE_UNUSED
)
13909 unsigned int pclmul_type
;
13911 if (!fetch_code (ins
->info
, ins
->codep
+ 1))
13913 pclmul_type
= *ins
->codep
++;
13914 switch (pclmul_type
)
13925 if (pclmul_type
< ARRAY_SIZE (pclmul_op
))
13928 char *p
= ins
->mnemonicendp
- 3;
13933 sprintf (p
, "%s%s", pclmul_op
[pclmul_type
].name
, suffix
);
13934 ins
->mnemonicendp
+= pclmul_op
[pclmul_type
].len
;
13938 /* We have a reserved extension byte. Output it directly. */
13939 oappend_immediate (ins
, pclmul_type
);
13945 MOVSXD_Fixup (instr_info
*ins
, int bytemode
, int sizeflag
)
13947 /* Add proper suffix to "movsxd". */
13948 char *p
= ins
->mnemonicendp
;
13953 if (!ins
->intel_syntax
)
13956 if (ins
->rex
& REX_W
)
13968 oappend (ins
, INTERNAL_DISASSEMBLER_ERROR
);
13972 ins
->mnemonicendp
= p
;
13974 return OP_E (ins
, bytemode
, sizeflag
);
13978 DistinctDest_Fixup (instr_info
*ins
, int bytemode
, int sizeflag
)
13980 unsigned int reg
= ins
->vex
.register_specifier
;
13981 unsigned int modrm_reg
= ins
->modrm
.reg
;
13982 unsigned int modrm_rm
= ins
->modrm
.rm
;
13984 /* Calc destination register number. */
13985 if (ins
->rex
& REX_R
)
13987 if (ins
->rex2
& REX_R
)
13990 /* Calc src1 register number. */
13991 if (ins
->address_mode
!= mode_64bit
)
13993 else if (ins
->vex
.evex
&& !ins
->vex
.v
)
13996 /* Calc src2 register number. */
13997 if (ins
->modrm
.mod
== 3)
13999 if (ins
->rex
& REX_B
)
14001 if (ins
->rex
& REX_X
)
14005 /* Destination and source registers must be distinct, output bad if
14006 dest == src1 or dest == src2. */
14007 if (modrm_reg
== reg
14008 || (ins
->modrm
.mod
== 3
14009 && modrm_reg
== modrm_rm
))
14011 oappend (ins
, "(bad)");
14014 return OP_XMM (ins
, bytemode
, sizeflag
);
14018 OP_Rounding (instr_info
*ins
, int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
14020 if (ins
->modrm
.mod
!= 3 || !ins
->vex
.b
)
14025 case evex_rounding_64_mode
:
14026 if (ins
->address_mode
!= mode_64bit
|| !ins
->vex
.w
)
14028 /* Fall through. */
14029 case evex_rounding_mode
:
14030 ins
->evex_used
|= EVEX_b_used
;
14031 oappend (ins
, names_rounding
[ins
->vex
.ll
]);
14033 case evex_sae_mode
:
14034 ins
->evex_used
|= EVEX_b_used
;
14035 oappend (ins
, "{");
14040 oappend (ins
, "sae}");
14045 PREFETCHI_Fixup (instr_info
*ins
, int bytemode
, int sizeflag
)
14047 if (ins
->modrm
.mod
!= 0 || ins
->modrm
.rm
!= 5)
14049 if (ins
->intel_syntax
)
14051 ins
->mnemonicendp
= stpcpy (ins
->obuf
, "nop ");
14056 if (ins
->rex
& REX_W
)
14057 ins
->mnemonicendp
= stpcpy (ins
->obuf
, "nopq ");
14060 if (sizeflag
& DFLAG
)
14061 ins
->mnemonicendp
= stpcpy (ins
->obuf
, "nopl ");
14063 ins
->mnemonicendp
= stpcpy (ins
->obuf
, "nopw ");
14064 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
14070 return OP_M (ins
, bytemode
, sizeflag
);
14074 PUSH2_POP2_Fixup (instr_info
*ins
, int bytemode
, int sizeflag
)
14076 if (ins
->modrm
.mod
!= 3)
14079 unsigned int vvvv_reg
= ins
->vex
.register_specifier
14080 | (!ins
->vex
.v
<< 4);
14081 unsigned int rm_reg
= ins
->modrm
.rm
+ (ins
->rex
& REX_B
? 8 : 0)
14082 + (ins
->rex2
& REX_B
? 16 : 0);
14084 /* Push2/Pop2 cannot use RSP and Pop2 cannot pop two same registers. */
14085 if (!ins
->vex
.nd
|| vvvv_reg
== 0x4 || rm_reg
== 0x4
14086 || (!ins
->modrm
.reg
14087 && vvvv_reg
== rm_reg
))
14089 oappend (ins
, "(bad)");
14093 return OP_VEX (ins
, bytemode
, sizeflag
);
14097 JMPABS_Fixup (instr_info
*ins
, int bytemode
, int sizeflag
)
14099 if (ins
->last_rex2_prefix
>= 0)
14103 if ((ins
->prefixes
& (PREFIX_OPCODE
| PREFIX_ADDR
| PREFIX_LOCK
)) != 0x0
14104 || (ins
->rex
& REX_W
) != 0x0)
14106 oappend (ins
, "(bad)");
14110 if (bytemode
== eAX_reg
)
14113 if (!get64 (ins
, &op
))
14116 ins
->mnemonicendp
= stpcpy (ins
->obuf
, "jmpabs");
14117 ins
->rex2
|= REX2_SPECIAL
;
14118 oappend_immediate (ins
, op
);
14123 if (bytemode
== eAX_reg
)
14124 return OP_IMREG (ins
, bytemode
, sizeflag
);
14125 return OP_OFF64 (ins
, bytemode
, sizeflag
);
14129 CFCMOV_Fixup (instr_info
*ins
, int opnd
, int sizeflag
)
14131 /* EVEX.NF is used as a direction bit in the 2-operand case to reverse the
14132 source and destination operands. */
14133 bool dstmem
= !ins
->vex
.nd
&& ins
->vex
.nf
;
14138 return OP_E (ins
, v_swap_mode
, sizeflag
);
14139 return OP_G (ins
, v_mode
, sizeflag
);
14142 /* These bits have been consumed and should be cleared. */
14143 ins
->vex
.nf
= false;
14144 ins
->vex
.mask_register_specifier
= 0;
14147 return OP_G (ins
, v_mode
, sizeflag
);
14148 return OP_E (ins
, v_mode
, sizeflag
);