1 /* Print i386 instructions for GDB, the GNU debugger.
2 Copyright (C) 1988-2021 Free Software Foundation, Inc.
4 This file is part of the GNU opcodes library.
6 This library is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3, or (at your option)
11 It is distributed in the hope that it will be useful, but WITHOUT
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
14 License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19 MA 02110-1301, USA. */
22 /* 80386 instruction printer by Pace Willisson (pace@prep.ai.mit.edu)
24 modified by John Hassey (hassey@dg-rtp.dg.com)
25 x86-64 support added by Jan Hubicka (jh@suse.cz)
26 VIA PadLock support by Michal Ludvig (mludvig@suse.cz). */
28 /* The main tables describing the instructions is essentially a copy
29 of the "Opcode Map" chapter (Appendix A) of the Intel 80386
30 Programmers Manual. Usually, there is a capital letter, followed
31 by a small letter. The capital letter tell the addressing mode,
32 and the small letter tells about the operand size. Refer to
33 the Intel manual for details. */
36 #include "disassemble.h"
38 #include "opcode/i386.h"
39 #include "libiberty.h"
40 #include "safe-ctype.h"
44 static int print_insn (bfd_vma
, disassemble_info
*);
45 static void dofloat (int);
46 static void OP_ST (int, int);
47 static void OP_STi (int, int);
48 static int putop (const char *, int);
49 static void oappend (const char *);
50 static void append_seg (void);
51 static void OP_indirE (int, int);
52 static void print_operand_value (char *, int, bfd_vma
);
53 static void OP_E_memory (int, int);
54 static void print_displacement (char *, bfd_vma
);
55 static void OP_E (int, int);
56 static void OP_G (int, int);
57 static bfd_vma
get64 (void);
58 static bfd_signed_vma
get32 (void);
59 static bfd_signed_vma
get32s (void);
60 static int get16 (void);
61 static void set_op (bfd_vma
, int);
62 static void OP_Skip_MODRM (int, int);
63 static void OP_REG (int, int);
64 static void OP_IMREG (int, int);
65 static void OP_I (int, int);
66 static void OP_I64 (int, int);
67 static void OP_sI (int, int);
68 static void OP_J (int, int);
69 static void OP_SEG (int, int);
70 static void OP_DIR (int, int);
71 static void OP_OFF (int, int);
72 static void OP_OFF64 (int, int);
73 static void ptr_reg (int, int);
74 static void OP_ESreg (int, int);
75 static void OP_DSreg (int, int);
76 static void OP_C (int, int);
77 static void OP_D (int, int);
78 static void OP_T (int, int);
79 static void OP_MMX (int, int);
80 static void OP_XMM (int, int);
81 static void OP_EM (int, int);
82 static void OP_EX (int, int);
83 static void OP_EMC (int,int);
84 static void OP_MXC (int,int);
85 static void OP_MS (int, int);
86 static void OP_XS (int, int);
87 static void OP_M (int, int);
88 static void OP_VEX (int, int);
89 static void OP_VexR (int, int);
90 static void OP_VexW (int, int);
91 static void OP_Rounding (int, int);
92 static void OP_REG_VexI4 (int, int);
93 static void OP_VexI4 (int, int);
94 static void PCLMUL_Fixup (int, int);
95 static void VPCMP_Fixup (int, int);
96 static void VPCOM_Fixup (int, int);
97 static void OP_0f07 (int, int);
98 static void OP_Monitor (int, int);
99 static void OP_Mwait (int, int);
100 static void NOP_Fixup1 (int, int);
101 static void NOP_Fixup2 (int, int);
102 static void OP_3DNowSuffix (int, int);
103 static void CMP_Fixup (int, int);
104 static void BadOp (void);
105 static void REP_Fixup (int, int);
106 static void SEP_Fixup (int, int);
107 static void BND_Fixup (int, int);
108 static void NOTRACK_Fixup (int, int);
109 static void HLE_Fixup1 (int, int);
110 static void HLE_Fixup2 (int, int);
111 static void HLE_Fixup3 (int, int);
112 static void CMPXCHG8B_Fixup (int, int);
113 static void XMM_Fixup (int, int);
114 static void FXSAVE_Fixup (int, int);
116 static void MOVSXD_Fixup (int, int);
117 static void DistinctDest_Fixup (int, int);
120 /* Points to first byte not fetched. */
121 bfd_byte
*max_fetched
;
122 bfd_byte the_buffer
[MAX_MNEM_SIZE
];
125 OPCODES_SIGJMP_BUF bailout
;
135 enum address_mode address_mode
;
137 /* Flags for the prefixes for the current instruction. See below. */
140 /* REX prefix the current instruction. See below. */
142 /* Bits of REX we've already used. */
144 /* Mark parts used in the REX prefix. When we are testing for
145 empty prefix (for 8bit register REX extension), just mask it
146 out. Otherwise test for REX bit is excuse for existence of REX
147 only in case value is nonzero. */
148 #define USED_REX(value) \
153 rex_used |= (value) | REX_OPCODE; \
156 rex_used |= REX_OPCODE; \
159 /* Flags for prefixes which we somehow handled when printing the
160 current instruction. */
161 static int used_prefixes
;
163 /* Flags for EVEX bits which we somehow handled when printing the
164 current instruction. */
165 #define EVEX_b_used 1
166 static int evex_used
;
168 /* Flags stored in PREFIXES. */
169 #define PREFIX_REPZ 1
170 #define PREFIX_REPNZ 2
171 #define PREFIX_LOCK 4
173 #define PREFIX_SS 0x10
174 #define PREFIX_DS 0x20
175 #define PREFIX_ES 0x40
176 #define PREFIX_FS 0x80
177 #define PREFIX_GS 0x100
178 #define PREFIX_DATA 0x200
179 #define PREFIX_ADDR 0x400
180 #define PREFIX_FWAIT 0x800
182 /* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
183 to ADDR (exclusive) are valid. Returns 1 for success, longjmps
185 #define FETCH_DATA(info, addr) \
186 ((addr) <= ((struct dis_private *) (info->private_data))->max_fetched \
187 ? 1 : fetch_data ((info), (addr)))
190 fetch_data (struct disassemble_info
*info
, bfd_byte
*addr
)
193 struct dis_private
*priv
= (struct dis_private
*) info
->private_data
;
194 bfd_vma start
= priv
->insn_start
+ (priv
->max_fetched
- priv
->the_buffer
);
196 if (addr
<= priv
->the_buffer
+ MAX_MNEM_SIZE
)
197 status
= (*info
->read_memory_func
) (start
,
199 addr
- priv
->max_fetched
,
205 /* If we did manage to read at least one byte, then
206 print_insn_i386 will do something sensible. Otherwise, print
207 an error. We do that here because this is where we know
209 if (priv
->max_fetched
== priv
->the_buffer
)
210 (*info
->memory_error_func
) (status
, start
, info
);
211 OPCODES_SIGLONGJMP (priv
->bailout
, 1);
214 priv
->max_fetched
= addr
;
218 /* Possible values for prefix requirement. */
219 #define PREFIX_IGNORED_SHIFT 16
220 #define PREFIX_IGNORED_REPZ (PREFIX_REPZ << PREFIX_IGNORED_SHIFT)
221 #define PREFIX_IGNORED_REPNZ (PREFIX_REPNZ << PREFIX_IGNORED_SHIFT)
222 #define PREFIX_IGNORED_DATA (PREFIX_DATA << PREFIX_IGNORED_SHIFT)
223 #define PREFIX_IGNORED_ADDR (PREFIX_ADDR << PREFIX_IGNORED_SHIFT)
224 #define PREFIX_IGNORED_LOCK (PREFIX_LOCK << PREFIX_IGNORED_SHIFT)
226 /* Opcode prefixes. */
227 #define PREFIX_OPCODE (PREFIX_REPZ \
231 /* Prefixes ignored. */
232 #define PREFIX_IGNORED (PREFIX_IGNORED_REPZ \
233 | PREFIX_IGNORED_REPNZ \
234 | PREFIX_IGNORED_DATA)
236 #define XX { NULL, 0 }
237 #define Bad_Opcode NULL, { { NULL, 0 } }, 0
239 #define Eb { OP_E, b_mode }
240 #define Ebnd { OP_E, bnd_mode }
241 #define EbS { OP_E, b_swap_mode }
242 #define EbndS { OP_E, bnd_swap_mode }
243 #define Ev { OP_E, v_mode }
244 #define Eva { OP_E, va_mode }
245 #define Ev_bnd { OP_E, v_bnd_mode }
246 #define EvS { OP_E, v_swap_mode }
247 #define Ed { OP_E, d_mode }
248 #define Edq { OP_E, dq_mode }
249 #define Edb { OP_E, db_mode }
250 #define Edw { OP_E, dw_mode }
251 #define Eq { OP_E, q_mode }
252 #define indirEv { OP_indirE, indir_v_mode }
253 #define indirEp { OP_indirE, f_mode }
254 #define stackEv { OP_E, stack_v_mode }
255 #define Em { OP_E, m_mode }
256 #define Ew { OP_E, w_mode }
257 #define M { OP_M, 0 } /* lea, lgdt, etc. */
258 #define Ma { OP_M, a_mode }
259 #define Mb { OP_M, b_mode }
260 #define Md { OP_M, d_mode }
261 #define Mo { OP_M, o_mode }
262 #define Mp { OP_M, f_mode } /* 32 or 48 bit memory operand for LDS, LES etc */
263 #define Mq { OP_M, q_mode }
264 #define Mv { OP_M, v_mode }
265 #define Mv_bnd { OP_M, v_bndmk_mode }
266 #define Mx { OP_M, x_mode }
267 #define Mxmm { OP_M, xmm_mode }
268 #define Gb { OP_G, b_mode }
269 #define Gbnd { OP_G, bnd_mode }
270 #define Gv { OP_G, v_mode }
271 #define Gd { OP_G, d_mode }
272 #define Gdq { OP_G, dq_mode }
273 #define Gm { OP_G, m_mode }
274 #define Gva { OP_G, va_mode }
275 #define Gw { OP_G, w_mode }
276 #define Ib { OP_I, b_mode }
277 #define sIb { OP_sI, b_mode } /* sign extened byte */
278 #define sIbT { OP_sI, b_T_mode } /* sign extened byte like 'T' */
279 #define Iv { OP_I, v_mode }
280 #define sIv { OP_sI, v_mode }
281 #define Iv64 { OP_I64, v_mode }
282 #define Id { OP_I, d_mode }
283 #define Iw { OP_I, w_mode }
284 #define I1 { OP_I, const_1_mode }
285 #define Jb { OP_J, b_mode }
286 #define Jv { OP_J, v_mode }
287 #define Jdqw { OP_J, dqw_mode }
288 #define Cm { OP_C, m_mode }
289 #define Dm { OP_D, m_mode }
290 #define Td { OP_T, d_mode }
291 #define Skip_MODRM { OP_Skip_MODRM, 0 }
293 #define RMeAX { OP_REG, eAX_reg }
294 #define RMeBX { OP_REG, eBX_reg }
295 #define RMeCX { OP_REG, eCX_reg }
296 #define RMeDX { OP_REG, eDX_reg }
297 #define RMeSP { OP_REG, eSP_reg }
298 #define RMeBP { OP_REG, eBP_reg }
299 #define RMeSI { OP_REG, eSI_reg }
300 #define RMeDI { OP_REG, eDI_reg }
301 #define RMrAX { OP_REG, rAX_reg }
302 #define RMrBX { OP_REG, rBX_reg }
303 #define RMrCX { OP_REG, rCX_reg }
304 #define RMrDX { OP_REG, rDX_reg }
305 #define RMrSP { OP_REG, rSP_reg }
306 #define RMrBP { OP_REG, rBP_reg }
307 #define RMrSI { OP_REG, rSI_reg }
308 #define RMrDI { OP_REG, rDI_reg }
309 #define RMAL { OP_REG, al_reg }
310 #define RMCL { OP_REG, cl_reg }
311 #define RMDL { OP_REG, dl_reg }
312 #define RMBL { OP_REG, bl_reg }
313 #define RMAH { OP_REG, ah_reg }
314 #define RMCH { OP_REG, ch_reg }
315 #define RMDH { OP_REG, dh_reg }
316 #define RMBH { OP_REG, bh_reg }
317 #define RMAX { OP_REG, ax_reg }
318 #define RMDX { OP_REG, dx_reg }
320 #define eAX { OP_IMREG, eAX_reg }
321 #define AL { OP_IMREG, al_reg }
322 #define CL { OP_IMREG, cl_reg }
323 #define zAX { OP_IMREG, z_mode_ax_reg }
324 #define indirDX { OP_IMREG, indir_dx_reg }
326 #define Sw { OP_SEG, w_mode }
327 #define Sv { OP_SEG, v_mode }
328 #define Ap { OP_DIR, 0 }
329 #define Ob { OP_OFF64, b_mode }
330 #define Ov { OP_OFF64, v_mode }
331 #define Xb { OP_DSreg, eSI_reg }
332 #define Xv { OP_DSreg, eSI_reg }
333 #define Xz { OP_DSreg, eSI_reg }
334 #define Yb { OP_ESreg, eDI_reg }
335 #define Yv { OP_ESreg, eDI_reg }
336 #define DSBX { OP_DSreg, eBX_reg }
338 #define es { OP_REG, es_reg }
339 #define ss { OP_REG, ss_reg }
340 #define cs { OP_REG, cs_reg }
341 #define ds { OP_REG, ds_reg }
342 #define fs { OP_REG, fs_reg }
343 #define gs { OP_REG, gs_reg }
345 #define MX { OP_MMX, 0 }
346 #define XM { OP_XMM, 0 }
347 #define XMScalar { OP_XMM, scalar_mode }
348 #define XMGatherD { OP_XMM, vex_vsib_d_w_dq_mode }
349 #define XMGatherQ { OP_XMM, vex_vsib_q_w_dq_mode }
350 #define XMM { OP_XMM, xmm_mode }
351 #define TMM { OP_XMM, tmm_mode }
352 #define XMxmmq { OP_XMM, xmmq_mode }
353 #define EM { OP_EM, v_mode }
354 #define EMS { OP_EM, v_swap_mode }
355 #define EMd { OP_EM, d_mode }
356 #define EMx { OP_EM, x_mode }
357 #define EXbwUnit { OP_EX, bw_unit_mode }
358 #define EXb { OP_EX, b_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 EXwS { OP_EX, w_swap_mode }
363 #define EXq { OP_EX, q_mode }
364 #define EXqS { OP_EX, q_swap_mode }
365 #define EXdq { OP_EX, dq_mode }
366 #define EXx { OP_EX, x_mode }
367 #define EXxh { OP_EX, xh_mode }
368 #define EXxS { OP_EX, x_swap_mode }
369 #define EXxmm { OP_EX, xmm_mode }
370 #define EXymm { OP_EX, ymm_mode }
371 #define EXtmm { OP_EX, tmm_mode }
372 #define EXxmmq { OP_EX, xmmq_mode }
373 #define EXxmmqh { OP_EX, evex_half_bcst_xmmqh_mode }
374 #define EXEvexHalfBcstXmmq { OP_EX, evex_half_bcst_xmmq_mode }
375 #define EXxmmdw { OP_EX, xmmdw_mode }
376 #define EXxmmqd { OP_EX, xmmqd_mode }
377 #define EXxmmqdh { OP_EX, evex_half_bcst_xmmqdh_mode }
378 #define EXymmq { OP_EX, ymmq_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, x_mode }
392 #define VexW { OP_VexW, x_mode }
393 #define VexScalar { OP_VEX, scalar_mode }
394 #define VexScalarR { OP_VexR, scalar_mode }
395 #define VexGatherD { OP_VEX, vex_vsib_d_w_dq_mode }
396 #define VexGatherQ { OP_VEX, vex_vsib_q_w_dq_mode }
397 #define VexGdq { OP_VEX, dq_mode }
398 #define VexTmm { OP_VEX, tmm_mode }
399 #define XMVexI4 { OP_REG_VexI4, x_mode }
400 #define XMVexScalarI4 { OP_REG_VexI4, scalar_mode }
401 #define VexI4 { OP_VexI4, 0 }
402 #define PCLMUL { PCLMUL_Fixup, 0 }
403 #define VPCMP { VPCMP_Fixup, 0 }
404 #define VPCOM { VPCOM_Fixup, 0 }
406 #define EXxEVexR { OP_Rounding, evex_rounding_mode }
407 #define EXxEVexR64 { OP_Rounding, evex_rounding_64_mode }
408 #define EXxEVexS { OP_Rounding, evex_sae_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 MVexVSIBQWpX { OP_M, vex_vsib_q_w_dq_mode }
418 #define MVexSIBMEM { OP_M, vex_sibmem_mode }
420 /* Used handle "rep" prefix for string instructions. */
421 #define Xbr { REP_Fixup, eSI_reg }
422 #define Xvr { REP_Fixup, eSI_reg }
423 #define Ybr { REP_Fixup, eDI_reg }
424 #define Yvr { REP_Fixup, eDI_reg }
425 #define Yzr { REP_Fixup, eDI_reg }
426 #define indirDXr { REP_Fixup, indir_dx_reg }
427 #define ALr { REP_Fixup, al_reg }
428 #define eAXr { REP_Fixup, eAX_reg }
430 /* Used handle HLE prefix for lockable instructions. */
431 #define Ebh1 { HLE_Fixup1, b_mode }
432 #define Evh1 { HLE_Fixup1, v_mode }
433 #define Ebh2 { HLE_Fixup2, b_mode }
434 #define Evh2 { HLE_Fixup2, v_mode }
435 #define Ebh3 { HLE_Fixup3, b_mode }
436 #define Evh3 { HLE_Fixup3, v_mode }
438 #define BND { BND_Fixup, 0 }
439 #define NOTRACK { NOTRACK_Fixup, 0 }
441 #define cond_jump_flag { NULL, cond_jump_mode }
442 #define loop_jcxz_flag { NULL, loop_jcxz_mode }
444 /* bits in sizeflag */
445 #define SUFFIX_ALWAYS 4
453 /* byte operand with operand swapped */
455 /* byte operand, sign extend like 'T' suffix */
457 /* operand size depends on prefixes */
459 /* operand size depends on prefixes with operand swapped */
461 /* operand size depends on address prefix */
465 /* double word operand */
467 /* word operand with operand swapped */
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, 32-byte YMM or 64-byte ZMM operand. In EVEX with
490 broadcast of 16bit enabled. */
492 /* 16-byte XMM operand */
494 /* XMM, XMM or YMM register operand, or quad word, xmmword or ymmword
495 memory operand (depending on vector length). Broadcast isn't
498 /* Same as xmmq_mode, but broadcast is allowed. */
499 evex_half_bcst_xmmq_mode
,
500 /* XMM, XMM or YMM register operand, or quad word, xmmword or ymmword
501 memory operand (depending on vector length). 16bit broadcast. */
502 evex_half_bcst_xmmqh_mode
,
503 /* 16-byte XMM, word, double word or quad word operand. */
505 /* 16-byte XMM, double word, quad word operand or xmm word operand. */
507 /* 16-byte XMM, double word, quad word operand or xmm word operand.
509 evex_half_bcst_xmmqdh_mode
,
510 /* 32-byte YMM operand */
512 /* quad word, ymmword or zmmword memory operand. */
514 /* 32-byte YMM or 16-byte word operand */
518 /* d_mode in 32bit, q_mode in 64bit mode. */
520 /* pair of v_mode operands */
526 /* like v_bnd_mode in 32bit, no RIP-rel in 64bit mode. */
528 /* operand size depends on REX.W / VEX.W. */
530 /* Displacements like 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 d_mode, memory like b_mode. */
549 /* registers like d_mode, memory like w_mode. */
552 /* Operand size depends on the VEX.W bit, with VSIB dword indices. */
553 vex_vsib_d_w_dq_mode
,
554 /* Operand size depends on the VEX.W bit, with VSIB qword indices. */
555 vex_vsib_q_w_dq_mode
,
556 /* mandatory non-vector SIB. */
559 /* scalar, ignore vector length. */
562 /* Static rounding. */
564 /* Static rounding, 64-bit mode only. */
565 evex_rounding_64_mode
,
566 /* Supress all exceptions. */
569 /* Mask register operand. */
571 /* Mask register operand. */
639 #define FLOAT NULL, { { NULL, FLOATCODE } }, 0
641 #define DIS386(T, I) NULL, { { NULL, (T)}, { NULL, (I) } }, 0
642 #define DIS386_PREFIX(T, I, P) NULL, { { NULL, (T)}, { NULL, (I) } }, P
643 #define REG_TABLE(I) DIS386 (USE_REG_TABLE, (I))
644 #define MOD_TABLE(I) DIS386 (USE_MOD_TABLE, (I))
645 #define RM_TABLE(I) DIS386 (USE_RM_TABLE, (I))
646 #define PREFIX_TABLE(I) DIS386 (USE_PREFIX_TABLE, (I))
647 #define X86_64_TABLE(I) DIS386 (USE_X86_64_TABLE, (I))
648 #define THREE_BYTE_TABLE(I) DIS386 (USE_3BYTE_TABLE, (I))
649 #define THREE_BYTE_TABLE_PREFIX(I, P) DIS386_PREFIX (USE_3BYTE_TABLE, (I), P)
650 #define XOP_8F_TABLE(I) DIS386 (USE_XOP_8F_TABLE, (I))
651 #define VEX_C4_TABLE(I) DIS386 (USE_VEX_C4_TABLE, (I))
652 #define VEX_C5_TABLE(I) DIS386 (USE_VEX_C5_TABLE, (I))
653 #define VEX_LEN_TABLE(I) DIS386 (USE_VEX_LEN_TABLE, (I))
654 #define VEX_W_TABLE(I) DIS386 (USE_VEX_W_TABLE, (I))
655 #define EVEX_TABLE(I) DIS386 (USE_EVEX_TABLE, (I))
656 #define EVEX_LEN_TABLE(I) DIS386 (USE_EVEX_LEN_TABLE, (I))
683 REG_0F3A0F_PREFIX_1_MOD_3
,
696 REG_VEX_0F3849_X86_64_P_0_W_0_M_1
,
701 REG_XOP_09_12_M_1_L_0
,
707 REG_EVEX_0F38C6_M_0_L_2
,
708 REG_EVEX_0F38C7_M_0_L_2
785 MOD_VEX_0F12_PREFIX_0
,
786 MOD_VEX_0F12_PREFIX_2
,
788 MOD_VEX_0F16_PREFIX_0
,
789 MOD_VEX_0F16_PREFIX_2
,
813 MOD_VEX_0FF0_PREFIX_3
,
820 MOD_VEX_0F3849_X86_64_P_0_W_0
,
821 MOD_VEX_0F3849_X86_64_P_2_W_0
,
822 MOD_VEX_0F3849_X86_64_P_3_W_0
,
823 MOD_VEX_0F384B_X86_64_P_1_W_0
,
824 MOD_VEX_0F384B_X86_64_P_2_W_0
,
825 MOD_VEX_0F384B_X86_64_P_3_W_0
,
827 MOD_VEX_0F385C_X86_64_P_1_W_0
,
828 MOD_VEX_0F385E_X86_64_P_0_W_0
,
829 MOD_VEX_0F385E_X86_64_P_1_W_0
,
830 MOD_VEX_0F385E_X86_64_P_2_W_0
,
831 MOD_VEX_0F385E_X86_64_P_3_W_0
,
841 MOD_EVEX_0F12_PREFIX_0
,
842 MOD_EVEX_0F12_PREFIX_2
,
844 MOD_EVEX_0F16_PREFIX_0
,
845 MOD_EVEX_0F16_PREFIX_2
,
851 MOD_EVEX_0F382A_P_1_W_1
,
853 MOD_EVEX_0F383A_P_1_W_0
,
873 RM_0F1E_P_1_MOD_3_REG_7
,
874 RM_0FAE_REG_6_MOD_3_P_0
,
876 RM_0F3A0F_P_1_MOD_3_REG_0
,
878 RM_VEX_0F3849_X86_64_P_0_W_0_M_1_R_0
884 PREFIX_0F01_REG_1_RM_4
,
885 PREFIX_0F01_REG_1_RM_5
,
886 PREFIX_0F01_REG_1_RM_6
,
887 PREFIX_0F01_REG_1_RM_7
,
888 PREFIX_0F01_REG_3_RM_1
,
889 PREFIX_0F01_REG_5_MOD_0
,
890 PREFIX_0F01_REG_5_MOD_3_RM_0
,
891 PREFIX_0F01_REG_5_MOD_3_RM_1
,
892 PREFIX_0F01_REG_5_MOD_3_RM_2
,
893 PREFIX_0F01_REG_5_MOD_3_RM_4
,
894 PREFIX_0F01_REG_5_MOD_3_RM_5
,
895 PREFIX_0F01_REG_5_MOD_3_RM_6
,
896 PREFIX_0F01_REG_5_MOD_3_RM_7
,
897 PREFIX_0F01_REG_7_MOD_3_RM_2
,
898 PREFIX_0F01_REG_7_MOD_3_RM_6
,
899 PREFIX_0F01_REG_7_MOD_3_RM_7
,
937 PREFIX_0FAE_REG_0_MOD_3
,
938 PREFIX_0FAE_REG_1_MOD_3
,
939 PREFIX_0FAE_REG_2_MOD_3
,
940 PREFIX_0FAE_REG_3_MOD_3
,
941 PREFIX_0FAE_REG_4_MOD_0
,
942 PREFIX_0FAE_REG_4_MOD_3
,
943 PREFIX_0FAE_REG_5_MOD_3
,
944 PREFIX_0FAE_REG_6_MOD_0
,
945 PREFIX_0FAE_REG_6_MOD_3
,
946 PREFIX_0FAE_REG_7_MOD_0
,
951 PREFIX_0FC7_REG_6_MOD_0
,
952 PREFIX_0FC7_REG_6_MOD_3
,
953 PREFIX_0FC7_REG_7_MOD_3
,
981 PREFIX_VEX_0F41_L_1_M_1_W_0
,
982 PREFIX_VEX_0F41_L_1_M_1_W_1
,
983 PREFIX_VEX_0F42_L_1_M_1_W_0
,
984 PREFIX_VEX_0F42_L_1_M_1_W_1
,
985 PREFIX_VEX_0F44_L_0_M_1_W_0
,
986 PREFIX_VEX_0F44_L_0_M_1_W_1
,
987 PREFIX_VEX_0F45_L_1_M_1_W_0
,
988 PREFIX_VEX_0F45_L_1_M_1_W_1
,
989 PREFIX_VEX_0F46_L_1_M_1_W_0
,
990 PREFIX_VEX_0F46_L_1_M_1_W_1
,
991 PREFIX_VEX_0F47_L_1_M_1_W_0
,
992 PREFIX_VEX_0F47_L_1_M_1_W_1
,
993 PREFIX_VEX_0F4A_L_1_M_1_W_0
,
994 PREFIX_VEX_0F4A_L_1_M_1_W_1
,
995 PREFIX_VEX_0F4B_L_1_M_1_W_0
,
996 PREFIX_VEX_0F4B_L_1_M_1_W_1
,
1014 PREFIX_VEX_0F90_L_0_W_0
,
1015 PREFIX_VEX_0F90_L_0_W_1
,
1016 PREFIX_VEX_0F91_L_0_M_0_W_0
,
1017 PREFIX_VEX_0F91_L_0_M_0_W_1
,
1018 PREFIX_VEX_0F92_L_0_M_1_W_0
,
1019 PREFIX_VEX_0F92_L_0_M_1_W_1
,
1020 PREFIX_VEX_0F93_L_0_M_1_W_0
,
1021 PREFIX_VEX_0F93_L_0_M_1_W_1
,
1022 PREFIX_VEX_0F98_L_0_M_1_W_0
,
1023 PREFIX_VEX_0F98_L_0_M_1_W_1
,
1024 PREFIX_VEX_0F99_L_0_M_1_W_0
,
1025 PREFIX_VEX_0F99_L_0_M_1_W_1
,
1030 PREFIX_VEX_0F3849_X86_64
,
1031 PREFIX_VEX_0F384B_X86_64
,
1032 PREFIX_VEX_0F385C_X86_64
,
1033 PREFIX_VEX_0F385E_X86_64
,
1034 PREFIX_VEX_0F38F5_L_0
,
1035 PREFIX_VEX_0F38F6_L_0
,
1036 PREFIX_VEX_0F38F7_L_0
,
1037 PREFIX_VEX_0F3AF0_L_0
,
1098 PREFIX_EVEX_0F3A08_W_0
,
1099 PREFIX_EVEX_0F3A0A_W_0
,
1108 PREFIX_EVEX_MAP5_10
,
1109 PREFIX_EVEX_MAP5_11
,
1110 PREFIX_EVEX_MAP5_1D
,
1111 PREFIX_EVEX_MAP5_2A
,
1112 PREFIX_EVEX_MAP5_2C
,
1113 PREFIX_EVEX_MAP5_2D
,
1114 PREFIX_EVEX_MAP5_2E
,
1115 PREFIX_EVEX_MAP5_2F
,
1116 PREFIX_EVEX_MAP5_51
,
1117 PREFIX_EVEX_MAP5_58
,
1118 PREFIX_EVEX_MAP5_59
,
1119 PREFIX_EVEX_MAP5_5A_W_0
,
1120 PREFIX_EVEX_MAP5_5A_W_1
,
1121 PREFIX_EVEX_MAP5_5B_W_0
,
1122 PREFIX_EVEX_MAP5_5B_W_1
,
1123 PREFIX_EVEX_MAP5_5C
,
1124 PREFIX_EVEX_MAP5_5D
,
1125 PREFIX_EVEX_MAP5_5E
,
1126 PREFIX_EVEX_MAP5_5F
,
1127 PREFIX_EVEX_MAP5_78
,
1128 PREFIX_EVEX_MAP5_79
,
1129 PREFIX_EVEX_MAP5_7A
,
1130 PREFIX_EVEX_MAP5_7B
,
1131 PREFIX_EVEX_MAP5_7C
,
1132 PREFIX_EVEX_MAP5_7D_W_0
,
1134 PREFIX_EVEX_MAP6_13
,
1135 PREFIX_EVEX_MAP6_56
,
1136 PREFIX_EVEX_MAP6_57
,
1137 PREFIX_EVEX_MAP6_D6
,
1138 PREFIX_EVEX_MAP6_D7
,
1174 X86_64_0F01_REG_1_RM_5_PREFIX_2
,
1175 X86_64_0F01_REG_1_RM_6_PREFIX_2
,
1176 X86_64_0F01_REG_1_RM_7_PREFIX_2
,
1179 X86_64_0F01_REG_5_MOD_3_RM_4_PREFIX_1
,
1180 X86_64_0F01_REG_5_MOD_3_RM_5_PREFIX_1
,
1181 X86_64_0F01_REG_5_MOD_3_RM_6_PREFIX_1
,
1182 X86_64_0F01_REG_5_MOD_3_RM_7_PREFIX_1
,
1183 X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_1
,
1184 X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3
,
1185 X86_64_0F01_REG_7_MOD_3_RM_7_PREFIX_1
,
1188 X86_64_0FC7_REG_6_MOD_3_PREFIX_1
,
1198 THREE_BYTE_0F38
= 0,
1227 VEX_LEN_0F12_P_0_M_0
= 0,
1228 VEX_LEN_0F12_P_0_M_1
,
1229 #define VEX_LEN_0F12_P_2_M_0 VEX_LEN_0F12_P_0_M_0
1231 VEX_LEN_0F16_P_0_M_0
,
1232 VEX_LEN_0F16_P_0_M_1
,
1233 #define VEX_LEN_0F16_P_2_M_0 VEX_LEN_0F16_P_0_M_0
1253 VEX_LEN_0FAE_R_2_M_0
,
1254 VEX_LEN_0FAE_R_3_M_0
,
1264 VEX_LEN_0F3849_X86_64_P_0_W_0_M_0
,
1265 VEX_LEN_0F3849_X86_64_P_0_W_0_M_1_REG_0_RM_0
,
1266 VEX_LEN_0F3849_X86_64_P_2_W_0_M_0
,
1267 VEX_LEN_0F3849_X86_64_P_3_W_0_M_0
,
1268 VEX_LEN_0F384B_X86_64_P_1_W_0_M_0
,
1269 VEX_LEN_0F384B_X86_64_P_2_W_0_M_0
,
1270 VEX_LEN_0F384B_X86_64_P_3_W_0_M_0
,
1272 VEX_LEN_0F385C_X86_64_P_1_W_0_M_0
,
1273 VEX_LEN_0F385E_X86_64_P_0_W_0_M_0
,
1274 VEX_LEN_0F385E_X86_64_P_1_W_0_M_0
,
1275 VEX_LEN_0F385E_X86_64_P_2_W_0_M_0
,
1276 VEX_LEN_0F385E_X86_64_P_3_W_0_M_0
,
1309 VEX_LEN_0FXOP_08_85
,
1310 VEX_LEN_0FXOP_08_86
,
1311 VEX_LEN_0FXOP_08_87
,
1312 VEX_LEN_0FXOP_08_8E
,
1313 VEX_LEN_0FXOP_08_8F
,
1314 VEX_LEN_0FXOP_08_95
,
1315 VEX_LEN_0FXOP_08_96
,
1316 VEX_LEN_0FXOP_08_97
,
1317 VEX_LEN_0FXOP_08_9E
,
1318 VEX_LEN_0FXOP_08_9F
,
1319 VEX_LEN_0FXOP_08_A3
,
1320 VEX_LEN_0FXOP_08_A6
,
1321 VEX_LEN_0FXOP_08_B6
,
1322 VEX_LEN_0FXOP_08_C0
,
1323 VEX_LEN_0FXOP_08_C1
,
1324 VEX_LEN_0FXOP_08_C2
,
1325 VEX_LEN_0FXOP_08_C3
,
1326 VEX_LEN_0FXOP_08_CC
,
1327 VEX_LEN_0FXOP_08_CD
,
1328 VEX_LEN_0FXOP_08_CE
,
1329 VEX_LEN_0FXOP_08_CF
,
1330 VEX_LEN_0FXOP_08_EC
,
1331 VEX_LEN_0FXOP_08_ED
,
1332 VEX_LEN_0FXOP_08_EE
,
1333 VEX_LEN_0FXOP_08_EF
,
1334 VEX_LEN_0FXOP_09_01
,
1335 VEX_LEN_0FXOP_09_02
,
1336 VEX_LEN_0FXOP_09_12_M_1
,
1337 VEX_LEN_0FXOP_09_82_W_0
,
1338 VEX_LEN_0FXOP_09_83_W_0
,
1339 VEX_LEN_0FXOP_09_90
,
1340 VEX_LEN_0FXOP_09_91
,
1341 VEX_LEN_0FXOP_09_92
,
1342 VEX_LEN_0FXOP_09_93
,
1343 VEX_LEN_0FXOP_09_94
,
1344 VEX_LEN_0FXOP_09_95
,
1345 VEX_LEN_0FXOP_09_96
,
1346 VEX_LEN_0FXOP_09_97
,
1347 VEX_LEN_0FXOP_09_98
,
1348 VEX_LEN_0FXOP_09_99
,
1349 VEX_LEN_0FXOP_09_9A
,
1350 VEX_LEN_0FXOP_09_9B
,
1351 VEX_LEN_0FXOP_09_C1
,
1352 VEX_LEN_0FXOP_09_C2
,
1353 VEX_LEN_0FXOP_09_C3
,
1354 VEX_LEN_0FXOP_09_C6
,
1355 VEX_LEN_0FXOP_09_C7
,
1356 VEX_LEN_0FXOP_09_CB
,
1357 VEX_LEN_0FXOP_09_D1
,
1358 VEX_LEN_0FXOP_09_D2
,
1359 VEX_LEN_0FXOP_09_D3
,
1360 VEX_LEN_0FXOP_09_D6
,
1361 VEX_LEN_0FXOP_09_D7
,
1362 VEX_LEN_0FXOP_09_DB
,
1363 VEX_LEN_0FXOP_09_E1
,
1364 VEX_LEN_0FXOP_09_E2
,
1365 VEX_LEN_0FXOP_09_E3
,
1366 VEX_LEN_0FXOP_0A_12
,
1371 EVEX_LEN_0F3816
= 0,
1373 EVEX_LEN_0F381A_M_0
,
1374 EVEX_LEN_0F381B_M_0
,
1376 EVEX_LEN_0F385A_M_0
,
1377 EVEX_LEN_0F385B_M_0
,
1378 EVEX_LEN_0F38C6_M_0
,
1379 EVEX_LEN_0F38C7_M_0
,
1396 VEX_W_0F41_L_1_M_1
= 0,
1418 VEX_W_0F381A_M_0_L_1
,
1425 VEX_W_0F3849_X86_64_P_0
,
1426 VEX_W_0F3849_X86_64_P_2
,
1427 VEX_W_0F3849_X86_64_P_3
,
1428 VEX_W_0F384B_X86_64_P_1
,
1429 VEX_W_0F384B_X86_64_P_2
,
1430 VEX_W_0F384B_X86_64_P_3
,
1437 VEX_W_0F385A_M_0_L_0
,
1438 VEX_W_0F385C_X86_64_P_1
,
1439 VEX_W_0F385E_X86_64_P_0
,
1440 VEX_W_0F385E_X86_64_P_1
,
1441 VEX_W_0F385E_X86_64_P_2
,
1442 VEX_W_0F385E_X86_64_P_3
,
1464 VEX_W_0FXOP_08_85_L_0
,
1465 VEX_W_0FXOP_08_86_L_0
,
1466 VEX_W_0FXOP_08_87_L_0
,
1467 VEX_W_0FXOP_08_8E_L_0
,
1468 VEX_W_0FXOP_08_8F_L_0
,
1469 VEX_W_0FXOP_08_95_L_0
,
1470 VEX_W_0FXOP_08_96_L_0
,
1471 VEX_W_0FXOP_08_97_L_0
,
1472 VEX_W_0FXOP_08_9E_L_0
,
1473 VEX_W_0FXOP_08_9F_L_0
,
1474 VEX_W_0FXOP_08_A6_L_0
,
1475 VEX_W_0FXOP_08_B6_L_0
,
1476 VEX_W_0FXOP_08_C0_L_0
,
1477 VEX_W_0FXOP_08_C1_L_0
,
1478 VEX_W_0FXOP_08_C2_L_0
,
1479 VEX_W_0FXOP_08_C3_L_0
,
1480 VEX_W_0FXOP_08_CC_L_0
,
1481 VEX_W_0FXOP_08_CD_L_0
,
1482 VEX_W_0FXOP_08_CE_L_0
,
1483 VEX_W_0FXOP_08_CF_L_0
,
1484 VEX_W_0FXOP_08_EC_L_0
,
1485 VEX_W_0FXOP_08_ED_L_0
,
1486 VEX_W_0FXOP_08_EE_L_0
,
1487 VEX_W_0FXOP_08_EF_L_0
,
1493 VEX_W_0FXOP_09_C1_L_0
,
1494 VEX_W_0FXOP_09_C2_L_0
,
1495 VEX_W_0FXOP_09_C3_L_0
,
1496 VEX_W_0FXOP_09_C6_L_0
,
1497 VEX_W_0FXOP_09_C7_L_0
,
1498 VEX_W_0FXOP_09_CB_L_0
,
1499 VEX_W_0FXOP_09_D1_L_0
,
1500 VEX_W_0FXOP_09_D2_L_0
,
1501 VEX_W_0FXOP_09_D3_L_0
,
1502 VEX_W_0FXOP_09_D6_L_0
,
1503 VEX_W_0FXOP_09_D7_L_0
,
1504 VEX_W_0FXOP_09_DB_L_0
,
1505 VEX_W_0FXOP_09_E1_L_0
,
1506 VEX_W_0FXOP_09_E2_L_0
,
1507 VEX_W_0FXOP_09_E3_L_0
,
1513 EVEX_W_0F12_P_0_M_1
,
1516 EVEX_W_0F16_P_0_M_1
,
1594 EVEX_W_0F381A_M_0_L_n
,
1595 EVEX_W_0F381B_M_0_L_2
,
1621 EVEX_W_0F385A_M_0_L_n
,
1622 EVEX_W_0F385B_M_0_L_2
,
1668 typedef void (*op_rtn
) (int bytemode
, int sizeflag
);
1677 unsigned int prefix_requirement
;
1680 /* Upper case letters in the instruction names here are macros.
1681 'A' => print 'b' if no register operands or suffix_always is true
1682 'B' => print 'b' if suffix_always is true
1683 'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
1685 'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
1686 suffix_always is true
1687 'E' => print 'e' if 32-bit form of jcxz
1688 'F' => print 'w' or 'l' depending on address size prefix (loop insns)
1689 'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
1690 'H' => print ",pt" or ",pn" branch hint
1693 'K' => print 'd' or 'q' if rex prefix is present.
1695 'M' => print 'r' if intel_mnemonic is false.
1696 'N' => print 'n' if instruction has no wait "prefix"
1697 'O' => print 'd' or 'o' (or 'q' in Intel mode)
1698 'P' => behave as 'T' except with register operand outside of suffix_always
1700 'Q' => print 'w', 'l' or 'q' for memory operand or suffix_always
1702 'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
1703 'S' => print 'w', 'l' or 'q' if suffix_always is true
1704 'T' => print 'w', 'l'/'d', or 'q' if instruction has an operand size
1705 prefix or if suffix_always is true.
1708 'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
1709 'X' => print 's', 'd' depending on data16 prefix (for XMM)
1711 'Z' => print 'q' in 64bit mode and 'l' otherwise, if suffix_always is true.
1712 '!' => change condition from true to false or from false to true.
1713 '%' => add 1 upper case letter to the macro.
1714 '^' => print 'w', 'l', or 'q' (Intel64 ISA only) depending on operand size
1715 prefix or suffix_always is true (lcall/ljmp).
1716 '@' => in 64bit mode for Intel64 ISA or if instruction
1717 has no operand sizing prefix, print 'q' if suffix_always is true or
1718 nothing otherwise; behave as 'P' in all other cases
1720 2 upper case letter macros:
1721 "XY" => print 'x' or 'y' if suffix_always is true or no register
1722 operands and no broadcast.
1723 "XZ" => print 'x', 'y', or 'z' if suffix_always is true or no
1724 register operands and no broadcast.
1725 "XW" => print 's', 'd' depending on the VEX.W bit (for FMA)
1726 "XH" => print 'h' if EVEX.W=0, EVEX.W=1 is not a valid encoding (for FP16)
1727 "XV" => print "{vex3}" pseudo prefix
1728 "LQ" => print 'l' ('d' in Intel mode) or 'q' for memory operand, cond
1729 being false, or no operand at all in 64bit mode, or if suffix_always
1731 "LB" => print "abs" in 64bit mode and behave as 'B' otherwise
1732 "LS" => print "abs" in 64bit mode and behave as 'S' otherwise
1733 "LV" => print "abs" for 64bit operand and behave as 'S' otherwise
1734 "DQ" => print 'd' or 'q' depending on the VEX.W bit
1735 "BW" => print 'b' or 'w' depending on the VEX.W bit
1736 "LP" => print 'w' or 'l' ('d' in Intel mode) if instruction has
1737 an operand size prefix, or suffix_always is true. print
1738 'q' if rex prefix is present.
1740 Many of the above letters print nothing in Intel mode. See "putop"
1743 Braces '{' and '}', and vertical bars '|', indicate alternative
1744 mnemonic strings for AT&T and Intel. */
1746 static const struct dis386 dis386
[] = {
1748 { "addB", { Ebh1
, Gb
}, 0 },
1749 { "addS", { Evh1
, Gv
}, 0 },
1750 { "addB", { Gb
, EbS
}, 0 },
1751 { "addS", { Gv
, EvS
}, 0 },
1752 { "addB", { AL
, Ib
}, 0 },
1753 { "addS", { eAX
, Iv
}, 0 },
1754 { X86_64_TABLE (X86_64_06
) },
1755 { X86_64_TABLE (X86_64_07
) },
1757 { "orB", { Ebh1
, Gb
}, 0 },
1758 { "orS", { Evh1
, Gv
}, 0 },
1759 { "orB", { Gb
, EbS
}, 0 },
1760 { "orS", { Gv
, EvS
}, 0 },
1761 { "orB", { AL
, Ib
}, 0 },
1762 { "orS", { eAX
, Iv
}, 0 },
1763 { X86_64_TABLE (X86_64_0E
) },
1764 { Bad_Opcode
}, /* 0x0f extended opcode escape */
1766 { "adcB", { Ebh1
, Gb
}, 0 },
1767 { "adcS", { Evh1
, Gv
}, 0 },
1768 { "adcB", { Gb
, EbS
}, 0 },
1769 { "adcS", { Gv
, EvS
}, 0 },
1770 { "adcB", { AL
, Ib
}, 0 },
1771 { "adcS", { eAX
, Iv
}, 0 },
1772 { X86_64_TABLE (X86_64_16
) },
1773 { X86_64_TABLE (X86_64_17
) },
1775 { "sbbB", { Ebh1
, Gb
}, 0 },
1776 { "sbbS", { Evh1
, Gv
}, 0 },
1777 { "sbbB", { Gb
, EbS
}, 0 },
1778 { "sbbS", { Gv
, EvS
}, 0 },
1779 { "sbbB", { AL
, Ib
}, 0 },
1780 { "sbbS", { eAX
, Iv
}, 0 },
1781 { X86_64_TABLE (X86_64_1E
) },
1782 { X86_64_TABLE (X86_64_1F
) },
1784 { "andB", { Ebh1
, Gb
}, 0 },
1785 { "andS", { Evh1
, Gv
}, 0 },
1786 { "andB", { Gb
, EbS
}, 0 },
1787 { "andS", { Gv
, EvS
}, 0 },
1788 { "andB", { AL
, Ib
}, 0 },
1789 { "andS", { eAX
, Iv
}, 0 },
1790 { Bad_Opcode
}, /* SEG ES prefix */
1791 { X86_64_TABLE (X86_64_27
) },
1793 { "subB", { Ebh1
, Gb
}, 0 },
1794 { "subS", { Evh1
, Gv
}, 0 },
1795 { "subB", { Gb
, EbS
}, 0 },
1796 { "subS", { Gv
, EvS
}, 0 },
1797 { "subB", { AL
, Ib
}, 0 },
1798 { "subS", { eAX
, Iv
}, 0 },
1799 { Bad_Opcode
}, /* SEG CS prefix */
1800 { X86_64_TABLE (X86_64_2F
) },
1802 { "xorB", { Ebh1
, Gb
}, 0 },
1803 { "xorS", { Evh1
, Gv
}, 0 },
1804 { "xorB", { Gb
, EbS
}, 0 },
1805 { "xorS", { Gv
, EvS
}, 0 },
1806 { "xorB", { AL
, Ib
}, 0 },
1807 { "xorS", { eAX
, Iv
}, 0 },
1808 { Bad_Opcode
}, /* SEG SS prefix */
1809 { X86_64_TABLE (X86_64_37
) },
1811 { "cmpB", { Eb
, Gb
}, 0 },
1812 { "cmpS", { Ev
, Gv
}, 0 },
1813 { "cmpB", { Gb
, EbS
}, 0 },
1814 { "cmpS", { Gv
, EvS
}, 0 },
1815 { "cmpB", { AL
, Ib
}, 0 },
1816 { "cmpS", { eAX
, Iv
}, 0 },
1817 { Bad_Opcode
}, /* SEG DS prefix */
1818 { X86_64_TABLE (X86_64_3F
) },
1820 { "inc{S|}", { RMeAX
}, 0 },
1821 { "inc{S|}", { RMeCX
}, 0 },
1822 { "inc{S|}", { RMeDX
}, 0 },
1823 { "inc{S|}", { RMeBX
}, 0 },
1824 { "inc{S|}", { RMeSP
}, 0 },
1825 { "inc{S|}", { RMeBP
}, 0 },
1826 { "inc{S|}", { RMeSI
}, 0 },
1827 { "inc{S|}", { RMeDI
}, 0 },
1829 { "dec{S|}", { RMeAX
}, 0 },
1830 { "dec{S|}", { RMeCX
}, 0 },
1831 { "dec{S|}", { RMeDX
}, 0 },
1832 { "dec{S|}", { RMeBX
}, 0 },
1833 { "dec{S|}", { RMeSP
}, 0 },
1834 { "dec{S|}", { RMeBP
}, 0 },
1835 { "dec{S|}", { RMeSI
}, 0 },
1836 { "dec{S|}", { RMeDI
}, 0 },
1838 { "push{!P|}", { RMrAX
}, 0 },
1839 { "push{!P|}", { RMrCX
}, 0 },
1840 { "push{!P|}", { RMrDX
}, 0 },
1841 { "push{!P|}", { RMrBX
}, 0 },
1842 { "push{!P|}", { RMrSP
}, 0 },
1843 { "push{!P|}", { RMrBP
}, 0 },
1844 { "push{!P|}", { RMrSI
}, 0 },
1845 { "push{!P|}", { RMrDI
}, 0 },
1847 { "pop{!P|}", { RMrAX
}, 0 },
1848 { "pop{!P|}", { RMrCX
}, 0 },
1849 { "pop{!P|}", { RMrDX
}, 0 },
1850 { "pop{!P|}", { RMrBX
}, 0 },
1851 { "pop{!P|}", { RMrSP
}, 0 },
1852 { "pop{!P|}", { RMrBP
}, 0 },
1853 { "pop{!P|}", { RMrSI
}, 0 },
1854 { "pop{!P|}", { RMrDI
}, 0 },
1856 { X86_64_TABLE (X86_64_60
) },
1857 { X86_64_TABLE (X86_64_61
) },
1858 { X86_64_TABLE (X86_64_62
) },
1859 { X86_64_TABLE (X86_64_63
) },
1860 { Bad_Opcode
}, /* seg fs */
1861 { Bad_Opcode
}, /* seg gs */
1862 { Bad_Opcode
}, /* op size prefix */
1863 { Bad_Opcode
}, /* adr size prefix */
1865 { "pushP", { sIv
}, 0 },
1866 { "imulS", { Gv
, Ev
, Iv
}, 0 },
1867 { "pushP", { sIbT
}, 0 },
1868 { "imulS", { Gv
, Ev
, sIb
}, 0 },
1869 { "ins{b|}", { Ybr
, indirDX
}, 0 },
1870 { X86_64_TABLE (X86_64_6D
) },
1871 { "outs{b|}", { indirDXr
, Xb
}, 0 },
1872 { X86_64_TABLE (X86_64_6F
) },
1874 { "joH", { Jb
, BND
, cond_jump_flag
}, 0 },
1875 { "jnoH", { Jb
, BND
, cond_jump_flag
}, 0 },
1876 { "jbH", { Jb
, BND
, cond_jump_flag
}, 0 },
1877 { "jaeH", { Jb
, BND
, cond_jump_flag
}, 0 },
1878 { "jeH", { Jb
, BND
, cond_jump_flag
}, 0 },
1879 { "jneH", { Jb
, BND
, cond_jump_flag
}, 0 },
1880 { "jbeH", { Jb
, BND
, cond_jump_flag
}, 0 },
1881 { "jaH", { Jb
, BND
, cond_jump_flag
}, 0 },
1883 { "jsH", { Jb
, BND
, cond_jump_flag
}, 0 },
1884 { "jnsH", { Jb
, BND
, cond_jump_flag
}, 0 },
1885 { "jpH", { Jb
, BND
, cond_jump_flag
}, 0 },
1886 { "jnpH", { Jb
, BND
, cond_jump_flag
}, 0 },
1887 { "jlH", { Jb
, BND
, cond_jump_flag
}, 0 },
1888 { "jgeH", { Jb
, BND
, cond_jump_flag
}, 0 },
1889 { "jleH", { Jb
, BND
, cond_jump_flag
}, 0 },
1890 { "jgH", { Jb
, BND
, cond_jump_flag
}, 0 },
1892 { REG_TABLE (REG_80
) },
1893 { REG_TABLE (REG_81
) },
1894 { X86_64_TABLE (X86_64_82
) },
1895 { REG_TABLE (REG_83
) },
1896 { "testB", { Eb
, Gb
}, 0 },
1897 { "testS", { Ev
, Gv
}, 0 },
1898 { "xchgB", { Ebh2
, Gb
}, 0 },
1899 { "xchgS", { Evh2
, Gv
}, 0 },
1901 { "movB", { Ebh3
, Gb
}, 0 },
1902 { "movS", { Evh3
, Gv
}, 0 },
1903 { "movB", { Gb
, EbS
}, 0 },
1904 { "movS", { Gv
, EvS
}, 0 },
1905 { "movD", { Sv
, Sw
}, 0 },
1906 { MOD_TABLE (MOD_8D
) },
1907 { "movD", { Sw
, Sv
}, 0 },
1908 { REG_TABLE (REG_8F
) },
1910 { PREFIX_TABLE (PREFIX_90
) },
1911 { "xchgS", { RMeCX
, eAX
}, 0 },
1912 { "xchgS", { RMeDX
, eAX
}, 0 },
1913 { "xchgS", { RMeBX
, eAX
}, 0 },
1914 { "xchgS", { RMeSP
, eAX
}, 0 },
1915 { "xchgS", { RMeBP
, eAX
}, 0 },
1916 { "xchgS", { RMeSI
, eAX
}, 0 },
1917 { "xchgS", { RMeDI
, eAX
}, 0 },
1919 { "cW{t|}R", { XX
}, 0 },
1920 { "cR{t|}O", { XX
}, 0 },
1921 { X86_64_TABLE (X86_64_9A
) },
1922 { Bad_Opcode
}, /* fwait */
1923 { "pushfP", { XX
}, 0 },
1924 { "popfP", { XX
}, 0 },
1925 { "sahf", { XX
}, 0 },
1926 { "lahf", { XX
}, 0 },
1928 { "mov%LB", { AL
, Ob
}, 0 },
1929 { "mov%LS", { eAX
, Ov
}, 0 },
1930 { "mov%LB", { Ob
, AL
}, 0 },
1931 { "mov%LS", { Ov
, eAX
}, 0 },
1932 { "movs{b|}", { Ybr
, Xb
}, 0 },
1933 { "movs{R|}", { Yvr
, Xv
}, 0 },
1934 { "cmps{b|}", { Xb
, Yb
}, 0 },
1935 { "cmps{R|}", { Xv
, Yv
}, 0 },
1937 { "testB", { AL
, Ib
}, 0 },
1938 { "testS", { eAX
, Iv
}, 0 },
1939 { "stosB", { Ybr
, AL
}, 0 },
1940 { "stosS", { Yvr
, eAX
}, 0 },
1941 { "lodsB", { ALr
, Xb
}, 0 },
1942 { "lodsS", { eAXr
, Xv
}, 0 },
1943 { "scasB", { AL
, Yb
}, 0 },
1944 { "scasS", { eAX
, Yv
}, 0 },
1946 { "movB", { RMAL
, Ib
}, 0 },
1947 { "movB", { RMCL
, Ib
}, 0 },
1948 { "movB", { RMDL
, Ib
}, 0 },
1949 { "movB", { RMBL
, Ib
}, 0 },
1950 { "movB", { RMAH
, Ib
}, 0 },
1951 { "movB", { RMCH
, Ib
}, 0 },
1952 { "movB", { RMDH
, Ib
}, 0 },
1953 { "movB", { RMBH
, Ib
}, 0 },
1955 { "mov%LV", { RMeAX
, Iv64
}, 0 },
1956 { "mov%LV", { RMeCX
, Iv64
}, 0 },
1957 { "mov%LV", { RMeDX
, Iv64
}, 0 },
1958 { "mov%LV", { RMeBX
, Iv64
}, 0 },
1959 { "mov%LV", { RMeSP
, Iv64
}, 0 },
1960 { "mov%LV", { RMeBP
, Iv64
}, 0 },
1961 { "mov%LV", { RMeSI
, Iv64
}, 0 },
1962 { "mov%LV", { RMeDI
, Iv64
}, 0 },
1964 { REG_TABLE (REG_C0
) },
1965 { REG_TABLE (REG_C1
) },
1966 { X86_64_TABLE (X86_64_C2
) },
1967 { X86_64_TABLE (X86_64_C3
) },
1968 { X86_64_TABLE (X86_64_C4
) },
1969 { X86_64_TABLE (X86_64_C5
) },
1970 { REG_TABLE (REG_C6
) },
1971 { REG_TABLE (REG_C7
) },
1973 { "enterP", { Iw
, Ib
}, 0 },
1974 { "leaveP", { XX
}, 0 },
1975 { "{l|}ret{|f}%LP", { Iw
}, 0 },
1976 { "{l|}ret{|f}%LP", { XX
}, 0 },
1977 { "int3", { XX
}, 0 },
1978 { "int", { Ib
}, 0 },
1979 { X86_64_TABLE (X86_64_CE
) },
1980 { "iret%LP", { XX
}, 0 },
1982 { REG_TABLE (REG_D0
) },
1983 { REG_TABLE (REG_D1
) },
1984 { REG_TABLE (REG_D2
) },
1985 { REG_TABLE (REG_D3
) },
1986 { X86_64_TABLE (X86_64_D4
) },
1987 { X86_64_TABLE (X86_64_D5
) },
1989 { "xlat", { DSBX
}, 0 },
2000 { "loopneFH", { Jb
, XX
, loop_jcxz_flag
}, 0 },
2001 { "loopeFH", { Jb
, XX
, loop_jcxz_flag
}, 0 },
2002 { "loopFH", { Jb
, XX
, loop_jcxz_flag
}, 0 },
2003 { "jEcxzH", { Jb
, XX
, loop_jcxz_flag
}, 0 },
2004 { "inB", { AL
, Ib
}, 0 },
2005 { "inG", { zAX
, Ib
}, 0 },
2006 { "outB", { Ib
, AL
}, 0 },
2007 { "outG", { Ib
, zAX
}, 0 },
2009 { X86_64_TABLE (X86_64_E8
) },
2010 { X86_64_TABLE (X86_64_E9
) },
2011 { X86_64_TABLE (X86_64_EA
) },
2012 { "jmp", { Jb
, BND
}, 0 },
2013 { "inB", { AL
, indirDX
}, 0 },
2014 { "inG", { zAX
, indirDX
}, 0 },
2015 { "outB", { indirDX
, AL
}, 0 },
2016 { "outG", { indirDX
, zAX
}, 0 },
2018 { Bad_Opcode
}, /* lock prefix */
2019 { "int1", { XX
}, 0 },
2020 { Bad_Opcode
}, /* repne */
2021 { Bad_Opcode
}, /* repz */
2022 { "hlt", { XX
}, 0 },
2023 { "cmc", { XX
}, 0 },
2024 { REG_TABLE (REG_F6
) },
2025 { REG_TABLE (REG_F7
) },
2027 { "clc", { XX
}, 0 },
2028 { "stc", { XX
}, 0 },
2029 { "cli", { XX
}, 0 },
2030 { "sti", { XX
}, 0 },
2031 { "cld", { XX
}, 0 },
2032 { "std", { XX
}, 0 },
2033 { REG_TABLE (REG_FE
) },
2034 { REG_TABLE (REG_FF
) },
2037 static const struct dis386 dis386_twobyte
[] = {
2039 { REG_TABLE (REG_0F00
) },
2040 { REG_TABLE (REG_0F01
) },
2041 { "larS", { Gv
, Ew
}, 0 },
2042 { "lslS", { Gv
, Ew
}, 0 },
2044 { "syscall", { XX
}, 0 },
2045 { "clts", { XX
}, 0 },
2046 { "sysret%LQ", { XX
}, 0 },
2048 { "invd", { XX
}, 0 },
2049 { PREFIX_TABLE (PREFIX_0F09
) },
2051 { "ud2", { XX
}, 0 },
2053 { REG_TABLE (REG_0F0D
) },
2054 { "femms", { XX
}, 0 },
2055 { "", { MX
, EM
, OPSUF
}, 0 }, /* See OP_3DNowSuffix. */
2057 { PREFIX_TABLE (PREFIX_0F10
) },
2058 { PREFIX_TABLE (PREFIX_0F11
) },
2059 { PREFIX_TABLE (PREFIX_0F12
) },
2060 { MOD_TABLE (MOD_0F13
) },
2061 { "unpcklpX", { XM
, EXx
}, PREFIX_OPCODE
},
2062 { "unpckhpX", { XM
, EXx
}, PREFIX_OPCODE
},
2063 { PREFIX_TABLE (PREFIX_0F16
) },
2064 { MOD_TABLE (MOD_0F17
) },
2066 { REG_TABLE (REG_0F18
) },
2067 { "nopQ", { Ev
}, 0 },
2068 { PREFIX_TABLE (PREFIX_0F1A
) },
2069 { PREFIX_TABLE (PREFIX_0F1B
) },
2070 { PREFIX_TABLE (PREFIX_0F1C
) },
2071 { "nopQ", { Ev
}, 0 },
2072 { PREFIX_TABLE (PREFIX_0F1E
) },
2073 { "nopQ", { Ev
}, 0 },
2075 { "movZ", { Em
, Cm
}, 0 },
2076 { "movZ", { Em
, Dm
}, 0 },
2077 { "movZ", { Cm
, Em
}, 0 },
2078 { "movZ", { Dm
, Em
}, 0 },
2079 { X86_64_TABLE (X86_64_0F24
) },
2081 { X86_64_TABLE (X86_64_0F26
) },
2084 { "movapX", { XM
, EXx
}, PREFIX_OPCODE
},
2085 { "movapX", { EXxS
, XM
}, PREFIX_OPCODE
},
2086 { PREFIX_TABLE (PREFIX_0F2A
) },
2087 { PREFIX_TABLE (PREFIX_0F2B
) },
2088 { PREFIX_TABLE (PREFIX_0F2C
) },
2089 { PREFIX_TABLE (PREFIX_0F2D
) },
2090 { PREFIX_TABLE (PREFIX_0F2E
) },
2091 { PREFIX_TABLE (PREFIX_0F2F
) },
2093 { "wrmsr", { XX
}, 0 },
2094 { "rdtsc", { XX
}, 0 },
2095 { "rdmsr", { XX
}, 0 },
2096 { "rdpmc", { XX
}, 0 },
2097 { "sysenter", { SEP
}, 0 },
2098 { "sysexit%LQ", { SEP
}, 0 },
2100 { "getsec", { XX
}, 0 },
2102 { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F38
, PREFIX_OPCODE
) },
2104 { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F3A
, PREFIX_OPCODE
) },
2111 { "cmovoS", { Gv
, Ev
}, 0 },
2112 { "cmovnoS", { Gv
, Ev
}, 0 },
2113 { "cmovbS", { Gv
, Ev
}, 0 },
2114 { "cmovaeS", { Gv
, Ev
}, 0 },
2115 { "cmoveS", { Gv
, Ev
}, 0 },
2116 { "cmovneS", { Gv
, Ev
}, 0 },
2117 { "cmovbeS", { Gv
, Ev
}, 0 },
2118 { "cmovaS", { Gv
, Ev
}, 0 },
2120 { "cmovsS", { Gv
, Ev
}, 0 },
2121 { "cmovnsS", { Gv
, Ev
}, 0 },
2122 { "cmovpS", { Gv
, Ev
}, 0 },
2123 { "cmovnpS", { Gv
, Ev
}, 0 },
2124 { "cmovlS", { Gv
, Ev
}, 0 },
2125 { "cmovgeS", { Gv
, Ev
}, 0 },
2126 { "cmovleS", { Gv
, Ev
}, 0 },
2127 { "cmovgS", { Gv
, Ev
}, 0 },
2129 { MOD_TABLE (MOD_0F50
) },
2130 { PREFIX_TABLE (PREFIX_0F51
) },
2131 { PREFIX_TABLE (PREFIX_0F52
) },
2132 { PREFIX_TABLE (PREFIX_0F53
) },
2133 { "andpX", { XM
, EXx
}, PREFIX_OPCODE
},
2134 { "andnpX", { XM
, EXx
}, PREFIX_OPCODE
},
2135 { "orpX", { XM
, EXx
}, PREFIX_OPCODE
},
2136 { "xorpX", { XM
, EXx
}, PREFIX_OPCODE
},
2138 { PREFIX_TABLE (PREFIX_0F58
) },
2139 { PREFIX_TABLE (PREFIX_0F59
) },
2140 { PREFIX_TABLE (PREFIX_0F5A
) },
2141 { PREFIX_TABLE (PREFIX_0F5B
) },
2142 { PREFIX_TABLE (PREFIX_0F5C
) },
2143 { PREFIX_TABLE (PREFIX_0F5D
) },
2144 { PREFIX_TABLE (PREFIX_0F5E
) },
2145 { PREFIX_TABLE (PREFIX_0F5F
) },
2147 { PREFIX_TABLE (PREFIX_0F60
) },
2148 { PREFIX_TABLE (PREFIX_0F61
) },
2149 { PREFIX_TABLE (PREFIX_0F62
) },
2150 { "packsswb", { MX
, EM
}, PREFIX_OPCODE
},
2151 { "pcmpgtb", { MX
, EM
}, PREFIX_OPCODE
},
2152 { "pcmpgtw", { MX
, EM
}, PREFIX_OPCODE
},
2153 { "pcmpgtd", { MX
, EM
}, PREFIX_OPCODE
},
2154 { "packuswb", { MX
, EM
}, PREFIX_OPCODE
},
2156 { "punpckhbw", { MX
, EM
}, PREFIX_OPCODE
},
2157 { "punpckhwd", { MX
, EM
}, PREFIX_OPCODE
},
2158 { "punpckhdq", { MX
, EM
}, PREFIX_OPCODE
},
2159 { "packssdw", { MX
, EM
}, PREFIX_OPCODE
},
2160 { "punpcklqdq", { XM
, EXx
}, PREFIX_DATA
},
2161 { "punpckhqdq", { XM
, EXx
}, PREFIX_DATA
},
2162 { "movK", { MX
, Edq
}, PREFIX_OPCODE
},
2163 { PREFIX_TABLE (PREFIX_0F6F
) },
2165 { PREFIX_TABLE (PREFIX_0F70
) },
2166 { MOD_TABLE (MOD_0F71
) },
2167 { MOD_TABLE (MOD_0F72
) },
2168 { MOD_TABLE (MOD_0F73
) },
2169 { "pcmpeqb", { MX
, EM
}, PREFIX_OPCODE
},
2170 { "pcmpeqw", { MX
, EM
}, PREFIX_OPCODE
},
2171 { "pcmpeqd", { MX
, EM
}, PREFIX_OPCODE
},
2172 { "emms", { XX
}, PREFIX_OPCODE
},
2174 { PREFIX_TABLE (PREFIX_0F78
) },
2175 { PREFIX_TABLE (PREFIX_0F79
) },
2178 { PREFIX_TABLE (PREFIX_0F7C
) },
2179 { PREFIX_TABLE (PREFIX_0F7D
) },
2180 { PREFIX_TABLE (PREFIX_0F7E
) },
2181 { PREFIX_TABLE (PREFIX_0F7F
) },
2183 { "joH", { Jv
, BND
, cond_jump_flag
}, 0 },
2184 { "jnoH", { Jv
, BND
, cond_jump_flag
}, 0 },
2185 { "jbH", { Jv
, BND
, cond_jump_flag
}, 0 },
2186 { "jaeH", { Jv
, BND
, cond_jump_flag
}, 0 },
2187 { "jeH", { Jv
, BND
, cond_jump_flag
}, 0 },
2188 { "jneH", { Jv
, BND
, cond_jump_flag
}, 0 },
2189 { "jbeH", { Jv
, BND
, cond_jump_flag
}, 0 },
2190 { "jaH", { Jv
, BND
, cond_jump_flag
}, 0 },
2192 { "jsH", { Jv
, BND
, cond_jump_flag
}, 0 },
2193 { "jnsH", { Jv
, BND
, cond_jump_flag
}, 0 },
2194 { "jpH", { Jv
, BND
, cond_jump_flag
}, 0 },
2195 { "jnpH", { Jv
, BND
, cond_jump_flag
}, 0 },
2196 { "jlH", { Jv
, BND
, cond_jump_flag
}, 0 },
2197 { "jgeH", { Jv
, BND
, cond_jump_flag
}, 0 },
2198 { "jleH", { Jv
, BND
, cond_jump_flag
}, 0 },
2199 { "jgH", { Jv
, BND
, cond_jump_flag
}, 0 },
2201 { "seto", { Eb
}, 0 },
2202 { "setno", { Eb
}, 0 },
2203 { "setb", { Eb
}, 0 },
2204 { "setae", { Eb
}, 0 },
2205 { "sete", { Eb
}, 0 },
2206 { "setne", { Eb
}, 0 },
2207 { "setbe", { Eb
}, 0 },
2208 { "seta", { Eb
}, 0 },
2210 { "sets", { Eb
}, 0 },
2211 { "setns", { Eb
}, 0 },
2212 { "setp", { Eb
}, 0 },
2213 { "setnp", { Eb
}, 0 },
2214 { "setl", { Eb
}, 0 },
2215 { "setge", { Eb
}, 0 },
2216 { "setle", { Eb
}, 0 },
2217 { "setg", { Eb
}, 0 },
2219 { "pushP", { fs
}, 0 },
2220 { "popP", { fs
}, 0 },
2221 { "cpuid", { XX
}, 0 },
2222 { "btS", { Ev
, Gv
}, 0 },
2223 { "shldS", { Ev
, Gv
, Ib
}, 0 },
2224 { "shldS", { Ev
, Gv
, CL
}, 0 },
2225 { REG_TABLE (REG_0FA6
) },
2226 { REG_TABLE (REG_0FA7
) },
2228 { "pushP", { gs
}, 0 },
2229 { "popP", { gs
}, 0 },
2230 { "rsm", { XX
}, 0 },
2231 { "btsS", { Evh1
, Gv
}, 0 },
2232 { "shrdS", { Ev
, Gv
, Ib
}, 0 },
2233 { "shrdS", { Ev
, Gv
, CL
}, 0 },
2234 { REG_TABLE (REG_0FAE
) },
2235 { "imulS", { Gv
, Ev
}, 0 },
2237 { "cmpxchgB", { Ebh1
, Gb
}, 0 },
2238 { "cmpxchgS", { Evh1
, Gv
}, 0 },
2239 { MOD_TABLE (MOD_0FB2
) },
2240 { "btrS", { Evh1
, Gv
}, 0 },
2241 { MOD_TABLE (MOD_0FB4
) },
2242 { MOD_TABLE (MOD_0FB5
) },
2243 { "movz{bR|x}", { Gv
, Eb
}, 0 },
2244 { "movz{wR|x}", { Gv
, Ew
}, 0 }, /* yes, there really is movzww ! */
2246 { PREFIX_TABLE (PREFIX_0FB8
) },
2247 { "ud1S", { Gv
, Ev
}, 0 },
2248 { REG_TABLE (REG_0FBA
) },
2249 { "btcS", { Evh1
, Gv
}, 0 },
2250 { PREFIX_TABLE (PREFIX_0FBC
) },
2251 { PREFIX_TABLE (PREFIX_0FBD
) },
2252 { "movs{bR|x}", { Gv
, Eb
}, 0 },
2253 { "movs{wR|x}", { Gv
, Ew
}, 0 }, /* yes, there really is movsww ! */
2255 { "xaddB", { Ebh1
, Gb
}, 0 },
2256 { "xaddS", { Evh1
, Gv
}, 0 },
2257 { PREFIX_TABLE (PREFIX_0FC2
) },
2258 { MOD_TABLE (MOD_0FC3
) },
2259 { "pinsrw", { MX
, Edw
, Ib
}, PREFIX_OPCODE
},
2260 { "pextrw", { Gd
, MS
, Ib
}, PREFIX_OPCODE
},
2261 { "shufpX", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
2262 { REG_TABLE (REG_0FC7
) },
2264 { "bswap", { RMeAX
}, 0 },
2265 { "bswap", { RMeCX
}, 0 },
2266 { "bswap", { RMeDX
}, 0 },
2267 { "bswap", { RMeBX
}, 0 },
2268 { "bswap", { RMeSP
}, 0 },
2269 { "bswap", { RMeBP
}, 0 },
2270 { "bswap", { RMeSI
}, 0 },
2271 { "bswap", { RMeDI
}, 0 },
2273 { PREFIX_TABLE (PREFIX_0FD0
) },
2274 { "psrlw", { MX
, EM
}, PREFIX_OPCODE
},
2275 { "psrld", { MX
, EM
}, PREFIX_OPCODE
},
2276 { "psrlq", { MX
, EM
}, PREFIX_OPCODE
},
2277 { "paddq", { MX
, EM
}, PREFIX_OPCODE
},
2278 { "pmullw", { MX
, EM
}, PREFIX_OPCODE
},
2279 { PREFIX_TABLE (PREFIX_0FD6
) },
2280 { MOD_TABLE (MOD_0FD7
) },
2282 { "psubusb", { MX
, EM
}, PREFIX_OPCODE
},
2283 { "psubusw", { MX
, EM
}, PREFIX_OPCODE
},
2284 { "pminub", { MX
, EM
}, PREFIX_OPCODE
},
2285 { "pand", { MX
, EM
}, PREFIX_OPCODE
},
2286 { "paddusb", { MX
, EM
}, PREFIX_OPCODE
},
2287 { "paddusw", { MX
, EM
}, PREFIX_OPCODE
},
2288 { "pmaxub", { MX
, EM
}, PREFIX_OPCODE
},
2289 { "pandn", { MX
, EM
}, PREFIX_OPCODE
},
2291 { "pavgb", { MX
, EM
}, PREFIX_OPCODE
},
2292 { "psraw", { MX
, EM
}, PREFIX_OPCODE
},
2293 { "psrad", { MX
, EM
}, PREFIX_OPCODE
},
2294 { "pavgw", { MX
, EM
}, PREFIX_OPCODE
},
2295 { "pmulhuw", { MX
, EM
}, PREFIX_OPCODE
},
2296 { "pmulhw", { MX
, EM
}, PREFIX_OPCODE
},
2297 { PREFIX_TABLE (PREFIX_0FE6
) },
2298 { PREFIX_TABLE (PREFIX_0FE7
) },
2300 { "psubsb", { MX
, EM
}, PREFIX_OPCODE
},
2301 { "psubsw", { MX
, EM
}, PREFIX_OPCODE
},
2302 { "pminsw", { MX
, EM
}, PREFIX_OPCODE
},
2303 { "por", { MX
, EM
}, PREFIX_OPCODE
},
2304 { "paddsb", { MX
, EM
}, PREFIX_OPCODE
},
2305 { "paddsw", { MX
, EM
}, PREFIX_OPCODE
},
2306 { "pmaxsw", { MX
, EM
}, PREFIX_OPCODE
},
2307 { "pxor", { MX
, EM
}, PREFIX_OPCODE
},
2309 { PREFIX_TABLE (PREFIX_0FF0
) },
2310 { "psllw", { MX
, EM
}, PREFIX_OPCODE
},
2311 { "pslld", { MX
, EM
}, PREFIX_OPCODE
},
2312 { "psllq", { MX
, EM
}, PREFIX_OPCODE
},
2313 { "pmuludq", { MX
, EM
}, PREFIX_OPCODE
},
2314 { "pmaddwd", { MX
, EM
}, PREFIX_OPCODE
},
2315 { "psadbw", { MX
, EM
}, PREFIX_OPCODE
},
2316 { PREFIX_TABLE (PREFIX_0FF7
) },
2318 { "psubb", { MX
, EM
}, PREFIX_OPCODE
},
2319 { "psubw", { MX
, EM
}, PREFIX_OPCODE
},
2320 { "psubd", { MX
, EM
}, PREFIX_OPCODE
},
2321 { "psubq", { MX
, EM
}, PREFIX_OPCODE
},
2322 { "paddb", { MX
, EM
}, PREFIX_OPCODE
},
2323 { "paddw", { MX
, EM
}, PREFIX_OPCODE
},
2324 { "paddd", { MX
, EM
}, PREFIX_OPCODE
},
2325 { "ud0S", { Gv
, Ev
}, 0 },
2328 static const unsigned char onebyte_has_modrm
[256] = {
2329 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2330 /* ------------------------------- */
2331 /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
2332 /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
2333 /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
2334 /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
2335 /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
2336 /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
2337 /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
2338 /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
2339 /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
2340 /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
2341 /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
2342 /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
2343 /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
2344 /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
2345 /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
2346 /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1 /* f0 */
2347 /* ------------------------------- */
2348 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2351 static const unsigned char twobyte_has_modrm
[256] = {
2352 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2353 /* ------------------------------- */
2354 /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
2355 /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
2356 /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
2357 /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
2358 /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
2359 /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
2360 /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
2361 /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
2362 /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
2363 /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
2364 /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
2365 /* b0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* bf */
2366 /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
2367 /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
2368 /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
2369 /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 /* ff */
2370 /* ------------------------------- */
2371 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2374 static char obuf
[100];
2376 static char *mnemonicendp
;
2377 static char scratchbuf
[100];
2378 static unsigned char *start_codep
;
2379 static unsigned char *insn_codep
;
2380 static unsigned char *codep
;
2381 static unsigned char *end_codep
;
2382 static int last_lock_prefix
;
2383 static int last_repz_prefix
;
2384 static int last_repnz_prefix
;
2385 static int last_data_prefix
;
2386 static int last_addr_prefix
;
2387 static int last_rex_prefix
;
2388 static int last_seg_prefix
;
2389 static int fwait_prefix
;
2390 /* The active segment register prefix. */
2391 static int active_seg_prefix
;
2392 #define MAX_CODE_LENGTH 15
2393 /* We can up to 14 prefixes since the maximum instruction length is
2395 static int all_prefixes
[MAX_CODE_LENGTH
- 1];
2396 static disassemble_info
*the_info
;
2404 static unsigned char need_modrm
;
2414 int register_specifier
;
2421 int mask_register_specifier
;
2427 static unsigned char need_vex
;
2435 /* If we are accessing mod/rm/reg without need_modrm set, then the
2436 values are stale. Hitting this abort likely indicates that you
2437 need to update onebyte_has_modrm or twobyte_has_modrm. */
2438 #define MODRM_CHECK if (!need_modrm) abort ()
2440 static const char **names64
;
2441 static const char **names32
;
2442 static const char **names16
;
2443 static const char **names8
;
2444 static const char **names8rex
;
2445 static const char **names_seg
;
2446 static const char *index64
;
2447 static const char *index32
;
2448 static const char **index16
;
2449 static const char **names_bnd
;
2451 static const char *intel_names64
[] = {
2452 "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
2453 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2455 static const char *intel_names32
[] = {
2456 "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
2457 "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
2459 static const char *intel_names16
[] = {
2460 "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
2461 "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
2463 static const char *intel_names8
[] = {
2464 "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
2466 static const char *intel_names8rex
[] = {
2467 "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
2468 "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
2470 static const char *intel_names_seg
[] = {
2471 "es", "cs", "ss", "ds", "fs", "gs", "?", "?",
2473 static const char *intel_index64
= "riz";
2474 static const char *intel_index32
= "eiz";
2475 static const char *intel_index16
[] = {
2476 "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
2479 static const char *att_names64
[] = {
2480 "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
2481 "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
2483 static const char *att_names32
[] = {
2484 "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
2485 "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
2487 static const char *att_names16
[] = {
2488 "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
2489 "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
2491 static const char *att_names8
[] = {
2492 "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
2494 static const char *att_names8rex
[] = {
2495 "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
2496 "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
2498 static const char *att_names_seg
[] = {
2499 "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
2501 static const char *att_index64
= "%riz";
2502 static const char *att_index32
= "%eiz";
2503 static const char *att_index16
[] = {
2504 "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
2507 static const char **names_mm
;
2508 static const char *intel_names_mm
[] = {
2509 "mm0", "mm1", "mm2", "mm3",
2510 "mm4", "mm5", "mm6", "mm7"
2512 static const char *att_names_mm
[] = {
2513 "%mm0", "%mm1", "%mm2", "%mm3",
2514 "%mm4", "%mm5", "%mm6", "%mm7"
2517 static const char *intel_names_bnd
[] = {
2518 "bnd0", "bnd1", "bnd2", "bnd3"
2521 static const char *att_names_bnd
[] = {
2522 "%bnd0", "%bnd1", "%bnd2", "%bnd3"
2525 static const char **names_xmm
;
2526 static const char *intel_names_xmm
[] = {
2527 "xmm0", "xmm1", "xmm2", "xmm3",
2528 "xmm4", "xmm5", "xmm6", "xmm7",
2529 "xmm8", "xmm9", "xmm10", "xmm11",
2530 "xmm12", "xmm13", "xmm14", "xmm15",
2531 "xmm16", "xmm17", "xmm18", "xmm19",
2532 "xmm20", "xmm21", "xmm22", "xmm23",
2533 "xmm24", "xmm25", "xmm26", "xmm27",
2534 "xmm28", "xmm29", "xmm30", "xmm31"
2536 static const char *att_names_xmm
[] = {
2537 "%xmm0", "%xmm1", "%xmm2", "%xmm3",
2538 "%xmm4", "%xmm5", "%xmm6", "%xmm7",
2539 "%xmm8", "%xmm9", "%xmm10", "%xmm11",
2540 "%xmm12", "%xmm13", "%xmm14", "%xmm15",
2541 "%xmm16", "%xmm17", "%xmm18", "%xmm19",
2542 "%xmm20", "%xmm21", "%xmm22", "%xmm23",
2543 "%xmm24", "%xmm25", "%xmm26", "%xmm27",
2544 "%xmm28", "%xmm29", "%xmm30", "%xmm31"
2547 static const char **names_ymm
;
2548 static const char *intel_names_ymm
[] = {
2549 "ymm0", "ymm1", "ymm2", "ymm3",
2550 "ymm4", "ymm5", "ymm6", "ymm7",
2551 "ymm8", "ymm9", "ymm10", "ymm11",
2552 "ymm12", "ymm13", "ymm14", "ymm15",
2553 "ymm16", "ymm17", "ymm18", "ymm19",
2554 "ymm20", "ymm21", "ymm22", "ymm23",
2555 "ymm24", "ymm25", "ymm26", "ymm27",
2556 "ymm28", "ymm29", "ymm30", "ymm31"
2558 static const char *att_names_ymm
[] = {
2559 "%ymm0", "%ymm1", "%ymm2", "%ymm3",
2560 "%ymm4", "%ymm5", "%ymm6", "%ymm7",
2561 "%ymm8", "%ymm9", "%ymm10", "%ymm11",
2562 "%ymm12", "%ymm13", "%ymm14", "%ymm15",
2563 "%ymm16", "%ymm17", "%ymm18", "%ymm19",
2564 "%ymm20", "%ymm21", "%ymm22", "%ymm23",
2565 "%ymm24", "%ymm25", "%ymm26", "%ymm27",
2566 "%ymm28", "%ymm29", "%ymm30", "%ymm31"
2569 static const char **names_zmm
;
2570 static const char *intel_names_zmm
[] = {
2571 "zmm0", "zmm1", "zmm2", "zmm3",
2572 "zmm4", "zmm5", "zmm6", "zmm7",
2573 "zmm8", "zmm9", "zmm10", "zmm11",
2574 "zmm12", "zmm13", "zmm14", "zmm15",
2575 "zmm16", "zmm17", "zmm18", "zmm19",
2576 "zmm20", "zmm21", "zmm22", "zmm23",
2577 "zmm24", "zmm25", "zmm26", "zmm27",
2578 "zmm28", "zmm29", "zmm30", "zmm31"
2580 static const char *att_names_zmm
[] = {
2581 "%zmm0", "%zmm1", "%zmm2", "%zmm3",
2582 "%zmm4", "%zmm5", "%zmm6", "%zmm7",
2583 "%zmm8", "%zmm9", "%zmm10", "%zmm11",
2584 "%zmm12", "%zmm13", "%zmm14", "%zmm15",
2585 "%zmm16", "%zmm17", "%zmm18", "%zmm19",
2586 "%zmm20", "%zmm21", "%zmm22", "%zmm23",
2587 "%zmm24", "%zmm25", "%zmm26", "%zmm27",
2588 "%zmm28", "%zmm29", "%zmm30", "%zmm31"
2591 static const char **names_tmm
;
2592 static const char *intel_names_tmm
[] = {
2593 "tmm0", "tmm1", "tmm2", "tmm3",
2594 "tmm4", "tmm5", "tmm6", "tmm7"
2596 static const char *att_names_tmm
[] = {
2597 "%tmm0", "%tmm1", "%tmm2", "%tmm3",
2598 "%tmm4", "%tmm5", "%tmm6", "%tmm7"
2601 static const char **names_mask
;
2602 static const char *intel_names_mask
[] = {
2603 "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7"
2605 static const char *att_names_mask
[] = {
2606 "%k0", "%k1", "%k2", "%k3", "%k4", "%k5", "%k6", "%k7"
2609 static const char *const names_rounding
[] =
2617 static const struct dis386 reg_table
[][8] = {
2620 { "addA", { Ebh1
, Ib
}, 0 },
2621 { "orA", { Ebh1
, Ib
}, 0 },
2622 { "adcA", { Ebh1
, Ib
}, 0 },
2623 { "sbbA", { Ebh1
, Ib
}, 0 },
2624 { "andA", { Ebh1
, Ib
}, 0 },
2625 { "subA", { Ebh1
, Ib
}, 0 },
2626 { "xorA", { Ebh1
, Ib
}, 0 },
2627 { "cmpA", { Eb
, Ib
}, 0 },
2631 { "addQ", { Evh1
, Iv
}, 0 },
2632 { "orQ", { Evh1
, Iv
}, 0 },
2633 { "adcQ", { Evh1
, Iv
}, 0 },
2634 { "sbbQ", { Evh1
, Iv
}, 0 },
2635 { "andQ", { Evh1
, Iv
}, 0 },
2636 { "subQ", { Evh1
, Iv
}, 0 },
2637 { "xorQ", { Evh1
, Iv
}, 0 },
2638 { "cmpQ", { Ev
, Iv
}, 0 },
2642 { "addQ", { Evh1
, sIb
}, 0 },
2643 { "orQ", { Evh1
, sIb
}, 0 },
2644 { "adcQ", { Evh1
, sIb
}, 0 },
2645 { "sbbQ", { Evh1
, sIb
}, 0 },
2646 { "andQ", { Evh1
, sIb
}, 0 },
2647 { "subQ", { Evh1
, sIb
}, 0 },
2648 { "xorQ", { Evh1
, sIb
}, 0 },
2649 { "cmpQ", { Ev
, sIb
}, 0 },
2653 { "pop{P|}", { stackEv
}, 0 },
2654 { XOP_8F_TABLE (XOP_09
) },
2658 { XOP_8F_TABLE (XOP_09
) },
2662 { "rolA", { Eb
, Ib
}, 0 },
2663 { "rorA", { Eb
, Ib
}, 0 },
2664 { "rclA", { Eb
, Ib
}, 0 },
2665 { "rcrA", { Eb
, Ib
}, 0 },
2666 { "shlA", { Eb
, Ib
}, 0 },
2667 { "shrA", { Eb
, Ib
}, 0 },
2668 { "shlA", { Eb
, Ib
}, 0 },
2669 { "sarA", { Eb
, Ib
}, 0 },
2673 { "rolQ", { Ev
, Ib
}, 0 },
2674 { "rorQ", { Ev
, Ib
}, 0 },
2675 { "rclQ", { Ev
, Ib
}, 0 },
2676 { "rcrQ", { Ev
, Ib
}, 0 },
2677 { "shlQ", { Ev
, Ib
}, 0 },
2678 { "shrQ", { Ev
, Ib
}, 0 },
2679 { "shlQ", { Ev
, Ib
}, 0 },
2680 { "sarQ", { Ev
, Ib
}, 0 },
2684 { "movA", { Ebh3
, Ib
}, 0 },
2691 { MOD_TABLE (MOD_C6_REG_7
) },
2695 { "movQ", { Evh3
, Iv
}, 0 },
2702 { MOD_TABLE (MOD_C7_REG_7
) },
2706 { "rolA", { Eb
, I1
}, 0 },
2707 { "rorA", { Eb
, I1
}, 0 },
2708 { "rclA", { Eb
, I1
}, 0 },
2709 { "rcrA", { Eb
, I1
}, 0 },
2710 { "shlA", { Eb
, I1
}, 0 },
2711 { "shrA", { Eb
, I1
}, 0 },
2712 { "shlA", { Eb
, I1
}, 0 },
2713 { "sarA", { Eb
, I1
}, 0 },
2717 { "rolQ", { Ev
, I1
}, 0 },
2718 { "rorQ", { Ev
, I1
}, 0 },
2719 { "rclQ", { Ev
, I1
}, 0 },
2720 { "rcrQ", { Ev
, I1
}, 0 },
2721 { "shlQ", { Ev
, I1
}, 0 },
2722 { "shrQ", { Ev
, I1
}, 0 },
2723 { "shlQ", { Ev
, I1
}, 0 },
2724 { "sarQ", { Ev
, I1
}, 0 },
2728 { "rolA", { Eb
, CL
}, 0 },
2729 { "rorA", { Eb
, CL
}, 0 },
2730 { "rclA", { Eb
, CL
}, 0 },
2731 { "rcrA", { Eb
, CL
}, 0 },
2732 { "shlA", { Eb
, CL
}, 0 },
2733 { "shrA", { Eb
, CL
}, 0 },
2734 { "shlA", { Eb
, CL
}, 0 },
2735 { "sarA", { Eb
, CL
}, 0 },
2739 { "rolQ", { Ev
, CL
}, 0 },
2740 { "rorQ", { Ev
, CL
}, 0 },
2741 { "rclQ", { Ev
, CL
}, 0 },
2742 { "rcrQ", { Ev
, CL
}, 0 },
2743 { "shlQ", { Ev
, CL
}, 0 },
2744 { "shrQ", { Ev
, CL
}, 0 },
2745 { "shlQ", { Ev
, CL
}, 0 },
2746 { "sarQ", { Ev
, CL
}, 0 },
2750 { "testA", { Eb
, Ib
}, 0 },
2751 { "testA", { Eb
, Ib
}, 0 },
2752 { "notA", { Ebh1
}, 0 },
2753 { "negA", { Ebh1
}, 0 },
2754 { "mulA", { Eb
}, 0 }, /* Don't print the implicit %al register, */
2755 { "imulA", { Eb
}, 0 }, /* to distinguish these opcodes from other */
2756 { "divA", { Eb
}, 0 }, /* mul/imul opcodes. Do the same for div */
2757 { "idivA", { Eb
}, 0 }, /* and idiv for consistency. */
2761 { "testQ", { Ev
, Iv
}, 0 },
2762 { "testQ", { Ev
, Iv
}, 0 },
2763 { "notQ", { Evh1
}, 0 },
2764 { "negQ", { Evh1
}, 0 },
2765 { "mulQ", { Ev
}, 0 }, /* Don't print the implicit register. */
2766 { "imulQ", { Ev
}, 0 },
2767 { "divQ", { Ev
}, 0 },
2768 { "idivQ", { Ev
}, 0 },
2772 { "incA", { Ebh1
}, 0 },
2773 { "decA", { Ebh1
}, 0 },
2777 { "incQ", { Evh1
}, 0 },
2778 { "decQ", { Evh1
}, 0 },
2779 { "call{@|}", { NOTRACK
, indirEv
, BND
}, 0 },
2780 { MOD_TABLE (MOD_FF_REG_3
) },
2781 { "jmp{@|}", { NOTRACK
, indirEv
, BND
}, 0 },
2782 { MOD_TABLE (MOD_FF_REG_5
) },
2783 { "push{P|}", { stackEv
}, 0 },
2788 { "sldtD", { Sv
}, 0 },
2789 { "strD", { Sv
}, 0 },
2790 { "lldt", { Ew
}, 0 },
2791 { "ltr", { Ew
}, 0 },
2792 { "verr", { Ew
}, 0 },
2793 { "verw", { Ew
}, 0 },
2799 { MOD_TABLE (MOD_0F01_REG_0
) },
2800 { MOD_TABLE (MOD_0F01_REG_1
) },
2801 { MOD_TABLE (MOD_0F01_REG_2
) },
2802 { MOD_TABLE (MOD_0F01_REG_3
) },
2803 { "smswD", { Sv
}, 0 },
2804 { MOD_TABLE (MOD_0F01_REG_5
) },
2805 { "lmsw", { Ew
}, 0 },
2806 { MOD_TABLE (MOD_0F01_REG_7
) },
2810 { "prefetch", { Mb
}, 0 },
2811 { "prefetchw", { Mb
}, 0 },
2812 { "prefetchwt1", { Mb
}, 0 },
2813 { "prefetch", { Mb
}, 0 },
2814 { "prefetch", { Mb
}, 0 },
2815 { "prefetch", { Mb
}, 0 },
2816 { "prefetch", { Mb
}, 0 },
2817 { "prefetch", { Mb
}, 0 },
2821 { MOD_TABLE (MOD_0F18_REG_0
) },
2822 { MOD_TABLE (MOD_0F18_REG_1
) },
2823 { MOD_TABLE (MOD_0F18_REG_2
) },
2824 { MOD_TABLE (MOD_0F18_REG_3
) },
2825 { "nopQ", { Ev
}, 0 },
2826 { "nopQ", { Ev
}, 0 },
2827 { "nopQ", { Ev
}, 0 },
2828 { "nopQ", { Ev
}, 0 },
2830 /* REG_0F1C_P_0_MOD_0 */
2832 { "cldemote", { Mb
}, 0 },
2833 { "nopQ", { Ev
}, 0 },
2834 { "nopQ", { Ev
}, 0 },
2835 { "nopQ", { Ev
}, 0 },
2836 { "nopQ", { Ev
}, 0 },
2837 { "nopQ", { Ev
}, 0 },
2838 { "nopQ", { Ev
}, 0 },
2839 { "nopQ", { Ev
}, 0 },
2841 /* REG_0F1E_P_1_MOD_3 */
2843 { "nopQ", { Ev
}, PREFIX_IGNORED
},
2844 { "rdsspK", { Edq
}, 0 },
2845 { "nopQ", { Ev
}, PREFIX_IGNORED
},
2846 { "nopQ", { Ev
}, PREFIX_IGNORED
},
2847 { "nopQ", { Ev
}, PREFIX_IGNORED
},
2848 { "nopQ", { Ev
}, PREFIX_IGNORED
},
2849 { "nopQ", { Ev
}, PREFIX_IGNORED
},
2850 { RM_TABLE (RM_0F1E_P_1_MOD_3_REG_7
) },
2852 /* REG_0F38D8_PREFIX_1 */
2854 { "aesencwide128kl", { M
}, 0 },
2855 { "aesdecwide128kl", { M
}, 0 },
2856 { "aesencwide256kl", { M
}, 0 },
2857 { "aesdecwide256kl", { M
}, 0 },
2859 /* REG_0F3A0F_PREFIX_1_MOD_3 */
2861 { RM_TABLE (RM_0F3A0F_P_1_MOD_3_REG_0
) },
2863 /* REG_0F71_MOD_0 */
2867 { "psrlw", { MS
, Ib
}, PREFIX_OPCODE
},
2869 { "psraw", { MS
, Ib
}, PREFIX_OPCODE
},
2871 { "psllw", { MS
, Ib
}, PREFIX_OPCODE
},
2873 /* REG_0F72_MOD_0 */
2877 { "psrld", { MS
, Ib
}, PREFIX_OPCODE
},
2879 { "psrad", { MS
, Ib
}, PREFIX_OPCODE
},
2881 { "pslld", { MS
, Ib
}, PREFIX_OPCODE
},
2883 /* REG_0F73_MOD_0 */
2887 { "psrlq", { MS
, Ib
}, PREFIX_OPCODE
},
2888 { "psrldq", { XS
, Ib
}, PREFIX_DATA
},
2891 { "psllq", { MS
, Ib
}, PREFIX_OPCODE
},
2892 { "pslldq", { XS
, Ib
}, PREFIX_DATA
},
2896 { "montmul", { { OP_0f07
, 0 } }, 0 },
2897 { "xsha1", { { OP_0f07
, 0 } }, 0 },
2898 { "xsha256", { { OP_0f07
, 0 } }, 0 },
2902 { "xstore-rng", { { OP_0f07
, 0 } }, 0 },
2903 { "xcrypt-ecb", { { OP_0f07
, 0 } }, 0 },
2904 { "xcrypt-cbc", { { OP_0f07
, 0 } }, 0 },
2905 { "xcrypt-ctr", { { OP_0f07
, 0 } }, 0 },
2906 { "xcrypt-cfb", { { OP_0f07
, 0 } }, 0 },
2907 { "xcrypt-ofb", { { OP_0f07
, 0 } }, 0 },
2911 { MOD_TABLE (MOD_0FAE_REG_0
) },
2912 { MOD_TABLE (MOD_0FAE_REG_1
) },
2913 { MOD_TABLE (MOD_0FAE_REG_2
) },
2914 { MOD_TABLE (MOD_0FAE_REG_3
) },
2915 { MOD_TABLE (MOD_0FAE_REG_4
) },
2916 { MOD_TABLE (MOD_0FAE_REG_5
) },
2917 { MOD_TABLE (MOD_0FAE_REG_6
) },
2918 { MOD_TABLE (MOD_0FAE_REG_7
) },
2926 { "btQ", { Ev
, Ib
}, 0 },
2927 { "btsQ", { Evh1
, Ib
}, 0 },
2928 { "btrQ", { Evh1
, Ib
}, 0 },
2929 { "btcQ", { Evh1
, Ib
}, 0 },
2934 { "cmpxchg8b", { { CMPXCHG8B_Fixup
, q_mode
} }, 0 },
2936 { MOD_TABLE (MOD_0FC7_REG_3
) },
2937 { MOD_TABLE (MOD_0FC7_REG_4
) },
2938 { MOD_TABLE (MOD_0FC7_REG_5
) },
2939 { MOD_TABLE (MOD_0FC7_REG_6
) },
2940 { MOD_TABLE (MOD_0FC7_REG_7
) },
2942 /* REG_VEX_0F71_M_0 */
2946 { "vpsrlw", { Vex
, XS
, Ib
}, PREFIX_DATA
},
2948 { "vpsraw", { Vex
, XS
, Ib
}, PREFIX_DATA
},
2950 { "vpsllw", { Vex
, XS
, Ib
}, PREFIX_DATA
},
2952 /* REG_VEX_0F72_M_0 */
2956 { "vpsrld", { Vex
, XS
, Ib
}, PREFIX_DATA
},
2958 { "vpsrad", { Vex
, XS
, Ib
}, PREFIX_DATA
},
2960 { "vpslld", { Vex
, XS
, Ib
}, PREFIX_DATA
},
2962 /* REG_VEX_0F73_M_0 */
2966 { "vpsrlq", { Vex
, XS
, Ib
}, PREFIX_DATA
},
2967 { "vpsrldq", { Vex
, XS
, Ib
}, PREFIX_DATA
},
2970 { "vpsllq", { Vex
, XS
, Ib
}, PREFIX_DATA
},
2971 { "vpslldq", { Vex
, XS
, Ib
}, PREFIX_DATA
},
2977 { MOD_TABLE (MOD_VEX_0FAE_REG_2
) },
2978 { MOD_TABLE (MOD_VEX_0FAE_REG_3
) },
2980 /* REG_VEX_0F3849_X86_64_P_0_W_0_M_1 */
2982 { RM_TABLE (RM_VEX_0F3849_X86_64_P_0_W_0_M_1_R_0
) },
2984 /* REG_VEX_0F38F3_L_0 */
2987 { "blsrS", { VexGdq
, Edq
}, PREFIX_OPCODE
},
2988 { "blsmskS", { VexGdq
, Edq
}, PREFIX_OPCODE
},
2989 { "blsiS", { VexGdq
, Edq
}, PREFIX_OPCODE
},
2991 /* REG_XOP_09_01_L_0 */
2994 { "blcfill", { VexGdq
, Edq
}, 0 },
2995 { "blsfill", { VexGdq
, Edq
}, 0 },
2996 { "blcs", { VexGdq
, Edq
}, 0 },
2997 { "tzmsk", { VexGdq
, Edq
}, 0 },
2998 { "blcic", { VexGdq
, Edq
}, 0 },
2999 { "blsic", { VexGdq
, Edq
}, 0 },
3000 { "t1mskc", { VexGdq
, Edq
}, 0 },
3002 /* REG_XOP_09_02_L_0 */
3005 { "blcmsk", { VexGdq
, Edq
}, 0 },
3010 { "blci", { VexGdq
, Edq
}, 0 },
3012 /* REG_XOP_09_12_M_1_L_0 */
3014 { "llwpcb", { Edq
}, 0 },
3015 { "slwpcb", { Edq
}, 0 },
3017 /* REG_XOP_0A_12_L_0 */
3019 { "lwpins", { VexGdq
, Ed
, Id
}, 0 },
3020 { "lwpval", { VexGdq
, Ed
, Id
}, 0 },
3023 #include "i386-dis-evex-reg.h"
3026 static const struct dis386 prefix_table
[][4] = {
3029 { "xchgS", { { NOP_Fixup1
, eAX_reg
}, { NOP_Fixup2
, eAX_reg
} }, 0 },
3030 { "pause", { XX
}, 0 },
3031 { "xchgS", { { NOP_Fixup1
, eAX_reg
}, { NOP_Fixup2
, eAX_reg
} }, 0 },
3032 { NULL
, { { NULL
, 0 } }, PREFIX_IGNORED
}
3035 /* PREFIX_0F01_REG_1_RM_4 */
3039 { "tdcall", { Skip_MODRM
}, 0 },
3043 /* PREFIX_0F01_REG_1_RM_5 */
3047 { X86_64_TABLE (X86_64_0F01_REG_1_RM_5_PREFIX_2
) },
3051 /* PREFIX_0F01_REG_1_RM_6 */
3055 { X86_64_TABLE (X86_64_0F01_REG_1_RM_6_PREFIX_2
) },
3059 /* PREFIX_0F01_REG_1_RM_7 */
3061 { "encls", { Skip_MODRM
}, 0 },
3063 { X86_64_TABLE (X86_64_0F01_REG_1_RM_7_PREFIX_2
) },
3067 /* PREFIX_0F01_REG_3_RM_1 */
3069 { "vmmcall", { Skip_MODRM
}, 0 },
3070 { "vmgexit", { Skip_MODRM
}, 0 },
3072 { "vmgexit", { Skip_MODRM
}, 0 },
3075 /* PREFIX_0F01_REG_5_MOD_0 */
3078 { "rstorssp", { Mq
}, PREFIX_OPCODE
},
3081 /* PREFIX_0F01_REG_5_MOD_3_RM_0 */
3083 { "serialize", { Skip_MODRM
}, PREFIX_OPCODE
},
3084 { "setssbsy", { Skip_MODRM
}, PREFIX_OPCODE
},
3086 { "xsusldtrk", { Skip_MODRM
}, PREFIX_OPCODE
},
3089 /* PREFIX_0F01_REG_5_MOD_3_RM_1 */
3094 { "xresldtrk", { Skip_MODRM
}, PREFIX_OPCODE
},
3097 /* PREFIX_0F01_REG_5_MOD_3_RM_2 */
3100 { "saveprevssp", { Skip_MODRM
}, PREFIX_OPCODE
},
3103 /* PREFIX_0F01_REG_5_MOD_3_RM_4 */
3106 { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_4_PREFIX_1
) },
3109 /* PREFIX_0F01_REG_5_MOD_3_RM_5 */
3112 { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_5_PREFIX_1
) },
3115 /* PREFIX_0F01_REG_5_MOD_3_RM_6 */
3117 { "rdpkru", { Skip_MODRM
}, 0 },
3118 { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_6_PREFIX_1
) },
3121 /* PREFIX_0F01_REG_5_MOD_3_RM_7 */
3123 { "wrpkru", { Skip_MODRM
}, 0 },
3124 { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_7_PREFIX_1
) },
3127 /* PREFIX_0F01_REG_7_MOD_3_RM_2 */
3129 { "monitorx", { { OP_Monitor
, 0 } }, 0 },
3130 { "mcommit", { Skip_MODRM
}, 0 },
3133 /* PREFIX_0F01_REG_7_MOD_3_RM_6 */
3135 { "invlpgb", { Skip_MODRM
}, 0 },
3136 { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_1
) },
3138 { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3
) },
3141 /* PREFIX_0F01_REG_7_MOD_3_RM_7 */
3143 { "tlbsync", { Skip_MODRM
}, 0 },
3144 { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_7_PREFIX_1
) },
3146 { "pvalidate", { Skip_MODRM
}, 0 },
3151 { "wbinvd", { XX
}, 0 },
3152 { "wbnoinvd", { XX
}, 0 },
3157 { "movups", { XM
, EXx
}, PREFIX_OPCODE
},
3158 { "movss", { XM
, EXd
}, PREFIX_OPCODE
},
3159 { "movupd", { XM
, EXx
}, PREFIX_OPCODE
},
3160 { "movsd", { XM
, EXq
}, PREFIX_OPCODE
},
3165 { "movups", { EXxS
, XM
}, PREFIX_OPCODE
},
3166 { "movss", { EXdS
, XM
}, PREFIX_OPCODE
},
3167 { "movupd", { EXxS
, XM
}, PREFIX_OPCODE
},
3168 { "movsd", { EXqS
, XM
}, PREFIX_OPCODE
},
3173 { MOD_TABLE (MOD_0F12_PREFIX_0
) },
3174 { "movsldup", { XM
, EXx
}, PREFIX_OPCODE
},
3175 { MOD_TABLE (MOD_0F12_PREFIX_2
) },
3176 { "movddup", { XM
, EXq
}, PREFIX_OPCODE
},
3181 { MOD_TABLE (MOD_0F16_PREFIX_0
) },
3182 { "movshdup", { XM
, EXx
}, PREFIX_OPCODE
},
3183 { MOD_TABLE (MOD_0F16_PREFIX_2
) },
3188 { MOD_TABLE (MOD_0F1A_PREFIX_0
) },
3189 { "bndcl", { Gbnd
, Ev_bnd
}, 0 },
3190 { "bndmov", { Gbnd
, Ebnd
}, 0 },
3191 { "bndcu", { Gbnd
, Ev_bnd
}, 0 },
3196 { MOD_TABLE (MOD_0F1B_PREFIX_0
) },
3197 { MOD_TABLE (MOD_0F1B_PREFIX_1
) },
3198 { "bndmov", { EbndS
, Gbnd
}, 0 },
3199 { "bndcn", { Gbnd
, Ev_bnd
}, 0 },
3204 { MOD_TABLE (MOD_0F1C_PREFIX_0
) },
3205 { "nopQ", { Ev
}, PREFIX_IGNORED
},
3206 { "nopQ", { Ev
}, 0 },
3207 { "nopQ", { Ev
}, PREFIX_IGNORED
},
3212 { "nopQ", { Ev
}, 0 },
3213 { MOD_TABLE (MOD_0F1E_PREFIX_1
) },
3214 { "nopQ", { Ev
}, 0 },
3215 { NULL
, { XX
}, PREFIX_IGNORED
},
3220 { "cvtpi2ps", { XM
, EMCq
}, PREFIX_OPCODE
},
3221 { "cvtsi2ss{%LQ|}", { XM
, Edq
}, PREFIX_OPCODE
},
3222 { "cvtpi2pd", { XM
, EMCq
}, PREFIX_OPCODE
},
3223 { "cvtsi2sd{%LQ|}", { XM
, Edq
}, 0 },
3228 { MOD_TABLE (MOD_0F2B_PREFIX_0
) },
3229 { MOD_TABLE (MOD_0F2B_PREFIX_1
) },
3230 { MOD_TABLE (MOD_0F2B_PREFIX_2
) },
3231 { MOD_TABLE (MOD_0F2B_PREFIX_3
) },
3236 { "cvttps2pi", { MXC
, EXq
}, PREFIX_OPCODE
},
3237 { "cvttss2si", { Gdq
, EXd
}, PREFIX_OPCODE
},
3238 { "cvttpd2pi", { MXC
, EXx
}, PREFIX_OPCODE
},
3239 { "cvttsd2si", { Gdq
, EXq
}, PREFIX_OPCODE
},
3244 { "cvtps2pi", { MXC
, EXq
}, PREFIX_OPCODE
},
3245 { "cvtss2si", { Gdq
, EXd
}, PREFIX_OPCODE
},
3246 { "cvtpd2pi", { MXC
, EXx
}, PREFIX_OPCODE
},
3247 { "cvtsd2si", { Gdq
, EXq
}, PREFIX_OPCODE
},
3252 { "ucomiss",{ XM
, EXd
}, 0 },
3254 { "ucomisd",{ XM
, EXq
}, 0 },
3259 { "comiss", { XM
, EXd
}, 0 },
3261 { "comisd", { XM
, EXq
}, 0 },
3266 { "sqrtps", { XM
, EXx
}, PREFIX_OPCODE
},
3267 { "sqrtss", { XM
, EXd
}, PREFIX_OPCODE
},
3268 { "sqrtpd", { XM
, EXx
}, PREFIX_OPCODE
},
3269 { "sqrtsd", { XM
, EXq
}, PREFIX_OPCODE
},
3274 { "rsqrtps",{ XM
, EXx
}, PREFIX_OPCODE
},
3275 { "rsqrtss",{ XM
, EXd
}, PREFIX_OPCODE
},
3280 { "rcpps", { XM
, EXx
}, PREFIX_OPCODE
},
3281 { "rcpss", { XM
, EXd
}, PREFIX_OPCODE
},
3286 { "addps", { XM
, EXx
}, PREFIX_OPCODE
},
3287 { "addss", { XM
, EXd
}, PREFIX_OPCODE
},
3288 { "addpd", { XM
, EXx
}, PREFIX_OPCODE
},
3289 { "addsd", { XM
, EXq
}, PREFIX_OPCODE
},
3294 { "mulps", { XM
, EXx
}, PREFIX_OPCODE
},
3295 { "mulss", { XM
, EXd
}, PREFIX_OPCODE
},
3296 { "mulpd", { XM
, EXx
}, PREFIX_OPCODE
},
3297 { "mulsd", { XM
, EXq
}, PREFIX_OPCODE
},
3302 { "cvtps2pd", { XM
, EXq
}, PREFIX_OPCODE
},
3303 { "cvtss2sd", { XM
, EXd
}, PREFIX_OPCODE
},
3304 { "cvtpd2ps", { XM
, EXx
}, PREFIX_OPCODE
},
3305 { "cvtsd2ss", { XM
, EXq
}, PREFIX_OPCODE
},
3310 { "cvtdq2ps", { XM
, EXx
}, PREFIX_OPCODE
},
3311 { "cvttps2dq", { XM
, EXx
}, PREFIX_OPCODE
},
3312 { "cvtps2dq", { XM
, EXx
}, PREFIX_OPCODE
},
3317 { "subps", { XM
, EXx
}, PREFIX_OPCODE
},
3318 { "subss", { XM
, EXd
}, PREFIX_OPCODE
},
3319 { "subpd", { XM
, EXx
}, PREFIX_OPCODE
},
3320 { "subsd", { XM
, EXq
}, PREFIX_OPCODE
},
3325 { "minps", { XM
, EXx
}, PREFIX_OPCODE
},
3326 { "minss", { XM
, EXd
}, PREFIX_OPCODE
},
3327 { "minpd", { XM
, EXx
}, PREFIX_OPCODE
},
3328 { "minsd", { XM
, EXq
}, PREFIX_OPCODE
},
3333 { "divps", { XM
, EXx
}, PREFIX_OPCODE
},
3334 { "divss", { XM
, EXd
}, PREFIX_OPCODE
},
3335 { "divpd", { XM
, EXx
}, PREFIX_OPCODE
},
3336 { "divsd", { XM
, EXq
}, PREFIX_OPCODE
},
3341 { "maxps", { XM
, EXx
}, PREFIX_OPCODE
},
3342 { "maxss", { XM
, EXd
}, PREFIX_OPCODE
},
3343 { "maxpd", { XM
, EXx
}, PREFIX_OPCODE
},
3344 { "maxsd", { XM
, EXq
}, PREFIX_OPCODE
},
3349 { "punpcklbw",{ MX
, EMd
}, PREFIX_OPCODE
},
3351 { "punpcklbw",{ MX
, EMx
}, PREFIX_OPCODE
},
3356 { "punpcklwd",{ MX
, EMd
}, PREFIX_OPCODE
},
3358 { "punpcklwd",{ MX
, EMx
}, PREFIX_OPCODE
},
3363 { "punpckldq",{ MX
, EMd
}, PREFIX_OPCODE
},
3365 { "punpckldq",{ MX
, EMx
}, PREFIX_OPCODE
},
3370 { "movq", { MX
, EM
}, PREFIX_OPCODE
},
3371 { "movdqu", { XM
, EXx
}, PREFIX_OPCODE
},
3372 { "movdqa", { XM
, EXx
}, PREFIX_OPCODE
},
3377 { "pshufw", { MX
, EM
, Ib
}, PREFIX_OPCODE
},
3378 { "pshufhw",{ XM
, EXx
, Ib
}, PREFIX_OPCODE
},
3379 { "pshufd", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
3380 { "pshuflw",{ XM
, EXx
, Ib
}, PREFIX_OPCODE
},
3385 {"vmread", { Em
, Gm
}, 0 },
3387 {"extrq", { XS
, Ib
, Ib
}, 0 },
3388 {"insertq", { XM
, XS
, Ib
, Ib
}, 0 },
3393 {"vmwrite", { Gm
, Em
}, 0 },
3395 {"extrq", { XM
, XS
}, 0 },
3396 {"insertq", { XM
, XS
}, 0 },
3403 { "haddpd", { XM
, EXx
}, PREFIX_OPCODE
},
3404 { "haddps", { XM
, EXx
}, PREFIX_OPCODE
},
3411 { "hsubpd", { XM
, EXx
}, PREFIX_OPCODE
},
3412 { "hsubps", { XM
, EXx
}, PREFIX_OPCODE
},
3417 { "movK", { Edq
, MX
}, PREFIX_OPCODE
},
3418 { "movq", { XM
, EXq
}, PREFIX_OPCODE
},
3419 { "movK", { Edq
, XM
}, PREFIX_OPCODE
},
3424 { "movq", { EMS
, MX
}, PREFIX_OPCODE
},
3425 { "movdqu", { EXxS
, XM
}, PREFIX_OPCODE
},
3426 { "movdqa", { EXxS
, XM
}, PREFIX_OPCODE
},
3429 /* PREFIX_0FAE_REG_0_MOD_3 */
3432 { "rdfsbase", { Ev
}, 0 },
3435 /* PREFIX_0FAE_REG_1_MOD_3 */
3438 { "rdgsbase", { Ev
}, 0 },
3441 /* PREFIX_0FAE_REG_2_MOD_3 */
3444 { "wrfsbase", { Ev
}, 0 },
3447 /* PREFIX_0FAE_REG_3_MOD_3 */
3450 { "wrgsbase", { Ev
}, 0 },
3453 /* PREFIX_0FAE_REG_4_MOD_0 */
3455 { "xsave", { FXSAVE
}, 0 },
3456 { "ptwrite{%LQ|}", { Edq
}, 0 },
3459 /* PREFIX_0FAE_REG_4_MOD_3 */
3462 { "ptwrite{%LQ|}", { Edq
}, 0 },
3465 /* PREFIX_0FAE_REG_5_MOD_3 */
3467 { "lfence", { Skip_MODRM
}, 0 },
3468 { "incsspK", { Edq
}, PREFIX_OPCODE
},
3471 /* PREFIX_0FAE_REG_6_MOD_0 */
3473 { "xsaveopt", { FXSAVE
}, PREFIX_OPCODE
},
3474 { "clrssbsy", { Mq
}, PREFIX_OPCODE
},
3475 { "clwb", { Mb
}, PREFIX_OPCODE
},
3478 /* PREFIX_0FAE_REG_6_MOD_3 */
3480 { RM_TABLE (RM_0FAE_REG_6_MOD_3_P_0
) },
3481 { "umonitor", { Eva
}, PREFIX_OPCODE
},
3482 { "tpause", { Edq
}, PREFIX_OPCODE
},
3483 { "umwait", { Edq
}, PREFIX_OPCODE
},
3486 /* PREFIX_0FAE_REG_7_MOD_0 */
3488 { "clflush", { Mb
}, 0 },
3490 { "clflushopt", { Mb
}, 0 },
3496 { "popcntS", { Gv
, Ev
}, 0 },
3501 { "bsfS", { Gv
, Ev
}, 0 },
3502 { "tzcntS", { Gv
, Ev
}, 0 },
3503 { "bsfS", { Gv
, Ev
}, 0 },
3508 { "bsrS", { Gv
, Ev
}, 0 },
3509 { "lzcntS", { Gv
, Ev
}, 0 },
3510 { "bsrS", { Gv
, Ev
}, 0 },
3515 { "cmpps", { XM
, EXx
, CMP
}, PREFIX_OPCODE
},
3516 { "cmpss", { XM
, EXd
, CMP
}, PREFIX_OPCODE
},
3517 { "cmppd", { XM
, EXx
, CMP
}, PREFIX_OPCODE
},
3518 { "cmpsd", { XM
, EXq
, CMP
}, PREFIX_OPCODE
},
3521 /* PREFIX_0FC7_REG_6_MOD_0 */
3523 { "vmptrld",{ Mq
}, 0 },
3524 { "vmxon", { Mq
}, 0 },
3525 { "vmclear",{ Mq
}, 0 },
3528 /* PREFIX_0FC7_REG_6_MOD_3 */
3530 { "rdrand", { Ev
}, 0 },
3531 { X86_64_TABLE (X86_64_0FC7_REG_6_MOD_3_PREFIX_1
) },
3532 { "rdrand", { Ev
}, 0 }
3535 /* PREFIX_0FC7_REG_7_MOD_3 */
3537 { "rdseed", { Ev
}, 0 },
3538 { "rdpid", { Em
}, 0 },
3539 { "rdseed", { Ev
}, 0 },
3546 { "addsubpd", { XM
, EXx
}, 0 },
3547 { "addsubps", { XM
, EXx
}, 0 },
3553 { "movq2dq",{ XM
, MS
}, 0 },
3554 { "movq", { EXqS
, XM
}, 0 },
3555 { "movdq2q",{ MX
, XS
}, 0 },
3561 { "cvtdq2pd", { XM
, EXq
}, PREFIX_OPCODE
},
3562 { "cvttpd2dq", { XM
, EXx
}, PREFIX_OPCODE
},
3563 { "cvtpd2dq", { XM
, EXx
}, PREFIX_OPCODE
},
3568 { "movntq", { Mq
, MX
}, PREFIX_OPCODE
},
3570 { MOD_TABLE (MOD_0FE7_PREFIX_2
) },
3578 { MOD_TABLE (MOD_0FF0_PREFIX_3
) },
3583 { "maskmovq", { MX
, MS
}, PREFIX_OPCODE
},
3585 { "maskmovdqu", { XM
, XS
}, PREFIX_OPCODE
},
3591 { REG_TABLE (REG_0F38D8_PREFIX_1
) },
3597 { MOD_TABLE (MOD_0F38DC_PREFIX_1
) },
3598 { "aesenc", { XM
, EXx
}, 0 },
3604 { MOD_TABLE (MOD_0F38DD_PREFIX_1
) },
3605 { "aesenclast", { XM
, EXx
}, 0 },
3611 { MOD_TABLE (MOD_0F38DE_PREFIX_1
) },
3612 { "aesdec", { XM
, EXx
}, 0 },
3618 { MOD_TABLE (MOD_0F38DF_PREFIX_1
) },
3619 { "aesdeclast", { XM
, EXx
}, 0 },
3624 { "movbeS", { Gv
, Mv
}, PREFIX_OPCODE
},
3626 { "movbeS", { Gv
, Mv
}, PREFIX_OPCODE
},
3627 { "crc32A", { Gdq
, Eb
}, PREFIX_OPCODE
},
3632 { "movbeS", { Mv
, Gv
}, PREFIX_OPCODE
},
3634 { "movbeS", { Mv
, Gv
}, PREFIX_OPCODE
},
3635 { "crc32Q", { Gdq
, Ev
}, PREFIX_OPCODE
},
3640 { MOD_TABLE (MOD_0F38F6_PREFIX_0
) },
3641 { "adoxS", { Gdq
, Edq
}, PREFIX_OPCODE
},
3642 { "adcxS", { Gdq
, Edq
}, PREFIX_OPCODE
},
3649 { MOD_TABLE (MOD_0F38F8_PREFIX_1
) },
3650 { MOD_TABLE (MOD_0F38F8_PREFIX_2
) },
3651 { MOD_TABLE (MOD_0F38F8_PREFIX_3
) },
3656 { MOD_TABLE (MOD_0F38FA_PREFIX_1
) },
3662 { MOD_TABLE (MOD_0F38FB_PREFIX_1
) },
3668 { MOD_TABLE (MOD_0F3A0F_PREFIX_1
)},
3671 /* PREFIX_VEX_0F10 */
3673 { "vmovups", { XM
, EXx
}, 0 },
3674 { "vmovss", { XMScalar
, VexScalarR
, EXd
}, 0 },
3675 { "vmovupd", { XM
, EXx
}, 0 },
3676 { "vmovsd", { XMScalar
, VexScalarR
, EXq
}, 0 },
3679 /* PREFIX_VEX_0F11 */
3681 { "vmovups", { EXxS
, XM
}, 0 },
3682 { "vmovss", { EXdS
, VexScalarR
, XMScalar
}, 0 },
3683 { "vmovupd", { EXxS
, XM
}, 0 },
3684 { "vmovsd", { EXqS
, VexScalarR
, XMScalar
}, 0 },
3687 /* PREFIX_VEX_0F12 */
3689 { MOD_TABLE (MOD_VEX_0F12_PREFIX_0
) },
3690 { "vmovsldup", { XM
, EXx
}, 0 },
3691 { MOD_TABLE (MOD_VEX_0F12_PREFIX_2
) },
3692 { "vmovddup", { XM
, EXymmq
}, 0 },
3695 /* PREFIX_VEX_0F16 */
3697 { MOD_TABLE (MOD_VEX_0F16_PREFIX_0
) },
3698 { "vmovshdup", { XM
, EXx
}, 0 },
3699 { MOD_TABLE (MOD_VEX_0F16_PREFIX_2
) },
3702 /* PREFIX_VEX_0F2A */
3705 { "vcvtsi2ss{%LQ|}", { XMScalar
, VexScalar
, Edq
}, 0 },
3707 { "vcvtsi2sd{%LQ|}", { XMScalar
, VexScalar
, Edq
}, 0 },
3710 /* PREFIX_VEX_0F2C */
3713 { "vcvttss2si", { Gdq
, EXd
, EXxEVexS
}, 0 },
3715 { "vcvttsd2si", { Gdq
, EXq
, EXxEVexS
}, 0 },
3718 /* PREFIX_VEX_0F2D */
3721 { "vcvtss2si", { Gdq
, EXd
, EXxEVexR
}, 0 },
3723 { "vcvtsd2si", { Gdq
, EXq
, EXxEVexR
}, 0 },
3726 /* PREFIX_VEX_0F2E */
3728 { "vucomisX", { XMScalar
, EXd
, EXxEVexS
}, PREFIX_OPCODE
},
3730 { "vucomisX", { XMScalar
, EXq
, EXxEVexS
}, PREFIX_OPCODE
},
3733 /* PREFIX_VEX_0F2F */
3735 { "vcomisX", { XMScalar
, EXd
, EXxEVexS
}, PREFIX_OPCODE
},
3737 { "vcomisX", { XMScalar
, EXq
, EXxEVexS
}, PREFIX_OPCODE
},
3740 /* PREFIX_VEX_0F41_L_1_M_1_W_0 */
3742 { "kandw", { MaskG
, MaskVex
, MaskE
}, 0 },
3744 { "kandb", { MaskG
, MaskVex
, MaskE
}, 0 },
3747 /* PREFIX_VEX_0F41_L_1_M_1_W_1 */
3749 { "kandq", { MaskG
, MaskVex
, MaskE
}, 0 },
3751 { "kandd", { MaskG
, MaskVex
, MaskE
}, 0 },
3754 /* PREFIX_VEX_0F42_L_1_M_1_W_0 */
3756 { "kandnw", { MaskG
, MaskVex
, MaskE
}, 0 },
3758 { "kandnb", { MaskG
, MaskVex
, MaskE
}, 0 },
3761 /* PREFIX_VEX_0F42_L_1_M_1_W_1 */
3763 { "kandnq", { MaskG
, MaskVex
, MaskE
}, 0 },
3765 { "kandnd", { MaskG
, MaskVex
, MaskE
}, 0 },
3768 /* PREFIX_VEX_0F44_L_0_M_1_W_0 */
3770 { "knotw", { MaskG
, MaskE
}, 0 },
3772 { "knotb", { MaskG
, MaskE
}, 0 },
3775 /* PREFIX_VEX_0F44_L_0_M_1_W_1 */
3777 { "knotq", { MaskG
, MaskE
}, 0 },
3779 { "knotd", { MaskG
, MaskE
}, 0 },
3782 /* PREFIX_VEX_0F45_L_1_M_1_W_0 */
3784 { "korw", { MaskG
, MaskVex
, MaskE
}, 0 },
3786 { "korb", { MaskG
, MaskVex
, MaskE
}, 0 },
3789 /* PREFIX_VEX_0F45_L_1_M_1_W_1 */
3791 { "korq", { MaskG
, MaskVex
, MaskE
}, 0 },
3793 { "kord", { MaskG
, MaskVex
, MaskE
}, 0 },
3796 /* PREFIX_VEX_0F46_L_1_M_1_W_0 */
3798 { "kxnorw", { MaskG
, MaskVex
, MaskE
}, 0 },
3800 { "kxnorb", { MaskG
, MaskVex
, MaskE
}, 0 },
3803 /* PREFIX_VEX_0F46_L_1_M_1_W_1 */
3805 { "kxnorq", { MaskG
, MaskVex
, MaskE
}, 0 },
3807 { "kxnord", { MaskG
, MaskVex
, MaskE
}, 0 },
3810 /* PREFIX_VEX_0F47_L_1_M_1_W_0 */
3812 { "kxorw", { MaskG
, MaskVex
, MaskE
}, 0 },
3814 { "kxorb", { MaskG
, MaskVex
, MaskE
}, 0 },
3817 /* PREFIX_VEX_0F47_L_1_M_1_W_1 */
3819 { "kxorq", { MaskG
, MaskVex
, MaskE
}, 0 },
3821 { "kxord", { MaskG
, MaskVex
, MaskE
}, 0 },
3824 /* PREFIX_VEX_0F4A_L_1_M_1_W_0 */
3826 { "kaddw", { MaskG
, MaskVex
, MaskE
}, 0 },
3828 { "kaddb", { MaskG
, MaskVex
, MaskE
}, 0 },
3831 /* PREFIX_VEX_0F4A_L_1_M_1_W_1 */
3833 { "kaddq", { MaskG
, MaskVex
, MaskE
}, 0 },
3835 { "kaddd", { MaskG
, MaskVex
, MaskE
}, 0 },
3838 /* PREFIX_VEX_0F4B_L_1_M_1_W_0 */
3840 { "kunpckwd", { MaskG
, MaskVex
, MaskE
}, 0 },
3842 { "kunpckbw", { MaskG
, MaskVex
, MaskE
}, 0 },
3845 /* PREFIX_VEX_0F4B_L_1_M_1_W_1 */
3847 { "kunpckdq", { MaskG
, MaskVex
, MaskE
}, 0 },
3850 /* PREFIX_VEX_0F51 */
3852 { "vsqrtps", { XM
, EXx
}, 0 },
3853 { "vsqrtss", { XMScalar
, VexScalar
, EXd
}, 0 },
3854 { "vsqrtpd", { XM
, EXx
}, 0 },
3855 { "vsqrtsd", { XMScalar
, VexScalar
, EXq
}, 0 },
3858 /* PREFIX_VEX_0F52 */
3860 { "vrsqrtps", { XM
, EXx
}, 0 },
3861 { "vrsqrtss", { XMScalar
, VexScalar
, EXd
}, 0 },
3864 /* PREFIX_VEX_0F53 */
3866 { "vrcpps", { XM
, EXx
}, 0 },
3867 { "vrcpss", { XMScalar
, VexScalar
, EXd
}, 0 },
3870 /* PREFIX_VEX_0F58 */
3872 { "vaddps", { XM
, Vex
, EXx
}, 0 },
3873 { "vaddss", { XMScalar
, VexScalar
, EXd
}, 0 },
3874 { "vaddpd", { XM
, Vex
, EXx
}, 0 },
3875 { "vaddsd", { XMScalar
, VexScalar
, EXq
}, 0 },
3878 /* PREFIX_VEX_0F59 */
3880 { "vmulps", { XM
, Vex
, EXx
}, 0 },
3881 { "vmulss", { XMScalar
, VexScalar
, EXd
}, 0 },
3882 { "vmulpd", { XM
, Vex
, EXx
}, 0 },
3883 { "vmulsd", { XMScalar
, VexScalar
, EXq
}, 0 },
3886 /* PREFIX_VEX_0F5A */
3888 { "vcvtps2pd", { XM
, EXxmmq
}, 0 },
3889 { "vcvtss2sd", { XMScalar
, VexScalar
, EXd
}, 0 },
3890 { "vcvtpd2ps%XY",{ XMM
, EXx
}, 0 },
3891 { "vcvtsd2ss", { XMScalar
, VexScalar
, EXq
}, 0 },
3894 /* PREFIX_VEX_0F5B */
3896 { "vcvtdq2ps", { XM
, EXx
}, 0 },
3897 { "vcvttps2dq", { XM
, EXx
}, 0 },
3898 { "vcvtps2dq", { XM
, EXx
}, 0 },
3901 /* PREFIX_VEX_0F5C */
3903 { "vsubps", { XM
, Vex
, EXx
}, 0 },
3904 { "vsubss", { XMScalar
, VexScalar
, EXd
}, 0 },
3905 { "vsubpd", { XM
, Vex
, EXx
}, 0 },
3906 { "vsubsd", { XMScalar
, VexScalar
, EXq
}, 0 },
3909 /* PREFIX_VEX_0F5D */
3911 { "vminps", { XM
, Vex
, EXx
}, 0 },
3912 { "vminss", { XMScalar
, VexScalar
, EXd
}, 0 },
3913 { "vminpd", { XM
, Vex
, EXx
}, 0 },
3914 { "vminsd", { XMScalar
, VexScalar
, EXq
}, 0 },
3917 /* PREFIX_VEX_0F5E */
3919 { "vdivps", { XM
, Vex
, EXx
}, 0 },
3920 { "vdivss", { XMScalar
, VexScalar
, EXd
}, 0 },
3921 { "vdivpd", { XM
, Vex
, EXx
}, 0 },
3922 { "vdivsd", { XMScalar
, VexScalar
, EXq
}, 0 },
3925 /* PREFIX_VEX_0F5F */
3927 { "vmaxps", { XM
, Vex
, EXx
}, 0 },
3928 { "vmaxss", { XMScalar
, VexScalar
, EXd
}, 0 },
3929 { "vmaxpd", { XM
, Vex
, EXx
}, 0 },
3930 { "vmaxsd", { XMScalar
, VexScalar
, EXq
}, 0 },
3933 /* PREFIX_VEX_0F6F */
3936 { "vmovdqu", { XM
, EXx
}, 0 },
3937 { "vmovdqa", { XM
, EXx
}, 0 },
3940 /* PREFIX_VEX_0F70 */
3943 { "vpshufhw", { XM
, EXx
, Ib
}, 0 },
3944 { "vpshufd", { XM
, EXx
, Ib
}, 0 },
3945 { "vpshuflw", { XM
, EXx
, Ib
}, 0 },
3948 /* PREFIX_VEX_0F7C */
3952 { "vhaddpd", { XM
, Vex
, EXx
}, 0 },
3953 { "vhaddps", { XM
, Vex
, EXx
}, 0 },
3956 /* PREFIX_VEX_0F7D */
3960 { "vhsubpd", { XM
, Vex
, EXx
}, 0 },
3961 { "vhsubps", { XM
, Vex
, EXx
}, 0 },
3964 /* PREFIX_VEX_0F7E */
3967 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_1
) },
3968 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_2
) },
3971 /* PREFIX_VEX_0F7F */
3974 { "vmovdqu", { EXxS
, XM
}, 0 },
3975 { "vmovdqa", { EXxS
, XM
}, 0 },
3978 /* PREFIX_VEX_0F90_L_0_W_0 */
3980 { "kmovw", { MaskG
, MaskE
}, 0 },
3982 { "kmovb", { MaskG
, MaskBDE
}, 0 },
3985 /* PREFIX_VEX_0F90_L_0_W_1 */
3987 { "kmovq", { MaskG
, MaskE
}, 0 },
3989 { "kmovd", { MaskG
, MaskBDE
}, 0 },
3992 /* PREFIX_VEX_0F91_L_0_M_0_W_0 */
3994 { "kmovw", { Ew
, MaskG
}, 0 },
3996 { "kmovb", { Eb
, MaskG
}, 0 },
3999 /* PREFIX_VEX_0F91_L_0_M_0_W_1 */
4001 { "kmovq", { Eq
, MaskG
}, 0 },
4003 { "kmovd", { Ed
, MaskG
}, 0 },
4006 /* PREFIX_VEX_0F92_L_0_M_1_W_0 */
4008 { "kmovw", { MaskG
, Edq
}, 0 },
4010 { "kmovb", { MaskG
, Edq
}, 0 },
4011 { "kmovd", { MaskG
, Edq
}, 0 },
4014 /* PREFIX_VEX_0F92_L_0_M_1_W_1 */
4019 { "kmovK", { MaskG
, Edq
}, 0 },
4022 /* PREFIX_VEX_0F93_L_0_M_1_W_0 */
4024 { "kmovw", { Gdq
, MaskE
}, 0 },
4026 { "kmovb", { Gdq
, MaskE
}, 0 },
4027 { "kmovd", { Gdq
, MaskE
}, 0 },
4030 /* PREFIX_VEX_0F93_L_0_M_1_W_1 */
4035 { "kmovK", { Gdq
, MaskE
}, 0 },
4038 /* PREFIX_VEX_0F98_L_0_M_1_W_0 */
4040 { "kortestw", { MaskG
, MaskE
}, 0 },
4042 { "kortestb", { MaskG
, MaskE
}, 0 },
4045 /* PREFIX_VEX_0F98_L_0_M_1_W_1 */
4047 { "kortestq", { MaskG
, MaskE
}, 0 },
4049 { "kortestd", { MaskG
, MaskE
}, 0 },
4052 /* PREFIX_VEX_0F99_L_0_M_1_W_0 */
4054 { "ktestw", { MaskG
, MaskE
}, 0 },
4056 { "ktestb", { MaskG
, MaskE
}, 0 },
4059 /* PREFIX_VEX_0F99_L_0_M_1_W_1 */
4061 { "ktestq", { MaskG
, MaskE
}, 0 },
4063 { "ktestd", { MaskG
, MaskE
}, 0 },
4066 /* PREFIX_VEX_0FC2 */
4068 { "vcmpps", { XM
, Vex
, EXx
, CMP
}, 0 },
4069 { "vcmpss", { XMScalar
, VexScalar
, EXd
, CMP
}, 0 },
4070 { "vcmppd", { XM
, Vex
, EXx
, CMP
}, 0 },
4071 { "vcmpsd", { XMScalar
, VexScalar
, EXq
, CMP
}, 0 },
4074 /* PREFIX_VEX_0FD0 */
4078 { "vaddsubpd", { XM
, Vex
, EXx
}, 0 },
4079 { "vaddsubps", { XM
, Vex
, EXx
}, 0 },
4082 /* PREFIX_VEX_0FE6 */
4085 { "vcvtdq2pd", { XM
, EXxmmq
}, 0 },
4086 { "vcvttpd2dq%XY", { XMM
, EXx
}, 0 },
4087 { "vcvtpd2dq%XY", { XMM
, EXx
}, 0 },
4090 /* PREFIX_VEX_0FF0 */
4095 { MOD_TABLE (MOD_VEX_0FF0_PREFIX_3
) },
4098 /* PREFIX_VEX_0F3849_X86_64 */
4100 { VEX_W_TABLE (VEX_W_0F3849_X86_64_P_0
) },
4102 { VEX_W_TABLE (VEX_W_0F3849_X86_64_P_2
) },
4103 { VEX_W_TABLE (VEX_W_0F3849_X86_64_P_3
) },
4106 /* PREFIX_VEX_0F384B_X86_64 */
4109 { VEX_W_TABLE (VEX_W_0F384B_X86_64_P_1
) },
4110 { VEX_W_TABLE (VEX_W_0F384B_X86_64_P_2
) },
4111 { VEX_W_TABLE (VEX_W_0F384B_X86_64_P_3
) },
4114 /* PREFIX_VEX_0F385C_X86_64 */
4117 { VEX_W_TABLE (VEX_W_0F385C_X86_64_P_1
) },
4121 /* PREFIX_VEX_0F385E_X86_64 */
4123 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_0
) },
4124 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_1
) },
4125 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_2
) },
4126 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_3
) },
4129 /* PREFIX_VEX_0F38F5_L_0 */
4131 { "bzhiS", { Gdq
, Edq
, VexGdq
}, 0 },
4132 { "pextS", { Gdq
, VexGdq
, Edq
}, 0 },
4134 { "pdepS", { Gdq
, VexGdq
, Edq
}, 0 },
4137 /* PREFIX_VEX_0F38F6_L_0 */
4142 { "mulxS", { Gdq
, VexGdq
, Edq
}, 0 },
4145 /* PREFIX_VEX_0F38F7_L_0 */
4147 { "bextrS", { Gdq
, Edq
, VexGdq
}, 0 },
4148 { "sarxS", { Gdq
, Edq
, VexGdq
}, 0 },
4149 { "shlxS", { Gdq
, Edq
, VexGdq
}, 0 },
4150 { "shrxS", { Gdq
, Edq
, VexGdq
}, 0 },
4153 /* PREFIX_VEX_0F3AF0_L_0 */
4158 { "rorxS", { Gdq
, Edq
, Ib
}, 0 },
4161 #include "i386-dis-evex-prefix.h"
4164 static const struct dis386 x86_64_table
[][2] = {
4167 { "pushP", { es
}, 0 },
4172 { "popP", { es
}, 0 },
4177 { "pushP", { cs
}, 0 },
4182 { "pushP", { ss
}, 0 },
4187 { "popP", { ss
}, 0 },
4192 { "pushP", { ds
}, 0 },
4197 { "popP", { ds
}, 0 },
4202 { "daa", { XX
}, 0 },
4207 { "das", { XX
}, 0 },
4212 { "aaa", { XX
}, 0 },
4217 { "aas", { XX
}, 0 },
4222 { "pushaP", { XX
}, 0 },
4227 { "popaP", { XX
}, 0 },
4232 { MOD_TABLE (MOD_62_32BIT
) },
4233 { EVEX_TABLE (EVEX_0F
) },
4238 { "arpl", { Ew
, Gw
}, 0 },
4239 { "movs", { Gv
, { MOVSXD_Fixup
, movsxd_mode
} }, 0 },
4244 { "ins{R|}", { Yzr
, indirDX
}, 0 },
4245 { "ins{G|}", { Yzr
, indirDX
}, 0 },
4250 { "outs{R|}", { indirDXr
, Xz
}, 0 },
4251 { "outs{G|}", { indirDXr
, Xz
}, 0 },
4256 /* Opcode 0x82 is an alias of opcode 0x80 in 32-bit mode. */
4257 { REG_TABLE (REG_80
) },
4262 { "{l|}call{P|}", { Ap
}, 0 },
4267 { "retP", { Iw
, BND
}, 0 },
4268 { "ret@", { Iw
, BND
}, 0 },
4273 { "retP", { BND
}, 0 },
4274 { "ret@", { BND
}, 0 },
4279 { MOD_TABLE (MOD_C4_32BIT
) },
4280 { VEX_C4_TABLE (VEX_0F
) },
4285 { MOD_TABLE (MOD_C5_32BIT
) },
4286 { VEX_C5_TABLE (VEX_0F
) },
4291 { "into", { XX
}, 0 },
4296 { "aam", { Ib
}, 0 },
4301 { "aad", { Ib
}, 0 },
4306 { "callP", { Jv
, BND
}, 0 },
4307 { "call@", { Jv
, BND
}, 0 }
4312 { "jmpP", { Jv
, BND
}, 0 },
4313 { "jmp@", { Jv
, BND
}, 0 }
4318 { "{l|}jmp{P|}", { Ap
}, 0 },
4321 /* X86_64_0F01_REG_0 */
4323 { "sgdt{Q|Q}", { M
}, 0 },
4324 { "sgdt", { M
}, 0 },
4327 /* X86_64_0F01_REG_1 */
4329 { "sidt{Q|Q}", { M
}, 0 },
4330 { "sidt", { M
}, 0 },
4333 /* X86_64_0F01_REG_1_RM_5_PREFIX_2 */
4336 { "seamret", { Skip_MODRM
}, 0 },
4339 /* X86_64_0F01_REG_1_RM_6_PREFIX_2 */
4342 { "seamops", { Skip_MODRM
}, 0 },
4345 /* X86_64_0F01_REG_1_RM_7_PREFIX_2 */
4348 { "seamcall", { Skip_MODRM
}, 0 },
4351 /* X86_64_0F01_REG_2 */
4353 { "lgdt{Q|Q}", { M
}, 0 },
4354 { "lgdt", { M
}, 0 },
4357 /* X86_64_0F01_REG_3 */
4359 { "lidt{Q|Q}", { M
}, 0 },
4360 { "lidt", { M
}, 0 },
4363 /* X86_64_0F01_REG_5_MOD_3_RM_4_PREFIX_1 */
4366 { "uiret", { Skip_MODRM
}, 0 },
4369 /* X86_64_0F01_REG_5_MOD_3_RM_5_PREFIX_1 */
4372 { "testui", { Skip_MODRM
}, 0 },
4375 /* X86_64_0F01_REG_5_MOD_3_RM_6_PREFIX_1 */
4378 { "clui", { Skip_MODRM
}, 0 },
4381 /* X86_64_0F01_REG_5_MOD_3_RM_7_PREFIX_1 */
4384 { "stui", { Skip_MODRM
}, 0 },
4387 /* X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_1 */
4390 { "rmpadjust", { Skip_MODRM
}, 0 },
4393 /* X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3 */
4396 { "rmpupdate", { Skip_MODRM
}, 0 },
4399 /* X86_64_0F01_REG_7_MOD_3_RM_7_PREFIX_1 */
4402 { "psmash", { Skip_MODRM
}, 0 },
4407 { "movZ", { Em
, Td
}, 0 },
4412 { "movZ", { Td
, Em
}, 0 },
4415 /* X86_64_0FC7_REG_6_MOD_3_PREFIX_1 */
4418 { "senduipi", { Eq
}, 0 },
4421 /* X86_64_VEX_0F3849 */
4424 { PREFIX_TABLE (PREFIX_VEX_0F3849_X86_64
) },
4427 /* X86_64_VEX_0F384B */
4430 { PREFIX_TABLE (PREFIX_VEX_0F384B_X86_64
) },
4433 /* X86_64_VEX_0F385C */
4436 { PREFIX_TABLE (PREFIX_VEX_0F385C_X86_64
) },
4439 /* X86_64_VEX_0F385E */
4442 { PREFIX_TABLE (PREFIX_VEX_0F385E_X86_64
) },
4446 static const struct dis386 three_byte_table
[][256] = {
4448 /* THREE_BYTE_0F38 */
4451 { "pshufb", { MX
, EM
}, PREFIX_OPCODE
},
4452 { "phaddw", { MX
, EM
}, PREFIX_OPCODE
},
4453 { "phaddd", { MX
, EM
}, PREFIX_OPCODE
},
4454 { "phaddsw", { MX
, EM
}, PREFIX_OPCODE
},
4455 { "pmaddubsw", { MX
, EM
}, PREFIX_OPCODE
},
4456 { "phsubw", { MX
, EM
}, PREFIX_OPCODE
},
4457 { "phsubd", { MX
, EM
}, PREFIX_OPCODE
},
4458 { "phsubsw", { MX
, EM
}, PREFIX_OPCODE
},
4460 { "psignb", { MX
, EM
}, PREFIX_OPCODE
},
4461 { "psignw", { MX
, EM
}, PREFIX_OPCODE
},
4462 { "psignd", { MX
, EM
}, PREFIX_OPCODE
},
4463 { "pmulhrsw", { MX
, EM
}, PREFIX_OPCODE
},
4469 { "pblendvb", { XM
, EXx
, XMM0
}, PREFIX_DATA
},
4473 { "blendvps", { XM
, EXx
, XMM0
}, PREFIX_DATA
},
4474 { "blendvpd", { XM
, EXx
, XMM0
}, PREFIX_DATA
},
4476 { "ptest", { XM
, EXx
}, PREFIX_DATA
},
4482 { "pabsb", { MX
, EM
}, PREFIX_OPCODE
},
4483 { "pabsw", { MX
, EM
}, PREFIX_OPCODE
},
4484 { "pabsd", { MX
, EM
}, PREFIX_OPCODE
},
4487 { "pmovsxbw", { XM
, EXq
}, PREFIX_DATA
},
4488 { "pmovsxbd", { XM
, EXd
}, PREFIX_DATA
},
4489 { "pmovsxbq", { XM
, EXw
}, PREFIX_DATA
},
4490 { "pmovsxwd", { XM
, EXq
}, PREFIX_DATA
},
4491 { "pmovsxwq", { XM
, EXd
}, PREFIX_DATA
},
4492 { "pmovsxdq", { XM
, EXq
}, PREFIX_DATA
},
4496 { "pmuldq", { XM
, EXx
}, PREFIX_DATA
},
4497 { "pcmpeqq", { XM
, EXx
}, PREFIX_DATA
},
4498 { MOD_TABLE (MOD_0F382A
) },
4499 { "packusdw", { XM
, EXx
}, PREFIX_DATA
},
4505 { "pmovzxbw", { XM
, EXq
}, PREFIX_DATA
},
4506 { "pmovzxbd", { XM
, EXd
}, PREFIX_DATA
},
4507 { "pmovzxbq", { XM
, EXw
}, PREFIX_DATA
},
4508 { "pmovzxwd", { XM
, EXq
}, PREFIX_DATA
},
4509 { "pmovzxwq", { XM
, EXd
}, PREFIX_DATA
},
4510 { "pmovzxdq", { XM
, EXq
}, PREFIX_DATA
},
4512 { "pcmpgtq", { XM
, EXx
}, PREFIX_DATA
},
4514 { "pminsb", { XM
, EXx
}, PREFIX_DATA
},
4515 { "pminsd", { XM
, EXx
}, PREFIX_DATA
},
4516 { "pminuw", { XM
, EXx
}, PREFIX_DATA
},
4517 { "pminud", { XM
, EXx
}, PREFIX_DATA
},
4518 { "pmaxsb", { XM
, EXx
}, PREFIX_DATA
},
4519 { "pmaxsd", { XM
, EXx
}, PREFIX_DATA
},
4520 { "pmaxuw", { XM
, EXx
}, PREFIX_DATA
},
4521 { "pmaxud", { XM
, EXx
}, PREFIX_DATA
},
4523 { "pmulld", { XM
, EXx
}, PREFIX_DATA
},
4524 { "phminposuw", { XM
, EXx
}, PREFIX_DATA
},
4595 { "invept", { Gm
, Mo
}, PREFIX_DATA
},
4596 { "invvpid", { Gm
, Mo
}, PREFIX_DATA
},
4597 { "invpcid", { Gm
, M
}, PREFIX_DATA
},
4676 { "sha1nexte", { XM
, EXxmm
}, PREFIX_OPCODE
},
4677 { "sha1msg1", { XM
, EXxmm
}, PREFIX_OPCODE
},
4678 { "sha1msg2", { XM
, EXxmm
}, PREFIX_OPCODE
},
4679 { "sha256rnds2", { XM
, EXxmm
, XMM0
}, PREFIX_OPCODE
},
4680 { "sha256msg1", { XM
, EXxmm
}, PREFIX_OPCODE
},
4681 { "sha256msg2", { XM
, EXxmm
}, PREFIX_OPCODE
},
4683 { "gf2p8mulb", { XM
, EXxmm
}, PREFIX_DATA
},
4694 { PREFIX_TABLE (PREFIX_0F38D8
) },
4697 { "aesimc", { XM
, EXx
}, PREFIX_DATA
},
4698 { PREFIX_TABLE (PREFIX_0F38DC
) },
4699 { PREFIX_TABLE (PREFIX_0F38DD
) },
4700 { PREFIX_TABLE (PREFIX_0F38DE
) },
4701 { PREFIX_TABLE (PREFIX_0F38DF
) },
4721 { PREFIX_TABLE (PREFIX_0F38F0
) },
4722 { PREFIX_TABLE (PREFIX_0F38F1
) },
4726 { MOD_TABLE (MOD_0F38F5
) },
4727 { PREFIX_TABLE (PREFIX_0F38F6
) },
4730 { PREFIX_TABLE (PREFIX_0F38F8
) },
4731 { MOD_TABLE (MOD_0F38F9
) },
4732 { PREFIX_TABLE (PREFIX_0F38FA
) },
4733 { PREFIX_TABLE (PREFIX_0F38FB
) },
4739 /* THREE_BYTE_0F3A */
4751 { "roundps", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4752 { "roundpd", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4753 { "roundss", { XM
, EXd
, Ib
}, PREFIX_DATA
},
4754 { "roundsd", { XM
, EXq
, Ib
}, PREFIX_DATA
},
4755 { "blendps", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4756 { "blendpd", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4757 { "pblendw", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4758 { "palignr", { MX
, EM
, Ib
}, PREFIX_OPCODE
},
4764 { "pextrb", { Edb
, XM
, Ib
}, PREFIX_DATA
},
4765 { "pextrw", { Edw
, XM
, Ib
}, PREFIX_DATA
},
4766 { "pextrK", { Edq
, XM
, Ib
}, PREFIX_DATA
},
4767 { "extractps", { Ed
, XM
, Ib
}, PREFIX_DATA
},
4778 { "pinsrb", { XM
, Edb
, Ib
}, PREFIX_DATA
},
4779 { "insertps", { XM
, EXd
, Ib
}, PREFIX_DATA
},
4780 { "pinsrK", { XM
, Edq
, Ib
}, PREFIX_DATA
},
4814 { "dpps", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4815 { "dppd", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4816 { "mpsadbw", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4818 { "pclmulqdq", { XM
, EXx
, PCLMUL
}, PREFIX_DATA
},
4850 { "pcmpestrm!%LQ", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4851 { "pcmpestri!%LQ", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4852 { "pcmpistrm", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4853 { "pcmpistri", { XM
, EXx
, Ib
}, PREFIX_DATA
},
4971 { "sha1rnds4", { XM
, EXxmm
, Ib
}, PREFIX_OPCODE
},
4973 { "gf2p8affineqb", { XM
, EXxmm
, Ib
}, PREFIX_DATA
},
4974 { "gf2p8affineinvqb", { XM
, EXxmm
, Ib
}, PREFIX_DATA
},
4992 { "aeskeygenassist", { XM
, EXx
, Ib
}, PREFIX_DATA
},
5012 { PREFIX_TABLE (PREFIX_0F3A0F
) },
5032 static const struct dis386 xop_table
[][256] = {
5185 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_85
) },
5186 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_86
) },
5187 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_87
) },
5195 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_8E
) },
5196 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_8F
) },
5203 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_95
) },
5204 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_96
) },
5205 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_97
) },
5213 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_9E
) },
5214 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_9F
) },
5218 { "vpcmov", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
5219 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_A3
) },
5222 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_A6
) },
5240 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_B6
) },
5252 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C0
) },
5253 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C1
) },
5254 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C2
) },
5255 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C3
) },
5265 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CC
) },
5266 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CD
) },
5267 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CE
) },
5268 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CF
) },
5301 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EC
) },
5302 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_ED
) },
5303 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EE
) },
5304 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EF
) },
5328 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_01
) },
5329 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_02
) },
5347 { MOD_TABLE (MOD_XOP_09_12
) },
5471 { VEX_W_TABLE (VEX_W_0FXOP_09_80
) },
5472 { VEX_W_TABLE (VEX_W_0FXOP_09_81
) },
5473 { VEX_W_TABLE (VEX_W_0FXOP_09_82
) },
5474 { VEX_W_TABLE (VEX_W_0FXOP_09_83
) },
5489 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_90
) },
5490 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_91
) },
5491 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_92
) },
5492 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_93
) },
5493 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_94
) },
5494 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_95
) },
5495 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_96
) },
5496 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_97
) },
5498 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_98
) },
5499 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_99
) },
5500 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_9A
) },
5501 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_9B
) },
5544 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C1
) },
5545 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C2
) },
5546 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C3
) },
5549 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C6
) },
5550 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C7
) },
5555 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_CB
) },
5562 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D1
) },
5563 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D2
) },
5564 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D3
) },
5567 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D6
) },
5568 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D7
) },
5573 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_DB
) },
5580 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_E1
) },
5581 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_E2
) },
5582 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_E3
) },
5636 { "bextrS", { Gdq
, Edq
, Id
}, 0 },
5638 { VEX_LEN_TABLE (VEX_LEN_0FXOP_0A_12
) },
5908 static const struct dis386 vex_table
[][256] = {
5930 { PREFIX_TABLE (PREFIX_VEX_0F10
) },
5931 { PREFIX_TABLE (PREFIX_VEX_0F11
) },
5932 { PREFIX_TABLE (PREFIX_VEX_0F12
) },
5933 { MOD_TABLE (MOD_VEX_0F13
) },
5934 { "vunpcklpX", { XM
, Vex
, EXx
}, PREFIX_OPCODE
},
5935 { "vunpckhpX", { XM
, Vex
, EXx
}, PREFIX_OPCODE
},
5936 { PREFIX_TABLE (PREFIX_VEX_0F16
) },
5937 { MOD_TABLE (MOD_VEX_0F17
) },
5957 { "vmovapX", { XM
, EXx
}, PREFIX_OPCODE
},
5958 { "vmovapX", { EXxS
, XM
}, PREFIX_OPCODE
},
5959 { PREFIX_TABLE (PREFIX_VEX_0F2A
) },
5960 { MOD_TABLE (MOD_VEX_0F2B
) },
5961 { PREFIX_TABLE (PREFIX_VEX_0F2C
) },
5962 { PREFIX_TABLE (PREFIX_VEX_0F2D
) },
5963 { PREFIX_TABLE (PREFIX_VEX_0F2E
) },
5964 { PREFIX_TABLE (PREFIX_VEX_0F2F
) },
5985 { VEX_LEN_TABLE (VEX_LEN_0F41
) },
5986 { VEX_LEN_TABLE (VEX_LEN_0F42
) },
5988 { VEX_LEN_TABLE (VEX_LEN_0F44
) },
5989 { VEX_LEN_TABLE (VEX_LEN_0F45
) },
5990 { VEX_LEN_TABLE (VEX_LEN_0F46
) },
5991 { VEX_LEN_TABLE (VEX_LEN_0F47
) },
5995 { VEX_LEN_TABLE (VEX_LEN_0F4A
) },
5996 { VEX_LEN_TABLE (VEX_LEN_0F4B
) },
6002 { MOD_TABLE (MOD_VEX_0F50
) },
6003 { PREFIX_TABLE (PREFIX_VEX_0F51
) },
6004 { PREFIX_TABLE (PREFIX_VEX_0F52
) },
6005 { PREFIX_TABLE (PREFIX_VEX_0F53
) },
6006 { "vandpX", { XM
, Vex
, EXx
}, PREFIX_OPCODE
},
6007 { "vandnpX", { XM
, Vex
, EXx
}, PREFIX_OPCODE
},
6008 { "vorpX", { XM
, Vex
, EXx
}, PREFIX_OPCODE
},
6009 { "vxorpX", { XM
, Vex
, EXx
}, PREFIX_OPCODE
},
6011 { PREFIX_TABLE (PREFIX_VEX_0F58
) },
6012 { PREFIX_TABLE (PREFIX_VEX_0F59
) },
6013 { PREFIX_TABLE (PREFIX_VEX_0F5A
) },
6014 { PREFIX_TABLE (PREFIX_VEX_0F5B
) },
6015 { PREFIX_TABLE (PREFIX_VEX_0F5C
) },
6016 { PREFIX_TABLE (PREFIX_VEX_0F5D
) },
6017 { PREFIX_TABLE (PREFIX_VEX_0F5E
) },
6018 { PREFIX_TABLE (PREFIX_VEX_0F5F
) },
6020 { "vpunpcklbw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6021 { "vpunpcklwd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6022 { "vpunpckldq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6023 { "vpacksswb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6024 { "vpcmpgtb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6025 { "vpcmpgtw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6026 { "vpcmpgtd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6027 { "vpackuswb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6029 { "vpunpckhbw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6030 { "vpunpckhwd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6031 { "vpunpckhdq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6032 { "vpackssdw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6033 { "vpunpcklqdq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6034 { "vpunpckhqdq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6035 { VEX_LEN_TABLE (VEX_LEN_0F6E
) },
6036 { PREFIX_TABLE (PREFIX_VEX_0F6F
) },
6038 { PREFIX_TABLE (PREFIX_VEX_0F70
) },
6039 { MOD_TABLE (MOD_VEX_0F71
) },
6040 { MOD_TABLE (MOD_VEX_0F72
) },
6041 { MOD_TABLE (MOD_VEX_0F73
) },
6042 { "vpcmpeqb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6043 { "vpcmpeqw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6044 { "vpcmpeqd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6045 { VEX_LEN_TABLE (VEX_LEN_0F77
) },
6051 { PREFIX_TABLE (PREFIX_VEX_0F7C
) },
6052 { PREFIX_TABLE (PREFIX_VEX_0F7D
) },
6053 { PREFIX_TABLE (PREFIX_VEX_0F7E
) },
6054 { PREFIX_TABLE (PREFIX_VEX_0F7F
) },
6074 { VEX_LEN_TABLE (VEX_LEN_0F90
) },
6075 { VEX_LEN_TABLE (VEX_LEN_0F91
) },
6076 { VEX_LEN_TABLE (VEX_LEN_0F92
) },
6077 { VEX_LEN_TABLE (VEX_LEN_0F93
) },
6083 { VEX_LEN_TABLE (VEX_LEN_0F98
) },
6084 { VEX_LEN_TABLE (VEX_LEN_0F99
) },
6107 { REG_TABLE (REG_VEX_0FAE
) },
6130 { PREFIX_TABLE (PREFIX_VEX_0FC2
) },
6132 { VEX_LEN_TABLE (VEX_LEN_0FC4
) },
6133 { VEX_LEN_TABLE (VEX_LEN_0FC5
) },
6134 { "vshufpX", { XM
, Vex
, EXx
, Ib
}, PREFIX_OPCODE
},
6146 { PREFIX_TABLE (PREFIX_VEX_0FD0
) },
6147 { "vpsrlw", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
6148 { "vpsrld", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
6149 { "vpsrlq", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
6150 { "vpaddq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6151 { "vpmullw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6152 { VEX_LEN_TABLE (VEX_LEN_0FD6
) },
6153 { MOD_TABLE (MOD_VEX_0FD7
) },
6155 { "vpsubusb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6156 { "vpsubusw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6157 { "vpminub", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6158 { "vpand", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6159 { "vpaddusb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6160 { "vpaddusw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6161 { "vpmaxub", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6162 { "vpandn", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6164 { "vpavgb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6165 { "vpsraw", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
6166 { "vpsrad", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
6167 { "vpavgw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6168 { "vpmulhuw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6169 { "vpmulhw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6170 { PREFIX_TABLE (PREFIX_VEX_0FE6
) },
6171 { MOD_TABLE (MOD_VEX_0FE7
) },
6173 { "vpsubsb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6174 { "vpsubsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6175 { "vpminsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6176 { "vpor", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6177 { "vpaddsb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6178 { "vpaddsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6179 { "vpmaxsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6180 { "vpxor", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6182 { PREFIX_TABLE (PREFIX_VEX_0FF0
) },
6183 { "vpsllw", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
6184 { "vpslld", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
6185 { "vpsllq", { XM
, Vex
, EXxmm
}, PREFIX_DATA
},
6186 { "vpmuludq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6187 { "vpmaddwd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6188 { "vpsadbw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6189 { VEX_LEN_TABLE (VEX_LEN_0FF7
) },
6191 { "vpsubb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6192 { "vpsubw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6193 { "vpsubd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6194 { "vpsubq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6195 { "vpaddb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6196 { "vpaddw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6197 { "vpaddd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6203 { "vpshufb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6204 { "vphaddw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6205 { "vphaddd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6206 { "vphaddsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6207 { "vpmaddubsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6208 { "vphsubw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6209 { "vphsubd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6210 { "vphsubsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6212 { "vpsignb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6213 { "vpsignw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6214 { "vpsignd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6215 { "vpmulhrsw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6216 { VEX_W_TABLE (VEX_W_0F380C
) },
6217 { VEX_W_TABLE (VEX_W_0F380D
) },
6218 { VEX_W_TABLE (VEX_W_0F380E
) },
6219 { VEX_W_TABLE (VEX_W_0F380F
) },
6224 { VEX_W_TABLE (VEX_W_0F3813
) },
6227 { VEX_LEN_TABLE (VEX_LEN_0F3816
) },
6228 { "vptest", { XM
, EXx
}, PREFIX_DATA
},
6230 { VEX_W_TABLE (VEX_W_0F3818
) },
6231 { VEX_LEN_TABLE (VEX_LEN_0F3819
) },
6232 { MOD_TABLE (MOD_VEX_0F381A
) },
6234 { "vpabsb", { XM
, EXx
}, PREFIX_DATA
},
6235 { "vpabsw", { XM
, EXx
}, PREFIX_DATA
},
6236 { "vpabsd", { XM
, EXx
}, PREFIX_DATA
},
6239 { "vpmovsxbw", { XM
, EXxmmq
}, PREFIX_DATA
},
6240 { "vpmovsxbd", { XM
, EXxmmqd
}, PREFIX_DATA
},
6241 { "vpmovsxbq", { XM
, EXxmmdw
}, PREFIX_DATA
},
6242 { "vpmovsxwd", { XM
, EXxmmq
}, PREFIX_DATA
},
6243 { "vpmovsxwq", { XM
, EXxmmqd
}, PREFIX_DATA
},
6244 { "vpmovsxdq", { XM
, EXxmmq
}, PREFIX_DATA
},
6248 { "vpmuldq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6249 { "vpcmpeqq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6250 { MOD_TABLE (MOD_VEX_0F382A
) },
6251 { "vpackusdw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6252 { MOD_TABLE (MOD_VEX_0F382C
) },
6253 { MOD_TABLE (MOD_VEX_0F382D
) },
6254 { MOD_TABLE (MOD_VEX_0F382E
) },
6255 { MOD_TABLE (MOD_VEX_0F382F
) },
6257 { "vpmovzxbw", { XM
, EXxmmq
}, PREFIX_DATA
},
6258 { "vpmovzxbd", { XM
, EXxmmqd
}, PREFIX_DATA
},
6259 { "vpmovzxbq", { XM
, EXxmmdw
}, PREFIX_DATA
},
6260 { "vpmovzxwd", { XM
, EXxmmq
}, PREFIX_DATA
},
6261 { "vpmovzxwq", { XM
, EXxmmqd
}, PREFIX_DATA
},
6262 { "vpmovzxdq", { XM
, EXxmmq
}, PREFIX_DATA
},
6263 { VEX_LEN_TABLE (VEX_LEN_0F3836
) },
6264 { "vpcmpgtq", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6266 { "vpminsb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6267 { "vpminsd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6268 { "vpminuw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6269 { "vpminud", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6270 { "vpmaxsb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6271 { "vpmaxsd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6272 { "vpmaxuw", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6273 { "vpmaxud", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6275 { "vpmulld", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6276 { VEX_LEN_TABLE (VEX_LEN_0F3841
) },
6280 { "vpsrlv%DQ", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6281 { VEX_W_TABLE (VEX_W_0F3846
) },
6282 { "vpsllv%DQ", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6285 { X86_64_TABLE (X86_64_VEX_0F3849
) },
6287 { X86_64_TABLE (X86_64_VEX_0F384B
) },
6293 { VEX_W_TABLE (VEX_W_0F3850
) },
6294 { VEX_W_TABLE (VEX_W_0F3851
) },
6295 { VEX_W_TABLE (VEX_W_0F3852
) },
6296 { VEX_W_TABLE (VEX_W_0F3853
) },
6302 { VEX_W_TABLE (VEX_W_0F3858
) },
6303 { VEX_W_TABLE (VEX_W_0F3859
) },
6304 { MOD_TABLE (MOD_VEX_0F385A
) },
6306 { X86_64_TABLE (X86_64_VEX_0F385C
) },
6308 { X86_64_TABLE (X86_64_VEX_0F385E
) },
6338 { VEX_W_TABLE (VEX_W_0F3878
) },
6339 { VEX_W_TABLE (VEX_W_0F3879
) },
6360 { MOD_TABLE (MOD_VEX_0F388C
) },
6362 { MOD_TABLE (MOD_VEX_0F388E
) },
6365 { "vpgatherd%DQ", { XM
, MVexVSIBDWpX
, VexGatherD
}, PREFIX_DATA
},
6366 { "vpgatherq%DQ", { XMGatherQ
, MVexVSIBQWpX
, VexGatherQ
}, PREFIX_DATA
},
6367 { "vgatherdp%XW", { XM
, MVexVSIBDWpX
, VexGatherD
}, PREFIX_DATA
},
6368 { "vgatherqp%XW", { XMGatherQ
, MVexVSIBQWpX
, VexGatherQ
}, PREFIX_DATA
},
6371 { "vfmaddsub132p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6372 { "vfmsubadd132p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6374 { "vfmadd132p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6375 { "vfmadd132s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6376 { "vfmsub132p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6377 { "vfmsub132s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6378 { "vfnmadd132p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6379 { "vfnmadd132s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6380 { "vfnmsub132p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6381 { "vfnmsub132s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6389 { "vfmaddsub213p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6390 { "vfmsubadd213p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6392 { "vfmadd213p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6393 { "vfmadd213s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6394 { "vfmsub213p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6395 { "vfmsub213s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6396 { "vfnmadd213p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6397 { "vfnmadd213s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6398 { "vfnmsub213p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6399 { "vfnmsub213s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6407 { "vfmaddsub231p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6408 { "vfmsubadd231p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6410 { "vfmadd231p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6411 { "vfmadd231s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6412 { "vfmsub231p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6413 { "vfmsub231s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6414 { "vfnmadd231p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6415 { "vfnmadd231s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6416 { "vfnmsub231p%XW", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6417 { "vfnmsub231s%XW", { XMScalar
, VexScalar
, EXdq
}, PREFIX_DATA
},
6435 { VEX_W_TABLE (VEX_W_0F38CF
) },
6449 { VEX_LEN_TABLE (VEX_LEN_0F38DB
) },
6450 { "vaesenc", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6451 { "vaesenclast", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6452 { "vaesdec", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6453 { "vaesdeclast", { XM
, Vex
, EXx
}, PREFIX_DATA
},
6475 { VEX_LEN_TABLE (VEX_LEN_0F38F2
) },
6476 { VEX_LEN_TABLE (VEX_LEN_0F38F3
) },
6478 { VEX_LEN_TABLE (VEX_LEN_0F38F5
) },
6479 { VEX_LEN_TABLE (VEX_LEN_0F38F6
) },
6480 { VEX_LEN_TABLE (VEX_LEN_0F38F7
) },
6494 { VEX_LEN_TABLE (VEX_LEN_0F3A00
) },
6495 { VEX_LEN_TABLE (VEX_LEN_0F3A01
) },
6496 { VEX_W_TABLE (VEX_W_0F3A02
) },
6498 { VEX_W_TABLE (VEX_W_0F3A04
) },
6499 { VEX_W_TABLE (VEX_W_0F3A05
) },
6500 { VEX_LEN_TABLE (VEX_LEN_0F3A06
) },
6503 { "vroundps", { XM
, EXx
, Ib
}, PREFIX_DATA
},
6504 { "vroundpd", { XM
, EXx
, Ib
}, PREFIX_DATA
},
6505 { "vroundss", { XMScalar
, VexScalar
, EXd
, Ib
}, PREFIX_DATA
},
6506 { "vroundsd", { XMScalar
, VexScalar
, EXq
, Ib
}, PREFIX_DATA
},
6507 { "vblendps", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
6508 { "vblendpd", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
6509 { "vpblendw", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
6510 { "vpalignr", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
6516 { VEX_LEN_TABLE (VEX_LEN_0F3A14
) },
6517 { VEX_LEN_TABLE (VEX_LEN_0F3A15
) },
6518 { VEX_LEN_TABLE (VEX_LEN_0F3A16
) },
6519 { VEX_LEN_TABLE (VEX_LEN_0F3A17
) },
6521 { VEX_LEN_TABLE (VEX_LEN_0F3A18
) },
6522 { VEX_LEN_TABLE (VEX_LEN_0F3A19
) },
6526 { VEX_W_TABLE (VEX_W_0F3A1D
) },
6530 { VEX_LEN_TABLE (VEX_LEN_0F3A20
) },
6531 { VEX_LEN_TABLE (VEX_LEN_0F3A21
) },
6532 { VEX_LEN_TABLE (VEX_LEN_0F3A22
) },
6548 { VEX_LEN_TABLE (VEX_LEN_0F3A30
) },
6549 { VEX_LEN_TABLE (VEX_LEN_0F3A31
) },
6550 { VEX_LEN_TABLE (VEX_LEN_0F3A32
) },
6551 { VEX_LEN_TABLE (VEX_LEN_0F3A33
) },
6557 { VEX_LEN_TABLE (VEX_LEN_0F3A38
) },
6558 { VEX_LEN_TABLE (VEX_LEN_0F3A39
) },
6566 { "vdpps", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
6567 { VEX_LEN_TABLE (VEX_LEN_0F3A41
) },
6568 { "vmpsadbw", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
6570 { "vpclmulqdq", { XM
, Vex
, EXx
, PCLMUL
}, PREFIX_DATA
},
6572 { VEX_LEN_TABLE (VEX_LEN_0F3A46
) },
6575 { "vpermil2ps", { XM
, Vex
, EXx
, XMVexI4
, VexI4
}, PREFIX_DATA
},
6576 { "vpermil2pd", { XM
, Vex
, EXx
, XMVexI4
, VexI4
}, PREFIX_DATA
},
6577 { VEX_W_TABLE (VEX_W_0F3A4A
) },
6578 { VEX_W_TABLE (VEX_W_0F3A4B
) },
6579 { VEX_W_TABLE (VEX_W_0F3A4C
) },
6597 { "vfmaddsubps", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6598 { "vfmaddsubpd", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6599 { "vfmsubaddps", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6600 { "vfmsubaddpd", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6602 { VEX_LEN_TABLE (VEX_LEN_0F3A60
) },
6603 { VEX_LEN_TABLE (VEX_LEN_0F3A61
) },
6604 { VEX_LEN_TABLE (VEX_LEN_0F3A62
) },
6605 { VEX_LEN_TABLE (VEX_LEN_0F3A63
) },
6611 { "vfmaddps", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6612 { "vfmaddpd", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6613 { "vfmaddss", { XMScalar
, VexScalar
, EXd
, XMVexScalarI4
}, PREFIX_DATA
},
6614 { "vfmaddsd", { XMScalar
, VexScalar
, EXq
, XMVexScalarI4
}, PREFIX_DATA
},
6615 { "vfmsubps", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6616 { "vfmsubpd", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6617 { "vfmsubss", { XMScalar
, VexScalar
, EXd
, XMVexScalarI4
}, PREFIX_DATA
},
6618 { "vfmsubsd", { XMScalar
, VexScalar
, EXq
, XMVexScalarI4
}, PREFIX_DATA
},
6629 { "vfnmaddps", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6630 { "vfnmaddpd", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6631 { "vfnmaddss", { XMScalar
, VexScalar
, EXd
, XMVexScalarI4
}, PREFIX_DATA
},
6632 { "vfnmaddsd", { XMScalar
, VexScalar
, EXq
, XMVexScalarI4
}, PREFIX_DATA
},
6633 { "vfnmsubps", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6634 { "vfnmsubpd", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
6635 { "vfnmsubss", { XMScalar
, VexScalar
, EXd
, XMVexScalarI4
}, PREFIX_DATA
},
6636 { "vfnmsubsd", { XMScalar
, VexScalar
, EXq
, XMVexScalarI4
}, PREFIX_DATA
},
6725 { VEX_W_TABLE (VEX_W_0F3ACE
) },
6726 { VEX_W_TABLE (VEX_W_0F3ACF
) },
6744 { VEX_LEN_TABLE (VEX_LEN_0F3ADF
) },
6764 { VEX_LEN_TABLE (VEX_LEN_0F3AF0
) },
6784 #include "i386-dis-evex.h"
6786 static const struct dis386 vex_len_table
[][2] = {
6787 /* VEX_LEN_0F12_P_0_M_0 / VEX_LEN_0F12_P_2_M_0 */
6789 { "vmovlpX", { XM
, Vex
, EXq
}, 0 },
6792 /* VEX_LEN_0F12_P_0_M_1 */
6794 { "vmovhlps", { XM
, Vex
, EXq
}, 0 },
6797 /* VEX_LEN_0F13_M_0 */
6799 { "vmovlpX", { EXq
, XM
}, PREFIX_OPCODE
},
6802 /* VEX_LEN_0F16_P_0_M_0 / VEX_LEN_0F16_P_2_M_0 */
6804 { "vmovhpX", { XM
, Vex
, EXq
}, 0 },
6807 /* VEX_LEN_0F16_P_0_M_1 */
6809 { "vmovlhps", { XM
, Vex
, EXq
}, 0 },
6812 /* VEX_LEN_0F17_M_0 */
6814 { "vmovhpX", { EXq
, XM
}, PREFIX_OPCODE
},
6820 { MOD_TABLE (MOD_VEX_0F41_L_1
) },
6826 { MOD_TABLE (MOD_VEX_0F42_L_1
) },
6831 { MOD_TABLE (MOD_VEX_0F44_L_0
) },
6837 { MOD_TABLE (MOD_VEX_0F45_L_1
) },
6843 { MOD_TABLE (MOD_VEX_0F46_L_1
) },
6849 { MOD_TABLE (MOD_VEX_0F47_L_1
) },
6855 { MOD_TABLE (MOD_VEX_0F4A_L_1
) },
6861 { MOD_TABLE (MOD_VEX_0F4B_L_1
) },
6866 { "vmovK", { XMScalar
, Edq
}, PREFIX_DATA
},
6871 { "vzeroupper", { XX
}, 0 },
6872 { "vzeroall", { XX
}, 0 },
6875 /* VEX_LEN_0F7E_P_1 */
6877 { "vmovq", { XMScalar
, EXq
}, 0 },
6880 /* VEX_LEN_0F7E_P_2 */
6882 { "vmovK", { Edq
, XMScalar
}, 0 },
6887 { VEX_W_TABLE (VEX_W_0F90_L_0
) },
6892 { MOD_TABLE (MOD_VEX_0F91_L_0
) },
6897 { MOD_TABLE (MOD_VEX_0F92_L_0
) },
6902 { MOD_TABLE (MOD_VEX_0F93_L_0
) },
6907 { MOD_TABLE (MOD_VEX_0F98_L_0
) },
6912 { MOD_TABLE (MOD_VEX_0F99_L_0
) },
6915 /* VEX_LEN_0FAE_R_2_M_0 */
6917 { "vldmxcsr", { Md
}, 0 },
6920 /* VEX_LEN_0FAE_R_3_M_0 */
6922 { "vstmxcsr", { Md
}, 0 },
6927 { "vpinsrw", { XM
, Vex
, Edw
, Ib
}, PREFIX_DATA
},
6932 { "vpextrw", { Gd
, XS
, Ib
}, PREFIX_DATA
},
6937 { "vmovq", { EXqS
, XMScalar
}, PREFIX_DATA
},
6942 { "vmaskmovdqu", { XM
, XS
}, PREFIX_DATA
},
6945 /* VEX_LEN_0F3816 */
6948 { VEX_W_TABLE (VEX_W_0F3816_L_1
) },
6951 /* VEX_LEN_0F3819 */
6954 { VEX_W_TABLE (VEX_W_0F3819_L_1
) },
6957 /* VEX_LEN_0F381A_M_0 */
6960 { VEX_W_TABLE (VEX_W_0F381A_M_0_L_1
) },
6963 /* VEX_LEN_0F3836 */
6966 { VEX_W_TABLE (VEX_W_0F3836
) },
6969 /* VEX_LEN_0F3841 */
6971 { "vphminposuw", { XM
, EXx
}, PREFIX_DATA
},
6974 /* VEX_LEN_0F3849_X86_64_P_0_W_0_M_0 */
6976 { "ldtilecfg", { M
}, 0 },
6979 /* VEX_LEN_0F3849_X86_64_P_0_W_0_M_1_REG_0_RM_0 */
6981 { "tilerelease", { Skip_MODRM
}, 0 },
6984 /* VEX_LEN_0F3849_X86_64_P_2_W_0_M_0 */
6986 { "sttilecfg", { M
}, 0 },
6989 /* VEX_LEN_0F3849_X86_64_P_3_W_0_M_0 */
6991 { "tilezero", { TMM
, Skip_MODRM
}, 0 },
6994 /* VEX_LEN_0F384B_X86_64_P_1_W_0_M_0 */
6996 { "tilestored", { MVexSIBMEM
, TMM
}, 0 },
6998 /* VEX_LEN_0F384B_X86_64_P_2_W_0_M_0 */
7000 { "tileloaddt1", { TMM
, MVexSIBMEM
}, 0 },
7003 /* VEX_LEN_0F384B_X86_64_P_3_W_0_M_0 */
7005 { "tileloadd", { TMM
, MVexSIBMEM
}, 0 },
7008 /* VEX_LEN_0F385A_M_0 */
7011 { VEX_W_TABLE (VEX_W_0F385A_M_0_L_0
) },
7014 /* VEX_LEN_0F385C_X86_64_P_1_W_0_M_0 */
7016 { "tdpbf16ps", { TMM
, EXtmm
, VexTmm
}, 0 },
7019 /* VEX_LEN_0F385E_X86_64_P_0_W_0_M_0 */
7021 { "tdpbuud", {TMM
, EXtmm
, VexTmm
}, 0 },
7024 /* VEX_LEN_0F385E_X86_64_P_1_W_0_M_0 */
7026 { "tdpbsud", {TMM
, EXtmm
, VexTmm
}, 0 },
7029 /* VEX_LEN_0F385E_X86_64_P_2_W_0_M_0 */
7031 { "tdpbusd", {TMM
, EXtmm
, VexTmm
}, 0 },
7034 /* VEX_LEN_0F385E_X86_64_P_3_W_0_M_0 */
7036 { "tdpbssd", {TMM
, EXtmm
, VexTmm
}, 0 },
7039 /* VEX_LEN_0F38DB */
7041 { "vaesimc", { XM
, EXx
}, PREFIX_DATA
},
7044 /* VEX_LEN_0F38F2 */
7046 { "andnS", { Gdq
, VexGdq
, Edq
}, PREFIX_OPCODE
},
7049 /* VEX_LEN_0F38F3 */
7051 { REG_TABLE(REG_VEX_0F38F3_L_0
) },
7054 /* VEX_LEN_0F38F5 */
7056 { PREFIX_TABLE(PREFIX_VEX_0F38F5_L_0
) },
7059 /* VEX_LEN_0F38F6 */
7061 { PREFIX_TABLE(PREFIX_VEX_0F38F6_L_0
) },
7064 /* VEX_LEN_0F38F7 */
7066 { PREFIX_TABLE(PREFIX_VEX_0F38F7_L_0
) },
7069 /* VEX_LEN_0F3A00 */
7072 { VEX_W_TABLE (VEX_W_0F3A00_L_1
) },
7075 /* VEX_LEN_0F3A01 */
7078 { VEX_W_TABLE (VEX_W_0F3A01_L_1
) },
7081 /* VEX_LEN_0F3A06 */
7084 { VEX_W_TABLE (VEX_W_0F3A06_L_1
) },
7087 /* VEX_LEN_0F3A14 */
7089 { "vpextrb", { Edb
, XM
, Ib
}, PREFIX_DATA
},
7092 /* VEX_LEN_0F3A15 */
7094 { "vpextrw", { Edw
, XM
, Ib
}, PREFIX_DATA
},
7097 /* VEX_LEN_0F3A16 */
7099 { "vpextrK", { Edq
, XM
, Ib
}, PREFIX_DATA
},
7102 /* VEX_LEN_0F3A17 */
7104 { "vextractps", { Ed
, XM
, Ib
}, PREFIX_DATA
},
7107 /* VEX_LEN_0F3A18 */
7110 { VEX_W_TABLE (VEX_W_0F3A18_L_1
) },
7113 /* VEX_LEN_0F3A19 */
7116 { VEX_W_TABLE (VEX_W_0F3A19_L_1
) },
7119 /* VEX_LEN_0F3A20 */
7121 { "vpinsrb", { XM
, Vex
, Edb
, Ib
}, PREFIX_DATA
},
7124 /* VEX_LEN_0F3A21 */
7126 { "vinsertps", { XM
, Vex
, EXd
, Ib
}, PREFIX_DATA
},
7129 /* VEX_LEN_0F3A22 */
7131 { "vpinsrK", { XM
, Vex
, Edq
, Ib
}, PREFIX_DATA
},
7134 /* VEX_LEN_0F3A30 */
7136 { MOD_TABLE (MOD_VEX_0F3A30_L_0
) },
7139 /* VEX_LEN_0F3A31 */
7141 { MOD_TABLE (MOD_VEX_0F3A31_L_0
) },
7144 /* VEX_LEN_0F3A32 */
7146 { MOD_TABLE (MOD_VEX_0F3A32_L_0
) },
7149 /* VEX_LEN_0F3A33 */
7151 { MOD_TABLE (MOD_VEX_0F3A33_L_0
) },
7154 /* VEX_LEN_0F3A38 */
7157 { VEX_W_TABLE (VEX_W_0F3A38_L_1
) },
7160 /* VEX_LEN_0F3A39 */
7163 { VEX_W_TABLE (VEX_W_0F3A39_L_1
) },
7166 /* VEX_LEN_0F3A41 */
7168 { "vdppd", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
7171 /* VEX_LEN_0F3A46 */
7174 { VEX_W_TABLE (VEX_W_0F3A46_L_1
) },
7177 /* VEX_LEN_0F3A60 */
7179 { "vpcmpestrm!%LQ", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7182 /* VEX_LEN_0F3A61 */
7184 { "vpcmpestri!%LQ", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7187 /* VEX_LEN_0F3A62 */
7189 { "vpcmpistrm", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7192 /* VEX_LEN_0F3A63 */
7194 { "vpcmpistri", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7197 /* VEX_LEN_0F3ADF */
7199 { "vaeskeygenassist", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7202 /* VEX_LEN_0F3AF0 */
7204 { PREFIX_TABLE (PREFIX_VEX_0F3AF0_L_0
) },
7207 /* VEX_LEN_0FXOP_08_85 */
7209 { VEX_W_TABLE (VEX_W_0FXOP_08_85_L_0
) },
7212 /* VEX_LEN_0FXOP_08_86 */
7214 { VEX_W_TABLE (VEX_W_0FXOP_08_86_L_0
) },
7217 /* VEX_LEN_0FXOP_08_87 */
7219 { VEX_W_TABLE (VEX_W_0FXOP_08_87_L_0
) },
7222 /* VEX_LEN_0FXOP_08_8E */
7224 { VEX_W_TABLE (VEX_W_0FXOP_08_8E_L_0
) },
7227 /* VEX_LEN_0FXOP_08_8F */
7229 { VEX_W_TABLE (VEX_W_0FXOP_08_8F_L_0
) },
7232 /* VEX_LEN_0FXOP_08_95 */
7234 { VEX_W_TABLE (VEX_W_0FXOP_08_95_L_0
) },
7237 /* VEX_LEN_0FXOP_08_96 */
7239 { VEX_W_TABLE (VEX_W_0FXOP_08_96_L_0
) },
7242 /* VEX_LEN_0FXOP_08_97 */
7244 { VEX_W_TABLE (VEX_W_0FXOP_08_97_L_0
) },
7247 /* VEX_LEN_0FXOP_08_9E */
7249 { VEX_W_TABLE (VEX_W_0FXOP_08_9E_L_0
) },
7252 /* VEX_LEN_0FXOP_08_9F */
7254 { VEX_W_TABLE (VEX_W_0FXOP_08_9F_L_0
) },
7257 /* VEX_LEN_0FXOP_08_A3 */
7259 { "vpperm", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7262 /* VEX_LEN_0FXOP_08_A6 */
7264 { VEX_W_TABLE (VEX_W_0FXOP_08_A6_L_0
) },
7267 /* VEX_LEN_0FXOP_08_B6 */
7269 { VEX_W_TABLE (VEX_W_0FXOP_08_B6_L_0
) },
7272 /* VEX_LEN_0FXOP_08_C0 */
7274 { VEX_W_TABLE (VEX_W_0FXOP_08_C0_L_0
) },
7277 /* VEX_LEN_0FXOP_08_C1 */
7279 { VEX_W_TABLE (VEX_W_0FXOP_08_C1_L_0
) },
7282 /* VEX_LEN_0FXOP_08_C2 */
7284 { VEX_W_TABLE (VEX_W_0FXOP_08_C2_L_0
) },
7287 /* VEX_LEN_0FXOP_08_C3 */
7289 { VEX_W_TABLE (VEX_W_0FXOP_08_C3_L_0
) },
7292 /* VEX_LEN_0FXOP_08_CC */
7294 { VEX_W_TABLE (VEX_W_0FXOP_08_CC_L_0
) },
7297 /* VEX_LEN_0FXOP_08_CD */
7299 { VEX_W_TABLE (VEX_W_0FXOP_08_CD_L_0
) },
7302 /* VEX_LEN_0FXOP_08_CE */
7304 { VEX_W_TABLE (VEX_W_0FXOP_08_CE_L_0
) },
7307 /* VEX_LEN_0FXOP_08_CF */
7309 { VEX_W_TABLE (VEX_W_0FXOP_08_CF_L_0
) },
7312 /* VEX_LEN_0FXOP_08_EC */
7314 { VEX_W_TABLE (VEX_W_0FXOP_08_EC_L_0
) },
7317 /* VEX_LEN_0FXOP_08_ED */
7319 { VEX_W_TABLE (VEX_W_0FXOP_08_ED_L_0
) },
7322 /* VEX_LEN_0FXOP_08_EE */
7324 { VEX_W_TABLE (VEX_W_0FXOP_08_EE_L_0
) },
7327 /* VEX_LEN_0FXOP_08_EF */
7329 { VEX_W_TABLE (VEX_W_0FXOP_08_EF_L_0
) },
7332 /* VEX_LEN_0FXOP_09_01 */
7334 { REG_TABLE (REG_XOP_09_01_L_0
) },
7337 /* VEX_LEN_0FXOP_09_02 */
7339 { REG_TABLE (REG_XOP_09_02_L_0
) },
7342 /* VEX_LEN_0FXOP_09_12_M_1 */
7344 { REG_TABLE (REG_XOP_09_12_M_1_L_0
) },
7347 /* VEX_LEN_0FXOP_09_82_W_0 */
7349 { "vfrczss", { XM
, EXd
}, 0 },
7352 /* VEX_LEN_0FXOP_09_83_W_0 */
7354 { "vfrczsd", { XM
, EXq
}, 0 },
7357 /* VEX_LEN_0FXOP_09_90 */
7359 { "vprotb", { XM
, EXx
, VexW
}, 0 },
7362 /* VEX_LEN_0FXOP_09_91 */
7364 { "vprotw", { XM
, EXx
, VexW
}, 0 },
7367 /* VEX_LEN_0FXOP_09_92 */
7369 { "vprotd", { XM
, EXx
, VexW
}, 0 },
7372 /* VEX_LEN_0FXOP_09_93 */
7374 { "vprotq", { XM
, EXx
, VexW
}, 0 },
7377 /* VEX_LEN_0FXOP_09_94 */
7379 { "vpshlb", { XM
, EXx
, VexW
}, 0 },
7382 /* VEX_LEN_0FXOP_09_95 */
7384 { "vpshlw", { XM
, EXx
, VexW
}, 0 },
7387 /* VEX_LEN_0FXOP_09_96 */
7389 { "vpshld", { XM
, EXx
, VexW
}, 0 },
7392 /* VEX_LEN_0FXOP_09_97 */
7394 { "vpshlq", { XM
, EXx
, VexW
}, 0 },
7397 /* VEX_LEN_0FXOP_09_98 */
7399 { "vpshab", { XM
, EXx
, VexW
}, 0 },
7402 /* VEX_LEN_0FXOP_09_99 */
7404 { "vpshaw", { XM
, EXx
, VexW
}, 0 },
7407 /* VEX_LEN_0FXOP_09_9A */
7409 { "vpshad", { XM
, EXx
, VexW
}, 0 },
7412 /* VEX_LEN_0FXOP_09_9B */
7414 { "vpshaq", { XM
, EXx
, VexW
}, 0 },
7417 /* VEX_LEN_0FXOP_09_C1 */
7419 { VEX_W_TABLE (VEX_W_0FXOP_09_C1_L_0
) },
7422 /* VEX_LEN_0FXOP_09_C2 */
7424 { VEX_W_TABLE (VEX_W_0FXOP_09_C2_L_0
) },
7427 /* VEX_LEN_0FXOP_09_C3 */
7429 { VEX_W_TABLE (VEX_W_0FXOP_09_C3_L_0
) },
7432 /* VEX_LEN_0FXOP_09_C6 */
7434 { VEX_W_TABLE (VEX_W_0FXOP_09_C6_L_0
) },
7437 /* VEX_LEN_0FXOP_09_C7 */
7439 { VEX_W_TABLE (VEX_W_0FXOP_09_C7_L_0
) },
7442 /* VEX_LEN_0FXOP_09_CB */
7444 { VEX_W_TABLE (VEX_W_0FXOP_09_CB_L_0
) },
7447 /* VEX_LEN_0FXOP_09_D1 */
7449 { VEX_W_TABLE (VEX_W_0FXOP_09_D1_L_0
) },
7452 /* VEX_LEN_0FXOP_09_D2 */
7454 { VEX_W_TABLE (VEX_W_0FXOP_09_D2_L_0
) },
7457 /* VEX_LEN_0FXOP_09_D3 */
7459 { VEX_W_TABLE (VEX_W_0FXOP_09_D3_L_0
) },
7462 /* VEX_LEN_0FXOP_09_D6 */
7464 { VEX_W_TABLE (VEX_W_0FXOP_09_D6_L_0
) },
7467 /* VEX_LEN_0FXOP_09_D7 */
7469 { VEX_W_TABLE (VEX_W_0FXOP_09_D7_L_0
) },
7472 /* VEX_LEN_0FXOP_09_DB */
7474 { VEX_W_TABLE (VEX_W_0FXOP_09_DB_L_0
) },
7477 /* VEX_LEN_0FXOP_09_E1 */
7479 { VEX_W_TABLE (VEX_W_0FXOP_09_E1_L_0
) },
7482 /* VEX_LEN_0FXOP_09_E2 */
7484 { VEX_W_TABLE (VEX_W_0FXOP_09_E2_L_0
) },
7487 /* VEX_LEN_0FXOP_09_E3 */
7489 { VEX_W_TABLE (VEX_W_0FXOP_09_E3_L_0
) },
7492 /* VEX_LEN_0FXOP_0A_12 */
7494 { REG_TABLE (REG_XOP_0A_12_L_0
) },
7498 #include "i386-dis-evex-len.h"
7500 static const struct dis386 vex_w_table
[][2] = {
7502 /* VEX_W_0F41_L_1_M_1 */
7503 { PREFIX_TABLE (PREFIX_VEX_0F41_L_1_M_1_W_0
) },
7504 { PREFIX_TABLE (PREFIX_VEX_0F41_L_1_M_1_W_1
) },
7507 /* VEX_W_0F42_L_1_M_1 */
7508 { PREFIX_TABLE (PREFIX_VEX_0F42_L_1_M_1_W_0
) },
7509 { PREFIX_TABLE (PREFIX_VEX_0F42_L_1_M_1_W_1
) },
7512 /* VEX_W_0F44_L_0_M_1 */
7513 { PREFIX_TABLE (PREFIX_VEX_0F44_L_0_M_1_W_0
) },
7514 { PREFIX_TABLE (PREFIX_VEX_0F44_L_0_M_1_W_1
) },
7517 /* VEX_W_0F45_L_1_M_1 */
7518 { PREFIX_TABLE (PREFIX_VEX_0F45_L_1_M_1_W_0
) },
7519 { PREFIX_TABLE (PREFIX_VEX_0F45_L_1_M_1_W_1
) },
7522 /* VEX_W_0F46_L_1_M_1 */
7523 { PREFIX_TABLE (PREFIX_VEX_0F46_L_1_M_1_W_0
) },
7524 { PREFIX_TABLE (PREFIX_VEX_0F46_L_1_M_1_W_1
) },
7527 /* VEX_W_0F47_L_1_M_1 */
7528 { PREFIX_TABLE (PREFIX_VEX_0F47_L_1_M_1_W_0
) },
7529 { PREFIX_TABLE (PREFIX_VEX_0F47_L_1_M_1_W_1
) },
7532 /* VEX_W_0F4A_L_1_M_1 */
7533 { PREFIX_TABLE (PREFIX_VEX_0F4A_L_1_M_1_W_0
) },
7534 { PREFIX_TABLE (PREFIX_VEX_0F4A_L_1_M_1_W_1
) },
7537 /* VEX_W_0F4B_L_1_M_1 */
7538 { PREFIX_TABLE (PREFIX_VEX_0F4B_L_1_M_1_W_0
) },
7539 { PREFIX_TABLE (PREFIX_VEX_0F4B_L_1_M_1_W_1
) },
7542 /* VEX_W_0F90_L_0 */
7543 { PREFIX_TABLE (PREFIX_VEX_0F90_L_0_W_0
) },
7544 { PREFIX_TABLE (PREFIX_VEX_0F90_L_0_W_1
) },
7547 /* VEX_W_0F91_L_0_M_0 */
7548 { PREFIX_TABLE (PREFIX_VEX_0F91_L_0_M_0_W_0
) },
7549 { PREFIX_TABLE (PREFIX_VEX_0F91_L_0_M_0_W_1
) },
7552 /* VEX_W_0F92_L_0_M_1 */
7553 { PREFIX_TABLE (PREFIX_VEX_0F92_L_0_M_1_W_0
) },
7554 { PREFIX_TABLE (PREFIX_VEX_0F92_L_0_M_1_W_1
) },
7557 /* VEX_W_0F93_L_0_M_1 */
7558 { PREFIX_TABLE (PREFIX_VEX_0F93_L_0_M_1_W_0
) },
7559 { PREFIX_TABLE (PREFIX_VEX_0F93_L_0_M_1_W_1
) },
7562 /* VEX_W_0F98_L_0_M_1 */
7563 { PREFIX_TABLE (PREFIX_VEX_0F98_L_0_M_1_W_0
) },
7564 { PREFIX_TABLE (PREFIX_VEX_0F98_L_0_M_1_W_1
) },
7567 /* VEX_W_0F99_L_0_M_1 */
7568 { PREFIX_TABLE (PREFIX_VEX_0F99_L_0_M_1_W_0
) },
7569 { PREFIX_TABLE (PREFIX_VEX_0F99_L_0_M_1_W_1
) },
7573 { "vpermilps", { XM
, Vex
, EXx
}, PREFIX_DATA
},
7577 { "vpermilpd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
7581 { "vtestps", { XM
, EXx
}, PREFIX_DATA
},
7585 { "vtestpd", { XM
, EXx
}, PREFIX_DATA
},
7589 { "vcvtph2ps", { XM
, EXxmmq
}, PREFIX_DATA
},
7592 /* VEX_W_0F3816_L_1 */
7593 { "vpermps", { XM
, Vex
, EXx
}, PREFIX_DATA
},
7597 { "vbroadcastss", { XM
, EXd
}, PREFIX_DATA
},
7600 /* VEX_W_0F3819_L_1 */
7601 { "vbroadcastsd", { XM
, EXq
}, PREFIX_DATA
},
7604 /* VEX_W_0F381A_M_0_L_1 */
7605 { "vbroadcastf128", { XM
, Mxmm
}, PREFIX_DATA
},
7608 /* VEX_W_0F382C_M_0 */
7609 { "vmaskmovps", { XM
, Vex
, Mx
}, PREFIX_DATA
},
7612 /* VEX_W_0F382D_M_0 */
7613 { "vmaskmovpd", { XM
, Vex
, Mx
}, PREFIX_DATA
},
7616 /* VEX_W_0F382E_M_0 */
7617 { "vmaskmovps", { Mx
, Vex
, XM
}, PREFIX_DATA
},
7620 /* VEX_W_0F382F_M_0 */
7621 { "vmaskmovpd", { Mx
, Vex
, XM
}, PREFIX_DATA
},
7625 { "vpermd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
7629 { "vpsravd", { XM
, Vex
, EXx
}, PREFIX_DATA
},
7632 /* VEX_W_0F3849_X86_64_P_0 */
7633 { MOD_TABLE (MOD_VEX_0F3849_X86_64_P_0_W_0
) },
7636 /* VEX_W_0F3849_X86_64_P_2 */
7637 { MOD_TABLE (MOD_VEX_0F3849_X86_64_P_2_W_0
) },
7640 /* VEX_W_0F3849_X86_64_P_3 */
7641 { MOD_TABLE (MOD_VEX_0F3849_X86_64_P_3_W_0
) },
7644 /* VEX_W_0F384B_X86_64_P_1 */
7645 { MOD_TABLE (MOD_VEX_0F384B_X86_64_P_1_W_0
) },
7648 /* VEX_W_0F384B_X86_64_P_2 */
7649 { MOD_TABLE (MOD_VEX_0F384B_X86_64_P_2_W_0
) },
7652 /* VEX_W_0F384B_X86_64_P_3 */
7653 { MOD_TABLE (MOD_VEX_0F384B_X86_64_P_3_W_0
) },
7657 { "%XV vpdpbusd", { XM
, Vex
, EXx
}, 0 },
7661 { "%XV vpdpbusds", { XM
, Vex
, EXx
}, 0 },
7665 { "%XV vpdpwssd", { XM
, Vex
, EXx
}, 0 },
7669 { "%XV vpdpwssds", { XM
, Vex
, EXx
}, 0 },
7673 { "vpbroadcastd", { XM
, EXd
}, PREFIX_DATA
},
7677 { "vpbroadcastq", { XM
, EXq
}, PREFIX_DATA
},
7680 /* VEX_W_0F385A_M_0_L_0 */
7681 { "vbroadcasti128", { XM
, Mxmm
}, PREFIX_DATA
},
7684 /* VEX_W_0F385C_X86_64_P_1 */
7685 { MOD_TABLE (MOD_VEX_0F385C_X86_64_P_1_W_0
) },
7688 /* VEX_W_0F385E_X86_64_P_0 */
7689 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_0_W_0
) },
7692 /* VEX_W_0F385E_X86_64_P_1 */
7693 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_1_W_0
) },
7696 /* VEX_W_0F385E_X86_64_P_2 */
7697 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_2_W_0
) },
7700 /* VEX_W_0F385E_X86_64_P_3 */
7701 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_3_W_0
) },
7705 { "vpbroadcastb", { XM
, EXb
}, PREFIX_DATA
},
7709 { "vpbroadcastw", { XM
, EXw
}, PREFIX_DATA
},
7713 { "vgf2p8mulb", { XM
, Vex
, EXx
}, PREFIX_DATA
},
7716 /* VEX_W_0F3A00_L_1 */
7718 { "vpermq", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7721 /* VEX_W_0F3A01_L_1 */
7723 { "vpermpd", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7727 { "vpblendd", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
7731 { "vpermilps", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7735 { "vpermilpd", { XM
, EXx
, Ib
}, PREFIX_DATA
},
7738 /* VEX_W_0F3A06_L_1 */
7739 { "vperm2f128", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
7742 /* VEX_W_0F3A18_L_1 */
7743 { "vinsertf128", { XM
, Vex
, EXxmm
, Ib
}, PREFIX_DATA
},
7746 /* VEX_W_0F3A19_L_1 */
7747 { "vextractf128", { EXxmm
, XM
, Ib
}, PREFIX_DATA
},
7751 { "vcvtps2ph", { EXxmmq
, XM
, EXxEVexS
, Ib
}, PREFIX_DATA
},
7754 /* VEX_W_0F3A38_L_1 */
7755 { "vinserti128", { XM
, Vex
, EXxmm
, Ib
}, PREFIX_DATA
},
7758 /* VEX_W_0F3A39_L_1 */
7759 { "vextracti128", { EXxmm
, XM
, Ib
}, PREFIX_DATA
},
7762 /* VEX_W_0F3A46_L_1 */
7763 { "vperm2i128", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
7767 { "vblendvps", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
7771 { "vblendvpd", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
7775 { "vpblendvb", { XM
, Vex
, EXx
, XMVexI4
}, PREFIX_DATA
},
7780 { "vgf2p8affineqb", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
7785 { "vgf2p8affineinvqb", { XM
, Vex
, EXx
, Ib
}, PREFIX_DATA
},
7787 /* VEX_W_0FXOP_08_85_L_0 */
7789 { "vpmacssww", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7791 /* VEX_W_0FXOP_08_86_L_0 */
7793 { "vpmacsswd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7795 /* VEX_W_0FXOP_08_87_L_0 */
7797 { "vpmacssdql", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7799 /* VEX_W_0FXOP_08_8E_L_0 */
7801 { "vpmacssdd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7803 /* VEX_W_0FXOP_08_8F_L_0 */
7805 { "vpmacssdqh", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7807 /* VEX_W_0FXOP_08_95_L_0 */
7809 { "vpmacsww", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7811 /* VEX_W_0FXOP_08_96_L_0 */
7813 { "vpmacswd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7815 /* VEX_W_0FXOP_08_97_L_0 */
7817 { "vpmacsdql", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7819 /* VEX_W_0FXOP_08_9E_L_0 */
7821 { "vpmacsdd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7823 /* VEX_W_0FXOP_08_9F_L_0 */
7825 { "vpmacsdqh", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7827 /* VEX_W_0FXOP_08_A6_L_0 */
7829 { "vpmadcsswd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7831 /* VEX_W_0FXOP_08_B6_L_0 */
7833 { "vpmadcswd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7835 /* VEX_W_0FXOP_08_C0_L_0 */
7837 { "vprotb", { XM
, EXx
, Ib
}, 0 },
7839 /* VEX_W_0FXOP_08_C1_L_0 */
7841 { "vprotw", { XM
, EXx
, Ib
}, 0 },
7843 /* VEX_W_0FXOP_08_C2_L_0 */
7845 { "vprotd", { XM
, EXx
, Ib
}, 0 },
7847 /* VEX_W_0FXOP_08_C3_L_0 */
7849 { "vprotq", { XM
, EXx
, Ib
}, 0 },
7851 /* VEX_W_0FXOP_08_CC_L_0 */
7853 { "vpcomb", { XM
, Vex
, EXx
, VPCOM
}, 0 },
7855 /* VEX_W_0FXOP_08_CD_L_0 */
7857 { "vpcomw", { XM
, Vex
, EXx
, VPCOM
}, 0 },
7859 /* VEX_W_0FXOP_08_CE_L_0 */
7861 { "vpcomd", { XM
, Vex
, EXx
, VPCOM
}, 0 },
7863 /* VEX_W_0FXOP_08_CF_L_0 */
7865 { "vpcomq", { XM
, Vex
, EXx
, VPCOM
}, 0 },
7867 /* VEX_W_0FXOP_08_EC_L_0 */
7869 { "vpcomub", { XM
, Vex
, EXx
, VPCOM
}, 0 },
7871 /* VEX_W_0FXOP_08_ED_L_0 */
7873 { "vpcomuw", { XM
, Vex
, EXx
, VPCOM
}, 0 },
7875 /* VEX_W_0FXOP_08_EE_L_0 */
7877 { "vpcomud", { XM
, Vex
, EXx
, VPCOM
}, 0 },
7879 /* VEX_W_0FXOP_08_EF_L_0 */
7881 { "vpcomuq", { XM
, Vex
, EXx
, VPCOM
}, 0 },
7883 /* VEX_W_0FXOP_09_80 */
7885 { "vfrczps", { XM
, EXx
}, 0 },
7887 /* VEX_W_0FXOP_09_81 */
7889 { "vfrczpd", { XM
, EXx
}, 0 },
7891 /* VEX_W_0FXOP_09_82 */
7893 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_82_W_0
) },
7895 /* VEX_W_0FXOP_09_83 */
7897 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_83_W_0
) },
7899 /* VEX_W_0FXOP_09_C1_L_0 */
7901 { "vphaddbw", { XM
, EXxmm
}, 0 },
7903 /* VEX_W_0FXOP_09_C2_L_0 */
7905 { "vphaddbd", { XM
, EXxmm
}, 0 },
7907 /* VEX_W_0FXOP_09_C3_L_0 */
7909 { "vphaddbq", { XM
, EXxmm
}, 0 },
7911 /* VEX_W_0FXOP_09_C6_L_0 */
7913 { "vphaddwd", { XM
, EXxmm
}, 0 },
7915 /* VEX_W_0FXOP_09_C7_L_0 */
7917 { "vphaddwq", { XM
, EXxmm
}, 0 },
7919 /* VEX_W_0FXOP_09_CB_L_0 */
7921 { "vphadddq", { XM
, EXxmm
}, 0 },
7923 /* VEX_W_0FXOP_09_D1_L_0 */
7925 { "vphaddubw", { XM
, EXxmm
}, 0 },
7927 /* VEX_W_0FXOP_09_D2_L_0 */
7929 { "vphaddubd", { XM
, EXxmm
}, 0 },
7931 /* VEX_W_0FXOP_09_D3_L_0 */
7933 { "vphaddubq", { XM
, EXxmm
}, 0 },
7935 /* VEX_W_0FXOP_09_D6_L_0 */
7937 { "vphadduwd", { XM
, EXxmm
}, 0 },
7939 /* VEX_W_0FXOP_09_D7_L_0 */
7941 { "vphadduwq", { XM
, EXxmm
}, 0 },
7943 /* VEX_W_0FXOP_09_DB_L_0 */
7945 { "vphaddudq", { XM
, EXxmm
}, 0 },
7947 /* VEX_W_0FXOP_09_E1_L_0 */
7949 { "vphsubbw", { XM
, EXxmm
}, 0 },
7951 /* VEX_W_0FXOP_09_E2_L_0 */
7953 { "vphsubwd", { XM
, EXxmm
}, 0 },
7955 /* VEX_W_0FXOP_09_E3_L_0 */
7957 { "vphsubdq", { XM
, EXxmm
}, 0 },
7960 #include "i386-dis-evex-w.h"
7963 static const struct dis386 mod_table
[][2] = {
7966 { "bound{S|}", { Gv
, Ma
}, 0 },
7967 { EVEX_TABLE (EVEX_0F
) },
7971 { "leaS", { Gv
, M
}, 0 },
7975 { "lesS", { Gv
, Mp
}, 0 },
7976 { VEX_C4_TABLE (VEX_0F
) },
7980 { "ldsS", { Gv
, Mp
}, 0 },
7981 { VEX_C5_TABLE (VEX_0F
) },
7986 { RM_TABLE (RM_C6_REG_7
) },
7991 { RM_TABLE (RM_C7_REG_7
) },
7995 { "{l|}call^", { indirEp
}, 0 },
7999 { "{l|}jmp^", { indirEp
}, 0 },
8002 /* MOD_0F01_REG_0 */
8003 { X86_64_TABLE (X86_64_0F01_REG_0
) },
8004 { RM_TABLE (RM_0F01_REG_0
) },
8007 /* MOD_0F01_REG_1 */
8008 { X86_64_TABLE (X86_64_0F01_REG_1
) },
8009 { RM_TABLE (RM_0F01_REG_1
) },
8012 /* MOD_0F01_REG_2 */
8013 { X86_64_TABLE (X86_64_0F01_REG_2
) },
8014 { RM_TABLE (RM_0F01_REG_2
) },
8017 /* MOD_0F01_REG_3 */
8018 { X86_64_TABLE (X86_64_0F01_REG_3
) },
8019 { RM_TABLE (RM_0F01_REG_3
) },
8022 /* MOD_0F01_REG_5 */
8023 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_0
) },
8024 { RM_TABLE (RM_0F01_REG_5_MOD_3
) },
8027 /* MOD_0F01_REG_7 */
8028 { "invlpg", { Mb
}, 0 },
8029 { RM_TABLE (RM_0F01_REG_7_MOD_3
) },
8032 /* MOD_0F12_PREFIX_0 */
8033 { "movlpX", { XM
, EXq
}, 0 },
8034 { "movhlps", { XM
, EXq
}, 0 },
8037 /* MOD_0F12_PREFIX_2 */
8038 { "movlpX", { XM
, EXq
}, 0 },
8042 { "movlpX", { EXq
, XM
}, PREFIX_OPCODE
},
8045 /* MOD_0F16_PREFIX_0 */
8046 { "movhpX", { XM
, EXq
}, 0 },
8047 { "movlhps", { XM
, EXq
}, 0 },
8050 /* MOD_0F16_PREFIX_2 */
8051 { "movhpX", { XM
, EXq
}, 0 },
8055 { "movhpX", { EXq
, XM
}, PREFIX_OPCODE
},
8058 /* MOD_0F18_REG_0 */
8059 { "prefetchnta", { Mb
}, 0 },
8060 { "nopQ", { Ev
}, 0 },
8063 /* MOD_0F18_REG_1 */
8064 { "prefetcht0", { Mb
}, 0 },
8065 { "nopQ", { Ev
}, 0 },
8068 /* MOD_0F18_REG_2 */
8069 { "prefetcht1", { Mb
}, 0 },
8070 { "nopQ", { Ev
}, 0 },
8073 /* MOD_0F18_REG_3 */
8074 { "prefetcht2", { Mb
}, 0 },
8075 { "nopQ", { Ev
}, 0 },
8078 /* MOD_0F1A_PREFIX_0 */
8079 { "bndldx", { Gbnd
, Mv_bnd
}, 0 },
8080 { "nopQ", { Ev
}, 0 },
8083 /* MOD_0F1B_PREFIX_0 */
8084 { "bndstx", { Mv_bnd
, Gbnd
}, 0 },
8085 { "nopQ", { Ev
}, 0 },
8088 /* MOD_0F1B_PREFIX_1 */
8089 { "bndmk", { Gbnd
, Mv_bnd
}, 0 },
8090 { "nopQ", { Ev
}, PREFIX_IGNORED
},
8093 /* MOD_0F1C_PREFIX_0 */
8094 { REG_TABLE (REG_0F1C_P_0_MOD_0
) },
8095 { "nopQ", { Ev
}, 0 },
8098 /* MOD_0F1E_PREFIX_1 */
8099 { "nopQ", { Ev
}, PREFIX_IGNORED
},
8100 { REG_TABLE (REG_0F1E_P_1_MOD_3
) },
8103 /* MOD_0F2B_PREFIX_0 */
8104 {"movntps", { Mx
, XM
}, PREFIX_OPCODE
},
8107 /* MOD_0F2B_PREFIX_1 */
8108 {"movntss", { Md
, XM
}, PREFIX_OPCODE
},
8111 /* MOD_0F2B_PREFIX_2 */
8112 {"movntpd", { Mx
, XM
}, PREFIX_OPCODE
},
8115 /* MOD_0F2B_PREFIX_3 */
8116 {"movntsd", { Mq
, XM
}, PREFIX_OPCODE
},
8121 { "movmskpX", { Gdq
, XS
}, PREFIX_OPCODE
},
8126 { REG_TABLE (REG_0F71_MOD_0
) },
8131 { REG_TABLE (REG_0F72_MOD_0
) },
8136 { REG_TABLE (REG_0F73_MOD_0
) },
8139 /* MOD_0FAE_REG_0 */
8140 { "fxsave", { FXSAVE
}, 0 },
8141 { PREFIX_TABLE (PREFIX_0FAE_REG_0_MOD_3
) },
8144 /* MOD_0FAE_REG_1 */
8145 { "fxrstor", { FXSAVE
}, 0 },
8146 { PREFIX_TABLE (PREFIX_0FAE_REG_1_MOD_3
) },
8149 /* MOD_0FAE_REG_2 */
8150 { "ldmxcsr", { Md
}, 0 },
8151 { PREFIX_TABLE (PREFIX_0FAE_REG_2_MOD_3
) },
8154 /* MOD_0FAE_REG_3 */
8155 { "stmxcsr", { Md
}, 0 },
8156 { PREFIX_TABLE (PREFIX_0FAE_REG_3_MOD_3
) },
8159 /* MOD_0FAE_REG_4 */
8160 { PREFIX_TABLE (PREFIX_0FAE_REG_4_MOD_0
) },
8161 { PREFIX_TABLE (PREFIX_0FAE_REG_4_MOD_3
) },
8164 /* MOD_0FAE_REG_5 */
8165 { "xrstor", { FXSAVE
}, PREFIX_OPCODE
},
8166 { PREFIX_TABLE (PREFIX_0FAE_REG_5_MOD_3
) },
8169 /* MOD_0FAE_REG_6 */
8170 { PREFIX_TABLE (PREFIX_0FAE_REG_6_MOD_0
) },
8171 { PREFIX_TABLE (PREFIX_0FAE_REG_6_MOD_3
) },
8174 /* MOD_0FAE_REG_7 */
8175 { PREFIX_TABLE (PREFIX_0FAE_REG_7_MOD_0
) },
8176 { RM_TABLE (RM_0FAE_REG_7_MOD_3
) },
8180 { "lssS", { Gv
, Mp
}, 0 },
8184 { "lfsS", { Gv
, Mp
}, 0 },
8188 { "lgsS", { Gv
, Mp
}, 0 },
8192 { "movntiS", { Edq
, Gdq
}, PREFIX_OPCODE
},
8195 /* MOD_0FC7_REG_3 */
8196 { "xrstors", { FXSAVE
}, 0 },
8199 /* MOD_0FC7_REG_4 */
8200 { "xsavec", { FXSAVE
}, 0 },
8203 /* MOD_0FC7_REG_5 */
8204 { "xsaves", { FXSAVE
}, 0 },
8207 /* MOD_0FC7_REG_6 */
8208 { PREFIX_TABLE (PREFIX_0FC7_REG_6_MOD_0
) },
8209 { PREFIX_TABLE (PREFIX_0FC7_REG_6_MOD_3
) }
8212 /* MOD_0FC7_REG_7 */
8213 { "vmptrst", { Mq
}, 0 },
8214 { PREFIX_TABLE (PREFIX_0FC7_REG_7_MOD_3
) }
8219 { "pmovmskb", { Gdq
, MS
}, 0 },
8222 /* MOD_0FE7_PREFIX_2 */
8223 { "movntdq", { Mx
, XM
}, 0 },
8226 /* MOD_0FF0_PREFIX_3 */
8227 { "lddqu", { XM
, M
}, 0 },
8231 { "movntdqa", { XM
, Mx
}, PREFIX_DATA
},
8234 /* MOD_0F38DC_PREFIX_1 */
8235 { "aesenc128kl", { XM
, M
}, 0 },
8236 { "loadiwkey", { XM
, EXx
}, 0 },
8239 /* MOD_0F38DD_PREFIX_1 */
8240 { "aesdec128kl", { XM
, M
}, 0 },
8243 /* MOD_0F38DE_PREFIX_1 */
8244 { "aesenc256kl", { XM
, M
}, 0 },
8247 /* MOD_0F38DF_PREFIX_1 */
8248 { "aesdec256kl", { XM
, M
}, 0 },
8252 { "wrussK", { M
, Gdq
}, PREFIX_DATA
},
8255 /* MOD_0F38F6_PREFIX_0 */
8256 { "wrssK", { M
, Gdq
}, PREFIX_OPCODE
},
8259 /* MOD_0F38F8_PREFIX_1 */
8260 { "enqcmds", { Gva
, M
}, PREFIX_OPCODE
},
8263 /* MOD_0F38F8_PREFIX_2 */
8264 { "movdir64b", { Gva
, M
}, PREFIX_OPCODE
},
8267 /* MOD_0F38F8_PREFIX_3 */
8268 { "enqcmd", { Gva
, M
}, PREFIX_OPCODE
},
8272 { "movdiri", { Edq
, Gdq
}, PREFIX_OPCODE
},
8275 /* MOD_0F38FA_PREFIX_1 */
8277 { "encodekey128", { Gd
, Ed
}, 0 },
8280 /* MOD_0F38FB_PREFIX_1 */
8282 { "encodekey256", { Gd
, Ed
}, 0 },
8285 /* MOD_0F3A0F_PREFIX_1 */
8287 { REG_TABLE (REG_0F3A0F_PREFIX_1_MOD_3
) },
8290 /* MOD_VEX_0F12_PREFIX_0 */
8291 { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_0
) },
8292 { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_1
) },
8295 /* MOD_VEX_0F12_PREFIX_2 */
8296 { VEX_LEN_TABLE (VEX_LEN_0F12_P_2_M_0
) },
8300 { VEX_LEN_TABLE (VEX_LEN_0F13_M_0
) },
8303 /* MOD_VEX_0F16_PREFIX_0 */
8304 { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_0
) },
8305 { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_1
) },
8308 /* MOD_VEX_0F16_PREFIX_2 */
8309 { VEX_LEN_TABLE (VEX_LEN_0F16_P_2_M_0
) },
8313 { VEX_LEN_TABLE (VEX_LEN_0F17_M_0
) },
8317 { "vmovntpX", { Mx
, XM
}, PREFIX_OPCODE
},
8320 /* MOD_VEX_0F41_L_1 */
8322 { VEX_W_TABLE (VEX_W_0F41_L_1_M_1
) },
8325 /* MOD_VEX_0F42_L_1 */
8327 { VEX_W_TABLE (VEX_W_0F42_L_1_M_1
) },
8330 /* MOD_VEX_0F44_L_0 */
8332 { VEX_W_TABLE (VEX_W_0F44_L_0_M_1
) },
8335 /* MOD_VEX_0F45_L_1 */
8337 { VEX_W_TABLE (VEX_W_0F45_L_1_M_1
) },
8340 /* MOD_VEX_0F46_L_1 */
8342 { VEX_W_TABLE (VEX_W_0F46_L_1_M_1
) },
8345 /* MOD_VEX_0F47_L_1 */
8347 { VEX_W_TABLE (VEX_W_0F47_L_1_M_1
) },
8350 /* MOD_VEX_0F4A_L_1 */
8352 { VEX_W_TABLE (VEX_W_0F4A_L_1_M_1
) },
8355 /* MOD_VEX_0F4B_L_1 */
8357 { VEX_W_TABLE (VEX_W_0F4B_L_1_M_1
) },
8362 { "vmovmskpX", { Gdq
, XS
}, PREFIX_OPCODE
},
8367 { REG_TABLE (REG_VEX_0F71_M_0
) },
8372 { REG_TABLE (REG_VEX_0F72_M_0
) },
8377 { REG_TABLE (REG_VEX_0F73_M_0
) },
8380 /* MOD_VEX_0F91_L_0 */
8381 { VEX_W_TABLE (VEX_W_0F91_L_0_M_0
) },
8384 /* MOD_VEX_0F92_L_0 */
8386 { VEX_W_TABLE (VEX_W_0F92_L_0_M_1
) },
8389 /* MOD_VEX_0F93_L_0 */
8391 { VEX_W_TABLE (VEX_W_0F93_L_0_M_1
) },
8394 /* MOD_VEX_0F98_L_0 */
8396 { VEX_W_TABLE (VEX_W_0F98_L_0_M_1
) },
8399 /* MOD_VEX_0F99_L_0 */
8401 { VEX_W_TABLE (VEX_W_0F99_L_0_M_1
) },
8404 /* MOD_VEX_0FAE_REG_2 */
8405 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_2_M_0
) },
8408 /* MOD_VEX_0FAE_REG_3 */
8409 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_3_M_0
) },
8414 { "vpmovmskb", { Gdq
, XS
}, PREFIX_DATA
},
8418 { "vmovntdq", { Mx
, XM
}, PREFIX_DATA
},
8421 /* MOD_VEX_0FF0_PREFIX_3 */
8422 { "vlddqu", { XM
, M
}, 0 },
8425 /* MOD_VEX_0F381A */
8426 { VEX_LEN_TABLE (VEX_LEN_0F381A_M_0
) },
8429 /* MOD_VEX_0F382A */
8430 { "vmovntdqa", { XM
, Mx
}, PREFIX_DATA
},
8433 /* MOD_VEX_0F382C */
8434 { VEX_W_TABLE (VEX_W_0F382C_M_0
) },
8437 /* MOD_VEX_0F382D */
8438 { VEX_W_TABLE (VEX_W_0F382D_M_0
) },
8441 /* MOD_VEX_0F382E */
8442 { VEX_W_TABLE (VEX_W_0F382E_M_0
) },
8445 /* MOD_VEX_0F382F */
8446 { VEX_W_TABLE (VEX_W_0F382F_M_0
) },
8449 /* MOD_VEX_0F3849_X86_64_P_0_W_0 */
8450 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_0_W_0_M_0
) },
8451 { REG_TABLE (REG_VEX_0F3849_X86_64_P_0_W_0_M_1
) },
8454 /* MOD_VEX_0F3849_X86_64_P_2_W_0 */
8455 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_2_W_0_M_0
) },
8458 /* MOD_VEX_0F3849_X86_64_P_3_W_0 */
8460 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_3_W_0_M_0
) },
8463 /* MOD_VEX_0F384B_X86_64_P_1_W_0 */
8464 { VEX_LEN_TABLE (VEX_LEN_0F384B_X86_64_P_1_W_0_M_0
) },
8467 /* MOD_VEX_0F384B_X86_64_P_2_W_0 */
8468 { VEX_LEN_TABLE (VEX_LEN_0F384B_X86_64_P_2_W_0_M_0
) },
8471 /* MOD_VEX_0F384B_X86_64_P_3_W_0 */
8472 { VEX_LEN_TABLE (VEX_LEN_0F384B_X86_64_P_3_W_0_M_0
) },
8475 /* MOD_VEX_0F385A */
8476 { VEX_LEN_TABLE (VEX_LEN_0F385A_M_0
) },
8479 /* MOD_VEX_0F385C_X86_64_P_1_W_0 */
8481 { VEX_LEN_TABLE (VEX_LEN_0F385C_X86_64_P_1_W_0_M_0
) },
8484 /* MOD_VEX_0F385E_X86_64_P_0_W_0 */
8486 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_0_W_0_M_0
) },
8489 /* MOD_VEX_0F385E_X86_64_P_1_W_0 */
8491 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_1_W_0_M_0
) },
8494 /* MOD_VEX_0F385E_X86_64_P_2_W_0 */
8496 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_2_W_0_M_0
) },
8499 /* MOD_VEX_0F385E_X86_64_P_3_W_0 */
8501 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_3_W_0_M_0
) },
8504 /* MOD_VEX_0F388C */
8505 { "vpmaskmov%DQ", { XM
, Vex
, Mx
}, PREFIX_DATA
},
8508 /* MOD_VEX_0F388E */
8509 { "vpmaskmov%DQ", { Mx
, Vex
, XM
}, PREFIX_DATA
},
8512 /* MOD_VEX_0F3A30_L_0 */
8514 { "kshiftr%BW", { MaskG
, MaskE
, Ib
}, PREFIX_DATA
},
8517 /* MOD_VEX_0F3A31_L_0 */
8519 { "kshiftr%DQ", { MaskG
, MaskE
, Ib
}, PREFIX_DATA
},
8522 /* MOD_VEX_0F3A32_L_0 */
8524 { "kshiftl%BW", { MaskG
, MaskE
, Ib
}, PREFIX_DATA
},
8527 /* MOD_VEX_0F3A33_L_0 */
8529 { "kshiftl%DQ", { MaskG
, MaskE
, Ib
}, PREFIX_DATA
},
8534 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_12_M_1
) },
8537 #include "i386-dis-evex-mod.h"
8540 static const struct dis386 rm_table
[][8] = {
8543 { "xabort", { Skip_MODRM
, Ib
}, 0 },
8547 { "xbeginT", { Skip_MODRM
, Jdqw
}, 0 },
8551 { "enclv", { Skip_MODRM
}, 0 },
8552 { "vmcall", { Skip_MODRM
}, 0 },
8553 { "vmlaunch", { Skip_MODRM
}, 0 },
8554 { "vmresume", { Skip_MODRM
}, 0 },
8555 { "vmxoff", { Skip_MODRM
}, 0 },
8556 { "pconfig", { Skip_MODRM
}, 0 },
8560 { "monitor", { { OP_Monitor
, 0 } }, 0 },
8561 { "mwait", { { OP_Mwait
, 0 } }, 0 },
8562 { "clac", { Skip_MODRM
}, 0 },
8563 { "stac", { Skip_MODRM
}, 0 },
8564 { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_4
) },
8565 { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_5
) },
8566 { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_6
) },
8567 { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_7
) },
8571 { "xgetbv", { Skip_MODRM
}, 0 },
8572 { "xsetbv", { Skip_MODRM
}, 0 },
8575 { "vmfunc", { Skip_MODRM
}, 0 },
8576 { "xend", { Skip_MODRM
}, 0 },
8577 { "xtest", { Skip_MODRM
}, 0 },
8578 { "enclu", { Skip_MODRM
}, 0 },
8582 { "vmrun", { Skip_MODRM
}, 0 },
8583 { PREFIX_TABLE (PREFIX_0F01_REG_3_RM_1
) },
8584 { "vmload", { Skip_MODRM
}, 0 },
8585 { "vmsave", { Skip_MODRM
}, 0 },
8586 { "stgi", { Skip_MODRM
}, 0 },
8587 { "clgi", { Skip_MODRM
}, 0 },
8588 { "skinit", { Skip_MODRM
}, 0 },
8589 { "invlpga", { Skip_MODRM
}, 0 },
8592 /* RM_0F01_REG_5_MOD_3 */
8593 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_0
) },
8594 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_1
) },
8595 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_2
) },
8597 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_4
) },
8598 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_5
) },
8599 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_6
) },
8600 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_7
) },
8603 /* RM_0F01_REG_7_MOD_3 */
8604 { "swapgs", { Skip_MODRM
}, 0 },
8605 { "rdtscp", { Skip_MODRM
}, 0 },
8606 { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_2
) },
8607 { "mwaitx", { { OP_Mwait
, eBX_reg
} }, PREFIX_OPCODE
},
8608 { "clzero", { Skip_MODRM
}, 0 },
8609 { "rdpru", { Skip_MODRM
}, 0 },
8610 { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_6
) },
8611 { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_7
) },
8614 /* RM_0F1E_P_1_MOD_3_REG_7 */
8615 { "nopQ", { Ev
}, PREFIX_IGNORED
},
8616 { "nopQ", { Ev
}, PREFIX_IGNORED
},
8617 { "endbr64", { Skip_MODRM
}, 0 },
8618 { "endbr32", { Skip_MODRM
}, 0 },
8619 { "nopQ", { Ev
}, PREFIX_IGNORED
},
8620 { "nopQ", { Ev
}, PREFIX_IGNORED
},
8621 { "nopQ", { Ev
}, PREFIX_IGNORED
},
8622 { "nopQ", { Ev
}, PREFIX_IGNORED
},
8625 /* RM_0FAE_REG_6_MOD_3 */
8626 { "mfence", { Skip_MODRM
}, 0 },
8629 /* RM_0FAE_REG_7_MOD_3 */
8630 { "sfence", { Skip_MODRM
}, 0 },
8633 /* RM_0F3A0F_P_1_MOD_3_REG_0 */
8634 { "hreset", { Skip_MODRM
, Ib
}, 0 },
8637 /* RM_VEX_0F3849_X86_64_P_0_W_0_M_1_R_0 */
8638 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_0_W_0_M_1_REG_0_RM_0
) },
8642 #define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
8644 /* We use the high bit to indicate different name for the same
8646 #define REP_PREFIX (0xf3 | 0x100)
8647 #define XACQUIRE_PREFIX (0xf2 | 0x200)
8648 #define XRELEASE_PREFIX (0xf3 | 0x400)
8649 #define BND_PREFIX (0xf2 | 0x400)
8650 #define NOTRACK_PREFIX (0x3e | 0x100)
8652 /* Remember if the current op is a jump instruction. */
8653 static bool op_is_jump
= false;
8658 int newrex
, i
, length
;
8664 last_lock_prefix
= -1;
8665 last_repz_prefix
= -1;
8666 last_repnz_prefix
= -1;
8667 last_data_prefix
= -1;
8668 last_addr_prefix
= -1;
8669 last_rex_prefix
= -1;
8670 last_seg_prefix
= -1;
8672 active_seg_prefix
= 0;
8673 for (i
= 0; i
< (int) ARRAY_SIZE (all_prefixes
); i
++)
8674 all_prefixes
[i
] = 0;
8677 /* The maximum instruction length is 15bytes. */
8678 while (length
< MAX_CODE_LENGTH
- 1)
8680 FETCH_DATA (the_info
, codep
+ 1);
8684 /* REX prefixes family. */
8701 if (address_mode
== mode_64bit
)
8705 last_rex_prefix
= i
;
8708 prefixes
|= PREFIX_REPZ
;
8709 last_repz_prefix
= i
;
8712 prefixes
|= PREFIX_REPNZ
;
8713 last_repnz_prefix
= i
;
8716 prefixes
|= PREFIX_LOCK
;
8717 last_lock_prefix
= i
;
8720 prefixes
|= PREFIX_CS
;
8721 last_seg_prefix
= i
;
8723 if (address_mode
!= mode_64bit
)
8724 active_seg_prefix
= PREFIX_CS
;
8728 prefixes
|= PREFIX_SS
;
8729 last_seg_prefix
= i
;
8731 if (address_mode
!= mode_64bit
)
8732 active_seg_prefix
= PREFIX_SS
;
8736 prefixes
|= PREFIX_DS
;
8737 last_seg_prefix
= i
;
8739 if (address_mode
!= mode_64bit
)
8740 active_seg_prefix
= PREFIX_DS
;
8744 prefixes
|= PREFIX_ES
;
8745 last_seg_prefix
= i
;
8747 if (address_mode
!= mode_64bit
)
8748 active_seg_prefix
= PREFIX_ES
;
8752 prefixes
|= PREFIX_FS
;
8753 last_seg_prefix
= i
;
8754 active_seg_prefix
= PREFIX_FS
;
8757 prefixes
|= PREFIX_GS
;
8758 last_seg_prefix
= i
;
8759 active_seg_prefix
= PREFIX_GS
;
8762 prefixes
|= PREFIX_DATA
;
8763 last_data_prefix
= i
;
8766 prefixes
|= PREFIX_ADDR
;
8767 last_addr_prefix
= i
;
8770 /* fwait is really an instruction. If there are prefixes
8771 before the fwait, they belong to the fwait, *not* to the
8772 following instruction. */
8774 if (prefixes
|| rex
)
8776 prefixes
|= PREFIX_FWAIT
;
8778 /* This ensures that the previous REX prefixes are noticed
8779 as unused prefixes, as in the return case below. */
8783 prefixes
= PREFIX_FWAIT
;
8788 /* Rex is ignored when followed by another prefix. */
8794 if (*codep
!= FWAIT_OPCODE
)
8795 all_prefixes
[i
++] = *codep
;
8803 /* Return the name of the prefix byte PREF, or NULL if PREF is not a
8807 prefix_name (int pref
, int sizeflag
)
8809 static const char *rexes
[16] =
8814 "rex.XB", /* 0x43 */
8816 "rex.RB", /* 0x45 */
8817 "rex.RX", /* 0x46 */
8818 "rex.RXB", /* 0x47 */
8820 "rex.WB", /* 0x49 */
8821 "rex.WX", /* 0x4a */
8822 "rex.WXB", /* 0x4b */
8823 "rex.WR", /* 0x4c */
8824 "rex.WRB", /* 0x4d */
8825 "rex.WRX", /* 0x4e */
8826 "rex.WRXB", /* 0x4f */
8831 /* REX prefixes family. */
8848 return rexes
[pref
- 0x40];
8868 return (sizeflag
& DFLAG
) ? "data16" : "data32";
8870 if (address_mode
== mode_64bit
)
8871 return (sizeflag
& AFLAG
) ? "addr32" : "addr64";
8873 return (sizeflag
& AFLAG
) ? "addr16" : "addr32";
8878 case XACQUIRE_PREFIX
:
8880 case XRELEASE_PREFIX
:
8884 case NOTRACK_PREFIX
:
8891 static char op_out
[MAX_OPERANDS
][100];
8892 static int op_ad
, op_index
[MAX_OPERANDS
];
8893 static int two_source_ops
;
8894 static bfd_vma op_address
[MAX_OPERANDS
];
8895 static bfd_vma op_riprel
[MAX_OPERANDS
];
8896 static bfd_vma start_pc
;
8899 * On the 386's of 1988, the maximum length of an instruction is 15 bytes.
8900 * (see topic "Redundant prefixes" in the "Differences from 8086"
8901 * section of the "Virtual 8086 Mode" chapter.)
8902 * 'pc' should be the address of this instruction, it will
8903 * be used to print the target address if this is a relative jump or call
8904 * The function returns the length of this instruction in bytes.
8907 static char intel_syntax
;
8908 static char intel_mnemonic
= !SYSV386_COMPAT
;
8909 static char open_char
;
8910 static char close_char
;
8911 static char separator_char
;
8912 static char scale_char
;
8920 static enum x86_64_isa isa64
;
8922 /* Here for backwards compatibility. When gdb stops using
8923 print_insn_i386_att and print_insn_i386_intel these functions can
8924 disappear, and print_insn_i386 be merged into print_insn. */
8926 print_insn_i386_att (bfd_vma pc
, disassemble_info
*info
)
8930 return print_insn (pc
, info
);
8934 print_insn_i386_intel (bfd_vma pc
, disassemble_info
*info
)
8938 return print_insn (pc
, info
);
8942 print_insn_i386 (bfd_vma pc
, disassemble_info
*info
)
8946 return print_insn (pc
, info
);
8950 print_i386_disassembler_options (FILE *stream
)
8952 fprintf (stream
, _("\n\
8953 The following i386/x86-64 specific disassembler options are supported for use\n\
8954 with the -M switch (multiple options should be separated by commas):\n"));
8956 fprintf (stream
, _(" x86-64 Disassemble in 64bit mode\n"));
8957 fprintf (stream
, _(" i386 Disassemble in 32bit mode\n"));
8958 fprintf (stream
, _(" i8086 Disassemble in 16bit mode\n"));
8959 fprintf (stream
, _(" att Display instruction in AT&T syntax\n"));
8960 fprintf (stream
, _(" intel Display instruction in Intel syntax\n"));
8961 fprintf (stream
, _(" att-mnemonic\n"
8962 " Display instruction in AT&T mnemonic\n"));
8963 fprintf (stream
, _(" intel-mnemonic\n"
8964 " Display instruction in Intel mnemonic\n"));
8965 fprintf (stream
, _(" addr64 Assume 64bit address size\n"));
8966 fprintf (stream
, _(" addr32 Assume 32bit address size\n"));
8967 fprintf (stream
, _(" addr16 Assume 16bit address size\n"));
8968 fprintf (stream
, _(" data32 Assume 32bit data size\n"));
8969 fprintf (stream
, _(" data16 Assume 16bit data size\n"));
8970 fprintf (stream
, _(" suffix Always display instruction suffix in AT&T syntax\n"));
8971 fprintf (stream
, _(" amd64 Display instruction in AMD64 ISA\n"));
8972 fprintf (stream
, _(" intel64 Display instruction in Intel64 ISA\n"));
8976 static const struct dis386 bad_opcode
= { "(bad)", { XX
}, 0 };
8978 /* Get a pointer to struct dis386 with a valid name. */
8980 static const struct dis386
*
8981 get_valid_dis386 (const struct dis386
*dp
, disassemble_info
*info
)
8983 int vindex
, vex_table_index
;
8985 if (dp
->name
!= NULL
)
8988 switch (dp
->op
[0].bytemode
)
8991 dp
= ®_table
[dp
->op
[1].bytemode
][modrm
.reg
];
8995 vindex
= modrm
.mod
== 0x3 ? 1 : 0;
8996 dp
= &mod_table
[dp
->op
[1].bytemode
][vindex
];
9000 dp
= &rm_table
[dp
->op
[1].bytemode
][modrm
.rm
];
9003 case USE_PREFIX_TABLE
:
9006 /* The prefix in VEX is implicit. */
9012 case REPE_PREFIX_OPCODE
:
9015 case DATA_PREFIX_OPCODE
:
9018 case REPNE_PREFIX_OPCODE
:
9028 int last_prefix
= -1;
9031 /* We check PREFIX_REPNZ and PREFIX_REPZ before PREFIX_DATA.
9032 When there are multiple PREFIX_REPNZ and PREFIX_REPZ, the
9034 if ((prefixes
& (PREFIX_REPZ
| PREFIX_REPNZ
)) != 0)
9036 if (last_repz_prefix
> last_repnz_prefix
)
9039 prefix
= PREFIX_REPZ
;
9040 last_prefix
= last_repz_prefix
;
9045 prefix
= PREFIX_REPNZ
;
9046 last_prefix
= last_repnz_prefix
;
9049 /* Check if prefix should be ignored. */
9050 if ((((prefix_table
[dp
->op
[1].bytemode
][vindex
].prefix_requirement
9051 & PREFIX_IGNORED
) >> PREFIX_IGNORED_SHIFT
)
9053 && !prefix_table
[dp
->op
[1].bytemode
][vindex
].name
)
9057 if (vindex
== 0 && (prefixes
& PREFIX_DATA
) != 0)
9060 prefix
= PREFIX_DATA
;
9061 last_prefix
= last_data_prefix
;
9066 used_prefixes
|= prefix
;
9067 all_prefixes
[last_prefix
] = 0;
9070 dp
= &prefix_table
[dp
->op
[1].bytemode
][vindex
];
9073 case USE_X86_64_TABLE
:
9074 vindex
= address_mode
== mode_64bit
? 1 : 0;
9075 dp
= &x86_64_table
[dp
->op
[1].bytemode
][vindex
];
9078 case USE_3BYTE_TABLE
:
9079 FETCH_DATA (info
, codep
+ 2);
9081 dp
= &three_byte_table
[dp
->op
[1].bytemode
][vindex
];
9083 modrm
.mod
= (*codep
>> 6) & 3;
9084 modrm
.reg
= (*codep
>> 3) & 7;
9085 modrm
.rm
= *codep
& 7;
9088 case USE_VEX_LEN_TABLE
:
9098 /* This allows re-using in particular table entries where only
9099 128-bit operand size (VEX.L=0 / EVEX.L'L=0) are valid. */
9112 dp
= &vex_len_table
[dp
->op
[1].bytemode
][vindex
];
9115 case USE_EVEX_LEN_TABLE
:
9135 dp
= &evex_len_table
[dp
->op
[1].bytemode
][vindex
];
9138 case USE_XOP_8F_TABLE
:
9139 FETCH_DATA (info
, codep
+ 3);
9140 rex
= ~(*codep
>> 5) & 0x7;
9142 /* VEX_TABLE_INDEX is the mmmmm part of the XOP byte 1 "RCB.mmmmm". */
9143 switch ((*codep
& 0x1f))
9149 vex_table_index
= XOP_08
;
9152 vex_table_index
= XOP_09
;
9155 vex_table_index
= XOP_0A
;
9159 vex
.w
= *codep
& 0x80;
9160 if (vex
.w
&& address_mode
== mode_64bit
)
9163 vex
.register_specifier
= (~(*codep
>> 3)) & 0xf;
9164 if (address_mode
!= mode_64bit
)
9166 /* In 16/32-bit mode REX_B is silently ignored. */
9170 vex
.length
= (*codep
& 0x4) ? 256 : 128;
9171 switch ((*codep
& 0x3))
9176 vex
.prefix
= DATA_PREFIX_OPCODE
;
9179 vex
.prefix
= REPE_PREFIX_OPCODE
;
9182 vex
.prefix
= REPNE_PREFIX_OPCODE
;
9188 dp
= &xop_table
[vex_table_index
][vindex
];
9191 FETCH_DATA (info
, codep
+ 1);
9192 modrm
.mod
= (*codep
>> 6) & 3;
9193 modrm
.reg
= (*codep
>> 3) & 7;
9194 modrm
.rm
= *codep
& 7;
9196 /* No XOP encoding so far allows for a non-zero embedded prefix. Avoid
9197 having to decode the bits for every otherwise valid encoding. */
9202 case USE_VEX_C4_TABLE
:
9204 FETCH_DATA (info
, codep
+ 3);
9205 rex
= ~(*codep
>> 5) & 0x7;
9206 switch ((*codep
& 0x1f))
9212 vex_table_index
= VEX_0F
;
9215 vex_table_index
= VEX_0F38
;
9218 vex_table_index
= VEX_0F3A
;
9222 vex
.w
= *codep
& 0x80;
9223 if (address_mode
== mode_64bit
)
9230 /* For the 3-byte VEX prefix in 32-bit mode, the REX_B bit
9231 is ignored, other REX bits are 0 and the highest bit in
9232 VEX.vvvv is also ignored (but we mustn't clear it here). */
9235 vex
.register_specifier
= (~(*codep
>> 3)) & 0xf;
9236 vex
.length
= (*codep
& 0x4) ? 256 : 128;
9237 switch ((*codep
& 0x3))
9242 vex
.prefix
= DATA_PREFIX_OPCODE
;
9245 vex
.prefix
= REPE_PREFIX_OPCODE
;
9248 vex
.prefix
= REPNE_PREFIX_OPCODE
;
9254 dp
= &vex_table
[vex_table_index
][vindex
];
9256 /* There is no MODRM byte for VEX0F 77. */
9257 if (vex_table_index
!= VEX_0F
|| vindex
!= 0x77)
9259 FETCH_DATA (info
, codep
+ 1);
9260 modrm
.mod
= (*codep
>> 6) & 3;
9261 modrm
.reg
= (*codep
>> 3) & 7;
9262 modrm
.rm
= *codep
& 7;
9266 case USE_VEX_C5_TABLE
:
9268 FETCH_DATA (info
, codep
+ 2);
9269 rex
= (*codep
& 0x80) ? 0 : REX_R
;
9271 /* For the 2-byte VEX prefix in 32-bit mode, the highest bit in
9273 vex
.register_specifier
= (~(*codep
>> 3)) & 0xf;
9274 vex
.length
= (*codep
& 0x4) ? 256 : 128;
9275 switch ((*codep
& 0x3))
9280 vex
.prefix
= DATA_PREFIX_OPCODE
;
9283 vex
.prefix
= REPE_PREFIX_OPCODE
;
9286 vex
.prefix
= REPNE_PREFIX_OPCODE
;
9292 dp
= &vex_table
[dp
->op
[1].bytemode
][vindex
];
9294 /* There is no MODRM byte for VEX 77. */
9297 FETCH_DATA (info
, codep
+ 1);
9298 modrm
.mod
= (*codep
>> 6) & 3;
9299 modrm
.reg
= (*codep
>> 3) & 7;
9300 modrm
.rm
= *codep
& 7;
9304 case USE_VEX_W_TABLE
:
9308 dp
= &vex_w_table
[dp
->op
[1].bytemode
][vex
.w
? 1 : 0];
9311 case USE_EVEX_TABLE
:
9315 FETCH_DATA (info
, codep
+ 4);
9316 /* The first byte after 0x62. */
9317 rex
= ~(*codep
>> 5) & 0x7;
9318 vex
.r
= *codep
& 0x10;
9319 switch ((*codep
& 0xf))
9324 vex_table_index
= EVEX_0F
;
9327 vex_table_index
= EVEX_0F38
;
9330 vex_table_index
= EVEX_0F3A
;
9333 vex_table_index
= EVEX_MAP5
;
9336 vex_table_index
= EVEX_MAP6
;
9340 /* The second byte after 0x62. */
9342 vex
.w
= *codep
& 0x80;
9343 if (vex
.w
&& address_mode
== mode_64bit
)
9346 vex
.register_specifier
= (~(*codep
>> 3)) & 0xf;
9349 if (!(*codep
& 0x4))
9352 switch ((*codep
& 0x3))
9357 vex
.prefix
= DATA_PREFIX_OPCODE
;
9360 vex
.prefix
= REPE_PREFIX_OPCODE
;
9363 vex
.prefix
= REPNE_PREFIX_OPCODE
;
9367 /* The third byte after 0x62. */
9370 /* Remember the static rounding bits. */
9371 vex
.ll
= (*codep
>> 5) & 3;
9372 vex
.b
= (*codep
& 0x10) != 0;
9374 vex
.v
= *codep
& 0x8;
9375 vex
.mask_register_specifier
= *codep
& 0x7;
9376 vex
.zeroing
= *codep
& 0x80;
9378 if (address_mode
!= mode_64bit
)
9380 /* In 16/32-bit mode silently ignore following bits. */
9388 dp
= &evex_table
[vex_table_index
][vindex
];
9390 FETCH_DATA (info
, codep
+ 1);
9391 modrm
.mod
= (*codep
>> 6) & 3;
9392 modrm
.reg
= (*codep
>> 3) & 7;
9393 modrm
.rm
= *codep
& 7;
9395 /* Set vector length. */
9396 if (modrm
.mod
== 3 && vex
.b
)
9425 if (dp
->name
!= NULL
)
9428 return get_valid_dis386 (dp
, info
);
9432 get_sib (disassemble_info
*info
, int sizeflag
)
9434 /* If modrm.mod == 3, operand must be register. */
9436 && ((sizeflag
& AFLAG
) || address_mode
== mode_64bit
)
9440 FETCH_DATA (info
, codep
+ 2);
9441 sib
.index
= (codep
[1] >> 3) & 7;
9442 sib
.scale
= (codep
[1] >> 6) & 3;
9443 sib
.base
= codep
[1] & 7;
9448 print_insn (bfd_vma pc
, disassemble_info
*info
)
9450 const struct dis386
*dp
;
9452 char *op_txt
[MAX_OPERANDS
];
9454 int sizeflag
, orig_sizeflag
;
9456 struct dis_private priv
;
9459 priv
.orig_sizeflag
= AFLAG
| DFLAG
;
9460 if ((info
->mach
& bfd_mach_i386_i386
) != 0)
9461 address_mode
= mode_32bit
;
9462 else if (info
->mach
== bfd_mach_i386_i8086
)
9464 address_mode
= mode_16bit
;
9465 priv
.orig_sizeflag
= 0;
9468 address_mode
= mode_64bit
;
9470 if (intel_syntax
== (char) -1)
9471 intel_syntax
= (info
->mach
& bfd_mach_i386_intel_syntax
) != 0;
9473 for (p
= info
->disassembler_options
; p
!= NULL
; )
9475 if (startswith (p
, "amd64"))
9477 else if (startswith (p
, "intel64"))
9479 else if (startswith (p
, "x86-64"))
9481 address_mode
= mode_64bit
;
9482 priv
.orig_sizeflag
|= AFLAG
| DFLAG
;
9484 else if (startswith (p
, "i386"))
9486 address_mode
= mode_32bit
;
9487 priv
.orig_sizeflag
|= AFLAG
| DFLAG
;
9489 else if (startswith (p
, "i8086"))
9491 address_mode
= mode_16bit
;
9492 priv
.orig_sizeflag
&= ~(AFLAG
| DFLAG
);
9494 else if (startswith (p
, "intel"))
9497 if (startswith (p
+ 5, "-mnemonic"))
9500 else if (startswith (p
, "att"))
9503 if (startswith (p
+ 3, "-mnemonic"))
9506 else if (startswith (p
, "addr"))
9508 if (address_mode
== mode_64bit
)
9510 if (p
[4] == '3' && p
[5] == '2')
9511 priv
.orig_sizeflag
&= ~AFLAG
;
9512 else if (p
[4] == '6' && p
[5] == '4')
9513 priv
.orig_sizeflag
|= AFLAG
;
9517 if (p
[4] == '1' && p
[5] == '6')
9518 priv
.orig_sizeflag
&= ~AFLAG
;
9519 else if (p
[4] == '3' && p
[5] == '2')
9520 priv
.orig_sizeflag
|= AFLAG
;
9523 else if (startswith (p
, "data"))
9525 if (p
[4] == '1' && p
[5] == '6')
9526 priv
.orig_sizeflag
&= ~DFLAG
;
9527 else if (p
[4] == '3' && p
[5] == '2')
9528 priv
.orig_sizeflag
|= DFLAG
;
9530 else if (startswith (p
, "suffix"))
9531 priv
.orig_sizeflag
|= SUFFIX_ALWAYS
;
9533 p
= strchr (p
, ',');
9538 if (address_mode
== mode_64bit
&& sizeof (bfd_vma
) < 8)
9540 (*info
->fprintf_func
) (info
->stream
,
9541 _("64-bit address is disabled"));
9547 names64
= intel_names64
;
9548 names32
= intel_names32
;
9549 names16
= intel_names16
;
9550 names8
= intel_names8
;
9551 names8rex
= intel_names8rex
;
9552 names_seg
= intel_names_seg
;
9553 names_mm
= intel_names_mm
;
9554 names_bnd
= intel_names_bnd
;
9555 names_xmm
= intel_names_xmm
;
9556 names_ymm
= intel_names_ymm
;
9557 names_zmm
= intel_names_zmm
;
9558 names_tmm
= intel_names_tmm
;
9559 index64
= intel_index64
;
9560 index32
= intel_index32
;
9561 names_mask
= intel_names_mask
;
9562 index16
= intel_index16
;
9565 separator_char
= '+';
9570 names64
= att_names64
;
9571 names32
= att_names32
;
9572 names16
= att_names16
;
9573 names8
= att_names8
;
9574 names8rex
= att_names8rex
;
9575 names_seg
= att_names_seg
;
9576 names_mm
= att_names_mm
;
9577 names_bnd
= att_names_bnd
;
9578 names_xmm
= att_names_xmm
;
9579 names_ymm
= att_names_ymm
;
9580 names_zmm
= att_names_zmm
;
9581 names_tmm
= att_names_tmm
;
9582 index64
= att_index64
;
9583 index32
= att_index32
;
9584 names_mask
= att_names_mask
;
9585 index16
= att_index16
;
9588 separator_char
= ',';
9592 /* The output looks better if we put 7 bytes on a line, since that
9593 puts most long word instructions on a single line. Use 8 bytes
9595 if ((info
->mach
& bfd_mach_l1om
) != 0)
9596 info
->bytes_per_line
= 8;
9598 info
->bytes_per_line
= 7;
9600 info
->private_data
= &priv
;
9601 priv
.max_fetched
= priv
.the_buffer
;
9602 priv
.insn_start
= pc
;
9605 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
9613 start_codep
= priv
.the_buffer
;
9614 codep
= priv
.the_buffer
;
9616 if (OPCODES_SIGSETJMP (priv
.bailout
) != 0)
9620 /* Getting here means we tried for data but didn't get it. That
9621 means we have an incomplete instruction of some sort. Just
9622 print the first byte as a prefix or a .byte pseudo-op. */
9623 if (codep
> priv
.the_buffer
)
9625 name
= prefix_name (priv
.the_buffer
[0], priv
.orig_sizeflag
);
9627 (*info
->fprintf_func
) (info
->stream
, "%s", name
);
9630 /* Just print the first byte as a .byte instruction. */
9631 (*info
->fprintf_func
) (info
->stream
, ".byte 0x%x",
9632 (unsigned int) priv
.the_buffer
[0]);
9642 sizeflag
= priv
.orig_sizeflag
;
9644 if (!ckprefix () || rex_used
)
9646 /* Too many prefixes or unused REX prefixes. */
9648 i
< (int) ARRAY_SIZE (all_prefixes
) && all_prefixes
[i
];
9650 (*info
->fprintf_func
) (info
->stream
, "%s%s",
9652 prefix_name (all_prefixes
[i
], sizeflag
));
9658 FETCH_DATA (info
, codep
+ 1);
9659 two_source_ops
= (*codep
== 0x62) || (*codep
== 0xc8);
9661 if (((prefixes
& PREFIX_FWAIT
)
9662 && ((*codep
< 0xd8) || (*codep
> 0xdf))))
9664 /* Handle prefixes before fwait. */
9665 for (i
= 0; i
< fwait_prefix
&& all_prefixes
[i
];
9667 (*info
->fprintf_func
) (info
->stream
, "%s ",
9668 prefix_name (all_prefixes
[i
], sizeflag
));
9669 (*info
->fprintf_func
) (info
->stream
, "fwait");
9675 unsigned char threebyte
;
9678 FETCH_DATA (info
, codep
+ 1);
9680 dp
= &dis386_twobyte
[threebyte
];
9681 need_modrm
= twobyte_has_modrm
[threebyte
];
9686 dp
= &dis386
[*codep
];
9687 need_modrm
= onebyte_has_modrm
[*codep
];
9691 /* Save sizeflag for printing the extra prefixes later before updating
9692 it for mnemonic and operand processing. The prefix names depend
9693 only on the address mode. */
9694 orig_sizeflag
= sizeflag
;
9695 if (prefixes
& PREFIX_ADDR
)
9697 if ((prefixes
& PREFIX_DATA
))
9703 FETCH_DATA (info
, codep
+ 1);
9704 modrm
.mod
= (*codep
>> 6) & 3;
9705 modrm
.reg
= (*codep
>> 3) & 7;
9706 modrm
.rm
= *codep
& 7;
9709 memset (&modrm
, 0, sizeof (modrm
));
9712 memset (&vex
, 0, sizeof (vex
));
9714 if (dp
->name
== NULL
&& dp
->op
[0].bytemode
== FLOATCODE
)
9716 get_sib (info
, sizeflag
);
9721 dp
= get_valid_dis386 (dp
, info
);
9722 if (dp
!= NULL
&& putop (dp
->name
, sizeflag
) == 0)
9724 get_sib (info
, sizeflag
);
9725 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
9728 op_ad
= MAX_OPERANDS
- 1 - i
;
9730 (*dp
->op
[i
].rtn
) (dp
->op
[i
].bytemode
, sizeflag
);
9731 /* For EVEX instruction after the last operand masking
9732 should be printed. */
9733 if (i
== 0 && vex
.evex
)
9735 /* Don't print {%k0}. */
9736 if (vex
.mask_register_specifier
)
9739 oappend (names_mask
[vex
.mask_register_specifier
]);
9745 /* S/G insns require a mask and don't allow
9747 if ((dp
->op
[0].bytemode
== vex_vsib_d_w_dq_mode
9748 || dp
->op
[0].bytemode
== vex_vsib_q_w_dq_mode
)
9749 && (vex
.mask_register_specifier
== 0 || vex
.zeroing
))
9754 /* Check whether rounding control was enabled for an insn not
9756 if (modrm
.mod
== 3 && vex
.b
&& !(evex_used
& EVEX_b_used
))
9758 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
9763 oappend (names_rounding
[vex
.ll
]);
9771 /* Clear instruction information. */
9774 the_info
->insn_info_valid
= 0;
9775 the_info
->branch_delay_insns
= 0;
9776 the_info
->data_size
= 0;
9777 the_info
->insn_type
= dis_noninsn
;
9778 the_info
->target
= 0;
9779 the_info
->target2
= 0;
9782 /* Reset jump operation indicator. */
9786 int jump_detection
= 0;
9788 /* Extract flags. */
9789 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
9791 if ((dp
->op
[i
].rtn
== OP_J
)
9792 || (dp
->op
[i
].rtn
== OP_indirE
))
9793 jump_detection
|= 1;
9794 else if ((dp
->op
[i
].rtn
== BND_Fixup
)
9795 || (!dp
->op
[i
].rtn
&& !dp
->op
[i
].bytemode
))
9796 jump_detection
|= 2;
9797 else if ((dp
->op
[i
].bytemode
== cond_jump_mode
)
9798 || (dp
->op
[i
].bytemode
== loop_jcxz_mode
))
9799 jump_detection
|= 4;
9802 /* Determine if this is a jump or branch. */
9803 if ((jump_detection
& 0x3) == 0x3)
9806 if (jump_detection
& 0x4)
9807 the_info
->insn_type
= dis_condbranch
;
9809 the_info
->insn_type
=
9810 (dp
->name
&& !strncmp(dp
->name
, "call", 4))
9811 ? dis_jsr
: dis_branch
;
9815 /* If VEX.vvvv and EVEX.vvvv are unused, they must be all 1s, which
9816 are all 0s in inverted form. */
9817 if (need_vex
&& vex
.register_specifier
!= 0)
9819 (*info
->fprintf_func
) (info
->stream
, "(bad)");
9820 return end_codep
- priv
.the_buffer
;
9823 /* If EVEX.z is set, there must be an actual mask register in use. */
9824 if (vex
.zeroing
&& vex
.mask_register_specifier
== 0)
9826 (*info
->fprintf_func
) (info
->stream
, "(bad)");
9827 return end_codep
- priv
.the_buffer
;
9830 switch (dp
->prefix_requirement
)
9833 /* If only the data prefix is marked as mandatory, its absence renders
9834 the encoding invalid. Most other PREFIX_OPCODE rules still apply. */
9835 if (need_vex
? !vex
.prefix
: !(prefixes
& PREFIX_DATA
))
9837 (*info
->fprintf_func
) (info
->stream
, "(bad)");
9838 return end_codep
- priv
.the_buffer
;
9840 used_prefixes
|= PREFIX_DATA
;
9843 /* If the mandatory PREFIX_REPZ/PREFIX_REPNZ/PREFIX_DATA prefix is
9844 unused, opcode is invalid. Since the PREFIX_DATA prefix may be
9845 used by putop and MMX/SSE operand and may be overridden by the
9846 PREFIX_REPZ/PREFIX_REPNZ fix, we check the PREFIX_DATA prefix
9849 ? vex
.prefix
== REPE_PREFIX_OPCODE
9850 || vex
.prefix
== REPNE_PREFIX_OPCODE
9852 & (PREFIX_REPZ
| PREFIX_REPNZ
)) != 0)
9854 & (PREFIX_REPZ
| PREFIX_REPNZ
)) == 0)
9856 ? vex
.prefix
== DATA_PREFIX_OPCODE
9858 & (PREFIX_REPZ
| PREFIX_REPNZ
| PREFIX_DATA
))
9860 && (used_prefixes
& PREFIX_DATA
) == 0))
9861 || (vex
.evex
&& dp
->prefix_requirement
!= PREFIX_DATA
9862 && !vex
.w
!= !(used_prefixes
& PREFIX_DATA
)))
9864 (*info
->fprintf_func
) (info
->stream
, "(bad)");
9865 return end_codep
- priv
.the_buffer
;
9869 case PREFIX_IGNORED
:
9870 /* Zap data size and rep prefixes from used_prefixes and reinstate their
9871 origins in all_prefixes. */
9872 used_prefixes
&= ~PREFIX_OPCODE
;
9873 if (last_data_prefix
>= 0)
9874 all_prefixes
[last_data_prefix
] = 0x66;
9875 if (last_repz_prefix
>= 0)
9876 all_prefixes
[last_repz_prefix
] = 0xf3;
9877 if (last_repnz_prefix
>= 0)
9878 all_prefixes
[last_repnz_prefix
] = 0xf2;
9882 /* Check if the REX prefix is used. */
9883 if ((rex
^ rex_used
) == 0 && !need_vex
&& last_rex_prefix
>= 0)
9884 all_prefixes
[last_rex_prefix
] = 0;
9886 /* Check if the SEG prefix is used. */
9887 if ((prefixes
& (PREFIX_CS
| PREFIX_SS
| PREFIX_DS
| PREFIX_ES
9888 | PREFIX_FS
| PREFIX_GS
)) != 0
9889 && (used_prefixes
& active_seg_prefix
) != 0)
9890 all_prefixes
[last_seg_prefix
] = 0;
9892 /* Check if the ADDR prefix is used. */
9893 if ((prefixes
& PREFIX_ADDR
) != 0
9894 && (used_prefixes
& PREFIX_ADDR
) != 0)
9895 all_prefixes
[last_addr_prefix
] = 0;
9897 /* Check if the DATA prefix is used. */
9898 if ((prefixes
& PREFIX_DATA
) != 0
9899 && (used_prefixes
& PREFIX_DATA
) != 0
9901 all_prefixes
[last_data_prefix
] = 0;
9903 /* Print the extra prefixes. */
9905 for (i
= 0; i
< (int) ARRAY_SIZE (all_prefixes
); i
++)
9906 if (all_prefixes
[i
])
9909 name
= prefix_name (all_prefixes
[i
], orig_sizeflag
);
9912 prefix_length
+= strlen (name
) + 1;
9913 (*info
->fprintf_func
) (info
->stream
, "%s ", name
);
9916 /* Check maximum code length. */
9917 if ((codep
- start_codep
) > MAX_CODE_LENGTH
)
9919 (*info
->fprintf_func
) (info
->stream
, "(bad)");
9920 return MAX_CODE_LENGTH
;
9923 obufp
= mnemonicendp
;
9924 for (i
= strlen (obuf
) + prefix_length
; i
< 6; i
++)
9927 (*info
->fprintf_func
) (info
->stream
, "%s", obuf
);
9929 /* The enter and bound instructions are printed with operands in the same
9930 order as the intel book; everything else is printed in reverse order. */
9931 if (intel_syntax
|| two_source_ops
)
9935 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
9936 op_txt
[i
] = op_out
[i
];
9938 if (intel_syntax
&& dp
&& dp
->op
[2].rtn
== OP_Rounding
9939 && dp
->op
[3].rtn
== OP_E
&& dp
->op
[4].rtn
== NULL
)
9941 op_txt
[2] = op_out
[3];
9942 op_txt
[3] = op_out
[2];
9945 for (i
= 0; i
< (MAX_OPERANDS
>> 1); ++i
)
9947 op_ad
= op_index
[i
];
9948 op_index
[i
] = op_index
[MAX_OPERANDS
- 1 - i
];
9949 op_index
[MAX_OPERANDS
- 1 - i
] = op_ad
;
9950 riprel
= op_riprel
[i
];
9951 op_riprel
[i
] = op_riprel
[MAX_OPERANDS
- 1 - i
];
9952 op_riprel
[MAX_OPERANDS
- 1 - i
] = riprel
;
9957 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
9958 op_txt
[MAX_OPERANDS
- 1 - i
] = op_out
[i
];
9962 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
9966 (*info
->fprintf_func
) (info
->stream
, ",");
9967 if (op_index
[i
] != -1 && !op_riprel
[i
])
9969 bfd_vma target
= (bfd_vma
) op_address
[op_index
[i
]];
9971 if (the_info
&& op_is_jump
)
9973 the_info
->insn_info_valid
= 1;
9974 the_info
->branch_delay_insns
= 0;
9975 the_info
->data_size
= 0;
9976 the_info
->target
= target
;
9977 the_info
->target2
= 0;
9979 (*info
->print_address_func
) (target
, info
);
9982 (*info
->fprintf_func
) (info
->stream
, "%s", op_txt
[i
]);
9986 for (i
= 0; i
< MAX_OPERANDS
; i
++)
9987 if (op_index
[i
] != -1 && op_riprel
[i
])
9989 (*info
->fprintf_func
) (info
->stream
, " # ");
9990 (*info
->print_address_func
) ((bfd_vma
) (start_pc
+ (codep
- start_codep
)
9991 + op_address
[op_index
[i
]]), info
);
9994 return codep
- priv
.the_buffer
;
9997 static const char *float_mem
[] = {
10072 static const unsigned char float_mem_mode
[] = {
10147 #define ST { OP_ST, 0 }
10148 #define STi { OP_STi, 0 }
10150 #define FGRPd9_2 NULL, { { NULL, 1 } }, 0
10151 #define FGRPd9_4 NULL, { { NULL, 2 } }, 0
10152 #define FGRPd9_5 NULL, { { NULL, 3 } }, 0
10153 #define FGRPd9_6 NULL, { { NULL, 4 } }, 0
10154 #define FGRPd9_7 NULL, { { NULL, 5 } }, 0
10155 #define FGRPda_5 NULL, { { NULL, 6 } }, 0
10156 #define FGRPdb_4 NULL, { { NULL, 7 } }, 0
10157 #define FGRPde_3 NULL, { { NULL, 8 } }, 0
10158 #define FGRPdf_4 NULL, { { NULL, 9 } }, 0
10160 static const struct dis386 float_reg
[][8] = {
10163 { "fadd", { ST
, STi
}, 0 },
10164 { "fmul", { ST
, STi
}, 0 },
10165 { "fcom", { STi
}, 0 },
10166 { "fcomp", { STi
}, 0 },
10167 { "fsub", { ST
, STi
}, 0 },
10168 { "fsubr", { ST
, STi
}, 0 },
10169 { "fdiv", { ST
, STi
}, 0 },
10170 { "fdivr", { ST
, STi
}, 0 },
10174 { "fld", { STi
}, 0 },
10175 { "fxch", { STi
}, 0 },
10185 { "fcmovb", { ST
, STi
}, 0 },
10186 { "fcmove", { ST
, STi
}, 0 },
10187 { "fcmovbe",{ ST
, STi
}, 0 },
10188 { "fcmovu", { ST
, STi
}, 0 },
10196 { "fcmovnb",{ ST
, STi
}, 0 },
10197 { "fcmovne",{ ST
, STi
}, 0 },
10198 { "fcmovnbe",{ ST
, STi
}, 0 },
10199 { "fcmovnu",{ ST
, STi
}, 0 },
10201 { "fucomi", { ST
, STi
}, 0 },
10202 { "fcomi", { ST
, STi
}, 0 },
10207 { "fadd", { STi
, ST
}, 0 },
10208 { "fmul", { STi
, ST
}, 0 },
10211 { "fsub{!M|r}", { STi
, ST
}, 0 },
10212 { "fsub{M|}", { STi
, ST
}, 0 },
10213 { "fdiv{!M|r}", { STi
, ST
}, 0 },
10214 { "fdiv{M|}", { STi
, ST
}, 0 },
10218 { "ffree", { STi
}, 0 },
10220 { "fst", { STi
}, 0 },
10221 { "fstp", { STi
}, 0 },
10222 { "fucom", { STi
}, 0 },
10223 { "fucomp", { STi
}, 0 },
10229 { "faddp", { STi
, ST
}, 0 },
10230 { "fmulp", { STi
, ST
}, 0 },
10233 { "fsub{!M|r}p", { STi
, ST
}, 0 },
10234 { "fsub{M|}p", { STi
, ST
}, 0 },
10235 { "fdiv{!M|r}p", { STi
, ST
}, 0 },
10236 { "fdiv{M|}p", { STi
, ST
}, 0 },
10240 { "ffreep", { STi
}, 0 },
10245 { "fucomip", { ST
, STi
}, 0 },
10246 { "fcomip", { ST
, STi
}, 0 },
10251 static char *fgrps
[][8] = {
10254 "(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10259 "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10264 "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
10269 "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
10274 "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
10279 "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
10284 "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10289 "fNeni(8087 only)","fNdisi(8087 only)","fNclex","fNinit",
10290 "fNsetpm(287 only)","frstpm(287 only)","(bad)","(bad)",
10295 "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10300 "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10305 swap_operand (void)
10307 mnemonicendp
[0] = '.';
10308 mnemonicendp
[1] = 's';
10313 OP_Skip_MODRM (int bytemode ATTRIBUTE_UNUSED
,
10314 int sizeflag ATTRIBUTE_UNUSED
)
10316 /* Skip mod/rm byte. */
10322 dofloat (int sizeflag
)
10324 const struct dis386
*dp
;
10325 unsigned char floatop
;
10327 floatop
= codep
[-1];
10329 if (modrm
.mod
!= 3)
10331 int fp_indx
= (floatop
- 0xd8) * 8 + modrm
.reg
;
10333 putop (float_mem
[fp_indx
], sizeflag
);
10336 OP_E (float_mem_mode
[fp_indx
], sizeflag
);
10339 /* Skip mod/rm byte. */
10343 dp
= &float_reg
[floatop
- 0xd8][modrm
.reg
];
10344 if (dp
->name
== NULL
)
10346 putop (fgrps
[dp
->op
[0].bytemode
][modrm
.rm
], sizeflag
);
10348 /* Instruction fnstsw is only one with strange arg. */
10349 if (floatop
== 0xdf && codep
[-1] == 0xe0)
10350 strcpy (op_out
[0], names16
[0]);
10354 putop (dp
->name
, sizeflag
);
10359 (*dp
->op
[0].rtn
) (dp
->op
[0].bytemode
, sizeflag
);
10364 (*dp
->op
[1].rtn
) (dp
->op
[1].bytemode
, sizeflag
);
10368 /* Like oappend (below), but S is a string starting with '%'.
10369 In Intel syntax, the '%' is elided. */
10371 oappend_maybe_intel (const char *s
)
10373 oappend (s
+ intel_syntax
);
10377 OP_ST (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
10379 oappend_maybe_intel ("%st");
10383 OP_STi (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
10385 sprintf (scratchbuf
, "%%st(%d)", modrm
.rm
);
10386 oappend_maybe_intel (scratchbuf
);
10389 /* Capital letters in template are macros. */
10391 putop (const char *in_template
, int sizeflag
)
10396 unsigned int l
= 0, len
= 0;
10399 for (p
= in_template
; *p
; p
++)
10403 if (l
>= sizeof (last
) || !ISUPPER (*p
))
10422 while (*++p
!= '|')
10423 if (*p
== '}' || *p
== '\0')
10429 while (*++p
!= '}')
10441 if ((need_modrm
&& modrm
.mod
!= 3)
10442 || (sizeflag
& SUFFIX_ALWAYS
))
10451 if (sizeflag
& SUFFIX_ALWAYS
)
10454 else if (l
== 1 && last
[0] == 'L')
10456 if (address_mode
== mode_64bit
10457 && !(prefixes
& PREFIX_ADDR
))
10470 if (intel_syntax
&& !alt
)
10472 if ((prefixes
& PREFIX_DATA
) || (sizeflag
& SUFFIX_ALWAYS
))
10474 if (sizeflag
& DFLAG
)
10475 *obufp
++ = intel_syntax
? 'd' : 'l';
10477 *obufp
++ = intel_syntax
? 'w' : 's';
10478 used_prefixes
|= (prefixes
& PREFIX_DATA
);
10482 if (intel_syntax
|| !(sizeflag
& SUFFIX_ALWAYS
))
10485 if (modrm
.mod
== 3)
10491 if (sizeflag
& DFLAG
)
10492 *obufp
++ = intel_syntax
? 'd' : 'l';
10495 used_prefixes
|= (prefixes
& PREFIX_DATA
);
10501 case 'E': /* For jcxz/jecxz */
10502 if (address_mode
== mode_64bit
)
10504 if (sizeflag
& AFLAG
)
10510 if (sizeflag
& AFLAG
)
10512 used_prefixes
|= (prefixes
& PREFIX_ADDR
);
10517 if ((prefixes
& PREFIX_ADDR
) || (sizeflag
& SUFFIX_ALWAYS
))
10519 if (sizeflag
& AFLAG
)
10520 *obufp
++ = address_mode
== mode_64bit
? 'q' : 'l';
10522 *obufp
++ = address_mode
== mode_64bit
? 'l' : 'w';
10523 used_prefixes
|= (prefixes
& PREFIX_ADDR
);
10527 if (intel_syntax
|| (obufp
[-1] != 's' && !(sizeflag
& SUFFIX_ALWAYS
)))
10529 if ((rex
& REX_W
) || (sizeflag
& DFLAG
))
10533 if (!(rex
& REX_W
))
10534 used_prefixes
|= (prefixes
& PREFIX_DATA
);
10541 if ((prefixes
& (PREFIX_CS
| PREFIX_DS
)) == PREFIX_CS
10542 || (prefixes
& (PREFIX_CS
| PREFIX_DS
)) == PREFIX_DS
)
10544 used_prefixes
|= prefixes
& (PREFIX_CS
| PREFIX_DS
);
10548 /* Set active_seg_prefix even if not set in 64-bit mode
10549 because here it is a valid branch hint. */
10550 if (prefixes
& PREFIX_DS
)
10552 active_seg_prefix
= PREFIX_DS
;
10557 active_seg_prefix
= PREFIX_CS
;
10562 else if (l
== 1 && last
[0] == 'X')
10588 if (intel_mnemonic
!= cond
)
10592 if ((prefixes
& PREFIX_FWAIT
) == 0)
10595 used_prefixes
|= PREFIX_FWAIT
;
10601 else if (intel_syntax
&& (sizeflag
& DFLAG
))
10605 if (!(rex
& REX_W
))
10606 used_prefixes
|= (prefixes
& PREFIX_DATA
);
10609 if (address_mode
== mode_64bit
10610 && (isa64
== intel64
|| (rex
& REX_W
)
10611 || !(prefixes
& PREFIX_DATA
)))
10613 if (sizeflag
& SUFFIX_ALWAYS
)
10617 /* Fall through. */
10621 if ((modrm
.mod
== 3 || !cond
)
10622 && !(sizeflag
& SUFFIX_ALWAYS
))
10624 /* Fall through. */
10626 if ((!(rex
& REX_W
) && (prefixes
& PREFIX_DATA
))
10627 || ((sizeflag
& SUFFIX_ALWAYS
)
10628 && address_mode
!= mode_64bit
))
10630 *obufp
++ = (sizeflag
& DFLAG
) ?
10631 intel_syntax
? 'd' : 'l' : 'w';
10632 used_prefixes
|= (prefixes
& PREFIX_DATA
);
10634 else if (sizeflag
& SUFFIX_ALWAYS
)
10637 else if (l
== 1 && last
[0] == 'L')
10639 if ((prefixes
& PREFIX_DATA
)
10641 || (sizeflag
& SUFFIX_ALWAYS
))
10648 if (sizeflag
& DFLAG
)
10649 *obufp
++ = intel_syntax
? 'd' : 'l';
10652 used_prefixes
|= (prefixes
& PREFIX_DATA
);
10662 if (intel_syntax
&& !alt
)
10665 if ((need_modrm
&& modrm
.mod
!= 3)
10666 || (sizeflag
& SUFFIX_ALWAYS
))
10672 if (sizeflag
& DFLAG
)
10673 *obufp
++ = intel_syntax
? 'd' : 'l';
10676 used_prefixes
|= (prefixes
& PREFIX_DATA
);
10680 else if (l
== 1 && last
[0] == 'D')
10681 *obufp
++ = vex
.w
? 'q' : 'd';
10682 else if (l
== 1 && last
[0] == 'L')
10684 if (cond
? modrm
.mod
== 3 && !(sizeflag
& SUFFIX_ALWAYS
)
10685 : address_mode
!= mode_64bit
)
10692 else if((address_mode
== mode_64bit
&& cond
)
10693 || (sizeflag
& SUFFIX_ALWAYS
))
10694 *obufp
++ = intel_syntax
? 'd' : 'l';
10703 else if (sizeflag
& DFLAG
)
10712 if (intel_syntax
&& !p
[1]
10713 && ((rex
& REX_W
) || (sizeflag
& DFLAG
)))
10715 if (!(rex
& REX_W
))
10716 used_prefixes
|= (prefixes
& PREFIX_DATA
);
10724 if (sizeflag
& SUFFIX_ALWAYS
)
10730 if (sizeflag
& DFLAG
)
10734 used_prefixes
|= (prefixes
& PREFIX_DATA
);
10738 else if (l
== 1 && last
[0] == 'L')
10740 if (address_mode
== mode_64bit
10741 && !(prefixes
& PREFIX_ADDR
))
10757 && (last
[0] == 'L' || last
[0] == 'X'))
10759 if (last
[0] == 'X')
10767 else if (rex
& REX_W
)
10780 /* operand size flag for cwtl, cbtw */
10789 else if (sizeflag
& DFLAG
)
10793 if (!(rex
& REX_W
))
10794 used_prefixes
|= (prefixes
& PREFIX_DATA
);
10800 if (last
[0] == 'X')
10801 *obufp
++ = vex
.w
? 'd': 's';
10802 else if (last
[0] == 'B')
10803 *obufp
++ = vex
.w
? 'w': 'b';
10814 ? vex
.prefix
== DATA_PREFIX_OPCODE
10815 : prefixes
& PREFIX_DATA
)
10818 used_prefixes
|= PREFIX_DATA
;
10824 if (l
== 1 && last
[0] == 'X')
10829 || ((modrm
.mod
== 3 || vex
.b
) && !(sizeflag
& SUFFIX_ALWAYS
)))
10831 switch (vex
.length
)
10851 /* These insns ignore ModR/M.mod: Force it to 3 for OP_E(). */
10853 if (!intel_syntax
&& (sizeflag
& SUFFIX_ALWAYS
))
10854 *obufp
++ = address_mode
== mode_64bit
? 'q' : 'l';
10856 else if (l
== 1 && last
[0] == 'X')
10861 || ((modrm
.mod
== 3 || vex
.b
) && !(sizeflag
& SUFFIX_ALWAYS
)))
10863 switch (vex
.length
)
10884 if (isa64
== intel64
&& (rex
& REX_W
))
10890 if ((prefixes
& PREFIX_DATA
) || (sizeflag
& SUFFIX_ALWAYS
))
10892 if (sizeflag
& DFLAG
)
10896 used_prefixes
|= (prefixes
& PREFIX_DATA
);
10905 mnemonicendp
= obufp
;
10910 oappend (const char *s
)
10912 obufp
= stpcpy (obufp
, s
);
10918 /* Only print the active segment register. */
10919 if (!active_seg_prefix
)
10922 used_prefixes
|= active_seg_prefix
;
10923 switch (active_seg_prefix
)
10926 oappend_maybe_intel ("%cs:");
10929 oappend_maybe_intel ("%ds:");
10932 oappend_maybe_intel ("%ss:");
10935 oappend_maybe_intel ("%es:");
10938 oappend_maybe_intel ("%fs:");
10941 oappend_maybe_intel ("%gs:");
10949 OP_indirE (int bytemode
, int sizeflag
)
10953 OP_E (bytemode
, sizeflag
);
10957 print_operand_value (char *buf
, int hex
, bfd_vma disp
)
10959 if (address_mode
== mode_64bit
)
10967 sprintf_vma (tmp
, disp
);
10968 for (i
= 0; tmp
[i
] == '0' && tmp
[i
+ 1]; i
++);
10969 strcpy (buf
+ 2, tmp
+ i
);
10973 bfd_signed_vma v
= disp
;
10980 /* Check for possible overflow on 0x8000000000000000. */
10983 strcpy (buf
, "9223372036854775808");
10997 tmp
[28 - i
] = (v
% 10) + '0';
11001 strcpy (buf
, tmp
+ 29 - i
);
11007 sprintf (buf
, "0x%x", (unsigned int) disp
);
11009 sprintf (buf
, "%d", (int) disp
);
11013 /* Put DISP in BUF as signed hex number. */
11016 print_displacement (char *buf
, bfd_vma disp
)
11018 bfd_signed_vma val
= disp
;
11027 /* Check for possible overflow. */
11030 switch (address_mode
)
11033 strcpy (buf
+ j
, "0x8000000000000000");
11036 strcpy (buf
+ j
, "0x80000000");
11039 strcpy (buf
+ j
, "0x8000");
11049 sprintf_vma (tmp
, (bfd_vma
) val
);
11050 for (i
= 0; tmp
[i
] == '0'; i
++)
11052 if (tmp
[i
] == '\0')
11054 strcpy (buf
+ j
, tmp
+ i
);
11058 intel_operand_size (int bytemode
, int sizeflag
)
11065 case evex_half_bcst_xmmq_mode
:
11067 oappend ("QWORD PTR ");
11069 oappend ("DWORD PTR ");
11072 case evex_half_bcst_xmmqh_mode
:
11073 case evex_half_bcst_xmmqdh_mode
:
11074 oappend ("WORD PTR ");
11086 oappend ("BYTE PTR ");
11091 oappend ("WORD PTR ");
11094 if (address_mode
== mode_64bit
&& isa64
== intel64
)
11096 oappend ("QWORD PTR ");
11099 /* Fall through. */
11101 if (address_mode
== mode_64bit
&& ((sizeflag
& DFLAG
) || (rex
& REX_W
)))
11103 oappend ("QWORD PTR ");
11106 /* Fall through. */
11112 oappend ("QWORD PTR ");
11113 else if (bytemode
== dq_mode
)
11114 oappend ("DWORD PTR ");
11117 if (sizeflag
& DFLAG
)
11118 oappend ("DWORD PTR ");
11120 oappend ("WORD PTR ");
11121 used_prefixes
|= (prefixes
& PREFIX_DATA
);
11125 if ((rex
& REX_W
) || (sizeflag
& DFLAG
))
11127 oappend ("WORD PTR ");
11128 if (!(rex
& REX_W
))
11129 used_prefixes
|= (prefixes
& PREFIX_DATA
);
11132 if (sizeflag
& DFLAG
)
11133 oappend ("QWORD PTR ");
11135 oappend ("DWORD PTR ");
11136 used_prefixes
|= (prefixes
& PREFIX_DATA
);
11139 if (!(sizeflag
& DFLAG
) && isa64
== intel64
)
11140 oappend ("WORD PTR ");
11142 oappend ("DWORD PTR ");
11143 used_prefixes
|= (prefixes
& PREFIX_DATA
);
11147 oappend ("DWORD PTR ");
11151 oappend ("QWORD PTR ");
11154 if (address_mode
== mode_64bit
)
11155 oappend ("QWORD PTR ");
11157 oappend ("DWORD PTR ");
11160 if (sizeflag
& DFLAG
)
11161 oappend ("FWORD PTR ");
11163 oappend ("DWORD PTR ");
11164 used_prefixes
|= (prefixes
& PREFIX_DATA
);
11167 oappend ("TBYTE PTR ");
11172 case evex_x_gscat_mode
:
11173 case evex_x_nobcst_mode
:
11177 switch (vex
.length
)
11180 oappend ("XMMWORD PTR ");
11183 oappend ("YMMWORD PTR ");
11186 oappend ("ZMMWORD PTR ");
11193 oappend ("XMMWORD PTR ");
11196 oappend ("XMMWORD PTR ");
11199 oappend ("YMMWORD PTR ");
11202 case evex_half_bcst_xmmqh_mode
:
11203 case evex_half_bcst_xmmq_mode
:
11207 switch (vex
.length
)
11210 oappend ("QWORD PTR ");
11213 oappend ("XMMWORD PTR ");
11216 oappend ("YMMWORD PTR ");
11226 switch (vex
.length
)
11229 oappend ("WORD PTR ");
11232 oappend ("DWORD PTR ");
11235 oappend ("QWORD PTR ");
11242 case evex_half_bcst_xmmqdh_mode
:
11246 switch (vex
.length
)
11249 oappend ("DWORD PTR ");
11252 oappend ("QWORD PTR ");
11255 oappend ("XMMWORD PTR ");
11265 switch (vex
.length
)
11268 oappend ("QWORD PTR ");
11271 oappend ("YMMWORD PTR ");
11274 oappend ("ZMMWORD PTR ");
11284 switch (vex
.length
)
11288 oappend ("XMMWORD PTR ");
11295 oappend ("OWORD PTR ");
11297 case vex_vsib_d_w_dq_mode
:
11298 case vex_vsib_q_w_dq_mode
:
11303 oappend ("QWORD PTR ");
11305 oappend ("DWORD PTR ");
11308 if (!need_vex
|| vex
.length
!= 128)
11311 oappend ("DWORD PTR ");
11313 oappend ("BYTE PTR ");
11319 oappend ("QWORD PTR ");
11321 oappend ("WORD PTR ");
11331 print_register (unsigned int reg
, unsigned int rexmask
, int bytemode
, int sizeflag
)
11333 const char **names
;
11335 USED_REX (rexmask
);
11363 names
= address_mode
== mode_64bit
? names64
: names32
;
11366 case bnd_swap_mode
:
11375 if (address_mode
== mode_64bit
&& isa64
== intel64
)
11380 /* Fall through. */
11382 if (address_mode
== mode_64bit
&& ((sizeflag
& DFLAG
) || (rex
& REX_W
)))
11388 /* Fall through. */
11395 else if (bytemode
!= v_mode
&& bytemode
!= v_swap_mode
)
11399 if (sizeflag
& DFLAG
)
11403 used_prefixes
|= (prefixes
& PREFIX_DATA
);
11407 if (!(sizeflag
& DFLAG
) && isa64
== intel64
)
11411 used_prefixes
|= (prefixes
& PREFIX_DATA
);
11414 names
= (address_mode
== mode_64bit
11415 ? names64
: names32
);
11416 if (!(prefixes
& PREFIX_ADDR
))
11417 names
= (address_mode
== mode_16bit
11418 ? names16
: names
);
11421 /* Remove "addr16/addr32". */
11422 all_prefixes
[last_addr_prefix
] = 0;
11423 names
= (address_mode
!= mode_32bit
11424 ? names32
: names16
);
11425 used_prefixes
|= PREFIX_ADDR
;
11435 names
= names_mask
;
11440 oappend (INTERNAL_DISASSEMBLER_ERROR
);
11443 oappend (names
[reg
]);
11447 OP_E_memory (int bytemode
, int sizeflag
)
11450 int add
= (rex
& REX_B
) ? 8 : 0;
11468 if (address_mode
!= mode_64bit
)
11476 case vex_vsib_d_w_dq_mode
:
11477 case vex_vsib_q_w_dq_mode
:
11478 case evex_x_gscat_mode
:
11479 shift
= vex
.w
? 3 : 2;
11482 case evex_half_bcst_xmmqh_mode
:
11483 case evex_half_bcst_xmmqdh_mode
:
11486 shift
= vex
.w
? 2 : 1;
11489 /* Fall through. */
11491 case evex_half_bcst_xmmq_mode
:
11494 shift
= vex
.w
? 3 : 2;
11497 /* Fall through. */
11502 case evex_x_nobcst_mode
:
11504 switch (vex
.length
)
11518 /* Make necessary corrections to shift for modes that need it. */
11519 if (bytemode
== xmmq_mode
11520 || bytemode
== evex_half_bcst_xmmqh_mode
11521 || bytemode
== evex_half_bcst_xmmq_mode
11522 || (bytemode
== ymmq_mode
&& vex
.length
== 128))
11524 else if (bytemode
== xmmqd_mode
11525 || bytemode
== evex_half_bcst_xmmqdh_mode
)
11527 else if (bytemode
== xmmdw_mode
)
11541 shift
= vex
.w
? 1 : 0;
11552 intel_operand_size (bytemode
, sizeflag
);
11555 if ((sizeflag
& AFLAG
) || address_mode
== mode_64bit
)
11557 /* 32/64 bit address mode */
11567 int addr32flag
= !((sizeflag
& AFLAG
)
11568 || bytemode
== v_bnd_mode
11569 || bytemode
== v_bndmk_mode
11570 || bytemode
== bnd_mode
11571 || bytemode
== bnd_swap_mode
);
11572 bool check_gather
= false;
11573 const char **indexes64
= names64
;
11574 const char **indexes32
= names32
;
11584 vindex
= sib
.index
;
11590 case vex_vsib_d_w_dq_mode
:
11591 case vex_vsib_q_w_dq_mode
:
11598 check_gather
= obufp
== op_out
[1];
11602 switch (vex
.length
)
11605 indexes64
= indexes32
= names_xmm
;
11609 || bytemode
== vex_vsib_q_w_dq_mode
)
11610 indexes64
= indexes32
= names_ymm
;
11612 indexes64
= indexes32
= names_xmm
;
11616 || bytemode
== vex_vsib_q_w_dq_mode
)
11617 indexes64
= indexes32
= names_zmm
;
11619 indexes64
= indexes32
= names_ymm
;
11626 haveindex
= vindex
!= 4;
11635 /* Check for mandatory SIB. */
11636 if (bytemode
== vex_vsib_d_w_dq_mode
11637 || bytemode
== vex_vsib_q_w_dq_mode
11638 || bytemode
== vex_sibmem_mode
)
11644 rbase
= base
+ add
;
11652 if (address_mode
== mode_64bit
&& !havesib
)
11655 if (riprel
&& bytemode
== v_bndmk_mode
)
11663 FETCH_DATA (the_info
, codep
+ 1);
11665 if ((disp
& 0x80) != 0)
11667 if (vex
.evex
&& shift
> 0)
11680 && address_mode
!= mode_16bit
)
11682 if (address_mode
== mode_64bit
)
11686 /* Without base nor index registers, zero-extend the
11687 lower 32-bit displacement to 64 bits. */
11688 disp
= (unsigned int) disp
;
11695 /* In 32-bit mode, we need index register to tell [offset]
11696 from [eiz*1 + offset]. */
11701 havedisp
= (havebase
11703 || (havesib
&& (haveindex
|| scale
!= 0)));
11706 if (modrm
.mod
!= 0 || base
== 5)
11708 if (havedisp
|| riprel
)
11709 print_displacement (scratchbuf
, disp
);
11711 print_operand_value (scratchbuf
, 1, disp
);
11712 oappend (scratchbuf
);
11716 oappend (!addr32flag
? "(%rip)" : "(%eip)");
11720 if ((havebase
|| haveindex
|| needindex
|| needaddr32
|| riprel
)
11721 && (address_mode
!= mode_64bit
11722 || ((bytemode
!= v_bnd_mode
)
11723 && (bytemode
!= v_bndmk_mode
)
11724 && (bytemode
!= bnd_mode
)
11725 && (bytemode
!= bnd_swap_mode
))))
11726 used_prefixes
|= PREFIX_ADDR
;
11728 if (havedisp
|| (intel_syntax
&& riprel
))
11730 *obufp
++ = open_char
;
11731 if (intel_syntax
&& riprel
)
11734 oappend (!addr32flag
? "rip" : "eip");
11738 oappend (address_mode
== mode_64bit
&& !addr32flag
11739 ? names64
[rbase
] : names32
[rbase
]);
11742 /* ESP/RSP won't allow index. If base isn't ESP/RSP,
11743 print index to tell base + index from base. */
11747 || (havebase
&& base
!= ESP_REG_NUM
))
11749 if (!intel_syntax
|| havebase
)
11751 *obufp
++ = separator_char
;
11756 if (address_mode
== mode_64bit
|| vindex
< 16)
11757 oappend (address_mode
== mode_64bit
&& !addr32flag
11758 ? indexes64
[vindex
] : indexes32
[vindex
]);
11763 oappend (address_mode
== mode_64bit
&& !addr32flag
11764 ? index64
: index32
);
11766 *obufp
++ = scale_char
;
11768 sprintf (scratchbuf
, "%d", 1 << scale
);
11769 oappend (scratchbuf
);
11773 && (disp
|| modrm
.mod
!= 0 || base
== 5))
11775 if (!havedisp
|| (bfd_signed_vma
) disp
>= 0)
11780 else if (modrm
.mod
!= 1 && disp
!= -disp
)
11788 print_displacement (scratchbuf
, disp
);
11790 print_operand_value (scratchbuf
, 1, disp
);
11791 oappend (scratchbuf
);
11794 *obufp
++ = close_char
;
11799 /* Both XMM/YMM/ZMM registers must be distinct. */
11800 int modrm_reg
= modrm
.reg
;
11806 if (vindex
== modrm_reg
)
11807 oappend ("/(bad)");
11810 else if (intel_syntax
)
11812 if (modrm
.mod
!= 0 || base
== 5)
11814 if (!active_seg_prefix
)
11816 oappend (names_seg
[ds_reg
- es_reg
]);
11819 print_operand_value (scratchbuf
, 1, disp
);
11820 oappend (scratchbuf
);
11824 else if (bytemode
== v_bnd_mode
11825 || bytemode
== v_bndmk_mode
11826 || bytemode
== bnd_mode
11827 || bytemode
== bnd_swap_mode
11828 || bytemode
== vex_vsib_d_w_dq_mode
11829 || bytemode
== vex_vsib_q_w_dq_mode
)
11836 /* 16 bit address mode */
11837 used_prefixes
|= prefixes
& PREFIX_ADDR
;
11844 if ((disp
& 0x8000) != 0)
11849 FETCH_DATA (the_info
, codep
+ 1);
11851 if ((disp
& 0x80) != 0)
11853 if (vex
.evex
&& shift
> 0)
11858 if ((disp
& 0x8000) != 0)
11864 if (modrm
.mod
!= 0 || modrm
.rm
== 6)
11866 print_displacement (scratchbuf
, disp
);
11867 oappend (scratchbuf
);
11870 if (modrm
.mod
!= 0 || modrm
.rm
!= 6)
11872 *obufp
++ = open_char
;
11874 oappend (index16
[modrm
.rm
]);
11876 && (disp
|| modrm
.mod
!= 0 || modrm
.rm
== 6))
11878 if ((bfd_signed_vma
) disp
>= 0)
11883 else if (modrm
.mod
!= 1)
11890 print_displacement (scratchbuf
, disp
);
11891 oappend (scratchbuf
);
11894 *obufp
++ = close_char
;
11897 else if (intel_syntax
)
11899 if (!active_seg_prefix
)
11901 oappend (names_seg
[ds_reg
- es_reg
]);
11904 print_operand_value (scratchbuf
, 1, disp
& 0xffff);
11905 oappend (scratchbuf
);
11910 evex_used
|= EVEX_b_used
;
11911 if (bytemode
== xh_mode
)
11919 switch (vex
.length
)
11922 oappend ("{1to8}");
11925 oappend ("{1to16}");
11928 oappend ("{1to32}");
11936 || bytemode
== evex_half_bcst_xmmqdh_mode
11937 || bytemode
== evex_half_bcst_xmmq_mode
)
11939 switch (vex
.length
)
11942 oappend ("{1to2}");
11945 oappend ("{1to4}");
11948 oappend ("{1to8}");
11954 else if (bytemode
== x_mode
11955 || bytemode
== evex_half_bcst_xmmqh_mode
)
11957 switch (vex
.length
)
11960 oappend ("{1to4}");
11963 oappend ("{1to8}");
11966 oappend ("{1to16}");
11973 /* If operand doesn't allow broadcast, vex.b should be 0. */
11979 OP_E (int bytemode
, int sizeflag
)
11981 /* Skip mod/rm byte. */
11985 if (modrm
.mod
== 3)
11987 if ((sizeflag
& SUFFIX_ALWAYS
)
11988 && (bytemode
== b_swap_mode
11989 || bytemode
== bnd_swap_mode
11990 || bytemode
== v_swap_mode
))
11993 print_register (modrm
.rm
, REX_B
, bytemode
, sizeflag
);
11996 OP_E_memory (bytemode
, sizeflag
);
12000 OP_G (int bytemode
, int sizeflag
)
12002 if (vex
.evex
&& !vex
.r
&& address_mode
== mode_64bit
)
12008 print_register (modrm
.reg
, REX_R
, bytemode
, sizeflag
);
12019 FETCH_DATA (the_info
, codep
+ 8);
12020 a
= *codep
++ & 0xff;
12021 a
|= (*codep
++ & 0xff) << 8;
12022 a
|= (*codep
++ & 0xff) << 16;
12023 a
|= (*codep
++ & 0xffu
) << 24;
12024 b
= *codep
++ & 0xff;
12025 b
|= (*codep
++ & 0xff) << 8;
12026 b
|= (*codep
++ & 0xff) << 16;
12027 b
|= (*codep
++ & 0xffu
) << 24;
12028 x
= a
+ ((bfd_vma
) b
<< 32);
12036 static bfd_signed_vma
12041 FETCH_DATA (the_info
, codep
+ 4);
12042 x
= *codep
++ & (bfd_vma
) 0xff;
12043 x
|= (*codep
++ & (bfd_vma
) 0xff) << 8;
12044 x
|= (*codep
++ & (bfd_vma
) 0xff) << 16;
12045 x
|= (*codep
++ & (bfd_vma
) 0xff) << 24;
12049 static bfd_signed_vma
12054 FETCH_DATA (the_info
, codep
+ 4);
12055 x
= *codep
++ & (bfd_vma
) 0xff;
12056 x
|= (*codep
++ & (bfd_vma
) 0xff) << 8;
12057 x
|= (*codep
++ & (bfd_vma
) 0xff) << 16;
12058 x
|= (*codep
++ & (bfd_vma
) 0xff) << 24;
12060 x
= (x
^ ((bfd_vma
) 1 << 31)) - ((bfd_vma
) 1 << 31);
12070 FETCH_DATA (the_info
, codep
+ 2);
12071 x
= *codep
++ & 0xff;
12072 x
|= (*codep
++ & 0xff) << 8;
12077 set_op (bfd_vma op
, int riprel
)
12079 op_index
[op_ad
] = op_ad
;
12080 if (address_mode
== mode_64bit
)
12082 op_address
[op_ad
] = op
;
12083 op_riprel
[op_ad
] = riprel
;
12087 /* Mask to get a 32-bit address. */
12088 op_address
[op_ad
] = op
& 0xffffffff;
12089 op_riprel
[op_ad
] = riprel
& 0xffffffff;
12094 OP_REG (int code
, int sizeflag
)
12101 case es_reg
: case ss_reg
: case cs_reg
:
12102 case ds_reg
: case fs_reg
: case gs_reg
:
12103 oappend (names_seg
[code
- es_reg
]);
12115 case ax_reg
: case cx_reg
: case dx_reg
: case bx_reg
:
12116 case sp_reg
: case bp_reg
: case si_reg
: case di_reg
:
12117 s
= names16
[code
- ax_reg
+ add
];
12119 case ah_reg
: case ch_reg
: case dh_reg
: case bh_reg
:
12121 /* Fall through. */
12122 case al_reg
: case cl_reg
: case dl_reg
: case bl_reg
:
12124 s
= names8rex
[code
- al_reg
+ add
];
12126 s
= names8
[code
- al_reg
];
12128 case rAX_reg
: case rCX_reg
: case rDX_reg
: case rBX_reg
:
12129 case rSP_reg
: case rBP_reg
: case rSI_reg
: case rDI_reg
:
12130 if (address_mode
== mode_64bit
12131 && ((sizeflag
& DFLAG
) || (rex
& REX_W
)))
12133 s
= names64
[code
- rAX_reg
+ add
];
12136 code
+= eAX_reg
- rAX_reg
;
12137 /* Fall through. */
12138 case eAX_reg
: case eCX_reg
: case eDX_reg
: case eBX_reg
:
12139 case eSP_reg
: case eBP_reg
: case eSI_reg
: case eDI_reg
:
12142 s
= names64
[code
- eAX_reg
+ add
];
12145 if (sizeflag
& DFLAG
)
12146 s
= names32
[code
- eAX_reg
+ add
];
12148 s
= names16
[code
- eAX_reg
+ add
];
12149 used_prefixes
|= (prefixes
& PREFIX_DATA
);
12153 s
= INTERNAL_DISASSEMBLER_ERROR
;
12160 OP_IMREG (int code
, int sizeflag
)
12172 case al_reg
: case cl_reg
:
12173 s
= names8
[code
- al_reg
];
12182 /* Fall through. */
12183 case z_mode_ax_reg
:
12184 if ((rex
& REX_W
) || (sizeflag
& DFLAG
))
12188 if (!(rex
& REX_W
))
12189 used_prefixes
|= (prefixes
& PREFIX_DATA
);
12192 s
= INTERNAL_DISASSEMBLER_ERROR
;
12199 OP_I (int bytemode
, int sizeflag
)
12202 bfd_signed_vma mask
= -1;
12207 FETCH_DATA (the_info
, codep
+ 1);
12217 if (sizeflag
& DFLAG
)
12227 used_prefixes
|= (prefixes
& PREFIX_DATA
);
12243 oappend (INTERNAL_DISASSEMBLER_ERROR
);
12248 scratchbuf
[0] = '$';
12249 print_operand_value (scratchbuf
+ 1, 1, op
);
12250 oappend_maybe_intel (scratchbuf
);
12251 scratchbuf
[0] = '\0';
12255 OP_I64 (int bytemode
, int sizeflag
)
12257 if (bytemode
!= v_mode
|| address_mode
!= mode_64bit
|| !(rex
& REX_W
))
12259 OP_I (bytemode
, sizeflag
);
12265 scratchbuf
[0] = '$';
12266 print_operand_value (scratchbuf
+ 1, 1, get64 ());
12267 oappend_maybe_intel (scratchbuf
);
12268 scratchbuf
[0] = '\0';
12272 OP_sI (int bytemode
, int sizeflag
)
12280 FETCH_DATA (the_info
, codep
+ 1);
12282 if ((op
& 0x80) != 0)
12284 if (bytemode
== b_T_mode
)
12286 if (address_mode
!= mode_64bit
12287 || !((sizeflag
& DFLAG
) || (rex
& REX_W
)))
12289 /* The operand-size prefix is overridden by a REX prefix. */
12290 if ((sizeflag
& DFLAG
) || (rex
& REX_W
))
12298 if (!(rex
& REX_W
))
12300 if (sizeflag
& DFLAG
)
12308 /* The operand-size prefix is overridden by a REX prefix. */
12309 if ((sizeflag
& DFLAG
) || (rex
& REX_W
))
12315 oappend (INTERNAL_DISASSEMBLER_ERROR
);
12319 scratchbuf
[0] = '$';
12320 print_operand_value (scratchbuf
+ 1, 1, op
);
12321 oappend_maybe_intel (scratchbuf
);
12325 OP_J (int bytemode
, int sizeflag
)
12329 bfd_vma segment
= 0;
12334 FETCH_DATA (the_info
, codep
+ 1);
12336 if ((disp
& 0x80) != 0)
12341 if ((sizeflag
& DFLAG
)
12342 || (address_mode
== mode_64bit
12343 && ((isa64
== intel64
&& bytemode
!= dqw_mode
)
12344 || (rex
& REX_W
))))
12349 if ((disp
& 0x8000) != 0)
12351 /* In 16bit mode, address is wrapped around at 64k within
12352 the same segment. Otherwise, a data16 prefix on a jump
12353 instruction means that the pc is masked to 16 bits after
12354 the displacement is added! */
12356 if ((prefixes
& PREFIX_DATA
) == 0)
12357 segment
= ((start_pc
+ (codep
- start_codep
))
12358 & ~((bfd_vma
) 0xffff));
12360 if (address_mode
!= mode_64bit
12361 || (isa64
!= intel64
&& !(rex
& REX_W
)))
12362 used_prefixes
|= (prefixes
& PREFIX_DATA
);
12365 oappend (INTERNAL_DISASSEMBLER_ERROR
);
12368 disp
= ((start_pc
+ (codep
- start_codep
) + disp
) & mask
) | segment
;
12370 print_operand_value (scratchbuf
, 1, disp
);
12371 oappend (scratchbuf
);
12375 OP_SEG (int bytemode
, int sizeflag
)
12377 if (bytemode
== w_mode
)
12378 oappend (names_seg
[modrm
.reg
]);
12380 OP_E (modrm
.mod
== 3 ? bytemode
: w_mode
, sizeflag
);
12384 OP_DIR (int dummy ATTRIBUTE_UNUSED
, int sizeflag
)
12388 if (sizeflag
& DFLAG
)
12398 used_prefixes
|= (prefixes
& PREFIX_DATA
);
12400 sprintf (scratchbuf
, "0x%x:0x%x", seg
, offset
);
12402 sprintf (scratchbuf
, "$0x%x,$0x%x", seg
, offset
);
12403 oappend (scratchbuf
);
12407 OP_OFF (int bytemode
, int sizeflag
)
12411 if (intel_syntax
&& (sizeflag
& SUFFIX_ALWAYS
))
12412 intel_operand_size (bytemode
, sizeflag
);
12415 if ((sizeflag
& AFLAG
) || address_mode
== mode_64bit
)
12422 if (!active_seg_prefix
)
12424 oappend (names_seg
[ds_reg
- es_reg
]);
12428 print_operand_value (scratchbuf
, 1, off
);
12429 oappend (scratchbuf
);
12433 OP_OFF64 (int bytemode
, int sizeflag
)
12437 if (address_mode
!= mode_64bit
12438 || (prefixes
& PREFIX_ADDR
))
12440 OP_OFF (bytemode
, sizeflag
);
12444 if (intel_syntax
&& (sizeflag
& SUFFIX_ALWAYS
))
12445 intel_operand_size (bytemode
, sizeflag
);
12452 if (!active_seg_prefix
)
12454 oappend (names_seg
[ds_reg
- es_reg
]);
12458 print_operand_value (scratchbuf
, 1, off
);
12459 oappend (scratchbuf
);
12463 ptr_reg (int code
, int sizeflag
)
12467 *obufp
++ = open_char
;
12468 used_prefixes
|= (prefixes
& PREFIX_ADDR
);
12469 if (address_mode
== mode_64bit
)
12471 if (!(sizeflag
& AFLAG
))
12472 s
= names32
[code
- eAX_reg
];
12474 s
= names64
[code
- eAX_reg
];
12476 else if (sizeflag
& AFLAG
)
12477 s
= names32
[code
- eAX_reg
];
12479 s
= names16
[code
- eAX_reg
];
12481 *obufp
++ = close_char
;
12486 OP_ESreg (int code
, int sizeflag
)
12492 case 0x6d: /* insw/insl */
12493 intel_operand_size (z_mode
, sizeflag
);
12495 case 0xa5: /* movsw/movsl/movsq */
12496 case 0xa7: /* cmpsw/cmpsl/cmpsq */
12497 case 0xab: /* stosw/stosl */
12498 case 0xaf: /* scasw/scasl */
12499 intel_operand_size (v_mode
, sizeflag
);
12502 intel_operand_size (b_mode
, sizeflag
);
12505 oappend_maybe_intel ("%es:");
12506 ptr_reg (code
, sizeflag
);
12510 OP_DSreg (int code
, int sizeflag
)
12516 case 0x6f: /* outsw/outsl */
12517 intel_operand_size (z_mode
, sizeflag
);
12519 case 0xa5: /* movsw/movsl/movsq */
12520 case 0xa7: /* cmpsw/cmpsl/cmpsq */
12521 case 0xad: /* lodsw/lodsl/lodsq */
12522 intel_operand_size (v_mode
, sizeflag
);
12525 intel_operand_size (b_mode
, sizeflag
);
12528 /* Set active_seg_prefix to PREFIX_DS if it is unset so that the
12529 default segment register DS is printed. */
12530 if (!active_seg_prefix
)
12531 active_seg_prefix
= PREFIX_DS
;
12533 ptr_reg (code
, sizeflag
);
12537 OP_C (int dummy ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
12545 else if (address_mode
!= mode_64bit
&& (prefixes
& PREFIX_LOCK
))
12547 all_prefixes
[last_lock_prefix
] = 0;
12548 used_prefixes
|= PREFIX_LOCK
;
12553 sprintf (scratchbuf
, "%%cr%d", modrm
.reg
+ add
);
12554 oappend_maybe_intel (scratchbuf
);
12558 OP_D (int dummy ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
12567 sprintf (scratchbuf
, "dr%d", modrm
.reg
+ add
);
12569 sprintf (scratchbuf
, "%%db%d", modrm
.reg
+ add
);
12570 oappend (scratchbuf
);
12574 OP_T (int dummy ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
12576 sprintf (scratchbuf
, "%%tr%d", modrm
.reg
);
12577 oappend_maybe_intel (scratchbuf
);
12581 OP_MMX (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
12583 int reg
= modrm
.reg
;
12584 const char **names
;
12586 used_prefixes
|= (prefixes
& PREFIX_DATA
);
12587 if (prefixes
& PREFIX_DATA
)
12596 oappend (names
[reg
]);
12600 print_vector_reg (unsigned int reg
, int bytemode
)
12602 const char **names
;
12604 if (bytemode
== xmmq_mode
12605 || bytemode
== evex_half_bcst_xmmqh_mode
12606 || bytemode
== evex_half_bcst_xmmq_mode
)
12608 switch (vex
.length
)
12621 else if (bytemode
== ymm_mode
)
12623 else if (bytemode
== tmm_mode
)
12633 && bytemode
!= xmm_mode
12634 && bytemode
!= scalar_mode
12635 && bytemode
!= xmmdw_mode
12636 && bytemode
!= xmmqd_mode
12637 && bytemode
!= evex_half_bcst_xmmqdh_mode
12638 && bytemode
!= w_swap_mode
12639 && bytemode
!= b_mode
12640 && bytemode
!= w_mode
12641 && bytemode
!= d_mode
12642 && bytemode
!= q_mode
)
12644 switch (vex
.length
)
12651 || bytemode
!= vex_vsib_q_w_dq_mode
)
12658 || bytemode
!= vex_vsib_q_w_dq_mode
)
12669 oappend (names
[reg
]);
12673 OP_XMM (int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
12675 unsigned int reg
= modrm
.reg
;
12686 if (bytemode
== tmm_mode
)
12689 print_vector_reg (reg
, bytemode
);
12693 OP_EM (int bytemode
, int sizeflag
)
12696 const char **names
;
12698 if (modrm
.mod
!= 3)
12701 && (bytemode
== v_mode
|| bytemode
== v_swap_mode
))
12703 bytemode
= (prefixes
& PREFIX_DATA
) ? x_mode
: q_mode
;
12704 used_prefixes
|= (prefixes
& PREFIX_DATA
);
12706 OP_E (bytemode
, sizeflag
);
12710 if ((sizeflag
& SUFFIX_ALWAYS
) && bytemode
== v_swap_mode
)
12713 /* Skip mod/rm byte. */
12716 used_prefixes
|= (prefixes
& PREFIX_DATA
);
12718 if (prefixes
& PREFIX_DATA
)
12727 oappend (names
[reg
]);
12730 /* cvt* are the only instructions in sse2 which have
12731 both SSE and MMX operands and also have 0x66 prefix
12732 in their opcode. 0x66 was originally used to differentiate
12733 between SSE and MMX instruction(operands). So we have to handle the
12734 cvt* separately using OP_EMC and OP_MXC */
12736 OP_EMC (int bytemode
, int sizeflag
)
12738 if (modrm
.mod
!= 3)
12740 if (intel_syntax
&& bytemode
== v_mode
)
12742 bytemode
= (prefixes
& PREFIX_DATA
) ? x_mode
: q_mode
;
12743 used_prefixes
|= (prefixes
& PREFIX_DATA
);
12745 OP_E (bytemode
, sizeflag
);
12749 /* Skip mod/rm byte. */
12752 used_prefixes
|= (prefixes
& PREFIX_DATA
);
12753 oappend (names_mm
[modrm
.rm
]);
12757 OP_MXC (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
12759 used_prefixes
|= (prefixes
& PREFIX_DATA
);
12760 oappend (names_mm
[modrm
.reg
]);
12764 OP_EX (int bytemode
, int sizeflag
)
12768 /* Skip mod/rm byte. */
12772 if (bytemode
== dq_mode
)
12773 bytemode
= vex
.w
? q_mode
: d_mode
;
12775 if (modrm
.mod
!= 3)
12777 OP_E_memory (bytemode
, sizeflag
);
12792 if ((sizeflag
& SUFFIX_ALWAYS
)
12793 && (bytemode
== x_swap_mode
12794 || bytemode
== w_swap_mode
12795 || bytemode
== d_swap_mode
12796 || bytemode
== q_swap_mode
))
12799 if (bytemode
== tmm_mode
)
12802 print_vector_reg (reg
, bytemode
);
12806 OP_MS (int bytemode
, int sizeflag
)
12808 if (modrm
.mod
== 3)
12809 OP_EM (bytemode
, sizeflag
);
12815 OP_XS (int bytemode
, int sizeflag
)
12817 if (modrm
.mod
== 3)
12818 OP_EX (bytemode
, sizeflag
);
12824 OP_M (int bytemode
, int sizeflag
)
12826 if (modrm
.mod
== 3)
12827 /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
12830 OP_E (bytemode
, sizeflag
);
12834 OP_0f07 (int bytemode
, int sizeflag
)
12836 if (modrm
.mod
!= 3 || modrm
.rm
!= 0)
12839 OP_E (bytemode
, sizeflag
);
12842 /* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
12843 32bit mode and "xchg %rax,%rax" in 64bit mode. */
12846 NOP_Fixup1 (int bytemode
, int sizeflag
)
12848 if ((prefixes
& PREFIX_DATA
) != 0
12851 && address_mode
== mode_64bit
))
12852 OP_REG (bytemode
, sizeflag
);
12854 strcpy (obuf
, "nop");
12858 NOP_Fixup2 (int bytemode
, int sizeflag
)
12860 if ((prefixes
& PREFIX_DATA
) != 0
12863 && address_mode
== mode_64bit
))
12864 OP_IMREG (bytemode
, sizeflag
);
12867 static const char *const Suffix3DNow
[] = {
12868 /* 00 */ NULL
, NULL
, NULL
, NULL
,
12869 /* 04 */ NULL
, NULL
, NULL
, NULL
,
12870 /* 08 */ NULL
, NULL
, NULL
, NULL
,
12871 /* 0C */ "pi2fw", "pi2fd", NULL
, NULL
,
12872 /* 10 */ NULL
, NULL
, NULL
, NULL
,
12873 /* 14 */ NULL
, NULL
, NULL
, NULL
,
12874 /* 18 */ NULL
, NULL
, NULL
, NULL
,
12875 /* 1C */ "pf2iw", "pf2id", NULL
, NULL
,
12876 /* 20 */ NULL
, NULL
, NULL
, NULL
,
12877 /* 24 */ NULL
, NULL
, NULL
, NULL
,
12878 /* 28 */ NULL
, NULL
, NULL
, NULL
,
12879 /* 2C */ NULL
, NULL
, NULL
, NULL
,
12880 /* 30 */ NULL
, NULL
, NULL
, NULL
,
12881 /* 34 */ NULL
, NULL
, NULL
, NULL
,
12882 /* 38 */ NULL
, NULL
, NULL
, NULL
,
12883 /* 3C */ NULL
, NULL
, NULL
, NULL
,
12884 /* 40 */ NULL
, NULL
, NULL
, NULL
,
12885 /* 44 */ NULL
, NULL
, NULL
, NULL
,
12886 /* 48 */ NULL
, NULL
, NULL
, NULL
,
12887 /* 4C */ NULL
, NULL
, NULL
, NULL
,
12888 /* 50 */ NULL
, NULL
, NULL
, NULL
,
12889 /* 54 */ NULL
, NULL
, NULL
, NULL
,
12890 /* 58 */ NULL
, NULL
, NULL
, NULL
,
12891 /* 5C */ NULL
, NULL
, NULL
, NULL
,
12892 /* 60 */ NULL
, NULL
, NULL
, NULL
,
12893 /* 64 */ NULL
, NULL
, NULL
, NULL
,
12894 /* 68 */ NULL
, NULL
, NULL
, NULL
,
12895 /* 6C */ NULL
, NULL
, NULL
, NULL
,
12896 /* 70 */ NULL
, NULL
, NULL
, NULL
,
12897 /* 74 */ NULL
, NULL
, NULL
, NULL
,
12898 /* 78 */ NULL
, NULL
, NULL
, NULL
,
12899 /* 7C */ NULL
, NULL
, NULL
, NULL
,
12900 /* 80 */ NULL
, NULL
, NULL
, NULL
,
12901 /* 84 */ NULL
, NULL
, NULL
, NULL
,
12902 /* 88 */ NULL
, NULL
, "pfnacc", NULL
,
12903 /* 8C */ NULL
, NULL
, "pfpnacc", NULL
,
12904 /* 90 */ "pfcmpge", NULL
, NULL
, NULL
,
12905 /* 94 */ "pfmin", NULL
, "pfrcp", "pfrsqrt",
12906 /* 98 */ NULL
, NULL
, "pfsub", NULL
,
12907 /* 9C */ NULL
, NULL
, "pfadd", NULL
,
12908 /* A0 */ "pfcmpgt", NULL
, NULL
, NULL
,
12909 /* A4 */ "pfmax", NULL
, "pfrcpit1", "pfrsqit1",
12910 /* A8 */ NULL
, NULL
, "pfsubr", NULL
,
12911 /* AC */ NULL
, NULL
, "pfacc", NULL
,
12912 /* B0 */ "pfcmpeq", NULL
, NULL
, NULL
,
12913 /* B4 */ "pfmul", NULL
, "pfrcpit2", "pmulhrw",
12914 /* B8 */ NULL
, NULL
, NULL
, "pswapd",
12915 /* BC */ NULL
, NULL
, NULL
, "pavgusb",
12916 /* C0 */ NULL
, NULL
, NULL
, NULL
,
12917 /* C4 */ NULL
, NULL
, NULL
, NULL
,
12918 /* C8 */ NULL
, NULL
, NULL
, NULL
,
12919 /* CC */ NULL
, NULL
, NULL
, NULL
,
12920 /* D0 */ NULL
, NULL
, NULL
, NULL
,
12921 /* D4 */ NULL
, NULL
, NULL
, NULL
,
12922 /* D8 */ NULL
, NULL
, NULL
, NULL
,
12923 /* DC */ NULL
, NULL
, NULL
, NULL
,
12924 /* E0 */ NULL
, NULL
, NULL
, NULL
,
12925 /* E4 */ NULL
, NULL
, NULL
, NULL
,
12926 /* E8 */ NULL
, NULL
, NULL
, NULL
,
12927 /* EC */ NULL
, NULL
, NULL
, NULL
,
12928 /* F0 */ NULL
, NULL
, NULL
, NULL
,
12929 /* F4 */ NULL
, NULL
, NULL
, NULL
,
12930 /* F8 */ NULL
, NULL
, NULL
, NULL
,
12931 /* FC */ NULL
, NULL
, NULL
, NULL
,
12935 OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
12937 const char *mnemonic
;
12939 FETCH_DATA (the_info
, codep
+ 1);
12940 /* AMD 3DNow! instructions are specified by an opcode suffix in the
12941 place where an 8-bit immediate would normally go. ie. the last
12942 byte of the instruction. */
12943 obufp
= mnemonicendp
;
12944 mnemonic
= Suffix3DNow
[*codep
++ & 0xff];
12946 oappend (mnemonic
);
12949 /* Since a variable sized modrm/sib chunk is between the start
12950 of the opcode (0x0f0f) and the opcode suffix, we need to do
12951 all the modrm processing first, and don't know until now that
12952 we have a bad opcode. This necessitates some cleaning up. */
12953 op_out
[0][0] = '\0';
12954 op_out
[1][0] = '\0';
12957 mnemonicendp
= obufp
;
12960 static const struct op simd_cmp_op
[] =
12962 { STRING_COMMA_LEN ("eq") },
12963 { STRING_COMMA_LEN ("lt") },
12964 { STRING_COMMA_LEN ("le") },
12965 { STRING_COMMA_LEN ("unord") },
12966 { STRING_COMMA_LEN ("neq") },
12967 { STRING_COMMA_LEN ("nlt") },
12968 { STRING_COMMA_LEN ("nle") },
12969 { STRING_COMMA_LEN ("ord") }
12972 static const struct op vex_cmp_op
[] =
12974 { STRING_COMMA_LEN ("eq_uq") },
12975 { STRING_COMMA_LEN ("nge") },
12976 { STRING_COMMA_LEN ("ngt") },
12977 { STRING_COMMA_LEN ("false") },
12978 { STRING_COMMA_LEN ("neq_oq") },
12979 { STRING_COMMA_LEN ("ge") },
12980 { STRING_COMMA_LEN ("gt") },
12981 { STRING_COMMA_LEN ("true") },
12982 { STRING_COMMA_LEN ("eq_os") },
12983 { STRING_COMMA_LEN ("lt_oq") },
12984 { STRING_COMMA_LEN ("le_oq") },
12985 { STRING_COMMA_LEN ("unord_s") },
12986 { STRING_COMMA_LEN ("neq_us") },
12987 { STRING_COMMA_LEN ("nlt_uq") },
12988 { STRING_COMMA_LEN ("nle_uq") },
12989 { STRING_COMMA_LEN ("ord_s") },
12990 { STRING_COMMA_LEN ("eq_us") },
12991 { STRING_COMMA_LEN ("nge_uq") },
12992 { STRING_COMMA_LEN ("ngt_uq") },
12993 { STRING_COMMA_LEN ("false_os") },
12994 { STRING_COMMA_LEN ("neq_os") },
12995 { STRING_COMMA_LEN ("ge_oq") },
12996 { STRING_COMMA_LEN ("gt_oq") },
12997 { STRING_COMMA_LEN ("true_us") },
13001 CMP_Fixup (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
13003 unsigned int cmp_type
;
13005 FETCH_DATA (the_info
, codep
+ 1);
13006 cmp_type
= *codep
++ & 0xff;
13007 if (cmp_type
< ARRAY_SIZE (simd_cmp_op
))
13010 char *p
= mnemonicendp
- 2;
13014 sprintf (p
, "%s%s", simd_cmp_op
[cmp_type
].name
, suffix
);
13015 mnemonicendp
+= simd_cmp_op
[cmp_type
].len
;
13018 && cmp_type
< ARRAY_SIZE (simd_cmp_op
) + ARRAY_SIZE (vex_cmp_op
))
13021 char *p
= mnemonicendp
- 2;
13025 cmp_type
-= ARRAY_SIZE (simd_cmp_op
);
13026 sprintf (p
, "%s%s", vex_cmp_op
[cmp_type
].name
, suffix
);
13027 mnemonicendp
+= vex_cmp_op
[cmp_type
].len
;
13031 /* We have a reserved extension byte. Output it directly. */
13032 scratchbuf
[0] = '$';
13033 print_operand_value (scratchbuf
+ 1, 1, cmp_type
);
13034 oappend_maybe_intel (scratchbuf
);
13035 scratchbuf
[0] = '\0';
13040 OP_Mwait (int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
13042 /* mwait %eax,%ecx / mwaitx %eax,%ecx,%ebx */
13045 strcpy (op_out
[0], names32
[0]);
13046 strcpy (op_out
[1], names32
[1]);
13047 if (bytemode
== eBX_reg
)
13048 strcpy (op_out
[2], names32
[3]);
13049 two_source_ops
= 1;
13051 /* Skip mod/rm byte. */
13057 OP_Monitor (int bytemode ATTRIBUTE_UNUSED
,
13058 int sizeflag ATTRIBUTE_UNUSED
)
13060 /* monitor %{e,r,}ax,%ecx,%edx" */
13063 const char **names
= (address_mode
== mode_64bit
13064 ? names64
: names32
);
13066 if (prefixes
& PREFIX_ADDR
)
13068 /* Remove "addr16/addr32". */
13069 all_prefixes
[last_addr_prefix
] = 0;
13070 names
= (address_mode
!= mode_32bit
13071 ? names32
: names16
);
13072 used_prefixes
|= PREFIX_ADDR
;
13074 else if (address_mode
== mode_16bit
)
13076 strcpy (op_out
[0], names
[0]);
13077 strcpy (op_out
[1], names32
[1]);
13078 strcpy (op_out
[2], names32
[2]);
13079 two_source_ops
= 1;
13081 /* Skip mod/rm byte. */
13089 /* Throw away prefixes and 1st. opcode byte. */
13090 codep
= insn_codep
+ 1;
13095 REP_Fixup (int bytemode
, int sizeflag
)
13097 /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
13099 if (prefixes
& PREFIX_REPZ
)
13100 all_prefixes
[last_repz_prefix
] = REP_PREFIX
;
13107 OP_IMREG (bytemode
, sizeflag
);
13110 OP_ESreg (bytemode
, sizeflag
);
13113 OP_DSreg (bytemode
, sizeflag
);
13122 SEP_Fixup (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
13124 if ( isa64
!= amd64
)
13129 mnemonicendp
= obufp
;
13133 /* For BND-prefixed instructions 0xF2 prefix should be displayed as
13137 BND_Fixup (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
13139 if (prefixes
& PREFIX_REPNZ
)
13140 all_prefixes
[last_repnz_prefix
] = BND_PREFIX
;
13143 /* For NOTRACK-prefixed instructions, 0x3E prefix should be displayed as
13147 NOTRACK_Fixup (int bytemode ATTRIBUTE_UNUSED
,
13148 int sizeflag ATTRIBUTE_UNUSED
)
13151 /* Since active_seg_prefix is not set in 64-bit mode, check whether
13152 we've seen a PREFIX_DS. */
13153 if ((prefixes
& PREFIX_DS
) != 0
13154 && (address_mode
!= mode_64bit
|| last_data_prefix
< 0))
13156 /* NOTRACK prefix is only valid on indirect branch instructions.
13157 NB: DATA prefix is unsupported for Intel64. */
13158 active_seg_prefix
= 0;
13159 all_prefixes
[last_seg_prefix
] = NOTRACK_PREFIX
;
13163 /* Similar to OP_E. But the 0xf2/0xf3 prefixes should be displayed as
13164 "xacquire"/"xrelease" for memory operand if there is a LOCK prefix.
13168 HLE_Fixup1 (int bytemode
, int sizeflag
)
13171 && (prefixes
& PREFIX_LOCK
) != 0)
13173 if (prefixes
& PREFIX_REPZ
)
13174 all_prefixes
[last_repz_prefix
] = XRELEASE_PREFIX
;
13175 if (prefixes
& PREFIX_REPNZ
)
13176 all_prefixes
[last_repnz_prefix
] = XACQUIRE_PREFIX
;
13179 OP_E (bytemode
, sizeflag
);
13182 /* Similar to OP_E. But the 0xf2/0xf3 prefixes should be displayed as
13183 "xacquire"/"xrelease" for memory operand. No check for LOCK prefix.
13187 HLE_Fixup2 (int bytemode
, int sizeflag
)
13189 if (modrm
.mod
!= 3)
13191 if (prefixes
& PREFIX_REPZ
)
13192 all_prefixes
[last_repz_prefix
] = XRELEASE_PREFIX
;
13193 if (prefixes
& PREFIX_REPNZ
)
13194 all_prefixes
[last_repnz_prefix
] = XACQUIRE_PREFIX
;
13197 OP_E (bytemode
, sizeflag
);
13200 /* Similar to OP_E. But the 0xf3 prefixes should be displayed as
13201 "xrelease" for memory operand. No check for LOCK prefix. */
13204 HLE_Fixup3 (int bytemode
, int sizeflag
)
13207 && last_repz_prefix
> last_repnz_prefix
13208 && (prefixes
& PREFIX_REPZ
) != 0)
13209 all_prefixes
[last_repz_prefix
] = XRELEASE_PREFIX
;
13211 OP_E (bytemode
, sizeflag
);
13215 CMPXCHG8B_Fixup (int bytemode
, int sizeflag
)
13220 /* Change cmpxchg8b to cmpxchg16b. */
13221 char *p
= mnemonicendp
- 2;
13222 mnemonicendp
= stpcpy (p
, "16b");
13225 else if ((prefixes
& PREFIX_LOCK
) != 0)
13227 if (prefixes
& PREFIX_REPZ
)
13228 all_prefixes
[last_repz_prefix
] = XRELEASE_PREFIX
;
13229 if (prefixes
& PREFIX_REPNZ
)
13230 all_prefixes
[last_repnz_prefix
] = XACQUIRE_PREFIX
;
13233 OP_M (bytemode
, sizeflag
);
13237 XMM_Fixup (int reg
, int sizeflag ATTRIBUTE_UNUSED
)
13239 const char **names
;
13243 switch (vex
.length
)
13257 oappend (names
[reg
]);
13261 FXSAVE_Fixup (int bytemode
, int sizeflag
)
13263 /* Add proper suffix to "fxsave" and "fxrstor". */
13267 char *p
= mnemonicendp
;
13273 OP_M (bytemode
, sizeflag
);
13276 /* Display the destination register operand for instructions with
13280 OP_VEX (int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
13282 int reg
, modrm_reg
, sib_index
= -1;
13283 const char **names
;
13288 reg
= vex
.register_specifier
;
13289 vex
.register_specifier
= 0;
13290 if (address_mode
!= mode_64bit
)
13292 if (vex
.evex
&& !vex
.v
)
13300 else if (vex
.evex
&& !vex
.v
)
13306 oappend (names_xmm
[reg
]);
13309 case vex_vsib_d_w_dq_mode
:
13310 case vex_vsib_q_w_dq_mode
:
13311 /* This must be the 3rd operand. */
13312 if (obufp
!= op_out
[2])
13314 if (vex
.length
== 128
13315 || (bytemode
!= vex_vsib_d_w_dq_mode
13317 oappend (names_xmm
[reg
]);
13319 oappend (names_ymm
[reg
]);
13321 /* All 3 XMM/YMM registers must be distinct. */
13322 modrm_reg
= modrm
.reg
;
13328 sib_index
= sib
.index
;
13333 if (reg
== modrm_reg
|| reg
== sib_index
)
13334 strcpy (obufp
, "/(bad)");
13335 if (modrm_reg
== sib_index
|| modrm_reg
== reg
)
13336 strcat (op_out
[0], "/(bad)");
13337 if (sib_index
== modrm_reg
|| sib_index
== reg
)
13338 strcat (op_out
[1], "/(bad)");
13343 /* All 3 TMM registers must be distinct. */
13348 /* This must be the 3rd operand. */
13349 if (obufp
!= op_out
[2])
13351 oappend (names_tmm
[reg
]);
13352 if (reg
== modrm
.reg
|| reg
== modrm
.rm
)
13353 strcpy (obufp
, "/(bad)");
13356 if (modrm
.reg
== modrm
.rm
|| modrm
.reg
== reg
|| modrm
.rm
== reg
)
13359 && (modrm
.reg
== modrm
.rm
|| modrm
.reg
== reg
))
13360 strcat (op_out
[0], "/(bad)");
13362 && (modrm
.rm
== modrm
.reg
|| modrm
.rm
== reg
))
13363 strcat (op_out
[1], "/(bad)");
13369 switch (vex
.length
)
13390 names
= names_mask
;
13410 names
= names_mask
;
13413 /* See PR binutils/20893 for a reproducer. */
13425 oappend (names
[reg
]);
13429 OP_VexR (int bytemode
, int sizeflag
)
13431 if (modrm
.mod
== 3)
13432 OP_VEX (bytemode
, sizeflag
);
13436 OP_VexW (int bytemode
, int sizeflag
)
13438 OP_VEX (bytemode
, sizeflag
);
13442 /* Swap 2nd and 3rd operands. */
13443 strcpy (scratchbuf
, op_out
[2]);
13444 strcpy (op_out
[2], op_out
[1]);
13445 strcpy (op_out
[1], scratchbuf
);
13450 OP_REG_VexI4 (int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
13453 const char **names
= names_xmm
;
13455 FETCH_DATA (the_info
, codep
+ 1);
13458 if (bytemode
!= x_mode
&& bytemode
!= scalar_mode
)
13462 if (address_mode
!= mode_64bit
)
13465 if (bytemode
== x_mode
&& vex
.length
== 256)
13468 oappend (names
[reg
]);
13472 /* Swap 3rd and 4th operands. */
13473 strcpy (scratchbuf
, op_out
[3]);
13474 strcpy (op_out
[3], op_out
[2]);
13475 strcpy (op_out
[2], scratchbuf
);
13480 OP_VexI4 (int bytemode ATTRIBUTE_UNUSED
,
13481 int sizeflag ATTRIBUTE_UNUSED
)
13483 scratchbuf
[0] = '$';
13484 print_operand_value (scratchbuf
+ 1, 1, codep
[-1] & 0xf);
13485 oappend_maybe_intel (scratchbuf
);
13489 VPCMP_Fixup (int bytemode ATTRIBUTE_UNUSED
,
13490 int sizeflag ATTRIBUTE_UNUSED
)
13492 unsigned int cmp_type
;
13497 FETCH_DATA (the_info
, codep
+ 1);
13498 cmp_type
= *codep
++ & 0xff;
13499 /* There are aliases for immediates 0, 1, 2, 4, 5, 6.
13500 If it's the case, print suffix, otherwise - print the immediate. */
13501 if (cmp_type
< ARRAY_SIZE (simd_cmp_op
)
13506 char *p
= mnemonicendp
- 2;
13508 /* vpcmp* can have both one- and two-lettered suffix. */
13522 sprintf (p
, "%s%s", simd_cmp_op
[cmp_type
].name
, suffix
);
13523 mnemonicendp
+= simd_cmp_op
[cmp_type
].len
;
13527 /* We have a reserved extension byte. Output it directly. */
13528 scratchbuf
[0] = '$';
13529 print_operand_value (scratchbuf
+ 1, 1, cmp_type
);
13530 oappend_maybe_intel (scratchbuf
);
13531 scratchbuf
[0] = '\0';
13535 static const struct op xop_cmp_op
[] =
13537 { STRING_COMMA_LEN ("lt") },
13538 { STRING_COMMA_LEN ("le") },
13539 { STRING_COMMA_LEN ("gt") },
13540 { STRING_COMMA_LEN ("ge") },
13541 { STRING_COMMA_LEN ("eq") },
13542 { STRING_COMMA_LEN ("neq") },
13543 { STRING_COMMA_LEN ("false") },
13544 { STRING_COMMA_LEN ("true") }
13548 VPCOM_Fixup (int bytemode ATTRIBUTE_UNUSED
,
13549 int sizeflag ATTRIBUTE_UNUSED
)
13551 unsigned int cmp_type
;
13553 FETCH_DATA (the_info
, codep
+ 1);
13554 cmp_type
= *codep
++ & 0xff;
13555 if (cmp_type
< ARRAY_SIZE (xop_cmp_op
))
13558 char *p
= mnemonicendp
- 2;
13560 /* vpcom* can have both one- and two-lettered suffix. */
13574 sprintf (p
, "%s%s", xop_cmp_op
[cmp_type
].name
, suffix
);
13575 mnemonicendp
+= xop_cmp_op
[cmp_type
].len
;
13579 /* We have a reserved extension byte. Output it directly. */
13580 scratchbuf
[0] = '$';
13581 print_operand_value (scratchbuf
+ 1, 1, cmp_type
);
13582 oappend_maybe_intel (scratchbuf
);
13583 scratchbuf
[0] = '\0';
13587 static const struct op pclmul_op
[] =
13589 { STRING_COMMA_LEN ("lql") },
13590 { STRING_COMMA_LEN ("hql") },
13591 { STRING_COMMA_LEN ("lqh") },
13592 { STRING_COMMA_LEN ("hqh") }
13596 PCLMUL_Fixup (int bytemode ATTRIBUTE_UNUSED
,
13597 int sizeflag ATTRIBUTE_UNUSED
)
13599 unsigned int pclmul_type
;
13601 FETCH_DATA (the_info
, codep
+ 1);
13602 pclmul_type
= *codep
++ & 0xff;
13603 switch (pclmul_type
)
13614 if (pclmul_type
< ARRAY_SIZE (pclmul_op
))
13617 char *p
= mnemonicendp
- 3;
13622 sprintf (p
, "%s%s", pclmul_op
[pclmul_type
].name
, suffix
);
13623 mnemonicendp
+= pclmul_op
[pclmul_type
].len
;
13627 /* We have a reserved extension byte. Output it directly. */
13628 scratchbuf
[0] = '$';
13629 print_operand_value (scratchbuf
+ 1, 1, pclmul_type
);
13630 oappend_maybe_intel (scratchbuf
);
13631 scratchbuf
[0] = '\0';
13636 MOVSXD_Fixup (int bytemode
, int sizeflag
)
13638 /* Add proper suffix to "movsxd". */
13639 char *p
= mnemonicendp
;
13659 oappend (INTERNAL_DISASSEMBLER_ERROR
);
13665 OP_E (bytemode
, sizeflag
);
13669 DistinctDest_Fixup (int bytemode
, int sizeflag
)
13671 unsigned int reg
= vex
.register_specifier
;
13672 unsigned int modrm_reg
= modrm
.reg
;
13673 unsigned int modrm_rm
= modrm
.rm
;
13675 /* Calc destination register number. */
13681 /* Calc src1 register number. */
13682 if (address_mode
!= mode_64bit
)
13684 else if (vex
.evex
&& !vex
.v
)
13687 /* Calc src2 register number. */
13688 if (modrm
.mod
== 3)
13696 /* Destination and source registers must be distinct, output bad if
13697 dest == src1 or dest == src2. */
13698 if (modrm_reg
== reg
13700 && modrm_reg
== modrm_rm
))
13705 OP_XMM (bytemode
, sizeflag
);
13709 OP_Rounding (int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
13711 if (modrm
.mod
!= 3 || !vex
.b
)
13716 case evex_rounding_64_mode
:
13717 if (address_mode
!= mode_64bit
|| !vex
.w
)
13719 /* Fall through. */
13720 case evex_rounding_mode
:
13721 evex_used
|= EVEX_b_used
;
13722 oappend (names_rounding
[vex
.ll
]);
13724 case evex_sae_mode
:
13725 evex_used
|= EVEX_b_used
;