1 /* Print i386 instructions for GDB, the GNU debugger.
2 Copyright (C) 1988-2020 Free Software Foundation, Inc.
4 This file is part of the GNU opcodes library.
6 This library is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3, or (at your option)
11 It is distributed in the hope that it will be useful, but WITHOUT
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
14 License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19 MA 02110-1301, USA. */
22 /* 80386 instruction printer by Pace Willisson (pace@prep.ai.mit.edu)
24 modified by John Hassey (hassey@dg-rtp.dg.com)
25 x86-64 support added by Jan Hubicka (jh@suse.cz)
26 VIA PadLock support by Michal Ludvig (mludvig@suse.cz). */
28 /* The main tables describing the instructions is essentially a copy
29 of the "Opcode Map" chapter (Appendix A) of the Intel 80386
30 Programmers Manual. Usually, there is a capital letter, followed
31 by a small letter. The capital letter tell the addressing mode,
32 and the small letter tells about the operand size. Refer to
33 the Intel manual for details. */
36 #include "disassemble.h"
38 #include "opcode/i386.h"
39 #include "libiberty.h"
40 #include "safe-ctype.h"
44 static int print_insn (bfd_vma
, disassemble_info
*);
45 static void dofloat (int);
46 static void OP_ST (int, int);
47 static void OP_STi (int, int);
48 static int putop (const char *, int);
49 static void oappend (const char *);
50 static void append_seg (void);
51 static void OP_indirE (int, int);
52 static void print_operand_value (char *, int, bfd_vma
);
53 static void OP_E_register (int, int);
54 static void OP_E_memory (int, int);
55 static void print_displacement (char *, bfd_vma
);
56 static void OP_E (int, int);
57 static void OP_G (int, int);
58 static bfd_vma
get64 (void);
59 static bfd_signed_vma
get32 (void);
60 static bfd_signed_vma
get32s (void);
61 static int get16 (void);
62 static void set_op (bfd_vma
, int);
63 static void OP_Skip_MODRM (int, int);
64 static void OP_REG (int, int);
65 static void OP_IMREG (int, int);
66 static void OP_I (int, int);
67 static void OP_I64 (int, int);
68 static void OP_sI (int, int);
69 static void OP_J (int, int);
70 static void OP_SEG (int, int);
71 static void OP_DIR (int, int);
72 static void OP_OFF (int, int);
73 static void OP_OFF64 (int, int);
74 static void ptr_reg (int, int);
75 static void OP_ESreg (int, int);
76 static void OP_DSreg (int, int);
77 static void OP_C (int, int);
78 static void OP_D (int, int);
79 static void OP_T (int, int);
80 static void OP_R (int, int);
81 static void OP_MMX (int, int);
82 static void OP_XMM (int, int);
83 static void OP_EM (int, int);
84 static void OP_EX (int, int);
85 static void OP_EMC (int,int);
86 static void OP_MXC (int,int);
87 static void OP_MS (int, int);
88 static void OP_XS (int, int);
89 static void OP_M (int, int);
90 static void OP_VEX (int, int);
91 static void OP_VexW (int, int);
92 static void OP_EX_Vex (int, int);
93 static void OP_XMM_Vex (int, int);
94 static void OP_Rounding (int, int);
95 static void OP_REG_VexI4 (int, int);
96 static void OP_VexI4 (int, int);
97 static void PCLMUL_Fixup (int, int);
98 static void VCMP_Fixup (int, int);
99 static void VPCMP_Fixup (int, int);
100 static void VPCOM_Fixup (int, int);
101 static void OP_0f07 (int, int);
102 static void OP_Monitor (int, int);
103 static void OP_Mwait (int, int);
104 static void NOP_Fixup1 (int, int);
105 static void NOP_Fixup2 (int, int);
106 static void OP_3DNowSuffix (int, int);
107 static void CMP_Fixup (int, int);
108 static void BadOp (void);
109 static void REP_Fixup (int, int);
110 static void SEP_Fixup (int, int);
111 static void BND_Fixup (int, int);
112 static void NOTRACK_Fixup (int, int);
113 static void HLE_Fixup1 (int, int);
114 static void HLE_Fixup2 (int, int);
115 static void HLE_Fixup3 (int, int);
116 static void CMPXCHG8B_Fixup (int, int);
117 static void XMM_Fixup (int, int);
118 static void CRC32_Fixup (int, int);
119 static void FXSAVE_Fixup (int, int);
120 static void PCMPESTR_Fixup (int, int);
122 static void MOVBE_Fixup (int, int);
123 static void MOVSXD_Fixup (int, int);
125 static void OP_Mask (int, int);
128 /* Points to first byte not fetched. */
129 bfd_byte
*max_fetched
;
130 bfd_byte the_buffer
[MAX_MNEM_SIZE
];
133 OPCODES_SIGJMP_BUF bailout
;
143 enum address_mode address_mode
;
145 /* Flags for the prefixes for the current instruction. See below. */
148 /* REX prefix the current instruction. See below. */
150 /* Bits of REX we've already used. */
152 /* Mark parts used in the REX prefix. When we are testing for
153 empty prefix (for 8bit register REX extension), just mask it
154 out. Otherwise test for REX bit is excuse for existence of REX
155 only in case value is nonzero. */
156 #define USED_REX(value) \
161 rex_used |= (value) | REX_OPCODE; \
164 rex_used |= REX_OPCODE; \
167 /* Flags for prefixes which we somehow handled when printing the
168 current instruction. */
169 static int used_prefixes
;
171 /* Flags stored in PREFIXES. */
172 #define PREFIX_REPZ 1
173 #define PREFIX_REPNZ 2
174 #define PREFIX_LOCK 4
176 #define PREFIX_SS 0x10
177 #define PREFIX_DS 0x20
178 #define PREFIX_ES 0x40
179 #define PREFIX_FS 0x80
180 #define PREFIX_GS 0x100
181 #define PREFIX_DATA 0x200
182 #define PREFIX_ADDR 0x400
183 #define PREFIX_FWAIT 0x800
185 /* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
186 to ADDR (exclusive) are valid. Returns 1 for success, longjmps
188 #define FETCH_DATA(info, addr) \
189 ((addr) <= ((struct dis_private *) (info->private_data))->max_fetched \
190 ? 1 : fetch_data ((info), (addr)))
193 fetch_data (struct disassemble_info
*info
, bfd_byte
*addr
)
196 struct dis_private
*priv
= (struct dis_private
*) info
->private_data
;
197 bfd_vma start
= priv
->insn_start
+ (priv
->max_fetched
- priv
->the_buffer
);
199 if (addr
<= priv
->the_buffer
+ MAX_MNEM_SIZE
)
200 status
= (*info
->read_memory_func
) (start
,
202 addr
- priv
->max_fetched
,
208 /* If we did manage to read at least one byte, then
209 print_insn_i386 will do something sensible. Otherwise, print
210 an error. We do that here because this is where we know
212 if (priv
->max_fetched
== priv
->the_buffer
)
213 (*info
->memory_error_func
) (status
, start
, info
);
214 OPCODES_SIGLONGJMP (priv
->bailout
, 1);
217 priv
->max_fetched
= addr
;
221 /* Possible values for prefix requirement. */
222 #define PREFIX_IGNORED_SHIFT 16
223 #define PREFIX_IGNORED_REPZ (PREFIX_REPZ << PREFIX_IGNORED_SHIFT)
224 #define PREFIX_IGNORED_REPNZ (PREFIX_REPNZ << PREFIX_IGNORED_SHIFT)
225 #define PREFIX_IGNORED_DATA (PREFIX_DATA << PREFIX_IGNORED_SHIFT)
226 #define PREFIX_IGNORED_ADDR (PREFIX_ADDR << PREFIX_IGNORED_SHIFT)
227 #define PREFIX_IGNORED_LOCK (PREFIX_LOCK << PREFIX_IGNORED_SHIFT)
229 /* Opcode prefixes. */
230 #define PREFIX_OPCODE (PREFIX_REPZ \
234 /* Prefixes ignored. */
235 #define PREFIX_IGNORED (PREFIX_IGNORED_REPZ \
236 | PREFIX_IGNORED_REPNZ \
237 | PREFIX_IGNORED_DATA)
239 #define XX { NULL, 0 }
240 #define Bad_Opcode NULL, { { NULL, 0 } }, 0
242 #define Eb { OP_E, b_mode }
243 #define Ebnd { OP_E, bnd_mode }
244 #define EbS { OP_E, b_swap_mode }
245 #define EbndS { OP_E, bnd_swap_mode }
246 #define Ev { OP_E, v_mode }
247 #define Eva { OP_E, va_mode }
248 #define Ev_bnd { OP_E, v_bnd_mode }
249 #define EvS { OP_E, v_swap_mode }
250 #define Ed { OP_E, d_mode }
251 #define Edq { OP_E, dq_mode }
252 #define Edqw { OP_E, dqw_mode }
253 #define Edqb { OP_E, dqb_mode }
254 #define Edb { OP_E, db_mode }
255 #define Edw { OP_E, dw_mode }
256 #define Edqd { OP_E, dqd_mode }
257 #define Eq { OP_E, q_mode }
258 #define indirEv { OP_indirE, indir_v_mode }
259 #define indirEp { OP_indirE, f_mode }
260 #define stackEv { OP_E, stack_v_mode }
261 #define Em { OP_E, m_mode }
262 #define Ew { OP_E, w_mode }
263 #define M { OP_M, 0 } /* lea, lgdt, etc. */
264 #define Ma { OP_M, a_mode }
265 #define Mb { OP_M, b_mode }
266 #define Md { OP_M, d_mode }
267 #define Mo { OP_M, o_mode }
268 #define Mp { OP_M, f_mode } /* 32 or 48 bit memory operand for LDS, LES etc */
269 #define Mq { OP_M, q_mode }
270 #define Mv_bnd { OP_M, v_bndmk_mode }
271 #define Mx { OP_M, x_mode }
272 #define Mxmm { OP_M, xmm_mode }
273 #define Gb { OP_G, b_mode }
274 #define Gbnd { OP_G, bnd_mode }
275 #define Gv { OP_G, v_mode }
276 #define Gd { OP_G, d_mode }
277 #define Gdq { OP_G, dq_mode }
278 #define Gm { OP_G, m_mode }
279 #define Gva { OP_G, va_mode }
280 #define Gw { OP_G, w_mode }
281 #define Rd { OP_R, d_mode }
282 #define Rdq { OP_R, dq_mode }
283 #define Rm { OP_R, m_mode }
284 #define Ib { OP_I, b_mode }
285 #define sIb { OP_sI, b_mode } /* sign extened byte */
286 #define sIbT { OP_sI, b_T_mode } /* sign extened byte like 'T' */
287 #define Iv { OP_I, v_mode }
288 #define sIv { OP_sI, v_mode }
289 #define Iv64 { OP_I64, v_mode }
290 #define Id { OP_I, d_mode }
291 #define Iw { OP_I, w_mode }
292 #define I1 { OP_I, const_1_mode }
293 #define Jb { OP_J, b_mode }
294 #define Jv { OP_J, v_mode }
295 #define Jdqw { OP_J, dqw_mode }
296 #define Cm { OP_C, m_mode }
297 #define Dm { OP_D, m_mode }
298 #define Td { OP_T, d_mode }
299 #define Skip_MODRM { OP_Skip_MODRM, 0 }
301 #define RMeAX { OP_REG, eAX_reg }
302 #define RMeBX { OP_REG, eBX_reg }
303 #define RMeCX { OP_REG, eCX_reg }
304 #define RMeDX { OP_REG, eDX_reg }
305 #define RMeSP { OP_REG, eSP_reg }
306 #define RMeBP { OP_REG, eBP_reg }
307 #define RMeSI { OP_REG, eSI_reg }
308 #define RMeDI { OP_REG, eDI_reg }
309 #define RMrAX { OP_REG, rAX_reg }
310 #define RMrBX { OP_REG, rBX_reg }
311 #define RMrCX { OP_REG, rCX_reg }
312 #define RMrDX { OP_REG, rDX_reg }
313 #define RMrSP { OP_REG, rSP_reg }
314 #define RMrBP { OP_REG, rBP_reg }
315 #define RMrSI { OP_REG, rSI_reg }
316 #define RMrDI { OP_REG, rDI_reg }
317 #define RMAL { OP_REG, al_reg }
318 #define RMCL { OP_REG, cl_reg }
319 #define RMDL { OP_REG, dl_reg }
320 #define RMBL { OP_REG, bl_reg }
321 #define RMAH { OP_REG, ah_reg }
322 #define RMCH { OP_REG, ch_reg }
323 #define RMDH { OP_REG, dh_reg }
324 #define RMBH { OP_REG, bh_reg }
325 #define RMAX { OP_REG, ax_reg }
326 #define RMDX { OP_REG, dx_reg }
328 #define eAX { OP_IMREG, eAX_reg }
329 #define AL { OP_IMREG, al_reg }
330 #define CL { OP_IMREG, cl_reg }
331 #define zAX { OP_IMREG, z_mode_ax_reg }
332 #define indirDX { OP_IMREG, indir_dx_reg }
334 #define Sw { OP_SEG, w_mode }
335 #define Sv { OP_SEG, v_mode }
336 #define Ap { OP_DIR, 0 }
337 #define Ob { OP_OFF64, b_mode }
338 #define Ov { OP_OFF64, v_mode }
339 #define Xb { OP_DSreg, eSI_reg }
340 #define Xv { OP_DSreg, eSI_reg }
341 #define Xz { OP_DSreg, eSI_reg }
342 #define Yb { OP_ESreg, eDI_reg }
343 #define Yv { OP_ESreg, eDI_reg }
344 #define DSBX { OP_DSreg, eBX_reg }
346 #define es { OP_REG, es_reg }
347 #define ss { OP_REG, ss_reg }
348 #define cs { OP_REG, cs_reg }
349 #define ds { OP_REG, ds_reg }
350 #define fs { OP_REG, fs_reg }
351 #define gs { OP_REG, gs_reg }
353 #define MX { OP_MMX, 0 }
354 #define XM { OP_XMM, 0 }
355 #define XMScalar { OP_XMM, scalar_mode }
356 #define XMGatherQ { OP_XMM, vex_vsib_q_w_dq_mode }
357 #define XMM { OP_XMM, xmm_mode }
358 #define TMM { OP_XMM, tmm_mode }
359 #define XMxmmq { OP_XMM, xmmq_mode }
360 #define EM { OP_EM, v_mode }
361 #define EMS { OP_EM, v_swap_mode }
362 #define EMd { OP_EM, d_mode }
363 #define EMx { OP_EM, x_mode }
364 #define EXbScalar { OP_EX, b_scalar_mode }
365 #define EXw { OP_EX, w_mode }
366 #define EXwScalar { OP_EX, w_scalar_mode }
367 #define EXd { OP_EX, d_mode }
368 #define EXdS { OP_EX, d_swap_mode }
369 #define EXq { OP_EX, q_mode }
370 #define EXqS { OP_EX, q_swap_mode }
371 #define EXx { OP_EX, x_mode }
372 #define EXxS { OP_EX, x_swap_mode }
373 #define EXxmm { OP_EX, xmm_mode }
374 #define EXymm { OP_EX, ymm_mode }
375 #define EXtmm { OP_EX, tmm_mode }
376 #define EXxmmq { OP_EX, xmmq_mode }
377 #define EXEvexHalfBcstXmmq { OP_EX, evex_half_bcst_xmmq_mode }
378 #define EXxmm_mb { OP_EX, xmm_mb_mode }
379 #define EXxmm_mw { OP_EX, xmm_mw_mode }
380 #define EXxmm_md { OP_EX, xmm_md_mode }
381 #define EXxmm_mq { OP_EX, xmm_mq_mode }
382 #define EXxmmdw { OP_EX, xmmdw_mode }
383 #define EXxmmqd { OP_EX, xmmqd_mode }
384 #define EXymmq { OP_EX, ymmq_mode }
385 #define EXVexWdqScalar { OP_EX, vex_scalar_w_dq_mode }
386 #define EXEvexXGscat { OP_EX, evex_x_gscat_mode }
387 #define EXEvexXNoBcst { OP_EX, evex_x_nobcst_mode }
388 #define MS { OP_MS, v_mode }
389 #define XS { OP_XS, v_mode }
390 #define EMCq { OP_EMC, q_mode }
391 #define MXC { OP_MXC, 0 }
392 #define OPSUF { OP_3DNowSuffix, 0 }
393 #define SEP { SEP_Fixup, 0 }
394 #define CMP { CMP_Fixup, 0 }
395 #define XMM0 { XMM_Fixup, 0 }
396 #define FXSAVE { FXSAVE_Fixup, 0 }
398 #define Vex { OP_VEX, vex_mode }
399 #define VexW { OP_VexW, vex_mode }
400 #define VexScalar { OP_VEX, vex_scalar_mode }
401 #define VexGatherQ { OP_VEX, vex_vsib_q_w_dq_mode }
402 #define Vex128 { OP_VEX, vex128_mode }
403 #define Vex256 { OP_VEX, vex256_mode }
404 #define VexGdq { OP_VEX, dq_mode }
405 #define VexTmm { OP_VEX, tmm_mode }
406 #define EXdVexScalarS { OP_EX_Vex, d_scalar_swap_mode }
407 #define EXqVexScalarS { OP_EX_Vex, q_scalar_swap_mode }
408 #define XMVexScalar { OP_XMM_Vex, scalar_mode }
409 #define XMVexI4 { OP_REG_VexI4, x_mode }
410 #define XMVexScalarI4 { OP_REG_VexI4, scalar_mode }
411 #define VexI4 { OP_VexI4, 0 }
412 #define PCLMUL { PCLMUL_Fixup, 0 }
413 #define VCMP { VCMP_Fixup, 0 }
414 #define VPCMP { VPCMP_Fixup, 0 }
415 #define VPCOM { VPCOM_Fixup, 0 }
417 #define EXxEVexR { OP_Rounding, evex_rounding_mode }
418 #define EXxEVexR64 { OP_Rounding, evex_rounding_64_mode }
419 #define EXxEVexS { OP_Rounding, evex_sae_mode }
421 #define XMask { OP_Mask, mask_mode }
422 #define MaskG { OP_G, mask_mode }
423 #define MaskE { OP_E, mask_mode }
424 #define MaskBDE { OP_E, mask_bd_mode }
425 #define MaskR { OP_R, mask_mode }
426 #define MaskVex { OP_VEX, mask_mode }
428 #define MVexVSIBDWpX { OP_M, vex_vsib_d_w_dq_mode }
429 #define MVexVSIBDQWpX { OP_M, vex_vsib_d_w_d_mode }
430 #define MVexVSIBQWpX { OP_M, vex_vsib_q_w_dq_mode }
431 #define MVexVSIBQDWpX { OP_M, vex_vsib_q_w_d_mode }
433 #define MVexSIBMEM { OP_M, vex_sibmem_mode }
435 /* Used handle "rep" prefix for string instructions. */
436 #define Xbr { REP_Fixup, eSI_reg }
437 #define Xvr { REP_Fixup, eSI_reg }
438 #define Ybr { REP_Fixup, eDI_reg }
439 #define Yvr { REP_Fixup, eDI_reg }
440 #define Yzr { REP_Fixup, eDI_reg }
441 #define indirDXr { REP_Fixup, indir_dx_reg }
442 #define ALr { REP_Fixup, al_reg }
443 #define eAXr { REP_Fixup, eAX_reg }
445 /* Used handle HLE prefix for lockable instructions. */
446 #define Ebh1 { HLE_Fixup1, b_mode }
447 #define Evh1 { HLE_Fixup1, v_mode }
448 #define Ebh2 { HLE_Fixup2, b_mode }
449 #define Evh2 { HLE_Fixup2, v_mode }
450 #define Ebh3 { HLE_Fixup3, b_mode }
451 #define Evh3 { HLE_Fixup3, v_mode }
453 #define BND { BND_Fixup, 0 }
454 #define NOTRACK { NOTRACK_Fixup, 0 }
456 #define cond_jump_flag { NULL, cond_jump_mode }
457 #define loop_jcxz_flag { NULL, loop_jcxz_mode }
459 /* bits in sizeflag */
460 #define SUFFIX_ALWAYS 4
468 /* byte operand with operand swapped */
470 /* byte operand, sign extend like 'T' suffix */
472 /* operand size depends on prefixes */
474 /* operand size depends on prefixes with operand swapped */
476 /* operand size depends on address prefix */
480 /* double word operand */
482 /* double word operand with operand swapped */
484 /* quad word operand */
486 /* quad word operand with operand swapped */
488 /* ten-byte operand */
490 /* 16-byte XMM, 32-byte YMM or 64-byte ZMM operand. In EVEX with
491 broadcast enabled. */
493 /* Similar to x_mode, but with different EVEX mem shifts. */
495 /* Similar to x_mode, but with disabled broadcast. */
497 /* Similar to x_mode, but with operands swapped and disabled broadcast
500 /* 16-byte XMM operand */
502 /* XMM, XMM or YMM register operand, or quad word, xmmword or ymmword
503 memory operand (depending on vector length). Broadcast isn't
506 /* Same as xmmq_mode, but broadcast is allowed. */
507 evex_half_bcst_xmmq_mode
,
508 /* XMM register or byte memory operand */
510 /* XMM register or word memory operand */
512 /* XMM register or double word memory operand */
514 /* XMM register or quad word memory operand */
516 /* 16-byte XMM, word, double word or quad word operand. */
518 /* 16-byte XMM, double word, quad word operand or xmm word operand. */
520 /* 32-byte YMM operand */
522 /* quad word, ymmword or zmmword memory operand. */
524 /* 32-byte YMM or 16-byte word operand */
528 /* d_mode in 32bit, q_mode in 64bit mode. */
530 /* pair of v_mode operands */
536 /* like v_bnd_mode in 32bit, no RIP-rel in 64bit mode. */
538 /* operand size depends on REX prefixes. */
540 /* registers like dq_mode, memory like w_mode, displacements like
541 v_mode without considering Intel64 ISA. */
545 /* bounds operand with operand swapped */
547 /* 4- or 6-byte pointer operand */
550 /* v_mode for indirect branch opcodes. */
552 /* v_mode for stack-related opcodes. */
554 /* non-quad operand size depends on prefixes */
556 /* 16-byte operand */
558 /* registers like dq_mode, memory like b_mode. */
560 /* registers like d_mode, memory like b_mode. */
562 /* registers like d_mode, memory like w_mode. */
564 /* registers like dq_mode, memory like d_mode. */
566 /* normal vex mode */
568 /* 128bit vex mode */
570 /* 256bit vex mode */
573 /* Operand size depends on the VEX.W bit, with VSIB dword indices. */
574 vex_vsib_d_w_dq_mode
,
575 /* Similar to vex_vsib_d_w_dq_mode, with smaller memory. */
577 /* Operand size depends on the VEX.W bit, with VSIB qword indices. */
578 vex_vsib_q_w_dq_mode
,
579 /* Similar to vex_vsib_q_w_dq_mode, with smaller memory. */
581 /* mandatory non-vector SIB. */
584 /* scalar, ignore vector length. */
586 /* like b_mode, ignore vector length. */
588 /* like w_mode, ignore vector length. */
590 /* like d_swap_mode, ignore vector length. */
592 /* like q_swap_mode, ignore vector length. */
594 /* like vex_mode, ignore vector length. */
596 /* Operand size depends on the VEX.W bit, ignore vector length. */
597 vex_scalar_w_dq_mode
,
599 /* Static rounding. */
601 /* Static rounding, 64-bit mode only. */
602 evex_rounding_64_mode
,
603 /* Supress all exceptions. */
606 /* Mask register operand. */
608 /* Mask register operand. */
676 #define FLOAT NULL, { { NULL, FLOATCODE } }, 0
678 #define DIS386(T, I) NULL, { { NULL, (T)}, { NULL, (I) } }, 0
679 #define DIS386_PREFIX(T, I, P) NULL, { { NULL, (T)}, { NULL, (I) } }, P
680 #define REG_TABLE(I) DIS386 (USE_REG_TABLE, (I))
681 #define MOD_TABLE(I) DIS386 (USE_MOD_TABLE, (I))
682 #define RM_TABLE(I) DIS386 (USE_RM_TABLE, (I))
683 #define PREFIX_TABLE(I) DIS386 (USE_PREFIX_TABLE, (I))
684 #define X86_64_TABLE(I) DIS386 (USE_X86_64_TABLE, (I))
685 #define THREE_BYTE_TABLE(I) DIS386 (USE_3BYTE_TABLE, (I))
686 #define THREE_BYTE_TABLE_PREFIX(I, P) DIS386_PREFIX (USE_3BYTE_TABLE, (I), P)
687 #define XOP_8F_TABLE(I) DIS386 (USE_XOP_8F_TABLE, (I))
688 #define VEX_C4_TABLE(I) DIS386 (USE_VEX_C4_TABLE, (I))
689 #define VEX_C5_TABLE(I) DIS386 (USE_VEX_C5_TABLE, (I))
690 #define VEX_LEN_TABLE(I) DIS386 (USE_VEX_LEN_TABLE, (I))
691 #define VEX_W_TABLE(I) DIS386 (USE_VEX_W_TABLE, (I))
692 #define EVEX_TABLE(I) DIS386 (USE_EVEX_TABLE, (I))
693 #define EVEX_LEN_TABLE(I) DIS386 (USE_EVEX_LEN_TABLE, (I))
731 REG_VEX_0F3849_X86_64_P_0_W_0_M_1
,
736 REG_0FXOP_09_12_M_1_L_0
,
816 MOD_VEX_0F3849_X86_64_P_0_W_0
,
817 MOD_VEX_0F3849_X86_64_P_2_W_0
,
818 MOD_VEX_0F3849_X86_64_P_3_W_0
,
819 MOD_VEX_0F384B_X86_64_P_1_W_0
,
820 MOD_VEX_0F384B_X86_64_P_2_W_0
,
821 MOD_VEX_0F384B_X86_64_P_3_W_0
,
822 MOD_VEX_0F385C_X86_64_P_1_W_0
,
823 MOD_VEX_0F385E_X86_64_P_0_W_0
,
824 MOD_VEX_0F385E_X86_64_P_1_W_0
,
825 MOD_VEX_0F385E_X86_64_P_2_W_0
,
826 MOD_VEX_0F385E_X86_64_P_3_W_0
,
836 MOD_VEX_0F12_PREFIX_0
,
837 MOD_VEX_0F12_PREFIX_2
,
839 MOD_VEX_0F16_PREFIX_0
,
840 MOD_VEX_0F16_PREFIX_2
,
843 MOD_VEX_W_0_0F41_P_0_LEN_1
,
844 MOD_VEX_W_1_0F41_P_0_LEN_1
,
845 MOD_VEX_W_0_0F41_P_2_LEN_1
,
846 MOD_VEX_W_1_0F41_P_2_LEN_1
,
847 MOD_VEX_W_0_0F42_P_0_LEN_1
,
848 MOD_VEX_W_1_0F42_P_0_LEN_1
,
849 MOD_VEX_W_0_0F42_P_2_LEN_1
,
850 MOD_VEX_W_1_0F42_P_2_LEN_1
,
851 MOD_VEX_W_0_0F44_P_0_LEN_1
,
852 MOD_VEX_W_1_0F44_P_0_LEN_1
,
853 MOD_VEX_W_0_0F44_P_2_LEN_1
,
854 MOD_VEX_W_1_0F44_P_2_LEN_1
,
855 MOD_VEX_W_0_0F45_P_0_LEN_1
,
856 MOD_VEX_W_1_0F45_P_0_LEN_1
,
857 MOD_VEX_W_0_0F45_P_2_LEN_1
,
858 MOD_VEX_W_1_0F45_P_2_LEN_1
,
859 MOD_VEX_W_0_0F46_P_0_LEN_1
,
860 MOD_VEX_W_1_0F46_P_0_LEN_1
,
861 MOD_VEX_W_0_0F46_P_2_LEN_1
,
862 MOD_VEX_W_1_0F46_P_2_LEN_1
,
863 MOD_VEX_W_0_0F47_P_0_LEN_1
,
864 MOD_VEX_W_1_0F47_P_0_LEN_1
,
865 MOD_VEX_W_0_0F47_P_2_LEN_1
,
866 MOD_VEX_W_1_0F47_P_2_LEN_1
,
867 MOD_VEX_W_0_0F4A_P_0_LEN_1
,
868 MOD_VEX_W_1_0F4A_P_0_LEN_1
,
869 MOD_VEX_W_0_0F4A_P_2_LEN_1
,
870 MOD_VEX_W_1_0F4A_P_2_LEN_1
,
871 MOD_VEX_W_0_0F4B_P_0_LEN_1
,
872 MOD_VEX_W_1_0F4B_P_0_LEN_1
,
873 MOD_VEX_W_0_0F4B_P_2_LEN_1
,
885 MOD_VEX_W_0_0F91_P_0_LEN_0
,
886 MOD_VEX_W_1_0F91_P_0_LEN_0
,
887 MOD_VEX_W_0_0F91_P_2_LEN_0
,
888 MOD_VEX_W_1_0F91_P_2_LEN_0
,
889 MOD_VEX_W_0_0F92_P_0_LEN_0
,
890 MOD_VEX_W_0_0F92_P_2_LEN_0
,
891 MOD_VEX_0F92_P_3_LEN_0
,
892 MOD_VEX_W_0_0F93_P_0_LEN_0
,
893 MOD_VEX_W_0_0F93_P_2_LEN_0
,
894 MOD_VEX_0F93_P_3_LEN_0
,
895 MOD_VEX_W_0_0F98_P_0_LEN_0
,
896 MOD_VEX_W_1_0F98_P_0_LEN_0
,
897 MOD_VEX_W_0_0F98_P_2_LEN_0
,
898 MOD_VEX_W_1_0F98_P_2_LEN_0
,
899 MOD_VEX_W_0_0F99_P_0_LEN_0
,
900 MOD_VEX_W_1_0F99_P_0_LEN_0
,
901 MOD_VEX_W_0_0F99_P_2_LEN_0
,
902 MOD_VEX_W_1_0F99_P_2_LEN_0
,
905 MOD_VEX_0FD7_PREFIX_2
,
906 MOD_VEX_0FE7_PREFIX_2
,
907 MOD_VEX_0FF0_PREFIX_3
,
908 MOD_VEX_0F381A_PREFIX_2
,
909 MOD_VEX_0F382A_PREFIX_2
,
910 MOD_VEX_0F382C_PREFIX_2
,
911 MOD_VEX_0F382D_PREFIX_2
,
912 MOD_VEX_0F382E_PREFIX_2
,
913 MOD_VEX_0F382F_PREFIX_2
,
914 MOD_VEX_0F385A_PREFIX_2
,
915 MOD_VEX_0F388C_PREFIX_2
,
916 MOD_VEX_0F388E_PREFIX_2
,
917 MOD_VEX_W_0_0F3A30_P_2_LEN_0
,
918 MOD_VEX_W_1_0F3A30_P_2_LEN_0
,
919 MOD_VEX_W_0_0F3A31_P_2_LEN_0
,
920 MOD_VEX_W_1_0F3A31_P_2_LEN_0
,
921 MOD_VEX_W_0_0F3A32_P_2_LEN_0
,
922 MOD_VEX_W_1_0F3A32_P_2_LEN_0
,
923 MOD_VEX_W_0_0F3A33_P_2_LEN_0
,
924 MOD_VEX_W_1_0F3A33_P_2_LEN_0
,
928 MOD_EVEX_0F12_PREFIX_0
,
929 MOD_EVEX_0F12_PREFIX_2
,
931 MOD_EVEX_0F16_PREFIX_0
,
932 MOD_EVEX_0F16_PREFIX_2
,
935 MOD_EVEX_0F381A_P_2_W_0
,
936 MOD_EVEX_0F381A_P_2_W_1
,
937 MOD_EVEX_0F381B_P_2_W_0
,
938 MOD_EVEX_0F381B_P_2_W_1
,
939 MOD_EVEX_0F385A_P_2_W_0
,
940 MOD_EVEX_0F385A_P_2_W_1
,
941 MOD_EVEX_0F385B_P_2_W_0
,
942 MOD_EVEX_0F385B_P_2_W_1
,
943 MOD_EVEX_0F38C6_REG_1
,
944 MOD_EVEX_0F38C6_REG_2
,
945 MOD_EVEX_0F38C6_REG_5
,
946 MOD_EVEX_0F38C6_REG_6
,
947 MOD_EVEX_0F38C7_REG_1
,
948 MOD_EVEX_0F38C7_REG_2
,
949 MOD_EVEX_0F38C7_REG_5
,
950 MOD_EVEX_0F38C7_REG_6
963 RM_0F1E_P_1_MOD_3_REG_7
,
964 RM_0FAE_REG_6_MOD_3_P_0
,
966 RM_VEX_0F3849_X86_64_P_0_W_0_M_1_R_0
972 PREFIX_0F01_REG_3_RM_1
,
973 PREFIX_0F01_REG_5_MOD_0
,
974 PREFIX_0F01_REG_5_MOD_3_RM_0
,
975 PREFIX_0F01_REG_5_MOD_3_RM_1
,
976 PREFIX_0F01_REG_5_MOD_3_RM_2
,
977 PREFIX_0F01_REG_7_MOD_3_RM_2
,
978 PREFIX_0F01_REG_7_MOD_3_RM_3
,
1020 PREFIX_0FAE_REG_0_MOD_3
,
1021 PREFIX_0FAE_REG_1_MOD_3
,
1022 PREFIX_0FAE_REG_2_MOD_3
,
1023 PREFIX_0FAE_REG_3_MOD_3
,
1024 PREFIX_0FAE_REG_4_MOD_0
,
1025 PREFIX_0FAE_REG_4_MOD_3
,
1026 PREFIX_0FAE_REG_5_MOD_0
,
1027 PREFIX_0FAE_REG_5_MOD_3
,
1028 PREFIX_0FAE_REG_6_MOD_0
,
1029 PREFIX_0FAE_REG_6_MOD_3
,
1030 PREFIX_0FAE_REG_7_MOD_0
,
1036 PREFIX_0FC7_REG_6_MOD_0
,
1037 PREFIX_0FC7_REG_6_MOD_3
,
1038 PREFIX_0FC7_REG_7_MOD_3
,
1168 PREFIX_VEX_0F71_REG_2
,
1169 PREFIX_VEX_0F71_REG_4
,
1170 PREFIX_VEX_0F71_REG_6
,
1171 PREFIX_VEX_0F72_REG_2
,
1172 PREFIX_VEX_0F72_REG_4
,
1173 PREFIX_VEX_0F72_REG_6
,
1174 PREFIX_VEX_0F73_REG_2
,
1175 PREFIX_VEX_0F73_REG_3
,
1176 PREFIX_VEX_0F73_REG_6
,
1177 PREFIX_VEX_0F73_REG_7
,
1302 PREFIX_VEX_0F3849_X86_64
,
1303 PREFIX_VEX_0F384B_X86_64
,
1307 PREFIX_VEX_0F385C_X86_64
,
1308 PREFIX_VEX_0F385E_X86_64
,
1354 PREFIX_VEX_0F38F3_REG_1
,
1355 PREFIX_VEX_0F38F3_REG_2
,
1356 PREFIX_VEX_0F38F3_REG_3
,
1453 PREFIX_EVEX_0F71_REG_2
,
1454 PREFIX_EVEX_0F71_REG_4
,
1455 PREFIX_EVEX_0F71_REG_6
,
1456 PREFIX_EVEX_0F72_REG_0
,
1457 PREFIX_EVEX_0F72_REG_1
,
1458 PREFIX_EVEX_0F72_REG_2
,
1459 PREFIX_EVEX_0F72_REG_4
,
1460 PREFIX_EVEX_0F72_REG_6
,
1461 PREFIX_EVEX_0F73_REG_2
,
1462 PREFIX_EVEX_0F73_REG_3
,
1463 PREFIX_EVEX_0F73_REG_6
,
1464 PREFIX_EVEX_0F73_REG_7
,
1586 PREFIX_EVEX_0F38C6_REG_1
,
1587 PREFIX_EVEX_0F38C6_REG_2
,
1588 PREFIX_EVEX_0F38C6_REG_5
,
1589 PREFIX_EVEX_0F38C6_REG_6
,
1590 PREFIX_EVEX_0F38C7_REG_1
,
1591 PREFIX_EVEX_0F38C7_REG_2
,
1592 PREFIX_EVEX_0F38C7_REG_5
,
1593 PREFIX_EVEX_0F38C7_REG_6
,
1690 THREE_BYTE_0F38
= 0,
1717 VEX_LEN_0F12_P_0_M_0
= 0,
1718 VEX_LEN_0F12_P_0_M_1
,
1719 #define VEX_LEN_0F12_P_2_M_0 VEX_LEN_0F12_P_0_M_0
1721 VEX_LEN_0F16_P_0_M_0
,
1722 VEX_LEN_0F16_P_0_M_1
,
1723 #define VEX_LEN_0F16_P_2_M_0 VEX_LEN_0F16_P_0_M_0
1759 VEX_LEN_0FAE_R_2_M_0
,
1760 VEX_LEN_0FAE_R_3_M_0
,
1767 VEX_LEN_0F381A_P_2_M_0
,
1770 VEX_LEN_0F3849_X86_64_P_0_W_0_M_0
,
1771 VEX_LEN_0F3849_X86_64_P_0_W_0_M_1_REG_0_RM_0
,
1772 VEX_LEN_0F3849_X86_64_P_2_W_0_M_0
,
1773 VEX_LEN_0F3849_X86_64_P_3_W_0_M_0
,
1774 VEX_LEN_0F384B_X86_64_P_1_W_0_M_0
,
1775 VEX_LEN_0F384B_X86_64_P_2_W_0_M_0
,
1776 VEX_LEN_0F384B_X86_64_P_3_W_0_M_0
,
1777 VEX_LEN_0F385A_P_2_M_0
,
1778 VEX_LEN_0F385C_X86_64_P_1_W_0_M_0
,
1779 VEX_LEN_0F385E_X86_64_P_0_W_0_M_0
,
1780 VEX_LEN_0F385E_X86_64_P_1_W_0_M_0
,
1781 VEX_LEN_0F385E_X86_64_P_2_W_0_M_0
,
1782 VEX_LEN_0F385E_X86_64_P_3_W_0_M_0
,
1785 VEX_LEN_0F38F3_R_1_P_0
,
1786 VEX_LEN_0F38F3_R_2_P_0
,
1787 VEX_LEN_0F38F3_R_3_P_0
,
1822 VEX_LEN_0FXOP_08_85
,
1823 VEX_LEN_0FXOP_08_86
,
1824 VEX_LEN_0FXOP_08_87
,
1825 VEX_LEN_0FXOP_08_8E
,
1826 VEX_LEN_0FXOP_08_8F
,
1827 VEX_LEN_0FXOP_08_95
,
1828 VEX_LEN_0FXOP_08_96
,
1829 VEX_LEN_0FXOP_08_97
,
1830 VEX_LEN_0FXOP_08_9E
,
1831 VEX_LEN_0FXOP_08_9F
,
1832 VEX_LEN_0FXOP_08_A3
,
1833 VEX_LEN_0FXOP_08_A6
,
1834 VEX_LEN_0FXOP_08_B6
,
1835 VEX_LEN_0FXOP_08_C0
,
1836 VEX_LEN_0FXOP_08_C1
,
1837 VEX_LEN_0FXOP_08_C2
,
1838 VEX_LEN_0FXOP_08_C3
,
1839 VEX_LEN_0FXOP_08_CC
,
1840 VEX_LEN_0FXOP_08_CD
,
1841 VEX_LEN_0FXOP_08_CE
,
1842 VEX_LEN_0FXOP_08_CF
,
1843 VEX_LEN_0FXOP_08_EC
,
1844 VEX_LEN_0FXOP_08_ED
,
1845 VEX_LEN_0FXOP_08_EE
,
1846 VEX_LEN_0FXOP_08_EF
,
1847 VEX_LEN_0FXOP_09_01
,
1848 VEX_LEN_0FXOP_09_02
,
1849 VEX_LEN_0FXOP_09_12_M_1
,
1850 VEX_LEN_0FXOP_09_82_W_0
,
1851 VEX_LEN_0FXOP_09_83_W_0
,
1852 VEX_LEN_0FXOP_09_90
,
1853 VEX_LEN_0FXOP_09_91
,
1854 VEX_LEN_0FXOP_09_92
,
1855 VEX_LEN_0FXOP_09_93
,
1856 VEX_LEN_0FXOP_09_94
,
1857 VEX_LEN_0FXOP_09_95
,
1858 VEX_LEN_0FXOP_09_96
,
1859 VEX_LEN_0FXOP_09_97
,
1860 VEX_LEN_0FXOP_09_98
,
1861 VEX_LEN_0FXOP_09_99
,
1862 VEX_LEN_0FXOP_09_9A
,
1863 VEX_LEN_0FXOP_09_9B
,
1864 VEX_LEN_0FXOP_09_C1
,
1865 VEX_LEN_0FXOP_09_C2
,
1866 VEX_LEN_0FXOP_09_C3
,
1867 VEX_LEN_0FXOP_09_C6
,
1868 VEX_LEN_0FXOP_09_C7
,
1869 VEX_LEN_0FXOP_09_CB
,
1870 VEX_LEN_0FXOP_09_D1
,
1871 VEX_LEN_0FXOP_09_D2
,
1872 VEX_LEN_0FXOP_09_D3
,
1873 VEX_LEN_0FXOP_09_D6
,
1874 VEX_LEN_0FXOP_09_D7
,
1875 VEX_LEN_0FXOP_09_DB
,
1876 VEX_LEN_0FXOP_09_E1
,
1877 VEX_LEN_0FXOP_09_E2
,
1878 VEX_LEN_0FXOP_09_E3
,
1879 VEX_LEN_0FXOP_0A_12
,
1884 EVEX_LEN_0F6E_P_2
= 0,
1890 EVEX_LEN_0F3816_P_2
,
1891 EVEX_LEN_0F3819_P_2_W_0
,
1892 EVEX_LEN_0F3819_P_2_W_1
,
1893 EVEX_LEN_0F381A_P_2_W_0_M_0
,
1894 EVEX_LEN_0F381A_P_2_W_1_M_0
,
1895 EVEX_LEN_0F381B_P_2_W_0_M_0
,
1896 EVEX_LEN_0F381B_P_2_W_1_M_0
,
1897 EVEX_LEN_0F3836_P_2
,
1898 EVEX_LEN_0F385A_P_2_W_0_M_0
,
1899 EVEX_LEN_0F385A_P_2_W_1_M_0
,
1900 EVEX_LEN_0F385B_P_2_W_0_M_0
,
1901 EVEX_LEN_0F385B_P_2_W_1_M_0
,
1902 EVEX_LEN_0F38C6_REG_1_PREFIX_2
,
1903 EVEX_LEN_0F38C6_REG_2_PREFIX_2
,
1904 EVEX_LEN_0F38C6_REG_5_PREFIX_2
,
1905 EVEX_LEN_0F38C6_REG_6_PREFIX_2
,
1906 EVEX_LEN_0F38C7_R_1_P_2_W_0
,
1907 EVEX_LEN_0F38C7_R_1_P_2_W_1
,
1908 EVEX_LEN_0F38C7_R_2_P_2_W_0
,
1909 EVEX_LEN_0F38C7_R_2_P_2_W_1
,
1910 EVEX_LEN_0F38C7_R_5_P_2_W_0
,
1911 EVEX_LEN_0F38C7_R_5_P_2_W_1
,
1912 EVEX_LEN_0F38C7_R_6_P_2_W_0
,
1913 EVEX_LEN_0F38C7_R_6_P_2_W_1
,
1914 EVEX_LEN_0F3A00_P_2_W_1
,
1915 EVEX_LEN_0F3A01_P_2_W_1
,
1916 EVEX_LEN_0F3A14_P_2
,
1917 EVEX_LEN_0F3A15_P_2
,
1918 EVEX_LEN_0F3A16_P_2
,
1919 EVEX_LEN_0F3A17_P_2
,
1920 EVEX_LEN_0F3A18_P_2_W_0
,
1921 EVEX_LEN_0F3A18_P_2_W_1
,
1922 EVEX_LEN_0F3A19_P_2_W_0
,
1923 EVEX_LEN_0F3A19_P_2_W_1
,
1924 EVEX_LEN_0F3A1A_P_2_W_0
,
1925 EVEX_LEN_0F3A1A_P_2_W_1
,
1926 EVEX_LEN_0F3A1B_P_2_W_0
,
1927 EVEX_LEN_0F3A1B_P_2_W_1
,
1928 EVEX_LEN_0F3A20_P_2
,
1929 EVEX_LEN_0F3A21_P_2_W_0
,
1930 EVEX_LEN_0F3A22_P_2
,
1931 EVEX_LEN_0F3A23_P_2_W_0
,
1932 EVEX_LEN_0F3A23_P_2_W_1
,
1933 EVEX_LEN_0F3A38_P_2_W_0
,
1934 EVEX_LEN_0F3A38_P_2_W_1
,
1935 EVEX_LEN_0F3A39_P_2_W_0
,
1936 EVEX_LEN_0F3A39_P_2_W_1
,
1937 EVEX_LEN_0F3A3A_P_2_W_0
,
1938 EVEX_LEN_0F3A3A_P_2_W_1
,
1939 EVEX_LEN_0F3A3B_P_2_W_0
,
1940 EVEX_LEN_0F3A3B_P_2_W_1
,
1941 EVEX_LEN_0F3A43_P_2_W_0
,
1942 EVEX_LEN_0F3A43_P_2_W_1
1947 VEX_W_0F41_P_0_LEN_1
= 0,
1948 VEX_W_0F41_P_2_LEN_1
,
1949 VEX_W_0F42_P_0_LEN_1
,
1950 VEX_W_0F42_P_2_LEN_1
,
1951 VEX_W_0F44_P_0_LEN_0
,
1952 VEX_W_0F44_P_2_LEN_0
,
1953 VEX_W_0F45_P_0_LEN_1
,
1954 VEX_W_0F45_P_2_LEN_1
,
1955 VEX_W_0F46_P_0_LEN_1
,
1956 VEX_W_0F46_P_2_LEN_1
,
1957 VEX_W_0F47_P_0_LEN_1
,
1958 VEX_W_0F47_P_2_LEN_1
,
1959 VEX_W_0F4A_P_0_LEN_1
,
1960 VEX_W_0F4A_P_2_LEN_1
,
1961 VEX_W_0F4B_P_0_LEN_1
,
1962 VEX_W_0F4B_P_2_LEN_1
,
1963 VEX_W_0F90_P_0_LEN_0
,
1964 VEX_W_0F90_P_2_LEN_0
,
1965 VEX_W_0F91_P_0_LEN_0
,
1966 VEX_W_0F91_P_2_LEN_0
,
1967 VEX_W_0F92_P_0_LEN_0
,
1968 VEX_W_0F92_P_2_LEN_0
,
1969 VEX_W_0F93_P_0_LEN_0
,
1970 VEX_W_0F93_P_2_LEN_0
,
1971 VEX_W_0F98_P_0_LEN_0
,
1972 VEX_W_0F98_P_2_LEN_0
,
1973 VEX_W_0F99_P_0_LEN_0
,
1974 VEX_W_0F99_P_2_LEN_0
,
1983 VEX_W_0F381A_P_2_M_0
,
1984 VEX_W_0F382C_P_2_M_0
,
1985 VEX_W_0F382D_P_2_M_0
,
1986 VEX_W_0F382E_P_2_M_0
,
1987 VEX_W_0F382F_P_2_M_0
,
1990 VEX_W_0F3849_X86_64_P_0
,
1991 VEX_W_0F3849_X86_64_P_2
,
1992 VEX_W_0F3849_X86_64_P_3
,
1993 VEX_W_0F384B_X86_64_P_1
,
1994 VEX_W_0F384B_X86_64_P_2
,
1995 VEX_W_0F384B_X86_64_P_3
,
1998 VEX_W_0F385A_P_2_M_0
,
1999 VEX_W_0F385C_X86_64_P_1
,
2000 VEX_W_0F385E_X86_64_P_0
,
2001 VEX_W_0F385E_X86_64_P_1
,
2002 VEX_W_0F385E_X86_64_P_2
,
2003 VEX_W_0F385E_X86_64_P_3
,
2016 VEX_W_0F3A30_P_2_LEN_0
,
2017 VEX_W_0F3A31_P_2_LEN_0
,
2018 VEX_W_0F3A32_P_2_LEN_0
,
2019 VEX_W_0F3A33_P_2_LEN_0
,
2029 VEX_W_0FXOP_08_85_L_0
,
2030 VEX_W_0FXOP_08_86_L_0
,
2031 VEX_W_0FXOP_08_87_L_0
,
2032 VEX_W_0FXOP_08_8E_L_0
,
2033 VEX_W_0FXOP_08_8F_L_0
,
2034 VEX_W_0FXOP_08_95_L_0
,
2035 VEX_W_0FXOP_08_96_L_0
,
2036 VEX_W_0FXOP_08_97_L_0
,
2037 VEX_W_0FXOP_08_9E_L_0
,
2038 VEX_W_0FXOP_08_9F_L_0
,
2039 VEX_W_0FXOP_08_A6_L_0
,
2040 VEX_W_0FXOP_08_B6_L_0
,
2041 VEX_W_0FXOP_08_C0_L_0
,
2042 VEX_W_0FXOP_08_C1_L_0
,
2043 VEX_W_0FXOP_08_C2_L_0
,
2044 VEX_W_0FXOP_08_C3_L_0
,
2045 VEX_W_0FXOP_08_CC_L_0
,
2046 VEX_W_0FXOP_08_CD_L_0
,
2047 VEX_W_0FXOP_08_CE_L_0
,
2048 VEX_W_0FXOP_08_CF_L_0
,
2049 VEX_W_0FXOP_08_EC_L_0
,
2050 VEX_W_0FXOP_08_ED_L_0
,
2051 VEX_W_0FXOP_08_EE_L_0
,
2052 VEX_W_0FXOP_08_EF_L_0
,
2058 VEX_W_0FXOP_09_C1_L_0
,
2059 VEX_W_0FXOP_09_C2_L_0
,
2060 VEX_W_0FXOP_09_C3_L_0
,
2061 VEX_W_0FXOP_09_C6_L_0
,
2062 VEX_W_0FXOP_09_C7_L_0
,
2063 VEX_W_0FXOP_09_CB_L_0
,
2064 VEX_W_0FXOP_09_D1_L_0
,
2065 VEX_W_0FXOP_09_D2_L_0
,
2066 VEX_W_0FXOP_09_D3_L_0
,
2067 VEX_W_0FXOP_09_D6_L_0
,
2068 VEX_W_0FXOP_09_D7_L_0
,
2069 VEX_W_0FXOP_09_DB_L_0
,
2070 VEX_W_0FXOP_09_E1_L_0
,
2071 VEX_W_0FXOP_09_E2_L_0
,
2072 VEX_W_0FXOP_09_E3_L_0
,
2078 EVEX_W_0F12_P_0_M_1
,
2081 EVEX_W_0F16_P_0_M_1
,
2115 EVEX_W_0F72_R_2_P_2
,
2116 EVEX_W_0F72_R_6_P_2
,
2117 EVEX_W_0F73_R_2_P_2
,
2118 EVEX_W_0F73_R_6_P_2
,
2203 EVEX_W_0F38C7_R_1_P_2
,
2204 EVEX_W_0F38C7_R_2_P_2
,
2205 EVEX_W_0F38C7_R_5_P_2
,
2206 EVEX_W_0F38C7_R_6_P_2
,
2231 typedef void (*op_rtn
) (int bytemode
, int sizeflag
);
2240 unsigned int prefix_requirement
;
2243 /* Upper case letters in the instruction names here are macros.
2244 'A' => print 'b' if no register operands or suffix_always is true
2245 'B' => print 'b' if suffix_always is true
2246 'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
2248 'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
2249 suffix_always is true
2250 'E' => print 'e' if 32-bit form of jcxz
2251 'F' => print 'w' or 'l' depending on address size prefix (loop insns)
2252 'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
2253 'H' => print ",pt" or ",pn" branch hint
2256 'K' => print 'd' or 'q' if rex prefix is present.
2257 'L' => print 'l' if suffix_always is true
2258 'M' => print 'r' if intel_mnemonic is false.
2259 'N' => print 'n' if instruction has no wait "prefix"
2260 'O' => print 'd' or 'o' (or 'q' in Intel mode)
2261 'P' => print 'w', 'l' or 'q' if instruction has an operand size prefix,
2262 or suffix_always is true. print 'q' if rex prefix is present.
2263 'Q' => print 'w', 'l' or 'q' for memory operand or suffix_always
2265 'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
2266 'S' => print 'w', 'l' or 'q' if suffix_always is true
2267 'T' => print 'q' in 64bit mode if instruction has no operand size
2268 prefix and behave as 'P' otherwise
2269 'U' => print 'q' in 64bit mode if instruction has no operand size
2270 prefix and behave as 'Q' otherwise
2271 'V' => print 'q' in 64bit mode if instruction has no operand size
2272 prefix and behave as 'S' otherwise
2273 'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
2274 'X' => print 's', 'd' depending on data16 prefix (for XMM)
2276 'Z' => print 'q' in 64bit mode and behave as 'L' otherwise
2277 '!' => change condition from true to false or from false to true.
2278 '%' => add 1 upper case letter to the macro.
2279 '^' => print 'w', 'l', or 'q' (Intel64 ISA only) depending on operand size
2280 prefix or suffix_always is true (lcall/ljmp).
2281 '@' => print 'q' for Intel64 ISA, 'w' or 'q' for AMD64 ISA depending
2282 on operand size prefix.
2283 '&' => print 'q' in 64bit mode for Intel64 ISA or if instruction
2284 has no operand size prefix for AMD64 ISA, behave as 'P'
2287 2 upper case letter macros:
2288 "XY" => print 'x' or 'y' if suffix_always is true or no register
2289 operands and no broadcast.
2290 "XZ" => print 'x', 'y', or 'z' if suffix_always is true or no
2291 register operands and no broadcast.
2292 "XW" => print 's', 'd' depending on the VEX.W bit (for FMA)
2293 "LQ" => print 'l' ('d' in Intel mode) or 'q' for memory
2294 operand or no operand at all in 64bit mode, or if suffix_always
2296 "LB" => print "abs" in 64bit mode and behave as 'B' otherwise
2297 "LS" => print "abs" in 64bit mode and behave as 'S' otherwise
2298 "LV" => print "abs" for 64bit operand and behave as 'S' otherwise
2299 "LW" => print 'd', 'q' depending on the VEX.W bit
2300 "BW" => print 'b' or 'w' depending on the EVEX.W bit
2301 "LP" => print 'w' or 'l' ('d' in Intel mode) if instruction has
2302 an operand size prefix, or suffix_always is true. print
2303 'q' if rex prefix is present.
2305 Many of the above letters print nothing in Intel mode. See "putop"
2308 Braces '{' and '}', and vertical bars '|', indicate alternative
2309 mnemonic strings for AT&T and Intel. */
2311 static const struct dis386 dis386
[] = {
2313 { "addB", { Ebh1
, Gb
}, 0 },
2314 { "addS", { Evh1
, Gv
}, 0 },
2315 { "addB", { Gb
, EbS
}, 0 },
2316 { "addS", { Gv
, EvS
}, 0 },
2317 { "addB", { AL
, Ib
}, 0 },
2318 { "addS", { eAX
, Iv
}, 0 },
2319 { X86_64_TABLE (X86_64_06
) },
2320 { X86_64_TABLE (X86_64_07
) },
2322 { "orB", { Ebh1
, Gb
}, 0 },
2323 { "orS", { Evh1
, Gv
}, 0 },
2324 { "orB", { Gb
, EbS
}, 0 },
2325 { "orS", { Gv
, EvS
}, 0 },
2326 { "orB", { AL
, Ib
}, 0 },
2327 { "orS", { eAX
, Iv
}, 0 },
2328 { X86_64_TABLE (X86_64_0E
) },
2329 { Bad_Opcode
}, /* 0x0f extended opcode escape */
2331 { "adcB", { Ebh1
, Gb
}, 0 },
2332 { "adcS", { Evh1
, Gv
}, 0 },
2333 { "adcB", { Gb
, EbS
}, 0 },
2334 { "adcS", { Gv
, EvS
}, 0 },
2335 { "adcB", { AL
, Ib
}, 0 },
2336 { "adcS", { eAX
, Iv
}, 0 },
2337 { X86_64_TABLE (X86_64_16
) },
2338 { X86_64_TABLE (X86_64_17
) },
2340 { "sbbB", { Ebh1
, Gb
}, 0 },
2341 { "sbbS", { Evh1
, Gv
}, 0 },
2342 { "sbbB", { Gb
, EbS
}, 0 },
2343 { "sbbS", { Gv
, EvS
}, 0 },
2344 { "sbbB", { AL
, Ib
}, 0 },
2345 { "sbbS", { eAX
, Iv
}, 0 },
2346 { X86_64_TABLE (X86_64_1E
) },
2347 { X86_64_TABLE (X86_64_1F
) },
2349 { "andB", { Ebh1
, Gb
}, 0 },
2350 { "andS", { Evh1
, Gv
}, 0 },
2351 { "andB", { Gb
, EbS
}, 0 },
2352 { "andS", { Gv
, EvS
}, 0 },
2353 { "andB", { AL
, Ib
}, 0 },
2354 { "andS", { eAX
, Iv
}, 0 },
2355 { Bad_Opcode
}, /* SEG ES prefix */
2356 { X86_64_TABLE (X86_64_27
) },
2358 { "subB", { Ebh1
, Gb
}, 0 },
2359 { "subS", { Evh1
, Gv
}, 0 },
2360 { "subB", { Gb
, EbS
}, 0 },
2361 { "subS", { Gv
, EvS
}, 0 },
2362 { "subB", { AL
, Ib
}, 0 },
2363 { "subS", { eAX
, Iv
}, 0 },
2364 { Bad_Opcode
}, /* SEG CS prefix */
2365 { X86_64_TABLE (X86_64_2F
) },
2367 { "xorB", { Ebh1
, Gb
}, 0 },
2368 { "xorS", { Evh1
, Gv
}, 0 },
2369 { "xorB", { Gb
, EbS
}, 0 },
2370 { "xorS", { Gv
, EvS
}, 0 },
2371 { "xorB", { AL
, Ib
}, 0 },
2372 { "xorS", { eAX
, Iv
}, 0 },
2373 { Bad_Opcode
}, /* SEG SS prefix */
2374 { X86_64_TABLE (X86_64_37
) },
2376 { "cmpB", { Eb
, Gb
}, 0 },
2377 { "cmpS", { Ev
, Gv
}, 0 },
2378 { "cmpB", { Gb
, EbS
}, 0 },
2379 { "cmpS", { Gv
, EvS
}, 0 },
2380 { "cmpB", { AL
, Ib
}, 0 },
2381 { "cmpS", { eAX
, Iv
}, 0 },
2382 { Bad_Opcode
}, /* SEG DS prefix */
2383 { X86_64_TABLE (X86_64_3F
) },
2385 { "inc{S|}", { RMeAX
}, 0 },
2386 { "inc{S|}", { RMeCX
}, 0 },
2387 { "inc{S|}", { RMeDX
}, 0 },
2388 { "inc{S|}", { RMeBX
}, 0 },
2389 { "inc{S|}", { RMeSP
}, 0 },
2390 { "inc{S|}", { RMeBP
}, 0 },
2391 { "inc{S|}", { RMeSI
}, 0 },
2392 { "inc{S|}", { RMeDI
}, 0 },
2394 { "dec{S|}", { RMeAX
}, 0 },
2395 { "dec{S|}", { RMeCX
}, 0 },
2396 { "dec{S|}", { RMeDX
}, 0 },
2397 { "dec{S|}", { RMeBX
}, 0 },
2398 { "dec{S|}", { RMeSP
}, 0 },
2399 { "dec{S|}", { RMeBP
}, 0 },
2400 { "dec{S|}", { RMeSI
}, 0 },
2401 { "dec{S|}", { RMeDI
}, 0 },
2403 { "pushV", { RMrAX
}, 0 },
2404 { "pushV", { RMrCX
}, 0 },
2405 { "pushV", { RMrDX
}, 0 },
2406 { "pushV", { RMrBX
}, 0 },
2407 { "pushV", { RMrSP
}, 0 },
2408 { "pushV", { RMrBP
}, 0 },
2409 { "pushV", { RMrSI
}, 0 },
2410 { "pushV", { RMrDI
}, 0 },
2412 { "popV", { RMrAX
}, 0 },
2413 { "popV", { RMrCX
}, 0 },
2414 { "popV", { RMrDX
}, 0 },
2415 { "popV", { RMrBX
}, 0 },
2416 { "popV", { RMrSP
}, 0 },
2417 { "popV", { RMrBP
}, 0 },
2418 { "popV", { RMrSI
}, 0 },
2419 { "popV", { RMrDI
}, 0 },
2421 { X86_64_TABLE (X86_64_60
) },
2422 { X86_64_TABLE (X86_64_61
) },
2423 { X86_64_TABLE (X86_64_62
) },
2424 { X86_64_TABLE (X86_64_63
) },
2425 { Bad_Opcode
}, /* seg fs */
2426 { Bad_Opcode
}, /* seg gs */
2427 { Bad_Opcode
}, /* op size prefix */
2428 { Bad_Opcode
}, /* adr size prefix */
2430 { "pushT", { sIv
}, 0 },
2431 { "imulS", { Gv
, Ev
, Iv
}, 0 },
2432 { "pushT", { sIbT
}, 0 },
2433 { "imulS", { Gv
, Ev
, sIb
}, 0 },
2434 { "ins{b|}", { Ybr
, indirDX
}, 0 },
2435 { X86_64_TABLE (X86_64_6D
) },
2436 { "outs{b|}", { indirDXr
, Xb
}, 0 },
2437 { X86_64_TABLE (X86_64_6F
) },
2439 { "joH", { Jb
, BND
, cond_jump_flag
}, 0 },
2440 { "jnoH", { Jb
, BND
, cond_jump_flag
}, 0 },
2441 { "jbH", { Jb
, BND
, cond_jump_flag
}, 0 },
2442 { "jaeH", { Jb
, BND
, cond_jump_flag
}, 0 },
2443 { "jeH", { Jb
, BND
, cond_jump_flag
}, 0 },
2444 { "jneH", { Jb
, BND
, cond_jump_flag
}, 0 },
2445 { "jbeH", { Jb
, BND
, cond_jump_flag
}, 0 },
2446 { "jaH", { Jb
, BND
, cond_jump_flag
}, 0 },
2448 { "jsH", { Jb
, BND
, cond_jump_flag
}, 0 },
2449 { "jnsH", { Jb
, BND
, cond_jump_flag
}, 0 },
2450 { "jpH", { Jb
, BND
, cond_jump_flag
}, 0 },
2451 { "jnpH", { Jb
, BND
, cond_jump_flag
}, 0 },
2452 { "jlH", { Jb
, BND
, cond_jump_flag
}, 0 },
2453 { "jgeH", { Jb
, BND
, cond_jump_flag
}, 0 },
2454 { "jleH", { Jb
, BND
, cond_jump_flag
}, 0 },
2455 { "jgH", { Jb
, BND
, cond_jump_flag
}, 0 },
2457 { REG_TABLE (REG_80
) },
2458 { REG_TABLE (REG_81
) },
2459 { X86_64_TABLE (X86_64_82
) },
2460 { REG_TABLE (REG_83
) },
2461 { "testB", { Eb
, Gb
}, 0 },
2462 { "testS", { Ev
, Gv
}, 0 },
2463 { "xchgB", { Ebh2
, Gb
}, 0 },
2464 { "xchgS", { Evh2
, Gv
}, 0 },
2466 { "movB", { Ebh3
, Gb
}, 0 },
2467 { "movS", { Evh3
, Gv
}, 0 },
2468 { "movB", { Gb
, EbS
}, 0 },
2469 { "movS", { Gv
, EvS
}, 0 },
2470 { "movD", { Sv
, Sw
}, 0 },
2471 { MOD_TABLE (MOD_8D
) },
2472 { "movD", { Sw
, Sv
}, 0 },
2473 { REG_TABLE (REG_8F
) },
2475 { PREFIX_TABLE (PREFIX_90
) },
2476 { "xchgS", { RMeCX
, eAX
}, 0 },
2477 { "xchgS", { RMeDX
, eAX
}, 0 },
2478 { "xchgS", { RMeBX
, eAX
}, 0 },
2479 { "xchgS", { RMeSP
, eAX
}, 0 },
2480 { "xchgS", { RMeBP
, eAX
}, 0 },
2481 { "xchgS", { RMeSI
, eAX
}, 0 },
2482 { "xchgS", { RMeDI
, eAX
}, 0 },
2484 { "cW{t|}R", { XX
}, 0 },
2485 { "cR{t|}O", { XX
}, 0 },
2486 { X86_64_TABLE (X86_64_9A
) },
2487 { Bad_Opcode
}, /* fwait */
2488 { "pushfT", { XX
}, 0 },
2489 { "popfT", { XX
}, 0 },
2490 { "sahf", { XX
}, 0 },
2491 { "lahf", { XX
}, 0 },
2493 { "mov%LB", { AL
, Ob
}, 0 },
2494 { "mov%LS", { eAX
, Ov
}, 0 },
2495 { "mov%LB", { Ob
, AL
}, 0 },
2496 { "mov%LS", { Ov
, eAX
}, 0 },
2497 { "movs{b|}", { Ybr
, Xb
}, 0 },
2498 { "movs{R|}", { Yvr
, Xv
}, 0 },
2499 { "cmps{b|}", { Xb
, Yb
}, 0 },
2500 { "cmps{R|}", { Xv
, Yv
}, 0 },
2502 { "testB", { AL
, Ib
}, 0 },
2503 { "testS", { eAX
, Iv
}, 0 },
2504 { "stosB", { Ybr
, AL
}, 0 },
2505 { "stosS", { Yvr
, eAX
}, 0 },
2506 { "lodsB", { ALr
, Xb
}, 0 },
2507 { "lodsS", { eAXr
, Xv
}, 0 },
2508 { "scasB", { AL
, Yb
}, 0 },
2509 { "scasS", { eAX
, Yv
}, 0 },
2511 { "movB", { RMAL
, Ib
}, 0 },
2512 { "movB", { RMCL
, Ib
}, 0 },
2513 { "movB", { RMDL
, Ib
}, 0 },
2514 { "movB", { RMBL
, Ib
}, 0 },
2515 { "movB", { RMAH
, Ib
}, 0 },
2516 { "movB", { RMCH
, Ib
}, 0 },
2517 { "movB", { RMDH
, Ib
}, 0 },
2518 { "movB", { RMBH
, Ib
}, 0 },
2520 { "mov%LV", { RMeAX
, Iv64
}, 0 },
2521 { "mov%LV", { RMeCX
, Iv64
}, 0 },
2522 { "mov%LV", { RMeDX
, Iv64
}, 0 },
2523 { "mov%LV", { RMeBX
, Iv64
}, 0 },
2524 { "mov%LV", { RMeSP
, Iv64
}, 0 },
2525 { "mov%LV", { RMeBP
, Iv64
}, 0 },
2526 { "mov%LV", { RMeSI
, Iv64
}, 0 },
2527 { "mov%LV", { RMeDI
, Iv64
}, 0 },
2529 { REG_TABLE (REG_C0
) },
2530 { REG_TABLE (REG_C1
) },
2531 { X86_64_TABLE (X86_64_C2
) },
2532 { X86_64_TABLE (X86_64_C3
) },
2533 { X86_64_TABLE (X86_64_C4
) },
2534 { X86_64_TABLE (X86_64_C5
) },
2535 { REG_TABLE (REG_C6
) },
2536 { REG_TABLE (REG_C7
) },
2538 { "enterT", { Iw
, Ib
}, 0 },
2539 { "leaveT", { XX
}, 0 },
2540 { "{l|}ret{|f}P", { Iw
}, 0 },
2541 { "{l|}ret{|f}P", { XX
}, 0 },
2542 { "int3", { XX
}, 0 },
2543 { "int", { Ib
}, 0 },
2544 { X86_64_TABLE (X86_64_CE
) },
2545 { "iret%LP", { XX
}, 0 },
2547 { REG_TABLE (REG_D0
) },
2548 { REG_TABLE (REG_D1
) },
2549 { REG_TABLE (REG_D2
) },
2550 { REG_TABLE (REG_D3
) },
2551 { X86_64_TABLE (X86_64_D4
) },
2552 { X86_64_TABLE (X86_64_D5
) },
2554 { "xlat", { DSBX
}, 0 },
2565 { "loopneFH", { Jb
, XX
, loop_jcxz_flag
}, 0 },
2566 { "loopeFH", { Jb
, XX
, loop_jcxz_flag
}, 0 },
2567 { "loopFH", { Jb
, XX
, loop_jcxz_flag
}, 0 },
2568 { "jEcxzH", { Jb
, XX
, loop_jcxz_flag
}, 0 },
2569 { "inB", { AL
, Ib
}, 0 },
2570 { "inG", { zAX
, Ib
}, 0 },
2571 { "outB", { Ib
, AL
}, 0 },
2572 { "outG", { Ib
, zAX
}, 0 },
2574 { X86_64_TABLE (X86_64_E8
) },
2575 { X86_64_TABLE (X86_64_E9
) },
2576 { X86_64_TABLE (X86_64_EA
) },
2577 { "jmp", { Jb
, BND
}, 0 },
2578 { "inB", { AL
, indirDX
}, 0 },
2579 { "inG", { zAX
, indirDX
}, 0 },
2580 { "outB", { indirDX
, AL
}, 0 },
2581 { "outG", { indirDX
, zAX
}, 0 },
2583 { Bad_Opcode
}, /* lock prefix */
2584 { "icebp", { XX
}, 0 },
2585 { Bad_Opcode
}, /* repne */
2586 { Bad_Opcode
}, /* repz */
2587 { "hlt", { XX
}, 0 },
2588 { "cmc", { XX
}, 0 },
2589 { REG_TABLE (REG_F6
) },
2590 { REG_TABLE (REG_F7
) },
2592 { "clc", { XX
}, 0 },
2593 { "stc", { XX
}, 0 },
2594 { "cli", { XX
}, 0 },
2595 { "sti", { XX
}, 0 },
2596 { "cld", { XX
}, 0 },
2597 { "std", { XX
}, 0 },
2598 { REG_TABLE (REG_FE
) },
2599 { REG_TABLE (REG_FF
) },
2602 static const struct dis386 dis386_twobyte
[] = {
2604 { REG_TABLE (REG_0F00
) },
2605 { REG_TABLE (REG_0F01
) },
2606 { "larS", { Gv
, Ew
}, 0 },
2607 { "lslS", { Gv
, Ew
}, 0 },
2609 { "syscall", { XX
}, 0 },
2610 { "clts", { XX
}, 0 },
2611 { "sysret%LQ", { XX
}, 0 },
2613 { "invd", { XX
}, 0 },
2614 { PREFIX_TABLE (PREFIX_0F09
) },
2616 { "ud2", { XX
}, 0 },
2618 { REG_TABLE (REG_0F0D
) },
2619 { "femms", { XX
}, 0 },
2620 { "", { MX
, EM
, OPSUF
}, 0 }, /* See OP_3DNowSuffix. */
2622 { PREFIX_TABLE (PREFIX_0F10
) },
2623 { PREFIX_TABLE (PREFIX_0F11
) },
2624 { PREFIX_TABLE (PREFIX_0F12
) },
2625 { MOD_TABLE (MOD_0F13
) },
2626 { "unpcklpX", { XM
, EXx
}, PREFIX_OPCODE
},
2627 { "unpckhpX", { XM
, EXx
}, PREFIX_OPCODE
},
2628 { PREFIX_TABLE (PREFIX_0F16
) },
2629 { MOD_TABLE (MOD_0F17
) },
2631 { REG_TABLE (REG_0F18
) },
2632 { "nopQ", { Ev
}, 0 },
2633 { PREFIX_TABLE (PREFIX_0F1A
) },
2634 { PREFIX_TABLE (PREFIX_0F1B
) },
2635 { PREFIX_TABLE (PREFIX_0F1C
) },
2636 { "nopQ", { Ev
}, 0 },
2637 { PREFIX_TABLE (PREFIX_0F1E
) },
2638 { "nopQ", { Ev
}, 0 },
2640 { "movZ", { Rm
, Cm
}, 0 },
2641 { "movZ", { Rm
, Dm
}, 0 },
2642 { "movZ", { Cm
, Rm
}, 0 },
2643 { "movZ", { Dm
, Rm
}, 0 },
2644 { MOD_TABLE (MOD_0F24
) },
2646 { MOD_TABLE (MOD_0F26
) },
2649 { "movapX", { XM
, EXx
}, PREFIX_OPCODE
},
2650 { "movapX", { EXxS
, XM
}, PREFIX_OPCODE
},
2651 { PREFIX_TABLE (PREFIX_0F2A
) },
2652 { PREFIX_TABLE (PREFIX_0F2B
) },
2653 { PREFIX_TABLE (PREFIX_0F2C
) },
2654 { PREFIX_TABLE (PREFIX_0F2D
) },
2655 { PREFIX_TABLE (PREFIX_0F2E
) },
2656 { PREFIX_TABLE (PREFIX_0F2F
) },
2658 { "wrmsr", { XX
}, 0 },
2659 { "rdtsc", { XX
}, 0 },
2660 { "rdmsr", { XX
}, 0 },
2661 { "rdpmc", { XX
}, 0 },
2662 { "sysenter", { SEP
}, 0 },
2663 { "sysexit", { SEP
}, 0 },
2665 { "getsec", { XX
}, 0 },
2667 { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F38
, PREFIX_OPCODE
) },
2669 { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F3A
, PREFIX_OPCODE
) },
2676 { "cmovoS", { Gv
, Ev
}, 0 },
2677 { "cmovnoS", { Gv
, Ev
}, 0 },
2678 { "cmovbS", { Gv
, Ev
}, 0 },
2679 { "cmovaeS", { Gv
, Ev
}, 0 },
2680 { "cmoveS", { Gv
, Ev
}, 0 },
2681 { "cmovneS", { Gv
, Ev
}, 0 },
2682 { "cmovbeS", { Gv
, Ev
}, 0 },
2683 { "cmovaS", { Gv
, Ev
}, 0 },
2685 { "cmovsS", { Gv
, Ev
}, 0 },
2686 { "cmovnsS", { Gv
, Ev
}, 0 },
2687 { "cmovpS", { Gv
, Ev
}, 0 },
2688 { "cmovnpS", { Gv
, Ev
}, 0 },
2689 { "cmovlS", { Gv
, Ev
}, 0 },
2690 { "cmovgeS", { Gv
, Ev
}, 0 },
2691 { "cmovleS", { Gv
, Ev
}, 0 },
2692 { "cmovgS", { Gv
, Ev
}, 0 },
2694 { MOD_TABLE (MOD_0F50
) },
2695 { PREFIX_TABLE (PREFIX_0F51
) },
2696 { PREFIX_TABLE (PREFIX_0F52
) },
2697 { PREFIX_TABLE (PREFIX_0F53
) },
2698 { "andpX", { XM
, EXx
}, PREFIX_OPCODE
},
2699 { "andnpX", { XM
, EXx
}, PREFIX_OPCODE
},
2700 { "orpX", { XM
, EXx
}, PREFIX_OPCODE
},
2701 { "xorpX", { XM
, EXx
}, PREFIX_OPCODE
},
2703 { PREFIX_TABLE (PREFIX_0F58
) },
2704 { PREFIX_TABLE (PREFIX_0F59
) },
2705 { PREFIX_TABLE (PREFIX_0F5A
) },
2706 { PREFIX_TABLE (PREFIX_0F5B
) },
2707 { PREFIX_TABLE (PREFIX_0F5C
) },
2708 { PREFIX_TABLE (PREFIX_0F5D
) },
2709 { PREFIX_TABLE (PREFIX_0F5E
) },
2710 { PREFIX_TABLE (PREFIX_0F5F
) },
2712 { PREFIX_TABLE (PREFIX_0F60
) },
2713 { PREFIX_TABLE (PREFIX_0F61
) },
2714 { PREFIX_TABLE (PREFIX_0F62
) },
2715 { "packsswb", { MX
, EM
}, PREFIX_OPCODE
},
2716 { "pcmpgtb", { MX
, EM
}, PREFIX_OPCODE
},
2717 { "pcmpgtw", { MX
, EM
}, PREFIX_OPCODE
},
2718 { "pcmpgtd", { MX
, EM
}, PREFIX_OPCODE
},
2719 { "packuswb", { MX
, EM
}, PREFIX_OPCODE
},
2721 { "punpckhbw", { MX
, EM
}, PREFIX_OPCODE
},
2722 { "punpckhwd", { MX
, EM
}, PREFIX_OPCODE
},
2723 { "punpckhdq", { MX
, EM
}, PREFIX_OPCODE
},
2724 { "packssdw", { MX
, EM
}, PREFIX_OPCODE
},
2725 { PREFIX_TABLE (PREFIX_0F6C
) },
2726 { PREFIX_TABLE (PREFIX_0F6D
) },
2727 { "movK", { MX
, Edq
}, PREFIX_OPCODE
},
2728 { PREFIX_TABLE (PREFIX_0F6F
) },
2730 { PREFIX_TABLE (PREFIX_0F70
) },
2731 { REG_TABLE (REG_0F71
) },
2732 { REG_TABLE (REG_0F72
) },
2733 { REG_TABLE (REG_0F73
) },
2734 { "pcmpeqb", { MX
, EM
}, PREFIX_OPCODE
},
2735 { "pcmpeqw", { MX
, EM
}, PREFIX_OPCODE
},
2736 { "pcmpeqd", { MX
, EM
}, PREFIX_OPCODE
},
2737 { "emms", { XX
}, PREFIX_OPCODE
},
2739 { PREFIX_TABLE (PREFIX_0F78
) },
2740 { PREFIX_TABLE (PREFIX_0F79
) },
2743 { PREFIX_TABLE (PREFIX_0F7C
) },
2744 { PREFIX_TABLE (PREFIX_0F7D
) },
2745 { PREFIX_TABLE (PREFIX_0F7E
) },
2746 { PREFIX_TABLE (PREFIX_0F7F
) },
2748 { "joH", { Jv
, BND
, cond_jump_flag
}, 0 },
2749 { "jnoH", { Jv
, BND
, cond_jump_flag
}, 0 },
2750 { "jbH", { Jv
, BND
, cond_jump_flag
}, 0 },
2751 { "jaeH", { Jv
, BND
, cond_jump_flag
}, 0 },
2752 { "jeH", { Jv
, BND
, cond_jump_flag
}, 0 },
2753 { "jneH", { Jv
, BND
, cond_jump_flag
}, 0 },
2754 { "jbeH", { Jv
, BND
, cond_jump_flag
}, 0 },
2755 { "jaH", { Jv
, BND
, cond_jump_flag
}, 0 },
2757 { "jsH", { Jv
, BND
, cond_jump_flag
}, 0 },
2758 { "jnsH", { Jv
, BND
, cond_jump_flag
}, 0 },
2759 { "jpH", { Jv
, BND
, cond_jump_flag
}, 0 },
2760 { "jnpH", { Jv
, BND
, cond_jump_flag
}, 0 },
2761 { "jlH", { Jv
, BND
, cond_jump_flag
}, 0 },
2762 { "jgeH", { Jv
, BND
, cond_jump_flag
}, 0 },
2763 { "jleH", { Jv
, BND
, cond_jump_flag
}, 0 },
2764 { "jgH", { Jv
, BND
, cond_jump_flag
}, 0 },
2766 { "seto", { Eb
}, 0 },
2767 { "setno", { Eb
}, 0 },
2768 { "setb", { Eb
}, 0 },
2769 { "setae", { Eb
}, 0 },
2770 { "sete", { Eb
}, 0 },
2771 { "setne", { Eb
}, 0 },
2772 { "setbe", { Eb
}, 0 },
2773 { "seta", { Eb
}, 0 },
2775 { "sets", { Eb
}, 0 },
2776 { "setns", { Eb
}, 0 },
2777 { "setp", { Eb
}, 0 },
2778 { "setnp", { Eb
}, 0 },
2779 { "setl", { Eb
}, 0 },
2780 { "setge", { Eb
}, 0 },
2781 { "setle", { Eb
}, 0 },
2782 { "setg", { Eb
}, 0 },
2784 { "pushT", { fs
}, 0 },
2785 { "popT", { fs
}, 0 },
2786 { "cpuid", { XX
}, 0 },
2787 { "btS", { Ev
, Gv
}, 0 },
2788 { "shldS", { Ev
, Gv
, Ib
}, 0 },
2789 { "shldS", { Ev
, Gv
, CL
}, 0 },
2790 { REG_TABLE (REG_0FA6
) },
2791 { REG_TABLE (REG_0FA7
) },
2793 { "pushT", { gs
}, 0 },
2794 { "popT", { gs
}, 0 },
2795 { "rsm", { XX
}, 0 },
2796 { "btsS", { Evh1
, Gv
}, 0 },
2797 { "shrdS", { Ev
, Gv
, Ib
}, 0 },
2798 { "shrdS", { Ev
, Gv
, CL
}, 0 },
2799 { REG_TABLE (REG_0FAE
) },
2800 { "imulS", { Gv
, Ev
}, 0 },
2802 { "cmpxchgB", { Ebh1
, Gb
}, 0 },
2803 { "cmpxchgS", { Evh1
, Gv
}, 0 },
2804 { MOD_TABLE (MOD_0FB2
) },
2805 { "btrS", { Evh1
, Gv
}, 0 },
2806 { MOD_TABLE (MOD_0FB4
) },
2807 { MOD_TABLE (MOD_0FB5
) },
2808 { "movz{bR|x}", { Gv
, Eb
}, 0 },
2809 { "movz{wR|x}", { Gv
, Ew
}, 0 }, /* yes, there really is movzww ! */
2811 { PREFIX_TABLE (PREFIX_0FB8
) },
2812 { "ud1S", { Gv
, Ev
}, 0 },
2813 { REG_TABLE (REG_0FBA
) },
2814 { "btcS", { Evh1
, Gv
}, 0 },
2815 { PREFIX_TABLE (PREFIX_0FBC
) },
2816 { PREFIX_TABLE (PREFIX_0FBD
) },
2817 { "movs{bR|x}", { Gv
, Eb
}, 0 },
2818 { "movs{wR|x}", { Gv
, Ew
}, 0 }, /* yes, there really is movsww ! */
2820 { "xaddB", { Ebh1
, Gb
}, 0 },
2821 { "xaddS", { Evh1
, Gv
}, 0 },
2822 { PREFIX_TABLE (PREFIX_0FC2
) },
2823 { MOD_TABLE (MOD_0FC3
) },
2824 { "pinsrw", { MX
, Edqw
, Ib
}, PREFIX_OPCODE
},
2825 { "pextrw", { Gdq
, MS
, Ib
}, PREFIX_OPCODE
},
2826 { "shufpX", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
2827 { REG_TABLE (REG_0FC7
) },
2829 { "bswap", { RMeAX
}, 0 },
2830 { "bswap", { RMeCX
}, 0 },
2831 { "bswap", { RMeDX
}, 0 },
2832 { "bswap", { RMeBX
}, 0 },
2833 { "bswap", { RMeSP
}, 0 },
2834 { "bswap", { RMeBP
}, 0 },
2835 { "bswap", { RMeSI
}, 0 },
2836 { "bswap", { RMeDI
}, 0 },
2838 { PREFIX_TABLE (PREFIX_0FD0
) },
2839 { "psrlw", { MX
, EM
}, PREFIX_OPCODE
},
2840 { "psrld", { MX
, EM
}, PREFIX_OPCODE
},
2841 { "psrlq", { MX
, EM
}, PREFIX_OPCODE
},
2842 { "paddq", { MX
, EM
}, PREFIX_OPCODE
},
2843 { "pmullw", { MX
, EM
}, PREFIX_OPCODE
},
2844 { PREFIX_TABLE (PREFIX_0FD6
) },
2845 { MOD_TABLE (MOD_0FD7
) },
2847 { "psubusb", { MX
, EM
}, PREFIX_OPCODE
},
2848 { "psubusw", { MX
, EM
}, PREFIX_OPCODE
},
2849 { "pminub", { MX
, EM
}, PREFIX_OPCODE
},
2850 { "pand", { MX
, EM
}, PREFIX_OPCODE
},
2851 { "paddusb", { MX
, EM
}, PREFIX_OPCODE
},
2852 { "paddusw", { MX
, EM
}, PREFIX_OPCODE
},
2853 { "pmaxub", { MX
, EM
}, PREFIX_OPCODE
},
2854 { "pandn", { MX
, EM
}, PREFIX_OPCODE
},
2856 { "pavgb", { MX
, EM
}, PREFIX_OPCODE
},
2857 { "psraw", { MX
, EM
}, PREFIX_OPCODE
},
2858 { "psrad", { MX
, EM
}, PREFIX_OPCODE
},
2859 { "pavgw", { MX
, EM
}, PREFIX_OPCODE
},
2860 { "pmulhuw", { MX
, EM
}, PREFIX_OPCODE
},
2861 { "pmulhw", { MX
, EM
}, PREFIX_OPCODE
},
2862 { PREFIX_TABLE (PREFIX_0FE6
) },
2863 { PREFIX_TABLE (PREFIX_0FE7
) },
2865 { "psubsb", { MX
, EM
}, PREFIX_OPCODE
},
2866 { "psubsw", { MX
, EM
}, PREFIX_OPCODE
},
2867 { "pminsw", { MX
, EM
}, PREFIX_OPCODE
},
2868 { "por", { MX
, EM
}, PREFIX_OPCODE
},
2869 { "paddsb", { MX
, EM
}, PREFIX_OPCODE
},
2870 { "paddsw", { MX
, EM
}, PREFIX_OPCODE
},
2871 { "pmaxsw", { MX
, EM
}, PREFIX_OPCODE
},
2872 { "pxor", { MX
, EM
}, PREFIX_OPCODE
},
2874 { PREFIX_TABLE (PREFIX_0FF0
) },
2875 { "psllw", { MX
, EM
}, PREFIX_OPCODE
},
2876 { "pslld", { MX
, EM
}, PREFIX_OPCODE
},
2877 { "psllq", { MX
, EM
}, PREFIX_OPCODE
},
2878 { "pmuludq", { MX
, EM
}, PREFIX_OPCODE
},
2879 { "pmaddwd", { MX
, EM
}, PREFIX_OPCODE
},
2880 { "psadbw", { MX
, EM
}, PREFIX_OPCODE
},
2881 { PREFIX_TABLE (PREFIX_0FF7
) },
2883 { "psubb", { MX
, EM
}, PREFIX_OPCODE
},
2884 { "psubw", { MX
, EM
}, PREFIX_OPCODE
},
2885 { "psubd", { MX
, EM
}, PREFIX_OPCODE
},
2886 { "psubq", { MX
, EM
}, PREFIX_OPCODE
},
2887 { "paddb", { MX
, EM
}, PREFIX_OPCODE
},
2888 { "paddw", { MX
, EM
}, PREFIX_OPCODE
},
2889 { "paddd", { MX
, EM
}, PREFIX_OPCODE
},
2890 { "ud0S", { Gv
, Ev
}, 0 },
2893 static const unsigned char onebyte_has_modrm
[256] = {
2894 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2895 /* ------------------------------- */
2896 /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
2897 /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
2898 /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
2899 /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
2900 /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
2901 /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
2902 /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
2903 /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
2904 /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
2905 /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
2906 /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
2907 /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
2908 /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
2909 /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
2910 /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
2911 /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1 /* f0 */
2912 /* ------------------------------- */
2913 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2916 static const unsigned char twobyte_has_modrm
[256] = {
2917 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2918 /* ------------------------------- */
2919 /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
2920 /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
2921 /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
2922 /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
2923 /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
2924 /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
2925 /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
2926 /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
2927 /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
2928 /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
2929 /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
2930 /* b0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* bf */
2931 /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
2932 /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
2933 /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
2934 /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 /* ff */
2935 /* ------------------------------- */
2936 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2939 static char obuf
[100];
2941 static char *mnemonicendp
;
2942 static char scratchbuf
[100];
2943 static unsigned char *start_codep
;
2944 static unsigned char *insn_codep
;
2945 static unsigned char *codep
;
2946 static unsigned char *end_codep
;
2947 static int last_lock_prefix
;
2948 static int last_repz_prefix
;
2949 static int last_repnz_prefix
;
2950 static int last_data_prefix
;
2951 static int last_addr_prefix
;
2952 static int last_rex_prefix
;
2953 static int last_seg_prefix
;
2954 static int fwait_prefix
;
2955 /* The active segment register prefix. */
2956 static int active_seg_prefix
;
2957 #define MAX_CODE_LENGTH 15
2958 /* We can up to 14 prefixes since the maximum instruction length is
2960 static int all_prefixes
[MAX_CODE_LENGTH
- 1];
2961 static disassemble_info
*the_info
;
2969 static unsigned char need_modrm
;
2979 int register_specifier
;
2986 int mask_register_specifier
;
2992 static unsigned char need_vex
;
2993 static unsigned char need_vex_reg
;
3001 /* If we are accessing mod/rm/reg without need_modrm set, then the
3002 values are stale. Hitting this abort likely indicates that you
3003 need to update onebyte_has_modrm or twobyte_has_modrm. */
3004 #define MODRM_CHECK if (!need_modrm) abort ()
3006 static const char **names64
;
3007 static const char **names32
;
3008 static const char **names16
;
3009 static const char **names8
;
3010 static const char **names8rex
;
3011 static const char **names_seg
;
3012 static const char *index64
;
3013 static const char *index32
;
3014 static const char **index16
;
3015 static const char **names_bnd
;
3017 static const char *intel_names64
[] = {
3018 "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
3019 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
3021 static const char *intel_names32
[] = {
3022 "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
3023 "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
3025 static const char *intel_names16
[] = {
3026 "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
3027 "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
3029 static const char *intel_names8
[] = {
3030 "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
3032 static const char *intel_names8rex
[] = {
3033 "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
3034 "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
3036 static const char *intel_names_seg
[] = {
3037 "es", "cs", "ss", "ds", "fs", "gs", "?", "?",
3039 static const char *intel_index64
= "riz";
3040 static const char *intel_index32
= "eiz";
3041 static const char *intel_index16
[] = {
3042 "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
3045 static const char *att_names64
[] = {
3046 "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
3047 "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
3049 static const char *att_names32
[] = {
3050 "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
3051 "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
3053 static const char *att_names16
[] = {
3054 "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
3055 "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
3057 static const char *att_names8
[] = {
3058 "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
3060 static const char *att_names8rex
[] = {
3061 "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
3062 "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
3064 static const char *att_names_seg
[] = {
3065 "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
3067 static const char *att_index64
= "%riz";
3068 static const char *att_index32
= "%eiz";
3069 static const char *att_index16
[] = {
3070 "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
3073 static const char **names_mm
;
3074 static const char *intel_names_mm
[] = {
3075 "mm0", "mm1", "mm2", "mm3",
3076 "mm4", "mm5", "mm6", "mm7"
3078 static const char *att_names_mm
[] = {
3079 "%mm0", "%mm1", "%mm2", "%mm3",
3080 "%mm4", "%mm5", "%mm6", "%mm7"
3083 static const char *intel_names_bnd
[] = {
3084 "bnd0", "bnd1", "bnd2", "bnd3"
3087 static const char *att_names_bnd
[] = {
3088 "%bnd0", "%bnd1", "%bnd2", "%bnd3"
3091 static const char **names_xmm
;
3092 static const char *intel_names_xmm
[] = {
3093 "xmm0", "xmm1", "xmm2", "xmm3",
3094 "xmm4", "xmm5", "xmm6", "xmm7",
3095 "xmm8", "xmm9", "xmm10", "xmm11",
3096 "xmm12", "xmm13", "xmm14", "xmm15",
3097 "xmm16", "xmm17", "xmm18", "xmm19",
3098 "xmm20", "xmm21", "xmm22", "xmm23",
3099 "xmm24", "xmm25", "xmm26", "xmm27",
3100 "xmm28", "xmm29", "xmm30", "xmm31"
3102 static const char *att_names_xmm
[] = {
3103 "%xmm0", "%xmm1", "%xmm2", "%xmm3",
3104 "%xmm4", "%xmm5", "%xmm6", "%xmm7",
3105 "%xmm8", "%xmm9", "%xmm10", "%xmm11",
3106 "%xmm12", "%xmm13", "%xmm14", "%xmm15",
3107 "%xmm16", "%xmm17", "%xmm18", "%xmm19",
3108 "%xmm20", "%xmm21", "%xmm22", "%xmm23",
3109 "%xmm24", "%xmm25", "%xmm26", "%xmm27",
3110 "%xmm28", "%xmm29", "%xmm30", "%xmm31"
3113 static const char **names_ymm
;
3114 static const char *intel_names_ymm
[] = {
3115 "ymm0", "ymm1", "ymm2", "ymm3",
3116 "ymm4", "ymm5", "ymm6", "ymm7",
3117 "ymm8", "ymm9", "ymm10", "ymm11",
3118 "ymm12", "ymm13", "ymm14", "ymm15",
3119 "ymm16", "ymm17", "ymm18", "ymm19",
3120 "ymm20", "ymm21", "ymm22", "ymm23",
3121 "ymm24", "ymm25", "ymm26", "ymm27",
3122 "ymm28", "ymm29", "ymm30", "ymm31"
3124 static const char *att_names_ymm
[] = {
3125 "%ymm0", "%ymm1", "%ymm2", "%ymm3",
3126 "%ymm4", "%ymm5", "%ymm6", "%ymm7",
3127 "%ymm8", "%ymm9", "%ymm10", "%ymm11",
3128 "%ymm12", "%ymm13", "%ymm14", "%ymm15",
3129 "%ymm16", "%ymm17", "%ymm18", "%ymm19",
3130 "%ymm20", "%ymm21", "%ymm22", "%ymm23",
3131 "%ymm24", "%ymm25", "%ymm26", "%ymm27",
3132 "%ymm28", "%ymm29", "%ymm30", "%ymm31"
3135 static const char **names_zmm
;
3136 static const char *intel_names_zmm
[] = {
3137 "zmm0", "zmm1", "zmm2", "zmm3",
3138 "zmm4", "zmm5", "zmm6", "zmm7",
3139 "zmm8", "zmm9", "zmm10", "zmm11",
3140 "zmm12", "zmm13", "zmm14", "zmm15",
3141 "zmm16", "zmm17", "zmm18", "zmm19",
3142 "zmm20", "zmm21", "zmm22", "zmm23",
3143 "zmm24", "zmm25", "zmm26", "zmm27",
3144 "zmm28", "zmm29", "zmm30", "zmm31"
3146 static const char *att_names_zmm
[] = {
3147 "%zmm0", "%zmm1", "%zmm2", "%zmm3",
3148 "%zmm4", "%zmm5", "%zmm6", "%zmm7",
3149 "%zmm8", "%zmm9", "%zmm10", "%zmm11",
3150 "%zmm12", "%zmm13", "%zmm14", "%zmm15",
3151 "%zmm16", "%zmm17", "%zmm18", "%zmm19",
3152 "%zmm20", "%zmm21", "%zmm22", "%zmm23",
3153 "%zmm24", "%zmm25", "%zmm26", "%zmm27",
3154 "%zmm28", "%zmm29", "%zmm30", "%zmm31"
3157 static const char **names_tmm
;
3158 static const char *intel_names_tmm
[] = {
3159 "tmm0", "tmm1", "tmm2", "tmm3",
3160 "tmm4", "tmm5", "tmm6", "tmm7"
3162 static const char *att_names_tmm
[] = {
3163 "%tmm0", "%tmm1", "%tmm2", "%tmm3",
3164 "%tmm4", "%tmm5", "%tmm6", "%tmm7"
3167 static const char **names_mask
;
3168 static const char *intel_names_mask
[] = {
3169 "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7"
3171 static const char *att_names_mask
[] = {
3172 "%k0", "%k1", "%k2", "%k3", "%k4", "%k5", "%k6", "%k7"
3175 static const char *names_rounding
[] =
3183 static const struct dis386 reg_table
[][8] = {
3186 { "addA", { Ebh1
, Ib
}, 0 },
3187 { "orA", { Ebh1
, Ib
}, 0 },
3188 { "adcA", { Ebh1
, Ib
}, 0 },
3189 { "sbbA", { Ebh1
, Ib
}, 0 },
3190 { "andA", { Ebh1
, Ib
}, 0 },
3191 { "subA", { Ebh1
, Ib
}, 0 },
3192 { "xorA", { Ebh1
, Ib
}, 0 },
3193 { "cmpA", { Eb
, Ib
}, 0 },
3197 { "addQ", { Evh1
, Iv
}, 0 },
3198 { "orQ", { Evh1
, Iv
}, 0 },
3199 { "adcQ", { Evh1
, Iv
}, 0 },
3200 { "sbbQ", { Evh1
, Iv
}, 0 },
3201 { "andQ", { Evh1
, Iv
}, 0 },
3202 { "subQ", { Evh1
, Iv
}, 0 },
3203 { "xorQ", { Evh1
, Iv
}, 0 },
3204 { "cmpQ", { Ev
, Iv
}, 0 },
3208 { "addQ", { Evh1
, sIb
}, 0 },
3209 { "orQ", { Evh1
, sIb
}, 0 },
3210 { "adcQ", { Evh1
, sIb
}, 0 },
3211 { "sbbQ", { Evh1
, sIb
}, 0 },
3212 { "andQ", { Evh1
, sIb
}, 0 },
3213 { "subQ", { Evh1
, sIb
}, 0 },
3214 { "xorQ", { Evh1
, sIb
}, 0 },
3215 { "cmpQ", { Ev
, sIb
}, 0 },
3219 { "popU", { stackEv
}, 0 },
3220 { XOP_8F_TABLE (XOP_09
) },
3224 { XOP_8F_TABLE (XOP_09
) },
3228 { "rolA", { Eb
, Ib
}, 0 },
3229 { "rorA", { Eb
, Ib
}, 0 },
3230 { "rclA", { Eb
, Ib
}, 0 },
3231 { "rcrA", { Eb
, Ib
}, 0 },
3232 { "shlA", { Eb
, Ib
}, 0 },
3233 { "shrA", { Eb
, Ib
}, 0 },
3234 { "shlA", { Eb
, Ib
}, 0 },
3235 { "sarA", { Eb
, Ib
}, 0 },
3239 { "rolQ", { Ev
, Ib
}, 0 },
3240 { "rorQ", { Ev
, Ib
}, 0 },
3241 { "rclQ", { Ev
, Ib
}, 0 },
3242 { "rcrQ", { Ev
, Ib
}, 0 },
3243 { "shlQ", { Ev
, Ib
}, 0 },
3244 { "shrQ", { Ev
, Ib
}, 0 },
3245 { "shlQ", { Ev
, Ib
}, 0 },
3246 { "sarQ", { Ev
, Ib
}, 0 },
3250 { "movA", { Ebh3
, Ib
}, 0 },
3257 { MOD_TABLE (MOD_C6_REG_7
) },
3261 { "movQ", { Evh3
, Iv
}, 0 },
3268 { MOD_TABLE (MOD_C7_REG_7
) },
3272 { "rolA", { Eb
, I1
}, 0 },
3273 { "rorA", { Eb
, I1
}, 0 },
3274 { "rclA", { Eb
, I1
}, 0 },
3275 { "rcrA", { Eb
, I1
}, 0 },
3276 { "shlA", { Eb
, I1
}, 0 },
3277 { "shrA", { Eb
, I1
}, 0 },
3278 { "shlA", { Eb
, I1
}, 0 },
3279 { "sarA", { Eb
, I1
}, 0 },
3283 { "rolQ", { Ev
, I1
}, 0 },
3284 { "rorQ", { Ev
, I1
}, 0 },
3285 { "rclQ", { Ev
, I1
}, 0 },
3286 { "rcrQ", { Ev
, I1
}, 0 },
3287 { "shlQ", { Ev
, I1
}, 0 },
3288 { "shrQ", { Ev
, I1
}, 0 },
3289 { "shlQ", { Ev
, I1
}, 0 },
3290 { "sarQ", { Ev
, I1
}, 0 },
3294 { "rolA", { Eb
, CL
}, 0 },
3295 { "rorA", { Eb
, CL
}, 0 },
3296 { "rclA", { Eb
, CL
}, 0 },
3297 { "rcrA", { Eb
, CL
}, 0 },
3298 { "shlA", { Eb
, CL
}, 0 },
3299 { "shrA", { Eb
, CL
}, 0 },
3300 { "shlA", { Eb
, CL
}, 0 },
3301 { "sarA", { Eb
, CL
}, 0 },
3305 { "rolQ", { Ev
, CL
}, 0 },
3306 { "rorQ", { Ev
, CL
}, 0 },
3307 { "rclQ", { Ev
, CL
}, 0 },
3308 { "rcrQ", { Ev
, CL
}, 0 },
3309 { "shlQ", { Ev
, CL
}, 0 },
3310 { "shrQ", { Ev
, CL
}, 0 },
3311 { "shlQ", { Ev
, CL
}, 0 },
3312 { "sarQ", { Ev
, CL
}, 0 },
3316 { "testA", { Eb
, Ib
}, 0 },
3317 { "testA", { Eb
, Ib
}, 0 },
3318 { "notA", { Ebh1
}, 0 },
3319 { "negA", { Ebh1
}, 0 },
3320 { "mulA", { Eb
}, 0 }, /* Don't print the implicit %al register, */
3321 { "imulA", { Eb
}, 0 }, /* to distinguish these opcodes from other */
3322 { "divA", { Eb
}, 0 }, /* mul/imul opcodes. Do the same for div */
3323 { "idivA", { Eb
}, 0 }, /* and idiv for consistency. */
3327 { "testQ", { Ev
, Iv
}, 0 },
3328 { "testQ", { Ev
, Iv
}, 0 },
3329 { "notQ", { Evh1
}, 0 },
3330 { "negQ", { Evh1
}, 0 },
3331 { "mulQ", { Ev
}, 0 }, /* Don't print the implicit register. */
3332 { "imulQ", { Ev
}, 0 },
3333 { "divQ", { Ev
}, 0 },
3334 { "idivQ", { Ev
}, 0 },
3338 { "incA", { Ebh1
}, 0 },
3339 { "decA", { Ebh1
}, 0 },
3343 { "incQ", { Evh1
}, 0 },
3344 { "decQ", { Evh1
}, 0 },
3345 { "call{&|}", { NOTRACK
, indirEv
, BND
}, 0 },
3346 { MOD_TABLE (MOD_FF_REG_3
) },
3347 { "jmp{&|}", { NOTRACK
, indirEv
, BND
}, 0 },
3348 { MOD_TABLE (MOD_FF_REG_5
) },
3349 { "pushU", { stackEv
}, 0 },
3354 { "sldtD", { Sv
}, 0 },
3355 { "strD", { Sv
}, 0 },
3356 { "lldt", { Ew
}, 0 },
3357 { "ltr", { Ew
}, 0 },
3358 { "verr", { Ew
}, 0 },
3359 { "verw", { Ew
}, 0 },
3365 { MOD_TABLE (MOD_0F01_REG_0
) },
3366 { MOD_TABLE (MOD_0F01_REG_1
) },
3367 { MOD_TABLE (MOD_0F01_REG_2
) },
3368 { MOD_TABLE (MOD_0F01_REG_3
) },
3369 { "smswD", { Sv
}, 0 },
3370 { MOD_TABLE (MOD_0F01_REG_5
) },
3371 { "lmsw", { Ew
}, 0 },
3372 { MOD_TABLE (MOD_0F01_REG_7
) },
3376 { "prefetch", { Mb
}, 0 },
3377 { "prefetchw", { Mb
}, 0 },
3378 { "prefetchwt1", { Mb
}, 0 },
3379 { "prefetch", { Mb
}, 0 },
3380 { "prefetch", { Mb
}, 0 },
3381 { "prefetch", { Mb
}, 0 },
3382 { "prefetch", { Mb
}, 0 },
3383 { "prefetch", { Mb
}, 0 },
3387 { MOD_TABLE (MOD_0F18_REG_0
) },
3388 { MOD_TABLE (MOD_0F18_REG_1
) },
3389 { MOD_TABLE (MOD_0F18_REG_2
) },
3390 { MOD_TABLE (MOD_0F18_REG_3
) },
3391 { MOD_TABLE (MOD_0F18_REG_4
) },
3392 { MOD_TABLE (MOD_0F18_REG_5
) },
3393 { MOD_TABLE (MOD_0F18_REG_6
) },
3394 { MOD_TABLE (MOD_0F18_REG_7
) },
3396 /* REG_0F1C_P_0_MOD_0 */
3398 { "cldemote", { Mb
}, 0 },
3399 { "nopQ", { Ev
}, 0 },
3400 { "nopQ", { Ev
}, 0 },
3401 { "nopQ", { Ev
}, 0 },
3402 { "nopQ", { Ev
}, 0 },
3403 { "nopQ", { Ev
}, 0 },
3404 { "nopQ", { Ev
}, 0 },
3405 { "nopQ", { Ev
}, 0 },
3407 /* REG_0F1E_P_1_MOD_3 */
3409 { "nopQ", { Ev
}, 0 },
3410 { "rdsspK", { Rdq
}, PREFIX_OPCODE
},
3411 { "nopQ", { Ev
}, 0 },
3412 { "nopQ", { Ev
}, 0 },
3413 { "nopQ", { Ev
}, 0 },
3414 { "nopQ", { Ev
}, 0 },
3415 { "nopQ", { Ev
}, 0 },
3416 { RM_TABLE (RM_0F1E_P_1_MOD_3_REG_7
) },
3422 { MOD_TABLE (MOD_0F71_REG_2
) },
3424 { MOD_TABLE (MOD_0F71_REG_4
) },
3426 { MOD_TABLE (MOD_0F71_REG_6
) },
3432 { MOD_TABLE (MOD_0F72_REG_2
) },
3434 { MOD_TABLE (MOD_0F72_REG_4
) },
3436 { MOD_TABLE (MOD_0F72_REG_6
) },
3442 { MOD_TABLE (MOD_0F73_REG_2
) },
3443 { MOD_TABLE (MOD_0F73_REG_3
) },
3446 { MOD_TABLE (MOD_0F73_REG_6
) },
3447 { MOD_TABLE (MOD_0F73_REG_7
) },
3451 { "montmul", { { OP_0f07
, 0 } }, 0 },
3452 { "xsha1", { { OP_0f07
, 0 } }, 0 },
3453 { "xsha256", { { OP_0f07
, 0 } }, 0 },
3457 { "xstore-rng", { { OP_0f07
, 0 } }, 0 },
3458 { "xcrypt-ecb", { { OP_0f07
, 0 } }, 0 },
3459 { "xcrypt-cbc", { { OP_0f07
, 0 } }, 0 },
3460 { "xcrypt-ctr", { { OP_0f07
, 0 } }, 0 },
3461 { "xcrypt-cfb", { { OP_0f07
, 0 } }, 0 },
3462 { "xcrypt-ofb", { { OP_0f07
, 0 } }, 0 },
3466 { MOD_TABLE (MOD_0FAE_REG_0
) },
3467 { MOD_TABLE (MOD_0FAE_REG_1
) },
3468 { MOD_TABLE (MOD_0FAE_REG_2
) },
3469 { MOD_TABLE (MOD_0FAE_REG_3
) },
3470 { MOD_TABLE (MOD_0FAE_REG_4
) },
3471 { MOD_TABLE (MOD_0FAE_REG_5
) },
3472 { MOD_TABLE (MOD_0FAE_REG_6
) },
3473 { MOD_TABLE (MOD_0FAE_REG_7
) },
3481 { "btQ", { Ev
, Ib
}, 0 },
3482 { "btsQ", { Evh1
, Ib
}, 0 },
3483 { "btrQ", { Evh1
, Ib
}, 0 },
3484 { "btcQ", { Evh1
, Ib
}, 0 },
3489 { "cmpxchg8b", { { CMPXCHG8B_Fixup
, q_mode
} }, 0 },
3491 { MOD_TABLE (MOD_0FC7_REG_3
) },
3492 { MOD_TABLE (MOD_0FC7_REG_4
) },
3493 { MOD_TABLE (MOD_0FC7_REG_5
) },
3494 { MOD_TABLE (MOD_0FC7_REG_6
) },
3495 { MOD_TABLE (MOD_0FC7_REG_7
) },
3501 { MOD_TABLE (MOD_VEX_0F71_REG_2
) },
3503 { MOD_TABLE (MOD_VEX_0F71_REG_4
) },
3505 { MOD_TABLE (MOD_VEX_0F71_REG_6
) },
3511 { MOD_TABLE (MOD_VEX_0F72_REG_2
) },
3513 { MOD_TABLE (MOD_VEX_0F72_REG_4
) },
3515 { MOD_TABLE (MOD_VEX_0F72_REG_6
) },
3521 { MOD_TABLE (MOD_VEX_0F73_REG_2
) },
3522 { MOD_TABLE (MOD_VEX_0F73_REG_3
) },
3525 { MOD_TABLE (MOD_VEX_0F73_REG_6
) },
3526 { MOD_TABLE (MOD_VEX_0F73_REG_7
) },
3532 { MOD_TABLE (MOD_VEX_0FAE_REG_2
) },
3533 { MOD_TABLE (MOD_VEX_0FAE_REG_3
) },
3535 /* REG_VEX_0F3849_X86_64_P_0_W_0_M_1 */
3537 { RM_TABLE (RM_VEX_0F3849_X86_64_P_0_W_0_M_1_R_0
) },
3539 /* REG_VEX_0F38F3 */
3542 { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_1
) },
3543 { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_2
) },
3544 { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_3
) },
3546 /* REG_0FXOP_09_01_L_0 */
3549 { "blcfill", { VexGdq
, Edq
}, 0 },
3550 { "blsfill", { VexGdq
, Edq
}, 0 },
3551 { "blcs", { VexGdq
, Edq
}, 0 },
3552 { "tzmsk", { VexGdq
, Edq
}, 0 },
3553 { "blcic", { VexGdq
, Edq
}, 0 },
3554 { "blsic", { VexGdq
, Edq
}, 0 },
3555 { "t1mskc", { VexGdq
, Edq
}, 0 },
3557 /* REG_0FXOP_09_02_L_0 */
3560 { "blcmsk", { VexGdq
, Edq
}, 0 },
3565 { "blci", { VexGdq
, Edq
}, 0 },
3567 /* REG_0FXOP_09_12_M_1_L_0 */
3569 { "llwpcb", { Edq
}, 0 },
3570 { "slwpcb", { Edq
}, 0 },
3572 /* REG_0FXOP_0A_12_L_0 */
3574 { "lwpins", { VexGdq
, Ed
, Id
}, 0 },
3575 { "lwpval", { VexGdq
, Ed
, Id
}, 0 },
3578 #include "i386-dis-evex-reg.h"
3581 static const struct dis386 prefix_table
[][4] = {
3584 { "xchgS", { { NOP_Fixup1
, eAX_reg
}, { NOP_Fixup2
, eAX_reg
} }, 0 },
3585 { "pause", { XX
}, 0 },
3586 { "xchgS", { { NOP_Fixup1
, eAX_reg
}, { NOP_Fixup2
, eAX_reg
} }, 0 },
3587 { NULL
, { { NULL
, 0 } }, PREFIX_IGNORED
}
3590 /* PREFIX_0F01_REG_3_RM_1 */
3592 { "vmmcall", { Skip_MODRM
}, 0 },
3593 { "vmgexit", { Skip_MODRM
}, 0 },
3595 { "vmgexit", { Skip_MODRM
}, 0 },
3598 /* PREFIX_0F01_REG_5_MOD_0 */
3601 { "rstorssp", { Mq
}, PREFIX_OPCODE
},
3604 /* PREFIX_0F01_REG_5_MOD_3_RM_0 */
3606 { "serialize", { Skip_MODRM
}, PREFIX_OPCODE
},
3607 { "setssbsy", { Skip_MODRM
}, PREFIX_OPCODE
},
3609 { "xsusldtrk", { Skip_MODRM
}, PREFIX_OPCODE
},
3612 /* PREFIX_0F01_REG_5_MOD_3_RM_1 */
3617 { "xresldtrk", { Skip_MODRM
}, PREFIX_OPCODE
},
3620 /* PREFIX_0F01_REG_5_MOD_3_RM_2 */
3623 { "saveprevssp", { Skip_MODRM
}, PREFIX_OPCODE
},
3626 /* PREFIX_0F01_REG_7_MOD_3_RM_2 */
3628 { "monitorx", { { OP_Monitor
, 0 } }, 0 },
3629 { "mcommit", { Skip_MODRM
}, 0 },
3632 /* PREFIX_0F01_REG_7_MOD_3_RM_3 */
3634 { "mwaitx", { { OP_Mwait
, eBX_reg
} }, 0 },
3639 { "wbinvd", { XX
}, 0 },
3640 { "wbnoinvd", { XX
}, 0 },
3645 { "movups", { XM
, EXx
}, PREFIX_OPCODE
},
3646 { "movss", { XM
, EXd
}, PREFIX_OPCODE
},
3647 { "movupd", { XM
, EXx
}, PREFIX_OPCODE
},
3648 { "movsd", { XM
, EXq
}, PREFIX_OPCODE
},
3653 { "movups", { EXxS
, XM
}, PREFIX_OPCODE
},
3654 { "movss", { EXdS
, XM
}, PREFIX_OPCODE
},
3655 { "movupd", { EXxS
, XM
}, PREFIX_OPCODE
},
3656 { "movsd", { EXqS
, XM
}, PREFIX_OPCODE
},
3661 { MOD_TABLE (MOD_0F12_PREFIX_0
) },
3662 { "movsldup", { XM
, EXx
}, PREFIX_OPCODE
},
3663 { MOD_TABLE (MOD_0F12_PREFIX_2
) },
3664 { "movddup", { XM
, EXq
}, PREFIX_OPCODE
},
3669 { MOD_TABLE (MOD_0F16_PREFIX_0
) },
3670 { "movshdup", { XM
, EXx
}, PREFIX_OPCODE
},
3671 { MOD_TABLE (MOD_0F16_PREFIX_2
) },
3676 { MOD_TABLE (MOD_0F1A_PREFIX_0
) },
3677 { "bndcl", { Gbnd
, Ev_bnd
}, 0 },
3678 { "bndmov", { Gbnd
, Ebnd
}, 0 },
3679 { "bndcu", { Gbnd
, Ev_bnd
}, 0 },
3684 { MOD_TABLE (MOD_0F1B_PREFIX_0
) },
3685 { MOD_TABLE (MOD_0F1B_PREFIX_1
) },
3686 { "bndmov", { EbndS
, Gbnd
}, 0 },
3687 { "bndcn", { Gbnd
, Ev_bnd
}, 0 },
3692 { MOD_TABLE (MOD_0F1C_PREFIX_0
) },
3693 { "nopQ", { Ev
}, PREFIX_OPCODE
},
3694 { "nopQ", { Ev
}, PREFIX_OPCODE
},
3695 { "nopQ", { Ev
}, PREFIX_OPCODE
},
3700 { "nopQ", { Ev
}, PREFIX_OPCODE
},
3701 { MOD_TABLE (MOD_0F1E_PREFIX_1
) },
3702 { "nopQ", { Ev
}, PREFIX_OPCODE
},
3703 { "nopQ", { Ev
}, PREFIX_OPCODE
},
3708 { "cvtpi2ps", { XM
, EMCq
}, PREFIX_OPCODE
},
3709 { "cvtsi2ss%LQ", { XM
, Edq
}, PREFIX_OPCODE
},
3710 { "cvtpi2pd", { XM
, EMCq
}, PREFIX_OPCODE
},
3711 { "cvtsi2sd%LQ", { XM
, Edq
}, 0 },
3716 { MOD_TABLE (MOD_0F2B_PREFIX_0
) },
3717 { MOD_TABLE (MOD_0F2B_PREFIX_1
) },
3718 { MOD_TABLE (MOD_0F2B_PREFIX_2
) },
3719 { MOD_TABLE (MOD_0F2B_PREFIX_3
) },
3724 { "cvttps2pi", { MXC
, EXq
}, PREFIX_OPCODE
},
3725 { "cvttss2si", { Gdq
, EXd
}, PREFIX_OPCODE
},
3726 { "cvttpd2pi", { MXC
, EXx
}, PREFIX_OPCODE
},
3727 { "cvttsd2si", { Gdq
, EXq
}, PREFIX_OPCODE
},
3732 { "cvtps2pi", { MXC
, EXq
}, PREFIX_OPCODE
},
3733 { "cvtss2si", { Gdq
, EXd
}, PREFIX_OPCODE
},
3734 { "cvtpd2pi", { MXC
, EXx
}, PREFIX_OPCODE
},
3735 { "cvtsd2si", { Gdq
, EXq
}, PREFIX_OPCODE
},
3740 { "ucomiss",{ XM
, EXd
}, 0 },
3742 { "ucomisd",{ XM
, EXq
}, 0 },
3747 { "comiss", { XM
, EXd
}, 0 },
3749 { "comisd", { XM
, EXq
}, 0 },
3754 { "sqrtps", { XM
, EXx
}, PREFIX_OPCODE
},
3755 { "sqrtss", { XM
, EXd
}, PREFIX_OPCODE
},
3756 { "sqrtpd", { XM
, EXx
}, PREFIX_OPCODE
},
3757 { "sqrtsd", { XM
, EXq
}, PREFIX_OPCODE
},
3762 { "rsqrtps",{ XM
, EXx
}, PREFIX_OPCODE
},
3763 { "rsqrtss",{ XM
, EXd
}, PREFIX_OPCODE
},
3768 { "rcpps", { XM
, EXx
}, PREFIX_OPCODE
},
3769 { "rcpss", { XM
, EXd
}, PREFIX_OPCODE
},
3774 { "addps", { XM
, EXx
}, PREFIX_OPCODE
},
3775 { "addss", { XM
, EXd
}, PREFIX_OPCODE
},
3776 { "addpd", { XM
, EXx
}, PREFIX_OPCODE
},
3777 { "addsd", { XM
, EXq
}, PREFIX_OPCODE
},
3782 { "mulps", { XM
, EXx
}, PREFIX_OPCODE
},
3783 { "mulss", { XM
, EXd
}, PREFIX_OPCODE
},
3784 { "mulpd", { XM
, EXx
}, PREFIX_OPCODE
},
3785 { "mulsd", { XM
, EXq
}, PREFIX_OPCODE
},
3790 { "cvtps2pd", { XM
, EXq
}, PREFIX_OPCODE
},
3791 { "cvtss2sd", { XM
, EXd
}, PREFIX_OPCODE
},
3792 { "cvtpd2ps", { XM
, EXx
}, PREFIX_OPCODE
},
3793 { "cvtsd2ss", { XM
, EXq
}, PREFIX_OPCODE
},
3798 { "cvtdq2ps", { XM
, EXx
}, PREFIX_OPCODE
},
3799 { "cvttps2dq", { XM
, EXx
}, PREFIX_OPCODE
},
3800 { "cvtps2dq", { XM
, EXx
}, PREFIX_OPCODE
},
3805 { "subps", { XM
, EXx
}, PREFIX_OPCODE
},
3806 { "subss", { XM
, EXd
}, PREFIX_OPCODE
},
3807 { "subpd", { XM
, EXx
}, PREFIX_OPCODE
},
3808 { "subsd", { XM
, EXq
}, PREFIX_OPCODE
},
3813 { "minps", { XM
, EXx
}, PREFIX_OPCODE
},
3814 { "minss", { XM
, EXd
}, PREFIX_OPCODE
},
3815 { "minpd", { XM
, EXx
}, PREFIX_OPCODE
},
3816 { "minsd", { XM
, EXq
}, PREFIX_OPCODE
},
3821 { "divps", { XM
, EXx
}, PREFIX_OPCODE
},
3822 { "divss", { XM
, EXd
}, PREFIX_OPCODE
},
3823 { "divpd", { XM
, EXx
}, PREFIX_OPCODE
},
3824 { "divsd", { XM
, EXq
}, PREFIX_OPCODE
},
3829 { "maxps", { XM
, EXx
}, PREFIX_OPCODE
},
3830 { "maxss", { XM
, EXd
}, PREFIX_OPCODE
},
3831 { "maxpd", { XM
, EXx
}, PREFIX_OPCODE
},
3832 { "maxsd", { XM
, EXq
}, PREFIX_OPCODE
},
3837 { "punpcklbw",{ MX
, EMd
}, PREFIX_OPCODE
},
3839 { "punpcklbw",{ MX
, EMx
}, PREFIX_OPCODE
},
3844 { "punpcklwd",{ MX
, EMd
}, PREFIX_OPCODE
},
3846 { "punpcklwd",{ MX
, EMx
}, PREFIX_OPCODE
},
3851 { "punpckldq",{ MX
, EMd
}, PREFIX_OPCODE
},
3853 { "punpckldq",{ MX
, EMx
}, PREFIX_OPCODE
},
3860 { "punpcklqdq", { XM
, EXx
}, PREFIX_OPCODE
},
3867 { "punpckhqdq", { XM
, EXx
}, PREFIX_OPCODE
},
3872 { "movq", { MX
, EM
}, PREFIX_OPCODE
},
3873 { "movdqu", { XM
, EXx
}, PREFIX_OPCODE
},
3874 { "movdqa", { XM
, EXx
}, PREFIX_OPCODE
},
3879 { "pshufw", { MX
, EM
, Ib
}, PREFIX_OPCODE
},
3880 { "pshufhw",{ XM
, EXx
, Ib
}, PREFIX_OPCODE
},
3881 { "pshufd", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
3882 { "pshuflw",{ XM
, EXx
, Ib
}, PREFIX_OPCODE
},
3885 /* PREFIX_0F73_REG_3 */
3889 { "psrldq", { XS
, Ib
}, 0 },
3892 /* PREFIX_0F73_REG_7 */
3896 { "pslldq", { XS
, Ib
}, 0 },
3901 {"vmread", { Em
, Gm
}, 0 },
3903 {"extrq", { XS
, Ib
, Ib
}, 0 },
3904 {"insertq", { XM
, XS
, Ib
, Ib
}, 0 },
3909 {"vmwrite", { Gm
, Em
}, 0 },
3911 {"extrq", { XM
, XS
}, 0 },
3912 {"insertq", { XM
, XS
}, 0 },
3919 { "haddpd", { XM
, EXx
}, PREFIX_OPCODE
},
3920 { "haddps", { XM
, EXx
}, PREFIX_OPCODE
},
3927 { "hsubpd", { XM
, EXx
}, PREFIX_OPCODE
},
3928 { "hsubps", { XM
, EXx
}, PREFIX_OPCODE
},
3933 { "movK", { Edq
, MX
}, PREFIX_OPCODE
},
3934 { "movq", { XM
, EXq
}, PREFIX_OPCODE
},
3935 { "movK", { Edq
, XM
}, PREFIX_OPCODE
},
3940 { "movq", { EMS
, MX
}, PREFIX_OPCODE
},
3941 { "movdqu", { EXxS
, XM
}, PREFIX_OPCODE
},
3942 { "movdqa", { EXxS
, XM
}, PREFIX_OPCODE
},
3945 /* PREFIX_0FAE_REG_0_MOD_3 */
3948 { "rdfsbase", { Ev
}, 0 },
3951 /* PREFIX_0FAE_REG_1_MOD_3 */
3954 { "rdgsbase", { Ev
}, 0 },
3957 /* PREFIX_0FAE_REG_2_MOD_3 */
3960 { "wrfsbase", { Ev
}, 0 },
3963 /* PREFIX_0FAE_REG_3_MOD_3 */
3966 { "wrgsbase", { Ev
}, 0 },
3969 /* PREFIX_0FAE_REG_4_MOD_0 */
3971 { "xsave", { FXSAVE
}, 0 },
3972 { "ptwrite%LQ", { Edq
}, 0 },
3975 /* PREFIX_0FAE_REG_4_MOD_3 */
3978 { "ptwrite%LQ", { Edq
}, 0 },
3981 /* PREFIX_0FAE_REG_5_MOD_0 */
3983 { "xrstor", { FXSAVE
}, PREFIX_OPCODE
},
3986 /* PREFIX_0FAE_REG_5_MOD_3 */
3988 { "lfence", { Skip_MODRM
}, 0 },
3989 { "incsspK", { Rdq
}, PREFIX_OPCODE
},
3992 /* PREFIX_0FAE_REG_6_MOD_0 */
3994 { "xsaveopt", { FXSAVE
}, PREFIX_OPCODE
},
3995 { "clrssbsy", { Mq
}, PREFIX_OPCODE
},
3996 { "clwb", { Mb
}, PREFIX_OPCODE
},
3999 /* PREFIX_0FAE_REG_6_MOD_3 */
4001 { RM_TABLE (RM_0FAE_REG_6_MOD_3_P_0
) },
4002 { "umonitor", { Eva
}, PREFIX_OPCODE
},
4003 { "tpause", { Edq
}, PREFIX_OPCODE
},
4004 { "umwait", { Edq
}, PREFIX_OPCODE
},
4007 /* PREFIX_0FAE_REG_7_MOD_0 */
4009 { "clflush", { Mb
}, 0 },
4011 { "clflushopt", { Mb
}, 0 },
4017 { "popcntS", { Gv
, Ev
}, 0 },
4022 { "bsfS", { Gv
, Ev
}, 0 },
4023 { "tzcntS", { Gv
, Ev
}, 0 },
4024 { "bsfS", { Gv
, Ev
}, 0 },
4029 { "bsrS", { Gv
, Ev
}, 0 },
4030 { "lzcntS", { Gv
, Ev
}, 0 },
4031 { "bsrS", { Gv
, Ev
}, 0 },
4036 { "cmpps", { XM
, EXx
, CMP
}, PREFIX_OPCODE
},
4037 { "cmpss", { XM
, EXd
, CMP
}, PREFIX_OPCODE
},
4038 { "cmppd", { XM
, EXx
, CMP
}, PREFIX_OPCODE
},
4039 { "cmpsd", { XM
, EXq
, CMP
}, PREFIX_OPCODE
},
4042 /* PREFIX_0FC3_MOD_0 */
4044 { "movntiS", { Edq
, Gdq
}, PREFIX_OPCODE
},
4047 /* PREFIX_0FC7_REG_6_MOD_0 */
4049 { "vmptrld",{ Mq
}, 0 },
4050 { "vmxon", { Mq
}, 0 },
4051 { "vmclear",{ Mq
}, 0 },
4054 /* PREFIX_0FC7_REG_6_MOD_3 */
4056 { "rdrand", { Ev
}, 0 },
4058 { "rdrand", { Ev
}, 0 }
4061 /* PREFIX_0FC7_REG_7_MOD_3 */
4063 { "rdseed", { Ev
}, 0 },
4064 { "rdpid", { Em
}, 0 },
4065 { "rdseed", { Ev
}, 0 },
4072 { "addsubpd", { XM
, EXx
}, 0 },
4073 { "addsubps", { XM
, EXx
}, 0 },
4079 { "movq2dq",{ XM
, MS
}, 0 },
4080 { "movq", { EXqS
, XM
}, 0 },
4081 { "movdq2q",{ MX
, XS
}, 0 },
4087 { "cvtdq2pd", { XM
, EXq
}, PREFIX_OPCODE
},
4088 { "cvttpd2dq", { XM
, EXx
}, PREFIX_OPCODE
},
4089 { "cvtpd2dq", { XM
, EXx
}, PREFIX_OPCODE
},
4094 { "movntq", { Mq
, MX
}, PREFIX_OPCODE
},
4096 { MOD_TABLE (MOD_0FE7_PREFIX_2
) },
4104 { MOD_TABLE (MOD_0FF0_PREFIX_3
) },
4109 { "maskmovq", { MX
, MS
}, PREFIX_OPCODE
},
4111 { "maskmovdqu", { XM
, XS
}, PREFIX_OPCODE
},
4118 { "pblendvb", { XM
, EXx
, XMM0
}, PREFIX_OPCODE
},
4125 { "blendvps", { XM
, EXx
, XMM0
}, PREFIX_OPCODE
},
4132 { "blendvpd", { XM
, EXx
, XMM0
}, PREFIX_OPCODE
},
4139 { "ptest", { XM
, EXx
}, PREFIX_OPCODE
},
4146 { "pmovsxbw", { XM
, EXq
}, PREFIX_OPCODE
},
4153 { "pmovsxbd", { XM
, EXd
}, PREFIX_OPCODE
},
4160 { "pmovsxbq", { XM
, EXw
}, PREFIX_OPCODE
},
4167 { "pmovsxwd", { XM
, EXq
}, PREFIX_OPCODE
},
4174 { "pmovsxwq", { XM
, EXd
}, PREFIX_OPCODE
},
4181 { "pmovsxdq", { XM
, EXq
}, PREFIX_OPCODE
},
4188 { "pmuldq", { XM
, EXx
}, PREFIX_OPCODE
},
4195 { "pcmpeqq", { XM
, EXx
}, PREFIX_OPCODE
},
4202 { MOD_TABLE (MOD_0F382A_PREFIX_2
) },
4209 { "packusdw", { XM
, EXx
}, PREFIX_OPCODE
},
4216 { "pmovzxbw", { XM
, EXq
}, PREFIX_OPCODE
},
4223 { "pmovzxbd", { XM
, EXd
}, PREFIX_OPCODE
},
4230 { "pmovzxbq", { XM
, EXw
}, PREFIX_OPCODE
},
4237 { "pmovzxwd", { XM
, EXq
}, PREFIX_OPCODE
},
4244 { "pmovzxwq", { XM
, EXd
}, PREFIX_OPCODE
},
4251 { "pmovzxdq", { XM
, EXq
}, PREFIX_OPCODE
},
4258 { "pcmpgtq", { XM
, EXx
}, PREFIX_OPCODE
},
4265 { "pminsb", { XM
, EXx
}, PREFIX_OPCODE
},
4272 { "pminsd", { XM
, EXx
}, PREFIX_OPCODE
},
4279 { "pminuw", { XM
, EXx
}, PREFIX_OPCODE
},
4286 { "pminud", { XM
, EXx
}, PREFIX_OPCODE
},
4293 { "pmaxsb", { XM
, EXx
}, PREFIX_OPCODE
},
4300 { "pmaxsd", { XM
, EXx
}, PREFIX_OPCODE
},
4307 { "pmaxuw", { XM
, EXx
}, PREFIX_OPCODE
},
4314 { "pmaxud", { XM
, EXx
}, PREFIX_OPCODE
},
4321 { "pmulld", { XM
, EXx
}, PREFIX_OPCODE
},
4328 { "phminposuw", { XM
, EXx
}, PREFIX_OPCODE
},
4335 { "invept", { Gm
, Mo
}, PREFIX_OPCODE
},
4342 { "invvpid", { Gm
, Mo
}, PREFIX_OPCODE
},
4349 { "invpcid", { Gm
, M
}, PREFIX_OPCODE
},
4354 { "sha1nexte", { XM
, EXxmm
}, PREFIX_OPCODE
},
4359 { "sha1msg1", { XM
, EXxmm
}, PREFIX_OPCODE
},
4364 { "sha1msg2", { XM
, EXxmm
}, PREFIX_OPCODE
},
4369 { "sha256rnds2", { XM
, EXxmm
, XMM0
}, PREFIX_OPCODE
},
4374 { "sha256msg1", { XM
, EXxmm
}, PREFIX_OPCODE
},
4379 { "sha256msg2", { XM
, EXxmm
}, PREFIX_OPCODE
},
4386 { "gf2p8mulb", { XM
, EXxmm
}, PREFIX_OPCODE
},
4393 { "aesimc", { XM
, EXx
}, PREFIX_OPCODE
},
4400 { "aesenc", { XM
, EXx
}, PREFIX_OPCODE
},
4407 { "aesenclast", { XM
, EXx
}, PREFIX_OPCODE
},
4414 { "aesdec", { XM
, EXx
}, PREFIX_OPCODE
},
4421 { "aesdeclast", { XM
, EXx
}, PREFIX_OPCODE
},
4426 { "movbeS", { Gv
, { MOVBE_Fixup
, v_mode
} }, PREFIX_OPCODE
},
4428 { "movbeS", { Gv
, { MOVBE_Fixup
, v_mode
} }, PREFIX_OPCODE
},
4429 { "crc32", { Gdq
, { CRC32_Fixup
, b_mode
} }, PREFIX_OPCODE
},
4434 { "movbeS", { { MOVBE_Fixup
, v_mode
}, Gv
}, PREFIX_OPCODE
},
4436 { "movbeS", { { MOVBE_Fixup
, v_mode
}, Gv
}, PREFIX_OPCODE
},
4437 { "crc32", { Gdq
, { CRC32_Fixup
, v_mode
} }, PREFIX_OPCODE
},
4444 { MOD_TABLE (MOD_0F38F5_PREFIX_2
) },
4449 { MOD_TABLE (MOD_0F38F6_PREFIX_0
) },
4450 { "adoxS", { Gdq
, Edq
}, PREFIX_OPCODE
},
4451 { "adcxS", { Gdq
, Edq
}, PREFIX_OPCODE
},
4458 { MOD_TABLE (MOD_0F38F8_PREFIX_1
) },
4459 { MOD_TABLE (MOD_0F38F8_PREFIX_2
) },
4460 { MOD_TABLE (MOD_0F38F8_PREFIX_3
) },
4465 { MOD_TABLE (MOD_0F38F9_PREFIX_0
) },
4472 { "roundps", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
4479 { "roundpd", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
4486 { "roundss", { XM
, EXd
, Ib
}, PREFIX_OPCODE
},
4493 { "roundsd", { XM
, EXq
, Ib
}, PREFIX_OPCODE
},
4500 { "blendps", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
4507 { "blendpd", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
4514 { "pblendw", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
4521 { "pextrb", { Edqb
, XM
, Ib
}, PREFIX_OPCODE
},
4528 { "pextrw", { Edqw
, XM
, Ib
}, PREFIX_OPCODE
},
4535 { "pextrK", { Edq
, XM
, Ib
}, PREFIX_OPCODE
},
4542 { "extractps", { Edqd
, XM
, Ib
}, PREFIX_OPCODE
},
4549 { "pinsrb", { XM
, Edqb
, Ib
}, PREFIX_OPCODE
},
4556 { "insertps", { XM
, EXd
, Ib
}, PREFIX_OPCODE
},
4563 { "pinsrK", { XM
, Edq
, Ib
}, PREFIX_OPCODE
},
4570 { "dpps", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
4577 { "dppd", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
4584 { "mpsadbw", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
4591 { "pclmulqdq", { XM
, EXx
, PCLMUL
}, PREFIX_OPCODE
},
4598 { "pcmpestrm", { XM
, { PCMPESTR_Fixup
, x_mode
}, Ib
}, PREFIX_OPCODE
},
4605 { "pcmpestri", { XM
, { PCMPESTR_Fixup
, x_mode
}, Ib
}, PREFIX_OPCODE
},
4612 { "pcmpistrm", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
4619 { "pcmpistri", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
4624 { "sha1rnds4", { XM
, EXxmm
, Ib
}, PREFIX_OPCODE
},
4631 { "gf2p8affineqb", { XM
, EXxmm
, Ib
}, PREFIX_OPCODE
},
4638 { "gf2p8affineinvqb", { XM
, EXxmm
, Ib
}, PREFIX_OPCODE
},
4645 { "aeskeygenassist", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
4648 /* PREFIX_VEX_0F10 */
4650 { "vmovups", { XM
, EXx
}, 0 },
4651 { "vmovss", { XMVexScalar
, VexScalar
, EXxmm_md
}, 0 },
4652 { "vmovupd", { XM
, EXx
}, 0 },
4653 { "vmovsd", { XMVexScalar
, VexScalar
, EXxmm_mq
}, 0 },
4656 /* PREFIX_VEX_0F11 */
4658 { "vmovups", { EXxS
, XM
}, 0 },
4659 { "vmovss", { EXdVexScalarS
, VexScalar
, XMScalar
}, 0 },
4660 { "vmovupd", { EXxS
, XM
}, 0 },
4661 { "vmovsd", { EXqVexScalarS
, VexScalar
, XMScalar
}, 0 },
4664 /* PREFIX_VEX_0F12 */
4666 { MOD_TABLE (MOD_VEX_0F12_PREFIX_0
) },
4667 { "vmovsldup", { XM
, EXx
}, 0 },
4668 { MOD_TABLE (MOD_VEX_0F12_PREFIX_2
) },
4669 { "vmovddup", { XM
, EXymmq
}, 0 },
4672 /* PREFIX_VEX_0F16 */
4674 { MOD_TABLE (MOD_VEX_0F16_PREFIX_0
) },
4675 { "vmovshdup", { XM
, EXx
}, 0 },
4676 { MOD_TABLE (MOD_VEX_0F16_PREFIX_2
) },
4679 /* PREFIX_VEX_0F2A */
4682 { "vcvtsi2ss%LQ", { XMScalar
, VexScalar
, Edq
}, 0 },
4684 { "vcvtsi2sd%LQ", { XMScalar
, VexScalar
, Edq
}, 0 },
4687 /* PREFIX_VEX_0F2C */
4690 { "vcvttss2si", { Gdq
, EXxmm_md
}, 0 },
4692 { "vcvttsd2si", { Gdq
, EXxmm_mq
}, 0 },
4695 /* PREFIX_VEX_0F2D */
4698 { "vcvtss2si", { Gdq
, EXxmm_md
}, 0 },
4700 { "vcvtsd2si", { Gdq
, EXxmm_mq
}, 0 },
4703 /* PREFIX_VEX_0F2E */
4705 { "vucomiss", { XMScalar
, EXxmm_md
}, 0 },
4707 { "vucomisd", { XMScalar
, EXxmm_mq
}, 0 },
4710 /* PREFIX_VEX_0F2F */
4712 { "vcomiss", { XMScalar
, EXxmm_md
}, 0 },
4714 { "vcomisd", { XMScalar
, EXxmm_mq
}, 0 },
4717 /* PREFIX_VEX_0F41 */
4719 { VEX_LEN_TABLE (VEX_LEN_0F41_P_0
) },
4721 { VEX_LEN_TABLE (VEX_LEN_0F41_P_2
) },
4724 /* PREFIX_VEX_0F42 */
4726 { VEX_LEN_TABLE (VEX_LEN_0F42_P_0
) },
4728 { VEX_LEN_TABLE (VEX_LEN_0F42_P_2
) },
4731 /* PREFIX_VEX_0F44 */
4733 { VEX_LEN_TABLE (VEX_LEN_0F44_P_0
) },
4735 { VEX_LEN_TABLE (VEX_LEN_0F44_P_2
) },
4738 /* PREFIX_VEX_0F45 */
4740 { VEX_LEN_TABLE (VEX_LEN_0F45_P_0
) },
4742 { VEX_LEN_TABLE (VEX_LEN_0F45_P_2
) },
4745 /* PREFIX_VEX_0F46 */
4747 { VEX_LEN_TABLE (VEX_LEN_0F46_P_0
) },
4749 { VEX_LEN_TABLE (VEX_LEN_0F46_P_2
) },
4752 /* PREFIX_VEX_0F47 */
4754 { VEX_LEN_TABLE (VEX_LEN_0F47_P_0
) },
4756 { VEX_LEN_TABLE (VEX_LEN_0F47_P_2
) },
4759 /* PREFIX_VEX_0F4A */
4761 { VEX_LEN_TABLE (VEX_LEN_0F4A_P_0
) },
4763 { VEX_LEN_TABLE (VEX_LEN_0F4A_P_2
) },
4766 /* PREFIX_VEX_0F4B */
4768 { VEX_LEN_TABLE (VEX_LEN_0F4B_P_0
) },
4770 { VEX_LEN_TABLE (VEX_LEN_0F4B_P_2
) },
4773 /* PREFIX_VEX_0F51 */
4775 { "vsqrtps", { XM
, EXx
}, 0 },
4776 { "vsqrtss", { XMScalar
, VexScalar
, EXxmm_md
}, 0 },
4777 { "vsqrtpd", { XM
, EXx
}, 0 },
4778 { "vsqrtsd", { XMScalar
, VexScalar
, EXxmm_mq
}, 0 },
4781 /* PREFIX_VEX_0F52 */
4783 { "vrsqrtps", { XM
, EXx
}, 0 },
4784 { "vrsqrtss", { XMScalar
, VexScalar
, EXxmm_md
}, 0 },
4787 /* PREFIX_VEX_0F53 */
4789 { "vrcpps", { XM
, EXx
}, 0 },
4790 { "vrcpss", { XMScalar
, VexScalar
, EXxmm_md
}, 0 },
4793 /* PREFIX_VEX_0F58 */
4795 { "vaddps", { XM
, Vex
, EXx
}, 0 },
4796 { "vaddss", { XMScalar
, VexScalar
, EXxmm_md
}, 0 },
4797 { "vaddpd", { XM
, Vex
, EXx
}, 0 },
4798 { "vaddsd", { XMScalar
, VexScalar
, EXxmm_mq
}, 0 },
4801 /* PREFIX_VEX_0F59 */
4803 { "vmulps", { XM
, Vex
, EXx
}, 0 },
4804 { "vmulss", { XMScalar
, VexScalar
, EXxmm_md
}, 0 },
4805 { "vmulpd", { XM
, Vex
, EXx
}, 0 },
4806 { "vmulsd", { XMScalar
, VexScalar
, EXxmm_mq
}, 0 },
4809 /* PREFIX_VEX_0F5A */
4811 { "vcvtps2pd", { XM
, EXxmmq
}, 0 },
4812 { "vcvtss2sd", { XMScalar
, VexScalar
, EXxmm_md
}, 0 },
4813 { "vcvtpd2ps%XY",{ XMM
, EXx
}, 0 },
4814 { "vcvtsd2ss", { XMScalar
, VexScalar
, EXxmm_mq
}, 0 },
4817 /* PREFIX_VEX_0F5B */
4819 { "vcvtdq2ps", { XM
, EXx
}, 0 },
4820 { "vcvttps2dq", { XM
, EXx
}, 0 },
4821 { "vcvtps2dq", { XM
, EXx
}, 0 },
4824 /* PREFIX_VEX_0F5C */
4826 { "vsubps", { XM
, Vex
, EXx
}, 0 },
4827 { "vsubss", { XMScalar
, VexScalar
, EXxmm_md
}, 0 },
4828 { "vsubpd", { XM
, Vex
, EXx
}, 0 },
4829 { "vsubsd", { XMScalar
, VexScalar
, EXxmm_mq
}, 0 },
4832 /* PREFIX_VEX_0F5D */
4834 { "vminps", { XM
, Vex
, EXx
}, 0 },
4835 { "vminss", { XMScalar
, VexScalar
, EXxmm_md
}, 0 },
4836 { "vminpd", { XM
, Vex
, EXx
}, 0 },
4837 { "vminsd", { XMScalar
, VexScalar
, EXxmm_mq
}, 0 },
4840 /* PREFIX_VEX_0F5E */
4842 { "vdivps", { XM
, Vex
, EXx
}, 0 },
4843 { "vdivss", { XMScalar
, VexScalar
, EXxmm_md
}, 0 },
4844 { "vdivpd", { XM
, Vex
, EXx
}, 0 },
4845 { "vdivsd", { XMScalar
, VexScalar
, EXxmm_mq
}, 0 },
4848 /* PREFIX_VEX_0F5F */
4850 { "vmaxps", { XM
, Vex
, EXx
}, 0 },
4851 { "vmaxss", { XMScalar
, VexScalar
, EXxmm_md
}, 0 },
4852 { "vmaxpd", { XM
, Vex
, EXx
}, 0 },
4853 { "vmaxsd", { XMScalar
, VexScalar
, EXxmm_mq
}, 0 },
4856 /* PREFIX_VEX_0F60 */
4860 { "vpunpcklbw", { XM
, Vex
, EXx
}, 0 },
4863 /* PREFIX_VEX_0F61 */
4867 { "vpunpcklwd", { XM
, Vex
, EXx
}, 0 },
4870 /* PREFIX_VEX_0F62 */
4874 { "vpunpckldq", { XM
, Vex
, EXx
}, 0 },
4877 /* PREFIX_VEX_0F63 */
4881 { "vpacksswb", { XM
, Vex
, EXx
}, 0 },
4884 /* PREFIX_VEX_0F64 */
4888 { "vpcmpgtb", { XM
, Vex
, EXx
}, 0 },
4891 /* PREFIX_VEX_0F65 */
4895 { "vpcmpgtw", { XM
, Vex
, EXx
}, 0 },
4898 /* PREFIX_VEX_0F66 */
4902 { "vpcmpgtd", { XM
, Vex
, EXx
}, 0 },
4905 /* PREFIX_VEX_0F67 */
4909 { "vpackuswb", { XM
, Vex
, EXx
}, 0 },
4912 /* PREFIX_VEX_0F68 */
4916 { "vpunpckhbw", { XM
, Vex
, EXx
}, 0 },
4919 /* PREFIX_VEX_0F69 */
4923 { "vpunpckhwd", { XM
, Vex
, EXx
}, 0 },
4926 /* PREFIX_VEX_0F6A */
4930 { "vpunpckhdq", { XM
, Vex
, EXx
}, 0 },
4933 /* PREFIX_VEX_0F6B */
4937 { "vpackssdw", { XM
, Vex
, EXx
}, 0 },
4940 /* PREFIX_VEX_0F6C */
4944 { "vpunpcklqdq", { XM
, Vex
, EXx
}, 0 },
4947 /* PREFIX_VEX_0F6D */
4951 { "vpunpckhqdq", { XM
, Vex
, EXx
}, 0 },
4954 /* PREFIX_VEX_0F6E */
4958 { VEX_LEN_TABLE (VEX_LEN_0F6E_P_2
) },
4961 /* PREFIX_VEX_0F6F */
4964 { "vmovdqu", { XM
, EXx
}, 0 },
4965 { "vmovdqa", { XM
, EXx
}, 0 },
4968 /* PREFIX_VEX_0F70 */
4971 { "vpshufhw", { XM
, EXx
, Ib
}, 0 },
4972 { "vpshufd", { XM
, EXx
, Ib
}, 0 },
4973 { "vpshuflw", { XM
, EXx
, Ib
}, 0 },
4976 /* PREFIX_VEX_0F71_REG_2 */
4980 { "vpsrlw", { Vex
, XS
, Ib
}, 0 },
4983 /* PREFIX_VEX_0F71_REG_4 */
4987 { "vpsraw", { Vex
, XS
, Ib
}, 0 },
4990 /* PREFIX_VEX_0F71_REG_6 */
4994 { "vpsllw", { Vex
, XS
, Ib
}, 0 },
4997 /* PREFIX_VEX_0F72_REG_2 */
5001 { "vpsrld", { Vex
, XS
, Ib
}, 0 },
5004 /* PREFIX_VEX_0F72_REG_4 */
5008 { "vpsrad", { Vex
, XS
, Ib
}, 0 },
5011 /* PREFIX_VEX_0F72_REG_6 */
5015 { "vpslld", { Vex
, XS
, Ib
}, 0 },
5018 /* PREFIX_VEX_0F73_REG_2 */
5022 { "vpsrlq", { Vex
, XS
, Ib
}, 0 },
5025 /* PREFIX_VEX_0F73_REG_3 */
5029 { "vpsrldq", { Vex
, XS
, Ib
}, 0 },
5032 /* PREFIX_VEX_0F73_REG_6 */
5036 { "vpsllq", { Vex
, XS
, Ib
}, 0 },
5039 /* PREFIX_VEX_0F73_REG_7 */
5043 { "vpslldq", { Vex
, XS
, Ib
}, 0 },
5046 /* PREFIX_VEX_0F74 */
5050 { "vpcmpeqb", { XM
, Vex
, EXx
}, 0 },
5053 /* PREFIX_VEX_0F75 */
5057 { "vpcmpeqw", { XM
, Vex
, EXx
}, 0 },
5060 /* PREFIX_VEX_0F76 */
5064 { "vpcmpeqd", { XM
, Vex
, EXx
}, 0 },
5067 /* PREFIX_VEX_0F77 */
5069 { VEX_LEN_TABLE (VEX_LEN_0F77_P_0
) },
5072 /* PREFIX_VEX_0F7C */
5076 { "vhaddpd", { XM
, Vex
, EXx
}, 0 },
5077 { "vhaddps", { XM
, Vex
, EXx
}, 0 },
5080 /* PREFIX_VEX_0F7D */
5084 { "vhsubpd", { XM
, Vex
, EXx
}, 0 },
5085 { "vhsubps", { XM
, Vex
, EXx
}, 0 },
5088 /* PREFIX_VEX_0F7E */
5091 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_1
) },
5092 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_2
) },
5095 /* PREFIX_VEX_0F7F */
5098 { "vmovdqu", { EXxS
, XM
}, 0 },
5099 { "vmovdqa", { EXxS
, XM
}, 0 },
5102 /* PREFIX_VEX_0F90 */
5104 { VEX_LEN_TABLE (VEX_LEN_0F90_P_0
) },
5106 { VEX_LEN_TABLE (VEX_LEN_0F90_P_2
) },
5109 /* PREFIX_VEX_0F91 */
5111 { VEX_LEN_TABLE (VEX_LEN_0F91_P_0
) },
5113 { VEX_LEN_TABLE (VEX_LEN_0F91_P_2
) },
5116 /* PREFIX_VEX_0F92 */
5118 { VEX_LEN_TABLE (VEX_LEN_0F92_P_0
) },
5120 { VEX_LEN_TABLE (VEX_LEN_0F92_P_2
) },
5121 { VEX_LEN_TABLE (VEX_LEN_0F92_P_3
) },
5124 /* PREFIX_VEX_0F93 */
5126 { VEX_LEN_TABLE (VEX_LEN_0F93_P_0
) },
5128 { VEX_LEN_TABLE (VEX_LEN_0F93_P_2
) },
5129 { VEX_LEN_TABLE (VEX_LEN_0F93_P_3
) },
5132 /* PREFIX_VEX_0F98 */
5134 { VEX_LEN_TABLE (VEX_LEN_0F98_P_0
) },
5136 { VEX_LEN_TABLE (VEX_LEN_0F98_P_2
) },
5139 /* PREFIX_VEX_0F99 */
5141 { VEX_LEN_TABLE (VEX_LEN_0F99_P_0
) },
5143 { VEX_LEN_TABLE (VEX_LEN_0F99_P_2
) },
5146 /* PREFIX_VEX_0FC2 */
5148 { "vcmpps", { XM
, Vex
, EXx
, VCMP
}, 0 },
5149 { "vcmpss", { XMScalar
, VexScalar
, EXxmm_md
, VCMP
}, 0 },
5150 { "vcmppd", { XM
, Vex
, EXx
, VCMP
}, 0 },
5151 { "vcmpsd", { XMScalar
, VexScalar
, EXxmm_mq
, VCMP
}, 0 },
5154 /* PREFIX_VEX_0FC4 */
5158 { VEX_LEN_TABLE (VEX_LEN_0FC4_P_2
) },
5161 /* PREFIX_VEX_0FC5 */
5165 { VEX_LEN_TABLE (VEX_LEN_0FC5_P_2
) },
5168 /* PREFIX_VEX_0FD0 */
5172 { "vaddsubpd", { XM
, Vex
, EXx
}, 0 },
5173 { "vaddsubps", { XM
, Vex
, EXx
}, 0 },
5176 /* PREFIX_VEX_0FD1 */
5180 { "vpsrlw", { XM
, Vex
, EXxmm
}, 0 },
5183 /* PREFIX_VEX_0FD2 */
5187 { "vpsrld", { XM
, Vex
, EXxmm
}, 0 },
5190 /* PREFIX_VEX_0FD3 */
5194 { "vpsrlq", { XM
, Vex
, EXxmm
}, 0 },
5197 /* PREFIX_VEX_0FD4 */
5201 { "vpaddq", { XM
, Vex
, EXx
}, 0 },
5204 /* PREFIX_VEX_0FD5 */
5208 { "vpmullw", { XM
, Vex
, EXx
}, 0 },
5211 /* PREFIX_VEX_0FD6 */
5215 { VEX_LEN_TABLE (VEX_LEN_0FD6_P_2
) },
5218 /* PREFIX_VEX_0FD7 */
5222 { MOD_TABLE (MOD_VEX_0FD7_PREFIX_2
) },
5225 /* PREFIX_VEX_0FD8 */
5229 { "vpsubusb", { XM
, Vex
, EXx
}, 0 },
5232 /* PREFIX_VEX_0FD9 */
5236 { "vpsubusw", { XM
, Vex
, EXx
}, 0 },
5239 /* PREFIX_VEX_0FDA */
5243 { "vpminub", { XM
, Vex
, EXx
}, 0 },
5246 /* PREFIX_VEX_0FDB */
5250 { "vpand", { XM
, Vex
, EXx
}, 0 },
5253 /* PREFIX_VEX_0FDC */
5257 { "vpaddusb", { XM
, Vex
, EXx
}, 0 },
5260 /* PREFIX_VEX_0FDD */
5264 { "vpaddusw", { XM
, Vex
, EXx
}, 0 },
5267 /* PREFIX_VEX_0FDE */
5271 { "vpmaxub", { XM
, Vex
, EXx
}, 0 },
5274 /* PREFIX_VEX_0FDF */
5278 { "vpandn", { XM
, Vex
, EXx
}, 0 },
5281 /* PREFIX_VEX_0FE0 */
5285 { "vpavgb", { XM
, Vex
, EXx
}, 0 },
5288 /* PREFIX_VEX_0FE1 */
5292 { "vpsraw", { XM
, Vex
, EXxmm
}, 0 },
5295 /* PREFIX_VEX_0FE2 */
5299 { "vpsrad", { XM
, Vex
, EXxmm
}, 0 },
5302 /* PREFIX_VEX_0FE3 */
5306 { "vpavgw", { XM
, Vex
, EXx
}, 0 },
5309 /* PREFIX_VEX_0FE4 */
5313 { "vpmulhuw", { XM
, Vex
, EXx
}, 0 },
5316 /* PREFIX_VEX_0FE5 */
5320 { "vpmulhw", { XM
, Vex
, EXx
}, 0 },
5323 /* PREFIX_VEX_0FE6 */
5326 { "vcvtdq2pd", { XM
, EXxmmq
}, 0 },
5327 { "vcvttpd2dq%XY", { XMM
, EXx
}, 0 },
5328 { "vcvtpd2dq%XY", { XMM
, EXx
}, 0 },
5331 /* PREFIX_VEX_0FE7 */
5335 { MOD_TABLE (MOD_VEX_0FE7_PREFIX_2
) },
5338 /* PREFIX_VEX_0FE8 */
5342 { "vpsubsb", { XM
, Vex
, EXx
}, 0 },
5345 /* PREFIX_VEX_0FE9 */
5349 { "vpsubsw", { XM
, Vex
, EXx
}, 0 },
5352 /* PREFIX_VEX_0FEA */
5356 { "vpminsw", { XM
, Vex
, EXx
}, 0 },
5359 /* PREFIX_VEX_0FEB */
5363 { "vpor", { XM
, Vex
, EXx
}, 0 },
5366 /* PREFIX_VEX_0FEC */
5370 { "vpaddsb", { XM
, Vex
, EXx
}, 0 },
5373 /* PREFIX_VEX_0FED */
5377 { "vpaddsw", { XM
, Vex
, EXx
}, 0 },
5380 /* PREFIX_VEX_0FEE */
5384 { "vpmaxsw", { XM
, Vex
, EXx
}, 0 },
5387 /* PREFIX_VEX_0FEF */
5391 { "vpxor", { XM
, Vex
, EXx
}, 0 },
5394 /* PREFIX_VEX_0FF0 */
5399 { MOD_TABLE (MOD_VEX_0FF0_PREFIX_3
) },
5402 /* PREFIX_VEX_0FF1 */
5406 { "vpsllw", { XM
, Vex
, EXxmm
}, 0 },
5409 /* PREFIX_VEX_0FF2 */
5413 { "vpslld", { XM
, Vex
, EXxmm
}, 0 },
5416 /* PREFIX_VEX_0FF3 */
5420 { "vpsllq", { XM
, Vex
, EXxmm
}, 0 },
5423 /* PREFIX_VEX_0FF4 */
5427 { "vpmuludq", { XM
, Vex
, EXx
}, 0 },
5430 /* PREFIX_VEX_0FF5 */
5434 { "vpmaddwd", { XM
, Vex
, EXx
}, 0 },
5437 /* PREFIX_VEX_0FF6 */
5441 { "vpsadbw", { XM
, Vex
, EXx
}, 0 },
5444 /* PREFIX_VEX_0FF7 */
5448 { VEX_LEN_TABLE (VEX_LEN_0FF7_P_2
) },
5451 /* PREFIX_VEX_0FF8 */
5455 { "vpsubb", { XM
, Vex
, EXx
}, 0 },
5458 /* PREFIX_VEX_0FF9 */
5462 { "vpsubw", { XM
, Vex
, EXx
}, 0 },
5465 /* PREFIX_VEX_0FFA */
5469 { "vpsubd", { XM
, Vex
, EXx
}, 0 },
5472 /* PREFIX_VEX_0FFB */
5476 { "vpsubq", { XM
, Vex
, EXx
}, 0 },
5479 /* PREFIX_VEX_0FFC */
5483 { "vpaddb", { XM
, Vex
, EXx
}, 0 },
5486 /* PREFIX_VEX_0FFD */
5490 { "vpaddw", { XM
, Vex
, EXx
}, 0 },
5493 /* PREFIX_VEX_0FFE */
5497 { "vpaddd", { XM
, Vex
, EXx
}, 0 },
5500 /* PREFIX_VEX_0F3800 */
5504 { "vpshufb", { XM
, Vex
, EXx
}, 0 },
5507 /* PREFIX_VEX_0F3801 */
5511 { "vphaddw", { XM
, Vex
, EXx
}, 0 },
5514 /* PREFIX_VEX_0F3802 */
5518 { "vphaddd", { XM
, Vex
, EXx
}, 0 },
5521 /* PREFIX_VEX_0F3803 */
5525 { "vphaddsw", { XM
, Vex
, EXx
}, 0 },
5528 /* PREFIX_VEX_0F3804 */
5532 { "vpmaddubsw", { XM
, Vex
, EXx
}, 0 },
5535 /* PREFIX_VEX_0F3805 */
5539 { "vphsubw", { XM
, Vex
, EXx
}, 0 },
5542 /* PREFIX_VEX_0F3806 */
5546 { "vphsubd", { XM
, Vex
, EXx
}, 0 },
5549 /* PREFIX_VEX_0F3807 */
5553 { "vphsubsw", { XM
, Vex
, EXx
}, 0 },
5556 /* PREFIX_VEX_0F3808 */
5560 { "vpsignb", { XM
, Vex
, EXx
}, 0 },
5563 /* PREFIX_VEX_0F3809 */
5567 { "vpsignw", { XM
, Vex
, EXx
}, 0 },
5570 /* PREFIX_VEX_0F380A */
5574 { "vpsignd", { XM
, Vex
, EXx
}, 0 },
5577 /* PREFIX_VEX_0F380B */
5581 { "vpmulhrsw", { XM
, Vex
, EXx
}, 0 },
5584 /* PREFIX_VEX_0F380C */
5588 { VEX_W_TABLE (VEX_W_0F380C_P_2
) },
5591 /* PREFIX_VEX_0F380D */
5595 { VEX_W_TABLE (VEX_W_0F380D_P_2
) },
5598 /* PREFIX_VEX_0F380E */
5602 { VEX_W_TABLE (VEX_W_0F380E_P_2
) },
5605 /* PREFIX_VEX_0F380F */
5609 { VEX_W_TABLE (VEX_W_0F380F_P_2
) },
5612 /* PREFIX_VEX_0F3813 */
5616 { VEX_W_TABLE (VEX_W_0F3813_P_2
) },
5619 /* PREFIX_VEX_0F3816 */
5623 { VEX_LEN_TABLE (VEX_LEN_0F3816_P_2
) },
5626 /* PREFIX_VEX_0F3817 */
5630 { "vptest", { XM
, EXx
}, 0 },
5633 /* PREFIX_VEX_0F3818 */
5637 { VEX_W_TABLE (VEX_W_0F3818_P_2
) },
5640 /* PREFIX_VEX_0F3819 */
5644 { VEX_LEN_TABLE (VEX_LEN_0F3819_P_2
) },
5647 /* PREFIX_VEX_0F381A */
5651 { MOD_TABLE (MOD_VEX_0F381A_PREFIX_2
) },
5654 /* PREFIX_VEX_0F381C */
5658 { "vpabsb", { XM
, EXx
}, 0 },
5661 /* PREFIX_VEX_0F381D */
5665 { "vpabsw", { XM
, EXx
}, 0 },
5668 /* PREFIX_VEX_0F381E */
5672 { "vpabsd", { XM
, EXx
}, 0 },
5675 /* PREFIX_VEX_0F3820 */
5679 { "vpmovsxbw", { XM
, EXxmmq
}, 0 },
5682 /* PREFIX_VEX_0F3821 */
5686 { "vpmovsxbd", { XM
, EXxmmqd
}, 0 },
5689 /* PREFIX_VEX_0F3822 */
5693 { "vpmovsxbq", { XM
, EXxmmdw
}, 0 },
5696 /* PREFIX_VEX_0F3823 */
5700 { "vpmovsxwd", { XM
, EXxmmq
}, 0 },
5703 /* PREFIX_VEX_0F3824 */
5707 { "vpmovsxwq", { XM
, EXxmmqd
}, 0 },
5710 /* PREFIX_VEX_0F3825 */
5714 { "vpmovsxdq", { XM
, EXxmmq
}, 0 },
5717 /* PREFIX_VEX_0F3828 */
5721 { "vpmuldq", { XM
, Vex
, EXx
}, 0 },
5724 /* PREFIX_VEX_0F3829 */
5728 { "vpcmpeqq", { XM
, Vex
, EXx
}, 0 },
5731 /* PREFIX_VEX_0F382A */
5735 { MOD_TABLE (MOD_VEX_0F382A_PREFIX_2
) },
5738 /* PREFIX_VEX_0F382B */
5742 { "vpackusdw", { XM
, Vex
, EXx
}, 0 },
5745 /* PREFIX_VEX_0F382C */
5749 { MOD_TABLE (MOD_VEX_0F382C_PREFIX_2
) },
5752 /* PREFIX_VEX_0F382D */
5756 { MOD_TABLE (MOD_VEX_0F382D_PREFIX_2
) },
5759 /* PREFIX_VEX_0F382E */
5763 { MOD_TABLE (MOD_VEX_0F382E_PREFIX_2
) },
5766 /* PREFIX_VEX_0F382F */
5770 { MOD_TABLE (MOD_VEX_0F382F_PREFIX_2
) },
5773 /* PREFIX_VEX_0F3830 */
5777 { "vpmovzxbw", { XM
, EXxmmq
}, 0 },
5780 /* PREFIX_VEX_0F3831 */
5784 { "vpmovzxbd", { XM
, EXxmmqd
}, 0 },
5787 /* PREFIX_VEX_0F3832 */
5791 { "vpmovzxbq", { XM
, EXxmmdw
}, 0 },
5794 /* PREFIX_VEX_0F3833 */
5798 { "vpmovzxwd", { XM
, EXxmmq
}, 0 },
5801 /* PREFIX_VEX_0F3834 */
5805 { "vpmovzxwq", { XM
, EXxmmqd
}, 0 },
5808 /* PREFIX_VEX_0F3835 */
5812 { "vpmovzxdq", { XM
, EXxmmq
}, 0 },
5815 /* PREFIX_VEX_0F3836 */
5819 { VEX_LEN_TABLE (VEX_LEN_0F3836_P_2
) },
5822 /* PREFIX_VEX_0F3837 */
5826 { "vpcmpgtq", { XM
, Vex
, EXx
}, 0 },
5829 /* PREFIX_VEX_0F3838 */
5833 { "vpminsb", { XM
, Vex
, EXx
}, 0 },
5836 /* PREFIX_VEX_0F3839 */
5840 { "vpminsd", { XM
, Vex
, EXx
}, 0 },
5843 /* PREFIX_VEX_0F383A */
5847 { "vpminuw", { XM
, Vex
, EXx
}, 0 },
5850 /* PREFIX_VEX_0F383B */
5854 { "vpminud", { XM
, Vex
, EXx
}, 0 },
5857 /* PREFIX_VEX_0F383C */
5861 { "vpmaxsb", { XM
, Vex
, EXx
}, 0 },
5864 /* PREFIX_VEX_0F383D */
5868 { "vpmaxsd", { XM
, Vex
, EXx
}, 0 },
5871 /* PREFIX_VEX_0F383E */
5875 { "vpmaxuw", { XM
, Vex
, EXx
}, 0 },
5878 /* PREFIX_VEX_0F383F */
5882 { "vpmaxud", { XM
, Vex
, EXx
}, 0 },
5885 /* PREFIX_VEX_0F3840 */
5889 { "vpmulld", { XM
, Vex
, EXx
}, 0 },
5892 /* PREFIX_VEX_0F3841 */
5896 { VEX_LEN_TABLE (VEX_LEN_0F3841_P_2
) },
5899 /* PREFIX_VEX_0F3845 */
5903 { "vpsrlv%LW", { XM
, Vex
, EXx
}, 0 },
5906 /* PREFIX_VEX_0F3846 */
5910 { VEX_W_TABLE (VEX_W_0F3846_P_2
) },
5913 /* PREFIX_VEX_0F3847 */
5917 { "vpsllv%LW", { XM
, Vex
, EXx
}, 0 },
5920 /* PREFIX_VEX_0F3849_X86_64 */
5922 { VEX_W_TABLE (VEX_W_0F3849_X86_64_P_0
) },
5924 { VEX_W_TABLE (VEX_W_0F3849_X86_64_P_2
) },
5925 { VEX_W_TABLE (VEX_W_0F3849_X86_64_P_3
) },
5928 /* PREFIX_VEX_0F384B_X86_64 */
5931 { VEX_W_TABLE (VEX_W_0F384B_X86_64_P_1
) },
5932 { VEX_W_TABLE (VEX_W_0F384B_X86_64_P_2
) },
5933 { VEX_W_TABLE (VEX_W_0F384B_X86_64_P_3
) },
5936 /* PREFIX_VEX_0F3858 */
5940 { VEX_W_TABLE (VEX_W_0F3858_P_2
) },
5943 /* PREFIX_VEX_0F3859 */
5947 { VEX_W_TABLE (VEX_W_0F3859_P_2
) },
5950 /* PREFIX_VEX_0F385A */
5954 { MOD_TABLE (MOD_VEX_0F385A_PREFIX_2
) },
5957 /* PREFIX_VEX_0F385C_X86_64 */
5960 { VEX_W_TABLE (VEX_W_0F385C_X86_64_P_1
) },
5964 /* PREFIX_VEX_0F385E_X86_64 */
5966 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_0
) },
5967 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_1
) },
5968 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_2
) },
5969 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_3
) },
5972 /* PREFIX_VEX_0F3878 */
5976 { VEX_W_TABLE (VEX_W_0F3878_P_2
) },
5979 /* PREFIX_VEX_0F3879 */
5983 { VEX_W_TABLE (VEX_W_0F3879_P_2
) },
5986 /* PREFIX_VEX_0F388C */
5990 { MOD_TABLE (MOD_VEX_0F388C_PREFIX_2
) },
5993 /* PREFIX_VEX_0F388E */
5997 { MOD_TABLE (MOD_VEX_0F388E_PREFIX_2
) },
6000 /* PREFIX_VEX_0F3890 */
6004 { "vpgatherd%LW", { XM
, MVexVSIBDWpX
, Vex
}, 0 },
6007 /* PREFIX_VEX_0F3891 */
6011 { "vpgatherq%LW", { XMGatherQ
, MVexVSIBQWpX
, VexGatherQ
}, 0 },
6014 /* PREFIX_VEX_0F3892 */
6018 { "vgatherdp%XW", { XM
, MVexVSIBDWpX
, Vex
}, 0 },
6021 /* PREFIX_VEX_0F3893 */
6025 { "vgatherqp%XW", { XMGatherQ
, MVexVSIBQWpX
, VexGatherQ
}, 0 },
6028 /* PREFIX_VEX_0F3896 */
6032 { "vfmaddsub132p%XW", { XM
, Vex
, EXx
, EXxEVexR
}, 0 },
6035 /* PREFIX_VEX_0F3897 */
6039 { "vfmsubadd132p%XW", { XM
, Vex
, EXx
, EXxEVexR
}, 0 },
6042 /* PREFIX_VEX_0F3898 */
6046 { "vfmadd132p%XW", { XM
, Vex
, EXx
, EXxEVexR
}, 0 },
6049 /* PREFIX_VEX_0F3899 */
6053 { "vfmadd132s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
, EXxEVexR
}, 0 },
6056 /* PREFIX_VEX_0F389A */
6060 { "vfmsub132p%XW", { XM
, Vex
, EXx
}, 0 },
6063 /* PREFIX_VEX_0F389B */
6067 { "vfmsub132s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
}, 0 },
6070 /* PREFIX_VEX_0F389C */
6074 { "vfnmadd132p%XW", { XM
, Vex
, EXx
, EXxEVexR
}, 0 },
6077 /* PREFIX_VEX_0F389D */
6081 { "vfnmadd132s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
, EXxEVexR
}, 0 },
6084 /* PREFIX_VEX_0F389E */
6088 { "vfnmsub132p%XW", { XM
, Vex
, EXx
, EXxEVexR
}, 0 },
6091 /* PREFIX_VEX_0F389F */
6095 { "vfnmsub132s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
, EXxEVexR
}, 0 },
6098 /* PREFIX_VEX_0F38A6 */
6102 { "vfmaddsub213p%XW", { XM
, Vex
, EXx
, EXxEVexR
}, 0 },
6106 /* PREFIX_VEX_0F38A7 */
6110 { "vfmsubadd213p%XW", { XM
, Vex
, EXx
, EXxEVexR
}, 0 },
6113 /* PREFIX_VEX_0F38A8 */
6117 { "vfmadd213p%XW", { XM
, Vex
, EXx
, EXxEVexR
}, 0 },
6120 /* PREFIX_VEX_0F38A9 */
6124 { "vfmadd213s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
, EXxEVexR
}, 0 },
6127 /* PREFIX_VEX_0F38AA */
6131 { "vfmsub213p%XW", { XM
, Vex
, EXx
}, 0 },
6134 /* PREFIX_VEX_0F38AB */
6138 { "vfmsub213s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
}, 0 },
6141 /* PREFIX_VEX_0F38AC */
6145 { "vfnmadd213p%XW", { XM
, Vex
, EXx
, EXxEVexR
}, 0 },
6148 /* PREFIX_VEX_0F38AD */
6152 { "vfnmadd213s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
, EXxEVexR
}, 0 },
6155 /* PREFIX_VEX_0F38AE */
6159 { "vfnmsub213p%XW", { XM
, Vex
, EXx
, EXxEVexR
}, 0 },
6162 /* PREFIX_VEX_0F38AF */
6166 { "vfnmsub213s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
, EXxEVexR
}, 0 },
6169 /* PREFIX_VEX_0F38B6 */
6173 { "vfmaddsub231p%XW", { XM
, Vex
, EXx
, EXxEVexR
}, 0 },
6176 /* PREFIX_VEX_0F38B7 */
6180 { "vfmsubadd231p%XW", { XM
, Vex
, EXx
, EXxEVexR
}, 0 },
6183 /* PREFIX_VEX_0F38B8 */
6187 { "vfmadd231p%XW", { XM
, Vex
, EXx
, EXxEVexR
}, 0 },
6190 /* PREFIX_VEX_0F38B9 */
6194 { "vfmadd231s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
, EXxEVexR
}, 0 },
6197 /* PREFIX_VEX_0F38BA */
6201 { "vfmsub231p%XW", { XM
, Vex
, EXx
, EXxEVexR
}, 0 },
6204 /* PREFIX_VEX_0F38BB */
6208 { "vfmsub231s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
, EXxEVexR
}, 0 },
6211 /* PREFIX_VEX_0F38BC */
6215 { "vfnmadd231p%XW", { XM
, Vex
, EXx
, EXxEVexR
}, 0 },
6218 /* PREFIX_VEX_0F38BD */
6222 { "vfnmadd231s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
, EXxEVexR
}, 0 },
6225 /* PREFIX_VEX_0F38BE */
6229 { "vfnmsub231p%XW", { XM
, Vex
, EXx
, EXxEVexR
}, 0 },
6232 /* PREFIX_VEX_0F38BF */
6236 { "vfnmsub231s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
, EXxEVexR
}, 0 },
6239 /* PREFIX_VEX_0F38CF */
6243 { VEX_W_TABLE (VEX_W_0F38CF_P_2
) },
6246 /* PREFIX_VEX_0F38DB */
6250 { VEX_LEN_TABLE (VEX_LEN_0F38DB_P_2
) },
6253 /* PREFIX_VEX_0F38DC */
6257 { "vaesenc", { XM
, Vex
, EXx
}, 0 },
6260 /* PREFIX_VEX_0F38DD */
6264 { "vaesenclast", { XM
, Vex
, EXx
}, 0 },
6267 /* PREFIX_VEX_0F38DE */
6271 { "vaesdec", { XM
, Vex
, EXx
}, 0 },
6274 /* PREFIX_VEX_0F38DF */
6278 { "vaesdeclast", { XM
, Vex
, EXx
}, 0 },
6281 /* PREFIX_VEX_0F38F2 */
6283 { VEX_LEN_TABLE (VEX_LEN_0F38F2_P_0
) },
6286 /* PREFIX_VEX_0F38F3_REG_1 */
6288 { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_1_P_0
) },
6291 /* PREFIX_VEX_0F38F3_REG_2 */
6293 { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_2_P_0
) },
6296 /* PREFIX_VEX_0F38F3_REG_3 */
6298 { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_3_P_0
) },
6301 /* PREFIX_VEX_0F38F5 */
6303 { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_0
) },
6304 { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_1
) },
6306 { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_3
) },
6309 /* PREFIX_VEX_0F38F6 */
6314 { VEX_LEN_TABLE (VEX_LEN_0F38F6_P_3
) },
6317 /* PREFIX_VEX_0F38F7 */
6319 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_0
) },
6320 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_1
) },
6321 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_2
) },
6322 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_3
) },
6325 /* PREFIX_VEX_0F3A00 */
6329 { VEX_LEN_TABLE (VEX_LEN_0F3A00_P_2
) },
6332 /* PREFIX_VEX_0F3A01 */
6336 { VEX_LEN_TABLE (VEX_LEN_0F3A01_P_2
) },
6339 /* PREFIX_VEX_0F3A02 */
6343 { VEX_W_TABLE (VEX_W_0F3A02_P_2
) },
6346 /* PREFIX_VEX_0F3A04 */
6350 { VEX_W_TABLE (VEX_W_0F3A04_P_2
) },
6353 /* PREFIX_VEX_0F3A05 */
6357 { VEX_W_TABLE (VEX_W_0F3A05_P_2
) },
6360 /* PREFIX_VEX_0F3A06 */
6364 { VEX_LEN_TABLE (VEX_LEN_0F3A06_P_2
) },
6367 /* PREFIX_VEX_0F3A08 */
6371 { "vroundps", { XM
, EXx
, Ib
}, 0 },
6374 /* PREFIX_VEX_0F3A09 */
6378 { "vroundpd", { XM
, EXx
, Ib
}, 0 },
6381 /* PREFIX_VEX_0F3A0A */
6385 { "vroundss", { XMScalar
, VexScalar
, EXxmm_md
, Ib
}, 0 },
6388 /* PREFIX_VEX_0F3A0B */
6392 { "vroundsd", { XMScalar
, VexScalar
, EXxmm_mq
, Ib
}, 0 },
6395 /* PREFIX_VEX_0F3A0C */
6399 { "vblendps", { XM
, Vex
, EXx
, Ib
}, 0 },
6402 /* PREFIX_VEX_0F3A0D */
6406 { "vblendpd", { XM
, Vex
, EXx
, Ib
}, 0 },
6409 /* PREFIX_VEX_0F3A0E */
6413 { "vpblendw", { XM
, Vex
, EXx
, Ib
}, 0 },
6416 /* PREFIX_VEX_0F3A0F */
6420 { "vpalignr", { XM
, Vex
, EXx
, Ib
}, 0 },
6423 /* PREFIX_VEX_0F3A14 */
6427 { VEX_LEN_TABLE (VEX_LEN_0F3A14_P_2
) },
6430 /* PREFIX_VEX_0F3A15 */
6434 { VEX_LEN_TABLE (VEX_LEN_0F3A15_P_2
) },
6437 /* PREFIX_VEX_0F3A16 */
6441 { VEX_LEN_TABLE (VEX_LEN_0F3A16_P_2
) },
6444 /* PREFIX_VEX_0F3A17 */
6448 { VEX_LEN_TABLE (VEX_LEN_0F3A17_P_2
) },
6451 /* PREFIX_VEX_0F3A18 */
6455 { VEX_LEN_TABLE (VEX_LEN_0F3A18_P_2
) },
6458 /* PREFIX_VEX_0F3A19 */
6462 { VEX_LEN_TABLE (VEX_LEN_0F3A19_P_2
) },
6465 /* PREFIX_VEX_0F3A1D */
6469 { VEX_W_TABLE (VEX_W_0F3A1D_P_2
) },
6472 /* PREFIX_VEX_0F3A20 */
6476 { VEX_LEN_TABLE (VEX_LEN_0F3A20_P_2
) },
6479 /* PREFIX_VEX_0F3A21 */
6483 { VEX_LEN_TABLE (VEX_LEN_0F3A21_P_2
) },
6486 /* PREFIX_VEX_0F3A22 */
6490 { VEX_LEN_TABLE (VEX_LEN_0F3A22_P_2
) },
6493 /* PREFIX_VEX_0F3A30 */
6497 { VEX_LEN_TABLE (VEX_LEN_0F3A30_P_2
) },
6500 /* PREFIX_VEX_0F3A31 */
6504 { VEX_LEN_TABLE (VEX_LEN_0F3A31_P_2
) },
6507 /* PREFIX_VEX_0F3A32 */
6511 { VEX_LEN_TABLE (VEX_LEN_0F3A32_P_2
) },
6514 /* PREFIX_VEX_0F3A33 */
6518 { VEX_LEN_TABLE (VEX_LEN_0F3A33_P_2
) },
6521 /* PREFIX_VEX_0F3A38 */
6525 { VEX_LEN_TABLE (VEX_LEN_0F3A38_P_2
) },
6528 /* PREFIX_VEX_0F3A39 */
6532 { VEX_LEN_TABLE (VEX_LEN_0F3A39_P_2
) },
6535 /* PREFIX_VEX_0F3A40 */
6539 { "vdpps", { XM
, Vex
, EXx
, Ib
}, 0 },
6542 /* PREFIX_VEX_0F3A41 */
6546 { VEX_LEN_TABLE (VEX_LEN_0F3A41_P_2
) },
6549 /* PREFIX_VEX_0F3A42 */
6553 { "vmpsadbw", { XM
, Vex
, EXx
, Ib
}, 0 },
6556 /* PREFIX_VEX_0F3A44 */
6560 { "vpclmulqdq", { XM
, Vex
, EXx
, PCLMUL
}, 0 },
6563 /* PREFIX_VEX_0F3A46 */
6567 { VEX_LEN_TABLE (VEX_LEN_0F3A46_P_2
) },
6570 /* PREFIX_VEX_0F3A48 */
6574 { "vpermil2ps", { XM
, Vex
, EXx
, XMVexI4
, VexI4
}, 0 },
6577 /* PREFIX_VEX_0F3A49 */
6581 { "vpermil2pd", { XM
, Vex
, EXx
, XMVexI4
, VexI4
}, 0 },
6584 /* PREFIX_VEX_0F3A4A */
6588 { VEX_W_TABLE (VEX_W_0F3A4A_P_2
) },
6591 /* PREFIX_VEX_0F3A4B */
6595 { VEX_W_TABLE (VEX_W_0F3A4B_P_2
) },
6598 /* PREFIX_VEX_0F3A4C */
6602 { VEX_W_TABLE (VEX_W_0F3A4C_P_2
) },
6605 /* PREFIX_VEX_0F3A5C */
6609 { "vfmaddsubps", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
6612 /* PREFIX_VEX_0F3A5D */
6616 { "vfmaddsubpd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
6619 /* PREFIX_VEX_0F3A5E */
6623 { "vfmsubaddps", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
6626 /* PREFIX_VEX_0F3A5F */
6630 { "vfmsubaddpd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
6633 /* PREFIX_VEX_0F3A60 */
6637 { VEX_LEN_TABLE (VEX_LEN_0F3A60_P_2
) },
6641 /* PREFIX_VEX_0F3A61 */
6645 { VEX_LEN_TABLE (VEX_LEN_0F3A61_P_2
) },
6648 /* PREFIX_VEX_0F3A62 */
6652 { VEX_LEN_TABLE (VEX_LEN_0F3A62_P_2
) },
6655 /* PREFIX_VEX_0F3A63 */
6659 { VEX_LEN_TABLE (VEX_LEN_0F3A63_P_2
) },
6662 /* PREFIX_VEX_0F3A68 */
6666 { "vfmaddps", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
6669 /* PREFIX_VEX_0F3A69 */
6673 { "vfmaddpd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
6676 /* PREFIX_VEX_0F3A6A */
6680 { "vfmaddss", { XMScalar
, VexScalar
, EXxmm_md
, XMVexScalarI4
}, 0 },
6683 /* PREFIX_VEX_0F3A6B */
6687 { "vfmaddsd", { XMScalar
, VexScalar
, EXxmm_mq
, XMVexScalarI4
}, 0 },
6690 /* PREFIX_VEX_0F3A6C */
6694 { "vfmsubps", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
6697 /* PREFIX_VEX_0F3A6D */
6701 { "vfmsubpd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
6704 /* PREFIX_VEX_0F3A6E */
6708 { "vfmsubss", { XMScalar
, VexScalar
, EXxmm_md
, XMVexScalarI4
}, 0 },
6711 /* PREFIX_VEX_0F3A6F */
6715 { "vfmsubsd", { XMScalar
, VexScalar
, EXxmm_mq
, XMVexScalarI4
}, 0 },
6718 /* PREFIX_VEX_0F3A78 */
6722 { "vfnmaddps", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
6725 /* PREFIX_VEX_0F3A79 */
6729 { "vfnmaddpd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
6732 /* PREFIX_VEX_0F3A7A */
6736 { "vfnmaddss", { XMScalar
, VexScalar
, EXxmm_md
, XMVexScalarI4
}, 0 },
6739 /* PREFIX_VEX_0F3A7B */
6743 { "vfnmaddsd", { XMScalar
, VexScalar
, EXxmm_mq
, XMVexScalarI4
}, 0 },
6746 /* PREFIX_VEX_0F3A7C */
6750 { "vfnmsubps", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
6754 /* PREFIX_VEX_0F3A7D */
6758 { "vfnmsubpd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
6761 /* PREFIX_VEX_0F3A7E */
6765 { "vfnmsubss", { XMScalar
, VexScalar
, EXxmm_md
, XMVexScalarI4
}, 0 },
6768 /* PREFIX_VEX_0F3A7F */
6772 { "vfnmsubsd", { XMScalar
, VexScalar
, EXxmm_mq
, XMVexScalarI4
}, 0 },
6775 /* PREFIX_VEX_0F3ACE */
6779 { VEX_W_TABLE (VEX_W_0F3ACE_P_2
) },
6782 /* PREFIX_VEX_0F3ACF */
6786 { VEX_W_TABLE (VEX_W_0F3ACF_P_2
) },
6789 /* PREFIX_VEX_0F3ADF */
6793 { VEX_LEN_TABLE (VEX_LEN_0F3ADF_P_2
) },
6796 /* PREFIX_VEX_0F3AF0 */
6801 { VEX_LEN_TABLE (VEX_LEN_0F3AF0_P_3
) },
6804 #include "i386-dis-evex-prefix.h"
6807 static const struct dis386 x86_64_table
[][2] = {
6810 { "pushP", { es
}, 0 },
6815 { "popP", { es
}, 0 },
6820 { "pushP", { cs
}, 0 },
6825 { "pushP", { ss
}, 0 },
6830 { "popP", { ss
}, 0 },
6835 { "pushP", { ds
}, 0 },
6840 { "popP", { ds
}, 0 },
6845 { "daa", { XX
}, 0 },
6850 { "das", { XX
}, 0 },
6855 { "aaa", { XX
}, 0 },
6860 { "aas", { XX
}, 0 },
6865 { "pushaP", { XX
}, 0 },
6870 { "popaP", { XX
}, 0 },
6875 { MOD_TABLE (MOD_62_32BIT
) },
6876 { EVEX_TABLE (EVEX_0F
) },
6881 { "arpl", { Ew
, Gw
}, 0 },
6882 { "movs", { { OP_G
, movsxd_mode
}, { MOVSXD_Fixup
, movsxd_mode
} }, 0 },
6887 { "ins{R|}", { Yzr
, indirDX
}, 0 },
6888 { "ins{G|}", { Yzr
, indirDX
}, 0 },
6893 { "outs{R|}", { indirDXr
, Xz
}, 0 },
6894 { "outs{G|}", { indirDXr
, Xz
}, 0 },
6899 /* Opcode 0x82 is an alias of opcode 0x80 in 32-bit mode. */
6900 { REG_TABLE (REG_80
) },
6905 { "{l|}call{T|}", { Ap
}, 0 },
6910 { "retP", { Iw
, BND
}, 0 },
6911 { "ret@", { Iw
, BND
}, 0 },
6916 { "retP", { BND
}, 0 },
6917 { "ret@", { BND
}, 0 },
6922 { MOD_TABLE (MOD_C4_32BIT
) },
6923 { VEX_C4_TABLE (VEX_0F
) },
6928 { MOD_TABLE (MOD_C5_32BIT
) },
6929 { VEX_C5_TABLE (VEX_0F
) },
6934 { "into", { XX
}, 0 },
6939 { "aam", { Ib
}, 0 },
6944 { "aad", { Ib
}, 0 },
6949 { "callP", { Jv
, BND
}, 0 },
6950 { "call@", { Jv
, BND
}, 0 }
6955 { "jmpP", { Jv
, BND
}, 0 },
6956 { "jmp@", { Jv
, BND
}, 0 }
6961 { "{l|}jmp{T|}", { Ap
}, 0 },
6964 /* X86_64_0F01_REG_0 */
6966 { "sgdt{Q|Q}", { M
}, 0 },
6967 { "sgdt", { M
}, 0 },
6970 /* X86_64_0F01_REG_1 */
6972 { "sidt{Q|Q}", { M
}, 0 },
6973 { "sidt", { M
}, 0 },
6976 /* X86_64_0F01_REG_2 */
6978 { "lgdt{Q|Q}", { M
}, 0 },
6979 { "lgdt", { M
}, 0 },
6982 /* X86_64_0F01_REG_3 */
6984 { "lidt{Q|Q}", { M
}, 0 },
6985 { "lidt", { M
}, 0 },
6988 /* X86_64_VEX_0F3849 */
6991 { PREFIX_TABLE (PREFIX_VEX_0F3849_X86_64
) },
6994 /* X86_64_VEX_0F384B */
6997 { PREFIX_TABLE (PREFIX_VEX_0F384B_X86_64
) },
7000 /* X86_64_VEX_0F385C */
7003 { PREFIX_TABLE (PREFIX_VEX_0F385C_X86_64
) },
7006 /* X86_64_VEX_0F385E */
7009 { PREFIX_TABLE (PREFIX_VEX_0F385E_X86_64
) },
7013 static const struct dis386 three_byte_table
[][256] = {
7015 /* THREE_BYTE_0F38 */
7018 { "pshufb", { MX
, EM
}, PREFIX_OPCODE
},
7019 { "phaddw", { MX
, EM
}, PREFIX_OPCODE
},
7020 { "phaddd", { MX
, EM
}, PREFIX_OPCODE
},
7021 { "phaddsw", { MX
, EM
}, PREFIX_OPCODE
},
7022 { "pmaddubsw", { MX
, EM
}, PREFIX_OPCODE
},
7023 { "phsubw", { MX
, EM
}, PREFIX_OPCODE
},
7024 { "phsubd", { MX
, EM
}, PREFIX_OPCODE
},
7025 { "phsubsw", { MX
, EM
}, PREFIX_OPCODE
},
7027 { "psignb", { MX
, EM
}, PREFIX_OPCODE
},
7028 { "psignw", { MX
, EM
}, PREFIX_OPCODE
},
7029 { "psignd", { MX
, EM
}, PREFIX_OPCODE
},
7030 { "pmulhrsw", { MX
, EM
}, PREFIX_OPCODE
},
7036 { PREFIX_TABLE (PREFIX_0F3810
) },
7040 { PREFIX_TABLE (PREFIX_0F3814
) },
7041 { PREFIX_TABLE (PREFIX_0F3815
) },
7043 { PREFIX_TABLE (PREFIX_0F3817
) },
7049 { "pabsb", { MX
, EM
}, PREFIX_OPCODE
},
7050 { "pabsw", { MX
, EM
}, PREFIX_OPCODE
},
7051 { "pabsd", { MX
, EM
}, PREFIX_OPCODE
},
7054 { PREFIX_TABLE (PREFIX_0F3820
) },
7055 { PREFIX_TABLE (PREFIX_0F3821
) },
7056 { PREFIX_TABLE (PREFIX_0F3822
) },
7057 { PREFIX_TABLE (PREFIX_0F3823
) },
7058 { PREFIX_TABLE (PREFIX_0F3824
) },
7059 { PREFIX_TABLE (PREFIX_0F3825
) },
7063 { PREFIX_TABLE (PREFIX_0F3828
) },
7064 { PREFIX_TABLE (PREFIX_0F3829
) },
7065 { PREFIX_TABLE (PREFIX_0F382A
) },
7066 { PREFIX_TABLE (PREFIX_0F382B
) },
7072 { PREFIX_TABLE (PREFIX_0F3830
) },
7073 { PREFIX_TABLE (PREFIX_0F3831
) },
7074 { PREFIX_TABLE (PREFIX_0F3832
) },
7075 { PREFIX_TABLE (PREFIX_0F3833
) },
7076 { PREFIX_TABLE (PREFIX_0F3834
) },
7077 { PREFIX_TABLE (PREFIX_0F3835
) },
7079 { PREFIX_TABLE (PREFIX_0F3837
) },
7081 { PREFIX_TABLE (PREFIX_0F3838
) },
7082 { PREFIX_TABLE (PREFIX_0F3839
) },
7083 { PREFIX_TABLE (PREFIX_0F383A
) },
7084 { PREFIX_TABLE (PREFIX_0F383B
) },
7085 { PREFIX_TABLE (PREFIX_0F383C
) },
7086 { PREFIX_TABLE (PREFIX_0F383D
) },
7087 { PREFIX_TABLE (PREFIX_0F383E
) },
7088 { PREFIX_TABLE (PREFIX_0F383F
) },
7090 { PREFIX_TABLE (PREFIX_0F3840
) },
7091 { PREFIX_TABLE (PREFIX_0F3841
) },
7162 { PREFIX_TABLE (PREFIX_0F3880
) },
7163 { PREFIX_TABLE (PREFIX_0F3881
) },
7164 { PREFIX_TABLE (PREFIX_0F3882
) },
7243 { PREFIX_TABLE (PREFIX_0F38C8
) },
7244 { PREFIX_TABLE (PREFIX_0F38C9
) },
7245 { PREFIX_TABLE (PREFIX_0F38CA
) },
7246 { PREFIX_TABLE (PREFIX_0F38CB
) },
7247 { PREFIX_TABLE (PREFIX_0F38CC
) },
7248 { PREFIX_TABLE (PREFIX_0F38CD
) },
7250 { PREFIX_TABLE (PREFIX_0F38CF
) },
7264 { PREFIX_TABLE (PREFIX_0F38DB
) },
7265 { PREFIX_TABLE (PREFIX_0F38DC
) },
7266 { PREFIX_TABLE (PREFIX_0F38DD
) },
7267 { PREFIX_TABLE (PREFIX_0F38DE
) },
7268 { PREFIX_TABLE (PREFIX_0F38DF
) },
7288 { PREFIX_TABLE (PREFIX_0F38F0
) },
7289 { PREFIX_TABLE (PREFIX_0F38F1
) },
7293 { PREFIX_TABLE (PREFIX_0F38F5
) },
7294 { PREFIX_TABLE (PREFIX_0F38F6
) },
7297 { PREFIX_TABLE (PREFIX_0F38F8
) },
7298 { PREFIX_TABLE (PREFIX_0F38F9
) },
7306 /* THREE_BYTE_0F3A */
7318 { PREFIX_TABLE (PREFIX_0F3A08
) },
7319 { PREFIX_TABLE (PREFIX_0F3A09
) },
7320 { PREFIX_TABLE (PREFIX_0F3A0A
) },
7321 { PREFIX_TABLE (PREFIX_0F3A0B
) },
7322 { PREFIX_TABLE (PREFIX_0F3A0C
) },
7323 { PREFIX_TABLE (PREFIX_0F3A0D
) },
7324 { PREFIX_TABLE (PREFIX_0F3A0E
) },
7325 { "palignr", { MX
, EM
, Ib
}, PREFIX_OPCODE
},
7331 { PREFIX_TABLE (PREFIX_0F3A14
) },
7332 { PREFIX_TABLE (PREFIX_0F3A15
) },
7333 { PREFIX_TABLE (PREFIX_0F3A16
) },
7334 { PREFIX_TABLE (PREFIX_0F3A17
) },
7345 { PREFIX_TABLE (PREFIX_0F3A20
) },
7346 { PREFIX_TABLE (PREFIX_0F3A21
) },
7347 { PREFIX_TABLE (PREFIX_0F3A22
) },
7381 { PREFIX_TABLE (PREFIX_0F3A40
) },
7382 { PREFIX_TABLE (PREFIX_0F3A41
) },
7383 { PREFIX_TABLE (PREFIX_0F3A42
) },
7385 { PREFIX_TABLE (PREFIX_0F3A44
) },
7417 { PREFIX_TABLE (PREFIX_0F3A60
) },
7418 { PREFIX_TABLE (PREFIX_0F3A61
) },
7419 { PREFIX_TABLE (PREFIX_0F3A62
) },
7420 { PREFIX_TABLE (PREFIX_0F3A63
) },
7538 { PREFIX_TABLE (PREFIX_0F3ACC
) },
7540 { PREFIX_TABLE (PREFIX_0F3ACE
) },
7541 { PREFIX_TABLE (PREFIX_0F3ACF
) },
7559 { PREFIX_TABLE (PREFIX_0F3ADF
) },
7599 static const struct dis386 xop_table
[][256] = {
7752 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_85
) },
7753 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_86
) },
7754 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_87
) },
7762 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_8E
) },
7763 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_8F
) },
7770 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_95
) },
7771 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_96
) },
7772 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_97
) },
7780 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_9E
) },
7781 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_9F
) },
7785 { "vpcmov", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
7786 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_A3
) },
7789 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_A6
) },
7807 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_B6
) },
7819 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C0
) },
7820 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C1
) },
7821 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C2
) },
7822 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C3
) },
7832 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CC
) },
7833 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CD
) },
7834 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CE
) },
7835 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CF
) },
7868 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EC
) },
7869 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_ED
) },
7870 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EE
) },
7871 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EF
) },
7895 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_01
) },
7896 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_02
) },
7914 { MOD_TABLE (MOD_VEX_0FXOP_09_12
) },
8038 { VEX_W_TABLE (VEX_W_0FXOP_09_80
) },
8039 { VEX_W_TABLE (VEX_W_0FXOP_09_81
) },
8040 { VEX_W_TABLE (VEX_W_0FXOP_09_82
) },
8041 { VEX_W_TABLE (VEX_W_0FXOP_09_83
) },
8056 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_90
) },
8057 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_91
) },
8058 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_92
) },
8059 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_93
) },
8060 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_94
) },
8061 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_95
) },
8062 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_96
) },
8063 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_97
) },
8065 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_98
) },
8066 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_99
) },
8067 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_9A
) },
8068 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_9B
) },
8111 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C1
) },
8112 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C2
) },
8113 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C3
) },
8116 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C6
) },
8117 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C7
) },
8122 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_CB
) },
8129 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D1
) },
8130 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D2
) },
8131 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D3
) },
8134 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D6
) },
8135 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D7
) },
8140 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_DB
) },
8147 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_E1
) },
8148 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_E2
) },
8149 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_E3
) },
8203 { "bextrS", { Gdq
, Edq
, Id
}, 0 },
8205 { VEX_LEN_TABLE (VEX_LEN_0FXOP_0A_12
) },
8475 static const struct dis386 vex_table
[][256] = {
8497 { PREFIX_TABLE (PREFIX_VEX_0F10
) },
8498 { PREFIX_TABLE (PREFIX_VEX_0F11
) },
8499 { PREFIX_TABLE (PREFIX_VEX_0F12
) },
8500 { MOD_TABLE (MOD_VEX_0F13
) },
8501 { "vunpcklpX", { XM
, Vex
, EXx
}, PREFIX_OPCODE
},
8502 { "vunpckhpX", { XM
, Vex
, EXx
}, PREFIX_OPCODE
},
8503 { PREFIX_TABLE (PREFIX_VEX_0F16
) },
8504 { MOD_TABLE (MOD_VEX_0F17
) },
8524 { "vmovapX", { XM
, EXx
}, PREFIX_OPCODE
},
8525 { "vmovapX", { EXxS
, XM
}, PREFIX_OPCODE
},
8526 { PREFIX_TABLE (PREFIX_VEX_0F2A
) },
8527 { MOD_TABLE (MOD_VEX_0F2B
) },
8528 { PREFIX_TABLE (PREFIX_VEX_0F2C
) },
8529 { PREFIX_TABLE (PREFIX_VEX_0F2D
) },
8530 { PREFIX_TABLE (PREFIX_VEX_0F2E
) },
8531 { PREFIX_TABLE (PREFIX_VEX_0F2F
) },
8552 { PREFIX_TABLE (PREFIX_VEX_0F41
) },
8553 { PREFIX_TABLE (PREFIX_VEX_0F42
) },
8555 { PREFIX_TABLE (PREFIX_VEX_0F44
) },
8556 { PREFIX_TABLE (PREFIX_VEX_0F45
) },
8557 { PREFIX_TABLE (PREFIX_VEX_0F46
) },
8558 { PREFIX_TABLE (PREFIX_VEX_0F47
) },
8562 { PREFIX_TABLE (PREFIX_VEX_0F4A
) },
8563 { PREFIX_TABLE (PREFIX_VEX_0F4B
) },
8569 { MOD_TABLE (MOD_VEX_0F50
) },
8570 { PREFIX_TABLE (PREFIX_VEX_0F51
) },
8571 { PREFIX_TABLE (PREFIX_VEX_0F52
) },
8572 { PREFIX_TABLE (PREFIX_VEX_0F53
) },
8573 { "vandpX", { XM
, Vex
, EXx
}, PREFIX_OPCODE
},
8574 { "vandnpX", { XM
, Vex
, EXx
}, PREFIX_OPCODE
},
8575 { "vorpX", { XM
, Vex
, EXx
}, PREFIX_OPCODE
},
8576 { "vxorpX", { XM
, Vex
, EXx
}, PREFIX_OPCODE
},
8578 { PREFIX_TABLE (PREFIX_VEX_0F58
) },
8579 { PREFIX_TABLE (PREFIX_VEX_0F59
) },
8580 { PREFIX_TABLE (PREFIX_VEX_0F5A
) },
8581 { PREFIX_TABLE (PREFIX_VEX_0F5B
) },
8582 { PREFIX_TABLE (PREFIX_VEX_0F5C
) },
8583 { PREFIX_TABLE (PREFIX_VEX_0F5D
) },
8584 { PREFIX_TABLE (PREFIX_VEX_0F5E
) },
8585 { PREFIX_TABLE (PREFIX_VEX_0F5F
) },
8587 { PREFIX_TABLE (PREFIX_VEX_0F60
) },
8588 { PREFIX_TABLE (PREFIX_VEX_0F61
) },
8589 { PREFIX_TABLE (PREFIX_VEX_0F62
) },
8590 { PREFIX_TABLE (PREFIX_VEX_0F63
) },
8591 { PREFIX_TABLE (PREFIX_VEX_0F64
) },
8592 { PREFIX_TABLE (PREFIX_VEX_0F65
) },
8593 { PREFIX_TABLE (PREFIX_VEX_0F66
) },
8594 { PREFIX_TABLE (PREFIX_VEX_0F67
) },
8596 { PREFIX_TABLE (PREFIX_VEX_0F68
) },
8597 { PREFIX_TABLE (PREFIX_VEX_0F69
) },
8598 { PREFIX_TABLE (PREFIX_VEX_0F6A
) },
8599 { PREFIX_TABLE (PREFIX_VEX_0F6B
) },
8600 { PREFIX_TABLE (PREFIX_VEX_0F6C
) },
8601 { PREFIX_TABLE (PREFIX_VEX_0F6D
) },
8602 { PREFIX_TABLE (PREFIX_VEX_0F6E
) },
8603 { PREFIX_TABLE (PREFIX_VEX_0F6F
) },
8605 { PREFIX_TABLE (PREFIX_VEX_0F70
) },
8606 { REG_TABLE (REG_VEX_0F71
) },
8607 { REG_TABLE (REG_VEX_0F72
) },
8608 { REG_TABLE (REG_VEX_0F73
) },
8609 { PREFIX_TABLE (PREFIX_VEX_0F74
) },
8610 { PREFIX_TABLE (PREFIX_VEX_0F75
) },
8611 { PREFIX_TABLE (PREFIX_VEX_0F76
) },
8612 { PREFIX_TABLE (PREFIX_VEX_0F77
) },
8618 { PREFIX_TABLE (PREFIX_VEX_0F7C
) },
8619 { PREFIX_TABLE (PREFIX_VEX_0F7D
) },
8620 { PREFIX_TABLE (PREFIX_VEX_0F7E
) },
8621 { PREFIX_TABLE (PREFIX_VEX_0F7F
) },
8641 { PREFIX_TABLE (PREFIX_VEX_0F90
) },
8642 { PREFIX_TABLE (PREFIX_VEX_0F91
) },
8643 { PREFIX_TABLE (PREFIX_VEX_0F92
) },
8644 { PREFIX_TABLE (PREFIX_VEX_0F93
) },
8650 { PREFIX_TABLE (PREFIX_VEX_0F98
) },
8651 { PREFIX_TABLE (PREFIX_VEX_0F99
) },
8674 { REG_TABLE (REG_VEX_0FAE
) },
8697 { PREFIX_TABLE (PREFIX_VEX_0FC2
) },
8699 { PREFIX_TABLE (PREFIX_VEX_0FC4
) },
8700 { PREFIX_TABLE (PREFIX_VEX_0FC5
) },
8701 { "vshufpX", { XM
, Vex
, EXx
, Ib
}, PREFIX_OPCODE
},
8713 { PREFIX_TABLE (PREFIX_VEX_0FD0
) },
8714 { PREFIX_TABLE (PREFIX_VEX_0FD1
) },
8715 { PREFIX_TABLE (PREFIX_VEX_0FD2
) },
8716 { PREFIX_TABLE (PREFIX_VEX_0FD3
) },
8717 { PREFIX_TABLE (PREFIX_VEX_0FD4
) },
8718 { PREFIX_TABLE (PREFIX_VEX_0FD5
) },
8719 { PREFIX_TABLE (PREFIX_VEX_0FD6
) },
8720 { PREFIX_TABLE (PREFIX_VEX_0FD7
) },
8722 { PREFIX_TABLE (PREFIX_VEX_0FD8
) },
8723 { PREFIX_TABLE (PREFIX_VEX_0FD9
) },
8724 { PREFIX_TABLE (PREFIX_VEX_0FDA
) },
8725 { PREFIX_TABLE (PREFIX_VEX_0FDB
) },
8726 { PREFIX_TABLE (PREFIX_VEX_0FDC
) },
8727 { PREFIX_TABLE (PREFIX_VEX_0FDD
) },
8728 { PREFIX_TABLE (PREFIX_VEX_0FDE
) },
8729 { PREFIX_TABLE (PREFIX_VEX_0FDF
) },
8731 { PREFIX_TABLE (PREFIX_VEX_0FE0
) },
8732 { PREFIX_TABLE (PREFIX_VEX_0FE1
) },
8733 { PREFIX_TABLE (PREFIX_VEX_0FE2
) },
8734 { PREFIX_TABLE (PREFIX_VEX_0FE3
) },
8735 { PREFIX_TABLE (PREFIX_VEX_0FE4
) },
8736 { PREFIX_TABLE (PREFIX_VEX_0FE5
) },
8737 { PREFIX_TABLE (PREFIX_VEX_0FE6
) },
8738 { PREFIX_TABLE (PREFIX_VEX_0FE7
) },
8740 { PREFIX_TABLE (PREFIX_VEX_0FE8
) },
8741 { PREFIX_TABLE (PREFIX_VEX_0FE9
) },
8742 { PREFIX_TABLE (PREFIX_VEX_0FEA
) },
8743 { PREFIX_TABLE (PREFIX_VEX_0FEB
) },
8744 { PREFIX_TABLE (PREFIX_VEX_0FEC
) },
8745 { PREFIX_TABLE (PREFIX_VEX_0FED
) },
8746 { PREFIX_TABLE (PREFIX_VEX_0FEE
) },
8747 { PREFIX_TABLE (PREFIX_VEX_0FEF
) },
8749 { PREFIX_TABLE (PREFIX_VEX_0FF0
) },
8750 { PREFIX_TABLE (PREFIX_VEX_0FF1
) },
8751 { PREFIX_TABLE (PREFIX_VEX_0FF2
) },
8752 { PREFIX_TABLE (PREFIX_VEX_0FF3
) },
8753 { PREFIX_TABLE (PREFIX_VEX_0FF4
) },
8754 { PREFIX_TABLE (PREFIX_VEX_0FF5
) },
8755 { PREFIX_TABLE (PREFIX_VEX_0FF6
) },
8756 { PREFIX_TABLE (PREFIX_VEX_0FF7
) },
8758 { PREFIX_TABLE (PREFIX_VEX_0FF8
) },
8759 { PREFIX_TABLE (PREFIX_VEX_0FF9
) },
8760 { PREFIX_TABLE (PREFIX_VEX_0FFA
) },
8761 { PREFIX_TABLE (PREFIX_VEX_0FFB
) },
8762 { PREFIX_TABLE (PREFIX_VEX_0FFC
) },
8763 { PREFIX_TABLE (PREFIX_VEX_0FFD
) },
8764 { PREFIX_TABLE (PREFIX_VEX_0FFE
) },
8770 { PREFIX_TABLE (PREFIX_VEX_0F3800
) },
8771 { PREFIX_TABLE (PREFIX_VEX_0F3801
) },
8772 { PREFIX_TABLE (PREFIX_VEX_0F3802
) },
8773 { PREFIX_TABLE (PREFIX_VEX_0F3803
) },
8774 { PREFIX_TABLE (PREFIX_VEX_0F3804
) },
8775 { PREFIX_TABLE (PREFIX_VEX_0F3805
) },
8776 { PREFIX_TABLE (PREFIX_VEX_0F3806
) },
8777 { PREFIX_TABLE (PREFIX_VEX_0F3807
) },
8779 { PREFIX_TABLE (PREFIX_VEX_0F3808
) },
8780 { PREFIX_TABLE (PREFIX_VEX_0F3809
) },
8781 { PREFIX_TABLE (PREFIX_VEX_0F380A
) },
8782 { PREFIX_TABLE (PREFIX_VEX_0F380B
) },
8783 { PREFIX_TABLE (PREFIX_VEX_0F380C
) },
8784 { PREFIX_TABLE (PREFIX_VEX_0F380D
) },
8785 { PREFIX_TABLE (PREFIX_VEX_0F380E
) },
8786 { PREFIX_TABLE (PREFIX_VEX_0F380F
) },
8791 { PREFIX_TABLE (PREFIX_VEX_0F3813
) },
8794 { PREFIX_TABLE (PREFIX_VEX_0F3816
) },
8795 { PREFIX_TABLE (PREFIX_VEX_0F3817
) },
8797 { PREFIX_TABLE (PREFIX_VEX_0F3818
) },
8798 { PREFIX_TABLE (PREFIX_VEX_0F3819
) },
8799 { PREFIX_TABLE (PREFIX_VEX_0F381A
) },
8801 { PREFIX_TABLE (PREFIX_VEX_0F381C
) },
8802 { PREFIX_TABLE (PREFIX_VEX_0F381D
) },
8803 { PREFIX_TABLE (PREFIX_VEX_0F381E
) },
8806 { PREFIX_TABLE (PREFIX_VEX_0F3820
) },
8807 { PREFIX_TABLE (PREFIX_VEX_0F3821
) },
8808 { PREFIX_TABLE (PREFIX_VEX_0F3822
) },
8809 { PREFIX_TABLE (PREFIX_VEX_0F3823
) },
8810 { PREFIX_TABLE (PREFIX_VEX_0F3824
) },
8811 { PREFIX_TABLE (PREFIX_VEX_0F3825
) },
8815 { PREFIX_TABLE (PREFIX_VEX_0F3828
) },
8816 { PREFIX_TABLE (PREFIX_VEX_0F3829
) },
8817 { PREFIX_TABLE (PREFIX_VEX_0F382A
) },
8818 { PREFIX_TABLE (PREFIX_VEX_0F382B
) },
8819 { PREFIX_TABLE (PREFIX_VEX_0F382C
) },
8820 { PREFIX_TABLE (PREFIX_VEX_0F382D
) },
8821 { PREFIX_TABLE (PREFIX_VEX_0F382E
) },
8822 { PREFIX_TABLE (PREFIX_VEX_0F382F
) },
8824 { PREFIX_TABLE (PREFIX_VEX_0F3830
) },
8825 { PREFIX_TABLE (PREFIX_VEX_0F3831
) },
8826 { PREFIX_TABLE (PREFIX_VEX_0F3832
) },
8827 { PREFIX_TABLE (PREFIX_VEX_0F3833
) },
8828 { PREFIX_TABLE (PREFIX_VEX_0F3834
) },
8829 { PREFIX_TABLE (PREFIX_VEX_0F3835
) },
8830 { PREFIX_TABLE (PREFIX_VEX_0F3836
) },
8831 { PREFIX_TABLE (PREFIX_VEX_0F3837
) },
8833 { PREFIX_TABLE (PREFIX_VEX_0F3838
) },
8834 { PREFIX_TABLE (PREFIX_VEX_0F3839
) },
8835 { PREFIX_TABLE (PREFIX_VEX_0F383A
) },
8836 { PREFIX_TABLE (PREFIX_VEX_0F383B
) },
8837 { PREFIX_TABLE (PREFIX_VEX_0F383C
) },
8838 { PREFIX_TABLE (PREFIX_VEX_0F383D
) },
8839 { PREFIX_TABLE (PREFIX_VEX_0F383E
) },
8840 { PREFIX_TABLE (PREFIX_VEX_0F383F
) },
8842 { PREFIX_TABLE (PREFIX_VEX_0F3840
) },
8843 { PREFIX_TABLE (PREFIX_VEX_0F3841
) },
8847 { PREFIX_TABLE (PREFIX_VEX_0F3845
) },
8848 { PREFIX_TABLE (PREFIX_VEX_0F3846
) },
8849 { PREFIX_TABLE (PREFIX_VEX_0F3847
) },
8852 { X86_64_TABLE (X86_64_VEX_0F3849
) },
8854 { X86_64_TABLE (X86_64_VEX_0F384B
) },
8869 { PREFIX_TABLE (PREFIX_VEX_0F3858
) },
8870 { PREFIX_TABLE (PREFIX_VEX_0F3859
) },
8871 { PREFIX_TABLE (PREFIX_VEX_0F385A
) },
8873 { X86_64_TABLE (X86_64_VEX_0F385C
) },
8875 { X86_64_TABLE (X86_64_VEX_0F385E
) },
8905 { PREFIX_TABLE (PREFIX_VEX_0F3878
) },
8906 { PREFIX_TABLE (PREFIX_VEX_0F3879
) },
8927 { PREFIX_TABLE (PREFIX_VEX_0F388C
) },
8929 { PREFIX_TABLE (PREFIX_VEX_0F388E
) },
8932 { PREFIX_TABLE (PREFIX_VEX_0F3890
) },
8933 { PREFIX_TABLE (PREFIX_VEX_0F3891
) },
8934 { PREFIX_TABLE (PREFIX_VEX_0F3892
) },
8935 { PREFIX_TABLE (PREFIX_VEX_0F3893
) },
8938 { PREFIX_TABLE (PREFIX_VEX_0F3896
) },
8939 { PREFIX_TABLE (PREFIX_VEX_0F3897
) },
8941 { PREFIX_TABLE (PREFIX_VEX_0F3898
) },
8942 { PREFIX_TABLE (PREFIX_VEX_0F3899
) },
8943 { PREFIX_TABLE (PREFIX_VEX_0F389A
) },
8944 { PREFIX_TABLE (PREFIX_VEX_0F389B
) },
8945 { PREFIX_TABLE (PREFIX_VEX_0F389C
) },
8946 { PREFIX_TABLE (PREFIX_VEX_0F389D
) },
8947 { PREFIX_TABLE (PREFIX_VEX_0F389E
) },
8948 { PREFIX_TABLE (PREFIX_VEX_0F389F
) },
8956 { PREFIX_TABLE (PREFIX_VEX_0F38A6
) },
8957 { PREFIX_TABLE (PREFIX_VEX_0F38A7
) },
8959 { PREFIX_TABLE (PREFIX_VEX_0F38A8
) },
8960 { PREFIX_TABLE (PREFIX_VEX_0F38A9
) },
8961 { PREFIX_TABLE (PREFIX_VEX_0F38AA
) },
8962 { PREFIX_TABLE (PREFIX_VEX_0F38AB
) },
8963 { PREFIX_TABLE (PREFIX_VEX_0F38AC
) },
8964 { PREFIX_TABLE (PREFIX_VEX_0F38AD
) },
8965 { PREFIX_TABLE (PREFIX_VEX_0F38AE
) },
8966 { PREFIX_TABLE (PREFIX_VEX_0F38AF
) },
8974 { PREFIX_TABLE (PREFIX_VEX_0F38B6
) },
8975 { PREFIX_TABLE (PREFIX_VEX_0F38B7
) },
8977 { PREFIX_TABLE (PREFIX_VEX_0F38B8
) },
8978 { PREFIX_TABLE (PREFIX_VEX_0F38B9
) },
8979 { PREFIX_TABLE (PREFIX_VEX_0F38BA
) },
8980 { PREFIX_TABLE (PREFIX_VEX_0F38BB
) },
8981 { PREFIX_TABLE (PREFIX_VEX_0F38BC
) },
8982 { PREFIX_TABLE (PREFIX_VEX_0F38BD
) },
8983 { PREFIX_TABLE (PREFIX_VEX_0F38BE
) },
8984 { PREFIX_TABLE (PREFIX_VEX_0F38BF
) },
9002 { PREFIX_TABLE (PREFIX_VEX_0F38CF
) },
9016 { PREFIX_TABLE (PREFIX_VEX_0F38DB
) },
9017 { PREFIX_TABLE (PREFIX_VEX_0F38DC
) },
9018 { PREFIX_TABLE (PREFIX_VEX_0F38DD
) },
9019 { PREFIX_TABLE (PREFIX_VEX_0F38DE
) },
9020 { PREFIX_TABLE (PREFIX_VEX_0F38DF
) },
9042 { PREFIX_TABLE (PREFIX_VEX_0F38F2
) },
9043 { REG_TABLE (REG_VEX_0F38F3
) },
9045 { PREFIX_TABLE (PREFIX_VEX_0F38F5
) },
9046 { PREFIX_TABLE (PREFIX_VEX_0F38F6
) },
9047 { PREFIX_TABLE (PREFIX_VEX_0F38F7
) },
9061 { PREFIX_TABLE (PREFIX_VEX_0F3A00
) },
9062 { PREFIX_TABLE (PREFIX_VEX_0F3A01
) },
9063 { PREFIX_TABLE (PREFIX_VEX_0F3A02
) },
9065 { PREFIX_TABLE (PREFIX_VEX_0F3A04
) },
9066 { PREFIX_TABLE (PREFIX_VEX_0F3A05
) },
9067 { PREFIX_TABLE (PREFIX_VEX_0F3A06
) },
9070 { PREFIX_TABLE (PREFIX_VEX_0F3A08
) },
9071 { PREFIX_TABLE (PREFIX_VEX_0F3A09
) },
9072 { PREFIX_TABLE (PREFIX_VEX_0F3A0A
) },
9073 { PREFIX_TABLE (PREFIX_VEX_0F3A0B
) },
9074 { PREFIX_TABLE (PREFIX_VEX_0F3A0C
) },
9075 { PREFIX_TABLE (PREFIX_VEX_0F3A0D
) },
9076 { PREFIX_TABLE (PREFIX_VEX_0F3A0E
) },
9077 { PREFIX_TABLE (PREFIX_VEX_0F3A0F
) },
9083 { PREFIX_TABLE (PREFIX_VEX_0F3A14
) },
9084 { PREFIX_TABLE (PREFIX_VEX_0F3A15
) },
9085 { PREFIX_TABLE (PREFIX_VEX_0F3A16
) },
9086 { PREFIX_TABLE (PREFIX_VEX_0F3A17
) },
9088 { PREFIX_TABLE (PREFIX_VEX_0F3A18
) },
9089 { PREFIX_TABLE (PREFIX_VEX_0F3A19
) },
9093 { PREFIX_TABLE (PREFIX_VEX_0F3A1D
) },
9097 { PREFIX_TABLE (PREFIX_VEX_0F3A20
) },
9098 { PREFIX_TABLE (PREFIX_VEX_0F3A21
) },
9099 { PREFIX_TABLE (PREFIX_VEX_0F3A22
) },
9115 { PREFIX_TABLE (PREFIX_VEX_0F3A30
) },
9116 { PREFIX_TABLE (PREFIX_VEX_0F3A31
) },
9117 { PREFIX_TABLE (PREFIX_VEX_0F3A32
) },
9118 { PREFIX_TABLE (PREFIX_VEX_0F3A33
) },
9124 { PREFIX_TABLE (PREFIX_VEX_0F3A38
) },
9125 { PREFIX_TABLE (PREFIX_VEX_0F3A39
) },
9133 { PREFIX_TABLE (PREFIX_VEX_0F3A40
) },
9134 { PREFIX_TABLE (PREFIX_VEX_0F3A41
) },
9135 { PREFIX_TABLE (PREFIX_VEX_0F3A42
) },
9137 { PREFIX_TABLE (PREFIX_VEX_0F3A44
) },
9139 { PREFIX_TABLE (PREFIX_VEX_0F3A46
) },
9142 { PREFIX_TABLE (PREFIX_VEX_0F3A48
) },
9143 { PREFIX_TABLE (PREFIX_VEX_0F3A49
) },
9144 { PREFIX_TABLE (PREFIX_VEX_0F3A4A
) },
9145 { PREFIX_TABLE (PREFIX_VEX_0F3A4B
) },
9146 { PREFIX_TABLE (PREFIX_VEX_0F3A4C
) },
9164 { PREFIX_TABLE (PREFIX_VEX_0F3A5C
) },
9165 { PREFIX_TABLE (PREFIX_VEX_0F3A5D
) },
9166 { PREFIX_TABLE (PREFIX_VEX_0F3A5E
) },
9167 { PREFIX_TABLE (PREFIX_VEX_0F3A5F
) },
9169 { PREFIX_TABLE (PREFIX_VEX_0F3A60
) },
9170 { PREFIX_TABLE (PREFIX_VEX_0F3A61
) },
9171 { PREFIX_TABLE (PREFIX_VEX_0F3A62
) },
9172 { PREFIX_TABLE (PREFIX_VEX_0F3A63
) },
9178 { PREFIX_TABLE (PREFIX_VEX_0F3A68
) },
9179 { PREFIX_TABLE (PREFIX_VEX_0F3A69
) },
9180 { PREFIX_TABLE (PREFIX_VEX_0F3A6A
) },
9181 { PREFIX_TABLE (PREFIX_VEX_0F3A6B
) },
9182 { PREFIX_TABLE (PREFIX_VEX_0F3A6C
) },
9183 { PREFIX_TABLE (PREFIX_VEX_0F3A6D
) },
9184 { PREFIX_TABLE (PREFIX_VEX_0F3A6E
) },
9185 { PREFIX_TABLE (PREFIX_VEX_0F3A6F
) },
9196 { PREFIX_TABLE (PREFIX_VEX_0F3A78
) },
9197 { PREFIX_TABLE (PREFIX_VEX_0F3A79
) },
9198 { PREFIX_TABLE (PREFIX_VEX_0F3A7A
) },
9199 { PREFIX_TABLE (PREFIX_VEX_0F3A7B
) },
9200 { PREFIX_TABLE (PREFIX_VEX_0F3A7C
) },
9201 { PREFIX_TABLE (PREFIX_VEX_0F3A7D
) },
9202 { PREFIX_TABLE (PREFIX_VEX_0F3A7E
) },
9203 { PREFIX_TABLE (PREFIX_VEX_0F3A7F
) },
9292 { PREFIX_TABLE(PREFIX_VEX_0F3ACE
) },
9293 { PREFIX_TABLE(PREFIX_VEX_0F3ACF
) },
9311 { PREFIX_TABLE (PREFIX_VEX_0F3ADF
) },
9331 { PREFIX_TABLE (PREFIX_VEX_0F3AF0
) },
9351 #include "i386-dis-evex.h"
9353 static const struct dis386 vex_len_table
[][2] = {
9354 /* VEX_LEN_0F12_P_0_M_0 / VEX_LEN_0F12_P_2_M_0 */
9356 { "vmovlpX", { XM
, Vex128
, EXq
}, 0 },
9359 /* VEX_LEN_0F12_P_0_M_1 */
9361 { "vmovhlps", { XM
, Vex128
, EXq
}, 0 },
9364 /* VEX_LEN_0F13_M_0 */
9366 { "vmovlpX", { EXq
, XM
}, PREFIX_OPCODE
},
9369 /* VEX_LEN_0F16_P_0_M_0 / VEX_LEN_0F16_P_2_M_0 */
9371 { "vmovhpX", { XM
, Vex128
, EXq
}, 0 },
9374 /* VEX_LEN_0F16_P_0_M_1 */
9376 { "vmovlhps", { XM
, Vex128
, EXq
}, 0 },
9379 /* VEX_LEN_0F17_M_0 */
9381 { "vmovhpX", { EXq
, XM
}, PREFIX_OPCODE
},
9384 /* VEX_LEN_0F41_P_0 */
9387 { VEX_W_TABLE (VEX_W_0F41_P_0_LEN_1
) },
9389 /* VEX_LEN_0F41_P_2 */
9392 { VEX_W_TABLE (VEX_W_0F41_P_2_LEN_1
) },
9394 /* VEX_LEN_0F42_P_0 */
9397 { VEX_W_TABLE (VEX_W_0F42_P_0_LEN_1
) },
9399 /* VEX_LEN_0F42_P_2 */
9402 { VEX_W_TABLE (VEX_W_0F42_P_2_LEN_1
) },
9404 /* VEX_LEN_0F44_P_0 */
9406 { VEX_W_TABLE (VEX_W_0F44_P_0_LEN_0
) },
9408 /* VEX_LEN_0F44_P_2 */
9410 { VEX_W_TABLE (VEX_W_0F44_P_2_LEN_0
) },
9412 /* VEX_LEN_0F45_P_0 */
9415 { VEX_W_TABLE (VEX_W_0F45_P_0_LEN_1
) },
9417 /* VEX_LEN_0F45_P_2 */
9420 { VEX_W_TABLE (VEX_W_0F45_P_2_LEN_1
) },
9422 /* VEX_LEN_0F46_P_0 */
9425 { VEX_W_TABLE (VEX_W_0F46_P_0_LEN_1
) },
9427 /* VEX_LEN_0F46_P_2 */
9430 { VEX_W_TABLE (VEX_W_0F46_P_2_LEN_1
) },
9432 /* VEX_LEN_0F47_P_0 */
9435 { VEX_W_TABLE (VEX_W_0F47_P_0_LEN_1
) },
9437 /* VEX_LEN_0F47_P_2 */
9440 { VEX_W_TABLE (VEX_W_0F47_P_2_LEN_1
) },
9442 /* VEX_LEN_0F4A_P_0 */
9445 { VEX_W_TABLE (VEX_W_0F4A_P_0_LEN_1
) },
9447 /* VEX_LEN_0F4A_P_2 */
9450 { VEX_W_TABLE (VEX_W_0F4A_P_2_LEN_1
) },
9452 /* VEX_LEN_0F4B_P_0 */
9455 { VEX_W_TABLE (VEX_W_0F4B_P_0_LEN_1
) },
9457 /* VEX_LEN_0F4B_P_2 */
9460 { VEX_W_TABLE (VEX_W_0F4B_P_2_LEN_1
) },
9463 /* VEX_LEN_0F6E_P_2 */
9465 { "vmovK", { XMScalar
, Edq
}, 0 },
9468 /* VEX_LEN_0F77_P_1 */
9470 { "vzeroupper", { XX
}, 0 },
9471 { "vzeroall", { XX
}, 0 },
9474 /* VEX_LEN_0F7E_P_1 */
9476 { "vmovq", { XMScalar
, EXxmm_mq
}, 0 },
9479 /* VEX_LEN_0F7E_P_2 */
9481 { "vmovK", { Edq
, XMScalar
}, 0 },
9484 /* VEX_LEN_0F90_P_0 */
9486 { VEX_W_TABLE (VEX_W_0F90_P_0_LEN_0
) },
9489 /* VEX_LEN_0F90_P_2 */
9491 { VEX_W_TABLE (VEX_W_0F90_P_2_LEN_0
) },
9494 /* VEX_LEN_0F91_P_0 */
9496 { VEX_W_TABLE (VEX_W_0F91_P_0_LEN_0
) },
9499 /* VEX_LEN_0F91_P_2 */
9501 { VEX_W_TABLE (VEX_W_0F91_P_2_LEN_0
) },
9504 /* VEX_LEN_0F92_P_0 */
9506 { VEX_W_TABLE (VEX_W_0F92_P_0_LEN_0
) },
9509 /* VEX_LEN_0F92_P_2 */
9511 { VEX_W_TABLE (VEX_W_0F92_P_2_LEN_0
) },
9514 /* VEX_LEN_0F92_P_3 */
9516 { MOD_TABLE (MOD_VEX_0F92_P_3_LEN_0
) },
9519 /* VEX_LEN_0F93_P_0 */
9521 { VEX_W_TABLE (VEX_W_0F93_P_0_LEN_0
) },
9524 /* VEX_LEN_0F93_P_2 */
9526 { VEX_W_TABLE (VEX_W_0F93_P_2_LEN_0
) },
9529 /* VEX_LEN_0F93_P_3 */
9531 { MOD_TABLE (MOD_VEX_0F93_P_3_LEN_0
) },
9534 /* VEX_LEN_0F98_P_0 */
9536 { VEX_W_TABLE (VEX_W_0F98_P_0_LEN_0
) },
9539 /* VEX_LEN_0F98_P_2 */
9541 { VEX_W_TABLE (VEX_W_0F98_P_2_LEN_0
) },
9544 /* VEX_LEN_0F99_P_0 */
9546 { VEX_W_TABLE (VEX_W_0F99_P_0_LEN_0
) },
9549 /* VEX_LEN_0F99_P_2 */
9551 { VEX_W_TABLE (VEX_W_0F99_P_2_LEN_0
) },
9554 /* VEX_LEN_0FAE_R_2_M_0 */
9556 { "vldmxcsr", { Md
}, 0 },
9559 /* VEX_LEN_0FAE_R_3_M_0 */
9561 { "vstmxcsr", { Md
}, 0 },
9564 /* VEX_LEN_0FC4_P_2 */
9566 { "vpinsrw", { XM
, Vex128
, Edqw
, Ib
}, 0 },
9569 /* VEX_LEN_0FC5_P_2 */
9571 { "vpextrw", { Gdq
, XS
, Ib
}, 0 },
9574 /* VEX_LEN_0FD6_P_2 */
9576 { "vmovq", { EXqVexScalarS
, XMScalar
}, 0 },
9579 /* VEX_LEN_0FF7_P_2 */
9581 { "vmaskmovdqu", { XM
, XS
}, 0 },
9584 /* VEX_LEN_0F3816_P_2 */
9587 { VEX_W_TABLE (VEX_W_0F3816_P_2
) },
9590 /* VEX_LEN_0F3819_P_2 */
9593 { VEX_W_TABLE (VEX_W_0F3819_P_2
) },
9596 /* VEX_LEN_0F381A_P_2_M_0 */
9599 { VEX_W_TABLE (VEX_W_0F381A_P_2_M_0
) },
9602 /* VEX_LEN_0F3836_P_2 */
9605 { VEX_W_TABLE (VEX_W_0F3836_P_2
) },
9608 /* VEX_LEN_0F3841_P_2 */
9610 { "vphminposuw", { XM
, EXx
}, 0 },
9613 /* VEX_LEN_0F3849_X86_64_P_0_W_0_M_0 */
9615 { "ldtilecfg", { M
}, 0 },
9618 /* VEX_LEN_0F3849_X86_64_P_0_W_0_M_1_REG_0_RM_0 */
9620 { "tilerelease", { Skip_MODRM
}, 0 },
9623 /* VEX_LEN_0F3849_X86_64_P_2_W_0_M_0 */
9625 { "sttilecfg", { M
}, 0 },
9628 /* VEX_LEN_0F3849_X86_64_P_3_W_0_M_0 */
9630 { "tilezero", { TMM
, Skip_MODRM
}, 0 },
9633 /* VEX_LEN_0F384B_X86_64_P_1_W_0_M_0 */
9635 { "tilestored", { MVexSIBMEM
, TMM
}, 0 },
9637 /* VEX_LEN_0F384B_X86_64_P_2_W_0_M_0 */
9639 { "tileloaddt1", { TMM
, MVexSIBMEM
}, 0 },
9642 /* VEX_LEN_0F384B_X86_64_P_3_W_0_M_0 */
9644 { "tileloadd", { TMM
, MVexSIBMEM
}, 0 },
9647 /* VEX_LEN_0F385A_P_2_M_0 */
9650 { VEX_W_TABLE (VEX_W_0F385A_P_2_M_0
) },
9653 /* VEX_LEN_0F385C_X86_64_P_1_W_0_M_0 */
9655 { "tdpbf16ps", { TMM
, EXtmm
, VexTmm
}, 0 },
9658 /* VEX_LEN_0F385E_X86_64_P_0_W_0_M_0 */
9660 { "tdpbuud", {TMM
, EXtmm
, VexTmm
}, 0 },
9663 /* VEX_LEN_0F385E_X86_64_P_1_W_0_M_0 */
9665 { "tdpbsud", {TMM
, EXtmm
, VexTmm
}, 0 },
9668 /* VEX_LEN_0F385E_X86_64_P_2_W_0_M_0 */
9670 { "tdpbusd", {TMM
, EXtmm
, VexTmm
}, 0 },
9673 /* VEX_LEN_0F385E_X86_64_P_3_W_0_M_0 */
9675 { "tdpbssd", {TMM
, EXtmm
, VexTmm
}, 0 },
9678 /* VEX_LEN_0F38DB_P_2 */
9680 { "vaesimc", { XM
, EXx
}, 0 },
9683 /* VEX_LEN_0F38F2_P_0 */
9685 { "andnS", { Gdq
, VexGdq
, Edq
}, 0 },
9688 /* VEX_LEN_0F38F3_R_1_P_0 */
9690 { "blsrS", { VexGdq
, Edq
}, 0 },
9693 /* VEX_LEN_0F38F3_R_2_P_0 */
9695 { "blsmskS", { VexGdq
, Edq
}, 0 },
9698 /* VEX_LEN_0F38F3_R_3_P_0 */
9700 { "blsiS", { VexGdq
, Edq
}, 0 },
9703 /* VEX_LEN_0F38F5_P_0 */
9705 { "bzhiS", { Gdq
, Edq
, VexGdq
}, 0 },
9708 /* VEX_LEN_0F38F5_P_1 */
9710 { "pextS", { Gdq
, VexGdq
, Edq
}, 0 },
9713 /* VEX_LEN_0F38F5_P_3 */
9715 { "pdepS", { Gdq
, VexGdq
, Edq
}, 0 },
9718 /* VEX_LEN_0F38F6_P_3 */
9720 { "mulxS", { Gdq
, VexGdq
, Edq
}, 0 },
9723 /* VEX_LEN_0F38F7_P_0 */
9725 { "bextrS", { Gdq
, Edq
, VexGdq
}, 0 },
9728 /* VEX_LEN_0F38F7_P_1 */
9730 { "sarxS", { Gdq
, Edq
, VexGdq
}, 0 },
9733 /* VEX_LEN_0F38F7_P_2 */
9735 { "shlxS", { Gdq
, Edq
, VexGdq
}, 0 },
9738 /* VEX_LEN_0F38F7_P_3 */
9740 { "shrxS", { Gdq
, Edq
, VexGdq
}, 0 },
9743 /* VEX_LEN_0F3A00_P_2 */
9746 { VEX_W_TABLE (VEX_W_0F3A00_P_2
) },
9749 /* VEX_LEN_0F3A01_P_2 */
9752 { VEX_W_TABLE (VEX_W_0F3A01_P_2
) },
9755 /* VEX_LEN_0F3A06_P_2 */
9758 { VEX_W_TABLE (VEX_W_0F3A06_P_2
) },
9761 /* VEX_LEN_0F3A14_P_2 */
9763 { "vpextrb", { Edqb
, XM
, Ib
}, 0 },
9766 /* VEX_LEN_0F3A15_P_2 */
9768 { "vpextrw", { Edqw
, XM
, Ib
}, 0 },
9771 /* VEX_LEN_0F3A16_P_2 */
9773 { "vpextrK", { Edq
, XM
, Ib
}, 0 },
9776 /* VEX_LEN_0F3A17_P_2 */
9778 { "vextractps", { Edqd
, XM
, Ib
}, 0 },
9781 /* VEX_LEN_0F3A18_P_2 */
9784 { VEX_W_TABLE (VEX_W_0F3A18_P_2
) },
9787 /* VEX_LEN_0F3A19_P_2 */
9790 { VEX_W_TABLE (VEX_W_0F3A19_P_2
) },
9793 /* VEX_LEN_0F3A20_P_2 */
9795 { "vpinsrb", { XM
, Vex128
, Edqb
, Ib
}, 0 },
9798 /* VEX_LEN_0F3A21_P_2 */
9800 { "vinsertps", { XM
, Vex128
, EXd
, Ib
}, 0 },
9803 /* VEX_LEN_0F3A22_P_2 */
9805 { "vpinsrK", { XM
, Vex128
, Edq
, Ib
}, 0 },
9808 /* VEX_LEN_0F3A30_P_2 */
9810 { VEX_W_TABLE (VEX_W_0F3A30_P_2_LEN_0
) },
9813 /* VEX_LEN_0F3A31_P_2 */
9815 { VEX_W_TABLE (VEX_W_0F3A31_P_2_LEN_0
) },
9818 /* VEX_LEN_0F3A32_P_2 */
9820 { VEX_W_TABLE (VEX_W_0F3A32_P_2_LEN_0
) },
9823 /* VEX_LEN_0F3A33_P_2 */
9825 { VEX_W_TABLE (VEX_W_0F3A33_P_2_LEN_0
) },
9828 /* VEX_LEN_0F3A38_P_2 */
9831 { VEX_W_TABLE (VEX_W_0F3A38_P_2
) },
9834 /* VEX_LEN_0F3A39_P_2 */
9837 { VEX_W_TABLE (VEX_W_0F3A39_P_2
) },
9840 /* VEX_LEN_0F3A41_P_2 */
9842 { "vdppd", { XM
, Vex128
, EXx
, Ib
}, 0 },
9845 /* VEX_LEN_0F3A46_P_2 */
9848 { VEX_W_TABLE (VEX_W_0F3A46_P_2
) },
9851 /* VEX_LEN_0F3A60_P_2 */
9853 { "vpcmpestrm", { XM
, { PCMPESTR_Fixup
, x_mode
}, Ib
}, 0 },
9856 /* VEX_LEN_0F3A61_P_2 */
9858 { "vpcmpestri", { XM
, { PCMPESTR_Fixup
, x_mode
}, Ib
}, 0 },
9861 /* VEX_LEN_0F3A62_P_2 */
9863 { "vpcmpistrm", { XM
, EXx
, Ib
}, 0 },
9866 /* VEX_LEN_0F3A63_P_2 */
9868 { "vpcmpistri", { XM
, EXx
, Ib
}, 0 },
9871 /* VEX_LEN_0F3ADF_P_2 */
9873 { "vaeskeygenassist", { XM
, EXx
, Ib
}, 0 },
9876 /* VEX_LEN_0F3AF0_P_3 */
9878 { "rorxS", { Gdq
, Edq
, Ib
}, 0 },
9881 /* VEX_LEN_0FXOP_08_85 */
9883 { VEX_W_TABLE (VEX_W_0FXOP_08_85_L_0
) },
9886 /* VEX_LEN_0FXOP_08_86 */
9888 { VEX_W_TABLE (VEX_W_0FXOP_08_86_L_0
) },
9891 /* VEX_LEN_0FXOP_08_87 */
9893 { VEX_W_TABLE (VEX_W_0FXOP_08_87_L_0
) },
9896 /* VEX_LEN_0FXOP_08_8E */
9898 { VEX_W_TABLE (VEX_W_0FXOP_08_8E_L_0
) },
9901 /* VEX_LEN_0FXOP_08_8F */
9903 { VEX_W_TABLE (VEX_W_0FXOP_08_8F_L_0
) },
9906 /* VEX_LEN_0FXOP_08_95 */
9908 { VEX_W_TABLE (VEX_W_0FXOP_08_95_L_0
) },
9911 /* VEX_LEN_0FXOP_08_96 */
9913 { VEX_W_TABLE (VEX_W_0FXOP_08_96_L_0
) },
9916 /* VEX_LEN_0FXOP_08_97 */
9918 { VEX_W_TABLE (VEX_W_0FXOP_08_97_L_0
) },
9921 /* VEX_LEN_0FXOP_08_9E */
9923 { VEX_W_TABLE (VEX_W_0FXOP_08_9E_L_0
) },
9926 /* VEX_LEN_0FXOP_08_9F */
9928 { VEX_W_TABLE (VEX_W_0FXOP_08_9F_L_0
) },
9931 /* VEX_LEN_0FXOP_08_A3 */
9933 { "vpperm", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
9936 /* VEX_LEN_0FXOP_08_A6 */
9938 { VEX_W_TABLE (VEX_W_0FXOP_08_A6_L_0
) },
9941 /* VEX_LEN_0FXOP_08_B6 */
9943 { VEX_W_TABLE (VEX_W_0FXOP_08_B6_L_0
) },
9946 /* VEX_LEN_0FXOP_08_C0 */
9948 { VEX_W_TABLE (VEX_W_0FXOP_08_C0_L_0
) },
9951 /* VEX_LEN_0FXOP_08_C1 */
9953 { VEX_W_TABLE (VEX_W_0FXOP_08_C1_L_0
) },
9956 /* VEX_LEN_0FXOP_08_C2 */
9958 { VEX_W_TABLE (VEX_W_0FXOP_08_C2_L_0
) },
9961 /* VEX_LEN_0FXOP_08_C3 */
9963 { VEX_W_TABLE (VEX_W_0FXOP_08_C3_L_0
) },
9966 /* VEX_LEN_0FXOP_08_CC */
9968 { VEX_W_TABLE (VEX_W_0FXOP_08_CC_L_0
) },
9971 /* VEX_LEN_0FXOP_08_CD */
9973 { VEX_W_TABLE (VEX_W_0FXOP_08_CD_L_0
) },
9976 /* VEX_LEN_0FXOP_08_CE */
9978 { VEX_W_TABLE (VEX_W_0FXOP_08_CE_L_0
) },
9981 /* VEX_LEN_0FXOP_08_CF */
9983 { VEX_W_TABLE (VEX_W_0FXOP_08_CF_L_0
) },
9986 /* VEX_LEN_0FXOP_08_EC */
9988 { VEX_W_TABLE (VEX_W_0FXOP_08_EC_L_0
) },
9991 /* VEX_LEN_0FXOP_08_ED */
9993 { VEX_W_TABLE (VEX_W_0FXOP_08_ED_L_0
) },
9996 /* VEX_LEN_0FXOP_08_EE */
9998 { VEX_W_TABLE (VEX_W_0FXOP_08_EE_L_0
) },
10001 /* VEX_LEN_0FXOP_08_EF */
10003 { VEX_W_TABLE (VEX_W_0FXOP_08_EF_L_0
) },
10006 /* VEX_LEN_0FXOP_09_01 */
10008 { REG_TABLE (REG_0FXOP_09_01_L_0
) },
10011 /* VEX_LEN_0FXOP_09_02 */
10013 { REG_TABLE (REG_0FXOP_09_02_L_0
) },
10016 /* VEX_LEN_0FXOP_09_12_M_1 */
10018 { REG_TABLE (REG_0FXOP_09_12_M_1_L_0
) },
10021 /* VEX_LEN_0FXOP_09_82_W_0 */
10023 { "vfrczss", { XM
, EXd
}, 0 },
10026 /* VEX_LEN_0FXOP_09_83_W_0 */
10028 { "vfrczsd", { XM
, EXq
}, 0 },
10031 /* VEX_LEN_0FXOP_09_90 */
10033 { "vprotb", { XM
, EXx
, VexW
}, 0 },
10036 /* VEX_LEN_0FXOP_09_91 */
10038 { "vprotw", { XM
, EXx
, VexW
}, 0 },
10041 /* VEX_LEN_0FXOP_09_92 */
10043 { "vprotd", { XM
, EXx
, VexW
}, 0 },
10046 /* VEX_LEN_0FXOP_09_93 */
10048 { "vprotq", { XM
, EXx
, VexW
}, 0 },
10051 /* VEX_LEN_0FXOP_09_94 */
10053 { "vpshlb", { XM
, EXx
, VexW
}, 0 },
10056 /* VEX_LEN_0FXOP_09_95 */
10058 { "vpshlw", { XM
, EXx
, VexW
}, 0 },
10061 /* VEX_LEN_0FXOP_09_96 */
10063 { "vpshld", { XM
, EXx
, VexW
}, 0 },
10066 /* VEX_LEN_0FXOP_09_97 */
10068 { "vpshlq", { XM
, EXx
, VexW
}, 0 },
10071 /* VEX_LEN_0FXOP_09_98 */
10073 { "vpshab", { XM
, EXx
, VexW
}, 0 },
10076 /* VEX_LEN_0FXOP_09_99 */
10078 { "vpshaw", { XM
, EXx
, VexW
}, 0 },
10081 /* VEX_LEN_0FXOP_09_9A */
10083 { "vpshad", { XM
, EXx
, VexW
}, 0 },
10086 /* VEX_LEN_0FXOP_09_9B */
10088 { "vpshaq", { XM
, EXx
, VexW
}, 0 },
10091 /* VEX_LEN_0FXOP_09_C1 */
10093 { VEX_W_TABLE (VEX_W_0FXOP_09_C1_L_0
) },
10096 /* VEX_LEN_0FXOP_09_C2 */
10098 { VEX_W_TABLE (VEX_W_0FXOP_09_C2_L_0
) },
10101 /* VEX_LEN_0FXOP_09_C3 */
10103 { VEX_W_TABLE (VEX_W_0FXOP_09_C3_L_0
) },
10106 /* VEX_LEN_0FXOP_09_C6 */
10108 { VEX_W_TABLE (VEX_W_0FXOP_09_C6_L_0
) },
10111 /* VEX_LEN_0FXOP_09_C7 */
10113 { VEX_W_TABLE (VEX_W_0FXOP_09_C7_L_0
) },
10116 /* VEX_LEN_0FXOP_09_CB */
10118 { VEX_W_TABLE (VEX_W_0FXOP_09_CB_L_0
) },
10121 /* VEX_LEN_0FXOP_09_D1 */
10123 { VEX_W_TABLE (VEX_W_0FXOP_09_D1_L_0
) },
10126 /* VEX_LEN_0FXOP_09_D2 */
10128 { VEX_W_TABLE (VEX_W_0FXOP_09_D2_L_0
) },
10131 /* VEX_LEN_0FXOP_09_D3 */
10133 { VEX_W_TABLE (VEX_W_0FXOP_09_D3_L_0
) },
10136 /* VEX_LEN_0FXOP_09_D6 */
10138 { VEX_W_TABLE (VEX_W_0FXOP_09_D6_L_0
) },
10141 /* VEX_LEN_0FXOP_09_D7 */
10143 { VEX_W_TABLE (VEX_W_0FXOP_09_D7_L_0
) },
10146 /* VEX_LEN_0FXOP_09_DB */
10148 { VEX_W_TABLE (VEX_W_0FXOP_09_DB_L_0
) },
10151 /* VEX_LEN_0FXOP_09_E1 */
10153 { VEX_W_TABLE (VEX_W_0FXOP_09_E1_L_0
) },
10156 /* VEX_LEN_0FXOP_09_E2 */
10158 { VEX_W_TABLE (VEX_W_0FXOP_09_E2_L_0
) },
10161 /* VEX_LEN_0FXOP_09_E3 */
10163 { VEX_W_TABLE (VEX_W_0FXOP_09_E3_L_0
) },
10166 /* VEX_LEN_0FXOP_0A_12 */
10168 { REG_TABLE (REG_0FXOP_0A_12_L_0
) },
10172 #include "i386-dis-evex-len.h"
10174 static const struct dis386 vex_w_table
[][2] = {
10176 /* VEX_W_0F41_P_0_LEN_1 */
10177 { MOD_TABLE (MOD_VEX_W_0_0F41_P_0_LEN_1
) },
10178 { MOD_TABLE (MOD_VEX_W_1_0F41_P_0_LEN_1
) },
10181 /* VEX_W_0F41_P_2_LEN_1 */
10182 { MOD_TABLE (MOD_VEX_W_0_0F41_P_2_LEN_1
) },
10183 { MOD_TABLE (MOD_VEX_W_1_0F41_P_2_LEN_1
) }
10186 /* VEX_W_0F42_P_0_LEN_1 */
10187 { MOD_TABLE (MOD_VEX_W_0_0F42_P_0_LEN_1
) },
10188 { MOD_TABLE (MOD_VEX_W_1_0F42_P_0_LEN_1
) },
10191 /* VEX_W_0F42_P_2_LEN_1 */
10192 { MOD_TABLE (MOD_VEX_W_0_0F42_P_2_LEN_1
) },
10193 { MOD_TABLE (MOD_VEX_W_1_0F42_P_2_LEN_1
) },
10196 /* VEX_W_0F44_P_0_LEN_0 */
10197 { MOD_TABLE (MOD_VEX_W_0_0F44_P_0_LEN_1
) },
10198 { MOD_TABLE (MOD_VEX_W_1_0F44_P_0_LEN_1
) },
10201 /* VEX_W_0F44_P_2_LEN_0 */
10202 { MOD_TABLE (MOD_VEX_W_0_0F44_P_2_LEN_1
) },
10203 { MOD_TABLE (MOD_VEX_W_1_0F44_P_2_LEN_1
) },
10206 /* VEX_W_0F45_P_0_LEN_1 */
10207 { MOD_TABLE (MOD_VEX_W_0_0F45_P_0_LEN_1
) },
10208 { MOD_TABLE (MOD_VEX_W_1_0F45_P_0_LEN_1
) },
10211 /* VEX_W_0F45_P_2_LEN_1 */
10212 { MOD_TABLE (MOD_VEX_W_0_0F45_P_2_LEN_1
) },
10213 { MOD_TABLE (MOD_VEX_W_1_0F45_P_2_LEN_1
) },
10216 /* VEX_W_0F46_P_0_LEN_1 */
10217 { MOD_TABLE (MOD_VEX_W_0_0F46_P_0_LEN_1
) },
10218 { MOD_TABLE (MOD_VEX_W_1_0F46_P_0_LEN_1
) },
10221 /* VEX_W_0F46_P_2_LEN_1 */
10222 { MOD_TABLE (MOD_VEX_W_0_0F46_P_2_LEN_1
) },
10223 { MOD_TABLE (MOD_VEX_W_1_0F46_P_2_LEN_1
) },
10226 /* VEX_W_0F47_P_0_LEN_1 */
10227 { MOD_TABLE (MOD_VEX_W_0_0F47_P_0_LEN_1
) },
10228 { MOD_TABLE (MOD_VEX_W_1_0F47_P_0_LEN_1
) },
10231 /* VEX_W_0F47_P_2_LEN_1 */
10232 { MOD_TABLE (MOD_VEX_W_0_0F47_P_2_LEN_1
) },
10233 { MOD_TABLE (MOD_VEX_W_1_0F47_P_2_LEN_1
) },
10236 /* VEX_W_0F4A_P_0_LEN_1 */
10237 { MOD_TABLE (MOD_VEX_W_0_0F4A_P_0_LEN_1
) },
10238 { MOD_TABLE (MOD_VEX_W_1_0F4A_P_0_LEN_1
) },
10241 /* VEX_W_0F4A_P_2_LEN_1 */
10242 { MOD_TABLE (MOD_VEX_W_0_0F4A_P_2_LEN_1
) },
10243 { MOD_TABLE (MOD_VEX_W_1_0F4A_P_2_LEN_1
) },
10246 /* VEX_W_0F4B_P_0_LEN_1 */
10247 { MOD_TABLE (MOD_VEX_W_0_0F4B_P_0_LEN_1
) },
10248 { MOD_TABLE (MOD_VEX_W_1_0F4B_P_0_LEN_1
) },
10251 /* VEX_W_0F4B_P_2_LEN_1 */
10252 { MOD_TABLE (MOD_VEX_W_0_0F4B_P_2_LEN_1
) },
10255 /* VEX_W_0F90_P_0_LEN_0 */
10256 { "kmovw", { MaskG
, MaskE
}, 0 },
10257 { "kmovq", { MaskG
, MaskE
}, 0 },
10260 /* VEX_W_0F90_P_2_LEN_0 */
10261 { "kmovb", { MaskG
, MaskBDE
}, 0 },
10262 { "kmovd", { MaskG
, MaskBDE
}, 0 },
10265 /* VEX_W_0F91_P_0_LEN_0 */
10266 { MOD_TABLE (MOD_VEX_W_0_0F91_P_0_LEN_0
) },
10267 { MOD_TABLE (MOD_VEX_W_1_0F91_P_0_LEN_0
) },
10270 /* VEX_W_0F91_P_2_LEN_0 */
10271 { MOD_TABLE (MOD_VEX_W_0_0F91_P_2_LEN_0
) },
10272 { MOD_TABLE (MOD_VEX_W_1_0F91_P_2_LEN_0
) },
10275 /* VEX_W_0F92_P_0_LEN_0 */
10276 { MOD_TABLE (MOD_VEX_W_0_0F92_P_0_LEN_0
) },
10279 /* VEX_W_0F92_P_2_LEN_0 */
10280 { MOD_TABLE (MOD_VEX_W_0_0F92_P_2_LEN_0
) },
10283 /* VEX_W_0F93_P_0_LEN_0 */
10284 { MOD_TABLE (MOD_VEX_W_0_0F93_P_0_LEN_0
) },
10287 /* VEX_W_0F93_P_2_LEN_0 */
10288 { MOD_TABLE (MOD_VEX_W_0_0F93_P_2_LEN_0
) },
10291 /* VEX_W_0F98_P_0_LEN_0 */
10292 { MOD_TABLE (MOD_VEX_W_0_0F98_P_0_LEN_0
) },
10293 { MOD_TABLE (MOD_VEX_W_1_0F98_P_0_LEN_0
) },
10296 /* VEX_W_0F98_P_2_LEN_0 */
10297 { MOD_TABLE (MOD_VEX_W_0_0F98_P_2_LEN_0
) },
10298 { MOD_TABLE (MOD_VEX_W_1_0F98_P_2_LEN_0
) },
10301 /* VEX_W_0F99_P_0_LEN_0 */
10302 { MOD_TABLE (MOD_VEX_W_0_0F99_P_0_LEN_0
) },
10303 { MOD_TABLE (MOD_VEX_W_1_0F99_P_0_LEN_0
) },
10306 /* VEX_W_0F99_P_2_LEN_0 */
10307 { MOD_TABLE (MOD_VEX_W_0_0F99_P_2_LEN_0
) },
10308 { MOD_TABLE (MOD_VEX_W_1_0F99_P_2_LEN_0
) },
10311 /* VEX_W_0F380C_P_2 */
10312 { "vpermilps", { XM
, Vex
, EXx
}, 0 },
10315 /* VEX_W_0F380D_P_2 */
10316 { "vpermilpd", { XM
, Vex
, EXx
}, 0 },
10319 /* VEX_W_0F380E_P_2 */
10320 { "vtestps", { XM
, EXx
}, 0 },
10323 /* VEX_W_0F380F_P_2 */
10324 { "vtestpd", { XM
, EXx
}, 0 },
10327 /* VEX_W_0F3813_P_2 */
10328 { "vcvtph2ps", { XM
, EXxmmq
}, 0 },
10331 /* VEX_W_0F3816_P_2 */
10332 { "vpermps", { XM
, Vex
, EXx
}, 0 },
10335 /* VEX_W_0F3818_P_2 */
10336 { "vbroadcastss", { XM
, EXxmm_md
}, 0 },
10339 /* VEX_W_0F3819_P_2 */
10340 { "vbroadcastsd", { XM
, EXxmm_mq
}, 0 },
10343 /* VEX_W_0F381A_P_2_M_0 */
10344 { "vbroadcastf128", { XM
, Mxmm
}, 0 },
10347 /* VEX_W_0F382C_P_2_M_0 */
10348 { "vmaskmovps", { XM
, Vex
, Mx
}, 0 },
10351 /* VEX_W_0F382D_P_2_M_0 */
10352 { "vmaskmovpd", { XM
, Vex
, Mx
}, 0 },
10355 /* VEX_W_0F382E_P_2_M_0 */
10356 { "vmaskmovps", { Mx
, Vex
, XM
}, 0 },
10359 /* VEX_W_0F382F_P_2_M_0 */
10360 { "vmaskmovpd", { Mx
, Vex
, XM
}, 0 },
10363 /* VEX_W_0F3836_P_2 */
10364 { "vpermd", { XM
, Vex
, EXx
}, 0 },
10367 /* VEX_W_0F3846_P_2 */
10368 { "vpsravd", { XM
, Vex
, EXx
}, 0 },
10371 /* VEX_W_0F3849_X86_64_P_0 */
10372 { MOD_TABLE (MOD_VEX_0F3849_X86_64_P_0_W_0
) },
10375 /* VEX_W_0F3849_X86_64_P_2 */
10376 { MOD_TABLE (MOD_VEX_0F3849_X86_64_P_2_W_0
) },
10379 /* VEX_W_0F3849_X86_64_P_3 */
10380 { MOD_TABLE (MOD_VEX_0F3849_X86_64_P_3_W_0
) },
10383 /* VEX_W_0F384B_X86_64_P_1 */
10384 { MOD_TABLE (MOD_VEX_0F384B_X86_64_P_1_W_0
) },
10387 /* VEX_W_0F384B_X86_64_P_2 */
10388 { MOD_TABLE (MOD_VEX_0F384B_X86_64_P_2_W_0
) },
10391 /* VEX_W_0F384B_X86_64_P_3 */
10392 { MOD_TABLE (MOD_VEX_0F384B_X86_64_P_3_W_0
) },
10395 /* VEX_W_0F3858_P_2 */
10396 { "vpbroadcastd", { XM
, EXxmm_md
}, 0 },
10399 /* VEX_W_0F3859_P_2 */
10400 { "vpbroadcastq", { XM
, EXxmm_mq
}, 0 },
10403 /* VEX_W_0F385A_P_2_M_0 */
10404 { "vbroadcasti128", { XM
, Mxmm
}, 0 },
10407 /* VEX_W_0F385C_X86_64_P_1 */
10408 { MOD_TABLE (MOD_VEX_0F385C_X86_64_P_1_W_0
) },
10411 /* VEX_W_0F385E_X86_64_P_0 */
10412 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_0_W_0
) },
10415 /* VEX_W_0F385E_X86_64_P_1 */
10416 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_1_W_0
) },
10419 /* VEX_W_0F385E_X86_64_P_2 */
10420 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_2_W_0
) },
10423 /* VEX_W_0F385E_X86_64_P_3 */
10424 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_3_W_0
) },
10427 /* VEX_W_0F3878_P_2 */
10428 { "vpbroadcastb", { XM
, EXxmm_mb
}, 0 },
10431 /* VEX_W_0F3879_P_2 */
10432 { "vpbroadcastw", { XM
, EXxmm_mw
}, 0 },
10435 /* VEX_W_0F38CF_P_2 */
10436 { "vgf2p8mulb", { XM
, Vex
, EXx
}, 0 },
10439 /* VEX_W_0F3A00_P_2 */
10441 { "vpermq", { XM
, EXx
, Ib
}, 0 },
10444 /* VEX_W_0F3A01_P_2 */
10446 { "vpermpd", { XM
, EXx
, Ib
}, 0 },
10449 /* VEX_W_0F3A02_P_2 */
10450 { "vpblendd", { XM
, Vex
, EXx
, Ib
}, 0 },
10453 /* VEX_W_0F3A04_P_2 */
10454 { "vpermilps", { XM
, EXx
, Ib
}, 0 },
10457 /* VEX_W_0F3A05_P_2 */
10458 { "vpermilpd", { XM
, EXx
, Ib
}, 0 },
10461 /* VEX_W_0F3A06_P_2 */
10462 { "vperm2f128", { XM
, Vex256
, EXx
, Ib
}, 0 },
10465 /* VEX_W_0F3A18_P_2 */
10466 { "vinsertf128", { XM
, Vex256
, EXxmm
, Ib
}, 0 },
10469 /* VEX_W_0F3A19_P_2 */
10470 { "vextractf128", { EXxmm
, XM
, Ib
}, 0 },
10473 /* VEX_W_0F3A1D_P_2 */
10474 { "vcvtps2ph", { EXxmmq
, XM
, EXxEVexS
, Ib
}, 0 },
10477 /* VEX_W_0F3A30_P_2_LEN_0 */
10478 { MOD_TABLE (MOD_VEX_W_0_0F3A30_P_2_LEN_0
) },
10479 { MOD_TABLE (MOD_VEX_W_1_0F3A30_P_2_LEN_0
) },
10482 /* VEX_W_0F3A31_P_2_LEN_0 */
10483 { MOD_TABLE (MOD_VEX_W_0_0F3A31_P_2_LEN_0
) },
10484 { MOD_TABLE (MOD_VEX_W_1_0F3A31_P_2_LEN_0
) },
10487 /* VEX_W_0F3A32_P_2_LEN_0 */
10488 { MOD_TABLE (MOD_VEX_W_0_0F3A32_P_2_LEN_0
) },
10489 { MOD_TABLE (MOD_VEX_W_1_0F3A32_P_2_LEN_0
) },
10492 /* VEX_W_0F3A33_P_2_LEN_0 */
10493 { MOD_TABLE (MOD_VEX_W_0_0F3A33_P_2_LEN_0
) },
10494 { MOD_TABLE (MOD_VEX_W_1_0F3A33_P_2_LEN_0
) },
10497 /* VEX_W_0F3A38_P_2 */
10498 { "vinserti128", { XM
, Vex256
, EXxmm
, Ib
}, 0 },
10501 /* VEX_W_0F3A39_P_2 */
10502 { "vextracti128", { EXxmm
, XM
, Ib
}, 0 },
10505 /* VEX_W_0F3A46_P_2 */
10506 { "vperm2i128", { XM
, Vex256
, EXx
, Ib
}, 0 },
10509 /* VEX_W_0F3A4A_P_2 */
10510 { "vblendvps", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
10513 /* VEX_W_0F3A4B_P_2 */
10514 { "vblendvpd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
10517 /* VEX_W_0F3A4C_P_2 */
10518 { "vpblendvb", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
10521 /* VEX_W_0F3ACE_P_2 */
10523 { "vgf2p8affineqb", { XM
, Vex
, EXx
, Ib
}, 0 },
10526 /* VEX_W_0F3ACF_P_2 */
10528 { "vgf2p8affineinvqb", { XM
, Vex
, EXx
, Ib
}, 0 },
10530 /* VEX_W_0FXOP_08_85_L_0 */
10532 { "vpmacssww", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
10534 /* VEX_W_0FXOP_08_86_L_0 */
10536 { "vpmacsswd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
10538 /* VEX_W_0FXOP_08_87_L_0 */
10540 { "vpmacssdql", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
10542 /* VEX_W_0FXOP_08_8E_L_0 */
10544 { "vpmacssdd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
10546 /* VEX_W_0FXOP_08_8F_L_0 */
10548 { "vpmacssdqh", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
10550 /* VEX_W_0FXOP_08_95_L_0 */
10552 { "vpmacsww", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
10554 /* VEX_W_0FXOP_08_96_L_0 */
10556 { "vpmacswd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
10558 /* VEX_W_0FXOP_08_97_L_0 */
10560 { "vpmacsdql", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
10562 /* VEX_W_0FXOP_08_9E_L_0 */
10564 { "vpmacsdd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
10566 /* VEX_W_0FXOP_08_9F_L_0 */
10568 { "vpmacsdqh", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
10570 /* VEX_W_0FXOP_08_A6_L_0 */
10572 { "vpmadcsswd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
10574 /* VEX_W_0FXOP_08_B6_L_0 */
10576 { "vpmadcswd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
10578 /* VEX_W_0FXOP_08_C0_L_0 */
10580 { "vprotb", { XM
, EXx
, Ib
}, 0 },
10582 /* VEX_W_0FXOP_08_C1_L_0 */
10584 { "vprotw", { XM
, EXx
, Ib
}, 0 },
10586 /* VEX_W_0FXOP_08_C2_L_0 */
10588 { "vprotd", { XM
, EXx
, Ib
}, 0 },
10590 /* VEX_W_0FXOP_08_C3_L_0 */
10592 { "vprotq", { XM
, EXx
, Ib
}, 0 },
10594 /* VEX_W_0FXOP_08_CC_L_0 */
10596 { "vpcomb", { XM
, Vex128
, EXx
, VPCOM
}, 0 },
10598 /* VEX_W_0FXOP_08_CD_L_0 */
10600 { "vpcomw", { XM
, Vex128
, EXx
, VPCOM
}, 0 },
10602 /* VEX_W_0FXOP_08_CE_L_0 */
10604 { "vpcomd", { XM
, Vex128
, EXx
, VPCOM
}, 0 },
10606 /* VEX_W_0FXOP_08_CF_L_0 */
10608 { "vpcomq", { XM
, Vex128
, EXx
, VPCOM
}, 0 },
10610 /* VEX_W_0FXOP_08_EC_L_0 */
10612 { "vpcomub", { XM
, Vex128
, EXx
, VPCOM
}, 0 },
10614 /* VEX_W_0FXOP_08_ED_L_0 */
10616 { "vpcomuw", { XM
, Vex128
, EXx
, VPCOM
}, 0 },
10618 /* VEX_W_0FXOP_08_EE_L_0 */
10620 { "vpcomud", { XM
, Vex128
, EXx
, VPCOM
}, 0 },
10622 /* VEX_W_0FXOP_08_EF_L_0 */
10624 { "vpcomuq", { XM
, Vex128
, EXx
, VPCOM
}, 0 },
10626 /* VEX_W_0FXOP_09_80 */
10628 { "vfrczps", { XM
, EXx
}, 0 },
10630 /* VEX_W_0FXOP_09_81 */
10632 { "vfrczpd", { XM
, EXx
}, 0 },
10634 /* VEX_W_0FXOP_09_82 */
10636 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_82_W_0
) },
10638 /* VEX_W_0FXOP_09_83 */
10640 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_83_W_0
) },
10642 /* VEX_W_0FXOP_09_C1_L_0 */
10644 { "vphaddbw", { XM
, EXxmm
}, 0 },
10646 /* VEX_W_0FXOP_09_C2_L_0 */
10648 { "vphaddbd", { XM
, EXxmm
}, 0 },
10650 /* VEX_W_0FXOP_09_C3_L_0 */
10652 { "vphaddbq", { XM
, EXxmm
}, 0 },
10654 /* VEX_W_0FXOP_09_C6_L_0 */
10656 { "vphaddwd", { XM
, EXxmm
}, 0 },
10658 /* VEX_W_0FXOP_09_C7_L_0 */
10660 { "vphaddwq", { XM
, EXxmm
}, 0 },
10662 /* VEX_W_0FXOP_09_CB_L_0 */
10664 { "vphadddq", { XM
, EXxmm
}, 0 },
10666 /* VEX_W_0FXOP_09_D1_L_0 */
10668 { "vphaddubw", { XM
, EXxmm
}, 0 },
10670 /* VEX_W_0FXOP_09_D2_L_0 */
10672 { "vphaddubd", { XM
, EXxmm
}, 0 },
10674 /* VEX_W_0FXOP_09_D3_L_0 */
10676 { "vphaddubq", { XM
, EXxmm
}, 0 },
10678 /* VEX_W_0FXOP_09_D6_L_0 */
10680 { "vphadduwd", { XM
, EXxmm
}, 0 },
10682 /* VEX_W_0FXOP_09_D7_L_0 */
10684 { "vphadduwq", { XM
, EXxmm
}, 0 },
10686 /* VEX_W_0FXOP_09_DB_L_0 */
10688 { "vphaddudq", { XM
, EXxmm
}, 0 },
10690 /* VEX_W_0FXOP_09_E1_L_0 */
10692 { "vphsubbw", { XM
, EXxmm
}, 0 },
10694 /* VEX_W_0FXOP_09_E2_L_0 */
10696 { "vphsubwd", { XM
, EXxmm
}, 0 },
10698 /* VEX_W_0FXOP_09_E3_L_0 */
10700 { "vphsubdq", { XM
, EXxmm
}, 0 },
10703 #include "i386-dis-evex-w.h"
10706 static const struct dis386 mod_table
[][2] = {
10709 { "leaS", { Gv
, M
}, 0 },
10714 { RM_TABLE (RM_C6_REG_7
) },
10719 { RM_TABLE (RM_C7_REG_7
) },
10723 { "{l|}call^", { indirEp
}, 0 },
10727 { "{l|}jmp^", { indirEp
}, 0 },
10730 /* MOD_0F01_REG_0 */
10731 { X86_64_TABLE (X86_64_0F01_REG_0
) },
10732 { RM_TABLE (RM_0F01_REG_0
) },
10735 /* MOD_0F01_REG_1 */
10736 { X86_64_TABLE (X86_64_0F01_REG_1
) },
10737 { RM_TABLE (RM_0F01_REG_1
) },
10740 /* MOD_0F01_REG_2 */
10741 { X86_64_TABLE (X86_64_0F01_REG_2
) },
10742 { RM_TABLE (RM_0F01_REG_2
) },
10745 /* MOD_0F01_REG_3 */
10746 { X86_64_TABLE (X86_64_0F01_REG_3
) },
10747 { RM_TABLE (RM_0F01_REG_3
) },
10750 /* MOD_0F01_REG_5 */
10751 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_0
) },
10752 { RM_TABLE (RM_0F01_REG_5_MOD_3
) },
10755 /* MOD_0F01_REG_7 */
10756 { "invlpg", { Mb
}, 0 },
10757 { RM_TABLE (RM_0F01_REG_7_MOD_3
) },
10760 /* MOD_0F12_PREFIX_0 */
10761 { "movlpX", { XM
, EXq
}, 0 },
10762 { "movhlps", { XM
, EXq
}, 0 },
10765 /* MOD_0F12_PREFIX_2 */
10766 { "movlpX", { XM
, EXq
}, 0 },
10770 { "movlpX", { EXq
, XM
}, PREFIX_OPCODE
},
10773 /* MOD_0F16_PREFIX_0 */
10774 { "movhpX", { XM
, EXq
}, 0 },
10775 { "movlhps", { XM
, EXq
}, 0 },
10778 /* MOD_0F16_PREFIX_2 */
10779 { "movhpX", { XM
, EXq
}, 0 },
10783 { "movhpX", { EXq
, XM
}, PREFIX_OPCODE
},
10786 /* MOD_0F18_REG_0 */
10787 { "prefetchnta", { Mb
}, 0 },
10790 /* MOD_0F18_REG_1 */
10791 { "prefetcht0", { Mb
}, 0 },
10794 /* MOD_0F18_REG_2 */
10795 { "prefetcht1", { Mb
}, 0 },
10798 /* MOD_0F18_REG_3 */
10799 { "prefetcht2", { Mb
}, 0 },
10802 /* MOD_0F18_REG_4 */
10803 { "nop/reserved", { Mb
}, 0 },
10806 /* MOD_0F18_REG_5 */
10807 { "nop/reserved", { Mb
}, 0 },
10810 /* MOD_0F18_REG_6 */
10811 { "nop/reserved", { Mb
}, 0 },
10814 /* MOD_0F18_REG_7 */
10815 { "nop/reserved", { Mb
}, 0 },
10818 /* MOD_0F1A_PREFIX_0 */
10819 { "bndldx", { Gbnd
, Mv_bnd
}, 0 },
10820 { "nopQ", { Ev
}, 0 },
10823 /* MOD_0F1B_PREFIX_0 */
10824 { "bndstx", { Mv_bnd
, Gbnd
}, 0 },
10825 { "nopQ", { Ev
}, 0 },
10828 /* MOD_0F1B_PREFIX_1 */
10829 { "bndmk", { Gbnd
, Mv_bnd
}, 0 },
10830 { "nopQ", { Ev
}, 0 },
10833 /* MOD_0F1C_PREFIX_0 */
10834 { REG_TABLE (REG_0F1C_P_0_MOD_0
) },
10835 { "nopQ", { Ev
}, 0 },
10838 /* MOD_0F1E_PREFIX_1 */
10839 { "nopQ", { Ev
}, 0 },
10840 { REG_TABLE (REG_0F1E_P_1_MOD_3
) },
10845 { "movL", { Rd
, Td
}, 0 },
10850 { "movL", { Td
, Rd
}, 0 },
10853 /* MOD_0F2B_PREFIX_0 */
10854 {"movntps", { Mx
, XM
}, PREFIX_OPCODE
},
10857 /* MOD_0F2B_PREFIX_1 */
10858 {"movntss", { Md
, XM
}, PREFIX_OPCODE
},
10861 /* MOD_0F2B_PREFIX_2 */
10862 {"movntpd", { Mx
, XM
}, PREFIX_OPCODE
},
10865 /* MOD_0F2B_PREFIX_3 */
10866 {"movntsd", { Mq
, XM
}, PREFIX_OPCODE
},
10871 { "movmskpX", { Gdq
, XS
}, PREFIX_OPCODE
},
10874 /* MOD_0F71_REG_2 */
10876 { "psrlw", { MS
, Ib
}, 0 },
10879 /* MOD_0F71_REG_4 */
10881 { "psraw", { MS
, Ib
}, 0 },
10884 /* MOD_0F71_REG_6 */
10886 { "psllw", { MS
, Ib
}, 0 },
10889 /* MOD_0F72_REG_2 */
10891 { "psrld", { MS
, Ib
}, 0 },
10894 /* MOD_0F72_REG_4 */
10896 { "psrad", { MS
, Ib
}, 0 },
10899 /* MOD_0F72_REG_6 */
10901 { "pslld", { MS
, Ib
}, 0 },
10904 /* MOD_0F73_REG_2 */
10906 { "psrlq", { MS
, Ib
}, 0 },
10909 /* MOD_0F73_REG_3 */
10911 { PREFIX_TABLE (PREFIX_0F73_REG_3
) },
10914 /* MOD_0F73_REG_6 */
10916 { "psllq", { MS
, Ib
}, 0 },
10919 /* MOD_0F73_REG_7 */
10921 { PREFIX_TABLE (PREFIX_0F73_REG_7
) },
10924 /* MOD_0FAE_REG_0 */
10925 { "fxsave", { FXSAVE
}, 0 },
10926 { PREFIX_TABLE (PREFIX_0FAE_REG_0_MOD_3
) },
10929 /* MOD_0FAE_REG_1 */
10930 { "fxrstor", { FXSAVE
}, 0 },
10931 { PREFIX_TABLE (PREFIX_0FAE_REG_1_MOD_3
) },
10934 /* MOD_0FAE_REG_2 */
10935 { "ldmxcsr", { Md
}, 0 },
10936 { PREFIX_TABLE (PREFIX_0FAE_REG_2_MOD_3
) },
10939 /* MOD_0FAE_REG_3 */
10940 { "stmxcsr", { Md
}, 0 },
10941 { PREFIX_TABLE (PREFIX_0FAE_REG_3_MOD_3
) },
10944 /* MOD_0FAE_REG_4 */
10945 { PREFIX_TABLE (PREFIX_0FAE_REG_4_MOD_0
) },
10946 { PREFIX_TABLE (PREFIX_0FAE_REG_4_MOD_3
) },
10949 /* MOD_0FAE_REG_5 */
10950 { PREFIX_TABLE (PREFIX_0FAE_REG_5_MOD_0
) },
10951 { PREFIX_TABLE (PREFIX_0FAE_REG_5_MOD_3
) },
10954 /* MOD_0FAE_REG_6 */
10955 { PREFIX_TABLE (PREFIX_0FAE_REG_6_MOD_0
) },
10956 { PREFIX_TABLE (PREFIX_0FAE_REG_6_MOD_3
) },
10959 /* MOD_0FAE_REG_7 */
10960 { PREFIX_TABLE (PREFIX_0FAE_REG_7_MOD_0
) },
10961 { RM_TABLE (RM_0FAE_REG_7_MOD_3
) },
10965 { "lssS", { Gv
, Mp
}, 0 },
10969 { "lfsS", { Gv
, Mp
}, 0 },
10973 { "lgsS", { Gv
, Mp
}, 0 },
10977 { PREFIX_TABLE (PREFIX_0FC3_MOD_0
) },
10980 /* MOD_0FC7_REG_3 */
10981 { "xrstors", { FXSAVE
}, 0 },
10984 /* MOD_0FC7_REG_4 */
10985 { "xsavec", { FXSAVE
}, 0 },
10988 /* MOD_0FC7_REG_5 */
10989 { "xsaves", { FXSAVE
}, 0 },
10992 /* MOD_0FC7_REG_6 */
10993 { PREFIX_TABLE (PREFIX_0FC7_REG_6_MOD_0
) },
10994 { PREFIX_TABLE (PREFIX_0FC7_REG_6_MOD_3
) }
10997 /* MOD_0FC7_REG_7 */
10998 { "vmptrst", { Mq
}, 0 },
10999 { PREFIX_TABLE (PREFIX_0FC7_REG_7_MOD_3
) }
11004 { "pmovmskb", { Gdq
, MS
}, 0 },
11007 /* MOD_0FE7_PREFIX_2 */
11008 { "movntdq", { Mx
, XM
}, 0 },
11011 /* MOD_0FF0_PREFIX_3 */
11012 { "lddqu", { XM
, M
}, 0 },
11015 /* MOD_0F382A_PREFIX_2 */
11016 { "movntdqa", { XM
, Mx
}, 0 },
11019 /* MOD_VEX_0F3849_X86_64_P_0_W_0 */
11020 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_0_W_0_M_0
) },
11021 { REG_TABLE (REG_VEX_0F3849_X86_64_P_0_W_0_M_1
) },
11024 /* MOD_VEX_0F3849_X86_64_P_2_W_0 */
11025 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_2_W_0_M_0
) },
11028 /* MOD_VEX_0F3849_X86_64_P_3_W_0 */
11030 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_3_W_0_M_0
) },
11033 /* MOD_VEX_0F384B_X86_64_P_1_W_0 */
11034 { VEX_LEN_TABLE (VEX_LEN_0F384B_X86_64_P_1_W_0_M_0
) },
11037 /* MOD_VEX_0F384B_X86_64_P_2_W_0 */
11038 { VEX_LEN_TABLE (VEX_LEN_0F384B_X86_64_P_2_W_0_M_0
) },
11041 /* MOD_VEX_0F384B_X86_64_P_3_W_0 */
11042 { VEX_LEN_TABLE (VEX_LEN_0F384B_X86_64_P_3_W_0_M_0
) },
11045 /* MOD_VEX_0F385C_X86_64_P_1_W_0 */
11047 { VEX_LEN_TABLE (VEX_LEN_0F385C_X86_64_P_1_W_0_M_0
) },
11050 /* MOD_VEX_0F385E_X86_64_P_0_W_0 */
11052 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_0_W_0_M_0
) },
11055 /* MOD_VEX_0F385E_X86_64_P_1_W_0 */
11057 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_1_W_0_M_0
) },
11060 /* MOD_VEX_0F385E_X86_64_P_2_W_0 */
11062 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_2_W_0_M_0
) },
11065 /* MOD_VEX_0F385E_X86_64_P_3_W_0 */
11067 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_3_W_0_M_0
) },
11070 /* MOD_0F38F5_PREFIX_2 */
11071 { "wrussK", { M
, Gdq
}, PREFIX_OPCODE
},
11074 /* MOD_0F38F6_PREFIX_0 */
11075 { "wrssK", { M
, Gdq
}, PREFIX_OPCODE
},
11078 /* MOD_0F38F8_PREFIX_1 */
11079 { "enqcmds", { Gva
, M
}, PREFIX_OPCODE
},
11082 /* MOD_0F38F8_PREFIX_2 */
11083 { "movdir64b", { Gva
, M
}, PREFIX_OPCODE
},
11086 /* MOD_0F38F8_PREFIX_3 */
11087 { "enqcmd", { Gva
, M
}, PREFIX_OPCODE
},
11090 /* MOD_0F38F9_PREFIX_0 */
11091 { "movdiri", { Ev
, Gv
}, PREFIX_OPCODE
},
11095 { "bound{S|}", { Gv
, Ma
}, 0 },
11096 { EVEX_TABLE (EVEX_0F
) },
11100 { "lesS", { Gv
, Mp
}, 0 },
11101 { VEX_C4_TABLE (VEX_0F
) },
11105 { "ldsS", { Gv
, Mp
}, 0 },
11106 { VEX_C5_TABLE (VEX_0F
) },
11109 /* MOD_VEX_0F12_PREFIX_0 */
11110 { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_0
) },
11111 { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_1
) },
11114 /* MOD_VEX_0F12_PREFIX_2 */
11115 { VEX_LEN_TABLE (VEX_LEN_0F12_P_2_M_0
) },
11119 { VEX_LEN_TABLE (VEX_LEN_0F13_M_0
) },
11122 /* MOD_VEX_0F16_PREFIX_0 */
11123 { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_0
) },
11124 { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_1
) },
11127 /* MOD_VEX_0F16_PREFIX_2 */
11128 { VEX_LEN_TABLE (VEX_LEN_0F16_P_2_M_0
) },
11132 { VEX_LEN_TABLE (VEX_LEN_0F17_M_0
) },
11136 { "vmovntpX", { Mx
, XM
}, PREFIX_OPCODE
},
11139 /* MOD_VEX_W_0_0F41_P_0_LEN_1 */
11141 { "kandw", { MaskG
, MaskVex
, MaskR
}, 0 },
11144 /* MOD_VEX_W_1_0F41_P_0_LEN_1 */
11146 { "kandq", { MaskG
, MaskVex
, MaskR
}, 0 },
11149 /* MOD_VEX_W_0_0F41_P_2_LEN_1 */
11151 { "kandb", { MaskG
, MaskVex
, MaskR
}, 0 },
11154 /* MOD_VEX_W_1_0F41_P_2_LEN_1 */
11156 { "kandd", { MaskG
, MaskVex
, MaskR
}, 0 },
11159 /* MOD_VEX_W_0_0F42_P_0_LEN_1 */
11161 { "kandnw", { MaskG
, MaskVex
, MaskR
}, 0 },
11164 /* MOD_VEX_W_1_0F42_P_0_LEN_1 */
11166 { "kandnq", { MaskG
, MaskVex
, MaskR
}, 0 },
11169 /* MOD_VEX_W_0_0F42_P_2_LEN_1 */
11171 { "kandnb", { MaskG
, MaskVex
, MaskR
}, 0 },
11174 /* MOD_VEX_W_1_0F42_P_2_LEN_1 */
11176 { "kandnd", { MaskG
, MaskVex
, MaskR
}, 0 },
11179 /* MOD_VEX_W_0_0F44_P_0_LEN_0 */
11181 { "knotw", { MaskG
, MaskR
}, 0 },
11184 /* MOD_VEX_W_1_0F44_P_0_LEN_0 */
11186 { "knotq", { MaskG
, MaskR
}, 0 },
11189 /* MOD_VEX_W_0_0F44_P_2_LEN_0 */
11191 { "knotb", { MaskG
, MaskR
}, 0 },
11194 /* MOD_VEX_W_1_0F44_P_2_LEN_0 */
11196 { "knotd", { MaskG
, MaskR
}, 0 },
11199 /* MOD_VEX_W_0_0F45_P_0_LEN_1 */
11201 { "korw", { MaskG
, MaskVex
, MaskR
}, 0 },
11204 /* MOD_VEX_W_1_0F45_P_0_LEN_1 */
11206 { "korq", { MaskG
, MaskVex
, MaskR
}, 0 },
11209 /* MOD_VEX_W_0_0F45_P_2_LEN_1 */
11211 { "korb", { MaskG
, MaskVex
, MaskR
}, 0 },
11214 /* MOD_VEX_W_1_0F45_P_2_LEN_1 */
11216 { "kord", { MaskG
, MaskVex
, MaskR
}, 0 },
11219 /* MOD_VEX_W_0_0F46_P_0_LEN_1 */
11221 { "kxnorw", { MaskG
, MaskVex
, MaskR
}, 0 },
11224 /* MOD_VEX_W_1_0F46_P_0_LEN_1 */
11226 { "kxnorq", { MaskG
, MaskVex
, MaskR
}, 0 },
11229 /* MOD_VEX_W_0_0F46_P_2_LEN_1 */
11231 { "kxnorb", { MaskG
, MaskVex
, MaskR
}, 0 },
11234 /* MOD_VEX_W_1_0F46_P_2_LEN_1 */
11236 { "kxnord", { MaskG
, MaskVex
, MaskR
}, 0 },
11239 /* MOD_VEX_W_0_0F47_P_0_LEN_1 */
11241 { "kxorw", { MaskG
, MaskVex
, MaskR
}, 0 },
11244 /* MOD_VEX_W_1_0F47_P_0_LEN_1 */
11246 { "kxorq", { MaskG
, MaskVex
, MaskR
}, 0 },
11249 /* MOD_VEX_W_0_0F47_P_2_LEN_1 */
11251 { "kxorb", { MaskG
, MaskVex
, MaskR
}, 0 },
11254 /* MOD_VEX_W_1_0F47_P_2_LEN_1 */
11256 { "kxord", { MaskG
, MaskVex
, MaskR
}, 0 },
11259 /* MOD_VEX_W_0_0F4A_P_0_LEN_1 */
11261 { "kaddw", { MaskG
, MaskVex
, MaskR
}, 0 },
11264 /* MOD_VEX_W_1_0F4A_P_0_LEN_1 */
11266 { "kaddq", { MaskG
, MaskVex
, MaskR
}, 0 },
11269 /* MOD_VEX_W_0_0F4A_P_2_LEN_1 */
11271 { "kaddb", { MaskG
, MaskVex
, MaskR
}, 0 },
11274 /* MOD_VEX_W_1_0F4A_P_2_LEN_1 */
11276 { "kaddd", { MaskG
, MaskVex
, MaskR
}, 0 },
11279 /* MOD_VEX_W_0_0F4B_P_0_LEN_1 */
11281 { "kunpckwd", { MaskG
, MaskVex
, MaskR
}, 0 },
11284 /* MOD_VEX_W_1_0F4B_P_0_LEN_1 */
11286 { "kunpckdq", { MaskG
, MaskVex
, MaskR
}, 0 },
11289 /* MOD_VEX_W_0_0F4B_P_2_LEN_1 */
11291 { "kunpckbw", { MaskG
, MaskVex
, MaskR
}, 0 },
11296 { "vmovmskpX", { Gdq
, XS
}, PREFIX_OPCODE
},
11299 /* MOD_VEX_0F71_REG_2 */
11301 { PREFIX_TABLE (PREFIX_VEX_0F71_REG_2
) },
11304 /* MOD_VEX_0F71_REG_4 */
11306 { PREFIX_TABLE (PREFIX_VEX_0F71_REG_4
) },
11309 /* MOD_VEX_0F71_REG_6 */
11311 { PREFIX_TABLE (PREFIX_VEX_0F71_REG_6
) },
11314 /* MOD_VEX_0F72_REG_2 */
11316 { PREFIX_TABLE (PREFIX_VEX_0F72_REG_2
) },
11319 /* MOD_VEX_0F72_REG_4 */
11321 { PREFIX_TABLE (PREFIX_VEX_0F72_REG_4
) },
11324 /* MOD_VEX_0F72_REG_6 */
11326 { PREFIX_TABLE (PREFIX_VEX_0F72_REG_6
) },
11329 /* MOD_VEX_0F73_REG_2 */
11331 { PREFIX_TABLE (PREFIX_VEX_0F73_REG_2
) },
11334 /* MOD_VEX_0F73_REG_3 */
11336 { PREFIX_TABLE (PREFIX_VEX_0F73_REG_3
) },
11339 /* MOD_VEX_0F73_REG_6 */
11341 { PREFIX_TABLE (PREFIX_VEX_0F73_REG_6
) },
11344 /* MOD_VEX_0F73_REG_7 */
11346 { PREFIX_TABLE (PREFIX_VEX_0F73_REG_7
) },
11349 /* MOD_VEX_W_0_0F91_P_0_LEN_0 */
11350 { "kmovw", { Ew
, MaskG
}, 0 },
11354 /* MOD_VEX_W_0_0F91_P_0_LEN_0 */
11355 { "kmovq", { Eq
, MaskG
}, 0 },
11359 /* MOD_VEX_W_0_0F91_P_2_LEN_0 */
11360 { "kmovb", { Eb
, MaskG
}, 0 },
11364 /* MOD_VEX_W_0_0F91_P_2_LEN_0 */
11365 { "kmovd", { Ed
, MaskG
}, 0 },
11369 /* MOD_VEX_W_0_0F92_P_0_LEN_0 */
11371 { "kmovw", { MaskG
, Rdq
}, 0 },
11374 /* MOD_VEX_W_0_0F92_P_2_LEN_0 */
11376 { "kmovb", { MaskG
, Rdq
}, 0 },
11379 /* MOD_VEX_0F92_P_3_LEN_0 */
11381 { "kmovK", { MaskG
, Rdq
}, 0 },
11384 /* MOD_VEX_W_0_0F93_P_0_LEN_0 */
11386 { "kmovw", { Gdq
, MaskR
}, 0 },
11389 /* MOD_VEX_W_0_0F93_P_2_LEN_0 */
11391 { "kmovb", { Gdq
, MaskR
}, 0 },
11394 /* MOD_VEX_0F93_P_3_LEN_0 */
11396 { "kmovK", { Gdq
, MaskR
}, 0 },
11399 /* MOD_VEX_W_0_0F98_P_0_LEN_0 */
11401 { "kortestw", { MaskG
, MaskR
}, 0 },
11404 /* MOD_VEX_W_1_0F98_P_0_LEN_0 */
11406 { "kortestq", { MaskG
, MaskR
}, 0 },
11409 /* MOD_VEX_W_0_0F98_P_2_LEN_0 */
11411 { "kortestb", { MaskG
, MaskR
}, 0 },
11414 /* MOD_VEX_W_1_0F98_P_2_LEN_0 */
11416 { "kortestd", { MaskG
, MaskR
}, 0 },
11419 /* MOD_VEX_W_0_0F99_P_0_LEN_0 */
11421 { "ktestw", { MaskG
, MaskR
}, 0 },
11424 /* MOD_VEX_W_1_0F99_P_0_LEN_0 */
11426 { "ktestq", { MaskG
, MaskR
}, 0 },
11429 /* MOD_VEX_W_0_0F99_P_2_LEN_0 */
11431 { "ktestb", { MaskG
, MaskR
}, 0 },
11434 /* MOD_VEX_W_1_0F99_P_2_LEN_0 */
11436 { "ktestd", { MaskG
, MaskR
}, 0 },
11439 /* MOD_VEX_0FAE_REG_2 */
11440 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_2_M_0
) },
11443 /* MOD_VEX_0FAE_REG_3 */
11444 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_3_M_0
) },
11447 /* MOD_VEX_0FD7_PREFIX_2 */
11449 { "vpmovmskb", { Gdq
, XS
}, 0 },
11452 /* MOD_VEX_0FE7_PREFIX_2 */
11453 { "vmovntdq", { Mx
, XM
}, 0 },
11456 /* MOD_VEX_0FF0_PREFIX_3 */
11457 { "vlddqu", { XM
, M
}, 0 },
11460 /* MOD_VEX_0F381A_PREFIX_2 */
11461 { VEX_LEN_TABLE (VEX_LEN_0F381A_P_2_M_0
) },
11464 /* MOD_VEX_0F382A_PREFIX_2 */
11465 { "vmovntdqa", { XM
, Mx
}, 0 },
11468 /* MOD_VEX_0F382C_PREFIX_2 */
11469 { VEX_W_TABLE (VEX_W_0F382C_P_2_M_0
) },
11472 /* MOD_VEX_0F382D_PREFIX_2 */
11473 { VEX_W_TABLE (VEX_W_0F382D_P_2_M_0
) },
11476 /* MOD_VEX_0F382E_PREFIX_2 */
11477 { VEX_W_TABLE (VEX_W_0F382E_P_2_M_0
) },
11480 /* MOD_VEX_0F382F_PREFIX_2 */
11481 { VEX_W_TABLE (VEX_W_0F382F_P_2_M_0
) },
11484 /* MOD_VEX_0F385A_PREFIX_2 */
11485 { VEX_LEN_TABLE (VEX_LEN_0F385A_P_2_M_0
) },
11488 /* MOD_VEX_0F388C_PREFIX_2 */
11489 { "vpmaskmov%LW", { XM
, Vex
, Mx
}, 0 },
11492 /* MOD_VEX_0F388E_PREFIX_2 */
11493 { "vpmaskmov%LW", { Mx
, Vex
, XM
}, 0 },
11496 /* MOD_VEX_W_0_0F3A30_P_2_LEN_0 */
11498 { "kshiftrb", { MaskG
, MaskR
, Ib
}, 0 },
11501 /* MOD_VEX_W_1_0F3A30_P_2_LEN_0 */
11503 { "kshiftrw", { MaskG
, MaskR
, Ib
}, 0 },
11506 /* MOD_VEX_W_0_0F3A31_P_2_LEN_0 */
11508 { "kshiftrd", { MaskG
, MaskR
, Ib
}, 0 },
11511 /* MOD_VEX_W_1_0F3A31_P_2_LEN_0 */
11513 { "kshiftrq", { MaskG
, MaskR
, Ib
}, 0 },
11516 /* MOD_VEX_W_0_0F3A32_P_2_LEN_0 */
11518 { "kshiftlb", { MaskG
, MaskR
, Ib
}, 0 },
11521 /* MOD_VEX_W_1_0F3A32_P_2_LEN_0 */
11523 { "kshiftlw", { MaskG
, MaskR
, Ib
}, 0 },
11526 /* MOD_VEX_W_0_0F3A33_P_2_LEN_0 */
11528 { "kshiftld", { MaskG
, MaskR
, Ib
}, 0 },
11531 /* MOD_VEX_W_1_0F3A33_P_2_LEN_0 */
11533 { "kshiftlq", { MaskG
, MaskR
, Ib
}, 0 },
11536 /* MOD_VEX_0FXOP_09_12 */
11538 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_12_M_1
) },
11541 #include "i386-dis-evex-mod.h"
11544 static const struct dis386 rm_table
[][8] = {
11547 { "xabort", { Skip_MODRM
, Ib
}, 0 },
11551 { "xbeginT", { Skip_MODRM
, Jdqw
}, 0 },
11554 /* RM_0F01_REG_0 */
11555 { "enclv", { Skip_MODRM
}, 0 },
11556 { "vmcall", { Skip_MODRM
}, 0 },
11557 { "vmlaunch", { Skip_MODRM
}, 0 },
11558 { "vmresume", { Skip_MODRM
}, 0 },
11559 { "vmxoff", { Skip_MODRM
}, 0 },
11560 { "pconfig", { Skip_MODRM
}, 0 },
11563 /* RM_0F01_REG_1 */
11564 { "monitor", { { OP_Monitor
, 0 } }, 0 },
11565 { "mwait", { { OP_Mwait
, 0 } }, 0 },
11566 { "clac", { Skip_MODRM
}, 0 },
11567 { "stac", { Skip_MODRM
}, 0 },
11571 { "encls", { Skip_MODRM
}, 0 },
11574 /* RM_0F01_REG_2 */
11575 { "xgetbv", { Skip_MODRM
}, 0 },
11576 { "xsetbv", { Skip_MODRM
}, 0 },
11579 { "vmfunc", { Skip_MODRM
}, 0 },
11580 { "xend", { Skip_MODRM
}, 0 },
11581 { "xtest", { Skip_MODRM
}, 0 },
11582 { "enclu", { Skip_MODRM
}, 0 },
11585 /* RM_0F01_REG_3 */
11586 { "vmrun", { Skip_MODRM
}, 0 },
11587 { PREFIX_TABLE (PREFIX_0F01_REG_3_RM_1
) },
11588 { "vmload", { Skip_MODRM
}, 0 },
11589 { "vmsave", { Skip_MODRM
}, 0 },
11590 { "stgi", { Skip_MODRM
}, 0 },
11591 { "clgi", { Skip_MODRM
}, 0 },
11592 { "skinit", { Skip_MODRM
}, 0 },
11593 { "invlpga", { Skip_MODRM
}, 0 },
11596 /* RM_0F01_REG_5_MOD_3 */
11597 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_0
) },
11598 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_1
) },
11599 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_2
) },
11603 { "rdpkru", { Skip_MODRM
}, 0 },
11604 { "wrpkru", { Skip_MODRM
}, 0 },
11607 /* RM_0F01_REG_7_MOD_3 */
11608 { "swapgs", { Skip_MODRM
}, 0 },
11609 { "rdtscp", { Skip_MODRM
}, 0 },
11610 { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_2
) },
11611 { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_3
) },
11612 { "clzero", { Skip_MODRM
}, 0 },
11613 { "rdpru", { Skip_MODRM
}, 0 },
11616 /* RM_0F1E_P_1_MOD_3_REG_7 */
11617 { "nopQ", { Ev
}, 0 },
11618 { "nopQ", { Ev
}, 0 },
11619 { "endbr64", { Skip_MODRM
}, PREFIX_OPCODE
},
11620 { "endbr32", { Skip_MODRM
}, PREFIX_OPCODE
},
11621 { "nopQ", { Ev
}, 0 },
11622 { "nopQ", { Ev
}, 0 },
11623 { "nopQ", { Ev
}, 0 },
11624 { "nopQ", { Ev
}, 0 },
11627 /* RM_0FAE_REG_6_MOD_3 */
11628 { "mfence", { Skip_MODRM
}, 0 },
11631 /* RM_0FAE_REG_7_MOD_3 */
11632 { "sfence", { Skip_MODRM
}, 0 },
11636 /* RM_VEX_0F3849_X86_64_P_0_W_0_M_1_R_0 */
11637 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_0_W_0_M_1_REG_0_RM_0
) },
11641 #define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
11643 /* We use the high bit to indicate different name for the same
11645 #define REP_PREFIX (0xf3 | 0x100)
11646 #define XACQUIRE_PREFIX (0xf2 | 0x200)
11647 #define XRELEASE_PREFIX (0xf3 | 0x400)
11648 #define BND_PREFIX (0xf2 | 0x400)
11649 #define NOTRACK_PREFIX (0x3e | 0x100)
11651 /* Remember if the current op is a jump instruction. */
11652 static bfd_boolean op_is_jump
= FALSE
;
11657 int newrex
, i
, length
;
11662 last_lock_prefix
= -1;
11663 last_repz_prefix
= -1;
11664 last_repnz_prefix
= -1;
11665 last_data_prefix
= -1;
11666 last_addr_prefix
= -1;
11667 last_rex_prefix
= -1;
11668 last_seg_prefix
= -1;
11670 active_seg_prefix
= 0;
11671 for (i
= 0; i
< (int) ARRAY_SIZE (all_prefixes
); i
++)
11672 all_prefixes
[i
] = 0;
11675 /* The maximum instruction length is 15bytes. */
11676 while (length
< MAX_CODE_LENGTH
- 1)
11678 FETCH_DATA (the_info
, codep
+ 1);
11682 /* REX prefixes family. */
11699 if (address_mode
== mode_64bit
)
11703 last_rex_prefix
= i
;
11706 prefixes
|= PREFIX_REPZ
;
11707 last_repz_prefix
= i
;
11710 prefixes
|= PREFIX_REPNZ
;
11711 last_repnz_prefix
= i
;
11714 prefixes
|= PREFIX_LOCK
;
11715 last_lock_prefix
= i
;
11718 prefixes
|= PREFIX_CS
;
11719 last_seg_prefix
= i
;
11720 active_seg_prefix
= PREFIX_CS
;
11723 prefixes
|= PREFIX_SS
;
11724 last_seg_prefix
= i
;
11725 active_seg_prefix
= PREFIX_SS
;
11728 prefixes
|= PREFIX_DS
;
11729 last_seg_prefix
= i
;
11730 active_seg_prefix
= PREFIX_DS
;
11733 prefixes
|= PREFIX_ES
;
11734 last_seg_prefix
= i
;
11735 active_seg_prefix
= PREFIX_ES
;
11738 prefixes
|= PREFIX_FS
;
11739 last_seg_prefix
= i
;
11740 active_seg_prefix
= PREFIX_FS
;
11743 prefixes
|= PREFIX_GS
;
11744 last_seg_prefix
= i
;
11745 active_seg_prefix
= PREFIX_GS
;
11748 prefixes
|= PREFIX_DATA
;
11749 last_data_prefix
= i
;
11752 prefixes
|= PREFIX_ADDR
;
11753 last_addr_prefix
= i
;
11756 /* fwait is really an instruction. If there are prefixes
11757 before the fwait, they belong to the fwait, *not* to the
11758 following instruction. */
11760 if (prefixes
|| rex
)
11762 prefixes
|= PREFIX_FWAIT
;
11764 /* This ensures that the previous REX prefixes are noticed
11765 as unused prefixes, as in the return case below. */
11769 prefixes
= PREFIX_FWAIT
;
11774 /* Rex is ignored when followed by another prefix. */
11780 if (*codep
!= FWAIT_OPCODE
)
11781 all_prefixes
[i
++] = *codep
;
11789 /* Return the name of the prefix byte PREF, or NULL if PREF is not a
11792 static const char *
11793 prefix_name (int pref
, int sizeflag
)
11795 static const char *rexes
[16] =
11798 "rex.B", /* 0x41 */
11799 "rex.X", /* 0x42 */
11800 "rex.XB", /* 0x43 */
11801 "rex.R", /* 0x44 */
11802 "rex.RB", /* 0x45 */
11803 "rex.RX", /* 0x46 */
11804 "rex.RXB", /* 0x47 */
11805 "rex.W", /* 0x48 */
11806 "rex.WB", /* 0x49 */
11807 "rex.WX", /* 0x4a */
11808 "rex.WXB", /* 0x4b */
11809 "rex.WR", /* 0x4c */
11810 "rex.WRB", /* 0x4d */
11811 "rex.WRX", /* 0x4e */
11812 "rex.WRXB", /* 0x4f */
11817 /* REX prefixes family. */
11834 return rexes
[pref
- 0x40];
11854 return (sizeflag
& DFLAG
) ? "data16" : "data32";
11856 if (address_mode
== mode_64bit
)
11857 return (sizeflag
& AFLAG
) ? "addr32" : "addr64";
11859 return (sizeflag
& AFLAG
) ? "addr16" : "addr32";
11864 case XACQUIRE_PREFIX
:
11866 case XRELEASE_PREFIX
:
11870 case NOTRACK_PREFIX
:
11877 static char op_out
[MAX_OPERANDS
][100];
11878 static int op_ad
, op_index
[MAX_OPERANDS
];
11879 static int two_source_ops
;
11880 static bfd_vma op_address
[MAX_OPERANDS
];
11881 static bfd_vma op_riprel
[MAX_OPERANDS
];
11882 static bfd_vma start_pc
;
11885 * On the 386's of 1988, the maximum length of an instruction is 15 bytes.
11886 * (see topic "Redundant prefixes" in the "Differences from 8086"
11887 * section of the "Virtual 8086 Mode" chapter.)
11888 * 'pc' should be the address of this instruction, it will
11889 * be used to print the target address if this is a relative jump or call
11890 * The function returns the length of this instruction in bytes.
11893 static char intel_syntax
;
11894 static char intel_mnemonic
= !SYSV386_COMPAT
;
11895 static char open_char
;
11896 static char close_char
;
11897 static char separator_char
;
11898 static char scale_char
;
11906 static enum x86_64_isa isa64
;
11908 /* Here for backwards compatibility. When gdb stops using
11909 print_insn_i386_att and print_insn_i386_intel these functions can
11910 disappear, and print_insn_i386 be merged into print_insn. */
11912 print_insn_i386_att (bfd_vma pc
, disassemble_info
*info
)
11916 return print_insn (pc
, info
);
11920 print_insn_i386_intel (bfd_vma pc
, disassemble_info
*info
)
11924 return print_insn (pc
, info
);
11928 print_insn_i386 (bfd_vma pc
, disassemble_info
*info
)
11932 return print_insn (pc
, info
);
11936 print_i386_disassembler_options (FILE *stream
)
11938 fprintf (stream
, _("\n\
11939 The following i386/x86-64 specific disassembler options are supported for use\n\
11940 with the -M switch (multiple options should be separated by commas):\n"));
11942 fprintf (stream
, _(" x86-64 Disassemble in 64bit mode\n"));
11943 fprintf (stream
, _(" i386 Disassemble in 32bit mode\n"));
11944 fprintf (stream
, _(" i8086 Disassemble in 16bit mode\n"));
11945 fprintf (stream
, _(" att Display instruction in AT&T syntax\n"));
11946 fprintf (stream
, _(" intel Display instruction in Intel syntax\n"));
11947 fprintf (stream
, _(" att-mnemonic\n"
11948 " Display instruction in AT&T mnemonic\n"));
11949 fprintf (stream
, _(" intel-mnemonic\n"
11950 " Display instruction in Intel mnemonic\n"));
11951 fprintf (stream
, _(" addr64 Assume 64bit address size\n"));
11952 fprintf (stream
, _(" addr32 Assume 32bit address size\n"));
11953 fprintf (stream
, _(" addr16 Assume 16bit address size\n"));
11954 fprintf (stream
, _(" data32 Assume 32bit data size\n"));
11955 fprintf (stream
, _(" data16 Assume 16bit data size\n"));
11956 fprintf (stream
, _(" suffix Always display instruction suffix in AT&T syntax\n"));
11957 fprintf (stream
, _(" amd64 Display instruction in AMD64 ISA\n"));
11958 fprintf (stream
, _(" intel64 Display instruction in Intel64 ISA\n"));
11962 static const struct dis386 bad_opcode
= { "(bad)", { XX
}, 0 };
11964 /* Get a pointer to struct dis386 with a valid name. */
11966 static const struct dis386
*
11967 get_valid_dis386 (const struct dis386
*dp
, disassemble_info
*info
)
11969 int vindex
, vex_table_index
;
11971 if (dp
->name
!= NULL
)
11974 switch (dp
->op
[0].bytemode
)
11976 case USE_REG_TABLE
:
11977 dp
= ®_table
[dp
->op
[1].bytemode
][modrm
.reg
];
11980 case USE_MOD_TABLE
:
11981 vindex
= modrm
.mod
== 0x3 ? 1 : 0;
11982 dp
= &mod_table
[dp
->op
[1].bytemode
][vindex
];
11986 dp
= &rm_table
[dp
->op
[1].bytemode
][modrm
.rm
];
11989 case USE_PREFIX_TABLE
:
11992 /* The prefix in VEX is implicit. */
11993 switch (vex
.prefix
)
11998 case REPE_PREFIX_OPCODE
:
12001 case DATA_PREFIX_OPCODE
:
12004 case REPNE_PREFIX_OPCODE
:
12014 int last_prefix
= -1;
12017 /* We check PREFIX_REPNZ and PREFIX_REPZ before PREFIX_DATA.
12018 When there are multiple PREFIX_REPNZ and PREFIX_REPZ, the
12020 if ((prefixes
& (PREFIX_REPZ
| PREFIX_REPNZ
)) != 0)
12022 if (last_repz_prefix
> last_repnz_prefix
)
12025 prefix
= PREFIX_REPZ
;
12026 last_prefix
= last_repz_prefix
;
12031 prefix
= PREFIX_REPNZ
;
12032 last_prefix
= last_repnz_prefix
;
12035 /* Check if prefix should be ignored. */
12036 if ((((prefix_table
[dp
->op
[1].bytemode
][vindex
].prefix_requirement
12037 & PREFIX_IGNORED
) >> PREFIX_IGNORED_SHIFT
)
12042 if (vindex
== 0 && (prefixes
& PREFIX_DATA
) != 0)
12045 prefix
= PREFIX_DATA
;
12046 last_prefix
= last_data_prefix
;
12051 used_prefixes
|= prefix
;
12052 all_prefixes
[last_prefix
] = 0;
12055 dp
= &prefix_table
[dp
->op
[1].bytemode
][vindex
];
12058 case USE_X86_64_TABLE
:
12059 vindex
= address_mode
== mode_64bit
? 1 : 0;
12060 dp
= &x86_64_table
[dp
->op
[1].bytemode
][vindex
];
12063 case USE_3BYTE_TABLE
:
12064 FETCH_DATA (info
, codep
+ 2);
12066 dp
= &three_byte_table
[dp
->op
[1].bytemode
][vindex
];
12068 modrm
.mod
= (*codep
>> 6) & 3;
12069 modrm
.reg
= (*codep
>> 3) & 7;
12070 modrm
.rm
= *codep
& 7;
12073 case USE_VEX_LEN_TABLE
:
12077 switch (vex
.length
)
12090 dp
= &vex_len_table
[dp
->op
[1].bytemode
][vindex
];
12093 case USE_EVEX_LEN_TABLE
:
12097 switch (vex
.length
)
12113 dp
= &evex_len_table
[dp
->op
[1].bytemode
][vindex
];
12116 case USE_XOP_8F_TABLE
:
12117 FETCH_DATA (info
, codep
+ 3);
12118 rex
= ~(*codep
>> 5) & 0x7;
12120 /* VEX_TABLE_INDEX is the mmmmm part of the XOP byte 1 "RCB.mmmmm". */
12121 switch ((*codep
& 0x1f))
12127 vex_table_index
= XOP_08
;
12130 vex_table_index
= XOP_09
;
12133 vex_table_index
= XOP_0A
;
12137 vex
.w
= *codep
& 0x80;
12138 if (vex
.w
&& address_mode
== mode_64bit
)
12141 vex
.register_specifier
= (~(*codep
>> 3)) & 0xf;
12142 if (address_mode
!= mode_64bit
)
12144 /* In 16/32-bit mode REX_B is silently ignored. */
12148 vex
.length
= (*codep
& 0x4) ? 256 : 128;
12149 switch ((*codep
& 0x3))
12154 vex
.prefix
= DATA_PREFIX_OPCODE
;
12157 vex
.prefix
= REPE_PREFIX_OPCODE
;
12160 vex
.prefix
= REPNE_PREFIX_OPCODE
;
12167 dp
= &xop_table
[vex_table_index
][vindex
];
12170 FETCH_DATA (info
, codep
+ 1);
12171 modrm
.mod
= (*codep
>> 6) & 3;
12172 modrm
.reg
= (*codep
>> 3) & 7;
12173 modrm
.rm
= *codep
& 7;
12175 /* No XOP encoding so far allows for a non-zero embedded prefix. Avoid
12176 having to decode the bits for every otherwise valid encoding. */
12178 return &bad_opcode
;
12181 case USE_VEX_C4_TABLE
:
12183 FETCH_DATA (info
, codep
+ 3);
12184 rex
= ~(*codep
>> 5) & 0x7;
12185 switch ((*codep
& 0x1f))
12191 vex_table_index
= VEX_0F
;
12194 vex_table_index
= VEX_0F38
;
12197 vex_table_index
= VEX_0F3A
;
12201 vex
.w
= *codep
& 0x80;
12202 if (address_mode
== mode_64bit
)
12209 /* For the 3-byte VEX prefix in 32-bit mode, the REX_B bit
12210 is ignored, other REX bits are 0 and the highest bit in
12211 VEX.vvvv is also ignored (but we mustn't clear it here). */
12214 vex
.register_specifier
= (~(*codep
>> 3)) & 0xf;
12215 vex
.length
= (*codep
& 0x4) ? 256 : 128;
12216 switch ((*codep
& 0x3))
12221 vex
.prefix
= DATA_PREFIX_OPCODE
;
12224 vex
.prefix
= REPE_PREFIX_OPCODE
;
12227 vex
.prefix
= REPNE_PREFIX_OPCODE
;
12234 dp
= &vex_table
[vex_table_index
][vindex
];
12236 /* There is no MODRM byte for VEX0F 77. */
12237 if (vex_table_index
!= VEX_0F
|| vindex
!= 0x77)
12239 FETCH_DATA (info
, codep
+ 1);
12240 modrm
.mod
= (*codep
>> 6) & 3;
12241 modrm
.reg
= (*codep
>> 3) & 7;
12242 modrm
.rm
= *codep
& 7;
12246 case USE_VEX_C5_TABLE
:
12248 FETCH_DATA (info
, codep
+ 2);
12249 rex
= (*codep
& 0x80) ? 0 : REX_R
;
12251 /* For the 2-byte VEX prefix in 32-bit mode, the highest bit in
12253 vex
.register_specifier
= (~(*codep
>> 3)) & 0xf;
12254 vex
.length
= (*codep
& 0x4) ? 256 : 128;
12255 switch ((*codep
& 0x3))
12260 vex
.prefix
= DATA_PREFIX_OPCODE
;
12263 vex
.prefix
= REPE_PREFIX_OPCODE
;
12266 vex
.prefix
= REPNE_PREFIX_OPCODE
;
12273 dp
= &vex_table
[dp
->op
[1].bytemode
][vindex
];
12275 /* There is no MODRM byte for VEX 77. */
12276 if (vindex
!= 0x77)
12278 FETCH_DATA (info
, codep
+ 1);
12279 modrm
.mod
= (*codep
>> 6) & 3;
12280 modrm
.reg
= (*codep
>> 3) & 7;
12281 modrm
.rm
= *codep
& 7;
12285 case USE_VEX_W_TABLE
:
12289 dp
= &vex_w_table
[dp
->op
[1].bytemode
][vex
.w
? 1 : 0];
12292 case USE_EVEX_TABLE
:
12293 two_source_ops
= 0;
12296 FETCH_DATA (info
, codep
+ 4);
12297 /* The first byte after 0x62. */
12298 rex
= ~(*codep
>> 5) & 0x7;
12299 vex
.r
= *codep
& 0x10;
12300 switch ((*codep
& 0xf))
12303 return &bad_opcode
;
12305 vex_table_index
= EVEX_0F
;
12308 vex_table_index
= EVEX_0F38
;
12311 vex_table_index
= EVEX_0F3A
;
12315 /* The second byte after 0x62. */
12317 vex
.w
= *codep
& 0x80;
12318 if (vex
.w
&& address_mode
== mode_64bit
)
12321 vex
.register_specifier
= (~(*codep
>> 3)) & 0xf;
12324 if (!(*codep
& 0x4))
12325 return &bad_opcode
;
12327 switch ((*codep
& 0x3))
12332 vex
.prefix
= DATA_PREFIX_OPCODE
;
12335 vex
.prefix
= REPE_PREFIX_OPCODE
;
12338 vex
.prefix
= REPNE_PREFIX_OPCODE
;
12342 /* The third byte after 0x62. */
12345 /* Remember the static rounding bits. */
12346 vex
.ll
= (*codep
>> 5) & 3;
12347 vex
.b
= (*codep
& 0x10) != 0;
12349 vex
.v
= *codep
& 0x8;
12350 vex
.mask_register_specifier
= *codep
& 0x7;
12351 vex
.zeroing
= *codep
& 0x80;
12353 if (address_mode
!= mode_64bit
)
12355 /* In 16/32-bit mode silently ignore following bits. */
12365 dp
= &evex_table
[vex_table_index
][vindex
];
12367 FETCH_DATA (info
, codep
+ 1);
12368 modrm
.mod
= (*codep
>> 6) & 3;
12369 modrm
.reg
= (*codep
>> 3) & 7;
12370 modrm
.rm
= *codep
& 7;
12372 /* Set vector length. */
12373 if (modrm
.mod
== 3 && vex
.b
)
12389 return &bad_opcode
;
12402 if (dp
->name
!= NULL
)
12405 return get_valid_dis386 (dp
, info
);
12409 get_sib (disassemble_info
*info
, int sizeflag
)
12411 /* If modrm.mod == 3, operand must be register. */
12413 && ((sizeflag
& AFLAG
) || address_mode
== mode_64bit
)
12417 FETCH_DATA (info
, codep
+ 2);
12418 sib
.index
= (codep
[1] >> 3) & 7;
12419 sib
.scale
= (codep
[1] >> 6) & 3;
12420 sib
.base
= codep
[1] & 7;
12425 print_insn (bfd_vma pc
, disassemble_info
*info
)
12427 const struct dis386
*dp
;
12429 char *op_txt
[MAX_OPERANDS
];
12431 int sizeflag
, orig_sizeflag
;
12433 struct dis_private priv
;
12436 priv
.orig_sizeflag
= AFLAG
| DFLAG
;
12437 if ((info
->mach
& bfd_mach_i386_i386
) != 0)
12438 address_mode
= mode_32bit
;
12439 else if (info
->mach
== bfd_mach_i386_i8086
)
12441 address_mode
= mode_16bit
;
12442 priv
.orig_sizeflag
= 0;
12445 address_mode
= mode_64bit
;
12447 if (intel_syntax
== (char) -1)
12448 intel_syntax
= (info
->mach
& bfd_mach_i386_intel_syntax
) != 0;
12450 for (p
= info
->disassembler_options
; p
!= NULL
; )
12452 if (CONST_STRNEQ (p
, "amd64"))
12454 else if (CONST_STRNEQ (p
, "intel64"))
12456 else if (CONST_STRNEQ (p
, "x86-64"))
12458 address_mode
= mode_64bit
;
12459 priv
.orig_sizeflag
|= AFLAG
| DFLAG
;
12461 else if (CONST_STRNEQ (p
, "i386"))
12463 address_mode
= mode_32bit
;
12464 priv
.orig_sizeflag
|= AFLAG
| DFLAG
;
12466 else if (CONST_STRNEQ (p
, "i8086"))
12468 address_mode
= mode_16bit
;
12469 priv
.orig_sizeflag
&= ~(AFLAG
| DFLAG
);
12471 else if (CONST_STRNEQ (p
, "intel"))
12474 if (CONST_STRNEQ (p
+ 5, "-mnemonic"))
12475 intel_mnemonic
= 1;
12477 else if (CONST_STRNEQ (p
, "att"))
12480 if (CONST_STRNEQ (p
+ 3, "-mnemonic"))
12481 intel_mnemonic
= 0;
12483 else if (CONST_STRNEQ (p
, "addr"))
12485 if (address_mode
== mode_64bit
)
12487 if (p
[4] == '3' && p
[5] == '2')
12488 priv
.orig_sizeflag
&= ~AFLAG
;
12489 else if (p
[4] == '6' && p
[5] == '4')
12490 priv
.orig_sizeflag
|= AFLAG
;
12494 if (p
[4] == '1' && p
[5] == '6')
12495 priv
.orig_sizeflag
&= ~AFLAG
;
12496 else if (p
[4] == '3' && p
[5] == '2')
12497 priv
.orig_sizeflag
|= AFLAG
;
12500 else if (CONST_STRNEQ (p
, "data"))
12502 if (p
[4] == '1' && p
[5] == '6')
12503 priv
.orig_sizeflag
&= ~DFLAG
;
12504 else if (p
[4] == '3' && p
[5] == '2')
12505 priv
.orig_sizeflag
|= DFLAG
;
12507 else if (CONST_STRNEQ (p
, "suffix"))
12508 priv
.orig_sizeflag
|= SUFFIX_ALWAYS
;
12510 p
= strchr (p
, ',');
12515 if (address_mode
== mode_64bit
&& sizeof (bfd_vma
) < 8)
12517 (*info
->fprintf_func
) (info
->stream
,
12518 _("64-bit address is disabled"));
12524 names64
= intel_names64
;
12525 names32
= intel_names32
;
12526 names16
= intel_names16
;
12527 names8
= intel_names8
;
12528 names8rex
= intel_names8rex
;
12529 names_seg
= intel_names_seg
;
12530 names_mm
= intel_names_mm
;
12531 names_bnd
= intel_names_bnd
;
12532 names_xmm
= intel_names_xmm
;
12533 names_ymm
= intel_names_ymm
;
12534 names_zmm
= intel_names_zmm
;
12535 names_tmm
= intel_names_tmm
;
12536 index64
= intel_index64
;
12537 index32
= intel_index32
;
12538 names_mask
= intel_names_mask
;
12539 index16
= intel_index16
;
12542 separator_char
= '+';
12547 names64
= att_names64
;
12548 names32
= att_names32
;
12549 names16
= att_names16
;
12550 names8
= att_names8
;
12551 names8rex
= att_names8rex
;
12552 names_seg
= att_names_seg
;
12553 names_mm
= att_names_mm
;
12554 names_bnd
= att_names_bnd
;
12555 names_xmm
= att_names_xmm
;
12556 names_ymm
= att_names_ymm
;
12557 names_zmm
= att_names_zmm
;
12558 names_tmm
= att_names_tmm
;
12559 index64
= att_index64
;
12560 index32
= att_index32
;
12561 names_mask
= att_names_mask
;
12562 index16
= att_index16
;
12565 separator_char
= ',';
12569 /* The output looks better if we put 7 bytes on a line, since that
12570 puts most long word instructions on a single line. Use 8 bytes
12572 if ((info
->mach
& bfd_mach_l1om
) != 0)
12573 info
->bytes_per_line
= 8;
12575 info
->bytes_per_line
= 7;
12577 info
->private_data
= &priv
;
12578 priv
.max_fetched
= priv
.the_buffer
;
12579 priv
.insn_start
= pc
;
12582 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
12590 start_codep
= priv
.the_buffer
;
12591 codep
= priv
.the_buffer
;
12593 if (OPCODES_SIGSETJMP (priv
.bailout
) != 0)
12597 /* Getting here means we tried for data but didn't get it. That
12598 means we have an incomplete instruction of some sort. Just
12599 print the first byte as a prefix or a .byte pseudo-op. */
12600 if (codep
> priv
.the_buffer
)
12602 name
= prefix_name (priv
.the_buffer
[0], priv
.orig_sizeflag
);
12604 (*info
->fprintf_func
) (info
->stream
, "%s", name
);
12607 /* Just print the first byte as a .byte instruction. */
12608 (*info
->fprintf_func
) (info
->stream
, ".byte 0x%x",
12609 (unsigned int) priv
.the_buffer
[0]);
12619 sizeflag
= priv
.orig_sizeflag
;
12621 if (!ckprefix () || rex_used
)
12623 /* Too many prefixes or unused REX prefixes. */
12625 i
< (int) ARRAY_SIZE (all_prefixes
) && all_prefixes
[i
];
12627 (*info
->fprintf_func
) (info
->stream
, "%s%s",
12629 prefix_name (all_prefixes
[i
], sizeflag
));
12633 insn_codep
= codep
;
12635 FETCH_DATA (info
, codep
+ 1);
12636 two_source_ops
= (*codep
== 0x62) || (*codep
== 0xc8);
12638 if (((prefixes
& PREFIX_FWAIT
)
12639 && ((*codep
< 0xd8) || (*codep
> 0xdf))))
12641 /* Handle prefixes before fwait. */
12642 for (i
= 0; i
< fwait_prefix
&& all_prefixes
[i
];
12644 (*info
->fprintf_func
) (info
->stream
, "%s ",
12645 prefix_name (all_prefixes
[i
], sizeflag
));
12646 (*info
->fprintf_func
) (info
->stream
, "fwait");
12650 if (*codep
== 0x0f)
12652 unsigned char threebyte
;
12655 FETCH_DATA (info
, codep
+ 1);
12656 threebyte
= *codep
;
12657 dp
= &dis386_twobyte
[threebyte
];
12658 need_modrm
= twobyte_has_modrm
[*codep
];
12663 dp
= &dis386
[*codep
];
12664 need_modrm
= onebyte_has_modrm
[*codep
];
12668 /* Save sizeflag for printing the extra prefixes later before updating
12669 it for mnemonic and operand processing. The prefix names depend
12670 only on the address mode. */
12671 orig_sizeflag
= sizeflag
;
12672 if (prefixes
& PREFIX_ADDR
)
12674 if ((prefixes
& PREFIX_DATA
))
12680 FETCH_DATA (info
, codep
+ 1);
12681 modrm
.mod
= (*codep
>> 6) & 3;
12682 modrm
.reg
= (*codep
>> 3) & 7;
12683 modrm
.rm
= *codep
& 7;
12688 memset (&vex
, 0, sizeof (vex
));
12690 if (dp
->name
== NULL
&& dp
->op
[0].bytemode
== FLOATCODE
)
12692 get_sib (info
, sizeflag
);
12693 dofloat (sizeflag
);
12697 dp
= get_valid_dis386 (dp
, info
);
12698 if (dp
!= NULL
&& putop (dp
->name
, sizeflag
) == 0)
12700 get_sib (info
, sizeflag
);
12701 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
12704 op_ad
= MAX_OPERANDS
- 1 - i
;
12706 (*dp
->op
[i
].rtn
) (dp
->op
[i
].bytemode
, sizeflag
);
12707 /* For EVEX instruction after the last operand masking
12708 should be printed. */
12709 if (i
== 0 && vex
.evex
)
12711 /* Don't print {%k0}. */
12712 if (vex
.mask_register_specifier
)
12715 oappend (names_mask
[vex
.mask_register_specifier
]);
12725 /* Clear instruction information. */
12728 the_info
->insn_info_valid
= 0;
12729 the_info
->branch_delay_insns
= 0;
12730 the_info
->data_size
= 0;
12731 the_info
->insn_type
= dis_noninsn
;
12732 the_info
->target
= 0;
12733 the_info
->target2
= 0;
12736 /* Reset jump operation indicator. */
12737 op_is_jump
= FALSE
;
12740 int jump_detection
= 0;
12742 /* Extract flags. */
12743 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
12745 if ((dp
->op
[i
].rtn
== OP_J
)
12746 || (dp
->op
[i
].rtn
== OP_indirE
))
12747 jump_detection
|= 1;
12748 else if ((dp
->op
[i
].rtn
== BND_Fixup
)
12749 || (!dp
->op
[i
].rtn
&& !dp
->op
[i
].bytemode
))
12750 jump_detection
|= 2;
12751 else if ((dp
->op
[i
].bytemode
== cond_jump_mode
)
12752 || (dp
->op
[i
].bytemode
== loop_jcxz_mode
))
12753 jump_detection
|= 4;
12756 /* Determine if this is a jump or branch. */
12757 if ((jump_detection
& 0x3) == 0x3)
12760 if (jump_detection
& 0x4)
12761 the_info
->insn_type
= dis_condbranch
;
12763 the_info
->insn_type
=
12764 (dp
->name
&& !strncmp(dp
->name
, "call", 4))
12765 ? dis_jsr
: dis_branch
;
12769 /* If VEX.vvvv and EVEX.vvvv are unused, they must be all 1s, which
12770 are all 0s in inverted form. */
12771 if (need_vex
&& vex
.register_specifier
!= 0)
12773 (*info
->fprintf_func
) (info
->stream
, "(bad)");
12774 return end_codep
- priv
.the_buffer
;
12777 /* Check if the REX prefix is used. */
12778 if ((rex
^ rex_used
) == 0 && !need_vex
&& last_rex_prefix
>= 0)
12779 all_prefixes
[last_rex_prefix
] = 0;
12781 /* Check if the SEG prefix is used. */
12782 if ((prefixes
& (PREFIX_CS
| PREFIX_SS
| PREFIX_DS
| PREFIX_ES
12783 | PREFIX_FS
| PREFIX_GS
)) != 0
12784 && (used_prefixes
& active_seg_prefix
) != 0)
12785 all_prefixes
[last_seg_prefix
] = 0;
12787 /* Check if the ADDR prefix is used. */
12788 if ((prefixes
& PREFIX_ADDR
) != 0
12789 && (used_prefixes
& PREFIX_ADDR
) != 0)
12790 all_prefixes
[last_addr_prefix
] = 0;
12792 /* Check if the DATA prefix is used. */
12793 if ((prefixes
& PREFIX_DATA
) != 0
12794 && (used_prefixes
& PREFIX_DATA
) != 0
12796 all_prefixes
[last_data_prefix
] = 0;
12798 /* Print the extra prefixes. */
12800 for (i
= 0; i
< (int) ARRAY_SIZE (all_prefixes
); i
++)
12801 if (all_prefixes
[i
])
12804 name
= prefix_name (all_prefixes
[i
], orig_sizeflag
);
12807 prefix_length
+= strlen (name
) + 1;
12808 (*info
->fprintf_func
) (info
->stream
, "%s ", name
);
12811 /* If the mandatory PREFIX_REPZ/PREFIX_REPNZ/PREFIX_DATA prefix is
12812 unused, opcode is invalid. Since the PREFIX_DATA prefix may be
12813 used by putop and MMX/SSE operand and may be overriden by the
12814 PREFIX_REPZ/PREFIX_REPNZ fix, we check the PREFIX_DATA prefix
12816 if (dp
->prefix_requirement
== PREFIX_OPCODE
12818 ? vex
.prefix
== REPE_PREFIX_OPCODE
12819 || vex
.prefix
== REPNE_PREFIX_OPCODE
12821 & (PREFIX_REPZ
| PREFIX_REPNZ
)) != 0)
12823 & (PREFIX_REPZ
| PREFIX_REPNZ
)) == 0)
12825 ? vex
.prefix
== DATA_PREFIX_OPCODE
12827 & (PREFIX_REPZ
| PREFIX_REPNZ
| PREFIX_DATA
))
12829 && (used_prefixes
& PREFIX_DATA
) == 0))
12830 || (vex
.evex
&& !vex
.w
!= !(used_prefixes
& PREFIX_DATA
))))
12832 (*info
->fprintf_func
) (info
->stream
, "(bad)");
12833 return end_codep
- priv
.the_buffer
;
12836 /* Check maximum code length. */
12837 if ((codep
- start_codep
) > MAX_CODE_LENGTH
)
12839 (*info
->fprintf_func
) (info
->stream
, "(bad)");
12840 return MAX_CODE_LENGTH
;
12843 obufp
= mnemonicendp
;
12844 for (i
= strlen (obuf
) + prefix_length
; i
< 6; i
++)
12847 (*info
->fprintf_func
) (info
->stream
, "%s", obuf
);
12849 /* The enter and bound instructions are printed with operands in the same
12850 order as the intel book; everything else is printed in reverse order. */
12851 if (intel_syntax
|| two_source_ops
)
12855 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
12856 op_txt
[i
] = op_out
[i
];
12858 if (intel_syntax
&& dp
&& dp
->op
[2].rtn
== OP_Rounding
12859 && dp
->op
[3].rtn
== OP_E
&& dp
->op
[4].rtn
== NULL
)
12861 op_txt
[2] = op_out
[3];
12862 op_txt
[3] = op_out
[2];
12865 for (i
= 0; i
< (MAX_OPERANDS
>> 1); ++i
)
12867 op_ad
= op_index
[i
];
12868 op_index
[i
] = op_index
[MAX_OPERANDS
- 1 - i
];
12869 op_index
[MAX_OPERANDS
- 1 - i
] = op_ad
;
12870 riprel
= op_riprel
[i
];
12871 op_riprel
[i
] = op_riprel
[MAX_OPERANDS
- 1 - i
];
12872 op_riprel
[MAX_OPERANDS
- 1 - i
] = riprel
;
12877 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
12878 op_txt
[MAX_OPERANDS
- 1 - i
] = op_out
[i
];
12882 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
12886 (*info
->fprintf_func
) (info
->stream
, ",");
12887 if (op_index
[i
] != -1 && !op_riprel
[i
])
12889 bfd_vma target
= (bfd_vma
) op_address
[op_index
[i
]];
12891 if (the_info
&& op_is_jump
)
12893 the_info
->insn_info_valid
= 1;
12894 the_info
->branch_delay_insns
= 0;
12895 the_info
->data_size
= 0;
12896 the_info
->target
= target
;
12897 the_info
->target2
= 0;
12899 (*info
->print_address_func
) (target
, info
);
12902 (*info
->fprintf_func
) (info
->stream
, "%s", op_txt
[i
]);
12906 for (i
= 0; i
< MAX_OPERANDS
; i
++)
12907 if (op_index
[i
] != -1 && op_riprel
[i
])
12909 (*info
->fprintf_func
) (info
->stream
, " # ");
12910 (*info
->print_address_func
) ((bfd_vma
) (start_pc
+ (codep
- start_codep
)
12911 + op_address
[op_index
[i
]]), info
);
12914 return codep
- priv
.the_buffer
;
12917 static const char *float_mem
[] = {
12992 static const unsigned char float_mem_mode
[] = {
13067 #define ST { OP_ST, 0 }
13068 #define STi { OP_STi, 0 }
13070 #define FGRPd9_2 NULL, { { NULL, 1 } }, 0
13071 #define FGRPd9_4 NULL, { { NULL, 2 } }, 0
13072 #define FGRPd9_5 NULL, { { NULL, 3 } }, 0
13073 #define FGRPd9_6 NULL, { { NULL, 4 } }, 0
13074 #define FGRPd9_7 NULL, { { NULL, 5 } }, 0
13075 #define FGRPda_5 NULL, { { NULL, 6 } }, 0
13076 #define FGRPdb_4 NULL, { { NULL, 7 } }, 0
13077 #define FGRPde_3 NULL, { { NULL, 8 } }, 0
13078 #define FGRPdf_4 NULL, { { NULL, 9 } }, 0
13080 static const struct dis386 float_reg
[][8] = {
13083 { "fadd", { ST
, STi
}, 0 },
13084 { "fmul", { ST
, STi
}, 0 },
13085 { "fcom", { STi
}, 0 },
13086 { "fcomp", { STi
}, 0 },
13087 { "fsub", { ST
, STi
}, 0 },
13088 { "fsubr", { ST
, STi
}, 0 },
13089 { "fdiv", { ST
, STi
}, 0 },
13090 { "fdivr", { ST
, STi
}, 0 },
13094 { "fld", { STi
}, 0 },
13095 { "fxch", { STi
}, 0 },
13105 { "fcmovb", { ST
, STi
}, 0 },
13106 { "fcmove", { ST
, STi
}, 0 },
13107 { "fcmovbe",{ ST
, STi
}, 0 },
13108 { "fcmovu", { ST
, STi
}, 0 },
13116 { "fcmovnb",{ ST
, STi
}, 0 },
13117 { "fcmovne",{ ST
, STi
}, 0 },
13118 { "fcmovnbe",{ ST
, STi
}, 0 },
13119 { "fcmovnu",{ ST
, STi
}, 0 },
13121 { "fucomi", { ST
, STi
}, 0 },
13122 { "fcomi", { ST
, STi
}, 0 },
13127 { "fadd", { STi
, ST
}, 0 },
13128 { "fmul", { STi
, ST
}, 0 },
13131 { "fsub{!M|r}", { STi
, ST
}, 0 },
13132 { "fsub{M|}", { STi
, ST
}, 0 },
13133 { "fdiv{!M|r}", { STi
, ST
}, 0 },
13134 { "fdiv{M|}", { STi
, ST
}, 0 },
13138 { "ffree", { STi
}, 0 },
13140 { "fst", { STi
}, 0 },
13141 { "fstp", { STi
}, 0 },
13142 { "fucom", { STi
}, 0 },
13143 { "fucomp", { STi
}, 0 },
13149 { "faddp", { STi
, ST
}, 0 },
13150 { "fmulp", { STi
, ST
}, 0 },
13153 { "fsub{!M|r}p", { STi
, ST
}, 0 },
13154 { "fsub{M|}p", { STi
, ST
}, 0 },
13155 { "fdiv{!M|r}p", { STi
, ST
}, 0 },
13156 { "fdiv{M|}p", { STi
, ST
}, 0 },
13160 { "ffreep", { STi
}, 0 },
13165 { "fucomip", { ST
, STi
}, 0 },
13166 { "fcomip", { ST
, STi
}, 0 },
13171 static char *fgrps
[][8] = {
13174 "(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
13179 "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
13184 "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
13189 "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
13194 "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
13199 "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
13204 "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
13209 "fNeni(8087 only)","fNdisi(8087 only)","fNclex","fNinit",
13210 "fNsetpm(287 only)","frstpm(287 only)","(bad)","(bad)",
13215 "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
13220 "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
13225 swap_operand (void)
13227 mnemonicendp
[0] = '.';
13228 mnemonicendp
[1] = 's';
13233 OP_Skip_MODRM (int bytemode ATTRIBUTE_UNUSED
,
13234 int sizeflag ATTRIBUTE_UNUSED
)
13236 /* Skip mod/rm byte. */
13242 dofloat (int sizeflag
)
13244 const struct dis386
*dp
;
13245 unsigned char floatop
;
13247 floatop
= codep
[-1];
13249 if (modrm
.mod
!= 3)
13251 int fp_indx
= (floatop
- 0xd8) * 8 + modrm
.reg
;
13253 putop (float_mem
[fp_indx
], sizeflag
);
13256 OP_E (float_mem_mode
[fp_indx
], sizeflag
);
13259 /* Skip mod/rm byte. */
13263 dp
= &float_reg
[floatop
- 0xd8][modrm
.reg
];
13264 if (dp
->name
== NULL
)
13266 putop (fgrps
[dp
->op
[0].bytemode
][modrm
.rm
], sizeflag
);
13268 /* Instruction fnstsw is only one with strange arg. */
13269 if (floatop
== 0xdf && codep
[-1] == 0xe0)
13270 strcpy (op_out
[0], names16
[0]);
13274 putop (dp
->name
, sizeflag
);
13279 (*dp
->op
[0].rtn
) (dp
->op
[0].bytemode
, sizeflag
);
13284 (*dp
->op
[1].rtn
) (dp
->op
[1].bytemode
, sizeflag
);
13288 /* Like oappend (below), but S is a string starting with '%'.
13289 In Intel syntax, the '%' is elided. */
13291 oappend_maybe_intel (const char *s
)
13293 oappend (s
+ intel_syntax
);
13297 OP_ST (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
13299 oappend_maybe_intel ("%st");
13303 OP_STi (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
13305 sprintf (scratchbuf
, "%%st(%d)", modrm
.rm
);
13306 oappend_maybe_intel (scratchbuf
);
13309 /* Capital letters in template are macros. */
13311 putop (const char *in_template
, int sizeflag
)
13316 unsigned int l
= 0, len
= 0;
13319 for (p
= in_template
; *p
; p
++)
13323 if (l
>= sizeof (last
) || !ISUPPER (*p
))
13342 while (*++p
!= '|')
13343 if (*p
== '}' || *p
== '\0')
13349 while (*++p
!= '}')
13361 if (modrm
.mod
!= 3 || (sizeflag
& SUFFIX_ALWAYS
))
13370 if (sizeflag
& SUFFIX_ALWAYS
)
13373 else if (l
== 1 && last
[0] == 'L')
13375 if (address_mode
== mode_64bit
13376 && !(prefixes
& PREFIX_ADDR
))
13389 if (intel_syntax
&& !alt
)
13391 if ((prefixes
& PREFIX_DATA
) || (sizeflag
& SUFFIX_ALWAYS
))
13393 if (sizeflag
& DFLAG
)
13394 *obufp
++ = intel_syntax
? 'd' : 'l';
13396 *obufp
++ = intel_syntax
? 'w' : 's';
13397 used_prefixes
|= (prefixes
& PREFIX_DATA
);
13401 if (intel_syntax
|| !(sizeflag
& SUFFIX_ALWAYS
))
13404 if (modrm
.mod
== 3)
13410 if (sizeflag
& DFLAG
)
13411 *obufp
++ = intel_syntax
? 'd' : 'l';
13414 used_prefixes
|= (prefixes
& PREFIX_DATA
);
13420 case 'E': /* For jcxz/jecxz */
13421 if (address_mode
== mode_64bit
)
13423 if (sizeflag
& AFLAG
)
13429 if (sizeflag
& AFLAG
)
13431 used_prefixes
|= (prefixes
& PREFIX_ADDR
);
13436 if ((prefixes
& PREFIX_ADDR
) || (sizeflag
& SUFFIX_ALWAYS
))
13438 if (sizeflag
& AFLAG
)
13439 *obufp
++ = address_mode
== mode_64bit
? 'q' : 'l';
13441 *obufp
++ = address_mode
== mode_64bit
? 'l' : 'w';
13442 used_prefixes
|= (prefixes
& PREFIX_ADDR
);
13446 if (intel_syntax
|| (obufp
[-1] != 's' && !(sizeflag
& SUFFIX_ALWAYS
)))
13448 if ((rex
& REX_W
) || (sizeflag
& DFLAG
))
13452 if (!(rex
& REX_W
))
13453 used_prefixes
|= (prefixes
& PREFIX_DATA
);
13458 if ((prefixes
& (PREFIX_CS
| PREFIX_DS
)) == PREFIX_CS
13459 || (prefixes
& (PREFIX_CS
| PREFIX_DS
)) == PREFIX_DS
)
13461 used_prefixes
|= prefixes
& (PREFIX_CS
| PREFIX_DS
);
13464 if (prefixes
& PREFIX_DS
)
13480 if (l
!= 1 || last
[0] != 'X')
13482 if (!need_vex
|| !vex
.evex
)
13485 || ((modrm
.mod
== 3 || vex
.b
) && !(sizeflag
& SUFFIX_ALWAYS
)))
13487 switch (vex
.length
)
13505 if (address_mode
== mode_64bit
&& (sizeflag
& SUFFIX_ALWAYS
))
13510 /* Fall through. */
13518 if (sizeflag
& SUFFIX_ALWAYS
)
13522 if (intel_mnemonic
!= cond
)
13526 if ((prefixes
& PREFIX_FWAIT
) == 0)
13529 used_prefixes
|= PREFIX_FWAIT
;
13535 else if (intel_syntax
&& (sizeflag
& DFLAG
))
13539 if (!(rex
& REX_W
))
13540 used_prefixes
|= (prefixes
& PREFIX_DATA
);
13544 && address_mode
== mode_64bit
13545 && isa64
== intel64
)
13550 /* Fall through. */
13553 && address_mode
== mode_64bit
13554 && ((sizeflag
& DFLAG
) || (rex
& REX_W
)))
13559 /* Fall through. */
13567 if ((rex
& REX_W
) == 0
13568 && (prefixes
& PREFIX_DATA
))
13570 if ((sizeflag
& DFLAG
) == 0)
13572 used_prefixes
|= (prefixes
& PREFIX_DATA
);
13576 if ((prefixes
& PREFIX_DATA
)
13578 || (sizeflag
& SUFFIX_ALWAYS
))
13585 if (sizeflag
& DFLAG
)
13589 used_prefixes
|= (prefixes
& PREFIX_DATA
);
13593 else if (l
== 1 && last
[0] == 'L')
13595 if ((prefixes
& PREFIX_DATA
)
13597 || (sizeflag
& SUFFIX_ALWAYS
))
13604 if (sizeflag
& DFLAG
)
13605 *obufp
++ = intel_syntax
? 'd' : 'l';
13608 used_prefixes
|= (prefixes
& PREFIX_DATA
);
13618 if (address_mode
== mode_64bit
13619 && ((sizeflag
& DFLAG
) || (rex
& REX_W
)))
13621 if (modrm
.mod
!= 3 || (sizeflag
& SUFFIX_ALWAYS
))
13625 /* Fall through. */
13631 if (intel_syntax
&& !alt
)
13634 if (modrm
.mod
!= 3 || (sizeflag
& SUFFIX_ALWAYS
))
13640 if (sizeflag
& DFLAG
)
13641 *obufp
++ = intel_syntax
? 'd' : 'l';
13644 used_prefixes
|= (prefixes
& PREFIX_DATA
);
13648 else if (l
== 1 && last
[0] == 'L')
13650 if ((intel_syntax
&& need_modrm
)
13651 || (modrm
.mod
== 3 && !(sizeflag
& SUFFIX_ALWAYS
)))
13658 else if((address_mode
== mode_64bit
&& need_modrm
)
13659 || (sizeflag
& SUFFIX_ALWAYS
))
13660 *obufp
++ = intel_syntax
? 'd' : 'l';
13669 else if (sizeflag
& DFLAG
)
13678 if (intel_syntax
&& !p
[1]
13679 && ((rex
& REX_W
) || (sizeflag
& DFLAG
)))
13681 if (!(rex
& REX_W
))
13682 used_prefixes
|= (prefixes
& PREFIX_DATA
);
13689 if (address_mode
== mode_64bit
13690 && ((sizeflag
& DFLAG
) || (rex
& REX_W
)))
13692 if (sizeflag
& SUFFIX_ALWAYS
)
13697 else if (l
== 1 && last
[0] == 'L')
13708 /* Fall through. */
13716 if (sizeflag
& SUFFIX_ALWAYS
)
13722 if (sizeflag
& DFLAG
)
13726 used_prefixes
|= (prefixes
& PREFIX_DATA
);
13730 else if (l
== 1 && last
[0] == 'L')
13732 if (address_mode
== mode_64bit
13733 && !(prefixes
& PREFIX_ADDR
))
13749 ? vex
.prefix
== DATA_PREFIX_OPCODE
13750 : prefixes
& PREFIX_DATA
)
13753 used_prefixes
|= PREFIX_DATA
;
13759 if (l
== 1 && last
[0] == 'X')
13764 || ((modrm
.mod
== 3 || vex
.b
) && !(sizeflag
& SUFFIX_ALWAYS
)))
13766 switch (vex
.length
)
13786 /* operand size flag for cwtl, cbtw */
13795 else if (sizeflag
& DFLAG
)
13799 if (!(rex
& REX_W
))
13800 used_prefixes
|= (prefixes
& PREFIX_DATA
);
13806 if (last
[0] == 'X')
13807 *obufp
++ = vex
.w
? 'd': 's';
13808 else if (last
[0] == 'L')
13809 *obufp
++ = vex
.w
? 'q': 'd';
13810 else if (last
[0] == 'B')
13811 *obufp
++ = vex
.w
? 'w': 'b';
13821 if (isa64
== intel64
&& (rex
& REX_W
))
13827 if ((prefixes
& PREFIX_DATA
) || (sizeflag
& SUFFIX_ALWAYS
))
13829 if (sizeflag
& DFLAG
)
13833 used_prefixes
|= (prefixes
& PREFIX_DATA
);
13839 if (address_mode
== mode_64bit
13840 && (isa64
== intel64
13841 || ((sizeflag
& DFLAG
) || (rex
& REX_W
))))
13843 else if ((prefixes
& PREFIX_DATA
))
13845 if (!(sizeflag
& DFLAG
))
13847 used_prefixes
|= (prefixes
& PREFIX_DATA
);
13856 mnemonicendp
= obufp
;
13861 oappend (const char *s
)
13863 obufp
= stpcpy (obufp
, s
);
13869 /* Only print the active segment register. */
13870 if (!active_seg_prefix
)
13873 used_prefixes
|= active_seg_prefix
;
13874 switch (active_seg_prefix
)
13877 oappend_maybe_intel ("%cs:");
13880 oappend_maybe_intel ("%ds:");
13883 oappend_maybe_intel ("%ss:");
13886 oappend_maybe_intel ("%es:");
13889 oappend_maybe_intel ("%fs:");
13892 oappend_maybe_intel ("%gs:");
13900 OP_indirE (int bytemode
, int sizeflag
)
13904 OP_E (bytemode
, sizeflag
);
13908 print_operand_value (char *buf
, int hex
, bfd_vma disp
)
13910 if (address_mode
== mode_64bit
)
13918 sprintf_vma (tmp
, disp
);
13919 for (i
= 0; tmp
[i
] == '0' && tmp
[i
+ 1]; i
++);
13920 strcpy (buf
+ 2, tmp
+ i
);
13924 bfd_signed_vma v
= disp
;
13931 /* Check for possible overflow on 0x8000000000000000. */
13934 strcpy (buf
, "9223372036854775808");
13948 tmp
[28 - i
] = (v
% 10) + '0';
13952 strcpy (buf
, tmp
+ 29 - i
);
13958 sprintf (buf
, "0x%x", (unsigned int) disp
);
13960 sprintf (buf
, "%d", (int) disp
);
13964 /* Put DISP in BUF as signed hex number. */
13967 print_displacement (char *buf
, bfd_vma disp
)
13969 bfd_signed_vma val
= disp
;
13978 /* Check for possible overflow. */
13981 switch (address_mode
)
13984 strcpy (buf
+ j
, "0x8000000000000000");
13987 strcpy (buf
+ j
, "0x80000000");
13990 strcpy (buf
+ j
, "0x8000");
14000 sprintf_vma (tmp
, (bfd_vma
) val
);
14001 for (i
= 0; tmp
[i
] == '0'; i
++)
14003 if (tmp
[i
] == '\0')
14005 strcpy (buf
+ j
, tmp
+ i
);
14009 intel_operand_size (int bytemode
, int sizeflag
)
14013 && (bytemode
== x_mode
14014 || bytemode
== evex_half_bcst_xmmq_mode
))
14017 oappend ("QWORD PTR ");
14019 oappend ("DWORD PTR ");
14028 oappend ("BYTE PTR ");
14033 oappend ("WORD PTR ");
14036 if (address_mode
== mode_64bit
&& isa64
== intel64
)
14038 oappend ("QWORD PTR ");
14041 /* Fall through. */
14043 if (address_mode
== mode_64bit
&& ((sizeflag
& DFLAG
) || (rex
& REX_W
)))
14045 oappend ("QWORD PTR ");
14048 /* Fall through. */
14054 oappend ("QWORD PTR ");
14057 if ((sizeflag
& DFLAG
) || bytemode
== dq_mode
)
14058 oappend ("DWORD PTR ");
14060 oappend ("WORD PTR ");
14061 used_prefixes
|= (prefixes
& PREFIX_DATA
);
14065 if ((rex
& REX_W
) || (sizeflag
& DFLAG
))
14067 oappend ("WORD PTR ");
14068 if (!(rex
& REX_W
))
14069 used_prefixes
|= (prefixes
& PREFIX_DATA
);
14072 if (sizeflag
& DFLAG
)
14073 oappend ("QWORD PTR ");
14075 oappend ("DWORD PTR ");
14076 used_prefixes
|= (prefixes
& PREFIX_DATA
);
14079 if (!(sizeflag
& DFLAG
) && isa64
== intel64
)
14080 oappend ("WORD PTR ");
14082 oappend ("DWORD PTR ");
14083 used_prefixes
|= (prefixes
& PREFIX_DATA
);
14086 case d_scalar_swap_mode
:
14089 oappend ("DWORD PTR ");
14092 case q_scalar_swap_mode
:
14094 oappend ("QWORD PTR ");
14097 if (address_mode
== mode_64bit
)
14098 oappend ("QWORD PTR ");
14100 oappend ("DWORD PTR ");
14103 if (sizeflag
& DFLAG
)
14104 oappend ("FWORD PTR ");
14106 oappend ("DWORD PTR ");
14107 used_prefixes
|= (prefixes
& PREFIX_DATA
);
14110 oappend ("TBYTE PTR ");
14114 case evex_x_gscat_mode
:
14115 case evex_x_nobcst_mode
:
14116 case b_scalar_mode
:
14117 case w_scalar_mode
:
14120 switch (vex
.length
)
14123 oappend ("XMMWORD PTR ");
14126 oappend ("YMMWORD PTR ");
14129 oappend ("ZMMWORD PTR ");
14136 oappend ("XMMWORD PTR ");
14139 oappend ("XMMWORD PTR ");
14142 oappend ("YMMWORD PTR ");
14145 case evex_half_bcst_xmmq_mode
:
14149 switch (vex
.length
)
14152 oappend ("QWORD PTR ");
14155 oappend ("XMMWORD PTR ");
14158 oappend ("YMMWORD PTR ");
14168 switch (vex
.length
)
14173 oappend ("BYTE PTR ");
14183 switch (vex
.length
)
14188 oappend ("WORD PTR ");
14198 switch (vex
.length
)
14203 oappend ("DWORD PTR ");
14213 switch (vex
.length
)
14218 oappend ("QWORD PTR ");
14228 switch (vex
.length
)
14231 oappend ("WORD PTR ");
14234 oappend ("DWORD PTR ");
14237 oappend ("QWORD PTR ");
14247 switch (vex
.length
)
14250 oappend ("DWORD PTR ");
14253 oappend ("QWORD PTR ");
14256 oappend ("XMMWORD PTR ");
14266 switch (vex
.length
)
14269 oappend ("QWORD PTR ");
14272 oappend ("YMMWORD PTR ");
14275 oappend ("ZMMWORD PTR ");
14285 switch (vex
.length
)
14289 oappend ("XMMWORD PTR ");
14296 oappend ("OWORD PTR ");
14298 case vex_scalar_w_dq_mode
:
14303 oappend ("QWORD PTR ");
14305 oappend ("DWORD PTR ");
14307 case vex_vsib_d_w_dq_mode
:
14308 case vex_vsib_q_w_dq_mode
:
14315 oappend ("QWORD PTR ");
14317 oappend ("DWORD PTR ");
14321 switch (vex
.length
)
14324 oappend ("XMMWORD PTR ");
14327 oappend ("YMMWORD PTR ");
14330 oappend ("ZMMWORD PTR ");
14337 case vex_vsib_q_w_d_mode
:
14338 case vex_vsib_d_w_d_mode
:
14339 if (!need_vex
|| !vex
.evex
)
14342 switch (vex
.length
)
14345 oappend ("QWORD PTR ");
14348 oappend ("XMMWORD PTR ");
14351 oappend ("YMMWORD PTR ");
14359 if (!need_vex
|| vex
.length
!= 128)
14362 oappend ("DWORD PTR ");
14364 oappend ("BYTE PTR ");
14370 oappend ("QWORD PTR ");
14372 oappend ("WORD PTR ");
14382 OP_E_register (int bytemode
, int sizeflag
)
14384 int reg
= modrm
.rm
;
14385 const char **names
;
14391 if ((sizeflag
& SUFFIX_ALWAYS
)
14392 && (bytemode
== b_swap_mode
14393 || bytemode
== bnd_swap_mode
14394 || bytemode
== v_swap_mode
))
14421 names
= address_mode
== mode_64bit
? names64
: names32
;
14424 case bnd_swap_mode
:
14433 if (address_mode
== mode_64bit
&& isa64
== intel64
)
14438 /* Fall through. */
14440 if (address_mode
== mode_64bit
&& ((sizeflag
& DFLAG
) || (rex
& REX_W
)))
14446 /* Fall through. */
14458 if ((sizeflag
& DFLAG
)
14459 || (bytemode
!= v_mode
14460 && bytemode
!= v_swap_mode
))
14464 used_prefixes
|= (prefixes
& PREFIX_DATA
);
14468 if (!(sizeflag
& DFLAG
) && isa64
== intel64
)
14472 used_prefixes
|= (prefixes
& PREFIX_DATA
);
14475 names
= (address_mode
== mode_64bit
14476 ? names64
: names32
);
14477 if (!(prefixes
& PREFIX_ADDR
))
14478 names
= (address_mode
== mode_16bit
14479 ? names16
: names
);
14482 /* Remove "addr16/addr32". */
14483 all_prefixes
[last_addr_prefix
] = 0;
14484 names
= (address_mode
!= mode_32bit
14485 ? names32
: names16
);
14486 used_prefixes
|= PREFIX_ADDR
;
14496 names
= names_mask
;
14501 oappend (INTERNAL_DISASSEMBLER_ERROR
);
14504 oappend (names
[reg
]);
14508 OP_E_memory (int bytemode
, int sizeflag
)
14511 int add
= (rex
& REX_B
) ? 8 : 0;
14517 /* In EVEX, if operand doesn't allow broadcast, vex.b should be 0. */
14519 && bytemode
!= x_mode
14520 && bytemode
!= xmmq_mode
14521 && bytemode
!= evex_half_bcst_xmmq_mode
)
14537 if (address_mode
!= mode_64bit
)
14543 case vex_scalar_w_dq_mode
:
14544 case vex_vsib_d_w_dq_mode
:
14545 case vex_vsib_d_w_d_mode
:
14546 case vex_vsib_q_w_dq_mode
:
14547 case vex_vsib_q_w_d_mode
:
14548 case evex_x_gscat_mode
:
14549 shift
= vex
.w
? 3 : 2;
14552 case evex_half_bcst_xmmq_mode
:
14556 shift
= vex
.w
? 3 : 2;
14559 /* Fall through. */
14563 case evex_x_nobcst_mode
:
14565 switch (vex
.length
)
14589 case q_scalar_swap_mode
:
14596 case d_scalar_swap_mode
:
14599 case w_scalar_mode
:
14603 case b_scalar_mode
:
14610 /* Make necessary corrections to shift for modes that need it.
14611 For these modes we currently have shift 4, 5 or 6 depending on
14612 vex.length (it corresponds to xmmword, ymmword or zmmword
14613 operand). We might want to make it 3, 4 or 5 (e.g. for
14614 xmmq_mode). In case of broadcast enabled the corrections
14615 aren't needed, as element size is always 32 or 64 bits. */
14617 && (bytemode
== xmmq_mode
14618 || bytemode
== evex_half_bcst_xmmq_mode
))
14620 else if (bytemode
== xmmqd_mode
)
14622 else if (bytemode
== xmmdw_mode
)
14624 else if (bytemode
== ymmq_mode
&& vex
.length
== 128)
14632 intel_operand_size (bytemode
, sizeflag
);
14635 if ((sizeflag
& AFLAG
) || address_mode
== mode_64bit
)
14637 /* 32/64 bit address mode */
14647 int addr32flag
= !((sizeflag
& AFLAG
)
14648 || bytemode
== v_bnd_mode
14649 || bytemode
== v_bndmk_mode
14650 || bytemode
== bnd_mode
14651 || bytemode
== bnd_swap_mode
);
14652 const char **indexes64
= names64
;
14653 const char **indexes32
= names32
;
14663 vindex
= sib
.index
;
14669 case vex_vsib_d_w_dq_mode
:
14670 case vex_vsib_d_w_d_mode
:
14671 case vex_vsib_q_w_dq_mode
:
14672 case vex_vsib_q_w_d_mode
:
14682 switch (vex
.length
)
14685 indexes64
= indexes32
= names_xmm
;
14689 || bytemode
== vex_vsib_q_w_dq_mode
14690 || bytemode
== vex_vsib_q_w_d_mode
)
14691 indexes64
= indexes32
= names_ymm
;
14693 indexes64
= indexes32
= names_xmm
;
14697 || bytemode
== vex_vsib_q_w_dq_mode
14698 || bytemode
== vex_vsib_q_w_d_mode
)
14699 indexes64
= indexes32
= names_zmm
;
14701 indexes64
= indexes32
= names_ymm
;
14708 haveindex
= vindex
!= 4;
14717 /* mandatory non-vector SIB must have sib */
14718 if (bytemode
== vex_sibmem_mode
)
14724 rbase
= base
+ add
;
14732 if (address_mode
== mode_64bit
&& !havesib
)
14735 if (riprel
&& bytemode
== v_bndmk_mode
)
14743 FETCH_DATA (the_info
, codep
+ 1);
14745 if ((disp
& 0x80) != 0)
14747 if (vex
.evex
&& shift
> 0)
14760 && address_mode
!= mode_16bit
)
14762 if (address_mode
== mode_64bit
)
14764 /* Display eiz instead of addr32. */
14765 needindex
= addr32flag
;
14770 /* In 32-bit mode, we need index register to tell [offset]
14771 from [eiz*1 + offset]. */
14776 havedisp
= (havebase
14778 || (havesib
&& (haveindex
|| scale
!= 0)));
14781 if (modrm
.mod
!= 0 || base
== 5)
14783 if (havedisp
|| riprel
)
14784 print_displacement (scratchbuf
, disp
);
14786 print_operand_value (scratchbuf
, 1, disp
);
14787 oappend (scratchbuf
);
14791 oappend (!addr32flag
? "(%rip)" : "(%eip)");
14795 if ((havebase
|| haveindex
|| needindex
|| needaddr32
|| riprel
)
14796 && (address_mode
!= mode_64bit
14797 || ((bytemode
!= v_bnd_mode
)
14798 && (bytemode
!= v_bndmk_mode
)
14799 && (bytemode
!= bnd_mode
)
14800 && (bytemode
!= bnd_swap_mode
))))
14801 used_prefixes
|= PREFIX_ADDR
;
14803 if (havedisp
|| (intel_syntax
&& riprel
))
14805 *obufp
++ = open_char
;
14806 if (intel_syntax
&& riprel
)
14809 oappend (!addr32flag
? "rip" : "eip");
14813 oappend (address_mode
== mode_64bit
&& !addr32flag
14814 ? names64
[rbase
] : names32
[rbase
]);
14817 /* ESP/RSP won't allow index. If base isn't ESP/RSP,
14818 print index to tell base + index from base. */
14822 || (havebase
&& base
!= ESP_REG_NUM
))
14824 if (!intel_syntax
|| havebase
)
14826 *obufp
++ = separator_char
;
14830 oappend (address_mode
== mode_64bit
&& !addr32flag
14831 ? indexes64
[vindex
] : indexes32
[vindex
]);
14833 oappend (address_mode
== mode_64bit
&& !addr32flag
14834 ? index64
: index32
);
14836 *obufp
++ = scale_char
;
14838 sprintf (scratchbuf
, "%d", 1 << scale
);
14839 oappend (scratchbuf
);
14843 && (disp
|| modrm
.mod
!= 0 || base
== 5))
14845 if (!havedisp
|| (bfd_signed_vma
) disp
>= 0)
14850 else if (modrm
.mod
!= 1 && disp
!= -disp
)
14854 disp
= - (bfd_signed_vma
) disp
;
14858 print_displacement (scratchbuf
, disp
);
14860 print_operand_value (scratchbuf
, 1, disp
);
14861 oappend (scratchbuf
);
14864 *obufp
++ = close_char
;
14867 else if (intel_syntax
)
14869 if (modrm
.mod
!= 0 || base
== 5)
14871 if (!active_seg_prefix
)
14873 oappend (names_seg
[ds_reg
- es_reg
]);
14876 print_operand_value (scratchbuf
, 1, disp
);
14877 oappend (scratchbuf
);
14881 else if (bytemode
== v_bnd_mode
14882 || bytemode
== v_bndmk_mode
14883 || bytemode
== bnd_mode
14884 || bytemode
== bnd_swap_mode
)
14891 /* 16 bit address mode */
14892 used_prefixes
|= prefixes
& PREFIX_ADDR
;
14899 if ((disp
& 0x8000) != 0)
14904 FETCH_DATA (the_info
, codep
+ 1);
14906 if ((disp
& 0x80) != 0)
14908 if (vex
.evex
&& shift
> 0)
14913 if ((disp
& 0x8000) != 0)
14919 if (modrm
.mod
!= 0 || modrm
.rm
== 6)
14921 print_displacement (scratchbuf
, disp
);
14922 oappend (scratchbuf
);
14925 if (modrm
.mod
!= 0 || modrm
.rm
!= 6)
14927 *obufp
++ = open_char
;
14929 oappend (index16
[modrm
.rm
]);
14931 && (disp
|| modrm
.mod
!= 0 || modrm
.rm
== 6))
14933 if ((bfd_signed_vma
) disp
>= 0)
14938 else if (modrm
.mod
!= 1)
14942 disp
= - (bfd_signed_vma
) disp
;
14945 print_displacement (scratchbuf
, disp
);
14946 oappend (scratchbuf
);
14949 *obufp
++ = close_char
;
14952 else if (intel_syntax
)
14954 if (!active_seg_prefix
)
14956 oappend (names_seg
[ds_reg
- es_reg
]);
14959 print_operand_value (scratchbuf
, 1, disp
& 0xffff);
14960 oappend (scratchbuf
);
14963 if (vex
.evex
&& vex
.b
14964 && (bytemode
== x_mode
14965 || bytemode
== xmmq_mode
14966 || bytemode
== evex_half_bcst_xmmq_mode
))
14969 || bytemode
== xmmq_mode
14970 || bytemode
== evex_half_bcst_xmmq_mode
)
14972 switch (vex
.length
)
14975 oappend ("{1to2}");
14978 oappend ("{1to4}");
14981 oappend ("{1to8}");
14989 switch (vex
.length
)
14992 oappend ("{1to4}");
14995 oappend ("{1to8}");
14998 oappend ("{1to16}");
15008 OP_E (int bytemode
, int sizeflag
)
15010 /* Skip mod/rm byte. */
15014 if (modrm
.mod
== 3)
15015 OP_E_register (bytemode
, sizeflag
);
15017 OP_E_memory (bytemode
, sizeflag
);
15021 OP_G (int bytemode
, int sizeflag
)
15024 const char **names
;
15034 oappend (names8rex
[modrm
.reg
+ add
]);
15036 oappend (names8
[modrm
.reg
+ add
]);
15039 oappend (names16
[modrm
.reg
+ add
]);
15044 oappend (names32
[modrm
.reg
+ add
]);
15047 oappend (names64
[modrm
.reg
+ add
]);
15050 if (modrm
.reg
> 0x3)
15055 oappend (names_bnd
[modrm
.reg
]);
15065 oappend (names64
[modrm
.reg
+ add
]);
15068 if ((sizeflag
& DFLAG
)
15069 || (bytemode
!= v_mode
&& bytemode
!= movsxd_mode
))
15070 oappend (names32
[modrm
.reg
+ add
]);
15072 oappend (names16
[modrm
.reg
+ add
]);
15073 used_prefixes
|= (prefixes
& PREFIX_DATA
);
15077 names
= (address_mode
== mode_64bit
15078 ? names64
: names32
);
15079 if (!(prefixes
& PREFIX_ADDR
))
15081 if (address_mode
== mode_16bit
)
15086 /* Remove "addr16/addr32". */
15087 all_prefixes
[last_addr_prefix
] = 0;
15088 names
= (address_mode
!= mode_32bit
15089 ? names32
: names16
);
15090 used_prefixes
|= PREFIX_ADDR
;
15092 oappend (names
[modrm
.reg
+ add
]);
15095 if (address_mode
== mode_64bit
)
15096 oappend (names64
[modrm
.reg
+ add
]);
15098 oappend (names32
[modrm
.reg
+ add
]);
15102 if ((modrm
.reg
+ add
) > 0x7)
15107 oappend (names_mask
[modrm
.reg
+ add
]);
15110 oappend (INTERNAL_DISASSEMBLER_ERROR
);
15123 FETCH_DATA (the_info
, codep
+ 8);
15124 a
= *codep
++ & 0xff;
15125 a
|= (*codep
++ & 0xff) << 8;
15126 a
|= (*codep
++ & 0xff) << 16;
15127 a
|= (*codep
++ & 0xffu
) << 24;
15128 b
= *codep
++ & 0xff;
15129 b
|= (*codep
++ & 0xff) << 8;
15130 b
|= (*codep
++ & 0xff) << 16;
15131 b
|= (*codep
++ & 0xffu
) << 24;
15132 x
= a
+ ((bfd_vma
) b
<< 32);
15140 static bfd_signed_vma
15143 bfd_signed_vma x
= 0;
15145 FETCH_DATA (the_info
, codep
+ 4);
15146 x
= *codep
++ & (bfd_signed_vma
) 0xff;
15147 x
|= (*codep
++ & (bfd_signed_vma
) 0xff) << 8;
15148 x
|= (*codep
++ & (bfd_signed_vma
) 0xff) << 16;
15149 x
|= (*codep
++ & (bfd_signed_vma
) 0xff) << 24;
15153 static bfd_signed_vma
15156 bfd_signed_vma x
= 0;
15158 FETCH_DATA (the_info
, codep
+ 4);
15159 x
= *codep
++ & (bfd_signed_vma
) 0xff;
15160 x
|= (*codep
++ & (bfd_signed_vma
) 0xff) << 8;
15161 x
|= (*codep
++ & (bfd_signed_vma
) 0xff) << 16;
15162 x
|= (*codep
++ & (bfd_signed_vma
) 0xff) << 24;
15164 x
= (x
^ ((bfd_signed_vma
) 1 << 31)) - ((bfd_signed_vma
) 1 << 31);
15174 FETCH_DATA (the_info
, codep
+ 2);
15175 x
= *codep
++ & 0xff;
15176 x
|= (*codep
++ & 0xff) << 8;
15181 set_op (bfd_vma op
, int riprel
)
15183 op_index
[op_ad
] = op_ad
;
15184 if (address_mode
== mode_64bit
)
15186 op_address
[op_ad
] = op
;
15187 op_riprel
[op_ad
] = riprel
;
15191 /* Mask to get a 32-bit address. */
15192 op_address
[op_ad
] = op
& 0xffffffff;
15193 op_riprel
[op_ad
] = riprel
& 0xffffffff;
15198 OP_REG (int code
, int sizeflag
)
15205 case es_reg
: case ss_reg
: case cs_reg
:
15206 case ds_reg
: case fs_reg
: case gs_reg
:
15207 oappend (names_seg
[code
- es_reg
]);
15219 case ax_reg
: case cx_reg
: case dx_reg
: case bx_reg
:
15220 case sp_reg
: case bp_reg
: case si_reg
: case di_reg
:
15221 s
= names16
[code
- ax_reg
+ add
];
15223 case ah_reg
: case ch_reg
: case dh_reg
: case bh_reg
:
15225 /* Fall through. */
15226 case al_reg
: case cl_reg
: case dl_reg
: case bl_reg
:
15228 s
= names8rex
[code
- al_reg
+ add
];
15230 s
= names8
[code
- al_reg
];
15232 case rAX_reg
: case rCX_reg
: case rDX_reg
: case rBX_reg
:
15233 case rSP_reg
: case rBP_reg
: case rSI_reg
: case rDI_reg
:
15234 if (address_mode
== mode_64bit
15235 && ((sizeflag
& DFLAG
) || (rex
& REX_W
)))
15237 s
= names64
[code
- rAX_reg
+ add
];
15240 code
+= eAX_reg
- rAX_reg
;
15241 /* Fall through. */
15242 case eAX_reg
: case eCX_reg
: case eDX_reg
: case eBX_reg
:
15243 case eSP_reg
: case eBP_reg
: case eSI_reg
: case eDI_reg
:
15246 s
= names64
[code
- eAX_reg
+ add
];
15249 if (sizeflag
& DFLAG
)
15250 s
= names32
[code
- eAX_reg
+ add
];
15252 s
= names16
[code
- eAX_reg
+ add
];
15253 used_prefixes
|= (prefixes
& PREFIX_DATA
);
15257 s
= INTERNAL_DISASSEMBLER_ERROR
;
15264 OP_IMREG (int code
, int sizeflag
)
15276 case al_reg
: case cl_reg
:
15277 s
= names8
[code
- al_reg
];
15286 /* Fall through. */
15287 case z_mode_ax_reg
:
15288 if ((rex
& REX_W
) || (sizeflag
& DFLAG
))
15292 if (!(rex
& REX_W
))
15293 used_prefixes
|= (prefixes
& PREFIX_DATA
);
15296 s
= INTERNAL_DISASSEMBLER_ERROR
;
15303 OP_I (int bytemode
, int sizeflag
)
15306 bfd_signed_vma mask
= -1;
15311 FETCH_DATA (the_info
, codep
+ 1);
15321 if (sizeflag
& DFLAG
)
15331 used_prefixes
|= (prefixes
& PREFIX_DATA
);
15347 oappend (INTERNAL_DISASSEMBLER_ERROR
);
15352 scratchbuf
[0] = '$';
15353 print_operand_value (scratchbuf
+ 1, 1, op
);
15354 oappend_maybe_intel (scratchbuf
);
15355 scratchbuf
[0] = '\0';
15359 OP_I64 (int bytemode
, int sizeflag
)
15361 if (bytemode
!= v_mode
|| address_mode
!= mode_64bit
|| !(rex
& REX_W
))
15363 OP_I (bytemode
, sizeflag
);
15369 scratchbuf
[0] = '$';
15370 print_operand_value (scratchbuf
+ 1, 1, get64 ());
15371 oappend_maybe_intel (scratchbuf
);
15372 scratchbuf
[0] = '\0';
15376 OP_sI (int bytemode
, int sizeflag
)
15384 FETCH_DATA (the_info
, codep
+ 1);
15386 if ((op
& 0x80) != 0)
15388 if (bytemode
== b_T_mode
)
15390 if (address_mode
!= mode_64bit
15391 || !((sizeflag
& DFLAG
) || (rex
& REX_W
)))
15393 /* The operand-size prefix is overridden by a REX prefix. */
15394 if ((sizeflag
& DFLAG
) || (rex
& REX_W
))
15402 if (!(rex
& REX_W
))
15404 if (sizeflag
& DFLAG
)
15412 /* The operand-size prefix is overridden by a REX prefix. */
15413 if ((sizeflag
& DFLAG
) || (rex
& REX_W
))
15419 oappend (INTERNAL_DISASSEMBLER_ERROR
);
15423 scratchbuf
[0] = '$';
15424 print_operand_value (scratchbuf
+ 1, 1, op
);
15425 oappend_maybe_intel (scratchbuf
);
15429 OP_J (int bytemode
, int sizeflag
)
15433 bfd_vma segment
= 0;
15438 FETCH_DATA (the_info
, codep
+ 1);
15440 if ((disp
& 0x80) != 0)
15444 if (isa64
!= intel64
)
15447 if ((sizeflag
& DFLAG
)
15448 || (address_mode
== mode_64bit
15449 && ((isa64
== intel64
&& bytemode
!= dqw_mode
)
15450 || (rex
& REX_W
))))
15455 if ((disp
& 0x8000) != 0)
15457 /* In 16bit mode, address is wrapped around at 64k within
15458 the same segment. Otherwise, a data16 prefix on a jump
15459 instruction means that the pc is masked to 16 bits after
15460 the displacement is added! */
15462 if ((prefixes
& PREFIX_DATA
) == 0)
15463 segment
= ((start_pc
+ (codep
- start_codep
))
15464 & ~((bfd_vma
) 0xffff));
15466 if (address_mode
!= mode_64bit
15467 || (isa64
!= intel64
&& !(rex
& REX_W
)))
15468 used_prefixes
|= (prefixes
& PREFIX_DATA
);
15471 oappend (INTERNAL_DISASSEMBLER_ERROR
);
15474 disp
= ((start_pc
+ (codep
- start_codep
) + disp
) & mask
) | segment
;
15476 print_operand_value (scratchbuf
, 1, disp
);
15477 oappend (scratchbuf
);
15481 OP_SEG (int bytemode
, int sizeflag
)
15483 if (bytemode
== w_mode
)
15484 oappend (names_seg
[modrm
.reg
]);
15486 OP_E (modrm
.mod
== 3 ? bytemode
: w_mode
, sizeflag
);
15490 OP_DIR (int dummy ATTRIBUTE_UNUSED
, int sizeflag
)
15494 if (sizeflag
& DFLAG
)
15504 used_prefixes
|= (prefixes
& PREFIX_DATA
);
15506 sprintf (scratchbuf
, "0x%x:0x%x", seg
, offset
);
15508 sprintf (scratchbuf
, "$0x%x,$0x%x", seg
, offset
);
15509 oappend (scratchbuf
);
15513 OP_OFF (int bytemode
, int sizeflag
)
15517 if (intel_syntax
&& (sizeflag
& SUFFIX_ALWAYS
))
15518 intel_operand_size (bytemode
, sizeflag
);
15521 if ((sizeflag
& AFLAG
) || address_mode
== mode_64bit
)
15528 if (!active_seg_prefix
)
15530 oappend (names_seg
[ds_reg
- es_reg
]);
15534 print_operand_value (scratchbuf
, 1, off
);
15535 oappend (scratchbuf
);
15539 OP_OFF64 (int bytemode
, int sizeflag
)
15543 if (address_mode
!= mode_64bit
15544 || (prefixes
& PREFIX_ADDR
))
15546 OP_OFF (bytemode
, sizeflag
);
15550 if (intel_syntax
&& (sizeflag
& SUFFIX_ALWAYS
))
15551 intel_operand_size (bytemode
, sizeflag
);
15558 if (!active_seg_prefix
)
15560 oappend (names_seg
[ds_reg
- es_reg
]);
15564 print_operand_value (scratchbuf
, 1, off
);
15565 oappend (scratchbuf
);
15569 ptr_reg (int code
, int sizeflag
)
15573 *obufp
++ = open_char
;
15574 used_prefixes
|= (prefixes
& PREFIX_ADDR
);
15575 if (address_mode
== mode_64bit
)
15577 if (!(sizeflag
& AFLAG
))
15578 s
= names32
[code
- eAX_reg
];
15580 s
= names64
[code
- eAX_reg
];
15582 else if (sizeflag
& AFLAG
)
15583 s
= names32
[code
- eAX_reg
];
15585 s
= names16
[code
- eAX_reg
];
15587 *obufp
++ = close_char
;
15592 OP_ESreg (int code
, int sizeflag
)
15598 case 0x6d: /* insw/insl */
15599 intel_operand_size (z_mode
, sizeflag
);
15601 case 0xa5: /* movsw/movsl/movsq */
15602 case 0xa7: /* cmpsw/cmpsl/cmpsq */
15603 case 0xab: /* stosw/stosl */
15604 case 0xaf: /* scasw/scasl */
15605 intel_operand_size (v_mode
, sizeflag
);
15608 intel_operand_size (b_mode
, sizeflag
);
15611 oappend_maybe_intel ("%es:");
15612 ptr_reg (code
, sizeflag
);
15616 OP_DSreg (int code
, int sizeflag
)
15622 case 0x6f: /* outsw/outsl */
15623 intel_operand_size (z_mode
, sizeflag
);
15625 case 0xa5: /* movsw/movsl/movsq */
15626 case 0xa7: /* cmpsw/cmpsl/cmpsq */
15627 case 0xad: /* lodsw/lodsl/lodsq */
15628 intel_operand_size (v_mode
, sizeflag
);
15631 intel_operand_size (b_mode
, sizeflag
);
15634 /* Set active_seg_prefix to PREFIX_DS if it is unset so that the
15635 default segment register DS is printed. */
15636 if (!active_seg_prefix
)
15637 active_seg_prefix
= PREFIX_DS
;
15639 ptr_reg (code
, sizeflag
);
15643 OP_C (int dummy ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
15651 else if (address_mode
!= mode_64bit
&& (prefixes
& PREFIX_LOCK
))
15653 all_prefixes
[last_lock_prefix
] = 0;
15654 used_prefixes
|= PREFIX_LOCK
;
15659 sprintf (scratchbuf
, "%%cr%d", modrm
.reg
+ add
);
15660 oappend_maybe_intel (scratchbuf
);
15664 OP_D (int dummy ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
15673 sprintf (scratchbuf
, "db%d", modrm
.reg
+ add
);
15675 sprintf (scratchbuf
, "%%db%d", modrm
.reg
+ add
);
15676 oappend (scratchbuf
);
15680 OP_T (int dummy ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
15682 sprintf (scratchbuf
, "%%tr%d", modrm
.reg
);
15683 oappend_maybe_intel (scratchbuf
);
15687 OP_R (int bytemode
, int sizeflag
)
15689 /* Skip mod/rm byte. */
15692 OP_E_register (bytemode
, sizeflag
);
15696 OP_MMX (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
15698 int reg
= modrm
.reg
;
15699 const char **names
;
15701 used_prefixes
|= (prefixes
& PREFIX_DATA
);
15702 if (prefixes
& PREFIX_DATA
)
15711 oappend (names
[reg
]);
15715 OP_XMM (int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
15717 int reg
= modrm
.reg
;
15718 const char **names
;
15730 && bytemode
!= xmm_mode
15731 && bytemode
!= xmmq_mode
15732 && bytemode
!= evex_half_bcst_xmmq_mode
15733 && bytemode
!= ymm_mode
15734 && bytemode
!= tmm_mode
15735 && bytemode
!= scalar_mode
)
15737 switch (vex
.length
)
15744 || (bytemode
!= vex_vsib_q_w_dq_mode
15745 && bytemode
!= vex_vsib_q_w_d_mode
))
15757 else if (bytemode
== xmmq_mode
15758 || bytemode
== evex_half_bcst_xmmq_mode
)
15760 switch (vex
.length
)
15773 else if (bytemode
== tmm_mode
)
15783 else if (bytemode
== ymm_mode
)
15787 oappend (names
[reg
]);
15791 OP_EM (int bytemode
, int sizeflag
)
15794 const char **names
;
15796 if (modrm
.mod
!= 3)
15799 && (bytemode
== v_mode
|| bytemode
== v_swap_mode
))
15801 bytemode
= (prefixes
& PREFIX_DATA
) ? x_mode
: q_mode
;
15802 used_prefixes
|= (prefixes
& PREFIX_DATA
);
15804 OP_E (bytemode
, sizeflag
);
15808 if ((sizeflag
& SUFFIX_ALWAYS
) && bytemode
== v_swap_mode
)
15811 /* Skip mod/rm byte. */
15814 used_prefixes
|= (prefixes
& PREFIX_DATA
);
15816 if (prefixes
& PREFIX_DATA
)
15825 oappend (names
[reg
]);
15828 /* cvt* are the only instructions in sse2 which have
15829 both SSE and MMX operands and also have 0x66 prefix
15830 in their opcode. 0x66 was originally used to differentiate
15831 between SSE and MMX instruction(operands). So we have to handle the
15832 cvt* separately using OP_EMC and OP_MXC */
15834 OP_EMC (int bytemode
, int sizeflag
)
15836 if (modrm
.mod
!= 3)
15838 if (intel_syntax
&& bytemode
== v_mode
)
15840 bytemode
= (prefixes
& PREFIX_DATA
) ? x_mode
: q_mode
;
15841 used_prefixes
|= (prefixes
& PREFIX_DATA
);
15843 OP_E (bytemode
, sizeflag
);
15847 /* Skip mod/rm byte. */
15850 used_prefixes
|= (prefixes
& PREFIX_DATA
);
15851 oappend (names_mm
[modrm
.rm
]);
15855 OP_MXC (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
15857 used_prefixes
|= (prefixes
& PREFIX_DATA
);
15858 oappend (names_mm
[modrm
.reg
]);
15862 OP_EX (int bytemode
, int sizeflag
)
15865 const char **names
;
15867 /* Skip mod/rm byte. */
15871 if (modrm
.mod
!= 3)
15873 OP_E_memory (bytemode
, sizeflag
);
15888 if ((sizeflag
& SUFFIX_ALWAYS
)
15889 && (bytemode
== x_swap_mode
15890 || bytemode
== d_swap_mode
15891 || bytemode
== d_scalar_swap_mode
15892 || bytemode
== q_swap_mode
15893 || bytemode
== q_scalar_swap_mode
))
15897 && bytemode
!= xmm_mode
15898 && bytemode
!= xmmdw_mode
15899 && bytemode
!= xmmqd_mode
15900 && bytemode
!= xmm_mb_mode
15901 && bytemode
!= xmm_mw_mode
15902 && bytemode
!= xmm_md_mode
15903 && bytemode
!= xmm_mq_mode
15904 && bytemode
!= xmmq_mode
15905 && bytemode
!= evex_half_bcst_xmmq_mode
15906 && bytemode
!= ymm_mode
15907 && bytemode
!= tmm_mode
15908 && bytemode
!= d_scalar_swap_mode
15909 && bytemode
!= q_scalar_swap_mode
15910 && bytemode
!= vex_scalar_w_dq_mode
)
15912 switch (vex
.length
)
15927 else if (bytemode
== xmmq_mode
15928 || bytemode
== evex_half_bcst_xmmq_mode
)
15930 switch (vex
.length
)
15943 else if (bytemode
== tmm_mode
)
15953 else if (bytemode
== ymm_mode
)
15957 oappend (names
[reg
]);
15961 OP_MS (int bytemode
, int sizeflag
)
15963 if (modrm
.mod
== 3)
15964 OP_EM (bytemode
, sizeflag
);
15970 OP_XS (int bytemode
, int sizeflag
)
15972 if (modrm
.mod
== 3)
15973 OP_EX (bytemode
, sizeflag
);
15979 OP_M (int bytemode
, int sizeflag
)
15981 if (modrm
.mod
== 3)
15982 /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
15985 OP_E (bytemode
, sizeflag
);
15989 OP_0f07 (int bytemode
, int sizeflag
)
15991 if (modrm
.mod
!= 3 || modrm
.rm
!= 0)
15994 OP_E (bytemode
, sizeflag
);
15997 /* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
15998 32bit mode and "xchg %rax,%rax" in 64bit mode. */
16001 NOP_Fixup1 (int bytemode
, int sizeflag
)
16003 if ((prefixes
& PREFIX_DATA
) != 0
16006 && address_mode
== mode_64bit
))
16007 OP_REG (bytemode
, sizeflag
);
16009 strcpy (obuf
, "nop");
16013 NOP_Fixup2 (int bytemode
, int sizeflag
)
16015 if ((prefixes
& PREFIX_DATA
) != 0
16018 && address_mode
== mode_64bit
))
16019 OP_IMREG (bytemode
, sizeflag
);
16022 static const char *const Suffix3DNow
[] = {
16023 /* 00 */ NULL
, NULL
, NULL
, NULL
,
16024 /* 04 */ NULL
, NULL
, NULL
, NULL
,
16025 /* 08 */ NULL
, NULL
, NULL
, NULL
,
16026 /* 0C */ "pi2fw", "pi2fd", NULL
, NULL
,
16027 /* 10 */ NULL
, NULL
, NULL
, NULL
,
16028 /* 14 */ NULL
, NULL
, NULL
, NULL
,
16029 /* 18 */ NULL
, NULL
, NULL
, NULL
,
16030 /* 1C */ "pf2iw", "pf2id", NULL
, NULL
,
16031 /* 20 */ NULL
, NULL
, NULL
, NULL
,
16032 /* 24 */ NULL
, NULL
, NULL
, NULL
,
16033 /* 28 */ NULL
, NULL
, NULL
, NULL
,
16034 /* 2C */ NULL
, NULL
, NULL
, NULL
,
16035 /* 30 */ NULL
, NULL
, NULL
, NULL
,
16036 /* 34 */ NULL
, NULL
, NULL
, NULL
,
16037 /* 38 */ NULL
, NULL
, NULL
, NULL
,
16038 /* 3C */ NULL
, NULL
, NULL
, NULL
,
16039 /* 40 */ NULL
, NULL
, NULL
, NULL
,
16040 /* 44 */ NULL
, NULL
, NULL
, NULL
,
16041 /* 48 */ NULL
, NULL
, NULL
, NULL
,
16042 /* 4C */ NULL
, NULL
, NULL
, NULL
,
16043 /* 50 */ NULL
, NULL
, NULL
, NULL
,
16044 /* 54 */ NULL
, NULL
, NULL
, NULL
,
16045 /* 58 */ NULL
, NULL
, NULL
, NULL
,
16046 /* 5C */ NULL
, NULL
, NULL
, NULL
,
16047 /* 60 */ NULL
, NULL
, NULL
, NULL
,
16048 /* 64 */ NULL
, NULL
, NULL
, NULL
,
16049 /* 68 */ NULL
, NULL
, NULL
, NULL
,
16050 /* 6C */ NULL
, NULL
, NULL
, NULL
,
16051 /* 70 */ NULL
, NULL
, NULL
, NULL
,
16052 /* 74 */ NULL
, NULL
, NULL
, NULL
,
16053 /* 78 */ NULL
, NULL
, NULL
, NULL
,
16054 /* 7C */ NULL
, NULL
, NULL
, NULL
,
16055 /* 80 */ NULL
, NULL
, NULL
, NULL
,
16056 /* 84 */ NULL
, NULL
, NULL
, NULL
,
16057 /* 88 */ NULL
, NULL
, "pfnacc", NULL
,
16058 /* 8C */ NULL
, NULL
, "pfpnacc", NULL
,
16059 /* 90 */ "pfcmpge", NULL
, NULL
, NULL
,
16060 /* 94 */ "pfmin", NULL
, "pfrcp", "pfrsqrt",
16061 /* 98 */ NULL
, NULL
, "pfsub", NULL
,
16062 /* 9C */ NULL
, NULL
, "pfadd", NULL
,
16063 /* A0 */ "pfcmpgt", NULL
, NULL
, NULL
,
16064 /* A4 */ "pfmax", NULL
, "pfrcpit1", "pfrsqit1",
16065 /* A8 */ NULL
, NULL
, "pfsubr", NULL
,
16066 /* AC */ NULL
, NULL
, "pfacc", NULL
,
16067 /* B0 */ "pfcmpeq", NULL
, NULL
, NULL
,
16068 /* B4 */ "pfmul", NULL
, "pfrcpit2", "pmulhrw",
16069 /* B8 */ NULL
, NULL
, NULL
, "pswapd",
16070 /* BC */ NULL
, NULL
, NULL
, "pavgusb",
16071 /* C0 */ NULL
, NULL
, NULL
, NULL
,
16072 /* C4 */ NULL
, NULL
, NULL
, NULL
,
16073 /* C8 */ NULL
, NULL
, NULL
, NULL
,
16074 /* CC */ NULL
, NULL
, NULL
, NULL
,
16075 /* D0 */ NULL
, NULL
, NULL
, NULL
,
16076 /* D4 */ NULL
, NULL
, NULL
, NULL
,
16077 /* D8 */ NULL
, NULL
, NULL
, NULL
,
16078 /* DC */ NULL
, NULL
, NULL
, NULL
,
16079 /* E0 */ NULL
, NULL
, NULL
, NULL
,
16080 /* E4 */ NULL
, NULL
, NULL
, NULL
,
16081 /* E8 */ NULL
, NULL
, NULL
, NULL
,
16082 /* EC */ NULL
, NULL
, NULL
, NULL
,
16083 /* F0 */ NULL
, NULL
, NULL
, NULL
,
16084 /* F4 */ NULL
, NULL
, NULL
, NULL
,
16085 /* F8 */ NULL
, NULL
, NULL
, NULL
,
16086 /* FC */ NULL
, NULL
, NULL
, NULL
,
16090 OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
16092 const char *mnemonic
;
16094 FETCH_DATA (the_info
, codep
+ 1);
16095 /* AMD 3DNow! instructions are specified by an opcode suffix in the
16096 place where an 8-bit immediate would normally go. ie. the last
16097 byte of the instruction. */
16098 obufp
= mnemonicendp
;
16099 mnemonic
= Suffix3DNow
[*codep
++ & 0xff];
16101 oappend (mnemonic
);
16104 /* Since a variable sized modrm/sib chunk is between the start
16105 of the opcode (0x0f0f) and the opcode suffix, we need to do
16106 all the modrm processing first, and don't know until now that
16107 we have a bad opcode. This necessitates some cleaning up. */
16108 op_out
[0][0] = '\0';
16109 op_out
[1][0] = '\0';
16112 mnemonicendp
= obufp
;
16115 static struct op simd_cmp_op
[] =
16117 { STRING_COMMA_LEN ("eq") },
16118 { STRING_COMMA_LEN ("lt") },
16119 { STRING_COMMA_LEN ("le") },
16120 { STRING_COMMA_LEN ("unord") },
16121 { STRING_COMMA_LEN ("neq") },
16122 { STRING_COMMA_LEN ("nlt") },
16123 { STRING_COMMA_LEN ("nle") },
16124 { STRING_COMMA_LEN ("ord") }
16128 CMP_Fixup (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
16130 unsigned int cmp_type
;
16132 FETCH_DATA (the_info
, codep
+ 1);
16133 cmp_type
= *codep
++ & 0xff;
16134 if (cmp_type
< ARRAY_SIZE (simd_cmp_op
))
16137 char *p
= mnemonicendp
- 2;
16141 sprintf (p
, "%s%s", simd_cmp_op
[cmp_type
].name
, suffix
);
16142 mnemonicendp
+= simd_cmp_op
[cmp_type
].len
;
16146 /* We have a reserved extension byte. Output it directly. */
16147 scratchbuf
[0] = '$';
16148 print_operand_value (scratchbuf
+ 1, 1, cmp_type
);
16149 oappend_maybe_intel (scratchbuf
);
16150 scratchbuf
[0] = '\0';
16155 OP_Mwait (int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
16157 /* mwait %eax,%ecx / mwaitx %eax,%ecx,%ebx */
16160 strcpy (op_out
[0], names32
[0]);
16161 strcpy (op_out
[1], names32
[1]);
16162 if (bytemode
== eBX_reg
)
16163 strcpy (op_out
[2], names32
[3]);
16164 two_source_ops
= 1;
16166 /* Skip mod/rm byte. */
16172 OP_Monitor (int bytemode ATTRIBUTE_UNUSED
,
16173 int sizeflag ATTRIBUTE_UNUSED
)
16175 /* monitor %{e,r,}ax,%ecx,%edx" */
16178 const char **names
= (address_mode
== mode_64bit
16179 ? names64
: names32
);
16181 if (prefixes
& PREFIX_ADDR
)
16183 /* Remove "addr16/addr32". */
16184 all_prefixes
[last_addr_prefix
] = 0;
16185 names
= (address_mode
!= mode_32bit
16186 ? names32
: names16
);
16187 used_prefixes
|= PREFIX_ADDR
;
16189 else if (address_mode
== mode_16bit
)
16191 strcpy (op_out
[0], names
[0]);
16192 strcpy (op_out
[1], names32
[1]);
16193 strcpy (op_out
[2], names32
[2]);
16194 two_source_ops
= 1;
16196 /* Skip mod/rm byte. */
16204 /* Throw away prefixes and 1st. opcode byte. */
16205 codep
= insn_codep
+ 1;
16210 REP_Fixup (int bytemode
, int sizeflag
)
16212 /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
16214 if (prefixes
& PREFIX_REPZ
)
16215 all_prefixes
[last_repz_prefix
] = REP_PREFIX
;
16222 OP_IMREG (bytemode
, sizeflag
);
16225 OP_ESreg (bytemode
, sizeflag
);
16228 OP_DSreg (bytemode
, sizeflag
);
16237 SEP_Fixup (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
16239 if ( isa64
!= amd64
)
16244 mnemonicendp
= obufp
;
16248 /* For BND-prefixed instructions 0xF2 prefix should be displayed as
16252 BND_Fixup (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
16254 if (prefixes
& PREFIX_REPNZ
)
16255 all_prefixes
[last_repnz_prefix
] = BND_PREFIX
;
16258 /* For NOTRACK-prefixed instructions, 0x3E prefix should be displayed as
16262 NOTRACK_Fixup (int bytemode ATTRIBUTE_UNUSED
,
16263 int sizeflag ATTRIBUTE_UNUSED
)
16265 if (active_seg_prefix
== PREFIX_DS
16266 && (address_mode
!= mode_64bit
|| last_data_prefix
< 0))
16268 /* NOTRACK prefix is only valid on indirect branch instructions.
16269 NB: DATA prefix is unsupported for Intel64. */
16270 active_seg_prefix
= 0;
16271 all_prefixes
[last_seg_prefix
] = NOTRACK_PREFIX
;
16275 /* Similar to OP_E. But the 0xf2/0xf3 prefixes should be displayed as
16276 "xacquire"/"xrelease" for memory operand if there is a LOCK prefix.
16280 HLE_Fixup1 (int bytemode
, int sizeflag
)
16283 && (prefixes
& PREFIX_LOCK
) != 0)
16285 if (prefixes
& PREFIX_REPZ
)
16286 all_prefixes
[last_repz_prefix
] = XRELEASE_PREFIX
;
16287 if (prefixes
& PREFIX_REPNZ
)
16288 all_prefixes
[last_repnz_prefix
] = XACQUIRE_PREFIX
;
16291 OP_E (bytemode
, sizeflag
);
16294 /* Similar to OP_E. But the 0xf2/0xf3 prefixes should be displayed as
16295 "xacquire"/"xrelease" for memory operand. No check for LOCK prefix.
16299 HLE_Fixup2 (int bytemode
, int sizeflag
)
16301 if (modrm
.mod
!= 3)
16303 if (prefixes
& PREFIX_REPZ
)
16304 all_prefixes
[last_repz_prefix
] = XRELEASE_PREFIX
;
16305 if (prefixes
& PREFIX_REPNZ
)
16306 all_prefixes
[last_repnz_prefix
] = XACQUIRE_PREFIX
;
16309 OP_E (bytemode
, sizeflag
);
16312 /* Similar to OP_E. But the 0xf3 prefixes should be displayed as
16313 "xrelease" for memory operand. No check for LOCK prefix. */
16316 HLE_Fixup3 (int bytemode
, int sizeflag
)
16319 && last_repz_prefix
> last_repnz_prefix
16320 && (prefixes
& PREFIX_REPZ
) != 0)
16321 all_prefixes
[last_repz_prefix
] = XRELEASE_PREFIX
;
16323 OP_E (bytemode
, sizeflag
);
16327 CMPXCHG8B_Fixup (int bytemode
, int sizeflag
)
16332 /* Change cmpxchg8b to cmpxchg16b. */
16333 char *p
= mnemonicendp
- 2;
16334 mnemonicendp
= stpcpy (p
, "16b");
16337 else if ((prefixes
& PREFIX_LOCK
) != 0)
16339 if (prefixes
& PREFIX_REPZ
)
16340 all_prefixes
[last_repz_prefix
] = XRELEASE_PREFIX
;
16341 if (prefixes
& PREFIX_REPNZ
)
16342 all_prefixes
[last_repnz_prefix
] = XACQUIRE_PREFIX
;
16345 OP_M (bytemode
, sizeflag
);
16349 XMM_Fixup (int reg
, int sizeflag ATTRIBUTE_UNUSED
)
16351 const char **names
;
16355 switch (vex
.length
)
16369 oappend (names
[reg
]);
16373 CRC32_Fixup (int bytemode
, int sizeflag
)
16375 /* Add proper suffix to "crc32". */
16376 char *p
= mnemonicendp
;
16395 if (sizeflag
& DFLAG
)
16399 used_prefixes
|= (prefixes
& PREFIX_DATA
);
16403 oappend (INTERNAL_DISASSEMBLER_ERROR
);
16410 if (modrm
.mod
== 3)
16414 /* Skip mod/rm byte. */
16419 add
= (rex
& REX_B
) ? 8 : 0;
16420 if (bytemode
== b_mode
)
16425 oappend (names8rex
[modrm
.rm
+ add
]);
16427 oappend (names8
[modrm
.rm
+ add
]);
16433 oappend (names64
[modrm
.rm
+ add
]);
16434 else if ((prefixes
& PREFIX_DATA
))
16435 oappend (names16
[modrm
.rm
+ add
]);
16437 oappend (names32
[modrm
.rm
+ add
]);
16441 OP_E (bytemode
, sizeflag
);
16445 FXSAVE_Fixup (int bytemode
, int sizeflag
)
16447 /* Add proper suffix to "fxsave" and "fxrstor". */
16451 char *p
= mnemonicendp
;
16457 OP_M (bytemode
, sizeflag
);
16461 PCMPESTR_Fixup (int bytemode
, int sizeflag
)
16463 /* Add proper suffix to "{,v}pcmpestr{i,m}". */
16466 char *p
= mnemonicendp
;
16471 else if (sizeflag
& SUFFIX_ALWAYS
)
16478 OP_EX (bytemode
, sizeflag
);
16481 /* Display the destination register operand for instructions with
16485 OP_VEX (int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
16488 const char **names
;
16496 reg
= vex
.register_specifier
;
16497 vex
.register_specifier
= 0;
16498 if (address_mode
!= mode_64bit
)
16500 else if (vex
.evex
&& !vex
.v
)
16503 if (bytemode
== vex_scalar_mode
)
16505 oappend (names_xmm
[reg
]);
16509 if (bytemode
== tmm_mode
)
16511 /* All 3 TMM registers must be distinct. */
16516 /* This must be the 3rd operand. */
16517 if (obufp
!= op_out
[2])
16519 oappend (names_tmm
[reg
]);
16520 if (reg
== modrm
.reg
|| reg
== modrm
.rm
)
16521 strcpy (obufp
, "/(bad)");
16524 if (modrm
.reg
== modrm
.rm
|| modrm
.reg
== reg
|| modrm
.rm
== reg
)
16527 && (modrm
.reg
== modrm
.rm
|| modrm
.reg
== reg
))
16528 strcat (op_out
[0], "/(bad)");
16530 && (modrm
.rm
== modrm
.reg
|| modrm
.rm
== reg
))
16531 strcat (op_out
[1], "/(bad)");
16537 switch (vex
.length
)
16544 case vex_vsib_q_w_dq_mode
:
16545 case vex_vsib_q_w_d_mode
:
16561 names
= names_mask
;
16575 case vex_vsib_q_w_dq_mode
:
16576 case vex_vsib_q_w_d_mode
:
16577 names
= vex
.w
? names_ymm
: names_xmm
;
16586 names
= names_mask
;
16589 /* See PR binutils/20893 for a reproducer. */
16601 oappend (names
[reg
]);
16605 OP_VexW (int bytemode
, int sizeflag
)
16607 OP_VEX (bytemode
, sizeflag
);
16611 /* Swap 2nd and 3rd operands. */
16612 strcpy (scratchbuf
, op_out
[2]);
16613 strcpy (op_out
[2], op_out
[1]);
16614 strcpy (op_out
[1], scratchbuf
);
16619 OP_REG_VexI4 (int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
16622 const char **names
= names_xmm
;
16624 FETCH_DATA (the_info
, codep
+ 1);
16627 if (bytemode
!= x_mode
&& bytemode
!= scalar_mode
)
16631 if (address_mode
!= mode_64bit
)
16634 if (bytemode
== x_mode
&& vex
.length
== 256)
16637 oappend (names
[reg
]);
16641 /* Swap 3rd and 4th operands. */
16642 strcpy (scratchbuf
, op_out
[3]);
16643 strcpy (op_out
[3], op_out
[2]);
16644 strcpy (op_out
[2], scratchbuf
);
16649 OP_VexI4 (int bytemode ATTRIBUTE_UNUSED
,
16650 int sizeflag ATTRIBUTE_UNUSED
)
16652 scratchbuf
[0] = '$';
16653 print_operand_value (scratchbuf
+ 1, 1, codep
[-1] & 0xf);
16654 oappend_maybe_intel (scratchbuf
);
16658 OP_EX_Vex (int bytemode
, int sizeflag
)
16660 if (modrm
.mod
!= 3)
16662 OP_EX (bytemode
, sizeflag
);
16666 OP_XMM_Vex (int bytemode
, int sizeflag
)
16668 if (modrm
.mod
!= 3)
16670 OP_XMM (bytemode
, sizeflag
);
16673 static struct op vex_cmp_op
[] =
16675 { STRING_COMMA_LEN ("eq") },
16676 { STRING_COMMA_LEN ("lt") },
16677 { STRING_COMMA_LEN ("le") },
16678 { STRING_COMMA_LEN ("unord") },
16679 { STRING_COMMA_LEN ("neq") },
16680 { STRING_COMMA_LEN ("nlt") },
16681 { STRING_COMMA_LEN ("nle") },
16682 { STRING_COMMA_LEN ("ord") },
16683 { STRING_COMMA_LEN ("eq_uq") },
16684 { STRING_COMMA_LEN ("nge") },
16685 { STRING_COMMA_LEN ("ngt") },
16686 { STRING_COMMA_LEN ("false") },
16687 { STRING_COMMA_LEN ("neq_oq") },
16688 { STRING_COMMA_LEN ("ge") },
16689 { STRING_COMMA_LEN ("gt") },
16690 { STRING_COMMA_LEN ("true") },
16691 { STRING_COMMA_LEN ("eq_os") },
16692 { STRING_COMMA_LEN ("lt_oq") },
16693 { STRING_COMMA_LEN ("le_oq") },
16694 { STRING_COMMA_LEN ("unord_s") },
16695 { STRING_COMMA_LEN ("neq_us") },
16696 { STRING_COMMA_LEN ("nlt_uq") },
16697 { STRING_COMMA_LEN ("nle_uq") },
16698 { STRING_COMMA_LEN ("ord_s") },
16699 { STRING_COMMA_LEN ("eq_us") },
16700 { STRING_COMMA_LEN ("nge_uq") },
16701 { STRING_COMMA_LEN ("ngt_uq") },
16702 { STRING_COMMA_LEN ("false_os") },
16703 { STRING_COMMA_LEN ("neq_os") },
16704 { STRING_COMMA_LEN ("ge_oq") },
16705 { STRING_COMMA_LEN ("gt_oq") },
16706 { STRING_COMMA_LEN ("true_us") },
16710 VCMP_Fixup (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
16712 unsigned int cmp_type
;
16714 FETCH_DATA (the_info
, codep
+ 1);
16715 cmp_type
= *codep
++ & 0xff;
16716 if (cmp_type
< ARRAY_SIZE (vex_cmp_op
))
16719 char *p
= mnemonicendp
- 2;
16723 sprintf (p
, "%s%s", vex_cmp_op
[cmp_type
].name
, suffix
);
16724 mnemonicendp
+= vex_cmp_op
[cmp_type
].len
;
16728 /* We have a reserved extension byte. Output it directly. */
16729 scratchbuf
[0] = '$';
16730 print_operand_value (scratchbuf
+ 1, 1, cmp_type
);
16731 oappend_maybe_intel (scratchbuf
);
16732 scratchbuf
[0] = '\0';
16737 VPCMP_Fixup (int bytemode ATTRIBUTE_UNUSED
,
16738 int sizeflag ATTRIBUTE_UNUSED
)
16740 unsigned int cmp_type
;
16745 FETCH_DATA (the_info
, codep
+ 1);
16746 cmp_type
= *codep
++ & 0xff;
16747 /* There are aliases for immediates 0, 1, 2, 4, 5, 6.
16748 If it's the case, print suffix, otherwise - print the immediate. */
16749 if (cmp_type
< ARRAY_SIZE (simd_cmp_op
)
16754 char *p
= mnemonicendp
- 2;
16756 /* vpcmp* can have both one- and two-lettered suffix. */
16770 sprintf (p
, "%s%s", simd_cmp_op
[cmp_type
].name
, suffix
);
16771 mnemonicendp
+= simd_cmp_op
[cmp_type
].len
;
16775 /* We have a reserved extension byte. Output it directly. */
16776 scratchbuf
[0] = '$';
16777 print_operand_value (scratchbuf
+ 1, 1, cmp_type
);
16778 oappend_maybe_intel (scratchbuf
);
16779 scratchbuf
[0] = '\0';
16783 static const struct op xop_cmp_op
[] =
16785 { STRING_COMMA_LEN ("lt") },
16786 { STRING_COMMA_LEN ("le") },
16787 { STRING_COMMA_LEN ("gt") },
16788 { STRING_COMMA_LEN ("ge") },
16789 { STRING_COMMA_LEN ("eq") },
16790 { STRING_COMMA_LEN ("neq") },
16791 { STRING_COMMA_LEN ("false") },
16792 { STRING_COMMA_LEN ("true") }
16796 VPCOM_Fixup (int bytemode ATTRIBUTE_UNUSED
,
16797 int sizeflag ATTRIBUTE_UNUSED
)
16799 unsigned int cmp_type
;
16801 FETCH_DATA (the_info
, codep
+ 1);
16802 cmp_type
= *codep
++ & 0xff;
16803 if (cmp_type
< ARRAY_SIZE (xop_cmp_op
))
16806 char *p
= mnemonicendp
- 2;
16808 /* vpcom* can have both one- and two-lettered suffix. */
16822 sprintf (p
, "%s%s", xop_cmp_op
[cmp_type
].name
, suffix
);
16823 mnemonicendp
+= xop_cmp_op
[cmp_type
].len
;
16827 /* We have a reserved extension byte. Output it directly. */
16828 scratchbuf
[0] = '$';
16829 print_operand_value (scratchbuf
+ 1, 1, cmp_type
);
16830 oappend_maybe_intel (scratchbuf
);
16831 scratchbuf
[0] = '\0';
16835 static const struct op pclmul_op
[] =
16837 { STRING_COMMA_LEN ("lql") },
16838 { STRING_COMMA_LEN ("hql") },
16839 { STRING_COMMA_LEN ("lqh") },
16840 { STRING_COMMA_LEN ("hqh") }
16844 PCLMUL_Fixup (int bytemode ATTRIBUTE_UNUSED
,
16845 int sizeflag ATTRIBUTE_UNUSED
)
16847 unsigned int pclmul_type
;
16849 FETCH_DATA (the_info
, codep
+ 1);
16850 pclmul_type
= *codep
++ & 0xff;
16851 switch (pclmul_type
)
16862 if (pclmul_type
< ARRAY_SIZE (pclmul_op
))
16865 char *p
= mnemonicendp
- 3;
16870 sprintf (p
, "%s%s", pclmul_op
[pclmul_type
].name
, suffix
);
16871 mnemonicendp
+= pclmul_op
[pclmul_type
].len
;
16875 /* We have a reserved extension byte. Output it directly. */
16876 scratchbuf
[0] = '$';
16877 print_operand_value (scratchbuf
+ 1, 1, pclmul_type
);
16878 oappend_maybe_intel (scratchbuf
);
16879 scratchbuf
[0] = '\0';
16884 MOVBE_Fixup (int bytemode
, int sizeflag
)
16886 /* Add proper suffix to "movbe". */
16887 char *p
= mnemonicendp
;
16896 if (sizeflag
& SUFFIX_ALWAYS
)
16902 if (sizeflag
& DFLAG
)
16906 used_prefixes
|= (prefixes
& PREFIX_DATA
);
16911 oappend (INTERNAL_DISASSEMBLER_ERROR
);
16918 OP_M (bytemode
, sizeflag
);
16922 MOVSXD_Fixup (int bytemode
, int sizeflag
)
16924 /* Add proper suffix to "movsxd". */
16925 char *p
= mnemonicendp
;
16950 oappend (INTERNAL_DISASSEMBLER_ERROR
);
16957 OP_E (bytemode
, sizeflag
);
16961 OP_Mask (int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
16964 || (bytemode
!= mask_mode
&& bytemode
!= mask_bd_mode
))
16968 if ((rex
& REX_R
) != 0 || !vex
.r
)
16974 oappend (names_mask
[modrm
.reg
]);
16978 OP_Rounding (int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
16980 if (modrm
.mod
== 3 && vex
.b
)
16983 case evex_rounding_64_mode
:
16984 if (address_mode
!= mode_64bit
)
16989 /* Fall through. */
16990 case evex_rounding_mode
:
16991 oappend (names_rounding
[vex
.ll
]);
16993 case evex_sae_mode
: