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. */
152 unsigned char rex_used
;
158 /* Flags for ins->prefixes which we somehow handled when printing the
159 current instruction. */
162 /* Flags for EVEX bits which we somehow handled when printing the
163 current instruction. */
169 char scratchbuf
[100];
170 unsigned char *start_codep
;
171 unsigned char *insn_codep
;
172 unsigned char *codep
;
173 unsigned char *end_codep
;
174 int last_lock_prefix
;
175 int last_repz_prefix
;
176 int last_repnz_prefix
;
177 int last_data_prefix
;
178 int last_addr_prefix
;
182 /* The active segment register prefix. */
183 int active_seg_prefix
;
185 #define MAX_CODE_LENGTH 15
186 /* We can up to 14 ins->prefixes since the maximum instruction length is
188 int all_prefixes
[MAX_CODE_LENGTH
- 1];
189 disassemble_info
*info
;
209 int register_specifier
;
212 int mask_register_specifier
;
224 /* Remember if the current op is a jump instruction. */
230 signed char op_index
[MAX_OPERANDS
];
231 char op_out
[MAX_OPERANDS
][100];
232 bfd_vma op_address
[MAX_OPERANDS
];
233 bfd_vma op_riprel
[MAX_OPERANDS
];
236 /* On the 386's of 1988, the maximum length of an instruction is 15 bytes.
237 * (see topic "Redundant ins->prefixes" in the "Differences from 8086"
238 * section of the "Virtual 8086 Mode" chapter.)
239 * 'pc' should be the address of this instruction, it will
240 * be used to print the target address if this is a relative jump or call
241 * The function returns the length of this instruction in bytes.
250 enum x86_64_isa isa64
;
254 /* Mark parts used in the REX prefix. When we are testing for
255 empty prefix (for 8bit register REX extension), just mask it
256 out. Otherwise test for REX bit is excuse for existence of REX
257 only in case value is nonzero. */
258 #define USED_REX(value) \
262 if ((ins->rex & value)) \
263 ins->rex_used |= (value) | REX_OPCODE; \
266 ins->rex_used |= REX_OPCODE; \
270 #define EVEX_b_used 1
272 /* Flags stored in PREFIXES. */
273 #define PREFIX_REPZ 1
274 #define PREFIX_REPNZ 2
275 #define PREFIX_LOCK 4
277 #define PREFIX_SS 0x10
278 #define PREFIX_DS 0x20
279 #define PREFIX_ES 0x40
280 #define PREFIX_FS 0x80
281 #define PREFIX_GS 0x100
282 #define PREFIX_DATA 0x200
283 #define PREFIX_ADDR 0x400
284 #define PREFIX_FWAIT 0x800
286 /* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
287 to ADDR (exclusive) are valid. Returns 1 for success, longjmps
289 #define FETCH_DATA(info, addr) \
290 ((addr) <= ((struct dis_private *) (info->private_data))->max_fetched \
291 ? 1 : fetch_data ((info), (addr)))
294 fetch_data (struct disassemble_info
*info
, bfd_byte
*addr
)
297 struct dis_private
*priv
= (struct dis_private
*) info
->private_data
;
298 bfd_vma start
= priv
->insn_start
+ (priv
->max_fetched
- priv
->the_buffer
);
300 if (addr
<= priv
->the_buffer
+ MAX_MNEM_SIZE
)
301 status
= (*info
->read_memory_func
) (start
,
303 addr
- priv
->max_fetched
,
309 /* If we did manage to read at least one byte, then
310 print_insn_i386 will do something sensible. Otherwise, print
311 an error. We do that here because this is where we know
313 if (priv
->max_fetched
== priv
->the_buffer
)
314 (*info
->memory_error_func
) (status
, start
, info
);
315 OPCODES_SIGLONGJMP (priv
->bailout
, 1);
318 priv
->max_fetched
= addr
;
322 /* Possible values for prefix requirement. */
323 #define PREFIX_IGNORED_SHIFT 16
324 #define PREFIX_IGNORED_REPZ (PREFIX_REPZ << PREFIX_IGNORED_SHIFT)
325 #define PREFIX_IGNORED_REPNZ (PREFIX_REPNZ << PREFIX_IGNORED_SHIFT)
326 #define PREFIX_IGNORED_DATA (PREFIX_DATA << PREFIX_IGNORED_SHIFT)
327 #define PREFIX_IGNORED_ADDR (PREFIX_ADDR << PREFIX_IGNORED_SHIFT)
328 #define PREFIX_IGNORED_LOCK (PREFIX_LOCK << PREFIX_IGNORED_SHIFT)
330 /* Opcode prefixes. */
331 #define PREFIX_OPCODE (PREFIX_REPZ \
335 /* Prefixes ignored. */
336 #define PREFIX_IGNORED (PREFIX_IGNORED_REPZ \
337 | PREFIX_IGNORED_REPNZ \
338 | PREFIX_IGNORED_DATA)
340 #define XX { NULL, 0 }
341 #define Bad_Opcode NULL, { { NULL, 0 } }, 0
343 #define Eb { OP_E, b_mode }
344 #define Ebnd { OP_E, bnd_mode }
345 #define EbS { OP_E, b_swap_mode }
346 #define EbndS { OP_E, bnd_swap_mode }
347 #define Ev { OP_E, v_mode }
348 #define Eva { OP_E, va_mode }
349 #define Ev_bnd { OP_E, v_bnd_mode }
350 #define EvS { OP_E, v_swap_mode }
351 #define Ed { OP_E, d_mode }
352 #define Edq { OP_E, dq_mode }
353 #define Edb { OP_E, db_mode }
354 #define Edw { OP_E, dw_mode }
355 #define Eq { OP_E, q_mode }
356 #define indirEv { OP_indirE, indir_v_mode }
357 #define indirEp { OP_indirE, f_mode }
358 #define stackEv { OP_E, stack_v_mode }
359 #define Em { OP_E, m_mode }
360 #define Ew { OP_E, w_mode }
361 #define M { OP_M, 0 } /* lea, lgdt, etc. */
362 #define Ma { OP_M, a_mode }
363 #define Mb { OP_M, b_mode }
364 #define Md { OP_M, d_mode }
365 #define Mo { OP_M, o_mode }
366 #define Mp { OP_M, f_mode } /* 32 or 48 bit memory operand for LDS, LES etc */
367 #define Mq { OP_M, q_mode }
368 #define Mv { OP_M, v_mode }
369 #define Mv_bnd { OP_M, v_bndmk_mode }
370 #define Mx { OP_M, x_mode }
371 #define Mxmm { OP_M, xmm_mode }
372 #define Gb { OP_G, b_mode }
373 #define Gbnd { OP_G, bnd_mode }
374 #define Gv { OP_G, v_mode }
375 #define Gd { OP_G, d_mode }
376 #define Gdq { OP_G, dq_mode }
377 #define Gm { OP_G, m_mode }
378 #define Gva { OP_G, va_mode }
379 #define Gw { OP_G, w_mode }
380 #define Ib { OP_I, b_mode }
381 #define sIb { OP_sI, b_mode } /* sign extened byte */
382 #define sIbT { OP_sI, b_T_mode } /* sign extened byte like 'T' */
383 #define Iv { OP_I, v_mode }
384 #define sIv { OP_sI, v_mode }
385 #define Iv64 { OP_I64, v_mode }
386 #define Id { OP_I, d_mode }
387 #define Iw { OP_I, w_mode }
388 #define I1 { OP_I, const_1_mode }
389 #define Jb { OP_J, b_mode }
390 #define Jv { OP_J, v_mode }
391 #define Jdqw { OP_J, dqw_mode }
392 #define Cm { OP_C, m_mode }
393 #define Dm { OP_D, m_mode }
394 #define Td { OP_T, d_mode }
395 #define Skip_MODRM { OP_Skip_MODRM, 0 }
397 #define RMeAX { OP_REG, eAX_reg }
398 #define RMeBX { OP_REG, eBX_reg }
399 #define RMeCX { OP_REG, eCX_reg }
400 #define RMeDX { OP_REG, eDX_reg }
401 #define RMeSP { OP_REG, eSP_reg }
402 #define RMeBP { OP_REG, eBP_reg }
403 #define RMeSI { OP_REG, eSI_reg }
404 #define RMeDI { OP_REG, eDI_reg }
405 #define RMrAX { OP_REG, rAX_reg }
406 #define RMrBX { OP_REG, rBX_reg }
407 #define RMrCX { OP_REG, rCX_reg }
408 #define RMrDX { OP_REG, rDX_reg }
409 #define RMrSP { OP_REG, rSP_reg }
410 #define RMrBP { OP_REG, rBP_reg }
411 #define RMrSI { OP_REG, rSI_reg }
412 #define RMrDI { OP_REG, rDI_reg }
413 #define RMAL { OP_REG, al_reg }
414 #define RMCL { OP_REG, cl_reg }
415 #define RMDL { OP_REG, dl_reg }
416 #define RMBL { OP_REG, bl_reg }
417 #define RMAH { OP_REG, ah_reg }
418 #define RMCH { OP_REG, ch_reg }
419 #define RMDH { OP_REG, dh_reg }
420 #define RMBH { OP_REG, bh_reg }
421 #define RMAX { OP_REG, ax_reg }
422 #define RMDX { OP_REG, dx_reg }
424 #define eAX { OP_IMREG, eAX_reg }
425 #define AL { OP_IMREG, al_reg }
426 #define CL { OP_IMREG, cl_reg }
427 #define zAX { OP_IMREG, z_mode_ax_reg }
428 #define indirDX { OP_IMREG, indir_dx_reg }
430 #define Sw { OP_SEG, w_mode }
431 #define Sv { OP_SEG, v_mode }
432 #define Ap { OP_DIR, 0 }
433 #define Ob { OP_OFF64, b_mode }
434 #define Ov { OP_OFF64, v_mode }
435 #define Xb { OP_DSreg, eSI_reg }
436 #define Xv { OP_DSreg, eSI_reg }
437 #define Xz { OP_DSreg, eSI_reg }
438 #define Yb { OP_ESreg, eDI_reg }
439 #define Yv { OP_ESreg, eDI_reg }
440 #define DSBX { OP_DSreg, eBX_reg }
442 #define es { OP_REG, es_reg }
443 #define ss { OP_REG, ss_reg }
444 #define cs { OP_REG, cs_reg }
445 #define ds { OP_REG, ds_reg }
446 #define fs { OP_REG, fs_reg }
447 #define gs { OP_REG, gs_reg }
449 #define MX { OP_MMX, 0 }
450 #define XM { OP_XMM, 0 }
451 #define XMScalar { OP_XMM, scalar_mode }
452 #define XMGatherD { OP_XMM, vex_vsib_d_w_dq_mode }
453 #define XMGatherQ { OP_XMM, vex_vsib_q_w_dq_mode }
454 #define XMM { OP_XMM, xmm_mode }
455 #define TMM { OP_XMM, tmm_mode }
456 #define XMxmmq { OP_XMM, xmmq_mode }
457 #define EM { OP_EM, v_mode }
458 #define EMS { OP_EM, v_swap_mode }
459 #define EMd { OP_EM, d_mode }
460 #define EMx { OP_EM, x_mode }
461 #define EXbwUnit { OP_EX, bw_unit_mode }
462 #define EXb { OP_EX, b_mode }
463 #define EXw { OP_EX, w_mode }
464 #define EXd { OP_EX, d_mode }
465 #define EXdS { OP_EX, d_swap_mode }
466 #define EXwS { OP_EX, w_swap_mode }
467 #define EXq { OP_EX, q_mode }
468 #define EXqS { OP_EX, q_swap_mode }
469 #define EXdq { OP_EX, dq_mode }
470 #define EXx { OP_EX, x_mode }
471 #define EXxh { OP_EX, xh_mode }
472 #define EXxS { OP_EX, x_swap_mode }
473 #define EXxmm { OP_EX, xmm_mode }
474 #define EXymm { OP_EX, ymm_mode }
475 #define EXtmm { OP_EX, tmm_mode }
476 #define EXxmmq { OP_EX, xmmq_mode }
477 #define EXxmmqh { OP_EX, evex_half_bcst_xmmqh_mode }
478 #define EXEvexHalfBcstXmmq { OP_EX, evex_half_bcst_xmmq_mode }
479 #define EXxmmdw { OP_EX, xmmdw_mode }
480 #define EXxmmqd { OP_EX, xmmqd_mode }
481 #define EXxmmqdh { OP_EX, evex_half_bcst_xmmqdh_mode }
482 #define EXymmq { OP_EX, ymmq_mode }
483 #define EXEvexXGscat { OP_EX, evex_x_gscat_mode }
484 #define EXEvexXNoBcst { OP_EX, evex_x_nobcst_mode }
485 #define MS { OP_MS, v_mode }
486 #define XS { OP_XS, v_mode }
487 #define EMCq { OP_EMC, q_mode }
488 #define MXC { OP_MXC, 0 }
489 #define OPSUF { OP_3DNowSuffix, 0 }
490 #define SEP { SEP_Fixup, 0 }
491 #define CMP { CMP_Fixup, 0 }
492 #define XMM0 { XMM_Fixup, 0 }
493 #define FXSAVE { FXSAVE_Fixup, 0 }
495 #define Vex { OP_VEX, x_mode }
496 #define VexW { OP_VexW, x_mode }
497 #define VexScalar { OP_VEX, scalar_mode }
498 #define VexScalarR { OP_VexR, scalar_mode }
499 #define VexGatherD { OP_VEX, vex_vsib_d_w_dq_mode }
500 #define VexGatherQ { OP_VEX, vex_vsib_q_w_dq_mode }
501 #define VexGdq { OP_VEX, dq_mode }
502 #define VexTmm { OP_VEX, tmm_mode }
503 #define XMVexI4 { OP_REG_VexI4, x_mode }
504 #define XMVexScalarI4 { OP_REG_VexI4, scalar_mode }
505 #define VexI4 { OP_VexI4, 0 }
506 #define PCLMUL { PCLMUL_Fixup, 0 }
507 #define VPCMP { VPCMP_Fixup, 0 }
508 #define VPCOM { VPCOM_Fixup, 0 }
510 #define EXxEVexR { OP_Rounding, evex_rounding_mode }
511 #define EXxEVexR64 { OP_Rounding, evex_rounding_64_mode }
512 #define EXxEVexS { OP_Rounding, evex_sae_mode }
514 #define MaskG { OP_G, mask_mode }
515 #define MaskE { OP_E, mask_mode }
516 #define MaskBDE { OP_E, mask_bd_mode }
517 #define MaskVex { OP_VEX, mask_mode }
519 #define MVexVSIBDWpX { OP_M, vex_vsib_d_w_dq_mode }
520 #define MVexVSIBQWpX { OP_M, vex_vsib_q_w_dq_mode }
522 #define MVexSIBMEM { OP_M, vex_sibmem_mode }
524 /* Used handle "rep" prefix for string instructions. */
525 #define Xbr { REP_Fixup, eSI_reg }
526 #define Xvr { REP_Fixup, eSI_reg }
527 #define Ybr { REP_Fixup, eDI_reg }
528 #define Yvr { REP_Fixup, eDI_reg }
529 #define Yzr { REP_Fixup, eDI_reg }
530 #define indirDXr { REP_Fixup, indir_dx_reg }
531 #define ALr { REP_Fixup, al_reg }
532 #define eAXr { REP_Fixup, eAX_reg }
534 /* Used handle HLE prefix for lockable instructions. */
535 #define Ebh1 { HLE_Fixup1, b_mode }
536 #define Evh1 { HLE_Fixup1, v_mode }
537 #define Ebh2 { HLE_Fixup2, b_mode }
538 #define Evh2 { HLE_Fixup2, v_mode }
539 #define Ebh3 { HLE_Fixup3, b_mode }
540 #define Evh3 { HLE_Fixup3, v_mode }
542 #define BND { BND_Fixup, 0 }
543 #define NOTRACK { NOTRACK_Fixup, 0 }
545 #define cond_jump_flag { NULL, cond_jump_mode }
546 #define loop_jcxz_flag { NULL, loop_jcxz_mode }
548 /* bits in sizeflag */
549 #define SUFFIX_ALWAYS 4
557 /* byte operand with operand swapped */
559 /* byte operand, sign extend like 'T' suffix */
561 /* operand size depends on prefixes */
563 /* operand size depends on prefixes with operand swapped */
565 /* operand size depends on address prefix */
569 /* double word operand */
571 /* word operand with operand swapped */
573 /* double word operand with operand swapped */
575 /* quad word operand */
577 /* quad word operand with operand swapped */
579 /* ten-byte operand */
581 /* 16-byte XMM, 32-byte YMM or 64-byte ZMM operand. In EVEX with
582 broadcast enabled. */
584 /* Similar to x_mode, but with different EVEX mem shifts. */
586 /* Similar to x_mode, but with yet different EVEX mem shifts. */
588 /* Similar to x_mode, but with disabled broadcast. */
590 /* Similar to x_mode, but with operands swapped and disabled broadcast
593 /* 16-byte XMM, 32-byte YMM or 64-byte ZMM operand. In EVEX with
594 broadcast of 16bit enabled. */
596 /* 16-byte XMM operand */
598 /* XMM, XMM or YMM register operand, or quad word, xmmword or ymmword
599 memory operand (depending on vector length). Broadcast isn't
602 /* Same as xmmq_mode, but broadcast is allowed. */
603 evex_half_bcst_xmmq_mode
,
604 /* XMM, XMM or YMM register operand, or quad word, xmmword or ymmword
605 memory operand (depending on vector length). 16bit broadcast. */
606 evex_half_bcst_xmmqh_mode
,
607 /* 16-byte XMM, word, double word or quad word operand. */
609 /* 16-byte XMM, double word, quad word operand or xmm word operand. */
611 /* 16-byte XMM, double word, quad word operand or xmm word operand.
613 evex_half_bcst_xmmqdh_mode
,
614 /* 32-byte YMM operand */
616 /* quad word, ymmword or zmmword memory operand. */
620 /* d_mode in 32bit, q_mode in 64bit mode. */
622 /* pair of v_mode operands */
628 /* like v_bnd_mode in 32bit, no RIP-rel in 64bit mode. */
630 /* operand size depends on REX.W / VEX.W. */
632 /* Displacements like v_mode without considering Intel64 ISA. */
636 /* bounds operand with operand swapped */
638 /* 4- or 6-byte pointer operand */
641 /* v_mode for indirect branch opcodes. */
643 /* v_mode for stack-related opcodes. */
645 /* non-quad operand size depends on prefixes */
647 /* 16-byte operand */
649 /* registers like d_mode, memory like b_mode. */
651 /* registers like d_mode, memory like w_mode. */
654 /* Operand size depends on the VEX.W bit, with VSIB dword indices. */
655 vex_vsib_d_w_dq_mode
,
656 /* Operand size depends on the VEX.W bit, with VSIB qword indices. */
657 vex_vsib_q_w_dq_mode
,
658 /* mandatory non-vector SIB. */
661 /* scalar, ignore vector length. */
664 /* Static rounding. */
666 /* Static rounding, 64-bit mode only. */
667 evex_rounding_64_mode
,
668 /* Supress all exceptions. */
671 /* Mask register operand. */
673 /* Mask register operand. */
741 #define FLOAT NULL, { { NULL, FLOATCODE } }, 0
743 #define DIS386(T, I) NULL, { { NULL, (T)}, { NULL, (I) } }, 0
744 #define DIS386_PREFIX(T, I, P) NULL, { { NULL, (T)}, { NULL, (I) } }, P
745 #define REG_TABLE(I) DIS386 (USE_REG_TABLE, (I))
746 #define MOD_TABLE(I) DIS386 (USE_MOD_TABLE, (I))
747 #define RM_TABLE(I) DIS386 (USE_RM_TABLE, (I))
748 #define PREFIX_TABLE(I) DIS386 (USE_PREFIX_TABLE, (I))
749 #define X86_64_TABLE(I) DIS386 (USE_X86_64_TABLE, (I))
750 #define THREE_BYTE_TABLE(I) DIS386 (USE_3BYTE_TABLE, (I))
751 #define THREE_BYTE_TABLE_PREFIX(I, P) DIS386_PREFIX (USE_3BYTE_TABLE, (I), P)
752 #define XOP_8F_TABLE(I) DIS386 (USE_XOP_8F_TABLE, (I))
753 #define VEX_C4_TABLE(I) DIS386 (USE_VEX_C4_TABLE, (I))
754 #define VEX_C5_TABLE(I) DIS386 (USE_VEX_C5_TABLE, (I))
755 #define VEX_LEN_TABLE(I) DIS386 (USE_VEX_LEN_TABLE, (I))
756 #define VEX_W_TABLE(I) DIS386 (USE_VEX_W_TABLE, (I))
757 #define EVEX_TABLE(I) DIS386 (USE_EVEX_TABLE, (I))
758 #define EVEX_LEN_TABLE(I) DIS386 (USE_EVEX_LEN_TABLE, (I))
785 REG_0F3A0F_PREFIX_1_MOD_3
,
798 REG_VEX_0F3849_X86_64_P_0_W_0_M_1
,
803 REG_XOP_09_12_M_1_L_0
,
809 REG_EVEX_0F38C6_M_0_L_2
,
810 REG_EVEX_0F38C7_M_0_L_2
887 MOD_VEX_0F12_PREFIX_0
,
888 MOD_VEX_0F12_PREFIX_2
,
890 MOD_VEX_0F16_PREFIX_0
,
891 MOD_VEX_0F16_PREFIX_2
,
915 MOD_VEX_0FF0_PREFIX_3
,
922 MOD_VEX_0F3849_X86_64_P_0_W_0
,
923 MOD_VEX_0F3849_X86_64_P_2_W_0
,
924 MOD_VEX_0F3849_X86_64_P_3_W_0
,
925 MOD_VEX_0F384B_X86_64_P_1_W_0
,
926 MOD_VEX_0F384B_X86_64_P_2_W_0
,
927 MOD_VEX_0F384B_X86_64_P_3_W_0
,
929 MOD_VEX_0F385C_X86_64_P_1_W_0
,
930 MOD_VEX_0F385E_X86_64_P_0_W_0
,
931 MOD_VEX_0F385E_X86_64_P_1_W_0
,
932 MOD_VEX_0F385E_X86_64_P_2_W_0
,
933 MOD_VEX_0F385E_X86_64_P_3_W_0
,
946 MOD_EVEX_0F382A_P_1_W_1
,
948 MOD_EVEX_0F383A_P_1_W_0
,
968 RM_0F1E_P_1_MOD_3_REG_7
,
969 RM_0FAE_REG_6_MOD_3_P_0
,
971 RM_0F3A0F_P_1_MOD_3_REG_0
,
973 RM_VEX_0F3849_X86_64_P_0_W_0_M_1_R_0
979 PREFIX_0F01_REG_1_RM_4
,
980 PREFIX_0F01_REG_1_RM_5
,
981 PREFIX_0F01_REG_1_RM_6
,
982 PREFIX_0F01_REG_1_RM_7
,
983 PREFIX_0F01_REG_3_RM_1
,
984 PREFIX_0F01_REG_5_MOD_0
,
985 PREFIX_0F01_REG_5_MOD_3_RM_0
,
986 PREFIX_0F01_REG_5_MOD_3_RM_1
,
987 PREFIX_0F01_REG_5_MOD_3_RM_2
,
988 PREFIX_0F01_REG_5_MOD_3_RM_4
,
989 PREFIX_0F01_REG_5_MOD_3_RM_5
,
990 PREFIX_0F01_REG_5_MOD_3_RM_6
,
991 PREFIX_0F01_REG_5_MOD_3_RM_7
,
992 PREFIX_0F01_REG_7_MOD_3_RM_2
,
993 PREFIX_0F01_REG_7_MOD_3_RM_6
,
994 PREFIX_0F01_REG_7_MOD_3_RM_7
,
1032 PREFIX_0FAE_REG_0_MOD_3
,
1033 PREFIX_0FAE_REG_1_MOD_3
,
1034 PREFIX_0FAE_REG_2_MOD_3
,
1035 PREFIX_0FAE_REG_3_MOD_3
,
1036 PREFIX_0FAE_REG_4_MOD_0
,
1037 PREFIX_0FAE_REG_4_MOD_3
,
1038 PREFIX_0FAE_REG_5_MOD_3
,
1039 PREFIX_0FAE_REG_6_MOD_0
,
1040 PREFIX_0FAE_REG_6_MOD_3
,
1041 PREFIX_0FAE_REG_7_MOD_0
,
1046 PREFIX_0FC7_REG_6_MOD_0
,
1047 PREFIX_0FC7_REG_6_MOD_3
,
1048 PREFIX_0FC7_REG_7_MOD_3
,
1076 PREFIX_VEX_0F41_L_1_M_1_W_0
,
1077 PREFIX_VEX_0F41_L_1_M_1_W_1
,
1078 PREFIX_VEX_0F42_L_1_M_1_W_0
,
1079 PREFIX_VEX_0F42_L_1_M_1_W_1
,
1080 PREFIX_VEX_0F44_L_0_M_1_W_0
,
1081 PREFIX_VEX_0F44_L_0_M_1_W_1
,
1082 PREFIX_VEX_0F45_L_1_M_1_W_0
,
1083 PREFIX_VEX_0F45_L_1_M_1_W_1
,
1084 PREFIX_VEX_0F46_L_1_M_1_W_0
,
1085 PREFIX_VEX_0F46_L_1_M_1_W_1
,
1086 PREFIX_VEX_0F47_L_1_M_1_W_0
,
1087 PREFIX_VEX_0F47_L_1_M_1_W_1
,
1088 PREFIX_VEX_0F4A_L_1_M_1_W_0
,
1089 PREFIX_VEX_0F4A_L_1_M_1_W_1
,
1090 PREFIX_VEX_0F4B_L_1_M_1_W_0
,
1091 PREFIX_VEX_0F4B_L_1_M_1_W_1
,
1109 PREFIX_VEX_0F90_L_0_W_0
,
1110 PREFIX_VEX_0F90_L_0_W_1
,
1111 PREFIX_VEX_0F91_L_0_M_0_W_0
,
1112 PREFIX_VEX_0F91_L_0_M_0_W_1
,
1113 PREFIX_VEX_0F92_L_0_M_1_W_0
,
1114 PREFIX_VEX_0F92_L_0_M_1_W_1
,
1115 PREFIX_VEX_0F93_L_0_M_1_W_0
,
1116 PREFIX_VEX_0F93_L_0_M_1_W_1
,
1117 PREFIX_VEX_0F98_L_0_M_1_W_0
,
1118 PREFIX_VEX_0F98_L_0_M_1_W_1
,
1119 PREFIX_VEX_0F99_L_0_M_1_W_0
,
1120 PREFIX_VEX_0F99_L_0_M_1_W_1
,
1125 PREFIX_VEX_0F3849_X86_64
,
1126 PREFIX_VEX_0F384B_X86_64
,
1127 PREFIX_VEX_0F385C_X86_64
,
1128 PREFIX_VEX_0F385E_X86_64
,
1129 PREFIX_VEX_0F38F5_L_0
,
1130 PREFIX_VEX_0F38F6_L_0
,
1131 PREFIX_VEX_0F38F7_L_0
,
1132 PREFIX_VEX_0F3AF0_L_0
,
1190 PREFIX_EVEX_MAP5_10
,
1191 PREFIX_EVEX_MAP5_11
,
1192 PREFIX_EVEX_MAP5_1D
,
1193 PREFIX_EVEX_MAP5_2A
,
1194 PREFIX_EVEX_MAP5_2C
,
1195 PREFIX_EVEX_MAP5_2D
,
1196 PREFIX_EVEX_MAP5_2E
,
1197 PREFIX_EVEX_MAP5_2F
,
1198 PREFIX_EVEX_MAP5_51
,
1199 PREFIX_EVEX_MAP5_58
,
1200 PREFIX_EVEX_MAP5_59
,
1201 PREFIX_EVEX_MAP5_5A
,
1202 PREFIX_EVEX_MAP5_5B
,
1203 PREFIX_EVEX_MAP5_5C
,
1204 PREFIX_EVEX_MAP5_5D
,
1205 PREFIX_EVEX_MAP5_5E
,
1206 PREFIX_EVEX_MAP5_5F
,
1207 PREFIX_EVEX_MAP5_78
,
1208 PREFIX_EVEX_MAP5_79
,
1209 PREFIX_EVEX_MAP5_7A
,
1210 PREFIX_EVEX_MAP5_7B
,
1211 PREFIX_EVEX_MAP5_7C
,
1212 PREFIX_EVEX_MAP5_7D
,
1214 PREFIX_EVEX_MAP6_13
,
1215 PREFIX_EVEX_MAP6_56
,
1216 PREFIX_EVEX_MAP6_57
,
1217 PREFIX_EVEX_MAP6_D6
,
1218 PREFIX_EVEX_MAP6_D7
,
1254 X86_64_0F01_REG_1_RM_5_PREFIX_2
,
1255 X86_64_0F01_REG_1_RM_6_PREFIX_2
,
1256 X86_64_0F01_REG_1_RM_7_PREFIX_2
,
1259 X86_64_0F01_REG_5_MOD_3_RM_4_PREFIX_1
,
1260 X86_64_0F01_REG_5_MOD_3_RM_5_PREFIX_1
,
1261 X86_64_0F01_REG_5_MOD_3_RM_6_PREFIX_1
,
1262 X86_64_0F01_REG_5_MOD_3_RM_7_PREFIX_1
,
1263 X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_1
,
1264 X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3
,
1265 X86_64_0F01_REG_7_MOD_3_RM_7_PREFIX_1
,
1268 X86_64_0FC7_REG_6_MOD_3_PREFIX_1
,
1278 THREE_BYTE_0F38
= 0,
1307 VEX_LEN_0F12_P_0_M_0
= 0,
1308 VEX_LEN_0F12_P_0_M_1
,
1309 #define VEX_LEN_0F12_P_2_M_0 VEX_LEN_0F12_P_0_M_0
1311 VEX_LEN_0F16_P_0_M_0
,
1312 VEX_LEN_0F16_P_0_M_1
,
1313 #define VEX_LEN_0F16_P_2_M_0 VEX_LEN_0F16_P_0_M_0
1333 VEX_LEN_0FAE_R_2_M_0
,
1334 VEX_LEN_0FAE_R_3_M_0
,
1344 VEX_LEN_0F3849_X86_64_P_0_W_0_M_0
,
1345 VEX_LEN_0F3849_X86_64_P_0_W_0_M_1_REG_0_RM_0
,
1346 VEX_LEN_0F3849_X86_64_P_2_W_0_M_0
,
1347 VEX_LEN_0F3849_X86_64_P_3_W_0_M_0
,
1348 VEX_LEN_0F384B_X86_64_P_1_W_0_M_0
,
1349 VEX_LEN_0F384B_X86_64_P_2_W_0_M_0
,
1350 VEX_LEN_0F384B_X86_64_P_3_W_0_M_0
,
1352 VEX_LEN_0F385C_X86_64_P_1_W_0_M_0
,
1353 VEX_LEN_0F385E_X86_64_P_0_W_0_M_0
,
1354 VEX_LEN_0F385E_X86_64_P_1_W_0_M_0
,
1355 VEX_LEN_0F385E_X86_64_P_2_W_0_M_0
,
1356 VEX_LEN_0F385E_X86_64_P_3_W_0_M_0
,
1389 VEX_LEN_0FXOP_08_85
,
1390 VEX_LEN_0FXOP_08_86
,
1391 VEX_LEN_0FXOP_08_87
,
1392 VEX_LEN_0FXOP_08_8E
,
1393 VEX_LEN_0FXOP_08_8F
,
1394 VEX_LEN_0FXOP_08_95
,
1395 VEX_LEN_0FXOP_08_96
,
1396 VEX_LEN_0FXOP_08_97
,
1397 VEX_LEN_0FXOP_08_9E
,
1398 VEX_LEN_0FXOP_08_9F
,
1399 VEX_LEN_0FXOP_08_A3
,
1400 VEX_LEN_0FXOP_08_A6
,
1401 VEX_LEN_0FXOP_08_B6
,
1402 VEX_LEN_0FXOP_08_C0
,
1403 VEX_LEN_0FXOP_08_C1
,
1404 VEX_LEN_0FXOP_08_C2
,
1405 VEX_LEN_0FXOP_08_C3
,
1406 VEX_LEN_0FXOP_08_CC
,
1407 VEX_LEN_0FXOP_08_CD
,
1408 VEX_LEN_0FXOP_08_CE
,
1409 VEX_LEN_0FXOP_08_CF
,
1410 VEX_LEN_0FXOP_08_EC
,
1411 VEX_LEN_0FXOP_08_ED
,
1412 VEX_LEN_0FXOP_08_EE
,
1413 VEX_LEN_0FXOP_08_EF
,
1414 VEX_LEN_0FXOP_09_01
,
1415 VEX_LEN_0FXOP_09_02
,
1416 VEX_LEN_0FXOP_09_12_M_1
,
1417 VEX_LEN_0FXOP_09_82_W_0
,
1418 VEX_LEN_0FXOP_09_83_W_0
,
1419 VEX_LEN_0FXOP_09_90
,
1420 VEX_LEN_0FXOP_09_91
,
1421 VEX_LEN_0FXOP_09_92
,
1422 VEX_LEN_0FXOP_09_93
,
1423 VEX_LEN_0FXOP_09_94
,
1424 VEX_LEN_0FXOP_09_95
,
1425 VEX_LEN_0FXOP_09_96
,
1426 VEX_LEN_0FXOP_09_97
,
1427 VEX_LEN_0FXOP_09_98
,
1428 VEX_LEN_0FXOP_09_99
,
1429 VEX_LEN_0FXOP_09_9A
,
1430 VEX_LEN_0FXOP_09_9B
,
1431 VEX_LEN_0FXOP_09_C1
,
1432 VEX_LEN_0FXOP_09_C2
,
1433 VEX_LEN_0FXOP_09_C3
,
1434 VEX_LEN_0FXOP_09_C6
,
1435 VEX_LEN_0FXOP_09_C7
,
1436 VEX_LEN_0FXOP_09_CB
,
1437 VEX_LEN_0FXOP_09_D1
,
1438 VEX_LEN_0FXOP_09_D2
,
1439 VEX_LEN_0FXOP_09_D3
,
1440 VEX_LEN_0FXOP_09_D6
,
1441 VEX_LEN_0FXOP_09_D7
,
1442 VEX_LEN_0FXOP_09_DB
,
1443 VEX_LEN_0FXOP_09_E1
,
1444 VEX_LEN_0FXOP_09_E2
,
1445 VEX_LEN_0FXOP_09_E3
,
1446 VEX_LEN_0FXOP_0A_12
,
1451 EVEX_LEN_0F3816
= 0,
1453 EVEX_LEN_0F381A_M_0
,
1454 EVEX_LEN_0F381B_M_0
,
1456 EVEX_LEN_0F385A_M_0
,
1457 EVEX_LEN_0F385B_M_0
,
1458 EVEX_LEN_0F38C6_M_0
,
1459 EVEX_LEN_0F38C7_M_0
,
1476 VEX_W_0F41_L_1_M_1
= 0,
1498 VEX_W_0F381A_M_0_L_1
,
1505 VEX_W_0F3849_X86_64_P_0
,
1506 VEX_W_0F3849_X86_64_P_2
,
1507 VEX_W_0F3849_X86_64_P_3
,
1508 VEX_W_0F384B_X86_64_P_1
,
1509 VEX_W_0F384B_X86_64_P_2
,
1510 VEX_W_0F384B_X86_64_P_3
,
1517 VEX_W_0F385A_M_0_L_0
,
1518 VEX_W_0F385C_X86_64_P_1
,
1519 VEX_W_0F385E_X86_64_P_0
,
1520 VEX_W_0F385E_X86_64_P_1
,
1521 VEX_W_0F385E_X86_64_P_2
,
1522 VEX_W_0F385E_X86_64_P_3
,
1544 VEX_W_0FXOP_08_85_L_0
,
1545 VEX_W_0FXOP_08_86_L_0
,
1546 VEX_W_0FXOP_08_87_L_0
,
1547 VEX_W_0FXOP_08_8E_L_0
,
1548 VEX_W_0FXOP_08_8F_L_0
,
1549 VEX_W_0FXOP_08_95_L_0
,
1550 VEX_W_0FXOP_08_96_L_0
,
1551 VEX_W_0FXOP_08_97_L_0
,
1552 VEX_W_0FXOP_08_9E_L_0
,
1553 VEX_W_0FXOP_08_9F_L_0
,
1554 VEX_W_0FXOP_08_A6_L_0
,
1555 VEX_W_0FXOP_08_B6_L_0
,
1556 VEX_W_0FXOP_08_C0_L_0
,
1557 VEX_W_0FXOP_08_C1_L_0
,
1558 VEX_W_0FXOP_08_C2_L_0
,
1559 VEX_W_0FXOP_08_C3_L_0
,
1560 VEX_W_0FXOP_08_CC_L_0
,
1561 VEX_W_0FXOP_08_CD_L_0
,
1562 VEX_W_0FXOP_08_CE_L_0
,
1563 VEX_W_0FXOP_08_CF_L_0
,
1564 VEX_W_0FXOP_08_EC_L_0
,
1565 VEX_W_0FXOP_08_ED_L_0
,
1566 VEX_W_0FXOP_08_EE_L_0
,
1567 VEX_W_0FXOP_08_EF_L_0
,
1573 VEX_W_0FXOP_09_C1_L_0
,
1574 VEX_W_0FXOP_09_C2_L_0
,
1575 VEX_W_0FXOP_09_C3_L_0
,
1576 VEX_W_0FXOP_09_C6_L_0
,
1577 VEX_W_0FXOP_09_C7_L_0
,
1578 VEX_W_0FXOP_09_CB_L_0
,
1579 VEX_W_0FXOP_09_D1_L_0
,
1580 VEX_W_0FXOP_09_D2_L_0
,
1581 VEX_W_0FXOP_09_D3_L_0
,
1582 VEX_W_0FXOP_09_D6_L_0
,
1583 VEX_W_0FXOP_09_D7_L_0
,
1584 VEX_W_0FXOP_09_DB_L_0
,
1585 VEX_W_0FXOP_09_E1_L_0
,
1586 VEX_W_0FXOP_09_E2_L_0
,
1587 VEX_W_0FXOP_09_E3_L_0
,
1640 EVEX_W_0F381A_M_0_L_n
,
1641 EVEX_W_0F381B_M_0_L_2
,
1666 EVEX_W_0F385A_M_0_L_n
,
1667 EVEX_W_0F385B_M_0_L_2
,
1693 typedef void (*op_rtn
) (instr_info
*ins
, int bytemode
, int sizeflag
);
1702 unsigned int prefix_requirement
;
1705 /* Upper case letters in the instruction names here are macros.
1706 'A' => print 'b' if no register operands or suffix_always is true
1707 'B' => print 'b' if suffix_always is true
1708 'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
1710 'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
1711 suffix_always is true
1712 'E' => print 'e' if 32-bit form of jcxz
1713 'F' => print 'w' or 'l' depending on address size prefix (loop insns)
1714 'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
1715 'H' => print ",pt" or ",pn" branch hint
1718 'K' => print 'd' or 'q' if rex prefix is present.
1720 'M' => print 'r' if intel_mnemonic is false.
1721 'N' => print 'n' if instruction has no wait "prefix"
1722 'O' => print 'd' or 'o' (or 'q' in Intel mode)
1723 'P' => behave as 'T' except with register operand outside of suffix_always
1725 'Q' => print 'w', 'l' or 'q' for memory operand or suffix_always
1727 'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
1728 'S' => print 'w', 'l' or 'q' if suffix_always is true
1729 'T' => print 'w', 'l'/'d', or 'q' if instruction has an operand size
1730 prefix or if suffix_always is true.
1733 'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
1734 'X' => print 's', 'd' depending on data16 prefix (for XMM)
1736 'Z' => print 'q' in 64bit mode and 'l' otherwise, if suffix_always is true.
1737 '!' => change condition from true to false or from false to true.
1738 '%' => add 1 upper case letter to the macro.
1739 '^' => print 'w', 'l', or 'q' (Intel64 ISA only) depending on operand size
1740 prefix or suffix_always is true (lcall/ljmp).
1741 '@' => in 64bit mode for Intel64 ISA or if instruction
1742 has no operand sizing prefix, print 'q' if suffix_always is true or
1743 nothing otherwise; behave as 'P' in all other cases
1745 2 upper case letter macros:
1746 "XY" => print 'x' or 'y' if suffix_always is true or no register
1747 operands and no broadcast.
1748 "XZ" => print 'x', 'y', or 'z' if suffix_always is true or no
1749 register operands and no broadcast.
1750 "XW" => print 's', 'd' depending on the VEX.W bit (for FMA)
1751 "XD" => print 'd' if !EVEX or EVEX.W=1, EVEX.W=0 is not a valid encoding
1752 "XH" => print 'h' if EVEX.W=0, EVEX.W=1 is not a valid encoding (for FP16)
1753 "XS" => print 's' if !EVEX or EVEX.W=0, EVEX.W=1 is not a valid encoding
1754 "XV" => print "{vex3}" pseudo prefix
1755 "LQ" => print 'l' ('d' in Intel mode) or 'q' for memory operand, cond
1756 being false, or no operand at all in 64bit mode, or if suffix_always
1758 "LB" => print "abs" in 64bit mode and behave as 'B' otherwise
1759 "LS" => print "abs" in 64bit mode and behave as 'S' otherwise
1760 "LV" => print "abs" for 64bit operand and behave as 'S' otherwise
1761 "DQ" => print 'd' or 'q' depending on the VEX.W bit
1762 "BW" => print 'b' or 'w' depending on the VEX.W bit
1763 "LP" => print 'w' or 'l' ('d' in Intel mode) if instruction has
1764 an operand size prefix, or suffix_always is true. print
1765 'q' if rex prefix is present.
1767 Many of the above letters print nothing in Intel mode. See "putop"
1770 Braces '{' and '}', and vertical bars '|', indicate alternative
1771 mnemonic strings for AT&T and Intel. */
1773 static const struct dis386 dis386
[] = {
1775 { "addB", { Ebh1
, Gb
}, 0 },
1776 { "addS", { Evh1
, Gv
}, 0 },
1777 { "addB", { Gb
, EbS
}, 0 },
1778 { "addS", { Gv
, EvS
}, 0 },
1779 { "addB", { AL
, Ib
}, 0 },
1780 { "addS", { eAX
, Iv
}, 0 },
1781 { X86_64_TABLE (X86_64_06
) },
1782 { X86_64_TABLE (X86_64_07
) },
1784 { "orB", { Ebh1
, Gb
}, 0 },
1785 { "orS", { Evh1
, Gv
}, 0 },
1786 { "orB", { Gb
, EbS
}, 0 },
1787 { "orS", { Gv
, EvS
}, 0 },
1788 { "orB", { AL
, Ib
}, 0 },
1789 { "orS", { eAX
, Iv
}, 0 },
1790 { X86_64_TABLE (X86_64_0E
) },
1791 { Bad_Opcode
}, /* 0x0f extended opcode escape */
1793 { "adcB", { Ebh1
, Gb
}, 0 },
1794 { "adcS", { Evh1
, Gv
}, 0 },
1795 { "adcB", { Gb
, EbS
}, 0 },
1796 { "adcS", { Gv
, EvS
}, 0 },
1797 { "adcB", { AL
, Ib
}, 0 },
1798 { "adcS", { eAX
, Iv
}, 0 },
1799 { X86_64_TABLE (X86_64_16
) },
1800 { X86_64_TABLE (X86_64_17
) },
1802 { "sbbB", { Ebh1
, Gb
}, 0 },
1803 { "sbbS", { Evh1
, Gv
}, 0 },
1804 { "sbbB", { Gb
, EbS
}, 0 },
1805 { "sbbS", { Gv
, EvS
}, 0 },
1806 { "sbbB", { AL
, Ib
}, 0 },
1807 { "sbbS", { eAX
, Iv
}, 0 },
1808 { X86_64_TABLE (X86_64_1E
) },
1809 { X86_64_TABLE (X86_64_1F
) },
1811 { "andB", { Ebh1
, Gb
}, 0 },
1812 { "andS", { Evh1
, Gv
}, 0 },
1813 { "andB", { Gb
, EbS
}, 0 },
1814 { "andS", { Gv
, EvS
}, 0 },
1815 { "andB", { AL
, Ib
}, 0 },
1816 { "andS", { eAX
, Iv
}, 0 },
1817 { Bad_Opcode
}, /* SEG ES prefix */
1818 { X86_64_TABLE (X86_64_27
) },
1820 { "subB", { Ebh1
, Gb
}, 0 },
1821 { "subS", { Evh1
, Gv
}, 0 },
1822 { "subB", { Gb
, EbS
}, 0 },
1823 { "subS", { Gv
, EvS
}, 0 },
1824 { "subB", { AL
, Ib
}, 0 },
1825 { "subS", { eAX
, Iv
}, 0 },
1826 { Bad_Opcode
}, /* SEG CS prefix */
1827 { X86_64_TABLE (X86_64_2F
) },
1829 { "xorB", { Ebh1
, Gb
}, 0 },
1830 { "xorS", { Evh1
, Gv
}, 0 },
1831 { "xorB", { Gb
, EbS
}, 0 },
1832 { "xorS", { Gv
, EvS
}, 0 },
1833 { "xorB", { AL
, Ib
}, 0 },
1834 { "xorS", { eAX
, Iv
}, 0 },
1835 { Bad_Opcode
}, /* SEG SS prefix */
1836 { X86_64_TABLE (X86_64_37
) },
1838 { "cmpB", { Eb
, Gb
}, 0 },
1839 { "cmpS", { Ev
, Gv
}, 0 },
1840 { "cmpB", { Gb
, EbS
}, 0 },
1841 { "cmpS", { Gv
, EvS
}, 0 },
1842 { "cmpB", { AL
, Ib
}, 0 },
1843 { "cmpS", { eAX
, Iv
}, 0 },
1844 { Bad_Opcode
}, /* SEG DS prefix */
1845 { X86_64_TABLE (X86_64_3F
) },
1847 { "inc{S|}", { RMeAX
}, 0 },
1848 { "inc{S|}", { RMeCX
}, 0 },
1849 { "inc{S|}", { RMeDX
}, 0 },
1850 { "inc{S|}", { RMeBX
}, 0 },
1851 { "inc{S|}", { RMeSP
}, 0 },
1852 { "inc{S|}", { RMeBP
}, 0 },
1853 { "inc{S|}", { RMeSI
}, 0 },
1854 { "inc{S|}", { RMeDI
}, 0 },
1856 { "dec{S|}", { RMeAX
}, 0 },
1857 { "dec{S|}", { RMeCX
}, 0 },
1858 { "dec{S|}", { RMeDX
}, 0 },
1859 { "dec{S|}", { RMeBX
}, 0 },
1860 { "dec{S|}", { RMeSP
}, 0 },
1861 { "dec{S|}", { RMeBP
}, 0 },
1862 { "dec{S|}", { RMeSI
}, 0 },
1863 { "dec{S|}", { RMeDI
}, 0 },
1865 { "push{!P|}", { RMrAX
}, 0 },
1866 { "push{!P|}", { RMrCX
}, 0 },
1867 { "push{!P|}", { RMrDX
}, 0 },
1868 { "push{!P|}", { RMrBX
}, 0 },
1869 { "push{!P|}", { RMrSP
}, 0 },
1870 { "push{!P|}", { RMrBP
}, 0 },
1871 { "push{!P|}", { RMrSI
}, 0 },
1872 { "push{!P|}", { RMrDI
}, 0 },
1874 { "pop{!P|}", { RMrAX
}, 0 },
1875 { "pop{!P|}", { RMrCX
}, 0 },
1876 { "pop{!P|}", { RMrDX
}, 0 },
1877 { "pop{!P|}", { RMrBX
}, 0 },
1878 { "pop{!P|}", { RMrSP
}, 0 },
1879 { "pop{!P|}", { RMrBP
}, 0 },
1880 { "pop{!P|}", { RMrSI
}, 0 },
1881 { "pop{!P|}", { RMrDI
}, 0 },
1883 { X86_64_TABLE (X86_64_60
) },
1884 { X86_64_TABLE (X86_64_61
) },
1885 { X86_64_TABLE (X86_64_62
) },
1886 { X86_64_TABLE (X86_64_63
) },
1887 { Bad_Opcode
}, /* seg fs */
1888 { Bad_Opcode
}, /* seg gs */
1889 { Bad_Opcode
}, /* op size prefix */
1890 { Bad_Opcode
}, /* adr size prefix */
1892 { "pushP", { sIv
}, 0 },
1893 { "imulS", { Gv
, Ev
, Iv
}, 0 },
1894 { "pushP", { sIbT
}, 0 },
1895 { "imulS", { Gv
, Ev
, sIb
}, 0 },
1896 { "ins{b|}", { Ybr
, indirDX
}, 0 },
1897 { X86_64_TABLE (X86_64_6D
) },
1898 { "outs{b|}", { indirDXr
, Xb
}, 0 },
1899 { X86_64_TABLE (X86_64_6F
) },
1901 { "joH", { Jb
, BND
, cond_jump_flag
}, 0 },
1902 { "jnoH", { Jb
, BND
, cond_jump_flag
}, 0 },
1903 { "jbH", { Jb
, BND
, cond_jump_flag
}, 0 },
1904 { "jaeH", { Jb
, BND
, cond_jump_flag
}, 0 },
1905 { "jeH", { Jb
, BND
, cond_jump_flag
}, 0 },
1906 { "jneH", { Jb
, BND
, cond_jump_flag
}, 0 },
1907 { "jbeH", { Jb
, BND
, cond_jump_flag
}, 0 },
1908 { "jaH", { Jb
, BND
, cond_jump_flag
}, 0 },
1910 { "jsH", { Jb
, BND
, cond_jump_flag
}, 0 },
1911 { "jnsH", { Jb
, BND
, cond_jump_flag
}, 0 },
1912 { "jpH", { Jb
, BND
, cond_jump_flag
}, 0 },
1913 { "jnpH", { Jb
, BND
, cond_jump_flag
}, 0 },
1914 { "jlH", { Jb
, BND
, cond_jump_flag
}, 0 },
1915 { "jgeH", { Jb
, BND
, cond_jump_flag
}, 0 },
1916 { "jleH", { Jb
, BND
, cond_jump_flag
}, 0 },
1917 { "jgH", { Jb
, BND
, cond_jump_flag
}, 0 },
1919 { REG_TABLE (REG_80
) },
1920 { REG_TABLE (REG_81
) },
1921 { X86_64_TABLE (X86_64_82
) },
1922 { REG_TABLE (REG_83
) },
1923 { "testB", { Eb
, Gb
}, 0 },
1924 { "testS", { Ev
, Gv
}, 0 },
1925 { "xchgB", { Ebh2
, Gb
}, 0 },
1926 { "xchgS", { Evh2
, Gv
}, 0 },
1928 { "movB", { Ebh3
, Gb
}, 0 },
1929 { "movS", { Evh3
, Gv
}, 0 },
1930 { "movB", { Gb
, EbS
}, 0 },
1931 { "movS", { Gv
, EvS
}, 0 },
1932 { "movD", { Sv
, Sw
}, 0 },
1933 { MOD_TABLE (MOD_8D
) },
1934 { "movD", { Sw
, Sv
}, 0 },
1935 { REG_TABLE (REG_8F
) },
1937 { PREFIX_TABLE (PREFIX_90
) },
1938 { "xchgS", { RMeCX
, eAX
}, 0 },
1939 { "xchgS", { RMeDX
, eAX
}, 0 },
1940 { "xchgS", { RMeBX
, eAX
}, 0 },
1941 { "xchgS", { RMeSP
, eAX
}, 0 },
1942 { "xchgS", { RMeBP
, eAX
}, 0 },
1943 { "xchgS", { RMeSI
, eAX
}, 0 },
1944 { "xchgS", { RMeDI
, eAX
}, 0 },
1946 { "cW{t|}R", { XX
}, 0 },
1947 { "cR{t|}O", { XX
}, 0 },
1948 { X86_64_TABLE (X86_64_9A
) },
1949 { Bad_Opcode
}, /* fwait */
1950 { "pushfP", { XX
}, 0 },
1951 { "popfP", { XX
}, 0 },
1952 { "sahf", { XX
}, 0 },
1953 { "lahf", { XX
}, 0 },
1955 { "mov%LB", { AL
, Ob
}, 0 },
1956 { "mov%LS", { eAX
, Ov
}, 0 },
1957 { "mov%LB", { Ob
, AL
}, 0 },
1958 { "mov%LS", { Ov
, eAX
}, 0 },
1959 { "movs{b|}", { Ybr
, Xb
}, 0 },
1960 { "movs{R|}", { Yvr
, Xv
}, 0 },
1961 { "cmps{b|}", { Xb
, Yb
}, 0 },
1962 { "cmps{R|}", { Xv
, Yv
}, 0 },
1964 { "testB", { AL
, Ib
}, 0 },
1965 { "testS", { eAX
, Iv
}, 0 },
1966 { "stosB", { Ybr
, AL
}, 0 },
1967 { "stosS", { Yvr
, eAX
}, 0 },
1968 { "lodsB", { ALr
, Xb
}, 0 },
1969 { "lodsS", { eAXr
, Xv
}, 0 },
1970 { "scasB", { AL
, Yb
}, 0 },
1971 { "scasS", { eAX
, Yv
}, 0 },
1973 { "movB", { RMAL
, Ib
}, 0 },
1974 { "movB", { RMCL
, Ib
}, 0 },
1975 { "movB", { RMDL
, Ib
}, 0 },
1976 { "movB", { RMBL
, Ib
}, 0 },
1977 { "movB", { RMAH
, Ib
}, 0 },
1978 { "movB", { RMCH
, Ib
}, 0 },
1979 { "movB", { RMDH
, Ib
}, 0 },
1980 { "movB", { RMBH
, Ib
}, 0 },
1982 { "mov%LV", { RMeAX
, Iv64
}, 0 },
1983 { "mov%LV", { RMeCX
, Iv64
}, 0 },
1984 { "mov%LV", { RMeDX
, Iv64
}, 0 },
1985 { "mov%LV", { RMeBX
, Iv64
}, 0 },
1986 { "mov%LV", { RMeSP
, Iv64
}, 0 },
1987 { "mov%LV", { RMeBP
, Iv64
}, 0 },
1988 { "mov%LV", { RMeSI
, Iv64
}, 0 },
1989 { "mov%LV", { RMeDI
, Iv64
}, 0 },
1991 { REG_TABLE (REG_C0
) },
1992 { REG_TABLE (REG_C1
) },
1993 { X86_64_TABLE (X86_64_C2
) },
1994 { X86_64_TABLE (X86_64_C3
) },
1995 { X86_64_TABLE (X86_64_C4
) },
1996 { X86_64_TABLE (X86_64_C5
) },
1997 { REG_TABLE (REG_C6
) },
1998 { REG_TABLE (REG_C7
) },
2000 { "enterP", { Iw
, Ib
}, 0 },
2001 { "leaveP", { XX
}, 0 },
2002 { "{l|}ret{|f}%LP", { Iw
}, 0 },
2003 { "{l|}ret{|f}%LP", { XX
}, 0 },
2004 { "int3", { XX
}, 0 },
2005 { "int", { Ib
}, 0 },
2006 { X86_64_TABLE (X86_64_CE
) },
2007 { "iret%LP", { XX
}, 0 },
2009 { REG_TABLE (REG_D0
) },
2010 { REG_TABLE (REG_D1
) },
2011 { REG_TABLE (REG_D2
) },
2012 { REG_TABLE (REG_D3
) },
2013 { X86_64_TABLE (X86_64_D4
) },
2014 { X86_64_TABLE (X86_64_D5
) },
2016 { "xlat", { DSBX
}, 0 },
2027 { "loopneFH", { Jb
, XX
, loop_jcxz_flag
}, 0 },
2028 { "loopeFH", { Jb
, XX
, loop_jcxz_flag
}, 0 },
2029 { "loopFH", { Jb
, XX
, loop_jcxz_flag
}, 0 },
2030 { "jEcxzH", { Jb
, XX
, loop_jcxz_flag
}, 0 },
2031 { "inB", { AL
, Ib
}, 0 },
2032 { "inG", { zAX
, Ib
}, 0 },
2033 { "outB", { Ib
, AL
}, 0 },
2034 { "outG", { Ib
, zAX
}, 0 },
2036 { X86_64_TABLE (X86_64_E8
) },
2037 { X86_64_TABLE (X86_64_E9
) },
2038 { X86_64_TABLE (X86_64_EA
) },
2039 { "jmp", { Jb
, BND
}, 0 },
2040 { "inB", { AL
, indirDX
}, 0 },
2041 { "inG", { zAX
, indirDX
}, 0 },
2042 { "outB", { indirDX
, AL
}, 0 },
2043 { "outG", { indirDX
, zAX
}, 0 },
2045 { Bad_Opcode
}, /* lock prefix */
2046 { "int1", { XX
}, 0 },
2047 { Bad_Opcode
}, /* repne */
2048 { Bad_Opcode
}, /* repz */
2049 { "hlt", { XX
}, 0 },
2050 { "cmc", { XX
}, 0 },
2051 { REG_TABLE (REG_F6
) },
2052 { REG_TABLE (REG_F7
) },
2054 { "clc", { XX
}, 0 },
2055 { "stc", { XX
}, 0 },
2056 { "cli", { XX
}, 0 },
2057 { "sti", { XX
}, 0 },
2058 { "cld", { XX
}, 0 },
2059 { "std", { XX
}, 0 },
2060 { REG_TABLE (REG_FE
) },
2061 { REG_TABLE (REG_FF
) },
2064 static const struct dis386 dis386_twobyte
[] = {
2066 { REG_TABLE (REG_0F00
) },
2067 { REG_TABLE (REG_0F01
) },
2068 { "larS", { Gv
, Ew
}, 0 },
2069 { "lslS", { Gv
, Ew
}, 0 },
2071 { "syscall", { XX
}, 0 },
2072 { "clts", { XX
}, 0 },
2073 { "sysret%LQ", { XX
}, 0 },
2075 { "invd", { XX
}, 0 },
2076 { PREFIX_TABLE (PREFIX_0F09
) },
2078 { "ud2", { XX
}, 0 },
2080 { REG_TABLE (REG_0F0D
) },
2081 { "femms", { XX
}, 0 },
2082 { "", { MX
, EM
, OPSUF
}, 0 }, /* See OP_3DNowSuffix. */
2084 { PREFIX_TABLE (PREFIX_0F10
) },
2085 { PREFIX_TABLE (PREFIX_0F11
) },
2086 { PREFIX_TABLE (PREFIX_0F12
) },
2087 { MOD_TABLE (MOD_0F13
) },
2088 { "unpcklpX", { XM
, EXx
}, PREFIX_OPCODE
},
2089 { "unpckhpX", { XM
, EXx
}, PREFIX_OPCODE
},
2090 { PREFIX_TABLE (PREFIX_0F16
) },
2091 { MOD_TABLE (MOD_0F17
) },
2093 { REG_TABLE (REG_0F18
) },
2094 { "nopQ", { Ev
}, 0 },
2095 { PREFIX_TABLE (PREFIX_0F1A
) },
2096 { PREFIX_TABLE (PREFIX_0F1B
) },
2097 { PREFIX_TABLE (PREFIX_0F1C
) },
2098 { "nopQ", { Ev
}, 0 },
2099 { PREFIX_TABLE (PREFIX_0F1E
) },
2100 { "nopQ", { Ev
}, 0 },
2102 { "movZ", { Em
, Cm
}, 0 },
2103 { "movZ", { Em
, Dm
}, 0 },
2104 { "movZ", { Cm
, Em
}, 0 },
2105 { "movZ", { Dm
, Em
}, 0 },
2106 { X86_64_TABLE (X86_64_0F24
) },
2108 { X86_64_TABLE (X86_64_0F26
) },
2111 { "movapX", { XM
, EXx
}, PREFIX_OPCODE
},
2112 { "movapX", { EXxS
, XM
}, PREFIX_OPCODE
},
2113 { PREFIX_TABLE (PREFIX_0F2A
) },
2114 { PREFIX_TABLE (PREFIX_0F2B
) },
2115 { PREFIX_TABLE (PREFIX_0F2C
) },
2116 { PREFIX_TABLE (PREFIX_0F2D
) },
2117 { PREFIX_TABLE (PREFIX_0F2E
) },
2118 { PREFIX_TABLE (PREFIX_0F2F
) },
2120 { "wrmsr", { XX
}, 0 },
2121 { "rdtsc", { XX
}, 0 },
2122 { "rdmsr", { XX
}, 0 },
2123 { "rdpmc", { XX
}, 0 },
2124 { "sysenter", { SEP
}, 0 },
2125 { "sysexit%LQ", { SEP
}, 0 },
2127 { "getsec", { XX
}, 0 },
2129 { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F38
, PREFIX_OPCODE
) },
2131 { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F3A
, PREFIX_OPCODE
) },
2138 { "cmovoS", { Gv
, Ev
}, 0 },
2139 { "cmovnoS", { Gv
, Ev
}, 0 },
2140 { "cmovbS", { Gv
, Ev
}, 0 },
2141 { "cmovaeS", { Gv
, Ev
}, 0 },
2142 { "cmoveS", { Gv
, Ev
}, 0 },
2143 { "cmovneS", { Gv
, Ev
}, 0 },
2144 { "cmovbeS", { Gv
, Ev
}, 0 },
2145 { "cmovaS", { Gv
, Ev
}, 0 },
2147 { "cmovsS", { Gv
, Ev
}, 0 },
2148 { "cmovnsS", { Gv
, Ev
}, 0 },
2149 { "cmovpS", { Gv
, Ev
}, 0 },
2150 { "cmovnpS", { Gv
, Ev
}, 0 },
2151 { "cmovlS", { Gv
, Ev
}, 0 },
2152 { "cmovgeS", { Gv
, Ev
}, 0 },
2153 { "cmovleS", { Gv
, Ev
}, 0 },
2154 { "cmovgS", { Gv
, Ev
}, 0 },
2156 { MOD_TABLE (MOD_0F50
) },
2157 { PREFIX_TABLE (PREFIX_0F51
) },
2158 { PREFIX_TABLE (PREFIX_0F52
) },
2159 { PREFIX_TABLE (PREFIX_0F53
) },
2160 { "andpX", { XM
, EXx
}, PREFIX_OPCODE
},
2161 { "andnpX", { XM
, EXx
}, PREFIX_OPCODE
},
2162 { "orpX", { XM
, EXx
}, PREFIX_OPCODE
},
2163 { "xorpX", { XM
, EXx
}, PREFIX_OPCODE
},
2165 { PREFIX_TABLE (PREFIX_0F58
) },
2166 { PREFIX_TABLE (PREFIX_0F59
) },
2167 { PREFIX_TABLE (PREFIX_0F5A
) },
2168 { PREFIX_TABLE (PREFIX_0F5B
) },
2169 { PREFIX_TABLE (PREFIX_0F5C
) },
2170 { PREFIX_TABLE (PREFIX_0F5D
) },
2171 { PREFIX_TABLE (PREFIX_0F5E
) },
2172 { PREFIX_TABLE (PREFIX_0F5F
) },
2174 { PREFIX_TABLE (PREFIX_0F60
) },
2175 { PREFIX_TABLE (PREFIX_0F61
) },
2176 { PREFIX_TABLE (PREFIX_0F62
) },
2177 { "packsswb", { MX
, EM
}, PREFIX_OPCODE
},
2178 { "pcmpgtb", { MX
, EM
}, PREFIX_OPCODE
},
2179 { "pcmpgtw", { MX
, EM
}, PREFIX_OPCODE
},
2180 { "pcmpgtd", { MX
, EM
}, PREFIX_OPCODE
},
2181 { "packuswb", { MX
, EM
}, PREFIX_OPCODE
},
2183 { "punpckhbw", { MX
, EM
}, PREFIX_OPCODE
},
2184 { "punpckhwd", { MX
, EM
}, PREFIX_OPCODE
},
2185 { "punpckhdq", { MX
, EM
}, PREFIX_OPCODE
},
2186 { "packssdw", { MX
, EM
}, PREFIX_OPCODE
},
2187 { "punpcklqdq", { XM
, EXx
}, PREFIX_DATA
},
2188 { "punpckhqdq", { XM
, EXx
}, PREFIX_DATA
},
2189 { "movK", { MX
, Edq
}, PREFIX_OPCODE
},
2190 { PREFIX_TABLE (PREFIX_0F6F
) },
2192 { PREFIX_TABLE (PREFIX_0F70
) },
2193 { MOD_TABLE (MOD_0F71
) },
2194 { MOD_TABLE (MOD_0F72
) },
2195 { MOD_TABLE (MOD_0F73
) },
2196 { "pcmpeqb", { MX
, EM
}, PREFIX_OPCODE
},
2197 { "pcmpeqw", { MX
, EM
}, PREFIX_OPCODE
},
2198 { "pcmpeqd", { MX
, EM
}, PREFIX_OPCODE
},
2199 { "emms", { XX
}, PREFIX_OPCODE
},
2201 { PREFIX_TABLE (PREFIX_0F78
) },
2202 { PREFIX_TABLE (PREFIX_0F79
) },
2205 { PREFIX_TABLE (PREFIX_0F7C
) },
2206 { PREFIX_TABLE (PREFIX_0F7D
) },
2207 { PREFIX_TABLE (PREFIX_0F7E
) },
2208 { PREFIX_TABLE (PREFIX_0F7F
) },
2210 { "joH", { Jv
, BND
, cond_jump_flag
}, 0 },
2211 { "jnoH", { Jv
, BND
, cond_jump_flag
}, 0 },
2212 { "jbH", { Jv
, BND
, cond_jump_flag
}, 0 },
2213 { "jaeH", { Jv
, BND
, cond_jump_flag
}, 0 },
2214 { "jeH", { Jv
, BND
, cond_jump_flag
}, 0 },
2215 { "jneH", { Jv
, BND
, cond_jump_flag
}, 0 },
2216 { "jbeH", { Jv
, BND
, cond_jump_flag
}, 0 },
2217 { "jaH", { Jv
, BND
, cond_jump_flag
}, 0 },
2219 { "jsH", { Jv
, BND
, cond_jump_flag
}, 0 },
2220 { "jnsH", { Jv
, BND
, cond_jump_flag
}, 0 },
2221 { "jpH", { Jv
, BND
, cond_jump_flag
}, 0 },
2222 { "jnpH", { Jv
, BND
, cond_jump_flag
}, 0 },
2223 { "jlH", { Jv
, BND
, cond_jump_flag
}, 0 },
2224 { "jgeH", { Jv
, BND
, cond_jump_flag
}, 0 },
2225 { "jleH", { Jv
, BND
, cond_jump_flag
}, 0 },
2226 { "jgH", { Jv
, BND
, cond_jump_flag
}, 0 },
2228 { "seto", { Eb
}, 0 },
2229 { "setno", { Eb
}, 0 },
2230 { "setb", { Eb
}, 0 },
2231 { "setae", { Eb
}, 0 },
2232 { "sete", { Eb
}, 0 },
2233 { "setne", { Eb
}, 0 },
2234 { "setbe", { Eb
}, 0 },
2235 { "seta", { Eb
}, 0 },
2237 { "sets", { Eb
}, 0 },
2238 { "setns", { Eb
}, 0 },
2239 { "setp", { Eb
}, 0 },
2240 { "setnp", { Eb
}, 0 },
2241 { "setl", { Eb
}, 0 },
2242 { "setge", { Eb
}, 0 },
2243 { "setle", { Eb
}, 0 },
2244 { "setg", { Eb
}, 0 },
2246 { "pushP", { fs
}, 0 },
2247 { "popP", { fs
}, 0 },
2248 { "cpuid", { XX
}, 0 },
2249 { "btS", { Ev
, Gv
}, 0 },
2250 { "shldS", { Ev
, Gv
, Ib
}, 0 },
2251 { "shldS", { Ev
, Gv
, CL
}, 0 },
2252 { REG_TABLE (REG_0FA6
) },
2253 { REG_TABLE (REG_0FA7
) },
2255 { "pushP", { gs
}, 0 },
2256 { "popP", { gs
}, 0 },
2257 { "rsm", { XX
}, 0 },
2258 { "btsS", { Evh1
, Gv
}, 0 },
2259 { "shrdS", { Ev
, Gv
, Ib
}, 0 },
2260 { "shrdS", { Ev
, Gv
, CL
}, 0 },
2261 { REG_TABLE (REG_0FAE
) },
2262 { "imulS", { Gv
, Ev
}, 0 },
2264 { "cmpxchgB", { Ebh1
, Gb
}, 0 },
2265 { "cmpxchgS", { Evh1
, Gv
}, 0 },
2266 { MOD_TABLE (MOD_0FB2
) },
2267 { "btrS", { Evh1
, Gv
}, 0 },
2268 { MOD_TABLE (MOD_0FB4
) },
2269 { MOD_TABLE (MOD_0FB5
) },
2270 { "movz{bR|x}", { Gv
, Eb
}, 0 },
2271 { "movz{wR|x}", { Gv
, Ew
}, 0 }, /* yes, there really is movzww ! */
2273 { PREFIX_TABLE (PREFIX_0FB8
) },
2274 { "ud1S", { Gv
, Ev
}, 0 },
2275 { REG_TABLE (REG_0FBA
) },
2276 { "btcS", { Evh1
, Gv
}, 0 },
2277 { PREFIX_TABLE (PREFIX_0FBC
) },
2278 { PREFIX_TABLE (PREFIX_0FBD
) },
2279 { "movs{bR|x}", { Gv
, Eb
}, 0 },
2280 { "movs{wR|x}", { Gv
, Ew
}, 0 }, /* yes, there really is movsww ! */
2282 { "xaddB", { Ebh1
, Gb
}, 0 },
2283 { "xaddS", { Evh1
, Gv
}, 0 },
2284 { PREFIX_TABLE (PREFIX_0FC2
) },
2285 { MOD_TABLE (MOD_0FC3
) },
2286 { "pinsrw", { MX
, Edw
, Ib
}, PREFIX_OPCODE
},
2287 { "pextrw", { Gd
, MS
, Ib
}, PREFIX_OPCODE
},
2288 { "shufpX", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
2289 { REG_TABLE (REG_0FC7
) },
2291 { "bswap", { RMeAX
}, 0 },
2292 { "bswap", { RMeCX
}, 0 },
2293 { "bswap", { RMeDX
}, 0 },
2294 { "bswap", { RMeBX
}, 0 },
2295 { "bswap", { RMeSP
}, 0 },
2296 { "bswap", { RMeBP
}, 0 },
2297 { "bswap", { RMeSI
}, 0 },
2298 { "bswap", { RMeDI
}, 0 },
2300 { PREFIX_TABLE (PREFIX_0FD0
) },
2301 { "psrlw", { MX
, EM
}, PREFIX_OPCODE
},
2302 { "psrld", { MX
, EM
}, PREFIX_OPCODE
},
2303 { "psrlq", { MX
, EM
}, PREFIX_OPCODE
},
2304 { "paddq", { MX
, EM
}, PREFIX_OPCODE
},
2305 { "pmullw", { MX
, EM
}, PREFIX_OPCODE
},
2306 { PREFIX_TABLE (PREFIX_0FD6
) },
2307 { MOD_TABLE (MOD_0FD7
) },
2309 { "psubusb", { MX
, EM
}, PREFIX_OPCODE
},
2310 { "psubusw", { MX
, EM
}, PREFIX_OPCODE
},
2311 { "pminub", { MX
, EM
}, PREFIX_OPCODE
},
2312 { "pand", { MX
, EM
}, PREFIX_OPCODE
},
2313 { "paddusb", { MX
, EM
}, PREFIX_OPCODE
},
2314 { "paddusw", { MX
, EM
}, PREFIX_OPCODE
},
2315 { "pmaxub", { MX
, EM
}, PREFIX_OPCODE
},
2316 { "pandn", { MX
, EM
}, PREFIX_OPCODE
},
2318 { "pavgb", { MX
, EM
}, PREFIX_OPCODE
},
2319 { "psraw", { MX
, EM
}, PREFIX_OPCODE
},
2320 { "psrad", { MX
, EM
}, PREFIX_OPCODE
},
2321 { "pavgw", { MX
, EM
}, PREFIX_OPCODE
},
2322 { "pmulhuw", { MX
, EM
}, PREFIX_OPCODE
},
2323 { "pmulhw", { MX
, EM
}, PREFIX_OPCODE
},
2324 { PREFIX_TABLE (PREFIX_0FE6
) },
2325 { PREFIX_TABLE (PREFIX_0FE7
) },
2327 { "psubsb", { MX
, EM
}, PREFIX_OPCODE
},
2328 { "psubsw", { MX
, EM
}, PREFIX_OPCODE
},
2329 { "pminsw", { MX
, EM
}, PREFIX_OPCODE
},
2330 { "por", { MX
, EM
}, PREFIX_OPCODE
},
2331 { "paddsb", { MX
, EM
}, PREFIX_OPCODE
},
2332 { "paddsw", { MX
, EM
}, PREFIX_OPCODE
},
2333 { "pmaxsw", { MX
, EM
}, PREFIX_OPCODE
},
2334 { "pxor", { MX
, EM
}, PREFIX_OPCODE
},
2336 { PREFIX_TABLE (PREFIX_0FF0
) },
2337 { "psllw", { MX
, EM
}, PREFIX_OPCODE
},
2338 { "pslld", { MX
, EM
}, PREFIX_OPCODE
},
2339 { "psllq", { MX
, EM
}, PREFIX_OPCODE
},
2340 { "pmuludq", { MX
, EM
}, PREFIX_OPCODE
},
2341 { "pmaddwd", { MX
, EM
}, PREFIX_OPCODE
},
2342 { "psadbw", { MX
, EM
}, PREFIX_OPCODE
},
2343 { PREFIX_TABLE (PREFIX_0FF7
) },
2345 { "psubb", { MX
, EM
}, PREFIX_OPCODE
},
2346 { "psubw", { MX
, EM
}, PREFIX_OPCODE
},
2347 { "psubd", { MX
, EM
}, PREFIX_OPCODE
},
2348 { "psubq", { MX
, EM
}, PREFIX_OPCODE
},
2349 { "paddb", { MX
, EM
}, PREFIX_OPCODE
},
2350 { "paddw", { MX
, EM
}, PREFIX_OPCODE
},
2351 { "paddd", { MX
, EM
}, PREFIX_OPCODE
},
2352 { "ud0S", { Gv
, Ev
}, 0 },
2355 static const bool onebyte_has_modrm
[256] = {
2356 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2357 /* ------------------------------- */
2358 /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
2359 /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
2360 /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
2361 /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
2362 /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
2363 /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
2364 /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
2365 /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
2366 /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
2367 /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
2368 /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
2369 /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
2370 /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
2371 /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
2372 /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
2373 /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1 /* f0 */
2374 /* ------------------------------- */
2375 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2378 static const bool twobyte_has_modrm
[256] = {
2379 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2380 /* ------------------------------- */
2381 /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
2382 /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
2383 /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
2384 /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
2385 /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
2386 /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
2387 /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
2388 /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
2389 /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
2390 /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
2391 /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
2392 /* b0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* bf */
2393 /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
2394 /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
2395 /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
2396 /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 /* ff */
2397 /* ------------------------------- */
2398 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2408 /* If we are accessing mod/rm/reg without need_modrm set, then the
2409 values are stale. Hitting this abort likely indicates that you
2410 need to update onebyte_has_modrm or twobyte_has_modrm. */
2411 #define MODRM_CHECK if (!ins->need_modrm) abort ()
2413 static const char *const intel_index16
[] = {
2414 "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
2417 static const char *const att_names64
[] = {
2418 "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
2419 "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
2421 static const char *const att_names32
[] = {
2422 "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
2423 "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
2425 static const char *const att_names16
[] = {
2426 "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
2427 "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
2429 static const char *const att_names8
[] = {
2430 "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
2432 static const char *const att_names8rex
[] = {
2433 "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
2434 "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
2436 static const char *const att_names_seg
[] = {
2437 "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
2439 static const char att_index64
[] = "%riz";
2440 static const char att_index32
[] = "%eiz";
2441 static const char *const att_index16
[] = {
2442 "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
2445 static const char *const att_names_mm
[] = {
2446 "%mm0", "%mm1", "%mm2", "%mm3",
2447 "%mm4", "%mm5", "%mm6", "%mm7"
2450 static const char *const att_names_bnd
[] = {
2451 "%bnd0", "%bnd1", "%bnd2", "%bnd3"
2454 static const char *const att_names_xmm
[] = {
2455 "%xmm0", "%xmm1", "%xmm2", "%xmm3",
2456 "%xmm4", "%xmm5", "%xmm6", "%xmm7",
2457 "%xmm8", "%xmm9", "%xmm10", "%xmm11",
2458 "%xmm12", "%xmm13", "%xmm14", "%xmm15",
2459 "%xmm16", "%xmm17", "%xmm18", "%xmm19",
2460 "%xmm20", "%xmm21", "%xmm22", "%xmm23",
2461 "%xmm24", "%xmm25", "%xmm26", "%xmm27",
2462 "%xmm28", "%xmm29", "%xmm30", "%xmm31"
2465 static const char *const att_names_ymm
[] = {
2466 "%ymm0", "%ymm1", "%ymm2", "%ymm3",
2467 "%ymm4", "%ymm5", "%ymm6", "%ymm7",
2468 "%ymm8", "%ymm9", "%ymm10", "%ymm11",
2469 "%ymm12", "%ymm13", "%ymm14", "%ymm15",
2470 "%ymm16", "%ymm17", "%ymm18", "%ymm19",
2471 "%ymm20", "%ymm21", "%ymm22", "%ymm23",
2472 "%ymm24", "%ymm25", "%ymm26", "%ymm27",
2473 "%ymm28", "%ymm29", "%ymm30", "%ymm31"
2476 static const char *const att_names_zmm
[] = {
2477 "%zmm0", "%zmm1", "%zmm2", "%zmm3",
2478 "%zmm4", "%zmm5", "%zmm6", "%zmm7",
2479 "%zmm8", "%zmm9", "%zmm10", "%zmm11",
2480 "%zmm12", "%zmm13", "%zmm14", "%zmm15",
2481 "%zmm16", "%zmm17", "%zmm18", "%zmm19",
2482 "%zmm20", "%zmm21", "%zmm22", "%zmm23",
2483 "%zmm24", "%zmm25", "%zmm26", "%zmm27",
2484 "%zmm28", "%zmm29", "%zmm30", "%zmm31"
2487 static const char *const att_names_tmm
[] = {
2488 "%tmm0", "%tmm1", "%tmm2", "%tmm3",
2489 "%tmm4", "%tmm5", "%tmm6", "%tmm7"
2492 static const char *const att_names_mask
[] = {
2493 "%k0", "%k1", "%k2", "%k3", "%k4", "%k5", "%k6", "%k7"
2496 static const char *const names_rounding
[] =
2504 static const struct dis386 reg_table
[][8] = {
2507 { "addA", { Ebh1
, Ib
}, 0 },
2508 { "orA", { Ebh1
, Ib
}, 0 },
2509 { "adcA", { Ebh1
, Ib
}, 0 },
2510 { "sbbA", { Ebh1
, Ib
}, 0 },
2511 { "andA", { Ebh1
, Ib
}, 0 },
2512 { "subA", { Ebh1
, Ib
}, 0 },
2513 { "xorA", { Ebh1
, Ib
}, 0 },
2514 { "cmpA", { Eb
, Ib
}, 0 },
2518 { "addQ", { Evh1
, Iv
}, 0 },
2519 { "orQ", { Evh1
, Iv
}, 0 },
2520 { "adcQ", { Evh1
, Iv
}, 0 },
2521 { "sbbQ", { Evh1
, Iv
}, 0 },
2522 { "andQ", { Evh1
, Iv
}, 0 },
2523 { "subQ", { Evh1
, Iv
}, 0 },
2524 { "xorQ", { Evh1
, Iv
}, 0 },
2525 { "cmpQ", { Ev
, Iv
}, 0 },
2529 { "addQ", { Evh1
, sIb
}, 0 },
2530 { "orQ", { Evh1
, sIb
}, 0 },
2531 { "adcQ", { Evh1
, sIb
}, 0 },
2532 { "sbbQ", { Evh1
, sIb
}, 0 },
2533 { "andQ", { Evh1
, sIb
}, 0 },
2534 { "subQ", { Evh1
, sIb
}, 0 },
2535 { "xorQ", { Evh1
, sIb
}, 0 },
2536 { "cmpQ", { Ev
, sIb
}, 0 },
2540 { "pop{P|}", { stackEv
}, 0 },
2541 { XOP_8F_TABLE (XOP_09
) },
2545 { XOP_8F_TABLE (XOP_09
) },
2549 { "rolA", { Eb
, Ib
}, 0 },
2550 { "rorA", { Eb
, Ib
}, 0 },
2551 { "rclA", { Eb
, Ib
}, 0 },
2552 { "rcrA", { Eb
, Ib
}, 0 },
2553 { "shlA", { Eb
, Ib
}, 0 },
2554 { "shrA", { Eb
, Ib
}, 0 },
2555 { "shlA", { Eb
, Ib
}, 0 },
2556 { "sarA", { Eb
, Ib
}, 0 },
2560 { "rolQ", { Ev
, Ib
}, 0 },
2561 { "rorQ", { Ev
, Ib
}, 0 },
2562 { "rclQ", { Ev
, Ib
}, 0 },
2563 { "rcrQ", { Ev
, Ib
}, 0 },
2564 { "shlQ", { Ev
, Ib
}, 0 },
2565 { "shrQ", { Ev
, Ib
}, 0 },
2566 { "shlQ", { Ev
, Ib
}, 0 },
2567 { "sarQ", { Ev
, Ib
}, 0 },
2571 { "movA", { Ebh3
, Ib
}, 0 },
2578 { MOD_TABLE (MOD_C6_REG_7
) },
2582 { "movQ", { Evh3
, Iv
}, 0 },
2589 { MOD_TABLE (MOD_C7_REG_7
) },
2593 { "rolA", { Eb
, I1
}, 0 },
2594 { "rorA", { Eb
, I1
}, 0 },
2595 { "rclA", { Eb
, I1
}, 0 },
2596 { "rcrA", { Eb
, I1
}, 0 },
2597 { "shlA", { Eb
, I1
}, 0 },
2598 { "shrA", { Eb
, I1
}, 0 },
2599 { "shlA", { Eb
, I1
}, 0 },
2600 { "sarA", { Eb
, I1
}, 0 },
2604 { "rolQ", { Ev
, I1
}, 0 },
2605 { "rorQ", { Ev
, I1
}, 0 },
2606 { "rclQ", { Ev
, I1
}, 0 },
2607 { "rcrQ", { Ev
, I1
}, 0 },
2608 { "shlQ", { Ev
, I1
}, 0 },
2609 { "shrQ", { Ev
, I1
}, 0 },
2610 { "shlQ", { Ev
, I1
}, 0 },
2611 { "sarQ", { Ev
, I1
}, 0 },
2615 { "rolA", { Eb
, CL
}, 0 },
2616 { "rorA", { Eb
, CL
}, 0 },
2617 { "rclA", { Eb
, CL
}, 0 },
2618 { "rcrA", { Eb
, CL
}, 0 },
2619 { "shlA", { Eb
, CL
}, 0 },
2620 { "shrA", { Eb
, CL
}, 0 },
2621 { "shlA", { Eb
, CL
}, 0 },
2622 { "sarA", { Eb
, CL
}, 0 },
2626 { "rolQ", { Ev
, CL
}, 0 },
2627 { "rorQ", { Ev
, CL
}, 0 },
2628 { "rclQ", { Ev
, CL
}, 0 },
2629 { "rcrQ", { Ev
, CL
}, 0 },
2630 { "shlQ", { Ev
, CL
}, 0 },
2631 { "shrQ", { Ev
, CL
}, 0 },
2632 { "shlQ", { Ev
, CL
}, 0 },
2633 { "sarQ", { Ev
, CL
}, 0 },
2637 { "testA", { Eb
, Ib
}, 0 },
2638 { "testA", { Eb
, Ib
}, 0 },
2639 { "notA", { Ebh1
}, 0 },
2640 { "negA", { Ebh1
}, 0 },
2641 { "mulA", { Eb
}, 0 }, /* Don't print the implicit %al register, */
2642 { "imulA", { Eb
}, 0 }, /* to distinguish these opcodes from other */
2643 { "divA", { Eb
}, 0 }, /* mul/imul opcodes. Do the same for div */
2644 { "idivA", { Eb
}, 0 }, /* and idiv for consistency. */
2648 { "testQ", { Ev
, Iv
}, 0 },
2649 { "testQ", { Ev
, Iv
}, 0 },
2650 { "notQ", { Evh1
}, 0 },
2651 { "negQ", { Evh1
}, 0 },
2652 { "mulQ", { Ev
}, 0 }, /* Don't print the implicit register. */
2653 { "imulQ", { Ev
}, 0 },
2654 { "divQ", { Ev
}, 0 },
2655 { "idivQ", { Ev
}, 0 },
2659 { "incA", { Ebh1
}, 0 },
2660 { "decA", { Ebh1
}, 0 },
2664 { "incQ", { Evh1
}, 0 },
2665 { "decQ", { Evh1
}, 0 },
2666 { "call{@|}", { NOTRACK
, indirEv
, BND
}, 0 },
2667 { MOD_TABLE (MOD_FF_REG_3
) },
2668 { "jmp{@|}", { NOTRACK
, indirEv
, BND
}, 0 },
2669 { MOD_TABLE (MOD_FF_REG_5
) },
2670 { "push{P|}", { stackEv
}, 0 },
2675 { "sldtD", { Sv
}, 0 },
2676 { "strD", { Sv
}, 0 },
2677 { "lldt", { Ew
}, 0 },
2678 { "ltr", { Ew
}, 0 },
2679 { "verr", { Ew
}, 0 },
2680 { "verw", { Ew
}, 0 },
2686 { MOD_TABLE (MOD_0F01_REG_0
) },
2687 { MOD_TABLE (MOD_0F01_REG_1
) },
2688 { MOD_TABLE (MOD_0F01_REG_2
) },
2689 { MOD_TABLE (MOD_0F01_REG_3
) },
2690 { "smswD", { Sv
}, 0 },
2691 { MOD_TABLE (MOD_0F01_REG_5
) },
2692 { "lmsw", { Ew
}, 0 },
2693 { MOD_TABLE (MOD_0F01_REG_7
) },
2697 { "prefetch", { Mb
}, 0 },
2698 { "prefetchw", { Mb
}, 0 },
2699 { "prefetchwt1", { Mb
}, 0 },
2700 { "prefetch", { Mb
}, 0 },
2701 { "prefetch", { Mb
}, 0 },
2702 { "prefetch", { Mb
}, 0 },
2703 { "prefetch", { Mb
}, 0 },
2704 { "prefetch", { Mb
}, 0 },
2708 { MOD_TABLE (MOD_0F18_REG_0
) },
2709 { MOD_TABLE (MOD_0F18_REG_1
) },
2710 { MOD_TABLE (MOD_0F18_REG_2
) },
2711 { MOD_TABLE (MOD_0F18_REG_3
) },
2712 { "nopQ", { Ev
}, 0 },
2713 { "nopQ", { Ev
}, 0 },
2714 { "nopQ", { Ev
}, 0 },
2715 { "nopQ", { Ev
}, 0 },
2717 /* REG_0F1C_P_0_MOD_0 */
2719 { "cldemote", { Mb
}, 0 },
2720 { "nopQ", { Ev
}, 0 },
2721 { "nopQ", { Ev
}, 0 },
2722 { "nopQ", { Ev
}, 0 },
2723 { "nopQ", { Ev
}, 0 },
2724 { "nopQ", { Ev
}, 0 },
2725 { "nopQ", { Ev
}, 0 },
2726 { "nopQ", { Ev
}, 0 },
2728 /* REG_0F1E_P_1_MOD_3 */
2730 { "nopQ", { Ev
}, PREFIX_IGNORED
},
2731 { "rdsspK", { Edq
}, 0 },
2732 { "nopQ", { Ev
}, PREFIX_IGNORED
},
2733 { "nopQ", { Ev
}, PREFIX_IGNORED
},
2734 { "nopQ", { Ev
}, PREFIX_IGNORED
},
2735 { "nopQ", { Ev
}, PREFIX_IGNORED
},
2736 { "nopQ", { Ev
}, PREFIX_IGNORED
},
2737 { RM_TABLE (RM_0F1E_P_1_MOD_3_REG_7
) },
2739 /* REG_0F38D8_PREFIX_1 */
2741 { "aesencwide128kl", { M
}, 0 },
2742 { "aesdecwide128kl", { M
}, 0 },
2743 { "aesencwide256kl", { M
}, 0 },
2744 { "aesdecwide256kl", { M
}, 0 },
2746 /* REG_0F3A0F_PREFIX_1_MOD_3 */
2748 { RM_TABLE (RM_0F3A0F_P_1_MOD_3_REG_0
) },
2750 /* REG_0F71_MOD_0 */
2754 { "psrlw", { MS
, Ib
}, PREFIX_OPCODE
},
2756 { "psraw", { MS
, Ib
}, PREFIX_OPCODE
},
2758 { "psllw", { MS
, Ib
}, PREFIX_OPCODE
},
2760 /* REG_0F72_MOD_0 */
2764 { "psrld", { MS
, Ib
}, PREFIX_OPCODE
},
2766 { "psrad", { MS
, Ib
}, PREFIX_OPCODE
},
2768 { "pslld", { MS
, Ib
}, PREFIX_OPCODE
},
2770 /* REG_0F73_MOD_0 */
2774 { "psrlq", { MS
, Ib
}, PREFIX_OPCODE
},
2775 { "psrldq", { XS
, Ib
}, PREFIX_DATA
},
2778 { "psllq", { MS
, Ib
}, PREFIX_OPCODE
},
2779 { "pslldq", { XS
, Ib
}, PREFIX_DATA
},
2783 { "montmul", { { OP_0f07
, 0 } }, 0 },
2784 { "xsha1", { { OP_0f07
, 0 } }, 0 },
2785 { "xsha256", { { OP_0f07
, 0 } }, 0 },
2789 { "xstore-rng", { { OP_0f07
, 0 } }, 0 },
2790 { "xcrypt-ecb", { { OP_0f07
, 0 } }, 0 },
2791 { "xcrypt-cbc", { { OP_0f07
, 0 } }, 0 },
2792 { "xcrypt-ctr", { { OP_0f07
, 0 } }, 0 },
2793 { "xcrypt-cfb", { { OP_0f07
, 0 } }, 0 },
2794 { "xcrypt-ofb", { { OP_0f07
, 0 } }, 0 },
2798 { MOD_TABLE (MOD_0FAE_REG_0
) },
2799 { MOD_TABLE (MOD_0FAE_REG_1
) },
2800 { MOD_TABLE (MOD_0FAE_REG_2
) },
2801 { MOD_TABLE (MOD_0FAE_REG_3
) },
2802 { MOD_TABLE (MOD_0FAE_REG_4
) },
2803 { MOD_TABLE (MOD_0FAE_REG_5
) },
2804 { MOD_TABLE (MOD_0FAE_REG_6
) },
2805 { MOD_TABLE (MOD_0FAE_REG_7
) },
2813 { "btQ", { Ev
, Ib
}, 0 },
2814 { "btsQ", { Evh1
, Ib
}, 0 },
2815 { "btrQ", { Evh1
, Ib
}, 0 },
2816 { "btcQ", { Evh1
, Ib
}, 0 },
2821 { "cmpxchg8b", { { CMPXCHG8B_Fixup
, q_mode
} }, 0 },
2823 { MOD_TABLE (MOD_0FC7_REG_3
) },
2824 { MOD_TABLE (MOD_0FC7_REG_4
) },
2825 { MOD_TABLE (MOD_0FC7_REG_5
) },
2826 { MOD_TABLE (MOD_0FC7_REG_6
) },
2827 { MOD_TABLE (MOD_0FC7_REG_7
) },
2829 /* REG_VEX_0F71_M_0 */
2833 { "vpsrlw", { Vex
, XS
, Ib
}, PREFIX_DATA
},
2835 { "vpsraw", { Vex
, XS
, Ib
}, PREFIX_DATA
},
2837 { "vpsllw", { Vex
, XS
, Ib
}, PREFIX_DATA
},
2839 /* REG_VEX_0F72_M_0 */
2843 { "vpsrld", { Vex
, XS
, Ib
}, PREFIX_DATA
},
2845 { "vpsrad", { Vex
, XS
, Ib
}, PREFIX_DATA
},
2847 { "vpslld", { Vex
, XS
, Ib
}, PREFIX_DATA
},
2849 /* REG_VEX_0F73_M_0 */
2853 { "vpsrlq", { Vex
, XS
, Ib
}, PREFIX_DATA
},
2854 { "vpsrldq", { Vex
, XS
, Ib
}, PREFIX_DATA
},
2857 { "vpsllq", { Vex
, XS
, Ib
}, PREFIX_DATA
},
2858 { "vpslldq", { Vex
, XS
, Ib
}, PREFIX_DATA
},
2864 { MOD_TABLE (MOD_VEX_0FAE_REG_2
) },
2865 { MOD_TABLE (MOD_VEX_0FAE_REG_3
) },
2867 /* REG_VEX_0F3849_X86_64_P_0_W_0_M_1 */
2869 { RM_TABLE (RM_VEX_0F3849_X86_64_P_0_W_0_M_1_R_0
) },
2871 /* REG_VEX_0F38F3_L_0 */
2874 { "blsrS", { VexGdq
, Edq
}, PREFIX_OPCODE
},
2875 { "blsmskS", { VexGdq
, Edq
}, PREFIX_OPCODE
},
2876 { "blsiS", { VexGdq
, Edq
}, PREFIX_OPCODE
},
2878 /* REG_XOP_09_01_L_0 */
2881 { "blcfill", { VexGdq
, Edq
}, 0 },
2882 { "blsfill", { VexGdq
, Edq
}, 0 },
2883 { "blcs", { VexGdq
, Edq
}, 0 },
2884 { "tzmsk", { VexGdq
, Edq
}, 0 },
2885 { "blcic", { VexGdq
, Edq
}, 0 },
2886 { "blsic", { VexGdq
, Edq
}, 0 },
2887 { "t1mskc", { VexGdq
, Edq
}, 0 },
2889 /* REG_XOP_09_02_L_0 */
2892 { "blcmsk", { VexGdq
, Edq
}, 0 },
2897 { "blci", { VexGdq
, Edq
}, 0 },
2899 /* REG_XOP_09_12_M_1_L_0 */
2901 { "llwpcb", { Edq
}, 0 },
2902 { "slwpcb", { Edq
}, 0 },
2904 /* REG_XOP_0A_12_L_0 */
2906 { "lwpins", { VexGdq
, Ed
, Id
}, 0 },
2907 { "lwpval", { VexGdq
, Ed
, Id
}, 0 },
2910 #include "i386-dis-evex-reg.h"
2913 static const struct dis386 prefix_table
[][4] = {
2916 { "xchgS", { { NOP_Fixup1
, eAX_reg
}, { NOP_Fixup2
, eAX_reg
} }, 0 },
2917 { "pause", { XX
}, 0 },
2918 { "xchgS", { { NOP_Fixup1
, eAX_reg
}, { NOP_Fixup2
, eAX_reg
} }, 0 },
2919 { NULL
, { { NULL
, 0 } }, PREFIX_IGNORED
}
2922 /* PREFIX_0F01_REG_1_RM_4 */
2926 { "tdcall", { Skip_MODRM
}, 0 },
2930 /* PREFIX_0F01_REG_1_RM_5 */
2934 { X86_64_TABLE (X86_64_0F01_REG_1_RM_5_PREFIX_2
) },
2938 /* PREFIX_0F01_REG_1_RM_6 */
2942 { X86_64_TABLE (X86_64_0F01_REG_1_RM_6_PREFIX_2
) },
2946 /* PREFIX_0F01_REG_1_RM_7 */
2948 { "encls", { Skip_MODRM
}, 0 },
2950 { X86_64_TABLE (X86_64_0F01_REG_1_RM_7_PREFIX_2
) },
2954 /* PREFIX_0F01_REG_3_RM_1 */
2956 { "vmmcall", { Skip_MODRM
}, 0 },
2957 { "vmgexit", { Skip_MODRM
}, 0 },
2959 { "vmgexit", { Skip_MODRM
}, 0 },
2962 /* PREFIX_0F01_REG_5_MOD_0 */
2965 { "rstorssp", { Mq
}, PREFIX_OPCODE
},
2968 /* PREFIX_0F01_REG_5_MOD_3_RM_0 */
2970 { "serialize", { Skip_MODRM
}, PREFIX_OPCODE
},
2971 { "setssbsy", { Skip_MODRM
}, PREFIX_OPCODE
},
2973 { "xsusldtrk", { Skip_MODRM
}, PREFIX_OPCODE
},
2976 /* PREFIX_0F01_REG_5_MOD_3_RM_1 */
2981 { "xresldtrk", { Skip_MODRM
}, PREFIX_OPCODE
},
2984 /* PREFIX_0F01_REG_5_MOD_3_RM_2 */
2987 { "saveprevssp", { Skip_MODRM
}, PREFIX_OPCODE
},
2990 /* PREFIX_0F01_REG_5_MOD_3_RM_4 */
2993 { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_4_PREFIX_1
) },
2996 /* PREFIX_0F01_REG_5_MOD_3_RM_5 */
2999 { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_5_PREFIX_1
) },
3002 /* PREFIX_0F01_REG_5_MOD_3_RM_6 */
3004 { "rdpkru", { Skip_MODRM
}, 0 },
3005 { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_6_PREFIX_1
) },
3008 /* PREFIX_0F01_REG_5_MOD_3_RM_7 */
3010 { "wrpkru", { Skip_MODRM
}, 0 },
3011 { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_7_PREFIX_1
) },
3014 /* PREFIX_0F01_REG_7_MOD_3_RM_2 */
3016 { "monitorx", { { OP_Monitor
, 0 } }, 0 },
3017 { "mcommit", { Skip_MODRM
}, 0 },
3020 /* PREFIX_0F01_REG_7_MOD_3_RM_6 */
3022 { "invlpgb", { Skip_MODRM
}, 0 },
3023 { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_1
) },
3025 { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3
) },
3028 /* PREFIX_0F01_REG_7_MOD_3_RM_7 */
3030 { "tlbsync", { Skip_MODRM
}, 0 },
3031 { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_7_PREFIX_1
) },
3033 { "pvalidate", { Skip_MODRM
}, 0 },
3038 { "wbinvd", { XX
}, 0 },
3039 { "wbnoinvd", { XX
}, 0 },
3044 { "movups", { XM
, EXx
}, PREFIX_OPCODE
},
3045 { "movss", { XM
, EXd
}, PREFIX_OPCODE
},
3046 { "movupd", { XM
, EXx
}, PREFIX_OPCODE
},
3047 { "movsd", { XM
, EXq
}, PREFIX_OPCODE
},
3052 { "movups", { EXxS
, XM
}, PREFIX_OPCODE
},
3053 { "movss", { EXdS
, XM
}, PREFIX_OPCODE
},
3054 { "movupd", { EXxS
, XM
}, PREFIX_OPCODE
},
3055 { "movsd", { EXqS
, XM
}, PREFIX_OPCODE
},
3060 { MOD_TABLE (MOD_0F12_PREFIX_0
) },
3061 { "movsldup", { XM
, EXx
}, PREFIX_OPCODE
},
3062 { MOD_TABLE (MOD_0F12_PREFIX_2
) },
3063 { "movddup", { XM
, EXq
}, PREFIX_OPCODE
},
3068 { MOD_TABLE (MOD_0F16_PREFIX_0
) },
3069 { "movshdup", { XM
, EXx
}, PREFIX_OPCODE
},
3070 { MOD_TABLE (MOD_0F16_PREFIX_2
) },
3075 { MOD_TABLE (MOD_0F1A_PREFIX_0
) },
3076 { "bndcl", { Gbnd
, Ev_bnd
}, 0 },
3077 { "bndmov", { Gbnd
, Ebnd
}, 0 },
3078 { "bndcu", { Gbnd
, Ev_bnd
}, 0 },
3083 { MOD_TABLE (MOD_0F1B_PREFIX_0
) },
3084 { MOD_TABLE (MOD_0F1B_PREFIX_1
) },
3085 { "bndmov", { EbndS
, Gbnd
}, 0 },
3086 { "bndcn", { Gbnd
, Ev_bnd
}, 0 },
3091 { MOD_TABLE (MOD_0F1C_PREFIX_0
) },
3092 { "nopQ", { Ev
}, PREFIX_IGNORED
},
3093 { "nopQ", { Ev
}, 0 },
3094 { "nopQ", { Ev
}, PREFIX_IGNORED
},
3099 { "nopQ", { Ev
}, 0 },
3100 { MOD_TABLE (MOD_0F1E_PREFIX_1
) },
3101 { "nopQ", { Ev
}, 0 },
3102 { NULL
, { XX
}, PREFIX_IGNORED
},
3107 { "cvtpi2ps", { XM
, EMCq
}, PREFIX_OPCODE
},
3108 { "cvtsi2ss{%LQ|}", { XM
, Edq
}, PREFIX_OPCODE
},
3109 { "cvtpi2pd", { XM
, EMCq
}, PREFIX_OPCODE
},
3110 { "cvtsi2sd{%LQ|}", { XM
, Edq
}, 0 },
3115 { MOD_TABLE (MOD_0F2B_PREFIX_0
) },
3116 { MOD_TABLE (MOD_0F2B_PREFIX_1
) },
3117 { MOD_TABLE (MOD_0F2B_PREFIX_2
) },
3118 { MOD_TABLE (MOD_0F2B_PREFIX_3
) },
3123 { "cvttps2pi", { MXC
, EXq
}, PREFIX_OPCODE
},
3124 { "cvttss2si", { Gdq
, EXd
}, PREFIX_OPCODE
},
3125 { "cvttpd2pi", { MXC
, EXx
}, PREFIX_OPCODE
},
3126 { "cvttsd2si", { Gdq
, EXq
}, PREFIX_OPCODE
},
3131 { "cvtps2pi", { MXC
, EXq
}, PREFIX_OPCODE
},
3132 { "cvtss2si", { Gdq
, EXd
}, PREFIX_OPCODE
},
3133 { "cvtpd2pi", { MXC
, EXx
}, PREFIX_OPCODE
},
3134 { "cvtsd2si", { Gdq
, EXq
}, PREFIX_OPCODE
},
3139 { "ucomiss",{ XM
, EXd
}, 0 },
3141 { "ucomisd",{ XM
, EXq
}, 0 },
3146 { "comiss", { XM
, EXd
}, 0 },
3148 { "comisd", { XM
, EXq
}, 0 },
3153 { "sqrtps", { XM
, EXx
}, PREFIX_OPCODE
},
3154 { "sqrtss", { XM
, EXd
}, PREFIX_OPCODE
},
3155 { "sqrtpd", { XM
, EXx
}, PREFIX_OPCODE
},
3156 { "sqrtsd", { XM
, EXq
}, PREFIX_OPCODE
},
3161 { "rsqrtps",{ XM
, EXx
}, PREFIX_OPCODE
},
3162 { "rsqrtss",{ XM
, EXd
}, PREFIX_OPCODE
},
3167 { "rcpps", { XM
, EXx
}, PREFIX_OPCODE
},
3168 { "rcpss", { XM
, EXd
}, PREFIX_OPCODE
},
3173 { "addps", { XM
, EXx
}, PREFIX_OPCODE
},
3174 { "addss", { XM
, EXd
}, PREFIX_OPCODE
},
3175 { "addpd", { XM
, EXx
}, PREFIX_OPCODE
},
3176 { "addsd", { XM
, EXq
}, PREFIX_OPCODE
},
3181 { "mulps", { XM
, EXx
}, PREFIX_OPCODE
},
3182 { "mulss", { XM
, EXd
}, PREFIX_OPCODE
},
3183 { "mulpd", { XM
, EXx
}, PREFIX_OPCODE
},
3184 { "mulsd", { XM
, EXq
}, PREFIX_OPCODE
},
3189 { "cvtps2pd", { XM
, EXq
}, PREFIX_OPCODE
},
3190 { "cvtss2sd", { XM
, EXd
}, PREFIX_OPCODE
},
3191 { "cvtpd2ps", { XM
, EXx
}, PREFIX_OPCODE
},
3192 { "cvtsd2ss", { XM
, EXq
}, PREFIX_OPCODE
},
3197 { "cvtdq2ps", { XM
, EXx
}, PREFIX_OPCODE
},
3198 { "cvttps2dq", { XM
, EXx
}, PREFIX_OPCODE
},
3199 { "cvtps2dq", { XM
, EXx
}, PREFIX_OPCODE
},
3204 { "subps", { XM
, EXx
}, PREFIX_OPCODE
},
3205 { "subss", { XM
, EXd
}, PREFIX_OPCODE
},
3206 { "subpd", { XM
, EXx
}, PREFIX_OPCODE
},
3207 { "subsd", { XM
, EXq
}, PREFIX_OPCODE
},
3212 { "minps", { XM
, EXx
}, PREFIX_OPCODE
},
3213 { "minss", { XM
, EXd
}, PREFIX_OPCODE
},
3214 { "minpd", { XM
, EXx
}, PREFIX_OPCODE
},
3215 { "minsd", { XM
, EXq
}, PREFIX_OPCODE
},
3220 { "divps", { XM
, EXx
}, PREFIX_OPCODE
},
3221 { "divss", { XM
, EXd
}, PREFIX_OPCODE
},
3222 { "divpd", { XM
, EXx
}, PREFIX_OPCODE
},
3223 { "divsd", { XM
, EXq
}, PREFIX_OPCODE
},
3228 { "maxps", { XM
, EXx
}, PREFIX_OPCODE
},
3229 { "maxss", { XM
, EXd
}, PREFIX_OPCODE
},
3230 { "maxpd", { XM
, EXx
}, PREFIX_OPCODE
},
3231 { "maxsd", { XM
, EXq
}, PREFIX_OPCODE
},
3236 { "punpcklbw",{ MX
, EMd
}, PREFIX_OPCODE
},
3238 { "punpcklbw",{ MX
, EMx
}, PREFIX_OPCODE
},
3243 { "punpcklwd",{ MX
, EMd
}, PREFIX_OPCODE
},
3245 { "punpcklwd",{ MX
, EMx
}, PREFIX_OPCODE
},
3250 { "punpckldq",{ MX
, EMd
}, PREFIX_OPCODE
},
3252 { "punpckldq",{ MX
, EMx
}, PREFIX_OPCODE
},
3257 { "movq", { MX
, EM
}, PREFIX_OPCODE
},
3258 { "movdqu", { XM
, EXx
}, PREFIX_OPCODE
},
3259 { "movdqa", { XM
, EXx
}, PREFIX_OPCODE
},
3264 { "pshufw", { MX
, EM
, Ib
}, PREFIX_OPCODE
},
3265 { "pshufhw",{ XM
, EXx
, Ib
}, PREFIX_OPCODE
},
3266 { "pshufd", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
3267 { "pshuflw",{ XM
, EXx
, Ib
}, PREFIX_OPCODE
},
3272 {"vmread", { Em
, Gm
}, 0 },
3274 {"extrq", { XS
, Ib
, Ib
}, 0 },
3275 {"insertq", { XM
, XS
, Ib
, Ib
}, 0 },
3280 {"vmwrite", { Gm
, Em
}, 0 },
3282 {"extrq", { XM
, XS
}, 0 },
3283 {"insertq", { XM
, XS
}, 0 },
3290 { "haddpd", { XM
, EXx
}, PREFIX_OPCODE
},
3291 { "haddps", { XM
, EXx
}, PREFIX_OPCODE
},
3298 { "hsubpd", { XM
, EXx
}, PREFIX_OPCODE
},
3299 { "hsubps", { XM
, EXx
}, PREFIX_OPCODE
},
3304 { "movK", { Edq
, MX
}, PREFIX_OPCODE
},
3305 { "movq", { XM
, EXq
}, PREFIX_OPCODE
},
3306 { "movK", { Edq
, XM
}, PREFIX_OPCODE
},
3311 { "movq", { EMS
, MX
}, PREFIX_OPCODE
},
3312 { "movdqu", { EXxS
, XM
}, PREFIX_OPCODE
},
3313 { "movdqa", { EXxS
, XM
}, PREFIX_OPCODE
},
3316 /* PREFIX_0FAE_REG_0_MOD_3 */
3319 { "rdfsbase", { Ev
}, 0 },
3322 /* PREFIX_0FAE_REG_1_MOD_3 */
3325 { "rdgsbase", { Ev
}, 0 },
3328 /* PREFIX_0FAE_REG_2_MOD_3 */
3331 { "wrfsbase", { Ev
}, 0 },
3334 /* PREFIX_0FAE_REG_3_MOD_3 */
3337 { "wrgsbase", { Ev
}, 0 },
3340 /* PREFIX_0FAE_REG_4_MOD_0 */
3342 { "xsave", { FXSAVE
}, 0 },
3343 { "ptwrite{%LQ|}", { Edq
}, 0 },
3346 /* PREFIX_0FAE_REG_4_MOD_3 */
3349 { "ptwrite{%LQ|}", { Edq
}, 0 },
3352 /* PREFIX_0FAE_REG_5_MOD_3 */
3354 { "lfence", { Skip_MODRM
}, 0 },
3355 { "incsspK", { Edq
}, PREFIX_OPCODE
},
3358 /* PREFIX_0FAE_REG_6_MOD_0 */
3360 { "xsaveopt", { FXSAVE
}, PREFIX_OPCODE
},
3361 { "clrssbsy", { Mq
}, PREFIX_OPCODE
},
3362 { "clwb", { Mb
}, PREFIX_OPCODE
},
3365 /* PREFIX_0FAE_REG_6_MOD_3 */
3367 { RM_TABLE (RM_0FAE_REG_6_MOD_3_P_0
) },
3368 { "umonitor", { Eva
}, PREFIX_OPCODE
},
3369 { "tpause", { Edq
}, PREFIX_OPCODE
},
3370 { "umwait", { Edq
}, PREFIX_OPCODE
},
3373 /* PREFIX_0FAE_REG_7_MOD_0 */
3375 { "clflush", { Mb
}, 0 },
3377 { "clflushopt", { Mb
}, 0 },
3383 { "popcntS", { Gv
, Ev
}, 0 },
3388 { "bsfS", { Gv
, Ev
}, 0 },
3389 { "tzcntS", { Gv
, Ev
}, 0 },
3390 { "bsfS", { Gv
, Ev
}, 0 },
3395 { "bsrS", { Gv
, Ev
}, 0 },
3396 { "lzcntS", { Gv
, Ev
}, 0 },
3397 { "bsrS", { Gv
, Ev
}, 0 },
3402 { "cmpps", { XM
, EXx
, CMP
}, PREFIX_OPCODE
},
3403 { "cmpss", { XM
, EXd
, CMP
}, PREFIX_OPCODE
},
3404 { "cmppd", { XM
, EXx
, CMP
}, PREFIX_OPCODE
},
3405 { "cmpsd", { XM
, EXq
, CMP
}, PREFIX_OPCODE
},
3408 /* PREFIX_0FC7_REG_6_MOD_0 */
3410 { "vmptrld",{ Mq
}, 0 },
3411 { "vmxon", { Mq
}, 0 },
3412 { "vmclear",{ Mq
}, 0 },
3415 /* PREFIX_0FC7_REG_6_MOD_3 */
3417 { "rdrand", { Ev
}, 0 },
3418 { X86_64_TABLE (X86_64_0FC7_REG_6_MOD_3_PREFIX_1
) },
3419 { "rdrand", { Ev
}, 0 }
3422 /* PREFIX_0FC7_REG_7_MOD_3 */
3424 { "rdseed", { Ev
}, 0 },
3425 { "rdpid", { Em
}, 0 },
3426 { "rdseed", { Ev
}, 0 },
3433 { "addsubpd", { XM
, EXx
}, 0 },
3434 { "addsubps", { XM
, EXx
}, 0 },
3440 { "movq2dq",{ XM
, MS
}, 0 },
3441 { "movq", { EXqS
, XM
}, 0 },
3442 { "movdq2q",{ MX
, XS
}, 0 },
3448 { "cvtdq2pd", { XM
, EXq
}, PREFIX_OPCODE
},
3449 { "cvttpd2dq", { XM
, EXx
}, PREFIX_OPCODE
},
3450 { "cvtpd2dq", { XM
, EXx
}, PREFIX_OPCODE
},
3455 { "movntq", { Mq
, MX
}, PREFIX_OPCODE
},
3457 { MOD_TABLE (MOD_0FE7_PREFIX_2
) },
3465 { MOD_TABLE (MOD_0FF0_PREFIX_3
) },
3470 { "maskmovq", { MX
, MS
}, PREFIX_OPCODE
},
3472 { "maskmovdqu", { XM
, XS
}, PREFIX_OPCODE
},
3478 { REG_TABLE (REG_0F38D8_PREFIX_1
) },
3484 { MOD_TABLE (MOD_0F38DC_PREFIX_1
) },
3485 { "aesenc", { XM
, EXx
}, 0 },
3491 { MOD_TABLE (MOD_0F38DD_PREFIX_1
) },
3492 { "aesenclast", { XM
, EXx
}, 0 },
3498 { MOD_TABLE (MOD_0F38DE_PREFIX_1
) },
3499 { "aesdec", { XM
, EXx
}, 0 },
3505 { MOD_TABLE (MOD_0F38DF_PREFIX_1
) },
3506 { "aesdeclast", { XM
, EXx
}, 0 },
3511 { "movbeS", { Gv
, Mv
}, PREFIX_OPCODE
},
3513 { "movbeS", { Gv
, Mv
}, PREFIX_OPCODE
},
3514 { "crc32A", { Gdq
, Eb
}, PREFIX_OPCODE
},
3519 { "movbeS", { Mv
, Gv
}, PREFIX_OPCODE
},
3521 { "movbeS", { Mv
, Gv
}, PREFIX_OPCODE
},
3522 { "crc32Q", { Gdq
, Ev
}, PREFIX_OPCODE
},
3527 { MOD_TABLE (MOD_0F38F6_PREFIX_0
) },
3528 { "adoxS", { Gdq
, Edq
}, PREFIX_OPCODE
},
3529 { "adcxS", { Gdq
, Edq
}, PREFIX_OPCODE
},
3536 { MOD_TABLE (MOD_0F38F8_PREFIX_1
) },
3537 { MOD_TABLE (MOD_0F38F8_PREFIX_2
) },
3538 { MOD_TABLE (MOD_0F38F8_PREFIX_3
) },
3543 { MOD_TABLE (MOD_0F38FA_PREFIX_1
) },
3549 { MOD_TABLE (MOD_0F38FB_PREFIX_1
) },
3555 { MOD_TABLE (MOD_0F3A0F_PREFIX_1
)},
3558 /* PREFIX_VEX_0F10 */
3560 { "vmovupX", { XM
, EXEvexXNoBcst
}, PREFIX_OPCODE
},
3561 { "vmovs%XS", { XMScalar
, VexScalarR
, EXd
}, 0 },
3562 { "vmovupX", { XM
, EXEvexXNoBcst
}, PREFIX_OPCODE
},
3563 { "vmovs%XD", { XMScalar
, VexScalarR
, EXq
}, 0 },
3566 /* PREFIX_VEX_0F11 */
3568 { "vmovupX", { EXxS
, XM
}, PREFIX_OPCODE
},
3569 { "vmovs%XS", { EXdS
, VexScalarR
, XMScalar
}, 0 },
3570 { "vmovupX", { EXxS
, XM
}, PREFIX_OPCODE
},
3571 { "vmovs%XD", { EXqS
, VexScalarR
, XMScalar
}, 0 },
3574 /* PREFIX_VEX_0F12 */
3576 { MOD_TABLE (MOD_VEX_0F12_PREFIX_0
) },
3577 { "vmov%XSldup", { XM
, EXEvexXNoBcst
}, 0 },
3578 { MOD_TABLE (MOD_VEX_0F12_PREFIX_2
) },
3579 { "vmov%XDdup", { XM
, EXymmq
}, 0 },
3582 /* PREFIX_VEX_0F16 */
3584 { MOD_TABLE (MOD_VEX_0F16_PREFIX_0
) },
3585 { "vmov%XShdup", { XM
, EXEvexXNoBcst
}, 0 },
3586 { MOD_TABLE (MOD_VEX_0F16_PREFIX_2
) },
3589 /* PREFIX_VEX_0F2A */
3592 { "vcvtsi2ss{%LQ|}", { XMScalar
, VexScalar
, EXxEVexR
, Edq
}, 0 },
3594 { "vcvtsi2sd{%LQ|}", { XMScalar
, VexScalar
, EXxEVexR64
, Edq
}, 0 },
3597 /* PREFIX_VEX_0F2C */
3600 { "vcvttss2si", { Gdq
, EXd
, EXxEVexS
}, 0 },
3602 { "vcvttsd2si", { Gdq
, EXq
, EXxEVexS
}, 0 },
3605 /* PREFIX_VEX_0F2D */
3608 { "vcvtss2si", { Gdq
, EXd
, EXxEVexR
}, 0 },
3610 { "vcvtsd2si", { Gdq
, EXq
, EXxEVexR
}, 0 },
3613 /* PREFIX_VEX_0F2E */
3615 { "vucomisX", { XMScalar
, EXd
, EXxEVexS
}, PREFIX_OPCODE
},
3617 { "vucomisX", { XMScalar
, EXq
, EXxEVexS
}, PREFIX_OPCODE
},
3620 /* PREFIX_VEX_0F2F */
3622 { "vcomisX", { XMScalar
, EXd
, EXxEVexS
}, PREFIX_OPCODE
},
3624 { "vcomisX", { XMScalar
, EXq
, EXxEVexS
}, PREFIX_OPCODE
},
3627 /* PREFIX_VEX_0F41_L_1_M_1_W_0 */
3629 { "kandw", { MaskG
, MaskVex
, MaskE
}, 0 },
3631 { "kandb", { MaskG
, MaskVex
, MaskE
}, 0 },
3634 /* PREFIX_VEX_0F41_L_1_M_1_W_1 */
3636 { "kandq", { MaskG
, MaskVex
, MaskE
}, 0 },
3638 { "kandd", { MaskG
, MaskVex
, MaskE
}, 0 },
3641 /* PREFIX_VEX_0F42_L_1_M_1_W_0 */
3643 { "kandnw", { MaskG
, MaskVex
, MaskE
}, 0 },
3645 { "kandnb", { MaskG
, MaskVex
, MaskE
}, 0 },
3648 /* PREFIX_VEX_0F42_L_1_M_1_W_1 */
3650 { "kandnq", { MaskG
, MaskVex
, MaskE
}, 0 },
3652 { "kandnd", { MaskG
, MaskVex
, MaskE
}, 0 },
3655 /* PREFIX_VEX_0F44_L_0_M_1_W_0 */
3657 { "knotw", { MaskG
, MaskE
}, 0 },
3659 { "knotb", { MaskG
, MaskE
}, 0 },
3662 /* PREFIX_VEX_0F44_L_0_M_1_W_1 */
3664 { "knotq", { MaskG
, MaskE
}, 0 },
3666 { "knotd", { MaskG
, MaskE
}, 0 },
3669 /* PREFIX_VEX_0F45_L_1_M_1_W_0 */
3671 { "korw", { MaskG
, MaskVex
, MaskE
}, 0 },
3673 { "korb", { MaskG
, MaskVex
, MaskE
}, 0 },
3676 /* PREFIX_VEX_0F45_L_1_M_1_W_1 */
3678 { "korq", { MaskG
, MaskVex
, MaskE
}, 0 },
3680 { "kord", { MaskG
, MaskVex
, MaskE
}, 0 },
3683 /* PREFIX_VEX_0F46_L_1_M_1_W_0 */
3685 { "kxnorw", { MaskG
, MaskVex
, MaskE
}, 0 },
3687 { "kxnorb", { MaskG
, MaskVex
, MaskE
}, 0 },
3690 /* PREFIX_VEX_0F46_L_1_M_1_W_1 */
3692 { "kxnorq", { MaskG
, MaskVex
, MaskE
}, 0 },
3694 { "kxnord", { MaskG
, MaskVex
, MaskE
}, 0 },
3697 /* PREFIX_VEX_0F47_L_1_M_1_W_0 */
3699 { "kxorw", { MaskG
, MaskVex
, MaskE
}, 0 },
3701 { "kxorb", { MaskG
, MaskVex
, MaskE
}, 0 },
3704 /* PREFIX_VEX_0F47_L_1_M_1_W_1 */
3706 { "kxorq", { MaskG
, MaskVex
, MaskE
}, 0 },
3708 { "kxord", { MaskG
, MaskVex
, MaskE
}, 0 },
3711 /* PREFIX_VEX_0F4A_L_1_M_1_W_0 */
3713 { "kaddw", { MaskG
, MaskVex
, MaskE
}, 0 },
3715 { "kaddb", { MaskG
, MaskVex
, MaskE
}, 0 },
3718 /* PREFIX_VEX_0F4A_L_1_M_1_W_1 */
3720 { "kaddq", { MaskG
, MaskVex
, MaskE
}, 0 },
3722 { "kaddd", { MaskG
, MaskVex
, MaskE
}, 0 },
3725 /* PREFIX_VEX_0F4B_L_1_M_1_W_0 */
3727 { "kunpckwd", { MaskG
, MaskVex
, MaskE
}, 0 },
3729 { "kunpckbw", { MaskG
, MaskVex
, MaskE
}, 0 },
3732 /* PREFIX_VEX_0F4B_L_1_M_1_W_1 */
3734 { "kunpckdq", { MaskG
, MaskVex
, MaskE
}, 0 },
3737 /* PREFIX_VEX_0F51 */
3739 { "vsqrtpX", { XM
, EXx
, EXxEVexR
}, PREFIX_OPCODE
},
3740 { "vsqrts%XS", { XMScalar
, VexScalar
, EXd
, EXxEVexR
}, 0 },
3741 { "vsqrtpX", { XM
, EXx
, EXxEVexR
}, PREFIX_OPCODE
},
3742 { "vsqrts%XD", { XMScalar
, VexScalar
, EXq
, EXxEVexR
}, 0 },
3745 /* PREFIX_VEX_0F52 */
3747 { "vrsqrtps", { XM
, EXx
}, 0 },
3748 { "vrsqrtss", { XMScalar
, VexScalar
, EXd
}, 0 },
3751 /* PREFIX_VEX_0F53 */
3753 { "vrcpps", { XM
, EXx
}, 0 },
3754 { "vrcpss", { XMScalar
, VexScalar
, EXd
}, 0 },
3757 /* PREFIX_VEX_0F58 */
3759 { "vaddpX", { XM
, Vex
, EXx
, EXxEVexR
}, PREFIX_OPCODE
},
3760 { "vadds%XS", { XMScalar
, VexScalar
, EXd
, EXxEVexR
}, 0 },
3761 { "vaddpX", { XM
, Vex
, EXx
, EXxEVexR
}, PREFIX_OPCODE
},
3762 { "vadds%XD", { XMScalar
, VexScalar
, EXq
, EXxEVexR
}, 0 },
3765 /* PREFIX_VEX_0F59 */
3767 { "vmulpX", { XM
, Vex
, EXx
, EXxEVexR
}, PREFIX_OPCODE
},
3768 { "vmuls%XS", { XMScalar
, VexScalar
, EXd
, EXxEVexR
}, 0 },
3769 { "vmulpX", { XM
, Vex
, EXx
, EXxEVexR
}, PREFIX_OPCODE
},
3770 { "vmuls%XD", { XMScalar
, VexScalar
, EXq
, EXxEVexR
}, 0 },
3773 /* PREFIX_VEX_0F5A */
3775 { "vcvtp%XS2pd", { XM
, EXEvexHalfBcstXmmq
, EXxEVexS
}, 0 },
3776 { "vcvts%XS2sd", { XMScalar
, VexScalar
, EXd
, EXxEVexS
}, 0 },
3777 { "vcvtp%XD2ps%XY", { XMxmmq
, EXx
, EXxEVexR
}, 0 },
3778 { "vcvts%XD2ss", { XMScalar
, VexScalar
, EXq
, EXxEVexR
}, 0 },
3781 /* PREFIX_VEX_0F5B */
3783 { "vcvtdq2ps", { XM
, EXx
}, 0 },
3784 { "vcvttps2dq", { XM
, EXx
}, 0 },
3785 { "vcvtps2dq", { XM
, EXx
}, 0 },
3788 /* PREFIX_VEX_0F5C */
3790 { "vsubpX", { XM
, Vex
, EXx
, EXxEVexR
}, PREFIX_OPCODE
},
3791 { "vsubs%XS", { XMScalar
, VexScalar
, EXd
, EXxEVexR
}, 0 },
3792 { "vsubpX", { XM
, Vex
, EXx
, EXxEVexR
}, PREFIX_OPCODE
},
3793 { "vsubs%XD", { XMScalar
, VexScalar
, EXq
, EXxEVexR
}, 0 },
3796 /* PREFIX_VEX_0F5D */
3798 { "vminpX", { XM
, Vex
, EXx
, EXxEVexS
}, PREFIX_OPCODE
},
3799 { "vmins%XS", { XMScalar
, VexScalar
, EXd
, EXxEVexS
}, 0 },
3800 { "vminpX", { XM
, Vex
, EXx
, EXxEVexS
}, PREFIX_OPCODE
},
3801 { "vmins%XD", { XMScalar
, VexScalar
, EXq
, EXxEVexS
}, 0 },
3804 /* PREFIX_VEX_0F5E */
3806 { "vdivpX", { XM
, Vex
, EXx
, EXxEVexR
}, PREFIX_OPCODE
},
3807 { "vdivs%XS", { XMScalar
, VexScalar
, EXd
, EXxEVexR
}, 0 },
3808 { "vdivpX", { XM
, Vex
, EXx
, EXxEVexR
}, PREFIX_OPCODE
},
3809 { "vdivs%XD", { XMScalar
, VexScalar
, EXq
, EXxEVexR
}, 0 },
3812 /* PREFIX_VEX_0F5F */
3814 { "vmaxpX", { XM
, Vex
, EXx
, EXxEVexS
}, PREFIX_OPCODE
},
3815 { "vmaxs%XS", { XMScalar
, VexScalar
, EXd
, EXxEVexS
}, 0 },
3816 { "vmaxpX", { XM
, Vex
, EXx
, EXxEVexS
}, PREFIX_OPCODE
},
3817 { "vmaxs%XD", { XMScalar
, VexScalar
, EXq
, EXxEVexS
}, 0 },
3820 /* PREFIX_VEX_0F6F */
3823 { "vmovdqu", { XM
, EXx
}, 0 },
3824 { "vmovdqa", { XM
, EXx
}, 0 },
3827 /* PREFIX_VEX_0F70 */
3830 { "vpshufhw", { XM
, EXx
, Ib
}, 0 },
3831 { "vpshufd", { XM
, EXx
, Ib
}, 0 },
3832 { "vpshuflw", { XM
, EXx
, Ib
}, 0 },
3835 /* PREFIX_VEX_0F7C */
3839 { "vhaddpd", { XM
, Vex
, EXx
}, 0 },
3840 { "vhaddps", { XM
, Vex
, EXx
}, 0 },
3843 /* PREFIX_VEX_0F7D */
3847 { "vhsubpd", { XM
, Vex
, EXx
}, 0 },
3848 { "vhsubps", { XM
, Vex
, EXx
}, 0 },
3851 /* PREFIX_VEX_0F7E */
3854 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_1
) },
3855 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_2
) },
3858 /* PREFIX_VEX_0F7F */
3861 { "vmovdqu", { EXxS
, XM
}, 0 },
3862 { "vmovdqa", { EXxS
, XM
}, 0 },
3865 /* PREFIX_VEX_0F90_L_0_W_0 */
3867 { "kmovw", { MaskG
, MaskE
}, 0 },
3869 { "kmovb", { MaskG
, MaskBDE
}, 0 },
3872 /* PREFIX_VEX_0F90_L_0_W_1 */
3874 { "kmovq", { MaskG
, MaskE
}, 0 },
3876 { "kmovd", { MaskG
, MaskBDE
}, 0 },
3879 /* PREFIX_VEX_0F91_L_0_M_0_W_0 */
3881 { "kmovw", { Ew
, MaskG
}, 0 },
3883 { "kmovb", { Eb
, MaskG
}, 0 },
3886 /* PREFIX_VEX_0F91_L_0_M_0_W_1 */
3888 { "kmovq", { Eq
, MaskG
}, 0 },
3890 { "kmovd", { Ed
, MaskG
}, 0 },
3893 /* PREFIX_VEX_0F92_L_0_M_1_W_0 */
3895 { "kmovw", { MaskG
, Edq
}, 0 },
3897 { "kmovb", { MaskG
, Edq
}, 0 },
3898 { "kmovd", { MaskG
, Edq
}, 0 },
3901 /* PREFIX_VEX_0F92_L_0_M_1_W_1 */
3906 { "kmovK", { MaskG
, Edq
}, 0 },
3909 /* PREFIX_VEX_0F93_L_0_M_1_W_0 */
3911 { "kmovw", { Gdq
, MaskE
}, 0 },
3913 { "kmovb", { Gdq
, MaskE
}, 0 },
3914 { "kmovd", { Gdq
, MaskE
}, 0 },
3917 /* PREFIX_VEX_0F93_L_0_M_1_W_1 */
3922 { "kmovK", { Gdq
, MaskE
}, 0 },
3925 /* PREFIX_VEX_0F98_L_0_M_1_W_0 */
3927 { "kortestw", { MaskG
, MaskE
}, 0 },
3929 { "kortestb", { MaskG
, MaskE
}, 0 },
3932 /* PREFIX_VEX_0F98_L_0_M_1_W_1 */
3934 { "kortestq", { MaskG
, MaskE
}, 0 },
3936 { "kortestd", { MaskG
, MaskE
}, 0 },
3939 /* PREFIX_VEX_0F99_L_0_M_1_W_0 */
3941 { "ktestw", { MaskG
, MaskE
}, 0 },
3943 { "ktestb", { MaskG
, MaskE
}, 0 },
3946 /* PREFIX_VEX_0F99_L_0_M_1_W_1 */
3948 { "ktestq", { MaskG
, MaskE
}, 0 },
3950 { "ktestd", { MaskG
, MaskE
}, 0 },
3953 /* PREFIX_VEX_0FC2 */
3955 { "vcmpps", { XM
, Vex
, EXx
, CMP
}, 0 },
3956 { "vcmpss", { XMScalar
, VexScalar
, EXd
, CMP
}, 0 },
3957 { "vcmppd", { XM
, Vex
, EXx
, CMP
}, 0 },
3958 { "vcmpsd", { XMScalar
, VexScalar
, EXq
, CMP
}, 0 },
3961 /* PREFIX_VEX_0FD0 */
3965 { "vaddsubpd", { XM
, Vex
, EXx
}, 0 },
3966 { "vaddsubps", { XM
, Vex
, EXx
}, 0 },
3969 /* PREFIX_VEX_0FE6 */
3972 { "vcvtdq2pd", { XM
, EXxmmq
}, 0 },
3973 { "vcvttpd2dq%XY", { XMM
, EXx
}, 0 },
3974 { "vcvtpd2dq%XY", { XMM
, EXx
}, 0 },
3977 /* PREFIX_VEX_0FF0 */
3982 { MOD_TABLE (MOD_VEX_0FF0_PREFIX_3
) },
3985 /* PREFIX_VEX_0F3849_X86_64 */
3987 { VEX_W_TABLE (VEX_W_0F3849_X86_64_P_0
) },
3989 { VEX_W_TABLE (VEX_W_0F3849_X86_64_P_2
) },
3990 { VEX_W_TABLE (VEX_W_0F3849_X86_64_P_3
) },
3993 /* PREFIX_VEX_0F384B_X86_64 */
3996 { VEX_W_TABLE (VEX_W_0F384B_X86_64_P_1
) },
3997 { VEX_W_TABLE (VEX_W_0F384B_X86_64_P_2
) },
3998 { VEX_W_TABLE (VEX_W_0F384B_X86_64_P_3
) },
4001 /* PREFIX_VEX_0F385C_X86_64 */
4004 { VEX_W_TABLE (VEX_W_0F385C_X86_64_P_1
) },
4008 /* PREFIX_VEX_0F385E_X86_64 */
4010 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_0
) },
4011 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_1
) },
4012 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_2
) },
4013 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_3
) },
4016 /* PREFIX_VEX_0F38F5_L_0 */
4018 { "bzhiS", { Gdq
, Edq
, VexGdq
}, 0 },
4019 { "pextS", { Gdq
, VexGdq
, Edq
}, 0 },
4021 { "pdepS", { Gdq
, VexGdq
, Edq
}, 0 },
4024 /* PREFIX_VEX_0F38F6_L_0 */
4029 { "mulxS", { Gdq
, VexGdq
, Edq
}, 0 },
4032 /* PREFIX_VEX_0F38F7_L_0 */
4034 { "bextrS", { Gdq
, Edq
, VexGdq
}, 0 },
4035 { "sarxS", { Gdq
, Edq
, VexGdq
}, 0 },
4036 { "shlxS", { Gdq
, Edq
, VexGdq
}, 0 },
4037 { "shrxS", { Gdq
, Edq
, VexGdq
}, 0 },
4040 /* PREFIX_VEX_0F3AF0_L_0 */
4045 { "rorxS", { Gdq
, Edq
, Ib
}, 0 },
4048 #include "i386-dis-evex-prefix.h"
4051 static const struct dis386 x86_64_table
[][2] = {
4054 { "pushP", { es
}, 0 },
4059 { "popP", { es
}, 0 },
4064 { "pushP", { cs
}, 0 },
4069 { "pushP", { ss
}, 0 },
4074 { "popP", { ss
}, 0 },
4079 { "pushP", { ds
}, 0 },
4084 { "popP", { ds
}, 0 },
4089 { "daa", { XX
}, 0 },
4094 { "das", { XX
}, 0 },
4099 { "aaa", { XX
}, 0 },
4104 { "aas", { XX
}, 0 },
4109 { "pushaP", { XX
}, 0 },
4114 { "popaP", { XX
}, 0 },
4119 { MOD_TABLE (MOD_62_32BIT
) },
4120 { EVEX_TABLE (EVEX_0F
) },
4125 { "arpl", { Ew
, Gw
}, 0 },
4126 { "movs", { Gv
, { MOVSXD_Fixup
, movsxd_mode
} }, 0 },
4131 { "ins{R|}", { Yzr
, indirDX
}, 0 },
4132 { "ins{G|}", { Yzr
, indirDX
}, 0 },
4137 { "outs{R|}", { indirDXr
, Xz
}, 0 },
4138 { "outs{G|}", { indirDXr
, Xz
}, 0 },
4143 /* Opcode 0x82 is an alias of opcode 0x80 in 32-bit mode. */
4144 { REG_TABLE (REG_80
) },
4149 { "{l|}call{P|}", { Ap
}, 0 },
4154 { "retP", { Iw
, BND
}, 0 },
4155 { "ret@", { Iw
, BND
}, 0 },
4160 { "retP", { BND
}, 0 },
4161 { "ret@", { BND
}, 0 },
4166 { MOD_TABLE (MOD_C4_32BIT
) },
4167 { VEX_C4_TABLE (VEX_0F
) },
4172 { MOD_TABLE (MOD_C5_32BIT
) },
4173 { VEX_C5_TABLE (VEX_0F
) },
4178 { "into", { XX
}, 0 },
4183 { "aam", { Ib
}, 0 },
4188 { "aad", { Ib
}, 0 },
4193 { "callP", { Jv
, BND
}, 0 },
4194 { "call@", { Jv
, BND
}, 0 }
4199 { "jmpP", { Jv
, BND
}, 0 },
4200 { "jmp@", { Jv
, BND
}, 0 }
4205 { "{l|}jmp{P|}", { Ap
}, 0 },
4208 /* X86_64_0F01_REG_0 */
4210 { "sgdt{Q|Q}", { M
}, 0 },
4211 { "sgdt", { M
}, 0 },
4214 /* X86_64_0F01_REG_1 */
4216 { "sidt{Q|Q}", { M
}, 0 },
4217 { "sidt", { M
}, 0 },
4220 /* X86_64_0F01_REG_1_RM_5_PREFIX_2 */
4223 { "seamret", { Skip_MODRM
}, 0 },
4226 /* X86_64_0F01_REG_1_RM_6_PREFIX_2 */
4229 { "seamops", { Skip_MODRM
}, 0 },
4232 /* X86_64_0F01_REG_1_RM_7_PREFIX_2 */
4235 { "seamcall", { Skip_MODRM
}, 0 },
4238 /* X86_64_0F01_REG_2 */
4240 { "lgdt{Q|Q}", { M
}, 0 },
4241 { "lgdt", { M
}, 0 },
4244 /* X86_64_0F01_REG_3 */
4246 { "lidt{Q|Q}", { M
}, 0 },
4247 { "lidt", { M
}, 0 },
4250 /* X86_64_0F01_REG_5_MOD_3_RM_4_PREFIX_1 */
4253 { "uiret", { Skip_MODRM
}, 0 },
4256 /* X86_64_0F01_REG_5_MOD_3_RM_5_PREFIX_1 */
4259 { "testui", { Skip_MODRM
}, 0 },
4262 /* X86_64_0F01_REG_5_MOD_3_RM_6_PREFIX_1 */
4265 { "clui", { Skip_MODRM
}, 0 },
4268 /* X86_64_0F01_REG_5_MOD_3_RM_7_PREFIX_1 */
4271 { "stui", { Skip_MODRM
}, 0 },
4274 /* X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_1 */
4277 { "rmpadjust", { Skip_MODRM
}, 0 },
4280 /* X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3 */
4283 { "rmpupdate", { Skip_MODRM
}, 0 },
4286 /* X86_64_0F01_REG_7_MOD_3_RM_7_PREFIX_1 */
4289 { "psmash", { Skip_MODRM
}, 0 },
4294 { "movZ", { Em
, Td
}, 0 },
4299 { "movZ", { Td
, Em
}, 0 },
4302 /* X86_64_0FC7_REG_6_MOD_3_PREFIX_1 */
4305 { "senduipi", { Eq
}, 0 },
4308 /* X86_64_VEX_0F3849 */
4311 { PREFIX_TABLE (PREFIX_VEX_0F3849_X86_64
) },
4314 /* X86_64_VEX_0F384B */
4317 { PREFIX_TABLE (PREFIX_VEX_0F384B_X86_64
) },
4320 /* X86_64_VEX_0F385C */
4323 { PREFIX_TABLE (PREFIX_VEX_0F385C_X86_64
) },
4326 /* X86_64_VEX_0F385E */
4329 { PREFIX_TABLE (PREFIX_VEX_0F385E_X86_64
) },
4333 static const struct dis386 three_byte_table
[][256] = {
4335 /* THREE_BYTE_0F38 */
4338 { "pshufb", { MX
, EM
}, PREFIX_OPCODE
},
4339 { "phaddw", { MX
, EM
}, PREFIX_OPCODE
},
4340 { "phaddd", { MX
, EM
}, PREFIX_OPCODE
},
4341 { "phaddsw", { MX
, EM
}, PREFIX_OPCODE
},
4342 { "pmaddubsw", { MX
, EM
}, PREFIX_OPCODE
},
4343 { "phsubw", { MX
, EM
}, PREFIX_OPCODE
},
4344 { "phsubd", { MX
, EM
}, PREFIX_OPCODE
},
4345 { "phsubsw", { MX
, EM
}, PREFIX_OPCODE
},
4347 { "psignb", { MX
, EM
}, PREFIX_OPCODE
},
4348 { "psignw", { MX
, EM
}, PREFIX_OPCODE
},
4349 { "psignd", { MX
, EM
}, PREFIX_OPCODE
},
4350 { "pmulhrsw", { MX
, EM
}, PREFIX_OPCODE
},
4356 { "pblendvb", { XM
, EXx
, XMM0
}, PREFIX_DATA
},
4360 { "blendvps", { XM
, EXx
, XMM0
}, PREFIX_DATA
},
4361 { "blendvpd", { XM
, EXx
, XMM0
}, PREFIX_DATA
},
4363 { "ptest", { XM
, EXx
}, PREFIX_DATA
},
4369 { "pabsb", { MX
, EM
}, PREFIX_OPCODE
},
4370 { "pabsw", { MX
, EM
}, PREFIX_OPCODE
},
4371 { "pabsd", { MX
, EM
}, PREFIX_OPCODE
},
4374 { "pmovsxbw", { XM
, EXq
}, PREFIX_DATA
},
4375 { "pmovsxbd", { XM
, EXd
}, PREFIX_DATA
},
4376 { "pmovsxbq", { XM
, EXw
}, PREFIX_DATA
},
4377 { "pmovsxwd", { XM
, EXq
}, PREFIX_DATA
},
4378 { "pmovsxwq", { XM
, EXd
}, PREFIX_DATA
},
4379 { "pmovsxdq", { XM
, EXq
}, PREFIX_DATA
},
4383 { "pmuldq", { XM
, EXx
}, PREFIX_DATA
},
4384 { "pcmpeqq", { XM
, EXx
}, PREFIX_DATA
},
4385 { MOD_TABLE (MOD_0F382A
) },
4386 { "packusdw", { XM
, EXx
}, PREFIX_DATA
},
4392 { "pmovzxbw", { XM
, EXq
}, PREFIX_DATA
},
4393 { "pmovzxbd", { XM
, EXd
}, PREFIX_DATA
},
4394 { "pmovzxbq", { XM
, EXw
}, PREFIX_DATA
},
4395 { "pmovzxwd", { XM
, EXq
}, PREFIX_DATA
},
4396 { "pmovzxwq", { XM
, EXd
}, PREFIX_DATA
},
4397 { "pmovzxdq", { XM
, EXq
}, PREFIX_DATA
},
4399 { "pcmpgtq", { XM
, EXx
}, PREFIX_DATA
},
4401 { "pminsb", { XM
, EXx
}, PREFIX_DATA
},
4402 { "pminsd", { XM
, EXx
}, PREFIX_DATA
},
4403 { "pminuw", { XM
, EXx
}, PREFIX_DATA
},
4404 { "pminud", { XM
, EXx
}, PREFIX_DATA
},
4405 { "pmaxsb", { XM
, EXx
}, PREFIX_DATA
},
4406 { "pmaxsd", { XM
, EXx
}, PREFIX_DATA
},
4407 { "pmaxuw", { XM
, EXx
}, PREFIX_DATA
},
4408 { "pmaxud", { XM
, EXx
}, PREFIX_DATA
},
4410 { "pmulld", { XM
, EXx
}, PREFIX_DATA
},
4411 { "phminposuw", { XM
, EXx
}, PREFIX_DATA
},
4482 { "invept", { Gm
, Mo
}, PREFIX_DATA
},
4483 { "invvpid", { Gm
, Mo
}, PREFIX_DATA
},
4484 { "invpcid", { Gm
, M
}, PREFIX_DATA
},
4563 { "sha1nexte", { XM
, EXxmm
}, PREFIX_OPCODE
},
4564 { "sha1msg1", { XM
, EXxmm
}, PREFIX_OPCODE
},
4565 { "sha1msg2", { XM
, EXxmm
}, PREFIX_OPCODE
},
4566 { "sha256rnds2", { XM
, EXxmm
, XMM0
}, PREFIX_OPCODE
},
4567 { "sha256msg1", { XM
, EXxmm
}, PREFIX_OPCODE
},
4568 { "sha256msg2", { XM
, EXxmm
}, PREFIX_OPCODE
},
4570 { "gf2p8mulb", { XM
, EXxmm
}, PREFIX_DATA
},
4581 { PREFIX_TABLE (PREFIX_0F38D8
) },
4584 { "aesimc", { XM
, EXx
}, PREFIX_DATA
},
4585 { PREFIX_TABLE (PREFIX_0F38DC
) },
4586 { PREFIX_TABLE (PREFIX_0F38DD
) },
4587 { PREFIX_TABLE (PREFIX_0F38DE
) },
4588 { PREFIX_TABLE (PREFIX_0F38DF
) },
4608 { PREFIX_TABLE (PREFIX_0F38F0
) },
4609 { PREFIX_TABLE (PREFIX_0F38F1
) },
4613 { MOD_TABLE (MOD_0F38F5
) },
4614 { PREFIX_TABLE (PREFIX_0F38F6
) },
4617 { PREFIX_TABLE (PREFIX_0F38F8
) },
4618 { MOD_TABLE (MOD_0F38F9
) },
4619 { PREFIX_TABLE (PREFIX_0F38FA
) },
4620 { PREFIX_TABLE (PREFIX_0F38FB
) },
4626 /* THREE_BYTE_0F3A */
4638 { "roundps", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4639 { "roundpd", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4640 { "roundss", { XM
, EXd
, Ib
}, PREFIX_DATA
},
4641 { "roundsd", { XM
, EXq
, Ib
}, PREFIX_DATA
},
4642 { "blendps", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4643 { "blendpd", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4644 { "pblendw", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4645 { "palignr", { MX
, EM
, Ib
}, PREFIX_OPCODE
},
4651 { "pextrb", { Edb
, XM
, Ib
}, PREFIX_DATA
},
4652 { "pextrw", { Edw
, XM
, Ib
}, PREFIX_DATA
},
4653 { "pextrK", { Edq
, XM
, Ib
}, PREFIX_DATA
},
4654 { "extractps", { Ed
, XM
, Ib
}, PREFIX_DATA
},
4665 { "pinsrb", { XM
, Edb
, Ib
}, PREFIX_DATA
},
4666 { "insertps", { XM
, EXd
, Ib
}, PREFIX_DATA
},
4667 { "pinsrK", { XM
, Edq
, Ib
}, PREFIX_DATA
},
4701 { "dpps", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4702 { "dppd", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4703 { "mpsadbw", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4705 { "pclmulqdq", { XM
, EXx
, PCLMUL
}, PREFIX_DATA
},
4737 { "pcmpestrm!%LQ", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4738 { "pcmpestri!%LQ", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4739 { "pcmpistrm", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4740 { "pcmpistri", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4858 { "sha1rnds4", { XM
, EXxmm
, Ib
}, PREFIX_OPCODE
},
4860 { "gf2p8affineqb", { XM
, EXxmm
, Ib
}, PREFIX_DATA
},
4861 { "gf2p8affineinvqb", { XM
, EXxmm
, Ib
}, PREFIX_DATA
},
4879 { "aeskeygenassist", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4899 { PREFIX_TABLE (PREFIX_0F3A0F
) },
4919 static const struct dis386 xop_table
[][256] = {
5072 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_85
) },
5073 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_86
) },
5074 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_87
) },
5082 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_8E
) },
5083 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_8F
) },
5090 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_95
) },
5091 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_96
) },
5092 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_97
) },
5100 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_9E
) },
5101 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_9F
) },
5105 { "vpcmov", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
5106 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_A3
) },
5109 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_A6
) },
5127 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_B6
) },
5139 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C0
) },
5140 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C1
) },
5141 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C2
) },
5142 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C3
) },
5152 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CC
) },
5153 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CD
) },
5154 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CE
) },
5155 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CF
) },
5188 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EC
) },
5189 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_ED
) },
5190 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EE
) },
5191 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EF
) },
5215 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_01
) },
5216 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_02
) },
5234 { MOD_TABLE (MOD_XOP_09_12
) },
5358 { VEX_W_TABLE (VEX_W_0FXOP_09_80
) },
5359 { VEX_W_TABLE (VEX_W_0FXOP_09_81
) },
5360 { VEX_W_TABLE (VEX_W_0FXOP_09_82
) },
5361 { VEX_W_TABLE (VEX_W_0FXOP_09_83
) },
5376 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_90
) },
5377 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_91
) },
5378 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_92
) },
5379 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_93
) },
5380 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_94
) },
5381 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_95
) },
5382 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_96
) },
5383 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_97
) },
5385 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_98
) },
5386 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_99
) },
5387 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_9A
) },
5388 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_9B
) },
5431 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C1
) },
5432 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C2
) },
5433 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C3
) },
5436 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C6
) },
5437 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C7
) },
5442 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_CB
) },
5449 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D1
) },
5450 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D2
) },
5451 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D3
) },
5454 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D6
) },
5455 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D7
) },
5460 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_DB
) },
5467 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_E1
) },
5468 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_E2
) },
5469 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_E3
) },
5523 { "bextrS", { Gdq
, Edq
, Id
}, 0 },
5525 { VEX_LEN_TABLE (VEX_LEN_0FXOP_0A_12
) },
5795 static const struct dis386 vex_table
[][256] = {
5817 { PREFIX_TABLE (PREFIX_VEX_0F10
) },
5818 { PREFIX_TABLE (PREFIX_VEX_0F11
) },
5819 { PREFIX_TABLE (PREFIX_VEX_0F12
) },
5820 { MOD_TABLE (MOD_VEX_0F13
) },
5821 { "vunpcklpX", { XM
, Vex
, EXx
}, PREFIX_OPCODE
},
5822 { "vunpckhpX", { XM
, Vex
, EXx
}, PREFIX_OPCODE
},
5823 { PREFIX_TABLE (PREFIX_VEX_0F16
) },
5824 { MOD_TABLE (MOD_VEX_0F17
) },
5844 { "vmovapX", { XM
, EXx
}, PREFIX_OPCODE
},
5845 { "vmovapX", { EXxS
, XM
}, PREFIX_OPCODE
},
5846 { PREFIX_TABLE (PREFIX_VEX_0F2A
) },
5847 { MOD_TABLE (MOD_VEX_0F2B
) },
5848 { PREFIX_TABLE (PREFIX_VEX_0F2C
) },
5849 { PREFIX_TABLE (PREFIX_VEX_0F2D
) },
5850 { PREFIX_TABLE (PREFIX_VEX_0F2E
) },
5851 { PREFIX_TABLE (PREFIX_VEX_0F2F
) },
5872 { VEX_LEN_TABLE (VEX_LEN_0F41
) },
5873 { VEX_LEN_TABLE (VEX_LEN_0F42
) },
5875 { VEX_LEN_TABLE (VEX_LEN_0F44
) },
5876 { VEX_LEN_TABLE (VEX_LEN_0F45
) },
5877 { VEX_LEN_TABLE (VEX_LEN_0F46
) },
5878 { VEX_LEN_TABLE (VEX_LEN_0F47
) },
5882 { VEX_LEN_TABLE (VEX_LEN_0F4A
) },
5883 { VEX_LEN_TABLE (VEX_LEN_0F4B
) },
5889 { MOD_TABLE (MOD_VEX_0F50
) },
5890 { PREFIX_TABLE (PREFIX_VEX_0F51
) },
5891 { PREFIX_TABLE (PREFIX_VEX_0F52
) },
5892 { PREFIX_TABLE (PREFIX_VEX_0F53
) },
5893 { "vandpX", { XM
, Vex
, EXx
}, PREFIX_OPCODE
},
5894 { "vandnpX", { XM
, Vex
, EXx
}, PREFIX_OPCODE
},
5895 { "vorpX", { XM
, Vex
, EXx
}, PREFIX_OPCODE
},
5896 { "vxorpX", { XM
, Vex
, EXx
}, PREFIX_OPCODE
},
5898 { PREFIX_TABLE (PREFIX_VEX_0F58
) },
5899 { PREFIX_TABLE (PREFIX_VEX_0F59
) },
5900 { PREFIX_TABLE (PREFIX_VEX_0F5A
) },
5901 { PREFIX_TABLE (PREFIX_VEX_0F5B
) },
5902 { PREFIX_TABLE (PREFIX_VEX_0F5C
) },
5903 { PREFIX_TABLE (PREFIX_VEX_0F5D
) },
5904 { PREFIX_TABLE (PREFIX_VEX_0F5E
) },
5905 { PREFIX_TABLE (PREFIX_VEX_0F5F
) },
5907 { "vpunpcklbw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5908 { "vpunpcklwd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5909 { "vpunpckldq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5910 { "vpacksswb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5911 { "vpcmpgtb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5912 { "vpcmpgtw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5913 { "vpcmpgtd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5914 { "vpackuswb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5916 { "vpunpckhbw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5917 { "vpunpckhwd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5918 { "vpunpckhdq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5919 { "vpackssdw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5920 { "vpunpcklqdq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5921 { "vpunpckhqdq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5922 { VEX_LEN_TABLE (VEX_LEN_0F6E
) },
5923 { PREFIX_TABLE (PREFIX_VEX_0F6F
) },
5925 { PREFIX_TABLE (PREFIX_VEX_0F70
) },
5926 { MOD_TABLE (MOD_VEX_0F71
) },
5927 { MOD_TABLE (MOD_VEX_0F72
) },
5928 { MOD_TABLE (MOD_VEX_0F73
) },
5929 { "vpcmpeqb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5930 { "vpcmpeqw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5931 { "vpcmpeqd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5932 { VEX_LEN_TABLE (VEX_LEN_0F77
) },
5938 { PREFIX_TABLE (PREFIX_VEX_0F7C
) },
5939 { PREFIX_TABLE (PREFIX_VEX_0F7D
) },
5940 { PREFIX_TABLE (PREFIX_VEX_0F7E
) },
5941 { PREFIX_TABLE (PREFIX_VEX_0F7F
) },
5961 { VEX_LEN_TABLE (VEX_LEN_0F90
) },
5962 { VEX_LEN_TABLE (VEX_LEN_0F91
) },
5963 { VEX_LEN_TABLE (VEX_LEN_0F92
) },
5964 { VEX_LEN_TABLE (VEX_LEN_0F93
) },
5970 { VEX_LEN_TABLE (VEX_LEN_0F98
) },
5971 { VEX_LEN_TABLE (VEX_LEN_0F99
) },
5994 { REG_TABLE (REG_VEX_0FAE
) },
6017 { PREFIX_TABLE (PREFIX_VEX_0FC2
) },
6019 { VEX_LEN_TABLE (VEX_LEN_0FC4
) },
6020 { VEX_LEN_TABLE (VEX_LEN_0FC5
) },
6021 { "vshufpX", { XM
, Vex
, EXx
, Ib
}, PREFIX_OPCODE
},
6033 { PREFIX_TABLE (PREFIX_VEX_0FD0
) },
6034 { "vpsrlw", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
6035 { "vpsrld", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
6036 { "vpsrlq", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
6037 { "vpaddq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6038 { "vpmullw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6039 { VEX_LEN_TABLE (VEX_LEN_0FD6
) },
6040 { MOD_TABLE (MOD_VEX_0FD7
) },
6042 { "vpsubusb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6043 { "vpsubusw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6044 { "vpminub", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6045 { "vpand", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6046 { "vpaddusb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6047 { "vpaddusw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6048 { "vpmaxub", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6049 { "vpandn", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6051 { "vpavgb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6052 { "vpsraw", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
6053 { "vpsrad", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
6054 { "vpavgw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6055 { "vpmulhuw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6056 { "vpmulhw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6057 { PREFIX_TABLE (PREFIX_VEX_0FE6
) },
6058 { MOD_TABLE (MOD_VEX_0FE7
) },
6060 { "vpsubsb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6061 { "vpsubsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6062 { "vpminsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6063 { "vpor", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6064 { "vpaddsb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6065 { "vpaddsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6066 { "vpmaxsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6067 { "vpxor", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6069 { PREFIX_TABLE (PREFIX_VEX_0FF0
) },
6070 { "vpsllw", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
6071 { "vpslld", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
6072 { "vpsllq", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
6073 { "vpmuludq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6074 { "vpmaddwd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6075 { "vpsadbw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6076 { VEX_LEN_TABLE (VEX_LEN_0FF7
) },
6078 { "vpsubb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6079 { "vpsubw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6080 { "vpsubd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6081 { "vpsubq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6082 { "vpaddb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6083 { "vpaddw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6084 { "vpaddd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6090 { "vpshufb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6091 { "vphaddw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6092 { "vphaddd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6093 { "vphaddsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6094 { "vpmaddubsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6095 { "vphsubw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6096 { "vphsubd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6097 { "vphsubsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6099 { "vpsignb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6100 { "vpsignw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6101 { "vpsignd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6102 { "vpmulhrsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6103 { VEX_W_TABLE (VEX_W_0F380C
) },
6104 { VEX_W_TABLE (VEX_W_0F380D
) },
6105 { VEX_W_TABLE (VEX_W_0F380E
) },
6106 { VEX_W_TABLE (VEX_W_0F380F
) },
6111 { VEX_W_TABLE (VEX_W_0F3813
) },
6114 { VEX_LEN_TABLE (VEX_LEN_0F3816
) },
6115 { "vptest", { XM
, EXx
}, PREFIX_DATA
},
6117 { VEX_W_TABLE (VEX_W_0F3818
) },
6118 { VEX_LEN_TABLE (VEX_LEN_0F3819
) },
6119 { MOD_TABLE (MOD_VEX_0F381A
) },
6121 { "vpabsb", { XM
, EXx
}, PREFIX_DATA
},
6122 { "vpabsw", { XM
, EXx
}, PREFIX_DATA
},
6123 { "vpabsd", { XM
, EXx
}, PREFIX_DATA
},
6126 { "vpmovsxbw", { XM
, EXxmmq
}, PREFIX_DATA
},
6127 { "vpmovsxbd", { XM
, EXxmmqd
}, PREFIX_DATA
},
6128 { "vpmovsxbq", { XM
, EXxmmdw
}, PREFIX_DATA
},
6129 { "vpmovsxwd", { XM
, EXxmmq
}, PREFIX_DATA
},
6130 { "vpmovsxwq", { XM
, EXxmmqd
}, PREFIX_DATA
},
6131 { "vpmovsxdq", { XM
, EXxmmq
}, PREFIX_DATA
},
6135 { "vpmuldq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6136 { "vpcmpeqq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6137 { MOD_TABLE (MOD_VEX_0F382A
) },
6138 { "vpackusdw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6139 { MOD_TABLE (MOD_VEX_0F382C
) },
6140 { MOD_TABLE (MOD_VEX_0F382D
) },
6141 { MOD_TABLE (MOD_VEX_0F382E
) },
6142 { MOD_TABLE (MOD_VEX_0F382F
) },
6144 { "vpmovzxbw", { XM
, EXxmmq
}, PREFIX_DATA
},
6145 { "vpmovzxbd", { XM
, EXxmmqd
}, PREFIX_DATA
},
6146 { "vpmovzxbq", { XM
, EXxmmdw
}, PREFIX_DATA
},
6147 { "vpmovzxwd", { XM
, EXxmmq
}, PREFIX_DATA
},
6148 { "vpmovzxwq", { XM
, EXxmmqd
}, PREFIX_DATA
},
6149 { "vpmovzxdq", { XM
, EXxmmq
}, PREFIX_DATA
},
6150 { VEX_LEN_TABLE (VEX_LEN_0F3836
) },
6151 { "vpcmpgtq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6153 { "vpminsb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6154 { "vpminsd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6155 { "vpminuw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6156 { "vpminud", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6157 { "vpmaxsb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6158 { "vpmaxsd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6159 { "vpmaxuw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6160 { "vpmaxud", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6162 { "vpmulld", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6163 { VEX_LEN_TABLE (VEX_LEN_0F3841
) },
6167 { "vpsrlv%DQ", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6168 { VEX_W_TABLE (VEX_W_0F3846
) },
6169 { "vpsllv%DQ", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6172 { X86_64_TABLE (X86_64_VEX_0F3849
) },
6174 { X86_64_TABLE (X86_64_VEX_0F384B
) },
6180 { VEX_W_TABLE (VEX_W_0F3850
) },
6181 { VEX_W_TABLE (VEX_W_0F3851
) },
6182 { VEX_W_TABLE (VEX_W_0F3852
) },
6183 { VEX_W_TABLE (VEX_W_0F3853
) },
6189 { VEX_W_TABLE (VEX_W_0F3858
) },
6190 { VEX_W_TABLE (VEX_W_0F3859
) },
6191 { MOD_TABLE (MOD_VEX_0F385A
) },
6193 { X86_64_TABLE (X86_64_VEX_0F385C
) },
6195 { X86_64_TABLE (X86_64_VEX_0F385E
) },
6225 { VEX_W_TABLE (VEX_W_0F3878
) },
6226 { VEX_W_TABLE (VEX_W_0F3879
) },
6247 { MOD_TABLE (MOD_VEX_0F388C
) },
6249 { MOD_TABLE (MOD_VEX_0F388E
) },
6252 { "vpgatherd%DQ", { XM
, MVexVSIBDWpX
, VexGatherD
}, PREFIX_DATA
},
6253 { "vpgatherq%DQ", { XMGatherQ
, MVexVSIBQWpX
, VexGatherQ
}, PREFIX_DATA
},
6254 { "vgatherdp%XW", { XM
, MVexVSIBDWpX
, VexGatherD
}, PREFIX_DATA
},
6255 { "vgatherqp%XW", { XMGatherQ
, MVexVSIBQWpX
, VexGatherQ
}, PREFIX_DATA
},
6258 { "vfmaddsub132p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6259 { "vfmsubadd132p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6261 { "vfmadd132p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6262 { "vfmadd132s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6263 { "vfmsub132p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6264 { "vfmsub132s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6265 { "vfnmadd132p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6266 { "vfnmadd132s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6267 { "vfnmsub132p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6268 { "vfnmsub132s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6276 { "vfmaddsub213p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6277 { "vfmsubadd213p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6279 { "vfmadd213p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6280 { "vfmadd213s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6281 { "vfmsub213p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6282 { "vfmsub213s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6283 { "vfnmadd213p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6284 { "vfnmadd213s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6285 { "vfnmsub213p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6286 { "vfnmsub213s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6294 { "vfmaddsub231p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6295 { "vfmsubadd231p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6297 { "vfmadd231p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6298 { "vfmadd231s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6299 { "vfmsub231p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6300 { "vfmsub231s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6301 { "vfnmadd231p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6302 { "vfnmadd231s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6303 { "vfnmsub231p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6304 { "vfnmsub231s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6322 { VEX_W_TABLE (VEX_W_0F38CF
) },
6336 { VEX_LEN_TABLE (VEX_LEN_0F38DB
) },
6337 { "vaesenc", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6338 { "vaesenclast", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6339 { "vaesdec", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6340 { "vaesdeclast", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6362 { VEX_LEN_TABLE (VEX_LEN_0F38F2
) },
6363 { VEX_LEN_TABLE (VEX_LEN_0F38F3
) },
6365 { VEX_LEN_TABLE (VEX_LEN_0F38F5
) },
6366 { VEX_LEN_TABLE (VEX_LEN_0F38F6
) },
6367 { VEX_LEN_TABLE (VEX_LEN_0F38F7
) },
6381 { VEX_LEN_TABLE (VEX_LEN_0F3A00
) },
6382 { VEX_LEN_TABLE (VEX_LEN_0F3A01
) },
6383 { VEX_W_TABLE (VEX_W_0F3A02
) },
6385 { VEX_W_TABLE (VEX_W_0F3A04
) },
6386 { VEX_W_TABLE (VEX_W_0F3A05
) },
6387 { VEX_LEN_TABLE (VEX_LEN_0F3A06
) },
6390 { "vroundps", { XM
, EXx
, Ib
}, PREFIX_DATA
},
6391 { "vroundpd", { XM
, EXx
, Ib
}, PREFIX_DATA
},
6392 { "vroundss", { XMScalar
, VexScalar
, EXd
, Ib
}, PREFIX_DATA
},
6393 { "vroundsd", { XMScalar
, VexScalar
, EXq
, Ib
}, PREFIX_DATA
},
6394 { "vblendps", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
6395 { "vblendpd", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
6396 { "vpblendw", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
6397 { "vpalignr", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
6403 { VEX_LEN_TABLE (VEX_LEN_0F3A14
) },
6404 { VEX_LEN_TABLE (VEX_LEN_0F3A15
) },
6405 { VEX_LEN_TABLE (VEX_LEN_0F3A16
) },
6406 { VEX_LEN_TABLE (VEX_LEN_0F3A17
) },
6408 { VEX_LEN_TABLE (VEX_LEN_0F3A18
) },
6409 { VEX_LEN_TABLE (VEX_LEN_0F3A19
) },
6413 { VEX_W_TABLE (VEX_W_0F3A1D
) },
6417 { VEX_LEN_TABLE (VEX_LEN_0F3A20
) },
6418 { VEX_LEN_TABLE (VEX_LEN_0F3A21
) },
6419 { VEX_LEN_TABLE (VEX_LEN_0F3A22
) },
6435 { VEX_LEN_TABLE (VEX_LEN_0F3A30
) },
6436 { VEX_LEN_TABLE (VEX_LEN_0F3A31
) },
6437 { VEX_LEN_TABLE (VEX_LEN_0F3A32
) },
6438 { VEX_LEN_TABLE (VEX_LEN_0F3A33
) },
6444 { VEX_LEN_TABLE (VEX_LEN_0F3A38
) },
6445 { VEX_LEN_TABLE (VEX_LEN_0F3A39
) },
6453 { "vdpps", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
6454 { VEX_LEN_TABLE (VEX_LEN_0F3A41
) },
6455 { "vmpsadbw", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
6457 { "vpclmulqdq", { XM
, Vex
, EXx
, PCLMUL
}, PREFIX_DATA
},
6459 { VEX_LEN_TABLE (VEX_LEN_0F3A46
) },
6462 { "vpermil2ps", { XM
, Vex
, EXx
, XMVexI4
, VexI4
}, PREFIX_DATA
},
6463 { "vpermil2pd", { XM
, Vex
, EXx
, XMVexI4
, VexI4
}, PREFIX_DATA
},
6464 { VEX_W_TABLE (VEX_W_0F3A4A
) },
6465 { VEX_W_TABLE (VEX_W_0F3A4B
) },
6466 { VEX_W_TABLE (VEX_W_0F3A4C
) },
6484 { "vfmaddsubps", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6485 { "vfmaddsubpd", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6486 { "vfmsubaddps", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6487 { "vfmsubaddpd", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6489 { VEX_LEN_TABLE (VEX_LEN_0F3A60
) },
6490 { VEX_LEN_TABLE (VEX_LEN_0F3A61
) },
6491 { VEX_LEN_TABLE (VEX_LEN_0F3A62
) },
6492 { VEX_LEN_TABLE (VEX_LEN_0F3A63
) },
6498 { "vfmaddps", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6499 { "vfmaddpd", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6500 { "vfmaddss", { XMScalar
, VexScalar
, EXd
, XMVexScalarI4
}, PREFIX_DATA
},
6501 { "vfmaddsd", { XMScalar
, VexScalar
, EXq
, XMVexScalarI4
}, PREFIX_DATA
},
6502 { "vfmsubps", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6503 { "vfmsubpd", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6504 { "vfmsubss", { XMScalar
, VexScalar
, EXd
, XMVexScalarI4
}, PREFIX_DATA
},
6505 { "vfmsubsd", { XMScalar
, VexScalar
, EXq
, XMVexScalarI4
}, PREFIX_DATA
},
6516 { "vfnmaddps", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6517 { "vfnmaddpd", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6518 { "vfnmaddss", { XMScalar
, VexScalar
, EXd
, XMVexScalarI4
}, PREFIX_DATA
},
6519 { "vfnmaddsd", { XMScalar
, VexScalar
, EXq
, XMVexScalarI4
}, PREFIX_DATA
},
6520 { "vfnmsubps", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6521 { "vfnmsubpd", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6522 { "vfnmsubss", { XMScalar
, VexScalar
, EXd
, XMVexScalarI4
}, PREFIX_DATA
},
6523 { "vfnmsubsd", { XMScalar
, VexScalar
, EXq
, XMVexScalarI4
}, PREFIX_DATA
},
6612 { VEX_W_TABLE (VEX_W_0F3ACE
) },
6613 { VEX_W_TABLE (VEX_W_0F3ACF
) },
6631 { VEX_LEN_TABLE (VEX_LEN_0F3ADF
) },
6651 { VEX_LEN_TABLE (VEX_LEN_0F3AF0
) },
6671 #include "i386-dis-evex.h"
6673 static const struct dis386 vex_len_table
[][2] = {
6674 /* VEX_LEN_0F12_P_0_M_0 / VEX_LEN_0F12_P_2_M_0 */
6676 { "vmovlpX", { XM
, Vex
, EXq
}, PREFIX_OPCODE
},
6679 /* VEX_LEN_0F12_P_0_M_1 */
6681 { "vmovhlp%XS", { XM
, Vex
, EXq
}, 0 },
6684 /* VEX_LEN_0F13_M_0 */
6686 { "vmovlpX", { EXq
, XM
}, PREFIX_OPCODE
},
6689 /* VEX_LEN_0F16_P_0_M_0 / VEX_LEN_0F16_P_2_M_0 */
6691 { "vmovhpX", { XM
, Vex
, EXq
}, PREFIX_OPCODE
},
6694 /* VEX_LEN_0F16_P_0_M_1 */
6696 { "vmovlhp%XS", { XM
, Vex
, EXq
}, 0 },
6699 /* VEX_LEN_0F17_M_0 */
6701 { "vmovhpX", { EXq
, XM
}, PREFIX_OPCODE
},
6707 { MOD_TABLE (MOD_VEX_0F41_L_1
) },
6713 { MOD_TABLE (MOD_VEX_0F42_L_1
) },
6718 { MOD_TABLE (MOD_VEX_0F44_L_0
) },
6724 { MOD_TABLE (MOD_VEX_0F45_L_1
) },
6730 { MOD_TABLE (MOD_VEX_0F46_L_1
) },
6736 { MOD_TABLE (MOD_VEX_0F47_L_1
) },
6742 { MOD_TABLE (MOD_VEX_0F4A_L_1
) },
6748 { MOD_TABLE (MOD_VEX_0F4B_L_1
) },
6753 { "vmovK", { XMScalar
, Edq
}, PREFIX_DATA
},
6758 { "vzeroupper", { XX
}, 0 },
6759 { "vzeroall", { XX
}, 0 },
6762 /* VEX_LEN_0F7E_P_1 */
6764 { "vmovq", { XMScalar
, EXq
}, 0 },
6767 /* VEX_LEN_0F7E_P_2 */
6769 { "vmovK", { Edq
, XMScalar
}, 0 },
6774 { VEX_W_TABLE (VEX_W_0F90_L_0
) },
6779 { MOD_TABLE (MOD_VEX_0F91_L_0
) },
6784 { MOD_TABLE (MOD_VEX_0F92_L_0
) },
6789 { MOD_TABLE (MOD_VEX_0F93_L_0
) },
6794 { MOD_TABLE (MOD_VEX_0F98_L_0
) },
6799 { MOD_TABLE (MOD_VEX_0F99_L_0
) },
6802 /* VEX_LEN_0FAE_R_2_M_0 */
6804 { "vldmxcsr", { Md
}, 0 },
6807 /* VEX_LEN_0FAE_R_3_M_0 */
6809 { "vstmxcsr", { Md
}, 0 },
6814 { "vpinsrw", { XM
, Vex
, Edw
, Ib
}, PREFIX_DATA
},
6819 { "vpextrw", { Gd
, XS
, Ib
}, PREFIX_DATA
},
6824 { "vmovq", { EXqS
, XMScalar
}, PREFIX_DATA
},
6829 { "vmaskmovdqu", { XM
, XS
}, PREFIX_DATA
},
6832 /* VEX_LEN_0F3816 */
6835 { VEX_W_TABLE (VEX_W_0F3816_L_1
) },
6838 /* VEX_LEN_0F3819 */
6841 { VEX_W_TABLE (VEX_W_0F3819_L_1
) },
6844 /* VEX_LEN_0F381A_M_0 */
6847 { VEX_W_TABLE (VEX_W_0F381A_M_0_L_1
) },
6850 /* VEX_LEN_0F3836 */
6853 { VEX_W_TABLE (VEX_W_0F3836
) },
6856 /* VEX_LEN_0F3841 */
6858 { "vphminposuw", { XM
, EXx
}, PREFIX_DATA
},
6861 /* VEX_LEN_0F3849_X86_64_P_0_W_0_M_0 */
6863 { "ldtilecfg", { M
}, 0 },
6866 /* VEX_LEN_0F3849_X86_64_P_0_W_0_M_1_REG_0_RM_0 */
6868 { "tilerelease", { Skip_MODRM
}, 0 },
6871 /* VEX_LEN_0F3849_X86_64_P_2_W_0_M_0 */
6873 { "sttilecfg", { M
}, 0 },
6876 /* VEX_LEN_0F3849_X86_64_P_3_W_0_M_0 */
6878 { "tilezero", { TMM
, Skip_MODRM
}, 0 },
6881 /* VEX_LEN_0F384B_X86_64_P_1_W_0_M_0 */
6883 { "tilestored", { MVexSIBMEM
, TMM
}, 0 },
6885 /* VEX_LEN_0F384B_X86_64_P_2_W_0_M_0 */
6887 { "tileloaddt1", { TMM
, MVexSIBMEM
}, 0 },
6890 /* VEX_LEN_0F384B_X86_64_P_3_W_0_M_0 */
6892 { "tileloadd", { TMM
, MVexSIBMEM
}, 0 },
6895 /* VEX_LEN_0F385A_M_0 */
6898 { VEX_W_TABLE (VEX_W_0F385A_M_0_L_0
) },
6901 /* VEX_LEN_0F385C_X86_64_P_1_W_0_M_0 */
6903 { "tdpbf16ps", { TMM
, EXtmm
, VexTmm
}, 0 },
6906 /* VEX_LEN_0F385E_X86_64_P_0_W_0_M_0 */
6908 { "tdpbuud", {TMM
, EXtmm
, VexTmm
}, 0 },
6911 /* VEX_LEN_0F385E_X86_64_P_1_W_0_M_0 */
6913 { "tdpbsud", {TMM
, EXtmm
, VexTmm
}, 0 },
6916 /* VEX_LEN_0F385E_X86_64_P_2_W_0_M_0 */
6918 { "tdpbusd", {TMM
, EXtmm
, VexTmm
}, 0 },
6921 /* VEX_LEN_0F385E_X86_64_P_3_W_0_M_0 */
6923 { "tdpbssd", {TMM
, EXtmm
, VexTmm
}, 0 },
6926 /* VEX_LEN_0F38DB */
6928 { "vaesimc", { XM
, EXx
}, PREFIX_DATA
},
6931 /* VEX_LEN_0F38F2 */
6933 { "andnS", { Gdq
, VexGdq
, Edq
}, PREFIX_OPCODE
},
6936 /* VEX_LEN_0F38F3 */
6938 { REG_TABLE(REG_VEX_0F38F3_L_0
) },
6941 /* VEX_LEN_0F38F5 */
6943 { PREFIX_TABLE(PREFIX_VEX_0F38F5_L_0
) },
6946 /* VEX_LEN_0F38F6 */
6948 { PREFIX_TABLE(PREFIX_VEX_0F38F6_L_0
) },
6951 /* VEX_LEN_0F38F7 */
6953 { PREFIX_TABLE(PREFIX_VEX_0F38F7_L_0
) },
6956 /* VEX_LEN_0F3A00 */
6959 { VEX_W_TABLE (VEX_W_0F3A00_L_1
) },
6962 /* VEX_LEN_0F3A01 */
6965 { VEX_W_TABLE (VEX_W_0F3A01_L_1
) },
6968 /* VEX_LEN_0F3A06 */
6971 { VEX_W_TABLE (VEX_W_0F3A06_L_1
) },
6974 /* VEX_LEN_0F3A14 */
6976 { "vpextrb", { Edb
, XM
, Ib
}, PREFIX_DATA
},
6979 /* VEX_LEN_0F3A15 */
6981 { "vpextrw", { Edw
, XM
, Ib
}, PREFIX_DATA
},
6984 /* VEX_LEN_0F3A16 */
6986 { "vpextrK", { Edq
, XM
, Ib
}, PREFIX_DATA
},
6989 /* VEX_LEN_0F3A17 */
6991 { "vextractps", { Ed
, XM
, Ib
}, PREFIX_DATA
},
6994 /* VEX_LEN_0F3A18 */
6997 { VEX_W_TABLE (VEX_W_0F3A18_L_1
) },
7000 /* VEX_LEN_0F3A19 */
7003 { VEX_W_TABLE (VEX_W_0F3A19_L_1
) },
7006 /* VEX_LEN_0F3A20 */
7008 { "vpinsrb", { XM
, Vex
, Edb
, Ib
}, PREFIX_DATA
},
7011 /* VEX_LEN_0F3A21 */
7013 { "vinsertps", { XM
, Vex
, EXd
, Ib
}, PREFIX_DATA
},
7016 /* VEX_LEN_0F3A22 */
7018 { "vpinsrK", { XM
, Vex
, Edq
, Ib
}, PREFIX_DATA
},
7021 /* VEX_LEN_0F3A30 */
7023 { MOD_TABLE (MOD_VEX_0F3A30_L_0
) },
7026 /* VEX_LEN_0F3A31 */
7028 { MOD_TABLE (MOD_VEX_0F3A31_L_0
) },
7031 /* VEX_LEN_0F3A32 */
7033 { MOD_TABLE (MOD_VEX_0F3A32_L_0
) },
7036 /* VEX_LEN_0F3A33 */
7038 { MOD_TABLE (MOD_VEX_0F3A33_L_0
) },
7041 /* VEX_LEN_0F3A38 */
7044 { VEX_W_TABLE (VEX_W_0F3A38_L_1
) },
7047 /* VEX_LEN_0F3A39 */
7050 { VEX_W_TABLE (VEX_W_0F3A39_L_1
) },
7053 /* VEX_LEN_0F3A41 */
7055 { "vdppd", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
7058 /* VEX_LEN_0F3A46 */
7061 { VEX_W_TABLE (VEX_W_0F3A46_L_1
) },
7064 /* VEX_LEN_0F3A60 */
7066 { "vpcmpestrm!%LQ", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7069 /* VEX_LEN_0F3A61 */
7071 { "vpcmpestri!%LQ", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7074 /* VEX_LEN_0F3A62 */
7076 { "vpcmpistrm", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7079 /* VEX_LEN_0F3A63 */
7081 { "vpcmpistri", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7084 /* VEX_LEN_0F3ADF */
7086 { "vaeskeygenassist", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7089 /* VEX_LEN_0F3AF0 */
7091 { PREFIX_TABLE (PREFIX_VEX_0F3AF0_L_0
) },
7094 /* VEX_LEN_0FXOP_08_85 */
7096 { VEX_W_TABLE (VEX_W_0FXOP_08_85_L_0
) },
7099 /* VEX_LEN_0FXOP_08_86 */
7101 { VEX_W_TABLE (VEX_W_0FXOP_08_86_L_0
) },
7104 /* VEX_LEN_0FXOP_08_87 */
7106 { VEX_W_TABLE (VEX_W_0FXOP_08_87_L_0
) },
7109 /* VEX_LEN_0FXOP_08_8E */
7111 { VEX_W_TABLE (VEX_W_0FXOP_08_8E_L_0
) },
7114 /* VEX_LEN_0FXOP_08_8F */
7116 { VEX_W_TABLE (VEX_W_0FXOP_08_8F_L_0
) },
7119 /* VEX_LEN_0FXOP_08_95 */
7121 { VEX_W_TABLE (VEX_W_0FXOP_08_95_L_0
) },
7124 /* VEX_LEN_0FXOP_08_96 */
7126 { VEX_W_TABLE (VEX_W_0FXOP_08_96_L_0
) },
7129 /* VEX_LEN_0FXOP_08_97 */
7131 { VEX_W_TABLE (VEX_W_0FXOP_08_97_L_0
) },
7134 /* VEX_LEN_0FXOP_08_9E */
7136 { VEX_W_TABLE (VEX_W_0FXOP_08_9E_L_0
) },
7139 /* VEX_LEN_0FXOP_08_9F */
7141 { VEX_W_TABLE (VEX_W_0FXOP_08_9F_L_0
) },
7144 /* VEX_LEN_0FXOP_08_A3 */
7146 { "vpperm", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7149 /* VEX_LEN_0FXOP_08_A6 */
7151 { VEX_W_TABLE (VEX_W_0FXOP_08_A6_L_0
) },
7154 /* VEX_LEN_0FXOP_08_B6 */
7156 { VEX_W_TABLE (VEX_W_0FXOP_08_B6_L_0
) },
7159 /* VEX_LEN_0FXOP_08_C0 */
7161 { VEX_W_TABLE (VEX_W_0FXOP_08_C0_L_0
) },
7164 /* VEX_LEN_0FXOP_08_C1 */
7166 { VEX_W_TABLE (VEX_W_0FXOP_08_C1_L_0
) },
7169 /* VEX_LEN_0FXOP_08_C2 */
7171 { VEX_W_TABLE (VEX_W_0FXOP_08_C2_L_0
) },
7174 /* VEX_LEN_0FXOP_08_C3 */
7176 { VEX_W_TABLE (VEX_W_0FXOP_08_C3_L_0
) },
7179 /* VEX_LEN_0FXOP_08_CC */
7181 { VEX_W_TABLE (VEX_W_0FXOP_08_CC_L_0
) },
7184 /* VEX_LEN_0FXOP_08_CD */
7186 { VEX_W_TABLE (VEX_W_0FXOP_08_CD_L_0
) },
7189 /* VEX_LEN_0FXOP_08_CE */
7191 { VEX_W_TABLE (VEX_W_0FXOP_08_CE_L_0
) },
7194 /* VEX_LEN_0FXOP_08_CF */
7196 { VEX_W_TABLE (VEX_W_0FXOP_08_CF_L_0
) },
7199 /* VEX_LEN_0FXOP_08_EC */
7201 { VEX_W_TABLE (VEX_W_0FXOP_08_EC_L_0
) },
7204 /* VEX_LEN_0FXOP_08_ED */
7206 { VEX_W_TABLE (VEX_W_0FXOP_08_ED_L_0
) },
7209 /* VEX_LEN_0FXOP_08_EE */
7211 { VEX_W_TABLE (VEX_W_0FXOP_08_EE_L_0
) },
7214 /* VEX_LEN_0FXOP_08_EF */
7216 { VEX_W_TABLE (VEX_W_0FXOP_08_EF_L_0
) },
7219 /* VEX_LEN_0FXOP_09_01 */
7221 { REG_TABLE (REG_XOP_09_01_L_0
) },
7224 /* VEX_LEN_0FXOP_09_02 */
7226 { REG_TABLE (REG_XOP_09_02_L_0
) },
7229 /* VEX_LEN_0FXOP_09_12_M_1 */
7231 { REG_TABLE (REG_XOP_09_12_M_1_L_0
) },
7234 /* VEX_LEN_0FXOP_09_82_W_0 */
7236 { "vfrczss", { XM
, EXd
}, 0 },
7239 /* VEX_LEN_0FXOP_09_83_W_0 */
7241 { "vfrczsd", { XM
, EXq
}, 0 },
7244 /* VEX_LEN_0FXOP_09_90 */
7246 { "vprotb", { XM
, EXx
, VexW
}, 0 },
7249 /* VEX_LEN_0FXOP_09_91 */
7251 { "vprotw", { XM
, EXx
, VexW
}, 0 },
7254 /* VEX_LEN_0FXOP_09_92 */
7256 { "vprotd", { XM
, EXx
, VexW
}, 0 },
7259 /* VEX_LEN_0FXOP_09_93 */
7261 { "vprotq", { XM
, EXx
, VexW
}, 0 },
7264 /* VEX_LEN_0FXOP_09_94 */
7266 { "vpshlb", { XM
, EXx
, VexW
}, 0 },
7269 /* VEX_LEN_0FXOP_09_95 */
7271 { "vpshlw", { XM
, EXx
, VexW
}, 0 },
7274 /* VEX_LEN_0FXOP_09_96 */
7276 { "vpshld", { XM
, EXx
, VexW
}, 0 },
7279 /* VEX_LEN_0FXOP_09_97 */
7281 { "vpshlq", { XM
, EXx
, VexW
}, 0 },
7284 /* VEX_LEN_0FXOP_09_98 */
7286 { "vpshab", { XM
, EXx
, VexW
}, 0 },
7289 /* VEX_LEN_0FXOP_09_99 */
7291 { "vpshaw", { XM
, EXx
, VexW
}, 0 },
7294 /* VEX_LEN_0FXOP_09_9A */
7296 { "vpshad", { XM
, EXx
, VexW
}, 0 },
7299 /* VEX_LEN_0FXOP_09_9B */
7301 { "vpshaq", { XM
, EXx
, VexW
}, 0 },
7304 /* VEX_LEN_0FXOP_09_C1 */
7306 { VEX_W_TABLE (VEX_W_0FXOP_09_C1_L_0
) },
7309 /* VEX_LEN_0FXOP_09_C2 */
7311 { VEX_W_TABLE (VEX_W_0FXOP_09_C2_L_0
) },
7314 /* VEX_LEN_0FXOP_09_C3 */
7316 { VEX_W_TABLE (VEX_W_0FXOP_09_C3_L_0
) },
7319 /* VEX_LEN_0FXOP_09_C6 */
7321 { VEX_W_TABLE (VEX_W_0FXOP_09_C6_L_0
) },
7324 /* VEX_LEN_0FXOP_09_C7 */
7326 { VEX_W_TABLE (VEX_W_0FXOP_09_C7_L_0
) },
7329 /* VEX_LEN_0FXOP_09_CB */
7331 { VEX_W_TABLE (VEX_W_0FXOP_09_CB_L_0
) },
7334 /* VEX_LEN_0FXOP_09_D1 */
7336 { VEX_W_TABLE (VEX_W_0FXOP_09_D1_L_0
) },
7339 /* VEX_LEN_0FXOP_09_D2 */
7341 { VEX_W_TABLE (VEX_W_0FXOP_09_D2_L_0
) },
7344 /* VEX_LEN_0FXOP_09_D3 */
7346 { VEX_W_TABLE (VEX_W_0FXOP_09_D3_L_0
) },
7349 /* VEX_LEN_0FXOP_09_D6 */
7351 { VEX_W_TABLE (VEX_W_0FXOP_09_D6_L_0
) },
7354 /* VEX_LEN_0FXOP_09_D7 */
7356 { VEX_W_TABLE (VEX_W_0FXOP_09_D7_L_0
) },
7359 /* VEX_LEN_0FXOP_09_DB */
7361 { VEX_W_TABLE (VEX_W_0FXOP_09_DB_L_0
) },
7364 /* VEX_LEN_0FXOP_09_E1 */
7366 { VEX_W_TABLE (VEX_W_0FXOP_09_E1_L_0
) },
7369 /* VEX_LEN_0FXOP_09_E2 */
7371 { VEX_W_TABLE (VEX_W_0FXOP_09_E2_L_0
) },
7374 /* VEX_LEN_0FXOP_09_E3 */
7376 { VEX_W_TABLE (VEX_W_0FXOP_09_E3_L_0
) },
7379 /* VEX_LEN_0FXOP_0A_12 */
7381 { REG_TABLE (REG_XOP_0A_12_L_0
) },
7385 #include "i386-dis-evex-len.h"
7387 static const struct dis386 vex_w_table
[][2] = {
7389 /* VEX_W_0F41_L_1_M_1 */
7390 { PREFIX_TABLE (PREFIX_VEX_0F41_L_1_M_1_W_0
) },
7391 { PREFIX_TABLE (PREFIX_VEX_0F41_L_1_M_1_W_1
) },
7394 /* VEX_W_0F42_L_1_M_1 */
7395 { PREFIX_TABLE (PREFIX_VEX_0F42_L_1_M_1_W_0
) },
7396 { PREFIX_TABLE (PREFIX_VEX_0F42_L_1_M_1_W_1
) },
7399 /* VEX_W_0F44_L_0_M_1 */
7400 { PREFIX_TABLE (PREFIX_VEX_0F44_L_0_M_1_W_0
) },
7401 { PREFIX_TABLE (PREFIX_VEX_0F44_L_0_M_1_W_1
) },
7404 /* VEX_W_0F45_L_1_M_1 */
7405 { PREFIX_TABLE (PREFIX_VEX_0F45_L_1_M_1_W_0
) },
7406 { PREFIX_TABLE (PREFIX_VEX_0F45_L_1_M_1_W_1
) },
7409 /* VEX_W_0F46_L_1_M_1 */
7410 { PREFIX_TABLE (PREFIX_VEX_0F46_L_1_M_1_W_0
) },
7411 { PREFIX_TABLE (PREFIX_VEX_0F46_L_1_M_1_W_1
) },
7414 /* VEX_W_0F47_L_1_M_1 */
7415 { PREFIX_TABLE (PREFIX_VEX_0F47_L_1_M_1_W_0
) },
7416 { PREFIX_TABLE (PREFIX_VEX_0F47_L_1_M_1_W_1
) },
7419 /* VEX_W_0F4A_L_1_M_1 */
7420 { PREFIX_TABLE (PREFIX_VEX_0F4A_L_1_M_1_W_0
) },
7421 { PREFIX_TABLE (PREFIX_VEX_0F4A_L_1_M_1_W_1
) },
7424 /* VEX_W_0F4B_L_1_M_1 */
7425 { PREFIX_TABLE (PREFIX_VEX_0F4B_L_1_M_1_W_0
) },
7426 { PREFIX_TABLE (PREFIX_VEX_0F4B_L_1_M_1_W_1
) },
7429 /* VEX_W_0F90_L_0 */
7430 { PREFIX_TABLE (PREFIX_VEX_0F90_L_0_W_0
) },
7431 { PREFIX_TABLE (PREFIX_VEX_0F90_L_0_W_1
) },
7434 /* VEX_W_0F91_L_0_M_0 */
7435 { PREFIX_TABLE (PREFIX_VEX_0F91_L_0_M_0_W_0
) },
7436 { PREFIX_TABLE (PREFIX_VEX_0F91_L_0_M_0_W_1
) },
7439 /* VEX_W_0F92_L_0_M_1 */
7440 { PREFIX_TABLE (PREFIX_VEX_0F92_L_0_M_1_W_0
) },
7441 { PREFIX_TABLE (PREFIX_VEX_0F92_L_0_M_1_W_1
) },
7444 /* VEX_W_0F93_L_0_M_1 */
7445 { PREFIX_TABLE (PREFIX_VEX_0F93_L_0_M_1_W_0
) },
7446 { PREFIX_TABLE (PREFIX_VEX_0F93_L_0_M_1_W_1
) },
7449 /* VEX_W_0F98_L_0_M_1 */
7450 { PREFIX_TABLE (PREFIX_VEX_0F98_L_0_M_1_W_0
) },
7451 { PREFIX_TABLE (PREFIX_VEX_0F98_L_0_M_1_W_1
) },
7454 /* VEX_W_0F99_L_0_M_1 */
7455 { PREFIX_TABLE (PREFIX_VEX_0F99_L_0_M_1_W_0
) },
7456 { PREFIX_TABLE (PREFIX_VEX_0F99_L_0_M_1_W_1
) },
7460 { "vpermilps", { XM
, Vex
, EXx
}, PREFIX_DATA
},
7464 { "vpermilpd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
7468 { "vtestps", { XM
, EXx
}, PREFIX_DATA
},
7472 { "vtestpd", { XM
, EXx
}, PREFIX_DATA
},
7476 { "vcvtph2ps", { XM
, EXxmmq
}, PREFIX_DATA
},
7479 /* VEX_W_0F3816_L_1 */
7480 { "vpermps", { XM
, Vex
, EXx
}, PREFIX_DATA
},
7484 { "vbroadcastss", { XM
, EXd
}, PREFIX_DATA
},
7487 /* VEX_W_0F3819_L_1 */
7488 { "vbroadcastsd", { XM
, EXq
}, PREFIX_DATA
},
7491 /* VEX_W_0F381A_M_0_L_1 */
7492 { "vbroadcastf128", { XM
, Mxmm
}, PREFIX_DATA
},
7495 /* VEX_W_0F382C_M_0 */
7496 { "vmaskmovps", { XM
, Vex
, Mx
}, PREFIX_DATA
},
7499 /* VEX_W_0F382D_M_0 */
7500 { "vmaskmovpd", { XM
, Vex
, Mx
}, PREFIX_DATA
},
7503 /* VEX_W_0F382E_M_0 */
7504 { "vmaskmovps", { Mx
, Vex
, XM
}, PREFIX_DATA
},
7507 /* VEX_W_0F382F_M_0 */
7508 { "vmaskmovpd", { Mx
, Vex
, XM
}, PREFIX_DATA
},
7512 { "vpermd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
7516 { "vpsravd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
7519 /* VEX_W_0F3849_X86_64_P_0 */
7520 { MOD_TABLE (MOD_VEX_0F3849_X86_64_P_0_W_0
) },
7523 /* VEX_W_0F3849_X86_64_P_2 */
7524 { MOD_TABLE (MOD_VEX_0F3849_X86_64_P_2_W_0
) },
7527 /* VEX_W_0F3849_X86_64_P_3 */
7528 { MOD_TABLE (MOD_VEX_0F3849_X86_64_P_3_W_0
) },
7531 /* VEX_W_0F384B_X86_64_P_1 */
7532 { MOD_TABLE (MOD_VEX_0F384B_X86_64_P_1_W_0
) },
7535 /* VEX_W_0F384B_X86_64_P_2 */
7536 { MOD_TABLE (MOD_VEX_0F384B_X86_64_P_2_W_0
) },
7539 /* VEX_W_0F384B_X86_64_P_3 */
7540 { MOD_TABLE (MOD_VEX_0F384B_X86_64_P_3_W_0
) },
7544 { "%XV vpdpbusd", { XM
, Vex
, EXx
}, 0 },
7548 { "%XV vpdpbusds", { XM
, Vex
, EXx
}, 0 },
7552 { "%XV vpdpwssd", { XM
, Vex
, EXx
}, 0 },
7556 { "%XV vpdpwssds", { XM
, Vex
, EXx
}, 0 },
7560 { "vpbroadcastd", { XM
, EXd
}, PREFIX_DATA
},
7564 { "vpbroadcastq", { XM
, EXq
}, PREFIX_DATA
},
7567 /* VEX_W_0F385A_M_0_L_0 */
7568 { "vbroadcasti128", { XM
, Mxmm
}, PREFIX_DATA
},
7571 /* VEX_W_0F385C_X86_64_P_1 */
7572 { MOD_TABLE (MOD_VEX_0F385C_X86_64_P_1_W_0
) },
7575 /* VEX_W_0F385E_X86_64_P_0 */
7576 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_0_W_0
) },
7579 /* VEX_W_0F385E_X86_64_P_1 */
7580 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_1_W_0
) },
7583 /* VEX_W_0F385E_X86_64_P_2 */
7584 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_2_W_0
) },
7587 /* VEX_W_0F385E_X86_64_P_3 */
7588 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_3_W_0
) },
7592 { "vpbroadcastb", { XM
, EXb
}, PREFIX_DATA
},
7596 { "vpbroadcastw", { XM
, EXw
}, PREFIX_DATA
},
7600 { "vgf2p8mulb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
7603 /* VEX_W_0F3A00_L_1 */
7605 { "vpermq", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7608 /* VEX_W_0F3A01_L_1 */
7610 { "vpermpd", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7614 { "vpblendd", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
7618 { "vpermilps", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7622 { "vpermilpd", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7625 /* VEX_W_0F3A06_L_1 */
7626 { "vperm2f128", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
7629 /* VEX_W_0F3A18_L_1 */
7630 { "vinsertf128", { XM
, Vex
, EXxmm
, Ib
}, PREFIX_DATA
},
7633 /* VEX_W_0F3A19_L_1 */
7634 { "vextractf128", { EXxmm
, XM
, Ib
}, PREFIX_DATA
},
7638 { "vcvtps2ph", { EXxmmq
, XM
, EXxEVexS
, Ib
}, PREFIX_DATA
},
7641 /* VEX_W_0F3A38_L_1 */
7642 { "vinserti128", { XM
, Vex
, EXxmm
, Ib
}, PREFIX_DATA
},
7645 /* VEX_W_0F3A39_L_1 */
7646 { "vextracti128", { EXxmm
, XM
, Ib
}, PREFIX_DATA
},
7649 /* VEX_W_0F3A46_L_1 */
7650 { "vperm2i128", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
7654 { "vblendvps", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
7658 { "vblendvpd", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
7662 { "vpblendvb", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
7667 { "vgf2p8affineqb", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
7672 { "vgf2p8affineinvqb", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
7674 /* VEX_W_0FXOP_08_85_L_0 */
7676 { "vpmacssww", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7678 /* VEX_W_0FXOP_08_86_L_0 */
7680 { "vpmacsswd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7682 /* VEX_W_0FXOP_08_87_L_0 */
7684 { "vpmacssdql", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7686 /* VEX_W_0FXOP_08_8E_L_0 */
7688 { "vpmacssdd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7690 /* VEX_W_0FXOP_08_8F_L_0 */
7692 { "vpmacssdqh", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7694 /* VEX_W_0FXOP_08_95_L_0 */
7696 { "vpmacsww", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7698 /* VEX_W_0FXOP_08_96_L_0 */
7700 { "vpmacswd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7702 /* VEX_W_0FXOP_08_97_L_0 */
7704 { "vpmacsdql", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7706 /* VEX_W_0FXOP_08_9E_L_0 */
7708 { "vpmacsdd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7710 /* VEX_W_0FXOP_08_9F_L_0 */
7712 { "vpmacsdqh", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7714 /* VEX_W_0FXOP_08_A6_L_0 */
7716 { "vpmadcsswd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7718 /* VEX_W_0FXOP_08_B6_L_0 */
7720 { "vpmadcswd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7722 /* VEX_W_0FXOP_08_C0_L_0 */
7724 { "vprotb", { XM
, EXx
, Ib
}, 0 },
7726 /* VEX_W_0FXOP_08_C1_L_0 */
7728 { "vprotw", { XM
, EXx
, Ib
}, 0 },
7730 /* VEX_W_0FXOP_08_C2_L_0 */
7732 { "vprotd", { XM
, EXx
, Ib
}, 0 },
7734 /* VEX_W_0FXOP_08_C3_L_0 */
7736 { "vprotq", { XM
, EXx
, Ib
}, 0 },
7738 /* VEX_W_0FXOP_08_CC_L_0 */
7740 { "vpcomb", { XM
, Vex
, EXx
, VPCOM
}, 0 },
7742 /* VEX_W_0FXOP_08_CD_L_0 */
7744 { "vpcomw", { XM
, Vex
, EXx
, VPCOM
}, 0 },
7746 /* VEX_W_0FXOP_08_CE_L_0 */
7748 { "vpcomd", { XM
, Vex
, EXx
, VPCOM
}, 0 },
7750 /* VEX_W_0FXOP_08_CF_L_0 */
7752 { "vpcomq", { XM
, Vex
, EXx
, VPCOM
}, 0 },
7754 /* VEX_W_0FXOP_08_EC_L_0 */
7756 { "vpcomub", { XM
, Vex
, EXx
, VPCOM
}, 0 },
7758 /* VEX_W_0FXOP_08_ED_L_0 */
7760 { "vpcomuw", { XM
, Vex
, EXx
, VPCOM
}, 0 },
7762 /* VEX_W_0FXOP_08_EE_L_0 */
7764 { "vpcomud", { XM
, Vex
, EXx
, VPCOM
}, 0 },
7766 /* VEX_W_0FXOP_08_EF_L_0 */
7768 { "vpcomuq", { XM
, Vex
, EXx
, VPCOM
}, 0 },
7770 /* VEX_W_0FXOP_09_80 */
7772 { "vfrczps", { XM
, EXx
}, 0 },
7774 /* VEX_W_0FXOP_09_81 */
7776 { "vfrczpd", { XM
, EXx
}, 0 },
7778 /* VEX_W_0FXOP_09_82 */
7780 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_82_W_0
) },
7782 /* VEX_W_0FXOP_09_83 */
7784 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_83_W_0
) },
7786 /* VEX_W_0FXOP_09_C1_L_0 */
7788 { "vphaddbw", { XM
, EXxmm
}, 0 },
7790 /* VEX_W_0FXOP_09_C2_L_0 */
7792 { "vphaddbd", { XM
, EXxmm
}, 0 },
7794 /* VEX_W_0FXOP_09_C3_L_0 */
7796 { "vphaddbq", { XM
, EXxmm
}, 0 },
7798 /* VEX_W_0FXOP_09_C6_L_0 */
7800 { "vphaddwd", { XM
, EXxmm
}, 0 },
7802 /* VEX_W_0FXOP_09_C7_L_0 */
7804 { "vphaddwq", { XM
, EXxmm
}, 0 },
7806 /* VEX_W_0FXOP_09_CB_L_0 */
7808 { "vphadddq", { XM
, EXxmm
}, 0 },
7810 /* VEX_W_0FXOP_09_D1_L_0 */
7812 { "vphaddubw", { XM
, EXxmm
}, 0 },
7814 /* VEX_W_0FXOP_09_D2_L_0 */
7816 { "vphaddubd", { XM
, EXxmm
}, 0 },
7818 /* VEX_W_0FXOP_09_D3_L_0 */
7820 { "vphaddubq", { XM
, EXxmm
}, 0 },
7822 /* VEX_W_0FXOP_09_D6_L_0 */
7824 { "vphadduwd", { XM
, EXxmm
}, 0 },
7826 /* VEX_W_0FXOP_09_D7_L_0 */
7828 { "vphadduwq", { XM
, EXxmm
}, 0 },
7830 /* VEX_W_0FXOP_09_DB_L_0 */
7832 { "vphaddudq", { XM
, EXxmm
}, 0 },
7834 /* VEX_W_0FXOP_09_E1_L_0 */
7836 { "vphsubbw", { XM
, EXxmm
}, 0 },
7838 /* VEX_W_0FXOP_09_E2_L_0 */
7840 { "vphsubwd", { XM
, EXxmm
}, 0 },
7842 /* VEX_W_0FXOP_09_E3_L_0 */
7844 { "vphsubdq", { XM
, EXxmm
}, 0 },
7847 #include "i386-dis-evex-w.h"
7850 static const struct dis386 mod_table
[][2] = {
7853 { "bound{S|}", { Gv
, Ma
}, 0 },
7854 { EVEX_TABLE (EVEX_0F
) },
7858 { "leaS", { Gv
, M
}, 0 },
7862 { "lesS", { Gv
, Mp
}, 0 },
7863 { VEX_C4_TABLE (VEX_0F
) },
7867 { "ldsS", { Gv
, Mp
}, 0 },
7868 { VEX_C5_TABLE (VEX_0F
) },
7873 { RM_TABLE (RM_C6_REG_7
) },
7878 { RM_TABLE (RM_C7_REG_7
) },
7882 { "{l|}call^", { indirEp
}, 0 },
7886 { "{l|}jmp^", { indirEp
}, 0 },
7889 /* MOD_0F01_REG_0 */
7890 { X86_64_TABLE (X86_64_0F01_REG_0
) },
7891 { RM_TABLE (RM_0F01_REG_0
) },
7894 /* MOD_0F01_REG_1 */
7895 { X86_64_TABLE (X86_64_0F01_REG_1
) },
7896 { RM_TABLE (RM_0F01_REG_1
) },
7899 /* MOD_0F01_REG_2 */
7900 { X86_64_TABLE (X86_64_0F01_REG_2
) },
7901 { RM_TABLE (RM_0F01_REG_2
) },
7904 /* MOD_0F01_REG_3 */
7905 { X86_64_TABLE (X86_64_0F01_REG_3
) },
7906 { RM_TABLE (RM_0F01_REG_3
) },
7909 /* MOD_0F01_REG_5 */
7910 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_0
) },
7911 { RM_TABLE (RM_0F01_REG_5_MOD_3
) },
7914 /* MOD_0F01_REG_7 */
7915 { "invlpg", { Mb
}, 0 },
7916 { RM_TABLE (RM_0F01_REG_7_MOD_3
) },
7919 /* MOD_0F12_PREFIX_0 */
7920 { "movlpX", { XM
, EXq
}, 0 },
7921 { "movhlps", { XM
, EXq
}, 0 },
7924 /* MOD_0F12_PREFIX_2 */
7925 { "movlpX", { XM
, EXq
}, 0 },
7929 { "movlpX", { EXq
, XM
}, PREFIX_OPCODE
},
7932 /* MOD_0F16_PREFIX_0 */
7933 { "movhpX", { XM
, EXq
}, 0 },
7934 { "movlhps", { XM
, EXq
}, 0 },
7937 /* MOD_0F16_PREFIX_2 */
7938 { "movhpX", { XM
, EXq
}, 0 },
7942 { "movhpX", { EXq
, XM
}, PREFIX_OPCODE
},
7945 /* MOD_0F18_REG_0 */
7946 { "prefetchnta", { Mb
}, 0 },
7947 { "nopQ", { Ev
}, 0 },
7950 /* MOD_0F18_REG_1 */
7951 { "prefetcht0", { Mb
}, 0 },
7952 { "nopQ", { Ev
}, 0 },
7955 /* MOD_0F18_REG_2 */
7956 { "prefetcht1", { Mb
}, 0 },
7957 { "nopQ", { Ev
}, 0 },
7960 /* MOD_0F18_REG_3 */
7961 { "prefetcht2", { Mb
}, 0 },
7962 { "nopQ", { Ev
}, 0 },
7965 /* MOD_0F1A_PREFIX_0 */
7966 { "bndldx", { Gbnd
, Mv_bnd
}, 0 },
7967 { "nopQ", { Ev
}, 0 },
7970 /* MOD_0F1B_PREFIX_0 */
7971 { "bndstx", { Mv_bnd
, Gbnd
}, 0 },
7972 { "nopQ", { Ev
}, 0 },
7975 /* MOD_0F1B_PREFIX_1 */
7976 { "bndmk", { Gbnd
, Mv_bnd
}, 0 },
7977 { "nopQ", { Ev
}, PREFIX_IGNORED
},
7980 /* MOD_0F1C_PREFIX_0 */
7981 { REG_TABLE (REG_0F1C_P_0_MOD_0
) },
7982 { "nopQ", { Ev
}, 0 },
7985 /* MOD_0F1E_PREFIX_1 */
7986 { "nopQ", { Ev
}, PREFIX_IGNORED
},
7987 { REG_TABLE (REG_0F1E_P_1_MOD_3
) },
7990 /* MOD_0F2B_PREFIX_0 */
7991 {"movntps", { Mx
, XM
}, PREFIX_OPCODE
},
7994 /* MOD_0F2B_PREFIX_1 */
7995 {"movntss", { Md
, XM
}, PREFIX_OPCODE
},
7998 /* MOD_0F2B_PREFIX_2 */
7999 {"movntpd", { Mx
, XM
}, PREFIX_OPCODE
},
8002 /* MOD_0F2B_PREFIX_3 */
8003 {"movntsd", { Mq
, XM
}, PREFIX_OPCODE
},
8008 { "movmskpX", { Gdq
, XS
}, PREFIX_OPCODE
},
8013 { REG_TABLE (REG_0F71_MOD_0
) },
8018 { REG_TABLE (REG_0F72_MOD_0
) },
8023 { REG_TABLE (REG_0F73_MOD_0
) },
8026 /* MOD_0FAE_REG_0 */
8027 { "fxsave", { FXSAVE
}, 0 },
8028 { PREFIX_TABLE (PREFIX_0FAE_REG_0_MOD_3
) },
8031 /* MOD_0FAE_REG_1 */
8032 { "fxrstor", { FXSAVE
}, 0 },
8033 { PREFIX_TABLE (PREFIX_0FAE_REG_1_MOD_3
) },
8036 /* MOD_0FAE_REG_2 */
8037 { "ldmxcsr", { Md
}, 0 },
8038 { PREFIX_TABLE (PREFIX_0FAE_REG_2_MOD_3
) },
8041 /* MOD_0FAE_REG_3 */
8042 { "stmxcsr", { Md
}, 0 },
8043 { PREFIX_TABLE (PREFIX_0FAE_REG_3_MOD_3
) },
8046 /* MOD_0FAE_REG_4 */
8047 { PREFIX_TABLE (PREFIX_0FAE_REG_4_MOD_0
) },
8048 { PREFIX_TABLE (PREFIX_0FAE_REG_4_MOD_3
) },
8051 /* MOD_0FAE_REG_5 */
8052 { "xrstor", { FXSAVE
}, PREFIX_OPCODE
},
8053 { PREFIX_TABLE (PREFIX_0FAE_REG_5_MOD_3
) },
8056 /* MOD_0FAE_REG_6 */
8057 { PREFIX_TABLE (PREFIX_0FAE_REG_6_MOD_0
) },
8058 { PREFIX_TABLE (PREFIX_0FAE_REG_6_MOD_3
) },
8061 /* MOD_0FAE_REG_7 */
8062 { PREFIX_TABLE (PREFIX_0FAE_REG_7_MOD_0
) },
8063 { RM_TABLE (RM_0FAE_REG_7_MOD_3
) },
8067 { "lssS", { Gv
, Mp
}, 0 },
8071 { "lfsS", { Gv
, Mp
}, 0 },
8075 { "lgsS", { Gv
, Mp
}, 0 },
8079 { "movntiS", { Edq
, Gdq
}, PREFIX_OPCODE
},
8082 /* MOD_0FC7_REG_3 */
8083 { "xrstors", { FXSAVE
}, 0 },
8086 /* MOD_0FC7_REG_4 */
8087 { "xsavec", { FXSAVE
}, 0 },
8090 /* MOD_0FC7_REG_5 */
8091 { "xsaves", { FXSAVE
}, 0 },
8094 /* MOD_0FC7_REG_6 */
8095 { PREFIX_TABLE (PREFIX_0FC7_REG_6_MOD_0
) },
8096 { PREFIX_TABLE (PREFIX_0FC7_REG_6_MOD_3
) }
8099 /* MOD_0FC7_REG_7 */
8100 { "vmptrst", { Mq
}, 0 },
8101 { PREFIX_TABLE (PREFIX_0FC7_REG_7_MOD_3
) }
8106 { "pmovmskb", { Gdq
, MS
}, 0 },
8109 /* MOD_0FE7_PREFIX_2 */
8110 { "movntdq", { Mx
, XM
}, 0 },
8113 /* MOD_0FF0_PREFIX_3 */
8114 { "lddqu", { XM
, M
}, 0 },
8118 { "movntdqa", { XM
, Mx
}, PREFIX_DATA
},
8121 /* MOD_0F38DC_PREFIX_1 */
8122 { "aesenc128kl", { XM
, M
}, 0 },
8123 { "loadiwkey", { XM
, EXx
}, 0 },
8126 /* MOD_0F38DD_PREFIX_1 */
8127 { "aesdec128kl", { XM
, M
}, 0 },
8130 /* MOD_0F38DE_PREFIX_1 */
8131 { "aesenc256kl", { XM
, M
}, 0 },
8134 /* MOD_0F38DF_PREFIX_1 */
8135 { "aesdec256kl", { XM
, M
}, 0 },
8139 { "wrussK", { M
, Gdq
}, PREFIX_DATA
},
8142 /* MOD_0F38F6_PREFIX_0 */
8143 { "wrssK", { M
, Gdq
}, PREFIX_OPCODE
},
8146 /* MOD_0F38F8_PREFIX_1 */
8147 { "enqcmds", { Gva
, M
}, PREFIX_OPCODE
},
8150 /* MOD_0F38F8_PREFIX_2 */
8151 { "movdir64b", { Gva
, M
}, PREFIX_OPCODE
},
8154 /* MOD_0F38F8_PREFIX_3 */
8155 { "enqcmd", { Gva
, M
}, PREFIX_OPCODE
},
8159 { "movdiri", { Edq
, Gdq
}, PREFIX_OPCODE
},
8162 /* MOD_0F38FA_PREFIX_1 */
8164 { "encodekey128", { Gd
, Ed
}, 0 },
8167 /* MOD_0F38FB_PREFIX_1 */
8169 { "encodekey256", { Gd
, Ed
}, 0 },
8172 /* MOD_0F3A0F_PREFIX_1 */
8174 { REG_TABLE (REG_0F3A0F_PREFIX_1_MOD_3
) },
8177 /* MOD_VEX_0F12_PREFIX_0 */
8178 { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_0
) },
8179 { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_1
) },
8182 /* MOD_VEX_0F12_PREFIX_2 */
8183 { VEX_LEN_TABLE (VEX_LEN_0F12_P_2_M_0
) },
8187 { VEX_LEN_TABLE (VEX_LEN_0F13_M_0
) },
8190 /* MOD_VEX_0F16_PREFIX_0 */
8191 { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_0
) },
8192 { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_1
) },
8195 /* MOD_VEX_0F16_PREFIX_2 */
8196 { VEX_LEN_TABLE (VEX_LEN_0F16_P_2_M_0
) },
8200 { VEX_LEN_TABLE (VEX_LEN_0F17_M_0
) },
8204 { "vmovntpX", { Mx
, XM
}, PREFIX_OPCODE
},
8207 /* MOD_VEX_0F41_L_1 */
8209 { VEX_W_TABLE (VEX_W_0F41_L_1_M_1
) },
8212 /* MOD_VEX_0F42_L_1 */
8214 { VEX_W_TABLE (VEX_W_0F42_L_1_M_1
) },
8217 /* MOD_VEX_0F44_L_0 */
8219 { VEX_W_TABLE (VEX_W_0F44_L_0_M_1
) },
8222 /* MOD_VEX_0F45_L_1 */
8224 { VEX_W_TABLE (VEX_W_0F45_L_1_M_1
) },
8227 /* MOD_VEX_0F46_L_1 */
8229 { VEX_W_TABLE (VEX_W_0F46_L_1_M_1
) },
8232 /* MOD_VEX_0F47_L_1 */
8234 { VEX_W_TABLE (VEX_W_0F47_L_1_M_1
) },
8237 /* MOD_VEX_0F4A_L_1 */
8239 { VEX_W_TABLE (VEX_W_0F4A_L_1_M_1
) },
8242 /* MOD_VEX_0F4B_L_1 */
8244 { VEX_W_TABLE (VEX_W_0F4B_L_1_M_1
) },
8249 { "vmovmskpX", { Gdq
, XS
}, PREFIX_OPCODE
},
8254 { REG_TABLE (REG_VEX_0F71_M_0
) },
8259 { REG_TABLE (REG_VEX_0F72_M_0
) },
8264 { REG_TABLE (REG_VEX_0F73_M_0
) },
8267 /* MOD_VEX_0F91_L_0 */
8268 { VEX_W_TABLE (VEX_W_0F91_L_0_M_0
) },
8271 /* MOD_VEX_0F92_L_0 */
8273 { VEX_W_TABLE (VEX_W_0F92_L_0_M_1
) },
8276 /* MOD_VEX_0F93_L_0 */
8278 { VEX_W_TABLE (VEX_W_0F93_L_0_M_1
) },
8281 /* MOD_VEX_0F98_L_0 */
8283 { VEX_W_TABLE (VEX_W_0F98_L_0_M_1
) },
8286 /* MOD_VEX_0F99_L_0 */
8288 { VEX_W_TABLE (VEX_W_0F99_L_0_M_1
) },
8291 /* MOD_VEX_0FAE_REG_2 */
8292 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_2_M_0
) },
8295 /* MOD_VEX_0FAE_REG_3 */
8296 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_3_M_0
) },
8301 { "vpmovmskb", { Gdq
, XS
}, PREFIX_DATA
},
8305 { "vmovntdq", { Mx
, XM
}, PREFIX_DATA
},
8308 /* MOD_VEX_0FF0_PREFIX_3 */
8309 { "vlddqu", { XM
, M
}, 0 },
8312 /* MOD_VEX_0F381A */
8313 { VEX_LEN_TABLE (VEX_LEN_0F381A_M_0
) },
8316 /* MOD_VEX_0F382A */
8317 { "vmovntdqa", { XM
, Mx
}, PREFIX_DATA
},
8320 /* MOD_VEX_0F382C */
8321 { VEX_W_TABLE (VEX_W_0F382C_M_0
) },
8324 /* MOD_VEX_0F382D */
8325 { VEX_W_TABLE (VEX_W_0F382D_M_0
) },
8328 /* MOD_VEX_0F382E */
8329 { VEX_W_TABLE (VEX_W_0F382E_M_0
) },
8332 /* MOD_VEX_0F382F */
8333 { VEX_W_TABLE (VEX_W_0F382F_M_0
) },
8336 /* MOD_VEX_0F3849_X86_64_P_0_W_0 */
8337 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_0_W_0_M_0
) },
8338 { REG_TABLE (REG_VEX_0F3849_X86_64_P_0_W_0_M_1
) },
8341 /* MOD_VEX_0F3849_X86_64_P_2_W_0 */
8342 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_2_W_0_M_0
) },
8345 /* MOD_VEX_0F3849_X86_64_P_3_W_0 */
8347 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_3_W_0_M_0
) },
8350 /* MOD_VEX_0F384B_X86_64_P_1_W_0 */
8351 { VEX_LEN_TABLE (VEX_LEN_0F384B_X86_64_P_1_W_0_M_0
) },
8354 /* MOD_VEX_0F384B_X86_64_P_2_W_0 */
8355 { VEX_LEN_TABLE (VEX_LEN_0F384B_X86_64_P_2_W_0_M_0
) },
8358 /* MOD_VEX_0F384B_X86_64_P_3_W_0 */
8359 { VEX_LEN_TABLE (VEX_LEN_0F384B_X86_64_P_3_W_0_M_0
) },
8362 /* MOD_VEX_0F385A */
8363 { VEX_LEN_TABLE (VEX_LEN_0F385A_M_0
) },
8366 /* MOD_VEX_0F385C_X86_64_P_1_W_0 */
8368 { VEX_LEN_TABLE (VEX_LEN_0F385C_X86_64_P_1_W_0_M_0
) },
8371 /* MOD_VEX_0F385E_X86_64_P_0_W_0 */
8373 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_0_W_0_M_0
) },
8376 /* MOD_VEX_0F385E_X86_64_P_1_W_0 */
8378 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_1_W_0_M_0
) },
8381 /* MOD_VEX_0F385E_X86_64_P_2_W_0 */
8383 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_2_W_0_M_0
) },
8386 /* MOD_VEX_0F385E_X86_64_P_3_W_0 */
8388 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_3_W_0_M_0
) },
8391 /* MOD_VEX_0F388C */
8392 { "vpmaskmov%DQ", { XM
, Vex
, Mx
}, PREFIX_DATA
},
8395 /* MOD_VEX_0F388E */
8396 { "vpmaskmov%DQ", { Mx
, Vex
, XM
}, PREFIX_DATA
},
8399 /* MOD_VEX_0F3A30_L_0 */
8401 { "kshiftr%BW", { MaskG
, MaskE
, Ib
}, PREFIX_DATA
},
8404 /* MOD_VEX_0F3A31_L_0 */
8406 { "kshiftr%DQ", { MaskG
, MaskE
, Ib
}, PREFIX_DATA
},
8409 /* MOD_VEX_0F3A32_L_0 */
8411 { "kshiftl%BW", { MaskG
, MaskE
, Ib
}, PREFIX_DATA
},
8414 /* MOD_VEX_0F3A33_L_0 */
8416 { "kshiftl%DQ", { MaskG
, MaskE
, Ib
}, PREFIX_DATA
},
8421 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_12_M_1
) },
8424 #include "i386-dis-evex-mod.h"
8427 static const struct dis386 rm_table
[][8] = {
8430 { "xabort", { Skip_MODRM
, Ib
}, 0 },
8434 { "xbeginT", { Skip_MODRM
, Jdqw
}, 0 },
8438 { "enclv", { Skip_MODRM
}, 0 },
8439 { "vmcall", { Skip_MODRM
}, 0 },
8440 { "vmlaunch", { Skip_MODRM
}, 0 },
8441 { "vmresume", { Skip_MODRM
}, 0 },
8442 { "vmxoff", { Skip_MODRM
}, 0 },
8443 { "pconfig", { Skip_MODRM
}, 0 },
8447 { "monitor", { { OP_Monitor
, 0 } }, 0 },
8448 { "mwait", { { OP_Mwait
, 0 } }, 0 },
8449 { "clac", { Skip_MODRM
}, 0 },
8450 { "stac", { Skip_MODRM
}, 0 },
8451 { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_4
) },
8452 { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_5
) },
8453 { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_6
) },
8454 { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_7
) },
8458 { "xgetbv", { Skip_MODRM
}, 0 },
8459 { "xsetbv", { Skip_MODRM
}, 0 },
8462 { "vmfunc", { Skip_MODRM
}, 0 },
8463 { "xend", { Skip_MODRM
}, 0 },
8464 { "xtest", { Skip_MODRM
}, 0 },
8465 { "enclu", { Skip_MODRM
}, 0 },
8469 { "vmrun", { Skip_MODRM
}, 0 },
8470 { PREFIX_TABLE (PREFIX_0F01_REG_3_RM_1
) },
8471 { "vmload", { Skip_MODRM
}, 0 },
8472 { "vmsave", { Skip_MODRM
}, 0 },
8473 { "stgi", { Skip_MODRM
}, 0 },
8474 { "clgi", { Skip_MODRM
}, 0 },
8475 { "skinit", { Skip_MODRM
}, 0 },
8476 { "invlpga", { Skip_MODRM
}, 0 },
8479 /* RM_0F01_REG_5_MOD_3 */
8480 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_0
) },
8481 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_1
) },
8482 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_2
) },
8484 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_4
) },
8485 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_5
) },
8486 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_6
) },
8487 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_7
) },
8490 /* RM_0F01_REG_7_MOD_3 */
8491 { "swapgs", { Skip_MODRM
}, 0 },
8492 { "rdtscp", { Skip_MODRM
}, 0 },
8493 { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_2
) },
8494 { "mwaitx", { { OP_Mwait
, eBX_reg
} }, PREFIX_OPCODE
},
8495 { "clzero", { Skip_MODRM
}, 0 },
8496 { "rdpru", { Skip_MODRM
}, 0 },
8497 { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_6
) },
8498 { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_7
) },
8501 /* RM_0F1E_P_1_MOD_3_REG_7 */
8502 { "nopQ", { Ev
}, PREFIX_IGNORED
},
8503 { "nopQ", { Ev
}, PREFIX_IGNORED
},
8504 { "endbr64", { Skip_MODRM
}, 0 },
8505 { "endbr32", { Skip_MODRM
}, 0 },
8506 { "nopQ", { Ev
}, PREFIX_IGNORED
},
8507 { "nopQ", { Ev
}, PREFIX_IGNORED
},
8508 { "nopQ", { Ev
}, PREFIX_IGNORED
},
8509 { "nopQ", { Ev
}, PREFIX_IGNORED
},
8512 /* RM_0FAE_REG_6_MOD_3 */
8513 { "mfence", { Skip_MODRM
}, 0 },
8516 /* RM_0FAE_REG_7_MOD_3 */
8517 { "sfence", { Skip_MODRM
}, 0 },
8520 /* RM_0F3A0F_P_1_MOD_3_REG_0 */
8521 { "hreset", { Skip_MODRM
, Ib
}, 0 },
8524 /* RM_VEX_0F3849_X86_64_P_0_W_0_M_1_R_0 */
8525 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_0_W_0_M_1_REG_0_RM_0
) },
8529 #define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
8531 /* We use the high bit to indicate different name for the same
8533 #define REP_PREFIX (0xf3 | 0x100)
8534 #define XACQUIRE_PREFIX (0xf2 | 0x200)
8535 #define XRELEASE_PREFIX (0xf3 | 0x400)
8536 #define BND_PREFIX (0xf2 | 0x400)
8537 #define NOTRACK_PREFIX (0x3e | 0x100)
8540 ckprefix (instr_info
*ins
)
8542 int newrex
, i
, length
;
8545 ins
->used_prefixes
= 0;
8548 ins
->last_lock_prefix
= -1;
8549 ins
->last_repz_prefix
= -1;
8550 ins
->last_repnz_prefix
= -1;
8551 ins
->last_data_prefix
= -1;
8552 ins
->last_addr_prefix
= -1;
8553 ins
->last_rex_prefix
= -1;
8554 ins
->last_seg_prefix
= -1;
8555 ins
->fwait_prefix
= -1;
8556 ins
->active_seg_prefix
= 0;
8557 for (i
= 0; i
< (int) ARRAY_SIZE (ins
->all_prefixes
); i
++)
8558 ins
->all_prefixes
[i
] = 0;
8561 /* The maximum instruction length is 15bytes. */
8562 while (length
< MAX_CODE_LENGTH
- 1)
8564 FETCH_DATA (ins
->info
, ins
->codep
+ 1);
8566 switch (*ins
->codep
)
8568 /* REX prefixes family. */
8585 if (ins
->address_mode
== mode_64bit
)
8586 newrex
= *ins
->codep
;
8589 ins
->last_rex_prefix
= i
;
8592 ins
->prefixes
|= PREFIX_REPZ
;
8593 ins
->last_repz_prefix
= i
;
8596 ins
->prefixes
|= PREFIX_REPNZ
;
8597 ins
->last_repnz_prefix
= i
;
8600 ins
->prefixes
|= PREFIX_LOCK
;
8601 ins
->last_lock_prefix
= i
;
8604 ins
->prefixes
|= PREFIX_CS
;
8605 ins
->last_seg_prefix
= i
;
8606 if (ins
->address_mode
!= mode_64bit
)
8607 ins
->active_seg_prefix
= PREFIX_CS
;
8610 ins
->prefixes
|= PREFIX_SS
;
8611 ins
->last_seg_prefix
= i
;
8612 if (ins
->address_mode
!= mode_64bit
)
8613 ins
->active_seg_prefix
= PREFIX_SS
;
8616 ins
->prefixes
|= PREFIX_DS
;
8617 ins
->last_seg_prefix
= i
;
8618 if (ins
->address_mode
!= mode_64bit
)
8619 ins
->active_seg_prefix
= PREFIX_DS
;
8622 ins
->prefixes
|= PREFIX_ES
;
8623 ins
->last_seg_prefix
= i
;
8624 if (ins
->address_mode
!= mode_64bit
)
8625 ins
->active_seg_prefix
= PREFIX_ES
;
8628 ins
->prefixes
|= PREFIX_FS
;
8629 ins
->last_seg_prefix
= i
;
8630 ins
->active_seg_prefix
= PREFIX_FS
;
8633 ins
->prefixes
|= PREFIX_GS
;
8634 ins
->last_seg_prefix
= i
;
8635 ins
->active_seg_prefix
= PREFIX_GS
;
8638 ins
->prefixes
|= PREFIX_DATA
;
8639 ins
->last_data_prefix
= i
;
8642 ins
->prefixes
|= PREFIX_ADDR
;
8643 ins
->last_addr_prefix
= i
;
8646 /* fwait is really an instruction. If there are prefixes
8647 before the fwait, they belong to the fwait, *not* to the
8648 following instruction. */
8649 ins
->fwait_prefix
= i
;
8650 if (ins
->prefixes
|| ins
->rex
)
8652 ins
->prefixes
|= PREFIX_FWAIT
;
8654 /* This ensures that the previous REX prefixes are noticed
8655 as unused prefixes, as in the return case below. */
8656 ins
->rex_used
= ins
->rex
;
8659 ins
->prefixes
= PREFIX_FWAIT
;
8664 /* Rex is ignored when followed by another prefix. */
8667 ins
->rex_used
= ins
->rex
;
8670 if (*ins
->codep
!= FWAIT_OPCODE
)
8671 ins
->all_prefixes
[i
++] = *ins
->codep
;
8679 /* Return the name of the prefix byte PREF, or NULL if PREF is not a
8683 prefix_name (instr_info
*ins
, int pref
, int sizeflag
)
8685 static const char *rexes
[16] =
8690 "rex.XB", /* 0x43 */
8692 "rex.RB", /* 0x45 */
8693 "rex.RX", /* 0x46 */
8694 "rex.RXB", /* 0x47 */
8696 "rex.WB", /* 0x49 */
8697 "rex.WX", /* 0x4a */
8698 "rex.WXB", /* 0x4b */
8699 "rex.WR", /* 0x4c */
8700 "rex.WRB", /* 0x4d */
8701 "rex.WRX", /* 0x4e */
8702 "rex.WRXB", /* 0x4f */
8707 /* REX prefixes family. */
8724 return rexes
[pref
- 0x40];
8744 return (sizeflag
& DFLAG
) ? "data16" : "data32";
8746 if (ins
->address_mode
== mode_64bit
)
8747 return (sizeflag
& AFLAG
) ? "addr32" : "addr64";
8749 return (sizeflag
& AFLAG
) ? "addr16" : "addr32";
8754 case XACQUIRE_PREFIX
:
8756 case XRELEASE_PREFIX
:
8760 case NOTRACK_PREFIX
:
8767 /* Here for backwards compatibility. When gdb stops using
8768 print_insn_i386_att and print_insn_i386_intel these functions can
8769 disappear, and print_insn_i386 be merged into print_insn. */
8771 print_insn_i386_att (bfd_vma pc
, disassemble_info
*info
)
8775 ins
.intel_syntax
= 0;
8777 return print_insn (pc
, &ins
);
8781 print_insn_i386_intel (bfd_vma pc
, disassemble_info
*info
)
8785 ins
.intel_syntax
= 1;
8787 return print_insn (pc
, &ins
);
8791 print_insn_i386 (bfd_vma pc
, disassemble_info
*info
)
8795 ins
.intel_syntax
= -1;
8797 return print_insn (pc
, &ins
);
8801 print_i386_disassembler_options (FILE *stream
)
8803 fprintf (stream
, _("\n\
8804 The following i386/x86-64 specific disassembler options are supported for use\n\
8805 with the -M switch (multiple options should be separated by commas):\n"));
8807 fprintf (stream
, _(" x86-64 Disassemble in 64bit mode\n"));
8808 fprintf (stream
, _(" i386 Disassemble in 32bit mode\n"));
8809 fprintf (stream
, _(" i8086 Disassemble in 16bit mode\n"));
8810 fprintf (stream
, _(" att Display instruction in AT&T syntax\n"));
8811 fprintf (stream
, _(" intel Display instruction in Intel syntax\n"));
8812 fprintf (stream
, _(" att-mnemonic\n"
8813 " Display instruction in AT&T mnemonic\n"));
8814 fprintf (stream
, _(" intel-mnemonic\n"
8815 " Display instruction in Intel mnemonic\n"));
8816 fprintf (stream
, _(" addr64 Assume 64bit address size\n"));
8817 fprintf (stream
, _(" addr32 Assume 32bit address size\n"));
8818 fprintf (stream
, _(" addr16 Assume 16bit address size\n"));
8819 fprintf (stream
, _(" data32 Assume 32bit data size\n"));
8820 fprintf (stream
, _(" data16 Assume 16bit data size\n"));
8821 fprintf (stream
, _(" suffix Always display instruction suffix in AT&T syntax\n"));
8822 fprintf (stream
, _(" amd64 Display instruction in AMD64 ISA\n"));
8823 fprintf (stream
, _(" intel64 Display instruction in Intel64 ISA\n"));
8827 static const struct dis386 bad_opcode
= { "(bad)", { XX
}, 0 };
8829 /* Get a pointer to struct dis386 with a valid name. */
8831 static const struct dis386
*
8832 get_valid_dis386 (const struct dis386
*dp
, instr_info
*ins
)
8834 int vindex
, vex_table_index
;
8836 if (dp
->name
!= NULL
)
8839 switch (dp
->op
[0].bytemode
)
8842 dp
= ®_table
[dp
->op
[1].bytemode
][ins
->modrm
.reg
];
8846 vindex
= ins
->modrm
.mod
== 0x3 ? 1 : 0;
8847 dp
= &mod_table
[dp
->op
[1].bytemode
][vindex
];
8851 dp
= &rm_table
[dp
->op
[1].bytemode
][ins
->modrm
.rm
];
8854 case USE_PREFIX_TABLE
:
8857 /* The prefix in VEX is implicit. */
8858 switch (ins
->vex
.prefix
)
8863 case REPE_PREFIX_OPCODE
:
8866 case DATA_PREFIX_OPCODE
:
8869 case REPNE_PREFIX_OPCODE
:
8879 int last_prefix
= -1;
8882 /* We check PREFIX_REPNZ and PREFIX_REPZ before PREFIX_DATA.
8883 When there are multiple PREFIX_REPNZ and PREFIX_REPZ, the
8885 if ((ins
->prefixes
& (PREFIX_REPZ
| PREFIX_REPNZ
)) != 0)
8887 if (ins
->last_repz_prefix
> ins
->last_repnz_prefix
)
8890 prefix
= PREFIX_REPZ
;
8891 last_prefix
= ins
->last_repz_prefix
;
8896 prefix
= PREFIX_REPNZ
;
8897 last_prefix
= ins
->last_repnz_prefix
;
8900 /* Check if prefix should be ignored. */
8901 if ((((prefix_table
[dp
->op
[1].bytemode
][vindex
].prefix_requirement
8902 & PREFIX_IGNORED
) >> PREFIX_IGNORED_SHIFT
)
8904 && !prefix_table
[dp
->op
[1].bytemode
][vindex
].name
)
8908 if (vindex
== 0 && (ins
->prefixes
& PREFIX_DATA
) != 0)
8911 prefix
= PREFIX_DATA
;
8912 last_prefix
= ins
->last_data_prefix
;
8917 ins
->used_prefixes
|= prefix
;
8918 ins
->all_prefixes
[last_prefix
] = 0;
8921 dp
= &prefix_table
[dp
->op
[1].bytemode
][vindex
];
8924 case USE_X86_64_TABLE
:
8925 vindex
= ins
->address_mode
== mode_64bit
? 1 : 0;
8926 dp
= &x86_64_table
[dp
->op
[1].bytemode
][vindex
];
8929 case USE_3BYTE_TABLE
:
8930 FETCH_DATA (ins
->info
, ins
->codep
+ 2);
8931 vindex
= *ins
->codep
++;
8932 dp
= &three_byte_table
[dp
->op
[1].bytemode
][vindex
];
8933 ins
->end_codep
= ins
->codep
;
8934 ins
->modrm
.mod
= (*ins
->codep
>> 6) & 3;
8935 ins
->modrm
.reg
= (*ins
->codep
>> 3) & 7;
8936 ins
->modrm
.rm
= *ins
->codep
& 7;
8939 case USE_VEX_LEN_TABLE
:
8943 switch (ins
->vex
.length
)
8949 /* This allows re-using in particular table entries where only
8950 128-bit operand size (VEX.L=0 / EVEX.L'L=0) are valid. */
8963 dp
= &vex_len_table
[dp
->op
[1].bytemode
][vindex
];
8966 case USE_EVEX_LEN_TABLE
:
8970 switch (ins
->vex
.length
)
8986 dp
= &evex_len_table
[dp
->op
[1].bytemode
][vindex
];
8989 case USE_XOP_8F_TABLE
:
8990 FETCH_DATA (ins
->info
, ins
->codep
+ 3);
8991 ins
->rex
= ~(*ins
->codep
>> 5) & 0x7;
8993 /* VEX_TABLE_INDEX is the mmmmm part of the XOP byte 1 "RCB.mmmmm". */
8994 switch ((*ins
->codep
& 0x1f))
9000 vex_table_index
= XOP_08
;
9003 vex_table_index
= XOP_09
;
9006 vex_table_index
= XOP_0A
;
9010 ins
->vex
.w
= *ins
->codep
& 0x80;
9011 if (ins
->vex
.w
&& ins
->address_mode
== mode_64bit
)
9014 ins
->vex
.register_specifier
= (~(*ins
->codep
>> 3)) & 0xf;
9015 if (ins
->address_mode
!= mode_64bit
)
9017 /* In 16/32-bit mode REX_B is silently ignored. */
9021 ins
->vex
.length
= (*ins
->codep
& 0x4) ? 256 : 128;
9022 switch ((*ins
->codep
& 0x3))
9027 ins
->vex
.prefix
= DATA_PREFIX_OPCODE
;
9030 ins
->vex
.prefix
= REPE_PREFIX_OPCODE
;
9033 ins
->vex
.prefix
= REPNE_PREFIX_OPCODE
;
9036 ins
->need_vex
= true;
9038 vindex
= *ins
->codep
++;
9039 dp
= &xop_table
[vex_table_index
][vindex
];
9041 ins
->end_codep
= ins
->codep
;
9042 FETCH_DATA (ins
->info
, ins
->codep
+ 1);
9043 ins
->modrm
.mod
= (*ins
->codep
>> 6) & 3;
9044 ins
->modrm
.reg
= (*ins
->codep
>> 3) & 7;
9045 ins
->modrm
.rm
= *ins
->codep
& 7;
9047 /* No XOP encoding so far allows for a non-zero embedded prefix. Avoid
9048 having to decode the bits for every otherwise valid encoding. */
9049 if (ins
->vex
.prefix
)
9053 case USE_VEX_C4_TABLE
:
9055 FETCH_DATA (ins
->info
, ins
->codep
+ 3);
9056 ins
->rex
= ~(*ins
->codep
>> 5) & 0x7;
9057 switch ((*ins
->codep
& 0x1f))
9063 vex_table_index
= VEX_0F
;
9066 vex_table_index
= VEX_0F38
;
9069 vex_table_index
= VEX_0F3A
;
9073 ins
->vex
.w
= *ins
->codep
& 0x80;
9074 if (ins
->address_mode
== mode_64bit
)
9081 /* For the 3-byte VEX prefix in 32-bit mode, the REX_B bit
9082 is ignored, other REX bits are 0 and the highest bit in
9083 VEX.vvvv is also ignored (but we mustn't clear it here). */
9086 ins
->vex
.register_specifier
= (~(*ins
->codep
>> 3)) & 0xf;
9087 ins
->vex
.length
= (*ins
->codep
& 0x4) ? 256 : 128;
9088 switch ((*ins
->codep
& 0x3))
9093 ins
->vex
.prefix
= DATA_PREFIX_OPCODE
;
9096 ins
->vex
.prefix
= REPE_PREFIX_OPCODE
;
9099 ins
->vex
.prefix
= REPNE_PREFIX_OPCODE
;
9102 ins
->need_vex
= true;
9104 vindex
= *ins
->codep
++;
9105 dp
= &vex_table
[vex_table_index
][vindex
];
9106 ins
->end_codep
= ins
->codep
;
9107 /* There is no MODRM byte for VEX0F 77. */
9108 if (vex_table_index
!= VEX_0F
|| vindex
!= 0x77)
9110 FETCH_DATA (ins
->info
, ins
->codep
+ 1);
9111 ins
->modrm
.mod
= (*ins
->codep
>> 6) & 3;
9112 ins
->modrm
.reg
= (*ins
->codep
>> 3) & 7;
9113 ins
->modrm
.rm
= *ins
->codep
& 7;
9117 case USE_VEX_C5_TABLE
:
9119 FETCH_DATA (ins
->info
, ins
->codep
+ 2);
9120 ins
->rex
= (*ins
->codep
& 0x80) ? 0 : REX_R
;
9122 /* For the 2-byte VEX prefix in 32-bit mode, the highest bit in
9124 ins
->vex
.register_specifier
= (~(*ins
->codep
>> 3)) & 0xf;
9125 ins
->vex
.length
= (*ins
->codep
& 0x4) ? 256 : 128;
9126 switch ((*ins
->codep
& 0x3))
9131 ins
->vex
.prefix
= DATA_PREFIX_OPCODE
;
9134 ins
->vex
.prefix
= REPE_PREFIX_OPCODE
;
9137 ins
->vex
.prefix
= REPNE_PREFIX_OPCODE
;
9140 ins
->need_vex
= true;
9142 vindex
= *ins
->codep
++;
9143 dp
= &vex_table
[dp
->op
[1].bytemode
][vindex
];
9144 ins
->end_codep
= ins
->codep
;
9145 /* There is no MODRM byte for VEX 77. */
9148 FETCH_DATA (ins
->info
, ins
->codep
+ 1);
9149 ins
->modrm
.mod
= (*ins
->codep
>> 6) & 3;
9150 ins
->modrm
.reg
= (*ins
->codep
>> 3) & 7;
9151 ins
->modrm
.rm
= *ins
->codep
& 7;
9155 case USE_VEX_W_TABLE
:
9159 dp
= &vex_w_table
[dp
->op
[1].bytemode
][ins
->vex
.w
];
9162 case USE_EVEX_TABLE
:
9163 ins
->two_source_ops
= false;
9165 ins
->vex
.evex
= true;
9166 FETCH_DATA (ins
->info
, ins
->codep
+ 4);
9167 /* The first byte after 0x62. */
9168 ins
->rex
= ~(*ins
->codep
>> 5) & 0x7;
9169 ins
->vex
.r
= *ins
->codep
& 0x10;
9170 switch ((*ins
->codep
& 0xf))
9175 vex_table_index
= EVEX_0F
;
9178 vex_table_index
= EVEX_0F38
;
9181 vex_table_index
= EVEX_0F3A
;
9184 vex_table_index
= EVEX_MAP5
;
9187 vex_table_index
= EVEX_MAP6
;
9191 /* The second byte after 0x62. */
9193 ins
->vex
.w
= *ins
->codep
& 0x80;
9194 if (ins
->vex
.w
&& ins
->address_mode
== mode_64bit
)
9197 ins
->vex
.register_specifier
= (~(*ins
->codep
>> 3)) & 0xf;
9200 if (!(*ins
->codep
& 0x4))
9203 switch ((*ins
->codep
& 0x3))
9208 ins
->vex
.prefix
= DATA_PREFIX_OPCODE
;
9211 ins
->vex
.prefix
= REPE_PREFIX_OPCODE
;
9214 ins
->vex
.prefix
= REPNE_PREFIX_OPCODE
;
9218 /* The third byte after 0x62. */
9221 /* Remember the static rounding bits. */
9222 ins
->vex
.ll
= (*ins
->codep
>> 5) & 3;
9223 ins
->vex
.b
= *ins
->codep
& 0x10;
9225 ins
->vex
.v
= *ins
->codep
& 0x8;
9226 ins
->vex
.mask_register_specifier
= *ins
->codep
& 0x7;
9227 ins
->vex
.zeroing
= *ins
->codep
& 0x80;
9229 if (ins
->address_mode
!= mode_64bit
)
9231 /* In 16/32-bit mode silently ignore following bits. */
9236 ins
->need_vex
= true;
9238 vindex
= *ins
->codep
++;
9239 dp
= &evex_table
[vex_table_index
][vindex
];
9240 ins
->end_codep
= ins
->codep
;
9241 FETCH_DATA (ins
->info
, ins
->codep
+ 1);
9242 ins
->modrm
.mod
= (*ins
->codep
>> 6) & 3;
9243 ins
->modrm
.reg
= (*ins
->codep
>> 3) & 7;
9244 ins
->modrm
.rm
= *ins
->codep
& 7;
9246 /* Set vector length. */
9247 if (ins
->modrm
.mod
== 3 && ins
->vex
.b
)
9248 ins
->vex
.length
= 512;
9251 switch (ins
->vex
.ll
)
9254 ins
->vex
.length
= 128;
9257 ins
->vex
.length
= 256;
9260 ins
->vex
.length
= 512;
9276 if (dp
->name
!= NULL
)
9279 return get_valid_dis386 (dp
, ins
);
9283 get_sib (instr_info
*ins
, int sizeflag
)
9285 /* If modrm.mod == 3, operand must be register. */
9287 && ((sizeflag
& AFLAG
) || ins
->address_mode
== mode_64bit
)
9288 && ins
->modrm
.mod
!= 3
9289 && ins
->modrm
.rm
== 4)
9291 FETCH_DATA (ins
->info
, ins
->codep
+ 2);
9292 ins
->sib
.index
= (ins
->codep
[1] >> 3) & 7;
9293 ins
->sib
.scale
= (ins
->codep
[1] >> 6) & 3;
9294 ins
->sib
.base
= ins
->codep
[1] & 7;
9295 ins
->has_sib
= true;
9298 ins
->has_sib
= false;
9301 /* Like oappend (below), but S is a string starting with '%'.
9302 In Intel syntax, the '%' is elided. */
9304 oappend_maybe_intel (instr_info
*ins
, const char *s
)
9306 oappend (ins
, s
+ ins
->intel_syntax
);
9310 print_insn (bfd_vma pc
, instr_info
*ins
)
9312 const struct dis386
*dp
;
9314 char *op_txt
[MAX_OPERANDS
];
9316 int sizeflag
, orig_sizeflag
;
9318 struct dis_private priv
;
9322 ins
->intel_mnemonic
= !SYSV386_COMPAT
;
9323 ins
->op_is_jump
= false;
9324 priv
.orig_sizeflag
= AFLAG
| DFLAG
;
9325 if ((ins
->info
->mach
& bfd_mach_i386_i386
) != 0)
9326 ins
->address_mode
= mode_32bit
;
9327 else if (ins
->info
->mach
== bfd_mach_i386_i8086
)
9329 ins
->address_mode
= mode_16bit
;
9330 priv
.orig_sizeflag
= 0;
9333 ins
->address_mode
= mode_64bit
;
9335 if (ins
->intel_syntax
== (char) -1)
9336 ins
->intel_syntax
= (ins
->info
->mach
& bfd_mach_i386_intel_syntax
) != 0;
9338 for (p
= ins
->info
->disassembler_options
; p
!= NULL
;)
9340 if (startswith (p
, "amd64"))
9342 else if (startswith (p
, "intel64"))
9343 ins
->isa64
= intel64
;
9344 else if (startswith (p
, "x86-64"))
9346 ins
->address_mode
= mode_64bit
;
9347 priv
.orig_sizeflag
|= AFLAG
| DFLAG
;
9349 else if (startswith (p
, "i386"))
9351 ins
->address_mode
= mode_32bit
;
9352 priv
.orig_sizeflag
|= AFLAG
| DFLAG
;
9354 else if (startswith (p
, "i8086"))
9356 ins
->address_mode
= mode_16bit
;
9357 priv
.orig_sizeflag
&= ~(AFLAG
| DFLAG
);
9359 else if (startswith (p
, "intel"))
9361 ins
->intel_syntax
= 1;
9362 if (startswith (p
+ 5, "-mnemonic"))
9363 ins
->intel_mnemonic
= true;
9365 else if (startswith (p
, "att"))
9367 ins
->intel_syntax
= 0;
9368 if (startswith (p
+ 3, "-mnemonic"))
9369 ins
->intel_mnemonic
= false;
9371 else if (startswith (p
, "addr"))
9373 if (ins
->address_mode
== mode_64bit
)
9375 if (p
[4] == '3' && p
[5] == '2')
9376 priv
.orig_sizeflag
&= ~AFLAG
;
9377 else if (p
[4] == '6' && p
[5] == '4')
9378 priv
.orig_sizeflag
|= AFLAG
;
9382 if (p
[4] == '1' && p
[5] == '6')
9383 priv
.orig_sizeflag
&= ~AFLAG
;
9384 else if (p
[4] == '3' && p
[5] == '2')
9385 priv
.orig_sizeflag
|= AFLAG
;
9388 else if (startswith (p
, "data"))
9390 if (p
[4] == '1' && p
[5] == '6')
9391 priv
.orig_sizeflag
&= ~DFLAG
;
9392 else if (p
[4] == '3' && p
[5] == '2')
9393 priv
.orig_sizeflag
|= DFLAG
;
9395 else if (startswith (p
, "suffix"))
9396 priv
.orig_sizeflag
|= SUFFIX_ALWAYS
;
9398 p
= strchr (p
, ',');
9403 if (ins
->address_mode
== mode_64bit
&& sizeof (bfd_vma
) < 8)
9405 (*ins
->info
->fprintf_func
) (ins
->info
->stream
,
9406 _("64-bit address is disabled"));
9410 if (ins
->intel_syntax
)
9412 ins
->open_char
= '[';
9413 ins
->close_char
= ']';
9414 ins
->separator_char
= '+';
9415 ins
->scale_char
= '*';
9419 ins
->open_char
= '(';
9420 ins
->close_char
= ')';
9421 ins
->separator_char
= ',';
9422 ins
->scale_char
= ',';
9425 /* The output looks better if we put 7 bytes on a line, since that
9426 puts most long word instructions on a single line. */
9427 ins
->info
->bytes_per_line
= 7;
9429 ins
->info
->private_data
= &priv
;
9430 priv
.max_fetched
= priv
.the_buffer
;
9431 priv
.insn_start
= pc
;
9434 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
9436 ins
->op_out
[i
][0] = 0;
9437 ins
->op_index
[i
] = -1;
9441 ins
->start_codep
= priv
.the_buffer
;
9442 ins
->codep
= priv
.the_buffer
;
9444 if (OPCODES_SIGSETJMP (priv
.bailout
) != 0)
9448 /* Getting here means we tried for data but didn't get it. That
9449 means we have an incomplete instruction of some sort. Just
9450 print the first byte as a prefix or a .byte pseudo-op. */
9451 if (ins
->codep
> priv
.the_buffer
)
9453 name
= prefix_name (ins
, priv
.the_buffer
[0], priv
.orig_sizeflag
);
9455 (*ins
->info
->fprintf_func
) (ins
->info
->stream
, "%s", name
);
9458 /* Just print the first byte as a .byte instruction. */
9459 (*ins
->info
->fprintf_func
) (ins
->info
->stream
, ".byte 0x%x",
9460 (unsigned int) priv
.the_buffer
[0]);
9469 ins
->obufp
= ins
->obuf
;
9470 sizeflag
= priv
.orig_sizeflag
;
9472 if (!ckprefix (ins
) || ins
->rex_used
)
9474 /* Too many ins->prefixes or unused REX ins->prefixes. */
9476 i
< (int) ARRAY_SIZE (ins
->all_prefixes
) && ins
->all_prefixes
[i
];
9478 (*ins
->info
->fprintf_func
) (ins
->info
->stream
, "%s%s",
9480 prefix_name (ins
, ins
->all_prefixes
[i
],
9485 ins
->insn_codep
= ins
->codep
;
9487 FETCH_DATA (ins
->info
, ins
->codep
+ 1);
9488 ins
->two_source_ops
= (*ins
->codep
== 0x62) || (*ins
->codep
== 0xc8);
9490 if (((ins
->prefixes
& PREFIX_FWAIT
)
9491 && ((*ins
->codep
< 0xd8) || (*ins
->codep
> 0xdf))))
9493 /* Handle ins->prefixes before fwait. */
9494 for (i
= 0; i
< ins
->fwait_prefix
&& ins
->all_prefixes
[i
];
9496 (*ins
->info
->fprintf_func
) (ins
->info
->stream
, "%s ",
9497 prefix_name (ins
, ins
->all_prefixes
[i
],
9499 (*ins
->info
->fprintf_func
) (ins
->info
->stream
, "fwait");
9503 if (*ins
->codep
== 0x0f)
9505 unsigned char threebyte
;
9508 FETCH_DATA (ins
->info
, ins
->codep
+ 1);
9509 threebyte
= *ins
->codep
;
9510 dp
= &dis386_twobyte
[threebyte
];
9511 ins
->need_modrm
= twobyte_has_modrm
[threebyte
];
9516 dp
= &dis386
[*ins
->codep
];
9517 ins
->need_modrm
= onebyte_has_modrm
[*ins
->codep
];
9521 /* Save sizeflag for printing the extra ins->prefixes later before updating
9522 it for mnemonic and operand processing. The prefix names depend
9523 only on the address mode. */
9524 orig_sizeflag
= sizeflag
;
9525 if (ins
->prefixes
& PREFIX_ADDR
)
9527 if ((ins
->prefixes
& PREFIX_DATA
))
9530 ins
->end_codep
= ins
->codep
;
9531 if (ins
->need_modrm
)
9533 FETCH_DATA (ins
->info
, ins
->codep
+ 1);
9534 ins
->modrm
.mod
= (*ins
->codep
>> 6) & 3;
9535 ins
->modrm
.reg
= (*ins
->codep
>> 3) & 7;
9536 ins
->modrm
.rm
= *ins
->codep
& 7;
9539 memset (&ins
->modrm
, 0, sizeof (ins
->modrm
));
9541 ins
->need_vex
= false;
9542 memset (&ins
->vex
, 0, sizeof (ins
->vex
));
9544 if (dp
->name
== NULL
&& dp
->op
[0].bytemode
== FLOATCODE
)
9546 get_sib (ins
, sizeflag
);
9547 dofloat (ins
, sizeflag
);
9551 dp
= get_valid_dis386 (dp
, ins
);
9552 if (dp
!= NULL
&& putop (ins
, dp
->name
, sizeflag
) == 0)
9554 get_sib (ins
, sizeflag
);
9555 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
9557 ins
->obufp
= ins
->op_out
[i
];
9558 ins
->op_ad
= MAX_OPERANDS
- 1 - i
;
9560 (*dp
->op
[i
].rtn
) (ins
, dp
->op
[i
].bytemode
, sizeflag
);
9561 /* For EVEX instruction after the last operand masking
9562 should be printed. */
9563 if (i
== 0 && ins
->vex
.evex
)
9565 /* Don't print {%k0}. */
9566 if (ins
->vex
.mask_register_specifier
)
9569 oappend_maybe_intel (ins
,
9571 [ins
->vex
.mask_register_specifier
]);
9574 if (ins
->vex
.zeroing
)
9575 oappend (ins
, "{z}");
9577 /* S/G insns require a mask and don't allow
9579 if ((dp
->op
[0].bytemode
== vex_vsib_d_w_dq_mode
9580 || dp
->op
[0].bytemode
== vex_vsib_q_w_dq_mode
)
9581 && (ins
->vex
.mask_register_specifier
== 0
9582 || ins
->vex
.zeroing
))
9583 oappend (ins
, "/(bad)");
9587 /* Check whether rounding control was enabled for an insn not
9589 if (ins
->modrm
.mod
== 3 && ins
->vex
.b
9590 && !(ins
->evex_used
& EVEX_b_used
))
9592 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
9594 ins
->obufp
= ins
->op_out
[i
];
9597 oappend (ins
, names_rounding
[ins
->vex
.ll
]);
9598 oappend (ins
, "bad}");
9605 /* Clear instruction information. */
9606 ins
->info
->insn_info_valid
= 0;
9607 ins
->info
->branch_delay_insns
= 0;
9608 ins
->info
->data_size
= 0;
9609 ins
->info
->insn_type
= dis_noninsn
;
9610 ins
->info
->target
= 0;
9611 ins
->info
->target2
= 0;
9613 /* Reset jump operation indicator. */
9614 ins
->op_is_jump
= false;
9616 int jump_detection
= 0;
9618 /* Extract flags. */
9619 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
9621 if ((dp
->op
[i
].rtn
== OP_J
)
9622 || (dp
->op
[i
].rtn
== OP_indirE
))
9623 jump_detection
|= 1;
9624 else if ((dp
->op
[i
].rtn
== BND_Fixup
)
9625 || (!dp
->op
[i
].rtn
&& !dp
->op
[i
].bytemode
))
9626 jump_detection
|= 2;
9627 else if ((dp
->op
[i
].bytemode
== cond_jump_mode
)
9628 || (dp
->op
[i
].bytemode
== loop_jcxz_mode
))
9629 jump_detection
|= 4;
9632 /* Determine if this is a jump or branch. */
9633 if ((jump_detection
& 0x3) == 0x3)
9635 ins
->op_is_jump
= true;
9636 if (jump_detection
& 0x4)
9637 ins
->info
->insn_type
= dis_condbranch
;
9639 ins
->info
->insn_type
= (dp
->name
&& !strncmp (dp
->name
, "call", 4))
9640 ? dis_jsr
: dis_branch
;
9644 /* If VEX.vvvv and EVEX.vvvv are unused, they must be all 1s, which
9645 are all 0s in inverted form. */
9646 if (ins
->need_vex
&& ins
->vex
.register_specifier
!= 0)
9648 (*ins
->info
->fprintf_func
) (ins
->info
->stream
, "(bad)");
9649 return ins
->end_codep
- priv
.the_buffer
;
9652 /* If EVEX.z is set, there must be an actual mask register in use. */
9653 if (ins
->vex
.zeroing
&& ins
->vex
.mask_register_specifier
== 0)
9655 (*ins
->info
->fprintf_func
) (ins
->info
->stream
, "(bad)");
9656 return ins
->end_codep
- priv
.the_buffer
;
9659 switch (dp
->prefix_requirement
)
9662 /* If only the data prefix is marked as mandatory, its absence renders
9663 the encoding invalid. Most other PREFIX_OPCODE rules still apply. */
9664 if (ins
->need_vex
? !ins
->vex
.prefix
: !(ins
->prefixes
& PREFIX_DATA
))
9666 (*ins
->info
->fprintf_func
) (ins
->info
->stream
, "(bad)");
9667 return ins
->end_codep
- priv
.the_buffer
;
9669 ins
->used_prefixes
|= PREFIX_DATA
;
9672 /* If the mandatory PREFIX_REPZ/PREFIX_REPNZ/PREFIX_DATA prefix is
9673 unused, opcode is invalid. Since the PREFIX_DATA prefix may be
9674 used by putop and MMX/SSE operand and may be overridden by the
9675 PREFIX_REPZ/PREFIX_REPNZ fix, we check the PREFIX_DATA prefix
9678 ? ins
->vex
.prefix
== REPE_PREFIX_OPCODE
9679 || ins
->vex
.prefix
== REPNE_PREFIX_OPCODE
9681 & (PREFIX_REPZ
| PREFIX_REPNZ
)) != 0)
9682 && (ins
->used_prefixes
9683 & (PREFIX_REPZ
| PREFIX_REPNZ
)) == 0)
9685 ? ins
->vex
.prefix
== DATA_PREFIX_OPCODE
9687 & (PREFIX_REPZ
| PREFIX_REPNZ
| PREFIX_DATA
))
9689 && (ins
->used_prefixes
& PREFIX_DATA
) == 0))
9690 || (ins
->vex
.evex
&& dp
->prefix_requirement
!= PREFIX_DATA
9691 && !ins
->vex
.w
!= !(ins
->used_prefixes
& PREFIX_DATA
)))
9693 (*ins
->info
->fprintf_func
) (ins
->info
->stream
, "(bad)");
9694 return ins
->end_codep
- priv
.the_buffer
;
9698 case PREFIX_IGNORED
:
9699 /* Zap data size and rep prefixes from used_prefixes and reinstate their
9700 origins in all_prefixes. */
9701 ins
->used_prefixes
&= ~PREFIX_OPCODE
;
9702 if (ins
->last_data_prefix
>= 0)
9703 ins
->all_prefixes
[ins
->last_data_prefix
] = 0x66;
9704 if (ins
->last_repz_prefix
>= 0)
9705 ins
->all_prefixes
[ins
->last_repz_prefix
] = 0xf3;
9706 if (ins
->last_repnz_prefix
>= 0)
9707 ins
->all_prefixes
[ins
->last_repnz_prefix
] = 0xf2;
9711 /* Check if the REX prefix is used. */
9712 if ((ins
->rex
^ ins
->rex_used
) == 0
9713 && !ins
->need_vex
&& ins
->last_rex_prefix
>= 0)
9714 ins
->all_prefixes
[ins
->last_rex_prefix
] = 0;
9716 /* Check if the SEG prefix is used. */
9717 if ((ins
->prefixes
& (PREFIX_CS
| PREFIX_SS
| PREFIX_DS
| PREFIX_ES
9718 | PREFIX_FS
| PREFIX_GS
)) != 0
9719 && (ins
->used_prefixes
& ins
->active_seg_prefix
) != 0)
9720 ins
->all_prefixes
[ins
->last_seg_prefix
] = 0;
9722 /* Check if the ADDR prefix is used. */
9723 if ((ins
->prefixes
& PREFIX_ADDR
) != 0
9724 && (ins
->used_prefixes
& PREFIX_ADDR
) != 0)
9725 ins
->all_prefixes
[ins
->last_addr_prefix
] = 0;
9727 /* Check if the DATA prefix is used. */
9728 if ((ins
->prefixes
& PREFIX_DATA
) != 0
9729 && (ins
->used_prefixes
& PREFIX_DATA
) != 0
9731 ins
->all_prefixes
[ins
->last_data_prefix
] = 0;
9733 /* Print the extra ins->prefixes. */
9735 for (i
= 0; i
< (int) ARRAY_SIZE (ins
->all_prefixes
); i
++)
9736 if (ins
->all_prefixes
[i
])
9739 name
= prefix_name (ins
, ins
->all_prefixes
[i
], orig_sizeflag
);
9742 prefix_length
+= strlen (name
) + 1;
9743 (*ins
->info
->fprintf_func
) (ins
->info
->stream
, "%s ", name
);
9746 /* Check maximum code length. */
9747 if ((ins
->codep
- ins
->start_codep
) > MAX_CODE_LENGTH
)
9749 (*ins
->info
->fprintf_func
) (ins
->info
->stream
, "(bad)");
9750 return MAX_CODE_LENGTH
;
9753 ins
->obufp
= ins
->mnemonicendp
;
9754 for (i
= strlen (ins
->obuf
) + prefix_length
; i
< 6; i
++)
9757 (*ins
->info
->fprintf_func
) (ins
->info
->stream
, "%s", ins
->obuf
);
9759 /* The enter and bound instructions are printed with operands in the same
9760 order as the intel book; everything else is printed in reverse order. */
9761 if (ins
->intel_syntax
|| ins
->two_source_ops
)
9765 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
9766 op_txt
[i
] = ins
->op_out
[i
];
9768 if (ins
->intel_syntax
&& dp
&& dp
->op
[2].rtn
== OP_Rounding
9769 && dp
->op
[3].rtn
== OP_E
&& dp
->op
[4].rtn
== NULL
)
9771 op_txt
[2] = ins
->op_out
[3];
9772 op_txt
[3] = ins
->op_out
[2];
9775 for (i
= 0; i
< (MAX_OPERANDS
>> 1); ++i
)
9777 ins
->op_ad
= ins
->op_index
[i
];
9778 ins
->op_index
[i
] = ins
->op_index
[MAX_OPERANDS
- 1 - i
];
9779 ins
->op_index
[MAX_OPERANDS
- 1 - i
] = ins
->op_ad
;
9780 riprel
= ins
->op_riprel
[i
];
9781 ins
->op_riprel
[i
] = ins
->op_riprel
[MAX_OPERANDS
- 1 - i
];
9782 ins
->op_riprel
[MAX_OPERANDS
- 1 - i
] = riprel
;
9787 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
9788 op_txt
[MAX_OPERANDS
- 1 - i
] = ins
->op_out
[i
];
9792 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
9796 (*ins
->info
->fprintf_func
) (ins
->info
->stream
, ",");
9797 if (ins
->op_index
[i
] != -1 && !ins
->op_riprel
[i
])
9799 bfd_vma target
= (bfd_vma
) ins
->op_address
[ins
->op_index
[i
]];
9801 if (ins
->op_is_jump
)
9803 ins
->info
->insn_info_valid
= 1;
9804 ins
->info
->branch_delay_insns
= 0;
9805 ins
->info
->data_size
= 0;
9806 ins
->info
->target
= target
;
9807 ins
->info
->target2
= 0;
9809 (*ins
->info
->print_address_func
) (target
, ins
->info
);
9812 (*ins
->info
->fprintf_func
) (ins
->info
->stream
, "%s", op_txt
[i
]);
9816 for (i
= 0; i
< MAX_OPERANDS
; i
++)
9817 if (ins
->op_index
[i
] != -1 && ins
->op_riprel
[i
])
9819 (*ins
->info
->fprintf_func
) (ins
->info
->stream
, " # ");
9820 (*ins
->info
->print_address_func
) ((bfd_vma
)
9821 (ins
->start_pc
+ (ins
->codep
- ins
->start_codep
)
9822 + ins
->op_address
[ins
->op_index
[i
]]), ins
->info
);
9825 return ins
->codep
- priv
.the_buffer
;
9828 static const char *float_mem
[] = {
9903 static const unsigned char float_mem_mode
[] = {
9978 #define ST { OP_ST, 0 }
9979 #define STi { OP_STi, 0 }
9981 #define FGRPd9_2 NULL, { { NULL, 1 } }, 0
9982 #define FGRPd9_4 NULL, { { NULL, 2 } }, 0
9983 #define FGRPd9_5 NULL, { { NULL, 3 } }, 0
9984 #define FGRPd9_6 NULL, { { NULL, 4 } }, 0
9985 #define FGRPd9_7 NULL, { { NULL, 5 } }, 0
9986 #define FGRPda_5 NULL, { { NULL, 6 } }, 0
9987 #define FGRPdb_4 NULL, { { NULL, 7 } }, 0
9988 #define FGRPde_3 NULL, { { NULL, 8 } }, 0
9989 #define FGRPdf_4 NULL, { { NULL, 9 } }, 0
9991 static const struct dis386 float_reg
[][8] = {
9994 { "fadd", { ST
, STi
}, 0 },
9995 { "fmul", { ST
, STi
}, 0 },
9996 { "fcom", { STi
}, 0 },
9997 { "fcomp", { STi
}, 0 },
9998 { "fsub", { ST
, STi
}, 0 },
9999 { "fsubr", { ST
, STi
}, 0 },
10000 { "fdiv", { ST
, STi
}, 0 },
10001 { "fdivr", { ST
, STi
}, 0 },
10005 { "fld", { STi
}, 0 },
10006 { "fxch", { STi
}, 0 },
10016 { "fcmovb", { ST
, STi
}, 0 },
10017 { "fcmove", { ST
, STi
}, 0 },
10018 { "fcmovbe",{ ST
, STi
}, 0 },
10019 { "fcmovu", { ST
, STi
}, 0 },
10027 { "fcmovnb",{ ST
, STi
}, 0 },
10028 { "fcmovne",{ ST
, STi
}, 0 },
10029 { "fcmovnbe",{ ST
, STi
}, 0 },
10030 { "fcmovnu",{ ST
, STi
}, 0 },
10032 { "fucomi", { ST
, STi
}, 0 },
10033 { "fcomi", { ST
, STi
}, 0 },
10038 { "fadd", { STi
, ST
}, 0 },
10039 { "fmul", { STi
, ST
}, 0 },
10042 { "fsub{!M|r}", { STi
, ST
}, 0 },
10043 { "fsub{M|}", { STi
, ST
}, 0 },
10044 { "fdiv{!M|r}", { STi
, ST
}, 0 },
10045 { "fdiv{M|}", { STi
, ST
}, 0 },
10049 { "ffree", { STi
}, 0 },
10051 { "fst", { STi
}, 0 },
10052 { "fstp", { STi
}, 0 },
10053 { "fucom", { STi
}, 0 },
10054 { "fucomp", { STi
}, 0 },
10060 { "faddp", { STi
, ST
}, 0 },
10061 { "fmulp", { STi
, ST
}, 0 },
10064 { "fsub{!M|r}p", { STi
, ST
}, 0 },
10065 { "fsub{M|}p", { STi
, ST
}, 0 },
10066 { "fdiv{!M|r}p", { STi
, ST
}, 0 },
10067 { "fdiv{M|}p", { STi
, ST
}, 0 },
10071 { "ffreep", { STi
}, 0 },
10076 { "fucomip", { ST
, STi
}, 0 },
10077 { "fcomip", { ST
, STi
}, 0 },
10082 static const char *const fgrps
[][8] = {
10085 "(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10090 "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10095 "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
10100 "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
10105 "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
10110 "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
10115 "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10120 "fNeni(8087 only)","fNdisi(8087 only)","fNclex","fNinit",
10121 "fNsetpm(287 only)","frstpm(287 only)","(bad)","(bad)",
10126 "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10131 "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10136 swap_operand (instr_info
*ins
)
10138 ins
->mnemonicendp
[0] = '.';
10139 ins
->mnemonicendp
[1] = 's';
10140 ins
->mnemonicendp
[2] = '\0';
10141 ins
->mnemonicendp
+= 2;
10145 OP_Skip_MODRM (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
10146 int sizeflag ATTRIBUTE_UNUSED
)
10148 /* Skip mod/rm byte. */
10154 dofloat (instr_info
*ins
, int sizeflag
)
10156 const struct dis386
*dp
;
10157 unsigned char floatop
;
10159 floatop
= ins
->codep
[-1];
10161 if (ins
->modrm
.mod
!= 3)
10163 int fp_indx
= (floatop
- 0xd8) * 8 + ins
->modrm
.reg
;
10165 putop (ins
, float_mem
[fp_indx
], sizeflag
);
10166 ins
->obufp
= ins
->op_out
[0];
10168 OP_E (ins
, float_mem_mode
[fp_indx
], sizeflag
);
10171 /* Skip mod/rm byte. */
10175 dp
= &float_reg
[floatop
- 0xd8][ins
->modrm
.reg
];
10176 if (dp
->name
== NULL
)
10178 putop (ins
, fgrps
[dp
->op
[0].bytemode
][ins
->modrm
.rm
], sizeflag
);
10180 /* Instruction fnstsw is only one with strange arg. */
10181 if (floatop
== 0xdf && ins
->codep
[-1] == 0xe0)
10182 strcpy (ins
->op_out
[0], att_names16
[0] + ins
->intel_syntax
);
10186 putop (ins
, dp
->name
, sizeflag
);
10188 ins
->obufp
= ins
->op_out
[0];
10191 (*dp
->op
[0].rtn
) (ins
, dp
->op
[0].bytemode
, sizeflag
);
10193 ins
->obufp
= ins
->op_out
[1];
10196 (*dp
->op
[1].rtn
) (ins
, dp
->op
[1].bytemode
, sizeflag
);
10201 OP_ST (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
10202 int sizeflag ATTRIBUTE_UNUSED
)
10204 oappend_maybe_intel (ins
, "%st");
10208 OP_STi (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
10209 int sizeflag ATTRIBUTE_UNUSED
)
10211 sprintf (ins
->scratchbuf
, "%%st(%d)", ins
->modrm
.rm
);
10212 oappend_maybe_intel (ins
, ins
->scratchbuf
);
10215 /* Capital letters in template are macros. */
10217 putop (instr_info
*ins
, const char *in_template
, int sizeflag
)
10222 unsigned int l
= 0, len
= 0;
10225 for (p
= in_template
; *p
; p
++)
10229 if (l
>= sizeof (last
) || !ISUPPER (*p
))
10237 *ins
->obufp
++ = *p
;
10246 if (ins
->intel_syntax
)
10248 while (*++p
!= '|')
10249 if (*p
== '}' || *p
== '\0')
10255 while (*++p
!= '}')
10265 if (ins
->intel_syntax
)
10267 if ((ins
->need_modrm
&& ins
->modrm
.mod
!= 3)
10268 || (sizeflag
& SUFFIX_ALWAYS
))
10269 *ins
->obufp
++ = 'b';
10275 if (ins
->intel_syntax
)
10277 if (sizeflag
& SUFFIX_ALWAYS
)
10278 *ins
->obufp
++ = 'b';
10280 else if (l
== 1 && last
[0] == 'L')
10282 if (ins
->address_mode
== mode_64bit
10283 && !(ins
->prefixes
& PREFIX_ADDR
))
10285 *ins
->obufp
++ = 'a';
10286 *ins
->obufp
++ = 'b';
10287 *ins
->obufp
++ = 's';
10296 if (ins
->intel_syntax
&& !alt
)
10298 if ((ins
->prefixes
& PREFIX_DATA
) || (sizeflag
& SUFFIX_ALWAYS
))
10300 if (sizeflag
& DFLAG
)
10301 *ins
->obufp
++ = ins
->intel_syntax
? 'd' : 'l';
10303 *ins
->obufp
++ = ins
->intel_syntax
? 'w' : 's';
10304 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
10313 if (!ins
->vex
.evex
|| ins
->vex
.w
)
10314 *ins
->obufp
++ = 'd';
10316 oappend (ins
, "{bad}");
10325 if (ins
->intel_syntax
|| !(sizeflag
& SUFFIX_ALWAYS
))
10328 if (ins
->modrm
.mod
== 3)
10330 if (ins
->rex
& REX_W
)
10331 *ins
->obufp
++ = 'q';
10334 if (sizeflag
& DFLAG
)
10335 *ins
->obufp
++ = ins
->intel_syntax
? 'd' : 'l';
10337 *ins
->obufp
++ = 'w';
10338 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
10342 *ins
->obufp
++ = 'w';
10344 case 'E': /* For jcxz/jecxz */
10345 if (ins
->address_mode
== mode_64bit
)
10347 if (sizeflag
& AFLAG
)
10348 *ins
->obufp
++ = 'r';
10350 *ins
->obufp
++ = 'e';
10353 if (sizeflag
& AFLAG
)
10354 *ins
->obufp
++ = 'e';
10355 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_ADDR
);
10358 if (ins
->intel_syntax
)
10360 if ((ins
->prefixes
& PREFIX_ADDR
) || (sizeflag
& SUFFIX_ALWAYS
))
10362 if (sizeflag
& AFLAG
)
10363 *ins
->obufp
++ = ins
->address_mode
== mode_64bit
? 'q' : 'l';
10365 *ins
->obufp
++ = ins
->address_mode
== mode_64bit
? 'l' : 'w';
10366 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_ADDR
);
10370 if (ins
->intel_syntax
|| (ins
->obufp
[-1] != 's'
10371 && !(sizeflag
& SUFFIX_ALWAYS
)))
10373 if ((ins
->rex
& REX_W
) || (sizeflag
& DFLAG
))
10374 *ins
->obufp
++ = 'l';
10376 *ins
->obufp
++ = 'w';
10377 if (!(ins
->rex
& REX_W
))
10378 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
10383 if (ins
->intel_syntax
)
10385 if ((ins
->prefixes
& (PREFIX_CS
| PREFIX_DS
)) == PREFIX_CS
10386 || (ins
->prefixes
& (PREFIX_CS
| PREFIX_DS
)) == PREFIX_DS
)
10388 ins
->used_prefixes
|= ins
->prefixes
& (PREFIX_CS
| PREFIX_DS
);
10389 *ins
->obufp
++ = ',';
10390 *ins
->obufp
++ = 'p';
10392 /* Set active_seg_prefix even if not set in 64-bit mode
10393 because here it is a valid branch hint. */
10394 if (ins
->prefixes
& PREFIX_DS
)
10396 ins
->active_seg_prefix
= PREFIX_DS
;
10397 *ins
->obufp
++ = 't';
10401 ins
->active_seg_prefix
= PREFIX_CS
;
10402 *ins
->obufp
++ = 'n';
10406 else if (l
== 1 && last
[0] == 'X')
10409 *ins
->obufp
++ = 'h';
10411 oappend (ins
, "{bad}");
10418 if (ins
->rex
& REX_W
)
10419 *ins
->obufp
++ = 'q';
10421 *ins
->obufp
++ = 'd';
10426 if (ins
->intel_mnemonic
!= cond
)
10427 *ins
->obufp
++ = 'r';
10430 if ((ins
->prefixes
& PREFIX_FWAIT
) == 0)
10431 *ins
->obufp
++ = 'n';
10433 ins
->used_prefixes
|= PREFIX_FWAIT
;
10437 if (ins
->rex
& REX_W
)
10438 *ins
->obufp
++ = 'o';
10439 else if (ins
->intel_syntax
&& (sizeflag
& DFLAG
))
10440 *ins
->obufp
++ = 'q';
10442 *ins
->obufp
++ = 'd';
10443 if (!(ins
->rex
& REX_W
))
10444 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
10447 if (ins
->address_mode
== mode_64bit
10448 && (ins
->isa64
== intel64
|| (ins
->rex
& REX_W
)
10449 || !(ins
->prefixes
& PREFIX_DATA
)))
10451 if (sizeflag
& SUFFIX_ALWAYS
)
10452 *ins
->obufp
++ = 'q';
10455 /* Fall through. */
10459 if ((ins
->modrm
.mod
== 3 || !cond
)
10460 && !(sizeflag
& SUFFIX_ALWAYS
))
10462 /* Fall through. */
10464 if ((!(ins
->rex
& REX_W
) && (ins
->prefixes
& PREFIX_DATA
))
10465 || ((sizeflag
& SUFFIX_ALWAYS
)
10466 && ins
->address_mode
!= mode_64bit
))
10468 *ins
->obufp
++ = (sizeflag
& DFLAG
)
10469 ? ins
->intel_syntax
? 'd' : 'l' : 'w';
10470 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
10472 else if (sizeflag
& SUFFIX_ALWAYS
)
10473 *ins
->obufp
++ = 'q';
10475 else if (l
== 1 && last
[0] == 'L')
10477 if ((ins
->prefixes
& PREFIX_DATA
)
10478 || (ins
->rex
& REX_W
)
10479 || (sizeflag
& SUFFIX_ALWAYS
))
10482 if (ins
->rex
& REX_W
)
10483 *ins
->obufp
++ = 'q';
10486 if (sizeflag
& DFLAG
)
10487 *ins
->obufp
++ = ins
->intel_syntax
? 'd' : 'l';
10489 *ins
->obufp
++ = 'w';
10490 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
10500 if (ins
->intel_syntax
&& !alt
)
10503 if ((ins
->need_modrm
&& ins
->modrm
.mod
!= 3)
10504 || (sizeflag
& SUFFIX_ALWAYS
))
10506 if (ins
->rex
& REX_W
)
10507 *ins
->obufp
++ = 'q';
10510 if (sizeflag
& DFLAG
)
10511 *ins
->obufp
++ = ins
->intel_syntax
? 'd' : 'l';
10513 *ins
->obufp
++ = 'w';
10514 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
10518 else if (l
== 1 && last
[0] == 'D')
10519 *ins
->obufp
++ = ins
->vex
.w
? 'q' : 'd';
10520 else if (l
== 1 && last
[0] == 'L')
10522 if (cond
? ins
->modrm
.mod
== 3 && !(sizeflag
& SUFFIX_ALWAYS
)
10523 : ins
->address_mode
!= mode_64bit
)
10525 if ((ins
->rex
& REX_W
))
10528 *ins
->obufp
++ = 'q';
10530 else if ((ins
->address_mode
== mode_64bit
&& cond
)
10531 || (sizeflag
& SUFFIX_ALWAYS
))
10532 *ins
->obufp
++ = ins
->intel_syntax
? 'd' : 'l';
10539 if (ins
->rex
& REX_W
)
10540 *ins
->obufp
++ = 'q';
10541 else if (sizeflag
& DFLAG
)
10543 if (ins
->intel_syntax
)
10544 *ins
->obufp
++ = 'd';
10546 *ins
->obufp
++ = 'l';
10549 *ins
->obufp
++ = 'w';
10550 if (ins
->intel_syntax
&& !p
[1]
10551 && ((ins
->rex
& REX_W
) || (sizeflag
& DFLAG
)))
10552 *ins
->obufp
++ = 'e';
10553 if (!(ins
->rex
& REX_W
))
10554 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
10560 if (ins
->intel_syntax
)
10562 if (sizeflag
& SUFFIX_ALWAYS
)
10564 if (ins
->rex
& REX_W
)
10565 *ins
->obufp
++ = 'q';
10568 if (sizeflag
& DFLAG
)
10569 *ins
->obufp
++ = 'l';
10571 *ins
->obufp
++ = 'w';
10572 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
10582 if (ins
->address_mode
== mode_64bit
10583 && !(ins
->prefixes
& PREFIX_ADDR
))
10585 *ins
->obufp
++ = 'a';
10586 *ins
->obufp
++ = 'b';
10587 *ins
->obufp
++ = 's';
10592 if (!ins
->vex
.evex
|| !ins
->vex
.w
)
10593 *ins
->obufp
++ = 's';
10595 oappend (ins
, "{bad}");
10605 && (last
[0] == 'L' || last
[0] == 'X'))
10607 if (last
[0] == 'X')
10609 *ins
->obufp
++ = '{';
10610 *ins
->obufp
++ = 'v';
10611 *ins
->obufp
++ = 'e';
10612 *ins
->obufp
++ = 'x';
10613 *ins
->obufp
++ = '}';
10615 else if (ins
->rex
& REX_W
)
10617 *ins
->obufp
++ = 'a';
10618 *ins
->obufp
++ = 'b';
10619 *ins
->obufp
++ = 's';
10628 /* operand size flag for cwtl, cbtw */
10630 if (ins
->rex
& REX_W
)
10632 if (ins
->intel_syntax
)
10633 *ins
->obufp
++ = 'd';
10635 *ins
->obufp
++ = 'l';
10637 else if (sizeflag
& DFLAG
)
10638 *ins
->obufp
++ = 'w';
10640 *ins
->obufp
++ = 'b';
10641 if (!(ins
->rex
& REX_W
))
10642 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
10646 if (!ins
->need_vex
)
10648 if (last
[0] == 'X')
10649 *ins
->obufp
++ = ins
->vex
.w
? 'd': 's';
10650 else if (last
[0] == 'B')
10651 *ins
->obufp
++ = ins
->vex
.w
? 'w': 'b';
10662 ? ins
->vex
.prefix
== DATA_PREFIX_OPCODE
10663 : ins
->prefixes
& PREFIX_DATA
)
10665 *ins
->obufp
++ = 'd';
10666 ins
->used_prefixes
|= PREFIX_DATA
;
10669 *ins
->obufp
++ = 's';
10672 if (l
== 1 && last
[0] == 'X')
10674 if (!ins
->need_vex
)
10676 if (ins
->intel_syntax
10677 || ((ins
->modrm
.mod
== 3 || ins
->vex
.b
)
10678 && !(sizeflag
& SUFFIX_ALWAYS
)))
10680 switch (ins
->vex
.length
)
10683 *ins
->obufp
++ = 'x';
10686 *ins
->obufp
++ = 'y';
10689 if (!ins
->vex
.evex
)
10700 /* These insns ignore ModR/M.mod: Force it to 3 for OP_E(). */
10701 ins
->modrm
.mod
= 3;
10702 if (!ins
->intel_syntax
&& (sizeflag
& SUFFIX_ALWAYS
))
10703 *ins
->obufp
++ = ins
->address_mode
== mode_64bit
? 'q' : 'l';
10705 else if (l
== 1 && last
[0] == 'X')
10707 if (!ins
->vex
.evex
)
10709 if (ins
->intel_syntax
10710 || ((ins
->modrm
.mod
== 3 || ins
->vex
.b
)
10711 && !(sizeflag
& SUFFIX_ALWAYS
)))
10713 switch (ins
->vex
.length
)
10716 *ins
->obufp
++ = 'x';
10719 *ins
->obufp
++ = 'y';
10722 *ins
->obufp
++ = 'z';
10732 if (ins
->intel_syntax
)
10734 if (ins
->isa64
== intel64
&& (ins
->rex
& REX_W
))
10737 *ins
->obufp
++ = 'q';
10740 if ((ins
->prefixes
& PREFIX_DATA
) || (sizeflag
& SUFFIX_ALWAYS
))
10742 if (sizeflag
& DFLAG
)
10743 *ins
->obufp
++ = 'l';
10745 *ins
->obufp
++ = 'w';
10746 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
10755 ins
->mnemonicendp
= ins
->obufp
;
10760 oappend (instr_info
*ins
, const char *s
)
10762 ins
->obufp
= stpcpy (ins
->obufp
, s
);
10766 append_seg (instr_info
*ins
)
10768 /* Only print the active segment register. */
10769 if (!ins
->active_seg_prefix
)
10772 ins
->used_prefixes
|= ins
->active_seg_prefix
;
10773 switch (ins
->active_seg_prefix
)
10776 oappend_maybe_intel (ins
, "%cs:");
10779 oappend_maybe_intel (ins
, "%ds:");
10782 oappend_maybe_intel (ins
, "%ss:");
10785 oappend_maybe_intel (ins
, "%es:");
10788 oappend_maybe_intel (ins
, "%fs:");
10791 oappend_maybe_intel (ins
, "%gs:");
10799 OP_indirE (instr_info
*ins
, int bytemode
, int sizeflag
)
10801 if (!ins
->intel_syntax
)
10802 oappend (ins
, "*");
10803 OP_E (ins
, bytemode
, sizeflag
);
10807 print_operand_value (instr_info
*ins
, char *buf
, int hex
, bfd_vma disp
)
10809 if (ins
->address_mode
== mode_64bit
)
10817 sprintf_vma (tmp
, disp
);
10818 for (i
= 0; tmp
[i
] == '0' && tmp
[i
+ 1]; i
++);
10819 strcpy (buf
+ 2, tmp
+ i
);
10823 bfd_signed_vma v
= disp
;
10830 /* Check for possible overflow on 0x8000000000000000. */
10833 strcpy (buf
, "9223372036854775808");
10847 tmp
[28 - i
] = (v
% 10) + '0';
10851 strcpy (buf
, tmp
+ 29 - i
);
10857 sprintf (buf
, "0x%x", (unsigned int) disp
);
10859 sprintf (buf
, "%d", (int) disp
);
10863 /* Put DISP in BUF as signed hex number. */
10866 print_displacement (instr_info
*ins
, char *buf
, bfd_vma disp
)
10868 bfd_signed_vma val
= disp
;
10877 /* Check for possible overflow. */
10880 switch (ins
->address_mode
)
10883 strcpy (buf
+ j
, "0x8000000000000000");
10886 strcpy (buf
+ j
, "0x80000000");
10889 strcpy (buf
+ j
, "0x8000");
10899 sprintf_vma (tmp
, (bfd_vma
) val
);
10900 for (i
= 0; tmp
[i
] == '0'; i
++)
10902 if (tmp
[i
] == '\0')
10904 strcpy (buf
+ j
, tmp
+ i
);
10908 intel_operand_size (instr_info
*ins
, int bytemode
, int sizeflag
)
10912 if (!ins
->vex
.no_broadcast
)
10916 case evex_half_bcst_xmmq_mode
:
10918 oappend (ins
, "QWORD PTR ");
10920 oappend (ins
, "DWORD PTR ");
10923 case evex_half_bcst_xmmqh_mode
:
10924 case evex_half_bcst_xmmqdh_mode
:
10925 oappend (ins
, "WORD PTR ");
10928 ins
->vex
.no_broadcast
= true;
10938 oappend (ins
, "BYTE PTR ");
10943 oappend (ins
, "WORD PTR ");
10946 if (ins
->address_mode
== mode_64bit
&& ins
->isa64
== intel64
)
10948 oappend (ins
, "QWORD PTR ");
10951 /* Fall through. */
10953 if (ins
->address_mode
== mode_64bit
&& ((sizeflag
& DFLAG
)
10954 || (ins
->rex
& REX_W
)))
10956 oappend (ins
, "QWORD PTR ");
10959 /* Fall through. */
10964 if (ins
->rex
& REX_W
)
10965 oappend (ins
, "QWORD PTR ");
10966 else if (bytemode
== dq_mode
)
10967 oappend (ins
, "DWORD PTR ");
10970 if (sizeflag
& DFLAG
)
10971 oappend (ins
, "DWORD PTR ");
10973 oappend (ins
, "WORD PTR ");
10974 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
10978 if ((ins
->rex
& REX_W
) || (sizeflag
& DFLAG
))
10979 *ins
->obufp
++ = 'D';
10980 oappend (ins
, "WORD PTR ");
10981 if (!(ins
->rex
& REX_W
))
10982 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
10985 if (sizeflag
& DFLAG
)
10986 oappend (ins
, "QWORD PTR ");
10988 oappend (ins
, "DWORD PTR ");
10989 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
10992 if (!(sizeflag
& DFLAG
) && ins
->isa64
== intel64
)
10993 oappend (ins
, "WORD PTR ");
10995 oappend (ins
, "DWORD PTR ");
10996 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
11000 oappend (ins
, "DWORD PTR ");
11004 oappend (ins
, "QWORD PTR ");
11007 if (ins
->address_mode
== mode_64bit
)
11008 oappend (ins
, "QWORD PTR ");
11010 oappend (ins
, "DWORD PTR ");
11013 if (sizeflag
& DFLAG
)
11014 oappend (ins
, "FWORD PTR ");
11016 oappend (ins
, "DWORD PTR ");
11017 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
11020 oappend (ins
, "TBYTE PTR ");
11025 case evex_x_gscat_mode
:
11026 case evex_x_nobcst_mode
:
11030 switch (ins
->vex
.length
)
11033 oappend (ins
, "XMMWORD PTR ");
11036 oappend (ins
, "YMMWORD PTR ");
11039 oappend (ins
, "ZMMWORD PTR ");
11046 oappend (ins
, "XMMWORD PTR ");
11049 oappend (ins
, "XMMWORD PTR ");
11052 oappend (ins
, "YMMWORD PTR ");
11055 case evex_half_bcst_xmmqh_mode
:
11056 case evex_half_bcst_xmmq_mode
:
11057 if (!ins
->need_vex
)
11060 switch (ins
->vex
.length
)
11063 oappend (ins
, "QWORD PTR ");
11066 oappend (ins
, "XMMWORD PTR ");
11069 oappend (ins
, "YMMWORD PTR ");
11076 if (!ins
->need_vex
)
11079 switch (ins
->vex
.length
)
11082 oappend (ins
, "WORD PTR ");
11085 oappend (ins
, "DWORD PTR ");
11088 oappend (ins
, "QWORD PTR ");
11095 case evex_half_bcst_xmmqdh_mode
:
11096 if (!ins
->need_vex
)
11099 switch (ins
->vex
.length
)
11102 oappend (ins
, "DWORD PTR ");
11105 oappend (ins
, "QWORD PTR ");
11108 oappend (ins
, "XMMWORD PTR ");
11115 if (!ins
->need_vex
)
11118 switch (ins
->vex
.length
)
11121 oappend (ins
, "QWORD PTR ");
11124 oappend (ins
, "YMMWORD PTR ");
11127 oappend (ins
, "ZMMWORD PTR ");
11134 oappend (ins
, "OWORD PTR ");
11136 case vex_vsib_d_w_dq_mode
:
11137 case vex_vsib_q_w_dq_mode
:
11138 if (!ins
->need_vex
)
11141 oappend (ins
, "QWORD PTR ");
11143 oappend (ins
, "DWORD PTR ");
11146 if (!ins
->need_vex
|| ins
->vex
.length
!= 128)
11149 oappend (ins
, "DWORD PTR ");
11151 oappend (ins
, "BYTE PTR ");
11154 if (!ins
->need_vex
)
11157 oappend (ins
, "QWORD PTR ");
11159 oappend (ins
, "WORD PTR ");
11169 print_register (instr_info
*ins
, unsigned int reg
, unsigned int rexmask
,
11170 int bytemode
, int sizeflag
)
11172 const char *const *names
;
11174 USED_REX (rexmask
);
11175 if (ins
->rex
& rexmask
)
11185 names
= att_names8rex
;
11187 names
= att_names8
;
11190 names
= att_names16
;
11195 names
= att_names32
;
11198 names
= att_names64
;
11202 names
= ins
->address_mode
== mode_64bit
? att_names64
: att_names32
;
11205 case bnd_swap_mode
:
11208 oappend (ins
, "(bad)");
11211 names
= att_names_bnd
;
11214 if (ins
->address_mode
== mode_64bit
&& ins
->isa64
== intel64
)
11216 names
= att_names64
;
11219 /* Fall through. */
11221 if (ins
->address_mode
== mode_64bit
&& ((sizeflag
& DFLAG
)
11222 || (ins
->rex
& REX_W
)))
11224 names
= att_names64
;
11228 /* Fall through. */
11233 if (ins
->rex
& REX_W
)
11234 names
= att_names64
;
11235 else if (bytemode
!= v_mode
&& bytemode
!= v_swap_mode
)
11236 names
= att_names32
;
11239 if (sizeflag
& DFLAG
)
11240 names
= att_names32
;
11242 names
= att_names16
;
11243 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
11247 if (!(sizeflag
& DFLAG
) && ins
->isa64
== intel64
)
11248 names
= att_names16
;
11250 names
= att_names32
;
11251 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
11254 names
= (ins
->address_mode
== mode_64bit
11255 ? att_names64
: att_names32
);
11256 if (!(ins
->prefixes
& PREFIX_ADDR
))
11257 names
= (ins
->address_mode
== mode_16bit
11258 ? att_names16
: names
);
11261 /* Remove "addr16/addr32". */
11262 ins
->all_prefixes
[ins
->last_addr_prefix
] = 0;
11263 names
= (ins
->address_mode
!= mode_32bit
11264 ? att_names32
: att_names16
);
11265 ins
->used_prefixes
|= PREFIX_ADDR
;
11272 oappend (ins
, "(bad)");
11275 names
= att_names_mask
;
11280 oappend (ins
, INTERNAL_DISASSEMBLER_ERROR
);
11283 oappend_maybe_intel (ins
, names
[reg
]);
11287 OP_E_memory (instr_info
*ins
, int bytemode
, int sizeflag
)
11290 int add
= (ins
->rex
& REX_B
) ? 8 : 0;
11308 if (ins
->address_mode
!= mode_64bit
)
11316 case vex_vsib_d_w_dq_mode
:
11317 case vex_vsib_q_w_dq_mode
:
11318 case evex_x_gscat_mode
:
11319 shift
= ins
->vex
.w
? 3 : 2;
11322 case evex_half_bcst_xmmqh_mode
:
11323 case evex_half_bcst_xmmqdh_mode
:
11326 shift
= ins
->vex
.w
? 2 : 1;
11329 /* Fall through. */
11331 case evex_half_bcst_xmmq_mode
:
11334 shift
= ins
->vex
.w
? 3 : 2;
11337 /* Fall through. */
11342 case evex_x_nobcst_mode
:
11344 switch (ins
->vex
.length
)
11358 /* Make necessary corrections to shift for modes that need it. */
11359 if (bytemode
== xmmq_mode
11360 || bytemode
== evex_half_bcst_xmmqh_mode
11361 || bytemode
== evex_half_bcst_xmmq_mode
11362 || (bytemode
== ymmq_mode
&& ins
->vex
.length
== 128))
11364 else if (bytemode
== xmmqd_mode
11365 || bytemode
== evex_half_bcst_xmmqdh_mode
)
11367 else if (bytemode
== xmmdw_mode
)
11381 shift
= ins
->vex
.w
? 1 : 0;
11391 if (ins
->intel_syntax
)
11392 intel_operand_size (ins
, bytemode
, sizeflag
);
11395 if ((sizeflag
& AFLAG
) || ins
->address_mode
== mode_64bit
)
11397 /* 32/64 bit address mode */
11405 int addr32flag
= !((sizeflag
& AFLAG
)
11406 || bytemode
== v_bnd_mode
11407 || bytemode
== v_bndmk_mode
11408 || bytemode
== bnd_mode
11409 || bytemode
== bnd_swap_mode
);
11410 bool check_gather
= false;
11411 const char *const *indexes
= NULL
;
11414 base
= ins
->modrm
.rm
;
11418 vindex
= ins
->sib
.index
;
11420 if (ins
->rex
& REX_X
)
11424 case vex_vsib_d_w_dq_mode
:
11425 case vex_vsib_q_w_dq_mode
:
11426 if (!ins
->need_vex
)
11432 check_gather
= ins
->obufp
== ins
->op_out
[1];
11435 switch (ins
->vex
.length
)
11438 indexes
= att_names_xmm
;
11442 || bytemode
== vex_vsib_q_w_dq_mode
)
11443 indexes
= att_names_ymm
;
11445 indexes
= att_names_xmm
;
11449 || bytemode
== vex_vsib_q_w_dq_mode
)
11450 indexes
= att_names_zmm
;
11452 indexes
= att_names_ymm
;
11460 indexes
= ins
->address_mode
== mode_64bit
&& !addr32flag
11461 ? att_names64
: att_names32
;
11464 scale
= ins
->sib
.scale
;
11465 base
= ins
->sib
.base
;
11470 /* Check for mandatory SIB. */
11471 if (bytemode
== vex_vsib_d_w_dq_mode
11472 || bytemode
== vex_vsib_q_w_dq_mode
11473 || bytemode
== vex_sibmem_mode
)
11475 oappend (ins
, "(bad)");
11479 rbase
= base
+ add
;
11481 switch (ins
->modrm
.mod
)
11487 if (ins
->address_mode
== mode_64bit
&& !ins
->has_sib
)
11489 disp
= get32s (ins
);
11490 if (riprel
&& bytemode
== v_bndmk_mode
)
11492 oappend (ins
, "(bad)");
11498 FETCH_DATA (ins
->info
, ins
->codep
+ 1);
11499 disp
= *ins
->codep
++;
11500 if ((disp
& 0x80) != 0)
11502 if (ins
->vex
.evex
&& shift
> 0)
11506 disp
= get32s (ins
);
11515 && ins
->address_mode
!= mode_16bit
)
11517 if (ins
->address_mode
== mode_64bit
)
11521 /* Without base nor index registers, zero-extend the
11522 lower 32-bit displacement to 64 bits. */
11523 disp
= (unsigned int) disp
;
11530 /* In 32-bit mode, we need index register to tell [offset]
11531 from [eiz*1 + offset]. */
11536 havedisp
= (havebase
11538 || (ins
->has_sib
&& (indexes
|| scale
!= 0)));
11540 if (!ins
->intel_syntax
)
11541 if (ins
->modrm
.mod
!= 0 || base
== 5)
11543 if (havedisp
|| riprel
)
11544 print_displacement (ins
, ins
->scratchbuf
, disp
);
11546 print_operand_value (ins
, ins
->scratchbuf
, 1, disp
);
11547 oappend (ins
, ins
->scratchbuf
);
11550 set_op (ins
, disp
, 1);
11551 oappend (ins
, !addr32flag
? "(%rip)" : "(%eip)");
11555 if ((havebase
|| indexes
|| needindex
|| needaddr32
|| riprel
)
11556 && (ins
->address_mode
!= mode_64bit
11557 || ((bytemode
!= v_bnd_mode
)
11558 && (bytemode
!= v_bndmk_mode
)
11559 && (bytemode
!= bnd_mode
)
11560 && (bytemode
!= bnd_swap_mode
))))
11561 ins
->used_prefixes
|= PREFIX_ADDR
;
11563 if (havedisp
|| (ins
->intel_syntax
&& riprel
))
11565 *ins
->obufp
++ = ins
->open_char
;
11566 if (ins
->intel_syntax
&& riprel
)
11568 set_op (ins
, disp
, 1);
11569 oappend (ins
, !addr32flag
? "rip" : "eip");
11571 *ins
->obufp
= '\0';
11573 oappend_maybe_intel (ins
,
11574 (ins
->address_mode
== mode_64bit
&& !addr32flag
11575 ? att_names64
: att_names32
)[rbase
]);
11578 /* ESP/RSP won't allow index. If base isn't ESP/RSP,
11579 print index to tell base + index from base. */
11583 || (havebase
&& base
!= ESP_REG_NUM
))
11585 if (!ins
->intel_syntax
|| havebase
)
11587 *ins
->obufp
++ = ins
->separator_char
;
11588 *ins
->obufp
= '\0';
11592 if (ins
->address_mode
== mode_64bit
|| vindex
< 16)
11593 oappend_maybe_intel (ins
, indexes
[vindex
]);
11595 oappend (ins
, "(bad)");
11598 oappend_maybe_intel (ins
,
11599 ins
->address_mode
== mode_64bit
11600 && !addr32flag
? att_index64
11603 *ins
->obufp
++ = ins
->scale_char
;
11604 *ins
->obufp
= '\0';
11605 sprintf (ins
->scratchbuf
, "%d", 1 << scale
);
11606 oappend (ins
, ins
->scratchbuf
);
11609 if (ins
->intel_syntax
11610 && (disp
|| ins
->modrm
.mod
!= 0 || base
== 5))
11612 if (!havedisp
|| (bfd_signed_vma
) disp
>= 0)
11614 *ins
->obufp
++ = '+';
11615 *ins
->obufp
= '\0';
11617 else if (ins
->modrm
.mod
!= 1 && disp
!= -disp
)
11619 *ins
->obufp
++ = '-';
11620 *ins
->obufp
= '\0';
11621 disp
= - (bfd_signed_vma
) disp
;
11625 print_displacement (ins
, ins
->scratchbuf
, disp
);
11627 print_operand_value (ins
, ins
->scratchbuf
, 1, disp
);
11628 oappend (ins
, ins
->scratchbuf
);
11631 *ins
->obufp
++ = ins
->close_char
;
11632 *ins
->obufp
= '\0';
11636 /* Both XMM/YMM/ZMM registers must be distinct. */
11637 int modrm_reg
= ins
->modrm
.reg
;
11639 if (ins
->rex
& REX_R
)
11643 if (vindex
== modrm_reg
)
11644 oappend (ins
, "/(bad)");
11647 else if (ins
->intel_syntax
)
11649 if (ins
->modrm
.mod
!= 0 || base
== 5)
11651 if (!ins
->active_seg_prefix
)
11653 oappend_maybe_intel (ins
, att_names_seg
[ds_reg
- es_reg
]);
11654 oappend (ins
, ":");
11656 print_operand_value (ins
, ins
->scratchbuf
, 1, disp
);
11657 oappend (ins
, ins
->scratchbuf
);
11661 else if (bytemode
== v_bnd_mode
11662 || bytemode
== v_bndmk_mode
11663 || bytemode
== bnd_mode
11664 || bytemode
== bnd_swap_mode
11665 || bytemode
== vex_vsib_d_w_dq_mode
11666 || bytemode
== vex_vsib_q_w_dq_mode
)
11668 oappend (ins
, "(bad)");
11673 /* 16 bit address mode */
11674 ins
->used_prefixes
|= ins
->prefixes
& PREFIX_ADDR
;
11675 switch (ins
->modrm
.mod
)
11678 if (ins
->modrm
.rm
== 6)
11680 disp
= get16 (ins
);
11681 if ((disp
& 0x8000) != 0)
11686 FETCH_DATA (ins
->info
, ins
->codep
+ 1);
11687 disp
= *ins
->codep
++;
11688 if ((disp
& 0x80) != 0)
11690 if (ins
->vex
.evex
&& shift
> 0)
11694 disp
= get16 (ins
);
11695 if ((disp
& 0x8000) != 0)
11700 if (!ins
->intel_syntax
)
11701 if (ins
->modrm
.mod
!= 0 || ins
->modrm
.rm
== 6)
11703 print_displacement (ins
, ins
->scratchbuf
, disp
);
11704 oappend (ins
, ins
->scratchbuf
);
11707 if (ins
->modrm
.mod
!= 0 || ins
->modrm
.rm
!= 6)
11709 *ins
->obufp
++ = ins
->open_char
;
11710 *ins
->obufp
= '\0';
11712 (ins
->intel_syntax
? intel_index16
11713 : att_index16
)[ins
->modrm
.rm
]);
11714 if (ins
->intel_syntax
11715 && (disp
|| ins
->modrm
.mod
!= 0 || ins
->modrm
.rm
== 6))
11717 if ((bfd_signed_vma
) disp
>= 0)
11719 *ins
->obufp
++ = '+';
11720 *ins
->obufp
= '\0';
11722 else if (ins
->modrm
.mod
!= 1)
11724 *ins
->obufp
++ = '-';
11725 *ins
->obufp
= '\0';
11726 disp
= - (bfd_signed_vma
) disp
;
11729 print_displacement (ins
, ins
->scratchbuf
, disp
);
11730 oappend (ins
, ins
->scratchbuf
);
11733 *ins
->obufp
++ = ins
->close_char
;
11734 *ins
->obufp
= '\0';
11736 else if (ins
->intel_syntax
)
11738 if (!ins
->active_seg_prefix
)
11740 oappend_maybe_intel (ins
, att_names_seg
[ds_reg
- es_reg
]);
11741 oappend (ins
, ":");
11743 print_operand_value (ins
, ins
->scratchbuf
, 1, disp
& 0xffff);
11744 oappend (ins
, ins
->scratchbuf
);
11749 ins
->evex_used
|= EVEX_b_used
;
11751 /* Broadcast can only ever be valid for memory sources. */
11752 if (ins
->obufp
== ins
->op_out
[0])
11753 ins
->vex
.no_broadcast
= true;
11755 if (!ins
->vex
.no_broadcast
)
11757 if (bytemode
== xh_mode
)
11760 oappend (ins
, "{bad}");
11763 switch (ins
->vex
.length
)
11766 oappend (ins
, "{1to8}");
11769 oappend (ins
, "{1to16}");
11772 oappend (ins
, "{1to32}");
11779 else if (bytemode
== q_mode
11780 || bytemode
== ymmq_mode
)
11781 ins
->vex
.no_broadcast
= true;
11782 else if (ins
->vex
.w
11783 || bytemode
== evex_half_bcst_xmmqdh_mode
11784 || bytemode
== evex_half_bcst_xmmq_mode
)
11786 switch (ins
->vex
.length
)
11789 oappend (ins
, "{1to2}");
11792 oappend (ins
, "{1to4}");
11795 oappend (ins
, "{1to8}");
11801 else if (bytemode
== x_mode
11802 || bytemode
== evex_half_bcst_xmmqh_mode
)
11804 switch (ins
->vex
.length
)
11807 oappend (ins
, "{1to4}");
11810 oappend (ins
, "{1to8}");
11813 oappend (ins
, "{1to16}");
11820 ins
->vex
.no_broadcast
= true;
11822 if (ins
->vex
.no_broadcast
)
11823 oappend (ins
, "{bad}");
11828 OP_E (instr_info
*ins
, int bytemode
, int sizeflag
)
11830 /* Skip mod/rm byte. */
11834 if (ins
->modrm
.mod
== 3)
11836 if ((sizeflag
& SUFFIX_ALWAYS
)
11837 && (bytemode
== b_swap_mode
11838 || bytemode
== bnd_swap_mode
11839 || bytemode
== v_swap_mode
))
11840 swap_operand (ins
);
11842 print_register (ins
, ins
->modrm
.rm
, REX_B
, bytemode
, sizeflag
);
11845 OP_E_memory (ins
, bytemode
, sizeflag
);
11849 OP_G (instr_info
*ins
, int bytemode
, int sizeflag
)
11851 if (ins
->vex
.evex
&& !ins
->vex
.r
&& ins
->address_mode
== mode_64bit
)
11853 oappend (ins
, "(bad)");
11857 print_register (ins
, ins
->modrm
.reg
, REX_R
, bytemode
, sizeflag
);
11862 get64 (instr_info
*ins
)
11868 FETCH_DATA (ins
->info
, ins
->codep
+ 8);
11869 a
= *ins
->codep
++ & 0xff;
11870 a
|= (*ins
->codep
++ & 0xff) << 8;
11871 a
|= (*ins
->codep
++ & 0xff) << 16;
11872 a
|= (*ins
->codep
++ & 0xffu
) << 24;
11873 b
= *ins
->codep
++ & 0xff;
11874 b
|= (*ins
->codep
++ & 0xff) << 8;
11875 b
|= (*ins
->codep
++ & 0xff) << 16;
11876 b
|= (*ins
->codep
++ & 0xffu
) << 24;
11877 x
= a
+ ((bfd_vma
) b
<< 32);
11882 get64 (instr_info
*ins ATTRIBUTE_UNUSED
)
11889 static bfd_signed_vma
11890 get32 (instr_info
*ins
)
11892 bfd_signed_vma x
= 0;
11894 FETCH_DATA (ins
->info
, ins
->codep
+ 4);
11895 x
= *ins
->codep
++ & (bfd_signed_vma
) 0xff;
11896 x
|= (*ins
->codep
++ & (bfd_signed_vma
) 0xff) << 8;
11897 x
|= (*ins
->codep
++ & (bfd_signed_vma
) 0xff) << 16;
11898 x
|= (*ins
->codep
++ & (bfd_signed_vma
) 0xff) << 24;
11902 static bfd_signed_vma
11903 get32s (instr_info
*ins
)
11905 bfd_signed_vma x
= 0;
11907 FETCH_DATA (ins
->info
, ins
->codep
+ 4);
11908 x
= *ins
->codep
++ & (bfd_signed_vma
) 0xff;
11909 x
|= (*ins
->codep
++ & (bfd_signed_vma
) 0xff) << 8;
11910 x
|= (*ins
->codep
++ & (bfd_signed_vma
) 0xff) << 16;
11911 x
|= (*ins
->codep
++ & (bfd_signed_vma
) 0xff) << 24;
11913 x
= (x
^ ((bfd_signed_vma
) 1 << 31)) - ((bfd_signed_vma
) 1 << 31);
11919 get16 (instr_info
*ins
)
11923 FETCH_DATA (ins
->info
, ins
->codep
+ 2);
11924 x
= *ins
->codep
++ & 0xff;
11925 x
|= (*ins
->codep
++ & 0xff) << 8;
11930 set_op (instr_info
*ins
, bfd_vma op
, int riprel
)
11932 ins
->op_index
[ins
->op_ad
] = ins
->op_ad
;
11933 if (ins
->address_mode
== mode_64bit
)
11935 ins
->op_address
[ins
->op_ad
] = op
;
11936 ins
->op_riprel
[ins
->op_ad
] = riprel
;
11940 /* Mask to get a 32-bit address. */
11941 ins
->op_address
[ins
->op_ad
] = op
& 0xffffffff;
11942 ins
->op_riprel
[ins
->op_ad
] = riprel
& 0xffffffff;
11947 OP_REG (instr_info
*ins
, int code
, int sizeflag
)
11954 case es_reg
: case ss_reg
: case cs_reg
:
11955 case ds_reg
: case fs_reg
: case gs_reg
:
11956 oappend_maybe_intel (ins
, att_names_seg
[code
- es_reg
]);
11961 if (ins
->rex
& REX_B
)
11968 case ax_reg
: case cx_reg
: case dx_reg
: case bx_reg
:
11969 case sp_reg
: case bp_reg
: case si_reg
: case di_reg
:
11970 s
= att_names16
[code
- ax_reg
+ add
];
11972 case ah_reg
: case ch_reg
: case dh_reg
: case bh_reg
:
11974 /* Fall through. */
11975 case al_reg
: case cl_reg
: case dl_reg
: case bl_reg
:
11977 s
= att_names8rex
[code
- al_reg
+ add
];
11979 s
= att_names8
[code
- al_reg
];
11981 case rAX_reg
: case rCX_reg
: case rDX_reg
: case rBX_reg
:
11982 case rSP_reg
: case rBP_reg
: case rSI_reg
: case rDI_reg
:
11983 if (ins
->address_mode
== mode_64bit
11984 && ((sizeflag
& DFLAG
) || (ins
->rex
& REX_W
)))
11986 s
= att_names64
[code
- rAX_reg
+ add
];
11989 code
+= eAX_reg
- rAX_reg
;
11990 /* Fall through. */
11991 case eAX_reg
: case eCX_reg
: case eDX_reg
: case eBX_reg
:
11992 case eSP_reg
: case eBP_reg
: case eSI_reg
: case eDI_reg
:
11994 if (ins
->rex
& REX_W
)
11995 s
= att_names64
[code
- eAX_reg
+ add
];
11998 if (sizeflag
& DFLAG
)
11999 s
= att_names32
[code
- eAX_reg
+ add
];
12001 s
= att_names16
[code
- eAX_reg
+ add
];
12002 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
12006 oappend (ins
, INTERNAL_DISASSEMBLER_ERROR
);
12009 oappend_maybe_intel (ins
, s
);
12013 OP_IMREG (instr_info
*ins
, int code
, int sizeflag
)
12020 if (!ins
->intel_syntax
)
12022 oappend (ins
, "(%dx)");
12025 s
= att_names16
[dx_reg
- ax_reg
];
12027 case al_reg
: case cl_reg
:
12028 s
= att_names8
[code
- al_reg
];
12032 if (ins
->rex
& REX_W
)
12037 /* Fall through. */
12038 case z_mode_ax_reg
:
12039 if ((ins
->rex
& REX_W
) || (sizeflag
& DFLAG
))
12043 if (!(ins
->rex
& REX_W
))
12044 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
12047 oappend (ins
, INTERNAL_DISASSEMBLER_ERROR
);
12050 oappend_maybe_intel (ins
, s
);
12054 OP_I (instr_info
*ins
, int bytemode
, int sizeflag
)
12057 bfd_signed_vma mask
= -1;
12062 FETCH_DATA (ins
->info
, ins
->codep
+ 1);
12063 op
= *ins
->codep
++;
12068 if (ins
->rex
& REX_W
)
12072 if (sizeflag
& DFLAG
)
12082 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
12094 if (ins
->intel_syntax
)
12095 oappend (ins
, "1");
12098 oappend (ins
, INTERNAL_DISASSEMBLER_ERROR
);
12103 ins
->scratchbuf
[0] = '$';
12104 print_operand_value (ins
, ins
->scratchbuf
+ 1, 1, op
);
12105 oappend_maybe_intel (ins
, ins
->scratchbuf
);
12106 ins
->scratchbuf
[0] = '\0';
12110 OP_I64 (instr_info
*ins
, int bytemode
, int sizeflag
)
12112 if (bytemode
!= v_mode
|| ins
->address_mode
!= mode_64bit
12113 || !(ins
->rex
& REX_W
))
12115 OP_I (ins
, bytemode
, sizeflag
);
12121 ins
->scratchbuf
[0] = '$';
12122 print_operand_value (ins
, ins
->scratchbuf
+ 1, 1, get64 (ins
));
12123 oappend_maybe_intel (ins
, ins
->scratchbuf
);
12124 ins
->scratchbuf
[0] = '\0';
12128 OP_sI (instr_info
*ins
, int bytemode
, int sizeflag
)
12136 FETCH_DATA (ins
->info
, ins
->codep
+ 1);
12137 op
= *ins
->codep
++;
12138 if ((op
& 0x80) != 0)
12140 if (bytemode
== b_T_mode
)
12142 if (ins
->address_mode
!= mode_64bit
12143 || !((sizeflag
& DFLAG
) || (ins
->rex
& REX_W
)))
12145 /* The operand-size prefix is overridden by a REX prefix. */
12146 if ((sizeflag
& DFLAG
) || (ins
->rex
& REX_W
))
12154 if (!(ins
->rex
& REX_W
))
12156 if (sizeflag
& DFLAG
)
12164 /* The operand-size prefix is overridden by a REX prefix. */
12165 if ((sizeflag
& DFLAG
) || (ins
->rex
& REX_W
))
12171 oappend (ins
, INTERNAL_DISASSEMBLER_ERROR
);
12175 ins
->scratchbuf
[0] = '$';
12176 print_operand_value (ins
, ins
->scratchbuf
+ 1, 1, op
);
12177 oappend_maybe_intel (ins
, ins
->scratchbuf
);
12181 OP_J (instr_info
*ins
, int bytemode
, int sizeflag
)
12185 bfd_vma segment
= 0;
12190 FETCH_DATA (ins
->info
, ins
->codep
+ 1);
12191 disp
= *ins
->codep
++;
12192 if ((disp
& 0x80) != 0)
12197 if ((sizeflag
& DFLAG
)
12198 || (ins
->address_mode
== mode_64bit
12199 && ((ins
->isa64
== intel64
&& bytemode
!= dqw_mode
)
12200 || (ins
->rex
& REX_W
))))
12201 disp
= get32s (ins
);
12204 disp
= get16 (ins
);
12205 if ((disp
& 0x8000) != 0)
12207 /* In 16bit mode, address is wrapped around at 64k within
12208 the same segment. Otherwise, a data16 prefix on a jump
12209 instruction means that the pc is masked to 16 bits after
12210 the displacement is added! */
12212 if ((ins
->prefixes
& PREFIX_DATA
) == 0)
12213 segment
= ((ins
->start_pc
+ (ins
->codep
- ins
->start_codep
))
12214 & ~((bfd_vma
) 0xffff));
12216 if (ins
->address_mode
!= mode_64bit
12217 || (ins
->isa64
!= intel64
&& !(ins
->rex
& REX_W
)))
12218 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
12221 oappend (ins
, INTERNAL_DISASSEMBLER_ERROR
);
12224 disp
= ((ins
->start_pc
+ (ins
->codep
- ins
->start_codep
) + disp
) & mask
)
12226 set_op (ins
, disp
, 0);
12227 print_operand_value (ins
, ins
->scratchbuf
, 1, disp
);
12228 oappend (ins
, ins
->scratchbuf
);
12232 OP_SEG (instr_info
*ins
, int bytemode
, int sizeflag
)
12234 if (bytemode
== w_mode
)
12235 oappend_maybe_intel (ins
, att_names_seg
[ins
->modrm
.reg
]);
12237 OP_E (ins
, ins
->modrm
.mod
== 3 ? bytemode
: w_mode
, sizeflag
);
12241 OP_DIR (instr_info
*ins
, int dummy ATTRIBUTE_UNUSED
, int sizeflag
)
12245 if (sizeflag
& DFLAG
)
12247 offset
= get32 (ins
);
12252 offset
= get16 (ins
);
12255 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
12256 if (ins
->intel_syntax
)
12257 sprintf (ins
->scratchbuf
, "0x%x:0x%x", seg
, offset
);
12259 sprintf (ins
->scratchbuf
, "$0x%x,$0x%x", seg
, offset
);
12260 oappend (ins
, ins
->scratchbuf
);
12264 OP_OFF (instr_info
*ins
, int bytemode
, int sizeflag
)
12268 if (ins
->intel_syntax
&& (sizeflag
& SUFFIX_ALWAYS
))
12269 intel_operand_size (ins
, bytemode
, sizeflag
);
12272 if ((sizeflag
& AFLAG
) || ins
->address_mode
== mode_64bit
)
12277 if (ins
->intel_syntax
)
12279 if (!ins
->active_seg_prefix
)
12281 oappend_maybe_intel (ins
, att_names_seg
[ds_reg
- es_reg
]);
12282 oappend (ins
, ":");
12285 print_operand_value (ins
, ins
->scratchbuf
, 1, off
);
12286 oappend (ins
, ins
->scratchbuf
);
12290 OP_OFF64 (instr_info
*ins
, int bytemode
, int sizeflag
)
12294 if (ins
->address_mode
!= mode_64bit
12295 || (ins
->prefixes
& PREFIX_ADDR
))
12297 OP_OFF (ins
, bytemode
, sizeflag
);
12301 if (ins
->intel_syntax
&& (sizeflag
& SUFFIX_ALWAYS
))
12302 intel_operand_size (ins
, bytemode
, sizeflag
);
12307 if (ins
->intel_syntax
)
12309 if (!ins
->active_seg_prefix
)
12311 oappend_maybe_intel (ins
, att_names_seg
[ds_reg
- es_reg
]);
12312 oappend (ins
, ":");
12315 print_operand_value (ins
, ins
->scratchbuf
, 1, off
);
12316 oappend (ins
, ins
->scratchbuf
);
12320 ptr_reg (instr_info
*ins
, int code
, int sizeflag
)
12324 *ins
->obufp
++ = ins
->open_char
;
12325 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_ADDR
);
12326 if (ins
->address_mode
== mode_64bit
)
12328 if (!(sizeflag
& AFLAG
))
12329 s
= att_names32
[code
- eAX_reg
];
12331 s
= att_names64
[code
- eAX_reg
];
12333 else if (sizeflag
& AFLAG
)
12334 s
= att_names32
[code
- eAX_reg
];
12336 s
= att_names16
[code
- eAX_reg
];
12337 oappend_maybe_intel (ins
, s
);
12338 *ins
->obufp
++ = ins
->close_char
;
12343 OP_ESreg (instr_info
*ins
, int code
, int sizeflag
)
12345 if (ins
->intel_syntax
)
12347 switch (ins
->codep
[-1])
12349 case 0x6d: /* insw/insl */
12350 intel_operand_size (ins
, z_mode
, sizeflag
);
12352 case 0xa5: /* movsw/movsl/movsq */
12353 case 0xa7: /* cmpsw/cmpsl/cmpsq */
12354 case 0xab: /* stosw/stosl */
12355 case 0xaf: /* scasw/scasl */
12356 intel_operand_size (ins
, v_mode
, sizeflag
);
12359 intel_operand_size (ins
, b_mode
, sizeflag
);
12362 oappend_maybe_intel (ins
, "%es:");
12363 ptr_reg (ins
, code
, sizeflag
);
12367 OP_DSreg (instr_info
*ins
, int code
, int sizeflag
)
12369 if (ins
->intel_syntax
)
12371 switch (ins
->codep
[-1])
12373 case 0x6f: /* outsw/outsl */
12374 intel_operand_size (ins
, z_mode
, sizeflag
);
12376 case 0xa5: /* movsw/movsl/movsq */
12377 case 0xa7: /* cmpsw/cmpsl/cmpsq */
12378 case 0xad: /* lodsw/lodsl/lodsq */
12379 intel_operand_size (ins
, v_mode
, sizeflag
);
12382 intel_operand_size (ins
, b_mode
, sizeflag
);
12385 /* Set ins->active_seg_prefix to PREFIX_DS if it is unset so that the
12386 default segment register DS is printed. */
12387 if (!ins
->active_seg_prefix
)
12388 ins
->active_seg_prefix
= PREFIX_DS
;
12390 ptr_reg (ins
, code
, sizeflag
);
12394 OP_C (instr_info
*ins
, int dummy ATTRIBUTE_UNUSED
,
12395 int sizeflag ATTRIBUTE_UNUSED
)
12398 if (ins
->rex
& REX_R
)
12403 else if (ins
->address_mode
!= mode_64bit
&& (ins
->prefixes
& PREFIX_LOCK
))
12405 ins
->all_prefixes
[ins
->last_lock_prefix
] = 0;
12406 ins
->used_prefixes
|= PREFIX_LOCK
;
12411 sprintf (ins
->scratchbuf
, "%%cr%d", ins
->modrm
.reg
+ add
);
12412 oappend_maybe_intel (ins
, ins
->scratchbuf
);
12416 OP_D (instr_info
*ins
, int dummy ATTRIBUTE_UNUSED
,
12417 int sizeflag ATTRIBUTE_UNUSED
)
12421 if (ins
->rex
& REX_R
)
12425 if (ins
->intel_syntax
)
12426 sprintf (ins
->scratchbuf
, "dr%d", ins
->modrm
.reg
+ add
);
12428 sprintf (ins
->scratchbuf
, "%%db%d", ins
->modrm
.reg
+ add
);
12429 oappend (ins
, ins
->scratchbuf
);
12433 OP_T (instr_info
*ins
, int dummy ATTRIBUTE_UNUSED
,
12434 int sizeflag ATTRIBUTE_UNUSED
)
12436 sprintf (ins
->scratchbuf
, "%%tr%d", ins
->modrm
.reg
);
12437 oappend_maybe_intel (ins
, ins
->scratchbuf
);
12441 OP_MMX (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
12442 int sizeflag ATTRIBUTE_UNUSED
)
12444 int reg
= ins
->modrm
.reg
;
12445 const char *const *names
;
12447 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
12448 if (ins
->prefixes
& PREFIX_DATA
)
12450 names
= att_names_xmm
;
12452 if (ins
->rex
& REX_R
)
12456 names
= att_names_mm
;
12457 oappend_maybe_intel (ins
, names
[reg
]);
12461 print_vector_reg (instr_info
*ins
, unsigned int reg
, int bytemode
)
12463 const char *const *names
;
12465 if (bytemode
== xmmq_mode
12466 || bytemode
== evex_half_bcst_xmmqh_mode
12467 || bytemode
== evex_half_bcst_xmmq_mode
)
12469 switch (ins
->vex
.length
)
12473 names
= att_names_xmm
;
12476 names
= att_names_ymm
;
12482 else if (bytemode
== ymm_mode
)
12483 names
= att_names_ymm
;
12484 else if (bytemode
== tmm_mode
)
12488 oappend (ins
, "(bad)");
12491 names
= att_names_tmm
;
12493 else if (ins
->need_vex
12494 && bytemode
!= xmm_mode
12495 && bytemode
!= scalar_mode
12496 && bytemode
!= xmmdw_mode
12497 && bytemode
!= xmmqd_mode
12498 && bytemode
!= evex_half_bcst_xmmqdh_mode
12499 && bytemode
!= w_swap_mode
12500 && bytemode
!= b_mode
12501 && bytemode
!= w_mode
12502 && bytemode
!= d_mode
12503 && bytemode
!= q_mode
)
12505 switch (ins
->vex
.length
)
12508 names
= att_names_xmm
;
12512 || bytemode
!= vex_vsib_q_w_dq_mode
)
12513 names
= att_names_ymm
;
12515 names
= att_names_xmm
;
12519 || bytemode
!= vex_vsib_q_w_dq_mode
)
12520 names
= att_names_zmm
;
12522 names
= att_names_ymm
;
12529 names
= att_names_xmm
;
12530 oappend_maybe_intel (ins
, names
[reg
]);
12534 OP_XMM (instr_info
*ins
, int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
12536 unsigned int reg
= ins
->modrm
.reg
;
12539 if (ins
->rex
& REX_R
)
12547 if (bytemode
== tmm_mode
)
12548 ins
->modrm
.reg
= reg
;
12549 else if (bytemode
== scalar_mode
)
12550 ins
->vex
.no_broadcast
= true;
12552 print_vector_reg (ins
, reg
, bytemode
);
12556 OP_EM (instr_info
*ins
, int bytemode
, int sizeflag
)
12559 const char *const *names
;
12561 if (ins
->modrm
.mod
!= 3)
12563 if (ins
->intel_syntax
12564 && (bytemode
== v_mode
|| bytemode
== v_swap_mode
))
12566 bytemode
= (ins
->prefixes
& PREFIX_DATA
) ? x_mode
: q_mode
;
12567 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
12569 OP_E (ins
, bytemode
, sizeflag
);
12573 if ((sizeflag
& SUFFIX_ALWAYS
) && bytemode
== v_swap_mode
)
12574 swap_operand (ins
);
12576 /* Skip mod/rm byte. */
12579 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
12580 reg
= ins
->modrm
.rm
;
12581 if (ins
->prefixes
& PREFIX_DATA
)
12583 names
= att_names_xmm
;
12585 if (ins
->rex
& REX_B
)
12589 names
= att_names_mm
;
12590 oappend_maybe_intel (ins
, names
[reg
]);
12593 /* cvt* are the only instructions in sse2 which have
12594 both SSE and MMX operands and also have 0x66 prefix
12595 in their opcode. 0x66 was originally used to differentiate
12596 between SSE and MMX instruction(operands). So we have to handle the
12597 cvt* separately using OP_EMC and OP_MXC */
12599 OP_EMC (instr_info
*ins
, int bytemode
, int sizeflag
)
12601 if (ins
->modrm
.mod
!= 3)
12603 if (ins
->intel_syntax
&& bytemode
== v_mode
)
12605 bytemode
= (ins
->prefixes
& PREFIX_DATA
) ? x_mode
: q_mode
;
12606 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
12608 OP_E (ins
, bytemode
, sizeflag
);
12612 /* Skip mod/rm byte. */
12615 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
12616 oappend_maybe_intel (ins
, att_names_mm
[ins
->modrm
.rm
]);
12620 OP_MXC (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
12621 int sizeflag ATTRIBUTE_UNUSED
)
12623 ins
->used_prefixes
|= (ins
->prefixes
& PREFIX_DATA
);
12624 oappend_maybe_intel (ins
, att_names_mm
[ins
->modrm
.reg
]);
12628 OP_EX (instr_info
*ins
, int bytemode
, int sizeflag
)
12632 /* Skip mod/rm byte. */
12636 if (bytemode
== dq_mode
)
12637 bytemode
= ins
->vex
.w
? q_mode
: d_mode
;
12639 if (ins
->modrm
.mod
!= 3)
12641 OP_E_memory (ins
, bytemode
, sizeflag
);
12645 reg
= ins
->modrm
.rm
;
12647 if (ins
->rex
& REX_B
)
12652 if ((ins
->rex
& REX_X
))
12656 if ((sizeflag
& SUFFIX_ALWAYS
)
12657 && (bytemode
== x_swap_mode
12658 || bytemode
== w_swap_mode
12659 || bytemode
== d_swap_mode
12660 || bytemode
== q_swap_mode
))
12661 swap_operand (ins
);
12663 if (bytemode
== tmm_mode
)
12664 ins
->modrm
.rm
= reg
;
12666 print_vector_reg (ins
, reg
, bytemode
);
12670 OP_MS (instr_info
*ins
, int bytemode
, int sizeflag
)
12672 if (ins
->modrm
.mod
== 3)
12673 OP_EM (ins
, bytemode
, sizeflag
);
12679 OP_XS (instr_info
*ins
, int bytemode
, int sizeflag
)
12681 if (ins
->modrm
.mod
== 3)
12682 OP_EX (ins
, bytemode
, sizeflag
);
12688 OP_M (instr_info
*ins
, int bytemode
, int sizeflag
)
12690 if (ins
->modrm
.mod
== 3)
12691 /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
12694 OP_E (ins
, bytemode
, sizeflag
);
12698 OP_0f07 (instr_info
*ins
, int bytemode
, int sizeflag
)
12700 if (ins
->modrm
.mod
!= 3 || ins
->modrm
.rm
!= 0)
12703 OP_E (ins
, bytemode
, sizeflag
);
12706 /* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
12707 32bit mode and "xchg %rax,%rax" in 64bit mode. */
12710 NOP_Fixup1 (instr_info
*ins
, int bytemode
, int sizeflag
)
12712 if ((ins
->prefixes
& PREFIX_DATA
) != 0
12714 && ins
->rex
!= 0x48
12715 && ins
->address_mode
== mode_64bit
))
12716 OP_REG (ins
, bytemode
, sizeflag
);
12718 strcpy (ins
->obuf
, "nop");
12722 NOP_Fixup2 (instr_info
*ins
, int bytemode
, int sizeflag
)
12724 if ((ins
->prefixes
& PREFIX_DATA
) != 0
12726 && ins
->rex
!= 0x48
12727 && ins
->address_mode
== mode_64bit
))
12728 OP_IMREG (ins
, bytemode
, sizeflag
);
12731 static const char *const Suffix3DNow
[] = {
12732 /* 00 */ NULL
, NULL
, NULL
, NULL
,
12733 /* 04 */ NULL
, NULL
, NULL
, NULL
,
12734 /* 08 */ NULL
, NULL
, NULL
, NULL
,
12735 /* 0C */ "pi2fw", "pi2fd", NULL
, NULL
,
12736 /* 10 */ NULL
, NULL
, NULL
, NULL
,
12737 /* 14 */ NULL
, NULL
, NULL
, NULL
,
12738 /* 18 */ NULL
, NULL
, NULL
, NULL
,
12739 /* 1C */ "pf2iw", "pf2id", NULL
, NULL
,
12740 /* 20 */ NULL
, NULL
, NULL
, NULL
,
12741 /* 24 */ NULL
, NULL
, NULL
, NULL
,
12742 /* 28 */ NULL
, NULL
, NULL
, NULL
,
12743 /* 2C */ NULL
, NULL
, NULL
, NULL
,
12744 /* 30 */ NULL
, NULL
, NULL
, NULL
,
12745 /* 34 */ NULL
, NULL
, NULL
, NULL
,
12746 /* 38 */ NULL
, NULL
, NULL
, NULL
,
12747 /* 3C */ NULL
, NULL
, NULL
, NULL
,
12748 /* 40 */ NULL
, NULL
, NULL
, NULL
,
12749 /* 44 */ NULL
, NULL
, NULL
, NULL
,
12750 /* 48 */ NULL
, NULL
, NULL
, NULL
,
12751 /* 4C */ NULL
, NULL
, NULL
, NULL
,
12752 /* 50 */ NULL
, NULL
, NULL
, NULL
,
12753 /* 54 */ NULL
, NULL
, NULL
, NULL
,
12754 /* 58 */ NULL
, NULL
, NULL
, NULL
,
12755 /* 5C */ NULL
, NULL
, NULL
, NULL
,
12756 /* 60 */ NULL
, NULL
, NULL
, NULL
,
12757 /* 64 */ NULL
, NULL
, NULL
, NULL
,
12758 /* 68 */ NULL
, NULL
, NULL
, NULL
,
12759 /* 6C */ NULL
, NULL
, NULL
, NULL
,
12760 /* 70 */ NULL
, NULL
, NULL
, NULL
,
12761 /* 74 */ NULL
, NULL
, NULL
, NULL
,
12762 /* 78 */ NULL
, NULL
, NULL
, NULL
,
12763 /* 7C */ NULL
, NULL
, NULL
, NULL
,
12764 /* 80 */ NULL
, NULL
, NULL
, NULL
,
12765 /* 84 */ NULL
, NULL
, NULL
, NULL
,
12766 /* 88 */ NULL
, NULL
, "pfnacc", NULL
,
12767 /* 8C */ NULL
, NULL
, "pfpnacc", NULL
,
12768 /* 90 */ "pfcmpge", NULL
, NULL
, NULL
,
12769 /* 94 */ "pfmin", NULL
, "pfrcp", "pfrsqrt",
12770 /* 98 */ NULL
, NULL
, "pfsub", NULL
,
12771 /* 9C */ NULL
, NULL
, "pfadd", NULL
,
12772 /* A0 */ "pfcmpgt", NULL
, NULL
, NULL
,
12773 /* A4 */ "pfmax", NULL
, "pfrcpit1", "pfrsqit1",
12774 /* A8 */ NULL
, NULL
, "pfsubr", NULL
,
12775 /* AC */ NULL
, NULL
, "pfacc", NULL
,
12776 /* B0 */ "pfcmpeq", NULL
, NULL
, NULL
,
12777 /* B4 */ "pfmul", NULL
, "pfrcpit2", "pmulhrw",
12778 /* B8 */ NULL
, NULL
, NULL
, "pswapd",
12779 /* BC */ NULL
, NULL
, NULL
, "pavgusb",
12780 /* C0 */ NULL
, NULL
, NULL
, NULL
,
12781 /* C4 */ NULL
, NULL
, NULL
, NULL
,
12782 /* C8 */ NULL
, NULL
, NULL
, NULL
,
12783 /* CC */ NULL
, NULL
, NULL
, NULL
,
12784 /* D0 */ NULL
, NULL
, NULL
, NULL
,
12785 /* D4 */ NULL
, NULL
, NULL
, NULL
,
12786 /* D8 */ NULL
, NULL
, NULL
, NULL
,
12787 /* DC */ NULL
, NULL
, NULL
, NULL
,
12788 /* E0 */ NULL
, NULL
, NULL
, NULL
,
12789 /* E4 */ NULL
, NULL
, NULL
, NULL
,
12790 /* E8 */ NULL
, NULL
, NULL
, NULL
,
12791 /* EC */ NULL
, NULL
, NULL
, NULL
,
12792 /* F0 */ NULL
, NULL
, NULL
, NULL
,
12793 /* F4 */ NULL
, NULL
, NULL
, NULL
,
12794 /* F8 */ NULL
, NULL
, NULL
, NULL
,
12795 /* FC */ NULL
, NULL
, NULL
, NULL
,
12799 OP_3DNowSuffix (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
12800 int sizeflag ATTRIBUTE_UNUSED
)
12802 const char *mnemonic
;
12804 FETCH_DATA (ins
->info
, ins
->codep
+ 1);
12805 /* AMD 3DNow! instructions are specified by an opcode suffix in the
12806 place where an 8-bit immediate would normally go. ie. the last
12807 byte of the instruction. */
12808 ins
->obufp
= ins
->mnemonicendp
;
12809 mnemonic
= Suffix3DNow
[*ins
->codep
++ & 0xff];
12811 oappend (ins
, mnemonic
);
12814 /* Since a variable sized ins->modrm/ins->sib chunk is between the start
12815 of the opcode (0x0f0f) and the opcode suffix, we need to do
12816 all the ins->modrm processing first, and don't know until now that
12817 we have a bad opcode. This necessitates some cleaning up. */
12818 ins
->op_out
[0][0] = '\0';
12819 ins
->op_out
[1][0] = '\0';
12822 ins
->mnemonicendp
= ins
->obufp
;
12825 static const struct op simd_cmp_op
[] =
12827 { STRING_COMMA_LEN ("eq") },
12828 { STRING_COMMA_LEN ("lt") },
12829 { STRING_COMMA_LEN ("le") },
12830 { STRING_COMMA_LEN ("unord") },
12831 { STRING_COMMA_LEN ("neq") },
12832 { STRING_COMMA_LEN ("nlt") },
12833 { STRING_COMMA_LEN ("nle") },
12834 { STRING_COMMA_LEN ("ord") }
12837 static const struct op vex_cmp_op
[] =
12839 { STRING_COMMA_LEN ("eq_uq") },
12840 { STRING_COMMA_LEN ("nge") },
12841 { STRING_COMMA_LEN ("ngt") },
12842 { STRING_COMMA_LEN ("false") },
12843 { STRING_COMMA_LEN ("neq_oq") },
12844 { STRING_COMMA_LEN ("ge") },
12845 { STRING_COMMA_LEN ("gt") },
12846 { STRING_COMMA_LEN ("true") },
12847 { STRING_COMMA_LEN ("eq_os") },
12848 { STRING_COMMA_LEN ("lt_oq") },
12849 { STRING_COMMA_LEN ("le_oq") },
12850 { STRING_COMMA_LEN ("unord_s") },
12851 { STRING_COMMA_LEN ("neq_us") },
12852 { STRING_COMMA_LEN ("nlt_uq") },
12853 { STRING_COMMA_LEN ("nle_uq") },
12854 { STRING_COMMA_LEN ("ord_s") },
12855 { STRING_COMMA_LEN ("eq_us") },
12856 { STRING_COMMA_LEN ("nge_uq") },
12857 { STRING_COMMA_LEN ("ngt_uq") },
12858 { STRING_COMMA_LEN ("false_os") },
12859 { STRING_COMMA_LEN ("neq_os") },
12860 { STRING_COMMA_LEN ("ge_oq") },
12861 { STRING_COMMA_LEN ("gt_oq") },
12862 { STRING_COMMA_LEN ("true_us") },
12866 CMP_Fixup (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
12867 int sizeflag ATTRIBUTE_UNUSED
)
12869 unsigned int cmp_type
;
12871 FETCH_DATA (ins
->info
, ins
->codep
+ 1);
12872 cmp_type
= *ins
->codep
++ & 0xff;
12873 if (cmp_type
< ARRAY_SIZE (simd_cmp_op
))
12876 char *p
= ins
->mnemonicendp
- 2;
12880 sprintf (p
, "%s%s", simd_cmp_op
[cmp_type
].name
, suffix
);
12881 ins
->mnemonicendp
+= simd_cmp_op
[cmp_type
].len
;
12883 else if (ins
->need_vex
12884 && cmp_type
< ARRAY_SIZE (simd_cmp_op
) + ARRAY_SIZE (vex_cmp_op
))
12887 char *p
= ins
->mnemonicendp
- 2;
12891 cmp_type
-= ARRAY_SIZE (simd_cmp_op
);
12892 sprintf (p
, "%s%s", vex_cmp_op
[cmp_type
].name
, suffix
);
12893 ins
->mnemonicendp
+= vex_cmp_op
[cmp_type
].len
;
12897 /* We have a reserved extension byte. Output it directly. */
12898 ins
->scratchbuf
[0] = '$';
12899 print_operand_value (ins
, ins
->scratchbuf
+ 1, 1, cmp_type
);
12900 oappend_maybe_intel (ins
, ins
->scratchbuf
);
12901 ins
->scratchbuf
[0] = '\0';
12906 OP_Mwait (instr_info
*ins
, int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
12908 /* mwait %eax,%ecx / mwaitx %eax,%ecx,%ebx */
12909 if (!ins
->intel_syntax
)
12911 strcpy (ins
->op_out
[0], att_names32
[0] + ins
->intel_syntax
);
12912 strcpy (ins
->op_out
[1], att_names32
[1] + ins
->intel_syntax
);
12913 if (bytemode
== eBX_reg
)
12914 strcpy (ins
->op_out
[2], att_names32
[3] + ins
->intel_syntax
);
12915 ins
->two_source_ops
= true;
12917 /* Skip mod/rm byte. */
12923 OP_Monitor (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
12924 int sizeflag ATTRIBUTE_UNUSED
)
12926 /* monitor %{e,r,}ax,%ecx,%edx" */
12927 if (!ins
->intel_syntax
)
12929 const char *const *names
= (ins
->address_mode
== mode_64bit
12930 ? att_names64
: att_names32
);
12932 if (ins
->prefixes
& PREFIX_ADDR
)
12934 /* Remove "addr16/addr32". */
12935 ins
->all_prefixes
[ins
->last_addr_prefix
] = 0;
12936 names
= (ins
->address_mode
!= mode_32bit
12937 ? att_names32
: att_names16
);
12938 ins
->used_prefixes
|= PREFIX_ADDR
;
12940 else if (ins
->address_mode
== mode_16bit
)
12941 names
= att_names16
;
12942 strcpy (ins
->op_out
[0], names
[0] + ins
->intel_syntax
);
12943 strcpy (ins
->op_out
[1], att_names32
[1] + ins
->intel_syntax
);
12944 strcpy (ins
->op_out
[2], att_names32
[2] + ins
->intel_syntax
);
12945 ins
->two_source_ops
= true;
12947 /* Skip mod/rm byte. */
12953 BadOp (instr_info
*ins
)
12955 /* Throw away prefixes and 1st. opcode byte. */
12956 ins
->codep
= ins
->insn_codep
+ 1;
12957 oappend (ins
, "(bad)");
12961 REP_Fixup (instr_info
*ins
, int bytemode
, int sizeflag
)
12963 /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
12965 if (ins
->prefixes
& PREFIX_REPZ
)
12966 ins
->all_prefixes
[ins
->last_repz_prefix
] = REP_PREFIX
;
12973 OP_IMREG (ins
, bytemode
, sizeflag
);
12976 OP_ESreg (ins
, bytemode
, sizeflag
);
12979 OP_DSreg (ins
, bytemode
, sizeflag
);
12988 SEP_Fixup (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
12989 int sizeflag ATTRIBUTE_UNUSED
)
12991 if (ins
->isa64
!= amd64
)
12994 ins
->obufp
= ins
->obuf
;
12996 ins
->mnemonicendp
= ins
->obufp
;
13000 /* For BND-prefixed instructions 0xF2 prefix should be displayed as
13004 BND_Fixup (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
13005 int sizeflag ATTRIBUTE_UNUSED
)
13007 if (ins
->prefixes
& PREFIX_REPNZ
)
13008 ins
->all_prefixes
[ins
->last_repnz_prefix
] = BND_PREFIX
;
13011 /* For NOTRACK-prefixed instructions, 0x3E prefix should be displayed as
13015 NOTRACK_Fixup (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
13016 int sizeflag ATTRIBUTE_UNUSED
)
13018 /* Since active_seg_prefix is not set in 64-bit mode, check whether
13019 we've seen a PREFIX_DS. */
13020 if ((ins
->prefixes
& PREFIX_DS
) != 0
13021 && (ins
->address_mode
!= mode_64bit
|| ins
->last_data_prefix
< 0))
13023 /* NOTRACK prefix is only valid on indirect branch instructions.
13024 NB: DATA prefix is unsupported for Intel64. */
13025 ins
->active_seg_prefix
= 0;
13026 ins
->all_prefixes
[ins
->last_seg_prefix
] = NOTRACK_PREFIX
;
13030 /* Similar to OP_E. But the 0xf2/0xf3 ins->prefixes should be displayed as
13031 "xacquire"/"xrelease" for memory operand if there is a LOCK prefix.
13035 HLE_Fixup1 (instr_info
*ins
, int bytemode
, int sizeflag
)
13037 if (ins
->modrm
.mod
!= 3
13038 && (ins
->prefixes
& PREFIX_LOCK
) != 0)
13040 if (ins
->prefixes
& PREFIX_REPZ
)
13041 ins
->all_prefixes
[ins
->last_repz_prefix
] = XRELEASE_PREFIX
;
13042 if (ins
->prefixes
& PREFIX_REPNZ
)
13043 ins
->all_prefixes
[ins
->last_repnz_prefix
] = XACQUIRE_PREFIX
;
13046 OP_E (ins
, bytemode
, sizeflag
);
13049 /* Similar to OP_E. But the 0xf2/0xf3 ins->prefixes should be displayed as
13050 "xacquire"/"xrelease" for memory operand. No check for LOCK prefix.
13054 HLE_Fixup2 (instr_info
*ins
, int bytemode
, int sizeflag
)
13056 if (ins
->modrm
.mod
!= 3)
13058 if (ins
->prefixes
& PREFIX_REPZ
)
13059 ins
->all_prefixes
[ins
->last_repz_prefix
] = XRELEASE_PREFIX
;
13060 if (ins
->prefixes
& PREFIX_REPNZ
)
13061 ins
->all_prefixes
[ins
->last_repnz_prefix
] = XACQUIRE_PREFIX
;
13064 OP_E (ins
, bytemode
, sizeflag
);
13067 /* Similar to OP_E. But the 0xf3 prefixes should be displayed as
13068 "xrelease" for memory operand. No check for LOCK prefix. */
13071 HLE_Fixup3 (instr_info
*ins
, int bytemode
, int sizeflag
)
13073 if (ins
->modrm
.mod
!= 3
13074 && ins
->last_repz_prefix
> ins
->last_repnz_prefix
13075 && (ins
->prefixes
& PREFIX_REPZ
) != 0)
13076 ins
->all_prefixes
[ins
->last_repz_prefix
] = XRELEASE_PREFIX
;
13078 OP_E (ins
, bytemode
, sizeflag
);
13082 CMPXCHG8B_Fixup (instr_info
*ins
, int bytemode
, int sizeflag
)
13085 if (ins
->rex
& REX_W
)
13087 /* Change cmpxchg8b to cmpxchg16b. */
13088 char *p
= ins
->mnemonicendp
- 2;
13089 ins
->mnemonicendp
= stpcpy (p
, "16b");
13092 else if ((ins
->prefixes
& PREFIX_LOCK
) != 0)
13094 if (ins
->prefixes
& PREFIX_REPZ
)
13095 ins
->all_prefixes
[ins
->last_repz_prefix
] = XRELEASE_PREFIX
;
13096 if (ins
->prefixes
& PREFIX_REPNZ
)
13097 ins
->all_prefixes
[ins
->last_repnz_prefix
] = XACQUIRE_PREFIX
;
13100 OP_M (ins
, bytemode
, sizeflag
);
13104 XMM_Fixup (instr_info
*ins
, int reg
, int sizeflag ATTRIBUTE_UNUSED
)
13106 const char *const *names
= att_names_xmm
;
13110 switch (ins
->vex
.length
)
13115 names
= att_names_ymm
;
13121 oappend_maybe_intel (ins
, names
[reg
]);
13125 FXSAVE_Fixup (instr_info
*ins
, int bytemode
, int sizeflag
)
13127 /* Add proper suffix to "fxsave" and "fxrstor". */
13129 if (ins
->rex
& REX_W
)
13131 char *p
= ins
->mnemonicendp
;
13135 ins
->mnemonicendp
= p
;
13137 OP_M (ins
, bytemode
, sizeflag
);
13140 /* Display the destination register operand for instructions with
13144 OP_VEX (instr_info
*ins
, int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
13146 int reg
, modrm_reg
, sib_index
= -1;
13147 const char *const *names
;
13149 if (!ins
->need_vex
)
13152 reg
= ins
->vex
.register_specifier
;
13153 ins
->vex
.register_specifier
= 0;
13154 if (ins
->address_mode
!= mode_64bit
)
13156 if (ins
->vex
.evex
&& !ins
->vex
.v
)
13158 oappend (ins
, "(bad)");
13164 else if (ins
->vex
.evex
&& !ins
->vex
.v
)
13170 oappend_maybe_intel (ins
, att_names_xmm
[reg
]);
13173 case vex_vsib_d_w_dq_mode
:
13174 case vex_vsib_q_w_dq_mode
:
13175 /* This must be the 3rd operand. */
13176 if (ins
->obufp
!= ins
->op_out
[2])
13178 if (ins
->vex
.length
== 128
13179 || (bytemode
!= vex_vsib_d_w_dq_mode
13181 oappend_maybe_intel (ins
, att_names_xmm
[reg
]);
13183 oappend_maybe_intel (ins
, att_names_ymm
[reg
]);
13185 /* All 3 XMM/YMM registers must be distinct. */
13186 modrm_reg
= ins
->modrm
.reg
;
13187 if (ins
->rex
& REX_R
)
13190 if (ins
->has_sib
&& ins
->modrm
.rm
== 4)
13192 sib_index
= ins
->sib
.index
;
13193 if (ins
->rex
& REX_X
)
13197 if (reg
== modrm_reg
|| reg
== sib_index
)
13198 strcpy (ins
->obufp
, "/(bad)");
13199 if (modrm_reg
== sib_index
|| modrm_reg
== reg
)
13200 strcat (ins
->op_out
[0], "/(bad)");
13201 if (sib_index
== modrm_reg
|| sib_index
== reg
)
13202 strcat (ins
->op_out
[1], "/(bad)");
13207 /* All 3 TMM registers must be distinct. */
13209 oappend (ins
, "(bad)");
13212 /* This must be the 3rd operand. */
13213 if (ins
->obufp
!= ins
->op_out
[2])
13215 oappend_maybe_intel (ins
, att_names_tmm
[reg
]);
13216 if (reg
== ins
->modrm
.reg
|| reg
== ins
->modrm
.rm
)
13217 strcpy (ins
->obufp
, "/(bad)");
13220 if (ins
->modrm
.reg
== ins
->modrm
.rm
|| ins
->modrm
.reg
== reg
13221 || ins
->modrm
.rm
== reg
)
13223 if (ins
->modrm
.reg
<= 8
13224 && (ins
->modrm
.reg
== ins
->modrm
.rm
|| ins
->modrm
.reg
== reg
))
13225 strcat (ins
->op_out
[0], "/(bad)");
13226 if (ins
->modrm
.rm
<= 8
13227 && (ins
->modrm
.rm
== ins
->modrm
.reg
|| ins
->modrm
.rm
== reg
))
13228 strcat (ins
->op_out
[1], "/(bad)");
13234 switch (ins
->vex
.length
)
13240 names
= att_names_xmm
;
13243 if (ins
->rex
& REX_W
)
13244 names
= att_names64
;
13246 names
= att_names32
;
13252 oappend (ins
, "(bad)");
13255 names
= att_names_mask
;
13266 names
= att_names_ymm
;
13272 oappend (ins
, "(bad)");
13275 names
= att_names_mask
;
13278 /* See PR binutils/20893 for a reproducer. */
13279 oappend (ins
, "(bad)");
13284 names
= att_names_zmm
;
13290 oappend_maybe_intel (ins
, names
[reg
]);
13294 OP_VexR (instr_info
*ins
, int bytemode
, int sizeflag
)
13296 if (ins
->modrm
.mod
== 3)
13297 OP_VEX (ins
, bytemode
, sizeflag
);
13301 OP_VexW (instr_info
*ins
, int bytemode
, int sizeflag
)
13303 OP_VEX (ins
, bytemode
, sizeflag
);
13307 /* Swap 2nd and 3rd operands. */
13308 strcpy (ins
->scratchbuf
, ins
->op_out
[2]);
13309 strcpy (ins
->op_out
[2], ins
->op_out
[1]);
13310 strcpy (ins
->op_out
[1], ins
->scratchbuf
);
13315 OP_REG_VexI4 (instr_info
*ins
, int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
13318 const char *const *names
= att_names_xmm
;
13320 FETCH_DATA (ins
->info
, ins
->codep
+ 1);
13321 reg
= *ins
->codep
++;
13323 if (bytemode
!= x_mode
&& bytemode
!= scalar_mode
)
13327 if (ins
->address_mode
!= mode_64bit
)
13330 if (bytemode
== x_mode
&& ins
->vex
.length
== 256)
13331 names
= att_names_ymm
;
13333 oappend_maybe_intel (ins
, names
[reg
]);
13337 /* Swap 3rd and 4th operands. */
13338 strcpy (ins
->scratchbuf
, ins
->op_out
[3]);
13339 strcpy (ins
->op_out
[3], ins
->op_out
[2]);
13340 strcpy (ins
->op_out
[2], ins
->scratchbuf
);
13345 OP_VexI4 (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
13346 int sizeflag ATTRIBUTE_UNUSED
)
13348 ins
->scratchbuf
[0] = '$';
13349 print_operand_value (ins
, ins
->scratchbuf
+ 1, 1, ins
->codep
[-1] & 0xf);
13350 oappend_maybe_intel (ins
, ins
->scratchbuf
);
13354 VPCMP_Fixup (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
13355 int sizeflag ATTRIBUTE_UNUSED
)
13357 unsigned int cmp_type
;
13359 if (!ins
->vex
.evex
)
13362 FETCH_DATA (ins
->info
, ins
->codep
+ 1);
13363 cmp_type
= *ins
->codep
++ & 0xff;
13364 /* There are aliases for immediates 0, 1, 2, 4, 5, 6.
13365 If it's the case, print suffix, otherwise - print the immediate. */
13366 if (cmp_type
< ARRAY_SIZE (simd_cmp_op
)
13371 char *p
= ins
->mnemonicendp
- 2;
13373 /* vpcmp* can have both one- and two-lettered suffix. */
13387 sprintf (p
, "%s%s", simd_cmp_op
[cmp_type
].name
, suffix
);
13388 ins
->mnemonicendp
+= simd_cmp_op
[cmp_type
].len
;
13392 /* We have a reserved extension byte. Output it directly. */
13393 ins
->scratchbuf
[0] = '$';
13394 print_operand_value (ins
, ins
->scratchbuf
+ 1, 1, cmp_type
);
13395 oappend_maybe_intel (ins
, ins
->scratchbuf
);
13396 ins
->scratchbuf
[0] = '\0';
13400 static const struct op xop_cmp_op
[] =
13402 { STRING_COMMA_LEN ("lt") },
13403 { STRING_COMMA_LEN ("le") },
13404 { STRING_COMMA_LEN ("gt") },
13405 { STRING_COMMA_LEN ("ge") },
13406 { STRING_COMMA_LEN ("eq") },
13407 { STRING_COMMA_LEN ("neq") },
13408 { STRING_COMMA_LEN ("false") },
13409 { STRING_COMMA_LEN ("true") }
13413 VPCOM_Fixup (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
13414 int sizeflag ATTRIBUTE_UNUSED
)
13416 unsigned int cmp_type
;
13418 FETCH_DATA (ins
->info
, ins
->codep
+ 1);
13419 cmp_type
= *ins
->codep
++ & 0xff;
13420 if (cmp_type
< ARRAY_SIZE (xop_cmp_op
))
13423 char *p
= ins
->mnemonicendp
- 2;
13425 /* vpcom* can have both one- and two-lettered suffix. */
13439 sprintf (p
, "%s%s", xop_cmp_op
[cmp_type
].name
, suffix
);
13440 ins
->mnemonicendp
+= xop_cmp_op
[cmp_type
].len
;
13444 /* We have a reserved extension byte. Output it directly. */
13445 ins
->scratchbuf
[0] = '$';
13446 print_operand_value (ins
, ins
->scratchbuf
+ 1, 1, cmp_type
);
13447 oappend_maybe_intel (ins
, ins
->scratchbuf
);
13448 ins
->scratchbuf
[0] = '\0';
13452 static const struct op pclmul_op
[] =
13454 { STRING_COMMA_LEN ("lql") },
13455 { STRING_COMMA_LEN ("hql") },
13456 { STRING_COMMA_LEN ("lqh") },
13457 { STRING_COMMA_LEN ("hqh") }
13461 PCLMUL_Fixup (instr_info
*ins
, int bytemode ATTRIBUTE_UNUSED
,
13462 int sizeflag ATTRIBUTE_UNUSED
)
13464 unsigned int pclmul_type
;
13466 FETCH_DATA (ins
->info
, ins
->codep
+ 1);
13467 pclmul_type
= *ins
->codep
++ & 0xff;
13468 switch (pclmul_type
)
13479 if (pclmul_type
< ARRAY_SIZE (pclmul_op
))
13482 char *p
= ins
->mnemonicendp
- 3;
13487 sprintf (p
, "%s%s", pclmul_op
[pclmul_type
].name
, suffix
);
13488 ins
->mnemonicendp
+= pclmul_op
[pclmul_type
].len
;
13492 /* We have a reserved extension byte. Output it directly. */
13493 ins
->scratchbuf
[0] = '$';
13494 print_operand_value (ins
, ins
->scratchbuf
+ 1, 1, pclmul_type
);
13495 oappend_maybe_intel (ins
, ins
->scratchbuf
);
13496 ins
->scratchbuf
[0] = '\0';
13501 MOVSXD_Fixup (instr_info
*ins
, int bytemode
, int sizeflag
)
13503 /* Add proper suffix to "movsxd". */
13504 char *p
= ins
->mnemonicendp
;
13509 if (!ins
->intel_syntax
)
13512 if (ins
->rex
& REX_W
)
13524 oappend (ins
, INTERNAL_DISASSEMBLER_ERROR
);
13528 ins
->mnemonicendp
= p
;
13530 OP_E (ins
, bytemode
, sizeflag
);
13534 DistinctDest_Fixup (instr_info
*ins
, int bytemode
, int sizeflag
)
13536 unsigned int reg
= ins
->vex
.register_specifier
;
13537 unsigned int modrm_reg
= ins
->modrm
.reg
;
13538 unsigned int modrm_rm
= ins
->modrm
.rm
;
13540 /* Calc destination register number. */
13541 if (ins
->rex
& REX_R
)
13546 /* Calc src1 register number. */
13547 if (ins
->address_mode
!= mode_64bit
)
13549 else if (ins
->vex
.evex
&& !ins
->vex
.v
)
13552 /* Calc src2 register number. */
13553 if (ins
->modrm
.mod
== 3)
13555 if (ins
->rex
& REX_B
)
13557 if (ins
->rex
& REX_X
)
13561 /* Destination and source registers must be distinct, output bad if
13562 dest == src1 or dest == src2. */
13563 if (modrm_reg
== reg
13564 || (ins
->modrm
.mod
== 3
13565 && modrm_reg
== modrm_rm
))
13567 oappend (ins
, "(bad)");
13570 OP_XMM (ins
, bytemode
, sizeflag
);
13574 OP_Rounding (instr_info
*ins
, int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
13576 if (ins
->modrm
.mod
!= 3 || !ins
->vex
.b
)
13581 case evex_rounding_64_mode
:
13582 if (ins
->address_mode
!= mode_64bit
|| !ins
->vex
.w
)
13584 /* Fall through. */
13585 case evex_rounding_mode
:
13586 ins
->evex_used
|= EVEX_b_used
;
13587 oappend (ins
, names_rounding
[ins
->vex
.ll
]);
13589 case evex_sae_mode
:
13590 ins
->evex_used
|= EVEX_b_used
;
13591 oappend (ins
, "{");
13596 oappend (ins
, "sae}");