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
,
1352 EVEX_LEN_0F3A00_W_1
,
1353 EVEX_LEN_0F3A01_W_1
,
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
,
1640 typedef void (*op_rtn
) (int bytemode
, int sizeflag
);
1649 unsigned int prefix_requirement
;
1652 /* Upper case letters in the instruction names here are macros.
1653 'A' => print 'b' if no register operands or suffix_always is true
1654 'B' => print 'b' if suffix_always is true
1655 'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
1657 'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
1658 suffix_always is true
1659 'E' => print 'e' if 32-bit form of jcxz
1660 'F' => print 'w' or 'l' depending on address size prefix (loop insns)
1661 'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
1662 'H' => print ",pt" or ",pn" branch hint
1665 'K' => print 'd' or 'q' if rex prefix is present.
1667 'M' => print 'r' if intel_mnemonic is false.
1668 'N' => print 'n' if instruction has no wait "prefix"
1669 'O' => print 'd' or 'o' (or 'q' in Intel mode)
1670 'P' => behave as 'T' except with register operand outside of suffix_always
1672 'Q' => print 'w', 'l' or 'q' for memory operand or suffix_always
1674 'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
1675 'S' => print 'w', 'l' or 'q' if suffix_always is true
1676 'T' => print 'w', 'l'/'d', or 'q' if instruction has an operand size
1677 prefix or if suffix_always is true.
1680 'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
1681 'X' => print 's', 'd' depending on data16 prefix (for XMM)
1683 'Z' => print 'q' in 64bit mode and 'l' otherwise, if suffix_always is true.
1684 '!' => change condition from true to false or from false to true.
1685 '%' => add 1 upper case letter to the macro.
1686 '^' => print 'w', 'l', or 'q' (Intel64 ISA only) depending on operand size
1687 prefix or suffix_always is true (lcall/ljmp).
1688 '@' => in 64bit mode for Intel64 ISA or if instruction
1689 has no operand sizing prefix, print 'q' if suffix_always is true or
1690 nothing otherwise; behave as 'P' in all other cases
1692 2 upper case letter macros:
1693 "XY" => print 'x' or 'y' if suffix_always is true or no register
1694 operands and no broadcast.
1695 "XZ" => print 'x', 'y', or 'z' if suffix_always is true or no
1696 register operands and no broadcast.
1697 "XW" => print 's', 'd' depending on the VEX.W bit (for FMA)
1698 "XV" => print "{vex3}" pseudo prefix
1699 "LQ" => print 'l' ('d' in Intel mode) or 'q' for memory operand, cond
1700 being false, or no operand at all in 64bit mode, or if suffix_always
1702 "LB" => print "abs" in 64bit mode and behave as 'B' otherwise
1703 "LS" => print "abs" in 64bit mode and behave as 'S' otherwise
1704 "LV" => print "abs" for 64bit operand and behave as 'S' otherwise
1705 "DQ" => print 'd' or 'q' depending on the VEX.W bit
1706 "BW" => print 'b' or 'w' depending on the VEX.W bit
1707 "LP" => print 'w' or 'l' ('d' in Intel mode) if instruction has
1708 an operand size prefix, or suffix_always is true. print
1709 'q' if rex prefix is present.
1711 Many of the above letters print nothing in Intel mode. See "putop"
1714 Braces '{' and '}', and vertical bars '|', indicate alternative
1715 mnemonic strings for AT&T and Intel. */
1717 static const struct dis386 dis386
[] = {
1719 { "addB", { Ebh1
, Gb
}, 0 },
1720 { "addS", { Evh1
, Gv
}, 0 },
1721 { "addB", { Gb
, EbS
}, 0 },
1722 { "addS", { Gv
, EvS
}, 0 },
1723 { "addB", { AL
, Ib
}, 0 },
1724 { "addS", { eAX
, Iv
}, 0 },
1725 { X86_64_TABLE (X86_64_06
) },
1726 { X86_64_TABLE (X86_64_07
) },
1728 { "orB", { Ebh1
, Gb
}, 0 },
1729 { "orS", { Evh1
, Gv
}, 0 },
1730 { "orB", { Gb
, EbS
}, 0 },
1731 { "orS", { Gv
, EvS
}, 0 },
1732 { "orB", { AL
, Ib
}, 0 },
1733 { "orS", { eAX
, Iv
}, 0 },
1734 { X86_64_TABLE (X86_64_0E
) },
1735 { Bad_Opcode
}, /* 0x0f extended opcode escape */
1737 { "adcB", { Ebh1
, Gb
}, 0 },
1738 { "adcS", { Evh1
, Gv
}, 0 },
1739 { "adcB", { Gb
, EbS
}, 0 },
1740 { "adcS", { Gv
, EvS
}, 0 },
1741 { "adcB", { AL
, Ib
}, 0 },
1742 { "adcS", { eAX
, Iv
}, 0 },
1743 { X86_64_TABLE (X86_64_16
) },
1744 { X86_64_TABLE (X86_64_17
) },
1746 { "sbbB", { Ebh1
, Gb
}, 0 },
1747 { "sbbS", { Evh1
, Gv
}, 0 },
1748 { "sbbB", { Gb
, EbS
}, 0 },
1749 { "sbbS", { Gv
, EvS
}, 0 },
1750 { "sbbB", { AL
, Ib
}, 0 },
1751 { "sbbS", { eAX
, Iv
}, 0 },
1752 { X86_64_TABLE (X86_64_1E
) },
1753 { X86_64_TABLE (X86_64_1F
) },
1755 { "andB", { Ebh1
, Gb
}, 0 },
1756 { "andS", { Evh1
, Gv
}, 0 },
1757 { "andB", { Gb
, EbS
}, 0 },
1758 { "andS", { Gv
, EvS
}, 0 },
1759 { "andB", { AL
, Ib
}, 0 },
1760 { "andS", { eAX
, Iv
}, 0 },
1761 { Bad_Opcode
}, /* SEG ES prefix */
1762 { X86_64_TABLE (X86_64_27
) },
1764 { "subB", { Ebh1
, Gb
}, 0 },
1765 { "subS", { Evh1
, Gv
}, 0 },
1766 { "subB", { Gb
, EbS
}, 0 },
1767 { "subS", { Gv
, EvS
}, 0 },
1768 { "subB", { AL
, Ib
}, 0 },
1769 { "subS", { eAX
, Iv
}, 0 },
1770 { Bad_Opcode
}, /* SEG CS prefix */
1771 { X86_64_TABLE (X86_64_2F
) },
1773 { "xorB", { Ebh1
, Gb
}, 0 },
1774 { "xorS", { Evh1
, Gv
}, 0 },
1775 { "xorB", { Gb
, EbS
}, 0 },
1776 { "xorS", { Gv
, EvS
}, 0 },
1777 { "xorB", { AL
, Ib
}, 0 },
1778 { "xorS", { eAX
, Iv
}, 0 },
1779 { Bad_Opcode
}, /* SEG SS prefix */
1780 { X86_64_TABLE (X86_64_37
) },
1782 { "cmpB", { Eb
, Gb
}, 0 },
1783 { "cmpS", { Ev
, Gv
}, 0 },
1784 { "cmpB", { Gb
, EbS
}, 0 },
1785 { "cmpS", { Gv
, EvS
}, 0 },
1786 { "cmpB", { AL
, Ib
}, 0 },
1787 { "cmpS", { eAX
, Iv
}, 0 },
1788 { Bad_Opcode
}, /* SEG DS prefix */
1789 { X86_64_TABLE (X86_64_3F
) },
1791 { "inc{S|}", { RMeAX
}, 0 },
1792 { "inc{S|}", { RMeCX
}, 0 },
1793 { "inc{S|}", { RMeDX
}, 0 },
1794 { "inc{S|}", { RMeBX
}, 0 },
1795 { "inc{S|}", { RMeSP
}, 0 },
1796 { "inc{S|}", { RMeBP
}, 0 },
1797 { "inc{S|}", { RMeSI
}, 0 },
1798 { "inc{S|}", { RMeDI
}, 0 },
1800 { "dec{S|}", { RMeAX
}, 0 },
1801 { "dec{S|}", { RMeCX
}, 0 },
1802 { "dec{S|}", { RMeDX
}, 0 },
1803 { "dec{S|}", { RMeBX
}, 0 },
1804 { "dec{S|}", { RMeSP
}, 0 },
1805 { "dec{S|}", { RMeBP
}, 0 },
1806 { "dec{S|}", { RMeSI
}, 0 },
1807 { "dec{S|}", { RMeDI
}, 0 },
1809 { "push{!P|}", { RMrAX
}, 0 },
1810 { "push{!P|}", { RMrCX
}, 0 },
1811 { "push{!P|}", { RMrDX
}, 0 },
1812 { "push{!P|}", { RMrBX
}, 0 },
1813 { "push{!P|}", { RMrSP
}, 0 },
1814 { "push{!P|}", { RMrBP
}, 0 },
1815 { "push{!P|}", { RMrSI
}, 0 },
1816 { "push{!P|}", { RMrDI
}, 0 },
1818 { "pop{!P|}", { RMrAX
}, 0 },
1819 { "pop{!P|}", { RMrCX
}, 0 },
1820 { "pop{!P|}", { RMrDX
}, 0 },
1821 { "pop{!P|}", { RMrBX
}, 0 },
1822 { "pop{!P|}", { RMrSP
}, 0 },
1823 { "pop{!P|}", { RMrBP
}, 0 },
1824 { "pop{!P|}", { RMrSI
}, 0 },
1825 { "pop{!P|}", { RMrDI
}, 0 },
1827 { X86_64_TABLE (X86_64_60
) },
1828 { X86_64_TABLE (X86_64_61
) },
1829 { X86_64_TABLE (X86_64_62
) },
1830 { X86_64_TABLE (X86_64_63
) },
1831 { Bad_Opcode
}, /* seg fs */
1832 { Bad_Opcode
}, /* seg gs */
1833 { Bad_Opcode
}, /* op size prefix */
1834 { Bad_Opcode
}, /* adr size prefix */
1836 { "pushP", { sIv
}, 0 },
1837 { "imulS", { Gv
, Ev
, Iv
}, 0 },
1838 { "pushP", { sIbT
}, 0 },
1839 { "imulS", { Gv
, Ev
, sIb
}, 0 },
1840 { "ins{b|}", { Ybr
, indirDX
}, 0 },
1841 { X86_64_TABLE (X86_64_6D
) },
1842 { "outs{b|}", { indirDXr
, Xb
}, 0 },
1843 { X86_64_TABLE (X86_64_6F
) },
1845 { "joH", { Jb
, BND
, cond_jump_flag
}, 0 },
1846 { "jnoH", { Jb
, BND
, cond_jump_flag
}, 0 },
1847 { "jbH", { Jb
, BND
, cond_jump_flag
}, 0 },
1848 { "jaeH", { Jb
, BND
, cond_jump_flag
}, 0 },
1849 { "jeH", { Jb
, BND
, cond_jump_flag
}, 0 },
1850 { "jneH", { Jb
, BND
, cond_jump_flag
}, 0 },
1851 { "jbeH", { Jb
, BND
, cond_jump_flag
}, 0 },
1852 { "jaH", { Jb
, BND
, cond_jump_flag
}, 0 },
1854 { "jsH", { Jb
, BND
, cond_jump_flag
}, 0 },
1855 { "jnsH", { Jb
, BND
, cond_jump_flag
}, 0 },
1856 { "jpH", { Jb
, BND
, cond_jump_flag
}, 0 },
1857 { "jnpH", { Jb
, BND
, cond_jump_flag
}, 0 },
1858 { "jlH", { Jb
, BND
, cond_jump_flag
}, 0 },
1859 { "jgeH", { Jb
, BND
, cond_jump_flag
}, 0 },
1860 { "jleH", { Jb
, BND
, cond_jump_flag
}, 0 },
1861 { "jgH", { Jb
, BND
, cond_jump_flag
}, 0 },
1863 { REG_TABLE (REG_80
) },
1864 { REG_TABLE (REG_81
) },
1865 { X86_64_TABLE (X86_64_82
) },
1866 { REG_TABLE (REG_83
) },
1867 { "testB", { Eb
, Gb
}, 0 },
1868 { "testS", { Ev
, Gv
}, 0 },
1869 { "xchgB", { Ebh2
, Gb
}, 0 },
1870 { "xchgS", { Evh2
, Gv
}, 0 },
1872 { "movB", { Ebh3
, Gb
}, 0 },
1873 { "movS", { Evh3
, Gv
}, 0 },
1874 { "movB", { Gb
, EbS
}, 0 },
1875 { "movS", { Gv
, EvS
}, 0 },
1876 { "movD", { Sv
, Sw
}, 0 },
1877 { MOD_TABLE (MOD_8D
) },
1878 { "movD", { Sw
, Sv
}, 0 },
1879 { REG_TABLE (REG_8F
) },
1881 { PREFIX_TABLE (PREFIX_90
) },
1882 { "xchgS", { RMeCX
, eAX
}, 0 },
1883 { "xchgS", { RMeDX
, eAX
}, 0 },
1884 { "xchgS", { RMeBX
, eAX
}, 0 },
1885 { "xchgS", { RMeSP
, eAX
}, 0 },
1886 { "xchgS", { RMeBP
, eAX
}, 0 },
1887 { "xchgS", { RMeSI
, eAX
}, 0 },
1888 { "xchgS", { RMeDI
, eAX
}, 0 },
1890 { "cW{t|}R", { XX
}, 0 },
1891 { "cR{t|}O", { XX
}, 0 },
1892 { X86_64_TABLE (X86_64_9A
) },
1893 { Bad_Opcode
}, /* fwait */
1894 { "pushfP", { XX
}, 0 },
1895 { "popfP", { XX
}, 0 },
1896 { "sahf", { XX
}, 0 },
1897 { "lahf", { XX
}, 0 },
1899 { "mov%LB", { AL
, Ob
}, 0 },
1900 { "mov%LS", { eAX
, Ov
}, 0 },
1901 { "mov%LB", { Ob
, AL
}, 0 },
1902 { "mov%LS", { Ov
, eAX
}, 0 },
1903 { "movs{b|}", { Ybr
, Xb
}, 0 },
1904 { "movs{R|}", { Yvr
, Xv
}, 0 },
1905 { "cmps{b|}", { Xb
, Yb
}, 0 },
1906 { "cmps{R|}", { Xv
, Yv
}, 0 },
1908 { "testB", { AL
, Ib
}, 0 },
1909 { "testS", { eAX
, Iv
}, 0 },
1910 { "stosB", { Ybr
, AL
}, 0 },
1911 { "stosS", { Yvr
, eAX
}, 0 },
1912 { "lodsB", { ALr
, Xb
}, 0 },
1913 { "lodsS", { eAXr
, Xv
}, 0 },
1914 { "scasB", { AL
, Yb
}, 0 },
1915 { "scasS", { eAX
, Yv
}, 0 },
1917 { "movB", { RMAL
, Ib
}, 0 },
1918 { "movB", { RMCL
, Ib
}, 0 },
1919 { "movB", { RMDL
, Ib
}, 0 },
1920 { "movB", { RMBL
, Ib
}, 0 },
1921 { "movB", { RMAH
, Ib
}, 0 },
1922 { "movB", { RMCH
, Ib
}, 0 },
1923 { "movB", { RMDH
, Ib
}, 0 },
1924 { "movB", { RMBH
, Ib
}, 0 },
1926 { "mov%LV", { RMeAX
, Iv64
}, 0 },
1927 { "mov%LV", { RMeCX
, Iv64
}, 0 },
1928 { "mov%LV", { RMeDX
, Iv64
}, 0 },
1929 { "mov%LV", { RMeBX
, Iv64
}, 0 },
1930 { "mov%LV", { RMeSP
, Iv64
}, 0 },
1931 { "mov%LV", { RMeBP
, Iv64
}, 0 },
1932 { "mov%LV", { RMeSI
, Iv64
}, 0 },
1933 { "mov%LV", { RMeDI
, Iv64
}, 0 },
1935 { REG_TABLE (REG_C0
) },
1936 { REG_TABLE (REG_C1
) },
1937 { X86_64_TABLE (X86_64_C2
) },
1938 { X86_64_TABLE (X86_64_C3
) },
1939 { X86_64_TABLE (X86_64_C4
) },
1940 { X86_64_TABLE (X86_64_C5
) },
1941 { REG_TABLE (REG_C6
) },
1942 { REG_TABLE (REG_C7
) },
1944 { "enterP", { Iw
, Ib
}, 0 },
1945 { "leaveP", { XX
}, 0 },
1946 { "{l|}ret{|f}%LP", { Iw
}, 0 },
1947 { "{l|}ret{|f}%LP", { XX
}, 0 },
1948 { "int3", { XX
}, 0 },
1949 { "int", { Ib
}, 0 },
1950 { X86_64_TABLE (X86_64_CE
) },
1951 { "iret%LP", { XX
}, 0 },
1953 { REG_TABLE (REG_D0
) },
1954 { REG_TABLE (REG_D1
) },
1955 { REG_TABLE (REG_D2
) },
1956 { REG_TABLE (REG_D3
) },
1957 { X86_64_TABLE (X86_64_D4
) },
1958 { X86_64_TABLE (X86_64_D5
) },
1960 { "xlat", { DSBX
}, 0 },
1971 { "loopneFH", { Jb
, XX
, loop_jcxz_flag
}, 0 },
1972 { "loopeFH", { Jb
, XX
, loop_jcxz_flag
}, 0 },
1973 { "loopFH", { Jb
, XX
, loop_jcxz_flag
}, 0 },
1974 { "jEcxzH", { Jb
, XX
, loop_jcxz_flag
}, 0 },
1975 { "inB", { AL
, Ib
}, 0 },
1976 { "inG", { zAX
, Ib
}, 0 },
1977 { "outB", { Ib
, AL
}, 0 },
1978 { "outG", { Ib
, zAX
}, 0 },
1980 { X86_64_TABLE (X86_64_E8
) },
1981 { X86_64_TABLE (X86_64_E9
) },
1982 { X86_64_TABLE (X86_64_EA
) },
1983 { "jmp", { Jb
, BND
}, 0 },
1984 { "inB", { AL
, indirDX
}, 0 },
1985 { "inG", { zAX
, indirDX
}, 0 },
1986 { "outB", { indirDX
, AL
}, 0 },
1987 { "outG", { indirDX
, zAX
}, 0 },
1989 { Bad_Opcode
}, /* lock prefix */
1990 { "icebp", { XX
}, 0 },
1991 { Bad_Opcode
}, /* repne */
1992 { Bad_Opcode
}, /* repz */
1993 { "hlt", { XX
}, 0 },
1994 { "cmc", { XX
}, 0 },
1995 { REG_TABLE (REG_F6
) },
1996 { REG_TABLE (REG_F7
) },
1998 { "clc", { XX
}, 0 },
1999 { "stc", { XX
}, 0 },
2000 { "cli", { XX
}, 0 },
2001 { "sti", { XX
}, 0 },
2002 { "cld", { XX
}, 0 },
2003 { "std", { XX
}, 0 },
2004 { REG_TABLE (REG_FE
) },
2005 { REG_TABLE (REG_FF
) },
2008 static const struct dis386 dis386_twobyte
[] = {
2010 { REG_TABLE (REG_0F00
) },
2011 { REG_TABLE (REG_0F01
) },
2012 { "larS", { Gv
, Ew
}, 0 },
2013 { "lslS", { Gv
, Ew
}, 0 },
2015 { "syscall", { XX
}, 0 },
2016 { "clts", { XX
}, 0 },
2017 { "sysret%LQ", { XX
}, 0 },
2019 { "invd", { XX
}, 0 },
2020 { PREFIX_TABLE (PREFIX_0F09
) },
2022 { "ud2", { XX
}, 0 },
2024 { REG_TABLE (REG_0F0D
) },
2025 { "femms", { XX
}, 0 },
2026 { "", { MX
, EM
, OPSUF
}, 0 }, /* See OP_3DNowSuffix. */
2028 { PREFIX_TABLE (PREFIX_0F10
) },
2029 { PREFIX_TABLE (PREFIX_0F11
) },
2030 { PREFIX_TABLE (PREFIX_0F12
) },
2031 { MOD_TABLE (MOD_0F13
) },
2032 { "unpcklpX", { XM
, EXx
}, PREFIX_OPCODE
},
2033 { "unpckhpX", { XM
, EXx
}, PREFIX_OPCODE
},
2034 { PREFIX_TABLE (PREFIX_0F16
) },
2035 { MOD_TABLE (MOD_0F17
) },
2037 { REG_TABLE (REG_0F18
) },
2038 { "nopQ", { Ev
}, 0 },
2039 { PREFIX_TABLE (PREFIX_0F1A
) },
2040 { PREFIX_TABLE (PREFIX_0F1B
) },
2041 { PREFIX_TABLE (PREFIX_0F1C
) },
2042 { "nopQ", { Ev
}, 0 },
2043 { PREFIX_TABLE (PREFIX_0F1E
) },
2044 { "nopQ", { Ev
}, 0 },
2046 { "movZ", { Em
, Cm
}, 0 },
2047 { "movZ", { Em
, Dm
}, 0 },
2048 { "movZ", { Cm
, Em
}, 0 },
2049 { "movZ", { Dm
, Em
}, 0 },
2050 { X86_64_TABLE (X86_64_0F24
) },
2052 { X86_64_TABLE (X86_64_0F26
) },
2055 { "movapX", { XM
, EXx
}, PREFIX_OPCODE
},
2056 { "movapX", { EXxS
, XM
}, PREFIX_OPCODE
},
2057 { PREFIX_TABLE (PREFIX_0F2A
) },
2058 { PREFIX_TABLE (PREFIX_0F2B
) },
2059 { PREFIX_TABLE (PREFIX_0F2C
) },
2060 { PREFIX_TABLE (PREFIX_0F2D
) },
2061 { PREFIX_TABLE (PREFIX_0F2E
) },
2062 { PREFIX_TABLE (PREFIX_0F2F
) },
2064 { "wrmsr", { XX
}, 0 },
2065 { "rdtsc", { XX
}, 0 },
2066 { "rdmsr", { XX
}, 0 },
2067 { "rdpmc", { XX
}, 0 },
2068 { "sysenter", { SEP
}, 0 },
2069 { "sysexit%LQ", { SEP
}, 0 },
2071 { "getsec", { XX
}, 0 },
2073 { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F38
, PREFIX_OPCODE
) },
2075 { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F3A
, PREFIX_OPCODE
) },
2082 { "cmovoS", { Gv
, Ev
}, 0 },
2083 { "cmovnoS", { Gv
, Ev
}, 0 },
2084 { "cmovbS", { Gv
, Ev
}, 0 },
2085 { "cmovaeS", { Gv
, Ev
}, 0 },
2086 { "cmoveS", { Gv
, Ev
}, 0 },
2087 { "cmovneS", { Gv
, Ev
}, 0 },
2088 { "cmovbeS", { Gv
, Ev
}, 0 },
2089 { "cmovaS", { Gv
, Ev
}, 0 },
2091 { "cmovsS", { Gv
, Ev
}, 0 },
2092 { "cmovnsS", { Gv
, Ev
}, 0 },
2093 { "cmovpS", { Gv
, Ev
}, 0 },
2094 { "cmovnpS", { Gv
, Ev
}, 0 },
2095 { "cmovlS", { Gv
, Ev
}, 0 },
2096 { "cmovgeS", { Gv
, Ev
}, 0 },
2097 { "cmovleS", { Gv
, Ev
}, 0 },
2098 { "cmovgS", { Gv
, Ev
}, 0 },
2100 { MOD_TABLE (MOD_0F50
) },
2101 { PREFIX_TABLE (PREFIX_0F51
) },
2102 { PREFIX_TABLE (PREFIX_0F52
) },
2103 { PREFIX_TABLE (PREFIX_0F53
) },
2104 { "andpX", { XM
, EXx
}, PREFIX_OPCODE
},
2105 { "andnpX", { XM
, EXx
}, PREFIX_OPCODE
},
2106 { "orpX", { XM
, EXx
}, PREFIX_OPCODE
},
2107 { "xorpX", { XM
, EXx
}, PREFIX_OPCODE
},
2109 { PREFIX_TABLE (PREFIX_0F58
) },
2110 { PREFIX_TABLE (PREFIX_0F59
) },
2111 { PREFIX_TABLE (PREFIX_0F5A
) },
2112 { PREFIX_TABLE (PREFIX_0F5B
) },
2113 { PREFIX_TABLE (PREFIX_0F5C
) },
2114 { PREFIX_TABLE (PREFIX_0F5D
) },
2115 { PREFIX_TABLE (PREFIX_0F5E
) },
2116 { PREFIX_TABLE (PREFIX_0F5F
) },
2118 { PREFIX_TABLE (PREFIX_0F60
) },
2119 { PREFIX_TABLE (PREFIX_0F61
) },
2120 { PREFIX_TABLE (PREFIX_0F62
) },
2121 { "packsswb", { MX
, EM
}, PREFIX_OPCODE
},
2122 { "pcmpgtb", { MX
, EM
}, PREFIX_OPCODE
},
2123 { "pcmpgtw", { MX
, EM
}, PREFIX_OPCODE
},
2124 { "pcmpgtd", { MX
, EM
}, PREFIX_OPCODE
},
2125 { "packuswb", { MX
, EM
}, PREFIX_OPCODE
},
2127 { "punpckhbw", { MX
, EM
}, PREFIX_OPCODE
},
2128 { "punpckhwd", { MX
, EM
}, PREFIX_OPCODE
},
2129 { "punpckhdq", { MX
, EM
}, PREFIX_OPCODE
},
2130 { "packssdw", { MX
, EM
}, PREFIX_OPCODE
},
2131 { "punpcklqdq", { XM
, EXx
}, PREFIX_DATA
},
2132 { "punpckhqdq", { XM
, EXx
}, PREFIX_DATA
},
2133 { "movK", { MX
, Edq
}, PREFIX_OPCODE
},
2134 { PREFIX_TABLE (PREFIX_0F6F
) },
2136 { PREFIX_TABLE (PREFIX_0F70
) },
2137 { MOD_TABLE (MOD_0F71
) },
2138 { MOD_TABLE (MOD_0F72
) },
2139 { MOD_TABLE (MOD_0F73
) },
2140 { "pcmpeqb", { MX
, EM
}, PREFIX_OPCODE
},
2141 { "pcmpeqw", { MX
, EM
}, PREFIX_OPCODE
},
2142 { "pcmpeqd", { MX
, EM
}, PREFIX_OPCODE
},
2143 { "emms", { XX
}, PREFIX_OPCODE
},
2145 { PREFIX_TABLE (PREFIX_0F78
) },
2146 { PREFIX_TABLE (PREFIX_0F79
) },
2149 { PREFIX_TABLE (PREFIX_0F7C
) },
2150 { PREFIX_TABLE (PREFIX_0F7D
) },
2151 { PREFIX_TABLE (PREFIX_0F7E
) },
2152 { PREFIX_TABLE (PREFIX_0F7F
) },
2154 { "joH", { Jv
, BND
, cond_jump_flag
}, 0 },
2155 { "jnoH", { Jv
, BND
, cond_jump_flag
}, 0 },
2156 { "jbH", { Jv
, BND
, cond_jump_flag
}, 0 },
2157 { "jaeH", { Jv
, BND
, cond_jump_flag
}, 0 },
2158 { "jeH", { Jv
, BND
, cond_jump_flag
}, 0 },
2159 { "jneH", { Jv
, BND
, cond_jump_flag
}, 0 },
2160 { "jbeH", { Jv
, BND
, cond_jump_flag
}, 0 },
2161 { "jaH", { Jv
, BND
, cond_jump_flag
}, 0 },
2163 { "jsH", { Jv
, BND
, cond_jump_flag
}, 0 },
2164 { "jnsH", { Jv
, BND
, cond_jump_flag
}, 0 },
2165 { "jpH", { Jv
, BND
, cond_jump_flag
}, 0 },
2166 { "jnpH", { Jv
, BND
, cond_jump_flag
}, 0 },
2167 { "jlH", { Jv
, BND
, cond_jump_flag
}, 0 },
2168 { "jgeH", { Jv
, BND
, cond_jump_flag
}, 0 },
2169 { "jleH", { Jv
, BND
, cond_jump_flag
}, 0 },
2170 { "jgH", { Jv
, BND
, cond_jump_flag
}, 0 },
2172 { "seto", { Eb
}, 0 },
2173 { "setno", { Eb
}, 0 },
2174 { "setb", { Eb
}, 0 },
2175 { "setae", { Eb
}, 0 },
2176 { "sete", { Eb
}, 0 },
2177 { "setne", { Eb
}, 0 },
2178 { "setbe", { Eb
}, 0 },
2179 { "seta", { Eb
}, 0 },
2181 { "sets", { Eb
}, 0 },
2182 { "setns", { Eb
}, 0 },
2183 { "setp", { Eb
}, 0 },
2184 { "setnp", { Eb
}, 0 },
2185 { "setl", { Eb
}, 0 },
2186 { "setge", { Eb
}, 0 },
2187 { "setle", { Eb
}, 0 },
2188 { "setg", { Eb
}, 0 },
2190 { "pushP", { fs
}, 0 },
2191 { "popP", { fs
}, 0 },
2192 { "cpuid", { XX
}, 0 },
2193 { "btS", { Ev
, Gv
}, 0 },
2194 { "shldS", { Ev
, Gv
, Ib
}, 0 },
2195 { "shldS", { Ev
, Gv
, CL
}, 0 },
2196 { REG_TABLE (REG_0FA6
) },
2197 { REG_TABLE (REG_0FA7
) },
2199 { "pushP", { gs
}, 0 },
2200 { "popP", { gs
}, 0 },
2201 { "rsm", { XX
}, 0 },
2202 { "btsS", { Evh1
, Gv
}, 0 },
2203 { "shrdS", { Ev
, Gv
, Ib
}, 0 },
2204 { "shrdS", { Ev
, Gv
, CL
}, 0 },
2205 { REG_TABLE (REG_0FAE
) },
2206 { "imulS", { Gv
, Ev
}, 0 },
2208 { "cmpxchgB", { Ebh1
, Gb
}, 0 },
2209 { "cmpxchgS", { Evh1
, Gv
}, 0 },
2210 { MOD_TABLE (MOD_0FB2
) },
2211 { "btrS", { Evh1
, Gv
}, 0 },
2212 { MOD_TABLE (MOD_0FB4
) },
2213 { MOD_TABLE (MOD_0FB5
) },
2214 { "movz{bR|x}", { Gv
, Eb
}, 0 },
2215 { "movz{wR|x}", { Gv
, Ew
}, 0 }, /* yes, there really is movzww ! */
2217 { PREFIX_TABLE (PREFIX_0FB8
) },
2218 { "ud1S", { Gv
, Ev
}, 0 },
2219 { REG_TABLE (REG_0FBA
) },
2220 { "btcS", { Evh1
, Gv
}, 0 },
2221 { PREFIX_TABLE (PREFIX_0FBC
) },
2222 { PREFIX_TABLE (PREFIX_0FBD
) },
2223 { "movs{bR|x}", { Gv
, Eb
}, 0 },
2224 { "movs{wR|x}", { Gv
, Ew
}, 0 }, /* yes, there really is movsww ! */
2226 { "xaddB", { Ebh1
, Gb
}, 0 },
2227 { "xaddS", { Evh1
, Gv
}, 0 },
2228 { PREFIX_TABLE (PREFIX_0FC2
) },
2229 { MOD_TABLE (MOD_0FC3
) },
2230 { "pinsrw", { MX
, Edqw
, Ib
}, PREFIX_OPCODE
},
2231 { "pextrw", { Gdq
, MS
, Ib
}, PREFIX_OPCODE
},
2232 { "shufpX", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
2233 { REG_TABLE (REG_0FC7
) },
2235 { "bswap", { RMeAX
}, 0 },
2236 { "bswap", { RMeCX
}, 0 },
2237 { "bswap", { RMeDX
}, 0 },
2238 { "bswap", { RMeBX
}, 0 },
2239 { "bswap", { RMeSP
}, 0 },
2240 { "bswap", { RMeBP
}, 0 },
2241 { "bswap", { RMeSI
}, 0 },
2242 { "bswap", { RMeDI
}, 0 },
2244 { PREFIX_TABLE (PREFIX_0FD0
) },
2245 { "psrlw", { MX
, EM
}, PREFIX_OPCODE
},
2246 { "psrld", { MX
, EM
}, PREFIX_OPCODE
},
2247 { "psrlq", { MX
, EM
}, PREFIX_OPCODE
},
2248 { "paddq", { MX
, EM
}, PREFIX_OPCODE
},
2249 { "pmullw", { MX
, EM
}, PREFIX_OPCODE
},
2250 { PREFIX_TABLE (PREFIX_0FD6
) },
2251 { MOD_TABLE (MOD_0FD7
) },
2253 { "psubusb", { MX
, EM
}, PREFIX_OPCODE
},
2254 { "psubusw", { MX
, EM
}, PREFIX_OPCODE
},
2255 { "pminub", { MX
, EM
}, PREFIX_OPCODE
},
2256 { "pand", { MX
, EM
}, PREFIX_OPCODE
},
2257 { "paddusb", { MX
, EM
}, PREFIX_OPCODE
},
2258 { "paddusw", { MX
, EM
}, PREFIX_OPCODE
},
2259 { "pmaxub", { MX
, EM
}, PREFIX_OPCODE
},
2260 { "pandn", { MX
, EM
}, PREFIX_OPCODE
},
2262 { "pavgb", { MX
, EM
}, PREFIX_OPCODE
},
2263 { "psraw", { MX
, EM
}, PREFIX_OPCODE
},
2264 { "psrad", { MX
, EM
}, PREFIX_OPCODE
},
2265 { "pavgw", { MX
, EM
}, PREFIX_OPCODE
},
2266 { "pmulhuw", { MX
, EM
}, PREFIX_OPCODE
},
2267 { "pmulhw", { MX
, EM
}, PREFIX_OPCODE
},
2268 { PREFIX_TABLE (PREFIX_0FE6
) },
2269 { PREFIX_TABLE (PREFIX_0FE7
) },
2271 { "psubsb", { MX
, EM
}, PREFIX_OPCODE
},
2272 { "psubsw", { MX
, EM
}, PREFIX_OPCODE
},
2273 { "pminsw", { MX
, EM
}, PREFIX_OPCODE
},
2274 { "por", { MX
, EM
}, PREFIX_OPCODE
},
2275 { "paddsb", { MX
, EM
}, PREFIX_OPCODE
},
2276 { "paddsw", { MX
, EM
}, PREFIX_OPCODE
},
2277 { "pmaxsw", { MX
, EM
}, PREFIX_OPCODE
},
2278 { "pxor", { MX
, EM
}, PREFIX_OPCODE
},
2280 { PREFIX_TABLE (PREFIX_0FF0
) },
2281 { "psllw", { MX
, EM
}, PREFIX_OPCODE
},
2282 { "pslld", { MX
, EM
}, PREFIX_OPCODE
},
2283 { "psllq", { MX
, EM
}, PREFIX_OPCODE
},
2284 { "pmuludq", { MX
, EM
}, PREFIX_OPCODE
},
2285 { "pmaddwd", { MX
, EM
}, PREFIX_OPCODE
},
2286 { "psadbw", { MX
, EM
}, PREFIX_OPCODE
},
2287 { PREFIX_TABLE (PREFIX_0FF7
) },
2289 { "psubb", { MX
, EM
}, PREFIX_OPCODE
},
2290 { "psubw", { MX
, EM
}, PREFIX_OPCODE
},
2291 { "psubd", { MX
, EM
}, PREFIX_OPCODE
},
2292 { "psubq", { MX
, EM
}, PREFIX_OPCODE
},
2293 { "paddb", { MX
, EM
}, PREFIX_OPCODE
},
2294 { "paddw", { MX
, EM
}, PREFIX_OPCODE
},
2295 { "paddd", { MX
, EM
}, PREFIX_OPCODE
},
2296 { "ud0S", { Gv
, Ev
}, 0 },
2299 static const unsigned char onebyte_has_modrm
[256] = {
2300 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2301 /* ------------------------------- */
2302 /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
2303 /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
2304 /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
2305 /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
2306 /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
2307 /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
2308 /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
2309 /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
2310 /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
2311 /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
2312 /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
2313 /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
2314 /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
2315 /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
2316 /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
2317 /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1 /* f0 */
2318 /* ------------------------------- */
2319 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2322 static const unsigned char twobyte_has_modrm
[256] = {
2323 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2324 /* ------------------------------- */
2325 /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
2326 /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
2327 /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
2328 /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
2329 /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
2330 /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
2331 /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
2332 /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
2333 /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
2334 /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
2335 /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
2336 /* b0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* bf */
2337 /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
2338 /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
2339 /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
2340 /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 /* ff */
2341 /* ------------------------------- */
2342 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2345 static char obuf
[100];
2347 static char *mnemonicendp
;
2348 static char scratchbuf
[100];
2349 static unsigned char *start_codep
;
2350 static unsigned char *insn_codep
;
2351 static unsigned char *codep
;
2352 static unsigned char *end_codep
;
2353 static int last_lock_prefix
;
2354 static int last_repz_prefix
;
2355 static int last_repnz_prefix
;
2356 static int last_data_prefix
;
2357 static int last_addr_prefix
;
2358 static int last_rex_prefix
;
2359 static int last_seg_prefix
;
2360 static int fwait_prefix
;
2361 /* The active segment register prefix. */
2362 static int active_seg_prefix
;
2363 #define MAX_CODE_LENGTH 15
2364 /* We can up to 14 prefixes since the maximum instruction length is
2366 static int all_prefixes
[MAX_CODE_LENGTH
- 1];
2367 static disassemble_info
*the_info
;
2375 static unsigned char need_modrm
;
2385 int register_specifier
;
2392 int mask_register_specifier
;
2398 static unsigned char need_vex
;
2406 /* If we are accessing mod/rm/reg without need_modrm set, then the
2407 values are stale. Hitting this abort likely indicates that you
2408 need to update onebyte_has_modrm or twobyte_has_modrm. */
2409 #define MODRM_CHECK if (!need_modrm) abort ()
2411 static const char **names64
;
2412 static const char **names32
;
2413 static const char **names16
;
2414 static const char **names8
;
2415 static const char **names8rex
;
2416 static const char **names_seg
;
2417 static const char *index64
;
2418 static const char *index32
;
2419 static const char **index16
;
2420 static const char **names_bnd
;
2422 static const char *intel_names64
[] = {
2423 "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
2424 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2426 static const char *intel_names32
[] = {
2427 "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
2428 "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
2430 static const char *intel_names16
[] = {
2431 "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
2432 "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
2434 static const char *intel_names8
[] = {
2435 "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
2437 static const char *intel_names8rex
[] = {
2438 "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
2439 "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
2441 static const char *intel_names_seg
[] = {
2442 "es", "cs", "ss", "ds", "fs", "gs", "?", "?",
2444 static const char *intel_index64
= "riz";
2445 static const char *intel_index32
= "eiz";
2446 static const char *intel_index16
[] = {
2447 "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
2450 static const char *att_names64
[] = {
2451 "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
2452 "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
2454 static const char *att_names32
[] = {
2455 "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
2456 "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
2458 static const char *att_names16
[] = {
2459 "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
2460 "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
2462 static const char *att_names8
[] = {
2463 "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
2465 static const char *att_names8rex
[] = {
2466 "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
2467 "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
2469 static const char *att_names_seg
[] = {
2470 "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
2472 static const char *att_index64
= "%riz";
2473 static const char *att_index32
= "%eiz";
2474 static const char *att_index16
[] = {
2475 "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
2478 static const char **names_mm
;
2479 static const char *intel_names_mm
[] = {
2480 "mm0", "mm1", "mm2", "mm3",
2481 "mm4", "mm5", "mm6", "mm7"
2483 static const char *att_names_mm
[] = {
2484 "%mm0", "%mm1", "%mm2", "%mm3",
2485 "%mm4", "%mm5", "%mm6", "%mm7"
2488 static const char *intel_names_bnd
[] = {
2489 "bnd0", "bnd1", "bnd2", "bnd3"
2492 static const char *att_names_bnd
[] = {
2493 "%bnd0", "%bnd1", "%bnd2", "%bnd3"
2496 static const char **names_xmm
;
2497 static const char *intel_names_xmm
[] = {
2498 "xmm0", "xmm1", "xmm2", "xmm3",
2499 "xmm4", "xmm5", "xmm6", "xmm7",
2500 "xmm8", "xmm9", "xmm10", "xmm11",
2501 "xmm12", "xmm13", "xmm14", "xmm15",
2502 "xmm16", "xmm17", "xmm18", "xmm19",
2503 "xmm20", "xmm21", "xmm22", "xmm23",
2504 "xmm24", "xmm25", "xmm26", "xmm27",
2505 "xmm28", "xmm29", "xmm30", "xmm31"
2507 static const char *att_names_xmm
[] = {
2508 "%xmm0", "%xmm1", "%xmm2", "%xmm3",
2509 "%xmm4", "%xmm5", "%xmm6", "%xmm7",
2510 "%xmm8", "%xmm9", "%xmm10", "%xmm11",
2511 "%xmm12", "%xmm13", "%xmm14", "%xmm15",
2512 "%xmm16", "%xmm17", "%xmm18", "%xmm19",
2513 "%xmm20", "%xmm21", "%xmm22", "%xmm23",
2514 "%xmm24", "%xmm25", "%xmm26", "%xmm27",
2515 "%xmm28", "%xmm29", "%xmm30", "%xmm31"
2518 static const char **names_ymm
;
2519 static const char *intel_names_ymm
[] = {
2520 "ymm0", "ymm1", "ymm2", "ymm3",
2521 "ymm4", "ymm5", "ymm6", "ymm7",
2522 "ymm8", "ymm9", "ymm10", "ymm11",
2523 "ymm12", "ymm13", "ymm14", "ymm15",
2524 "ymm16", "ymm17", "ymm18", "ymm19",
2525 "ymm20", "ymm21", "ymm22", "ymm23",
2526 "ymm24", "ymm25", "ymm26", "ymm27",
2527 "ymm28", "ymm29", "ymm30", "ymm31"
2529 static const char *att_names_ymm
[] = {
2530 "%ymm0", "%ymm1", "%ymm2", "%ymm3",
2531 "%ymm4", "%ymm5", "%ymm6", "%ymm7",
2532 "%ymm8", "%ymm9", "%ymm10", "%ymm11",
2533 "%ymm12", "%ymm13", "%ymm14", "%ymm15",
2534 "%ymm16", "%ymm17", "%ymm18", "%ymm19",
2535 "%ymm20", "%ymm21", "%ymm22", "%ymm23",
2536 "%ymm24", "%ymm25", "%ymm26", "%ymm27",
2537 "%ymm28", "%ymm29", "%ymm30", "%ymm31"
2540 static const char **names_zmm
;
2541 static const char *intel_names_zmm
[] = {
2542 "zmm0", "zmm1", "zmm2", "zmm3",
2543 "zmm4", "zmm5", "zmm6", "zmm7",
2544 "zmm8", "zmm9", "zmm10", "zmm11",
2545 "zmm12", "zmm13", "zmm14", "zmm15",
2546 "zmm16", "zmm17", "zmm18", "zmm19",
2547 "zmm20", "zmm21", "zmm22", "zmm23",
2548 "zmm24", "zmm25", "zmm26", "zmm27",
2549 "zmm28", "zmm29", "zmm30", "zmm31"
2551 static const char *att_names_zmm
[] = {
2552 "%zmm0", "%zmm1", "%zmm2", "%zmm3",
2553 "%zmm4", "%zmm5", "%zmm6", "%zmm7",
2554 "%zmm8", "%zmm9", "%zmm10", "%zmm11",
2555 "%zmm12", "%zmm13", "%zmm14", "%zmm15",
2556 "%zmm16", "%zmm17", "%zmm18", "%zmm19",
2557 "%zmm20", "%zmm21", "%zmm22", "%zmm23",
2558 "%zmm24", "%zmm25", "%zmm26", "%zmm27",
2559 "%zmm28", "%zmm29", "%zmm30", "%zmm31"
2562 static const char **names_tmm
;
2563 static const char *intel_names_tmm
[] = {
2564 "tmm0", "tmm1", "tmm2", "tmm3",
2565 "tmm4", "tmm5", "tmm6", "tmm7"
2567 static const char *att_names_tmm
[] = {
2568 "%tmm0", "%tmm1", "%tmm2", "%tmm3",
2569 "%tmm4", "%tmm5", "%tmm6", "%tmm7"
2572 static const char **names_mask
;
2573 static const char *intel_names_mask
[] = {
2574 "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7"
2576 static const char *att_names_mask
[] = {
2577 "%k0", "%k1", "%k2", "%k3", "%k4", "%k5", "%k6", "%k7"
2580 static const char *names_rounding
[] =
2588 static const struct dis386 reg_table
[][8] = {
2591 { "addA", { Ebh1
, Ib
}, 0 },
2592 { "orA", { Ebh1
, Ib
}, 0 },
2593 { "adcA", { Ebh1
, Ib
}, 0 },
2594 { "sbbA", { Ebh1
, Ib
}, 0 },
2595 { "andA", { Ebh1
, Ib
}, 0 },
2596 { "subA", { Ebh1
, Ib
}, 0 },
2597 { "xorA", { Ebh1
, Ib
}, 0 },
2598 { "cmpA", { Eb
, Ib
}, 0 },
2602 { "addQ", { Evh1
, Iv
}, 0 },
2603 { "orQ", { Evh1
, Iv
}, 0 },
2604 { "adcQ", { Evh1
, Iv
}, 0 },
2605 { "sbbQ", { Evh1
, Iv
}, 0 },
2606 { "andQ", { Evh1
, Iv
}, 0 },
2607 { "subQ", { Evh1
, Iv
}, 0 },
2608 { "xorQ", { Evh1
, Iv
}, 0 },
2609 { "cmpQ", { Ev
, Iv
}, 0 },
2613 { "addQ", { Evh1
, sIb
}, 0 },
2614 { "orQ", { Evh1
, sIb
}, 0 },
2615 { "adcQ", { Evh1
, sIb
}, 0 },
2616 { "sbbQ", { Evh1
, sIb
}, 0 },
2617 { "andQ", { Evh1
, sIb
}, 0 },
2618 { "subQ", { Evh1
, sIb
}, 0 },
2619 { "xorQ", { Evh1
, sIb
}, 0 },
2620 { "cmpQ", { Ev
, sIb
}, 0 },
2624 { "pop{P|}", { stackEv
}, 0 },
2625 { XOP_8F_TABLE (XOP_09
) },
2629 { XOP_8F_TABLE (XOP_09
) },
2633 { "rolA", { Eb
, Ib
}, 0 },
2634 { "rorA", { Eb
, Ib
}, 0 },
2635 { "rclA", { Eb
, Ib
}, 0 },
2636 { "rcrA", { Eb
, Ib
}, 0 },
2637 { "shlA", { Eb
, Ib
}, 0 },
2638 { "shrA", { Eb
, Ib
}, 0 },
2639 { "shlA", { Eb
, Ib
}, 0 },
2640 { "sarA", { Eb
, Ib
}, 0 },
2644 { "rolQ", { Ev
, Ib
}, 0 },
2645 { "rorQ", { Ev
, Ib
}, 0 },
2646 { "rclQ", { Ev
, Ib
}, 0 },
2647 { "rcrQ", { Ev
, Ib
}, 0 },
2648 { "shlQ", { Ev
, Ib
}, 0 },
2649 { "shrQ", { Ev
, Ib
}, 0 },
2650 { "shlQ", { Ev
, Ib
}, 0 },
2651 { "sarQ", { Ev
, Ib
}, 0 },
2655 { "movA", { Ebh3
, Ib
}, 0 },
2662 { MOD_TABLE (MOD_C6_REG_7
) },
2666 { "movQ", { Evh3
, Iv
}, 0 },
2673 { MOD_TABLE (MOD_C7_REG_7
) },
2677 { "rolA", { Eb
, I1
}, 0 },
2678 { "rorA", { Eb
, I1
}, 0 },
2679 { "rclA", { Eb
, I1
}, 0 },
2680 { "rcrA", { Eb
, I1
}, 0 },
2681 { "shlA", { Eb
, I1
}, 0 },
2682 { "shrA", { Eb
, I1
}, 0 },
2683 { "shlA", { Eb
, I1
}, 0 },
2684 { "sarA", { Eb
, I1
}, 0 },
2688 { "rolQ", { Ev
, I1
}, 0 },
2689 { "rorQ", { Ev
, I1
}, 0 },
2690 { "rclQ", { Ev
, I1
}, 0 },
2691 { "rcrQ", { Ev
, I1
}, 0 },
2692 { "shlQ", { Ev
, I1
}, 0 },
2693 { "shrQ", { Ev
, I1
}, 0 },
2694 { "shlQ", { Ev
, I1
}, 0 },
2695 { "sarQ", { Ev
, I1
}, 0 },
2699 { "rolA", { Eb
, CL
}, 0 },
2700 { "rorA", { Eb
, CL
}, 0 },
2701 { "rclA", { Eb
, CL
}, 0 },
2702 { "rcrA", { Eb
, CL
}, 0 },
2703 { "shlA", { Eb
, CL
}, 0 },
2704 { "shrA", { Eb
, CL
}, 0 },
2705 { "shlA", { Eb
, CL
}, 0 },
2706 { "sarA", { Eb
, CL
}, 0 },
2710 { "rolQ", { Ev
, CL
}, 0 },
2711 { "rorQ", { Ev
, CL
}, 0 },
2712 { "rclQ", { Ev
, CL
}, 0 },
2713 { "rcrQ", { Ev
, CL
}, 0 },
2714 { "shlQ", { Ev
, CL
}, 0 },
2715 { "shrQ", { Ev
, CL
}, 0 },
2716 { "shlQ", { Ev
, CL
}, 0 },
2717 { "sarQ", { Ev
, CL
}, 0 },
2721 { "testA", { Eb
, Ib
}, 0 },
2722 { "testA", { Eb
, Ib
}, 0 },
2723 { "notA", { Ebh1
}, 0 },
2724 { "negA", { Ebh1
}, 0 },
2725 { "mulA", { Eb
}, 0 }, /* Don't print the implicit %al register, */
2726 { "imulA", { Eb
}, 0 }, /* to distinguish these opcodes from other */
2727 { "divA", { Eb
}, 0 }, /* mul/imul opcodes. Do the same for div */
2728 { "idivA", { Eb
}, 0 }, /* and idiv for consistency. */
2732 { "testQ", { Ev
, Iv
}, 0 },
2733 { "testQ", { Ev
, Iv
}, 0 },
2734 { "notQ", { Evh1
}, 0 },
2735 { "negQ", { Evh1
}, 0 },
2736 { "mulQ", { Ev
}, 0 }, /* Don't print the implicit register. */
2737 { "imulQ", { Ev
}, 0 },
2738 { "divQ", { Ev
}, 0 },
2739 { "idivQ", { Ev
}, 0 },
2743 { "incA", { Ebh1
}, 0 },
2744 { "decA", { Ebh1
}, 0 },
2748 { "incQ", { Evh1
}, 0 },
2749 { "decQ", { Evh1
}, 0 },
2750 { "call{@|}", { NOTRACK
, indirEv
, BND
}, 0 },
2751 { MOD_TABLE (MOD_FF_REG_3
) },
2752 { "jmp{@|}", { NOTRACK
, indirEv
, BND
}, 0 },
2753 { MOD_TABLE (MOD_FF_REG_5
) },
2754 { "push{P|}", { stackEv
}, 0 },
2759 { "sldtD", { Sv
}, 0 },
2760 { "strD", { Sv
}, 0 },
2761 { "lldt", { Ew
}, 0 },
2762 { "ltr", { Ew
}, 0 },
2763 { "verr", { Ew
}, 0 },
2764 { "verw", { Ew
}, 0 },
2770 { MOD_TABLE (MOD_0F01_REG_0
) },
2771 { MOD_TABLE (MOD_0F01_REG_1
) },
2772 { MOD_TABLE (MOD_0F01_REG_2
) },
2773 { MOD_TABLE (MOD_0F01_REG_3
) },
2774 { "smswD", { Sv
}, 0 },
2775 { MOD_TABLE (MOD_0F01_REG_5
) },
2776 { "lmsw", { Ew
}, 0 },
2777 { MOD_TABLE (MOD_0F01_REG_7
) },
2781 { "prefetch", { Mb
}, 0 },
2782 { "prefetchw", { Mb
}, 0 },
2783 { "prefetchwt1", { Mb
}, 0 },
2784 { "prefetch", { Mb
}, 0 },
2785 { "prefetch", { Mb
}, 0 },
2786 { "prefetch", { Mb
}, 0 },
2787 { "prefetch", { Mb
}, 0 },
2788 { "prefetch", { Mb
}, 0 },
2792 { MOD_TABLE (MOD_0F18_REG_0
) },
2793 { MOD_TABLE (MOD_0F18_REG_1
) },
2794 { MOD_TABLE (MOD_0F18_REG_2
) },
2795 { MOD_TABLE (MOD_0F18_REG_3
) },
2796 { "nopQ", { Ev
}, 0 },
2797 { "nopQ", { Ev
}, 0 },
2798 { "nopQ", { Ev
}, 0 },
2799 { "nopQ", { Ev
}, 0 },
2801 /* REG_0F1C_P_0_MOD_0 */
2803 { "cldemote", { Mb
}, 0 },
2804 { "nopQ", { Ev
}, 0 },
2805 { "nopQ", { Ev
}, 0 },
2806 { "nopQ", { Ev
}, 0 },
2807 { "nopQ", { Ev
}, 0 },
2808 { "nopQ", { Ev
}, 0 },
2809 { "nopQ", { Ev
}, 0 },
2810 { "nopQ", { Ev
}, 0 },
2812 /* REG_0F1E_P_1_MOD_3 */
2814 { "nopQ", { Ev
}, PREFIX_IGNORED
},
2815 { "rdsspK", { Edq
}, 0 },
2816 { "nopQ", { Ev
}, PREFIX_IGNORED
},
2817 { "nopQ", { Ev
}, PREFIX_IGNORED
},
2818 { "nopQ", { Ev
}, PREFIX_IGNORED
},
2819 { "nopQ", { Ev
}, PREFIX_IGNORED
},
2820 { "nopQ", { Ev
}, PREFIX_IGNORED
},
2821 { RM_TABLE (RM_0F1E_P_1_MOD_3_REG_7
) },
2823 /* REG_0F38D8_PREFIX_1 */
2825 { "aesencwide128kl", { M
}, 0 },
2826 { "aesdecwide128kl", { M
}, 0 },
2827 { "aesencwide256kl", { M
}, 0 },
2828 { "aesdecwide256kl", { M
}, 0 },
2830 /* REG_0F3A0F_PREFIX_1_MOD_3 */
2832 { RM_TABLE (RM_0F3A0F_P_1_MOD_3_REG_0
) },
2834 /* REG_0F71_MOD_0 */
2838 { "psrlw", { MS
, Ib
}, PREFIX_OPCODE
},
2840 { "psraw", { MS
, Ib
}, PREFIX_OPCODE
},
2842 { "psllw", { MS
, Ib
}, PREFIX_OPCODE
},
2844 /* REG_0F72_MOD_0 */
2848 { "psrld", { MS
, Ib
}, PREFIX_OPCODE
},
2850 { "psrad", { MS
, Ib
}, PREFIX_OPCODE
},
2852 { "pslld", { MS
, Ib
}, PREFIX_OPCODE
},
2854 /* REG_0F73_MOD_0 */
2858 { "psrlq", { MS
, Ib
}, PREFIX_OPCODE
},
2859 { "psrldq", { XS
, Ib
}, PREFIX_DATA
},
2862 { "psllq", { MS
, Ib
}, PREFIX_OPCODE
},
2863 { "pslldq", { XS
, Ib
}, PREFIX_DATA
},
2867 { "montmul", { { OP_0f07
, 0 } }, 0 },
2868 { "xsha1", { { OP_0f07
, 0 } }, 0 },
2869 { "xsha256", { { OP_0f07
, 0 } }, 0 },
2873 { "xstore-rng", { { OP_0f07
, 0 } }, 0 },
2874 { "xcrypt-ecb", { { OP_0f07
, 0 } }, 0 },
2875 { "xcrypt-cbc", { { OP_0f07
, 0 } }, 0 },
2876 { "xcrypt-ctr", { { OP_0f07
, 0 } }, 0 },
2877 { "xcrypt-cfb", { { OP_0f07
, 0 } }, 0 },
2878 { "xcrypt-ofb", { { OP_0f07
, 0 } }, 0 },
2882 { MOD_TABLE (MOD_0FAE_REG_0
) },
2883 { MOD_TABLE (MOD_0FAE_REG_1
) },
2884 { MOD_TABLE (MOD_0FAE_REG_2
) },
2885 { MOD_TABLE (MOD_0FAE_REG_3
) },
2886 { MOD_TABLE (MOD_0FAE_REG_4
) },
2887 { MOD_TABLE (MOD_0FAE_REG_5
) },
2888 { MOD_TABLE (MOD_0FAE_REG_6
) },
2889 { MOD_TABLE (MOD_0FAE_REG_7
) },
2897 { "btQ", { Ev
, Ib
}, 0 },
2898 { "btsQ", { Evh1
, Ib
}, 0 },
2899 { "btrQ", { Evh1
, Ib
}, 0 },
2900 { "btcQ", { Evh1
, Ib
}, 0 },
2905 { "cmpxchg8b", { { CMPXCHG8B_Fixup
, q_mode
} }, 0 },
2907 { MOD_TABLE (MOD_0FC7_REG_3
) },
2908 { MOD_TABLE (MOD_0FC7_REG_4
) },
2909 { MOD_TABLE (MOD_0FC7_REG_5
) },
2910 { MOD_TABLE (MOD_0FC7_REG_6
) },
2911 { MOD_TABLE (MOD_0FC7_REG_7
) },
2913 /* REG_VEX_0F71_M_0 */
2917 { "vpsrlw", { Vex
, XS
, Ib
}, PREFIX_DATA
},
2919 { "vpsraw", { Vex
, XS
, Ib
}, PREFIX_DATA
},
2921 { "vpsllw", { Vex
, XS
, Ib
}, PREFIX_DATA
},
2923 /* REG_VEX_0F72_M_0 */
2927 { "vpsrld", { Vex
, XS
, Ib
}, PREFIX_DATA
},
2929 { "vpsrad", { Vex
, XS
, Ib
}, PREFIX_DATA
},
2931 { "vpslld", { Vex
, XS
, Ib
}, PREFIX_DATA
},
2933 /* REG_VEX_0F73_M_0 */
2937 { "vpsrlq", { Vex
, XS
, Ib
}, PREFIX_DATA
},
2938 { "vpsrldq", { Vex
, XS
, Ib
}, PREFIX_DATA
},
2941 { "vpsllq", { Vex
, XS
, Ib
}, PREFIX_DATA
},
2942 { "vpslldq", { Vex
, XS
, Ib
}, PREFIX_DATA
},
2948 { MOD_TABLE (MOD_VEX_0FAE_REG_2
) },
2949 { MOD_TABLE (MOD_VEX_0FAE_REG_3
) },
2951 /* REG_VEX_0F3849_X86_64_P_0_W_0_M_1 */
2953 { RM_TABLE (RM_VEX_0F3849_X86_64_P_0_W_0_M_1_R_0
) },
2955 /* REG_VEX_0F38F3_L_0 */
2958 { "blsrS", { VexGdq
, Edq
}, PREFIX_OPCODE
},
2959 { "blsmskS", { VexGdq
, Edq
}, PREFIX_OPCODE
},
2960 { "blsiS", { VexGdq
, Edq
}, PREFIX_OPCODE
},
2962 /* REG_0FXOP_09_01_L_0 */
2965 { "blcfill", { VexGdq
, Edq
}, 0 },
2966 { "blsfill", { VexGdq
, Edq
}, 0 },
2967 { "blcs", { VexGdq
, Edq
}, 0 },
2968 { "tzmsk", { VexGdq
, Edq
}, 0 },
2969 { "blcic", { VexGdq
, Edq
}, 0 },
2970 { "blsic", { VexGdq
, Edq
}, 0 },
2971 { "t1mskc", { VexGdq
, Edq
}, 0 },
2973 /* REG_0FXOP_09_02_L_0 */
2976 { "blcmsk", { VexGdq
, Edq
}, 0 },
2981 { "blci", { VexGdq
, Edq
}, 0 },
2983 /* REG_0FXOP_09_12_M_1_L_0 */
2985 { "llwpcb", { Edq
}, 0 },
2986 { "slwpcb", { Edq
}, 0 },
2988 /* REG_0FXOP_0A_12_L_0 */
2990 { "lwpins", { VexGdq
, Ed
, Id
}, 0 },
2991 { "lwpval", { VexGdq
, Ed
, Id
}, 0 },
2994 #include "i386-dis-evex-reg.h"
2997 static const struct dis386 prefix_table
[][4] = {
3000 { "xchgS", { { NOP_Fixup1
, eAX_reg
}, { NOP_Fixup2
, eAX_reg
} }, 0 },
3001 { "pause", { XX
}, 0 },
3002 { "xchgS", { { NOP_Fixup1
, eAX_reg
}, { NOP_Fixup2
, eAX_reg
} }, 0 },
3003 { NULL
, { { NULL
, 0 } }, PREFIX_IGNORED
}
3006 /* PREFIX_0F01_REG_1_RM_4 */
3010 { "tdcall", { Skip_MODRM
}, 0 },
3014 /* PREFIX_0F01_REG_1_RM_5 */
3018 { X86_64_TABLE (X86_64_0F01_REG_1_RM_5_PREFIX_2
) },
3022 /* PREFIX_0F01_REG_1_RM_6 */
3026 { X86_64_TABLE (X86_64_0F01_REG_1_RM_6_PREFIX_2
) },
3030 /* PREFIX_0F01_REG_1_RM_7 */
3032 { "encls", { Skip_MODRM
}, 0 },
3034 { X86_64_TABLE (X86_64_0F01_REG_1_RM_7_PREFIX_2
) },
3038 /* PREFIX_0F01_REG_3_RM_1 */
3040 { "vmmcall", { Skip_MODRM
}, 0 },
3041 { "vmgexit", { Skip_MODRM
}, 0 },
3043 { "vmgexit", { Skip_MODRM
}, 0 },
3046 /* PREFIX_0F01_REG_5_MOD_0 */
3049 { "rstorssp", { Mq
}, PREFIX_OPCODE
},
3052 /* PREFIX_0F01_REG_5_MOD_3_RM_0 */
3054 { "serialize", { Skip_MODRM
}, PREFIX_OPCODE
},
3055 { "setssbsy", { Skip_MODRM
}, PREFIX_OPCODE
},
3057 { "xsusldtrk", { Skip_MODRM
}, PREFIX_OPCODE
},
3060 /* PREFIX_0F01_REG_5_MOD_3_RM_1 */
3065 { "xresldtrk", { Skip_MODRM
}, PREFIX_OPCODE
},
3068 /* PREFIX_0F01_REG_5_MOD_3_RM_2 */
3071 { "saveprevssp", { Skip_MODRM
}, PREFIX_OPCODE
},
3074 /* PREFIX_0F01_REG_5_MOD_3_RM_4 */
3077 { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_4_PREFIX_1
) },
3080 /* PREFIX_0F01_REG_5_MOD_3_RM_5 */
3083 { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_5_PREFIX_1
) },
3086 /* PREFIX_0F01_REG_5_MOD_3_RM_6 */
3088 { "rdpkru", { Skip_MODRM
}, 0 },
3089 { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_6_PREFIX_1
) },
3092 /* PREFIX_0F01_REG_5_MOD_3_RM_7 */
3094 { "wrpkru", { Skip_MODRM
}, 0 },
3095 { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_7_PREFIX_1
) },
3098 /* PREFIX_0F01_REG_7_MOD_3_RM_2 */
3100 { "monitorx", { { OP_Monitor
, 0 } }, 0 },
3101 { "mcommit", { Skip_MODRM
}, 0 },
3104 /* PREFIX_0F01_REG_7_MOD_3_RM_6 */
3106 { "invlpgb", { Skip_MODRM
}, 0 },
3107 { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_1
) },
3109 { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3
) },
3112 /* PREFIX_0F01_REG_7_MOD_3_RM_7 */
3114 { "tlbsync", { Skip_MODRM
}, 0 },
3115 { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_7_PREFIX_1
) },
3117 { "pvalidate", { Skip_MODRM
}, 0 },
3122 { "wbinvd", { XX
}, 0 },
3123 { "wbnoinvd", { XX
}, 0 },
3128 { "movups", { XM
, EXx
}, PREFIX_OPCODE
},
3129 { "movss", { XM
, EXd
}, PREFIX_OPCODE
},
3130 { "movupd", { XM
, EXx
}, PREFIX_OPCODE
},
3131 { "movsd", { XM
, EXq
}, PREFIX_OPCODE
},
3136 { "movups", { EXxS
, XM
}, PREFIX_OPCODE
},
3137 { "movss", { EXdS
, XM
}, PREFIX_OPCODE
},
3138 { "movupd", { EXxS
, XM
}, PREFIX_OPCODE
},
3139 { "movsd", { EXqS
, XM
}, PREFIX_OPCODE
},
3144 { MOD_TABLE (MOD_0F12_PREFIX_0
) },
3145 { "movsldup", { XM
, EXx
}, PREFIX_OPCODE
},
3146 { MOD_TABLE (MOD_0F12_PREFIX_2
) },
3147 { "movddup", { XM
, EXq
}, PREFIX_OPCODE
},
3152 { MOD_TABLE (MOD_0F16_PREFIX_0
) },
3153 { "movshdup", { XM
, EXx
}, PREFIX_OPCODE
},
3154 { MOD_TABLE (MOD_0F16_PREFIX_2
) },
3159 { MOD_TABLE (MOD_0F1A_PREFIX_0
) },
3160 { "bndcl", { Gbnd
, Ev_bnd
}, 0 },
3161 { "bndmov", { Gbnd
, Ebnd
}, 0 },
3162 { "bndcu", { Gbnd
, Ev_bnd
}, 0 },
3167 { MOD_TABLE (MOD_0F1B_PREFIX_0
) },
3168 { MOD_TABLE (MOD_0F1B_PREFIX_1
) },
3169 { "bndmov", { EbndS
, Gbnd
}, 0 },
3170 { "bndcn", { Gbnd
, Ev_bnd
}, 0 },
3175 { MOD_TABLE (MOD_0F1C_PREFIX_0
) },
3176 { "nopQ", { Ev
}, PREFIX_IGNORED
},
3177 { "nopQ", { Ev
}, 0 },
3178 { "nopQ", { Ev
}, PREFIX_IGNORED
},
3183 { "nopQ", { Ev
}, 0 },
3184 { MOD_TABLE (MOD_0F1E_PREFIX_1
) },
3185 { "nopQ", { Ev
}, 0 },
3186 { NULL
, { XX
}, PREFIX_IGNORED
},
3191 { "cvtpi2ps", { XM
, EMCq
}, PREFIX_OPCODE
},
3192 { "cvtsi2ss{%LQ|}", { XM
, Edq
}, PREFIX_OPCODE
},
3193 { "cvtpi2pd", { XM
, EMCq
}, PREFIX_OPCODE
},
3194 { "cvtsi2sd{%LQ|}", { XM
, Edq
}, 0 },
3199 { MOD_TABLE (MOD_0F2B_PREFIX_0
) },
3200 { MOD_TABLE (MOD_0F2B_PREFIX_1
) },
3201 { MOD_TABLE (MOD_0F2B_PREFIX_2
) },
3202 { MOD_TABLE (MOD_0F2B_PREFIX_3
) },
3207 { "cvttps2pi", { MXC
, EXq
}, PREFIX_OPCODE
},
3208 { "cvttss2si", { Gdq
, EXd
}, PREFIX_OPCODE
},
3209 { "cvttpd2pi", { MXC
, EXx
}, PREFIX_OPCODE
},
3210 { "cvttsd2si", { Gdq
, EXq
}, PREFIX_OPCODE
},
3215 { "cvtps2pi", { MXC
, EXq
}, PREFIX_OPCODE
},
3216 { "cvtss2si", { Gdq
, EXd
}, PREFIX_OPCODE
},
3217 { "cvtpd2pi", { MXC
, EXx
}, PREFIX_OPCODE
},
3218 { "cvtsd2si", { Gdq
, EXq
}, PREFIX_OPCODE
},
3223 { "ucomiss",{ XM
, EXd
}, 0 },
3225 { "ucomisd",{ XM
, EXq
}, 0 },
3230 { "comiss", { XM
, EXd
}, 0 },
3232 { "comisd", { XM
, EXq
}, 0 },
3237 { "sqrtps", { XM
, EXx
}, PREFIX_OPCODE
},
3238 { "sqrtss", { XM
, EXd
}, PREFIX_OPCODE
},
3239 { "sqrtpd", { XM
, EXx
}, PREFIX_OPCODE
},
3240 { "sqrtsd", { XM
, EXq
}, PREFIX_OPCODE
},
3245 { "rsqrtps",{ XM
, EXx
}, PREFIX_OPCODE
},
3246 { "rsqrtss",{ XM
, EXd
}, PREFIX_OPCODE
},
3251 { "rcpps", { XM
, EXx
}, PREFIX_OPCODE
},
3252 { "rcpss", { XM
, EXd
}, PREFIX_OPCODE
},
3257 { "addps", { XM
, EXx
}, PREFIX_OPCODE
},
3258 { "addss", { XM
, EXd
}, PREFIX_OPCODE
},
3259 { "addpd", { XM
, EXx
}, PREFIX_OPCODE
},
3260 { "addsd", { XM
, EXq
}, PREFIX_OPCODE
},
3265 { "mulps", { XM
, EXx
}, PREFIX_OPCODE
},
3266 { "mulss", { XM
, EXd
}, PREFIX_OPCODE
},
3267 { "mulpd", { XM
, EXx
}, PREFIX_OPCODE
},
3268 { "mulsd", { XM
, EXq
}, PREFIX_OPCODE
},
3273 { "cvtps2pd", { XM
, EXq
}, PREFIX_OPCODE
},
3274 { "cvtss2sd", { XM
, EXd
}, PREFIX_OPCODE
},
3275 { "cvtpd2ps", { XM
, EXx
}, PREFIX_OPCODE
},
3276 { "cvtsd2ss", { XM
, EXq
}, PREFIX_OPCODE
},
3281 { "cvtdq2ps", { XM
, EXx
}, PREFIX_OPCODE
},
3282 { "cvttps2dq", { XM
, EXx
}, PREFIX_OPCODE
},
3283 { "cvtps2dq", { XM
, EXx
}, PREFIX_OPCODE
},
3288 { "subps", { XM
, EXx
}, PREFIX_OPCODE
},
3289 { "subss", { XM
, EXd
}, PREFIX_OPCODE
},
3290 { "subpd", { XM
, EXx
}, PREFIX_OPCODE
},
3291 { "subsd", { XM
, EXq
}, PREFIX_OPCODE
},
3296 { "minps", { XM
, EXx
}, PREFIX_OPCODE
},
3297 { "minss", { XM
, EXd
}, PREFIX_OPCODE
},
3298 { "minpd", { XM
, EXx
}, PREFIX_OPCODE
},
3299 { "minsd", { XM
, EXq
}, PREFIX_OPCODE
},
3304 { "divps", { XM
, EXx
}, PREFIX_OPCODE
},
3305 { "divss", { XM
, EXd
}, PREFIX_OPCODE
},
3306 { "divpd", { XM
, EXx
}, PREFIX_OPCODE
},
3307 { "divsd", { XM
, EXq
}, PREFIX_OPCODE
},
3312 { "maxps", { XM
, EXx
}, PREFIX_OPCODE
},
3313 { "maxss", { XM
, EXd
}, PREFIX_OPCODE
},
3314 { "maxpd", { XM
, EXx
}, PREFIX_OPCODE
},
3315 { "maxsd", { XM
, EXq
}, PREFIX_OPCODE
},
3320 { "punpcklbw",{ MX
, EMd
}, PREFIX_OPCODE
},
3322 { "punpcklbw",{ MX
, EMx
}, PREFIX_OPCODE
},
3327 { "punpcklwd",{ MX
, EMd
}, PREFIX_OPCODE
},
3329 { "punpcklwd",{ MX
, EMx
}, PREFIX_OPCODE
},
3334 { "punpckldq",{ MX
, EMd
}, PREFIX_OPCODE
},
3336 { "punpckldq",{ MX
, EMx
}, PREFIX_OPCODE
},
3341 { "movq", { MX
, EM
}, PREFIX_OPCODE
},
3342 { "movdqu", { XM
, EXx
}, PREFIX_OPCODE
},
3343 { "movdqa", { XM
, EXx
}, PREFIX_OPCODE
},
3348 { "pshufw", { MX
, EM
, Ib
}, PREFIX_OPCODE
},
3349 { "pshufhw",{ XM
, EXx
, Ib
}, PREFIX_OPCODE
},
3350 { "pshufd", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
3351 { "pshuflw",{ XM
, EXx
, Ib
}, PREFIX_OPCODE
},
3356 {"vmread", { Em
, Gm
}, 0 },
3358 {"extrq", { XS
, Ib
, Ib
}, 0 },
3359 {"insertq", { XM
, XS
, Ib
, Ib
}, 0 },
3364 {"vmwrite", { Gm
, Em
}, 0 },
3366 {"extrq", { XM
, XS
}, 0 },
3367 {"insertq", { XM
, XS
}, 0 },
3374 { "haddpd", { XM
, EXx
}, PREFIX_OPCODE
},
3375 { "haddps", { XM
, EXx
}, PREFIX_OPCODE
},
3382 { "hsubpd", { XM
, EXx
}, PREFIX_OPCODE
},
3383 { "hsubps", { XM
, EXx
}, PREFIX_OPCODE
},
3388 { "movK", { Edq
, MX
}, PREFIX_OPCODE
},
3389 { "movq", { XM
, EXq
}, PREFIX_OPCODE
},
3390 { "movK", { Edq
, XM
}, PREFIX_OPCODE
},
3395 { "movq", { EMS
, MX
}, PREFIX_OPCODE
},
3396 { "movdqu", { EXxS
, XM
}, PREFIX_OPCODE
},
3397 { "movdqa", { EXxS
, XM
}, PREFIX_OPCODE
},
3400 /* PREFIX_0FAE_REG_0_MOD_3 */
3403 { "rdfsbase", { Ev
}, 0 },
3406 /* PREFIX_0FAE_REG_1_MOD_3 */
3409 { "rdgsbase", { Ev
}, 0 },
3412 /* PREFIX_0FAE_REG_2_MOD_3 */
3415 { "wrfsbase", { Ev
}, 0 },
3418 /* PREFIX_0FAE_REG_3_MOD_3 */
3421 { "wrgsbase", { Ev
}, 0 },
3424 /* PREFIX_0FAE_REG_4_MOD_0 */
3426 { "xsave", { FXSAVE
}, 0 },
3427 { "ptwrite{%LQ|}", { Edq
}, 0 },
3430 /* PREFIX_0FAE_REG_4_MOD_3 */
3433 { "ptwrite{%LQ|}", { Edq
}, 0 },
3436 /* PREFIX_0FAE_REG_5_MOD_3 */
3438 { "lfence", { Skip_MODRM
}, 0 },
3439 { "incsspK", { Edq
}, PREFIX_OPCODE
},
3442 /* PREFIX_0FAE_REG_6_MOD_0 */
3444 { "xsaveopt", { FXSAVE
}, PREFIX_OPCODE
},
3445 { "clrssbsy", { Mq
}, PREFIX_OPCODE
},
3446 { "clwb", { Mb
}, PREFIX_OPCODE
},
3449 /* PREFIX_0FAE_REG_6_MOD_3 */
3451 { RM_TABLE (RM_0FAE_REG_6_MOD_3_P_0
) },
3452 { "umonitor", { Eva
}, PREFIX_OPCODE
},
3453 { "tpause", { Edq
}, PREFIX_OPCODE
},
3454 { "umwait", { Edq
}, PREFIX_OPCODE
},
3457 /* PREFIX_0FAE_REG_7_MOD_0 */
3459 { "clflush", { Mb
}, 0 },
3461 { "clflushopt", { Mb
}, 0 },
3467 { "popcntS", { Gv
, Ev
}, 0 },
3472 { "bsfS", { Gv
, Ev
}, 0 },
3473 { "tzcntS", { Gv
, Ev
}, 0 },
3474 { "bsfS", { Gv
, Ev
}, 0 },
3479 { "bsrS", { Gv
, Ev
}, 0 },
3480 { "lzcntS", { Gv
, Ev
}, 0 },
3481 { "bsrS", { Gv
, Ev
}, 0 },
3486 { "cmpps", { XM
, EXx
, CMP
}, PREFIX_OPCODE
},
3487 { "cmpss", { XM
, EXd
, CMP
}, PREFIX_OPCODE
},
3488 { "cmppd", { XM
, EXx
, CMP
}, PREFIX_OPCODE
},
3489 { "cmpsd", { XM
, EXq
, CMP
}, PREFIX_OPCODE
},
3492 /* PREFIX_0FC7_REG_6_MOD_0 */
3494 { "vmptrld",{ Mq
}, 0 },
3495 { "vmxon", { Mq
}, 0 },
3496 { "vmclear",{ Mq
}, 0 },
3499 /* PREFIX_0FC7_REG_6_MOD_3 */
3501 { "rdrand", { Ev
}, 0 },
3502 { X86_64_TABLE (X86_64_0FC7_REG_6_MOD_3_PREFIX_1
) },
3503 { "rdrand", { Ev
}, 0 }
3506 /* PREFIX_0FC7_REG_7_MOD_3 */
3508 { "rdseed", { Ev
}, 0 },
3509 { "rdpid", { Em
}, 0 },
3510 { "rdseed", { Ev
}, 0 },
3517 { "addsubpd", { XM
, EXx
}, 0 },
3518 { "addsubps", { XM
, EXx
}, 0 },
3524 { "movq2dq",{ XM
, MS
}, 0 },
3525 { "movq", { EXqS
, XM
}, 0 },
3526 { "movdq2q",{ MX
, XS
}, 0 },
3532 { "cvtdq2pd", { XM
, EXq
}, PREFIX_OPCODE
},
3533 { "cvttpd2dq", { XM
, EXx
}, PREFIX_OPCODE
},
3534 { "cvtpd2dq", { XM
, EXx
}, PREFIX_OPCODE
},
3539 { "movntq", { Mq
, MX
}, PREFIX_OPCODE
},
3541 { MOD_TABLE (MOD_0FE7_PREFIX_2
) },
3549 { MOD_TABLE (MOD_0FF0_PREFIX_3
) },
3554 { "maskmovq", { MX
, MS
}, PREFIX_OPCODE
},
3556 { "maskmovdqu", { XM
, XS
}, PREFIX_OPCODE
},
3562 { REG_TABLE (REG_0F38D8_PREFIX_1
) },
3568 { MOD_TABLE (MOD_0F38DC_PREFIX_1
) },
3569 { "aesenc", { XM
, EXx
}, 0 },
3575 { MOD_TABLE (MOD_0F38DD_PREFIX_1
) },
3576 { "aesenclast", { XM
, EXx
}, 0 },
3582 { MOD_TABLE (MOD_0F38DE_PREFIX_1
) },
3583 { "aesdec", { XM
, EXx
}, 0 },
3589 { MOD_TABLE (MOD_0F38DF_PREFIX_1
) },
3590 { "aesdeclast", { XM
, EXx
}, 0 },
3595 { "movbeS", { Gv
, Mv
}, PREFIX_OPCODE
},
3597 { "movbeS", { Gv
, Mv
}, PREFIX_OPCODE
},
3598 { "crc32A", { Gdq
, Eb
}, PREFIX_OPCODE
},
3603 { "movbeS", { Mv
, Gv
}, PREFIX_OPCODE
},
3605 { "movbeS", { Mv
, Gv
}, PREFIX_OPCODE
},
3606 { "crc32Q", { Gdq
, Ev
}, PREFIX_OPCODE
},
3611 { MOD_TABLE (MOD_0F38F6_PREFIX_0
) },
3612 { "adoxS", { Gdq
, Edq
}, PREFIX_OPCODE
},
3613 { "adcxS", { Gdq
, Edq
}, PREFIX_OPCODE
},
3620 { MOD_TABLE (MOD_0F38F8_PREFIX_1
) },
3621 { MOD_TABLE (MOD_0F38F8_PREFIX_2
) },
3622 { MOD_TABLE (MOD_0F38F8_PREFIX_3
) },
3627 { MOD_TABLE (MOD_0F38FA_PREFIX_1
) },
3633 { MOD_TABLE (MOD_0F38FB_PREFIX_1
) },
3639 { MOD_TABLE (MOD_0F3A0F_PREFIX_1
)},
3642 /* PREFIX_VEX_0F10 */
3644 { "vmovups", { XM
, EXx
}, 0 },
3645 { "vmovss", { XMScalar
, VexScalarR
, EXxmm_md
}, 0 },
3646 { "vmovupd", { XM
, EXx
}, 0 },
3647 { "vmovsd", { XMScalar
, VexScalarR
, EXxmm_mq
}, 0 },
3650 /* PREFIX_VEX_0F11 */
3652 { "vmovups", { EXxS
, XM
}, 0 },
3653 { "vmovss", { EXdS
, VexScalarR
, XMScalar
}, 0 },
3654 { "vmovupd", { EXxS
, XM
}, 0 },
3655 { "vmovsd", { EXqS
, VexScalarR
, XMScalar
}, 0 },
3658 /* PREFIX_VEX_0F12 */
3660 { MOD_TABLE (MOD_VEX_0F12_PREFIX_0
) },
3661 { "vmovsldup", { XM
, EXx
}, 0 },
3662 { MOD_TABLE (MOD_VEX_0F12_PREFIX_2
) },
3663 { "vmovddup", { XM
, EXymmq
}, 0 },
3666 /* PREFIX_VEX_0F16 */
3668 { MOD_TABLE (MOD_VEX_0F16_PREFIX_0
) },
3669 { "vmovshdup", { XM
, EXx
}, 0 },
3670 { MOD_TABLE (MOD_VEX_0F16_PREFIX_2
) },
3673 /* PREFIX_VEX_0F2A */
3676 { "vcvtsi2ss{%LQ|}", { XMScalar
, VexScalar
, Edq
}, 0 },
3678 { "vcvtsi2sd{%LQ|}", { XMScalar
, VexScalar
, Edq
}, 0 },
3681 /* PREFIX_VEX_0F2C */
3684 { "vcvttss2si", { Gdq
, EXxmm_md
, EXxEVexS
}, 0 },
3686 { "vcvttsd2si", { Gdq
, EXxmm_mq
, EXxEVexS
}, 0 },
3689 /* PREFIX_VEX_0F2D */
3692 { "vcvtss2si", { Gdq
, EXxmm_md
, EXxEVexR
}, 0 },
3694 { "vcvtsd2si", { Gdq
, EXxmm_mq
, EXxEVexR
}, 0 },
3697 /* PREFIX_VEX_0F2E */
3699 { "vucomisX", { XMScalar
, EXxmm_md
, EXxEVexS
}, PREFIX_OPCODE
},
3701 { "vucomisX", { XMScalar
, EXxmm_mq
, EXxEVexS
}, PREFIX_OPCODE
},
3704 /* PREFIX_VEX_0F2F */
3706 { "vcomisX", { XMScalar
, EXxmm_md
, EXxEVexS
}, PREFIX_OPCODE
},
3708 { "vcomisX", { XMScalar
, EXxmm_mq
, EXxEVexS
}, PREFIX_OPCODE
},
3711 /* PREFIX_VEX_0F41_L_1_M_1_W_0 */
3713 { "kandw", { MaskG
, MaskVex
, MaskE
}, 0 },
3715 { "kandb", { MaskG
, MaskVex
, MaskE
}, 0 },
3718 /* PREFIX_VEX_0F41_L_1_M_1_W_1 */
3720 { "kandq", { MaskG
, MaskVex
, MaskE
}, 0 },
3722 { "kandd", { MaskG
, MaskVex
, MaskE
}, 0 },
3725 /* PREFIX_VEX_0F42_L_1_M_1_W_0 */
3727 { "kandnw", { MaskG
, MaskVex
, MaskE
}, 0 },
3729 { "kandnb", { MaskG
, MaskVex
, MaskE
}, 0 },
3732 /* PREFIX_VEX_0F42_L_1_M_1_W_1 */
3734 { "kandnq", { MaskG
, MaskVex
, MaskE
}, 0 },
3736 { "kandnd", { MaskG
, MaskVex
, MaskE
}, 0 },
3739 /* PREFIX_VEX_0F44_L_0_M_1_W_0 */
3741 { "knotw", { MaskG
, MaskE
}, 0 },
3743 { "knotb", { MaskG
, MaskE
}, 0 },
3746 /* PREFIX_VEX_0F44_L_0_M_1_W_1 */
3748 { "knotq", { MaskG
, MaskE
}, 0 },
3750 { "knotd", { MaskG
, MaskE
}, 0 },
3753 /* PREFIX_VEX_0F45_L_1_M_1_W_0 */
3755 { "korw", { MaskG
, MaskVex
, MaskE
}, 0 },
3757 { "korb", { MaskG
, MaskVex
, MaskE
}, 0 },
3760 /* PREFIX_VEX_0F45_L_1_M_1_W_1 */
3762 { "korq", { MaskG
, MaskVex
, MaskE
}, 0 },
3764 { "kord", { MaskG
, MaskVex
, MaskE
}, 0 },
3767 /* PREFIX_VEX_0F46_L_1_M_1_W_0 */
3769 { "kxnorw", { MaskG
, MaskVex
, MaskE
}, 0 },
3771 { "kxnorb", { MaskG
, MaskVex
, MaskE
}, 0 },
3774 /* PREFIX_VEX_0F46_L_1_M_1_W_1 */
3776 { "kxnorq", { MaskG
, MaskVex
, MaskE
}, 0 },
3778 { "kxnord", { MaskG
, MaskVex
, MaskE
}, 0 },
3781 /* PREFIX_VEX_0F47_L_1_M_1_W_0 */
3783 { "kxorw", { MaskG
, MaskVex
, MaskE
}, 0 },
3785 { "kxorb", { MaskG
, MaskVex
, MaskE
}, 0 },
3788 /* PREFIX_VEX_0F47_L_1_M_1_W_1 */
3790 { "kxorq", { MaskG
, MaskVex
, MaskE
}, 0 },
3792 { "kxord", { MaskG
, MaskVex
, MaskE
}, 0 },
3795 /* PREFIX_VEX_0F4A_L_1_M_1_W_0 */
3797 { "kaddw", { MaskG
, MaskVex
, MaskE
}, 0 },
3799 { "kaddb", { MaskG
, MaskVex
, MaskE
}, 0 },
3802 /* PREFIX_VEX_0F4A_L_1_M_1_W_1 */
3804 { "kaddq", { MaskG
, MaskVex
, MaskE
}, 0 },
3806 { "kaddd", { MaskG
, MaskVex
, MaskE
}, 0 },
3809 /* PREFIX_VEX_0F4B_L_1_M_1_W_0 */
3811 { "kunpckwd", { MaskG
, MaskVex
, MaskE
}, 0 },
3813 { "kunpckbw", { MaskG
, MaskVex
, MaskE
}, 0 },
3816 /* PREFIX_VEX_0F4B_L_1_M_1_W_1 */
3818 { "kunpckdq", { MaskG
, MaskVex
, MaskE
}, 0 },
3821 /* PREFIX_VEX_0F51 */
3823 { "vsqrtps", { XM
, EXx
}, 0 },
3824 { "vsqrtss", { XMScalar
, VexScalar
, EXxmm_md
}, 0 },
3825 { "vsqrtpd", { XM
, EXx
}, 0 },
3826 { "vsqrtsd", { XMScalar
, VexScalar
, EXxmm_mq
}, 0 },
3829 /* PREFIX_VEX_0F52 */
3831 { "vrsqrtps", { XM
, EXx
}, 0 },
3832 { "vrsqrtss", { XMScalar
, VexScalar
, EXxmm_md
}, 0 },
3835 /* PREFIX_VEX_0F53 */
3837 { "vrcpps", { XM
, EXx
}, 0 },
3838 { "vrcpss", { XMScalar
, VexScalar
, EXxmm_md
}, 0 },
3841 /* PREFIX_VEX_0F58 */
3843 { "vaddps", { XM
, Vex
, EXx
}, 0 },
3844 { "vaddss", { XMScalar
, VexScalar
, EXxmm_md
}, 0 },
3845 { "vaddpd", { XM
, Vex
, EXx
}, 0 },
3846 { "vaddsd", { XMScalar
, VexScalar
, EXxmm_mq
}, 0 },
3849 /* PREFIX_VEX_0F59 */
3851 { "vmulps", { XM
, Vex
, EXx
}, 0 },
3852 { "vmulss", { XMScalar
, VexScalar
, EXxmm_md
}, 0 },
3853 { "vmulpd", { XM
, Vex
, EXx
}, 0 },
3854 { "vmulsd", { XMScalar
, VexScalar
, EXxmm_mq
}, 0 },
3857 /* PREFIX_VEX_0F5A */
3859 { "vcvtps2pd", { XM
, EXxmmq
}, 0 },
3860 { "vcvtss2sd", { XMScalar
, VexScalar
, EXxmm_md
}, 0 },
3861 { "vcvtpd2ps%XY",{ XMM
, EXx
}, 0 },
3862 { "vcvtsd2ss", { XMScalar
, VexScalar
, EXxmm_mq
}, 0 },
3865 /* PREFIX_VEX_0F5B */
3867 { "vcvtdq2ps", { XM
, EXx
}, 0 },
3868 { "vcvttps2dq", { XM
, EXx
}, 0 },
3869 { "vcvtps2dq", { XM
, EXx
}, 0 },
3872 /* PREFIX_VEX_0F5C */
3874 { "vsubps", { XM
, Vex
, EXx
}, 0 },
3875 { "vsubss", { XMScalar
, VexScalar
, EXxmm_md
}, 0 },
3876 { "vsubpd", { XM
, Vex
, EXx
}, 0 },
3877 { "vsubsd", { XMScalar
, VexScalar
, EXxmm_mq
}, 0 },
3880 /* PREFIX_VEX_0F5D */
3882 { "vminps", { XM
, Vex
, EXx
}, 0 },
3883 { "vminss", { XMScalar
, VexScalar
, EXxmm_md
}, 0 },
3884 { "vminpd", { XM
, Vex
, EXx
}, 0 },
3885 { "vminsd", { XMScalar
, VexScalar
, EXxmm_mq
}, 0 },
3888 /* PREFIX_VEX_0F5E */
3890 { "vdivps", { XM
, Vex
, EXx
}, 0 },
3891 { "vdivss", { XMScalar
, VexScalar
, EXxmm_md
}, 0 },
3892 { "vdivpd", { XM
, Vex
, EXx
}, 0 },
3893 { "vdivsd", { XMScalar
, VexScalar
, EXxmm_mq
}, 0 },
3896 /* PREFIX_VEX_0F5F */
3898 { "vmaxps", { XM
, Vex
, EXx
}, 0 },
3899 { "vmaxss", { XMScalar
, VexScalar
, EXxmm_md
}, 0 },
3900 { "vmaxpd", { XM
, Vex
, EXx
}, 0 },
3901 { "vmaxsd", { XMScalar
, VexScalar
, EXxmm_mq
}, 0 },
3904 /* PREFIX_VEX_0F6F */
3907 { "vmovdqu", { XM
, EXx
}, 0 },
3908 { "vmovdqa", { XM
, EXx
}, 0 },
3911 /* PREFIX_VEX_0F70 */
3914 { "vpshufhw", { XM
, EXx
, Ib
}, 0 },
3915 { "vpshufd", { XM
, EXx
, Ib
}, 0 },
3916 { "vpshuflw", { XM
, EXx
, Ib
}, 0 },
3919 /* PREFIX_VEX_0F7C */
3923 { "vhaddpd", { XM
, Vex
, EXx
}, 0 },
3924 { "vhaddps", { XM
, Vex
, EXx
}, 0 },
3927 /* PREFIX_VEX_0F7D */
3931 { "vhsubpd", { XM
, Vex
, EXx
}, 0 },
3932 { "vhsubps", { XM
, Vex
, EXx
}, 0 },
3935 /* PREFIX_VEX_0F7E */
3938 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_1
) },
3939 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_2
) },
3942 /* PREFIX_VEX_0F7F */
3945 { "vmovdqu", { EXxS
, XM
}, 0 },
3946 { "vmovdqa", { EXxS
, XM
}, 0 },
3949 /* PREFIX_VEX_0F90_L_0_W_0 */
3951 { "kmovw", { MaskG
, MaskE
}, 0 },
3953 { "kmovb", { MaskG
, MaskBDE
}, 0 },
3956 /* PREFIX_VEX_0F90_L_0_W_1 */
3958 { "kmovq", { MaskG
, MaskE
}, 0 },
3960 { "kmovd", { MaskG
, MaskBDE
}, 0 },
3963 /* PREFIX_VEX_0F91_L_0_M_0_W_0 */
3965 { "kmovw", { Ew
, MaskG
}, 0 },
3967 { "kmovb", { Eb
, MaskG
}, 0 },
3970 /* PREFIX_VEX_0F91_L_0_M_0_W_1 */
3972 { "kmovq", { Eq
, MaskG
}, 0 },
3974 { "kmovd", { Ed
, MaskG
}, 0 },
3977 /* PREFIX_VEX_0F92_L_0_M_1_W_0 */
3979 { "kmovw", { MaskG
, Edq
}, 0 },
3981 { "kmovb", { MaskG
, Edq
}, 0 },
3982 { "kmovd", { MaskG
, Edq
}, 0 },
3985 /* PREFIX_VEX_0F92_L_0_M_1_W_1 */
3990 { "kmovK", { MaskG
, Edq
}, 0 },
3993 /* PREFIX_VEX_0F93_L_0_M_1_W_0 */
3995 { "kmovw", { Gdq
, MaskE
}, 0 },
3997 { "kmovb", { Gdq
, MaskE
}, 0 },
3998 { "kmovd", { Gdq
, MaskE
}, 0 },
4001 /* PREFIX_VEX_0F93_L_0_M_1_W_1 */
4006 { "kmovK", { Gdq
, MaskE
}, 0 },
4009 /* PREFIX_VEX_0F98_L_0_M_1_W_0 */
4011 { "kortestw", { MaskG
, MaskE
}, 0 },
4013 { "kortestb", { MaskG
, MaskE
}, 0 },
4016 /* PREFIX_VEX_0F98_L_0_M_1_W_1 */
4018 { "kortestq", { MaskG
, MaskE
}, 0 },
4020 { "kortestd", { MaskG
, MaskE
}, 0 },
4023 /* PREFIX_VEX_0F99_L_0_M_1_W_0 */
4025 { "ktestw", { MaskG
, MaskE
}, 0 },
4027 { "ktestb", { MaskG
, MaskE
}, 0 },
4030 /* PREFIX_VEX_0F99_L_0_M_1_W_1 */
4032 { "ktestq", { MaskG
, MaskE
}, 0 },
4034 { "ktestd", { MaskG
, MaskE
}, 0 },
4037 /* PREFIX_VEX_0FC2 */
4039 { "vcmpps", { XM
, Vex
, EXx
, CMP
}, 0 },
4040 { "vcmpss", { XMScalar
, VexScalar
, EXxmm_md
, CMP
}, 0 },
4041 { "vcmppd", { XM
, Vex
, EXx
, CMP
}, 0 },
4042 { "vcmpsd", { XMScalar
, VexScalar
, EXxmm_mq
, CMP
}, 0 },
4045 /* PREFIX_VEX_0FD0 */
4049 { "vaddsubpd", { XM
, Vex
, EXx
}, 0 },
4050 { "vaddsubps", { XM
, Vex
, EXx
}, 0 },
4053 /* PREFIX_VEX_0FE6 */
4056 { "vcvtdq2pd", { XM
, EXxmmq
}, 0 },
4057 { "vcvttpd2dq%XY", { XMM
, EXx
}, 0 },
4058 { "vcvtpd2dq%XY", { XMM
, EXx
}, 0 },
4061 /* PREFIX_VEX_0FF0 */
4066 { MOD_TABLE (MOD_VEX_0FF0_PREFIX_3
) },
4069 /* PREFIX_VEX_0F3849_X86_64 */
4071 { VEX_W_TABLE (VEX_W_0F3849_X86_64_P_0
) },
4073 { VEX_W_TABLE (VEX_W_0F3849_X86_64_P_2
) },
4074 { VEX_W_TABLE (VEX_W_0F3849_X86_64_P_3
) },
4077 /* PREFIX_VEX_0F384B_X86_64 */
4080 { VEX_W_TABLE (VEX_W_0F384B_X86_64_P_1
) },
4081 { VEX_W_TABLE (VEX_W_0F384B_X86_64_P_2
) },
4082 { VEX_W_TABLE (VEX_W_0F384B_X86_64_P_3
) },
4085 /* PREFIX_VEX_0F385C_X86_64 */
4088 { VEX_W_TABLE (VEX_W_0F385C_X86_64_P_1
) },
4092 /* PREFIX_VEX_0F385E_X86_64 */
4094 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_0
) },
4095 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_1
) },
4096 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_2
) },
4097 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_3
) },
4100 /* PREFIX_VEX_0F38F5_L_0 */
4102 { "bzhiS", { Gdq
, Edq
, VexGdq
}, 0 },
4103 { "pextS", { Gdq
, VexGdq
, Edq
}, 0 },
4105 { "pdepS", { Gdq
, VexGdq
, Edq
}, 0 },
4108 /* PREFIX_VEX_0F38F6_L_0 */
4113 { "mulxS", { Gdq
, VexGdq
, Edq
}, 0 },
4116 /* PREFIX_VEX_0F38F7_L_0 */
4118 { "bextrS", { Gdq
, Edq
, VexGdq
}, 0 },
4119 { "sarxS", { Gdq
, Edq
, VexGdq
}, 0 },
4120 { "shlxS", { Gdq
, Edq
, VexGdq
}, 0 },
4121 { "shrxS", { Gdq
, Edq
, VexGdq
}, 0 },
4124 /* PREFIX_VEX_0F3AF0_L_0 */
4129 { "rorxS", { Gdq
, Edq
, Ib
}, 0 },
4132 #include "i386-dis-evex-prefix.h"
4135 static const struct dis386 x86_64_table
[][2] = {
4138 { "pushP", { es
}, 0 },
4143 { "popP", { es
}, 0 },
4148 { "pushP", { cs
}, 0 },
4153 { "pushP", { ss
}, 0 },
4158 { "popP", { ss
}, 0 },
4163 { "pushP", { ds
}, 0 },
4168 { "popP", { ds
}, 0 },
4173 { "daa", { XX
}, 0 },
4178 { "das", { XX
}, 0 },
4183 { "aaa", { XX
}, 0 },
4188 { "aas", { XX
}, 0 },
4193 { "pushaP", { XX
}, 0 },
4198 { "popaP", { XX
}, 0 },
4203 { MOD_TABLE (MOD_62_32BIT
) },
4204 { EVEX_TABLE (EVEX_0F
) },
4209 { "arpl", { Ew
, Gw
}, 0 },
4210 { "movs", { { OP_G
, movsxd_mode
}, { MOVSXD_Fixup
, movsxd_mode
} }, 0 },
4215 { "ins{R|}", { Yzr
, indirDX
}, 0 },
4216 { "ins{G|}", { Yzr
, indirDX
}, 0 },
4221 { "outs{R|}", { indirDXr
, Xz
}, 0 },
4222 { "outs{G|}", { indirDXr
, Xz
}, 0 },
4227 /* Opcode 0x82 is an alias of opcode 0x80 in 32-bit mode. */
4228 { REG_TABLE (REG_80
) },
4233 { "{l|}call{P|}", { Ap
}, 0 },
4238 { "retP", { Iw
, BND
}, 0 },
4239 { "ret@", { Iw
, BND
}, 0 },
4244 { "retP", { BND
}, 0 },
4245 { "ret@", { BND
}, 0 },
4250 { MOD_TABLE (MOD_C4_32BIT
) },
4251 { VEX_C4_TABLE (VEX_0F
) },
4256 { MOD_TABLE (MOD_C5_32BIT
) },
4257 { VEX_C5_TABLE (VEX_0F
) },
4262 { "into", { XX
}, 0 },
4267 { "aam", { Ib
}, 0 },
4272 { "aad", { Ib
}, 0 },
4277 { "callP", { Jv
, BND
}, 0 },
4278 { "call@", { Jv
, BND
}, 0 }
4283 { "jmpP", { Jv
, BND
}, 0 },
4284 { "jmp@", { Jv
, BND
}, 0 }
4289 { "{l|}jmp{P|}", { Ap
}, 0 },
4292 /* X86_64_0F01_REG_0 */
4294 { "sgdt{Q|Q}", { M
}, 0 },
4295 { "sgdt", { M
}, 0 },
4298 /* X86_64_0F01_REG_1 */
4300 { "sidt{Q|Q}", { M
}, 0 },
4301 { "sidt", { M
}, 0 },
4304 /* X86_64_0F01_REG_1_RM_5_PREFIX_2 */
4307 { "seamret", { Skip_MODRM
}, 0 },
4310 /* X86_64_0F01_REG_1_RM_6_PREFIX_2 */
4313 { "seamops", { Skip_MODRM
}, 0 },
4316 /* X86_64_0F01_REG_1_RM_7_PREFIX_2 */
4319 { "seamcall", { Skip_MODRM
}, 0 },
4322 /* X86_64_0F01_REG_2 */
4324 { "lgdt{Q|Q}", { M
}, 0 },
4325 { "lgdt", { M
}, 0 },
4328 /* X86_64_0F01_REG_3 */
4330 { "lidt{Q|Q}", { M
}, 0 },
4331 { "lidt", { M
}, 0 },
4336 { "movZ", { Em
, Td
}, 0 },
4341 { "movZ", { Td
, Em
}, 0 },
4344 /* X86_64_VEX_0F3849 */
4347 { PREFIX_TABLE (PREFIX_VEX_0F3849_X86_64
) },
4350 /* X86_64_VEX_0F384B */
4353 { PREFIX_TABLE (PREFIX_VEX_0F384B_X86_64
) },
4356 /* X86_64_VEX_0F385C */
4359 { PREFIX_TABLE (PREFIX_VEX_0F385C_X86_64
) },
4362 /* X86_64_VEX_0F385E */
4365 { PREFIX_TABLE (PREFIX_VEX_0F385E_X86_64
) },
4368 /* X86_64_0F01_REG_5_MOD_3_RM_4_PREFIX_1 */
4371 { "uiret", { Skip_MODRM
}, 0 },
4374 /* X86_64_0F01_REG_5_MOD_3_RM_5_PREFIX_1 */
4377 { "testui", { Skip_MODRM
}, 0 },
4380 /* X86_64_0F01_REG_5_MOD_3_RM_6_PREFIX_1 */
4383 { "clui", { Skip_MODRM
}, 0 },
4386 /* X86_64_0F01_REG_5_MOD_3_RM_7_PREFIX_1 */
4389 { "stui", { Skip_MODRM
}, 0 },
4392 /* X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_1 */
4395 { "rmpadjust", { Skip_MODRM
}, 0 },
4398 /* X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3 */
4401 { "rmpupdate", { Skip_MODRM
}, 0 },
4404 /* X86_64_0F01_REG_7_MOD_3_RM_7_PREFIX_1 */
4407 { "psmash", { Skip_MODRM
}, 0 },
4410 /* X86_64_0FC7_REG_6_MOD_3_PREFIX_1 */
4413 { "senduipi", { Eq
}, 0 },
4417 static const struct dis386 three_byte_table
[][256] = {
4419 /* THREE_BYTE_0F38 */
4422 { "pshufb", { MX
, EM
}, PREFIX_OPCODE
},
4423 { "phaddw", { MX
, EM
}, PREFIX_OPCODE
},
4424 { "phaddd", { MX
, EM
}, PREFIX_OPCODE
},
4425 { "phaddsw", { MX
, EM
}, PREFIX_OPCODE
},
4426 { "pmaddubsw", { MX
, EM
}, PREFIX_OPCODE
},
4427 { "phsubw", { MX
, EM
}, PREFIX_OPCODE
},
4428 { "phsubd", { MX
, EM
}, PREFIX_OPCODE
},
4429 { "phsubsw", { MX
, EM
}, PREFIX_OPCODE
},
4431 { "psignb", { MX
, EM
}, PREFIX_OPCODE
},
4432 { "psignw", { MX
, EM
}, PREFIX_OPCODE
},
4433 { "psignd", { MX
, EM
}, PREFIX_OPCODE
},
4434 { "pmulhrsw", { MX
, EM
}, PREFIX_OPCODE
},
4440 { "pblendvb", { XM
, EXx
, XMM0
}, PREFIX_DATA
},
4444 { "blendvps", { XM
, EXx
, XMM0
}, PREFIX_DATA
},
4445 { "blendvpd", { XM
, EXx
, XMM0
}, PREFIX_DATA
},
4447 { "ptest", { XM
, EXx
}, PREFIX_DATA
},
4453 { "pabsb", { MX
, EM
}, PREFIX_OPCODE
},
4454 { "pabsw", { MX
, EM
}, PREFIX_OPCODE
},
4455 { "pabsd", { MX
, EM
}, PREFIX_OPCODE
},
4458 { "pmovsxbw", { XM
, EXq
}, PREFIX_DATA
},
4459 { "pmovsxbd", { XM
, EXd
}, PREFIX_DATA
},
4460 { "pmovsxbq", { XM
, EXw
}, PREFIX_DATA
},
4461 { "pmovsxwd", { XM
, EXq
}, PREFIX_DATA
},
4462 { "pmovsxwq", { XM
, EXd
}, PREFIX_DATA
},
4463 { "pmovsxdq", { XM
, EXq
}, PREFIX_DATA
},
4467 { "pmuldq", { XM
, EXx
}, PREFIX_DATA
},
4468 { "pcmpeqq", { XM
, EXx
}, PREFIX_DATA
},
4469 { MOD_TABLE (MOD_0F382A
) },
4470 { "packusdw", { XM
, EXx
}, PREFIX_DATA
},
4476 { "pmovzxbw", { XM
, EXq
}, PREFIX_DATA
},
4477 { "pmovzxbd", { XM
, EXd
}, PREFIX_DATA
},
4478 { "pmovzxbq", { XM
, EXw
}, PREFIX_DATA
},
4479 { "pmovzxwd", { XM
, EXq
}, PREFIX_DATA
},
4480 { "pmovzxwq", { XM
, EXd
}, PREFIX_DATA
},
4481 { "pmovzxdq", { XM
, EXq
}, PREFIX_DATA
},
4483 { "pcmpgtq", { XM
, EXx
}, PREFIX_DATA
},
4485 { "pminsb", { XM
, EXx
}, PREFIX_DATA
},
4486 { "pminsd", { XM
, EXx
}, PREFIX_DATA
},
4487 { "pminuw", { XM
, EXx
}, PREFIX_DATA
},
4488 { "pminud", { XM
, EXx
}, PREFIX_DATA
},
4489 { "pmaxsb", { XM
, EXx
}, PREFIX_DATA
},
4490 { "pmaxsd", { XM
, EXx
}, PREFIX_DATA
},
4491 { "pmaxuw", { XM
, EXx
}, PREFIX_DATA
},
4492 { "pmaxud", { XM
, EXx
}, PREFIX_DATA
},
4494 { "pmulld", { XM
, EXx
}, PREFIX_DATA
},
4495 { "phminposuw", { XM
, EXx
}, PREFIX_DATA
},
4566 { "invept", { Gm
, Mo
}, PREFIX_DATA
},
4567 { "invvpid", { Gm
, Mo
}, PREFIX_DATA
},
4568 { "invpcid", { Gm
, M
}, PREFIX_DATA
},
4647 { "sha1nexte", { XM
, EXxmm
}, PREFIX_OPCODE
},
4648 { "sha1msg1", { XM
, EXxmm
}, PREFIX_OPCODE
},
4649 { "sha1msg2", { XM
, EXxmm
}, PREFIX_OPCODE
},
4650 { "sha256rnds2", { XM
, EXxmm
, XMM0
}, PREFIX_OPCODE
},
4651 { "sha256msg1", { XM
, EXxmm
}, PREFIX_OPCODE
},
4652 { "sha256msg2", { XM
, EXxmm
}, PREFIX_OPCODE
},
4654 { "gf2p8mulb", { XM
, EXxmm
}, PREFIX_DATA
},
4665 { PREFIX_TABLE (PREFIX_0F38D8
) },
4668 { "aesimc", { XM
, EXx
}, PREFIX_DATA
},
4669 { PREFIX_TABLE (PREFIX_0F38DC
) },
4670 { PREFIX_TABLE (PREFIX_0F38DD
) },
4671 { PREFIX_TABLE (PREFIX_0F38DE
) },
4672 { PREFIX_TABLE (PREFIX_0F38DF
) },
4692 { PREFIX_TABLE (PREFIX_0F38F0
) },
4693 { PREFIX_TABLE (PREFIX_0F38F1
) },
4697 { MOD_TABLE (MOD_0F38F5
) },
4698 { PREFIX_TABLE (PREFIX_0F38F6
) },
4701 { PREFIX_TABLE (PREFIX_0F38F8
) },
4702 { MOD_TABLE (MOD_0F38F9
) },
4703 { PREFIX_TABLE (PREFIX_0F38FA
) },
4704 { PREFIX_TABLE (PREFIX_0F38FB
) },
4710 /* THREE_BYTE_0F3A */
4722 { "roundps", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4723 { "roundpd", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4724 { "roundss", { XM
, EXd
, Ib
}, PREFIX_DATA
},
4725 { "roundsd", { XM
, EXq
, Ib
}, PREFIX_DATA
},
4726 { "blendps", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4727 { "blendpd", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4728 { "pblendw", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4729 { "palignr", { MX
, EM
, Ib
}, PREFIX_OPCODE
},
4735 { "pextrb", { Edqb
, XM
, Ib
}, PREFIX_DATA
},
4736 { "pextrw", { Edqw
, XM
, Ib
}, PREFIX_DATA
},
4737 { "pextrK", { Edq
, XM
, Ib
}, PREFIX_DATA
},
4738 { "extractps", { Edqd
, XM
, Ib
}, PREFIX_DATA
},
4749 { "pinsrb", { XM
, Edqb
, Ib
}, PREFIX_DATA
},
4750 { "insertps", { XM
, EXd
, Ib
}, PREFIX_DATA
},
4751 { "pinsrK", { XM
, Edq
, Ib
}, PREFIX_DATA
},
4785 { "dpps", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4786 { "dppd", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4787 { "mpsadbw", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4789 { "pclmulqdq", { XM
, EXx
, PCLMUL
}, PREFIX_DATA
},
4821 { "pcmpestrm!%LQ", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4822 { "pcmpestri!%LQ", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4823 { "pcmpistrm", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4824 { "pcmpistri", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4942 { "sha1rnds4", { XM
, EXxmm
, Ib
}, PREFIX_OPCODE
},
4944 { "gf2p8affineqb", { XM
, EXxmm
, Ib
}, PREFIX_DATA
},
4945 { "gf2p8affineinvqb", { XM
, EXxmm
, Ib
}, PREFIX_DATA
},
4963 { "aeskeygenassist", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4983 { PREFIX_TABLE (PREFIX_0F3A0F
) },
5003 static const struct dis386 xop_table
[][256] = {
5156 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_85
) },
5157 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_86
) },
5158 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_87
) },
5166 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_8E
) },
5167 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_8F
) },
5174 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_95
) },
5175 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_96
) },
5176 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_97
) },
5184 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_9E
) },
5185 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_9F
) },
5189 { "vpcmov", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
5190 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_A3
) },
5193 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_A6
) },
5211 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_B6
) },
5223 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C0
) },
5224 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C1
) },
5225 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C2
) },
5226 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C3
) },
5236 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CC
) },
5237 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CD
) },
5238 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CE
) },
5239 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CF
) },
5272 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EC
) },
5273 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_ED
) },
5274 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EE
) },
5275 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EF
) },
5299 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_01
) },
5300 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_02
) },
5318 { MOD_TABLE (MOD_VEX_0FXOP_09_12
) },
5442 { VEX_W_TABLE (VEX_W_0FXOP_09_80
) },
5443 { VEX_W_TABLE (VEX_W_0FXOP_09_81
) },
5444 { VEX_W_TABLE (VEX_W_0FXOP_09_82
) },
5445 { VEX_W_TABLE (VEX_W_0FXOP_09_83
) },
5460 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_90
) },
5461 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_91
) },
5462 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_92
) },
5463 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_93
) },
5464 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_94
) },
5465 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_95
) },
5466 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_96
) },
5467 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_97
) },
5469 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_98
) },
5470 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_99
) },
5471 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_9A
) },
5472 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_9B
) },
5515 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C1
) },
5516 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C2
) },
5517 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C3
) },
5520 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C6
) },
5521 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C7
) },
5526 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_CB
) },
5533 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D1
) },
5534 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D2
) },
5535 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D3
) },
5538 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D6
) },
5539 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D7
) },
5544 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_DB
) },
5551 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_E1
) },
5552 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_E2
) },
5553 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_E3
) },
5607 { "bextrS", { Gdq
, Edq
, Id
}, 0 },
5609 { VEX_LEN_TABLE (VEX_LEN_0FXOP_0A_12
) },
5879 static const struct dis386 vex_table
[][256] = {
5901 { PREFIX_TABLE (PREFIX_VEX_0F10
) },
5902 { PREFIX_TABLE (PREFIX_VEX_0F11
) },
5903 { PREFIX_TABLE (PREFIX_VEX_0F12
) },
5904 { MOD_TABLE (MOD_VEX_0F13
) },
5905 { "vunpcklpX", { XM
, Vex
, EXx
}, PREFIX_OPCODE
},
5906 { "vunpckhpX", { XM
, Vex
, EXx
}, PREFIX_OPCODE
},
5907 { PREFIX_TABLE (PREFIX_VEX_0F16
) },
5908 { MOD_TABLE (MOD_VEX_0F17
) },
5928 { "vmovapX", { XM
, EXx
}, PREFIX_OPCODE
},
5929 { "vmovapX", { EXxS
, XM
}, PREFIX_OPCODE
},
5930 { PREFIX_TABLE (PREFIX_VEX_0F2A
) },
5931 { MOD_TABLE (MOD_VEX_0F2B
) },
5932 { PREFIX_TABLE (PREFIX_VEX_0F2C
) },
5933 { PREFIX_TABLE (PREFIX_VEX_0F2D
) },
5934 { PREFIX_TABLE (PREFIX_VEX_0F2E
) },
5935 { PREFIX_TABLE (PREFIX_VEX_0F2F
) },
5956 { VEX_LEN_TABLE (VEX_LEN_0F41
) },
5957 { VEX_LEN_TABLE (VEX_LEN_0F42
) },
5959 { VEX_LEN_TABLE (VEX_LEN_0F44
) },
5960 { VEX_LEN_TABLE (VEX_LEN_0F45
) },
5961 { VEX_LEN_TABLE (VEX_LEN_0F46
) },
5962 { VEX_LEN_TABLE (VEX_LEN_0F47
) },
5966 { VEX_LEN_TABLE (VEX_LEN_0F4A
) },
5967 { VEX_LEN_TABLE (VEX_LEN_0F4B
) },
5973 { MOD_TABLE (MOD_VEX_0F50
) },
5974 { PREFIX_TABLE (PREFIX_VEX_0F51
) },
5975 { PREFIX_TABLE (PREFIX_VEX_0F52
) },
5976 { PREFIX_TABLE (PREFIX_VEX_0F53
) },
5977 { "vandpX", { XM
, Vex
, EXx
}, PREFIX_OPCODE
},
5978 { "vandnpX", { XM
, Vex
, EXx
}, PREFIX_OPCODE
},
5979 { "vorpX", { XM
, Vex
, EXx
}, PREFIX_OPCODE
},
5980 { "vxorpX", { XM
, Vex
, EXx
}, PREFIX_OPCODE
},
5982 { PREFIX_TABLE (PREFIX_VEX_0F58
) },
5983 { PREFIX_TABLE (PREFIX_VEX_0F59
) },
5984 { PREFIX_TABLE (PREFIX_VEX_0F5A
) },
5985 { PREFIX_TABLE (PREFIX_VEX_0F5B
) },
5986 { PREFIX_TABLE (PREFIX_VEX_0F5C
) },
5987 { PREFIX_TABLE (PREFIX_VEX_0F5D
) },
5988 { PREFIX_TABLE (PREFIX_VEX_0F5E
) },
5989 { PREFIX_TABLE (PREFIX_VEX_0F5F
) },
5991 { "vpunpcklbw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5992 { "vpunpcklwd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5993 { "vpunpckldq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5994 { "vpacksswb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5995 { "vpcmpgtb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5996 { "vpcmpgtw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5997 { "vpcmpgtd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5998 { "vpackuswb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6000 { "vpunpckhbw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6001 { "vpunpckhwd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6002 { "vpunpckhdq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6003 { "vpackssdw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6004 { "vpunpcklqdq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6005 { "vpunpckhqdq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6006 { VEX_LEN_TABLE (VEX_LEN_0F6E
) },
6007 { PREFIX_TABLE (PREFIX_VEX_0F6F
) },
6009 { PREFIX_TABLE (PREFIX_VEX_0F70
) },
6010 { MOD_TABLE (MOD_VEX_0F71
) },
6011 { MOD_TABLE (MOD_VEX_0F72
) },
6012 { MOD_TABLE (MOD_VEX_0F73
) },
6013 { "vpcmpeqb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6014 { "vpcmpeqw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6015 { "vpcmpeqd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6016 { VEX_LEN_TABLE (VEX_LEN_0F77
) },
6022 { PREFIX_TABLE (PREFIX_VEX_0F7C
) },
6023 { PREFIX_TABLE (PREFIX_VEX_0F7D
) },
6024 { PREFIX_TABLE (PREFIX_VEX_0F7E
) },
6025 { PREFIX_TABLE (PREFIX_VEX_0F7F
) },
6045 { VEX_LEN_TABLE (VEX_LEN_0F90
) },
6046 { VEX_LEN_TABLE (VEX_LEN_0F91
) },
6047 { VEX_LEN_TABLE (VEX_LEN_0F92
) },
6048 { VEX_LEN_TABLE (VEX_LEN_0F93
) },
6054 { VEX_LEN_TABLE (VEX_LEN_0F98
) },
6055 { VEX_LEN_TABLE (VEX_LEN_0F99
) },
6078 { REG_TABLE (REG_VEX_0FAE
) },
6101 { PREFIX_TABLE (PREFIX_VEX_0FC2
) },
6103 { VEX_LEN_TABLE (VEX_LEN_0FC4
) },
6104 { VEX_LEN_TABLE (VEX_LEN_0FC5
) },
6105 { "vshufpX", { XM
, Vex
, EXx
, Ib
}, PREFIX_OPCODE
},
6117 { PREFIX_TABLE (PREFIX_VEX_0FD0
) },
6118 { "vpsrlw", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
6119 { "vpsrld", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
6120 { "vpsrlq", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
6121 { "vpaddq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6122 { "vpmullw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6123 { VEX_LEN_TABLE (VEX_LEN_0FD6
) },
6124 { MOD_TABLE (MOD_VEX_0FD7
) },
6126 { "vpsubusb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6127 { "vpsubusw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6128 { "vpminub", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6129 { "vpand", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6130 { "vpaddusb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6131 { "vpaddusw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6132 { "vpmaxub", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6133 { "vpandn", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6135 { "vpavgb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6136 { "vpsraw", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
6137 { "vpsrad", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
6138 { "vpavgw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6139 { "vpmulhuw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6140 { "vpmulhw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6141 { PREFIX_TABLE (PREFIX_VEX_0FE6
) },
6142 { MOD_TABLE (MOD_VEX_0FE7
) },
6144 { "vpsubsb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6145 { "vpsubsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6146 { "vpminsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6147 { "vpor", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6148 { "vpaddsb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6149 { "vpaddsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6150 { "vpmaxsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6151 { "vpxor", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6153 { PREFIX_TABLE (PREFIX_VEX_0FF0
) },
6154 { "vpsllw", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
6155 { "vpslld", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
6156 { "vpsllq", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
6157 { "vpmuludq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6158 { "vpmaddwd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6159 { "vpsadbw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6160 { VEX_LEN_TABLE (VEX_LEN_0FF7
) },
6162 { "vpsubb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6163 { "vpsubw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6164 { "vpsubd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6165 { "vpsubq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6166 { "vpaddb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6167 { "vpaddw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6168 { "vpaddd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6174 { "vpshufb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6175 { "vphaddw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6176 { "vphaddd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6177 { "vphaddsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6178 { "vpmaddubsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6179 { "vphsubw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6180 { "vphsubd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6181 { "vphsubsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6183 { "vpsignb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6184 { "vpsignw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6185 { "vpsignd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6186 { "vpmulhrsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6187 { VEX_W_TABLE (VEX_W_0F380C
) },
6188 { VEX_W_TABLE (VEX_W_0F380D
) },
6189 { VEX_W_TABLE (VEX_W_0F380E
) },
6190 { VEX_W_TABLE (VEX_W_0F380F
) },
6195 { VEX_W_TABLE (VEX_W_0F3813
) },
6198 { VEX_LEN_TABLE (VEX_LEN_0F3816
) },
6199 { "vptest", { XM
, EXx
}, PREFIX_DATA
},
6201 { VEX_W_TABLE (VEX_W_0F3818
) },
6202 { VEX_LEN_TABLE (VEX_LEN_0F3819
) },
6203 { MOD_TABLE (MOD_VEX_0F381A
) },
6205 { "vpabsb", { XM
, EXx
}, PREFIX_DATA
},
6206 { "vpabsw", { XM
, EXx
}, PREFIX_DATA
},
6207 { "vpabsd", { XM
, EXx
}, PREFIX_DATA
},
6210 { "vpmovsxbw", { XM
, EXxmmq
}, PREFIX_DATA
},
6211 { "vpmovsxbd", { XM
, EXxmmqd
}, PREFIX_DATA
},
6212 { "vpmovsxbq", { XM
, EXxmmdw
}, PREFIX_DATA
},
6213 { "vpmovsxwd", { XM
, EXxmmq
}, PREFIX_DATA
},
6214 { "vpmovsxwq", { XM
, EXxmmqd
}, PREFIX_DATA
},
6215 { "vpmovsxdq", { XM
, EXxmmq
}, PREFIX_DATA
},
6219 { "vpmuldq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6220 { "vpcmpeqq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6221 { MOD_TABLE (MOD_VEX_0F382A
) },
6222 { "vpackusdw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6223 { MOD_TABLE (MOD_VEX_0F382C
) },
6224 { MOD_TABLE (MOD_VEX_0F382D
) },
6225 { MOD_TABLE (MOD_VEX_0F382E
) },
6226 { MOD_TABLE (MOD_VEX_0F382F
) },
6228 { "vpmovzxbw", { XM
, EXxmmq
}, PREFIX_DATA
},
6229 { "vpmovzxbd", { XM
, EXxmmqd
}, PREFIX_DATA
},
6230 { "vpmovzxbq", { XM
, EXxmmdw
}, PREFIX_DATA
},
6231 { "vpmovzxwd", { XM
, EXxmmq
}, PREFIX_DATA
},
6232 { "vpmovzxwq", { XM
, EXxmmqd
}, PREFIX_DATA
},
6233 { "vpmovzxdq", { XM
, EXxmmq
}, PREFIX_DATA
},
6234 { VEX_LEN_TABLE (VEX_LEN_0F3836
) },
6235 { "vpcmpgtq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6237 { "vpminsb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6238 { "vpminsd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6239 { "vpminuw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6240 { "vpminud", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6241 { "vpmaxsb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6242 { "vpmaxsd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6243 { "vpmaxuw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6244 { "vpmaxud", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6246 { "vpmulld", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6247 { VEX_LEN_TABLE (VEX_LEN_0F3841
) },
6251 { "vpsrlv%DQ", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6252 { VEX_W_TABLE (VEX_W_0F3846
) },
6253 { "vpsllv%DQ", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6256 { X86_64_TABLE (X86_64_VEX_0F3849
) },
6258 { X86_64_TABLE (X86_64_VEX_0F384B
) },
6264 { VEX_W_TABLE (VEX_W_0F3850
) },
6265 { VEX_W_TABLE (VEX_W_0F3851
) },
6266 { VEX_W_TABLE (VEX_W_0F3852
) },
6267 { VEX_W_TABLE (VEX_W_0F3853
) },
6273 { VEX_W_TABLE (VEX_W_0F3858
) },
6274 { VEX_W_TABLE (VEX_W_0F3859
) },
6275 { MOD_TABLE (MOD_VEX_0F385A
) },
6277 { X86_64_TABLE (X86_64_VEX_0F385C
) },
6279 { X86_64_TABLE (X86_64_VEX_0F385E
) },
6309 { VEX_W_TABLE (VEX_W_0F3878
) },
6310 { VEX_W_TABLE (VEX_W_0F3879
) },
6331 { MOD_TABLE (MOD_VEX_0F388C
) },
6333 { MOD_TABLE (MOD_VEX_0F388E
) },
6336 { "vpgatherd%DQ", { XM
, MVexVSIBDWpX
, Vex
}, PREFIX_DATA
},
6337 { "vpgatherq%DQ", { XMGatherQ
, MVexVSIBQWpX
, VexGatherQ
}, PREFIX_DATA
},
6338 { "vgatherdp%XW", { XM
, MVexVSIBDWpX
, Vex
}, PREFIX_DATA
},
6339 { "vgatherqp%XW", { XMGatherQ
, MVexVSIBQWpX
, VexGatherQ
}, PREFIX_DATA
},
6342 { "vfmaddsub132p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6343 { "vfmsubadd132p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6345 { "vfmadd132p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6346 { "vfmadd132s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
}, PREFIX_DATA
},
6347 { "vfmsub132p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6348 { "vfmsub132s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
}, PREFIX_DATA
},
6349 { "vfnmadd132p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6350 { "vfnmadd132s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
}, PREFIX_DATA
},
6351 { "vfnmsub132p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6352 { "vfnmsub132s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
}, PREFIX_DATA
},
6360 { "vfmaddsub213p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6361 { "vfmsubadd213p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6363 { "vfmadd213p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6364 { "vfmadd213s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
}, PREFIX_DATA
},
6365 { "vfmsub213p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6366 { "vfmsub213s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
}, PREFIX_DATA
},
6367 { "vfnmadd213p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6368 { "vfnmadd213s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
}, PREFIX_DATA
},
6369 { "vfnmsub213p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6370 { "vfnmsub213s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
}, PREFIX_DATA
},
6378 { "vfmaddsub231p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6379 { "vfmsubadd231p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6381 { "vfmadd231p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6382 { "vfmadd231s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
}, PREFIX_DATA
},
6383 { "vfmsub231p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6384 { "vfmsub231s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
}, PREFIX_DATA
},
6385 { "vfnmadd231p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6386 { "vfnmadd231s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
}, PREFIX_DATA
},
6387 { "vfnmsub231p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6388 { "vfnmsub231s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
}, PREFIX_DATA
},
6406 { VEX_W_TABLE (VEX_W_0F38CF
) },
6420 { VEX_LEN_TABLE (VEX_LEN_0F38DB
) },
6421 { "vaesenc", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6422 { "vaesenclast", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6423 { "vaesdec", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6424 { "vaesdeclast", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6446 { VEX_LEN_TABLE (VEX_LEN_0F38F2
) },
6447 { VEX_LEN_TABLE (VEX_LEN_0F38F3
) },
6449 { VEX_LEN_TABLE (VEX_LEN_0F38F5
) },
6450 { VEX_LEN_TABLE (VEX_LEN_0F38F6
) },
6451 { VEX_LEN_TABLE (VEX_LEN_0F38F7
) },
6465 { VEX_LEN_TABLE (VEX_LEN_0F3A00
) },
6466 { VEX_LEN_TABLE (VEX_LEN_0F3A01
) },
6467 { VEX_W_TABLE (VEX_W_0F3A02
) },
6469 { VEX_W_TABLE (VEX_W_0F3A04
) },
6470 { VEX_W_TABLE (VEX_W_0F3A05
) },
6471 { VEX_LEN_TABLE (VEX_LEN_0F3A06
) },
6474 { "vroundps", { XM
, EXx
, Ib
}, PREFIX_DATA
},
6475 { "vroundpd", { XM
, EXx
, Ib
}, PREFIX_DATA
},
6476 { "vroundss", { XMScalar
, VexScalar
, EXxmm_md
, Ib
}, PREFIX_DATA
},
6477 { "vroundsd", { XMScalar
, VexScalar
, EXxmm_mq
, Ib
}, PREFIX_DATA
},
6478 { "vblendps", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
6479 { "vblendpd", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
6480 { "vpblendw", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
6481 { "vpalignr", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
6487 { VEX_LEN_TABLE (VEX_LEN_0F3A14
) },
6488 { VEX_LEN_TABLE (VEX_LEN_0F3A15
) },
6489 { VEX_LEN_TABLE (VEX_LEN_0F3A16
) },
6490 { VEX_LEN_TABLE (VEX_LEN_0F3A17
) },
6492 { VEX_LEN_TABLE (VEX_LEN_0F3A18
) },
6493 { VEX_LEN_TABLE (VEX_LEN_0F3A19
) },
6497 { VEX_W_TABLE (VEX_W_0F3A1D
) },
6501 { VEX_LEN_TABLE (VEX_LEN_0F3A20
) },
6502 { VEX_LEN_TABLE (VEX_LEN_0F3A21
) },
6503 { VEX_LEN_TABLE (VEX_LEN_0F3A22
) },
6519 { VEX_LEN_TABLE (VEX_LEN_0F3A30
) },
6520 { VEX_LEN_TABLE (VEX_LEN_0F3A31
) },
6521 { VEX_LEN_TABLE (VEX_LEN_0F3A32
) },
6522 { VEX_LEN_TABLE (VEX_LEN_0F3A33
) },
6528 { VEX_LEN_TABLE (VEX_LEN_0F3A38
) },
6529 { VEX_LEN_TABLE (VEX_LEN_0F3A39
) },
6537 { "vdpps", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
6538 { VEX_LEN_TABLE (VEX_LEN_0F3A41
) },
6539 { "vmpsadbw", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
6541 { "vpclmulqdq", { XM
, Vex
, EXx
, PCLMUL
}, PREFIX_DATA
},
6543 { VEX_LEN_TABLE (VEX_LEN_0F3A46
) },
6546 { "vpermil2ps", { XM
, Vex
, EXx
, XMVexI4
, VexI4
}, PREFIX_DATA
},
6547 { "vpermil2pd", { XM
, Vex
, EXx
, XMVexI4
, VexI4
}, PREFIX_DATA
},
6548 { VEX_W_TABLE (VEX_W_0F3A4A
) },
6549 { VEX_W_TABLE (VEX_W_0F3A4B
) },
6550 { VEX_W_TABLE (VEX_W_0F3A4C
) },
6568 { "vfmaddsubps", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6569 { "vfmaddsubpd", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6570 { "vfmsubaddps", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6571 { "vfmsubaddpd", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6573 { VEX_LEN_TABLE (VEX_LEN_0F3A60
) },
6574 { VEX_LEN_TABLE (VEX_LEN_0F3A61
) },
6575 { VEX_LEN_TABLE (VEX_LEN_0F3A62
) },
6576 { VEX_LEN_TABLE (VEX_LEN_0F3A63
) },
6582 { "vfmaddps", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6583 { "vfmaddpd", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6584 { "vfmaddss", { XMScalar
, VexScalar
, EXxmm_md
, XMVexScalarI4
}, PREFIX_DATA
},
6585 { "vfmaddsd", { XMScalar
, VexScalar
, EXxmm_mq
, XMVexScalarI4
}, PREFIX_DATA
},
6586 { "vfmsubps", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6587 { "vfmsubpd", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6588 { "vfmsubss", { XMScalar
, VexScalar
, EXxmm_md
, XMVexScalarI4
}, PREFIX_DATA
},
6589 { "vfmsubsd", { XMScalar
, VexScalar
, EXxmm_mq
, XMVexScalarI4
}, PREFIX_DATA
},
6600 { "vfnmaddps", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6601 { "vfnmaddpd", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6602 { "vfnmaddss", { XMScalar
, VexScalar
, EXxmm_md
, XMVexScalarI4
}, PREFIX_DATA
},
6603 { "vfnmaddsd", { XMScalar
, VexScalar
, EXxmm_mq
, XMVexScalarI4
}, PREFIX_DATA
},
6604 { "vfnmsubps", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6605 { "vfnmsubpd", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6606 { "vfnmsubss", { XMScalar
, VexScalar
, EXxmm_md
, XMVexScalarI4
}, PREFIX_DATA
},
6607 { "vfnmsubsd", { XMScalar
, VexScalar
, EXxmm_mq
, XMVexScalarI4
}, PREFIX_DATA
},
6696 { VEX_W_TABLE (VEX_W_0F3ACE
) },
6697 { VEX_W_TABLE (VEX_W_0F3ACF
) },
6715 { VEX_LEN_TABLE (VEX_LEN_0F3ADF
) },
6735 { VEX_LEN_TABLE (VEX_LEN_0F3AF0
) },
6755 #include "i386-dis-evex.h"
6757 static const struct dis386 vex_len_table
[][2] = {
6758 /* VEX_LEN_0F12_P_0_M_0 / VEX_LEN_0F12_P_2_M_0 */
6760 { "vmovlpX", { XM
, Vex
, EXq
}, 0 },
6763 /* VEX_LEN_0F12_P_0_M_1 */
6765 { "vmovhlps", { XM
, Vex
, EXq
}, 0 },
6768 /* VEX_LEN_0F13_M_0 */
6770 { "vmovlpX", { EXq
, XM
}, PREFIX_OPCODE
},
6773 /* VEX_LEN_0F16_P_0_M_0 / VEX_LEN_0F16_P_2_M_0 */
6775 { "vmovhpX", { XM
, Vex
, EXq
}, 0 },
6778 /* VEX_LEN_0F16_P_0_M_1 */
6780 { "vmovlhps", { XM
, Vex
, EXq
}, 0 },
6783 /* VEX_LEN_0F17_M_0 */
6785 { "vmovhpX", { EXq
, XM
}, PREFIX_OPCODE
},
6791 { MOD_TABLE (MOD_VEX_0F41_L_1
) },
6797 { MOD_TABLE (MOD_VEX_0F42_L_1
) },
6802 { MOD_TABLE (MOD_VEX_0F44_L_0
) },
6808 { MOD_TABLE (MOD_VEX_0F45_L_1
) },
6814 { MOD_TABLE (MOD_VEX_0F46_L_1
) },
6820 { MOD_TABLE (MOD_VEX_0F47_L_1
) },
6826 { MOD_TABLE (MOD_VEX_0F4A_L_1
) },
6832 { MOD_TABLE (MOD_VEX_0F4B_L_1
) },
6837 { "vmovK", { XMScalar
, Edq
}, PREFIX_DATA
},
6842 { "vzeroupper", { XX
}, 0 },
6843 { "vzeroall", { XX
}, 0 },
6846 /* VEX_LEN_0F7E_P_1 */
6848 { "vmovq", { XMScalar
, EXxmm_mq
}, 0 },
6851 /* VEX_LEN_0F7E_P_2 */
6853 { "vmovK", { Edq
, XMScalar
}, 0 },
6858 { VEX_W_TABLE (VEX_W_0F90_L_0
) },
6863 { MOD_TABLE (MOD_VEX_0F91_L_0
) },
6868 { MOD_TABLE (MOD_VEX_0F92_L_0
) },
6873 { MOD_TABLE (MOD_VEX_0F93_L_0
) },
6878 { MOD_TABLE (MOD_VEX_0F98_L_0
) },
6883 { MOD_TABLE (MOD_VEX_0F99_L_0
) },
6886 /* VEX_LEN_0FAE_R_2_M_0 */
6888 { "vldmxcsr", { Md
}, 0 },
6891 /* VEX_LEN_0FAE_R_3_M_0 */
6893 { "vstmxcsr", { Md
}, 0 },
6898 { "vpinsrw", { XM
, Vex
, Edqw
, Ib
}, PREFIX_DATA
},
6903 { "vpextrw", { Gdq
, XS
, Ib
}, PREFIX_DATA
},
6908 { "vmovq", { EXqS
, XMScalar
}, PREFIX_DATA
},
6913 { "vmaskmovdqu", { XM
, XS
}, PREFIX_DATA
},
6916 /* VEX_LEN_0F3816 */
6919 { VEX_W_TABLE (VEX_W_0F3816_L_1
) },
6922 /* VEX_LEN_0F3819 */
6925 { VEX_W_TABLE (VEX_W_0F3819_L_1
) },
6928 /* VEX_LEN_0F381A_M_0 */
6931 { VEX_W_TABLE (VEX_W_0F381A_M_0_L_1
) },
6934 /* VEX_LEN_0F3836 */
6937 { VEX_W_TABLE (VEX_W_0F3836
) },
6940 /* VEX_LEN_0F3841 */
6942 { "vphminposuw", { XM
, EXx
}, PREFIX_DATA
},
6945 /* VEX_LEN_0F3849_X86_64_P_0_W_0_M_0 */
6947 { "ldtilecfg", { M
}, 0 },
6950 /* VEX_LEN_0F3849_X86_64_P_0_W_0_M_1_REG_0_RM_0 */
6952 { "tilerelease", { Skip_MODRM
}, 0 },
6955 /* VEX_LEN_0F3849_X86_64_P_2_W_0_M_0 */
6957 { "sttilecfg", { M
}, 0 },
6960 /* VEX_LEN_0F3849_X86_64_P_3_W_0_M_0 */
6962 { "tilezero", { TMM
, Skip_MODRM
}, 0 },
6965 /* VEX_LEN_0F384B_X86_64_P_1_W_0_M_0 */
6967 { "tilestored", { MVexSIBMEM
, TMM
}, 0 },
6969 /* VEX_LEN_0F384B_X86_64_P_2_W_0_M_0 */
6971 { "tileloaddt1", { TMM
, MVexSIBMEM
}, 0 },
6974 /* VEX_LEN_0F384B_X86_64_P_3_W_0_M_0 */
6976 { "tileloadd", { TMM
, MVexSIBMEM
}, 0 },
6979 /* VEX_LEN_0F385A_M_0 */
6982 { VEX_W_TABLE (VEX_W_0F385A_M_0_L_0
) },
6985 /* VEX_LEN_0F385C_X86_64_P_1_W_0_M_0 */
6987 { "tdpbf16ps", { TMM
, EXtmm
, VexTmm
}, 0 },
6990 /* VEX_LEN_0F385E_X86_64_P_0_W_0_M_0 */
6992 { "tdpbuud", {TMM
, EXtmm
, VexTmm
}, 0 },
6995 /* VEX_LEN_0F385E_X86_64_P_1_W_0_M_0 */
6997 { "tdpbsud", {TMM
, EXtmm
, VexTmm
}, 0 },
7000 /* VEX_LEN_0F385E_X86_64_P_2_W_0_M_0 */
7002 { "tdpbusd", {TMM
, EXtmm
, VexTmm
}, 0 },
7005 /* VEX_LEN_0F385E_X86_64_P_3_W_0_M_0 */
7007 { "tdpbssd", {TMM
, EXtmm
, VexTmm
}, 0 },
7010 /* VEX_LEN_0F38DB */
7012 { "vaesimc", { XM
, EXx
}, PREFIX_DATA
},
7015 /* VEX_LEN_0F38F2 */
7017 { "andnS", { Gdq
, VexGdq
, Edq
}, PREFIX_OPCODE
},
7020 /* VEX_LEN_0F38F3 */
7022 { REG_TABLE(REG_VEX_0F38F3_L_0
) },
7025 /* VEX_LEN_0F38F5 */
7027 { PREFIX_TABLE(PREFIX_VEX_0F38F5_L_0
) },
7030 /* VEX_LEN_0F38F6 */
7032 { PREFIX_TABLE(PREFIX_VEX_0F38F6_L_0
) },
7035 /* VEX_LEN_0F38F7 */
7037 { PREFIX_TABLE(PREFIX_VEX_0F38F7_L_0
) },
7040 /* VEX_LEN_0F3A00 */
7043 { VEX_W_TABLE (VEX_W_0F3A00_L_1
) },
7046 /* VEX_LEN_0F3A01 */
7049 { VEX_W_TABLE (VEX_W_0F3A01_L_1
) },
7052 /* VEX_LEN_0F3A06 */
7055 { VEX_W_TABLE (VEX_W_0F3A06_L_1
) },
7058 /* VEX_LEN_0F3A14 */
7060 { "vpextrb", { Edqb
, XM
, Ib
}, PREFIX_DATA
},
7063 /* VEX_LEN_0F3A15 */
7065 { "vpextrw", { Edqw
, XM
, Ib
}, PREFIX_DATA
},
7068 /* VEX_LEN_0F3A16 */
7070 { "vpextrK", { Edq
, XM
, Ib
}, PREFIX_DATA
},
7073 /* VEX_LEN_0F3A17 */
7075 { "vextractps", { Edqd
, XM
, Ib
}, PREFIX_DATA
},
7078 /* VEX_LEN_0F3A18 */
7081 { VEX_W_TABLE (VEX_W_0F3A18_L_1
) },
7084 /* VEX_LEN_0F3A19 */
7087 { VEX_W_TABLE (VEX_W_0F3A19_L_1
) },
7090 /* VEX_LEN_0F3A20 */
7092 { "vpinsrb", { XM
, Vex
, Edqb
, Ib
}, PREFIX_DATA
},
7095 /* VEX_LEN_0F3A21 */
7097 { "vinsertps", { XM
, Vex
, EXd
, Ib
}, PREFIX_DATA
},
7100 /* VEX_LEN_0F3A22 */
7102 { "vpinsrK", { XM
, Vex
, Edq
, Ib
}, PREFIX_DATA
},
7105 /* VEX_LEN_0F3A30 */
7107 { MOD_TABLE (MOD_VEX_0F3A30_L_0
) },
7110 /* VEX_LEN_0F3A31 */
7112 { MOD_TABLE (MOD_VEX_0F3A31_L_0
) },
7115 /* VEX_LEN_0F3A32 */
7117 { MOD_TABLE (MOD_VEX_0F3A32_L_0
) },
7120 /* VEX_LEN_0F3A33 */
7122 { MOD_TABLE (MOD_VEX_0F3A33_L_0
) },
7125 /* VEX_LEN_0F3A38 */
7128 { VEX_W_TABLE (VEX_W_0F3A38_L_1
) },
7131 /* VEX_LEN_0F3A39 */
7134 { VEX_W_TABLE (VEX_W_0F3A39_L_1
) },
7137 /* VEX_LEN_0F3A41 */
7139 { "vdppd", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
7142 /* VEX_LEN_0F3A46 */
7145 { VEX_W_TABLE (VEX_W_0F3A46_L_1
) },
7148 /* VEX_LEN_0F3A60 */
7150 { "vpcmpestrm!%LQ", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7153 /* VEX_LEN_0F3A61 */
7155 { "vpcmpestri!%LQ", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7158 /* VEX_LEN_0F3A62 */
7160 { "vpcmpistrm", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7163 /* VEX_LEN_0F3A63 */
7165 { "vpcmpistri", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7168 /* VEX_LEN_0F3ADF */
7170 { "vaeskeygenassist", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7173 /* VEX_LEN_0F3AF0 */
7175 { PREFIX_TABLE (PREFIX_VEX_0F3AF0_L_0
) },
7178 /* VEX_LEN_0FXOP_08_85 */
7180 { VEX_W_TABLE (VEX_W_0FXOP_08_85_L_0
) },
7183 /* VEX_LEN_0FXOP_08_86 */
7185 { VEX_W_TABLE (VEX_W_0FXOP_08_86_L_0
) },
7188 /* VEX_LEN_0FXOP_08_87 */
7190 { VEX_W_TABLE (VEX_W_0FXOP_08_87_L_0
) },
7193 /* VEX_LEN_0FXOP_08_8E */
7195 { VEX_W_TABLE (VEX_W_0FXOP_08_8E_L_0
) },
7198 /* VEX_LEN_0FXOP_08_8F */
7200 { VEX_W_TABLE (VEX_W_0FXOP_08_8F_L_0
) },
7203 /* VEX_LEN_0FXOP_08_95 */
7205 { VEX_W_TABLE (VEX_W_0FXOP_08_95_L_0
) },
7208 /* VEX_LEN_0FXOP_08_96 */
7210 { VEX_W_TABLE (VEX_W_0FXOP_08_96_L_0
) },
7213 /* VEX_LEN_0FXOP_08_97 */
7215 { VEX_W_TABLE (VEX_W_0FXOP_08_97_L_0
) },
7218 /* VEX_LEN_0FXOP_08_9E */
7220 { VEX_W_TABLE (VEX_W_0FXOP_08_9E_L_0
) },
7223 /* VEX_LEN_0FXOP_08_9F */
7225 { VEX_W_TABLE (VEX_W_0FXOP_08_9F_L_0
) },
7228 /* VEX_LEN_0FXOP_08_A3 */
7230 { "vpperm", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7233 /* VEX_LEN_0FXOP_08_A6 */
7235 { VEX_W_TABLE (VEX_W_0FXOP_08_A6_L_0
) },
7238 /* VEX_LEN_0FXOP_08_B6 */
7240 { VEX_W_TABLE (VEX_W_0FXOP_08_B6_L_0
) },
7243 /* VEX_LEN_0FXOP_08_C0 */
7245 { VEX_W_TABLE (VEX_W_0FXOP_08_C0_L_0
) },
7248 /* VEX_LEN_0FXOP_08_C1 */
7250 { VEX_W_TABLE (VEX_W_0FXOP_08_C1_L_0
) },
7253 /* VEX_LEN_0FXOP_08_C2 */
7255 { VEX_W_TABLE (VEX_W_0FXOP_08_C2_L_0
) },
7258 /* VEX_LEN_0FXOP_08_C3 */
7260 { VEX_W_TABLE (VEX_W_0FXOP_08_C3_L_0
) },
7263 /* VEX_LEN_0FXOP_08_CC */
7265 { VEX_W_TABLE (VEX_W_0FXOP_08_CC_L_0
) },
7268 /* VEX_LEN_0FXOP_08_CD */
7270 { VEX_W_TABLE (VEX_W_0FXOP_08_CD_L_0
) },
7273 /* VEX_LEN_0FXOP_08_CE */
7275 { VEX_W_TABLE (VEX_W_0FXOP_08_CE_L_0
) },
7278 /* VEX_LEN_0FXOP_08_CF */
7280 { VEX_W_TABLE (VEX_W_0FXOP_08_CF_L_0
) },
7283 /* VEX_LEN_0FXOP_08_EC */
7285 { VEX_W_TABLE (VEX_W_0FXOP_08_EC_L_0
) },
7288 /* VEX_LEN_0FXOP_08_ED */
7290 { VEX_W_TABLE (VEX_W_0FXOP_08_ED_L_0
) },
7293 /* VEX_LEN_0FXOP_08_EE */
7295 { VEX_W_TABLE (VEX_W_0FXOP_08_EE_L_0
) },
7298 /* VEX_LEN_0FXOP_08_EF */
7300 { VEX_W_TABLE (VEX_W_0FXOP_08_EF_L_0
) },
7303 /* VEX_LEN_0FXOP_09_01 */
7305 { REG_TABLE (REG_0FXOP_09_01_L_0
) },
7308 /* VEX_LEN_0FXOP_09_02 */
7310 { REG_TABLE (REG_0FXOP_09_02_L_0
) },
7313 /* VEX_LEN_0FXOP_09_12_M_1 */
7315 { REG_TABLE (REG_0FXOP_09_12_M_1_L_0
) },
7318 /* VEX_LEN_0FXOP_09_82_W_0 */
7320 { "vfrczss", { XM
, EXd
}, 0 },
7323 /* VEX_LEN_0FXOP_09_83_W_0 */
7325 { "vfrczsd", { XM
, EXq
}, 0 },
7328 /* VEX_LEN_0FXOP_09_90 */
7330 { "vprotb", { XM
, EXx
, VexW
}, 0 },
7333 /* VEX_LEN_0FXOP_09_91 */
7335 { "vprotw", { XM
, EXx
, VexW
}, 0 },
7338 /* VEX_LEN_0FXOP_09_92 */
7340 { "vprotd", { XM
, EXx
, VexW
}, 0 },
7343 /* VEX_LEN_0FXOP_09_93 */
7345 { "vprotq", { XM
, EXx
, VexW
}, 0 },
7348 /* VEX_LEN_0FXOP_09_94 */
7350 { "vpshlb", { XM
, EXx
, VexW
}, 0 },
7353 /* VEX_LEN_0FXOP_09_95 */
7355 { "vpshlw", { XM
, EXx
, VexW
}, 0 },
7358 /* VEX_LEN_0FXOP_09_96 */
7360 { "vpshld", { XM
, EXx
, VexW
}, 0 },
7363 /* VEX_LEN_0FXOP_09_97 */
7365 { "vpshlq", { XM
, EXx
, VexW
}, 0 },
7368 /* VEX_LEN_0FXOP_09_98 */
7370 { "vpshab", { XM
, EXx
, VexW
}, 0 },
7373 /* VEX_LEN_0FXOP_09_99 */
7375 { "vpshaw", { XM
, EXx
, VexW
}, 0 },
7378 /* VEX_LEN_0FXOP_09_9A */
7380 { "vpshad", { XM
, EXx
, VexW
}, 0 },
7383 /* VEX_LEN_0FXOP_09_9B */
7385 { "vpshaq", { XM
, EXx
, VexW
}, 0 },
7388 /* VEX_LEN_0FXOP_09_C1 */
7390 { VEX_W_TABLE (VEX_W_0FXOP_09_C1_L_0
) },
7393 /* VEX_LEN_0FXOP_09_C2 */
7395 { VEX_W_TABLE (VEX_W_0FXOP_09_C2_L_0
) },
7398 /* VEX_LEN_0FXOP_09_C3 */
7400 { VEX_W_TABLE (VEX_W_0FXOP_09_C3_L_0
) },
7403 /* VEX_LEN_0FXOP_09_C6 */
7405 { VEX_W_TABLE (VEX_W_0FXOP_09_C6_L_0
) },
7408 /* VEX_LEN_0FXOP_09_C7 */
7410 { VEX_W_TABLE (VEX_W_0FXOP_09_C7_L_0
) },
7413 /* VEX_LEN_0FXOP_09_CB */
7415 { VEX_W_TABLE (VEX_W_0FXOP_09_CB_L_0
) },
7418 /* VEX_LEN_0FXOP_09_D1 */
7420 { VEX_W_TABLE (VEX_W_0FXOP_09_D1_L_0
) },
7423 /* VEX_LEN_0FXOP_09_D2 */
7425 { VEX_W_TABLE (VEX_W_0FXOP_09_D2_L_0
) },
7428 /* VEX_LEN_0FXOP_09_D3 */
7430 { VEX_W_TABLE (VEX_W_0FXOP_09_D3_L_0
) },
7433 /* VEX_LEN_0FXOP_09_D6 */
7435 { VEX_W_TABLE (VEX_W_0FXOP_09_D6_L_0
) },
7438 /* VEX_LEN_0FXOP_09_D7 */
7440 { VEX_W_TABLE (VEX_W_0FXOP_09_D7_L_0
) },
7443 /* VEX_LEN_0FXOP_09_DB */
7445 { VEX_W_TABLE (VEX_W_0FXOP_09_DB_L_0
) },
7448 /* VEX_LEN_0FXOP_09_E1 */
7450 { VEX_W_TABLE (VEX_W_0FXOP_09_E1_L_0
) },
7453 /* VEX_LEN_0FXOP_09_E2 */
7455 { VEX_W_TABLE (VEX_W_0FXOP_09_E2_L_0
) },
7458 /* VEX_LEN_0FXOP_09_E3 */
7460 { VEX_W_TABLE (VEX_W_0FXOP_09_E3_L_0
) },
7463 /* VEX_LEN_0FXOP_0A_12 */
7465 { REG_TABLE (REG_0FXOP_0A_12_L_0
) },
7469 #include "i386-dis-evex-len.h"
7471 static const struct dis386 vex_w_table
[][2] = {
7473 /* VEX_W_0F41_L_1_M_1 */
7474 { PREFIX_TABLE (PREFIX_VEX_0F41_L_1_M_1_W_0
) },
7475 { PREFIX_TABLE (PREFIX_VEX_0F41_L_1_M_1_W_1
) },
7478 /* VEX_W_0F42_L_1_M_1 */
7479 { PREFIX_TABLE (PREFIX_VEX_0F42_L_1_M_1_W_0
) },
7480 { PREFIX_TABLE (PREFIX_VEX_0F42_L_1_M_1_W_1
) },
7483 /* VEX_W_0F44_L_0_M_1 */
7484 { PREFIX_TABLE (PREFIX_VEX_0F44_L_0_M_1_W_0
) },
7485 { PREFIX_TABLE (PREFIX_VEX_0F44_L_0_M_1_W_1
) },
7488 /* VEX_W_0F45_L_1_M_1 */
7489 { PREFIX_TABLE (PREFIX_VEX_0F45_L_1_M_1_W_0
) },
7490 { PREFIX_TABLE (PREFIX_VEX_0F45_L_1_M_1_W_1
) },
7493 /* VEX_W_0F46_L_1_M_1 */
7494 { PREFIX_TABLE (PREFIX_VEX_0F46_L_1_M_1_W_0
) },
7495 { PREFIX_TABLE (PREFIX_VEX_0F46_L_1_M_1_W_1
) },
7498 /* VEX_W_0F47_L_1_M_1 */
7499 { PREFIX_TABLE (PREFIX_VEX_0F47_L_1_M_1_W_0
) },
7500 { PREFIX_TABLE (PREFIX_VEX_0F47_L_1_M_1_W_1
) },
7503 /* VEX_W_0F4A_L_1_M_1 */
7504 { PREFIX_TABLE (PREFIX_VEX_0F4A_L_1_M_1_W_0
) },
7505 { PREFIX_TABLE (PREFIX_VEX_0F4A_L_1_M_1_W_1
) },
7508 /* VEX_W_0F4B_L_1_M_1 */
7509 { PREFIX_TABLE (PREFIX_VEX_0F4B_L_1_M_1_W_0
) },
7510 { PREFIX_TABLE (PREFIX_VEX_0F4B_L_1_M_1_W_1
) },
7513 /* VEX_W_0F90_L_0 */
7514 { PREFIX_TABLE (PREFIX_VEX_0F90_L_0_W_0
) },
7515 { PREFIX_TABLE (PREFIX_VEX_0F90_L_0_W_1
) },
7518 /* VEX_W_0F91_L_0_M_0 */
7519 { PREFIX_TABLE (PREFIX_VEX_0F91_L_0_M_0_W_0
) },
7520 { PREFIX_TABLE (PREFIX_VEX_0F91_L_0_M_0_W_1
) },
7523 /* VEX_W_0F92_L_0_M_1 */
7524 { PREFIX_TABLE (PREFIX_VEX_0F92_L_0_M_1_W_0
) },
7525 { PREFIX_TABLE (PREFIX_VEX_0F92_L_0_M_1_W_1
) },
7528 /* VEX_W_0F93_L_0_M_1 */
7529 { PREFIX_TABLE (PREFIX_VEX_0F93_L_0_M_1_W_0
) },
7530 { PREFIX_TABLE (PREFIX_VEX_0F93_L_0_M_1_W_1
) },
7533 /* VEX_W_0F98_L_0_M_1 */
7534 { PREFIX_TABLE (PREFIX_VEX_0F98_L_0_M_1_W_0
) },
7535 { PREFIX_TABLE (PREFIX_VEX_0F98_L_0_M_1_W_1
) },
7538 /* VEX_W_0F99_L_0_M_1 */
7539 { PREFIX_TABLE (PREFIX_VEX_0F99_L_0_M_1_W_0
) },
7540 { PREFIX_TABLE (PREFIX_VEX_0F99_L_0_M_1_W_1
) },
7544 { "vpermilps", { XM
, Vex
, EXx
}, PREFIX_DATA
},
7548 { "vpermilpd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
7552 { "vtestps", { XM
, EXx
}, PREFIX_DATA
},
7556 { "vtestpd", { XM
, EXx
}, PREFIX_DATA
},
7560 { "vcvtph2ps", { XM
, EXxmmq
}, PREFIX_DATA
},
7563 /* VEX_W_0F3816_L_1 */
7564 { "vpermps", { XM
, Vex
, EXx
}, PREFIX_DATA
},
7568 { "vbroadcastss", { XM
, EXxmm_md
}, PREFIX_DATA
},
7571 /* VEX_W_0F3819_L_1 */
7572 { "vbroadcastsd", { XM
, EXxmm_mq
}, PREFIX_DATA
},
7575 /* VEX_W_0F381A_M_0_L_1 */
7576 { "vbroadcastf128", { XM
, Mxmm
}, PREFIX_DATA
},
7579 /* VEX_W_0F382C_M_0 */
7580 { "vmaskmovps", { XM
, Vex
, Mx
}, PREFIX_DATA
},
7583 /* VEX_W_0F382D_M_0 */
7584 { "vmaskmovpd", { XM
, Vex
, Mx
}, PREFIX_DATA
},
7587 /* VEX_W_0F382E_M_0 */
7588 { "vmaskmovps", { Mx
, Vex
, XM
}, PREFIX_DATA
},
7591 /* VEX_W_0F382F_M_0 */
7592 { "vmaskmovpd", { Mx
, Vex
, XM
}, PREFIX_DATA
},
7596 { "vpermd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
7600 { "vpsravd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
7603 /* VEX_W_0F3849_X86_64_P_0 */
7604 { MOD_TABLE (MOD_VEX_0F3849_X86_64_P_0_W_0
) },
7607 /* VEX_W_0F3849_X86_64_P_2 */
7608 { MOD_TABLE (MOD_VEX_0F3849_X86_64_P_2_W_0
) },
7611 /* VEX_W_0F3849_X86_64_P_3 */
7612 { MOD_TABLE (MOD_VEX_0F3849_X86_64_P_3_W_0
) },
7615 /* VEX_W_0F384B_X86_64_P_1 */
7616 { MOD_TABLE (MOD_VEX_0F384B_X86_64_P_1_W_0
) },
7619 /* VEX_W_0F384B_X86_64_P_2 */
7620 { MOD_TABLE (MOD_VEX_0F384B_X86_64_P_2_W_0
) },
7623 /* VEX_W_0F384B_X86_64_P_3 */
7624 { MOD_TABLE (MOD_VEX_0F384B_X86_64_P_3_W_0
) },
7628 { "%XV vpdpbusd", { XM
, Vex
, EXx
}, 0 },
7632 { "%XV vpdpbusds", { XM
, Vex
, EXx
}, 0 },
7636 { "%XV vpdpwssd", { XM
, Vex
, EXx
}, 0 },
7640 { "%XV vpdpwssds", { XM
, Vex
, EXx
}, 0 },
7644 { "vpbroadcastd", { XM
, EXxmm_md
}, PREFIX_DATA
},
7648 { "vpbroadcastq", { XM
, EXxmm_mq
}, PREFIX_DATA
},
7651 /* VEX_W_0F385A_M_0_L_0 */
7652 { "vbroadcasti128", { XM
, Mxmm
}, PREFIX_DATA
},
7655 /* VEX_W_0F385C_X86_64_P_1 */
7656 { MOD_TABLE (MOD_VEX_0F385C_X86_64_P_1_W_0
) },
7659 /* VEX_W_0F385E_X86_64_P_0 */
7660 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_0_W_0
) },
7663 /* VEX_W_0F385E_X86_64_P_1 */
7664 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_1_W_0
) },
7667 /* VEX_W_0F385E_X86_64_P_2 */
7668 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_2_W_0
) },
7671 /* VEX_W_0F385E_X86_64_P_3 */
7672 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_3_W_0
) },
7676 { "vpbroadcastb", { XM
, EXxmm_mb
}, PREFIX_DATA
},
7680 { "vpbroadcastw", { XM
, EXxmm_mw
}, PREFIX_DATA
},
7684 { "vgf2p8mulb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
7687 /* VEX_W_0F3A00_L_1 */
7689 { "vpermq", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7692 /* VEX_W_0F3A01_L_1 */
7694 { "vpermpd", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7698 { "vpblendd", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
7702 { "vpermilps", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7706 { "vpermilpd", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7709 /* VEX_W_0F3A06_L_1 */
7710 { "vperm2f128", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
7713 /* VEX_W_0F3A18_L_1 */
7714 { "vinsertf128", { XM
, Vex
, EXxmm
, Ib
}, PREFIX_DATA
},
7717 /* VEX_W_0F3A19_L_1 */
7718 { "vextractf128", { EXxmm
, XM
, Ib
}, PREFIX_DATA
},
7722 { "vcvtps2ph", { EXxmmq
, XM
, EXxEVexS
, Ib
}, PREFIX_DATA
},
7725 /* VEX_W_0F3A38_L_1 */
7726 { "vinserti128", { XM
, Vex
, EXxmm
, Ib
}, PREFIX_DATA
},
7729 /* VEX_W_0F3A39_L_1 */
7730 { "vextracti128", { EXxmm
, XM
, Ib
}, PREFIX_DATA
},
7733 /* VEX_W_0F3A46_L_1 */
7734 { "vperm2i128", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
7738 { "vblendvps", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
7742 { "vblendvpd", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
7746 { "vpblendvb", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
7751 { "vgf2p8affineqb", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
7756 { "vgf2p8affineinvqb", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
7758 /* VEX_W_0FXOP_08_85_L_0 */
7760 { "vpmacssww", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7762 /* VEX_W_0FXOP_08_86_L_0 */
7764 { "vpmacsswd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7766 /* VEX_W_0FXOP_08_87_L_0 */
7768 { "vpmacssdql", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7770 /* VEX_W_0FXOP_08_8E_L_0 */
7772 { "vpmacssdd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7774 /* VEX_W_0FXOP_08_8F_L_0 */
7776 { "vpmacssdqh", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7778 /* VEX_W_0FXOP_08_95_L_0 */
7780 { "vpmacsww", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7782 /* VEX_W_0FXOP_08_96_L_0 */
7784 { "vpmacswd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7786 /* VEX_W_0FXOP_08_97_L_0 */
7788 { "vpmacsdql", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7790 /* VEX_W_0FXOP_08_9E_L_0 */
7792 { "vpmacsdd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7794 /* VEX_W_0FXOP_08_9F_L_0 */
7796 { "vpmacsdqh", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7798 /* VEX_W_0FXOP_08_A6_L_0 */
7800 { "vpmadcsswd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7802 /* VEX_W_0FXOP_08_B6_L_0 */
7804 { "vpmadcswd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7806 /* VEX_W_0FXOP_08_C0_L_0 */
7808 { "vprotb", { XM
, EXx
, Ib
}, 0 },
7810 /* VEX_W_0FXOP_08_C1_L_0 */
7812 { "vprotw", { XM
, EXx
, Ib
}, 0 },
7814 /* VEX_W_0FXOP_08_C2_L_0 */
7816 { "vprotd", { XM
, EXx
, Ib
}, 0 },
7818 /* VEX_W_0FXOP_08_C3_L_0 */
7820 { "vprotq", { XM
, EXx
, Ib
}, 0 },
7822 /* VEX_W_0FXOP_08_CC_L_0 */
7824 { "vpcomb", { XM
, Vex
, EXx
, VPCOM
}, 0 },
7826 /* VEX_W_0FXOP_08_CD_L_0 */
7828 { "vpcomw", { XM
, Vex
, EXx
, VPCOM
}, 0 },
7830 /* VEX_W_0FXOP_08_CE_L_0 */
7832 { "vpcomd", { XM
, Vex
, EXx
, VPCOM
}, 0 },
7834 /* VEX_W_0FXOP_08_CF_L_0 */
7836 { "vpcomq", { XM
, Vex
, EXx
, VPCOM
}, 0 },
7838 /* VEX_W_0FXOP_08_EC_L_0 */
7840 { "vpcomub", { XM
, Vex
, EXx
, VPCOM
}, 0 },
7842 /* VEX_W_0FXOP_08_ED_L_0 */
7844 { "vpcomuw", { XM
, Vex
, EXx
, VPCOM
}, 0 },
7846 /* VEX_W_0FXOP_08_EE_L_0 */
7848 { "vpcomud", { XM
, Vex
, EXx
, VPCOM
}, 0 },
7850 /* VEX_W_0FXOP_08_EF_L_0 */
7852 { "vpcomuq", { XM
, Vex
, EXx
, VPCOM
}, 0 },
7854 /* VEX_W_0FXOP_09_80 */
7856 { "vfrczps", { XM
, EXx
}, 0 },
7858 /* VEX_W_0FXOP_09_81 */
7860 { "vfrczpd", { XM
, EXx
}, 0 },
7862 /* VEX_W_0FXOP_09_82 */
7864 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_82_W_0
) },
7866 /* VEX_W_0FXOP_09_83 */
7868 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_83_W_0
) },
7870 /* VEX_W_0FXOP_09_C1_L_0 */
7872 { "vphaddbw", { XM
, EXxmm
}, 0 },
7874 /* VEX_W_0FXOP_09_C2_L_0 */
7876 { "vphaddbd", { XM
, EXxmm
}, 0 },
7878 /* VEX_W_0FXOP_09_C3_L_0 */
7880 { "vphaddbq", { XM
, EXxmm
}, 0 },
7882 /* VEX_W_0FXOP_09_C6_L_0 */
7884 { "vphaddwd", { XM
, EXxmm
}, 0 },
7886 /* VEX_W_0FXOP_09_C7_L_0 */
7888 { "vphaddwq", { XM
, EXxmm
}, 0 },
7890 /* VEX_W_0FXOP_09_CB_L_0 */
7892 { "vphadddq", { XM
, EXxmm
}, 0 },
7894 /* VEX_W_0FXOP_09_D1_L_0 */
7896 { "vphaddubw", { XM
, EXxmm
}, 0 },
7898 /* VEX_W_0FXOP_09_D2_L_0 */
7900 { "vphaddubd", { XM
, EXxmm
}, 0 },
7902 /* VEX_W_0FXOP_09_D3_L_0 */
7904 { "vphaddubq", { XM
, EXxmm
}, 0 },
7906 /* VEX_W_0FXOP_09_D6_L_0 */
7908 { "vphadduwd", { XM
, EXxmm
}, 0 },
7910 /* VEX_W_0FXOP_09_D7_L_0 */
7912 { "vphadduwq", { XM
, EXxmm
}, 0 },
7914 /* VEX_W_0FXOP_09_DB_L_0 */
7916 { "vphaddudq", { XM
, EXxmm
}, 0 },
7918 /* VEX_W_0FXOP_09_E1_L_0 */
7920 { "vphsubbw", { XM
, EXxmm
}, 0 },
7922 /* VEX_W_0FXOP_09_E2_L_0 */
7924 { "vphsubwd", { XM
, EXxmm
}, 0 },
7926 /* VEX_W_0FXOP_09_E3_L_0 */
7928 { "vphsubdq", { XM
, EXxmm
}, 0 },
7931 #include "i386-dis-evex-w.h"
7934 static const struct dis386 mod_table
[][2] = {
7937 { "leaS", { Gv
, M
}, 0 },
7942 { RM_TABLE (RM_C6_REG_7
) },
7947 { RM_TABLE (RM_C7_REG_7
) },
7951 { "{l|}call^", { indirEp
}, 0 },
7955 { "{l|}jmp^", { indirEp
}, 0 },
7958 /* MOD_0F01_REG_0 */
7959 { X86_64_TABLE (X86_64_0F01_REG_0
) },
7960 { RM_TABLE (RM_0F01_REG_0
) },
7963 /* MOD_0F01_REG_1 */
7964 { X86_64_TABLE (X86_64_0F01_REG_1
) },
7965 { RM_TABLE (RM_0F01_REG_1
) },
7968 /* MOD_0F01_REG_2 */
7969 { X86_64_TABLE (X86_64_0F01_REG_2
) },
7970 { RM_TABLE (RM_0F01_REG_2
) },
7973 /* MOD_0F01_REG_3 */
7974 { X86_64_TABLE (X86_64_0F01_REG_3
) },
7975 { RM_TABLE (RM_0F01_REG_3
) },
7978 /* MOD_0F01_REG_5 */
7979 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_0
) },
7980 { RM_TABLE (RM_0F01_REG_5_MOD_3
) },
7983 /* MOD_0F01_REG_7 */
7984 { "invlpg", { Mb
}, 0 },
7985 { RM_TABLE (RM_0F01_REG_7_MOD_3
) },
7988 /* MOD_0F12_PREFIX_0 */
7989 { "movlpX", { XM
, EXq
}, 0 },
7990 { "movhlps", { XM
, EXq
}, 0 },
7993 /* MOD_0F12_PREFIX_2 */
7994 { "movlpX", { XM
, EXq
}, 0 },
7998 { "movlpX", { EXq
, XM
}, PREFIX_OPCODE
},
8001 /* MOD_0F16_PREFIX_0 */
8002 { "movhpX", { XM
, EXq
}, 0 },
8003 { "movlhps", { XM
, EXq
}, 0 },
8006 /* MOD_0F16_PREFIX_2 */
8007 { "movhpX", { XM
, EXq
}, 0 },
8011 { "movhpX", { EXq
, XM
}, PREFIX_OPCODE
},
8014 /* MOD_0F18_REG_0 */
8015 { "prefetchnta", { Mb
}, 0 },
8016 { "nopQ", { Ev
}, 0 },
8019 /* MOD_0F18_REG_1 */
8020 { "prefetcht0", { Mb
}, 0 },
8021 { "nopQ", { Ev
}, 0 },
8024 /* MOD_0F18_REG_2 */
8025 { "prefetcht1", { Mb
}, 0 },
8026 { "nopQ", { Ev
}, 0 },
8029 /* MOD_0F18_REG_3 */
8030 { "prefetcht2", { Mb
}, 0 },
8031 { "nopQ", { Ev
}, 0 },
8034 /* MOD_0F1A_PREFIX_0 */
8035 { "bndldx", { Gbnd
, Mv_bnd
}, 0 },
8036 { "nopQ", { Ev
}, 0 },
8039 /* MOD_0F1B_PREFIX_0 */
8040 { "bndstx", { Mv_bnd
, Gbnd
}, 0 },
8041 { "nopQ", { Ev
}, 0 },
8044 /* MOD_0F1B_PREFIX_1 */
8045 { "bndmk", { Gbnd
, Mv_bnd
}, 0 },
8046 { "nopQ", { Ev
}, PREFIX_IGNORED
},
8049 /* MOD_0F1C_PREFIX_0 */
8050 { REG_TABLE (REG_0F1C_P_0_MOD_0
) },
8051 { "nopQ", { Ev
}, 0 },
8054 /* MOD_0F1E_PREFIX_1 */
8055 { "nopQ", { Ev
}, PREFIX_IGNORED
},
8056 { REG_TABLE (REG_0F1E_P_1_MOD_3
) },
8059 /* MOD_0F2B_PREFIX_0 */
8060 {"movntps", { Mx
, XM
}, PREFIX_OPCODE
},
8063 /* MOD_0F2B_PREFIX_1 */
8064 {"movntss", { Md
, XM
}, PREFIX_OPCODE
},
8067 /* MOD_0F2B_PREFIX_2 */
8068 {"movntpd", { Mx
, XM
}, PREFIX_OPCODE
},
8071 /* MOD_0F2B_PREFIX_3 */
8072 {"movntsd", { Mq
, XM
}, PREFIX_OPCODE
},
8077 { "movmskpX", { Gdq
, XS
}, PREFIX_OPCODE
},
8082 { REG_TABLE (REG_0F71_MOD_0
) },
8087 { REG_TABLE (REG_0F72_MOD_0
) },
8092 { REG_TABLE (REG_0F73_MOD_0
) },
8095 /* MOD_0FAE_REG_0 */
8096 { "fxsave", { FXSAVE
}, 0 },
8097 { PREFIX_TABLE (PREFIX_0FAE_REG_0_MOD_3
) },
8100 /* MOD_0FAE_REG_1 */
8101 { "fxrstor", { FXSAVE
}, 0 },
8102 { PREFIX_TABLE (PREFIX_0FAE_REG_1_MOD_3
) },
8105 /* MOD_0FAE_REG_2 */
8106 { "ldmxcsr", { Md
}, 0 },
8107 { PREFIX_TABLE (PREFIX_0FAE_REG_2_MOD_3
) },
8110 /* MOD_0FAE_REG_3 */
8111 { "stmxcsr", { Md
}, 0 },
8112 { PREFIX_TABLE (PREFIX_0FAE_REG_3_MOD_3
) },
8115 /* MOD_0FAE_REG_4 */
8116 { PREFIX_TABLE (PREFIX_0FAE_REG_4_MOD_0
) },
8117 { PREFIX_TABLE (PREFIX_0FAE_REG_4_MOD_3
) },
8120 /* MOD_0FAE_REG_5 */
8121 { "xrstor", { FXSAVE
}, PREFIX_OPCODE
},
8122 { PREFIX_TABLE (PREFIX_0FAE_REG_5_MOD_3
) },
8125 /* MOD_0FAE_REG_6 */
8126 { PREFIX_TABLE (PREFIX_0FAE_REG_6_MOD_0
) },
8127 { PREFIX_TABLE (PREFIX_0FAE_REG_6_MOD_3
) },
8130 /* MOD_0FAE_REG_7 */
8131 { PREFIX_TABLE (PREFIX_0FAE_REG_7_MOD_0
) },
8132 { RM_TABLE (RM_0FAE_REG_7_MOD_3
) },
8136 { "lssS", { Gv
, Mp
}, 0 },
8140 { "lfsS", { Gv
, Mp
}, 0 },
8144 { "lgsS", { Gv
, Mp
}, 0 },
8148 { "movntiS", { Edq
, Gdq
}, PREFIX_OPCODE
},
8151 /* MOD_0FC7_REG_3 */
8152 { "xrstors", { FXSAVE
}, 0 },
8155 /* MOD_0FC7_REG_4 */
8156 { "xsavec", { FXSAVE
}, 0 },
8159 /* MOD_0FC7_REG_5 */
8160 { "xsaves", { FXSAVE
}, 0 },
8163 /* MOD_0FC7_REG_6 */
8164 { PREFIX_TABLE (PREFIX_0FC7_REG_6_MOD_0
) },
8165 { PREFIX_TABLE (PREFIX_0FC7_REG_6_MOD_3
) }
8168 /* MOD_0FC7_REG_7 */
8169 { "vmptrst", { Mq
}, 0 },
8170 { PREFIX_TABLE (PREFIX_0FC7_REG_7_MOD_3
) }
8175 { "pmovmskb", { Gdq
, MS
}, 0 },
8178 /* MOD_0FE7_PREFIX_2 */
8179 { "movntdq", { Mx
, XM
}, 0 },
8182 /* MOD_0FF0_PREFIX_3 */
8183 { "lddqu", { XM
, M
}, 0 },
8187 { "movntdqa", { XM
, Mx
}, PREFIX_DATA
},
8190 /* MOD_0F38DC_PREFIX_1 */
8191 { "aesenc128kl", { XM
, M
}, 0 },
8192 { "loadiwkey", { XM
, EXx
}, 0 },
8195 /* MOD_0F38DD_PREFIX_1 */
8196 { "aesdec128kl", { XM
, M
}, 0 },
8199 /* MOD_0F38DE_PREFIX_1 */
8200 { "aesenc256kl", { XM
, M
}, 0 },
8203 /* MOD_0F38DF_PREFIX_1 */
8204 { "aesdec256kl", { XM
, M
}, 0 },
8208 { "wrussK", { M
, Gdq
}, PREFIX_DATA
},
8211 /* MOD_0F38F6_PREFIX_0 */
8212 { "wrssK", { M
, Gdq
}, PREFIX_OPCODE
},
8215 /* MOD_0F38F8_PREFIX_1 */
8216 { "enqcmds", { Gva
, M
}, PREFIX_OPCODE
},
8219 /* MOD_0F38F8_PREFIX_2 */
8220 { "movdir64b", { Gva
, M
}, PREFIX_OPCODE
},
8223 /* MOD_0F38F8_PREFIX_3 */
8224 { "enqcmd", { Gva
, M
}, PREFIX_OPCODE
},
8228 { "movdiri", { Edq
, Gdq
}, PREFIX_OPCODE
},
8231 /* MOD_0F38FA_PREFIX_1 */
8233 { "encodekey128", { Gd
, Ed
}, 0 },
8236 /* MOD_0F38FB_PREFIX_1 */
8238 { "encodekey256", { Gd
, Ed
}, 0 },
8241 /* MOD_0F3A0F_PREFIX_1 */
8243 { REG_TABLE (REG_0F3A0F_PREFIX_1_MOD_3
) },
8247 { "bound{S|}", { Gv
, Ma
}, 0 },
8248 { EVEX_TABLE (EVEX_0F
) },
8252 { "lesS", { Gv
, Mp
}, 0 },
8253 { VEX_C4_TABLE (VEX_0F
) },
8257 { "ldsS", { Gv
, Mp
}, 0 },
8258 { VEX_C5_TABLE (VEX_0F
) },
8261 /* MOD_VEX_0F12_PREFIX_0 */
8262 { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_0
) },
8263 { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_1
) },
8266 /* MOD_VEX_0F12_PREFIX_2 */
8267 { VEX_LEN_TABLE (VEX_LEN_0F12_P_2_M_0
) },
8271 { VEX_LEN_TABLE (VEX_LEN_0F13_M_0
) },
8274 /* MOD_VEX_0F16_PREFIX_0 */
8275 { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_0
) },
8276 { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_1
) },
8279 /* MOD_VEX_0F16_PREFIX_2 */
8280 { VEX_LEN_TABLE (VEX_LEN_0F16_P_2_M_0
) },
8284 { VEX_LEN_TABLE (VEX_LEN_0F17_M_0
) },
8288 { "vmovntpX", { Mx
, XM
}, PREFIX_OPCODE
},
8291 /* MOD_VEX_0F41_L_1 */
8293 { VEX_W_TABLE (VEX_W_0F41_L_1_M_1
) },
8296 /* MOD_VEX_0F42_L_1 */
8298 { VEX_W_TABLE (VEX_W_0F42_L_1_M_1
) },
8301 /* MOD_VEX_0F44_L_0 */
8303 { VEX_W_TABLE (VEX_W_0F44_L_0_M_1
) },
8306 /* MOD_VEX_0F45_L_1 */
8308 { VEX_W_TABLE (VEX_W_0F45_L_1_M_1
) },
8311 /* MOD_VEX_0F46_L_1 */
8313 { VEX_W_TABLE (VEX_W_0F46_L_1_M_1
) },
8316 /* MOD_VEX_0F47_L_1 */
8318 { VEX_W_TABLE (VEX_W_0F47_L_1_M_1
) },
8321 /* MOD_VEX_0F4A_L_1 */
8323 { VEX_W_TABLE (VEX_W_0F4A_L_1_M_1
) },
8326 /* MOD_VEX_0F4B_L_1 */
8328 { VEX_W_TABLE (VEX_W_0F4B_L_1_M_1
) },
8333 { "vmovmskpX", { Gdq
, XS
}, PREFIX_OPCODE
},
8338 { REG_TABLE (REG_VEX_0F71_M_0
) },
8343 { REG_TABLE (REG_VEX_0F72_M_0
) },
8348 { REG_TABLE (REG_VEX_0F73_M_0
) },
8351 /* MOD_VEX_0F91_L_0 */
8352 { VEX_W_TABLE (VEX_W_0F91_L_0_M_0
) },
8355 /* MOD_VEX_0F92_L_0 */
8357 { VEX_W_TABLE (VEX_W_0F92_L_0_M_1
) },
8360 /* MOD_VEX_0F93_L_0 */
8362 { VEX_W_TABLE (VEX_W_0F93_L_0_M_1
) },
8365 /* MOD_VEX_0F98_L_0 */
8367 { VEX_W_TABLE (VEX_W_0F98_L_0_M_1
) },
8370 /* MOD_VEX_0F99_L_0 */
8372 { VEX_W_TABLE (VEX_W_0F99_L_0_M_1
) },
8375 /* MOD_VEX_0FAE_REG_2 */
8376 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_2_M_0
) },
8379 /* MOD_VEX_0FAE_REG_3 */
8380 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_3_M_0
) },
8385 { "vpmovmskb", { Gdq
, XS
}, PREFIX_DATA
},
8389 { "vmovntdq", { Mx
, XM
}, PREFIX_DATA
},
8392 /* MOD_VEX_0FF0_PREFIX_3 */
8393 { "vlddqu", { XM
, M
}, 0 },
8396 /* MOD_VEX_0F381A */
8397 { VEX_LEN_TABLE (VEX_LEN_0F381A_M_0
) },
8400 /* MOD_VEX_0F382A */
8401 { "vmovntdqa", { XM
, Mx
}, PREFIX_DATA
},
8404 /* MOD_VEX_0F382C */
8405 { VEX_W_TABLE (VEX_W_0F382C_M_0
) },
8408 /* MOD_VEX_0F382D */
8409 { VEX_W_TABLE (VEX_W_0F382D_M_0
) },
8412 /* MOD_VEX_0F382E */
8413 { VEX_W_TABLE (VEX_W_0F382E_M_0
) },
8416 /* MOD_VEX_0F382F */
8417 { VEX_W_TABLE (VEX_W_0F382F_M_0
) },
8420 /* MOD_VEX_0F3849_X86_64_P_0_W_0 */
8421 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_0_W_0_M_0
) },
8422 { REG_TABLE (REG_VEX_0F3849_X86_64_P_0_W_0_M_1
) },
8425 /* MOD_VEX_0F3849_X86_64_P_2_W_0 */
8426 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_2_W_0_M_0
) },
8429 /* MOD_VEX_0F3849_X86_64_P_3_W_0 */
8431 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_3_W_0_M_0
) },
8434 /* MOD_VEX_0F384B_X86_64_P_1_W_0 */
8435 { VEX_LEN_TABLE (VEX_LEN_0F384B_X86_64_P_1_W_0_M_0
) },
8438 /* MOD_VEX_0F384B_X86_64_P_2_W_0 */
8439 { VEX_LEN_TABLE (VEX_LEN_0F384B_X86_64_P_2_W_0_M_0
) },
8442 /* MOD_VEX_0F384B_X86_64_P_3_W_0 */
8443 { VEX_LEN_TABLE (VEX_LEN_0F384B_X86_64_P_3_W_0_M_0
) },
8446 /* MOD_VEX_0F385A */
8447 { VEX_LEN_TABLE (VEX_LEN_0F385A_M_0
) },
8450 /* MOD_VEX_0F385C_X86_64_P_1_W_0 */
8452 { VEX_LEN_TABLE (VEX_LEN_0F385C_X86_64_P_1_W_0_M_0
) },
8455 /* MOD_VEX_0F385E_X86_64_P_0_W_0 */
8457 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_0_W_0_M_0
) },
8460 /* MOD_VEX_0F385E_X86_64_P_1_W_0 */
8462 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_1_W_0_M_0
) },
8465 /* MOD_VEX_0F385E_X86_64_P_2_W_0 */
8467 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_2_W_0_M_0
) },
8470 /* MOD_VEX_0F385E_X86_64_P_3_W_0 */
8472 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_3_W_0_M_0
) },
8475 /* MOD_VEX_0F388C */
8476 { "vpmaskmov%DQ", { XM
, Vex
, Mx
}, PREFIX_DATA
},
8479 /* MOD_VEX_0F388E */
8480 { "vpmaskmov%DQ", { Mx
, Vex
, XM
}, PREFIX_DATA
},
8483 /* MOD_VEX_0F3A30_L_0 */
8485 { "kshiftr%BW", { MaskG
, MaskE
, Ib
}, PREFIX_DATA
},
8488 /* MOD_VEX_0F3A31_L_0 */
8490 { "kshiftr%DQ", { MaskG
, MaskE
, Ib
}, PREFIX_DATA
},
8493 /* MOD_VEX_0F3A32_L_0 */
8495 { "kshiftl%BW", { MaskG
, MaskE
, Ib
}, PREFIX_DATA
},
8498 /* MOD_VEX_0F3A33_L_0 */
8500 { "kshiftl%DQ", { MaskG
, MaskE
, Ib
}, PREFIX_DATA
},
8503 /* MOD_VEX_0FXOP_09_12 */
8505 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_12_M_1
) },
8508 #include "i386-dis-evex-mod.h"
8511 static const struct dis386 rm_table
[][8] = {
8514 { "xabort", { Skip_MODRM
, Ib
}, 0 },
8518 { "xbeginT", { Skip_MODRM
, Jdqw
}, 0 },
8522 { "enclv", { Skip_MODRM
}, 0 },
8523 { "vmcall", { Skip_MODRM
}, 0 },
8524 { "vmlaunch", { Skip_MODRM
}, 0 },
8525 { "vmresume", { Skip_MODRM
}, 0 },
8526 { "vmxoff", { Skip_MODRM
}, 0 },
8527 { "pconfig", { Skip_MODRM
}, 0 },
8531 { "monitor", { { OP_Monitor
, 0 } }, 0 },
8532 { "mwait", { { OP_Mwait
, 0 } }, 0 },
8533 { "clac", { Skip_MODRM
}, 0 },
8534 { "stac", { Skip_MODRM
}, 0 },
8535 { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_4
) },
8536 { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_5
) },
8537 { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_6
) },
8538 { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_7
) },
8542 { "xgetbv", { Skip_MODRM
}, 0 },
8543 { "xsetbv", { Skip_MODRM
}, 0 },
8546 { "vmfunc", { Skip_MODRM
}, 0 },
8547 { "xend", { Skip_MODRM
}, 0 },
8548 { "xtest", { Skip_MODRM
}, 0 },
8549 { "enclu", { Skip_MODRM
}, 0 },
8553 { "vmrun", { Skip_MODRM
}, 0 },
8554 { PREFIX_TABLE (PREFIX_0F01_REG_3_RM_1
) },
8555 { "vmload", { Skip_MODRM
}, 0 },
8556 { "vmsave", { Skip_MODRM
}, 0 },
8557 { "stgi", { Skip_MODRM
}, 0 },
8558 { "clgi", { Skip_MODRM
}, 0 },
8559 { "skinit", { Skip_MODRM
}, 0 },
8560 { "invlpga", { Skip_MODRM
}, 0 },
8563 /* RM_0F01_REG_5_MOD_3 */
8564 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_0
) },
8565 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_1
) },
8566 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_2
) },
8568 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_4
) },
8569 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_5
) },
8570 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_6
) },
8571 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_7
) },
8574 /* RM_0F01_REG_7_MOD_3 */
8575 { "swapgs", { Skip_MODRM
}, 0 },
8576 { "rdtscp", { Skip_MODRM
}, 0 },
8577 { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_2
) },
8578 { "mwaitx", { { OP_Mwait
, eBX_reg
} }, PREFIX_OPCODE
},
8579 { "clzero", { Skip_MODRM
}, 0 },
8580 { "rdpru", { Skip_MODRM
}, 0 },
8581 { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_6
) },
8582 { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_7
) },
8585 /* RM_0F1E_P_1_MOD_3_REG_7 */
8586 { "nopQ", { Ev
}, PREFIX_IGNORED
},
8587 { "nopQ", { Ev
}, PREFIX_IGNORED
},
8588 { "endbr64", { Skip_MODRM
}, 0 },
8589 { "endbr32", { Skip_MODRM
}, 0 },
8590 { "nopQ", { Ev
}, PREFIX_IGNORED
},
8591 { "nopQ", { Ev
}, PREFIX_IGNORED
},
8592 { "nopQ", { Ev
}, PREFIX_IGNORED
},
8593 { "nopQ", { Ev
}, PREFIX_IGNORED
},
8596 /* RM_0F3A0F_P_1_MOD_3_REG_0 */
8597 { "hreset", { Skip_MODRM
, Ib
}, 0 },
8600 /* RM_0FAE_REG_6_MOD_3 */
8601 { "mfence", { Skip_MODRM
}, 0 },
8604 /* RM_0FAE_REG_7_MOD_3 */
8605 { "sfence", { Skip_MODRM
}, 0 },
8609 /* RM_VEX_0F3849_X86_64_P_0_W_0_M_1_R_0 */
8610 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_0_W_0_M_1_REG_0_RM_0
) },
8614 #define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
8616 /* We use the high bit to indicate different name for the same
8618 #define REP_PREFIX (0xf3 | 0x100)
8619 #define XACQUIRE_PREFIX (0xf2 | 0x200)
8620 #define XRELEASE_PREFIX (0xf3 | 0x400)
8621 #define BND_PREFIX (0xf2 | 0x400)
8622 #define NOTRACK_PREFIX (0x3e | 0x100)
8624 /* Remember if the current op is a jump instruction. */
8625 static bfd_boolean op_is_jump
= FALSE
;
8630 int newrex
, i
, length
;
8635 last_lock_prefix
= -1;
8636 last_repz_prefix
= -1;
8637 last_repnz_prefix
= -1;
8638 last_data_prefix
= -1;
8639 last_addr_prefix
= -1;
8640 last_rex_prefix
= -1;
8641 last_seg_prefix
= -1;
8643 active_seg_prefix
= 0;
8644 for (i
= 0; i
< (int) ARRAY_SIZE (all_prefixes
); i
++)
8645 all_prefixes
[i
] = 0;
8648 /* The maximum instruction length is 15bytes. */
8649 while (length
< MAX_CODE_LENGTH
- 1)
8651 FETCH_DATA (the_info
, codep
+ 1);
8655 /* REX prefixes family. */
8672 if (address_mode
== mode_64bit
)
8676 last_rex_prefix
= i
;
8679 prefixes
|= PREFIX_REPZ
;
8680 last_repz_prefix
= i
;
8683 prefixes
|= PREFIX_REPNZ
;
8684 last_repnz_prefix
= i
;
8687 prefixes
|= PREFIX_LOCK
;
8688 last_lock_prefix
= i
;
8691 prefixes
|= PREFIX_CS
;
8692 last_seg_prefix
= i
;
8694 if (address_mode
!= mode_64bit
)
8695 active_seg_prefix
= PREFIX_CS
;
8699 prefixes
|= PREFIX_SS
;
8700 last_seg_prefix
= i
;
8702 if (address_mode
!= mode_64bit
)
8703 active_seg_prefix
= PREFIX_SS
;
8707 prefixes
|= PREFIX_DS
;
8708 last_seg_prefix
= i
;
8710 if (address_mode
!= mode_64bit
)
8711 active_seg_prefix
= PREFIX_DS
;
8715 prefixes
|= PREFIX_ES
;
8716 last_seg_prefix
= i
;
8718 if (address_mode
!= mode_64bit
)
8719 active_seg_prefix
= PREFIX_ES
;
8723 prefixes
|= PREFIX_FS
;
8724 last_seg_prefix
= i
;
8725 active_seg_prefix
= PREFIX_FS
;
8728 prefixes
|= PREFIX_GS
;
8729 last_seg_prefix
= i
;
8730 active_seg_prefix
= PREFIX_GS
;
8733 prefixes
|= PREFIX_DATA
;
8734 last_data_prefix
= i
;
8737 prefixes
|= PREFIX_ADDR
;
8738 last_addr_prefix
= i
;
8741 /* fwait is really an instruction. If there are prefixes
8742 before the fwait, they belong to the fwait, *not* to the
8743 following instruction. */
8745 if (prefixes
|| rex
)
8747 prefixes
|= PREFIX_FWAIT
;
8749 /* This ensures that the previous REX prefixes are noticed
8750 as unused prefixes, as in the return case below. */
8754 prefixes
= PREFIX_FWAIT
;
8759 /* Rex is ignored when followed by another prefix. */
8765 if (*codep
!= FWAIT_OPCODE
)
8766 all_prefixes
[i
++] = *codep
;
8774 /* Return the name of the prefix byte PREF, or NULL if PREF is not a
8778 prefix_name (int pref
, int sizeflag
)
8780 static const char *rexes
[16] =
8785 "rex.XB", /* 0x43 */
8787 "rex.RB", /* 0x45 */
8788 "rex.RX", /* 0x46 */
8789 "rex.RXB", /* 0x47 */
8791 "rex.WB", /* 0x49 */
8792 "rex.WX", /* 0x4a */
8793 "rex.WXB", /* 0x4b */
8794 "rex.WR", /* 0x4c */
8795 "rex.WRB", /* 0x4d */
8796 "rex.WRX", /* 0x4e */
8797 "rex.WRXB", /* 0x4f */
8802 /* REX prefixes family. */
8819 return rexes
[pref
- 0x40];
8839 return (sizeflag
& DFLAG
) ? "data16" : "data32";
8841 if (address_mode
== mode_64bit
)
8842 return (sizeflag
& AFLAG
) ? "addr32" : "addr64";
8844 return (sizeflag
& AFLAG
) ? "addr16" : "addr32";
8849 case XACQUIRE_PREFIX
:
8851 case XRELEASE_PREFIX
:
8855 case NOTRACK_PREFIX
:
8862 static char op_out
[MAX_OPERANDS
][100];
8863 static int op_ad
, op_index
[MAX_OPERANDS
];
8864 static int two_source_ops
;
8865 static bfd_vma op_address
[MAX_OPERANDS
];
8866 static bfd_vma op_riprel
[MAX_OPERANDS
];
8867 static bfd_vma start_pc
;
8870 * On the 386's of 1988, the maximum length of an instruction is 15 bytes.
8871 * (see topic "Redundant prefixes" in the "Differences from 8086"
8872 * section of the "Virtual 8086 Mode" chapter.)
8873 * 'pc' should be the address of this instruction, it will
8874 * be used to print the target address if this is a relative jump or call
8875 * The function returns the length of this instruction in bytes.
8878 static char intel_syntax
;
8879 static char intel_mnemonic
= !SYSV386_COMPAT
;
8880 static char open_char
;
8881 static char close_char
;
8882 static char separator_char
;
8883 static char scale_char
;
8891 static enum x86_64_isa isa64
;
8893 /* Here for backwards compatibility. When gdb stops using
8894 print_insn_i386_att and print_insn_i386_intel these functions can
8895 disappear, and print_insn_i386 be merged into print_insn. */
8897 print_insn_i386_att (bfd_vma pc
, disassemble_info
*info
)
8901 return print_insn (pc
, info
);
8905 print_insn_i386_intel (bfd_vma pc
, disassemble_info
*info
)
8909 return print_insn (pc
, info
);
8913 print_insn_i386 (bfd_vma pc
, disassemble_info
*info
)
8917 return print_insn (pc
, info
);
8921 print_i386_disassembler_options (FILE *stream
)
8923 fprintf (stream
, _("\n\
8924 The following i386/x86-64 specific disassembler options are supported for use\n\
8925 with the -M switch (multiple options should be separated by commas):\n"));
8927 fprintf (stream
, _(" x86-64 Disassemble in 64bit mode\n"));
8928 fprintf (stream
, _(" i386 Disassemble in 32bit mode\n"));
8929 fprintf (stream
, _(" i8086 Disassemble in 16bit mode\n"));
8930 fprintf (stream
, _(" att Display instruction in AT&T syntax\n"));
8931 fprintf (stream
, _(" intel Display instruction in Intel syntax\n"));
8932 fprintf (stream
, _(" att-mnemonic\n"
8933 " Display instruction in AT&T mnemonic\n"));
8934 fprintf (stream
, _(" intel-mnemonic\n"
8935 " Display instruction in Intel mnemonic\n"));
8936 fprintf (stream
, _(" addr64 Assume 64bit address size\n"));
8937 fprintf (stream
, _(" addr32 Assume 32bit address size\n"));
8938 fprintf (stream
, _(" addr16 Assume 16bit address size\n"));
8939 fprintf (stream
, _(" data32 Assume 32bit data size\n"));
8940 fprintf (stream
, _(" data16 Assume 16bit data size\n"));
8941 fprintf (stream
, _(" suffix Always display instruction suffix in AT&T syntax\n"));
8942 fprintf (stream
, _(" amd64 Display instruction in AMD64 ISA\n"));
8943 fprintf (stream
, _(" intel64 Display instruction in Intel64 ISA\n"));
8947 static const struct dis386 bad_opcode
= { "(bad)", { XX
}, 0 };
8949 /* Get a pointer to struct dis386 with a valid name. */
8951 static const struct dis386
*
8952 get_valid_dis386 (const struct dis386
*dp
, disassemble_info
*info
)
8954 int vindex
, vex_table_index
;
8956 if (dp
->name
!= NULL
)
8959 switch (dp
->op
[0].bytemode
)
8962 dp
= ®_table
[dp
->op
[1].bytemode
][modrm
.reg
];
8966 vindex
= modrm
.mod
== 0x3 ? 1 : 0;
8967 dp
= &mod_table
[dp
->op
[1].bytemode
][vindex
];
8971 dp
= &rm_table
[dp
->op
[1].bytemode
][modrm
.rm
];
8974 case USE_PREFIX_TABLE
:
8977 /* The prefix in VEX is implicit. */
8983 case REPE_PREFIX_OPCODE
:
8986 case DATA_PREFIX_OPCODE
:
8989 case REPNE_PREFIX_OPCODE
:
8999 int last_prefix
= -1;
9002 /* We check PREFIX_REPNZ and PREFIX_REPZ before PREFIX_DATA.
9003 When there are multiple PREFIX_REPNZ and PREFIX_REPZ, the
9005 if ((prefixes
& (PREFIX_REPZ
| PREFIX_REPNZ
)) != 0)
9007 if (last_repz_prefix
> last_repnz_prefix
)
9010 prefix
= PREFIX_REPZ
;
9011 last_prefix
= last_repz_prefix
;
9016 prefix
= PREFIX_REPNZ
;
9017 last_prefix
= last_repnz_prefix
;
9020 /* Check if prefix should be ignored. */
9021 if ((((prefix_table
[dp
->op
[1].bytemode
][vindex
].prefix_requirement
9022 & PREFIX_IGNORED
) >> PREFIX_IGNORED_SHIFT
)
9024 && !prefix_table
[dp
->op
[1].bytemode
][vindex
].name
)
9028 if (vindex
== 0 && (prefixes
& PREFIX_DATA
) != 0)
9031 prefix
= PREFIX_DATA
;
9032 last_prefix
= last_data_prefix
;
9037 used_prefixes
|= prefix
;
9038 all_prefixes
[last_prefix
] = 0;
9041 dp
= &prefix_table
[dp
->op
[1].bytemode
][vindex
];
9044 case USE_X86_64_TABLE
:
9045 vindex
= address_mode
== mode_64bit
? 1 : 0;
9046 dp
= &x86_64_table
[dp
->op
[1].bytemode
][vindex
];
9049 case USE_3BYTE_TABLE
:
9050 FETCH_DATA (info
, codep
+ 2);
9052 dp
= &three_byte_table
[dp
->op
[1].bytemode
][vindex
];
9054 modrm
.mod
= (*codep
>> 6) & 3;
9055 modrm
.reg
= (*codep
>> 3) & 7;
9056 modrm
.rm
= *codep
& 7;
9059 case USE_VEX_LEN_TABLE
:
9076 dp
= &vex_len_table
[dp
->op
[1].bytemode
][vindex
];
9079 case USE_EVEX_LEN_TABLE
:
9099 dp
= &evex_len_table
[dp
->op
[1].bytemode
][vindex
];
9102 case USE_XOP_8F_TABLE
:
9103 FETCH_DATA (info
, codep
+ 3);
9104 rex
= ~(*codep
>> 5) & 0x7;
9106 /* VEX_TABLE_INDEX is the mmmmm part of the XOP byte 1 "RCB.mmmmm". */
9107 switch ((*codep
& 0x1f))
9113 vex_table_index
= XOP_08
;
9116 vex_table_index
= XOP_09
;
9119 vex_table_index
= XOP_0A
;
9123 vex
.w
= *codep
& 0x80;
9124 if (vex
.w
&& address_mode
== mode_64bit
)
9127 vex
.register_specifier
= (~(*codep
>> 3)) & 0xf;
9128 if (address_mode
!= mode_64bit
)
9130 /* In 16/32-bit mode REX_B is silently ignored. */
9134 vex
.length
= (*codep
& 0x4) ? 256 : 128;
9135 switch ((*codep
& 0x3))
9140 vex
.prefix
= DATA_PREFIX_OPCODE
;
9143 vex
.prefix
= REPE_PREFIX_OPCODE
;
9146 vex
.prefix
= REPNE_PREFIX_OPCODE
;
9152 dp
= &xop_table
[vex_table_index
][vindex
];
9155 FETCH_DATA (info
, codep
+ 1);
9156 modrm
.mod
= (*codep
>> 6) & 3;
9157 modrm
.reg
= (*codep
>> 3) & 7;
9158 modrm
.rm
= *codep
& 7;
9160 /* No XOP encoding so far allows for a non-zero embedded prefix. Avoid
9161 having to decode the bits for every otherwise valid encoding. */
9166 case USE_VEX_C4_TABLE
:
9168 FETCH_DATA (info
, codep
+ 3);
9169 rex
= ~(*codep
>> 5) & 0x7;
9170 switch ((*codep
& 0x1f))
9176 vex_table_index
= VEX_0F
;
9179 vex_table_index
= VEX_0F38
;
9182 vex_table_index
= VEX_0F3A
;
9186 vex
.w
= *codep
& 0x80;
9187 if (address_mode
== mode_64bit
)
9194 /* For the 3-byte VEX prefix in 32-bit mode, the REX_B bit
9195 is ignored, other REX bits are 0 and the highest bit in
9196 VEX.vvvv is also ignored (but we mustn't clear it here). */
9199 vex
.register_specifier
= (~(*codep
>> 3)) & 0xf;
9200 vex
.length
= (*codep
& 0x4) ? 256 : 128;
9201 switch ((*codep
& 0x3))
9206 vex
.prefix
= DATA_PREFIX_OPCODE
;
9209 vex
.prefix
= REPE_PREFIX_OPCODE
;
9212 vex
.prefix
= REPNE_PREFIX_OPCODE
;
9218 dp
= &vex_table
[vex_table_index
][vindex
];
9220 /* There is no MODRM byte for VEX0F 77. */
9221 if (vex_table_index
!= VEX_0F
|| vindex
!= 0x77)
9223 FETCH_DATA (info
, codep
+ 1);
9224 modrm
.mod
= (*codep
>> 6) & 3;
9225 modrm
.reg
= (*codep
>> 3) & 7;
9226 modrm
.rm
= *codep
& 7;
9230 case USE_VEX_C5_TABLE
:
9232 FETCH_DATA (info
, codep
+ 2);
9233 rex
= (*codep
& 0x80) ? 0 : REX_R
;
9235 /* For the 2-byte VEX prefix in 32-bit mode, the highest bit in
9237 vex
.register_specifier
= (~(*codep
>> 3)) & 0xf;
9238 vex
.length
= (*codep
& 0x4) ? 256 : 128;
9239 switch ((*codep
& 0x3))
9244 vex
.prefix
= DATA_PREFIX_OPCODE
;
9247 vex
.prefix
= REPE_PREFIX_OPCODE
;
9250 vex
.prefix
= REPNE_PREFIX_OPCODE
;
9256 dp
= &vex_table
[dp
->op
[1].bytemode
][vindex
];
9258 /* There is no MODRM byte for VEX 77. */
9261 FETCH_DATA (info
, codep
+ 1);
9262 modrm
.mod
= (*codep
>> 6) & 3;
9263 modrm
.reg
= (*codep
>> 3) & 7;
9264 modrm
.rm
= *codep
& 7;
9268 case USE_VEX_W_TABLE
:
9272 dp
= &vex_w_table
[dp
->op
[1].bytemode
][vex
.w
? 1 : 0];
9275 case USE_EVEX_TABLE
:
9279 FETCH_DATA (info
, codep
+ 4);
9280 /* The first byte after 0x62. */
9281 rex
= ~(*codep
>> 5) & 0x7;
9282 vex
.r
= *codep
& 0x10;
9283 switch ((*codep
& 0xf))
9288 vex_table_index
= EVEX_0F
;
9291 vex_table_index
= EVEX_0F38
;
9294 vex_table_index
= EVEX_0F3A
;
9298 /* The second byte after 0x62. */
9300 vex
.w
= *codep
& 0x80;
9301 if (vex
.w
&& address_mode
== mode_64bit
)
9304 vex
.register_specifier
= (~(*codep
>> 3)) & 0xf;
9307 if (!(*codep
& 0x4))
9310 switch ((*codep
& 0x3))
9315 vex
.prefix
= DATA_PREFIX_OPCODE
;
9318 vex
.prefix
= REPE_PREFIX_OPCODE
;
9321 vex
.prefix
= REPNE_PREFIX_OPCODE
;
9325 /* The third byte after 0x62. */
9328 /* Remember the static rounding bits. */
9329 vex
.ll
= (*codep
>> 5) & 3;
9330 vex
.b
= (*codep
& 0x10) != 0;
9332 vex
.v
= *codep
& 0x8;
9333 vex
.mask_register_specifier
= *codep
& 0x7;
9334 vex
.zeroing
= *codep
& 0x80;
9336 if (address_mode
!= mode_64bit
)
9338 /* In 16/32-bit mode silently ignore following bits. */
9347 dp
= &evex_table
[vex_table_index
][vindex
];
9349 FETCH_DATA (info
, codep
+ 1);
9350 modrm
.mod
= (*codep
>> 6) & 3;
9351 modrm
.reg
= (*codep
>> 3) & 7;
9352 modrm
.rm
= *codep
& 7;
9354 /* Set vector length. */
9355 if (modrm
.mod
== 3 && vex
.b
)
9384 if (dp
->name
!= NULL
)
9387 return get_valid_dis386 (dp
, info
);
9391 get_sib (disassemble_info
*info
, int sizeflag
)
9393 /* If modrm.mod == 3, operand must be register. */
9395 && ((sizeflag
& AFLAG
) || address_mode
== mode_64bit
)
9399 FETCH_DATA (info
, codep
+ 2);
9400 sib
.index
= (codep
[1] >> 3) & 7;
9401 sib
.scale
= (codep
[1] >> 6) & 3;
9402 sib
.base
= codep
[1] & 7;
9407 print_insn (bfd_vma pc
, disassemble_info
*info
)
9409 const struct dis386
*dp
;
9411 char *op_txt
[MAX_OPERANDS
];
9413 int sizeflag
, orig_sizeflag
;
9415 struct dis_private priv
;
9418 priv
.orig_sizeflag
= AFLAG
| DFLAG
;
9419 if ((info
->mach
& bfd_mach_i386_i386
) != 0)
9420 address_mode
= mode_32bit
;
9421 else if (info
->mach
== bfd_mach_i386_i8086
)
9423 address_mode
= mode_16bit
;
9424 priv
.orig_sizeflag
= 0;
9427 address_mode
= mode_64bit
;
9429 if (intel_syntax
== (char) -1)
9430 intel_syntax
= (info
->mach
& bfd_mach_i386_intel_syntax
) != 0;
9432 for (p
= info
->disassembler_options
; p
!= NULL
; )
9434 if (CONST_STRNEQ (p
, "amd64"))
9436 else if (CONST_STRNEQ (p
, "intel64"))
9438 else if (CONST_STRNEQ (p
, "x86-64"))
9440 address_mode
= mode_64bit
;
9441 priv
.orig_sizeflag
|= AFLAG
| DFLAG
;
9443 else if (CONST_STRNEQ (p
, "i386"))
9445 address_mode
= mode_32bit
;
9446 priv
.orig_sizeflag
|= AFLAG
| DFLAG
;
9448 else if (CONST_STRNEQ (p
, "i8086"))
9450 address_mode
= mode_16bit
;
9451 priv
.orig_sizeflag
&= ~(AFLAG
| DFLAG
);
9453 else if (CONST_STRNEQ (p
, "intel"))
9456 if (CONST_STRNEQ (p
+ 5, "-mnemonic"))
9459 else if (CONST_STRNEQ (p
, "att"))
9462 if (CONST_STRNEQ (p
+ 3, "-mnemonic"))
9465 else if (CONST_STRNEQ (p
, "addr"))
9467 if (address_mode
== mode_64bit
)
9469 if (p
[4] == '3' && p
[5] == '2')
9470 priv
.orig_sizeflag
&= ~AFLAG
;
9471 else if (p
[4] == '6' && p
[5] == '4')
9472 priv
.orig_sizeflag
|= AFLAG
;
9476 if (p
[4] == '1' && p
[5] == '6')
9477 priv
.orig_sizeflag
&= ~AFLAG
;
9478 else if (p
[4] == '3' && p
[5] == '2')
9479 priv
.orig_sizeflag
|= AFLAG
;
9482 else if (CONST_STRNEQ (p
, "data"))
9484 if (p
[4] == '1' && p
[5] == '6')
9485 priv
.orig_sizeflag
&= ~DFLAG
;
9486 else if (p
[4] == '3' && p
[5] == '2')
9487 priv
.orig_sizeflag
|= DFLAG
;
9489 else if (CONST_STRNEQ (p
, "suffix"))
9490 priv
.orig_sizeflag
|= SUFFIX_ALWAYS
;
9492 p
= strchr (p
, ',');
9497 if (address_mode
== mode_64bit
&& sizeof (bfd_vma
) < 8)
9499 (*info
->fprintf_func
) (info
->stream
,
9500 _("64-bit address is disabled"));
9506 names64
= intel_names64
;
9507 names32
= intel_names32
;
9508 names16
= intel_names16
;
9509 names8
= intel_names8
;
9510 names8rex
= intel_names8rex
;
9511 names_seg
= intel_names_seg
;
9512 names_mm
= intel_names_mm
;
9513 names_bnd
= intel_names_bnd
;
9514 names_xmm
= intel_names_xmm
;
9515 names_ymm
= intel_names_ymm
;
9516 names_zmm
= intel_names_zmm
;
9517 names_tmm
= intel_names_tmm
;
9518 index64
= intel_index64
;
9519 index32
= intel_index32
;
9520 names_mask
= intel_names_mask
;
9521 index16
= intel_index16
;
9524 separator_char
= '+';
9529 names64
= att_names64
;
9530 names32
= att_names32
;
9531 names16
= att_names16
;
9532 names8
= att_names8
;
9533 names8rex
= att_names8rex
;
9534 names_seg
= att_names_seg
;
9535 names_mm
= att_names_mm
;
9536 names_bnd
= att_names_bnd
;
9537 names_xmm
= att_names_xmm
;
9538 names_ymm
= att_names_ymm
;
9539 names_zmm
= att_names_zmm
;
9540 names_tmm
= att_names_tmm
;
9541 index64
= att_index64
;
9542 index32
= att_index32
;
9543 names_mask
= att_names_mask
;
9544 index16
= att_index16
;
9547 separator_char
= ',';
9551 /* The output looks better if we put 7 bytes on a line, since that
9552 puts most long word instructions on a single line. Use 8 bytes
9554 if ((info
->mach
& bfd_mach_l1om
) != 0)
9555 info
->bytes_per_line
= 8;
9557 info
->bytes_per_line
= 7;
9559 info
->private_data
= &priv
;
9560 priv
.max_fetched
= priv
.the_buffer
;
9561 priv
.insn_start
= pc
;
9564 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
9572 start_codep
= priv
.the_buffer
;
9573 codep
= priv
.the_buffer
;
9575 if (OPCODES_SIGSETJMP (priv
.bailout
) != 0)
9579 /* Getting here means we tried for data but didn't get it. That
9580 means we have an incomplete instruction of some sort. Just
9581 print the first byte as a prefix or a .byte pseudo-op. */
9582 if (codep
> priv
.the_buffer
)
9584 name
= prefix_name (priv
.the_buffer
[0], priv
.orig_sizeflag
);
9586 (*info
->fprintf_func
) (info
->stream
, "%s", name
);
9589 /* Just print the first byte as a .byte instruction. */
9590 (*info
->fprintf_func
) (info
->stream
, ".byte 0x%x",
9591 (unsigned int) priv
.the_buffer
[0]);
9601 sizeflag
= priv
.orig_sizeflag
;
9603 if (!ckprefix () || rex_used
)
9605 /* Too many prefixes or unused REX prefixes. */
9607 i
< (int) ARRAY_SIZE (all_prefixes
) && all_prefixes
[i
];
9609 (*info
->fprintf_func
) (info
->stream
, "%s%s",
9611 prefix_name (all_prefixes
[i
], sizeflag
));
9617 FETCH_DATA (info
, codep
+ 1);
9618 two_source_ops
= (*codep
== 0x62) || (*codep
== 0xc8);
9620 if (((prefixes
& PREFIX_FWAIT
)
9621 && ((*codep
< 0xd8) || (*codep
> 0xdf))))
9623 /* Handle prefixes before fwait. */
9624 for (i
= 0; i
< fwait_prefix
&& all_prefixes
[i
];
9626 (*info
->fprintf_func
) (info
->stream
, "%s ",
9627 prefix_name (all_prefixes
[i
], sizeflag
));
9628 (*info
->fprintf_func
) (info
->stream
, "fwait");
9634 unsigned char threebyte
;
9637 FETCH_DATA (info
, codep
+ 1);
9639 dp
= &dis386_twobyte
[threebyte
];
9640 need_modrm
= twobyte_has_modrm
[threebyte
];
9645 dp
= &dis386
[*codep
];
9646 need_modrm
= onebyte_has_modrm
[*codep
];
9650 /* Save sizeflag for printing the extra prefixes later before updating
9651 it for mnemonic and operand processing. The prefix names depend
9652 only on the address mode. */
9653 orig_sizeflag
= sizeflag
;
9654 if (prefixes
& PREFIX_ADDR
)
9656 if ((prefixes
& PREFIX_DATA
))
9662 FETCH_DATA (info
, codep
+ 1);
9663 modrm
.mod
= (*codep
>> 6) & 3;
9664 modrm
.reg
= (*codep
>> 3) & 7;
9665 modrm
.rm
= *codep
& 7;
9668 memset (&modrm
, 0, sizeof (modrm
));
9671 memset (&vex
, 0, sizeof (vex
));
9673 if (dp
->name
== NULL
&& dp
->op
[0].bytemode
== FLOATCODE
)
9675 get_sib (info
, sizeflag
);
9680 dp
= get_valid_dis386 (dp
, info
);
9681 if (dp
!= NULL
&& putop (dp
->name
, sizeflag
) == 0)
9683 get_sib (info
, sizeflag
);
9684 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
9687 op_ad
= MAX_OPERANDS
- 1 - i
;
9689 (*dp
->op
[i
].rtn
) (dp
->op
[i
].bytemode
, sizeflag
);
9690 /* For EVEX instruction after the last operand masking
9691 should be printed. */
9692 if (i
== 0 && vex
.evex
)
9694 /* Don't print {%k0}. */
9695 if (vex
.mask_register_specifier
)
9698 oappend (names_mask
[vex
.mask_register_specifier
]);
9708 /* Clear instruction information. */
9711 the_info
->insn_info_valid
= 0;
9712 the_info
->branch_delay_insns
= 0;
9713 the_info
->data_size
= 0;
9714 the_info
->insn_type
= dis_noninsn
;
9715 the_info
->target
= 0;
9716 the_info
->target2
= 0;
9719 /* Reset jump operation indicator. */
9723 int jump_detection
= 0;
9725 /* Extract flags. */
9726 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
9728 if ((dp
->op
[i
].rtn
== OP_J
)
9729 || (dp
->op
[i
].rtn
== OP_indirE
))
9730 jump_detection
|= 1;
9731 else if ((dp
->op
[i
].rtn
== BND_Fixup
)
9732 || (!dp
->op
[i
].rtn
&& !dp
->op
[i
].bytemode
))
9733 jump_detection
|= 2;
9734 else if ((dp
->op
[i
].bytemode
== cond_jump_mode
)
9735 || (dp
->op
[i
].bytemode
== loop_jcxz_mode
))
9736 jump_detection
|= 4;
9739 /* Determine if this is a jump or branch. */
9740 if ((jump_detection
& 0x3) == 0x3)
9743 if (jump_detection
& 0x4)
9744 the_info
->insn_type
= dis_condbranch
;
9746 the_info
->insn_type
=
9747 (dp
->name
&& !strncmp(dp
->name
, "call", 4))
9748 ? dis_jsr
: dis_branch
;
9752 /* If VEX.vvvv and EVEX.vvvv are unused, they must be all 1s, which
9753 are all 0s in inverted form. */
9754 if (need_vex
&& vex
.register_specifier
!= 0)
9756 (*info
->fprintf_func
) (info
->stream
, "(bad)");
9757 return end_codep
- priv
.the_buffer
;
9760 switch (dp
->prefix_requirement
)
9763 /* If only the data prefix is marked as mandatory, its absence renders
9764 the encoding invalid. Most other PREFIX_OPCODE rules still apply. */
9765 if (need_vex
? !vex
.prefix
: !(prefixes
& PREFIX_DATA
))
9767 (*info
->fprintf_func
) (info
->stream
, "(bad)");
9768 return end_codep
- priv
.the_buffer
;
9770 used_prefixes
|= PREFIX_DATA
;
9773 /* If the mandatory PREFIX_REPZ/PREFIX_REPNZ/PREFIX_DATA prefix is
9774 unused, opcode is invalid. Since the PREFIX_DATA prefix may be
9775 used by putop and MMX/SSE operand and may be overridden by the
9776 PREFIX_REPZ/PREFIX_REPNZ fix, we check the PREFIX_DATA prefix
9779 ? vex
.prefix
== REPE_PREFIX_OPCODE
9780 || vex
.prefix
== REPNE_PREFIX_OPCODE
9782 & (PREFIX_REPZ
| PREFIX_REPNZ
)) != 0)
9784 & (PREFIX_REPZ
| PREFIX_REPNZ
)) == 0)
9786 ? vex
.prefix
== DATA_PREFIX_OPCODE
9788 & (PREFIX_REPZ
| PREFIX_REPNZ
| PREFIX_DATA
))
9790 && (used_prefixes
& PREFIX_DATA
) == 0))
9791 || (vex
.evex
&& dp
->prefix_requirement
!= PREFIX_DATA
9792 && !vex
.w
!= !(used_prefixes
& PREFIX_DATA
)))
9794 (*info
->fprintf_func
) (info
->stream
, "(bad)");
9795 return end_codep
- priv
.the_buffer
;
9799 case PREFIX_IGNORED
:
9800 /* Zap data size and rep prefixes from used_prefixes and reinstate their
9801 origins in all_prefixes. */
9802 used_prefixes
&= ~PREFIX_OPCODE
;
9803 if (last_data_prefix
>= 0)
9804 all_prefixes
[last_repz_prefix
] = 0x66;
9805 if (last_repz_prefix
>= 0)
9806 all_prefixes
[last_repz_prefix
] = 0xf3;
9807 if (last_repnz_prefix
>= 0)
9808 all_prefixes
[last_repnz_prefix
] = 0xf2;
9812 /* Check if the REX prefix is used. */
9813 if ((rex
^ rex_used
) == 0 && !need_vex
&& last_rex_prefix
>= 0)
9814 all_prefixes
[last_rex_prefix
] = 0;
9816 /* Check if the SEG prefix is used. */
9817 if ((prefixes
& (PREFIX_CS
| PREFIX_SS
| PREFIX_DS
| PREFIX_ES
9818 | PREFIX_FS
| PREFIX_GS
)) != 0
9819 && (used_prefixes
& active_seg_prefix
) != 0)
9820 all_prefixes
[last_seg_prefix
] = 0;
9822 /* Check if the ADDR prefix is used. */
9823 if ((prefixes
& PREFIX_ADDR
) != 0
9824 && (used_prefixes
& PREFIX_ADDR
) != 0)
9825 all_prefixes
[last_addr_prefix
] = 0;
9827 /* Check if the DATA prefix is used. */
9828 if ((prefixes
& PREFIX_DATA
) != 0
9829 && (used_prefixes
& PREFIX_DATA
) != 0
9831 all_prefixes
[last_data_prefix
] = 0;
9833 /* Print the extra prefixes. */
9835 for (i
= 0; i
< (int) ARRAY_SIZE (all_prefixes
); i
++)
9836 if (all_prefixes
[i
])
9839 name
= prefix_name (all_prefixes
[i
], orig_sizeflag
);
9842 prefix_length
+= strlen (name
) + 1;
9843 (*info
->fprintf_func
) (info
->stream
, "%s ", name
);
9846 /* Check maximum code length. */
9847 if ((codep
- start_codep
) > MAX_CODE_LENGTH
)
9849 (*info
->fprintf_func
) (info
->stream
, "(bad)");
9850 return MAX_CODE_LENGTH
;
9853 obufp
= mnemonicendp
;
9854 for (i
= strlen (obuf
) + prefix_length
; i
< 6; i
++)
9857 (*info
->fprintf_func
) (info
->stream
, "%s", obuf
);
9859 /* The enter and bound instructions are printed with operands in the same
9860 order as the intel book; everything else is printed in reverse order. */
9861 if (intel_syntax
|| two_source_ops
)
9865 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
9866 op_txt
[i
] = op_out
[i
];
9868 if (intel_syntax
&& dp
&& dp
->op
[2].rtn
== OP_Rounding
9869 && dp
->op
[3].rtn
== OP_E
&& dp
->op
[4].rtn
== NULL
)
9871 op_txt
[2] = op_out
[3];
9872 op_txt
[3] = op_out
[2];
9875 for (i
= 0; i
< (MAX_OPERANDS
>> 1); ++i
)
9877 op_ad
= op_index
[i
];
9878 op_index
[i
] = op_index
[MAX_OPERANDS
- 1 - i
];
9879 op_index
[MAX_OPERANDS
- 1 - i
] = op_ad
;
9880 riprel
= op_riprel
[i
];
9881 op_riprel
[i
] = op_riprel
[MAX_OPERANDS
- 1 - i
];
9882 op_riprel
[MAX_OPERANDS
- 1 - i
] = riprel
;
9887 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
9888 op_txt
[MAX_OPERANDS
- 1 - i
] = op_out
[i
];
9892 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
9896 (*info
->fprintf_func
) (info
->stream
, ",");
9897 if (op_index
[i
] != -1 && !op_riprel
[i
])
9899 bfd_vma target
= (bfd_vma
) op_address
[op_index
[i
]];
9901 if (the_info
&& op_is_jump
)
9903 the_info
->insn_info_valid
= 1;
9904 the_info
->branch_delay_insns
= 0;
9905 the_info
->data_size
= 0;
9906 the_info
->target
= target
;
9907 the_info
->target2
= 0;
9909 (*info
->print_address_func
) (target
, info
);
9912 (*info
->fprintf_func
) (info
->stream
, "%s", op_txt
[i
]);
9916 for (i
= 0; i
< MAX_OPERANDS
; i
++)
9917 if (op_index
[i
] != -1 && op_riprel
[i
])
9919 (*info
->fprintf_func
) (info
->stream
, " # ");
9920 (*info
->print_address_func
) ((bfd_vma
) (start_pc
+ (codep
- start_codep
)
9921 + op_address
[op_index
[i
]]), info
);
9924 return codep
- priv
.the_buffer
;
9927 static const char *float_mem
[] = {
10002 static const unsigned char float_mem_mode
[] = {
10077 #define ST { OP_ST, 0 }
10078 #define STi { OP_STi, 0 }
10080 #define FGRPd9_2 NULL, { { NULL, 1 } }, 0
10081 #define FGRPd9_4 NULL, { { NULL, 2 } }, 0
10082 #define FGRPd9_5 NULL, { { NULL, 3 } }, 0
10083 #define FGRPd9_6 NULL, { { NULL, 4 } }, 0
10084 #define FGRPd9_7 NULL, { { NULL, 5 } }, 0
10085 #define FGRPda_5 NULL, { { NULL, 6 } }, 0
10086 #define FGRPdb_4 NULL, { { NULL, 7 } }, 0
10087 #define FGRPde_3 NULL, { { NULL, 8 } }, 0
10088 #define FGRPdf_4 NULL, { { NULL, 9 } }, 0
10090 static const struct dis386 float_reg
[][8] = {
10093 { "fadd", { ST
, STi
}, 0 },
10094 { "fmul", { ST
, STi
}, 0 },
10095 { "fcom", { STi
}, 0 },
10096 { "fcomp", { STi
}, 0 },
10097 { "fsub", { ST
, STi
}, 0 },
10098 { "fsubr", { ST
, STi
}, 0 },
10099 { "fdiv", { ST
, STi
}, 0 },
10100 { "fdivr", { ST
, STi
}, 0 },
10104 { "fld", { STi
}, 0 },
10105 { "fxch", { STi
}, 0 },
10115 { "fcmovb", { ST
, STi
}, 0 },
10116 { "fcmove", { ST
, STi
}, 0 },
10117 { "fcmovbe",{ ST
, STi
}, 0 },
10118 { "fcmovu", { ST
, STi
}, 0 },
10126 { "fcmovnb",{ ST
, STi
}, 0 },
10127 { "fcmovne",{ ST
, STi
}, 0 },
10128 { "fcmovnbe",{ ST
, STi
}, 0 },
10129 { "fcmovnu",{ ST
, STi
}, 0 },
10131 { "fucomi", { ST
, STi
}, 0 },
10132 { "fcomi", { ST
, STi
}, 0 },
10137 { "fadd", { STi
, ST
}, 0 },
10138 { "fmul", { STi
, ST
}, 0 },
10141 { "fsub{!M|r}", { STi
, ST
}, 0 },
10142 { "fsub{M|}", { STi
, ST
}, 0 },
10143 { "fdiv{!M|r}", { STi
, ST
}, 0 },
10144 { "fdiv{M|}", { STi
, ST
}, 0 },
10148 { "ffree", { STi
}, 0 },
10150 { "fst", { STi
}, 0 },
10151 { "fstp", { STi
}, 0 },
10152 { "fucom", { STi
}, 0 },
10153 { "fucomp", { STi
}, 0 },
10159 { "faddp", { STi
, ST
}, 0 },
10160 { "fmulp", { STi
, ST
}, 0 },
10163 { "fsub{!M|r}p", { STi
, ST
}, 0 },
10164 { "fsub{M|}p", { STi
, ST
}, 0 },
10165 { "fdiv{!M|r}p", { STi
, ST
}, 0 },
10166 { "fdiv{M|}p", { STi
, ST
}, 0 },
10170 { "ffreep", { STi
}, 0 },
10175 { "fucomip", { ST
, STi
}, 0 },
10176 { "fcomip", { ST
, STi
}, 0 },
10181 static char *fgrps
[][8] = {
10184 "(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10189 "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10194 "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
10199 "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
10204 "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
10209 "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
10214 "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10219 "fNeni(8087 only)","fNdisi(8087 only)","fNclex","fNinit",
10220 "fNsetpm(287 only)","frstpm(287 only)","(bad)","(bad)",
10225 "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10230 "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10235 swap_operand (void)
10237 mnemonicendp
[0] = '.';
10238 mnemonicendp
[1] = 's';
10243 OP_Skip_MODRM (int bytemode ATTRIBUTE_UNUSED
,
10244 int sizeflag ATTRIBUTE_UNUSED
)
10246 /* Skip mod/rm byte. */
10252 dofloat (int sizeflag
)
10254 const struct dis386
*dp
;
10255 unsigned char floatop
;
10257 floatop
= codep
[-1];
10259 if (modrm
.mod
!= 3)
10261 int fp_indx
= (floatop
- 0xd8) * 8 + modrm
.reg
;
10263 putop (float_mem
[fp_indx
], sizeflag
);
10266 OP_E (float_mem_mode
[fp_indx
], sizeflag
);
10269 /* Skip mod/rm byte. */
10273 dp
= &float_reg
[floatop
- 0xd8][modrm
.reg
];
10274 if (dp
->name
== NULL
)
10276 putop (fgrps
[dp
->op
[0].bytemode
][modrm
.rm
], sizeflag
);
10278 /* Instruction fnstsw is only one with strange arg. */
10279 if (floatop
== 0xdf && codep
[-1] == 0xe0)
10280 strcpy (op_out
[0], names16
[0]);
10284 putop (dp
->name
, sizeflag
);
10289 (*dp
->op
[0].rtn
) (dp
->op
[0].bytemode
, sizeflag
);
10294 (*dp
->op
[1].rtn
) (dp
->op
[1].bytemode
, sizeflag
);
10298 /* Like oappend (below), but S is a string starting with '%'.
10299 In Intel syntax, the '%' is elided. */
10301 oappend_maybe_intel (const char *s
)
10303 oappend (s
+ intel_syntax
);
10307 OP_ST (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
10309 oappend_maybe_intel ("%st");
10313 OP_STi (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
10315 sprintf (scratchbuf
, "%%st(%d)", modrm
.rm
);
10316 oappend_maybe_intel (scratchbuf
);
10319 /* Capital letters in template are macros. */
10321 putop (const char *in_template
, int sizeflag
)
10326 unsigned int l
= 0, len
= 0;
10329 for (p
= in_template
; *p
; p
++)
10333 if (l
>= sizeof (last
) || !ISUPPER (*p
))
10352 while (*++p
!= '|')
10353 if (*p
== '}' || *p
== '\0')
10359 while (*++p
!= '}')
10371 if ((need_modrm
&& modrm
.mod
!= 3)
10372 || (sizeflag
& SUFFIX_ALWAYS
))
10381 if (sizeflag
& SUFFIX_ALWAYS
)
10384 else if (l
== 1 && last
[0] == 'L')
10386 if (address_mode
== mode_64bit
10387 && !(prefixes
& PREFIX_ADDR
))
10400 if (intel_syntax
&& !alt
)
10402 if ((prefixes
& PREFIX_DATA
) || (sizeflag
& SUFFIX_ALWAYS
))
10404 if (sizeflag
& DFLAG
)
10405 *obufp
++ = intel_syntax
? 'd' : 'l';
10407 *obufp
++ = intel_syntax
? 'w' : 's';
10408 used_prefixes
|= (prefixes
& PREFIX_DATA
);
10412 if (intel_syntax
|| !(sizeflag
& SUFFIX_ALWAYS
))
10415 if (modrm
.mod
== 3)
10421 if (sizeflag
& DFLAG
)
10422 *obufp
++ = intel_syntax
? 'd' : 'l';
10425 used_prefixes
|= (prefixes
& PREFIX_DATA
);
10431 case 'E': /* For jcxz/jecxz */
10432 if (address_mode
== mode_64bit
)
10434 if (sizeflag
& AFLAG
)
10440 if (sizeflag
& AFLAG
)
10442 used_prefixes
|= (prefixes
& PREFIX_ADDR
);
10447 if ((prefixes
& PREFIX_ADDR
) || (sizeflag
& SUFFIX_ALWAYS
))
10449 if (sizeflag
& AFLAG
)
10450 *obufp
++ = address_mode
== mode_64bit
? 'q' : 'l';
10452 *obufp
++ = address_mode
== mode_64bit
? 'l' : 'w';
10453 used_prefixes
|= (prefixes
& PREFIX_ADDR
);
10457 if (intel_syntax
|| (obufp
[-1] != 's' && !(sizeflag
& SUFFIX_ALWAYS
)))
10459 if ((rex
& REX_W
) || (sizeflag
& DFLAG
))
10463 if (!(rex
& REX_W
))
10464 used_prefixes
|= (prefixes
& PREFIX_DATA
);
10469 if ((prefixes
& (PREFIX_CS
| PREFIX_DS
)) == PREFIX_CS
10470 || (prefixes
& (PREFIX_CS
| PREFIX_DS
)) == PREFIX_DS
)
10472 used_prefixes
|= prefixes
& (PREFIX_CS
| PREFIX_DS
);
10476 /* Set active_seg_prefix even if not set in 64-bit mode
10477 because here it is a valid branch hint. */
10478 if (prefixes
& PREFIX_DS
)
10480 active_seg_prefix
= PREFIX_DS
;
10485 active_seg_prefix
= PREFIX_CS
;
10500 if (intel_mnemonic
!= cond
)
10504 if ((prefixes
& PREFIX_FWAIT
) == 0)
10507 used_prefixes
|= PREFIX_FWAIT
;
10513 else if (intel_syntax
&& (sizeflag
& DFLAG
))
10517 if (!(rex
& REX_W
))
10518 used_prefixes
|= (prefixes
& PREFIX_DATA
);
10521 if (address_mode
== mode_64bit
10522 && (isa64
== intel64
|| (rex
& REX_W
)
10523 || !(prefixes
& PREFIX_DATA
)))
10525 if (sizeflag
& SUFFIX_ALWAYS
)
10529 /* Fall through. */
10533 if ((modrm
.mod
== 3 || !cond
)
10534 && !(sizeflag
& SUFFIX_ALWAYS
))
10536 /* Fall through. */
10538 if ((!(rex
& REX_W
) && (prefixes
& PREFIX_DATA
))
10539 || ((sizeflag
& SUFFIX_ALWAYS
)
10540 && address_mode
!= mode_64bit
))
10542 *obufp
++ = (sizeflag
& DFLAG
) ?
10543 intel_syntax
? 'd' : 'l' : 'w';
10544 used_prefixes
|= (prefixes
& PREFIX_DATA
);
10546 else if (sizeflag
& SUFFIX_ALWAYS
)
10549 else if (l
== 1 && last
[0] == 'L')
10551 if ((prefixes
& PREFIX_DATA
)
10553 || (sizeflag
& SUFFIX_ALWAYS
))
10560 if (sizeflag
& DFLAG
)
10561 *obufp
++ = intel_syntax
? 'd' : 'l';
10564 used_prefixes
|= (prefixes
& PREFIX_DATA
);
10574 if (intel_syntax
&& !alt
)
10577 if ((need_modrm
&& modrm
.mod
!= 3)
10578 || (sizeflag
& SUFFIX_ALWAYS
))
10584 if (sizeflag
& DFLAG
)
10585 *obufp
++ = intel_syntax
? 'd' : 'l';
10588 used_prefixes
|= (prefixes
& PREFIX_DATA
);
10592 else if (l
== 1 && last
[0] == 'D')
10593 *obufp
++ = vex
.w
? 'q' : 'd';
10594 else if (l
== 1 && last
[0] == 'L')
10596 if (cond
? modrm
.mod
== 3 && !(sizeflag
& SUFFIX_ALWAYS
)
10597 : address_mode
!= mode_64bit
)
10604 else if((address_mode
== mode_64bit
&& cond
)
10605 || (sizeflag
& SUFFIX_ALWAYS
))
10606 *obufp
++ = intel_syntax
? 'd' : 'l';
10615 else if (sizeflag
& DFLAG
)
10624 if (intel_syntax
&& !p
[1]
10625 && ((rex
& REX_W
) || (sizeflag
& DFLAG
)))
10627 if (!(rex
& REX_W
))
10628 used_prefixes
|= (prefixes
& PREFIX_DATA
);
10636 if (sizeflag
& SUFFIX_ALWAYS
)
10642 if (sizeflag
& DFLAG
)
10646 used_prefixes
|= (prefixes
& PREFIX_DATA
);
10650 else if (l
== 1 && last
[0] == 'L')
10652 if (address_mode
== mode_64bit
10653 && !(prefixes
& PREFIX_ADDR
))
10669 && (last
[0] == 'L' || last
[0] == 'X'))
10671 if (last
[0] == 'X')
10679 else if (rex
& REX_W
)
10692 /* operand size flag for cwtl, cbtw */
10701 else if (sizeflag
& DFLAG
)
10705 if (!(rex
& REX_W
))
10706 used_prefixes
|= (prefixes
& PREFIX_DATA
);
10712 if (last
[0] == 'X')
10713 *obufp
++ = vex
.w
? 'd': 's';
10714 else if (last
[0] == 'B')
10715 *obufp
++ = vex
.w
? 'w': 'b';
10726 ? vex
.prefix
== DATA_PREFIX_OPCODE
10727 : prefixes
& PREFIX_DATA
)
10730 used_prefixes
|= PREFIX_DATA
;
10736 if (l
== 1 && last
[0] == 'X')
10741 || ((modrm
.mod
== 3 || vex
.b
) && !(sizeflag
& SUFFIX_ALWAYS
)))
10743 switch (vex
.length
)
10763 /* These insns ignore ModR/M.mod: Force it to 3 for OP_E(). */
10765 if (!intel_syntax
&& (sizeflag
& SUFFIX_ALWAYS
))
10766 *obufp
++ = address_mode
== mode_64bit
? 'q' : 'l';
10768 else if (l
== 1 && last
[0] == 'X')
10770 if (!need_vex
|| !vex
.evex
)
10773 || ((modrm
.mod
== 3 || vex
.b
) && !(sizeflag
& SUFFIX_ALWAYS
)))
10775 switch (vex
.length
)
10796 if (isa64
== intel64
&& (rex
& REX_W
))
10802 if ((prefixes
& PREFIX_DATA
) || (sizeflag
& SUFFIX_ALWAYS
))
10804 if (sizeflag
& DFLAG
)
10808 used_prefixes
|= (prefixes
& PREFIX_DATA
);
10817 mnemonicendp
= obufp
;
10822 oappend (const char *s
)
10824 obufp
= stpcpy (obufp
, s
);
10830 /* Only print the active segment register. */
10831 if (!active_seg_prefix
)
10834 used_prefixes
|= active_seg_prefix
;
10835 switch (active_seg_prefix
)
10838 oappend_maybe_intel ("%cs:");
10841 oappend_maybe_intel ("%ds:");
10844 oappend_maybe_intel ("%ss:");
10847 oappend_maybe_intel ("%es:");
10850 oappend_maybe_intel ("%fs:");
10853 oappend_maybe_intel ("%gs:");
10861 OP_indirE (int bytemode
, int sizeflag
)
10865 OP_E (bytemode
, sizeflag
);
10869 print_operand_value (char *buf
, int hex
, bfd_vma disp
)
10871 if (address_mode
== mode_64bit
)
10879 sprintf_vma (tmp
, disp
);
10880 for (i
= 0; tmp
[i
] == '0' && tmp
[i
+ 1]; i
++);
10881 strcpy (buf
+ 2, tmp
+ i
);
10885 bfd_signed_vma v
= disp
;
10892 /* Check for possible overflow on 0x8000000000000000. */
10895 strcpy (buf
, "9223372036854775808");
10909 tmp
[28 - i
] = (v
% 10) + '0';
10913 strcpy (buf
, tmp
+ 29 - i
);
10919 sprintf (buf
, "0x%x", (unsigned int) disp
);
10921 sprintf (buf
, "%d", (int) disp
);
10925 /* Put DISP in BUF as signed hex number. */
10928 print_displacement (char *buf
, bfd_vma disp
)
10930 bfd_signed_vma val
= disp
;
10939 /* Check for possible overflow. */
10942 switch (address_mode
)
10945 strcpy (buf
+ j
, "0x8000000000000000");
10948 strcpy (buf
+ j
, "0x80000000");
10951 strcpy (buf
+ j
, "0x8000");
10961 sprintf_vma (tmp
, (bfd_vma
) val
);
10962 for (i
= 0; tmp
[i
] == '0'; i
++)
10964 if (tmp
[i
] == '\0')
10966 strcpy (buf
+ j
, tmp
+ i
);
10970 intel_operand_size (int bytemode
, int sizeflag
)
10974 && (bytemode
== x_mode
10975 || bytemode
== evex_half_bcst_xmmq_mode
))
10978 oappend ("QWORD PTR ");
10980 oappend ("DWORD PTR ");
10989 oappend ("BYTE PTR ");
10994 oappend ("WORD PTR ");
10997 if (address_mode
== mode_64bit
&& isa64
== intel64
)
10999 oappend ("QWORD PTR ");
11002 /* Fall through. */
11004 if (address_mode
== mode_64bit
&& ((sizeflag
& DFLAG
) || (rex
& REX_W
)))
11006 oappend ("QWORD PTR ");
11009 /* Fall through. */
11015 oappend ("QWORD PTR ");
11016 else if (bytemode
== dq_mode
)
11017 oappend ("DWORD PTR ");
11020 if (sizeflag
& DFLAG
)
11021 oappend ("DWORD PTR ");
11023 oappend ("WORD PTR ");
11024 used_prefixes
|= (prefixes
& PREFIX_DATA
);
11028 if ((rex
& REX_W
) || (sizeflag
& DFLAG
))
11030 oappend ("WORD PTR ");
11031 if (!(rex
& REX_W
))
11032 used_prefixes
|= (prefixes
& PREFIX_DATA
);
11035 if (sizeflag
& DFLAG
)
11036 oappend ("QWORD PTR ");
11038 oappend ("DWORD PTR ");
11039 used_prefixes
|= (prefixes
& PREFIX_DATA
);
11042 if (!(sizeflag
& DFLAG
) && isa64
== intel64
)
11043 oappend ("WORD PTR ");
11045 oappend ("DWORD PTR ");
11046 used_prefixes
|= (prefixes
& PREFIX_DATA
);
11051 oappend ("DWORD PTR ");
11055 oappend ("QWORD PTR ");
11058 if (address_mode
== mode_64bit
)
11059 oappend ("QWORD PTR ");
11061 oappend ("DWORD PTR ");
11064 if (sizeflag
& DFLAG
)
11065 oappend ("FWORD PTR ");
11067 oappend ("DWORD PTR ");
11068 used_prefixes
|= (prefixes
& PREFIX_DATA
);
11071 oappend ("TBYTE PTR ");
11075 case evex_x_gscat_mode
:
11076 case evex_x_nobcst_mode
:
11080 switch (vex
.length
)
11083 oappend ("XMMWORD PTR ");
11086 oappend ("YMMWORD PTR ");
11089 oappend ("ZMMWORD PTR ");
11096 oappend ("XMMWORD PTR ");
11099 oappend ("XMMWORD PTR ");
11102 oappend ("YMMWORD PTR ");
11105 case evex_half_bcst_xmmq_mode
:
11109 switch (vex
.length
)
11112 oappend ("QWORD PTR ");
11115 oappend ("XMMWORD PTR ");
11118 oappend ("YMMWORD PTR ");
11128 switch (vex
.length
)
11133 oappend ("BYTE PTR ");
11143 switch (vex
.length
)
11148 oappend ("WORD PTR ");
11158 switch (vex
.length
)
11163 oappend ("DWORD PTR ");
11173 switch (vex
.length
)
11178 oappend ("QWORD PTR ");
11188 switch (vex
.length
)
11191 oappend ("WORD PTR ");
11194 oappend ("DWORD PTR ");
11197 oappend ("QWORD PTR ");
11207 switch (vex
.length
)
11210 oappend ("DWORD PTR ");
11213 oappend ("QWORD PTR ");
11216 oappend ("XMMWORD PTR ");
11226 switch (vex
.length
)
11229 oappend ("QWORD PTR ");
11232 oappend ("YMMWORD PTR ");
11235 oappend ("ZMMWORD PTR ");
11245 switch (vex
.length
)
11249 oappend ("XMMWORD PTR ");
11256 oappend ("OWORD PTR ");
11258 case vex_scalar_w_dq_mode
:
11263 oappend ("QWORD PTR ");
11265 oappend ("DWORD PTR ");
11267 case vex_vsib_d_w_dq_mode
:
11268 case vex_vsib_q_w_dq_mode
:
11275 oappend ("QWORD PTR ");
11277 oappend ("DWORD PTR ");
11281 switch (vex
.length
)
11284 oappend ("XMMWORD PTR ");
11287 oappend ("YMMWORD PTR ");
11290 oappend ("ZMMWORD PTR ");
11297 case vex_vsib_q_w_d_mode
:
11298 case vex_vsib_d_w_d_mode
:
11299 if (!need_vex
|| !vex
.evex
)
11302 switch (vex
.length
)
11305 oappend ("QWORD PTR ");
11308 oappend ("XMMWORD PTR ");
11311 oappend ("YMMWORD PTR ");
11319 if (!need_vex
|| vex
.length
!= 128)
11322 oappend ("DWORD PTR ");
11324 oappend ("BYTE PTR ");
11330 oappend ("QWORD PTR ");
11332 oappend ("WORD PTR ");
11342 OP_E_register (int bytemode
, int sizeflag
)
11344 int reg
= modrm
.rm
;
11345 const char **names
;
11351 if ((sizeflag
& SUFFIX_ALWAYS
)
11352 && (bytemode
== b_swap_mode
11353 || bytemode
== bnd_swap_mode
11354 || bytemode
== v_swap_mode
))
11381 names
= address_mode
== mode_64bit
? names64
: names32
;
11384 case bnd_swap_mode
:
11393 if (address_mode
== mode_64bit
&& isa64
== intel64
)
11398 /* Fall through. */
11400 if (address_mode
== mode_64bit
&& ((sizeflag
& DFLAG
) || (rex
& REX_W
)))
11406 /* Fall through. */
11416 else if (bytemode
!= v_mode
&& bytemode
!= v_swap_mode
)
11420 if (sizeflag
& DFLAG
)
11424 used_prefixes
|= (prefixes
& PREFIX_DATA
);
11428 if (!(sizeflag
& DFLAG
) && isa64
== intel64
)
11432 used_prefixes
|= (prefixes
& PREFIX_DATA
);
11435 names
= (address_mode
== mode_64bit
11436 ? names64
: names32
);
11437 if (!(prefixes
& PREFIX_ADDR
))
11438 names
= (address_mode
== mode_16bit
11439 ? names16
: names
);
11442 /* Remove "addr16/addr32". */
11443 all_prefixes
[last_addr_prefix
] = 0;
11444 names
= (address_mode
!= mode_32bit
11445 ? names32
: names16
);
11446 used_prefixes
|= PREFIX_ADDR
;
11456 names
= names_mask
;
11461 oappend (INTERNAL_DISASSEMBLER_ERROR
);
11464 oappend (names
[reg
]);
11468 OP_E_memory (int bytemode
, int sizeflag
)
11471 int add
= (rex
& REX_B
) ? 8 : 0;
11477 /* In EVEX, if operand doesn't allow broadcast, vex.b should be 0. */
11479 && bytemode
!= x_mode
11480 && bytemode
!= xmmq_mode
11481 && bytemode
!= evex_half_bcst_xmmq_mode
)
11499 if (address_mode
!= mode_64bit
)
11509 case vex_scalar_w_dq_mode
:
11510 case vex_vsib_d_w_dq_mode
:
11511 case vex_vsib_d_w_d_mode
:
11512 case vex_vsib_q_w_dq_mode
:
11513 case vex_vsib_q_w_d_mode
:
11514 case evex_x_gscat_mode
:
11515 shift
= vex
.w
? 3 : 2;
11518 case evex_half_bcst_xmmq_mode
:
11522 shift
= vex
.w
? 3 : 2;
11525 /* Fall through. */
11529 case evex_x_nobcst_mode
:
11531 switch (vex
.length
)
11545 /* Make necessary corrections to shift for modes that need it. */
11546 if (bytemode
== xmmq_mode
11547 || bytemode
== evex_half_bcst_xmmq_mode
11548 || (bytemode
== ymmq_mode
&& vex
.length
== 128))
11550 else if (bytemode
== xmmqd_mode
)
11552 else if (bytemode
== xmmdw_mode
)
11567 shift
= vex
.w
? 1 : 0;
11578 intel_operand_size (bytemode
, sizeflag
);
11581 if ((sizeflag
& AFLAG
) || address_mode
== mode_64bit
)
11583 /* 32/64 bit address mode */
11593 int addr32flag
= !((sizeflag
& AFLAG
)
11594 || bytemode
== v_bnd_mode
11595 || bytemode
== v_bndmk_mode
11596 || bytemode
== bnd_mode
11597 || bytemode
== bnd_swap_mode
);
11598 const char **indexes64
= names64
;
11599 const char **indexes32
= names32
;
11609 vindex
= sib
.index
;
11615 case vex_vsib_d_w_dq_mode
:
11616 case vex_vsib_d_w_d_mode
:
11617 case vex_vsib_q_w_dq_mode
:
11618 case vex_vsib_q_w_d_mode
:
11628 switch (vex
.length
)
11631 indexes64
= indexes32
= names_xmm
;
11635 || bytemode
== vex_vsib_q_w_dq_mode
11636 || bytemode
== vex_vsib_q_w_d_mode
)
11637 indexes64
= indexes32
= names_ymm
;
11639 indexes64
= indexes32
= names_xmm
;
11643 || bytemode
== vex_vsib_q_w_dq_mode
11644 || bytemode
== vex_vsib_q_w_d_mode
)
11645 indexes64
= indexes32
= names_zmm
;
11647 indexes64
= indexes32
= names_ymm
;
11654 haveindex
= vindex
!= 4;
11663 /* mandatory non-vector SIB must have sib */
11664 if (bytemode
== vex_sibmem_mode
)
11670 rbase
= base
+ add
;
11678 if (address_mode
== mode_64bit
&& !havesib
)
11681 if (riprel
&& bytemode
== v_bndmk_mode
)
11689 FETCH_DATA (the_info
, codep
+ 1);
11691 if ((disp
& 0x80) != 0)
11693 if (vex
.evex
&& shift
> 0)
11706 && address_mode
!= mode_16bit
)
11708 if (address_mode
== mode_64bit
)
11712 /* Without base nor index registers, zero-extend the
11713 lower 32-bit displacement to 64 bits. */
11714 disp
= (unsigned int) disp
;
11721 /* In 32-bit mode, we need index register to tell [offset]
11722 from [eiz*1 + offset]. */
11727 havedisp
= (havebase
11729 || (havesib
&& (haveindex
|| scale
!= 0)));
11732 if (modrm
.mod
!= 0 || base
== 5)
11734 if (havedisp
|| riprel
)
11735 print_displacement (scratchbuf
, disp
);
11737 print_operand_value (scratchbuf
, 1, disp
);
11738 oappend (scratchbuf
);
11742 oappend (!addr32flag
? "(%rip)" : "(%eip)");
11746 if ((havebase
|| haveindex
|| needindex
|| needaddr32
|| riprel
)
11747 && (address_mode
!= mode_64bit
11748 || ((bytemode
!= v_bnd_mode
)
11749 && (bytemode
!= v_bndmk_mode
)
11750 && (bytemode
!= bnd_mode
)
11751 && (bytemode
!= bnd_swap_mode
))))
11752 used_prefixes
|= PREFIX_ADDR
;
11754 if (havedisp
|| (intel_syntax
&& riprel
))
11756 *obufp
++ = open_char
;
11757 if (intel_syntax
&& riprel
)
11760 oappend (!addr32flag
? "rip" : "eip");
11764 oappend (address_mode
== mode_64bit
&& !addr32flag
11765 ? names64
[rbase
] : names32
[rbase
]);
11768 /* ESP/RSP won't allow index. If base isn't ESP/RSP,
11769 print index to tell base + index from base. */
11773 || (havebase
&& base
!= ESP_REG_NUM
))
11775 if (!intel_syntax
|| havebase
)
11777 *obufp
++ = separator_char
;
11781 oappend (address_mode
== mode_64bit
&& !addr32flag
11782 ? indexes64
[vindex
] : indexes32
[vindex
]);
11784 oappend (address_mode
== mode_64bit
&& !addr32flag
11785 ? index64
: index32
);
11787 *obufp
++ = scale_char
;
11789 sprintf (scratchbuf
, "%d", 1 << scale
);
11790 oappend (scratchbuf
);
11794 && (disp
|| modrm
.mod
!= 0 || base
== 5))
11796 if (!havedisp
|| (bfd_signed_vma
) disp
>= 0)
11801 else if (modrm
.mod
!= 1 && disp
!= -disp
)
11809 print_displacement (scratchbuf
, disp
);
11811 print_operand_value (scratchbuf
, 1, disp
);
11812 oappend (scratchbuf
);
11815 *obufp
++ = close_char
;
11818 else if (intel_syntax
)
11820 if (modrm
.mod
!= 0 || base
== 5)
11822 if (!active_seg_prefix
)
11824 oappend (names_seg
[ds_reg
- es_reg
]);
11827 print_operand_value (scratchbuf
, 1, disp
);
11828 oappend (scratchbuf
);
11832 else if (bytemode
== v_bnd_mode
11833 || bytemode
== v_bndmk_mode
11834 || bytemode
== bnd_mode
11835 || bytemode
== bnd_swap_mode
)
11842 /* 16 bit address mode */
11843 used_prefixes
|= prefixes
& PREFIX_ADDR
;
11850 if ((disp
& 0x8000) != 0)
11855 FETCH_DATA (the_info
, codep
+ 1);
11857 if ((disp
& 0x80) != 0)
11859 if (vex
.evex
&& shift
> 0)
11864 if ((disp
& 0x8000) != 0)
11870 if (modrm
.mod
!= 0 || modrm
.rm
== 6)
11872 print_displacement (scratchbuf
, disp
);
11873 oappend (scratchbuf
);
11876 if (modrm
.mod
!= 0 || modrm
.rm
!= 6)
11878 *obufp
++ = open_char
;
11880 oappend (index16
[modrm
.rm
]);
11882 && (disp
|| modrm
.mod
!= 0 || modrm
.rm
== 6))
11884 if ((bfd_signed_vma
) disp
>= 0)
11889 else if (modrm
.mod
!= 1)
11896 print_displacement (scratchbuf
, disp
);
11897 oappend (scratchbuf
);
11900 *obufp
++ = close_char
;
11903 else if (intel_syntax
)
11905 if (!active_seg_prefix
)
11907 oappend (names_seg
[ds_reg
- es_reg
]);
11910 print_operand_value (scratchbuf
, 1, disp
& 0xffff);
11911 oappend (scratchbuf
);
11914 if (vex
.evex
&& vex
.b
11915 && (bytemode
== x_mode
11916 || bytemode
== xmmq_mode
11917 || bytemode
== evex_half_bcst_xmmq_mode
))
11920 || bytemode
== xmmq_mode
11921 || bytemode
== evex_half_bcst_xmmq_mode
)
11923 switch (vex
.length
)
11926 oappend ("{1to2}");
11929 oappend ("{1to4}");
11932 oappend ("{1to8}");
11940 switch (vex
.length
)
11943 oappend ("{1to4}");
11946 oappend ("{1to8}");
11949 oappend ("{1to16}");
11959 OP_E (int bytemode
, int sizeflag
)
11961 /* Skip mod/rm byte. */
11965 if (modrm
.mod
== 3)
11966 OP_E_register (bytemode
, sizeflag
);
11968 OP_E_memory (bytemode
, sizeflag
);
11972 OP_G (int bytemode
, int sizeflag
)
11975 const char **names
;
11985 oappend (names8rex
[modrm
.reg
+ add
]);
11987 oappend (names8
[modrm
.reg
+ add
]);
11990 oappend (names16
[modrm
.reg
+ add
]);
11995 oappend (names32
[modrm
.reg
+ add
]);
11998 oappend (names64
[modrm
.reg
+ add
]);
12001 if (modrm
.reg
> 0x3)
12006 oappend (names_bnd
[modrm
.reg
]);
12016 oappend (names64
[modrm
.reg
+ add
]);
12017 else if (bytemode
!= v_mode
&& bytemode
!= movsxd_mode
)
12018 oappend (names32
[modrm
.reg
+ add
]);
12021 if (sizeflag
& DFLAG
)
12022 oappend (names32
[modrm
.reg
+ add
]);
12024 oappend (names16
[modrm
.reg
+ add
]);
12025 used_prefixes
|= (prefixes
& PREFIX_DATA
);
12029 names
= (address_mode
== mode_64bit
12030 ? names64
: names32
);
12031 if (!(prefixes
& PREFIX_ADDR
))
12033 if (address_mode
== mode_16bit
)
12038 /* Remove "addr16/addr32". */
12039 all_prefixes
[last_addr_prefix
] = 0;
12040 names
= (address_mode
!= mode_32bit
12041 ? names32
: names16
);
12042 used_prefixes
|= PREFIX_ADDR
;
12044 oappend (names
[modrm
.reg
+ add
]);
12047 if (address_mode
== mode_64bit
)
12048 oappend (names64
[modrm
.reg
+ add
]);
12050 oappend (names32
[modrm
.reg
+ add
]);
12054 if ((modrm
.reg
+ add
) > 0x7)
12059 oappend (names_mask
[modrm
.reg
+ add
]);
12062 oappend (INTERNAL_DISASSEMBLER_ERROR
);
12075 FETCH_DATA (the_info
, codep
+ 8);
12076 a
= *codep
++ & 0xff;
12077 a
|= (*codep
++ & 0xff) << 8;
12078 a
|= (*codep
++ & 0xff) << 16;
12079 a
|= (*codep
++ & 0xffu
) << 24;
12080 b
= *codep
++ & 0xff;
12081 b
|= (*codep
++ & 0xff) << 8;
12082 b
|= (*codep
++ & 0xff) << 16;
12083 b
|= (*codep
++ & 0xffu
) << 24;
12084 x
= a
+ ((bfd_vma
) b
<< 32);
12092 static bfd_signed_vma
12097 FETCH_DATA (the_info
, codep
+ 4);
12098 x
= *codep
++ & (bfd_vma
) 0xff;
12099 x
|= (*codep
++ & (bfd_vma
) 0xff) << 8;
12100 x
|= (*codep
++ & (bfd_vma
) 0xff) << 16;
12101 x
|= (*codep
++ & (bfd_vma
) 0xff) << 24;
12105 static bfd_signed_vma
12110 FETCH_DATA (the_info
, codep
+ 4);
12111 x
= *codep
++ & (bfd_vma
) 0xff;
12112 x
|= (*codep
++ & (bfd_vma
) 0xff) << 8;
12113 x
|= (*codep
++ & (bfd_vma
) 0xff) << 16;
12114 x
|= (*codep
++ & (bfd_vma
) 0xff) << 24;
12116 x
= (x
^ ((bfd_vma
) 1 << 31)) - ((bfd_vma
) 1 << 31);
12126 FETCH_DATA (the_info
, codep
+ 2);
12127 x
= *codep
++ & 0xff;
12128 x
|= (*codep
++ & 0xff) << 8;
12133 set_op (bfd_vma op
, int riprel
)
12135 op_index
[op_ad
] = op_ad
;
12136 if (address_mode
== mode_64bit
)
12138 op_address
[op_ad
] = op
;
12139 op_riprel
[op_ad
] = riprel
;
12143 /* Mask to get a 32-bit address. */
12144 op_address
[op_ad
] = op
& 0xffffffff;
12145 op_riprel
[op_ad
] = riprel
& 0xffffffff;
12150 OP_REG (int code
, int sizeflag
)
12157 case es_reg
: case ss_reg
: case cs_reg
:
12158 case ds_reg
: case fs_reg
: case gs_reg
:
12159 oappend (names_seg
[code
- es_reg
]);
12171 case ax_reg
: case cx_reg
: case dx_reg
: case bx_reg
:
12172 case sp_reg
: case bp_reg
: case si_reg
: case di_reg
:
12173 s
= names16
[code
- ax_reg
+ add
];
12175 case ah_reg
: case ch_reg
: case dh_reg
: case bh_reg
:
12177 /* Fall through. */
12178 case al_reg
: case cl_reg
: case dl_reg
: case bl_reg
:
12180 s
= names8rex
[code
- al_reg
+ add
];
12182 s
= names8
[code
- al_reg
];
12184 case rAX_reg
: case rCX_reg
: case rDX_reg
: case rBX_reg
:
12185 case rSP_reg
: case rBP_reg
: case rSI_reg
: case rDI_reg
:
12186 if (address_mode
== mode_64bit
12187 && ((sizeflag
& DFLAG
) || (rex
& REX_W
)))
12189 s
= names64
[code
- rAX_reg
+ add
];
12192 code
+= eAX_reg
- rAX_reg
;
12193 /* Fall through. */
12194 case eAX_reg
: case eCX_reg
: case eDX_reg
: case eBX_reg
:
12195 case eSP_reg
: case eBP_reg
: case eSI_reg
: case eDI_reg
:
12198 s
= names64
[code
- eAX_reg
+ add
];
12201 if (sizeflag
& DFLAG
)
12202 s
= names32
[code
- eAX_reg
+ add
];
12204 s
= names16
[code
- eAX_reg
+ add
];
12205 used_prefixes
|= (prefixes
& PREFIX_DATA
);
12209 s
= INTERNAL_DISASSEMBLER_ERROR
;
12216 OP_IMREG (int code
, int sizeflag
)
12228 case al_reg
: case cl_reg
:
12229 s
= names8
[code
- al_reg
];
12238 /* Fall through. */
12239 case z_mode_ax_reg
:
12240 if ((rex
& REX_W
) || (sizeflag
& DFLAG
))
12244 if (!(rex
& REX_W
))
12245 used_prefixes
|= (prefixes
& PREFIX_DATA
);
12248 s
= INTERNAL_DISASSEMBLER_ERROR
;
12255 OP_I (int bytemode
, int sizeflag
)
12258 bfd_signed_vma mask
= -1;
12263 FETCH_DATA (the_info
, codep
+ 1);
12273 if (sizeflag
& DFLAG
)
12283 used_prefixes
|= (prefixes
& PREFIX_DATA
);
12299 oappend (INTERNAL_DISASSEMBLER_ERROR
);
12304 scratchbuf
[0] = '$';
12305 print_operand_value (scratchbuf
+ 1, 1, op
);
12306 oappend_maybe_intel (scratchbuf
);
12307 scratchbuf
[0] = '\0';
12311 OP_I64 (int bytemode
, int sizeflag
)
12313 if (bytemode
!= v_mode
|| address_mode
!= mode_64bit
|| !(rex
& REX_W
))
12315 OP_I (bytemode
, sizeflag
);
12321 scratchbuf
[0] = '$';
12322 print_operand_value (scratchbuf
+ 1, 1, get64 ());
12323 oappend_maybe_intel (scratchbuf
);
12324 scratchbuf
[0] = '\0';
12328 OP_sI (int bytemode
, int sizeflag
)
12336 FETCH_DATA (the_info
, codep
+ 1);
12338 if ((op
& 0x80) != 0)
12340 if (bytemode
== b_T_mode
)
12342 if (address_mode
!= mode_64bit
12343 || !((sizeflag
& DFLAG
) || (rex
& REX_W
)))
12345 /* The operand-size prefix is overridden by a REX prefix. */
12346 if ((sizeflag
& DFLAG
) || (rex
& REX_W
))
12354 if (!(rex
& REX_W
))
12356 if (sizeflag
& DFLAG
)
12364 /* The operand-size prefix is overridden by a REX prefix. */
12365 if ((sizeflag
& DFLAG
) || (rex
& REX_W
))
12371 oappend (INTERNAL_DISASSEMBLER_ERROR
);
12375 scratchbuf
[0] = '$';
12376 print_operand_value (scratchbuf
+ 1, 1, op
);
12377 oappend_maybe_intel (scratchbuf
);
12381 OP_J (int bytemode
, int sizeflag
)
12385 bfd_vma segment
= 0;
12390 FETCH_DATA (the_info
, codep
+ 1);
12392 if ((disp
& 0x80) != 0)
12397 if ((sizeflag
& DFLAG
)
12398 || (address_mode
== mode_64bit
12399 && ((isa64
== intel64
&& bytemode
!= dqw_mode
)
12400 || (rex
& REX_W
))))
12405 if ((disp
& 0x8000) != 0)
12407 /* In 16bit mode, address is wrapped around at 64k within
12408 the same segment. Otherwise, a data16 prefix on a jump
12409 instruction means that the pc is masked to 16 bits after
12410 the displacement is added! */
12412 if ((prefixes
& PREFIX_DATA
) == 0)
12413 segment
= ((start_pc
+ (codep
- start_codep
))
12414 & ~((bfd_vma
) 0xffff));
12416 if (address_mode
!= mode_64bit
12417 || (isa64
!= intel64
&& !(rex
& REX_W
)))
12418 used_prefixes
|= (prefixes
& PREFIX_DATA
);
12421 oappend (INTERNAL_DISASSEMBLER_ERROR
);
12424 disp
= ((start_pc
+ (codep
- start_codep
) + disp
) & mask
) | segment
;
12426 print_operand_value (scratchbuf
, 1, disp
);
12427 oappend (scratchbuf
);
12431 OP_SEG (int bytemode
, int sizeflag
)
12433 if (bytemode
== w_mode
)
12434 oappend (names_seg
[modrm
.reg
]);
12436 OP_E (modrm
.mod
== 3 ? bytemode
: w_mode
, sizeflag
);
12440 OP_DIR (int dummy ATTRIBUTE_UNUSED
, int sizeflag
)
12444 if (sizeflag
& DFLAG
)
12454 used_prefixes
|= (prefixes
& PREFIX_DATA
);
12456 sprintf (scratchbuf
, "0x%x:0x%x", seg
, offset
);
12458 sprintf (scratchbuf
, "$0x%x,$0x%x", seg
, offset
);
12459 oappend (scratchbuf
);
12463 OP_OFF (int bytemode
, int sizeflag
)
12467 if (intel_syntax
&& (sizeflag
& SUFFIX_ALWAYS
))
12468 intel_operand_size (bytemode
, sizeflag
);
12471 if ((sizeflag
& AFLAG
) || address_mode
== mode_64bit
)
12478 if (!active_seg_prefix
)
12480 oappend (names_seg
[ds_reg
- es_reg
]);
12484 print_operand_value (scratchbuf
, 1, off
);
12485 oappend (scratchbuf
);
12489 OP_OFF64 (int bytemode
, int sizeflag
)
12493 if (address_mode
!= mode_64bit
12494 || (prefixes
& PREFIX_ADDR
))
12496 OP_OFF (bytemode
, sizeflag
);
12500 if (intel_syntax
&& (sizeflag
& SUFFIX_ALWAYS
))
12501 intel_operand_size (bytemode
, sizeflag
);
12508 if (!active_seg_prefix
)
12510 oappend (names_seg
[ds_reg
- es_reg
]);
12514 print_operand_value (scratchbuf
, 1, off
);
12515 oappend (scratchbuf
);
12519 ptr_reg (int code
, int sizeflag
)
12523 *obufp
++ = open_char
;
12524 used_prefixes
|= (prefixes
& PREFIX_ADDR
);
12525 if (address_mode
== mode_64bit
)
12527 if (!(sizeflag
& AFLAG
))
12528 s
= names32
[code
- eAX_reg
];
12530 s
= names64
[code
- eAX_reg
];
12532 else if (sizeflag
& AFLAG
)
12533 s
= names32
[code
- eAX_reg
];
12535 s
= names16
[code
- eAX_reg
];
12537 *obufp
++ = close_char
;
12542 OP_ESreg (int code
, int sizeflag
)
12548 case 0x6d: /* insw/insl */
12549 intel_operand_size (z_mode
, sizeflag
);
12551 case 0xa5: /* movsw/movsl/movsq */
12552 case 0xa7: /* cmpsw/cmpsl/cmpsq */
12553 case 0xab: /* stosw/stosl */
12554 case 0xaf: /* scasw/scasl */
12555 intel_operand_size (v_mode
, sizeflag
);
12558 intel_operand_size (b_mode
, sizeflag
);
12561 oappend_maybe_intel ("%es:");
12562 ptr_reg (code
, sizeflag
);
12566 OP_DSreg (int code
, int sizeflag
)
12572 case 0x6f: /* outsw/outsl */
12573 intel_operand_size (z_mode
, sizeflag
);
12575 case 0xa5: /* movsw/movsl/movsq */
12576 case 0xa7: /* cmpsw/cmpsl/cmpsq */
12577 case 0xad: /* lodsw/lodsl/lodsq */
12578 intel_operand_size (v_mode
, sizeflag
);
12581 intel_operand_size (b_mode
, sizeflag
);
12584 /* Set active_seg_prefix to PREFIX_DS if it is unset so that the
12585 default segment register DS is printed. */
12586 if (!active_seg_prefix
)
12587 active_seg_prefix
= PREFIX_DS
;
12589 ptr_reg (code
, sizeflag
);
12593 OP_C (int dummy ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
12601 else if (address_mode
!= mode_64bit
&& (prefixes
& PREFIX_LOCK
))
12603 all_prefixes
[last_lock_prefix
] = 0;
12604 used_prefixes
|= PREFIX_LOCK
;
12609 sprintf (scratchbuf
, "%%cr%d", modrm
.reg
+ add
);
12610 oappend_maybe_intel (scratchbuf
);
12614 OP_D (int dummy ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
12623 sprintf (scratchbuf
, "dr%d", modrm
.reg
+ add
);
12625 sprintf (scratchbuf
, "%%db%d", modrm
.reg
+ add
);
12626 oappend (scratchbuf
);
12630 OP_T (int dummy ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
12632 sprintf (scratchbuf
, "%%tr%d", modrm
.reg
);
12633 oappend_maybe_intel (scratchbuf
);
12637 OP_MMX (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
12639 int reg
= modrm
.reg
;
12640 const char **names
;
12642 used_prefixes
|= (prefixes
& PREFIX_DATA
);
12643 if (prefixes
& PREFIX_DATA
)
12652 oappend (names
[reg
]);
12656 OP_XMM (int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
12658 int reg
= modrm
.reg
;
12659 const char **names
;
12671 && bytemode
!= xmm_mode
12672 && bytemode
!= xmmq_mode
12673 && bytemode
!= evex_half_bcst_xmmq_mode
12674 && bytemode
!= ymm_mode
12675 && bytemode
!= tmm_mode
12676 && bytemode
!= scalar_mode
)
12678 switch (vex
.length
)
12685 || (bytemode
!= vex_vsib_q_w_dq_mode
12686 && bytemode
!= vex_vsib_q_w_d_mode
))
12698 else if (bytemode
== xmmq_mode
12699 || bytemode
== evex_half_bcst_xmmq_mode
)
12701 switch (vex
.length
)
12714 else if (bytemode
== tmm_mode
)
12724 else if (bytemode
== ymm_mode
)
12728 oappend (names
[reg
]);
12732 OP_EM (int bytemode
, int sizeflag
)
12735 const char **names
;
12737 if (modrm
.mod
!= 3)
12740 && (bytemode
== v_mode
|| bytemode
== v_swap_mode
))
12742 bytemode
= (prefixes
& PREFIX_DATA
) ? x_mode
: q_mode
;
12743 used_prefixes
|= (prefixes
& PREFIX_DATA
);
12745 OP_E (bytemode
, sizeflag
);
12749 if ((sizeflag
& SUFFIX_ALWAYS
) && bytemode
== v_swap_mode
)
12752 /* Skip mod/rm byte. */
12755 used_prefixes
|= (prefixes
& PREFIX_DATA
);
12757 if (prefixes
& PREFIX_DATA
)
12766 oappend (names
[reg
]);
12769 /* cvt* are the only instructions in sse2 which have
12770 both SSE and MMX operands and also have 0x66 prefix
12771 in their opcode. 0x66 was originally used to differentiate
12772 between SSE and MMX instruction(operands). So we have to handle the
12773 cvt* separately using OP_EMC and OP_MXC */
12775 OP_EMC (int bytemode
, int sizeflag
)
12777 if (modrm
.mod
!= 3)
12779 if (intel_syntax
&& bytemode
== v_mode
)
12781 bytemode
= (prefixes
& PREFIX_DATA
) ? x_mode
: q_mode
;
12782 used_prefixes
|= (prefixes
& PREFIX_DATA
);
12784 OP_E (bytemode
, sizeflag
);
12788 /* Skip mod/rm byte. */
12791 used_prefixes
|= (prefixes
& PREFIX_DATA
);
12792 oappend (names_mm
[modrm
.rm
]);
12796 OP_MXC (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
12798 used_prefixes
|= (prefixes
& PREFIX_DATA
);
12799 oappend (names_mm
[modrm
.reg
]);
12803 OP_EX (int bytemode
, int sizeflag
)
12806 const char **names
;
12808 /* Skip mod/rm byte. */
12812 if (modrm
.mod
!= 3)
12814 OP_E_memory (bytemode
, sizeflag
);
12829 if ((sizeflag
& SUFFIX_ALWAYS
)
12830 && (bytemode
== x_swap_mode
12831 || bytemode
== d_swap_mode
12832 || bytemode
== q_swap_mode
))
12836 && bytemode
!= xmm_mode
12837 && bytemode
!= xmmdw_mode
12838 && bytemode
!= xmmqd_mode
12839 && bytemode
!= xmm_mb_mode
12840 && bytemode
!= xmm_mw_mode
12841 && bytemode
!= xmm_md_mode
12842 && bytemode
!= xmm_mq_mode
12843 && bytemode
!= xmmq_mode
12844 && bytemode
!= evex_half_bcst_xmmq_mode
12845 && bytemode
!= ymm_mode
12846 && bytemode
!= tmm_mode
12847 && bytemode
!= vex_scalar_w_dq_mode
)
12849 switch (vex
.length
)
12864 else if (bytemode
== xmmq_mode
12865 || bytemode
== evex_half_bcst_xmmq_mode
)
12867 switch (vex
.length
)
12880 else if (bytemode
== tmm_mode
)
12890 else if (bytemode
== ymm_mode
)
12894 oappend (names
[reg
]);
12898 OP_MS (int bytemode
, int sizeflag
)
12900 if (modrm
.mod
== 3)
12901 OP_EM (bytemode
, sizeflag
);
12907 OP_XS (int bytemode
, int sizeflag
)
12909 if (modrm
.mod
== 3)
12910 OP_EX (bytemode
, sizeflag
);
12916 OP_M (int bytemode
, int sizeflag
)
12918 if (modrm
.mod
== 3)
12919 /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
12922 OP_E (bytemode
, sizeflag
);
12926 OP_0f07 (int bytemode
, int sizeflag
)
12928 if (modrm
.mod
!= 3 || modrm
.rm
!= 0)
12931 OP_E (bytemode
, sizeflag
);
12934 /* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
12935 32bit mode and "xchg %rax,%rax" in 64bit mode. */
12938 NOP_Fixup1 (int bytemode
, int sizeflag
)
12940 if ((prefixes
& PREFIX_DATA
) != 0
12943 && address_mode
== mode_64bit
))
12944 OP_REG (bytemode
, sizeflag
);
12946 strcpy (obuf
, "nop");
12950 NOP_Fixup2 (int bytemode
, int sizeflag
)
12952 if ((prefixes
& PREFIX_DATA
) != 0
12955 && address_mode
== mode_64bit
))
12956 OP_IMREG (bytemode
, sizeflag
);
12959 static const char *const Suffix3DNow
[] = {
12960 /* 00 */ NULL
, NULL
, NULL
, NULL
,
12961 /* 04 */ NULL
, NULL
, NULL
, NULL
,
12962 /* 08 */ NULL
, NULL
, NULL
, NULL
,
12963 /* 0C */ "pi2fw", "pi2fd", NULL
, NULL
,
12964 /* 10 */ NULL
, NULL
, NULL
, NULL
,
12965 /* 14 */ NULL
, NULL
, NULL
, NULL
,
12966 /* 18 */ NULL
, NULL
, NULL
, NULL
,
12967 /* 1C */ "pf2iw", "pf2id", NULL
, NULL
,
12968 /* 20 */ NULL
, NULL
, NULL
, NULL
,
12969 /* 24 */ NULL
, NULL
, NULL
, NULL
,
12970 /* 28 */ NULL
, NULL
, NULL
, NULL
,
12971 /* 2C */ NULL
, NULL
, NULL
, NULL
,
12972 /* 30 */ NULL
, NULL
, NULL
, NULL
,
12973 /* 34 */ NULL
, NULL
, NULL
, NULL
,
12974 /* 38 */ NULL
, NULL
, NULL
, NULL
,
12975 /* 3C */ NULL
, NULL
, NULL
, NULL
,
12976 /* 40 */ NULL
, NULL
, NULL
, NULL
,
12977 /* 44 */ NULL
, NULL
, NULL
, NULL
,
12978 /* 48 */ NULL
, NULL
, NULL
, NULL
,
12979 /* 4C */ NULL
, NULL
, NULL
, NULL
,
12980 /* 50 */ NULL
, NULL
, NULL
, NULL
,
12981 /* 54 */ NULL
, NULL
, NULL
, NULL
,
12982 /* 58 */ NULL
, NULL
, NULL
, NULL
,
12983 /* 5C */ NULL
, NULL
, NULL
, NULL
,
12984 /* 60 */ NULL
, NULL
, NULL
, NULL
,
12985 /* 64 */ NULL
, NULL
, NULL
, NULL
,
12986 /* 68 */ NULL
, NULL
, NULL
, NULL
,
12987 /* 6C */ NULL
, NULL
, NULL
, NULL
,
12988 /* 70 */ NULL
, NULL
, NULL
, NULL
,
12989 /* 74 */ NULL
, NULL
, NULL
, NULL
,
12990 /* 78 */ NULL
, NULL
, NULL
, NULL
,
12991 /* 7C */ NULL
, NULL
, NULL
, NULL
,
12992 /* 80 */ NULL
, NULL
, NULL
, NULL
,
12993 /* 84 */ NULL
, NULL
, NULL
, NULL
,
12994 /* 88 */ NULL
, NULL
, "pfnacc", NULL
,
12995 /* 8C */ NULL
, NULL
, "pfpnacc", NULL
,
12996 /* 90 */ "pfcmpge", NULL
, NULL
, NULL
,
12997 /* 94 */ "pfmin", NULL
, "pfrcp", "pfrsqrt",
12998 /* 98 */ NULL
, NULL
, "pfsub", NULL
,
12999 /* 9C */ NULL
, NULL
, "pfadd", NULL
,
13000 /* A0 */ "pfcmpgt", NULL
, NULL
, NULL
,
13001 /* A4 */ "pfmax", NULL
, "pfrcpit1", "pfrsqit1",
13002 /* A8 */ NULL
, NULL
, "pfsubr", NULL
,
13003 /* AC */ NULL
, NULL
, "pfacc", NULL
,
13004 /* B0 */ "pfcmpeq", NULL
, NULL
, NULL
,
13005 /* B4 */ "pfmul", NULL
, "pfrcpit2", "pmulhrw",
13006 /* B8 */ NULL
, NULL
, NULL
, "pswapd",
13007 /* BC */ NULL
, NULL
, NULL
, "pavgusb",
13008 /* C0 */ NULL
, NULL
, NULL
, NULL
,
13009 /* C4 */ NULL
, NULL
, NULL
, NULL
,
13010 /* C8 */ NULL
, NULL
, NULL
, NULL
,
13011 /* CC */ NULL
, NULL
, NULL
, NULL
,
13012 /* D0 */ NULL
, NULL
, NULL
, NULL
,
13013 /* D4 */ NULL
, NULL
, NULL
, NULL
,
13014 /* D8 */ NULL
, NULL
, NULL
, NULL
,
13015 /* DC */ NULL
, NULL
, NULL
, NULL
,
13016 /* E0 */ NULL
, NULL
, NULL
, NULL
,
13017 /* E4 */ NULL
, NULL
, NULL
, NULL
,
13018 /* E8 */ NULL
, NULL
, NULL
, NULL
,
13019 /* EC */ NULL
, NULL
, NULL
, NULL
,
13020 /* F0 */ NULL
, NULL
, NULL
, NULL
,
13021 /* F4 */ NULL
, NULL
, NULL
, NULL
,
13022 /* F8 */ NULL
, NULL
, NULL
, NULL
,
13023 /* FC */ NULL
, NULL
, NULL
, NULL
,
13027 OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
13029 const char *mnemonic
;
13031 FETCH_DATA (the_info
, codep
+ 1);
13032 /* AMD 3DNow! instructions are specified by an opcode suffix in the
13033 place where an 8-bit immediate would normally go. ie. the last
13034 byte of the instruction. */
13035 obufp
= mnemonicendp
;
13036 mnemonic
= Suffix3DNow
[*codep
++ & 0xff];
13038 oappend (mnemonic
);
13041 /* Since a variable sized modrm/sib chunk is between the start
13042 of the opcode (0x0f0f) and the opcode suffix, we need to do
13043 all the modrm processing first, and don't know until now that
13044 we have a bad opcode. This necessitates some cleaning up. */
13045 op_out
[0][0] = '\0';
13046 op_out
[1][0] = '\0';
13049 mnemonicendp
= obufp
;
13052 static const struct op simd_cmp_op
[] =
13054 { STRING_COMMA_LEN ("eq") },
13055 { STRING_COMMA_LEN ("lt") },
13056 { STRING_COMMA_LEN ("le") },
13057 { STRING_COMMA_LEN ("unord") },
13058 { STRING_COMMA_LEN ("neq") },
13059 { STRING_COMMA_LEN ("nlt") },
13060 { STRING_COMMA_LEN ("nle") },
13061 { STRING_COMMA_LEN ("ord") }
13064 static const struct op vex_cmp_op
[] =
13066 { STRING_COMMA_LEN ("eq_uq") },
13067 { STRING_COMMA_LEN ("nge") },
13068 { STRING_COMMA_LEN ("ngt") },
13069 { STRING_COMMA_LEN ("false") },
13070 { STRING_COMMA_LEN ("neq_oq") },
13071 { STRING_COMMA_LEN ("ge") },
13072 { STRING_COMMA_LEN ("gt") },
13073 { STRING_COMMA_LEN ("true") },
13074 { STRING_COMMA_LEN ("eq_os") },
13075 { STRING_COMMA_LEN ("lt_oq") },
13076 { STRING_COMMA_LEN ("le_oq") },
13077 { STRING_COMMA_LEN ("unord_s") },
13078 { STRING_COMMA_LEN ("neq_us") },
13079 { STRING_COMMA_LEN ("nlt_uq") },
13080 { STRING_COMMA_LEN ("nle_uq") },
13081 { STRING_COMMA_LEN ("ord_s") },
13082 { STRING_COMMA_LEN ("eq_us") },
13083 { STRING_COMMA_LEN ("nge_uq") },
13084 { STRING_COMMA_LEN ("ngt_uq") },
13085 { STRING_COMMA_LEN ("false_os") },
13086 { STRING_COMMA_LEN ("neq_os") },
13087 { STRING_COMMA_LEN ("ge_oq") },
13088 { STRING_COMMA_LEN ("gt_oq") },
13089 { STRING_COMMA_LEN ("true_us") },
13093 CMP_Fixup (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
13095 unsigned int cmp_type
;
13097 FETCH_DATA (the_info
, codep
+ 1);
13098 cmp_type
= *codep
++ & 0xff;
13099 if (cmp_type
< ARRAY_SIZE (simd_cmp_op
))
13102 char *p
= mnemonicendp
- 2;
13106 sprintf (p
, "%s%s", simd_cmp_op
[cmp_type
].name
, suffix
);
13107 mnemonicendp
+= simd_cmp_op
[cmp_type
].len
;
13110 && cmp_type
< ARRAY_SIZE (simd_cmp_op
) + ARRAY_SIZE (vex_cmp_op
))
13113 char *p
= mnemonicendp
- 2;
13117 cmp_type
-= ARRAY_SIZE (simd_cmp_op
);
13118 sprintf (p
, "%s%s", vex_cmp_op
[cmp_type
].name
, suffix
);
13119 mnemonicendp
+= vex_cmp_op
[cmp_type
].len
;
13123 /* We have a reserved extension byte. Output it directly. */
13124 scratchbuf
[0] = '$';
13125 print_operand_value (scratchbuf
+ 1, 1, cmp_type
);
13126 oappend_maybe_intel (scratchbuf
);
13127 scratchbuf
[0] = '\0';
13132 OP_Mwait (int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
13134 /* mwait %eax,%ecx / mwaitx %eax,%ecx,%ebx */
13137 strcpy (op_out
[0], names32
[0]);
13138 strcpy (op_out
[1], names32
[1]);
13139 if (bytemode
== eBX_reg
)
13140 strcpy (op_out
[2], names32
[3]);
13141 two_source_ops
= 1;
13143 /* Skip mod/rm byte. */
13149 OP_Monitor (int bytemode ATTRIBUTE_UNUSED
,
13150 int sizeflag ATTRIBUTE_UNUSED
)
13152 /* monitor %{e,r,}ax,%ecx,%edx" */
13155 const char **names
= (address_mode
== mode_64bit
13156 ? names64
: names32
);
13158 if (prefixes
& PREFIX_ADDR
)
13160 /* Remove "addr16/addr32". */
13161 all_prefixes
[last_addr_prefix
] = 0;
13162 names
= (address_mode
!= mode_32bit
13163 ? names32
: names16
);
13164 used_prefixes
|= PREFIX_ADDR
;
13166 else if (address_mode
== mode_16bit
)
13168 strcpy (op_out
[0], names
[0]);
13169 strcpy (op_out
[1], names32
[1]);
13170 strcpy (op_out
[2], names32
[2]);
13171 two_source_ops
= 1;
13173 /* Skip mod/rm byte. */
13181 /* Throw away prefixes and 1st. opcode byte. */
13182 codep
= insn_codep
+ 1;
13187 REP_Fixup (int bytemode
, int sizeflag
)
13189 /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
13191 if (prefixes
& PREFIX_REPZ
)
13192 all_prefixes
[last_repz_prefix
] = REP_PREFIX
;
13199 OP_IMREG (bytemode
, sizeflag
);
13202 OP_ESreg (bytemode
, sizeflag
);
13205 OP_DSreg (bytemode
, sizeflag
);
13214 SEP_Fixup (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
13216 if ( isa64
!= amd64
)
13221 mnemonicendp
= obufp
;
13225 /* For BND-prefixed instructions 0xF2 prefix should be displayed as
13229 BND_Fixup (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
13231 if (prefixes
& PREFIX_REPNZ
)
13232 all_prefixes
[last_repnz_prefix
] = BND_PREFIX
;
13235 /* For NOTRACK-prefixed instructions, 0x3E prefix should be displayed as
13239 NOTRACK_Fixup (int bytemode ATTRIBUTE_UNUSED
,
13240 int sizeflag ATTRIBUTE_UNUSED
)
13243 /* Since active_seg_prefix is not set in 64-bit mode, check whether
13244 we've seen a PREFIX_DS. */
13245 if ((prefixes
& PREFIX_DS
) != 0
13246 && (address_mode
!= mode_64bit
|| last_data_prefix
< 0))
13248 /* NOTRACK prefix is only valid on indirect branch instructions.
13249 NB: DATA prefix is unsupported for Intel64. */
13250 active_seg_prefix
= 0;
13251 all_prefixes
[last_seg_prefix
] = NOTRACK_PREFIX
;
13255 /* Similar to OP_E. But the 0xf2/0xf3 prefixes should be displayed as
13256 "xacquire"/"xrelease" for memory operand if there is a LOCK prefix.
13260 HLE_Fixup1 (int bytemode
, int sizeflag
)
13263 && (prefixes
& PREFIX_LOCK
) != 0)
13265 if (prefixes
& PREFIX_REPZ
)
13266 all_prefixes
[last_repz_prefix
] = XRELEASE_PREFIX
;
13267 if (prefixes
& PREFIX_REPNZ
)
13268 all_prefixes
[last_repnz_prefix
] = XACQUIRE_PREFIX
;
13271 OP_E (bytemode
, sizeflag
);
13274 /* Similar to OP_E. But the 0xf2/0xf3 prefixes should be displayed as
13275 "xacquire"/"xrelease" for memory operand. No check for LOCK prefix.
13279 HLE_Fixup2 (int bytemode
, int sizeflag
)
13281 if (modrm
.mod
!= 3)
13283 if (prefixes
& PREFIX_REPZ
)
13284 all_prefixes
[last_repz_prefix
] = XRELEASE_PREFIX
;
13285 if (prefixes
& PREFIX_REPNZ
)
13286 all_prefixes
[last_repnz_prefix
] = XACQUIRE_PREFIX
;
13289 OP_E (bytemode
, sizeflag
);
13292 /* Similar to OP_E. But the 0xf3 prefixes should be displayed as
13293 "xrelease" for memory operand. No check for LOCK prefix. */
13296 HLE_Fixup3 (int bytemode
, int sizeflag
)
13299 && last_repz_prefix
> last_repnz_prefix
13300 && (prefixes
& PREFIX_REPZ
) != 0)
13301 all_prefixes
[last_repz_prefix
] = XRELEASE_PREFIX
;
13303 OP_E (bytemode
, sizeflag
);
13307 CMPXCHG8B_Fixup (int bytemode
, int sizeflag
)
13312 /* Change cmpxchg8b to cmpxchg16b. */
13313 char *p
= mnemonicendp
- 2;
13314 mnemonicendp
= stpcpy (p
, "16b");
13317 else if ((prefixes
& PREFIX_LOCK
) != 0)
13319 if (prefixes
& PREFIX_REPZ
)
13320 all_prefixes
[last_repz_prefix
] = XRELEASE_PREFIX
;
13321 if (prefixes
& PREFIX_REPNZ
)
13322 all_prefixes
[last_repnz_prefix
] = XACQUIRE_PREFIX
;
13325 OP_M (bytemode
, sizeflag
);
13329 XMM_Fixup (int reg
, int sizeflag ATTRIBUTE_UNUSED
)
13331 const char **names
;
13335 switch (vex
.length
)
13349 oappend (names
[reg
]);
13353 FXSAVE_Fixup (int bytemode
, int sizeflag
)
13355 /* Add proper suffix to "fxsave" and "fxrstor". */
13359 char *p
= mnemonicendp
;
13365 OP_M (bytemode
, sizeflag
);
13368 /* Display the destination register operand for instructions with
13372 OP_VEX (int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
13375 const char **names
;
13380 reg
= vex
.register_specifier
;
13381 vex
.register_specifier
= 0;
13382 if (address_mode
!= mode_64bit
)
13384 else if (vex
.evex
&& !vex
.v
)
13387 if (bytemode
== vex_scalar_mode
)
13389 oappend (names_xmm
[reg
]);
13393 if (bytemode
== tmm_mode
)
13395 /* All 3 TMM registers must be distinct. */
13400 /* This must be the 3rd operand. */
13401 if (obufp
!= op_out
[2])
13403 oappend (names_tmm
[reg
]);
13404 if (reg
== modrm
.reg
|| reg
== modrm
.rm
)
13405 strcpy (obufp
, "/(bad)");
13408 if (modrm
.reg
== modrm
.rm
|| modrm
.reg
== reg
|| modrm
.rm
== reg
)
13411 && (modrm
.reg
== modrm
.rm
|| modrm
.reg
== reg
))
13412 strcat (op_out
[0], "/(bad)");
13414 && (modrm
.rm
== modrm
.reg
|| modrm
.rm
== reg
))
13415 strcat (op_out
[1], "/(bad)");
13421 switch (vex
.length
)
13427 case vex_vsib_q_w_dq_mode
:
13428 case vex_vsib_q_w_d_mode
:
13444 names
= names_mask
;
13457 case vex_vsib_q_w_dq_mode
:
13458 case vex_vsib_q_w_d_mode
:
13459 names
= vex
.w
? names_ymm
: names_xmm
;
13468 names
= names_mask
;
13471 /* See PR binutils/20893 for a reproducer. */
13483 oappend (names
[reg
]);
13487 OP_VexR (int bytemode
, int sizeflag
)
13489 if (modrm
.mod
== 3)
13490 OP_VEX (bytemode
, sizeflag
);
13494 OP_VexW (int bytemode
, int sizeflag
)
13496 OP_VEX (bytemode
, sizeflag
);
13500 /* Swap 2nd and 3rd operands. */
13501 strcpy (scratchbuf
, op_out
[2]);
13502 strcpy (op_out
[2], op_out
[1]);
13503 strcpy (op_out
[1], scratchbuf
);
13508 OP_REG_VexI4 (int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
13511 const char **names
= names_xmm
;
13513 FETCH_DATA (the_info
, codep
+ 1);
13516 if (bytemode
!= x_mode
&& bytemode
!= scalar_mode
)
13520 if (address_mode
!= mode_64bit
)
13523 if (bytemode
== x_mode
&& vex
.length
== 256)
13526 oappend (names
[reg
]);
13530 /* Swap 3rd and 4th operands. */
13531 strcpy (scratchbuf
, op_out
[3]);
13532 strcpy (op_out
[3], op_out
[2]);
13533 strcpy (op_out
[2], scratchbuf
);
13538 OP_VexI4 (int bytemode ATTRIBUTE_UNUSED
,
13539 int sizeflag ATTRIBUTE_UNUSED
)
13541 scratchbuf
[0] = '$';
13542 print_operand_value (scratchbuf
+ 1, 1, codep
[-1] & 0xf);
13543 oappend_maybe_intel (scratchbuf
);
13547 VPCMP_Fixup (int bytemode ATTRIBUTE_UNUSED
,
13548 int sizeflag ATTRIBUTE_UNUSED
)
13550 unsigned int cmp_type
;
13555 FETCH_DATA (the_info
, codep
+ 1);
13556 cmp_type
= *codep
++ & 0xff;
13557 /* There are aliases for immediates 0, 1, 2, 4, 5, 6.
13558 If it's the case, print suffix, otherwise - print the immediate. */
13559 if (cmp_type
< ARRAY_SIZE (simd_cmp_op
)
13564 char *p
= mnemonicendp
- 2;
13566 /* vpcmp* can have both one- and two-lettered suffix. */
13580 sprintf (p
, "%s%s", simd_cmp_op
[cmp_type
].name
, suffix
);
13581 mnemonicendp
+= simd_cmp_op
[cmp_type
].len
;
13585 /* We have a reserved extension byte. Output it directly. */
13586 scratchbuf
[0] = '$';
13587 print_operand_value (scratchbuf
+ 1, 1, cmp_type
);
13588 oappend_maybe_intel (scratchbuf
);
13589 scratchbuf
[0] = '\0';
13593 static const struct op xop_cmp_op
[] =
13595 { STRING_COMMA_LEN ("lt") },
13596 { STRING_COMMA_LEN ("le") },
13597 { STRING_COMMA_LEN ("gt") },
13598 { STRING_COMMA_LEN ("ge") },
13599 { STRING_COMMA_LEN ("eq") },
13600 { STRING_COMMA_LEN ("neq") },
13601 { STRING_COMMA_LEN ("false") },
13602 { STRING_COMMA_LEN ("true") }
13606 VPCOM_Fixup (int bytemode ATTRIBUTE_UNUSED
,
13607 int sizeflag ATTRIBUTE_UNUSED
)
13609 unsigned int cmp_type
;
13611 FETCH_DATA (the_info
, codep
+ 1);
13612 cmp_type
= *codep
++ & 0xff;
13613 if (cmp_type
< ARRAY_SIZE (xop_cmp_op
))
13616 char *p
= mnemonicendp
- 2;
13618 /* vpcom* can have both one- and two-lettered suffix. */
13632 sprintf (p
, "%s%s", xop_cmp_op
[cmp_type
].name
, suffix
);
13633 mnemonicendp
+= xop_cmp_op
[cmp_type
].len
;
13637 /* We have a reserved extension byte. Output it directly. */
13638 scratchbuf
[0] = '$';
13639 print_operand_value (scratchbuf
+ 1, 1, cmp_type
);
13640 oappend_maybe_intel (scratchbuf
);
13641 scratchbuf
[0] = '\0';
13645 static const struct op pclmul_op
[] =
13647 { STRING_COMMA_LEN ("lql") },
13648 { STRING_COMMA_LEN ("hql") },
13649 { STRING_COMMA_LEN ("lqh") },
13650 { STRING_COMMA_LEN ("hqh") }
13654 PCLMUL_Fixup (int bytemode ATTRIBUTE_UNUSED
,
13655 int sizeflag ATTRIBUTE_UNUSED
)
13657 unsigned int pclmul_type
;
13659 FETCH_DATA (the_info
, codep
+ 1);
13660 pclmul_type
= *codep
++ & 0xff;
13661 switch (pclmul_type
)
13672 if (pclmul_type
< ARRAY_SIZE (pclmul_op
))
13675 char *p
= mnemonicendp
- 3;
13680 sprintf (p
, "%s%s", pclmul_op
[pclmul_type
].name
, suffix
);
13681 mnemonicendp
+= pclmul_op
[pclmul_type
].len
;
13685 /* We have a reserved extension byte. Output it directly. */
13686 scratchbuf
[0] = '$';
13687 print_operand_value (scratchbuf
+ 1, 1, pclmul_type
);
13688 oappend_maybe_intel (scratchbuf
);
13689 scratchbuf
[0] = '\0';
13694 MOVSXD_Fixup (int bytemode
, int sizeflag
)
13696 /* Add proper suffix to "movsxd". */
13697 char *p
= mnemonicendp
;
13722 oappend (INTERNAL_DISASSEMBLER_ERROR
);
13729 OP_E (bytemode
, sizeflag
);
13733 OP_Mask (int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
13736 || (bytemode
!= mask_mode
&& bytemode
!= mask_bd_mode
))
13740 if ((rex
& REX_R
) != 0 || !vex
.r
)
13746 oappend (names_mask
[modrm
.reg
]);
13750 OP_Rounding (int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
13752 if (modrm
.mod
== 3 && vex
.b
)
13755 case evex_rounding_64_mode
:
13756 if (address_mode
!= mode_64bit
)
13761 /* Fall through. */
13762 case evex_rounding_mode
:
13763 oappend (names_rounding
[vex
.ll
]);
13765 case evex_sae_mode
: