1 /* Print i386 instructions for GDB, the GNU debugger.
2 Copyright (C) 1988-2022 Free Software Foundation, Inc.
4 This file is part of the GNU opcodes library.
6 This library is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3, or (at your option)
11 It is distributed in the hope that it will be useful, but WITHOUT
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
14 License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19 MA 02110-1301, USA. */
22 /* 80386 instruction printer by Pace Willisson (pace@prep.ai.mit.edu)
24 modified by John Hassey (hassey@dg-rtp.dg.com)
25 x86-64 support added by Jan Hubicka (jh@suse.cz)
26 VIA PadLock support by Michal Ludvig (mludvig@suse.cz). */
28 /* The main tables describing the instructions is essentially a copy
29 of the "Opcode Map" chapter (Appendix A) of the Intel 80386
30 Programmers Manual. Usually, there is a capital letter, followed
31 by a small letter. The capital letter tell the addressing mode,
32 and the small letter tells about the operand size. Refer to
33 the Intel manual for details. */
36 #include "disassemble.h"
38 #include "opcode/i386.h"
39 #include "libiberty.h"
40 #include "safe-ctype.h"
43 typedef struct instr_info instr_info
;
45 static int print_insn (bfd_vma
, instr_info
*);
46 static void dofloat (instr_info
*, int);
47 static void OP_ST (instr_info
*, int, int);
48 static void OP_STi (instr_info
*, int, int);
49 static int putop (instr_info
*, const char *, int);
50 static void oappend (instr_info
*, const char *);
51 static void append_seg (instr_info
*);
52 static void OP_indirE (instr_info
*, int, int);
53 static void print_operand_value (instr_info
*, char *, int, bfd_vma
);
54 static void OP_E_memory (instr_info
*, int, int);
55 static void print_displacement (instr_info
*, char *, bfd_vma
);
56 static void OP_E (instr_info
*, int, int);
57 static void OP_G (instr_info
*, int, int);
58 static bfd_vma
get64 (instr_info
*);
59 static bfd_signed_vma
get32 (instr_info
*);
60 static bfd_signed_vma
get32s (instr_info
*);
61 static int get16 (instr_info
*);
62 static void set_op (instr_info
*, bfd_vma
, int);
63 static void OP_Skip_MODRM (instr_info
*, int, int);
64 static void OP_REG (instr_info
*, int, int);
65 static void OP_IMREG (instr_info
*, int, int);
66 static void OP_I (instr_info
*, int, int);
67 static void OP_I64 (instr_info
*, int, int);
68 static void OP_sI (instr_info
*, int, int);
69 static void OP_J (instr_info
*, int, int);
70 static void OP_SEG (instr_info
*, int, int);
71 static void OP_DIR (instr_info
*, int, int);
72 static void OP_OFF (instr_info
*, int, int);
73 static void OP_OFF64 (instr_info
*, int, int);
74 static void ptr_reg (instr_info
*, int, int);
75 static void OP_ESreg (instr_info
*, int, int);
76 static void OP_DSreg (instr_info
*, int, int);
77 static void OP_C (instr_info
*, int, int);
78 static void OP_D (instr_info
*, int, int);
79 static void OP_T (instr_info
*, int, int);
80 static void OP_MMX (instr_info
*, int, int);
81 static void OP_XMM (instr_info
*, int, int);
82 static void OP_EM (instr_info
*, int, int);
83 static void OP_EX (instr_info
*, int, int);
84 static void OP_EMC (instr_info
*, int,int);
85 static void OP_MXC (instr_info
*, int,int);
86 static void OP_MS (instr_info
*, int, int);
87 static void OP_XS (instr_info
*, int, int);
88 static void OP_M (instr_info
*, int, int);
89 static void OP_VEX (instr_info
*, int, int);
90 static void OP_VexR (instr_info
*, int, int);
91 static void OP_VexW (instr_info
*, int, int);
92 static void OP_Rounding (instr_info
*, int, int);
93 static void OP_REG_VexI4 (instr_info
*, int, int);
94 static void OP_VexI4 (instr_info
*, int, int);
95 static void PCLMUL_Fixup (instr_info
*, int, int);
96 static void VPCMP_Fixup (instr_info
*, int, int);
97 static void VPCOM_Fixup (instr_info
*, int, int);
98 static void OP_0f07 (instr_info
*, int, int);
99 static void OP_Monitor (instr_info
*, int, int);
100 static void OP_Mwait (instr_info
*, int, int);
101 static void NOP_Fixup1 (instr_info
*, int, int);
102 static void NOP_Fixup2 (instr_info
*, int, int);
103 static void OP_3DNowSuffix (instr_info
*, int, int);
104 static void CMP_Fixup (instr_info
*, int, int);
105 static void BadOp (instr_info
*);
106 static void REP_Fixup (instr_info
*, int, int);
107 static void SEP_Fixup (instr_info
*, int, int);
108 static void BND_Fixup (instr_info
*, int, int);
109 static void NOTRACK_Fixup (instr_info
*, int, int);
110 static void HLE_Fixup1 (instr_info
*, int, int);
111 static void HLE_Fixup2 (instr_info
*, int, int);
112 static void HLE_Fixup3 (instr_info
*, int, int);
113 static void CMPXCHG8B_Fixup (instr_info
*, int, int);
114 static void XMM_Fixup (instr_info
*, int, int);
115 static void FXSAVE_Fixup (instr_info
*, int, int);
117 static void MOVSXD_Fixup (instr_info
*, int, int);
118 static void DistinctDest_Fixup (instr_info
*, int, int);
121 /* Points to first byte not fetched. */
122 bfd_byte
*max_fetched
;
123 bfd_byte the_buffer
[MAX_MNEM_SIZE
];
126 OPCODES_SIGJMP_BUF bailout
;
144 enum address_mode address_mode
;
146 /* Flags for the prefixes for the current instruction. See below. */
149 /* REX prefix the current instruction. See below. */
151 /* Bits of REX we've already used. */
154 /* Flags for ins->prefixes which we somehow handled when printing the
155 current instruction. */
158 /* Flags for EVEX bits which we somehow handled when printing the
159 current instruction. */
165 char scratchbuf
[100];
166 unsigned char *start_codep
;
167 unsigned char *insn_codep
;
168 unsigned char *codep
;
169 unsigned char *end_codep
;
170 int last_lock_prefix
;
171 int last_repz_prefix
;
172 int last_repnz_prefix
;
173 int last_data_prefix
;
174 int last_addr_prefix
;
178 /* The active segment register prefix. */
179 int active_seg_prefix
;
181 #define MAX_CODE_LENGTH 15
182 /* We can up to 14 ins->prefixes since the maximum instruction length is
184 int all_prefixes
[MAX_CODE_LENGTH
- 1];
185 disassemble_info
*info
;
194 unsigned char need_modrm
;
206 int register_specifier
;
213 int mask_register_specifier
;
220 unsigned char need_vex
;
222 const char **names64
;
223 const char **names32
;
224 const char **names16
;
226 const char **names8rex
;
227 const char **names_seg
;
230 const char **index16
;
231 const char **names_bnd
;
232 const char **names_mm
;
233 const char **names_xmm
;
234 const char **names_ymm
;
235 const char **names_zmm
;
236 const char **names_tmm
;
237 const char **names_mask
;
239 /* Remember if the current op is a jump instruction. */
242 char op_out
[MAX_OPERANDS
][100];
243 int op_ad
, op_index
[MAX_OPERANDS
];
245 bfd_vma op_address
[MAX_OPERANDS
];
246 bfd_vma op_riprel
[MAX_OPERANDS
];
249 /* On the 386's of 1988, the maximum length of an instruction is 15 bytes.
250 * (see topic "Redundant ins->prefixes" in the "Differences from 8086"
251 * section of the "Virtual 8086 Mode" chapter.)
252 * 'pc' should be the address of this instruction, it will
253 * be used to print the target address if this is a relative jump or call
254 * The function returns the length of this instruction in bytes.
263 enum x86_64_isa isa64
;
267 /* Mark parts used in the REX prefix. When we are testing for
268 empty prefix (for 8bit register REX extension), just mask it
269 out. Otherwise test for REX bit is excuse for existence of REX
270 only in case value is nonzero. */
271 #define USED_REX(value) \
275 if ((ins->rex & value)) \
276 ins->rex_used |= (value) | REX_OPCODE; \
279 ins->rex_used |= REX_OPCODE; \
283 #define EVEX_b_used 1
285 /* Flags stored in PREFIXES. */
286 #define PREFIX_REPZ 1
287 #define PREFIX_REPNZ 2
288 #define PREFIX_LOCK 4
290 #define PREFIX_SS 0x10
291 #define PREFIX_DS 0x20
292 #define PREFIX_ES 0x40
293 #define PREFIX_FS 0x80
294 #define PREFIX_GS 0x100
295 #define PREFIX_DATA 0x200
296 #define PREFIX_ADDR 0x400
297 #define PREFIX_FWAIT 0x800
299 /* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
300 to ADDR (exclusive) are valid. Returns 1 for success, longjmps
302 #define FETCH_DATA(info, addr) \
303 ((addr) <= ((struct dis_private *) (info->private_data))->max_fetched \
304 ? 1 : fetch_data ((info), (addr)))
307 fetch_data (struct disassemble_info
*info
, bfd_byte
*addr
)
310 struct dis_private
*priv
= (struct dis_private
*) info
->private_data
;
311 bfd_vma start
= priv
->insn_start
+ (priv
->max_fetched
- priv
->the_buffer
);
313 if (addr
<= priv
->the_buffer
+ MAX_MNEM_SIZE
)
314 status
= (*info
->read_memory_func
) (start
,
316 addr
- priv
->max_fetched
,
322 /* If we did manage to read at least one byte, then
323 print_insn_i386 will do something sensible. Otherwise, print
324 an error. We do that here because this is where we know
326 if (priv
->max_fetched
== priv
->the_buffer
)
327 (*info
->memory_error_func
) (status
, start
, info
);
328 OPCODES_SIGLONGJMP (priv
->bailout
, 1);
331 priv
->max_fetched
= addr
;
335 /* Possible values for prefix requirement. */
336 #define PREFIX_IGNORED_SHIFT 16
337 #define PREFIX_IGNORED_REPZ (PREFIX_REPZ << PREFIX_IGNORED_SHIFT)
338 #define PREFIX_IGNORED_REPNZ (PREFIX_REPNZ << PREFIX_IGNORED_SHIFT)
339 #define PREFIX_IGNORED_DATA (PREFIX_DATA << PREFIX_IGNORED_SHIFT)
340 #define PREFIX_IGNORED_ADDR (PREFIX_ADDR << PREFIX_IGNORED_SHIFT)
341 #define PREFIX_IGNORED_LOCK (PREFIX_LOCK << PREFIX_IGNORED_SHIFT)
343 /* Opcode prefixes. */
344 #define PREFIX_OPCODE (PREFIX_REPZ \
348 /* Prefixes ignored. */
349 #define PREFIX_IGNORED (PREFIX_IGNORED_REPZ \
350 | PREFIX_IGNORED_REPNZ \
351 | PREFIX_IGNORED_DATA)
353 #define XX { NULL, 0 }
354 #define Bad_Opcode NULL, { { NULL, 0 } }, 0
356 #define Eb { OP_E, b_mode }
357 #define Ebnd { OP_E, bnd_mode }
358 #define EbS { OP_E, b_swap_mode }
359 #define EbndS { OP_E, bnd_swap_mode }
360 #define Ev { OP_E, v_mode }
361 #define Eva { OP_E, va_mode }
362 #define Ev_bnd { OP_E, v_bnd_mode }
363 #define EvS { OP_E, v_swap_mode }
364 #define Ed { OP_E, d_mode }
365 #define Edq { OP_E, dq_mode }
366 #define Edb { OP_E, db_mode }
367 #define Edw { OP_E, dw_mode }
368 #define Eq { OP_E, q_mode }
369 #define indirEv { OP_indirE, indir_v_mode }
370 #define indirEp { OP_indirE, f_mode }
371 #define stackEv { OP_E, stack_v_mode }
372 #define Em { OP_E, m_mode }
373 #define Ew { OP_E, w_mode }
374 #define M { OP_M, 0 } /* lea, lgdt, etc. */
375 #define Ma { OP_M, a_mode }
376 #define Mb { OP_M, b_mode }
377 #define Md { OP_M, d_mode }
378 #define Mo { OP_M, o_mode }
379 #define Mp { OP_M, f_mode } /* 32 or 48 bit memory operand for LDS, LES etc */
380 #define Mq { OP_M, q_mode }
381 #define Mv { OP_M, v_mode }
382 #define Mv_bnd { OP_M, v_bndmk_mode }
383 #define Mx { OP_M, x_mode }
384 #define Mxmm { OP_M, xmm_mode }
385 #define Gb { OP_G, b_mode }
386 #define Gbnd { OP_G, bnd_mode }
387 #define Gv { OP_G, v_mode }
388 #define Gd { OP_G, d_mode }
389 #define Gdq { OP_G, dq_mode }
390 #define Gm { OP_G, m_mode }
391 #define Gva { OP_G, va_mode }
392 #define Gw { OP_G, w_mode }
393 #define Ib { OP_I, b_mode }
394 #define sIb { OP_sI, b_mode } /* sign extened byte */
395 #define sIbT { OP_sI, b_T_mode } /* sign extened byte like 'T' */
396 #define Iv { OP_I, v_mode }
397 #define sIv { OP_sI, v_mode }
398 #define Iv64 { OP_I64, v_mode }
399 #define Id { OP_I, d_mode }
400 #define Iw { OP_I, w_mode }
401 #define I1 { OP_I, const_1_mode }
402 #define Jb { OP_J, b_mode }
403 #define Jv { OP_J, v_mode }
404 #define Jdqw { OP_J, dqw_mode }
405 #define Cm { OP_C, m_mode }
406 #define Dm { OP_D, m_mode }
407 #define Td { OP_T, d_mode }
408 #define Skip_MODRM { OP_Skip_MODRM, 0 }
410 #define RMeAX { OP_REG, eAX_reg }
411 #define RMeBX { OP_REG, eBX_reg }
412 #define RMeCX { OP_REG, eCX_reg }
413 #define RMeDX { OP_REG, eDX_reg }
414 #define RMeSP { OP_REG, eSP_reg }
415 #define RMeBP { OP_REG, eBP_reg }
416 #define RMeSI { OP_REG, eSI_reg }
417 #define RMeDI { OP_REG, eDI_reg }
418 #define RMrAX { OP_REG, rAX_reg }
419 #define RMrBX { OP_REG, rBX_reg }
420 #define RMrCX { OP_REG, rCX_reg }
421 #define RMrDX { OP_REG, rDX_reg }
422 #define RMrSP { OP_REG, rSP_reg }
423 #define RMrBP { OP_REG, rBP_reg }
424 #define RMrSI { OP_REG, rSI_reg }
425 #define RMrDI { OP_REG, rDI_reg }
426 #define RMAL { OP_REG, al_reg }
427 #define RMCL { OP_REG, cl_reg }
428 #define RMDL { OP_REG, dl_reg }
429 #define RMBL { OP_REG, bl_reg }
430 #define RMAH { OP_REG, ah_reg }
431 #define RMCH { OP_REG, ch_reg }
432 #define RMDH { OP_REG, dh_reg }
433 #define RMBH { OP_REG, bh_reg }
434 #define RMAX { OP_REG, ax_reg }
435 #define RMDX { OP_REG, dx_reg }
437 #define eAX { OP_IMREG, eAX_reg }
438 #define AL { OP_IMREG, al_reg }
439 #define CL { OP_IMREG, cl_reg }
440 #define zAX { OP_IMREG, z_mode_ax_reg }
441 #define indirDX { OP_IMREG, indir_dx_reg }
443 #define Sw { OP_SEG, w_mode }
444 #define Sv { OP_SEG, v_mode }
445 #define Ap { OP_DIR, 0 }
446 #define Ob { OP_OFF64, b_mode }
447 #define Ov { OP_OFF64, v_mode }
448 #define Xb { OP_DSreg, eSI_reg }
449 #define Xv { OP_DSreg, eSI_reg }
450 #define Xz { OP_DSreg, eSI_reg }
451 #define Yb { OP_ESreg, eDI_reg }
452 #define Yv { OP_ESreg, eDI_reg }
453 #define DSBX { OP_DSreg, eBX_reg }
455 #define es { OP_REG, es_reg }
456 #define ss { OP_REG, ss_reg }
457 #define cs { OP_REG, cs_reg }
458 #define ds { OP_REG, ds_reg }
459 #define fs { OP_REG, fs_reg }
460 #define gs { OP_REG, gs_reg }
462 #define MX { OP_MMX, 0 }
463 #define XM { OP_XMM, 0 }
464 #define XMScalar { OP_XMM, scalar_mode }
465 #define XMGatherD { OP_XMM, vex_vsib_d_w_dq_mode }
466 #define XMGatherQ { OP_XMM, vex_vsib_q_w_dq_mode }
467 #define XMM { OP_XMM, xmm_mode }
468 #define TMM { OP_XMM, tmm_mode }
469 #define XMxmmq { OP_XMM, xmmq_mode }
470 #define EM { OP_EM, v_mode }
471 #define EMS { OP_EM, v_swap_mode }
472 #define EMd { OP_EM, d_mode }
473 #define EMx { OP_EM, x_mode }
474 #define EXbwUnit { OP_EX, bw_unit_mode }
475 #define EXb { OP_EX, b_mode }
476 #define EXw { OP_EX, w_mode }
477 #define EXd { OP_EX, d_mode }
478 #define EXdS { OP_EX, d_swap_mode }
479 #define EXwS { OP_EX, w_swap_mode }
480 #define EXq { OP_EX, q_mode }
481 #define EXqS { OP_EX, q_swap_mode }
482 #define EXdq { OP_EX, dq_mode }
483 #define EXx { OP_EX, x_mode }
484 #define EXxh { OP_EX, xh_mode }
485 #define EXxS { OP_EX, x_swap_mode }
486 #define EXxmm { OP_EX, xmm_mode }
487 #define EXymm { OP_EX, ymm_mode }
488 #define EXtmm { OP_EX, tmm_mode }
489 #define EXxmmq { OP_EX, xmmq_mode }
490 #define EXxmmqh { OP_EX, evex_half_bcst_xmmqh_mode }
491 #define EXEvexHalfBcstXmmq { OP_EX, evex_half_bcst_xmmq_mode }
492 #define EXxmmdw { OP_EX, xmmdw_mode }
493 #define EXxmmqd { OP_EX, xmmqd_mode }
494 #define EXxmmqdh { OP_EX, evex_half_bcst_xmmqdh_mode }
495 #define EXymmq { OP_EX, ymmq_mode }
496 #define EXEvexXGscat { OP_EX, evex_x_gscat_mode }
497 #define EXEvexXNoBcst { OP_EX, evex_x_nobcst_mode }
498 #define MS { OP_MS, v_mode }
499 #define XS { OP_XS, v_mode }
500 #define EMCq { OP_EMC, q_mode }
501 #define MXC { OP_MXC, 0 }
502 #define OPSUF { OP_3DNowSuffix, 0 }
503 #define SEP { SEP_Fixup, 0 }
504 #define CMP { CMP_Fixup, 0 }
505 #define XMM0 { XMM_Fixup, 0 }
506 #define FXSAVE { FXSAVE_Fixup, 0 }
508 #define Vex { OP_VEX, x_mode }
509 #define VexW { OP_VexW, x_mode }
510 #define VexScalar { OP_VEX, scalar_mode }
511 #define VexScalarR { OP_VexR, scalar_mode }
512 #define VexGatherD { OP_VEX, vex_vsib_d_w_dq_mode }
513 #define VexGatherQ { OP_VEX, vex_vsib_q_w_dq_mode }
514 #define VexGdq { OP_VEX, dq_mode }
515 #define VexTmm { OP_VEX, tmm_mode }
516 #define XMVexI4 { OP_REG_VexI4, x_mode }
517 #define XMVexScalarI4 { OP_REG_VexI4, scalar_mode }
518 #define VexI4 { OP_VexI4, 0 }
519 #define PCLMUL { PCLMUL_Fixup, 0 }
520 #define VPCMP { VPCMP_Fixup, 0 }
521 #define VPCOM { VPCOM_Fixup, 0 }
523 #define EXxEVexR { OP_Rounding, evex_rounding_mode }
524 #define EXxEVexR64 { OP_Rounding, evex_rounding_64_mode }
525 #define EXxEVexS { OP_Rounding, evex_sae_mode }
527 #define MaskG { OP_G, mask_mode }
528 #define MaskE { OP_E, mask_mode }
529 #define MaskBDE { OP_E, mask_bd_mode }
530 #define MaskVex { OP_VEX, mask_mode }
532 #define MVexVSIBDWpX { OP_M, vex_vsib_d_w_dq_mode }
533 #define MVexVSIBQWpX { OP_M, vex_vsib_q_w_dq_mode }
535 #define MVexSIBMEM { OP_M, vex_sibmem_mode }
537 /* Used handle "rep" prefix for string instructions. */
538 #define Xbr { REP_Fixup, eSI_reg }
539 #define Xvr { REP_Fixup, eSI_reg }
540 #define Ybr { REP_Fixup, eDI_reg }
541 #define Yvr { REP_Fixup, eDI_reg }
542 #define Yzr { REP_Fixup, eDI_reg }
543 #define indirDXr { REP_Fixup, indir_dx_reg }
544 #define ALr { REP_Fixup, al_reg }
545 #define eAXr { REP_Fixup, eAX_reg }
547 /* Used handle HLE prefix for lockable instructions. */
548 #define Ebh1 { HLE_Fixup1, b_mode }
549 #define Evh1 { HLE_Fixup1, v_mode }
550 #define Ebh2 { HLE_Fixup2, b_mode }
551 #define Evh2 { HLE_Fixup2, v_mode }
552 #define Ebh3 { HLE_Fixup3, b_mode }
553 #define Evh3 { HLE_Fixup3, v_mode }
555 #define BND { BND_Fixup, 0 }
556 #define NOTRACK { NOTRACK_Fixup, 0 }
558 #define cond_jump_flag { NULL, cond_jump_mode }
559 #define loop_jcxz_flag { NULL, loop_jcxz_mode }
561 /* bits in sizeflag */
562 #define SUFFIX_ALWAYS 4
570 /* byte operand with operand swapped */
572 /* byte operand, sign extend like 'T' suffix */
574 /* operand size depends on prefixes */
576 /* operand size depends on prefixes with operand swapped */
578 /* operand size depends on address prefix */
582 /* double word operand */
584 /* word operand with operand swapped */
586 /* double word operand with operand swapped */
588 /* quad word operand */
590 /* quad word operand with operand swapped */
592 /* ten-byte operand */
594 /* 16-byte XMM, 32-byte YMM or 64-byte ZMM operand. In EVEX with
595 broadcast enabled. */
597 /* Similar to x_mode, but with different EVEX mem shifts. */
599 /* Similar to x_mode, but with yet different EVEX mem shifts. */
601 /* Similar to x_mode, but with disabled broadcast. */
603 /* Similar to x_mode, but with operands swapped and disabled broadcast
606 /* 16-byte XMM, 32-byte YMM or 64-byte ZMM operand. In EVEX with
607 broadcast of 16bit enabled. */
609 /* 16-byte XMM operand */
611 /* XMM, XMM or YMM register operand, or quad word, xmmword or ymmword
612 memory operand (depending on vector length). Broadcast isn't
615 /* Same as xmmq_mode, but broadcast is allowed. */
616 evex_half_bcst_xmmq_mode
,
617 /* XMM, XMM or YMM register operand, or quad word, xmmword or ymmword
618 memory operand (depending on vector length). 16bit broadcast. */
619 evex_half_bcst_xmmqh_mode
,
620 /* 16-byte XMM, word, double word or quad word operand. */
622 /* 16-byte XMM, double word, quad word operand or xmm word operand. */
624 /* 16-byte XMM, double word, quad word operand or xmm word operand.
626 evex_half_bcst_xmmqdh_mode
,
627 /* 32-byte YMM operand */
629 /* quad word, ymmword or zmmword memory operand. */
633 /* d_mode in 32bit, q_mode in 64bit mode. */
635 /* pair of v_mode operands */
641 /* like v_bnd_mode in 32bit, no RIP-rel in 64bit mode. */
643 /* operand size depends on REX.W / VEX.W. */
645 /* Displacements like v_mode without considering Intel64 ISA. */
649 /* bounds operand with operand swapped */
651 /* 4- or 6-byte pointer operand */
654 /* v_mode for indirect branch opcodes. */
656 /* v_mode for stack-related opcodes. */
658 /* non-quad operand size depends on prefixes */
660 /* 16-byte operand */
662 /* registers like d_mode, memory like b_mode. */
664 /* registers like d_mode, memory like w_mode. */
667 /* Operand size depends on the VEX.W bit, with VSIB dword indices. */
668 vex_vsib_d_w_dq_mode
,
669 /* Operand size depends on the VEX.W bit, with VSIB qword indices. */
670 vex_vsib_q_w_dq_mode
,
671 /* mandatory non-vector SIB. */
674 /* scalar, ignore vector length. */
677 /* Static rounding. */
679 /* Static rounding, 64-bit mode only. */
680 evex_rounding_64_mode
,
681 /* Supress all exceptions. */
684 /* Mask register operand. */
686 /* Mask register operand. */
754 #define FLOAT NULL, { { NULL, FLOATCODE } }, 0
756 #define DIS386(T, I) NULL, { { NULL, (T)}, { NULL, (I) } }, 0
757 #define DIS386_PREFIX(T, I, P) NULL, { { NULL, (T)}, { NULL, (I) } }, P
758 #define REG_TABLE(I) DIS386 (USE_REG_TABLE, (I))
759 #define MOD_TABLE(I) DIS386 (USE_MOD_TABLE, (I))
760 #define RM_TABLE(I) DIS386 (USE_RM_TABLE, (I))
761 #define PREFIX_TABLE(I) DIS386 (USE_PREFIX_TABLE, (I))
762 #define X86_64_TABLE(I) DIS386 (USE_X86_64_TABLE, (I))
763 #define THREE_BYTE_TABLE(I) DIS386 (USE_3BYTE_TABLE, (I))
764 #define THREE_BYTE_TABLE_PREFIX(I, P) DIS386_PREFIX (USE_3BYTE_TABLE, (I), P)
765 #define XOP_8F_TABLE(I) DIS386 (USE_XOP_8F_TABLE, (I))
766 #define VEX_C4_TABLE(I) DIS386 (USE_VEX_C4_TABLE, (I))
767 #define VEX_C5_TABLE(I) DIS386 (USE_VEX_C5_TABLE, (I))
768 #define VEX_LEN_TABLE(I) DIS386 (USE_VEX_LEN_TABLE, (I))
769 #define VEX_W_TABLE(I) DIS386 (USE_VEX_W_TABLE, (I))
770 #define EVEX_TABLE(I) DIS386 (USE_EVEX_TABLE, (I))
771 #define EVEX_LEN_TABLE(I) DIS386 (USE_EVEX_LEN_TABLE, (I))
798 REG_0F3A0F_PREFIX_1_MOD_3
,
811 REG_VEX_0F3849_X86_64_P_0_W_0_M_1
,
816 REG_XOP_09_12_M_1_L_0
,
822 REG_EVEX_0F38C6_M_0_L_2
,
823 REG_EVEX_0F38C7_M_0_L_2
900 MOD_VEX_0F12_PREFIX_0
,
901 MOD_VEX_0F12_PREFIX_2
,
903 MOD_VEX_0F16_PREFIX_0
,
904 MOD_VEX_0F16_PREFIX_2
,
928 MOD_VEX_0FF0_PREFIX_3
,
935 MOD_VEX_0F3849_X86_64_P_0_W_0
,
936 MOD_VEX_0F3849_X86_64_P_2_W_0
,
937 MOD_VEX_0F3849_X86_64_P_3_W_0
,
938 MOD_VEX_0F384B_X86_64_P_1_W_0
,
939 MOD_VEX_0F384B_X86_64_P_2_W_0
,
940 MOD_VEX_0F384B_X86_64_P_3_W_0
,
942 MOD_VEX_0F385C_X86_64_P_1_W_0
,
943 MOD_VEX_0F385E_X86_64_P_0_W_0
,
944 MOD_VEX_0F385E_X86_64_P_1_W_0
,
945 MOD_VEX_0F385E_X86_64_P_2_W_0
,
946 MOD_VEX_0F385E_X86_64_P_3_W_0
,
959 MOD_EVEX_0F382A_P_1_W_1
,
961 MOD_EVEX_0F383A_P_1_W_0
,
981 RM_0F1E_P_1_MOD_3_REG_7
,
982 RM_0FAE_REG_6_MOD_3_P_0
,
984 RM_0F3A0F_P_1_MOD_3_REG_0
,
986 RM_VEX_0F3849_X86_64_P_0_W_0_M_1_R_0
992 PREFIX_0F01_REG_1_RM_4
,
993 PREFIX_0F01_REG_1_RM_5
,
994 PREFIX_0F01_REG_1_RM_6
,
995 PREFIX_0F01_REG_1_RM_7
,
996 PREFIX_0F01_REG_3_RM_1
,
997 PREFIX_0F01_REG_5_MOD_0
,
998 PREFIX_0F01_REG_5_MOD_3_RM_0
,
999 PREFIX_0F01_REG_5_MOD_3_RM_1
,
1000 PREFIX_0F01_REG_5_MOD_3_RM_2
,
1001 PREFIX_0F01_REG_5_MOD_3_RM_4
,
1002 PREFIX_0F01_REG_5_MOD_3_RM_5
,
1003 PREFIX_0F01_REG_5_MOD_3_RM_6
,
1004 PREFIX_0F01_REG_5_MOD_3_RM_7
,
1005 PREFIX_0F01_REG_7_MOD_3_RM_2
,
1006 PREFIX_0F01_REG_7_MOD_3_RM_6
,
1007 PREFIX_0F01_REG_7_MOD_3_RM_7
,
1045 PREFIX_0FAE_REG_0_MOD_3
,
1046 PREFIX_0FAE_REG_1_MOD_3
,
1047 PREFIX_0FAE_REG_2_MOD_3
,
1048 PREFIX_0FAE_REG_3_MOD_3
,
1049 PREFIX_0FAE_REG_4_MOD_0
,
1050 PREFIX_0FAE_REG_4_MOD_3
,
1051 PREFIX_0FAE_REG_5_MOD_3
,
1052 PREFIX_0FAE_REG_6_MOD_0
,
1053 PREFIX_0FAE_REG_6_MOD_3
,
1054 PREFIX_0FAE_REG_7_MOD_0
,
1059 PREFIX_0FC7_REG_6_MOD_0
,
1060 PREFIX_0FC7_REG_6_MOD_3
,
1061 PREFIX_0FC7_REG_7_MOD_3
,
1089 PREFIX_VEX_0F41_L_1_M_1_W_0
,
1090 PREFIX_VEX_0F41_L_1_M_1_W_1
,
1091 PREFIX_VEX_0F42_L_1_M_1_W_0
,
1092 PREFIX_VEX_0F42_L_1_M_1_W_1
,
1093 PREFIX_VEX_0F44_L_0_M_1_W_0
,
1094 PREFIX_VEX_0F44_L_0_M_1_W_1
,
1095 PREFIX_VEX_0F45_L_1_M_1_W_0
,
1096 PREFIX_VEX_0F45_L_1_M_1_W_1
,
1097 PREFIX_VEX_0F46_L_1_M_1_W_0
,
1098 PREFIX_VEX_0F46_L_1_M_1_W_1
,
1099 PREFIX_VEX_0F47_L_1_M_1_W_0
,
1100 PREFIX_VEX_0F47_L_1_M_1_W_1
,
1101 PREFIX_VEX_0F4A_L_1_M_1_W_0
,
1102 PREFIX_VEX_0F4A_L_1_M_1_W_1
,
1103 PREFIX_VEX_0F4B_L_1_M_1_W_0
,
1104 PREFIX_VEX_0F4B_L_1_M_1_W_1
,
1122 PREFIX_VEX_0F90_L_0_W_0
,
1123 PREFIX_VEX_0F90_L_0_W_1
,
1124 PREFIX_VEX_0F91_L_0_M_0_W_0
,
1125 PREFIX_VEX_0F91_L_0_M_0_W_1
,
1126 PREFIX_VEX_0F92_L_0_M_1_W_0
,
1127 PREFIX_VEX_0F92_L_0_M_1_W_1
,
1128 PREFIX_VEX_0F93_L_0_M_1_W_0
,
1129 PREFIX_VEX_0F93_L_0_M_1_W_1
,
1130 PREFIX_VEX_0F98_L_0_M_1_W_0
,
1131 PREFIX_VEX_0F98_L_0_M_1_W_1
,
1132 PREFIX_VEX_0F99_L_0_M_1_W_0
,
1133 PREFIX_VEX_0F99_L_0_M_1_W_1
,
1138 PREFIX_VEX_0F3849_X86_64
,
1139 PREFIX_VEX_0F384B_X86_64
,
1140 PREFIX_VEX_0F385C_X86_64
,
1141 PREFIX_VEX_0F385E_X86_64
,
1142 PREFIX_VEX_0F38F5_L_0
,
1143 PREFIX_VEX_0F38F6_L_0
,
1144 PREFIX_VEX_0F38F7_L_0
,
1145 PREFIX_VEX_0F3AF0_L_0
,
1203 PREFIX_EVEX_MAP5_10
,
1204 PREFIX_EVEX_MAP5_11
,
1205 PREFIX_EVEX_MAP5_1D
,
1206 PREFIX_EVEX_MAP5_2A
,
1207 PREFIX_EVEX_MAP5_2C
,
1208 PREFIX_EVEX_MAP5_2D
,
1209 PREFIX_EVEX_MAP5_2E
,
1210 PREFIX_EVEX_MAP5_2F
,
1211 PREFIX_EVEX_MAP5_51
,
1212 PREFIX_EVEX_MAP5_58
,
1213 PREFIX_EVEX_MAP5_59
,
1214 PREFIX_EVEX_MAP5_5A
,
1215 PREFIX_EVEX_MAP5_5B
,
1216 PREFIX_EVEX_MAP5_5C
,
1217 PREFIX_EVEX_MAP5_5D
,
1218 PREFIX_EVEX_MAP5_5E
,
1219 PREFIX_EVEX_MAP5_5F
,
1220 PREFIX_EVEX_MAP5_78
,
1221 PREFIX_EVEX_MAP5_79
,
1222 PREFIX_EVEX_MAP5_7A
,
1223 PREFIX_EVEX_MAP5_7B
,
1224 PREFIX_EVEX_MAP5_7C
,
1225 PREFIX_EVEX_MAP5_7D
,
1227 PREFIX_EVEX_MAP6_13
,
1228 PREFIX_EVEX_MAP6_56
,
1229 PREFIX_EVEX_MAP6_57
,
1230 PREFIX_EVEX_MAP6_D6
,
1231 PREFIX_EVEX_MAP6_D7
,
1267 X86_64_0F01_REG_1_RM_5_PREFIX_2
,
1268 X86_64_0F01_REG_1_RM_6_PREFIX_2
,
1269 X86_64_0F01_REG_1_RM_7_PREFIX_2
,
1272 X86_64_0F01_REG_5_MOD_3_RM_4_PREFIX_1
,
1273 X86_64_0F01_REG_5_MOD_3_RM_5_PREFIX_1
,
1274 X86_64_0F01_REG_5_MOD_3_RM_6_PREFIX_1
,
1275 X86_64_0F01_REG_5_MOD_3_RM_7_PREFIX_1
,
1276 X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_1
,
1277 X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3
,
1278 X86_64_0F01_REG_7_MOD_3_RM_7_PREFIX_1
,
1281 X86_64_0FC7_REG_6_MOD_3_PREFIX_1
,
1291 THREE_BYTE_0F38
= 0,
1320 VEX_LEN_0F12_P_0_M_0
= 0,
1321 VEX_LEN_0F12_P_0_M_1
,
1322 #define VEX_LEN_0F12_P_2_M_0 VEX_LEN_0F12_P_0_M_0
1324 VEX_LEN_0F16_P_0_M_0
,
1325 VEX_LEN_0F16_P_0_M_1
,
1326 #define VEX_LEN_0F16_P_2_M_0 VEX_LEN_0F16_P_0_M_0
1346 VEX_LEN_0FAE_R_2_M_0
,
1347 VEX_LEN_0FAE_R_3_M_0
,
1357 VEX_LEN_0F3849_X86_64_P_0_W_0_M_0
,
1358 VEX_LEN_0F3849_X86_64_P_0_W_0_M_1_REG_0_RM_0
,
1359 VEX_LEN_0F3849_X86_64_P_2_W_0_M_0
,
1360 VEX_LEN_0F3849_X86_64_P_3_W_0_M_0
,
1361 VEX_LEN_0F384B_X86_64_P_1_W_0_M_0
,
1362 VEX_LEN_0F384B_X86_64_P_2_W_0_M_0
,
1363 VEX_LEN_0F384B_X86_64_P_3_W_0_M_0
,
1365 VEX_LEN_0F385C_X86_64_P_1_W_0_M_0
,
1366 VEX_LEN_0F385E_X86_64_P_0_W_0_M_0
,
1367 VEX_LEN_0F385E_X86_64_P_1_W_0_M_0
,
1368 VEX_LEN_0F385E_X86_64_P_2_W_0_M_0
,
1369 VEX_LEN_0F385E_X86_64_P_3_W_0_M_0
,
1402 VEX_LEN_0FXOP_08_85
,
1403 VEX_LEN_0FXOP_08_86
,
1404 VEX_LEN_0FXOP_08_87
,
1405 VEX_LEN_0FXOP_08_8E
,
1406 VEX_LEN_0FXOP_08_8F
,
1407 VEX_LEN_0FXOP_08_95
,
1408 VEX_LEN_0FXOP_08_96
,
1409 VEX_LEN_0FXOP_08_97
,
1410 VEX_LEN_0FXOP_08_9E
,
1411 VEX_LEN_0FXOP_08_9F
,
1412 VEX_LEN_0FXOP_08_A3
,
1413 VEX_LEN_0FXOP_08_A6
,
1414 VEX_LEN_0FXOP_08_B6
,
1415 VEX_LEN_0FXOP_08_C0
,
1416 VEX_LEN_0FXOP_08_C1
,
1417 VEX_LEN_0FXOP_08_C2
,
1418 VEX_LEN_0FXOP_08_C3
,
1419 VEX_LEN_0FXOP_08_CC
,
1420 VEX_LEN_0FXOP_08_CD
,
1421 VEX_LEN_0FXOP_08_CE
,
1422 VEX_LEN_0FXOP_08_CF
,
1423 VEX_LEN_0FXOP_08_EC
,
1424 VEX_LEN_0FXOP_08_ED
,
1425 VEX_LEN_0FXOP_08_EE
,
1426 VEX_LEN_0FXOP_08_EF
,
1427 VEX_LEN_0FXOP_09_01
,
1428 VEX_LEN_0FXOP_09_02
,
1429 VEX_LEN_0FXOP_09_12_M_1
,
1430 VEX_LEN_0FXOP_09_82_W_0
,
1431 VEX_LEN_0FXOP_09_83_W_0
,
1432 VEX_LEN_0FXOP_09_90
,
1433 VEX_LEN_0FXOP_09_91
,
1434 VEX_LEN_0FXOP_09_92
,
1435 VEX_LEN_0FXOP_09_93
,
1436 VEX_LEN_0FXOP_09_94
,
1437 VEX_LEN_0FXOP_09_95
,
1438 VEX_LEN_0FXOP_09_96
,
1439 VEX_LEN_0FXOP_09_97
,
1440 VEX_LEN_0FXOP_09_98
,
1441 VEX_LEN_0FXOP_09_99
,
1442 VEX_LEN_0FXOP_09_9A
,
1443 VEX_LEN_0FXOP_09_9B
,
1444 VEX_LEN_0FXOP_09_C1
,
1445 VEX_LEN_0FXOP_09_C2
,
1446 VEX_LEN_0FXOP_09_C3
,
1447 VEX_LEN_0FXOP_09_C6
,
1448 VEX_LEN_0FXOP_09_C7
,
1449 VEX_LEN_0FXOP_09_CB
,
1450 VEX_LEN_0FXOP_09_D1
,
1451 VEX_LEN_0FXOP_09_D2
,
1452 VEX_LEN_0FXOP_09_D3
,
1453 VEX_LEN_0FXOP_09_D6
,
1454 VEX_LEN_0FXOP_09_D7
,
1455 VEX_LEN_0FXOP_09_DB
,
1456 VEX_LEN_0FXOP_09_E1
,
1457 VEX_LEN_0FXOP_09_E2
,
1458 VEX_LEN_0FXOP_09_E3
,
1459 VEX_LEN_0FXOP_0A_12
,
1464 EVEX_LEN_0F3816
= 0,
1466 EVEX_LEN_0F381A_M_0
,
1467 EVEX_LEN_0F381B_M_0
,
1469 EVEX_LEN_0F385A_M_0
,
1470 EVEX_LEN_0F385B_M_0
,
1471 EVEX_LEN_0F38C6_M_0
,
1472 EVEX_LEN_0F38C7_M_0
,
1489 VEX_W_0F41_L_1_M_1
= 0,
1511 VEX_W_0F381A_M_0_L_1
,
1518 VEX_W_0F3849_X86_64_P_0
,
1519 VEX_W_0F3849_X86_64_P_2
,
1520 VEX_W_0F3849_X86_64_P_3
,
1521 VEX_W_0F384B_X86_64_P_1
,
1522 VEX_W_0F384B_X86_64_P_2
,
1523 VEX_W_0F384B_X86_64_P_3
,
1530 VEX_W_0F385A_M_0_L_0
,
1531 VEX_W_0F385C_X86_64_P_1
,
1532 VEX_W_0F385E_X86_64_P_0
,
1533 VEX_W_0F385E_X86_64_P_1
,
1534 VEX_W_0F385E_X86_64_P_2
,
1535 VEX_W_0F385E_X86_64_P_3
,
1557 VEX_W_0FXOP_08_85_L_0
,
1558 VEX_W_0FXOP_08_86_L_0
,
1559 VEX_W_0FXOP_08_87_L_0
,
1560 VEX_W_0FXOP_08_8E_L_0
,
1561 VEX_W_0FXOP_08_8F_L_0
,
1562 VEX_W_0FXOP_08_95_L_0
,
1563 VEX_W_0FXOP_08_96_L_0
,
1564 VEX_W_0FXOP_08_97_L_0
,
1565 VEX_W_0FXOP_08_9E_L_0
,
1566 VEX_W_0FXOP_08_9F_L_0
,
1567 VEX_W_0FXOP_08_A6_L_0
,
1568 VEX_W_0FXOP_08_B6_L_0
,
1569 VEX_W_0FXOP_08_C0_L_0
,
1570 VEX_W_0FXOP_08_C1_L_0
,
1571 VEX_W_0FXOP_08_C2_L_0
,
1572 VEX_W_0FXOP_08_C3_L_0
,
1573 VEX_W_0FXOP_08_CC_L_0
,
1574 VEX_W_0FXOP_08_CD_L_0
,
1575 VEX_W_0FXOP_08_CE_L_0
,
1576 VEX_W_0FXOP_08_CF_L_0
,
1577 VEX_W_0FXOP_08_EC_L_0
,
1578 VEX_W_0FXOP_08_ED_L_0
,
1579 VEX_W_0FXOP_08_EE_L_0
,
1580 VEX_W_0FXOP_08_EF_L_0
,
1586 VEX_W_0FXOP_09_C1_L_0
,
1587 VEX_W_0FXOP_09_C2_L_0
,
1588 VEX_W_0FXOP_09_C3_L_0
,
1589 VEX_W_0FXOP_09_C6_L_0
,
1590 VEX_W_0FXOP_09_C7_L_0
,
1591 VEX_W_0FXOP_09_CB_L_0
,
1592 VEX_W_0FXOP_09_D1_L_0
,
1593 VEX_W_0FXOP_09_D2_L_0
,
1594 VEX_W_0FXOP_09_D3_L_0
,
1595 VEX_W_0FXOP_09_D6_L_0
,
1596 VEX_W_0FXOP_09_D7_L_0
,
1597 VEX_W_0FXOP_09_DB_L_0
,
1598 VEX_W_0FXOP_09_E1_L_0
,
1599 VEX_W_0FXOP_09_E2_L_0
,
1600 VEX_W_0FXOP_09_E3_L_0
,
1653 EVEX_W_0F381A_M_0_L_n
,
1654 EVEX_W_0F381B_M_0_L_2
,
1679 EVEX_W_0F385A_M_0_L_n
,
1680 EVEX_W_0F385B_M_0_L_2
,
1706 typedef void (*op_rtn
) (instr_info
*ins
, int bytemode
, int sizeflag
);
1715 unsigned int prefix_requirement
;
1718 /* Upper case letters in the instruction names here are macros.
1719 'A' => print 'b' if no register operands or suffix_always is true
1720 'B' => print 'b' if suffix_always is true
1721 'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
1723 'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
1724 suffix_always is true
1725 'E' => print 'e' if 32-bit form of jcxz
1726 'F' => print 'w' or 'l' depending on address size prefix (loop insns)
1727 'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
1728 'H' => print ",pt" or ",pn" branch hint
1731 'K' => print 'd' or 'q' if rex prefix is present.
1733 'M' => print 'r' if intel_mnemonic is false.
1734 'N' => print 'n' if instruction has no wait "prefix"
1735 'O' => print 'd' or 'o' (or 'q' in Intel mode)
1736 'P' => behave as 'T' except with register operand outside of suffix_always
1738 'Q' => print 'w', 'l' or 'q' for memory operand or suffix_always
1740 'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
1741 'S' => print 'w', 'l' or 'q' if suffix_always is true
1742 'T' => print 'w', 'l'/'d', or 'q' if instruction has an operand size
1743 prefix or if suffix_always is true.
1746 'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
1747 'X' => print 's', 'd' depending on data16 prefix (for XMM)
1749 'Z' => print 'q' in 64bit mode and 'l' otherwise, if suffix_always is true.
1750 '!' => change condition from true to false or from false to true.
1751 '%' => add 1 upper case letter to the macro.
1752 '^' => print 'w', 'l', or 'q' (Intel64 ISA only) depending on operand size
1753 prefix or suffix_always is true (lcall/ljmp).
1754 '@' => in 64bit mode for Intel64 ISA or if instruction
1755 has no operand sizing prefix, print 'q' if suffix_always is true or
1756 nothing otherwise; behave as 'P' in all other cases
1758 2 upper case letter macros:
1759 "XY" => print 'x' or 'y' if suffix_always is true or no register
1760 operands and no broadcast.
1761 "XZ" => print 'x', 'y', or 'z' if suffix_always is true or no
1762 register operands and no broadcast.
1763 "XW" => print 's', 'd' depending on the VEX.W bit (for FMA)
1764 "XD" => print 'd' if !EVEX or EVEX.W=1, EVEX.W=0 is not a valid encoding
1765 "XH" => print 'h' if EVEX.W=0, EVEX.W=1 is not a valid encoding (for FP16)
1766 "XS" => print 's' if !EVEX or EVEX.W=0, EVEX.W=1 is not a valid encoding
1767 "XV" => print "{vex3}" pseudo prefix
1768 "LQ" => print 'l' ('d' in Intel mode) or 'q' for memory operand, cond
1769 being false, or no operand at all in 64bit mode, or if suffix_always
1771 "LB" => print "abs" in 64bit mode and behave as 'B' otherwise
1772 "LS" => print "abs" in 64bit mode and behave as 'S' otherwise
1773 "LV" => print "abs" for 64bit operand and behave as 'S' otherwise
1774 "DQ" => print 'd' or 'q' depending on the VEX.W bit
1775 "BW" => print 'b' or 'w' depending on the VEX.W bit
1776 "LP" => print 'w' or 'l' ('d' in Intel mode) if instruction has
1777 an operand size prefix, or suffix_always is true. print
1778 'q' if rex prefix is present.
1780 Many of the above letters print nothing in Intel mode. See "putop"
1783 Braces '{' and '}', and vertical bars '|', indicate alternative
1784 mnemonic strings for AT&T and Intel. */
1786 static const struct dis386 dis386
[] = {
1788 { "addB", { Ebh1
, Gb
}, 0 },
1789 { "addS", { Evh1
, Gv
}, 0 },
1790 { "addB", { Gb
, EbS
}, 0 },
1791 { "addS", { Gv
, EvS
}, 0 },
1792 { "addB", { AL
, Ib
}, 0 },
1793 { "addS", { eAX
, Iv
}, 0 },
1794 { X86_64_TABLE (X86_64_06
) },
1795 { X86_64_TABLE (X86_64_07
) },
1797 { "orB", { Ebh1
, Gb
}, 0 },
1798 { "orS", { Evh1
, Gv
}, 0 },
1799 { "orB", { Gb
, EbS
}, 0 },
1800 { "orS", { Gv
, EvS
}, 0 },
1801 { "orB", { AL
, Ib
}, 0 },
1802 { "orS", { eAX
, Iv
}, 0 },
1803 { X86_64_TABLE (X86_64_0E
) },
1804 { Bad_Opcode
}, /* 0x0f extended opcode escape */
1806 { "adcB", { Ebh1
, Gb
}, 0 },
1807 { "adcS", { Evh1
, Gv
}, 0 },
1808 { "adcB", { Gb
, EbS
}, 0 },
1809 { "adcS", { Gv
, EvS
}, 0 },
1810 { "adcB", { AL
, Ib
}, 0 },
1811 { "adcS", { eAX
, Iv
}, 0 },
1812 { X86_64_TABLE (X86_64_16
) },
1813 { X86_64_TABLE (X86_64_17
) },
1815 { "sbbB", { Ebh1
, Gb
}, 0 },
1816 { "sbbS", { Evh1
, Gv
}, 0 },
1817 { "sbbB", { Gb
, EbS
}, 0 },
1818 { "sbbS", { Gv
, EvS
}, 0 },
1819 { "sbbB", { AL
, Ib
}, 0 },
1820 { "sbbS", { eAX
, Iv
}, 0 },
1821 { X86_64_TABLE (X86_64_1E
) },
1822 { X86_64_TABLE (X86_64_1F
) },
1824 { "andB", { Ebh1
, Gb
}, 0 },
1825 { "andS", { Evh1
, Gv
}, 0 },
1826 { "andB", { Gb
, EbS
}, 0 },
1827 { "andS", { Gv
, EvS
}, 0 },
1828 { "andB", { AL
, Ib
}, 0 },
1829 { "andS", { eAX
, Iv
}, 0 },
1830 { Bad_Opcode
}, /* SEG ES prefix */
1831 { X86_64_TABLE (X86_64_27
) },
1833 { "subB", { Ebh1
, Gb
}, 0 },
1834 { "subS", { Evh1
, Gv
}, 0 },
1835 { "subB", { Gb
, EbS
}, 0 },
1836 { "subS", { Gv
, EvS
}, 0 },
1837 { "subB", { AL
, Ib
}, 0 },
1838 { "subS", { eAX
, Iv
}, 0 },
1839 { Bad_Opcode
}, /* SEG CS prefix */
1840 { X86_64_TABLE (X86_64_2F
) },
1842 { "xorB", { Ebh1
, Gb
}, 0 },
1843 { "xorS", { Evh1
, Gv
}, 0 },
1844 { "xorB", { Gb
, EbS
}, 0 },
1845 { "xorS", { Gv
, EvS
}, 0 },
1846 { "xorB", { AL
, Ib
}, 0 },
1847 { "xorS", { eAX
, Iv
}, 0 },
1848 { Bad_Opcode
}, /* SEG SS prefix */
1849 { X86_64_TABLE (X86_64_37
) },
1851 { "cmpB", { Eb
, Gb
}, 0 },
1852 { "cmpS", { Ev
, Gv
}, 0 },
1853 { "cmpB", { Gb
, EbS
}, 0 },
1854 { "cmpS", { Gv
, EvS
}, 0 },
1855 { "cmpB", { AL
, Ib
}, 0 },
1856 { "cmpS", { eAX
, Iv
}, 0 },
1857 { Bad_Opcode
}, /* SEG DS prefix */
1858 { X86_64_TABLE (X86_64_3F
) },
1860 { "inc{S|}", { RMeAX
}, 0 },
1861 { "inc{S|}", { RMeCX
}, 0 },
1862 { "inc{S|}", { RMeDX
}, 0 },
1863 { "inc{S|}", { RMeBX
}, 0 },
1864 { "inc{S|}", { RMeSP
}, 0 },
1865 { "inc{S|}", { RMeBP
}, 0 },
1866 { "inc{S|}", { RMeSI
}, 0 },
1867 { "inc{S|}", { RMeDI
}, 0 },
1869 { "dec{S|}", { RMeAX
}, 0 },
1870 { "dec{S|}", { RMeCX
}, 0 },
1871 { "dec{S|}", { RMeDX
}, 0 },
1872 { "dec{S|}", { RMeBX
}, 0 },
1873 { "dec{S|}", { RMeSP
}, 0 },
1874 { "dec{S|}", { RMeBP
}, 0 },
1875 { "dec{S|}", { RMeSI
}, 0 },
1876 { "dec{S|}", { RMeDI
}, 0 },
1878 { "push{!P|}", { RMrAX
}, 0 },
1879 { "push{!P|}", { RMrCX
}, 0 },
1880 { "push{!P|}", { RMrDX
}, 0 },
1881 { "push{!P|}", { RMrBX
}, 0 },
1882 { "push{!P|}", { RMrSP
}, 0 },
1883 { "push{!P|}", { RMrBP
}, 0 },
1884 { "push{!P|}", { RMrSI
}, 0 },
1885 { "push{!P|}", { RMrDI
}, 0 },
1887 { "pop{!P|}", { RMrAX
}, 0 },
1888 { "pop{!P|}", { RMrCX
}, 0 },
1889 { "pop{!P|}", { RMrDX
}, 0 },
1890 { "pop{!P|}", { RMrBX
}, 0 },
1891 { "pop{!P|}", { RMrSP
}, 0 },
1892 { "pop{!P|}", { RMrBP
}, 0 },
1893 { "pop{!P|}", { RMrSI
}, 0 },
1894 { "pop{!P|}", { RMrDI
}, 0 },
1896 { X86_64_TABLE (X86_64_60
) },
1897 { X86_64_TABLE (X86_64_61
) },
1898 { X86_64_TABLE (X86_64_62
) },
1899 { X86_64_TABLE (X86_64_63
) },
1900 { Bad_Opcode
}, /* seg fs */
1901 { Bad_Opcode
}, /* seg gs */
1902 { Bad_Opcode
}, /* op size prefix */
1903 { Bad_Opcode
}, /* adr size prefix */
1905 { "pushP", { sIv
}, 0 },
1906 { "imulS", { Gv
, Ev
, Iv
}, 0 },
1907 { "pushP", { sIbT
}, 0 },
1908 { "imulS", { Gv
, Ev
, sIb
}, 0 },
1909 { "ins{b|}", { Ybr
, indirDX
}, 0 },
1910 { X86_64_TABLE (X86_64_6D
) },
1911 { "outs{b|}", { indirDXr
, Xb
}, 0 },
1912 { X86_64_TABLE (X86_64_6F
) },
1914 { "joH", { Jb
, BND
, cond_jump_flag
}, 0 },
1915 { "jnoH", { Jb
, BND
, cond_jump_flag
}, 0 },
1916 { "jbH", { Jb
, BND
, cond_jump_flag
}, 0 },
1917 { "jaeH", { Jb
, BND
, cond_jump_flag
}, 0 },
1918 { "jeH", { Jb
, BND
, cond_jump_flag
}, 0 },
1919 { "jneH", { Jb
, BND
, cond_jump_flag
}, 0 },
1920 { "jbeH", { Jb
, BND
, cond_jump_flag
}, 0 },
1921 { "jaH", { Jb
, BND
, cond_jump_flag
}, 0 },
1923 { "jsH", { Jb
, BND
, cond_jump_flag
}, 0 },
1924 { "jnsH", { Jb
, BND
, cond_jump_flag
}, 0 },
1925 { "jpH", { Jb
, BND
, cond_jump_flag
}, 0 },
1926 { "jnpH", { Jb
, BND
, cond_jump_flag
}, 0 },
1927 { "jlH", { Jb
, BND
, cond_jump_flag
}, 0 },
1928 { "jgeH", { Jb
, BND
, cond_jump_flag
}, 0 },
1929 { "jleH", { Jb
, BND
, cond_jump_flag
}, 0 },
1930 { "jgH", { Jb
, BND
, cond_jump_flag
}, 0 },
1932 { REG_TABLE (REG_80
) },
1933 { REG_TABLE (REG_81
) },
1934 { X86_64_TABLE (X86_64_82
) },
1935 { REG_TABLE (REG_83
) },
1936 { "testB", { Eb
, Gb
}, 0 },
1937 { "testS", { Ev
, Gv
}, 0 },
1938 { "xchgB", { Ebh2
, Gb
}, 0 },
1939 { "xchgS", { Evh2
, Gv
}, 0 },
1941 { "movB", { Ebh3
, Gb
}, 0 },
1942 { "movS", { Evh3
, Gv
}, 0 },
1943 { "movB", { Gb
, EbS
}, 0 },
1944 { "movS", { Gv
, EvS
}, 0 },
1945 { "movD", { Sv
, Sw
}, 0 },
1946 { MOD_TABLE (MOD_8D
) },
1947 { "movD", { Sw
, Sv
}, 0 },
1948 { REG_TABLE (REG_8F
) },
1950 { PREFIX_TABLE (PREFIX_90
) },
1951 { "xchgS", { RMeCX
, eAX
}, 0 },
1952 { "xchgS", { RMeDX
, eAX
}, 0 },
1953 { "xchgS", { RMeBX
, eAX
}, 0 },
1954 { "xchgS", { RMeSP
, eAX
}, 0 },
1955 { "xchgS", { RMeBP
, eAX
}, 0 },
1956 { "xchgS", { RMeSI
, eAX
}, 0 },
1957 { "xchgS", { RMeDI
, eAX
}, 0 },
1959 { "cW{t|}R", { XX
}, 0 },
1960 { "cR{t|}O", { XX
}, 0 },
1961 { X86_64_TABLE (X86_64_9A
) },
1962 { Bad_Opcode
}, /* fwait */
1963 { "pushfP", { XX
}, 0 },
1964 { "popfP", { XX
}, 0 },
1965 { "sahf", { XX
}, 0 },
1966 { "lahf", { XX
}, 0 },
1968 { "mov%LB", { AL
, Ob
}, 0 },
1969 { "mov%LS", { eAX
, Ov
}, 0 },
1970 { "mov%LB", { Ob
, AL
}, 0 },
1971 { "mov%LS", { Ov
, eAX
}, 0 },
1972 { "movs{b|}", { Ybr
, Xb
}, 0 },
1973 { "movs{R|}", { Yvr
, Xv
}, 0 },
1974 { "cmps{b|}", { Xb
, Yb
}, 0 },
1975 { "cmps{R|}", { Xv
, Yv
}, 0 },
1977 { "testB", { AL
, Ib
}, 0 },
1978 { "testS", { eAX
, Iv
}, 0 },
1979 { "stosB", { Ybr
, AL
}, 0 },
1980 { "stosS", { Yvr
, eAX
}, 0 },
1981 { "lodsB", { ALr
, Xb
}, 0 },
1982 { "lodsS", { eAXr
, Xv
}, 0 },
1983 { "scasB", { AL
, Yb
}, 0 },
1984 { "scasS", { eAX
, Yv
}, 0 },
1986 { "movB", { RMAL
, Ib
}, 0 },
1987 { "movB", { RMCL
, Ib
}, 0 },
1988 { "movB", { RMDL
, Ib
}, 0 },
1989 { "movB", { RMBL
, Ib
}, 0 },
1990 { "movB", { RMAH
, Ib
}, 0 },
1991 { "movB", { RMCH
, Ib
}, 0 },
1992 { "movB", { RMDH
, Ib
}, 0 },
1993 { "movB", { RMBH
, Ib
}, 0 },
1995 { "mov%LV", { RMeAX
, Iv64
}, 0 },
1996 { "mov%LV", { RMeCX
, Iv64
}, 0 },
1997 { "mov%LV", { RMeDX
, Iv64
}, 0 },
1998 { "mov%LV", { RMeBX
, Iv64
}, 0 },
1999 { "mov%LV", { RMeSP
, Iv64
}, 0 },
2000 { "mov%LV", { RMeBP
, Iv64
}, 0 },
2001 { "mov%LV", { RMeSI
, Iv64
}, 0 },
2002 { "mov%LV", { RMeDI
, Iv64
}, 0 },
2004 { REG_TABLE (REG_C0
) },
2005 { REG_TABLE (REG_C1
) },
2006 { X86_64_TABLE (X86_64_C2
) },
2007 { X86_64_TABLE (X86_64_C3
) },
2008 { X86_64_TABLE (X86_64_C4
) },
2009 { X86_64_TABLE (X86_64_C5
) },
2010 { REG_TABLE (REG_C6
) },
2011 { REG_TABLE (REG_C7
) },
2013 { "enterP", { Iw
, Ib
}, 0 },
2014 { "leaveP", { XX
}, 0 },
2015 { "{l|}ret{|f}%LP", { Iw
}, 0 },
2016 { "{l|}ret{|f}%LP", { XX
}, 0 },
2017 { "int3", { XX
}, 0 },
2018 { "int", { Ib
}, 0 },
2019 { X86_64_TABLE (X86_64_CE
) },
2020 { "iret%LP", { XX
}, 0 },
2022 { REG_TABLE (REG_D0
) },
2023 { REG_TABLE (REG_D1
) },
2024 { REG_TABLE (REG_D2
) },
2025 { REG_TABLE (REG_D3
) },
2026 { X86_64_TABLE (X86_64_D4
) },
2027 { X86_64_TABLE (X86_64_D5
) },
2029 { "xlat", { DSBX
}, 0 },
2040 { "loopneFH", { Jb
, XX
, loop_jcxz_flag
}, 0 },
2041 { "loopeFH", { Jb
, XX
, loop_jcxz_flag
}, 0 },
2042 { "loopFH", { Jb
, XX
, loop_jcxz_flag
}, 0 },
2043 { "jEcxzH", { Jb
, XX
, loop_jcxz_flag
}, 0 },
2044 { "inB", { AL
, Ib
}, 0 },
2045 { "inG", { zAX
, Ib
}, 0 },
2046 { "outB", { Ib
, AL
}, 0 },
2047 { "outG", { Ib
, zAX
}, 0 },
2049 { X86_64_TABLE (X86_64_E8
) },
2050 { X86_64_TABLE (X86_64_E9
) },
2051 { X86_64_TABLE (X86_64_EA
) },
2052 { "jmp", { Jb
, BND
}, 0 },
2053 { "inB", { AL
, indirDX
}, 0 },
2054 { "inG", { zAX
, indirDX
}, 0 },
2055 { "outB", { indirDX
, AL
}, 0 },
2056 { "outG", { indirDX
, zAX
}, 0 },
2058 { Bad_Opcode
}, /* lock prefix */
2059 { "int1", { XX
}, 0 },
2060 { Bad_Opcode
}, /* repne */
2061 { Bad_Opcode
}, /* repz */
2062 { "hlt", { XX
}, 0 },
2063 { "cmc", { XX
}, 0 },
2064 { REG_TABLE (REG_F6
) },
2065 { REG_TABLE (REG_F7
) },
2067 { "clc", { XX
}, 0 },
2068 { "stc", { XX
}, 0 },
2069 { "cli", { XX
}, 0 },
2070 { "sti", { XX
}, 0 },
2071 { "cld", { XX
}, 0 },
2072 { "std", { XX
}, 0 },
2073 { REG_TABLE (REG_FE
) },
2074 { REG_TABLE (REG_FF
) },
2077 static const struct dis386 dis386_twobyte
[] = {
2079 { REG_TABLE (REG_0F00
) },
2080 { REG_TABLE (REG_0F01
) },
2081 { "larS", { Gv
, Ew
}, 0 },
2082 { "lslS", { Gv
, Ew
}, 0 },
2084 { "syscall", { XX
}, 0 },
2085 { "clts", { XX
}, 0 },
2086 { "sysret%LQ", { XX
}, 0 },
2088 { "invd", { XX
}, 0 },
2089 { PREFIX_TABLE (PREFIX_0F09
) },
2091 { "ud2", { XX
}, 0 },
2093 { REG_TABLE (REG_0F0D
) },
2094 { "femms", { XX
}, 0 },
2095 { "", { MX
, EM
, OPSUF
}, 0 }, /* See OP_3DNowSuffix. */
2097 { PREFIX_TABLE (PREFIX_0F10
) },
2098 { PREFIX_TABLE (PREFIX_0F11
) },
2099 { PREFIX_TABLE (PREFIX_0F12
) },
2100 { MOD_TABLE (MOD_0F13
) },
2101 { "unpcklpX", { XM
, EXx
}, PREFIX_OPCODE
},
2102 { "unpckhpX", { XM
, EXx
}, PREFIX_OPCODE
},
2103 { PREFIX_TABLE (PREFIX_0F16
) },
2104 { MOD_TABLE (MOD_0F17
) },
2106 { REG_TABLE (REG_0F18
) },
2107 { "nopQ", { Ev
}, 0 },
2108 { PREFIX_TABLE (PREFIX_0F1A
) },
2109 { PREFIX_TABLE (PREFIX_0F1B
) },
2110 { PREFIX_TABLE (PREFIX_0F1C
) },
2111 { "nopQ", { Ev
}, 0 },
2112 { PREFIX_TABLE (PREFIX_0F1E
) },
2113 { "nopQ", { Ev
}, 0 },
2115 { "movZ", { Em
, Cm
}, 0 },
2116 { "movZ", { Em
, Dm
}, 0 },
2117 { "movZ", { Cm
, Em
}, 0 },
2118 { "movZ", { Dm
, Em
}, 0 },
2119 { X86_64_TABLE (X86_64_0F24
) },
2121 { X86_64_TABLE (X86_64_0F26
) },
2124 { "movapX", { XM
, EXx
}, PREFIX_OPCODE
},
2125 { "movapX", { EXxS
, XM
}, PREFIX_OPCODE
},
2126 { PREFIX_TABLE (PREFIX_0F2A
) },
2127 { PREFIX_TABLE (PREFIX_0F2B
) },
2128 { PREFIX_TABLE (PREFIX_0F2C
) },
2129 { PREFIX_TABLE (PREFIX_0F2D
) },
2130 { PREFIX_TABLE (PREFIX_0F2E
) },
2131 { PREFIX_TABLE (PREFIX_0F2F
) },
2133 { "wrmsr", { XX
}, 0 },
2134 { "rdtsc", { XX
}, 0 },
2135 { "rdmsr", { XX
}, 0 },
2136 { "rdpmc", { XX
}, 0 },
2137 { "sysenter", { SEP
}, 0 },
2138 { "sysexit%LQ", { SEP
}, 0 },
2140 { "getsec", { XX
}, 0 },
2142 { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F38
, PREFIX_OPCODE
) },
2144 { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F3A
, PREFIX_OPCODE
) },
2151 { "cmovoS", { Gv
, Ev
}, 0 },
2152 { "cmovnoS", { Gv
, Ev
}, 0 },
2153 { "cmovbS", { Gv
, Ev
}, 0 },
2154 { "cmovaeS", { Gv
, Ev
}, 0 },
2155 { "cmoveS", { Gv
, Ev
}, 0 },
2156 { "cmovneS", { Gv
, Ev
}, 0 },
2157 { "cmovbeS", { Gv
, Ev
}, 0 },
2158 { "cmovaS", { Gv
, Ev
}, 0 },
2160 { "cmovsS", { Gv
, Ev
}, 0 },
2161 { "cmovnsS", { Gv
, Ev
}, 0 },
2162 { "cmovpS", { Gv
, Ev
}, 0 },
2163 { "cmovnpS", { Gv
, Ev
}, 0 },
2164 { "cmovlS", { Gv
, Ev
}, 0 },
2165 { "cmovgeS", { Gv
, Ev
}, 0 },
2166 { "cmovleS", { Gv
, Ev
}, 0 },
2167 { "cmovgS", { Gv
, Ev
}, 0 },
2169 { MOD_TABLE (MOD_0F50
) },
2170 { PREFIX_TABLE (PREFIX_0F51
) },
2171 { PREFIX_TABLE (PREFIX_0F52
) },
2172 { PREFIX_TABLE (PREFIX_0F53
) },
2173 { "andpX", { XM
, EXx
}, PREFIX_OPCODE
},
2174 { "andnpX", { XM
, EXx
}, PREFIX_OPCODE
},
2175 { "orpX", { XM
, EXx
}, PREFIX_OPCODE
},
2176 { "xorpX", { XM
, EXx
}, PREFIX_OPCODE
},
2178 { PREFIX_TABLE (PREFIX_0F58
) },
2179 { PREFIX_TABLE (PREFIX_0F59
) },
2180 { PREFIX_TABLE (PREFIX_0F5A
) },
2181 { PREFIX_TABLE (PREFIX_0F5B
) },
2182 { PREFIX_TABLE (PREFIX_0F5C
) },
2183 { PREFIX_TABLE (PREFIX_0F5D
) },
2184 { PREFIX_TABLE (PREFIX_0F5E
) },
2185 { PREFIX_TABLE (PREFIX_0F5F
) },
2187 { PREFIX_TABLE (PREFIX_0F60
) },
2188 { PREFIX_TABLE (PREFIX_0F61
) },
2189 { PREFIX_TABLE (PREFIX_0F62
) },
2190 { "packsswb", { MX
, EM
}, PREFIX_OPCODE
},
2191 { "pcmpgtb", { MX
, EM
}, PREFIX_OPCODE
},
2192 { "pcmpgtw", { MX
, EM
}, PREFIX_OPCODE
},
2193 { "pcmpgtd", { MX
, EM
}, PREFIX_OPCODE
},
2194 { "packuswb", { MX
, EM
}, PREFIX_OPCODE
},
2196 { "punpckhbw", { MX
, EM
}, PREFIX_OPCODE
},
2197 { "punpckhwd", { MX
, EM
}, PREFIX_OPCODE
},
2198 { "punpckhdq", { MX
, EM
}, PREFIX_OPCODE
},
2199 { "packssdw", { MX
, EM
}, PREFIX_OPCODE
},
2200 { "punpcklqdq", { XM
, EXx
}, PREFIX_DATA
},
2201 { "punpckhqdq", { XM
, EXx
}, PREFIX_DATA
},
2202 { "movK", { MX
, Edq
}, PREFIX_OPCODE
},
2203 { PREFIX_TABLE (PREFIX_0F6F
) },
2205 { PREFIX_TABLE (PREFIX_0F70
) },
2206 { MOD_TABLE (MOD_0F71
) },
2207 { MOD_TABLE (MOD_0F72
) },
2208 { MOD_TABLE (MOD_0F73
) },
2209 { "pcmpeqb", { MX
, EM
}, PREFIX_OPCODE
},
2210 { "pcmpeqw", { MX
, EM
}, PREFIX_OPCODE
},
2211 { "pcmpeqd", { MX
, EM
}, PREFIX_OPCODE
},
2212 { "emms", { XX
}, PREFIX_OPCODE
},
2214 { PREFIX_TABLE (PREFIX_0F78
) },
2215 { PREFIX_TABLE (PREFIX_0F79
) },
2218 { PREFIX_TABLE (PREFIX_0F7C
) },
2219 { PREFIX_TABLE (PREFIX_0F7D
) },
2220 { PREFIX_TABLE (PREFIX_0F7E
) },
2221 { PREFIX_TABLE (PREFIX_0F7F
) },
2223 { "joH", { Jv
, BND
, cond_jump_flag
}, 0 },
2224 { "jnoH", { Jv
, BND
, cond_jump_flag
}, 0 },
2225 { "jbH", { Jv
, BND
, cond_jump_flag
}, 0 },
2226 { "jaeH", { Jv
, BND
, cond_jump_flag
}, 0 },
2227 { "jeH", { Jv
, BND
, cond_jump_flag
}, 0 },
2228 { "jneH", { Jv
, BND
, cond_jump_flag
}, 0 },
2229 { "jbeH", { Jv
, BND
, cond_jump_flag
}, 0 },
2230 { "jaH", { Jv
, BND
, cond_jump_flag
}, 0 },
2232 { "jsH", { Jv
, BND
, cond_jump_flag
}, 0 },
2233 { "jnsH", { Jv
, BND
, cond_jump_flag
}, 0 },
2234 { "jpH", { Jv
, BND
, cond_jump_flag
}, 0 },
2235 { "jnpH", { Jv
, BND
, cond_jump_flag
}, 0 },
2236 { "jlH", { Jv
, BND
, cond_jump_flag
}, 0 },
2237 { "jgeH", { Jv
, BND
, cond_jump_flag
}, 0 },
2238 { "jleH", { Jv
, BND
, cond_jump_flag
}, 0 },
2239 { "jgH", { Jv
, BND
, cond_jump_flag
}, 0 },
2241 { "seto", { Eb
}, 0 },
2242 { "setno", { Eb
}, 0 },
2243 { "setb", { Eb
}, 0 },
2244 { "setae", { Eb
}, 0 },
2245 { "sete", { Eb
}, 0 },
2246 { "setne", { Eb
}, 0 },
2247 { "setbe", { Eb
}, 0 },
2248 { "seta", { Eb
}, 0 },
2250 { "sets", { Eb
}, 0 },
2251 { "setns", { Eb
}, 0 },
2252 { "setp", { Eb
}, 0 },
2253 { "setnp", { Eb
}, 0 },
2254 { "setl", { Eb
}, 0 },
2255 { "setge", { Eb
}, 0 },
2256 { "setle", { Eb
}, 0 },
2257 { "setg", { Eb
}, 0 },
2259 { "pushP", { fs
}, 0 },
2260 { "popP", { fs
}, 0 },
2261 { "cpuid", { XX
}, 0 },
2262 { "btS", { Ev
, Gv
}, 0 },
2263 { "shldS", { Ev
, Gv
, Ib
}, 0 },
2264 { "shldS", { Ev
, Gv
, CL
}, 0 },
2265 { REG_TABLE (REG_0FA6
) },
2266 { REG_TABLE (REG_0FA7
) },
2268 { "pushP", { gs
}, 0 },
2269 { "popP", { gs
}, 0 },
2270 { "rsm", { XX
}, 0 },
2271 { "btsS", { Evh1
, Gv
}, 0 },
2272 { "shrdS", { Ev
, Gv
, Ib
}, 0 },
2273 { "shrdS", { Ev
, Gv
, CL
}, 0 },
2274 { REG_TABLE (REG_0FAE
) },
2275 { "imulS", { Gv
, Ev
}, 0 },
2277 { "cmpxchgB", { Ebh1
, Gb
}, 0 },
2278 { "cmpxchgS", { Evh1
, Gv
}, 0 },
2279 { MOD_TABLE (MOD_0FB2
) },
2280 { "btrS", { Evh1
, Gv
}, 0 },
2281 { MOD_TABLE (MOD_0FB4
) },
2282 { MOD_TABLE (MOD_0FB5
) },
2283 { "movz{bR|x}", { Gv
, Eb
}, 0 },
2284 { "movz{wR|x}", { Gv
, Ew
}, 0 }, /* yes, there really is movzww ! */
2286 { PREFIX_TABLE (PREFIX_0FB8
) },
2287 { "ud1S", { Gv
, Ev
}, 0 },
2288 { REG_TABLE (REG_0FBA
) },
2289 { "btcS", { Evh1
, Gv
}, 0 },
2290 { PREFIX_TABLE (PREFIX_0FBC
) },
2291 { PREFIX_TABLE (PREFIX_0FBD
) },
2292 { "movs{bR|x}", { Gv
, Eb
}, 0 },
2293 { "movs{wR|x}", { Gv
, Ew
}, 0 }, /* yes, there really is movsww ! */
2295 { "xaddB", { Ebh1
, Gb
}, 0 },
2296 { "xaddS", { Evh1
, Gv
}, 0 },
2297 { PREFIX_TABLE (PREFIX_0FC2
) },
2298 { MOD_TABLE (MOD_0FC3
) },
2299 { "pinsrw", { MX
, Edw
, Ib
}, PREFIX_OPCODE
},
2300 { "pextrw", { Gd
, MS
, Ib
}, PREFIX_OPCODE
},
2301 { "shufpX", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
2302 { REG_TABLE (REG_0FC7
) },
2304 { "bswap", { RMeAX
}, 0 },
2305 { "bswap", { RMeCX
}, 0 },
2306 { "bswap", { RMeDX
}, 0 },
2307 { "bswap", { RMeBX
}, 0 },
2308 { "bswap", { RMeSP
}, 0 },
2309 { "bswap", { RMeBP
}, 0 },
2310 { "bswap", { RMeSI
}, 0 },
2311 { "bswap", { RMeDI
}, 0 },
2313 { PREFIX_TABLE (PREFIX_0FD0
) },
2314 { "psrlw", { MX
, EM
}, PREFIX_OPCODE
},
2315 { "psrld", { MX
, EM
}, PREFIX_OPCODE
},
2316 { "psrlq", { MX
, EM
}, PREFIX_OPCODE
},
2317 { "paddq", { MX
, EM
}, PREFIX_OPCODE
},
2318 { "pmullw", { MX
, EM
}, PREFIX_OPCODE
},
2319 { PREFIX_TABLE (PREFIX_0FD6
) },
2320 { MOD_TABLE (MOD_0FD7
) },
2322 { "psubusb", { MX
, EM
}, PREFIX_OPCODE
},
2323 { "psubusw", { MX
, EM
}, PREFIX_OPCODE
},
2324 { "pminub", { MX
, EM
}, PREFIX_OPCODE
},
2325 { "pand", { MX
, EM
}, PREFIX_OPCODE
},
2326 { "paddusb", { MX
, EM
}, PREFIX_OPCODE
},
2327 { "paddusw", { MX
, EM
}, PREFIX_OPCODE
},
2328 { "pmaxub", { MX
, EM
}, PREFIX_OPCODE
},
2329 { "pandn", { MX
, EM
}, PREFIX_OPCODE
},
2331 { "pavgb", { MX
, EM
}, PREFIX_OPCODE
},
2332 { "psraw", { MX
, EM
}, PREFIX_OPCODE
},
2333 { "psrad", { MX
, EM
}, PREFIX_OPCODE
},
2334 { "pavgw", { MX
, EM
}, PREFIX_OPCODE
},
2335 { "pmulhuw", { MX
, EM
}, PREFIX_OPCODE
},
2336 { "pmulhw", { MX
, EM
}, PREFIX_OPCODE
},
2337 { PREFIX_TABLE (PREFIX_0FE6
) },
2338 { PREFIX_TABLE (PREFIX_0FE7
) },
2340 { "psubsb", { MX
, EM
}, PREFIX_OPCODE
},
2341 { "psubsw", { MX
, EM
}, PREFIX_OPCODE
},
2342 { "pminsw", { MX
, EM
}, PREFIX_OPCODE
},
2343 { "por", { MX
, EM
}, PREFIX_OPCODE
},
2344 { "paddsb", { MX
, EM
}, PREFIX_OPCODE
},
2345 { "paddsw", { MX
, EM
}, PREFIX_OPCODE
},
2346 { "pmaxsw", { MX
, EM
}, PREFIX_OPCODE
},
2347 { "pxor", { MX
, EM
}, PREFIX_OPCODE
},
2349 { PREFIX_TABLE (PREFIX_0FF0
) },
2350 { "psllw", { MX
, EM
}, PREFIX_OPCODE
},
2351 { "pslld", { MX
, EM
}, PREFIX_OPCODE
},
2352 { "psllq", { MX
, EM
}, PREFIX_OPCODE
},
2353 { "pmuludq", { MX
, EM
}, PREFIX_OPCODE
},
2354 { "pmaddwd", { MX
, EM
}, PREFIX_OPCODE
},
2355 { "psadbw", { MX
, EM
}, PREFIX_OPCODE
},
2356 { PREFIX_TABLE (PREFIX_0FF7
) },
2358 { "psubb", { MX
, EM
}, PREFIX_OPCODE
},
2359 { "psubw", { MX
, EM
}, PREFIX_OPCODE
},
2360 { "psubd", { MX
, EM
}, PREFIX_OPCODE
},
2361 { "psubq", { MX
, EM
}, PREFIX_OPCODE
},
2362 { "paddb", { MX
, EM
}, PREFIX_OPCODE
},
2363 { "paddw", { MX
, EM
}, PREFIX_OPCODE
},
2364 { "paddd", { MX
, EM
}, PREFIX_OPCODE
},
2365 { "ud0S", { Gv
, Ev
}, 0 },
2368 static const unsigned char onebyte_has_modrm
[256] = {
2369 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2370 /* ------------------------------- */
2371 /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
2372 /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
2373 /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
2374 /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
2375 /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
2376 /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
2377 /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
2378 /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
2379 /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
2380 /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
2381 /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
2382 /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
2383 /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
2384 /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
2385 /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
2386 /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1 /* f0 */
2387 /* ------------------------------- */
2388 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2391 static const unsigned char twobyte_has_modrm
[256] = {
2392 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2393 /* ------------------------------- */
2394 /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
2395 /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
2396 /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
2397 /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
2398 /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
2399 /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
2400 /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
2401 /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
2402 /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
2403 /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
2404 /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
2405 /* b0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* bf */
2406 /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
2407 /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
2408 /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
2409 /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 /* ff */
2410 /* ------------------------------- */
2411 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2421 /* If we are accessing mod/rm/reg without need_modrm set, then the
2422 values are stale. Hitting this abort likely indicates that you
2423 need to update onebyte_has_modrm or twobyte_has_modrm. */
2424 #define MODRM_CHECK if (!ins->need_modrm) abort ()
2426 static const char *intel_names64
[] = {
2427 "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
2428 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2430 static const char *intel_names32
[] = {
2431 "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
2432 "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
2434 static const char *intel_names16
[] = {
2435 "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
2436 "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
2438 static const char *intel_names8
[] = {
2439 "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
2441 static const char *intel_names8rex
[] = {
2442 "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
2443 "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
2445 static const char *intel_names_seg
[] = {
2446 "es", "cs", "ss", "ds", "fs", "gs", "?", "?",
2448 static const char *intel_index64
= "riz";
2449 static const char *intel_index32
= "eiz";
2450 static const char *intel_index16
[] = {
2451 "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
2454 static const char *att_names64
[] = {
2455 "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
2456 "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
2458 static const char *att_names32
[] = {
2459 "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
2460 "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
2462 static const char *att_names16
[] = {
2463 "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
2464 "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
2466 static const char *att_names8
[] = {
2467 "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
2469 static const char *att_names8rex
[] = {
2470 "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
2471 "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
2473 static const char *att_names_seg
[] = {
2474 "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
2476 static const char *att_index64
= "%riz";
2477 static const char *att_index32
= "%eiz";
2478 static const char *att_index16
[] = {
2479 "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
2482 static const char *intel_names_mm
[] = {
2483 "mm0", "mm1", "mm2", "mm3",
2484 "mm4", "mm5", "mm6", "mm7"
2486 static const char *att_names_mm
[] = {
2487 "%mm0", "%mm1", "%mm2", "%mm3",
2488 "%mm4", "%mm5", "%mm6", "%mm7"
2491 static const char *intel_names_bnd
[] = {
2492 "bnd0", "bnd1", "bnd2", "bnd3"
2495 static const char *att_names_bnd
[] = {
2496 "%bnd0", "%bnd1", "%bnd2", "%bnd3"
2499 static const char *intel_names_xmm
[] = {
2500 "xmm0", "xmm1", "xmm2", "xmm3",
2501 "xmm4", "xmm5", "xmm6", "xmm7",
2502 "xmm8", "xmm9", "xmm10", "xmm11",
2503 "xmm12", "xmm13", "xmm14", "xmm15",
2504 "xmm16", "xmm17", "xmm18", "xmm19",
2505 "xmm20", "xmm21", "xmm22", "xmm23",
2506 "xmm24", "xmm25", "xmm26", "xmm27",
2507 "xmm28", "xmm29", "xmm30", "xmm31"
2509 static const char *att_names_xmm
[] = {
2510 "%xmm0", "%xmm1", "%xmm2", "%xmm3",
2511 "%xmm4", "%xmm5", "%xmm6", "%xmm7",
2512 "%xmm8", "%xmm9", "%xmm10", "%xmm11",
2513 "%xmm12", "%xmm13", "%xmm14", "%xmm15",
2514 "%xmm16", "%xmm17", "%xmm18", "%xmm19",
2515 "%xmm20", "%xmm21", "%xmm22", "%xmm23",
2516 "%xmm24", "%xmm25", "%xmm26", "%xmm27",
2517 "%xmm28", "%xmm29", "%xmm30", "%xmm31"
2520 static const char *intel_names_ymm
[] = {
2521 "ymm0", "ymm1", "ymm2", "ymm3",
2522 "ymm4", "ymm5", "ymm6", "ymm7",
2523 "ymm8", "ymm9", "ymm10", "ymm11",
2524 "ymm12", "ymm13", "ymm14", "ymm15",
2525 "ymm16", "ymm17", "ymm18", "ymm19",
2526 "ymm20", "ymm21", "ymm22", "ymm23",
2527 "ymm24", "ymm25", "ymm26", "ymm27",
2528 "ymm28", "ymm29", "ymm30", "ymm31"
2530 static const char *att_names_ymm
[] = {
2531 "%ymm0", "%ymm1", "%ymm2", "%ymm3",
2532 "%ymm4", "%ymm5", "%ymm6", "%ymm7",
2533 "%ymm8", "%ymm9", "%ymm10", "%ymm11",
2534 "%ymm12", "%ymm13", "%ymm14", "%ymm15",
2535 "%ymm16", "%ymm17", "%ymm18", "%ymm19",
2536 "%ymm20", "%ymm21", "%ymm22", "%ymm23",
2537 "%ymm24", "%ymm25", "%ymm26", "%ymm27",
2538 "%ymm28", "%ymm29", "%ymm30", "%ymm31"
2541 static const char *intel_names_zmm
[] = {
2542 "zmm0", "zmm1", "zmm2", "zmm3",
2543 "zmm4", "zmm5", "zmm6", "zmm7",
2544 "zmm8", "zmm9", "zmm10", "zmm11",
2545 "zmm12", "zmm13", "zmm14", "zmm15",
2546 "zmm16", "zmm17", "zmm18", "zmm19",
2547 "zmm20", "zmm21", "zmm22", "zmm23",
2548 "zmm24", "zmm25", "zmm26", "zmm27",
2549 "zmm28", "zmm29", "zmm30", "zmm31"
2551 static const char *att_names_zmm
[] = {
2552 "%zmm0", "%zmm1", "%zmm2", "%zmm3",
2553 "%zmm4", "%zmm5", "%zmm6", "%zmm7",
2554 "%zmm8", "%zmm9", "%zmm10", "%zmm11",
2555 "%zmm12", "%zmm13", "%zmm14", "%zmm15",
2556 "%zmm16", "%zmm17", "%zmm18", "%zmm19",
2557 "%zmm20", "%zmm21", "%zmm22", "%zmm23",
2558 "%zmm24", "%zmm25", "%zmm26", "%zmm27",
2559 "%zmm28", "%zmm29", "%zmm30", "%zmm31"
2562 static const char *intel_names_tmm
[] = {
2563 "tmm0", "tmm1", "tmm2", "tmm3",
2564 "tmm4", "tmm5", "tmm6", "tmm7"
2566 static const char *att_names_tmm
[] = {
2567 "%tmm0", "%tmm1", "%tmm2", "%tmm3",
2568 "%tmm4", "%tmm5", "%tmm6", "%tmm7"
2571 static const char *intel_names_mask
[] = {
2572 "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7"
2574 static const char *att_names_mask
[] = {
2575 "%k0", "%k1", "%k2", "%k3", "%k4", "%k5", "%k6", "%k7"
2578 static const char *const names_rounding
[] =
2586 static const struct dis386 reg_table
[][8] = {
2589 { "addA", { Ebh1
, Ib
}, 0 },
2590 { "orA", { Ebh1
, Ib
}, 0 },
2591 { "adcA", { Ebh1
, Ib
}, 0 },
2592 { "sbbA", { Ebh1
, Ib
}, 0 },
2593 { "andA", { Ebh1
, Ib
}, 0 },
2594 { "subA", { Ebh1
, Ib
}, 0 },
2595 { "xorA", { Ebh1
, Ib
}, 0 },
2596 { "cmpA", { Eb
, Ib
}, 0 },
2600 { "addQ", { Evh1
, Iv
}, 0 },
2601 { "orQ", { Evh1
, Iv
}, 0 },
2602 { "adcQ", { Evh1
, Iv
}, 0 },
2603 { "sbbQ", { Evh1
, Iv
}, 0 },
2604 { "andQ", { Evh1
, Iv
}, 0 },
2605 { "subQ", { Evh1
, Iv
}, 0 },
2606 { "xorQ", { Evh1
, Iv
}, 0 },
2607 { "cmpQ", { Ev
, Iv
}, 0 },
2611 { "addQ", { Evh1
, sIb
}, 0 },
2612 { "orQ", { Evh1
, sIb
}, 0 },
2613 { "adcQ", { Evh1
, sIb
}, 0 },
2614 { "sbbQ", { Evh1
, sIb
}, 0 },
2615 { "andQ", { Evh1
, sIb
}, 0 },
2616 { "subQ", { Evh1
, sIb
}, 0 },
2617 { "xorQ", { Evh1
, sIb
}, 0 },
2618 { "cmpQ", { Ev
, sIb
}, 0 },
2622 { "pop{P|}", { stackEv
}, 0 },
2623 { XOP_8F_TABLE (XOP_09
) },
2627 { XOP_8F_TABLE (XOP_09
) },
2631 { "rolA", { Eb
, Ib
}, 0 },
2632 { "rorA", { Eb
, Ib
}, 0 },
2633 { "rclA", { Eb
, Ib
}, 0 },
2634 { "rcrA", { Eb
, Ib
}, 0 },
2635 { "shlA", { Eb
, Ib
}, 0 },
2636 { "shrA", { Eb
, Ib
}, 0 },
2637 { "shlA", { Eb
, Ib
}, 0 },
2638 { "sarA", { Eb
, Ib
}, 0 },
2642 { "rolQ", { Ev
, Ib
}, 0 },
2643 { "rorQ", { Ev
, Ib
}, 0 },
2644 { "rclQ", { Ev
, Ib
}, 0 },
2645 { "rcrQ", { Ev
, Ib
}, 0 },
2646 { "shlQ", { Ev
, Ib
}, 0 },
2647 { "shrQ", { Ev
, Ib
}, 0 },
2648 { "shlQ", { Ev
, Ib
}, 0 },
2649 { "sarQ", { Ev
, Ib
}, 0 },
2653 { "movA", { Ebh3
, Ib
}, 0 },
2660 { MOD_TABLE (MOD_C6_REG_7
) },
2664 { "movQ", { Evh3
, Iv
}, 0 },
2671 { MOD_TABLE (MOD_C7_REG_7
) },
2675 { "rolA", { Eb
, I1
}, 0 },
2676 { "rorA", { Eb
, I1
}, 0 },
2677 { "rclA", { Eb
, I1
}, 0 },
2678 { "rcrA", { Eb
, I1
}, 0 },
2679 { "shlA", { Eb
, I1
}, 0 },
2680 { "shrA", { Eb
, I1
}, 0 },
2681 { "shlA", { Eb
, I1
}, 0 },
2682 { "sarA", { Eb
, I1
}, 0 },
2686 { "rolQ", { Ev
, I1
}, 0 },
2687 { "rorQ", { Ev
, I1
}, 0 },
2688 { "rclQ", { Ev
, I1
}, 0 },
2689 { "rcrQ", { Ev
, I1
}, 0 },
2690 { "shlQ", { Ev
, I1
}, 0 },
2691 { "shrQ", { Ev
, I1
}, 0 },
2692 { "shlQ", { Ev
, I1
}, 0 },
2693 { "sarQ", { Ev
, I1
}, 0 },
2697 { "rolA", { Eb
, CL
}, 0 },
2698 { "rorA", { Eb
, CL
}, 0 },
2699 { "rclA", { Eb
, CL
}, 0 },
2700 { "rcrA", { Eb
, CL
}, 0 },
2701 { "shlA", { Eb
, CL
}, 0 },
2702 { "shrA", { Eb
, CL
}, 0 },
2703 { "shlA", { Eb
, CL
}, 0 },
2704 { "sarA", { Eb
, CL
}, 0 },
2708 { "rolQ", { Ev
, CL
}, 0 },
2709 { "rorQ", { Ev
, CL
}, 0 },
2710 { "rclQ", { Ev
, CL
}, 0 },
2711 { "rcrQ", { Ev
, CL
}, 0 },
2712 { "shlQ", { Ev
, CL
}, 0 },
2713 { "shrQ", { Ev
, CL
}, 0 },
2714 { "shlQ", { Ev
, CL
}, 0 },
2715 { "sarQ", { Ev
, CL
}, 0 },
2719 { "testA", { Eb
, Ib
}, 0 },
2720 { "testA", { Eb
, Ib
}, 0 },
2721 { "notA", { Ebh1
}, 0 },
2722 { "negA", { Ebh1
}, 0 },
2723 { "mulA", { Eb
}, 0 }, /* Don't print the implicit %al register, */
2724 { "imulA", { Eb
}, 0 }, /* to distinguish these opcodes from other */
2725 { "divA", { Eb
}, 0 }, /* mul/imul opcodes. Do the same for div */
2726 { "idivA", { Eb
}, 0 }, /* and idiv for consistency. */
2730 { "testQ", { Ev
, Iv
}, 0 },
2731 { "testQ", { Ev
, Iv
}, 0 },
2732 { "notQ", { Evh1
}, 0 },
2733 { "negQ", { Evh1
}, 0 },
2734 { "mulQ", { Ev
}, 0 }, /* Don't print the implicit register. */
2735 { "imulQ", { Ev
}, 0 },
2736 { "divQ", { Ev
}, 0 },
2737 { "idivQ", { Ev
}, 0 },
2741 { "incA", { Ebh1
}, 0 },
2742 { "decA", { Ebh1
}, 0 },
2746 { "incQ", { Evh1
}, 0 },
2747 { "decQ", { Evh1
}, 0 },
2748 { "call{@|}", { NOTRACK
, indirEv
, BND
}, 0 },
2749 { MOD_TABLE (MOD_FF_REG_3
) },
2750 { "jmp{@|}", { NOTRACK
, indirEv
, BND
}, 0 },
2751 { MOD_TABLE (MOD_FF_REG_5
) },
2752 { "push{P|}", { stackEv
}, 0 },
2757 { "sldtD", { Sv
}, 0 },
2758 { "strD", { Sv
}, 0 },
2759 { "lldt", { Ew
}, 0 },
2760 { "ltr", { Ew
}, 0 },
2761 { "verr", { Ew
}, 0 },
2762 { "verw", { Ew
}, 0 },
2768 { MOD_TABLE (MOD_0F01_REG_0
) },
2769 { MOD_TABLE (MOD_0F01_REG_1
) },
2770 { MOD_TABLE (MOD_0F01_REG_2
) },
2771 { MOD_TABLE (MOD_0F01_REG_3
) },
2772 { "smswD", { Sv
}, 0 },
2773 { MOD_TABLE (MOD_0F01_REG_5
) },
2774 { "lmsw", { Ew
}, 0 },
2775 { MOD_TABLE (MOD_0F01_REG_7
) },
2779 { "prefetch", { Mb
}, 0 },
2780 { "prefetchw", { Mb
}, 0 },
2781 { "prefetchwt1", { Mb
}, 0 },
2782 { "prefetch", { Mb
}, 0 },
2783 { "prefetch", { Mb
}, 0 },
2784 { "prefetch", { Mb
}, 0 },
2785 { "prefetch", { Mb
}, 0 },
2786 { "prefetch", { Mb
}, 0 },
2790 { MOD_TABLE (MOD_0F18_REG_0
) },
2791 { MOD_TABLE (MOD_0F18_REG_1
) },
2792 { MOD_TABLE (MOD_0F18_REG_2
) },
2793 { MOD_TABLE (MOD_0F18_REG_3
) },
2794 { "nopQ", { Ev
}, 0 },
2795 { "nopQ", { Ev
}, 0 },
2796 { "nopQ", { Ev
}, 0 },
2797 { "nopQ", { Ev
}, 0 },
2799 /* REG_0F1C_P_0_MOD_0 */
2801 { "cldemote", { Mb
}, 0 },
2802 { "nopQ", { Ev
}, 0 },
2803 { "nopQ", { Ev
}, 0 },
2804 { "nopQ", { Ev
}, 0 },
2805 { "nopQ", { Ev
}, 0 },
2806 { "nopQ", { Ev
}, 0 },
2807 { "nopQ", { Ev
}, 0 },
2808 { "nopQ", { Ev
}, 0 },
2810 /* REG_0F1E_P_1_MOD_3 */
2812 { "nopQ", { Ev
}, PREFIX_IGNORED
},
2813 { "rdsspK", { Edq
}, 0 },
2814 { "nopQ", { Ev
}, PREFIX_IGNORED
},
2815 { "nopQ", { Ev
}, PREFIX_IGNORED
},
2816 { "nopQ", { Ev
}, PREFIX_IGNORED
},
2817 { "nopQ", { Ev
}, PREFIX_IGNORED
},
2818 { "nopQ", { Ev
}, PREFIX_IGNORED
},
2819 { RM_TABLE (RM_0F1E_P_1_MOD_3_REG_7
) },
2821 /* REG_0F38D8_PREFIX_1 */
2823 { "aesencwide128kl", { M
}, 0 },
2824 { "aesdecwide128kl", { M
}, 0 },
2825 { "aesencwide256kl", { M
}, 0 },
2826 { "aesdecwide256kl", { M
}, 0 },
2828 /* REG_0F3A0F_PREFIX_1_MOD_3 */
2830 { RM_TABLE (RM_0F3A0F_P_1_MOD_3_REG_0
) },
2832 /* REG_0F71_MOD_0 */
2836 { "psrlw", { MS
, Ib
}, PREFIX_OPCODE
},
2838 { "psraw", { MS
, Ib
}, PREFIX_OPCODE
},
2840 { "psllw", { MS
, Ib
}, PREFIX_OPCODE
},
2842 /* REG_0F72_MOD_0 */
2846 { "psrld", { MS
, Ib
}, PREFIX_OPCODE
},
2848 { "psrad", { MS
, Ib
}, PREFIX_OPCODE
},
2850 { "pslld", { MS
, Ib
}, PREFIX_OPCODE
},
2852 /* REG_0F73_MOD_0 */
2856 { "psrlq", { MS
, Ib
}, PREFIX_OPCODE
},
2857 { "psrldq", { XS
, Ib
}, PREFIX_DATA
},
2860 { "psllq", { MS
, Ib
}, PREFIX_OPCODE
},
2861 { "pslldq", { XS
, Ib
}, PREFIX_DATA
},
2865 { "montmul", { { OP_0f07
, 0 } }, 0 },
2866 { "xsha1", { { OP_0f07
, 0 } }, 0 },
2867 { "xsha256", { { OP_0f07
, 0 } }, 0 },
2871 { "xstore-rng", { { OP_0f07
, 0 } }, 0 },
2872 { "xcrypt-ecb", { { OP_0f07
, 0 } }, 0 },
2873 { "xcrypt-cbc", { { OP_0f07
, 0 } }, 0 },
2874 { "xcrypt-ctr", { { OP_0f07
, 0 } }, 0 },
2875 { "xcrypt-cfb", { { OP_0f07
, 0 } }, 0 },
2876 { "xcrypt-ofb", { { OP_0f07
, 0 } }, 0 },
2880 { MOD_TABLE (MOD_0FAE_REG_0
) },
2881 { MOD_TABLE (MOD_0FAE_REG_1
) },
2882 { MOD_TABLE (MOD_0FAE_REG_2
) },
2883 { MOD_TABLE (MOD_0FAE_REG_3
) },
2884 { MOD_TABLE (MOD_0FAE_REG_4
) },
2885 { MOD_TABLE (MOD_0FAE_REG_5
) },
2886 { MOD_TABLE (MOD_0FAE_REG_6
) },
2887 { MOD_TABLE (MOD_0FAE_REG_7
) },
2895 { "btQ", { Ev
, Ib
}, 0 },
2896 { "btsQ", { Evh1
, Ib
}, 0 },
2897 { "btrQ", { Evh1
, Ib
}, 0 },
2898 { "btcQ", { Evh1
, Ib
}, 0 },
2903 { "cmpxchg8b", { { CMPXCHG8B_Fixup
, q_mode
} }, 0 },
2905 { MOD_TABLE (MOD_0FC7_REG_3
) },
2906 { MOD_TABLE (MOD_0FC7_REG_4
) },
2907 { MOD_TABLE (MOD_0FC7_REG_5
) },
2908 { MOD_TABLE (MOD_0FC7_REG_6
) },
2909 { MOD_TABLE (MOD_0FC7_REG_7
) },
2911 /* REG_VEX_0F71_M_0 */
2915 { "vpsrlw", { Vex
, XS
, Ib
}, PREFIX_DATA
},
2917 { "vpsraw", { Vex
, XS
, Ib
}, PREFIX_DATA
},
2919 { "vpsllw", { Vex
, XS
, Ib
}, PREFIX_DATA
},
2921 /* REG_VEX_0F72_M_0 */
2925 { "vpsrld", { Vex
, XS
, Ib
}, PREFIX_DATA
},
2927 { "vpsrad", { Vex
, XS
, Ib
}, PREFIX_DATA
},
2929 { "vpslld", { Vex
, XS
, Ib
}, PREFIX_DATA
},
2931 /* REG_VEX_0F73_M_0 */
2935 { "vpsrlq", { Vex
, XS
, Ib
}, PREFIX_DATA
},
2936 { "vpsrldq", { Vex
, XS
, Ib
}, PREFIX_DATA
},
2939 { "vpsllq", { Vex
, XS
, Ib
}, PREFIX_DATA
},
2940 { "vpslldq", { Vex
, XS
, Ib
}, PREFIX_DATA
},
2946 { MOD_TABLE (MOD_VEX_0FAE_REG_2
) },
2947 { MOD_TABLE (MOD_VEX_0FAE_REG_3
) },
2949 /* REG_VEX_0F3849_X86_64_P_0_W_0_M_1 */
2951 { RM_TABLE (RM_VEX_0F3849_X86_64_P_0_W_0_M_1_R_0
) },
2953 /* REG_VEX_0F38F3_L_0 */
2956 { "blsrS", { VexGdq
, Edq
}, PREFIX_OPCODE
},
2957 { "blsmskS", { VexGdq
, Edq
}, PREFIX_OPCODE
},
2958 { "blsiS", { VexGdq
, Edq
}, PREFIX_OPCODE
},
2960 /* REG_XOP_09_01_L_0 */
2963 { "blcfill", { VexGdq
, Edq
}, 0 },
2964 { "blsfill", { VexGdq
, Edq
}, 0 },
2965 { "blcs", { VexGdq
, Edq
}, 0 },
2966 { "tzmsk", { VexGdq
, Edq
}, 0 },
2967 { "blcic", { VexGdq
, Edq
}, 0 },
2968 { "blsic", { VexGdq
, Edq
}, 0 },
2969 { "t1mskc", { VexGdq
, Edq
}, 0 },
2971 /* REG_XOP_09_02_L_0 */
2974 { "blcmsk", { VexGdq
, Edq
}, 0 },
2979 { "blci", { VexGdq
, Edq
}, 0 },
2981 /* REG_XOP_09_12_M_1_L_0 */
2983 { "llwpcb", { Edq
}, 0 },
2984 { "slwpcb", { Edq
}, 0 },
2986 /* REG_XOP_0A_12_L_0 */
2988 { "lwpins", { VexGdq
, Ed
, Id
}, 0 },
2989 { "lwpval", { VexGdq
, Ed
, Id
}, 0 },
2992 #include "i386-dis-evex-reg.h"
2995 static const struct dis386 prefix_table
[][4] = {
2998 { "xchgS", { { NOP_Fixup1
, eAX_reg
}, { NOP_Fixup2
, eAX_reg
} }, 0 },
2999 { "pause", { XX
}, 0 },
3000 { "xchgS", { { NOP_Fixup1
, eAX_reg
}, { NOP_Fixup2
, eAX_reg
} }, 0 },
3001 { NULL
, { { NULL
, 0 } }, PREFIX_IGNORED
}
3004 /* PREFIX_0F01_REG_1_RM_4 */
3008 { "tdcall", { Skip_MODRM
}, 0 },
3012 /* PREFIX_0F01_REG_1_RM_5 */
3016 { X86_64_TABLE (X86_64_0F01_REG_1_RM_5_PREFIX_2
) },
3020 /* PREFIX_0F01_REG_1_RM_6 */
3024 { X86_64_TABLE (X86_64_0F01_REG_1_RM_6_PREFIX_2
) },
3028 /* PREFIX_0F01_REG_1_RM_7 */
3030 { "encls", { Skip_MODRM
}, 0 },
3032 { X86_64_TABLE (X86_64_0F01_REG_1_RM_7_PREFIX_2
) },
3036 /* PREFIX_0F01_REG_3_RM_1 */
3038 { "vmmcall", { Skip_MODRM
}, 0 },
3039 { "vmgexit", { Skip_MODRM
}, 0 },
3041 { "vmgexit", { Skip_MODRM
}, 0 },
3044 /* PREFIX_0F01_REG_5_MOD_0 */
3047 { "rstorssp", { Mq
}, PREFIX_OPCODE
},
3050 /* PREFIX_0F01_REG_5_MOD_3_RM_0 */
3052 { "serialize", { Skip_MODRM
}, PREFIX_OPCODE
},
3053 { "setssbsy", { Skip_MODRM
}, PREFIX_OPCODE
},
3055 { "xsusldtrk", { Skip_MODRM
}, PREFIX_OPCODE
},
3058 /* PREFIX_0F01_REG_5_MOD_3_RM_1 */
3063 { "xresldtrk", { Skip_MODRM
}, PREFIX_OPCODE
},
3066 /* PREFIX_0F01_REG_5_MOD_3_RM_2 */
3069 { "saveprevssp", { Skip_MODRM
}, PREFIX_OPCODE
},
3072 /* PREFIX_0F01_REG_5_MOD_3_RM_4 */
3075 { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_4_PREFIX_1
) },
3078 /* PREFIX_0F01_REG_5_MOD_3_RM_5 */
3081 { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_5_PREFIX_1
) },
3084 /* PREFIX_0F01_REG_5_MOD_3_RM_6 */
3086 { "rdpkru", { Skip_MODRM
}, 0 },
3087 { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_6_PREFIX_1
) },
3090 /* PREFIX_0F01_REG_5_MOD_3_RM_7 */
3092 { "wrpkru", { Skip_MODRM
}, 0 },
3093 { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_7_PREFIX_1
) },
3096 /* PREFIX_0F01_REG_7_MOD_3_RM_2 */
3098 { "monitorx", { { OP_Monitor
, 0 } }, 0 },
3099 { "mcommit", { Skip_MODRM
}, 0 },
3102 /* PREFIX_0F01_REG_7_MOD_3_RM_6 */
3104 { "invlpgb", { Skip_MODRM
}, 0 },
3105 { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_1
) },
3107 { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3
) },
3110 /* PREFIX_0F01_REG_7_MOD_3_RM_7 */
3112 { "tlbsync", { Skip_MODRM
}, 0 },
3113 { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_7_PREFIX_1
) },
3115 { "pvalidate", { Skip_MODRM
}, 0 },
3120 { "wbinvd", { XX
}, 0 },
3121 { "wbnoinvd", { XX
}, 0 },
3126 { "movups", { XM
, EXx
}, PREFIX_OPCODE
},
3127 { "movss", { XM
, EXd
}, PREFIX_OPCODE
},
3128 { "movupd", { XM
, EXx
}, PREFIX_OPCODE
},
3129 { "movsd", { XM
, EXq
}, PREFIX_OPCODE
},
3134 { "movups", { EXxS
, XM
}, PREFIX_OPCODE
},
3135 { "movss", { EXdS
, XM
}, PREFIX_OPCODE
},
3136 { "movupd", { EXxS
, XM
}, PREFIX_OPCODE
},
3137 { "movsd", { EXqS
, XM
}, PREFIX_OPCODE
},
3142 { MOD_TABLE (MOD_0F12_PREFIX_0
) },
3143 { "movsldup", { XM
, EXx
}, PREFIX_OPCODE
},
3144 { MOD_TABLE (MOD_0F12_PREFIX_2
) },
3145 { "movddup", { XM
, EXq
}, PREFIX_OPCODE
},
3150 { MOD_TABLE (MOD_0F16_PREFIX_0
) },
3151 { "movshdup", { XM
, EXx
}, PREFIX_OPCODE
},
3152 { MOD_TABLE (MOD_0F16_PREFIX_2
) },
3157 { MOD_TABLE (MOD_0F1A_PREFIX_0
) },
3158 { "bndcl", { Gbnd
, Ev_bnd
}, 0 },
3159 { "bndmov", { Gbnd
, Ebnd
}, 0 },
3160 { "bndcu", { Gbnd
, Ev_bnd
}, 0 },
3165 { MOD_TABLE (MOD_0F1B_PREFIX_0
) },
3166 { MOD_TABLE (MOD_0F1B_PREFIX_1
) },
3167 { "bndmov", { EbndS
, Gbnd
}, 0 },
3168 { "bndcn", { Gbnd
, Ev_bnd
}, 0 },
3173 { MOD_TABLE (MOD_0F1C_PREFIX_0
) },
3174 { "nopQ", { Ev
}, PREFIX_IGNORED
},
3175 { "nopQ", { Ev
}, 0 },
3176 { "nopQ", { Ev
}, PREFIX_IGNORED
},
3181 { "nopQ", { Ev
}, 0 },
3182 { MOD_TABLE (MOD_0F1E_PREFIX_1
) },
3183 { "nopQ", { Ev
}, 0 },
3184 { NULL
, { XX
}, PREFIX_IGNORED
},
3189 { "cvtpi2ps", { XM
, EMCq
}, PREFIX_OPCODE
},
3190 { "cvtsi2ss{%LQ|}", { XM
, Edq
}, PREFIX_OPCODE
},
3191 { "cvtpi2pd", { XM
, EMCq
}, PREFIX_OPCODE
},
3192 { "cvtsi2sd{%LQ|}", { XM
, Edq
}, 0 },
3197 { MOD_TABLE (MOD_0F2B_PREFIX_0
) },
3198 { MOD_TABLE (MOD_0F2B_PREFIX_1
) },
3199 { MOD_TABLE (MOD_0F2B_PREFIX_2
) },
3200 { MOD_TABLE (MOD_0F2B_PREFIX_3
) },
3205 { "cvttps2pi", { MXC
, EXq
}, PREFIX_OPCODE
},
3206 { "cvttss2si", { Gdq
, EXd
}, PREFIX_OPCODE
},
3207 { "cvttpd2pi", { MXC
, EXx
}, PREFIX_OPCODE
},
3208 { "cvttsd2si", { Gdq
, EXq
}, PREFIX_OPCODE
},
3213 { "cvtps2pi", { MXC
, EXq
}, PREFIX_OPCODE
},
3214 { "cvtss2si", { Gdq
, EXd
}, PREFIX_OPCODE
},
3215 { "cvtpd2pi", { MXC
, EXx
}, PREFIX_OPCODE
},
3216 { "cvtsd2si", { Gdq
, EXq
}, PREFIX_OPCODE
},
3221 { "ucomiss",{ XM
, EXd
}, 0 },
3223 { "ucomisd",{ XM
, EXq
}, 0 },
3228 { "comiss", { XM
, EXd
}, 0 },
3230 { "comisd", { XM
, EXq
}, 0 },
3235 { "sqrtps", { XM
, EXx
}, PREFIX_OPCODE
},
3236 { "sqrtss", { XM
, EXd
}, PREFIX_OPCODE
},
3237 { "sqrtpd", { XM
, EXx
}, PREFIX_OPCODE
},
3238 { "sqrtsd", { XM
, EXq
}, PREFIX_OPCODE
},
3243 { "rsqrtps",{ XM
, EXx
}, PREFIX_OPCODE
},
3244 { "rsqrtss",{ XM
, EXd
}, PREFIX_OPCODE
},
3249 { "rcpps", { XM
, EXx
}, PREFIX_OPCODE
},
3250 { "rcpss", { XM
, EXd
}, PREFIX_OPCODE
},
3255 { "addps", { XM
, EXx
}, PREFIX_OPCODE
},
3256 { "addss", { XM
, EXd
}, PREFIX_OPCODE
},
3257 { "addpd", { XM
, EXx
}, PREFIX_OPCODE
},
3258 { "addsd", { XM
, EXq
}, PREFIX_OPCODE
},
3263 { "mulps", { XM
, EXx
}, PREFIX_OPCODE
},
3264 { "mulss", { XM
, EXd
}, PREFIX_OPCODE
},
3265 { "mulpd", { XM
, EXx
}, PREFIX_OPCODE
},
3266 { "mulsd", { XM
, EXq
}, PREFIX_OPCODE
},
3271 { "cvtps2pd", { XM
, EXq
}, PREFIX_OPCODE
},
3272 { "cvtss2sd", { XM
, EXd
}, PREFIX_OPCODE
},
3273 { "cvtpd2ps", { XM
, EXx
}, PREFIX_OPCODE
},
3274 { "cvtsd2ss", { XM
, EXq
}, PREFIX_OPCODE
},
3279 { "cvtdq2ps", { XM
, EXx
}, PREFIX_OPCODE
},
3280 { "cvttps2dq", { XM
, EXx
}, PREFIX_OPCODE
},
3281 { "cvtps2dq", { XM
, EXx
}, PREFIX_OPCODE
},
3286 { "subps", { XM
, EXx
}, PREFIX_OPCODE
},
3287 { "subss", { XM
, EXd
}, PREFIX_OPCODE
},
3288 { "subpd", { XM
, EXx
}, PREFIX_OPCODE
},
3289 { "subsd", { XM
, EXq
}, PREFIX_OPCODE
},
3294 { "minps", { XM
, EXx
}, PREFIX_OPCODE
},
3295 { "minss", { XM
, EXd
}, PREFIX_OPCODE
},
3296 { "minpd", { XM
, EXx
}, PREFIX_OPCODE
},
3297 { "minsd", { XM
, EXq
}, PREFIX_OPCODE
},
3302 { "divps", { XM
, EXx
}, PREFIX_OPCODE
},
3303 { "divss", { XM
, EXd
}, PREFIX_OPCODE
},
3304 { "divpd", { XM
, EXx
}, PREFIX_OPCODE
},
3305 { "divsd", { XM
, EXq
}, PREFIX_OPCODE
},
3310 { "maxps", { XM
, EXx
}, PREFIX_OPCODE
},
3311 { "maxss", { XM
, EXd
}, PREFIX_OPCODE
},
3312 { "maxpd", { XM
, EXx
}, PREFIX_OPCODE
},
3313 { "maxsd", { XM
, EXq
}, PREFIX_OPCODE
},
3318 { "punpcklbw",{ MX
, EMd
}, PREFIX_OPCODE
},
3320 { "punpcklbw",{ MX
, EMx
}, PREFIX_OPCODE
},
3325 { "punpcklwd",{ MX
, EMd
}, PREFIX_OPCODE
},
3327 { "punpcklwd",{ MX
, EMx
}, PREFIX_OPCODE
},
3332 { "punpckldq",{ MX
, EMd
}, PREFIX_OPCODE
},
3334 { "punpckldq",{ MX
, EMx
}, PREFIX_OPCODE
},
3339 { "movq", { MX
, EM
}, PREFIX_OPCODE
},
3340 { "movdqu", { XM
, EXx
}, PREFIX_OPCODE
},
3341 { "movdqa", { XM
, EXx
}, PREFIX_OPCODE
},
3346 { "pshufw", { MX
, EM
, Ib
}, PREFIX_OPCODE
},
3347 { "pshufhw",{ XM
, EXx
, Ib
}, PREFIX_OPCODE
},
3348 { "pshufd", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
3349 { "pshuflw",{ XM
, EXx
, Ib
}, PREFIX_OPCODE
},
3354 {"vmread", { Em
, Gm
}, 0 },
3356 {"extrq", { XS
, Ib
, Ib
}, 0 },
3357 {"insertq", { XM
, XS
, Ib
, Ib
}, 0 },
3362 {"vmwrite", { Gm
, Em
}, 0 },
3364 {"extrq", { XM
, XS
}, 0 },
3365 {"insertq", { XM
, XS
}, 0 },
3372 { "haddpd", { XM
, EXx
}, PREFIX_OPCODE
},
3373 { "haddps", { XM
, EXx
}, PREFIX_OPCODE
},
3380 { "hsubpd", { XM
, EXx
}, PREFIX_OPCODE
},
3381 { "hsubps", { XM
, EXx
}, PREFIX_OPCODE
},
3386 { "movK", { Edq
, MX
}, PREFIX_OPCODE
},
3387 { "movq", { XM
, EXq
}, PREFIX_OPCODE
},
3388 { "movK", { Edq
, XM
}, PREFIX_OPCODE
},
3393 { "movq", { EMS
, MX
}, PREFIX_OPCODE
},
3394 { "movdqu", { EXxS
, XM
}, PREFIX_OPCODE
},
3395 { "movdqa", { EXxS
, XM
}, PREFIX_OPCODE
},
3398 /* PREFIX_0FAE_REG_0_MOD_3 */
3401 { "rdfsbase", { Ev
}, 0 },
3404 /* PREFIX_0FAE_REG_1_MOD_3 */
3407 { "rdgsbase", { Ev
}, 0 },
3410 /* PREFIX_0FAE_REG_2_MOD_3 */
3413 { "wrfsbase", { Ev
}, 0 },
3416 /* PREFIX_0FAE_REG_3_MOD_3 */
3419 { "wrgsbase", { Ev
}, 0 },
3422 /* PREFIX_0FAE_REG_4_MOD_0 */
3424 { "xsave", { FXSAVE
}, 0 },
3425 { "ptwrite{%LQ|}", { Edq
}, 0 },
3428 /* PREFIX_0FAE_REG_4_MOD_3 */
3431 { "ptwrite{%LQ|}", { Edq
}, 0 },
3434 /* PREFIX_0FAE_REG_5_MOD_3 */
3436 { "lfence", { Skip_MODRM
}, 0 },
3437 { "incsspK", { Edq
}, PREFIX_OPCODE
},
3440 /* PREFIX_0FAE_REG_6_MOD_0 */
3442 { "xsaveopt", { FXSAVE
}, PREFIX_OPCODE
},
3443 { "clrssbsy", { Mq
}, PREFIX_OPCODE
},
3444 { "clwb", { Mb
}, PREFIX_OPCODE
},
3447 /* PREFIX_0FAE_REG_6_MOD_3 */
3449 { RM_TABLE (RM_0FAE_REG_6_MOD_3_P_0
) },
3450 { "umonitor", { Eva
}, PREFIX_OPCODE
},
3451 { "tpause", { Edq
}, PREFIX_OPCODE
},
3452 { "umwait", { Edq
}, PREFIX_OPCODE
},
3455 /* PREFIX_0FAE_REG_7_MOD_0 */
3457 { "clflush", { Mb
}, 0 },
3459 { "clflushopt", { Mb
}, 0 },
3465 { "popcntS", { Gv
, Ev
}, 0 },
3470 { "bsfS", { Gv
, Ev
}, 0 },
3471 { "tzcntS", { Gv
, Ev
}, 0 },
3472 { "bsfS", { Gv
, Ev
}, 0 },
3477 { "bsrS", { Gv
, Ev
}, 0 },
3478 { "lzcntS", { Gv
, Ev
}, 0 },
3479 { "bsrS", { Gv
, Ev
}, 0 },
3484 { "cmpps", { XM
, EXx
, CMP
}, PREFIX_OPCODE
},
3485 { "cmpss", { XM
, EXd
, CMP
}, PREFIX_OPCODE
},
3486 { "cmppd", { XM
, EXx
, CMP
}, PREFIX_OPCODE
},
3487 { "cmpsd", { XM
, EXq
, CMP
}, PREFIX_OPCODE
},
3490 /* PREFIX_0FC7_REG_6_MOD_0 */
3492 { "vmptrld",{ Mq
}, 0 },
3493 { "vmxon", { Mq
}, 0 },
3494 { "vmclear",{ Mq
}, 0 },
3497 /* PREFIX_0FC7_REG_6_MOD_3 */
3499 { "rdrand", { Ev
}, 0 },
3500 { X86_64_TABLE (X86_64_0FC7_REG_6_MOD_3_PREFIX_1
) },
3501 { "rdrand", { Ev
}, 0 }
3504 /* PREFIX_0FC7_REG_7_MOD_3 */
3506 { "rdseed", { Ev
}, 0 },
3507 { "rdpid", { Em
}, 0 },
3508 { "rdseed", { Ev
}, 0 },
3515 { "addsubpd", { XM
, EXx
}, 0 },
3516 { "addsubps", { XM
, EXx
}, 0 },
3522 { "movq2dq",{ XM
, MS
}, 0 },
3523 { "movq", { EXqS
, XM
}, 0 },
3524 { "movdq2q",{ MX
, XS
}, 0 },
3530 { "cvtdq2pd", { XM
, EXq
}, PREFIX_OPCODE
},
3531 { "cvttpd2dq", { XM
, EXx
}, PREFIX_OPCODE
},
3532 { "cvtpd2dq", { XM
, EXx
}, PREFIX_OPCODE
},
3537 { "movntq", { Mq
, MX
}, PREFIX_OPCODE
},
3539 { MOD_TABLE (MOD_0FE7_PREFIX_2
) },
3547 { MOD_TABLE (MOD_0FF0_PREFIX_3
) },
3552 { "maskmovq", { MX
, MS
}, PREFIX_OPCODE
},
3554 { "maskmovdqu", { XM
, XS
}, PREFIX_OPCODE
},
3560 { REG_TABLE (REG_0F38D8_PREFIX_1
) },
3566 { MOD_TABLE (MOD_0F38DC_PREFIX_1
) },
3567 { "aesenc", { XM
, EXx
}, 0 },
3573 { MOD_TABLE (MOD_0F38DD_PREFIX_1
) },
3574 { "aesenclast", { XM
, EXx
}, 0 },
3580 { MOD_TABLE (MOD_0F38DE_PREFIX_1
) },
3581 { "aesdec", { XM
, EXx
}, 0 },
3587 { MOD_TABLE (MOD_0F38DF_PREFIX_1
) },
3588 { "aesdeclast", { XM
, EXx
}, 0 },
3593 { "movbeS", { Gv
, Mv
}, PREFIX_OPCODE
},
3595 { "movbeS", { Gv
, Mv
}, PREFIX_OPCODE
},
3596 { "crc32A", { Gdq
, Eb
}, PREFIX_OPCODE
},
3601 { "movbeS", { Mv
, Gv
}, PREFIX_OPCODE
},
3603 { "movbeS", { Mv
, Gv
}, PREFIX_OPCODE
},
3604 { "crc32Q", { Gdq
, Ev
}, PREFIX_OPCODE
},
3609 { MOD_TABLE (MOD_0F38F6_PREFIX_0
) },
3610 { "adoxS", { Gdq
, Edq
}, PREFIX_OPCODE
},
3611 { "adcxS", { Gdq
, Edq
}, PREFIX_OPCODE
},
3618 { MOD_TABLE (MOD_0F38F8_PREFIX_1
) },
3619 { MOD_TABLE (MOD_0F38F8_PREFIX_2
) },
3620 { MOD_TABLE (MOD_0F38F8_PREFIX_3
) },
3625 { MOD_TABLE (MOD_0F38FA_PREFIX_1
) },
3631 { MOD_TABLE (MOD_0F38FB_PREFIX_1
) },
3637 { MOD_TABLE (MOD_0F3A0F_PREFIX_1
)},
3640 /* PREFIX_VEX_0F10 */
3642 { "vmovupX", { XM
, EXEvexXNoBcst
}, PREFIX_OPCODE
},
3643 { "vmovs%XS", { XMScalar
, VexScalarR
, EXd
}, 0 },
3644 { "vmovupX", { XM
, EXEvexXNoBcst
}, PREFIX_OPCODE
},
3645 { "vmovs%XD", { XMScalar
, VexScalarR
, EXq
}, 0 },
3648 /* PREFIX_VEX_0F11 */
3650 { "vmovupX", { EXxS
, XM
}, PREFIX_OPCODE
},
3651 { "vmovs%XS", { EXdS
, VexScalarR
, XMScalar
}, 0 },
3652 { "vmovupX", { EXxS
, XM
}, PREFIX_OPCODE
},
3653 { "vmovs%XD", { EXqS
, VexScalarR
, XMScalar
}, 0 },
3656 /* PREFIX_VEX_0F12 */
3658 { MOD_TABLE (MOD_VEX_0F12_PREFIX_0
) },
3659 { "vmov%XSldup", { XM
, EXEvexXNoBcst
}, 0 },
3660 { MOD_TABLE (MOD_VEX_0F12_PREFIX_2
) },
3661 { "vmov%XDdup", { XM
, EXymmq
}, 0 },
3664 /* PREFIX_VEX_0F16 */
3666 { MOD_TABLE (MOD_VEX_0F16_PREFIX_0
) },
3667 { "vmov%XShdup", { XM
, EXEvexXNoBcst
}, 0 },
3668 { MOD_TABLE (MOD_VEX_0F16_PREFIX_2
) },
3671 /* PREFIX_VEX_0F2A */
3674 { "vcvtsi2ss{%LQ|}", { XMScalar
, VexScalar
, EXxEVexR
, Edq
}, 0 },
3676 { "vcvtsi2sd{%LQ|}", { XMScalar
, VexScalar
, EXxEVexR64
, Edq
}, 0 },
3679 /* PREFIX_VEX_0F2C */
3682 { "vcvttss2si", { Gdq
, EXd
, EXxEVexS
}, 0 },
3684 { "vcvttsd2si", { Gdq
, EXq
, EXxEVexS
}, 0 },
3687 /* PREFIX_VEX_0F2D */
3690 { "vcvtss2si", { Gdq
, EXd
, EXxEVexR
}, 0 },
3692 { "vcvtsd2si", { Gdq
, EXq
, EXxEVexR
}, 0 },
3695 /* PREFIX_VEX_0F2E */
3697 { "vucomisX", { XMScalar
, EXd
, EXxEVexS
}, PREFIX_OPCODE
},
3699 { "vucomisX", { XMScalar
, EXq
, EXxEVexS
}, PREFIX_OPCODE
},
3702 /* PREFIX_VEX_0F2F */
3704 { "vcomisX", { XMScalar
, EXd
, EXxEVexS
}, PREFIX_OPCODE
},
3706 { "vcomisX", { XMScalar
, EXq
, EXxEVexS
}, PREFIX_OPCODE
},
3709 /* PREFIX_VEX_0F41_L_1_M_1_W_0 */
3711 { "kandw", { MaskG
, MaskVex
, MaskE
}, 0 },
3713 { "kandb", { MaskG
, MaskVex
, MaskE
}, 0 },
3716 /* PREFIX_VEX_0F41_L_1_M_1_W_1 */
3718 { "kandq", { MaskG
, MaskVex
, MaskE
}, 0 },
3720 { "kandd", { MaskG
, MaskVex
, MaskE
}, 0 },
3723 /* PREFIX_VEX_0F42_L_1_M_1_W_0 */
3725 { "kandnw", { MaskG
, MaskVex
, MaskE
}, 0 },
3727 { "kandnb", { MaskG
, MaskVex
, MaskE
}, 0 },
3730 /* PREFIX_VEX_0F42_L_1_M_1_W_1 */
3732 { "kandnq", { MaskG
, MaskVex
, MaskE
}, 0 },
3734 { "kandnd", { MaskG
, MaskVex
, MaskE
}, 0 },
3737 /* PREFIX_VEX_0F44_L_0_M_1_W_0 */
3739 { "knotw", { MaskG
, MaskE
}, 0 },
3741 { "knotb", { MaskG
, MaskE
}, 0 },
3744 /* PREFIX_VEX_0F44_L_0_M_1_W_1 */
3746 { "knotq", { MaskG
, MaskE
}, 0 },
3748 { "knotd", { MaskG
, MaskE
}, 0 },
3751 /* PREFIX_VEX_0F45_L_1_M_1_W_0 */
3753 { "korw", { MaskG
, MaskVex
, MaskE
}, 0 },
3755 { "korb", { MaskG
, MaskVex
, MaskE
}, 0 },
3758 /* PREFIX_VEX_0F45_L_1_M_1_W_1 */
3760 { "korq", { MaskG
, MaskVex
, MaskE
}, 0 },
3762 { "kord", { MaskG
, MaskVex
, MaskE
}, 0 },
3765 /* PREFIX_VEX_0F46_L_1_M_1_W_0 */
3767 { "kxnorw", { MaskG
, MaskVex
, MaskE
}, 0 },
3769 { "kxnorb", { MaskG
, MaskVex
, MaskE
}, 0 },
3772 /* PREFIX_VEX_0F46_L_1_M_1_W_1 */
3774 { "kxnorq", { MaskG
, MaskVex
, MaskE
}, 0 },
3776 { "kxnord", { MaskG
, MaskVex
, MaskE
}, 0 },
3779 /* PREFIX_VEX_0F47_L_1_M_1_W_0 */
3781 { "kxorw", { MaskG
, MaskVex
, MaskE
}, 0 },
3783 { "kxorb", { MaskG
, MaskVex
, MaskE
}, 0 },
3786 /* PREFIX_VEX_0F47_L_1_M_1_W_1 */
3788 { "kxorq", { MaskG
, MaskVex
, MaskE
}, 0 },
3790 { "kxord", { MaskG
, MaskVex
, MaskE
}, 0 },
3793 /* PREFIX_VEX_0F4A_L_1_M_1_W_0 */
3795 { "kaddw", { MaskG
, MaskVex
, MaskE
}, 0 },
3797 { "kaddb", { MaskG
, MaskVex
, MaskE
}, 0 },
3800 /* PREFIX_VEX_0F4A_L_1_M_1_W_1 */
3802 { "kaddq", { MaskG
, MaskVex
, MaskE
}, 0 },
3804 { "kaddd", { MaskG
, MaskVex
, MaskE
}, 0 },
3807 /* PREFIX_VEX_0F4B_L_1_M_1_W_0 */
3809 { "kunpckwd", { MaskG
, MaskVex
, MaskE
}, 0 },
3811 { "kunpckbw", { MaskG
, MaskVex
, MaskE
}, 0 },
3814 /* PREFIX_VEX_0F4B_L_1_M_1_W_1 */
3816 { "kunpckdq", { MaskG
, MaskVex
, MaskE
}, 0 },
3819 /* PREFIX_VEX_0F51 */
3821 { "vsqrtpX", { XM
, EXx
, EXxEVexR
}, PREFIX_OPCODE
},
3822 { "vsqrts%XS", { XMScalar
, VexScalar
, EXd
, EXxEVexR
}, 0 },
3823 { "vsqrtpX", { XM
, EXx
, EXxEVexR
}, PREFIX_OPCODE
},
3824 { "vsqrts%XD", { XMScalar
, VexScalar
, EXq
, EXxEVexR
}, 0 },
3827 /* PREFIX_VEX_0F52 */
3829 { "vrsqrtps", { XM
, EXx
}, 0 },
3830 { "vrsqrtss", { XMScalar
, VexScalar
, EXd
}, 0 },
3833 /* PREFIX_VEX_0F53 */
3835 { "vrcpps", { XM
, EXx
}, 0 },
3836 { "vrcpss", { XMScalar
, VexScalar
, EXd
}, 0 },
3839 /* PREFIX_VEX_0F58 */
3841 { "vaddpX", { XM
, Vex
, EXx
, EXxEVexR
}, PREFIX_OPCODE
},
3842 { "vadds%XS", { XMScalar
, VexScalar
, EXd
, EXxEVexR
}, 0 },
3843 { "vaddpX", { XM
, Vex
, EXx
, EXxEVexR
}, PREFIX_OPCODE
},
3844 { "vadds%XD", { XMScalar
, VexScalar
, EXq
, EXxEVexR
}, 0 },
3847 /* PREFIX_VEX_0F59 */
3849 { "vmulpX", { XM
, Vex
, EXx
, EXxEVexR
}, PREFIX_OPCODE
},
3850 { "vmuls%XS", { XMScalar
, VexScalar
, EXd
, EXxEVexR
}, 0 },
3851 { "vmulpX", { XM
, Vex
, EXx
, EXxEVexR
}, PREFIX_OPCODE
},
3852 { "vmuls%XD", { XMScalar
, VexScalar
, EXq
, EXxEVexR
}, 0 },
3855 /* PREFIX_VEX_0F5A */
3857 { "vcvtp%XS2pd", { XM
, EXEvexHalfBcstXmmq
, EXxEVexS
}, 0 },
3858 { "vcvts%XS2sd", { XMScalar
, VexScalar
, EXd
, EXxEVexS
}, 0 },
3859 { "vcvtp%XD2ps%XY", { XMxmmq
, EXx
, EXxEVexR
}, 0 },
3860 { "vcvts%XD2ss", { XMScalar
, VexScalar
, EXq
, EXxEVexR
}, 0 },
3863 /* PREFIX_VEX_0F5B */
3865 { "vcvtdq2ps", { XM
, EXx
}, 0 },
3866 { "vcvttps2dq", { XM
, EXx
}, 0 },
3867 { "vcvtps2dq", { XM
, EXx
}, 0 },
3870 /* PREFIX_VEX_0F5C */
3872 { "vsubpX", { XM
, Vex
, EXx
, EXxEVexR
}, PREFIX_OPCODE
},
3873 { "vsubs%XS", { XMScalar
, VexScalar
, EXd
, EXxEVexR
}, 0 },
3874 { "vsubpX", { XM
, Vex
, EXx
, EXxEVexR
}, PREFIX_OPCODE
},
3875 { "vsubs%XD", { XMScalar
, VexScalar
, EXq
, EXxEVexR
}, 0 },
3878 /* PREFIX_VEX_0F5D */
3880 { "vminpX", { XM
, Vex
, EXx
, EXxEVexS
}, PREFIX_OPCODE
},
3881 { "vmins%XS", { XMScalar
, VexScalar
, EXd
, EXxEVexS
}, 0 },
3882 { "vminpX", { XM
, Vex
, EXx
, EXxEVexS
}, PREFIX_OPCODE
},
3883 { "vmins%XD", { XMScalar
, VexScalar
, EXq
, EXxEVexS
}, 0 },
3886 /* PREFIX_VEX_0F5E */
3888 { "vdivpX", { XM
, Vex
, EXx
, EXxEVexR
}, PREFIX_OPCODE
},
3889 { "vdivs%XS", { XMScalar
, VexScalar
, EXd
, EXxEVexR
}, 0 },
3890 { "vdivpX", { XM
, Vex
, EXx
, EXxEVexR
}, PREFIX_OPCODE
},
3891 { "vdivs%XD", { XMScalar
, VexScalar
, EXq
, EXxEVexR
}, 0 },
3894 /* PREFIX_VEX_0F5F */
3896 { "vmaxpX", { XM
, Vex
, EXx
, EXxEVexS
}, PREFIX_OPCODE
},
3897 { "vmaxs%XS", { XMScalar
, VexScalar
, EXd
, EXxEVexS
}, 0 },
3898 { "vmaxpX", { XM
, Vex
, EXx
, EXxEVexS
}, PREFIX_OPCODE
},
3899 { "vmaxs%XD", { XMScalar
, VexScalar
, EXq
, EXxEVexS
}, 0 },
3902 /* PREFIX_VEX_0F6F */
3905 { "vmovdqu", { XM
, EXx
}, 0 },
3906 { "vmovdqa", { XM
, EXx
}, 0 },
3909 /* PREFIX_VEX_0F70 */
3912 { "vpshufhw", { XM
, EXx
, Ib
}, 0 },
3913 { "vpshufd", { XM
, EXx
, Ib
}, 0 },
3914 { "vpshuflw", { XM
, EXx
, Ib
}, 0 },
3917 /* PREFIX_VEX_0F7C */
3921 { "vhaddpd", { XM
, Vex
, EXx
}, 0 },
3922 { "vhaddps", { XM
, Vex
, EXx
}, 0 },
3925 /* PREFIX_VEX_0F7D */
3929 { "vhsubpd", { XM
, Vex
, EXx
}, 0 },
3930 { "vhsubps", { XM
, Vex
, EXx
}, 0 },
3933 /* PREFIX_VEX_0F7E */
3936 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_1
) },
3937 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_2
) },
3940 /* PREFIX_VEX_0F7F */
3943 { "vmovdqu", { EXxS
, XM
}, 0 },
3944 { "vmovdqa", { EXxS
, XM
}, 0 },
3947 /* PREFIX_VEX_0F90_L_0_W_0 */
3949 { "kmovw", { MaskG
, MaskE
}, 0 },
3951 { "kmovb", { MaskG
, MaskBDE
}, 0 },
3954 /* PREFIX_VEX_0F90_L_0_W_1 */
3956 { "kmovq", { MaskG
, MaskE
}, 0 },
3958 { "kmovd", { MaskG
, MaskBDE
}, 0 },
3961 /* PREFIX_VEX_0F91_L_0_M_0_W_0 */
3963 { "kmovw", { Ew
, MaskG
}, 0 },
3965 { "kmovb", { Eb
, MaskG
}, 0 },
3968 /* PREFIX_VEX_0F91_L_0_M_0_W_1 */
3970 { "kmovq", { Eq
, MaskG
}, 0 },
3972 { "kmovd", { Ed
, MaskG
}, 0 },
3975 /* PREFIX_VEX_0F92_L_0_M_1_W_0 */
3977 { "kmovw", { MaskG
, Edq
}, 0 },
3979 { "kmovb", { MaskG
, Edq
}, 0 },
3980 { "kmovd", { MaskG
, Edq
}, 0 },
3983 /* PREFIX_VEX_0F92_L_0_M_1_W_1 */
3988 { "kmovK", { MaskG
, Edq
}, 0 },
3991 /* PREFIX_VEX_0F93_L_0_M_1_W_0 */
3993 { "kmovw", { Gdq
, MaskE
}, 0 },
3995 { "kmovb", { Gdq
, MaskE
}, 0 },
3996 { "kmovd", { Gdq
, MaskE
}, 0 },
3999 /* PREFIX_VEX_0F93_L_0_M_1_W_1 */
4004 { "kmovK", { Gdq
, MaskE
}, 0 },
4007 /* PREFIX_VEX_0F98_L_0_M_1_W_0 */
4009 { "kortestw", { MaskG
, MaskE
}, 0 },
4011 { "kortestb", { MaskG
, MaskE
}, 0 },
4014 /* PREFIX_VEX_0F98_L_0_M_1_W_1 */
4016 { "kortestq", { MaskG
, MaskE
}, 0 },
4018 { "kortestd", { MaskG
, MaskE
}, 0 },
4021 /* PREFIX_VEX_0F99_L_0_M_1_W_0 */
4023 { "ktestw", { MaskG
, MaskE
}, 0 },
4025 { "ktestb", { MaskG
, MaskE
}, 0 },
4028 /* PREFIX_VEX_0F99_L_0_M_1_W_1 */
4030 { "ktestq", { MaskG
, MaskE
}, 0 },
4032 { "ktestd", { MaskG
, MaskE
}, 0 },
4035 /* PREFIX_VEX_0FC2 */
4037 { "vcmpps", { XM
, Vex
, EXx
, CMP
}, 0 },
4038 { "vcmpss", { XMScalar
, VexScalar
, EXd
, CMP
}, 0 },
4039 { "vcmppd", { XM
, Vex
, EXx
, CMP
}, 0 },
4040 { "vcmpsd", { XMScalar
, VexScalar
, EXq
, CMP
}, 0 },
4043 /* PREFIX_VEX_0FD0 */
4047 { "vaddsubpd", { XM
, Vex
, EXx
}, 0 },
4048 { "vaddsubps", { XM
, Vex
, EXx
}, 0 },
4051 /* PREFIX_VEX_0FE6 */
4054 { "vcvtdq2pd", { XM
, EXxmmq
}, 0 },
4055 { "vcvttpd2dq%XY", { XMM
, EXx
}, 0 },
4056 { "vcvtpd2dq%XY", { XMM
, EXx
}, 0 },
4059 /* PREFIX_VEX_0FF0 */
4064 { MOD_TABLE (MOD_VEX_0FF0_PREFIX_3
) },
4067 /* PREFIX_VEX_0F3849_X86_64 */
4069 { VEX_W_TABLE (VEX_W_0F3849_X86_64_P_0
) },
4071 { VEX_W_TABLE (VEX_W_0F3849_X86_64_P_2
) },
4072 { VEX_W_TABLE (VEX_W_0F3849_X86_64_P_3
) },
4075 /* PREFIX_VEX_0F384B_X86_64 */
4078 { VEX_W_TABLE (VEX_W_0F384B_X86_64_P_1
) },
4079 { VEX_W_TABLE (VEX_W_0F384B_X86_64_P_2
) },
4080 { VEX_W_TABLE (VEX_W_0F384B_X86_64_P_3
) },
4083 /* PREFIX_VEX_0F385C_X86_64 */
4086 { VEX_W_TABLE (VEX_W_0F385C_X86_64_P_1
) },
4090 /* PREFIX_VEX_0F385E_X86_64 */
4092 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_0
) },
4093 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_1
) },
4094 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_2
) },
4095 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_3
) },
4098 /* PREFIX_VEX_0F38F5_L_0 */
4100 { "bzhiS", { Gdq
, Edq
, VexGdq
}, 0 },
4101 { "pextS", { Gdq
, VexGdq
, Edq
}, 0 },
4103 { "pdepS", { Gdq
, VexGdq
, Edq
}, 0 },
4106 /* PREFIX_VEX_0F38F6_L_0 */
4111 { "mulxS", { Gdq
, VexGdq
, Edq
}, 0 },
4114 /* PREFIX_VEX_0F38F7_L_0 */
4116 { "bextrS", { Gdq
, Edq
, VexGdq
}, 0 },
4117 { "sarxS", { Gdq
, Edq
, VexGdq
}, 0 },
4118 { "shlxS", { Gdq
, Edq
, VexGdq
}, 0 },
4119 { "shrxS", { Gdq
, Edq
, VexGdq
}, 0 },
4122 /* PREFIX_VEX_0F3AF0_L_0 */
4127 { "rorxS", { Gdq
, Edq
, Ib
}, 0 },
4130 #include "i386-dis-evex-prefix.h"
4133 static const struct dis386 x86_64_table
[][2] = {
4136 { "pushP", { es
}, 0 },
4141 { "popP", { es
}, 0 },
4146 { "pushP", { cs
}, 0 },
4151 { "pushP", { ss
}, 0 },
4156 { "popP", { ss
}, 0 },
4161 { "pushP", { ds
}, 0 },
4166 { "popP", { ds
}, 0 },
4171 { "daa", { XX
}, 0 },
4176 { "das", { XX
}, 0 },
4181 { "aaa", { XX
}, 0 },
4186 { "aas", { XX
}, 0 },
4191 { "pushaP", { XX
}, 0 },
4196 { "popaP", { XX
}, 0 },
4201 { MOD_TABLE (MOD_62_32BIT
) },
4202 { EVEX_TABLE (EVEX_0F
) },
4207 { "arpl", { Ew
, Gw
}, 0 },
4208 { "movs", { Gv
, { MOVSXD_Fixup
, movsxd_mode
} }, 0 },
4213 { "ins{R|}", { Yzr
, indirDX
}, 0 },
4214 { "ins{G|}", { Yzr
, indirDX
}, 0 },
4219 { "outs{R|}", { indirDXr
, Xz
}, 0 },
4220 { "outs{G|}", { indirDXr
, Xz
}, 0 },
4225 /* Opcode 0x82 is an alias of opcode 0x80 in 32-bit mode. */
4226 { REG_TABLE (REG_80
) },
4231 { "{l|}call{P|}", { Ap
}, 0 },
4236 { "retP", { Iw
, BND
}, 0 },
4237 { "ret@", { Iw
, BND
}, 0 },
4242 { "retP", { BND
}, 0 },
4243 { "ret@", { BND
}, 0 },
4248 { MOD_TABLE (MOD_C4_32BIT
) },
4249 { VEX_C4_TABLE (VEX_0F
) },
4254 { MOD_TABLE (MOD_C5_32BIT
) },
4255 { VEX_C5_TABLE (VEX_0F
) },
4260 { "into", { XX
}, 0 },
4265 { "aam", { Ib
}, 0 },
4270 { "aad", { Ib
}, 0 },
4275 { "callP", { Jv
, BND
}, 0 },
4276 { "call@", { Jv
, BND
}, 0 }
4281 { "jmpP", { Jv
, BND
}, 0 },
4282 { "jmp@", { Jv
, BND
}, 0 }
4287 { "{l|}jmp{P|}", { Ap
}, 0 },
4290 /* X86_64_0F01_REG_0 */
4292 { "sgdt{Q|Q}", { M
}, 0 },
4293 { "sgdt", { M
}, 0 },
4296 /* X86_64_0F01_REG_1 */
4298 { "sidt{Q|Q}", { M
}, 0 },
4299 { "sidt", { M
}, 0 },
4302 /* X86_64_0F01_REG_1_RM_5_PREFIX_2 */
4305 { "seamret", { Skip_MODRM
}, 0 },
4308 /* X86_64_0F01_REG_1_RM_6_PREFIX_2 */
4311 { "seamops", { Skip_MODRM
}, 0 },
4314 /* X86_64_0F01_REG_1_RM_7_PREFIX_2 */
4317 { "seamcall", { Skip_MODRM
}, 0 },
4320 /* X86_64_0F01_REG_2 */
4322 { "lgdt{Q|Q}", { M
}, 0 },
4323 { "lgdt", { M
}, 0 },
4326 /* X86_64_0F01_REG_3 */
4328 { "lidt{Q|Q}", { M
}, 0 },
4329 { "lidt", { M
}, 0 },
4332 /* X86_64_0F01_REG_5_MOD_3_RM_4_PREFIX_1 */
4335 { "uiret", { Skip_MODRM
}, 0 },
4338 /* X86_64_0F01_REG_5_MOD_3_RM_5_PREFIX_1 */
4341 { "testui", { Skip_MODRM
}, 0 },
4344 /* X86_64_0F01_REG_5_MOD_3_RM_6_PREFIX_1 */
4347 { "clui", { Skip_MODRM
}, 0 },
4350 /* X86_64_0F01_REG_5_MOD_3_RM_7_PREFIX_1 */
4353 { "stui", { Skip_MODRM
}, 0 },
4356 /* X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_1 */
4359 { "rmpadjust", { Skip_MODRM
}, 0 },
4362 /* X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3 */
4365 { "rmpupdate", { Skip_MODRM
}, 0 },
4368 /* X86_64_0F01_REG_7_MOD_3_RM_7_PREFIX_1 */
4371 { "psmash", { Skip_MODRM
}, 0 },
4376 { "movZ", { Em
, Td
}, 0 },
4381 { "movZ", { Td
, Em
}, 0 },
4384 /* X86_64_0FC7_REG_6_MOD_3_PREFIX_1 */
4387 { "senduipi", { Eq
}, 0 },
4390 /* X86_64_VEX_0F3849 */
4393 { PREFIX_TABLE (PREFIX_VEX_0F3849_X86_64
) },
4396 /* X86_64_VEX_0F384B */
4399 { PREFIX_TABLE (PREFIX_VEX_0F384B_X86_64
) },
4402 /* X86_64_VEX_0F385C */
4405 { PREFIX_TABLE (PREFIX_VEX_0F385C_X86_64
) },
4408 /* X86_64_VEX_0F385E */
4411 { PREFIX_TABLE (PREFIX_VEX_0F385E_X86_64
) },
4415 static const struct dis386 three_byte_table
[][256] = {
4417 /* THREE_BYTE_0F38 */
4420 { "pshufb", { MX
, EM
}, PREFIX_OPCODE
},
4421 { "phaddw", { MX
, EM
}, PREFIX_OPCODE
},
4422 { "phaddd", { MX
, EM
}, PREFIX_OPCODE
},
4423 { "phaddsw", { MX
, EM
}, PREFIX_OPCODE
},
4424 { "pmaddubsw", { MX
, EM
}, PREFIX_OPCODE
},
4425 { "phsubw", { MX
, EM
}, PREFIX_OPCODE
},
4426 { "phsubd", { MX
, EM
}, PREFIX_OPCODE
},
4427 { "phsubsw", { MX
, EM
}, PREFIX_OPCODE
},
4429 { "psignb", { MX
, EM
}, PREFIX_OPCODE
},
4430 { "psignw", { MX
, EM
}, PREFIX_OPCODE
},
4431 { "psignd", { MX
, EM
}, PREFIX_OPCODE
},
4432 { "pmulhrsw", { MX
, EM
}, PREFIX_OPCODE
},
4438 { "pblendvb", { XM
, EXx
, XMM0
}, PREFIX_DATA
},
4442 { "blendvps", { XM
, EXx
, XMM0
}, PREFIX_DATA
},
4443 { "blendvpd", { XM
, EXx
, XMM0
}, PREFIX_DATA
},
4445 { "ptest", { XM
, EXx
}, PREFIX_DATA
},
4451 { "pabsb", { MX
, EM
}, PREFIX_OPCODE
},
4452 { "pabsw", { MX
, EM
}, PREFIX_OPCODE
},
4453 { "pabsd", { MX
, EM
}, PREFIX_OPCODE
},
4456 { "pmovsxbw", { XM
, EXq
}, PREFIX_DATA
},
4457 { "pmovsxbd", { XM
, EXd
}, PREFIX_DATA
},
4458 { "pmovsxbq", { XM
, EXw
}, PREFIX_DATA
},
4459 { "pmovsxwd", { XM
, EXq
}, PREFIX_DATA
},
4460 { "pmovsxwq", { XM
, EXd
}, PREFIX_DATA
},
4461 { "pmovsxdq", { XM
, EXq
}, PREFIX_DATA
},
4465 { "pmuldq", { XM
, EXx
}, PREFIX_DATA
},
4466 { "pcmpeqq", { XM
, EXx
}, PREFIX_DATA
},
4467 { MOD_TABLE (MOD_0F382A
) },
4468 { "packusdw", { XM
, EXx
}, PREFIX_DATA
},
4474 { "pmovzxbw", { XM
, EXq
}, PREFIX_DATA
},
4475 { "pmovzxbd", { XM
, EXd
}, PREFIX_DATA
},
4476 { "pmovzxbq", { XM
, EXw
}, PREFIX_DATA
},
4477 { "pmovzxwd", { XM
, EXq
}, PREFIX_DATA
},
4478 { "pmovzxwq", { XM
, EXd
}, PREFIX_DATA
},
4479 { "pmovzxdq", { XM
, EXq
}, PREFIX_DATA
},
4481 { "pcmpgtq", { XM
, EXx
}, PREFIX_DATA
},
4483 { "pminsb", { XM
, EXx
}, PREFIX_DATA
},
4484 { "pminsd", { XM
, EXx
}, PREFIX_DATA
},
4485 { "pminuw", { XM
, EXx
}, PREFIX_DATA
},
4486 { "pminud", { XM
, EXx
}, PREFIX_DATA
},
4487 { "pmaxsb", { XM
, EXx
}, PREFIX_DATA
},
4488 { "pmaxsd", { XM
, EXx
}, PREFIX_DATA
},
4489 { "pmaxuw", { XM
, EXx
}, PREFIX_DATA
},
4490 { "pmaxud", { XM
, EXx
}, PREFIX_DATA
},
4492 { "pmulld", { XM
, EXx
}, PREFIX_DATA
},
4493 { "phminposuw", { XM
, EXx
}, PREFIX_DATA
},
4564 { "invept", { Gm
, Mo
}, PREFIX_DATA
},
4565 { "invvpid", { Gm
, Mo
}, PREFIX_DATA
},
4566 { "invpcid", { Gm
, M
}, PREFIX_DATA
},
4645 { "sha1nexte", { XM
, EXxmm
}, PREFIX_OPCODE
},
4646 { "sha1msg1", { XM
, EXxmm
}, PREFIX_OPCODE
},
4647 { "sha1msg2", { XM
, EXxmm
}, PREFIX_OPCODE
},
4648 { "sha256rnds2", { XM
, EXxmm
, XMM0
}, PREFIX_OPCODE
},
4649 { "sha256msg1", { XM
, EXxmm
}, PREFIX_OPCODE
},
4650 { "sha256msg2", { XM
, EXxmm
}, PREFIX_OPCODE
},
4652 { "gf2p8mulb", { XM
, EXxmm
}, PREFIX_DATA
},
4663 { PREFIX_TABLE (PREFIX_0F38D8
) },
4666 { "aesimc", { XM
, EXx
}, PREFIX_DATA
},
4667 { PREFIX_TABLE (PREFIX_0F38DC
) },
4668 { PREFIX_TABLE (PREFIX_0F38DD
) },
4669 { PREFIX_TABLE (PREFIX_0F38DE
) },
4670 { PREFIX_TABLE (PREFIX_0F38DF
) },
4690 { PREFIX_TABLE (PREFIX_0F38F0
) },
4691 { PREFIX_TABLE (PREFIX_0F38F1
) },
4695 { MOD_TABLE (MOD_0F38F5
) },
4696 { PREFIX_TABLE (PREFIX_0F38F6
) },
4699 { PREFIX_TABLE (PREFIX_0F38F8
) },
4700 { MOD_TABLE (MOD_0F38F9
) },
4701 { PREFIX_TABLE (PREFIX_0F38FA
) },
4702 { PREFIX_TABLE (PREFIX_0F38FB
) },
4708 /* THREE_BYTE_0F3A */
4720 { "roundps", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4721 { "roundpd", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4722 { "roundss", { XM
, EXd
, Ib
}, PREFIX_DATA
},
4723 { "roundsd", { XM
, EXq
, Ib
}, PREFIX_DATA
},
4724 { "blendps", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4725 { "blendpd", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4726 { "pblendw", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4727 { "palignr", { MX
, EM
, Ib
}, PREFIX_OPCODE
},
4733 { "pextrb", { Edb
, XM
, Ib
}, PREFIX_DATA
},
4734 { "pextrw", { Edw
, XM
, Ib
}, PREFIX_DATA
},
4735 { "pextrK", { Edq
, XM
, Ib
}, PREFIX_DATA
},
4736 { "extractps", { Ed
, XM
, Ib
}, PREFIX_DATA
},
4747 { "pinsrb", { XM
, Edb
, Ib
}, PREFIX_DATA
},
4748 { "insertps", { XM
, EXd
, Ib
}, PREFIX_DATA
},
4749 { "pinsrK", { XM
, Edq
, Ib
}, PREFIX_DATA
},
4783 { "dpps", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4784 { "dppd", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4785 { "mpsadbw", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4787 { "pclmulqdq", { XM
, EXx
, PCLMUL
}, PREFIX_DATA
},
4819 { "pcmpestrm!%LQ", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4820 { "pcmpestri!%LQ", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4821 { "pcmpistrm", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4822 { "pcmpistri", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4940 { "sha1rnds4", { XM
, EXxmm
, Ib
}, PREFIX_OPCODE
},
4942 { "gf2p8affineqb", { XM
, EXxmm
, Ib
}, PREFIX_DATA
},
4943 { "gf2p8affineinvqb", { XM
, EXxmm
, Ib
}, PREFIX_DATA
},
4961 { "aeskeygenassist", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4981 { PREFIX_TABLE (PREFIX_0F3A0F
) },
5001 static const struct dis386 xop_table
[][256] = {
5154 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_85
) },
5155 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_86
) },
5156 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_87
) },
5164 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_8E
) },
5165 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_8F
) },
5172 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_95
) },
5173 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_96
) },
5174 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_97
) },
5182 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_9E
) },
5183 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_9F
) },
5187 { "vpcmov", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
5188 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_A3
) },
5191 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_A6
) },
5209 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_B6
) },
5221 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C0
) },
5222 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C1
) },
5223 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C2
) },
5224 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C3
) },
5234 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CC
) },
5235 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CD
) },
5236 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CE
) },
5237 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CF
) },
5270 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EC
) },
5271 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_ED
) },
5272 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EE
) },
5273 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EF
) },
5297 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_01
) },
5298 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_02
) },
5316 { MOD_TABLE (MOD_XOP_09_12
) },
5440 { VEX_W_TABLE (VEX_W_0FXOP_09_80
) },
5441 { VEX_W_TABLE (VEX_W_0FXOP_09_81
) },
5442 { VEX_W_TABLE (VEX_W_0FXOP_09_82
) },
5443 { VEX_W_TABLE (VEX_W_0FXOP_09_83
) },
5458 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_90
) },
5459 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_91
) },
5460 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_92
) },
5461 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_93
) },
5462 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_94
) },
5463 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_95
) },
5464 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_96
) },
5465 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_97
) },
5467 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_98
) },
5468 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_99
) },
5469 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_9A
) },
5470 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_9B
) },
5513 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C1
) },
5514 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C2
) },
5515 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C3
) },
5518 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C6
) },
5519 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C7
) },
5524 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_CB
) },
5531 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D1
) },
5532 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D2
) },
5533 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D3
) },
5536 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D6
) },
5537 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D7
) },
5542 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_DB
) },
5549 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_E1
) },
5550 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_E2
) },
5551 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_E3
) },
5605 { "bextrS", { Gdq
, Edq
, Id
}, 0 },
5607 { VEX_LEN_TABLE (VEX_LEN_0FXOP_0A_12
) },
5877 static const struct dis386 vex_table
[][256] = {
5899 { PREFIX_TABLE (PREFIX_VEX_0F10
) },
5900 { PREFIX_TABLE (PREFIX_VEX_0F11
) },
5901 { PREFIX_TABLE (PREFIX_VEX_0F12
) },
5902 { MOD_TABLE (MOD_VEX_0F13
) },
5903 { "vunpcklpX", { XM
, Vex
, EXx
}, PREFIX_OPCODE
},
5904 { "vunpckhpX", { XM
, Vex
, EXx
}, PREFIX_OPCODE
},
5905 { PREFIX_TABLE (PREFIX_VEX_0F16
) },
5906 { MOD_TABLE (MOD_VEX_0F17
) },
5926 { "vmovapX", { XM
, EXx
}, PREFIX_OPCODE
},
5927 { "vmovapX", { EXxS
, XM
}, PREFIX_OPCODE
},
5928 { PREFIX_TABLE (PREFIX_VEX_0F2A
) },
5929 { MOD_TABLE (MOD_VEX_0F2B
) },
5930 { PREFIX_TABLE (PREFIX_VEX_0F2C
) },
5931 { PREFIX_TABLE (PREFIX_VEX_0F2D
) },
5932 { PREFIX_TABLE (PREFIX_VEX_0F2E
) },
5933 { PREFIX_TABLE (PREFIX_VEX_0F2F
) },
5954 { VEX_LEN_TABLE (VEX_LEN_0F41
) },
5955 { VEX_LEN_TABLE (VEX_LEN_0F42
) },
5957 { VEX_LEN_TABLE (VEX_LEN_0F44
) },
5958 { VEX_LEN_TABLE (VEX_LEN_0F45
) },
5959 { VEX_LEN_TABLE (VEX_LEN_0F46
) },
5960 { VEX_LEN_TABLE (VEX_LEN_0F47
) },
5964 { VEX_LEN_TABLE (VEX_LEN_0F4A
) },
5965 { VEX_LEN_TABLE (VEX_LEN_0F4B
) },
5971 { MOD_TABLE (MOD_VEX_0F50
) },
5972 { PREFIX_TABLE (PREFIX_VEX_0F51
) },
5973 { PREFIX_TABLE (PREFIX_VEX_0F52
) },
5974 { PREFIX_TABLE (PREFIX_VEX_0F53
) },
5975 { "vandpX", { XM
, Vex
, EXx
}, PREFIX_OPCODE
},
5976 { "vandnpX", { XM
, Vex
, EXx
}, PREFIX_OPCODE
},
5977 { "vorpX", { XM
, Vex
, EXx
}, PREFIX_OPCODE
},
5978 { "vxorpX", { XM
, Vex
, EXx
}, PREFIX_OPCODE
},
5980 { PREFIX_TABLE (PREFIX_VEX_0F58
) },
5981 { PREFIX_TABLE (PREFIX_VEX_0F59
) },
5982 { PREFIX_TABLE (PREFIX_VEX_0F5A
) },
5983 { PREFIX_TABLE (PREFIX_VEX_0F5B
) },
5984 { PREFIX_TABLE (PREFIX_VEX_0F5C
) },
5985 { PREFIX_TABLE (PREFIX_VEX_0F5D
) },
5986 { PREFIX_TABLE (PREFIX_VEX_0F5E
) },
5987 { PREFIX_TABLE (PREFIX_VEX_0F5F
) },
5989 { "vpunpcklbw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5990 { "vpunpcklwd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5991 { "vpunpckldq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5992 { "vpacksswb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5993 { "vpcmpgtb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5994 { "vpcmpgtw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5995 { "vpcmpgtd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5996 { "vpackuswb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5998 { "vpunpckhbw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5999 { "vpunpckhwd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6000 { "vpunpckhdq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6001 { "vpackssdw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6002 { "vpunpcklqdq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6003 { "vpunpckhqdq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6004 { VEX_LEN_TABLE (VEX_LEN_0F6E
) },
6005 { PREFIX_TABLE (PREFIX_VEX_0F6F
) },
6007 { PREFIX_TABLE (PREFIX_VEX_0F70
) },
6008 { MOD_TABLE (MOD_VEX_0F71
) },
6009 { MOD_TABLE (MOD_VEX_0F72
) },
6010 { MOD_TABLE (MOD_VEX_0F73
) },
6011 { "vpcmpeqb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6012 { "vpcmpeqw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6013 { "vpcmpeqd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6014 { VEX_LEN_TABLE (VEX_LEN_0F77
) },
6020 { PREFIX_TABLE (PREFIX_VEX_0F7C
) },
6021 { PREFIX_TABLE (PREFIX_VEX_0F7D
) },
6022 { PREFIX_TABLE (PREFIX_VEX_0F7E
) },
6023 { PREFIX_TABLE (PREFIX_VEX_0F7F
) },
6043 { VEX_LEN_TABLE (VEX_LEN_0F90
) },
6044 { VEX_LEN_TABLE (VEX_LEN_0F91
) },
6045 { VEX_LEN_TABLE (VEX_LEN_0F92
) },
6046 { VEX_LEN_TABLE (VEX_LEN_0F93
) },
6052 { VEX_LEN_TABLE (VEX_LEN_0F98
) },
6053 { VEX_LEN_TABLE (VEX_LEN_0F99
) },
6076 { REG_TABLE (REG_VEX_0FAE
) },
6099 { PREFIX_TABLE (PREFIX_VEX_0FC2
) },
6101 { VEX_LEN_TABLE (VEX_LEN_0FC4
) },
6102 { VEX_LEN_TABLE (VEX_LEN_0FC5
) },
6103 { "vshufpX", { XM
, Vex
, EXx
, Ib
}, PREFIX_OPCODE
},
6115 { PREFIX_TABLE (PREFIX_VEX_0FD0
) },
6116 { "vpsrlw", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
6117 { "vpsrld", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
6118 { "vpsrlq", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
6119 { "vpaddq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6120 { "vpmullw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6121 { VEX_LEN_TABLE (VEX_LEN_0FD6
) },
6122 { MOD_TABLE (MOD_VEX_0FD7
) },
6124 { "vpsubusb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6125 { "vpsubusw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6126 { "vpminub", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6127 { "vpand", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6128 { "vpaddusb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6129 { "vpaddusw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6130 { "vpmaxub", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6131 { "vpandn", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6133 { "vpavgb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6134 { "vpsraw", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
6135 { "vpsrad", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
6136 { "vpavgw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6137 { "vpmulhuw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6138 { "vpmulhw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6139 { PREFIX_TABLE (PREFIX_VEX_0FE6
) },
6140 { MOD_TABLE (MOD_VEX_0FE7
) },
6142 { "vpsubsb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6143 { "vpsubsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6144 { "vpminsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6145 { "vpor", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6146 { "vpaddsb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6147 { "vpaddsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6148 { "vpmaxsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6149 { "vpxor", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6151 { PREFIX_TABLE (PREFIX_VEX_0FF0
) },
6152 { "vpsllw", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
6153 { "vpslld", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
6154 { "vpsllq", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
6155 { "vpmuludq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6156 { "vpmaddwd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6157 { "vpsadbw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6158 { VEX_LEN_TABLE (VEX_LEN_0FF7
) },
6160 { "vpsubb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6161 { "vpsubw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6162 { "vpsubd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6163 { "vpsubq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6164 { "vpaddb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6165 { "vpaddw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6166 { "vpaddd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6172 { "vpshufb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6173 { "vphaddw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6174 { "vphaddd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6175 { "vphaddsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6176 { "vpmaddubsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6177 { "vphsubw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6178 { "vphsubd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6179 { "vphsubsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6181 { "vpsignb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6182 { "vpsignw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6183 { "vpsignd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6184 { "vpmulhrsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6185 { VEX_W_TABLE (VEX_W_0F380C
) },
6186 { VEX_W_TABLE (VEX_W_0F380D
) },
6187 { VEX_W_TABLE (VEX_W_0F380E
) },
6188 { VEX_W_TABLE (VEX_W_0F380F
) },
6193 { VEX_W_TABLE (VEX_W_0F3813
) },
6196 { VEX_LEN_TABLE (VEX_LEN_0F3816
) },
6197 { "vptest", { XM
, EXx
}, PREFIX_DATA
},
6199 { VEX_W_TABLE (VEX_W_0F3818
) },
6200 { VEX_LEN_TABLE (VEX_LEN_0F3819
) },
6201 { MOD_TABLE (MOD_VEX_0F381A
) },
6203 { "vpabsb", { XM
, EXx
}, PREFIX_DATA
},
6204 { "vpabsw", { XM
, EXx
}, PREFIX_DATA
},
6205 { "vpabsd", { XM
, EXx
}, PREFIX_DATA
},
6208 { "vpmovsxbw", { XM
, EXxmmq
}, PREFIX_DATA
},
6209 { "vpmovsxbd", { XM
, EXxmmqd
}, PREFIX_DATA
},
6210 { "vpmovsxbq", { XM
, EXxmmdw
}, PREFIX_DATA
},
6211 { "vpmovsxwd", { XM
, EXxmmq
}, PREFIX_DATA
},
6212 { "vpmovsxwq", { XM
, EXxmmqd
}, PREFIX_DATA
},
6213 { "vpmovsxdq", { XM
, EXxmmq
}, PREFIX_DATA
},
6217 { "vpmuldq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6218 { "vpcmpeqq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6219 { MOD_TABLE (MOD_VEX_0F382A
) },
6220 { "vpackusdw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6221 { MOD_TABLE (MOD_VEX_0F382C
) },
6222 { MOD_TABLE (MOD_VEX_0F382D
) },
6223 { MOD_TABLE (MOD_VEX_0F382E
) },
6224 { MOD_TABLE (MOD_VEX_0F382F
) },
6226 { "vpmovzxbw", { XM
, EXxmmq
}, PREFIX_DATA
},
6227 { "vpmovzxbd", { XM
, EXxmmqd
}, PREFIX_DATA
},
6228 { "vpmovzxbq", { XM
, EXxmmdw
}, PREFIX_DATA
},
6229 { "vpmovzxwd", { XM
, EXxmmq
}, PREFIX_DATA
},
6230 { "vpmovzxwq", { XM
, EXxmmqd
}, PREFIX_DATA
},
6231 { "vpmovzxdq", { XM
, EXxmmq
}, PREFIX_DATA
},
6232 { VEX_LEN_TABLE (VEX_LEN_0F3836
) },
6233 { "vpcmpgtq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6235 { "vpminsb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6236 { "vpminsd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6237 { "vpminuw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6238 { "vpminud", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6239 { "vpmaxsb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6240 { "vpmaxsd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6241 { "vpmaxuw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6242 { "vpmaxud", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6244 { "vpmulld", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6245 { VEX_LEN_TABLE (VEX_LEN_0F3841
) },
6249 { "vpsrlv%DQ", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6250 { VEX_W_TABLE (VEX_W_0F3846
) },
6251 { "vpsllv%DQ", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6254 { X86_64_TABLE (X86_64_VEX_0F3849
) },
6256 { X86_64_TABLE (X86_64_VEX_0F384B
) },
6262 { VEX_W_TABLE (VEX_W_0F3850
) },
6263 { VEX_W_TABLE (VEX_W_0F3851
) },
6264 { VEX_W_TABLE (VEX_W_0F3852
) },
6265 { VEX_W_TABLE (VEX_W_0F3853
) },
6271 { VEX_W_TABLE (VEX_W_0F3858
) },
6272 { VEX_W_TABLE (VEX_W_0F3859
) },
6273 { MOD_TABLE (MOD_VEX_0F385A
) },
6275 { X86_64_TABLE (X86_64_VEX_0F385C
) },
6277 { X86_64_TABLE (X86_64_VEX_0F385E
) },
6307 { VEX_W_TABLE (VEX_W_0F3878
) },
6308 { VEX_W_TABLE (VEX_W_0F3879
) },
6329 { MOD_TABLE (MOD_VEX_0F388C
) },
6331 { MOD_TABLE (MOD_VEX_0F388E
) },
6334 { "vpgatherd%DQ", { XM
, MVexVSIBDWpX
, VexGatherD
}, PREFIX_DATA
},
6335 { "vpgatherq%DQ", { XMGatherQ
, MVexVSIBQWpX
, VexGatherQ
}, PREFIX_DATA
},
6336 { "vgatherdp%XW", { XM
, MVexVSIBDWpX
, VexGatherD
}, PREFIX_DATA
},
6337 { "vgatherqp%XW", { XMGatherQ
, MVexVSIBQWpX
, VexGatherQ
}, PREFIX_DATA
},
6340 { "vfmaddsub132p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6341 { "vfmsubadd132p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6343 { "vfmadd132p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6344 { "vfmadd132s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6345 { "vfmsub132p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6346 { "vfmsub132s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6347 { "vfnmadd132p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6348 { "vfnmadd132s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6349 { "vfnmsub132p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6350 { "vfnmsub132s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6358 { "vfmaddsub213p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6359 { "vfmsubadd213p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6361 { "vfmadd213p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6362 { "vfmadd213s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6363 { "vfmsub213p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6364 { "vfmsub213s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6365 { "vfnmadd213p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6366 { "vfnmadd213s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6367 { "vfnmsub213p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6368 { "vfnmsub213s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6376 { "vfmaddsub231p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6377 { "vfmsubadd231p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6379 { "vfmadd231p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6380 { "vfmadd231s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6381 { "vfmsub231p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6382 { "vfmsub231s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6383 { "vfnmadd231p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6384 { "vfnmadd231s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6385 { "vfnmsub231p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6386 { "vfnmsub231s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6404 { VEX_W_TABLE (VEX_W_0F38CF
) },
6418 { VEX_LEN_TABLE (VEX_LEN_0F38DB
) },
6419 { "vaesenc", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6420 { "vaesenclast", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6421 { "vaesdec", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6422 { "vaesdeclast", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6444 { VEX_LEN_TABLE (VEX_LEN_0F38F2
) },
6445 { VEX_LEN_TABLE (VEX_LEN_0F38F3
) },
6447 { VEX_LEN_TABLE (VEX_LEN_0F38F5
) },
6448 { VEX_LEN_TABLE (VEX_LEN_0F38F6
) },
6449 { VEX_LEN_TABLE (VEX_LEN_0F38F7
) },
6463 { VEX_LEN_TABLE (VEX_LEN_0F3A00
) },
6464 { VEX_LEN_TABLE (VEX_LEN_0F3A01
) },
6465 { VEX_W_TABLE (VEX_W_0F3A02
) },
6467 { VEX_W_TABLE (VEX_W_0F3A04
) },
6468 { VEX_W_TABLE (VEX_W_0F3A05
) },
6469 { VEX_LEN_TABLE (VEX_LEN_0F3A06
) },
6472 { "vroundps", { XM
, EXx
, Ib
}, PREFIX_DATA
},
6473 { "vroundpd", { XM
, EXx
, Ib
}, PREFIX_DATA
},
6474 { "vroundss", { XMScalar
, VexScalar
, EXd
, Ib
}, PREFIX_DATA
},
6475 { "vroundsd", { XMScalar
, VexScalar
, EXq
, Ib
}, PREFIX_DATA
},
6476 { "vblendps", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
6477 { "vblendpd", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
6478 { "vpblendw", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
6479 { "vpalignr", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
6485 { VEX_LEN_TABLE (VEX_LEN_0F3A14
) },
6486 { VEX_LEN_TABLE (VEX_LEN_0F3A15
) },
6487 { VEX_LEN_TABLE (VEX_LEN_0F3A16
) },
6488 { VEX_LEN_TABLE (VEX_LEN_0F3A17
) },
6490 { VEX_LEN_TABLE (VEX_LEN_0F3A18
) },
6491 { VEX_LEN_TABLE (VEX_LEN_0F3A19
) },
6495 { VEX_W_TABLE (VEX_W_0F3A1D
) },
6499 { VEX_LEN_TABLE (VEX_LEN_0F3A20
) },
6500 { VEX_LEN_TABLE (VEX_LEN_0F3A21
) },
6501 { VEX_LEN_TABLE (VEX_LEN_0F3A22
) },
6517 { VEX_LEN_TABLE (VEX_LEN_0F3A30
) },
6518 { VEX_LEN_TABLE (VEX_LEN_0F3A31
) },
6519 { VEX_LEN_TABLE (VEX_LEN_0F3A32
) },
6520 { VEX_LEN_TABLE (VEX_LEN_0F3A33
) },
6526 { VEX_LEN_TABLE (VEX_LEN_0F3A38
) },
6527 { VEX_LEN_TABLE (VEX_LEN_0F3A39
) },
6535 { "vdpps", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
6536 { VEX_LEN_TABLE (VEX_LEN_0F3A41
) },
6537 { "vmpsadbw", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
6539 { "vpclmulqdq", { XM
, Vex
, EXx
, PCLMUL
}, PREFIX_DATA
},
6541 { VEX_LEN_TABLE (VEX_LEN_0F3A46
) },
6544 { "vpermil2ps", { XM
, Vex
, EXx
, XMVexI4
, VexI4
}, PREFIX_DATA
},
6545 { "vpermil2pd", { XM
, Vex
, EXx
, XMVexI4
, VexI4
}, PREFIX_DATA
},
6546 { VEX_W_TABLE (VEX_W_0F3A4A
) },
6547 { VEX_W_TABLE (VEX_W_0F3A4B
) },
6548 { VEX_W_TABLE (VEX_W_0F3A4C
) },
6566 { "vfmaddsubps", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6567 { "vfmaddsubpd", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6568 { "vfmsubaddps", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6569 { "vfmsubaddpd", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6571 { VEX_LEN_TABLE (VEX_LEN_0F3A60
) },
6572 { VEX_LEN_TABLE (VEX_LEN_0F3A61
) },
6573 { VEX_LEN_TABLE (VEX_LEN_0F3A62
) },
6574 { VEX_LEN_TABLE (VEX_LEN_0F3A63
) },
6580 { "vfmaddps", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6581 { "vfmaddpd", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6582 { "vfmaddss", { XMScalar
, VexScalar
, EXd
, XMVexScalarI4
}, PREFIX_DATA
},
6583 { "vfmaddsd", { XMScalar
, VexScalar
, EXq
, XMVexScalarI4
}, PREFIX_DATA
},
6584 { "vfmsubps", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6585 { "vfmsubpd", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6586 { "vfmsubss", { XMScalar
, VexScalar
, EXd
, XMVexScalarI4
}, PREFIX_DATA
},
6587 { "vfmsubsd", { XMScalar
, VexScalar
, EXq
, XMVexScalarI4
}, PREFIX_DATA
},
6598 { "vfnmaddps", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6599 { "vfnmaddpd", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6600 { "vfnmaddss", { XMScalar
, VexScalar
, EXd
, XMVexScalarI4
}, PREFIX_DATA
},
6601 { "vfnmaddsd", { XMScalar
, VexScalar
, EXq
, XMVexScalarI4
}, PREFIX_DATA
},
6602 { "vfnmsubps", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6603 { "vfnmsubpd", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6604 { "vfnmsubss", { XMScalar
, VexScalar
, EXd
, XMVexScalarI4
}, PREFIX_DATA
},
6605 { "vfnmsubsd", { XMScalar
, VexScalar
, EXq
, XMVexScalarI4
}, PREFIX_DATA
},
6694 { VEX_W_TABLE (VEX_W_0F3ACE
) },
6695 { VEX_W_TABLE (VEX_W_0F3ACF
) },
6713 { VEX_LEN_TABLE (VEX_LEN_0F3ADF
) },
6733 { VEX_LEN_TABLE (VEX_LEN_0F3AF0
) },
6753 #include "i386-dis-evex.h"
6755 static const struct dis386 vex_len_table
[][2] = {
6756 /* VEX_LEN_0F12_P_0_M_0 / VEX_LEN_0F12_P_2_M_0 */
6758 { "vmovlpX", { XM
, Vex
, EXq
}, PREFIX_OPCODE
},
6761 /* VEX_LEN_0F12_P_0_M_1 */
6763 { "vmovhlp%XS", { XM
, Vex
, EXq
}, 0 },
6766 /* VEX_LEN_0F13_M_0 */
6768 { "vmovlpX", { EXq
, XM
}, PREFIX_OPCODE
},
6771 /* VEX_LEN_0F16_P_0_M_0 / VEX_LEN_0F16_P_2_M_0 */
6773 { "vmovhpX", { XM
, Vex
, EXq
}, PREFIX_OPCODE
},
6776 /* VEX_LEN_0F16_P_0_M_1 */
6778 { "vmovlhp%XS", { XM
, Vex
, EXq
}, 0 },
6781 /* VEX_LEN_0F17_M_0 */
6783 { "vmovhpX", { EXq
, XM
}, PREFIX_OPCODE
},
6789 { MOD_TABLE (MOD_VEX_0F41_L_1
) },
6795 { MOD_TABLE (MOD_VEX_0F42_L_1
) },
6800 { MOD_TABLE (MOD_VEX_0F44_L_0
) },
6806 { MOD_TABLE (MOD_VEX_0F45_L_1
) },
6812 { MOD_TABLE (MOD_VEX_0F46_L_1
) },
6818 { MOD_TABLE (MOD_VEX_0F47_L_1
) },
6824 { MOD_TABLE (MOD_VEX_0F4A_L_1
) },
6830 { MOD_TABLE (MOD_VEX_0F4B_L_1
) },
6835 { "vmovK", { XMScalar
, Edq
}, PREFIX_DATA
},
6840 { "vzeroupper", { XX
}, 0 },
6841 { "vzeroall", { XX
}, 0 },
6844 /* VEX_LEN_0F7E_P_1 */
6846 { "vmovq", { XMScalar
, EXq
}, 0 },
6849 /* VEX_LEN_0F7E_P_2 */
6851 { "vmovK", { Edq
, XMScalar
}, 0 },
6856 { VEX_W_TABLE (VEX_W_0F90_L_0
) },
6861 { MOD_TABLE (MOD_VEX_0F91_L_0
) },
6866 { MOD_TABLE (MOD_VEX_0F92_L_0
) },
6871 { MOD_TABLE (MOD_VEX_0F93_L_0
) },
6876 { MOD_TABLE (MOD_VEX_0F98_L_0
) },
6881 { MOD_TABLE (MOD_VEX_0F99_L_0
) },
6884 /* VEX_LEN_0FAE_R_2_M_0 */
6886 { "vldmxcsr", { Md
}, 0 },
6889 /* VEX_LEN_0FAE_R_3_M_0 */
6891 { "vstmxcsr", { Md
}, 0 },
6896 { "vpinsrw", { XM
, Vex
, Edw
, Ib
}, PREFIX_DATA
},
6901 { "vpextrw", { Gd
, XS
, Ib
}, PREFIX_DATA
},
6906 { "vmovq", { EXqS
, XMScalar
}, PREFIX_DATA
},
6911 { "vmaskmovdqu", { XM
, XS
}, PREFIX_DATA
},
6914 /* VEX_LEN_0F3816 */
6917 { VEX_W_TABLE (VEX_W_0F3816_L_1
) },
6920 /* VEX_LEN_0F3819 */
6923 { VEX_W_TABLE (VEX_W_0F3819_L_1
) },
6926 /* VEX_LEN_0F381A_M_0 */
6929 { VEX_W_TABLE (VEX_W_0F381A_M_0_L_1
) },
6932 /* VEX_LEN_0F3836 */
6935 { VEX_W_TABLE (VEX_W_0F3836
) },
6938 /* VEX_LEN_0F3841 */
6940 { "vphminposuw", { XM
, EXx
}, PREFIX_DATA
},
6943 /* VEX_LEN_0F3849_X86_64_P_0_W_0_M_0 */
6945 { "ldtilecfg", { M
}, 0 },
6948 /* VEX_LEN_0F3849_X86_64_P_0_W_0_M_1_REG_0_RM_0 */
6950 { "tilerelease", { Skip_MODRM
}, 0 },
6953 /* VEX_LEN_0F3849_X86_64_P_2_W_0_M_0 */
6955 { "sttilecfg", { M
}, 0 },
6958 /* VEX_LEN_0F3849_X86_64_P_3_W_0_M_0 */
6960 { "tilezero", { TMM
, Skip_MODRM
}, 0 },
6963 /* VEX_LEN_0F384B_X86_64_P_1_W_0_M_0 */
6965 { "tilestored", { MVexSIBMEM
, TMM
}, 0 },
6967 /* VEX_LEN_0F384B_X86_64_P_2_W_0_M_0 */
6969 { "tileloaddt1", { TMM
, MVexSIBMEM
}, 0 },
6972 /* VEX_LEN_0F384B_X86_64_P_3_W_0_M_0 */
6974 { "tileloadd", { TMM
, MVexSIBMEM
}, 0 },
6977 /* VEX_LEN_0F385A_M_0 */
6980 { VEX_W_TABLE (VEX_W_0F385A_M_0_L_0
) },
6983 /* VEX_LEN_0F385C_X86_64_P_1_W_0_M_0 */
6985 { "tdpbf16ps", { TMM
, EXtmm
, VexTmm
}, 0 },
6988 /* VEX_LEN_0F385E_X86_64_P_0_W_0_M_0 */
6990 { "tdpbuud", {TMM
, EXtmm
, VexTmm
}, 0 },
6993 /* VEX_LEN_0F385E_X86_64_P_1_W_0_M_0 */
6995 { "tdpbsud", {TMM
, EXtmm
, VexTmm
}, 0 },
6998 /* VEX_LEN_0F385E_X86_64_P_2_W_0_M_0 */
7000 { "tdpbusd", {TMM
, EXtmm
, VexTmm
}, 0 },
7003 /* VEX_LEN_0F385E_X86_64_P_3_W_0_M_0 */
7005 { "tdpbssd", {TMM
, EXtmm
, VexTmm
}, 0 },
7008 /* VEX_LEN_0F38DB */
7010 { "vaesimc", { XM
, EXx
}, PREFIX_DATA
},
7013 /* VEX_LEN_0F38F2 */
7015 { "andnS", { Gdq
, VexGdq
, Edq
}, PREFIX_OPCODE
},
7018 /* VEX_LEN_0F38F3 */
7020 { REG_TABLE(REG_VEX_0F38F3_L_0
) },
7023 /* VEX_LEN_0F38F5 */
7025 { PREFIX_TABLE(PREFIX_VEX_0F38F5_L_0
) },
7028 /* VEX_LEN_0F38F6 */
7030 { PREFIX_TABLE(PREFIX_VEX_0F38F6_L_0
) },
7033 /* VEX_LEN_0F38F7 */
7035 { PREFIX_TABLE(PREFIX_VEX_0F38F7_L_0
) },
7038 /* VEX_LEN_0F3A00 */
7041 { VEX_W_TABLE (VEX_W_0F3A00_L_1
) },
7044 /* VEX_LEN_0F3A01 */
7047 { VEX_W_TABLE (VEX_W_0F3A01_L_1
) },
7050 /* VEX_LEN_0F3A06 */
7053 { VEX_W_TABLE (VEX_W_0F3A06_L_1
) },
7056 /* VEX_LEN_0F3A14 */
7058 { "vpextrb", { Edb
, XM
, Ib
}, PREFIX_DATA
},
7061 /* VEX_LEN_0F3A15 */
7063 { "vpextrw", { Edw
, XM
, Ib
}, PREFIX_DATA
},
7066 /* VEX_LEN_0F3A16 */
7068 { "vpextrK", { Edq
, XM
, Ib
}, PREFIX_DATA
},
7071 /* VEX_LEN_0F3A17 */
7073 { "vextractps", { Ed
, XM
, Ib
}, PREFIX_DATA
},
7076 /* VEX_LEN_0F3A18 */
7079 { VEX_W_TABLE (VEX_W_0F3A18_L_1
) },
7082 /* VEX_LEN_0F3A19 */
7085 { VEX_W_TABLE (VEX_W_0F3A19_L_1
) },
7088 /* VEX_LEN_0F3A20 */
7090 { "vpinsrb", { XM
, Vex
, Edb
, Ib
}, PREFIX_DATA
},
7093 /* VEX_LEN_0F3A21 */
7095 { "vinsertps", { XM
, Vex
, EXd
, Ib
}, PREFIX_DATA
},
7098 /* VEX_LEN_0F3A22 */
7100 { "vpinsrK", { XM
, Vex
, Edq
, Ib
}, PREFIX_DATA
},
7103 /* VEX_LEN_0F3A30 */
7105 { MOD_TABLE (MOD_VEX_0F3A30_L_0
) },
7108 /* VEX_LEN_0F3A31 */
7110 { MOD_TABLE (MOD_VEX_0F3A31_L_0
) },
7113 /* VEX_LEN_0F3A32 */
7115 { MOD_TABLE (MOD_VEX_0F3A32_L_0
) },
7118 /* VEX_LEN_0F3A33 */
7120 { MOD_TABLE (MOD_VEX_0F3A33_L_0
) },
7123 /* VEX_LEN_0F3A38 */
7126 { VEX_W_TABLE (VEX_W_0F3A38_L_1
) },
7129 /* VEX_LEN_0F3A39 */
7132 { VEX_W_TABLE (VEX_W_0F3A39_L_1
) },
7135 /* VEX_LEN_0F3A41 */
7137 { "vdppd", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
7140 /* VEX_LEN_0F3A46 */
7143 { VEX_W_TABLE (VEX_W_0F3A46_L_1
) },
7146 /* VEX_LEN_0F3A60 */
7148 { "vpcmpestrm!%LQ", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7151 /* VEX_LEN_0F3A61 */
7153 { "vpcmpestri!%LQ", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7156 /* VEX_LEN_0F3A62 */
7158 { "vpcmpistrm", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7161 /* VEX_LEN_0F3A63 */
7163 { "vpcmpistri", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7166 /* VEX_LEN_0F3ADF */
7168 { "vaeskeygenassist", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7171 /* VEX_LEN_0F3AF0 */
7173 { PREFIX_TABLE (PREFIX_VEX_0F3AF0_L_0
) },
7176 /* VEX_LEN_0FXOP_08_85 */
7178 { VEX_W_TABLE (VEX_W_0FXOP_08_85_L_0
) },
7181 /* VEX_LEN_0FXOP_08_86 */
7183 { VEX_W_TABLE (VEX_W_0FXOP_08_86_L_0
) },
7186 /* VEX_LEN_0FXOP_08_87 */
7188 { VEX_W_TABLE (VEX_W_0FXOP_08_87_L_0
) },
7191 /* VEX_LEN_0FXOP_08_8E */
7193 { VEX_W_TABLE (VEX_W_0FXOP_08_8E_L_0
) },
7196 /* VEX_LEN_0FXOP_08_8F */
7198 { VEX_W_TABLE (VEX_W_0FXOP_08_8F_L_0
) },
7201 /* VEX_LEN_0FXOP_08_95 */
7203 { VEX_W_TABLE (VEX_W_0FXOP_08_95_L_0
) },
7206 /* VEX_LEN_0FXOP_08_96 */
7208 { VEX_W_TABLE (VEX_W_0FXOP_08_96_L_0
) },
7211 /* VEX_LEN_0FXOP_08_97 */
7213 { VEX_W_TABLE (VEX_W_0FXOP_08_97_L_0
) },
7216 /* VEX_LEN_0FXOP_08_9E */
7218 { VEX_W_TABLE (VEX_W_0FXOP_08_9E_L_0
) },
7221 /* VEX_LEN_0FXOP_08_9F */
7223 { VEX_W_TABLE (VEX_W_0FXOP_08_9F_L_0
) },
7226 /* VEX_LEN_0FXOP_08_A3 */
7228 { "vpperm", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7231 /* VEX_LEN_0FXOP_08_A6 */
7233 { VEX_W_TABLE (VEX_W_0FXOP_08_A6_L_0
) },
7236 /* VEX_LEN_0FXOP_08_B6 */
7238 { VEX_W_TABLE (VEX_W_0FXOP_08_B6_L_0
) },
7241 /* VEX_LEN_0FXOP_08_C0 */
7243 { VEX_W_TABLE (VEX_W_0FXOP_08_C0_L_0
) },
7246 /* VEX_LEN_0FXOP_08_C1 */
7248 { VEX_W_TABLE (VEX_W_0FXOP_08_C1_L_0
) },
7251 /* VEX_LEN_0FXOP_08_C2 */
7253 { VEX_W_TABLE (VEX_W_0FXOP_08_C2_L_0
) },
7256 /* VEX_LEN_0FXOP_08_C3 */
7258 { VEX_W_TABLE (VEX_W_0FXOP_08_C3_L_0
) },
7261 /* VEX_LEN_0FXOP_08_CC */
7263 { VEX_W_TABLE (VEX_W_0FXOP_08_CC_L_0
) },
7266 /* VEX_LEN_0FXOP_08_CD */
7268 { VEX_W_TABLE (VEX_W_0FXOP_08_CD_L_0
) },
7271 /* VEX_LEN_0FXOP_08_CE */
7273 { VEX_W_TABLE (VEX_W_0FXOP_08_CE_L_0
) },
7276 /* VEX_LEN_0FXOP_08_CF */
7278 { VEX_W_TABLE (VEX_W_0FXOP_08_CF_L_0
) },
7281 /* VEX_LEN_0FXOP_08_EC */
7283 { VEX_W_TABLE (VEX_W_0FXOP_08_EC_L_0
) },
7286 /* VEX_LEN_0FXOP_08_ED */
7288 { VEX_W_TABLE (VEX_W_0FXOP_08_ED_L_0
) },
7291 /* VEX_LEN_0FXOP_08_EE */
7293 { VEX_W_TABLE (VEX_W_0FXOP_08_EE_L_0
) },
7296 /* VEX_LEN_0FXOP_08_EF */
7298 { VEX_W_TABLE (VEX_W_0FXOP_08_EF_L_0
) },
7301 /* VEX_LEN_0FXOP_09_01 */
7303 { REG_TABLE (REG_XOP_09_01_L_0
) },
7306 /* VEX_LEN_0FXOP_09_02 */
7308 { REG_TABLE (REG_XOP_09_02_L_0
) },
7311 /* VEX_LEN_0FXOP_09_12_M_1 */
7313 { REG_TABLE (REG_XOP_09_12_M_1_L_0
) },
7316 /* VEX_LEN_0FXOP_09_82_W_0 */
7318 { "vfrczss", { XM
, EXd
}, 0 },
7321 /* VEX_LEN_0FXOP_09_83_W_0 */
7323 { "vfrczsd", { XM
, EXq
}, 0 },
7326 /* VEX_LEN_0FXOP_09_90 */
7328 { "vprotb", { XM
, EXx
, VexW
}, 0 },
7331 /* VEX_LEN_0FXOP_09_91 */
7333 { "vprotw", { XM
, EXx
, VexW
}, 0 },
7336 /* VEX_LEN_0FXOP_09_92 */
7338 { "vprotd", { XM
, EXx
, VexW
}, 0 },
7341 /* VEX_LEN_0FXOP_09_93 */
7343 { "vprotq", { XM
, EXx
, VexW
}, 0 },
7346 /* VEX_LEN_0FXOP_09_94 */
7348 { "vpshlb", { XM
, EXx
, VexW
}, 0 },
7351 /* VEX_LEN_0FXOP_09_95 */
7353 { "vpshlw", { XM
, EXx
, VexW
}, 0 },
7356 /* VEX_LEN_0FXOP_09_96 */
7358 { "vpshld", { XM
, EXx
, VexW
}, 0 },
7361 /* VEX_LEN_0FXOP_09_97 */
7363 { "vpshlq", { XM
, EXx
, VexW
}, 0 },
7366 /* VEX_LEN_0FXOP_09_98 */
7368 { "vpshab", { XM
, EXx
, VexW
}, 0 },
7371 /* VEX_LEN_0FXOP_09_99 */
7373 { "vpshaw", { XM
, EXx
, VexW
}, 0 },
7376 /* VEX_LEN_0FXOP_09_9A */
7378 { "vpshad", { XM
, EXx
, VexW
}, 0 },
7381 /* VEX_LEN_0FXOP_09_9B */
7383 { "vpshaq", { XM
, EXx
, VexW
}, 0 },
7386 /* VEX_LEN_0FXOP_09_C1 */
7388 { VEX_W_TABLE (VEX_W_0FXOP_09_C1_L_0
) },
7391 /* VEX_LEN_0FXOP_09_C2 */
7393 { VEX_W_TABLE (VEX_W_0FXOP_09_C2_L_0
) },
7396 /* VEX_LEN_0FXOP_09_C3 */
7398 { VEX_W_TABLE (VEX_W_0FXOP_09_C3_L_0
) },
7401 /* VEX_LEN_0FXOP_09_C6 */
7403 { VEX_W_TABLE (VEX_W_0FXOP_09_C6_L_0
) },
7406 /* VEX_LEN_0FXOP_09_C7 */
7408 { VEX_W_TABLE (VEX_W_0FXOP_09_C7_L_0
) },
7411 /* VEX_LEN_0FXOP_09_CB */
7413 { VEX_W_TABLE (VEX_W_0FXOP_09_CB_L_0
) },
7416 /* VEX_LEN_0FXOP_09_D1 */
7418 { VEX_W_TABLE (VEX_W_0FXOP_09_D1_L_0
) },
7421 /* VEX_LEN_0FXOP_09_D2 */
7423 { VEX_W_TABLE (VEX_W_0FXOP_09_D2_L_0
) },
7426 /* VEX_LEN_0FXOP_09_D3 */
7428 { VEX_W_TABLE (VEX_W_0FXOP_09_D3_L_0
) },
7431 /* VEX_LEN_0FXOP_09_D6 */
7433 { VEX_W_TABLE (VEX_W_0FXOP_09_D6_L_0
) },
7436 /* VEX_LEN_0FXOP_09_D7 */
7438 { VEX_W_TABLE (VEX_W_0FXOP_09_D7_L_0
) },
7441 /* VEX_LEN_0FXOP_09_DB */
7443 { VEX_W_TABLE (VEX_W_0FXOP_09_DB_L_0
) },
7446 /* VEX_LEN_0FXOP_09_E1 */
7448 { VEX_W_TABLE (VEX_W_0FXOP_09_E1_L_0
) },
7451 /* VEX_LEN_0FXOP_09_E2 */
7453 { VEX_W_TABLE (VEX_W_0FXOP_09_E2_L_0
) },
7456 /* VEX_LEN_0FXOP_09_E3 */
7458 { VEX_W_TABLE (VEX_W_0FXOP_09_E3_L_0
) },
7461 /* VEX_LEN_0FXOP_0A_12 */
7463 { REG_TABLE (REG_XOP_0A_12_L_0
) },
7467 #include "i386-dis-evex-len.h"
7469 static const struct dis386 vex_w_table
[][2] = {
7471 /* VEX_W_0F41_L_1_M_1 */
7472 { PREFIX_TABLE (PREFIX_VEX_0F41_L_1_M_1_W_0
) },
7473 { PREFIX_TABLE (PREFIX_VEX_0F41_L_1_M_1_W_1
) },
7476 /* VEX_W_0F42_L_1_M_1 */
7477 { PREFIX_TABLE (PREFIX_VEX_0F42_L_1_M_1_W_0
) },
7478 { PREFIX_TABLE (PREFIX_VEX_0F42_L_1_M_1_W_1
) },
7481 /* VEX_W_0F44_L_0_M_1 */
7482 { PREFIX_TABLE (PREFIX_VEX_0F44_L_0_M_1_W_0
) },
7483 { PREFIX_TABLE (PREFIX_VEX_0F44_L_0_M_1_W_1
) },
7486 /* VEX_W_0F45_L_1_M_1 */
7487 { PREFIX_TABLE (PREFIX_VEX_0F45_L_1_M_1_W_0
) },
7488 { PREFIX_TABLE (PREFIX_VEX_0F45_L_1_M_1_W_1
) },
7491 /* VEX_W_0F46_L_1_M_1 */
7492 { PREFIX_TABLE (PREFIX_VEX_0F46_L_1_M_1_W_0
) },
7493 { PREFIX_TABLE (PREFIX_VEX_0F46_L_1_M_1_W_1
) },
7496 /* VEX_W_0F47_L_1_M_1 */
7497 { PREFIX_TABLE (PREFIX_VEX_0F47_L_1_M_1_W_0
) },
7498 { PREFIX_TABLE (PREFIX_VEX_0F47_L_1_M_1_W_1
) },
7501 /* VEX_W_0F4A_L_1_M_1 */
7502 { PREFIX_TABLE (PREFIX_VEX_0F4A_L_1_M_1_W_0
) },
7503 { PREFIX_TABLE (PREFIX_VEX_0F4A_L_1_M_1_W_1
) },
7506 /* VEX_W_0F4B_L_1_M_1 */
7507 { PREFIX_TABLE (PREFIX_VEX_0F4B_L_1_M_1_W_0
) },
7508 { PREFIX_TABLE (PREFIX_VEX_0F4B_L_1_M_1_W_1
) },
7511 /* VEX_W_0F90_L_0 */
7512 { PREFIX_TABLE (PREFIX_VEX_0F90_L_0_W_0
) },
7513 { PREFIX_TABLE (PREFIX_VEX_0F90_L_0_W_1
) },
7516 /* VEX_W_0F91_L_0_M_0 */
7517 { PREFIX_TABLE (PREFIX_VEX_0F91_L_0_M_0_W_0
) },
7518 { PREFIX_TABLE (PREFIX_VEX_0F91_L_0_M_0_W_1
) },
7521 /* VEX_W_0F92_L_0_M_1 */
7522 { PREFIX_TABLE (PREFIX_VEX_0F92_L_0_M_1_W_0
) },
7523 { PREFIX_TABLE (PREFIX_VEX_0F92_L_0_M_1_W_1
) },
7526 /* VEX_W_0F93_L_0_M_1 */
7527 { PREFIX_TABLE (PREFIX_VEX_0F93_L_0_M_1_W_0
) },
7528 { PREFIX_TABLE (PREFIX_VEX_0F93_L_0_M_1_W_1
) },
7531 /* VEX_W_0F98_L_0_M_1 */
7532 { PREFIX_TABLE (PREFIX_VEX_0F98_L_0_M_1_W_0
) },
7533 { PREFIX_TABLE (PREFIX_VEX_0F98_L_0_M_1_W_1
) },
7536 /* VEX_W_0F99_L_0_M_1 */
7537 { PREFIX_TABLE (PREFIX_VEX_0F99_L_0_M_1_W_0
) },
7538 { PREFIX_TABLE (PREFIX_VEX_0F99_L_0_M_1_W_1
) },
7542 { "vpermilps", { XM
, Vex
, EXx
}, PREFIX_DATA
},
7546 { "vpermilpd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
7550 { "vtestps", { XM
, EXx
}, PREFIX_DATA
},
7554 { "vtestpd", { XM
, EXx
}, PREFIX_DATA
},
7558 { "vcvtph2ps", { XM
, EXxmmq
}, PREFIX_DATA
},
7561 /* VEX_W_0F3816_L_1 */
7562 { "vpermps", { XM
, Vex
, EXx
}, PREFIX_DATA
},
7566 { "vbroadcastss", { XM
, EXd
}, PREFIX_DATA
},
7569 /* VEX_W_0F3819_L_1 */
7570 { "vbroadcastsd", { XM
, EXq
}, PREFIX_DATA
},
7573 /* VEX_W_0F381A_M_0_L_1 */
7574 { "vbroadcastf128", { XM
, Mxmm
}, PREFIX_DATA
},
7577 /* VEX_W_0F382C_M_0 */
7578 { "vmaskmovps", { XM
, Vex
, Mx
}, PREFIX_DATA
},
7581 /* VEX_W_0F382D_M_0 */
7582 { "vmaskmovpd", { XM
, Vex
, Mx
}, PREFIX_DATA
},
7585 /* VEX_W_0F382E_M_0 */
7586 { "vmaskmovps", { Mx
, Vex
, XM
}, PREFIX_DATA
},
7589 /* VEX_W_0F382F_M_0 */
7590 { "vmaskmovpd", { Mx
, Vex
, XM
}, PREFIX_DATA
},
7594 { "vpermd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
7598 { "vpsravd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
7601 /* VEX_W_0F3849_X86_64_P_0 */
7602 { MOD_TABLE (MOD_VEX_0F3849_X86_64_P_0_W_0
) },
7605 /* VEX_W_0F3849_X86_64_P_2 */
7606 { MOD_TABLE (MOD_VEX_0F3849_X86_64_P_2_W_0
) },
7609 /* VEX_W_0F3849_X86_64_P_3 */
7610 { MOD_TABLE (MOD_VEX_0F3849_X86_64_P_3_W_0
) },
7613 /* VEX_W_0F384B_X86_64_P_1 */
7614 { MOD_TABLE (MOD_VEX_0F384B_X86_64_P_1_W_0
) },
7617 /* VEX_W_0F384B_X86_64_P_2 */
7618 { MOD_TABLE (MOD_VEX_0F384B_X86_64_P_2_W_0
) },
7621 /* VEX_W_0F384B_X86_64_P_3 */
7622 { MOD_TABLE (MOD_VEX_0F384B_X86_64_P_3_W_0
) },
7626 { "%XV vpdpbusd", { XM
, Vex
, EXx
}, 0 },
7630 { "%XV vpdpbusds", { XM
, Vex
, EXx
}, 0 },
7634 { "%XV vpdpwssd", { XM
, Vex
, EXx
}, 0 },
7638 { "%XV vpdpwssds", { XM
, Vex
, EXx
}, 0 },
7642 { "vpbroadcastd", { XM
, EXd
}, PREFIX_DATA
},
7646 { "vpbroadcastq", { XM
, EXq
}, PREFIX_DATA
},
7649 /* VEX_W_0F385A_M_0_L_0 */
7650 { "vbroadcasti128", { XM
, Mxmm
}, PREFIX_DATA
},
7653 /* VEX_W_0F385C_X86_64_P_1 */
7654 { MOD_TABLE (MOD_VEX_0F385C_X86_64_P_1_W_0
) },
7657 /* VEX_W_0F385E_X86_64_P_0 */
7658 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_0_W_0
) },
7661 /* VEX_W_0F385E_X86_64_P_1 */
7662 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_1_W_0
) },
7665 /* VEX_W_0F385E_X86_64_P_2 */
7666 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_2_W_0
) },
7669 /* VEX_W_0F385E_X86_64_P_3 */
7670 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_3_W_0
) },
7674 { "vpbroadcastb", { XM
, EXb
}, PREFIX_DATA
},
7678 { "vpbroadcastw", { XM
, EXw
}, PREFIX_DATA
},
7682 { "vgf2p8mulb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
7685 /* VEX_W_0F3A00_L_1 */
7687 { "vpermq", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7690 /* VEX_W_0F3A01_L_1 */
7692 { "vpermpd", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7696 { "vpblendd", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
7700 { "vpermilps", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7704 { "vpermilpd", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7707 /* VEX_W_0F3A06_L_1 */
7708 { "vperm2f128", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
7711 /* VEX_W_0F3A18_L_1 */
7712 { "vinsertf128", { XM
, Vex
, EXxmm
, Ib
}, PREFIX_DATA
},
7715 /* VEX_W_0F3A19_L_1 */
7716 { "vextractf128", { EXxmm
, XM
, Ib
}, PREFIX_DATA
},
7720 { "vcvtps2ph", { EXxmmq
, XM
, EXxEVexS
, Ib
}, PREFIX_DATA
},
7723 /* VEX_W_0F3A38_L_1 */
7724 { "vinserti128", { XM
, Vex
, EXxmm
, Ib
}, PREFIX_DATA
},
7727 /* VEX_W_0F3A39_L_1 */
7728 { "vextracti128", { EXxmm
, XM
, Ib
}, PREFIX_DATA
},
7731 /* VEX_W_0F3A46_L_1 */
7732 { "vperm2i128", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
7736 { "vblendvps", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
7740 { "vblendvpd", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
7744 { "vpblendvb", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
7749 { "vgf2p8affineqb", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
7754 { "vgf2p8affineinvqb", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
7756 /* VEX_W_0FXOP_08_85_L_0 */
7758 { "vpmacssww", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7760 /* VEX_W_0FXOP_08_86_L_0 */
7762 { "vpmacsswd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7764 /* VEX_W_0FXOP_08_87_L_0 */
7766 { "vpmacssdql", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7768 /* VEX_W_0FXOP_08_8E_L_0 */
7770 { "vpmacssdd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7772 /* VEX_W_0FXOP_08_8F_L_0 */
7774 { "vpmacssdqh", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7776 /* VEX_W_0FXOP_08_95_L_0 */
7778 { "vpmacsww", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7780 /* VEX_W_0FXOP_08_96_L_0 */
7782 { "vpmacswd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7784 /* VEX_W_0FXOP_08_97_L_0 */
7786 { "vpmacsdql", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7788 /* VEX_W_0FXOP_08_9E_L_0 */
7790 { "vpmacsdd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7792 /* VEX_W_0FXOP_08_9F_L_0 */
7794 { "vpmacsdqh", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7796 /* VEX_W_0FXOP_08_A6_L_0 */
7798 { "vpmadcsswd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7800 /* VEX_W_0FXOP_08_B6_L_0 */
7802 { "vpmadcswd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7804 /* VEX_W_0FXOP_08_C0_L_0 */
7806 { "vprotb", { XM
, EXx
, Ib
}, 0 },
7808 /* VEX_W_0FXOP_08_C1_L_0 */
7810 { "vprotw", { XM
, EXx
, Ib
}, 0 },
7812 /* VEX_W_0FXOP_08_C2_L_0 */
7814 { "vprotd", { XM
, EXx
, Ib
}, 0 },
7816 /* VEX_W_0FXOP_08_C3_L_0 */
7818 { "vprotq", { XM
, EXx
, Ib
}, 0 },
7820 /* VEX_W_0FXOP_08_CC_L_0 */
7822 { "vpcomb", { XM
, Vex
, EXx
, VPCOM
}, 0 },
7824 /* VEX_W_0FXOP_08_CD_L_0 */
7826 { "vpcomw", { XM
, Vex
, EXx
, VPCOM
}, 0 },
7828 /* VEX_W_0FXOP_08_CE_L_0 */
7830 { "vpcomd", { XM
, Vex
, EXx
, VPCOM
}, 0 },
7832 /* VEX_W_0FXOP_08_CF_L_0 */
7834 { "vpcomq", { XM
, Vex
, EXx
, VPCOM
}, 0 },
7836 /* VEX_W_0FXOP_08_EC_L_0 */
7838 { "vpcomub", { XM
, Vex
, EXx
, VPCOM
}, 0 },
7840 /* VEX_W_0FXOP_08_ED_L_0 */
7842 { "vpcomuw", { XM
, Vex
, EXx
, VPCOM
}, 0 },
7844 /* VEX_W_0FXOP_08_EE_L_0 */
7846 { "vpcomud", { XM
, Vex
, EXx
, VPCOM
}, 0 },
7848 /* VEX_W_0FXOP_08_EF_L_0 */
7850 { "vpcomuq", { XM
, Vex
, EXx
, VPCOM
}, 0 },
7852 /* VEX_W_0FXOP_09_80 */
7854 { "vfrczps", { XM
, EXx
}, 0 },
7856 /* VEX_W_0FXOP_09_81 */
7858 { "vfrczpd", { XM
, EXx
}, 0 },
7860 /* VEX_W_0FXOP_09_82 */
7862 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_82_W_0
) },
7864 /* VEX_W_0FXOP_09_83 */
7866 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_83_W_0
) },
7868 /* VEX_W_0FXOP_09_C1_L_0 */
7870 { "vphaddbw", { XM
, EXxmm
}, 0 },
7872 /* VEX_W_0FXOP_09_C2_L_0 */
7874 { "vphaddbd", { XM
, EXxmm
}, 0 },
7876 /* VEX_W_0FXOP_09_C3_L_0 */
7878 { "vphaddbq", { XM
, EXxmm
}, 0 },
7880 /* VEX_W_0FXOP_09_C6_L_0 */
7882 { "vphaddwd", { XM
, EXxmm
}, 0 },
7884 /* VEX_W_0FXOP_09_C7_L_0 */
7886 { "vphaddwq", { XM
, EXxmm
}, 0 },
7888 /* VEX_W_0FXOP_09_CB_L_0 */
7890 { "vphadddq", { XM
, EXxmm
}, 0 },
7892 /* VEX_W_0FXOP_09_D1_L_0 */
7894 { "vphaddubw", { XM
, EXxmm
}, 0 },
7896 /* VEX_W_0FXOP_09_D2_L_0 */
7898 { "vphaddubd", { XM
, EXxmm
}, 0 },
7900 /* VEX_W_0FXOP_09_D3_L_0 */
7902 { "vphaddubq", { XM
, EXxmm
}, 0 },
7904 /* VEX_W_0FXOP_09_D6_L_0 */
7906 { "vphadduwd", { XM
, EXxmm
}, 0 },
7908 /* VEX_W_0FXOP_09_D7_L_0 */
7910 { "vphadduwq", { XM
, EXxmm
}, 0 },
7912 /* VEX_W_0FXOP_09_DB_L_0 */
7914 { "vphaddudq", { XM
, EXxmm
}, 0 },
7916 /* VEX_W_0FXOP_09_E1_L_0 */
7918 { "vphsubbw", { XM
, EXxmm
}, 0 },
7920 /* VEX_W_0FXOP_09_E2_L_0 */
7922 { "vphsubwd", { XM
, EXxmm
}, 0 },
7924 /* VEX_W_0FXOP_09_E3_L_0 */
7926 { "vphsubdq", { XM
, EXxmm
}, 0 },
7929 #include "i386-dis-evex-w.h"
7932 static const struct dis386 mod_table
[][2] = {
7935 { "bound{S|}", { Gv
, Ma
}, 0 },
7936 { EVEX_TABLE (EVEX_0F
) },
7940 { "leaS", { Gv
, M
}, 0 },
7944 { "lesS", { Gv
, Mp
}, 0 },
7945 { VEX_C4_TABLE (VEX_0F
) },
7949 { "ldsS", { Gv
, Mp
}, 0 },
7950 { VEX_C5_TABLE (VEX_0F
) },
7955 { RM_TABLE (RM_C6_REG_7
) },
7960 { RM_TABLE (RM_C7_REG_7
) },
7964 { "{l|}call^", { indirEp
}, 0 },
7968 { "{l|}jmp^", { indirEp
}, 0 },
7971 /* MOD_0F01_REG_0 */
7972 { X86_64_TABLE (X86_64_0F01_REG_0
) },
7973 { RM_TABLE (RM_0F01_REG_0
) },
7976 /* MOD_0F01_REG_1 */
7977 { X86_64_TABLE (X86_64_0F01_REG_1
) },
7978 { RM_TABLE (RM_0F01_REG_1
) },
7981 /* MOD_0F01_REG_2 */
7982 { X86_64_TABLE (X86_64_0F01_REG_2
) },
7983 { RM_TABLE (RM_0F01_REG_2
) },
7986 /* MOD_0F01_REG_3 */
7987 { X86_64_TABLE (X86_64_0F01_REG_3
) },
7988 { RM_TABLE (RM_0F01_REG_3
) },
7991 /* MOD_0F01_REG_5 */
7992 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_0
) },
7993 { RM_TABLE (RM_0F01_REG_5_MOD_3
) },
7996 /* MOD_0F01_REG_7 */
7997 { "invlpg", { Mb
}, 0 },
7998 { RM_TABLE (RM_0F01_REG_7_MOD_3
) },
8001 /* MOD_0F12_PREFIX_0 */
8002 { "movlpX", { XM
, EXq
}, 0 },
8003 { "movhlps", { XM
, EXq
}, 0 },
8006 /* MOD_0F12_PREFIX_2 */
8007 { "movlpX", { XM
, EXq
}, 0 },
8011 { "movlpX", { EXq
, XM
}, PREFIX_OPCODE
},
8014 /* MOD_0F16_PREFIX_0 */
8015 { "movhpX", { XM
, EXq
}, 0 },
8016 { "movlhps", { XM
, EXq
}, 0 },
8019 /* MOD_0F16_PREFIX_2 */
8020 { "movhpX", { XM
, EXq
}, 0 },
8024 { "movhpX", { EXq
, XM
}, PREFIX_OPCODE
},
8027 /* MOD_0F18_REG_0 */
8028 { "prefetchnta", { Mb
}, 0 },
8029 { "nopQ", { Ev
}, 0 },
8032 /* MOD_0F18_REG_1 */
8033 { "prefetcht0", { Mb
}, 0 },
8034 { "nopQ", { Ev
}, 0 },
8037 /* MOD_0F18_REG_2 */
8038 { "prefetcht1", { Mb
}, 0 },
8039 { "nopQ", { Ev
}, 0 },
8042 /* MOD_0F18_REG_3 */
8043 { "prefetcht2", { Mb
}, 0 },
8044 { "nopQ", { Ev
}, 0 },
8047 /* MOD_0F1A_PREFIX_0 */
8048 { "bndldx", { Gbnd
, Mv_bnd
}, 0 },
8049 { "nopQ", { Ev
}, 0 },
8052 /* MOD_0F1B_PREFIX_0 */
8053 { "bndstx", { Mv_bnd
, Gbnd
}, 0 },
8054 { "nopQ", { Ev
}, 0 },
8057 /* MOD_0F1B_PREFIX_1 */
8058 { "bndmk", { Gbnd
, Mv_bnd
}, 0 },
8059 { "nopQ", { Ev
}, PREFIX_IGNORED
},
8062 /* MOD_0F1C_PREFIX_0 */
8063 { REG_TABLE (REG_0F1C_P_0_MOD_0
) },
8064 { "nopQ", { Ev
}, 0 },
8067 /* MOD_0F1E_PREFIX_1 */
8068 { "nopQ", { Ev
}, PREFIX_IGNORED
},
8069 { REG_TABLE (REG_0F1E_P_1_MOD_3
) },
8072 /* MOD_0F2B_PREFIX_0 */
8073 {"movntps", { Mx
, XM
}, PREFIX_OPCODE
},
8076 /* MOD_0F2B_PREFIX_1 */
8077 {"movntss", { Md
, XM
}, PREFIX_OPCODE
},
8080 /* MOD_0F2B_PREFIX_2 */
8081 {"movntpd", { Mx
, XM
}, PREFIX_OPCODE
},
8084 /* MOD_0F2B_PREFIX_3 */
8085 {"movntsd", { Mq
, XM
}, PREFIX_OPCODE
},
8090 { "movmskpX", { Gdq
, XS
}, PREFIX_OPCODE
},
8095 { REG_TABLE (REG_0F71_MOD_0
) },
8100 { REG_TABLE (REG_0F72_MOD_0
) },
8105 { REG_TABLE (REG_0F73_MOD_0
) },
8108 /* MOD_0FAE_REG_0 */
8109 { "fxsave", { FXSAVE
}, 0 },
8110 { PREFIX_TABLE (PREFIX_0FAE_REG_0_MOD_3
) },
8113 /* MOD_0FAE_REG_1 */
8114 { "fxrstor", { FXSAVE
}, 0 },
8115 { PREFIX_TABLE (PREFIX_0FAE_REG_1_MOD_3
) },
8118 /* MOD_0FAE_REG_2 */
8119 { "ldmxcsr", { Md
}, 0 },
8120 { PREFIX_TABLE (PREFIX_0FAE_REG_2_MOD_3
) },
8123 /* MOD_0FAE_REG_3 */
8124 { "stmxcsr", { Md
}, 0 },
8125 { PREFIX_TABLE (PREFIX_0FAE_REG_3_MOD_3
) },
8128 /* MOD_0FAE_REG_4 */
8129 { PREFIX_TABLE (PREFIX_0FAE_REG_4_MOD_0
) },
8130 { PREFIX_TABLE (PREFIX_0FAE_REG_4_MOD_3
) },
8133 /* MOD_0FAE_REG_5 */
8134 { "xrstor", { FXSAVE
}, PREFIX_OPCODE
},
8135 { PREFIX_TABLE (PREFIX_0FAE_REG_5_MOD_3
) },
8138 /* MOD_0FAE_REG_6 */
8139 { PREFIX_TABLE (PREFIX_0FAE_REG_6_MOD_0
) },
8140 { PREFIX_TABLE (PREFIX_0FAE_REG_6_MOD_3
) },
8143 /* MOD_0FAE_REG_7 */
8144 { PREFIX_TABLE (PREFIX_0FAE_REG_7_MOD_0
) },
8145 { RM_TABLE (RM_0FAE_REG_7_MOD_3
) },
8149 { "lssS", { Gv
, Mp
}, 0 },
8153 { "lfsS", { Gv
, Mp
}, 0 },
8157 { "lgsS", { Gv
, Mp
}, 0 },
8161 { "movntiS", { Edq
, Gdq
}, PREFIX_OPCODE
},
8164 /* MOD_0FC7_REG_3 */
8165 { "xrstors", { FXSAVE
}, 0 },
8168 /* MOD_0FC7_REG_4 */
8169 { "xsavec", { FXSAVE
}, 0 },
8172 /* MOD_0FC7_REG_5 */
8173 { "xsaves", { FXSAVE
}, 0 },
8176 /* MOD_0FC7_REG_6 */
8177 { PREFIX_TABLE (PREFIX_0FC7_REG_6_MOD_0
) },
8178 { PREFIX_TABLE (PREFIX_0FC7_REG_6_MOD_3
) }
8181 /* MOD_0FC7_REG_7 */
8182 { "vmptrst", { Mq
}, 0 },
8183 { PREFIX_TABLE (PREFIX_0FC7_REG_7_MOD_3
) }
8188 { "pmovmskb", { Gdq
, MS
}, 0 },
8191 /* MOD_0FE7_PREFIX_2 */
8192 { "movntdq", { Mx
, XM
}, 0 },
8195 /* MOD_0FF0_PREFIX_3 */
8196 { "lddqu", { XM
, M
}, 0 },
8200 { "movntdqa", { XM
, Mx
}, PREFIX_DATA
},
8203 /* MOD_0F38DC_PREFIX_1 */
8204 { "aesenc128kl", { XM
, M
}, 0 },
8205 { "loadiwkey", { XM
, EXx
}, 0 },
8208 /* MOD_0F38DD_PREFIX_1 */
8209 { "aesdec128kl", { XM
, M
}, 0 },
8212 /* MOD_0F38DE_PREFIX_1 */
8213 { "aesenc256kl", { XM
, M
}, 0 },
8216 /* MOD_0F38DF_PREFIX_1 */
8217 { "aesdec256kl", { XM
, M
}, 0 },
8221 { "wrussK", { M
, Gdq
}, PREFIX_DATA
},
8224 /* MOD_0F38F6_PREFIX_0 */
8225 { "wrssK", { M
, Gdq
}, PREFIX_OPCODE
},
8228 /* MOD_0F38F8_PREFIX_1 */
8229 { "enqcmds", { Gva
, M
}, PREFIX_OPCODE
},
8232 /* MOD_0F38F8_PREFIX_2 */
8233 { "movdir64b", { Gva
, M
}, PREFIX_OPCODE
},
8236 /* MOD_0F38F8_PREFIX_3 */
8237 { "enqcmd", { Gva
, M
}, PREFIX_OPCODE
},
8241 { "movdiri", { Edq
, Gdq
}, PREFIX_OPCODE
},
8244 /* MOD_0F38FA_PREFIX_1 */
8246 { "encodekey128", { Gd
, Ed
}, 0 },
8249 /* MOD_0F38FB_PREFIX_1 */
8251 { "encodekey256", { Gd
, Ed
}, 0 },
8254 /* MOD_0F3A0F_PREFIX_1 */
8256 { REG_TABLE (REG_0F3A0F_PREFIX_1_MOD_3
) },
8259 /* MOD_VEX_0F12_PREFIX_0 */
8260 { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_0
) },
8261 { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_1
) },
8264 /* MOD_VEX_0F12_PREFIX_2 */
8265 { VEX_LEN_TABLE (VEX_LEN_0F12_P_2_M_0
) },
8269 { VEX_LEN_TABLE (VEX_LEN_0F13_M_0
) },
8272 /* MOD_VEX_0F16_PREFIX_0 */
8273 { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_0
) },
8274 { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_1
) },
8277 /* MOD_VEX_0F16_PREFIX_2 */
8278 { VEX_LEN_TABLE (VEX_LEN_0F16_P_2_M_0
) },
8282 { VEX_LEN_TABLE (VEX_LEN_0F17_M_0
) },
8286 { "vmovntpX", { Mx
, XM
}, PREFIX_OPCODE
},
8289 /* MOD_VEX_0F41_L_1 */
8291 { VEX_W_TABLE (VEX_W_0F41_L_1_M_1
) },
8294 /* MOD_VEX_0F42_L_1 */
8296 { VEX_W_TABLE (VEX_W_0F42_L_1_M_1
) },
8299 /* MOD_VEX_0F44_L_0 */
8301 { VEX_W_TABLE (VEX_W_0F44_L_0_M_1
) },
8304 /* MOD_VEX_0F45_L_1 */
8306 { VEX_W_TABLE (VEX_W_0F45_L_1_M_1
) },
8309 /* MOD_VEX_0F46_L_1 */
8311 { VEX_W_TABLE (VEX_W_0F46_L_1_M_1
) },
8314 /* MOD_VEX_0F47_L_1 */
8316 { VEX_W_TABLE (VEX_W_0F47_L_1_M_1
) },
8319 /* MOD_VEX_0F4A_L_1 */
8321 { VEX_W_TABLE (VEX_W_0F4A_L_1_M_1
) },
8324 /* MOD_VEX_0F4B_L_1 */
8326 { VEX_W_TABLE (VEX_W_0F4B_L_1_M_1
) },
8331 { "vmovmskpX", { Gdq
, XS
}, PREFIX_OPCODE
},
8336 { REG_TABLE (REG_VEX_0F71_M_0
) },
8341 { REG_TABLE (REG_VEX_0F72_M_0
) },
8346 { REG_TABLE (REG_VEX_0F73_M_0
) },
8349 /* MOD_VEX_0F91_L_0 */
8350 { VEX_W_TABLE (VEX_W_0F91_L_0_M_0
) },
8353 /* MOD_VEX_0F92_L_0 */
8355 { VEX_W_TABLE (VEX_W_0F92_L_0_M_1
) },
8358 /* MOD_VEX_0F93_L_0 */
8360 { VEX_W_TABLE (VEX_W_0F93_L_0_M_1
) },
8363 /* MOD_VEX_0F98_L_0 */
8365 { VEX_W_TABLE (VEX_W_0F98_L_0_M_1
) },
8368 /* MOD_VEX_0F99_L_0 */
8370 { VEX_W_TABLE (VEX_W_0F99_L_0_M_1
) },
8373 /* MOD_VEX_0FAE_REG_2 */
8374 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_2_M_0
) },
8377 /* MOD_VEX_0FAE_REG_3 */
8378 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_3_M_0
) },
8383 { "vpmovmskb", { Gdq
, XS
}, PREFIX_DATA
},
8387 { "vmovntdq", { Mx
, XM
}, PREFIX_DATA
},
8390 /* MOD_VEX_0FF0_PREFIX_3 */
8391 { "vlddqu", { XM
, M
}, 0 },
8394 /* MOD_VEX_0F381A */
8395 { VEX_LEN_TABLE (VEX_LEN_0F381A_M_0
) },
8398 /* MOD_VEX_0F382A */
8399 { "vmovntdqa", { XM
, Mx
}, PREFIX_DATA
},
8402 /* MOD_VEX_0F382C */
8403 { VEX_W_TABLE (VEX_W_0F382C_M_0
) },
8406 /* MOD_VEX_0F382D */
8407 { VEX_W_TABLE (VEX_W_0F382D_M_0
) },
8410 /* MOD_VEX_0F382E */
8411 { VEX_W_TABLE (VEX_W_0F382E_M_0
) },
8414 /* MOD_VEX_0F382F */
8415 { VEX_W_TABLE (VEX_W_0F382F_M_0
) },
8418 /* MOD_VEX_0F3849_X86_64_P_0_W_0 */
8419 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_0_W_0_M_0
) },
8420 { REG_TABLE (REG_VEX_0F3849_X86_64_P_0_W_0_M_1
) },
8423 /* MOD_VEX_0F3849_X86_64_P_2_W_0 */
8424 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_2_W_0_M_0
) },
8427 /* MOD_VEX_0F3849_X86_64_P_3_W_0 */
8429 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_3_W_0_M_0
) },
8432 /* MOD_VEX_0F384B_X86_64_P_1_W_0 */
8433 { VEX_LEN_TABLE (VEX_LEN_0F384B_X86_64_P_1_W_0_M_0
) },
8436 /* MOD_VEX_0F384B_X86_64_P_2_W_0 */
8437 { VEX_LEN_TABLE (VEX_LEN_0F384B_X86_64_P_2_W_0_M_0
) },
8440 /* MOD_VEX_0F384B_X86_64_P_3_W_0 */
8441 { VEX_LEN_TABLE (VEX_LEN_0F384B_X86_64_P_3_W_0_M_0
) },
8444 /* MOD_VEX_0F385A */
8445 { VEX_LEN_TABLE (VEX_LEN_0F385A_M_0
) },
8448 /* MOD_VEX_0F385C_X86_64_P_1_W_0 */
8450 { VEX_LEN_TABLE (VEX_LEN_0F385C_X86_64_P_1_W_0_M_0
) },
8453 /* MOD_VEX_0F385E_X86_64_P_0_W_0 */
8455 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_0_W_0_M_0
) },
8458 /* MOD_VEX_0F385E_X86_64_P_1_W_0 */
8460 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_1_W_0_M_0
) },
8463 /* MOD_VEX_0F385E_X86_64_P_2_W_0 */
8465 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_2_W_0_M_0
) },
8468 /* MOD_VEX_0F385E_X86_64_P_3_W_0 */
8470 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_3_W_0_M_0
) },
8473 /* MOD_VEX_0F388C */
8474 { "vpmaskmov%DQ", { XM
, Vex
, Mx
}, PREFIX_DATA
},
8477 /* MOD_VEX_0F388E */
8478 { "vpmaskmov%DQ", { Mx
, Vex
, XM
}, PREFIX_DATA
},
8481 /* MOD_VEX_0F3A30_L_0 */
8483 { "kshiftr%BW", { MaskG
, MaskE
, Ib
}, PREFIX_DATA
},
8486 /* MOD_VEX_0F3A31_L_0 */
8488 { "kshiftr%DQ", { MaskG
, MaskE
, Ib
}, PREFIX_DATA
},
8491 /* MOD_VEX_0F3A32_L_0 */
8493 { "kshiftl%BW", { MaskG
, MaskE
, Ib
}, PREFIX_DATA
},
8496 /* MOD_VEX_0F3A33_L_0 */
8498 { "kshiftl%DQ", { MaskG
, MaskE
, Ib
}, PREFIX_DATA
},
8503 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_12_M_1
) },
8506 #include "i386-dis-evex-mod.h"
8509 static const struct dis386 rm_table
[][8] = {
8512 { "xabort", { Skip_MODRM
, Ib
}, 0 },
8516 { "xbeginT", { Skip_MODRM
, Jdqw
}, 0 },
8520 { "enclv", { Skip_MODRM
}, 0 },
8521 { "vmcall", { Skip_MODRM
}, 0 },
8522 { "vmlaunch", { Skip_MODRM
}, 0 },
8523 { "vmresume", { Skip_MODRM
}, 0 },
8524 { "vmxoff", { Skip_MODRM
}, 0 },
8525 { "pconfig", { Skip_MODRM
}, 0 },
8529 { "monitor", { { OP_Monitor
, 0 } }, 0 },
8530 { "mwait", { { OP_Mwait
, 0 } }, 0 },
8531 { "clac", { Skip_MODRM
}, 0 },
8532 { "stac", { Skip_MODRM
}, 0 },
8533 { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_4
) },
8534 { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_5
) },
8535 { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_6
) },
8536 { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_7
) },
8540 { "xgetbv", { Skip_MODRM
}, 0 },
8541 { "xsetbv", { Skip_MODRM
}, 0 },
8544 { "vmfunc", { Skip_MODRM
}, 0 },
8545 { "xend", { Skip_MODRM
}, 0 },
8546 { "xtest", { Skip_MODRM
}, 0 },
8547 { "enclu", { Skip_MODRM
}, 0 },
8551 { "vmrun", { Skip_MODRM
}, 0 },
8552 { PREFIX_TABLE (PREFIX_0F01_REG_3_RM_1
) },
8553 { "vmload", { Skip_MODRM
}, 0 },
8554 { "vmsave", { Skip_MODRM
}, 0 },
8555 { "stgi", { Skip_MODRM
}, 0 },
8556 { "clgi", { Skip_MODRM
}, 0 },
8557 { "skinit", { Skip_MODRM
}, 0 },
8558 { "invlpga", { Skip_MODRM
}, 0 },
8561 /* RM_0F01_REG_5_MOD_3 */
8562 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_0
) },
8563 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_1
) },
8564 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_2
) },
8566 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_4
) },
8567 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_5
) },
8568 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_6
) },
8569 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_7
) },
8572 /* RM_0F01_REG_7_MOD_3 */
8573 { "swapgs", { Skip_MODRM
}, 0 },
8574 { "rdtscp", { Skip_MODRM
}, 0 },
8575 { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_2
) },
8576 { "mwaitx", { { OP_Mwait
, eBX_reg
} }, PREFIX_OPCODE
},
8577 { "clzero", { Skip_MODRM
}, 0 },
8578 { "rdpru", { Skip_MODRM
}, 0 },
8579 { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_6
) },
8580 { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_7
) },
8583 /* RM_0F1E_P_1_MOD_3_REG_7 */
8584 { "nopQ", { Ev
}, PREFIX_IGNORED
},
8585 { "nopQ", { Ev
}, PREFIX_IGNORED
},
8586 { "endbr64", { Skip_MODRM
}, 0 },
8587 { "endbr32", { Skip_MODRM
}, 0 },
8588 { "nopQ", { Ev
}, PREFIX_IGNORED
},
8589 { "nopQ", { Ev
}, PREFIX_IGNORED
},
8590 { "nopQ", { Ev
}, PREFIX_IGNORED
},
8591 { "nopQ", { Ev
}, PREFIX_IGNORED
},
8594 /* RM_0FAE_REG_6_MOD_3 */
8595 { "mfence", { Skip_MODRM
}, 0 },
8598 /* RM_0FAE_REG_7_MOD_3 */
8599 { "sfence", { Skip_MODRM
}, 0 },
8602 /* RM_0F3A0F_P_1_MOD_3_REG_0 */
8603 { "hreset", { Skip_MODRM
, Ib
}, 0 },
8606 /* RM_VEX_0F3849_X86_64_P_0_W_0_M_1_R_0 */
8607 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_0_W_0_M_1_REG_0_RM_0
) },
8611 #define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
8613 /* We use the high bit to indicate different name for the same
8615 #define REP_PREFIX (0xf3 | 0x100)
8616 #define XACQUIRE_PREFIX (0xf2 | 0x200)
8617 #define XRELEASE_PREFIX (0xf3 | 0x400)
8618 #define BND_PREFIX (0xf2 | 0x400)
8619 #define NOTRACK_PREFIX (0x3e | 0x100)
8622 ckprefix (instr_info
*ins
)
8624 int newrex
, i
, length
;
8627 ins
->used_prefixes
= 0;
8630 ins
->last_lock_prefix
= -1;
8631 ins
->last_repz_prefix
= -1;
8632 ins
->last_repnz_prefix
= -1;
8633 ins
->last_data_prefix
= -1;
8634 ins
->last_addr_prefix
= -1;
8635 ins
->last_rex_prefix
= -1;
8636 ins
->last_seg_prefix
= -1;
8637 ins
->fwait_prefix
= -1;
8638 ins
->active_seg_prefix
= 0;
8639 for (i
= 0; i
< (int) ARRAY_SIZE (ins
->all_prefixes
); i
++)
8640 ins
->all_prefixes
[i
] = 0;
8643 /* The maximum instruction length is 15bytes. */
8644 while (length
< MAX_CODE_LENGTH
- 1)
8646 FETCH_DATA (ins
->info
, ins
->codep
+ 1);
8648 switch (*ins
->codep
)
8650 /* REX prefixes family. */
8667 if (ins
->address_mode
== mode_64bit
)
8668 newrex
= *ins
->codep
;
8671 ins
->last_rex_prefix
= i
;
8674 ins
->prefixes
|= PREFIX_REPZ
;
8675 ins
->last_repz_prefix
= i
;
8678 ins
->prefixes
|= PREFIX_REPNZ
;
8679 ins
->last_repnz_prefix
= i
;
8682 ins
->prefixes
|= PREFIX_LOCK
;
8683 ins
->last_lock_prefix
= i
;
8686 ins
->prefixes
|= PREFIX_CS
;
8687 ins
->last_seg_prefix
= i
;
8688 if (ins
->address_mode
!= mode_64bit
)
8689 ins
->active_seg_prefix
= PREFIX_CS
;
8692 ins
->prefixes
|= PREFIX_SS
;
8693 ins
->last_seg_prefix
= i
;
8694 if (ins
->address_mode
!= mode_64bit
)
8695 ins
->active_seg_prefix
= PREFIX_SS
;
8698 ins
->prefixes
|= PREFIX_DS
;
8699 ins
->last_seg_prefix
= i
;
8700 if (ins
->address_mode
!= mode_64bit
)
8701 ins
->active_seg_prefix
= PREFIX_DS
;
8704 ins
->prefixes
|= PREFIX_ES
;
8705 ins
->last_seg_prefix
= i
;
8706 if (ins
->address_mode
!= mode_64bit
)
8707 ins
->active_seg_prefix
= PREFIX_ES
;
8710 ins
->prefixes
|= PREFIX_FS
;
8711 ins
->last_seg_prefix
= i
;
8712 ins
->active_seg_prefix
= PREFIX_FS
;
8715 ins
->prefixes
|= PREFIX_GS
;
8716 ins
->last_seg_prefix
= i
;
8717 ins
->active_seg_prefix
= PREFIX_GS
;
8720 ins
->prefixes
|= PREFIX_DATA
;
8721 ins
->last_data_prefix
= i
;
8724 ins
->prefixes
|= PREFIX_ADDR
;
8725 ins
->last_addr_prefix
= i
;
8728 /* fwait is really an instruction. If there are prefixes
8729 before the fwait, they belong to the fwait, *not* to the
8730 following instruction. */
8731 ins
->fwait_prefix
= i
;
8732 if (ins
->prefixes
|| ins
->rex
)
8734 ins
->prefixes
|= PREFIX_FWAIT
;
8736 /* This ensures that the previous REX prefixes are noticed
8737 as unused prefixes, as in the return case below. */
8738 ins
->rex_used
= ins
->rex
;
8741 ins
->prefixes
= PREFIX_FWAIT
;
8746 /* Rex is ignored when followed by another prefix. */
8749 ins
->rex_used
= ins
->rex
;
8752 if (*ins
->codep
!= FWAIT_OPCODE
)
8753 ins
->all_prefixes
[i
++] = *ins
->codep
;
8761 /* Return the name of the prefix byte PREF, or NULL if PREF is not a
8765 prefix_name (instr_info
*ins
, int pref
, int sizeflag
)
8767 static const char *rexes
[16] =
8772 "rex.XB", /* 0x43 */
8774 "rex.RB", /* 0x45 */
8775 "rex.RX", /* 0x46 */
8776 "rex.RXB", /* 0x47 */
8778 "rex.WB", /* 0x49 */
8779 "rex.WX", /* 0x4a */
8780 "rex.WXB", /* 0x4b */
8781 "rex.WR", /* 0x4c */
8782 "rex.WRB", /* 0x4d */
8783 "rex.WRX", /* 0x4e */
8784 "rex.WRXB", /* 0x4f */
8789 /* REX prefixes family. */
8806 return rexes
[pref
- 0x40];
8826 return (sizeflag
& DFLAG
) ? "data16" : "data32";
8828 if (ins
->address_mode
== mode_64bit
)
8829 return (sizeflag
& AFLAG
) ? "addr32" : "addr64";
8831 return (sizeflag
& AFLAG
) ? "addr16" : "addr32";
8836 case XACQUIRE_PREFIX
:
8838 case XRELEASE_PREFIX
:
8842 case NOTRACK_PREFIX
:
8849 /* Here for backwards compatibility. When gdb stops using
8850 print_insn_i386_att and print_insn_i386_intel these functions can
8851 disappear, and print_insn_i386 be merged into print_insn. */
8853 print_insn_i386_att (bfd_vma pc
, disassemble_info
*info
)
8857 ins
.intel_syntax
= 0;
8859 return print_insn (pc
, &ins
);
8863 print_insn_i386_intel (bfd_vma pc
, disassemble_info
*info
)
8867 ins
.intel_syntax
= 1;
8869 return print_insn (pc
, &ins
);
8873 print_insn_i386 (bfd_vma pc
, disassemble_info
*info
)
8877 ins
.intel_syntax
= -1;
8879 return print_insn (pc
, &ins
);
8883 print_i386_disassembler_options (FILE *stream
)
8885 fprintf (stream
, _("\n\
8886 The following i386/x86-64 specific disassembler options are supported for use\n\
8887 with the -M switch (multiple options should be separated by commas):\n"));
8889 fprintf (stream
, _(" x86-64 Disassemble in 64bit mode\n"));
8890 fprintf (stream
, _(" i386 Disassemble in 32bit mode\n"));
8891 fprintf (stream
, _(" i8086 Disassemble in 16bit mode\n"));
8892 fprintf (stream
, _(" att Display instruction in AT&T syntax\n"));
8893 fprintf (stream
, _(" intel Display instruction in Intel syntax\n"));
8894 fprintf (stream
, _(" att-mnemonic\n"
8895 " Display instruction in AT&T mnemonic\n"));
8896 fprintf (stream
, _(" intel-mnemonic\n"
8897 " Display instruction in Intel mnemonic\n"));
8898 fprintf (stream
, _(" addr64 Assume 64bit address size\n"));
8899 fprintf (stream
, _(" addr32 Assume 32bit address size\n"));
8900 fprintf (stream
, _(" addr16 Assume 16bit address size\n"));
8901 fprintf (stream
, _(" data32 Assume 32bit data size\n"));
8902 fprintf (stream
, _(" data16 Assume 16bit data size\n"));
8903 fprintf (stream
, _(" suffix Always display instruction suffix in AT&T syntax\n"));
8904 fprintf (stream
, _(" amd64 Display instruction in AMD64 ISA\n"));
8905 fprintf (stream
, _(" intel64 Display instruction in Intel64 ISA\n"));
8909 static const struct dis386 bad_opcode
= { "(bad)", { XX
}, 0 };
8911 /* Get a pointer to struct dis386 with a valid name. */
8913 static const struct dis386
*
8914 get_valid_dis386 (const struct dis386
*dp
, instr_info
*ins
)
8916 int vindex
, vex_table_index
;
8918 if (dp
->name
!= NULL
)
8921 switch (dp
->op
[0].bytemode
)
8924 dp
= ®_table
[dp
->op
[1].bytemode
][ins
->modrm
.reg
];
8928 vindex
= ins
->modrm
.mod
== 0x3 ? 1 : 0;
8929 dp
= &mod_table
[dp
->op
[1].bytemode
][vindex
];
8933 dp
= &rm_table
[dp
->op
[1].bytemode
][ins
->modrm
.rm
];
8936 case USE_PREFIX_TABLE
:
8939 /* The prefix in VEX is implicit. */
8940 switch (ins
->vex
.prefix
)
8945 case REPE_PREFIX_OPCODE
:
8948 case DATA_PREFIX_OPCODE
:
8951 case REPNE_PREFIX_OPCODE
:
8961 int last_prefix
= -1;
8964 /* We check PREFIX_REPNZ and PREFIX_REPZ before PREFIX_DATA.
8965 When there are multiple PREFIX_REPNZ and PREFIX_REPZ, the
8967 if ((ins
->prefixes
& (PREFIX_REPZ
| PREFIX_REPNZ
)) != 0)
8969 if (ins
->last_repz_prefix
> ins
->last_repnz_prefix
)
8972 prefix
= PREFIX_REPZ
;
8973 last_prefix
= ins
->last_repz_prefix
;
8978 prefix
= PREFIX_REPNZ
;
8979 last_prefix
= ins
->last_repnz_prefix
;
8982 /* Check if prefix should be ignored. */
8983 if ((((prefix_table
[dp
->op
[1].bytemode
][vindex
].prefix_requirement
8984 & PREFIX_IGNORED
) >> PREFIX_IGNORED_SHIFT
)
8986 && !prefix_table
[dp
->op
[1].bytemode
][vindex
].name
)
8990 if (vindex
== 0 && (ins
->prefixes
& PREFIX_DATA
) != 0)
8993 prefix
= PREFIX_DATA
;
8994 last_prefix
= ins
->last_data_prefix
;
8999 ins
->used_prefixes
|= prefix
;
9000 ins
->all_prefixes
[last_prefix
] = 0;
9003 dp
= &prefix_table
[dp
->op
[1].bytemode
][vindex
];
9006 case USE_X86_64_TABLE
:
9007 vindex
= ins
->address_mode
== mode_64bit
? 1 : 0;
9008 dp
= &x86_64_table
[dp
->op
[1].bytemode
][vindex
];
9011 case USE_3BYTE_TABLE
:
9012 FETCH_DATA (ins
->info
, ins
->codep
+ 2);
9013 vindex
= *ins
->codep
++;
9014 dp
= &three_byte_table
[dp
->op
[1].bytemode
][vindex
];
9015 ins
->end_codep
= ins
->codep
;
9016 ins
->modrm
.mod
= (*ins
->codep
>> 6) & 3;
9017 ins
->modrm
.reg
= (*ins
->codep
>> 3) & 7;
9018 ins
->modrm
.rm
= *ins
->codep
& 7;
9021 case USE_VEX_LEN_TABLE
:
9025 switch (ins
->vex
.length
)
9031 /* This allows re-using in particular table entries where only
9032 128-bit operand size (VEX.L=0 / EVEX.L'L=0) are valid. */
9045 dp
= &vex_len_table
[dp
->op
[1].bytemode
][vindex
];
9048 case USE_EVEX_LEN_TABLE
:
9052 switch (ins
->vex
.length
)
9068 dp
= &evex_len_table
[dp
->op
[1].bytemode
][vindex
];
9071 case USE_XOP_8F_TABLE
:
9072 FETCH_DATA (ins
->info
, ins
->codep
+ 3);
9073 ins
->rex
= ~(*ins
->codep
>> 5) & 0x7;
9075 /* VEX_TABLE_INDEX is the mmmmm part of the XOP byte 1 "RCB.mmmmm". */
9076 switch ((*ins
->codep
& 0x1f))
9082 vex_table_index
= XOP_08
;
9085 vex_table_index
= XOP_09
;
9088 vex_table_index
= XOP_0A
;
9092 ins
->vex
.w
= *ins
->codep
& 0x80;
9093 if (ins
->vex
.w
&& ins
->address_mode
== mode_64bit
)
9096 ins
->vex
.register_specifier
= (~(*ins
->codep
>> 3)) & 0xf;
9097 if (ins
->address_mode
!= mode_64bit
)
9099 /* In 16/32-bit mode REX_B is silently ignored. */
9103 ins
->vex
.length
= (*ins
->codep
& 0x4) ? 256 : 128;
9104 switch ((*ins
->codep
& 0x3))
9109 ins
->vex
.prefix
= DATA_PREFIX_OPCODE
;
9112 ins
->vex
.prefix
= REPE_PREFIX_OPCODE
;
9115 ins
->vex
.prefix
= REPNE_PREFIX_OPCODE
;
9120 vindex
= *ins
->codep
++;
9121 dp
= &xop_table
[vex_table_index
][vindex
];
9123 ins
->end_codep
= ins
->codep
;
9124 FETCH_DATA (ins
->info
, ins
->codep
+ 1);
9125 ins
->modrm
.mod
= (*ins
->codep
>> 6) & 3;
9126 ins
->modrm
.reg
= (*ins
->codep
>> 3) & 7;
9127 ins
->modrm
.rm
= *ins
->codep
& 7;
9129 /* No XOP encoding so far allows for a non-zero embedded prefix. Avoid
9130 having to decode the bits for every otherwise valid encoding. */
9131 if (ins
->vex
.prefix
)
9135 case USE_VEX_C4_TABLE
:
9137 FETCH_DATA (ins
->info
, ins
->codep
+ 3);
9138 ins
->rex
= ~(*ins
->codep
>> 5) & 0x7;
9139 switch ((*ins
->codep
& 0x1f))
9145 vex_table_index
= VEX_0F
;
9148 vex_table_index
= VEX_0F38
;
9151 vex_table_index
= VEX_0F3A
;
9155 ins
->vex
.w
= *ins
->codep
& 0x80;
9156 if (ins
->address_mode
== mode_64bit
)
9163 /* For the 3-byte VEX prefix in 32-bit mode, the REX_B bit
9164 is ignored, other REX bits are 0 and the highest bit in
9165 VEX.vvvv is also ignored (but we mustn't clear it here). */
9168 ins
->vex
.register_specifier
= (~(*ins
->codep
>> 3)) & 0xf;
9169 ins
->vex
.length
= (*ins
->codep
& 0x4) ? 256 : 128;
9170 switch ((*ins
->codep
& 0x3))
9175 ins
->vex
.prefix
= DATA_PREFIX_OPCODE
;
9178 ins
->vex
.prefix
= REPE_PREFIX_OPCODE
;
9181 ins
->vex
.prefix
= REPNE_PREFIX_OPCODE
;
9186 vindex
= *ins
->codep
++;
9187 dp
= &vex_table
[vex_table_index
][vindex
];
9188 ins
->end_codep
= ins
->codep
;
9189 /* There is no MODRM byte for VEX0F 77. */
9190 if (vex_table_index
!= VEX_0F
|| vindex
!= 0x77)
9192 FETCH_DATA (ins
->info
, ins
->codep
+ 1);
9193 ins
->modrm
.mod
= (*ins
->codep
>> 6) & 3;
9194 ins
->modrm
.reg
= (*ins
->codep
>> 3) & 7;
9195 ins
->modrm
.rm
= *ins
->codep
& 7;
9199 case USE_VEX_C5_TABLE
:
9201 FETCH_DATA (ins
->info
, ins
->codep
+ 2);
9202 ins
->rex
= (*ins
->codep
& 0x80) ? 0 : REX_R
;
9204 /* For the 2-byte VEX prefix in 32-bit mode, the highest bit in
9206 ins
->vex
.register_specifier
= (~(*ins
->codep
>> 3)) & 0xf;
9207 ins
->vex
.length
= (*ins
->codep
& 0x4) ? 256 : 128;
9208 switch ((*ins
->codep
& 0x3))
9213 ins
->vex
.prefix
= DATA_PREFIX_OPCODE
;
9216 ins
->vex
.prefix
= REPE_PREFIX_OPCODE
;
9219 ins
->vex
.prefix
= REPNE_PREFIX_OPCODE
;
9224 vindex
= *ins
->codep
++;
9225 dp
= &vex_table
[dp
->op
[1].bytemode
][vindex
];
9226 ins
->end_codep
= ins
->codep
;
9227 /* There is no MODRM byte for VEX 77. */
9230 FETCH_DATA (ins
->info
, ins
->codep
+ 1);
9231 ins
->modrm
.mod
= (*ins
->codep
>> 6) & 3;
9232 ins
->modrm
.reg
= (*ins
->codep
>> 3) & 7;
9233 ins
->modrm
.rm
= *ins
->codep
& 7;
9237 case USE_VEX_W_TABLE
:
9241 dp
= &vex_w_table
[dp
->op
[1].bytemode
][ins
->vex
.w
? 1 : 0];
9244 case USE_EVEX_TABLE
:
9245 ins
->two_source_ops
= 0;
9248 FETCH_DATA (ins
->info
, ins
->codep
+ 4);
9249 /* The first byte after 0x62. */
9250 ins
->rex
= ~(*ins
->codep
>> 5) & 0x7;
9251 ins
->vex
.r
= *ins
->codep
& 0x10;
9252 switch ((*ins
->codep
& 0xf))
9257 vex_table_index
= EVEX_0F
;
9260 vex_table_index
= EVEX_0F38
;
9263 vex_table_index
= EVEX_0F3A
;
9266 vex_table_index
= EVEX_MAP5
;
9269 vex_table_index
= EVEX_MAP6
;
9273 /* The second byte after 0x62. */
9275 ins
->vex
.w
= *ins
->codep
& 0x80;
9276 if (ins
->vex
.w
&& ins
->address_mode
== mode_64bit
)
9279 ins
->vex
.register_specifier
= (~(*ins
->codep
>> 3)) & 0xf;
9282 if (!(*ins
->codep
& 0x4))
9285 switch ((*ins
->codep
& 0x3))
9290 ins
->vex
.prefix
= DATA_PREFIX_OPCODE
;
9293 ins
->vex
.prefix
= REPE_PREFIX_OPCODE
;
9296 ins
->vex
.prefix
= REPNE_PREFIX_OPCODE
;
9300 /* The third byte after 0x62. */
9303 /* Remember the static rounding bits. */
9304 ins
->vex
.ll
= (*ins
->codep
>> 5) & 3;
9305 ins
->vex
.b
= (*ins
->codep
& 0x10) != 0;
9307 ins
->vex
.v
= *ins
->codep
& 0x8;
9308 ins
->vex
.mask_register_specifier
= *ins
->codep
& 0x7;
9309 ins
->vex
.zeroing
= *ins
->codep
& 0x80;
9311 if (ins
->address_mode
!= mode_64bit
)
9313 /* In 16/32-bit mode silently ignore following bits. */
9320 vindex
= *ins
->codep
++;
9321 dp
= &evex_table
[vex_table_index
][vindex
];
9322 ins
->end_codep
= ins
->codep
;
9323 FETCH_DATA (ins
->info
, ins
->codep
+ 1);
9324 ins
->modrm
.mod
= (*ins
->codep
>> 6) & 3;
9325 ins
->modrm
.reg
= (*ins
->codep
>> 3) & 7;
9326 ins
->modrm
.rm
= *ins
->codep
& 7;
9328 /* Set vector length. */
9329 if (ins
->modrm
.mod
== 3 && ins
->vex
.b
)
9330 ins
->vex
.length
= 512;
9333 switch (ins
->vex
.ll
)
9336 ins
->vex
.length
= 128;
9339 ins
->vex
.length
= 256;
9342 ins
->vex
.length
= 512;
9358 if (dp
->name
!= NULL
)
9361 return get_valid_dis386 (dp
, ins
);
9365 get_sib (instr_info
*ins
, int sizeflag
)
9367 /* If modrm.mod == 3, operand must be register. */
9369 && ((sizeflag
& AFLAG
) || ins
->address_mode
== mode_64bit
)
9370 && ins
->modrm
.mod
!= 3
9371 && ins
->modrm
.rm
== 4)
9373 FETCH_DATA (ins
->info
, ins
->codep
+ 2);
9374 ins
->sib
.index
= (ins
->codep
[1] >> 3) & 7;
9375 ins
->sib
.scale
= (ins
->codep
[1] >> 6) & 3;
9376 ins
->sib
.base
= ins
->codep
[1] & 7;
9381 print_insn (bfd_vma pc
, instr_info
*ins
)
9383 const struct dis386
*dp
;
9385 char *op_txt
[MAX_OPERANDS
];
9387 int sizeflag
, orig_sizeflag
;
9389 struct dis_private priv
;
9393 ins
->intel_mnemonic
= !SYSV386_COMPAT
;
9394 ins
->op_is_jump
= false;
9395 priv
.orig_sizeflag
= AFLAG
| DFLAG
;
9396 if ((ins
->info
->mach
& bfd_mach_i386_i386
) != 0)
9397 ins
->address_mode
= mode_32bit
;
9398 else if (ins
->info
->mach
== bfd_mach_i386_i8086
)
9400 ins
->address_mode
= mode_16bit
;
9401 priv
.orig_sizeflag
= 0;
9404 ins
->address_mode
= mode_64bit
;
9406 if (ins
->intel_syntax
== (char) -1)
9407 ins
->intel_syntax
= (ins
->info
->mach
& bfd_mach_i386_intel_syntax
) != 0;
9409 for (p
= ins
->info
->disassembler_options
; p
!= NULL
;)
9411 if (startswith (p
, "amd64"))
9413 else if (startswith (p
, "intel64"))
9414 ins
->isa64
= intel64
;
9415 else if (startswith (p
, "x86-64"))
9417 ins
->address_mode
= mode_64bit
;
9418 priv
.orig_sizeflag
|= AFLAG
| DFLAG
;
9420 else if (startswith (p
, "i386"))
9422 ins
->address_mode
= mode_32bit
;
9423 priv
.orig_sizeflag
|= AFLAG
| DFLAG
;
9425 else if (startswith (p
, "i8086"))
9427 ins
->address_mode
= mode_16bit
;
9428 priv
.orig_sizeflag
&= ~(AFLAG
| DFLAG
);
9430 else if (startswith (p
, "intel"))
9432 ins
->intel_syntax
= 1;
9433 if (startswith (p
+ 5, "-mnemonic"))
9434 ins
->intel_mnemonic
= 1;
9436 else if (startswith (p
, "att"))
9438 ins
->intel_syntax
= 0;
9439 if (startswith (p
+ 3, "-mnemonic"))
9440 ins
->intel_mnemonic
= 0;
9442 else if (startswith (p
, "addr"))
9444 if (ins
->address_mode
== mode_64bit
)
9446 if (p
[4] == '3' && p
[5] == '2')
9447 priv
.orig_sizeflag
&= ~AFLAG
;
9448 else if (p
[4] == '6' && p
[5] == '4')
9449 priv
.orig_sizeflag
|= AFLAG
;
9453 if (p
[4] == '1' && p
[5] == '6')
9454 priv
.orig_sizeflag
&= ~AFLAG
;
9455 else if (p
[4] == '3' && p
[5] == '2')
9456 priv
.orig_sizeflag
|= AFLAG
;
9459 else if (startswith (p
, "data"))
9461 if (p
[4] == '1' && p
[5] == '6')
9462 priv
.orig_sizeflag
&= ~DFLAG
;
9463 else if (p
[4] == '3' && p
[5] == '2')
9464 priv
.orig_sizeflag
|= DFLAG
;
9466 else if (startswith (p
, "suffix"))
9467 priv
.orig_sizeflag
|= SUFFIX_ALWAYS
;
9469 p
= strchr (p
, ',');
9474 if (ins
->address_mode
== mode_64bit
&& sizeof (bfd_vma
) < 8)
9476 (*ins
->info
->fprintf_func
) (ins
->info
->stream
,
9477 _("64-bit address is disabled"));
9481 if (ins
->intel_syntax
)
9483 ins
->names64
= intel_names64
;
9484 ins
->names32
= intel_names32
;
9485 ins
->names16
= intel_names16
;
9486 ins
->names8
= intel_names8
;
9487 ins
->names8rex
= intel_names8rex
;
9488 ins
->names_seg
= intel_names_seg
;
9489 ins
->names_mm
= intel_names_mm
;
9490 ins
->names_bnd
= intel_names_bnd
;
9491 ins
->names_xmm
= intel_names_xmm
;
9492 ins
->names_ymm
= intel_names_ymm
;
9493 ins
->names_zmm
= intel_names_zmm
;
9494 ins
->names_tmm
= intel_names_tmm
;
9495 ins
->index64
= intel_index64
;
9496 ins
->index32
= intel_index32
;
9497 ins
->names_mask
= intel_names_mask
;
9498 ins
->index16
= intel_index16
;
9499 ins
->open_char
= '[';
9500 ins
->close_char
= ']';
9501 ins
->separator_char
= '+';
9502 ins
->scale_char
= '*';
9506 ins
->names64
= att_names64
;
9507 ins
->names32
= att_names32
;
9508 ins
->names16
= att_names16
;
9509 ins
->names8
= att_names8
;
9510 ins
->names8rex
= att_names8rex
;
9511 ins
->names_seg
= att_names_seg
;
9512 ins
->names_mm
= att_names_mm
;
9513 ins
->names_bnd
= att_names_bnd
;
9514 ins
->names_xmm
= att_names_xmm
;
9515 ins
->names_ymm
= att_names_ymm
;
9516 ins
->names_zmm
= att_names_zmm
;
9517 ins
->names_tmm
= att_names_tmm
;
9518 ins
->index64
= att_index64
;
9519 ins
->index32
= att_index32
;
9520 ins
->names_mask
= att_names_mask
;
9521 ins
->index16
= att_index16
;
9522 ins
->open_char
= '(';
9523 ins
->close_char
= ')';
9524 ins
->separator_char
= ',';
9525 ins
->scale_char
= ',';
9528 /* The output looks better if we put 7 bytes on a line, since that
9529 puts most long word instructions on a single line. Use 8 bytes
9531 if ((ins
->info
->mach
& bfd_mach_l1om
) != 0)
9532 ins
->info
->bytes_per_line
= 8;
9534 ins
->info
->bytes_per_line
= 7;
9536 ins
->info
->private_data
= &priv
;
9537 priv
.max_fetched
= priv
.the_buffer
;
9538 priv
.insn_start
= pc
;
9541 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
9543 ins
->op_out
[i
][0] = 0;
9544 ins
->op_index
[i
] = -1;
9548 ins
->start_codep
= priv
.the_buffer
;
9549 ins
->codep
= priv
.the_buffer
;
9551 if (OPCODES_SIGSETJMP (priv
.bailout
) != 0)
9555 /* Getting here means we tried for data but didn't get it. That
9556 means we have an incomplete instruction of some sort. Just
9557 print the first byte as a prefix or a .byte pseudo-op. */
9558 if (ins
->codep
> priv
.the_buffer
)
9560 name
= prefix_name (ins
, priv
.the_buffer
[0], priv
.orig_sizeflag
);
9562 (*ins
->info
->fprintf_func
) (ins
->info
->stream
, "%s", name
);
9565 /* Just print the first byte as a .byte instruction. */
9566 (*ins
->info
->fprintf_func
) (ins
->info
->stream
, ".byte 0x%x",
9567 (unsigned int) priv
.the_buffer
[0]);
9576 ins
->obufp
= ins
->obuf
;
9577 sizeflag
= priv
.orig_sizeflag
;
9579 if (!ckprefix (ins
) || ins
->rex_used
)
9581 /* Too many ins->prefixes or unused REX ins->prefixes. */
9583 i
< (int) ARRAY_SIZE (ins
->all_prefixes
) && ins
->all_prefixes
[i
];
9585 (*ins
->info
->fprintf_func
) (ins
->info
->stream
, "%s%s",
9587 prefix_name (ins
, ins
->all_prefixes
[i
],
9592 ins
->insn_codep
= ins
->codep
;
9594 FETCH_DATA (ins
->info
, ins
->codep
+ 1);
9595 ins
->two_source_ops
= (*ins
->codep
== 0x62) || (*ins
->codep
== 0xc8);
9597 if (((ins
->prefixes
& PREFIX_FWAIT
)
9598 && ((*ins
->codep
< 0xd8) || (*ins
->codep
> 0xdf))))
9600 /* Handle ins->prefixes before fwait. */
9601 for (i
= 0; i
< ins
->fwait_prefix
&& ins
->all_prefixes
[i
];
9603 (*ins
->info
->fprintf_func
) (ins
->info
->stream
, "%s ",
9604 prefix_name (ins
, ins
->all_prefixes
[i
],
9606 (*ins
->info
->fprintf_func
) (ins
->info
->stream
, "fwait");
9610 if (*ins
->codep
== 0x0f)
9612 unsigned char threebyte
;
9615 FETCH_DATA (ins
->info
, ins
->codep
+ 1);
9616 threebyte
= *ins
->codep
;
9617 dp
= &dis386_twobyte
[threebyte
];
9618 ins
->need_modrm
= twobyte_has_modrm
[threebyte
];
9623 dp
= &dis386
[*ins
->codep
];
9624 ins
->need_modrm
= onebyte_has_modrm
[*ins
->codep
];
9628 /* Save sizeflag for printing the extra ins->prefixes later before updating
9629 it for mnemonic and operand processing. The prefix names depend
9630 only on the address mode. */
9631 orig_sizeflag
= sizeflag
;
9632 if (ins
->prefixes
& PREFIX_ADDR
)
9634 if ((ins
->prefixes
& PREFIX_DATA
))
9637 ins
->end_codep
= ins
->codep
;
9638 if (ins
->need_modrm
)
9640 FETCH_DATA (ins
->info
, ins
->codep
+ 1);
9641 ins
->modrm
.mod
= (*ins
->codep
>> 6) & 3;
9642 ins
->modrm
.reg
= (*ins
->codep
>> 3) & 7;
9643 ins
->modrm
.rm
= *ins
->codep
& 7;
9646 memset (&ins
->modrm
, 0, sizeof (ins
->modrm
));
9649 memset (&ins
->vex
, 0, sizeof (ins
->vex
));
9651 if (dp
->name
== NULL
&& dp
->op
[0].bytemode
== FLOATCODE
)
9653 get_sib (ins
, sizeflag
);
9654 dofloat (ins
, sizeflag
);
9658 dp
= get_valid_dis386 (dp
, ins
);
9659 if (dp
!= NULL
&& putop (ins
, dp
->name
, sizeflag
) == 0)
9661 get_sib (ins
, sizeflag
);
9662 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
9664 ins
->obufp
= ins
->op_out
[i
];
9665 ins
->op_ad
= MAX_OPERANDS
- 1 - i
;
9667 (*dp
->op
[i
].rtn
) (ins
, dp
->op
[i
].bytemode
, sizeflag
);
9668 /* For EVEX instruction after the last operand masking
9669 should be printed. */
9670 if (i
== 0 && ins
->vex
.evex
)
9672 /* Don't print {%k0}. */
9673 if (ins
->vex
.mask_register_specifier
)
9677 ins
->names_mask
[ins
->vex
.mask_register_specifier
]);
9680 if (ins
->vex
.zeroing
)
9681 oappend (ins
, "{z}");
9683 /* S/G insns require a mask and don't allow
9685 if ((dp
->op
[0].bytemode
== vex_vsib_d_w_dq_mode
9686 || dp
->op
[0].bytemode
== vex_vsib_q_w_dq_mode
)
9687 && (ins
->vex
.mask_register_specifier
== 0
9688 || ins
->vex
.zeroing
))
9689 oappend (ins
, "/(bad)");
9693 /* Check whether rounding control was enabled for an insn not
9695 if (ins
->modrm
.mod
== 3 && ins
->vex
.b
9696 && !(ins
->evex_used
& EVEX_b_used
))
9698 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
9700 ins
->obufp
= ins
->op_out
[i
];
9703 oappend (ins
, names_rounding
[ins
->vex
.ll
]);
9704 oappend (ins
, "bad}");
9711 /* Clear instruction information. */
9712 ins
->info
->insn_info_valid
= 0;
9713 ins
->info
->branch_delay_insns
= 0;
9714 ins
->info
->data_size
= 0;
9715 ins
->info
->insn_type
= dis_noninsn
;
9716 ins
->info
->target
= 0;
9717 ins
->info
->target2
= 0;
9719 /* Reset jump operation indicator. */
9720 ins
->op_is_jump
= false;
9722 int jump_detection
= 0;
9724 /* Extract flags. */
9725 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
9727 if ((dp
->op
[i
].rtn
== OP_J
)
9728 || (dp
->op
[i
].rtn
== OP_indirE
))
9729 jump_detection
|= 1;
9730 else if ((dp
->op
[i
].rtn
== BND_Fixup
)
9731 || (!dp
->op
[i
].rtn
&& !dp
->op
[i
].bytemode
))
9732 jump_detection
|= 2;
9733 else if ((dp
->op
[i
].bytemode
== cond_jump_mode
)
9734 || (dp
->op
[i
].bytemode
== loop_jcxz_mode
))
9735 jump_detection
|= 4;
9738 /* Determine if this is a jump or branch. */
9739 if ((jump_detection
& 0x3) == 0x3)
9741 ins
->op_is_jump
= true;
9742 if (jump_detection
& 0x4)
9743 ins
->info
->insn_type
= dis_condbranch
;
9745 ins
->info
->insn_type
= (dp
->name
&& !strncmp (dp
->name
, "call", 4))
9746 ? dis_jsr
: dis_branch
;
9750 /* If VEX.vvvv and EVEX.vvvv are unused, they must be all 1s, which
9751 are all 0s in inverted form. */
9752 if (ins
->need_vex
&& ins
->vex
.register_specifier
!= 0)
9754 (*ins
->info
->fprintf_func
) (ins
->info
->stream
, "(bad)");
9755 return ins
->end_codep
- priv
.the_buffer
;
9758 /* If EVEX.z is set, there must be an actual mask register in use. */
9759 if (ins
->vex
.zeroing
&& ins
->vex
.mask_register_specifier
== 0)
9761 (*ins
->info
->fprintf_func
) (ins
->info
->stream
, "(bad)");
9762 return ins
->end_codep
- priv
.the_buffer
;
9765 switch (dp
->prefix_requirement
)
9768 /* If only the data prefix is marked as mandatory, its absence renders
9769 the encoding invalid. Most other PREFIX_OPCODE rules still apply. */
9770 if (ins
->need_vex
? !ins
->vex
.prefix
: !(ins
->prefixes
& PREFIX_DATA
))
9772 (*ins
->info
->fprintf_func
) (ins
->info
->stream
, "(bad)");
9773 return ins
->end_codep
- priv
.the_buffer
;
9775 ins
->used_prefixes
|= PREFIX_DATA
;
9778 /* If the mandatory PREFIX_REPZ/PREFIX_REPNZ/PREFIX_DATA prefix is
9779 unused, opcode is invalid. Since the PREFIX_DATA prefix may be
9780 used by putop and MMX/SSE operand and may be overridden by the
9781 PREFIX_REPZ/PREFIX_REPNZ fix, we check the PREFIX_DATA prefix
9784 ? ins
->vex
.prefix
== REPE_PREFIX_OPCODE
9785 || ins
->vex
.prefix
== REPNE_PREFIX_OPCODE
9787 & (PREFIX_REPZ
| PREFIX_REPNZ
)) != 0)
9788 && (ins
->used_prefixes
9789 & (PREFIX_REPZ
| PREFIX_REPNZ
)) == 0)
9791 ? ins
->vex
.prefix
== DATA_PREFIX_OPCODE
9793 & (PREFIX_REPZ
| PREFIX_REPNZ
| PREFIX_DATA
))
9795 && (ins
->used_prefixes
& PREFIX_DATA
) == 0))
9796 || (ins
->vex
.evex
&& dp
->prefix_requirement
!= PREFIX_DATA
9797 && !ins
->vex
.w
!= !(ins
->used_prefixes
& PREFIX_DATA
)))
9799 (*ins
->info
->fprintf_func
) (ins
->info
->stream
, "(bad)");
9800 return ins
->end_codep
- priv
.the_buffer
;
9804 case PREFIX_IGNORED
:
9805 /* Zap data size and rep prefixes from used_prefixes and reinstate their
9806 origins in all_prefixes. */
9807 ins
->used_prefixes
&= ~PREFIX_OPCODE
;
9808 if (ins
->last_data_prefix
>= 0)
9809 ins
->all_prefixes
[ins
->last_data_prefix
] = 0x66;
9810 if (ins
->last_repz_prefix
>= 0)
9811 ins
->all_prefixes
[ins
->last_repz_prefix
] = 0xf3;
9812 if (ins
->last_repnz_prefix
>= 0)
9813 ins
->all_prefixes
[ins
->last_repnz_prefix
] = 0xf2;
9817 /* Check if the REX prefix is used. */
9818 if ((ins
->rex
^ ins
->rex_used
) == 0
9819 && !ins
->need_vex
&& ins
->last_rex_prefix
>= 0)
9820 ins
->all_prefixes
[ins
->last_rex_prefix
] = 0;
9822 /* Check if the SEG prefix is used. */
9823 if ((ins
->prefixes
& (PREFIX_CS
| PREFIX_SS
| PREFIX_DS
| PREFIX_ES
9824 | PREFIX_FS
| PREFIX_GS
)) != 0
9825 && (ins
->used_prefixes
& ins
->active_seg_prefix
) != 0)
9826 ins
->all_prefixes
[ins
->last_seg_prefix
] = 0;
9828 /* Check if the ADDR prefix is used. */
9829 if ((ins
->prefixes
& PREFIX_ADDR
) != 0
9830 && (ins
->used_prefixes
& PREFIX_ADDR
) != 0)
9831 ins
->all_prefixes
[ins
->last_addr_prefix
] = 0;
9833 /* Check if the DATA prefix is used. */
9834 if ((ins
->prefixes
& PREFIX_DATA
) != 0
9835 && (ins
->used_prefixes
& PREFIX_DATA
) != 0
9837 ins
->all_prefixes
[ins
->last_data_prefix
] = 0;
9839 /* Print the extra ins->prefixes. */
9841 for (i
= 0; i
< (int) ARRAY_SIZE (ins
->all_prefixes
); i
++)
9842 if (ins
->all_prefixes
[i
])
9845 name
= prefix_name (ins
, ins
->all_prefixes
[i
], orig_sizeflag
);
9848 prefix_length
+= strlen (name
) + 1;
9849 (*ins
->info
->fprintf_func
) (ins
->info
->stream
, "%s ", name
);
9852 /* Check maximum code length. */
9853 if ((ins
->codep
- ins
->start_codep
) > MAX_CODE_LENGTH
)
9855 (*ins
->info
->fprintf_func
) (ins
->info
->stream
, "(bad)");
9856 return MAX_CODE_LENGTH
;
9859 ins
->obufp
= ins
->mnemonicendp
;
9860 for (i
= strlen (ins
->obuf
) + prefix_length
; i
< 6; i
++)
9863 (*ins
->info
->fprintf_func
) (ins
->info
->stream
, "%s", ins
->obuf
);
9865 /* The enter and bound instructions are printed with operands in the same
9866 order as the intel book; everything else is printed in reverse order. */
9867 if (ins
->intel_syntax
|| ins
->two_source_ops
)
9871 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
9872 op_txt
[i
] = ins
->op_out
[i
];
9874 if (ins
->intel_syntax
&& dp
&& dp
->op
[2].rtn
== OP_Rounding
9875 && dp
->op
[3].rtn
== OP_E
&& dp
->op
[4].rtn
== NULL
)
9877 op_txt
[2] = ins
->op_out
[3];
9878 op_txt
[3] = ins
->op_out
[2];
9881 for (i
= 0; i
< (MAX_OPERANDS
>> 1); ++i
)
9883 ins
->op_ad
= ins
->op_index
[i
];
9884 ins
->op_index
[i
] = ins
->op_index
[MAX_OPERANDS
- 1 - i
];
9885 ins
->op_index
[MAX_OPERANDS
- 1 - i
] = ins
->op_ad
;
9886 riprel
= ins
->op_riprel
[i
];
9887 ins
->op_riprel
[i
] = ins
->op_riprel
[MAX_OPERANDS
- 1 - i
];
9888 ins
->op_riprel
[MAX_OPERANDS
- 1 - i
] = riprel
;
9893 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
9894 op_txt
[MAX_OPERANDS
- 1 - i
] = ins
->op_out
[i
];
9898 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
9902 (*ins
->info
->fprintf_func
) (ins
->info
->stream
, ",");
9903 if (ins
->op_index
[i
] != -1 && !ins
->op_riprel
[i
])
9905 bfd_vma target
= (bfd_vma
) ins
->op_address
[ins
->op_index
[i
]];
9907 if (ins
->op_is_jump
)
9909 ins
->info
->insn_info_valid
= 1;
9910 ins
->info
->branch_delay_insns
= 0;
9911 ins
->info
->data_size
= 0;
9912 ins
->info
->target
= target
;
9913 ins
->info
->target2
= 0;
9915 (*ins
->info
->print_address_func
) (target
, ins
->info
);
9918 (*ins
->info
->fprintf_func
) (ins
->info
->stream
, "%s", op_txt
[i
]);
9922 for (i
= 0; i
< MAX_OPERANDS
; i
++)
9923 if (ins
->op_index
[i
] != -1 && ins
->op_riprel
[i
])
9925 (*ins
->info
->fprintf_func
) (ins
->info
->stream
, " # ");
9926 (*ins
->info
->print_address_func
) ((bfd_vma
)
9927 (ins
->start_pc
+ (ins
->codep
- ins
->start_codep
)
9928 + ins
->op_address
[ins
->op_index
[i
]]), ins
->info
);
9931 return ins
->codep
- priv
.the_buffer
;
9934 static const char *float_mem
[] = {
10009 static const unsigned char float_mem_mode
[] = {
10084 #define ST { OP_ST, 0 }
10085 #define STi { OP_STi, 0 }
10087 #define FGRPd9_2 NULL, { { NULL, 1 } }, 0
10088 #define FGRPd9_4 NULL, { { NULL, 2 } }, 0
10089 #define FGRPd9_5 NULL, { { NULL, 3 } }, 0
10090 #define FGRPd9_6 NULL, { { NULL, 4 } }, 0
10091 #define FGRPd9_7 NULL, { { NULL, 5 } }, 0
10092 #define FGRPda_5 NULL, { { NULL, 6 } }, 0
10093 #define FGRPdb_4 NULL, { { NULL, 7 } }, 0
10094 #define FGRPde_3 NULL, { { NULL, 8 } }, 0
10095 #define FGRPdf_4 NULL, { { NULL, 9 } }, 0
10097 static const struct dis386 float_reg
[][8] = {
10100 { "fadd", { ST
, STi
}, 0 },
10101 { "fmul", { ST
, STi
}, 0 },
10102 { "fcom", { STi
}, 0 },
10103 { "fcomp", { STi
}, 0 },
10104 { "fsub", { ST
, STi
}, 0 },
10105 { "fsubr", { ST
, STi
}, 0 },
10106 { "fdiv", { ST
, STi
}, 0 },
10107 { "fdivr", { ST
, STi
}, 0 },
10111 { "fld", { STi
}, 0 },
10112 { "fxch", { STi
}, 0 },
10122 { "fcmovb", { ST
, STi
}, 0 },
10123 { "fcmove", { ST
, STi
}, 0 },
10124 { "fcmovbe",{ ST
, STi
}, 0 },
10125 { "fcmovu", { ST
, STi
}, 0 },
10133 { "fcmovnb",{ ST
, STi
}, 0 },
10134 { "fcmovne",{ ST
, STi
}, 0 },
10135 { "fcmovnbe",{ ST
, STi
}, 0 },
10136 { "fcmovnu",{ ST
, STi
}, 0 },
10138 { "fucomi", { ST
, STi
}, 0 },
10139 { "fcomi", { ST
, STi
}, 0 },
10144 { "fadd", { STi
, ST
}, 0 },
10145 { "fmul", { STi
, ST
}, 0 },
10148 { "fsub{!M|r}", { STi
, ST
}, 0 },
10149 { "fsub{M|}", { STi
, ST
}, 0 },
10150 { "fdiv{!M|r}", { STi
, ST
}, 0 },
10151 { "fdiv{M|}", { STi
, ST
}, 0 },
10155 { "ffree", { STi
}, 0 },
10157 { "fst", { STi
}, 0 },
10158 { "fstp", { STi
}, 0 },
10159 { "fucom", { STi
}, 0 },
10160 { "fucomp", { STi
}, 0 },
10166 { "faddp", { STi
, ST
}, 0 },
10167 { "fmulp", { STi
, ST
}, 0 },
10170 { "fsub{!M|r}p", { STi
, ST
}, 0 },
10171 { "fsub{M|}p", { STi
, ST
}, 0 },
10172 { "fdiv{!M|r}p", { STi
, ST
}, 0 },
10173 { "fdiv{M|}p", { STi
, ST
}, 0 },
10177 { "ffreep", { STi
}, 0 },
10182 { "fucomip", { ST
, STi
}, 0 },
10183 { "fcomip", { ST
, STi
}, 0 },
10188 static char *fgrps
[][8] = {
10191 "(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10196 "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10201 "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
10206 "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
10211 "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
10216 "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
10221 "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10226 "fNeni(8087 only)","fNdisi(8087 only)","fNclex","fNinit",
10227 "fNsetpm(287 only)","frstpm(287 only)","(bad)","(bad)",
10232 "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10237 "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10242 swap_operand (instr_info
*ins
)
10244 ins
->mnemonicendp
[0] = '.';
10245 ins
->mnemonicendp
[1] = 's';
10246 ins
->mnemonicendp
[2] = '\0';
10247 ins
->mnemonicendp
+= 2;
10251 OP_Skip_MODRM (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
10252 int sizeflag ATTRIBUTE_UNUSED
)
10254 /* Skip mod/rm byte. */
10260 dofloat (instr_info
*ins
, int sizeflag
)
10262 const struct dis386
*dp
;
10263 unsigned char floatop
;
10265 floatop
= ins
->codep
[-1];
10267 if (ins
->modrm
.mod
!= 3)
10269 int fp_indx
= (floatop
- 0xd8) * 8 + ins
->modrm
.reg
;
10271 putop (ins
, float_mem
[fp_indx
], sizeflag
);
10272 ins
->obufp
= ins
->op_out
[0];
10274 OP_E (ins
, float_mem_mode
[fp_indx
], sizeflag
);
10277 /* Skip mod/rm byte. */
10281 dp
= &float_reg
[floatop
- 0xd8][ins
->modrm
.reg
];
10282 if (dp
->name
== NULL
)
10284 putop (ins
, fgrps
[dp
->op
[0].bytemode
][ins
->modrm
.rm
], sizeflag
);
10286 /* Instruction fnstsw is only one with strange arg. */
10287 if (floatop
== 0xdf && ins
->codep
[-1] == 0xe0)
10288 strcpy (ins
->op_out
[0], ins
->names16
[0]);
10292 putop (ins
, dp
->name
, sizeflag
);
10294 ins
->obufp
= ins
->op_out
[0];
10297 (*dp
->op
[0].rtn
) (ins
, dp
->op
[0].bytemode
, sizeflag
);
10299 ins
->obufp
= ins
->op_out
[1];
10302 (*dp
->op
[1].rtn
) (ins
, dp
->op
[1].bytemode
, sizeflag
);
10306 /* Like oappend (below), but S is a string starting with '%'.
10307 In Intel syntax, the '%' is elided. */
10309 oappend_maybe_intel (instr_info
*ins
, const char *s
)
10311 oappend (ins
, s
+ ins
->intel_syntax
);
10315 OP_ST (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
10316 int sizeflag ATTRIBUTE_UNUSED
)
10318 oappend_maybe_intel (ins
, "%st");
10322 OP_STi (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
10323 int sizeflag ATTRIBUTE_UNUSED
)
10325 sprintf (ins
->scratchbuf
, "%%st(%d)", ins
->modrm
.rm
);
10326 oappend_maybe_intel (ins
, ins
->scratchbuf
);
10329 /* Capital letters in template are macros. */
10331 putop (instr_info
*ins
, const char *in_template
, int sizeflag
)
10336 unsigned int l
= 0, len
= 0;
10339 for (p
= in_template
; *p
; p
++)
10343 if (l
>= sizeof (last
) || !ISUPPER (*p
))
10351 *ins
->obufp
++ = *p
;
10360 if (ins
->intel_syntax
)
10362 while (*++p
!= '|')
10363 if (*p
== '}' || *p
== '\0')
10369 while (*++p
!= '}')
10379 if (ins
->intel_syntax
)
10381 if ((ins
->need_modrm
&& ins
->modrm
.mod
!= 3)
10382 || (sizeflag
& SUFFIX_ALWAYS
))
10383 *ins
->obufp
++ = 'b';
10389 if (ins
->intel_syntax
)
10391 if (sizeflag
& SUFFIX_ALWAYS
)
10392 *ins
->obufp
++ = 'b';
10394 else if (l
== 1 && last
[0] == 'L')
10396 if (ins
->address_mode
== mode_64bit
10397 && !(ins
->prefixes
& PREFIX_ADDR
))
10399 *ins
->obufp
++ = 'a';
10400 *ins
->obufp
++ = 'b';
10401 *ins
->obufp
++ = 's';
10410 if (ins
->intel_syntax
&& !alt
)
10412 if ((ins
->prefixes
& PREFIX_DATA
) || (sizeflag
& SUFFIX_ALWAYS
))
10414 if (sizeflag
& DFLAG
)
10415 *ins
->obufp
++ = ins
->intel_syntax
? 'd' : 'l';
10417 *ins
->obufp
++ = ins
->intel_syntax
? 'w' : 's';
10418 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
10427 if (!ins
->vex
.evex
|| ins
->vex
.w
)
10428 *ins
->obufp
++ = 'd';
10430 oappend (ins
, "{bad}");
10439 if (ins
->intel_syntax
|| !(sizeflag
& SUFFIX_ALWAYS
))
10442 if (ins
->modrm
.mod
== 3)
10444 if (ins
->rex
& REX_W
)
10445 *ins
->obufp
++ = 'q';
10448 if (sizeflag
& DFLAG
)
10449 *ins
->obufp
++ = ins
->intel_syntax
? 'd' : 'l';
10451 *ins
->obufp
++ = 'w';
10452 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
10456 *ins
->obufp
++ = 'w';
10458 case 'E': /* For jcxz/jecxz */
10459 if (ins
->address_mode
== mode_64bit
)
10461 if (sizeflag
& AFLAG
)
10462 *ins
->obufp
++ = 'r';
10464 *ins
->obufp
++ = 'e';
10467 if (sizeflag
& AFLAG
)
10468 *ins
->obufp
++ = 'e';
10469 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_ADDR
);
10472 if (ins
->intel_syntax
)
10474 if ((ins
->prefixes
& PREFIX_ADDR
) || (sizeflag
& SUFFIX_ALWAYS
))
10476 if (sizeflag
& AFLAG
)
10477 *ins
->obufp
++ = ins
->address_mode
== mode_64bit
? 'q' : 'l';
10479 *ins
->obufp
++ = ins
->address_mode
== mode_64bit
? 'l' : 'w';
10480 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_ADDR
);
10484 if (ins
->intel_syntax
|| (ins
->obufp
[-1] != 's'
10485 && !(sizeflag
& SUFFIX_ALWAYS
)))
10487 if ((ins
->rex
& REX_W
) || (sizeflag
& DFLAG
))
10488 *ins
->obufp
++ = 'l';
10490 *ins
->obufp
++ = 'w';
10491 if (!(ins
->rex
& REX_W
))
10492 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
10497 if (ins
->intel_syntax
)
10499 if ((ins
->prefixes
& (PREFIX_CS
| PREFIX_DS
)) == PREFIX_CS
10500 || (ins
->prefixes
& (PREFIX_CS
| PREFIX_DS
)) == PREFIX_DS
)
10502 ins
->used_prefixes
|= ins
->prefixes
& (PREFIX_CS
| PREFIX_DS
);
10503 *ins
->obufp
++ = ',';
10504 *ins
->obufp
++ = 'p';
10506 /* Set active_seg_prefix even if not set in 64-bit mode
10507 because here it is a valid branch hint. */
10508 if (ins
->prefixes
& PREFIX_DS
)
10510 ins
->active_seg_prefix
= PREFIX_DS
;
10511 *ins
->obufp
++ = 't';
10515 ins
->active_seg_prefix
= PREFIX_CS
;
10516 *ins
->obufp
++ = 'n';
10520 else if (l
== 1 && last
[0] == 'X')
10522 if (ins
->vex
.w
== 0)
10523 *ins
->obufp
++ = 'h';
10525 oappend (ins
, "{bad}");
10532 if (ins
->rex
& REX_W
)
10533 *ins
->obufp
++ = 'q';
10535 *ins
->obufp
++ = 'd';
10540 if (ins
->intel_mnemonic
!= cond
)
10541 *ins
->obufp
++ = 'r';
10544 if ((ins
->prefixes
& PREFIX_FWAIT
) == 0)
10545 *ins
->obufp
++ = 'n';
10547 ins
->used_prefixes
|= PREFIX_FWAIT
;
10551 if (ins
->rex
& REX_W
)
10552 *ins
->obufp
++ = 'o';
10553 else if (ins
->intel_syntax
&& (sizeflag
& DFLAG
))
10554 *ins
->obufp
++ = 'q';
10556 *ins
->obufp
++ = 'd';
10557 if (!(ins
->rex
& REX_W
))
10558 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
10561 if (ins
->address_mode
== mode_64bit
10562 && (ins
->isa64
== intel64
|| (ins
->rex
& REX_W
)
10563 || !(ins
->prefixes
& PREFIX_DATA
)))
10565 if (sizeflag
& SUFFIX_ALWAYS
)
10566 *ins
->obufp
++ = 'q';
10569 /* Fall through. */
10573 if ((ins
->modrm
.mod
== 3 || !cond
)
10574 && !(sizeflag
& SUFFIX_ALWAYS
))
10576 /* Fall through. */
10578 if ((!(ins
->rex
& REX_W
) && (ins
->prefixes
& PREFIX_DATA
))
10579 || ((sizeflag
& SUFFIX_ALWAYS
)
10580 && ins
->address_mode
!= mode_64bit
))
10582 *ins
->obufp
++ = (sizeflag
& DFLAG
)
10583 ? ins
->intel_syntax
? 'd' : 'l' : 'w';
10584 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
10586 else if (sizeflag
& SUFFIX_ALWAYS
)
10587 *ins
->obufp
++ = 'q';
10589 else if (l
== 1 && last
[0] == 'L')
10591 if ((ins
->prefixes
& PREFIX_DATA
)
10592 || (ins
->rex
& REX_W
)
10593 || (sizeflag
& SUFFIX_ALWAYS
))
10596 if (ins
->rex
& REX_W
)
10597 *ins
->obufp
++ = 'q';
10600 if (sizeflag
& DFLAG
)
10601 *ins
->obufp
++ = ins
->intel_syntax
? 'd' : 'l';
10603 *ins
->obufp
++ = 'w';
10604 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
10614 if (ins
->intel_syntax
&& !alt
)
10617 if ((ins
->need_modrm
&& ins
->modrm
.mod
!= 3)
10618 || (sizeflag
& SUFFIX_ALWAYS
))
10620 if (ins
->rex
& REX_W
)
10621 *ins
->obufp
++ = 'q';
10624 if (sizeflag
& DFLAG
)
10625 *ins
->obufp
++ = ins
->intel_syntax
? 'd' : 'l';
10627 *ins
->obufp
++ = 'w';
10628 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
10632 else if (l
== 1 && last
[0] == 'D')
10633 *ins
->obufp
++ = ins
->vex
.w
? 'q' : 'd';
10634 else if (l
== 1 && last
[0] == 'L')
10636 if (cond
? ins
->modrm
.mod
== 3 && !(sizeflag
& SUFFIX_ALWAYS
)
10637 : ins
->address_mode
!= mode_64bit
)
10639 if ((ins
->rex
& REX_W
))
10642 *ins
->obufp
++ = 'q';
10644 else if ((ins
->address_mode
== mode_64bit
&& cond
)
10645 || (sizeflag
& SUFFIX_ALWAYS
))
10646 *ins
->obufp
++ = ins
->intel_syntax
? 'd' : 'l';
10653 if (ins
->rex
& REX_W
)
10654 *ins
->obufp
++ = 'q';
10655 else if (sizeflag
& DFLAG
)
10657 if (ins
->intel_syntax
)
10658 *ins
->obufp
++ = 'd';
10660 *ins
->obufp
++ = 'l';
10663 *ins
->obufp
++ = 'w';
10664 if (ins
->intel_syntax
&& !p
[1]
10665 && ((ins
->rex
& REX_W
) || (sizeflag
& DFLAG
)))
10666 *ins
->obufp
++ = 'e';
10667 if (!(ins
->rex
& REX_W
))
10668 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
10674 if (ins
->intel_syntax
)
10676 if (sizeflag
& SUFFIX_ALWAYS
)
10678 if (ins
->rex
& REX_W
)
10679 *ins
->obufp
++ = 'q';
10682 if (sizeflag
& DFLAG
)
10683 *ins
->obufp
++ = 'l';
10685 *ins
->obufp
++ = 'w';
10686 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
10696 if (ins
->address_mode
== mode_64bit
10697 && !(ins
->prefixes
& PREFIX_ADDR
))
10699 *ins
->obufp
++ = 'a';
10700 *ins
->obufp
++ = 'b';
10701 *ins
->obufp
++ = 's';
10706 if (!ins
->vex
.evex
|| !ins
->vex
.w
)
10707 *ins
->obufp
++ = 's';
10709 oappend (ins
, "{bad}");
10719 && (last
[0] == 'L' || last
[0] == 'X'))
10721 if (last
[0] == 'X')
10723 *ins
->obufp
++ = '{';
10724 *ins
->obufp
++ = 'v';
10725 *ins
->obufp
++ = 'e';
10726 *ins
->obufp
++ = 'x';
10727 *ins
->obufp
++ = '}';
10729 else if (ins
->rex
& REX_W
)
10731 *ins
->obufp
++ = 'a';
10732 *ins
->obufp
++ = 'b';
10733 *ins
->obufp
++ = 's';
10742 /* operand size flag for cwtl, cbtw */
10744 if (ins
->rex
& REX_W
)
10746 if (ins
->intel_syntax
)
10747 *ins
->obufp
++ = 'd';
10749 *ins
->obufp
++ = 'l';
10751 else if (sizeflag
& DFLAG
)
10752 *ins
->obufp
++ = 'w';
10754 *ins
->obufp
++ = 'b';
10755 if (!(ins
->rex
& REX_W
))
10756 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
10760 if (!ins
->need_vex
)
10762 if (last
[0] == 'X')
10763 *ins
->obufp
++ = ins
->vex
.w
? 'd': 's';
10764 else if (last
[0] == 'B')
10765 *ins
->obufp
++ = ins
->vex
.w
? 'w': 'b';
10776 ? ins
->vex
.prefix
== DATA_PREFIX_OPCODE
10777 : ins
->prefixes
& PREFIX_DATA
)
10779 *ins
->obufp
++ = 'd';
10780 ins
->used_prefixes
|= PREFIX_DATA
;
10783 *ins
->obufp
++ = 's';
10786 if (l
== 1 && last
[0] == 'X')
10788 if (!ins
->need_vex
)
10790 if (ins
->intel_syntax
10791 || ((ins
->modrm
.mod
== 3 || ins
->vex
.b
)
10792 && !(sizeflag
& SUFFIX_ALWAYS
)))
10794 switch (ins
->vex
.length
)
10797 *ins
->obufp
++ = 'x';
10800 *ins
->obufp
++ = 'y';
10803 if (!ins
->vex
.evex
)
10814 /* These insns ignore ModR/M.mod: Force it to 3 for OP_E(). */
10815 ins
->modrm
.mod
= 3;
10816 if (!ins
->intel_syntax
&& (sizeflag
& SUFFIX_ALWAYS
))
10817 *ins
->obufp
++ = ins
->address_mode
== mode_64bit
? 'q' : 'l';
10819 else if (l
== 1 && last
[0] == 'X')
10821 if (!ins
->vex
.evex
)
10823 if (ins
->intel_syntax
10824 || ((ins
->modrm
.mod
== 3 || ins
->vex
.b
)
10825 && !(sizeflag
& SUFFIX_ALWAYS
)))
10827 switch (ins
->vex
.length
)
10830 *ins
->obufp
++ = 'x';
10833 *ins
->obufp
++ = 'y';
10836 *ins
->obufp
++ = 'z';
10846 if (ins
->intel_syntax
)
10848 if (ins
->isa64
== intel64
&& (ins
->rex
& REX_W
))
10851 *ins
->obufp
++ = 'q';
10854 if ((ins
->prefixes
& PREFIX_DATA
) || (sizeflag
& SUFFIX_ALWAYS
))
10856 if (sizeflag
& DFLAG
)
10857 *ins
->obufp
++ = 'l';
10859 *ins
->obufp
++ = 'w';
10860 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
10869 ins
->mnemonicendp
= ins
->obufp
;
10874 oappend (instr_info
*ins
, const char *s
)
10876 ins
->obufp
= stpcpy (ins
->obufp
, s
);
10880 append_seg (instr_info
*ins
)
10882 /* Only print the active segment register. */
10883 if (!ins
->active_seg_prefix
)
10886 ins
->used_prefixes
|= ins
->active_seg_prefix
;
10887 switch (ins
->active_seg_prefix
)
10890 oappend_maybe_intel (ins
, "%cs:");
10893 oappend_maybe_intel (ins
, "%ds:");
10896 oappend_maybe_intel (ins
, "%ss:");
10899 oappend_maybe_intel (ins
, "%es:");
10902 oappend_maybe_intel (ins
, "%fs:");
10905 oappend_maybe_intel (ins
, "%gs:");
10913 OP_indirE (instr_info
*ins
, int bytemode
, int sizeflag
)
10915 if (!ins
->intel_syntax
)
10916 oappend (ins
, "*");
10917 OP_E (ins
, bytemode
, sizeflag
);
10921 print_operand_value (instr_info
*ins
, char *buf
, int hex
, bfd_vma disp
)
10923 if (ins
->address_mode
== mode_64bit
)
10931 sprintf_vma (tmp
, disp
);
10932 for (i
= 0; tmp
[i
] == '0' && tmp
[i
+ 1]; i
++);
10933 strcpy (buf
+ 2, tmp
+ i
);
10937 bfd_signed_vma v
= disp
;
10944 /* Check for possible overflow on 0x8000000000000000. */
10947 strcpy (buf
, "9223372036854775808");
10961 tmp
[28 - i
] = (v
% 10) + '0';
10965 strcpy (buf
, tmp
+ 29 - i
);
10971 sprintf (buf
, "0x%x", (unsigned int) disp
);
10973 sprintf (buf
, "%d", (int) disp
);
10977 /* Put DISP in BUF as signed hex number. */
10980 print_displacement (instr_info
*ins
, char *buf
, bfd_vma disp
)
10982 bfd_signed_vma val
= disp
;
10991 /* Check for possible overflow. */
10994 switch (ins
->address_mode
)
10997 strcpy (buf
+ j
, "0x8000000000000000");
11000 strcpy (buf
+ j
, "0x80000000");
11003 strcpy (buf
+ j
, "0x8000");
11013 sprintf_vma (tmp
, (bfd_vma
) val
);
11014 for (i
= 0; tmp
[i
] == '0'; i
++)
11016 if (tmp
[i
] == '\0')
11018 strcpy (buf
+ j
, tmp
+ i
);
11022 intel_operand_size (instr_info
*ins
, int bytemode
, int sizeflag
)
11026 if (!ins
->vex
.no_broadcast
)
11030 case evex_half_bcst_xmmq_mode
:
11032 oappend (ins
, "QWORD PTR ");
11034 oappend (ins
, "DWORD PTR ");
11037 case evex_half_bcst_xmmqh_mode
:
11038 case evex_half_bcst_xmmqdh_mode
:
11039 oappend (ins
, "WORD PTR ");
11042 ins
->vex
.no_broadcast
= 1;
11052 oappend (ins
, "BYTE PTR ");
11057 oappend (ins
, "WORD PTR ");
11060 if (ins
->address_mode
== mode_64bit
&& ins
->isa64
== intel64
)
11062 oappend (ins
, "QWORD PTR ");
11065 /* Fall through. */
11067 if (ins
->address_mode
== mode_64bit
&& ((sizeflag
& DFLAG
)
11068 || (ins
->rex
& REX_W
)))
11070 oappend (ins
, "QWORD PTR ");
11073 /* Fall through. */
11078 if (ins
->rex
& REX_W
)
11079 oappend (ins
, "QWORD PTR ");
11080 else if (bytemode
== dq_mode
)
11081 oappend (ins
, "DWORD PTR ");
11084 if (sizeflag
& DFLAG
)
11085 oappend (ins
, "DWORD PTR ");
11087 oappend (ins
, "WORD PTR ");
11088 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
11092 if ((ins
->rex
& REX_W
) || (sizeflag
& DFLAG
))
11093 *ins
->obufp
++ = 'D';
11094 oappend (ins
, "WORD PTR ");
11095 if (!(ins
->rex
& REX_W
))
11096 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
11099 if (sizeflag
& DFLAG
)
11100 oappend (ins
, "QWORD PTR ");
11102 oappend (ins
, "DWORD PTR ");
11103 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
11106 if (!(sizeflag
& DFLAG
) && ins
->isa64
== intel64
)
11107 oappend (ins
, "WORD PTR ");
11109 oappend (ins
, "DWORD PTR ");
11110 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
11114 oappend (ins
, "DWORD PTR ");
11118 oappend (ins
, "QWORD PTR ");
11121 if (ins
->address_mode
== mode_64bit
)
11122 oappend (ins
, "QWORD PTR ");
11124 oappend (ins
, "DWORD PTR ");
11127 if (sizeflag
& DFLAG
)
11128 oappend (ins
, "FWORD PTR ");
11130 oappend (ins
, "DWORD PTR ");
11131 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
11134 oappend (ins
, "TBYTE PTR ");
11139 case evex_x_gscat_mode
:
11140 case evex_x_nobcst_mode
:
11144 switch (ins
->vex
.length
)
11147 oappend (ins
, "XMMWORD PTR ");
11150 oappend (ins
, "YMMWORD PTR ");
11153 oappend (ins
, "ZMMWORD PTR ");
11160 oappend (ins
, "XMMWORD PTR ");
11163 oappend (ins
, "XMMWORD PTR ");
11166 oappend (ins
, "YMMWORD PTR ");
11169 case evex_half_bcst_xmmqh_mode
:
11170 case evex_half_bcst_xmmq_mode
:
11171 if (!ins
->need_vex
)
11174 switch (ins
->vex
.length
)
11177 oappend (ins
, "QWORD PTR ");
11180 oappend (ins
, "XMMWORD PTR ");
11183 oappend (ins
, "YMMWORD PTR ");
11190 if (!ins
->need_vex
)
11193 switch (ins
->vex
.length
)
11196 oappend (ins
, "WORD PTR ");
11199 oappend (ins
, "DWORD PTR ");
11202 oappend (ins
, "QWORD PTR ");
11209 case evex_half_bcst_xmmqdh_mode
:
11210 if (!ins
->need_vex
)
11213 switch (ins
->vex
.length
)
11216 oappend (ins
, "DWORD PTR ");
11219 oappend (ins
, "QWORD PTR ");
11222 oappend (ins
, "XMMWORD PTR ");
11229 if (!ins
->need_vex
)
11232 switch (ins
->vex
.length
)
11235 oappend (ins
, "QWORD PTR ");
11238 oappend (ins
, "YMMWORD PTR ");
11241 oappend (ins
, "ZMMWORD PTR ");
11248 oappend (ins
, "OWORD PTR ");
11250 case vex_vsib_d_w_dq_mode
:
11251 case vex_vsib_q_w_dq_mode
:
11252 if (!ins
->need_vex
)
11255 oappend (ins
, "QWORD PTR ");
11257 oappend (ins
, "DWORD PTR ");
11260 if (!ins
->need_vex
|| ins
->vex
.length
!= 128)
11263 oappend (ins
, "DWORD PTR ");
11265 oappend (ins
, "BYTE PTR ");
11268 if (!ins
->need_vex
)
11271 oappend (ins
, "QWORD PTR ");
11273 oappend (ins
, "WORD PTR ");
11283 print_register (instr_info
*ins
, unsigned int reg
, unsigned int rexmask
,
11284 int bytemode
, int sizeflag
)
11286 const char **names
;
11288 USED_REX (rexmask
);
11289 if (ins
->rex
& rexmask
)
11299 names
= ins
->names8rex
;
11301 names
= ins
->names8
;
11304 names
= ins
->names16
;
11309 names
= ins
->names32
;
11312 names
= ins
->names64
;
11316 names
= ins
->address_mode
== mode_64bit
? ins
->names64
: ins
->names32
;
11319 case bnd_swap_mode
:
11322 oappend (ins
, "(bad)");
11325 names
= ins
->names_bnd
;
11328 if (ins
->address_mode
== mode_64bit
&& ins
->isa64
== intel64
)
11330 names
= ins
->names64
;
11333 /* Fall through. */
11335 if (ins
->address_mode
== mode_64bit
&& ((sizeflag
& DFLAG
)
11336 || (ins
->rex
& REX_W
)))
11338 names
= ins
->names64
;
11342 /* Fall through. */
11347 if (ins
->rex
& REX_W
)
11348 names
= ins
->names64
;
11349 else if (bytemode
!= v_mode
&& bytemode
!= v_swap_mode
)
11350 names
= ins
->names32
;
11353 if (sizeflag
& DFLAG
)
11354 names
= ins
->names32
;
11356 names
= ins
->names16
;
11357 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
11361 if (!(sizeflag
& DFLAG
) && ins
->isa64
== intel64
)
11362 names
= ins
->names16
;
11364 names
= ins
->names32
;
11365 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
11368 names
= (ins
->address_mode
== mode_64bit
11369 ? ins
->names64
: ins
->names32
);
11370 if (!(ins
->prefixes
& PREFIX_ADDR
))
11371 names
= (ins
->address_mode
== mode_16bit
11372 ? ins
->names16
: names
);
11375 /* Remove "addr16/addr32". */
11376 ins
->all_prefixes
[ins
->last_addr_prefix
] = 0;
11377 names
= (ins
->address_mode
!= mode_32bit
11378 ? ins
->names32
: ins
->names16
);
11379 ins
->used_prefixes
|= PREFIX_ADDR
;
11386 oappend (ins
, "(bad)");
11389 names
= ins
->names_mask
;
11394 oappend (ins
, INTERNAL_DISASSEMBLER_ERROR
);
11397 oappend (ins
, names
[reg
]);
11401 OP_E_memory (instr_info
*ins
, int bytemode
, int sizeflag
)
11404 int add
= (ins
->rex
& REX_B
) ? 8 : 0;
11422 if (ins
->address_mode
!= mode_64bit
)
11430 case vex_vsib_d_w_dq_mode
:
11431 case vex_vsib_q_w_dq_mode
:
11432 case evex_x_gscat_mode
:
11433 shift
= ins
->vex
.w
? 3 : 2;
11436 case evex_half_bcst_xmmqh_mode
:
11437 case evex_half_bcst_xmmqdh_mode
:
11440 shift
= ins
->vex
.w
? 2 : 1;
11443 /* Fall through. */
11445 case evex_half_bcst_xmmq_mode
:
11448 shift
= ins
->vex
.w
? 3 : 2;
11451 /* Fall through. */
11456 case evex_x_nobcst_mode
:
11458 switch (ins
->vex
.length
)
11472 /* Make necessary corrections to shift for modes that need it. */
11473 if (bytemode
== xmmq_mode
11474 || bytemode
== evex_half_bcst_xmmqh_mode
11475 || bytemode
== evex_half_bcst_xmmq_mode
11476 || (bytemode
== ymmq_mode
&& ins
->vex
.length
== 128))
11478 else if (bytemode
== xmmqd_mode
11479 || bytemode
== evex_half_bcst_xmmqdh_mode
)
11481 else if (bytemode
== xmmdw_mode
)
11495 shift
= ins
->vex
.w
? 1 : 0;
11505 if (ins
->intel_syntax
)
11506 intel_operand_size (ins
, bytemode
, sizeflag
);
11509 if ((sizeflag
& AFLAG
) || ins
->address_mode
== mode_64bit
)
11511 /* 32/64 bit address mode */
11521 int addr32flag
= !((sizeflag
& AFLAG
)
11522 || bytemode
== v_bnd_mode
11523 || bytemode
== v_bndmk_mode
11524 || bytemode
== bnd_mode
11525 || bytemode
== bnd_swap_mode
);
11526 bool check_gather
= false;
11527 const char **indexes64
= ins
->names64
;
11528 const char **indexes32
= ins
->names32
;
11533 base
= ins
->modrm
.rm
;
11538 vindex
= ins
->sib
.index
;
11540 if (ins
->rex
& REX_X
)
11544 case vex_vsib_d_w_dq_mode
:
11545 case vex_vsib_q_w_dq_mode
:
11546 if (!ins
->need_vex
)
11552 check_gather
= ins
->obufp
== ins
->op_out
[1];
11556 switch (ins
->vex
.length
)
11559 indexes64
= indexes32
= ins
->names_xmm
;
11563 || bytemode
== vex_vsib_q_w_dq_mode
)
11564 indexes64
= indexes32
= ins
->names_ymm
;
11566 indexes64
= indexes32
= ins
->names_xmm
;
11570 || bytemode
== vex_vsib_q_w_dq_mode
)
11571 indexes64
= indexes32
= ins
->names_zmm
;
11573 indexes64
= indexes32
= ins
->names_ymm
;
11580 haveindex
= vindex
!= 4;
11583 scale
= ins
->sib
.scale
;
11584 base
= ins
->sib
.base
;
11589 /* Check for mandatory SIB. */
11590 if (bytemode
== vex_vsib_d_w_dq_mode
11591 || bytemode
== vex_vsib_q_w_dq_mode
11592 || bytemode
== vex_sibmem_mode
)
11594 oappend (ins
, "(bad)");
11598 rbase
= base
+ add
;
11600 switch (ins
->modrm
.mod
)
11606 if (ins
->address_mode
== mode_64bit
&& !havesib
)
11608 disp
= get32s (ins
);
11609 if (riprel
&& bytemode
== v_bndmk_mode
)
11611 oappend (ins
, "(bad)");
11617 FETCH_DATA (ins
->info
, ins
->codep
+ 1);
11618 disp
= *ins
->codep
++;
11619 if ((disp
& 0x80) != 0)
11621 if (ins
->vex
.evex
&& shift
> 0)
11625 disp
= get32s (ins
);
11634 && ins
->address_mode
!= mode_16bit
)
11636 if (ins
->address_mode
== mode_64bit
)
11640 /* Without base nor index registers, zero-extend the
11641 lower 32-bit displacement to 64 bits. */
11642 disp
= (unsigned int) disp
;
11649 /* In 32-bit mode, we need index register to tell [offset]
11650 from [eiz*1 + offset]. */
11655 havedisp
= (havebase
11657 || (havesib
&& (haveindex
|| scale
!= 0)));
11659 if (!ins
->intel_syntax
)
11660 if (ins
->modrm
.mod
!= 0 || base
== 5)
11662 if (havedisp
|| riprel
)
11663 print_displacement (ins
, ins
->scratchbuf
, disp
);
11665 print_operand_value (ins
, ins
->scratchbuf
, 1, disp
);
11666 oappend (ins
, ins
->scratchbuf
);
11669 set_op (ins
, disp
, 1);
11670 oappend (ins
, !addr32flag
? "(%rip)" : "(%eip)");
11674 if ((havebase
|| haveindex
|| needindex
|| needaddr32
|| riprel
)
11675 && (ins
->address_mode
!= mode_64bit
11676 || ((bytemode
!= v_bnd_mode
)
11677 && (bytemode
!= v_bndmk_mode
)
11678 && (bytemode
!= bnd_mode
)
11679 && (bytemode
!= bnd_swap_mode
))))
11680 ins
->used_prefixes
|= PREFIX_ADDR
;
11682 if (havedisp
|| (ins
->intel_syntax
&& riprel
))
11684 *ins
->obufp
++ = ins
->open_char
;
11685 if (ins
->intel_syntax
&& riprel
)
11687 set_op (ins
, disp
, 1);
11688 oappend (ins
, !addr32flag
? "rip" : "eip");
11690 *ins
->obufp
= '\0';
11692 oappend (ins
, ins
->address_mode
== mode_64bit
&& !addr32flag
11693 ? ins
->names64
[rbase
] : ins
->names32
[rbase
]);
11696 /* ESP/RSP won't allow index. If base isn't ESP/RSP,
11697 print index to tell base + index from base. */
11701 || (havebase
&& base
!= ESP_REG_NUM
))
11703 if (!ins
->intel_syntax
|| havebase
)
11705 *ins
->obufp
++ = ins
->separator_char
;
11706 *ins
->obufp
= '\0';
11710 if (ins
->address_mode
== mode_64bit
|| vindex
< 16)
11711 oappend (ins
, ins
->address_mode
== mode_64bit
11713 ? indexes64
[vindex
] : indexes32
[vindex
]);
11715 oappend (ins
, "(bad)");
11718 oappend (ins
, ins
->address_mode
== mode_64bit
&& !addr32flag
11719 ? ins
->index64
: ins
->index32
);
11721 *ins
->obufp
++ = ins
->scale_char
;
11722 *ins
->obufp
= '\0';
11723 sprintf (ins
->scratchbuf
, "%d", 1 << scale
);
11724 oappend (ins
, ins
->scratchbuf
);
11727 if (ins
->intel_syntax
11728 && (disp
|| ins
->modrm
.mod
!= 0 || base
== 5))
11730 if (!havedisp
|| (bfd_signed_vma
) disp
>= 0)
11732 *ins
->obufp
++ = '+';
11733 *ins
->obufp
= '\0';
11735 else if (ins
->modrm
.mod
!= 1 && disp
!= -disp
)
11737 *ins
->obufp
++ = '-';
11738 *ins
->obufp
= '\0';
11739 disp
= - (bfd_signed_vma
) disp
;
11743 print_displacement (ins
, ins
->scratchbuf
, disp
);
11745 print_operand_value (ins
, ins
->scratchbuf
, 1, disp
);
11746 oappend (ins
, ins
->scratchbuf
);
11749 *ins
->obufp
++ = ins
->close_char
;
11750 *ins
->obufp
= '\0';
11754 /* Both XMM/YMM/ZMM registers must be distinct. */
11755 int modrm_reg
= ins
->modrm
.reg
;
11757 if (ins
->rex
& REX_R
)
11761 if (vindex
== modrm_reg
)
11762 oappend (ins
, "/(bad)");
11765 else if (ins
->intel_syntax
)
11767 if (ins
->modrm
.mod
!= 0 || base
== 5)
11769 if (!ins
->active_seg_prefix
)
11771 oappend (ins
, ins
->names_seg
[ds_reg
- es_reg
]);
11772 oappend (ins
, ":");
11774 print_operand_value (ins
, ins
->scratchbuf
, 1, disp
);
11775 oappend (ins
, ins
->scratchbuf
);
11779 else if (bytemode
== v_bnd_mode
11780 || bytemode
== v_bndmk_mode
11781 || bytemode
== bnd_mode
11782 || bytemode
== bnd_swap_mode
11783 || bytemode
== vex_vsib_d_w_dq_mode
11784 || bytemode
== vex_vsib_q_w_dq_mode
)
11786 oappend (ins
, "(bad)");
11791 /* 16 bit address mode */
11792 ins
->used_prefixes
|= ins
->prefixes
& PREFIX_ADDR
;
11793 switch (ins
->modrm
.mod
)
11796 if (ins
->modrm
.rm
== 6)
11798 disp
= get16 (ins
);
11799 if ((disp
& 0x8000) != 0)
11804 FETCH_DATA (ins
->info
, ins
->codep
+ 1);
11805 disp
= *ins
->codep
++;
11806 if ((disp
& 0x80) != 0)
11808 if (ins
->vex
.evex
&& shift
> 0)
11812 disp
= get16 (ins
);
11813 if ((disp
& 0x8000) != 0)
11818 if (!ins
->intel_syntax
)
11819 if (ins
->modrm
.mod
!= 0 || ins
->modrm
.rm
== 6)
11821 print_displacement (ins
, ins
->scratchbuf
, disp
);
11822 oappend (ins
, ins
->scratchbuf
);
11825 if (ins
->modrm
.mod
!= 0 || ins
->modrm
.rm
!= 6)
11827 *ins
->obufp
++ = ins
->open_char
;
11828 *ins
->obufp
= '\0';
11829 oappend (ins
, ins
->index16
[ins
->modrm
.rm
]);
11830 if (ins
->intel_syntax
11831 && (disp
|| ins
->modrm
.mod
!= 0 || ins
->modrm
.rm
== 6))
11833 if ((bfd_signed_vma
) disp
>= 0)
11835 *ins
->obufp
++ = '+';
11836 *ins
->obufp
= '\0';
11838 else if (ins
->modrm
.mod
!= 1)
11840 *ins
->obufp
++ = '-';
11841 *ins
->obufp
= '\0';
11842 disp
= - (bfd_signed_vma
) disp
;
11845 print_displacement (ins
, ins
->scratchbuf
, disp
);
11846 oappend (ins
, ins
->scratchbuf
);
11849 *ins
->obufp
++ = ins
->close_char
;
11850 *ins
->obufp
= '\0';
11852 else if (ins
->intel_syntax
)
11854 if (!ins
->active_seg_prefix
)
11856 oappend (ins
, ins
->names_seg
[ds_reg
- es_reg
]);
11857 oappend (ins
, ":");
11859 print_operand_value (ins
, ins
->scratchbuf
, 1, disp
& 0xffff);
11860 oappend (ins
, ins
->scratchbuf
);
11865 ins
->evex_used
|= EVEX_b_used
;
11867 /* Broadcast can only ever be valid for memory sources. */
11868 if (ins
->obufp
== ins
->op_out
[0])
11869 ins
->vex
.no_broadcast
= 1;
11871 if (!ins
->vex
.no_broadcast
)
11873 if (bytemode
== xh_mode
)
11876 oappend (ins
, "{bad}");
11879 switch (ins
->vex
.length
)
11882 oappend (ins
, "{1to8}");
11885 oappend (ins
, "{1to16}");
11888 oappend (ins
, "{1to32}");
11895 else if (bytemode
== q_mode
11896 || bytemode
== ymmq_mode
)
11897 ins
->vex
.no_broadcast
= 1;
11898 else if (ins
->vex
.w
11899 || bytemode
== evex_half_bcst_xmmqdh_mode
11900 || bytemode
== evex_half_bcst_xmmq_mode
)
11902 switch (ins
->vex
.length
)
11905 oappend (ins
, "{1to2}");
11908 oappend (ins
, "{1to4}");
11911 oappend (ins
, "{1to8}");
11917 else if (bytemode
== x_mode
11918 || bytemode
== evex_half_bcst_xmmqh_mode
)
11920 switch (ins
->vex
.length
)
11923 oappend (ins
, "{1to4}");
11926 oappend (ins
, "{1to8}");
11929 oappend (ins
, "{1to16}");
11936 ins
->vex
.no_broadcast
= 1;
11938 if (ins
->vex
.no_broadcast
)
11939 oappend (ins
, "{bad}");
11944 OP_E (instr_info
*ins
, int bytemode
, int sizeflag
)
11946 /* Skip mod/rm byte. */
11950 if (ins
->modrm
.mod
== 3)
11952 if ((sizeflag
& SUFFIX_ALWAYS
)
11953 && (bytemode
== b_swap_mode
11954 || bytemode
== bnd_swap_mode
11955 || bytemode
== v_swap_mode
))
11956 swap_operand (ins
);
11958 print_register (ins
, ins
->modrm
.rm
, REX_B
, bytemode
, sizeflag
);
11961 OP_E_memory (ins
, bytemode
, sizeflag
);
11965 OP_G (instr_info
*ins
, int bytemode
, int sizeflag
)
11967 if (ins
->vex
.evex
&& !ins
->vex
.r
&& ins
->address_mode
== mode_64bit
)
11969 oappend (ins
, "(bad)");
11973 print_register (ins
, ins
->modrm
.reg
, REX_R
, bytemode
, sizeflag
);
11978 get64 (instr_info
*ins
)
11984 FETCH_DATA (ins
->info
, ins
->codep
+ 8);
11985 a
= *ins
->codep
++ & 0xff;
11986 a
|= (*ins
->codep
++ & 0xff) << 8;
11987 a
|= (*ins
->codep
++ & 0xff) << 16;
11988 a
|= (*ins
->codep
++ & 0xffu
) << 24;
11989 b
= *ins
->codep
++ & 0xff;
11990 b
|= (*ins
->codep
++ & 0xff) << 8;
11991 b
|= (*ins
->codep
++ & 0xff) << 16;
11992 b
|= (*ins
->codep
++ & 0xffu
) << 24;
11993 x
= a
+ ((bfd_vma
) b
<< 32);
11998 get64 (instr_info
*ins ATTRIBUTE_UNUSED
)
12005 static bfd_signed_vma
12006 get32 (instr_info
*ins
)
12008 bfd_signed_vma x
= 0;
12010 FETCH_DATA (ins
->info
, ins
->codep
+ 4);
12011 x
= *ins
->codep
++ & (bfd_signed_vma
) 0xff;
12012 x
|= (*ins
->codep
++ & (bfd_signed_vma
) 0xff) << 8;
12013 x
|= (*ins
->codep
++ & (bfd_signed_vma
) 0xff) << 16;
12014 x
|= (*ins
->codep
++ & (bfd_signed_vma
) 0xff) << 24;
12018 static bfd_signed_vma
12019 get32s (instr_info
*ins
)
12021 bfd_signed_vma x
= 0;
12023 FETCH_DATA (ins
->info
, ins
->codep
+ 4);
12024 x
= *ins
->codep
++ & (bfd_signed_vma
) 0xff;
12025 x
|= (*ins
->codep
++ & (bfd_signed_vma
) 0xff) << 8;
12026 x
|= (*ins
->codep
++ & (bfd_signed_vma
) 0xff) << 16;
12027 x
|= (*ins
->codep
++ & (bfd_signed_vma
) 0xff) << 24;
12029 x
= (x
^ ((bfd_signed_vma
) 1 << 31)) - ((bfd_signed_vma
) 1 << 31);
12035 get16 (instr_info
*ins
)
12039 FETCH_DATA (ins
->info
, ins
->codep
+ 2);
12040 x
= *ins
->codep
++ & 0xff;
12041 x
|= (*ins
->codep
++ & 0xff) << 8;
12046 set_op (instr_info
*ins
, bfd_vma op
, int riprel
)
12048 ins
->op_index
[ins
->op_ad
] = ins
->op_ad
;
12049 if (ins
->address_mode
== mode_64bit
)
12051 ins
->op_address
[ins
->op_ad
] = op
;
12052 ins
->op_riprel
[ins
->op_ad
] = riprel
;
12056 /* Mask to get a 32-bit address. */
12057 ins
->op_address
[ins
->op_ad
] = op
& 0xffffffff;
12058 ins
->op_riprel
[ins
->op_ad
] = riprel
& 0xffffffff;
12063 OP_REG (instr_info
*ins
, int code
, int sizeflag
)
12070 case es_reg
: case ss_reg
: case cs_reg
:
12071 case ds_reg
: case fs_reg
: case gs_reg
:
12072 oappend (ins
, ins
->names_seg
[code
- es_reg
]);
12077 if (ins
->rex
& REX_B
)
12084 case ax_reg
: case cx_reg
: case dx_reg
: case bx_reg
:
12085 case sp_reg
: case bp_reg
: case si_reg
: case di_reg
:
12086 s
= ins
->names16
[code
- ax_reg
+ add
];
12088 case ah_reg
: case ch_reg
: case dh_reg
: case bh_reg
:
12090 /* Fall through. */
12091 case al_reg
: case cl_reg
: case dl_reg
: case bl_reg
:
12093 s
= ins
->names8rex
[code
- al_reg
+ add
];
12095 s
= ins
->names8
[code
- al_reg
];
12097 case rAX_reg
: case rCX_reg
: case rDX_reg
: case rBX_reg
:
12098 case rSP_reg
: case rBP_reg
: case rSI_reg
: case rDI_reg
:
12099 if (ins
->address_mode
== mode_64bit
12100 && ((sizeflag
& DFLAG
) || (ins
->rex
& REX_W
)))
12102 s
= ins
->names64
[code
- rAX_reg
+ add
];
12105 code
+= eAX_reg
- rAX_reg
;
12106 /* Fall through. */
12107 case eAX_reg
: case eCX_reg
: case eDX_reg
: case eBX_reg
:
12108 case eSP_reg
: case eBP_reg
: case eSI_reg
: case eDI_reg
:
12110 if (ins
->rex
& REX_W
)
12111 s
= ins
->names64
[code
- eAX_reg
+ add
];
12114 if (sizeflag
& DFLAG
)
12115 s
= ins
->names32
[code
- eAX_reg
+ add
];
12117 s
= ins
->names16
[code
- eAX_reg
+ add
];
12118 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
12122 s
= INTERNAL_DISASSEMBLER_ERROR
;
12129 OP_IMREG (instr_info
*ins
, int code
, int sizeflag
)
12136 if (ins
->intel_syntax
)
12141 case al_reg
: case cl_reg
:
12142 s
= ins
->names8
[code
- al_reg
];
12146 if (ins
->rex
& REX_W
)
12151 /* Fall through. */
12152 case z_mode_ax_reg
:
12153 if ((ins
->rex
& REX_W
) || (sizeflag
& DFLAG
))
12157 if (!(ins
->rex
& REX_W
))
12158 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
12161 s
= INTERNAL_DISASSEMBLER_ERROR
;
12168 OP_I (instr_info
*ins
, int bytemode
, int sizeflag
)
12171 bfd_signed_vma mask
= -1;
12176 FETCH_DATA (ins
->info
, ins
->codep
+ 1);
12177 op
= *ins
->codep
++;
12182 if (ins
->rex
& REX_W
)
12186 if (sizeflag
& DFLAG
)
12196 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
12208 if (ins
->intel_syntax
)
12209 oappend (ins
, "1");
12212 oappend (ins
, INTERNAL_DISASSEMBLER_ERROR
);
12217 ins
->scratchbuf
[0] = '$';
12218 print_operand_value (ins
, ins
->scratchbuf
+ 1, 1, op
);
12219 oappend_maybe_intel (ins
, ins
->scratchbuf
);
12220 ins
->scratchbuf
[0] = '\0';
12224 OP_I64 (instr_info
*ins
, int bytemode
, int sizeflag
)
12226 if (bytemode
!= v_mode
|| ins
->address_mode
!= mode_64bit
12227 || !(ins
->rex
& REX_W
))
12229 OP_I (ins
, bytemode
, sizeflag
);
12235 ins
->scratchbuf
[0] = '$';
12236 print_operand_value (ins
, ins
->scratchbuf
+ 1, 1, get64 (ins
));
12237 oappend_maybe_intel (ins
, ins
->scratchbuf
);
12238 ins
->scratchbuf
[0] = '\0';
12242 OP_sI (instr_info
*ins
, int bytemode
, int sizeflag
)
12250 FETCH_DATA (ins
->info
, ins
->codep
+ 1);
12251 op
= *ins
->codep
++;
12252 if ((op
& 0x80) != 0)
12254 if (bytemode
== b_T_mode
)
12256 if (ins
->address_mode
!= mode_64bit
12257 || !((sizeflag
& DFLAG
) || (ins
->rex
& REX_W
)))
12259 /* The operand-size prefix is overridden by a REX prefix. */
12260 if ((sizeflag
& DFLAG
) || (ins
->rex
& REX_W
))
12268 if (!(ins
->rex
& REX_W
))
12270 if (sizeflag
& DFLAG
)
12278 /* The operand-size prefix is overridden by a REX prefix. */
12279 if ((sizeflag
& DFLAG
) || (ins
->rex
& REX_W
))
12285 oappend (ins
, INTERNAL_DISASSEMBLER_ERROR
);
12289 ins
->scratchbuf
[0] = '$';
12290 print_operand_value (ins
, ins
->scratchbuf
+ 1, 1, op
);
12291 oappend_maybe_intel (ins
, ins
->scratchbuf
);
12295 OP_J (instr_info
*ins
, int bytemode
, int sizeflag
)
12299 bfd_vma segment
= 0;
12304 FETCH_DATA (ins
->info
, ins
->codep
+ 1);
12305 disp
= *ins
->codep
++;
12306 if ((disp
& 0x80) != 0)
12311 if ((sizeflag
& DFLAG
)
12312 || (ins
->address_mode
== mode_64bit
12313 && ((ins
->isa64
== intel64
&& bytemode
!= dqw_mode
)
12314 || (ins
->rex
& REX_W
))))
12315 disp
= get32s (ins
);
12318 disp
= get16 (ins
);
12319 if ((disp
& 0x8000) != 0)
12321 /* In 16bit mode, address is wrapped around at 64k within
12322 the same segment. Otherwise, a data16 prefix on a jump
12323 instruction means that the pc is masked to 16 bits after
12324 the displacement is added! */
12326 if ((ins
->prefixes
& PREFIX_DATA
) == 0)
12327 segment
= ((ins
->start_pc
+ (ins
->codep
- ins
->start_codep
))
12328 & ~((bfd_vma
) 0xffff));
12330 if (ins
->address_mode
!= mode_64bit
12331 || (ins
->isa64
!= intel64
&& !(ins
->rex
& REX_W
)))
12332 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
12335 oappend (ins
, INTERNAL_DISASSEMBLER_ERROR
);
12338 disp
= ((ins
->start_pc
+ (ins
->codep
- ins
->start_codep
) + disp
) & mask
)
12340 set_op (ins
, disp
, 0);
12341 print_operand_value (ins
, ins
->scratchbuf
, 1, disp
);
12342 oappend (ins
, ins
->scratchbuf
);
12346 OP_SEG (instr_info
*ins
, int bytemode
, int sizeflag
)
12348 if (bytemode
== w_mode
)
12349 oappend (ins
, ins
->names_seg
[ins
->modrm
.reg
]);
12351 OP_E (ins
, ins
->modrm
.mod
== 3 ? bytemode
: w_mode
, sizeflag
);
12355 OP_DIR (instr_info
*ins
, int dummy ATTRIBUTE_UNUSED
, int sizeflag
)
12359 if (sizeflag
& DFLAG
)
12361 offset
= get32 (ins
);
12366 offset
= get16 (ins
);
12369 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
12370 if (ins
->intel_syntax
)
12371 sprintf (ins
->scratchbuf
, "0x%x:0x%x", seg
, offset
);
12373 sprintf (ins
->scratchbuf
, "$0x%x,$0x%x", seg
, offset
);
12374 oappend (ins
, ins
->scratchbuf
);
12378 OP_OFF (instr_info
*ins
, int bytemode
, int sizeflag
)
12382 if (ins
->intel_syntax
&& (sizeflag
& SUFFIX_ALWAYS
))
12383 intel_operand_size (ins
, bytemode
, sizeflag
);
12386 if ((sizeflag
& AFLAG
) || ins
->address_mode
== mode_64bit
)
12391 if (ins
->intel_syntax
)
12393 if (!ins
->active_seg_prefix
)
12395 oappend (ins
, ins
->names_seg
[ds_reg
- es_reg
]);
12396 oappend (ins
, ":");
12399 print_operand_value (ins
, ins
->scratchbuf
, 1, off
);
12400 oappend (ins
, ins
->scratchbuf
);
12404 OP_OFF64 (instr_info
*ins
, int bytemode
, int sizeflag
)
12408 if (ins
->address_mode
!= mode_64bit
12409 || (ins
->prefixes
& PREFIX_ADDR
))
12411 OP_OFF (ins
, bytemode
, sizeflag
);
12415 if (ins
->intel_syntax
&& (sizeflag
& SUFFIX_ALWAYS
))
12416 intel_operand_size (ins
, bytemode
, sizeflag
);
12421 if (ins
->intel_syntax
)
12423 if (!ins
->active_seg_prefix
)
12425 oappend (ins
, ins
->names_seg
[ds_reg
- es_reg
]);
12426 oappend (ins
, ":");
12429 print_operand_value (ins
, ins
->scratchbuf
, 1, off
);
12430 oappend (ins
, ins
->scratchbuf
);
12434 ptr_reg (instr_info
*ins
, int code
, int sizeflag
)
12438 *ins
->obufp
++ = ins
->open_char
;
12439 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_ADDR
);
12440 if (ins
->address_mode
== mode_64bit
)
12442 if (!(sizeflag
& AFLAG
))
12443 s
= ins
->names32
[code
- eAX_reg
];
12445 s
= ins
->names64
[code
- eAX_reg
];
12447 else if (sizeflag
& AFLAG
)
12448 s
= ins
->names32
[code
- eAX_reg
];
12450 s
= ins
->names16
[code
- eAX_reg
];
12452 *ins
->obufp
++ = ins
->close_char
;
12457 OP_ESreg (instr_info
*ins
, int code
, int sizeflag
)
12459 if (ins
->intel_syntax
)
12461 switch (ins
->codep
[-1])
12463 case 0x6d: /* insw/insl */
12464 intel_operand_size (ins
, z_mode
, sizeflag
);
12466 case 0xa5: /* movsw/movsl/movsq */
12467 case 0xa7: /* cmpsw/cmpsl/cmpsq */
12468 case 0xab: /* stosw/stosl */
12469 case 0xaf: /* scasw/scasl */
12470 intel_operand_size (ins
, v_mode
, sizeflag
);
12473 intel_operand_size (ins
, b_mode
, sizeflag
);
12476 oappend_maybe_intel (ins
, "%es:");
12477 ptr_reg (ins
, code
, sizeflag
);
12481 OP_DSreg (instr_info
*ins
, int code
, int sizeflag
)
12483 if (ins
->intel_syntax
)
12485 switch (ins
->codep
[-1])
12487 case 0x6f: /* outsw/outsl */
12488 intel_operand_size (ins
, z_mode
, sizeflag
);
12490 case 0xa5: /* movsw/movsl/movsq */
12491 case 0xa7: /* cmpsw/cmpsl/cmpsq */
12492 case 0xad: /* lodsw/lodsl/lodsq */
12493 intel_operand_size (ins
, v_mode
, sizeflag
);
12496 intel_operand_size (ins
, b_mode
, sizeflag
);
12499 /* Set ins->active_seg_prefix to PREFIX_DS if it is unset so that the
12500 default segment register DS is printed. */
12501 if (!ins
->active_seg_prefix
)
12502 ins
->active_seg_prefix
= PREFIX_DS
;
12504 ptr_reg (ins
, code
, sizeflag
);
12508 OP_C (instr_info
*ins
, int dummy ATTRIBUTE_UNUSED
,
12509 int sizeflag ATTRIBUTE_UNUSED
)
12512 if (ins
->rex
& REX_R
)
12517 else if (ins
->address_mode
!= mode_64bit
&& (ins
->prefixes
& PREFIX_LOCK
))
12519 ins
->all_prefixes
[ins
->last_lock_prefix
] = 0;
12520 ins
->used_prefixes
|= PREFIX_LOCK
;
12525 sprintf (ins
->scratchbuf
, "%%cr%d", ins
->modrm
.reg
+ add
);
12526 oappend_maybe_intel (ins
, ins
->scratchbuf
);
12530 OP_D (instr_info
*ins
, int dummy ATTRIBUTE_UNUSED
,
12531 int sizeflag ATTRIBUTE_UNUSED
)
12535 if (ins
->rex
& REX_R
)
12539 if (ins
->intel_syntax
)
12540 sprintf (ins
->scratchbuf
, "dr%d", ins
->modrm
.reg
+ add
);
12542 sprintf (ins
->scratchbuf
, "%%db%d", ins
->modrm
.reg
+ add
);
12543 oappend (ins
, ins
->scratchbuf
);
12547 OP_T (instr_info
*ins
, int dummy ATTRIBUTE_UNUSED
,
12548 int sizeflag ATTRIBUTE_UNUSED
)
12550 sprintf (ins
->scratchbuf
, "%%tr%d", ins
->modrm
.reg
);
12551 oappend_maybe_intel (ins
, ins
->scratchbuf
);
12555 OP_MMX (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
12556 int sizeflag ATTRIBUTE_UNUSED
)
12558 int reg
= ins
->modrm
.reg
;
12559 const char **names
;
12561 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
12562 if (ins
->prefixes
& PREFIX_DATA
)
12564 names
= ins
->names_xmm
;
12566 if (ins
->rex
& REX_R
)
12570 names
= ins
->names_mm
;
12571 oappend (ins
, names
[reg
]);
12575 print_vector_reg (instr_info
*ins
, unsigned int reg
, int bytemode
)
12577 const char **names
;
12579 if (bytemode
== xmmq_mode
12580 || bytemode
== evex_half_bcst_xmmqh_mode
12581 || bytemode
== evex_half_bcst_xmmq_mode
)
12583 switch (ins
->vex
.length
)
12587 names
= ins
->names_xmm
;
12590 names
= ins
->names_ymm
;
12596 else if (bytemode
== ymm_mode
)
12597 names
= ins
->names_ymm
;
12598 else if (bytemode
== tmm_mode
)
12602 oappend (ins
, "(bad)");
12605 names
= ins
->names_tmm
;
12607 else if (ins
->need_vex
12608 && bytemode
!= xmm_mode
12609 && bytemode
!= scalar_mode
12610 && bytemode
!= xmmdw_mode
12611 && bytemode
!= xmmqd_mode
12612 && bytemode
!= evex_half_bcst_xmmqdh_mode
12613 && bytemode
!= w_swap_mode
12614 && bytemode
!= b_mode
12615 && bytemode
!= w_mode
12616 && bytemode
!= d_mode
12617 && bytemode
!= q_mode
)
12619 switch (ins
->vex
.length
)
12622 names
= ins
->names_xmm
;
12626 || bytemode
!= vex_vsib_q_w_dq_mode
)
12627 names
= ins
->names_ymm
;
12629 names
= ins
->names_xmm
;
12633 || bytemode
!= vex_vsib_q_w_dq_mode
)
12634 names
= ins
->names_zmm
;
12636 names
= ins
->names_ymm
;
12643 names
= ins
->names_xmm
;
12644 oappend (ins
, names
[reg
]);
12648 OP_XMM (instr_info
*ins
, int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
12650 unsigned int reg
= ins
->modrm
.reg
;
12653 if (ins
->rex
& REX_R
)
12661 if (bytemode
== tmm_mode
)
12662 ins
->modrm
.reg
= reg
;
12663 else if (bytemode
== scalar_mode
)
12664 ins
->vex
.no_broadcast
= 1;
12666 print_vector_reg (ins
, reg
, bytemode
);
12670 OP_EM (instr_info
*ins
, int bytemode
, int sizeflag
)
12673 const char **names
;
12675 if (ins
->modrm
.mod
!= 3)
12677 if (ins
->intel_syntax
12678 && (bytemode
== v_mode
|| bytemode
== v_swap_mode
))
12680 bytemode
= (ins
->prefixes
& PREFIX_DATA
) ? x_mode
: q_mode
;
12681 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
12683 OP_E (ins
, bytemode
, sizeflag
);
12687 if ((sizeflag
& SUFFIX_ALWAYS
) && bytemode
== v_swap_mode
)
12688 swap_operand (ins
);
12690 /* Skip mod/rm byte. */
12693 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
12694 reg
= ins
->modrm
.rm
;
12695 if (ins
->prefixes
& PREFIX_DATA
)
12697 names
= ins
->names_xmm
;
12699 if (ins
->rex
& REX_B
)
12703 names
= ins
->names_mm
;
12704 oappend (ins
, names
[reg
]);
12707 /* cvt* are the only instructions in sse2 which have
12708 both SSE and MMX operands and also have 0x66 prefix
12709 in their opcode. 0x66 was originally used to differentiate
12710 between SSE and MMX instruction(operands). So we have to handle the
12711 cvt* separately using OP_EMC and OP_MXC */
12713 OP_EMC (instr_info
*ins
, int bytemode
, int sizeflag
)
12715 if (ins
->modrm
.mod
!= 3)
12717 if (ins
->intel_syntax
&& bytemode
== v_mode
)
12719 bytemode
= (ins
->prefixes
& PREFIX_DATA
) ? x_mode
: q_mode
;
12720 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
12722 OP_E (ins
, bytemode
, sizeflag
);
12726 /* Skip mod/rm byte. */
12729 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
12730 oappend (ins
, ins
->names_mm
[ins
->modrm
.rm
]);
12734 OP_MXC (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
12735 int sizeflag ATTRIBUTE_UNUSED
)
12737 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
12738 oappend (ins
, ins
->names_mm
[ins
->modrm
.reg
]);
12742 OP_EX (instr_info
*ins
, int bytemode
, int sizeflag
)
12746 /* Skip mod/rm byte. */
12750 if (bytemode
== dq_mode
)
12751 bytemode
= ins
->vex
.w
? q_mode
: d_mode
;
12753 if (ins
->modrm
.mod
!= 3)
12755 OP_E_memory (ins
, bytemode
, sizeflag
);
12759 reg
= ins
->modrm
.rm
;
12761 if (ins
->rex
& REX_B
)
12766 if ((ins
->rex
& REX_X
))
12770 if ((sizeflag
& SUFFIX_ALWAYS
)
12771 && (bytemode
== x_swap_mode
12772 || bytemode
== w_swap_mode
12773 || bytemode
== d_swap_mode
12774 || bytemode
== q_swap_mode
))
12775 swap_operand (ins
);
12777 if (bytemode
== tmm_mode
)
12778 ins
->modrm
.rm
= reg
;
12780 print_vector_reg (ins
, reg
, bytemode
);
12784 OP_MS (instr_info
*ins
, int bytemode
, int sizeflag
)
12786 if (ins
->modrm
.mod
== 3)
12787 OP_EM (ins
, bytemode
, sizeflag
);
12793 OP_XS (instr_info
*ins
, int bytemode
, int sizeflag
)
12795 if (ins
->modrm
.mod
== 3)
12796 OP_EX (ins
, bytemode
, sizeflag
);
12802 OP_M (instr_info
*ins
, int bytemode
, int sizeflag
)
12804 if (ins
->modrm
.mod
== 3)
12805 /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
12808 OP_E (ins
, bytemode
, sizeflag
);
12812 OP_0f07 (instr_info
*ins
, int bytemode
, int sizeflag
)
12814 if (ins
->modrm
.mod
!= 3 || ins
->modrm
.rm
!= 0)
12817 OP_E (ins
, bytemode
, sizeflag
);
12820 /* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
12821 32bit mode and "xchg %rax,%rax" in 64bit mode. */
12824 NOP_Fixup1 (instr_info
*ins
, int bytemode
, int sizeflag
)
12826 if ((ins
->prefixes
& PREFIX_DATA
) != 0
12828 && ins
->rex
!= 0x48
12829 && ins
->address_mode
== mode_64bit
))
12830 OP_REG (ins
, bytemode
, sizeflag
);
12832 strcpy (ins
->obuf
, "nop");
12836 NOP_Fixup2 (instr_info
*ins
, int bytemode
, int sizeflag
)
12838 if ((ins
->prefixes
& PREFIX_DATA
) != 0
12840 && ins
->rex
!= 0x48
12841 && ins
->address_mode
== mode_64bit
))
12842 OP_IMREG (ins
, bytemode
, sizeflag
);
12845 static const char *const Suffix3DNow
[] = {
12846 /* 00 */ NULL
, NULL
, NULL
, NULL
,
12847 /* 04 */ NULL
, NULL
, NULL
, NULL
,
12848 /* 08 */ NULL
, NULL
, NULL
, NULL
,
12849 /* 0C */ "pi2fw", "pi2fd", NULL
, NULL
,
12850 /* 10 */ NULL
, NULL
, NULL
, NULL
,
12851 /* 14 */ NULL
, NULL
, NULL
, NULL
,
12852 /* 18 */ NULL
, NULL
, NULL
, NULL
,
12853 /* 1C */ "pf2iw", "pf2id", NULL
, NULL
,
12854 /* 20 */ NULL
, NULL
, NULL
, NULL
,
12855 /* 24 */ NULL
, NULL
, NULL
, NULL
,
12856 /* 28 */ NULL
, NULL
, NULL
, NULL
,
12857 /* 2C */ NULL
, NULL
, NULL
, NULL
,
12858 /* 30 */ NULL
, NULL
, NULL
, NULL
,
12859 /* 34 */ NULL
, NULL
, NULL
, NULL
,
12860 /* 38 */ NULL
, NULL
, NULL
, NULL
,
12861 /* 3C */ NULL
, NULL
, NULL
, NULL
,
12862 /* 40 */ NULL
, NULL
, NULL
, NULL
,
12863 /* 44 */ NULL
, NULL
, NULL
, NULL
,
12864 /* 48 */ NULL
, NULL
, NULL
, NULL
,
12865 /* 4C */ NULL
, NULL
, NULL
, NULL
,
12866 /* 50 */ NULL
, NULL
, NULL
, NULL
,
12867 /* 54 */ NULL
, NULL
, NULL
, NULL
,
12868 /* 58 */ NULL
, NULL
, NULL
, NULL
,
12869 /* 5C */ NULL
, NULL
, NULL
, NULL
,
12870 /* 60 */ NULL
, NULL
, NULL
, NULL
,
12871 /* 64 */ NULL
, NULL
, NULL
, NULL
,
12872 /* 68 */ NULL
, NULL
, NULL
, NULL
,
12873 /* 6C */ NULL
, NULL
, NULL
, NULL
,
12874 /* 70 */ NULL
, NULL
, NULL
, NULL
,
12875 /* 74 */ NULL
, NULL
, NULL
, NULL
,
12876 /* 78 */ NULL
, NULL
, NULL
, NULL
,
12877 /* 7C */ NULL
, NULL
, NULL
, NULL
,
12878 /* 80 */ NULL
, NULL
, NULL
, NULL
,
12879 /* 84 */ NULL
, NULL
, NULL
, NULL
,
12880 /* 88 */ NULL
, NULL
, "pfnacc", NULL
,
12881 /* 8C */ NULL
, NULL
, "pfpnacc", NULL
,
12882 /* 90 */ "pfcmpge", NULL
, NULL
, NULL
,
12883 /* 94 */ "pfmin", NULL
, "pfrcp", "pfrsqrt",
12884 /* 98 */ NULL
, NULL
, "pfsub", NULL
,
12885 /* 9C */ NULL
, NULL
, "pfadd", NULL
,
12886 /* A0 */ "pfcmpgt", NULL
, NULL
, NULL
,
12887 /* A4 */ "pfmax", NULL
, "pfrcpit1", "pfrsqit1",
12888 /* A8 */ NULL
, NULL
, "pfsubr", NULL
,
12889 /* AC */ NULL
, NULL
, "pfacc", NULL
,
12890 /* B0 */ "pfcmpeq", NULL
, NULL
, NULL
,
12891 /* B4 */ "pfmul", NULL
, "pfrcpit2", "pmulhrw",
12892 /* B8 */ NULL
, NULL
, NULL
, "pswapd",
12893 /* BC */ NULL
, NULL
, NULL
, "pavgusb",
12894 /* C0 */ NULL
, NULL
, NULL
, NULL
,
12895 /* C4 */ NULL
, NULL
, NULL
, NULL
,
12896 /* C8 */ NULL
, NULL
, NULL
, NULL
,
12897 /* CC */ NULL
, NULL
, NULL
, NULL
,
12898 /* D0 */ NULL
, NULL
, NULL
, NULL
,
12899 /* D4 */ NULL
, NULL
, NULL
, NULL
,
12900 /* D8 */ NULL
, NULL
, NULL
, NULL
,
12901 /* DC */ NULL
, NULL
, NULL
, NULL
,
12902 /* E0 */ NULL
, NULL
, NULL
, NULL
,
12903 /* E4 */ NULL
, NULL
, NULL
, NULL
,
12904 /* E8 */ NULL
, NULL
, NULL
, NULL
,
12905 /* EC */ NULL
, NULL
, NULL
, NULL
,
12906 /* F0 */ NULL
, NULL
, NULL
, NULL
,
12907 /* F4 */ NULL
, NULL
, NULL
, NULL
,
12908 /* F8 */ NULL
, NULL
, NULL
, NULL
,
12909 /* FC */ NULL
, NULL
, NULL
, NULL
,
12913 OP_3DNowSuffix (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
12914 int sizeflag ATTRIBUTE_UNUSED
)
12916 const char *mnemonic
;
12918 FETCH_DATA (ins
->info
, ins
->codep
+ 1);
12919 /* AMD 3DNow! instructions are specified by an opcode suffix in the
12920 place where an 8-bit immediate would normally go. ie. the last
12921 byte of the instruction. */
12922 ins
->obufp
= ins
->mnemonicendp
;
12923 mnemonic
= Suffix3DNow
[*ins
->codep
++ & 0xff];
12925 oappend (ins
, mnemonic
);
12928 /* Since a variable sized ins->modrm/ins->sib chunk is between the start
12929 of the opcode (0x0f0f) and the opcode suffix, we need to do
12930 all the ins->modrm processing first, and don't know until now that
12931 we have a bad opcode. This necessitates some cleaning up. */
12932 ins
->op_out
[0][0] = '\0';
12933 ins
->op_out
[1][0] = '\0';
12936 ins
->mnemonicendp
= ins
->obufp
;
12939 static const struct op simd_cmp_op
[] =
12941 { STRING_COMMA_LEN ("eq") },
12942 { STRING_COMMA_LEN ("lt") },
12943 { STRING_COMMA_LEN ("le") },
12944 { STRING_COMMA_LEN ("unord") },
12945 { STRING_COMMA_LEN ("neq") },
12946 { STRING_COMMA_LEN ("nlt") },
12947 { STRING_COMMA_LEN ("nle") },
12948 { STRING_COMMA_LEN ("ord") }
12951 static const struct op vex_cmp_op
[] =
12953 { STRING_COMMA_LEN ("eq_uq") },
12954 { STRING_COMMA_LEN ("nge") },
12955 { STRING_COMMA_LEN ("ngt") },
12956 { STRING_COMMA_LEN ("false") },
12957 { STRING_COMMA_LEN ("neq_oq") },
12958 { STRING_COMMA_LEN ("ge") },
12959 { STRING_COMMA_LEN ("gt") },
12960 { STRING_COMMA_LEN ("true") },
12961 { STRING_COMMA_LEN ("eq_os") },
12962 { STRING_COMMA_LEN ("lt_oq") },
12963 { STRING_COMMA_LEN ("le_oq") },
12964 { STRING_COMMA_LEN ("unord_s") },
12965 { STRING_COMMA_LEN ("neq_us") },
12966 { STRING_COMMA_LEN ("nlt_uq") },
12967 { STRING_COMMA_LEN ("nle_uq") },
12968 { STRING_COMMA_LEN ("ord_s") },
12969 { STRING_COMMA_LEN ("eq_us") },
12970 { STRING_COMMA_LEN ("nge_uq") },
12971 { STRING_COMMA_LEN ("ngt_uq") },
12972 { STRING_COMMA_LEN ("false_os") },
12973 { STRING_COMMA_LEN ("neq_os") },
12974 { STRING_COMMA_LEN ("ge_oq") },
12975 { STRING_COMMA_LEN ("gt_oq") },
12976 { STRING_COMMA_LEN ("true_us") },
12980 CMP_Fixup (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
12981 int sizeflag ATTRIBUTE_UNUSED
)
12983 unsigned int cmp_type
;
12985 FETCH_DATA (ins
->info
, ins
->codep
+ 1);
12986 cmp_type
= *ins
->codep
++ & 0xff;
12987 if (cmp_type
< ARRAY_SIZE (simd_cmp_op
))
12990 char *p
= ins
->mnemonicendp
- 2;
12994 sprintf (p
, "%s%s", simd_cmp_op
[cmp_type
].name
, suffix
);
12995 ins
->mnemonicendp
+= simd_cmp_op
[cmp_type
].len
;
12997 else if (ins
->need_vex
12998 && cmp_type
< ARRAY_SIZE (simd_cmp_op
) + ARRAY_SIZE (vex_cmp_op
))
13001 char *p
= ins
->mnemonicendp
- 2;
13005 cmp_type
-= ARRAY_SIZE (simd_cmp_op
);
13006 sprintf (p
, "%s%s", vex_cmp_op
[cmp_type
].name
, suffix
);
13007 ins
->mnemonicendp
+= vex_cmp_op
[cmp_type
].len
;
13011 /* We have a reserved extension byte. Output it directly. */
13012 ins
->scratchbuf
[0] = '$';
13013 print_operand_value (ins
, ins
->scratchbuf
+ 1, 1, cmp_type
);
13014 oappend_maybe_intel (ins
, ins
->scratchbuf
);
13015 ins
->scratchbuf
[0] = '\0';
13020 OP_Mwait (instr_info
*ins
, int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
13022 /* mwait %eax,%ecx / mwaitx %eax,%ecx,%ebx */
13023 if (!ins
->intel_syntax
)
13025 strcpy (ins
->op_out
[0], ins
->names32
[0]);
13026 strcpy (ins
->op_out
[1], ins
->names32
[1]);
13027 if (bytemode
== eBX_reg
)
13028 strcpy (ins
->op_out
[2], ins
->names32
[3]);
13029 ins
->two_source_ops
= 1;
13031 /* Skip mod/rm byte. */
13037 OP_Monitor (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
13038 int sizeflag ATTRIBUTE_UNUSED
)
13040 /* monitor %{e,r,}ax,%ecx,%edx" */
13041 if (!ins
->intel_syntax
)
13043 const char **names
= (ins
->address_mode
== mode_64bit
13044 ? ins
->names64
: ins
->names32
);
13046 if (ins
->prefixes
& PREFIX_ADDR
)
13048 /* Remove "addr16/addr32". */
13049 ins
->all_prefixes
[ins
->last_addr_prefix
] = 0;
13050 names
= (ins
->address_mode
!= mode_32bit
13051 ? ins
->names32
: ins
->names16
);
13052 ins
->used_prefixes
|= PREFIX_ADDR
;
13054 else if (ins
->address_mode
== mode_16bit
)
13055 names
= ins
->names16
;
13056 strcpy (ins
->op_out
[0], names
[0]);
13057 strcpy (ins
->op_out
[1], ins
->names32
[1]);
13058 strcpy (ins
->op_out
[2], ins
->names32
[2]);
13059 ins
->two_source_ops
= 1;
13061 /* Skip mod/rm byte. */
13067 BadOp (instr_info
*ins
)
13069 /* Throw away prefixes and 1st. opcode byte. */
13070 ins
->codep
= ins
->insn_codep
+ 1;
13071 oappend (ins
, "(bad)");
13075 REP_Fixup (instr_info
*ins
, int bytemode
, int sizeflag
)
13077 /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
13079 if (ins
->prefixes
& PREFIX_REPZ
)
13080 ins
->all_prefixes
[ins
->last_repz_prefix
] = REP_PREFIX
;
13087 OP_IMREG (ins
, bytemode
, sizeflag
);
13090 OP_ESreg (ins
, bytemode
, sizeflag
);
13093 OP_DSreg (ins
, bytemode
, sizeflag
);
13102 SEP_Fixup (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
13103 int sizeflag ATTRIBUTE_UNUSED
)
13105 if (ins
->isa64
!= amd64
)
13108 ins
->obufp
= ins
->obuf
;
13110 ins
->mnemonicendp
= ins
->obufp
;
13114 /* For BND-prefixed instructions 0xF2 prefix should be displayed as
13118 BND_Fixup (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
13119 int sizeflag ATTRIBUTE_UNUSED
)
13121 if (ins
->prefixes
& PREFIX_REPNZ
)
13122 ins
->all_prefixes
[ins
->last_repnz_prefix
] = BND_PREFIX
;
13125 /* For NOTRACK-prefixed instructions, 0x3E prefix should be displayed as
13129 NOTRACK_Fixup (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
13130 int sizeflag ATTRIBUTE_UNUSED
)
13132 /* Since active_seg_prefix is not set in 64-bit mode, check whether
13133 we've seen a PREFIX_DS. */
13134 if ((ins
->prefixes
& PREFIX_DS
) != 0
13135 && (ins
->address_mode
!= mode_64bit
|| ins
->last_data_prefix
< 0))
13137 /* NOTRACK prefix is only valid on indirect branch instructions.
13138 NB: DATA prefix is unsupported for Intel64. */
13139 ins
->active_seg_prefix
= 0;
13140 ins
->all_prefixes
[ins
->last_seg_prefix
] = NOTRACK_PREFIX
;
13144 /* Similar to OP_E. But the 0xf2/0xf3 ins->prefixes should be displayed as
13145 "xacquire"/"xrelease" for memory operand if there is a LOCK prefix.
13149 HLE_Fixup1 (instr_info
*ins
, int bytemode
, int sizeflag
)
13151 if (ins
->modrm
.mod
!= 3
13152 && (ins
->prefixes
& PREFIX_LOCK
) != 0)
13154 if (ins
->prefixes
& PREFIX_REPZ
)
13155 ins
->all_prefixes
[ins
->last_repz_prefix
] = XRELEASE_PREFIX
;
13156 if (ins
->prefixes
& PREFIX_REPNZ
)
13157 ins
->all_prefixes
[ins
->last_repnz_prefix
] = XACQUIRE_PREFIX
;
13160 OP_E (ins
, bytemode
, sizeflag
);
13163 /* Similar to OP_E. But the 0xf2/0xf3 ins->prefixes should be displayed as
13164 "xacquire"/"xrelease" for memory operand. No check for LOCK prefix.
13168 HLE_Fixup2 (instr_info
*ins
, int bytemode
, int sizeflag
)
13170 if (ins
->modrm
.mod
!= 3)
13172 if (ins
->prefixes
& PREFIX_REPZ
)
13173 ins
->all_prefixes
[ins
->last_repz_prefix
] = XRELEASE_PREFIX
;
13174 if (ins
->prefixes
& PREFIX_REPNZ
)
13175 ins
->all_prefixes
[ins
->last_repnz_prefix
] = XACQUIRE_PREFIX
;
13178 OP_E (ins
, bytemode
, sizeflag
);
13181 /* Similar to OP_E. But the 0xf3 prefixes should be displayed as
13182 "xrelease" for memory operand. No check for LOCK prefix. */
13185 HLE_Fixup3 (instr_info
*ins
, int bytemode
, int sizeflag
)
13187 if (ins
->modrm
.mod
!= 3
13188 && ins
->last_repz_prefix
> ins
->last_repnz_prefix
13189 && (ins
->prefixes
& PREFIX_REPZ
) != 0)
13190 ins
->all_prefixes
[ins
->last_repz_prefix
] = XRELEASE_PREFIX
;
13192 OP_E (ins
, bytemode
, sizeflag
);
13196 CMPXCHG8B_Fixup (instr_info
*ins
, int bytemode
, int sizeflag
)
13199 if (ins
->rex
& REX_W
)
13201 /* Change cmpxchg8b to cmpxchg16b. */
13202 char *p
= ins
->mnemonicendp
- 2;
13203 ins
->mnemonicendp
= stpcpy (p
, "16b");
13206 else if ((ins
->prefixes
& PREFIX_LOCK
) != 0)
13208 if (ins
->prefixes
& PREFIX_REPZ
)
13209 ins
->all_prefixes
[ins
->last_repz_prefix
] = XRELEASE_PREFIX
;
13210 if (ins
->prefixes
& PREFIX_REPNZ
)
13211 ins
->all_prefixes
[ins
->last_repnz_prefix
] = XACQUIRE_PREFIX
;
13214 OP_M (ins
, bytemode
, sizeflag
);
13218 XMM_Fixup (instr_info
*ins
, int reg
, int sizeflag ATTRIBUTE_UNUSED
)
13220 const char **names
;
13224 switch (ins
->vex
.length
)
13227 names
= ins
->names_xmm
;
13230 names
= ins
->names_ymm
;
13237 names
= ins
->names_xmm
;
13238 oappend (ins
, names
[reg
]);
13242 FXSAVE_Fixup (instr_info
*ins
, int bytemode
, int sizeflag
)
13244 /* Add proper suffix to "fxsave" and "fxrstor". */
13246 if (ins
->rex
& REX_W
)
13248 char *p
= ins
->mnemonicendp
;
13252 ins
->mnemonicendp
= p
;
13254 OP_M (ins
, bytemode
, sizeflag
);
13257 /* Display the destination register operand for instructions with
13261 OP_VEX (instr_info
*ins
, int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
13263 int reg
, modrm_reg
, sib_index
= -1;
13264 const char **names
;
13266 if (!ins
->need_vex
)
13269 reg
= ins
->vex
.register_specifier
;
13270 ins
->vex
.register_specifier
= 0;
13271 if (ins
->address_mode
!= mode_64bit
)
13273 if (ins
->vex
.evex
&& !ins
->vex
.v
)
13275 oappend (ins
, "(bad)");
13281 else if (ins
->vex
.evex
&& !ins
->vex
.v
)
13287 oappend (ins
, ins
->names_xmm
[reg
]);
13290 case vex_vsib_d_w_dq_mode
:
13291 case vex_vsib_q_w_dq_mode
:
13292 /* This must be the 3rd operand. */
13293 if (ins
->obufp
!= ins
->op_out
[2])
13295 if (ins
->vex
.length
== 128
13296 || (bytemode
!= vex_vsib_d_w_dq_mode
13298 oappend (ins
, ins
->names_xmm
[reg
]);
13300 oappend (ins
, ins
->names_ymm
[reg
]);
13302 /* All 3 XMM/YMM registers must be distinct. */
13303 modrm_reg
= ins
->modrm
.reg
;
13304 if (ins
->rex
& REX_R
)
13307 if (ins
->modrm
.rm
== 4)
13309 sib_index
= ins
->sib
.index
;
13310 if (ins
->rex
& REX_X
)
13314 if (reg
== modrm_reg
|| reg
== sib_index
)
13315 strcpy (ins
->obufp
, "/(bad)");
13316 if (modrm_reg
== sib_index
|| modrm_reg
== reg
)
13317 strcat (ins
->op_out
[0], "/(bad)");
13318 if (sib_index
== modrm_reg
|| sib_index
== reg
)
13319 strcat (ins
->op_out
[1], "/(bad)");
13324 /* All 3 TMM registers must be distinct. */
13326 oappend (ins
, "(bad)");
13329 /* This must be the 3rd operand. */
13330 if (ins
->obufp
!= ins
->op_out
[2])
13332 oappend (ins
, ins
->names_tmm
[reg
]);
13333 if (reg
== ins
->modrm
.reg
|| reg
== ins
->modrm
.rm
)
13334 strcpy (ins
->obufp
, "/(bad)");
13337 if (ins
->modrm
.reg
== ins
->modrm
.rm
|| ins
->modrm
.reg
== reg
13338 || ins
->modrm
.rm
== reg
)
13340 if (ins
->modrm
.reg
<= 8
13341 && (ins
->modrm
.reg
== ins
->modrm
.rm
|| ins
->modrm
.reg
== reg
))
13342 strcat (ins
->op_out
[0], "/(bad)");
13343 if (ins
->modrm
.rm
<= 8
13344 && (ins
->modrm
.rm
== ins
->modrm
.reg
|| ins
->modrm
.rm
== reg
))
13345 strcat (ins
->op_out
[1], "/(bad)");
13351 switch (ins
->vex
.length
)
13357 names
= ins
->names_xmm
;
13360 if (ins
->rex
& REX_W
)
13361 names
= ins
->names64
;
13363 names
= ins
->names32
;
13369 oappend (ins
, "(bad)");
13372 names
= ins
->names_mask
;
13383 names
= ins
->names_ymm
;
13389 oappend (ins
, "(bad)");
13392 names
= ins
->names_mask
;
13395 /* See PR binutils/20893 for a reproducer. */
13396 oappend (ins
, "(bad)");
13401 names
= ins
->names_zmm
;
13407 oappend (ins
, names
[reg
]);
13411 OP_VexR (instr_info
*ins
, int bytemode
, int sizeflag
)
13413 if (ins
->modrm
.mod
== 3)
13414 OP_VEX (ins
, bytemode
, sizeflag
);
13418 OP_VexW (instr_info
*ins
, int bytemode
, int sizeflag
)
13420 OP_VEX (ins
, bytemode
, sizeflag
);
13424 /* Swap 2nd and 3rd operands. */
13425 strcpy (ins
->scratchbuf
, ins
->op_out
[2]);
13426 strcpy (ins
->op_out
[2], ins
->op_out
[1]);
13427 strcpy (ins
->op_out
[1], ins
->scratchbuf
);
13432 OP_REG_VexI4 (instr_info
*ins
, int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
13435 const char **names
= ins
->names_xmm
;
13437 FETCH_DATA (ins
->info
, ins
->codep
+ 1);
13438 reg
= *ins
->codep
++;
13440 if (bytemode
!= x_mode
&& bytemode
!= scalar_mode
)
13444 if (ins
->address_mode
!= mode_64bit
)
13447 if (bytemode
== x_mode
&& ins
->vex
.length
== 256)
13448 names
= ins
->names_ymm
;
13450 oappend (ins
, names
[reg
]);
13454 /* Swap 3rd and 4th operands. */
13455 strcpy (ins
->scratchbuf
, ins
->op_out
[3]);
13456 strcpy (ins
->op_out
[3], ins
->op_out
[2]);
13457 strcpy (ins
->op_out
[2], ins
->scratchbuf
);
13462 OP_VexI4 (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
13463 int sizeflag ATTRIBUTE_UNUSED
)
13465 ins
->scratchbuf
[0] = '$';
13466 print_operand_value (ins
, ins
->scratchbuf
+ 1, 1, ins
->codep
[-1] & 0xf);
13467 oappend_maybe_intel (ins
, ins
->scratchbuf
);
13471 VPCMP_Fixup (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
13472 int sizeflag ATTRIBUTE_UNUSED
)
13474 unsigned int cmp_type
;
13476 if (!ins
->vex
.evex
)
13479 FETCH_DATA (ins
->info
, ins
->codep
+ 1);
13480 cmp_type
= *ins
->codep
++ & 0xff;
13481 /* There are aliases for immediates 0, 1, 2, 4, 5, 6.
13482 If it's the case, print suffix, otherwise - print the immediate. */
13483 if (cmp_type
< ARRAY_SIZE (simd_cmp_op
)
13488 char *p
= ins
->mnemonicendp
- 2;
13490 /* vpcmp* can have both one- and two-lettered suffix. */
13504 sprintf (p
, "%s%s", simd_cmp_op
[cmp_type
].name
, suffix
);
13505 ins
->mnemonicendp
+= simd_cmp_op
[cmp_type
].len
;
13509 /* We have a reserved extension byte. Output it directly. */
13510 ins
->scratchbuf
[0] = '$';
13511 print_operand_value (ins
, ins
->scratchbuf
+ 1, 1, cmp_type
);
13512 oappend_maybe_intel (ins
, ins
->scratchbuf
);
13513 ins
->scratchbuf
[0] = '\0';
13517 static const struct op xop_cmp_op
[] =
13519 { STRING_COMMA_LEN ("lt") },
13520 { STRING_COMMA_LEN ("le") },
13521 { STRING_COMMA_LEN ("gt") },
13522 { STRING_COMMA_LEN ("ge") },
13523 { STRING_COMMA_LEN ("eq") },
13524 { STRING_COMMA_LEN ("neq") },
13525 { STRING_COMMA_LEN ("false") },
13526 { STRING_COMMA_LEN ("true") }
13530 VPCOM_Fixup (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
13531 int sizeflag ATTRIBUTE_UNUSED
)
13533 unsigned int cmp_type
;
13535 FETCH_DATA (ins
->info
, ins
->codep
+ 1);
13536 cmp_type
= *ins
->codep
++ & 0xff;
13537 if (cmp_type
< ARRAY_SIZE (xop_cmp_op
))
13540 char *p
= ins
->mnemonicendp
- 2;
13542 /* vpcom* can have both one- and two-lettered suffix. */
13556 sprintf (p
, "%s%s", xop_cmp_op
[cmp_type
].name
, suffix
);
13557 ins
->mnemonicendp
+= xop_cmp_op
[cmp_type
].len
;
13561 /* We have a reserved extension byte. Output it directly. */
13562 ins
->scratchbuf
[0] = '$';
13563 print_operand_value (ins
, ins
->scratchbuf
+ 1, 1, cmp_type
);
13564 oappend_maybe_intel (ins
, ins
->scratchbuf
);
13565 ins
->scratchbuf
[0] = '\0';
13569 static const struct op pclmul_op
[] =
13571 { STRING_COMMA_LEN ("lql") },
13572 { STRING_COMMA_LEN ("hql") },
13573 { STRING_COMMA_LEN ("lqh") },
13574 { STRING_COMMA_LEN ("hqh") }
13578 PCLMUL_Fixup (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
13579 int sizeflag ATTRIBUTE_UNUSED
)
13581 unsigned int pclmul_type
;
13583 FETCH_DATA (ins
->info
, ins
->codep
+ 1);
13584 pclmul_type
= *ins
->codep
++ & 0xff;
13585 switch (pclmul_type
)
13596 if (pclmul_type
< ARRAY_SIZE (pclmul_op
))
13599 char *p
= ins
->mnemonicendp
- 3;
13604 sprintf (p
, "%s%s", pclmul_op
[pclmul_type
].name
, suffix
);
13605 ins
->mnemonicendp
+= pclmul_op
[pclmul_type
].len
;
13609 /* We have a reserved extension byte. Output it directly. */
13610 ins
->scratchbuf
[0] = '$';
13611 print_operand_value (ins
, ins
->scratchbuf
+ 1, 1, pclmul_type
);
13612 oappend_maybe_intel (ins
, ins
->scratchbuf
);
13613 ins
->scratchbuf
[0] = '\0';
13618 MOVSXD_Fixup (instr_info
*ins
, int bytemode
, int sizeflag
)
13620 /* Add proper suffix to "movsxd". */
13621 char *p
= ins
->mnemonicendp
;
13626 if (!ins
->intel_syntax
)
13629 if (ins
->rex
& REX_W
)
13641 oappend (ins
, INTERNAL_DISASSEMBLER_ERROR
);
13645 ins
->mnemonicendp
= p
;
13647 OP_E (ins
, bytemode
, sizeflag
);
13651 DistinctDest_Fixup (instr_info
*ins
, int bytemode
, int sizeflag
)
13653 unsigned int reg
= ins
->vex
.register_specifier
;
13654 unsigned int modrm_reg
= ins
->modrm
.reg
;
13655 unsigned int modrm_rm
= ins
->modrm
.rm
;
13657 /* Calc destination register number. */
13658 if (ins
->rex
& REX_R
)
13663 /* Calc src1 register number. */
13664 if (ins
->address_mode
!= mode_64bit
)
13666 else if (ins
->vex
.evex
&& !ins
->vex
.v
)
13669 /* Calc src2 register number. */
13670 if (ins
->modrm
.mod
== 3)
13672 if (ins
->rex
& REX_B
)
13674 if (ins
->rex
& REX_X
)
13678 /* Destination and source registers must be distinct, output bad if
13679 dest == src1 or dest == src2. */
13680 if (modrm_reg
== reg
13681 || (ins
->modrm
.mod
== 3
13682 && modrm_reg
== modrm_rm
))
13684 oappend (ins
, "(bad)");
13687 OP_XMM (ins
, bytemode
, sizeflag
);
13691 OP_Rounding (instr_info
*ins
, int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
13693 if (ins
->modrm
.mod
!= 3 || !ins
->vex
.b
)
13698 case evex_rounding_64_mode
:
13699 if (ins
->address_mode
!= mode_64bit
|| !ins
->vex
.w
)
13701 /* Fall through. */
13702 case evex_rounding_mode
:
13703 ins
->evex_used
|= EVEX_b_used
;
13704 oappend (ins
, names_rounding
[ins
->vex
.ll
]);
13706 case evex_sae_mode
:
13707 ins
->evex_used
|= EVEX_b_used
;
13708 oappend (ins
, "{");
13713 oappend (ins
, "sae}");