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 OP_3DNowSuffix (instr_info
*, int, int);
94 static bool CMP_Fixup (instr_info
*, int, int);
95 static bool REP_Fixup (instr_info
*, int, int);
96 static bool SEP_Fixup (instr_info
*, int, int);
97 static bool BND_Fixup (instr_info
*, int, int);
98 static bool NOTRACK_Fixup (instr_info
*, int, int);
99 static bool HLE_Fixup1 (instr_info
*, int, int);
100 static bool HLE_Fixup2 (instr_info
*, int, int);
101 static bool HLE_Fixup3 (instr_info
*, int, int);
102 static bool CMPXCHG8B_Fixup (instr_info
*, int, int);
103 static bool XMM_Fixup (instr_info
*, int, int);
104 static bool FXSAVE_Fixup (instr_info
*, int, int);
105 static bool MOVSXD_Fixup (instr_info
*, int, int);
106 static bool DistinctDest_Fixup (instr_info
*, int, int);
107 static bool PREFETCHI_Fixup (instr_info
*, int, int);
108 static bool PUSH2_POP2_Fixup (instr_info
*, int, int);
109 static bool JMPABS_Fixup (instr_info
*, int, int);
110 static bool CFCMOV_Fixup (instr_info
*, int, int);
112 static void ATTRIBUTE_PRINTF_3
i386_dis_printf (const disassemble_info
*,
113 enum disassembler_style
,
116 /* This character is used to encode style information within the output
117 buffers. See oappend_insert_style for more details. */
118 #define STYLE_MARKER_CHAR '\002'
120 /* The maximum operand buffer size. */
121 #define MAX_OPERAND_BUFFER_SIZE 128
130 static const char *prefix_name (enum address_mode
, uint8_t, int);
147 enum address_mode address_mode
;
149 /* Flags for the prefixes for the current instruction. See below. */
152 /* REX prefix the current instruction. See below. */
154 /* Bits of REX we've already used. */
157 /* Record W R4 X4 B4 bits for rex2. */
159 /* Bits of rex2 we've already used. */
160 unsigned char rex2_used
;
161 unsigned char rex2_payload
;
164 unsigned char condition_code
;
165 unsigned char need_vex
;
168 /* Flags for ins->prefixes which we somehow handled when printing the
169 current instruction. */
172 /* Flags for EVEX bits which we somehow handled when printing the
173 current instruction. */
176 char obuf
[MAX_OPERAND_BUFFER_SIZE
];
179 const uint8_t *start_codep
;
181 const uint8_t *end_codep
;
182 unsigned char nr_prefixes
;
183 signed char last_lock_prefix
;
184 signed char last_repz_prefix
;
185 signed char last_repnz_prefix
;
186 signed char last_data_prefix
;
187 signed char last_addr_prefix
;
188 signed char last_rex_prefix
;
189 signed char last_rex2_prefix
;
190 signed char last_seg_prefix
;
191 signed char fwait_prefix
;
192 /* The active segment register prefix. */
193 unsigned char active_seg_prefix
;
195 #define MAX_CODE_LENGTH 15
196 /* We can up to 14 ins->prefixes since the maximum instruction length is
198 uint8_t all_prefixes
[MAX_CODE_LENGTH
- 1];
199 disassemble_info
*info
;
219 int register_specifier
;
222 int mask_register_specifier
;
235 /* For APX EVEX-promoted prefix, EVEX.ND shares the same bit as vex.b. */
238 enum evex_type evex_type
;
240 /* Remember if the current op is a jump instruction. */
245 /* Record whether EVEX masking is used incorrectly. */
246 bool illegal_masking
;
248 /* Record whether the modrm byte has been skipped. */
249 bool has_skipped_modrm
;
252 signed char op_index
[MAX_OPERANDS
];
253 bool op_riprel
[MAX_OPERANDS
];
254 char *op_out
[MAX_OPERANDS
];
255 bfd_vma op_address
[MAX_OPERANDS
];
258 /* On the 386's of 1988, the maximum length of an instruction is 15 bytes.
259 * (see topic "Redundant ins->prefixes" in the "Differences from 8086"
260 * section of the "Virtual 8086 Mode" chapter.)
261 * 'pc' should be the address of this instruction, it will
262 * be used to print the target address if this is a relative jump or call
263 * The function returns the length of this instruction in bytes.
272 enum x86_64_isa isa64
;
279 /* Indexes first byte not fetched. */
280 unsigned int fetched
;
281 uint8_t the_buffer
[2 * MAX_CODE_LENGTH
- 1];
284 /* Mark parts used in the REX prefix. When we are testing for
285 empty prefix (for 8bit register REX extension), just mask it
286 out. Otherwise test for REX bit is excuse for existence of REX
287 only in case value is nonzero. */
288 #define USED_REX(value) \
292 if (ins->rex & value) \
293 ins->rex_used |= (value) | REX_OPCODE; \
294 if (ins->rex2 & value) \
296 ins->rex2_used |= (value); \
297 ins->rex_used |= REX_OPCODE; \
301 ins->rex_used |= REX_OPCODE; \
305 #define EVEX_b_used 1
306 #define EVEX_len_used 2
309 /* {rex2} is not printed when the REX2_SPECIAL is set. */
310 #define REX2_SPECIAL 16
312 /* Flags stored in PREFIXES. */
313 #define PREFIX_REPZ 1
314 #define PREFIX_REPNZ 2
317 #define PREFIX_DS 0x10
318 #define PREFIX_ES 0x20
319 #define PREFIX_FS 0x40
320 #define PREFIX_GS 0x80
321 #define PREFIX_LOCK 0x100
322 #define PREFIX_DATA 0x200
323 #define PREFIX_ADDR 0x400
324 #define PREFIX_FWAIT 0x800
325 #define PREFIX_REX2 0x1000
326 #define PREFIX_NP_OR_DATA 0x2000
327 #define NO_PREFIX 0x4000
329 /* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
330 to ADDR (exclusive) are valid. Returns true for success, false
333 fetch_code (struct disassemble_info
*info
, const uint8_t *until
)
336 struct dis_private
*priv
= info
->private_data
;
337 bfd_vma start
= priv
->insn_start
+ priv
->fetched
;
338 uint8_t *fetch_end
= priv
->the_buffer
+ priv
->fetched
;
339 ptrdiff_t needed
= until
- fetch_end
;
344 if (priv
->fetched
+ (size_t) needed
<= ARRAY_SIZE (priv
->the_buffer
))
345 status
= (*info
->read_memory_func
) (start
, fetch_end
, needed
, info
);
348 /* If we did manage to read at least one byte, then
349 print_insn_i386 will do something sensible. Otherwise, print
350 an error. We do that here because this is where we know
353 (*info
->memory_error_func
) (status
, start
, info
);
357 priv
->fetched
+= needed
;
362 fetch_modrm (instr_info
*ins
)
364 if (!fetch_code (ins
->info
, ins
->codep
+ 1))
367 ins
->modrm
.mod
= (*ins
->codep
>> 6) & 3;
368 ins
->modrm
.reg
= (*ins
->codep
>> 3) & 7;
369 ins
->modrm
.rm
= *ins
->codep
& 7;
375 fetch_error (const instr_info
*ins
)
377 /* Getting here means we tried for data but didn't get it. That
378 means we have an incomplete instruction of some sort. Just
379 print the first byte as a prefix or a .byte pseudo-op. */
380 const struct dis_private
*priv
= ins
->info
->private_data
;
381 const char *name
= NULL
;
383 if (ins
->codep
<= priv
->the_buffer
)
386 if (ins
->prefixes
|| ins
->fwait_prefix
>= 0 || (ins
->rex
& REX_OPCODE
))
387 name
= prefix_name (ins
->address_mode
, priv
->the_buffer
[0],
388 priv
->orig_sizeflag
);
390 i386_dis_printf (ins
->info
, dis_style_mnemonic
, "%s", name
);
393 /* Just print the first byte as a .byte instruction. */
394 i386_dis_printf (ins
->info
, dis_style_assembler_directive
, ".byte ");
395 i386_dis_printf (ins
->info
, dis_style_immediate
, "%#x",
396 (unsigned int) priv
->the_buffer
[0]);
402 /* Possible values for prefix requirement. */
403 #define PREFIX_IGNORED_SHIFT 16
404 #define PREFIX_IGNORED_REPZ (PREFIX_REPZ << PREFIX_IGNORED_SHIFT)
405 #define PREFIX_IGNORED_REPNZ (PREFIX_REPNZ << PREFIX_IGNORED_SHIFT)
406 #define PREFIX_IGNORED_DATA (PREFIX_DATA << PREFIX_IGNORED_SHIFT)
407 #define PREFIX_IGNORED_ADDR (PREFIX_ADDR << PREFIX_IGNORED_SHIFT)
408 #define PREFIX_IGNORED_LOCK (PREFIX_LOCK << PREFIX_IGNORED_SHIFT)
409 #define PREFIX_REX2_ILLEGAL (PREFIX_REX2 << PREFIX_IGNORED_SHIFT)
411 /* Opcode prefixes. */
412 #define PREFIX_OPCODE (PREFIX_REPZ \
416 /* Prefixes ignored. */
417 #define PREFIX_IGNORED (PREFIX_IGNORED_REPZ \
418 | PREFIX_IGNORED_REPNZ \
419 | PREFIX_IGNORED_DATA)
421 #define XX { NULL, 0 }
422 #define Bad_Opcode NULL, { { NULL, 0 } }, 0
424 #define Eb { OP_E, b_mode }
425 #define Ebnd { OP_E, bnd_mode }
426 #define EbS { OP_E, b_swap_mode }
427 #define EbndS { OP_E, bnd_swap_mode }
428 #define Ev { OP_E, v_mode }
429 #define Eva { OP_E, va_mode }
430 #define Ev_bnd { OP_E, v_bnd_mode }
431 #define EvS { OP_E, v_swap_mode }
432 #define Ed { OP_E, d_mode }
433 #define Edq { OP_E, dq_mode }
434 #define Edb { OP_E, db_mode }
435 #define Edw { OP_E, dw_mode }
436 #define Eq { OP_E, q_mode }
437 #define indirEv { OP_indirE, indir_v_mode }
438 #define indirEp { OP_indirE, f_mode }
439 #define stackEv { OP_E, stack_v_mode }
440 #define Em { OP_E, m_mode }
441 #define Ew { OP_E, w_mode }
442 #define M { OP_M, 0 } /* lea, lgdt, etc. */
443 #define Ma { OP_M, a_mode }
444 #define Mb { OP_M, b_mode }
445 #define Md { OP_M, d_mode }
446 #define Mdq { OP_M, dq_mode }
447 #define Mo { OP_M, o_mode }
448 #define Mp { OP_M, f_mode } /* 32 or 48 bit memory operand for LDS, LES etc */
449 #define Mq { OP_M, q_mode }
450 #define Mv { OP_M, v_mode }
451 #define Mv_bnd { OP_M, v_bndmk_mode }
452 #define Mw { OP_M, w_mode }
453 #define Mx { OP_M, x_mode }
454 #define Mxmm { OP_M, xmm_mode }
455 #define Mymm { OP_M, ymm_mode }
456 #define Gb { OP_G, b_mode }
457 #define Gbnd { OP_G, bnd_mode }
458 #define Gv { OP_G, v_mode }
459 #define Gd { OP_G, d_mode }
460 #define Gdq { OP_G, dq_mode }
461 #define Gq { OP_G, q_mode }
462 #define Gm { OP_G, m_mode }
463 #define Gva { OP_G, va_mode }
464 #define Gw { OP_G, w_mode }
465 #define Ib { OP_I, b_mode }
466 #define sIb { OP_sI, b_mode } /* sign extened byte */
467 #define sIbT { OP_sI, b_T_mode } /* sign extened byte like 'T' */
468 #define Iv { OP_I, v_mode }
469 #define sIv { OP_sI, v_mode }
470 #define Iv64 { OP_I64, v_mode }
471 #define Id { OP_I, d_mode }
472 #define Iw { OP_I, w_mode }
473 #define I1 { OP_I, const_1_mode }
474 #define Jb { OP_J, b_mode }
475 #define Jv { OP_J, v_mode }
476 #define Jdqw { OP_J, dqw_mode }
477 #define Cm { OP_C, m_mode }
478 #define Dm { OP_D, m_mode }
479 #define Td { OP_T, d_mode }
480 #define Skip_MODRM { OP_Skip_MODRM, 0 }
482 #define RMeAX { OP_REG, eAX_reg }
483 #define RMeBX { OP_REG, eBX_reg }
484 #define RMeCX { OP_REG, eCX_reg }
485 #define RMeDX { OP_REG, eDX_reg }
486 #define RMeSP { OP_REG, eSP_reg }
487 #define RMeBP { OP_REG, eBP_reg }
488 #define RMeSI { OP_REG, eSI_reg }
489 #define RMeDI { OP_REG, eDI_reg }
490 #define RMrAX { OP_REG, rAX_reg }
491 #define RMrBX { OP_REG, rBX_reg }
492 #define RMrCX { OP_REG, rCX_reg }
493 #define RMrDX { OP_REG, rDX_reg }
494 #define RMrSP { OP_REG, rSP_reg }
495 #define RMrBP { OP_REG, rBP_reg }
496 #define RMrSI { OP_REG, rSI_reg }
497 #define RMrDI { OP_REG, rDI_reg }
498 #define RMAL { OP_REG, al_reg }
499 #define RMCL { OP_REG, cl_reg }
500 #define RMDL { OP_REG, dl_reg }
501 #define RMBL { OP_REG, bl_reg }
502 #define RMAH { OP_REG, ah_reg }
503 #define RMCH { OP_REG, ch_reg }
504 #define RMDH { OP_REG, dh_reg }
505 #define RMBH { OP_REG, bh_reg }
506 #define RMAX { OP_REG, ax_reg }
507 #define RMDX { OP_REG, dx_reg }
509 #define eAX { OP_IMREG, eAX_reg }
510 #define AL { OP_IMREG, al_reg }
511 #define CL { OP_IMREG, cl_reg }
512 #define zAX { OP_IMREG, z_mode_ax_reg }
513 #define indirDX { OP_IMREG, indir_dx_reg }
515 #define Sw { OP_SEG, w_mode }
516 #define Sv { OP_SEG, v_mode }
517 #define Ap { OP_DIR, 0 }
518 #define Ob { OP_OFF64, b_mode }
519 #define Ov { OP_OFF64, v_mode }
520 #define Xb { OP_DSreg, eSI_reg }
521 #define Xv { OP_DSreg, eSI_reg }
522 #define Xz { OP_DSreg, eSI_reg }
523 #define Yb { OP_ESreg, eDI_reg }
524 #define Yv { OP_ESreg, eDI_reg }
525 #define DSBX { OP_DSreg, eBX_reg }
527 #define es { OP_REG, es_reg }
528 #define ss { OP_REG, ss_reg }
529 #define cs { OP_REG, cs_reg }
530 #define ds { OP_REG, ds_reg }
531 #define fs { OP_REG, fs_reg }
532 #define gs { OP_REG, gs_reg }
534 #define MX { OP_MMX, 0 }
535 #define XM { OP_XMM, 0 }
536 #define XMScalar { OP_XMM, scalar_mode }
537 #define XMGatherD { OP_XMM, vex_vsib_d_w_dq_mode }
538 #define XMGatherQ { OP_XMM, vex_vsib_q_w_dq_mode }
539 #define XMM { OP_XMM, xmm_mode }
540 #define TMM { OP_XMM, tmm_mode }
541 #define XMxmmq { OP_XMM, xmmq_mode }
542 #define EM { OP_EM, v_mode }
543 #define EMS { OP_EM, v_swap_mode }
544 #define EMd { OP_EM, d_mode }
545 #define EMx { OP_EM, x_mode }
546 #define EXbwUnit { OP_EX, bw_unit_mode }
547 #define EXb { OP_EX, b_mode }
548 #define EXw { OP_EX, w_mode }
549 #define EXd { OP_EX, d_mode }
550 #define EXdS { OP_EX, d_swap_mode }
551 #define EXwS { OP_EX, w_swap_mode }
552 #define EXq { OP_EX, q_mode }
553 #define EXqS { OP_EX, q_swap_mode }
554 #define EXdq { OP_EX, dq_mode }
555 #define EXx { OP_EX, x_mode }
556 #define EXxh { OP_EX, xh_mode }
557 #define EXxS { OP_EX, x_swap_mode }
558 #define EXxmm { OP_EX, xmm_mode }
559 #define EXymm { OP_EX, ymm_mode }
560 #define EXxmmq { OP_EX, xmmq_mode }
561 #define EXxmmqh { OP_EX, evex_half_bcst_xmmqh_mode }
562 #define EXEvexHalfBcstXmmq { OP_EX, evex_half_bcst_xmmq_mode }
563 #define EXxmmdw { OP_EX, xmmdw_mode }
564 #define EXxmmqd { OP_EX, xmmqd_mode }
565 #define EXxmmqdh { OP_EX, evex_half_bcst_xmmqdh_mode }
566 #define EXymmq { OP_EX, ymmq_mode }
567 #define EXEvexXGscat { OP_EX, evex_x_gscat_mode }
568 #define EXEvexXNoBcst { OP_EX, evex_x_nobcst_mode }
569 #define Rd { OP_R, d_mode }
570 #define Rdq { OP_R, dq_mode }
571 #define Rq { OP_R, q_mode }
572 #define Nq { OP_R, q_mm_mode }
573 #define Ux { OP_R, x_mode }
574 #define Uxmm { OP_R, xmm_mode }
575 #define Rxmmq { OP_R, xmmq_mode }
576 #define Rymm { OP_R, ymm_mode }
577 #define Rtmm { OP_R, tmm_mode }
578 #define EMCq { OP_EMC, q_mode }
579 #define MXC { OP_MXC, 0 }
580 #define OPSUF { OP_3DNowSuffix, 0 }
581 #define SEP { SEP_Fixup, 0 }
582 #define CMP { CMP_Fixup, 0 }
583 #define XMM0 { XMM_Fixup, 0 }
584 #define FXSAVE { FXSAVE_Fixup, 0 }
586 #define Vex { OP_VEX, x_mode }
587 #define VexW { OP_VexW, x_mode }
588 #define VexScalar { OP_VEX, scalar_mode }
589 #define VexScalarR { OP_VexR, scalar_mode }
590 #define VexGatherD { OP_VEX, vex_vsib_d_w_dq_mode }
591 #define VexGatherQ { OP_VEX, vex_vsib_q_w_dq_mode }
592 #define VexGdq { OP_VEX, dq_mode }
593 #define VexGb { OP_VEX, b_mode }
594 #define VexGv { OP_VEX, v_mode }
595 #define VexTmm { OP_VEX, tmm_mode }
596 #define XMVexI4 { OP_REG_VexI4, x_mode }
597 #define XMVexScalarI4 { OP_REG_VexI4, scalar_mode }
598 #define VexI4 { OP_VexI4, 0 }
599 #define PCLMUL { PCLMUL_Fixup, 0 }
600 #define VPCMP { VPCMP_Fixup, 0 }
601 #define VPCOM { VPCOM_Fixup, 0 }
603 #define EXxEVexR { OP_Rounding, evex_rounding_mode }
604 #define EXxEVexR64 { OP_Rounding, evex_rounding_64_mode }
605 #define EXxEVexS { OP_Rounding, evex_sae_mode }
607 #define MaskG { OP_G, mask_mode }
608 #define MaskE { OP_E, mask_mode }
609 #define MaskR { OP_R, mask_mode }
610 #define MaskBDE { OP_E, mask_bd_mode }
611 #define MaskVex { OP_VEX, mask_mode }
613 #define MVexVSIBDWpX { OP_M, vex_vsib_d_w_dq_mode }
614 #define MVexVSIBQWpX { OP_M, vex_vsib_q_w_dq_mode }
616 #define MVexSIBMEM { OP_M, vex_sibmem_mode }
618 /* Used handle "rep" prefix for string instructions. */
619 #define Xbr { REP_Fixup, eSI_reg }
620 #define Xvr { REP_Fixup, eSI_reg }
621 #define Ybr { REP_Fixup, eDI_reg }
622 #define Yvr { REP_Fixup, eDI_reg }
623 #define Yzr { REP_Fixup, eDI_reg }
624 #define indirDXr { REP_Fixup, indir_dx_reg }
625 #define ALr { REP_Fixup, al_reg }
626 #define eAXr { REP_Fixup, eAX_reg }
628 /* Used handle HLE prefix for lockable instructions. */
629 #define Ebh1 { HLE_Fixup1, b_mode }
630 #define Evh1 { HLE_Fixup1, v_mode }
631 #define Ebh2 { HLE_Fixup2, b_mode }
632 #define Evh2 { HLE_Fixup2, v_mode }
633 #define Ebh3 { HLE_Fixup3, b_mode }
634 #define Evh3 { HLE_Fixup3, v_mode }
636 #define BND { BND_Fixup, 0 }
637 #define NOTRACK { NOTRACK_Fixup, 0 }
639 #define cond_jump_flag { NULL, cond_jump_mode }
640 #define loop_jcxz_flag { NULL, loop_jcxz_mode }
642 /* bits in sizeflag */
643 #define SUFFIX_ALWAYS 4
651 /* byte operand with operand swapped */
653 /* byte operand, sign extend like 'T' suffix */
655 /* operand size depends on prefixes */
657 /* operand size depends on prefixes with operand swapped */
659 /* operand size depends on address prefix */
663 /* double word operand */
665 /* word operand with operand swapped */
667 /* double word operand with operand swapped */
669 /* quad word operand */
671 /* 8-byte MM operand */
673 /* quad word operand with operand swapped */
675 /* ten-byte operand */
677 /* 16-byte XMM, 32-byte YMM or 64-byte ZMM operand. In EVEX with
678 broadcast enabled. */
680 /* Similar to x_mode, but with different EVEX mem shifts. */
682 /* Similar to x_mode, but with yet different EVEX mem shifts. */
684 /* Similar to x_mode, but with disabled broadcast. */
686 /* Similar to x_mode, but with operands swapped and disabled broadcast
689 /* 16-byte XMM, 32-byte YMM or 64-byte ZMM operand. In EVEX with
690 broadcast of 16bit enabled. */
692 /* 16-byte XMM operand */
694 /* XMM, XMM or YMM register operand, or quad word, xmmword or ymmword
695 memory operand (depending on vector length). Broadcast isn't
698 /* Same as xmmq_mode, but broadcast is allowed. */
699 evex_half_bcst_xmmq_mode
,
700 /* XMM, XMM or YMM register operand, or quad word, xmmword or ymmword
701 memory operand (depending on vector length). 16bit broadcast. */
702 evex_half_bcst_xmmqh_mode
,
703 /* 16-byte XMM, word, double word or quad word operand. */
705 /* 16-byte XMM, double word, quad word operand or xmm word operand. */
707 /* 16-byte XMM, double word, quad word operand or xmm word operand.
709 evex_half_bcst_xmmqdh_mode
,
710 /* 32-byte YMM operand */
712 /* quad word, ymmword or zmmword memory operand. */
716 /* d_mode in 32bit, q_mode in 64bit mode. */
718 /* pair of v_mode operands */
724 /* like v_bnd_mode in 32bit, no RIP-rel in 64bit mode. */
726 /* operand size depends on REX.W / VEX.W. */
728 /* Displacements like v_mode without considering Intel64 ISA. */
732 /* bounds operand with operand swapped */
734 /* 4- or 6-byte pointer operand */
737 /* v_mode for indirect branch opcodes. */
739 /* v_mode for stack-related opcodes. */
741 /* non-quad operand size depends on prefixes */
743 /* 16-byte operand */
745 /* registers like d_mode, memory like b_mode. */
747 /* registers like d_mode, memory like w_mode. */
750 /* Operand size depends on the VEX.W bit, with VSIB dword indices. */
751 vex_vsib_d_w_dq_mode
,
752 /* Operand size depends on the VEX.W bit, with VSIB qword indices. */
753 vex_vsib_q_w_dq_mode
,
754 /* mandatory non-vector SIB. */
757 /* scalar, ignore vector length. */
760 /* Static rounding. */
762 /* Static rounding, 64-bit mode only. */
763 evex_rounding_64_mode
,
764 /* Supress all exceptions. */
767 /* Mask register operand. */
769 /* Mask register operand. */
827 USE_X86_64_EVEX_FROM_VEX_TABLE
,
828 USE_X86_64_EVEX_PFX_TABLE
,
829 USE_X86_64_EVEX_W_TABLE
,
830 USE_X86_64_EVEX_MEM_W_TABLE
,
841 #define FLOAT NULL, { { NULL, FLOATCODE } }, 0
843 #define DIS386(T, I) NULL, { { NULL, (T)}, { NULL, (I) } }, 0
844 #define REG_TABLE(I) DIS386 (USE_REG_TABLE, (I))
845 #define MOD_TABLE(I) DIS386 (USE_MOD_TABLE, (I))
846 #define RM_TABLE(I) DIS386 (USE_RM_TABLE, (I))
847 #define PREFIX_TABLE(I) DIS386 (USE_PREFIX_TABLE, (I))
848 #define X86_64_TABLE(I) DIS386 (USE_X86_64_TABLE, (I))
849 #define X86_64_EVEX_FROM_VEX_TABLE(I) \
850 DIS386 (USE_X86_64_EVEX_FROM_VEX_TABLE, (I))
851 #define X86_64_EVEX_PFX_TABLE(I) DIS386 (USE_X86_64_EVEX_PFX_TABLE, (I))
852 #define X86_64_EVEX_W_TABLE(I) DIS386 (USE_X86_64_EVEX_W_TABLE, (I))
853 #define X86_64_EVEX_MEM_W_TABLE(I) DIS386 (USE_X86_64_EVEX_MEM_W_TABLE, (I))
854 #define THREE_BYTE_TABLE(I) DIS386 (USE_3BYTE_TABLE, (I))
855 #define XOP_8F_TABLE() DIS386 (USE_XOP_8F_TABLE, 0)
856 #define VEX_C4_TABLE() DIS386 (USE_VEX_C4_TABLE, 0)
857 #define VEX_C5_TABLE() DIS386 (USE_VEX_C5_TABLE, 0)
858 #define VEX_LEN_TABLE(I) DIS386 (USE_VEX_LEN_TABLE, (I))
859 #define VEX_W_TABLE(I) DIS386 (USE_VEX_W_TABLE, (I))
860 #define EVEX_TABLE() DIS386 (USE_EVEX_TABLE, 0)
861 #define EVEX_LEN_TABLE(I) DIS386 (USE_EVEX_LEN_TABLE, (I))
901 REG_VEX_0F3849_X86_64_L_0_W_0_M_1_P_0
,
902 REG_VEX_0F38F3_L_0_P_0
,
903 REG_VEX_MAP7_F8_L_0_W_0
,
962 MOD_VEX_0F3849_X86_64_L_0_W_0
,
966 MOD_EVEX_MAP4_F8_P_1
,
967 MOD_EVEX_MAP4_F8_P_3
,
980 RM_0F1E_P_1_MOD_3_REG_7
,
981 RM_0FAE_REG_6_MOD_3_P_0
,
985 RM_VEX_0F3849_X86_64_L_0_W_0_M_1_P_0_R_0
,
986 RM_VEX_0F3849_X86_64_L_0_W_0_M_1_P_3
,
992 PREFIX_0F00_REG_6_X86_64
,
993 PREFIX_0F01_REG_0_MOD_3_RM_6
,
994 PREFIX_0F01_REG_0_MOD_3_RM_7
,
995 PREFIX_0F01_REG_1_RM_2
,
996 PREFIX_0F01_REG_1_RM_4
,
997 PREFIX_0F01_REG_1_RM_5
,
998 PREFIX_0F01_REG_1_RM_6
,
999 PREFIX_0F01_REG_1_RM_7
,
1000 PREFIX_0F01_REG_3_RM_1
,
1001 PREFIX_0F01_REG_5_MOD_0
,
1002 PREFIX_0F01_REG_5_MOD_3_RM_0
,
1003 PREFIX_0F01_REG_5_MOD_3_RM_1
,
1004 PREFIX_0F01_REG_5_MOD_3_RM_2
,
1005 PREFIX_0F01_REG_5_MOD_3_RM_4
,
1006 PREFIX_0F01_REG_5_MOD_3_RM_5
,
1007 PREFIX_0F01_REG_5_MOD_3_RM_6
,
1008 PREFIX_0F01_REG_5_MOD_3_RM_7
,
1009 PREFIX_0F01_REG_7_MOD_3_RM_2
,
1010 PREFIX_0F01_REG_7_MOD_3_RM_5
,
1011 PREFIX_0F01_REG_7_MOD_3_RM_6
,
1012 PREFIX_0F01_REG_7_MOD_3_RM_7
,
1018 PREFIX_0F18_REG_6_MOD_0_X86_64
,
1019 PREFIX_0F18_REG_7_MOD_0_X86_64
,
1052 PREFIX_0FAE_REG_0_MOD_3
,
1053 PREFIX_0FAE_REG_1_MOD_3
,
1054 PREFIX_0FAE_REG_2_MOD_3
,
1055 PREFIX_0FAE_REG_3_MOD_3
,
1056 PREFIX_0FAE_REG_4_MOD_0
,
1057 PREFIX_0FAE_REG_4_MOD_3
,
1058 PREFIX_0FAE_REG_5_MOD_3
,
1059 PREFIX_0FAE_REG_6_MOD_0
,
1060 PREFIX_0FAE_REG_6_MOD_3
,
1061 PREFIX_0FAE_REG_7_MOD_0
,
1066 PREFIX_0FC7_REG_6_MOD_0
,
1067 PREFIX_0FC7_REG_6_MOD_3
,
1068 PREFIX_0FC7_REG_7_MOD_3
,
1084 PREFIX_0F38F8_M_1_X86_64
,
1094 PREFIX_VEX_0F41_L_1_W_0
,
1095 PREFIX_VEX_0F41_L_1_W_1
,
1096 PREFIX_VEX_0F42_L_1_W_0
,
1097 PREFIX_VEX_0F42_L_1_W_1
,
1098 PREFIX_VEX_0F44_L_0_W_0
,
1099 PREFIX_VEX_0F44_L_0_W_1
,
1100 PREFIX_VEX_0F45_L_1_W_0
,
1101 PREFIX_VEX_0F45_L_1_W_1
,
1102 PREFIX_VEX_0F46_L_1_W_0
,
1103 PREFIX_VEX_0F46_L_1_W_1
,
1104 PREFIX_VEX_0F47_L_1_W_0
,
1105 PREFIX_VEX_0F47_L_1_W_1
,
1106 PREFIX_VEX_0F4A_L_1_W_0
,
1107 PREFIX_VEX_0F4A_L_1_W_1
,
1108 PREFIX_VEX_0F4B_L_1_W_0
,
1109 PREFIX_VEX_0F4B_L_1_W_1
,
1114 PREFIX_VEX_0F90_L_0_W_0
,
1115 PREFIX_VEX_0F90_L_0_W_1
,
1116 PREFIX_VEX_0F91_L_0_W_0
,
1117 PREFIX_VEX_0F91_L_0_W_1
,
1118 PREFIX_VEX_0F92_L_0_W_0
,
1119 PREFIX_VEX_0F92_L_0_W_1
,
1120 PREFIX_VEX_0F93_L_0_W_0
,
1121 PREFIX_VEX_0F93_L_0_W_1
,
1122 PREFIX_VEX_0F98_L_0_W_0
,
1123 PREFIX_VEX_0F98_L_0_W_1
,
1124 PREFIX_VEX_0F99_L_0_W_0
,
1125 PREFIX_VEX_0F99_L_0_W_1
,
1126 PREFIX_VEX_0F3849_X86_64_L_0_W_0_M_0
,
1127 PREFIX_VEX_0F3849_X86_64_L_0_W_0_M_1
,
1128 PREFIX_VEX_0F384B_X86_64_L_0_W_0
,
1129 PREFIX_VEX_0F3850_W_0
,
1130 PREFIX_VEX_0F3851_W_0
,
1131 PREFIX_VEX_0F385C_X86_64_L_0_W_0
,
1132 PREFIX_VEX_0F385E_X86_64_L_0_W_0
,
1133 PREFIX_VEX_0F386C_X86_64_L_0_W_0
,
1135 PREFIX_VEX_0F38B0_W_0
,
1136 PREFIX_VEX_0F38B1_W_0
,
1137 PREFIX_VEX_0F38D2_W_0
,
1138 PREFIX_VEX_0F38D3_W_0
,
1142 PREFIX_VEX_0F38DA_W_0
,
1143 PREFIX_VEX_0F38F2_L_0
,
1144 PREFIX_VEX_0F38F3_L_0
,
1145 PREFIX_VEX_0F38F5_L_0
,
1146 PREFIX_VEX_0F38F6_L_0
,
1147 PREFIX_VEX_0F38F7_L_0
,
1148 PREFIX_VEX_0F3AF0_L_0
,
1149 PREFIX_VEX_MAP7_F8_L_0_W_0_R_0_X86_64
,
1207 PREFIX_EVEX_MAP4_4x
,
1208 PREFIX_EVEX_MAP4_F0
,
1209 PREFIX_EVEX_MAP4_F1
,
1210 PREFIX_EVEX_MAP4_F2
,
1211 PREFIX_EVEX_MAP4_F8
,
1213 PREFIX_EVEX_MAP5_10
,
1214 PREFIX_EVEX_MAP5_11
,
1215 PREFIX_EVEX_MAP5_1D
,
1216 PREFIX_EVEX_MAP5_2A
,
1217 PREFIX_EVEX_MAP5_2C
,
1218 PREFIX_EVEX_MAP5_2D
,
1219 PREFIX_EVEX_MAP5_2E
,
1220 PREFIX_EVEX_MAP5_2F
,
1221 PREFIX_EVEX_MAP5_51
,
1222 PREFIX_EVEX_MAP5_58
,
1223 PREFIX_EVEX_MAP5_59
,
1224 PREFIX_EVEX_MAP5_5A
,
1225 PREFIX_EVEX_MAP5_5B
,
1226 PREFIX_EVEX_MAP5_5C
,
1227 PREFIX_EVEX_MAP5_5D
,
1228 PREFIX_EVEX_MAP5_5E
,
1229 PREFIX_EVEX_MAP5_5F
,
1230 PREFIX_EVEX_MAP5_78
,
1231 PREFIX_EVEX_MAP5_79
,
1232 PREFIX_EVEX_MAP5_7A
,
1233 PREFIX_EVEX_MAP5_7B
,
1234 PREFIX_EVEX_MAP5_7C
,
1235 PREFIX_EVEX_MAP5_7D
,
1237 PREFIX_EVEX_MAP6_13
,
1238 PREFIX_EVEX_MAP6_56
,
1239 PREFIX_EVEX_MAP6_57
,
1240 PREFIX_EVEX_MAP6_D6
,
1241 PREFIX_EVEX_MAP6_D7
,
1277 X86_64_0F01_REG_0_MOD_3_RM_6_P_1
,
1278 X86_64_0F01_REG_0_MOD_3_RM_6_P_3
,
1279 X86_64_0F01_REG_0_MOD_3_RM_7_P_0
,
1281 X86_64_0F01_REG_1_RM_2_PREFIX_1
,
1282 X86_64_0F01_REG_1_RM_2_PREFIX_3
,
1283 X86_64_0F01_REG_1_RM_5_PREFIX_2
,
1284 X86_64_0F01_REG_1_RM_6_PREFIX_2
,
1285 X86_64_0F01_REG_1_RM_7_PREFIX_2
,
1288 X86_64_0F01_REG_5_MOD_3_RM_4_PREFIX_1
,
1289 X86_64_0F01_REG_5_MOD_3_RM_5_PREFIX_1
,
1290 X86_64_0F01_REG_5_MOD_3_RM_6_PREFIX_1
,
1291 X86_64_0F01_REG_5_MOD_3_RM_7_PREFIX_1
,
1292 X86_64_0F01_REG_7_MOD_3_RM_5_PREFIX_1
,
1293 X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_1
,
1294 X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3
,
1295 X86_64_0F01_REG_7_MOD_3_RM_7_PREFIX_1
,
1296 X86_64_0F18_REG_6_MOD_0
,
1297 X86_64_0F18_REG_7_MOD_0
,
1301 X86_64_0FC7_REG_6_MOD_3_PREFIX_1
,
1310 X86_64_VEX_MAP7_F8_L_0_W_0_R_0
,
1315 THREE_BYTE_0F38
= 0,
1347 VEX_LEN_0F12_P_0
= 0,
1380 VEX_LEN_0F3849_X86_64
,
1381 VEX_LEN_0F384B_X86_64
,
1383 VEX_LEN_0F385C_X86_64
,
1384 VEX_LEN_0F385E_X86_64
,
1385 VEX_LEN_0F386C_X86_64
,
1386 VEX_LEN_0F38CB_P_3_W_0
,
1387 VEX_LEN_0F38CC_P_3_W_0
,
1388 VEX_LEN_0F38CD_P_3_W_0
,
1389 VEX_LEN_0F38DA_W_0_P_0
,
1390 VEX_LEN_0F38DA_W_0_P_2
,
1453 VEX_LEN_XOP_09_82_W_0
,
1454 VEX_LEN_XOP_09_83_W_0
,
1487 EVEX_LEN_0F3816
= 0,
1541 VEX_W_0F3849_X86_64_L_0
,
1542 VEX_W_0F384B_X86_64_L_0
,
1550 VEX_W_0F385C_X86_64_L_0
,
1551 VEX_W_0F385E_X86_64_L_0
,
1552 VEX_W_0F386C_X86_64_L_0
,
1587 VEX_W_XOP_08_85_L_0
,
1588 VEX_W_XOP_08_86_L_0
,
1589 VEX_W_XOP_08_87_L_0
,
1590 VEX_W_XOP_08_8E_L_0
,
1591 VEX_W_XOP_08_8F_L_0
,
1592 VEX_W_XOP_08_95_L_0
,
1593 VEX_W_XOP_08_96_L_0
,
1594 VEX_W_XOP_08_97_L_0
,
1595 VEX_W_XOP_08_9E_L_0
,
1596 VEX_W_XOP_08_9F_L_0
,
1597 VEX_W_XOP_08_A6_L_0
,
1598 VEX_W_XOP_08_B6_L_0
,
1599 VEX_W_XOP_08_C0_L_0
,
1600 VEX_W_XOP_08_C1_L_0
,
1601 VEX_W_XOP_08_C2_L_0
,
1602 VEX_W_XOP_08_C3_L_0
,
1603 VEX_W_XOP_08_CC_L_0
,
1604 VEX_W_XOP_08_CD_L_0
,
1605 VEX_W_XOP_08_CE_L_0
,
1606 VEX_W_XOP_08_CF_L_0
,
1607 VEX_W_XOP_08_EC_L_0
,
1608 VEX_W_XOP_08_ED_L_0
,
1609 VEX_W_XOP_08_EE_L_0
,
1610 VEX_W_XOP_08_EF_L_0
,
1616 VEX_W_XOP_09_C1_L_0
,
1617 VEX_W_XOP_09_C2_L_0
,
1618 VEX_W_XOP_09_C3_L_0
,
1619 VEX_W_XOP_09_C6_L_0
,
1620 VEX_W_XOP_09_C7_L_0
,
1621 VEX_W_XOP_09_CB_L_0
,
1622 VEX_W_XOP_09_D1_L_0
,
1623 VEX_W_XOP_09_D2_L_0
,
1624 VEX_W_XOP_09_D3_L_0
,
1625 VEX_W_XOP_09_D6_L_0
,
1626 VEX_W_XOP_09_D7_L_0
,
1627 VEX_W_XOP_09_DB_L_0
,
1628 VEX_W_XOP_09_E1_L_0
,
1629 VEX_W_XOP_09_E2_L_0
,
1630 VEX_W_XOP_09_E3_L_0
,
1733 EVEX_W_MAP4_F8_P1_M_1
,
1734 EVEX_W_MAP4_F8_P3_M_1
,
1741 typedef bool (*op_rtn
) (instr_info
*ins
, int bytemode
, int sizeflag
);
1750 unsigned int prefix_requirement
;
1753 /* Upper case letters in the instruction names here are macros.
1754 'A' => print 'b' if no (suitable) register operand or suffix_always is true
1755 'B' => print 'b' if suffix_always is true
1756 'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
1758 'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
1759 suffix_always is true
1760 'E' => print 'e' if 32-bit form of jcxz
1761 'F' => print 'w' or 'l' depending on address size prefix (loop insns)
1762 'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
1763 'H' => print ",pt" or ",pn" branch hint
1766 'K' => print 'd' or 'q' if rex prefix is present.
1767 'L' => print 'l' or 'q' if suffix_always is true
1768 'M' => print 'r' if intel_mnemonic is false.
1769 'N' => print 'n' if instruction has no wait "prefix"
1770 'O' => print 'd' or 'o' (or 'q' in Intel mode)
1771 'P' => behave as 'T' except with register operand outside of suffix_always
1773 'Q' => print 'w', 'l' or 'q' if no (suitable) register operand or
1774 suffix_always is true
1775 'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
1776 'S' => print 'w', 'l' or 'q' if suffix_always is true
1777 'T' => print 'w', 'l'/'d', or 'q' if instruction has an operand size
1778 prefix or if suffix_always is true.
1780 'V' => print 'v' for VEX/EVEX and nothing for legacy encodings.
1781 'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
1782 'X' => print 's', 'd' depending on data16 prefix (for XMM)
1783 'Y' => no output, mark EVEX.aaa != 0 as bad.
1784 'Z' => print 'q' in 64bit mode and 'l' otherwise, if suffix_always is true.
1785 '!' => change condition from true to false or from false to true.
1786 '%' => add 1 upper case letter to the macro.
1787 '^' => print 'w', 'l', or 'q' (Intel64 ISA only) depending on operand size
1788 prefix or suffix_always is true (lcall/ljmp).
1789 '@' => in 64bit mode for Intel64 ISA or if instruction
1790 has no operand sizing prefix, print 'q' if suffix_always is true or
1791 nothing otherwise; behave as 'P' in all other cases
1793 2 upper case letter macros:
1794 "CC" => print condition code
1795 "XY" => print 'x' or 'y' if suffix_always is true or no register
1796 operands and no broadcast.
1797 "XZ" => print 'x', 'y', or 'z' if suffix_always is true or no
1798 register operands and no broadcast.
1799 "XW" => print 's', 'd' depending on the VEX.W bit (for FMA)
1800 "XD" => print 'd' if !EVEX or EVEX.W=1, EVEX.W=0 is not a valid encoding
1801 "XH" => print 'h' if EVEX.W=0, EVEX.W=1 is not a valid encoding (for FP16)
1802 "XS" => print 's' if !EVEX or EVEX.W=0, EVEX.W=1 is not a valid encoding
1803 "XV" => print "{vex} " pseudo prefix
1804 "XE" => print "{evex} " pseudo prefix if no EVEX-specific functionality is
1805 is used by an EVEX-encoded (AVX512VL) instruction.
1806 "NF" => print "{nf} " pseudo prefix when EVEX.NF = 1 and print "{evex} "
1807 pseudo prefix when instructions without NF, EGPR and VVVV,
1808 "NE" => don't print "{evex} " pseudo prefix for some special instructions
1810 "ZU" => print 'zu' if EVEX.ZU=1.
1811 "SC" => print suffix SCC for SCC insns
1812 "SW" => print '.s' to indicate operands were swapped when suffix_always is
1814 "YK" keep unused, to avoid ambiguity with the combined use of Y and K.
1815 "YX" keep unused, to avoid ambiguity with the combined use of Y and X.
1816 "LQ" => print 'l' ('d' in Intel mode) or 'q' for memory operand, cond
1817 being false, or no operand at all in 64bit mode, or if suffix_always
1819 "LB" => print "abs" in 64bit mode and behave as 'B' otherwise
1820 "LS" => print "abs" in 64bit mode and behave as 'S' otherwise
1821 "LV" => print "abs" for 64bit operand and behave as 'S' otherwise
1822 "DQ" => print 'd' or 'q' depending on the VEX.W bit
1823 "DF" => print default flag value for SCC insns
1824 "BW" => print 'b' or 'w' depending on the VEX.W bit
1825 "LP" => print 'w' or 'l' ('d' in Intel mode) if instruction has
1826 an operand size prefix, or suffix_always is true. print
1827 'q' if rex prefix is present.
1829 Many of the above letters print nothing in Intel mode. See "putop"
1832 Braces '{' and '}', and vertical bars '|', indicate alternative
1833 mnemonic strings for AT&T and Intel. */
1835 static const struct dis386 dis386
[] = {
1837 { "addB", { Ebh1
, Gb
}, 0 },
1838 { "addS", { Evh1
, Gv
}, 0 },
1839 { "addB", { Gb
, EbS
}, 0 },
1840 { "addS", { Gv
, EvS
}, 0 },
1841 { "addB", { AL
, Ib
}, 0 },
1842 { "addS", { eAX
, Iv
}, 0 },
1843 { X86_64_TABLE (X86_64_06
) },
1844 { X86_64_TABLE (X86_64_07
) },
1846 { "orB", { Ebh1
, Gb
}, 0 },
1847 { "orS", { Evh1
, Gv
}, 0 },
1848 { "orB", { Gb
, EbS
}, 0 },
1849 { "orS", { Gv
, EvS
}, 0 },
1850 { "orB", { AL
, Ib
}, 0 },
1851 { "orS", { eAX
, Iv
}, 0 },
1852 { X86_64_TABLE (X86_64_0E
) },
1853 { Bad_Opcode
}, /* 0x0f extended opcode escape */
1855 { "adcB", { Ebh1
, Gb
}, 0 },
1856 { "adcS", { Evh1
, Gv
}, 0 },
1857 { "adcB", { Gb
, EbS
}, 0 },
1858 { "adcS", { Gv
, EvS
}, 0 },
1859 { "adcB", { AL
, Ib
}, 0 },
1860 { "adcS", { eAX
, Iv
}, 0 },
1861 { X86_64_TABLE (X86_64_16
) },
1862 { X86_64_TABLE (X86_64_17
) },
1864 { "sbbB", { Ebh1
, Gb
}, 0 },
1865 { "sbbS", { Evh1
, Gv
}, 0 },
1866 { "sbbB", { Gb
, EbS
}, 0 },
1867 { "sbbS", { Gv
, EvS
}, 0 },
1868 { "sbbB", { AL
, Ib
}, 0 },
1869 { "sbbS", { eAX
, Iv
}, 0 },
1870 { X86_64_TABLE (X86_64_1E
) },
1871 { X86_64_TABLE (X86_64_1F
) },
1873 { "andB", { Ebh1
, Gb
}, 0 },
1874 { "andS", { Evh1
, Gv
}, 0 },
1875 { "andB", { Gb
, EbS
}, 0 },
1876 { "andS", { Gv
, EvS
}, 0 },
1877 { "andB", { AL
, Ib
}, 0 },
1878 { "andS", { eAX
, Iv
}, 0 },
1879 { Bad_Opcode
}, /* SEG ES prefix */
1880 { X86_64_TABLE (X86_64_27
) },
1882 { "subB", { Ebh1
, Gb
}, 0 },
1883 { "subS", { Evh1
, Gv
}, 0 },
1884 { "subB", { Gb
, EbS
}, 0 },
1885 { "subS", { Gv
, EvS
}, 0 },
1886 { "subB", { AL
, Ib
}, 0 },
1887 { "subS", { eAX
, Iv
}, 0 },
1888 { Bad_Opcode
}, /* SEG CS prefix */
1889 { X86_64_TABLE (X86_64_2F
) },
1891 { "xorB", { Ebh1
, Gb
}, 0 },
1892 { "xorS", { Evh1
, Gv
}, 0 },
1893 { "xorB", { Gb
, EbS
}, 0 },
1894 { "xorS", { Gv
, EvS
}, 0 },
1895 { "xorB", { AL
, Ib
}, 0 },
1896 { "xorS", { eAX
, Iv
}, 0 },
1897 { Bad_Opcode
}, /* SEG SS prefix */
1898 { X86_64_TABLE (X86_64_37
) },
1900 { "cmpB", { Eb
, Gb
}, 0 },
1901 { "cmpS", { Ev
, Gv
}, 0 },
1902 { "cmpB", { Gb
, EbS
}, 0 },
1903 { "cmpS", { Gv
, EvS
}, 0 },
1904 { "cmpB", { AL
, Ib
}, 0 },
1905 { "cmpS", { eAX
, Iv
}, 0 },
1906 { Bad_Opcode
}, /* SEG DS prefix */
1907 { X86_64_TABLE (X86_64_3F
) },
1909 { "inc{S|}", { RMeAX
}, 0 },
1910 { "inc{S|}", { RMeCX
}, 0 },
1911 { "inc{S|}", { RMeDX
}, 0 },
1912 { "inc{S|}", { RMeBX
}, 0 },
1913 { "inc{S|}", { RMeSP
}, 0 },
1914 { "inc{S|}", { RMeBP
}, 0 },
1915 { "inc{S|}", { RMeSI
}, 0 },
1916 { "inc{S|}", { RMeDI
}, 0 },
1918 { "dec{S|}", { RMeAX
}, 0 },
1919 { "dec{S|}", { RMeCX
}, 0 },
1920 { "dec{S|}", { RMeDX
}, 0 },
1921 { "dec{S|}", { RMeBX
}, 0 },
1922 { "dec{S|}", { RMeSP
}, 0 },
1923 { "dec{S|}", { RMeBP
}, 0 },
1924 { "dec{S|}", { RMeSI
}, 0 },
1925 { "dec{S|}", { RMeDI
}, 0 },
1927 { "push!P", { RMrAX
}, 0 },
1928 { "push!P", { RMrCX
}, 0 },
1929 { "push!P", { RMrDX
}, 0 },
1930 { "push!P", { RMrBX
}, 0 },
1931 { "push!P", { RMrSP
}, 0 },
1932 { "push!P", { RMrBP
}, 0 },
1933 { "push!P", { RMrSI
}, 0 },
1934 { "push!P", { RMrDI
}, 0 },
1936 { "pop!P", { RMrAX
}, 0 },
1937 { "pop!P", { RMrCX
}, 0 },
1938 { "pop!P", { RMrDX
}, 0 },
1939 { "pop!P", { RMrBX
}, 0 },
1940 { "pop!P", { RMrSP
}, 0 },
1941 { "pop!P", { RMrBP
}, 0 },
1942 { "pop!P", { RMrSI
}, 0 },
1943 { "pop!P", { RMrDI
}, 0 },
1945 { X86_64_TABLE (X86_64_60
) },
1946 { X86_64_TABLE (X86_64_61
) },
1947 { X86_64_TABLE (X86_64_62
) },
1948 { X86_64_TABLE (X86_64_63
) },
1949 { Bad_Opcode
}, /* seg fs */
1950 { Bad_Opcode
}, /* seg gs */
1951 { Bad_Opcode
}, /* op size prefix */
1952 { Bad_Opcode
}, /* adr size prefix */
1954 { "pushP", { sIv
}, 0 },
1955 { "imulS", { Gv
, Ev
, Iv
}, 0 },
1956 { "pushP", { sIbT
}, 0 },
1957 { "imulS", { Gv
, Ev
, sIb
}, 0 },
1958 { "ins{b|}", { Ybr
, indirDX
}, 0 },
1959 { X86_64_TABLE (X86_64_6D
) },
1960 { "outs{b|}", { indirDXr
, Xb
}, 0 },
1961 { X86_64_TABLE (X86_64_6F
) },
1963 { "joH", { Jb
, BND
, cond_jump_flag
}, PREFIX_REX2_ILLEGAL
},
1964 { "jnoH", { Jb
, BND
, cond_jump_flag
}, PREFIX_REX2_ILLEGAL
},
1965 { "jbH", { Jb
, BND
, cond_jump_flag
}, PREFIX_REX2_ILLEGAL
},
1966 { "jaeH", { Jb
, BND
, cond_jump_flag
}, PREFIX_REX2_ILLEGAL
},
1967 { "jeH", { Jb
, BND
, cond_jump_flag
}, PREFIX_REX2_ILLEGAL
},
1968 { "jneH", { Jb
, BND
, cond_jump_flag
}, PREFIX_REX2_ILLEGAL
},
1969 { "jbeH", { Jb
, BND
, cond_jump_flag
}, PREFIX_REX2_ILLEGAL
},
1970 { "jaH", { Jb
, BND
, cond_jump_flag
}, PREFIX_REX2_ILLEGAL
},
1972 { "jsH", { Jb
, BND
, cond_jump_flag
}, PREFIX_REX2_ILLEGAL
},
1973 { "jnsH", { Jb
, BND
, cond_jump_flag
}, PREFIX_REX2_ILLEGAL
},
1974 { "jpH", { Jb
, BND
, cond_jump_flag
}, PREFIX_REX2_ILLEGAL
},
1975 { "jnpH", { Jb
, BND
, cond_jump_flag
}, PREFIX_REX2_ILLEGAL
},
1976 { "jlH", { Jb
, BND
, cond_jump_flag
}, PREFIX_REX2_ILLEGAL
},
1977 { "jgeH", { Jb
, BND
, cond_jump_flag
}, PREFIX_REX2_ILLEGAL
},
1978 { "jleH", { Jb
, BND
, cond_jump_flag
}, PREFIX_REX2_ILLEGAL
},
1979 { "jgH", { Jb
, BND
, cond_jump_flag
}, PREFIX_REX2_ILLEGAL
},
1981 { REG_TABLE (REG_80
) },
1982 { REG_TABLE (REG_81
) },
1983 { X86_64_TABLE (X86_64_82
) },
1984 { REG_TABLE (REG_83
) },
1985 { "testB", { Eb
, Gb
}, 0 },
1986 { "testS", { Ev
, Gv
}, 0 },
1987 { "xchgB", { Ebh2
, Gb
}, 0 },
1988 { "xchgS", { Evh2
, Gv
}, 0 },
1990 { "movB", { Ebh3
, Gb
}, 0 },
1991 { "movS", { Evh3
, Gv
}, 0 },
1992 { "movB", { Gb
, EbS
}, 0 },
1993 { "movS", { Gv
, EvS
}, 0 },
1994 { "movD", { Sv
, Sw
}, 0 },
1995 { "leaS", { Gv
, M
}, 0 },
1996 { "movD", { Sw
, Sv
}, 0 },
1997 { REG_TABLE (REG_8F
) },
1999 { PREFIX_TABLE (PREFIX_90
) },
2000 { "xchgS", { RMeCX
, eAX
}, 0 },
2001 { "xchgS", { RMeDX
, eAX
}, 0 },
2002 { "xchgS", { RMeBX
, eAX
}, 0 },
2003 { "xchgS", { RMeSP
, eAX
}, 0 },
2004 { "xchgS", { RMeBP
, eAX
}, 0 },
2005 { "xchgS", { RMeSI
, eAX
}, 0 },
2006 { "xchgS", { RMeDI
, eAX
}, 0 },
2008 { "cW{t|}R", { XX
}, 0 },
2009 { "cR{t|}O", { XX
}, 0 },
2010 { X86_64_TABLE (X86_64_9A
) },
2011 { Bad_Opcode
}, /* fwait */
2012 { "pushfP", { XX
}, 0 },
2013 { "popfP", { XX
}, 0 },
2014 { "sahf", { XX
}, 0 },
2015 { "lahf", { XX
}, 0 },
2017 { "mov%LB", { AL
, Ob
}, PREFIX_REX2_ILLEGAL
},
2018 { "mov%LS", { { JMPABS_Fixup
, eAX_reg
}, { JMPABS_Fixup
, v_mode
} }, PREFIX_REX2_ILLEGAL
},
2019 { "mov%LB", { Ob
, AL
}, PREFIX_REX2_ILLEGAL
},
2020 { "mov%LS", { Ov
, eAX
}, PREFIX_REX2_ILLEGAL
},
2021 { "movs{b|}", { Ybr
, Xb
}, PREFIX_REX2_ILLEGAL
},
2022 { "movs{R|}", { Yvr
, Xv
}, PREFIX_REX2_ILLEGAL
},
2023 { "cmps{b|}", { Xb
, Yb
}, PREFIX_REX2_ILLEGAL
},
2024 { "cmps{R|}", { Xv
, Yv
}, PREFIX_REX2_ILLEGAL
},
2026 { "testB", { AL
, Ib
}, PREFIX_REX2_ILLEGAL
},
2027 { "testS", { eAX
, Iv
}, PREFIX_REX2_ILLEGAL
},
2028 { "stosB", { Ybr
, AL
}, PREFIX_REX2_ILLEGAL
},
2029 { "stosS", { Yvr
, eAX
}, PREFIX_REX2_ILLEGAL
},
2030 { "lodsB", { ALr
, Xb
}, PREFIX_REX2_ILLEGAL
},
2031 { "lodsS", { eAXr
, Xv
}, PREFIX_REX2_ILLEGAL
},
2032 { "scasB", { AL
, Yb
}, PREFIX_REX2_ILLEGAL
},
2033 { "scasS", { eAX
, Yv
}, PREFIX_REX2_ILLEGAL
},
2035 { "movB", { RMAL
, Ib
}, 0 },
2036 { "movB", { RMCL
, Ib
}, 0 },
2037 { "movB", { RMDL
, Ib
}, 0 },
2038 { "movB", { RMBL
, Ib
}, 0 },
2039 { "movB", { RMAH
, Ib
}, 0 },
2040 { "movB", { RMCH
, Ib
}, 0 },
2041 { "movB", { RMDH
, Ib
}, 0 },
2042 { "movB", { RMBH
, Ib
}, 0 },
2044 { "mov%LV", { RMeAX
, Iv64
}, 0 },
2045 { "mov%LV", { RMeCX
, Iv64
}, 0 },
2046 { "mov%LV", { RMeDX
, Iv64
}, 0 },
2047 { "mov%LV", { RMeBX
, Iv64
}, 0 },
2048 { "mov%LV", { RMeSP
, Iv64
}, 0 },
2049 { "mov%LV", { RMeBP
, Iv64
}, 0 },
2050 { "mov%LV", { RMeSI
, Iv64
}, 0 },
2051 { "mov%LV", { RMeDI
, Iv64
}, 0 },
2053 { REG_TABLE (REG_C0
) },
2054 { REG_TABLE (REG_C1
) },
2055 { X86_64_TABLE (X86_64_C2
) },
2056 { X86_64_TABLE (X86_64_C3
) },
2057 { X86_64_TABLE (X86_64_C4
) },
2058 { X86_64_TABLE (X86_64_C5
) },
2059 { REG_TABLE (REG_C6
) },
2060 { REG_TABLE (REG_C7
) },
2062 { "enterP", { Iw
, Ib
}, 0 },
2063 { "leaveP", { XX
}, 0 },
2064 { "{l|}ret{|f}%LP", { Iw
}, 0 },
2065 { "{l|}ret{|f}%LP", { XX
}, 0 },
2066 { "int3", { XX
}, 0 },
2067 { "int", { Ib
}, 0 },
2068 { X86_64_TABLE (X86_64_CE
) },
2069 { "iret%LP", { XX
}, 0 },
2071 { REG_TABLE (REG_D0
) },
2072 { REG_TABLE (REG_D1
) },
2073 { REG_TABLE (REG_D2
) },
2074 { REG_TABLE (REG_D3
) },
2075 { X86_64_TABLE (X86_64_D4
) },
2076 { X86_64_TABLE (X86_64_D5
) },
2078 { "xlat", { DSBX
}, 0 },
2089 { "loopneFH", { Jb
, XX
, loop_jcxz_flag
}, PREFIX_REX2_ILLEGAL
},
2090 { "loopeFH", { Jb
, XX
, loop_jcxz_flag
}, PREFIX_REX2_ILLEGAL
},
2091 { "loopFH", { Jb
, XX
, loop_jcxz_flag
}, PREFIX_REX2_ILLEGAL
},
2092 { "jEcxzH", { Jb
, XX
, loop_jcxz_flag
}, PREFIX_REX2_ILLEGAL
},
2093 { "inB", { AL
, Ib
}, PREFIX_REX2_ILLEGAL
},
2094 { "inG", { zAX
, Ib
}, PREFIX_REX2_ILLEGAL
},
2095 { "outB", { Ib
, AL
}, PREFIX_REX2_ILLEGAL
},
2096 { "outG", { Ib
, zAX
}, PREFIX_REX2_ILLEGAL
},
2098 { X86_64_TABLE (X86_64_E8
) },
2099 { X86_64_TABLE (X86_64_E9
) },
2100 { X86_64_TABLE (X86_64_EA
) },
2101 { "jmp", { Jb
, BND
}, PREFIX_REX2_ILLEGAL
},
2102 { "inB", { AL
, indirDX
}, PREFIX_REX2_ILLEGAL
},
2103 { "inG", { zAX
, indirDX
}, PREFIX_REX2_ILLEGAL
},
2104 { "outB", { indirDX
, AL
}, PREFIX_REX2_ILLEGAL
},
2105 { "outG", { indirDX
, zAX
}, PREFIX_REX2_ILLEGAL
},
2107 { Bad_Opcode
}, /* lock prefix */
2108 { "int1", { XX
}, 0 },
2109 { Bad_Opcode
}, /* repne */
2110 { Bad_Opcode
}, /* repz */
2111 { "hlt", { XX
}, 0 },
2112 { "cmc", { XX
}, 0 },
2113 { REG_TABLE (REG_F6
) },
2114 { REG_TABLE (REG_F7
) },
2116 { "clc", { XX
}, 0 },
2117 { "stc", { XX
}, 0 },
2118 { "cli", { XX
}, 0 },
2119 { "sti", { XX
}, 0 },
2120 { "cld", { XX
}, 0 },
2121 { "std", { XX
}, 0 },
2122 { REG_TABLE (REG_FE
) },
2123 { REG_TABLE (REG_FF
) },
2126 static const struct dis386 dis386_twobyte
[] = {
2128 { REG_TABLE (REG_0F00
) },
2129 { REG_TABLE (REG_0F01
) },
2130 { "larS", { Gv
, Sv
}, 0 },
2131 { "lslS", { Gv
, Sv
}, 0 },
2133 { "syscall", { XX
}, 0 },
2134 { "clts", { XX
}, 0 },
2135 { "sysret%LQ", { XX
}, 0 },
2137 { "invd", { XX
}, 0 },
2138 { PREFIX_TABLE (PREFIX_0F09
) },
2140 { "ud2", { XX
}, 0 },
2142 { REG_TABLE (REG_0F0D
) },
2143 { "femms", { XX
}, 0 },
2144 { "", { MX
, EM
, OPSUF
}, 0 }, /* See OP_3DNowSuffix. */
2146 { PREFIX_TABLE (PREFIX_0F10
) },
2147 { PREFIX_TABLE (PREFIX_0F11
) },
2148 { PREFIX_TABLE (PREFIX_0F12
) },
2149 { "movlpX", { Mq
, XM
}, PREFIX_OPCODE
},
2150 { "unpcklpX", { XM
, EXx
}, PREFIX_OPCODE
},
2151 { "unpckhpX", { XM
, EXx
}, PREFIX_OPCODE
},
2152 { PREFIX_TABLE (PREFIX_0F16
) },
2153 { "movhpX", { Mq
, XM
}, PREFIX_OPCODE
},
2155 { REG_TABLE (REG_0F18
) },
2156 { "nopQ", { Ev
}, 0 },
2157 { PREFIX_TABLE (PREFIX_0F1A
) },
2158 { PREFIX_TABLE (PREFIX_0F1B
) },
2159 { PREFIX_TABLE (PREFIX_0F1C
) },
2160 { "nopQ", { Ev
}, 0 },
2161 { PREFIX_TABLE (PREFIX_0F1E
) },
2162 { "nopQ", { Ev
}, 0 },
2164 { "movZ", { Em
, Cm
}, 0 },
2165 { "movZ", { Em
, Dm
}, 0 },
2166 { "movZ", { Cm
, Em
}, 0 },
2167 { "movZ", { Dm
, Em
}, 0 },
2168 { X86_64_TABLE (X86_64_0F24
) },
2170 { X86_64_TABLE (X86_64_0F26
) },
2173 { "movapX", { XM
, EXx
}, PREFIX_OPCODE
},
2174 { "movapX", { EXxS
, XM
}, PREFIX_OPCODE
},
2175 { PREFIX_TABLE (PREFIX_0F2A
) },
2176 { PREFIX_TABLE (PREFIX_0F2B
) },
2177 { PREFIX_TABLE (PREFIX_0F2C
) },
2178 { PREFIX_TABLE (PREFIX_0F2D
) },
2179 { PREFIX_TABLE (PREFIX_0F2E
) },
2180 { PREFIX_TABLE (PREFIX_0F2F
) },
2182 { "wrmsr", { XX
}, PREFIX_REX2_ILLEGAL
},
2183 { "rdtsc", { XX
}, PREFIX_REX2_ILLEGAL
},
2184 { "rdmsr", { XX
}, PREFIX_REX2_ILLEGAL
},
2185 { "rdpmc", { XX
}, PREFIX_REX2_ILLEGAL
},
2186 { "sysenter", { SEP
}, PREFIX_REX2_ILLEGAL
},
2187 { "sysexit%LQ", { SEP
}, PREFIX_REX2_ILLEGAL
},
2189 { "getsec", { XX
}, 0 },
2191 { THREE_BYTE_TABLE (THREE_BYTE_0F38
) },
2193 { THREE_BYTE_TABLE (THREE_BYTE_0F3A
) },
2200 { "cmovoS", { Gv
, Ev
}, 0 },
2201 { "cmovnoS", { Gv
, Ev
}, 0 },
2202 { "cmovbS", { Gv
, Ev
}, 0 },
2203 { "cmovaeS", { Gv
, Ev
}, 0 },
2204 { "cmoveS", { Gv
, Ev
}, 0 },
2205 { "cmovneS", { Gv
, Ev
}, 0 },
2206 { "cmovbeS", { Gv
, Ev
}, 0 },
2207 { "cmovaS", { Gv
, Ev
}, 0 },
2209 { "cmovsS", { Gv
, Ev
}, 0 },
2210 { "cmovnsS", { Gv
, Ev
}, 0 },
2211 { "cmovpS", { Gv
, Ev
}, 0 },
2212 { "cmovnpS", { Gv
, Ev
}, 0 },
2213 { "cmovlS", { Gv
, Ev
}, 0 },
2214 { "cmovgeS", { Gv
, Ev
}, 0 },
2215 { "cmovleS", { Gv
, Ev
}, 0 },
2216 { "cmovgS", { Gv
, Ev
}, 0 },
2218 { "movmskpX", { Gdq
, Ux
}, PREFIX_OPCODE
},
2219 { PREFIX_TABLE (PREFIX_0F51
) },
2220 { PREFIX_TABLE (PREFIX_0F52
) },
2221 { PREFIX_TABLE (PREFIX_0F53
) },
2222 { "andpX", { XM
, EXx
}, PREFIX_OPCODE
},
2223 { "andnpX", { XM
, EXx
}, PREFIX_OPCODE
},
2224 { "orpX", { XM
, EXx
}, PREFIX_OPCODE
},
2225 { "xorpX", { XM
, EXx
}, PREFIX_OPCODE
},
2227 { PREFIX_TABLE (PREFIX_0F58
) },
2228 { PREFIX_TABLE (PREFIX_0F59
) },
2229 { PREFIX_TABLE (PREFIX_0F5A
) },
2230 { PREFIX_TABLE (PREFIX_0F5B
) },
2231 { PREFIX_TABLE (PREFIX_0F5C
) },
2232 { PREFIX_TABLE (PREFIX_0F5D
) },
2233 { PREFIX_TABLE (PREFIX_0F5E
) },
2234 { PREFIX_TABLE (PREFIX_0F5F
) },
2236 { PREFIX_TABLE (PREFIX_0F60
) },
2237 { PREFIX_TABLE (PREFIX_0F61
) },
2238 { PREFIX_TABLE (PREFIX_0F62
) },
2239 { "packsswb", { MX
, EM
}, PREFIX_OPCODE
},
2240 { "pcmpgtb", { MX
, EM
}, PREFIX_OPCODE
},
2241 { "pcmpgtw", { MX
, EM
}, PREFIX_OPCODE
},
2242 { "pcmpgtd", { MX
, EM
}, PREFIX_OPCODE
},
2243 { "packuswb", { MX
, EM
}, PREFIX_OPCODE
},
2245 { "punpckhbw", { MX
, EM
}, PREFIX_OPCODE
},
2246 { "punpckhwd", { MX
, EM
}, PREFIX_OPCODE
},
2247 { "punpckhdq", { MX
, EM
}, PREFIX_OPCODE
},
2248 { "packssdw", { MX
, EM
}, PREFIX_OPCODE
},
2249 { "punpcklqdq", { XM
, EXx
}, PREFIX_DATA
},
2250 { "punpckhqdq", { XM
, EXx
}, PREFIX_DATA
},
2251 { "movK", { MX
, Edq
}, PREFIX_OPCODE
},
2252 { PREFIX_TABLE (PREFIX_0F6F
) },
2254 { PREFIX_TABLE (PREFIX_0F70
) },
2255 { REG_TABLE (REG_0F71
) },
2256 { REG_TABLE (REG_0F72
) },
2257 { REG_TABLE (REG_0F73
) },
2258 { "pcmpeqb", { MX
, EM
}, PREFIX_OPCODE
},
2259 { "pcmpeqw", { MX
, EM
}, PREFIX_OPCODE
},
2260 { "pcmpeqd", { MX
, EM
}, PREFIX_OPCODE
},
2261 { "emms", { XX
}, PREFIX_OPCODE
},
2263 { PREFIX_TABLE (PREFIX_0F78
) },
2264 { PREFIX_TABLE (PREFIX_0F79
) },
2267 { PREFIX_TABLE (PREFIX_0F7C
) },
2268 { PREFIX_TABLE (PREFIX_0F7D
) },
2269 { PREFIX_TABLE (PREFIX_0F7E
) },
2270 { PREFIX_TABLE (PREFIX_0F7F
) },
2272 { "joH", { Jv
, BND
, cond_jump_flag
}, PREFIX_REX2_ILLEGAL
},
2273 { "jnoH", { Jv
, BND
, cond_jump_flag
}, PREFIX_REX2_ILLEGAL
},
2274 { "jbH", { Jv
, BND
, cond_jump_flag
}, PREFIX_REX2_ILLEGAL
},
2275 { "jaeH", { Jv
, BND
, cond_jump_flag
}, PREFIX_REX2_ILLEGAL
},
2276 { "jeH", { Jv
, BND
, cond_jump_flag
}, PREFIX_REX2_ILLEGAL
},
2277 { "jneH", { Jv
, BND
, cond_jump_flag
}, PREFIX_REX2_ILLEGAL
},
2278 { "jbeH", { Jv
, BND
, cond_jump_flag
}, PREFIX_REX2_ILLEGAL
},
2279 { "jaH", { Jv
, BND
, cond_jump_flag
}, PREFIX_REX2_ILLEGAL
},
2281 { "jsH", { Jv
, BND
, cond_jump_flag
}, PREFIX_REX2_ILLEGAL
},
2282 { "jnsH", { Jv
, BND
, cond_jump_flag
}, PREFIX_REX2_ILLEGAL
},
2283 { "jpH", { Jv
, BND
, cond_jump_flag
}, PREFIX_REX2_ILLEGAL
},
2284 { "jnpH", { Jv
, BND
, cond_jump_flag
}, PREFIX_REX2_ILLEGAL
},
2285 { "jlH", { Jv
, BND
, cond_jump_flag
}, PREFIX_REX2_ILLEGAL
},
2286 { "jgeH", { Jv
, BND
, cond_jump_flag
}, PREFIX_REX2_ILLEGAL
},
2287 { "jleH", { Jv
, BND
, cond_jump_flag
}, PREFIX_REX2_ILLEGAL
},
2288 { "jgH", { Jv
, BND
, cond_jump_flag
}, PREFIX_REX2_ILLEGAL
},
2290 { "seto", { Eb
}, 0 },
2291 { "setno", { Eb
}, 0 },
2292 { "setb", { Eb
}, 0 },
2293 { "setae", { Eb
}, 0 },
2294 { "sete", { Eb
}, 0 },
2295 { "setne", { Eb
}, 0 },
2296 { "setbe", { Eb
}, 0 },
2297 { "seta", { Eb
}, 0 },
2299 { "sets", { Eb
}, 0 },
2300 { "setns", { Eb
}, 0 },
2301 { "setp", { Eb
}, 0 },
2302 { "setnp", { Eb
}, 0 },
2303 { "setl", { Eb
}, 0 },
2304 { "setge", { Eb
}, 0 },
2305 { "setle", { Eb
}, 0 },
2306 { "setg", { Eb
}, 0 },
2308 { "pushP", { fs
}, 0 },
2309 { "popP", { fs
}, 0 },
2310 { "cpuid", { XX
}, 0 },
2311 { "btS", { Ev
, Gv
}, 0 },
2312 { "shldS", { Ev
, Gv
, Ib
}, 0 },
2313 { "shldS", { Ev
, Gv
, CL
}, 0 },
2314 { REG_TABLE (REG_0FA6
) },
2315 { REG_TABLE (REG_0FA7
) },
2317 { "pushP", { gs
}, 0 },
2318 { "popP", { gs
}, 0 },
2319 { "rsm", { XX
}, 0 },
2320 { "btsS", { Evh1
, Gv
}, 0 },
2321 { "shrdS", { Ev
, Gv
, Ib
}, 0 },
2322 { "shrdS", { Ev
, Gv
, CL
}, 0 },
2323 { REG_TABLE (REG_0FAE
) },
2324 { "imulS", { Gv
, Ev
}, 0 },
2326 { "cmpxchgB", { Ebh1
, Gb
}, 0 },
2327 { "cmpxchgS", { Evh1
, Gv
}, 0 },
2328 { "lssS", { Gv
, Mp
}, 0 },
2329 { "btrS", { Evh1
, Gv
}, 0 },
2330 { "lfsS", { Gv
, Mp
}, 0 },
2331 { "lgsS", { Gv
, Mp
}, 0 },
2332 { "movz{bR|x}", { Gv
, Eb
}, 0 },
2333 { "movz{wR|x}", { Gv
, Ew
}, 0 }, /* yes, there really is movzww ! */
2335 { PREFIX_TABLE (PREFIX_0FB8
) },
2336 { "ud1S", { Gv
, Ev
}, 0 },
2337 { REG_TABLE (REG_0FBA
) },
2338 { "btcS", { Evh1
, Gv
}, 0 },
2339 { PREFIX_TABLE (PREFIX_0FBC
) },
2340 { PREFIX_TABLE (PREFIX_0FBD
) },
2341 { "movs{bR|x}", { Gv
, Eb
}, 0 },
2342 { "movs{wR|x}", { Gv
, Ew
}, 0 }, /* yes, there really is movsww ! */
2344 { "xaddB", { Ebh1
, Gb
}, 0 },
2345 { "xaddS", { Evh1
, Gv
}, 0 },
2346 { PREFIX_TABLE (PREFIX_0FC2
) },
2347 { "movntiS", { Mdq
, Gdq
}, PREFIX_OPCODE
},
2348 { "pinsrw", { MX
, Edw
, Ib
}, PREFIX_OPCODE
},
2349 { "pextrw", { Gd
, Nq
, Ib
}, PREFIX_OPCODE
},
2350 { "shufpX", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
2351 { REG_TABLE (REG_0FC7
) },
2353 { "bswap", { RMeAX
}, 0 },
2354 { "bswap", { RMeCX
}, 0 },
2355 { "bswap", { RMeDX
}, 0 },
2356 { "bswap", { RMeBX
}, 0 },
2357 { "bswap", { RMeSP
}, 0 },
2358 { "bswap", { RMeBP
}, 0 },
2359 { "bswap", { RMeSI
}, 0 },
2360 { "bswap", { RMeDI
}, 0 },
2362 { PREFIX_TABLE (PREFIX_0FD0
) },
2363 { "psrlw", { MX
, EM
}, PREFIX_OPCODE
},
2364 { "psrld", { MX
, EM
}, PREFIX_OPCODE
},
2365 { "psrlq", { MX
, EM
}, PREFIX_OPCODE
},
2366 { "paddq", { MX
, EM
}, PREFIX_OPCODE
},
2367 { "pmullw", { MX
, EM
}, PREFIX_OPCODE
},
2368 { PREFIX_TABLE (PREFIX_0FD6
) },
2369 { "pmovmskb", { Gdq
, Nq
}, PREFIX_OPCODE
},
2371 { "psubusb", { MX
, EM
}, PREFIX_OPCODE
},
2372 { "psubusw", { MX
, EM
}, PREFIX_OPCODE
},
2373 { "pminub", { MX
, EM
}, PREFIX_OPCODE
},
2374 { "pand", { MX
, EM
}, PREFIX_OPCODE
},
2375 { "paddusb", { MX
, EM
}, PREFIX_OPCODE
},
2376 { "paddusw", { MX
, EM
}, PREFIX_OPCODE
},
2377 { "pmaxub", { MX
, EM
}, PREFIX_OPCODE
},
2378 { "pandn", { MX
, EM
}, PREFIX_OPCODE
},
2380 { "pavgb", { MX
, EM
}, PREFIX_OPCODE
},
2381 { "psraw", { MX
, EM
}, PREFIX_OPCODE
},
2382 { "psrad", { MX
, EM
}, PREFIX_OPCODE
},
2383 { "pavgw", { MX
, EM
}, PREFIX_OPCODE
},
2384 { "pmulhuw", { MX
, EM
}, PREFIX_OPCODE
},
2385 { "pmulhw", { MX
, EM
}, PREFIX_OPCODE
},
2386 { PREFIX_TABLE (PREFIX_0FE6
) },
2387 { PREFIX_TABLE (PREFIX_0FE7
) },
2389 { "psubsb", { MX
, EM
}, PREFIX_OPCODE
},
2390 { "psubsw", { MX
, EM
}, PREFIX_OPCODE
},
2391 { "pminsw", { MX
, EM
}, PREFIX_OPCODE
},
2392 { "por", { MX
, EM
}, PREFIX_OPCODE
},
2393 { "paddsb", { MX
, EM
}, PREFIX_OPCODE
},
2394 { "paddsw", { MX
, EM
}, PREFIX_OPCODE
},
2395 { "pmaxsw", { MX
, EM
}, PREFIX_OPCODE
},
2396 { "pxor", { MX
, EM
}, PREFIX_OPCODE
},
2398 { PREFIX_TABLE (PREFIX_0FF0
) },
2399 { "psllw", { MX
, EM
}, PREFIX_OPCODE
},
2400 { "pslld", { MX
, EM
}, PREFIX_OPCODE
},
2401 { "psllq", { MX
, EM
}, PREFIX_OPCODE
},
2402 { "pmuludq", { MX
, EM
}, PREFIX_OPCODE
},
2403 { "pmaddwd", { MX
, EM
}, PREFIX_OPCODE
},
2404 { "psadbw", { MX
, EM
}, PREFIX_OPCODE
},
2405 { PREFIX_TABLE (PREFIX_0FF7
) },
2407 { "psubb", { MX
, EM
}, PREFIX_OPCODE
},
2408 { "psubw", { MX
, EM
}, PREFIX_OPCODE
},
2409 { "psubd", { MX
, EM
}, PREFIX_OPCODE
},
2410 { "psubq", { MX
, EM
}, PREFIX_OPCODE
},
2411 { "paddb", { MX
, EM
}, PREFIX_OPCODE
},
2412 { "paddw", { MX
, EM
}, PREFIX_OPCODE
},
2413 { "paddd", { MX
, EM
}, PREFIX_OPCODE
},
2414 { "ud0S", { Gv
, Ev
}, 0 },
2417 static const bool onebyte_has_modrm
[256] = {
2418 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2419 /* ------------------------------- */
2420 /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
2421 /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
2422 /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
2423 /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
2424 /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
2425 /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
2426 /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
2427 /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
2428 /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
2429 /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
2430 /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
2431 /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
2432 /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
2433 /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
2434 /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
2435 /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1 /* f0 */
2436 /* ------------------------------- */
2437 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2440 static const bool twobyte_has_modrm
[256] = {
2441 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2442 /* ------------------------------- */
2443 /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
2444 /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
2445 /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
2446 /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
2447 /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
2448 /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
2449 /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
2450 /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
2451 /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
2452 /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
2453 /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
2454 /* b0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* bf */
2455 /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
2456 /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
2457 /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
2458 /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 /* ff */
2459 /* ------------------------------- */
2460 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2470 /* If we are accessing mod/rm/reg without need_modrm set, then the
2471 values are stale. Hitting this abort likely indicates that you
2472 need to update onebyte_has_modrm or twobyte_has_modrm. */
2473 #define MODRM_CHECK if (!ins->need_modrm) abort ()
2475 static const char intel_index16
[][6] = {
2476 "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
2479 static const char att_names64
[][8] = {
2480 "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
2481 "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15",
2482 "%r16", "%r17", "%r18", "%r19", "%r20", "%r21", "%r22", "%r23",
2483 "%r24", "%r25", "%r26", "%r27", "%r28", "%r29", "%r30", "%r31",
2485 static const char att_names32
[][8] = {
2486 "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
2487 "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d",
2488 "%r16d", "%r17d", "%r18d", "%r19d", "%r20d", "%r21d", "%r22d", "%r23d",
2489 "%r24d", "%r25d", "%r26d", "%r27d", "%r28d", "%r29d", "%r30d", "%r31d",
2491 static const char att_names16
[][8] = {
2492 "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
2493 "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w",
2494 "%r16w", "%r17w", "%r18w", "%r19w", "%r20w", "%r21w", "%r22w", "%r23w",
2495 "%r24w", "%r25w", "%r26w", "%r27w", "%r28w", "%r29w", "%r30w", "%r31w",
2497 static const char att_names8
[][8] = {
2498 "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
2500 static const char att_names8rex
[][8] = {
2501 "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
2502 "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b",
2503 "%r16b", "%r17b", "%r18b", "%r19b", "%r20b", "%r21b", "%r22b", "%r23b",
2504 "%r24b", "%r25b", "%r26b", "%r27b", "%r28b", "%r29b", "%r30b", "%r31b",
2506 static const char att_names_seg
[][4] = {
2507 "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
2509 static const char att_index64
[] = "%riz";
2510 static const char att_index32
[] = "%eiz";
2511 static const char att_index16
[][8] = {
2512 "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
2515 static const char att_names_mm
[][8] = {
2516 "%mm0", "%mm1", "%mm2", "%mm3",
2517 "%mm4", "%mm5", "%mm6", "%mm7"
2520 static const char att_names_bnd
[][8] = {
2521 "%bnd0", "%bnd1", "%bnd2", "%bnd3"
2524 static const char att_names_xmm
[][8] = {
2525 "%xmm0", "%xmm1", "%xmm2", "%xmm3",
2526 "%xmm4", "%xmm5", "%xmm6", "%xmm7",
2527 "%xmm8", "%xmm9", "%xmm10", "%xmm11",
2528 "%xmm12", "%xmm13", "%xmm14", "%xmm15",
2529 "%xmm16", "%xmm17", "%xmm18", "%xmm19",
2530 "%xmm20", "%xmm21", "%xmm22", "%xmm23",
2531 "%xmm24", "%xmm25", "%xmm26", "%xmm27",
2532 "%xmm28", "%xmm29", "%xmm30", "%xmm31"
2535 static const char att_names_ymm
[][8] = {
2536 "%ymm0", "%ymm1", "%ymm2", "%ymm3",
2537 "%ymm4", "%ymm5", "%ymm6", "%ymm7",
2538 "%ymm8", "%ymm9", "%ymm10", "%ymm11",
2539 "%ymm12", "%ymm13", "%ymm14", "%ymm15",
2540 "%ymm16", "%ymm17", "%ymm18", "%ymm19",
2541 "%ymm20", "%ymm21", "%ymm22", "%ymm23",
2542 "%ymm24", "%ymm25", "%ymm26", "%ymm27",
2543 "%ymm28", "%ymm29", "%ymm30", "%ymm31"
2546 static const char att_names_zmm
[][8] = {
2547 "%zmm0", "%zmm1", "%zmm2", "%zmm3",
2548 "%zmm4", "%zmm5", "%zmm6", "%zmm7",
2549 "%zmm8", "%zmm9", "%zmm10", "%zmm11",
2550 "%zmm12", "%zmm13", "%zmm14", "%zmm15",
2551 "%zmm16", "%zmm17", "%zmm18", "%zmm19",
2552 "%zmm20", "%zmm21", "%zmm22", "%zmm23",
2553 "%zmm24", "%zmm25", "%zmm26", "%zmm27",
2554 "%zmm28", "%zmm29", "%zmm30", "%zmm31"
2557 static const char att_names_tmm
[][8] = {
2558 "%tmm0", "%tmm1", "%tmm2", "%tmm3",
2559 "%tmm4", "%tmm5", "%tmm6", "%tmm7"
2562 static const char att_names_mask
[][8] = {
2563 "%k0", "%k1", "%k2", "%k3", "%k4", "%k5", "%k6", "%k7"
2566 static const char *const names_rounding
[] =
2574 static const struct dis386 reg_table
[][8] = {
2577 { "addA", { Ebh1
, Ib
}, 0 },
2578 { "orA", { Ebh1
, Ib
}, 0 },
2579 { "adcA", { Ebh1
, Ib
}, 0 },
2580 { "sbbA", { Ebh1
, Ib
}, 0 },
2581 { "andA", { Ebh1
, Ib
}, 0 },
2582 { "subA", { Ebh1
, Ib
}, 0 },
2583 { "xorA", { Ebh1
, Ib
}, 0 },
2584 { "cmpA", { Eb
, Ib
}, 0 },
2588 { "addQ", { Evh1
, Iv
}, 0 },
2589 { "orQ", { Evh1
, Iv
}, 0 },
2590 { "adcQ", { Evh1
, Iv
}, 0 },
2591 { "sbbQ", { Evh1
, Iv
}, 0 },
2592 { "andQ", { Evh1
, Iv
}, 0 },
2593 { "subQ", { Evh1
, Iv
}, 0 },
2594 { "xorQ", { Evh1
, Iv
}, 0 },
2595 { "cmpQ", { Ev
, Iv
}, 0 },
2599 { "addQ", { Evh1
, sIb
}, 0 },
2600 { "orQ", { Evh1
, sIb
}, 0 },
2601 { "adcQ", { Evh1
, sIb
}, 0 },
2602 { "sbbQ", { Evh1
, sIb
}, 0 },
2603 { "andQ", { Evh1
, sIb
}, 0 },
2604 { "subQ", { Evh1
, sIb
}, 0 },
2605 { "xorQ", { Evh1
, sIb
}, 0 },
2606 { "cmpQ", { Ev
, sIb
}, 0 },
2610 { "pop{P|}", { stackEv
}, 0 },
2611 { XOP_8F_TABLE () },
2615 { XOP_8F_TABLE () },
2619 { "%NFrolA", { VexGb
, Eb
, Ib
}, NO_PREFIX
},
2620 { "%NFrorA", { VexGb
, Eb
, Ib
}, NO_PREFIX
},
2621 { "rclA", { VexGb
, Eb
, Ib
}, NO_PREFIX
},
2622 { "rcrA", { VexGb
, Eb
, Ib
}, NO_PREFIX
},
2623 { "%NFshlA", { VexGb
, Eb
, Ib
}, NO_PREFIX
},
2624 { "%NFshrA", { VexGb
, Eb
, Ib
}, NO_PREFIX
},
2625 { "%NFshlA", { VexGb
, Eb
, Ib
}, NO_PREFIX
},
2626 { "%NFsarA", { VexGb
, Eb
, Ib
}, NO_PREFIX
},
2630 { "%NFrolQ", { VexGv
, Ev
, Ib
}, PREFIX_NP_OR_DATA
},
2631 { "%NFrorQ", { VexGv
, Ev
, Ib
}, PREFIX_NP_OR_DATA
},
2632 { "rclQ", { VexGv
, Ev
, Ib
}, PREFIX_NP_OR_DATA
},
2633 { "rcrQ", { VexGv
, Ev
, Ib
}, PREFIX_NP_OR_DATA
},
2634 { "%NFshlQ", { VexGv
, Ev
, Ib
}, PREFIX_NP_OR_DATA
},
2635 { "%NFshrQ", { VexGv
, Ev
, Ib
}, PREFIX_NP_OR_DATA
},
2636 { "%NFshlQ", { VexGv
, Ev
, Ib
}, PREFIX_NP_OR_DATA
},
2637 { "%NFsarQ", { VexGv
, Ev
, Ib
}, PREFIX_NP_OR_DATA
},
2641 { "movA", { Ebh3
, Ib
}, 0 },
2648 { RM_TABLE (RM_C6_REG_7
) },
2652 { "movQ", { Evh3
, Iv
}, 0 },
2659 { RM_TABLE (RM_C7_REG_7
) },
2663 { "%NFrolA", { VexGb
, Eb
, I1
}, NO_PREFIX
},
2664 { "%NFrorA", { VexGb
, Eb
, I1
}, NO_PREFIX
},
2665 { "rclA", { VexGb
, Eb
, I1
}, NO_PREFIX
},
2666 { "rcrA", { VexGb
, Eb
, I1
}, NO_PREFIX
},
2667 { "%NFshlA", { VexGb
, Eb
, I1
}, NO_PREFIX
},
2668 { "%NFshrA", { VexGb
, Eb
, I1
}, NO_PREFIX
},
2669 { "%NFshlA", { VexGb
, Eb
, I1
}, NO_PREFIX
},
2670 { "%NFsarA", { VexGb
, Eb
, I1
}, NO_PREFIX
},
2674 { "%NFrolQ", { VexGv
, Ev
, I1
}, PREFIX_NP_OR_DATA
},
2675 { "%NFrorQ", { VexGv
, Ev
, I1
}, PREFIX_NP_OR_DATA
},
2676 { "rclQ", { VexGv
, Ev
, I1
}, PREFIX_NP_OR_DATA
},
2677 { "rcrQ", { VexGv
, Ev
, I1
}, PREFIX_NP_OR_DATA
},
2678 { "%NFshlQ", { VexGv
, Ev
, I1
}, PREFIX_NP_OR_DATA
},
2679 { "%NFshrQ", { VexGv
, Ev
, I1
}, PREFIX_NP_OR_DATA
},
2680 { "%NFshlQ", { VexGv
, Ev
, I1
}, PREFIX_NP_OR_DATA
},
2681 { "%NFsarQ", { VexGv
, Ev
, I1
}, PREFIX_NP_OR_DATA
},
2685 { "%NFrolA", { VexGb
, Eb
, CL
}, NO_PREFIX
},
2686 { "%NFrorA", { VexGb
, Eb
, CL
}, NO_PREFIX
},
2687 { "rclA", { VexGb
, Eb
, CL
}, NO_PREFIX
},
2688 { "rcrA", { VexGb
, Eb
, CL
}, NO_PREFIX
},
2689 { "%NFshlA", { VexGb
, Eb
, CL
}, NO_PREFIX
},
2690 { "%NFshrA", { VexGb
, Eb
, CL
}, NO_PREFIX
},
2691 { "%NFshlA", { VexGb
, Eb
, CL
}, NO_PREFIX
},
2692 { "%NFsarA", { VexGb
, Eb
, CL
}, NO_PREFIX
},
2696 { "%NFrolQ", { VexGv
, Ev
, CL
}, PREFIX_NP_OR_DATA
},
2697 { "%NFrorQ", { VexGv
, Ev
, CL
}, PREFIX_NP_OR_DATA
},
2698 { "rclQ", { VexGv
, Ev
, CL
}, PREFIX_NP_OR_DATA
},
2699 { "rcrQ", { VexGv
, Ev
, CL
}, PREFIX_NP_OR_DATA
},
2700 { "%NFshlQ", { VexGv
, Ev
, CL
}, PREFIX_NP_OR_DATA
},
2701 { "%NFshrQ", { VexGv
, Ev
, CL
}, PREFIX_NP_OR_DATA
},
2702 { "%NFshlQ", { VexGv
, Ev
, CL
}, PREFIX_NP_OR_DATA
},
2703 { "%NFsarQ", { VexGv
, Ev
, CL
}, PREFIX_NP_OR_DATA
},
2707 { "testA", { Eb
, Ib
}, 0 },
2708 { "testA", { Eb
, Ib
}, 0 },
2709 { "notA", { Ebh1
}, 0 },
2710 { "negA", { Ebh1
}, 0 },
2711 { "mulA", { Eb
}, 0 }, /* Don't print the implicit %al register, */
2712 { "imulA", { Eb
}, 0 }, /* to distinguish these opcodes from other */
2713 { "divA", { Eb
}, 0 }, /* mul/imul opcodes. Do the same for div */
2714 { "idivA", { Eb
}, 0 }, /* and idiv for consistency. */
2718 { "testQ", { Ev
, Iv
}, 0 },
2719 { "testQ", { Ev
, Iv
}, 0 },
2720 { "notQ", { Evh1
}, 0 },
2721 { "negQ", { Evh1
}, 0 },
2722 { "mulQ", { Ev
}, 0 }, /* Don't print the implicit register. */
2723 { "imulQ", { Ev
}, 0 },
2724 { "divQ", { Ev
}, 0 },
2725 { "idivQ", { Ev
}, 0 },
2729 { "incA", { Ebh1
}, 0 },
2730 { "decA", { Ebh1
}, 0 },
2734 { "incQ", { Evh1
}, 0 },
2735 { "decQ", { Evh1
}, 0 },
2736 { "call{@|}", { NOTRACK
, indirEv
, BND
}, 0 },
2737 { "{l|}call^", { indirEp
}, 0 },
2738 { "jmp{@|}", { NOTRACK
, indirEv
, BND
}, 0 },
2739 { "{l|}jmp^", { indirEp
}, 0 },
2740 { "push{P|}", { stackEv
}, 0 },
2745 { "sldtD", { Sv
}, 0 },
2746 { "strD", { Sv
}, 0 },
2747 { "lldtD", { Sv
}, 0 },
2748 { "ltrD", { Sv
}, 0 },
2749 { "verrD", { Sv
}, 0 },
2750 { "verwD", { Sv
}, 0 },
2751 { X86_64_TABLE (X86_64_0F00_REG_6
) },
2756 { MOD_TABLE (MOD_0F01_REG_0
) },
2757 { MOD_TABLE (MOD_0F01_REG_1
) },
2758 { MOD_TABLE (MOD_0F01_REG_2
) },
2759 { MOD_TABLE (MOD_0F01_REG_3
) },
2760 { "smswD", { Sv
}, 0 },
2761 { MOD_TABLE (MOD_0F01_REG_5
) },
2762 { "lmsw", { Ew
}, 0 },
2763 { MOD_TABLE (MOD_0F01_REG_7
) },
2767 { "prefetch", { Mb
}, 0 },
2768 { "prefetchw", { Mb
}, 0 },
2769 { "prefetchwt1", { Mb
}, 0 },
2770 { "prefetch", { Mb
}, 0 },
2771 { "prefetch", { Mb
}, 0 },
2772 { "prefetch", { Mb
}, 0 },
2773 { "prefetch", { Mb
}, 0 },
2774 { "prefetch", { Mb
}, 0 },
2778 { MOD_TABLE (MOD_0F18_REG_0
) },
2779 { MOD_TABLE (MOD_0F18_REG_1
) },
2780 { MOD_TABLE (MOD_0F18_REG_2
) },
2781 { MOD_TABLE (MOD_0F18_REG_3
) },
2782 { "nopQ", { Ev
}, 0 },
2783 { "nopQ", { Ev
}, 0 },
2784 { MOD_TABLE (MOD_0F18_REG_6
) },
2785 { MOD_TABLE (MOD_0F18_REG_7
) },
2787 /* REG_0F1C_P_0_MOD_0 */
2789 { "cldemote", { Mb
}, 0 },
2790 { "nopQ", { Ev
}, 0 },
2791 { "nopQ", { Ev
}, 0 },
2792 { "nopQ", { Ev
}, 0 },
2793 { "nopQ", { Ev
}, 0 },
2794 { "nopQ", { Ev
}, 0 },
2795 { "nopQ", { Ev
}, 0 },
2796 { "nopQ", { Ev
}, 0 },
2798 /* REG_0F1E_P_1_MOD_3 */
2800 { "nopQ", { Ev
}, PREFIX_IGNORED
},
2801 { "rdsspK", { Edq
}, 0 },
2802 { "nopQ", { Ev
}, PREFIX_IGNORED
},
2803 { "nopQ", { Ev
}, PREFIX_IGNORED
},
2804 { "nopQ", { Ev
}, PREFIX_IGNORED
},
2805 { "nopQ", { Ev
}, PREFIX_IGNORED
},
2806 { "nopQ", { Ev
}, PREFIX_IGNORED
},
2807 { RM_TABLE (RM_0F1E_P_1_MOD_3_REG_7
) },
2809 /* REG_0F38D8_PREFIX_1 */
2811 { "aesencwide128kl", { M
}, 0 },
2812 { "aesdecwide128kl", { M
}, 0 },
2813 { "aesencwide256kl", { M
}, 0 },
2814 { "aesdecwide256kl", { M
}, 0 },
2816 /* REG_0F3A0F_P_1 */
2818 { RM_TABLE (RM_0F3A0F_P_1_R_0
) },
2824 { "psrlw", { Nq
, Ib
}, PREFIX_OPCODE
},
2826 { "psraw", { Nq
, Ib
}, PREFIX_OPCODE
},
2828 { "psllw", { Nq
, Ib
}, PREFIX_OPCODE
},
2834 { "psrld", { Nq
, Ib
}, PREFIX_OPCODE
},
2836 { "psrad", { Nq
, Ib
}, PREFIX_OPCODE
},
2838 { "pslld", { Nq
, Ib
}, PREFIX_OPCODE
},
2844 { "psrlq", { Nq
, Ib
}, PREFIX_OPCODE
},
2845 { "psrldq", { Ux
, Ib
}, PREFIX_DATA
},
2848 { "psllq", { Nq
, Ib
}, PREFIX_OPCODE
},
2849 { "pslldq", { Ux
, Ib
}, PREFIX_DATA
},
2853 { "montmul", { { OP_0f07
, 0 } }, 0 },
2854 { "xsha1", { { OP_0f07
, 0 } }, 0 },
2855 { "xsha256", { { OP_0f07
, 0 } }, 0 },
2859 { "xstore-rng", { { OP_0f07
, 0 } }, 0 },
2860 { "xcrypt-ecb", { { OP_0f07
, 0 } }, 0 },
2861 { "xcrypt-cbc", { { OP_0f07
, 0 } }, 0 },
2862 { "xcrypt-ctr", { { OP_0f07
, 0 } }, 0 },
2863 { "xcrypt-cfb", { { OP_0f07
, 0 } }, 0 },
2864 { "xcrypt-ofb", { { OP_0f07
, 0 } }, 0 },
2868 { MOD_TABLE (MOD_0FAE_REG_0
) },
2869 { MOD_TABLE (MOD_0FAE_REG_1
) },
2870 { MOD_TABLE (MOD_0FAE_REG_2
) },
2871 { MOD_TABLE (MOD_0FAE_REG_3
) },
2872 { MOD_TABLE (MOD_0FAE_REG_4
) },
2873 { MOD_TABLE (MOD_0FAE_REG_5
) },
2874 { MOD_TABLE (MOD_0FAE_REG_6
) },
2875 { MOD_TABLE (MOD_0FAE_REG_7
) },
2883 { "btQ", { Ev
, Ib
}, 0 },
2884 { "btsQ", { Evh1
, Ib
}, 0 },
2885 { "btrQ", { Evh1
, Ib
}, 0 },
2886 { "btcQ", { Evh1
, Ib
}, 0 },
2891 { "cmpxchg8b", { { CMPXCHG8B_Fixup
, q_mode
} }, 0 },
2893 { "xrstors", { FXSAVE
}, PREFIX_REX2_ILLEGAL
},
2894 { "xsavec", { FXSAVE
}, PREFIX_REX2_ILLEGAL
},
2895 { "xsaves", { FXSAVE
}, PREFIX_REX2_ILLEGAL
},
2896 { MOD_TABLE (MOD_0FC7_REG_6
) },
2897 { MOD_TABLE (MOD_0FC7_REG_7
) },
2903 { "vpsrlw", { Vex
, Ux
, Ib
}, PREFIX_DATA
},
2905 { "vpsraw", { Vex
, Ux
, Ib
}, PREFIX_DATA
},
2907 { "vpsllw", { Vex
, Ux
, Ib
}, PREFIX_DATA
},
2913 { "vpsrld", { Vex
, Ux
, Ib
}, PREFIX_DATA
},
2915 { "vpsrad", { Vex
, Ux
, Ib
}, PREFIX_DATA
},
2917 { "vpslld", { Vex
, Ux
, Ib
}, PREFIX_DATA
},
2923 { "vpsrlq", { Vex
, Ux
, Ib
}, PREFIX_DATA
},
2924 { "vpsrldq", { Vex
, Ux
, Ib
}, PREFIX_DATA
},
2927 { "vpsllq", { Vex
, Ux
, Ib
}, PREFIX_DATA
},
2928 { "vpslldq", { Vex
, Ux
, Ib
}, PREFIX_DATA
},
2934 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_2
) },
2935 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_3
) },
2937 /* REG_VEX_0F3849_X86_64_L_0_W_0_M_1_P_0 */
2939 { RM_TABLE (RM_VEX_0F3849_X86_64_L_0_W_0_M_1_P_0_R_0
) },
2941 /* REG_VEX_0F38F3_L_0_P_0 */
2944 { "%NFblsrS", { VexGdq
, Edq
}, 0 },
2945 { "%NFblsmskS", { VexGdq
, Edq
}, 0 },
2946 { "%NFblsiS", { VexGdq
, Edq
}, 0 },
2948 /* REG_VEX_MAP7_F8_L_0_W_0 */
2950 { X86_64_TABLE (X86_64_VEX_MAP7_F8_L_0_W_0_R_0
) },
2952 /* REG_XOP_09_01_L_0 */
2955 { "blcfill", { VexGdq
, Edq
}, 0 },
2956 { "blsfill", { VexGdq
, Edq
}, 0 },
2957 { "blcs", { VexGdq
, Edq
}, 0 },
2958 { "tzmsk", { VexGdq
, Edq
}, 0 },
2959 { "blcic", { VexGdq
, Edq
}, 0 },
2960 { "blsic", { VexGdq
, Edq
}, 0 },
2961 { "t1mskc", { VexGdq
, Edq
}, 0 },
2963 /* REG_XOP_09_02_L_0 */
2966 { "blcmsk", { VexGdq
, Edq
}, 0 },
2971 { "blci", { VexGdq
, Edq
}, 0 },
2973 /* REG_XOP_09_12_L_0 */
2975 { "llwpcb", { Rdq
}, 0 },
2976 { "slwpcb", { Rdq
}, 0 },
2978 /* REG_XOP_0A_12_L_0 */
2980 { "lwpins", { VexGdq
, Ed
, Id
}, 0 },
2981 { "lwpval", { VexGdq
, Ed
, Id
}, 0 },
2984 #include "i386-dis-evex-reg.h"
2987 static const struct dis386 prefix_table
[][4] = {
2990 { "xchgS", { { NOP_Fixup
, 0 }, { NOP_Fixup
, 1 } }, 0 },
2991 { "pause", { XX
}, 0 },
2992 { "xchgS", { { NOP_Fixup
, 0 }, { NOP_Fixup
, 1 } }, 0 },
2993 { NULL
, { { NULL
, 0 } }, PREFIX_IGNORED
}
2996 /* PREFIX_0F00_REG_6_X86_64 */
3001 { "lkgsD", { Sv
}, 0 },
3004 /* PREFIX_0F01_REG_0_MOD_3_RM_6 */
3006 { "wrmsrns", { Skip_MODRM
}, 0 },
3007 { X86_64_TABLE (X86_64_0F01_REG_0_MOD_3_RM_6_P_1
) },
3009 { X86_64_TABLE (X86_64_0F01_REG_0_MOD_3_RM_6_P_3
) },
3012 /* PREFIX_0F01_REG_0_MOD_3_RM_7 */
3014 { X86_64_TABLE (X86_64_0F01_REG_0_MOD_3_RM_7_P_0
) },
3017 /* PREFIX_0F01_REG_1_RM_2 */
3019 { "clac", { Skip_MODRM
}, 0 },
3020 { X86_64_TABLE (X86_64_0F01_REG_1_RM_2_PREFIX_1
) },
3022 { X86_64_TABLE (X86_64_0F01_REG_1_RM_2_PREFIX_3
)},
3025 /* PREFIX_0F01_REG_1_RM_4 */
3029 { "tdcall", { Skip_MODRM
}, 0 },
3033 /* PREFIX_0F01_REG_1_RM_5 */
3037 { X86_64_TABLE (X86_64_0F01_REG_1_RM_5_PREFIX_2
) },
3041 /* PREFIX_0F01_REG_1_RM_6 */
3045 { X86_64_TABLE (X86_64_0F01_REG_1_RM_6_PREFIX_2
) },
3049 /* PREFIX_0F01_REG_1_RM_7 */
3051 { "encls", { Skip_MODRM
}, 0 },
3053 { X86_64_TABLE (X86_64_0F01_REG_1_RM_7_PREFIX_2
) },
3057 /* PREFIX_0F01_REG_3_RM_1 */
3059 { "vmmcall", { Skip_MODRM
}, 0 },
3060 { "vmgexit", { Skip_MODRM
}, 0 },
3062 { "vmgexit", { Skip_MODRM
}, 0 },
3065 /* PREFIX_0F01_REG_5_MOD_0 */
3068 { "rstorssp", { Mq
}, PREFIX_OPCODE
},
3071 /* PREFIX_0F01_REG_5_MOD_3_RM_0 */
3073 { "serialize", { Skip_MODRM
}, PREFIX_OPCODE
},
3074 { "setssbsy", { Skip_MODRM
}, PREFIX_OPCODE
},
3076 { "xsusldtrk", { Skip_MODRM
}, PREFIX_OPCODE
},
3079 /* PREFIX_0F01_REG_5_MOD_3_RM_1 */
3084 { "xresldtrk", { Skip_MODRM
}, PREFIX_OPCODE
},
3087 /* PREFIX_0F01_REG_5_MOD_3_RM_2 */
3090 { "saveprevssp", { Skip_MODRM
}, PREFIX_OPCODE
},
3093 /* PREFIX_0F01_REG_5_MOD_3_RM_4 */
3096 { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_4_PREFIX_1
) },
3099 /* PREFIX_0F01_REG_5_MOD_3_RM_5 */
3102 { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_5_PREFIX_1
) },
3105 /* PREFIX_0F01_REG_5_MOD_3_RM_6 */
3107 { "rdpkru", { Skip_MODRM
}, 0 },
3108 { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_6_PREFIX_1
) },
3111 /* PREFIX_0F01_REG_5_MOD_3_RM_7 */
3113 { "wrpkru", { Skip_MODRM
}, 0 },
3114 { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_7_PREFIX_1
) },
3117 /* PREFIX_0F01_REG_7_MOD_3_RM_2 */
3119 { "monitorx", { { OP_Monitor
, 0 } }, 0 },
3120 { "mcommit", { Skip_MODRM
}, 0 },
3123 /* PREFIX_0F01_REG_7_MOD_3_RM_5 */
3125 { "rdpru", { Skip_MODRM
}, 0 },
3126 { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_5_PREFIX_1
) },
3129 /* PREFIX_0F01_REG_7_MOD_3_RM_6 */
3131 { "invlpgb", { Skip_MODRM
}, 0 },
3132 { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_1
) },
3134 { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3
) },
3137 /* PREFIX_0F01_REG_7_MOD_3_RM_7 */
3139 { "tlbsync", { Skip_MODRM
}, 0 },
3140 { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_7_PREFIX_1
) },
3142 { "pvalidate", { Skip_MODRM
}, 0 },
3147 { "wbinvd", { XX
}, 0 },
3148 { "wbnoinvd", { XX
}, 0 },
3153 { "%XEVmovupX", { XM
, EXEvexXNoBcst
}, 0 },
3154 { "%XEVmovs%XS", { XMScalar
, VexScalarR
, EXd
}, 0 },
3155 { "%XEVmovupX", { XM
, EXEvexXNoBcst
}, 0 },
3156 { "%XEVmovs%XD", { XMScalar
, VexScalarR
, EXq
}, 0 },
3161 { "%XEVmovupX", { EXxS
, XM
}, 0 },
3162 { "%XEVmovs%XS", { EXdS
, VexScalarR
, XMScalar
}, 0 },
3163 { "%XEVmovupX", { EXxS
, XM
}, 0 },
3164 { "%XEVmovs%XD", { EXqS
, VexScalarR
, XMScalar
}, 0 },
3169 { MOD_TABLE (MOD_0F12_PREFIX_0
) },
3170 { "movsldup", { XM
, EXx
}, 0 },
3171 { "%XEVmovlpYX", { XM
, Vex
, Mq
}, 0 },
3172 { "movddup", { XM
, EXq
}, 0 },
3177 { MOD_TABLE (MOD_0F16_PREFIX_0
) },
3178 { "movshdup", { XM
, EXx
}, 0 },
3179 { "%XEVmovhpYX", { XM
, Vex
, Mq
}, 0 },
3182 /* PREFIX_0F18_REG_6_MOD_0_X86_64 */
3184 { "prefetchit1", { { PREFETCHI_Fixup
, b_mode
} }, 0 },
3185 { "nopQ", { Ev
}, 0 },
3186 { "nopQ", { Ev
}, 0 },
3187 { "nopQ", { Ev
}, 0 },
3190 /* PREFIX_0F18_REG_7_MOD_0_X86_64 */
3192 { "prefetchit0", { { PREFETCHI_Fixup
, b_mode
} }, 0 },
3193 { "nopQ", { Ev
}, 0 },
3194 { "nopQ", { Ev
}, 0 },
3195 { "nopQ", { Ev
}, 0 },
3200 { MOD_TABLE (MOD_0F1A_PREFIX_0
) },
3201 { "bndcl", { Gbnd
, Ev_bnd
}, 0 },
3202 { "bndmov", { Gbnd
, Ebnd
}, 0 },
3203 { "bndcu", { Gbnd
, Ev_bnd
}, 0 },
3208 { MOD_TABLE (MOD_0F1B_PREFIX_0
) },
3209 { MOD_TABLE (MOD_0F1B_PREFIX_1
) },
3210 { "bndmov", { EbndS
, Gbnd
}, 0 },
3211 { "bndcn", { Gbnd
, Ev_bnd
}, 0 },
3216 { MOD_TABLE (MOD_0F1C_PREFIX_0
) },
3217 { "nopQ", { Ev
}, PREFIX_IGNORED
},
3218 { "nopQ", { Ev
}, 0 },
3219 { "nopQ", { Ev
}, PREFIX_IGNORED
},
3224 { "nopQ", { Ev
}, 0 },
3225 { MOD_TABLE (MOD_0F1E_PREFIX_1
) },
3226 { "nopQ", { Ev
}, 0 },
3227 { NULL
, { XX
}, PREFIX_IGNORED
},
3232 { "cvtpi2ps", { XM
, EMCq
}, PREFIX_OPCODE
},
3233 { "cvtsi2ss{%LQ|}", { XM
, Edq
}, PREFIX_OPCODE
},
3234 { "cvtpi2pd", { XM
, EMCq
}, PREFIX_OPCODE
},
3235 { "cvtsi2sd{%LQ|}", { XM
, Edq
}, 0 },
3240 { "movntps", { Mx
, XM
}, 0 },
3241 { "movntss", { Md
, XM
}, 0 },
3242 { "movntpd", { Mx
, XM
}, 0 },
3243 { "movntsd", { Mq
, XM
}, 0 },
3248 { "cvttps2pi", { MXC
, EXq
}, PREFIX_OPCODE
},
3249 { "cvttss2si", { Gdq
, EXd
}, PREFIX_OPCODE
},
3250 { "cvttpd2pi", { MXC
, EXx
}, PREFIX_OPCODE
},
3251 { "cvttsd2si", { Gdq
, EXq
}, PREFIX_OPCODE
},
3256 { "cvtps2pi", { MXC
, EXq
}, PREFIX_OPCODE
},
3257 { "cvtss2si", { Gdq
, EXd
}, PREFIX_OPCODE
},
3258 { "cvtpd2pi", { MXC
, EXx
}, PREFIX_OPCODE
},
3259 { "cvtsd2si", { Gdq
, EXq
}, PREFIX_OPCODE
},
3264 { "%XEVucomisYX", { XMScalar
, EXd
, EXxEVexS
}, 0 },
3266 { "%XEVucomisYX", { XMScalar
, EXq
, EXxEVexS
}, 0 },
3271 { "%XEVcomisYX", { XMScalar
, EXd
, EXxEVexS
}, 0 },
3273 { "%XEVcomisYX", { XMScalar
, EXq
, EXxEVexS
}, 0 },
3278 { "%XEVsqrtpX", { XM
, EXx
, EXxEVexR
}, 0 },
3279 { "%XEVsqrts%XS", { XMScalar
, VexScalar
, EXd
, EXxEVexR
}, 0 },
3280 { "%XEVsqrtpX", { XM
, EXx
, EXxEVexR
}, 0 },
3281 { "%XEVsqrts%XD", { XMScalar
, VexScalar
, EXq
, EXxEVexR
}, 0 },
3286 { "Vrsqrtps", { XM
, EXx
}, 0 },
3287 { "Vrsqrtss", { XMScalar
, VexScalar
, EXd
}, 0 },
3292 { "Vrcpps", { XM
, EXx
}, 0 },
3293 { "Vrcpss", { XMScalar
, VexScalar
, EXd
}, 0 },
3298 { "%XEVaddpX", { XM
, Vex
, EXx
, EXxEVexR
}, 0 },
3299 { "%XEVadds%XS", { XMScalar
, VexScalar
, EXd
, EXxEVexR
}, 0 },
3300 { "%XEVaddpX", { XM
, Vex
, EXx
, EXxEVexR
}, 0 },
3301 { "%XEVadds%XD", { XMScalar
, VexScalar
, EXq
, EXxEVexR
}, 0 },
3306 { "%XEVmulpX", { XM
, Vex
, EXx
, EXxEVexR
}, 0 },
3307 { "%XEVmuls%XS", { XMScalar
, VexScalar
, EXd
, EXxEVexR
}, 0 },
3308 { "%XEVmulpX", { XM
, Vex
, EXx
, EXxEVexR
}, 0 },
3309 { "%XEVmuls%XD", { XMScalar
, VexScalar
, EXq
, EXxEVexR
}, 0 },
3314 { "%XEVcvtp%XS2pd", { XM
, EXEvexHalfBcstXmmq
, EXxEVexS
}, 0 },
3315 { "%XEVcvts%XS2sd", { XMScalar
, VexScalar
, EXd
, EXxEVexS
}, 0 },
3316 { "%XEVcvtp%XD2ps%XY", { XMxmmq
, EXx
, EXxEVexR
}, 0 },
3317 { "%XEVcvts%XD2ss", { XMScalar
, VexScalar
, EXq
, EXxEVexR
}, 0 },
3322 { "Vcvtdq2ps", { XM
, EXx
}, 0 },
3323 { "Vcvttps2dq", { XM
, EXx
}, 0 },
3324 { "Vcvtps2dq", { XM
, EXx
}, 0 },
3329 { "%XEVsubpX", { XM
, Vex
, EXx
, EXxEVexR
}, 0 },
3330 { "%XEVsubs%XS", { XMScalar
, VexScalar
, EXd
, EXxEVexR
}, 0 },
3331 { "%XEVsubpX", { XM
, Vex
, EXx
, EXxEVexR
}, 0 },
3332 { "%XEVsubs%XD", { XMScalar
, VexScalar
, EXq
, EXxEVexR
}, 0 },
3337 { "%XEVminpX", { XM
, Vex
, EXx
, EXxEVexS
}, 0 },
3338 { "%XEVmins%XS", { XMScalar
, VexScalar
, EXd
, EXxEVexS
}, 0 },
3339 { "%XEVminpX", { XM
, Vex
, EXx
, EXxEVexS
}, 0 },
3340 { "%XEVmins%XD", { XMScalar
, VexScalar
, EXq
, EXxEVexS
}, 0 },
3345 { "%XEVdivpX", { XM
, Vex
, EXx
, EXxEVexR
}, 0 },
3346 { "%XEVdivs%XS", { XMScalar
, VexScalar
, EXd
, EXxEVexR
}, 0 },
3347 { "%XEVdivpX", { XM
, Vex
, EXx
, EXxEVexR
}, 0 },
3348 { "%XEVdivs%XD", { XMScalar
, VexScalar
, EXq
, EXxEVexR
}, 0 },
3353 { "%XEVmaxpX", { XM
, Vex
, EXx
, EXxEVexS
}, 0 },
3354 { "%XEVmaxs%XS", { XMScalar
, VexScalar
, EXd
, EXxEVexS
}, 0 },
3355 { "%XEVmaxpX", { XM
, Vex
, EXx
, EXxEVexS
}, 0 },
3356 { "%XEVmaxs%XD", { XMScalar
, VexScalar
, EXq
, EXxEVexS
}, 0 },
3361 { "punpcklbw",{ MX
, EMd
}, PREFIX_OPCODE
},
3363 { "punpcklbw",{ MX
, EMx
}, PREFIX_OPCODE
},
3368 { "punpcklwd",{ MX
, EMd
}, PREFIX_OPCODE
},
3370 { "punpcklwd",{ MX
, EMx
}, PREFIX_OPCODE
},
3375 { "punpckldq",{ MX
, EMd
}, PREFIX_OPCODE
},
3377 { "punpckldq",{ MX
, EMx
}, PREFIX_OPCODE
},
3382 { "movq", { MX
, EM
}, PREFIX_OPCODE
},
3383 { "movdqu", { XM
, EXx
}, PREFIX_OPCODE
},
3384 { "movdqa", { XM
, EXx
}, PREFIX_OPCODE
},
3389 { "pshufw", { MX
, EM
, Ib
}, PREFIX_OPCODE
},
3390 { "pshufhw",{ XM
, EXx
, Ib
}, PREFIX_OPCODE
},
3391 { "pshufd", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
3392 { "pshuflw",{ XM
, EXx
, Ib
}, PREFIX_OPCODE
},
3397 {"vmread", { Em
, Gm
}, 0 },
3399 {"extrq", { Uxmm
, Ib
, Ib
}, 0 },
3400 {"insertq", { XM
, Uxmm
, Ib
, Ib
}, 0 },
3405 {"vmwrite", { Gm
, Em
}, 0 },
3407 {"extrq", { XM
, Uxmm
}, 0 },
3408 {"insertq", { XM
, Uxmm
}, 0 },
3415 { "Vhaddpd", { XM
, Vex
, EXx
}, 0 },
3416 { "Vhaddps", { XM
, Vex
, EXx
}, 0 },
3423 { "Vhsubpd", { XM
, Vex
, EXx
}, 0 },
3424 { "Vhsubps", { XM
, Vex
, EXx
}, 0 },
3429 { "movK", { Edq
, MX
}, PREFIX_OPCODE
},
3430 { "movq", { XM
, EXq
}, PREFIX_OPCODE
},
3431 { "movK", { Edq
, XM
}, PREFIX_OPCODE
},
3436 { "movq", { EMS
, MX
}, PREFIX_OPCODE
},
3437 { "movdqu", { EXxS
, XM
}, PREFIX_OPCODE
},
3438 { "movdqa", { EXxS
, XM
}, PREFIX_OPCODE
},
3441 /* PREFIX_0FAE_REG_0_MOD_3 */
3444 { "rdfsbase", { Ev
}, 0 },
3447 /* PREFIX_0FAE_REG_1_MOD_3 */
3450 { "rdgsbase", { Ev
}, 0 },
3453 /* PREFIX_0FAE_REG_2_MOD_3 */
3456 { "wrfsbase", { Ev
}, 0 },
3459 /* PREFIX_0FAE_REG_3_MOD_3 */
3462 { "wrgsbase", { Ev
}, 0 },
3465 /* PREFIX_0FAE_REG_4_MOD_0 */
3467 { "xsave", { FXSAVE
}, PREFIX_REX2_ILLEGAL
},
3468 { "ptwrite{%LQ|}", { Edq
}, 0 },
3471 /* PREFIX_0FAE_REG_4_MOD_3 */
3474 { "ptwrite{%LQ|}", { Edq
}, 0 },
3477 /* PREFIX_0FAE_REG_5_MOD_3 */
3479 { "lfence", { Skip_MODRM
}, 0 },
3480 { "incsspK", { Edq
}, PREFIX_OPCODE
},
3483 /* PREFIX_0FAE_REG_6_MOD_0 */
3485 { "xsaveopt", { FXSAVE
}, PREFIX_OPCODE
| PREFIX_REX2_ILLEGAL
},
3486 { "clrssbsy", { Mq
}, PREFIX_OPCODE
},
3487 { "clwb", { Mb
}, PREFIX_OPCODE
},
3490 /* PREFIX_0FAE_REG_6_MOD_3 */
3492 { RM_TABLE (RM_0FAE_REG_6_MOD_3_P_0
) },
3493 { "umonitor", { Eva
}, PREFIX_OPCODE
},
3494 { "tpause", { Edq
}, PREFIX_OPCODE
},
3495 { "umwait", { Edq
}, PREFIX_OPCODE
},
3498 /* PREFIX_0FAE_REG_7_MOD_0 */
3500 { "clflush", { Mb
}, 0 },
3502 { "clflushopt", { Mb
}, 0 },
3508 { "popcntS", { Gv
, Ev
}, 0 },
3513 { "bsfS", { Gv
, Ev
}, 0 },
3514 { "tzcntS", { Gv
, Ev
}, 0 },
3515 { "bsfS", { Gv
, Ev
}, 0 },
3520 { "bsrS", { Gv
, Ev
}, 0 },
3521 { "lzcntS", { Gv
, Ev
}, 0 },
3522 { "bsrS", { Gv
, Ev
}, 0 },
3527 { "VcmppX", { XM
, Vex
, EXx
, CMP
}, 0 },
3528 { "Vcmpss", { XMScalar
, VexScalar
, EXd
, CMP
}, 0 },
3529 { "VcmppX", { XM
, Vex
, EXx
, CMP
}, 0 },
3530 { "Vcmpsd", { XMScalar
, VexScalar
, EXq
, CMP
}, 0 },
3533 /* PREFIX_0FC7_REG_6_MOD_0 */
3535 { "vmptrld",{ Mq
}, 0 },
3536 { "vmxon", { Mq
}, 0 },
3537 { "vmclear",{ Mq
}, 0 },
3540 /* PREFIX_0FC7_REG_6_MOD_3 */
3542 { "rdrand", { Ev
}, 0 },
3543 { X86_64_TABLE (X86_64_0FC7_REG_6_MOD_3_PREFIX_1
) },
3544 { "rdrand", { Ev
}, 0 }
3547 /* PREFIX_0FC7_REG_7_MOD_3 */
3549 { "rdseed", { Ev
}, 0 },
3550 { "rdpid", { Em
}, 0 },
3551 { "rdseed", { Ev
}, 0 },
3558 { "VaddsubpX", { XM
, Vex
, EXx
}, 0 },
3559 { "VaddsubpX", { XM
, Vex
, EXx
}, 0 },
3565 { "movq2dq",{ XM
, Nq
}, 0 },
3566 { "movq", { EXqS
, XM
}, 0 },
3567 { "movdq2q",{ MX
, Ux
}, 0 },
3573 { "Vcvtdq2pd", { XM
, EXxmmq
}, 0 },
3574 { "Vcvttpd2dq%XY", { XMM
, EXx
}, 0 },
3575 { "Vcvtpd2dq%XY", { XMM
, EXx
}, 0 },
3580 { "movntq", { Mq
, MX
}, 0 },
3582 { "movntdq", { Mx
, XM
}, 0 },
3590 { "Vlddqu", { XM
, M
}, 0 },
3595 { "maskmovq", { MX
, Nq
}, PREFIX_OPCODE
},
3597 { "maskmovdqu", { XM
, Ux
}, PREFIX_OPCODE
},
3603 { REG_TABLE (REG_0F38D8_PREFIX_1
) },
3609 { MOD_TABLE (MOD_0F38DC_PREFIX_1
) },
3610 { "aesenc", { XM
, EXx
}, 0 },
3616 { "aesdec128kl", { XM
, M
}, 0 },
3617 { "aesenclast", { XM
, EXx
}, 0 },
3623 { "aesenc256kl", { XM
, M
}, 0 },
3624 { "aesdec", { XM
, EXx
}, 0 },
3630 { "aesdec256kl", { XM
, M
}, 0 },
3631 { "aesdeclast", { XM
, EXx
}, 0 },
3636 { "movbeS", { Gv
, Mv
}, PREFIX_OPCODE
},
3638 { "movbeS", { Gv
, Mv
}, PREFIX_OPCODE
},
3639 { "crc32A", { Gdq
, Eb
}, PREFIX_OPCODE
},
3644 { "movbeS", { Mv
, Gv
}, PREFIX_OPCODE
},
3646 { "movbeS", { Mv
, Gv
}, PREFIX_OPCODE
},
3647 { "crc32Q", { Gdq
, Ev
}, PREFIX_OPCODE
},
3652 { "wrssK", { M
, Gdq
}, 0 },
3653 { "adoxL", { VexGdq
, Gdq
, Edq
}, 0 },
3654 { "adcxL", { VexGdq
, Gdq
, Edq
}, 0 },
3658 /* PREFIX_0F38F8_M_0 */
3661 { "enqcmds", { Gva
, M
}, 0 },
3662 { "movdir64b", { Gva
, M
}, 0 },
3663 { "enqcmd", { Gva
, M
}, 0 },
3666 /* PREFIX_0F38F8_M_1_X86_64 */
3669 { "uwrmsr", { Gq
, Rq
}, 0 },
3671 { "urdmsr", { Rq
, Gq
}, 0 },
3677 { "encodekey128", { Gd
, Rd
}, 0 },
3683 { "encodekey256", { Gd
, Rd
}, 0 },
3688 { "aadd", { Mdq
, Gdq
}, 0 },
3689 { "axor", { Mdq
, Gdq
}, 0 },
3690 { "aand", { Mdq
, Gdq
}, 0 },
3691 { "aor", { Mdq
, Gdq
}, 0 },
3697 { REG_TABLE (REG_0F3A0F_P_1
) },
3700 /* PREFIX_VEX_0F12 */
3702 { VEX_LEN_TABLE (VEX_LEN_0F12_P_0
) },
3703 { "%XEvmov%XSldup", { XM
, EXEvexXNoBcst
}, 0 },
3704 { VEX_LEN_TABLE (VEX_LEN_0F12_P_2
) },
3705 { "%XEvmov%XDdup", { XM
, EXymmq
}, 0 },
3708 /* PREFIX_VEX_0F16 */
3710 { VEX_LEN_TABLE (VEX_LEN_0F16_P_0
) },
3711 { "%XEvmov%XShdup", { XM
, EXEvexXNoBcst
}, 0 },
3712 { VEX_LEN_TABLE (VEX_LEN_0F16_P_2
) },
3715 /* PREFIX_VEX_0F2A */
3718 { "%XEvcvtsi2ssY{%LQ|}", { XMScalar
, VexScalar
, EXxEVexR
, Edq
}, 0 },
3720 { "%XEvcvtsi2sdY{%LQ|}", { XMScalar
, VexScalar
, EXxEVexR64
, Edq
}, 0 },
3723 /* PREFIX_VEX_0F2C */
3726 { "%XEvcvttss2si", { Gdq
, EXd
, EXxEVexS
}, 0 },
3728 { "%XEvcvttsd2si", { Gdq
, EXq
, EXxEVexS
}, 0 },
3731 /* PREFIX_VEX_0F2D */
3734 { "%XEvcvtss2si", { Gdq
, EXd
, EXxEVexR
}, 0 },
3736 { "%XEvcvtsd2si", { Gdq
, EXq
, EXxEVexR
}, 0 },
3739 /* PREFIX_VEX_0F41_L_1_W_0 */
3741 { "kandw", { MaskG
, MaskVex
, MaskR
}, 0 },
3743 { "kandb", { MaskG
, MaskVex
, MaskR
}, 0 },
3746 /* PREFIX_VEX_0F41_L_1_W_1 */
3748 { "kandq", { MaskG
, MaskVex
, MaskR
}, 0 },
3750 { "kandd", { MaskG
, MaskVex
, MaskR
}, 0 },
3753 /* PREFIX_VEX_0F42_L_1_W_0 */
3755 { "kandnw", { MaskG
, MaskVex
, MaskR
}, 0 },
3757 { "kandnb", { MaskG
, MaskVex
, MaskR
}, 0 },
3760 /* PREFIX_VEX_0F42_L_1_W_1 */
3762 { "kandnq", { MaskG
, MaskVex
, MaskR
}, 0 },
3764 { "kandnd", { MaskG
, MaskVex
, MaskR
}, 0 },
3767 /* PREFIX_VEX_0F44_L_0_W_0 */
3769 { "knotw", { MaskG
, MaskR
}, 0 },
3771 { "knotb", { MaskG
, MaskR
}, 0 },
3774 /* PREFIX_VEX_0F44_L_0_W_1 */
3776 { "knotq", { MaskG
, MaskR
}, 0 },
3778 { "knotd", { MaskG
, MaskR
}, 0 },
3781 /* PREFIX_VEX_0F45_L_1_W_0 */
3783 { "korw", { MaskG
, MaskVex
, MaskR
}, 0 },
3785 { "korb", { MaskG
, MaskVex
, MaskR
}, 0 },
3788 /* PREFIX_VEX_0F45_L_1_W_1 */
3790 { "korq", { MaskG
, MaskVex
, MaskR
}, 0 },
3792 { "kord", { MaskG
, MaskVex
, MaskR
}, 0 },
3795 /* PREFIX_VEX_0F46_L_1_W_0 */
3797 { "kxnorw", { MaskG
, MaskVex
, MaskR
}, 0 },
3799 { "kxnorb", { MaskG
, MaskVex
, MaskR
}, 0 },
3802 /* PREFIX_VEX_0F46_L_1_W_1 */
3804 { "kxnorq", { MaskG
, MaskVex
, MaskR
}, 0 },
3806 { "kxnord", { MaskG
, MaskVex
, MaskR
}, 0 },
3809 /* PREFIX_VEX_0F47_L_1_W_0 */
3811 { "kxorw", { MaskG
, MaskVex
, MaskR
}, 0 },
3813 { "kxorb", { MaskG
, MaskVex
, MaskR
}, 0 },
3816 /* PREFIX_VEX_0F47_L_1_W_1 */
3818 { "kxorq", { MaskG
, MaskVex
, MaskR
}, 0 },
3820 { "kxord", { MaskG
, MaskVex
, MaskR
}, 0 },
3823 /* PREFIX_VEX_0F4A_L_1_W_0 */
3825 { "kaddw", { MaskG
, MaskVex
, MaskR
}, 0 },
3827 { "kaddb", { MaskG
, MaskVex
, MaskR
}, 0 },
3830 /* PREFIX_VEX_0F4A_L_1_W_1 */
3832 { "kaddq", { MaskG
, MaskVex
, MaskR
}, 0 },
3834 { "kaddd", { MaskG
, MaskVex
, MaskR
}, 0 },
3837 /* PREFIX_VEX_0F4B_L_1_W_0 */
3839 { "kunpckwd", { MaskG
, MaskVex
, MaskR
}, 0 },
3841 { "kunpckbw", { MaskG
, MaskVex
, MaskR
}, 0 },
3844 /* PREFIX_VEX_0F4B_L_1_W_1 */
3846 { "kunpckdq", { MaskG
, MaskVex
, MaskR
}, 0 },
3849 /* PREFIX_VEX_0F6F */
3852 { "vmovdqu", { XM
, EXx
}, 0 },
3853 { "vmovdqa", { XM
, EXx
}, 0 },
3856 /* PREFIX_VEX_0F70 */
3859 { "vpshufhw", { XM
, EXx
, Ib
}, 0 },
3860 { "vpshufd", { XM
, EXx
, Ib
}, 0 },
3861 { "vpshuflw", { XM
, EXx
, Ib
}, 0 },
3864 /* PREFIX_VEX_0F7E */
3867 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_1
) },
3868 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_2
) },
3871 /* PREFIX_VEX_0F7F */
3874 { "vmovdqu", { EXxS
, XM
}, 0 },
3875 { "vmovdqa", { EXxS
, XM
}, 0 },
3878 /* PREFIX_VEX_0F90_L_0_W_0 */
3880 { "%XEkmovw", { MaskG
, MaskE
}, 0 },
3882 { "%XEkmovb", { MaskG
, MaskBDE
}, 0 },
3885 /* PREFIX_VEX_0F90_L_0_W_1 */
3887 { "%XEkmovq", { MaskG
, MaskE
}, 0 },
3889 { "%XEkmovd", { MaskG
, MaskBDE
}, 0 },
3892 /* PREFIX_VEX_0F91_L_0_W_0 */
3894 { "%XEkmovw", { Mw
, MaskG
}, 0 },
3896 { "%XEkmovb", { Mb
, MaskG
}, 0 },
3899 /* PREFIX_VEX_0F91_L_0_W_1 */
3901 { "%XEkmovq", { Mq
, MaskG
}, 0 },
3903 { "%XEkmovd", { Md
, MaskG
}, 0 },
3906 /* PREFIX_VEX_0F92_L_0_W_0 */
3908 { "%XEkmovw", { MaskG
, Rdq
}, 0 },
3910 { "%XEkmovb", { MaskG
, Rdq
}, 0 },
3911 { "%XEkmovd", { MaskG
, Rdq
}, 0 },
3914 /* PREFIX_VEX_0F92_L_0_W_1 */
3919 { "%XEkmovK", { MaskG
, Rdq
}, 0 },
3922 /* PREFIX_VEX_0F93_L_0_W_0 */
3924 { "%XEkmovw", { Gdq
, MaskR
}, 0 },
3926 { "%XEkmovb", { Gdq
, MaskR
}, 0 },
3927 { "%XEkmovd", { Gdq
, MaskR
}, 0 },
3930 /* PREFIX_VEX_0F93_L_0_W_1 */
3935 { "%XEkmovK", { Gdq
, MaskR
}, 0 },
3938 /* PREFIX_VEX_0F98_L_0_W_0 */
3940 { "kortestw", { MaskG
, MaskR
}, 0 },
3942 { "kortestb", { MaskG
, MaskR
}, 0 },
3945 /* PREFIX_VEX_0F98_L_0_W_1 */
3947 { "kortestq", { MaskG
, MaskR
}, 0 },
3949 { "kortestd", { MaskG
, MaskR
}, 0 },
3952 /* PREFIX_VEX_0F99_L_0_W_0 */
3954 { "ktestw", { MaskG
, MaskR
}, 0 },
3956 { "ktestb", { MaskG
, MaskR
}, 0 },
3959 /* PREFIX_VEX_0F99_L_0_W_1 */
3961 { "ktestq", { MaskG
, MaskR
}, 0 },
3963 { "ktestd", { MaskG
, MaskR
}, 0 },
3966 /* PREFIX_VEX_0F3849_X86_64_L_0_W_0_M_0 */
3968 { "ldtilecfg", { M
}, 0 },
3970 { "sttilecfg", { M
}, 0 },
3973 /* PREFIX_VEX_0F3849_X86_64_L_0_W_0_M_1 */
3975 { REG_TABLE (REG_VEX_0F3849_X86_64_L_0_W_0_M_1_P_0
) },
3978 { RM_TABLE (RM_VEX_0F3849_X86_64_L_0_W_0_M_1_P_3
) },
3981 /* PREFIX_VEX_0F384B_X86_64_L_0_W_0 */
3984 { "tilestored", { MVexSIBMEM
, TMM
}, 0 },
3985 { "tileloaddt1", { TMM
, MVexSIBMEM
}, 0 },
3986 { "tileloadd", { TMM
, MVexSIBMEM
}, 0 },
3989 /* PREFIX_VEX_0F3850_W_0 */
3991 { "vpdpbuud", { XM
, Vex
, EXx
}, 0 },
3992 { "vpdpbsud", { XM
, Vex
, EXx
}, 0 },
3993 { "%XVvpdpbusd", { XM
, Vex
, EXx
}, 0 },
3994 { "vpdpbssd", { XM
, Vex
, EXx
}, 0 },
3997 /* PREFIX_VEX_0F3851_W_0 */
3999 { "vpdpbuuds", { XM
, Vex
, EXx
}, 0 },
4000 { "vpdpbsuds", { XM
, Vex
, EXx
}, 0 },
4001 { "%XVvpdpbusds", { XM
, Vex
, EXx
}, 0 },
4002 { "vpdpbssds", { XM
, Vex
, EXx
}, 0 },
4004 /* PREFIX_VEX_0F385C_X86_64_L_0_W_0 */
4007 { "tdpbf16ps", { TMM
, Rtmm
, VexTmm
}, 0 },
4009 { "tdpfp16ps", { TMM
, Rtmm
, VexTmm
}, 0 },
4012 /* PREFIX_VEX_0F385E_X86_64_L_0_W_0 */
4014 { "tdpbuud", {TMM
, Rtmm
, VexTmm
}, 0 },
4015 { "tdpbsud", {TMM
, Rtmm
, VexTmm
}, 0 },
4016 { "tdpbusd", {TMM
, Rtmm
, VexTmm
}, 0 },
4017 { "tdpbssd", {TMM
, Rtmm
, VexTmm
}, 0 },
4020 /* PREFIX_VEX_0F386C_X86_64_L_0_W_0 */
4022 { "tcmmrlfp16ps", { TMM
, Rtmm
, VexTmm
}, 0 },
4024 { "tcmmimfp16ps", { TMM
, Rtmm
, VexTmm
}, 0 },
4027 /* PREFIX_VEX_0F3872 */
4030 { VEX_W_TABLE (VEX_W_0F3872_P_1
) },
4033 /* PREFIX_VEX_0F38B0_W_0 */
4035 { "vcvtneoph2ps", { XM
, Mx
}, 0 },
4036 { "vcvtneebf162ps", { XM
, Mx
}, 0 },
4037 { "vcvtneeph2ps", { XM
, Mx
}, 0 },
4038 { "vcvtneobf162ps", { XM
, Mx
}, 0 },
4041 /* PREFIX_VEX_0F38B1_W_0 */
4044 { "vbcstnebf162ps", { XM
, Mw
}, 0 },
4045 { "vbcstnesh2ps", { XM
, Mw
}, 0 },
4048 /* PREFIX_VEX_0F38D2_W_0 */
4050 { "vpdpwuud", { XM
, Vex
, EXx
}, 0 },
4051 { "vpdpwsud", { XM
, Vex
, EXx
}, 0 },
4052 { "vpdpwusd", { XM
, Vex
, EXx
}, 0 },
4055 /* PREFIX_VEX_0F38D3_W_0 */
4057 { "vpdpwuuds", { XM
, Vex
, EXx
}, 0 },
4058 { "vpdpwsuds", { XM
, Vex
, EXx
}, 0 },
4059 { "vpdpwusds", { XM
, Vex
, EXx
}, 0 },
4062 /* PREFIX_VEX_0F38CB */
4067 { VEX_W_TABLE (VEX_W_0F38CB_P_3
) },
4070 /* PREFIX_VEX_0F38CC */
4075 { VEX_W_TABLE (VEX_W_0F38CC_P_3
) },
4078 /* PREFIX_VEX_0F38CD */
4083 { VEX_W_TABLE (VEX_W_0F38CD_P_3
) },
4086 /* PREFIX_VEX_0F38DA_W_0 */
4088 { VEX_LEN_TABLE (VEX_LEN_0F38DA_W_0_P_0
) },
4089 { "vsm4key4", { XM
, Vex
, EXx
}, 0 },
4090 { VEX_LEN_TABLE (VEX_LEN_0F38DA_W_0_P_2
) },
4091 { "vsm4rnds4", { XM
, Vex
, EXx
}, 0 },
4094 /* PREFIX_VEX_0F38F2_L_0 */
4096 { "%NFandnS", { Gdq
, VexGdq
, Edq
}, 0 },
4099 /* PREFIX_VEX_0F38F3_L_0 */
4101 { REG_TABLE (REG_VEX_0F38F3_L_0_P_0
) },
4104 /* PREFIX_VEX_0F38F5_L_0 */
4106 { "%NFbzhiS", { Gdq
, Edq
, VexGdq
}, 0 },
4107 { "%XEpextS", { Gdq
, VexGdq
, Edq
}, 0 },
4109 { "%XEpdepS", { Gdq
, VexGdq
, Edq
}, 0 },
4112 /* PREFIX_VEX_0F38F6_L_0 */
4117 { "%XEmulxS", { Gdq
, VexGdq
, Edq
}, 0 },
4120 /* PREFIX_VEX_0F38F7_L_0 */
4122 { "%NFbextrS", { Gdq
, Edq
, VexGdq
}, 0 },
4123 { "%XEsarxS", { Gdq
, Edq
, VexGdq
}, 0 },
4124 { "%XEshlxS", { Gdq
, Edq
, VexGdq
}, 0 },
4125 { "%XEshrxS", { Gdq
, Edq
, VexGdq
}, 0 },
4128 /* PREFIX_VEX_0F3AF0_L_0 */
4133 { "%XErorxS", { Gdq
, Edq
, Ib
}, 0 },
4136 /* PREFIX_VEX_MAP7_F8_L_0_W_0_R_0_X86_64 */
4139 { "uwrmsr", { Skip_MODRM
, Id
, Rq
}, 0 },
4141 { "urdmsr", { Rq
, Id
}, 0 },
4144 #include "i386-dis-evex-prefix.h"
4147 static const struct dis386 x86_64_table
[][2] = {
4150 { "pushP", { es
}, 0 },
4155 { "popP", { es
}, 0 },
4160 { "pushP", { cs
}, 0 },
4165 { "pushP", { ss
}, 0 },
4170 { "popP", { ss
}, 0 },
4175 { "pushP", { ds
}, 0 },
4180 { "popP", { ds
}, 0 },
4185 { "daa", { XX
}, 0 },
4190 { "das", { XX
}, 0 },
4195 { "aaa", { XX
}, 0 },
4200 { "aas", { XX
}, 0 },
4205 { "pushaP", { XX
}, 0 },
4210 { "popaP", { XX
}, 0 },
4215 { MOD_TABLE (MOD_62_32BIT
) },
4221 { "arplS", { Sv
, Gv
}, 0 },
4222 { "movs", { Gv
, { MOVSXD_Fixup
, movsxd_mode
} }, 0 },
4227 { "ins{R|}", { Yzr
, indirDX
}, 0 },
4228 { "ins{G|}", { Yzr
, indirDX
}, 0 },
4233 { "outs{R|}", { indirDXr
, Xz
}, 0 },
4234 { "outs{G|}", { indirDXr
, Xz
}, 0 },
4239 /* Opcode 0x82 is an alias of opcode 0x80 in 32-bit mode. */
4240 { REG_TABLE (REG_80
) },
4245 { "{l|}call{P|}", { Ap
}, 0 },
4250 { "retP", { Iw
, BND
}, 0 },
4251 { "ret@", { Iw
, BND
}, 0 },
4256 { "retP", { BND
}, 0 },
4257 { "ret@", { BND
}, 0 },
4262 { MOD_TABLE (MOD_C4_32BIT
) },
4263 { VEX_C4_TABLE () },
4268 { MOD_TABLE (MOD_C5_32BIT
) },
4269 { VEX_C5_TABLE () },
4274 { "into", { XX
}, 0 },
4279 { "aam", { Ib
}, 0 },
4284 { "aad", { Ib
}, 0 },
4289 { "callP", { Jv
, BND
}, 0 },
4290 { "call@", { Jv
, BND
}, PREFIX_REX2_ILLEGAL
}
4295 { "jmpP", { Jv
, BND
}, 0 },
4296 { "jmp@", { Jv
, BND
}, PREFIX_REX2_ILLEGAL
}
4301 { "{l|}jmp{P|}", { Ap
}, 0 },
4304 /* X86_64_0F00_REG_6 */
4307 { PREFIX_TABLE (PREFIX_0F00_REG_6_X86_64
) },
4310 /* X86_64_0F01_REG_0 */
4312 { "sgdt{Q|Q}", { M
}, 0 },
4313 { "sgdt", { M
}, 0 },
4316 /* X86_64_0F01_REG_0_MOD_3_RM_6_P_1 */
4319 { "wrmsrlist", { Skip_MODRM
}, 0 },
4322 /* X86_64_0F01_REG_0_MOD_3_RM_6_P_3 */
4325 { "rdmsrlist", { Skip_MODRM
}, 0 },
4328 /* X86_64_0F01_REG_0_MOD_3_RM_7_P_0 */
4331 { "pbndkb", { Skip_MODRM
}, 0 },
4334 /* X86_64_0F01_REG_1 */
4336 { "sidt{Q|Q}", { M
}, 0 },
4337 { "sidt", { M
}, 0 },
4340 /* X86_64_0F01_REG_1_RM_2_PREFIX_1 */
4343 { "eretu", { Skip_MODRM
}, 0 },
4346 /* X86_64_0F01_REG_1_RM_2_PREFIX_3 */
4349 { "erets", { Skip_MODRM
}, 0 },
4352 /* X86_64_0F01_REG_1_RM_5_PREFIX_2 */
4355 { "seamret", { Skip_MODRM
}, 0 },
4358 /* X86_64_0F01_REG_1_RM_6_PREFIX_2 */
4361 { "seamops", { Skip_MODRM
}, 0 },
4364 /* X86_64_0F01_REG_1_RM_7_PREFIX_2 */
4367 { "seamcall", { Skip_MODRM
}, 0 },
4370 /* X86_64_0F01_REG_2 */
4372 { "lgdt{Q|Q}", { M
}, 0 },
4373 { "lgdt", { M
}, 0 },
4376 /* X86_64_0F01_REG_3 */
4378 { "lidt{Q|Q}", { M
}, 0 },
4379 { "lidt", { M
}, 0 },
4382 /* X86_64_0F01_REG_5_MOD_3_RM_4_PREFIX_1 */
4385 { "uiret", { Skip_MODRM
}, 0 },
4388 /* X86_64_0F01_REG_5_MOD_3_RM_5_PREFIX_1 */
4391 { "testui", { Skip_MODRM
}, 0 },
4394 /* X86_64_0F01_REG_5_MOD_3_RM_6_PREFIX_1 */
4397 { "clui", { Skip_MODRM
}, 0 },
4400 /* X86_64_0F01_REG_5_MOD_3_RM_7_PREFIX_1 */
4403 { "stui", { Skip_MODRM
}, 0 },
4406 /* X86_64_0F01_REG_7_MOD_3_RM_5_PREFIX_1 */
4409 { "rmpquery", { Skip_MODRM
}, 0 },
4412 /* X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_1 */
4415 { "rmpadjust", { Skip_MODRM
}, 0 },
4418 /* X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3 */
4421 { "rmpupdate", { Skip_MODRM
}, 0 },
4424 /* X86_64_0F01_REG_7_MOD_3_RM_7_PREFIX_1 */
4427 { "psmash", { Skip_MODRM
}, 0 },
4430 /* X86_64_0F18_REG_6_MOD_0 */
4432 { "nopQ", { Ev
}, 0 },
4433 { PREFIX_TABLE (PREFIX_0F18_REG_6_MOD_0_X86_64
) },
4436 /* X86_64_0F18_REG_7_MOD_0 */
4438 { "nopQ", { Ev
}, 0 },
4439 { PREFIX_TABLE (PREFIX_0F18_REG_7_MOD_0_X86_64
) },
4444 { "movZ", { Em
, Td
}, 0 },
4449 { "movZ", { Td
, Em
}, 0 },
4453 /* X86_64_0F38F8_M_1 */
4455 { PREFIX_TABLE (PREFIX_0F38F8_M_1_X86_64
) },
4458 /* X86_64_0FC7_REG_6_MOD_3_PREFIX_1 */
4461 { "senduipi", { Eq
}, 0 },
4464 /* X86_64_VEX_0F3849 */
4467 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64
) },
4470 /* X86_64_VEX_0F384B */
4473 { VEX_LEN_TABLE (VEX_LEN_0F384B_X86_64
) },
4476 /* X86_64_VEX_0F385C */
4479 { VEX_LEN_TABLE (VEX_LEN_0F385C_X86_64
) },
4482 /* X86_64_VEX_0F385E */
4485 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64
) },
4488 /* X86_64_VEX_0F386C */
4491 { VEX_LEN_TABLE (VEX_LEN_0F386C_X86_64
) },
4494 /* X86_64_VEX_0F38Ex */
4497 { "%XEcmp%CCxadd", { Mdq
, Gdq
, VexGdq
}, PREFIX_DATA
},
4500 /* X86_64_VEX_MAP7_F8_L_0_W_0_R_0 */
4503 { PREFIX_TABLE (PREFIX_VEX_MAP7_F8_L_0_W_0_R_0_X86_64
) },
4507 static const struct dis386 three_byte_table
[][256] = {
4509 /* THREE_BYTE_0F38 */
4512 { "pshufb", { MX
, EM
}, PREFIX_OPCODE
},
4513 { "phaddw", { MX
, EM
}, PREFIX_OPCODE
},
4514 { "phaddd", { MX
, EM
}, PREFIX_OPCODE
},
4515 { "phaddsw", { MX
, EM
}, PREFIX_OPCODE
},
4516 { "pmaddubsw", { MX
, EM
}, PREFIX_OPCODE
},
4517 { "phsubw", { MX
, EM
}, PREFIX_OPCODE
},
4518 { "phsubd", { MX
, EM
}, PREFIX_OPCODE
},
4519 { "phsubsw", { MX
, EM
}, PREFIX_OPCODE
},
4521 { "psignb", { MX
, EM
}, PREFIX_OPCODE
},
4522 { "psignw", { MX
, EM
}, PREFIX_OPCODE
},
4523 { "psignd", { MX
, EM
}, PREFIX_OPCODE
},
4524 { "pmulhrsw", { MX
, EM
}, PREFIX_OPCODE
},
4530 { "pblendvb", { XM
, EXx
, XMM0
}, PREFIX_DATA
},
4534 { "blendvps", { XM
, EXx
, XMM0
}, PREFIX_DATA
},
4535 { "blendvpd", { XM
, EXx
, XMM0
}, PREFIX_DATA
},
4537 { "ptest", { XM
, EXx
}, PREFIX_DATA
},
4543 { "pabsb", { MX
, EM
}, PREFIX_OPCODE
},
4544 { "pabsw", { MX
, EM
}, PREFIX_OPCODE
},
4545 { "pabsd", { MX
, EM
}, PREFIX_OPCODE
},
4548 { "pmovsxbw", { XM
, EXq
}, PREFIX_DATA
},
4549 { "pmovsxbd", { XM
, EXd
}, PREFIX_DATA
},
4550 { "pmovsxbq", { XM
, EXw
}, PREFIX_DATA
},
4551 { "pmovsxwd", { XM
, EXq
}, PREFIX_DATA
},
4552 { "pmovsxwq", { XM
, EXd
}, PREFIX_DATA
},
4553 { "pmovsxdq", { XM
, EXq
}, PREFIX_DATA
},
4557 { "pmuldq", { XM
, EXx
}, PREFIX_DATA
},
4558 { "pcmpeqq", { XM
, EXx
}, PREFIX_DATA
},
4559 { "movntdqa", { XM
, Mx
}, PREFIX_DATA
},
4560 { "packusdw", { XM
, EXx
}, PREFIX_DATA
},
4566 { "pmovzxbw", { XM
, EXq
}, PREFIX_DATA
},
4567 { "pmovzxbd", { XM
, EXd
}, PREFIX_DATA
},
4568 { "pmovzxbq", { XM
, EXw
}, PREFIX_DATA
},
4569 { "pmovzxwd", { XM
, EXq
}, PREFIX_DATA
},
4570 { "pmovzxwq", { XM
, EXd
}, PREFIX_DATA
},
4571 { "pmovzxdq", { XM
, EXq
}, PREFIX_DATA
},
4573 { "pcmpgtq", { XM
, EXx
}, PREFIX_DATA
},
4575 { "pminsb", { XM
, EXx
}, PREFIX_DATA
},
4576 { "pminsd", { XM
, EXx
}, PREFIX_DATA
},
4577 { "pminuw", { XM
, EXx
}, PREFIX_DATA
},
4578 { "pminud", { XM
, EXx
}, PREFIX_DATA
},
4579 { "pmaxsb", { XM
, EXx
}, PREFIX_DATA
},
4580 { "pmaxsd", { XM
, EXx
}, PREFIX_DATA
},
4581 { "pmaxuw", { XM
, EXx
}, PREFIX_DATA
},
4582 { "pmaxud", { XM
, EXx
}, PREFIX_DATA
},
4584 { "pmulld", { XM
, EXx
}, PREFIX_DATA
},
4585 { "phminposuw", { XM
, EXx
}, PREFIX_DATA
},
4656 { "invept", { Gm
, Mo
}, PREFIX_DATA
},
4657 { "invvpid", { Gm
, Mo
}, PREFIX_DATA
},
4658 { "invpcid", { Gm
, M
}, PREFIX_DATA
},
4737 { "sha1nexte", { XM
, EXxmm
}, PREFIX_OPCODE
},
4738 { "sha1msg1", { XM
, EXxmm
}, PREFIX_OPCODE
},
4739 { "sha1msg2", { XM
, EXxmm
}, PREFIX_OPCODE
},
4740 { "sha256rnds2", { XM
, EXxmm
, XMM0
}, PREFIX_OPCODE
},
4741 { "sha256msg1", { XM
, EXxmm
}, PREFIX_OPCODE
},
4742 { "sha256msg2", { XM
, EXxmm
}, PREFIX_OPCODE
},
4744 { "gf2p8mulb", { XM
, EXxmm
}, PREFIX_DATA
},
4755 { PREFIX_TABLE (PREFIX_0F38D8
) },
4758 { "aesimc", { XM
, EXx
}, PREFIX_DATA
},
4759 { PREFIX_TABLE (PREFIX_0F38DC
) },
4760 { PREFIX_TABLE (PREFIX_0F38DD
) },
4761 { PREFIX_TABLE (PREFIX_0F38DE
) },
4762 { PREFIX_TABLE (PREFIX_0F38DF
) },
4782 { PREFIX_TABLE (PREFIX_0F38F0
) },
4783 { PREFIX_TABLE (PREFIX_0F38F1
) },
4787 { "wrussK", { M
, Gdq
}, PREFIX_DATA
},
4788 { PREFIX_TABLE (PREFIX_0F38F6
) },
4791 { MOD_TABLE (MOD_0F38F8
) },
4792 { "movdiri", { Mdq
, Gdq
}, PREFIX_OPCODE
},
4793 { PREFIX_TABLE (PREFIX_0F38FA
) },
4794 { PREFIX_TABLE (PREFIX_0F38FB
) },
4795 { PREFIX_TABLE (PREFIX_0F38FC
) },
4800 /* THREE_BYTE_0F3A */
4812 { "roundps", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4813 { "roundpd", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4814 { "roundss", { XM
, EXd
, Ib
}, PREFIX_DATA
},
4815 { "roundsd", { XM
, EXq
, Ib
}, PREFIX_DATA
},
4816 { "blendps", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4817 { "blendpd", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4818 { "pblendw", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4819 { "palignr", { MX
, EM
, Ib
}, PREFIX_OPCODE
},
4825 { "pextrb", { Edb
, XM
, Ib
}, PREFIX_DATA
},
4826 { "pextrw", { Edw
, XM
, Ib
}, PREFIX_DATA
},
4827 { "pextrK", { Edq
, XM
, Ib
}, PREFIX_DATA
},
4828 { "extractps", { Ed
, XM
, Ib
}, PREFIX_DATA
},
4839 { "pinsrb", { XM
, Edb
, Ib
}, PREFIX_DATA
},
4840 { "insertps", { XM
, EXd
, Ib
}, PREFIX_DATA
},
4841 { "pinsrK", { XM
, Edq
, Ib
}, PREFIX_DATA
},
4875 { "dpps", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4876 { "dppd", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4877 { "mpsadbw", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4879 { "pclmulqdq", { XM
, EXx
, PCLMUL
}, PREFIX_DATA
},
4911 { "pcmpestrm!%LQ", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4912 { "pcmpestri!%LQ", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4913 { "pcmpistrm", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4914 { "pcmpistri", { XM
, EXx
, Ib
}, PREFIX_DATA
},
5032 { "sha1rnds4", { XM
, EXxmm
, Ib
}, PREFIX_OPCODE
},
5034 { "gf2p8affineqb", { XM
, EXxmm
, Ib
}, PREFIX_DATA
},
5035 { "gf2p8affineinvqb", { XM
, EXxmm
, Ib
}, PREFIX_DATA
},
5053 { "aeskeygenassist", { XM
, EXx
, Ib
}, PREFIX_DATA
},
5073 { PREFIX_TABLE (PREFIX_0F3A0F
) },
5093 static const struct dis386 xop_table
[][256] = {
5246 { VEX_LEN_TABLE (VEX_LEN_XOP_08_85
) },
5247 { VEX_LEN_TABLE (VEX_LEN_XOP_08_86
) },
5248 { VEX_LEN_TABLE (VEX_LEN_XOP_08_87
) },
5256 { VEX_LEN_TABLE (VEX_LEN_XOP_08_8E
) },
5257 { VEX_LEN_TABLE (VEX_LEN_XOP_08_8F
) },
5264 { VEX_LEN_TABLE (VEX_LEN_XOP_08_95
) },
5265 { VEX_LEN_TABLE (VEX_LEN_XOP_08_96
) },
5266 { VEX_LEN_TABLE (VEX_LEN_XOP_08_97
) },
5274 { VEX_LEN_TABLE (VEX_LEN_XOP_08_9E
) },
5275 { VEX_LEN_TABLE (VEX_LEN_XOP_08_9F
) },
5279 { "vpcmov", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
5280 { VEX_LEN_TABLE (VEX_LEN_XOP_08_A3
) },
5283 { VEX_LEN_TABLE (VEX_LEN_XOP_08_A6
) },
5301 { VEX_LEN_TABLE (VEX_LEN_XOP_08_B6
) },
5313 { VEX_LEN_TABLE (VEX_LEN_XOP_08_C0
) },
5314 { VEX_LEN_TABLE (VEX_LEN_XOP_08_C1
) },
5315 { VEX_LEN_TABLE (VEX_LEN_XOP_08_C2
) },
5316 { VEX_LEN_TABLE (VEX_LEN_XOP_08_C3
) },
5326 { VEX_LEN_TABLE (VEX_LEN_XOP_08_CC
) },
5327 { VEX_LEN_TABLE (VEX_LEN_XOP_08_CD
) },
5328 { VEX_LEN_TABLE (VEX_LEN_XOP_08_CE
) },
5329 { VEX_LEN_TABLE (VEX_LEN_XOP_08_CF
) },
5362 { VEX_LEN_TABLE (VEX_LEN_XOP_08_EC
) },
5363 { VEX_LEN_TABLE (VEX_LEN_XOP_08_ED
) },
5364 { VEX_LEN_TABLE (VEX_LEN_XOP_08_EE
) },
5365 { VEX_LEN_TABLE (VEX_LEN_XOP_08_EF
) },
5389 { VEX_LEN_TABLE (VEX_LEN_XOP_09_01
) },
5390 { VEX_LEN_TABLE (VEX_LEN_XOP_09_02
) },
5408 { VEX_LEN_TABLE (VEX_LEN_XOP_09_12
) },
5532 { VEX_W_TABLE (VEX_W_XOP_09_80
) },
5533 { VEX_W_TABLE (VEX_W_XOP_09_81
) },
5534 { VEX_W_TABLE (VEX_W_XOP_09_82
) },
5535 { VEX_W_TABLE (VEX_W_XOP_09_83
) },
5550 { VEX_LEN_TABLE (VEX_LEN_XOP_09_90
) },
5551 { VEX_LEN_TABLE (VEX_LEN_XOP_09_91
) },
5552 { VEX_LEN_TABLE (VEX_LEN_XOP_09_92
) },
5553 { VEX_LEN_TABLE (VEX_LEN_XOP_09_93
) },
5554 { VEX_LEN_TABLE (VEX_LEN_XOP_09_94
) },
5555 { VEX_LEN_TABLE (VEX_LEN_XOP_09_95
) },
5556 { VEX_LEN_TABLE (VEX_LEN_XOP_09_96
) },
5557 { VEX_LEN_TABLE (VEX_LEN_XOP_09_97
) },
5559 { VEX_LEN_TABLE (VEX_LEN_XOP_09_98
) },
5560 { VEX_LEN_TABLE (VEX_LEN_XOP_09_99
) },
5561 { VEX_LEN_TABLE (VEX_LEN_XOP_09_9A
) },
5562 { VEX_LEN_TABLE (VEX_LEN_XOP_09_9B
) },
5605 { VEX_LEN_TABLE (VEX_LEN_XOP_09_C1
) },
5606 { VEX_LEN_TABLE (VEX_LEN_XOP_09_C2
) },
5607 { VEX_LEN_TABLE (VEX_LEN_XOP_09_C3
) },
5610 { VEX_LEN_TABLE (VEX_LEN_XOP_09_C6
) },
5611 { VEX_LEN_TABLE (VEX_LEN_XOP_09_C7
) },
5616 { VEX_LEN_TABLE (VEX_LEN_XOP_09_CB
) },
5623 { VEX_LEN_TABLE (VEX_LEN_XOP_09_D1
) },
5624 { VEX_LEN_TABLE (VEX_LEN_XOP_09_D2
) },
5625 { VEX_LEN_TABLE (VEX_LEN_XOP_09_D3
) },
5628 { VEX_LEN_TABLE (VEX_LEN_XOP_09_D6
) },
5629 { VEX_LEN_TABLE (VEX_LEN_XOP_09_D7
) },
5634 { VEX_LEN_TABLE (VEX_LEN_XOP_09_DB
) },
5641 { VEX_LEN_TABLE (VEX_LEN_XOP_09_E1
) },
5642 { VEX_LEN_TABLE (VEX_LEN_XOP_09_E2
) },
5643 { VEX_LEN_TABLE (VEX_LEN_XOP_09_E3
) },
5697 { "bextrS", { Gdq
, Edq
, Id
}, 0 },
5699 { VEX_LEN_TABLE (VEX_LEN_XOP_0A_12
) },
5969 static const struct dis386 vex_table
[][256] = {
5991 { PREFIX_TABLE (PREFIX_0F10
) },
5992 { PREFIX_TABLE (PREFIX_0F11
) },
5993 { PREFIX_TABLE (PREFIX_VEX_0F12
) },
5994 { VEX_LEN_TABLE (VEX_LEN_0F13
) },
5995 { "vunpcklpX", { XM
, Vex
, EXx
}, PREFIX_OPCODE
},
5996 { "vunpckhpX", { XM
, Vex
, EXx
}, PREFIX_OPCODE
},
5997 { PREFIX_TABLE (PREFIX_VEX_0F16
) },
5998 { VEX_LEN_TABLE (VEX_LEN_0F17
) },
6018 { "vmovapX", { XM
, EXx
}, PREFIX_OPCODE
},
6019 { "vmovapX", { EXxS
, XM
}, PREFIX_OPCODE
},
6020 { PREFIX_TABLE (PREFIX_VEX_0F2A
) },
6021 { "vmovntpX", { Mx
, XM
}, PREFIX_OPCODE
},
6022 { PREFIX_TABLE (PREFIX_VEX_0F2C
) },
6023 { PREFIX_TABLE (PREFIX_VEX_0F2D
) },
6024 { PREFIX_TABLE (PREFIX_0F2E
) },
6025 { PREFIX_TABLE (PREFIX_0F2F
) },
6046 { VEX_LEN_TABLE (VEX_LEN_0F41
) },
6047 { VEX_LEN_TABLE (VEX_LEN_0F42
) },
6049 { VEX_LEN_TABLE (VEX_LEN_0F44
) },
6050 { VEX_LEN_TABLE (VEX_LEN_0F45
) },
6051 { VEX_LEN_TABLE (VEX_LEN_0F46
) },
6052 { VEX_LEN_TABLE (VEX_LEN_0F47
) },
6056 { VEX_LEN_TABLE (VEX_LEN_0F4A
) },
6057 { VEX_LEN_TABLE (VEX_LEN_0F4B
) },
6063 { "vmovmskpX", { Gdq
, Ux
}, PREFIX_OPCODE
},
6064 { PREFIX_TABLE (PREFIX_0F51
) },
6065 { PREFIX_TABLE (PREFIX_0F52
) },
6066 { PREFIX_TABLE (PREFIX_0F53
) },
6067 { "vandpX", { XM
, Vex
, EXx
}, PREFIX_OPCODE
},
6068 { "vandnpX", { XM
, Vex
, EXx
}, PREFIX_OPCODE
},
6069 { "vorpX", { XM
, Vex
, EXx
}, PREFIX_OPCODE
},
6070 { "vxorpX", { XM
, Vex
, EXx
}, PREFIX_OPCODE
},
6072 { PREFIX_TABLE (PREFIX_0F58
) },
6073 { PREFIX_TABLE (PREFIX_0F59
) },
6074 { PREFIX_TABLE (PREFIX_0F5A
) },
6075 { PREFIX_TABLE (PREFIX_0F5B
) },
6076 { PREFIX_TABLE (PREFIX_0F5C
) },
6077 { PREFIX_TABLE (PREFIX_0F5D
) },
6078 { PREFIX_TABLE (PREFIX_0F5E
) },
6079 { PREFIX_TABLE (PREFIX_0F5F
) },
6081 { "vpunpcklbw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6082 { "vpunpcklwd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6083 { "vpunpckldq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6084 { "vpacksswb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6085 { "vpcmpgtb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6086 { "vpcmpgtw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6087 { "vpcmpgtd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6088 { "vpackuswb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6090 { "vpunpckhbw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6091 { "vpunpckhwd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6092 { "vpunpckhdq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6093 { "vpackssdw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6094 { "vpunpcklqdq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6095 { "vpunpckhqdq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6096 { VEX_LEN_TABLE (VEX_LEN_0F6E
) },
6097 { PREFIX_TABLE (PREFIX_VEX_0F6F
) },
6099 { PREFIX_TABLE (PREFIX_VEX_0F70
) },
6100 { REG_TABLE (REG_VEX_0F71
) },
6101 { REG_TABLE (REG_VEX_0F72
) },
6102 { REG_TABLE (REG_VEX_0F73
) },
6103 { "vpcmpeqb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6104 { "vpcmpeqw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6105 { "vpcmpeqd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6106 { VEX_LEN_TABLE (VEX_LEN_0F77
) },
6112 { PREFIX_TABLE (PREFIX_0F7C
) },
6113 { PREFIX_TABLE (PREFIX_0F7D
) },
6114 { PREFIX_TABLE (PREFIX_VEX_0F7E
) },
6115 { PREFIX_TABLE (PREFIX_VEX_0F7F
) },
6135 { VEX_LEN_TABLE (VEX_LEN_0F90
) },
6136 { VEX_LEN_TABLE (VEX_LEN_0F91
) },
6137 { VEX_LEN_TABLE (VEX_LEN_0F92
) },
6138 { VEX_LEN_TABLE (VEX_LEN_0F93
) },
6144 { VEX_LEN_TABLE (VEX_LEN_0F98
) },
6145 { VEX_LEN_TABLE (VEX_LEN_0F99
) },
6168 { REG_TABLE (REG_VEX_0FAE
) },
6191 { PREFIX_TABLE (PREFIX_0FC2
) },
6193 { VEX_LEN_TABLE (VEX_LEN_0FC4
) },
6194 { "vpextrw", { Gd
, Uxmm
, Ib
}, PREFIX_DATA
},
6195 { "vshufpX", { XM
, Vex
, EXx
, Ib
}, PREFIX_OPCODE
},
6207 { PREFIX_TABLE (PREFIX_0FD0
) },
6208 { "vpsrlw", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
6209 { "vpsrld", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
6210 { "vpsrlq", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
6211 { "vpaddq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6212 { "vpmullw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6213 { VEX_LEN_TABLE (VEX_LEN_0FD6
) },
6214 { "vpmovmskb", { Gdq
, Ux
}, PREFIX_DATA
},
6216 { "vpsubusb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6217 { "vpsubusw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6218 { "vpminub", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6219 { "vpand", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6220 { "vpaddusb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6221 { "vpaddusw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6222 { "vpmaxub", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6223 { "vpandn", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6225 { "vpavgb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6226 { "vpsraw", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
6227 { "vpsrad", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
6228 { "vpavgw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6229 { "vpmulhuw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6230 { "vpmulhw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6231 { PREFIX_TABLE (PREFIX_0FE6
) },
6232 { "vmovntdq", { Mx
, XM
}, PREFIX_DATA
},
6234 { "vpsubsb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6235 { "vpsubsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6236 { "vpminsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6237 { "vpor", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6238 { "vpaddsb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6239 { "vpaddsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6240 { "vpmaxsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6241 { "vpxor", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6243 { PREFIX_TABLE (PREFIX_0FF0
) },
6244 { "vpsllw", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
6245 { "vpslld", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
6246 { "vpsllq", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
6247 { "vpmuludq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6248 { "vpmaddwd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6249 { "vpsadbw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6250 { "vmaskmovdqu", { XM
, Uxmm
}, PREFIX_DATA
},
6252 { "vpsubb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6253 { "vpsubw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6254 { "vpsubd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6255 { "vpsubq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6256 { "vpaddb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6257 { "vpaddw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6258 { "vpaddd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6264 { "vpshufb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6265 { "vphaddw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6266 { "vphaddd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6267 { "vphaddsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6268 { "vpmaddubsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6269 { "vphsubw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6270 { "vphsubd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6271 { "vphsubsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6273 { "vpsignb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6274 { "vpsignw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6275 { "vpsignd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6276 { "vpmulhrsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6277 { VEX_W_TABLE (VEX_W_0F380C
) },
6278 { VEX_W_TABLE (VEX_W_0F380D
) },
6279 { VEX_W_TABLE (VEX_W_0F380E
) },
6280 { VEX_W_TABLE (VEX_W_0F380F
) },
6285 { VEX_W_TABLE (VEX_W_0F3813
) },
6288 { VEX_LEN_TABLE (VEX_LEN_0F3816
) },
6289 { "vptest", { XM
, EXx
}, PREFIX_DATA
},
6291 { VEX_W_TABLE (VEX_W_0F3818
) },
6292 { VEX_LEN_TABLE (VEX_LEN_0F3819
) },
6293 { VEX_LEN_TABLE (VEX_LEN_0F381A
) },
6295 { "vpabsb", { XM
, EXx
}, PREFIX_DATA
},
6296 { "vpabsw", { XM
, EXx
}, PREFIX_DATA
},
6297 { "vpabsd", { XM
, EXx
}, PREFIX_DATA
},
6300 { "vpmovsxbw", { XM
, EXxmmq
}, PREFIX_DATA
},
6301 { "vpmovsxbd", { XM
, EXxmmqd
}, PREFIX_DATA
},
6302 { "vpmovsxbq", { XM
, EXxmmdw
}, PREFIX_DATA
},
6303 { "vpmovsxwd", { XM
, EXxmmq
}, PREFIX_DATA
},
6304 { "vpmovsxwq", { XM
, EXxmmqd
}, PREFIX_DATA
},
6305 { "vpmovsxdq", { XM
, EXxmmq
}, PREFIX_DATA
},
6309 { "vpmuldq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6310 { "vpcmpeqq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6311 { "vmovntdqa", { XM
, Mx
}, PREFIX_DATA
},
6312 { "vpackusdw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6313 { VEX_W_TABLE (VEX_W_0F382C
) },
6314 { VEX_W_TABLE (VEX_W_0F382D
) },
6315 { VEX_W_TABLE (VEX_W_0F382E
) },
6316 { VEX_W_TABLE (VEX_W_0F382F
) },
6318 { "vpmovzxbw", { XM
, EXxmmq
}, PREFIX_DATA
},
6319 { "vpmovzxbd", { XM
, EXxmmqd
}, PREFIX_DATA
},
6320 { "vpmovzxbq", { XM
, EXxmmdw
}, PREFIX_DATA
},
6321 { "vpmovzxwd", { XM
, EXxmmq
}, PREFIX_DATA
},
6322 { "vpmovzxwq", { XM
, EXxmmqd
}, PREFIX_DATA
},
6323 { "vpmovzxdq", { XM
, EXxmmq
}, PREFIX_DATA
},
6324 { VEX_LEN_TABLE (VEX_LEN_0F3836
) },
6325 { "vpcmpgtq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6327 { "vpminsb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6328 { "vpminsd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6329 { "vpminuw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6330 { "vpminud", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6331 { "vpmaxsb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6332 { "vpmaxsd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6333 { "vpmaxuw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6334 { "vpmaxud", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6336 { "vpmulld", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6337 { VEX_LEN_TABLE (VEX_LEN_0F3841
) },
6341 { "vpsrlv%DQ", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6342 { VEX_W_TABLE (VEX_W_0F3846
) },
6343 { "vpsllv%DQ", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6346 { X86_64_TABLE (X86_64_VEX_0F3849
) },
6348 { X86_64_TABLE (X86_64_VEX_0F384B
) },
6354 { VEX_W_TABLE (VEX_W_0F3850
) },
6355 { VEX_W_TABLE (VEX_W_0F3851
) },
6356 { VEX_W_TABLE (VEX_W_0F3852
) },
6357 { VEX_W_TABLE (VEX_W_0F3853
) },
6363 { VEX_W_TABLE (VEX_W_0F3858
) },
6364 { VEX_W_TABLE (VEX_W_0F3859
) },
6365 { VEX_LEN_TABLE (VEX_LEN_0F385A
) },
6367 { X86_64_TABLE (X86_64_VEX_0F385C
) },
6369 { X86_64_TABLE (X86_64_VEX_0F385E
) },
6385 { X86_64_TABLE (X86_64_VEX_0F386C
) },
6392 { PREFIX_TABLE (PREFIX_VEX_0F3872
) },
6399 { VEX_W_TABLE (VEX_W_0F3878
) },
6400 { VEX_W_TABLE (VEX_W_0F3879
) },
6421 { "vpmaskmov%DQ", { XM
, Vex
, Mx
}, PREFIX_DATA
},
6423 { "vpmaskmov%DQ", { Mx
, Vex
, XM
}, PREFIX_DATA
},
6426 { "vpgatherd%DQ", { XM
, MVexVSIBDWpX
, VexGatherD
}, PREFIX_DATA
},
6427 { "vpgatherq%DQ", { XMGatherQ
, MVexVSIBQWpX
, VexGatherQ
}, PREFIX_DATA
},
6428 { "vgatherdp%XW", { XM
, MVexVSIBDWpX
, VexGatherD
}, PREFIX_DATA
},
6429 { "vgatherqp%XW", { XMGatherQ
, MVexVSIBQWpX
, VexGatherQ
}, PREFIX_DATA
},
6432 { "vfmaddsub132p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6433 { "vfmsubadd132p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6435 { "vfmadd132p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6436 { "vfmadd132s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6437 { "vfmsub132p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6438 { "vfmsub132s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6439 { "vfnmadd132p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6440 { "vfnmadd132s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6441 { "vfnmsub132p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6442 { "vfnmsub132s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6450 { "vfmaddsub213p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6451 { "vfmsubadd213p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6453 { "vfmadd213p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6454 { "vfmadd213s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6455 { "vfmsub213p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6456 { "vfmsub213s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6457 { "vfnmadd213p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6458 { "vfnmadd213s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6459 { "vfnmsub213p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6460 { "vfnmsub213s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6462 { VEX_W_TABLE (VEX_W_0F38B0
) },
6463 { VEX_W_TABLE (VEX_W_0F38B1
) },
6466 { VEX_W_TABLE (VEX_W_0F38B4
) },
6467 { VEX_W_TABLE (VEX_W_0F38B5
) },
6468 { "vfmaddsub231p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6469 { "vfmsubadd231p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6471 { "vfmadd231p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6472 { "vfmadd231s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6473 { "vfmsub231p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6474 { "vfmsub231s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6475 { "vfnmadd231p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6476 { "vfnmadd231s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6477 { "vfnmsub231p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6478 { "vfnmsub231s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6492 { PREFIX_TABLE (PREFIX_VEX_0F38CB
) },
6493 { PREFIX_TABLE (PREFIX_VEX_0F38CC
) },
6494 { PREFIX_TABLE (PREFIX_VEX_0F38CD
) },
6496 { VEX_W_TABLE (VEX_W_0F38CF
) },
6500 { VEX_W_TABLE (VEX_W_0F38D2
) },
6501 { VEX_W_TABLE (VEX_W_0F38D3
) },
6509 { VEX_W_TABLE (VEX_W_0F38DA
) },
6510 { VEX_LEN_TABLE (VEX_LEN_0F38DB
) },
6511 { "vaesenc", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6512 { "vaesenclast", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6513 { "vaesdec", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6514 { "vaesdeclast", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6516 { X86_64_TABLE (X86_64_VEX_0F38Ex
) },
6517 { X86_64_TABLE (X86_64_VEX_0F38Ex
) },
6518 { X86_64_TABLE (X86_64_VEX_0F38Ex
) },
6519 { X86_64_TABLE (X86_64_VEX_0F38Ex
) },
6520 { X86_64_TABLE (X86_64_VEX_0F38Ex
) },
6521 { X86_64_TABLE (X86_64_VEX_0F38Ex
) },
6522 { X86_64_TABLE (X86_64_VEX_0F38Ex
) },
6523 { X86_64_TABLE (X86_64_VEX_0F38Ex
) },
6525 { X86_64_TABLE (X86_64_VEX_0F38Ex
) },
6526 { X86_64_TABLE (X86_64_VEX_0F38Ex
) },
6527 { X86_64_TABLE (X86_64_VEX_0F38Ex
) },
6528 { X86_64_TABLE (X86_64_VEX_0F38Ex
) },
6529 { X86_64_TABLE (X86_64_VEX_0F38Ex
) },
6530 { X86_64_TABLE (X86_64_VEX_0F38Ex
) },
6531 { X86_64_TABLE (X86_64_VEX_0F38Ex
) },
6532 { X86_64_TABLE (X86_64_VEX_0F38Ex
) },
6536 { VEX_LEN_TABLE (VEX_LEN_0F38F2
) },
6537 { VEX_LEN_TABLE (VEX_LEN_0F38F3
) },
6539 { VEX_LEN_TABLE (VEX_LEN_0F38F5
) },
6540 { VEX_LEN_TABLE (VEX_LEN_0F38F6
) },
6541 { VEX_LEN_TABLE (VEX_LEN_0F38F7
) },
6555 { VEX_LEN_TABLE (VEX_LEN_0F3A00
) },
6556 { VEX_LEN_TABLE (VEX_LEN_0F3A01
) },
6557 { VEX_W_TABLE (VEX_W_0F3A02
) },
6559 { VEX_W_TABLE (VEX_W_0F3A04
) },
6560 { VEX_W_TABLE (VEX_W_0F3A05
) },
6561 { VEX_LEN_TABLE (VEX_LEN_0F3A06
) },
6564 { "vroundps", { XM
, EXx
, Ib
}, PREFIX_DATA
},
6565 { "vroundpd", { XM
, EXx
, Ib
}, PREFIX_DATA
},
6566 { "vroundss", { XMScalar
, VexScalar
, EXd
, Ib
}, PREFIX_DATA
},
6567 { "vroundsd", { XMScalar
, VexScalar
, EXq
, Ib
}, PREFIX_DATA
},
6568 { "vblendps", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
6569 { "vblendpd", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
6570 { "vpblendw", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
6571 { "vpalignr", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
6577 { VEX_LEN_TABLE (VEX_LEN_0F3A14
) },
6578 { VEX_LEN_TABLE (VEX_LEN_0F3A15
) },
6579 { VEX_LEN_TABLE (VEX_LEN_0F3A16
) },
6580 { VEX_LEN_TABLE (VEX_LEN_0F3A17
) },
6582 { VEX_LEN_TABLE (VEX_LEN_0F3A18
) },
6583 { VEX_LEN_TABLE (VEX_LEN_0F3A19
) },
6587 { VEX_W_TABLE (VEX_W_0F3A1D
) },
6591 { VEX_LEN_TABLE (VEX_LEN_0F3A20
) },
6592 { VEX_LEN_TABLE (VEX_LEN_0F3A21
) },
6593 { VEX_LEN_TABLE (VEX_LEN_0F3A22
) },
6609 { VEX_LEN_TABLE (VEX_LEN_0F3A30
) },
6610 { VEX_LEN_TABLE (VEX_LEN_0F3A31
) },
6611 { VEX_LEN_TABLE (VEX_LEN_0F3A32
) },
6612 { VEX_LEN_TABLE (VEX_LEN_0F3A33
) },
6618 { VEX_LEN_TABLE (VEX_LEN_0F3A38
) },
6619 { VEX_LEN_TABLE (VEX_LEN_0F3A39
) },
6627 { "vdpps", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
6628 { VEX_LEN_TABLE (VEX_LEN_0F3A41
) },
6629 { "vmpsadbw", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
6631 { "vpclmulqdq", { XM
, Vex
, EXx
, PCLMUL
}, PREFIX_DATA
},
6633 { VEX_LEN_TABLE (VEX_LEN_0F3A46
) },
6636 { "vpermil2ps", { XM
, Vex
, EXx
, XMVexI4
, VexI4
}, PREFIX_DATA
},
6637 { "vpermil2pd", { XM
, Vex
, EXx
, XMVexI4
, VexI4
}, PREFIX_DATA
},
6638 { VEX_W_TABLE (VEX_W_0F3A4A
) },
6639 { VEX_W_TABLE (VEX_W_0F3A4B
) },
6640 { VEX_W_TABLE (VEX_W_0F3A4C
) },
6658 { "vfmaddsubps", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6659 { "vfmaddsubpd", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6660 { "vfmsubaddps", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6661 { "vfmsubaddpd", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6663 { VEX_LEN_TABLE (VEX_LEN_0F3A60
) },
6664 { VEX_LEN_TABLE (VEX_LEN_0F3A61
) },
6665 { VEX_LEN_TABLE (VEX_LEN_0F3A62
) },
6666 { VEX_LEN_TABLE (VEX_LEN_0F3A63
) },
6672 { "vfmaddps", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6673 { "vfmaddpd", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6674 { "vfmaddss", { XMScalar
, VexScalar
, EXd
, XMVexScalarI4
}, PREFIX_DATA
},
6675 { "vfmaddsd", { XMScalar
, VexScalar
, EXq
, XMVexScalarI4
}, PREFIX_DATA
},
6676 { "vfmsubps", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6677 { "vfmsubpd", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6678 { "vfmsubss", { XMScalar
, VexScalar
, EXd
, XMVexScalarI4
}, PREFIX_DATA
},
6679 { "vfmsubsd", { XMScalar
, VexScalar
, EXq
, XMVexScalarI4
}, PREFIX_DATA
},
6690 { "vfnmaddps", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6691 { "vfnmaddpd", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6692 { "vfnmaddss", { XMScalar
, VexScalar
, EXd
, XMVexScalarI4
}, PREFIX_DATA
},
6693 { "vfnmaddsd", { XMScalar
, VexScalar
, EXq
, XMVexScalarI4
}, PREFIX_DATA
},
6694 { "vfnmsubps", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6695 { "vfnmsubpd", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6696 { "vfnmsubss", { XMScalar
, VexScalar
, EXd
, XMVexScalarI4
}, PREFIX_DATA
},
6697 { "vfnmsubsd", { XMScalar
, VexScalar
, EXq
, XMVexScalarI4
}, PREFIX_DATA
},
6786 { VEX_W_TABLE (VEX_W_0F3ACE
) },
6787 { VEX_W_TABLE (VEX_W_0F3ACF
) },
6804 { VEX_W_TABLE (VEX_W_0F3ADE
) },
6805 { VEX_LEN_TABLE (VEX_LEN_0F3ADF
) },
6825 { VEX_LEN_TABLE (VEX_LEN_0F3AF0
) },
6845 #include "i386-dis-evex.h"
6847 static const struct dis386 vex_len_table
[][2] = {
6848 /* VEX_LEN_0F12_P_0 */
6850 { MOD_TABLE (MOD_0F12_PREFIX_0
) },
6853 /* VEX_LEN_0F12_P_2 */
6855 { "%XEVmovlpYX", { XM
, Vex
, Mq
}, 0 },
6860 { "%XEVmovlpYX", { Mq
, XM
}, PREFIX_OPCODE
},
6863 /* VEX_LEN_0F16_P_0 */
6865 { MOD_TABLE (MOD_0F16_PREFIX_0
) },
6868 /* VEX_LEN_0F16_P_2 */
6870 { "%XEVmovhpYX", { XM
, Vex
, Mq
}, 0 },
6875 { "%XEVmovhpYX", { Mq
, XM
}, PREFIX_OPCODE
},
6881 { VEX_W_TABLE (VEX_W_0F41_L_1
) },
6887 { VEX_W_TABLE (VEX_W_0F42_L_1
) },
6892 { VEX_W_TABLE (VEX_W_0F44_L_0
) },
6898 { VEX_W_TABLE (VEX_W_0F45_L_1
) },
6904 { VEX_W_TABLE (VEX_W_0F46_L_1
) },
6910 { VEX_W_TABLE (VEX_W_0F47_L_1
) },
6916 { VEX_W_TABLE (VEX_W_0F4A_L_1
) },
6922 { VEX_W_TABLE (VEX_W_0F4B_L_1
) },
6927 { "%XEvmovYK", { XMScalar
, Edq
}, PREFIX_DATA
},
6932 { "vzeroupper", { XX
}, 0 },
6933 { "vzeroall", { XX
}, 0 },
6936 /* VEX_LEN_0F7E_P_1 */
6938 { "%XEvmovqY", { XMScalar
, EXq
}, 0 },
6941 /* VEX_LEN_0F7E_P_2 */
6943 { "%XEvmovK", { Edq
, XMScalar
}, 0 },
6948 { VEX_W_TABLE (VEX_W_0F90_L_0
) },
6953 { VEX_W_TABLE (VEX_W_0F91_L_0
) },
6958 { VEX_W_TABLE (VEX_W_0F92_L_0
) },
6963 { VEX_W_TABLE (VEX_W_0F93_L_0
) },
6968 { VEX_W_TABLE (VEX_W_0F98_L_0
) },
6973 { VEX_W_TABLE (VEX_W_0F99_L_0
) },
6976 /* VEX_LEN_0FAE_R_2 */
6978 { "vldmxcsr", { Md
}, 0 },
6981 /* VEX_LEN_0FAE_R_3 */
6983 { "vstmxcsr", { Md
}, 0 },
6988 { "%XEvpinsrwY", { XM
, Vex
, Edw
, Ib
}, PREFIX_DATA
},
6993 { "%XEvmovqY", { EXqS
, XMScalar
}, PREFIX_DATA
},
6996 /* VEX_LEN_0F3816 */
6999 { VEX_W_TABLE (VEX_W_0F3816_L_1
) },
7002 /* VEX_LEN_0F3819 */
7005 { VEX_W_TABLE (VEX_W_0F3819_L_1
) },
7008 /* VEX_LEN_0F381A */
7011 { VEX_W_TABLE (VEX_W_0F381A_L_1
) },
7014 /* VEX_LEN_0F3836 */
7017 { VEX_W_TABLE (VEX_W_0F3836
) },
7020 /* VEX_LEN_0F3841 */
7022 { "vphminposuw", { XM
, EXx
}, PREFIX_DATA
},
7025 /* VEX_LEN_0F3849_X86_64 */
7027 { VEX_W_TABLE (VEX_W_0F3849_X86_64_L_0
) },
7030 /* VEX_LEN_0F384B_X86_64 */
7032 { VEX_W_TABLE (VEX_W_0F384B_X86_64_L_0
) },
7035 /* VEX_LEN_0F385A */
7038 { VEX_W_TABLE (VEX_W_0F385A_L_0
) },
7041 /* VEX_LEN_0F385C_X86_64 */
7043 { VEX_W_TABLE (VEX_W_0F385C_X86_64_L_0
) },
7046 /* VEX_LEN_0F385E_X86_64 */
7048 { VEX_W_TABLE (VEX_W_0F385E_X86_64_L_0
) },
7051 /* VEX_LEN_0F386C_X86_64 */
7053 { VEX_W_TABLE (VEX_W_0F386C_X86_64_L_0
) },
7056 /* VEX_LEN_0F38CB_P_3_W_0 */
7059 { "vsha512rnds2", { XM
, Vex
, Rxmmq
}, 0 },
7062 /* VEX_LEN_0F38CC_P_3_W_0 */
7065 { "vsha512msg1", { XM
, Rxmmq
}, 0 },
7068 /* VEX_LEN_0F38CD_P_3_W_0 */
7071 { "vsha512msg2", { XM
, Rymm
}, 0 },
7074 /* VEX_LEN_0F38DA_W_0_P_0 */
7076 { "vsm3msg1", { XM
, Vex
, EXxmm
}, 0 },
7079 /* VEX_LEN_0F38DA_W_0_P_2 */
7081 { "vsm3msg2", { XM
, Vex
, EXxmm
}, 0 },
7084 /* VEX_LEN_0F38DB */
7086 { "vaesimc", { XM
, EXx
}, PREFIX_DATA
},
7089 /* VEX_LEN_0F38F2 */
7091 { PREFIX_TABLE (PREFIX_VEX_0F38F2_L_0
) },
7094 /* VEX_LEN_0F38F3 */
7096 { PREFIX_TABLE (PREFIX_VEX_0F38F3_L_0
) },
7099 /* VEX_LEN_0F38F5 */
7101 { PREFIX_TABLE(PREFIX_VEX_0F38F5_L_0
) },
7104 /* VEX_LEN_0F38F6 */
7106 { PREFIX_TABLE(PREFIX_VEX_0F38F6_L_0
) },
7109 /* VEX_LEN_0F38F7 */
7111 { PREFIX_TABLE(PREFIX_VEX_0F38F7_L_0
) },
7114 /* VEX_LEN_0F3A00 */
7117 { VEX_W_TABLE (VEX_W_0F3A00_L_1
) },
7120 /* VEX_LEN_0F3A01 */
7123 { VEX_W_TABLE (VEX_W_0F3A01_L_1
) },
7126 /* VEX_LEN_0F3A06 */
7129 { VEX_W_TABLE (VEX_W_0F3A06_L_1
) },
7132 /* VEX_LEN_0F3A14 */
7134 { "%XEvpextrb", { Edb
, XM
, Ib
}, PREFIX_DATA
},
7137 /* VEX_LEN_0F3A15 */
7139 { "%XEvpextrw", { Edw
, XM
, Ib
}, PREFIX_DATA
},
7142 /* VEX_LEN_0F3A16 */
7144 { "%XEvpextrK", { Edq
, XM
, Ib
}, PREFIX_DATA
},
7147 /* VEX_LEN_0F3A17 */
7149 { "%XEvextractps", { Ed
, XM
, Ib
}, PREFIX_DATA
},
7152 /* VEX_LEN_0F3A18 */
7155 { VEX_W_TABLE (VEX_W_0F3A18_L_1
) },
7158 /* VEX_LEN_0F3A19 */
7161 { VEX_W_TABLE (VEX_W_0F3A19_L_1
) },
7164 /* VEX_LEN_0F3A20 */
7166 { "%XEvpinsrbY", { XM
, Vex
, Edb
, Ib
}, PREFIX_DATA
},
7169 /* VEX_LEN_0F3A21 */
7171 { "%XEvinsertpsY", { XM
, Vex
, EXd
, Ib
}, PREFIX_DATA
},
7174 /* VEX_LEN_0F3A22 */
7176 { "%XEvpinsrYK", { XM
, Vex
, Edq
, Ib
}, PREFIX_DATA
},
7179 /* VEX_LEN_0F3A30 */
7181 { "kshiftr%BW", { MaskG
, MaskR
, Ib
}, PREFIX_DATA
},
7184 /* VEX_LEN_0F3A31 */
7186 { "kshiftr%DQ", { MaskG
, MaskR
, Ib
}, PREFIX_DATA
},
7189 /* VEX_LEN_0F3A32 */
7191 { "kshiftl%BW", { MaskG
, MaskR
, Ib
}, PREFIX_DATA
},
7194 /* VEX_LEN_0F3A33 */
7196 { "kshiftl%DQ", { MaskG
, MaskR
, Ib
}, PREFIX_DATA
},
7199 /* VEX_LEN_0F3A38 */
7202 { VEX_W_TABLE (VEX_W_0F3A38_L_1
) },
7205 /* VEX_LEN_0F3A39 */
7208 { VEX_W_TABLE (VEX_W_0F3A39_L_1
) },
7211 /* VEX_LEN_0F3A41 */
7213 { "vdppd", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
7216 /* VEX_LEN_0F3A46 */
7219 { VEX_W_TABLE (VEX_W_0F3A46_L_1
) },
7222 /* VEX_LEN_0F3A60 */
7224 { "vpcmpestrm!%LQ", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7227 /* VEX_LEN_0F3A61 */
7229 { "vpcmpestri!%LQ", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7232 /* VEX_LEN_0F3A62 */
7234 { "vpcmpistrm", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7237 /* VEX_LEN_0F3A63 */
7239 { "vpcmpistri", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7242 /* VEX_LEN_0F3ADE_W_0 */
7244 { "vsm3rnds2", { XM
, Vex
, EXxmm
, Ib
}, PREFIX_DATA
},
7247 /* VEX_LEN_0F3ADF */
7249 { "vaeskeygenassist", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7252 /* VEX_LEN_0F3AF0 */
7254 { PREFIX_TABLE (PREFIX_VEX_0F3AF0_L_0
) },
7257 /* VEX_LEN_MAP7_F8 */
7259 { VEX_W_TABLE (VEX_W_MAP7_F8_L_0
) },
7262 /* VEX_LEN_XOP_08_85 */
7264 { VEX_W_TABLE (VEX_W_XOP_08_85_L_0
) },
7267 /* VEX_LEN_XOP_08_86 */
7269 { VEX_W_TABLE (VEX_W_XOP_08_86_L_0
) },
7272 /* VEX_LEN_XOP_08_87 */
7274 { VEX_W_TABLE (VEX_W_XOP_08_87_L_0
) },
7277 /* VEX_LEN_XOP_08_8E */
7279 { VEX_W_TABLE (VEX_W_XOP_08_8E_L_0
) },
7282 /* VEX_LEN_XOP_08_8F */
7284 { VEX_W_TABLE (VEX_W_XOP_08_8F_L_0
) },
7287 /* VEX_LEN_XOP_08_95 */
7289 { VEX_W_TABLE (VEX_W_XOP_08_95_L_0
) },
7292 /* VEX_LEN_XOP_08_96 */
7294 { VEX_W_TABLE (VEX_W_XOP_08_96_L_0
) },
7297 /* VEX_LEN_XOP_08_97 */
7299 { VEX_W_TABLE (VEX_W_XOP_08_97_L_0
) },
7302 /* VEX_LEN_XOP_08_9E */
7304 { VEX_W_TABLE (VEX_W_XOP_08_9E_L_0
) },
7307 /* VEX_LEN_XOP_08_9F */
7309 { VEX_W_TABLE (VEX_W_XOP_08_9F_L_0
) },
7312 /* VEX_LEN_XOP_08_A3 */
7314 { "vpperm", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7317 /* VEX_LEN_XOP_08_A6 */
7319 { VEX_W_TABLE (VEX_W_XOP_08_A6_L_0
) },
7322 /* VEX_LEN_XOP_08_B6 */
7324 { VEX_W_TABLE (VEX_W_XOP_08_B6_L_0
) },
7327 /* VEX_LEN_XOP_08_C0 */
7329 { VEX_W_TABLE (VEX_W_XOP_08_C0_L_0
) },
7332 /* VEX_LEN_XOP_08_C1 */
7334 { VEX_W_TABLE (VEX_W_XOP_08_C1_L_0
) },
7337 /* VEX_LEN_XOP_08_C2 */
7339 { VEX_W_TABLE (VEX_W_XOP_08_C2_L_0
) },
7342 /* VEX_LEN_XOP_08_C3 */
7344 { VEX_W_TABLE (VEX_W_XOP_08_C3_L_0
) },
7347 /* VEX_LEN_XOP_08_CC */
7349 { VEX_W_TABLE (VEX_W_XOP_08_CC_L_0
) },
7352 /* VEX_LEN_XOP_08_CD */
7354 { VEX_W_TABLE (VEX_W_XOP_08_CD_L_0
) },
7357 /* VEX_LEN_XOP_08_CE */
7359 { VEX_W_TABLE (VEX_W_XOP_08_CE_L_0
) },
7362 /* VEX_LEN_XOP_08_CF */
7364 { VEX_W_TABLE (VEX_W_XOP_08_CF_L_0
) },
7367 /* VEX_LEN_XOP_08_EC */
7369 { VEX_W_TABLE (VEX_W_XOP_08_EC_L_0
) },
7372 /* VEX_LEN_XOP_08_ED */
7374 { VEX_W_TABLE (VEX_W_XOP_08_ED_L_0
) },
7377 /* VEX_LEN_XOP_08_EE */
7379 { VEX_W_TABLE (VEX_W_XOP_08_EE_L_0
) },
7382 /* VEX_LEN_XOP_08_EF */
7384 { VEX_W_TABLE (VEX_W_XOP_08_EF_L_0
) },
7387 /* VEX_LEN_XOP_09_01 */
7389 { REG_TABLE (REG_XOP_09_01_L_0
) },
7392 /* VEX_LEN_XOP_09_02 */
7394 { REG_TABLE (REG_XOP_09_02_L_0
) },
7397 /* VEX_LEN_XOP_09_12 */
7399 { REG_TABLE (REG_XOP_09_12_L_0
) },
7402 /* VEX_LEN_XOP_09_82_W_0 */
7404 { "vfrczss", { XM
, EXd
}, 0 },
7407 /* VEX_LEN_XOP_09_83_W_0 */
7409 { "vfrczsd", { XM
, EXq
}, 0 },
7412 /* VEX_LEN_XOP_09_90 */
7414 { "vprotb", { XM
, EXx
, VexW
}, 0 },
7417 /* VEX_LEN_XOP_09_91 */
7419 { "vprotw", { XM
, EXx
, VexW
}, 0 },
7422 /* VEX_LEN_XOP_09_92 */
7424 { "vprotd", { XM
, EXx
, VexW
}, 0 },
7427 /* VEX_LEN_XOP_09_93 */
7429 { "vprotq", { XM
, EXx
, VexW
}, 0 },
7432 /* VEX_LEN_XOP_09_94 */
7434 { "vpshlb", { XM
, EXx
, VexW
}, 0 },
7437 /* VEX_LEN_XOP_09_95 */
7439 { "vpshlw", { XM
, EXx
, VexW
}, 0 },
7442 /* VEX_LEN_XOP_09_96 */
7444 { "vpshld", { XM
, EXx
, VexW
}, 0 },
7447 /* VEX_LEN_XOP_09_97 */
7449 { "vpshlq", { XM
, EXx
, VexW
}, 0 },
7452 /* VEX_LEN_XOP_09_98 */
7454 { "vpshab", { XM
, EXx
, VexW
}, 0 },
7457 /* VEX_LEN_XOP_09_99 */
7459 { "vpshaw", { XM
, EXx
, VexW
}, 0 },
7462 /* VEX_LEN_XOP_09_9A */
7464 { "vpshad", { XM
, EXx
, VexW
}, 0 },
7467 /* VEX_LEN_XOP_09_9B */
7469 { "vpshaq", { XM
, EXx
, VexW
}, 0 },
7472 /* VEX_LEN_XOP_09_C1 */
7474 { VEX_W_TABLE (VEX_W_XOP_09_C1_L_0
) },
7477 /* VEX_LEN_XOP_09_C2 */
7479 { VEX_W_TABLE (VEX_W_XOP_09_C2_L_0
) },
7482 /* VEX_LEN_XOP_09_C3 */
7484 { VEX_W_TABLE (VEX_W_XOP_09_C3_L_0
) },
7487 /* VEX_LEN_XOP_09_C6 */
7489 { VEX_W_TABLE (VEX_W_XOP_09_C6_L_0
) },
7492 /* VEX_LEN_XOP_09_C7 */
7494 { VEX_W_TABLE (VEX_W_XOP_09_C7_L_0
) },
7497 /* VEX_LEN_XOP_09_CB */
7499 { VEX_W_TABLE (VEX_W_XOP_09_CB_L_0
) },
7502 /* VEX_LEN_XOP_09_D1 */
7504 { VEX_W_TABLE (VEX_W_XOP_09_D1_L_0
) },
7507 /* VEX_LEN_XOP_09_D2 */
7509 { VEX_W_TABLE (VEX_W_XOP_09_D2_L_0
) },
7512 /* VEX_LEN_XOP_09_D3 */
7514 { VEX_W_TABLE (VEX_W_XOP_09_D3_L_0
) },
7517 /* VEX_LEN_XOP_09_D6 */
7519 { VEX_W_TABLE (VEX_W_XOP_09_D6_L_0
) },
7522 /* VEX_LEN_XOP_09_D7 */
7524 { VEX_W_TABLE (VEX_W_XOP_09_D7_L_0
) },
7527 /* VEX_LEN_XOP_09_DB */
7529 { VEX_W_TABLE (VEX_W_XOP_09_DB_L_0
) },
7532 /* VEX_LEN_XOP_09_E1 */
7534 { VEX_W_TABLE (VEX_W_XOP_09_E1_L_0
) },
7537 /* VEX_LEN_XOP_09_E2 */
7539 { VEX_W_TABLE (VEX_W_XOP_09_E2_L_0
) },
7542 /* VEX_LEN_XOP_09_E3 */
7544 { VEX_W_TABLE (VEX_W_XOP_09_E3_L_0
) },
7547 /* VEX_LEN_XOP_0A_12 */
7549 { REG_TABLE (REG_XOP_0A_12_L_0
) },
7553 #include "i386-dis-evex-len.h"
7555 static const struct dis386 vex_w_table
[][2] = {
7557 /* VEX_W_0F41_L_1_M_1 */
7558 { PREFIX_TABLE (PREFIX_VEX_0F41_L_1_W_0
) },
7559 { PREFIX_TABLE (PREFIX_VEX_0F41_L_1_W_1
) },
7562 /* VEX_W_0F42_L_1_M_1 */
7563 { PREFIX_TABLE (PREFIX_VEX_0F42_L_1_W_0
) },
7564 { PREFIX_TABLE (PREFIX_VEX_0F42_L_1_W_1
) },
7567 /* VEX_W_0F44_L_0_M_1 */
7568 { PREFIX_TABLE (PREFIX_VEX_0F44_L_0_W_0
) },
7569 { PREFIX_TABLE (PREFIX_VEX_0F44_L_0_W_1
) },
7572 /* VEX_W_0F45_L_1_M_1 */
7573 { PREFIX_TABLE (PREFIX_VEX_0F45_L_1_W_0
) },
7574 { PREFIX_TABLE (PREFIX_VEX_0F45_L_1_W_1
) },
7577 /* VEX_W_0F46_L_1_M_1 */
7578 { PREFIX_TABLE (PREFIX_VEX_0F46_L_1_W_0
) },
7579 { PREFIX_TABLE (PREFIX_VEX_0F46_L_1_W_1
) },
7582 /* VEX_W_0F47_L_1_M_1 */
7583 { PREFIX_TABLE (PREFIX_VEX_0F47_L_1_W_0
) },
7584 { PREFIX_TABLE (PREFIX_VEX_0F47_L_1_W_1
) },
7587 /* VEX_W_0F4A_L_1_M_1 */
7588 { PREFIX_TABLE (PREFIX_VEX_0F4A_L_1_W_0
) },
7589 { PREFIX_TABLE (PREFIX_VEX_0F4A_L_1_W_1
) },
7592 /* VEX_W_0F4B_L_1_M_1 */
7593 { PREFIX_TABLE (PREFIX_VEX_0F4B_L_1_W_0
) },
7594 { PREFIX_TABLE (PREFIX_VEX_0F4B_L_1_W_1
) },
7597 /* VEX_W_0F90_L_0 */
7598 { PREFIX_TABLE (PREFIX_VEX_0F90_L_0_W_0
) },
7599 { PREFIX_TABLE (PREFIX_VEX_0F90_L_0_W_1
) },
7602 /* VEX_W_0F91_L_0_M_0 */
7603 { PREFIX_TABLE (PREFIX_VEX_0F91_L_0_W_0
) },
7604 { PREFIX_TABLE (PREFIX_VEX_0F91_L_0_W_1
) },
7607 /* VEX_W_0F92_L_0_M_1 */
7608 { PREFIX_TABLE (PREFIX_VEX_0F92_L_0_W_0
) },
7609 { PREFIX_TABLE (PREFIX_VEX_0F92_L_0_W_1
) },
7612 /* VEX_W_0F93_L_0_M_1 */
7613 { PREFIX_TABLE (PREFIX_VEX_0F93_L_0_W_0
) },
7614 { PREFIX_TABLE (PREFIX_VEX_0F93_L_0_W_1
) },
7617 /* VEX_W_0F98_L_0_M_1 */
7618 { PREFIX_TABLE (PREFIX_VEX_0F98_L_0_W_0
) },
7619 { PREFIX_TABLE (PREFIX_VEX_0F98_L_0_W_1
) },
7622 /* VEX_W_0F99_L_0_M_1 */
7623 { PREFIX_TABLE (PREFIX_VEX_0F99_L_0_W_0
) },
7624 { PREFIX_TABLE (PREFIX_VEX_0F99_L_0_W_1
) },
7628 { "%XEvpermilps", { XM
, Vex
, EXx
}, PREFIX_DATA
},
7632 { "vpermilpd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
7636 { "vtestps", { XM
, EXx
}, PREFIX_DATA
},
7640 { "vtestpd", { XM
, EXx
}, PREFIX_DATA
},
7644 { "vcvtph2ps", { XM
, EXxmmq
}, PREFIX_DATA
},
7647 /* VEX_W_0F3816_L_1 */
7648 { "vpermps", { XM
, Vex
, EXx
}, PREFIX_DATA
},
7652 { "%XEvbroadcastss", { XM
, EXd
}, PREFIX_DATA
},
7655 /* VEX_W_0F3819_L_1 */
7656 { "vbroadcastsd", { XM
, EXq
}, PREFIX_DATA
},
7659 /* VEX_W_0F381A_L_1 */
7660 { "vbroadcastf128", { XM
, Mxmm
}, PREFIX_DATA
},
7664 { "vmaskmovps", { XM
, Vex
, Mx
}, PREFIX_DATA
},
7668 { "vmaskmovpd", { XM
, Vex
, Mx
}, PREFIX_DATA
},
7672 { "vmaskmovps", { Mx
, Vex
, XM
}, PREFIX_DATA
},
7676 { "vmaskmovpd", { Mx
, Vex
, XM
}, PREFIX_DATA
},
7680 { "vpermd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
7684 { "vpsravd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
7687 /* VEX_W_0F3849_X86_64_L_0 */
7688 { MOD_TABLE (MOD_VEX_0F3849_X86_64_L_0_W_0
) },
7691 /* VEX_W_0F384B_X86_64_L_0 */
7692 { PREFIX_TABLE (PREFIX_VEX_0F384B_X86_64_L_0_W_0
) },
7696 { PREFIX_TABLE (PREFIX_VEX_0F3850_W_0
) },
7700 { PREFIX_TABLE (PREFIX_VEX_0F3851_W_0
) },
7704 { "%XVvpdpwssd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
7708 { "%XVvpdpwssds", { XM
, Vex
, EXx
}, PREFIX_DATA
},
7712 { "%XEvpbroadcastd", { XM
, EXd
}, PREFIX_DATA
},
7716 { "vpbroadcastq", { XM
, EXq
}, PREFIX_DATA
},
7719 /* VEX_W_0F385A_L_0 */
7720 { "vbroadcasti128", { XM
, Mxmm
}, PREFIX_DATA
},
7723 /* VEX_W_0F385C_X86_64_L_0 */
7724 { PREFIX_TABLE (PREFIX_VEX_0F385C_X86_64_L_0_W_0
) },
7727 /* VEX_W_0F385E_X86_64_L_0 */
7728 { PREFIX_TABLE (PREFIX_VEX_0F385E_X86_64_L_0_W_0
) },
7731 /* VEX_W_0F386C_X86_64_L_0 */
7732 { PREFIX_TABLE (PREFIX_VEX_0F386C_X86_64_L_0_W_0
) },
7735 /* VEX_W_0F3872_P_1 */
7736 { "%XVvcvtneps2bf16%XY", { XMM
, EXx
}, 0 },
7740 { "%XEvpbroadcastb", { XM
, EXb
}, PREFIX_DATA
},
7744 { "%XEvpbroadcastw", { XM
, EXw
}, PREFIX_DATA
},
7748 { PREFIX_TABLE (PREFIX_VEX_0F38B0_W_0
) },
7752 { PREFIX_TABLE (PREFIX_VEX_0F38B1_W_0
) },
7757 { "%XVvpmadd52luq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
7762 { "%XVvpmadd52huq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
7765 /* VEX_W_0F38CB_P_3 */
7766 { VEX_LEN_TABLE (VEX_LEN_0F38CB_P_3_W_0
) },
7769 /* VEX_W_0F38CC_P_3 */
7770 { VEX_LEN_TABLE (VEX_LEN_0F38CC_P_3_W_0
) },
7773 /* VEX_W_0F38CD_P_3 */
7774 { VEX_LEN_TABLE (VEX_LEN_0F38CD_P_3_W_0
) },
7778 { "%XEvgf2p8mulb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
7782 { PREFIX_TABLE (PREFIX_VEX_0F38D2_W_0
) },
7786 { PREFIX_TABLE (PREFIX_VEX_0F38D3_W_0
) },
7790 { PREFIX_TABLE (PREFIX_VEX_0F38DA_W_0
) },
7793 /* VEX_W_0F3A00_L_1 */
7795 { "%XEvpermq", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7798 /* VEX_W_0F3A01_L_1 */
7800 { "%XEvpermpd", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7804 { "vpblendd", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
7808 { "%XEvpermilps", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7812 { "vpermilpd", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7815 /* VEX_W_0F3A06_L_1 */
7816 { "vperm2f128", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
7819 /* VEX_W_0F3A18_L_1 */
7820 { "vinsertf128", { XM
, Vex
, EXxmm
, Ib
}, PREFIX_DATA
},
7823 /* VEX_W_0F3A19_L_1 */
7824 { "vextractf128", { EXxmm
, XM
, Ib
}, PREFIX_DATA
},
7828 { "%XEvcvtps2ph", { EXxmmq
, XM
, EXxEVexS
, Ib
}, PREFIX_DATA
},
7831 /* VEX_W_0F3A38_L_1 */
7832 { "vinserti128", { XM
, Vex
, EXxmm
, Ib
}, PREFIX_DATA
},
7835 /* VEX_W_0F3A39_L_1 */
7836 { "vextracti128", { EXxmm
, XM
, Ib
}, PREFIX_DATA
},
7839 /* VEX_W_0F3A46_L_1 */
7840 { "vperm2i128", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
7844 { "vblendvps", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
7848 { "vblendvpd", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
7852 { "vpblendvb", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
7857 { "%XEvgf2p8affineqb", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
7862 { "%XEvgf2p8affineinvqb", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
7866 { VEX_LEN_TABLE (VEX_LEN_0F3ADE_W_0
) },
7869 /* VEX_W_MAP7_F8_L_0 */
7870 { REG_TABLE (REG_VEX_MAP7_F8_L_0_W_0
) },
7872 /* VEX_W_XOP_08_85_L_0 */
7874 { "vpmacssww", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7876 /* VEX_W_XOP_08_86_L_0 */
7878 { "vpmacsswd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7880 /* VEX_W_XOP_08_87_L_0 */
7882 { "vpmacssdql", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7884 /* VEX_W_XOP_08_8E_L_0 */
7886 { "vpmacssdd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7888 /* VEX_W_XOP_08_8F_L_0 */
7890 { "vpmacssdqh", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7892 /* VEX_W_XOP_08_95_L_0 */
7894 { "vpmacsww", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7896 /* VEX_W_XOP_08_96_L_0 */
7898 { "vpmacswd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7900 /* VEX_W_XOP_08_97_L_0 */
7902 { "vpmacsdql", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7904 /* VEX_W_XOP_08_9E_L_0 */
7906 { "vpmacsdd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7908 /* VEX_W_XOP_08_9F_L_0 */
7910 { "vpmacsdqh", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7912 /* VEX_W_XOP_08_A6_L_0 */
7914 { "vpmadcsswd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7916 /* VEX_W_XOP_08_B6_L_0 */
7918 { "vpmadcswd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7920 /* VEX_W_XOP_08_C0_L_0 */
7922 { "vprotb", { XM
, EXx
, Ib
}, 0 },
7924 /* VEX_W_XOP_08_C1_L_0 */
7926 { "vprotw", { XM
, EXx
, Ib
}, 0 },
7928 /* VEX_W_XOP_08_C2_L_0 */
7930 { "vprotd", { XM
, EXx
, Ib
}, 0 },
7932 /* VEX_W_XOP_08_C3_L_0 */
7934 { "vprotq", { XM
, EXx
, Ib
}, 0 },
7936 /* VEX_W_XOP_08_CC_L_0 */
7938 { "vpcomb", { XM
, Vex
, EXx
, VPCOM
}, 0 },
7940 /* VEX_W_XOP_08_CD_L_0 */
7942 { "vpcomw", { XM
, Vex
, EXx
, VPCOM
}, 0 },
7944 /* VEX_W_XOP_08_CE_L_0 */
7946 { "vpcomd", { XM
, Vex
, EXx
, VPCOM
}, 0 },
7948 /* VEX_W_XOP_08_CF_L_0 */
7950 { "vpcomq", { XM
, Vex
, EXx
, VPCOM
}, 0 },
7952 /* VEX_W_XOP_08_EC_L_0 */
7954 { "vpcomub", { XM
, Vex
, EXx
, VPCOM
}, 0 },
7956 /* VEX_W_XOP_08_ED_L_0 */
7958 { "vpcomuw", { XM
, Vex
, EXx
, VPCOM
}, 0 },
7960 /* VEX_W_XOP_08_EE_L_0 */
7962 { "vpcomud", { XM
, Vex
, EXx
, VPCOM
}, 0 },
7964 /* VEX_W_XOP_08_EF_L_0 */
7966 { "vpcomuq", { XM
, Vex
, EXx
, VPCOM
}, 0 },
7968 /* VEX_W_XOP_09_80 */
7970 { "vfrczps", { XM
, EXx
}, 0 },
7972 /* VEX_W_XOP_09_81 */
7974 { "vfrczpd", { XM
, EXx
}, 0 },
7976 /* VEX_W_XOP_09_82 */
7978 { VEX_LEN_TABLE (VEX_LEN_XOP_09_82_W_0
) },
7980 /* VEX_W_XOP_09_83 */
7982 { VEX_LEN_TABLE (VEX_LEN_XOP_09_83_W_0
) },
7984 /* VEX_W_XOP_09_C1_L_0 */
7986 { "vphaddbw", { XM
, EXxmm
}, 0 },
7988 /* VEX_W_XOP_09_C2_L_0 */
7990 { "vphaddbd", { XM
, EXxmm
}, 0 },
7992 /* VEX_W_XOP_09_C3_L_0 */
7994 { "vphaddbq", { XM
, EXxmm
}, 0 },
7996 /* VEX_W_XOP_09_C6_L_0 */
7998 { "vphaddwd", { XM
, EXxmm
}, 0 },
8000 /* VEX_W_XOP_09_C7_L_0 */
8002 { "vphaddwq", { XM
, EXxmm
}, 0 },
8004 /* VEX_W_XOP_09_CB_L_0 */
8006 { "vphadddq", { XM
, EXxmm
}, 0 },
8008 /* VEX_W_XOP_09_D1_L_0 */
8010 { "vphaddubw", { XM
, EXxmm
}, 0 },
8012 /* VEX_W_XOP_09_D2_L_0 */
8014 { "vphaddubd", { XM
, EXxmm
}, 0 },
8016 /* VEX_W_XOP_09_D3_L_0 */
8018 { "vphaddubq", { XM
, EXxmm
}, 0 },
8020 /* VEX_W_XOP_09_D6_L_0 */
8022 { "vphadduwd", { XM
, EXxmm
}, 0 },
8024 /* VEX_W_XOP_09_D7_L_0 */
8026 { "vphadduwq", { XM
, EXxmm
}, 0 },
8028 /* VEX_W_XOP_09_DB_L_0 */
8030 { "vphaddudq", { XM
, EXxmm
}, 0 },
8032 /* VEX_W_XOP_09_E1_L_0 */
8034 { "vphsubbw", { XM
, EXxmm
}, 0 },
8036 /* VEX_W_XOP_09_E2_L_0 */
8038 { "vphsubwd", { XM
, EXxmm
}, 0 },
8040 /* VEX_W_XOP_09_E3_L_0 */
8042 { "vphsubdq", { XM
, EXxmm
}, 0 },
8045 #include "i386-dis-evex-w.h"
8048 static const struct dis386 mod_table
[][2] = {
8051 { "bound{S|}", { Gv
, Ma
}, 0 },
8056 { "lesS", { Gv
, Mp
}, 0 },
8057 { VEX_C4_TABLE () },
8061 { "ldsS", { Gv
, Mp
}, 0 },
8062 { VEX_C5_TABLE () },
8065 /* MOD_0F01_REG_0 */
8066 { X86_64_TABLE (X86_64_0F01_REG_0
) },
8067 { RM_TABLE (RM_0F01_REG_0
) },
8070 /* MOD_0F01_REG_1 */
8071 { X86_64_TABLE (X86_64_0F01_REG_1
) },
8072 { RM_TABLE (RM_0F01_REG_1
) },
8075 /* MOD_0F01_REG_2 */
8076 { X86_64_TABLE (X86_64_0F01_REG_2
) },
8077 { RM_TABLE (RM_0F01_REG_2
) },
8080 /* MOD_0F01_REG_3 */
8081 { X86_64_TABLE (X86_64_0F01_REG_3
) },
8082 { RM_TABLE (RM_0F01_REG_3
) },
8085 /* MOD_0F01_REG_5 */
8086 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_0
) },
8087 { RM_TABLE (RM_0F01_REG_5_MOD_3
) },
8090 /* MOD_0F01_REG_7 */
8091 { "invlpg", { Mb
}, 0 },
8092 { RM_TABLE (RM_0F01_REG_7_MOD_3
) },
8095 /* MOD_0F12_PREFIX_0 */
8096 { "%XEVmovlpYX", { XM
, Vex
, EXq
}, 0 },
8097 { "%XEVmovhlpY%XS", { XM
, Vex
, EXq
}, 0 },
8100 /* MOD_0F16_PREFIX_0 */
8101 { "%XEVmovhpYX", { XM
, Vex
, EXq
}, 0 },
8102 { "%XEVmovlhpY%XS", { XM
, Vex
, EXq
}, 0 },
8105 /* MOD_0F18_REG_0 */
8106 { "prefetchnta", { Mb
}, 0 },
8107 { "nopQ", { Ev
}, 0 },
8110 /* MOD_0F18_REG_1 */
8111 { "prefetcht0", { Mb
}, 0 },
8112 { "nopQ", { Ev
}, 0 },
8115 /* MOD_0F18_REG_2 */
8116 { "prefetcht1", { Mb
}, 0 },
8117 { "nopQ", { Ev
}, 0 },
8120 /* MOD_0F18_REG_3 */
8121 { "prefetcht2", { Mb
}, 0 },
8122 { "nopQ", { Ev
}, 0 },
8125 /* MOD_0F18_REG_6 */
8126 { X86_64_TABLE (X86_64_0F18_REG_6_MOD_0
) },
8127 { "nopQ", { Ev
}, 0 },
8130 /* MOD_0F18_REG_7 */
8131 { X86_64_TABLE (X86_64_0F18_REG_7_MOD_0
) },
8132 { "nopQ", { Ev
}, 0 },
8135 /* MOD_0F1A_PREFIX_0 */
8136 { "bndldx", { Gbnd
, Mv_bnd
}, 0 },
8137 { "nopQ", { Ev
}, 0 },
8140 /* MOD_0F1B_PREFIX_0 */
8141 { "bndstx", { Mv_bnd
, Gbnd
}, 0 },
8142 { "nopQ", { Ev
}, 0 },
8145 /* MOD_0F1B_PREFIX_1 */
8146 { "bndmk", { Gbnd
, Mv_bnd
}, 0 },
8147 { "nopQ", { Ev
}, PREFIX_IGNORED
},
8150 /* MOD_0F1C_PREFIX_0 */
8151 { REG_TABLE (REG_0F1C_P_0_MOD_0
) },
8152 { "nopQ", { Ev
}, 0 },
8155 /* MOD_0F1E_PREFIX_1 */
8156 { "nopQ", { Ev
}, PREFIX_IGNORED
},
8157 { REG_TABLE (REG_0F1E_P_1_MOD_3
) },
8160 /* MOD_0FAE_REG_0 */
8161 { "fxsave", { FXSAVE
}, 0 },
8162 { PREFIX_TABLE (PREFIX_0FAE_REG_0_MOD_3
) },
8165 /* MOD_0FAE_REG_1 */
8166 { "fxrstor", { FXSAVE
}, 0 },
8167 { PREFIX_TABLE (PREFIX_0FAE_REG_1_MOD_3
) },
8170 /* MOD_0FAE_REG_2 */
8171 { "ldmxcsr", { Md
}, 0 },
8172 { PREFIX_TABLE (PREFIX_0FAE_REG_2_MOD_3
) },
8175 /* MOD_0FAE_REG_3 */
8176 { "stmxcsr", { Md
}, 0 },
8177 { PREFIX_TABLE (PREFIX_0FAE_REG_3_MOD_3
) },
8180 /* MOD_0FAE_REG_4 */
8181 { PREFIX_TABLE (PREFIX_0FAE_REG_4_MOD_0
) },
8182 { PREFIX_TABLE (PREFIX_0FAE_REG_4_MOD_3
) },
8185 /* MOD_0FAE_REG_5 */
8186 { "xrstor", { FXSAVE
}, PREFIX_OPCODE
| PREFIX_REX2_ILLEGAL
},
8187 { PREFIX_TABLE (PREFIX_0FAE_REG_5_MOD_3
) },
8190 /* MOD_0FAE_REG_6 */
8191 { PREFIX_TABLE (PREFIX_0FAE_REG_6_MOD_0
) },
8192 { PREFIX_TABLE (PREFIX_0FAE_REG_6_MOD_3
) },
8195 /* MOD_0FAE_REG_7 */
8196 { PREFIX_TABLE (PREFIX_0FAE_REG_7_MOD_0
) },
8197 { RM_TABLE (RM_0FAE_REG_7_MOD_3
) },
8200 /* MOD_0FC7_REG_6 */
8201 { PREFIX_TABLE (PREFIX_0FC7_REG_6_MOD_0
) },
8202 { PREFIX_TABLE (PREFIX_0FC7_REG_6_MOD_3
) }
8205 /* MOD_0FC7_REG_7 */
8206 { "vmptrst", { Mq
}, 0 },
8207 { PREFIX_TABLE (PREFIX_0FC7_REG_7_MOD_3
) }
8210 /* MOD_0F38DC_PREFIX_1 */
8211 { "aesenc128kl", { XM
, M
}, 0 },
8212 { "loadiwkey", { XM
, EXx
}, 0 },
8216 { PREFIX_TABLE (PREFIX_0F38F8_M_0
) },
8217 { X86_64_TABLE (X86_64_0F38F8_M_1
) },
8220 /* MOD_VEX_0F3849_X86_64_L_0_W_0 */
8221 { PREFIX_TABLE (PREFIX_VEX_0F3849_X86_64_L_0_W_0_M_0
) },
8222 { PREFIX_TABLE (PREFIX_VEX_0F3849_X86_64_L_0_W_0_M_1
) },
8225 #include "i386-dis-evex-mod.h"
8228 static const struct dis386 rm_table
[][8] = {
8231 { "xabort", { Skip_MODRM
, Ib
}, 0 },
8235 { "xbeginT", { Skip_MODRM
, Jdqw
}, 0 },
8239 { "enclv", { Skip_MODRM
}, 0 },
8240 { "vmcall", { Skip_MODRM
}, 0 },
8241 { "vmlaunch", { Skip_MODRM
}, 0 },
8242 { "vmresume", { Skip_MODRM
}, 0 },
8243 { "vmxoff", { Skip_MODRM
}, 0 },
8244 { "pconfig", { Skip_MODRM
}, 0 },
8245 { PREFIX_TABLE (PREFIX_0F01_REG_0_MOD_3_RM_6
) },
8246 { PREFIX_TABLE (PREFIX_0F01_REG_0_MOD_3_RM_7
) },
8250 { "monitor", { { OP_Monitor
, 0 } }, 0 },
8251 { "mwait", { { OP_Mwait
, 0 } }, 0 },
8252 { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_2
) },
8253 { "stac", { Skip_MODRM
}, 0 },
8254 { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_4
) },
8255 { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_5
) },
8256 { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_6
) },
8257 { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_7
) },
8261 { "xgetbv", { Skip_MODRM
}, 0 },
8262 { "xsetbv", { Skip_MODRM
}, 0 },
8265 { "vmfunc", { Skip_MODRM
}, 0 },
8266 { "xend", { Skip_MODRM
}, 0 },
8267 { "xtest", { Skip_MODRM
}, 0 },
8268 { "enclu", { Skip_MODRM
}, 0 },
8272 { "vmrun", { Skip_MODRM
}, 0 },
8273 { PREFIX_TABLE (PREFIX_0F01_REG_3_RM_1
) },
8274 { "vmload", { Skip_MODRM
}, 0 },
8275 { "vmsave", { Skip_MODRM
}, 0 },
8276 { "stgi", { Skip_MODRM
}, 0 },
8277 { "clgi", { Skip_MODRM
}, 0 },
8278 { "skinit", { Skip_MODRM
}, 0 },
8279 { "invlpga", { Skip_MODRM
}, 0 },
8282 /* RM_0F01_REG_5_MOD_3 */
8283 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_0
) },
8284 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_1
) },
8285 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_2
) },
8287 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_4
) },
8288 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_5
) },
8289 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_6
) },
8290 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_7
) },
8293 /* RM_0F01_REG_7_MOD_3 */
8294 { "swapgs", { Skip_MODRM
}, 0 },
8295 { "rdtscp", { Skip_MODRM
}, 0 },
8296 { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_2
) },
8297 { "mwaitx", { { OP_Mwait
, eBX_reg
} }, PREFIX_OPCODE
},
8298 { "clzero", { Skip_MODRM
}, 0 },
8299 { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_5
) },
8300 { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_6
) },
8301 { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_7
) },
8304 /* RM_0F1E_P_1_MOD_3_REG_7 */
8305 { "nopQ", { Ev
}, PREFIX_IGNORED
},
8306 { "nopQ", { Ev
}, PREFIX_IGNORED
},
8307 { "endbr64", { Skip_MODRM
}, 0 },
8308 { "endbr32", { Skip_MODRM
}, 0 },
8309 { "nopQ", { Ev
}, PREFIX_IGNORED
},
8310 { "nopQ", { Ev
}, PREFIX_IGNORED
},
8311 { "nopQ", { Ev
}, PREFIX_IGNORED
},
8312 { "nopQ", { Ev
}, PREFIX_IGNORED
},
8315 /* RM_0FAE_REG_6_MOD_3 */
8316 { "mfence", { Skip_MODRM
}, 0 },
8319 /* RM_0FAE_REG_7_MOD_3 */
8320 { "sfence", { Skip_MODRM
}, 0 },
8323 /* RM_0F3A0F_P_1_R_0 */
8324 { "hreset", { Skip_MODRM
, Ib
}, 0 },
8327 /* RM_VEX_0F3849_X86_64_L_0_W_0_M_1_P_0_R_0 */
8328 { "tilerelease", { Skip_MODRM
}, 0 },
8331 /* RM_VEX_0F3849_X86_64_L_0_W_0_M_1_P_3 */
8332 { "tilezero", { TMM
, Skip_MODRM
}, 0 },
8336 #define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
8338 /* The values used here must be non-zero, fit in 'unsigned char', and not be
8339 in conflict with actual prefix opcodes. */
8340 #define REP_PREFIX 0x01
8341 #define XACQUIRE_PREFIX 0x02
8342 #define XRELEASE_PREFIX 0x03
8343 #define BND_PREFIX 0x04
8344 #define NOTRACK_PREFIX 0x05
8351 ckprefix (instr_info
*ins
)
8358 /* The maximum instruction length is 15bytes. */
8359 while (length
< MAX_CODE_LENGTH
- 1)
8361 if (!fetch_code (ins
->info
, ins
->codep
+ 1))
8362 return ckp_fetch_error
;
8364 switch (*ins
->codep
)
8366 /* REX prefixes family. */
8383 if (ins
->address_mode
== mode_64bit
)
8384 newrex
= *ins
->codep
;
8387 ins
->last_rex_prefix
= i
;
8389 /* REX2 must be the last prefix. */
8391 if (ins
->address_mode
== mode_64bit
)
8393 if (ins
->last_rex_prefix
>= 0)
8397 if (!fetch_code (ins
->info
, ins
->codep
+ 1))
8398 return ckp_fetch_error
;
8399 ins
->rex2_payload
= *ins
->codep
;
8400 ins
->rex2
= ins
->rex2_payload
>> 4;
8401 ins
->rex
= (ins
->rex2_payload
& 0xf) | REX_OPCODE
;
8403 ins
->last_rex2_prefix
= i
;
8404 ins
->all_prefixes
[i
] = REX2_OPCODE
;
8408 ins
->prefixes
|= PREFIX_REPZ
;
8409 ins
->last_repz_prefix
= i
;
8412 ins
->prefixes
|= PREFIX_REPNZ
;
8413 ins
->last_repnz_prefix
= i
;
8416 ins
->prefixes
|= PREFIX_LOCK
;
8417 ins
->last_lock_prefix
= i
;
8420 ins
->prefixes
|= PREFIX_CS
;
8421 ins
->last_seg_prefix
= i
;
8422 if (ins
->address_mode
!= mode_64bit
)
8423 ins
->active_seg_prefix
= PREFIX_CS
;
8426 ins
->prefixes
|= PREFIX_SS
;
8427 ins
->last_seg_prefix
= i
;
8428 if (ins
->address_mode
!= mode_64bit
)
8429 ins
->active_seg_prefix
= PREFIX_SS
;
8432 ins
->prefixes
|= PREFIX_DS
;
8433 ins
->last_seg_prefix
= i
;
8434 if (ins
->address_mode
!= mode_64bit
)
8435 ins
->active_seg_prefix
= PREFIX_DS
;
8438 ins
->prefixes
|= PREFIX_ES
;
8439 ins
->last_seg_prefix
= i
;
8440 if (ins
->address_mode
!= mode_64bit
)
8441 ins
->active_seg_prefix
= PREFIX_ES
;
8444 ins
->prefixes
|= PREFIX_FS
;
8445 ins
->last_seg_prefix
= i
;
8446 ins
->active_seg_prefix
= PREFIX_FS
;
8449 ins
->prefixes
|= PREFIX_GS
;
8450 ins
->last_seg_prefix
= i
;
8451 ins
->active_seg_prefix
= PREFIX_GS
;
8454 ins
->prefixes
|= PREFIX_DATA
;
8455 ins
->last_data_prefix
= i
;
8458 ins
->prefixes
|= PREFIX_ADDR
;
8459 ins
->last_addr_prefix
= i
;
8462 /* fwait is really an instruction. If there are prefixes
8463 before the fwait, they belong to the fwait, *not* to the
8464 following instruction. */
8465 ins
->fwait_prefix
= i
;
8466 if (ins
->prefixes
|| ins
->rex
)
8468 ins
->prefixes
|= PREFIX_FWAIT
;
8470 /* This ensures that the previous REX prefixes are noticed
8471 as unused prefixes, as in the return case below. */
8472 return ins
->rex
? ckp_bogus
: ckp_okay
;
8474 ins
->prefixes
= PREFIX_FWAIT
;
8479 /* Rex is ignored when followed by another prefix. */
8482 if (*ins
->codep
!= FWAIT_OPCODE
)
8483 ins
->all_prefixes
[i
++] = *ins
->codep
;
8491 /* Return the name of the prefix byte PREF, or NULL if PREF is not a
8495 prefix_name (enum address_mode mode
, uint8_t pref
, int sizeflag
)
8497 static const char *rexes
[16] =
8502 "rex.XB", /* 0x43 */
8504 "rex.RB", /* 0x45 */
8505 "rex.RX", /* 0x46 */
8506 "rex.RXB", /* 0x47 */
8508 "rex.WB", /* 0x49 */
8509 "rex.WX", /* 0x4a */
8510 "rex.WXB", /* 0x4b */
8511 "rex.WR", /* 0x4c */
8512 "rex.WRB", /* 0x4d */
8513 "rex.WRX", /* 0x4e */
8514 "rex.WRXB", /* 0x4f */
8519 /* REX prefixes family. */
8536 return rexes
[pref
- 0x40];
8556 return (sizeflag
& DFLAG
) ? "data16" : "data32";
8558 if (mode
== mode_64bit
)
8559 return (sizeflag
& AFLAG
) ? "addr32" : "addr64";
8561 return (sizeflag
& AFLAG
) ? "addr16" : "addr32";
8566 case XACQUIRE_PREFIX
:
8568 case XRELEASE_PREFIX
:
8572 case NOTRACK_PREFIX
:
8582 print_i386_disassembler_options (FILE *stream
)
8584 fprintf (stream
, _("\n\
8585 The following i386/x86-64 specific disassembler options are supported for use\n\
8586 with the -M switch (multiple options should be separated by commas):\n"));
8588 fprintf (stream
, _(" x86-64 Disassemble in 64bit mode\n"));
8589 fprintf (stream
, _(" i386 Disassemble in 32bit mode\n"));
8590 fprintf (stream
, _(" i8086 Disassemble in 16bit mode\n"));
8591 fprintf (stream
, _(" att Display instruction in AT&T syntax\n"));
8592 fprintf (stream
, _(" intel Display instruction in Intel syntax\n"));
8593 fprintf (stream
, _(" att-mnemonic (AT&T syntax only)\n"
8594 " Display instruction with AT&T mnemonic\n"));
8595 fprintf (stream
, _(" intel-mnemonic (AT&T syntax only)\n"
8596 " Display instruction with Intel mnemonic\n"));
8597 fprintf (stream
, _(" addr64 Assume 64bit address size\n"));
8598 fprintf (stream
, _(" addr32 Assume 32bit address size\n"));
8599 fprintf (stream
, _(" addr16 Assume 16bit address size\n"));
8600 fprintf (stream
, _(" data32 Assume 32bit data size\n"));
8601 fprintf (stream
, _(" data16 Assume 16bit data size\n"));
8602 fprintf (stream
, _(" suffix Always display instruction suffix in AT&T syntax\n"));
8603 fprintf (stream
, _(" amd64 Display instruction in AMD64 ISA\n"));
8604 fprintf (stream
, _(" intel64 Display instruction in Intel64 ISA\n"));
8608 static const struct dis386 bad_opcode
= { "(bad)", { XX
}, 0 };
8610 /* Fetch error indicator. */
8611 static const struct dis386 err_opcode
= { NULL
, { XX
}, 0 };
8613 static const struct dis386 map7_f8_opcode
= { VEX_LEN_TABLE (VEX_LEN_MAP7_F8
) };
8615 /* Get a pointer to struct dis386 with a valid name. */
8617 static const struct dis386
*
8618 get_valid_dis386 (const struct dis386
*dp
, instr_info
*ins
)
8620 int vindex
, vex_table_index
;
8622 if (dp
->name
!= NULL
)
8625 switch (dp
->op
[0].bytemode
)
8628 dp
= ®_table
[dp
->op
[1].bytemode
][ins
->modrm
.reg
];
8632 vindex
= ins
->modrm
.mod
== 0x3 ? 1 : 0;
8633 dp
= &mod_table
[dp
->op
[1].bytemode
][vindex
];
8637 dp
= &rm_table
[dp
->op
[1].bytemode
][ins
->modrm
.rm
];
8640 case USE_PREFIX_TABLE
:
8644 /* The prefix in VEX is implicit. */
8645 switch (ins
->vex
.prefix
)
8650 case REPE_PREFIX_OPCODE
:
8653 case DATA_PREFIX_OPCODE
:
8656 case REPNE_PREFIX_OPCODE
:
8666 int last_prefix
= -1;
8669 /* We check PREFIX_REPNZ and PREFIX_REPZ before PREFIX_DATA.
8670 When there are multiple PREFIX_REPNZ and PREFIX_REPZ, the
8672 if ((ins
->prefixes
& (PREFIX_REPZ
| PREFIX_REPNZ
)) != 0)
8674 if (ins
->last_repz_prefix
> ins
->last_repnz_prefix
)
8677 prefix
= PREFIX_REPZ
;
8678 last_prefix
= ins
->last_repz_prefix
;
8683 prefix
= PREFIX_REPNZ
;
8684 last_prefix
= ins
->last_repnz_prefix
;
8687 /* Check if prefix should be ignored. */
8688 if ((((prefix_table
[dp
->op
[1].bytemode
][vindex
].prefix_requirement
8689 & PREFIX_IGNORED
) >> PREFIX_IGNORED_SHIFT
)
8691 && !prefix_table
[dp
->op
[1].bytemode
][vindex
].name
)
8695 if (vindex
== 0 && (ins
->prefixes
& PREFIX_DATA
) != 0)
8698 prefix
= PREFIX_DATA
;
8699 last_prefix
= ins
->last_data_prefix
;
8704 ins
->used_prefixes
|= prefix
;
8705 ins
->all_prefixes
[last_prefix
] = 0;
8708 dp
= &prefix_table
[dp
->op
[1].bytemode
][vindex
];
8711 case USE_X86_64_EVEX_FROM_VEX_TABLE
:
8712 case USE_X86_64_EVEX_PFX_TABLE
:
8713 case USE_X86_64_EVEX_W_TABLE
:
8714 case USE_X86_64_EVEX_MEM_W_TABLE
:
8715 ins
->evex_type
= evex_from_vex
;
8716 /* EVEX from VEX instructions are 64-bit only and require that EVEX.z,
8717 EVEX.L'L, EVEX.b, and the lower 2 bits of EVEX.aaa must be 0. */
8718 if (ins
->address_mode
!= mode_64bit
8719 || (ins
->vex
.mask_register_specifier
& 0x3) != 0
8721 || ins
->vex
.zeroing
!= 0
8725 if (dp
->op
[0].bytemode
== USE_X86_64_EVEX_PFX_TABLE
)
8726 goto use_prefix_table
;
8727 if (dp
->op
[0].bytemode
== USE_X86_64_EVEX_W_TABLE
)
8728 goto use_vex_w_table
;
8729 if (dp
->op
[0].bytemode
== USE_X86_64_EVEX_MEM_W_TABLE
)
8731 if (ins
->modrm
.mod
== 3)
8733 goto use_vex_w_table
;
8737 case USE_X86_64_TABLE
:
8738 vindex
= ins
->address_mode
== mode_64bit
? 1 : 0;
8739 dp
= &x86_64_table
[dp
->op
[1].bytemode
][vindex
];
8742 case USE_3BYTE_TABLE
:
8743 if (ins
->last_rex2_prefix
>= 0)
8745 if (!fetch_code (ins
->info
, ins
->codep
+ 2))
8747 vindex
= *ins
->codep
++;
8748 dp
= &three_byte_table
[dp
->op
[1].bytemode
][vindex
];
8749 ins
->end_codep
= ins
->codep
;
8750 if (!fetch_modrm (ins
))
8754 case USE_VEX_LEN_TABLE
:
8758 switch (ins
->vex
.length
)
8764 /* This allows re-using in particular table entries where only
8765 128-bit operand size (VEX.L=0 / EVEX.L'L=0) are valid. */
8778 dp
= &vex_len_table
[dp
->op
[1].bytemode
][vindex
];
8781 case USE_EVEX_LEN_TABLE
:
8785 switch (ins
->vex
.length
)
8801 dp
= &evex_len_table
[dp
->op
[1].bytemode
][vindex
];
8804 case USE_XOP_8F_TABLE
:
8805 if (!fetch_code (ins
->info
, ins
->codep
+ 3))
8807 ins
->rex
= ~(*ins
->codep
>> 5) & 0x7;
8809 /* VEX_TABLE_INDEX is the mmmmm part of the XOP byte 1 "RCB.mmmmm". */
8810 switch ((*ins
->codep
& 0x1f))
8816 vex_table_index
= XOP_08
;
8819 vex_table_index
= XOP_09
;
8822 vex_table_index
= XOP_0A
;
8826 ins
->vex
.w
= *ins
->codep
& 0x80;
8827 if (ins
->vex
.w
&& ins
->address_mode
== mode_64bit
)
8830 ins
->vex
.register_specifier
= (~(*ins
->codep
>> 3)) & 0xf;
8831 if (ins
->address_mode
!= mode_64bit
)
8833 /* In 16/32-bit mode REX_B is silently ignored. */
8837 ins
->vex
.length
= (*ins
->codep
& 0x4) ? 256 : 128;
8838 switch ((*ins
->codep
& 0x3))
8843 ins
->vex
.prefix
= DATA_PREFIX_OPCODE
;
8846 ins
->vex
.prefix
= REPE_PREFIX_OPCODE
;
8849 ins
->vex
.prefix
= REPNE_PREFIX_OPCODE
;
8854 vindex
= *ins
->codep
++;
8855 dp
= &xop_table
[vex_table_index
][vindex
];
8857 ins
->end_codep
= ins
->codep
;
8858 if (!fetch_modrm (ins
))
8861 /* No XOP encoding so far allows for a non-zero embedded prefix. Avoid
8862 having to decode the bits for every otherwise valid encoding. */
8863 if (ins
->vex
.prefix
)
8867 case USE_VEX_C4_TABLE
:
8869 if (!fetch_code (ins
->info
, ins
->codep
+ 3))
8871 ins
->rex
= ~(*ins
->codep
>> 5) & 0x7;
8872 switch ((*ins
->codep
& 0x1f))
8878 vex_table_index
= VEX_0F
;
8881 vex_table_index
= VEX_0F38
;
8884 vex_table_index
= VEX_0F3A
;
8887 vex_table_index
= VEX_MAP7
;
8891 ins
->vex
.w
= *ins
->codep
& 0x80;
8892 if (ins
->address_mode
== mode_64bit
)
8899 /* For the 3-byte VEX prefix in 32-bit mode, the REX_B bit
8900 is ignored, other REX bits are 0 and the highest bit in
8901 VEX.vvvv is also ignored (but we mustn't clear it here). */
8904 ins
->vex
.register_specifier
= (~(*ins
->codep
>> 3)) & 0xf;
8905 ins
->vex
.length
= (*ins
->codep
& 0x4) ? 256 : 128;
8906 switch ((*ins
->codep
& 0x3))
8911 ins
->vex
.prefix
= DATA_PREFIX_OPCODE
;
8914 ins
->vex
.prefix
= REPE_PREFIX_OPCODE
;
8917 ins
->vex
.prefix
= REPNE_PREFIX_OPCODE
;
8922 vindex
= *ins
->codep
++;
8923 ins
->condition_code
= vindex
& 0xf;
8924 if (vex_table_index
!= VEX_MAP7
)
8925 dp
= &vex_table
[vex_table_index
][vindex
];
8926 else if (vindex
== 0xf8)
8927 dp
= &map7_f8_opcode
;
8930 ins
->end_codep
= ins
->codep
;
8931 /* There is no MODRM byte for VEX0F 77. */
8932 if ((vex_table_index
!= VEX_0F
|| vindex
!= 0x77)
8933 && !fetch_modrm (ins
))
8937 case USE_VEX_C5_TABLE
:
8939 if (!fetch_code (ins
->info
, ins
->codep
+ 2))
8941 ins
->rex
= (*ins
->codep
& 0x80) ? 0 : REX_R
;
8943 /* For the 2-byte VEX prefix in 32-bit mode, the highest bit in
8945 ins
->vex
.register_specifier
= (~(*ins
->codep
>> 3)) & 0xf;
8946 ins
->vex
.length
= (*ins
->codep
& 0x4) ? 256 : 128;
8947 switch ((*ins
->codep
& 0x3))
8952 ins
->vex
.prefix
= DATA_PREFIX_OPCODE
;
8955 ins
->vex
.prefix
= REPE_PREFIX_OPCODE
;
8958 ins
->vex
.prefix
= REPNE_PREFIX_OPCODE
;
8963 vindex
= *ins
->codep
++;
8964 dp
= &vex_table
[VEX_0F
][vindex
];
8965 ins
->end_codep
= ins
->codep
;
8966 /* There is no MODRM byte for VEX 77. */
8967 if (vindex
!= 0x77 && !fetch_modrm (ins
))
8971 case USE_VEX_W_TABLE
:
8976 dp
= &vex_w_table
[dp
->op
[1].bytemode
][ins
->vex
.w
];
8979 case USE_EVEX_TABLE
:
8980 ins
->two_source_ops
= false;
8982 ins
->vex
.evex
= true;
8983 if (!fetch_code (ins
->info
, ins
->codep
+ 4))
8985 /* The first byte after 0x62. */
8986 if (*ins
->codep
& 0x8)
8988 if (!(*ins
->codep
& 0x10))
8991 ins
->rex
= ~(*ins
->codep
>> 5) & 0x7;
8992 switch (*ins
->codep
& 0x7)
8997 vex_table_index
= EVEX_0F
;
9000 vex_table_index
= EVEX_0F38
;
9003 vex_table_index
= EVEX_0F3A
;
9006 vex_table_index
= EVEX_MAP4
;
9007 ins
->evex_type
= evex_from_legacy
;
9008 if (ins
->address_mode
!= mode_64bit
)
9010 ins
->rex
|= REX_OPCODE
;
9013 vex_table_index
= EVEX_MAP5
;
9016 vex_table_index
= EVEX_MAP6
;
9019 vex_table_index
= EVEX_MAP7
;
9023 /* The second byte after 0x62. */
9025 ins
->vex
.w
= *ins
->codep
& 0x80;
9026 if (ins
->vex
.w
&& ins
->address_mode
== mode_64bit
)
9029 ins
->vex
.register_specifier
= (~(*ins
->codep
>> 3)) & 0xf;
9031 if (!(*ins
->codep
& 0x4))
9034 switch ((*ins
->codep
& 0x3))
9039 ins
->vex
.prefix
= DATA_PREFIX_OPCODE
;
9042 ins
->vex
.prefix
= REPE_PREFIX_OPCODE
;
9045 ins
->vex
.prefix
= REPNE_PREFIX_OPCODE
;
9049 /* The third byte after 0x62. */
9052 /* Remember the static rounding bits. */
9053 ins
->vex
.ll
= (*ins
->codep
>> 5) & 3;
9054 ins
->vex
.b
= *ins
->codep
& 0x10;
9056 ins
->vex
.v
= *ins
->codep
& 0x8;
9057 ins
->vex
.mask_register_specifier
= *ins
->codep
& 0x7;
9058 ins
->vex
.scc
= *ins
->codep
& 0xf;
9059 ins
->vex
.zeroing
= *ins
->codep
& 0x80;
9060 /* Set the NF bit for EVEX-Promoted instructions, this bit will be cleared
9061 when it's an evex_default one. */
9062 ins
->vex
.nf
= *ins
->codep
& 0x4;
9064 if (ins
->address_mode
!= mode_64bit
)
9066 /* Report bad for !evex_default and when two fixed values of evex
9068 if (ins
->evex_type
!= evex_default
9069 || (ins
->rex2
& (REX_B
| REX_X
)))
9071 /* In 16/32-bit mode silently ignore following bits. */
9073 ins
->rex2
&= ~REX_R
;
9079 vindex
= *ins
->codep
++;
9080 ins
->condition_code
= vindex
& 0xf;
9081 if (vex_table_index
!= EVEX_MAP7
)
9082 dp
= &evex_table
[vex_table_index
][vindex
];
9083 else if (vindex
== 0xf8)
9084 dp
= &map7_f8_opcode
;
9087 ins
->end_codep
= ins
->codep
;
9088 if (!fetch_modrm (ins
))
9091 if (ins
->modrm
.mod
== 3 && (ins
->rex2
& REX_X
))
9094 /* Set vector length. For EVEX-promoted instructions, evex.ll == 0b00,
9095 which has the same encoding as vex.length == 128 and they can share
9096 the same processing with vex.length in OP_VEX. */
9097 if (ins
->modrm
.mod
== 3 && ins
->vex
.b
&& ins
->evex_type
!= evex_from_legacy
)
9098 ins
->vex
.length
= 512;
9101 switch (ins
->vex
.ll
)
9104 ins
->vex
.length
= 128;
9107 ins
->vex
.length
= 256;
9110 ins
->vex
.length
= 512;
9126 if (dp
->name
!= NULL
)
9129 return get_valid_dis386 (dp
, ins
);
9133 get_sib (instr_info
*ins
, int sizeflag
)
9135 /* If modrm.mod == 3, operand must be register. */
9137 && ((sizeflag
& AFLAG
) || ins
->address_mode
== mode_64bit
)
9138 && ins
->modrm
.mod
!= 3
9139 && ins
->modrm
.rm
== 4)
9141 if (!fetch_code (ins
->info
, ins
->codep
+ 2))
9143 ins
->sib
.index
= (ins
->codep
[1] >> 3) & 7;
9144 ins
->sib
.scale
= (ins
->codep
[1] >> 6) & 3;
9145 ins
->sib
.base
= ins
->codep
[1] & 7;
9146 ins
->has_sib
= true;
9149 ins
->has_sib
= false;
9154 /* Like oappend_with_style (below) but always with text style. */
9157 oappend (instr_info
*ins
, const char *s
)
9159 oappend_with_style (ins
, s
, dis_style_text
);
9162 /* Like oappend (above), but S is a string starting with '%'. In
9163 Intel syntax, the '%' is elided. */
9166 oappend_register (instr_info
*ins
, const char *s
)
9168 oappend_with_style (ins
, s
+ ins
->intel_syntax
, dis_style_register
);
9171 /* Wrap around a call to INS->info->fprintf_styled_func, printing FMT.
9172 STYLE is the default style to use in the fprintf_styled_func calls,
9173 however, FMT might include embedded style markers (see oappend_style),
9174 these embedded markers are not printed, but instead change the style
9175 used in the next fprintf_styled_func call. */
9177 static void ATTRIBUTE_PRINTF_3
9178 i386_dis_printf (const disassemble_info
*info
, enum disassembler_style style
,
9179 const char *fmt
, ...)
9182 enum disassembler_style curr_style
= style
;
9183 const char *start
, *curr
;
9184 char staging_area
[50];
9187 /* In particular print_insn()'s processing of op_txt[] can hand rather long
9188 strings here. Bypass vsnprintf() in such cases to avoid capacity issues
9189 with the staging area. */
9190 if (strcmp (fmt
, "%s"))
9192 int res
= vsnprintf (staging_area
, sizeof (staging_area
), fmt
, ap
);
9199 if ((size_t) res
>= sizeof (staging_area
))
9202 start
= curr
= staging_area
;
9206 start
= curr
= va_arg (ap
, const char *);
9213 || (*curr
== STYLE_MARKER_CHAR
9214 && ISXDIGIT (*(curr
+ 1))
9215 && *(curr
+ 2) == STYLE_MARKER_CHAR
))
9217 /* Output content between our START position and CURR. */
9218 int len
= curr
- start
;
9219 int n
= (*info
->fprintf_styled_func
) (info
->stream
, curr_style
,
9220 "%.*s", len
, start
);
9227 /* Skip over the initial STYLE_MARKER_CHAR. */
9230 /* Update the CURR_STYLE. As there are less than 16 styles, it
9231 is possible, that if the input is corrupted in some way, that
9232 we might set CURR_STYLE to an invalid value. Don't worry
9233 though, we check for this situation. */
9234 if (*curr
>= '0' && *curr
<= '9')
9235 curr_style
= (enum disassembler_style
) (*curr
- '0');
9236 else if (*curr
>= 'a' && *curr
<= 'f')
9237 curr_style
= (enum disassembler_style
) (*curr
- 'a' + 10);
9239 curr_style
= dis_style_text
;
9241 /* Check for an invalid style having been selected. This should
9242 never happen, but it doesn't hurt to be a little paranoid. */
9243 if (curr_style
> dis_style_comment_start
)
9244 curr_style
= dis_style_text
;
9246 /* Skip the hex character, and the closing STYLE_MARKER_CHAR. */
9249 /* Reset the START to after the style marker. */
9259 print_insn (bfd_vma pc
, disassemble_info
*info
, int intel_syntax
)
9261 const struct dis386
*dp
;
9264 char *op_txt
[MAX_OPERANDS
];
9266 bool intel_swap_2_3
;
9267 int sizeflag
, orig_sizeflag
;
9269 struct dis_private priv
;
9274 .intel_syntax
= intel_syntax
>= 0
9276 : (info
->mach
& bfd_mach_i386_intel_syntax
) != 0,
9277 .intel_mnemonic
= !SYSV386_COMPAT
,
9278 .op_index
[0 ... MAX_OPERANDS
- 1] = -1,
9280 .start_codep
= priv
.the_buffer
,
9281 .codep
= priv
.the_buffer
,
9283 .last_lock_prefix
= -1,
9284 .last_repz_prefix
= -1,
9285 .last_repnz_prefix
= -1,
9286 .last_data_prefix
= -1,
9287 .last_addr_prefix
= -1,
9288 .last_rex_prefix
= -1,
9289 .last_rex2_prefix
= -1,
9290 .last_seg_prefix
= -1,
9293 char op_out
[MAX_OPERANDS
][MAX_OPERAND_BUFFER_SIZE
];
9295 priv
.orig_sizeflag
= AFLAG
| DFLAG
;
9296 if ((info
->mach
& bfd_mach_i386_i386
) != 0)
9297 ins
.address_mode
= mode_32bit
;
9298 else if (info
->mach
== bfd_mach_i386_i8086
)
9300 ins
.address_mode
= mode_16bit
;
9301 priv
.orig_sizeflag
= 0;
9304 ins
.address_mode
= mode_64bit
;
9306 for (p
= info
->disassembler_options
; p
!= NULL
;)
9308 if (startswith (p
, "amd64"))
9310 else if (startswith (p
, "intel64"))
9311 ins
.isa64
= intel64
;
9312 else if (startswith (p
, "x86-64"))
9314 ins
.address_mode
= mode_64bit
;
9315 priv
.orig_sizeflag
|= AFLAG
| DFLAG
;
9317 else if (startswith (p
, "i386"))
9319 ins
.address_mode
= mode_32bit
;
9320 priv
.orig_sizeflag
|= AFLAG
| DFLAG
;
9322 else if (startswith (p
, "i8086"))
9324 ins
.address_mode
= mode_16bit
;
9325 priv
.orig_sizeflag
&= ~(AFLAG
| DFLAG
);
9327 else if (startswith (p
, "intel"))
9329 if (startswith (p
+ 5, "-mnemonic"))
9330 ins
.intel_mnemonic
= true;
9332 ins
.intel_syntax
= 1;
9334 else if (startswith (p
, "att"))
9336 ins
.intel_syntax
= 0;
9337 if (startswith (p
+ 3, "-mnemonic"))
9338 ins
.intel_mnemonic
= false;
9340 else if (startswith (p
, "addr"))
9342 if (ins
.address_mode
== mode_64bit
)
9344 if (p
[4] == '3' && p
[5] == '2')
9345 priv
.orig_sizeflag
&= ~AFLAG
;
9346 else if (p
[4] == '6' && p
[5] == '4')
9347 priv
.orig_sizeflag
|= AFLAG
;
9351 if (p
[4] == '1' && p
[5] == '6')
9352 priv
.orig_sizeflag
&= ~AFLAG
;
9353 else if (p
[4] == '3' && p
[5] == '2')
9354 priv
.orig_sizeflag
|= AFLAG
;
9357 else if (startswith (p
, "data"))
9359 if (p
[4] == '1' && p
[5] == '6')
9360 priv
.orig_sizeflag
&= ~DFLAG
;
9361 else if (p
[4] == '3' && p
[5] == '2')
9362 priv
.orig_sizeflag
|= DFLAG
;
9364 else if (startswith (p
, "suffix"))
9365 priv
.orig_sizeflag
|= SUFFIX_ALWAYS
;
9367 p
= strchr (p
, ',');
9372 if (ins
.address_mode
== mode_64bit
&& sizeof (bfd_vma
) < 8)
9374 i386_dis_printf (info
, dis_style_text
, _("64-bit address is disabled"));
9378 if (ins
.intel_syntax
)
9380 ins
.open_char
= '[';
9381 ins
.close_char
= ']';
9382 ins
.separator_char
= '+';
9383 ins
.scale_char
= '*';
9387 ins
.open_char
= '(';
9388 ins
.close_char
= ')';
9389 ins
.separator_char
= ',';
9390 ins
.scale_char
= ',';
9393 /* The output looks better if we put 7 bytes on a line, since that
9394 puts most long word instructions on a single line. */
9395 info
->bytes_per_line
= 7;
9397 info
->private_data
= &priv
;
9399 priv
.insn_start
= pc
;
9401 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
9404 ins
.op_out
[i
] = op_out
[i
];
9407 sizeflag
= priv
.orig_sizeflag
;
9409 switch (ckprefix (&ins
))
9415 /* Too many prefixes or unused REX prefixes. */
9417 i
< (int) ARRAY_SIZE (ins
.all_prefixes
) && ins
.all_prefixes
[i
];
9419 i386_dis_printf (info
, dis_style_mnemonic
, "%s%s",
9420 (i
== 0 ? "" : " "),
9421 prefix_name (ins
.address_mode
, ins
.all_prefixes
[i
],
9426 case ckp_fetch_error
:
9427 goto fetch_error_out
;
9430 ins
.nr_prefixes
= ins
.codep
- ins
.start_codep
;
9432 if (!fetch_code (info
, ins
.codep
+ 1))
9435 ret
= fetch_error (&ins
);
9439 ins
.two_source_ops
= (*ins
.codep
== 0x62 || *ins
.codep
== 0xc8);
9441 if ((ins
.prefixes
& PREFIX_FWAIT
)
9442 && (*ins
.codep
< 0xd8 || *ins
.codep
> 0xdf))
9444 /* Handle ins.prefixes before fwait. */
9445 for (i
= 0; i
< ins
.fwait_prefix
&& ins
.all_prefixes
[i
];
9447 i386_dis_printf (info
, dis_style_mnemonic
, "%s ",
9448 prefix_name (ins
.address_mode
, ins
.all_prefixes
[i
],
9450 i386_dis_printf (info
, dis_style_mnemonic
, "fwait");
9455 /* REX2.M in rex2 prefix represents map0 or map1. */
9456 if (ins
.last_rex2_prefix
< 0 ? *ins
.codep
== 0x0f : (ins
.rex2
& REX2_M
))
9461 if (!fetch_code (info
, ins
.codep
+ 1))
9462 goto fetch_error_out
;
9465 dp
= &dis386_twobyte
[*ins
.codep
];
9466 ins
.need_modrm
= twobyte_has_modrm
[*ins
.codep
];
9470 dp
= &dis386
[*ins
.codep
];
9471 ins
.need_modrm
= onebyte_has_modrm
[*ins
.codep
];
9473 ins
.condition_code
= *ins
.codep
& 0xf;
9476 /* Save sizeflag for printing the extra ins.prefixes later before updating
9477 it for mnemonic and operand processing. The prefix names depend
9478 only on the address mode. */
9479 orig_sizeflag
= sizeflag
;
9480 if (ins
.prefixes
& PREFIX_ADDR
)
9482 if ((ins
.prefixes
& PREFIX_DATA
))
9485 ins
.end_codep
= ins
.codep
;
9486 if (ins
.need_modrm
&& !fetch_modrm (&ins
))
9487 goto fetch_error_out
;
9489 if (dp
->name
== NULL
&& dp
->op
[0].bytemode
== FLOATCODE
)
9491 if (!get_sib (&ins
, sizeflag
)
9492 || !dofloat (&ins
, sizeflag
))
9493 goto fetch_error_out
;
9497 dp
= get_valid_dis386 (dp
, &ins
);
9498 if (dp
== &err_opcode
)
9499 goto fetch_error_out
;
9501 /* For APX instructions promoted from legacy maps 0/1, embedded prefix
9502 is interpreted as the operand size override. */
9503 if (ins
.evex_type
== evex_from_legacy
9504 && ins
.vex
.prefix
== DATA_PREFIX_OPCODE
)
9507 if(ins
.evex_type
== evex_default
)
9510 /* For EVEX-promoted formats, we need to clear EVEX.NF (ccmp and ctest
9511 are cleared separately.) in mask_register_specifier and keep the low
9512 2 bits of mask_register_specifier to report errors for invalid cases
9514 ins
.vex
.mask_register_specifier
&= 0x3;
9516 if (dp
!= NULL
&& putop (&ins
, dp
->name
, sizeflag
) == 0)
9518 if (!get_sib (&ins
, sizeflag
))
9519 goto fetch_error_out
;
9520 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
9522 ins
.obufp
= ins
.op_out
[i
];
9523 ins
.op_ad
= MAX_OPERANDS
- 1 - i
;
9525 && !dp
->op
[i
].rtn (&ins
, dp
->op
[i
].bytemode
, sizeflag
))
9526 goto fetch_error_out
;
9527 /* For EVEX instruction after the last operand masking
9528 should be printed. */
9529 if (i
== 0 && ins
.vex
.evex
)
9531 /* Don't print {%k0}. */
9532 if (ins
.vex
.mask_register_specifier
)
9534 const char *reg_name
9535 = att_names_mask
[ins
.vex
.mask_register_specifier
];
9537 oappend (&ins
, "{");
9538 oappend_register (&ins
, reg_name
);
9539 oappend (&ins
, "}");
9541 if (ins
.vex
.zeroing
)
9542 oappend (&ins
, "{z}");
9544 else if (ins
.vex
.zeroing
)
9546 oappend (&ins
, "{bad}");
9550 /* Instructions with a mask register destination allow for
9551 zeroing-masking only (if any masking at all), which is
9552 _not_ expressed by EVEX.z. */
9553 if (ins
.vex
.zeroing
&& dp
->op
[0].bytemode
== mask_mode
)
9554 ins
.illegal_masking
= true;
9556 /* S/G insns require a mask and don't allow
9558 if ((dp
->op
[0].bytemode
== vex_vsib_d_w_dq_mode
9559 || dp
->op
[0].bytemode
== vex_vsib_q_w_dq_mode
)
9560 && (ins
.vex
.mask_register_specifier
== 0
9561 || ins
.vex
.zeroing
))
9562 ins
.illegal_masking
= true;
9564 if (ins
.illegal_masking
)
9565 oappend (&ins
, "/(bad)");
9568 /* vex.nf is cleared after being consumed. */
9570 oappend (&ins
, "{bad-nf}");
9572 /* Check whether rounding control was enabled for an insn not
9573 supporting it, when evex.b is not treated as evex.nd. */
9574 if (ins
.modrm
.mod
== 3 && ins
.vex
.b
&& ins
.evex_type
== evex_default
9575 && !(ins
.evex_used
& EVEX_b_used
))
9577 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
9579 ins
.obufp
= ins
.op_out
[i
];
9582 oappend (&ins
, names_rounding
[ins
.vex
.ll
]);
9583 oappend (&ins
, "bad}");
9590 /* Clear instruction information. */
9591 info
->insn_info_valid
= 0;
9592 info
->branch_delay_insns
= 0;
9593 info
->data_size
= 0;
9594 info
->insn_type
= dis_noninsn
;
9598 /* Reset jump operation indicator. */
9599 ins
.op_is_jump
= false;
9601 int jump_detection
= 0;
9603 /* Extract flags. */
9604 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
9606 if ((dp
->op
[i
].rtn
== OP_J
)
9607 || (dp
->op
[i
].rtn
== OP_indirE
))
9608 jump_detection
|= 1;
9609 else if ((dp
->op
[i
].rtn
== BND_Fixup
)
9610 || (!dp
->op
[i
].rtn
&& !dp
->op
[i
].bytemode
))
9611 jump_detection
|= 2;
9612 else if ((dp
->op
[i
].bytemode
== cond_jump_mode
)
9613 || (dp
->op
[i
].bytemode
== loop_jcxz_mode
))
9614 jump_detection
|= 4;
9617 /* Determine if this is a jump or branch. */
9618 if ((jump_detection
& 0x3) == 0x3)
9620 ins
.op_is_jump
= true;
9621 if (jump_detection
& 0x4)
9622 info
->insn_type
= dis_condbranch
;
9624 info
->insn_type
= (dp
->name
&& !strncmp (dp
->name
, "call", 4))
9625 ? dis_jsr
: dis_branch
;
9628 /* The purpose of placing the check here is to wait for the EVEX prefix for
9629 conditional CMP and TEST to be consumed and cleared, and then make a
9630 unified judgment. Because they are both in map4, we can not distinguish
9631 EVEX prefix for conditional CMP and TEST from others during the
9632 EVEX prefix stage of parsing. */
9633 if (ins
.evex_type
== evex_from_legacy
)
9635 /* EVEX from legacy instructions, when the EVEX.ND bit is 0,
9636 all bits of EVEX.vvvv and EVEX.V' must be 1. */
9637 if (!ins
.vex
.nd
&& (ins
.vex
.register_specifier
|| !ins
.vex
.v
))
9639 i386_dis_printf (info
, dis_style_text
, "(bad)");
9640 ret
= ins
.end_codep
- priv
.the_buffer
;
9644 /* EVEX from legacy instructions require that EVEX.z, EVEX.L’L and the
9645 lower 2 bits of EVEX.aaa must be 0. */
9646 if ((ins
.vex
.mask_register_specifier
& 0x3) != 0
9647 || ins
.vex
.ll
!= 0 || ins
.vex
.zeroing
!= 0)
9649 i386_dis_printf (info
, dis_style_text
, "(bad)");
9650 ret
= ins
.end_codep
- priv
.the_buffer
;
9654 /* If VEX.vvvv and EVEX.vvvv are unused, they must be all 1s, which
9655 are all 0s in inverted form. */
9656 if (ins
.need_vex
&& ins
.vex
.register_specifier
!= 0)
9658 i386_dis_printf (info
, dis_style_text
, "(bad)");
9659 ret
= ins
.end_codep
- priv
.the_buffer
;
9663 if ((dp
->prefix_requirement
& PREFIX_REX2_ILLEGAL
)
9664 && ins
.last_rex2_prefix
>= 0 && (ins
.rex2
& REX2_SPECIAL
) == 0)
9666 i386_dis_printf (info
, dis_style_text
, "(bad)");
9667 ret
= ins
.end_codep
- priv
.the_buffer
;
9671 switch (dp
->prefix_requirement
& ~PREFIX_REX2_ILLEGAL
)
9674 /* If only the data prefix is marked as mandatory, its absence renders
9675 the encoding invalid. Most other PREFIX_OPCODE rules still apply. */
9676 if (ins
.need_vex
? !ins
.vex
.prefix
: !(ins
.prefixes
& PREFIX_DATA
))
9678 i386_dis_printf (info
, dis_style_text
, "(bad)");
9679 ret
= ins
.end_codep
- priv
.the_buffer
;
9682 ins
.used_prefixes
|= PREFIX_DATA
;
9685 /* If the mandatory PREFIX_REPZ/PREFIX_REPNZ/PREFIX_DATA prefix is
9686 unused, opcode is invalid. Since the PREFIX_DATA prefix may be
9687 used by putop and MMX/SSE operand and may be overridden by the
9688 PREFIX_REPZ/PREFIX_REPNZ fix, we check the PREFIX_DATA prefix
9691 ? ins
.vex
.prefix
== REPE_PREFIX_OPCODE
9692 || ins
.vex
.prefix
== REPNE_PREFIX_OPCODE
9694 & (PREFIX_REPZ
| PREFIX_REPNZ
)) != 0)
9695 && (ins
.used_prefixes
9696 & (PREFIX_REPZ
| PREFIX_REPNZ
)) == 0)
9698 ? ins
.vex
.prefix
== DATA_PREFIX_OPCODE
9700 & (PREFIX_REPZ
| PREFIX_REPNZ
| PREFIX_DATA
))
9702 && (ins
.used_prefixes
& PREFIX_DATA
) == 0))
9703 || (ins
.vex
.evex
&& dp
->prefix_requirement
!= PREFIX_DATA
9704 && !ins
.vex
.w
!= !(ins
.used_prefixes
& PREFIX_DATA
)))
9706 i386_dis_printf (info
, dis_style_text
, "(bad)");
9707 ret
= ins
.end_codep
- priv
.the_buffer
;
9712 case PREFIX_IGNORED
:
9713 /* Zap data size and rep prefixes from used_prefixes and reinstate their
9714 origins in all_prefixes. */
9715 ins
.used_prefixes
&= ~PREFIX_OPCODE
;
9716 if (ins
.last_data_prefix
>= 0)
9717 ins
.all_prefixes
[ins
.last_data_prefix
] = 0x66;
9718 if (ins
.last_repz_prefix
>= 0)
9719 ins
.all_prefixes
[ins
.last_repz_prefix
] = 0xf3;
9720 if (ins
.last_repnz_prefix
>= 0)
9721 ins
.all_prefixes
[ins
.last_repnz_prefix
] = 0xf2;
9724 case PREFIX_NP_OR_DATA
:
9725 if (ins
.vex
.prefix
== REPE_PREFIX_OPCODE
9726 || ins
.vex
.prefix
== REPNE_PREFIX_OPCODE
)
9728 i386_dis_printf (info
, dis_style_text
, "(bad)");
9729 ret
= ins
.end_codep
- priv
.the_buffer
;
9737 i386_dis_printf (info
, dis_style_text
, "(bad)");
9738 ret
= ins
.end_codep
- priv
.the_buffer
;
9744 /* Check if the REX prefix is used. */
9745 if ((ins
.rex
^ ins
.rex_used
) == 0
9746 && !ins
.need_vex
&& ins
.last_rex_prefix
>= 0)
9747 ins
.all_prefixes
[ins
.last_rex_prefix
] = 0;
9749 /* Check if the REX2 prefix is used. */
9750 if (ins
.last_rex2_prefix
>= 0
9751 && ((ins
.rex2
& REX2_SPECIAL
)
9752 || (((ins
.rex2
& 7) ^ (ins
.rex2_used
& 7)) == 0
9753 && (ins
.rex
^ ins
.rex_used
) == 0
9754 && (ins
.rex2
& 7))))
9755 ins
.all_prefixes
[ins
.last_rex2_prefix
] = 0;
9757 /* Check if the SEG prefix is used. */
9758 if ((ins
.prefixes
& (PREFIX_CS
| PREFIX_SS
| PREFIX_DS
| PREFIX_ES
9759 | PREFIX_FS
| PREFIX_GS
)) != 0
9760 && (ins
.used_prefixes
& ins
.active_seg_prefix
) != 0)
9761 ins
.all_prefixes
[ins
.last_seg_prefix
] = 0;
9763 /* Check if the ADDR prefix is used. */
9764 if ((ins
.prefixes
& PREFIX_ADDR
) != 0
9765 && (ins
.used_prefixes
& PREFIX_ADDR
) != 0)
9766 ins
.all_prefixes
[ins
.last_addr_prefix
] = 0;
9768 /* Check if the DATA prefix is used. */
9769 if ((ins
.prefixes
& PREFIX_DATA
) != 0
9770 && (ins
.used_prefixes
& PREFIX_DATA
) != 0
9772 ins
.all_prefixes
[ins
.last_data_prefix
] = 0;
9774 /* Print the extra ins.prefixes. */
9776 for (i
= 0; i
< (int) ARRAY_SIZE (ins
.all_prefixes
); i
++)
9777 if (ins
.all_prefixes
[i
])
9779 const char *name
= prefix_name (ins
.address_mode
, ins
.all_prefixes
[i
],
9784 prefix_length
+= strlen (name
) + 1;
9785 if (ins
.all_prefixes
[i
] == REX2_OPCODE
)
9786 i386_dis_printf (info
, dis_style_mnemonic
, "{%s 0x%x} ", name
,
9787 (unsigned int) ins
.rex2_payload
);
9789 i386_dis_printf (info
, dis_style_mnemonic
, "%s ", name
);
9792 /* Check maximum code length. */
9793 if ((ins
.codep
- ins
.start_codep
) > MAX_CODE_LENGTH
)
9795 i386_dis_printf (info
, dis_style_text
, "(bad)");
9796 ret
= MAX_CODE_LENGTH
;
9800 /* Calculate the number of operands this instruction has. */
9802 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
9803 if (*ins
.op_out
[i
] != '\0')
9806 /* Calculate the number of spaces to print after the mnemonic. */
9807 ins
.obufp
= ins
.mnemonicendp
;
9810 i
= strlen (ins
.obuf
) + prefix_length
;
9819 /* Print the instruction mnemonic along with any trailing whitespace. */
9820 i386_dis_printf (info
, dis_style_mnemonic
, "%s%*s", ins
.obuf
, i
, "");
9822 /* The enter and bound instructions are printed with operands in the same
9823 order as the intel book; everything else is printed in reverse order. */
9824 intel_swap_2_3
= false;
9825 if (ins
.intel_syntax
|| ins
.two_source_ops
)
9827 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
9828 op_txt
[i
] = ins
.op_out
[i
];
9830 if (ins
.intel_syntax
&& dp
&& dp
->op
[2].rtn
== OP_Rounding
9831 && dp
->op
[3].rtn
== OP_E
&& dp
->op
[4].rtn
== NULL
)
9833 op_txt
[2] = ins
.op_out
[3];
9834 op_txt
[3] = ins
.op_out
[2];
9835 intel_swap_2_3
= true;
9838 for (i
= 0; i
< (MAX_OPERANDS
>> 1); ++i
)
9842 ins
.op_ad
= ins
.op_index
[i
];
9843 ins
.op_index
[i
] = ins
.op_index
[MAX_OPERANDS
- 1 - i
];
9844 ins
.op_index
[MAX_OPERANDS
- 1 - i
] = ins
.op_ad
;
9845 riprel
= ins
.op_riprel
[i
];
9846 ins
.op_riprel
[i
] = ins
.op_riprel
[MAX_OPERANDS
- 1 - i
];
9847 ins
.op_riprel
[MAX_OPERANDS
- 1 - i
] = riprel
;
9852 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
9853 op_txt
[MAX_OPERANDS
- 1 - i
] = ins
.op_out
[i
];
9857 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
9860 /* In Intel syntax embedded rounding / SAE are not separate operands.
9861 Instead they're attached to the prior register operand. Simply
9862 suppress emission of the comma to achieve that effect. */
9863 switch (i
& -(ins
.intel_syntax
&& dp
))
9866 if (dp
->op
[2].rtn
== OP_Rounding
&& !intel_swap_2_3
)
9870 if (dp
->op
[3].rtn
== OP_Rounding
|| intel_swap_2_3
)
9875 i386_dis_printf (info
, dis_style_text
, ",");
9876 if (ins
.op_index
[i
] != -1 && !ins
.op_riprel
[i
])
9878 bfd_vma target
= (bfd_vma
) ins
.op_address
[ins
.op_index
[i
]];
9882 info
->insn_info_valid
= 1;
9883 info
->branch_delay_insns
= 0;
9884 info
->data_size
= 0;
9885 info
->target
= target
;
9888 (*info
->print_address_func
) (target
, info
);
9891 i386_dis_printf (info
, dis_style_text
, "%s", op_txt
[i
]);
9895 for (i
= 0; i
< MAX_OPERANDS
; i
++)
9896 if (ins
.op_index
[i
] != -1 && ins
.op_riprel
[i
])
9898 i386_dis_printf (info
, dis_style_comment_start
, " # ");
9899 (*info
->print_address_func
)
9900 ((bfd_vma
)(ins
.start_pc
+ (ins
.codep
- ins
.start_codep
)
9901 + ins
.op_address
[ins
.op_index
[i
]]),
9905 ret
= ins
.codep
- priv
.the_buffer
;
9907 info
->private_data
= NULL
;
9911 /* Here for backwards compatibility. When gdb stops using
9912 print_insn_i386_att and print_insn_i386_intel these functions can
9913 disappear, and print_insn_i386 be merged into print_insn. */
9915 print_insn_i386_att (bfd_vma pc
, disassemble_info
*info
)
9917 return print_insn (pc
, info
, 0);
9921 print_insn_i386_intel (bfd_vma pc
, disassemble_info
*info
)
9923 return print_insn (pc
, info
, 1);
9927 print_insn_i386 (bfd_vma pc
, disassemble_info
*info
)
9929 return print_insn (pc
, info
, -1);
9932 static const char *float_mem
[] = {
10007 static const unsigned char float_mem_mode
[] = {
10082 #define ST { OP_ST, 0 }
10083 #define STi { OP_STi, 0 }
10085 #define FGRPd9_2 NULL, { { NULL, 1 } }, 0
10086 #define FGRPd9_4 NULL, { { NULL, 2 } }, 0
10087 #define FGRPd9_5 NULL, { { NULL, 3 } }, 0
10088 #define FGRPd9_6 NULL, { { NULL, 4 } }, 0
10089 #define FGRPd9_7 NULL, { { NULL, 5 } }, 0
10090 #define FGRPda_5 NULL, { { NULL, 6 } }, 0
10091 #define FGRPdb_4 NULL, { { NULL, 7 } }, 0
10092 #define FGRPde_3 NULL, { { NULL, 8 } }, 0
10093 #define FGRPdf_4 NULL, { { NULL, 9 } }, 0
10095 static const struct dis386 float_reg
[][8] = {
10098 { "fadd", { ST
, STi
}, 0 },
10099 { "fmul", { ST
, STi
}, 0 },
10100 { "fcom", { STi
}, 0 },
10101 { "fcomp", { STi
}, 0 },
10102 { "fsub", { ST
, STi
}, 0 },
10103 { "fsubr", { ST
, STi
}, 0 },
10104 { "fdiv", { ST
, STi
}, 0 },
10105 { "fdivr", { ST
, STi
}, 0 },
10109 { "fld", { STi
}, 0 },
10110 { "fxch", { STi
}, 0 },
10120 { "fcmovb", { ST
, STi
}, 0 },
10121 { "fcmove", { ST
, STi
}, 0 },
10122 { "fcmovbe",{ ST
, STi
}, 0 },
10123 { "fcmovu", { ST
, STi
}, 0 },
10131 { "fcmovnb",{ ST
, STi
}, 0 },
10132 { "fcmovne",{ ST
, STi
}, 0 },
10133 { "fcmovnbe",{ ST
, STi
}, 0 },
10134 { "fcmovnu",{ ST
, STi
}, 0 },
10136 { "fucomi", { ST
, STi
}, 0 },
10137 { "fcomi", { ST
, STi
}, 0 },
10142 { "fadd", { STi
, ST
}, 0 },
10143 { "fmul", { STi
, ST
}, 0 },
10146 { "fsub{!M|r}", { STi
, ST
}, 0 },
10147 { "fsub{M|}", { STi
, ST
}, 0 },
10148 { "fdiv{!M|r}", { STi
, ST
}, 0 },
10149 { "fdiv{M|}", { STi
, ST
}, 0 },
10153 { "ffree", { STi
}, 0 },
10155 { "fst", { STi
}, 0 },
10156 { "fstp", { STi
}, 0 },
10157 { "fucom", { STi
}, 0 },
10158 { "fucomp", { STi
}, 0 },
10164 { "faddp", { STi
, ST
}, 0 },
10165 { "fmulp", { STi
, ST
}, 0 },
10168 { "fsub{!M|r}p", { STi
, ST
}, 0 },
10169 { "fsub{M|}p", { STi
, ST
}, 0 },
10170 { "fdiv{!M|r}p", { STi
, ST
}, 0 },
10171 { "fdiv{M|}p", { STi
, ST
}, 0 },
10175 { "ffreep", { STi
}, 0 },
10180 { "fucomip", { ST
, STi
}, 0 },
10181 { "fcomip", { ST
, STi
}, 0 },
10186 static const char *const fgrps
[][8] = {
10189 "(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10194 "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10199 "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
10204 "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
10209 "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
10214 "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
10219 "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10224 "fNeni(8087 only)","fNdisi(8087 only)","fNclex","fNinit",
10225 "fNsetpm(287 only)","frstpm(287 only)","(bad)","(bad)",
10230 "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10235 "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10239 static const char *const oszc_flags
[16] = {
10240 " {dfv=}", " {dfv=cf}", " {dfv=zf}", " {dfv=zf, cf}", " {dfv=sf}",
10241 " {dfv=sf, cf}", " {dfv=sf, zf}", " {dfv=sf, zf, cf}", " {dfv=of}",
10242 " {dfv=of, cf}", " {dfv=of, zf}", " {dfv=of, zf, cf}", " {dfv=of, sf}",
10243 " {dfv=of, sf, cf}", " {dfv=of, sf, zf}", " {dfv=of, sf, zf, cf}"
10246 static const char *const scc_suffix
[16] = {
10247 "o", "no", "b", "ae", "e", "ne", "be", "a", "s", "ns", "t", "f",
10248 "l", "ge", "le", "g"
10252 swap_operand (instr_info
*ins
)
10254 ins
->mnemonicendp
[0] = '.';
10255 ins
->mnemonicendp
[1] = 's';
10256 ins
->mnemonicendp
[2] = '\0';
10257 ins
->mnemonicendp
+= 2;
10261 dofloat (instr_info
*ins
, int sizeflag
)
10263 const struct dis386
*dp
;
10264 unsigned char floatop
= ins
->codep
[-1];
10266 if (ins
->modrm
.mod
!= 3)
10268 int fp_indx
= (floatop
- 0xd8) * 8 + ins
->modrm
.reg
;
10270 putop (ins
, float_mem
[fp_indx
], sizeflag
);
10271 ins
->obufp
= ins
->op_out
[0];
10273 return OP_E (ins
, float_mem_mode
[fp_indx
], sizeflag
);
10275 /* Skip mod/rm byte. */
10279 dp
= &float_reg
[floatop
- 0xd8][ins
->modrm
.reg
];
10280 if (dp
->name
== NULL
)
10282 putop (ins
, fgrps
[dp
->op
[0].bytemode
][ins
->modrm
.rm
], sizeflag
);
10284 /* Instruction fnstsw is only one with strange arg. */
10285 if (floatop
== 0xdf && ins
->codep
[-1] == 0xe0)
10286 strcpy (ins
->op_out
[0], att_names16
[0] + ins
->intel_syntax
);
10290 putop (ins
, dp
->name
, sizeflag
);
10292 ins
->obufp
= ins
->op_out
[0];
10295 && !dp
->op
[0].rtn (ins
, dp
->op
[0].bytemode
, sizeflag
))
10298 ins
->obufp
= ins
->op_out
[1];
10301 && !dp
->op
[1].rtn (ins
, dp
->op
[1].bytemode
, sizeflag
))
10308 OP_ST (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
10309 int sizeflag ATTRIBUTE_UNUSED
)
10311 oappend_register (ins
, "%st");
10316 OP_STi (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
10317 int sizeflag ATTRIBUTE_UNUSED
)
10320 int res
= snprintf (scratch
, ARRAY_SIZE (scratch
), "%%st(%d)", ins
->modrm
.rm
);
10322 if (res
< 0 || (size_t) res
>= ARRAY_SIZE (scratch
))
10324 oappend_register (ins
, scratch
);
10328 /* Capital letters in template are macros. */
10330 putop (instr_info
*ins
, const char *in_template
, int sizeflag
)
10335 unsigned int l
= 0, len
= 0;
10337 bool evex_printed
= false;
10339 /* We don't want to add any prefix or suffix to (bad), so return early. */
10340 if (!strncmp (in_template
, "(bad)", 5))
10342 oappend (ins
, "(bad)");
10344 ins
->mnemonicendp
= ins
->obufp
;
10348 for (p
= in_template
; *p
; p
++)
10352 if (l
>= sizeof (last
) || !ISUPPER (*p
))
10360 if (ins
->evex_type
== evex_from_legacy
&& !ins
->vex
.nd
10361 && !(ins
->rex2
& 7) && !evex_printed
)
10363 oappend (ins
, "{evex} ");
10364 evex_printed
= true;
10366 *ins
->obufp
++ = *p
;
10375 if (ins
->intel_syntax
)
10377 while (*++p
!= '|')
10378 if (*p
== '}' || *p
== '\0')
10384 while (*++p
!= '}')
10394 if (ins
->intel_syntax
)
10396 if ((ins
->need_modrm
&& ins
->modrm
.mod
!= 3 && !ins
->vex
.nd
)
10397 || (sizeflag
& SUFFIX_ALWAYS
))
10398 *ins
->obufp
++ = 'b';
10404 if (ins
->intel_syntax
)
10406 if (sizeflag
& SUFFIX_ALWAYS
)
10407 *ins
->obufp
++ = 'b';
10409 else if (l
== 1 && last
[0] == 'L')
10411 if (ins
->address_mode
== mode_64bit
10412 && !(ins
->prefixes
& PREFIX_ADDR
))
10414 *ins
->obufp
++ = 'a';
10415 *ins
->obufp
++ = 'b';
10416 *ins
->obufp
++ = 's';
10425 if (l
== 1 && last
[0] == 'C')
10427 /* Condition code (taken from the map-0 Jcc entries). */
10428 for (const char *q
= dis386
[0x70 | ins
->condition_code
].name
+ 1;
10430 *ins
->obufp
++ = *q
;
10433 else if (l
== 1 && last
[0] == 'S')
10435 /* Add scc suffix. */
10436 oappend (ins
, scc_suffix
[ins
->vex
.scc
]);
10438 /* For SCC insns, the ND bit is required to be set to 0. */
10440 oappend (ins
, "(bad)");
10442 /* These bits have been consumed and should be cleared or restored
10443 to default values. */
10445 ins
->vex
.nf
= false;
10446 ins
->vex
.mask_register_specifier
= 0;
10452 if (ins
->intel_syntax
&& !alt
)
10454 if ((ins
->prefixes
& PREFIX_DATA
) || (sizeflag
& SUFFIX_ALWAYS
))
10456 if (sizeflag
& DFLAG
)
10457 *ins
->obufp
++ = ins
->intel_syntax
? 'd' : 'l';
10459 *ins
->obufp
++ = ins
->intel_syntax
? 'w' : 's';
10460 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
10469 if (!ins
->vex
.evex
|| ins
->vex
.w
)
10470 *ins
->obufp
++ = 'd';
10472 oappend (ins
, "{bad}");
10481 if (ins
->intel_syntax
|| !(sizeflag
& SUFFIX_ALWAYS
))
10484 if (ins
->modrm
.mod
== 3)
10486 if (ins
->rex
& REX_W
)
10487 *ins
->obufp
++ = 'q';
10490 if (sizeflag
& DFLAG
)
10491 *ins
->obufp
++ = ins
->intel_syntax
? 'd' : 'l';
10493 *ins
->obufp
++ = 'w';
10494 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
10498 *ins
->obufp
++ = 'w';
10506 if (!ins
->vex
.evex
|| ins
->vex
.b
|| ins
->vex
.ll
>= 2
10508 || (ins
->modrm
.mod
== 3 && (ins
->rex
& REX_X
))
10509 || !ins
->vex
.v
|| ins
->vex
.mask_register_specifier
)
10511 /* AVX512 extends a number of V*D insns to also have V*Q variants,
10512 merely distinguished by EVEX.W. Look for a use of the
10513 respective macro. */
10516 const char *pct
= strchr (p
+ 1, '%');
10518 if (pct
!= NULL
&& pct
[1] == 'D' && pct
[2] == 'Q')
10521 *ins
->obufp
++ = '{';
10522 *ins
->obufp
++ = 'e';
10523 *ins
->obufp
++ = 'v';
10524 *ins
->obufp
++ = 'e';
10525 *ins
->obufp
++ = 'x';
10526 *ins
->obufp
++ = '}';
10527 *ins
->obufp
++ = ' ';
10530 /* Skip printing {evex} for some special instructions in MAP4. */
10531 evex_printed
= true;
10538 /* For jcxz/jecxz */
10539 if (ins
->address_mode
== mode_64bit
)
10541 if (sizeflag
& AFLAG
)
10542 *ins
->obufp
++ = 'r';
10544 *ins
->obufp
++ = 'e';
10547 if (sizeflag
& AFLAG
)
10548 *ins
->obufp
++ = 'e';
10549 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_ADDR
);
10554 if (ins
->intel_syntax
)
10556 if ((ins
->prefixes
& PREFIX_ADDR
) || (sizeflag
& SUFFIX_ALWAYS
))
10558 if (sizeflag
& AFLAG
)
10559 *ins
->obufp
++ = ins
->address_mode
== mode_64bit
? 'q' : 'l';
10561 *ins
->obufp
++ = ins
->address_mode
== mode_64bit
? 'l' : 'w';
10562 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_ADDR
);
10565 else if (l
== 1 && last
[0] == 'C')
10567 if (ins
->vex
.nd
&& !ins
->vex
.nf
)
10569 *ins
->obufp
++ = 'c';
10570 *ins
->obufp
++ = 'f';
10571 /* Skip printing {evex} */
10572 evex_printed
= true;
10574 else if (l
== 1 && last
[0] == 'N')
10578 oappend (ins
, "{nf} ");
10579 /* This bit needs to be cleared after it is consumed. */
10580 ins
->vex
.nf
= false;
10581 evex_printed
= true;
10583 else if (ins
->evex_type
== evex_from_vex
&& !(ins
->rex2
& 7)
10586 oappend (ins
, "{evex} ");
10587 evex_printed
= true;
10590 else if (l
== 1 && last
[0] == 'D')
10592 /* Get oszc flags value from register_specifier. */
10593 int oszc_value
= ~ins
->vex
.register_specifier
& 0xf;
10595 /* Add {dfv=of, sf, zf, cf} flags. */
10596 oappend (ins
, oszc_flags
[oszc_value
]);
10598 /* These bits have been consumed and should be cleared. */
10599 ins
->vex
.register_specifier
= 0;
10605 if (ins
->intel_syntax
|| (ins
->obufp
[-1] != 's'
10606 && !(sizeflag
& SUFFIX_ALWAYS
)))
10608 if ((ins
->rex
& REX_W
) || (sizeflag
& DFLAG
))
10609 *ins
->obufp
++ = 'l';
10611 *ins
->obufp
++ = 'w';
10612 if (!(ins
->rex
& REX_W
))
10613 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
10618 if (ins
->intel_syntax
)
10620 if ((ins
->prefixes
& (PREFIX_CS
| PREFIX_DS
)) == PREFIX_CS
10621 || (ins
->prefixes
& (PREFIX_CS
| PREFIX_DS
)) == PREFIX_DS
)
10623 ins
->used_prefixes
|= ins
->prefixes
& (PREFIX_CS
| PREFIX_DS
);
10624 *ins
->obufp
++ = ',';
10625 *ins
->obufp
++ = 'p';
10627 /* Set active_seg_prefix even if not set in 64-bit mode
10628 because here it is a valid branch hint. */
10629 if (ins
->prefixes
& PREFIX_DS
)
10631 ins
->active_seg_prefix
= PREFIX_DS
;
10632 *ins
->obufp
++ = 't';
10636 ins
->active_seg_prefix
= PREFIX_CS
;
10637 *ins
->obufp
++ = 'n';
10641 else if (l
== 1 && last
[0] == 'X')
10644 *ins
->obufp
++ = 'h';
10646 oappend (ins
, "{bad}");
10653 if (ins
->rex
& REX_W
)
10654 *ins
->obufp
++ = 'q';
10656 *ins
->obufp
++ = 'd';
10659 if (ins
->intel_syntax
)
10661 if (sizeflag
& SUFFIX_ALWAYS
)
10663 if (ins
->rex
& REX_W
)
10664 *ins
->obufp
++ = 'q';
10666 *ins
->obufp
++ = 'l';
10670 if (ins
->intel_mnemonic
!= cond
)
10671 *ins
->obufp
++ = 'r';
10674 if ((ins
->prefixes
& PREFIX_FWAIT
) == 0)
10675 *ins
->obufp
++ = 'n';
10677 ins
->used_prefixes
|= PREFIX_FWAIT
;
10681 if (ins
->rex
& REX_W
)
10682 *ins
->obufp
++ = 'o';
10683 else if (ins
->intel_syntax
&& (sizeflag
& DFLAG
))
10684 *ins
->obufp
++ = 'q';
10686 *ins
->obufp
++ = 'd';
10687 if (!(ins
->rex
& REX_W
))
10688 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
10691 if (ins
->address_mode
== mode_64bit
10692 && (ins
->isa64
== intel64
|| (ins
->rex
& REX_W
)
10693 || !(ins
->prefixes
& PREFIX_DATA
)))
10695 if (sizeflag
& SUFFIX_ALWAYS
)
10696 *ins
->obufp
++ = 'q';
10699 /* Fall through. */
10703 if (!cond
&& ins
->last_rex2_prefix
>= 0 && (ins
->rex
& REX_W
))
10705 /* For pushp and popp, p is printed and do not print {rex2}
10707 *ins
->obufp
++ = 'p';
10708 ins
->rex2
|= REX2_SPECIAL
;
10712 /* For "!P" print nothing else in Intel syntax. */
10713 if (!cond
&& ins
->intel_syntax
)
10716 if ((ins
->modrm
.mod
== 3 || !cond
)
10717 && !(sizeflag
& SUFFIX_ALWAYS
))
10719 /* Fall through. */
10721 if ((!(ins
->rex
& REX_W
) && (ins
->prefixes
& PREFIX_DATA
))
10722 || ((sizeflag
& SUFFIX_ALWAYS
)
10723 && ins
->address_mode
!= mode_64bit
))
10725 *ins
->obufp
++ = (sizeflag
& DFLAG
)
10726 ? ins
->intel_syntax
? 'd' : 'l' : 'w';
10727 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
10729 else if (sizeflag
& SUFFIX_ALWAYS
)
10730 *ins
->obufp
++ = 'q';
10732 else if (l
== 1 && last
[0] == 'L')
10734 if ((ins
->prefixes
& PREFIX_DATA
)
10735 || (ins
->rex
& REX_W
)
10736 || (sizeflag
& SUFFIX_ALWAYS
))
10739 if (ins
->rex
& REX_W
)
10740 *ins
->obufp
++ = 'q';
10743 if (sizeflag
& DFLAG
)
10744 *ins
->obufp
++ = ins
->intel_syntax
? 'd' : 'l';
10746 *ins
->obufp
++ = 'w';
10747 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
10757 if (ins
->intel_syntax
&& !alt
)
10760 if ((ins
->need_modrm
&& ins
->modrm
.mod
!= 3 && !ins
->vex
.nd
)
10761 || (sizeflag
& SUFFIX_ALWAYS
))
10763 if (ins
->rex
& REX_W
)
10764 *ins
->obufp
++ = 'q';
10767 if (sizeflag
& DFLAG
)
10768 *ins
->obufp
++ = ins
->intel_syntax
? 'd' : 'l';
10770 *ins
->obufp
++ = 'w';
10771 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
10775 else if (l
== 1 && last
[0] == 'D')
10776 *ins
->obufp
++ = ins
->vex
.w
? 'q' : 'd';
10777 else if (l
== 1 && last
[0] == 'L')
10779 if (cond
? ins
->modrm
.mod
== 3 && !(sizeflag
& SUFFIX_ALWAYS
)
10780 : ins
->address_mode
!= mode_64bit
)
10782 if ((ins
->rex
& REX_W
))
10785 *ins
->obufp
++ = 'q';
10787 else if ((ins
->address_mode
== mode_64bit
&& cond
)
10788 || (sizeflag
& SUFFIX_ALWAYS
))
10789 *ins
->obufp
++ = ins
->intel_syntax
? 'd' : 'l';
10796 if (ins
->rex
& REX_W
)
10797 *ins
->obufp
++ = 'q';
10798 else if (sizeflag
& DFLAG
)
10800 if (ins
->intel_syntax
)
10801 *ins
->obufp
++ = 'd';
10803 *ins
->obufp
++ = 'l';
10806 *ins
->obufp
++ = 'w';
10807 if (ins
->intel_syntax
&& !p
[1]
10808 && ((ins
->rex
& REX_W
) || (sizeflag
& DFLAG
)))
10809 *ins
->obufp
++ = 'e';
10810 if (!(ins
->rex
& REX_W
))
10811 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
10817 if (ins
->intel_syntax
)
10819 if (sizeflag
& SUFFIX_ALWAYS
)
10821 if (ins
->rex
& REX_W
)
10822 *ins
->obufp
++ = 'q';
10825 if (sizeflag
& DFLAG
)
10826 *ins
->obufp
++ = 'l';
10828 *ins
->obufp
++ = 'w';
10829 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
10839 if (ins
->address_mode
== mode_64bit
10840 && !(ins
->prefixes
& PREFIX_ADDR
))
10842 *ins
->obufp
++ = 'a';
10843 *ins
->obufp
++ = 'b';
10844 *ins
->obufp
++ = 's';
10849 if (!ins
->vex
.evex
|| !ins
->vex
.w
)
10850 *ins
->obufp
++ = 's';
10852 oappend (ins
, "{bad}");
10859 if (l
== 1 && (last
[0] == 'Z'))
10861 /* Although IMUL/SETcc does not support NDD, the EVEX.ND bit is
10862 used to control whether its destination register has its upper
10865 oappend (ins
, "zu");
10874 *ins
->obufp
++ = 'v';
10883 *ins
->obufp
++ = '{';
10884 *ins
->obufp
++ = 'v';
10885 *ins
->obufp
++ = 'e';
10886 *ins
->obufp
++ = 'x';
10887 *ins
->obufp
++ = '}';
10888 *ins
->obufp
++ = ' ';
10891 if (ins
->rex
& REX_W
)
10893 *ins
->obufp
++ = 'a';
10894 *ins
->obufp
++ = 'b';
10895 *ins
->obufp
++ = 's';
10908 /* operand size flag for cwtl, cbtw */
10910 if (ins
->rex
& REX_W
)
10912 if (ins
->intel_syntax
)
10913 *ins
->obufp
++ = 'd';
10915 *ins
->obufp
++ = 'l';
10917 else if (sizeflag
& DFLAG
)
10918 *ins
->obufp
++ = 'w';
10920 *ins
->obufp
++ = 'b';
10921 if (!(ins
->rex
& REX_W
))
10922 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
10926 if (!ins
->need_vex
)
10928 if (last
[0] == 'X')
10929 *ins
->obufp
++ = ins
->vex
.w
? 'd': 's';
10930 else if (last
[0] == 'B')
10931 *ins
->obufp
++ = ins
->vex
.w
? 'w': 'b';
10932 else if (last
[0] == 'S')
10934 if (ins
->modrm
.mod
== 3 && (sizeflag
& SUFFIX_ALWAYS
))
10936 *ins
->obufp
++ = '.';
10937 *ins
->obufp
++ = 's';
10950 ? ins
->vex
.prefix
== DATA_PREFIX_OPCODE
10951 : ins
->prefixes
& PREFIX_DATA
)
10953 *ins
->obufp
++ = 'd';
10954 ins
->used_prefixes
|= PREFIX_DATA
;
10957 *ins
->obufp
++ = 's';
10962 if (ins
->vex
.mask_register_specifier
)
10963 ins
->illegal_masking
= true;
10965 else if (l
== 1 && last
[0] == 'X')
10967 if (!ins
->need_vex
)
10969 if (ins
->intel_syntax
10970 || ((ins
->modrm
.mod
== 3 || ins
->vex
.b
)
10971 && !(sizeflag
& SUFFIX_ALWAYS
)))
10973 switch (ins
->vex
.length
)
10976 *ins
->obufp
++ = 'x';
10979 *ins
->obufp
++ = 'y';
10982 if (!ins
->vex
.evex
)
10993 /* These insns ignore ModR/M.mod: Force it to 3 for OP_E(). */
10994 ins
->modrm
.mod
= 3;
10995 if (!ins
->intel_syntax
&& (sizeflag
& SUFFIX_ALWAYS
))
10996 *ins
->obufp
++ = ins
->address_mode
== mode_64bit
? 'q' : 'l';
10998 else if (l
== 1 && last
[0] == 'X')
11000 if (!ins
->vex
.evex
)
11002 if (ins
->intel_syntax
11003 || ((ins
->modrm
.mod
== 3 || ins
->vex
.b
)
11004 && !(sizeflag
& SUFFIX_ALWAYS
)))
11006 switch (ins
->vex
.length
)
11009 *ins
->obufp
++ = 'x';
11012 *ins
->obufp
++ = 'y';
11015 *ins
->obufp
++ = 'z';
11025 if (ins
->intel_syntax
)
11027 if (ins
->isa64
== intel64
&& (ins
->rex
& REX_W
))
11030 *ins
->obufp
++ = 'q';
11033 if ((ins
->prefixes
& PREFIX_DATA
) || (sizeflag
& SUFFIX_ALWAYS
))
11035 if (sizeflag
& DFLAG
)
11036 *ins
->obufp
++ = 'l';
11038 *ins
->obufp
++ = 'w';
11039 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
11048 ins
->mnemonicendp
= ins
->obufp
;
11052 /* Add a style marker to *INS->obufp that encodes STYLE. This assumes that
11053 the buffer pointed to by INS->obufp has space. A style marker is made
11054 from the STYLE_MARKER_CHAR followed by STYLE converted to a single hex
11055 digit, followed by another STYLE_MARKER_CHAR. This function assumes
11056 that the number of styles is not greater than 16. */
11059 oappend_insert_style (instr_info
*ins
, enum disassembler_style style
)
11061 unsigned num
= (unsigned) style
;
11063 /* We currently assume that STYLE can be encoded as a single hex
11064 character. If more styles are added then this might start to fail,
11065 and we'll need to expand this code. */
11069 *ins
->obufp
++ = STYLE_MARKER_CHAR
;
11070 *ins
->obufp
++ = (num
< 10 ? ('0' + num
)
11071 : ((num
< 16) ? ('a' + (num
- 10)) : '0'));
11072 *ins
->obufp
++ = STYLE_MARKER_CHAR
;
11074 /* This final null character is not strictly necessary, after inserting a
11075 style marker we should always be inserting some additional content.
11076 However, having the buffer null terminated doesn't cost much, and make
11077 it easier to debug what's going on. Also, if we do ever forget to add
11078 any additional content after this style marker, then the buffer will
11079 still be well formed. */
11080 *ins
->obufp
= '\0';
11084 oappend_with_style (instr_info
*ins
, const char *s
,
11085 enum disassembler_style style
)
11087 oappend_insert_style (ins
, style
);
11088 ins
->obufp
= stpcpy (ins
->obufp
, s
);
11091 /* Add a single character C to the buffer pointer to by INS->obufp, marking
11092 the style for the character as STYLE. */
11095 oappend_char_with_style (instr_info
*ins
, const char c
,
11096 enum disassembler_style style
)
11098 oappend_insert_style (ins
, style
);
11100 *ins
->obufp
= '\0';
11103 /* Like oappend_char_with_style, but always uses dis_style_text. */
11106 oappend_char (instr_info
*ins
, const char c
)
11108 oappend_char_with_style (ins
, c
, dis_style_text
);
11112 append_seg (instr_info
*ins
)
11114 /* Only print the active segment register. */
11115 if (!ins
->active_seg_prefix
)
11118 ins
->used_prefixes
|= ins
->active_seg_prefix
;
11119 switch (ins
->active_seg_prefix
)
11122 oappend_register (ins
, att_names_seg
[1]);
11125 oappend_register (ins
, att_names_seg
[3]);
11128 oappend_register (ins
, att_names_seg
[2]);
11131 oappend_register (ins
, att_names_seg
[0]);
11134 oappend_register (ins
, att_names_seg
[4]);
11137 oappend_register (ins
, att_names_seg
[5]);
11142 oappend_char (ins
, ':');
11146 print_operand_value (instr_info
*ins
, bfd_vma disp
,
11147 enum disassembler_style style
)
11151 if (ins
->address_mode
!= mode_64bit
)
11152 disp
&= 0xffffffff;
11153 sprintf (tmp
, "0x%" PRIx64
, (uint64_t) disp
);
11154 oappend_with_style (ins
, tmp
, style
);
11157 /* Like oappend, but called for immediate operands. */
11160 oappend_immediate (instr_info
*ins
, bfd_vma imm
)
11162 if (!ins
->intel_syntax
)
11163 oappend_char_with_style (ins
, '$', dis_style_immediate
);
11164 print_operand_value (ins
, imm
, dis_style_immediate
);
11167 /* Put DISP in BUF as signed hex number. */
11170 print_displacement (instr_info
*ins
, bfd_signed_vma val
)
11176 oappend_char_with_style (ins
, '-', dis_style_address_offset
);
11177 val
= (bfd_vma
) 0 - val
;
11179 /* Check for possible overflow. */
11182 switch (ins
->address_mode
)
11185 oappend_with_style (ins
, "0x8000000000000000",
11186 dis_style_address_offset
);
11189 oappend_with_style (ins
, "0x80000000",
11190 dis_style_address_offset
);
11193 oappend_with_style (ins
, "0x8000",
11194 dis_style_address_offset
);
11201 sprintf (tmp
, "0x%" PRIx64
, (int64_t) val
);
11202 oappend_with_style (ins
, tmp
, dis_style_address_offset
);
11206 intel_operand_size (instr_info
*ins
, int bytemode
, int sizeflag
)
11208 /* Check if there is a broadcast, when evex.b is not treated as evex.nd. */
11209 if (ins
->vex
.b
&& ins
->evex_type
== evex_default
)
11211 if (!ins
->vex
.no_broadcast
)
11215 case evex_half_bcst_xmmq_mode
:
11217 oappend (ins
, "QWORD BCST ");
11219 oappend (ins
, "DWORD BCST ");
11222 case evex_half_bcst_xmmqh_mode
:
11223 case evex_half_bcst_xmmqdh_mode
:
11224 oappend (ins
, "WORD BCST ");
11227 ins
->vex
.no_broadcast
= true;
11237 oappend (ins
, "BYTE PTR ");
11242 oappend (ins
, "WORD PTR ");
11245 if (ins
->address_mode
== mode_64bit
&& ins
->isa64
== intel64
)
11247 oappend (ins
, "QWORD PTR ");
11250 /* Fall through. */
11252 if (ins
->address_mode
== mode_64bit
&& ((sizeflag
& DFLAG
)
11253 || (ins
->rex
& REX_W
)))
11255 oappend (ins
, "QWORD PTR ");
11258 /* Fall through. */
11263 if (ins
->rex
& REX_W
)
11264 oappend (ins
, "QWORD PTR ");
11265 else if (bytemode
== dq_mode
)
11266 oappend (ins
, "DWORD PTR ");
11269 if (sizeflag
& DFLAG
)
11270 oappend (ins
, "DWORD PTR ");
11272 oappend (ins
, "WORD PTR ");
11273 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
11277 if ((ins
->rex
& REX_W
) || (sizeflag
& DFLAG
))
11278 *ins
->obufp
++ = 'D';
11279 oappend (ins
, "WORD PTR ");
11280 if (!(ins
->rex
& REX_W
))
11281 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
11284 if (sizeflag
& DFLAG
)
11285 oappend (ins
, "QWORD PTR ");
11287 oappend (ins
, "DWORD PTR ");
11288 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
11291 if (!(sizeflag
& DFLAG
) && ins
->isa64
== intel64
)
11292 oappend (ins
, "WORD PTR ");
11294 oappend (ins
, "DWORD PTR ");
11295 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
11299 oappend (ins
, "DWORD PTR ");
11303 oappend (ins
, "QWORD PTR ");
11306 if (ins
->address_mode
== mode_64bit
)
11307 oappend (ins
, "QWORD PTR ");
11309 oappend (ins
, "DWORD PTR ");
11312 if (sizeflag
& DFLAG
)
11313 oappend (ins
, "FWORD PTR ");
11315 oappend (ins
, "DWORD PTR ");
11316 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
11319 oappend (ins
, "TBYTE PTR ");
11324 case evex_x_gscat_mode
:
11325 case evex_x_nobcst_mode
:
11329 switch (ins
->vex
.length
)
11332 oappend (ins
, "XMMWORD PTR ");
11335 oappend (ins
, "YMMWORD PTR ");
11338 oappend (ins
, "ZMMWORD PTR ");
11345 oappend (ins
, "XMMWORD PTR ");
11348 oappend (ins
, "XMMWORD PTR ");
11351 oappend (ins
, "YMMWORD PTR ");
11354 case evex_half_bcst_xmmqh_mode
:
11355 case evex_half_bcst_xmmq_mode
:
11356 switch (ins
->vex
.length
)
11360 oappend (ins
, "QWORD PTR ");
11363 oappend (ins
, "XMMWORD PTR ");
11366 oappend (ins
, "YMMWORD PTR ");
11373 if (!ins
->need_vex
)
11376 switch (ins
->vex
.length
)
11379 oappend (ins
, "WORD PTR ");
11382 oappend (ins
, "DWORD PTR ");
11385 oappend (ins
, "QWORD PTR ");
11392 case evex_half_bcst_xmmqdh_mode
:
11393 if (!ins
->need_vex
)
11396 switch (ins
->vex
.length
)
11399 oappend (ins
, "DWORD PTR ");
11402 oappend (ins
, "QWORD PTR ");
11405 oappend (ins
, "XMMWORD PTR ");
11412 if (!ins
->need_vex
)
11415 switch (ins
->vex
.length
)
11418 oappend (ins
, "QWORD PTR ");
11421 oappend (ins
, "YMMWORD PTR ");
11424 oappend (ins
, "ZMMWORD PTR ");
11431 oappend (ins
, "OWORD PTR ");
11433 case vex_vsib_d_w_dq_mode
:
11434 case vex_vsib_q_w_dq_mode
:
11435 if (!ins
->need_vex
)
11438 oappend (ins
, "QWORD PTR ");
11440 oappend (ins
, "DWORD PTR ");
11443 if (!ins
->need_vex
|| ins
->vex
.length
!= 128)
11446 oappend (ins
, "DWORD PTR ");
11448 oappend (ins
, "BYTE PTR ");
11451 if (!ins
->need_vex
)
11454 oappend (ins
, "QWORD PTR ");
11456 oappend (ins
, "WORD PTR ");
11466 print_register (instr_info
*ins
, unsigned int reg
, unsigned int rexmask
,
11467 int bytemode
, int sizeflag
)
11469 const char (*names
)[8];
11471 /* Masking is invalid for insns with GPR destination. Set the flag uniformly,
11472 as the consumer will inspect it only for the destination operand. */
11473 if (bytemode
!= mask_mode
&& ins
->vex
.mask_register_specifier
)
11474 ins
->illegal_masking
= true;
11476 USED_REX (rexmask
);
11477 if (ins
->rex
& rexmask
)
11479 if (ins
->rex2
& rexmask
)
11488 if (ins
->rex
|| ins
->rex2
)
11489 names
= att_names8rex
;
11491 names
= att_names8
;
11494 names
= att_names16
;
11499 names
= att_names32
;
11502 names
= att_names64
;
11506 names
= ins
->address_mode
== mode_64bit
? att_names64
: att_names32
;
11509 case bnd_swap_mode
:
11512 oappend (ins
, "(bad)");
11515 names
= att_names_bnd
;
11518 if (ins
->address_mode
== mode_64bit
&& ins
->isa64
== intel64
)
11520 names
= att_names64
;
11523 /* Fall through. */
11525 if (ins
->address_mode
== mode_64bit
&& ((sizeflag
& DFLAG
)
11526 || (ins
->rex
& REX_W
)))
11528 names
= att_names64
;
11532 /* Fall through. */
11537 if (ins
->rex
& REX_W
)
11538 names
= att_names64
;
11539 else if (bytemode
!= v_mode
&& bytemode
!= v_swap_mode
)
11540 names
= att_names32
;
11543 if (sizeflag
& DFLAG
)
11544 names
= att_names32
;
11546 names
= att_names16
;
11547 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
11551 if (!(sizeflag
& DFLAG
) && ins
->isa64
== intel64
)
11552 names
= att_names16
;
11554 names
= att_names32
;
11555 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
11558 names
= (ins
->address_mode
== mode_64bit
11559 ? att_names64
: att_names32
);
11560 if (!(ins
->prefixes
& PREFIX_ADDR
))
11561 names
= (ins
->address_mode
== mode_16bit
11562 ? att_names16
: names
);
11565 /* Remove "addr16/addr32". */
11566 ins
->all_prefixes
[ins
->last_addr_prefix
] = 0;
11567 names
= (ins
->address_mode
!= mode_32bit
11568 ? att_names32
: att_names16
);
11569 ins
->used_prefixes
|= PREFIX_ADDR
;
11576 oappend (ins
, "(bad)");
11579 names
= att_names_mask
;
11584 oappend (ins
, INTERNAL_DISASSEMBLER_ERROR
);
11587 oappend_register (ins
, names
[reg
]);
11591 get8s (instr_info
*ins
, bfd_vma
*res
)
11593 if (!fetch_code (ins
->info
, ins
->codep
+ 1))
11595 *res
= ((bfd_vma
) *ins
->codep
++ ^ 0x80) - 0x80;
11600 get16 (instr_info
*ins
, bfd_vma
*res
)
11602 if (!fetch_code (ins
->info
, ins
->codep
+ 2))
11604 *res
= *ins
->codep
++;
11605 *res
|= (bfd_vma
) *ins
->codep
++ << 8;
11610 get16s (instr_info
*ins
, bfd_vma
*res
)
11612 if (!get16 (ins
, res
))
11614 *res
= (*res
^ 0x8000) - 0x8000;
11619 get32 (instr_info
*ins
, bfd_vma
*res
)
11621 if (!fetch_code (ins
->info
, ins
->codep
+ 4))
11623 *res
= *ins
->codep
++;
11624 *res
|= (bfd_vma
) *ins
->codep
++ << 8;
11625 *res
|= (bfd_vma
) *ins
->codep
++ << 16;
11626 *res
|= (bfd_vma
) *ins
->codep
++ << 24;
11631 get32s (instr_info
*ins
, bfd_vma
*res
)
11633 if (!get32 (ins
, res
))
11636 *res
= (*res
^ ((bfd_vma
) 1 << 31)) - ((bfd_vma
) 1 << 31);
11642 get64 (instr_info
*ins
, uint64_t *res
)
11647 if (!fetch_code (ins
->info
, ins
->codep
+ 8))
11650 a
|= (unsigned int) *ins
->codep
++ << 8;
11651 a
|= (unsigned int) *ins
->codep
++ << 16;
11652 a
|= (unsigned int) *ins
->codep
++ << 24;
11654 b
|= (unsigned int) *ins
->codep
++ << 8;
11655 b
|= (unsigned int) *ins
->codep
++ << 16;
11656 b
|= (unsigned int) *ins
->codep
++ << 24;
11657 *res
= a
+ ((uint64_t) b
<< 32);
11662 set_op (instr_info
*ins
, bfd_vma op
, bool riprel
)
11664 ins
->op_index
[ins
->op_ad
] = ins
->op_ad
;
11665 if (ins
->address_mode
== mode_64bit
)
11666 ins
->op_address
[ins
->op_ad
] = op
;
11667 else /* Mask to get a 32-bit address. */
11668 ins
->op_address
[ins
->op_ad
] = op
& 0xffffffff;
11669 ins
->op_riprel
[ins
->op_ad
] = riprel
;
11673 BadOp (instr_info
*ins
)
11675 /* Throw away prefixes and 1st. opcode byte. */
11676 struct dis_private
*priv
= ins
->info
->private_data
;
11678 ins
->codep
= priv
->the_buffer
+ ins
->nr_prefixes
+ ins
->need_vex
+ 1;
11679 ins
->obufp
= stpcpy (ins
->obufp
, "(bad)");
11684 OP_Skip_MODRM (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
11685 int sizeflag ATTRIBUTE_UNUSED
)
11687 if (ins
->modrm
.mod
!= 3)
11688 return BadOp (ins
);
11690 /* Skip mod/rm byte. */
11693 ins
->has_skipped_modrm
= true;
11698 OP_E_memory (instr_info
*ins
, int bytemode
, int sizeflag
)
11700 int add
= (ins
->rex
& REX_B
) ? 8 : 0;
11704 add
+= (ins
->rex2
& REX_B
) ? 16 : 0;
11706 /* Handles EVEX other than APX EVEX-promoted instructions. */
11707 if (ins
->vex
.evex
&& ins
->evex_type
== evex_default
)
11710 /* Zeroing-masking is invalid for memory destinations. Set the flag
11711 uniformly, as the consumer will inspect it only for the destination
11713 if (ins
->vex
.zeroing
)
11714 ins
->illegal_masking
= true;
11728 if (ins
->address_mode
!= mode_64bit
)
11736 case vex_vsib_d_w_dq_mode
:
11737 case vex_vsib_q_w_dq_mode
:
11738 case evex_x_gscat_mode
:
11739 shift
= ins
->vex
.w
? 3 : 2;
11742 case evex_half_bcst_xmmqh_mode
:
11743 case evex_half_bcst_xmmqdh_mode
:
11746 shift
= ins
->vex
.w
? 2 : 1;
11749 /* Fall through. */
11751 case evex_half_bcst_xmmq_mode
:
11754 shift
= ins
->vex
.w
? 3 : 2;
11757 /* Fall through. */
11762 case evex_x_nobcst_mode
:
11764 switch (ins
->vex
.length
)
11778 /* Make necessary corrections to shift for modes that need it. */
11779 if (bytemode
== xmmq_mode
11780 || bytemode
== evex_half_bcst_xmmqh_mode
11781 || bytemode
== evex_half_bcst_xmmq_mode
11782 || (bytemode
== ymmq_mode
&& ins
->vex
.length
== 128))
11784 else if (bytemode
== xmmqd_mode
11785 || bytemode
== evex_half_bcst_xmmqdh_mode
)
11787 else if (bytemode
== xmmdw_mode
)
11801 shift
= ins
->vex
.w
? 1 : 0;
11811 if (ins
->intel_syntax
)
11812 intel_operand_size (ins
, bytemode
, sizeflag
);
11815 if ((sizeflag
& AFLAG
) || ins
->address_mode
== mode_64bit
)
11817 /* 32/64 bit address mode */
11826 int addr32flag
= !((sizeflag
& AFLAG
)
11827 || bytemode
== v_bnd_mode
11828 || bytemode
== v_bndmk_mode
11829 || bytemode
== bnd_mode
11830 || bytemode
== bnd_swap_mode
);
11831 bool check_gather
= false;
11832 const char (*indexes
)[8] = NULL
;
11835 base
= ins
->modrm
.rm
;
11839 vindex
= ins
->sib
.index
;
11841 if (ins
->rex
& REX_X
)
11845 case vex_vsib_d_w_dq_mode
:
11846 case vex_vsib_q_w_dq_mode
:
11847 if (!ins
->need_vex
)
11851 /* S/G EVEX insns require EVEX.X4 not to be set. */
11852 if (ins
->rex2
& REX_X
)
11854 oappend (ins
, "(bad)");
11860 check_gather
= ins
->obufp
== ins
->op_out
[1];
11863 switch (ins
->vex
.length
)
11866 indexes
= att_names_xmm
;
11870 || bytemode
== vex_vsib_q_w_dq_mode
)
11871 indexes
= att_names_ymm
;
11873 indexes
= att_names_xmm
;
11877 || bytemode
== vex_vsib_q_w_dq_mode
)
11878 indexes
= att_names_zmm
;
11880 indexes
= att_names_ymm
;
11887 if (ins
->rex2
& REX_X
)
11891 indexes
= ins
->address_mode
== mode_64bit
&& !addr32flag
11892 ? att_names64
: att_names32
;
11895 scale
= ins
->sib
.scale
;
11896 base
= ins
->sib
.base
;
11901 /* Check for mandatory SIB. */
11902 if (bytemode
== vex_vsib_d_w_dq_mode
11903 || bytemode
== vex_vsib_q_w_dq_mode
11904 || bytemode
== vex_sibmem_mode
)
11906 oappend (ins
, "(bad)");
11910 rbase
= base
+ add
;
11912 switch (ins
->modrm
.mod
)
11918 if (ins
->address_mode
== mode_64bit
&& !ins
->has_sib
)
11920 if (!get32s (ins
, &disp
))
11922 if (riprel
&& bytemode
== v_bndmk_mode
)
11924 oappend (ins
, "(bad)");
11930 if (!get8s (ins
, &disp
))
11932 if (ins
->vex
.evex
&& shift
> 0)
11936 if (!get32s (ins
, &disp
))
11946 && ins
->address_mode
!= mode_16bit
)
11948 if (ins
->address_mode
== mode_64bit
)
11952 /* Without base nor index registers, zero-extend the
11953 lower 32-bit displacement to 64 bits. */
11954 disp
&= 0xffffffff;
11961 /* In 32-bit mode, we need index register to tell [offset]
11962 from [eiz*1 + offset]. */
11967 havedisp
= (havebase
11969 || (ins
->has_sib
&& (indexes
|| scale
!= 0)));
11971 if (!ins
->intel_syntax
)
11972 if (ins
->modrm
.mod
!= 0 || base
== 5)
11974 if (havedisp
|| riprel
)
11975 print_displacement (ins
, disp
);
11977 print_operand_value (ins
, disp
, dis_style_address_offset
);
11980 set_op (ins
, disp
, true);
11981 oappend_char (ins
, '(');
11982 oappend_with_style (ins
, !addr32flag
? "%rip" : "%eip",
11983 dis_style_register
);
11984 oappend_char (ins
, ')');
11988 if ((havebase
|| indexes
|| needindex
|| needaddr32
|| riprel
)
11989 && (ins
->address_mode
!= mode_64bit
11990 || ((bytemode
!= v_bnd_mode
)
11991 && (bytemode
!= v_bndmk_mode
)
11992 && (bytemode
!= bnd_mode
)
11993 && (bytemode
!= bnd_swap_mode
))))
11994 ins
->used_prefixes
|= PREFIX_ADDR
;
11996 if (havedisp
|| (ins
->intel_syntax
&& riprel
))
11998 oappend_char (ins
, ins
->open_char
);
11999 if (ins
->intel_syntax
&& riprel
)
12001 set_op (ins
, disp
, true);
12002 oappend_with_style (ins
, !addr32flag
? "rip" : "eip",
12003 dis_style_register
);
12008 (ins
->address_mode
== mode_64bit
&& !addr32flag
12009 ? att_names64
: att_names32
)[rbase
]);
12012 /* ESP/RSP won't allow index. If base isn't ESP/RSP,
12013 print index to tell base + index from base. */
12017 || (havebase
&& base
!= ESP_REG_NUM
))
12019 if (!ins
->intel_syntax
|| havebase
)
12020 oappend_char (ins
, ins
->separator_char
);
12023 if (ins
->address_mode
== mode_64bit
|| vindex
< 16)
12024 oappend_register (ins
, indexes
[vindex
]);
12026 oappend (ins
, "(bad)");
12029 oappend_register (ins
,
12030 ins
->address_mode
== mode_64bit
12035 oappend_char (ins
, ins
->scale_char
);
12036 oappend_char_with_style (ins
, '0' + (1 << scale
),
12037 dis_style_immediate
);
12040 if (ins
->intel_syntax
12041 && (disp
|| ins
->modrm
.mod
!= 0 || base
== 5))
12043 if (!havedisp
|| (bfd_signed_vma
) disp
>= 0)
12044 oappend_char (ins
, '+');
12046 print_displacement (ins
, disp
);
12048 print_operand_value (ins
, disp
, dis_style_address_offset
);
12051 oappend_char (ins
, ins
->close_char
);
12055 /* Both XMM/YMM/ZMM registers must be distinct. */
12056 int modrm_reg
= ins
->modrm
.reg
;
12058 if (ins
->rex
& REX_R
)
12060 if (ins
->rex2
& REX_R
)
12062 if (vindex
== modrm_reg
)
12063 oappend (ins
, "/(bad)");
12066 else if (ins
->intel_syntax
)
12068 if (ins
->modrm
.mod
!= 0 || base
== 5)
12070 if (!ins
->active_seg_prefix
)
12072 oappend_register (ins
, att_names_seg
[ds_reg
- es_reg
]);
12073 oappend (ins
, ":");
12075 print_operand_value (ins
, disp
, dis_style_text
);
12079 else if (bytemode
== v_bnd_mode
12080 || bytemode
== v_bndmk_mode
12081 || bytemode
== bnd_mode
12082 || bytemode
== bnd_swap_mode
12083 || bytemode
== vex_vsib_d_w_dq_mode
12084 || bytemode
== vex_vsib_q_w_dq_mode
)
12086 oappend (ins
, "(bad)");
12091 /* 16 bit address mode */
12094 ins
->used_prefixes
|= ins
->prefixes
& PREFIX_ADDR
;
12095 switch (ins
->modrm
.mod
)
12098 if (ins
->modrm
.rm
== 6)
12101 if (!get16s (ins
, &disp
))
12106 if (!get8s (ins
, &disp
))
12108 if (ins
->vex
.evex
&& shift
> 0)
12113 if (!ins
->intel_syntax
)
12114 if (ins
->modrm
.mod
!= 0 || ins
->modrm
.rm
== 6)
12115 print_displacement (ins
, disp
);
12117 if (ins
->modrm
.mod
!= 0 || ins
->modrm
.rm
!= 6)
12119 oappend_char (ins
, ins
->open_char
);
12120 oappend (ins
, ins
->intel_syntax
? intel_index16
[ins
->modrm
.rm
]
12121 : att_index16
[ins
->modrm
.rm
]);
12122 if (ins
->intel_syntax
12123 && (disp
|| ins
->modrm
.mod
!= 0 || ins
->modrm
.rm
== 6))
12125 if ((bfd_signed_vma
) disp
>= 0)
12126 oappend_char (ins
, '+');
12127 print_displacement (ins
, disp
);
12130 oappend_char (ins
, ins
->close_char
);
12132 else if (ins
->intel_syntax
)
12134 if (!ins
->active_seg_prefix
)
12136 oappend_register (ins
, att_names_seg
[ds_reg
- es_reg
]);
12137 oappend (ins
, ":");
12139 print_operand_value (ins
, disp
& 0xffff, dis_style_text
);
12142 if (ins
->vex
.b
&& ins
->evex_type
== evex_default
)
12144 ins
->evex_used
|= EVEX_b_used
;
12146 /* Broadcast can only ever be valid for memory sources. */
12147 if (ins
->obufp
== ins
->op_out
[0])
12148 ins
->vex
.no_broadcast
= true;
12150 if (!ins
->vex
.no_broadcast
12151 && (!ins
->intel_syntax
|| !(ins
->evex_used
& EVEX_len_used
)))
12153 if (bytemode
== xh_mode
)
12155 switch (ins
->vex
.length
)
12158 oappend (ins
, "{1to8}");
12161 oappend (ins
, "{1to16}");
12164 oappend (ins
, "{1to32}");
12170 else if (bytemode
== q_mode
12171 || bytemode
== ymmq_mode
)
12172 ins
->vex
.no_broadcast
= true;
12173 else if (ins
->vex
.w
12174 || bytemode
== evex_half_bcst_xmmqdh_mode
12175 || bytemode
== evex_half_bcst_xmmq_mode
)
12177 switch (ins
->vex
.length
)
12180 oappend (ins
, "{1to2}");
12183 oappend (ins
, "{1to4}");
12186 oappend (ins
, "{1to8}");
12192 else if (bytemode
== x_mode
12193 || bytemode
== evex_half_bcst_xmmqh_mode
)
12195 switch (ins
->vex
.length
)
12198 oappend (ins
, "{1to4}");
12201 oappend (ins
, "{1to8}");
12204 oappend (ins
, "{1to16}");
12211 ins
->vex
.no_broadcast
= true;
12213 if (ins
->vex
.no_broadcast
)
12214 oappend (ins
, "{bad}");
12221 OP_E (instr_info
*ins
, int bytemode
, int sizeflag
)
12223 /* Skip mod/rm byte. */
12225 if (!ins
->has_skipped_modrm
)
12228 ins
->has_skipped_modrm
= true;
12231 if (ins
->modrm
.mod
== 3)
12233 if ((sizeflag
& SUFFIX_ALWAYS
)
12234 && (bytemode
== b_swap_mode
12235 || bytemode
== bnd_swap_mode
12236 || bytemode
== v_swap_mode
))
12237 swap_operand (ins
);
12239 print_register (ins
, ins
->modrm
.rm
, REX_B
, bytemode
, sizeflag
);
12243 /* Masking is invalid for insns with GPR-like memory destination. Set the
12244 flag uniformly, as the consumer will inspect it only for the destination
12246 if (ins
->vex
.mask_register_specifier
)
12247 ins
->illegal_masking
= true;
12249 return OP_E_memory (ins
, bytemode
, sizeflag
);
12253 OP_indirE (instr_info
*ins
, int bytemode
, int sizeflag
)
12255 if (ins
->modrm
.mod
== 3 && bytemode
== f_mode
)
12256 /* bad lcall/ljmp */
12257 return BadOp (ins
);
12258 if (!ins
->intel_syntax
)
12259 oappend (ins
, "*");
12260 return OP_E (ins
, bytemode
, sizeflag
);
12264 OP_G (instr_info
*ins
, int bytemode
, int sizeflag
)
12266 print_register (ins
, ins
->modrm
.reg
, REX_R
, bytemode
, sizeflag
);
12271 OP_REG (instr_info
*ins
, int code
, int sizeflag
)
12278 case es_reg
: case ss_reg
: case cs_reg
:
12279 case ds_reg
: case fs_reg
: case gs_reg
:
12280 oappend_register (ins
, att_names_seg
[code
- es_reg
]);
12285 if (ins
->rex
& REX_B
)
12287 if (ins
->rex2
& REX_B
)
12292 case ax_reg
: case cx_reg
: case dx_reg
: case bx_reg
:
12293 case sp_reg
: case bp_reg
: case si_reg
: case di_reg
:
12294 s
= att_names16
[code
- ax_reg
+ add
];
12296 case ah_reg
: case ch_reg
: case dh_reg
: case bh_reg
:
12298 /* Fall through. */
12299 case al_reg
: case cl_reg
: case dl_reg
: case bl_reg
:
12301 s
= att_names8rex
[code
- al_reg
+ add
];
12303 s
= att_names8
[code
- al_reg
];
12305 case rAX_reg
: case rCX_reg
: case rDX_reg
: case rBX_reg
:
12306 case rSP_reg
: case rBP_reg
: case rSI_reg
: case rDI_reg
:
12307 if (ins
->address_mode
== mode_64bit
12308 && ((sizeflag
& DFLAG
) || (ins
->rex
& REX_W
)))
12310 s
= att_names64
[code
- rAX_reg
+ add
];
12313 code
+= eAX_reg
- rAX_reg
;
12314 /* Fall through. */
12315 case eAX_reg
: case eCX_reg
: case eDX_reg
: case eBX_reg
:
12316 case eSP_reg
: case eBP_reg
: case eSI_reg
: case eDI_reg
:
12318 if (ins
->rex
& REX_W
)
12319 s
= att_names64
[code
- eAX_reg
+ add
];
12322 if (sizeflag
& DFLAG
)
12323 s
= att_names32
[code
- eAX_reg
+ add
];
12325 s
= att_names16
[code
- eAX_reg
+ add
];
12326 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
12330 oappend (ins
, INTERNAL_DISASSEMBLER_ERROR
);
12333 oappend_register (ins
, s
);
12338 OP_IMREG (instr_info
*ins
, int code
, int sizeflag
)
12345 if (!ins
->intel_syntax
)
12347 oappend (ins
, "(%dx)");
12350 s
= att_names16
[dx_reg
- ax_reg
];
12352 case al_reg
: case cl_reg
:
12353 s
= att_names8
[code
- al_reg
];
12357 if (ins
->rex
& REX_W
)
12362 /* Fall through. */
12363 case z_mode_ax_reg
:
12364 if ((ins
->rex
& REX_W
) || (sizeflag
& DFLAG
))
12368 if (!(ins
->rex
& REX_W
))
12369 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
12372 oappend (ins
, INTERNAL_DISASSEMBLER_ERROR
);
12375 oappend_register (ins
, s
);
12380 OP_I (instr_info
*ins
, int bytemode
, int sizeflag
)
12387 if (!fetch_code (ins
->info
, ins
->codep
+ 1))
12389 op
= *ins
->codep
++;
12393 if (ins
->rex
& REX_W
)
12395 if (!get32s (ins
, &op
))
12400 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
12401 if (sizeflag
& DFLAG
)
12404 if (!get32 (ins
, &op
))
12409 /* Fall through. */
12411 if (!get16 (ins
, &op
))
12417 if (ins
->intel_syntax
)
12418 oappend_with_style (ins
, "1", dis_style_immediate
);
12420 oappend_with_style (ins
, "$1", dis_style_immediate
);
12423 oappend (ins
, INTERNAL_DISASSEMBLER_ERROR
);
12427 oappend_immediate (ins
, op
);
12432 OP_I64 (instr_info
*ins
, int bytemode
, int sizeflag
)
12436 if (bytemode
!= v_mode
|| ins
->address_mode
!= mode_64bit
12437 || !(ins
->rex
& REX_W
))
12438 return OP_I (ins
, bytemode
, sizeflag
);
12442 if (!get64 (ins
, &op
))
12445 oappend_immediate (ins
, op
);
12450 OP_sI (instr_info
*ins
, int bytemode
, int sizeflag
)
12458 if (!get8s (ins
, &op
))
12460 if (bytemode
== b_T_mode
)
12462 if (ins
->address_mode
!= mode_64bit
12463 || !((sizeflag
& DFLAG
) || (ins
->rex
& REX_W
)))
12465 /* The operand-size prefix is overridden by a REX prefix. */
12466 if ((sizeflag
& DFLAG
) || (ins
->rex
& REX_W
))
12474 if (!(ins
->rex
& REX_W
))
12476 if (sizeflag
& DFLAG
)
12484 /* The operand-size prefix is overridden by a REX prefix. */
12485 if (!(sizeflag
& DFLAG
) && !(ins
->rex
& REX_W
))
12487 if (!get16 (ins
, &op
))
12490 else if (!get32s (ins
, &op
))
12494 oappend (ins
, INTERNAL_DISASSEMBLER_ERROR
);
12498 oappend_immediate (ins
, op
);
12503 OP_J (instr_info
*ins
, int bytemode
, int sizeflag
)
12507 bfd_vma segment
= 0;
12512 if (!get8s (ins
, &disp
))
12517 if ((sizeflag
& DFLAG
)
12518 || (ins
->address_mode
== mode_64bit
12519 && ((ins
->isa64
== intel64
&& bytemode
!= dqw_mode
)
12520 || (ins
->rex
& REX_W
))))
12522 if (!get32s (ins
, &disp
))
12527 if (!get16s (ins
, &disp
))
12529 /* In 16bit mode, address is wrapped around at 64k within
12530 the same segment. Otherwise, a data16 prefix on a jump
12531 instruction means that the pc is masked to 16 bits after
12532 the displacement is added! */
12534 if ((ins
->prefixes
& PREFIX_DATA
) == 0)
12535 segment
= ((ins
->start_pc
+ (ins
->codep
- ins
->start_codep
))
12536 & ~((bfd_vma
) 0xffff));
12538 if (ins
->address_mode
!= mode_64bit
12539 || (ins
->isa64
!= intel64
&& !(ins
->rex
& REX_W
)))
12540 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
12543 oappend (ins
, INTERNAL_DISASSEMBLER_ERROR
);
12546 disp
= ((ins
->start_pc
+ (ins
->codep
- ins
->start_codep
) + disp
) & mask
)
12548 set_op (ins
, disp
, false);
12549 print_operand_value (ins
, disp
, dis_style_text
);
12554 OP_SEG (instr_info
*ins
, int bytemode
, int sizeflag
)
12556 if (bytemode
== w_mode
)
12558 oappend_register (ins
, att_names_seg
[ins
->modrm
.reg
]);
12561 return OP_E (ins
, ins
->modrm
.mod
== 3 ? bytemode
: w_mode
, sizeflag
);
12565 OP_DIR (instr_info
*ins
, int dummy ATTRIBUTE_UNUSED
, int sizeflag
)
12567 bfd_vma seg
, offset
;
12571 if (sizeflag
& DFLAG
)
12573 if (!get32 (ins
, &offset
))
12576 else if (!get16 (ins
, &offset
))
12578 if (!get16 (ins
, &seg
))
12580 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
12582 res
= snprintf (scratch
, ARRAY_SIZE (scratch
),
12583 ins
->intel_syntax
? "0x%x:0x%x" : "$0x%x,$0x%x",
12584 (unsigned) seg
, (unsigned) offset
);
12585 if (res
< 0 || (size_t) res
>= ARRAY_SIZE (scratch
))
12587 oappend (ins
, scratch
);
12592 OP_OFF (instr_info
*ins
, int bytemode
, int sizeflag
)
12596 if (ins
->intel_syntax
&& (sizeflag
& SUFFIX_ALWAYS
))
12597 intel_operand_size (ins
, bytemode
, sizeflag
);
12600 if ((sizeflag
& AFLAG
) || ins
->address_mode
== mode_64bit
)
12602 if (!get32 (ins
, &off
))
12607 if (!get16 (ins
, &off
))
12611 if (ins
->intel_syntax
)
12613 if (!ins
->active_seg_prefix
)
12615 oappend_register (ins
, att_names_seg
[ds_reg
- es_reg
]);
12616 oappend (ins
, ":");
12619 print_operand_value (ins
, off
, dis_style_address_offset
);
12624 OP_OFF64 (instr_info
*ins
, int bytemode
, int sizeflag
)
12628 if (ins
->address_mode
!= mode_64bit
12629 || (ins
->prefixes
& PREFIX_ADDR
))
12630 return OP_OFF (ins
, bytemode
, sizeflag
);
12632 if (ins
->intel_syntax
&& (sizeflag
& SUFFIX_ALWAYS
))
12633 intel_operand_size (ins
, bytemode
, sizeflag
);
12636 if (!get64 (ins
, &off
))
12639 if (ins
->intel_syntax
)
12641 if (!ins
->active_seg_prefix
)
12643 oappend_register (ins
, att_names_seg
[ds_reg
- es_reg
]);
12644 oappend (ins
, ":");
12647 print_operand_value (ins
, off
, dis_style_address_offset
);
12652 ptr_reg (instr_info
*ins
, int code
, int sizeflag
)
12656 *ins
->obufp
++ = ins
->open_char
;
12657 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_ADDR
);
12658 if (ins
->address_mode
== mode_64bit
)
12660 if (!(sizeflag
& AFLAG
))
12661 s
= att_names32
[code
- eAX_reg
];
12663 s
= att_names64
[code
- eAX_reg
];
12665 else if (sizeflag
& AFLAG
)
12666 s
= att_names32
[code
- eAX_reg
];
12668 s
= att_names16
[code
- eAX_reg
];
12669 oappend_register (ins
, s
);
12670 oappend_char (ins
, ins
->close_char
);
12674 OP_ESreg (instr_info
*ins
, int code
, int sizeflag
)
12676 if (ins
->intel_syntax
)
12678 switch (ins
->codep
[-1])
12680 case 0x6d: /* insw/insl */
12681 intel_operand_size (ins
, z_mode
, sizeflag
);
12683 case 0xa5: /* movsw/movsl/movsq */
12684 case 0xa7: /* cmpsw/cmpsl/cmpsq */
12685 case 0xab: /* stosw/stosl */
12686 case 0xaf: /* scasw/scasl */
12687 intel_operand_size (ins
, v_mode
, sizeflag
);
12690 intel_operand_size (ins
, b_mode
, sizeflag
);
12693 oappend_register (ins
, att_names_seg
[0]);
12694 oappend_char (ins
, ':');
12695 ptr_reg (ins
, code
, sizeflag
);
12700 OP_DSreg (instr_info
*ins
, int code
, int sizeflag
)
12702 if (ins
->intel_syntax
)
12704 switch (ins
->codep
[-1])
12706 case 0x6f: /* outsw/outsl */
12707 intel_operand_size (ins
, z_mode
, sizeflag
);
12709 case 0xa5: /* movsw/movsl/movsq */
12710 case 0xa7: /* cmpsw/cmpsl/cmpsq */
12711 case 0xad: /* lodsw/lodsl/lodsq */
12712 intel_operand_size (ins
, v_mode
, sizeflag
);
12715 intel_operand_size (ins
, b_mode
, sizeflag
);
12718 /* Set ins->active_seg_prefix to PREFIX_DS if it is unset so that the
12719 default segment register DS is printed. */
12720 if (!ins
->active_seg_prefix
)
12721 ins
->active_seg_prefix
= PREFIX_DS
;
12723 ptr_reg (ins
, code
, sizeflag
);
12728 OP_C (instr_info
*ins
, int dummy ATTRIBUTE_UNUSED
,
12729 int sizeflag ATTRIBUTE_UNUSED
)
12734 if (ins
->rex
& REX_R
)
12739 else if (ins
->address_mode
!= mode_64bit
&& (ins
->prefixes
& PREFIX_LOCK
))
12741 ins
->all_prefixes
[ins
->last_lock_prefix
] = 0;
12742 ins
->used_prefixes
|= PREFIX_LOCK
;
12747 res
= snprintf (scratch
, ARRAY_SIZE (scratch
), "%%cr%d",
12748 ins
->modrm
.reg
+ add
);
12749 if (res
< 0 || (size_t) res
>= ARRAY_SIZE (scratch
))
12751 oappend_register (ins
, scratch
);
12756 OP_D (instr_info
*ins
, int dummy ATTRIBUTE_UNUSED
,
12757 int sizeflag ATTRIBUTE_UNUSED
)
12763 if (ins
->rex
& REX_R
)
12767 res
= snprintf (scratch
, ARRAY_SIZE (scratch
),
12768 ins
->intel_syntax
? "dr%d" : "%%db%d",
12769 ins
->modrm
.reg
+ add
);
12770 if (res
< 0 || (size_t) res
>= ARRAY_SIZE (scratch
))
12772 oappend (ins
, scratch
);
12777 OP_T (instr_info
*ins
, int dummy ATTRIBUTE_UNUSED
,
12778 int sizeflag ATTRIBUTE_UNUSED
)
12783 res
= snprintf (scratch
, ARRAY_SIZE (scratch
), "%%tr%d", ins
->modrm
.reg
);
12784 if (res
< 0 || (size_t) res
>= ARRAY_SIZE (scratch
))
12786 oappend_register (ins
, scratch
);
12791 OP_MMX (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
12792 int sizeflag ATTRIBUTE_UNUSED
)
12794 int reg
= ins
->modrm
.reg
;
12795 const char (*names
)[8];
12797 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
12798 if (ins
->prefixes
& PREFIX_DATA
)
12800 names
= att_names_xmm
;
12802 if (ins
->rex
& REX_R
)
12806 names
= att_names_mm
;
12807 oappend_register (ins
, names
[reg
]);
12812 print_vector_reg (instr_info
*ins
, unsigned int reg
, int bytemode
)
12814 const char (*names
)[8];
12816 if (bytemode
== xmmq_mode
12817 || bytemode
== evex_half_bcst_xmmqh_mode
12818 || bytemode
== evex_half_bcst_xmmq_mode
)
12820 switch (ins
->vex
.length
)
12825 names
= att_names_xmm
;
12828 names
= att_names_ymm
;
12829 ins
->evex_used
|= EVEX_len_used
;
12835 else if (bytemode
== ymm_mode
)
12836 names
= att_names_ymm
;
12837 else if (bytemode
== tmm_mode
)
12841 oappend (ins
, "(bad)");
12844 names
= att_names_tmm
;
12846 else if (ins
->need_vex
12847 && bytemode
!= xmm_mode
12848 && bytemode
!= scalar_mode
12849 && bytemode
!= xmmdw_mode
12850 && bytemode
!= xmmqd_mode
12851 && bytemode
!= evex_half_bcst_xmmqdh_mode
12852 && bytemode
!= w_swap_mode
12853 && bytemode
!= b_mode
12854 && bytemode
!= w_mode
12855 && bytemode
!= d_mode
12856 && bytemode
!= q_mode
)
12858 ins
->evex_used
|= EVEX_len_used
;
12859 switch (ins
->vex
.length
)
12862 names
= att_names_xmm
;
12866 || bytemode
!= vex_vsib_q_w_dq_mode
)
12867 names
= att_names_ymm
;
12869 names
= att_names_xmm
;
12873 || bytemode
!= vex_vsib_q_w_dq_mode
)
12874 names
= att_names_zmm
;
12876 names
= att_names_ymm
;
12883 names
= att_names_xmm
;
12884 oappend_register (ins
, names
[reg
]);
12888 OP_XMM (instr_info
*ins
, int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
12890 unsigned int reg
= ins
->modrm
.reg
;
12893 if (ins
->rex
& REX_R
)
12897 if (ins
->rex2
& REX_R
)
12901 if (bytemode
== tmm_mode
)
12902 ins
->modrm
.reg
= reg
;
12903 else if (bytemode
== scalar_mode
)
12904 ins
->vex
.no_broadcast
= true;
12906 print_vector_reg (ins
, reg
, bytemode
);
12911 OP_EM (instr_info
*ins
, int bytemode
, int sizeflag
)
12914 const char (*names
)[8];
12916 if (ins
->modrm
.mod
!= 3)
12918 if (ins
->intel_syntax
12919 && (bytemode
== v_mode
|| bytemode
== v_swap_mode
))
12921 bytemode
= (ins
->prefixes
& PREFIX_DATA
) ? x_mode
: q_mode
;
12922 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
12924 return OP_E (ins
, bytemode
, sizeflag
);
12927 if ((sizeflag
& SUFFIX_ALWAYS
) && bytemode
== v_swap_mode
)
12928 swap_operand (ins
);
12930 /* Skip mod/rm byte. */
12933 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
12934 reg
= ins
->modrm
.rm
;
12935 if (ins
->prefixes
& PREFIX_DATA
)
12937 names
= att_names_xmm
;
12939 if (ins
->rex
& REX_B
)
12943 names
= att_names_mm
;
12944 oappend_register (ins
, names
[reg
]);
12948 /* cvt* are the only instructions in sse2 which have
12949 both SSE and MMX operands and also have 0x66 prefix
12950 in their opcode. 0x66 was originally used to differentiate
12951 between SSE and MMX instruction(operands). So we have to handle the
12952 cvt* separately using OP_EMC and OP_MXC */
12954 OP_EMC (instr_info
*ins
, int bytemode
, int sizeflag
)
12956 if (ins
->modrm
.mod
!= 3)
12958 if (ins
->intel_syntax
&& bytemode
== v_mode
)
12960 bytemode
= (ins
->prefixes
& PREFIX_DATA
) ? x_mode
: q_mode
;
12961 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
12963 return OP_E (ins
, bytemode
, sizeflag
);
12966 /* Skip mod/rm byte. */
12969 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
12970 oappend_register (ins
, att_names_mm
[ins
->modrm
.rm
]);
12975 OP_MXC (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
12976 int sizeflag ATTRIBUTE_UNUSED
)
12978 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
12979 oappend_register (ins
, att_names_mm
[ins
->modrm
.reg
]);
12984 OP_EX (instr_info
*ins
, int bytemode
, int sizeflag
)
12988 /* Skip mod/rm byte. */
12992 if (bytemode
== dq_mode
)
12993 bytemode
= ins
->vex
.w
? q_mode
: d_mode
;
12995 if (ins
->modrm
.mod
!= 3)
12996 return OP_E_memory (ins
, bytemode
, sizeflag
);
12998 reg
= ins
->modrm
.rm
;
13000 if (ins
->rex
& REX_B
)
13002 if (ins
->rex2
& REX_B
)
13007 if ((ins
->rex
& REX_X
))
13011 if ((sizeflag
& SUFFIX_ALWAYS
)
13012 && (bytemode
== x_swap_mode
13013 || bytemode
== w_swap_mode
13014 || bytemode
== d_swap_mode
13015 || bytemode
== q_swap_mode
))
13016 swap_operand (ins
);
13018 if (bytemode
== tmm_mode
)
13019 ins
->modrm
.rm
= reg
;
13021 print_vector_reg (ins
, reg
, bytemode
);
13026 OP_R (instr_info
*ins
, int bytemode
, int sizeflag
)
13028 if (ins
->modrm
.mod
!= 3)
13029 return BadOp (ins
);
13037 return OP_E (ins
, bytemode
, sizeflag
);
13039 return OP_EM (ins
, x_mode
, sizeflag
);
13041 if (ins
->vex
.length
<= 128)
13043 return BadOp (ins
);
13046 return OP_EX (ins
, bytemode
, sizeflag
);
13050 OP_M (instr_info
*ins
, int bytemode
, int sizeflag
)
13052 /* Skip mod/rm byte. */
13056 if (ins
->modrm
.mod
== 3)
13057 /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
13058 return BadOp (ins
);
13060 if (bytemode
== x_mode
)
13061 ins
->vex
.no_broadcast
= true;
13063 return OP_E_memory (ins
, bytemode
, sizeflag
);
13067 OP_0f07 (instr_info
*ins
, int bytemode
, int sizeflag
)
13069 if (ins
->modrm
.mod
!= 3 || ins
->modrm
.rm
!= 0)
13070 return BadOp (ins
);
13071 return OP_E (ins
, bytemode
, sizeflag
);
13074 /* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
13075 32bit mode and "xchg %rax,%rax" in 64bit mode. */
13078 NOP_Fixup (instr_info
*ins
, int opnd
, int sizeflag
)
13080 if ((ins
->prefixes
& PREFIX_DATA
) == 0 && (ins
->rex
& REX_B
) == 0)
13082 ins
->mnemonicendp
= stpcpy (ins
->obuf
, "nop");
13086 return OP_REG (ins
, eAX_reg
, sizeflag
);
13087 return OP_IMREG (ins
, eAX_reg
, sizeflag
);
13090 static const char *const Suffix3DNow
[] = {
13091 /* 00 */ NULL
, NULL
, NULL
, NULL
,
13092 /* 04 */ NULL
, NULL
, NULL
, NULL
,
13093 /* 08 */ NULL
, NULL
, NULL
, NULL
,
13094 /* 0C */ "pi2fw", "pi2fd", NULL
, NULL
,
13095 /* 10 */ NULL
, NULL
, NULL
, NULL
,
13096 /* 14 */ NULL
, NULL
, NULL
, NULL
,
13097 /* 18 */ NULL
, NULL
, NULL
, NULL
,
13098 /* 1C */ "pf2iw", "pf2id", NULL
, NULL
,
13099 /* 20 */ NULL
, NULL
, NULL
, NULL
,
13100 /* 24 */ NULL
, NULL
, NULL
, NULL
,
13101 /* 28 */ NULL
, NULL
, NULL
, NULL
,
13102 /* 2C */ NULL
, NULL
, NULL
, NULL
,
13103 /* 30 */ NULL
, NULL
, NULL
, NULL
,
13104 /* 34 */ NULL
, NULL
, NULL
, NULL
,
13105 /* 38 */ NULL
, NULL
, NULL
, NULL
,
13106 /* 3C */ NULL
, NULL
, NULL
, NULL
,
13107 /* 40 */ NULL
, NULL
, NULL
, NULL
,
13108 /* 44 */ NULL
, NULL
, NULL
, NULL
,
13109 /* 48 */ NULL
, NULL
, NULL
, NULL
,
13110 /* 4C */ NULL
, NULL
, NULL
, NULL
,
13111 /* 50 */ NULL
, NULL
, NULL
, NULL
,
13112 /* 54 */ NULL
, NULL
, NULL
, NULL
,
13113 /* 58 */ NULL
, NULL
, NULL
, NULL
,
13114 /* 5C */ NULL
, NULL
, NULL
, NULL
,
13115 /* 60 */ NULL
, NULL
, NULL
, NULL
,
13116 /* 64 */ NULL
, NULL
, NULL
, NULL
,
13117 /* 68 */ NULL
, NULL
, NULL
, NULL
,
13118 /* 6C */ NULL
, NULL
, NULL
, NULL
,
13119 /* 70 */ NULL
, NULL
, NULL
, NULL
,
13120 /* 74 */ NULL
, NULL
, NULL
, NULL
,
13121 /* 78 */ NULL
, NULL
, NULL
, NULL
,
13122 /* 7C */ NULL
, NULL
, NULL
, NULL
,
13123 /* 80 */ NULL
, NULL
, NULL
, NULL
,
13124 /* 84 */ NULL
, NULL
, NULL
, NULL
,
13125 /* 88 */ NULL
, NULL
, "pfnacc", NULL
,
13126 /* 8C */ NULL
, NULL
, "pfpnacc", NULL
,
13127 /* 90 */ "pfcmpge", NULL
, NULL
, NULL
,
13128 /* 94 */ "pfmin", NULL
, "pfrcp", "pfrsqrt",
13129 /* 98 */ NULL
, NULL
, "pfsub", NULL
,
13130 /* 9C */ NULL
, NULL
, "pfadd", NULL
,
13131 /* A0 */ "pfcmpgt", NULL
, NULL
, NULL
,
13132 /* A4 */ "pfmax", NULL
, "pfrcpit1", "pfrsqit1",
13133 /* A8 */ NULL
, NULL
, "pfsubr", NULL
,
13134 /* AC */ NULL
, NULL
, "pfacc", NULL
,
13135 /* B0 */ "pfcmpeq", NULL
, NULL
, NULL
,
13136 /* B4 */ "pfmul", NULL
, "pfrcpit2", "pmulhrw",
13137 /* B8 */ NULL
, NULL
, NULL
, "pswapd",
13138 /* BC */ NULL
, NULL
, NULL
, "pavgusb",
13139 /* C0 */ NULL
, NULL
, NULL
, NULL
,
13140 /* C4 */ NULL
, NULL
, NULL
, NULL
,
13141 /* C8 */ NULL
, NULL
, NULL
, NULL
,
13142 /* CC */ NULL
, NULL
, NULL
, NULL
,
13143 /* D0 */ NULL
, NULL
, NULL
, NULL
,
13144 /* D4 */ NULL
, NULL
, NULL
, NULL
,
13145 /* D8 */ NULL
, NULL
, NULL
, NULL
,
13146 /* DC */ NULL
, NULL
, NULL
, NULL
,
13147 /* E0 */ NULL
, NULL
, NULL
, NULL
,
13148 /* E4 */ NULL
, NULL
, NULL
, NULL
,
13149 /* E8 */ NULL
, NULL
, NULL
, NULL
,
13150 /* EC */ NULL
, NULL
, NULL
, NULL
,
13151 /* F0 */ NULL
, NULL
, NULL
, NULL
,
13152 /* F4 */ NULL
, NULL
, NULL
, NULL
,
13153 /* F8 */ NULL
, NULL
, NULL
, NULL
,
13154 /* FC */ NULL
, NULL
, NULL
, NULL
,
13158 OP_3DNowSuffix (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
13159 int sizeflag ATTRIBUTE_UNUSED
)
13161 const char *mnemonic
;
13163 if (!fetch_code (ins
->info
, ins
->codep
+ 1))
13165 /* AMD 3DNow! instructions are specified by an opcode suffix in the
13166 place where an 8-bit immediate would normally go. ie. the last
13167 byte of the instruction. */
13168 ins
->obufp
= ins
->mnemonicendp
;
13169 mnemonic
= Suffix3DNow
[*ins
->codep
++];
13171 ins
->obufp
= stpcpy (ins
->obufp
, mnemonic
);
13174 /* Since a variable sized ins->modrm/ins->sib chunk is between the start
13175 of the opcode (0x0f0f) and the opcode suffix, we need to do
13176 all the ins->modrm processing first, and don't know until now that
13177 we have a bad opcode. This necessitates some cleaning up. */
13178 ins
->op_out
[0][0] = '\0';
13179 ins
->op_out
[1][0] = '\0';
13182 ins
->mnemonicendp
= ins
->obufp
;
13186 static const struct op simd_cmp_op
[] =
13188 { STRING_COMMA_LEN ("eq") },
13189 { STRING_COMMA_LEN ("lt") },
13190 { STRING_COMMA_LEN ("le") },
13191 { STRING_COMMA_LEN ("unord") },
13192 { STRING_COMMA_LEN ("neq") },
13193 { STRING_COMMA_LEN ("nlt") },
13194 { STRING_COMMA_LEN ("nle") },
13195 { STRING_COMMA_LEN ("ord") }
13198 static const struct op vex_cmp_op
[] =
13200 { STRING_COMMA_LEN ("eq_uq") },
13201 { STRING_COMMA_LEN ("nge") },
13202 { STRING_COMMA_LEN ("ngt") },
13203 { STRING_COMMA_LEN ("false") },
13204 { STRING_COMMA_LEN ("neq_oq") },
13205 { STRING_COMMA_LEN ("ge") },
13206 { STRING_COMMA_LEN ("gt") },
13207 { STRING_COMMA_LEN ("true") },
13208 { STRING_COMMA_LEN ("eq_os") },
13209 { STRING_COMMA_LEN ("lt_oq") },
13210 { STRING_COMMA_LEN ("le_oq") },
13211 { STRING_COMMA_LEN ("unord_s") },
13212 { STRING_COMMA_LEN ("neq_us") },
13213 { STRING_COMMA_LEN ("nlt_uq") },
13214 { STRING_COMMA_LEN ("nle_uq") },
13215 { STRING_COMMA_LEN ("ord_s") },
13216 { STRING_COMMA_LEN ("eq_us") },
13217 { STRING_COMMA_LEN ("nge_uq") },
13218 { STRING_COMMA_LEN ("ngt_uq") },
13219 { STRING_COMMA_LEN ("false_os") },
13220 { STRING_COMMA_LEN ("neq_os") },
13221 { STRING_COMMA_LEN ("ge_oq") },
13222 { STRING_COMMA_LEN ("gt_oq") },
13223 { STRING_COMMA_LEN ("true_us") },
13227 CMP_Fixup (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
13228 int sizeflag ATTRIBUTE_UNUSED
)
13230 unsigned int cmp_type
;
13232 if (!fetch_code (ins
->info
, ins
->codep
+ 1))
13234 cmp_type
= *ins
->codep
++;
13235 if (cmp_type
< ARRAY_SIZE (simd_cmp_op
))
13238 char *p
= ins
->mnemonicendp
- 2;
13242 sprintf (p
, "%s%s", simd_cmp_op
[cmp_type
].name
, suffix
);
13243 ins
->mnemonicendp
+= simd_cmp_op
[cmp_type
].len
;
13245 else if (ins
->need_vex
13246 && cmp_type
< ARRAY_SIZE (simd_cmp_op
) + ARRAY_SIZE (vex_cmp_op
))
13249 char *p
= ins
->mnemonicendp
- 2;
13253 cmp_type
-= ARRAY_SIZE (simd_cmp_op
);
13254 sprintf (p
, "%s%s", vex_cmp_op
[cmp_type
].name
, suffix
);
13255 ins
->mnemonicendp
+= vex_cmp_op
[cmp_type
].len
;
13259 /* We have a reserved extension byte. Output it directly. */
13260 oappend_immediate (ins
, cmp_type
);
13266 OP_Mwait (instr_info
*ins
, int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
13268 /* mwait %eax,%ecx / mwaitx %eax,%ecx,%ebx */
13269 if (!ins
->intel_syntax
)
13271 strcpy (ins
->op_out
[0], att_names32
[0] + ins
->intel_syntax
);
13272 strcpy (ins
->op_out
[1], att_names32
[1] + ins
->intel_syntax
);
13273 if (bytemode
== eBX_reg
)
13274 strcpy (ins
->op_out
[2], att_names32
[3] + ins
->intel_syntax
);
13275 ins
->two_source_ops
= true;
13277 /* Skip mod/rm byte. */
13284 OP_Monitor (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
13285 int sizeflag ATTRIBUTE_UNUSED
)
13287 /* monitor %{e,r,}ax,%ecx,%edx" */
13288 if (!ins
->intel_syntax
)
13290 const char (*names
)[8] = (ins
->address_mode
== mode_64bit
13291 ? att_names64
: att_names32
);
13293 if (ins
->prefixes
& PREFIX_ADDR
)
13295 /* Remove "addr16/addr32". */
13296 ins
->all_prefixes
[ins
->last_addr_prefix
] = 0;
13297 names
= (ins
->address_mode
!= mode_32bit
13298 ? att_names32
: att_names16
);
13299 ins
->used_prefixes
|= PREFIX_ADDR
;
13301 else if (ins
->address_mode
== mode_16bit
)
13302 names
= att_names16
;
13303 strcpy (ins
->op_out
[0], names
[0] + ins
->intel_syntax
);
13304 strcpy (ins
->op_out
[1], att_names32
[1] + ins
->intel_syntax
);
13305 strcpy (ins
->op_out
[2], att_names32
[2] + ins
->intel_syntax
);
13306 ins
->two_source_ops
= true;
13308 /* Skip mod/rm byte. */
13315 REP_Fixup (instr_info
*ins
, int bytemode
, int sizeflag
)
13317 /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
13319 if (ins
->prefixes
& PREFIX_REPZ
)
13320 ins
->all_prefixes
[ins
->last_repz_prefix
] = REP_PREFIX
;
13327 return OP_IMREG (ins
, bytemode
, sizeflag
);
13329 return OP_ESreg (ins
, bytemode
, sizeflag
);
13331 return OP_DSreg (ins
, bytemode
, sizeflag
);
13340 SEP_Fixup (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
13341 int sizeflag ATTRIBUTE_UNUSED
)
13343 if (ins
->isa64
!= amd64
)
13346 ins
->obufp
= ins
->obuf
;
13348 ins
->mnemonicendp
= ins
->obufp
;
13353 /* For BND-prefixed instructions 0xF2 prefix should be displayed as
13357 BND_Fixup (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
13358 int sizeflag ATTRIBUTE_UNUSED
)
13360 if (ins
->prefixes
& PREFIX_REPNZ
)
13361 ins
->all_prefixes
[ins
->last_repnz_prefix
] = BND_PREFIX
;
13365 /* For NOTRACK-prefixed instructions, 0x3E prefix should be displayed as
13369 NOTRACK_Fixup (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
13370 int sizeflag ATTRIBUTE_UNUSED
)
13372 /* Since active_seg_prefix is not set in 64-bit mode, check whether
13373 we've seen a PREFIX_DS. */
13374 if ((ins
->prefixes
& PREFIX_DS
) != 0
13375 && (ins
->address_mode
!= mode_64bit
|| ins
->last_data_prefix
< 0))
13377 /* NOTRACK prefix is only valid on indirect branch instructions.
13378 NB: DATA prefix is unsupported for Intel64. */
13379 ins
->active_seg_prefix
= 0;
13380 ins
->all_prefixes
[ins
->last_seg_prefix
] = NOTRACK_PREFIX
;
13385 /* Similar to OP_E. But the 0xf2/0xf3 ins->prefixes should be displayed as
13386 "xacquire"/"xrelease" for memory operand if there is a LOCK prefix.
13390 HLE_Fixup1 (instr_info
*ins
, int bytemode
, int sizeflag
)
13392 if (ins
->modrm
.mod
!= 3
13393 && (ins
->prefixes
& PREFIX_LOCK
) != 0)
13395 if (ins
->prefixes
& PREFIX_REPZ
)
13396 ins
->all_prefixes
[ins
->last_repz_prefix
] = XRELEASE_PREFIX
;
13397 if (ins
->prefixes
& PREFIX_REPNZ
)
13398 ins
->all_prefixes
[ins
->last_repnz_prefix
] = XACQUIRE_PREFIX
;
13401 return OP_E (ins
, bytemode
, sizeflag
);
13404 /* Similar to OP_E. But the 0xf2/0xf3 ins->prefixes should be displayed as
13405 "xacquire"/"xrelease" for memory operand. No check for LOCK prefix.
13409 HLE_Fixup2 (instr_info
*ins
, int bytemode
, int sizeflag
)
13411 if (ins
->modrm
.mod
!= 3)
13413 if (ins
->prefixes
& PREFIX_REPZ
)
13414 ins
->all_prefixes
[ins
->last_repz_prefix
] = XRELEASE_PREFIX
;
13415 if (ins
->prefixes
& PREFIX_REPNZ
)
13416 ins
->all_prefixes
[ins
->last_repnz_prefix
] = XACQUIRE_PREFIX
;
13419 return OP_E (ins
, bytemode
, sizeflag
);
13422 /* Similar to OP_E. But the 0xf3 prefixes should be displayed as
13423 "xrelease" for memory operand. No check for LOCK prefix. */
13426 HLE_Fixup3 (instr_info
*ins
, int bytemode
, int sizeflag
)
13428 if (ins
->modrm
.mod
!= 3
13429 && ins
->last_repz_prefix
> ins
->last_repnz_prefix
13430 && (ins
->prefixes
& PREFIX_REPZ
) != 0)
13431 ins
->all_prefixes
[ins
->last_repz_prefix
] = XRELEASE_PREFIX
;
13433 return OP_E (ins
, bytemode
, sizeflag
);
13437 CMPXCHG8B_Fixup (instr_info
*ins
, int bytemode
, int sizeflag
)
13440 if (ins
->rex
& REX_W
)
13442 /* Change cmpxchg8b to cmpxchg16b. */
13443 char *p
= ins
->mnemonicendp
- 2;
13444 ins
->mnemonicendp
= stpcpy (p
, "16b");
13447 else if ((ins
->prefixes
& PREFIX_LOCK
) != 0)
13449 if (ins
->prefixes
& PREFIX_REPZ
)
13450 ins
->all_prefixes
[ins
->last_repz_prefix
] = XRELEASE_PREFIX
;
13451 if (ins
->prefixes
& PREFIX_REPNZ
)
13452 ins
->all_prefixes
[ins
->last_repnz_prefix
] = XACQUIRE_PREFIX
;
13455 return OP_M (ins
, bytemode
, sizeflag
);
13459 XMM_Fixup (instr_info
*ins
, int reg
, int sizeflag ATTRIBUTE_UNUSED
)
13461 const char (*names
)[8] = att_names_xmm
;
13465 switch (ins
->vex
.length
)
13470 names
= att_names_ymm
;
13476 oappend_register (ins
, names
[reg
]);
13481 FXSAVE_Fixup (instr_info
*ins
, int bytemode
, int sizeflag
)
13483 /* Add proper suffix to "fxsave" and "fxrstor". */
13485 if (ins
->rex
& REX_W
)
13487 char *p
= ins
->mnemonicendp
;
13491 ins
->mnemonicendp
= p
;
13493 return OP_M (ins
, bytemode
, sizeflag
);
13496 /* Display the destination register operand for instructions with
13500 OP_VEX (instr_info
*ins
, int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
13502 int reg
, modrm_reg
, sib_index
= -1;
13503 const char (*names
)[8];
13505 if (!ins
->need_vex
)
13508 if (ins
->evex_type
== evex_from_legacy
)
13510 ins
->evex_used
|= EVEX_b_used
;
13515 reg
= ins
->vex
.register_specifier
;
13516 ins
->vex
.register_specifier
= 0;
13517 if (ins
->address_mode
!= mode_64bit
)
13519 if (ins
->vex
.evex
&& !ins
->vex
.v
)
13521 oappend (ins
, "(bad)");
13527 else if (ins
->vex
.evex
&& !ins
->vex
.v
)
13533 oappend_register (ins
, att_names_xmm
[reg
]);
13536 case vex_vsib_d_w_dq_mode
:
13537 case vex_vsib_q_w_dq_mode
:
13538 /* This must be the 3rd operand. */
13539 if (ins
->obufp
!= ins
->op_out
[2])
13541 if (ins
->vex
.length
== 128
13542 || (bytemode
!= vex_vsib_d_w_dq_mode
13544 oappend_register (ins
, att_names_xmm
[reg
]);
13546 oappend_register (ins
, att_names_ymm
[reg
]);
13548 /* All 3 XMM/YMM registers must be distinct. */
13549 modrm_reg
= ins
->modrm
.reg
;
13550 if (ins
->rex
& REX_R
)
13553 if (ins
->has_sib
&& ins
->modrm
.rm
== 4)
13555 sib_index
= ins
->sib
.index
;
13556 if (ins
->rex
& REX_X
)
13560 if (reg
== modrm_reg
|| reg
== sib_index
)
13561 strcpy (ins
->obufp
, "/(bad)");
13562 if (modrm_reg
== sib_index
|| modrm_reg
== reg
)
13563 strcat (ins
->op_out
[0], "/(bad)");
13564 if (sib_index
== modrm_reg
|| sib_index
== reg
)
13565 strcat (ins
->op_out
[1], "/(bad)");
13570 /* All 3 TMM registers must be distinct. */
13572 oappend (ins
, "(bad)");
13575 /* This must be the 3rd operand. */
13576 if (ins
->obufp
!= ins
->op_out
[2])
13578 oappend_register (ins
, att_names_tmm
[reg
]);
13579 if (reg
== ins
->modrm
.reg
|| reg
== ins
->modrm
.rm
)
13580 strcpy (ins
->obufp
, "/(bad)");
13583 if (ins
->modrm
.reg
== ins
->modrm
.rm
|| ins
->modrm
.reg
== reg
13584 || ins
->modrm
.rm
== reg
)
13586 if (ins
->modrm
.reg
<= 8
13587 && (ins
->modrm
.reg
== ins
->modrm
.rm
|| ins
->modrm
.reg
== reg
))
13588 strcat (ins
->op_out
[0], "/(bad)");
13589 if (ins
->modrm
.rm
<= 8
13590 && (ins
->modrm
.rm
== ins
->modrm
.reg
|| ins
->modrm
.rm
== reg
))
13591 strcat (ins
->op_out
[1], "/(bad)");
13597 switch (ins
->vex
.length
)
13603 names
= att_names_xmm
;
13604 ins
->evex_used
|= EVEX_len_used
;
13608 if (ins
->rex
& REX_W
)
13609 names
= att_names64
;
13610 else if (bytemode
== v_mode
13611 && !(sizeflag
& DFLAG
))
13612 names
= att_names16
;
13614 names
= att_names32
;
13617 names
= att_names8rex
;
13620 names
= att_names64
;
13626 oappend (ins
, "(bad)");
13629 names
= att_names_mask
;
13640 names
= att_names_ymm
;
13641 ins
->evex_used
|= EVEX_len_used
;
13647 names
= att_names_mask
;
13650 /* Fall through. */
13652 /* See PR binutils/20893 for a reproducer. */
13653 oappend (ins
, "(bad)");
13658 names
= att_names_zmm
;
13659 ins
->evex_used
|= EVEX_len_used
;
13665 oappend_register (ins
, names
[reg
]);
13670 OP_VexR (instr_info
*ins
, int bytemode
, int sizeflag
)
13672 if (ins
->modrm
.mod
== 3)
13673 return OP_VEX (ins
, bytemode
, sizeflag
);
13678 OP_VexW (instr_info
*ins
, int bytemode
, int sizeflag
)
13680 OP_VEX (ins
, bytemode
, sizeflag
);
13684 /* Swap 2nd and 3rd operands. */
13685 char *tmp
= ins
->op_out
[2];
13687 ins
->op_out
[2] = ins
->op_out
[1];
13688 ins
->op_out
[1] = tmp
;
13694 OP_REG_VexI4 (instr_info
*ins
, int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
13697 const char (*names
)[8] = att_names_xmm
;
13699 if (!fetch_code (ins
->info
, ins
->codep
+ 1))
13701 reg
= *ins
->codep
++;
13703 if (bytemode
!= x_mode
&& bytemode
!= scalar_mode
)
13707 if (ins
->address_mode
!= mode_64bit
)
13710 if (bytemode
== x_mode
&& ins
->vex
.length
== 256)
13711 names
= att_names_ymm
;
13713 oappend_register (ins
, names
[reg
]);
13717 /* Swap 3rd and 4th operands. */
13718 char *tmp
= ins
->op_out
[3];
13720 ins
->op_out
[3] = ins
->op_out
[2];
13721 ins
->op_out
[2] = tmp
;
13727 OP_VexI4 (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
13728 int sizeflag ATTRIBUTE_UNUSED
)
13730 oappend_immediate (ins
, ins
->codep
[-1] & 0xf);
13735 VPCMP_Fixup (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
13736 int sizeflag ATTRIBUTE_UNUSED
)
13738 unsigned int cmp_type
;
13740 if (!ins
->vex
.evex
)
13743 if (!fetch_code (ins
->info
, ins
->codep
+ 1))
13745 cmp_type
= *ins
->codep
++;
13746 /* There are aliases for immediates 0, 1, 2, 4, 5, 6.
13747 If it's the case, print suffix, otherwise - print the immediate. */
13748 if (cmp_type
< ARRAY_SIZE (simd_cmp_op
)
13753 char *p
= ins
->mnemonicendp
- 2;
13755 /* vpcmp* can have both one- and two-lettered suffix. */
13769 sprintf (p
, "%s%s", simd_cmp_op
[cmp_type
].name
, suffix
);
13770 ins
->mnemonicendp
+= simd_cmp_op
[cmp_type
].len
;
13774 /* We have a reserved extension byte. Output it directly. */
13775 oappend_immediate (ins
, cmp_type
);
13780 static const struct op xop_cmp_op
[] =
13782 { STRING_COMMA_LEN ("lt") },
13783 { STRING_COMMA_LEN ("le") },
13784 { STRING_COMMA_LEN ("gt") },
13785 { STRING_COMMA_LEN ("ge") },
13786 { STRING_COMMA_LEN ("eq") },
13787 { STRING_COMMA_LEN ("neq") },
13788 { STRING_COMMA_LEN ("false") },
13789 { STRING_COMMA_LEN ("true") }
13793 VPCOM_Fixup (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
13794 int sizeflag ATTRIBUTE_UNUSED
)
13796 unsigned int cmp_type
;
13798 if (!fetch_code (ins
->info
, ins
->codep
+ 1))
13800 cmp_type
= *ins
->codep
++;
13801 if (cmp_type
< ARRAY_SIZE (xop_cmp_op
))
13804 char *p
= ins
->mnemonicendp
- 2;
13806 /* vpcom* can have both one- and two-lettered suffix. */
13820 sprintf (p
, "%s%s", xop_cmp_op
[cmp_type
].name
, suffix
);
13821 ins
->mnemonicendp
+= xop_cmp_op
[cmp_type
].len
;
13825 /* We have a reserved extension byte. Output it directly. */
13826 oappend_immediate (ins
, cmp_type
);
13831 static const struct op pclmul_op
[] =
13833 { STRING_COMMA_LEN ("lql") },
13834 { STRING_COMMA_LEN ("hql") },
13835 { STRING_COMMA_LEN ("lqh") },
13836 { STRING_COMMA_LEN ("hqh") }
13840 PCLMUL_Fixup (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
13841 int sizeflag ATTRIBUTE_UNUSED
)
13843 unsigned int pclmul_type
;
13845 if (!fetch_code (ins
->info
, ins
->codep
+ 1))
13847 pclmul_type
= *ins
->codep
++;
13848 switch (pclmul_type
)
13859 if (pclmul_type
< ARRAY_SIZE (pclmul_op
))
13862 char *p
= ins
->mnemonicendp
- 3;
13867 sprintf (p
, "%s%s", pclmul_op
[pclmul_type
].name
, suffix
);
13868 ins
->mnemonicendp
+= pclmul_op
[pclmul_type
].len
;
13872 /* We have a reserved extension byte. Output it directly. */
13873 oappend_immediate (ins
, pclmul_type
);
13879 MOVSXD_Fixup (instr_info
*ins
, int bytemode
, int sizeflag
)
13881 /* Add proper suffix to "movsxd". */
13882 char *p
= ins
->mnemonicendp
;
13887 if (!ins
->intel_syntax
)
13890 if (ins
->rex
& REX_W
)
13902 oappend (ins
, INTERNAL_DISASSEMBLER_ERROR
);
13906 ins
->mnemonicendp
= p
;
13908 return OP_E (ins
, bytemode
, sizeflag
);
13912 DistinctDest_Fixup (instr_info
*ins
, int bytemode
, int sizeflag
)
13914 unsigned int reg
= ins
->vex
.register_specifier
;
13915 unsigned int modrm_reg
= ins
->modrm
.reg
;
13916 unsigned int modrm_rm
= ins
->modrm
.rm
;
13918 /* Calc destination register number. */
13919 if (ins
->rex
& REX_R
)
13921 if (ins
->rex2
& REX_R
)
13924 /* Calc src1 register number. */
13925 if (ins
->address_mode
!= mode_64bit
)
13927 else if (ins
->vex
.evex
&& !ins
->vex
.v
)
13930 /* Calc src2 register number. */
13931 if (ins
->modrm
.mod
== 3)
13933 if (ins
->rex
& REX_B
)
13935 if (ins
->rex
& REX_X
)
13939 /* Destination and source registers must be distinct, output bad if
13940 dest == src1 or dest == src2. */
13941 if (modrm_reg
== reg
13942 || (ins
->modrm
.mod
== 3
13943 && modrm_reg
== modrm_rm
))
13945 oappend (ins
, "(bad)");
13948 return OP_XMM (ins
, bytemode
, sizeflag
);
13952 OP_Rounding (instr_info
*ins
, int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
13954 if (ins
->modrm
.mod
!= 3 || !ins
->vex
.b
)
13959 case evex_rounding_64_mode
:
13960 if (ins
->address_mode
!= mode_64bit
|| !ins
->vex
.w
)
13962 /* Fall through. */
13963 case evex_rounding_mode
:
13964 ins
->evex_used
|= EVEX_b_used
;
13965 oappend (ins
, names_rounding
[ins
->vex
.ll
]);
13967 case evex_sae_mode
:
13968 ins
->evex_used
|= EVEX_b_used
;
13969 oappend (ins
, "{");
13974 oappend (ins
, "sae}");
13979 PREFETCHI_Fixup (instr_info
*ins
, int bytemode
, int sizeflag
)
13981 if (ins
->modrm
.mod
!= 0 || ins
->modrm
.rm
!= 5)
13983 if (ins
->intel_syntax
)
13985 ins
->mnemonicendp
= stpcpy (ins
->obuf
, "nop ");
13990 if (ins
->rex
& REX_W
)
13991 ins
->mnemonicendp
= stpcpy (ins
->obuf
, "nopq ");
13994 if (sizeflag
& DFLAG
)
13995 ins
->mnemonicendp
= stpcpy (ins
->obuf
, "nopl ");
13997 ins
->mnemonicendp
= stpcpy (ins
->obuf
, "nopw ");
13998 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
14004 return OP_M (ins
, bytemode
, sizeflag
);
14008 PUSH2_POP2_Fixup (instr_info
*ins
, int bytemode
, int sizeflag
)
14010 if (ins
->modrm
.mod
!= 3)
14013 unsigned int vvvv_reg
= ins
->vex
.register_specifier
14014 | (!ins
->vex
.v
<< 4);
14015 unsigned int rm_reg
= ins
->modrm
.rm
+ (ins
->rex
& REX_B
? 8 : 0)
14016 + (ins
->rex2
& REX_B
? 16 : 0);
14018 /* Push2/Pop2 cannot use RSP and Pop2 cannot pop two same registers. */
14019 if (!ins
->vex
.nd
|| vvvv_reg
== 0x4 || rm_reg
== 0x4
14020 || (!ins
->modrm
.reg
14021 && vvvv_reg
== rm_reg
))
14023 oappend (ins
, "(bad)");
14027 return OP_VEX (ins
, bytemode
, sizeflag
);
14031 JMPABS_Fixup (instr_info
*ins
, int bytemode
, int sizeflag
)
14033 if (ins
->last_rex2_prefix
>= 0)
14037 if ((ins
->prefixes
& (PREFIX_OPCODE
| PREFIX_ADDR
| PREFIX_LOCK
)) != 0x0
14038 || (ins
->rex
& REX_W
) != 0x0)
14040 oappend (ins
, "(bad)");
14044 if (bytemode
== eAX_reg
)
14047 if (!get64 (ins
, &op
))
14050 ins
->mnemonicendp
= stpcpy (ins
->obuf
, "jmpabs");
14051 ins
->rex2
|= REX2_SPECIAL
;
14052 oappend_immediate (ins
, op
);
14057 if (bytemode
== eAX_reg
)
14058 return OP_IMREG (ins
, bytemode
, sizeflag
);
14059 return OP_OFF64 (ins
, bytemode
, sizeflag
);
14063 CFCMOV_Fixup (instr_info
*ins
, int opnd
, int sizeflag
)
14065 /* EVEX.NF is used as a direction bit in the 2-operand case to reverse the
14066 source and destination operands. */
14067 bool dstmem
= !ins
->vex
.nd
&& ins
->vex
.nf
;
14072 return OP_E (ins
, v_swap_mode
, sizeflag
);
14073 return OP_G (ins
, v_mode
, sizeflag
);
14076 /* These bits have been consumed and should be cleared. */
14077 ins
->vex
.nf
= false;
14078 ins
->vex
.mask_register_specifier
= 0;
14081 return OP_G (ins
, v_mode
, sizeflag
);
14082 return OP_E (ins
, v_mode
, sizeflag
);