1 /* Print i386 instructions for GDB, the GNU debugger.
2 Copyright (C) 1988-2021 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"
44 static int print_insn (bfd_vma
, disassemble_info
*);
45 static void dofloat (int);
46 static void OP_ST (int, int);
47 static void OP_STi (int, int);
48 static int putop (const char *, int);
49 static void oappend (const char *);
50 static void append_seg (void);
51 static void OP_indirE (int, int);
52 static void print_operand_value (char *, int, bfd_vma
);
53 static void OP_E_register (int, int);
54 static void OP_E_memory (int, int);
55 static void print_displacement (char *, bfd_vma
);
56 static void OP_E (int, int);
57 static void OP_G (int, int);
58 static bfd_vma
get64 (void);
59 static bfd_signed_vma
get32 (void);
60 static bfd_signed_vma
get32s (void);
61 static int get16 (void);
62 static void set_op (bfd_vma
, int);
63 static void OP_Skip_MODRM (int, int);
64 static void OP_REG (int, int);
65 static void OP_IMREG (int, int);
66 static void OP_I (int, int);
67 static void OP_I64 (int, int);
68 static void OP_sI (int, int);
69 static void OP_J (int, int);
70 static void OP_SEG (int, int);
71 static void OP_DIR (int, int);
72 static void OP_OFF (int, int);
73 static void OP_OFF64 (int, int);
74 static void ptr_reg (int, int);
75 static void OP_ESreg (int, int);
76 static void OP_DSreg (int, int);
77 static void OP_C (int, int);
78 static void OP_D (int, int);
79 static void OP_T (int, int);
80 static void OP_MMX (int, int);
81 static void OP_XMM (int, int);
82 static void OP_EM (int, int);
83 static void OP_EX (int, int);
84 static void OP_EMC (int,int);
85 static void OP_MXC (int,int);
86 static void OP_MS (int, int);
87 static void OP_XS (int, int);
88 static void OP_M (int, int);
89 static void OP_VEX (int, int);
90 static void OP_VexR (int, int);
91 static void OP_VexW (int, int);
92 static void OP_Rounding (int, int);
93 static void OP_REG_VexI4 (int, int);
94 static void OP_VexI4 (int, int);
95 static void PCLMUL_Fixup (int, int);
96 static void VPCMP_Fixup (int, int);
97 static void VPCOM_Fixup (int, int);
98 static void OP_0f07 (int, int);
99 static void OP_Monitor (int, int);
100 static void OP_Mwait (int, int);
101 static void NOP_Fixup1 (int, int);
102 static void NOP_Fixup2 (int, int);
103 static void OP_3DNowSuffix (int, int);
104 static void CMP_Fixup (int, int);
105 static void BadOp (void);
106 static void REP_Fixup (int, int);
107 static void SEP_Fixup (int, int);
108 static void BND_Fixup (int, int);
109 static void NOTRACK_Fixup (int, int);
110 static void HLE_Fixup1 (int, int);
111 static void HLE_Fixup2 (int, int);
112 static void HLE_Fixup3 (int, int);
113 static void CMPXCHG8B_Fixup (int, int);
114 static void XMM_Fixup (int, int);
115 static void FXSAVE_Fixup (int, int);
117 static void MOVSXD_Fixup (int, int);
119 static void OP_Mask (int, int);
122 /* Points to first byte not fetched. */
123 bfd_byte
*max_fetched
;
124 bfd_byte the_buffer
[MAX_MNEM_SIZE
];
127 OPCODES_SIGJMP_BUF bailout
;
137 enum address_mode address_mode
;
139 /* Flags for the prefixes for the current instruction. See below. */
142 /* REX prefix the current instruction. See below. */
144 /* Bits of REX we've already used. */
146 /* Mark parts used in the REX prefix. When we are testing for
147 empty prefix (for 8bit register REX extension), just mask it
148 out. Otherwise test for REX bit is excuse for existence of REX
149 only in case value is nonzero. */
150 #define USED_REX(value) \
155 rex_used |= (value) | REX_OPCODE; \
158 rex_used |= REX_OPCODE; \
161 /* Flags for prefixes which we somehow handled when printing the
162 current instruction. */
163 static int used_prefixes
;
165 /* Flags stored in PREFIXES. */
166 #define PREFIX_REPZ 1
167 #define PREFIX_REPNZ 2
168 #define PREFIX_LOCK 4
170 #define PREFIX_SS 0x10
171 #define PREFIX_DS 0x20
172 #define PREFIX_ES 0x40
173 #define PREFIX_FS 0x80
174 #define PREFIX_GS 0x100
175 #define PREFIX_DATA 0x200
176 #define PREFIX_ADDR 0x400
177 #define PREFIX_FWAIT 0x800
179 /* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
180 to ADDR (exclusive) are valid. Returns 1 for success, longjmps
182 #define FETCH_DATA(info, addr) \
183 ((addr) <= ((struct dis_private *) (info->private_data))->max_fetched \
184 ? 1 : fetch_data ((info), (addr)))
187 fetch_data (struct disassemble_info
*info
, bfd_byte
*addr
)
190 struct dis_private
*priv
= (struct dis_private
*) info
->private_data
;
191 bfd_vma start
= priv
->insn_start
+ (priv
->max_fetched
- priv
->the_buffer
);
193 if (addr
<= priv
->the_buffer
+ MAX_MNEM_SIZE
)
194 status
= (*info
->read_memory_func
) (start
,
196 addr
- priv
->max_fetched
,
202 /* If we did manage to read at least one byte, then
203 print_insn_i386 will do something sensible. Otherwise, print
204 an error. We do that here because this is where we know
206 if (priv
->max_fetched
== priv
->the_buffer
)
207 (*info
->memory_error_func
) (status
, start
, info
);
208 OPCODES_SIGLONGJMP (priv
->bailout
, 1);
211 priv
->max_fetched
= addr
;
215 /* Possible values for prefix requirement. */
216 #define PREFIX_IGNORED_SHIFT 16
217 #define PREFIX_IGNORED_REPZ (PREFIX_REPZ << PREFIX_IGNORED_SHIFT)
218 #define PREFIX_IGNORED_REPNZ (PREFIX_REPNZ << PREFIX_IGNORED_SHIFT)
219 #define PREFIX_IGNORED_DATA (PREFIX_DATA << PREFIX_IGNORED_SHIFT)
220 #define PREFIX_IGNORED_ADDR (PREFIX_ADDR << PREFIX_IGNORED_SHIFT)
221 #define PREFIX_IGNORED_LOCK (PREFIX_LOCK << PREFIX_IGNORED_SHIFT)
223 /* Opcode prefixes. */
224 #define PREFIX_OPCODE (PREFIX_REPZ \
228 /* Prefixes ignored. */
229 #define PREFIX_IGNORED (PREFIX_IGNORED_REPZ \
230 | PREFIX_IGNORED_REPNZ \
231 | PREFIX_IGNORED_DATA)
233 #define XX { NULL, 0 }
234 #define Bad_Opcode NULL, { { NULL, 0 } }, 0
236 #define Eb { OP_E, b_mode }
237 #define Ebnd { OP_E, bnd_mode }
238 #define EbS { OP_E, b_swap_mode }
239 #define EbndS { OP_E, bnd_swap_mode }
240 #define Ev { OP_E, v_mode }
241 #define Eva { OP_E, va_mode }
242 #define Ev_bnd { OP_E, v_bnd_mode }
243 #define EvS { OP_E, v_swap_mode }
244 #define Ed { OP_E, d_mode }
245 #define Edq { OP_E, dq_mode }
246 #define Edqw { OP_E, dqw_mode }
247 #define Edqb { OP_E, dqb_mode }
248 #define Edb { OP_E, db_mode }
249 #define Edw { OP_E, dw_mode }
250 #define Edqd { OP_E, dqd_mode }
251 #define Eq { OP_E, q_mode }
252 #define indirEv { OP_indirE, indir_v_mode }
253 #define indirEp { OP_indirE, f_mode }
254 #define stackEv { OP_E, stack_v_mode }
255 #define Em { OP_E, m_mode }
256 #define Ew { OP_E, w_mode }
257 #define M { OP_M, 0 } /* lea, lgdt, etc. */
258 #define Ma { OP_M, a_mode }
259 #define Mb { OP_M, b_mode }
260 #define Md { OP_M, d_mode }
261 #define Mo { OP_M, o_mode }
262 #define Mp { OP_M, f_mode } /* 32 or 48 bit memory operand for LDS, LES etc */
263 #define Mq { OP_M, q_mode }
264 #define Mv { OP_M, v_mode }
265 #define Mv_bnd { OP_M, v_bndmk_mode }
266 #define Mx { OP_M, x_mode }
267 #define Mxmm { OP_M, xmm_mode }
268 #define Gb { OP_G, b_mode }
269 #define Gbnd { OP_G, bnd_mode }
270 #define Gv { OP_G, v_mode }
271 #define Gd { OP_G, d_mode }
272 #define Gdq { OP_G, dq_mode }
273 #define Gm { OP_G, m_mode }
274 #define Gva { OP_G, va_mode }
275 #define Gw { OP_G, w_mode }
276 #define Ib { OP_I, b_mode }
277 #define sIb { OP_sI, b_mode } /* sign extened byte */
278 #define sIbT { OP_sI, b_T_mode } /* sign extened byte like 'T' */
279 #define Iv { OP_I, v_mode }
280 #define sIv { OP_sI, v_mode }
281 #define Iv64 { OP_I64, v_mode }
282 #define Id { OP_I, d_mode }
283 #define Iw { OP_I, w_mode }
284 #define I1 { OP_I, const_1_mode }
285 #define Jb { OP_J, b_mode }
286 #define Jv { OP_J, v_mode }
287 #define Jdqw { OP_J, dqw_mode }
288 #define Cm { OP_C, m_mode }
289 #define Dm { OP_D, m_mode }
290 #define Td { OP_T, d_mode }
291 #define Skip_MODRM { OP_Skip_MODRM, 0 }
293 #define RMeAX { OP_REG, eAX_reg }
294 #define RMeBX { OP_REG, eBX_reg }
295 #define RMeCX { OP_REG, eCX_reg }
296 #define RMeDX { OP_REG, eDX_reg }
297 #define RMeSP { OP_REG, eSP_reg }
298 #define RMeBP { OP_REG, eBP_reg }
299 #define RMeSI { OP_REG, eSI_reg }
300 #define RMeDI { OP_REG, eDI_reg }
301 #define RMrAX { OP_REG, rAX_reg }
302 #define RMrBX { OP_REG, rBX_reg }
303 #define RMrCX { OP_REG, rCX_reg }
304 #define RMrDX { OP_REG, rDX_reg }
305 #define RMrSP { OP_REG, rSP_reg }
306 #define RMrBP { OP_REG, rBP_reg }
307 #define RMrSI { OP_REG, rSI_reg }
308 #define RMrDI { OP_REG, rDI_reg }
309 #define RMAL { OP_REG, al_reg }
310 #define RMCL { OP_REG, cl_reg }
311 #define RMDL { OP_REG, dl_reg }
312 #define RMBL { OP_REG, bl_reg }
313 #define RMAH { OP_REG, ah_reg }
314 #define RMCH { OP_REG, ch_reg }
315 #define RMDH { OP_REG, dh_reg }
316 #define RMBH { OP_REG, bh_reg }
317 #define RMAX { OP_REG, ax_reg }
318 #define RMDX { OP_REG, dx_reg }
320 #define eAX { OP_IMREG, eAX_reg }
321 #define AL { OP_IMREG, al_reg }
322 #define CL { OP_IMREG, cl_reg }
323 #define zAX { OP_IMREG, z_mode_ax_reg }
324 #define indirDX { OP_IMREG, indir_dx_reg }
326 #define Sw { OP_SEG, w_mode }
327 #define Sv { OP_SEG, v_mode }
328 #define Ap { OP_DIR, 0 }
329 #define Ob { OP_OFF64, b_mode }
330 #define Ov { OP_OFF64, v_mode }
331 #define Xb { OP_DSreg, eSI_reg }
332 #define Xv { OP_DSreg, eSI_reg }
333 #define Xz { OP_DSreg, eSI_reg }
334 #define Yb { OP_ESreg, eDI_reg }
335 #define Yv { OP_ESreg, eDI_reg }
336 #define DSBX { OP_DSreg, eBX_reg }
338 #define es { OP_REG, es_reg }
339 #define ss { OP_REG, ss_reg }
340 #define cs { OP_REG, cs_reg }
341 #define ds { OP_REG, ds_reg }
342 #define fs { OP_REG, fs_reg }
343 #define gs { OP_REG, gs_reg }
345 #define MX { OP_MMX, 0 }
346 #define XM { OP_XMM, 0 }
347 #define XMScalar { OP_XMM, scalar_mode }
348 #define XMGatherQ { OP_XMM, vex_vsib_q_w_dq_mode }
349 #define XMM { OP_XMM, xmm_mode }
350 #define TMM { OP_XMM, tmm_mode }
351 #define XMxmmq { OP_XMM, xmmq_mode }
352 #define EM { OP_EM, v_mode }
353 #define EMS { OP_EM, v_swap_mode }
354 #define EMd { OP_EM, d_mode }
355 #define EMx { OP_EM, x_mode }
356 #define EXbwUnit { OP_EX, bw_unit_mode }
357 #define EXw { OP_EX, w_mode }
358 #define EXd { OP_EX, d_mode }
359 #define EXdS { OP_EX, d_swap_mode }
360 #define EXq { OP_EX, q_mode }
361 #define EXqS { OP_EX, q_swap_mode }
362 #define EXx { OP_EX, x_mode }
363 #define EXxS { OP_EX, x_swap_mode }
364 #define EXxmm { OP_EX, xmm_mode }
365 #define EXymm { OP_EX, ymm_mode }
366 #define EXtmm { OP_EX, tmm_mode }
367 #define EXxmmq { OP_EX, xmmq_mode }
368 #define EXEvexHalfBcstXmmq { OP_EX, evex_half_bcst_xmmq_mode }
369 #define EXxmm_mb { OP_EX, xmm_mb_mode }
370 #define EXxmm_mw { OP_EX, xmm_mw_mode }
371 #define EXxmm_md { OP_EX, xmm_md_mode }
372 #define EXxmm_mq { OP_EX, xmm_mq_mode }
373 #define EXxmmdw { OP_EX, xmmdw_mode }
374 #define EXxmmqd { OP_EX, xmmqd_mode }
375 #define EXymmq { OP_EX, ymmq_mode }
376 #define EXVexWdqScalar { OP_EX, vex_scalar_w_dq_mode }
377 #define EXEvexXGscat { OP_EX, evex_x_gscat_mode }
378 #define EXEvexXNoBcst { OP_EX, evex_x_nobcst_mode }
379 #define MS { OP_MS, v_mode }
380 #define XS { OP_XS, v_mode }
381 #define EMCq { OP_EMC, q_mode }
382 #define MXC { OP_MXC, 0 }
383 #define OPSUF { OP_3DNowSuffix, 0 }
384 #define SEP { SEP_Fixup, 0 }
385 #define CMP { CMP_Fixup, 0 }
386 #define XMM0 { XMM_Fixup, 0 }
387 #define FXSAVE { FXSAVE_Fixup, 0 }
389 #define Vex { OP_VEX, vex_mode }
390 #define VexW { OP_VexW, vex_mode }
391 #define VexScalar { OP_VEX, vex_scalar_mode }
392 #define VexScalarR { OP_VexR, vex_scalar_mode }
393 #define VexGatherQ { OP_VEX, vex_vsib_q_w_dq_mode }
394 #define VexGdq { OP_VEX, dq_mode }
395 #define VexTmm { OP_VEX, tmm_mode }
396 #define XMVexI4 { OP_REG_VexI4, x_mode }
397 #define XMVexScalarI4 { OP_REG_VexI4, scalar_mode }
398 #define VexI4 { OP_VexI4, 0 }
399 #define PCLMUL { PCLMUL_Fixup, 0 }
400 #define VPCMP { VPCMP_Fixup, 0 }
401 #define VPCOM { VPCOM_Fixup, 0 }
403 #define EXxEVexR { OP_Rounding, evex_rounding_mode }
404 #define EXxEVexR64 { OP_Rounding, evex_rounding_64_mode }
405 #define EXxEVexS { OP_Rounding, evex_sae_mode }
407 #define XMask { OP_Mask, mask_mode }
408 #define MaskG { OP_G, mask_mode }
409 #define MaskE { OP_E, mask_mode }
410 #define MaskBDE { OP_E, mask_bd_mode }
411 #define MaskVex { OP_VEX, mask_mode }
413 #define MVexVSIBDWpX { OP_M, vex_vsib_d_w_dq_mode }
414 #define MVexVSIBDQWpX { OP_M, vex_vsib_d_w_d_mode }
415 #define MVexVSIBQWpX { OP_M, vex_vsib_q_w_dq_mode }
416 #define MVexVSIBQDWpX { OP_M, vex_vsib_q_w_d_mode }
418 #define MVexSIBMEM { OP_M, vex_sibmem_mode }
420 /* Used handle "rep" prefix for string instructions. */
421 #define Xbr { REP_Fixup, eSI_reg }
422 #define Xvr { REP_Fixup, eSI_reg }
423 #define Ybr { REP_Fixup, eDI_reg }
424 #define Yvr { REP_Fixup, eDI_reg }
425 #define Yzr { REP_Fixup, eDI_reg }
426 #define indirDXr { REP_Fixup, indir_dx_reg }
427 #define ALr { REP_Fixup, al_reg }
428 #define eAXr { REP_Fixup, eAX_reg }
430 /* Used handle HLE prefix for lockable instructions. */
431 #define Ebh1 { HLE_Fixup1, b_mode }
432 #define Evh1 { HLE_Fixup1, v_mode }
433 #define Ebh2 { HLE_Fixup2, b_mode }
434 #define Evh2 { HLE_Fixup2, v_mode }
435 #define Ebh3 { HLE_Fixup3, b_mode }
436 #define Evh3 { HLE_Fixup3, v_mode }
438 #define BND { BND_Fixup, 0 }
439 #define NOTRACK { NOTRACK_Fixup, 0 }
441 #define cond_jump_flag { NULL, cond_jump_mode }
442 #define loop_jcxz_flag { NULL, loop_jcxz_mode }
444 /* bits in sizeflag */
445 #define SUFFIX_ALWAYS 4
453 /* byte operand with operand swapped */
455 /* byte operand, sign extend like 'T' suffix */
457 /* operand size depends on prefixes */
459 /* operand size depends on prefixes with operand swapped */
461 /* operand size depends on address prefix */
465 /* double word operand */
467 /* double word operand with operand swapped */
469 /* quad word operand */
471 /* quad word operand with operand swapped */
473 /* ten-byte operand */
475 /* 16-byte XMM, 32-byte YMM or 64-byte ZMM operand. In EVEX with
476 broadcast enabled. */
478 /* Similar to x_mode, but with different EVEX mem shifts. */
480 /* Similar to x_mode, but with yet different EVEX mem shifts. */
482 /* Similar to x_mode, but with disabled broadcast. */
484 /* Similar to x_mode, but with operands swapped and disabled broadcast
487 /* 16-byte XMM operand */
489 /* XMM, XMM or YMM register operand, or quad word, xmmword or ymmword
490 memory operand (depending on vector length). Broadcast isn't
493 /* Same as xmmq_mode, but broadcast is allowed. */
494 evex_half_bcst_xmmq_mode
,
495 /* XMM register or byte memory operand */
497 /* XMM register or word memory operand */
499 /* XMM register or double word memory operand */
501 /* XMM register or quad word memory operand */
503 /* 16-byte XMM, word, double word or quad word operand. */
505 /* 16-byte XMM, double word, quad word operand or xmm word operand. */
507 /* 32-byte YMM operand */
509 /* quad word, ymmword or zmmword memory operand. */
511 /* 32-byte YMM or 16-byte word operand */
515 /* d_mode in 32bit, q_mode in 64bit mode. */
517 /* pair of v_mode operands */
523 /* like v_bnd_mode in 32bit, no RIP-rel in 64bit mode. */
525 /* operand size depends on REX prefixes. */
527 /* registers like dq_mode, memory like w_mode, displacements like
528 v_mode without considering Intel64 ISA. */
532 /* bounds operand with operand swapped */
534 /* 4- or 6-byte pointer operand */
537 /* v_mode for indirect branch opcodes. */
539 /* v_mode for stack-related opcodes. */
541 /* non-quad operand size depends on prefixes */
543 /* 16-byte operand */
545 /* registers like dq_mode, memory like b_mode. */
547 /* registers like d_mode, memory like b_mode. */
549 /* registers like d_mode, memory like w_mode. */
551 /* registers like dq_mode, memory like d_mode. */
553 /* normal vex mode */
556 /* Operand size depends on the VEX.W bit, with VSIB dword indices. */
557 vex_vsib_d_w_dq_mode
,
558 /* Similar to vex_vsib_d_w_dq_mode, with smaller memory. */
560 /* Operand size depends on the VEX.W bit, with VSIB qword indices. */
561 vex_vsib_q_w_dq_mode
,
562 /* Similar to vex_vsib_q_w_dq_mode, with smaller memory. */
564 /* mandatory non-vector SIB. */
567 /* scalar, ignore vector length. */
569 /* like vex_mode, ignore vector length. */
571 /* Operand size depends on the VEX.W bit, ignore vector length. */
572 vex_scalar_w_dq_mode
,
574 /* Static rounding. */
576 /* Static rounding, 64-bit mode only. */
577 evex_rounding_64_mode
,
578 /* Supress all exceptions. */
581 /* Mask register operand. */
583 /* Mask register operand. */
651 #define FLOAT NULL, { { NULL, FLOATCODE } }, 0
653 #define DIS386(T, I) NULL, { { NULL, (T)}, { NULL, (I) } }, 0
654 #define DIS386_PREFIX(T, I, P) NULL, { { NULL, (T)}, { NULL, (I) } }, P
655 #define REG_TABLE(I) DIS386 (USE_REG_TABLE, (I))
656 #define MOD_TABLE(I) DIS386 (USE_MOD_TABLE, (I))
657 #define RM_TABLE(I) DIS386 (USE_RM_TABLE, (I))
658 #define PREFIX_TABLE(I) DIS386 (USE_PREFIX_TABLE, (I))
659 #define X86_64_TABLE(I) DIS386 (USE_X86_64_TABLE, (I))
660 #define THREE_BYTE_TABLE(I) DIS386 (USE_3BYTE_TABLE, (I))
661 #define THREE_BYTE_TABLE_PREFIX(I, P) DIS386_PREFIX (USE_3BYTE_TABLE, (I), P)
662 #define XOP_8F_TABLE(I) DIS386 (USE_XOP_8F_TABLE, (I))
663 #define VEX_C4_TABLE(I) DIS386 (USE_VEX_C4_TABLE, (I))
664 #define VEX_C5_TABLE(I) DIS386 (USE_VEX_C5_TABLE, (I))
665 #define VEX_LEN_TABLE(I) DIS386 (USE_VEX_LEN_TABLE, (I))
666 #define VEX_W_TABLE(I) DIS386 (USE_VEX_W_TABLE, (I))
667 #define EVEX_TABLE(I) DIS386 (USE_EVEX_TABLE, (I))
668 #define EVEX_LEN_TABLE(I) DIS386 (USE_EVEX_LEN_TABLE, (I))
695 REG_0F3A0F_PREFIX_1_MOD_3
,
708 REG_VEX_0F3849_X86_64_P_0_W_0_M_1
,
713 REG_0FXOP_09_12_M_1_L_0
,
719 REG_EVEX_0F38C6_M_0_L_2
,
720 REG_EVEX_0F38C7_M_0_L_2_W_0
,
721 REG_EVEX_0F38C7_M_0_L_2_W_1
797 MOD_VEX_0F12_PREFIX_0
,
798 MOD_VEX_0F12_PREFIX_2
,
800 MOD_VEX_0F16_PREFIX_0
,
801 MOD_VEX_0F16_PREFIX_2
,
825 MOD_VEX_0FF0_PREFIX_3
,
832 MOD_VEX_0F3849_X86_64_P_0_W_0
,
833 MOD_VEX_0F3849_X86_64_P_2_W_0
,
834 MOD_VEX_0F3849_X86_64_P_3_W_0
,
835 MOD_VEX_0F384B_X86_64_P_1_W_0
,
836 MOD_VEX_0F384B_X86_64_P_2_W_0
,
837 MOD_VEX_0F384B_X86_64_P_3_W_0
,
839 MOD_VEX_0F385C_X86_64_P_1_W_0
,
840 MOD_VEX_0F385E_X86_64_P_0_W_0
,
841 MOD_VEX_0F385E_X86_64_P_1_W_0
,
842 MOD_VEX_0F385E_X86_64_P_2_W_0
,
843 MOD_VEX_0F385E_X86_64_P_3_W_0
,
853 MOD_EVEX_0F12_PREFIX_0
,
854 MOD_EVEX_0F12_PREFIX_2
,
856 MOD_EVEX_0F16_PREFIX_0
,
857 MOD_EVEX_0F16_PREFIX_2
,
863 MOD_EVEX_0F382A_P_1_W_1
,
865 MOD_EVEX_0F383A_P_1_W_0
,
885 RM_0F1E_P_1_MOD_3_REG_7
,
886 RM_0F3A0F_P_1_MOD_3_REG_0
,
887 RM_0FAE_REG_6_MOD_3_P_0
,
889 RM_VEX_0F3849_X86_64_P_0_W_0_M_1_R_0
895 PREFIX_0F01_REG_1_RM_4
,
896 PREFIX_0F01_REG_1_RM_5
,
897 PREFIX_0F01_REG_1_RM_6
,
898 PREFIX_0F01_REG_1_RM_7
,
899 PREFIX_0F01_REG_3_RM_1
,
900 PREFIX_0F01_REG_5_MOD_0
,
901 PREFIX_0F01_REG_5_MOD_3_RM_0
,
902 PREFIX_0F01_REG_5_MOD_3_RM_1
,
903 PREFIX_0F01_REG_5_MOD_3_RM_2
,
904 PREFIX_0F01_REG_5_MOD_3_RM_4
,
905 PREFIX_0F01_REG_5_MOD_3_RM_5
,
906 PREFIX_0F01_REG_5_MOD_3_RM_6
,
907 PREFIX_0F01_REG_5_MOD_3_RM_7
,
908 PREFIX_0F01_REG_7_MOD_3_RM_2
,
909 PREFIX_0F01_REG_7_MOD_3_RM_6
,
910 PREFIX_0F01_REG_7_MOD_3_RM_7
,
948 PREFIX_0FAE_REG_0_MOD_3
,
949 PREFIX_0FAE_REG_1_MOD_3
,
950 PREFIX_0FAE_REG_2_MOD_3
,
951 PREFIX_0FAE_REG_3_MOD_3
,
952 PREFIX_0FAE_REG_4_MOD_0
,
953 PREFIX_0FAE_REG_4_MOD_3
,
954 PREFIX_0FAE_REG_5_MOD_3
,
955 PREFIX_0FAE_REG_6_MOD_0
,
956 PREFIX_0FAE_REG_6_MOD_3
,
957 PREFIX_0FAE_REG_7_MOD_0
,
962 PREFIX_0FC7_REG_6_MOD_0
,
963 PREFIX_0FC7_REG_6_MOD_3
,
964 PREFIX_0FC7_REG_7_MOD_3
,
992 PREFIX_VEX_0F41_L_1_M_1_W_0
,
993 PREFIX_VEX_0F41_L_1_M_1_W_1
,
994 PREFIX_VEX_0F42_L_1_M_1_W_0
,
995 PREFIX_VEX_0F42_L_1_M_1_W_1
,
996 PREFIX_VEX_0F44_L_0_M_1_W_0
,
997 PREFIX_VEX_0F44_L_0_M_1_W_1
,
998 PREFIX_VEX_0F45_L_1_M_1_W_0
,
999 PREFIX_VEX_0F45_L_1_M_1_W_1
,
1000 PREFIX_VEX_0F46_L_1_M_1_W_0
,
1001 PREFIX_VEX_0F46_L_1_M_1_W_1
,
1002 PREFIX_VEX_0F47_L_1_M_1_W_0
,
1003 PREFIX_VEX_0F47_L_1_M_1_W_1
,
1004 PREFIX_VEX_0F4A_L_1_M_1_W_0
,
1005 PREFIX_VEX_0F4A_L_1_M_1_W_1
,
1006 PREFIX_VEX_0F4B_L_1_M_1_W_0
,
1007 PREFIX_VEX_0F4B_L_1_M_1_W_1
,
1025 PREFIX_VEX_0F90_L_0_W_0
,
1026 PREFIX_VEX_0F90_L_0_W_1
,
1027 PREFIX_VEX_0F91_L_0_M_0_W_0
,
1028 PREFIX_VEX_0F91_L_0_M_0_W_1
,
1029 PREFIX_VEX_0F92_L_0_M_1_W_0
,
1030 PREFIX_VEX_0F92_L_0_M_1_W_1
,
1031 PREFIX_VEX_0F93_L_0_M_1_W_0
,
1032 PREFIX_VEX_0F93_L_0_M_1_W_1
,
1033 PREFIX_VEX_0F98_L_0_M_1_W_0
,
1034 PREFIX_VEX_0F98_L_0_M_1_W_1
,
1035 PREFIX_VEX_0F99_L_0_M_1_W_0
,
1036 PREFIX_VEX_0F99_L_0_M_1_W_1
,
1041 PREFIX_VEX_0F3849_X86_64
,
1042 PREFIX_VEX_0F384B_X86_64
,
1043 PREFIX_VEX_0F385C_X86_64
,
1044 PREFIX_VEX_0F385E_X86_64
,
1045 PREFIX_VEX_0F38F5_L_0
,
1046 PREFIX_VEX_0F38F6_L_0
,
1047 PREFIX_VEX_0F38F7_L_0
,
1048 PREFIX_VEX_0F3AF0_L_0
,
1143 X86_64_0F01_REG_1_RM_5_PREFIX_2
,
1144 X86_64_0F01_REG_1_RM_6_PREFIX_2
,
1145 X86_64_0F01_REG_1_RM_7_PREFIX_2
,
1154 X86_64_0F01_REG_5_MOD_3_RM_4_PREFIX_1
,
1155 X86_64_0F01_REG_5_MOD_3_RM_5_PREFIX_1
,
1156 X86_64_0F01_REG_5_MOD_3_RM_6_PREFIX_1
,
1157 X86_64_0F01_REG_5_MOD_3_RM_7_PREFIX_1
,
1158 X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_1
,
1159 X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3
,
1160 X86_64_0F01_REG_7_MOD_3_RM_7_PREFIX_1
,
1161 X86_64_0FC7_REG_6_MOD_3_PREFIX_1
1166 THREE_BYTE_0F38
= 0,
1193 VEX_LEN_0F12_P_0_M_0
= 0,
1194 VEX_LEN_0F12_P_0_M_1
,
1195 #define VEX_LEN_0F12_P_2_M_0 VEX_LEN_0F12_P_0_M_0
1197 VEX_LEN_0F16_P_0_M_0
,
1198 VEX_LEN_0F16_P_0_M_1
,
1199 #define VEX_LEN_0F16_P_2_M_0 VEX_LEN_0F16_P_0_M_0
1219 VEX_LEN_0FAE_R_2_M_0
,
1220 VEX_LEN_0FAE_R_3_M_0
,
1230 VEX_LEN_0F3849_X86_64_P_0_W_0_M_0
,
1231 VEX_LEN_0F3849_X86_64_P_0_W_0_M_1_REG_0_RM_0
,
1232 VEX_LEN_0F3849_X86_64_P_2_W_0_M_0
,
1233 VEX_LEN_0F3849_X86_64_P_3_W_0_M_0
,
1234 VEX_LEN_0F384B_X86_64_P_1_W_0_M_0
,
1235 VEX_LEN_0F384B_X86_64_P_2_W_0_M_0
,
1236 VEX_LEN_0F384B_X86_64_P_3_W_0_M_0
,
1238 VEX_LEN_0F385C_X86_64_P_1_W_0_M_0
,
1239 VEX_LEN_0F385E_X86_64_P_0_W_0_M_0
,
1240 VEX_LEN_0F385E_X86_64_P_1_W_0_M_0
,
1241 VEX_LEN_0F385E_X86_64_P_2_W_0_M_0
,
1242 VEX_LEN_0F385E_X86_64_P_3_W_0_M_0
,
1275 VEX_LEN_0FXOP_08_85
,
1276 VEX_LEN_0FXOP_08_86
,
1277 VEX_LEN_0FXOP_08_87
,
1278 VEX_LEN_0FXOP_08_8E
,
1279 VEX_LEN_0FXOP_08_8F
,
1280 VEX_LEN_0FXOP_08_95
,
1281 VEX_LEN_0FXOP_08_96
,
1282 VEX_LEN_0FXOP_08_97
,
1283 VEX_LEN_0FXOP_08_9E
,
1284 VEX_LEN_0FXOP_08_9F
,
1285 VEX_LEN_0FXOP_08_A3
,
1286 VEX_LEN_0FXOP_08_A6
,
1287 VEX_LEN_0FXOP_08_B6
,
1288 VEX_LEN_0FXOP_08_C0
,
1289 VEX_LEN_0FXOP_08_C1
,
1290 VEX_LEN_0FXOP_08_C2
,
1291 VEX_LEN_0FXOP_08_C3
,
1292 VEX_LEN_0FXOP_08_CC
,
1293 VEX_LEN_0FXOP_08_CD
,
1294 VEX_LEN_0FXOP_08_CE
,
1295 VEX_LEN_0FXOP_08_CF
,
1296 VEX_LEN_0FXOP_08_EC
,
1297 VEX_LEN_0FXOP_08_ED
,
1298 VEX_LEN_0FXOP_08_EE
,
1299 VEX_LEN_0FXOP_08_EF
,
1300 VEX_LEN_0FXOP_09_01
,
1301 VEX_LEN_0FXOP_09_02
,
1302 VEX_LEN_0FXOP_09_12_M_1
,
1303 VEX_LEN_0FXOP_09_82_W_0
,
1304 VEX_LEN_0FXOP_09_83_W_0
,
1305 VEX_LEN_0FXOP_09_90
,
1306 VEX_LEN_0FXOP_09_91
,
1307 VEX_LEN_0FXOP_09_92
,
1308 VEX_LEN_0FXOP_09_93
,
1309 VEX_LEN_0FXOP_09_94
,
1310 VEX_LEN_0FXOP_09_95
,
1311 VEX_LEN_0FXOP_09_96
,
1312 VEX_LEN_0FXOP_09_97
,
1313 VEX_LEN_0FXOP_09_98
,
1314 VEX_LEN_0FXOP_09_99
,
1315 VEX_LEN_0FXOP_09_9A
,
1316 VEX_LEN_0FXOP_09_9B
,
1317 VEX_LEN_0FXOP_09_C1
,
1318 VEX_LEN_0FXOP_09_C2
,
1319 VEX_LEN_0FXOP_09_C3
,
1320 VEX_LEN_0FXOP_09_C6
,
1321 VEX_LEN_0FXOP_09_C7
,
1322 VEX_LEN_0FXOP_09_CB
,
1323 VEX_LEN_0FXOP_09_D1
,
1324 VEX_LEN_0FXOP_09_D2
,
1325 VEX_LEN_0FXOP_09_D3
,
1326 VEX_LEN_0FXOP_09_D6
,
1327 VEX_LEN_0FXOP_09_D7
,
1328 VEX_LEN_0FXOP_09_DB
,
1329 VEX_LEN_0FXOP_09_E1
,
1330 VEX_LEN_0FXOP_09_E2
,
1331 VEX_LEN_0FXOP_09_E3
,
1332 VEX_LEN_0FXOP_0A_12
,
1345 EVEX_LEN_0F381A_M_0
,
1346 EVEX_LEN_0F381B_M_0
,
1348 EVEX_LEN_0F385A_M_0
,
1349 EVEX_LEN_0F385B_M_0
,
1350 EVEX_LEN_0F38C6_M_0
,
1351 EVEX_LEN_0F38C7_M_0
,
1363 EVEX_LEN_0F3A21_W_0
,
1375 VEX_W_0F41_L_1_M_1
= 0,
1397 VEX_W_0F381A_M_0_L_1
,
1404 VEX_W_0F3849_X86_64_P_0
,
1405 VEX_W_0F3849_X86_64_P_2
,
1406 VEX_W_0F3849_X86_64_P_3
,
1407 VEX_W_0F384B_X86_64_P_1
,
1408 VEX_W_0F384B_X86_64_P_2
,
1409 VEX_W_0F384B_X86_64_P_3
,
1416 VEX_W_0F385A_M_0_L_0
,
1417 VEX_W_0F385C_X86_64_P_1
,
1418 VEX_W_0F385E_X86_64_P_0
,
1419 VEX_W_0F385E_X86_64_P_1
,
1420 VEX_W_0F385E_X86_64_P_2
,
1421 VEX_W_0F385E_X86_64_P_3
,
1443 VEX_W_0FXOP_08_85_L_0
,
1444 VEX_W_0FXOP_08_86_L_0
,
1445 VEX_W_0FXOP_08_87_L_0
,
1446 VEX_W_0FXOP_08_8E_L_0
,
1447 VEX_W_0FXOP_08_8F_L_0
,
1448 VEX_W_0FXOP_08_95_L_0
,
1449 VEX_W_0FXOP_08_96_L_0
,
1450 VEX_W_0FXOP_08_97_L_0
,
1451 VEX_W_0FXOP_08_9E_L_0
,
1452 VEX_W_0FXOP_08_9F_L_0
,
1453 VEX_W_0FXOP_08_A6_L_0
,
1454 VEX_W_0FXOP_08_B6_L_0
,
1455 VEX_W_0FXOP_08_C0_L_0
,
1456 VEX_W_0FXOP_08_C1_L_0
,
1457 VEX_W_0FXOP_08_C2_L_0
,
1458 VEX_W_0FXOP_08_C3_L_0
,
1459 VEX_W_0FXOP_08_CC_L_0
,
1460 VEX_W_0FXOP_08_CD_L_0
,
1461 VEX_W_0FXOP_08_CE_L_0
,
1462 VEX_W_0FXOP_08_CF_L_0
,
1463 VEX_W_0FXOP_08_EC_L_0
,
1464 VEX_W_0FXOP_08_ED_L_0
,
1465 VEX_W_0FXOP_08_EE_L_0
,
1466 VEX_W_0FXOP_08_EF_L_0
,
1472 VEX_W_0FXOP_09_C1_L_0
,
1473 VEX_W_0FXOP_09_C2_L_0
,
1474 VEX_W_0FXOP_09_C3_L_0
,
1475 VEX_W_0FXOP_09_C6_L_0
,
1476 VEX_W_0FXOP_09_C7_L_0
,
1477 VEX_W_0FXOP_09_CB_L_0
,
1478 VEX_W_0FXOP_09_D1_L_0
,
1479 VEX_W_0FXOP_09_D2_L_0
,
1480 VEX_W_0FXOP_09_D3_L_0
,
1481 VEX_W_0FXOP_09_D6_L_0
,
1482 VEX_W_0FXOP_09_D7_L_0
,
1483 VEX_W_0FXOP_09_DB_L_0
,
1484 VEX_W_0FXOP_09_E1_L_0
,
1485 VEX_W_0FXOP_09_E2_L_0
,
1486 VEX_W_0FXOP_09_E3_L_0
,
1492 EVEX_W_0F12_P_0_M_1
,
1495 EVEX_W_0F16_P_0_M_1
,
1575 EVEX_W_0F381A_M_0_L_n
,
1576 EVEX_W_0F381B_M_0_L_2
,
1602 EVEX_W_0F385A_M_0_L_n
,
1603 EVEX_W_0F385B_M_0_L_2
,
1615 EVEX_W_0F38C7_M_0_L_2
,
1638 typedef void (*op_rtn
) (int bytemode
, int sizeflag
);
1647 unsigned int prefix_requirement
;
1650 /* Upper case letters in the instruction names here are macros.
1651 'A' => print 'b' if no register operands or suffix_always is true
1652 'B' => print 'b' if suffix_always is true
1653 'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
1655 'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
1656 suffix_always is true
1657 'E' => print 'e' if 32-bit form of jcxz
1658 'F' => print 'w' or 'l' depending on address size prefix (loop insns)
1659 'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
1660 'H' => print ",pt" or ",pn" branch hint
1663 'K' => print 'd' or 'q' if rex prefix is present.
1665 'M' => print 'r' if intel_mnemonic is false.
1666 'N' => print 'n' if instruction has no wait "prefix"
1667 'O' => print 'd' or 'o' (or 'q' in Intel mode)
1668 'P' => behave as 'T' except with register operand outside of suffix_always
1670 'Q' => print 'w', 'l' or 'q' for memory operand or suffix_always
1672 'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
1673 'S' => print 'w', 'l' or 'q' if suffix_always is true
1674 'T' => print 'w', 'l'/'d', or 'q' if instruction has an operand size
1675 prefix or if suffix_always is true.
1678 'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
1679 'X' => print 's', 'd' depending on data16 prefix (for XMM)
1681 'Z' => print 'q' in 64bit mode and 'l' otherwise, if suffix_always is true.
1682 '!' => change condition from true to false or from false to true.
1683 '%' => add 1 upper case letter to the macro.
1684 '^' => print 'w', 'l', or 'q' (Intel64 ISA only) depending on operand size
1685 prefix or suffix_always is true (lcall/ljmp).
1686 '@' => in 64bit mode for Intel64 ISA or if instruction
1687 has no operand sizing prefix, print 'q' if suffix_always is true or
1688 nothing otherwise; behave as 'P' in all other cases
1690 2 upper case letter macros:
1691 "XY" => print 'x' or 'y' if suffix_always is true or no register
1692 operands and no broadcast.
1693 "XZ" => print 'x', 'y', or 'z' if suffix_always is true or no
1694 register operands and no broadcast.
1695 "XW" => print 's', 'd' depending on the VEX.W bit (for FMA)
1696 "XV" => print "{vex3}" pseudo prefix
1697 "LQ" => print 'l' ('d' in Intel mode) or 'q' for memory operand, cond
1698 being false, or no operand at all in 64bit mode, or if suffix_always
1700 "LB" => print "abs" in 64bit mode and behave as 'B' otherwise
1701 "LS" => print "abs" in 64bit mode and behave as 'S' otherwise
1702 "LV" => print "abs" for 64bit operand and behave as 'S' otherwise
1703 "DQ" => print 'd' or 'q' depending on the VEX.W bit
1704 "BW" => print 'b' or 'w' depending on the VEX.W bit
1705 "LP" => print 'w' or 'l' ('d' in Intel mode) if instruction has
1706 an operand size prefix, or suffix_always is true. print
1707 'q' if rex prefix is present.
1709 Many of the above letters print nothing in Intel mode. See "putop"
1712 Braces '{' and '}', and vertical bars '|', indicate alternative
1713 mnemonic strings for AT&T and Intel. */
1715 static const struct dis386 dis386
[] = {
1717 { "addB", { Ebh1
, Gb
}, 0 },
1718 { "addS", { Evh1
, Gv
}, 0 },
1719 { "addB", { Gb
, EbS
}, 0 },
1720 { "addS", { Gv
, EvS
}, 0 },
1721 { "addB", { AL
, Ib
}, 0 },
1722 { "addS", { eAX
, Iv
}, 0 },
1723 { X86_64_TABLE (X86_64_06
) },
1724 { X86_64_TABLE (X86_64_07
) },
1726 { "orB", { Ebh1
, Gb
}, 0 },
1727 { "orS", { Evh1
, Gv
}, 0 },
1728 { "orB", { Gb
, EbS
}, 0 },
1729 { "orS", { Gv
, EvS
}, 0 },
1730 { "orB", { AL
, Ib
}, 0 },
1731 { "orS", { eAX
, Iv
}, 0 },
1732 { X86_64_TABLE (X86_64_0E
) },
1733 { Bad_Opcode
}, /* 0x0f extended opcode escape */
1735 { "adcB", { Ebh1
, Gb
}, 0 },
1736 { "adcS", { Evh1
, Gv
}, 0 },
1737 { "adcB", { Gb
, EbS
}, 0 },
1738 { "adcS", { Gv
, EvS
}, 0 },
1739 { "adcB", { AL
, Ib
}, 0 },
1740 { "adcS", { eAX
, Iv
}, 0 },
1741 { X86_64_TABLE (X86_64_16
) },
1742 { X86_64_TABLE (X86_64_17
) },
1744 { "sbbB", { Ebh1
, Gb
}, 0 },
1745 { "sbbS", { Evh1
, Gv
}, 0 },
1746 { "sbbB", { Gb
, EbS
}, 0 },
1747 { "sbbS", { Gv
, EvS
}, 0 },
1748 { "sbbB", { AL
, Ib
}, 0 },
1749 { "sbbS", { eAX
, Iv
}, 0 },
1750 { X86_64_TABLE (X86_64_1E
) },
1751 { X86_64_TABLE (X86_64_1F
) },
1753 { "andB", { Ebh1
, Gb
}, 0 },
1754 { "andS", { Evh1
, Gv
}, 0 },
1755 { "andB", { Gb
, EbS
}, 0 },
1756 { "andS", { Gv
, EvS
}, 0 },
1757 { "andB", { AL
, Ib
}, 0 },
1758 { "andS", { eAX
, Iv
}, 0 },
1759 { Bad_Opcode
}, /* SEG ES prefix */
1760 { X86_64_TABLE (X86_64_27
) },
1762 { "subB", { Ebh1
, Gb
}, 0 },
1763 { "subS", { Evh1
, Gv
}, 0 },
1764 { "subB", { Gb
, EbS
}, 0 },
1765 { "subS", { Gv
, EvS
}, 0 },
1766 { "subB", { AL
, Ib
}, 0 },
1767 { "subS", { eAX
, Iv
}, 0 },
1768 { Bad_Opcode
}, /* SEG CS prefix */
1769 { X86_64_TABLE (X86_64_2F
) },
1771 { "xorB", { Ebh1
, Gb
}, 0 },
1772 { "xorS", { Evh1
, Gv
}, 0 },
1773 { "xorB", { Gb
, EbS
}, 0 },
1774 { "xorS", { Gv
, EvS
}, 0 },
1775 { "xorB", { AL
, Ib
}, 0 },
1776 { "xorS", { eAX
, Iv
}, 0 },
1777 { Bad_Opcode
}, /* SEG SS prefix */
1778 { X86_64_TABLE (X86_64_37
) },
1780 { "cmpB", { Eb
, Gb
}, 0 },
1781 { "cmpS", { Ev
, Gv
}, 0 },
1782 { "cmpB", { Gb
, EbS
}, 0 },
1783 { "cmpS", { Gv
, EvS
}, 0 },
1784 { "cmpB", { AL
, Ib
}, 0 },
1785 { "cmpS", { eAX
, Iv
}, 0 },
1786 { Bad_Opcode
}, /* SEG DS prefix */
1787 { X86_64_TABLE (X86_64_3F
) },
1789 { "inc{S|}", { RMeAX
}, 0 },
1790 { "inc{S|}", { RMeCX
}, 0 },
1791 { "inc{S|}", { RMeDX
}, 0 },
1792 { "inc{S|}", { RMeBX
}, 0 },
1793 { "inc{S|}", { RMeSP
}, 0 },
1794 { "inc{S|}", { RMeBP
}, 0 },
1795 { "inc{S|}", { RMeSI
}, 0 },
1796 { "inc{S|}", { RMeDI
}, 0 },
1798 { "dec{S|}", { RMeAX
}, 0 },
1799 { "dec{S|}", { RMeCX
}, 0 },
1800 { "dec{S|}", { RMeDX
}, 0 },
1801 { "dec{S|}", { RMeBX
}, 0 },
1802 { "dec{S|}", { RMeSP
}, 0 },
1803 { "dec{S|}", { RMeBP
}, 0 },
1804 { "dec{S|}", { RMeSI
}, 0 },
1805 { "dec{S|}", { RMeDI
}, 0 },
1807 { "push{!P|}", { RMrAX
}, 0 },
1808 { "push{!P|}", { RMrCX
}, 0 },
1809 { "push{!P|}", { RMrDX
}, 0 },
1810 { "push{!P|}", { RMrBX
}, 0 },
1811 { "push{!P|}", { RMrSP
}, 0 },
1812 { "push{!P|}", { RMrBP
}, 0 },
1813 { "push{!P|}", { RMrSI
}, 0 },
1814 { "push{!P|}", { RMrDI
}, 0 },
1816 { "pop{!P|}", { RMrAX
}, 0 },
1817 { "pop{!P|}", { RMrCX
}, 0 },
1818 { "pop{!P|}", { RMrDX
}, 0 },
1819 { "pop{!P|}", { RMrBX
}, 0 },
1820 { "pop{!P|}", { RMrSP
}, 0 },
1821 { "pop{!P|}", { RMrBP
}, 0 },
1822 { "pop{!P|}", { RMrSI
}, 0 },
1823 { "pop{!P|}", { RMrDI
}, 0 },
1825 { X86_64_TABLE (X86_64_60
) },
1826 { X86_64_TABLE (X86_64_61
) },
1827 { X86_64_TABLE (X86_64_62
) },
1828 { X86_64_TABLE (X86_64_63
) },
1829 { Bad_Opcode
}, /* seg fs */
1830 { Bad_Opcode
}, /* seg gs */
1831 { Bad_Opcode
}, /* op size prefix */
1832 { Bad_Opcode
}, /* adr size prefix */
1834 { "pushP", { sIv
}, 0 },
1835 { "imulS", { Gv
, Ev
, Iv
}, 0 },
1836 { "pushP", { sIbT
}, 0 },
1837 { "imulS", { Gv
, Ev
, sIb
}, 0 },
1838 { "ins{b|}", { Ybr
, indirDX
}, 0 },
1839 { X86_64_TABLE (X86_64_6D
) },
1840 { "outs{b|}", { indirDXr
, Xb
}, 0 },
1841 { X86_64_TABLE (X86_64_6F
) },
1843 { "joH", { Jb
, BND
, cond_jump_flag
}, 0 },
1844 { "jnoH", { Jb
, BND
, cond_jump_flag
}, 0 },
1845 { "jbH", { Jb
, BND
, cond_jump_flag
}, 0 },
1846 { "jaeH", { Jb
, BND
, cond_jump_flag
}, 0 },
1847 { "jeH", { Jb
, BND
, cond_jump_flag
}, 0 },
1848 { "jneH", { Jb
, BND
, cond_jump_flag
}, 0 },
1849 { "jbeH", { Jb
, BND
, cond_jump_flag
}, 0 },
1850 { "jaH", { Jb
, BND
, cond_jump_flag
}, 0 },
1852 { "jsH", { Jb
, BND
, cond_jump_flag
}, 0 },
1853 { "jnsH", { Jb
, BND
, cond_jump_flag
}, 0 },
1854 { "jpH", { Jb
, BND
, cond_jump_flag
}, 0 },
1855 { "jnpH", { Jb
, BND
, cond_jump_flag
}, 0 },
1856 { "jlH", { Jb
, BND
, cond_jump_flag
}, 0 },
1857 { "jgeH", { Jb
, BND
, cond_jump_flag
}, 0 },
1858 { "jleH", { Jb
, BND
, cond_jump_flag
}, 0 },
1859 { "jgH", { Jb
, BND
, cond_jump_flag
}, 0 },
1861 { REG_TABLE (REG_80
) },
1862 { REG_TABLE (REG_81
) },
1863 { X86_64_TABLE (X86_64_82
) },
1864 { REG_TABLE (REG_83
) },
1865 { "testB", { Eb
, Gb
}, 0 },
1866 { "testS", { Ev
, Gv
}, 0 },
1867 { "xchgB", { Ebh2
, Gb
}, 0 },
1868 { "xchgS", { Evh2
, Gv
}, 0 },
1870 { "movB", { Ebh3
, Gb
}, 0 },
1871 { "movS", { Evh3
, Gv
}, 0 },
1872 { "movB", { Gb
, EbS
}, 0 },
1873 { "movS", { Gv
, EvS
}, 0 },
1874 { "movD", { Sv
, Sw
}, 0 },
1875 { MOD_TABLE (MOD_8D
) },
1876 { "movD", { Sw
, Sv
}, 0 },
1877 { REG_TABLE (REG_8F
) },
1879 { PREFIX_TABLE (PREFIX_90
) },
1880 { "xchgS", { RMeCX
, eAX
}, 0 },
1881 { "xchgS", { RMeDX
, eAX
}, 0 },
1882 { "xchgS", { RMeBX
, eAX
}, 0 },
1883 { "xchgS", { RMeSP
, eAX
}, 0 },
1884 { "xchgS", { RMeBP
, eAX
}, 0 },
1885 { "xchgS", { RMeSI
, eAX
}, 0 },
1886 { "xchgS", { RMeDI
, eAX
}, 0 },
1888 { "cW{t|}R", { XX
}, 0 },
1889 { "cR{t|}O", { XX
}, 0 },
1890 { X86_64_TABLE (X86_64_9A
) },
1891 { Bad_Opcode
}, /* fwait */
1892 { "pushfP", { XX
}, 0 },
1893 { "popfP", { XX
}, 0 },
1894 { "sahf", { XX
}, 0 },
1895 { "lahf", { XX
}, 0 },
1897 { "mov%LB", { AL
, Ob
}, 0 },
1898 { "mov%LS", { eAX
, Ov
}, 0 },
1899 { "mov%LB", { Ob
, AL
}, 0 },
1900 { "mov%LS", { Ov
, eAX
}, 0 },
1901 { "movs{b|}", { Ybr
, Xb
}, 0 },
1902 { "movs{R|}", { Yvr
, Xv
}, 0 },
1903 { "cmps{b|}", { Xb
, Yb
}, 0 },
1904 { "cmps{R|}", { Xv
, Yv
}, 0 },
1906 { "testB", { AL
, Ib
}, 0 },
1907 { "testS", { eAX
, Iv
}, 0 },
1908 { "stosB", { Ybr
, AL
}, 0 },
1909 { "stosS", { Yvr
, eAX
}, 0 },
1910 { "lodsB", { ALr
, Xb
}, 0 },
1911 { "lodsS", { eAXr
, Xv
}, 0 },
1912 { "scasB", { AL
, Yb
}, 0 },
1913 { "scasS", { eAX
, Yv
}, 0 },
1915 { "movB", { RMAL
, Ib
}, 0 },
1916 { "movB", { RMCL
, Ib
}, 0 },
1917 { "movB", { RMDL
, Ib
}, 0 },
1918 { "movB", { RMBL
, Ib
}, 0 },
1919 { "movB", { RMAH
, Ib
}, 0 },
1920 { "movB", { RMCH
, Ib
}, 0 },
1921 { "movB", { RMDH
, Ib
}, 0 },
1922 { "movB", { RMBH
, Ib
}, 0 },
1924 { "mov%LV", { RMeAX
, Iv64
}, 0 },
1925 { "mov%LV", { RMeCX
, Iv64
}, 0 },
1926 { "mov%LV", { RMeDX
, Iv64
}, 0 },
1927 { "mov%LV", { RMeBX
, Iv64
}, 0 },
1928 { "mov%LV", { RMeSP
, Iv64
}, 0 },
1929 { "mov%LV", { RMeBP
, Iv64
}, 0 },
1930 { "mov%LV", { RMeSI
, Iv64
}, 0 },
1931 { "mov%LV", { RMeDI
, Iv64
}, 0 },
1933 { REG_TABLE (REG_C0
) },
1934 { REG_TABLE (REG_C1
) },
1935 { X86_64_TABLE (X86_64_C2
) },
1936 { X86_64_TABLE (X86_64_C3
) },
1937 { X86_64_TABLE (X86_64_C4
) },
1938 { X86_64_TABLE (X86_64_C5
) },
1939 { REG_TABLE (REG_C6
) },
1940 { REG_TABLE (REG_C7
) },
1942 { "enterP", { Iw
, Ib
}, 0 },
1943 { "leaveP", { XX
}, 0 },
1944 { "{l|}ret{|f}%LP", { Iw
}, 0 },
1945 { "{l|}ret{|f}%LP", { XX
}, 0 },
1946 { "int3", { XX
}, 0 },
1947 { "int", { Ib
}, 0 },
1948 { X86_64_TABLE (X86_64_CE
) },
1949 { "iret%LP", { XX
}, 0 },
1951 { REG_TABLE (REG_D0
) },
1952 { REG_TABLE (REG_D1
) },
1953 { REG_TABLE (REG_D2
) },
1954 { REG_TABLE (REG_D3
) },
1955 { X86_64_TABLE (X86_64_D4
) },
1956 { X86_64_TABLE (X86_64_D5
) },
1958 { "xlat", { DSBX
}, 0 },
1969 { "loopneFH", { Jb
, XX
, loop_jcxz_flag
}, 0 },
1970 { "loopeFH", { Jb
, XX
, loop_jcxz_flag
}, 0 },
1971 { "loopFH", { Jb
, XX
, loop_jcxz_flag
}, 0 },
1972 { "jEcxzH", { Jb
, XX
, loop_jcxz_flag
}, 0 },
1973 { "inB", { AL
, Ib
}, 0 },
1974 { "inG", { zAX
, Ib
}, 0 },
1975 { "outB", { Ib
, AL
}, 0 },
1976 { "outG", { Ib
, zAX
}, 0 },
1978 { X86_64_TABLE (X86_64_E8
) },
1979 { X86_64_TABLE (X86_64_E9
) },
1980 { X86_64_TABLE (X86_64_EA
) },
1981 { "jmp", { Jb
, BND
}, 0 },
1982 { "inB", { AL
, indirDX
}, 0 },
1983 { "inG", { zAX
, indirDX
}, 0 },
1984 { "outB", { indirDX
, AL
}, 0 },
1985 { "outG", { indirDX
, zAX
}, 0 },
1987 { Bad_Opcode
}, /* lock prefix */
1988 { "icebp", { XX
}, 0 },
1989 { Bad_Opcode
}, /* repne */
1990 { Bad_Opcode
}, /* repz */
1991 { "hlt", { XX
}, 0 },
1992 { "cmc", { XX
}, 0 },
1993 { REG_TABLE (REG_F6
) },
1994 { REG_TABLE (REG_F7
) },
1996 { "clc", { XX
}, 0 },
1997 { "stc", { XX
}, 0 },
1998 { "cli", { XX
}, 0 },
1999 { "sti", { XX
}, 0 },
2000 { "cld", { XX
}, 0 },
2001 { "std", { XX
}, 0 },
2002 { REG_TABLE (REG_FE
) },
2003 { REG_TABLE (REG_FF
) },
2006 static const struct dis386 dis386_twobyte
[] = {
2008 { REG_TABLE (REG_0F00
) },
2009 { REG_TABLE (REG_0F01
) },
2010 { "larS", { Gv
, Ew
}, 0 },
2011 { "lslS", { Gv
, Ew
}, 0 },
2013 { "syscall", { XX
}, 0 },
2014 { "clts", { XX
}, 0 },
2015 { "sysret%LQ", { XX
}, 0 },
2017 { "invd", { XX
}, 0 },
2018 { PREFIX_TABLE (PREFIX_0F09
) },
2020 { "ud2", { XX
}, 0 },
2022 { REG_TABLE (REG_0F0D
) },
2023 { "femms", { XX
}, 0 },
2024 { "", { MX
, EM
, OPSUF
}, 0 }, /* See OP_3DNowSuffix. */
2026 { PREFIX_TABLE (PREFIX_0F10
) },
2027 { PREFIX_TABLE (PREFIX_0F11
) },
2028 { PREFIX_TABLE (PREFIX_0F12
) },
2029 { MOD_TABLE (MOD_0F13
) },
2030 { "unpcklpX", { XM
, EXx
}, PREFIX_OPCODE
},
2031 { "unpckhpX", { XM
, EXx
}, PREFIX_OPCODE
},
2032 { PREFIX_TABLE (PREFIX_0F16
) },
2033 { MOD_TABLE (MOD_0F17
) },
2035 { REG_TABLE (REG_0F18
) },
2036 { "nopQ", { Ev
}, 0 },
2037 { PREFIX_TABLE (PREFIX_0F1A
) },
2038 { PREFIX_TABLE (PREFIX_0F1B
) },
2039 { PREFIX_TABLE (PREFIX_0F1C
) },
2040 { "nopQ", { Ev
}, 0 },
2041 { PREFIX_TABLE (PREFIX_0F1E
) },
2042 { "nopQ", { Ev
}, 0 },
2044 { "movZ", { Em
, Cm
}, 0 },
2045 { "movZ", { Em
, Dm
}, 0 },
2046 { "movZ", { Cm
, Em
}, 0 },
2047 { "movZ", { Dm
, Em
}, 0 },
2048 { X86_64_TABLE (X86_64_0F24
) },
2050 { X86_64_TABLE (X86_64_0F26
) },
2053 { "movapX", { XM
, EXx
}, PREFIX_OPCODE
},
2054 { "movapX", { EXxS
, XM
}, PREFIX_OPCODE
},
2055 { PREFIX_TABLE (PREFIX_0F2A
) },
2056 { PREFIX_TABLE (PREFIX_0F2B
) },
2057 { PREFIX_TABLE (PREFIX_0F2C
) },
2058 { PREFIX_TABLE (PREFIX_0F2D
) },
2059 { PREFIX_TABLE (PREFIX_0F2E
) },
2060 { PREFIX_TABLE (PREFIX_0F2F
) },
2062 { "wrmsr", { XX
}, 0 },
2063 { "rdtsc", { XX
}, 0 },
2064 { "rdmsr", { XX
}, 0 },
2065 { "rdpmc", { XX
}, 0 },
2066 { "sysenter", { SEP
}, 0 },
2067 { "sysexit%LQ", { SEP
}, 0 },
2069 { "getsec", { XX
}, 0 },
2071 { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F38
, PREFIX_OPCODE
) },
2073 { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F3A
, PREFIX_OPCODE
) },
2080 { "cmovoS", { Gv
, Ev
}, 0 },
2081 { "cmovnoS", { Gv
, Ev
}, 0 },
2082 { "cmovbS", { Gv
, Ev
}, 0 },
2083 { "cmovaeS", { Gv
, Ev
}, 0 },
2084 { "cmoveS", { Gv
, Ev
}, 0 },
2085 { "cmovneS", { Gv
, Ev
}, 0 },
2086 { "cmovbeS", { Gv
, Ev
}, 0 },
2087 { "cmovaS", { Gv
, Ev
}, 0 },
2089 { "cmovsS", { Gv
, Ev
}, 0 },
2090 { "cmovnsS", { Gv
, Ev
}, 0 },
2091 { "cmovpS", { Gv
, Ev
}, 0 },
2092 { "cmovnpS", { Gv
, Ev
}, 0 },
2093 { "cmovlS", { Gv
, Ev
}, 0 },
2094 { "cmovgeS", { Gv
, Ev
}, 0 },
2095 { "cmovleS", { Gv
, Ev
}, 0 },
2096 { "cmovgS", { Gv
, Ev
}, 0 },
2098 { MOD_TABLE (MOD_0F50
) },
2099 { PREFIX_TABLE (PREFIX_0F51
) },
2100 { PREFIX_TABLE (PREFIX_0F52
) },
2101 { PREFIX_TABLE (PREFIX_0F53
) },
2102 { "andpX", { XM
, EXx
}, PREFIX_OPCODE
},
2103 { "andnpX", { XM
, EXx
}, PREFIX_OPCODE
},
2104 { "orpX", { XM
, EXx
}, PREFIX_OPCODE
},
2105 { "xorpX", { XM
, EXx
}, PREFIX_OPCODE
},
2107 { PREFIX_TABLE (PREFIX_0F58
) },
2108 { PREFIX_TABLE (PREFIX_0F59
) },
2109 { PREFIX_TABLE (PREFIX_0F5A
) },
2110 { PREFIX_TABLE (PREFIX_0F5B
) },
2111 { PREFIX_TABLE (PREFIX_0F5C
) },
2112 { PREFIX_TABLE (PREFIX_0F5D
) },
2113 { PREFIX_TABLE (PREFIX_0F5E
) },
2114 { PREFIX_TABLE (PREFIX_0F5F
) },
2116 { PREFIX_TABLE (PREFIX_0F60
) },
2117 { PREFIX_TABLE (PREFIX_0F61
) },
2118 { PREFIX_TABLE (PREFIX_0F62
) },
2119 { "packsswb", { MX
, EM
}, PREFIX_OPCODE
},
2120 { "pcmpgtb", { MX
, EM
}, PREFIX_OPCODE
},
2121 { "pcmpgtw", { MX
, EM
}, PREFIX_OPCODE
},
2122 { "pcmpgtd", { MX
, EM
}, PREFIX_OPCODE
},
2123 { "packuswb", { MX
, EM
}, PREFIX_OPCODE
},
2125 { "punpckhbw", { MX
, EM
}, PREFIX_OPCODE
},
2126 { "punpckhwd", { MX
, EM
}, PREFIX_OPCODE
},
2127 { "punpckhdq", { MX
, EM
}, PREFIX_OPCODE
},
2128 { "packssdw", { MX
, EM
}, PREFIX_OPCODE
},
2129 { "punpcklqdq", { XM
, EXx
}, PREFIX_DATA
},
2130 { "punpckhqdq", { XM
, EXx
}, PREFIX_DATA
},
2131 { "movK", { MX
, Edq
}, PREFIX_OPCODE
},
2132 { PREFIX_TABLE (PREFIX_0F6F
) },
2134 { PREFIX_TABLE (PREFIX_0F70
) },
2135 { MOD_TABLE (MOD_0F71
) },
2136 { MOD_TABLE (MOD_0F72
) },
2137 { MOD_TABLE (MOD_0F73
) },
2138 { "pcmpeqb", { MX
, EM
}, PREFIX_OPCODE
},
2139 { "pcmpeqw", { MX
, EM
}, PREFIX_OPCODE
},
2140 { "pcmpeqd", { MX
, EM
}, PREFIX_OPCODE
},
2141 { "emms", { XX
}, PREFIX_OPCODE
},
2143 { PREFIX_TABLE (PREFIX_0F78
) },
2144 { PREFIX_TABLE (PREFIX_0F79
) },
2147 { PREFIX_TABLE (PREFIX_0F7C
) },
2148 { PREFIX_TABLE (PREFIX_0F7D
) },
2149 { PREFIX_TABLE (PREFIX_0F7E
) },
2150 { PREFIX_TABLE (PREFIX_0F7F
) },
2152 { "joH", { Jv
, BND
, cond_jump_flag
}, 0 },
2153 { "jnoH", { Jv
, BND
, cond_jump_flag
}, 0 },
2154 { "jbH", { Jv
, BND
, cond_jump_flag
}, 0 },
2155 { "jaeH", { Jv
, BND
, cond_jump_flag
}, 0 },
2156 { "jeH", { Jv
, BND
, cond_jump_flag
}, 0 },
2157 { "jneH", { Jv
, BND
, cond_jump_flag
}, 0 },
2158 { "jbeH", { Jv
, BND
, cond_jump_flag
}, 0 },
2159 { "jaH", { Jv
, BND
, cond_jump_flag
}, 0 },
2161 { "jsH", { Jv
, BND
, cond_jump_flag
}, 0 },
2162 { "jnsH", { Jv
, BND
, cond_jump_flag
}, 0 },
2163 { "jpH", { Jv
, BND
, cond_jump_flag
}, 0 },
2164 { "jnpH", { Jv
, BND
, cond_jump_flag
}, 0 },
2165 { "jlH", { Jv
, BND
, cond_jump_flag
}, 0 },
2166 { "jgeH", { Jv
, BND
, cond_jump_flag
}, 0 },
2167 { "jleH", { Jv
, BND
, cond_jump_flag
}, 0 },
2168 { "jgH", { Jv
, BND
, cond_jump_flag
}, 0 },
2170 { "seto", { Eb
}, 0 },
2171 { "setno", { Eb
}, 0 },
2172 { "setb", { Eb
}, 0 },
2173 { "setae", { Eb
}, 0 },
2174 { "sete", { Eb
}, 0 },
2175 { "setne", { Eb
}, 0 },
2176 { "setbe", { Eb
}, 0 },
2177 { "seta", { Eb
}, 0 },
2179 { "sets", { Eb
}, 0 },
2180 { "setns", { Eb
}, 0 },
2181 { "setp", { Eb
}, 0 },
2182 { "setnp", { Eb
}, 0 },
2183 { "setl", { Eb
}, 0 },
2184 { "setge", { Eb
}, 0 },
2185 { "setle", { Eb
}, 0 },
2186 { "setg", { Eb
}, 0 },
2188 { "pushP", { fs
}, 0 },
2189 { "popP", { fs
}, 0 },
2190 { "cpuid", { XX
}, 0 },
2191 { "btS", { Ev
, Gv
}, 0 },
2192 { "shldS", { Ev
, Gv
, Ib
}, 0 },
2193 { "shldS", { Ev
, Gv
, CL
}, 0 },
2194 { REG_TABLE (REG_0FA6
) },
2195 { REG_TABLE (REG_0FA7
) },
2197 { "pushP", { gs
}, 0 },
2198 { "popP", { gs
}, 0 },
2199 { "rsm", { XX
}, 0 },
2200 { "btsS", { Evh1
, Gv
}, 0 },
2201 { "shrdS", { Ev
, Gv
, Ib
}, 0 },
2202 { "shrdS", { Ev
, Gv
, CL
}, 0 },
2203 { REG_TABLE (REG_0FAE
) },
2204 { "imulS", { Gv
, Ev
}, 0 },
2206 { "cmpxchgB", { Ebh1
, Gb
}, 0 },
2207 { "cmpxchgS", { Evh1
, Gv
}, 0 },
2208 { MOD_TABLE (MOD_0FB2
) },
2209 { "btrS", { Evh1
, Gv
}, 0 },
2210 { MOD_TABLE (MOD_0FB4
) },
2211 { MOD_TABLE (MOD_0FB5
) },
2212 { "movz{bR|x}", { Gv
, Eb
}, 0 },
2213 { "movz{wR|x}", { Gv
, Ew
}, 0 }, /* yes, there really is movzww ! */
2215 { PREFIX_TABLE (PREFIX_0FB8
) },
2216 { "ud1S", { Gv
, Ev
}, 0 },
2217 { REG_TABLE (REG_0FBA
) },
2218 { "btcS", { Evh1
, Gv
}, 0 },
2219 { PREFIX_TABLE (PREFIX_0FBC
) },
2220 { PREFIX_TABLE (PREFIX_0FBD
) },
2221 { "movs{bR|x}", { Gv
, Eb
}, 0 },
2222 { "movs{wR|x}", { Gv
, Ew
}, 0 }, /* yes, there really is movsww ! */
2224 { "xaddB", { Ebh1
, Gb
}, 0 },
2225 { "xaddS", { Evh1
, Gv
}, 0 },
2226 { PREFIX_TABLE (PREFIX_0FC2
) },
2227 { MOD_TABLE (MOD_0FC3
) },
2228 { "pinsrw", { MX
, Edqw
, Ib
}, PREFIX_OPCODE
},
2229 { "pextrw", { Gdq
, MS
, Ib
}, PREFIX_OPCODE
},
2230 { "shufpX", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
2231 { REG_TABLE (REG_0FC7
) },
2233 { "bswap", { RMeAX
}, 0 },
2234 { "bswap", { RMeCX
}, 0 },
2235 { "bswap", { RMeDX
}, 0 },
2236 { "bswap", { RMeBX
}, 0 },
2237 { "bswap", { RMeSP
}, 0 },
2238 { "bswap", { RMeBP
}, 0 },
2239 { "bswap", { RMeSI
}, 0 },
2240 { "bswap", { RMeDI
}, 0 },
2242 { PREFIX_TABLE (PREFIX_0FD0
) },
2243 { "psrlw", { MX
, EM
}, PREFIX_OPCODE
},
2244 { "psrld", { MX
, EM
}, PREFIX_OPCODE
},
2245 { "psrlq", { MX
, EM
}, PREFIX_OPCODE
},
2246 { "paddq", { MX
, EM
}, PREFIX_OPCODE
},
2247 { "pmullw", { MX
, EM
}, PREFIX_OPCODE
},
2248 { PREFIX_TABLE (PREFIX_0FD6
) },
2249 { MOD_TABLE (MOD_0FD7
) },
2251 { "psubusb", { MX
, EM
}, PREFIX_OPCODE
},
2252 { "psubusw", { MX
, EM
}, PREFIX_OPCODE
},
2253 { "pminub", { MX
, EM
}, PREFIX_OPCODE
},
2254 { "pand", { MX
, EM
}, PREFIX_OPCODE
},
2255 { "paddusb", { MX
, EM
}, PREFIX_OPCODE
},
2256 { "paddusw", { MX
, EM
}, PREFIX_OPCODE
},
2257 { "pmaxub", { MX
, EM
}, PREFIX_OPCODE
},
2258 { "pandn", { MX
, EM
}, PREFIX_OPCODE
},
2260 { "pavgb", { MX
, EM
}, PREFIX_OPCODE
},
2261 { "psraw", { MX
, EM
}, PREFIX_OPCODE
},
2262 { "psrad", { MX
, EM
}, PREFIX_OPCODE
},
2263 { "pavgw", { MX
, EM
}, PREFIX_OPCODE
},
2264 { "pmulhuw", { MX
, EM
}, PREFIX_OPCODE
},
2265 { "pmulhw", { MX
, EM
}, PREFIX_OPCODE
},
2266 { PREFIX_TABLE (PREFIX_0FE6
) },
2267 { PREFIX_TABLE (PREFIX_0FE7
) },
2269 { "psubsb", { MX
, EM
}, PREFIX_OPCODE
},
2270 { "psubsw", { MX
, EM
}, PREFIX_OPCODE
},
2271 { "pminsw", { MX
, EM
}, PREFIX_OPCODE
},
2272 { "por", { MX
, EM
}, PREFIX_OPCODE
},
2273 { "paddsb", { MX
, EM
}, PREFIX_OPCODE
},
2274 { "paddsw", { MX
, EM
}, PREFIX_OPCODE
},
2275 { "pmaxsw", { MX
, EM
}, PREFIX_OPCODE
},
2276 { "pxor", { MX
, EM
}, PREFIX_OPCODE
},
2278 { PREFIX_TABLE (PREFIX_0FF0
) },
2279 { "psllw", { MX
, EM
}, PREFIX_OPCODE
},
2280 { "pslld", { MX
, EM
}, PREFIX_OPCODE
},
2281 { "psllq", { MX
, EM
}, PREFIX_OPCODE
},
2282 { "pmuludq", { MX
, EM
}, PREFIX_OPCODE
},
2283 { "pmaddwd", { MX
, EM
}, PREFIX_OPCODE
},
2284 { "psadbw", { MX
, EM
}, PREFIX_OPCODE
},
2285 { PREFIX_TABLE (PREFIX_0FF7
) },
2287 { "psubb", { MX
, EM
}, PREFIX_OPCODE
},
2288 { "psubw", { MX
, EM
}, PREFIX_OPCODE
},
2289 { "psubd", { MX
, EM
}, PREFIX_OPCODE
},
2290 { "psubq", { MX
, EM
}, PREFIX_OPCODE
},
2291 { "paddb", { MX
, EM
}, PREFIX_OPCODE
},
2292 { "paddw", { MX
, EM
}, PREFIX_OPCODE
},
2293 { "paddd", { MX
, EM
}, PREFIX_OPCODE
},
2294 { "ud0S", { Gv
, Ev
}, 0 },
2297 static const unsigned char onebyte_has_modrm
[256] = {
2298 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2299 /* ------------------------------- */
2300 /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
2301 /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
2302 /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
2303 /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
2304 /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
2305 /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
2306 /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
2307 /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
2308 /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
2309 /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
2310 /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
2311 /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
2312 /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
2313 /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
2314 /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
2315 /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1 /* f0 */
2316 /* ------------------------------- */
2317 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2320 static const unsigned char twobyte_has_modrm
[256] = {
2321 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2322 /* ------------------------------- */
2323 /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
2324 /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
2325 /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
2326 /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
2327 /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
2328 /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
2329 /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
2330 /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
2331 /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
2332 /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
2333 /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
2334 /* b0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* bf */
2335 /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
2336 /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
2337 /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
2338 /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 /* ff */
2339 /* ------------------------------- */
2340 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2343 static char obuf
[100];
2345 static char *mnemonicendp
;
2346 static char scratchbuf
[100];
2347 static unsigned char *start_codep
;
2348 static unsigned char *insn_codep
;
2349 static unsigned char *codep
;
2350 static unsigned char *end_codep
;
2351 static int last_lock_prefix
;
2352 static int last_repz_prefix
;
2353 static int last_repnz_prefix
;
2354 static int last_data_prefix
;
2355 static int last_addr_prefix
;
2356 static int last_rex_prefix
;
2357 static int last_seg_prefix
;
2358 static int fwait_prefix
;
2359 /* The active segment register prefix. */
2360 static int active_seg_prefix
;
2361 #define MAX_CODE_LENGTH 15
2362 /* We can up to 14 prefixes since the maximum instruction length is
2364 static int all_prefixes
[MAX_CODE_LENGTH
- 1];
2365 static disassemble_info
*the_info
;
2373 static unsigned char need_modrm
;
2383 int register_specifier
;
2390 int mask_register_specifier
;
2396 static unsigned char need_vex
;
2404 /* If we are accessing mod/rm/reg without need_modrm set, then the
2405 values are stale. Hitting this abort likely indicates that you
2406 need to update onebyte_has_modrm or twobyte_has_modrm. */
2407 #define MODRM_CHECK if (!need_modrm) abort ()
2409 static const char **names64
;
2410 static const char **names32
;
2411 static const char **names16
;
2412 static const char **names8
;
2413 static const char **names8rex
;
2414 static const char **names_seg
;
2415 static const char *index64
;
2416 static const char *index32
;
2417 static const char **index16
;
2418 static const char **names_bnd
;
2420 static const char *intel_names64
[] = {
2421 "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
2422 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2424 static const char *intel_names32
[] = {
2425 "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
2426 "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
2428 static const char *intel_names16
[] = {
2429 "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
2430 "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
2432 static const char *intel_names8
[] = {
2433 "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
2435 static const char *intel_names8rex
[] = {
2436 "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
2437 "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
2439 static const char *intel_names_seg
[] = {
2440 "es", "cs", "ss", "ds", "fs", "gs", "?", "?",
2442 static const char *intel_index64
= "riz";
2443 static const char *intel_index32
= "eiz";
2444 static const char *intel_index16
[] = {
2445 "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
2448 static const char *att_names64
[] = {
2449 "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
2450 "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
2452 static const char *att_names32
[] = {
2453 "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
2454 "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
2456 static const char *att_names16
[] = {
2457 "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
2458 "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
2460 static const char *att_names8
[] = {
2461 "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
2463 static const char *att_names8rex
[] = {
2464 "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
2465 "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
2467 static const char *att_names_seg
[] = {
2468 "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
2470 static const char *att_index64
= "%riz";
2471 static const char *att_index32
= "%eiz";
2472 static const char *att_index16
[] = {
2473 "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
2476 static const char **names_mm
;
2477 static const char *intel_names_mm
[] = {
2478 "mm0", "mm1", "mm2", "mm3",
2479 "mm4", "mm5", "mm6", "mm7"
2481 static const char *att_names_mm
[] = {
2482 "%mm0", "%mm1", "%mm2", "%mm3",
2483 "%mm4", "%mm5", "%mm6", "%mm7"
2486 static const char *intel_names_bnd
[] = {
2487 "bnd0", "bnd1", "bnd2", "bnd3"
2490 static const char *att_names_bnd
[] = {
2491 "%bnd0", "%bnd1", "%bnd2", "%bnd3"
2494 static const char **names_xmm
;
2495 static const char *intel_names_xmm
[] = {
2496 "xmm0", "xmm1", "xmm2", "xmm3",
2497 "xmm4", "xmm5", "xmm6", "xmm7",
2498 "xmm8", "xmm9", "xmm10", "xmm11",
2499 "xmm12", "xmm13", "xmm14", "xmm15",
2500 "xmm16", "xmm17", "xmm18", "xmm19",
2501 "xmm20", "xmm21", "xmm22", "xmm23",
2502 "xmm24", "xmm25", "xmm26", "xmm27",
2503 "xmm28", "xmm29", "xmm30", "xmm31"
2505 static const char *att_names_xmm
[] = {
2506 "%xmm0", "%xmm1", "%xmm2", "%xmm3",
2507 "%xmm4", "%xmm5", "%xmm6", "%xmm7",
2508 "%xmm8", "%xmm9", "%xmm10", "%xmm11",
2509 "%xmm12", "%xmm13", "%xmm14", "%xmm15",
2510 "%xmm16", "%xmm17", "%xmm18", "%xmm19",
2511 "%xmm20", "%xmm21", "%xmm22", "%xmm23",
2512 "%xmm24", "%xmm25", "%xmm26", "%xmm27",
2513 "%xmm28", "%xmm29", "%xmm30", "%xmm31"
2516 static const char **names_ymm
;
2517 static const char *intel_names_ymm
[] = {
2518 "ymm0", "ymm1", "ymm2", "ymm3",
2519 "ymm4", "ymm5", "ymm6", "ymm7",
2520 "ymm8", "ymm9", "ymm10", "ymm11",
2521 "ymm12", "ymm13", "ymm14", "ymm15",
2522 "ymm16", "ymm17", "ymm18", "ymm19",
2523 "ymm20", "ymm21", "ymm22", "ymm23",
2524 "ymm24", "ymm25", "ymm26", "ymm27",
2525 "ymm28", "ymm29", "ymm30", "ymm31"
2527 static const char *att_names_ymm
[] = {
2528 "%ymm0", "%ymm1", "%ymm2", "%ymm3",
2529 "%ymm4", "%ymm5", "%ymm6", "%ymm7",
2530 "%ymm8", "%ymm9", "%ymm10", "%ymm11",
2531 "%ymm12", "%ymm13", "%ymm14", "%ymm15",
2532 "%ymm16", "%ymm17", "%ymm18", "%ymm19",
2533 "%ymm20", "%ymm21", "%ymm22", "%ymm23",
2534 "%ymm24", "%ymm25", "%ymm26", "%ymm27",
2535 "%ymm28", "%ymm29", "%ymm30", "%ymm31"
2538 static const char **names_zmm
;
2539 static const char *intel_names_zmm
[] = {
2540 "zmm0", "zmm1", "zmm2", "zmm3",
2541 "zmm4", "zmm5", "zmm6", "zmm7",
2542 "zmm8", "zmm9", "zmm10", "zmm11",
2543 "zmm12", "zmm13", "zmm14", "zmm15",
2544 "zmm16", "zmm17", "zmm18", "zmm19",
2545 "zmm20", "zmm21", "zmm22", "zmm23",
2546 "zmm24", "zmm25", "zmm26", "zmm27",
2547 "zmm28", "zmm29", "zmm30", "zmm31"
2549 static const char *att_names_zmm
[] = {
2550 "%zmm0", "%zmm1", "%zmm2", "%zmm3",
2551 "%zmm4", "%zmm5", "%zmm6", "%zmm7",
2552 "%zmm8", "%zmm9", "%zmm10", "%zmm11",
2553 "%zmm12", "%zmm13", "%zmm14", "%zmm15",
2554 "%zmm16", "%zmm17", "%zmm18", "%zmm19",
2555 "%zmm20", "%zmm21", "%zmm22", "%zmm23",
2556 "%zmm24", "%zmm25", "%zmm26", "%zmm27",
2557 "%zmm28", "%zmm29", "%zmm30", "%zmm31"
2560 static const char **names_tmm
;
2561 static const char *intel_names_tmm
[] = {
2562 "tmm0", "tmm1", "tmm2", "tmm3",
2563 "tmm4", "tmm5", "tmm6", "tmm7"
2565 static const char *att_names_tmm
[] = {
2566 "%tmm0", "%tmm1", "%tmm2", "%tmm3",
2567 "%tmm4", "%tmm5", "%tmm6", "%tmm7"
2570 static const char **names_mask
;
2571 static const char *intel_names_mask
[] = {
2572 "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7"
2574 static const char *att_names_mask
[] = {
2575 "%k0", "%k1", "%k2", "%k3", "%k4", "%k5", "%k6", "%k7"
2578 static const char *names_rounding
[] =
2586 static const struct dis386 reg_table
[][8] = {
2589 { "addA", { Ebh1
, Ib
}, 0 },
2590 { "orA", { Ebh1
, Ib
}, 0 },
2591 { "adcA", { Ebh1
, Ib
}, 0 },
2592 { "sbbA", { Ebh1
, Ib
}, 0 },
2593 { "andA", { Ebh1
, Ib
}, 0 },
2594 { "subA", { Ebh1
, Ib
}, 0 },
2595 { "xorA", { Ebh1
, Ib
}, 0 },
2596 { "cmpA", { Eb
, Ib
}, 0 },
2600 { "addQ", { Evh1
, Iv
}, 0 },
2601 { "orQ", { Evh1
, Iv
}, 0 },
2602 { "adcQ", { Evh1
, Iv
}, 0 },
2603 { "sbbQ", { Evh1
, Iv
}, 0 },
2604 { "andQ", { Evh1
, Iv
}, 0 },
2605 { "subQ", { Evh1
, Iv
}, 0 },
2606 { "xorQ", { Evh1
, Iv
}, 0 },
2607 { "cmpQ", { Ev
, Iv
}, 0 },
2611 { "addQ", { Evh1
, sIb
}, 0 },
2612 { "orQ", { Evh1
, sIb
}, 0 },
2613 { "adcQ", { Evh1
, sIb
}, 0 },
2614 { "sbbQ", { Evh1
, sIb
}, 0 },
2615 { "andQ", { Evh1
, sIb
}, 0 },
2616 { "subQ", { Evh1
, sIb
}, 0 },
2617 { "xorQ", { Evh1
, sIb
}, 0 },
2618 { "cmpQ", { Ev
, sIb
}, 0 },
2622 { "pop{P|}", { stackEv
}, 0 },
2623 { XOP_8F_TABLE (XOP_09
) },
2627 { XOP_8F_TABLE (XOP_09
) },
2631 { "rolA", { Eb
, Ib
}, 0 },
2632 { "rorA", { Eb
, Ib
}, 0 },
2633 { "rclA", { Eb
, Ib
}, 0 },
2634 { "rcrA", { Eb
, Ib
}, 0 },
2635 { "shlA", { Eb
, Ib
}, 0 },
2636 { "shrA", { Eb
, Ib
}, 0 },
2637 { "shlA", { Eb
, Ib
}, 0 },
2638 { "sarA", { Eb
, Ib
}, 0 },
2642 { "rolQ", { Ev
, Ib
}, 0 },
2643 { "rorQ", { Ev
, Ib
}, 0 },
2644 { "rclQ", { Ev
, Ib
}, 0 },
2645 { "rcrQ", { Ev
, Ib
}, 0 },
2646 { "shlQ", { Ev
, Ib
}, 0 },
2647 { "shrQ", { Ev
, Ib
}, 0 },
2648 { "shlQ", { Ev
, Ib
}, 0 },
2649 { "sarQ", { Ev
, Ib
}, 0 },
2653 { "movA", { Ebh3
, Ib
}, 0 },
2660 { MOD_TABLE (MOD_C6_REG_7
) },
2664 { "movQ", { Evh3
, Iv
}, 0 },
2671 { MOD_TABLE (MOD_C7_REG_7
) },
2675 { "rolA", { Eb
, I1
}, 0 },
2676 { "rorA", { Eb
, I1
}, 0 },
2677 { "rclA", { Eb
, I1
}, 0 },
2678 { "rcrA", { Eb
, I1
}, 0 },
2679 { "shlA", { Eb
, I1
}, 0 },
2680 { "shrA", { Eb
, I1
}, 0 },
2681 { "shlA", { Eb
, I1
}, 0 },
2682 { "sarA", { Eb
, I1
}, 0 },
2686 { "rolQ", { Ev
, I1
}, 0 },
2687 { "rorQ", { Ev
, I1
}, 0 },
2688 { "rclQ", { Ev
, I1
}, 0 },
2689 { "rcrQ", { Ev
, I1
}, 0 },
2690 { "shlQ", { Ev
, I1
}, 0 },
2691 { "shrQ", { Ev
, I1
}, 0 },
2692 { "shlQ", { Ev
, I1
}, 0 },
2693 { "sarQ", { Ev
, I1
}, 0 },
2697 { "rolA", { Eb
, CL
}, 0 },
2698 { "rorA", { Eb
, CL
}, 0 },
2699 { "rclA", { Eb
, CL
}, 0 },
2700 { "rcrA", { Eb
, CL
}, 0 },
2701 { "shlA", { Eb
, CL
}, 0 },
2702 { "shrA", { Eb
, CL
}, 0 },
2703 { "shlA", { Eb
, CL
}, 0 },
2704 { "sarA", { Eb
, CL
}, 0 },
2708 { "rolQ", { Ev
, CL
}, 0 },
2709 { "rorQ", { Ev
, CL
}, 0 },
2710 { "rclQ", { Ev
, CL
}, 0 },
2711 { "rcrQ", { Ev
, CL
}, 0 },
2712 { "shlQ", { Ev
, CL
}, 0 },
2713 { "shrQ", { Ev
, CL
}, 0 },
2714 { "shlQ", { Ev
, CL
}, 0 },
2715 { "sarQ", { Ev
, CL
}, 0 },
2719 { "testA", { Eb
, Ib
}, 0 },
2720 { "testA", { Eb
, Ib
}, 0 },
2721 { "notA", { Ebh1
}, 0 },
2722 { "negA", { Ebh1
}, 0 },
2723 { "mulA", { Eb
}, 0 }, /* Don't print the implicit %al register, */
2724 { "imulA", { Eb
}, 0 }, /* to distinguish these opcodes from other */
2725 { "divA", { Eb
}, 0 }, /* mul/imul opcodes. Do the same for div */
2726 { "idivA", { Eb
}, 0 }, /* and idiv for consistency. */
2730 { "testQ", { Ev
, Iv
}, 0 },
2731 { "testQ", { Ev
, Iv
}, 0 },
2732 { "notQ", { Evh1
}, 0 },
2733 { "negQ", { Evh1
}, 0 },
2734 { "mulQ", { Ev
}, 0 }, /* Don't print the implicit register. */
2735 { "imulQ", { Ev
}, 0 },
2736 { "divQ", { Ev
}, 0 },
2737 { "idivQ", { Ev
}, 0 },
2741 { "incA", { Ebh1
}, 0 },
2742 { "decA", { Ebh1
}, 0 },
2746 { "incQ", { Evh1
}, 0 },
2747 { "decQ", { Evh1
}, 0 },
2748 { "call{@|}", { NOTRACK
, indirEv
, BND
}, 0 },
2749 { MOD_TABLE (MOD_FF_REG_3
) },
2750 { "jmp{@|}", { NOTRACK
, indirEv
, BND
}, 0 },
2751 { MOD_TABLE (MOD_FF_REG_5
) },
2752 { "push{P|}", { stackEv
}, 0 },
2757 { "sldtD", { Sv
}, 0 },
2758 { "strD", { Sv
}, 0 },
2759 { "lldt", { Ew
}, 0 },
2760 { "ltr", { Ew
}, 0 },
2761 { "verr", { Ew
}, 0 },
2762 { "verw", { Ew
}, 0 },
2768 { MOD_TABLE (MOD_0F01_REG_0
) },
2769 { MOD_TABLE (MOD_0F01_REG_1
) },
2770 { MOD_TABLE (MOD_0F01_REG_2
) },
2771 { MOD_TABLE (MOD_0F01_REG_3
) },
2772 { "smswD", { Sv
}, 0 },
2773 { MOD_TABLE (MOD_0F01_REG_5
) },
2774 { "lmsw", { Ew
}, 0 },
2775 { MOD_TABLE (MOD_0F01_REG_7
) },
2779 { "prefetch", { Mb
}, 0 },
2780 { "prefetchw", { Mb
}, 0 },
2781 { "prefetchwt1", { Mb
}, 0 },
2782 { "prefetch", { Mb
}, 0 },
2783 { "prefetch", { Mb
}, 0 },
2784 { "prefetch", { Mb
}, 0 },
2785 { "prefetch", { Mb
}, 0 },
2786 { "prefetch", { Mb
}, 0 },
2790 { MOD_TABLE (MOD_0F18_REG_0
) },
2791 { MOD_TABLE (MOD_0F18_REG_1
) },
2792 { MOD_TABLE (MOD_0F18_REG_2
) },
2793 { MOD_TABLE (MOD_0F18_REG_3
) },
2794 { "nopQ", { Ev
}, 0 },
2795 { "nopQ", { Ev
}, 0 },
2796 { "nopQ", { Ev
}, 0 },
2797 { "nopQ", { Ev
}, 0 },
2799 /* REG_0F1C_P_0_MOD_0 */
2801 { "cldemote", { Mb
}, 0 },
2802 { "nopQ", { Ev
}, 0 },
2803 { "nopQ", { Ev
}, 0 },
2804 { "nopQ", { Ev
}, 0 },
2805 { "nopQ", { Ev
}, 0 },
2806 { "nopQ", { Ev
}, 0 },
2807 { "nopQ", { Ev
}, 0 },
2808 { "nopQ", { Ev
}, 0 },
2810 /* REG_0F1E_P_1_MOD_3 */
2812 { "nopQ", { Ev
}, PREFIX_IGNORED
},
2813 { "rdsspK", { Edq
}, 0 },
2814 { "nopQ", { Ev
}, PREFIX_IGNORED
},
2815 { "nopQ", { Ev
}, PREFIX_IGNORED
},
2816 { "nopQ", { Ev
}, PREFIX_IGNORED
},
2817 { "nopQ", { Ev
}, PREFIX_IGNORED
},
2818 { "nopQ", { Ev
}, PREFIX_IGNORED
},
2819 { RM_TABLE (RM_0F1E_P_1_MOD_3_REG_7
) },
2821 /* REG_0F38D8_PREFIX_1 */
2823 { "aesencwide128kl", { M
}, 0 },
2824 { "aesdecwide128kl", { M
}, 0 },
2825 { "aesencwide256kl", { M
}, 0 },
2826 { "aesdecwide256kl", { M
}, 0 },
2828 /* REG_0F3A0F_PREFIX_1_MOD_3 */
2830 { RM_TABLE (RM_0F3A0F_P_1_MOD_3_REG_0
) },
2832 /* REG_0F71_MOD_0 */
2836 { "psrlw", { MS
, Ib
}, PREFIX_OPCODE
},
2838 { "psraw", { MS
, Ib
}, PREFIX_OPCODE
},
2840 { "psllw", { MS
, Ib
}, PREFIX_OPCODE
},
2842 /* REG_0F72_MOD_0 */
2846 { "psrld", { MS
, Ib
}, PREFIX_OPCODE
},
2848 { "psrad", { MS
, Ib
}, PREFIX_OPCODE
},
2850 { "pslld", { MS
, Ib
}, PREFIX_OPCODE
},
2852 /* REG_0F73_MOD_0 */
2856 { "psrlq", { MS
, Ib
}, PREFIX_OPCODE
},
2857 { "psrldq", { XS
, Ib
}, PREFIX_DATA
},
2860 { "psllq", { MS
, Ib
}, PREFIX_OPCODE
},
2861 { "pslldq", { XS
, Ib
}, PREFIX_DATA
},
2865 { "montmul", { { OP_0f07
, 0 } }, 0 },
2866 { "xsha1", { { OP_0f07
, 0 } }, 0 },
2867 { "xsha256", { { OP_0f07
, 0 } }, 0 },
2871 { "xstore-rng", { { OP_0f07
, 0 } }, 0 },
2872 { "xcrypt-ecb", { { OP_0f07
, 0 } }, 0 },
2873 { "xcrypt-cbc", { { OP_0f07
, 0 } }, 0 },
2874 { "xcrypt-ctr", { { OP_0f07
, 0 } }, 0 },
2875 { "xcrypt-cfb", { { OP_0f07
, 0 } }, 0 },
2876 { "xcrypt-ofb", { { OP_0f07
, 0 } }, 0 },
2880 { MOD_TABLE (MOD_0FAE_REG_0
) },
2881 { MOD_TABLE (MOD_0FAE_REG_1
) },
2882 { MOD_TABLE (MOD_0FAE_REG_2
) },
2883 { MOD_TABLE (MOD_0FAE_REG_3
) },
2884 { MOD_TABLE (MOD_0FAE_REG_4
) },
2885 { MOD_TABLE (MOD_0FAE_REG_5
) },
2886 { MOD_TABLE (MOD_0FAE_REG_6
) },
2887 { MOD_TABLE (MOD_0FAE_REG_7
) },
2895 { "btQ", { Ev
, Ib
}, 0 },
2896 { "btsQ", { Evh1
, Ib
}, 0 },
2897 { "btrQ", { Evh1
, Ib
}, 0 },
2898 { "btcQ", { Evh1
, Ib
}, 0 },
2903 { "cmpxchg8b", { { CMPXCHG8B_Fixup
, q_mode
} }, 0 },
2905 { MOD_TABLE (MOD_0FC7_REG_3
) },
2906 { MOD_TABLE (MOD_0FC7_REG_4
) },
2907 { MOD_TABLE (MOD_0FC7_REG_5
) },
2908 { MOD_TABLE (MOD_0FC7_REG_6
) },
2909 { MOD_TABLE (MOD_0FC7_REG_7
) },
2911 /* REG_VEX_0F71_M_0 */
2915 { "vpsrlw", { Vex
, XS
, Ib
}, PREFIX_DATA
},
2917 { "vpsraw", { Vex
, XS
, Ib
}, PREFIX_DATA
},
2919 { "vpsllw", { Vex
, XS
, Ib
}, PREFIX_DATA
},
2921 /* REG_VEX_0F72_M_0 */
2925 { "vpsrld", { Vex
, XS
, Ib
}, PREFIX_DATA
},
2927 { "vpsrad", { Vex
, XS
, Ib
}, PREFIX_DATA
},
2929 { "vpslld", { Vex
, XS
, Ib
}, PREFIX_DATA
},
2931 /* REG_VEX_0F73_M_0 */
2935 { "vpsrlq", { Vex
, XS
, Ib
}, PREFIX_DATA
},
2936 { "vpsrldq", { Vex
, XS
, Ib
}, PREFIX_DATA
},
2939 { "vpsllq", { Vex
, XS
, Ib
}, PREFIX_DATA
},
2940 { "vpslldq", { Vex
, XS
, Ib
}, PREFIX_DATA
},
2946 { MOD_TABLE (MOD_VEX_0FAE_REG_2
) },
2947 { MOD_TABLE (MOD_VEX_0FAE_REG_3
) },
2949 /* REG_VEX_0F3849_X86_64_P_0_W_0_M_1 */
2951 { RM_TABLE (RM_VEX_0F3849_X86_64_P_0_W_0_M_1_R_0
) },
2953 /* REG_VEX_0F38F3_L_0 */
2956 { "blsrS", { VexGdq
, Edq
}, PREFIX_OPCODE
},
2957 { "blsmskS", { VexGdq
, Edq
}, PREFIX_OPCODE
},
2958 { "blsiS", { VexGdq
, Edq
}, PREFIX_OPCODE
},
2960 /* REG_0FXOP_09_01_L_0 */
2963 { "blcfill", { VexGdq
, Edq
}, 0 },
2964 { "blsfill", { VexGdq
, Edq
}, 0 },
2965 { "blcs", { VexGdq
, Edq
}, 0 },
2966 { "tzmsk", { VexGdq
, Edq
}, 0 },
2967 { "blcic", { VexGdq
, Edq
}, 0 },
2968 { "blsic", { VexGdq
, Edq
}, 0 },
2969 { "t1mskc", { VexGdq
, Edq
}, 0 },
2971 /* REG_0FXOP_09_02_L_0 */
2974 { "blcmsk", { VexGdq
, Edq
}, 0 },
2979 { "blci", { VexGdq
, Edq
}, 0 },
2981 /* REG_0FXOP_09_12_M_1_L_0 */
2983 { "llwpcb", { Edq
}, 0 },
2984 { "slwpcb", { Edq
}, 0 },
2986 /* REG_0FXOP_0A_12_L_0 */
2988 { "lwpins", { VexGdq
, Ed
, Id
}, 0 },
2989 { "lwpval", { VexGdq
, Ed
, Id
}, 0 },
2992 #include "i386-dis-evex-reg.h"
2995 static const struct dis386 prefix_table
[][4] = {
2998 { "xchgS", { { NOP_Fixup1
, eAX_reg
}, { NOP_Fixup2
, eAX_reg
} }, 0 },
2999 { "pause", { XX
}, 0 },
3000 { "xchgS", { { NOP_Fixup1
, eAX_reg
}, { NOP_Fixup2
, eAX_reg
} }, 0 },
3001 { NULL
, { { NULL
, 0 } }, PREFIX_IGNORED
}
3004 /* PREFIX_0F01_REG_1_RM_4 */
3008 { "tdcall", { Skip_MODRM
}, 0 },
3012 /* PREFIX_0F01_REG_1_RM_5 */
3016 { X86_64_TABLE (X86_64_0F01_REG_1_RM_5_PREFIX_2
) },
3020 /* PREFIX_0F01_REG_1_RM_6 */
3024 { X86_64_TABLE (X86_64_0F01_REG_1_RM_6_PREFIX_2
) },
3028 /* PREFIX_0F01_REG_1_RM_7 */
3030 { "encls", { Skip_MODRM
}, 0 },
3032 { X86_64_TABLE (X86_64_0F01_REG_1_RM_7_PREFIX_2
) },
3036 /* PREFIX_0F01_REG_3_RM_1 */
3038 { "vmmcall", { Skip_MODRM
}, 0 },
3039 { "vmgexit", { Skip_MODRM
}, 0 },
3041 { "vmgexit", { Skip_MODRM
}, 0 },
3044 /* PREFIX_0F01_REG_5_MOD_0 */
3047 { "rstorssp", { Mq
}, PREFIX_OPCODE
},
3050 /* PREFIX_0F01_REG_5_MOD_3_RM_0 */
3052 { "serialize", { Skip_MODRM
}, PREFIX_OPCODE
},
3053 { "setssbsy", { Skip_MODRM
}, PREFIX_OPCODE
},
3055 { "xsusldtrk", { Skip_MODRM
}, PREFIX_OPCODE
},
3058 /* PREFIX_0F01_REG_5_MOD_3_RM_1 */
3063 { "xresldtrk", { Skip_MODRM
}, PREFIX_OPCODE
},
3066 /* PREFIX_0F01_REG_5_MOD_3_RM_2 */
3069 { "saveprevssp", { Skip_MODRM
}, PREFIX_OPCODE
},
3072 /* PREFIX_0F01_REG_5_MOD_3_RM_4 */
3075 { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_4_PREFIX_1
) },
3078 /* PREFIX_0F01_REG_5_MOD_3_RM_5 */
3081 { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_5_PREFIX_1
) },
3084 /* PREFIX_0F01_REG_5_MOD_3_RM_6 */
3086 { "rdpkru", { Skip_MODRM
}, 0 },
3087 { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_6_PREFIX_1
) },
3090 /* PREFIX_0F01_REG_5_MOD_3_RM_7 */
3092 { "wrpkru", { Skip_MODRM
}, 0 },
3093 { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_7_PREFIX_1
) },
3096 /* PREFIX_0F01_REG_7_MOD_3_RM_2 */
3098 { "monitorx", { { OP_Monitor
, 0 } }, 0 },
3099 { "mcommit", { Skip_MODRM
}, 0 },
3102 /* PREFIX_0F01_REG_7_MOD_3_RM_6 */
3104 { "invlpgb", { Skip_MODRM
}, 0 },
3105 { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_1
) },
3107 { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3
) },
3110 /* PREFIX_0F01_REG_7_MOD_3_RM_7 */
3112 { "tlbsync", { Skip_MODRM
}, 0 },
3113 { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_7_PREFIX_1
) },
3115 { "pvalidate", { Skip_MODRM
}, 0 },
3120 { "wbinvd", { XX
}, 0 },
3121 { "wbnoinvd", { XX
}, 0 },
3126 { "movups", { XM
, EXx
}, PREFIX_OPCODE
},
3127 { "movss", { XM
, EXd
}, PREFIX_OPCODE
},
3128 { "movupd", { XM
, EXx
}, PREFIX_OPCODE
},
3129 { "movsd", { XM
, EXq
}, PREFIX_OPCODE
},
3134 { "movups", { EXxS
, XM
}, PREFIX_OPCODE
},
3135 { "movss", { EXdS
, XM
}, PREFIX_OPCODE
},
3136 { "movupd", { EXxS
, XM
}, PREFIX_OPCODE
},
3137 { "movsd", { EXqS
, XM
}, PREFIX_OPCODE
},
3142 { MOD_TABLE (MOD_0F12_PREFIX_0
) },
3143 { "movsldup", { XM
, EXx
}, PREFIX_OPCODE
},
3144 { MOD_TABLE (MOD_0F12_PREFIX_2
) },
3145 { "movddup", { XM
, EXq
}, PREFIX_OPCODE
},
3150 { MOD_TABLE (MOD_0F16_PREFIX_0
) },
3151 { "movshdup", { XM
, EXx
}, PREFIX_OPCODE
},
3152 { MOD_TABLE (MOD_0F16_PREFIX_2
) },
3157 { MOD_TABLE (MOD_0F1A_PREFIX_0
) },
3158 { "bndcl", { Gbnd
, Ev_bnd
}, 0 },
3159 { "bndmov", { Gbnd
, Ebnd
}, 0 },
3160 { "bndcu", { Gbnd
, Ev_bnd
}, 0 },
3165 { MOD_TABLE (MOD_0F1B_PREFIX_0
) },
3166 { MOD_TABLE (MOD_0F1B_PREFIX_1
) },
3167 { "bndmov", { EbndS
, Gbnd
}, 0 },
3168 { "bndcn", { Gbnd
, Ev_bnd
}, 0 },
3173 { MOD_TABLE (MOD_0F1C_PREFIX_0
) },
3174 { "nopQ", { Ev
}, PREFIX_IGNORED
},
3175 { "nopQ", { Ev
}, 0 },
3176 { "nopQ", { Ev
}, PREFIX_IGNORED
},
3181 { "nopQ", { Ev
}, 0 },
3182 { MOD_TABLE (MOD_0F1E_PREFIX_1
) },
3183 { "nopQ", { Ev
}, 0 },
3184 { NULL
, { XX
}, PREFIX_IGNORED
},
3189 { "cvtpi2ps", { XM
, EMCq
}, PREFIX_OPCODE
},
3190 { "cvtsi2ss{%LQ|}", { XM
, Edq
}, PREFIX_OPCODE
},
3191 { "cvtpi2pd", { XM
, EMCq
}, PREFIX_OPCODE
},
3192 { "cvtsi2sd{%LQ|}", { XM
, Edq
}, 0 },
3197 { MOD_TABLE (MOD_0F2B_PREFIX_0
) },
3198 { MOD_TABLE (MOD_0F2B_PREFIX_1
) },
3199 { MOD_TABLE (MOD_0F2B_PREFIX_2
) },
3200 { MOD_TABLE (MOD_0F2B_PREFIX_3
) },
3205 { "cvttps2pi", { MXC
, EXq
}, PREFIX_OPCODE
},
3206 { "cvttss2si", { Gdq
, EXd
}, PREFIX_OPCODE
},
3207 { "cvttpd2pi", { MXC
, EXx
}, PREFIX_OPCODE
},
3208 { "cvttsd2si", { Gdq
, EXq
}, PREFIX_OPCODE
},
3213 { "cvtps2pi", { MXC
, EXq
}, PREFIX_OPCODE
},
3214 { "cvtss2si", { Gdq
, EXd
}, PREFIX_OPCODE
},
3215 { "cvtpd2pi", { MXC
, EXx
}, PREFIX_OPCODE
},
3216 { "cvtsd2si", { Gdq
, EXq
}, PREFIX_OPCODE
},
3221 { "ucomiss",{ XM
, EXd
}, 0 },
3223 { "ucomisd",{ XM
, EXq
}, 0 },
3228 { "comiss", { XM
, EXd
}, 0 },
3230 { "comisd", { XM
, EXq
}, 0 },
3235 { "sqrtps", { XM
, EXx
}, PREFIX_OPCODE
},
3236 { "sqrtss", { XM
, EXd
}, PREFIX_OPCODE
},
3237 { "sqrtpd", { XM
, EXx
}, PREFIX_OPCODE
},
3238 { "sqrtsd", { XM
, EXq
}, PREFIX_OPCODE
},
3243 { "rsqrtps",{ XM
, EXx
}, PREFIX_OPCODE
},
3244 { "rsqrtss",{ XM
, EXd
}, PREFIX_OPCODE
},
3249 { "rcpps", { XM
, EXx
}, PREFIX_OPCODE
},
3250 { "rcpss", { XM
, EXd
}, PREFIX_OPCODE
},
3255 { "addps", { XM
, EXx
}, PREFIX_OPCODE
},
3256 { "addss", { XM
, EXd
}, PREFIX_OPCODE
},
3257 { "addpd", { XM
, EXx
}, PREFIX_OPCODE
},
3258 { "addsd", { XM
, EXq
}, PREFIX_OPCODE
},
3263 { "mulps", { XM
, EXx
}, PREFIX_OPCODE
},
3264 { "mulss", { XM
, EXd
}, PREFIX_OPCODE
},
3265 { "mulpd", { XM
, EXx
}, PREFIX_OPCODE
},
3266 { "mulsd", { XM
, EXq
}, PREFIX_OPCODE
},
3271 { "cvtps2pd", { XM
, EXq
}, PREFIX_OPCODE
},
3272 { "cvtss2sd", { XM
, EXd
}, PREFIX_OPCODE
},
3273 { "cvtpd2ps", { XM
, EXx
}, PREFIX_OPCODE
},
3274 { "cvtsd2ss", { XM
, EXq
}, PREFIX_OPCODE
},
3279 { "cvtdq2ps", { XM
, EXx
}, PREFIX_OPCODE
},
3280 { "cvttps2dq", { XM
, EXx
}, PREFIX_OPCODE
},
3281 { "cvtps2dq", { XM
, EXx
}, PREFIX_OPCODE
},
3286 { "subps", { XM
, EXx
}, PREFIX_OPCODE
},
3287 { "subss", { XM
, EXd
}, PREFIX_OPCODE
},
3288 { "subpd", { XM
, EXx
}, PREFIX_OPCODE
},
3289 { "subsd", { XM
, EXq
}, PREFIX_OPCODE
},
3294 { "minps", { XM
, EXx
}, PREFIX_OPCODE
},
3295 { "minss", { XM
, EXd
}, PREFIX_OPCODE
},
3296 { "minpd", { XM
, EXx
}, PREFIX_OPCODE
},
3297 { "minsd", { XM
, EXq
}, PREFIX_OPCODE
},
3302 { "divps", { XM
, EXx
}, PREFIX_OPCODE
},
3303 { "divss", { XM
, EXd
}, PREFIX_OPCODE
},
3304 { "divpd", { XM
, EXx
}, PREFIX_OPCODE
},
3305 { "divsd", { XM
, EXq
}, PREFIX_OPCODE
},
3310 { "maxps", { XM
, EXx
}, PREFIX_OPCODE
},
3311 { "maxss", { XM
, EXd
}, PREFIX_OPCODE
},
3312 { "maxpd", { XM
, EXx
}, PREFIX_OPCODE
},
3313 { "maxsd", { XM
, EXq
}, PREFIX_OPCODE
},
3318 { "punpcklbw",{ MX
, EMd
}, PREFIX_OPCODE
},
3320 { "punpcklbw",{ MX
, EMx
}, PREFIX_OPCODE
},
3325 { "punpcklwd",{ MX
, EMd
}, PREFIX_OPCODE
},
3327 { "punpcklwd",{ MX
, EMx
}, PREFIX_OPCODE
},
3332 { "punpckldq",{ MX
, EMd
}, PREFIX_OPCODE
},
3334 { "punpckldq",{ MX
, EMx
}, PREFIX_OPCODE
},
3339 { "movq", { MX
, EM
}, PREFIX_OPCODE
},
3340 { "movdqu", { XM
, EXx
}, PREFIX_OPCODE
},
3341 { "movdqa", { XM
, EXx
}, PREFIX_OPCODE
},
3346 { "pshufw", { MX
, EM
, Ib
}, PREFIX_OPCODE
},
3347 { "pshufhw",{ XM
, EXx
, Ib
}, PREFIX_OPCODE
},
3348 { "pshufd", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
3349 { "pshuflw",{ XM
, EXx
, Ib
}, PREFIX_OPCODE
},
3354 {"vmread", { Em
, Gm
}, 0 },
3356 {"extrq", { XS
, Ib
, Ib
}, 0 },
3357 {"insertq", { XM
, XS
, Ib
, Ib
}, 0 },
3362 {"vmwrite", { Gm
, Em
}, 0 },
3364 {"extrq", { XM
, XS
}, 0 },
3365 {"insertq", { XM
, XS
}, 0 },
3372 { "haddpd", { XM
, EXx
}, PREFIX_OPCODE
},
3373 { "haddps", { XM
, EXx
}, PREFIX_OPCODE
},
3380 { "hsubpd", { XM
, EXx
}, PREFIX_OPCODE
},
3381 { "hsubps", { XM
, EXx
}, PREFIX_OPCODE
},
3386 { "movK", { Edq
, MX
}, PREFIX_OPCODE
},
3387 { "movq", { XM
, EXq
}, PREFIX_OPCODE
},
3388 { "movK", { Edq
, XM
}, PREFIX_OPCODE
},
3393 { "movq", { EMS
, MX
}, PREFIX_OPCODE
},
3394 { "movdqu", { EXxS
, XM
}, PREFIX_OPCODE
},
3395 { "movdqa", { EXxS
, XM
}, PREFIX_OPCODE
},
3398 /* PREFIX_0FAE_REG_0_MOD_3 */
3401 { "rdfsbase", { Ev
}, 0 },
3404 /* PREFIX_0FAE_REG_1_MOD_3 */
3407 { "rdgsbase", { Ev
}, 0 },
3410 /* PREFIX_0FAE_REG_2_MOD_3 */
3413 { "wrfsbase", { Ev
}, 0 },
3416 /* PREFIX_0FAE_REG_3_MOD_3 */
3419 { "wrgsbase", { Ev
}, 0 },
3422 /* PREFIX_0FAE_REG_4_MOD_0 */
3424 { "xsave", { FXSAVE
}, 0 },
3425 { "ptwrite{%LQ|}", { Edq
}, 0 },
3428 /* PREFIX_0FAE_REG_4_MOD_3 */
3431 { "ptwrite{%LQ|}", { Edq
}, 0 },
3434 /* PREFIX_0FAE_REG_5_MOD_3 */
3436 { "lfence", { Skip_MODRM
}, 0 },
3437 { "incsspK", { Edq
}, PREFIX_OPCODE
},
3440 /* PREFIX_0FAE_REG_6_MOD_0 */
3442 { "xsaveopt", { FXSAVE
}, PREFIX_OPCODE
},
3443 { "clrssbsy", { Mq
}, PREFIX_OPCODE
},
3444 { "clwb", { Mb
}, PREFIX_OPCODE
},
3447 /* PREFIX_0FAE_REG_6_MOD_3 */
3449 { RM_TABLE (RM_0FAE_REG_6_MOD_3_P_0
) },
3450 { "umonitor", { Eva
}, PREFIX_OPCODE
},
3451 { "tpause", { Edq
}, PREFIX_OPCODE
},
3452 { "umwait", { Edq
}, PREFIX_OPCODE
},
3455 /* PREFIX_0FAE_REG_7_MOD_0 */
3457 { "clflush", { Mb
}, 0 },
3459 { "clflushopt", { Mb
}, 0 },
3465 { "popcntS", { Gv
, Ev
}, 0 },
3470 { "bsfS", { Gv
, Ev
}, 0 },
3471 { "tzcntS", { Gv
, Ev
}, 0 },
3472 { "bsfS", { Gv
, Ev
}, 0 },
3477 { "bsrS", { Gv
, Ev
}, 0 },
3478 { "lzcntS", { Gv
, Ev
}, 0 },
3479 { "bsrS", { Gv
, Ev
}, 0 },
3484 { "cmpps", { XM
, EXx
, CMP
}, PREFIX_OPCODE
},
3485 { "cmpss", { XM
, EXd
, CMP
}, PREFIX_OPCODE
},
3486 { "cmppd", { XM
, EXx
, CMP
}, PREFIX_OPCODE
},
3487 { "cmpsd", { XM
, EXq
, CMP
}, PREFIX_OPCODE
},
3490 /* PREFIX_0FC7_REG_6_MOD_0 */
3492 { "vmptrld",{ Mq
}, 0 },
3493 { "vmxon", { Mq
}, 0 },
3494 { "vmclear",{ Mq
}, 0 },
3497 /* PREFIX_0FC7_REG_6_MOD_3 */
3499 { "rdrand", { Ev
}, 0 },
3500 { X86_64_TABLE (X86_64_0FC7_REG_6_MOD_3_PREFIX_1
) },
3501 { "rdrand", { Ev
}, 0 }
3504 /* PREFIX_0FC7_REG_7_MOD_3 */
3506 { "rdseed", { Ev
}, 0 },
3507 { "rdpid", { Em
}, 0 },
3508 { "rdseed", { Ev
}, 0 },
3515 { "addsubpd", { XM
, EXx
}, 0 },
3516 { "addsubps", { XM
, EXx
}, 0 },
3522 { "movq2dq",{ XM
, MS
}, 0 },
3523 { "movq", { EXqS
, XM
}, 0 },
3524 { "movdq2q",{ MX
, XS
}, 0 },
3530 { "cvtdq2pd", { XM
, EXq
}, PREFIX_OPCODE
},
3531 { "cvttpd2dq", { XM
, EXx
}, PREFIX_OPCODE
},
3532 { "cvtpd2dq", { XM
, EXx
}, PREFIX_OPCODE
},
3537 { "movntq", { Mq
, MX
}, PREFIX_OPCODE
},
3539 { MOD_TABLE (MOD_0FE7_PREFIX_2
) },
3547 { MOD_TABLE (MOD_0FF0_PREFIX_3
) },
3552 { "maskmovq", { MX
, MS
}, PREFIX_OPCODE
},
3554 { "maskmovdqu", { XM
, XS
}, PREFIX_OPCODE
},
3560 { REG_TABLE (REG_0F38D8_PREFIX_1
) },
3566 { MOD_TABLE (MOD_0F38DC_PREFIX_1
) },
3567 { "aesenc", { XM
, EXx
}, 0 },
3573 { MOD_TABLE (MOD_0F38DD_PREFIX_1
) },
3574 { "aesenclast", { XM
, EXx
}, 0 },
3580 { MOD_TABLE (MOD_0F38DE_PREFIX_1
) },
3581 { "aesdec", { XM
, EXx
}, 0 },
3587 { MOD_TABLE (MOD_0F38DF_PREFIX_1
) },
3588 { "aesdeclast", { XM
, EXx
}, 0 },
3593 { "movbeS", { Gv
, Mv
}, PREFIX_OPCODE
},
3595 { "movbeS", { Gv
, Mv
}, PREFIX_OPCODE
},
3596 { "crc32A", { Gdq
, Eb
}, PREFIX_OPCODE
},
3601 { "movbeS", { Mv
, Gv
}, PREFIX_OPCODE
},
3603 { "movbeS", { Mv
, Gv
}, PREFIX_OPCODE
},
3604 { "crc32Q", { Gdq
, Ev
}, PREFIX_OPCODE
},
3609 { MOD_TABLE (MOD_0F38F6_PREFIX_0
) },
3610 { "adoxS", { Gdq
, Edq
}, PREFIX_OPCODE
},
3611 { "adcxS", { Gdq
, Edq
}, PREFIX_OPCODE
},
3618 { MOD_TABLE (MOD_0F38F8_PREFIX_1
) },
3619 { MOD_TABLE (MOD_0F38F8_PREFIX_2
) },
3620 { MOD_TABLE (MOD_0F38F8_PREFIX_3
) },
3625 { MOD_TABLE (MOD_0F38FA_PREFIX_1
) },
3631 { MOD_TABLE (MOD_0F38FB_PREFIX_1
) },
3637 { MOD_TABLE (MOD_0F3A0F_PREFIX_1
)},
3640 /* PREFIX_VEX_0F10 */
3642 { "vmovups", { XM
, EXx
}, 0 },
3643 { "vmovss", { XMScalar
, VexScalarR
, EXxmm_md
}, 0 },
3644 { "vmovupd", { XM
, EXx
}, 0 },
3645 { "vmovsd", { XMScalar
, VexScalarR
, EXxmm_mq
}, 0 },
3648 /* PREFIX_VEX_0F11 */
3650 { "vmovups", { EXxS
, XM
}, 0 },
3651 { "vmovss", { EXdS
, VexScalarR
, XMScalar
}, 0 },
3652 { "vmovupd", { EXxS
, XM
}, 0 },
3653 { "vmovsd", { EXqS
, VexScalarR
, XMScalar
}, 0 },
3656 /* PREFIX_VEX_0F12 */
3658 { MOD_TABLE (MOD_VEX_0F12_PREFIX_0
) },
3659 { "vmovsldup", { XM
, EXx
}, 0 },
3660 { MOD_TABLE (MOD_VEX_0F12_PREFIX_2
) },
3661 { "vmovddup", { XM
, EXymmq
}, 0 },
3664 /* PREFIX_VEX_0F16 */
3666 { MOD_TABLE (MOD_VEX_0F16_PREFIX_0
) },
3667 { "vmovshdup", { XM
, EXx
}, 0 },
3668 { MOD_TABLE (MOD_VEX_0F16_PREFIX_2
) },
3671 /* PREFIX_VEX_0F2A */
3674 { "vcvtsi2ss{%LQ|}", { XMScalar
, VexScalar
, Edq
}, 0 },
3676 { "vcvtsi2sd{%LQ|}", { XMScalar
, VexScalar
, Edq
}, 0 },
3679 /* PREFIX_VEX_0F2C */
3682 { "vcvttss2si", { Gdq
, EXxmm_md
, EXxEVexS
}, 0 },
3684 { "vcvttsd2si", { Gdq
, EXxmm_mq
, EXxEVexS
}, 0 },
3687 /* PREFIX_VEX_0F2D */
3690 { "vcvtss2si", { Gdq
, EXxmm_md
, EXxEVexR
}, 0 },
3692 { "vcvtsd2si", { Gdq
, EXxmm_mq
, EXxEVexR
}, 0 },
3695 /* PREFIX_VEX_0F2E */
3697 { "vucomisX", { XMScalar
, EXxmm_md
, EXxEVexS
}, PREFIX_OPCODE
},
3699 { "vucomisX", { XMScalar
, EXxmm_mq
, EXxEVexS
}, PREFIX_OPCODE
},
3702 /* PREFIX_VEX_0F2F */
3704 { "vcomisX", { XMScalar
, EXxmm_md
, EXxEVexS
}, PREFIX_OPCODE
},
3706 { "vcomisX", { XMScalar
, EXxmm_mq
, EXxEVexS
}, PREFIX_OPCODE
},
3709 /* PREFIX_VEX_0F41_L_1_M_1_W_0 */
3711 { "kandw", { MaskG
, MaskVex
, MaskE
}, 0 },
3713 { "kandb", { MaskG
, MaskVex
, MaskE
}, 0 },
3716 /* PREFIX_VEX_0F41_L_1_M_1_W_1 */
3718 { "kandq", { MaskG
, MaskVex
, MaskE
}, 0 },
3720 { "kandd", { MaskG
, MaskVex
, MaskE
}, 0 },
3723 /* PREFIX_VEX_0F42_L_1_M_1_W_0 */
3725 { "kandnw", { MaskG
, MaskVex
, MaskE
}, 0 },
3727 { "kandnb", { MaskG
, MaskVex
, MaskE
}, 0 },
3730 /* PREFIX_VEX_0F42_L_1_M_1_W_1 */
3732 { "kandnq", { MaskG
, MaskVex
, MaskE
}, 0 },
3734 { "kandnd", { MaskG
, MaskVex
, MaskE
}, 0 },
3737 /* PREFIX_VEX_0F44_L_0_M_1_W_0 */
3739 { "knotw", { MaskG
, MaskE
}, 0 },
3741 { "knotb", { MaskG
, MaskE
}, 0 },
3744 /* PREFIX_VEX_0F44_L_0_M_1_W_1 */
3746 { "knotq", { MaskG
, MaskE
}, 0 },
3748 { "knotd", { MaskG
, MaskE
}, 0 },
3751 /* PREFIX_VEX_0F45_L_1_M_1_W_0 */
3753 { "korw", { MaskG
, MaskVex
, MaskE
}, 0 },
3755 { "korb", { MaskG
, MaskVex
, MaskE
}, 0 },
3758 /* PREFIX_VEX_0F45_L_1_M_1_W_1 */
3760 { "korq", { MaskG
, MaskVex
, MaskE
}, 0 },
3762 { "kord", { MaskG
, MaskVex
, MaskE
}, 0 },
3765 /* PREFIX_VEX_0F46_L_1_M_1_W_0 */
3767 { "kxnorw", { MaskG
, MaskVex
, MaskE
}, 0 },
3769 { "kxnorb", { MaskG
, MaskVex
, MaskE
}, 0 },
3772 /* PREFIX_VEX_0F46_L_1_M_1_W_1 */
3774 { "kxnorq", { MaskG
, MaskVex
, MaskE
}, 0 },
3776 { "kxnord", { MaskG
, MaskVex
, MaskE
}, 0 },
3779 /* PREFIX_VEX_0F47_L_1_M_1_W_0 */
3781 { "kxorw", { MaskG
, MaskVex
, MaskE
}, 0 },
3783 { "kxorb", { MaskG
, MaskVex
, MaskE
}, 0 },
3786 /* PREFIX_VEX_0F47_L_1_M_1_W_1 */
3788 { "kxorq", { MaskG
, MaskVex
, MaskE
}, 0 },
3790 { "kxord", { MaskG
, MaskVex
, MaskE
}, 0 },
3793 /* PREFIX_VEX_0F4A_L_1_M_1_W_0 */
3795 { "kaddw", { MaskG
, MaskVex
, MaskE
}, 0 },
3797 { "kaddb", { MaskG
, MaskVex
, MaskE
}, 0 },
3800 /* PREFIX_VEX_0F4A_L_1_M_1_W_1 */
3802 { "kaddq", { MaskG
, MaskVex
, MaskE
}, 0 },
3804 { "kaddd", { MaskG
, MaskVex
, MaskE
}, 0 },
3807 /* PREFIX_VEX_0F4B_L_1_M_1_W_0 */
3809 { "kunpckwd", { MaskG
, MaskVex
, MaskE
}, 0 },
3811 { "kunpckbw", { MaskG
, MaskVex
, MaskE
}, 0 },
3814 /* PREFIX_VEX_0F4B_L_1_M_1_W_1 */
3816 { "kunpckdq", { MaskG
, MaskVex
, MaskE
}, 0 },
3819 /* PREFIX_VEX_0F51 */
3821 { "vsqrtps", { XM
, EXx
}, 0 },
3822 { "vsqrtss", { XMScalar
, VexScalar
, EXxmm_md
}, 0 },
3823 { "vsqrtpd", { XM
, EXx
}, 0 },
3824 { "vsqrtsd", { XMScalar
, VexScalar
, EXxmm_mq
}, 0 },
3827 /* PREFIX_VEX_0F52 */
3829 { "vrsqrtps", { XM
, EXx
}, 0 },
3830 { "vrsqrtss", { XMScalar
, VexScalar
, EXxmm_md
}, 0 },
3833 /* PREFIX_VEX_0F53 */
3835 { "vrcpps", { XM
, EXx
}, 0 },
3836 { "vrcpss", { XMScalar
, VexScalar
, EXxmm_md
}, 0 },
3839 /* PREFIX_VEX_0F58 */
3841 { "vaddps", { XM
, Vex
, EXx
}, 0 },
3842 { "vaddss", { XMScalar
, VexScalar
, EXxmm_md
}, 0 },
3843 { "vaddpd", { XM
, Vex
, EXx
}, 0 },
3844 { "vaddsd", { XMScalar
, VexScalar
, EXxmm_mq
}, 0 },
3847 /* PREFIX_VEX_0F59 */
3849 { "vmulps", { XM
, Vex
, EXx
}, 0 },
3850 { "vmulss", { XMScalar
, VexScalar
, EXxmm_md
}, 0 },
3851 { "vmulpd", { XM
, Vex
, EXx
}, 0 },
3852 { "vmulsd", { XMScalar
, VexScalar
, EXxmm_mq
}, 0 },
3855 /* PREFIX_VEX_0F5A */
3857 { "vcvtps2pd", { XM
, EXxmmq
}, 0 },
3858 { "vcvtss2sd", { XMScalar
, VexScalar
, EXxmm_md
}, 0 },
3859 { "vcvtpd2ps%XY",{ XMM
, EXx
}, 0 },
3860 { "vcvtsd2ss", { XMScalar
, VexScalar
, EXxmm_mq
}, 0 },
3863 /* PREFIX_VEX_0F5B */
3865 { "vcvtdq2ps", { XM
, EXx
}, 0 },
3866 { "vcvttps2dq", { XM
, EXx
}, 0 },
3867 { "vcvtps2dq", { XM
, EXx
}, 0 },
3870 /* PREFIX_VEX_0F5C */
3872 { "vsubps", { XM
, Vex
, EXx
}, 0 },
3873 { "vsubss", { XMScalar
, VexScalar
, EXxmm_md
}, 0 },
3874 { "vsubpd", { XM
, Vex
, EXx
}, 0 },
3875 { "vsubsd", { XMScalar
, VexScalar
, EXxmm_mq
}, 0 },
3878 /* PREFIX_VEX_0F5D */
3880 { "vminps", { XM
, Vex
, EXx
}, 0 },
3881 { "vminss", { XMScalar
, VexScalar
, EXxmm_md
}, 0 },
3882 { "vminpd", { XM
, Vex
, EXx
}, 0 },
3883 { "vminsd", { XMScalar
, VexScalar
, EXxmm_mq
}, 0 },
3886 /* PREFIX_VEX_0F5E */
3888 { "vdivps", { XM
, Vex
, EXx
}, 0 },
3889 { "vdivss", { XMScalar
, VexScalar
, EXxmm_md
}, 0 },
3890 { "vdivpd", { XM
, Vex
, EXx
}, 0 },
3891 { "vdivsd", { XMScalar
, VexScalar
, EXxmm_mq
}, 0 },
3894 /* PREFIX_VEX_0F5F */
3896 { "vmaxps", { XM
, Vex
, EXx
}, 0 },
3897 { "vmaxss", { XMScalar
, VexScalar
, EXxmm_md
}, 0 },
3898 { "vmaxpd", { XM
, Vex
, EXx
}, 0 },
3899 { "vmaxsd", { XMScalar
, VexScalar
, EXxmm_mq
}, 0 },
3902 /* PREFIX_VEX_0F6F */
3905 { "vmovdqu", { XM
, EXx
}, 0 },
3906 { "vmovdqa", { XM
, EXx
}, 0 },
3909 /* PREFIX_VEX_0F70 */
3912 { "vpshufhw", { XM
, EXx
, Ib
}, 0 },
3913 { "vpshufd", { XM
, EXx
, Ib
}, 0 },
3914 { "vpshuflw", { XM
, EXx
, Ib
}, 0 },
3917 /* PREFIX_VEX_0F7C */
3921 { "vhaddpd", { XM
, Vex
, EXx
}, 0 },
3922 { "vhaddps", { XM
, Vex
, EXx
}, 0 },
3925 /* PREFIX_VEX_0F7D */
3929 { "vhsubpd", { XM
, Vex
, EXx
}, 0 },
3930 { "vhsubps", { XM
, Vex
, EXx
}, 0 },
3933 /* PREFIX_VEX_0F7E */
3936 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_1
) },
3937 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_2
) },
3940 /* PREFIX_VEX_0F7F */
3943 { "vmovdqu", { EXxS
, XM
}, 0 },
3944 { "vmovdqa", { EXxS
, XM
}, 0 },
3947 /* PREFIX_VEX_0F90_L_0_W_0 */
3949 { "kmovw", { MaskG
, MaskE
}, 0 },
3951 { "kmovb", { MaskG
, MaskBDE
}, 0 },
3954 /* PREFIX_VEX_0F90_L_0_W_1 */
3956 { "kmovq", { MaskG
, MaskE
}, 0 },
3958 { "kmovd", { MaskG
, MaskBDE
}, 0 },
3961 /* PREFIX_VEX_0F91_L_0_M_0_W_0 */
3963 { "kmovw", { Ew
, MaskG
}, 0 },
3965 { "kmovb", { Eb
, MaskG
}, 0 },
3968 /* PREFIX_VEX_0F91_L_0_M_0_W_1 */
3970 { "kmovq", { Eq
, MaskG
}, 0 },
3972 { "kmovd", { Ed
, MaskG
}, 0 },
3975 /* PREFIX_VEX_0F92_L_0_M_1_W_0 */
3977 { "kmovw", { MaskG
, Edq
}, 0 },
3979 { "kmovb", { MaskG
, Edq
}, 0 },
3980 { "kmovd", { MaskG
, Edq
}, 0 },
3983 /* PREFIX_VEX_0F92_L_0_M_1_W_1 */
3988 { "kmovK", { MaskG
, Edq
}, 0 },
3991 /* PREFIX_VEX_0F93_L_0_M_1_W_0 */
3993 { "kmovw", { Gdq
, MaskE
}, 0 },
3995 { "kmovb", { Gdq
, MaskE
}, 0 },
3996 { "kmovd", { Gdq
, MaskE
}, 0 },
3999 /* PREFIX_VEX_0F93_L_0_M_1_W_1 */
4004 { "kmovK", { Gdq
, MaskE
}, 0 },
4007 /* PREFIX_VEX_0F98_L_0_M_1_W_0 */
4009 { "kortestw", { MaskG
, MaskE
}, 0 },
4011 { "kortestb", { MaskG
, MaskE
}, 0 },
4014 /* PREFIX_VEX_0F98_L_0_M_1_W_1 */
4016 { "kortestq", { MaskG
, MaskE
}, 0 },
4018 { "kortestd", { MaskG
, MaskE
}, 0 },
4021 /* PREFIX_VEX_0F99_L_0_M_1_W_0 */
4023 { "ktestw", { MaskG
, MaskE
}, 0 },
4025 { "ktestb", { MaskG
, MaskE
}, 0 },
4028 /* PREFIX_VEX_0F99_L_0_M_1_W_1 */
4030 { "ktestq", { MaskG
, MaskE
}, 0 },
4032 { "ktestd", { MaskG
, MaskE
}, 0 },
4035 /* PREFIX_VEX_0FC2 */
4037 { "vcmpps", { XM
, Vex
, EXx
, CMP
}, 0 },
4038 { "vcmpss", { XMScalar
, VexScalar
, EXxmm_md
, CMP
}, 0 },
4039 { "vcmppd", { XM
, Vex
, EXx
, CMP
}, 0 },
4040 { "vcmpsd", { XMScalar
, VexScalar
, EXxmm_mq
, CMP
}, 0 },
4043 /* PREFIX_VEX_0FD0 */
4047 { "vaddsubpd", { XM
, Vex
, EXx
}, 0 },
4048 { "vaddsubps", { XM
, Vex
, EXx
}, 0 },
4051 /* PREFIX_VEX_0FE6 */
4054 { "vcvtdq2pd", { XM
, EXxmmq
}, 0 },
4055 { "vcvttpd2dq%XY", { XMM
, EXx
}, 0 },
4056 { "vcvtpd2dq%XY", { XMM
, EXx
}, 0 },
4059 /* PREFIX_VEX_0FF0 */
4064 { MOD_TABLE (MOD_VEX_0FF0_PREFIX_3
) },
4067 /* PREFIX_VEX_0F3849_X86_64 */
4069 { VEX_W_TABLE (VEX_W_0F3849_X86_64_P_0
) },
4071 { VEX_W_TABLE (VEX_W_0F3849_X86_64_P_2
) },
4072 { VEX_W_TABLE (VEX_W_0F3849_X86_64_P_3
) },
4075 /* PREFIX_VEX_0F384B_X86_64 */
4078 { VEX_W_TABLE (VEX_W_0F384B_X86_64_P_1
) },
4079 { VEX_W_TABLE (VEX_W_0F384B_X86_64_P_2
) },
4080 { VEX_W_TABLE (VEX_W_0F384B_X86_64_P_3
) },
4083 /* PREFIX_VEX_0F385C_X86_64 */
4086 { VEX_W_TABLE (VEX_W_0F385C_X86_64_P_1
) },
4090 /* PREFIX_VEX_0F385E_X86_64 */
4092 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_0
) },
4093 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_1
) },
4094 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_2
) },
4095 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_3
) },
4098 /* PREFIX_VEX_0F38F5_L_0 */
4100 { "bzhiS", { Gdq
, Edq
, VexGdq
}, 0 },
4101 { "pextS", { Gdq
, VexGdq
, Edq
}, 0 },
4103 { "pdepS", { Gdq
, VexGdq
, Edq
}, 0 },
4106 /* PREFIX_VEX_0F38F6_L_0 */
4111 { "mulxS", { Gdq
, VexGdq
, Edq
}, 0 },
4114 /* PREFIX_VEX_0F38F7_L_0 */
4116 { "bextrS", { Gdq
, Edq
, VexGdq
}, 0 },
4117 { "sarxS", { Gdq
, Edq
, VexGdq
}, 0 },
4118 { "shlxS", { Gdq
, Edq
, VexGdq
}, 0 },
4119 { "shrxS", { Gdq
, Edq
, VexGdq
}, 0 },
4122 /* PREFIX_VEX_0F3AF0_L_0 */
4127 { "rorxS", { Gdq
, Edq
, Ib
}, 0 },
4130 #include "i386-dis-evex-prefix.h"
4133 static const struct dis386 x86_64_table
[][2] = {
4136 { "pushP", { es
}, 0 },
4141 { "popP", { es
}, 0 },
4146 { "pushP", { cs
}, 0 },
4151 { "pushP", { ss
}, 0 },
4156 { "popP", { ss
}, 0 },
4161 { "pushP", { ds
}, 0 },
4166 { "popP", { ds
}, 0 },
4171 { "daa", { XX
}, 0 },
4176 { "das", { XX
}, 0 },
4181 { "aaa", { XX
}, 0 },
4186 { "aas", { XX
}, 0 },
4191 { "pushaP", { XX
}, 0 },
4196 { "popaP", { XX
}, 0 },
4201 { MOD_TABLE (MOD_62_32BIT
) },
4202 { EVEX_TABLE (EVEX_0F
) },
4207 { "arpl", { Ew
, Gw
}, 0 },
4208 { "movs", { { OP_G
, movsxd_mode
}, { MOVSXD_Fixup
, movsxd_mode
} }, 0 },
4213 { "ins{R|}", { Yzr
, indirDX
}, 0 },
4214 { "ins{G|}", { Yzr
, indirDX
}, 0 },
4219 { "outs{R|}", { indirDXr
, Xz
}, 0 },
4220 { "outs{G|}", { indirDXr
, Xz
}, 0 },
4225 /* Opcode 0x82 is an alias of opcode 0x80 in 32-bit mode. */
4226 { REG_TABLE (REG_80
) },
4231 { "{l|}call{P|}", { Ap
}, 0 },
4236 { "retP", { Iw
, BND
}, 0 },
4237 { "ret@", { Iw
, BND
}, 0 },
4242 { "retP", { BND
}, 0 },
4243 { "ret@", { BND
}, 0 },
4248 { MOD_TABLE (MOD_C4_32BIT
) },
4249 { VEX_C4_TABLE (VEX_0F
) },
4254 { MOD_TABLE (MOD_C5_32BIT
) },
4255 { VEX_C5_TABLE (VEX_0F
) },
4260 { "into", { XX
}, 0 },
4265 { "aam", { Ib
}, 0 },
4270 { "aad", { Ib
}, 0 },
4275 { "callP", { Jv
, BND
}, 0 },
4276 { "call@", { Jv
, BND
}, 0 }
4281 { "jmpP", { Jv
, BND
}, 0 },
4282 { "jmp@", { Jv
, BND
}, 0 }
4287 { "{l|}jmp{P|}", { Ap
}, 0 },
4290 /* X86_64_0F01_REG_0 */
4292 { "sgdt{Q|Q}", { M
}, 0 },
4293 { "sgdt", { M
}, 0 },
4296 /* X86_64_0F01_REG_1 */
4298 { "sidt{Q|Q}", { M
}, 0 },
4299 { "sidt", { M
}, 0 },
4302 /* X86_64_0F01_REG_1_RM_5_PREFIX_2 */
4305 { "seamret", { Skip_MODRM
}, 0 },
4308 /* X86_64_0F01_REG_1_RM_6_PREFIX_2 */
4311 { "seamops", { Skip_MODRM
}, 0 },
4314 /* X86_64_0F01_REG_1_RM_7_PREFIX_2 */
4317 { "seamcall", { Skip_MODRM
}, 0 },
4320 /* X86_64_0F01_REG_2 */
4322 { "lgdt{Q|Q}", { M
}, 0 },
4323 { "lgdt", { M
}, 0 },
4326 /* X86_64_0F01_REG_3 */
4328 { "lidt{Q|Q}", { M
}, 0 },
4329 { "lidt", { M
}, 0 },
4334 { "movZ", { Em
, Td
}, 0 },
4339 { "movZ", { Td
, Em
}, 0 },
4342 /* X86_64_VEX_0F3849 */
4345 { PREFIX_TABLE (PREFIX_VEX_0F3849_X86_64
) },
4348 /* X86_64_VEX_0F384B */
4351 { PREFIX_TABLE (PREFIX_VEX_0F384B_X86_64
) },
4354 /* X86_64_VEX_0F385C */
4357 { PREFIX_TABLE (PREFIX_VEX_0F385C_X86_64
) },
4360 /* X86_64_VEX_0F385E */
4363 { PREFIX_TABLE (PREFIX_VEX_0F385E_X86_64
) },
4366 /* X86_64_0F01_REG_5_MOD_3_RM_4_PREFIX_1 */
4369 { "uiret", { Skip_MODRM
}, 0 },
4372 /* X86_64_0F01_REG_5_MOD_3_RM_5_PREFIX_1 */
4375 { "testui", { Skip_MODRM
}, 0 },
4378 /* X86_64_0F01_REG_5_MOD_3_RM_6_PREFIX_1 */
4381 { "clui", { Skip_MODRM
}, 0 },
4384 /* X86_64_0F01_REG_5_MOD_3_RM_7_PREFIX_1 */
4387 { "stui", { Skip_MODRM
}, 0 },
4390 /* X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_1 */
4393 { "rmpadjust", { Skip_MODRM
}, 0 },
4396 /* X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3 */
4399 { "rmpupdate", { Skip_MODRM
}, 0 },
4402 /* X86_64_0F01_REG_7_MOD_3_RM_7_PREFIX_1 */
4405 { "psmash", { Skip_MODRM
}, 0 },
4408 /* X86_64_0FC7_REG_6_MOD_3_PREFIX_1 */
4411 { "senduipi", { Eq
}, 0 },
4415 static const struct dis386 three_byte_table
[][256] = {
4417 /* THREE_BYTE_0F38 */
4420 { "pshufb", { MX
, EM
}, PREFIX_OPCODE
},
4421 { "phaddw", { MX
, EM
}, PREFIX_OPCODE
},
4422 { "phaddd", { MX
, EM
}, PREFIX_OPCODE
},
4423 { "phaddsw", { MX
, EM
}, PREFIX_OPCODE
},
4424 { "pmaddubsw", { MX
, EM
}, PREFIX_OPCODE
},
4425 { "phsubw", { MX
, EM
}, PREFIX_OPCODE
},
4426 { "phsubd", { MX
, EM
}, PREFIX_OPCODE
},
4427 { "phsubsw", { MX
, EM
}, PREFIX_OPCODE
},
4429 { "psignb", { MX
, EM
}, PREFIX_OPCODE
},
4430 { "psignw", { MX
, EM
}, PREFIX_OPCODE
},
4431 { "psignd", { MX
, EM
}, PREFIX_OPCODE
},
4432 { "pmulhrsw", { MX
, EM
}, PREFIX_OPCODE
},
4438 { "pblendvb", { XM
, EXx
, XMM0
}, PREFIX_DATA
},
4442 { "blendvps", { XM
, EXx
, XMM0
}, PREFIX_DATA
},
4443 { "blendvpd", { XM
, EXx
, XMM0
}, PREFIX_DATA
},
4445 { "ptest", { XM
, EXx
}, PREFIX_DATA
},
4451 { "pabsb", { MX
, EM
}, PREFIX_OPCODE
},
4452 { "pabsw", { MX
, EM
}, PREFIX_OPCODE
},
4453 { "pabsd", { MX
, EM
}, PREFIX_OPCODE
},
4456 { "pmovsxbw", { XM
, EXq
}, PREFIX_DATA
},
4457 { "pmovsxbd", { XM
, EXd
}, PREFIX_DATA
},
4458 { "pmovsxbq", { XM
, EXw
}, PREFIX_DATA
},
4459 { "pmovsxwd", { XM
, EXq
}, PREFIX_DATA
},
4460 { "pmovsxwq", { XM
, EXd
}, PREFIX_DATA
},
4461 { "pmovsxdq", { XM
, EXq
}, PREFIX_DATA
},
4465 { "pmuldq", { XM
, EXx
}, PREFIX_DATA
},
4466 { "pcmpeqq", { XM
, EXx
}, PREFIX_DATA
},
4467 { MOD_TABLE (MOD_0F382A
) },
4468 { "packusdw", { XM
, EXx
}, PREFIX_DATA
},
4474 { "pmovzxbw", { XM
, EXq
}, PREFIX_DATA
},
4475 { "pmovzxbd", { XM
, EXd
}, PREFIX_DATA
},
4476 { "pmovzxbq", { XM
, EXw
}, PREFIX_DATA
},
4477 { "pmovzxwd", { XM
, EXq
}, PREFIX_DATA
},
4478 { "pmovzxwq", { XM
, EXd
}, PREFIX_DATA
},
4479 { "pmovzxdq", { XM
, EXq
}, PREFIX_DATA
},
4481 { "pcmpgtq", { XM
, EXx
}, PREFIX_DATA
},
4483 { "pminsb", { XM
, EXx
}, PREFIX_DATA
},
4484 { "pminsd", { XM
, EXx
}, PREFIX_DATA
},
4485 { "pminuw", { XM
, EXx
}, PREFIX_DATA
},
4486 { "pminud", { XM
, EXx
}, PREFIX_DATA
},
4487 { "pmaxsb", { XM
, EXx
}, PREFIX_DATA
},
4488 { "pmaxsd", { XM
, EXx
}, PREFIX_DATA
},
4489 { "pmaxuw", { XM
, EXx
}, PREFIX_DATA
},
4490 { "pmaxud", { XM
, EXx
}, PREFIX_DATA
},
4492 { "pmulld", { XM
, EXx
}, PREFIX_DATA
},
4493 { "phminposuw", { XM
, EXx
}, PREFIX_DATA
},
4564 { "invept", { Gm
, Mo
}, PREFIX_DATA
},
4565 { "invvpid", { Gm
, Mo
}, PREFIX_DATA
},
4566 { "invpcid", { Gm
, M
}, PREFIX_DATA
},
4645 { "sha1nexte", { XM
, EXxmm
}, PREFIX_OPCODE
},
4646 { "sha1msg1", { XM
, EXxmm
}, PREFIX_OPCODE
},
4647 { "sha1msg2", { XM
, EXxmm
}, PREFIX_OPCODE
},
4648 { "sha256rnds2", { XM
, EXxmm
, XMM0
}, PREFIX_OPCODE
},
4649 { "sha256msg1", { XM
, EXxmm
}, PREFIX_OPCODE
},
4650 { "sha256msg2", { XM
, EXxmm
}, PREFIX_OPCODE
},
4652 { "gf2p8mulb", { XM
, EXxmm
}, PREFIX_DATA
},
4663 { PREFIX_TABLE (PREFIX_0F38D8
) },
4666 { "aesimc", { XM
, EXx
}, PREFIX_DATA
},
4667 { PREFIX_TABLE (PREFIX_0F38DC
) },
4668 { PREFIX_TABLE (PREFIX_0F38DD
) },
4669 { PREFIX_TABLE (PREFIX_0F38DE
) },
4670 { PREFIX_TABLE (PREFIX_0F38DF
) },
4690 { PREFIX_TABLE (PREFIX_0F38F0
) },
4691 { PREFIX_TABLE (PREFIX_0F38F1
) },
4695 { MOD_TABLE (MOD_0F38F5
) },
4696 { PREFIX_TABLE (PREFIX_0F38F6
) },
4699 { PREFIX_TABLE (PREFIX_0F38F8
) },
4700 { MOD_TABLE (MOD_0F38F9
) },
4701 { PREFIX_TABLE (PREFIX_0F38FA
) },
4702 { PREFIX_TABLE (PREFIX_0F38FB
) },
4708 /* THREE_BYTE_0F3A */
4720 { "roundps", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4721 { "roundpd", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4722 { "roundss", { XM
, EXd
, Ib
}, PREFIX_DATA
},
4723 { "roundsd", { XM
, EXq
, Ib
}, PREFIX_DATA
},
4724 { "blendps", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4725 { "blendpd", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4726 { "pblendw", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4727 { "palignr", { MX
, EM
, Ib
}, PREFIX_OPCODE
},
4733 { "pextrb", { Edqb
, XM
, Ib
}, PREFIX_DATA
},
4734 { "pextrw", { Edqw
, XM
, Ib
}, PREFIX_DATA
},
4735 { "pextrK", { Edq
, XM
, Ib
}, PREFIX_DATA
},
4736 { "extractps", { Edqd
, XM
, Ib
}, PREFIX_DATA
},
4747 { "pinsrb", { XM
, Edqb
, Ib
}, PREFIX_DATA
},
4748 { "insertps", { XM
, EXd
, Ib
}, PREFIX_DATA
},
4749 { "pinsrK", { XM
, Edq
, Ib
}, PREFIX_DATA
},
4783 { "dpps", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4784 { "dppd", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4785 { "mpsadbw", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4787 { "pclmulqdq", { XM
, EXx
, PCLMUL
}, PREFIX_DATA
},
4819 { "pcmpestrm!%LQ", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4820 { "pcmpestri!%LQ", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4821 { "pcmpistrm", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4822 { "pcmpistri", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4940 { "sha1rnds4", { XM
, EXxmm
, Ib
}, PREFIX_OPCODE
},
4942 { "gf2p8affineqb", { XM
, EXxmm
, Ib
}, PREFIX_DATA
},
4943 { "gf2p8affineinvqb", { XM
, EXxmm
, Ib
}, PREFIX_DATA
},
4961 { "aeskeygenassist", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4981 { PREFIX_TABLE (PREFIX_0F3A0F
) },
5001 static const struct dis386 xop_table
[][256] = {
5154 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_85
) },
5155 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_86
) },
5156 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_87
) },
5164 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_8E
) },
5165 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_8F
) },
5172 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_95
) },
5173 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_96
) },
5174 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_97
) },
5182 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_9E
) },
5183 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_9F
) },
5187 { "vpcmov", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
5188 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_A3
) },
5191 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_A6
) },
5209 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_B6
) },
5221 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C0
) },
5222 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C1
) },
5223 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C2
) },
5224 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C3
) },
5234 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CC
) },
5235 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CD
) },
5236 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CE
) },
5237 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CF
) },
5270 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EC
) },
5271 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_ED
) },
5272 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EE
) },
5273 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EF
) },
5297 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_01
) },
5298 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_02
) },
5316 { MOD_TABLE (MOD_VEX_0FXOP_09_12
) },
5440 { VEX_W_TABLE (VEX_W_0FXOP_09_80
) },
5441 { VEX_W_TABLE (VEX_W_0FXOP_09_81
) },
5442 { VEX_W_TABLE (VEX_W_0FXOP_09_82
) },
5443 { VEX_W_TABLE (VEX_W_0FXOP_09_83
) },
5458 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_90
) },
5459 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_91
) },
5460 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_92
) },
5461 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_93
) },
5462 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_94
) },
5463 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_95
) },
5464 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_96
) },
5465 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_97
) },
5467 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_98
) },
5468 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_99
) },
5469 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_9A
) },
5470 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_9B
) },
5513 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C1
) },
5514 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C2
) },
5515 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C3
) },
5518 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C6
) },
5519 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C7
) },
5524 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_CB
) },
5531 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D1
) },
5532 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D2
) },
5533 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D3
) },
5536 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D6
) },
5537 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D7
) },
5542 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_DB
) },
5549 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_E1
) },
5550 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_E2
) },
5551 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_E3
) },
5605 { "bextrS", { Gdq
, Edq
, Id
}, 0 },
5607 { VEX_LEN_TABLE (VEX_LEN_0FXOP_0A_12
) },
5877 static const struct dis386 vex_table
[][256] = {
5899 { PREFIX_TABLE (PREFIX_VEX_0F10
) },
5900 { PREFIX_TABLE (PREFIX_VEX_0F11
) },
5901 { PREFIX_TABLE (PREFIX_VEX_0F12
) },
5902 { MOD_TABLE (MOD_VEX_0F13
) },
5903 { "vunpcklpX", { XM
, Vex
, EXx
}, PREFIX_OPCODE
},
5904 { "vunpckhpX", { XM
, Vex
, EXx
}, PREFIX_OPCODE
},
5905 { PREFIX_TABLE (PREFIX_VEX_0F16
) },
5906 { MOD_TABLE (MOD_VEX_0F17
) },
5926 { "vmovapX", { XM
, EXx
}, PREFIX_OPCODE
},
5927 { "vmovapX", { EXxS
, XM
}, PREFIX_OPCODE
},
5928 { PREFIX_TABLE (PREFIX_VEX_0F2A
) },
5929 { MOD_TABLE (MOD_VEX_0F2B
) },
5930 { PREFIX_TABLE (PREFIX_VEX_0F2C
) },
5931 { PREFIX_TABLE (PREFIX_VEX_0F2D
) },
5932 { PREFIX_TABLE (PREFIX_VEX_0F2E
) },
5933 { PREFIX_TABLE (PREFIX_VEX_0F2F
) },
5954 { VEX_LEN_TABLE (VEX_LEN_0F41
) },
5955 { VEX_LEN_TABLE (VEX_LEN_0F42
) },
5957 { VEX_LEN_TABLE (VEX_LEN_0F44
) },
5958 { VEX_LEN_TABLE (VEX_LEN_0F45
) },
5959 { VEX_LEN_TABLE (VEX_LEN_0F46
) },
5960 { VEX_LEN_TABLE (VEX_LEN_0F47
) },
5964 { VEX_LEN_TABLE (VEX_LEN_0F4A
) },
5965 { VEX_LEN_TABLE (VEX_LEN_0F4B
) },
5971 { MOD_TABLE (MOD_VEX_0F50
) },
5972 { PREFIX_TABLE (PREFIX_VEX_0F51
) },
5973 { PREFIX_TABLE (PREFIX_VEX_0F52
) },
5974 { PREFIX_TABLE (PREFIX_VEX_0F53
) },
5975 { "vandpX", { XM
, Vex
, EXx
}, PREFIX_OPCODE
},
5976 { "vandnpX", { XM
, Vex
, EXx
}, PREFIX_OPCODE
},
5977 { "vorpX", { XM
, Vex
, EXx
}, PREFIX_OPCODE
},
5978 { "vxorpX", { XM
, Vex
, EXx
}, PREFIX_OPCODE
},
5980 { PREFIX_TABLE (PREFIX_VEX_0F58
) },
5981 { PREFIX_TABLE (PREFIX_VEX_0F59
) },
5982 { PREFIX_TABLE (PREFIX_VEX_0F5A
) },
5983 { PREFIX_TABLE (PREFIX_VEX_0F5B
) },
5984 { PREFIX_TABLE (PREFIX_VEX_0F5C
) },
5985 { PREFIX_TABLE (PREFIX_VEX_0F5D
) },
5986 { PREFIX_TABLE (PREFIX_VEX_0F5E
) },
5987 { PREFIX_TABLE (PREFIX_VEX_0F5F
) },
5989 { "vpunpcklbw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5990 { "vpunpcklwd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5991 { "vpunpckldq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5992 { "vpacksswb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5993 { "vpcmpgtb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5994 { "vpcmpgtw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5995 { "vpcmpgtd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5996 { "vpackuswb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5998 { "vpunpckhbw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5999 { "vpunpckhwd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6000 { "vpunpckhdq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6001 { "vpackssdw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6002 { "vpunpcklqdq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6003 { "vpunpckhqdq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6004 { VEX_LEN_TABLE (VEX_LEN_0F6E
) },
6005 { PREFIX_TABLE (PREFIX_VEX_0F6F
) },
6007 { PREFIX_TABLE (PREFIX_VEX_0F70
) },
6008 { MOD_TABLE (MOD_VEX_0F71
) },
6009 { MOD_TABLE (MOD_VEX_0F72
) },
6010 { MOD_TABLE (MOD_VEX_0F73
) },
6011 { "vpcmpeqb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6012 { "vpcmpeqw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6013 { "vpcmpeqd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6014 { VEX_LEN_TABLE (VEX_LEN_0F77
) },
6020 { PREFIX_TABLE (PREFIX_VEX_0F7C
) },
6021 { PREFIX_TABLE (PREFIX_VEX_0F7D
) },
6022 { PREFIX_TABLE (PREFIX_VEX_0F7E
) },
6023 { PREFIX_TABLE (PREFIX_VEX_0F7F
) },
6043 { VEX_LEN_TABLE (VEX_LEN_0F90
) },
6044 { VEX_LEN_TABLE (VEX_LEN_0F91
) },
6045 { VEX_LEN_TABLE (VEX_LEN_0F92
) },
6046 { VEX_LEN_TABLE (VEX_LEN_0F93
) },
6052 { VEX_LEN_TABLE (VEX_LEN_0F98
) },
6053 { VEX_LEN_TABLE (VEX_LEN_0F99
) },
6076 { REG_TABLE (REG_VEX_0FAE
) },
6099 { PREFIX_TABLE (PREFIX_VEX_0FC2
) },
6101 { VEX_LEN_TABLE (VEX_LEN_0FC4
) },
6102 { VEX_LEN_TABLE (VEX_LEN_0FC5
) },
6103 { "vshufpX", { XM
, Vex
, EXx
, Ib
}, PREFIX_OPCODE
},
6115 { PREFIX_TABLE (PREFIX_VEX_0FD0
) },
6116 { "vpsrlw", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
6117 { "vpsrld", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
6118 { "vpsrlq", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
6119 { "vpaddq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6120 { "vpmullw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6121 { VEX_LEN_TABLE (VEX_LEN_0FD6
) },
6122 { MOD_TABLE (MOD_VEX_0FD7
) },
6124 { "vpsubusb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6125 { "vpsubusw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6126 { "vpminub", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6127 { "vpand", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6128 { "vpaddusb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6129 { "vpaddusw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6130 { "vpmaxub", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6131 { "vpandn", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6133 { "vpavgb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6134 { "vpsraw", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
6135 { "vpsrad", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
6136 { "vpavgw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6137 { "vpmulhuw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6138 { "vpmulhw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6139 { PREFIX_TABLE (PREFIX_VEX_0FE6
) },
6140 { MOD_TABLE (MOD_VEX_0FE7
) },
6142 { "vpsubsb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6143 { "vpsubsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6144 { "vpminsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6145 { "vpor", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6146 { "vpaddsb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6147 { "vpaddsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6148 { "vpmaxsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6149 { "vpxor", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6151 { PREFIX_TABLE (PREFIX_VEX_0FF0
) },
6152 { "vpsllw", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
6153 { "vpslld", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
6154 { "vpsllq", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
6155 { "vpmuludq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6156 { "vpmaddwd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6157 { "vpsadbw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6158 { VEX_LEN_TABLE (VEX_LEN_0FF7
) },
6160 { "vpsubb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6161 { "vpsubw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6162 { "vpsubd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6163 { "vpsubq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6164 { "vpaddb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6165 { "vpaddw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6166 { "vpaddd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6172 { "vpshufb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6173 { "vphaddw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6174 { "vphaddd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6175 { "vphaddsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6176 { "vpmaddubsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6177 { "vphsubw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6178 { "vphsubd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6179 { "vphsubsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6181 { "vpsignb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6182 { "vpsignw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6183 { "vpsignd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6184 { "vpmulhrsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6185 { VEX_W_TABLE (VEX_W_0F380C
) },
6186 { VEX_W_TABLE (VEX_W_0F380D
) },
6187 { VEX_W_TABLE (VEX_W_0F380E
) },
6188 { VEX_W_TABLE (VEX_W_0F380F
) },
6193 { VEX_W_TABLE (VEX_W_0F3813
) },
6196 { VEX_LEN_TABLE (VEX_LEN_0F3816
) },
6197 { "vptest", { XM
, EXx
}, PREFIX_DATA
},
6199 { VEX_W_TABLE (VEX_W_0F3818
) },
6200 { VEX_LEN_TABLE (VEX_LEN_0F3819
) },
6201 { MOD_TABLE (MOD_VEX_0F381A
) },
6203 { "vpabsb", { XM
, EXx
}, PREFIX_DATA
},
6204 { "vpabsw", { XM
, EXx
}, PREFIX_DATA
},
6205 { "vpabsd", { XM
, EXx
}, PREFIX_DATA
},
6208 { "vpmovsxbw", { XM
, EXxmmq
}, PREFIX_DATA
},
6209 { "vpmovsxbd", { XM
, EXxmmqd
}, PREFIX_DATA
},
6210 { "vpmovsxbq", { XM
, EXxmmdw
}, PREFIX_DATA
},
6211 { "vpmovsxwd", { XM
, EXxmmq
}, PREFIX_DATA
},
6212 { "vpmovsxwq", { XM
, EXxmmqd
}, PREFIX_DATA
},
6213 { "vpmovsxdq", { XM
, EXxmmq
}, PREFIX_DATA
},
6217 { "vpmuldq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6218 { "vpcmpeqq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6219 { MOD_TABLE (MOD_VEX_0F382A
) },
6220 { "vpackusdw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6221 { MOD_TABLE (MOD_VEX_0F382C
) },
6222 { MOD_TABLE (MOD_VEX_0F382D
) },
6223 { MOD_TABLE (MOD_VEX_0F382E
) },
6224 { MOD_TABLE (MOD_VEX_0F382F
) },
6226 { "vpmovzxbw", { XM
, EXxmmq
}, PREFIX_DATA
},
6227 { "vpmovzxbd", { XM
, EXxmmqd
}, PREFIX_DATA
},
6228 { "vpmovzxbq", { XM
, EXxmmdw
}, PREFIX_DATA
},
6229 { "vpmovzxwd", { XM
, EXxmmq
}, PREFIX_DATA
},
6230 { "vpmovzxwq", { XM
, EXxmmqd
}, PREFIX_DATA
},
6231 { "vpmovzxdq", { XM
, EXxmmq
}, PREFIX_DATA
},
6232 { VEX_LEN_TABLE (VEX_LEN_0F3836
) },
6233 { "vpcmpgtq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6235 { "vpminsb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6236 { "vpminsd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6237 { "vpminuw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6238 { "vpminud", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6239 { "vpmaxsb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6240 { "vpmaxsd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6241 { "vpmaxuw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6242 { "vpmaxud", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6244 { "vpmulld", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6245 { VEX_LEN_TABLE (VEX_LEN_0F3841
) },
6249 { "vpsrlv%DQ", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6250 { VEX_W_TABLE (VEX_W_0F3846
) },
6251 { "vpsllv%DQ", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6254 { X86_64_TABLE (X86_64_VEX_0F3849
) },
6256 { X86_64_TABLE (X86_64_VEX_0F384B
) },
6262 { VEX_W_TABLE (VEX_W_0F3850
) },
6263 { VEX_W_TABLE (VEX_W_0F3851
) },
6264 { VEX_W_TABLE (VEX_W_0F3852
) },
6265 { VEX_W_TABLE (VEX_W_0F3853
) },
6271 { VEX_W_TABLE (VEX_W_0F3858
) },
6272 { VEX_W_TABLE (VEX_W_0F3859
) },
6273 { MOD_TABLE (MOD_VEX_0F385A
) },
6275 { X86_64_TABLE (X86_64_VEX_0F385C
) },
6277 { X86_64_TABLE (X86_64_VEX_0F385E
) },
6307 { VEX_W_TABLE (VEX_W_0F3878
) },
6308 { VEX_W_TABLE (VEX_W_0F3879
) },
6329 { MOD_TABLE (MOD_VEX_0F388C
) },
6331 { MOD_TABLE (MOD_VEX_0F388E
) },
6334 { "vpgatherd%DQ", { XM
, MVexVSIBDWpX
, Vex
}, PREFIX_DATA
},
6335 { "vpgatherq%DQ", { XMGatherQ
, MVexVSIBQWpX
, VexGatherQ
}, PREFIX_DATA
},
6336 { "vgatherdp%XW", { XM
, MVexVSIBDWpX
, Vex
}, PREFIX_DATA
},
6337 { "vgatherqp%XW", { XMGatherQ
, MVexVSIBQWpX
, VexGatherQ
}, PREFIX_DATA
},
6340 { "vfmaddsub132p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6341 { "vfmsubadd132p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6343 { "vfmadd132p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6344 { "vfmadd132s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
}, PREFIX_DATA
},
6345 { "vfmsub132p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6346 { "vfmsub132s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
}, PREFIX_DATA
},
6347 { "vfnmadd132p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6348 { "vfnmadd132s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
}, PREFIX_DATA
},
6349 { "vfnmsub132p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6350 { "vfnmsub132s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
}, PREFIX_DATA
},
6358 { "vfmaddsub213p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6359 { "vfmsubadd213p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6361 { "vfmadd213p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6362 { "vfmadd213s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
}, PREFIX_DATA
},
6363 { "vfmsub213p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6364 { "vfmsub213s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
}, PREFIX_DATA
},
6365 { "vfnmadd213p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6366 { "vfnmadd213s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
}, PREFIX_DATA
},
6367 { "vfnmsub213p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6368 { "vfnmsub213s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
}, PREFIX_DATA
},
6376 { "vfmaddsub231p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6377 { "vfmsubadd231p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6379 { "vfmadd231p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6380 { "vfmadd231s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
}, PREFIX_DATA
},
6381 { "vfmsub231p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6382 { "vfmsub231s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
}, PREFIX_DATA
},
6383 { "vfnmadd231p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6384 { "vfnmadd231s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
}, PREFIX_DATA
},
6385 { "vfnmsub231p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6386 { "vfnmsub231s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
}, PREFIX_DATA
},
6404 { VEX_W_TABLE (VEX_W_0F38CF
) },
6418 { VEX_LEN_TABLE (VEX_LEN_0F38DB
) },
6419 { "vaesenc", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6420 { "vaesenclast", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6421 { "vaesdec", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6422 { "vaesdeclast", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6444 { VEX_LEN_TABLE (VEX_LEN_0F38F2
) },
6445 { VEX_LEN_TABLE (VEX_LEN_0F38F3
) },
6447 { VEX_LEN_TABLE (VEX_LEN_0F38F5
) },
6448 { VEX_LEN_TABLE (VEX_LEN_0F38F6
) },
6449 { VEX_LEN_TABLE (VEX_LEN_0F38F7
) },
6463 { VEX_LEN_TABLE (VEX_LEN_0F3A00
) },
6464 { VEX_LEN_TABLE (VEX_LEN_0F3A01
) },
6465 { VEX_W_TABLE (VEX_W_0F3A02
) },
6467 { VEX_W_TABLE (VEX_W_0F3A04
) },
6468 { VEX_W_TABLE (VEX_W_0F3A05
) },
6469 { VEX_LEN_TABLE (VEX_LEN_0F3A06
) },
6472 { "vroundps", { XM
, EXx
, Ib
}, PREFIX_DATA
},
6473 { "vroundpd", { XM
, EXx
, Ib
}, PREFIX_DATA
},
6474 { "vroundss", { XMScalar
, VexScalar
, EXxmm_md
, Ib
}, PREFIX_DATA
},
6475 { "vroundsd", { XMScalar
, VexScalar
, EXxmm_mq
, Ib
}, PREFIX_DATA
},
6476 { "vblendps", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
6477 { "vblendpd", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
6478 { "vpblendw", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
6479 { "vpalignr", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
6485 { VEX_LEN_TABLE (VEX_LEN_0F3A14
) },
6486 { VEX_LEN_TABLE (VEX_LEN_0F3A15
) },
6487 { VEX_LEN_TABLE (VEX_LEN_0F3A16
) },
6488 { VEX_LEN_TABLE (VEX_LEN_0F3A17
) },
6490 { VEX_LEN_TABLE (VEX_LEN_0F3A18
) },
6491 { VEX_LEN_TABLE (VEX_LEN_0F3A19
) },
6495 { VEX_W_TABLE (VEX_W_0F3A1D
) },
6499 { VEX_LEN_TABLE (VEX_LEN_0F3A20
) },
6500 { VEX_LEN_TABLE (VEX_LEN_0F3A21
) },
6501 { VEX_LEN_TABLE (VEX_LEN_0F3A22
) },
6517 { VEX_LEN_TABLE (VEX_LEN_0F3A30
) },
6518 { VEX_LEN_TABLE (VEX_LEN_0F3A31
) },
6519 { VEX_LEN_TABLE (VEX_LEN_0F3A32
) },
6520 { VEX_LEN_TABLE (VEX_LEN_0F3A33
) },
6526 { VEX_LEN_TABLE (VEX_LEN_0F3A38
) },
6527 { VEX_LEN_TABLE (VEX_LEN_0F3A39
) },
6535 { "vdpps", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
6536 { VEX_LEN_TABLE (VEX_LEN_0F3A41
) },
6537 { "vmpsadbw", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
6539 { "vpclmulqdq", { XM
, Vex
, EXx
, PCLMUL
}, PREFIX_DATA
},
6541 { VEX_LEN_TABLE (VEX_LEN_0F3A46
) },
6544 { "vpermil2ps", { XM
, Vex
, EXx
, XMVexI4
, VexI4
}, PREFIX_DATA
},
6545 { "vpermil2pd", { XM
, Vex
, EXx
, XMVexI4
, VexI4
}, PREFIX_DATA
},
6546 { VEX_W_TABLE (VEX_W_0F3A4A
) },
6547 { VEX_W_TABLE (VEX_W_0F3A4B
) },
6548 { VEX_W_TABLE (VEX_W_0F3A4C
) },
6566 { "vfmaddsubps", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6567 { "vfmaddsubpd", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6568 { "vfmsubaddps", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6569 { "vfmsubaddpd", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6571 { VEX_LEN_TABLE (VEX_LEN_0F3A60
) },
6572 { VEX_LEN_TABLE (VEX_LEN_0F3A61
) },
6573 { VEX_LEN_TABLE (VEX_LEN_0F3A62
) },
6574 { VEX_LEN_TABLE (VEX_LEN_0F3A63
) },
6580 { "vfmaddps", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6581 { "vfmaddpd", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6582 { "vfmaddss", { XMScalar
, VexScalar
, EXxmm_md
, XMVexScalarI4
}, PREFIX_DATA
},
6583 { "vfmaddsd", { XMScalar
, VexScalar
, EXxmm_mq
, XMVexScalarI4
}, PREFIX_DATA
},
6584 { "vfmsubps", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6585 { "vfmsubpd", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6586 { "vfmsubss", { XMScalar
, VexScalar
, EXxmm_md
, XMVexScalarI4
}, PREFIX_DATA
},
6587 { "vfmsubsd", { XMScalar
, VexScalar
, EXxmm_mq
, XMVexScalarI4
}, PREFIX_DATA
},
6598 { "vfnmaddps", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6599 { "vfnmaddpd", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6600 { "vfnmaddss", { XMScalar
, VexScalar
, EXxmm_md
, XMVexScalarI4
}, PREFIX_DATA
},
6601 { "vfnmaddsd", { XMScalar
, VexScalar
, EXxmm_mq
, XMVexScalarI4
}, PREFIX_DATA
},
6602 { "vfnmsubps", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6603 { "vfnmsubpd", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6604 { "vfnmsubss", { XMScalar
, VexScalar
, EXxmm_md
, XMVexScalarI4
}, PREFIX_DATA
},
6605 { "vfnmsubsd", { XMScalar
, VexScalar
, EXxmm_mq
, XMVexScalarI4
}, PREFIX_DATA
},
6694 { VEX_W_TABLE (VEX_W_0F3ACE
) },
6695 { VEX_W_TABLE (VEX_W_0F3ACF
) },
6713 { VEX_LEN_TABLE (VEX_LEN_0F3ADF
) },
6733 { VEX_LEN_TABLE (VEX_LEN_0F3AF0
) },
6753 #include "i386-dis-evex.h"
6755 static const struct dis386 vex_len_table
[][2] = {
6756 /* VEX_LEN_0F12_P_0_M_0 / VEX_LEN_0F12_P_2_M_0 */
6758 { "vmovlpX", { XM
, Vex
, EXq
}, 0 },
6761 /* VEX_LEN_0F12_P_0_M_1 */
6763 { "vmovhlps", { XM
, Vex
, EXq
}, 0 },
6766 /* VEX_LEN_0F13_M_0 */
6768 { "vmovlpX", { EXq
, XM
}, PREFIX_OPCODE
},
6771 /* VEX_LEN_0F16_P_0_M_0 / VEX_LEN_0F16_P_2_M_0 */
6773 { "vmovhpX", { XM
, Vex
, EXq
}, 0 },
6776 /* VEX_LEN_0F16_P_0_M_1 */
6778 { "vmovlhps", { XM
, Vex
, EXq
}, 0 },
6781 /* VEX_LEN_0F17_M_0 */
6783 { "vmovhpX", { EXq
, XM
}, PREFIX_OPCODE
},
6789 { MOD_TABLE (MOD_VEX_0F41_L_1
) },
6795 { MOD_TABLE (MOD_VEX_0F42_L_1
) },
6800 { MOD_TABLE (MOD_VEX_0F44_L_0
) },
6806 { MOD_TABLE (MOD_VEX_0F45_L_1
) },
6812 { MOD_TABLE (MOD_VEX_0F46_L_1
) },
6818 { MOD_TABLE (MOD_VEX_0F47_L_1
) },
6824 { MOD_TABLE (MOD_VEX_0F4A_L_1
) },
6830 { MOD_TABLE (MOD_VEX_0F4B_L_1
) },
6835 { "vmovK", { XMScalar
, Edq
}, PREFIX_DATA
},
6840 { "vzeroupper", { XX
}, 0 },
6841 { "vzeroall", { XX
}, 0 },
6844 /* VEX_LEN_0F7E_P_1 */
6846 { "vmovq", { XMScalar
, EXxmm_mq
}, 0 },
6849 /* VEX_LEN_0F7E_P_2 */
6851 { "vmovK", { Edq
, XMScalar
}, 0 },
6856 { VEX_W_TABLE (VEX_W_0F90_L_0
) },
6861 { MOD_TABLE (MOD_VEX_0F91_L_0
) },
6866 { MOD_TABLE (MOD_VEX_0F92_L_0
) },
6871 { MOD_TABLE (MOD_VEX_0F93_L_0
) },
6876 { MOD_TABLE (MOD_VEX_0F98_L_0
) },
6881 { MOD_TABLE (MOD_VEX_0F99_L_0
) },
6884 /* VEX_LEN_0FAE_R_2_M_0 */
6886 { "vldmxcsr", { Md
}, 0 },
6889 /* VEX_LEN_0FAE_R_3_M_0 */
6891 { "vstmxcsr", { Md
}, 0 },
6896 { "vpinsrw", { XM
, Vex
, Edqw
, Ib
}, PREFIX_DATA
},
6901 { "vpextrw", { Gdq
, XS
, Ib
}, PREFIX_DATA
},
6906 { "vmovq", { EXqS
, XMScalar
}, PREFIX_DATA
},
6911 { "vmaskmovdqu", { XM
, XS
}, PREFIX_DATA
},
6914 /* VEX_LEN_0F3816 */
6917 { VEX_W_TABLE (VEX_W_0F3816_L_1
) },
6920 /* VEX_LEN_0F3819 */
6923 { VEX_W_TABLE (VEX_W_0F3819_L_1
) },
6926 /* VEX_LEN_0F381A_M_0 */
6929 { VEX_W_TABLE (VEX_W_0F381A_M_0_L_1
) },
6932 /* VEX_LEN_0F3836 */
6935 { VEX_W_TABLE (VEX_W_0F3836
) },
6938 /* VEX_LEN_0F3841 */
6940 { "vphminposuw", { XM
, EXx
}, PREFIX_DATA
},
6943 /* VEX_LEN_0F3849_X86_64_P_0_W_0_M_0 */
6945 { "ldtilecfg", { M
}, 0 },
6948 /* VEX_LEN_0F3849_X86_64_P_0_W_0_M_1_REG_0_RM_0 */
6950 { "tilerelease", { Skip_MODRM
}, 0 },
6953 /* VEX_LEN_0F3849_X86_64_P_2_W_0_M_0 */
6955 { "sttilecfg", { M
}, 0 },
6958 /* VEX_LEN_0F3849_X86_64_P_3_W_0_M_0 */
6960 { "tilezero", { TMM
, Skip_MODRM
}, 0 },
6963 /* VEX_LEN_0F384B_X86_64_P_1_W_0_M_0 */
6965 { "tilestored", { MVexSIBMEM
, TMM
}, 0 },
6967 /* VEX_LEN_0F384B_X86_64_P_2_W_0_M_0 */
6969 { "tileloaddt1", { TMM
, MVexSIBMEM
}, 0 },
6972 /* VEX_LEN_0F384B_X86_64_P_3_W_0_M_0 */
6974 { "tileloadd", { TMM
, MVexSIBMEM
}, 0 },
6977 /* VEX_LEN_0F385A_M_0 */
6980 { VEX_W_TABLE (VEX_W_0F385A_M_0_L_0
) },
6983 /* VEX_LEN_0F385C_X86_64_P_1_W_0_M_0 */
6985 { "tdpbf16ps", { TMM
, EXtmm
, VexTmm
}, 0 },
6988 /* VEX_LEN_0F385E_X86_64_P_0_W_0_M_0 */
6990 { "tdpbuud", {TMM
, EXtmm
, VexTmm
}, 0 },
6993 /* VEX_LEN_0F385E_X86_64_P_1_W_0_M_0 */
6995 { "tdpbsud", {TMM
, EXtmm
, VexTmm
}, 0 },
6998 /* VEX_LEN_0F385E_X86_64_P_2_W_0_M_0 */
7000 { "tdpbusd", {TMM
, EXtmm
, VexTmm
}, 0 },
7003 /* VEX_LEN_0F385E_X86_64_P_3_W_0_M_0 */
7005 { "tdpbssd", {TMM
, EXtmm
, VexTmm
}, 0 },
7008 /* VEX_LEN_0F38DB */
7010 { "vaesimc", { XM
, EXx
}, PREFIX_DATA
},
7013 /* VEX_LEN_0F38F2 */
7015 { "andnS", { Gdq
, VexGdq
, Edq
}, PREFIX_OPCODE
},
7018 /* VEX_LEN_0F38F3 */
7020 { REG_TABLE(REG_VEX_0F38F3_L_0
) },
7023 /* VEX_LEN_0F38F5 */
7025 { PREFIX_TABLE(PREFIX_VEX_0F38F5_L_0
) },
7028 /* VEX_LEN_0F38F6 */
7030 { PREFIX_TABLE(PREFIX_VEX_0F38F6_L_0
) },
7033 /* VEX_LEN_0F38F7 */
7035 { PREFIX_TABLE(PREFIX_VEX_0F38F7_L_0
) },
7038 /* VEX_LEN_0F3A00 */
7041 { VEX_W_TABLE (VEX_W_0F3A00_L_1
) },
7044 /* VEX_LEN_0F3A01 */
7047 { VEX_W_TABLE (VEX_W_0F3A01_L_1
) },
7050 /* VEX_LEN_0F3A06 */
7053 { VEX_W_TABLE (VEX_W_0F3A06_L_1
) },
7056 /* VEX_LEN_0F3A14 */
7058 { "vpextrb", { Edqb
, XM
, Ib
}, PREFIX_DATA
},
7061 /* VEX_LEN_0F3A15 */
7063 { "vpextrw", { Edqw
, XM
, Ib
}, PREFIX_DATA
},
7066 /* VEX_LEN_0F3A16 */
7068 { "vpextrK", { Edq
, XM
, Ib
}, PREFIX_DATA
},
7071 /* VEX_LEN_0F3A17 */
7073 { "vextractps", { Edqd
, XM
, Ib
}, PREFIX_DATA
},
7076 /* VEX_LEN_0F3A18 */
7079 { VEX_W_TABLE (VEX_W_0F3A18_L_1
) },
7082 /* VEX_LEN_0F3A19 */
7085 { VEX_W_TABLE (VEX_W_0F3A19_L_1
) },
7088 /* VEX_LEN_0F3A20 */
7090 { "vpinsrb", { XM
, Vex
, Edqb
, Ib
}, PREFIX_DATA
},
7093 /* VEX_LEN_0F3A21 */
7095 { "vinsertps", { XM
, Vex
, EXd
, Ib
}, PREFIX_DATA
},
7098 /* VEX_LEN_0F3A22 */
7100 { "vpinsrK", { XM
, Vex
, Edq
, Ib
}, PREFIX_DATA
},
7103 /* VEX_LEN_0F3A30 */
7105 { MOD_TABLE (MOD_VEX_0F3A30_L_0
) },
7108 /* VEX_LEN_0F3A31 */
7110 { MOD_TABLE (MOD_VEX_0F3A31_L_0
) },
7113 /* VEX_LEN_0F3A32 */
7115 { MOD_TABLE (MOD_VEX_0F3A32_L_0
) },
7118 /* VEX_LEN_0F3A33 */
7120 { MOD_TABLE (MOD_VEX_0F3A33_L_0
) },
7123 /* VEX_LEN_0F3A38 */
7126 { VEX_W_TABLE (VEX_W_0F3A38_L_1
) },
7129 /* VEX_LEN_0F3A39 */
7132 { VEX_W_TABLE (VEX_W_0F3A39_L_1
) },
7135 /* VEX_LEN_0F3A41 */
7137 { "vdppd", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
7140 /* VEX_LEN_0F3A46 */
7143 { VEX_W_TABLE (VEX_W_0F3A46_L_1
) },
7146 /* VEX_LEN_0F3A60 */
7148 { "vpcmpestrm!%LQ", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7151 /* VEX_LEN_0F3A61 */
7153 { "vpcmpestri!%LQ", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7156 /* VEX_LEN_0F3A62 */
7158 { "vpcmpistrm", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7161 /* VEX_LEN_0F3A63 */
7163 { "vpcmpistri", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7166 /* VEX_LEN_0F3ADF */
7168 { "vaeskeygenassist", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7171 /* VEX_LEN_0F3AF0 */
7173 { PREFIX_TABLE (PREFIX_VEX_0F3AF0_L_0
) },
7176 /* VEX_LEN_0FXOP_08_85 */
7178 { VEX_W_TABLE (VEX_W_0FXOP_08_85_L_0
) },
7181 /* VEX_LEN_0FXOP_08_86 */
7183 { VEX_W_TABLE (VEX_W_0FXOP_08_86_L_0
) },
7186 /* VEX_LEN_0FXOP_08_87 */
7188 { VEX_W_TABLE (VEX_W_0FXOP_08_87_L_0
) },
7191 /* VEX_LEN_0FXOP_08_8E */
7193 { VEX_W_TABLE (VEX_W_0FXOP_08_8E_L_0
) },
7196 /* VEX_LEN_0FXOP_08_8F */
7198 { VEX_W_TABLE (VEX_W_0FXOP_08_8F_L_0
) },
7201 /* VEX_LEN_0FXOP_08_95 */
7203 { VEX_W_TABLE (VEX_W_0FXOP_08_95_L_0
) },
7206 /* VEX_LEN_0FXOP_08_96 */
7208 { VEX_W_TABLE (VEX_W_0FXOP_08_96_L_0
) },
7211 /* VEX_LEN_0FXOP_08_97 */
7213 { VEX_W_TABLE (VEX_W_0FXOP_08_97_L_0
) },
7216 /* VEX_LEN_0FXOP_08_9E */
7218 { VEX_W_TABLE (VEX_W_0FXOP_08_9E_L_0
) },
7221 /* VEX_LEN_0FXOP_08_9F */
7223 { VEX_W_TABLE (VEX_W_0FXOP_08_9F_L_0
) },
7226 /* VEX_LEN_0FXOP_08_A3 */
7228 { "vpperm", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7231 /* VEX_LEN_0FXOP_08_A6 */
7233 { VEX_W_TABLE (VEX_W_0FXOP_08_A6_L_0
) },
7236 /* VEX_LEN_0FXOP_08_B6 */
7238 { VEX_W_TABLE (VEX_W_0FXOP_08_B6_L_0
) },
7241 /* VEX_LEN_0FXOP_08_C0 */
7243 { VEX_W_TABLE (VEX_W_0FXOP_08_C0_L_0
) },
7246 /* VEX_LEN_0FXOP_08_C1 */
7248 { VEX_W_TABLE (VEX_W_0FXOP_08_C1_L_0
) },
7251 /* VEX_LEN_0FXOP_08_C2 */
7253 { VEX_W_TABLE (VEX_W_0FXOP_08_C2_L_0
) },
7256 /* VEX_LEN_0FXOP_08_C3 */
7258 { VEX_W_TABLE (VEX_W_0FXOP_08_C3_L_0
) },
7261 /* VEX_LEN_0FXOP_08_CC */
7263 { VEX_W_TABLE (VEX_W_0FXOP_08_CC_L_0
) },
7266 /* VEX_LEN_0FXOP_08_CD */
7268 { VEX_W_TABLE (VEX_W_0FXOP_08_CD_L_0
) },
7271 /* VEX_LEN_0FXOP_08_CE */
7273 { VEX_W_TABLE (VEX_W_0FXOP_08_CE_L_0
) },
7276 /* VEX_LEN_0FXOP_08_CF */
7278 { VEX_W_TABLE (VEX_W_0FXOP_08_CF_L_0
) },
7281 /* VEX_LEN_0FXOP_08_EC */
7283 { VEX_W_TABLE (VEX_W_0FXOP_08_EC_L_0
) },
7286 /* VEX_LEN_0FXOP_08_ED */
7288 { VEX_W_TABLE (VEX_W_0FXOP_08_ED_L_0
) },
7291 /* VEX_LEN_0FXOP_08_EE */
7293 { VEX_W_TABLE (VEX_W_0FXOP_08_EE_L_0
) },
7296 /* VEX_LEN_0FXOP_08_EF */
7298 { VEX_W_TABLE (VEX_W_0FXOP_08_EF_L_0
) },
7301 /* VEX_LEN_0FXOP_09_01 */
7303 { REG_TABLE (REG_0FXOP_09_01_L_0
) },
7306 /* VEX_LEN_0FXOP_09_02 */
7308 { REG_TABLE (REG_0FXOP_09_02_L_0
) },
7311 /* VEX_LEN_0FXOP_09_12_M_1 */
7313 { REG_TABLE (REG_0FXOP_09_12_M_1_L_0
) },
7316 /* VEX_LEN_0FXOP_09_82_W_0 */
7318 { "vfrczss", { XM
, EXd
}, 0 },
7321 /* VEX_LEN_0FXOP_09_83_W_0 */
7323 { "vfrczsd", { XM
, EXq
}, 0 },
7326 /* VEX_LEN_0FXOP_09_90 */
7328 { "vprotb", { XM
, EXx
, VexW
}, 0 },
7331 /* VEX_LEN_0FXOP_09_91 */
7333 { "vprotw", { XM
, EXx
, VexW
}, 0 },
7336 /* VEX_LEN_0FXOP_09_92 */
7338 { "vprotd", { XM
, EXx
, VexW
}, 0 },
7341 /* VEX_LEN_0FXOP_09_93 */
7343 { "vprotq", { XM
, EXx
, VexW
}, 0 },
7346 /* VEX_LEN_0FXOP_09_94 */
7348 { "vpshlb", { XM
, EXx
, VexW
}, 0 },
7351 /* VEX_LEN_0FXOP_09_95 */
7353 { "vpshlw", { XM
, EXx
, VexW
}, 0 },
7356 /* VEX_LEN_0FXOP_09_96 */
7358 { "vpshld", { XM
, EXx
, VexW
}, 0 },
7361 /* VEX_LEN_0FXOP_09_97 */
7363 { "vpshlq", { XM
, EXx
, VexW
}, 0 },
7366 /* VEX_LEN_0FXOP_09_98 */
7368 { "vpshab", { XM
, EXx
, VexW
}, 0 },
7371 /* VEX_LEN_0FXOP_09_99 */
7373 { "vpshaw", { XM
, EXx
, VexW
}, 0 },
7376 /* VEX_LEN_0FXOP_09_9A */
7378 { "vpshad", { XM
, EXx
, VexW
}, 0 },
7381 /* VEX_LEN_0FXOP_09_9B */
7383 { "vpshaq", { XM
, EXx
, VexW
}, 0 },
7386 /* VEX_LEN_0FXOP_09_C1 */
7388 { VEX_W_TABLE (VEX_W_0FXOP_09_C1_L_0
) },
7391 /* VEX_LEN_0FXOP_09_C2 */
7393 { VEX_W_TABLE (VEX_W_0FXOP_09_C2_L_0
) },
7396 /* VEX_LEN_0FXOP_09_C3 */
7398 { VEX_W_TABLE (VEX_W_0FXOP_09_C3_L_0
) },
7401 /* VEX_LEN_0FXOP_09_C6 */
7403 { VEX_W_TABLE (VEX_W_0FXOP_09_C6_L_0
) },
7406 /* VEX_LEN_0FXOP_09_C7 */
7408 { VEX_W_TABLE (VEX_W_0FXOP_09_C7_L_0
) },
7411 /* VEX_LEN_0FXOP_09_CB */
7413 { VEX_W_TABLE (VEX_W_0FXOP_09_CB_L_0
) },
7416 /* VEX_LEN_0FXOP_09_D1 */
7418 { VEX_W_TABLE (VEX_W_0FXOP_09_D1_L_0
) },
7421 /* VEX_LEN_0FXOP_09_D2 */
7423 { VEX_W_TABLE (VEX_W_0FXOP_09_D2_L_0
) },
7426 /* VEX_LEN_0FXOP_09_D3 */
7428 { VEX_W_TABLE (VEX_W_0FXOP_09_D3_L_0
) },
7431 /* VEX_LEN_0FXOP_09_D6 */
7433 { VEX_W_TABLE (VEX_W_0FXOP_09_D6_L_0
) },
7436 /* VEX_LEN_0FXOP_09_D7 */
7438 { VEX_W_TABLE (VEX_W_0FXOP_09_D7_L_0
) },
7441 /* VEX_LEN_0FXOP_09_DB */
7443 { VEX_W_TABLE (VEX_W_0FXOP_09_DB_L_0
) },
7446 /* VEX_LEN_0FXOP_09_E1 */
7448 { VEX_W_TABLE (VEX_W_0FXOP_09_E1_L_0
) },
7451 /* VEX_LEN_0FXOP_09_E2 */
7453 { VEX_W_TABLE (VEX_W_0FXOP_09_E2_L_0
) },
7456 /* VEX_LEN_0FXOP_09_E3 */
7458 { VEX_W_TABLE (VEX_W_0FXOP_09_E3_L_0
) },
7461 /* VEX_LEN_0FXOP_0A_12 */
7463 { REG_TABLE (REG_0FXOP_0A_12_L_0
) },
7467 #include "i386-dis-evex-len.h"
7469 static const struct dis386 vex_w_table
[][2] = {
7471 /* VEX_W_0F41_L_1_M_1 */
7472 { PREFIX_TABLE (PREFIX_VEX_0F41_L_1_M_1_W_0
) },
7473 { PREFIX_TABLE (PREFIX_VEX_0F41_L_1_M_1_W_1
) },
7476 /* VEX_W_0F42_L_1_M_1 */
7477 { PREFIX_TABLE (PREFIX_VEX_0F42_L_1_M_1_W_0
) },
7478 { PREFIX_TABLE (PREFIX_VEX_0F42_L_1_M_1_W_1
) },
7481 /* VEX_W_0F44_L_0_M_1 */
7482 { PREFIX_TABLE (PREFIX_VEX_0F44_L_0_M_1_W_0
) },
7483 { PREFIX_TABLE (PREFIX_VEX_0F44_L_0_M_1_W_1
) },
7486 /* VEX_W_0F45_L_1_M_1 */
7487 { PREFIX_TABLE (PREFIX_VEX_0F45_L_1_M_1_W_0
) },
7488 { PREFIX_TABLE (PREFIX_VEX_0F45_L_1_M_1_W_1
) },
7491 /* VEX_W_0F46_L_1_M_1 */
7492 { PREFIX_TABLE (PREFIX_VEX_0F46_L_1_M_1_W_0
) },
7493 { PREFIX_TABLE (PREFIX_VEX_0F46_L_1_M_1_W_1
) },
7496 /* VEX_W_0F47_L_1_M_1 */
7497 { PREFIX_TABLE (PREFIX_VEX_0F47_L_1_M_1_W_0
) },
7498 { PREFIX_TABLE (PREFIX_VEX_0F47_L_1_M_1_W_1
) },
7501 /* VEX_W_0F4A_L_1_M_1 */
7502 { PREFIX_TABLE (PREFIX_VEX_0F4A_L_1_M_1_W_0
) },
7503 { PREFIX_TABLE (PREFIX_VEX_0F4A_L_1_M_1_W_1
) },
7506 /* VEX_W_0F4B_L_1_M_1 */
7507 { PREFIX_TABLE (PREFIX_VEX_0F4B_L_1_M_1_W_0
) },
7508 { PREFIX_TABLE (PREFIX_VEX_0F4B_L_1_M_1_W_1
) },
7511 /* VEX_W_0F90_L_0 */
7512 { PREFIX_TABLE (PREFIX_VEX_0F90_L_0_W_0
) },
7513 { PREFIX_TABLE (PREFIX_VEX_0F90_L_0_W_1
) },
7516 /* VEX_W_0F91_L_0_M_0 */
7517 { PREFIX_TABLE (PREFIX_VEX_0F91_L_0_M_0_W_0
) },
7518 { PREFIX_TABLE (PREFIX_VEX_0F91_L_0_M_0_W_1
) },
7521 /* VEX_W_0F92_L_0_M_1 */
7522 { PREFIX_TABLE (PREFIX_VEX_0F92_L_0_M_1_W_0
) },
7523 { PREFIX_TABLE (PREFIX_VEX_0F92_L_0_M_1_W_1
) },
7526 /* VEX_W_0F93_L_0_M_1 */
7527 { PREFIX_TABLE (PREFIX_VEX_0F93_L_0_M_1_W_0
) },
7528 { PREFIX_TABLE (PREFIX_VEX_0F93_L_0_M_1_W_1
) },
7531 /* VEX_W_0F98_L_0_M_1 */
7532 { PREFIX_TABLE (PREFIX_VEX_0F98_L_0_M_1_W_0
) },
7533 { PREFIX_TABLE (PREFIX_VEX_0F98_L_0_M_1_W_1
) },
7536 /* VEX_W_0F99_L_0_M_1 */
7537 { PREFIX_TABLE (PREFIX_VEX_0F99_L_0_M_1_W_0
) },
7538 { PREFIX_TABLE (PREFIX_VEX_0F99_L_0_M_1_W_1
) },
7542 { "vpermilps", { XM
, Vex
, EXx
}, PREFIX_DATA
},
7546 { "vpermilpd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
7550 { "vtestps", { XM
, EXx
}, PREFIX_DATA
},
7554 { "vtestpd", { XM
, EXx
}, PREFIX_DATA
},
7558 { "vcvtph2ps", { XM
, EXxmmq
}, PREFIX_DATA
},
7561 /* VEX_W_0F3816_L_1 */
7562 { "vpermps", { XM
, Vex
, EXx
}, PREFIX_DATA
},
7566 { "vbroadcastss", { XM
, EXxmm_md
}, PREFIX_DATA
},
7569 /* VEX_W_0F3819_L_1 */
7570 { "vbroadcastsd", { XM
, EXxmm_mq
}, PREFIX_DATA
},
7573 /* VEX_W_0F381A_M_0_L_1 */
7574 { "vbroadcastf128", { XM
, Mxmm
}, PREFIX_DATA
},
7577 /* VEX_W_0F382C_M_0 */
7578 { "vmaskmovps", { XM
, Vex
, Mx
}, PREFIX_DATA
},
7581 /* VEX_W_0F382D_M_0 */
7582 { "vmaskmovpd", { XM
, Vex
, Mx
}, PREFIX_DATA
},
7585 /* VEX_W_0F382E_M_0 */
7586 { "vmaskmovps", { Mx
, Vex
, XM
}, PREFIX_DATA
},
7589 /* VEX_W_0F382F_M_0 */
7590 { "vmaskmovpd", { Mx
, Vex
, XM
}, PREFIX_DATA
},
7594 { "vpermd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
7598 { "vpsravd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
7601 /* VEX_W_0F3849_X86_64_P_0 */
7602 { MOD_TABLE (MOD_VEX_0F3849_X86_64_P_0_W_0
) },
7605 /* VEX_W_0F3849_X86_64_P_2 */
7606 { MOD_TABLE (MOD_VEX_0F3849_X86_64_P_2_W_0
) },
7609 /* VEX_W_0F3849_X86_64_P_3 */
7610 { MOD_TABLE (MOD_VEX_0F3849_X86_64_P_3_W_0
) },
7613 /* VEX_W_0F384B_X86_64_P_1 */
7614 { MOD_TABLE (MOD_VEX_0F384B_X86_64_P_1_W_0
) },
7617 /* VEX_W_0F384B_X86_64_P_2 */
7618 { MOD_TABLE (MOD_VEX_0F384B_X86_64_P_2_W_0
) },
7621 /* VEX_W_0F384B_X86_64_P_3 */
7622 { MOD_TABLE (MOD_VEX_0F384B_X86_64_P_3_W_0
) },
7626 { "%XV vpdpbusd", { XM
, Vex
, EXx
}, 0 },
7630 { "%XV vpdpbusds", { XM
, Vex
, EXx
}, 0 },
7634 { "%XV vpdpwssd", { XM
, Vex
, EXx
}, 0 },
7638 { "%XV vpdpwssds", { XM
, Vex
, EXx
}, 0 },
7642 { "vpbroadcastd", { XM
, EXxmm_md
}, PREFIX_DATA
},
7646 { "vpbroadcastq", { XM
, EXxmm_mq
}, PREFIX_DATA
},
7649 /* VEX_W_0F385A_M_0_L_0 */
7650 { "vbroadcasti128", { XM
, Mxmm
}, PREFIX_DATA
},
7653 /* VEX_W_0F385C_X86_64_P_1 */
7654 { MOD_TABLE (MOD_VEX_0F385C_X86_64_P_1_W_0
) },
7657 /* VEX_W_0F385E_X86_64_P_0 */
7658 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_0_W_0
) },
7661 /* VEX_W_0F385E_X86_64_P_1 */
7662 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_1_W_0
) },
7665 /* VEX_W_0F385E_X86_64_P_2 */
7666 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_2_W_0
) },
7669 /* VEX_W_0F385E_X86_64_P_3 */
7670 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_3_W_0
) },
7674 { "vpbroadcastb", { XM
, EXxmm_mb
}, PREFIX_DATA
},
7678 { "vpbroadcastw", { XM
, EXxmm_mw
}, PREFIX_DATA
},
7682 { "vgf2p8mulb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
7685 /* VEX_W_0F3A00_L_1 */
7687 { "vpermq", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7690 /* VEX_W_0F3A01_L_1 */
7692 { "vpermpd", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7696 { "vpblendd", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
7700 { "vpermilps", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7704 { "vpermilpd", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7707 /* VEX_W_0F3A06_L_1 */
7708 { "vperm2f128", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
7711 /* VEX_W_0F3A18_L_1 */
7712 { "vinsertf128", { XM
, Vex
, EXxmm
, Ib
}, PREFIX_DATA
},
7715 /* VEX_W_0F3A19_L_1 */
7716 { "vextractf128", { EXxmm
, XM
, Ib
}, PREFIX_DATA
},
7720 { "vcvtps2ph", { EXxmmq
, XM
, EXxEVexS
, Ib
}, PREFIX_DATA
},
7723 /* VEX_W_0F3A38_L_1 */
7724 { "vinserti128", { XM
, Vex
, EXxmm
, Ib
}, PREFIX_DATA
},
7727 /* VEX_W_0F3A39_L_1 */
7728 { "vextracti128", { EXxmm
, XM
, Ib
}, PREFIX_DATA
},
7731 /* VEX_W_0F3A46_L_1 */
7732 { "vperm2i128", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
7736 { "vblendvps", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
7740 { "vblendvpd", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
7744 { "vpblendvb", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
7749 { "vgf2p8affineqb", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
7754 { "vgf2p8affineinvqb", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
7756 /* VEX_W_0FXOP_08_85_L_0 */
7758 { "vpmacssww", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7760 /* VEX_W_0FXOP_08_86_L_0 */
7762 { "vpmacsswd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7764 /* VEX_W_0FXOP_08_87_L_0 */
7766 { "vpmacssdql", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7768 /* VEX_W_0FXOP_08_8E_L_0 */
7770 { "vpmacssdd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7772 /* VEX_W_0FXOP_08_8F_L_0 */
7774 { "vpmacssdqh", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7776 /* VEX_W_0FXOP_08_95_L_0 */
7778 { "vpmacsww", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7780 /* VEX_W_0FXOP_08_96_L_0 */
7782 { "vpmacswd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7784 /* VEX_W_0FXOP_08_97_L_0 */
7786 { "vpmacsdql", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7788 /* VEX_W_0FXOP_08_9E_L_0 */
7790 { "vpmacsdd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7792 /* VEX_W_0FXOP_08_9F_L_0 */
7794 { "vpmacsdqh", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7796 /* VEX_W_0FXOP_08_A6_L_0 */
7798 { "vpmadcsswd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7800 /* VEX_W_0FXOP_08_B6_L_0 */
7802 { "vpmadcswd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7804 /* VEX_W_0FXOP_08_C0_L_0 */
7806 { "vprotb", { XM
, EXx
, Ib
}, 0 },
7808 /* VEX_W_0FXOP_08_C1_L_0 */
7810 { "vprotw", { XM
, EXx
, Ib
}, 0 },
7812 /* VEX_W_0FXOP_08_C2_L_0 */
7814 { "vprotd", { XM
, EXx
, Ib
}, 0 },
7816 /* VEX_W_0FXOP_08_C3_L_0 */
7818 { "vprotq", { XM
, EXx
, Ib
}, 0 },
7820 /* VEX_W_0FXOP_08_CC_L_0 */
7822 { "vpcomb", { XM
, Vex
, EXx
, VPCOM
}, 0 },
7824 /* VEX_W_0FXOP_08_CD_L_0 */
7826 { "vpcomw", { XM
, Vex
, EXx
, VPCOM
}, 0 },
7828 /* VEX_W_0FXOP_08_CE_L_0 */
7830 { "vpcomd", { XM
, Vex
, EXx
, VPCOM
}, 0 },
7832 /* VEX_W_0FXOP_08_CF_L_0 */
7834 { "vpcomq", { XM
, Vex
, EXx
, VPCOM
}, 0 },
7836 /* VEX_W_0FXOP_08_EC_L_0 */
7838 { "vpcomub", { XM
, Vex
, EXx
, VPCOM
}, 0 },
7840 /* VEX_W_0FXOP_08_ED_L_0 */
7842 { "vpcomuw", { XM
, Vex
, EXx
, VPCOM
}, 0 },
7844 /* VEX_W_0FXOP_08_EE_L_0 */
7846 { "vpcomud", { XM
, Vex
, EXx
, VPCOM
}, 0 },
7848 /* VEX_W_0FXOP_08_EF_L_0 */
7850 { "vpcomuq", { XM
, Vex
, EXx
, VPCOM
}, 0 },
7852 /* VEX_W_0FXOP_09_80 */
7854 { "vfrczps", { XM
, EXx
}, 0 },
7856 /* VEX_W_0FXOP_09_81 */
7858 { "vfrczpd", { XM
, EXx
}, 0 },
7860 /* VEX_W_0FXOP_09_82 */
7862 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_82_W_0
) },
7864 /* VEX_W_0FXOP_09_83 */
7866 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_83_W_0
) },
7868 /* VEX_W_0FXOP_09_C1_L_0 */
7870 { "vphaddbw", { XM
, EXxmm
}, 0 },
7872 /* VEX_W_0FXOP_09_C2_L_0 */
7874 { "vphaddbd", { XM
, EXxmm
}, 0 },
7876 /* VEX_W_0FXOP_09_C3_L_0 */
7878 { "vphaddbq", { XM
, EXxmm
}, 0 },
7880 /* VEX_W_0FXOP_09_C6_L_0 */
7882 { "vphaddwd", { XM
, EXxmm
}, 0 },
7884 /* VEX_W_0FXOP_09_C7_L_0 */
7886 { "vphaddwq", { XM
, EXxmm
}, 0 },
7888 /* VEX_W_0FXOP_09_CB_L_0 */
7890 { "vphadddq", { XM
, EXxmm
}, 0 },
7892 /* VEX_W_0FXOP_09_D1_L_0 */
7894 { "vphaddubw", { XM
, EXxmm
}, 0 },
7896 /* VEX_W_0FXOP_09_D2_L_0 */
7898 { "vphaddubd", { XM
, EXxmm
}, 0 },
7900 /* VEX_W_0FXOP_09_D3_L_0 */
7902 { "vphaddubq", { XM
, EXxmm
}, 0 },
7904 /* VEX_W_0FXOP_09_D6_L_0 */
7906 { "vphadduwd", { XM
, EXxmm
}, 0 },
7908 /* VEX_W_0FXOP_09_D7_L_0 */
7910 { "vphadduwq", { XM
, EXxmm
}, 0 },
7912 /* VEX_W_0FXOP_09_DB_L_0 */
7914 { "vphaddudq", { XM
, EXxmm
}, 0 },
7916 /* VEX_W_0FXOP_09_E1_L_0 */
7918 { "vphsubbw", { XM
, EXxmm
}, 0 },
7920 /* VEX_W_0FXOP_09_E2_L_0 */
7922 { "vphsubwd", { XM
, EXxmm
}, 0 },
7924 /* VEX_W_0FXOP_09_E3_L_0 */
7926 { "vphsubdq", { XM
, EXxmm
}, 0 },
7929 #include "i386-dis-evex-w.h"
7932 static const struct dis386 mod_table
[][2] = {
7935 { "leaS", { Gv
, M
}, 0 },
7940 { RM_TABLE (RM_C6_REG_7
) },
7945 { RM_TABLE (RM_C7_REG_7
) },
7949 { "{l|}call^", { indirEp
}, 0 },
7953 { "{l|}jmp^", { indirEp
}, 0 },
7956 /* MOD_0F01_REG_0 */
7957 { X86_64_TABLE (X86_64_0F01_REG_0
) },
7958 { RM_TABLE (RM_0F01_REG_0
) },
7961 /* MOD_0F01_REG_1 */
7962 { X86_64_TABLE (X86_64_0F01_REG_1
) },
7963 { RM_TABLE (RM_0F01_REG_1
) },
7966 /* MOD_0F01_REG_2 */
7967 { X86_64_TABLE (X86_64_0F01_REG_2
) },
7968 { RM_TABLE (RM_0F01_REG_2
) },
7971 /* MOD_0F01_REG_3 */
7972 { X86_64_TABLE (X86_64_0F01_REG_3
) },
7973 { RM_TABLE (RM_0F01_REG_3
) },
7976 /* MOD_0F01_REG_5 */
7977 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_0
) },
7978 { RM_TABLE (RM_0F01_REG_5_MOD_3
) },
7981 /* MOD_0F01_REG_7 */
7982 { "invlpg", { Mb
}, 0 },
7983 { RM_TABLE (RM_0F01_REG_7_MOD_3
) },
7986 /* MOD_0F12_PREFIX_0 */
7987 { "movlpX", { XM
, EXq
}, 0 },
7988 { "movhlps", { XM
, EXq
}, 0 },
7991 /* MOD_0F12_PREFIX_2 */
7992 { "movlpX", { XM
, EXq
}, 0 },
7996 { "movlpX", { EXq
, XM
}, PREFIX_OPCODE
},
7999 /* MOD_0F16_PREFIX_0 */
8000 { "movhpX", { XM
, EXq
}, 0 },
8001 { "movlhps", { XM
, EXq
}, 0 },
8004 /* MOD_0F16_PREFIX_2 */
8005 { "movhpX", { XM
, EXq
}, 0 },
8009 { "movhpX", { EXq
, XM
}, PREFIX_OPCODE
},
8012 /* MOD_0F18_REG_0 */
8013 { "prefetchnta", { Mb
}, 0 },
8014 { "nopQ", { Ev
}, 0 },
8017 /* MOD_0F18_REG_1 */
8018 { "prefetcht0", { Mb
}, 0 },
8019 { "nopQ", { Ev
}, 0 },
8022 /* MOD_0F18_REG_2 */
8023 { "prefetcht1", { Mb
}, 0 },
8024 { "nopQ", { Ev
}, 0 },
8027 /* MOD_0F18_REG_3 */
8028 { "prefetcht2", { Mb
}, 0 },
8029 { "nopQ", { Ev
}, 0 },
8032 /* MOD_0F1A_PREFIX_0 */
8033 { "bndldx", { Gbnd
, Mv_bnd
}, 0 },
8034 { "nopQ", { Ev
}, 0 },
8037 /* MOD_0F1B_PREFIX_0 */
8038 { "bndstx", { Mv_bnd
, Gbnd
}, 0 },
8039 { "nopQ", { Ev
}, 0 },
8042 /* MOD_0F1B_PREFIX_1 */
8043 { "bndmk", { Gbnd
, Mv_bnd
}, 0 },
8044 { "nopQ", { Ev
}, PREFIX_IGNORED
},
8047 /* MOD_0F1C_PREFIX_0 */
8048 { REG_TABLE (REG_0F1C_P_0_MOD_0
) },
8049 { "nopQ", { Ev
}, 0 },
8052 /* MOD_0F1E_PREFIX_1 */
8053 { "nopQ", { Ev
}, PREFIX_IGNORED
},
8054 { REG_TABLE (REG_0F1E_P_1_MOD_3
) },
8057 /* MOD_0F2B_PREFIX_0 */
8058 {"movntps", { Mx
, XM
}, PREFIX_OPCODE
},
8061 /* MOD_0F2B_PREFIX_1 */
8062 {"movntss", { Md
, XM
}, PREFIX_OPCODE
},
8065 /* MOD_0F2B_PREFIX_2 */
8066 {"movntpd", { Mx
, XM
}, PREFIX_OPCODE
},
8069 /* MOD_0F2B_PREFIX_3 */
8070 {"movntsd", { Mq
, XM
}, PREFIX_OPCODE
},
8075 { "movmskpX", { Gdq
, XS
}, PREFIX_OPCODE
},
8080 { REG_TABLE (REG_0F71_MOD_0
) },
8085 { REG_TABLE (REG_0F72_MOD_0
) },
8090 { REG_TABLE (REG_0F73_MOD_0
) },
8093 /* MOD_0FAE_REG_0 */
8094 { "fxsave", { FXSAVE
}, 0 },
8095 { PREFIX_TABLE (PREFIX_0FAE_REG_0_MOD_3
) },
8098 /* MOD_0FAE_REG_1 */
8099 { "fxrstor", { FXSAVE
}, 0 },
8100 { PREFIX_TABLE (PREFIX_0FAE_REG_1_MOD_3
) },
8103 /* MOD_0FAE_REG_2 */
8104 { "ldmxcsr", { Md
}, 0 },
8105 { PREFIX_TABLE (PREFIX_0FAE_REG_2_MOD_3
) },
8108 /* MOD_0FAE_REG_3 */
8109 { "stmxcsr", { Md
}, 0 },
8110 { PREFIX_TABLE (PREFIX_0FAE_REG_3_MOD_3
) },
8113 /* MOD_0FAE_REG_4 */
8114 { PREFIX_TABLE (PREFIX_0FAE_REG_4_MOD_0
) },
8115 { PREFIX_TABLE (PREFIX_0FAE_REG_4_MOD_3
) },
8118 /* MOD_0FAE_REG_5 */
8119 { "xrstor", { FXSAVE
}, PREFIX_OPCODE
},
8120 { PREFIX_TABLE (PREFIX_0FAE_REG_5_MOD_3
) },
8123 /* MOD_0FAE_REG_6 */
8124 { PREFIX_TABLE (PREFIX_0FAE_REG_6_MOD_0
) },
8125 { PREFIX_TABLE (PREFIX_0FAE_REG_6_MOD_3
) },
8128 /* MOD_0FAE_REG_7 */
8129 { PREFIX_TABLE (PREFIX_0FAE_REG_7_MOD_0
) },
8130 { RM_TABLE (RM_0FAE_REG_7_MOD_3
) },
8134 { "lssS", { Gv
, Mp
}, 0 },
8138 { "lfsS", { Gv
, Mp
}, 0 },
8142 { "lgsS", { Gv
, Mp
}, 0 },
8146 { "movntiS", { Edq
, Gdq
}, PREFIX_OPCODE
},
8149 /* MOD_0FC7_REG_3 */
8150 { "xrstors", { FXSAVE
}, 0 },
8153 /* MOD_0FC7_REG_4 */
8154 { "xsavec", { FXSAVE
}, 0 },
8157 /* MOD_0FC7_REG_5 */
8158 { "xsaves", { FXSAVE
}, 0 },
8161 /* MOD_0FC7_REG_6 */
8162 { PREFIX_TABLE (PREFIX_0FC7_REG_6_MOD_0
) },
8163 { PREFIX_TABLE (PREFIX_0FC7_REG_6_MOD_3
) }
8166 /* MOD_0FC7_REG_7 */
8167 { "vmptrst", { Mq
}, 0 },
8168 { PREFIX_TABLE (PREFIX_0FC7_REG_7_MOD_3
) }
8173 { "pmovmskb", { Gdq
, MS
}, 0 },
8176 /* MOD_0FE7_PREFIX_2 */
8177 { "movntdq", { Mx
, XM
}, 0 },
8180 /* MOD_0FF0_PREFIX_3 */
8181 { "lddqu", { XM
, M
}, 0 },
8185 { "movntdqa", { XM
, Mx
}, PREFIX_DATA
},
8188 /* MOD_0F38DC_PREFIX_1 */
8189 { "aesenc128kl", { XM
, M
}, 0 },
8190 { "loadiwkey", { XM
, EXx
}, 0 },
8193 /* MOD_0F38DD_PREFIX_1 */
8194 { "aesdec128kl", { XM
, M
}, 0 },
8197 /* MOD_0F38DE_PREFIX_1 */
8198 { "aesenc256kl", { XM
, M
}, 0 },
8201 /* MOD_0F38DF_PREFIX_1 */
8202 { "aesdec256kl", { XM
, M
}, 0 },
8206 { "wrussK", { M
, Gdq
}, PREFIX_DATA
},
8209 /* MOD_0F38F6_PREFIX_0 */
8210 { "wrssK", { M
, Gdq
}, PREFIX_OPCODE
},
8213 /* MOD_0F38F8_PREFIX_1 */
8214 { "enqcmds", { Gva
, M
}, PREFIX_OPCODE
},
8217 /* MOD_0F38F8_PREFIX_2 */
8218 { "movdir64b", { Gva
, M
}, PREFIX_OPCODE
},
8221 /* MOD_0F38F8_PREFIX_3 */
8222 { "enqcmd", { Gva
, M
}, PREFIX_OPCODE
},
8226 { "movdiri", { Edq
, Gdq
}, PREFIX_OPCODE
},
8229 /* MOD_0F38FA_PREFIX_1 */
8231 { "encodekey128", { Gd
, Ed
}, 0 },
8234 /* MOD_0F38FB_PREFIX_1 */
8236 { "encodekey256", { Gd
, Ed
}, 0 },
8239 /* MOD_0F3A0F_PREFIX_1 */
8241 { REG_TABLE (REG_0F3A0F_PREFIX_1_MOD_3
) },
8245 { "bound{S|}", { Gv
, Ma
}, 0 },
8246 { EVEX_TABLE (EVEX_0F
) },
8250 { "lesS", { Gv
, Mp
}, 0 },
8251 { VEX_C4_TABLE (VEX_0F
) },
8255 { "ldsS", { Gv
, Mp
}, 0 },
8256 { VEX_C5_TABLE (VEX_0F
) },
8259 /* MOD_VEX_0F12_PREFIX_0 */
8260 { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_0
) },
8261 { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_1
) },
8264 /* MOD_VEX_0F12_PREFIX_2 */
8265 { VEX_LEN_TABLE (VEX_LEN_0F12_P_2_M_0
) },
8269 { VEX_LEN_TABLE (VEX_LEN_0F13_M_0
) },
8272 /* MOD_VEX_0F16_PREFIX_0 */
8273 { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_0
) },
8274 { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_1
) },
8277 /* MOD_VEX_0F16_PREFIX_2 */
8278 { VEX_LEN_TABLE (VEX_LEN_0F16_P_2_M_0
) },
8282 { VEX_LEN_TABLE (VEX_LEN_0F17_M_0
) },
8286 { "vmovntpX", { Mx
, XM
}, PREFIX_OPCODE
},
8289 /* MOD_VEX_0F41_L_1 */
8291 { VEX_W_TABLE (VEX_W_0F41_L_1_M_1
) },
8294 /* MOD_VEX_0F42_L_1 */
8296 { VEX_W_TABLE (VEX_W_0F42_L_1_M_1
) },
8299 /* MOD_VEX_0F44_L_0 */
8301 { VEX_W_TABLE (VEX_W_0F44_L_0_M_1
) },
8304 /* MOD_VEX_0F45_L_1 */
8306 { VEX_W_TABLE (VEX_W_0F45_L_1_M_1
) },
8309 /* MOD_VEX_0F46_L_1 */
8311 { VEX_W_TABLE (VEX_W_0F46_L_1_M_1
) },
8314 /* MOD_VEX_0F47_L_1 */
8316 { VEX_W_TABLE (VEX_W_0F47_L_1_M_1
) },
8319 /* MOD_VEX_0F4A_L_1 */
8321 { VEX_W_TABLE (VEX_W_0F4A_L_1_M_1
) },
8324 /* MOD_VEX_0F4B_L_1 */
8326 { VEX_W_TABLE (VEX_W_0F4B_L_1_M_1
) },
8331 { "vmovmskpX", { Gdq
, XS
}, PREFIX_OPCODE
},
8336 { REG_TABLE (REG_VEX_0F71_M_0
) },
8341 { REG_TABLE (REG_VEX_0F72_M_0
) },
8346 { REG_TABLE (REG_VEX_0F73_M_0
) },
8349 /* MOD_VEX_0F91_L_0 */
8350 { VEX_W_TABLE (VEX_W_0F91_L_0_M_0
) },
8353 /* MOD_VEX_0F92_L_0 */
8355 { VEX_W_TABLE (VEX_W_0F92_L_0_M_1
) },
8358 /* MOD_VEX_0F93_L_0 */
8360 { VEX_W_TABLE (VEX_W_0F93_L_0_M_1
) },
8363 /* MOD_VEX_0F98_L_0 */
8365 { VEX_W_TABLE (VEX_W_0F98_L_0_M_1
) },
8368 /* MOD_VEX_0F99_L_0 */
8370 { VEX_W_TABLE (VEX_W_0F99_L_0_M_1
) },
8373 /* MOD_VEX_0FAE_REG_2 */
8374 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_2_M_0
) },
8377 /* MOD_VEX_0FAE_REG_3 */
8378 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_3_M_0
) },
8383 { "vpmovmskb", { Gdq
, XS
}, PREFIX_DATA
},
8387 { "vmovntdq", { Mx
, XM
}, PREFIX_DATA
},
8390 /* MOD_VEX_0FF0_PREFIX_3 */
8391 { "vlddqu", { XM
, M
}, 0 },
8394 /* MOD_VEX_0F381A */
8395 { VEX_LEN_TABLE (VEX_LEN_0F381A_M_0
) },
8398 /* MOD_VEX_0F382A */
8399 { "vmovntdqa", { XM
, Mx
}, PREFIX_DATA
},
8402 /* MOD_VEX_0F382C */
8403 { VEX_W_TABLE (VEX_W_0F382C_M_0
) },
8406 /* MOD_VEX_0F382D */
8407 { VEX_W_TABLE (VEX_W_0F382D_M_0
) },
8410 /* MOD_VEX_0F382E */
8411 { VEX_W_TABLE (VEX_W_0F382E_M_0
) },
8414 /* MOD_VEX_0F382F */
8415 { VEX_W_TABLE (VEX_W_0F382F_M_0
) },
8418 /* MOD_VEX_0F3849_X86_64_P_0_W_0 */
8419 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_0_W_0_M_0
) },
8420 { REG_TABLE (REG_VEX_0F3849_X86_64_P_0_W_0_M_1
) },
8423 /* MOD_VEX_0F3849_X86_64_P_2_W_0 */
8424 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_2_W_0_M_0
) },
8427 /* MOD_VEX_0F3849_X86_64_P_3_W_0 */
8429 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_3_W_0_M_0
) },
8432 /* MOD_VEX_0F384B_X86_64_P_1_W_0 */
8433 { VEX_LEN_TABLE (VEX_LEN_0F384B_X86_64_P_1_W_0_M_0
) },
8436 /* MOD_VEX_0F384B_X86_64_P_2_W_0 */
8437 { VEX_LEN_TABLE (VEX_LEN_0F384B_X86_64_P_2_W_0_M_0
) },
8440 /* MOD_VEX_0F384B_X86_64_P_3_W_0 */
8441 { VEX_LEN_TABLE (VEX_LEN_0F384B_X86_64_P_3_W_0_M_0
) },
8444 /* MOD_VEX_0F385A */
8445 { VEX_LEN_TABLE (VEX_LEN_0F385A_M_0
) },
8448 /* MOD_VEX_0F385C_X86_64_P_1_W_0 */
8450 { VEX_LEN_TABLE (VEX_LEN_0F385C_X86_64_P_1_W_0_M_0
) },
8453 /* MOD_VEX_0F385E_X86_64_P_0_W_0 */
8455 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_0_W_0_M_0
) },
8458 /* MOD_VEX_0F385E_X86_64_P_1_W_0 */
8460 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_1_W_0_M_0
) },
8463 /* MOD_VEX_0F385E_X86_64_P_2_W_0 */
8465 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_2_W_0_M_0
) },
8468 /* MOD_VEX_0F385E_X86_64_P_3_W_0 */
8470 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_3_W_0_M_0
) },
8473 /* MOD_VEX_0F388C */
8474 { "vpmaskmov%DQ", { XM
, Vex
, Mx
}, PREFIX_DATA
},
8477 /* MOD_VEX_0F388E */
8478 { "vpmaskmov%DQ", { Mx
, Vex
, XM
}, PREFIX_DATA
},
8481 /* MOD_VEX_0F3A30_L_0 */
8483 { "kshiftr%BW", { MaskG
, MaskE
, Ib
}, PREFIX_DATA
},
8486 /* MOD_VEX_0F3A31_L_0 */
8488 { "kshiftr%DQ", { MaskG
, MaskE
, Ib
}, PREFIX_DATA
},
8491 /* MOD_VEX_0F3A32_L_0 */
8493 { "kshiftl%BW", { MaskG
, MaskE
, Ib
}, PREFIX_DATA
},
8496 /* MOD_VEX_0F3A33_L_0 */
8498 { "kshiftl%DQ", { MaskG
, MaskE
, Ib
}, PREFIX_DATA
},
8501 /* MOD_VEX_0FXOP_09_12 */
8503 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_12_M_1
) },
8506 #include "i386-dis-evex-mod.h"
8509 static const struct dis386 rm_table
[][8] = {
8512 { "xabort", { Skip_MODRM
, Ib
}, 0 },
8516 { "xbeginT", { Skip_MODRM
, Jdqw
}, 0 },
8520 { "enclv", { Skip_MODRM
}, 0 },
8521 { "vmcall", { Skip_MODRM
}, 0 },
8522 { "vmlaunch", { Skip_MODRM
}, 0 },
8523 { "vmresume", { Skip_MODRM
}, 0 },
8524 { "vmxoff", { Skip_MODRM
}, 0 },
8525 { "pconfig", { Skip_MODRM
}, 0 },
8529 { "monitor", { { OP_Monitor
, 0 } }, 0 },
8530 { "mwait", { { OP_Mwait
, 0 } }, 0 },
8531 { "clac", { Skip_MODRM
}, 0 },
8532 { "stac", { Skip_MODRM
}, 0 },
8533 { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_4
) },
8534 { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_5
) },
8535 { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_6
) },
8536 { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_7
) },
8540 { "xgetbv", { Skip_MODRM
}, 0 },
8541 { "xsetbv", { Skip_MODRM
}, 0 },
8544 { "vmfunc", { Skip_MODRM
}, 0 },
8545 { "xend", { Skip_MODRM
}, 0 },
8546 { "xtest", { Skip_MODRM
}, 0 },
8547 { "enclu", { Skip_MODRM
}, 0 },
8551 { "vmrun", { Skip_MODRM
}, 0 },
8552 { PREFIX_TABLE (PREFIX_0F01_REG_3_RM_1
) },
8553 { "vmload", { Skip_MODRM
}, 0 },
8554 { "vmsave", { Skip_MODRM
}, 0 },
8555 { "stgi", { Skip_MODRM
}, 0 },
8556 { "clgi", { Skip_MODRM
}, 0 },
8557 { "skinit", { Skip_MODRM
}, 0 },
8558 { "invlpga", { Skip_MODRM
}, 0 },
8561 /* RM_0F01_REG_5_MOD_3 */
8562 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_0
) },
8563 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_1
) },
8564 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_2
) },
8566 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_4
) },
8567 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_5
) },
8568 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_6
) },
8569 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_7
) },
8572 /* RM_0F01_REG_7_MOD_3 */
8573 { "swapgs", { Skip_MODRM
}, 0 },
8574 { "rdtscp", { Skip_MODRM
}, 0 },
8575 { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_2
) },
8576 { "mwaitx", { { OP_Mwait
, eBX_reg
} }, PREFIX_OPCODE
},
8577 { "clzero", { Skip_MODRM
}, 0 },
8578 { "rdpru", { Skip_MODRM
}, 0 },
8579 { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_6
) },
8580 { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_7
) },
8583 /* RM_0F1E_P_1_MOD_3_REG_7 */
8584 { "nopQ", { Ev
}, PREFIX_IGNORED
},
8585 { "nopQ", { Ev
}, PREFIX_IGNORED
},
8586 { "endbr64", { Skip_MODRM
}, 0 },
8587 { "endbr32", { Skip_MODRM
}, 0 },
8588 { "nopQ", { Ev
}, PREFIX_IGNORED
},
8589 { "nopQ", { Ev
}, PREFIX_IGNORED
},
8590 { "nopQ", { Ev
}, PREFIX_IGNORED
},
8591 { "nopQ", { Ev
}, PREFIX_IGNORED
},
8594 /* RM_0F3A0F_P_1_MOD_3_REG_0 */
8595 { "hreset", { Skip_MODRM
, Ib
}, 0 },
8598 /* RM_0FAE_REG_6_MOD_3 */
8599 { "mfence", { Skip_MODRM
}, 0 },
8602 /* RM_0FAE_REG_7_MOD_3 */
8603 { "sfence", { Skip_MODRM
}, 0 },
8607 /* RM_VEX_0F3849_X86_64_P_0_W_0_M_1_R_0 */
8608 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_0_W_0_M_1_REG_0_RM_0
) },
8612 #define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
8614 /* We use the high bit to indicate different name for the same
8616 #define REP_PREFIX (0xf3 | 0x100)
8617 #define XACQUIRE_PREFIX (0xf2 | 0x200)
8618 #define XRELEASE_PREFIX (0xf3 | 0x400)
8619 #define BND_PREFIX (0xf2 | 0x400)
8620 #define NOTRACK_PREFIX (0x3e | 0x100)
8622 /* Remember if the current op is a jump instruction. */
8623 static bfd_boolean op_is_jump
= FALSE
;
8628 int newrex
, i
, length
;
8633 last_lock_prefix
= -1;
8634 last_repz_prefix
= -1;
8635 last_repnz_prefix
= -1;
8636 last_data_prefix
= -1;
8637 last_addr_prefix
= -1;
8638 last_rex_prefix
= -1;
8639 last_seg_prefix
= -1;
8641 active_seg_prefix
= 0;
8642 for (i
= 0; i
< (int) ARRAY_SIZE (all_prefixes
); i
++)
8643 all_prefixes
[i
] = 0;
8646 /* The maximum instruction length is 15bytes. */
8647 while (length
< MAX_CODE_LENGTH
- 1)
8649 FETCH_DATA (the_info
, codep
+ 1);
8653 /* REX prefixes family. */
8670 if (address_mode
== mode_64bit
)
8674 last_rex_prefix
= i
;
8677 prefixes
|= PREFIX_REPZ
;
8678 last_repz_prefix
= i
;
8681 prefixes
|= PREFIX_REPNZ
;
8682 last_repnz_prefix
= i
;
8685 prefixes
|= PREFIX_LOCK
;
8686 last_lock_prefix
= i
;
8689 prefixes
|= PREFIX_CS
;
8690 last_seg_prefix
= i
;
8692 if (address_mode
!= mode_64bit
)
8693 active_seg_prefix
= PREFIX_CS
;
8697 prefixes
|= PREFIX_SS
;
8698 last_seg_prefix
= i
;
8700 if (address_mode
!= mode_64bit
)
8701 active_seg_prefix
= PREFIX_SS
;
8705 prefixes
|= PREFIX_DS
;
8706 last_seg_prefix
= i
;
8708 if (address_mode
!= mode_64bit
)
8709 active_seg_prefix
= PREFIX_DS
;
8713 prefixes
|= PREFIX_ES
;
8714 last_seg_prefix
= i
;
8716 if (address_mode
!= mode_64bit
)
8717 active_seg_prefix
= PREFIX_ES
;
8721 prefixes
|= PREFIX_FS
;
8722 last_seg_prefix
= i
;
8723 active_seg_prefix
= PREFIX_FS
;
8726 prefixes
|= PREFIX_GS
;
8727 last_seg_prefix
= i
;
8728 active_seg_prefix
= PREFIX_GS
;
8731 prefixes
|= PREFIX_DATA
;
8732 last_data_prefix
= i
;
8735 prefixes
|= PREFIX_ADDR
;
8736 last_addr_prefix
= i
;
8739 /* fwait is really an instruction. If there are prefixes
8740 before the fwait, they belong to the fwait, *not* to the
8741 following instruction. */
8743 if (prefixes
|| rex
)
8745 prefixes
|= PREFIX_FWAIT
;
8747 /* This ensures that the previous REX prefixes are noticed
8748 as unused prefixes, as in the return case below. */
8752 prefixes
= PREFIX_FWAIT
;
8757 /* Rex is ignored when followed by another prefix. */
8763 if (*codep
!= FWAIT_OPCODE
)
8764 all_prefixes
[i
++] = *codep
;
8772 /* Return the name of the prefix byte PREF, or NULL if PREF is not a
8776 prefix_name (int pref
, int sizeflag
)
8778 static const char *rexes
[16] =
8783 "rex.XB", /* 0x43 */
8785 "rex.RB", /* 0x45 */
8786 "rex.RX", /* 0x46 */
8787 "rex.RXB", /* 0x47 */
8789 "rex.WB", /* 0x49 */
8790 "rex.WX", /* 0x4a */
8791 "rex.WXB", /* 0x4b */
8792 "rex.WR", /* 0x4c */
8793 "rex.WRB", /* 0x4d */
8794 "rex.WRX", /* 0x4e */
8795 "rex.WRXB", /* 0x4f */
8800 /* REX prefixes family. */
8817 return rexes
[pref
- 0x40];
8837 return (sizeflag
& DFLAG
) ? "data16" : "data32";
8839 if (address_mode
== mode_64bit
)
8840 return (sizeflag
& AFLAG
) ? "addr32" : "addr64";
8842 return (sizeflag
& AFLAG
) ? "addr16" : "addr32";
8847 case XACQUIRE_PREFIX
:
8849 case XRELEASE_PREFIX
:
8853 case NOTRACK_PREFIX
:
8860 static char op_out
[MAX_OPERANDS
][100];
8861 static int op_ad
, op_index
[MAX_OPERANDS
];
8862 static int two_source_ops
;
8863 static bfd_vma op_address
[MAX_OPERANDS
];
8864 static bfd_vma op_riprel
[MAX_OPERANDS
];
8865 static bfd_vma start_pc
;
8868 * On the 386's of 1988, the maximum length of an instruction is 15 bytes.
8869 * (see topic "Redundant prefixes" in the "Differences from 8086"
8870 * section of the "Virtual 8086 Mode" chapter.)
8871 * 'pc' should be the address of this instruction, it will
8872 * be used to print the target address if this is a relative jump or call
8873 * The function returns the length of this instruction in bytes.
8876 static char intel_syntax
;
8877 static char intel_mnemonic
= !SYSV386_COMPAT
;
8878 static char open_char
;
8879 static char close_char
;
8880 static char separator_char
;
8881 static char scale_char
;
8889 static enum x86_64_isa isa64
;
8891 /* Here for backwards compatibility. When gdb stops using
8892 print_insn_i386_att and print_insn_i386_intel these functions can
8893 disappear, and print_insn_i386 be merged into print_insn. */
8895 print_insn_i386_att (bfd_vma pc
, disassemble_info
*info
)
8899 return print_insn (pc
, info
);
8903 print_insn_i386_intel (bfd_vma pc
, disassemble_info
*info
)
8907 return print_insn (pc
, info
);
8911 print_insn_i386 (bfd_vma pc
, disassemble_info
*info
)
8915 return print_insn (pc
, info
);
8919 print_i386_disassembler_options (FILE *stream
)
8921 fprintf (stream
, _("\n\
8922 The following i386/x86-64 specific disassembler options are supported for use\n\
8923 with the -M switch (multiple options should be separated by commas):\n"));
8925 fprintf (stream
, _(" x86-64 Disassemble in 64bit mode\n"));
8926 fprintf (stream
, _(" i386 Disassemble in 32bit mode\n"));
8927 fprintf (stream
, _(" i8086 Disassemble in 16bit mode\n"));
8928 fprintf (stream
, _(" att Display instruction in AT&T syntax\n"));
8929 fprintf (stream
, _(" intel Display instruction in Intel syntax\n"));
8930 fprintf (stream
, _(" att-mnemonic\n"
8931 " Display instruction in AT&T mnemonic\n"));
8932 fprintf (stream
, _(" intel-mnemonic\n"
8933 " Display instruction in Intel mnemonic\n"));
8934 fprintf (stream
, _(" addr64 Assume 64bit address size\n"));
8935 fprintf (stream
, _(" addr32 Assume 32bit address size\n"));
8936 fprintf (stream
, _(" addr16 Assume 16bit address size\n"));
8937 fprintf (stream
, _(" data32 Assume 32bit data size\n"));
8938 fprintf (stream
, _(" data16 Assume 16bit data size\n"));
8939 fprintf (stream
, _(" suffix Always display instruction suffix in AT&T syntax\n"));
8940 fprintf (stream
, _(" amd64 Display instruction in AMD64 ISA\n"));
8941 fprintf (stream
, _(" intel64 Display instruction in Intel64 ISA\n"));
8945 static const struct dis386 bad_opcode
= { "(bad)", { XX
}, 0 };
8947 /* Get a pointer to struct dis386 with a valid name. */
8949 static const struct dis386
*
8950 get_valid_dis386 (const struct dis386
*dp
, disassemble_info
*info
)
8952 int vindex
, vex_table_index
;
8954 if (dp
->name
!= NULL
)
8957 switch (dp
->op
[0].bytemode
)
8960 dp
= ®_table
[dp
->op
[1].bytemode
][modrm
.reg
];
8964 vindex
= modrm
.mod
== 0x3 ? 1 : 0;
8965 dp
= &mod_table
[dp
->op
[1].bytemode
][vindex
];
8969 dp
= &rm_table
[dp
->op
[1].bytemode
][modrm
.rm
];
8972 case USE_PREFIX_TABLE
:
8975 /* The prefix in VEX is implicit. */
8981 case REPE_PREFIX_OPCODE
:
8984 case DATA_PREFIX_OPCODE
:
8987 case REPNE_PREFIX_OPCODE
:
8997 int last_prefix
= -1;
9000 /* We check PREFIX_REPNZ and PREFIX_REPZ before PREFIX_DATA.
9001 When there are multiple PREFIX_REPNZ and PREFIX_REPZ, the
9003 if ((prefixes
& (PREFIX_REPZ
| PREFIX_REPNZ
)) != 0)
9005 if (last_repz_prefix
> last_repnz_prefix
)
9008 prefix
= PREFIX_REPZ
;
9009 last_prefix
= last_repz_prefix
;
9014 prefix
= PREFIX_REPNZ
;
9015 last_prefix
= last_repnz_prefix
;
9018 /* Check if prefix should be ignored. */
9019 if ((((prefix_table
[dp
->op
[1].bytemode
][vindex
].prefix_requirement
9020 & PREFIX_IGNORED
) >> PREFIX_IGNORED_SHIFT
)
9022 && !prefix_table
[dp
->op
[1].bytemode
][vindex
].name
)
9026 if (vindex
== 0 && (prefixes
& PREFIX_DATA
) != 0)
9029 prefix
= PREFIX_DATA
;
9030 last_prefix
= last_data_prefix
;
9035 used_prefixes
|= prefix
;
9036 all_prefixes
[last_prefix
] = 0;
9039 dp
= &prefix_table
[dp
->op
[1].bytemode
][vindex
];
9042 case USE_X86_64_TABLE
:
9043 vindex
= address_mode
== mode_64bit
? 1 : 0;
9044 dp
= &x86_64_table
[dp
->op
[1].bytemode
][vindex
];
9047 case USE_3BYTE_TABLE
:
9048 FETCH_DATA (info
, codep
+ 2);
9050 dp
= &three_byte_table
[dp
->op
[1].bytemode
][vindex
];
9052 modrm
.mod
= (*codep
>> 6) & 3;
9053 modrm
.reg
= (*codep
>> 3) & 7;
9054 modrm
.rm
= *codep
& 7;
9057 case USE_VEX_LEN_TABLE
:
9074 dp
= &vex_len_table
[dp
->op
[1].bytemode
][vindex
];
9077 case USE_EVEX_LEN_TABLE
:
9097 dp
= &evex_len_table
[dp
->op
[1].bytemode
][vindex
];
9100 case USE_XOP_8F_TABLE
:
9101 FETCH_DATA (info
, codep
+ 3);
9102 rex
= ~(*codep
>> 5) & 0x7;
9104 /* VEX_TABLE_INDEX is the mmmmm part of the XOP byte 1 "RCB.mmmmm". */
9105 switch ((*codep
& 0x1f))
9111 vex_table_index
= XOP_08
;
9114 vex_table_index
= XOP_09
;
9117 vex_table_index
= XOP_0A
;
9121 vex
.w
= *codep
& 0x80;
9122 if (vex
.w
&& address_mode
== mode_64bit
)
9125 vex
.register_specifier
= (~(*codep
>> 3)) & 0xf;
9126 if (address_mode
!= mode_64bit
)
9128 /* In 16/32-bit mode REX_B is silently ignored. */
9132 vex
.length
= (*codep
& 0x4) ? 256 : 128;
9133 switch ((*codep
& 0x3))
9138 vex
.prefix
= DATA_PREFIX_OPCODE
;
9141 vex
.prefix
= REPE_PREFIX_OPCODE
;
9144 vex
.prefix
= REPNE_PREFIX_OPCODE
;
9150 dp
= &xop_table
[vex_table_index
][vindex
];
9153 FETCH_DATA (info
, codep
+ 1);
9154 modrm
.mod
= (*codep
>> 6) & 3;
9155 modrm
.reg
= (*codep
>> 3) & 7;
9156 modrm
.rm
= *codep
& 7;
9158 /* No XOP encoding so far allows for a non-zero embedded prefix. Avoid
9159 having to decode the bits for every otherwise valid encoding. */
9164 case USE_VEX_C4_TABLE
:
9166 FETCH_DATA (info
, codep
+ 3);
9167 rex
= ~(*codep
>> 5) & 0x7;
9168 switch ((*codep
& 0x1f))
9174 vex_table_index
= VEX_0F
;
9177 vex_table_index
= VEX_0F38
;
9180 vex_table_index
= VEX_0F3A
;
9184 vex
.w
= *codep
& 0x80;
9185 if (address_mode
== mode_64bit
)
9192 /* For the 3-byte VEX prefix in 32-bit mode, the REX_B bit
9193 is ignored, other REX bits are 0 and the highest bit in
9194 VEX.vvvv is also ignored (but we mustn't clear it here). */
9197 vex
.register_specifier
= (~(*codep
>> 3)) & 0xf;
9198 vex
.length
= (*codep
& 0x4) ? 256 : 128;
9199 switch ((*codep
& 0x3))
9204 vex
.prefix
= DATA_PREFIX_OPCODE
;
9207 vex
.prefix
= REPE_PREFIX_OPCODE
;
9210 vex
.prefix
= REPNE_PREFIX_OPCODE
;
9216 dp
= &vex_table
[vex_table_index
][vindex
];
9218 /* There is no MODRM byte for VEX0F 77. */
9219 if (vex_table_index
!= VEX_0F
|| vindex
!= 0x77)
9221 FETCH_DATA (info
, codep
+ 1);
9222 modrm
.mod
= (*codep
>> 6) & 3;
9223 modrm
.reg
= (*codep
>> 3) & 7;
9224 modrm
.rm
= *codep
& 7;
9228 case USE_VEX_C5_TABLE
:
9230 FETCH_DATA (info
, codep
+ 2);
9231 rex
= (*codep
& 0x80) ? 0 : REX_R
;
9233 /* For the 2-byte VEX prefix in 32-bit mode, the highest bit in
9235 vex
.register_specifier
= (~(*codep
>> 3)) & 0xf;
9236 vex
.length
= (*codep
& 0x4) ? 256 : 128;
9237 switch ((*codep
& 0x3))
9242 vex
.prefix
= DATA_PREFIX_OPCODE
;
9245 vex
.prefix
= REPE_PREFIX_OPCODE
;
9248 vex
.prefix
= REPNE_PREFIX_OPCODE
;
9254 dp
= &vex_table
[dp
->op
[1].bytemode
][vindex
];
9256 /* There is no MODRM byte for VEX 77. */
9259 FETCH_DATA (info
, codep
+ 1);
9260 modrm
.mod
= (*codep
>> 6) & 3;
9261 modrm
.reg
= (*codep
>> 3) & 7;
9262 modrm
.rm
= *codep
& 7;
9266 case USE_VEX_W_TABLE
:
9270 dp
= &vex_w_table
[dp
->op
[1].bytemode
][vex
.w
? 1 : 0];
9273 case USE_EVEX_TABLE
:
9277 FETCH_DATA (info
, codep
+ 4);
9278 /* The first byte after 0x62. */
9279 rex
= ~(*codep
>> 5) & 0x7;
9280 vex
.r
= *codep
& 0x10;
9281 switch ((*codep
& 0xf))
9286 vex_table_index
= EVEX_0F
;
9289 vex_table_index
= EVEX_0F38
;
9292 vex_table_index
= EVEX_0F3A
;
9296 /* The second byte after 0x62. */
9298 vex
.w
= *codep
& 0x80;
9299 if (vex
.w
&& address_mode
== mode_64bit
)
9302 vex
.register_specifier
= (~(*codep
>> 3)) & 0xf;
9305 if (!(*codep
& 0x4))
9308 switch ((*codep
& 0x3))
9313 vex
.prefix
= DATA_PREFIX_OPCODE
;
9316 vex
.prefix
= REPE_PREFIX_OPCODE
;
9319 vex
.prefix
= REPNE_PREFIX_OPCODE
;
9323 /* The third byte after 0x62. */
9326 /* Remember the static rounding bits. */
9327 vex
.ll
= (*codep
>> 5) & 3;
9328 vex
.b
= (*codep
& 0x10) != 0;
9330 vex
.v
= *codep
& 0x8;
9331 vex
.mask_register_specifier
= *codep
& 0x7;
9332 vex
.zeroing
= *codep
& 0x80;
9334 if (address_mode
!= mode_64bit
)
9336 /* In 16/32-bit mode silently ignore following bits. */
9345 dp
= &evex_table
[vex_table_index
][vindex
];
9347 FETCH_DATA (info
, codep
+ 1);
9348 modrm
.mod
= (*codep
>> 6) & 3;
9349 modrm
.reg
= (*codep
>> 3) & 7;
9350 modrm
.rm
= *codep
& 7;
9352 /* Set vector length. */
9353 if (modrm
.mod
== 3 && vex
.b
)
9382 if (dp
->name
!= NULL
)
9385 return get_valid_dis386 (dp
, info
);
9389 get_sib (disassemble_info
*info
, int sizeflag
)
9391 /* If modrm.mod == 3, operand must be register. */
9393 && ((sizeflag
& AFLAG
) || address_mode
== mode_64bit
)
9397 FETCH_DATA (info
, codep
+ 2);
9398 sib
.index
= (codep
[1] >> 3) & 7;
9399 sib
.scale
= (codep
[1] >> 6) & 3;
9400 sib
.base
= codep
[1] & 7;
9405 print_insn (bfd_vma pc
, disassemble_info
*info
)
9407 const struct dis386
*dp
;
9409 char *op_txt
[MAX_OPERANDS
];
9411 int sizeflag
, orig_sizeflag
;
9413 struct dis_private priv
;
9416 priv
.orig_sizeflag
= AFLAG
| DFLAG
;
9417 if ((info
->mach
& bfd_mach_i386_i386
) != 0)
9418 address_mode
= mode_32bit
;
9419 else if (info
->mach
== bfd_mach_i386_i8086
)
9421 address_mode
= mode_16bit
;
9422 priv
.orig_sizeflag
= 0;
9425 address_mode
= mode_64bit
;
9427 if (intel_syntax
== (char) -1)
9428 intel_syntax
= (info
->mach
& bfd_mach_i386_intel_syntax
) != 0;
9430 for (p
= info
->disassembler_options
; p
!= NULL
; )
9432 if (CONST_STRNEQ (p
, "amd64"))
9434 else if (CONST_STRNEQ (p
, "intel64"))
9436 else if (CONST_STRNEQ (p
, "x86-64"))
9438 address_mode
= mode_64bit
;
9439 priv
.orig_sizeflag
|= AFLAG
| DFLAG
;
9441 else if (CONST_STRNEQ (p
, "i386"))
9443 address_mode
= mode_32bit
;
9444 priv
.orig_sizeflag
|= AFLAG
| DFLAG
;
9446 else if (CONST_STRNEQ (p
, "i8086"))
9448 address_mode
= mode_16bit
;
9449 priv
.orig_sizeflag
&= ~(AFLAG
| DFLAG
);
9451 else if (CONST_STRNEQ (p
, "intel"))
9454 if (CONST_STRNEQ (p
+ 5, "-mnemonic"))
9457 else if (CONST_STRNEQ (p
, "att"))
9460 if (CONST_STRNEQ (p
+ 3, "-mnemonic"))
9463 else if (CONST_STRNEQ (p
, "addr"))
9465 if (address_mode
== mode_64bit
)
9467 if (p
[4] == '3' && p
[5] == '2')
9468 priv
.orig_sizeflag
&= ~AFLAG
;
9469 else if (p
[4] == '6' && p
[5] == '4')
9470 priv
.orig_sizeflag
|= AFLAG
;
9474 if (p
[4] == '1' && p
[5] == '6')
9475 priv
.orig_sizeflag
&= ~AFLAG
;
9476 else if (p
[4] == '3' && p
[5] == '2')
9477 priv
.orig_sizeflag
|= AFLAG
;
9480 else if (CONST_STRNEQ (p
, "data"))
9482 if (p
[4] == '1' && p
[5] == '6')
9483 priv
.orig_sizeflag
&= ~DFLAG
;
9484 else if (p
[4] == '3' && p
[5] == '2')
9485 priv
.orig_sizeflag
|= DFLAG
;
9487 else if (CONST_STRNEQ (p
, "suffix"))
9488 priv
.orig_sizeflag
|= SUFFIX_ALWAYS
;
9490 p
= strchr (p
, ',');
9495 if (address_mode
== mode_64bit
&& sizeof (bfd_vma
) < 8)
9497 (*info
->fprintf_func
) (info
->stream
,
9498 _("64-bit address is disabled"));
9504 names64
= intel_names64
;
9505 names32
= intel_names32
;
9506 names16
= intel_names16
;
9507 names8
= intel_names8
;
9508 names8rex
= intel_names8rex
;
9509 names_seg
= intel_names_seg
;
9510 names_mm
= intel_names_mm
;
9511 names_bnd
= intel_names_bnd
;
9512 names_xmm
= intel_names_xmm
;
9513 names_ymm
= intel_names_ymm
;
9514 names_zmm
= intel_names_zmm
;
9515 names_tmm
= intel_names_tmm
;
9516 index64
= intel_index64
;
9517 index32
= intel_index32
;
9518 names_mask
= intel_names_mask
;
9519 index16
= intel_index16
;
9522 separator_char
= '+';
9527 names64
= att_names64
;
9528 names32
= att_names32
;
9529 names16
= att_names16
;
9530 names8
= att_names8
;
9531 names8rex
= att_names8rex
;
9532 names_seg
= att_names_seg
;
9533 names_mm
= att_names_mm
;
9534 names_bnd
= att_names_bnd
;
9535 names_xmm
= att_names_xmm
;
9536 names_ymm
= att_names_ymm
;
9537 names_zmm
= att_names_zmm
;
9538 names_tmm
= att_names_tmm
;
9539 index64
= att_index64
;
9540 index32
= att_index32
;
9541 names_mask
= att_names_mask
;
9542 index16
= att_index16
;
9545 separator_char
= ',';
9549 /* The output looks better if we put 7 bytes on a line, since that
9550 puts most long word instructions on a single line. Use 8 bytes
9552 if ((info
->mach
& bfd_mach_l1om
) != 0)
9553 info
->bytes_per_line
= 8;
9555 info
->bytes_per_line
= 7;
9557 info
->private_data
= &priv
;
9558 priv
.max_fetched
= priv
.the_buffer
;
9559 priv
.insn_start
= pc
;
9562 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
9570 start_codep
= priv
.the_buffer
;
9571 codep
= priv
.the_buffer
;
9573 if (OPCODES_SIGSETJMP (priv
.bailout
) != 0)
9577 /* Getting here means we tried for data but didn't get it. That
9578 means we have an incomplete instruction of some sort. Just
9579 print the first byte as a prefix or a .byte pseudo-op. */
9580 if (codep
> priv
.the_buffer
)
9582 name
= prefix_name (priv
.the_buffer
[0], priv
.orig_sizeflag
);
9584 (*info
->fprintf_func
) (info
->stream
, "%s", name
);
9587 /* Just print the first byte as a .byte instruction. */
9588 (*info
->fprintf_func
) (info
->stream
, ".byte 0x%x",
9589 (unsigned int) priv
.the_buffer
[0]);
9599 sizeflag
= priv
.orig_sizeflag
;
9601 if (!ckprefix () || rex_used
)
9603 /* Too many prefixes or unused REX prefixes. */
9605 i
< (int) ARRAY_SIZE (all_prefixes
) && all_prefixes
[i
];
9607 (*info
->fprintf_func
) (info
->stream
, "%s%s",
9609 prefix_name (all_prefixes
[i
], sizeflag
));
9615 FETCH_DATA (info
, codep
+ 1);
9616 two_source_ops
= (*codep
== 0x62) || (*codep
== 0xc8);
9618 if (((prefixes
& PREFIX_FWAIT
)
9619 && ((*codep
< 0xd8) || (*codep
> 0xdf))))
9621 /* Handle prefixes before fwait. */
9622 for (i
= 0; i
< fwait_prefix
&& all_prefixes
[i
];
9624 (*info
->fprintf_func
) (info
->stream
, "%s ",
9625 prefix_name (all_prefixes
[i
], sizeflag
));
9626 (*info
->fprintf_func
) (info
->stream
, "fwait");
9632 unsigned char threebyte
;
9635 FETCH_DATA (info
, codep
+ 1);
9637 dp
= &dis386_twobyte
[threebyte
];
9638 need_modrm
= twobyte_has_modrm
[threebyte
];
9643 dp
= &dis386
[*codep
];
9644 need_modrm
= onebyte_has_modrm
[*codep
];
9648 /* Save sizeflag for printing the extra prefixes later before updating
9649 it for mnemonic and operand processing. The prefix names depend
9650 only on the address mode. */
9651 orig_sizeflag
= sizeflag
;
9652 if (prefixes
& PREFIX_ADDR
)
9654 if ((prefixes
& PREFIX_DATA
))
9660 FETCH_DATA (info
, codep
+ 1);
9661 modrm
.mod
= (*codep
>> 6) & 3;
9662 modrm
.reg
= (*codep
>> 3) & 7;
9663 modrm
.rm
= *codep
& 7;
9666 memset (&modrm
, 0, sizeof (modrm
));
9669 memset (&vex
, 0, sizeof (vex
));
9671 if (dp
->name
== NULL
&& dp
->op
[0].bytemode
== FLOATCODE
)
9673 get_sib (info
, sizeflag
);
9678 dp
= get_valid_dis386 (dp
, info
);
9679 if (dp
!= NULL
&& putop (dp
->name
, sizeflag
) == 0)
9681 get_sib (info
, sizeflag
);
9682 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
9685 op_ad
= MAX_OPERANDS
- 1 - i
;
9687 (*dp
->op
[i
].rtn
) (dp
->op
[i
].bytemode
, sizeflag
);
9688 /* For EVEX instruction after the last operand masking
9689 should be printed. */
9690 if (i
== 0 && vex
.evex
)
9692 /* Don't print {%k0}. */
9693 if (vex
.mask_register_specifier
)
9696 oappend (names_mask
[vex
.mask_register_specifier
]);
9706 /* Clear instruction information. */
9709 the_info
->insn_info_valid
= 0;
9710 the_info
->branch_delay_insns
= 0;
9711 the_info
->data_size
= 0;
9712 the_info
->insn_type
= dis_noninsn
;
9713 the_info
->target
= 0;
9714 the_info
->target2
= 0;
9717 /* Reset jump operation indicator. */
9721 int jump_detection
= 0;
9723 /* Extract flags. */
9724 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
9726 if ((dp
->op
[i
].rtn
== OP_J
)
9727 || (dp
->op
[i
].rtn
== OP_indirE
))
9728 jump_detection
|= 1;
9729 else if ((dp
->op
[i
].rtn
== BND_Fixup
)
9730 || (!dp
->op
[i
].rtn
&& !dp
->op
[i
].bytemode
))
9731 jump_detection
|= 2;
9732 else if ((dp
->op
[i
].bytemode
== cond_jump_mode
)
9733 || (dp
->op
[i
].bytemode
== loop_jcxz_mode
))
9734 jump_detection
|= 4;
9737 /* Determine if this is a jump or branch. */
9738 if ((jump_detection
& 0x3) == 0x3)
9741 if (jump_detection
& 0x4)
9742 the_info
->insn_type
= dis_condbranch
;
9744 the_info
->insn_type
=
9745 (dp
->name
&& !strncmp(dp
->name
, "call", 4))
9746 ? dis_jsr
: dis_branch
;
9750 /* If VEX.vvvv and EVEX.vvvv are unused, they must be all 1s, which
9751 are all 0s in inverted form. */
9752 if (need_vex
&& vex
.register_specifier
!= 0)
9754 (*info
->fprintf_func
) (info
->stream
, "(bad)");
9755 return end_codep
- priv
.the_buffer
;
9758 switch (dp
->prefix_requirement
)
9761 /* If only the data prefix is marked as mandatory, its absence renders
9762 the encoding invalid. Most other PREFIX_OPCODE rules still apply. */
9763 if (need_vex
? !vex
.prefix
: !(prefixes
& PREFIX_DATA
))
9765 (*info
->fprintf_func
) (info
->stream
, "(bad)");
9766 return end_codep
- priv
.the_buffer
;
9768 used_prefixes
|= PREFIX_DATA
;
9771 /* If the mandatory PREFIX_REPZ/PREFIX_REPNZ/PREFIX_DATA prefix is
9772 unused, opcode is invalid. Since the PREFIX_DATA prefix may be
9773 used by putop and MMX/SSE operand and may be overridden by the
9774 PREFIX_REPZ/PREFIX_REPNZ fix, we check the PREFIX_DATA prefix
9777 ? vex
.prefix
== REPE_PREFIX_OPCODE
9778 || vex
.prefix
== REPNE_PREFIX_OPCODE
9780 & (PREFIX_REPZ
| PREFIX_REPNZ
)) != 0)
9782 & (PREFIX_REPZ
| PREFIX_REPNZ
)) == 0)
9784 ? vex
.prefix
== DATA_PREFIX_OPCODE
9786 & (PREFIX_REPZ
| PREFIX_REPNZ
| PREFIX_DATA
))
9788 && (used_prefixes
& PREFIX_DATA
) == 0))
9789 || (vex
.evex
&& dp
->prefix_requirement
!= PREFIX_DATA
9790 && !vex
.w
!= !(used_prefixes
& PREFIX_DATA
)))
9792 (*info
->fprintf_func
) (info
->stream
, "(bad)");
9793 return end_codep
- priv
.the_buffer
;
9797 case PREFIX_IGNORED
:
9798 /* Zap data size and rep prefixes from used_prefixes and reinstate their
9799 origins in all_prefixes. */
9800 used_prefixes
&= ~PREFIX_OPCODE
;
9801 if (last_data_prefix
>= 0)
9802 all_prefixes
[last_repz_prefix
] = 0x66;
9803 if (last_repz_prefix
>= 0)
9804 all_prefixes
[last_repz_prefix
] = 0xf3;
9805 if (last_repnz_prefix
>= 0)
9806 all_prefixes
[last_repnz_prefix
] = 0xf2;
9810 /* Check if the REX prefix is used. */
9811 if ((rex
^ rex_used
) == 0 && !need_vex
&& last_rex_prefix
>= 0)
9812 all_prefixes
[last_rex_prefix
] = 0;
9814 /* Check if the SEG prefix is used. */
9815 if ((prefixes
& (PREFIX_CS
| PREFIX_SS
| PREFIX_DS
| PREFIX_ES
9816 | PREFIX_FS
| PREFIX_GS
)) != 0
9817 && (used_prefixes
& active_seg_prefix
) != 0)
9818 all_prefixes
[last_seg_prefix
] = 0;
9820 /* Check if the ADDR prefix is used. */
9821 if ((prefixes
& PREFIX_ADDR
) != 0
9822 && (used_prefixes
& PREFIX_ADDR
) != 0)
9823 all_prefixes
[last_addr_prefix
] = 0;
9825 /* Check if the DATA prefix is used. */
9826 if ((prefixes
& PREFIX_DATA
) != 0
9827 && (used_prefixes
& PREFIX_DATA
) != 0
9829 all_prefixes
[last_data_prefix
] = 0;
9831 /* Print the extra prefixes. */
9833 for (i
= 0; i
< (int) ARRAY_SIZE (all_prefixes
); i
++)
9834 if (all_prefixes
[i
])
9837 name
= prefix_name (all_prefixes
[i
], orig_sizeflag
);
9840 prefix_length
+= strlen (name
) + 1;
9841 (*info
->fprintf_func
) (info
->stream
, "%s ", name
);
9844 /* Check maximum code length. */
9845 if ((codep
- start_codep
) > MAX_CODE_LENGTH
)
9847 (*info
->fprintf_func
) (info
->stream
, "(bad)");
9848 return MAX_CODE_LENGTH
;
9851 obufp
= mnemonicendp
;
9852 for (i
= strlen (obuf
) + prefix_length
; i
< 6; i
++)
9855 (*info
->fprintf_func
) (info
->stream
, "%s", obuf
);
9857 /* The enter and bound instructions are printed with operands in the same
9858 order as the intel book; everything else is printed in reverse order. */
9859 if (intel_syntax
|| two_source_ops
)
9863 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
9864 op_txt
[i
] = op_out
[i
];
9866 if (intel_syntax
&& dp
&& dp
->op
[2].rtn
== OP_Rounding
9867 && dp
->op
[3].rtn
== OP_E
&& dp
->op
[4].rtn
== NULL
)
9869 op_txt
[2] = op_out
[3];
9870 op_txt
[3] = op_out
[2];
9873 for (i
= 0; i
< (MAX_OPERANDS
>> 1); ++i
)
9875 op_ad
= op_index
[i
];
9876 op_index
[i
] = op_index
[MAX_OPERANDS
- 1 - i
];
9877 op_index
[MAX_OPERANDS
- 1 - i
] = op_ad
;
9878 riprel
= op_riprel
[i
];
9879 op_riprel
[i
] = op_riprel
[MAX_OPERANDS
- 1 - i
];
9880 op_riprel
[MAX_OPERANDS
- 1 - i
] = riprel
;
9885 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
9886 op_txt
[MAX_OPERANDS
- 1 - i
] = op_out
[i
];
9890 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
9894 (*info
->fprintf_func
) (info
->stream
, ",");
9895 if (op_index
[i
] != -1 && !op_riprel
[i
])
9897 bfd_vma target
= (bfd_vma
) op_address
[op_index
[i
]];
9899 if (the_info
&& op_is_jump
)
9901 the_info
->insn_info_valid
= 1;
9902 the_info
->branch_delay_insns
= 0;
9903 the_info
->data_size
= 0;
9904 the_info
->target
= target
;
9905 the_info
->target2
= 0;
9907 (*info
->print_address_func
) (target
, info
);
9910 (*info
->fprintf_func
) (info
->stream
, "%s", op_txt
[i
]);
9914 for (i
= 0; i
< MAX_OPERANDS
; i
++)
9915 if (op_index
[i
] != -1 && op_riprel
[i
])
9917 (*info
->fprintf_func
) (info
->stream
, " # ");
9918 (*info
->print_address_func
) ((bfd_vma
) (start_pc
+ (codep
- start_codep
)
9919 + op_address
[op_index
[i
]]), info
);
9922 return codep
- priv
.the_buffer
;
9925 static const char *float_mem
[] = {
10000 static const unsigned char float_mem_mode
[] = {
10075 #define ST { OP_ST, 0 }
10076 #define STi { OP_STi, 0 }
10078 #define FGRPd9_2 NULL, { { NULL, 1 } }, 0
10079 #define FGRPd9_4 NULL, { { NULL, 2 } }, 0
10080 #define FGRPd9_5 NULL, { { NULL, 3 } }, 0
10081 #define FGRPd9_6 NULL, { { NULL, 4 } }, 0
10082 #define FGRPd9_7 NULL, { { NULL, 5 } }, 0
10083 #define FGRPda_5 NULL, { { NULL, 6 } }, 0
10084 #define FGRPdb_4 NULL, { { NULL, 7 } }, 0
10085 #define FGRPde_3 NULL, { { NULL, 8 } }, 0
10086 #define FGRPdf_4 NULL, { { NULL, 9 } }, 0
10088 static const struct dis386 float_reg
[][8] = {
10091 { "fadd", { ST
, STi
}, 0 },
10092 { "fmul", { ST
, STi
}, 0 },
10093 { "fcom", { STi
}, 0 },
10094 { "fcomp", { STi
}, 0 },
10095 { "fsub", { ST
, STi
}, 0 },
10096 { "fsubr", { ST
, STi
}, 0 },
10097 { "fdiv", { ST
, STi
}, 0 },
10098 { "fdivr", { ST
, STi
}, 0 },
10102 { "fld", { STi
}, 0 },
10103 { "fxch", { STi
}, 0 },
10113 { "fcmovb", { ST
, STi
}, 0 },
10114 { "fcmove", { ST
, STi
}, 0 },
10115 { "fcmovbe",{ ST
, STi
}, 0 },
10116 { "fcmovu", { ST
, STi
}, 0 },
10124 { "fcmovnb",{ ST
, STi
}, 0 },
10125 { "fcmovne",{ ST
, STi
}, 0 },
10126 { "fcmovnbe",{ ST
, STi
}, 0 },
10127 { "fcmovnu",{ ST
, STi
}, 0 },
10129 { "fucomi", { ST
, STi
}, 0 },
10130 { "fcomi", { ST
, STi
}, 0 },
10135 { "fadd", { STi
, ST
}, 0 },
10136 { "fmul", { STi
, ST
}, 0 },
10139 { "fsub{!M|r}", { STi
, ST
}, 0 },
10140 { "fsub{M|}", { STi
, ST
}, 0 },
10141 { "fdiv{!M|r}", { STi
, ST
}, 0 },
10142 { "fdiv{M|}", { STi
, ST
}, 0 },
10146 { "ffree", { STi
}, 0 },
10148 { "fst", { STi
}, 0 },
10149 { "fstp", { STi
}, 0 },
10150 { "fucom", { STi
}, 0 },
10151 { "fucomp", { STi
}, 0 },
10157 { "faddp", { STi
, ST
}, 0 },
10158 { "fmulp", { STi
, ST
}, 0 },
10161 { "fsub{!M|r}p", { STi
, ST
}, 0 },
10162 { "fsub{M|}p", { STi
, ST
}, 0 },
10163 { "fdiv{!M|r}p", { STi
, ST
}, 0 },
10164 { "fdiv{M|}p", { STi
, ST
}, 0 },
10168 { "ffreep", { STi
}, 0 },
10173 { "fucomip", { ST
, STi
}, 0 },
10174 { "fcomip", { ST
, STi
}, 0 },
10179 static char *fgrps
[][8] = {
10182 "(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10187 "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10192 "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
10197 "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
10202 "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
10207 "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
10212 "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10217 "fNeni(8087 only)","fNdisi(8087 only)","fNclex","fNinit",
10218 "fNsetpm(287 only)","frstpm(287 only)","(bad)","(bad)",
10223 "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10228 "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10233 swap_operand (void)
10235 mnemonicendp
[0] = '.';
10236 mnemonicendp
[1] = 's';
10241 OP_Skip_MODRM (int bytemode ATTRIBUTE_UNUSED
,
10242 int sizeflag ATTRIBUTE_UNUSED
)
10244 /* Skip mod/rm byte. */
10250 dofloat (int sizeflag
)
10252 const struct dis386
*dp
;
10253 unsigned char floatop
;
10255 floatop
= codep
[-1];
10257 if (modrm
.mod
!= 3)
10259 int fp_indx
= (floatop
- 0xd8) * 8 + modrm
.reg
;
10261 putop (float_mem
[fp_indx
], sizeflag
);
10264 OP_E (float_mem_mode
[fp_indx
], sizeflag
);
10267 /* Skip mod/rm byte. */
10271 dp
= &float_reg
[floatop
- 0xd8][modrm
.reg
];
10272 if (dp
->name
== NULL
)
10274 putop (fgrps
[dp
->op
[0].bytemode
][modrm
.rm
], sizeflag
);
10276 /* Instruction fnstsw is only one with strange arg. */
10277 if (floatop
== 0xdf && codep
[-1] == 0xe0)
10278 strcpy (op_out
[0], names16
[0]);
10282 putop (dp
->name
, sizeflag
);
10287 (*dp
->op
[0].rtn
) (dp
->op
[0].bytemode
, sizeflag
);
10292 (*dp
->op
[1].rtn
) (dp
->op
[1].bytemode
, sizeflag
);
10296 /* Like oappend (below), but S is a string starting with '%'.
10297 In Intel syntax, the '%' is elided. */
10299 oappend_maybe_intel (const char *s
)
10301 oappend (s
+ intel_syntax
);
10305 OP_ST (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
10307 oappend_maybe_intel ("%st");
10311 OP_STi (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
10313 sprintf (scratchbuf
, "%%st(%d)", modrm
.rm
);
10314 oappend_maybe_intel (scratchbuf
);
10317 /* Capital letters in template are macros. */
10319 putop (const char *in_template
, int sizeflag
)
10324 unsigned int l
= 0, len
= 0;
10327 for (p
= in_template
; *p
; p
++)
10331 if (l
>= sizeof (last
) || !ISUPPER (*p
))
10350 while (*++p
!= '|')
10351 if (*p
== '}' || *p
== '\0')
10357 while (*++p
!= '}')
10369 if ((need_modrm
&& modrm
.mod
!= 3)
10370 || (sizeflag
& SUFFIX_ALWAYS
))
10379 if (sizeflag
& SUFFIX_ALWAYS
)
10382 else if (l
== 1 && last
[0] == 'L')
10384 if (address_mode
== mode_64bit
10385 && !(prefixes
& PREFIX_ADDR
))
10398 if (intel_syntax
&& !alt
)
10400 if ((prefixes
& PREFIX_DATA
) || (sizeflag
& SUFFIX_ALWAYS
))
10402 if (sizeflag
& DFLAG
)
10403 *obufp
++ = intel_syntax
? 'd' : 'l';
10405 *obufp
++ = intel_syntax
? 'w' : 's';
10406 used_prefixes
|= (prefixes
& PREFIX_DATA
);
10410 if (intel_syntax
|| !(sizeflag
& SUFFIX_ALWAYS
))
10413 if (modrm
.mod
== 3)
10419 if (sizeflag
& DFLAG
)
10420 *obufp
++ = intel_syntax
? 'd' : 'l';
10423 used_prefixes
|= (prefixes
& PREFIX_DATA
);
10429 case 'E': /* For jcxz/jecxz */
10430 if (address_mode
== mode_64bit
)
10432 if (sizeflag
& AFLAG
)
10438 if (sizeflag
& AFLAG
)
10440 used_prefixes
|= (prefixes
& PREFIX_ADDR
);
10445 if ((prefixes
& PREFIX_ADDR
) || (sizeflag
& SUFFIX_ALWAYS
))
10447 if (sizeflag
& AFLAG
)
10448 *obufp
++ = address_mode
== mode_64bit
? 'q' : 'l';
10450 *obufp
++ = address_mode
== mode_64bit
? 'l' : 'w';
10451 used_prefixes
|= (prefixes
& PREFIX_ADDR
);
10455 if (intel_syntax
|| (obufp
[-1] != 's' && !(sizeflag
& SUFFIX_ALWAYS
)))
10457 if ((rex
& REX_W
) || (sizeflag
& DFLAG
))
10461 if (!(rex
& REX_W
))
10462 used_prefixes
|= (prefixes
& PREFIX_DATA
);
10467 if ((prefixes
& (PREFIX_CS
| PREFIX_DS
)) == PREFIX_CS
10468 || (prefixes
& (PREFIX_CS
| PREFIX_DS
)) == PREFIX_DS
)
10470 used_prefixes
|= prefixes
& (PREFIX_CS
| PREFIX_DS
);
10474 /* Set active_seg_prefix even if not set in 64-bit mode
10475 because here it is a valid branch hint. */
10476 if (prefixes
& PREFIX_DS
)
10478 active_seg_prefix
= PREFIX_DS
;
10483 active_seg_prefix
= PREFIX_CS
;
10498 if (intel_mnemonic
!= cond
)
10502 if ((prefixes
& PREFIX_FWAIT
) == 0)
10505 used_prefixes
|= PREFIX_FWAIT
;
10511 else if (intel_syntax
&& (sizeflag
& DFLAG
))
10515 if (!(rex
& REX_W
))
10516 used_prefixes
|= (prefixes
& PREFIX_DATA
);
10519 if (address_mode
== mode_64bit
10520 && (isa64
== intel64
|| (rex
& REX_W
)
10521 || !(prefixes
& PREFIX_DATA
)))
10523 if (sizeflag
& SUFFIX_ALWAYS
)
10527 /* Fall through. */
10531 if ((modrm
.mod
== 3 || !cond
)
10532 && !(sizeflag
& SUFFIX_ALWAYS
))
10534 /* Fall through. */
10536 if ((!(rex
& REX_W
) && (prefixes
& PREFIX_DATA
))
10537 || ((sizeflag
& SUFFIX_ALWAYS
)
10538 && address_mode
!= mode_64bit
))
10540 *obufp
++ = (sizeflag
& DFLAG
) ?
10541 intel_syntax
? 'd' : 'l' : 'w';
10542 used_prefixes
|= (prefixes
& PREFIX_DATA
);
10544 else if (sizeflag
& SUFFIX_ALWAYS
)
10547 else if (l
== 1 && last
[0] == 'L')
10549 if ((prefixes
& PREFIX_DATA
)
10551 || (sizeflag
& SUFFIX_ALWAYS
))
10558 if (sizeflag
& DFLAG
)
10559 *obufp
++ = intel_syntax
? 'd' : 'l';
10562 used_prefixes
|= (prefixes
& PREFIX_DATA
);
10572 if (intel_syntax
&& !alt
)
10575 if ((need_modrm
&& modrm
.mod
!= 3)
10576 || (sizeflag
& SUFFIX_ALWAYS
))
10582 if (sizeflag
& DFLAG
)
10583 *obufp
++ = intel_syntax
? 'd' : 'l';
10586 used_prefixes
|= (prefixes
& PREFIX_DATA
);
10590 else if (l
== 1 && last
[0] == 'D')
10591 *obufp
++ = vex
.w
? 'q' : 'd';
10592 else if (l
== 1 && last
[0] == 'L')
10594 if (cond
? modrm
.mod
== 3 && !(sizeflag
& SUFFIX_ALWAYS
)
10595 : address_mode
!= mode_64bit
)
10602 else if((address_mode
== mode_64bit
&& cond
)
10603 || (sizeflag
& SUFFIX_ALWAYS
))
10604 *obufp
++ = intel_syntax
? 'd' : 'l';
10613 else if (sizeflag
& DFLAG
)
10622 if (intel_syntax
&& !p
[1]
10623 && ((rex
& REX_W
) || (sizeflag
& DFLAG
)))
10625 if (!(rex
& REX_W
))
10626 used_prefixes
|= (prefixes
& PREFIX_DATA
);
10634 if (sizeflag
& SUFFIX_ALWAYS
)
10640 if (sizeflag
& DFLAG
)
10644 used_prefixes
|= (prefixes
& PREFIX_DATA
);
10648 else if (l
== 1 && last
[0] == 'L')
10650 if (address_mode
== mode_64bit
10651 && !(prefixes
& PREFIX_ADDR
))
10667 && (last
[0] == 'L' || last
[0] == 'X'))
10669 if (last
[0] == 'X')
10677 else if (rex
& REX_W
)
10690 /* operand size flag for cwtl, cbtw */
10699 else if (sizeflag
& DFLAG
)
10703 if (!(rex
& REX_W
))
10704 used_prefixes
|= (prefixes
& PREFIX_DATA
);
10710 if (last
[0] == 'X')
10711 *obufp
++ = vex
.w
? 'd': 's';
10712 else if (last
[0] == 'B')
10713 *obufp
++ = vex
.w
? 'w': 'b';
10724 ? vex
.prefix
== DATA_PREFIX_OPCODE
10725 : prefixes
& PREFIX_DATA
)
10728 used_prefixes
|= PREFIX_DATA
;
10734 if (l
== 1 && last
[0] == 'X')
10739 || ((modrm
.mod
== 3 || vex
.b
) && !(sizeflag
& SUFFIX_ALWAYS
)))
10741 switch (vex
.length
)
10761 /* These insns ignore ModR/M.mod: Force it to 3 for OP_E(). */
10763 if (!intel_syntax
&& (sizeflag
& SUFFIX_ALWAYS
))
10764 *obufp
++ = address_mode
== mode_64bit
? 'q' : 'l';
10766 else if (l
== 1 && last
[0] == 'X')
10768 if (!need_vex
|| !vex
.evex
)
10771 || ((modrm
.mod
== 3 || vex
.b
) && !(sizeflag
& SUFFIX_ALWAYS
)))
10773 switch (vex
.length
)
10794 if (isa64
== intel64
&& (rex
& REX_W
))
10800 if ((prefixes
& PREFIX_DATA
) || (sizeflag
& SUFFIX_ALWAYS
))
10802 if (sizeflag
& DFLAG
)
10806 used_prefixes
|= (prefixes
& PREFIX_DATA
);
10815 mnemonicendp
= obufp
;
10820 oappend (const char *s
)
10822 obufp
= stpcpy (obufp
, s
);
10828 /* Only print the active segment register. */
10829 if (!active_seg_prefix
)
10832 used_prefixes
|= active_seg_prefix
;
10833 switch (active_seg_prefix
)
10836 oappend_maybe_intel ("%cs:");
10839 oappend_maybe_intel ("%ds:");
10842 oappend_maybe_intel ("%ss:");
10845 oappend_maybe_intel ("%es:");
10848 oappend_maybe_intel ("%fs:");
10851 oappend_maybe_intel ("%gs:");
10859 OP_indirE (int bytemode
, int sizeflag
)
10863 OP_E (bytemode
, sizeflag
);
10867 print_operand_value (char *buf
, int hex
, bfd_vma disp
)
10869 if (address_mode
== mode_64bit
)
10877 sprintf_vma (tmp
, disp
);
10878 for (i
= 0; tmp
[i
] == '0' && tmp
[i
+ 1]; i
++);
10879 strcpy (buf
+ 2, tmp
+ i
);
10883 bfd_signed_vma v
= disp
;
10890 /* Check for possible overflow on 0x8000000000000000. */
10893 strcpy (buf
, "9223372036854775808");
10907 tmp
[28 - i
] = (v
% 10) + '0';
10911 strcpy (buf
, tmp
+ 29 - i
);
10917 sprintf (buf
, "0x%x", (unsigned int) disp
);
10919 sprintf (buf
, "%d", (int) disp
);
10923 /* Put DISP in BUF as signed hex number. */
10926 print_displacement (char *buf
, bfd_vma disp
)
10928 bfd_signed_vma val
= disp
;
10937 /* Check for possible overflow. */
10940 switch (address_mode
)
10943 strcpy (buf
+ j
, "0x8000000000000000");
10946 strcpy (buf
+ j
, "0x80000000");
10949 strcpy (buf
+ j
, "0x8000");
10959 sprintf_vma (tmp
, (bfd_vma
) val
);
10960 for (i
= 0; tmp
[i
] == '0'; i
++)
10962 if (tmp
[i
] == '\0')
10964 strcpy (buf
+ j
, tmp
+ i
);
10968 intel_operand_size (int bytemode
, int sizeflag
)
10972 && (bytemode
== x_mode
10973 || bytemode
== evex_half_bcst_xmmq_mode
))
10976 oappend ("QWORD PTR ");
10978 oappend ("DWORD PTR ");
10987 oappend ("BYTE PTR ");
10992 oappend ("WORD PTR ");
10995 if (address_mode
== mode_64bit
&& isa64
== intel64
)
10997 oappend ("QWORD PTR ");
11000 /* Fall through. */
11002 if (address_mode
== mode_64bit
&& ((sizeflag
& DFLAG
) || (rex
& REX_W
)))
11004 oappend ("QWORD PTR ");
11007 /* Fall through. */
11013 oappend ("QWORD PTR ");
11014 else if (bytemode
== dq_mode
)
11015 oappend ("DWORD PTR ");
11018 if (sizeflag
& DFLAG
)
11019 oappend ("DWORD PTR ");
11021 oappend ("WORD PTR ");
11022 used_prefixes
|= (prefixes
& PREFIX_DATA
);
11026 if ((rex
& REX_W
) || (sizeflag
& DFLAG
))
11028 oappend ("WORD PTR ");
11029 if (!(rex
& REX_W
))
11030 used_prefixes
|= (prefixes
& PREFIX_DATA
);
11033 if (sizeflag
& DFLAG
)
11034 oappend ("QWORD PTR ");
11036 oappend ("DWORD PTR ");
11037 used_prefixes
|= (prefixes
& PREFIX_DATA
);
11040 if (!(sizeflag
& DFLAG
) && isa64
== intel64
)
11041 oappend ("WORD PTR ");
11043 oappend ("DWORD PTR ");
11044 used_prefixes
|= (prefixes
& PREFIX_DATA
);
11049 oappend ("DWORD PTR ");
11053 oappend ("QWORD PTR ");
11056 if (address_mode
== mode_64bit
)
11057 oappend ("QWORD PTR ");
11059 oappend ("DWORD PTR ");
11062 if (sizeflag
& DFLAG
)
11063 oappend ("FWORD PTR ");
11065 oappend ("DWORD PTR ");
11066 used_prefixes
|= (prefixes
& PREFIX_DATA
);
11069 oappend ("TBYTE PTR ");
11073 case evex_x_gscat_mode
:
11074 case evex_x_nobcst_mode
:
11078 switch (vex
.length
)
11081 oappend ("XMMWORD PTR ");
11084 oappend ("YMMWORD PTR ");
11087 oappend ("ZMMWORD PTR ");
11094 oappend ("XMMWORD PTR ");
11097 oappend ("XMMWORD PTR ");
11100 oappend ("YMMWORD PTR ");
11103 case evex_half_bcst_xmmq_mode
:
11107 switch (vex
.length
)
11110 oappend ("QWORD PTR ");
11113 oappend ("XMMWORD PTR ");
11116 oappend ("YMMWORD PTR ");
11126 switch (vex
.length
)
11131 oappend ("BYTE PTR ");
11141 switch (vex
.length
)
11146 oappend ("WORD PTR ");
11156 switch (vex
.length
)
11161 oappend ("DWORD PTR ");
11171 switch (vex
.length
)
11176 oappend ("QWORD PTR ");
11186 switch (vex
.length
)
11189 oappend ("WORD PTR ");
11192 oappend ("DWORD PTR ");
11195 oappend ("QWORD PTR ");
11205 switch (vex
.length
)
11208 oappend ("DWORD PTR ");
11211 oappend ("QWORD PTR ");
11214 oappend ("XMMWORD PTR ");
11224 switch (vex
.length
)
11227 oappend ("QWORD PTR ");
11230 oappend ("YMMWORD PTR ");
11233 oappend ("ZMMWORD PTR ");
11243 switch (vex
.length
)
11247 oappend ("XMMWORD PTR ");
11254 oappend ("OWORD PTR ");
11256 case vex_scalar_w_dq_mode
:
11261 oappend ("QWORD PTR ");
11263 oappend ("DWORD PTR ");
11265 case vex_vsib_d_w_dq_mode
:
11266 case vex_vsib_q_w_dq_mode
:
11273 oappend ("QWORD PTR ");
11275 oappend ("DWORD PTR ");
11279 switch (vex
.length
)
11282 oappend ("XMMWORD PTR ");
11285 oappend ("YMMWORD PTR ");
11288 oappend ("ZMMWORD PTR ");
11295 case vex_vsib_q_w_d_mode
:
11296 case vex_vsib_d_w_d_mode
:
11297 if (!need_vex
|| !vex
.evex
)
11300 switch (vex
.length
)
11303 oappend ("QWORD PTR ");
11306 oappend ("XMMWORD PTR ");
11309 oappend ("YMMWORD PTR ");
11317 if (!need_vex
|| vex
.length
!= 128)
11320 oappend ("DWORD PTR ");
11322 oappend ("BYTE PTR ");
11328 oappend ("QWORD PTR ");
11330 oappend ("WORD PTR ");
11340 OP_E_register (int bytemode
, int sizeflag
)
11342 int reg
= modrm
.rm
;
11343 const char **names
;
11349 if ((sizeflag
& SUFFIX_ALWAYS
)
11350 && (bytemode
== b_swap_mode
11351 || bytemode
== bnd_swap_mode
11352 || bytemode
== v_swap_mode
))
11379 names
= address_mode
== mode_64bit
? names64
: names32
;
11382 case bnd_swap_mode
:
11391 if (address_mode
== mode_64bit
&& isa64
== intel64
)
11396 /* Fall through. */
11398 if (address_mode
== mode_64bit
&& ((sizeflag
& DFLAG
) || (rex
& REX_W
)))
11404 /* Fall through. */
11414 else if (bytemode
!= v_mode
&& bytemode
!= v_swap_mode
)
11418 if (sizeflag
& DFLAG
)
11422 used_prefixes
|= (prefixes
& PREFIX_DATA
);
11426 if (!(sizeflag
& DFLAG
) && isa64
== intel64
)
11430 used_prefixes
|= (prefixes
& PREFIX_DATA
);
11433 names
= (address_mode
== mode_64bit
11434 ? names64
: names32
);
11435 if (!(prefixes
& PREFIX_ADDR
))
11436 names
= (address_mode
== mode_16bit
11437 ? names16
: names
);
11440 /* Remove "addr16/addr32". */
11441 all_prefixes
[last_addr_prefix
] = 0;
11442 names
= (address_mode
!= mode_32bit
11443 ? names32
: names16
);
11444 used_prefixes
|= PREFIX_ADDR
;
11454 names
= names_mask
;
11459 oappend (INTERNAL_DISASSEMBLER_ERROR
);
11462 oappend (names
[reg
]);
11466 OP_E_memory (int bytemode
, int sizeflag
)
11469 int add
= (rex
& REX_B
) ? 8 : 0;
11475 /* In EVEX, if operand doesn't allow broadcast, vex.b should be 0. */
11477 && bytemode
!= x_mode
11478 && bytemode
!= xmmq_mode
11479 && bytemode
!= evex_half_bcst_xmmq_mode
)
11497 if (address_mode
!= mode_64bit
)
11507 case vex_scalar_w_dq_mode
:
11508 case vex_vsib_d_w_dq_mode
:
11509 case vex_vsib_d_w_d_mode
:
11510 case vex_vsib_q_w_dq_mode
:
11511 case vex_vsib_q_w_d_mode
:
11512 case evex_x_gscat_mode
:
11513 shift
= vex
.w
? 3 : 2;
11516 case evex_half_bcst_xmmq_mode
:
11520 shift
= vex
.w
? 3 : 2;
11523 /* Fall through. */
11527 case evex_x_nobcst_mode
:
11529 switch (vex
.length
)
11543 /* Make necessary corrections to shift for modes that need it. */
11544 if (bytemode
== xmmq_mode
11545 || bytemode
== evex_half_bcst_xmmq_mode
11546 || (bytemode
== ymmq_mode
&& vex
.length
== 128))
11548 else if (bytemode
== xmmqd_mode
)
11550 else if (bytemode
== xmmdw_mode
)
11565 shift
= vex
.w
? 1 : 0;
11576 intel_operand_size (bytemode
, sizeflag
);
11579 if ((sizeflag
& AFLAG
) || address_mode
== mode_64bit
)
11581 /* 32/64 bit address mode */
11591 int addr32flag
= !((sizeflag
& AFLAG
)
11592 || bytemode
== v_bnd_mode
11593 || bytemode
== v_bndmk_mode
11594 || bytemode
== bnd_mode
11595 || bytemode
== bnd_swap_mode
);
11596 const char **indexes64
= names64
;
11597 const char **indexes32
= names32
;
11607 vindex
= sib
.index
;
11613 case vex_vsib_d_w_dq_mode
:
11614 case vex_vsib_d_w_d_mode
:
11615 case vex_vsib_q_w_dq_mode
:
11616 case vex_vsib_q_w_d_mode
:
11626 switch (vex
.length
)
11629 indexes64
= indexes32
= names_xmm
;
11633 || bytemode
== vex_vsib_q_w_dq_mode
11634 || bytemode
== vex_vsib_q_w_d_mode
)
11635 indexes64
= indexes32
= names_ymm
;
11637 indexes64
= indexes32
= names_xmm
;
11641 || bytemode
== vex_vsib_q_w_dq_mode
11642 || bytemode
== vex_vsib_q_w_d_mode
)
11643 indexes64
= indexes32
= names_zmm
;
11645 indexes64
= indexes32
= names_ymm
;
11652 haveindex
= vindex
!= 4;
11661 /* mandatory non-vector SIB must have sib */
11662 if (bytemode
== vex_sibmem_mode
)
11668 rbase
= base
+ add
;
11676 if (address_mode
== mode_64bit
&& !havesib
)
11679 if (riprel
&& bytemode
== v_bndmk_mode
)
11687 FETCH_DATA (the_info
, codep
+ 1);
11689 if ((disp
& 0x80) != 0)
11691 if (vex
.evex
&& shift
> 0)
11704 && address_mode
!= mode_16bit
)
11706 if (address_mode
== mode_64bit
)
11710 /* Without base nor index registers, zero-extend the
11711 lower 32-bit displacement to 64 bits. */
11712 disp
= (unsigned int) disp
;
11719 /* In 32-bit mode, we need index register to tell [offset]
11720 from [eiz*1 + offset]. */
11725 havedisp
= (havebase
11727 || (havesib
&& (haveindex
|| scale
!= 0)));
11730 if (modrm
.mod
!= 0 || base
== 5)
11732 if (havedisp
|| riprel
)
11733 print_displacement (scratchbuf
, disp
);
11735 print_operand_value (scratchbuf
, 1, disp
);
11736 oappend (scratchbuf
);
11740 oappend (!addr32flag
? "(%rip)" : "(%eip)");
11744 if ((havebase
|| haveindex
|| needindex
|| needaddr32
|| riprel
)
11745 && (address_mode
!= mode_64bit
11746 || ((bytemode
!= v_bnd_mode
)
11747 && (bytemode
!= v_bndmk_mode
)
11748 && (bytemode
!= bnd_mode
)
11749 && (bytemode
!= bnd_swap_mode
))))
11750 used_prefixes
|= PREFIX_ADDR
;
11752 if (havedisp
|| (intel_syntax
&& riprel
))
11754 *obufp
++ = open_char
;
11755 if (intel_syntax
&& riprel
)
11758 oappend (!addr32flag
? "rip" : "eip");
11762 oappend (address_mode
== mode_64bit
&& !addr32flag
11763 ? names64
[rbase
] : names32
[rbase
]);
11766 /* ESP/RSP won't allow index. If base isn't ESP/RSP,
11767 print index to tell base + index from base. */
11771 || (havebase
&& base
!= ESP_REG_NUM
))
11773 if (!intel_syntax
|| havebase
)
11775 *obufp
++ = separator_char
;
11779 oappend (address_mode
== mode_64bit
&& !addr32flag
11780 ? indexes64
[vindex
] : indexes32
[vindex
]);
11782 oappend (address_mode
== mode_64bit
&& !addr32flag
11783 ? index64
: index32
);
11785 *obufp
++ = scale_char
;
11787 sprintf (scratchbuf
, "%d", 1 << scale
);
11788 oappend (scratchbuf
);
11792 && (disp
|| modrm
.mod
!= 0 || base
== 5))
11794 if (!havedisp
|| (bfd_signed_vma
) disp
>= 0)
11799 else if (modrm
.mod
!= 1 && disp
!= -disp
)
11807 print_displacement (scratchbuf
, disp
);
11809 print_operand_value (scratchbuf
, 1, disp
);
11810 oappend (scratchbuf
);
11813 *obufp
++ = close_char
;
11816 else if (intel_syntax
)
11818 if (modrm
.mod
!= 0 || base
== 5)
11820 if (!active_seg_prefix
)
11822 oappend (names_seg
[ds_reg
- es_reg
]);
11825 print_operand_value (scratchbuf
, 1, disp
);
11826 oappend (scratchbuf
);
11830 else if (bytemode
== v_bnd_mode
11831 || bytemode
== v_bndmk_mode
11832 || bytemode
== bnd_mode
11833 || bytemode
== bnd_swap_mode
)
11840 /* 16 bit address mode */
11841 used_prefixes
|= prefixes
& PREFIX_ADDR
;
11848 if ((disp
& 0x8000) != 0)
11853 FETCH_DATA (the_info
, codep
+ 1);
11855 if ((disp
& 0x80) != 0)
11857 if (vex
.evex
&& shift
> 0)
11862 if ((disp
& 0x8000) != 0)
11868 if (modrm
.mod
!= 0 || modrm
.rm
== 6)
11870 print_displacement (scratchbuf
, disp
);
11871 oappend (scratchbuf
);
11874 if (modrm
.mod
!= 0 || modrm
.rm
!= 6)
11876 *obufp
++ = open_char
;
11878 oappend (index16
[modrm
.rm
]);
11880 && (disp
|| modrm
.mod
!= 0 || modrm
.rm
== 6))
11882 if ((bfd_signed_vma
) disp
>= 0)
11887 else if (modrm
.mod
!= 1)
11894 print_displacement (scratchbuf
, disp
);
11895 oappend (scratchbuf
);
11898 *obufp
++ = close_char
;
11901 else if (intel_syntax
)
11903 if (!active_seg_prefix
)
11905 oappend (names_seg
[ds_reg
- es_reg
]);
11908 print_operand_value (scratchbuf
, 1, disp
& 0xffff);
11909 oappend (scratchbuf
);
11912 if (vex
.evex
&& vex
.b
11913 && (bytemode
== x_mode
11914 || bytemode
== xmmq_mode
11915 || bytemode
== evex_half_bcst_xmmq_mode
))
11918 || bytemode
== xmmq_mode
11919 || bytemode
== evex_half_bcst_xmmq_mode
)
11921 switch (vex
.length
)
11924 oappend ("{1to2}");
11927 oappend ("{1to4}");
11930 oappend ("{1to8}");
11938 switch (vex
.length
)
11941 oappend ("{1to4}");
11944 oappend ("{1to8}");
11947 oappend ("{1to16}");
11957 OP_E (int bytemode
, int sizeflag
)
11959 /* Skip mod/rm byte. */
11963 if (modrm
.mod
== 3)
11964 OP_E_register (bytemode
, sizeflag
);
11966 OP_E_memory (bytemode
, sizeflag
);
11970 OP_G (int bytemode
, int sizeflag
)
11973 const char **names
;
11983 oappend (names8rex
[modrm
.reg
+ add
]);
11985 oappend (names8
[modrm
.reg
+ add
]);
11988 oappend (names16
[modrm
.reg
+ add
]);
11993 oappend (names32
[modrm
.reg
+ add
]);
11996 oappend (names64
[modrm
.reg
+ add
]);
11999 if (modrm
.reg
> 0x3)
12004 oappend (names_bnd
[modrm
.reg
]);
12014 oappend (names64
[modrm
.reg
+ add
]);
12015 else if (bytemode
!= v_mode
&& bytemode
!= movsxd_mode
)
12016 oappend (names32
[modrm
.reg
+ add
]);
12019 if (sizeflag
& DFLAG
)
12020 oappend (names32
[modrm
.reg
+ add
]);
12022 oappend (names16
[modrm
.reg
+ add
]);
12023 used_prefixes
|= (prefixes
& PREFIX_DATA
);
12027 names
= (address_mode
== mode_64bit
12028 ? names64
: names32
);
12029 if (!(prefixes
& PREFIX_ADDR
))
12031 if (address_mode
== mode_16bit
)
12036 /* Remove "addr16/addr32". */
12037 all_prefixes
[last_addr_prefix
] = 0;
12038 names
= (address_mode
!= mode_32bit
12039 ? names32
: names16
);
12040 used_prefixes
|= PREFIX_ADDR
;
12042 oappend (names
[modrm
.reg
+ add
]);
12045 if (address_mode
== mode_64bit
)
12046 oappend (names64
[modrm
.reg
+ add
]);
12048 oappend (names32
[modrm
.reg
+ add
]);
12052 if ((modrm
.reg
+ add
) > 0x7)
12057 oappend (names_mask
[modrm
.reg
+ add
]);
12060 oappend (INTERNAL_DISASSEMBLER_ERROR
);
12073 FETCH_DATA (the_info
, codep
+ 8);
12074 a
= *codep
++ & 0xff;
12075 a
|= (*codep
++ & 0xff) << 8;
12076 a
|= (*codep
++ & 0xff) << 16;
12077 a
|= (*codep
++ & 0xffu
) << 24;
12078 b
= *codep
++ & 0xff;
12079 b
|= (*codep
++ & 0xff) << 8;
12080 b
|= (*codep
++ & 0xff) << 16;
12081 b
|= (*codep
++ & 0xffu
) << 24;
12082 x
= a
+ ((bfd_vma
) b
<< 32);
12090 static bfd_signed_vma
12095 FETCH_DATA (the_info
, codep
+ 4);
12096 x
= *codep
++ & (bfd_vma
) 0xff;
12097 x
|= (*codep
++ & (bfd_vma
) 0xff) << 8;
12098 x
|= (*codep
++ & (bfd_vma
) 0xff) << 16;
12099 x
|= (*codep
++ & (bfd_vma
) 0xff) << 24;
12103 static bfd_signed_vma
12108 FETCH_DATA (the_info
, codep
+ 4);
12109 x
= *codep
++ & (bfd_vma
) 0xff;
12110 x
|= (*codep
++ & (bfd_vma
) 0xff) << 8;
12111 x
|= (*codep
++ & (bfd_vma
) 0xff) << 16;
12112 x
|= (*codep
++ & (bfd_vma
) 0xff) << 24;
12114 x
= (x
^ ((bfd_vma
) 1 << 31)) - ((bfd_vma
) 1 << 31);
12124 FETCH_DATA (the_info
, codep
+ 2);
12125 x
= *codep
++ & 0xff;
12126 x
|= (*codep
++ & 0xff) << 8;
12131 set_op (bfd_vma op
, int riprel
)
12133 op_index
[op_ad
] = op_ad
;
12134 if (address_mode
== mode_64bit
)
12136 op_address
[op_ad
] = op
;
12137 op_riprel
[op_ad
] = riprel
;
12141 /* Mask to get a 32-bit address. */
12142 op_address
[op_ad
] = op
& 0xffffffff;
12143 op_riprel
[op_ad
] = riprel
& 0xffffffff;
12148 OP_REG (int code
, int sizeflag
)
12155 case es_reg
: case ss_reg
: case cs_reg
:
12156 case ds_reg
: case fs_reg
: case gs_reg
:
12157 oappend (names_seg
[code
- es_reg
]);
12169 case ax_reg
: case cx_reg
: case dx_reg
: case bx_reg
:
12170 case sp_reg
: case bp_reg
: case si_reg
: case di_reg
:
12171 s
= names16
[code
- ax_reg
+ add
];
12173 case ah_reg
: case ch_reg
: case dh_reg
: case bh_reg
:
12175 /* Fall through. */
12176 case al_reg
: case cl_reg
: case dl_reg
: case bl_reg
:
12178 s
= names8rex
[code
- al_reg
+ add
];
12180 s
= names8
[code
- al_reg
];
12182 case rAX_reg
: case rCX_reg
: case rDX_reg
: case rBX_reg
:
12183 case rSP_reg
: case rBP_reg
: case rSI_reg
: case rDI_reg
:
12184 if (address_mode
== mode_64bit
12185 && ((sizeflag
& DFLAG
) || (rex
& REX_W
)))
12187 s
= names64
[code
- rAX_reg
+ add
];
12190 code
+= eAX_reg
- rAX_reg
;
12191 /* Fall through. */
12192 case eAX_reg
: case eCX_reg
: case eDX_reg
: case eBX_reg
:
12193 case eSP_reg
: case eBP_reg
: case eSI_reg
: case eDI_reg
:
12196 s
= names64
[code
- eAX_reg
+ add
];
12199 if (sizeflag
& DFLAG
)
12200 s
= names32
[code
- eAX_reg
+ add
];
12202 s
= names16
[code
- eAX_reg
+ add
];
12203 used_prefixes
|= (prefixes
& PREFIX_DATA
);
12207 s
= INTERNAL_DISASSEMBLER_ERROR
;
12214 OP_IMREG (int code
, int sizeflag
)
12226 case al_reg
: case cl_reg
:
12227 s
= names8
[code
- al_reg
];
12236 /* Fall through. */
12237 case z_mode_ax_reg
:
12238 if ((rex
& REX_W
) || (sizeflag
& DFLAG
))
12242 if (!(rex
& REX_W
))
12243 used_prefixes
|= (prefixes
& PREFIX_DATA
);
12246 s
= INTERNAL_DISASSEMBLER_ERROR
;
12253 OP_I (int bytemode
, int sizeflag
)
12256 bfd_signed_vma mask
= -1;
12261 FETCH_DATA (the_info
, codep
+ 1);
12271 if (sizeflag
& DFLAG
)
12281 used_prefixes
|= (prefixes
& PREFIX_DATA
);
12297 oappend (INTERNAL_DISASSEMBLER_ERROR
);
12302 scratchbuf
[0] = '$';
12303 print_operand_value (scratchbuf
+ 1, 1, op
);
12304 oappend_maybe_intel (scratchbuf
);
12305 scratchbuf
[0] = '\0';
12309 OP_I64 (int bytemode
, int sizeflag
)
12311 if (bytemode
!= v_mode
|| address_mode
!= mode_64bit
|| !(rex
& REX_W
))
12313 OP_I (bytemode
, sizeflag
);
12319 scratchbuf
[0] = '$';
12320 print_operand_value (scratchbuf
+ 1, 1, get64 ());
12321 oappend_maybe_intel (scratchbuf
);
12322 scratchbuf
[0] = '\0';
12326 OP_sI (int bytemode
, int sizeflag
)
12334 FETCH_DATA (the_info
, codep
+ 1);
12336 if ((op
& 0x80) != 0)
12338 if (bytemode
== b_T_mode
)
12340 if (address_mode
!= mode_64bit
12341 || !((sizeflag
& DFLAG
) || (rex
& REX_W
)))
12343 /* The operand-size prefix is overridden by a REX prefix. */
12344 if ((sizeflag
& DFLAG
) || (rex
& REX_W
))
12352 if (!(rex
& REX_W
))
12354 if (sizeflag
& DFLAG
)
12362 /* The operand-size prefix is overridden by a REX prefix. */
12363 if ((sizeflag
& DFLAG
) || (rex
& REX_W
))
12369 oappend (INTERNAL_DISASSEMBLER_ERROR
);
12373 scratchbuf
[0] = '$';
12374 print_operand_value (scratchbuf
+ 1, 1, op
);
12375 oappend_maybe_intel (scratchbuf
);
12379 OP_J (int bytemode
, int sizeflag
)
12383 bfd_vma segment
= 0;
12388 FETCH_DATA (the_info
, codep
+ 1);
12390 if ((disp
& 0x80) != 0)
12395 if ((sizeflag
& DFLAG
)
12396 || (address_mode
== mode_64bit
12397 && ((isa64
== intel64
&& bytemode
!= dqw_mode
)
12398 || (rex
& REX_W
))))
12403 if ((disp
& 0x8000) != 0)
12405 /* In 16bit mode, address is wrapped around at 64k within
12406 the same segment. Otherwise, a data16 prefix on a jump
12407 instruction means that the pc is masked to 16 bits after
12408 the displacement is added! */
12410 if ((prefixes
& PREFIX_DATA
) == 0)
12411 segment
= ((start_pc
+ (codep
- start_codep
))
12412 & ~((bfd_vma
) 0xffff));
12414 if (address_mode
!= mode_64bit
12415 || (isa64
!= intel64
&& !(rex
& REX_W
)))
12416 used_prefixes
|= (prefixes
& PREFIX_DATA
);
12419 oappend (INTERNAL_DISASSEMBLER_ERROR
);
12422 disp
= ((start_pc
+ (codep
- start_codep
) + disp
) & mask
) | segment
;
12424 print_operand_value (scratchbuf
, 1, disp
);
12425 oappend (scratchbuf
);
12429 OP_SEG (int bytemode
, int sizeflag
)
12431 if (bytemode
== w_mode
)
12432 oappend (names_seg
[modrm
.reg
]);
12434 OP_E (modrm
.mod
== 3 ? bytemode
: w_mode
, sizeflag
);
12438 OP_DIR (int dummy ATTRIBUTE_UNUSED
, int sizeflag
)
12442 if (sizeflag
& DFLAG
)
12452 used_prefixes
|= (prefixes
& PREFIX_DATA
);
12454 sprintf (scratchbuf
, "0x%x:0x%x", seg
, offset
);
12456 sprintf (scratchbuf
, "$0x%x,$0x%x", seg
, offset
);
12457 oappend (scratchbuf
);
12461 OP_OFF (int bytemode
, int sizeflag
)
12465 if (intel_syntax
&& (sizeflag
& SUFFIX_ALWAYS
))
12466 intel_operand_size (bytemode
, sizeflag
);
12469 if ((sizeflag
& AFLAG
) || address_mode
== mode_64bit
)
12476 if (!active_seg_prefix
)
12478 oappend (names_seg
[ds_reg
- es_reg
]);
12482 print_operand_value (scratchbuf
, 1, off
);
12483 oappend (scratchbuf
);
12487 OP_OFF64 (int bytemode
, int sizeflag
)
12491 if (address_mode
!= mode_64bit
12492 || (prefixes
& PREFIX_ADDR
))
12494 OP_OFF (bytemode
, sizeflag
);
12498 if (intel_syntax
&& (sizeflag
& SUFFIX_ALWAYS
))
12499 intel_operand_size (bytemode
, sizeflag
);
12506 if (!active_seg_prefix
)
12508 oappend (names_seg
[ds_reg
- es_reg
]);
12512 print_operand_value (scratchbuf
, 1, off
);
12513 oappend (scratchbuf
);
12517 ptr_reg (int code
, int sizeflag
)
12521 *obufp
++ = open_char
;
12522 used_prefixes
|= (prefixes
& PREFIX_ADDR
);
12523 if (address_mode
== mode_64bit
)
12525 if (!(sizeflag
& AFLAG
))
12526 s
= names32
[code
- eAX_reg
];
12528 s
= names64
[code
- eAX_reg
];
12530 else if (sizeflag
& AFLAG
)
12531 s
= names32
[code
- eAX_reg
];
12533 s
= names16
[code
- eAX_reg
];
12535 *obufp
++ = close_char
;
12540 OP_ESreg (int code
, int sizeflag
)
12546 case 0x6d: /* insw/insl */
12547 intel_operand_size (z_mode
, sizeflag
);
12549 case 0xa5: /* movsw/movsl/movsq */
12550 case 0xa7: /* cmpsw/cmpsl/cmpsq */
12551 case 0xab: /* stosw/stosl */
12552 case 0xaf: /* scasw/scasl */
12553 intel_operand_size (v_mode
, sizeflag
);
12556 intel_operand_size (b_mode
, sizeflag
);
12559 oappend_maybe_intel ("%es:");
12560 ptr_reg (code
, sizeflag
);
12564 OP_DSreg (int code
, int sizeflag
)
12570 case 0x6f: /* outsw/outsl */
12571 intel_operand_size (z_mode
, sizeflag
);
12573 case 0xa5: /* movsw/movsl/movsq */
12574 case 0xa7: /* cmpsw/cmpsl/cmpsq */
12575 case 0xad: /* lodsw/lodsl/lodsq */
12576 intel_operand_size (v_mode
, sizeflag
);
12579 intel_operand_size (b_mode
, sizeflag
);
12582 /* Set active_seg_prefix to PREFIX_DS if it is unset so that the
12583 default segment register DS is printed. */
12584 if (!active_seg_prefix
)
12585 active_seg_prefix
= PREFIX_DS
;
12587 ptr_reg (code
, sizeflag
);
12591 OP_C (int dummy ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
12599 else if (address_mode
!= mode_64bit
&& (prefixes
& PREFIX_LOCK
))
12601 all_prefixes
[last_lock_prefix
] = 0;
12602 used_prefixes
|= PREFIX_LOCK
;
12607 sprintf (scratchbuf
, "%%cr%d", modrm
.reg
+ add
);
12608 oappend_maybe_intel (scratchbuf
);
12612 OP_D (int dummy ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
12621 sprintf (scratchbuf
, "dr%d", modrm
.reg
+ add
);
12623 sprintf (scratchbuf
, "%%db%d", modrm
.reg
+ add
);
12624 oappend (scratchbuf
);
12628 OP_T (int dummy ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
12630 sprintf (scratchbuf
, "%%tr%d", modrm
.reg
);
12631 oappend_maybe_intel (scratchbuf
);
12635 OP_MMX (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
12637 int reg
= modrm
.reg
;
12638 const char **names
;
12640 used_prefixes
|= (prefixes
& PREFIX_DATA
);
12641 if (prefixes
& PREFIX_DATA
)
12650 oappend (names
[reg
]);
12654 OP_XMM (int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
12656 int reg
= modrm
.reg
;
12657 const char **names
;
12669 && bytemode
!= xmm_mode
12670 && bytemode
!= xmmq_mode
12671 && bytemode
!= evex_half_bcst_xmmq_mode
12672 && bytemode
!= ymm_mode
12673 && bytemode
!= tmm_mode
12674 && bytemode
!= scalar_mode
)
12676 switch (vex
.length
)
12683 || (bytemode
!= vex_vsib_q_w_dq_mode
12684 && bytemode
!= vex_vsib_q_w_d_mode
))
12696 else if (bytemode
== xmmq_mode
12697 || bytemode
== evex_half_bcst_xmmq_mode
)
12699 switch (vex
.length
)
12712 else if (bytemode
== tmm_mode
)
12722 else if (bytemode
== ymm_mode
)
12726 oappend (names
[reg
]);
12730 OP_EM (int bytemode
, int sizeflag
)
12733 const char **names
;
12735 if (modrm
.mod
!= 3)
12738 && (bytemode
== v_mode
|| bytemode
== v_swap_mode
))
12740 bytemode
= (prefixes
& PREFIX_DATA
) ? x_mode
: q_mode
;
12741 used_prefixes
|= (prefixes
& PREFIX_DATA
);
12743 OP_E (bytemode
, sizeflag
);
12747 if ((sizeflag
& SUFFIX_ALWAYS
) && bytemode
== v_swap_mode
)
12750 /* Skip mod/rm byte. */
12753 used_prefixes
|= (prefixes
& PREFIX_DATA
);
12755 if (prefixes
& PREFIX_DATA
)
12764 oappend (names
[reg
]);
12767 /* cvt* are the only instructions in sse2 which have
12768 both SSE and MMX operands and also have 0x66 prefix
12769 in their opcode. 0x66 was originally used to differentiate
12770 between SSE and MMX instruction(operands). So we have to handle the
12771 cvt* separately using OP_EMC and OP_MXC */
12773 OP_EMC (int bytemode
, int sizeflag
)
12775 if (modrm
.mod
!= 3)
12777 if (intel_syntax
&& bytemode
== v_mode
)
12779 bytemode
= (prefixes
& PREFIX_DATA
) ? x_mode
: q_mode
;
12780 used_prefixes
|= (prefixes
& PREFIX_DATA
);
12782 OP_E (bytemode
, sizeflag
);
12786 /* Skip mod/rm byte. */
12789 used_prefixes
|= (prefixes
& PREFIX_DATA
);
12790 oappend (names_mm
[modrm
.rm
]);
12794 OP_MXC (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
12796 used_prefixes
|= (prefixes
& PREFIX_DATA
);
12797 oappend (names_mm
[modrm
.reg
]);
12801 OP_EX (int bytemode
, int sizeflag
)
12804 const char **names
;
12806 /* Skip mod/rm byte. */
12810 if (modrm
.mod
!= 3)
12812 OP_E_memory (bytemode
, sizeflag
);
12827 if ((sizeflag
& SUFFIX_ALWAYS
)
12828 && (bytemode
== x_swap_mode
12829 || bytemode
== d_swap_mode
12830 || bytemode
== q_swap_mode
))
12834 && bytemode
!= xmm_mode
12835 && bytemode
!= xmmdw_mode
12836 && bytemode
!= xmmqd_mode
12837 && bytemode
!= xmm_mb_mode
12838 && bytemode
!= xmm_mw_mode
12839 && bytemode
!= xmm_md_mode
12840 && bytemode
!= xmm_mq_mode
12841 && bytemode
!= xmmq_mode
12842 && bytemode
!= evex_half_bcst_xmmq_mode
12843 && bytemode
!= ymm_mode
12844 && bytemode
!= tmm_mode
12845 && bytemode
!= vex_scalar_w_dq_mode
)
12847 switch (vex
.length
)
12862 else if (bytemode
== xmmq_mode
12863 || bytemode
== evex_half_bcst_xmmq_mode
)
12865 switch (vex
.length
)
12878 else if (bytemode
== tmm_mode
)
12888 else if (bytemode
== ymm_mode
)
12892 oappend (names
[reg
]);
12896 OP_MS (int bytemode
, int sizeflag
)
12898 if (modrm
.mod
== 3)
12899 OP_EM (bytemode
, sizeflag
);
12905 OP_XS (int bytemode
, int sizeflag
)
12907 if (modrm
.mod
== 3)
12908 OP_EX (bytemode
, sizeflag
);
12914 OP_M (int bytemode
, int sizeflag
)
12916 if (modrm
.mod
== 3)
12917 /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
12920 OP_E (bytemode
, sizeflag
);
12924 OP_0f07 (int bytemode
, int sizeflag
)
12926 if (modrm
.mod
!= 3 || modrm
.rm
!= 0)
12929 OP_E (bytemode
, sizeflag
);
12932 /* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
12933 32bit mode and "xchg %rax,%rax" in 64bit mode. */
12936 NOP_Fixup1 (int bytemode
, int sizeflag
)
12938 if ((prefixes
& PREFIX_DATA
) != 0
12941 && address_mode
== mode_64bit
))
12942 OP_REG (bytemode
, sizeflag
);
12944 strcpy (obuf
, "nop");
12948 NOP_Fixup2 (int bytemode
, int sizeflag
)
12950 if ((prefixes
& PREFIX_DATA
) != 0
12953 && address_mode
== mode_64bit
))
12954 OP_IMREG (bytemode
, sizeflag
);
12957 static const char *const Suffix3DNow
[] = {
12958 /* 00 */ NULL
, NULL
, NULL
, NULL
,
12959 /* 04 */ NULL
, NULL
, NULL
, NULL
,
12960 /* 08 */ NULL
, NULL
, NULL
, NULL
,
12961 /* 0C */ "pi2fw", "pi2fd", NULL
, NULL
,
12962 /* 10 */ NULL
, NULL
, NULL
, NULL
,
12963 /* 14 */ NULL
, NULL
, NULL
, NULL
,
12964 /* 18 */ NULL
, NULL
, NULL
, NULL
,
12965 /* 1C */ "pf2iw", "pf2id", NULL
, NULL
,
12966 /* 20 */ NULL
, NULL
, NULL
, NULL
,
12967 /* 24 */ NULL
, NULL
, NULL
, NULL
,
12968 /* 28 */ NULL
, NULL
, NULL
, NULL
,
12969 /* 2C */ NULL
, NULL
, NULL
, NULL
,
12970 /* 30 */ NULL
, NULL
, NULL
, NULL
,
12971 /* 34 */ NULL
, NULL
, NULL
, NULL
,
12972 /* 38 */ NULL
, NULL
, NULL
, NULL
,
12973 /* 3C */ NULL
, NULL
, NULL
, NULL
,
12974 /* 40 */ NULL
, NULL
, NULL
, NULL
,
12975 /* 44 */ NULL
, NULL
, NULL
, NULL
,
12976 /* 48 */ NULL
, NULL
, NULL
, NULL
,
12977 /* 4C */ NULL
, NULL
, NULL
, NULL
,
12978 /* 50 */ NULL
, NULL
, NULL
, NULL
,
12979 /* 54 */ NULL
, NULL
, NULL
, NULL
,
12980 /* 58 */ NULL
, NULL
, NULL
, NULL
,
12981 /* 5C */ NULL
, NULL
, NULL
, NULL
,
12982 /* 60 */ NULL
, NULL
, NULL
, NULL
,
12983 /* 64 */ NULL
, NULL
, NULL
, NULL
,
12984 /* 68 */ NULL
, NULL
, NULL
, NULL
,
12985 /* 6C */ NULL
, NULL
, NULL
, NULL
,
12986 /* 70 */ NULL
, NULL
, NULL
, NULL
,
12987 /* 74 */ NULL
, NULL
, NULL
, NULL
,
12988 /* 78 */ NULL
, NULL
, NULL
, NULL
,
12989 /* 7C */ NULL
, NULL
, NULL
, NULL
,
12990 /* 80 */ NULL
, NULL
, NULL
, NULL
,
12991 /* 84 */ NULL
, NULL
, NULL
, NULL
,
12992 /* 88 */ NULL
, NULL
, "pfnacc", NULL
,
12993 /* 8C */ NULL
, NULL
, "pfpnacc", NULL
,
12994 /* 90 */ "pfcmpge", NULL
, NULL
, NULL
,
12995 /* 94 */ "pfmin", NULL
, "pfrcp", "pfrsqrt",
12996 /* 98 */ NULL
, NULL
, "pfsub", NULL
,
12997 /* 9C */ NULL
, NULL
, "pfadd", NULL
,
12998 /* A0 */ "pfcmpgt", NULL
, NULL
, NULL
,
12999 /* A4 */ "pfmax", NULL
, "pfrcpit1", "pfrsqit1",
13000 /* A8 */ NULL
, NULL
, "pfsubr", NULL
,
13001 /* AC */ NULL
, NULL
, "pfacc", NULL
,
13002 /* B0 */ "pfcmpeq", NULL
, NULL
, NULL
,
13003 /* B4 */ "pfmul", NULL
, "pfrcpit2", "pmulhrw",
13004 /* B8 */ NULL
, NULL
, NULL
, "pswapd",
13005 /* BC */ NULL
, NULL
, NULL
, "pavgusb",
13006 /* C0 */ NULL
, NULL
, NULL
, NULL
,
13007 /* C4 */ NULL
, NULL
, NULL
, NULL
,
13008 /* C8 */ NULL
, NULL
, NULL
, NULL
,
13009 /* CC */ NULL
, NULL
, NULL
, NULL
,
13010 /* D0 */ NULL
, NULL
, NULL
, NULL
,
13011 /* D4 */ NULL
, NULL
, NULL
, NULL
,
13012 /* D8 */ NULL
, NULL
, NULL
, NULL
,
13013 /* DC */ NULL
, NULL
, NULL
, NULL
,
13014 /* E0 */ NULL
, NULL
, NULL
, NULL
,
13015 /* E4 */ NULL
, NULL
, NULL
, NULL
,
13016 /* E8 */ NULL
, NULL
, NULL
, NULL
,
13017 /* EC */ NULL
, NULL
, NULL
, NULL
,
13018 /* F0 */ NULL
, NULL
, NULL
, NULL
,
13019 /* F4 */ NULL
, NULL
, NULL
, NULL
,
13020 /* F8 */ NULL
, NULL
, NULL
, NULL
,
13021 /* FC */ NULL
, NULL
, NULL
, NULL
,
13025 OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
13027 const char *mnemonic
;
13029 FETCH_DATA (the_info
, codep
+ 1);
13030 /* AMD 3DNow! instructions are specified by an opcode suffix in the
13031 place where an 8-bit immediate would normally go. ie. the last
13032 byte of the instruction. */
13033 obufp
= mnemonicendp
;
13034 mnemonic
= Suffix3DNow
[*codep
++ & 0xff];
13036 oappend (mnemonic
);
13039 /* Since a variable sized modrm/sib chunk is between the start
13040 of the opcode (0x0f0f) and the opcode suffix, we need to do
13041 all the modrm processing first, and don't know until now that
13042 we have a bad opcode. This necessitates some cleaning up. */
13043 op_out
[0][0] = '\0';
13044 op_out
[1][0] = '\0';
13047 mnemonicendp
= obufp
;
13050 static const struct op simd_cmp_op
[] =
13052 { STRING_COMMA_LEN ("eq") },
13053 { STRING_COMMA_LEN ("lt") },
13054 { STRING_COMMA_LEN ("le") },
13055 { STRING_COMMA_LEN ("unord") },
13056 { STRING_COMMA_LEN ("neq") },
13057 { STRING_COMMA_LEN ("nlt") },
13058 { STRING_COMMA_LEN ("nle") },
13059 { STRING_COMMA_LEN ("ord") }
13062 static const struct op vex_cmp_op
[] =
13064 { STRING_COMMA_LEN ("eq_uq") },
13065 { STRING_COMMA_LEN ("nge") },
13066 { STRING_COMMA_LEN ("ngt") },
13067 { STRING_COMMA_LEN ("false") },
13068 { STRING_COMMA_LEN ("neq_oq") },
13069 { STRING_COMMA_LEN ("ge") },
13070 { STRING_COMMA_LEN ("gt") },
13071 { STRING_COMMA_LEN ("true") },
13072 { STRING_COMMA_LEN ("eq_os") },
13073 { STRING_COMMA_LEN ("lt_oq") },
13074 { STRING_COMMA_LEN ("le_oq") },
13075 { STRING_COMMA_LEN ("unord_s") },
13076 { STRING_COMMA_LEN ("neq_us") },
13077 { STRING_COMMA_LEN ("nlt_uq") },
13078 { STRING_COMMA_LEN ("nle_uq") },
13079 { STRING_COMMA_LEN ("ord_s") },
13080 { STRING_COMMA_LEN ("eq_us") },
13081 { STRING_COMMA_LEN ("nge_uq") },
13082 { STRING_COMMA_LEN ("ngt_uq") },
13083 { STRING_COMMA_LEN ("false_os") },
13084 { STRING_COMMA_LEN ("neq_os") },
13085 { STRING_COMMA_LEN ("ge_oq") },
13086 { STRING_COMMA_LEN ("gt_oq") },
13087 { STRING_COMMA_LEN ("true_us") },
13091 CMP_Fixup (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
13093 unsigned int cmp_type
;
13095 FETCH_DATA (the_info
, codep
+ 1);
13096 cmp_type
= *codep
++ & 0xff;
13097 if (cmp_type
< ARRAY_SIZE (simd_cmp_op
))
13100 char *p
= mnemonicendp
- 2;
13104 sprintf (p
, "%s%s", simd_cmp_op
[cmp_type
].name
, suffix
);
13105 mnemonicendp
+= simd_cmp_op
[cmp_type
].len
;
13108 && cmp_type
< ARRAY_SIZE (simd_cmp_op
) + ARRAY_SIZE (vex_cmp_op
))
13111 char *p
= mnemonicendp
- 2;
13115 cmp_type
-= ARRAY_SIZE (simd_cmp_op
);
13116 sprintf (p
, "%s%s", vex_cmp_op
[cmp_type
].name
, suffix
);
13117 mnemonicendp
+= vex_cmp_op
[cmp_type
].len
;
13121 /* We have a reserved extension byte. Output it directly. */
13122 scratchbuf
[0] = '$';
13123 print_operand_value (scratchbuf
+ 1, 1, cmp_type
);
13124 oappend_maybe_intel (scratchbuf
);
13125 scratchbuf
[0] = '\0';
13130 OP_Mwait (int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
13132 /* mwait %eax,%ecx / mwaitx %eax,%ecx,%ebx */
13135 strcpy (op_out
[0], names32
[0]);
13136 strcpy (op_out
[1], names32
[1]);
13137 if (bytemode
== eBX_reg
)
13138 strcpy (op_out
[2], names32
[3]);
13139 two_source_ops
= 1;
13141 /* Skip mod/rm byte. */
13147 OP_Monitor (int bytemode ATTRIBUTE_UNUSED
,
13148 int sizeflag ATTRIBUTE_UNUSED
)
13150 /* monitor %{e,r,}ax,%ecx,%edx" */
13153 const char **names
= (address_mode
== mode_64bit
13154 ? names64
: names32
);
13156 if (prefixes
& PREFIX_ADDR
)
13158 /* Remove "addr16/addr32". */
13159 all_prefixes
[last_addr_prefix
] = 0;
13160 names
= (address_mode
!= mode_32bit
13161 ? names32
: names16
);
13162 used_prefixes
|= PREFIX_ADDR
;
13164 else if (address_mode
== mode_16bit
)
13166 strcpy (op_out
[0], names
[0]);
13167 strcpy (op_out
[1], names32
[1]);
13168 strcpy (op_out
[2], names32
[2]);
13169 two_source_ops
= 1;
13171 /* Skip mod/rm byte. */
13179 /* Throw away prefixes and 1st. opcode byte. */
13180 codep
= insn_codep
+ 1;
13185 REP_Fixup (int bytemode
, int sizeflag
)
13187 /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
13189 if (prefixes
& PREFIX_REPZ
)
13190 all_prefixes
[last_repz_prefix
] = REP_PREFIX
;
13197 OP_IMREG (bytemode
, sizeflag
);
13200 OP_ESreg (bytemode
, sizeflag
);
13203 OP_DSreg (bytemode
, sizeflag
);
13212 SEP_Fixup (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
13214 if ( isa64
!= amd64
)
13219 mnemonicendp
= obufp
;
13223 /* For BND-prefixed instructions 0xF2 prefix should be displayed as
13227 BND_Fixup (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
13229 if (prefixes
& PREFIX_REPNZ
)
13230 all_prefixes
[last_repnz_prefix
] = BND_PREFIX
;
13233 /* For NOTRACK-prefixed instructions, 0x3E prefix should be displayed as
13237 NOTRACK_Fixup (int bytemode ATTRIBUTE_UNUSED
,
13238 int sizeflag ATTRIBUTE_UNUSED
)
13241 /* Since active_seg_prefix is not set in 64-bit mode, check whether
13242 we've seen a PREFIX_DS. */
13243 if ((prefixes
& PREFIX_DS
) != 0
13244 && (address_mode
!= mode_64bit
|| last_data_prefix
< 0))
13246 /* NOTRACK prefix is only valid on indirect branch instructions.
13247 NB: DATA prefix is unsupported for Intel64. */
13248 active_seg_prefix
= 0;
13249 all_prefixes
[last_seg_prefix
] = NOTRACK_PREFIX
;
13253 /* Similar to OP_E. But the 0xf2/0xf3 prefixes should be displayed as
13254 "xacquire"/"xrelease" for memory operand if there is a LOCK prefix.
13258 HLE_Fixup1 (int bytemode
, int sizeflag
)
13261 && (prefixes
& PREFIX_LOCK
) != 0)
13263 if (prefixes
& PREFIX_REPZ
)
13264 all_prefixes
[last_repz_prefix
] = XRELEASE_PREFIX
;
13265 if (prefixes
& PREFIX_REPNZ
)
13266 all_prefixes
[last_repnz_prefix
] = XACQUIRE_PREFIX
;
13269 OP_E (bytemode
, sizeflag
);
13272 /* Similar to OP_E. But the 0xf2/0xf3 prefixes should be displayed as
13273 "xacquire"/"xrelease" for memory operand. No check for LOCK prefix.
13277 HLE_Fixup2 (int bytemode
, int sizeflag
)
13279 if (modrm
.mod
!= 3)
13281 if (prefixes
& PREFIX_REPZ
)
13282 all_prefixes
[last_repz_prefix
] = XRELEASE_PREFIX
;
13283 if (prefixes
& PREFIX_REPNZ
)
13284 all_prefixes
[last_repnz_prefix
] = XACQUIRE_PREFIX
;
13287 OP_E (bytemode
, sizeflag
);
13290 /* Similar to OP_E. But the 0xf3 prefixes should be displayed as
13291 "xrelease" for memory operand. No check for LOCK prefix. */
13294 HLE_Fixup3 (int bytemode
, int sizeflag
)
13297 && last_repz_prefix
> last_repnz_prefix
13298 && (prefixes
& PREFIX_REPZ
) != 0)
13299 all_prefixes
[last_repz_prefix
] = XRELEASE_PREFIX
;
13301 OP_E (bytemode
, sizeflag
);
13305 CMPXCHG8B_Fixup (int bytemode
, int sizeflag
)
13310 /* Change cmpxchg8b to cmpxchg16b. */
13311 char *p
= mnemonicendp
- 2;
13312 mnemonicendp
= stpcpy (p
, "16b");
13315 else if ((prefixes
& PREFIX_LOCK
) != 0)
13317 if (prefixes
& PREFIX_REPZ
)
13318 all_prefixes
[last_repz_prefix
] = XRELEASE_PREFIX
;
13319 if (prefixes
& PREFIX_REPNZ
)
13320 all_prefixes
[last_repnz_prefix
] = XACQUIRE_PREFIX
;
13323 OP_M (bytemode
, sizeflag
);
13327 XMM_Fixup (int reg
, int sizeflag ATTRIBUTE_UNUSED
)
13329 const char **names
;
13333 switch (vex
.length
)
13347 oappend (names
[reg
]);
13351 FXSAVE_Fixup (int bytemode
, int sizeflag
)
13353 /* Add proper suffix to "fxsave" and "fxrstor". */
13357 char *p
= mnemonicendp
;
13363 OP_M (bytemode
, sizeflag
);
13366 /* Display the destination register operand for instructions with
13370 OP_VEX (int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
13373 const char **names
;
13378 reg
= vex
.register_specifier
;
13379 vex
.register_specifier
= 0;
13380 if (address_mode
!= mode_64bit
)
13382 else if (vex
.evex
&& !vex
.v
)
13385 if (bytemode
== vex_scalar_mode
)
13387 oappend (names_xmm
[reg
]);
13391 if (bytemode
== tmm_mode
)
13393 /* All 3 TMM registers must be distinct. */
13398 /* This must be the 3rd operand. */
13399 if (obufp
!= op_out
[2])
13401 oappend (names_tmm
[reg
]);
13402 if (reg
== modrm
.reg
|| reg
== modrm
.rm
)
13403 strcpy (obufp
, "/(bad)");
13406 if (modrm
.reg
== modrm
.rm
|| modrm
.reg
== reg
|| modrm
.rm
== reg
)
13409 && (modrm
.reg
== modrm
.rm
|| modrm
.reg
== reg
))
13410 strcat (op_out
[0], "/(bad)");
13412 && (modrm
.rm
== modrm
.reg
|| modrm
.rm
== reg
))
13413 strcat (op_out
[1], "/(bad)");
13419 switch (vex
.length
)
13425 case vex_vsib_q_w_dq_mode
:
13426 case vex_vsib_q_w_d_mode
:
13442 names
= names_mask
;
13455 case vex_vsib_q_w_dq_mode
:
13456 case vex_vsib_q_w_d_mode
:
13457 names
= vex
.w
? names_ymm
: names_xmm
;
13466 names
= names_mask
;
13469 /* See PR binutils/20893 for a reproducer. */
13481 oappend (names
[reg
]);
13485 OP_VexR (int bytemode
, int sizeflag
)
13487 if (modrm
.mod
== 3)
13488 OP_VEX (bytemode
, sizeflag
);
13492 OP_VexW (int bytemode
, int sizeflag
)
13494 OP_VEX (bytemode
, sizeflag
);
13498 /* Swap 2nd and 3rd operands. */
13499 strcpy (scratchbuf
, op_out
[2]);
13500 strcpy (op_out
[2], op_out
[1]);
13501 strcpy (op_out
[1], scratchbuf
);
13506 OP_REG_VexI4 (int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
13509 const char **names
= names_xmm
;
13511 FETCH_DATA (the_info
, codep
+ 1);
13514 if (bytemode
!= x_mode
&& bytemode
!= scalar_mode
)
13518 if (address_mode
!= mode_64bit
)
13521 if (bytemode
== x_mode
&& vex
.length
== 256)
13524 oappend (names
[reg
]);
13528 /* Swap 3rd and 4th operands. */
13529 strcpy (scratchbuf
, op_out
[3]);
13530 strcpy (op_out
[3], op_out
[2]);
13531 strcpy (op_out
[2], scratchbuf
);
13536 OP_VexI4 (int bytemode ATTRIBUTE_UNUSED
,
13537 int sizeflag ATTRIBUTE_UNUSED
)
13539 scratchbuf
[0] = '$';
13540 print_operand_value (scratchbuf
+ 1, 1, codep
[-1] & 0xf);
13541 oappend_maybe_intel (scratchbuf
);
13545 VPCMP_Fixup (int bytemode ATTRIBUTE_UNUSED
,
13546 int sizeflag ATTRIBUTE_UNUSED
)
13548 unsigned int cmp_type
;
13553 FETCH_DATA (the_info
, codep
+ 1);
13554 cmp_type
= *codep
++ & 0xff;
13555 /* There are aliases for immediates 0, 1, 2, 4, 5, 6.
13556 If it's the case, print suffix, otherwise - print the immediate. */
13557 if (cmp_type
< ARRAY_SIZE (simd_cmp_op
)
13562 char *p
= mnemonicendp
- 2;
13564 /* vpcmp* can have both one- and two-lettered suffix. */
13578 sprintf (p
, "%s%s", simd_cmp_op
[cmp_type
].name
, suffix
);
13579 mnemonicendp
+= simd_cmp_op
[cmp_type
].len
;
13583 /* We have a reserved extension byte. Output it directly. */
13584 scratchbuf
[0] = '$';
13585 print_operand_value (scratchbuf
+ 1, 1, cmp_type
);
13586 oappend_maybe_intel (scratchbuf
);
13587 scratchbuf
[0] = '\0';
13591 static const struct op xop_cmp_op
[] =
13593 { STRING_COMMA_LEN ("lt") },
13594 { STRING_COMMA_LEN ("le") },
13595 { STRING_COMMA_LEN ("gt") },
13596 { STRING_COMMA_LEN ("ge") },
13597 { STRING_COMMA_LEN ("eq") },
13598 { STRING_COMMA_LEN ("neq") },
13599 { STRING_COMMA_LEN ("false") },
13600 { STRING_COMMA_LEN ("true") }
13604 VPCOM_Fixup (int bytemode ATTRIBUTE_UNUSED
,
13605 int sizeflag ATTRIBUTE_UNUSED
)
13607 unsigned int cmp_type
;
13609 FETCH_DATA (the_info
, codep
+ 1);
13610 cmp_type
= *codep
++ & 0xff;
13611 if (cmp_type
< ARRAY_SIZE (xop_cmp_op
))
13614 char *p
= mnemonicendp
- 2;
13616 /* vpcom* can have both one- and two-lettered suffix. */
13630 sprintf (p
, "%s%s", xop_cmp_op
[cmp_type
].name
, suffix
);
13631 mnemonicendp
+= xop_cmp_op
[cmp_type
].len
;
13635 /* We have a reserved extension byte. Output it directly. */
13636 scratchbuf
[0] = '$';
13637 print_operand_value (scratchbuf
+ 1, 1, cmp_type
);
13638 oappend_maybe_intel (scratchbuf
);
13639 scratchbuf
[0] = '\0';
13643 static const struct op pclmul_op
[] =
13645 { STRING_COMMA_LEN ("lql") },
13646 { STRING_COMMA_LEN ("hql") },
13647 { STRING_COMMA_LEN ("lqh") },
13648 { STRING_COMMA_LEN ("hqh") }
13652 PCLMUL_Fixup (int bytemode ATTRIBUTE_UNUSED
,
13653 int sizeflag ATTRIBUTE_UNUSED
)
13655 unsigned int pclmul_type
;
13657 FETCH_DATA (the_info
, codep
+ 1);
13658 pclmul_type
= *codep
++ & 0xff;
13659 switch (pclmul_type
)
13670 if (pclmul_type
< ARRAY_SIZE (pclmul_op
))
13673 char *p
= mnemonicendp
- 3;
13678 sprintf (p
, "%s%s", pclmul_op
[pclmul_type
].name
, suffix
);
13679 mnemonicendp
+= pclmul_op
[pclmul_type
].len
;
13683 /* We have a reserved extension byte. Output it directly. */
13684 scratchbuf
[0] = '$';
13685 print_operand_value (scratchbuf
+ 1, 1, pclmul_type
);
13686 oappend_maybe_intel (scratchbuf
);
13687 scratchbuf
[0] = '\0';
13692 MOVSXD_Fixup (int bytemode
, int sizeflag
)
13694 /* Add proper suffix to "movsxd". */
13695 char *p
= mnemonicendp
;
13720 oappend (INTERNAL_DISASSEMBLER_ERROR
);
13727 OP_E (bytemode
, sizeflag
);
13731 OP_Mask (int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
13734 || (bytemode
!= mask_mode
&& bytemode
!= mask_bd_mode
))
13738 if ((rex
& REX_R
) != 0 || !vex
.r
)
13744 oappend (names_mask
[modrm
.reg
]);
13748 OP_Rounding (int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
13750 if (modrm
.mod
== 3 && vex
.b
)
13753 case evex_rounding_64_mode
:
13754 if (address_mode
!= mode_64bit
)
13759 /* Fall through. */
13760 case evex_rounding_mode
:
13761 oappend (names_rounding
[vex
.ll
]);
13763 case evex_sae_mode
: