1 /* Print i386 instructions for GDB, the GNU debugger.
2 Copyright (C) 1988-2020 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_R (int, int);
81 static void OP_MMX (int, int);
82 static void OP_XMM (int, int);
83 static void OP_EM (int, int);
84 static void OP_EX (int, int);
85 static void OP_EMC (int,int);
86 static void OP_MXC (int,int);
87 static void OP_MS (int, int);
88 static void OP_XS (int, int);
89 static void OP_M (int, int);
90 static void OP_VEX (int, int);
91 static void OP_VexR (int, int);
92 static void OP_VexW (int, int);
93 static void OP_Rounding (int, int);
94 static void OP_REG_VexI4 (int, int);
95 static void OP_VexI4 (int, int);
96 static void PCLMUL_Fixup (int, int);
97 static void VPCMP_Fixup (int, int);
98 static void VPCOM_Fixup (int, int);
99 static void OP_0f07 (int, int);
100 static void OP_Monitor (int, int);
101 static void OP_Mwait (int, int);
102 static void NOP_Fixup1 (int, int);
103 static void NOP_Fixup2 (int, int);
104 static void OP_3DNowSuffix (int, int);
105 static void CMP_Fixup (int, int);
106 static void BadOp (void);
107 static void REP_Fixup (int, int);
108 static void SEP_Fixup (int, int);
109 static void BND_Fixup (int, int);
110 static void NOTRACK_Fixup (int, int);
111 static void HLE_Fixup1 (int, int);
112 static void HLE_Fixup2 (int, int);
113 static void HLE_Fixup3 (int, int);
114 static void CMPXCHG8B_Fixup (int, int);
115 static void XMM_Fixup (int, int);
116 static void FXSAVE_Fixup (int, int);
118 static void MOVSXD_Fixup (int, int);
120 static void OP_Mask (int, int);
123 /* Points to first byte not fetched. */
124 bfd_byte
*max_fetched
;
125 bfd_byte the_buffer
[MAX_MNEM_SIZE
];
128 OPCODES_SIGJMP_BUF bailout
;
138 enum address_mode address_mode
;
140 /* Flags for the prefixes for the current instruction. See below. */
143 /* REX prefix the current instruction. See below. */
145 /* Bits of REX we've already used. */
147 /* Mark parts used in the REX prefix. When we are testing for
148 empty prefix (for 8bit register REX extension), just mask it
149 out. Otherwise test for REX bit is excuse for existence of REX
150 only in case value is nonzero. */
151 #define USED_REX(value) \
156 rex_used |= (value) | REX_OPCODE; \
159 rex_used |= REX_OPCODE; \
162 /* Flags for prefixes which we somehow handled when printing the
163 current instruction. */
164 static int used_prefixes
;
166 /* Flags stored in PREFIXES. */
167 #define PREFIX_REPZ 1
168 #define PREFIX_REPNZ 2
169 #define PREFIX_LOCK 4
171 #define PREFIX_SS 0x10
172 #define PREFIX_DS 0x20
173 #define PREFIX_ES 0x40
174 #define PREFIX_FS 0x80
175 #define PREFIX_GS 0x100
176 #define PREFIX_DATA 0x200
177 #define PREFIX_ADDR 0x400
178 #define PREFIX_FWAIT 0x800
180 /* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
181 to ADDR (exclusive) are valid. Returns 1 for success, longjmps
183 #define FETCH_DATA(info, addr) \
184 ((addr) <= ((struct dis_private *) (info->private_data))->max_fetched \
185 ? 1 : fetch_data ((info), (addr)))
188 fetch_data (struct disassemble_info
*info
, bfd_byte
*addr
)
191 struct dis_private
*priv
= (struct dis_private
*) info
->private_data
;
192 bfd_vma start
= priv
->insn_start
+ (priv
->max_fetched
- priv
->the_buffer
);
194 if (addr
<= priv
->the_buffer
+ MAX_MNEM_SIZE
)
195 status
= (*info
->read_memory_func
) (start
,
197 addr
- priv
->max_fetched
,
203 /* If we did manage to read at least one byte, then
204 print_insn_i386 will do something sensible. Otherwise, print
205 an error. We do that here because this is where we know
207 if (priv
->max_fetched
== priv
->the_buffer
)
208 (*info
->memory_error_func
) (status
, start
, info
);
209 OPCODES_SIGLONGJMP (priv
->bailout
, 1);
212 priv
->max_fetched
= addr
;
216 /* Possible values for prefix requirement. */
217 #define PREFIX_IGNORED_SHIFT 16
218 #define PREFIX_IGNORED_REPZ (PREFIX_REPZ << PREFIX_IGNORED_SHIFT)
219 #define PREFIX_IGNORED_REPNZ (PREFIX_REPNZ << PREFIX_IGNORED_SHIFT)
220 #define PREFIX_IGNORED_DATA (PREFIX_DATA << PREFIX_IGNORED_SHIFT)
221 #define PREFIX_IGNORED_ADDR (PREFIX_ADDR << PREFIX_IGNORED_SHIFT)
222 #define PREFIX_IGNORED_LOCK (PREFIX_LOCK << PREFIX_IGNORED_SHIFT)
224 /* Opcode prefixes. */
225 #define PREFIX_OPCODE (PREFIX_REPZ \
229 /* Prefixes ignored. */
230 #define PREFIX_IGNORED (PREFIX_IGNORED_REPZ \
231 | PREFIX_IGNORED_REPNZ \
232 | PREFIX_IGNORED_DATA)
234 #define XX { NULL, 0 }
235 #define Bad_Opcode NULL, { { NULL, 0 } }, 0
237 #define Eb { OP_E, b_mode }
238 #define Ebnd { OP_E, bnd_mode }
239 #define EbS { OP_E, b_swap_mode }
240 #define EbndS { OP_E, bnd_swap_mode }
241 #define Ev { OP_E, v_mode }
242 #define Eva { OP_E, va_mode }
243 #define Ev_bnd { OP_E, v_bnd_mode }
244 #define EvS { OP_E, v_swap_mode }
245 #define Ed { OP_E, d_mode }
246 #define Edq { OP_E, dq_mode }
247 #define Edqw { OP_E, dqw_mode }
248 #define Edqb { OP_E, dqb_mode }
249 #define Edb { OP_E, db_mode }
250 #define Edw { OP_E, dw_mode }
251 #define Edqd { OP_E, dqd_mode }
252 #define Eq { OP_E, q_mode }
253 #define indirEv { OP_indirE, indir_v_mode }
254 #define indirEp { OP_indirE, f_mode }
255 #define stackEv { OP_E, stack_v_mode }
256 #define Em { OP_E, m_mode }
257 #define Ew { OP_E, w_mode }
258 #define M { OP_M, 0 } /* lea, lgdt, etc. */
259 #define Ma { OP_M, a_mode }
260 #define Mb { OP_M, b_mode }
261 #define Md { OP_M, d_mode }
262 #define Mo { OP_M, o_mode }
263 #define Mp { OP_M, f_mode } /* 32 or 48 bit memory operand for LDS, LES etc */
264 #define Mq { OP_M, q_mode }
265 #define Mv { OP_M, v_mode }
266 #define Mv_bnd { OP_M, v_bndmk_mode }
267 #define Mx { OP_M, x_mode }
268 #define Mxmm { OP_M, xmm_mode }
269 #define Gb { OP_G, b_mode }
270 #define Gbnd { OP_G, bnd_mode }
271 #define Gv { OP_G, v_mode }
272 #define Gd { OP_G, d_mode }
273 #define Gdq { OP_G, dq_mode }
274 #define Gm { OP_G, m_mode }
275 #define Gva { OP_G, va_mode }
276 #define Gw { OP_G, w_mode }
277 #define Rm { OP_R, m_mode }
278 #define Ib { OP_I, b_mode }
279 #define sIb { OP_sI, b_mode } /* sign extened byte */
280 #define sIbT { OP_sI, b_T_mode } /* sign extened byte like 'T' */
281 #define Iv { OP_I, v_mode }
282 #define sIv { OP_sI, v_mode }
283 #define Iv64 { OP_I64, v_mode }
284 #define Id { OP_I, d_mode }
285 #define Iw { OP_I, w_mode }
286 #define I1 { OP_I, const_1_mode }
287 #define Jb { OP_J, b_mode }
288 #define Jv { OP_J, v_mode }
289 #define Jdqw { OP_J, dqw_mode }
290 #define Cm { OP_C, m_mode }
291 #define Dm { OP_D, m_mode }
292 #define Td { OP_T, d_mode }
293 #define Skip_MODRM { OP_Skip_MODRM, 0 }
295 #define RMeAX { OP_REG, eAX_reg }
296 #define RMeBX { OP_REG, eBX_reg }
297 #define RMeCX { OP_REG, eCX_reg }
298 #define RMeDX { OP_REG, eDX_reg }
299 #define RMeSP { OP_REG, eSP_reg }
300 #define RMeBP { OP_REG, eBP_reg }
301 #define RMeSI { OP_REG, eSI_reg }
302 #define RMeDI { OP_REG, eDI_reg }
303 #define RMrAX { OP_REG, rAX_reg }
304 #define RMrBX { OP_REG, rBX_reg }
305 #define RMrCX { OP_REG, rCX_reg }
306 #define RMrDX { OP_REG, rDX_reg }
307 #define RMrSP { OP_REG, rSP_reg }
308 #define RMrBP { OP_REG, rBP_reg }
309 #define RMrSI { OP_REG, rSI_reg }
310 #define RMrDI { OP_REG, rDI_reg }
311 #define RMAL { OP_REG, al_reg }
312 #define RMCL { OP_REG, cl_reg }
313 #define RMDL { OP_REG, dl_reg }
314 #define RMBL { OP_REG, bl_reg }
315 #define RMAH { OP_REG, ah_reg }
316 #define RMCH { OP_REG, ch_reg }
317 #define RMDH { OP_REG, dh_reg }
318 #define RMBH { OP_REG, bh_reg }
319 #define RMAX { OP_REG, ax_reg }
320 #define RMDX { OP_REG, dx_reg }
322 #define eAX { OP_IMREG, eAX_reg }
323 #define AL { OP_IMREG, al_reg }
324 #define CL { OP_IMREG, cl_reg }
325 #define zAX { OP_IMREG, z_mode_ax_reg }
326 #define indirDX { OP_IMREG, indir_dx_reg }
328 #define Sw { OP_SEG, w_mode }
329 #define Sv { OP_SEG, v_mode }
330 #define Ap { OP_DIR, 0 }
331 #define Ob { OP_OFF64, b_mode }
332 #define Ov { OP_OFF64, v_mode }
333 #define Xb { OP_DSreg, eSI_reg }
334 #define Xv { OP_DSreg, eSI_reg }
335 #define Xz { OP_DSreg, eSI_reg }
336 #define Yb { OP_ESreg, eDI_reg }
337 #define Yv { OP_ESreg, eDI_reg }
338 #define DSBX { OP_DSreg, eBX_reg }
340 #define es { OP_REG, es_reg }
341 #define ss { OP_REG, ss_reg }
342 #define cs { OP_REG, cs_reg }
343 #define ds { OP_REG, ds_reg }
344 #define fs { OP_REG, fs_reg }
345 #define gs { OP_REG, gs_reg }
347 #define MX { OP_MMX, 0 }
348 #define XM { OP_XMM, 0 }
349 #define XMScalar { OP_XMM, scalar_mode }
350 #define XMGatherQ { OP_XMM, vex_vsib_q_w_dq_mode }
351 #define XMM { OP_XMM, xmm_mode }
352 #define TMM { OP_XMM, tmm_mode }
353 #define XMxmmq { OP_XMM, xmmq_mode }
354 #define EM { OP_EM, v_mode }
355 #define EMS { OP_EM, v_swap_mode }
356 #define EMd { OP_EM, d_mode }
357 #define EMx { OP_EM, x_mode }
358 #define EXbwUnit { OP_EX, bw_unit_mode }
359 #define EXw { OP_EX, w_mode }
360 #define EXd { OP_EX, d_mode }
361 #define EXdS { OP_EX, d_swap_mode }
362 #define EXq { OP_EX, q_mode }
363 #define EXqS { OP_EX, q_swap_mode }
364 #define EXx { OP_EX, x_mode }
365 #define EXxS { OP_EX, x_swap_mode }
366 #define EXxmm { OP_EX, xmm_mode }
367 #define EXymm { OP_EX, ymm_mode }
368 #define EXtmm { OP_EX, tmm_mode }
369 #define EXxmmq { OP_EX, xmmq_mode }
370 #define EXEvexHalfBcstXmmq { OP_EX, evex_half_bcst_xmmq_mode }
371 #define EXxmm_mb { OP_EX, xmm_mb_mode }
372 #define EXxmm_mw { OP_EX, xmm_mw_mode }
373 #define EXxmm_md { OP_EX, xmm_md_mode }
374 #define EXxmm_mq { OP_EX, xmm_mq_mode }
375 #define EXxmmdw { OP_EX, xmmdw_mode }
376 #define EXxmmqd { OP_EX, xmmqd_mode }
377 #define EXymmq { OP_EX, ymmq_mode }
378 #define EXVexWdqScalar { OP_EX, vex_scalar_w_dq_mode }
379 #define EXEvexXGscat { OP_EX, evex_x_gscat_mode }
380 #define EXEvexXNoBcst { OP_EX, evex_x_nobcst_mode }
381 #define MS { OP_MS, v_mode }
382 #define XS { OP_XS, v_mode }
383 #define EMCq { OP_EMC, q_mode }
384 #define MXC { OP_MXC, 0 }
385 #define OPSUF { OP_3DNowSuffix, 0 }
386 #define SEP { SEP_Fixup, 0 }
387 #define CMP { CMP_Fixup, 0 }
388 #define XMM0 { XMM_Fixup, 0 }
389 #define FXSAVE { FXSAVE_Fixup, 0 }
391 #define Vex { OP_VEX, vex_mode }
392 #define VexW { OP_VexW, vex_mode }
393 #define VexScalar { OP_VEX, vex_scalar_mode }
394 #define VexScalarR { OP_VexR, vex_scalar_mode }
395 #define VexGatherQ { OP_VEX, vex_vsib_q_w_dq_mode }
396 #define VexGdq { OP_VEX, dq_mode }
397 #define VexTmm { OP_VEX, tmm_mode }
398 #define XMVexI4 { OP_REG_VexI4, x_mode }
399 #define XMVexScalarI4 { OP_REG_VexI4, scalar_mode }
400 #define VexI4 { OP_VexI4, 0 }
401 #define PCLMUL { PCLMUL_Fixup, 0 }
402 #define VPCMP { VPCMP_Fixup, 0 }
403 #define VPCOM { VPCOM_Fixup, 0 }
405 #define EXxEVexR { OP_Rounding, evex_rounding_mode }
406 #define EXxEVexR64 { OP_Rounding, evex_rounding_64_mode }
407 #define EXxEVexS { OP_Rounding, evex_sae_mode }
409 #define XMask { OP_Mask, mask_mode }
410 #define MaskG { OP_G, mask_mode }
411 #define MaskE { OP_E, mask_mode }
412 #define MaskBDE { OP_E, mask_bd_mode }
413 #define MaskVex { OP_VEX, mask_mode }
415 #define MVexVSIBDWpX { OP_M, vex_vsib_d_w_dq_mode }
416 #define MVexVSIBDQWpX { OP_M, vex_vsib_d_w_d_mode }
417 #define MVexVSIBQWpX { OP_M, vex_vsib_q_w_dq_mode }
418 #define MVexVSIBQDWpX { OP_M, vex_vsib_q_w_d_mode }
420 #define MVexSIBMEM { OP_M, vex_sibmem_mode }
422 /* Used handle "rep" prefix for string instructions. */
423 #define Xbr { REP_Fixup, eSI_reg }
424 #define Xvr { REP_Fixup, eSI_reg }
425 #define Ybr { REP_Fixup, eDI_reg }
426 #define Yvr { REP_Fixup, eDI_reg }
427 #define Yzr { REP_Fixup, eDI_reg }
428 #define indirDXr { REP_Fixup, indir_dx_reg }
429 #define ALr { REP_Fixup, al_reg }
430 #define eAXr { REP_Fixup, eAX_reg }
432 /* Used handle HLE prefix for lockable instructions. */
433 #define Ebh1 { HLE_Fixup1, b_mode }
434 #define Evh1 { HLE_Fixup1, v_mode }
435 #define Ebh2 { HLE_Fixup2, b_mode }
436 #define Evh2 { HLE_Fixup2, v_mode }
437 #define Ebh3 { HLE_Fixup3, b_mode }
438 #define Evh3 { HLE_Fixup3, v_mode }
440 #define BND { BND_Fixup, 0 }
441 #define NOTRACK { NOTRACK_Fixup, 0 }
443 #define cond_jump_flag { NULL, cond_jump_mode }
444 #define loop_jcxz_flag { NULL, loop_jcxz_mode }
446 /* bits in sizeflag */
447 #define SUFFIX_ALWAYS 4
455 /* byte operand with operand swapped */
457 /* byte operand, sign extend like 'T' suffix */
459 /* operand size depends on prefixes */
461 /* operand size depends on prefixes with operand swapped */
463 /* operand size depends on address prefix */
467 /* double word operand */
469 /* double word operand with operand swapped */
471 /* quad word operand */
473 /* quad word operand with operand swapped */
475 /* ten-byte operand */
477 /* 16-byte XMM, 32-byte YMM or 64-byte ZMM operand. In EVEX with
478 broadcast enabled. */
480 /* Similar to x_mode, but with different EVEX mem shifts. */
482 /* Similar to x_mode, but with yet different EVEX mem shifts. */
484 /* Similar to x_mode, but with disabled broadcast. */
486 /* Similar to x_mode, but with operands swapped and disabled broadcast
489 /* 16-byte XMM operand */
491 /* XMM, XMM or YMM register operand, or quad word, xmmword or ymmword
492 memory operand (depending on vector length). Broadcast isn't
495 /* Same as xmmq_mode, but broadcast is allowed. */
496 evex_half_bcst_xmmq_mode
,
497 /* XMM register or byte memory operand */
499 /* XMM register or word memory operand */
501 /* XMM register or double word memory operand */
503 /* XMM register or quad word memory operand */
505 /* 16-byte XMM, word, double word or quad word operand. */
507 /* 16-byte XMM, double word, quad word operand or xmm word operand. */
509 /* 32-byte YMM operand */
511 /* quad word, ymmword or zmmword memory operand. */
513 /* 32-byte YMM or 16-byte word operand */
517 /* d_mode in 32bit, q_mode in 64bit mode. */
519 /* pair of v_mode operands */
525 /* like v_bnd_mode in 32bit, no RIP-rel in 64bit mode. */
527 /* operand size depends on REX prefixes. */
529 /* registers like dq_mode, memory like w_mode, displacements like
530 v_mode without considering Intel64 ISA. */
534 /* bounds operand with operand swapped */
536 /* 4- or 6-byte pointer operand */
539 /* v_mode for indirect branch opcodes. */
541 /* v_mode for stack-related opcodes. */
543 /* non-quad operand size depends on prefixes */
545 /* 16-byte operand */
547 /* registers like dq_mode, memory like b_mode. */
549 /* registers like d_mode, memory like b_mode. */
551 /* registers like d_mode, memory like w_mode. */
553 /* registers like dq_mode, memory like d_mode. */
555 /* normal vex mode */
558 /* Operand size depends on the VEX.W bit, with VSIB dword indices. */
559 vex_vsib_d_w_dq_mode
,
560 /* Similar to vex_vsib_d_w_dq_mode, with smaller memory. */
562 /* Operand size depends on the VEX.W bit, with VSIB qword indices. */
563 vex_vsib_q_w_dq_mode
,
564 /* Similar to vex_vsib_q_w_dq_mode, with smaller memory. */
566 /* mandatory non-vector SIB. */
569 /* scalar, ignore vector length. */
571 /* like vex_mode, ignore vector length. */
573 /* Operand size depends on the VEX.W bit, ignore vector length. */
574 vex_scalar_w_dq_mode
,
576 /* Static rounding. */
578 /* Static rounding, 64-bit mode only. */
579 evex_rounding_64_mode
,
580 /* Supress all exceptions. */
583 /* Mask register operand. */
585 /* Mask register operand. */
653 #define FLOAT NULL, { { NULL, FLOATCODE } }, 0
655 #define DIS386(T, I) NULL, { { NULL, (T)}, { NULL, (I) } }, 0
656 #define DIS386_PREFIX(T, I, P) NULL, { { NULL, (T)}, { NULL, (I) } }, P
657 #define REG_TABLE(I) DIS386 (USE_REG_TABLE, (I))
658 #define MOD_TABLE(I) DIS386 (USE_MOD_TABLE, (I))
659 #define RM_TABLE(I) DIS386 (USE_RM_TABLE, (I))
660 #define PREFIX_TABLE(I) DIS386 (USE_PREFIX_TABLE, (I))
661 #define X86_64_TABLE(I) DIS386 (USE_X86_64_TABLE, (I))
662 #define THREE_BYTE_TABLE(I) DIS386 (USE_3BYTE_TABLE, (I))
663 #define THREE_BYTE_TABLE_PREFIX(I, P) DIS386_PREFIX (USE_3BYTE_TABLE, (I), P)
664 #define XOP_8F_TABLE(I) DIS386 (USE_XOP_8F_TABLE, (I))
665 #define VEX_C4_TABLE(I) DIS386 (USE_VEX_C4_TABLE, (I))
666 #define VEX_C5_TABLE(I) DIS386 (USE_VEX_C5_TABLE, (I))
667 #define VEX_LEN_TABLE(I) DIS386 (USE_VEX_LEN_TABLE, (I))
668 #define VEX_W_TABLE(I) DIS386 (USE_VEX_W_TABLE, (I))
669 #define EVEX_TABLE(I) DIS386 (USE_EVEX_TABLE, (I))
670 #define EVEX_LEN_TABLE(I) DIS386 (USE_EVEX_LEN_TABLE, (I))
708 REG_VEX_0F3849_X86_64_P_0_W_0_M_1
,
713 REG_0FXOP_09_12_M_1_L_0
,
793 MOD_VEX_0F3849_X86_64_P_0_W_0
,
794 MOD_VEX_0F3849_X86_64_P_2_W_0
,
795 MOD_VEX_0F3849_X86_64_P_3_W_0
,
796 MOD_VEX_0F384B_X86_64_P_1_W_0
,
797 MOD_VEX_0F384B_X86_64_P_2_W_0
,
798 MOD_VEX_0F384B_X86_64_P_3_W_0
,
799 MOD_VEX_0F385C_X86_64_P_1_W_0
,
800 MOD_VEX_0F385E_X86_64_P_0_W_0
,
801 MOD_VEX_0F385E_X86_64_P_1_W_0
,
802 MOD_VEX_0F385E_X86_64_P_2_W_0
,
803 MOD_VEX_0F385E_X86_64_P_3_W_0
,
813 MOD_VEX_0F12_PREFIX_0
,
814 MOD_VEX_0F12_PREFIX_2
,
816 MOD_VEX_0F16_PREFIX_0
,
817 MOD_VEX_0F16_PREFIX_2
,
820 MOD_VEX_W_0_0F41_P_0_LEN_1
,
821 MOD_VEX_W_1_0F41_P_0_LEN_1
,
822 MOD_VEX_W_0_0F41_P_2_LEN_1
,
823 MOD_VEX_W_1_0F41_P_2_LEN_1
,
824 MOD_VEX_W_0_0F42_P_0_LEN_1
,
825 MOD_VEX_W_1_0F42_P_0_LEN_1
,
826 MOD_VEX_W_0_0F42_P_2_LEN_1
,
827 MOD_VEX_W_1_0F42_P_2_LEN_1
,
828 MOD_VEX_W_0_0F44_P_0_LEN_1
,
829 MOD_VEX_W_1_0F44_P_0_LEN_1
,
830 MOD_VEX_W_0_0F44_P_2_LEN_1
,
831 MOD_VEX_W_1_0F44_P_2_LEN_1
,
832 MOD_VEX_W_0_0F45_P_0_LEN_1
,
833 MOD_VEX_W_1_0F45_P_0_LEN_1
,
834 MOD_VEX_W_0_0F45_P_2_LEN_1
,
835 MOD_VEX_W_1_0F45_P_2_LEN_1
,
836 MOD_VEX_W_0_0F46_P_0_LEN_1
,
837 MOD_VEX_W_1_0F46_P_0_LEN_1
,
838 MOD_VEX_W_0_0F46_P_2_LEN_1
,
839 MOD_VEX_W_1_0F46_P_2_LEN_1
,
840 MOD_VEX_W_0_0F47_P_0_LEN_1
,
841 MOD_VEX_W_1_0F47_P_0_LEN_1
,
842 MOD_VEX_W_0_0F47_P_2_LEN_1
,
843 MOD_VEX_W_1_0F47_P_2_LEN_1
,
844 MOD_VEX_W_0_0F4A_P_0_LEN_1
,
845 MOD_VEX_W_1_0F4A_P_0_LEN_1
,
846 MOD_VEX_W_0_0F4A_P_2_LEN_1
,
847 MOD_VEX_W_1_0F4A_P_2_LEN_1
,
848 MOD_VEX_W_0_0F4B_P_0_LEN_1
,
849 MOD_VEX_W_1_0F4B_P_0_LEN_1
,
850 MOD_VEX_W_0_0F4B_P_2_LEN_1
,
862 MOD_VEX_W_0_0F91_P_0_LEN_0
,
863 MOD_VEX_W_1_0F91_P_0_LEN_0
,
864 MOD_VEX_W_0_0F91_P_2_LEN_0
,
865 MOD_VEX_W_1_0F91_P_2_LEN_0
,
866 MOD_VEX_W_0_0F92_P_0_LEN_0
,
867 MOD_VEX_W_0_0F92_P_2_LEN_0
,
868 MOD_VEX_0F92_P_3_LEN_0
,
869 MOD_VEX_W_0_0F93_P_0_LEN_0
,
870 MOD_VEX_W_0_0F93_P_2_LEN_0
,
871 MOD_VEX_0F93_P_3_LEN_0
,
872 MOD_VEX_W_0_0F98_P_0_LEN_0
,
873 MOD_VEX_W_1_0F98_P_0_LEN_0
,
874 MOD_VEX_W_0_0F98_P_2_LEN_0
,
875 MOD_VEX_W_1_0F98_P_2_LEN_0
,
876 MOD_VEX_W_0_0F99_P_0_LEN_0
,
877 MOD_VEX_W_1_0F99_P_0_LEN_0
,
878 MOD_VEX_W_0_0F99_P_2_LEN_0
,
879 MOD_VEX_W_1_0F99_P_2_LEN_0
,
884 MOD_VEX_0FF0_PREFIX_3
,
901 MOD_EVEX_0F12_PREFIX_0
,
902 MOD_EVEX_0F12_PREFIX_2
,
904 MOD_EVEX_0F16_PREFIX_0
,
905 MOD_EVEX_0F16_PREFIX_2
,
913 MOD_EVEX_0F382A_P_1_W_1
,
915 MOD_EVEX_0F383A_P_1_W_0
,
923 MOD_EVEX_0F38C6_REG_1
,
924 MOD_EVEX_0F38C6_REG_2
,
925 MOD_EVEX_0F38C6_REG_5
,
926 MOD_EVEX_0F38C6_REG_6
,
927 MOD_EVEX_0F38C7_REG_1
,
928 MOD_EVEX_0F38C7_REG_2
,
929 MOD_EVEX_0F38C7_REG_5
,
930 MOD_EVEX_0F38C7_REG_6
943 RM_0F1E_P_1_MOD_3_REG_7
,
944 RM_0FAE_REG_6_MOD_3_P_0
,
946 RM_VEX_0F3849_X86_64_P_0_W_0_M_1_R_0
952 PREFIX_0F01_REG_3_RM_1
,
953 PREFIX_0F01_REG_5_MOD_0
,
954 PREFIX_0F01_REG_5_MOD_3_RM_0
,
955 PREFIX_0F01_REG_5_MOD_3_RM_1
,
956 PREFIX_0F01_REG_5_MOD_3_RM_2
,
957 PREFIX_0F01_REG_7_MOD_3_RM_2
,
995 PREFIX_0FAE_REG_0_MOD_3
,
996 PREFIX_0FAE_REG_1_MOD_3
,
997 PREFIX_0FAE_REG_2_MOD_3
,
998 PREFIX_0FAE_REG_3_MOD_3
,
999 PREFIX_0FAE_REG_4_MOD_0
,
1000 PREFIX_0FAE_REG_4_MOD_3
,
1001 PREFIX_0FAE_REG_5_MOD_3
,
1002 PREFIX_0FAE_REG_6_MOD_0
,
1003 PREFIX_0FAE_REG_6_MOD_3
,
1004 PREFIX_0FAE_REG_7_MOD_0
,
1009 PREFIX_0FC7_REG_6_MOD_0
,
1010 PREFIX_0FC7_REG_6_MOD_3
,
1011 PREFIX_0FC7_REG_7_MOD_3
,
1066 PREFIX_VEX_0F3849_X86_64
,
1067 PREFIX_VEX_0F384B_X86_64
,
1068 PREFIX_VEX_0F385C_X86_64
,
1069 PREFIX_VEX_0F385E_X86_64
,
1178 THREE_BYTE_0F38
= 0,
1205 VEX_LEN_0F12_P_0_M_0
= 0,
1206 VEX_LEN_0F12_P_0_M_1
,
1207 #define VEX_LEN_0F12_P_2_M_0 VEX_LEN_0F12_P_0_M_0
1209 VEX_LEN_0F16_P_0_M_0
,
1210 VEX_LEN_0F16_P_0_M_1
,
1211 #define VEX_LEN_0F16_P_2_M_0 VEX_LEN_0F16_P_0_M_0
1247 VEX_LEN_0FAE_R_2_M_0
,
1248 VEX_LEN_0FAE_R_3_M_0
,
1258 VEX_LEN_0F3849_X86_64_P_0_W_0_M_0
,
1259 VEX_LEN_0F3849_X86_64_P_0_W_0_M_1_REG_0_RM_0
,
1260 VEX_LEN_0F3849_X86_64_P_2_W_0_M_0
,
1261 VEX_LEN_0F3849_X86_64_P_3_W_0_M_0
,
1262 VEX_LEN_0F384B_X86_64_P_1_W_0_M_0
,
1263 VEX_LEN_0F384B_X86_64_P_2_W_0_M_0
,
1264 VEX_LEN_0F384B_X86_64_P_3_W_0_M_0
,
1266 VEX_LEN_0F385C_X86_64_P_1_W_0_M_0
,
1267 VEX_LEN_0F385E_X86_64_P_0_W_0_M_0
,
1268 VEX_LEN_0F385E_X86_64_P_1_W_0_M_0
,
1269 VEX_LEN_0F385E_X86_64_P_2_W_0_M_0
,
1270 VEX_LEN_0F385E_X86_64_P_3_W_0_M_0
,
1310 VEX_LEN_0FXOP_08_85
,
1311 VEX_LEN_0FXOP_08_86
,
1312 VEX_LEN_0FXOP_08_87
,
1313 VEX_LEN_0FXOP_08_8E
,
1314 VEX_LEN_0FXOP_08_8F
,
1315 VEX_LEN_0FXOP_08_95
,
1316 VEX_LEN_0FXOP_08_96
,
1317 VEX_LEN_0FXOP_08_97
,
1318 VEX_LEN_0FXOP_08_9E
,
1319 VEX_LEN_0FXOP_08_9F
,
1320 VEX_LEN_0FXOP_08_A3
,
1321 VEX_LEN_0FXOP_08_A6
,
1322 VEX_LEN_0FXOP_08_B6
,
1323 VEX_LEN_0FXOP_08_C0
,
1324 VEX_LEN_0FXOP_08_C1
,
1325 VEX_LEN_0FXOP_08_C2
,
1326 VEX_LEN_0FXOP_08_C3
,
1327 VEX_LEN_0FXOP_08_CC
,
1328 VEX_LEN_0FXOP_08_CD
,
1329 VEX_LEN_0FXOP_08_CE
,
1330 VEX_LEN_0FXOP_08_CF
,
1331 VEX_LEN_0FXOP_08_EC
,
1332 VEX_LEN_0FXOP_08_ED
,
1333 VEX_LEN_0FXOP_08_EE
,
1334 VEX_LEN_0FXOP_08_EF
,
1335 VEX_LEN_0FXOP_09_01
,
1336 VEX_LEN_0FXOP_09_02
,
1337 VEX_LEN_0FXOP_09_12_M_1
,
1338 VEX_LEN_0FXOP_09_82_W_0
,
1339 VEX_LEN_0FXOP_09_83_W_0
,
1340 VEX_LEN_0FXOP_09_90
,
1341 VEX_LEN_0FXOP_09_91
,
1342 VEX_LEN_0FXOP_09_92
,
1343 VEX_LEN_0FXOP_09_93
,
1344 VEX_LEN_0FXOP_09_94
,
1345 VEX_LEN_0FXOP_09_95
,
1346 VEX_LEN_0FXOP_09_96
,
1347 VEX_LEN_0FXOP_09_97
,
1348 VEX_LEN_0FXOP_09_98
,
1349 VEX_LEN_0FXOP_09_99
,
1350 VEX_LEN_0FXOP_09_9A
,
1351 VEX_LEN_0FXOP_09_9B
,
1352 VEX_LEN_0FXOP_09_C1
,
1353 VEX_LEN_0FXOP_09_C2
,
1354 VEX_LEN_0FXOP_09_C3
,
1355 VEX_LEN_0FXOP_09_C6
,
1356 VEX_LEN_0FXOP_09_C7
,
1357 VEX_LEN_0FXOP_09_CB
,
1358 VEX_LEN_0FXOP_09_D1
,
1359 VEX_LEN_0FXOP_09_D2
,
1360 VEX_LEN_0FXOP_09_D3
,
1361 VEX_LEN_0FXOP_09_D6
,
1362 VEX_LEN_0FXOP_09_D7
,
1363 VEX_LEN_0FXOP_09_DB
,
1364 VEX_LEN_0FXOP_09_E1
,
1365 VEX_LEN_0FXOP_09_E2
,
1366 VEX_LEN_0FXOP_09_E3
,
1367 VEX_LEN_0FXOP_0A_12
,
1379 EVEX_LEN_0F3819_W_0
,
1380 EVEX_LEN_0F3819_W_1
,
1381 EVEX_LEN_0F381A_W_0_M_0
,
1382 EVEX_LEN_0F381A_W_1_M_0
,
1383 EVEX_LEN_0F381B_W_0_M_0
,
1384 EVEX_LEN_0F381B_W_1_M_0
,
1386 EVEX_LEN_0F385A_W_0_M_0
,
1387 EVEX_LEN_0F385A_W_1_M_0
,
1388 EVEX_LEN_0F385B_W_0_M_0
,
1389 EVEX_LEN_0F385B_W_1_M_0
,
1390 EVEX_LEN_0F38C6_R_1_M_0
,
1391 EVEX_LEN_0F38C6_R_2_M_0
,
1392 EVEX_LEN_0F38C6_R_5_M_0
,
1393 EVEX_LEN_0F38C6_R_6_M_0
,
1394 EVEX_LEN_0F38C7_R_1_M_0_W_0
,
1395 EVEX_LEN_0F38C7_R_1_M_0_W_1
,
1396 EVEX_LEN_0F38C7_R_2_M_0_W_0
,
1397 EVEX_LEN_0F38C7_R_2_M_0_W_1
,
1398 EVEX_LEN_0F38C7_R_5_M_0_W_0
,
1399 EVEX_LEN_0F38C7_R_5_M_0_W_1
,
1400 EVEX_LEN_0F38C7_R_6_M_0_W_0
,
1401 EVEX_LEN_0F38C7_R_6_M_0_W_1
,
1402 EVEX_LEN_0F3A00_W_1
,
1403 EVEX_LEN_0F3A01_W_1
,
1408 EVEX_LEN_0F3A18_W_0
,
1409 EVEX_LEN_0F3A18_W_1
,
1410 EVEX_LEN_0F3A19_W_0
,
1411 EVEX_LEN_0F3A19_W_1
,
1412 EVEX_LEN_0F3A1A_W_0
,
1413 EVEX_LEN_0F3A1A_W_1
,
1414 EVEX_LEN_0F3A1B_W_0
,
1415 EVEX_LEN_0F3A1B_W_1
,
1417 EVEX_LEN_0F3A21_W_0
,
1419 EVEX_LEN_0F3A23_W_0
,
1420 EVEX_LEN_0F3A23_W_1
,
1421 EVEX_LEN_0F3A38_W_0
,
1422 EVEX_LEN_0F3A38_W_1
,
1423 EVEX_LEN_0F3A39_W_0
,
1424 EVEX_LEN_0F3A39_W_1
,
1425 EVEX_LEN_0F3A3A_W_0
,
1426 EVEX_LEN_0F3A3A_W_1
,
1427 EVEX_LEN_0F3A3B_W_0
,
1428 EVEX_LEN_0F3A3B_W_1
,
1429 EVEX_LEN_0F3A43_W_0
,
1435 VEX_W_0F41_P_0_LEN_1
= 0,
1436 VEX_W_0F41_P_2_LEN_1
,
1437 VEX_W_0F42_P_0_LEN_1
,
1438 VEX_W_0F42_P_2_LEN_1
,
1439 VEX_W_0F44_P_0_LEN_0
,
1440 VEX_W_0F44_P_2_LEN_0
,
1441 VEX_W_0F45_P_0_LEN_1
,
1442 VEX_W_0F45_P_2_LEN_1
,
1443 VEX_W_0F46_P_0_LEN_1
,
1444 VEX_W_0F46_P_2_LEN_1
,
1445 VEX_W_0F47_P_0_LEN_1
,
1446 VEX_W_0F47_P_2_LEN_1
,
1447 VEX_W_0F4A_P_0_LEN_1
,
1448 VEX_W_0F4A_P_2_LEN_1
,
1449 VEX_W_0F4B_P_0_LEN_1
,
1450 VEX_W_0F4B_P_2_LEN_1
,
1451 VEX_W_0F90_P_0_LEN_0
,
1452 VEX_W_0F90_P_2_LEN_0
,
1453 VEX_W_0F91_P_0_LEN_0
,
1454 VEX_W_0F91_P_2_LEN_0
,
1455 VEX_W_0F92_P_0_LEN_0
,
1456 VEX_W_0F92_P_2_LEN_0
,
1457 VEX_W_0F93_P_0_LEN_0
,
1458 VEX_W_0F93_P_2_LEN_0
,
1459 VEX_W_0F98_P_0_LEN_0
,
1460 VEX_W_0F98_P_2_LEN_0
,
1461 VEX_W_0F99_P_0_LEN_0
,
1462 VEX_W_0F99_P_2_LEN_0
,
1471 VEX_W_0F381A_M_0_L_1
,
1478 VEX_W_0F3849_X86_64_P_0
,
1479 VEX_W_0F3849_X86_64_P_2
,
1480 VEX_W_0F3849_X86_64_P_3
,
1481 VEX_W_0F384B_X86_64_P_1
,
1482 VEX_W_0F384B_X86_64_P_2
,
1483 VEX_W_0F384B_X86_64_P_3
,
1486 VEX_W_0F385A_M_0_L_0
,
1487 VEX_W_0F385C_X86_64_P_1
,
1488 VEX_W_0F385E_X86_64_P_0
,
1489 VEX_W_0F385E_X86_64_P_1
,
1490 VEX_W_0F385E_X86_64_P_2
,
1491 VEX_W_0F385E_X86_64_P_3
,
1513 VEX_W_0FXOP_08_85_L_0
,
1514 VEX_W_0FXOP_08_86_L_0
,
1515 VEX_W_0FXOP_08_87_L_0
,
1516 VEX_W_0FXOP_08_8E_L_0
,
1517 VEX_W_0FXOP_08_8F_L_0
,
1518 VEX_W_0FXOP_08_95_L_0
,
1519 VEX_W_0FXOP_08_96_L_0
,
1520 VEX_W_0FXOP_08_97_L_0
,
1521 VEX_W_0FXOP_08_9E_L_0
,
1522 VEX_W_0FXOP_08_9F_L_0
,
1523 VEX_W_0FXOP_08_A6_L_0
,
1524 VEX_W_0FXOP_08_B6_L_0
,
1525 VEX_W_0FXOP_08_C0_L_0
,
1526 VEX_W_0FXOP_08_C1_L_0
,
1527 VEX_W_0FXOP_08_C2_L_0
,
1528 VEX_W_0FXOP_08_C3_L_0
,
1529 VEX_W_0FXOP_08_CC_L_0
,
1530 VEX_W_0FXOP_08_CD_L_0
,
1531 VEX_W_0FXOP_08_CE_L_0
,
1532 VEX_W_0FXOP_08_CF_L_0
,
1533 VEX_W_0FXOP_08_EC_L_0
,
1534 VEX_W_0FXOP_08_ED_L_0
,
1535 VEX_W_0FXOP_08_EE_L_0
,
1536 VEX_W_0FXOP_08_EF_L_0
,
1542 VEX_W_0FXOP_09_C1_L_0
,
1543 VEX_W_0FXOP_09_C2_L_0
,
1544 VEX_W_0FXOP_09_C3_L_0
,
1545 VEX_W_0FXOP_09_C6_L_0
,
1546 VEX_W_0FXOP_09_C7_L_0
,
1547 VEX_W_0FXOP_09_CB_L_0
,
1548 VEX_W_0FXOP_09_D1_L_0
,
1549 VEX_W_0FXOP_09_D2_L_0
,
1550 VEX_W_0FXOP_09_D3_L_0
,
1551 VEX_W_0FXOP_09_D6_L_0
,
1552 VEX_W_0FXOP_09_D7_L_0
,
1553 VEX_W_0FXOP_09_DB_L_0
,
1554 VEX_W_0FXOP_09_E1_L_0
,
1555 VEX_W_0FXOP_09_E2_L_0
,
1556 VEX_W_0FXOP_09_E3_L_0
,
1562 EVEX_W_0F12_P_0_M_1
,
1565 EVEX_W_0F16_P_0_M_1
,
1685 EVEX_W_0F38C7_R_1_M_0
,
1686 EVEX_W_0F38C7_R_2_M_0
,
1687 EVEX_W_0F38C7_R_5_M_0
,
1688 EVEX_W_0F38C7_R_6_M_0
,
1713 typedef void (*op_rtn
) (int bytemode
, int sizeflag
);
1722 unsigned int prefix_requirement
;
1725 /* Upper case letters in the instruction names here are macros.
1726 'A' => print 'b' if no register operands or suffix_always is true
1727 'B' => print 'b' if suffix_always is true
1728 'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
1730 'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
1731 suffix_always is true
1732 'E' => print 'e' if 32-bit form of jcxz
1733 'F' => print 'w' or 'l' depending on address size prefix (loop insns)
1734 'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
1735 'H' => print ",pt" or ",pn" branch hint
1738 'K' => print 'd' or 'q' if rex prefix is present.
1739 'L' => print 'l' if suffix_always is true
1740 'M' => print 'r' if intel_mnemonic is false.
1741 'N' => print 'n' if instruction has no wait "prefix"
1742 'O' => print 'd' or 'o' (or 'q' in Intel mode)
1743 'P' => print 'w', 'l' or 'q' if instruction has an operand size prefix,
1744 or suffix_always is true. print 'q' if rex prefix is present.
1745 'Q' => print 'w', 'l' or 'q' for memory operand or suffix_always
1747 'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
1748 'S' => print 'w', 'l' or 'q' if suffix_always is true
1749 'T' => print 'q' in 64bit mode if instruction has no operand size
1750 prefix and behave as 'P' otherwise
1751 'U' => print 'q' in 64bit mode if instruction has no operand size
1752 prefix and behave as 'Q' otherwise
1753 'V' => print 'q' in 64bit mode if instruction has no operand size
1754 prefix and behave as 'S' otherwise
1755 'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
1756 'X' => print 's', 'd' depending on data16 prefix (for XMM)
1758 'Z' => print 'q' in 64bit mode and behave as 'L' otherwise
1759 '!' => change condition from true to false or from false to true.
1760 '%' => add 1 upper case letter to the macro.
1761 '^' => print 'w', 'l', or 'q' (Intel64 ISA only) depending on operand size
1762 prefix or suffix_always is true (lcall/ljmp).
1763 '@' => print 'q' for Intel64 ISA, 'w' or 'q' for AMD64 ISA depending
1764 on operand size prefix.
1765 '&' => print 'q' in 64bit mode for Intel64 ISA or if instruction
1766 has no operand size prefix for AMD64 ISA, behave as 'P'
1769 2 upper case letter macros:
1770 "XY" => print 'x' or 'y' if suffix_always is true or no register
1771 operands and no broadcast.
1772 "XZ" => print 'x', 'y', or 'z' if suffix_always is true or no
1773 register operands and no broadcast.
1774 "XW" => print 's', 'd' depending on the VEX.W bit (for FMA)
1775 "LQ" => print 'l' ('d' in Intel mode) or 'q' for memory operand, cond
1776 being false, or no operand at all in 64bit mode, or if suffix_always
1778 "LB" => print "abs" in 64bit mode and behave as 'B' otherwise
1779 "LS" => print "abs" in 64bit mode and behave as 'S' otherwise
1780 "LV" => print "abs" for 64bit operand and behave as 'S' otherwise
1781 "DQ" => print 'd' or 'q' depending on the VEX.W bit
1782 "BW" => print 'b' or 'w' depending on the VEX.W bit
1783 "LP" => print 'w' or 'l' ('d' in Intel mode) if instruction has
1784 an operand size prefix, or suffix_always is true. print
1785 'q' if rex prefix is present.
1787 Many of the above letters print nothing in Intel mode. See "putop"
1790 Braces '{' and '}', and vertical bars '|', indicate alternative
1791 mnemonic strings for AT&T and Intel. */
1793 static const struct dis386 dis386
[] = {
1795 { "addB", { Ebh1
, Gb
}, 0 },
1796 { "addS", { Evh1
, Gv
}, 0 },
1797 { "addB", { Gb
, EbS
}, 0 },
1798 { "addS", { Gv
, EvS
}, 0 },
1799 { "addB", { AL
, Ib
}, 0 },
1800 { "addS", { eAX
, Iv
}, 0 },
1801 { X86_64_TABLE (X86_64_06
) },
1802 { X86_64_TABLE (X86_64_07
) },
1804 { "orB", { Ebh1
, Gb
}, 0 },
1805 { "orS", { Evh1
, Gv
}, 0 },
1806 { "orB", { Gb
, EbS
}, 0 },
1807 { "orS", { Gv
, EvS
}, 0 },
1808 { "orB", { AL
, Ib
}, 0 },
1809 { "orS", { eAX
, Iv
}, 0 },
1810 { X86_64_TABLE (X86_64_0E
) },
1811 { Bad_Opcode
}, /* 0x0f extended opcode escape */
1813 { "adcB", { Ebh1
, Gb
}, 0 },
1814 { "adcS", { Evh1
, Gv
}, 0 },
1815 { "adcB", { Gb
, EbS
}, 0 },
1816 { "adcS", { Gv
, EvS
}, 0 },
1817 { "adcB", { AL
, Ib
}, 0 },
1818 { "adcS", { eAX
, Iv
}, 0 },
1819 { X86_64_TABLE (X86_64_16
) },
1820 { X86_64_TABLE (X86_64_17
) },
1822 { "sbbB", { Ebh1
, Gb
}, 0 },
1823 { "sbbS", { Evh1
, Gv
}, 0 },
1824 { "sbbB", { Gb
, EbS
}, 0 },
1825 { "sbbS", { Gv
, EvS
}, 0 },
1826 { "sbbB", { AL
, Ib
}, 0 },
1827 { "sbbS", { eAX
, Iv
}, 0 },
1828 { X86_64_TABLE (X86_64_1E
) },
1829 { X86_64_TABLE (X86_64_1F
) },
1831 { "andB", { Ebh1
, Gb
}, 0 },
1832 { "andS", { Evh1
, Gv
}, 0 },
1833 { "andB", { Gb
, EbS
}, 0 },
1834 { "andS", { Gv
, EvS
}, 0 },
1835 { "andB", { AL
, Ib
}, 0 },
1836 { "andS", { eAX
, Iv
}, 0 },
1837 { Bad_Opcode
}, /* SEG ES prefix */
1838 { X86_64_TABLE (X86_64_27
) },
1840 { "subB", { Ebh1
, Gb
}, 0 },
1841 { "subS", { Evh1
, Gv
}, 0 },
1842 { "subB", { Gb
, EbS
}, 0 },
1843 { "subS", { Gv
, EvS
}, 0 },
1844 { "subB", { AL
, Ib
}, 0 },
1845 { "subS", { eAX
, Iv
}, 0 },
1846 { Bad_Opcode
}, /* SEG CS prefix */
1847 { X86_64_TABLE (X86_64_2F
) },
1849 { "xorB", { Ebh1
, Gb
}, 0 },
1850 { "xorS", { Evh1
, Gv
}, 0 },
1851 { "xorB", { Gb
, EbS
}, 0 },
1852 { "xorS", { Gv
, EvS
}, 0 },
1853 { "xorB", { AL
, Ib
}, 0 },
1854 { "xorS", { eAX
, Iv
}, 0 },
1855 { Bad_Opcode
}, /* SEG SS prefix */
1856 { X86_64_TABLE (X86_64_37
) },
1858 { "cmpB", { Eb
, Gb
}, 0 },
1859 { "cmpS", { Ev
, Gv
}, 0 },
1860 { "cmpB", { Gb
, EbS
}, 0 },
1861 { "cmpS", { Gv
, EvS
}, 0 },
1862 { "cmpB", { AL
, Ib
}, 0 },
1863 { "cmpS", { eAX
, Iv
}, 0 },
1864 { Bad_Opcode
}, /* SEG DS prefix */
1865 { X86_64_TABLE (X86_64_3F
) },
1867 { "inc{S|}", { RMeAX
}, 0 },
1868 { "inc{S|}", { RMeCX
}, 0 },
1869 { "inc{S|}", { RMeDX
}, 0 },
1870 { "inc{S|}", { RMeBX
}, 0 },
1871 { "inc{S|}", { RMeSP
}, 0 },
1872 { "inc{S|}", { RMeBP
}, 0 },
1873 { "inc{S|}", { RMeSI
}, 0 },
1874 { "inc{S|}", { RMeDI
}, 0 },
1876 { "dec{S|}", { RMeAX
}, 0 },
1877 { "dec{S|}", { RMeCX
}, 0 },
1878 { "dec{S|}", { RMeDX
}, 0 },
1879 { "dec{S|}", { RMeBX
}, 0 },
1880 { "dec{S|}", { RMeSP
}, 0 },
1881 { "dec{S|}", { RMeBP
}, 0 },
1882 { "dec{S|}", { RMeSI
}, 0 },
1883 { "dec{S|}", { RMeDI
}, 0 },
1885 { "pushV", { RMrAX
}, 0 },
1886 { "pushV", { RMrCX
}, 0 },
1887 { "pushV", { RMrDX
}, 0 },
1888 { "pushV", { RMrBX
}, 0 },
1889 { "pushV", { RMrSP
}, 0 },
1890 { "pushV", { RMrBP
}, 0 },
1891 { "pushV", { RMrSI
}, 0 },
1892 { "pushV", { RMrDI
}, 0 },
1894 { "popV", { RMrAX
}, 0 },
1895 { "popV", { RMrCX
}, 0 },
1896 { "popV", { RMrDX
}, 0 },
1897 { "popV", { RMrBX
}, 0 },
1898 { "popV", { RMrSP
}, 0 },
1899 { "popV", { RMrBP
}, 0 },
1900 { "popV", { RMrSI
}, 0 },
1901 { "popV", { RMrDI
}, 0 },
1903 { X86_64_TABLE (X86_64_60
) },
1904 { X86_64_TABLE (X86_64_61
) },
1905 { X86_64_TABLE (X86_64_62
) },
1906 { X86_64_TABLE (X86_64_63
) },
1907 { Bad_Opcode
}, /* seg fs */
1908 { Bad_Opcode
}, /* seg gs */
1909 { Bad_Opcode
}, /* op size prefix */
1910 { Bad_Opcode
}, /* adr size prefix */
1912 { "pushT", { sIv
}, 0 },
1913 { "imulS", { Gv
, Ev
, Iv
}, 0 },
1914 { "pushT", { sIbT
}, 0 },
1915 { "imulS", { Gv
, Ev
, sIb
}, 0 },
1916 { "ins{b|}", { Ybr
, indirDX
}, 0 },
1917 { X86_64_TABLE (X86_64_6D
) },
1918 { "outs{b|}", { indirDXr
, Xb
}, 0 },
1919 { X86_64_TABLE (X86_64_6F
) },
1921 { "joH", { Jb
, BND
, cond_jump_flag
}, 0 },
1922 { "jnoH", { Jb
, BND
, cond_jump_flag
}, 0 },
1923 { "jbH", { Jb
, BND
, cond_jump_flag
}, 0 },
1924 { "jaeH", { Jb
, BND
, cond_jump_flag
}, 0 },
1925 { "jeH", { Jb
, BND
, cond_jump_flag
}, 0 },
1926 { "jneH", { Jb
, BND
, cond_jump_flag
}, 0 },
1927 { "jbeH", { Jb
, BND
, cond_jump_flag
}, 0 },
1928 { "jaH", { Jb
, BND
, cond_jump_flag
}, 0 },
1930 { "jsH", { Jb
, BND
, cond_jump_flag
}, 0 },
1931 { "jnsH", { Jb
, BND
, cond_jump_flag
}, 0 },
1932 { "jpH", { Jb
, BND
, cond_jump_flag
}, 0 },
1933 { "jnpH", { Jb
, BND
, cond_jump_flag
}, 0 },
1934 { "jlH", { Jb
, BND
, cond_jump_flag
}, 0 },
1935 { "jgeH", { Jb
, BND
, cond_jump_flag
}, 0 },
1936 { "jleH", { Jb
, BND
, cond_jump_flag
}, 0 },
1937 { "jgH", { Jb
, BND
, cond_jump_flag
}, 0 },
1939 { REG_TABLE (REG_80
) },
1940 { REG_TABLE (REG_81
) },
1941 { X86_64_TABLE (X86_64_82
) },
1942 { REG_TABLE (REG_83
) },
1943 { "testB", { Eb
, Gb
}, 0 },
1944 { "testS", { Ev
, Gv
}, 0 },
1945 { "xchgB", { Ebh2
, Gb
}, 0 },
1946 { "xchgS", { Evh2
, Gv
}, 0 },
1948 { "movB", { Ebh3
, Gb
}, 0 },
1949 { "movS", { Evh3
, Gv
}, 0 },
1950 { "movB", { Gb
, EbS
}, 0 },
1951 { "movS", { Gv
, EvS
}, 0 },
1952 { "movD", { Sv
, Sw
}, 0 },
1953 { MOD_TABLE (MOD_8D
) },
1954 { "movD", { Sw
, Sv
}, 0 },
1955 { REG_TABLE (REG_8F
) },
1957 { PREFIX_TABLE (PREFIX_90
) },
1958 { "xchgS", { RMeCX
, eAX
}, 0 },
1959 { "xchgS", { RMeDX
, eAX
}, 0 },
1960 { "xchgS", { RMeBX
, eAX
}, 0 },
1961 { "xchgS", { RMeSP
, eAX
}, 0 },
1962 { "xchgS", { RMeBP
, eAX
}, 0 },
1963 { "xchgS", { RMeSI
, eAX
}, 0 },
1964 { "xchgS", { RMeDI
, eAX
}, 0 },
1966 { "cW{t|}R", { XX
}, 0 },
1967 { "cR{t|}O", { XX
}, 0 },
1968 { X86_64_TABLE (X86_64_9A
) },
1969 { Bad_Opcode
}, /* fwait */
1970 { "pushfT", { XX
}, 0 },
1971 { "popfT", { XX
}, 0 },
1972 { "sahf", { XX
}, 0 },
1973 { "lahf", { XX
}, 0 },
1975 { "mov%LB", { AL
, Ob
}, 0 },
1976 { "mov%LS", { eAX
, Ov
}, 0 },
1977 { "mov%LB", { Ob
, AL
}, 0 },
1978 { "mov%LS", { Ov
, eAX
}, 0 },
1979 { "movs{b|}", { Ybr
, Xb
}, 0 },
1980 { "movs{R|}", { Yvr
, Xv
}, 0 },
1981 { "cmps{b|}", { Xb
, Yb
}, 0 },
1982 { "cmps{R|}", { Xv
, Yv
}, 0 },
1984 { "testB", { AL
, Ib
}, 0 },
1985 { "testS", { eAX
, Iv
}, 0 },
1986 { "stosB", { Ybr
, AL
}, 0 },
1987 { "stosS", { Yvr
, eAX
}, 0 },
1988 { "lodsB", { ALr
, Xb
}, 0 },
1989 { "lodsS", { eAXr
, Xv
}, 0 },
1990 { "scasB", { AL
, Yb
}, 0 },
1991 { "scasS", { eAX
, Yv
}, 0 },
1993 { "movB", { RMAL
, Ib
}, 0 },
1994 { "movB", { RMCL
, Ib
}, 0 },
1995 { "movB", { RMDL
, Ib
}, 0 },
1996 { "movB", { RMBL
, Ib
}, 0 },
1997 { "movB", { RMAH
, Ib
}, 0 },
1998 { "movB", { RMCH
, Ib
}, 0 },
1999 { "movB", { RMDH
, Ib
}, 0 },
2000 { "movB", { RMBH
, Ib
}, 0 },
2002 { "mov%LV", { RMeAX
, Iv64
}, 0 },
2003 { "mov%LV", { RMeCX
, Iv64
}, 0 },
2004 { "mov%LV", { RMeDX
, Iv64
}, 0 },
2005 { "mov%LV", { RMeBX
, Iv64
}, 0 },
2006 { "mov%LV", { RMeSP
, Iv64
}, 0 },
2007 { "mov%LV", { RMeBP
, Iv64
}, 0 },
2008 { "mov%LV", { RMeSI
, Iv64
}, 0 },
2009 { "mov%LV", { RMeDI
, Iv64
}, 0 },
2011 { REG_TABLE (REG_C0
) },
2012 { REG_TABLE (REG_C1
) },
2013 { X86_64_TABLE (X86_64_C2
) },
2014 { X86_64_TABLE (X86_64_C3
) },
2015 { X86_64_TABLE (X86_64_C4
) },
2016 { X86_64_TABLE (X86_64_C5
) },
2017 { REG_TABLE (REG_C6
) },
2018 { REG_TABLE (REG_C7
) },
2020 { "enterT", { Iw
, Ib
}, 0 },
2021 { "leaveT", { XX
}, 0 },
2022 { "{l|}ret{|f}P", { Iw
}, 0 },
2023 { "{l|}ret{|f}P", { XX
}, 0 },
2024 { "int3", { XX
}, 0 },
2025 { "int", { Ib
}, 0 },
2026 { X86_64_TABLE (X86_64_CE
) },
2027 { "iret%LP", { XX
}, 0 },
2029 { REG_TABLE (REG_D0
) },
2030 { REG_TABLE (REG_D1
) },
2031 { REG_TABLE (REG_D2
) },
2032 { REG_TABLE (REG_D3
) },
2033 { X86_64_TABLE (X86_64_D4
) },
2034 { X86_64_TABLE (X86_64_D5
) },
2036 { "xlat", { DSBX
}, 0 },
2047 { "loopneFH", { Jb
, XX
, loop_jcxz_flag
}, 0 },
2048 { "loopeFH", { Jb
, XX
, loop_jcxz_flag
}, 0 },
2049 { "loopFH", { Jb
, XX
, loop_jcxz_flag
}, 0 },
2050 { "jEcxzH", { Jb
, XX
, loop_jcxz_flag
}, 0 },
2051 { "inB", { AL
, Ib
}, 0 },
2052 { "inG", { zAX
, Ib
}, 0 },
2053 { "outB", { Ib
, AL
}, 0 },
2054 { "outG", { Ib
, zAX
}, 0 },
2056 { X86_64_TABLE (X86_64_E8
) },
2057 { X86_64_TABLE (X86_64_E9
) },
2058 { X86_64_TABLE (X86_64_EA
) },
2059 { "jmp", { Jb
, BND
}, 0 },
2060 { "inB", { AL
, indirDX
}, 0 },
2061 { "inG", { zAX
, indirDX
}, 0 },
2062 { "outB", { indirDX
, AL
}, 0 },
2063 { "outG", { indirDX
, zAX
}, 0 },
2065 { Bad_Opcode
}, /* lock prefix */
2066 { "icebp", { XX
}, 0 },
2067 { Bad_Opcode
}, /* repne */
2068 { Bad_Opcode
}, /* repz */
2069 { "hlt", { XX
}, 0 },
2070 { "cmc", { XX
}, 0 },
2071 { REG_TABLE (REG_F6
) },
2072 { REG_TABLE (REG_F7
) },
2074 { "clc", { XX
}, 0 },
2075 { "stc", { XX
}, 0 },
2076 { "cli", { XX
}, 0 },
2077 { "sti", { XX
}, 0 },
2078 { "cld", { XX
}, 0 },
2079 { "std", { XX
}, 0 },
2080 { REG_TABLE (REG_FE
) },
2081 { REG_TABLE (REG_FF
) },
2084 static const struct dis386 dis386_twobyte
[] = {
2086 { REG_TABLE (REG_0F00
) },
2087 { REG_TABLE (REG_0F01
) },
2088 { "larS", { Gv
, Ew
}, 0 },
2089 { "lslS", { Gv
, Ew
}, 0 },
2091 { "syscall", { XX
}, 0 },
2092 { "clts", { XX
}, 0 },
2093 { "sysret%LQ", { XX
}, 0 },
2095 { "invd", { XX
}, 0 },
2096 { PREFIX_TABLE (PREFIX_0F09
) },
2098 { "ud2", { XX
}, 0 },
2100 { REG_TABLE (REG_0F0D
) },
2101 { "femms", { XX
}, 0 },
2102 { "", { MX
, EM
, OPSUF
}, 0 }, /* See OP_3DNowSuffix. */
2104 { PREFIX_TABLE (PREFIX_0F10
) },
2105 { PREFIX_TABLE (PREFIX_0F11
) },
2106 { PREFIX_TABLE (PREFIX_0F12
) },
2107 { MOD_TABLE (MOD_0F13
) },
2108 { "unpcklpX", { XM
, EXx
}, PREFIX_OPCODE
},
2109 { "unpckhpX", { XM
, EXx
}, PREFIX_OPCODE
},
2110 { PREFIX_TABLE (PREFIX_0F16
) },
2111 { MOD_TABLE (MOD_0F17
) },
2113 { REG_TABLE (REG_0F18
) },
2114 { "nopQ", { Ev
}, 0 },
2115 { PREFIX_TABLE (PREFIX_0F1A
) },
2116 { PREFIX_TABLE (PREFIX_0F1B
) },
2117 { PREFIX_TABLE (PREFIX_0F1C
) },
2118 { "nopQ", { Ev
}, 0 },
2119 { PREFIX_TABLE (PREFIX_0F1E
) },
2120 { "nopQ", { Ev
}, 0 },
2122 { "movZ", { Rm
, Cm
}, 0 },
2123 { "movZ", { Rm
, Dm
}, 0 },
2124 { "movZ", { Cm
, Rm
}, 0 },
2125 { "movZ", { Dm
, Rm
}, 0 },
2126 { MOD_TABLE (MOD_0F24
) },
2128 { MOD_TABLE (MOD_0F26
) },
2131 { "movapX", { XM
, EXx
}, PREFIX_OPCODE
},
2132 { "movapX", { EXxS
, XM
}, PREFIX_OPCODE
},
2133 { PREFIX_TABLE (PREFIX_0F2A
) },
2134 { PREFIX_TABLE (PREFIX_0F2B
) },
2135 { PREFIX_TABLE (PREFIX_0F2C
) },
2136 { PREFIX_TABLE (PREFIX_0F2D
) },
2137 { PREFIX_TABLE (PREFIX_0F2E
) },
2138 { PREFIX_TABLE (PREFIX_0F2F
) },
2140 { "wrmsr", { XX
}, 0 },
2141 { "rdtsc", { XX
}, 0 },
2142 { "rdmsr", { XX
}, 0 },
2143 { "rdpmc", { XX
}, 0 },
2144 { "sysenter", { SEP
}, 0 },
2145 { "sysexit", { SEP
}, 0 },
2147 { "getsec", { XX
}, 0 },
2149 { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F38
, PREFIX_OPCODE
) },
2151 { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F3A
, PREFIX_OPCODE
) },
2158 { "cmovoS", { Gv
, Ev
}, 0 },
2159 { "cmovnoS", { Gv
, Ev
}, 0 },
2160 { "cmovbS", { Gv
, Ev
}, 0 },
2161 { "cmovaeS", { Gv
, Ev
}, 0 },
2162 { "cmoveS", { Gv
, Ev
}, 0 },
2163 { "cmovneS", { Gv
, Ev
}, 0 },
2164 { "cmovbeS", { Gv
, Ev
}, 0 },
2165 { "cmovaS", { Gv
, Ev
}, 0 },
2167 { "cmovsS", { Gv
, Ev
}, 0 },
2168 { "cmovnsS", { Gv
, Ev
}, 0 },
2169 { "cmovpS", { Gv
, Ev
}, 0 },
2170 { "cmovnpS", { Gv
, Ev
}, 0 },
2171 { "cmovlS", { Gv
, Ev
}, 0 },
2172 { "cmovgeS", { Gv
, Ev
}, 0 },
2173 { "cmovleS", { Gv
, Ev
}, 0 },
2174 { "cmovgS", { Gv
, Ev
}, 0 },
2176 { MOD_TABLE (MOD_0F50
) },
2177 { PREFIX_TABLE (PREFIX_0F51
) },
2178 { PREFIX_TABLE (PREFIX_0F52
) },
2179 { PREFIX_TABLE (PREFIX_0F53
) },
2180 { "andpX", { XM
, EXx
}, PREFIX_OPCODE
},
2181 { "andnpX", { XM
, EXx
}, PREFIX_OPCODE
},
2182 { "orpX", { XM
, EXx
}, PREFIX_OPCODE
},
2183 { "xorpX", { XM
, EXx
}, PREFIX_OPCODE
},
2185 { PREFIX_TABLE (PREFIX_0F58
) },
2186 { PREFIX_TABLE (PREFIX_0F59
) },
2187 { PREFIX_TABLE (PREFIX_0F5A
) },
2188 { PREFIX_TABLE (PREFIX_0F5B
) },
2189 { PREFIX_TABLE (PREFIX_0F5C
) },
2190 { PREFIX_TABLE (PREFIX_0F5D
) },
2191 { PREFIX_TABLE (PREFIX_0F5E
) },
2192 { PREFIX_TABLE (PREFIX_0F5F
) },
2194 { PREFIX_TABLE (PREFIX_0F60
) },
2195 { PREFIX_TABLE (PREFIX_0F61
) },
2196 { PREFIX_TABLE (PREFIX_0F62
) },
2197 { "packsswb", { MX
, EM
}, PREFIX_OPCODE
},
2198 { "pcmpgtb", { MX
, EM
}, PREFIX_OPCODE
},
2199 { "pcmpgtw", { MX
, EM
}, PREFIX_OPCODE
},
2200 { "pcmpgtd", { MX
, EM
}, PREFIX_OPCODE
},
2201 { "packuswb", { MX
, EM
}, PREFIX_OPCODE
},
2203 { "punpckhbw", { MX
, EM
}, PREFIX_OPCODE
},
2204 { "punpckhwd", { MX
, EM
}, PREFIX_OPCODE
},
2205 { "punpckhdq", { MX
, EM
}, PREFIX_OPCODE
},
2206 { "packssdw", { MX
, EM
}, PREFIX_OPCODE
},
2207 { "punpcklqdq", { XM
, EXx
}, PREFIX_DATA
},
2208 { "punpckhqdq", { XM
, EXx
}, PREFIX_DATA
},
2209 { "movK", { MX
, Edq
}, PREFIX_OPCODE
},
2210 { PREFIX_TABLE (PREFIX_0F6F
) },
2212 { PREFIX_TABLE (PREFIX_0F70
) },
2213 { REG_TABLE (REG_0F71
) },
2214 { REG_TABLE (REG_0F72
) },
2215 { REG_TABLE (REG_0F73
) },
2216 { "pcmpeqb", { MX
, EM
}, PREFIX_OPCODE
},
2217 { "pcmpeqw", { MX
, EM
}, PREFIX_OPCODE
},
2218 { "pcmpeqd", { MX
, EM
}, PREFIX_OPCODE
},
2219 { "emms", { XX
}, PREFIX_OPCODE
},
2221 { PREFIX_TABLE (PREFIX_0F78
) },
2222 { PREFIX_TABLE (PREFIX_0F79
) },
2225 { PREFIX_TABLE (PREFIX_0F7C
) },
2226 { PREFIX_TABLE (PREFIX_0F7D
) },
2227 { PREFIX_TABLE (PREFIX_0F7E
) },
2228 { PREFIX_TABLE (PREFIX_0F7F
) },
2230 { "joH", { Jv
, BND
, cond_jump_flag
}, 0 },
2231 { "jnoH", { Jv
, BND
, cond_jump_flag
}, 0 },
2232 { "jbH", { Jv
, BND
, cond_jump_flag
}, 0 },
2233 { "jaeH", { Jv
, BND
, cond_jump_flag
}, 0 },
2234 { "jeH", { Jv
, BND
, cond_jump_flag
}, 0 },
2235 { "jneH", { Jv
, BND
, cond_jump_flag
}, 0 },
2236 { "jbeH", { Jv
, BND
, cond_jump_flag
}, 0 },
2237 { "jaH", { Jv
, BND
, cond_jump_flag
}, 0 },
2239 { "jsH", { Jv
, BND
, cond_jump_flag
}, 0 },
2240 { "jnsH", { Jv
, BND
, cond_jump_flag
}, 0 },
2241 { "jpH", { Jv
, BND
, cond_jump_flag
}, 0 },
2242 { "jnpH", { Jv
, BND
, cond_jump_flag
}, 0 },
2243 { "jlH", { Jv
, BND
, cond_jump_flag
}, 0 },
2244 { "jgeH", { Jv
, BND
, cond_jump_flag
}, 0 },
2245 { "jleH", { Jv
, BND
, cond_jump_flag
}, 0 },
2246 { "jgH", { Jv
, BND
, cond_jump_flag
}, 0 },
2248 { "seto", { Eb
}, 0 },
2249 { "setno", { Eb
}, 0 },
2250 { "setb", { Eb
}, 0 },
2251 { "setae", { Eb
}, 0 },
2252 { "sete", { Eb
}, 0 },
2253 { "setne", { Eb
}, 0 },
2254 { "setbe", { Eb
}, 0 },
2255 { "seta", { Eb
}, 0 },
2257 { "sets", { Eb
}, 0 },
2258 { "setns", { Eb
}, 0 },
2259 { "setp", { Eb
}, 0 },
2260 { "setnp", { Eb
}, 0 },
2261 { "setl", { Eb
}, 0 },
2262 { "setge", { Eb
}, 0 },
2263 { "setle", { Eb
}, 0 },
2264 { "setg", { Eb
}, 0 },
2266 { "pushT", { fs
}, 0 },
2267 { "popT", { fs
}, 0 },
2268 { "cpuid", { XX
}, 0 },
2269 { "btS", { Ev
, Gv
}, 0 },
2270 { "shldS", { Ev
, Gv
, Ib
}, 0 },
2271 { "shldS", { Ev
, Gv
, CL
}, 0 },
2272 { REG_TABLE (REG_0FA6
) },
2273 { REG_TABLE (REG_0FA7
) },
2275 { "pushT", { gs
}, 0 },
2276 { "popT", { gs
}, 0 },
2277 { "rsm", { XX
}, 0 },
2278 { "btsS", { Evh1
, Gv
}, 0 },
2279 { "shrdS", { Ev
, Gv
, Ib
}, 0 },
2280 { "shrdS", { Ev
, Gv
, CL
}, 0 },
2281 { REG_TABLE (REG_0FAE
) },
2282 { "imulS", { Gv
, Ev
}, 0 },
2284 { "cmpxchgB", { Ebh1
, Gb
}, 0 },
2285 { "cmpxchgS", { Evh1
, Gv
}, 0 },
2286 { MOD_TABLE (MOD_0FB2
) },
2287 { "btrS", { Evh1
, Gv
}, 0 },
2288 { MOD_TABLE (MOD_0FB4
) },
2289 { MOD_TABLE (MOD_0FB5
) },
2290 { "movz{bR|x}", { Gv
, Eb
}, 0 },
2291 { "movz{wR|x}", { Gv
, Ew
}, 0 }, /* yes, there really is movzww ! */
2293 { PREFIX_TABLE (PREFIX_0FB8
) },
2294 { "ud1S", { Gv
, Ev
}, 0 },
2295 { REG_TABLE (REG_0FBA
) },
2296 { "btcS", { Evh1
, Gv
}, 0 },
2297 { PREFIX_TABLE (PREFIX_0FBC
) },
2298 { PREFIX_TABLE (PREFIX_0FBD
) },
2299 { "movs{bR|x}", { Gv
, Eb
}, 0 },
2300 { "movs{wR|x}", { Gv
, Ew
}, 0 }, /* yes, there really is movsww ! */
2302 { "xaddB", { Ebh1
, Gb
}, 0 },
2303 { "xaddS", { Evh1
, Gv
}, 0 },
2304 { PREFIX_TABLE (PREFIX_0FC2
) },
2305 { MOD_TABLE (MOD_0FC3
) },
2306 { "pinsrw", { MX
, Edqw
, Ib
}, PREFIX_OPCODE
},
2307 { "pextrw", { Gdq
, MS
, Ib
}, PREFIX_OPCODE
},
2308 { "shufpX", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
2309 { REG_TABLE (REG_0FC7
) },
2311 { "bswap", { RMeAX
}, 0 },
2312 { "bswap", { RMeCX
}, 0 },
2313 { "bswap", { RMeDX
}, 0 },
2314 { "bswap", { RMeBX
}, 0 },
2315 { "bswap", { RMeSP
}, 0 },
2316 { "bswap", { RMeBP
}, 0 },
2317 { "bswap", { RMeSI
}, 0 },
2318 { "bswap", { RMeDI
}, 0 },
2320 { PREFIX_TABLE (PREFIX_0FD0
) },
2321 { "psrlw", { MX
, EM
}, PREFIX_OPCODE
},
2322 { "psrld", { MX
, EM
}, PREFIX_OPCODE
},
2323 { "psrlq", { MX
, EM
}, PREFIX_OPCODE
},
2324 { "paddq", { MX
, EM
}, PREFIX_OPCODE
},
2325 { "pmullw", { MX
, EM
}, PREFIX_OPCODE
},
2326 { PREFIX_TABLE (PREFIX_0FD6
) },
2327 { MOD_TABLE (MOD_0FD7
) },
2329 { "psubusb", { MX
, EM
}, PREFIX_OPCODE
},
2330 { "psubusw", { MX
, EM
}, PREFIX_OPCODE
},
2331 { "pminub", { MX
, EM
}, PREFIX_OPCODE
},
2332 { "pand", { MX
, EM
}, PREFIX_OPCODE
},
2333 { "paddusb", { MX
, EM
}, PREFIX_OPCODE
},
2334 { "paddusw", { MX
, EM
}, PREFIX_OPCODE
},
2335 { "pmaxub", { MX
, EM
}, PREFIX_OPCODE
},
2336 { "pandn", { MX
, EM
}, PREFIX_OPCODE
},
2338 { "pavgb", { MX
, EM
}, PREFIX_OPCODE
},
2339 { "psraw", { MX
, EM
}, PREFIX_OPCODE
},
2340 { "psrad", { MX
, EM
}, PREFIX_OPCODE
},
2341 { "pavgw", { MX
, EM
}, PREFIX_OPCODE
},
2342 { "pmulhuw", { MX
, EM
}, PREFIX_OPCODE
},
2343 { "pmulhw", { MX
, EM
}, PREFIX_OPCODE
},
2344 { PREFIX_TABLE (PREFIX_0FE6
) },
2345 { PREFIX_TABLE (PREFIX_0FE7
) },
2347 { "psubsb", { MX
, EM
}, PREFIX_OPCODE
},
2348 { "psubsw", { MX
, EM
}, PREFIX_OPCODE
},
2349 { "pminsw", { MX
, EM
}, PREFIX_OPCODE
},
2350 { "por", { MX
, EM
}, PREFIX_OPCODE
},
2351 { "paddsb", { MX
, EM
}, PREFIX_OPCODE
},
2352 { "paddsw", { MX
, EM
}, PREFIX_OPCODE
},
2353 { "pmaxsw", { MX
, EM
}, PREFIX_OPCODE
},
2354 { "pxor", { MX
, EM
}, PREFIX_OPCODE
},
2356 { PREFIX_TABLE (PREFIX_0FF0
) },
2357 { "psllw", { MX
, EM
}, PREFIX_OPCODE
},
2358 { "pslld", { MX
, EM
}, PREFIX_OPCODE
},
2359 { "psllq", { MX
, EM
}, PREFIX_OPCODE
},
2360 { "pmuludq", { MX
, EM
}, PREFIX_OPCODE
},
2361 { "pmaddwd", { MX
, EM
}, PREFIX_OPCODE
},
2362 { "psadbw", { MX
, EM
}, PREFIX_OPCODE
},
2363 { PREFIX_TABLE (PREFIX_0FF7
) },
2365 { "psubb", { MX
, EM
}, PREFIX_OPCODE
},
2366 { "psubw", { MX
, EM
}, PREFIX_OPCODE
},
2367 { "psubd", { MX
, EM
}, PREFIX_OPCODE
},
2368 { "psubq", { MX
, EM
}, PREFIX_OPCODE
},
2369 { "paddb", { MX
, EM
}, PREFIX_OPCODE
},
2370 { "paddw", { MX
, EM
}, PREFIX_OPCODE
},
2371 { "paddd", { MX
, EM
}, PREFIX_OPCODE
},
2372 { "ud0S", { Gv
, Ev
}, 0 },
2375 static const unsigned char onebyte_has_modrm
[256] = {
2376 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2377 /* ------------------------------- */
2378 /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
2379 /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
2380 /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
2381 /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
2382 /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
2383 /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
2384 /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
2385 /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
2386 /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
2387 /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
2388 /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
2389 /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
2390 /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
2391 /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
2392 /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
2393 /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1 /* f0 */
2394 /* ------------------------------- */
2395 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2398 static const unsigned char twobyte_has_modrm
[256] = {
2399 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2400 /* ------------------------------- */
2401 /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
2402 /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
2403 /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
2404 /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
2405 /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
2406 /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
2407 /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
2408 /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
2409 /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
2410 /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
2411 /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
2412 /* b0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* bf */
2413 /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
2414 /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
2415 /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
2416 /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 /* ff */
2417 /* ------------------------------- */
2418 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2421 static char obuf
[100];
2423 static char *mnemonicendp
;
2424 static char scratchbuf
[100];
2425 static unsigned char *start_codep
;
2426 static unsigned char *insn_codep
;
2427 static unsigned char *codep
;
2428 static unsigned char *end_codep
;
2429 static int last_lock_prefix
;
2430 static int last_repz_prefix
;
2431 static int last_repnz_prefix
;
2432 static int last_data_prefix
;
2433 static int last_addr_prefix
;
2434 static int last_rex_prefix
;
2435 static int last_seg_prefix
;
2436 static int fwait_prefix
;
2437 /* The active segment register prefix. */
2438 static int active_seg_prefix
;
2439 #define MAX_CODE_LENGTH 15
2440 /* We can up to 14 prefixes since the maximum instruction length is
2442 static int all_prefixes
[MAX_CODE_LENGTH
- 1];
2443 static disassemble_info
*the_info
;
2451 static unsigned char need_modrm
;
2461 int register_specifier
;
2468 int mask_register_specifier
;
2474 static unsigned char need_vex
;
2482 /* If we are accessing mod/rm/reg without need_modrm set, then the
2483 values are stale. Hitting this abort likely indicates that you
2484 need to update onebyte_has_modrm or twobyte_has_modrm. */
2485 #define MODRM_CHECK if (!need_modrm) abort ()
2487 static const char **names64
;
2488 static const char **names32
;
2489 static const char **names16
;
2490 static const char **names8
;
2491 static const char **names8rex
;
2492 static const char **names_seg
;
2493 static const char *index64
;
2494 static const char *index32
;
2495 static const char **index16
;
2496 static const char **names_bnd
;
2498 static const char *intel_names64
[] = {
2499 "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
2500 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2502 static const char *intel_names32
[] = {
2503 "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
2504 "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
2506 static const char *intel_names16
[] = {
2507 "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
2508 "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
2510 static const char *intel_names8
[] = {
2511 "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
2513 static const char *intel_names8rex
[] = {
2514 "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
2515 "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
2517 static const char *intel_names_seg
[] = {
2518 "es", "cs", "ss", "ds", "fs", "gs", "?", "?",
2520 static const char *intel_index64
= "riz";
2521 static const char *intel_index32
= "eiz";
2522 static const char *intel_index16
[] = {
2523 "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
2526 static const char *att_names64
[] = {
2527 "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
2528 "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
2530 static const char *att_names32
[] = {
2531 "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
2532 "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
2534 static const char *att_names16
[] = {
2535 "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
2536 "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
2538 static const char *att_names8
[] = {
2539 "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
2541 static const char *att_names8rex
[] = {
2542 "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
2543 "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
2545 static const char *att_names_seg
[] = {
2546 "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
2548 static const char *att_index64
= "%riz";
2549 static const char *att_index32
= "%eiz";
2550 static const char *att_index16
[] = {
2551 "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
2554 static const char **names_mm
;
2555 static const char *intel_names_mm
[] = {
2556 "mm0", "mm1", "mm2", "mm3",
2557 "mm4", "mm5", "mm6", "mm7"
2559 static const char *att_names_mm
[] = {
2560 "%mm0", "%mm1", "%mm2", "%mm3",
2561 "%mm4", "%mm5", "%mm6", "%mm7"
2564 static const char *intel_names_bnd
[] = {
2565 "bnd0", "bnd1", "bnd2", "bnd3"
2568 static const char *att_names_bnd
[] = {
2569 "%bnd0", "%bnd1", "%bnd2", "%bnd3"
2572 static const char **names_xmm
;
2573 static const char *intel_names_xmm
[] = {
2574 "xmm0", "xmm1", "xmm2", "xmm3",
2575 "xmm4", "xmm5", "xmm6", "xmm7",
2576 "xmm8", "xmm9", "xmm10", "xmm11",
2577 "xmm12", "xmm13", "xmm14", "xmm15",
2578 "xmm16", "xmm17", "xmm18", "xmm19",
2579 "xmm20", "xmm21", "xmm22", "xmm23",
2580 "xmm24", "xmm25", "xmm26", "xmm27",
2581 "xmm28", "xmm29", "xmm30", "xmm31"
2583 static const char *att_names_xmm
[] = {
2584 "%xmm0", "%xmm1", "%xmm2", "%xmm3",
2585 "%xmm4", "%xmm5", "%xmm6", "%xmm7",
2586 "%xmm8", "%xmm9", "%xmm10", "%xmm11",
2587 "%xmm12", "%xmm13", "%xmm14", "%xmm15",
2588 "%xmm16", "%xmm17", "%xmm18", "%xmm19",
2589 "%xmm20", "%xmm21", "%xmm22", "%xmm23",
2590 "%xmm24", "%xmm25", "%xmm26", "%xmm27",
2591 "%xmm28", "%xmm29", "%xmm30", "%xmm31"
2594 static const char **names_ymm
;
2595 static const char *intel_names_ymm
[] = {
2596 "ymm0", "ymm1", "ymm2", "ymm3",
2597 "ymm4", "ymm5", "ymm6", "ymm7",
2598 "ymm8", "ymm9", "ymm10", "ymm11",
2599 "ymm12", "ymm13", "ymm14", "ymm15",
2600 "ymm16", "ymm17", "ymm18", "ymm19",
2601 "ymm20", "ymm21", "ymm22", "ymm23",
2602 "ymm24", "ymm25", "ymm26", "ymm27",
2603 "ymm28", "ymm29", "ymm30", "ymm31"
2605 static const char *att_names_ymm
[] = {
2606 "%ymm0", "%ymm1", "%ymm2", "%ymm3",
2607 "%ymm4", "%ymm5", "%ymm6", "%ymm7",
2608 "%ymm8", "%ymm9", "%ymm10", "%ymm11",
2609 "%ymm12", "%ymm13", "%ymm14", "%ymm15",
2610 "%ymm16", "%ymm17", "%ymm18", "%ymm19",
2611 "%ymm20", "%ymm21", "%ymm22", "%ymm23",
2612 "%ymm24", "%ymm25", "%ymm26", "%ymm27",
2613 "%ymm28", "%ymm29", "%ymm30", "%ymm31"
2616 static const char **names_zmm
;
2617 static const char *intel_names_zmm
[] = {
2618 "zmm0", "zmm1", "zmm2", "zmm3",
2619 "zmm4", "zmm5", "zmm6", "zmm7",
2620 "zmm8", "zmm9", "zmm10", "zmm11",
2621 "zmm12", "zmm13", "zmm14", "zmm15",
2622 "zmm16", "zmm17", "zmm18", "zmm19",
2623 "zmm20", "zmm21", "zmm22", "zmm23",
2624 "zmm24", "zmm25", "zmm26", "zmm27",
2625 "zmm28", "zmm29", "zmm30", "zmm31"
2627 static const char *att_names_zmm
[] = {
2628 "%zmm0", "%zmm1", "%zmm2", "%zmm3",
2629 "%zmm4", "%zmm5", "%zmm6", "%zmm7",
2630 "%zmm8", "%zmm9", "%zmm10", "%zmm11",
2631 "%zmm12", "%zmm13", "%zmm14", "%zmm15",
2632 "%zmm16", "%zmm17", "%zmm18", "%zmm19",
2633 "%zmm20", "%zmm21", "%zmm22", "%zmm23",
2634 "%zmm24", "%zmm25", "%zmm26", "%zmm27",
2635 "%zmm28", "%zmm29", "%zmm30", "%zmm31"
2638 static const char **names_tmm
;
2639 static const char *intel_names_tmm
[] = {
2640 "tmm0", "tmm1", "tmm2", "tmm3",
2641 "tmm4", "tmm5", "tmm6", "tmm7"
2643 static const char *att_names_tmm
[] = {
2644 "%tmm0", "%tmm1", "%tmm2", "%tmm3",
2645 "%tmm4", "%tmm5", "%tmm6", "%tmm7"
2648 static const char **names_mask
;
2649 static const char *intel_names_mask
[] = {
2650 "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7"
2652 static const char *att_names_mask
[] = {
2653 "%k0", "%k1", "%k2", "%k3", "%k4", "%k5", "%k6", "%k7"
2656 static const char *names_rounding
[] =
2664 static const struct dis386 reg_table
[][8] = {
2667 { "addA", { Ebh1
, Ib
}, 0 },
2668 { "orA", { Ebh1
, Ib
}, 0 },
2669 { "adcA", { Ebh1
, Ib
}, 0 },
2670 { "sbbA", { Ebh1
, Ib
}, 0 },
2671 { "andA", { Ebh1
, Ib
}, 0 },
2672 { "subA", { Ebh1
, Ib
}, 0 },
2673 { "xorA", { Ebh1
, Ib
}, 0 },
2674 { "cmpA", { Eb
, Ib
}, 0 },
2678 { "addQ", { Evh1
, Iv
}, 0 },
2679 { "orQ", { Evh1
, Iv
}, 0 },
2680 { "adcQ", { Evh1
, Iv
}, 0 },
2681 { "sbbQ", { Evh1
, Iv
}, 0 },
2682 { "andQ", { Evh1
, Iv
}, 0 },
2683 { "subQ", { Evh1
, Iv
}, 0 },
2684 { "xorQ", { Evh1
, Iv
}, 0 },
2685 { "cmpQ", { Ev
, Iv
}, 0 },
2689 { "addQ", { Evh1
, sIb
}, 0 },
2690 { "orQ", { Evh1
, sIb
}, 0 },
2691 { "adcQ", { Evh1
, sIb
}, 0 },
2692 { "sbbQ", { Evh1
, sIb
}, 0 },
2693 { "andQ", { Evh1
, sIb
}, 0 },
2694 { "subQ", { Evh1
, sIb
}, 0 },
2695 { "xorQ", { Evh1
, sIb
}, 0 },
2696 { "cmpQ", { Ev
, sIb
}, 0 },
2700 { "popU", { stackEv
}, 0 },
2701 { XOP_8F_TABLE (XOP_09
) },
2705 { XOP_8F_TABLE (XOP_09
) },
2709 { "rolA", { Eb
, Ib
}, 0 },
2710 { "rorA", { Eb
, Ib
}, 0 },
2711 { "rclA", { Eb
, Ib
}, 0 },
2712 { "rcrA", { Eb
, Ib
}, 0 },
2713 { "shlA", { Eb
, Ib
}, 0 },
2714 { "shrA", { Eb
, Ib
}, 0 },
2715 { "shlA", { Eb
, Ib
}, 0 },
2716 { "sarA", { Eb
, Ib
}, 0 },
2720 { "rolQ", { Ev
, Ib
}, 0 },
2721 { "rorQ", { Ev
, Ib
}, 0 },
2722 { "rclQ", { Ev
, Ib
}, 0 },
2723 { "rcrQ", { Ev
, Ib
}, 0 },
2724 { "shlQ", { Ev
, Ib
}, 0 },
2725 { "shrQ", { Ev
, Ib
}, 0 },
2726 { "shlQ", { Ev
, Ib
}, 0 },
2727 { "sarQ", { Ev
, Ib
}, 0 },
2731 { "movA", { Ebh3
, Ib
}, 0 },
2738 { MOD_TABLE (MOD_C6_REG_7
) },
2742 { "movQ", { Evh3
, Iv
}, 0 },
2749 { MOD_TABLE (MOD_C7_REG_7
) },
2753 { "rolA", { Eb
, I1
}, 0 },
2754 { "rorA", { Eb
, I1
}, 0 },
2755 { "rclA", { Eb
, I1
}, 0 },
2756 { "rcrA", { Eb
, I1
}, 0 },
2757 { "shlA", { Eb
, I1
}, 0 },
2758 { "shrA", { Eb
, I1
}, 0 },
2759 { "shlA", { Eb
, I1
}, 0 },
2760 { "sarA", { Eb
, I1
}, 0 },
2764 { "rolQ", { Ev
, I1
}, 0 },
2765 { "rorQ", { Ev
, I1
}, 0 },
2766 { "rclQ", { Ev
, I1
}, 0 },
2767 { "rcrQ", { Ev
, I1
}, 0 },
2768 { "shlQ", { Ev
, I1
}, 0 },
2769 { "shrQ", { Ev
, I1
}, 0 },
2770 { "shlQ", { Ev
, I1
}, 0 },
2771 { "sarQ", { Ev
, I1
}, 0 },
2775 { "rolA", { Eb
, CL
}, 0 },
2776 { "rorA", { Eb
, CL
}, 0 },
2777 { "rclA", { Eb
, CL
}, 0 },
2778 { "rcrA", { Eb
, CL
}, 0 },
2779 { "shlA", { Eb
, CL
}, 0 },
2780 { "shrA", { Eb
, CL
}, 0 },
2781 { "shlA", { Eb
, CL
}, 0 },
2782 { "sarA", { Eb
, CL
}, 0 },
2786 { "rolQ", { Ev
, CL
}, 0 },
2787 { "rorQ", { Ev
, CL
}, 0 },
2788 { "rclQ", { Ev
, CL
}, 0 },
2789 { "rcrQ", { Ev
, CL
}, 0 },
2790 { "shlQ", { Ev
, CL
}, 0 },
2791 { "shrQ", { Ev
, CL
}, 0 },
2792 { "shlQ", { Ev
, CL
}, 0 },
2793 { "sarQ", { Ev
, CL
}, 0 },
2797 { "testA", { Eb
, Ib
}, 0 },
2798 { "testA", { Eb
, Ib
}, 0 },
2799 { "notA", { Ebh1
}, 0 },
2800 { "negA", { Ebh1
}, 0 },
2801 { "mulA", { Eb
}, 0 }, /* Don't print the implicit %al register, */
2802 { "imulA", { Eb
}, 0 }, /* to distinguish these opcodes from other */
2803 { "divA", { Eb
}, 0 }, /* mul/imul opcodes. Do the same for div */
2804 { "idivA", { Eb
}, 0 }, /* and idiv for consistency. */
2808 { "testQ", { Ev
, Iv
}, 0 },
2809 { "testQ", { Ev
, Iv
}, 0 },
2810 { "notQ", { Evh1
}, 0 },
2811 { "negQ", { Evh1
}, 0 },
2812 { "mulQ", { Ev
}, 0 }, /* Don't print the implicit register. */
2813 { "imulQ", { Ev
}, 0 },
2814 { "divQ", { Ev
}, 0 },
2815 { "idivQ", { Ev
}, 0 },
2819 { "incA", { Ebh1
}, 0 },
2820 { "decA", { Ebh1
}, 0 },
2824 { "incQ", { Evh1
}, 0 },
2825 { "decQ", { Evh1
}, 0 },
2826 { "call{&|}", { NOTRACK
, indirEv
, BND
}, 0 },
2827 { MOD_TABLE (MOD_FF_REG_3
) },
2828 { "jmp{&|}", { NOTRACK
, indirEv
, BND
}, 0 },
2829 { MOD_TABLE (MOD_FF_REG_5
) },
2830 { "pushU", { stackEv
}, 0 },
2835 { "sldtD", { Sv
}, 0 },
2836 { "strD", { Sv
}, 0 },
2837 { "lldt", { Ew
}, 0 },
2838 { "ltr", { Ew
}, 0 },
2839 { "verr", { Ew
}, 0 },
2840 { "verw", { Ew
}, 0 },
2846 { MOD_TABLE (MOD_0F01_REG_0
) },
2847 { MOD_TABLE (MOD_0F01_REG_1
) },
2848 { MOD_TABLE (MOD_0F01_REG_2
) },
2849 { MOD_TABLE (MOD_0F01_REG_3
) },
2850 { "smswD", { Sv
}, 0 },
2851 { MOD_TABLE (MOD_0F01_REG_5
) },
2852 { "lmsw", { Ew
}, 0 },
2853 { MOD_TABLE (MOD_0F01_REG_7
) },
2857 { "prefetch", { Mb
}, 0 },
2858 { "prefetchw", { Mb
}, 0 },
2859 { "prefetchwt1", { Mb
}, 0 },
2860 { "prefetch", { Mb
}, 0 },
2861 { "prefetch", { Mb
}, 0 },
2862 { "prefetch", { Mb
}, 0 },
2863 { "prefetch", { Mb
}, 0 },
2864 { "prefetch", { Mb
}, 0 },
2868 { MOD_TABLE (MOD_0F18_REG_0
) },
2869 { MOD_TABLE (MOD_0F18_REG_1
) },
2870 { MOD_TABLE (MOD_0F18_REG_2
) },
2871 { MOD_TABLE (MOD_0F18_REG_3
) },
2872 { MOD_TABLE (MOD_0F18_REG_4
) },
2873 { MOD_TABLE (MOD_0F18_REG_5
) },
2874 { MOD_TABLE (MOD_0F18_REG_6
) },
2875 { MOD_TABLE (MOD_0F18_REG_7
) },
2877 /* REG_0F1C_P_0_MOD_0 */
2879 { "cldemote", { Mb
}, 0 },
2880 { "nopQ", { Ev
}, 0 },
2881 { "nopQ", { Ev
}, 0 },
2882 { "nopQ", { Ev
}, 0 },
2883 { "nopQ", { Ev
}, 0 },
2884 { "nopQ", { Ev
}, 0 },
2885 { "nopQ", { Ev
}, 0 },
2886 { "nopQ", { Ev
}, 0 },
2888 /* REG_0F1E_P_1_MOD_3 */
2890 { "nopQ", { Ev
}, 0 },
2891 { "rdsspK", { Edq
}, PREFIX_OPCODE
},
2892 { "nopQ", { Ev
}, 0 },
2893 { "nopQ", { Ev
}, 0 },
2894 { "nopQ", { Ev
}, 0 },
2895 { "nopQ", { Ev
}, 0 },
2896 { "nopQ", { Ev
}, 0 },
2897 { RM_TABLE (RM_0F1E_P_1_MOD_3_REG_7
) },
2903 { MOD_TABLE (MOD_0F71_REG_2
) },
2905 { MOD_TABLE (MOD_0F71_REG_4
) },
2907 { MOD_TABLE (MOD_0F71_REG_6
) },
2913 { MOD_TABLE (MOD_0F72_REG_2
) },
2915 { MOD_TABLE (MOD_0F72_REG_4
) },
2917 { MOD_TABLE (MOD_0F72_REG_6
) },
2923 { MOD_TABLE (MOD_0F73_REG_2
) },
2924 { MOD_TABLE (MOD_0F73_REG_3
) },
2927 { MOD_TABLE (MOD_0F73_REG_6
) },
2928 { MOD_TABLE (MOD_0F73_REG_7
) },
2932 { "montmul", { { OP_0f07
, 0 } }, 0 },
2933 { "xsha1", { { OP_0f07
, 0 } }, 0 },
2934 { "xsha256", { { OP_0f07
, 0 } }, 0 },
2938 { "xstore-rng", { { OP_0f07
, 0 } }, 0 },
2939 { "xcrypt-ecb", { { OP_0f07
, 0 } }, 0 },
2940 { "xcrypt-cbc", { { OP_0f07
, 0 } }, 0 },
2941 { "xcrypt-ctr", { { OP_0f07
, 0 } }, 0 },
2942 { "xcrypt-cfb", { { OP_0f07
, 0 } }, 0 },
2943 { "xcrypt-ofb", { { OP_0f07
, 0 } }, 0 },
2947 { MOD_TABLE (MOD_0FAE_REG_0
) },
2948 { MOD_TABLE (MOD_0FAE_REG_1
) },
2949 { MOD_TABLE (MOD_0FAE_REG_2
) },
2950 { MOD_TABLE (MOD_0FAE_REG_3
) },
2951 { MOD_TABLE (MOD_0FAE_REG_4
) },
2952 { MOD_TABLE (MOD_0FAE_REG_5
) },
2953 { MOD_TABLE (MOD_0FAE_REG_6
) },
2954 { MOD_TABLE (MOD_0FAE_REG_7
) },
2962 { "btQ", { Ev
, Ib
}, 0 },
2963 { "btsQ", { Evh1
, Ib
}, 0 },
2964 { "btrQ", { Evh1
, Ib
}, 0 },
2965 { "btcQ", { Evh1
, Ib
}, 0 },
2970 { "cmpxchg8b", { { CMPXCHG8B_Fixup
, q_mode
} }, 0 },
2972 { MOD_TABLE (MOD_0FC7_REG_3
) },
2973 { MOD_TABLE (MOD_0FC7_REG_4
) },
2974 { MOD_TABLE (MOD_0FC7_REG_5
) },
2975 { MOD_TABLE (MOD_0FC7_REG_6
) },
2976 { MOD_TABLE (MOD_0FC7_REG_7
) },
2982 { MOD_TABLE (MOD_VEX_0F71_REG_2
) },
2984 { MOD_TABLE (MOD_VEX_0F71_REG_4
) },
2986 { MOD_TABLE (MOD_VEX_0F71_REG_6
) },
2992 { MOD_TABLE (MOD_VEX_0F72_REG_2
) },
2994 { MOD_TABLE (MOD_VEX_0F72_REG_4
) },
2996 { MOD_TABLE (MOD_VEX_0F72_REG_6
) },
3002 { MOD_TABLE (MOD_VEX_0F73_REG_2
) },
3003 { MOD_TABLE (MOD_VEX_0F73_REG_3
) },
3006 { MOD_TABLE (MOD_VEX_0F73_REG_6
) },
3007 { MOD_TABLE (MOD_VEX_0F73_REG_7
) },
3013 { MOD_TABLE (MOD_VEX_0FAE_REG_2
) },
3014 { MOD_TABLE (MOD_VEX_0FAE_REG_3
) },
3016 /* REG_VEX_0F3849_X86_64_P_0_W_0_M_1 */
3018 { RM_TABLE (RM_VEX_0F3849_X86_64_P_0_W_0_M_1_R_0
) },
3020 /* REG_VEX_0F38F3 */
3023 { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_1
) },
3024 { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_2
) },
3025 { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_3
) },
3027 /* REG_0FXOP_09_01_L_0 */
3030 { "blcfill", { VexGdq
, Edq
}, 0 },
3031 { "blsfill", { VexGdq
, Edq
}, 0 },
3032 { "blcs", { VexGdq
, Edq
}, 0 },
3033 { "tzmsk", { VexGdq
, Edq
}, 0 },
3034 { "blcic", { VexGdq
, Edq
}, 0 },
3035 { "blsic", { VexGdq
, Edq
}, 0 },
3036 { "t1mskc", { VexGdq
, Edq
}, 0 },
3038 /* REG_0FXOP_09_02_L_0 */
3041 { "blcmsk", { VexGdq
, Edq
}, 0 },
3046 { "blci", { VexGdq
, Edq
}, 0 },
3048 /* REG_0FXOP_09_12_M_1_L_0 */
3050 { "llwpcb", { Edq
}, 0 },
3051 { "slwpcb", { Edq
}, 0 },
3053 /* REG_0FXOP_0A_12_L_0 */
3055 { "lwpins", { VexGdq
, Ed
, Id
}, 0 },
3056 { "lwpval", { VexGdq
, Ed
, Id
}, 0 },
3059 #include "i386-dis-evex-reg.h"
3062 static const struct dis386 prefix_table
[][4] = {
3065 { "xchgS", { { NOP_Fixup1
, eAX_reg
}, { NOP_Fixup2
, eAX_reg
} }, 0 },
3066 { "pause", { XX
}, 0 },
3067 { "xchgS", { { NOP_Fixup1
, eAX_reg
}, { NOP_Fixup2
, eAX_reg
} }, 0 },
3068 { NULL
, { { NULL
, 0 } }, PREFIX_IGNORED
}
3071 /* PREFIX_0F01_REG_3_RM_1 */
3073 { "vmmcall", { Skip_MODRM
}, 0 },
3074 { "vmgexit", { Skip_MODRM
}, 0 },
3076 { "vmgexit", { Skip_MODRM
}, 0 },
3079 /* PREFIX_0F01_REG_5_MOD_0 */
3082 { "rstorssp", { Mq
}, PREFIX_OPCODE
},
3085 /* PREFIX_0F01_REG_5_MOD_3_RM_0 */
3087 { "serialize", { Skip_MODRM
}, PREFIX_OPCODE
},
3088 { "setssbsy", { Skip_MODRM
}, PREFIX_OPCODE
},
3090 { "xsusldtrk", { Skip_MODRM
}, PREFIX_OPCODE
},
3093 /* PREFIX_0F01_REG_5_MOD_3_RM_1 */
3098 { "xresldtrk", { Skip_MODRM
}, PREFIX_OPCODE
},
3101 /* PREFIX_0F01_REG_5_MOD_3_RM_2 */
3104 { "saveprevssp", { Skip_MODRM
}, PREFIX_OPCODE
},
3107 /* PREFIX_0F01_REG_7_MOD_3_RM_2 */
3109 { "monitorx", { { OP_Monitor
, 0 } }, 0 },
3110 { "mcommit", { Skip_MODRM
}, 0 },
3115 { "wbinvd", { XX
}, 0 },
3116 { "wbnoinvd", { XX
}, 0 },
3121 { "movups", { XM
, EXx
}, PREFIX_OPCODE
},
3122 { "movss", { XM
, EXd
}, PREFIX_OPCODE
},
3123 { "movupd", { XM
, EXx
}, PREFIX_OPCODE
},
3124 { "movsd", { XM
, EXq
}, PREFIX_OPCODE
},
3129 { "movups", { EXxS
, XM
}, PREFIX_OPCODE
},
3130 { "movss", { EXdS
, XM
}, PREFIX_OPCODE
},
3131 { "movupd", { EXxS
, XM
}, PREFIX_OPCODE
},
3132 { "movsd", { EXqS
, XM
}, PREFIX_OPCODE
},
3137 { MOD_TABLE (MOD_0F12_PREFIX_0
) },
3138 { "movsldup", { XM
, EXx
}, PREFIX_OPCODE
},
3139 { MOD_TABLE (MOD_0F12_PREFIX_2
) },
3140 { "movddup", { XM
, EXq
}, PREFIX_OPCODE
},
3145 { MOD_TABLE (MOD_0F16_PREFIX_0
) },
3146 { "movshdup", { XM
, EXx
}, PREFIX_OPCODE
},
3147 { MOD_TABLE (MOD_0F16_PREFIX_2
) },
3152 { MOD_TABLE (MOD_0F1A_PREFIX_0
) },
3153 { "bndcl", { Gbnd
, Ev_bnd
}, 0 },
3154 { "bndmov", { Gbnd
, Ebnd
}, 0 },
3155 { "bndcu", { Gbnd
, Ev_bnd
}, 0 },
3160 { MOD_TABLE (MOD_0F1B_PREFIX_0
) },
3161 { MOD_TABLE (MOD_0F1B_PREFIX_1
) },
3162 { "bndmov", { EbndS
, Gbnd
}, 0 },
3163 { "bndcn", { Gbnd
, Ev_bnd
}, 0 },
3168 { MOD_TABLE (MOD_0F1C_PREFIX_0
) },
3169 { "nopQ", { Ev
}, PREFIX_OPCODE
},
3170 { "nopQ", { Ev
}, PREFIX_OPCODE
},
3171 { "nopQ", { Ev
}, PREFIX_OPCODE
},
3176 { "nopQ", { Ev
}, PREFIX_OPCODE
},
3177 { MOD_TABLE (MOD_0F1E_PREFIX_1
) },
3178 { "nopQ", { Ev
}, PREFIX_OPCODE
},
3179 { "nopQ", { Ev
}, PREFIX_OPCODE
},
3184 { "cvtpi2ps", { XM
, EMCq
}, PREFIX_OPCODE
},
3185 { "cvtsi2ss{%LQ|}", { XM
, Edq
}, PREFIX_OPCODE
},
3186 { "cvtpi2pd", { XM
, EMCq
}, PREFIX_OPCODE
},
3187 { "cvtsi2sd{%LQ|}", { XM
, Edq
}, 0 },
3192 { MOD_TABLE (MOD_0F2B_PREFIX_0
) },
3193 { MOD_TABLE (MOD_0F2B_PREFIX_1
) },
3194 { MOD_TABLE (MOD_0F2B_PREFIX_2
) },
3195 { MOD_TABLE (MOD_0F2B_PREFIX_3
) },
3200 { "cvttps2pi", { MXC
, EXq
}, PREFIX_OPCODE
},
3201 { "cvttss2si", { Gdq
, EXd
}, PREFIX_OPCODE
},
3202 { "cvttpd2pi", { MXC
, EXx
}, PREFIX_OPCODE
},
3203 { "cvttsd2si", { Gdq
, EXq
}, PREFIX_OPCODE
},
3208 { "cvtps2pi", { MXC
, EXq
}, PREFIX_OPCODE
},
3209 { "cvtss2si", { Gdq
, EXd
}, PREFIX_OPCODE
},
3210 { "cvtpd2pi", { MXC
, EXx
}, PREFIX_OPCODE
},
3211 { "cvtsd2si", { Gdq
, EXq
}, PREFIX_OPCODE
},
3216 { "ucomiss",{ XM
, EXd
}, 0 },
3218 { "ucomisd",{ XM
, EXq
}, 0 },
3223 { "comiss", { XM
, EXd
}, 0 },
3225 { "comisd", { XM
, EXq
}, 0 },
3230 { "sqrtps", { XM
, EXx
}, PREFIX_OPCODE
},
3231 { "sqrtss", { XM
, EXd
}, PREFIX_OPCODE
},
3232 { "sqrtpd", { XM
, EXx
}, PREFIX_OPCODE
},
3233 { "sqrtsd", { XM
, EXq
}, PREFIX_OPCODE
},
3238 { "rsqrtps",{ XM
, EXx
}, PREFIX_OPCODE
},
3239 { "rsqrtss",{ XM
, EXd
}, PREFIX_OPCODE
},
3244 { "rcpps", { XM
, EXx
}, PREFIX_OPCODE
},
3245 { "rcpss", { XM
, EXd
}, PREFIX_OPCODE
},
3250 { "addps", { XM
, EXx
}, PREFIX_OPCODE
},
3251 { "addss", { XM
, EXd
}, PREFIX_OPCODE
},
3252 { "addpd", { XM
, EXx
}, PREFIX_OPCODE
},
3253 { "addsd", { XM
, EXq
}, PREFIX_OPCODE
},
3258 { "mulps", { XM
, EXx
}, PREFIX_OPCODE
},
3259 { "mulss", { XM
, EXd
}, PREFIX_OPCODE
},
3260 { "mulpd", { XM
, EXx
}, PREFIX_OPCODE
},
3261 { "mulsd", { XM
, EXq
}, PREFIX_OPCODE
},
3266 { "cvtps2pd", { XM
, EXq
}, PREFIX_OPCODE
},
3267 { "cvtss2sd", { XM
, EXd
}, PREFIX_OPCODE
},
3268 { "cvtpd2ps", { XM
, EXx
}, PREFIX_OPCODE
},
3269 { "cvtsd2ss", { XM
, EXq
}, PREFIX_OPCODE
},
3274 { "cvtdq2ps", { XM
, EXx
}, PREFIX_OPCODE
},
3275 { "cvttps2dq", { XM
, EXx
}, PREFIX_OPCODE
},
3276 { "cvtps2dq", { XM
, EXx
}, PREFIX_OPCODE
},
3281 { "subps", { XM
, EXx
}, PREFIX_OPCODE
},
3282 { "subss", { XM
, EXd
}, PREFIX_OPCODE
},
3283 { "subpd", { XM
, EXx
}, PREFIX_OPCODE
},
3284 { "subsd", { XM
, EXq
}, PREFIX_OPCODE
},
3289 { "minps", { XM
, EXx
}, PREFIX_OPCODE
},
3290 { "minss", { XM
, EXd
}, PREFIX_OPCODE
},
3291 { "minpd", { XM
, EXx
}, PREFIX_OPCODE
},
3292 { "minsd", { XM
, EXq
}, PREFIX_OPCODE
},
3297 { "divps", { XM
, EXx
}, PREFIX_OPCODE
},
3298 { "divss", { XM
, EXd
}, PREFIX_OPCODE
},
3299 { "divpd", { XM
, EXx
}, PREFIX_OPCODE
},
3300 { "divsd", { XM
, EXq
}, PREFIX_OPCODE
},
3305 { "maxps", { XM
, EXx
}, PREFIX_OPCODE
},
3306 { "maxss", { XM
, EXd
}, PREFIX_OPCODE
},
3307 { "maxpd", { XM
, EXx
}, PREFIX_OPCODE
},
3308 { "maxsd", { XM
, EXq
}, PREFIX_OPCODE
},
3313 { "punpcklbw",{ MX
, EMd
}, PREFIX_OPCODE
},
3315 { "punpcklbw",{ MX
, EMx
}, PREFIX_OPCODE
},
3320 { "punpcklwd",{ MX
, EMd
}, PREFIX_OPCODE
},
3322 { "punpcklwd",{ MX
, EMx
}, PREFIX_OPCODE
},
3327 { "punpckldq",{ MX
, EMd
}, PREFIX_OPCODE
},
3329 { "punpckldq",{ MX
, EMx
}, PREFIX_OPCODE
},
3334 { "movq", { MX
, EM
}, PREFIX_OPCODE
},
3335 { "movdqu", { XM
, EXx
}, PREFIX_OPCODE
},
3336 { "movdqa", { XM
, EXx
}, PREFIX_OPCODE
},
3341 { "pshufw", { MX
, EM
, Ib
}, PREFIX_OPCODE
},
3342 { "pshufhw",{ XM
, EXx
, Ib
}, PREFIX_OPCODE
},
3343 { "pshufd", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
3344 { "pshuflw",{ XM
, EXx
, Ib
}, PREFIX_OPCODE
},
3349 {"vmread", { Em
, Gm
}, 0 },
3351 {"extrq", { XS
, Ib
, Ib
}, 0 },
3352 {"insertq", { XM
, XS
, Ib
, Ib
}, 0 },
3357 {"vmwrite", { Gm
, Em
}, 0 },
3359 {"extrq", { XM
, XS
}, 0 },
3360 {"insertq", { XM
, XS
}, 0 },
3367 { "haddpd", { XM
, EXx
}, PREFIX_OPCODE
},
3368 { "haddps", { XM
, EXx
}, PREFIX_OPCODE
},
3375 { "hsubpd", { XM
, EXx
}, PREFIX_OPCODE
},
3376 { "hsubps", { XM
, EXx
}, PREFIX_OPCODE
},
3381 { "movK", { Edq
, MX
}, PREFIX_OPCODE
},
3382 { "movq", { XM
, EXq
}, PREFIX_OPCODE
},
3383 { "movK", { Edq
, XM
}, PREFIX_OPCODE
},
3388 { "movq", { EMS
, MX
}, PREFIX_OPCODE
},
3389 { "movdqu", { EXxS
, XM
}, PREFIX_OPCODE
},
3390 { "movdqa", { EXxS
, XM
}, PREFIX_OPCODE
},
3393 /* PREFIX_0FAE_REG_0_MOD_3 */
3396 { "rdfsbase", { Ev
}, 0 },
3399 /* PREFIX_0FAE_REG_1_MOD_3 */
3402 { "rdgsbase", { Ev
}, 0 },
3405 /* PREFIX_0FAE_REG_2_MOD_3 */
3408 { "wrfsbase", { Ev
}, 0 },
3411 /* PREFIX_0FAE_REG_3_MOD_3 */
3414 { "wrgsbase", { Ev
}, 0 },
3417 /* PREFIX_0FAE_REG_4_MOD_0 */
3419 { "xsave", { FXSAVE
}, 0 },
3420 { "ptwrite{%LQ|}", { Edq
}, 0 },
3423 /* PREFIX_0FAE_REG_4_MOD_3 */
3426 { "ptwrite{%LQ|}", { Edq
}, 0 },
3429 /* PREFIX_0FAE_REG_5_MOD_3 */
3431 { "lfence", { Skip_MODRM
}, 0 },
3432 { "incsspK", { Edq
}, PREFIX_OPCODE
},
3435 /* PREFIX_0FAE_REG_6_MOD_0 */
3437 { "xsaveopt", { FXSAVE
}, PREFIX_OPCODE
},
3438 { "clrssbsy", { Mq
}, PREFIX_OPCODE
},
3439 { "clwb", { Mb
}, PREFIX_OPCODE
},
3442 /* PREFIX_0FAE_REG_6_MOD_3 */
3444 { RM_TABLE (RM_0FAE_REG_6_MOD_3_P_0
) },
3445 { "umonitor", { Eva
}, PREFIX_OPCODE
},
3446 { "tpause", { Edq
}, PREFIX_OPCODE
},
3447 { "umwait", { Edq
}, PREFIX_OPCODE
},
3450 /* PREFIX_0FAE_REG_7_MOD_0 */
3452 { "clflush", { Mb
}, 0 },
3454 { "clflushopt", { Mb
}, 0 },
3460 { "popcntS", { Gv
, Ev
}, 0 },
3465 { "bsfS", { Gv
, Ev
}, 0 },
3466 { "tzcntS", { Gv
, Ev
}, 0 },
3467 { "bsfS", { Gv
, Ev
}, 0 },
3472 { "bsrS", { Gv
, Ev
}, 0 },
3473 { "lzcntS", { Gv
, Ev
}, 0 },
3474 { "bsrS", { Gv
, Ev
}, 0 },
3479 { "cmpps", { XM
, EXx
, CMP
}, PREFIX_OPCODE
},
3480 { "cmpss", { XM
, EXd
, CMP
}, PREFIX_OPCODE
},
3481 { "cmppd", { XM
, EXx
, CMP
}, PREFIX_OPCODE
},
3482 { "cmpsd", { XM
, EXq
, CMP
}, PREFIX_OPCODE
},
3485 /* PREFIX_0FC7_REG_6_MOD_0 */
3487 { "vmptrld",{ Mq
}, 0 },
3488 { "vmxon", { Mq
}, 0 },
3489 { "vmclear",{ Mq
}, 0 },
3492 /* PREFIX_0FC7_REG_6_MOD_3 */
3494 { "rdrand", { Ev
}, 0 },
3496 { "rdrand", { Ev
}, 0 }
3499 /* PREFIX_0FC7_REG_7_MOD_3 */
3501 { "rdseed", { Ev
}, 0 },
3502 { "rdpid", { Em
}, 0 },
3503 { "rdseed", { Ev
}, 0 },
3510 { "addsubpd", { XM
, EXx
}, 0 },
3511 { "addsubps", { XM
, EXx
}, 0 },
3517 { "movq2dq",{ XM
, MS
}, 0 },
3518 { "movq", { EXqS
, XM
}, 0 },
3519 { "movdq2q",{ MX
, XS
}, 0 },
3525 { "cvtdq2pd", { XM
, EXq
}, PREFIX_OPCODE
},
3526 { "cvttpd2dq", { XM
, EXx
}, PREFIX_OPCODE
},
3527 { "cvtpd2dq", { XM
, EXx
}, PREFIX_OPCODE
},
3532 { "movntq", { Mq
, MX
}, PREFIX_OPCODE
},
3534 { MOD_TABLE (MOD_0FE7_PREFIX_2
) },
3542 { MOD_TABLE (MOD_0FF0_PREFIX_3
) },
3547 { "maskmovq", { MX
, MS
}, PREFIX_OPCODE
},
3549 { "maskmovdqu", { XM
, XS
}, PREFIX_OPCODE
},
3554 { "movbeS", { Gv
, Mv
}, PREFIX_OPCODE
},
3556 { "movbeS", { Gv
, Mv
}, PREFIX_OPCODE
},
3557 { "crc32A", { Gdq
, Eb
}, PREFIX_OPCODE
},
3562 { "movbeS", { Mv
, Gv
}, PREFIX_OPCODE
},
3564 { "movbeS", { Mv
, Gv
}, PREFIX_OPCODE
},
3565 { "crc32Q", { Gdq
, Ev
}, PREFIX_OPCODE
},
3570 { MOD_TABLE (MOD_0F38F6_PREFIX_0
) },
3571 { "adoxS", { Gdq
, Edq
}, PREFIX_OPCODE
},
3572 { "adcxS", { Gdq
, Edq
}, PREFIX_OPCODE
},
3579 { MOD_TABLE (MOD_0F38F8_PREFIX_1
) },
3580 { MOD_TABLE (MOD_0F38F8_PREFIX_2
) },
3581 { MOD_TABLE (MOD_0F38F8_PREFIX_3
) },
3584 /* PREFIX_VEX_0F10 */
3586 { "vmovups", { XM
, EXx
}, 0 },
3587 { "vmovss", { XMScalar
, VexScalarR
, EXxmm_md
}, 0 },
3588 { "vmovupd", { XM
, EXx
}, 0 },
3589 { "vmovsd", { XMScalar
, VexScalarR
, EXxmm_mq
}, 0 },
3592 /* PREFIX_VEX_0F11 */
3594 { "vmovups", { EXxS
, XM
}, 0 },
3595 { "vmovss", { EXdS
, VexScalarR
, XMScalar
}, 0 },
3596 { "vmovupd", { EXxS
, XM
}, 0 },
3597 { "vmovsd", { EXqS
, VexScalarR
, XMScalar
}, 0 },
3600 /* PREFIX_VEX_0F12 */
3602 { MOD_TABLE (MOD_VEX_0F12_PREFIX_0
) },
3603 { "vmovsldup", { XM
, EXx
}, 0 },
3604 { MOD_TABLE (MOD_VEX_0F12_PREFIX_2
) },
3605 { "vmovddup", { XM
, EXymmq
}, 0 },
3608 /* PREFIX_VEX_0F16 */
3610 { MOD_TABLE (MOD_VEX_0F16_PREFIX_0
) },
3611 { "vmovshdup", { XM
, EXx
}, 0 },
3612 { MOD_TABLE (MOD_VEX_0F16_PREFIX_2
) },
3615 /* PREFIX_VEX_0F2A */
3618 { "vcvtsi2ss{%LQ|}", { XMScalar
, VexScalar
, Edq
}, 0 },
3620 { "vcvtsi2sd{%LQ|}", { XMScalar
, VexScalar
, Edq
}, 0 },
3623 /* PREFIX_VEX_0F2C */
3626 { "vcvttss2si", { Gdq
, EXxmm_md
, EXxEVexS
}, 0 },
3628 { "vcvttsd2si", { Gdq
, EXxmm_mq
, EXxEVexS
}, 0 },
3631 /* PREFIX_VEX_0F2D */
3634 { "vcvtss2si", { Gdq
, EXxmm_md
, EXxEVexR
}, 0 },
3636 { "vcvtsd2si", { Gdq
, EXxmm_mq
, EXxEVexR
}, 0 },
3639 /* PREFIX_VEX_0F2E */
3641 { "vucomisX", { XMScalar
, EXxmm_md
, EXxEVexS
}, PREFIX_OPCODE
},
3643 { "vucomisX", { XMScalar
, EXxmm_mq
, EXxEVexS
}, PREFIX_OPCODE
},
3646 /* PREFIX_VEX_0F2F */
3648 { "vcomisX", { XMScalar
, EXxmm_md
, EXxEVexS
}, PREFIX_OPCODE
},
3650 { "vcomisX", { XMScalar
, EXxmm_mq
, EXxEVexS
}, PREFIX_OPCODE
},
3653 /* PREFIX_VEX_0F41 */
3655 { VEX_LEN_TABLE (VEX_LEN_0F41_P_0
) },
3657 { VEX_LEN_TABLE (VEX_LEN_0F41_P_2
) },
3660 /* PREFIX_VEX_0F42 */
3662 { VEX_LEN_TABLE (VEX_LEN_0F42_P_0
) },
3664 { VEX_LEN_TABLE (VEX_LEN_0F42_P_2
) },
3667 /* PREFIX_VEX_0F44 */
3669 { VEX_LEN_TABLE (VEX_LEN_0F44_P_0
) },
3671 { VEX_LEN_TABLE (VEX_LEN_0F44_P_2
) },
3674 /* PREFIX_VEX_0F45 */
3676 { VEX_LEN_TABLE (VEX_LEN_0F45_P_0
) },
3678 { VEX_LEN_TABLE (VEX_LEN_0F45_P_2
) },
3681 /* PREFIX_VEX_0F46 */
3683 { VEX_LEN_TABLE (VEX_LEN_0F46_P_0
) },
3685 { VEX_LEN_TABLE (VEX_LEN_0F46_P_2
) },
3688 /* PREFIX_VEX_0F47 */
3690 { VEX_LEN_TABLE (VEX_LEN_0F47_P_0
) },
3692 { VEX_LEN_TABLE (VEX_LEN_0F47_P_2
) },
3695 /* PREFIX_VEX_0F4A */
3697 { VEX_LEN_TABLE (VEX_LEN_0F4A_P_0
) },
3699 { VEX_LEN_TABLE (VEX_LEN_0F4A_P_2
) },
3702 /* PREFIX_VEX_0F4B */
3704 { VEX_LEN_TABLE (VEX_LEN_0F4B_P_0
) },
3706 { VEX_LEN_TABLE (VEX_LEN_0F4B_P_2
) },
3709 /* PREFIX_VEX_0F51 */
3711 { "vsqrtps", { XM
, EXx
}, 0 },
3712 { "vsqrtss", { XMScalar
, VexScalar
, EXxmm_md
}, 0 },
3713 { "vsqrtpd", { XM
, EXx
}, 0 },
3714 { "vsqrtsd", { XMScalar
, VexScalar
, EXxmm_mq
}, 0 },
3717 /* PREFIX_VEX_0F52 */
3719 { "vrsqrtps", { XM
, EXx
}, 0 },
3720 { "vrsqrtss", { XMScalar
, VexScalar
, EXxmm_md
}, 0 },
3723 /* PREFIX_VEX_0F53 */
3725 { "vrcpps", { XM
, EXx
}, 0 },
3726 { "vrcpss", { XMScalar
, VexScalar
, EXxmm_md
}, 0 },
3729 /* PREFIX_VEX_0F58 */
3731 { "vaddps", { XM
, Vex
, EXx
}, 0 },
3732 { "vaddss", { XMScalar
, VexScalar
, EXxmm_md
}, 0 },
3733 { "vaddpd", { XM
, Vex
, EXx
}, 0 },
3734 { "vaddsd", { XMScalar
, VexScalar
, EXxmm_mq
}, 0 },
3737 /* PREFIX_VEX_0F59 */
3739 { "vmulps", { XM
, Vex
, EXx
}, 0 },
3740 { "vmulss", { XMScalar
, VexScalar
, EXxmm_md
}, 0 },
3741 { "vmulpd", { XM
, Vex
, EXx
}, 0 },
3742 { "vmulsd", { XMScalar
, VexScalar
, EXxmm_mq
}, 0 },
3745 /* PREFIX_VEX_0F5A */
3747 { "vcvtps2pd", { XM
, EXxmmq
}, 0 },
3748 { "vcvtss2sd", { XMScalar
, VexScalar
, EXxmm_md
}, 0 },
3749 { "vcvtpd2ps%XY",{ XMM
, EXx
}, 0 },
3750 { "vcvtsd2ss", { XMScalar
, VexScalar
, EXxmm_mq
}, 0 },
3753 /* PREFIX_VEX_0F5B */
3755 { "vcvtdq2ps", { XM
, EXx
}, 0 },
3756 { "vcvttps2dq", { XM
, EXx
}, 0 },
3757 { "vcvtps2dq", { XM
, EXx
}, 0 },
3760 /* PREFIX_VEX_0F5C */
3762 { "vsubps", { XM
, Vex
, EXx
}, 0 },
3763 { "vsubss", { XMScalar
, VexScalar
, EXxmm_md
}, 0 },
3764 { "vsubpd", { XM
, Vex
, EXx
}, 0 },
3765 { "vsubsd", { XMScalar
, VexScalar
, EXxmm_mq
}, 0 },
3768 /* PREFIX_VEX_0F5D */
3770 { "vminps", { XM
, Vex
, EXx
}, 0 },
3771 { "vminss", { XMScalar
, VexScalar
, EXxmm_md
}, 0 },
3772 { "vminpd", { XM
, Vex
, EXx
}, 0 },
3773 { "vminsd", { XMScalar
, VexScalar
, EXxmm_mq
}, 0 },
3776 /* PREFIX_VEX_0F5E */
3778 { "vdivps", { XM
, Vex
, EXx
}, 0 },
3779 { "vdivss", { XMScalar
, VexScalar
, EXxmm_md
}, 0 },
3780 { "vdivpd", { XM
, Vex
, EXx
}, 0 },
3781 { "vdivsd", { XMScalar
, VexScalar
, EXxmm_mq
}, 0 },
3784 /* PREFIX_VEX_0F5F */
3786 { "vmaxps", { XM
, Vex
, EXx
}, 0 },
3787 { "vmaxss", { XMScalar
, VexScalar
, EXxmm_md
}, 0 },
3788 { "vmaxpd", { XM
, Vex
, EXx
}, 0 },
3789 { "vmaxsd", { XMScalar
, VexScalar
, EXxmm_mq
}, 0 },
3792 /* PREFIX_VEX_0F6F */
3795 { "vmovdqu", { XM
, EXx
}, 0 },
3796 { "vmovdqa", { XM
, EXx
}, 0 },
3799 /* PREFIX_VEX_0F70 */
3802 { "vpshufhw", { XM
, EXx
, Ib
}, 0 },
3803 { "vpshufd", { XM
, EXx
, Ib
}, 0 },
3804 { "vpshuflw", { XM
, EXx
, Ib
}, 0 },
3807 /* PREFIX_VEX_0F7C */
3811 { "vhaddpd", { XM
, Vex
, EXx
}, 0 },
3812 { "vhaddps", { XM
, Vex
, EXx
}, 0 },
3815 /* PREFIX_VEX_0F7D */
3819 { "vhsubpd", { XM
, Vex
, EXx
}, 0 },
3820 { "vhsubps", { XM
, Vex
, EXx
}, 0 },
3823 /* PREFIX_VEX_0F7E */
3826 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_1
) },
3827 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_2
) },
3830 /* PREFIX_VEX_0F7F */
3833 { "vmovdqu", { EXxS
, XM
}, 0 },
3834 { "vmovdqa", { EXxS
, XM
}, 0 },
3837 /* PREFIX_VEX_0F90 */
3839 { VEX_LEN_TABLE (VEX_LEN_0F90_P_0
) },
3841 { VEX_LEN_TABLE (VEX_LEN_0F90_P_2
) },
3844 /* PREFIX_VEX_0F91 */
3846 { VEX_LEN_TABLE (VEX_LEN_0F91_P_0
) },
3848 { VEX_LEN_TABLE (VEX_LEN_0F91_P_2
) },
3851 /* PREFIX_VEX_0F92 */
3853 { VEX_LEN_TABLE (VEX_LEN_0F92_P_0
) },
3855 { VEX_LEN_TABLE (VEX_LEN_0F92_P_2
) },
3856 { VEX_LEN_TABLE (VEX_LEN_0F92_P_3
) },
3859 /* PREFIX_VEX_0F93 */
3861 { VEX_LEN_TABLE (VEX_LEN_0F93_P_0
) },
3863 { VEX_LEN_TABLE (VEX_LEN_0F93_P_2
) },
3864 { VEX_LEN_TABLE (VEX_LEN_0F93_P_3
) },
3867 /* PREFIX_VEX_0F98 */
3869 { VEX_LEN_TABLE (VEX_LEN_0F98_P_0
) },
3871 { VEX_LEN_TABLE (VEX_LEN_0F98_P_2
) },
3874 /* PREFIX_VEX_0F99 */
3876 { VEX_LEN_TABLE (VEX_LEN_0F99_P_0
) },
3878 { VEX_LEN_TABLE (VEX_LEN_0F99_P_2
) },
3881 /* PREFIX_VEX_0FC2 */
3883 { "vcmpps", { XM
, Vex
, EXx
, CMP
}, 0 },
3884 { "vcmpss", { XMScalar
, VexScalar
, EXxmm_md
, CMP
}, 0 },
3885 { "vcmppd", { XM
, Vex
, EXx
, CMP
}, 0 },
3886 { "vcmpsd", { XMScalar
, VexScalar
, EXxmm_mq
, CMP
}, 0 },
3889 /* PREFIX_VEX_0FD0 */
3893 { "vaddsubpd", { XM
, Vex
, EXx
}, 0 },
3894 { "vaddsubps", { XM
, Vex
, EXx
}, 0 },
3897 /* PREFIX_VEX_0FE6 */
3900 { "vcvtdq2pd", { XM
, EXxmmq
}, 0 },
3901 { "vcvttpd2dq%XY", { XMM
, EXx
}, 0 },
3902 { "vcvtpd2dq%XY", { XMM
, EXx
}, 0 },
3905 /* PREFIX_VEX_0FF0 */
3910 { MOD_TABLE (MOD_VEX_0FF0_PREFIX_3
) },
3913 /* PREFIX_VEX_0F3849_X86_64 */
3915 { VEX_W_TABLE (VEX_W_0F3849_X86_64_P_0
) },
3917 { VEX_W_TABLE (VEX_W_0F3849_X86_64_P_2
) },
3918 { VEX_W_TABLE (VEX_W_0F3849_X86_64_P_3
) },
3921 /* PREFIX_VEX_0F384B_X86_64 */
3924 { VEX_W_TABLE (VEX_W_0F384B_X86_64_P_1
) },
3925 { VEX_W_TABLE (VEX_W_0F384B_X86_64_P_2
) },
3926 { VEX_W_TABLE (VEX_W_0F384B_X86_64_P_3
) },
3929 /* PREFIX_VEX_0F385C_X86_64 */
3932 { VEX_W_TABLE (VEX_W_0F385C_X86_64_P_1
) },
3936 /* PREFIX_VEX_0F385E_X86_64 */
3938 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_0
) },
3939 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_1
) },
3940 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_2
) },
3941 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_3
) },
3944 /* PREFIX_VEX_0F38F5 */
3946 { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_0
) },
3947 { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_1
) },
3949 { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_3
) },
3952 /* PREFIX_VEX_0F38F6 */
3957 { VEX_LEN_TABLE (VEX_LEN_0F38F6_P_3
) },
3960 /* PREFIX_VEX_0F38F7 */
3962 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_0
) },
3963 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_1
) },
3964 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_2
) },
3965 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_3
) },
3968 /* PREFIX_VEX_0F3AF0 */
3973 { VEX_LEN_TABLE (VEX_LEN_0F3AF0_P_3
) },
3976 #include "i386-dis-evex-prefix.h"
3979 static const struct dis386 x86_64_table
[][2] = {
3982 { "pushP", { es
}, 0 },
3987 { "popP", { es
}, 0 },
3992 { "pushP", { cs
}, 0 },
3997 { "pushP", { ss
}, 0 },
4002 { "popP", { ss
}, 0 },
4007 { "pushP", { ds
}, 0 },
4012 { "popP", { ds
}, 0 },
4017 { "daa", { XX
}, 0 },
4022 { "das", { XX
}, 0 },
4027 { "aaa", { XX
}, 0 },
4032 { "aas", { XX
}, 0 },
4037 { "pushaP", { XX
}, 0 },
4042 { "popaP", { XX
}, 0 },
4047 { MOD_TABLE (MOD_62_32BIT
) },
4048 { EVEX_TABLE (EVEX_0F
) },
4053 { "arpl", { Ew
, Gw
}, 0 },
4054 { "movs", { { OP_G
, movsxd_mode
}, { MOVSXD_Fixup
, movsxd_mode
} }, 0 },
4059 { "ins{R|}", { Yzr
, indirDX
}, 0 },
4060 { "ins{G|}", { Yzr
, indirDX
}, 0 },
4065 { "outs{R|}", { indirDXr
, Xz
}, 0 },
4066 { "outs{G|}", { indirDXr
, Xz
}, 0 },
4071 /* Opcode 0x82 is an alias of opcode 0x80 in 32-bit mode. */
4072 { REG_TABLE (REG_80
) },
4077 { "{l|}call{T|}", { Ap
}, 0 },
4082 { "retP", { Iw
, BND
}, 0 },
4083 { "ret@", { Iw
, BND
}, 0 },
4088 { "retP", { BND
}, 0 },
4089 { "ret@", { BND
}, 0 },
4094 { MOD_TABLE (MOD_C4_32BIT
) },
4095 { VEX_C4_TABLE (VEX_0F
) },
4100 { MOD_TABLE (MOD_C5_32BIT
) },
4101 { VEX_C5_TABLE (VEX_0F
) },
4106 { "into", { XX
}, 0 },
4111 { "aam", { Ib
}, 0 },
4116 { "aad", { Ib
}, 0 },
4121 { "callP", { Jv
, BND
}, 0 },
4122 { "call@", { Jv
, BND
}, 0 }
4127 { "jmpP", { Jv
, BND
}, 0 },
4128 { "jmp@", { Jv
, BND
}, 0 }
4133 { "{l|}jmp{T|}", { Ap
}, 0 },
4136 /* X86_64_0F01_REG_0 */
4138 { "sgdt{Q|Q}", { M
}, 0 },
4139 { "sgdt", { M
}, 0 },
4142 /* X86_64_0F01_REG_1 */
4144 { "sidt{Q|Q}", { M
}, 0 },
4145 { "sidt", { M
}, 0 },
4148 /* X86_64_0F01_REG_2 */
4150 { "lgdt{Q|Q}", { M
}, 0 },
4151 { "lgdt", { M
}, 0 },
4154 /* X86_64_0F01_REG_3 */
4156 { "lidt{Q|Q}", { M
}, 0 },
4157 { "lidt", { M
}, 0 },
4160 /* X86_64_VEX_0F3849 */
4163 { PREFIX_TABLE (PREFIX_VEX_0F3849_X86_64
) },
4166 /* X86_64_VEX_0F384B */
4169 { PREFIX_TABLE (PREFIX_VEX_0F384B_X86_64
) },
4172 /* X86_64_VEX_0F385C */
4175 { PREFIX_TABLE (PREFIX_VEX_0F385C_X86_64
) },
4178 /* X86_64_VEX_0F385E */
4181 { PREFIX_TABLE (PREFIX_VEX_0F385E_X86_64
) },
4185 static const struct dis386 three_byte_table
[][256] = {
4187 /* THREE_BYTE_0F38 */
4190 { "pshufb", { MX
, EM
}, PREFIX_OPCODE
},
4191 { "phaddw", { MX
, EM
}, PREFIX_OPCODE
},
4192 { "phaddd", { MX
, EM
}, PREFIX_OPCODE
},
4193 { "phaddsw", { MX
, EM
}, PREFIX_OPCODE
},
4194 { "pmaddubsw", { MX
, EM
}, PREFIX_OPCODE
},
4195 { "phsubw", { MX
, EM
}, PREFIX_OPCODE
},
4196 { "phsubd", { MX
, EM
}, PREFIX_OPCODE
},
4197 { "phsubsw", { MX
, EM
}, PREFIX_OPCODE
},
4199 { "psignb", { MX
, EM
}, PREFIX_OPCODE
},
4200 { "psignw", { MX
, EM
}, PREFIX_OPCODE
},
4201 { "psignd", { MX
, EM
}, PREFIX_OPCODE
},
4202 { "pmulhrsw", { MX
, EM
}, PREFIX_OPCODE
},
4208 { "pblendvb", { XM
, EXx
, XMM0
}, PREFIX_DATA
},
4212 { "blendvps", { XM
, EXx
, XMM0
}, PREFIX_DATA
},
4213 { "blendvpd", { XM
, EXx
, XMM0
}, PREFIX_DATA
},
4215 { "ptest", { XM
, EXx
}, PREFIX_DATA
},
4221 { "pabsb", { MX
, EM
}, PREFIX_OPCODE
},
4222 { "pabsw", { MX
, EM
}, PREFIX_OPCODE
},
4223 { "pabsd", { MX
, EM
}, PREFIX_OPCODE
},
4226 { "pmovsxbw", { XM
, EXq
}, PREFIX_DATA
},
4227 { "pmovsxbd", { XM
, EXd
}, PREFIX_DATA
},
4228 { "pmovsxbq", { XM
, EXw
}, PREFIX_DATA
},
4229 { "pmovsxwd", { XM
, EXq
}, PREFIX_DATA
},
4230 { "pmovsxwq", { XM
, EXd
}, PREFIX_DATA
},
4231 { "pmovsxdq", { XM
, EXq
}, PREFIX_DATA
},
4235 { "pmuldq", { XM
, EXx
}, PREFIX_DATA
},
4236 { "pcmpeqq", { XM
, EXx
}, PREFIX_DATA
},
4237 { MOD_TABLE (MOD_0F382A
) },
4238 { "packusdw", { XM
, EXx
}, PREFIX_DATA
},
4244 { "pmovzxbw", { XM
, EXq
}, PREFIX_DATA
},
4245 { "pmovzxbd", { XM
, EXd
}, PREFIX_DATA
},
4246 { "pmovzxbq", { XM
, EXw
}, PREFIX_DATA
},
4247 { "pmovzxwd", { XM
, EXq
}, PREFIX_DATA
},
4248 { "pmovzxwq", { XM
, EXd
}, PREFIX_DATA
},
4249 { "pmovzxdq", { XM
, EXq
}, PREFIX_DATA
},
4251 { "pcmpgtq", { XM
, EXx
}, PREFIX_DATA
},
4253 { "pminsb", { XM
, EXx
}, PREFIX_DATA
},
4254 { "pminsd", { XM
, EXx
}, PREFIX_DATA
},
4255 { "pminuw", { XM
, EXx
}, PREFIX_DATA
},
4256 { "pminud", { XM
, EXx
}, PREFIX_DATA
},
4257 { "pmaxsb", { XM
, EXx
}, PREFIX_DATA
},
4258 { "pmaxsd", { XM
, EXx
}, PREFIX_DATA
},
4259 { "pmaxuw", { XM
, EXx
}, PREFIX_DATA
},
4260 { "pmaxud", { XM
, EXx
}, PREFIX_DATA
},
4262 { "pmulld", { XM
, EXx
}, PREFIX_DATA
},
4263 { "phminposuw", { XM
, EXx
}, PREFIX_DATA
},
4334 { "invept", { Gm
, Mo
}, PREFIX_DATA
},
4335 { "invvpid", { Gm
, Mo
}, PREFIX_DATA
},
4336 { "invpcid", { Gm
, M
}, PREFIX_DATA
},
4415 { "sha1nexte", { XM
, EXxmm
}, PREFIX_OPCODE
},
4416 { "sha1msg1", { XM
, EXxmm
}, PREFIX_OPCODE
},
4417 { "sha1msg2", { XM
, EXxmm
}, PREFIX_OPCODE
},
4418 { "sha256rnds2", { XM
, EXxmm
, XMM0
}, PREFIX_OPCODE
},
4419 { "sha256msg1", { XM
, EXxmm
}, PREFIX_OPCODE
},
4420 { "sha256msg2", { XM
, EXxmm
}, PREFIX_OPCODE
},
4422 { "gf2p8mulb", { XM
, EXxmm
}, PREFIX_DATA
},
4436 { "aesimc", { XM
, EXx
}, PREFIX_DATA
},
4437 { "aesenc", { XM
, EXx
}, PREFIX_DATA
},
4438 { "aesenclast", { XM
, EXx
}, PREFIX_DATA
},
4439 { "aesdec", { XM
, EXx
}, PREFIX_DATA
},
4440 { "aesdeclast", { XM
, EXx
}, PREFIX_DATA
},
4460 { PREFIX_TABLE (PREFIX_0F38F0
) },
4461 { PREFIX_TABLE (PREFIX_0F38F1
) },
4465 { MOD_TABLE (MOD_0F38F5
) },
4466 { PREFIX_TABLE (PREFIX_0F38F6
) },
4469 { PREFIX_TABLE (PREFIX_0F38F8
) },
4470 { MOD_TABLE (MOD_0F38F9
) },
4478 /* THREE_BYTE_0F3A */
4490 { "roundps", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4491 { "roundpd", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4492 { "roundss", { XM
, EXd
, Ib
}, PREFIX_DATA
},
4493 { "roundsd", { XM
, EXq
, Ib
}, PREFIX_DATA
},
4494 { "blendps", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4495 { "blendpd", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4496 { "pblendw", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4497 { "palignr", { MX
, EM
, Ib
}, PREFIX_OPCODE
},
4503 { "pextrb", { Edqb
, XM
, Ib
}, PREFIX_DATA
},
4504 { "pextrw", { Edqw
, XM
, Ib
}, PREFIX_DATA
},
4505 { "pextrK", { Edq
, XM
, Ib
}, PREFIX_DATA
},
4506 { "extractps", { Edqd
, XM
, Ib
}, PREFIX_DATA
},
4517 { "pinsrb", { XM
, Edqb
, Ib
}, PREFIX_DATA
},
4518 { "insertps", { XM
, EXd
, Ib
}, PREFIX_DATA
},
4519 { "pinsrK", { XM
, Edq
, Ib
}, PREFIX_DATA
},
4553 { "dpps", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4554 { "dppd", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4555 { "mpsadbw", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4557 { "pclmulqdq", { XM
, EXx
, PCLMUL
}, PREFIX_DATA
},
4589 { "pcmpestrm!%LQ", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4590 { "pcmpestri!%LQ", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4591 { "pcmpistrm", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4592 { "pcmpistri", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4710 { "sha1rnds4", { XM
, EXxmm
, Ib
}, PREFIX_OPCODE
},
4712 { "gf2p8affineqb", { XM
, EXxmm
, Ib
}, PREFIX_DATA
},
4713 { "gf2p8affineinvqb", { XM
, EXxmm
, Ib
}, PREFIX_DATA
},
4731 { "aeskeygenassist", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4771 static const struct dis386 xop_table
[][256] = {
4924 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_85
) },
4925 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_86
) },
4926 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_87
) },
4934 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_8E
) },
4935 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_8F
) },
4942 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_95
) },
4943 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_96
) },
4944 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_97
) },
4952 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_9E
) },
4953 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_9F
) },
4957 { "vpcmov", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
4958 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_A3
) },
4961 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_A6
) },
4979 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_B6
) },
4991 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C0
) },
4992 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C1
) },
4993 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C2
) },
4994 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C3
) },
5004 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CC
) },
5005 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CD
) },
5006 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CE
) },
5007 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CF
) },
5040 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EC
) },
5041 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_ED
) },
5042 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EE
) },
5043 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EF
) },
5067 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_01
) },
5068 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_02
) },
5086 { MOD_TABLE (MOD_VEX_0FXOP_09_12
) },
5210 { VEX_W_TABLE (VEX_W_0FXOP_09_80
) },
5211 { VEX_W_TABLE (VEX_W_0FXOP_09_81
) },
5212 { VEX_W_TABLE (VEX_W_0FXOP_09_82
) },
5213 { VEX_W_TABLE (VEX_W_0FXOP_09_83
) },
5228 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_90
) },
5229 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_91
) },
5230 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_92
) },
5231 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_93
) },
5232 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_94
) },
5233 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_95
) },
5234 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_96
) },
5235 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_97
) },
5237 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_98
) },
5238 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_99
) },
5239 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_9A
) },
5240 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_9B
) },
5283 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C1
) },
5284 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C2
) },
5285 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C3
) },
5288 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C6
) },
5289 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C7
) },
5294 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_CB
) },
5301 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D1
) },
5302 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D2
) },
5303 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D3
) },
5306 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D6
) },
5307 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D7
) },
5312 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_DB
) },
5319 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_E1
) },
5320 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_E2
) },
5321 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_E3
) },
5375 { "bextrS", { Gdq
, Edq
, Id
}, 0 },
5377 { VEX_LEN_TABLE (VEX_LEN_0FXOP_0A_12
) },
5647 static const struct dis386 vex_table
[][256] = {
5669 { PREFIX_TABLE (PREFIX_VEX_0F10
) },
5670 { PREFIX_TABLE (PREFIX_VEX_0F11
) },
5671 { PREFIX_TABLE (PREFIX_VEX_0F12
) },
5672 { MOD_TABLE (MOD_VEX_0F13
) },
5673 { "vunpcklpX", { XM
, Vex
, EXx
}, PREFIX_OPCODE
},
5674 { "vunpckhpX", { XM
, Vex
, EXx
}, PREFIX_OPCODE
},
5675 { PREFIX_TABLE (PREFIX_VEX_0F16
) },
5676 { MOD_TABLE (MOD_VEX_0F17
) },
5696 { "vmovapX", { XM
, EXx
}, PREFIX_OPCODE
},
5697 { "vmovapX", { EXxS
, XM
}, PREFIX_OPCODE
},
5698 { PREFIX_TABLE (PREFIX_VEX_0F2A
) },
5699 { MOD_TABLE (MOD_VEX_0F2B
) },
5700 { PREFIX_TABLE (PREFIX_VEX_0F2C
) },
5701 { PREFIX_TABLE (PREFIX_VEX_0F2D
) },
5702 { PREFIX_TABLE (PREFIX_VEX_0F2E
) },
5703 { PREFIX_TABLE (PREFIX_VEX_0F2F
) },
5724 { PREFIX_TABLE (PREFIX_VEX_0F41
) },
5725 { PREFIX_TABLE (PREFIX_VEX_0F42
) },
5727 { PREFIX_TABLE (PREFIX_VEX_0F44
) },
5728 { PREFIX_TABLE (PREFIX_VEX_0F45
) },
5729 { PREFIX_TABLE (PREFIX_VEX_0F46
) },
5730 { PREFIX_TABLE (PREFIX_VEX_0F47
) },
5734 { PREFIX_TABLE (PREFIX_VEX_0F4A
) },
5735 { PREFIX_TABLE (PREFIX_VEX_0F4B
) },
5741 { MOD_TABLE (MOD_VEX_0F50
) },
5742 { PREFIX_TABLE (PREFIX_VEX_0F51
) },
5743 { PREFIX_TABLE (PREFIX_VEX_0F52
) },
5744 { PREFIX_TABLE (PREFIX_VEX_0F53
) },
5745 { "vandpX", { XM
, Vex
, EXx
}, PREFIX_OPCODE
},
5746 { "vandnpX", { XM
, Vex
, EXx
}, PREFIX_OPCODE
},
5747 { "vorpX", { XM
, Vex
, EXx
}, PREFIX_OPCODE
},
5748 { "vxorpX", { XM
, Vex
, EXx
}, PREFIX_OPCODE
},
5750 { PREFIX_TABLE (PREFIX_VEX_0F58
) },
5751 { PREFIX_TABLE (PREFIX_VEX_0F59
) },
5752 { PREFIX_TABLE (PREFIX_VEX_0F5A
) },
5753 { PREFIX_TABLE (PREFIX_VEX_0F5B
) },
5754 { PREFIX_TABLE (PREFIX_VEX_0F5C
) },
5755 { PREFIX_TABLE (PREFIX_VEX_0F5D
) },
5756 { PREFIX_TABLE (PREFIX_VEX_0F5E
) },
5757 { PREFIX_TABLE (PREFIX_VEX_0F5F
) },
5759 { "vpunpcklbw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5760 { "vpunpcklwd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5761 { "vpunpckldq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5762 { "vpacksswb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5763 { "vpcmpgtb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5764 { "vpcmpgtw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5765 { "vpcmpgtd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5766 { "vpackuswb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5768 { "vpunpckhbw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5769 { "vpunpckhwd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5770 { "vpunpckhdq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5771 { "vpackssdw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5772 { "vpunpcklqdq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5773 { "vpunpckhqdq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5774 { VEX_LEN_TABLE (VEX_LEN_0F6E
) },
5775 { PREFIX_TABLE (PREFIX_VEX_0F6F
) },
5777 { PREFIX_TABLE (PREFIX_VEX_0F70
) },
5778 { REG_TABLE (REG_VEX_0F71
) },
5779 { REG_TABLE (REG_VEX_0F72
) },
5780 { REG_TABLE (REG_VEX_0F73
) },
5781 { "vpcmpeqb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5782 { "vpcmpeqw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5783 { "vpcmpeqd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5784 { VEX_LEN_TABLE (VEX_LEN_0F77
) },
5790 { PREFIX_TABLE (PREFIX_VEX_0F7C
) },
5791 { PREFIX_TABLE (PREFIX_VEX_0F7D
) },
5792 { PREFIX_TABLE (PREFIX_VEX_0F7E
) },
5793 { PREFIX_TABLE (PREFIX_VEX_0F7F
) },
5813 { PREFIX_TABLE (PREFIX_VEX_0F90
) },
5814 { PREFIX_TABLE (PREFIX_VEX_0F91
) },
5815 { PREFIX_TABLE (PREFIX_VEX_0F92
) },
5816 { PREFIX_TABLE (PREFIX_VEX_0F93
) },
5822 { PREFIX_TABLE (PREFIX_VEX_0F98
) },
5823 { PREFIX_TABLE (PREFIX_VEX_0F99
) },
5846 { REG_TABLE (REG_VEX_0FAE
) },
5869 { PREFIX_TABLE (PREFIX_VEX_0FC2
) },
5871 { VEX_LEN_TABLE (VEX_LEN_0FC4
) },
5872 { VEX_LEN_TABLE (VEX_LEN_0FC5
) },
5873 { "vshufpX", { XM
, Vex
, EXx
, Ib
}, PREFIX_OPCODE
},
5885 { PREFIX_TABLE (PREFIX_VEX_0FD0
) },
5886 { "vpsrlw", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
5887 { "vpsrld", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
5888 { "vpsrlq", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
5889 { "vpaddq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5890 { "vpmullw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5891 { VEX_LEN_TABLE (VEX_LEN_0FD6
) },
5892 { MOD_TABLE (MOD_VEX_0FD7
) },
5894 { "vpsubusb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5895 { "vpsubusw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5896 { "vpminub", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5897 { "vpand", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5898 { "vpaddusb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5899 { "vpaddusw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5900 { "vpmaxub", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5901 { "vpandn", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5903 { "vpavgb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5904 { "vpsraw", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
5905 { "vpsrad", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
5906 { "vpavgw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5907 { "vpmulhuw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5908 { "vpmulhw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5909 { PREFIX_TABLE (PREFIX_VEX_0FE6
) },
5910 { MOD_TABLE (MOD_VEX_0FE7
) },
5912 { "vpsubsb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5913 { "vpsubsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5914 { "vpminsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5915 { "vpor", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5916 { "vpaddsb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5917 { "vpaddsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5918 { "vpmaxsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5919 { "vpxor", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5921 { PREFIX_TABLE (PREFIX_VEX_0FF0
) },
5922 { "vpsllw", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
5923 { "vpslld", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
5924 { "vpsllq", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
5925 { "vpmuludq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5926 { "vpmaddwd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5927 { "vpsadbw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5928 { VEX_LEN_TABLE (VEX_LEN_0FF7
) },
5930 { "vpsubb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5931 { "vpsubw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5932 { "vpsubd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5933 { "vpsubq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5934 { "vpaddb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5935 { "vpaddw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5936 { "vpaddd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5942 { "vpshufb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5943 { "vphaddw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5944 { "vphaddd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5945 { "vphaddsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5946 { "vpmaddubsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5947 { "vphsubw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5948 { "vphsubd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5949 { "vphsubsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5951 { "vpsignb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5952 { "vpsignw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5953 { "vpsignd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5954 { "vpmulhrsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5955 { VEX_W_TABLE (VEX_W_0F380C
) },
5956 { VEX_W_TABLE (VEX_W_0F380D
) },
5957 { VEX_W_TABLE (VEX_W_0F380E
) },
5958 { VEX_W_TABLE (VEX_W_0F380F
) },
5963 { VEX_W_TABLE (VEX_W_0F3813
) },
5966 { VEX_LEN_TABLE (VEX_LEN_0F3816
) },
5967 { "vptest", { XM
, EXx
}, PREFIX_DATA
},
5969 { VEX_W_TABLE (VEX_W_0F3818
) },
5970 { VEX_LEN_TABLE (VEX_LEN_0F3819
) },
5971 { MOD_TABLE (MOD_VEX_0F381A
) },
5973 { "vpabsb", { XM
, EXx
}, PREFIX_DATA
},
5974 { "vpabsw", { XM
, EXx
}, PREFIX_DATA
},
5975 { "vpabsd", { XM
, EXx
}, PREFIX_DATA
},
5978 { "vpmovsxbw", { XM
, EXxmmq
}, PREFIX_DATA
},
5979 { "vpmovsxbd", { XM
, EXxmmqd
}, PREFIX_DATA
},
5980 { "vpmovsxbq", { XM
, EXxmmdw
}, PREFIX_DATA
},
5981 { "vpmovsxwd", { XM
, EXxmmq
}, PREFIX_DATA
},
5982 { "vpmovsxwq", { XM
, EXxmmqd
}, PREFIX_DATA
},
5983 { "vpmovsxdq", { XM
, EXxmmq
}, PREFIX_DATA
},
5987 { "vpmuldq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5988 { "vpcmpeqq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5989 { MOD_TABLE (MOD_VEX_0F382A
) },
5990 { "vpackusdw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
5991 { MOD_TABLE (MOD_VEX_0F382C
) },
5992 { MOD_TABLE (MOD_VEX_0F382D
) },
5993 { MOD_TABLE (MOD_VEX_0F382E
) },
5994 { MOD_TABLE (MOD_VEX_0F382F
) },
5996 { "vpmovzxbw", { XM
, EXxmmq
}, PREFIX_DATA
},
5997 { "vpmovzxbd", { XM
, EXxmmqd
}, PREFIX_DATA
},
5998 { "vpmovzxbq", { XM
, EXxmmdw
}, PREFIX_DATA
},
5999 { "vpmovzxwd", { XM
, EXxmmq
}, PREFIX_DATA
},
6000 { "vpmovzxwq", { XM
, EXxmmqd
}, PREFIX_DATA
},
6001 { "vpmovzxdq", { XM
, EXxmmq
}, PREFIX_DATA
},
6002 { VEX_LEN_TABLE (VEX_LEN_0F3836
) },
6003 { "vpcmpgtq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6005 { "vpminsb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6006 { "vpminsd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6007 { "vpminuw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6008 { "vpminud", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6009 { "vpmaxsb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6010 { "vpmaxsd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6011 { "vpmaxuw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6012 { "vpmaxud", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6014 { "vpmulld", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6015 { VEX_LEN_TABLE (VEX_LEN_0F3841
) },
6019 { "vpsrlv%DQ", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6020 { VEX_W_TABLE (VEX_W_0F3846
) },
6021 { "vpsllv%DQ", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6024 { X86_64_TABLE (X86_64_VEX_0F3849
) },
6026 { X86_64_TABLE (X86_64_VEX_0F384B
) },
6041 { VEX_W_TABLE (VEX_W_0F3858
) },
6042 { VEX_W_TABLE (VEX_W_0F3859
) },
6043 { MOD_TABLE (MOD_VEX_0F385A
) },
6045 { X86_64_TABLE (X86_64_VEX_0F385C
) },
6047 { X86_64_TABLE (X86_64_VEX_0F385E
) },
6077 { VEX_W_TABLE (VEX_W_0F3878
) },
6078 { VEX_W_TABLE (VEX_W_0F3879
) },
6099 { MOD_TABLE (MOD_VEX_0F388C
) },
6101 { MOD_TABLE (MOD_VEX_0F388E
) },
6104 { "vpgatherd%DQ", { XM
, MVexVSIBDWpX
, Vex
}, PREFIX_DATA
},
6105 { "vpgatherq%DQ", { XMGatherQ
, MVexVSIBQWpX
, VexGatherQ
}, PREFIX_DATA
},
6106 { "vgatherdp%XW", { XM
, MVexVSIBDWpX
, Vex
}, PREFIX_DATA
},
6107 { "vgatherqp%XW", { XMGatherQ
, MVexVSIBQWpX
, VexGatherQ
}, PREFIX_DATA
},
6110 { "vfmaddsub132p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6111 { "vfmsubadd132p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6113 { "vfmadd132p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6114 { "vfmadd132s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
}, PREFIX_DATA
},
6115 { "vfmsub132p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6116 { "vfmsub132s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
}, PREFIX_DATA
},
6117 { "vfnmadd132p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6118 { "vfnmadd132s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
}, PREFIX_DATA
},
6119 { "vfnmsub132p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6120 { "vfnmsub132s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
}, PREFIX_DATA
},
6128 { "vfmaddsub213p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6129 { "vfmsubadd213p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6131 { "vfmadd213p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6132 { "vfmadd213s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
}, PREFIX_DATA
},
6133 { "vfmsub213p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6134 { "vfmsub213s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
}, PREFIX_DATA
},
6135 { "vfnmadd213p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6136 { "vfnmadd213s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
}, PREFIX_DATA
},
6137 { "vfnmsub213p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6138 { "vfnmsub213s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
}, PREFIX_DATA
},
6146 { "vfmaddsub231p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6147 { "vfmsubadd231p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6149 { "vfmadd231p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6150 { "vfmadd231s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
}, PREFIX_DATA
},
6151 { "vfmsub231p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6152 { "vfmsub231s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
}, PREFIX_DATA
},
6153 { "vfnmadd231p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6154 { "vfnmadd231s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
}, PREFIX_DATA
},
6155 { "vfnmsub231p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6156 { "vfnmsub231s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
}, PREFIX_DATA
},
6174 { VEX_W_TABLE (VEX_W_0F38CF
) },
6188 { VEX_LEN_TABLE (VEX_LEN_0F38DB
) },
6189 { "vaesenc", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6190 { "vaesenclast", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6191 { "vaesdec", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6192 { "vaesdeclast", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6214 { VEX_LEN_TABLE (VEX_LEN_0F38F2
) },
6215 { REG_TABLE (REG_VEX_0F38F3
) },
6217 { PREFIX_TABLE (PREFIX_VEX_0F38F5
) },
6218 { PREFIX_TABLE (PREFIX_VEX_0F38F6
) },
6219 { PREFIX_TABLE (PREFIX_VEX_0F38F7
) },
6233 { VEX_LEN_TABLE (VEX_LEN_0F3A00
) },
6234 { VEX_LEN_TABLE (VEX_LEN_0F3A01
) },
6235 { VEX_W_TABLE (VEX_W_0F3A02
) },
6237 { VEX_W_TABLE (VEX_W_0F3A04
) },
6238 { VEX_W_TABLE (VEX_W_0F3A05
) },
6239 { VEX_LEN_TABLE (VEX_LEN_0F3A06
) },
6242 { "vroundps", { XM
, EXx
, Ib
}, PREFIX_DATA
},
6243 { "vroundpd", { XM
, EXx
, Ib
}, PREFIX_DATA
},
6244 { "vroundss", { XMScalar
, VexScalar
, EXxmm_md
, Ib
}, PREFIX_DATA
},
6245 { "vroundsd", { XMScalar
, VexScalar
, EXxmm_mq
, Ib
}, PREFIX_DATA
},
6246 { "vblendps", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
6247 { "vblendpd", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
6248 { "vpblendw", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
6249 { "vpalignr", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
6255 { VEX_LEN_TABLE (VEX_LEN_0F3A14
) },
6256 { VEX_LEN_TABLE (VEX_LEN_0F3A15
) },
6257 { VEX_LEN_TABLE (VEX_LEN_0F3A16
) },
6258 { VEX_LEN_TABLE (VEX_LEN_0F3A17
) },
6260 { VEX_LEN_TABLE (VEX_LEN_0F3A18
) },
6261 { VEX_LEN_TABLE (VEX_LEN_0F3A19
) },
6265 { VEX_W_TABLE (VEX_W_0F3A1D
) },
6269 { VEX_LEN_TABLE (VEX_LEN_0F3A20
) },
6270 { VEX_LEN_TABLE (VEX_LEN_0F3A21
) },
6271 { VEX_LEN_TABLE (VEX_LEN_0F3A22
) },
6287 { VEX_LEN_TABLE (VEX_LEN_0F3A30
) },
6288 { VEX_LEN_TABLE (VEX_LEN_0F3A31
) },
6289 { VEX_LEN_TABLE (VEX_LEN_0F3A32
) },
6290 { VEX_LEN_TABLE (VEX_LEN_0F3A33
) },
6296 { VEX_LEN_TABLE (VEX_LEN_0F3A38
) },
6297 { VEX_LEN_TABLE (VEX_LEN_0F3A39
) },
6305 { "vdpps", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
6306 { VEX_LEN_TABLE (VEX_LEN_0F3A41
) },
6307 { "vmpsadbw", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
6309 { "vpclmulqdq", { XM
, Vex
, EXx
, PCLMUL
}, PREFIX_DATA
},
6311 { VEX_LEN_TABLE (VEX_LEN_0F3A46
) },
6314 { "vpermil2ps", { XM
, Vex
, EXx
, XMVexI4
, VexI4
}, PREFIX_DATA
},
6315 { "vpermil2pd", { XM
, Vex
, EXx
, XMVexI4
, VexI4
}, PREFIX_DATA
},
6316 { VEX_W_TABLE (VEX_W_0F3A4A
) },
6317 { VEX_W_TABLE (VEX_W_0F3A4B
) },
6318 { VEX_W_TABLE (VEX_W_0F3A4C
) },
6336 { "vfmaddsubps", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6337 { "vfmaddsubpd", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6338 { "vfmsubaddps", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6339 { "vfmsubaddpd", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6341 { VEX_LEN_TABLE (VEX_LEN_0F3A60
) },
6342 { VEX_LEN_TABLE (VEX_LEN_0F3A61
) },
6343 { VEX_LEN_TABLE (VEX_LEN_0F3A62
) },
6344 { VEX_LEN_TABLE (VEX_LEN_0F3A63
) },
6350 { "vfmaddps", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6351 { "vfmaddpd", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6352 { "vfmaddss", { XMScalar
, VexScalar
, EXxmm_md
, XMVexScalarI4
}, PREFIX_DATA
},
6353 { "vfmaddsd", { XMScalar
, VexScalar
, EXxmm_mq
, XMVexScalarI4
}, PREFIX_DATA
},
6354 { "vfmsubps", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6355 { "vfmsubpd", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6356 { "vfmsubss", { XMScalar
, VexScalar
, EXxmm_md
, XMVexScalarI4
}, PREFIX_DATA
},
6357 { "vfmsubsd", { XMScalar
, VexScalar
, EXxmm_mq
, XMVexScalarI4
}, PREFIX_DATA
},
6368 { "vfnmaddps", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6369 { "vfnmaddpd", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6370 { "vfnmaddss", { XMScalar
, VexScalar
, EXxmm_md
, XMVexScalarI4
}, PREFIX_DATA
},
6371 { "vfnmaddsd", { XMScalar
, VexScalar
, EXxmm_mq
, XMVexScalarI4
}, PREFIX_DATA
},
6372 { "vfnmsubps", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6373 { "vfnmsubpd", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6374 { "vfnmsubss", { XMScalar
, VexScalar
, EXxmm_md
, XMVexScalarI4
}, PREFIX_DATA
},
6375 { "vfnmsubsd", { XMScalar
, VexScalar
, EXxmm_mq
, XMVexScalarI4
}, PREFIX_DATA
},
6464 { VEX_W_TABLE (VEX_W_0F3ACE
) },
6465 { VEX_W_TABLE (VEX_W_0F3ACF
) },
6483 { VEX_LEN_TABLE (VEX_LEN_0F3ADF
) },
6503 { PREFIX_TABLE (PREFIX_VEX_0F3AF0
) },
6523 #include "i386-dis-evex.h"
6525 static const struct dis386 vex_len_table
[][2] = {
6526 /* VEX_LEN_0F12_P_0_M_0 / VEX_LEN_0F12_P_2_M_0 */
6528 { "vmovlpX", { XM
, Vex
, EXq
}, 0 },
6531 /* VEX_LEN_0F12_P_0_M_1 */
6533 { "vmovhlps", { XM
, Vex
, EXq
}, 0 },
6536 /* VEX_LEN_0F13_M_0 */
6538 { "vmovlpX", { EXq
, XM
}, PREFIX_OPCODE
},
6541 /* VEX_LEN_0F16_P_0_M_0 / VEX_LEN_0F16_P_2_M_0 */
6543 { "vmovhpX", { XM
, Vex
, EXq
}, 0 },
6546 /* VEX_LEN_0F16_P_0_M_1 */
6548 { "vmovlhps", { XM
, Vex
, EXq
}, 0 },
6551 /* VEX_LEN_0F17_M_0 */
6553 { "vmovhpX", { EXq
, XM
}, PREFIX_OPCODE
},
6556 /* VEX_LEN_0F41_P_0 */
6559 { VEX_W_TABLE (VEX_W_0F41_P_0_LEN_1
) },
6561 /* VEX_LEN_0F41_P_2 */
6564 { VEX_W_TABLE (VEX_W_0F41_P_2_LEN_1
) },
6566 /* VEX_LEN_0F42_P_0 */
6569 { VEX_W_TABLE (VEX_W_0F42_P_0_LEN_1
) },
6571 /* VEX_LEN_0F42_P_2 */
6574 { VEX_W_TABLE (VEX_W_0F42_P_2_LEN_1
) },
6576 /* VEX_LEN_0F44_P_0 */
6578 { VEX_W_TABLE (VEX_W_0F44_P_0_LEN_0
) },
6580 /* VEX_LEN_0F44_P_2 */
6582 { VEX_W_TABLE (VEX_W_0F44_P_2_LEN_0
) },
6584 /* VEX_LEN_0F45_P_0 */
6587 { VEX_W_TABLE (VEX_W_0F45_P_0_LEN_1
) },
6589 /* VEX_LEN_0F45_P_2 */
6592 { VEX_W_TABLE (VEX_W_0F45_P_2_LEN_1
) },
6594 /* VEX_LEN_0F46_P_0 */
6597 { VEX_W_TABLE (VEX_W_0F46_P_0_LEN_1
) },
6599 /* VEX_LEN_0F46_P_2 */
6602 { VEX_W_TABLE (VEX_W_0F46_P_2_LEN_1
) },
6604 /* VEX_LEN_0F47_P_0 */
6607 { VEX_W_TABLE (VEX_W_0F47_P_0_LEN_1
) },
6609 /* VEX_LEN_0F47_P_2 */
6612 { VEX_W_TABLE (VEX_W_0F47_P_2_LEN_1
) },
6614 /* VEX_LEN_0F4A_P_0 */
6617 { VEX_W_TABLE (VEX_W_0F4A_P_0_LEN_1
) },
6619 /* VEX_LEN_0F4A_P_2 */
6622 { VEX_W_TABLE (VEX_W_0F4A_P_2_LEN_1
) },
6624 /* VEX_LEN_0F4B_P_0 */
6627 { VEX_W_TABLE (VEX_W_0F4B_P_0_LEN_1
) },
6629 /* VEX_LEN_0F4B_P_2 */
6632 { VEX_W_TABLE (VEX_W_0F4B_P_2_LEN_1
) },
6637 { "vmovK", { XMScalar
, Edq
}, PREFIX_DATA
},
6642 { "vzeroupper", { XX
}, 0 },
6643 { "vzeroall", { XX
}, 0 },
6646 /* VEX_LEN_0F7E_P_1 */
6648 { "vmovq", { XMScalar
, EXxmm_mq
}, 0 },
6651 /* VEX_LEN_0F7E_P_2 */
6653 { "vmovK", { Edq
, XMScalar
}, 0 },
6656 /* VEX_LEN_0F90_P_0 */
6658 { VEX_W_TABLE (VEX_W_0F90_P_0_LEN_0
) },
6661 /* VEX_LEN_0F90_P_2 */
6663 { VEX_W_TABLE (VEX_W_0F90_P_2_LEN_0
) },
6666 /* VEX_LEN_0F91_P_0 */
6668 { VEX_W_TABLE (VEX_W_0F91_P_0_LEN_0
) },
6671 /* VEX_LEN_0F91_P_2 */
6673 { VEX_W_TABLE (VEX_W_0F91_P_2_LEN_0
) },
6676 /* VEX_LEN_0F92_P_0 */
6678 { VEX_W_TABLE (VEX_W_0F92_P_0_LEN_0
) },
6681 /* VEX_LEN_0F92_P_2 */
6683 { VEX_W_TABLE (VEX_W_0F92_P_2_LEN_0
) },
6686 /* VEX_LEN_0F92_P_3 */
6688 { MOD_TABLE (MOD_VEX_0F92_P_3_LEN_0
) },
6691 /* VEX_LEN_0F93_P_0 */
6693 { VEX_W_TABLE (VEX_W_0F93_P_0_LEN_0
) },
6696 /* VEX_LEN_0F93_P_2 */
6698 { VEX_W_TABLE (VEX_W_0F93_P_2_LEN_0
) },
6701 /* VEX_LEN_0F93_P_3 */
6703 { MOD_TABLE (MOD_VEX_0F93_P_3_LEN_0
) },
6706 /* VEX_LEN_0F98_P_0 */
6708 { VEX_W_TABLE (VEX_W_0F98_P_0_LEN_0
) },
6711 /* VEX_LEN_0F98_P_2 */
6713 { VEX_W_TABLE (VEX_W_0F98_P_2_LEN_0
) },
6716 /* VEX_LEN_0F99_P_0 */
6718 { VEX_W_TABLE (VEX_W_0F99_P_0_LEN_0
) },
6721 /* VEX_LEN_0F99_P_2 */
6723 { VEX_W_TABLE (VEX_W_0F99_P_2_LEN_0
) },
6726 /* VEX_LEN_0FAE_R_2_M_0 */
6728 { "vldmxcsr", { Md
}, 0 },
6731 /* VEX_LEN_0FAE_R_3_M_0 */
6733 { "vstmxcsr", { Md
}, 0 },
6738 { "vpinsrw", { XM
, Vex
, Edqw
, Ib
}, PREFIX_DATA
},
6743 { "vpextrw", { Gdq
, XS
, Ib
}, PREFIX_DATA
},
6748 { "vmovq", { EXqS
, XMScalar
}, PREFIX_DATA
},
6753 { "vmaskmovdqu", { XM
, XS
}, PREFIX_DATA
},
6756 /* VEX_LEN_0F3816 */
6759 { VEX_W_TABLE (VEX_W_0F3816_L_1
) },
6762 /* VEX_LEN_0F3819 */
6765 { VEX_W_TABLE (VEX_W_0F3819_L_1
) },
6768 /* VEX_LEN_0F381A_M_0 */
6771 { VEX_W_TABLE (VEX_W_0F381A_M_0_L_1
) },
6774 /* VEX_LEN_0F3836 */
6777 { VEX_W_TABLE (VEX_W_0F3836
) },
6780 /* VEX_LEN_0F3841 */
6782 { "vphminposuw", { XM
, EXx
}, PREFIX_DATA
},
6785 /* VEX_LEN_0F3849_X86_64_P_0_W_0_M_0 */
6787 { "ldtilecfg", { M
}, 0 },
6790 /* VEX_LEN_0F3849_X86_64_P_0_W_0_M_1_REG_0_RM_0 */
6792 { "tilerelease", { Skip_MODRM
}, 0 },
6795 /* VEX_LEN_0F3849_X86_64_P_2_W_0_M_0 */
6797 { "sttilecfg", { M
}, 0 },
6800 /* VEX_LEN_0F3849_X86_64_P_3_W_0_M_0 */
6802 { "tilezero", { TMM
, Skip_MODRM
}, 0 },
6805 /* VEX_LEN_0F384B_X86_64_P_1_W_0_M_0 */
6807 { "tilestored", { MVexSIBMEM
, TMM
}, 0 },
6809 /* VEX_LEN_0F384B_X86_64_P_2_W_0_M_0 */
6811 { "tileloaddt1", { TMM
, MVexSIBMEM
}, 0 },
6814 /* VEX_LEN_0F384B_X86_64_P_3_W_0_M_0 */
6816 { "tileloadd", { TMM
, MVexSIBMEM
}, 0 },
6819 /* VEX_LEN_0F385A_M_0 */
6822 { VEX_W_TABLE (VEX_W_0F385A_M_0_L_0
) },
6825 /* VEX_LEN_0F385C_X86_64_P_1_W_0_M_0 */
6827 { "tdpbf16ps", { TMM
, EXtmm
, VexTmm
}, 0 },
6830 /* VEX_LEN_0F385E_X86_64_P_0_W_0_M_0 */
6832 { "tdpbuud", {TMM
, EXtmm
, VexTmm
}, 0 },
6835 /* VEX_LEN_0F385E_X86_64_P_1_W_0_M_0 */
6837 { "tdpbsud", {TMM
, EXtmm
, VexTmm
}, 0 },
6840 /* VEX_LEN_0F385E_X86_64_P_2_W_0_M_0 */
6842 { "tdpbusd", {TMM
, EXtmm
, VexTmm
}, 0 },
6845 /* VEX_LEN_0F385E_X86_64_P_3_W_0_M_0 */
6847 { "tdpbssd", {TMM
, EXtmm
, VexTmm
}, 0 },
6850 /* VEX_LEN_0F38DB */
6852 { "vaesimc", { XM
, EXx
}, PREFIX_DATA
},
6855 /* VEX_LEN_0F38F2 */
6857 { "andnS", { Gdq
, VexGdq
, Edq
}, PREFIX_OPCODE
},
6860 /* VEX_LEN_0F38F3_R_1 */
6862 { "blsrS", { VexGdq
, Edq
}, PREFIX_OPCODE
},
6865 /* VEX_LEN_0F38F3_R_2 */
6867 { "blsmskS", { VexGdq
, Edq
}, PREFIX_OPCODE
},
6870 /* VEX_LEN_0F38F3_R_3 */
6872 { "blsiS", { VexGdq
, Edq
}, PREFIX_OPCODE
},
6875 /* VEX_LEN_0F38F5_P_0 */
6877 { "bzhiS", { Gdq
, Edq
, VexGdq
}, 0 },
6880 /* VEX_LEN_0F38F5_P_1 */
6882 { "pextS", { Gdq
, VexGdq
, Edq
}, 0 },
6885 /* VEX_LEN_0F38F5_P_3 */
6887 { "pdepS", { Gdq
, VexGdq
, Edq
}, 0 },
6890 /* VEX_LEN_0F38F6_P_3 */
6892 { "mulxS", { Gdq
, VexGdq
, Edq
}, 0 },
6895 /* VEX_LEN_0F38F7_P_0 */
6897 { "bextrS", { Gdq
, Edq
, VexGdq
}, 0 },
6900 /* VEX_LEN_0F38F7_P_1 */
6902 { "sarxS", { Gdq
, Edq
, VexGdq
}, 0 },
6905 /* VEX_LEN_0F38F7_P_2 */
6907 { "shlxS", { Gdq
, Edq
, VexGdq
}, 0 },
6910 /* VEX_LEN_0F38F7_P_3 */
6912 { "shrxS", { Gdq
, Edq
, VexGdq
}, 0 },
6915 /* VEX_LEN_0F3A00 */
6918 { VEX_W_TABLE (VEX_W_0F3A00_L_1
) },
6921 /* VEX_LEN_0F3A01 */
6924 { VEX_W_TABLE (VEX_W_0F3A01_L_1
) },
6927 /* VEX_LEN_0F3A06 */
6930 { VEX_W_TABLE (VEX_W_0F3A06_L_1
) },
6933 /* VEX_LEN_0F3A14 */
6935 { "vpextrb", { Edqb
, XM
, Ib
}, PREFIX_DATA
},
6938 /* VEX_LEN_0F3A15 */
6940 { "vpextrw", { Edqw
, XM
, Ib
}, PREFIX_DATA
},
6943 /* VEX_LEN_0F3A16 */
6945 { "vpextrK", { Edq
, XM
, Ib
}, PREFIX_DATA
},
6948 /* VEX_LEN_0F3A17 */
6950 { "vextractps", { Edqd
, XM
, Ib
}, PREFIX_DATA
},
6953 /* VEX_LEN_0F3A18 */
6956 { VEX_W_TABLE (VEX_W_0F3A18_L_1
) },
6959 /* VEX_LEN_0F3A19 */
6962 { VEX_W_TABLE (VEX_W_0F3A19_L_1
) },
6965 /* VEX_LEN_0F3A20 */
6967 { "vpinsrb", { XM
, Vex
, Edqb
, Ib
}, PREFIX_DATA
},
6970 /* VEX_LEN_0F3A21 */
6972 { "vinsertps", { XM
, Vex
, EXd
, Ib
}, PREFIX_DATA
},
6975 /* VEX_LEN_0F3A22 */
6977 { "vpinsrK", { XM
, Vex
, Edq
, Ib
}, PREFIX_DATA
},
6980 /* VEX_LEN_0F3A30 */
6982 { MOD_TABLE (MOD_VEX_0F3A30_L_0
) },
6985 /* VEX_LEN_0F3A31 */
6987 { MOD_TABLE (MOD_VEX_0F3A31_L_0
) },
6990 /* VEX_LEN_0F3A32 */
6992 { MOD_TABLE (MOD_VEX_0F3A32_L_0
) },
6995 /* VEX_LEN_0F3A33 */
6997 { MOD_TABLE (MOD_VEX_0F3A33_L_0
) },
7000 /* VEX_LEN_0F3A38 */
7003 { VEX_W_TABLE (VEX_W_0F3A38_L_1
) },
7006 /* VEX_LEN_0F3A39 */
7009 { VEX_W_TABLE (VEX_W_0F3A39_L_1
) },
7012 /* VEX_LEN_0F3A41 */
7014 { "vdppd", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
7017 /* VEX_LEN_0F3A46 */
7020 { VEX_W_TABLE (VEX_W_0F3A46_L_1
) },
7023 /* VEX_LEN_0F3A60 */
7025 { "vpcmpestrm!%LQ", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7028 /* VEX_LEN_0F3A61 */
7030 { "vpcmpestri!%LQ", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7033 /* VEX_LEN_0F3A62 */
7035 { "vpcmpistrm", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7038 /* VEX_LEN_0F3A63 */
7040 { "vpcmpistri", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7043 /* VEX_LEN_0F3ADF */
7045 { "vaeskeygenassist", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7048 /* VEX_LEN_0F3AF0_P_3 */
7050 { "rorxS", { Gdq
, Edq
, Ib
}, 0 },
7053 /* VEX_LEN_0FXOP_08_85 */
7055 { VEX_W_TABLE (VEX_W_0FXOP_08_85_L_0
) },
7058 /* VEX_LEN_0FXOP_08_86 */
7060 { VEX_W_TABLE (VEX_W_0FXOP_08_86_L_0
) },
7063 /* VEX_LEN_0FXOP_08_87 */
7065 { VEX_W_TABLE (VEX_W_0FXOP_08_87_L_0
) },
7068 /* VEX_LEN_0FXOP_08_8E */
7070 { VEX_W_TABLE (VEX_W_0FXOP_08_8E_L_0
) },
7073 /* VEX_LEN_0FXOP_08_8F */
7075 { VEX_W_TABLE (VEX_W_0FXOP_08_8F_L_0
) },
7078 /* VEX_LEN_0FXOP_08_95 */
7080 { VEX_W_TABLE (VEX_W_0FXOP_08_95_L_0
) },
7083 /* VEX_LEN_0FXOP_08_96 */
7085 { VEX_W_TABLE (VEX_W_0FXOP_08_96_L_0
) },
7088 /* VEX_LEN_0FXOP_08_97 */
7090 { VEX_W_TABLE (VEX_W_0FXOP_08_97_L_0
) },
7093 /* VEX_LEN_0FXOP_08_9E */
7095 { VEX_W_TABLE (VEX_W_0FXOP_08_9E_L_0
) },
7098 /* VEX_LEN_0FXOP_08_9F */
7100 { VEX_W_TABLE (VEX_W_0FXOP_08_9F_L_0
) },
7103 /* VEX_LEN_0FXOP_08_A3 */
7105 { "vpperm", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7108 /* VEX_LEN_0FXOP_08_A6 */
7110 { VEX_W_TABLE (VEX_W_0FXOP_08_A6_L_0
) },
7113 /* VEX_LEN_0FXOP_08_B6 */
7115 { VEX_W_TABLE (VEX_W_0FXOP_08_B6_L_0
) },
7118 /* VEX_LEN_0FXOP_08_C0 */
7120 { VEX_W_TABLE (VEX_W_0FXOP_08_C0_L_0
) },
7123 /* VEX_LEN_0FXOP_08_C1 */
7125 { VEX_W_TABLE (VEX_W_0FXOP_08_C1_L_0
) },
7128 /* VEX_LEN_0FXOP_08_C2 */
7130 { VEX_W_TABLE (VEX_W_0FXOP_08_C2_L_0
) },
7133 /* VEX_LEN_0FXOP_08_C3 */
7135 { VEX_W_TABLE (VEX_W_0FXOP_08_C3_L_0
) },
7138 /* VEX_LEN_0FXOP_08_CC */
7140 { VEX_W_TABLE (VEX_W_0FXOP_08_CC_L_0
) },
7143 /* VEX_LEN_0FXOP_08_CD */
7145 { VEX_W_TABLE (VEX_W_0FXOP_08_CD_L_0
) },
7148 /* VEX_LEN_0FXOP_08_CE */
7150 { VEX_W_TABLE (VEX_W_0FXOP_08_CE_L_0
) },
7153 /* VEX_LEN_0FXOP_08_CF */
7155 { VEX_W_TABLE (VEX_W_0FXOP_08_CF_L_0
) },
7158 /* VEX_LEN_0FXOP_08_EC */
7160 { VEX_W_TABLE (VEX_W_0FXOP_08_EC_L_0
) },
7163 /* VEX_LEN_0FXOP_08_ED */
7165 { VEX_W_TABLE (VEX_W_0FXOP_08_ED_L_0
) },
7168 /* VEX_LEN_0FXOP_08_EE */
7170 { VEX_W_TABLE (VEX_W_0FXOP_08_EE_L_0
) },
7173 /* VEX_LEN_0FXOP_08_EF */
7175 { VEX_W_TABLE (VEX_W_0FXOP_08_EF_L_0
) },
7178 /* VEX_LEN_0FXOP_09_01 */
7180 { REG_TABLE (REG_0FXOP_09_01_L_0
) },
7183 /* VEX_LEN_0FXOP_09_02 */
7185 { REG_TABLE (REG_0FXOP_09_02_L_0
) },
7188 /* VEX_LEN_0FXOP_09_12_M_1 */
7190 { REG_TABLE (REG_0FXOP_09_12_M_1_L_0
) },
7193 /* VEX_LEN_0FXOP_09_82_W_0 */
7195 { "vfrczss", { XM
, EXd
}, 0 },
7198 /* VEX_LEN_0FXOP_09_83_W_0 */
7200 { "vfrczsd", { XM
, EXq
}, 0 },
7203 /* VEX_LEN_0FXOP_09_90 */
7205 { "vprotb", { XM
, EXx
, VexW
}, 0 },
7208 /* VEX_LEN_0FXOP_09_91 */
7210 { "vprotw", { XM
, EXx
, VexW
}, 0 },
7213 /* VEX_LEN_0FXOP_09_92 */
7215 { "vprotd", { XM
, EXx
, VexW
}, 0 },
7218 /* VEX_LEN_0FXOP_09_93 */
7220 { "vprotq", { XM
, EXx
, VexW
}, 0 },
7223 /* VEX_LEN_0FXOP_09_94 */
7225 { "vpshlb", { XM
, EXx
, VexW
}, 0 },
7228 /* VEX_LEN_0FXOP_09_95 */
7230 { "vpshlw", { XM
, EXx
, VexW
}, 0 },
7233 /* VEX_LEN_0FXOP_09_96 */
7235 { "vpshld", { XM
, EXx
, VexW
}, 0 },
7238 /* VEX_LEN_0FXOP_09_97 */
7240 { "vpshlq", { XM
, EXx
, VexW
}, 0 },
7243 /* VEX_LEN_0FXOP_09_98 */
7245 { "vpshab", { XM
, EXx
, VexW
}, 0 },
7248 /* VEX_LEN_0FXOP_09_99 */
7250 { "vpshaw", { XM
, EXx
, VexW
}, 0 },
7253 /* VEX_LEN_0FXOP_09_9A */
7255 { "vpshad", { XM
, EXx
, VexW
}, 0 },
7258 /* VEX_LEN_0FXOP_09_9B */
7260 { "vpshaq", { XM
, EXx
, VexW
}, 0 },
7263 /* VEX_LEN_0FXOP_09_C1 */
7265 { VEX_W_TABLE (VEX_W_0FXOP_09_C1_L_0
) },
7268 /* VEX_LEN_0FXOP_09_C2 */
7270 { VEX_W_TABLE (VEX_W_0FXOP_09_C2_L_0
) },
7273 /* VEX_LEN_0FXOP_09_C3 */
7275 { VEX_W_TABLE (VEX_W_0FXOP_09_C3_L_0
) },
7278 /* VEX_LEN_0FXOP_09_C6 */
7280 { VEX_W_TABLE (VEX_W_0FXOP_09_C6_L_0
) },
7283 /* VEX_LEN_0FXOP_09_C7 */
7285 { VEX_W_TABLE (VEX_W_0FXOP_09_C7_L_0
) },
7288 /* VEX_LEN_0FXOP_09_CB */
7290 { VEX_W_TABLE (VEX_W_0FXOP_09_CB_L_0
) },
7293 /* VEX_LEN_0FXOP_09_D1 */
7295 { VEX_W_TABLE (VEX_W_0FXOP_09_D1_L_0
) },
7298 /* VEX_LEN_0FXOP_09_D2 */
7300 { VEX_W_TABLE (VEX_W_0FXOP_09_D2_L_0
) },
7303 /* VEX_LEN_0FXOP_09_D3 */
7305 { VEX_W_TABLE (VEX_W_0FXOP_09_D3_L_0
) },
7308 /* VEX_LEN_0FXOP_09_D6 */
7310 { VEX_W_TABLE (VEX_W_0FXOP_09_D6_L_0
) },
7313 /* VEX_LEN_0FXOP_09_D7 */
7315 { VEX_W_TABLE (VEX_W_0FXOP_09_D7_L_0
) },
7318 /* VEX_LEN_0FXOP_09_DB */
7320 { VEX_W_TABLE (VEX_W_0FXOP_09_DB_L_0
) },
7323 /* VEX_LEN_0FXOP_09_E1 */
7325 { VEX_W_TABLE (VEX_W_0FXOP_09_E1_L_0
) },
7328 /* VEX_LEN_0FXOP_09_E2 */
7330 { VEX_W_TABLE (VEX_W_0FXOP_09_E2_L_0
) },
7333 /* VEX_LEN_0FXOP_09_E3 */
7335 { VEX_W_TABLE (VEX_W_0FXOP_09_E3_L_0
) },
7338 /* VEX_LEN_0FXOP_0A_12 */
7340 { REG_TABLE (REG_0FXOP_0A_12_L_0
) },
7344 #include "i386-dis-evex-len.h"
7346 static const struct dis386 vex_w_table
[][2] = {
7348 /* VEX_W_0F41_P_0_LEN_1 */
7349 { MOD_TABLE (MOD_VEX_W_0_0F41_P_0_LEN_1
) },
7350 { MOD_TABLE (MOD_VEX_W_1_0F41_P_0_LEN_1
) },
7353 /* VEX_W_0F41_P_2_LEN_1 */
7354 { MOD_TABLE (MOD_VEX_W_0_0F41_P_2_LEN_1
) },
7355 { MOD_TABLE (MOD_VEX_W_1_0F41_P_2_LEN_1
) }
7358 /* VEX_W_0F42_P_0_LEN_1 */
7359 { MOD_TABLE (MOD_VEX_W_0_0F42_P_0_LEN_1
) },
7360 { MOD_TABLE (MOD_VEX_W_1_0F42_P_0_LEN_1
) },
7363 /* VEX_W_0F42_P_2_LEN_1 */
7364 { MOD_TABLE (MOD_VEX_W_0_0F42_P_2_LEN_1
) },
7365 { MOD_TABLE (MOD_VEX_W_1_0F42_P_2_LEN_1
) },
7368 /* VEX_W_0F44_P_0_LEN_0 */
7369 { MOD_TABLE (MOD_VEX_W_0_0F44_P_0_LEN_1
) },
7370 { MOD_TABLE (MOD_VEX_W_1_0F44_P_0_LEN_1
) },
7373 /* VEX_W_0F44_P_2_LEN_0 */
7374 { MOD_TABLE (MOD_VEX_W_0_0F44_P_2_LEN_1
) },
7375 { MOD_TABLE (MOD_VEX_W_1_0F44_P_2_LEN_1
) },
7378 /* VEX_W_0F45_P_0_LEN_1 */
7379 { MOD_TABLE (MOD_VEX_W_0_0F45_P_0_LEN_1
) },
7380 { MOD_TABLE (MOD_VEX_W_1_0F45_P_0_LEN_1
) },
7383 /* VEX_W_0F45_P_2_LEN_1 */
7384 { MOD_TABLE (MOD_VEX_W_0_0F45_P_2_LEN_1
) },
7385 { MOD_TABLE (MOD_VEX_W_1_0F45_P_2_LEN_1
) },
7388 /* VEX_W_0F46_P_0_LEN_1 */
7389 { MOD_TABLE (MOD_VEX_W_0_0F46_P_0_LEN_1
) },
7390 { MOD_TABLE (MOD_VEX_W_1_0F46_P_0_LEN_1
) },
7393 /* VEX_W_0F46_P_2_LEN_1 */
7394 { MOD_TABLE (MOD_VEX_W_0_0F46_P_2_LEN_1
) },
7395 { MOD_TABLE (MOD_VEX_W_1_0F46_P_2_LEN_1
) },
7398 /* VEX_W_0F47_P_0_LEN_1 */
7399 { MOD_TABLE (MOD_VEX_W_0_0F47_P_0_LEN_1
) },
7400 { MOD_TABLE (MOD_VEX_W_1_0F47_P_0_LEN_1
) },
7403 /* VEX_W_0F47_P_2_LEN_1 */
7404 { MOD_TABLE (MOD_VEX_W_0_0F47_P_2_LEN_1
) },
7405 { MOD_TABLE (MOD_VEX_W_1_0F47_P_2_LEN_1
) },
7408 /* VEX_W_0F4A_P_0_LEN_1 */
7409 { MOD_TABLE (MOD_VEX_W_0_0F4A_P_0_LEN_1
) },
7410 { MOD_TABLE (MOD_VEX_W_1_0F4A_P_0_LEN_1
) },
7413 /* VEX_W_0F4A_P_2_LEN_1 */
7414 { MOD_TABLE (MOD_VEX_W_0_0F4A_P_2_LEN_1
) },
7415 { MOD_TABLE (MOD_VEX_W_1_0F4A_P_2_LEN_1
) },
7418 /* VEX_W_0F4B_P_0_LEN_1 */
7419 { MOD_TABLE (MOD_VEX_W_0_0F4B_P_0_LEN_1
) },
7420 { MOD_TABLE (MOD_VEX_W_1_0F4B_P_0_LEN_1
) },
7423 /* VEX_W_0F4B_P_2_LEN_1 */
7424 { MOD_TABLE (MOD_VEX_W_0_0F4B_P_2_LEN_1
) },
7427 /* VEX_W_0F90_P_0_LEN_0 */
7428 { "kmovw", { MaskG
, MaskE
}, 0 },
7429 { "kmovq", { MaskG
, MaskE
}, 0 },
7432 /* VEX_W_0F90_P_2_LEN_0 */
7433 { "kmovb", { MaskG
, MaskBDE
}, 0 },
7434 { "kmovd", { MaskG
, MaskBDE
}, 0 },
7437 /* VEX_W_0F91_P_0_LEN_0 */
7438 { MOD_TABLE (MOD_VEX_W_0_0F91_P_0_LEN_0
) },
7439 { MOD_TABLE (MOD_VEX_W_1_0F91_P_0_LEN_0
) },
7442 /* VEX_W_0F91_P_2_LEN_0 */
7443 { MOD_TABLE (MOD_VEX_W_0_0F91_P_2_LEN_0
) },
7444 { MOD_TABLE (MOD_VEX_W_1_0F91_P_2_LEN_0
) },
7447 /* VEX_W_0F92_P_0_LEN_0 */
7448 { MOD_TABLE (MOD_VEX_W_0_0F92_P_0_LEN_0
) },
7451 /* VEX_W_0F92_P_2_LEN_0 */
7452 { MOD_TABLE (MOD_VEX_W_0_0F92_P_2_LEN_0
) },
7455 /* VEX_W_0F93_P_0_LEN_0 */
7456 { MOD_TABLE (MOD_VEX_W_0_0F93_P_0_LEN_0
) },
7459 /* VEX_W_0F93_P_2_LEN_0 */
7460 { MOD_TABLE (MOD_VEX_W_0_0F93_P_2_LEN_0
) },
7463 /* VEX_W_0F98_P_0_LEN_0 */
7464 { MOD_TABLE (MOD_VEX_W_0_0F98_P_0_LEN_0
) },
7465 { MOD_TABLE (MOD_VEX_W_1_0F98_P_0_LEN_0
) },
7468 /* VEX_W_0F98_P_2_LEN_0 */
7469 { MOD_TABLE (MOD_VEX_W_0_0F98_P_2_LEN_0
) },
7470 { MOD_TABLE (MOD_VEX_W_1_0F98_P_2_LEN_0
) },
7473 /* VEX_W_0F99_P_0_LEN_0 */
7474 { MOD_TABLE (MOD_VEX_W_0_0F99_P_0_LEN_0
) },
7475 { MOD_TABLE (MOD_VEX_W_1_0F99_P_0_LEN_0
) },
7478 /* VEX_W_0F99_P_2_LEN_0 */
7479 { MOD_TABLE (MOD_VEX_W_0_0F99_P_2_LEN_0
) },
7480 { MOD_TABLE (MOD_VEX_W_1_0F99_P_2_LEN_0
) },
7484 { "vpermilps", { XM
, Vex
, EXx
}, PREFIX_DATA
},
7488 { "vpermilpd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
7492 { "vtestps", { XM
, EXx
}, PREFIX_DATA
},
7496 { "vtestpd", { XM
, EXx
}, PREFIX_DATA
},
7500 { "vcvtph2ps", { XM
, EXxmmq
}, PREFIX_DATA
},
7503 /* VEX_W_0F3816_L_1 */
7504 { "vpermps", { XM
, Vex
, EXx
}, PREFIX_DATA
},
7508 { "vbroadcastss", { XM
, EXxmm_md
}, PREFIX_DATA
},
7511 /* VEX_W_0F3819_L_1 */
7512 { "vbroadcastsd", { XM
, EXxmm_mq
}, PREFIX_DATA
},
7515 /* VEX_W_0F381A_M_0_L_1 */
7516 { "vbroadcastf128", { XM
, Mxmm
}, PREFIX_DATA
},
7519 /* VEX_W_0F382C_M_0 */
7520 { "vmaskmovps", { XM
, Vex
, Mx
}, PREFIX_DATA
},
7523 /* VEX_W_0F382D_M_0 */
7524 { "vmaskmovpd", { XM
, Vex
, Mx
}, PREFIX_DATA
},
7527 /* VEX_W_0F382E_M_0 */
7528 { "vmaskmovps", { Mx
, Vex
, XM
}, PREFIX_DATA
},
7531 /* VEX_W_0F382F_M_0 */
7532 { "vmaskmovpd", { Mx
, Vex
, XM
}, PREFIX_DATA
},
7536 { "vpermd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
7540 { "vpsravd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
7543 /* VEX_W_0F3849_X86_64_P_0 */
7544 { MOD_TABLE (MOD_VEX_0F3849_X86_64_P_0_W_0
) },
7547 /* VEX_W_0F3849_X86_64_P_2 */
7548 { MOD_TABLE (MOD_VEX_0F3849_X86_64_P_2_W_0
) },
7551 /* VEX_W_0F3849_X86_64_P_3 */
7552 { MOD_TABLE (MOD_VEX_0F3849_X86_64_P_3_W_0
) },
7555 /* VEX_W_0F384B_X86_64_P_1 */
7556 { MOD_TABLE (MOD_VEX_0F384B_X86_64_P_1_W_0
) },
7559 /* VEX_W_0F384B_X86_64_P_2 */
7560 { MOD_TABLE (MOD_VEX_0F384B_X86_64_P_2_W_0
) },
7563 /* VEX_W_0F384B_X86_64_P_3 */
7564 { MOD_TABLE (MOD_VEX_0F384B_X86_64_P_3_W_0
) },
7568 { "vpbroadcastd", { XM
, EXxmm_md
}, PREFIX_DATA
},
7572 { "vpbroadcastq", { XM
, EXxmm_mq
}, PREFIX_DATA
},
7575 /* VEX_W_0F385A_M_0_L_0 */
7576 { "vbroadcasti128", { XM
, Mxmm
}, PREFIX_DATA
},
7579 /* VEX_W_0F385C_X86_64_P_1 */
7580 { MOD_TABLE (MOD_VEX_0F385C_X86_64_P_1_W_0
) },
7583 /* VEX_W_0F385E_X86_64_P_0 */
7584 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_0_W_0
) },
7587 /* VEX_W_0F385E_X86_64_P_1 */
7588 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_1_W_0
) },
7591 /* VEX_W_0F385E_X86_64_P_2 */
7592 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_2_W_0
) },
7595 /* VEX_W_0F385E_X86_64_P_3 */
7596 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_3_W_0
) },
7600 { "vpbroadcastb", { XM
, EXxmm_mb
}, PREFIX_DATA
},
7604 { "vpbroadcastw", { XM
, EXxmm_mw
}, PREFIX_DATA
},
7608 { "vgf2p8mulb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
7611 /* VEX_W_0F3A00_L_1 */
7613 { "vpermq", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7616 /* VEX_W_0F3A01_L_1 */
7618 { "vpermpd", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7622 { "vpblendd", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
7626 { "vpermilps", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7630 { "vpermilpd", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7633 /* VEX_W_0F3A06_L_1 */
7634 { "vperm2f128", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
7637 /* VEX_W_0F3A18_L_1 */
7638 { "vinsertf128", { XM
, Vex
, EXxmm
, Ib
}, PREFIX_DATA
},
7641 /* VEX_W_0F3A19_L_1 */
7642 { "vextractf128", { EXxmm
, XM
, Ib
}, PREFIX_DATA
},
7646 { "vcvtps2ph", { EXxmmq
, XM
, EXxEVexS
, Ib
}, PREFIX_DATA
},
7649 /* VEX_W_0F3A38_L_1 */
7650 { "vinserti128", { XM
, Vex
, EXxmm
, Ib
}, PREFIX_DATA
},
7653 /* VEX_W_0F3A39_L_1 */
7654 { "vextracti128", { EXxmm
, XM
, Ib
}, PREFIX_DATA
},
7657 /* VEX_W_0F3A46_L_1 */
7658 { "vperm2i128", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
7662 { "vblendvps", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
7666 { "vblendvpd", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
7670 { "vpblendvb", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
7675 { "vgf2p8affineqb", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
7680 { "vgf2p8affineinvqb", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
7682 /* VEX_W_0FXOP_08_85_L_0 */
7684 { "vpmacssww", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7686 /* VEX_W_0FXOP_08_86_L_0 */
7688 { "vpmacsswd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7690 /* VEX_W_0FXOP_08_87_L_0 */
7692 { "vpmacssdql", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7694 /* VEX_W_0FXOP_08_8E_L_0 */
7696 { "vpmacssdd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7698 /* VEX_W_0FXOP_08_8F_L_0 */
7700 { "vpmacssdqh", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7702 /* VEX_W_0FXOP_08_95_L_0 */
7704 { "vpmacsww", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7706 /* VEX_W_0FXOP_08_96_L_0 */
7708 { "vpmacswd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7710 /* VEX_W_0FXOP_08_97_L_0 */
7712 { "vpmacsdql", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7714 /* VEX_W_0FXOP_08_9E_L_0 */
7716 { "vpmacsdd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7718 /* VEX_W_0FXOP_08_9F_L_0 */
7720 { "vpmacsdqh", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7722 /* VEX_W_0FXOP_08_A6_L_0 */
7724 { "vpmadcsswd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7726 /* VEX_W_0FXOP_08_B6_L_0 */
7728 { "vpmadcswd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7730 /* VEX_W_0FXOP_08_C0_L_0 */
7732 { "vprotb", { XM
, EXx
, Ib
}, 0 },
7734 /* VEX_W_0FXOP_08_C1_L_0 */
7736 { "vprotw", { XM
, EXx
, Ib
}, 0 },
7738 /* VEX_W_0FXOP_08_C2_L_0 */
7740 { "vprotd", { XM
, EXx
, Ib
}, 0 },
7742 /* VEX_W_0FXOP_08_C3_L_0 */
7744 { "vprotq", { XM
, EXx
, Ib
}, 0 },
7746 /* VEX_W_0FXOP_08_CC_L_0 */
7748 { "vpcomb", { XM
, Vex
, EXx
, VPCOM
}, 0 },
7750 /* VEX_W_0FXOP_08_CD_L_0 */
7752 { "vpcomw", { XM
, Vex
, EXx
, VPCOM
}, 0 },
7754 /* VEX_W_0FXOP_08_CE_L_0 */
7756 { "vpcomd", { XM
, Vex
, EXx
, VPCOM
}, 0 },
7758 /* VEX_W_0FXOP_08_CF_L_0 */
7760 { "vpcomq", { XM
, Vex
, EXx
, VPCOM
}, 0 },
7762 /* VEX_W_0FXOP_08_EC_L_0 */
7764 { "vpcomub", { XM
, Vex
, EXx
, VPCOM
}, 0 },
7766 /* VEX_W_0FXOP_08_ED_L_0 */
7768 { "vpcomuw", { XM
, Vex
, EXx
, VPCOM
}, 0 },
7770 /* VEX_W_0FXOP_08_EE_L_0 */
7772 { "vpcomud", { XM
, Vex
, EXx
, VPCOM
}, 0 },
7774 /* VEX_W_0FXOP_08_EF_L_0 */
7776 { "vpcomuq", { XM
, Vex
, EXx
, VPCOM
}, 0 },
7778 /* VEX_W_0FXOP_09_80 */
7780 { "vfrczps", { XM
, EXx
}, 0 },
7782 /* VEX_W_0FXOP_09_81 */
7784 { "vfrczpd", { XM
, EXx
}, 0 },
7786 /* VEX_W_0FXOP_09_82 */
7788 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_82_W_0
) },
7790 /* VEX_W_0FXOP_09_83 */
7792 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_83_W_0
) },
7794 /* VEX_W_0FXOP_09_C1_L_0 */
7796 { "vphaddbw", { XM
, EXxmm
}, 0 },
7798 /* VEX_W_0FXOP_09_C2_L_0 */
7800 { "vphaddbd", { XM
, EXxmm
}, 0 },
7802 /* VEX_W_0FXOP_09_C3_L_0 */
7804 { "vphaddbq", { XM
, EXxmm
}, 0 },
7806 /* VEX_W_0FXOP_09_C6_L_0 */
7808 { "vphaddwd", { XM
, EXxmm
}, 0 },
7810 /* VEX_W_0FXOP_09_C7_L_0 */
7812 { "vphaddwq", { XM
, EXxmm
}, 0 },
7814 /* VEX_W_0FXOP_09_CB_L_0 */
7816 { "vphadddq", { XM
, EXxmm
}, 0 },
7818 /* VEX_W_0FXOP_09_D1_L_0 */
7820 { "vphaddubw", { XM
, EXxmm
}, 0 },
7822 /* VEX_W_0FXOP_09_D2_L_0 */
7824 { "vphaddubd", { XM
, EXxmm
}, 0 },
7826 /* VEX_W_0FXOP_09_D3_L_0 */
7828 { "vphaddubq", { XM
, EXxmm
}, 0 },
7830 /* VEX_W_0FXOP_09_D6_L_0 */
7832 { "vphadduwd", { XM
, EXxmm
}, 0 },
7834 /* VEX_W_0FXOP_09_D7_L_0 */
7836 { "vphadduwq", { XM
, EXxmm
}, 0 },
7838 /* VEX_W_0FXOP_09_DB_L_0 */
7840 { "vphaddudq", { XM
, EXxmm
}, 0 },
7842 /* VEX_W_0FXOP_09_E1_L_0 */
7844 { "vphsubbw", { XM
, EXxmm
}, 0 },
7846 /* VEX_W_0FXOP_09_E2_L_0 */
7848 { "vphsubwd", { XM
, EXxmm
}, 0 },
7850 /* VEX_W_0FXOP_09_E3_L_0 */
7852 { "vphsubdq", { XM
, EXxmm
}, 0 },
7855 #include "i386-dis-evex-w.h"
7858 static const struct dis386 mod_table
[][2] = {
7861 { "leaS", { Gv
, M
}, 0 },
7866 { RM_TABLE (RM_C6_REG_7
) },
7871 { RM_TABLE (RM_C7_REG_7
) },
7875 { "{l|}call^", { indirEp
}, 0 },
7879 { "{l|}jmp^", { indirEp
}, 0 },
7882 /* MOD_0F01_REG_0 */
7883 { X86_64_TABLE (X86_64_0F01_REG_0
) },
7884 { RM_TABLE (RM_0F01_REG_0
) },
7887 /* MOD_0F01_REG_1 */
7888 { X86_64_TABLE (X86_64_0F01_REG_1
) },
7889 { RM_TABLE (RM_0F01_REG_1
) },
7892 /* MOD_0F01_REG_2 */
7893 { X86_64_TABLE (X86_64_0F01_REG_2
) },
7894 { RM_TABLE (RM_0F01_REG_2
) },
7897 /* MOD_0F01_REG_3 */
7898 { X86_64_TABLE (X86_64_0F01_REG_3
) },
7899 { RM_TABLE (RM_0F01_REG_3
) },
7902 /* MOD_0F01_REG_5 */
7903 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_0
) },
7904 { RM_TABLE (RM_0F01_REG_5_MOD_3
) },
7907 /* MOD_0F01_REG_7 */
7908 { "invlpg", { Mb
}, 0 },
7909 { RM_TABLE (RM_0F01_REG_7_MOD_3
) },
7912 /* MOD_0F12_PREFIX_0 */
7913 { "movlpX", { XM
, EXq
}, 0 },
7914 { "movhlps", { XM
, EXq
}, 0 },
7917 /* MOD_0F12_PREFIX_2 */
7918 { "movlpX", { XM
, EXq
}, 0 },
7922 { "movlpX", { EXq
, XM
}, PREFIX_OPCODE
},
7925 /* MOD_0F16_PREFIX_0 */
7926 { "movhpX", { XM
, EXq
}, 0 },
7927 { "movlhps", { XM
, EXq
}, 0 },
7930 /* MOD_0F16_PREFIX_2 */
7931 { "movhpX", { XM
, EXq
}, 0 },
7935 { "movhpX", { EXq
, XM
}, PREFIX_OPCODE
},
7938 /* MOD_0F18_REG_0 */
7939 { "prefetchnta", { Mb
}, 0 },
7942 /* MOD_0F18_REG_1 */
7943 { "prefetcht0", { Mb
}, 0 },
7946 /* MOD_0F18_REG_2 */
7947 { "prefetcht1", { Mb
}, 0 },
7950 /* MOD_0F18_REG_3 */
7951 { "prefetcht2", { Mb
}, 0 },
7954 /* MOD_0F18_REG_4 */
7955 { "nop/reserved", { Mb
}, 0 },
7958 /* MOD_0F18_REG_5 */
7959 { "nop/reserved", { Mb
}, 0 },
7962 /* MOD_0F18_REG_6 */
7963 { "nop/reserved", { Mb
}, 0 },
7966 /* MOD_0F18_REG_7 */
7967 { "nop/reserved", { Mb
}, 0 },
7970 /* MOD_0F1A_PREFIX_0 */
7971 { "bndldx", { Gbnd
, Mv_bnd
}, 0 },
7972 { "nopQ", { Ev
}, 0 },
7975 /* MOD_0F1B_PREFIX_0 */
7976 { "bndstx", { Mv_bnd
, Gbnd
}, 0 },
7977 { "nopQ", { Ev
}, 0 },
7980 /* MOD_0F1B_PREFIX_1 */
7981 { "bndmk", { Gbnd
, Mv_bnd
}, 0 },
7982 { "nopQ", { Ev
}, 0 },
7985 /* MOD_0F1C_PREFIX_0 */
7986 { REG_TABLE (REG_0F1C_P_0_MOD_0
) },
7987 { "nopQ", { Ev
}, 0 },
7990 /* MOD_0F1E_PREFIX_1 */
7991 { "nopQ", { Ev
}, 0 },
7992 { REG_TABLE (REG_0F1E_P_1_MOD_3
) },
7997 { "movL", { Rm
, Td
}, 0 },
8002 { "movL", { Td
, Rm
}, 0 },
8005 /* MOD_0F2B_PREFIX_0 */
8006 {"movntps", { Mx
, XM
}, PREFIX_OPCODE
},
8009 /* MOD_0F2B_PREFIX_1 */
8010 {"movntss", { Md
, XM
}, PREFIX_OPCODE
},
8013 /* MOD_0F2B_PREFIX_2 */
8014 {"movntpd", { Mx
, XM
}, PREFIX_OPCODE
},
8017 /* MOD_0F2B_PREFIX_3 */
8018 {"movntsd", { Mq
, XM
}, PREFIX_OPCODE
},
8023 { "movmskpX", { Gdq
, XS
}, PREFIX_OPCODE
},
8026 /* MOD_0F71_REG_2 */
8028 { "psrlw", { MS
, Ib
}, PREFIX_OPCODE
},
8031 /* MOD_0F71_REG_4 */
8033 { "psraw", { MS
, Ib
}, PREFIX_OPCODE
},
8036 /* MOD_0F71_REG_6 */
8038 { "psllw", { MS
, Ib
}, PREFIX_OPCODE
},
8041 /* MOD_0F72_REG_2 */
8043 { "psrld", { MS
, Ib
}, PREFIX_OPCODE
},
8046 /* MOD_0F72_REG_4 */
8048 { "psrad", { MS
, Ib
}, PREFIX_OPCODE
},
8051 /* MOD_0F72_REG_6 */
8053 { "pslld", { MS
, Ib
}, PREFIX_OPCODE
},
8056 /* MOD_0F73_REG_2 */
8058 { "psrlq", { MS
, Ib
}, PREFIX_OPCODE
},
8061 /* MOD_0F73_REG_3 */
8063 { "psrldq", { XS
, Ib
}, PREFIX_DATA
},
8066 /* MOD_0F73_REG_6 */
8068 { "psllq", { MS
, Ib
}, PREFIX_OPCODE
},
8071 /* MOD_0F73_REG_7 */
8073 { "pslldq", { XS
, Ib
}, PREFIX_DATA
},
8076 /* MOD_0FAE_REG_0 */
8077 { "fxsave", { FXSAVE
}, 0 },
8078 { PREFIX_TABLE (PREFIX_0FAE_REG_0_MOD_3
) },
8081 /* MOD_0FAE_REG_1 */
8082 { "fxrstor", { FXSAVE
}, 0 },
8083 { PREFIX_TABLE (PREFIX_0FAE_REG_1_MOD_3
) },
8086 /* MOD_0FAE_REG_2 */
8087 { "ldmxcsr", { Md
}, 0 },
8088 { PREFIX_TABLE (PREFIX_0FAE_REG_2_MOD_3
) },
8091 /* MOD_0FAE_REG_3 */
8092 { "stmxcsr", { Md
}, 0 },
8093 { PREFIX_TABLE (PREFIX_0FAE_REG_3_MOD_3
) },
8096 /* MOD_0FAE_REG_4 */
8097 { PREFIX_TABLE (PREFIX_0FAE_REG_4_MOD_0
) },
8098 { PREFIX_TABLE (PREFIX_0FAE_REG_4_MOD_3
) },
8101 /* MOD_0FAE_REG_5 */
8102 { "xrstor", { FXSAVE
}, PREFIX_OPCODE
},
8103 { PREFIX_TABLE (PREFIX_0FAE_REG_5_MOD_3
) },
8106 /* MOD_0FAE_REG_6 */
8107 { PREFIX_TABLE (PREFIX_0FAE_REG_6_MOD_0
) },
8108 { PREFIX_TABLE (PREFIX_0FAE_REG_6_MOD_3
) },
8111 /* MOD_0FAE_REG_7 */
8112 { PREFIX_TABLE (PREFIX_0FAE_REG_7_MOD_0
) },
8113 { RM_TABLE (RM_0FAE_REG_7_MOD_3
) },
8117 { "lssS", { Gv
, Mp
}, 0 },
8121 { "lfsS", { Gv
, Mp
}, 0 },
8125 { "lgsS", { Gv
, Mp
}, 0 },
8129 { "movntiS", { Edq
, Gdq
}, PREFIX_OPCODE
},
8132 /* MOD_0FC7_REG_3 */
8133 { "xrstors", { FXSAVE
}, 0 },
8136 /* MOD_0FC7_REG_4 */
8137 { "xsavec", { FXSAVE
}, 0 },
8140 /* MOD_0FC7_REG_5 */
8141 { "xsaves", { FXSAVE
}, 0 },
8144 /* MOD_0FC7_REG_6 */
8145 { PREFIX_TABLE (PREFIX_0FC7_REG_6_MOD_0
) },
8146 { PREFIX_TABLE (PREFIX_0FC7_REG_6_MOD_3
) }
8149 /* MOD_0FC7_REG_7 */
8150 { "vmptrst", { Mq
}, 0 },
8151 { PREFIX_TABLE (PREFIX_0FC7_REG_7_MOD_3
) }
8156 { "pmovmskb", { Gdq
, MS
}, 0 },
8159 /* MOD_0FE7_PREFIX_2 */
8160 { "movntdq", { Mx
, XM
}, 0 },
8163 /* MOD_0FF0_PREFIX_3 */
8164 { "lddqu", { XM
, M
}, 0 },
8168 { "movntdqa", { XM
, Mx
}, PREFIX_DATA
},
8171 /* MOD_VEX_0F3849_X86_64_P_0_W_0 */
8172 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_0_W_0_M_0
) },
8173 { REG_TABLE (REG_VEX_0F3849_X86_64_P_0_W_0_M_1
) },
8176 /* MOD_VEX_0F3849_X86_64_P_2_W_0 */
8177 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_2_W_0_M_0
) },
8180 /* MOD_VEX_0F3849_X86_64_P_3_W_0 */
8182 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_3_W_0_M_0
) },
8185 /* MOD_VEX_0F384B_X86_64_P_1_W_0 */
8186 { VEX_LEN_TABLE (VEX_LEN_0F384B_X86_64_P_1_W_0_M_0
) },
8189 /* MOD_VEX_0F384B_X86_64_P_2_W_0 */
8190 { VEX_LEN_TABLE (VEX_LEN_0F384B_X86_64_P_2_W_0_M_0
) },
8193 /* MOD_VEX_0F384B_X86_64_P_3_W_0 */
8194 { VEX_LEN_TABLE (VEX_LEN_0F384B_X86_64_P_3_W_0_M_0
) },
8197 /* MOD_VEX_0F385C_X86_64_P_1_W_0 */
8199 { VEX_LEN_TABLE (VEX_LEN_0F385C_X86_64_P_1_W_0_M_0
) },
8202 /* MOD_VEX_0F385E_X86_64_P_0_W_0 */
8204 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_0_W_0_M_0
) },
8207 /* MOD_VEX_0F385E_X86_64_P_1_W_0 */
8209 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_1_W_0_M_0
) },
8212 /* MOD_VEX_0F385E_X86_64_P_2_W_0 */
8214 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_2_W_0_M_0
) },
8217 /* MOD_VEX_0F385E_X86_64_P_3_W_0 */
8219 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_3_W_0_M_0
) },
8223 { "wrussK", { M
, Gdq
}, PREFIX_DATA
},
8226 /* MOD_0F38F6_PREFIX_0 */
8227 { "wrssK", { M
, Gdq
}, PREFIX_OPCODE
},
8230 /* MOD_0F38F8_PREFIX_1 */
8231 { "enqcmds", { Gva
, M
}, PREFIX_OPCODE
},
8234 /* MOD_0F38F8_PREFIX_2 */
8235 { "movdir64b", { Gva
, M
}, PREFIX_OPCODE
},
8238 /* MOD_0F38F8_PREFIX_3 */
8239 { "enqcmd", { Gva
, M
}, PREFIX_OPCODE
},
8243 { "movdiri", { Edq
, Gdq
}, PREFIX_OPCODE
},
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_W_0_0F41_P_0_LEN_1 */
8293 { "kandw", { MaskG
, MaskVex
, MaskE
}, 0 },
8296 /* MOD_VEX_W_1_0F41_P_0_LEN_1 */
8298 { "kandq", { MaskG
, MaskVex
, MaskE
}, 0 },
8301 /* MOD_VEX_W_0_0F41_P_2_LEN_1 */
8303 { "kandb", { MaskG
, MaskVex
, MaskE
}, 0 },
8306 /* MOD_VEX_W_1_0F41_P_2_LEN_1 */
8308 { "kandd", { MaskG
, MaskVex
, MaskE
}, 0 },
8311 /* MOD_VEX_W_0_0F42_P_0_LEN_1 */
8313 { "kandnw", { MaskG
, MaskVex
, MaskE
}, 0 },
8316 /* MOD_VEX_W_1_0F42_P_0_LEN_1 */
8318 { "kandnq", { MaskG
, MaskVex
, MaskE
}, 0 },
8321 /* MOD_VEX_W_0_0F42_P_2_LEN_1 */
8323 { "kandnb", { MaskG
, MaskVex
, MaskE
}, 0 },
8326 /* MOD_VEX_W_1_0F42_P_2_LEN_1 */
8328 { "kandnd", { MaskG
, MaskVex
, MaskE
}, 0 },
8331 /* MOD_VEX_W_0_0F44_P_0_LEN_0 */
8333 { "knotw", { MaskG
, MaskE
}, 0 },
8336 /* MOD_VEX_W_1_0F44_P_0_LEN_0 */
8338 { "knotq", { MaskG
, MaskE
}, 0 },
8341 /* MOD_VEX_W_0_0F44_P_2_LEN_0 */
8343 { "knotb", { MaskG
, MaskE
}, 0 },
8346 /* MOD_VEX_W_1_0F44_P_2_LEN_0 */
8348 { "knotd", { MaskG
, MaskE
}, 0 },
8351 /* MOD_VEX_W_0_0F45_P_0_LEN_1 */
8353 { "korw", { MaskG
, MaskVex
, MaskE
}, 0 },
8356 /* MOD_VEX_W_1_0F45_P_0_LEN_1 */
8358 { "korq", { MaskG
, MaskVex
, MaskE
}, 0 },
8361 /* MOD_VEX_W_0_0F45_P_2_LEN_1 */
8363 { "korb", { MaskG
, MaskVex
, MaskE
}, 0 },
8366 /* MOD_VEX_W_1_0F45_P_2_LEN_1 */
8368 { "kord", { MaskG
, MaskVex
, MaskE
}, 0 },
8371 /* MOD_VEX_W_0_0F46_P_0_LEN_1 */
8373 { "kxnorw", { MaskG
, MaskVex
, MaskE
}, 0 },
8376 /* MOD_VEX_W_1_0F46_P_0_LEN_1 */
8378 { "kxnorq", { MaskG
, MaskVex
, MaskE
}, 0 },
8381 /* MOD_VEX_W_0_0F46_P_2_LEN_1 */
8383 { "kxnorb", { MaskG
, MaskVex
, MaskE
}, 0 },
8386 /* MOD_VEX_W_1_0F46_P_2_LEN_1 */
8388 { "kxnord", { MaskG
, MaskVex
, MaskE
}, 0 },
8391 /* MOD_VEX_W_0_0F47_P_0_LEN_1 */
8393 { "kxorw", { MaskG
, MaskVex
, MaskE
}, 0 },
8396 /* MOD_VEX_W_1_0F47_P_0_LEN_1 */
8398 { "kxorq", { MaskG
, MaskVex
, MaskE
}, 0 },
8401 /* MOD_VEX_W_0_0F47_P_2_LEN_1 */
8403 { "kxorb", { MaskG
, MaskVex
, MaskE
}, 0 },
8406 /* MOD_VEX_W_1_0F47_P_2_LEN_1 */
8408 { "kxord", { MaskG
, MaskVex
, MaskE
}, 0 },
8411 /* MOD_VEX_W_0_0F4A_P_0_LEN_1 */
8413 { "kaddw", { MaskG
, MaskVex
, MaskE
}, 0 },
8416 /* MOD_VEX_W_1_0F4A_P_0_LEN_1 */
8418 { "kaddq", { MaskG
, MaskVex
, MaskE
}, 0 },
8421 /* MOD_VEX_W_0_0F4A_P_2_LEN_1 */
8423 { "kaddb", { MaskG
, MaskVex
, MaskE
}, 0 },
8426 /* MOD_VEX_W_1_0F4A_P_2_LEN_1 */
8428 { "kaddd", { MaskG
, MaskVex
, MaskE
}, 0 },
8431 /* MOD_VEX_W_0_0F4B_P_0_LEN_1 */
8433 { "kunpckwd", { MaskG
, MaskVex
, MaskE
}, 0 },
8436 /* MOD_VEX_W_1_0F4B_P_0_LEN_1 */
8438 { "kunpckdq", { MaskG
, MaskVex
, MaskE
}, 0 },
8441 /* MOD_VEX_W_0_0F4B_P_2_LEN_1 */
8443 { "kunpckbw", { MaskG
, MaskVex
, MaskE
}, 0 },
8448 { "vmovmskpX", { Gdq
, XS
}, PREFIX_OPCODE
},
8451 /* MOD_VEX_0F71_REG_2 */
8453 { "vpsrlw", { Vex
, XS
, Ib
}, PREFIX_DATA
},
8456 /* MOD_VEX_0F71_REG_4 */
8458 { "vpsraw", { Vex
, XS
, Ib
}, PREFIX_DATA
},
8461 /* MOD_VEX_0F71_REG_6 */
8463 { "vpsllw", { Vex
, XS
, Ib
}, PREFIX_DATA
},
8466 /* MOD_VEX_0F72_REG_2 */
8468 { "vpsrld", { Vex
, XS
, Ib
}, PREFIX_DATA
},
8471 /* MOD_VEX_0F72_REG_4 */
8473 { "vpsrad", { Vex
, XS
, Ib
}, PREFIX_DATA
},
8476 /* MOD_VEX_0F72_REG_6 */
8478 { "vpslld", { Vex
, XS
, Ib
}, PREFIX_DATA
},
8481 /* MOD_VEX_0F73_REG_2 */
8483 { "vpsrlq", { Vex
, XS
, Ib
}, PREFIX_DATA
},
8486 /* MOD_VEX_0F73_REG_3 */
8488 { "vpsrldq", { Vex
, XS
, Ib
}, PREFIX_DATA
},
8491 /* MOD_VEX_0F73_REG_6 */
8493 { "vpsllq", { Vex
, XS
, Ib
}, PREFIX_DATA
},
8496 /* MOD_VEX_0F73_REG_7 */
8498 { "vpslldq", { Vex
, XS
, Ib
}, PREFIX_DATA
},
8501 /* MOD_VEX_W_0_0F91_P_0_LEN_0 */
8502 { "kmovw", { Ew
, MaskG
}, 0 },
8506 /* MOD_VEX_W_0_0F91_P_0_LEN_0 */
8507 { "kmovq", { Eq
, MaskG
}, 0 },
8511 /* MOD_VEX_W_0_0F91_P_2_LEN_0 */
8512 { "kmovb", { Eb
, MaskG
}, 0 },
8516 /* MOD_VEX_W_0_0F91_P_2_LEN_0 */
8517 { "kmovd", { Ed
, MaskG
}, 0 },
8521 /* MOD_VEX_W_0_0F92_P_0_LEN_0 */
8523 { "kmovw", { MaskG
, Edq
}, 0 },
8526 /* MOD_VEX_W_0_0F92_P_2_LEN_0 */
8528 { "kmovb", { MaskG
, Edq
}, 0 },
8531 /* MOD_VEX_0F92_P_3_LEN_0 */
8533 { "kmovK", { MaskG
, Edq
}, 0 },
8536 /* MOD_VEX_W_0_0F93_P_0_LEN_0 */
8538 { "kmovw", { Gdq
, MaskE
}, 0 },
8541 /* MOD_VEX_W_0_0F93_P_2_LEN_0 */
8543 { "kmovb", { Gdq
, MaskE
}, 0 },
8546 /* MOD_VEX_0F93_P_3_LEN_0 */
8548 { "kmovK", { Gdq
, MaskE
}, 0 },
8551 /* MOD_VEX_W_0_0F98_P_0_LEN_0 */
8553 { "kortestw", { MaskG
, MaskE
}, 0 },
8556 /* MOD_VEX_W_1_0F98_P_0_LEN_0 */
8558 { "kortestq", { MaskG
, MaskE
}, 0 },
8561 /* MOD_VEX_W_0_0F98_P_2_LEN_0 */
8563 { "kortestb", { MaskG
, MaskE
}, 0 },
8566 /* MOD_VEX_W_1_0F98_P_2_LEN_0 */
8568 { "kortestd", { MaskG
, MaskE
}, 0 },
8571 /* MOD_VEX_W_0_0F99_P_0_LEN_0 */
8573 { "ktestw", { MaskG
, MaskE
}, 0 },
8576 /* MOD_VEX_W_1_0F99_P_0_LEN_0 */
8578 { "ktestq", { MaskG
, MaskE
}, 0 },
8581 /* MOD_VEX_W_0_0F99_P_2_LEN_0 */
8583 { "ktestb", { MaskG
, MaskE
}, 0 },
8586 /* MOD_VEX_W_1_0F99_P_2_LEN_0 */
8588 { "ktestd", { MaskG
, MaskE
}, 0 },
8591 /* MOD_VEX_0FAE_REG_2 */
8592 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_2_M_0
) },
8595 /* MOD_VEX_0FAE_REG_3 */
8596 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_3_M_0
) },
8601 { "vpmovmskb", { Gdq
, XS
}, PREFIX_DATA
},
8605 { "vmovntdq", { Mx
, XM
}, PREFIX_DATA
},
8608 /* MOD_VEX_0FF0_PREFIX_3 */
8609 { "vlddqu", { XM
, M
}, 0 },
8612 /* MOD_VEX_0F381A */
8613 { VEX_LEN_TABLE (VEX_LEN_0F381A_M_0
) },
8616 /* MOD_VEX_0F382A */
8617 { "vmovntdqa", { XM
, Mx
}, PREFIX_DATA
},
8620 /* MOD_VEX_0F382C */
8621 { VEX_W_TABLE (VEX_W_0F382C_M_0
) },
8624 /* MOD_VEX_0F382D */
8625 { VEX_W_TABLE (VEX_W_0F382D_M_0
) },
8628 /* MOD_VEX_0F382E */
8629 { VEX_W_TABLE (VEX_W_0F382E_M_0
) },
8632 /* MOD_VEX_0F382F */
8633 { VEX_W_TABLE (VEX_W_0F382F_M_0
) },
8636 /* MOD_VEX_0F385A */
8637 { VEX_LEN_TABLE (VEX_LEN_0F385A_M_0
) },
8640 /* MOD_VEX_0F388C */
8641 { "vpmaskmov%DQ", { XM
, Vex
, Mx
}, PREFIX_DATA
},
8644 /* MOD_VEX_0F388E */
8645 { "vpmaskmov%DQ", { Mx
, Vex
, XM
}, PREFIX_DATA
},
8648 /* MOD_VEX_0F3A30_L_0 */
8650 { "kshiftr%BW", { MaskG
, MaskE
, Ib
}, PREFIX_DATA
},
8653 /* MOD_VEX_0F3A31_L_0 */
8655 { "kshiftr%DQ", { MaskG
, MaskE
, Ib
}, PREFIX_DATA
},
8658 /* MOD_VEX_0F3A32_L_0 */
8660 { "kshiftl%BW", { MaskG
, MaskE
, Ib
}, PREFIX_DATA
},
8663 /* MOD_VEX_0F3A33_L_0 */
8665 { "kshiftl%DQ", { MaskG
, MaskE
, Ib
}, PREFIX_DATA
},
8668 /* MOD_VEX_0FXOP_09_12 */
8670 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_12_M_1
) },
8673 #include "i386-dis-evex-mod.h"
8676 static const struct dis386 rm_table
[][8] = {
8679 { "xabort", { Skip_MODRM
, Ib
}, 0 },
8683 { "xbeginT", { Skip_MODRM
, Jdqw
}, 0 },
8687 { "enclv", { Skip_MODRM
}, 0 },
8688 { "vmcall", { Skip_MODRM
}, 0 },
8689 { "vmlaunch", { Skip_MODRM
}, 0 },
8690 { "vmresume", { Skip_MODRM
}, 0 },
8691 { "vmxoff", { Skip_MODRM
}, 0 },
8692 { "pconfig", { Skip_MODRM
}, 0 },
8696 { "monitor", { { OP_Monitor
, 0 } }, 0 },
8697 { "mwait", { { OP_Mwait
, 0 } }, 0 },
8698 { "clac", { Skip_MODRM
}, 0 },
8699 { "stac", { Skip_MODRM
}, 0 },
8703 { "encls", { Skip_MODRM
}, 0 },
8707 { "xgetbv", { Skip_MODRM
}, 0 },
8708 { "xsetbv", { Skip_MODRM
}, 0 },
8711 { "vmfunc", { Skip_MODRM
}, 0 },
8712 { "xend", { Skip_MODRM
}, 0 },
8713 { "xtest", { Skip_MODRM
}, 0 },
8714 { "enclu", { Skip_MODRM
}, 0 },
8718 { "vmrun", { Skip_MODRM
}, 0 },
8719 { PREFIX_TABLE (PREFIX_0F01_REG_3_RM_1
) },
8720 { "vmload", { Skip_MODRM
}, 0 },
8721 { "vmsave", { Skip_MODRM
}, 0 },
8722 { "stgi", { Skip_MODRM
}, 0 },
8723 { "clgi", { Skip_MODRM
}, 0 },
8724 { "skinit", { Skip_MODRM
}, 0 },
8725 { "invlpga", { Skip_MODRM
}, 0 },
8728 /* RM_0F01_REG_5_MOD_3 */
8729 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_0
) },
8730 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_1
) },
8731 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_2
) },
8735 { "rdpkru", { Skip_MODRM
}, 0 },
8736 { "wrpkru", { Skip_MODRM
}, 0 },
8739 /* RM_0F01_REG_7_MOD_3 */
8740 { "swapgs", { Skip_MODRM
}, 0 },
8741 { "rdtscp", { Skip_MODRM
}, 0 },
8742 { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_2
) },
8743 { "mwaitx", { { OP_Mwait
, eBX_reg
} }, PREFIX_OPCODE
},
8744 { "clzero", { Skip_MODRM
}, 0 },
8745 { "rdpru", { Skip_MODRM
}, 0 },
8748 /* RM_0F1E_P_1_MOD_3_REG_7 */
8749 { "nopQ", { Ev
}, 0 },
8750 { "nopQ", { Ev
}, 0 },
8751 { "endbr64", { Skip_MODRM
}, PREFIX_OPCODE
},
8752 { "endbr32", { Skip_MODRM
}, PREFIX_OPCODE
},
8753 { "nopQ", { Ev
}, 0 },
8754 { "nopQ", { Ev
}, 0 },
8755 { "nopQ", { Ev
}, 0 },
8756 { "nopQ", { Ev
}, 0 },
8759 /* RM_0FAE_REG_6_MOD_3 */
8760 { "mfence", { Skip_MODRM
}, 0 },
8763 /* RM_0FAE_REG_7_MOD_3 */
8764 { "sfence", { Skip_MODRM
}, 0 },
8768 /* RM_VEX_0F3849_X86_64_P_0_W_0_M_1_R_0 */
8769 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_0_W_0_M_1_REG_0_RM_0
) },
8773 #define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
8775 /* We use the high bit to indicate different name for the same
8777 #define REP_PREFIX (0xf3 | 0x100)
8778 #define XACQUIRE_PREFIX (0xf2 | 0x200)
8779 #define XRELEASE_PREFIX (0xf3 | 0x400)
8780 #define BND_PREFIX (0xf2 | 0x400)
8781 #define NOTRACK_PREFIX (0x3e | 0x100)
8783 /* Remember if the current op is a jump instruction. */
8784 static bfd_boolean op_is_jump
= FALSE
;
8789 int newrex
, i
, length
;
8794 last_lock_prefix
= -1;
8795 last_repz_prefix
= -1;
8796 last_repnz_prefix
= -1;
8797 last_data_prefix
= -1;
8798 last_addr_prefix
= -1;
8799 last_rex_prefix
= -1;
8800 last_seg_prefix
= -1;
8802 active_seg_prefix
= 0;
8803 for (i
= 0; i
< (int) ARRAY_SIZE (all_prefixes
); i
++)
8804 all_prefixes
[i
] = 0;
8807 /* The maximum instruction length is 15bytes. */
8808 while (length
< MAX_CODE_LENGTH
- 1)
8810 FETCH_DATA (the_info
, codep
+ 1);
8814 /* REX prefixes family. */
8831 if (address_mode
== mode_64bit
)
8835 last_rex_prefix
= i
;
8838 prefixes
|= PREFIX_REPZ
;
8839 last_repz_prefix
= i
;
8842 prefixes
|= PREFIX_REPNZ
;
8843 last_repnz_prefix
= i
;
8846 prefixes
|= PREFIX_LOCK
;
8847 last_lock_prefix
= i
;
8850 prefixes
|= PREFIX_CS
;
8851 last_seg_prefix
= i
;
8852 active_seg_prefix
= PREFIX_CS
;
8855 prefixes
|= PREFIX_SS
;
8856 last_seg_prefix
= i
;
8857 active_seg_prefix
= PREFIX_SS
;
8860 prefixes
|= PREFIX_DS
;
8861 last_seg_prefix
= i
;
8862 active_seg_prefix
= PREFIX_DS
;
8865 prefixes
|= PREFIX_ES
;
8866 last_seg_prefix
= i
;
8867 active_seg_prefix
= PREFIX_ES
;
8870 prefixes
|= PREFIX_FS
;
8871 last_seg_prefix
= i
;
8872 active_seg_prefix
= PREFIX_FS
;
8875 prefixes
|= PREFIX_GS
;
8876 last_seg_prefix
= i
;
8877 active_seg_prefix
= PREFIX_GS
;
8880 prefixes
|= PREFIX_DATA
;
8881 last_data_prefix
= i
;
8884 prefixes
|= PREFIX_ADDR
;
8885 last_addr_prefix
= i
;
8888 /* fwait is really an instruction. If there are prefixes
8889 before the fwait, they belong to the fwait, *not* to the
8890 following instruction. */
8892 if (prefixes
|| rex
)
8894 prefixes
|= PREFIX_FWAIT
;
8896 /* This ensures that the previous REX prefixes are noticed
8897 as unused prefixes, as in the return case below. */
8901 prefixes
= PREFIX_FWAIT
;
8906 /* Rex is ignored when followed by another prefix. */
8912 if (*codep
!= FWAIT_OPCODE
)
8913 all_prefixes
[i
++] = *codep
;
8921 /* Return the name of the prefix byte PREF, or NULL if PREF is not a
8925 prefix_name (int pref
, int sizeflag
)
8927 static const char *rexes
[16] =
8932 "rex.XB", /* 0x43 */
8934 "rex.RB", /* 0x45 */
8935 "rex.RX", /* 0x46 */
8936 "rex.RXB", /* 0x47 */
8938 "rex.WB", /* 0x49 */
8939 "rex.WX", /* 0x4a */
8940 "rex.WXB", /* 0x4b */
8941 "rex.WR", /* 0x4c */
8942 "rex.WRB", /* 0x4d */
8943 "rex.WRX", /* 0x4e */
8944 "rex.WRXB", /* 0x4f */
8949 /* REX prefixes family. */
8966 return rexes
[pref
- 0x40];
8986 return (sizeflag
& DFLAG
) ? "data16" : "data32";
8988 if (address_mode
== mode_64bit
)
8989 return (sizeflag
& AFLAG
) ? "addr32" : "addr64";
8991 return (sizeflag
& AFLAG
) ? "addr16" : "addr32";
8996 case XACQUIRE_PREFIX
:
8998 case XRELEASE_PREFIX
:
9002 case NOTRACK_PREFIX
:
9009 static char op_out
[MAX_OPERANDS
][100];
9010 static int op_ad
, op_index
[MAX_OPERANDS
];
9011 static int two_source_ops
;
9012 static bfd_vma op_address
[MAX_OPERANDS
];
9013 static bfd_vma op_riprel
[MAX_OPERANDS
];
9014 static bfd_vma start_pc
;
9017 * On the 386's of 1988, the maximum length of an instruction is 15 bytes.
9018 * (see topic "Redundant prefixes" in the "Differences from 8086"
9019 * section of the "Virtual 8086 Mode" chapter.)
9020 * 'pc' should be the address of this instruction, it will
9021 * be used to print the target address if this is a relative jump or call
9022 * The function returns the length of this instruction in bytes.
9025 static char intel_syntax
;
9026 static char intel_mnemonic
= !SYSV386_COMPAT
;
9027 static char open_char
;
9028 static char close_char
;
9029 static char separator_char
;
9030 static char scale_char
;
9038 static enum x86_64_isa isa64
;
9040 /* Here for backwards compatibility. When gdb stops using
9041 print_insn_i386_att and print_insn_i386_intel these functions can
9042 disappear, and print_insn_i386 be merged into print_insn. */
9044 print_insn_i386_att (bfd_vma pc
, disassemble_info
*info
)
9048 return print_insn (pc
, info
);
9052 print_insn_i386_intel (bfd_vma pc
, disassemble_info
*info
)
9056 return print_insn (pc
, info
);
9060 print_insn_i386 (bfd_vma pc
, disassemble_info
*info
)
9064 return print_insn (pc
, info
);
9068 print_i386_disassembler_options (FILE *stream
)
9070 fprintf (stream
, _("\n\
9071 The following i386/x86-64 specific disassembler options are supported for use\n\
9072 with the -M switch (multiple options should be separated by commas):\n"));
9074 fprintf (stream
, _(" x86-64 Disassemble in 64bit mode\n"));
9075 fprintf (stream
, _(" i386 Disassemble in 32bit mode\n"));
9076 fprintf (stream
, _(" i8086 Disassemble in 16bit mode\n"));
9077 fprintf (stream
, _(" att Display instruction in AT&T syntax\n"));
9078 fprintf (stream
, _(" intel Display instruction in Intel syntax\n"));
9079 fprintf (stream
, _(" att-mnemonic\n"
9080 " Display instruction in AT&T mnemonic\n"));
9081 fprintf (stream
, _(" intel-mnemonic\n"
9082 " Display instruction in Intel mnemonic\n"));
9083 fprintf (stream
, _(" addr64 Assume 64bit address size\n"));
9084 fprintf (stream
, _(" addr32 Assume 32bit address size\n"));
9085 fprintf (stream
, _(" addr16 Assume 16bit address size\n"));
9086 fprintf (stream
, _(" data32 Assume 32bit data size\n"));
9087 fprintf (stream
, _(" data16 Assume 16bit data size\n"));
9088 fprintf (stream
, _(" suffix Always display instruction suffix in AT&T syntax\n"));
9089 fprintf (stream
, _(" amd64 Display instruction in AMD64 ISA\n"));
9090 fprintf (stream
, _(" intel64 Display instruction in Intel64 ISA\n"));
9094 static const struct dis386 bad_opcode
= { "(bad)", { XX
}, 0 };
9096 /* Get a pointer to struct dis386 with a valid name. */
9098 static const struct dis386
*
9099 get_valid_dis386 (const struct dis386
*dp
, disassemble_info
*info
)
9101 int vindex
, vex_table_index
;
9103 if (dp
->name
!= NULL
)
9106 switch (dp
->op
[0].bytemode
)
9109 dp
= ®_table
[dp
->op
[1].bytemode
][modrm
.reg
];
9113 vindex
= modrm
.mod
== 0x3 ? 1 : 0;
9114 dp
= &mod_table
[dp
->op
[1].bytemode
][vindex
];
9118 dp
= &rm_table
[dp
->op
[1].bytemode
][modrm
.rm
];
9121 case USE_PREFIX_TABLE
:
9124 /* The prefix in VEX is implicit. */
9130 case REPE_PREFIX_OPCODE
:
9133 case DATA_PREFIX_OPCODE
:
9136 case REPNE_PREFIX_OPCODE
:
9146 int last_prefix
= -1;
9149 /* We check PREFIX_REPNZ and PREFIX_REPZ before PREFIX_DATA.
9150 When there are multiple PREFIX_REPNZ and PREFIX_REPZ, the
9152 if ((prefixes
& (PREFIX_REPZ
| PREFIX_REPNZ
)) != 0)
9154 if (last_repz_prefix
> last_repnz_prefix
)
9157 prefix
= PREFIX_REPZ
;
9158 last_prefix
= last_repz_prefix
;
9163 prefix
= PREFIX_REPNZ
;
9164 last_prefix
= last_repnz_prefix
;
9167 /* Check if prefix should be ignored. */
9168 if ((((prefix_table
[dp
->op
[1].bytemode
][vindex
].prefix_requirement
9169 & PREFIX_IGNORED
) >> PREFIX_IGNORED_SHIFT
)
9174 if (vindex
== 0 && (prefixes
& PREFIX_DATA
) != 0)
9177 prefix
= PREFIX_DATA
;
9178 last_prefix
= last_data_prefix
;
9183 used_prefixes
|= prefix
;
9184 all_prefixes
[last_prefix
] = 0;
9187 dp
= &prefix_table
[dp
->op
[1].bytemode
][vindex
];
9190 case USE_X86_64_TABLE
:
9191 vindex
= address_mode
== mode_64bit
? 1 : 0;
9192 dp
= &x86_64_table
[dp
->op
[1].bytemode
][vindex
];
9195 case USE_3BYTE_TABLE
:
9196 FETCH_DATA (info
, codep
+ 2);
9198 dp
= &three_byte_table
[dp
->op
[1].bytemode
][vindex
];
9200 modrm
.mod
= (*codep
>> 6) & 3;
9201 modrm
.reg
= (*codep
>> 3) & 7;
9202 modrm
.rm
= *codep
& 7;
9205 case USE_VEX_LEN_TABLE
:
9222 dp
= &vex_len_table
[dp
->op
[1].bytemode
][vindex
];
9225 case USE_EVEX_LEN_TABLE
:
9245 dp
= &evex_len_table
[dp
->op
[1].bytemode
][vindex
];
9248 case USE_XOP_8F_TABLE
:
9249 FETCH_DATA (info
, codep
+ 3);
9250 rex
= ~(*codep
>> 5) & 0x7;
9252 /* VEX_TABLE_INDEX is the mmmmm part of the XOP byte 1 "RCB.mmmmm". */
9253 switch ((*codep
& 0x1f))
9259 vex_table_index
= XOP_08
;
9262 vex_table_index
= XOP_09
;
9265 vex_table_index
= XOP_0A
;
9269 vex
.w
= *codep
& 0x80;
9270 if (vex
.w
&& address_mode
== mode_64bit
)
9273 vex
.register_specifier
= (~(*codep
>> 3)) & 0xf;
9274 if (address_mode
!= mode_64bit
)
9276 /* In 16/32-bit mode REX_B is silently ignored. */
9280 vex
.length
= (*codep
& 0x4) ? 256 : 128;
9281 switch ((*codep
& 0x3))
9286 vex
.prefix
= DATA_PREFIX_OPCODE
;
9289 vex
.prefix
= REPE_PREFIX_OPCODE
;
9292 vex
.prefix
= REPNE_PREFIX_OPCODE
;
9298 dp
= &xop_table
[vex_table_index
][vindex
];
9301 FETCH_DATA (info
, codep
+ 1);
9302 modrm
.mod
= (*codep
>> 6) & 3;
9303 modrm
.reg
= (*codep
>> 3) & 7;
9304 modrm
.rm
= *codep
& 7;
9306 /* No XOP encoding so far allows for a non-zero embedded prefix. Avoid
9307 having to decode the bits for every otherwise valid encoding. */
9312 case USE_VEX_C4_TABLE
:
9314 FETCH_DATA (info
, codep
+ 3);
9315 rex
= ~(*codep
>> 5) & 0x7;
9316 switch ((*codep
& 0x1f))
9322 vex_table_index
= VEX_0F
;
9325 vex_table_index
= VEX_0F38
;
9328 vex_table_index
= VEX_0F3A
;
9332 vex
.w
= *codep
& 0x80;
9333 if (address_mode
== mode_64bit
)
9340 /* For the 3-byte VEX prefix in 32-bit mode, the REX_B bit
9341 is ignored, other REX bits are 0 and the highest bit in
9342 VEX.vvvv is also ignored (but we mustn't clear it here). */
9345 vex
.register_specifier
= (~(*codep
>> 3)) & 0xf;
9346 vex
.length
= (*codep
& 0x4) ? 256 : 128;
9347 switch ((*codep
& 0x3))
9352 vex
.prefix
= DATA_PREFIX_OPCODE
;
9355 vex
.prefix
= REPE_PREFIX_OPCODE
;
9358 vex
.prefix
= REPNE_PREFIX_OPCODE
;
9364 dp
= &vex_table
[vex_table_index
][vindex
];
9366 /* There is no MODRM byte for VEX0F 77. */
9367 if (vex_table_index
!= VEX_0F
|| vindex
!= 0x77)
9369 FETCH_DATA (info
, codep
+ 1);
9370 modrm
.mod
= (*codep
>> 6) & 3;
9371 modrm
.reg
= (*codep
>> 3) & 7;
9372 modrm
.rm
= *codep
& 7;
9376 case USE_VEX_C5_TABLE
:
9378 FETCH_DATA (info
, codep
+ 2);
9379 rex
= (*codep
& 0x80) ? 0 : REX_R
;
9381 /* For the 2-byte VEX prefix in 32-bit mode, the highest bit in
9383 vex
.register_specifier
= (~(*codep
>> 3)) & 0xf;
9384 vex
.length
= (*codep
& 0x4) ? 256 : 128;
9385 switch ((*codep
& 0x3))
9390 vex
.prefix
= DATA_PREFIX_OPCODE
;
9393 vex
.prefix
= REPE_PREFIX_OPCODE
;
9396 vex
.prefix
= REPNE_PREFIX_OPCODE
;
9402 dp
= &vex_table
[dp
->op
[1].bytemode
][vindex
];
9404 /* There is no MODRM byte for VEX 77. */
9407 FETCH_DATA (info
, codep
+ 1);
9408 modrm
.mod
= (*codep
>> 6) & 3;
9409 modrm
.reg
= (*codep
>> 3) & 7;
9410 modrm
.rm
= *codep
& 7;
9414 case USE_VEX_W_TABLE
:
9418 dp
= &vex_w_table
[dp
->op
[1].bytemode
][vex
.w
? 1 : 0];
9421 case USE_EVEX_TABLE
:
9425 FETCH_DATA (info
, codep
+ 4);
9426 /* The first byte after 0x62. */
9427 rex
= ~(*codep
>> 5) & 0x7;
9428 vex
.r
= *codep
& 0x10;
9429 switch ((*codep
& 0xf))
9434 vex_table_index
= EVEX_0F
;
9437 vex_table_index
= EVEX_0F38
;
9440 vex_table_index
= EVEX_0F3A
;
9444 /* The second byte after 0x62. */
9446 vex
.w
= *codep
& 0x80;
9447 if (vex
.w
&& address_mode
== mode_64bit
)
9450 vex
.register_specifier
= (~(*codep
>> 3)) & 0xf;
9453 if (!(*codep
& 0x4))
9456 switch ((*codep
& 0x3))
9461 vex
.prefix
= DATA_PREFIX_OPCODE
;
9464 vex
.prefix
= REPE_PREFIX_OPCODE
;
9467 vex
.prefix
= REPNE_PREFIX_OPCODE
;
9471 /* The third byte after 0x62. */
9474 /* Remember the static rounding bits. */
9475 vex
.ll
= (*codep
>> 5) & 3;
9476 vex
.b
= (*codep
& 0x10) != 0;
9478 vex
.v
= *codep
& 0x8;
9479 vex
.mask_register_specifier
= *codep
& 0x7;
9480 vex
.zeroing
= *codep
& 0x80;
9482 if (address_mode
!= mode_64bit
)
9484 /* In 16/32-bit mode silently ignore following bits. */
9493 dp
= &evex_table
[vex_table_index
][vindex
];
9495 FETCH_DATA (info
, codep
+ 1);
9496 modrm
.mod
= (*codep
>> 6) & 3;
9497 modrm
.reg
= (*codep
>> 3) & 7;
9498 modrm
.rm
= *codep
& 7;
9500 /* Set vector length. */
9501 if (modrm
.mod
== 3 && vex
.b
)
9530 if (dp
->name
!= NULL
)
9533 return get_valid_dis386 (dp
, info
);
9537 get_sib (disassemble_info
*info
, int sizeflag
)
9539 /* If modrm.mod == 3, operand must be register. */
9541 && ((sizeflag
& AFLAG
) || address_mode
== mode_64bit
)
9545 FETCH_DATA (info
, codep
+ 2);
9546 sib
.index
= (codep
[1] >> 3) & 7;
9547 sib
.scale
= (codep
[1] >> 6) & 3;
9548 sib
.base
= codep
[1] & 7;
9553 print_insn (bfd_vma pc
, disassemble_info
*info
)
9555 const struct dis386
*dp
;
9557 char *op_txt
[MAX_OPERANDS
];
9559 int sizeflag
, orig_sizeflag
;
9561 struct dis_private priv
;
9564 priv
.orig_sizeflag
= AFLAG
| DFLAG
;
9565 if ((info
->mach
& bfd_mach_i386_i386
) != 0)
9566 address_mode
= mode_32bit
;
9567 else if (info
->mach
== bfd_mach_i386_i8086
)
9569 address_mode
= mode_16bit
;
9570 priv
.orig_sizeflag
= 0;
9573 address_mode
= mode_64bit
;
9575 if (intel_syntax
== (char) -1)
9576 intel_syntax
= (info
->mach
& bfd_mach_i386_intel_syntax
) != 0;
9578 for (p
= info
->disassembler_options
; p
!= NULL
; )
9580 if (CONST_STRNEQ (p
, "amd64"))
9582 else if (CONST_STRNEQ (p
, "intel64"))
9584 else if (CONST_STRNEQ (p
, "x86-64"))
9586 address_mode
= mode_64bit
;
9587 priv
.orig_sizeflag
|= AFLAG
| DFLAG
;
9589 else if (CONST_STRNEQ (p
, "i386"))
9591 address_mode
= mode_32bit
;
9592 priv
.orig_sizeflag
|= AFLAG
| DFLAG
;
9594 else if (CONST_STRNEQ (p
, "i8086"))
9596 address_mode
= mode_16bit
;
9597 priv
.orig_sizeflag
&= ~(AFLAG
| DFLAG
);
9599 else if (CONST_STRNEQ (p
, "intel"))
9602 if (CONST_STRNEQ (p
+ 5, "-mnemonic"))
9605 else if (CONST_STRNEQ (p
, "att"))
9608 if (CONST_STRNEQ (p
+ 3, "-mnemonic"))
9611 else if (CONST_STRNEQ (p
, "addr"))
9613 if (address_mode
== mode_64bit
)
9615 if (p
[4] == '3' && p
[5] == '2')
9616 priv
.orig_sizeflag
&= ~AFLAG
;
9617 else if (p
[4] == '6' && p
[5] == '4')
9618 priv
.orig_sizeflag
|= AFLAG
;
9622 if (p
[4] == '1' && p
[5] == '6')
9623 priv
.orig_sizeflag
&= ~AFLAG
;
9624 else if (p
[4] == '3' && p
[5] == '2')
9625 priv
.orig_sizeflag
|= AFLAG
;
9628 else if (CONST_STRNEQ (p
, "data"))
9630 if (p
[4] == '1' && p
[5] == '6')
9631 priv
.orig_sizeflag
&= ~DFLAG
;
9632 else if (p
[4] == '3' && p
[5] == '2')
9633 priv
.orig_sizeflag
|= DFLAG
;
9635 else if (CONST_STRNEQ (p
, "suffix"))
9636 priv
.orig_sizeflag
|= SUFFIX_ALWAYS
;
9638 p
= strchr (p
, ',');
9643 if (address_mode
== mode_64bit
&& sizeof (bfd_vma
) < 8)
9645 (*info
->fprintf_func
) (info
->stream
,
9646 _("64-bit address is disabled"));
9652 names64
= intel_names64
;
9653 names32
= intel_names32
;
9654 names16
= intel_names16
;
9655 names8
= intel_names8
;
9656 names8rex
= intel_names8rex
;
9657 names_seg
= intel_names_seg
;
9658 names_mm
= intel_names_mm
;
9659 names_bnd
= intel_names_bnd
;
9660 names_xmm
= intel_names_xmm
;
9661 names_ymm
= intel_names_ymm
;
9662 names_zmm
= intel_names_zmm
;
9663 names_tmm
= intel_names_tmm
;
9664 index64
= intel_index64
;
9665 index32
= intel_index32
;
9666 names_mask
= intel_names_mask
;
9667 index16
= intel_index16
;
9670 separator_char
= '+';
9675 names64
= att_names64
;
9676 names32
= att_names32
;
9677 names16
= att_names16
;
9678 names8
= att_names8
;
9679 names8rex
= att_names8rex
;
9680 names_seg
= att_names_seg
;
9681 names_mm
= att_names_mm
;
9682 names_bnd
= att_names_bnd
;
9683 names_xmm
= att_names_xmm
;
9684 names_ymm
= att_names_ymm
;
9685 names_zmm
= att_names_zmm
;
9686 names_tmm
= att_names_tmm
;
9687 index64
= att_index64
;
9688 index32
= att_index32
;
9689 names_mask
= att_names_mask
;
9690 index16
= att_index16
;
9693 separator_char
= ',';
9697 /* The output looks better if we put 7 bytes on a line, since that
9698 puts most long word instructions on a single line. Use 8 bytes
9700 if ((info
->mach
& bfd_mach_l1om
) != 0)
9701 info
->bytes_per_line
= 8;
9703 info
->bytes_per_line
= 7;
9705 info
->private_data
= &priv
;
9706 priv
.max_fetched
= priv
.the_buffer
;
9707 priv
.insn_start
= pc
;
9710 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
9718 start_codep
= priv
.the_buffer
;
9719 codep
= priv
.the_buffer
;
9721 if (OPCODES_SIGSETJMP (priv
.bailout
) != 0)
9725 /* Getting here means we tried for data but didn't get it. That
9726 means we have an incomplete instruction of some sort. Just
9727 print the first byte as a prefix or a .byte pseudo-op. */
9728 if (codep
> priv
.the_buffer
)
9730 name
= prefix_name (priv
.the_buffer
[0], priv
.orig_sizeflag
);
9732 (*info
->fprintf_func
) (info
->stream
, "%s", name
);
9735 /* Just print the first byte as a .byte instruction. */
9736 (*info
->fprintf_func
) (info
->stream
, ".byte 0x%x",
9737 (unsigned int) priv
.the_buffer
[0]);
9747 sizeflag
= priv
.orig_sizeflag
;
9749 if (!ckprefix () || rex_used
)
9751 /* Too many prefixes or unused REX prefixes. */
9753 i
< (int) ARRAY_SIZE (all_prefixes
) && all_prefixes
[i
];
9755 (*info
->fprintf_func
) (info
->stream
, "%s%s",
9757 prefix_name (all_prefixes
[i
], sizeflag
));
9763 FETCH_DATA (info
, codep
+ 1);
9764 two_source_ops
= (*codep
== 0x62) || (*codep
== 0xc8);
9766 if (((prefixes
& PREFIX_FWAIT
)
9767 && ((*codep
< 0xd8) || (*codep
> 0xdf))))
9769 /* Handle prefixes before fwait. */
9770 for (i
= 0; i
< fwait_prefix
&& all_prefixes
[i
];
9772 (*info
->fprintf_func
) (info
->stream
, "%s ",
9773 prefix_name (all_prefixes
[i
], sizeflag
));
9774 (*info
->fprintf_func
) (info
->stream
, "fwait");
9780 unsigned char threebyte
;
9783 FETCH_DATA (info
, codep
+ 1);
9785 dp
= &dis386_twobyte
[threebyte
];
9786 need_modrm
= twobyte_has_modrm
[*codep
];
9791 dp
= &dis386
[*codep
];
9792 need_modrm
= onebyte_has_modrm
[*codep
];
9796 /* Save sizeflag for printing the extra prefixes later before updating
9797 it for mnemonic and operand processing. The prefix names depend
9798 only on the address mode. */
9799 orig_sizeflag
= sizeflag
;
9800 if (prefixes
& PREFIX_ADDR
)
9802 if ((prefixes
& PREFIX_DATA
))
9808 FETCH_DATA (info
, codep
+ 1);
9809 modrm
.mod
= (*codep
>> 6) & 3;
9810 modrm
.reg
= (*codep
>> 3) & 7;
9811 modrm
.rm
= *codep
& 7;
9815 memset (&vex
, 0, sizeof (vex
));
9817 if (dp
->name
== NULL
&& dp
->op
[0].bytemode
== FLOATCODE
)
9819 get_sib (info
, sizeflag
);
9824 dp
= get_valid_dis386 (dp
, info
);
9825 if (dp
!= NULL
&& putop (dp
->name
, sizeflag
) == 0)
9827 get_sib (info
, sizeflag
);
9828 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
9831 op_ad
= MAX_OPERANDS
- 1 - i
;
9833 (*dp
->op
[i
].rtn
) (dp
->op
[i
].bytemode
, sizeflag
);
9834 /* For EVEX instruction after the last operand masking
9835 should be printed. */
9836 if (i
== 0 && vex
.evex
)
9838 /* Don't print {%k0}. */
9839 if (vex
.mask_register_specifier
)
9842 oappend (names_mask
[vex
.mask_register_specifier
]);
9852 /* Clear instruction information. */
9855 the_info
->insn_info_valid
= 0;
9856 the_info
->branch_delay_insns
= 0;
9857 the_info
->data_size
= 0;
9858 the_info
->insn_type
= dis_noninsn
;
9859 the_info
->target
= 0;
9860 the_info
->target2
= 0;
9863 /* Reset jump operation indicator. */
9867 int jump_detection
= 0;
9869 /* Extract flags. */
9870 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
9872 if ((dp
->op
[i
].rtn
== OP_J
)
9873 || (dp
->op
[i
].rtn
== OP_indirE
))
9874 jump_detection
|= 1;
9875 else if ((dp
->op
[i
].rtn
== BND_Fixup
)
9876 || (!dp
->op
[i
].rtn
&& !dp
->op
[i
].bytemode
))
9877 jump_detection
|= 2;
9878 else if ((dp
->op
[i
].bytemode
== cond_jump_mode
)
9879 || (dp
->op
[i
].bytemode
== loop_jcxz_mode
))
9880 jump_detection
|= 4;
9883 /* Determine if this is a jump or branch. */
9884 if ((jump_detection
& 0x3) == 0x3)
9887 if (jump_detection
& 0x4)
9888 the_info
->insn_type
= dis_condbranch
;
9890 the_info
->insn_type
=
9891 (dp
->name
&& !strncmp(dp
->name
, "call", 4))
9892 ? dis_jsr
: dis_branch
;
9896 /* If VEX.vvvv and EVEX.vvvv are unused, they must be all 1s, which
9897 are all 0s in inverted form. */
9898 if (need_vex
&& vex
.register_specifier
!= 0)
9900 (*info
->fprintf_func
) (info
->stream
, "(bad)");
9901 return end_codep
- priv
.the_buffer
;
9904 switch (dp
->prefix_requirement
)
9907 /* If only the data prefix is marked as mandatory, its absence renders
9908 the encoding invalid. Most other PREFIX_OPCODE rules still apply. */
9909 if (need_vex
? !vex
.prefix
: !(prefixes
& PREFIX_DATA
))
9911 (*info
->fprintf_func
) (info
->stream
, "(bad)");
9912 return end_codep
- priv
.the_buffer
;
9914 used_prefixes
|= PREFIX_DATA
;
9917 /* If the mandatory PREFIX_REPZ/PREFIX_REPNZ/PREFIX_DATA prefix is
9918 unused, opcode is invalid. Since the PREFIX_DATA prefix may be
9919 used by putop and MMX/SSE operand and may be overridden by the
9920 PREFIX_REPZ/PREFIX_REPNZ fix, we check the PREFIX_DATA prefix
9923 ? vex
.prefix
== REPE_PREFIX_OPCODE
9924 || vex
.prefix
== REPNE_PREFIX_OPCODE
9926 & (PREFIX_REPZ
| PREFIX_REPNZ
)) != 0)
9928 & (PREFIX_REPZ
| PREFIX_REPNZ
)) == 0)
9930 ? vex
.prefix
== DATA_PREFIX_OPCODE
9932 & (PREFIX_REPZ
| PREFIX_REPNZ
| PREFIX_DATA
))
9934 && (used_prefixes
& PREFIX_DATA
) == 0))
9935 || (vex
.evex
&& dp
->prefix_requirement
!= PREFIX_DATA
9936 && !vex
.w
!= !(used_prefixes
& PREFIX_DATA
)))
9938 (*info
->fprintf_func
) (info
->stream
, "(bad)");
9939 return end_codep
- priv
.the_buffer
;
9944 /* Check if the REX prefix is used. */
9945 if ((rex
^ rex_used
) == 0 && !need_vex
&& last_rex_prefix
>= 0)
9946 all_prefixes
[last_rex_prefix
] = 0;
9948 /* Check if the SEG prefix is used. */
9949 if ((prefixes
& (PREFIX_CS
| PREFIX_SS
| PREFIX_DS
| PREFIX_ES
9950 | PREFIX_FS
| PREFIX_GS
)) != 0
9951 && (used_prefixes
& active_seg_prefix
) != 0)
9952 all_prefixes
[last_seg_prefix
] = 0;
9954 /* Check if the ADDR prefix is used. */
9955 if ((prefixes
& PREFIX_ADDR
) != 0
9956 && (used_prefixes
& PREFIX_ADDR
) != 0)
9957 all_prefixes
[last_addr_prefix
] = 0;
9959 /* Check if the DATA prefix is used. */
9960 if ((prefixes
& PREFIX_DATA
) != 0
9961 && (used_prefixes
& PREFIX_DATA
) != 0
9963 all_prefixes
[last_data_prefix
] = 0;
9965 /* Print the extra prefixes. */
9967 for (i
= 0; i
< (int) ARRAY_SIZE (all_prefixes
); i
++)
9968 if (all_prefixes
[i
])
9971 name
= prefix_name (all_prefixes
[i
], orig_sizeflag
);
9974 prefix_length
+= strlen (name
) + 1;
9975 (*info
->fprintf_func
) (info
->stream
, "%s ", name
);
9978 /* Check maximum code length. */
9979 if ((codep
- start_codep
) > MAX_CODE_LENGTH
)
9981 (*info
->fprintf_func
) (info
->stream
, "(bad)");
9982 return MAX_CODE_LENGTH
;
9985 obufp
= mnemonicendp
;
9986 for (i
= strlen (obuf
) + prefix_length
; i
< 6; i
++)
9989 (*info
->fprintf_func
) (info
->stream
, "%s", obuf
);
9991 /* The enter and bound instructions are printed with operands in the same
9992 order as the intel book; everything else is printed in reverse order. */
9993 if (intel_syntax
|| two_source_ops
)
9997 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
9998 op_txt
[i
] = op_out
[i
];
10000 if (intel_syntax
&& dp
&& dp
->op
[2].rtn
== OP_Rounding
10001 && dp
->op
[3].rtn
== OP_E
&& dp
->op
[4].rtn
== NULL
)
10003 op_txt
[2] = op_out
[3];
10004 op_txt
[3] = op_out
[2];
10007 for (i
= 0; i
< (MAX_OPERANDS
>> 1); ++i
)
10009 op_ad
= op_index
[i
];
10010 op_index
[i
] = op_index
[MAX_OPERANDS
- 1 - i
];
10011 op_index
[MAX_OPERANDS
- 1 - i
] = op_ad
;
10012 riprel
= op_riprel
[i
];
10013 op_riprel
[i
] = op_riprel
[MAX_OPERANDS
- 1 - i
];
10014 op_riprel
[MAX_OPERANDS
- 1 - i
] = riprel
;
10019 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
10020 op_txt
[MAX_OPERANDS
- 1 - i
] = op_out
[i
];
10024 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
10028 (*info
->fprintf_func
) (info
->stream
, ",");
10029 if (op_index
[i
] != -1 && !op_riprel
[i
])
10031 bfd_vma target
= (bfd_vma
) op_address
[op_index
[i
]];
10033 if (the_info
&& op_is_jump
)
10035 the_info
->insn_info_valid
= 1;
10036 the_info
->branch_delay_insns
= 0;
10037 the_info
->data_size
= 0;
10038 the_info
->target
= target
;
10039 the_info
->target2
= 0;
10041 (*info
->print_address_func
) (target
, info
);
10044 (*info
->fprintf_func
) (info
->stream
, "%s", op_txt
[i
]);
10048 for (i
= 0; i
< MAX_OPERANDS
; i
++)
10049 if (op_index
[i
] != -1 && op_riprel
[i
])
10051 (*info
->fprintf_func
) (info
->stream
, " # ");
10052 (*info
->print_address_func
) ((bfd_vma
) (start_pc
+ (codep
- start_codep
)
10053 + op_address
[op_index
[i
]]), info
);
10056 return codep
- priv
.the_buffer
;
10059 static const char *float_mem
[] = {
10134 static const unsigned char float_mem_mode
[] = {
10209 #define ST { OP_ST, 0 }
10210 #define STi { OP_STi, 0 }
10212 #define FGRPd9_2 NULL, { { NULL, 1 } }, 0
10213 #define FGRPd9_4 NULL, { { NULL, 2 } }, 0
10214 #define FGRPd9_5 NULL, { { NULL, 3 } }, 0
10215 #define FGRPd9_6 NULL, { { NULL, 4 } }, 0
10216 #define FGRPd9_7 NULL, { { NULL, 5 } }, 0
10217 #define FGRPda_5 NULL, { { NULL, 6 } }, 0
10218 #define FGRPdb_4 NULL, { { NULL, 7 } }, 0
10219 #define FGRPde_3 NULL, { { NULL, 8 } }, 0
10220 #define FGRPdf_4 NULL, { { NULL, 9 } }, 0
10222 static const struct dis386 float_reg
[][8] = {
10225 { "fadd", { ST
, STi
}, 0 },
10226 { "fmul", { ST
, STi
}, 0 },
10227 { "fcom", { STi
}, 0 },
10228 { "fcomp", { STi
}, 0 },
10229 { "fsub", { ST
, STi
}, 0 },
10230 { "fsubr", { ST
, STi
}, 0 },
10231 { "fdiv", { ST
, STi
}, 0 },
10232 { "fdivr", { ST
, STi
}, 0 },
10236 { "fld", { STi
}, 0 },
10237 { "fxch", { STi
}, 0 },
10247 { "fcmovb", { ST
, STi
}, 0 },
10248 { "fcmove", { ST
, STi
}, 0 },
10249 { "fcmovbe",{ ST
, STi
}, 0 },
10250 { "fcmovu", { ST
, STi
}, 0 },
10258 { "fcmovnb",{ ST
, STi
}, 0 },
10259 { "fcmovne",{ ST
, STi
}, 0 },
10260 { "fcmovnbe",{ ST
, STi
}, 0 },
10261 { "fcmovnu",{ ST
, STi
}, 0 },
10263 { "fucomi", { ST
, STi
}, 0 },
10264 { "fcomi", { ST
, STi
}, 0 },
10269 { "fadd", { STi
, ST
}, 0 },
10270 { "fmul", { STi
, ST
}, 0 },
10273 { "fsub{!M|r}", { STi
, ST
}, 0 },
10274 { "fsub{M|}", { STi
, ST
}, 0 },
10275 { "fdiv{!M|r}", { STi
, ST
}, 0 },
10276 { "fdiv{M|}", { STi
, ST
}, 0 },
10280 { "ffree", { STi
}, 0 },
10282 { "fst", { STi
}, 0 },
10283 { "fstp", { STi
}, 0 },
10284 { "fucom", { STi
}, 0 },
10285 { "fucomp", { STi
}, 0 },
10291 { "faddp", { STi
, ST
}, 0 },
10292 { "fmulp", { STi
, ST
}, 0 },
10295 { "fsub{!M|r}p", { STi
, ST
}, 0 },
10296 { "fsub{M|}p", { STi
, ST
}, 0 },
10297 { "fdiv{!M|r}p", { STi
, ST
}, 0 },
10298 { "fdiv{M|}p", { STi
, ST
}, 0 },
10302 { "ffreep", { STi
}, 0 },
10307 { "fucomip", { ST
, STi
}, 0 },
10308 { "fcomip", { ST
, STi
}, 0 },
10313 static char *fgrps
[][8] = {
10316 "(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10321 "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10326 "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
10331 "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
10336 "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
10341 "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
10346 "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10351 "fNeni(8087 only)","fNdisi(8087 only)","fNclex","fNinit",
10352 "fNsetpm(287 only)","frstpm(287 only)","(bad)","(bad)",
10357 "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10362 "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10367 swap_operand (void)
10369 mnemonicendp
[0] = '.';
10370 mnemonicendp
[1] = 's';
10375 OP_Skip_MODRM (int bytemode ATTRIBUTE_UNUSED
,
10376 int sizeflag ATTRIBUTE_UNUSED
)
10378 /* Skip mod/rm byte. */
10384 dofloat (int sizeflag
)
10386 const struct dis386
*dp
;
10387 unsigned char floatop
;
10389 floatop
= codep
[-1];
10391 if (modrm
.mod
!= 3)
10393 int fp_indx
= (floatop
- 0xd8) * 8 + modrm
.reg
;
10395 putop (float_mem
[fp_indx
], sizeflag
);
10398 OP_E (float_mem_mode
[fp_indx
], sizeflag
);
10401 /* Skip mod/rm byte. */
10405 dp
= &float_reg
[floatop
- 0xd8][modrm
.reg
];
10406 if (dp
->name
== NULL
)
10408 putop (fgrps
[dp
->op
[0].bytemode
][modrm
.rm
], sizeflag
);
10410 /* Instruction fnstsw is only one with strange arg. */
10411 if (floatop
== 0xdf && codep
[-1] == 0xe0)
10412 strcpy (op_out
[0], names16
[0]);
10416 putop (dp
->name
, sizeflag
);
10421 (*dp
->op
[0].rtn
) (dp
->op
[0].bytemode
, sizeflag
);
10426 (*dp
->op
[1].rtn
) (dp
->op
[1].bytemode
, sizeflag
);
10430 /* Like oappend (below), but S is a string starting with '%'.
10431 In Intel syntax, the '%' is elided. */
10433 oappend_maybe_intel (const char *s
)
10435 oappend (s
+ intel_syntax
);
10439 OP_ST (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
10441 oappend_maybe_intel ("%st");
10445 OP_STi (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
10447 sprintf (scratchbuf
, "%%st(%d)", modrm
.rm
);
10448 oappend_maybe_intel (scratchbuf
);
10451 /* Capital letters in template are macros. */
10453 putop (const char *in_template
, int sizeflag
)
10458 unsigned int l
= 0, len
= 0;
10461 for (p
= in_template
; *p
; p
++)
10465 if (l
>= sizeof (last
) || !ISUPPER (*p
))
10484 while (*++p
!= '|')
10485 if (*p
== '}' || *p
== '\0')
10491 while (*++p
!= '}')
10503 if (modrm
.mod
!= 3 || (sizeflag
& SUFFIX_ALWAYS
))
10512 if (sizeflag
& SUFFIX_ALWAYS
)
10515 else if (l
== 1 && last
[0] == 'L')
10517 if (address_mode
== mode_64bit
10518 && !(prefixes
& PREFIX_ADDR
))
10531 if (intel_syntax
&& !alt
)
10533 if ((prefixes
& PREFIX_DATA
) || (sizeflag
& SUFFIX_ALWAYS
))
10535 if (sizeflag
& DFLAG
)
10536 *obufp
++ = intel_syntax
? 'd' : 'l';
10538 *obufp
++ = intel_syntax
? 'w' : 's';
10539 used_prefixes
|= (prefixes
& PREFIX_DATA
);
10543 if (intel_syntax
|| !(sizeflag
& SUFFIX_ALWAYS
))
10546 if (modrm
.mod
== 3)
10552 if (sizeflag
& DFLAG
)
10553 *obufp
++ = intel_syntax
? 'd' : 'l';
10556 used_prefixes
|= (prefixes
& PREFIX_DATA
);
10562 case 'E': /* For jcxz/jecxz */
10563 if (address_mode
== mode_64bit
)
10565 if (sizeflag
& AFLAG
)
10571 if (sizeflag
& AFLAG
)
10573 used_prefixes
|= (prefixes
& PREFIX_ADDR
);
10578 if ((prefixes
& PREFIX_ADDR
) || (sizeflag
& SUFFIX_ALWAYS
))
10580 if (sizeflag
& AFLAG
)
10581 *obufp
++ = address_mode
== mode_64bit
? 'q' : 'l';
10583 *obufp
++ = address_mode
== mode_64bit
? 'l' : 'w';
10584 used_prefixes
|= (prefixes
& PREFIX_ADDR
);
10588 if (intel_syntax
|| (obufp
[-1] != 's' && !(sizeflag
& SUFFIX_ALWAYS
)))
10590 if ((rex
& REX_W
) || (sizeflag
& DFLAG
))
10594 if (!(rex
& REX_W
))
10595 used_prefixes
|= (prefixes
& PREFIX_DATA
);
10600 if ((prefixes
& (PREFIX_CS
| PREFIX_DS
)) == PREFIX_CS
10601 || (prefixes
& (PREFIX_CS
| PREFIX_DS
)) == PREFIX_DS
)
10603 used_prefixes
|= prefixes
& (PREFIX_CS
| PREFIX_DS
);
10606 if (prefixes
& PREFIX_DS
)
10622 if (l
!= 1 || last
[0] != 'X')
10624 if (!need_vex
|| !vex
.evex
)
10627 || ((modrm
.mod
== 3 || vex
.b
) && !(sizeflag
& SUFFIX_ALWAYS
)))
10629 switch (vex
.length
)
10647 if (address_mode
== mode_64bit
&& (sizeflag
& SUFFIX_ALWAYS
))
10652 /* Fall through. */
10660 if (sizeflag
& SUFFIX_ALWAYS
)
10664 if (intel_mnemonic
!= cond
)
10668 if ((prefixes
& PREFIX_FWAIT
) == 0)
10671 used_prefixes
|= PREFIX_FWAIT
;
10677 else if (intel_syntax
&& (sizeflag
& DFLAG
))
10681 if (!(rex
& REX_W
))
10682 used_prefixes
|= (prefixes
& PREFIX_DATA
);
10686 && address_mode
== mode_64bit
10687 && isa64
== intel64
)
10692 /* Fall through. */
10695 && address_mode
== mode_64bit
10696 && ((sizeflag
& DFLAG
) || (rex
& REX_W
)))
10701 /* Fall through. */
10709 if ((rex
& REX_W
) == 0
10710 && (prefixes
& PREFIX_DATA
))
10712 if ((sizeflag
& DFLAG
) == 0)
10714 used_prefixes
|= (prefixes
& PREFIX_DATA
);
10718 if ((prefixes
& PREFIX_DATA
)
10720 || (sizeflag
& SUFFIX_ALWAYS
))
10727 if (sizeflag
& DFLAG
)
10731 used_prefixes
|= (prefixes
& PREFIX_DATA
);
10735 else if (l
== 1 && last
[0] == 'L')
10737 if ((prefixes
& PREFIX_DATA
)
10739 || (sizeflag
& SUFFIX_ALWAYS
))
10746 if (sizeflag
& DFLAG
)
10747 *obufp
++ = intel_syntax
? 'd' : 'l';
10750 used_prefixes
|= (prefixes
& PREFIX_DATA
);
10760 if (address_mode
== mode_64bit
10761 && ((sizeflag
& DFLAG
) || (rex
& REX_W
)))
10763 if (modrm
.mod
!= 3 || (sizeflag
& SUFFIX_ALWAYS
))
10767 /* Fall through. */
10773 if (intel_syntax
&& !alt
)
10776 if (modrm
.mod
!= 3 || (sizeflag
& SUFFIX_ALWAYS
))
10782 if (sizeflag
& DFLAG
)
10783 *obufp
++ = intel_syntax
? 'd' : 'l';
10786 used_prefixes
|= (prefixes
& PREFIX_DATA
);
10790 else if (l
== 1 && last
[0] == 'D')
10791 *obufp
++ = vex
.w
? 'q' : 'd';
10792 else if (l
== 1 && last
[0] == 'L')
10794 if (cond
? modrm
.mod
== 3 && !(sizeflag
& SUFFIX_ALWAYS
)
10795 : address_mode
!= mode_64bit
)
10802 else if((address_mode
== mode_64bit
&& need_modrm
&& cond
)
10803 || (sizeflag
& SUFFIX_ALWAYS
))
10804 *obufp
++ = intel_syntax
? 'd' : 'l';
10813 else if (sizeflag
& DFLAG
)
10822 if (intel_syntax
&& !p
[1]
10823 && ((rex
& REX_W
) || (sizeflag
& DFLAG
)))
10825 if (!(rex
& REX_W
))
10826 used_prefixes
|= (prefixes
& PREFIX_DATA
);
10833 if (address_mode
== mode_64bit
10834 && ((sizeflag
& DFLAG
) || (rex
& REX_W
)))
10836 if (sizeflag
& SUFFIX_ALWAYS
)
10841 else if (l
== 1 && last
[0] == 'L')
10852 /* Fall through. */
10860 if (sizeflag
& SUFFIX_ALWAYS
)
10866 if (sizeflag
& DFLAG
)
10870 used_prefixes
|= (prefixes
& PREFIX_DATA
);
10874 else if (l
== 1 && last
[0] == 'L')
10876 if (address_mode
== mode_64bit
10877 && !(prefixes
& PREFIX_ADDR
))
10893 ? vex
.prefix
== DATA_PREFIX_OPCODE
10894 : prefixes
& PREFIX_DATA
)
10897 used_prefixes
|= PREFIX_DATA
;
10903 if (l
== 1 && last
[0] == 'X')
10908 || ((modrm
.mod
== 3 || vex
.b
) && !(sizeflag
& SUFFIX_ALWAYS
)))
10910 switch (vex
.length
)
10930 /* operand size flag for cwtl, cbtw */
10939 else if (sizeflag
& DFLAG
)
10943 if (!(rex
& REX_W
))
10944 used_prefixes
|= (prefixes
& PREFIX_DATA
);
10950 if (last
[0] == 'X')
10951 *obufp
++ = vex
.w
? 'd': 's';
10952 else if (last
[0] == 'B')
10953 *obufp
++ = vex
.w
? 'w': 'b';
10963 if (isa64
== intel64
&& (rex
& REX_W
))
10969 if ((prefixes
& PREFIX_DATA
) || (sizeflag
& SUFFIX_ALWAYS
))
10971 if (sizeflag
& DFLAG
)
10975 used_prefixes
|= (prefixes
& PREFIX_DATA
);
10981 if (address_mode
== mode_64bit
10982 && (isa64
== intel64
10983 || ((sizeflag
& DFLAG
) || (rex
& REX_W
))))
10985 else if ((prefixes
& PREFIX_DATA
))
10987 if (!(sizeflag
& DFLAG
))
10989 used_prefixes
|= (prefixes
& PREFIX_DATA
);
10998 mnemonicendp
= obufp
;
11003 oappend (const char *s
)
11005 obufp
= stpcpy (obufp
, s
);
11011 /* Only print the active segment register. */
11012 if (!active_seg_prefix
)
11015 used_prefixes
|= active_seg_prefix
;
11016 switch (active_seg_prefix
)
11019 oappend_maybe_intel ("%cs:");
11022 oappend_maybe_intel ("%ds:");
11025 oappend_maybe_intel ("%ss:");
11028 oappend_maybe_intel ("%es:");
11031 oappend_maybe_intel ("%fs:");
11034 oappend_maybe_intel ("%gs:");
11042 OP_indirE (int bytemode
, int sizeflag
)
11046 OP_E (bytemode
, sizeflag
);
11050 print_operand_value (char *buf
, int hex
, bfd_vma disp
)
11052 if (address_mode
== mode_64bit
)
11060 sprintf_vma (tmp
, disp
);
11061 for (i
= 0; tmp
[i
] == '0' && tmp
[i
+ 1]; i
++);
11062 strcpy (buf
+ 2, tmp
+ i
);
11066 bfd_signed_vma v
= disp
;
11073 /* Check for possible overflow on 0x8000000000000000. */
11076 strcpy (buf
, "9223372036854775808");
11090 tmp
[28 - i
] = (v
% 10) + '0';
11094 strcpy (buf
, tmp
+ 29 - i
);
11100 sprintf (buf
, "0x%x", (unsigned int) disp
);
11102 sprintf (buf
, "%d", (int) disp
);
11106 /* Put DISP in BUF as signed hex number. */
11109 print_displacement (char *buf
, bfd_vma disp
)
11111 bfd_signed_vma val
= disp
;
11120 /* Check for possible overflow. */
11123 switch (address_mode
)
11126 strcpy (buf
+ j
, "0x8000000000000000");
11129 strcpy (buf
+ j
, "0x80000000");
11132 strcpy (buf
+ j
, "0x8000");
11142 sprintf_vma (tmp
, (bfd_vma
) val
);
11143 for (i
= 0; tmp
[i
] == '0'; i
++)
11145 if (tmp
[i
] == '\0')
11147 strcpy (buf
+ j
, tmp
+ i
);
11151 intel_operand_size (int bytemode
, int sizeflag
)
11155 && (bytemode
== x_mode
11156 || bytemode
== evex_half_bcst_xmmq_mode
))
11159 oappend ("QWORD PTR ");
11161 oappend ("DWORD PTR ");
11170 oappend ("BYTE PTR ");
11175 oappend ("WORD PTR ");
11178 if (address_mode
== mode_64bit
&& isa64
== intel64
)
11180 oappend ("QWORD PTR ");
11183 /* Fall through. */
11185 if (address_mode
== mode_64bit
&& ((sizeflag
& DFLAG
) || (rex
& REX_W
)))
11187 oappend ("QWORD PTR ");
11190 /* Fall through. */
11196 oappend ("QWORD PTR ");
11197 else if (bytemode
== dq_mode
)
11198 oappend ("DWORD PTR ");
11201 if (sizeflag
& DFLAG
)
11202 oappend ("DWORD PTR ");
11204 oappend ("WORD PTR ");
11205 used_prefixes
|= (prefixes
& PREFIX_DATA
);
11209 if ((rex
& REX_W
) || (sizeflag
& DFLAG
))
11211 oappend ("WORD PTR ");
11212 if (!(rex
& REX_W
))
11213 used_prefixes
|= (prefixes
& PREFIX_DATA
);
11216 if (sizeflag
& DFLAG
)
11217 oappend ("QWORD PTR ");
11219 oappend ("DWORD PTR ");
11220 used_prefixes
|= (prefixes
& PREFIX_DATA
);
11223 if (!(sizeflag
& DFLAG
) && isa64
== intel64
)
11224 oappend ("WORD PTR ");
11226 oappend ("DWORD PTR ");
11227 used_prefixes
|= (prefixes
& PREFIX_DATA
);
11232 oappend ("DWORD PTR ");
11236 oappend ("QWORD PTR ");
11239 if (address_mode
== mode_64bit
)
11240 oappend ("QWORD PTR ");
11242 oappend ("DWORD PTR ");
11245 if (sizeflag
& DFLAG
)
11246 oappend ("FWORD PTR ");
11248 oappend ("DWORD PTR ");
11249 used_prefixes
|= (prefixes
& PREFIX_DATA
);
11252 oappend ("TBYTE PTR ");
11256 case evex_x_gscat_mode
:
11257 case evex_x_nobcst_mode
:
11261 switch (vex
.length
)
11264 oappend ("XMMWORD PTR ");
11267 oappend ("YMMWORD PTR ");
11270 oappend ("ZMMWORD PTR ");
11277 oappend ("XMMWORD PTR ");
11280 oappend ("XMMWORD PTR ");
11283 oappend ("YMMWORD PTR ");
11286 case evex_half_bcst_xmmq_mode
:
11290 switch (vex
.length
)
11293 oappend ("QWORD PTR ");
11296 oappend ("XMMWORD PTR ");
11299 oappend ("YMMWORD PTR ");
11309 switch (vex
.length
)
11314 oappend ("BYTE PTR ");
11324 switch (vex
.length
)
11329 oappend ("WORD PTR ");
11339 switch (vex
.length
)
11344 oappend ("DWORD PTR ");
11354 switch (vex
.length
)
11359 oappend ("QWORD PTR ");
11369 switch (vex
.length
)
11372 oappend ("WORD PTR ");
11375 oappend ("DWORD PTR ");
11378 oappend ("QWORD PTR ");
11388 switch (vex
.length
)
11391 oappend ("DWORD PTR ");
11394 oappend ("QWORD PTR ");
11397 oappend ("XMMWORD PTR ");
11407 switch (vex
.length
)
11410 oappend ("QWORD PTR ");
11413 oappend ("YMMWORD PTR ");
11416 oappend ("ZMMWORD PTR ");
11426 switch (vex
.length
)
11430 oappend ("XMMWORD PTR ");
11437 oappend ("OWORD PTR ");
11439 case vex_scalar_w_dq_mode
:
11444 oappend ("QWORD PTR ");
11446 oappend ("DWORD PTR ");
11448 case vex_vsib_d_w_dq_mode
:
11449 case vex_vsib_q_w_dq_mode
:
11456 oappend ("QWORD PTR ");
11458 oappend ("DWORD PTR ");
11462 switch (vex
.length
)
11465 oappend ("XMMWORD PTR ");
11468 oappend ("YMMWORD PTR ");
11471 oappend ("ZMMWORD PTR ");
11478 case vex_vsib_q_w_d_mode
:
11479 case vex_vsib_d_w_d_mode
:
11480 if (!need_vex
|| !vex
.evex
)
11483 switch (vex
.length
)
11486 oappend ("QWORD PTR ");
11489 oappend ("XMMWORD PTR ");
11492 oappend ("YMMWORD PTR ");
11500 if (!need_vex
|| vex
.length
!= 128)
11503 oappend ("DWORD PTR ");
11505 oappend ("BYTE PTR ");
11511 oappend ("QWORD PTR ");
11513 oappend ("WORD PTR ");
11523 OP_E_register (int bytemode
, int sizeflag
)
11525 int reg
= modrm
.rm
;
11526 const char **names
;
11532 if ((sizeflag
& SUFFIX_ALWAYS
)
11533 && (bytemode
== b_swap_mode
11534 || bytemode
== bnd_swap_mode
11535 || bytemode
== v_swap_mode
))
11562 names
= address_mode
== mode_64bit
? names64
: names32
;
11565 case bnd_swap_mode
:
11574 if (address_mode
== mode_64bit
&& isa64
== intel64
)
11579 /* Fall through. */
11581 if (address_mode
== mode_64bit
&& ((sizeflag
& DFLAG
) || (rex
& REX_W
)))
11587 /* Fall through. */
11597 else if (bytemode
!= v_mode
&& bytemode
!= v_swap_mode
)
11601 if (sizeflag
& DFLAG
)
11605 used_prefixes
|= (prefixes
& PREFIX_DATA
);
11609 if (!(sizeflag
& DFLAG
) && isa64
== intel64
)
11613 used_prefixes
|= (prefixes
& PREFIX_DATA
);
11616 names
= (address_mode
== mode_64bit
11617 ? names64
: names32
);
11618 if (!(prefixes
& PREFIX_ADDR
))
11619 names
= (address_mode
== mode_16bit
11620 ? names16
: names
);
11623 /* Remove "addr16/addr32". */
11624 all_prefixes
[last_addr_prefix
] = 0;
11625 names
= (address_mode
!= mode_32bit
11626 ? names32
: names16
);
11627 used_prefixes
|= PREFIX_ADDR
;
11637 names
= names_mask
;
11642 oappend (INTERNAL_DISASSEMBLER_ERROR
);
11645 oappend (names
[reg
]);
11649 OP_E_memory (int bytemode
, int sizeflag
)
11652 int add
= (rex
& REX_B
) ? 8 : 0;
11658 /* In EVEX, if operand doesn't allow broadcast, vex.b should be 0. */
11660 && bytemode
!= x_mode
11661 && bytemode
!= xmmq_mode
11662 && bytemode
!= evex_half_bcst_xmmq_mode
)
11680 if (address_mode
!= mode_64bit
)
11690 case vex_scalar_w_dq_mode
:
11691 case vex_vsib_d_w_dq_mode
:
11692 case vex_vsib_d_w_d_mode
:
11693 case vex_vsib_q_w_dq_mode
:
11694 case vex_vsib_q_w_d_mode
:
11695 case evex_x_gscat_mode
:
11696 shift
= vex
.w
? 3 : 2;
11699 case evex_half_bcst_xmmq_mode
:
11703 shift
= vex
.w
? 3 : 2;
11706 /* Fall through. */
11710 case evex_x_nobcst_mode
:
11712 switch (vex
.length
)
11726 /* Make necessary corrections to shift for modes that need it. */
11727 if (bytemode
== xmmq_mode
11728 || bytemode
== evex_half_bcst_xmmq_mode
11729 || (bytemode
== ymmq_mode
&& vex
.length
== 128))
11731 else if (bytemode
== xmmqd_mode
)
11733 else if (bytemode
== xmmdw_mode
)
11748 shift
= vex
.w
? 1 : 0;
11759 intel_operand_size (bytemode
, sizeflag
);
11762 if ((sizeflag
& AFLAG
) || address_mode
== mode_64bit
)
11764 /* 32/64 bit address mode */
11774 int addr32flag
= !((sizeflag
& AFLAG
)
11775 || bytemode
== v_bnd_mode
11776 || bytemode
== v_bndmk_mode
11777 || bytemode
== bnd_mode
11778 || bytemode
== bnd_swap_mode
);
11779 const char **indexes64
= names64
;
11780 const char **indexes32
= names32
;
11790 vindex
= sib
.index
;
11796 case vex_vsib_d_w_dq_mode
:
11797 case vex_vsib_d_w_d_mode
:
11798 case vex_vsib_q_w_dq_mode
:
11799 case vex_vsib_q_w_d_mode
:
11809 switch (vex
.length
)
11812 indexes64
= indexes32
= names_xmm
;
11816 || bytemode
== vex_vsib_q_w_dq_mode
11817 || bytemode
== vex_vsib_q_w_d_mode
)
11818 indexes64
= indexes32
= names_ymm
;
11820 indexes64
= indexes32
= names_xmm
;
11824 || bytemode
== vex_vsib_q_w_dq_mode
11825 || bytemode
== vex_vsib_q_w_d_mode
)
11826 indexes64
= indexes32
= names_zmm
;
11828 indexes64
= indexes32
= names_ymm
;
11835 haveindex
= vindex
!= 4;
11844 /* mandatory non-vector SIB must have sib */
11845 if (bytemode
== vex_sibmem_mode
)
11851 rbase
= base
+ add
;
11859 if (address_mode
== mode_64bit
&& !havesib
)
11862 if (riprel
&& bytemode
== v_bndmk_mode
)
11870 FETCH_DATA (the_info
, codep
+ 1);
11872 if ((disp
& 0x80) != 0)
11874 if (vex
.evex
&& shift
> 0)
11887 && address_mode
!= mode_16bit
)
11889 if (address_mode
== mode_64bit
)
11891 /* Display eiz instead of addr32. */
11892 needindex
= addr32flag
;
11897 /* In 32-bit mode, we need index register to tell [offset]
11898 from [eiz*1 + offset]. */
11903 havedisp
= (havebase
11905 || (havesib
&& (haveindex
|| scale
!= 0)));
11908 if (modrm
.mod
!= 0 || base
== 5)
11910 if (havedisp
|| riprel
)
11911 print_displacement (scratchbuf
, disp
);
11913 print_operand_value (scratchbuf
, 1, disp
);
11914 oappend (scratchbuf
);
11918 oappend (!addr32flag
? "(%rip)" : "(%eip)");
11922 if ((havebase
|| haveindex
|| needindex
|| needaddr32
|| riprel
)
11923 && (address_mode
!= mode_64bit
11924 || ((bytemode
!= v_bnd_mode
)
11925 && (bytemode
!= v_bndmk_mode
)
11926 && (bytemode
!= bnd_mode
)
11927 && (bytemode
!= bnd_swap_mode
))))
11928 used_prefixes
|= PREFIX_ADDR
;
11930 if (havedisp
|| (intel_syntax
&& riprel
))
11932 *obufp
++ = open_char
;
11933 if (intel_syntax
&& riprel
)
11936 oappend (!addr32flag
? "rip" : "eip");
11940 oappend (address_mode
== mode_64bit
&& !addr32flag
11941 ? names64
[rbase
] : names32
[rbase
]);
11944 /* ESP/RSP won't allow index. If base isn't ESP/RSP,
11945 print index to tell base + index from base. */
11949 || (havebase
&& base
!= ESP_REG_NUM
))
11951 if (!intel_syntax
|| havebase
)
11953 *obufp
++ = separator_char
;
11957 oappend (address_mode
== mode_64bit
&& !addr32flag
11958 ? indexes64
[vindex
] : indexes32
[vindex
]);
11960 oappend (address_mode
== mode_64bit
&& !addr32flag
11961 ? index64
: index32
);
11963 *obufp
++ = scale_char
;
11965 sprintf (scratchbuf
, "%d", 1 << scale
);
11966 oappend (scratchbuf
);
11970 && (disp
|| modrm
.mod
!= 0 || base
== 5))
11972 if (!havedisp
|| (bfd_signed_vma
) disp
>= 0)
11977 else if (modrm
.mod
!= 1 && disp
!= -disp
)
11981 disp
= - (bfd_signed_vma
) disp
;
11985 print_displacement (scratchbuf
, disp
);
11987 print_operand_value (scratchbuf
, 1, disp
);
11988 oappend (scratchbuf
);
11991 *obufp
++ = close_char
;
11994 else if (intel_syntax
)
11996 if (modrm
.mod
!= 0 || base
== 5)
11998 if (!active_seg_prefix
)
12000 oappend (names_seg
[ds_reg
- es_reg
]);
12003 print_operand_value (scratchbuf
, 1, disp
);
12004 oappend (scratchbuf
);
12008 else if (bytemode
== v_bnd_mode
12009 || bytemode
== v_bndmk_mode
12010 || bytemode
== bnd_mode
12011 || bytemode
== bnd_swap_mode
)
12018 /* 16 bit address mode */
12019 used_prefixes
|= prefixes
& PREFIX_ADDR
;
12026 if ((disp
& 0x8000) != 0)
12031 FETCH_DATA (the_info
, codep
+ 1);
12033 if ((disp
& 0x80) != 0)
12035 if (vex
.evex
&& shift
> 0)
12040 if ((disp
& 0x8000) != 0)
12046 if (modrm
.mod
!= 0 || modrm
.rm
== 6)
12048 print_displacement (scratchbuf
, disp
);
12049 oappend (scratchbuf
);
12052 if (modrm
.mod
!= 0 || modrm
.rm
!= 6)
12054 *obufp
++ = open_char
;
12056 oappend (index16
[modrm
.rm
]);
12058 && (disp
|| modrm
.mod
!= 0 || modrm
.rm
== 6))
12060 if ((bfd_signed_vma
) disp
>= 0)
12065 else if (modrm
.mod
!= 1)
12069 disp
= - (bfd_signed_vma
) disp
;
12072 print_displacement (scratchbuf
, disp
);
12073 oappend (scratchbuf
);
12076 *obufp
++ = close_char
;
12079 else if (intel_syntax
)
12081 if (!active_seg_prefix
)
12083 oappend (names_seg
[ds_reg
- es_reg
]);
12086 print_operand_value (scratchbuf
, 1, disp
& 0xffff);
12087 oappend (scratchbuf
);
12090 if (vex
.evex
&& vex
.b
12091 && (bytemode
== x_mode
12092 || bytemode
== xmmq_mode
12093 || bytemode
== evex_half_bcst_xmmq_mode
))
12096 || bytemode
== xmmq_mode
12097 || bytemode
== evex_half_bcst_xmmq_mode
)
12099 switch (vex
.length
)
12102 oappend ("{1to2}");
12105 oappend ("{1to4}");
12108 oappend ("{1to8}");
12116 switch (vex
.length
)
12119 oappend ("{1to4}");
12122 oappend ("{1to8}");
12125 oappend ("{1to16}");
12135 OP_E (int bytemode
, int sizeflag
)
12137 /* Skip mod/rm byte. */
12141 if (modrm
.mod
== 3)
12142 OP_E_register (bytemode
, sizeflag
);
12144 OP_E_memory (bytemode
, sizeflag
);
12148 OP_G (int bytemode
, int sizeflag
)
12151 const char **names
;
12161 oappend (names8rex
[modrm
.reg
+ add
]);
12163 oappend (names8
[modrm
.reg
+ add
]);
12166 oappend (names16
[modrm
.reg
+ add
]);
12171 oappend (names32
[modrm
.reg
+ add
]);
12174 oappend (names64
[modrm
.reg
+ add
]);
12177 if (modrm
.reg
> 0x3)
12182 oappend (names_bnd
[modrm
.reg
]);
12192 oappend (names64
[modrm
.reg
+ add
]);
12193 else if (bytemode
!= v_mode
&& bytemode
!= movsxd_mode
)
12194 oappend (names32
[modrm
.reg
+ add
]);
12197 if (sizeflag
& DFLAG
)
12198 oappend (names32
[modrm
.reg
+ add
]);
12200 oappend (names16
[modrm
.reg
+ add
]);
12201 used_prefixes
|= (prefixes
& PREFIX_DATA
);
12205 names
= (address_mode
== mode_64bit
12206 ? names64
: names32
);
12207 if (!(prefixes
& PREFIX_ADDR
))
12209 if (address_mode
== mode_16bit
)
12214 /* Remove "addr16/addr32". */
12215 all_prefixes
[last_addr_prefix
] = 0;
12216 names
= (address_mode
!= mode_32bit
12217 ? names32
: names16
);
12218 used_prefixes
|= PREFIX_ADDR
;
12220 oappend (names
[modrm
.reg
+ add
]);
12223 if (address_mode
== mode_64bit
)
12224 oappend (names64
[modrm
.reg
+ add
]);
12226 oappend (names32
[modrm
.reg
+ add
]);
12230 if ((modrm
.reg
+ add
) > 0x7)
12235 oappend (names_mask
[modrm
.reg
+ add
]);
12238 oappend (INTERNAL_DISASSEMBLER_ERROR
);
12251 FETCH_DATA (the_info
, codep
+ 8);
12252 a
= *codep
++ & 0xff;
12253 a
|= (*codep
++ & 0xff) << 8;
12254 a
|= (*codep
++ & 0xff) << 16;
12255 a
|= (*codep
++ & 0xffu
) << 24;
12256 b
= *codep
++ & 0xff;
12257 b
|= (*codep
++ & 0xff) << 8;
12258 b
|= (*codep
++ & 0xff) << 16;
12259 b
|= (*codep
++ & 0xffu
) << 24;
12260 x
= a
+ ((bfd_vma
) b
<< 32);
12268 static bfd_signed_vma
12271 bfd_signed_vma x
= 0;
12273 FETCH_DATA (the_info
, codep
+ 4);
12274 x
= *codep
++ & (bfd_signed_vma
) 0xff;
12275 x
|= (*codep
++ & (bfd_signed_vma
) 0xff) << 8;
12276 x
|= (*codep
++ & (bfd_signed_vma
) 0xff) << 16;
12277 x
|= (*codep
++ & (bfd_signed_vma
) 0xff) << 24;
12281 static bfd_signed_vma
12284 bfd_signed_vma x
= 0;
12286 FETCH_DATA (the_info
, codep
+ 4);
12287 x
= *codep
++ & (bfd_signed_vma
) 0xff;
12288 x
|= (*codep
++ & (bfd_signed_vma
) 0xff) << 8;
12289 x
|= (*codep
++ & (bfd_signed_vma
) 0xff) << 16;
12290 x
|= (*codep
++ & (bfd_signed_vma
) 0xff) << 24;
12292 x
= (x
^ ((bfd_signed_vma
) 1 << 31)) - ((bfd_signed_vma
) 1 << 31);
12302 FETCH_DATA (the_info
, codep
+ 2);
12303 x
= *codep
++ & 0xff;
12304 x
|= (*codep
++ & 0xff) << 8;
12309 set_op (bfd_vma op
, int riprel
)
12311 op_index
[op_ad
] = op_ad
;
12312 if (address_mode
== mode_64bit
)
12314 op_address
[op_ad
] = op
;
12315 op_riprel
[op_ad
] = riprel
;
12319 /* Mask to get a 32-bit address. */
12320 op_address
[op_ad
] = op
& 0xffffffff;
12321 op_riprel
[op_ad
] = riprel
& 0xffffffff;
12326 OP_REG (int code
, int sizeflag
)
12333 case es_reg
: case ss_reg
: case cs_reg
:
12334 case ds_reg
: case fs_reg
: case gs_reg
:
12335 oappend (names_seg
[code
- es_reg
]);
12347 case ax_reg
: case cx_reg
: case dx_reg
: case bx_reg
:
12348 case sp_reg
: case bp_reg
: case si_reg
: case di_reg
:
12349 s
= names16
[code
- ax_reg
+ add
];
12351 case ah_reg
: case ch_reg
: case dh_reg
: case bh_reg
:
12353 /* Fall through. */
12354 case al_reg
: case cl_reg
: case dl_reg
: case bl_reg
:
12356 s
= names8rex
[code
- al_reg
+ add
];
12358 s
= names8
[code
- al_reg
];
12360 case rAX_reg
: case rCX_reg
: case rDX_reg
: case rBX_reg
:
12361 case rSP_reg
: case rBP_reg
: case rSI_reg
: case rDI_reg
:
12362 if (address_mode
== mode_64bit
12363 && ((sizeflag
& DFLAG
) || (rex
& REX_W
)))
12365 s
= names64
[code
- rAX_reg
+ add
];
12368 code
+= eAX_reg
- rAX_reg
;
12369 /* Fall through. */
12370 case eAX_reg
: case eCX_reg
: case eDX_reg
: case eBX_reg
:
12371 case eSP_reg
: case eBP_reg
: case eSI_reg
: case eDI_reg
:
12374 s
= names64
[code
- eAX_reg
+ add
];
12377 if (sizeflag
& DFLAG
)
12378 s
= names32
[code
- eAX_reg
+ add
];
12380 s
= names16
[code
- eAX_reg
+ add
];
12381 used_prefixes
|= (prefixes
& PREFIX_DATA
);
12385 s
= INTERNAL_DISASSEMBLER_ERROR
;
12392 OP_IMREG (int code
, int sizeflag
)
12404 case al_reg
: case cl_reg
:
12405 s
= names8
[code
- al_reg
];
12414 /* Fall through. */
12415 case z_mode_ax_reg
:
12416 if ((rex
& REX_W
) || (sizeflag
& DFLAG
))
12420 if (!(rex
& REX_W
))
12421 used_prefixes
|= (prefixes
& PREFIX_DATA
);
12424 s
= INTERNAL_DISASSEMBLER_ERROR
;
12431 OP_I (int bytemode
, int sizeflag
)
12434 bfd_signed_vma mask
= -1;
12439 FETCH_DATA (the_info
, codep
+ 1);
12449 if (sizeflag
& DFLAG
)
12459 used_prefixes
|= (prefixes
& PREFIX_DATA
);
12475 oappend (INTERNAL_DISASSEMBLER_ERROR
);
12480 scratchbuf
[0] = '$';
12481 print_operand_value (scratchbuf
+ 1, 1, op
);
12482 oappend_maybe_intel (scratchbuf
);
12483 scratchbuf
[0] = '\0';
12487 OP_I64 (int bytemode
, int sizeflag
)
12489 if (bytemode
!= v_mode
|| address_mode
!= mode_64bit
|| !(rex
& REX_W
))
12491 OP_I (bytemode
, sizeflag
);
12497 scratchbuf
[0] = '$';
12498 print_operand_value (scratchbuf
+ 1, 1, get64 ());
12499 oappend_maybe_intel (scratchbuf
);
12500 scratchbuf
[0] = '\0';
12504 OP_sI (int bytemode
, int sizeflag
)
12512 FETCH_DATA (the_info
, codep
+ 1);
12514 if ((op
& 0x80) != 0)
12516 if (bytemode
== b_T_mode
)
12518 if (address_mode
!= mode_64bit
12519 || !((sizeflag
& DFLAG
) || (rex
& REX_W
)))
12521 /* The operand-size prefix is overridden by a REX prefix. */
12522 if ((sizeflag
& DFLAG
) || (rex
& REX_W
))
12530 if (!(rex
& REX_W
))
12532 if (sizeflag
& DFLAG
)
12540 /* The operand-size prefix is overridden by a REX prefix. */
12541 if ((sizeflag
& DFLAG
) || (rex
& REX_W
))
12547 oappend (INTERNAL_DISASSEMBLER_ERROR
);
12551 scratchbuf
[0] = '$';
12552 print_operand_value (scratchbuf
+ 1, 1, op
);
12553 oappend_maybe_intel (scratchbuf
);
12557 OP_J (int bytemode
, int sizeflag
)
12561 bfd_vma segment
= 0;
12566 FETCH_DATA (the_info
, codep
+ 1);
12568 if ((disp
& 0x80) != 0)
12572 if (isa64
!= intel64
)
12575 if ((sizeflag
& DFLAG
)
12576 || (address_mode
== mode_64bit
12577 && ((isa64
== intel64
&& bytemode
!= dqw_mode
)
12578 || (rex
& REX_W
))))
12583 if ((disp
& 0x8000) != 0)
12585 /* In 16bit mode, address is wrapped around at 64k within
12586 the same segment. Otherwise, a data16 prefix on a jump
12587 instruction means that the pc is masked to 16 bits after
12588 the displacement is added! */
12590 if ((prefixes
& PREFIX_DATA
) == 0)
12591 segment
= ((start_pc
+ (codep
- start_codep
))
12592 & ~((bfd_vma
) 0xffff));
12594 if (address_mode
!= mode_64bit
12595 || (isa64
!= intel64
&& !(rex
& REX_W
)))
12596 used_prefixes
|= (prefixes
& PREFIX_DATA
);
12599 oappend (INTERNAL_DISASSEMBLER_ERROR
);
12602 disp
= ((start_pc
+ (codep
- start_codep
) + disp
) & mask
) | segment
;
12604 print_operand_value (scratchbuf
, 1, disp
);
12605 oappend (scratchbuf
);
12609 OP_SEG (int bytemode
, int sizeflag
)
12611 if (bytemode
== w_mode
)
12612 oappend (names_seg
[modrm
.reg
]);
12614 OP_E (modrm
.mod
== 3 ? bytemode
: w_mode
, sizeflag
);
12618 OP_DIR (int dummy ATTRIBUTE_UNUSED
, int sizeflag
)
12622 if (sizeflag
& DFLAG
)
12632 used_prefixes
|= (prefixes
& PREFIX_DATA
);
12634 sprintf (scratchbuf
, "0x%x:0x%x", seg
, offset
);
12636 sprintf (scratchbuf
, "$0x%x,$0x%x", seg
, offset
);
12637 oappend (scratchbuf
);
12641 OP_OFF (int bytemode
, int sizeflag
)
12645 if (intel_syntax
&& (sizeflag
& SUFFIX_ALWAYS
))
12646 intel_operand_size (bytemode
, sizeflag
);
12649 if ((sizeflag
& AFLAG
) || address_mode
== mode_64bit
)
12656 if (!active_seg_prefix
)
12658 oappend (names_seg
[ds_reg
- es_reg
]);
12662 print_operand_value (scratchbuf
, 1, off
);
12663 oappend (scratchbuf
);
12667 OP_OFF64 (int bytemode
, int sizeflag
)
12671 if (address_mode
!= mode_64bit
12672 || (prefixes
& PREFIX_ADDR
))
12674 OP_OFF (bytemode
, sizeflag
);
12678 if (intel_syntax
&& (sizeflag
& SUFFIX_ALWAYS
))
12679 intel_operand_size (bytemode
, sizeflag
);
12686 if (!active_seg_prefix
)
12688 oappend (names_seg
[ds_reg
- es_reg
]);
12692 print_operand_value (scratchbuf
, 1, off
);
12693 oappend (scratchbuf
);
12697 ptr_reg (int code
, int sizeflag
)
12701 *obufp
++ = open_char
;
12702 used_prefixes
|= (prefixes
& PREFIX_ADDR
);
12703 if (address_mode
== mode_64bit
)
12705 if (!(sizeflag
& AFLAG
))
12706 s
= names32
[code
- eAX_reg
];
12708 s
= names64
[code
- eAX_reg
];
12710 else if (sizeflag
& AFLAG
)
12711 s
= names32
[code
- eAX_reg
];
12713 s
= names16
[code
- eAX_reg
];
12715 *obufp
++ = close_char
;
12720 OP_ESreg (int code
, int sizeflag
)
12726 case 0x6d: /* insw/insl */
12727 intel_operand_size (z_mode
, sizeflag
);
12729 case 0xa5: /* movsw/movsl/movsq */
12730 case 0xa7: /* cmpsw/cmpsl/cmpsq */
12731 case 0xab: /* stosw/stosl */
12732 case 0xaf: /* scasw/scasl */
12733 intel_operand_size (v_mode
, sizeflag
);
12736 intel_operand_size (b_mode
, sizeflag
);
12739 oappend_maybe_intel ("%es:");
12740 ptr_reg (code
, sizeflag
);
12744 OP_DSreg (int code
, int sizeflag
)
12750 case 0x6f: /* outsw/outsl */
12751 intel_operand_size (z_mode
, sizeflag
);
12753 case 0xa5: /* movsw/movsl/movsq */
12754 case 0xa7: /* cmpsw/cmpsl/cmpsq */
12755 case 0xad: /* lodsw/lodsl/lodsq */
12756 intel_operand_size (v_mode
, sizeflag
);
12759 intel_operand_size (b_mode
, sizeflag
);
12762 /* Set active_seg_prefix to PREFIX_DS if it is unset so that the
12763 default segment register DS is printed. */
12764 if (!active_seg_prefix
)
12765 active_seg_prefix
= PREFIX_DS
;
12767 ptr_reg (code
, sizeflag
);
12771 OP_C (int dummy ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
12779 else if (address_mode
!= mode_64bit
&& (prefixes
& PREFIX_LOCK
))
12781 all_prefixes
[last_lock_prefix
] = 0;
12782 used_prefixes
|= PREFIX_LOCK
;
12787 sprintf (scratchbuf
, "%%cr%d", modrm
.reg
+ add
);
12788 oappend_maybe_intel (scratchbuf
);
12792 OP_D (int dummy ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
12801 sprintf (scratchbuf
, "db%d", modrm
.reg
+ add
);
12803 sprintf (scratchbuf
, "%%db%d", modrm
.reg
+ add
);
12804 oappend (scratchbuf
);
12808 OP_T (int dummy ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
12810 sprintf (scratchbuf
, "%%tr%d", modrm
.reg
);
12811 oappend_maybe_intel (scratchbuf
);
12815 OP_R (int bytemode
, int sizeflag
)
12817 /* Skip mod/rm byte. */
12820 OP_E_register (bytemode
, sizeflag
);
12824 OP_MMX (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
12826 int reg
= modrm
.reg
;
12827 const char **names
;
12829 used_prefixes
|= (prefixes
& PREFIX_DATA
);
12830 if (prefixes
& PREFIX_DATA
)
12839 oappend (names
[reg
]);
12843 OP_XMM (int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
12845 int reg
= modrm
.reg
;
12846 const char **names
;
12858 && bytemode
!= xmm_mode
12859 && bytemode
!= xmmq_mode
12860 && bytemode
!= evex_half_bcst_xmmq_mode
12861 && bytemode
!= ymm_mode
12862 && bytemode
!= tmm_mode
12863 && bytemode
!= scalar_mode
)
12865 switch (vex
.length
)
12872 || (bytemode
!= vex_vsib_q_w_dq_mode
12873 && bytemode
!= vex_vsib_q_w_d_mode
))
12885 else if (bytemode
== xmmq_mode
12886 || bytemode
== evex_half_bcst_xmmq_mode
)
12888 switch (vex
.length
)
12901 else if (bytemode
== tmm_mode
)
12911 else if (bytemode
== ymm_mode
)
12915 oappend (names
[reg
]);
12919 OP_EM (int bytemode
, int sizeflag
)
12922 const char **names
;
12924 if (modrm
.mod
!= 3)
12927 && (bytemode
== v_mode
|| bytemode
== v_swap_mode
))
12929 bytemode
= (prefixes
& PREFIX_DATA
) ? x_mode
: q_mode
;
12930 used_prefixes
|= (prefixes
& PREFIX_DATA
);
12932 OP_E (bytemode
, sizeflag
);
12936 if ((sizeflag
& SUFFIX_ALWAYS
) && bytemode
== v_swap_mode
)
12939 /* Skip mod/rm byte. */
12942 used_prefixes
|= (prefixes
& PREFIX_DATA
);
12944 if (prefixes
& PREFIX_DATA
)
12953 oappend (names
[reg
]);
12956 /* cvt* are the only instructions in sse2 which have
12957 both SSE and MMX operands and also have 0x66 prefix
12958 in their opcode. 0x66 was originally used to differentiate
12959 between SSE and MMX instruction(operands). So we have to handle the
12960 cvt* separately using OP_EMC and OP_MXC */
12962 OP_EMC (int bytemode
, int sizeflag
)
12964 if (modrm
.mod
!= 3)
12966 if (intel_syntax
&& bytemode
== v_mode
)
12968 bytemode
= (prefixes
& PREFIX_DATA
) ? x_mode
: q_mode
;
12969 used_prefixes
|= (prefixes
& PREFIX_DATA
);
12971 OP_E (bytemode
, sizeflag
);
12975 /* Skip mod/rm byte. */
12978 used_prefixes
|= (prefixes
& PREFIX_DATA
);
12979 oappend (names_mm
[modrm
.rm
]);
12983 OP_MXC (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
12985 used_prefixes
|= (prefixes
& PREFIX_DATA
);
12986 oappend (names_mm
[modrm
.reg
]);
12990 OP_EX (int bytemode
, int sizeflag
)
12993 const char **names
;
12995 /* Skip mod/rm byte. */
12999 if (modrm
.mod
!= 3)
13001 OP_E_memory (bytemode
, sizeflag
);
13016 if ((sizeflag
& SUFFIX_ALWAYS
)
13017 && (bytemode
== x_swap_mode
13018 || bytemode
== d_swap_mode
13019 || bytemode
== q_swap_mode
))
13023 && bytemode
!= xmm_mode
13024 && bytemode
!= xmmdw_mode
13025 && bytemode
!= xmmqd_mode
13026 && bytemode
!= xmm_mb_mode
13027 && bytemode
!= xmm_mw_mode
13028 && bytemode
!= xmm_md_mode
13029 && bytemode
!= xmm_mq_mode
13030 && bytemode
!= xmmq_mode
13031 && bytemode
!= evex_half_bcst_xmmq_mode
13032 && bytemode
!= ymm_mode
13033 && bytemode
!= tmm_mode
13034 && bytemode
!= vex_scalar_w_dq_mode
)
13036 switch (vex
.length
)
13051 else if (bytemode
== xmmq_mode
13052 || bytemode
== evex_half_bcst_xmmq_mode
)
13054 switch (vex
.length
)
13067 else if (bytemode
== tmm_mode
)
13077 else if (bytemode
== ymm_mode
)
13081 oappend (names
[reg
]);
13085 OP_MS (int bytemode
, int sizeflag
)
13087 if (modrm
.mod
== 3)
13088 OP_EM (bytemode
, sizeflag
);
13094 OP_XS (int bytemode
, int sizeflag
)
13096 if (modrm
.mod
== 3)
13097 OP_EX (bytemode
, sizeflag
);
13103 OP_M (int bytemode
, int sizeflag
)
13105 if (modrm
.mod
== 3)
13106 /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
13109 OP_E (bytemode
, sizeflag
);
13113 OP_0f07 (int bytemode
, int sizeflag
)
13115 if (modrm
.mod
!= 3 || modrm
.rm
!= 0)
13118 OP_E (bytemode
, sizeflag
);
13121 /* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
13122 32bit mode and "xchg %rax,%rax" in 64bit mode. */
13125 NOP_Fixup1 (int bytemode
, int sizeflag
)
13127 if ((prefixes
& PREFIX_DATA
) != 0
13130 && address_mode
== mode_64bit
))
13131 OP_REG (bytemode
, sizeflag
);
13133 strcpy (obuf
, "nop");
13137 NOP_Fixup2 (int bytemode
, int sizeflag
)
13139 if ((prefixes
& PREFIX_DATA
) != 0
13142 && address_mode
== mode_64bit
))
13143 OP_IMREG (bytemode
, sizeflag
);
13146 static const char *const Suffix3DNow
[] = {
13147 /* 00 */ NULL
, NULL
, NULL
, NULL
,
13148 /* 04 */ NULL
, NULL
, NULL
, NULL
,
13149 /* 08 */ NULL
, NULL
, NULL
, NULL
,
13150 /* 0C */ "pi2fw", "pi2fd", NULL
, NULL
,
13151 /* 10 */ NULL
, NULL
, NULL
, NULL
,
13152 /* 14 */ NULL
, NULL
, NULL
, NULL
,
13153 /* 18 */ NULL
, NULL
, NULL
, NULL
,
13154 /* 1C */ "pf2iw", "pf2id", NULL
, NULL
,
13155 /* 20 */ NULL
, NULL
, NULL
, NULL
,
13156 /* 24 */ NULL
, NULL
, NULL
, NULL
,
13157 /* 28 */ NULL
, NULL
, NULL
, NULL
,
13158 /* 2C */ NULL
, NULL
, NULL
, NULL
,
13159 /* 30 */ NULL
, NULL
, NULL
, NULL
,
13160 /* 34 */ NULL
, NULL
, NULL
, NULL
,
13161 /* 38 */ NULL
, NULL
, NULL
, NULL
,
13162 /* 3C */ NULL
, NULL
, NULL
, NULL
,
13163 /* 40 */ NULL
, NULL
, NULL
, NULL
,
13164 /* 44 */ NULL
, NULL
, NULL
, NULL
,
13165 /* 48 */ NULL
, NULL
, NULL
, NULL
,
13166 /* 4C */ NULL
, NULL
, NULL
, NULL
,
13167 /* 50 */ NULL
, NULL
, NULL
, NULL
,
13168 /* 54 */ NULL
, NULL
, NULL
, NULL
,
13169 /* 58 */ NULL
, NULL
, NULL
, NULL
,
13170 /* 5C */ NULL
, NULL
, NULL
, NULL
,
13171 /* 60 */ NULL
, NULL
, NULL
, NULL
,
13172 /* 64 */ NULL
, NULL
, NULL
, NULL
,
13173 /* 68 */ NULL
, NULL
, NULL
, NULL
,
13174 /* 6C */ NULL
, NULL
, NULL
, NULL
,
13175 /* 70 */ NULL
, NULL
, NULL
, NULL
,
13176 /* 74 */ NULL
, NULL
, NULL
, NULL
,
13177 /* 78 */ NULL
, NULL
, NULL
, NULL
,
13178 /* 7C */ NULL
, NULL
, NULL
, NULL
,
13179 /* 80 */ NULL
, NULL
, NULL
, NULL
,
13180 /* 84 */ NULL
, NULL
, NULL
, NULL
,
13181 /* 88 */ NULL
, NULL
, "pfnacc", NULL
,
13182 /* 8C */ NULL
, NULL
, "pfpnacc", NULL
,
13183 /* 90 */ "pfcmpge", NULL
, NULL
, NULL
,
13184 /* 94 */ "pfmin", NULL
, "pfrcp", "pfrsqrt",
13185 /* 98 */ NULL
, NULL
, "pfsub", NULL
,
13186 /* 9C */ NULL
, NULL
, "pfadd", NULL
,
13187 /* A0 */ "pfcmpgt", NULL
, NULL
, NULL
,
13188 /* A4 */ "pfmax", NULL
, "pfrcpit1", "pfrsqit1",
13189 /* A8 */ NULL
, NULL
, "pfsubr", NULL
,
13190 /* AC */ NULL
, NULL
, "pfacc", NULL
,
13191 /* B0 */ "pfcmpeq", NULL
, NULL
, NULL
,
13192 /* B4 */ "pfmul", NULL
, "pfrcpit2", "pmulhrw",
13193 /* B8 */ NULL
, NULL
, NULL
, "pswapd",
13194 /* BC */ NULL
, NULL
, NULL
, "pavgusb",
13195 /* C0 */ NULL
, NULL
, NULL
, NULL
,
13196 /* C4 */ NULL
, NULL
, NULL
, NULL
,
13197 /* C8 */ NULL
, NULL
, NULL
, NULL
,
13198 /* CC */ NULL
, NULL
, NULL
, NULL
,
13199 /* D0 */ NULL
, NULL
, NULL
, NULL
,
13200 /* D4 */ NULL
, NULL
, NULL
, NULL
,
13201 /* D8 */ NULL
, NULL
, NULL
, NULL
,
13202 /* DC */ NULL
, NULL
, NULL
, NULL
,
13203 /* E0 */ NULL
, NULL
, NULL
, NULL
,
13204 /* E4 */ NULL
, NULL
, NULL
, NULL
,
13205 /* E8 */ NULL
, NULL
, NULL
, NULL
,
13206 /* EC */ NULL
, NULL
, NULL
, NULL
,
13207 /* F0 */ NULL
, NULL
, NULL
, NULL
,
13208 /* F4 */ NULL
, NULL
, NULL
, NULL
,
13209 /* F8 */ NULL
, NULL
, NULL
, NULL
,
13210 /* FC */ NULL
, NULL
, NULL
, NULL
,
13214 OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
13216 const char *mnemonic
;
13218 FETCH_DATA (the_info
, codep
+ 1);
13219 /* AMD 3DNow! instructions are specified by an opcode suffix in the
13220 place where an 8-bit immediate would normally go. ie. the last
13221 byte of the instruction. */
13222 obufp
= mnemonicendp
;
13223 mnemonic
= Suffix3DNow
[*codep
++ & 0xff];
13225 oappend (mnemonic
);
13228 /* Since a variable sized modrm/sib chunk is between the start
13229 of the opcode (0x0f0f) and the opcode suffix, we need to do
13230 all the modrm processing first, and don't know until now that
13231 we have a bad opcode. This necessitates some cleaning up. */
13232 op_out
[0][0] = '\0';
13233 op_out
[1][0] = '\0';
13236 mnemonicendp
= obufp
;
13239 static const struct op simd_cmp_op
[] =
13241 { STRING_COMMA_LEN ("eq") },
13242 { STRING_COMMA_LEN ("lt") },
13243 { STRING_COMMA_LEN ("le") },
13244 { STRING_COMMA_LEN ("unord") },
13245 { STRING_COMMA_LEN ("neq") },
13246 { STRING_COMMA_LEN ("nlt") },
13247 { STRING_COMMA_LEN ("nle") },
13248 { STRING_COMMA_LEN ("ord") }
13251 static const struct op vex_cmp_op
[] =
13253 { STRING_COMMA_LEN ("eq_uq") },
13254 { STRING_COMMA_LEN ("nge") },
13255 { STRING_COMMA_LEN ("ngt") },
13256 { STRING_COMMA_LEN ("false") },
13257 { STRING_COMMA_LEN ("neq_oq") },
13258 { STRING_COMMA_LEN ("ge") },
13259 { STRING_COMMA_LEN ("gt") },
13260 { STRING_COMMA_LEN ("true") },
13261 { STRING_COMMA_LEN ("eq_os") },
13262 { STRING_COMMA_LEN ("lt_oq") },
13263 { STRING_COMMA_LEN ("le_oq") },
13264 { STRING_COMMA_LEN ("unord_s") },
13265 { STRING_COMMA_LEN ("neq_us") },
13266 { STRING_COMMA_LEN ("nlt_uq") },
13267 { STRING_COMMA_LEN ("nle_uq") },
13268 { STRING_COMMA_LEN ("ord_s") },
13269 { STRING_COMMA_LEN ("eq_us") },
13270 { STRING_COMMA_LEN ("nge_uq") },
13271 { STRING_COMMA_LEN ("ngt_uq") },
13272 { STRING_COMMA_LEN ("false_os") },
13273 { STRING_COMMA_LEN ("neq_os") },
13274 { STRING_COMMA_LEN ("ge_oq") },
13275 { STRING_COMMA_LEN ("gt_oq") },
13276 { STRING_COMMA_LEN ("true_us") },
13280 CMP_Fixup (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
13282 unsigned int cmp_type
;
13284 FETCH_DATA (the_info
, codep
+ 1);
13285 cmp_type
= *codep
++ & 0xff;
13286 if (cmp_type
< ARRAY_SIZE (simd_cmp_op
))
13289 char *p
= mnemonicendp
- 2;
13293 sprintf (p
, "%s%s", simd_cmp_op
[cmp_type
].name
, suffix
);
13294 mnemonicendp
+= simd_cmp_op
[cmp_type
].len
;
13297 && cmp_type
< ARRAY_SIZE (simd_cmp_op
) + ARRAY_SIZE (vex_cmp_op
))
13300 char *p
= mnemonicendp
- 2;
13304 cmp_type
-= ARRAY_SIZE (simd_cmp_op
);
13305 sprintf (p
, "%s%s", vex_cmp_op
[cmp_type
].name
, suffix
);
13306 mnemonicendp
+= vex_cmp_op
[cmp_type
].len
;
13310 /* We have a reserved extension byte. Output it directly. */
13311 scratchbuf
[0] = '$';
13312 print_operand_value (scratchbuf
+ 1, 1, cmp_type
);
13313 oappend_maybe_intel (scratchbuf
);
13314 scratchbuf
[0] = '\0';
13319 OP_Mwait (int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
13321 /* mwait %eax,%ecx / mwaitx %eax,%ecx,%ebx */
13324 strcpy (op_out
[0], names32
[0]);
13325 strcpy (op_out
[1], names32
[1]);
13326 if (bytemode
== eBX_reg
)
13327 strcpy (op_out
[2], names32
[3]);
13328 two_source_ops
= 1;
13330 /* Skip mod/rm byte. */
13336 OP_Monitor (int bytemode ATTRIBUTE_UNUSED
,
13337 int sizeflag ATTRIBUTE_UNUSED
)
13339 /* monitor %{e,r,}ax,%ecx,%edx" */
13342 const char **names
= (address_mode
== mode_64bit
13343 ? names64
: names32
);
13345 if (prefixes
& PREFIX_ADDR
)
13347 /* Remove "addr16/addr32". */
13348 all_prefixes
[last_addr_prefix
] = 0;
13349 names
= (address_mode
!= mode_32bit
13350 ? names32
: names16
);
13351 used_prefixes
|= PREFIX_ADDR
;
13353 else if (address_mode
== mode_16bit
)
13355 strcpy (op_out
[0], names
[0]);
13356 strcpy (op_out
[1], names32
[1]);
13357 strcpy (op_out
[2], names32
[2]);
13358 two_source_ops
= 1;
13360 /* Skip mod/rm byte. */
13368 /* Throw away prefixes and 1st. opcode byte. */
13369 codep
= insn_codep
+ 1;
13374 REP_Fixup (int bytemode
, int sizeflag
)
13376 /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
13378 if (prefixes
& PREFIX_REPZ
)
13379 all_prefixes
[last_repz_prefix
] = REP_PREFIX
;
13386 OP_IMREG (bytemode
, sizeflag
);
13389 OP_ESreg (bytemode
, sizeflag
);
13392 OP_DSreg (bytemode
, sizeflag
);
13401 SEP_Fixup (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
13403 if ( isa64
!= amd64
)
13408 mnemonicendp
= obufp
;
13412 /* For BND-prefixed instructions 0xF2 prefix should be displayed as
13416 BND_Fixup (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
13418 if (prefixes
& PREFIX_REPNZ
)
13419 all_prefixes
[last_repnz_prefix
] = BND_PREFIX
;
13422 /* For NOTRACK-prefixed instructions, 0x3E prefix should be displayed as
13426 NOTRACK_Fixup (int bytemode ATTRIBUTE_UNUSED
,
13427 int sizeflag ATTRIBUTE_UNUSED
)
13429 if (active_seg_prefix
== PREFIX_DS
13430 && (address_mode
!= mode_64bit
|| last_data_prefix
< 0))
13432 /* NOTRACK prefix is only valid on indirect branch instructions.
13433 NB: DATA prefix is unsupported for Intel64. */
13434 active_seg_prefix
= 0;
13435 all_prefixes
[last_seg_prefix
] = NOTRACK_PREFIX
;
13439 /* Similar to OP_E. But the 0xf2/0xf3 prefixes should be displayed as
13440 "xacquire"/"xrelease" for memory operand if there is a LOCK prefix.
13444 HLE_Fixup1 (int bytemode
, int sizeflag
)
13447 && (prefixes
& PREFIX_LOCK
) != 0)
13449 if (prefixes
& PREFIX_REPZ
)
13450 all_prefixes
[last_repz_prefix
] = XRELEASE_PREFIX
;
13451 if (prefixes
& PREFIX_REPNZ
)
13452 all_prefixes
[last_repnz_prefix
] = XACQUIRE_PREFIX
;
13455 OP_E (bytemode
, sizeflag
);
13458 /* Similar to OP_E. But the 0xf2/0xf3 prefixes should be displayed as
13459 "xacquire"/"xrelease" for memory operand. No check for LOCK prefix.
13463 HLE_Fixup2 (int bytemode
, int sizeflag
)
13465 if (modrm
.mod
!= 3)
13467 if (prefixes
& PREFIX_REPZ
)
13468 all_prefixes
[last_repz_prefix
] = XRELEASE_PREFIX
;
13469 if (prefixes
& PREFIX_REPNZ
)
13470 all_prefixes
[last_repnz_prefix
] = XACQUIRE_PREFIX
;
13473 OP_E (bytemode
, sizeflag
);
13476 /* Similar to OP_E. But the 0xf3 prefixes should be displayed as
13477 "xrelease" for memory operand. No check for LOCK prefix. */
13480 HLE_Fixup3 (int bytemode
, int sizeflag
)
13483 && last_repz_prefix
> last_repnz_prefix
13484 && (prefixes
& PREFIX_REPZ
) != 0)
13485 all_prefixes
[last_repz_prefix
] = XRELEASE_PREFIX
;
13487 OP_E (bytemode
, sizeflag
);
13491 CMPXCHG8B_Fixup (int bytemode
, int sizeflag
)
13496 /* Change cmpxchg8b to cmpxchg16b. */
13497 char *p
= mnemonicendp
- 2;
13498 mnemonicendp
= stpcpy (p
, "16b");
13501 else if ((prefixes
& PREFIX_LOCK
) != 0)
13503 if (prefixes
& PREFIX_REPZ
)
13504 all_prefixes
[last_repz_prefix
] = XRELEASE_PREFIX
;
13505 if (prefixes
& PREFIX_REPNZ
)
13506 all_prefixes
[last_repnz_prefix
] = XACQUIRE_PREFIX
;
13509 OP_M (bytemode
, sizeflag
);
13513 XMM_Fixup (int reg
, int sizeflag ATTRIBUTE_UNUSED
)
13515 const char **names
;
13519 switch (vex
.length
)
13533 oappend (names
[reg
]);
13537 FXSAVE_Fixup (int bytemode
, int sizeflag
)
13539 /* Add proper suffix to "fxsave" and "fxrstor". */
13543 char *p
= mnemonicendp
;
13549 OP_M (bytemode
, sizeflag
);
13552 /* Display the destination register operand for instructions with
13556 OP_VEX (int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
13559 const char **names
;
13564 reg
= vex
.register_specifier
;
13565 vex
.register_specifier
= 0;
13566 if (address_mode
!= mode_64bit
)
13568 else if (vex
.evex
&& !vex
.v
)
13571 if (bytemode
== vex_scalar_mode
)
13573 oappend (names_xmm
[reg
]);
13577 if (bytemode
== tmm_mode
)
13579 /* All 3 TMM registers must be distinct. */
13584 /* This must be the 3rd operand. */
13585 if (obufp
!= op_out
[2])
13587 oappend (names_tmm
[reg
]);
13588 if (reg
== modrm
.reg
|| reg
== modrm
.rm
)
13589 strcpy (obufp
, "/(bad)");
13592 if (modrm
.reg
== modrm
.rm
|| modrm
.reg
== reg
|| modrm
.rm
== reg
)
13595 && (modrm
.reg
== modrm
.rm
|| modrm
.reg
== reg
))
13596 strcat (op_out
[0], "/(bad)");
13598 && (modrm
.rm
== modrm
.reg
|| modrm
.rm
== reg
))
13599 strcat (op_out
[1], "/(bad)");
13605 switch (vex
.length
)
13611 case vex_vsib_q_w_dq_mode
:
13612 case vex_vsib_q_w_d_mode
:
13628 names
= names_mask
;
13641 case vex_vsib_q_w_dq_mode
:
13642 case vex_vsib_q_w_d_mode
:
13643 names
= vex
.w
? names_ymm
: names_xmm
;
13652 names
= names_mask
;
13655 /* See PR binutils/20893 for a reproducer. */
13667 oappend (names
[reg
]);
13671 OP_VexR (int bytemode
, int sizeflag
)
13673 if (modrm
.mod
== 3)
13674 OP_VEX (bytemode
, sizeflag
);
13678 OP_VexW (int bytemode
, int sizeflag
)
13680 OP_VEX (bytemode
, sizeflag
);
13684 /* Swap 2nd and 3rd operands. */
13685 strcpy (scratchbuf
, op_out
[2]);
13686 strcpy (op_out
[2], op_out
[1]);
13687 strcpy (op_out
[1], scratchbuf
);
13692 OP_REG_VexI4 (int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
13695 const char **names
= names_xmm
;
13697 FETCH_DATA (the_info
, codep
+ 1);
13700 if (bytemode
!= x_mode
&& bytemode
!= scalar_mode
)
13704 if (address_mode
!= mode_64bit
)
13707 if (bytemode
== x_mode
&& vex
.length
== 256)
13710 oappend (names
[reg
]);
13714 /* Swap 3rd and 4th operands. */
13715 strcpy (scratchbuf
, op_out
[3]);
13716 strcpy (op_out
[3], op_out
[2]);
13717 strcpy (op_out
[2], scratchbuf
);
13722 OP_VexI4 (int bytemode ATTRIBUTE_UNUSED
,
13723 int sizeflag ATTRIBUTE_UNUSED
)
13725 scratchbuf
[0] = '$';
13726 print_operand_value (scratchbuf
+ 1, 1, codep
[-1] & 0xf);
13727 oappend_maybe_intel (scratchbuf
);
13731 VPCMP_Fixup (int bytemode ATTRIBUTE_UNUSED
,
13732 int sizeflag ATTRIBUTE_UNUSED
)
13734 unsigned int cmp_type
;
13739 FETCH_DATA (the_info
, codep
+ 1);
13740 cmp_type
= *codep
++ & 0xff;
13741 /* There are aliases for immediates 0, 1, 2, 4, 5, 6.
13742 If it's the case, print suffix, otherwise - print the immediate. */
13743 if (cmp_type
< ARRAY_SIZE (simd_cmp_op
)
13748 char *p
= mnemonicendp
- 2;
13750 /* vpcmp* can have both one- and two-lettered suffix. */
13764 sprintf (p
, "%s%s", simd_cmp_op
[cmp_type
].name
, suffix
);
13765 mnemonicendp
+= simd_cmp_op
[cmp_type
].len
;
13769 /* We have a reserved extension byte. Output it directly. */
13770 scratchbuf
[0] = '$';
13771 print_operand_value (scratchbuf
+ 1, 1, cmp_type
);
13772 oappend_maybe_intel (scratchbuf
);
13773 scratchbuf
[0] = '\0';
13777 static const struct op xop_cmp_op
[] =
13779 { STRING_COMMA_LEN ("lt") },
13780 { STRING_COMMA_LEN ("le") },
13781 { STRING_COMMA_LEN ("gt") },
13782 { STRING_COMMA_LEN ("ge") },
13783 { STRING_COMMA_LEN ("eq") },
13784 { STRING_COMMA_LEN ("neq") },
13785 { STRING_COMMA_LEN ("false") },
13786 { STRING_COMMA_LEN ("true") }
13790 VPCOM_Fixup (int bytemode ATTRIBUTE_UNUSED
,
13791 int sizeflag ATTRIBUTE_UNUSED
)
13793 unsigned int cmp_type
;
13795 FETCH_DATA (the_info
, codep
+ 1);
13796 cmp_type
= *codep
++ & 0xff;
13797 if (cmp_type
< ARRAY_SIZE (xop_cmp_op
))
13800 char *p
= mnemonicendp
- 2;
13802 /* vpcom* can have both one- and two-lettered suffix. */
13816 sprintf (p
, "%s%s", xop_cmp_op
[cmp_type
].name
, suffix
);
13817 mnemonicendp
+= xop_cmp_op
[cmp_type
].len
;
13821 /* We have a reserved extension byte. Output it directly. */
13822 scratchbuf
[0] = '$';
13823 print_operand_value (scratchbuf
+ 1, 1, cmp_type
);
13824 oappend_maybe_intel (scratchbuf
);
13825 scratchbuf
[0] = '\0';
13829 static const struct op pclmul_op
[] =
13831 { STRING_COMMA_LEN ("lql") },
13832 { STRING_COMMA_LEN ("hql") },
13833 { STRING_COMMA_LEN ("lqh") },
13834 { STRING_COMMA_LEN ("hqh") }
13838 PCLMUL_Fixup (int bytemode ATTRIBUTE_UNUSED
,
13839 int sizeflag ATTRIBUTE_UNUSED
)
13841 unsigned int pclmul_type
;
13843 FETCH_DATA (the_info
, codep
+ 1);
13844 pclmul_type
= *codep
++ & 0xff;
13845 switch (pclmul_type
)
13856 if (pclmul_type
< ARRAY_SIZE (pclmul_op
))
13859 char *p
= mnemonicendp
- 3;
13864 sprintf (p
, "%s%s", pclmul_op
[pclmul_type
].name
, suffix
);
13865 mnemonicendp
+= pclmul_op
[pclmul_type
].len
;
13869 /* We have a reserved extension byte. Output it directly. */
13870 scratchbuf
[0] = '$';
13871 print_operand_value (scratchbuf
+ 1, 1, pclmul_type
);
13872 oappend_maybe_intel (scratchbuf
);
13873 scratchbuf
[0] = '\0';
13878 MOVSXD_Fixup (int bytemode
, int sizeflag
)
13880 /* Add proper suffix to "movsxd". */
13881 char *p
= mnemonicendp
;
13906 oappend (INTERNAL_DISASSEMBLER_ERROR
);
13913 OP_E (bytemode
, sizeflag
);
13917 OP_Mask (int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
13920 || (bytemode
!= mask_mode
&& bytemode
!= mask_bd_mode
))
13924 if ((rex
& REX_R
) != 0 || !vex
.r
)
13930 oappend (names_mask
[modrm
.reg
]);
13934 OP_Rounding (int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
13936 if (modrm
.mod
== 3 && vex
.b
)
13939 case evex_rounding_64_mode
:
13940 if (address_mode
!= mode_64bit
)
13945 /* Fall through. */
13946 case evex_rounding_mode
:
13947 oappend (names_rounding
[vex
.ll
]);
13949 case evex_sae_mode
: