1 /* Print i386 instructions for GDB, the GNU debugger.
2 Copyright (C) 1988-2017 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"
43 static int print_insn (bfd_vma
, disassemble_info
*);
44 static void dofloat (int);
45 static void OP_ST (int, int);
46 static void OP_STi (int, int);
47 static int putop (const char *, int);
48 static void oappend (const char *);
49 static void append_seg (void);
50 static void OP_indirE (int, int);
51 static void print_operand_value (char *, int, bfd_vma
);
52 static void OP_E_register (int, int);
53 static void OP_E_memory (int, int);
54 static void print_displacement (char *, bfd_vma
);
55 static void OP_E (int, int);
56 static void OP_G (int, int);
57 static bfd_vma
get64 (void);
58 static bfd_signed_vma
get32 (void);
59 static bfd_signed_vma
get32s (void);
60 static int get16 (void);
61 static void set_op (bfd_vma
, int);
62 static void OP_Skip_MODRM (int, int);
63 static void OP_REG (int, int);
64 static void OP_IMREG (int, int);
65 static void OP_I (int, int);
66 static void OP_I64 (int, int);
67 static void OP_sI (int, int);
68 static void OP_J (int, int);
69 static void OP_SEG (int, int);
70 static void OP_DIR (int, int);
71 static void OP_OFF (int, int);
72 static void OP_OFF64 (int, int);
73 static void ptr_reg (int, int);
74 static void OP_ESreg (int, int);
75 static void OP_DSreg (int, int);
76 static void OP_C (int, int);
77 static void OP_D (int, int);
78 static void OP_T (int, int);
79 static void OP_R (int, int);
80 static void OP_MMX (int, int);
81 static void OP_XMM (int, int);
82 static void OP_EM (int, int);
83 static void OP_EX (int, int);
84 static void OP_EMC (int,int);
85 static void OP_MXC (int,int);
86 static void OP_MS (int, int);
87 static void OP_XS (int, int);
88 static void OP_M (int, int);
89 static void OP_VEX (int, int);
90 static void OP_EX_Vex (int, int);
91 static void OP_EX_VexW (int, int);
92 static void OP_EX_VexImmW (int, int);
93 static void OP_XMM_Vex (int, int);
94 static void OP_XMM_VexW (int, int);
95 static void OP_Rounding (int, int);
96 static void OP_REG_VexI4 (int, int);
97 static void PCLMUL_Fixup (int, int);
98 static void VEXI4_Fixup (int, int);
99 static void VZERO_Fixup (int, int);
100 static void VCMP_Fixup (int, int);
101 static void VPCMP_Fixup (int, int);
102 static void VPCOM_Fixup (int, int);
103 static void OP_0f07 (int, int);
104 static void OP_Monitor (int, int);
105 static void OP_Mwait (int, int);
106 static void OP_Mwaitx (int, int);
107 static void NOP_Fixup1 (int, int);
108 static void NOP_Fixup2 (int, int);
109 static void OP_3DNowSuffix (int, int);
110 static void CMP_Fixup (int, int);
111 static void BadOp (void);
112 static void REP_Fixup (int, int);
113 static void BND_Fixup (int, int);
114 static void NOTRACK_Fixup (int, int);
115 static void HLE_Fixup1 (int, int);
116 static void HLE_Fixup2 (int, int);
117 static void HLE_Fixup3 (int, int);
118 static void CMPXCHG8B_Fixup (int, int);
119 static void XMM_Fixup (int, int);
120 static void CRC32_Fixup (int, int);
121 static void FXSAVE_Fixup (int, int);
122 static void PCMPESTR_Fixup (int, int);
123 static void OP_LWPCB_E (int, int);
124 static void OP_LWP_E (int, int);
125 static void OP_Vex_2src_1 (int, int);
126 static void OP_Vex_2src_2 (int, int);
128 static void MOVBE_Fixup (int, int);
130 static void OP_Mask (int, int);
133 /* Points to first byte not fetched. */
134 bfd_byte
*max_fetched
;
135 bfd_byte the_buffer
[MAX_MNEM_SIZE
];
138 OPCODES_SIGJMP_BUF bailout
;
148 enum address_mode address_mode
;
150 /* Flags for the prefixes for the current instruction. See below. */
153 /* REX prefix the current instruction. See below. */
155 /* Bits of REX we've already used. */
157 /* REX bits in original REX prefix ignored. */
158 static int rex_ignored
;
159 /* Mark parts used in the REX prefix. When we are testing for
160 empty prefix (for 8bit register REX extension), just mask it
161 out. Otherwise test for REX bit is excuse for existence of REX
162 only in case value is nonzero. */
163 #define USED_REX(value) \
168 rex_used |= (value) | REX_OPCODE; \
171 rex_used |= REX_OPCODE; \
174 /* Flags for prefixes which we somehow handled when printing the
175 current instruction. */
176 static int used_prefixes
;
178 /* Flags stored in PREFIXES. */
179 #define PREFIX_REPZ 1
180 #define PREFIX_REPNZ 2
181 #define PREFIX_LOCK 4
183 #define PREFIX_SS 0x10
184 #define PREFIX_DS 0x20
185 #define PREFIX_ES 0x40
186 #define PREFIX_FS 0x80
187 #define PREFIX_GS 0x100
188 #define PREFIX_DATA 0x200
189 #define PREFIX_ADDR 0x400
190 #define PREFIX_FWAIT 0x800
192 /* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
193 to ADDR (exclusive) are valid. Returns 1 for success, longjmps
195 #define FETCH_DATA(info, addr) \
196 ((addr) <= ((struct dis_private *) (info->private_data))->max_fetched \
197 ? 1 : fetch_data ((info), (addr)))
200 fetch_data (struct disassemble_info
*info
, bfd_byte
*addr
)
203 struct dis_private
*priv
= (struct dis_private
*) info
->private_data
;
204 bfd_vma start
= priv
->insn_start
+ (priv
->max_fetched
- priv
->the_buffer
);
206 if (addr
<= priv
->the_buffer
+ MAX_MNEM_SIZE
)
207 status
= (*info
->read_memory_func
) (start
,
209 addr
- priv
->max_fetched
,
215 /* If we did manage to read at least one byte, then
216 print_insn_i386 will do something sensible. Otherwise, print
217 an error. We do that here because this is where we know
219 if (priv
->max_fetched
== priv
->the_buffer
)
220 (*info
->memory_error_func
) (status
, start
, info
);
221 OPCODES_SIGLONGJMP (priv
->bailout
, 1);
224 priv
->max_fetched
= addr
;
228 /* Possible values for prefix requirement. */
229 #define PREFIX_IGNORED_SHIFT 16
230 #define PREFIX_IGNORED_REPZ (PREFIX_REPZ << PREFIX_IGNORED_SHIFT)
231 #define PREFIX_IGNORED_REPNZ (PREFIX_REPNZ << PREFIX_IGNORED_SHIFT)
232 #define PREFIX_IGNORED_DATA (PREFIX_DATA << PREFIX_IGNORED_SHIFT)
233 #define PREFIX_IGNORED_ADDR (PREFIX_ADDR << PREFIX_IGNORED_SHIFT)
234 #define PREFIX_IGNORED_LOCK (PREFIX_LOCK << PREFIX_IGNORED_SHIFT)
236 /* Opcode prefixes. */
237 #define PREFIX_OPCODE (PREFIX_REPZ \
241 /* Prefixes ignored. */
242 #define PREFIX_IGNORED (PREFIX_IGNORED_REPZ \
243 | PREFIX_IGNORED_REPNZ \
244 | PREFIX_IGNORED_DATA)
246 #define XX { NULL, 0 }
247 #define Bad_Opcode NULL, { { NULL, 0 } }, 0
249 #define Eb { OP_E, b_mode }
250 #define Ebnd { OP_E, bnd_mode }
251 #define EbS { OP_E, b_swap_mode }
252 #define Ev { OP_E, v_mode }
253 #define Ev_bnd { OP_E, v_bnd_mode }
254 #define EvS { OP_E, v_swap_mode }
255 #define Ed { OP_E, d_mode }
256 #define Edq { OP_E, dq_mode }
257 #define Edqw { OP_E, dqw_mode }
258 #define Edqb { OP_E, dqb_mode }
259 #define Edb { OP_E, db_mode }
260 #define Edw { OP_E, dw_mode }
261 #define Edqd { OP_E, dqd_mode }
262 #define Eq { OP_E, q_mode }
263 #define indirEv { OP_indirE, indir_v_mode }
264 #define indirEp { OP_indirE, f_mode }
265 #define stackEv { OP_E, stack_v_mode }
266 #define Em { OP_E, m_mode }
267 #define Ew { OP_E, w_mode }
268 #define M { OP_M, 0 } /* lea, lgdt, etc. */
269 #define Ma { OP_M, a_mode }
270 #define Mb { OP_M, b_mode }
271 #define Md { OP_M, d_mode }
272 #define Mo { OP_M, o_mode }
273 #define Mp { OP_M, f_mode } /* 32 or 48 bit memory operand for LDS, LES etc */
274 #define Mq { OP_M, q_mode }
275 #define Mx { OP_M, x_mode }
276 #define Mxmm { OP_M, xmm_mode }
277 #define Gb { OP_G, b_mode }
278 #define Gbnd { OP_G, bnd_mode }
279 #define Gv { OP_G, v_mode }
280 #define Gd { OP_G, d_mode }
281 #define Gdq { OP_G, dq_mode }
282 #define Gm { OP_G, m_mode }
283 #define Gw { OP_G, w_mode }
284 #define Rd { OP_R, d_mode }
285 #define Rdq { OP_R, dq_mode }
286 #define Rm { OP_R, m_mode }
287 #define Ib { OP_I, b_mode }
288 #define sIb { OP_sI, b_mode } /* sign extened byte */
289 #define sIbT { OP_sI, b_T_mode } /* sign extened byte like 'T' */
290 #define Iv { OP_I, v_mode }
291 #define sIv { OP_sI, v_mode }
292 #define Iq { OP_I, q_mode }
293 #define Iv64 { OP_I64, v_mode }
294 #define Iw { OP_I, w_mode }
295 #define I1 { OP_I, const_1_mode }
296 #define Jb { OP_J, b_mode }
297 #define Jv { OP_J, v_mode }
298 #define Cm { OP_C, m_mode }
299 #define Dm { OP_D, m_mode }
300 #define Td { OP_T, d_mode }
301 #define Skip_MODRM { OP_Skip_MODRM, 0 }
303 #define RMeAX { OP_REG, eAX_reg }
304 #define RMeBX { OP_REG, eBX_reg }
305 #define RMeCX { OP_REG, eCX_reg }
306 #define RMeDX { OP_REG, eDX_reg }
307 #define RMeSP { OP_REG, eSP_reg }
308 #define RMeBP { OP_REG, eBP_reg }
309 #define RMeSI { OP_REG, eSI_reg }
310 #define RMeDI { OP_REG, eDI_reg }
311 #define RMrAX { OP_REG, rAX_reg }
312 #define RMrBX { OP_REG, rBX_reg }
313 #define RMrCX { OP_REG, rCX_reg }
314 #define RMrDX { OP_REG, rDX_reg }
315 #define RMrSP { OP_REG, rSP_reg }
316 #define RMrBP { OP_REG, rBP_reg }
317 #define RMrSI { OP_REG, rSI_reg }
318 #define RMrDI { OP_REG, rDI_reg }
319 #define RMAL { OP_REG, al_reg }
320 #define RMCL { OP_REG, cl_reg }
321 #define RMDL { OP_REG, dl_reg }
322 #define RMBL { OP_REG, bl_reg }
323 #define RMAH { OP_REG, ah_reg }
324 #define RMCH { OP_REG, ch_reg }
325 #define RMDH { OP_REG, dh_reg }
326 #define RMBH { OP_REG, bh_reg }
327 #define RMAX { OP_REG, ax_reg }
328 #define RMDX { OP_REG, dx_reg }
330 #define eAX { OP_IMREG, eAX_reg }
331 #define eBX { OP_IMREG, eBX_reg }
332 #define eCX { OP_IMREG, eCX_reg }
333 #define eDX { OP_IMREG, eDX_reg }
334 #define eSP { OP_IMREG, eSP_reg }
335 #define eBP { OP_IMREG, eBP_reg }
336 #define eSI { OP_IMREG, eSI_reg }
337 #define eDI { OP_IMREG, eDI_reg }
338 #define AL { OP_IMREG, al_reg }
339 #define CL { OP_IMREG, cl_reg }
340 #define DL { OP_IMREG, dl_reg }
341 #define BL { OP_IMREG, bl_reg }
342 #define AH { OP_IMREG, ah_reg }
343 #define CH { OP_IMREG, ch_reg }
344 #define DH { OP_IMREG, dh_reg }
345 #define BH { OP_IMREG, bh_reg }
346 #define AX { OP_IMREG, ax_reg }
347 #define DX { OP_IMREG, dx_reg }
348 #define zAX { OP_IMREG, z_mode_ax_reg }
349 #define indirDX { OP_IMREG, indir_dx_reg }
351 #define Sw { OP_SEG, w_mode }
352 #define Sv { OP_SEG, v_mode }
353 #define Ap { OP_DIR, 0 }
354 #define Ob { OP_OFF64, b_mode }
355 #define Ov { OP_OFF64, v_mode }
356 #define Xb { OP_DSreg, eSI_reg }
357 #define Xv { OP_DSreg, eSI_reg }
358 #define Xz { OP_DSreg, eSI_reg }
359 #define Yb { OP_ESreg, eDI_reg }
360 #define Yv { OP_ESreg, eDI_reg }
361 #define DSBX { OP_DSreg, eBX_reg }
363 #define es { OP_REG, es_reg }
364 #define ss { OP_REG, ss_reg }
365 #define cs { OP_REG, cs_reg }
366 #define ds { OP_REG, ds_reg }
367 #define fs { OP_REG, fs_reg }
368 #define gs { OP_REG, gs_reg }
370 #define MX { OP_MMX, 0 }
371 #define XM { OP_XMM, 0 }
372 #define XMScalar { OP_XMM, scalar_mode }
373 #define XMGatherQ { OP_XMM, vex_vsib_q_w_dq_mode }
374 #define XMM { OP_XMM, xmm_mode }
375 #define XMxmmq { OP_XMM, xmmq_mode }
376 #define EM { OP_EM, v_mode }
377 #define EMS { OP_EM, v_swap_mode }
378 #define EMd { OP_EM, d_mode }
379 #define EMx { OP_EM, x_mode }
380 #define EXbScalar { OP_EX, b_scalar_mode }
381 #define EXw { OP_EX, w_mode }
382 #define EXwScalar { OP_EX, w_scalar_mode }
383 #define EXd { OP_EX, d_mode }
384 #define EXdScalar { OP_EX, d_scalar_mode }
385 #define EXdS { OP_EX, d_swap_mode }
386 #define EXdScalarS { OP_EX, d_scalar_swap_mode }
387 #define EXq { OP_EX, q_mode }
388 #define EXqScalar { OP_EX, q_scalar_mode }
389 #define EXqScalarS { OP_EX, q_scalar_swap_mode }
390 #define EXqS { OP_EX, q_swap_mode }
391 #define EXx { OP_EX, x_mode }
392 #define EXxS { OP_EX, x_swap_mode }
393 #define EXxmm { OP_EX, xmm_mode }
394 #define EXymm { OP_EX, ymm_mode }
395 #define EXxmmq { OP_EX, xmmq_mode }
396 #define EXEvexHalfBcstXmmq { OP_EX, evex_half_bcst_xmmq_mode }
397 #define EXxmm_mb { OP_EX, xmm_mb_mode }
398 #define EXxmm_mw { OP_EX, xmm_mw_mode }
399 #define EXxmm_md { OP_EX, xmm_md_mode }
400 #define EXxmm_mq { OP_EX, xmm_mq_mode }
401 #define EXxmm_mdq { OP_EX, xmm_mdq_mode }
402 #define EXxmmdw { OP_EX, xmmdw_mode }
403 #define EXxmmqd { OP_EX, xmmqd_mode }
404 #define EXymmq { OP_EX, ymmq_mode }
405 #define EXVexWdq { OP_EX, vex_w_dq_mode }
406 #define EXVexWdqScalar { OP_EX, vex_scalar_w_dq_mode }
407 #define EXEvexXGscat { OP_EX, evex_x_gscat_mode }
408 #define EXEvexXNoBcst { OP_EX, evex_x_nobcst_mode }
409 #define MS { OP_MS, v_mode }
410 #define XS { OP_XS, v_mode }
411 #define EMCq { OP_EMC, q_mode }
412 #define MXC { OP_MXC, 0 }
413 #define OPSUF { OP_3DNowSuffix, 0 }
414 #define CMP { CMP_Fixup, 0 }
415 #define XMM0 { XMM_Fixup, 0 }
416 #define FXSAVE { FXSAVE_Fixup, 0 }
417 #define Vex_2src_1 { OP_Vex_2src_1, 0 }
418 #define Vex_2src_2 { OP_Vex_2src_2, 0 }
420 #define Vex { OP_VEX, vex_mode }
421 #define VexScalar { OP_VEX, vex_scalar_mode }
422 #define VexGatherQ { OP_VEX, vex_vsib_q_w_dq_mode }
423 #define Vex128 { OP_VEX, vex128_mode }
424 #define Vex256 { OP_VEX, vex256_mode }
425 #define VexGdq { OP_VEX, dq_mode }
426 #define VexI4 { VEXI4_Fixup, 0}
427 #define EXdVex { OP_EX_Vex, d_mode }
428 #define EXdVexS { OP_EX_Vex, d_swap_mode }
429 #define EXdVexScalarS { OP_EX_Vex, d_scalar_swap_mode }
430 #define EXqVex { OP_EX_Vex, q_mode }
431 #define EXqVexS { OP_EX_Vex, q_swap_mode }
432 #define EXqVexScalarS { OP_EX_Vex, q_scalar_swap_mode }
433 #define EXVexW { OP_EX_VexW, x_mode }
434 #define EXdVexW { OP_EX_VexW, d_mode }
435 #define EXqVexW { OP_EX_VexW, q_mode }
436 #define EXVexImmW { OP_EX_VexImmW, x_mode }
437 #define XMVex { OP_XMM_Vex, 0 }
438 #define XMVexScalar { OP_XMM_Vex, scalar_mode }
439 #define XMVexW { OP_XMM_VexW, 0 }
440 #define XMVexI4 { OP_REG_VexI4, x_mode }
441 #define PCLMUL { PCLMUL_Fixup, 0 }
442 #define VZERO { VZERO_Fixup, 0 }
443 #define VCMP { VCMP_Fixup, 0 }
444 #define VPCMP { VPCMP_Fixup, 0 }
445 #define VPCOM { VPCOM_Fixup, 0 }
447 #define EXxEVexR { OP_Rounding, evex_rounding_mode }
448 #define EXxEVexS { OP_Rounding, evex_sae_mode }
450 #define XMask { OP_Mask, mask_mode }
451 #define MaskG { OP_G, mask_mode }
452 #define MaskE { OP_E, mask_mode }
453 #define MaskBDE { OP_E, mask_bd_mode }
454 #define MaskR { OP_R, mask_mode }
455 #define MaskVex { OP_VEX, mask_mode }
457 #define MVexVSIBDWpX { OP_M, vex_vsib_d_w_dq_mode }
458 #define MVexVSIBDQWpX { OP_M, vex_vsib_d_w_d_mode }
459 #define MVexVSIBQWpX { OP_M, vex_vsib_q_w_dq_mode }
460 #define MVexVSIBQDWpX { OP_M, vex_vsib_q_w_d_mode }
462 /* Used handle "rep" prefix for string instructions. */
463 #define Xbr { REP_Fixup, eSI_reg }
464 #define Xvr { REP_Fixup, eSI_reg }
465 #define Ybr { REP_Fixup, eDI_reg }
466 #define Yvr { REP_Fixup, eDI_reg }
467 #define Yzr { REP_Fixup, eDI_reg }
468 #define indirDXr { REP_Fixup, indir_dx_reg }
469 #define ALr { REP_Fixup, al_reg }
470 #define eAXr { REP_Fixup, eAX_reg }
472 /* Used handle HLE prefix for lockable instructions. */
473 #define Ebh1 { HLE_Fixup1, b_mode }
474 #define Evh1 { HLE_Fixup1, v_mode }
475 #define Ebh2 { HLE_Fixup2, b_mode }
476 #define Evh2 { HLE_Fixup2, v_mode }
477 #define Ebh3 { HLE_Fixup3, b_mode }
478 #define Evh3 { HLE_Fixup3, v_mode }
480 #define BND { BND_Fixup, 0 }
481 #define NOTRACK { NOTRACK_Fixup, 0 }
483 #define cond_jump_flag { NULL, cond_jump_mode }
484 #define loop_jcxz_flag { NULL, loop_jcxz_mode }
486 /* bits in sizeflag */
487 #define SUFFIX_ALWAYS 4
495 /* byte operand with operand swapped */
497 /* byte operand, sign extend like 'T' suffix */
499 /* operand size depends on prefixes */
501 /* operand size depends on prefixes with operand swapped */
505 /* double word operand */
507 /* double word operand with operand swapped */
509 /* quad word operand */
511 /* quad word operand with operand swapped */
513 /* ten-byte operand */
515 /* 16-byte XMM, 32-byte YMM or 64-byte ZMM operand. In EVEX with
516 broadcast enabled. */
518 /* Similar to x_mode, but with different EVEX mem shifts. */
520 /* Similar to x_mode, but with disabled broadcast. */
522 /* Similar to x_mode, but with operands swapped and disabled broadcast
525 /* 16-byte XMM operand */
527 /* XMM, XMM or YMM register operand, or quad word, xmmword or ymmword
528 memory operand (depending on vector length). Broadcast isn't
531 /* Same as xmmq_mode, but broadcast is allowed. */
532 evex_half_bcst_xmmq_mode
,
533 /* XMM register or byte memory operand */
535 /* XMM register or word memory operand */
537 /* XMM register or double word memory operand */
539 /* XMM register or quad word memory operand */
541 /* XMM register or double/quad word memory operand, depending on
544 /* 16-byte XMM, word, double word or quad word operand. */
546 /* 16-byte XMM, double word, quad word operand or xmm word operand. */
548 /* 32-byte YMM operand */
550 /* quad word, ymmword or zmmword memory operand. */
552 /* 32-byte YMM or 16-byte word operand */
554 /* d_mode in 32bit, q_mode in 64bit mode. */
556 /* pair of v_mode operands */
561 /* operand size depends on REX prefixes. */
563 /* registers like dq_mode, memory like w_mode. */
566 /* 4- or 6-byte pointer operand */
569 /* v_mode for indirect branch opcodes. */
571 /* v_mode for stack-related opcodes. */
573 /* non-quad operand size depends on prefixes */
575 /* 16-byte operand */
577 /* registers like dq_mode, memory like b_mode. */
579 /* registers like d_mode, memory like b_mode. */
581 /* registers like d_mode, memory like w_mode. */
583 /* registers like dq_mode, memory like d_mode. */
585 /* normal vex mode */
587 /* 128bit vex mode */
589 /* 256bit vex mode */
591 /* operand size depends on the VEX.W bit. */
594 /* Similar to vex_w_dq_mode, with VSIB dword indices. */
595 vex_vsib_d_w_dq_mode
,
596 /* Similar to vex_vsib_d_w_dq_mode, with smaller memory. */
598 /* Similar to vex_w_dq_mode, with VSIB qword indices. */
599 vex_vsib_q_w_dq_mode
,
600 /* Similar to vex_vsib_q_w_dq_mode, with smaller memory. */
603 /* scalar, ignore vector length. */
605 /* like b_mode, ignore vector length. */
607 /* like w_mode, ignore vector length. */
609 /* like d_mode, ignore vector length. */
611 /* like d_swap_mode, ignore vector length. */
613 /* like q_mode, ignore vector length. */
615 /* like q_swap_mode, ignore vector length. */
617 /* like vex_mode, ignore vector length. */
619 /* like vex_w_dq_mode, ignore vector length. */
620 vex_scalar_w_dq_mode
,
622 /* Static rounding. */
624 /* Supress all exceptions. */
627 /* Mask register operand. */
629 /* Mask register operand. */
696 #define FLOAT NULL, { { NULL, FLOATCODE } }, 0
698 #define DIS386(T, I) NULL, { { NULL, (T)}, { NULL, (I) } }, 0
699 #define DIS386_PREFIX(T, I, P) NULL, { { NULL, (T)}, { NULL, (I) } }, P
700 #define REG_TABLE(I) DIS386 (USE_REG_TABLE, (I))
701 #define MOD_TABLE(I) DIS386 (USE_MOD_TABLE, (I))
702 #define RM_TABLE(I) DIS386 (USE_RM_TABLE, (I))
703 #define PREFIX_TABLE(I) DIS386 (USE_PREFIX_TABLE, (I))
704 #define X86_64_TABLE(I) DIS386 (USE_X86_64_TABLE, (I))
705 #define THREE_BYTE_TABLE(I) DIS386 (USE_3BYTE_TABLE, (I))
706 #define THREE_BYTE_TABLE_PREFIX(I, P) DIS386_PREFIX (USE_3BYTE_TABLE, (I), P)
707 #define XOP_8F_TABLE(I) DIS386 (USE_XOP_8F_TABLE, (I))
708 #define VEX_C4_TABLE(I) DIS386 (USE_VEX_C4_TABLE, (I))
709 #define VEX_C5_TABLE(I) DIS386 (USE_VEX_C5_TABLE, (I))
710 #define VEX_LEN_TABLE(I) DIS386 (USE_VEX_LEN_TABLE, (I))
711 #define VEX_W_TABLE(I) DIS386 (USE_VEX_W_TABLE, (I))
712 #define EVEX_TABLE(I) DIS386 (USE_EVEX_TABLE, (I))
834 MOD_VEX_0F12_PREFIX_0
,
836 MOD_VEX_0F16_PREFIX_0
,
839 MOD_VEX_W_0_0F41_P_0_LEN_1
,
840 MOD_VEX_W_1_0F41_P_0_LEN_1
,
841 MOD_VEX_W_0_0F41_P_2_LEN_1
,
842 MOD_VEX_W_1_0F41_P_2_LEN_1
,
843 MOD_VEX_W_0_0F42_P_0_LEN_1
,
844 MOD_VEX_W_1_0F42_P_0_LEN_1
,
845 MOD_VEX_W_0_0F42_P_2_LEN_1
,
846 MOD_VEX_W_1_0F42_P_2_LEN_1
,
847 MOD_VEX_W_0_0F44_P_0_LEN_1
,
848 MOD_VEX_W_1_0F44_P_0_LEN_1
,
849 MOD_VEX_W_0_0F44_P_2_LEN_1
,
850 MOD_VEX_W_1_0F44_P_2_LEN_1
,
851 MOD_VEX_W_0_0F45_P_0_LEN_1
,
852 MOD_VEX_W_1_0F45_P_0_LEN_1
,
853 MOD_VEX_W_0_0F45_P_2_LEN_1
,
854 MOD_VEX_W_1_0F45_P_2_LEN_1
,
855 MOD_VEX_W_0_0F46_P_0_LEN_1
,
856 MOD_VEX_W_1_0F46_P_0_LEN_1
,
857 MOD_VEX_W_0_0F46_P_2_LEN_1
,
858 MOD_VEX_W_1_0F46_P_2_LEN_1
,
859 MOD_VEX_W_0_0F47_P_0_LEN_1
,
860 MOD_VEX_W_1_0F47_P_0_LEN_1
,
861 MOD_VEX_W_0_0F47_P_2_LEN_1
,
862 MOD_VEX_W_1_0F47_P_2_LEN_1
,
863 MOD_VEX_W_0_0F4A_P_0_LEN_1
,
864 MOD_VEX_W_1_0F4A_P_0_LEN_1
,
865 MOD_VEX_W_0_0F4A_P_2_LEN_1
,
866 MOD_VEX_W_1_0F4A_P_2_LEN_1
,
867 MOD_VEX_W_0_0F4B_P_0_LEN_1
,
868 MOD_VEX_W_1_0F4B_P_0_LEN_1
,
869 MOD_VEX_W_0_0F4B_P_2_LEN_1
,
881 MOD_VEX_W_0_0F91_P_0_LEN_0
,
882 MOD_VEX_W_1_0F91_P_0_LEN_0
,
883 MOD_VEX_W_0_0F91_P_2_LEN_0
,
884 MOD_VEX_W_1_0F91_P_2_LEN_0
,
885 MOD_VEX_W_0_0F92_P_0_LEN_0
,
886 MOD_VEX_W_0_0F92_P_2_LEN_0
,
887 MOD_VEX_W_0_0F92_P_3_LEN_0
,
888 MOD_VEX_W_1_0F92_P_3_LEN_0
,
889 MOD_VEX_W_0_0F93_P_0_LEN_0
,
890 MOD_VEX_W_0_0F93_P_2_LEN_0
,
891 MOD_VEX_W_0_0F93_P_3_LEN_0
,
892 MOD_VEX_W_1_0F93_P_3_LEN_0
,
893 MOD_VEX_W_0_0F98_P_0_LEN_0
,
894 MOD_VEX_W_1_0F98_P_0_LEN_0
,
895 MOD_VEX_W_0_0F98_P_2_LEN_0
,
896 MOD_VEX_W_1_0F98_P_2_LEN_0
,
897 MOD_VEX_W_0_0F99_P_0_LEN_0
,
898 MOD_VEX_W_1_0F99_P_0_LEN_0
,
899 MOD_VEX_W_0_0F99_P_2_LEN_0
,
900 MOD_VEX_W_1_0F99_P_2_LEN_0
,
903 MOD_VEX_0FD7_PREFIX_2
,
904 MOD_VEX_0FE7_PREFIX_2
,
905 MOD_VEX_0FF0_PREFIX_3
,
906 MOD_VEX_0F381A_PREFIX_2
,
907 MOD_VEX_0F382A_PREFIX_2
,
908 MOD_VEX_0F382C_PREFIX_2
,
909 MOD_VEX_0F382D_PREFIX_2
,
910 MOD_VEX_0F382E_PREFIX_2
,
911 MOD_VEX_0F382F_PREFIX_2
,
912 MOD_VEX_0F385A_PREFIX_2
,
913 MOD_VEX_0F388C_PREFIX_2
,
914 MOD_VEX_0F388E_PREFIX_2
,
915 MOD_VEX_W_0_0F3A30_P_2_LEN_0
,
916 MOD_VEX_W_1_0F3A30_P_2_LEN_0
,
917 MOD_VEX_W_0_0F3A31_P_2_LEN_0
,
918 MOD_VEX_W_1_0F3A31_P_2_LEN_0
,
919 MOD_VEX_W_0_0F3A32_P_2_LEN_0
,
920 MOD_VEX_W_1_0F3A32_P_2_LEN_0
,
921 MOD_VEX_W_0_0F3A33_P_2_LEN_0
,
922 MOD_VEX_W_1_0F3A33_P_2_LEN_0
,
924 MOD_EVEX_0F10_PREFIX_1
,
925 MOD_EVEX_0F10_PREFIX_3
,
926 MOD_EVEX_0F11_PREFIX_1
,
927 MOD_EVEX_0F11_PREFIX_3
,
928 MOD_EVEX_0F12_PREFIX_0
,
929 MOD_EVEX_0F16_PREFIX_0
,
930 MOD_EVEX_0F38C6_REG_1
,
931 MOD_EVEX_0F38C6_REG_2
,
932 MOD_EVEX_0F38C6_REG_5
,
933 MOD_EVEX_0F38C6_REG_6
,
934 MOD_EVEX_0F38C7_REG_1
,
935 MOD_EVEX_0F38C7_REG_2
,
936 MOD_EVEX_0F38C7_REG_5
,
937 MOD_EVEX_0F38C7_REG_6
958 PREFIX_MOD_0_0F01_REG_5
,
959 PREFIX_MOD_3_0F01_REG_5_RM_0
,
960 PREFIX_MOD_3_0F01_REG_5_RM_2
,
1004 PREFIX_MOD_0_0FAE_REG_4
,
1005 PREFIX_MOD_3_0FAE_REG_4
,
1006 PREFIX_MOD_0_0FAE_REG_5
,
1007 PREFIX_MOD_3_0FAE_REG_5
,
1015 PREFIX_MOD_0_0FC7_REG_6
,
1016 PREFIX_MOD_3_0FC7_REG_6
,
1017 PREFIX_MOD_3_0FC7_REG_7
,
1145 PREFIX_VEX_0F71_REG_2
,
1146 PREFIX_VEX_0F71_REG_4
,
1147 PREFIX_VEX_0F71_REG_6
,
1148 PREFIX_VEX_0F72_REG_2
,
1149 PREFIX_VEX_0F72_REG_4
,
1150 PREFIX_VEX_0F72_REG_6
,
1151 PREFIX_VEX_0F73_REG_2
,
1152 PREFIX_VEX_0F73_REG_3
,
1153 PREFIX_VEX_0F73_REG_6
,
1154 PREFIX_VEX_0F73_REG_7
,
1327 PREFIX_VEX_0F38F3_REG_1
,
1328 PREFIX_VEX_0F38F3_REG_2
,
1329 PREFIX_VEX_0F38F3_REG_3
,
1448 PREFIX_EVEX_0F71_REG_2
,
1449 PREFIX_EVEX_0F71_REG_4
,
1450 PREFIX_EVEX_0F71_REG_6
,
1451 PREFIX_EVEX_0F72_REG_0
,
1452 PREFIX_EVEX_0F72_REG_1
,
1453 PREFIX_EVEX_0F72_REG_2
,
1454 PREFIX_EVEX_0F72_REG_4
,
1455 PREFIX_EVEX_0F72_REG_6
,
1456 PREFIX_EVEX_0F73_REG_2
,
1457 PREFIX_EVEX_0F73_REG_3
,
1458 PREFIX_EVEX_0F73_REG_6
,
1459 PREFIX_EVEX_0F73_REG_7
,
1655 PREFIX_EVEX_0F38C6_REG_1
,
1656 PREFIX_EVEX_0F38C6_REG_2
,
1657 PREFIX_EVEX_0F38C6_REG_5
,
1658 PREFIX_EVEX_0F38C6_REG_6
,
1659 PREFIX_EVEX_0F38C7_REG_1
,
1660 PREFIX_EVEX_0F38C7_REG_2
,
1661 PREFIX_EVEX_0F38C7_REG_5
,
1662 PREFIX_EVEX_0F38C7_REG_6
,
1764 THREE_BYTE_0F38
= 0,
1791 VEX_LEN_0F10_P_1
= 0,
1795 VEX_LEN_0F12_P_0_M_0
,
1796 VEX_LEN_0F12_P_0_M_1
,
1799 VEX_LEN_0F16_P_0_M_0
,
1800 VEX_LEN_0F16_P_0_M_1
,
1864 VEX_LEN_0FAE_R_2_M_0
,
1865 VEX_LEN_0FAE_R_3_M_0
,
1874 VEX_LEN_0F381A_P_2_M_0
,
1877 VEX_LEN_0F385A_P_2_M_0
,
1880 VEX_LEN_0F38F3_R_1_P_0
,
1881 VEX_LEN_0F38F3_R_2_P_0
,
1882 VEX_LEN_0F38F3_R_3_P_0
,
1927 VEX_LEN_0FXOP_08_CC
,
1928 VEX_LEN_0FXOP_08_CD
,
1929 VEX_LEN_0FXOP_08_CE
,
1930 VEX_LEN_0FXOP_08_CF
,
1931 VEX_LEN_0FXOP_08_EC
,
1932 VEX_LEN_0FXOP_08_ED
,
1933 VEX_LEN_0FXOP_08_EE
,
1934 VEX_LEN_0FXOP_08_EF
,
1935 VEX_LEN_0FXOP_09_80
,
1969 VEX_W_0F41_P_0_LEN_1
,
1970 VEX_W_0F41_P_2_LEN_1
,
1971 VEX_W_0F42_P_0_LEN_1
,
1972 VEX_W_0F42_P_2_LEN_1
,
1973 VEX_W_0F44_P_0_LEN_0
,
1974 VEX_W_0F44_P_2_LEN_0
,
1975 VEX_W_0F45_P_0_LEN_1
,
1976 VEX_W_0F45_P_2_LEN_1
,
1977 VEX_W_0F46_P_0_LEN_1
,
1978 VEX_W_0F46_P_2_LEN_1
,
1979 VEX_W_0F47_P_0_LEN_1
,
1980 VEX_W_0F47_P_2_LEN_1
,
1981 VEX_W_0F4A_P_0_LEN_1
,
1982 VEX_W_0F4A_P_2_LEN_1
,
1983 VEX_W_0F4B_P_0_LEN_1
,
1984 VEX_W_0F4B_P_2_LEN_1
,
2064 VEX_W_0F90_P_0_LEN_0
,
2065 VEX_W_0F90_P_2_LEN_0
,
2066 VEX_W_0F91_P_0_LEN_0
,
2067 VEX_W_0F91_P_2_LEN_0
,
2068 VEX_W_0F92_P_0_LEN_0
,
2069 VEX_W_0F92_P_2_LEN_0
,
2070 VEX_W_0F92_P_3_LEN_0
,
2071 VEX_W_0F93_P_0_LEN_0
,
2072 VEX_W_0F93_P_2_LEN_0
,
2073 VEX_W_0F93_P_3_LEN_0
,
2074 VEX_W_0F98_P_0_LEN_0
,
2075 VEX_W_0F98_P_2_LEN_0
,
2076 VEX_W_0F99_P_0_LEN_0
,
2077 VEX_W_0F99_P_2_LEN_0
,
2156 VEX_W_0F381A_P_2_M_0
,
2168 VEX_W_0F382A_P_2_M_0
,
2170 VEX_W_0F382C_P_2_M_0
,
2171 VEX_W_0F382D_P_2_M_0
,
2172 VEX_W_0F382E_P_2_M_0
,
2173 VEX_W_0F382F_P_2_M_0
,
2195 VEX_W_0F385A_P_2_M_0
,
2220 VEX_W_0F3A30_P_2_LEN_0
,
2221 VEX_W_0F3A31_P_2_LEN_0
,
2222 VEX_W_0F3A32_P_2_LEN_0
,
2223 VEX_W_0F3A33_P_2_LEN_0
,
2242 EVEX_W_0F10_P_1_M_0
,
2243 EVEX_W_0F10_P_1_M_1
,
2245 EVEX_W_0F10_P_3_M_0
,
2246 EVEX_W_0F10_P_3_M_1
,
2248 EVEX_W_0F11_P_1_M_0
,
2249 EVEX_W_0F11_P_1_M_1
,
2251 EVEX_W_0F11_P_3_M_0
,
2252 EVEX_W_0F11_P_3_M_1
,
2253 EVEX_W_0F12_P_0_M_0
,
2254 EVEX_W_0F12_P_0_M_1
,
2264 EVEX_W_0F16_P_0_M_0
,
2265 EVEX_W_0F16_P_0_M_1
,
2336 EVEX_W_0F72_R_2_P_2
,
2337 EVEX_W_0F72_R_6_P_2
,
2338 EVEX_W_0F73_R_2_P_2
,
2339 EVEX_W_0F73_R_6_P_2
,
2447 EVEX_W_0F38C7_R_1_P_2
,
2448 EVEX_W_0F38C7_R_2_P_2
,
2449 EVEX_W_0F38C7_R_5_P_2
,
2450 EVEX_W_0F38C7_R_6_P_2
,
2491 typedef void (*op_rtn
) (int bytemode
, int sizeflag
);
2500 unsigned int prefix_requirement
;
2503 /* Upper case letters in the instruction names here are macros.
2504 'A' => print 'b' if no register operands or suffix_always is true
2505 'B' => print 'b' if suffix_always is true
2506 'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
2508 'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
2509 suffix_always is true
2510 'E' => print 'e' if 32-bit form of jcxz
2511 'F' => print 'w' or 'l' depending on address size prefix (loop insns)
2512 'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
2513 'H' => print ",pt" or ",pn" branch hint
2514 'I' => honor following macro letter even in Intel mode (implemented only
2515 for some of the macro letters)
2517 'K' => print 'd' or 'q' if rex prefix is present.
2518 'L' => print 'l' if suffix_always is true
2519 'M' => print 'r' if intel_mnemonic is false.
2520 'N' => print 'n' if instruction has no wait "prefix"
2521 'O' => print 'd' or 'o' (or 'q' in Intel mode)
2522 'P' => print 'w', 'l' or 'q' if instruction has an operand size prefix,
2523 or suffix_always is true. print 'q' if rex prefix is present.
2524 'Q' => print 'w', 'l' or 'q' for memory operand or suffix_always
2526 'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
2527 'S' => print 'w', 'l' or 'q' if suffix_always is true
2528 'T' => print 'q' in 64bit mode if instruction has no operand size
2529 prefix and behave as 'P' otherwise
2530 'U' => print 'q' in 64bit mode if instruction has no operand size
2531 prefix and behave as 'Q' otherwise
2532 'V' => print 'q' in 64bit mode if instruction has no operand size
2533 prefix and behave as 'S' otherwise
2534 'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
2535 'X' => print 's', 'd' depending on data16 prefix (for XMM)
2536 'Y' => 'q' if instruction has an REX 64bit overwrite prefix and
2537 suffix_always is true.
2538 'Z' => print 'q' in 64bit mode and behave as 'L' otherwise
2539 '!' => change condition from true to false or from false to true.
2540 '%' => add 1 upper case letter to the macro.
2541 '^' => print 'w' or 'l' depending on operand size prefix or
2542 suffix_always is true (lcall/ljmp).
2543 '@' => print 'q' for Intel64 ISA, 'w' or 'q' for AMD64 ISA depending
2544 on operand size prefix.
2545 '&' => print 'q' in 64bit mode for Intel64 ISA or if instruction
2546 has no operand size prefix for AMD64 ISA, behave as 'P'
2549 2 upper case letter macros:
2550 "XY" => print 'x' or 'y' if suffix_always is true or no register
2551 operands and no broadcast.
2552 "XZ" => print 'x', 'y', or 'z' if suffix_always is true or no
2553 register operands and no broadcast.
2554 "XW" => print 's', 'd' depending on the VEX.W bit (for FMA)
2555 "LQ" => print 'l' ('d' in Intel mode) or 'q' for memory operand
2556 or suffix_always is true
2557 "LB" => print "abs" in 64bit mode and behave as 'B' otherwise
2558 "LS" => print "abs" in 64bit mode and behave as 'S' otherwise
2559 "LV" => print "abs" for 64bit operand and behave as 'S' otherwise
2560 "LW" => print 'd', 'q' depending on the VEX.W bit
2561 "LP" => print 'w' or 'l' ('d' in Intel mode) if instruction has
2562 an operand size prefix, or suffix_always is true. print
2563 'q' if rex prefix is present.
2565 Many of the above letters print nothing in Intel mode. See "putop"
2568 Braces '{' and '}', and vertical bars '|', indicate alternative
2569 mnemonic strings for AT&T and Intel. */
2571 static const struct dis386 dis386
[] = {
2573 { "addB", { Ebh1
, Gb
}, 0 },
2574 { "addS", { Evh1
, Gv
}, 0 },
2575 { "addB", { Gb
, EbS
}, 0 },
2576 { "addS", { Gv
, EvS
}, 0 },
2577 { "addB", { AL
, Ib
}, 0 },
2578 { "addS", { eAX
, Iv
}, 0 },
2579 { X86_64_TABLE (X86_64_06
) },
2580 { X86_64_TABLE (X86_64_07
) },
2582 { "orB", { Ebh1
, Gb
}, 0 },
2583 { "orS", { Evh1
, Gv
}, 0 },
2584 { "orB", { Gb
, EbS
}, 0 },
2585 { "orS", { Gv
, EvS
}, 0 },
2586 { "orB", { AL
, Ib
}, 0 },
2587 { "orS", { eAX
, Iv
}, 0 },
2588 { X86_64_TABLE (X86_64_0D
) },
2589 { Bad_Opcode
}, /* 0x0f extended opcode escape */
2591 { "adcB", { Ebh1
, Gb
}, 0 },
2592 { "adcS", { Evh1
, Gv
}, 0 },
2593 { "adcB", { Gb
, EbS
}, 0 },
2594 { "adcS", { Gv
, EvS
}, 0 },
2595 { "adcB", { AL
, Ib
}, 0 },
2596 { "adcS", { eAX
, Iv
}, 0 },
2597 { X86_64_TABLE (X86_64_16
) },
2598 { X86_64_TABLE (X86_64_17
) },
2600 { "sbbB", { Ebh1
, Gb
}, 0 },
2601 { "sbbS", { Evh1
, Gv
}, 0 },
2602 { "sbbB", { Gb
, EbS
}, 0 },
2603 { "sbbS", { Gv
, EvS
}, 0 },
2604 { "sbbB", { AL
, Ib
}, 0 },
2605 { "sbbS", { eAX
, Iv
}, 0 },
2606 { X86_64_TABLE (X86_64_1E
) },
2607 { X86_64_TABLE (X86_64_1F
) },
2609 { "andB", { Ebh1
, Gb
}, 0 },
2610 { "andS", { Evh1
, Gv
}, 0 },
2611 { "andB", { Gb
, EbS
}, 0 },
2612 { "andS", { Gv
, EvS
}, 0 },
2613 { "andB", { AL
, Ib
}, 0 },
2614 { "andS", { eAX
, Iv
}, 0 },
2615 { Bad_Opcode
}, /* SEG ES prefix */
2616 { X86_64_TABLE (X86_64_27
) },
2618 { "subB", { Ebh1
, Gb
}, 0 },
2619 { "subS", { Evh1
, Gv
}, 0 },
2620 { "subB", { Gb
, EbS
}, 0 },
2621 { "subS", { Gv
, EvS
}, 0 },
2622 { "subB", { AL
, Ib
}, 0 },
2623 { "subS", { eAX
, Iv
}, 0 },
2624 { Bad_Opcode
}, /* SEG CS prefix */
2625 { X86_64_TABLE (X86_64_2F
) },
2627 { "xorB", { Ebh1
, Gb
}, 0 },
2628 { "xorS", { Evh1
, Gv
}, 0 },
2629 { "xorB", { Gb
, EbS
}, 0 },
2630 { "xorS", { Gv
, EvS
}, 0 },
2631 { "xorB", { AL
, Ib
}, 0 },
2632 { "xorS", { eAX
, Iv
}, 0 },
2633 { Bad_Opcode
}, /* SEG SS prefix */
2634 { X86_64_TABLE (X86_64_37
) },
2636 { "cmpB", { Eb
, Gb
}, 0 },
2637 { "cmpS", { Ev
, Gv
}, 0 },
2638 { "cmpB", { Gb
, EbS
}, 0 },
2639 { "cmpS", { Gv
, EvS
}, 0 },
2640 { "cmpB", { AL
, Ib
}, 0 },
2641 { "cmpS", { eAX
, Iv
}, 0 },
2642 { Bad_Opcode
}, /* SEG DS prefix */
2643 { X86_64_TABLE (X86_64_3F
) },
2645 { "inc{S|}", { RMeAX
}, 0 },
2646 { "inc{S|}", { RMeCX
}, 0 },
2647 { "inc{S|}", { RMeDX
}, 0 },
2648 { "inc{S|}", { RMeBX
}, 0 },
2649 { "inc{S|}", { RMeSP
}, 0 },
2650 { "inc{S|}", { RMeBP
}, 0 },
2651 { "inc{S|}", { RMeSI
}, 0 },
2652 { "inc{S|}", { RMeDI
}, 0 },
2654 { "dec{S|}", { RMeAX
}, 0 },
2655 { "dec{S|}", { RMeCX
}, 0 },
2656 { "dec{S|}", { RMeDX
}, 0 },
2657 { "dec{S|}", { RMeBX
}, 0 },
2658 { "dec{S|}", { RMeSP
}, 0 },
2659 { "dec{S|}", { RMeBP
}, 0 },
2660 { "dec{S|}", { RMeSI
}, 0 },
2661 { "dec{S|}", { RMeDI
}, 0 },
2663 { "pushV", { RMrAX
}, 0 },
2664 { "pushV", { RMrCX
}, 0 },
2665 { "pushV", { RMrDX
}, 0 },
2666 { "pushV", { RMrBX
}, 0 },
2667 { "pushV", { RMrSP
}, 0 },
2668 { "pushV", { RMrBP
}, 0 },
2669 { "pushV", { RMrSI
}, 0 },
2670 { "pushV", { RMrDI
}, 0 },
2672 { "popV", { RMrAX
}, 0 },
2673 { "popV", { RMrCX
}, 0 },
2674 { "popV", { RMrDX
}, 0 },
2675 { "popV", { RMrBX
}, 0 },
2676 { "popV", { RMrSP
}, 0 },
2677 { "popV", { RMrBP
}, 0 },
2678 { "popV", { RMrSI
}, 0 },
2679 { "popV", { RMrDI
}, 0 },
2681 { X86_64_TABLE (X86_64_60
) },
2682 { X86_64_TABLE (X86_64_61
) },
2683 { X86_64_TABLE (X86_64_62
) },
2684 { X86_64_TABLE (X86_64_63
) },
2685 { Bad_Opcode
}, /* seg fs */
2686 { Bad_Opcode
}, /* seg gs */
2687 { Bad_Opcode
}, /* op size prefix */
2688 { Bad_Opcode
}, /* adr size prefix */
2690 { "pushT", { sIv
}, 0 },
2691 { "imulS", { Gv
, Ev
, Iv
}, 0 },
2692 { "pushT", { sIbT
}, 0 },
2693 { "imulS", { Gv
, Ev
, sIb
}, 0 },
2694 { "ins{b|}", { Ybr
, indirDX
}, 0 },
2695 { X86_64_TABLE (X86_64_6D
) },
2696 { "outs{b|}", { indirDXr
, Xb
}, 0 },
2697 { X86_64_TABLE (X86_64_6F
) },
2699 { "joH", { Jb
, BND
, cond_jump_flag
}, 0 },
2700 { "jnoH", { Jb
, BND
, cond_jump_flag
}, 0 },
2701 { "jbH", { Jb
, BND
, cond_jump_flag
}, 0 },
2702 { "jaeH", { Jb
, BND
, cond_jump_flag
}, 0 },
2703 { "jeH", { Jb
, BND
, cond_jump_flag
}, 0 },
2704 { "jneH", { Jb
, BND
, cond_jump_flag
}, 0 },
2705 { "jbeH", { Jb
, BND
, cond_jump_flag
}, 0 },
2706 { "jaH", { Jb
, BND
, cond_jump_flag
}, 0 },
2708 { "jsH", { Jb
, BND
, cond_jump_flag
}, 0 },
2709 { "jnsH", { Jb
, BND
, cond_jump_flag
}, 0 },
2710 { "jpH", { Jb
, BND
, cond_jump_flag
}, 0 },
2711 { "jnpH", { Jb
, BND
, cond_jump_flag
}, 0 },
2712 { "jlH", { Jb
, BND
, cond_jump_flag
}, 0 },
2713 { "jgeH", { Jb
, BND
, cond_jump_flag
}, 0 },
2714 { "jleH", { Jb
, BND
, cond_jump_flag
}, 0 },
2715 { "jgH", { Jb
, BND
, cond_jump_flag
}, 0 },
2717 { REG_TABLE (REG_80
) },
2718 { REG_TABLE (REG_81
) },
2719 { X86_64_TABLE (X86_64_82
) },
2720 { REG_TABLE (REG_83
) },
2721 { "testB", { Eb
, Gb
}, 0 },
2722 { "testS", { Ev
, Gv
}, 0 },
2723 { "xchgB", { Ebh2
, Gb
}, 0 },
2724 { "xchgS", { Evh2
, Gv
}, 0 },
2726 { "movB", { Ebh3
, Gb
}, 0 },
2727 { "movS", { Evh3
, Gv
}, 0 },
2728 { "movB", { Gb
, EbS
}, 0 },
2729 { "movS", { Gv
, EvS
}, 0 },
2730 { "movD", { Sv
, Sw
}, 0 },
2731 { MOD_TABLE (MOD_8D
) },
2732 { "movD", { Sw
, Sv
}, 0 },
2733 { REG_TABLE (REG_8F
) },
2735 { PREFIX_TABLE (PREFIX_90
) },
2736 { "xchgS", { RMeCX
, eAX
}, 0 },
2737 { "xchgS", { RMeDX
, eAX
}, 0 },
2738 { "xchgS", { RMeBX
, eAX
}, 0 },
2739 { "xchgS", { RMeSP
, eAX
}, 0 },
2740 { "xchgS", { RMeBP
, eAX
}, 0 },
2741 { "xchgS", { RMeSI
, eAX
}, 0 },
2742 { "xchgS", { RMeDI
, eAX
}, 0 },
2744 { "cW{t|}R", { XX
}, 0 },
2745 { "cR{t|}O", { XX
}, 0 },
2746 { X86_64_TABLE (X86_64_9A
) },
2747 { Bad_Opcode
}, /* fwait */
2748 { "pushfT", { XX
}, 0 },
2749 { "popfT", { XX
}, 0 },
2750 { "sahf", { XX
}, 0 },
2751 { "lahf", { XX
}, 0 },
2753 { "mov%LB", { AL
, Ob
}, 0 },
2754 { "mov%LS", { eAX
, Ov
}, 0 },
2755 { "mov%LB", { Ob
, AL
}, 0 },
2756 { "mov%LS", { Ov
, eAX
}, 0 },
2757 { "movs{b|}", { Ybr
, Xb
}, 0 },
2758 { "movs{R|}", { Yvr
, Xv
}, 0 },
2759 { "cmps{b|}", { Xb
, Yb
}, 0 },
2760 { "cmps{R|}", { Xv
, Yv
}, 0 },
2762 { "testB", { AL
, Ib
}, 0 },
2763 { "testS", { eAX
, Iv
}, 0 },
2764 { "stosB", { Ybr
, AL
}, 0 },
2765 { "stosS", { Yvr
, eAX
}, 0 },
2766 { "lodsB", { ALr
, Xb
}, 0 },
2767 { "lodsS", { eAXr
, Xv
}, 0 },
2768 { "scasB", { AL
, Yb
}, 0 },
2769 { "scasS", { eAX
, Yv
}, 0 },
2771 { "movB", { RMAL
, Ib
}, 0 },
2772 { "movB", { RMCL
, Ib
}, 0 },
2773 { "movB", { RMDL
, Ib
}, 0 },
2774 { "movB", { RMBL
, Ib
}, 0 },
2775 { "movB", { RMAH
, Ib
}, 0 },
2776 { "movB", { RMCH
, Ib
}, 0 },
2777 { "movB", { RMDH
, Ib
}, 0 },
2778 { "movB", { RMBH
, Ib
}, 0 },
2780 { "mov%LV", { RMeAX
, Iv64
}, 0 },
2781 { "mov%LV", { RMeCX
, Iv64
}, 0 },
2782 { "mov%LV", { RMeDX
, Iv64
}, 0 },
2783 { "mov%LV", { RMeBX
, Iv64
}, 0 },
2784 { "mov%LV", { RMeSP
, Iv64
}, 0 },
2785 { "mov%LV", { RMeBP
, Iv64
}, 0 },
2786 { "mov%LV", { RMeSI
, Iv64
}, 0 },
2787 { "mov%LV", { RMeDI
, Iv64
}, 0 },
2789 { REG_TABLE (REG_C0
) },
2790 { REG_TABLE (REG_C1
) },
2791 { "retT", { Iw
, BND
}, 0 },
2792 { "retT", { BND
}, 0 },
2793 { X86_64_TABLE (X86_64_C4
) },
2794 { X86_64_TABLE (X86_64_C5
) },
2795 { REG_TABLE (REG_C6
) },
2796 { REG_TABLE (REG_C7
) },
2798 { "enterT", { Iw
, Ib
}, 0 },
2799 { "leaveT", { XX
}, 0 },
2800 { "Jret{|f}P", { Iw
}, 0 },
2801 { "Jret{|f}P", { XX
}, 0 },
2802 { "int3", { XX
}, 0 },
2803 { "int", { Ib
}, 0 },
2804 { X86_64_TABLE (X86_64_CE
) },
2805 { "iret%LP", { XX
}, 0 },
2807 { REG_TABLE (REG_D0
) },
2808 { REG_TABLE (REG_D1
) },
2809 { REG_TABLE (REG_D2
) },
2810 { REG_TABLE (REG_D3
) },
2811 { X86_64_TABLE (X86_64_D4
) },
2812 { X86_64_TABLE (X86_64_D5
) },
2814 { "xlat", { DSBX
}, 0 },
2825 { "loopneFH", { Jb
, XX
, loop_jcxz_flag
}, 0 },
2826 { "loopeFH", { Jb
, XX
, loop_jcxz_flag
}, 0 },
2827 { "loopFH", { Jb
, XX
, loop_jcxz_flag
}, 0 },
2828 { "jEcxzH", { Jb
, XX
, loop_jcxz_flag
}, 0 },
2829 { "inB", { AL
, Ib
}, 0 },
2830 { "inG", { zAX
, Ib
}, 0 },
2831 { "outB", { Ib
, AL
}, 0 },
2832 { "outG", { Ib
, zAX
}, 0 },
2834 { X86_64_TABLE (X86_64_E8
) },
2835 { X86_64_TABLE (X86_64_E9
) },
2836 { X86_64_TABLE (X86_64_EA
) },
2837 { "jmp", { Jb
, BND
}, 0 },
2838 { "inB", { AL
, indirDX
}, 0 },
2839 { "inG", { zAX
, indirDX
}, 0 },
2840 { "outB", { indirDX
, AL
}, 0 },
2841 { "outG", { indirDX
, zAX
}, 0 },
2843 { Bad_Opcode
}, /* lock prefix */
2844 { "icebp", { XX
}, 0 },
2845 { Bad_Opcode
}, /* repne */
2846 { Bad_Opcode
}, /* repz */
2847 { "hlt", { XX
}, 0 },
2848 { "cmc", { XX
}, 0 },
2849 { REG_TABLE (REG_F6
) },
2850 { REG_TABLE (REG_F7
) },
2852 { "clc", { XX
}, 0 },
2853 { "stc", { XX
}, 0 },
2854 { "cli", { XX
}, 0 },
2855 { "sti", { XX
}, 0 },
2856 { "cld", { XX
}, 0 },
2857 { "std", { XX
}, 0 },
2858 { REG_TABLE (REG_FE
) },
2859 { REG_TABLE (REG_FF
) },
2862 static const struct dis386 dis386_twobyte
[] = {
2864 { REG_TABLE (REG_0F00
) },
2865 { REG_TABLE (REG_0F01
) },
2866 { "larS", { Gv
, Ew
}, 0 },
2867 { "lslS", { Gv
, Ew
}, 0 },
2869 { "syscall", { XX
}, 0 },
2870 { "clts", { XX
}, 0 },
2871 { "sysret%LP", { XX
}, 0 },
2873 { "invd", { XX
}, 0 },
2874 { "wbinvd", { XX
}, 0 },
2876 { "ud2", { XX
}, 0 },
2878 { REG_TABLE (REG_0F0D
) },
2879 { "femms", { XX
}, 0 },
2880 { "", { MX
, EM
, OPSUF
}, 0 }, /* See OP_3DNowSuffix. */
2882 { PREFIX_TABLE (PREFIX_0F10
) },
2883 { PREFIX_TABLE (PREFIX_0F11
) },
2884 { PREFIX_TABLE (PREFIX_0F12
) },
2885 { MOD_TABLE (MOD_0F13
) },
2886 { "unpcklpX", { XM
, EXx
}, PREFIX_OPCODE
},
2887 { "unpckhpX", { XM
, EXx
}, PREFIX_OPCODE
},
2888 { PREFIX_TABLE (PREFIX_0F16
) },
2889 { MOD_TABLE (MOD_0F17
) },
2891 { REG_TABLE (REG_0F18
) },
2892 { "nopQ", { Ev
}, 0 },
2893 { PREFIX_TABLE (PREFIX_0F1A
) },
2894 { PREFIX_TABLE (PREFIX_0F1B
) },
2895 { "nopQ", { Ev
}, 0 },
2896 { "nopQ", { Ev
}, 0 },
2897 { PREFIX_TABLE (PREFIX_0F1E
) },
2898 { "nopQ", { Ev
}, 0 },
2900 { "movZ", { Rm
, Cm
}, 0 },
2901 { "movZ", { Rm
, Dm
}, 0 },
2902 { "movZ", { Cm
, Rm
}, 0 },
2903 { "movZ", { Dm
, Rm
}, 0 },
2904 { MOD_TABLE (MOD_0F24
) },
2906 { MOD_TABLE (MOD_0F26
) },
2909 { "movapX", { XM
, EXx
}, PREFIX_OPCODE
},
2910 { "movapX", { EXxS
, XM
}, PREFIX_OPCODE
},
2911 { PREFIX_TABLE (PREFIX_0F2A
) },
2912 { PREFIX_TABLE (PREFIX_0F2B
) },
2913 { PREFIX_TABLE (PREFIX_0F2C
) },
2914 { PREFIX_TABLE (PREFIX_0F2D
) },
2915 { PREFIX_TABLE (PREFIX_0F2E
) },
2916 { PREFIX_TABLE (PREFIX_0F2F
) },
2918 { "wrmsr", { XX
}, 0 },
2919 { "rdtsc", { XX
}, 0 },
2920 { "rdmsr", { XX
}, 0 },
2921 { "rdpmc", { XX
}, 0 },
2922 { "sysenter", { XX
}, 0 },
2923 { "sysexit", { XX
}, 0 },
2925 { "getsec", { XX
}, 0 },
2927 { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F38
, PREFIX_OPCODE
) },
2929 { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F3A
, PREFIX_OPCODE
) },
2936 { "cmovoS", { Gv
, Ev
}, 0 },
2937 { "cmovnoS", { Gv
, Ev
}, 0 },
2938 { "cmovbS", { Gv
, Ev
}, 0 },
2939 { "cmovaeS", { Gv
, Ev
}, 0 },
2940 { "cmoveS", { Gv
, Ev
}, 0 },
2941 { "cmovneS", { Gv
, Ev
}, 0 },
2942 { "cmovbeS", { Gv
, Ev
}, 0 },
2943 { "cmovaS", { Gv
, Ev
}, 0 },
2945 { "cmovsS", { Gv
, Ev
}, 0 },
2946 { "cmovnsS", { Gv
, Ev
}, 0 },
2947 { "cmovpS", { Gv
, Ev
}, 0 },
2948 { "cmovnpS", { Gv
, Ev
}, 0 },
2949 { "cmovlS", { Gv
, Ev
}, 0 },
2950 { "cmovgeS", { Gv
, Ev
}, 0 },
2951 { "cmovleS", { Gv
, Ev
}, 0 },
2952 { "cmovgS", { Gv
, Ev
}, 0 },
2954 { MOD_TABLE (MOD_0F51
) },
2955 { PREFIX_TABLE (PREFIX_0F51
) },
2956 { PREFIX_TABLE (PREFIX_0F52
) },
2957 { PREFIX_TABLE (PREFIX_0F53
) },
2958 { "andpX", { XM
, EXx
}, PREFIX_OPCODE
},
2959 { "andnpX", { XM
, EXx
}, PREFIX_OPCODE
},
2960 { "orpX", { XM
, EXx
}, PREFIX_OPCODE
},
2961 { "xorpX", { XM
, EXx
}, PREFIX_OPCODE
},
2963 { PREFIX_TABLE (PREFIX_0F58
) },
2964 { PREFIX_TABLE (PREFIX_0F59
) },
2965 { PREFIX_TABLE (PREFIX_0F5A
) },
2966 { PREFIX_TABLE (PREFIX_0F5B
) },
2967 { PREFIX_TABLE (PREFIX_0F5C
) },
2968 { PREFIX_TABLE (PREFIX_0F5D
) },
2969 { PREFIX_TABLE (PREFIX_0F5E
) },
2970 { PREFIX_TABLE (PREFIX_0F5F
) },
2972 { PREFIX_TABLE (PREFIX_0F60
) },
2973 { PREFIX_TABLE (PREFIX_0F61
) },
2974 { PREFIX_TABLE (PREFIX_0F62
) },
2975 { "packsswb", { MX
, EM
}, PREFIX_OPCODE
},
2976 { "pcmpgtb", { MX
, EM
}, PREFIX_OPCODE
},
2977 { "pcmpgtw", { MX
, EM
}, PREFIX_OPCODE
},
2978 { "pcmpgtd", { MX
, EM
}, PREFIX_OPCODE
},
2979 { "packuswb", { MX
, EM
}, PREFIX_OPCODE
},
2981 { "punpckhbw", { MX
, EM
}, PREFIX_OPCODE
},
2982 { "punpckhwd", { MX
, EM
}, PREFIX_OPCODE
},
2983 { "punpckhdq", { MX
, EM
}, PREFIX_OPCODE
},
2984 { "packssdw", { MX
, EM
}, PREFIX_OPCODE
},
2985 { PREFIX_TABLE (PREFIX_0F6C
) },
2986 { PREFIX_TABLE (PREFIX_0F6D
) },
2987 { "movK", { MX
, Edq
}, PREFIX_OPCODE
},
2988 { PREFIX_TABLE (PREFIX_0F6F
) },
2990 { PREFIX_TABLE (PREFIX_0F70
) },
2991 { REG_TABLE (REG_0F71
) },
2992 { REG_TABLE (REG_0F72
) },
2993 { REG_TABLE (REG_0F73
) },
2994 { "pcmpeqb", { MX
, EM
}, PREFIX_OPCODE
},
2995 { "pcmpeqw", { MX
, EM
}, PREFIX_OPCODE
},
2996 { "pcmpeqd", { MX
, EM
}, PREFIX_OPCODE
},
2997 { "emms", { XX
}, PREFIX_OPCODE
},
2999 { PREFIX_TABLE (PREFIX_0F78
) },
3000 { PREFIX_TABLE (PREFIX_0F79
) },
3003 { PREFIX_TABLE (PREFIX_0F7C
) },
3004 { PREFIX_TABLE (PREFIX_0F7D
) },
3005 { PREFIX_TABLE (PREFIX_0F7E
) },
3006 { PREFIX_TABLE (PREFIX_0F7F
) },
3008 { "joH", { Jv
, BND
, cond_jump_flag
}, 0 },
3009 { "jnoH", { Jv
, BND
, cond_jump_flag
}, 0 },
3010 { "jbH", { Jv
, BND
, cond_jump_flag
}, 0 },
3011 { "jaeH", { Jv
, BND
, cond_jump_flag
}, 0 },
3012 { "jeH", { Jv
, BND
, cond_jump_flag
}, 0 },
3013 { "jneH", { Jv
, BND
, cond_jump_flag
}, 0 },
3014 { "jbeH", { Jv
, BND
, cond_jump_flag
}, 0 },
3015 { "jaH", { Jv
, BND
, cond_jump_flag
}, 0 },
3017 { "jsH", { Jv
, BND
, cond_jump_flag
}, 0 },
3018 { "jnsH", { Jv
, BND
, cond_jump_flag
}, 0 },
3019 { "jpH", { Jv
, BND
, cond_jump_flag
}, 0 },
3020 { "jnpH", { Jv
, BND
, cond_jump_flag
}, 0 },
3021 { "jlH", { Jv
, BND
, cond_jump_flag
}, 0 },
3022 { "jgeH", { Jv
, BND
, cond_jump_flag
}, 0 },
3023 { "jleH", { Jv
, BND
, cond_jump_flag
}, 0 },
3024 { "jgH", { Jv
, BND
, cond_jump_flag
}, 0 },
3026 { "seto", { Eb
}, 0 },
3027 { "setno", { Eb
}, 0 },
3028 { "setb", { Eb
}, 0 },
3029 { "setae", { Eb
}, 0 },
3030 { "sete", { Eb
}, 0 },
3031 { "setne", { Eb
}, 0 },
3032 { "setbe", { Eb
}, 0 },
3033 { "seta", { Eb
}, 0 },
3035 { "sets", { Eb
}, 0 },
3036 { "setns", { Eb
}, 0 },
3037 { "setp", { Eb
}, 0 },
3038 { "setnp", { Eb
}, 0 },
3039 { "setl", { Eb
}, 0 },
3040 { "setge", { Eb
}, 0 },
3041 { "setle", { Eb
}, 0 },
3042 { "setg", { Eb
}, 0 },
3044 { "pushT", { fs
}, 0 },
3045 { "popT", { fs
}, 0 },
3046 { "cpuid", { XX
}, 0 },
3047 { "btS", { Ev
, Gv
}, 0 },
3048 { "shldS", { Ev
, Gv
, Ib
}, 0 },
3049 { "shldS", { Ev
, Gv
, CL
}, 0 },
3050 { REG_TABLE (REG_0FA6
) },
3051 { REG_TABLE (REG_0FA7
) },
3053 { "pushT", { gs
}, 0 },
3054 { "popT", { gs
}, 0 },
3055 { "rsm", { XX
}, 0 },
3056 { "btsS", { Evh1
, Gv
}, 0 },
3057 { "shrdS", { Ev
, Gv
, Ib
}, 0 },
3058 { "shrdS", { Ev
, Gv
, CL
}, 0 },
3059 { REG_TABLE (REG_0FAE
) },
3060 { "imulS", { Gv
, Ev
}, 0 },
3062 { "cmpxchgB", { Ebh1
, Gb
}, 0 },
3063 { "cmpxchgS", { Evh1
, Gv
}, 0 },
3064 { MOD_TABLE (MOD_0FB2
) },
3065 { "btrS", { Evh1
, Gv
}, 0 },
3066 { MOD_TABLE (MOD_0FB4
) },
3067 { MOD_TABLE (MOD_0FB5
) },
3068 { "movz{bR|x}", { Gv
, Eb
}, 0 },
3069 { "movz{wR|x}", { Gv
, Ew
}, 0 }, /* yes, there really is movzww ! */
3071 { PREFIX_TABLE (PREFIX_0FB8
) },
3072 { "ud1", { XX
}, 0 },
3073 { REG_TABLE (REG_0FBA
) },
3074 { "btcS", { Evh1
, Gv
}, 0 },
3075 { PREFIX_TABLE (PREFIX_0FBC
) },
3076 { PREFIX_TABLE (PREFIX_0FBD
) },
3077 { "movs{bR|x}", { Gv
, Eb
}, 0 },
3078 { "movs{wR|x}", { Gv
, Ew
}, 0 }, /* yes, there really is movsww ! */
3080 { "xaddB", { Ebh1
, Gb
}, 0 },
3081 { "xaddS", { Evh1
, Gv
}, 0 },
3082 { PREFIX_TABLE (PREFIX_0FC2
) },
3083 { MOD_TABLE (MOD_0FC3
) },
3084 { "pinsrw", { MX
, Edqw
, Ib
}, PREFIX_OPCODE
},
3085 { "pextrw", { Gdq
, MS
, Ib
}, PREFIX_OPCODE
},
3086 { "shufpX", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
3087 { REG_TABLE (REG_0FC7
) },
3089 { "bswap", { RMeAX
}, 0 },
3090 { "bswap", { RMeCX
}, 0 },
3091 { "bswap", { RMeDX
}, 0 },
3092 { "bswap", { RMeBX
}, 0 },
3093 { "bswap", { RMeSP
}, 0 },
3094 { "bswap", { RMeBP
}, 0 },
3095 { "bswap", { RMeSI
}, 0 },
3096 { "bswap", { RMeDI
}, 0 },
3098 { PREFIX_TABLE (PREFIX_0FD0
) },
3099 { "psrlw", { MX
, EM
}, PREFIX_OPCODE
},
3100 { "psrld", { MX
, EM
}, PREFIX_OPCODE
},
3101 { "psrlq", { MX
, EM
}, PREFIX_OPCODE
},
3102 { "paddq", { MX
, EM
}, PREFIX_OPCODE
},
3103 { "pmullw", { MX
, EM
}, PREFIX_OPCODE
},
3104 { PREFIX_TABLE (PREFIX_0FD6
) },
3105 { MOD_TABLE (MOD_0FD7
) },
3107 { "psubusb", { MX
, EM
}, PREFIX_OPCODE
},
3108 { "psubusw", { MX
, EM
}, PREFIX_OPCODE
},
3109 { "pminub", { MX
, EM
}, PREFIX_OPCODE
},
3110 { "pand", { MX
, EM
}, PREFIX_OPCODE
},
3111 { "paddusb", { MX
, EM
}, PREFIX_OPCODE
},
3112 { "paddusw", { MX
, EM
}, PREFIX_OPCODE
},
3113 { "pmaxub", { MX
, EM
}, PREFIX_OPCODE
},
3114 { "pandn", { MX
, EM
}, PREFIX_OPCODE
},
3116 { "pavgb", { MX
, EM
}, PREFIX_OPCODE
},
3117 { "psraw", { MX
, EM
}, PREFIX_OPCODE
},
3118 { "psrad", { MX
, EM
}, PREFIX_OPCODE
},
3119 { "pavgw", { MX
, EM
}, PREFIX_OPCODE
},
3120 { "pmulhuw", { MX
, EM
}, PREFIX_OPCODE
},
3121 { "pmulhw", { MX
, EM
}, PREFIX_OPCODE
},
3122 { PREFIX_TABLE (PREFIX_0FE6
) },
3123 { PREFIX_TABLE (PREFIX_0FE7
) },
3125 { "psubsb", { MX
, EM
}, PREFIX_OPCODE
},
3126 { "psubsw", { MX
, EM
}, PREFIX_OPCODE
},
3127 { "pminsw", { MX
, EM
}, PREFIX_OPCODE
},
3128 { "por", { MX
, EM
}, PREFIX_OPCODE
},
3129 { "paddsb", { MX
, EM
}, PREFIX_OPCODE
},
3130 { "paddsw", { MX
, EM
}, PREFIX_OPCODE
},
3131 { "pmaxsw", { MX
, EM
}, PREFIX_OPCODE
},
3132 { "pxor", { MX
, EM
}, PREFIX_OPCODE
},
3134 { PREFIX_TABLE (PREFIX_0FF0
) },
3135 { "psllw", { MX
, EM
}, PREFIX_OPCODE
},
3136 { "pslld", { MX
, EM
}, PREFIX_OPCODE
},
3137 { "psllq", { MX
, EM
}, PREFIX_OPCODE
},
3138 { "pmuludq", { MX
, EM
}, PREFIX_OPCODE
},
3139 { "pmaddwd", { MX
, EM
}, PREFIX_OPCODE
},
3140 { "psadbw", { MX
, EM
}, PREFIX_OPCODE
},
3141 { PREFIX_TABLE (PREFIX_0FF7
) },
3143 { "psubb", { MX
, EM
}, PREFIX_OPCODE
},
3144 { "psubw", { MX
, EM
}, PREFIX_OPCODE
},
3145 { "psubd", { MX
, EM
}, PREFIX_OPCODE
},
3146 { "psubq", { MX
, EM
}, PREFIX_OPCODE
},
3147 { "paddb", { MX
, EM
}, PREFIX_OPCODE
},
3148 { "paddw", { MX
, EM
}, PREFIX_OPCODE
},
3149 { "paddd", { MX
, EM
}, PREFIX_OPCODE
},
3153 static const unsigned char onebyte_has_modrm
[256] = {
3154 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
3155 /* ------------------------------- */
3156 /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
3157 /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
3158 /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
3159 /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
3160 /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
3161 /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
3162 /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
3163 /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
3164 /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
3165 /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
3166 /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
3167 /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
3168 /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
3169 /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
3170 /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
3171 /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1 /* f0 */
3172 /* ------------------------------- */
3173 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
3176 static const unsigned char twobyte_has_modrm
[256] = {
3177 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
3178 /* ------------------------------- */
3179 /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
3180 /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
3181 /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
3182 /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
3183 /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
3184 /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
3185 /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
3186 /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
3187 /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
3188 /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
3189 /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
3190 /* b0 */ 1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1, /* bf */
3191 /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
3192 /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
3193 /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
3194 /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0 /* ff */
3195 /* ------------------------------- */
3196 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
3199 static char obuf
[100];
3201 static char *mnemonicendp
;
3202 static char scratchbuf
[100];
3203 static unsigned char *start_codep
;
3204 static unsigned char *insn_codep
;
3205 static unsigned char *codep
;
3206 static unsigned char *end_codep
;
3207 static int last_lock_prefix
;
3208 static int last_repz_prefix
;
3209 static int last_repnz_prefix
;
3210 static int last_data_prefix
;
3211 static int last_addr_prefix
;
3212 static int last_rex_prefix
;
3213 static int last_seg_prefix
;
3214 static int fwait_prefix
;
3215 /* The active segment register prefix. */
3216 static int active_seg_prefix
;
3217 #define MAX_CODE_LENGTH 15
3218 /* We can up to 14 prefixes since the maximum instruction length is
3220 static int all_prefixes
[MAX_CODE_LENGTH
- 1];
3221 static disassemble_info
*the_info
;
3229 static unsigned char need_modrm
;
3239 int register_specifier
;
3246 int mask_register_specifier
;
3252 static unsigned char need_vex
;
3253 static unsigned char need_vex_reg
;
3254 static unsigned char vex_w_done
;
3262 /* If we are accessing mod/rm/reg without need_modrm set, then the
3263 values are stale. Hitting this abort likely indicates that you
3264 need to update onebyte_has_modrm or twobyte_has_modrm. */
3265 #define MODRM_CHECK if (!need_modrm) abort ()
3267 static const char **names64
;
3268 static const char **names32
;
3269 static const char **names16
;
3270 static const char **names8
;
3271 static const char **names8rex
;
3272 static const char **names_seg
;
3273 static const char *index64
;
3274 static const char *index32
;
3275 static const char **index16
;
3276 static const char **names_bnd
;
3278 static const char *intel_names64
[] = {
3279 "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
3280 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
3282 static const char *intel_names32
[] = {
3283 "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
3284 "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
3286 static const char *intel_names16
[] = {
3287 "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
3288 "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
3290 static const char *intel_names8
[] = {
3291 "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
3293 static const char *intel_names8rex
[] = {
3294 "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
3295 "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
3297 static const char *intel_names_seg
[] = {
3298 "es", "cs", "ss", "ds", "fs", "gs", "?", "?",
3300 static const char *intel_index64
= "riz";
3301 static const char *intel_index32
= "eiz";
3302 static const char *intel_index16
[] = {
3303 "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
3306 static const char *att_names64
[] = {
3307 "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
3308 "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
3310 static const char *att_names32
[] = {
3311 "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
3312 "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
3314 static const char *att_names16
[] = {
3315 "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
3316 "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
3318 static const char *att_names8
[] = {
3319 "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
3321 static const char *att_names8rex
[] = {
3322 "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
3323 "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
3325 static const char *att_names_seg
[] = {
3326 "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
3328 static const char *att_index64
= "%riz";
3329 static const char *att_index32
= "%eiz";
3330 static const char *att_index16
[] = {
3331 "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
3334 static const char **names_mm
;
3335 static const char *intel_names_mm
[] = {
3336 "mm0", "mm1", "mm2", "mm3",
3337 "mm4", "mm5", "mm6", "mm7"
3339 static const char *att_names_mm
[] = {
3340 "%mm0", "%mm1", "%mm2", "%mm3",
3341 "%mm4", "%mm5", "%mm6", "%mm7"
3344 static const char *intel_names_bnd
[] = {
3345 "bnd0", "bnd1", "bnd2", "bnd3"
3348 static const char *att_names_bnd
[] = {
3349 "%bnd0", "%bnd1", "%bnd2", "%bnd3"
3352 static const char **names_xmm
;
3353 static const char *intel_names_xmm
[] = {
3354 "xmm0", "xmm1", "xmm2", "xmm3",
3355 "xmm4", "xmm5", "xmm6", "xmm7",
3356 "xmm8", "xmm9", "xmm10", "xmm11",
3357 "xmm12", "xmm13", "xmm14", "xmm15",
3358 "xmm16", "xmm17", "xmm18", "xmm19",
3359 "xmm20", "xmm21", "xmm22", "xmm23",
3360 "xmm24", "xmm25", "xmm26", "xmm27",
3361 "xmm28", "xmm29", "xmm30", "xmm31"
3363 static const char *att_names_xmm
[] = {
3364 "%xmm0", "%xmm1", "%xmm2", "%xmm3",
3365 "%xmm4", "%xmm5", "%xmm6", "%xmm7",
3366 "%xmm8", "%xmm9", "%xmm10", "%xmm11",
3367 "%xmm12", "%xmm13", "%xmm14", "%xmm15",
3368 "%xmm16", "%xmm17", "%xmm18", "%xmm19",
3369 "%xmm20", "%xmm21", "%xmm22", "%xmm23",
3370 "%xmm24", "%xmm25", "%xmm26", "%xmm27",
3371 "%xmm28", "%xmm29", "%xmm30", "%xmm31"
3374 static const char **names_ymm
;
3375 static const char *intel_names_ymm
[] = {
3376 "ymm0", "ymm1", "ymm2", "ymm3",
3377 "ymm4", "ymm5", "ymm6", "ymm7",
3378 "ymm8", "ymm9", "ymm10", "ymm11",
3379 "ymm12", "ymm13", "ymm14", "ymm15",
3380 "ymm16", "ymm17", "ymm18", "ymm19",
3381 "ymm20", "ymm21", "ymm22", "ymm23",
3382 "ymm24", "ymm25", "ymm26", "ymm27",
3383 "ymm28", "ymm29", "ymm30", "ymm31"
3385 static const char *att_names_ymm
[] = {
3386 "%ymm0", "%ymm1", "%ymm2", "%ymm3",
3387 "%ymm4", "%ymm5", "%ymm6", "%ymm7",
3388 "%ymm8", "%ymm9", "%ymm10", "%ymm11",
3389 "%ymm12", "%ymm13", "%ymm14", "%ymm15",
3390 "%ymm16", "%ymm17", "%ymm18", "%ymm19",
3391 "%ymm20", "%ymm21", "%ymm22", "%ymm23",
3392 "%ymm24", "%ymm25", "%ymm26", "%ymm27",
3393 "%ymm28", "%ymm29", "%ymm30", "%ymm31"
3396 static const char **names_zmm
;
3397 static const char *intel_names_zmm
[] = {
3398 "zmm0", "zmm1", "zmm2", "zmm3",
3399 "zmm4", "zmm5", "zmm6", "zmm7",
3400 "zmm8", "zmm9", "zmm10", "zmm11",
3401 "zmm12", "zmm13", "zmm14", "zmm15",
3402 "zmm16", "zmm17", "zmm18", "zmm19",
3403 "zmm20", "zmm21", "zmm22", "zmm23",
3404 "zmm24", "zmm25", "zmm26", "zmm27",
3405 "zmm28", "zmm29", "zmm30", "zmm31"
3407 static const char *att_names_zmm
[] = {
3408 "%zmm0", "%zmm1", "%zmm2", "%zmm3",
3409 "%zmm4", "%zmm5", "%zmm6", "%zmm7",
3410 "%zmm8", "%zmm9", "%zmm10", "%zmm11",
3411 "%zmm12", "%zmm13", "%zmm14", "%zmm15",
3412 "%zmm16", "%zmm17", "%zmm18", "%zmm19",
3413 "%zmm20", "%zmm21", "%zmm22", "%zmm23",
3414 "%zmm24", "%zmm25", "%zmm26", "%zmm27",
3415 "%zmm28", "%zmm29", "%zmm30", "%zmm31"
3418 static const char **names_mask
;
3419 static const char *intel_names_mask
[] = {
3420 "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7"
3422 static const char *att_names_mask
[] = {
3423 "%k0", "%k1", "%k2", "%k3", "%k4", "%k5", "%k6", "%k7"
3426 static const char *names_rounding
[] =
3434 static const struct dis386 reg_table
[][8] = {
3437 { "addA", { Ebh1
, Ib
}, 0 },
3438 { "orA", { Ebh1
, Ib
}, 0 },
3439 { "adcA", { Ebh1
, Ib
}, 0 },
3440 { "sbbA", { Ebh1
, Ib
}, 0 },
3441 { "andA", { Ebh1
, Ib
}, 0 },
3442 { "subA", { Ebh1
, Ib
}, 0 },
3443 { "xorA", { Ebh1
, Ib
}, 0 },
3444 { "cmpA", { Eb
, Ib
}, 0 },
3448 { "addQ", { Evh1
, Iv
}, 0 },
3449 { "orQ", { Evh1
, Iv
}, 0 },
3450 { "adcQ", { Evh1
, Iv
}, 0 },
3451 { "sbbQ", { Evh1
, Iv
}, 0 },
3452 { "andQ", { Evh1
, Iv
}, 0 },
3453 { "subQ", { Evh1
, Iv
}, 0 },
3454 { "xorQ", { Evh1
, Iv
}, 0 },
3455 { "cmpQ", { Ev
, Iv
}, 0 },
3459 { "addQ", { Evh1
, sIb
}, 0 },
3460 { "orQ", { Evh1
, sIb
}, 0 },
3461 { "adcQ", { Evh1
, sIb
}, 0 },
3462 { "sbbQ", { Evh1
, sIb
}, 0 },
3463 { "andQ", { Evh1
, sIb
}, 0 },
3464 { "subQ", { Evh1
, sIb
}, 0 },
3465 { "xorQ", { Evh1
, sIb
}, 0 },
3466 { "cmpQ", { Ev
, sIb
}, 0 },
3470 { "popU", { stackEv
}, 0 },
3471 { XOP_8F_TABLE (XOP_09
) },
3475 { XOP_8F_TABLE (XOP_09
) },
3479 { "rolA", { Eb
, Ib
}, 0 },
3480 { "rorA", { Eb
, Ib
}, 0 },
3481 { "rclA", { Eb
, Ib
}, 0 },
3482 { "rcrA", { Eb
, Ib
}, 0 },
3483 { "shlA", { Eb
, Ib
}, 0 },
3484 { "shrA", { Eb
, Ib
}, 0 },
3485 { "shlA", { Eb
, Ib
}, 0 },
3486 { "sarA", { Eb
, Ib
}, 0 },
3490 { "rolQ", { Ev
, Ib
}, 0 },
3491 { "rorQ", { Ev
, Ib
}, 0 },
3492 { "rclQ", { Ev
, Ib
}, 0 },
3493 { "rcrQ", { Ev
, Ib
}, 0 },
3494 { "shlQ", { Ev
, Ib
}, 0 },
3495 { "shrQ", { Ev
, Ib
}, 0 },
3496 { "shlQ", { Ev
, Ib
}, 0 },
3497 { "sarQ", { Ev
, Ib
}, 0 },
3501 { "movA", { Ebh3
, Ib
}, 0 },
3508 { MOD_TABLE (MOD_C6_REG_7
) },
3512 { "movQ", { Evh3
, Iv
}, 0 },
3519 { MOD_TABLE (MOD_C7_REG_7
) },
3523 { "rolA", { Eb
, I1
}, 0 },
3524 { "rorA", { Eb
, I1
}, 0 },
3525 { "rclA", { Eb
, I1
}, 0 },
3526 { "rcrA", { Eb
, I1
}, 0 },
3527 { "shlA", { Eb
, I1
}, 0 },
3528 { "shrA", { Eb
, I1
}, 0 },
3529 { "shlA", { Eb
, I1
}, 0 },
3530 { "sarA", { Eb
, I1
}, 0 },
3534 { "rolQ", { Ev
, I1
}, 0 },
3535 { "rorQ", { Ev
, I1
}, 0 },
3536 { "rclQ", { Ev
, I1
}, 0 },
3537 { "rcrQ", { Ev
, I1
}, 0 },
3538 { "shlQ", { Ev
, I1
}, 0 },
3539 { "shrQ", { Ev
, I1
}, 0 },
3540 { "shlQ", { Ev
, I1
}, 0 },
3541 { "sarQ", { Ev
, I1
}, 0 },
3545 { "rolA", { Eb
, CL
}, 0 },
3546 { "rorA", { Eb
, CL
}, 0 },
3547 { "rclA", { Eb
, CL
}, 0 },
3548 { "rcrA", { Eb
, CL
}, 0 },
3549 { "shlA", { Eb
, CL
}, 0 },
3550 { "shrA", { Eb
, CL
}, 0 },
3551 { "shlA", { Eb
, CL
}, 0 },
3552 { "sarA", { Eb
, CL
}, 0 },
3556 { "rolQ", { Ev
, CL
}, 0 },
3557 { "rorQ", { Ev
, CL
}, 0 },
3558 { "rclQ", { Ev
, CL
}, 0 },
3559 { "rcrQ", { Ev
, CL
}, 0 },
3560 { "shlQ", { Ev
, CL
}, 0 },
3561 { "shrQ", { Ev
, CL
}, 0 },
3562 { "shlQ", { Ev
, CL
}, 0 },
3563 { "sarQ", { Ev
, CL
}, 0 },
3567 { "testA", { Eb
, Ib
}, 0 },
3568 { "testA", { Eb
, Ib
}, 0 },
3569 { "notA", { Ebh1
}, 0 },
3570 { "negA", { Ebh1
}, 0 },
3571 { "mulA", { Eb
}, 0 }, /* Don't print the implicit %al register, */
3572 { "imulA", { Eb
}, 0 }, /* to distinguish these opcodes from other */
3573 { "divA", { Eb
}, 0 }, /* mul/imul opcodes. Do the same for div */
3574 { "idivA", { Eb
}, 0 }, /* and idiv for consistency. */
3578 { "testQ", { Ev
, Iv
}, 0 },
3579 { "testQ", { Ev
, Iv
}, 0 },
3580 { "notQ", { Evh1
}, 0 },
3581 { "negQ", { Evh1
}, 0 },
3582 { "mulQ", { Ev
}, 0 }, /* Don't print the implicit register. */
3583 { "imulQ", { Ev
}, 0 },
3584 { "divQ", { Ev
}, 0 },
3585 { "idivQ", { Ev
}, 0 },
3589 { "incA", { Ebh1
}, 0 },
3590 { "decA", { Ebh1
}, 0 },
3594 { "incQ", { Evh1
}, 0 },
3595 { "decQ", { Evh1
}, 0 },
3596 { "call{&|}", { NOTRACK
, indirEv
, BND
}, 0 },
3597 { MOD_TABLE (MOD_FF_REG_3
) },
3598 { "jmp{&|}", { NOTRACK
, indirEv
, BND
}, 0 },
3599 { MOD_TABLE (MOD_FF_REG_5
) },
3600 { "pushU", { stackEv
}, 0 },
3605 { "sldtD", { Sv
}, 0 },
3606 { "strD", { Sv
}, 0 },
3607 { "lldt", { Ew
}, 0 },
3608 { "ltr", { Ew
}, 0 },
3609 { "verr", { Ew
}, 0 },
3610 { "verw", { Ew
}, 0 },
3616 { MOD_TABLE (MOD_0F01_REG_0
) },
3617 { MOD_TABLE (MOD_0F01_REG_1
) },
3618 { MOD_TABLE (MOD_0F01_REG_2
) },
3619 { MOD_TABLE (MOD_0F01_REG_3
) },
3620 { "smswD", { Sv
}, 0 },
3621 { MOD_TABLE (MOD_0F01_REG_5
) },
3622 { "lmsw", { Ew
}, 0 },
3623 { MOD_TABLE (MOD_0F01_REG_7
) },
3627 { "prefetch", { Mb
}, 0 },
3628 { "prefetchw", { Mb
}, 0 },
3629 { "prefetchwt1", { Mb
}, 0 },
3630 { "prefetch", { Mb
}, 0 },
3631 { "prefetch", { Mb
}, 0 },
3632 { "prefetch", { Mb
}, 0 },
3633 { "prefetch", { Mb
}, 0 },
3634 { "prefetch", { Mb
}, 0 },
3638 { MOD_TABLE (MOD_0F18_REG_0
) },
3639 { MOD_TABLE (MOD_0F18_REG_1
) },
3640 { MOD_TABLE (MOD_0F18_REG_2
) },
3641 { MOD_TABLE (MOD_0F18_REG_3
) },
3642 { MOD_TABLE (MOD_0F18_REG_4
) },
3643 { MOD_TABLE (MOD_0F18_REG_5
) },
3644 { MOD_TABLE (MOD_0F18_REG_6
) },
3645 { MOD_TABLE (MOD_0F18_REG_7
) },
3647 /* REG_0F1E_MOD_3 */
3649 { "nopQ", { Ev
}, 0 },
3650 { "rdsspK", { Rdq
}, PREFIX_OPCODE
},
3651 { "nopQ", { Ev
}, 0 },
3652 { "nopQ", { Ev
}, 0 },
3653 { "nopQ", { Ev
}, 0 },
3654 { "nopQ", { Ev
}, 0 },
3655 { "nopQ", { Ev
}, 0 },
3656 { RM_TABLE (RM_0F1E_MOD_3_REG_7
) },
3662 { MOD_TABLE (MOD_0F71_REG_2
) },
3664 { MOD_TABLE (MOD_0F71_REG_4
) },
3666 { MOD_TABLE (MOD_0F71_REG_6
) },
3672 { MOD_TABLE (MOD_0F72_REG_2
) },
3674 { MOD_TABLE (MOD_0F72_REG_4
) },
3676 { MOD_TABLE (MOD_0F72_REG_6
) },
3682 { MOD_TABLE (MOD_0F73_REG_2
) },
3683 { MOD_TABLE (MOD_0F73_REG_3
) },
3686 { MOD_TABLE (MOD_0F73_REG_6
) },
3687 { MOD_TABLE (MOD_0F73_REG_7
) },
3691 { "montmul", { { OP_0f07
, 0 } }, 0 },
3692 { "xsha1", { { OP_0f07
, 0 } }, 0 },
3693 { "xsha256", { { OP_0f07
, 0 } }, 0 },
3697 { "xstore-rng", { { OP_0f07
, 0 } }, 0 },
3698 { "xcrypt-ecb", { { OP_0f07
, 0 } }, 0 },
3699 { "xcrypt-cbc", { { OP_0f07
, 0 } }, 0 },
3700 { "xcrypt-ctr", { { OP_0f07
, 0 } }, 0 },
3701 { "xcrypt-cfb", { { OP_0f07
, 0 } }, 0 },
3702 { "xcrypt-ofb", { { OP_0f07
, 0 } }, 0 },
3706 { MOD_TABLE (MOD_0FAE_REG_0
) },
3707 { MOD_TABLE (MOD_0FAE_REG_1
) },
3708 { MOD_TABLE (MOD_0FAE_REG_2
) },
3709 { MOD_TABLE (MOD_0FAE_REG_3
) },
3710 { MOD_TABLE (MOD_0FAE_REG_4
) },
3711 { MOD_TABLE (MOD_0FAE_REG_5
) },
3712 { MOD_TABLE (MOD_0FAE_REG_6
) },
3713 { MOD_TABLE (MOD_0FAE_REG_7
) },
3721 { "btQ", { Ev
, Ib
}, 0 },
3722 { "btsQ", { Evh1
, Ib
}, 0 },
3723 { "btrQ", { Evh1
, Ib
}, 0 },
3724 { "btcQ", { Evh1
, Ib
}, 0 },
3729 { "cmpxchg8b", { { CMPXCHG8B_Fixup
, q_mode
} }, 0 },
3731 { MOD_TABLE (MOD_0FC7_REG_3
) },
3732 { MOD_TABLE (MOD_0FC7_REG_4
) },
3733 { MOD_TABLE (MOD_0FC7_REG_5
) },
3734 { MOD_TABLE (MOD_0FC7_REG_6
) },
3735 { MOD_TABLE (MOD_0FC7_REG_7
) },
3741 { MOD_TABLE (MOD_VEX_0F71_REG_2
) },
3743 { MOD_TABLE (MOD_VEX_0F71_REG_4
) },
3745 { MOD_TABLE (MOD_VEX_0F71_REG_6
) },
3751 { MOD_TABLE (MOD_VEX_0F72_REG_2
) },
3753 { MOD_TABLE (MOD_VEX_0F72_REG_4
) },
3755 { MOD_TABLE (MOD_VEX_0F72_REG_6
) },
3761 { MOD_TABLE (MOD_VEX_0F73_REG_2
) },
3762 { MOD_TABLE (MOD_VEX_0F73_REG_3
) },
3765 { MOD_TABLE (MOD_VEX_0F73_REG_6
) },
3766 { MOD_TABLE (MOD_VEX_0F73_REG_7
) },
3772 { MOD_TABLE (MOD_VEX_0FAE_REG_2
) },
3773 { MOD_TABLE (MOD_VEX_0FAE_REG_3
) },
3775 /* REG_VEX_0F38F3 */
3778 { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_1
) },
3779 { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_2
) },
3780 { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_3
) },
3784 { "llwpcb", { { OP_LWPCB_E
, 0 } }, 0 },
3785 { "slwpcb", { { OP_LWPCB_E
, 0 } }, 0 },
3789 { "lwpins", { { OP_LWP_E
, 0 }, Ed
, Iq
}, 0 },
3790 { "lwpval", { { OP_LWP_E
, 0 }, Ed
, Iq
}, 0 },
3792 /* REG_XOP_TBM_01 */
3795 { "blcfill", { { OP_LWP_E
, 0 }, Ev
}, 0 },
3796 { "blsfill", { { OP_LWP_E
, 0 }, Ev
}, 0 },
3797 { "blcs", { { OP_LWP_E
, 0 }, Ev
}, 0 },
3798 { "tzmsk", { { OP_LWP_E
, 0 }, Ev
}, 0 },
3799 { "blcic", { { OP_LWP_E
, 0 }, Ev
}, 0 },
3800 { "blsic", { { OP_LWP_E
, 0 }, Ev
}, 0 },
3801 { "t1mskc", { { OP_LWP_E
, 0 }, Ev
}, 0 },
3803 /* REG_XOP_TBM_02 */
3806 { "blcmsk", { { OP_LWP_E
, 0 }, Ev
}, 0 },
3811 { "blci", { { OP_LWP_E
, 0 }, Ev
}, 0 },
3813 #define NEED_REG_TABLE
3814 #include "i386-dis-evex.h"
3815 #undef NEED_REG_TABLE
3818 static const struct dis386 prefix_table
[][4] = {
3821 { "xchgS", { { NOP_Fixup1
, eAX_reg
}, { NOP_Fixup2
, eAX_reg
} }, 0 },
3822 { "pause", { XX
}, 0 },
3823 { "xchgS", { { NOP_Fixup1
, eAX_reg
}, { NOP_Fixup2
, eAX_reg
} }, 0 },
3824 { NULL
, { { NULL
, 0 } }, PREFIX_IGNORED
}
3827 /* PREFIX_MOD_0_0F01_REG_5 */
3830 { "rstorssp", { Mq
}, PREFIX_OPCODE
},
3833 /* PREFIX_MOD_3_0F01_REG_5_RM_0 */
3836 { "setssbsy", { Skip_MODRM
}, PREFIX_OPCODE
},
3839 /* PREFIX_MOD_3_0F01_REG_5_RM_2 */
3842 { "saveprevssp", { Skip_MODRM
}, PREFIX_OPCODE
},
3847 { "movups", { XM
, EXx
}, PREFIX_OPCODE
},
3848 { "movss", { XM
, EXd
}, PREFIX_OPCODE
},
3849 { "movupd", { XM
, EXx
}, PREFIX_OPCODE
},
3850 { "movsd", { XM
, EXq
}, PREFIX_OPCODE
},
3855 { "movups", { EXxS
, XM
}, PREFIX_OPCODE
},
3856 { "movss", { EXdS
, XM
}, PREFIX_OPCODE
},
3857 { "movupd", { EXxS
, XM
}, PREFIX_OPCODE
},
3858 { "movsd", { EXqS
, XM
}, PREFIX_OPCODE
},
3863 { MOD_TABLE (MOD_0F12_PREFIX_0
) },
3864 { "movsldup", { XM
, EXx
}, PREFIX_OPCODE
},
3865 { "movlpd", { XM
, EXq
}, PREFIX_OPCODE
},
3866 { "movddup", { XM
, EXq
}, PREFIX_OPCODE
},
3871 { MOD_TABLE (MOD_0F16_PREFIX_0
) },
3872 { "movshdup", { XM
, EXx
}, PREFIX_OPCODE
},
3873 { "movhpd", { XM
, EXq
}, PREFIX_OPCODE
},
3878 { MOD_TABLE (MOD_0F1A_PREFIX_0
) },
3879 { "bndcl", { Gbnd
, Ev_bnd
}, 0 },
3880 { "bndmov", { Gbnd
, Ebnd
}, 0 },
3881 { "bndcu", { Gbnd
, Ev_bnd
}, 0 },
3886 { MOD_TABLE (MOD_0F1B_PREFIX_0
) },
3887 { MOD_TABLE (MOD_0F1B_PREFIX_1
) },
3888 { "bndmov", { Ebnd
, Gbnd
}, 0 },
3889 { "bndcn", { Gbnd
, Ev_bnd
}, 0 },
3894 { "nopQ", { Ev
}, PREFIX_OPCODE
},
3895 { MOD_TABLE (MOD_0F1E_PREFIX_1
) },
3896 { "nopQ", { Ev
}, PREFIX_OPCODE
},
3897 { "nopQ", { Ev
}, PREFIX_OPCODE
},
3902 { "cvtpi2ps", { XM
, EMCq
}, PREFIX_OPCODE
},
3903 { "cvtsi2ss%LQ", { XM
, Ev
}, PREFIX_OPCODE
},
3904 { "cvtpi2pd", { XM
, EMCq
}, PREFIX_OPCODE
},
3905 { "cvtsi2sd%LQ", { XM
, Ev
}, 0 },
3910 { MOD_TABLE (MOD_0F2B_PREFIX_0
) },
3911 { MOD_TABLE (MOD_0F2B_PREFIX_1
) },
3912 { MOD_TABLE (MOD_0F2B_PREFIX_2
) },
3913 { MOD_TABLE (MOD_0F2B_PREFIX_3
) },
3918 { "cvttps2pi", { MXC
, EXq
}, PREFIX_OPCODE
},
3919 { "cvttss2siY", { Gv
, EXd
}, PREFIX_OPCODE
},
3920 { "cvttpd2pi", { MXC
, EXx
}, PREFIX_OPCODE
},
3921 { "cvttsd2siY", { Gv
, EXq
}, PREFIX_OPCODE
},
3926 { "cvtps2pi", { MXC
, EXq
}, PREFIX_OPCODE
},
3927 { "cvtss2siY", { Gv
, EXd
}, PREFIX_OPCODE
},
3928 { "cvtpd2pi", { MXC
, EXx
}, PREFIX_OPCODE
},
3929 { "cvtsd2siY", { Gv
, EXq
}, PREFIX_OPCODE
},
3934 { "ucomiss",{ XM
, EXd
}, 0 },
3936 { "ucomisd",{ XM
, EXq
}, 0 },
3941 { "comiss", { XM
, EXd
}, 0 },
3943 { "comisd", { XM
, EXq
}, 0 },
3948 { "sqrtps", { XM
, EXx
}, PREFIX_OPCODE
},
3949 { "sqrtss", { XM
, EXd
}, PREFIX_OPCODE
},
3950 { "sqrtpd", { XM
, EXx
}, PREFIX_OPCODE
},
3951 { "sqrtsd", { XM
, EXq
}, PREFIX_OPCODE
},
3956 { "rsqrtps",{ XM
, EXx
}, PREFIX_OPCODE
},
3957 { "rsqrtss",{ XM
, EXd
}, PREFIX_OPCODE
},
3962 { "rcpps", { XM
, EXx
}, PREFIX_OPCODE
},
3963 { "rcpss", { XM
, EXd
}, PREFIX_OPCODE
},
3968 { "addps", { XM
, EXx
}, PREFIX_OPCODE
},
3969 { "addss", { XM
, EXd
}, PREFIX_OPCODE
},
3970 { "addpd", { XM
, EXx
}, PREFIX_OPCODE
},
3971 { "addsd", { XM
, EXq
}, PREFIX_OPCODE
},
3976 { "mulps", { XM
, EXx
}, PREFIX_OPCODE
},
3977 { "mulss", { XM
, EXd
}, PREFIX_OPCODE
},
3978 { "mulpd", { XM
, EXx
}, PREFIX_OPCODE
},
3979 { "mulsd", { XM
, EXq
}, PREFIX_OPCODE
},
3984 { "cvtps2pd", { XM
, EXq
}, PREFIX_OPCODE
},
3985 { "cvtss2sd", { XM
, EXd
}, PREFIX_OPCODE
},
3986 { "cvtpd2ps", { XM
, EXx
}, PREFIX_OPCODE
},
3987 { "cvtsd2ss", { XM
, EXq
}, PREFIX_OPCODE
},
3992 { "cvtdq2ps", { XM
, EXx
}, PREFIX_OPCODE
},
3993 { "cvttps2dq", { XM
, EXx
}, PREFIX_OPCODE
},
3994 { "cvtps2dq", { XM
, EXx
}, PREFIX_OPCODE
},
3999 { "subps", { XM
, EXx
}, PREFIX_OPCODE
},
4000 { "subss", { XM
, EXd
}, PREFIX_OPCODE
},
4001 { "subpd", { XM
, EXx
}, PREFIX_OPCODE
},
4002 { "subsd", { XM
, EXq
}, PREFIX_OPCODE
},
4007 { "minps", { XM
, EXx
}, PREFIX_OPCODE
},
4008 { "minss", { XM
, EXd
}, PREFIX_OPCODE
},
4009 { "minpd", { XM
, EXx
}, PREFIX_OPCODE
},
4010 { "minsd", { XM
, EXq
}, PREFIX_OPCODE
},
4015 { "divps", { XM
, EXx
}, PREFIX_OPCODE
},
4016 { "divss", { XM
, EXd
}, PREFIX_OPCODE
},
4017 { "divpd", { XM
, EXx
}, PREFIX_OPCODE
},
4018 { "divsd", { XM
, EXq
}, PREFIX_OPCODE
},
4023 { "maxps", { XM
, EXx
}, PREFIX_OPCODE
},
4024 { "maxss", { XM
, EXd
}, PREFIX_OPCODE
},
4025 { "maxpd", { XM
, EXx
}, PREFIX_OPCODE
},
4026 { "maxsd", { XM
, EXq
}, PREFIX_OPCODE
},
4031 { "punpcklbw",{ MX
, EMd
}, PREFIX_OPCODE
},
4033 { "punpcklbw",{ MX
, EMx
}, PREFIX_OPCODE
},
4038 { "punpcklwd",{ MX
, EMd
}, PREFIX_OPCODE
},
4040 { "punpcklwd",{ MX
, EMx
}, PREFIX_OPCODE
},
4045 { "punpckldq",{ MX
, EMd
}, PREFIX_OPCODE
},
4047 { "punpckldq",{ MX
, EMx
}, PREFIX_OPCODE
},
4054 { "punpcklqdq", { XM
, EXx
}, PREFIX_OPCODE
},
4061 { "punpckhqdq", { XM
, EXx
}, PREFIX_OPCODE
},
4066 { "movq", { MX
, EM
}, PREFIX_OPCODE
},
4067 { "movdqu", { XM
, EXx
}, PREFIX_OPCODE
},
4068 { "movdqa", { XM
, EXx
}, PREFIX_OPCODE
},
4073 { "pshufw", { MX
, EM
, Ib
}, PREFIX_OPCODE
},
4074 { "pshufhw",{ XM
, EXx
, Ib
}, PREFIX_OPCODE
},
4075 { "pshufd", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
4076 { "pshuflw",{ XM
, EXx
, Ib
}, PREFIX_OPCODE
},
4079 /* PREFIX_0F73_REG_3 */
4083 { "psrldq", { XS
, Ib
}, 0 },
4086 /* PREFIX_0F73_REG_7 */
4090 { "pslldq", { XS
, Ib
}, 0 },
4095 {"vmread", { Em
, Gm
}, 0 },
4097 {"extrq", { XS
, Ib
, Ib
}, 0 },
4098 {"insertq", { XM
, XS
, Ib
, Ib
}, 0 },
4103 {"vmwrite", { Gm
, Em
}, 0 },
4105 {"extrq", { XM
, XS
}, 0 },
4106 {"insertq", { XM
, XS
}, 0 },
4113 { "haddpd", { XM
, EXx
}, PREFIX_OPCODE
},
4114 { "haddps", { XM
, EXx
}, PREFIX_OPCODE
},
4121 { "hsubpd", { XM
, EXx
}, PREFIX_OPCODE
},
4122 { "hsubps", { XM
, EXx
}, PREFIX_OPCODE
},
4127 { "movK", { Edq
, MX
}, PREFIX_OPCODE
},
4128 { "movq", { XM
, EXq
}, PREFIX_OPCODE
},
4129 { "movK", { Edq
, XM
}, PREFIX_OPCODE
},
4134 { "movq", { EMS
, MX
}, PREFIX_OPCODE
},
4135 { "movdqu", { EXxS
, XM
}, PREFIX_OPCODE
},
4136 { "movdqa", { EXxS
, XM
}, PREFIX_OPCODE
},
4139 /* PREFIX_0FAE_REG_0 */
4142 { "rdfsbase", { Ev
}, 0 },
4145 /* PREFIX_0FAE_REG_1 */
4148 { "rdgsbase", { Ev
}, 0 },
4151 /* PREFIX_0FAE_REG_2 */
4154 { "wrfsbase", { Ev
}, 0 },
4157 /* PREFIX_0FAE_REG_3 */
4160 { "wrgsbase", { Ev
}, 0 },
4163 /* PREFIX_MOD_0_0FAE_REG_4 */
4165 { "xsave", { FXSAVE
}, 0 },
4166 { "ptwrite%LQ", { Edq
}, 0 },
4169 /* PREFIX_MOD_3_0FAE_REG_4 */
4172 { "ptwrite%LQ", { Edq
}, 0 },
4175 /* PREFIX_MOD_0_0FAE_REG_5 */
4177 { "xrstor", { FXSAVE
}, PREFIX_OPCODE
},
4180 /* PREFIX_MOD_3_0FAE_REG_5 */
4182 { "lfence", { Skip_MODRM
}, 0 },
4183 { "incsspK", { Rdq
}, PREFIX_OPCODE
},
4186 /* PREFIX_0FAE_REG_6 */
4188 { "xsaveopt", { FXSAVE
}, PREFIX_OPCODE
},
4189 { "clrssbsy", { Mq
}, PREFIX_OPCODE
},
4190 { "clwb", { Mb
}, PREFIX_OPCODE
},
4193 /* PREFIX_0FAE_REG_7 */
4195 { "clflush", { Mb
}, 0 },
4197 { "clflushopt", { Mb
}, 0 },
4203 { "popcntS", { Gv
, Ev
}, 0 },
4208 { "bsfS", { Gv
, Ev
}, 0 },
4209 { "tzcntS", { Gv
, Ev
}, 0 },
4210 { "bsfS", { Gv
, Ev
}, 0 },
4215 { "bsrS", { Gv
, Ev
}, 0 },
4216 { "lzcntS", { Gv
, Ev
}, 0 },
4217 { "bsrS", { Gv
, Ev
}, 0 },
4222 { "cmpps", { XM
, EXx
, CMP
}, PREFIX_OPCODE
},
4223 { "cmpss", { XM
, EXd
, CMP
}, PREFIX_OPCODE
},
4224 { "cmppd", { XM
, EXx
, CMP
}, PREFIX_OPCODE
},
4225 { "cmpsd", { XM
, EXq
, CMP
}, PREFIX_OPCODE
},
4228 /* PREFIX_MOD_0_0FC3 */
4230 { "movntiS", { Ev
, Gv
}, PREFIX_OPCODE
},
4233 /* PREFIX_MOD_0_0FC7_REG_6 */
4235 { "vmptrld",{ Mq
}, 0 },
4236 { "vmxon", { Mq
}, 0 },
4237 { "vmclear",{ Mq
}, 0 },
4240 /* PREFIX_MOD_3_0FC7_REG_6 */
4242 { "rdrand", { Ev
}, 0 },
4244 { "rdrand", { Ev
}, 0 }
4247 /* PREFIX_MOD_3_0FC7_REG_7 */
4249 { "rdseed", { Ev
}, 0 },
4250 { "rdpid", { Em
}, 0 },
4251 { "rdseed", { Ev
}, 0 },
4258 { "addsubpd", { XM
, EXx
}, 0 },
4259 { "addsubps", { XM
, EXx
}, 0 },
4265 { "movq2dq",{ XM
, MS
}, 0 },
4266 { "movq", { EXqS
, XM
}, 0 },
4267 { "movdq2q",{ MX
, XS
}, 0 },
4273 { "cvtdq2pd", { XM
, EXq
}, PREFIX_OPCODE
},
4274 { "cvttpd2dq", { XM
, EXx
}, PREFIX_OPCODE
},
4275 { "cvtpd2dq", { XM
, EXx
}, PREFIX_OPCODE
},
4280 { "movntq", { Mq
, MX
}, PREFIX_OPCODE
},
4282 { MOD_TABLE (MOD_0FE7_PREFIX_2
) },
4290 { MOD_TABLE (MOD_0FF0_PREFIX_3
) },
4295 { "maskmovq", { MX
, MS
}, PREFIX_OPCODE
},
4297 { "maskmovdqu", { XM
, XS
}, PREFIX_OPCODE
},
4304 { "pblendvb", { XM
, EXx
, XMM0
}, PREFIX_OPCODE
},
4311 { "blendvps", { XM
, EXx
, XMM0
}, PREFIX_OPCODE
},
4318 { "blendvpd", { XM
, EXx
, XMM0
}, PREFIX_OPCODE
},
4325 { "ptest", { XM
, EXx
}, PREFIX_OPCODE
},
4332 { "pmovsxbw", { XM
, EXq
}, PREFIX_OPCODE
},
4339 { "pmovsxbd", { XM
, EXd
}, PREFIX_OPCODE
},
4346 { "pmovsxbq", { XM
, EXw
}, PREFIX_OPCODE
},
4353 { "pmovsxwd", { XM
, EXq
}, PREFIX_OPCODE
},
4360 { "pmovsxwq", { XM
, EXd
}, PREFIX_OPCODE
},
4367 { "pmovsxdq", { XM
, EXq
}, PREFIX_OPCODE
},
4374 { "pmuldq", { XM
, EXx
}, PREFIX_OPCODE
},
4381 { "pcmpeqq", { XM
, EXx
}, PREFIX_OPCODE
},
4388 { MOD_TABLE (MOD_0F382A_PREFIX_2
) },
4395 { "packusdw", { XM
, EXx
}, PREFIX_OPCODE
},
4402 { "pmovzxbw", { XM
, EXq
}, PREFIX_OPCODE
},
4409 { "pmovzxbd", { XM
, EXd
}, PREFIX_OPCODE
},
4416 { "pmovzxbq", { XM
, EXw
}, PREFIX_OPCODE
},
4423 { "pmovzxwd", { XM
, EXq
}, PREFIX_OPCODE
},
4430 { "pmovzxwq", { XM
, EXd
}, PREFIX_OPCODE
},
4437 { "pmovzxdq", { XM
, EXq
}, PREFIX_OPCODE
},
4444 { "pcmpgtq", { XM
, EXx
}, PREFIX_OPCODE
},
4451 { "pminsb", { XM
, EXx
}, PREFIX_OPCODE
},
4458 { "pminsd", { XM
, EXx
}, PREFIX_OPCODE
},
4465 { "pminuw", { XM
, EXx
}, PREFIX_OPCODE
},
4472 { "pminud", { XM
, EXx
}, PREFIX_OPCODE
},
4479 { "pmaxsb", { XM
, EXx
}, PREFIX_OPCODE
},
4486 { "pmaxsd", { XM
, EXx
}, PREFIX_OPCODE
},
4493 { "pmaxuw", { XM
, EXx
}, PREFIX_OPCODE
},
4500 { "pmaxud", { XM
, EXx
}, PREFIX_OPCODE
},
4507 { "pmulld", { XM
, EXx
}, PREFIX_OPCODE
},
4514 { "phminposuw", { XM
, EXx
}, PREFIX_OPCODE
},
4521 { "invept", { Gm
, Mo
}, PREFIX_OPCODE
},
4528 { "invvpid", { Gm
, Mo
}, PREFIX_OPCODE
},
4535 { "invpcid", { Gm
, M
}, PREFIX_OPCODE
},
4540 { "sha1nexte", { XM
, EXxmm
}, PREFIX_OPCODE
},
4545 { "sha1msg1", { XM
, EXxmm
}, PREFIX_OPCODE
},
4550 { "sha1msg2", { XM
, EXxmm
}, PREFIX_OPCODE
},
4555 { "sha256rnds2", { XM
, EXxmm
, XMM0
}, PREFIX_OPCODE
},
4560 { "sha256msg1", { XM
, EXxmm
}, PREFIX_OPCODE
},
4565 { "sha256msg2", { XM
, EXxmm
}, PREFIX_OPCODE
},
4572 { "gf2p8mulb", { XM
, EXxmm
}, PREFIX_OPCODE
},
4579 { "aesimc", { XM
, EXx
}, PREFIX_OPCODE
},
4586 { "aesenc", { XM
, EXx
}, PREFIX_OPCODE
},
4593 { "aesenclast", { XM
, EXx
}, PREFIX_OPCODE
},
4600 { "aesdec", { XM
, EXx
}, PREFIX_OPCODE
},
4607 { "aesdeclast", { XM
, EXx
}, PREFIX_OPCODE
},
4612 { "movbeS", { Gv
, { MOVBE_Fixup
, v_mode
} }, PREFIX_OPCODE
},
4614 { "movbeS", { Gv
, { MOVBE_Fixup
, v_mode
} }, PREFIX_OPCODE
},
4615 { "crc32", { Gdq
, { CRC32_Fixup
, b_mode
} }, PREFIX_OPCODE
},
4620 { "movbeS", { { MOVBE_Fixup
, v_mode
}, Gv
}, PREFIX_OPCODE
},
4622 { "movbeS", { { MOVBE_Fixup
, v_mode
}, Gv
}, PREFIX_OPCODE
},
4623 { "crc32", { Gdq
, { CRC32_Fixup
, v_mode
} }, PREFIX_OPCODE
},
4630 { MOD_TABLE (MOD_0F38F5_PREFIX_2
) },
4635 { MOD_TABLE (MOD_0F38F6_PREFIX_0
) },
4636 { "adoxS", { Gdq
, Edq
}, PREFIX_OPCODE
},
4637 { "adcxS", { Gdq
, Edq
}, PREFIX_OPCODE
},
4645 { "roundps", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
4652 { "roundpd", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
4659 { "roundss", { XM
, EXd
, Ib
}, PREFIX_OPCODE
},
4666 { "roundsd", { XM
, EXq
, Ib
}, PREFIX_OPCODE
},
4673 { "blendps", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
4680 { "blendpd", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
4687 { "pblendw", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
4694 { "pextrb", { Edqb
, XM
, Ib
}, PREFIX_OPCODE
},
4701 { "pextrw", { Edqw
, XM
, Ib
}, PREFIX_OPCODE
},
4708 { "pextrK", { Edq
, XM
, Ib
}, PREFIX_OPCODE
},
4715 { "extractps", { Edqd
, XM
, Ib
}, PREFIX_OPCODE
},
4722 { "pinsrb", { XM
, Edqb
, Ib
}, PREFIX_OPCODE
},
4729 { "insertps", { XM
, EXd
, Ib
}, PREFIX_OPCODE
},
4736 { "pinsrK", { XM
, Edq
, Ib
}, PREFIX_OPCODE
},
4743 { "dpps", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
4750 { "dppd", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
4757 { "mpsadbw", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
4764 { "pclmulqdq", { XM
, EXx
, PCLMUL
}, PREFIX_OPCODE
},
4771 { "pcmpestrm", { XM
, { PCMPESTR_Fixup
, x_mode
}, Ib
}, PREFIX_OPCODE
},
4778 { "pcmpestri", { XM
, { PCMPESTR_Fixup
, x_mode
}, Ib
}, PREFIX_OPCODE
},
4785 { "pcmpistrm", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
4792 { "pcmpistri", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
4797 { "sha1rnds4", { XM
, EXxmm
, Ib
}, PREFIX_OPCODE
},
4804 { "gf2p8affineqb", { XM
, EXxmm
, Ib
}, PREFIX_OPCODE
},
4811 { "gf2p8affineinvqb", { XM
, EXxmm
, Ib
}, PREFIX_OPCODE
},
4818 { "aeskeygenassist", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
4821 /* PREFIX_VEX_0F10 */
4823 { VEX_W_TABLE (VEX_W_0F10_P_0
) },
4824 { VEX_LEN_TABLE (VEX_LEN_0F10_P_1
) },
4825 { VEX_W_TABLE (VEX_W_0F10_P_2
) },
4826 { VEX_LEN_TABLE (VEX_LEN_0F10_P_3
) },
4829 /* PREFIX_VEX_0F11 */
4831 { VEX_W_TABLE (VEX_W_0F11_P_0
) },
4832 { VEX_LEN_TABLE (VEX_LEN_0F11_P_1
) },
4833 { VEX_W_TABLE (VEX_W_0F11_P_2
) },
4834 { VEX_LEN_TABLE (VEX_LEN_0F11_P_3
) },
4837 /* PREFIX_VEX_0F12 */
4839 { MOD_TABLE (MOD_VEX_0F12_PREFIX_0
) },
4840 { VEX_W_TABLE (VEX_W_0F12_P_1
) },
4841 { VEX_LEN_TABLE (VEX_LEN_0F12_P_2
) },
4842 { VEX_W_TABLE (VEX_W_0F12_P_3
) },
4845 /* PREFIX_VEX_0F16 */
4847 { MOD_TABLE (MOD_VEX_0F16_PREFIX_0
) },
4848 { VEX_W_TABLE (VEX_W_0F16_P_1
) },
4849 { VEX_LEN_TABLE (VEX_LEN_0F16_P_2
) },
4852 /* PREFIX_VEX_0F2A */
4855 { VEX_LEN_TABLE (VEX_LEN_0F2A_P_1
) },
4857 { VEX_LEN_TABLE (VEX_LEN_0F2A_P_3
) },
4860 /* PREFIX_VEX_0F2C */
4863 { VEX_LEN_TABLE (VEX_LEN_0F2C_P_1
) },
4865 { VEX_LEN_TABLE (VEX_LEN_0F2C_P_3
) },
4868 /* PREFIX_VEX_0F2D */
4871 { VEX_LEN_TABLE (VEX_LEN_0F2D_P_1
) },
4873 { VEX_LEN_TABLE (VEX_LEN_0F2D_P_3
) },
4876 /* PREFIX_VEX_0F2E */
4878 { VEX_LEN_TABLE (VEX_LEN_0F2E_P_0
) },
4880 { VEX_LEN_TABLE (VEX_LEN_0F2E_P_2
) },
4883 /* PREFIX_VEX_0F2F */
4885 { VEX_LEN_TABLE (VEX_LEN_0F2F_P_0
) },
4887 { VEX_LEN_TABLE (VEX_LEN_0F2F_P_2
) },
4890 /* PREFIX_VEX_0F41 */
4892 { VEX_LEN_TABLE (VEX_LEN_0F41_P_0
) },
4894 { VEX_LEN_TABLE (VEX_LEN_0F41_P_2
) },
4897 /* PREFIX_VEX_0F42 */
4899 { VEX_LEN_TABLE (VEX_LEN_0F42_P_0
) },
4901 { VEX_LEN_TABLE (VEX_LEN_0F42_P_2
) },
4904 /* PREFIX_VEX_0F44 */
4906 { VEX_LEN_TABLE (VEX_LEN_0F44_P_0
) },
4908 { VEX_LEN_TABLE (VEX_LEN_0F44_P_2
) },
4911 /* PREFIX_VEX_0F45 */
4913 { VEX_LEN_TABLE (VEX_LEN_0F45_P_0
) },
4915 { VEX_LEN_TABLE (VEX_LEN_0F45_P_2
) },
4918 /* PREFIX_VEX_0F46 */
4920 { VEX_LEN_TABLE (VEX_LEN_0F46_P_0
) },
4922 { VEX_LEN_TABLE (VEX_LEN_0F46_P_2
) },
4925 /* PREFIX_VEX_0F47 */
4927 { VEX_LEN_TABLE (VEX_LEN_0F47_P_0
) },
4929 { VEX_LEN_TABLE (VEX_LEN_0F47_P_2
) },
4932 /* PREFIX_VEX_0F4A */
4934 { VEX_LEN_TABLE (VEX_LEN_0F4A_P_0
) },
4936 { VEX_LEN_TABLE (VEX_LEN_0F4A_P_2
) },
4939 /* PREFIX_VEX_0F4B */
4941 { VEX_LEN_TABLE (VEX_LEN_0F4B_P_0
) },
4943 { VEX_LEN_TABLE (VEX_LEN_0F4B_P_2
) },
4946 /* PREFIX_VEX_0F51 */
4948 { VEX_W_TABLE (VEX_W_0F51_P_0
) },
4949 { VEX_LEN_TABLE (VEX_LEN_0F51_P_1
) },
4950 { VEX_W_TABLE (VEX_W_0F51_P_2
) },
4951 { VEX_LEN_TABLE (VEX_LEN_0F51_P_3
) },
4954 /* PREFIX_VEX_0F52 */
4956 { VEX_W_TABLE (VEX_W_0F52_P_0
) },
4957 { VEX_LEN_TABLE (VEX_LEN_0F52_P_1
) },
4960 /* PREFIX_VEX_0F53 */
4962 { VEX_W_TABLE (VEX_W_0F53_P_0
) },
4963 { VEX_LEN_TABLE (VEX_LEN_0F53_P_1
) },
4966 /* PREFIX_VEX_0F58 */
4968 { VEX_W_TABLE (VEX_W_0F58_P_0
) },
4969 { VEX_LEN_TABLE (VEX_LEN_0F58_P_1
) },
4970 { VEX_W_TABLE (VEX_W_0F58_P_2
) },
4971 { VEX_LEN_TABLE (VEX_LEN_0F58_P_3
) },
4974 /* PREFIX_VEX_0F59 */
4976 { VEX_W_TABLE (VEX_W_0F59_P_0
) },
4977 { VEX_LEN_TABLE (VEX_LEN_0F59_P_1
) },
4978 { VEX_W_TABLE (VEX_W_0F59_P_2
) },
4979 { VEX_LEN_TABLE (VEX_LEN_0F59_P_3
) },
4982 /* PREFIX_VEX_0F5A */
4984 { VEX_W_TABLE (VEX_W_0F5A_P_0
) },
4985 { VEX_LEN_TABLE (VEX_LEN_0F5A_P_1
) },
4986 { "vcvtpd2ps%XY", { XMM
, EXx
}, 0 },
4987 { VEX_LEN_TABLE (VEX_LEN_0F5A_P_3
) },
4990 /* PREFIX_VEX_0F5B */
4992 { VEX_W_TABLE (VEX_W_0F5B_P_0
) },
4993 { VEX_W_TABLE (VEX_W_0F5B_P_1
) },
4994 { VEX_W_TABLE (VEX_W_0F5B_P_2
) },
4997 /* PREFIX_VEX_0F5C */
4999 { VEX_W_TABLE (VEX_W_0F5C_P_0
) },
5000 { VEX_LEN_TABLE (VEX_LEN_0F5C_P_1
) },
5001 { VEX_W_TABLE (VEX_W_0F5C_P_2
) },
5002 { VEX_LEN_TABLE (VEX_LEN_0F5C_P_3
) },
5005 /* PREFIX_VEX_0F5D */
5007 { VEX_W_TABLE (VEX_W_0F5D_P_0
) },
5008 { VEX_LEN_TABLE (VEX_LEN_0F5D_P_1
) },
5009 { VEX_W_TABLE (VEX_W_0F5D_P_2
) },
5010 { VEX_LEN_TABLE (VEX_LEN_0F5D_P_3
) },
5013 /* PREFIX_VEX_0F5E */
5015 { VEX_W_TABLE (VEX_W_0F5E_P_0
) },
5016 { VEX_LEN_TABLE (VEX_LEN_0F5E_P_1
) },
5017 { VEX_W_TABLE (VEX_W_0F5E_P_2
) },
5018 { VEX_LEN_TABLE (VEX_LEN_0F5E_P_3
) },
5021 /* PREFIX_VEX_0F5F */
5023 { VEX_W_TABLE (VEX_W_0F5F_P_0
) },
5024 { VEX_LEN_TABLE (VEX_LEN_0F5F_P_1
) },
5025 { VEX_W_TABLE (VEX_W_0F5F_P_2
) },
5026 { VEX_LEN_TABLE (VEX_LEN_0F5F_P_3
) },
5029 /* PREFIX_VEX_0F60 */
5033 { VEX_W_TABLE (VEX_W_0F60_P_2
) },
5036 /* PREFIX_VEX_0F61 */
5040 { VEX_W_TABLE (VEX_W_0F61_P_2
) },
5043 /* PREFIX_VEX_0F62 */
5047 { VEX_W_TABLE (VEX_W_0F62_P_2
) },
5050 /* PREFIX_VEX_0F63 */
5054 { VEX_W_TABLE (VEX_W_0F63_P_2
) },
5057 /* PREFIX_VEX_0F64 */
5061 { VEX_W_TABLE (VEX_W_0F64_P_2
) },
5064 /* PREFIX_VEX_0F65 */
5068 { VEX_W_TABLE (VEX_W_0F65_P_2
) },
5071 /* PREFIX_VEX_0F66 */
5075 { VEX_W_TABLE (VEX_W_0F66_P_2
) },
5078 /* PREFIX_VEX_0F67 */
5082 { VEX_W_TABLE (VEX_W_0F67_P_2
) },
5085 /* PREFIX_VEX_0F68 */
5089 { VEX_W_TABLE (VEX_W_0F68_P_2
) },
5092 /* PREFIX_VEX_0F69 */
5096 { VEX_W_TABLE (VEX_W_0F69_P_2
) },
5099 /* PREFIX_VEX_0F6A */
5103 { VEX_W_TABLE (VEX_W_0F6A_P_2
) },
5106 /* PREFIX_VEX_0F6B */
5110 { VEX_W_TABLE (VEX_W_0F6B_P_2
) },
5113 /* PREFIX_VEX_0F6C */
5117 { VEX_W_TABLE (VEX_W_0F6C_P_2
) },
5120 /* PREFIX_VEX_0F6D */
5124 { VEX_W_TABLE (VEX_W_0F6D_P_2
) },
5127 /* PREFIX_VEX_0F6E */
5131 { VEX_LEN_TABLE (VEX_LEN_0F6E_P_2
) },
5134 /* PREFIX_VEX_0F6F */
5137 { VEX_W_TABLE (VEX_W_0F6F_P_1
) },
5138 { VEX_W_TABLE (VEX_W_0F6F_P_2
) },
5141 /* PREFIX_VEX_0F70 */
5144 { VEX_W_TABLE (VEX_W_0F70_P_1
) },
5145 { VEX_W_TABLE (VEX_W_0F70_P_2
) },
5146 { VEX_W_TABLE (VEX_W_0F70_P_3
) },
5149 /* PREFIX_VEX_0F71_REG_2 */
5153 { VEX_W_TABLE (VEX_W_0F71_R_2_P_2
) },
5156 /* PREFIX_VEX_0F71_REG_4 */
5160 { VEX_W_TABLE (VEX_W_0F71_R_4_P_2
) },
5163 /* PREFIX_VEX_0F71_REG_6 */
5167 { VEX_W_TABLE (VEX_W_0F71_R_6_P_2
) },
5170 /* PREFIX_VEX_0F72_REG_2 */
5174 { VEX_W_TABLE (VEX_W_0F72_R_2_P_2
) },
5177 /* PREFIX_VEX_0F72_REG_4 */
5181 { VEX_W_TABLE (VEX_W_0F72_R_4_P_2
) },
5184 /* PREFIX_VEX_0F72_REG_6 */
5188 { VEX_W_TABLE (VEX_W_0F72_R_6_P_2
) },
5191 /* PREFIX_VEX_0F73_REG_2 */
5195 { VEX_W_TABLE (VEX_W_0F73_R_2_P_2
) },
5198 /* PREFIX_VEX_0F73_REG_3 */
5202 { VEX_W_TABLE (VEX_W_0F73_R_3_P_2
) },
5205 /* PREFIX_VEX_0F73_REG_6 */
5209 { VEX_W_TABLE (VEX_W_0F73_R_6_P_2
) },
5212 /* PREFIX_VEX_0F73_REG_7 */
5216 { VEX_W_TABLE (VEX_W_0F73_R_7_P_2
) },
5219 /* PREFIX_VEX_0F74 */
5223 { VEX_W_TABLE (VEX_W_0F74_P_2
) },
5226 /* PREFIX_VEX_0F75 */
5230 { VEX_W_TABLE (VEX_W_0F75_P_2
) },
5233 /* PREFIX_VEX_0F76 */
5237 { VEX_W_TABLE (VEX_W_0F76_P_2
) },
5240 /* PREFIX_VEX_0F77 */
5242 { VEX_W_TABLE (VEX_W_0F77_P_0
) },
5245 /* PREFIX_VEX_0F7C */
5249 { VEX_W_TABLE (VEX_W_0F7C_P_2
) },
5250 { VEX_W_TABLE (VEX_W_0F7C_P_3
) },
5253 /* PREFIX_VEX_0F7D */
5257 { VEX_W_TABLE (VEX_W_0F7D_P_2
) },
5258 { VEX_W_TABLE (VEX_W_0F7D_P_3
) },
5261 /* PREFIX_VEX_0F7E */
5264 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_1
) },
5265 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_2
) },
5268 /* PREFIX_VEX_0F7F */
5271 { VEX_W_TABLE (VEX_W_0F7F_P_1
) },
5272 { VEX_W_TABLE (VEX_W_0F7F_P_2
) },
5275 /* PREFIX_VEX_0F90 */
5277 { VEX_LEN_TABLE (VEX_LEN_0F90_P_0
) },
5279 { VEX_LEN_TABLE (VEX_LEN_0F90_P_2
) },
5282 /* PREFIX_VEX_0F91 */
5284 { VEX_LEN_TABLE (VEX_LEN_0F91_P_0
) },
5286 { VEX_LEN_TABLE (VEX_LEN_0F91_P_2
) },
5289 /* PREFIX_VEX_0F92 */
5291 { VEX_LEN_TABLE (VEX_LEN_0F92_P_0
) },
5293 { VEX_LEN_TABLE (VEX_LEN_0F92_P_2
) },
5294 { VEX_LEN_TABLE (VEX_LEN_0F92_P_3
) },
5297 /* PREFIX_VEX_0F93 */
5299 { VEX_LEN_TABLE (VEX_LEN_0F93_P_0
) },
5301 { VEX_LEN_TABLE (VEX_LEN_0F93_P_2
) },
5302 { VEX_LEN_TABLE (VEX_LEN_0F93_P_3
) },
5305 /* PREFIX_VEX_0F98 */
5307 { VEX_LEN_TABLE (VEX_LEN_0F98_P_0
) },
5309 { VEX_LEN_TABLE (VEX_LEN_0F98_P_2
) },
5312 /* PREFIX_VEX_0F99 */
5314 { VEX_LEN_TABLE (VEX_LEN_0F99_P_0
) },
5316 { VEX_LEN_TABLE (VEX_LEN_0F99_P_2
) },
5319 /* PREFIX_VEX_0FC2 */
5321 { VEX_W_TABLE (VEX_W_0FC2_P_0
) },
5322 { VEX_LEN_TABLE (VEX_LEN_0FC2_P_1
) },
5323 { VEX_W_TABLE (VEX_W_0FC2_P_2
) },
5324 { VEX_LEN_TABLE (VEX_LEN_0FC2_P_3
) },
5327 /* PREFIX_VEX_0FC4 */
5331 { VEX_LEN_TABLE (VEX_LEN_0FC4_P_2
) },
5334 /* PREFIX_VEX_0FC5 */
5338 { VEX_LEN_TABLE (VEX_LEN_0FC5_P_2
) },
5341 /* PREFIX_VEX_0FD0 */
5345 { VEX_W_TABLE (VEX_W_0FD0_P_2
) },
5346 { VEX_W_TABLE (VEX_W_0FD0_P_3
) },
5349 /* PREFIX_VEX_0FD1 */
5353 { VEX_W_TABLE (VEX_W_0FD1_P_2
) },
5356 /* PREFIX_VEX_0FD2 */
5360 { VEX_W_TABLE (VEX_W_0FD2_P_2
) },
5363 /* PREFIX_VEX_0FD3 */
5367 { VEX_W_TABLE (VEX_W_0FD3_P_2
) },
5370 /* PREFIX_VEX_0FD4 */
5374 { VEX_W_TABLE (VEX_W_0FD4_P_2
) },
5377 /* PREFIX_VEX_0FD5 */
5381 { VEX_W_TABLE (VEX_W_0FD5_P_2
) },
5384 /* PREFIX_VEX_0FD6 */
5388 { VEX_LEN_TABLE (VEX_LEN_0FD6_P_2
) },
5391 /* PREFIX_VEX_0FD7 */
5395 { MOD_TABLE (MOD_VEX_0FD7_PREFIX_2
) },
5398 /* PREFIX_VEX_0FD8 */
5402 { VEX_W_TABLE (VEX_W_0FD8_P_2
) },
5405 /* PREFIX_VEX_0FD9 */
5409 { VEX_W_TABLE (VEX_W_0FD9_P_2
) },
5412 /* PREFIX_VEX_0FDA */
5416 { VEX_W_TABLE (VEX_W_0FDA_P_2
) },
5419 /* PREFIX_VEX_0FDB */
5423 { VEX_W_TABLE (VEX_W_0FDB_P_2
) },
5426 /* PREFIX_VEX_0FDC */
5430 { VEX_W_TABLE (VEX_W_0FDC_P_2
) },
5433 /* PREFIX_VEX_0FDD */
5437 { VEX_W_TABLE (VEX_W_0FDD_P_2
) },
5440 /* PREFIX_VEX_0FDE */
5444 { VEX_W_TABLE (VEX_W_0FDE_P_2
) },
5447 /* PREFIX_VEX_0FDF */
5451 { VEX_W_TABLE (VEX_W_0FDF_P_2
) },
5454 /* PREFIX_VEX_0FE0 */
5458 { VEX_W_TABLE (VEX_W_0FE0_P_2
) },
5461 /* PREFIX_VEX_0FE1 */
5465 { VEX_W_TABLE (VEX_W_0FE1_P_2
) },
5468 /* PREFIX_VEX_0FE2 */
5472 { VEX_W_TABLE (VEX_W_0FE2_P_2
) },
5475 /* PREFIX_VEX_0FE3 */
5479 { VEX_W_TABLE (VEX_W_0FE3_P_2
) },
5482 /* PREFIX_VEX_0FE4 */
5486 { VEX_W_TABLE (VEX_W_0FE4_P_2
) },
5489 /* PREFIX_VEX_0FE5 */
5493 { VEX_W_TABLE (VEX_W_0FE5_P_2
) },
5496 /* PREFIX_VEX_0FE6 */
5499 { VEX_W_TABLE (VEX_W_0FE6_P_1
) },
5500 { VEX_W_TABLE (VEX_W_0FE6_P_2
) },
5501 { VEX_W_TABLE (VEX_W_0FE6_P_3
) },
5504 /* PREFIX_VEX_0FE7 */
5508 { MOD_TABLE (MOD_VEX_0FE7_PREFIX_2
) },
5511 /* PREFIX_VEX_0FE8 */
5515 { VEX_W_TABLE (VEX_W_0FE8_P_2
) },
5518 /* PREFIX_VEX_0FE9 */
5522 { VEX_W_TABLE (VEX_W_0FE9_P_2
) },
5525 /* PREFIX_VEX_0FEA */
5529 { VEX_W_TABLE (VEX_W_0FEA_P_2
) },
5532 /* PREFIX_VEX_0FEB */
5536 { VEX_W_TABLE (VEX_W_0FEB_P_2
) },
5539 /* PREFIX_VEX_0FEC */
5543 { VEX_W_TABLE (VEX_W_0FEC_P_2
) },
5546 /* PREFIX_VEX_0FED */
5550 { VEX_W_TABLE (VEX_W_0FED_P_2
) },
5553 /* PREFIX_VEX_0FEE */
5557 { VEX_W_TABLE (VEX_W_0FEE_P_2
) },
5560 /* PREFIX_VEX_0FEF */
5564 { VEX_W_TABLE (VEX_W_0FEF_P_2
) },
5567 /* PREFIX_VEX_0FF0 */
5572 { MOD_TABLE (MOD_VEX_0FF0_PREFIX_3
) },
5575 /* PREFIX_VEX_0FF1 */
5579 { VEX_W_TABLE (VEX_W_0FF1_P_2
) },
5582 /* PREFIX_VEX_0FF2 */
5586 { VEX_W_TABLE (VEX_W_0FF2_P_2
) },
5589 /* PREFIX_VEX_0FF3 */
5593 { VEX_W_TABLE (VEX_W_0FF3_P_2
) },
5596 /* PREFIX_VEX_0FF4 */
5600 { VEX_W_TABLE (VEX_W_0FF4_P_2
) },
5603 /* PREFIX_VEX_0FF5 */
5607 { VEX_W_TABLE (VEX_W_0FF5_P_2
) },
5610 /* PREFIX_VEX_0FF6 */
5614 { VEX_W_TABLE (VEX_W_0FF6_P_2
) },
5617 /* PREFIX_VEX_0FF7 */
5621 { VEX_LEN_TABLE (VEX_LEN_0FF7_P_2
) },
5624 /* PREFIX_VEX_0FF8 */
5628 { VEX_W_TABLE (VEX_W_0FF8_P_2
) },
5631 /* PREFIX_VEX_0FF9 */
5635 { VEX_W_TABLE (VEX_W_0FF9_P_2
) },
5638 /* PREFIX_VEX_0FFA */
5642 { VEX_W_TABLE (VEX_W_0FFA_P_2
) },
5645 /* PREFIX_VEX_0FFB */
5649 { VEX_W_TABLE (VEX_W_0FFB_P_2
) },
5652 /* PREFIX_VEX_0FFC */
5656 { VEX_W_TABLE (VEX_W_0FFC_P_2
) },
5659 /* PREFIX_VEX_0FFD */
5663 { VEX_W_TABLE (VEX_W_0FFD_P_2
) },
5666 /* PREFIX_VEX_0FFE */
5670 { VEX_W_TABLE (VEX_W_0FFE_P_2
) },
5673 /* PREFIX_VEX_0F3800 */
5677 { VEX_W_TABLE (VEX_W_0F3800_P_2
) },
5680 /* PREFIX_VEX_0F3801 */
5684 { VEX_W_TABLE (VEX_W_0F3801_P_2
) },
5687 /* PREFIX_VEX_0F3802 */
5691 { VEX_W_TABLE (VEX_W_0F3802_P_2
) },
5694 /* PREFIX_VEX_0F3803 */
5698 { VEX_W_TABLE (VEX_W_0F3803_P_2
) },
5701 /* PREFIX_VEX_0F3804 */
5705 { VEX_W_TABLE (VEX_W_0F3804_P_2
) },
5708 /* PREFIX_VEX_0F3805 */
5712 { VEX_W_TABLE (VEX_W_0F3805_P_2
) },
5715 /* PREFIX_VEX_0F3806 */
5719 { VEX_W_TABLE (VEX_W_0F3806_P_2
) },
5722 /* PREFIX_VEX_0F3807 */
5726 { VEX_W_TABLE (VEX_W_0F3807_P_2
) },
5729 /* PREFIX_VEX_0F3808 */
5733 { VEX_W_TABLE (VEX_W_0F3808_P_2
) },
5736 /* PREFIX_VEX_0F3809 */
5740 { VEX_W_TABLE (VEX_W_0F3809_P_2
) },
5743 /* PREFIX_VEX_0F380A */
5747 { VEX_W_TABLE (VEX_W_0F380A_P_2
) },
5750 /* PREFIX_VEX_0F380B */
5754 { VEX_W_TABLE (VEX_W_0F380B_P_2
) },
5757 /* PREFIX_VEX_0F380C */
5761 { VEX_W_TABLE (VEX_W_0F380C_P_2
) },
5764 /* PREFIX_VEX_0F380D */
5768 { VEX_W_TABLE (VEX_W_0F380D_P_2
) },
5771 /* PREFIX_VEX_0F380E */
5775 { VEX_W_TABLE (VEX_W_0F380E_P_2
) },
5778 /* PREFIX_VEX_0F380F */
5782 { VEX_W_TABLE (VEX_W_0F380F_P_2
) },
5785 /* PREFIX_VEX_0F3813 */
5789 { "vcvtph2ps", { XM
, EXxmmq
}, 0 },
5792 /* PREFIX_VEX_0F3816 */
5796 { VEX_LEN_TABLE (VEX_LEN_0F3816_P_2
) },
5799 /* PREFIX_VEX_0F3817 */
5803 { VEX_W_TABLE (VEX_W_0F3817_P_2
) },
5806 /* PREFIX_VEX_0F3818 */
5810 { VEX_W_TABLE (VEX_W_0F3818_P_2
) },
5813 /* PREFIX_VEX_0F3819 */
5817 { VEX_LEN_TABLE (VEX_LEN_0F3819_P_2
) },
5820 /* PREFIX_VEX_0F381A */
5824 { MOD_TABLE (MOD_VEX_0F381A_PREFIX_2
) },
5827 /* PREFIX_VEX_0F381C */
5831 { VEX_W_TABLE (VEX_W_0F381C_P_2
) },
5834 /* PREFIX_VEX_0F381D */
5838 { VEX_W_TABLE (VEX_W_0F381D_P_2
) },
5841 /* PREFIX_VEX_0F381E */
5845 { VEX_W_TABLE (VEX_W_0F381E_P_2
) },
5848 /* PREFIX_VEX_0F3820 */
5852 { VEX_W_TABLE (VEX_W_0F3820_P_2
) },
5855 /* PREFIX_VEX_0F3821 */
5859 { VEX_W_TABLE (VEX_W_0F3821_P_2
) },
5862 /* PREFIX_VEX_0F3822 */
5866 { VEX_W_TABLE (VEX_W_0F3822_P_2
) },
5869 /* PREFIX_VEX_0F3823 */
5873 { VEX_W_TABLE (VEX_W_0F3823_P_2
) },
5876 /* PREFIX_VEX_0F3824 */
5880 { VEX_W_TABLE (VEX_W_0F3824_P_2
) },
5883 /* PREFIX_VEX_0F3825 */
5887 { VEX_W_TABLE (VEX_W_0F3825_P_2
) },
5890 /* PREFIX_VEX_0F3828 */
5894 { VEX_W_TABLE (VEX_W_0F3828_P_2
) },
5897 /* PREFIX_VEX_0F3829 */
5901 { VEX_W_TABLE (VEX_W_0F3829_P_2
) },
5904 /* PREFIX_VEX_0F382A */
5908 { MOD_TABLE (MOD_VEX_0F382A_PREFIX_2
) },
5911 /* PREFIX_VEX_0F382B */
5915 { VEX_W_TABLE (VEX_W_0F382B_P_2
) },
5918 /* PREFIX_VEX_0F382C */
5922 { MOD_TABLE (MOD_VEX_0F382C_PREFIX_2
) },
5925 /* PREFIX_VEX_0F382D */
5929 { MOD_TABLE (MOD_VEX_0F382D_PREFIX_2
) },
5932 /* PREFIX_VEX_0F382E */
5936 { MOD_TABLE (MOD_VEX_0F382E_PREFIX_2
) },
5939 /* PREFIX_VEX_0F382F */
5943 { MOD_TABLE (MOD_VEX_0F382F_PREFIX_2
) },
5946 /* PREFIX_VEX_0F3830 */
5950 { VEX_W_TABLE (VEX_W_0F3830_P_2
) },
5953 /* PREFIX_VEX_0F3831 */
5957 { VEX_W_TABLE (VEX_W_0F3831_P_2
) },
5960 /* PREFIX_VEX_0F3832 */
5964 { VEX_W_TABLE (VEX_W_0F3832_P_2
) },
5967 /* PREFIX_VEX_0F3833 */
5971 { VEX_W_TABLE (VEX_W_0F3833_P_2
) },
5974 /* PREFIX_VEX_0F3834 */
5978 { VEX_W_TABLE (VEX_W_0F3834_P_2
) },
5981 /* PREFIX_VEX_0F3835 */
5985 { VEX_W_TABLE (VEX_W_0F3835_P_2
) },
5988 /* PREFIX_VEX_0F3836 */
5992 { VEX_LEN_TABLE (VEX_LEN_0F3836_P_2
) },
5995 /* PREFIX_VEX_0F3837 */
5999 { VEX_W_TABLE (VEX_W_0F3837_P_2
) },
6002 /* PREFIX_VEX_0F3838 */
6006 { VEX_W_TABLE (VEX_W_0F3838_P_2
) },
6009 /* PREFIX_VEX_0F3839 */
6013 { VEX_W_TABLE (VEX_W_0F3839_P_2
) },
6016 /* PREFIX_VEX_0F383A */
6020 { VEX_W_TABLE (VEX_W_0F383A_P_2
) },
6023 /* PREFIX_VEX_0F383B */
6027 { VEX_W_TABLE (VEX_W_0F383B_P_2
) },
6030 /* PREFIX_VEX_0F383C */
6034 { VEX_W_TABLE (VEX_W_0F383C_P_2
) },
6037 /* PREFIX_VEX_0F383D */
6041 { VEX_W_TABLE (VEX_W_0F383D_P_2
) },
6044 /* PREFIX_VEX_0F383E */
6048 { VEX_W_TABLE (VEX_W_0F383E_P_2
) },
6051 /* PREFIX_VEX_0F383F */
6055 { VEX_W_TABLE (VEX_W_0F383F_P_2
) },
6058 /* PREFIX_VEX_0F3840 */
6062 { VEX_W_TABLE (VEX_W_0F3840_P_2
) },
6065 /* PREFIX_VEX_0F3841 */
6069 { VEX_LEN_TABLE (VEX_LEN_0F3841_P_2
) },
6072 /* PREFIX_VEX_0F3845 */
6076 { "vpsrlv%LW", { XM
, Vex
, EXx
}, 0 },
6079 /* PREFIX_VEX_0F3846 */
6083 { VEX_W_TABLE (VEX_W_0F3846_P_2
) },
6086 /* PREFIX_VEX_0F3847 */
6090 { "vpsllv%LW", { XM
, Vex
, EXx
}, 0 },
6093 /* PREFIX_VEX_0F3858 */
6097 { VEX_W_TABLE (VEX_W_0F3858_P_2
) },
6100 /* PREFIX_VEX_0F3859 */
6104 { VEX_W_TABLE (VEX_W_0F3859_P_2
) },
6107 /* PREFIX_VEX_0F385A */
6111 { MOD_TABLE (MOD_VEX_0F385A_PREFIX_2
) },
6114 /* PREFIX_VEX_0F3878 */
6118 { VEX_W_TABLE (VEX_W_0F3878_P_2
) },
6121 /* PREFIX_VEX_0F3879 */
6125 { VEX_W_TABLE (VEX_W_0F3879_P_2
) },
6128 /* PREFIX_VEX_0F388C */
6132 { MOD_TABLE (MOD_VEX_0F388C_PREFIX_2
) },
6135 /* PREFIX_VEX_0F388E */
6139 { MOD_TABLE (MOD_VEX_0F388E_PREFIX_2
) },
6142 /* PREFIX_VEX_0F3890 */
6146 { "vpgatherd%LW", { XM
, MVexVSIBDWpX
, Vex
}, 0 },
6149 /* PREFIX_VEX_0F3891 */
6153 { "vpgatherq%LW", { XMGatherQ
, MVexVSIBQWpX
, VexGatherQ
}, 0 },
6156 /* PREFIX_VEX_0F3892 */
6160 { "vgatherdp%XW", { XM
, MVexVSIBDWpX
, Vex
}, 0 },
6163 /* PREFIX_VEX_0F3893 */
6167 { "vgatherqp%XW", { XMGatherQ
, MVexVSIBQWpX
, VexGatherQ
}, 0 },
6170 /* PREFIX_VEX_0F3896 */
6174 { "vfmaddsub132p%XW", { XM
, Vex
, EXx
}, 0 },
6177 /* PREFIX_VEX_0F3897 */
6181 { "vfmsubadd132p%XW", { XM
, Vex
, EXx
}, 0 },
6184 /* PREFIX_VEX_0F3898 */
6188 { "vfmadd132p%XW", { XM
, Vex
, EXx
}, 0 },
6191 /* PREFIX_VEX_0F3899 */
6195 { "vfmadd132s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
}, 0 },
6198 /* PREFIX_VEX_0F389A */
6202 { "vfmsub132p%XW", { XM
, Vex
, EXx
}, 0 },
6205 /* PREFIX_VEX_0F389B */
6209 { "vfmsub132s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
}, 0 },
6212 /* PREFIX_VEX_0F389C */
6216 { "vfnmadd132p%XW", { XM
, Vex
, EXx
}, 0 },
6219 /* PREFIX_VEX_0F389D */
6223 { "vfnmadd132s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
}, 0 },
6226 /* PREFIX_VEX_0F389E */
6230 { "vfnmsub132p%XW", { XM
, Vex
, EXx
}, 0 },
6233 /* PREFIX_VEX_0F389F */
6237 { "vfnmsub132s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
}, 0 },
6240 /* PREFIX_VEX_0F38A6 */
6244 { "vfmaddsub213p%XW", { XM
, Vex
, EXx
}, 0 },
6248 /* PREFIX_VEX_0F38A7 */
6252 { "vfmsubadd213p%XW", { XM
, Vex
, EXx
}, 0 },
6255 /* PREFIX_VEX_0F38A8 */
6259 { "vfmadd213p%XW", { XM
, Vex
, EXx
}, 0 },
6262 /* PREFIX_VEX_0F38A9 */
6266 { "vfmadd213s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
}, 0 },
6269 /* PREFIX_VEX_0F38AA */
6273 { "vfmsub213p%XW", { XM
, Vex
, EXx
}, 0 },
6276 /* PREFIX_VEX_0F38AB */
6280 { "vfmsub213s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
}, 0 },
6283 /* PREFIX_VEX_0F38AC */
6287 { "vfnmadd213p%XW", { XM
, Vex
, EXx
}, 0 },
6290 /* PREFIX_VEX_0F38AD */
6294 { "vfnmadd213s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
}, 0 },
6297 /* PREFIX_VEX_0F38AE */
6301 { "vfnmsub213p%XW", { XM
, Vex
, EXx
}, 0 },
6304 /* PREFIX_VEX_0F38AF */
6308 { "vfnmsub213s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
}, 0 },
6311 /* PREFIX_VEX_0F38B6 */
6315 { "vfmaddsub231p%XW", { XM
, Vex
, EXx
}, 0 },
6318 /* PREFIX_VEX_0F38B7 */
6322 { "vfmsubadd231p%XW", { XM
, Vex
, EXx
}, 0 },
6325 /* PREFIX_VEX_0F38B8 */
6329 { "vfmadd231p%XW", { XM
, Vex
, EXx
}, 0 },
6332 /* PREFIX_VEX_0F38B9 */
6336 { "vfmadd231s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
}, 0 },
6339 /* PREFIX_VEX_0F38BA */
6343 { "vfmsub231p%XW", { XM
, Vex
, EXx
}, 0 },
6346 /* PREFIX_VEX_0F38BB */
6350 { "vfmsub231s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
}, 0 },
6353 /* PREFIX_VEX_0F38BC */
6357 { "vfnmadd231p%XW", { XM
, Vex
, EXx
}, 0 },
6360 /* PREFIX_VEX_0F38BD */
6364 { "vfnmadd231s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
}, 0 },
6367 /* PREFIX_VEX_0F38BE */
6371 { "vfnmsub231p%XW", { XM
, Vex
, EXx
}, 0 },
6374 /* PREFIX_VEX_0F38BF */
6378 { "vfnmsub231s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
}, 0 },
6381 /* PREFIX_VEX_0F38CF */
6385 { VEX_W_TABLE (VEX_W_0F38CF_P_2
) },
6388 /* PREFIX_VEX_0F38DB */
6392 { VEX_LEN_TABLE (VEX_LEN_0F38DB_P_2
) },
6395 /* PREFIX_VEX_0F38DC */
6399 { "vaesenc", { XM
, Vex
, EXx
}, 0 },
6402 /* PREFIX_VEX_0F38DD */
6406 { "vaesenclast", { XM
, Vex
, EXx
}, 0 },
6409 /* PREFIX_VEX_0F38DE */
6413 { "vaesdec", { XM
, Vex
, EXx
}, 0 },
6416 /* PREFIX_VEX_0F38DF */
6420 { "vaesdeclast", { XM
, Vex
, EXx
}, 0 },
6423 /* PREFIX_VEX_0F38F2 */
6425 { VEX_LEN_TABLE (VEX_LEN_0F38F2_P_0
) },
6428 /* PREFIX_VEX_0F38F3_REG_1 */
6430 { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_1_P_0
) },
6433 /* PREFIX_VEX_0F38F3_REG_2 */
6435 { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_2_P_0
) },
6438 /* PREFIX_VEX_0F38F3_REG_3 */
6440 { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_3_P_0
) },
6443 /* PREFIX_VEX_0F38F5 */
6445 { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_0
) },
6446 { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_1
) },
6448 { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_3
) },
6451 /* PREFIX_VEX_0F38F6 */
6456 { VEX_LEN_TABLE (VEX_LEN_0F38F6_P_3
) },
6459 /* PREFIX_VEX_0F38F7 */
6461 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_0
) },
6462 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_1
) },
6463 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_2
) },
6464 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_3
) },
6467 /* PREFIX_VEX_0F3A00 */
6471 { VEX_LEN_TABLE (VEX_LEN_0F3A00_P_2
) },
6474 /* PREFIX_VEX_0F3A01 */
6478 { VEX_LEN_TABLE (VEX_LEN_0F3A01_P_2
) },
6481 /* PREFIX_VEX_0F3A02 */
6485 { VEX_W_TABLE (VEX_W_0F3A02_P_2
) },
6488 /* PREFIX_VEX_0F3A04 */
6492 { VEX_W_TABLE (VEX_W_0F3A04_P_2
) },
6495 /* PREFIX_VEX_0F3A05 */
6499 { VEX_W_TABLE (VEX_W_0F3A05_P_2
) },
6502 /* PREFIX_VEX_0F3A06 */
6506 { VEX_LEN_TABLE (VEX_LEN_0F3A06_P_2
) },
6509 /* PREFIX_VEX_0F3A08 */
6513 { VEX_W_TABLE (VEX_W_0F3A08_P_2
) },
6516 /* PREFIX_VEX_0F3A09 */
6520 { VEX_W_TABLE (VEX_W_0F3A09_P_2
) },
6523 /* PREFIX_VEX_0F3A0A */
6527 { VEX_LEN_TABLE (VEX_LEN_0F3A0A_P_2
) },
6530 /* PREFIX_VEX_0F3A0B */
6534 { VEX_LEN_TABLE (VEX_LEN_0F3A0B_P_2
) },
6537 /* PREFIX_VEX_0F3A0C */
6541 { VEX_W_TABLE (VEX_W_0F3A0C_P_2
) },
6544 /* PREFIX_VEX_0F3A0D */
6548 { VEX_W_TABLE (VEX_W_0F3A0D_P_2
) },
6551 /* PREFIX_VEX_0F3A0E */
6555 { VEX_W_TABLE (VEX_W_0F3A0E_P_2
) },
6558 /* PREFIX_VEX_0F3A0F */
6562 { VEX_W_TABLE (VEX_W_0F3A0F_P_2
) },
6565 /* PREFIX_VEX_0F3A14 */
6569 { VEX_LEN_TABLE (VEX_LEN_0F3A14_P_2
) },
6572 /* PREFIX_VEX_0F3A15 */
6576 { VEX_LEN_TABLE (VEX_LEN_0F3A15_P_2
) },
6579 /* PREFIX_VEX_0F3A16 */
6583 { VEX_LEN_TABLE (VEX_LEN_0F3A16_P_2
) },
6586 /* PREFIX_VEX_0F3A17 */
6590 { VEX_LEN_TABLE (VEX_LEN_0F3A17_P_2
) },
6593 /* PREFIX_VEX_0F3A18 */
6597 { VEX_LEN_TABLE (VEX_LEN_0F3A18_P_2
) },
6600 /* PREFIX_VEX_0F3A19 */
6604 { VEX_LEN_TABLE (VEX_LEN_0F3A19_P_2
) },
6607 /* PREFIX_VEX_0F3A1D */
6611 { "vcvtps2ph", { EXxmmq
, XM
, Ib
}, 0 },
6614 /* PREFIX_VEX_0F3A20 */
6618 { VEX_LEN_TABLE (VEX_LEN_0F3A20_P_2
) },
6621 /* PREFIX_VEX_0F3A21 */
6625 { VEX_LEN_TABLE (VEX_LEN_0F3A21_P_2
) },
6628 /* PREFIX_VEX_0F3A22 */
6632 { VEX_LEN_TABLE (VEX_LEN_0F3A22_P_2
) },
6635 /* PREFIX_VEX_0F3A30 */
6639 { VEX_LEN_TABLE (VEX_LEN_0F3A30_P_2
) },
6642 /* PREFIX_VEX_0F3A31 */
6646 { VEX_LEN_TABLE (VEX_LEN_0F3A31_P_2
) },
6649 /* PREFIX_VEX_0F3A32 */
6653 { VEX_LEN_TABLE (VEX_LEN_0F3A32_P_2
) },
6656 /* PREFIX_VEX_0F3A33 */
6660 { VEX_LEN_TABLE (VEX_LEN_0F3A33_P_2
) },
6663 /* PREFIX_VEX_0F3A38 */
6667 { VEX_LEN_TABLE (VEX_LEN_0F3A38_P_2
) },
6670 /* PREFIX_VEX_0F3A39 */
6674 { VEX_LEN_TABLE (VEX_LEN_0F3A39_P_2
) },
6677 /* PREFIX_VEX_0F3A40 */
6681 { VEX_W_TABLE (VEX_W_0F3A40_P_2
) },
6684 /* PREFIX_VEX_0F3A41 */
6688 { VEX_LEN_TABLE (VEX_LEN_0F3A41_P_2
) },
6691 /* PREFIX_VEX_0F3A42 */
6695 { VEX_W_TABLE (VEX_W_0F3A42_P_2
) },
6698 /* PREFIX_VEX_0F3A44 */
6702 { "vpclmulqdq", { XM
, Vex
, EXx
, PCLMUL
}, 0 },
6705 /* PREFIX_VEX_0F3A46 */
6709 { VEX_LEN_TABLE (VEX_LEN_0F3A46_P_2
) },
6712 /* PREFIX_VEX_0F3A48 */
6716 { VEX_W_TABLE (VEX_W_0F3A48_P_2
) },
6719 /* PREFIX_VEX_0F3A49 */
6723 { VEX_W_TABLE (VEX_W_0F3A49_P_2
) },
6726 /* PREFIX_VEX_0F3A4A */
6730 { VEX_W_TABLE (VEX_W_0F3A4A_P_2
) },
6733 /* PREFIX_VEX_0F3A4B */
6737 { VEX_W_TABLE (VEX_W_0F3A4B_P_2
) },
6740 /* PREFIX_VEX_0F3A4C */
6744 { VEX_W_TABLE (VEX_W_0F3A4C_P_2
) },
6747 /* PREFIX_VEX_0F3A5C */
6751 { "vfmaddsubps", { XMVexW
, Vex
, EXVexW
, EXVexW
, VexI4
}, 0 },
6754 /* PREFIX_VEX_0F3A5D */
6758 { "vfmaddsubpd", { XMVexW
, Vex
, EXVexW
, EXVexW
, VexI4
}, 0 },
6761 /* PREFIX_VEX_0F3A5E */
6765 { "vfmsubaddps", { XMVexW
, Vex
, EXVexW
, EXVexW
, VexI4
}, 0 },
6768 /* PREFIX_VEX_0F3A5F */
6772 { "vfmsubaddpd", { XMVexW
, Vex
, EXVexW
, EXVexW
, VexI4
}, 0 },
6775 /* PREFIX_VEX_0F3A60 */
6779 { VEX_LEN_TABLE (VEX_LEN_0F3A60_P_2
) },
6783 /* PREFIX_VEX_0F3A61 */
6787 { VEX_LEN_TABLE (VEX_LEN_0F3A61_P_2
) },
6790 /* PREFIX_VEX_0F3A62 */
6794 { VEX_LEN_TABLE (VEX_LEN_0F3A62_P_2
) },
6797 /* PREFIX_VEX_0F3A63 */
6801 { VEX_LEN_TABLE (VEX_LEN_0F3A63_P_2
) },
6804 /* PREFIX_VEX_0F3A68 */
6808 { "vfmaddps", { XMVexW
, Vex
, EXVexW
, EXVexW
, VexI4
}, 0 },
6811 /* PREFIX_VEX_0F3A69 */
6815 { "vfmaddpd", { XMVexW
, Vex
, EXVexW
, EXVexW
, VexI4
}, 0 },
6818 /* PREFIX_VEX_0F3A6A */
6822 { VEX_LEN_TABLE (VEX_LEN_0F3A6A_P_2
) },
6825 /* PREFIX_VEX_0F3A6B */
6829 { VEX_LEN_TABLE (VEX_LEN_0F3A6B_P_2
) },
6832 /* PREFIX_VEX_0F3A6C */
6836 { "vfmsubps", { XMVexW
, Vex
, EXVexW
, EXVexW
, VexI4
}, 0 },
6839 /* PREFIX_VEX_0F3A6D */
6843 { "vfmsubpd", { XMVexW
, Vex
, EXVexW
, EXVexW
, VexI4
}, 0 },
6846 /* PREFIX_VEX_0F3A6E */
6850 { VEX_LEN_TABLE (VEX_LEN_0F3A6E_P_2
) },
6853 /* PREFIX_VEX_0F3A6F */
6857 { VEX_LEN_TABLE (VEX_LEN_0F3A6F_P_2
) },
6860 /* PREFIX_VEX_0F3A78 */
6864 { "vfnmaddps", { XMVexW
, Vex
, EXVexW
, EXVexW
, VexI4
}, 0 },
6867 /* PREFIX_VEX_0F3A79 */
6871 { "vfnmaddpd", { XMVexW
, Vex
, EXVexW
, EXVexW
, VexI4
}, 0 },
6874 /* PREFIX_VEX_0F3A7A */
6878 { VEX_LEN_TABLE (VEX_LEN_0F3A7A_P_2
) },
6881 /* PREFIX_VEX_0F3A7B */
6885 { VEX_LEN_TABLE (VEX_LEN_0F3A7B_P_2
) },
6888 /* PREFIX_VEX_0F3A7C */
6892 { "vfnmsubps", { XMVexW
, Vex
, EXVexW
, EXVexW
, VexI4
}, 0 },
6896 /* PREFIX_VEX_0F3A7D */
6900 { "vfnmsubpd", { XMVexW
, Vex
, EXVexW
, EXVexW
, VexI4
}, 0 },
6903 /* PREFIX_VEX_0F3A7E */
6907 { VEX_LEN_TABLE (VEX_LEN_0F3A7E_P_2
) },
6910 /* PREFIX_VEX_0F3A7F */
6914 { VEX_LEN_TABLE (VEX_LEN_0F3A7F_P_2
) },
6917 /* PREFIX_VEX_0F3ACE */
6921 { VEX_W_TABLE (VEX_W_0F3ACE_P_2
) },
6924 /* PREFIX_VEX_0F3ACF */
6928 { VEX_W_TABLE (VEX_W_0F3ACF_P_2
) },
6931 /* PREFIX_VEX_0F3ADF */
6935 { VEX_LEN_TABLE (VEX_LEN_0F3ADF_P_2
) },
6938 /* PREFIX_VEX_0F3AF0 */
6943 { VEX_LEN_TABLE (VEX_LEN_0F3AF0_P_3
) },
6946 #define NEED_PREFIX_TABLE
6947 #include "i386-dis-evex.h"
6948 #undef NEED_PREFIX_TABLE
6951 static const struct dis386 x86_64_table
[][2] = {
6954 { "pushP", { es
}, 0 },
6959 { "popP", { es
}, 0 },
6964 { "pushP", { cs
}, 0 },
6969 { "pushP", { ss
}, 0 },
6974 { "popP", { ss
}, 0 },
6979 { "pushP", { ds
}, 0 },
6984 { "popP", { ds
}, 0 },
6989 { "daa", { XX
}, 0 },
6994 { "das", { XX
}, 0 },
6999 { "aaa", { XX
}, 0 },
7004 { "aas", { XX
}, 0 },
7009 { "pushaP", { XX
}, 0 },
7014 { "popaP", { XX
}, 0 },
7019 { MOD_TABLE (MOD_62_32BIT
) },
7020 { EVEX_TABLE (EVEX_0F
) },
7025 { "arpl", { Ew
, Gw
}, 0 },
7026 { "movs{lq|xd}", { Gv
, Ed
}, 0 },
7031 { "ins{R|}", { Yzr
, indirDX
}, 0 },
7032 { "ins{G|}", { Yzr
, indirDX
}, 0 },
7037 { "outs{R|}", { indirDXr
, Xz
}, 0 },
7038 { "outs{G|}", { indirDXr
, Xz
}, 0 },
7043 /* Opcode 0x82 is an alias of opcode 0x80 in 32-bit mode. */
7044 { REG_TABLE (REG_80
) },
7049 { "Jcall{T|}", { Ap
}, 0 },
7054 { MOD_TABLE (MOD_C4_32BIT
) },
7055 { VEX_C4_TABLE (VEX_0F
) },
7060 { MOD_TABLE (MOD_C5_32BIT
) },
7061 { VEX_C5_TABLE (VEX_0F
) },
7066 { "into", { XX
}, 0 },
7071 { "aam", { Ib
}, 0 },
7076 { "aad", { Ib
}, 0 },
7081 { "callP", { Jv
, BND
}, 0 },
7082 { "call@", { Jv
, BND
}, 0 }
7087 { "jmpP", { Jv
, BND
}, 0 },
7088 { "jmp@", { Jv
, BND
}, 0 }
7093 { "Jjmp{T|}", { Ap
}, 0 },
7096 /* X86_64_0F01_REG_0 */
7098 { "sgdt{Q|IQ}", { M
}, 0 },
7099 { "sgdt", { M
}, 0 },
7102 /* X86_64_0F01_REG_1 */
7104 { "sidt{Q|IQ}", { M
}, 0 },
7105 { "sidt", { M
}, 0 },
7108 /* X86_64_0F01_REG_2 */
7110 { "lgdt{Q|Q}", { M
}, 0 },
7111 { "lgdt", { M
}, 0 },
7114 /* X86_64_0F01_REG_3 */
7116 { "lidt{Q|Q}", { M
}, 0 },
7117 { "lidt", { M
}, 0 },
7121 static const struct dis386 three_byte_table
[][256] = {
7123 /* THREE_BYTE_0F38 */
7126 { "pshufb", { MX
, EM
}, PREFIX_OPCODE
},
7127 { "phaddw", { MX
, EM
}, PREFIX_OPCODE
},
7128 { "phaddd", { MX
, EM
}, PREFIX_OPCODE
},
7129 { "phaddsw", { MX
, EM
}, PREFIX_OPCODE
},
7130 { "pmaddubsw", { MX
, EM
}, PREFIX_OPCODE
},
7131 { "phsubw", { MX
, EM
}, PREFIX_OPCODE
},
7132 { "phsubd", { MX
, EM
}, PREFIX_OPCODE
},
7133 { "phsubsw", { MX
, EM
}, PREFIX_OPCODE
},
7135 { "psignb", { MX
, EM
}, PREFIX_OPCODE
},
7136 { "psignw", { MX
, EM
}, PREFIX_OPCODE
},
7137 { "psignd", { MX
, EM
}, PREFIX_OPCODE
},
7138 { "pmulhrsw", { MX
, EM
}, PREFIX_OPCODE
},
7144 { PREFIX_TABLE (PREFIX_0F3810
) },
7148 { PREFIX_TABLE (PREFIX_0F3814
) },
7149 { PREFIX_TABLE (PREFIX_0F3815
) },
7151 { PREFIX_TABLE (PREFIX_0F3817
) },
7157 { "pabsb", { MX
, EM
}, PREFIX_OPCODE
},
7158 { "pabsw", { MX
, EM
}, PREFIX_OPCODE
},
7159 { "pabsd", { MX
, EM
}, PREFIX_OPCODE
},
7162 { PREFIX_TABLE (PREFIX_0F3820
) },
7163 { PREFIX_TABLE (PREFIX_0F3821
) },
7164 { PREFIX_TABLE (PREFIX_0F3822
) },
7165 { PREFIX_TABLE (PREFIX_0F3823
) },
7166 { PREFIX_TABLE (PREFIX_0F3824
) },
7167 { PREFIX_TABLE (PREFIX_0F3825
) },
7171 { PREFIX_TABLE (PREFIX_0F3828
) },
7172 { PREFIX_TABLE (PREFIX_0F3829
) },
7173 { PREFIX_TABLE (PREFIX_0F382A
) },
7174 { PREFIX_TABLE (PREFIX_0F382B
) },
7180 { PREFIX_TABLE (PREFIX_0F3830
) },
7181 { PREFIX_TABLE (PREFIX_0F3831
) },
7182 { PREFIX_TABLE (PREFIX_0F3832
) },
7183 { PREFIX_TABLE (PREFIX_0F3833
) },
7184 { PREFIX_TABLE (PREFIX_0F3834
) },
7185 { PREFIX_TABLE (PREFIX_0F3835
) },
7187 { PREFIX_TABLE (PREFIX_0F3837
) },
7189 { PREFIX_TABLE (PREFIX_0F3838
) },
7190 { PREFIX_TABLE (PREFIX_0F3839
) },
7191 { PREFIX_TABLE (PREFIX_0F383A
) },
7192 { PREFIX_TABLE (PREFIX_0F383B
) },
7193 { PREFIX_TABLE (PREFIX_0F383C
) },
7194 { PREFIX_TABLE (PREFIX_0F383D
) },
7195 { PREFIX_TABLE (PREFIX_0F383E
) },
7196 { PREFIX_TABLE (PREFIX_0F383F
) },
7198 { PREFIX_TABLE (PREFIX_0F3840
) },
7199 { PREFIX_TABLE (PREFIX_0F3841
) },
7270 { PREFIX_TABLE (PREFIX_0F3880
) },
7271 { PREFIX_TABLE (PREFIX_0F3881
) },
7272 { PREFIX_TABLE (PREFIX_0F3882
) },
7351 { PREFIX_TABLE (PREFIX_0F38C8
) },
7352 { PREFIX_TABLE (PREFIX_0F38C9
) },
7353 { PREFIX_TABLE (PREFIX_0F38CA
) },
7354 { PREFIX_TABLE (PREFIX_0F38CB
) },
7355 { PREFIX_TABLE (PREFIX_0F38CC
) },
7356 { PREFIX_TABLE (PREFIX_0F38CD
) },
7358 { PREFIX_TABLE (PREFIX_0F38CF
) },
7372 { PREFIX_TABLE (PREFIX_0F38DB
) },
7373 { PREFIX_TABLE (PREFIX_0F38DC
) },
7374 { PREFIX_TABLE (PREFIX_0F38DD
) },
7375 { PREFIX_TABLE (PREFIX_0F38DE
) },
7376 { PREFIX_TABLE (PREFIX_0F38DF
) },
7396 { PREFIX_TABLE (PREFIX_0F38F0
) },
7397 { PREFIX_TABLE (PREFIX_0F38F1
) },
7401 { PREFIX_TABLE (PREFIX_0F38F5
) },
7402 { PREFIX_TABLE (PREFIX_0F38F6
) },
7414 /* THREE_BYTE_0F3A */
7426 { PREFIX_TABLE (PREFIX_0F3A08
) },
7427 { PREFIX_TABLE (PREFIX_0F3A09
) },
7428 { PREFIX_TABLE (PREFIX_0F3A0A
) },
7429 { PREFIX_TABLE (PREFIX_0F3A0B
) },
7430 { PREFIX_TABLE (PREFIX_0F3A0C
) },
7431 { PREFIX_TABLE (PREFIX_0F3A0D
) },
7432 { PREFIX_TABLE (PREFIX_0F3A0E
) },
7433 { "palignr", { MX
, EM
, Ib
}, PREFIX_OPCODE
},
7439 { PREFIX_TABLE (PREFIX_0F3A14
) },
7440 { PREFIX_TABLE (PREFIX_0F3A15
) },
7441 { PREFIX_TABLE (PREFIX_0F3A16
) },
7442 { PREFIX_TABLE (PREFIX_0F3A17
) },
7453 { PREFIX_TABLE (PREFIX_0F3A20
) },
7454 { PREFIX_TABLE (PREFIX_0F3A21
) },
7455 { PREFIX_TABLE (PREFIX_0F3A22
) },
7489 { PREFIX_TABLE (PREFIX_0F3A40
) },
7490 { PREFIX_TABLE (PREFIX_0F3A41
) },
7491 { PREFIX_TABLE (PREFIX_0F3A42
) },
7493 { PREFIX_TABLE (PREFIX_0F3A44
) },
7525 { PREFIX_TABLE (PREFIX_0F3A60
) },
7526 { PREFIX_TABLE (PREFIX_0F3A61
) },
7527 { PREFIX_TABLE (PREFIX_0F3A62
) },
7528 { PREFIX_TABLE (PREFIX_0F3A63
) },
7646 { PREFIX_TABLE (PREFIX_0F3ACC
) },
7648 { PREFIX_TABLE (PREFIX_0F3ACE
) },
7649 { PREFIX_TABLE (PREFIX_0F3ACF
) },
7667 { PREFIX_TABLE (PREFIX_0F3ADF
) },
7707 static const struct dis386 xop_table
[][256] = {
7860 { "vpmacssww", { XMVexW
, Vex
, EXVexW
, EXVexW
, VexI4
}, 0 },
7861 { "vpmacsswd", { XMVexW
, Vex
, EXVexW
, EXVexW
, VexI4
}, 0 },
7862 { "vpmacssdql", { XMVexW
, Vex
, EXVexW
, EXVexW
, VexI4
}, 0 },
7870 { "vpmacssdd", { XMVexW
, Vex
, EXVexW
, EXVexW
, VexI4
}, 0 },
7871 { "vpmacssdqh", { XMVexW
, Vex
, EXVexW
, EXVexW
, VexI4
}, 0 },
7878 { "vpmacsww", { XMVexW
, Vex
, EXVexW
, EXVexW
, VexI4
}, 0 },
7879 { "vpmacswd", { XMVexW
, Vex
, EXVexW
, EXVexW
, VexI4
}, 0 },
7880 { "vpmacsdql", { XMVexW
, Vex
, EXVexW
, EXVexW
, VexI4
}, 0 },
7888 { "vpmacsdd", { XMVexW
, Vex
, EXVexW
, EXVexW
, VexI4
}, 0 },
7889 { "vpmacsdqh", { XMVexW
, Vex
, EXVexW
, EXVexW
, VexI4
}, 0 },
7893 { "vpcmov", { XMVexW
, Vex
, EXVexW
, EXVexW
, VexI4
}, 0 },
7894 { "vpperm", { XMVexW
, Vex
, EXVexW
, EXVexW
, VexI4
}, 0 },
7897 { "vpmadcsswd", { XMVexW
, Vex
, EXVexW
, EXVexW
, VexI4
}, 0 },
7915 { "vpmadcswd", { XMVexW
, Vex
, EXVexW
, EXVexW
, VexI4
}, 0 },
7927 { "vprotb", { XM
, Vex_2src_1
, Ib
}, 0 },
7928 { "vprotw", { XM
, Vex_2src_1
, Ib
}, 0 },
7929 { "vprotd", { XM
, Vex_2src_1
, Ib
}, 0 },
7930 { "vprotq", { XM
, Vex_2src_1
, Ib
}, 0 },
7940 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CC
) },
7941 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CD
) },
7942 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CE
) },
7943 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CF
) },
7976 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EC
) },
7977 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_ED
) },
7978 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EE
) },
7979 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EF
) },
8003 { REG_TABLE (REG_XOP_TBM_01
) },
8004 { REG_TABLE (REG_XOP_TBM_02
) },
8022 { REG_TABLE (REG_XOP_LWPCB
) },
8146 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_80
) },
8147 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_81
) },
8148 { "vfrczss", { XM
, EXd
}, 0 },
8149 { "vfrczsd", { XM
, EXq
}, 0 },
8164 { "vprotb", { XM
, Vex_2src_1
, Vex_2src_2
}, 0 },
8165 { "vprotw", { XM
, Vex_2src_1
, Vex_2src_2
}, 0 },
8166 { "vprotd", { XM
, Vex_2src_1
, Vex_2src_2
}, 0 },
8167 { "vprotq", { XM
, Vex_2src_1
, Vex_2src_2
}, 0 },
8168 { "vpshlb", { XM
, Vex_2src_1
, Vex_2src_2
}, 0 },
8169 { "vpshlw", { XM
, Vex_2src_1
, Vex_2src_2
}, 0 },
8170 { "vpshld", { XM
, Vex_2src_1
, Vex_2src_2
}, 0 },
8171 { "vpshlq", { XM
, Vex_2src_1
, Vex_2src_2
}, 0 },
8173 { "vpshab", { XM
, Vex_2src_1
, Vex_2src_2
}, 0 },
8174 { "vpshaw", { XM
, Vex_2src_1
, Vex_2src_2
}, 0 },
8175 { "vpshad", { XM
, Vex_2src_1
, Vex_2src_2
}, 0 },
8176 { "vpshaq", { XM
, Vex_2src_1
, Vex_2src_2
}, 0 },
8219 { "vphaddbw", { XM
, EXxmm
}, 0 },
8220 { "vphaddbd", { XM
, EXxmm
}, 0 },
8221 { "vphaddbq", { XM
, EXxmm
}, 0 },
8224 { "vphaddwd", { XM
, EXxmm
}, 0 },
8225 { "vphaddwq", { XM
, EXxmm
}, 0 },
8230 { "vphadddq", { XM
, EXxmm
}, 0 },
8237 { "vphaddubw", { XM
, EXxmm
}, 0 },
8238 { "vphaddubd", { XM
, EXxmm
}, 0 },
8239 { "vphaddubq", { XM
, EXxmm
}, 0 },
8242 { "vphadduwd", { XM
, EXxmm
}, 0 },
8243 { "vphadduwq", { XM
, EXxmm
}, 0 },
8248 { "vphaddudq", { XM
, EXxmm
}, 0 },
8255 { "vphsubbw", { XM
, EXxmm
}, 0 },
8256 { "vphsubwd", { XM
, EXxmm
}, 0 },
8257 { "vphsubdq", { XM
, EXxmm
}, 0 },
8311 { "bextr", { Gv
, Ev
, Iq
}, 0 },
8313 { REG_TABLE (REG_XOP_LWP
) },
8583 static const struct dis386 vex_table
[][256] = {
8605 { PREFIX_TABLE (PREFIX_VEX_0F10
) },
8606 { PREFIX_TABLE (PREFIX_VEX_0F11
) },
8607 { PREFIX_TABLE (PREFIX_VEX_0F12
) },
8608 { MOD_TABLE (MOD_VEX_0F13
) },
8609 { VEX_W_TABLE (VEX_W_0F14
) },
8610 { VEX_W_TABLE (VEX_W_0F15
) },
8611 { PREFIX_TABLE (PREFIX_VEX_0F16
) },
8612 { MOD_TABLE (MOD_VEX_0F17
) },
8632 { VEX_W_TABLE (VEX_W_0F28
) },
8633 { VEX_W_TABLE (VEX_W_0F29
) },
8634 { PREFIX_TABLE (PREFIX_VEX_0F2A
) },
8635 { MOD_TABLE (MOD_VEX_0F2B
) },
8636 { PREFIX_TABLE (PREFIX_VEX_0F2C
) },
8637 { PREFIX_TABLE (PREFIX_VEX_0F2D
) },
8638 { PREFIX_TABLE (PREFIX_VEX_0F2E
) },
8639 { PREFIX_TABLE (PREFIX_VEX_0F2F
) },
8660 { PREFIX_TABLE (PREFIX_VEX_0F41
) },
8661 { PREFIX_TABLE (PREFIX_VEX_0F42
) },
8663 { PREFIX_TABLE (PREFIX_VEX_0F44
) },
8664 { PREFIX_TABLE (PREFIX_VEX_0F45
) },
8665 { PREFIX_TABLE (PREFIX_VEX_0F46
) },
8666 { PREFIX_TABLE (PREFIX_VEX_0F47
) },
8670 { PREFIX_TABLE (PREFIX_VEX_0F4A
) },
8671 { PREFIX_TABLE (PREFIX_VEX_0F4B
) },
8677 { MOD_TABLE (MOD_VEX_0F50
) },
8678 { PREFIX_TABLE (PREFIX_VEX_0F51
) },
8679 { PREFIX_TABLE (PREFIX_VEX_0F52
) },
8680 { PREFIX_TABLE (PREFIX_VEX_0F53
) },
8681 { "vandpX", { XM
, Vex
, EXx
}, 0 },
8682 { "vandnpX", { XM
, Vex
, EXx
}, 0 },
8683 { "vorpX", { XM
, Vex
, EXx
}, 0 },
8684 { "vxorpX", { XM
, Vex
, EXx
}, 0 },
8686 { PREFIX_TABLE (PREFIX_VEX_0F58
) },
8687 { PREFIX_TABLE (PREFIX_VEX_0F59
) },
8688 { PREFIX_TABLE (PREFIX_VEX_0F5A
) },
8689 { PREFIX_TABLE (PREFIX_VEX_0F5B
) },
8690 { PREFIX_TABLE (PREFIX_VEX_0F5C
) },
8691 { PREFIX_TABLE (PREFIX_VEX_0F5D
) },
8692 { PREFIX_TABLE (PREFIX_VEX_0F5E
) },
8693 { PREFIX_TABLE (PREFIX_VEX_0F5F
) },
8695 { PREFIX_TABLE (PREFIX_VEX_0F60
) },
8696 { PREFIX_TABLE (PREFIX_VEX_0F61
) },
8697 { PREFIX_TABLE (PREFIX_VEX_0F62
) },
8698 { PREFIX_TABLE (PREFIX_VEX_0F63
) },
8699 { PREFIX_TABLE (PREFIX_VEX_0F64
) },
8700 { PREFIX_TABLE (PREFIX_VEX_0F65
) },
8701 { PREFIX_TABLE (PREFIX_VEX_0F66
) },
8702 { PREFIX_TABLE (PREFIX_VEX_0F67
) },
8704 { PREFIX_TABLE (PREFIX_VEX_0F68
) },
8705 { PREFIX_TABLE (PREFIX_VEX_0F69
) },
8706 { PREFIX_TABLE (PREFIX_VEX_0F6A
) },
8707 { PREFIX_TABLE (PREFIX_VEX_0F6B
) },
8708 { PREFIX_TABLE (PREFIX_VEX_0F6C
) },
8709 { PREFIX_TABLE (PREFIX_VEX_0F6D
) },
8710 { PREFIX_TABLE (PREFIX_VEX_0F6E
) },
8711 { PREFIX_TABLE (PREFIX_VEX_0F6F
) },
8713 { PREFIX_TABLE (PREFIX_VEX_0F70
) },
8714 { REG_TABLE (REG_VEX_0F71
) },
8715 { REG_TABLE (REG_VEX_0F72
) },
8716 { REG_TABLE (REG_VEX_0F73
) },
8717 { PREFIX_TABLE (PREFIX_VEX_0F74
) },
8718 { PREFIX_TABLE (PREFIX_VEX_0F75
) },
8719 { PREFIX_TABLE (PREFIX_VEX_0F76
) },
8720 { PREFIX_TABLE (PREFIX_VEX_0F77
) },
8726 { PREFIX_TABLE (PREFIX_VEX_0F7C
) },
8727 { PREFIX_TABLE (PREFIX_VEX_0F7D
) },
8728 { PREFIX_TABLE (PREFIX_VEX_0F7E
) },
8729 { PREFIX_TABLE (PREFIX_VEX_0F7F
) },
8749 { PREFIX_TABLE (PREFIX_VEX_0F90
) },
8750 { PREFIX_TABLE (PREFIX_VEX_0F91
) },
8751 { PREFIX_TABLE (PREFIX_VEX_0F92
) },
8752 { PREFIX_TABLE (PREFIX_VEX_0F93
) },
8758 { PREFIX_TABLE (PREFIX_VEX_0F98
) },
8759 { PREFIX_TABLE (PREFIX_VEX_0F99
) },
8782 { REG_TABLE (REG_VEX_0FAE
) },
8805 { PREFIX_TABLE (PREFIX_VEX_0FC2
) },
8807 { PREFIX_TABLE (PREFIX_VEX_0FC4
) },
8808 { PREFIX_TABLE (PREFIX_VEX_0FC5
) },
8809 { "vshufpX", { XM
, Vex
, EXx
, Ib
}, 0 },
8821 { PREFIX_TABLE (PREFIX_VEX_0FD0
) },
8822 { PREFIX_TABLE (PREFIX_VEX_0FD1
) },
8823 { PREFIX_TABLE (PREFIX_VEX_0FD2
) },
8824 { PREFIX_TABLE (PREFIX_VEX_0FD3
) },
8825 { PREFIX_TABLE (PREFIX_VEX_0FD4
) },
8826 { PREFIX_TABLE (PREFIX_VEX_0FD5
) },
8827 { PREFIX_TABLE (PREFIX_VEX_0FD6
) },
8828 { PREFIX_TABLE (PREFIX_VEX_0FD7
) },
8830 { PREFIX_TABLE (PREFIX_VEX_0FD8
) },
8831 { PREFIX_TABLE (PREFIX_VEX_0FD9
) },
8832 { PREFIX_TABLE (PREFIX_VEX_0FDA
) },
8833 { PREFIX_TABLE (PREFIX_VEX_0FDB
) },
8834 { PREFIX_TABLE (PREFIX_VEX_0FDC
) },
8835 { PREFIX_TABLE (PREFIX_VEX_0FDD
) },
8836 { PREFIX_TABLE (PREFIX_VEX_0FDE
) },
8837 { PREFIX_TABLE (PREFIX_VEX_0FDF
) },
8839 { PREFIX_TABLE (PREFIX_VEX_0FE0
) },
8840 { PREFIX_TABLE (PREFIX_VEX_0FE1
) },
8841 { PREFIX_TABLE (PREFIX_VEX_0FE2
) },
8842 { PREFIX_TABLE (PREFIX_VEX_0FE3
) },
8843 { PREFIX_TABLE (PREFIX_VEX_0FE4
) },
8844 { PREFIX_TABLE (PREFIX_VEX_0FE5
) },
8845 { PREFIX_TABLE (PREFIX_VEX_0FE6
) },
8846 { PREFIX_TABLE (PREFIX_VEX_0FE7
) },
8848 { PREFIX_TABLE (PREFIX_VEX_0FE8
) },
8849 { PREFIX_TABLE (PREFIX_VEX_0FE9
) },
8850 { PREFIX_TABLE (PREFIX_VEX_0FEA
) },
8851 { PREFIX_TABLE (PREFIX_VEX_0FEB
) },
8852 { PREFIX_TABLE (PREFIX_VEX_0FEC
) },
8853 { PREFIX_TABLE (PREFIX_VEX_0FED
) },
8854 { PREFIX_TABLE (PREFIX_VEX_0FEE
) },
8855 { PREFIX_TABLE (PREFIX_VEX_0FEF
) },
8857 { PREFIX_TABLE (PREFIX_VEX_0FF0
) },
8858 { PREFIX_TABLE (PREFIX_VEX_0FF1
) },
8859 { PREFIX_TABLE (PREFIX_VEX_0FF2
) },
8860 { PREFIX_TABLE (PREFIX_VEX_0FF3
) },
8861 { PREFIX_TABLE (PREFIX_VEX_0FF4
) },
8862 { PREFIX_TABLE (PREFIX_VEX_0FF5
) },
8863 { PREFIX_TABLE (PREFIX_VEX_0FF6
) },
8864 { PREFIX_TABLE (PREFIX_VEX_0FF7
) },
8866 { PREFIX_TABLE (PREFIX_VEX_0FF8
) },
8867 { PREFIX_TABLE (PREFIX_VEX_0FF9
) },
8868 { PREFIX_TABLE (PREFIX_VEX_0FFA
) },
8869 { PREFIX_TABLE (PREFIX_VEX_0FFB
) },
8870 { PREFIX_TABLE (PREFIX_VEX_0FFC
) },
8871 { PREFIX_TABLE (PREFIX_VEX_0FFD
) },
8872 { PREFIX_TABLE (PREFIX_VEX_0FFE
) },
8878 { PREFIX_TABLE (PREFIX_VEX_0F3800
) },
8879 { PREFIX_TABLE (PREFIX_VEX_0F3801
) },
8880 { PREFIX_TABLE (PREFIX_VEX_0F3802
) },
8881 { PREFIX_TABLE (PREFIX_VEX_0F3803
) },
8882 { PREFIX_TABLE (PREFIX_VEX_0F3804
) },
8883 { PREFIX_TABLE (PREFIX_VEX_0F3805
) },
8884 { PREFIX_TABLE (PREFIX_VEX_0F3806
) },
8885 { PREFIX_TABLE (PREFIX_VEX_0F3807
) },
8887 { PREFIX_TABLE (PREFIX_VEX_0F3808
) },
8888 { PREFIX_TABLE (PREFIX_VEX_0F3809
) },
8889 { PREFIX_TABLE (PREFIX_VEX_0F380A
) },
8890 { PREFIX_TABLE (PREFIX_VEX_0F380B
) },
8891 { PREFIX_TABLE (PREFIX_VEX_0F380C
) },
8892 { PREFIX_TABLE (PREFIX_VEX_0F380D
) },
8893 { PREFIX_TABLE (PREFIX_VEX_0F380E
) },
8894 { PREFIX_TABLE (PREFIX_VEX_0F380F
) },
8899 { PREFIX_TABLE (PREFIX_VEX_0F3813
) },
8902 { PREFIX_TABLE (PREFIX_VEX_0F3816
) },
8903 { PREFIX_TABLE (PREFIX_VEX_0F3817
) },
8905 { PREFIX_TABLE (PREFIX_VEX_0F3818
) },
8906 { PREFIX_TABLE (PREFIX_VEX_0F3819
) },
8907 { PREFIX_TABLE (PREFIX_VEX_0F381A
) },
8909 { PREFIX_TABLE (PREFIX_VEX_0F381C
) },
8910 { PREFIX_TABLE (PREFIX_VEX_0F381D
) },
8911 { PREFIX_TABLE (PREFIX_VEX_0F381E
) },
8914 { PREFIX_TABLE (PREFIX_VEX_0F3820
) },
8915 { PREFIX_TABLE (PREFIX_VEX_0F3821
) },
8916 { PREFIX_TABLE (PREFIX_VEX_0F3822
) },
8917 { PREFIX_TABLE (PREFIX_VEX_0F3823
) },
8918 { PREFIX_TABLE (PREFIX_VEX_0F3824
) },
8919 { PREFIX_TABLE (PREFIX_VEX_0F3825
) },
8923 { PREFIX_TABLE (PREFIX_VEX_0F3828
) },
8924 { PREFIX_TABLE (PREFIX_VEX_0F3829
) },
8925 { PREFIX_TABLE (PREFIX_VEX_0F382A
) },
8926 { PREFIX_TABLE (PREFIX_VEX_0F382B
) },
8927 { PREFIX_TABLE (PREFIX_VEX_0F382C
) },
8928 { PREFIX_TABLE (PREFIX_VEX_0F382D
) },
8929 { PREFIX_TABLE (PREFIX_VEX_0F382E
) },
8930 { PREFIX_TABLE (PREFIX_VEX_0F382F
) },
8932 { PREFIX_TABLE (PREFIX_VEX_0F3830
) },
8933 { PREFIX_TABLE (PREFIX_VEX_0F3831
) },
8934 { PREFIX_TABLE (PREFIX_VEX_0F3832
) },
8935 { PREFIX_TABLE (PREFIX_VEX_0F3833
) },
8936 { PREFIX_TABLE (PREFIX_VEX_0F3834
) },
8937 { PREFIX_TABLE (PREFIX_VEX_0F3835
) },
8938 { PREFIX_TABLE (PREFIX_VEX_0F3836
) },
8939 { PREFIX_TABLE (PREFIX_VEX_0F3837
) },
8941 { PREFIX_TABLE (PREFIX_VEX_0F3838
) },
8942 { PREFIX_TABLE (PREFIX_VEX_0F3839
) },
8943 { PREFIX_TABLE (PREFIX_VEX_0F383A
) },
8944 { PREFIX_TABLE (PREFIX_VEX_0F383B
) },
8945 { PREFIX_TABLE (PREFIX_VEX_0F383C
) },
8946 { PREFIX_TABLE (PREFIX_VEX_0F383D
) },
8947 { PREFIX_TABLE (PREFIX_VEX_0F383E
) },
8948 { PREFIX_TABLE (PREFIX_VEX_0F383F
) },
8950 { PREFIX_TABLE (PREFIX_VEX_0F3840
) },
8951 { PREFIX_TABLE (PREFIX_VEX_0F3841
) },
8955 { PREFIX_TABLE (PREFIX_VEX_0F3845
) },
8956 { PREFIX_TABLE (PREFIX_VEX_0F3846
) },
8957 { PREFIX_TABLE (PREFIX_VEX_0F3847
) },
8977 { PREFIX_TABLE (PREFIX_VEX_0F3858
) },
8978 { PREFIX_TABLE (PREFIX_VEX_0F3859
) },
8979 { PREFIX_TABLE (PREFIX_VEX_0F385A
) },
9013 { PREFIX_TABLE (PREFIX_VEX_0F3878
) },
9014 { PREFIX_TABLE (PREFIX_VEX_0F3879
) },
9035 { PREFIX_TABLE (PREFIX_VEX_0F388C
) },
9037 { PREFIX_TABLE (PREFIX_VEX_0F388E
) },
9040 { PREFIX_TABLE (PREFIX_VEX_0F3890
) },
9041 { PREFIX_TABLE (PREFIX_VEX_0F3891
) },
9042 { PREFIX_TABLE (PREFIX_VEX_0F3892
) },
9043 { PREFIX_TABLE (PREFIX_VEX_0F3893
) },
9046 { PREFIX_TABLE (PREFIX_VEX_0F3896
) },
9047 { PREFIX_TABLE (PREFIX_VEX_0F3897
) },
9049 { PREFIX_TABLE (PREFIX_VEX_0F3898
) },
9050 { PREFIX_TABLE (PREFIX_VEX_0F3899
) },
9051 { PREFIX_TABLE (PREFIX_VEX_0F389A
) },
9052 { PREFIX_TABLE (PREFIX_VEX_0F389B
) },
9053 { PREFIX_TABLE (PREFIX_VEX_0F389C
) },
9054 { PREFIX_TABLE (PREFIX_VEX_0F389D
) },
9055 { PREFIX_TABLE (PREFIX_VEX_0F389E
) },
9056 { PREFIX_TABLE (PREFIX_VEX_0F389F
) },
9064 { PREFIX_TABLE (PREFIX_VEX_0F38A6
) },
9065 { PREFIX_TABLE (PREFIX_VEX_0F38A7
) },
9067 { PREFIX_TABLE (PREFIX_VEX_0F38A8
) },
9068 { PREFIX_TABLE (PREFIX_VEX_0F38A9
) },
9069 { PREFIX_TABLE (PREFIX_VEX_0F38AA
) },
9070 { PREFIX_TABLE (PREFIX_VEX_0F38AB
) },
9071 { PREFIX_TABLE (PREFIX_VEX_0F38AC
) },
9072 { PREFIX_TABLE (PREFIX_VEX_0F38AD
) },
9073 { PREFIX_TABLE (PREFIX_VEX_0F38AE
) },
9074 { PREFIX_TABLE (PREFIX_VEX_0F38AF
) },
9082 { PREFIX_TABLE (PREFIX_VEX_0F38B6
) },
9083 { PREFIX_TABLE (PREFIX_VEX_0F38B7
) },
9085 { PREFIX_TABLE (PREFIX_VEX_0F38B8
) },
9086 { PREFIX_TABLE (PREFIX_VEX_0F38B9
) },
9087 { PREFIX_TABLE (PREFIX_VEX_0F38BA
) },
9088 { PREFIX_TABLE (PREFIX_VEX_0F38BB
) },
9089 { PREFIX_TABLE (PREFIX_VEX_0F38BC
) },
9090 { PREFIX_TABLE (PREFIX_VEX_0F38BD
) },
9091 { PREFIX_TABLE (PREFIX_VEX_0F38BE
) },
9092 { PREFIX_TABLE (PREFIX_VEX_0F38BF
) },
9110 { PREFIX_TABLE (PREFIX_VEX_0F38CF
) },
9124 { PREFIX_TABLE (PREFIX_VEX_0F38DB
) },
9125 { PREFIX_TABLE (PREFIX_VEX_0F38DC
) },
9126 { PREFIX_TABLE (PREFIX_VEX_0F38DD
) },
9127 { PREFIX_TABLE (PREFIX_VEX_0F38DE
) },
9128 { PREFIX_TABLE (PREFIX_VEX_0F38DF
) },
9150 { PREFIX_TABLE (PREFIX_VEX_0F38F2
) },
9151 { REG_TABLE (REG_VEX_0F38F3
) },
9153 { PREFIX_TABLE (PREFIX_VEX_0F38F5
) },
9154 { PREFIX_TABLE (PREFIX_VEX_0F38F6
) },
9155 { PREFIX_TABLE (PREFIX_VEX_0F38F7
) },
9169 { PREFIX_TABLE (PREFIX_VEX_0F3A00
) },
9170 { PREFIX_TABLE (PREFIX_VEX_0F3A01
) },
9171 { PREFIX_TABLE (PREFIX_VEX_0F3A02
) },
9173 { PREFIX_TABLE (PREFIX_VEX_0F3A04
) },
9174 { PREFIX_TABLE (PREFIX_VEX_0F3A05
) },
9175 { PREFIX_TABLE (PREFIX_VEX_0F3A06
) },
9178 { PREFIX_TABLE (PREFIX_VEX_0F3A08
) },
9179 { PREFIX_TABLE (PREFIX_VEX_0F3A09
) },
9180 { PREFIX_TABLE (PREFIX_VEX_0F3A0A
) },
9181 { PREFIX_TABLE (PREFIX_VEX_0F3A0B
) },
9182 { PREFIX_TABLE (PREFIX_VEX_0F3A0C
) },
9183 { PREFIX_TABLE (PREFIX_VEX_0F3A0D
) },
9184 { PREFIX_TABLE (PREFIX_VEX_0F3A0E
) },
9185 { PREFIX_TABLE (PREFIX_VEX_0F3A0F
) },
9191 { PREFIX_TABLE (PREFIX_VEX_0F3A14
) },
9192 { PREFIX_TABLE (PREFIX_VEX_0F3A15
) },
9193 { PREFIX_TABLE (PREFIX_VEX_0F3A16
) },
9194 { PREFIX_TABLE (PREFIX_VEX_0F3A17
) },
9196 { PREFIX_TABLE (PREFIX_VEX_0F3A18
) },
9197 { PREFIX_TABLE (PREFIX_VEX_0F3A19
) },
9201 { PREFIX_TABLE (PREFIX_VEX_0F3A1D
) },
9205 { PREFIX_TABLE (PREFIX_VEX_0F3A20
) },
9206 { PREFIX_TABLE (PREFIX_VEX_0F3A21
) },
9207 { PREFIX_TABLE (PREFIX_VEX_0F3A22
) },
9223 { PREFIX_TABLE (PREFIX_VEX_0F3A30
) },
9224 { PREFIX_TABLE (PREFIX_VEX_0F3A31
) },
9225 { PREFIX_TABLE (PREFIX_VEX_0F3A32
) },
9226 { PREFIX_TABLE (PREFIX_VEX_0F3A33
) },
9232 { PREFIX_TABLE (PREFIX_VEX_0F3A38
) },
9233 { PREFIX_TABLE (PREFIX_VEX_0F3A39
) },
9241 { PREFIX_TABLE (PREFIX_VEX_0F3A40
) },
9242 { PREFIX_TABLE (PREFIX_VEX_0F3A41
) },
9243 { PREFIX_TABLE (PREFIX_VEX_0F3A42
) },
9245 { PREFIX_TABLE (PREFIX_VEX_0F3A44
) },
9247 { PREFIX_TABLE (PREFIX_VEX_0F3A46
) },
9250 { PREFIX_TABLE (PREFIX_VEX_0F3A48
) },
9251 { PREFIX_TABLE (PREFIX_VEX_0F3A49
) },
9252 { PREFIX_TABLE (PREFIX_VEX_0F3A4A
) },
9253 { PREFIX_TABLE (PREFIX_VEX_0F3A4B
) },
9254 { PREFIX_TABLE (PREFIX_VEX_0F3A4C
) },
9272 { PREFIX_TABLE (PREFIX_VEX_0F3A5C
) },
9273 { PREFIX_TABLE (PREFIX_VEX_0F3A5D
) },
9274 { PREFIX_TABLE (PREFIX_VEX_0F3A5E
) },
9275 { PREFIX_TABLE (PREFIX_VEX_0F3A5F
) },
9277 { PREFIX_TABLE (PREFIX_VEX_0F3A60
) },
9278 { PREFIX_TABLE (PREFIX_VEX_0F3A61
) },
9279 { PREFIX_TABLE (PREFIX_VEX_0F3A62
) },
9280 { PREFIX_TABLE (PREFIX_VEX_0F3A63
) },
9286 { PREFIX_TABLE (PREFIX_VEX_0F3A68
) },
9287 { PREFIX_TABLE (PREFIX_VEX_0F3A69
) },
9288 { PREFIX_TABLE (PREFIX_VEX_0F3A6A
) },
9289 { PREFIX_TABLE (PREFIX_VEX_0F3A6B
) },
9290 { PREFIX_TABLE (PREFIX_VEX_0F3A6C
) },
9291 { PREFIX_TABLE (PREFIX_VEX_0F3A6D
) },
9292 { PREFIX_TABLE (PREFIX_VEX_0F3A6E
) },
9293 { PREFIX_TABLE (PREFIX_VEX_0F3A6F
) },
9304 { PREFIX_TABLE (PREFIX_VEX_0F3A78
) },
9305 { PREFIX_TABLE (PREFIX_VEX_0F3A79
) },
9306 { PREFIX_TABLE (PREFIX_VEX_0F3A7A
) },
9307 { PREFIX_TABLE (PREFIX_VEX_0F3A7B
) },
9308 { PREFIX_TABLE (PREFIX_VEX_0F3A7C
) },
9309 { PREFIX_TABLE (PREFIX_VEX_0F3A7D
) },
9310 { PREFIX_TABLE (PREFIX_VEX_0F3A7E
) },
9311 { PREFIX_TABLE (PREFIX_VEX_0F3A7F
) },
9400 { PREFIX_TABLE(PREFIX_VEX_0F3ACE
) },
9401 { PREFIX_TABLE(PREFIX_VEX_0F3ACF
) },
9419 { PREFIX_TABLE (PREFIX_VEX_0F3ADF
) },
9439 { PREFIX_TABLE (PREFIX_VEX_0F3AF0
) },
9459 #define NEED_OPCODE_TABLE
9460 #include "i386-dis-evex.h"
9461 #undef NEED_OPCODE_TABLE
9462 static const struct dis386 vex_len_table
[][2] = {
9463 /* VEX_LEN_0F10_P_1 */
9465 { VEX_W_TABLE (VEX_W_0F10_P_1
) },
9466 { VEX_W_TABLE (VEX_W_0F10_P_1
) },
9469 /* VEX_LEN_0F10_P_3 */
9471 { VEX_W_TABLE (VEX_W_0F10_P_3
) },
9472 { VEX_W_TABLE (VEX_W_0F10_P_3
) },
9475 /* VEX_LEN_0F11_P_1 */
9477 { VEX_W_TABLE (VEX_W_0F11_P_1
) },
9478 { VEX_W_TABLE (VEX_W_0F11_P_1
) },
9481 /* VEX_LEN_0F11_P_3 */
9483 { VEX_W_TABLE (VEX_W_0F11_P_3
) },
9484 { VEX_W_TABLE (VEX_W_0F11_P_3
) },
9487 /* VEX_LEN_0F12_P_0_M_0 */
9489 { VEX_W_TABLE (VEX_W_0F12_P_0_M_0
) },
9492 /* VEX_LEN_0F12_P_0_M_1 */
9494 { VEX_W_TABLE (VEX_W_0F12_P_0_M_1
) },
9497 /* VEX_LEN_0F12_P_2 */
9499 { VEX_W_TABLE (VEX_W_0F12_P_2
) },
9502 /* VEX_LEN_0F13_M_0 */
9504 { VEX_W_TABLE (VEX_W_0F13_M_0
) },
9507 /* VEX_LEN_0F16_P_0_M_0 */
9509 { VEX_W_TABLE (VEX_W_0F16_P_0_M_0
) },
9512 /* VEX_LEN_0F16_P_0_M_1 */
9514 { VEX_W_TABLE (VEX_W_0F16_P_0_M_1
) },
9517 /* VEX_LEN_0F16_P_2 */
9519 { VEX_W_TABLE (VEX_W_0F16_P_2
) },
9522 /* VEX_LEN_0F17_M_0 */
9524 { VEX_W_TABLE (VEX_W_0F17_M_0
) },
9527 /* VEX_LEN_0F2A_P_1 */
9529 { "vcvtsi2ss%LQ", { XMScalar
, VexScalar
, Ev
}, 0 },
9530 { "vcvtsi2ss%LQ", { XMScalar
, VexScalar
, Ev
}, 0 },
9533 /* VEX_LEN_0F2A_P_3 */
9535 { "vcvtsi2sd%LQ", { XMScalar
, VexScalar
, Ev
}, 0 },
9536 { "vcvtsi2sd%LQ", { XMScalar
, VexScalar
, Ev
}, 0 },
9539 /* VEX_LEN_0F2C_P_1 */
9541 { "vcvttss2siY", { Gv
, EXdScalar
}, 0 },
9542 { "vcvttss2siY", { Gv
, EXdScalar
}, 0 },
9545 /* VEX_LEN_0F2C_P_3 */
9547 { "vcvttsd2siY", { Gv
, EXqScalar
}, 0 },
9548 { "vcvttsd2siY", { Gv
, EXqScalar
}, 0 },
9551 /* VEX_LEN_0F2D_P_1 */
9553 { "vcvtss2siY", { Gv
, EXdScalar
}, 0 },
9554 { "vcvtss2siY", { Gv
, EXdScalar
}, 0 },
9557 /* VEX_LEN_0F2D_P_3 */
9559 { "vcvtsd2siY", { Gv
, EXqScalar
}, 0 },
9560 { "vcvtsd2siY", { Gv
, EXqScalar
}, 0 },
9563 /* VEX_LEN_0F2E_P_0 */
9565 { VEX_W_TABLE (VEX_W_0F2E_P_0
) },
9566 { VEX_W_TABLE (VEX_W_0F2E_P_0
) },
9569 /* VEX_LEN_0F2E_P_2 */
9571 { VEX_W_TABLE (VEX_W_0F2E_P_2
) },
9572 { VEX_W_TABLE (VEX_W_0F2E_P_2
) },
9575 /* VEX_LEN_0F2F_P_0 */
9577 { VEX_W_TABLE (VEX_W_0F2F_P_0
) },
9578 { VEX_W_TABLE (VEX_W_0F2F_P_0
) },
9581 /* VEX_LEN_0F2F_P_2 */
9583 { VEX_W_TABLE (VEX_W_0F2F_P_2
) },
9584 { VEX_W_TABLE (VEX_W_0F2F_P_2
) },
9587 /* VEX_LEN_0F41_P_0 */
9590 { VEX_W_TABLE (VEX_W_0F41_P_0_LEN_1
) },
9592 /* VEX_LEN_0F41_P_2 */
9595 { VEX_W_TABLE (VEX_W_0F41_P_2_LEN_1
) },
9597 /* VEX_LEN_0F42_P_0 */
9600 { VEX_W_TABLE (VEX_W_0F42_P_0_LEN_1
) },
9602 /* VEX_LEN_0F42_P_2 */
9605 { VEX_W_TABLE (VEX_W_0F42_P_2_LEN_1
) },
9607 /* VEX_LEN_0F44_P_0 */
9609 { VEX_W_TABLE (VEX_W_0F44_P_0_LEN_0
) },
9611 /* VEX_LEN_0F44_P_2 */
9613 { VEX_W_TABLE (VEX_W_0F44_P_2_LEN_0
) },
9615 /* VEX_LEN_0F45_P_0 */
9618 { VEX_W_TABLE (VEX_W_0F45_P_0_LEN_1
) },
9620 /* VEX_LEN_0F45_P_2 */
9623 { VEX_W_TABLE (VEX_W_0F45_P_2_LEN_1
) },
9625 /* VEX_LEN_0F46_P_0 */
9628 { VEX_W_TABLE (VEX_W_0F46_P_0_LEN_1
) },
9630 /* VEX_LEN_0F46_P_2 */
9633 { VEX_W_TABLE (VEX_W_0F46_P_2_LEN_1
) },
9635 /* VEX_LEN_0F47_P_0 */
9638 { VEX_W_TABLE (VEX_W_0F47_P_0_LEN_1
) },
9640 /* VEX_LEN_0F47_P_2 */
9643 { VEX_W_TABLE (VEX_W_0F47_P_2_LEN_1
) },
9645 /* VEX_LEN_0F4A_P_0 */
9648 { VEX_W_TABLE (VEX_W_0F4A_P_0_LEN_1
) },
9650 /* VEX_LEN_0F4A_P_2 */
9653 { VEX_W_TABLE (VEX_W_0F4A_P_2_LEN_1
) },
9655 /* VEX_LEN_0F4B_P_0 */
9658 { VEX_W_TABLE (VEX_W_0F4B_P_0_LEN_1
) },
9660 /* VEX_LEN_0F4B_P_2 */
9663 { VEX_W_TABLE (VEX_W_0F4B_P_2_LEN_1
) },
9666 /* VEX_LEN_0F51_P_1 */
9668 { VEX_W_TABLE (VEX_W_0F51_P_1
) },
9669 { VEX_W_TABLE (VEX_W_0F51_P_1
) },
9672 /* VEX_LEN_0F51_P_3 */
9674 { VEX_W_TABLE (VEX_W_0F51_P_3
) },
9675 { VEX_W_TABLE (VEX_W_0F51_P_3
) },
9678 /* VEX_LEN_0F52_P_1 */
9680 { VEX_W_TABLE (VEX_W_0F52_P_1
) },
9681 { VEX_W_TABLE (VEX_W_0F52_P_1
) },
9684 /* VEX_LEN_0F53_P_1 */
9686 { VEX_W_TABLE (VEX_W_0F53_P_1
) },
9687 { VEX_W_TABLE (VEX_W_0F53_P_1
) },
9690 /* VEX_LEN_0F58_P_1 */
9692 { VEX_W_TABLE (VEX_W_0F58_P_1
) },
9693 { VEX_W_TABLE (VEX_W_0F58_P_1
) },
9696 /* VEX_LEN_0F58_P_3 */
9698 { VEX_W_TABLE (VEX_W_0F58_P_3
) },
9699 { VEX_W_TABLE (VEX_W_0F58_P_3
) },
9702 /* VEX_LEN_0F59_P_1 */
9704 { VEX_W_TABLE (VEX_W_0F59_P_1
) },
9705 { VEX_W_TABLE (VEX_W_0F59_P_1
) },
9708 /* VEX_LEN_0F59_P_3 */
9710 { VEX_W_TABLE (VEX_W_0F59_P_3
) },
9711 { VEX_W_TABLE (VEX_W_0F59_P_3
) },
9714 /* VEX_LEN_0F5A_P_1 */
9716 { VEX_W_TABLE (VEX_W_0F5A_P_1
) },
9717 { VEX_W_TABLE (VEX_W_0F5A_P_1
) },
9720 /* VEX_LEN_0F5A_P_3 */
9722 { VEX_W_TABLE (VEX_W_0F5A_P_3
) },
9723 { VEX_W_TABLE (VEX_W_0F5A_P_3
) },
9726 /* VEX_LEN_0F5C_P_1 */
9728 { VEX_W_TABLE (VEX_W_0F5C_P_1
) },
9729 { VEX_W_TABLE (VEX_W_0F5C_P_1
) },
9732 /* VEX_LEN_0F5C_P_3 */
9734 { VEX_W_TABLE (VEX_W_0F5C_P_3
) },
9735 { VEX_W_TABLE (VEX_W_0F5C_P_3
) },
9738 /* VEX_LEN_0F5D_P_1 */
9740 { VEX_W_TABLE (VEX_W_0F5D_P_1
) },
9741 { VEX_W_TABLE (VEX_W_0F5D_P_1
) },
9744 /* VEX_LEN_0F5D_P_3 */
9746 { VEX_W_TABLE (VEX_W_0F5D_P_3
) },
9747 { VEX_W_TABLE (VEX_W_0F5D_P_3
) },
9750 /* VEX_LEN_0F5E_P_1 */
9752 { VEX_W_TABLE (VEX_W_0F5E_P_1
) },
9753 { VEX_W_TABLE (VEX_W_0F5E_P_1
) },
9756 /* VEX_LEN_0F5E_P_3 */
9758 { VEX_W_TABLE (VEX_W_0F5E_P_3
) },
9759 { VEX_W_TABLE (VEX_W_0F5E_P_3
) },
9762 /* VEX_LEN_0F5F_P_1 */
9764 { VEX_W_TABLE (VEX_W_0F5F_P_1
) },
9765 { VEX_W_TABLE (VEX_W_0F5F_P_1
) },
9768 /* VEX_LEN_0F5F_P_3 */
9770 { VEX_W_TABLE (VEX_W_0F5F_P_3
) },
9771 { VEX_W_TABLE (VEX_W_0F5F_P_3
) },
9774 /* VEX_LEN_0F6E_P_2 */
9776 { "vmovK", { XMScalar
, Edq
}, 0 },
9777 { "vmovK", { XMScalar
, Edq
}, 0 },
9780 /* VEX_LEN_0F7E_P_1 */
9782 { VEX_W_TABLE (VEX_W_0F7E_P_1
) },
9783 { VEX_W_TABLE (VEX_W_0F7E_P_1
) },
9786 /* VEX_LEN_0F7E_P_2 */
9788 { "vmovK", { Edq
, XMScalar
}, 0 },
9789 { "vmovK", { Edq
, XMScalar
}, 0 },
9792 /* VEX_LEN_0F90_P_0 */
9794 { VEX_W_TABLE (VEX_W_0F90_P_0_LEN_0
) },
9797 /* VEX_LEN_0F90_P_2 */
9799 { VEX_W_TABLE (VEX_W_0F90_P_2_LEN_0
) },
9802 /* VEX_LEN_0F91_P_0 */
9804 { VEX_W_TABLE (VEX_W_0F91_P_0_LEN_0
) },
9807 /* VEX_LEN_0F91_P_2 */
9809 { VEX_W_TABLE (VEX_W_0F91_P_2_LEN_0
) },
9812 /* VEX_LEN_0F92_P_0 */
9814 { VEX_W_TABLE (VEX_W_0F92_P_0_LEN_0
) },
9817 /* VEX_LEN_0F92_P_2 */
9819 { VEX_W_TABLE (VEX_W_0F92_P_2_LEN_0
) },
9822 /* VEX_LEN_0F92_P_3 */
9824 { VEX_W_TABLE (VEX_W_0F92_P_3_LEN_0
) },
9827 /* VEX_LEN_0F93_P_0 */
9829 { VEX_W_TABLE (VEX_W_0F93_P_0_LEN_0
) },
9832 /* VEX_LEN_0F93_P_2 */
9834 { VEX_W_TABLE (VEX_W_0F93_P_2_LEN_0
) },
9837 /* VEX_LEN_0F93_P_3 */
9839 { VEX_W_TABLE (VEX_W_0F93_P_3_LEN_0
) },
9842 /* VEX_LEN_0F98_P_0 */
9844 { VEX_W_TABLE (VEX_W_0F98_P_0_LEN_0
) },
9847 /* VEX_LEN_0F98_P_2 */
9849 { VEX_W_TABLE (VEX_W_0F98_P_2_LEN_0
) },
9852 /* VEX_LEN_0F99_P_0 */
9854 { VEX_W_TABLE (VEX_W_0F99_P_0_LEN_0
) },
9857 /* VEX_LEN_0F99_P_2 */
9859 { VEX_W_TABLE (VEX_W_0F99_P_2_LEN_0
) },
9862 /* VEX_LEN_0FAE_R_2_M_0 */
9864 { VEX_W_TABLE (VEX_W_0FAE_R_2_M_0
) },
9867 /* VEX_LEN_0FAE_R_3_M_0 */
9869 { VEX_W_TABLE (VEX_W_0FAE_R_3_M_0
) },
9872 /* VEX_LEN_0FC2_P_1 */
9874 { VEX_W_TABLE (VEX_W_0FC2_P_1
) },
9875 { VEX_W_TABLE (VEX_W_0FC2_P_1
) },
9878 /* VEX_LEN_0FC2_P_3 */
9880 { VEX_W_TABLE (VEX_W_0FC2_P_3
) },
9881 { VEX_W_TABLE (VEX_W_0FC2_P_3
) },
9884 /* VEX_LEN_0FC4_P_2 */
9886 { VEX_W_TABLE (VEX_W_0FC4_P_2
) },
9889 /* VEX_LEN_0FC5_P_2 */
9891 { VEX_W_TABLE (VEX_W_0FC5_P_2
) },
9894 /* VEX_LEN_0FD6_P_2 */
9896 { VEX_W_TABLE (VEX_W_0FD6_P_2
) },
9897 { VEX_W_TABLE (VEX_W_0FD6_P_2
) },
9900 /* VEX_LEN_0FF7_P_2 */
9902 { VEX_W_TABLE (VEX_W_0FF7_P_2
) },
9905 /* VEX_LEN_0F3816_P_2 */
9908 { VEX_W_TABLE (VEX_W_0F3816_P_2
) },
9911 /* VEX_LEN_0F3819_P_2 */
9914 { VEX_W_TABLE (VEX_W_0F3819_P_2
) },
9917 /* VEX_LEN_0F381A_P_2_M_0 */
9920 { VEX_W_TABLE (VEX_W_0F381A_P_2_M_0
) },
9923 /* VEX_LEN_0F3836_P_2 */
9926 { VEX_W_TABLE (VEX_W_0F3836_P_2
) },
9929 /* VEX_LEN_0F3841_P_2 */
9931 { VEX_W_TABLE (VEX_W_0F3841_P_2
) },
9934 /* VEX_LEN_0F385A_P_2_M_0 */
9937 { VEX_W_TABLE (VEX_W_0F385A_P_2_M_0
) },
9940 /* VEX_LEN_0F38DB_P_2 */
9942 { VEX_W_TABLE (VEX_W_0F38DB_P_2
) },
9945 /* VEX_LEN_0F38F2_P_0 */
9947 { "andnS", { Gdq
, VexGdq
, Edq
}, 0 },
9950 /* VEX_LEN_0F38F3_R_1_P_0 */
9952 { "blsrS", { VexGdq
, Edq
}, 0 },
9955 /* VEX_LEN_0F38F3_R_2_P_0 */
9957 { "blsmskS", { VexGdq
, Edq
}, 0 },
9960 /* VEX_LEN_0F38F3_R_3_P_0 */
9962 { "blsiS", { VexGdq
, Edq
}, 0 },
9965 /* VEX_LEN_0F38F5_P_0 */
9967 { "bzhiS", { Gdq
, Edq
, VexGdq
}, 0 },
9970 /* VEX_LEN_0F38F5_P_1 */
9972 { "pextS", { Gdq
, VexGdq
, Edq
}, 0 },
9975 /* VEX_LEN_0F38F5_P_3 */
9977 { "pdepS", { Gdq
, VexGdq
, Edq
}, 0 },
9980 /* VEX_LEN_0F38F6_P_3 */
9982 { "mulxS", { Gdq
, VexGdq
, Edq
}, 0 },
9985 /* VEX_LEN_0F38F7_P_0 */
9987 { "bextrS", { Gdq
, Edq
, VexGdq
}, 0 },
9990 /* VEX_LEN_0F38F7_P_1 */
9992 { "sarxS", { Gdq
, Edq
, VexGdq
}, 0 },
9995 /* VEX_LEN_0F38F7_P_2 */
9997 { "shlxS", { Gdq
, Edq
, VexGdq
}, 0 },
10000 /* VEX_LEN_0F38F7_P_3 */
10002 { "shrxS", { Gdq
, Edq
, VexGdq
}, 0 },
10005 /* VEX_LEN_0F3A00_P_2 */
10008 { VEX_W_TABLE (VEX_W_0F3A00_P_2
) },
10011 /* VEX_LEN_0F3A01_P_2 */
10014 { VEX_W_TABLE (VEX_W_0F3A01_P_2
) },
10017 /* VEX_LEN_0F3A06_P_2 */
10020 { VEX_W_TABLE (VEX_W_0F3A06_P_2
) },
10023 /* VEX_LEN_0F3A0A_P_2 */
10025 { VEX_W_TABLE (VEX_W_0F3A0A_P_2
) },
10026 { VEX_W_TABLE (VEX_W_0F3A0A_P_2
) },
10029 /* VEX_LEN_0F3A0B_P_2 */
10031 { VEX_W_TABLE (VEX_W_0F3A0B_P_2
) },
10032 { VEX_W_TABLE (VEX_W_0F3A0B_P_2
) },
10035 /* VEX_LEN_0F3A14_P_2 */
10037 { VEX_W_TABLE (VEX_W_0F3A14_P_2
) },
10040 /* VEX_LEN_0F3A15_P_2 */
10042 { VEX_W_TABLE (VEX_W_0F3A15_P_2
) },
10045 /* VEX_LEN_0F3A16_P_2 */
10047 { "vpextrK", { Edq
, XM
, Ib
}, 0 },
10050 /* VEX_LEN_0F3A17_P_2 */
10052 { "vextractps", { Edqd
, XM
, Ib
}, 0 },
10055 /* VEX_LEN_0F3A18_P_2 */
10058 { VEX_W_TABLE (VEX_W_0F3A18_P_2
) },
10061 /* VEX_LEN_0F3A19_P_2 */
10064 { VEX_W_TABLE (VEX_W_0F3A19_P_2
) },
10067 /* VEX_LEN_0F3A20_P_2 */
10069 { VEX_W_TABLE (VEX_W_0F3A20_P_2
) },
10072 /* VEX_LEN_0F3A21_P_2 */
10074 { VEX_W_TABLE (VEX_W_0F3A21_P_2
) },
10077 /* VEX_LEN_0F3A22_P_2 */
10079 { "vpinsrK", { XM
, Vex128
, Edq
, Ib
}, 0 },
10082 /* VEX_LEN_0F3A30_P_2 */
10084 { VEX_W_TABLE (VEX_W_0F3A30_P_2_LEN_0
) },
10087 /* VEX_LEN_0F3A31_P_2 */
10089 { VEX_W_TABLE (VEX_W_0F3A31_P_2_LEN_0
) },
10092 /* VEX_LEN_0F3A32_P_2 */
10094 { VEX_W_TABLE (VEX_W_0F3A32_P_2_LEN_0
) },
10097 /* VEX_LEN_0F3A33_P_2 */
10099 { VEX_W_TABLE (VEX_W_0F3A33_P_2_LEN_0
) },
10102 /* VEX_LEN_0F3A38_P_2 */
10105 { VEX_W_TABLE (VEX_W_0F3A38_P_2
) },
10108 /* VEX_LEN_0F3A39_P_2 */
10111 { VEX_W_TABLE (VEX_W_0F3A39_P_2
) },
10114 /* VEX_LEN_0F3A41_P_2 */
10116 { VEX_W_TABLE (VEX_W_0F3A41_P_2
) },
10119 /* VEX_LEN_0F3A46_P_2 */
10122 { VEX_W_TABLE (VEX_W_0F3A46_P_2
) },
10125 /* VEX_LEN_0F3A60_P_2 */
10127 { "vpcmpestrm", { XM
, { PCMPESTR_Fixup
, x_mode
}, Ib
}, 0 },
10130 /* VEX_LEN_0F3A61_P_2 */
10132 { "vpcmpestri", { XM
, { PCMPESTR_Fixup
, x_mode
}, Ib
}, 0 },
10135 /* VEX_LEN_0F3A62_P_2 */
10137 { VEX_W_TABLE (VEX_W_0F3A62_P_2
) },
10140 /* VEX_LEN_0F3A63_P_2 */
10142 { VEX_W_TABLE (VEX_W_0F3A63_P_2
) },
10145 /* VEX_LEN_0F3A6A_P_2 */
10147 { "vfmaddss", { XMVexW
, Vex128
, EXdVexW
, EXdVexW
, VexI4
}, 0 },
10150 /* VEX_LEN_0F3A6B_P_2 */
10152 { "vfmaddsd", { XMVexW
, Vex128
, EXqVexW
, EXqVexW
, VexI4
}, 0 },
10155 /* VEX_LEN_0F3A6E_P_2 */
10157 { "vfmsubss", { XMVexW
, Vex128
, EXdVexW
, EXdVexW
, VexI4
}, 0 },
10160 /* VEX_LEN_0F3A6F_P_2 */
10162 { "vfmsubsd", { XMVexW
, Vex128
, EXqVexW
, EXqVexW
, VexI4
}, 0 },
10165 /* VEX_LEN_0F3A7A_P_2 */
10167 { "vfnmaddss", { XMVexW
, Vex128
, EXdVexW
, EXdVexW
, VexI4
}, 0 },
10170 /* VEX_LEN_0F3A7B_P_2 */
10172 { "vfnmaddsd", { XMVexW
, Vex128
, EXqVexW
, EXqVexW
, VexI4
}, 0 },
10175 /* VEX_LEN_0F3A7E_P_2 */
10177 { "vfnmsubss", { XMVexW
, Vex128
, EXdVexW
, EXdVexW
, VexI4
}, 0 },
10180 /* VEX_LEN_0F3A7F_P_2 */
10182 { "vfnmsubsd", { XMVexW
, Vex128
, EXqVexW
, EXqVexW
, VexI4
}, 0 },
10185 /* VEX_LEN_0F3ADF_P_2 */
10187 { VEX_W_TABLE (VEX_W_0F3ADF_P_2
) },
10190 /* VEX_LEN_0F3AF0_P_3 */
10192 { "rorxS", { Gdq
, Edq
, Ib
}, 0 },
10195 /* VEX_LEN_0FXOP_08_CC */
10197 { "vpcomb", { XM
, Vex128
, EXx
, VPCOM
}, 0 },
10200 /* VEX_LEN_0FXOP_08_CD */
10202 { "vpcomw", { XM
, Vex128
, EXx
, VPCOM
}, 0 },
10205 /* VEX_LEN_0FXOP_08_CE */
10207 { "vpcomd", { XM
, Vex128
, EXx
, VPCOM
}, 0 },
10210 /* VEX_LEN_0FXOP_08_CF */
10212 { "vpcomq", { XM
, Vex128
, EXx
, VPCOM
}, 0 },
10215 /* VEX_LEN_0FXOP_08_EC */
10217 { "vpcomub", { XM
, Vex128
, EXx
, VPCOM
}, 0 },
10220 /* VEX_LEN_0FXOP_08_ED */
10222 { "vpcomuw", { XM
, Vex128
, EXx
, VPCOM
}, 0 },
10225 /* VEX_LEN_0FXOP_08_EE */
10227 { "vpcomud", { XM
, Vex128
, EXx
, VPCOM
}, 0 },
10230 /* VEX_LEN_0FXOP_08_EF */
10232 { "vpcomuq", { XM
, Vex128
, EXx
, VPCOM
}, 0 },
10235 /* VEX_LEN_0FXOP_09_80 */
10237 { "vfrczps", { XM
, EXxmm
}, 0 },
10238 { "vfrczps", { XM
, EXymmq
}, 0 },
10241 /* VEX_LEN_0FXOP_09_81 */
10243 { "vfrczpd", { XM
, EXxmm
}, 0 },
10244 { "vfrczpd", { XM
, EXymmq
}, 0 },
10248 static const struct dis386 vex_w_table
[][2] = {
10250 /* VEX_W_0F10_P_0 */
10251 { "vmovups", { XM
, EXx
}, 0 },
10254 /* VEX_W_0F10_P_1 */
10255 { "vmovss", { XMVexScalar
, VexScalar
, EXdScalar
}, 0 },
10258 /* VEX_W_0F10_P_2 */
10259 { "vmovupd", { XM
, EXx
}, 0 },
10262 /* VEX_W_0F10_P_3 */
10263 { "vmovsd", { XMVexScalar
, VexScalar
, EXqScalar
}, 0 },
10266 /* VEX_W_0F11_P_0 */
10267 { "vmovups", { EXxS
, XM
}, 0 },
10270 /* VEX_W_0F11_P_1 */
10271 { "vmovss", { EXdVexScalarS
, VexScalar
, XMScalar
}, 0 },
10274 /* VEX_W_0F11_P_2 */
10275 { "vmovupd", { EXxS
, XM
}, 0 },
10278 /* VEX_W_0F11_P_3 */
10279 { "vmovsd", { EXqVexScalarS
, VexScalar
, XMScalar
}, 0 },
10282 /* VEX_W_0F12_P_0_M_0 */
10283 { "vmovlps", { XM
, Vex128
, EXq
}, 0 },
10286 /* VEX_W_0F12_P_0_M_1 */
10287 { "vmovhlps", { XM
, Vex128
, EXq
}, 0 },
10290 /* VEX_W_0F12_P_1 */
10291 { "vmovsldup", { XM
, EXx
}, 0 },
10294 /* VEX_W_0F12_P_2 */
10295 { "vmovlpd", { XM
, Vex128
, EXq
}, 0 },
10298 /* VEX_W_0F12_P_3 */
10299 { "vmovddup", { XM
, EXymmq
}, 0 },
10302 /* VEX_W_0F13_M_0 */
10303 { "vmovlpX", { EXq
, XM
}, 0 },
10307 { "vunpcklpX", { XM
, Vex
, EXx
}, 0 },
10311 { "vunpckhpX", { XM
, Vex
, EXx
}, 0 },
10314 /* VEX_W_0F16_P_0_M_0 */
10315 { "vmovhps", { XM
, Vex128
, EXq
}, 0 },
10318 /* VEX_W_0F16_P_0_M_1 */
10319 { "vmovlhps", { XM
, Vex128
, EXq
}, 0 },
10322 /* VEX_W_0F16_P_1 */
10323 { "vmovshdup", { XM
, EXx
}, 0 },
10326 /* VEX_W_0F16_P_2 */
10327 { "vmovhpd", { XM
, Vex128
, EXq
}, 0 },
10330 /* VEX_W_0F17_M_0 */
10331 { "vmovhpX", { EXq
, XM
}, 0 },
10335 { "vmovapX", { XM
, EXx
}, 0 },
10339 { "vmovapX", { EXxS
, XM
}, 0 },
10342 /* VEX_W_0F2B_M_0 */
10343 { "vmovntpX", { Mx
, XM
}, 0 },
10346 /* VEX_W_0F2E_P_0 */
10347 { "vucomiss", { XMScalar
, EXdScalar
}, 0 },
10350 /* VEX_W_0F2E_P_2 */
10351 { "vucomisd", { XMScalar
, EXqScalar
}, 0 },
10354 /* VEX_W_0F2F_P_0 */
10355 { "vcomiss", { XMScalar
, EXdScalar
}, 0 },
10358 /* VEX_W_0F2F_P_2 */
10359 { "vcomisd", { XMScalar
, EXqScalar
}, 0 },
10362 /* VEX_W_0F41_P_0_LEN_1 */
10363 { MOD_TABLE (MOD_VEX_W_0_0F41_P_0_LEN_1
) },
10364 { MOD_TABLE (MOD_VEX_W_1_0F41_P_0_LEN_1
) },
10367 /* VEX_W_0F41_P_2_LEN_1 */
10368 { MOD_TABLE (MOD_VEX_W_0_0F41_P_2_LEN_1
) },
10369 { MOD_TABLE (MOD_VEX_W_1_0F41_P_2_LEN_1
) }
10372 /* VEX_W_0F42_P_0_LEN_1 */
10373 { MOD_TABLE (MOD_VEX_W_0_0F42_P_0_LEN_1
) },
10374 { MOD_TABLE (MOD_VEX_W_1_0F42_P_0_LEN_1
) },
10377 /* VEX_W_0F42_P_2_LEN_1 */
10378 { MOD_TABLE (MOD_VEX_W_0_0F42_P_2_LEN_1
) },
10379 { MOD_TABLE (MOD_VEX_W_1_0F42_P_2_LEN_1
) },
10382 /* VEX_W_0F44_P_0_LEN_0 */
10383 { MOD_TABLE (MOD_VEX_W_0_0F44_P_0_LEN_1
) },
10384 { MOD_TABLE (MOD_VEX_W_1_0F44_P_0_LEN_1
) },
10387 /* VEX_W_0F44_P_2_LEN_0 */
10388 { MOD_TABLE (MOD_VEX_W_0_0F44_P_2_LEN_1
) },
10389 { MOD_TABLE (MOD_VEX_W_1_0F44_P_2_LEN_1
) },
10392 /* VEX_W_0F45_P_0_LEN_1 */
10393 { MOD_TABLE (MOD_VEX_W_0_0F45_P_0_LEN_1
) },
10394 { MOD_TABLE (MOD_VEX_W_1_0F45_P_0_LEN_1
) },
10397 /* VEX_W_0F45_P_2_LEN_1 */
10398 { MOD_TABLE (MOD_VEX_W_0_0F45_P_2_LEN_1
) },
10399 { MOD_TABLE (MOD_VEX_W_1_0F45_P_2_LEN_1
) },
10402 /* VEX_W_0F46_P_0_LEN_1 */
10403 { MOD_TABLE (MOD_VEX_W_0_0F46_P_0_LEN_1
) },
10404 { MOD_TABLE (MOD_VEX_W_1_0F46_P_0_LEN_1
) },
10407 /* VEX_W_0F46_P_2_LEN_1 */
10408 { MOD_TABLE (MOD_VEX_W_0_0F46_P_2_LEN_1
) },
10409 { MOD_TABLE (MOD_VEX_W_1_0F46_P_2_LEN_1
) },
10412 /* VEX_W_0F47_P_0_LEN_1 */
10413 { MOD_TABLE (MOD_VEX_W_0_0F47_P_0_LEN_1
) },
10414 { MOD_TABLE (MOD_VEX_W_1_0F47_P_0_LEN_1
) },
10417 /* VEX_W_0F47_P_2_LEN_1 */
10418 { MOD_TABLE (MOD_VEX_W_0_0F47_P_2_LEN_1
) },
10419 { MOD_TABLE (MOD_VEX_W_1_0F47_P_2_LEN_1
) },
10422 /* VEX_W_0F4A_P_0_LEN_1 */
10423 { MOD_TABLE (MOD_VEX_W_0_0F4A_P_0_LEN_1
) },
10424 { MOD_TABLE (MOD_VEX_W_1_0F4A_P_0_LEN_1
) },
10427 /* VEX_W_0F4A_P_2_LEN_1 */
10428 { MOD_TABLE (MOD_VEX_W_0_0F4A_P_2_LEN_1
) },
10429 { MOD_TABLE (MOD_VEX_W_1_0F4A_P_2_LEN_1
) },
10432 /* VEX_W_0F4B_P_0_LEN_1 */
10433 { MOD_TABLE (MOD_VEX_W_0_0F4B_P_0_LEN_1
) },
10434 { MOD_TABLE (MOD_VEX_W_1_0F4B_P_0_LEN_1
) },
10437 /* VEX_W_0F4B_P_2_LEN_1 */
10438 { MOD_TABLE (MOD_VEX_W_0_0F4B_P_2_LEN_1
) },
10441 /* VEX_W_0F50_M_0 */
10442 { "vmovmskpX", { Gdq
, XS
}, 0 },
10445 /* VEX_W_0F51_P_0 */
10446 { "vsqrtps", { XM
, EXx
}, 0 },
10449 /* VEX_W_0F51_P_1 */
10450 { "vsqrtss", { XMScalar
, VexScalar
, EXdScalar
}, 0 },
10453 /* VEX_W_0F51_P_2 */
10454 { "vsqrtpd", { XM
, EXx
}, 0 },
10457 /* VEX_W_0F51_P_3 */
10458 { "vsqrtsd", { XMScalar
, VexScalar
, EXqScalar
}, 0 },
10461 /* VEX_W_0F52_P_0 */
10462 { "vrsqrtps", { XM
, EXx
}, 0 },
10465 /* VEX_W_0F52_P_1 */
10466 { "vrsqrtss", { XMScalar
, VexScalar
, EXdScalar
}, 0 },
10469 /* VEX_W_0F53_P_0 */
10470 { "vrcpps", { XM
, EXx
}, 0 },
10473 /* VEX_W_0F53_P_1 */
10474 { "vrcpss", { XMScalar
, VexScalar
, EXdScalar
}, 0 },
10477 /* VEX_W_0F58_P_0 */
10478 { "vaddps", { XM
, Vex
, EXx
}, 0 },
10481 /* VEX_W_0F58_P_1 */
10482 { "vaddss", { XMScalar
, VexScalar
, EXdScalar
}, 0 },
10485 /* VEX_W_0F58_P_2 */
10486 { "vaddpd", { XM
, Vex
, EXx
}, 0 },
10489 /* VEX_W_0F58_P_3 */
10490 { "vaddsd", { XMScalar
, VexScalar
, EXqScalar
}, 0 },
10493 /* VEX_W_0F59_P_0 */
10494 { "vmulps", { XM
, Vex
, EXx
}, 0 },
10497 /* VEX_W_0F59_P_1 */
10498 { "vmulss", { XMScalar
, VexScalar
, EXdScalar
}, 0 },
10501 /* VEX_W_0F59_P_2 */
10502 { "vmulpd", { XM
, Vex
, EXx
}, 0 },
10505 /* VEX_W_0F59_P_3 */
10506 { "vmulsd", { XMScalar
, VexScalar
, EXqScalar
}, 0 },
10509 /* VEX_W_0F5A_P_0 */
10510 { "vcvtps2pd", { XM
, EXxmmq
}, 0 },
10513 /* VEX_W_0F5A_P_1 */
10514 { "vcvtss2sd", { XMScalar
, VexScalar
, EXdScalar
}, 0 },
10517 /* VEX_W_0F5A_P_3 */
10518 { "vcvtsd2ss", { XMScalar
, VexScalar
, EXqScalar
}, 0 },
10521 /* VEX_W_0F5B_P_0 */
10522 { "vcvtdq2ps", { XM
, EXx
}, 0 },
10525 /* VEX_W_0F5B_P_1 */
10526 { "vcvttps2dq", { XM
, EXx
}, 0 },
10529 /* VEX_W_0F5B_P_2 */
10530 { "vcvtps2dq", { XM
, EXx
}, 0 },
10533 /* VEX_W_0F5C_P_0 */
10534 { "vsubps", { XM
, Vex
, EXx
}, 0 },
10537 /* VEX_W_0F5C_P_1 */
10538 { "vsubss", { XMScalar
, VexScalar
, EXdScalar
}, 0 },
10541 /* VEX_W_0F5C_P_2 */
10542 { "vsubpd", { XM
, Vex
, EXx
}, 0 },
10545 /* VEX_W_0F5C_P_3 */
10546 { "vsubsd", { XMScalar
, VexScalar
, EXqScalar
}, 0 },
10549 /* VEX_W_0F5D_P_0 */
10550 { "vminps", { XM
, Vex
, EXx
}, 0 },
10553 /* VEX_W_0F5D_P_1 */
10554 { "vminss", { XMScalar
, VexScalar
, EXdScalar
}, 0 },
10557 /* VEX_W_0F5D_P_2 */
10558 { "vminpd", { XM
, Vex
, EXx
}, 0 },
10561 /* VEX_W_0F5D_P_3 */
10562 { "vminsd", { XMScalar
, VexScalar
, EXqScalar
}, 0 },
10565 /* VEX_W_0F5E_P_0 */
10566 { "vdivps", { XM
, Vex
, EXx
}, 0 },
10569 /* VEX_W_0F5E_P_1 */
10570 { "vdivss", { XMScalar
, VexScalar
, EXdScalar
}, 0 },
10573 /* VEX_W_0F5E_P_2 */
10574 { "vdivpd", { XM
, Vex
, EXx
}, 0 },
10577 /* VEX_W_0F5E_P_3 */
10578 { "vdivsd", { XMScalar
, VexScalar
, EXqScalar
}, 0 },
10581 /* VEX_W_0F5F_P_0 */
10582 { "vmaxps", { XM
, Vex
, EXx
}, 0 },
10585 /* VEX_W_0F5F_P_1 */
10586 { "vmaxss", { XMScalar
, VexScalar
, EXdScalar
}, 0 },
10589 /* VEX_W_0F5F_P_2 */
10590 { "vmaxpd", { XM
, Vex
, EXx
}, 0 },
10593 /* VEX_W_0F5F_P_3 */
10594 { "vmaxsd", { XMScalar
, VexScalar
, EXqScalar
}, 0 },
10597 /* VEX_W_0F60_P_2 */
10598 { "vpunpcklbw", { XM
, Vex
, EXx
}, 0 },
10601 /* VEX_W_0F61_P_2 */
10602 { "vpunpcklwd", { XM
, Vex
, EXx
}, 0 },
10605 /* VEX_W_0F62_P_2 */
10606 { "vpunpckldq", { XM
, Vex
, EXx
}, 0 },
10609 /* VEX_W_0F63_P_2 */
10610 { "vpacksswb", { XM
, Vex
, EXx
}, 0 },
10613 /* VEX_W_0F64_P_2 */
10614 { "vpcmpgtb", { XM
, Vex
, EXx
}, 0 },
10617 /* VEX_W_0F65_P_2 */
10618 { "vpcmpgtw", { XM
, Vex
, EXx
}, 0 },
10621 /* VEX_W_0F66_P_2 */
10622 { "vpcmpgtd", { XM
, Vex
, EXx
}, 0 },
10625 /* VEX_W_0F67_P_2 */
10626 { "vpackuswb", { XM
, Vex
, EXx
}, 0 },
10629 /* VEX_W_0F68_P_2 */
10630 { "vpunpckhbw", { XM
, Vex
, EXx
}, 0 },
10633 /* VEX_W_0F69_P_2 */
10634 { "vpunpckhwd", { XM
, Vex
, EXx
}, 0 },
10637 /* VEX_W_0F6A_P_2 */
10638 { "vpunpckhdq", { XM
, Vex
, EXx
}, 0 },
10641 /* VEX_W_0F6B_P_2 */
10642 { "vpackssdw", { XM
, Vex
, EXx
}, 0 },
10645 /* VEX_W_0F6C_P_2 */
10646 { "vpunpcklqdq", { XM
, Vex
, EXx
}, 0 },
10649 /* VEX_W_0F6D_P_2 */
10650 { "vpunpckhqdq", { XM
, Vex
, EXx
}, 0 },
10653 /* VEX_W_0F6F_P_1 */
10654 { "vmovdqu", { XM
, EXx
}, 0 },
10657 /* VEX_W_0F6F_P_2 */
10658 { "vmovdqa", { XM
, EXx
}, 0 },
10661 /* VEX_W_0F70_P_1 */
10662 { "vpshufhw", { XM
, EXx
, Ib
}, 0 },
10665 /* VEX_W_0F70_P_2 */
10666 { "vpshufd", { XM
, EXx
, Ib
}, 0 },
10669 /* VEX_W_0F70_P_3 */
10670 { "vpshuflw", { XM
, EXx
, Ib
}, 0 },
10673 /* VEX_W_0F71_R_2_P_2 */
10674 { "vpsrlw", { Vex
, XS
, Ib
}, 0 },
10677 /* VEX_W_0F71_R_4_P_2 */
10678 { "vpsraw", { Vex
, XS
, Ib
}, 0 },
10681 /* VEX_W_0F71_R_6_P_2 */
10682 { "vpsllw", { Vex
, XS
, Ib
}, 0 },
10685 /* VEX_W_0F72_R_2_P_2 */
10686 { "vpsrld", { Vex
, XS
, Ib
}, 0 },
10689 /* VEX_W_0F72_R_4_P_2 */
10690 { "vpsrad", { Vex
, XS
, Ib
}, 0 },
10693 /* VEX_W_0F72_R_6_P_2 */
10694 { "vpslld", { Vex
, XS
, Ib
}, 0 },
10697 /* VEX_W_0F73_R_2_P_2 */
10698 { "vpsrlq", { Vex
, XS
, Ib
}, 0 },
10701 /* VEX_W_0F73_R_3_P_2 */
10702 { "vpsrldq", { Vex
, XS
, Ib
}, 0 },
10705 /* VEX_W_0F73_R_6_P_2 */
10706 { "vpsllq", { Vex
, XS
, Ib
}, 0 },
10709 /* VEX_W_0F73_R_7_P_2 */
10710 { "vpslldq", { Vex
, XS
, Ib
}, 0 },
10713 /* VEX_W_0F74_P_2 */
10714 { "vpcmpeqb", { XM
, Vex
, EXx
}, 0 },
10717 /* VEX_W_0F75_P_2 */
10718 { "vpcmpeqw", { XM
, Vex
, EXx
}, 0 },
10721 /* VEX_W_0F76_P_2 */
10722 { "vpcmpeqd", { XM
, Vex
, EXx
}, 0 },
10725 /* VEX_W_0F77_P_0 */
10726 { "", { VZERO
}, 0 },
10729 /* VEX_W_0F7C_P_2 */
10730 { "vhaddpd", { XM
, Vex
, EXx
}, 0 },
10733 /* VEX_W_0F7C_P_3 */
10734 { "vhaddps", { XM
, Vex
, EXx
}, 0 },
10737 /* VEX_W_0F7D_P_2 */
10738 { "vhsubpd", { XM
, Vex
, EXx
}, 0 },
10741 /* VEX_W_0F7D_P_3 */
10742 { "vhsubps", { XM
, Vex
, EXx
}, 0 },
10745 /* VEX_W_0F7E_P_1 */
10746 { "vmovq", { XMScalar
, EXqScalar
}, 0 },
10749 /* VEX_W_0F7F_P_1 */
10750 { "vmovdqu", { EXxS
, XM
}, 0 },
10753 /* VEX_W_0F7F_P_2 */
10754 { "vmovdqa", { EXxS
, XM
}, 0 },
10757 /* VEX_W_0F90_P_0_LEN_0 */
10758 { "kmovw", { MaskG
, MaskE
}, 0 },
10759 { "kmovq", { MaskG
, MaskE
}, 0 },
10762 /* VEX_W_0F90_P_2_LEN_0 */
10763 { "kmovb", { MaskG
, MaskBDE
}, 0 },
10764 { "kmovd", { MaskG
, MaskBDE
}, 0 },
10767 /* VEX_W_0F91_P_0_LEN_0 */
10768 { MOD_TABLE (MOD_VEX_W_0_0F91_P_0_LEN_0
) },
10769 { MOD_TABLE (MOD_VEX_W_1_0F91_P_0_LEN_0
) },
10772 /* VEX_W_0F91_P_2_LEN_0 */
10773 { MOD_TABLE (MOD_VEX_W_0_0F91_P_2_LEN_0
) },
10774 { MOD_TABLE (MOD_VEX_W_1_0F91_P_2_LEN_0
) },
10777 /* VEX_W_0F92_P_0_LEN_0 */
10778 { MOD_TABLE (MOD_VEX_W_0_0F92_P_0_LEN_0
) },
10781 /* VEX_W_0F92_P_2_LEN_0 */
10782 { MOD_TABLE (MOD_VEX_W_0_0F92_P_2_LEN_0
) },
10785 /* VEX_W_0F92_P_3_LEN_0 */
10786 { MOD_TABLE (MOD_VEX_W_0_0F92_P_3_LEN_0
) },
10787 { MOD_TABLE (MOD_VEX_W_1_0F92_P_3_LEN_0
) },
10790 /* VEX_W_0F93_P_0_LEN_0 */
10791 { MOD_TABLE (MOD_VEX_W_0_0F93_P_0_LEN_0
) },
10794 /* VEX_W_0F93_P_2_LEN_0 */
10795 { MOD_TABLE (MOD_VEX_W_0_0F93_P_2_LEN_0
) },
10798 /* VEX_W_0F93_P_3_LEN_0 */
10799 { MOD_TABLE (MOD_VEX_W_0_0F93_P_3_LEN_0
) },
10800 { MOD_TABLE (MOD_VEX_W_1_0F93_P_3_LEN_0
) },
10803 /* VEX_W_0F98_P_0_LEN_0 */
10804 { MOD_TABLE (MOD_VEX_W_0_0F98_P_0_LEN_0
) },
10805 { MOD_TABLE (MOD_VEX_W_1_0F98_P_0_LEN_0
) },
10808 /* VEX_W_0F98_P_2_LEN_0 */
10809 { MOD_TABLE (MOD_VEX_W_0_0F98_P_2_LEN_0
) },
10810 { MOD_TABLE (MOD_VEX_W_1_0F98_P_2_LEN_0
) },
10813 /* VEX_W_0F99_P_0_LEN_0 */
10814 { MOD_TABLE (MOD_VEX_W_0_0F99_P_0_LEN_0
) },
10815 { MOD_TABLE (MOD_VEX_W_1_0F99_P_0_LEN_0
) },
10818 /* VEX_W_0F99_P_2_LEN_0 */
10819 { MOD_TABLE (MOD_VEX_W_0_0F99_P_2_LEN_0
) },
10820 { MOD_TABLE (MOD_VEX_W_1_0F99_P_2_LEN_0
) },
10823 /* VEX_W_0FAE_R_2_M_0 */
10824 { "vldmxcsr", { Md
}, 0 },
10827 /* VEX_W_0FAE_R_3_M_0 */
10828 { "vstmxcsr", { Md
}, 0 },
10831 /* VEX_W_0FC2_P_0 */
10832 { "vcmpps", { XM
, Vex
, EXx
, VCMP
}, 0 },
10835 /* VEX_W_0FC2_P_1 */
10836 { "vcmpss", { XMScalar
, VexScalar
, EXdScalar
, VCMP
}, 0 },
10839 /* VEX_W_0FC2_P_2 */
10840 { "vcmppd", { XM
, Vex
, EXx
, VCMP
}, 0 },
10843 /* VEX_W_0FC2_P_3 */
10844 { "vcmpsd", { XMScalar
, VexScalar
, EXqScalar
, VCMP
}, 0 },
10847 /* VEX_W_0FC4_P_2 */
10848 { "vpinsrw", { XM
, Vex128
, Edqw
, Ib
}, 0 },
10851 /* VEX_W_0FC5_P_2 */
10852 { "vpextrw", { Gdq
, XS
, Ib
}, 0 },
10855 /* VEX_W_0FD0_P_2 */
10856 { "vaddsubpd", { XM
, Vex
, EXx
}, 0 },
10859 /* VEX_W_0FD0_P_3 */
10860 { "vaddsubps", { XM
, Vex
, EXx
}, 0 },
10863 /* VEX_W_0FD1_P_2 */
10864 { "vpsrlw", { XM
, Vex
, EXxmm
}, 0 },
10867 /* VEX_W_0FD2_P_2 */
10868 { "vpsrld", { XM
, Vex
, EXxmm
}, 0 },
10871 /* VEX_W_0FD3_P_2 */
10872 { "vpsrlq", { XM
, Vex
, EXxmm
}, 0 },
10875 /* VEX_W_0FD4_P_2 */
10876 { "vpaddq", { XM
, Vex
, EXx
}, 0 },
10879 /* VEX_W_0FD5_P_2 */
10880 { "vpmullw", { XM
, Vex
, EXx
}, 0 },
10883 /* VEX_W_0FD6_P_2 */
10884 { "vmovq", { EXqScalarS
, XMScalar
}, 0 },
10887 /* VEX_W_0FD7_P_2_M_1 */
10888 { "vpmovmskb", { Gdq
, XS
}, 0 },
10891 /* VEX_W_0FD8_P_2 */
10892 { "vpsubusb", { XM
, Vex
, EXx
}, 0 },
10895 /* VEX_W_0FD9_P_2 */
10896 { "vpsubusw", { XM
, Vex
, EXx
}, 0 },
10899 /* VEX_W_0FDA_P_2 */
10900 { "vpminub", { XM
, Vex
, EXx
}, 0 },
10903 /* VEX_W_0FDB_P_2 */
10904 { "vpand", { XM
, Vex
, EXx
}, 0 },
10907 /* VEX_W_0FDC_P_2 */
10908 { "vpaddusb", { XM
, Vex
, EXx
}, 0 },
10911 /* VEX_W_0FDD_P_2 */
10912 { "vpaddusw", { XM
, Vex
, EXx
}, 0 },
10915 /* VEX_W_0FDE_P_2 */
10916 { "vpmaxub", { XM
, Vex
, EXx
}, 0 },
10919 /* VEX_W_0FDF_P_2 */
10920 { "vpandn", { XM
, Vex
, EXx
}, 0 },
10923 /* VEX_W_0FE0_P_2 */
10924 { "vpavgb", { XM
, Vex
, EXx
}, 0 },
10927 /* VEX_W_0FE1_P_2 */
10928 { "vpsraw", { XM
, Vex
, EXxmm
}, 0 },
10931 /* VEX_W_0FE2_P_2 */
10932 { "vpsrad", { XM
, Vex
, EXxmm
}, 0 },
10935 /* VEX_W_0FE3_P_2 */
10936 { "vpavgw", { XM
, Vex
, EXx
}, 0 },
10939 /* VEX_W_0FE4_P_2 */
10940 { "vpmulhuw", { XM
, Vex
, EXx
}, 0 },
10943 /* VEX_W_0FE5_P_2 */
10944 { "vpmulhw", { XM
, Vex
, EXx
}, 0 },
10947 /* VEX_W_0FE6_P_1 */
10948 { "vcvtdq2pd", { XM
, EXxmmq
}, 0 },
10951 /* VEX_W_0FE6_P_2 */
10952 { "vcvttpd2dq%XY", { XMM
, EXx
}, 0 },
10955 /* VEX_W_0FE6_P_3 */
10956 { "vcvtpd2dq%XY", { XMM
, EXx
}, 0 },
10959 /* VEX_W_0FE7_P_2_M_0 */
10960 { "vmovntdq", { Mx
, XM
}, 0 },
10963 /* VEX_W_0FE8_P_2 */
10964 { "vpsubsb", { XM
, Vex
, EXx
}, 0 },
10967 /* VEX_W_0FE9_P_2 */
10968 { "vpsubsw", { XM
, Vex
, EXx
}, 0 },
10971 /* VEX_W_0FEA_P_2 */
10972 { "vpminsw", { XM
, Vex
, EXx
}, 0 },
10975 /* VEX_W_0FEB_P_2 */
10976 { "vpor", { XM
, Vex
, EXx
}, 0 },
10979 /* VEX_W_0FEC_P_2 */
10980 { "vpaddsb", { XM
, Vex
, EXx
}, 0 },
10983 /* VEX_W_0FED_P_2 */
10984 { "vpaddsw", { XM
, Vex
, EXx
}, 0 },
10987 /* VEX_W_0FEE_P_2 */
10988 { "vpmaxsw", { XM
, Vex
, EXx
}, 0 },
10991 /* VEX_W_0FEF_P_2 */
10992 { "vpxor", { XM
, Vex
, EXx
}, 0 },
10995 /* VEX_W_0FF0_P_3_M_0 */
10996 { "vlddqu", { XM
, M
}, 0 },
10999 /* VEX_W_0FF1_P_2 */
11000 { "vpsllw", { XM
, Vex
, EXxmm
}, 0 },
11003 /* VEX_W_0FF2_P_2 */
11004 { "vpslld", { XM
, Vex
, EXxmm
}, 0 },
11007 /* VEX_W_0FF3_P_2 */
11008 { "vpsllq", { XM
, Vex
, EXxmm
}, 0 },
11011 /* VEX_W_0FF4_P_2 */
11012 { "vpmuludq", { XM
, Vex
, EXx
}, 0 },
11015 /* VEX_W_0FF5_P_2 */
11016 { "vpmaddwd", { XM
, Vex
, EXx
}, 0 },
11019 /* VEX_W_0FF6_P_2 */
11020 { "vpsadbw", { XM
, Vex
, EXx
}, 0 },
11023 /* VEX_W_0FF7_P_2 */
11024 { "vmaskmovdqu", { XM
, XS
}, 0 },
11027 /* VEX_W_0FF8_P_2 */
11028 { "vpsubb", { XM
, Vex
, EXx
}, 0 },
11031 /* VEX_W_0FF9_P_2 */
11032 { "vpsubw", { XM
, Vex
, EXx
}, 0 },
11035 /* VEX_W_0FFA_P_2 */
11036 { "vpsubd", { XM
, Vex
, EXx
}, 0 },
11039 /* VEX_W_0FFB_P_2 */
11040 { "vpsubq", { XM
, Vex
, EXx
}, 0 },
11043 /* VEX_W_0FFC_P_2 */
11044 { "vpaddb", { XM
, Vex
, EXx
}, 0 },
11047 /* VEX_W_0FFD_P_2 */
11048 { "vpaddw", { XM
, Vex
, EXx
}, 0 },
11051 /* VEX_W_0FFE_P_2 */
11052 { "vpaddd", { XM
, Vex
, EXx
}, 0 },
11055 /* VEX_W_0F3800_P_2 */
11056 { "vpshufb", { XM
, Vex
, EXx
}, 0 },
11059 /* VEX_W_0F3801_P_2 */
11060 { "vphaddw", { XM
, Vex
, EXx
}, 0 },
11063 /* VEX_W_0F3802_P_2 */
11064 { "vphaddd", { XM
, Vex
, EXx
}, 0 },
11067 /* VEX_W_0F3803_P_2 */
11068 { "vphaddsw", { XM
, Vex
, EXx
}, 0 },
11071 /* VEX_W_0F3804_P_2 */
11072 { "vpmaddubsw", { XM
, Vex
, EXx
}, 0 },
11075 /* VEX_W_0F3805_P_2 */
11076 { "vphsubw", { XM
, Vex
, EXx
}, 0 },
11079 /* VEX_W_0F3806_P_2 */
11080 { "vphsubd", { XM
, Vex
, EXx
}, 0 },
11083 /* VEX_W_0F3807_P_2 */
11084 { "vphsubsw", { XM
, Vex
, EXx
}, 0 },
11087 /* VEX_W_0F3808_P_2 */
11088 { "vpsignb", { XM
, Vex
, EXx
}, 0 },
11091 /* VEX_W_0F3809_P_2 */
11092 { "vpsignw", { XM
, Vex
, EXx
}, 0 },
11095 /* VEX_W_0F380A_P_2 */
11096 { "vpsignd", { XM
, Vex
, EXx
}, 0 },
11099 /* VEX_W_0F380B_P_2 */
11100 { "vpmulhrsw", { XM
, Vex
, EXx
}, 0 },
11103 /* VEX_W_0F380C_P_2 */
11104 { "vpermilps", { XM
, Vex
, EXx
}, 0 },
11107 /* VEX_W_0F380D_P_2 */
11108 { "vpermilpd", { XM
, Vex
, EXx
}, 0 },
11111 /* VEX_W_0F380E_P_2 */
11112 { "vtestps", { XM
, EXx
}, 0 },
11115 /* VEX_W_0F380F_P_2 */
11116 { "vtestpd", { XM
, EXx
}, 0 },
11119 /* VEX_W_0F3816_P_2 */
11120 { "vpermps", { XM
, Vex
, EXx
}, 0 },
11123 /* VEX_W_0F3817_P_2 */
11124 { "vptest", { XM
, EXx
}, 0 },
11127 /* VEX_W_0F3818_P_2 */
11128 { "vbroadcastss", { XM
, EXxmm_md
}, 0 },
11131 /* VEX_W_0F3819_P_2 */
11132 { "vbroadcastsd", { XM
, EXxmm_mq
}, 0 },
11135 /* VEX_W_0F381A_P_2_M_0 */
11136 { "vbroadcastf128", { XM
, Mxmm
}, 0 },
11139 /* VEX_W_0F381C_P_2 */
11140 { "vpabsb", { XM
, EXx
}, 0 },
11143 /* VEX_W_0F381D_P_2 */
11144 { "vpabsw", { XM
, EXx
}, 0 },
11147 /* VEX_W_0F381E_P_2 */
11148 { "vpabsd", { XM
, EXx
}, 0 },
11151 /* VEX_W_0F3820_P_2 */
11152 { "vpmovsxbw", { XM
, EXxmmq
}, 0 },
11155 /* VEX_W_0F3821_P_2 */
11156 { "vpmovsxbd", { XM
, EXxmmqd
}, 0 },
11159 /* VEX_W_0F3822_P_2 */
11160 { "vpmovsxbq", { XM
, EXxmmdw
}, 0 },
11163 /* VEX_W_0F3823_P_2 */
11164 { "vpmovsxwd", { XM
, EXxmmq
}, 0 },
11167 /* VEX_W_0F3824_P_2 */
11168 { "vpmovsxwq", { XM
, EXxmmqd
}, 0 },
11171 /* VEX_W_0F3825_P_2 */
11172 { "vpmovsxdq", { XM
, EXxmmq
}, 0 },
11175 /* VEX_W_0F3828_P_2 */
11176 { "vpmuldq", { XM
, Vex
, EXx
}, 0 },
11179 /* VEX_W_0F3829_P_2 */
11180 { "vpcmpeqq", { XM
, Vex
, EXx
}, 0 },
11183 /* VEX_W_0F382A_P_2_M_0 */
11184 { "vmovntdqa", { XM
, Mx
}, 0 },
11187 /* VEX_W_0F382B_P_2 */
11188 { "vpackusdw", { XM
, Vex
, EXx
}, 0 },
11191 /* VEX_W_0F382C_P_2_M_0 */
11192 { "vmaskmovps", { XM
, Vex
, Mx
}, 0 },
11195 /* VEX_W_0F382D_P_2_M_0 */
11196 { "vmaskmovpd", { XM
, Vex
, Mx
}, 0 },
11199 /* VEX_W_0F382E_P_2_M_0 */
11200 { "vmaskmovps", { Mx
, Vex
, XM
}, 0 },
11203 /* VEX_W_0F382F_P_2_M_0 */
11204 { "vmaskmovpd", { Mx
, Vex
, XM
}, 0 },
11207 /* VEX_W_0F3830_P_2 */
11208 { "vpmovzxbw", { XM
, EXxmmq
}, 0 },
11211 /* VEX_W_0F3831_P_2 */
11212 { "vpmovzxbd", { XM
, EXxmmqd
}, 0 },
11215 /* VEX_W_0F3832_P_2 */
11216 { "vpmovzxbq", { XM
, EXxmmdw
}, 0 },
11219 /* VEX_W_0F3833_P_2 */
11220 { "vpmovzxwd", { XM
, EXxmmq
}, 0 },
11223 /* VEX_W_0F3834_P_2 */
11224 { "vpmovzxwq", { XM
, EXxmmqd
}, 0 },
11227 /* VEX_W_0F3835_P_2 */
11228 { "vpmovzxdq", { XM
, EXxmmq
}, 0 },
11231 /* VEX_W_0F3836_P_2 */
11232 { "vpermd", { XM
, Vex
, EXx
}, 0 },
11235 /* VEX_W_0F3837_P_2 */
11236 { "vpcmpgtq", { XM
, Vex
, EXx
}, 0 },
11239 /* VEX_W_0F3838_P_2 */
11240 { "vpminsb", { XM
, Vex
, EXx
}, 0 },
11243 /* VEX_W_0F3839_P_2 */
11244 { "vpminsd", { XM
, Vex
, EXx
}, 0 },
11247 /* VEX_W_0F383A_P_2 */
11248 { "vpminuw", { XM
, Vex
, EXx
}, 0 },
11251 /* VEX_W_0F383B_P_2 */
11252 { "vpminud", { XM
, Vex
, EXx
}, 0 },
11255 /* VEX_W_0F383C_P_2 */
11256 { "vpmaxsb", { XM
, Vex
, EXx
}, 0 },
11259 /* VEX_W_0F383D_P_2 */
11260 { "vpmaxsd", { XM
, Vex
, EXx
}, 0 },
11263 /* VEX_W_0F383E_P_2 */
11264 { "vpmaxuw", { XM
, Vex
, EXx
}, 0 },
11267 /* VEX_W_0F383F_P_2 */
11268 { "vpmaxud", { XM
, Vex
, EXx
}, 0 },
11271 /* VEX_W_0F3840_P_2 */
11272 { "vpmulld", { XM
, Vex
, EXx
}, 0 },
11275 /* VEX_W_0F3841_P_2 */
11276 { "vphminposuw", { XM
, EXx
}, 0 },
11279 /* VEX_W_0F3846_P_2 */
11280 { "vpsravd", { XM
, Vex
, EXx
}, 0 },
11283 /* VEX_W_0F3858_P_2 */
11284 { "vpbroadcastd", { XM
, EXxmm_md
}, 0 },
11287 /* VEX_W_0F3859_P_2 */
11288 { "vpbroadcastq", { XM
, EXxmm_mq
}, 0 },
11291 /* VEX_W_0F385A_P_2_M_0 */
11292 { "vbroadcasti128", { XM
, Mxmm
}, 0 },
11295 /* VEX_W_0F3878_P_2 */
11296 { "vpbroadcastb", { XM
, EXxmm_mb
}, 0 },
11299 /* VEX_W_0F3879_P_2 */
11300 { "vpbroadcastw", { XM
, EXxmm_mw
}, 0 },
11303 /* VEX_W_0F38CF_P_2 */
11304 { "vgf2p8mulb", { XM
, Vex
, EXx
}, 0 },
11307 /* VEX_W_0F38DB_P_2 */
11308 { "vaesimc", { XM
, EXx
}, 0 },
11311 /* VEX_W_0F3A00_P_2 */
11313 { "vpermq", { XM
, EXx
, Ib
}, 0 },
11316 /* VEX_W_0F3A01_P_2 */
11318 { "vpermpd", { XM
, EXx
, Ib
}, 0 },
11321 /* VEX_W_0F3A02_P_2 */
11322 { "vpblendd", { XM
, Vex
, EXx
, Ib
}, 0 },
11325 /* VEX_W_0F3A04_P_2 */
11326 { "vpermilps", { XM
, EXx
, Ib
}, 0 },
11329 /* VEX_W_0F3A05_P_2 */
11330 { "vpermilpd", { XM
, EXx
, Ib
}, 0 },
11333 /* VEX_W_0F3A06_P_2 */
11334 { "vperm2f128", { XM
, Vex256
, EXx
, Ib
}, 0 },
11337 /* VEX_W_0F3A08_P_2 */
11338 { "vroundps", { XM
, EXx
, Ib
}, 0 },
11341 /* VEX_W_0F3A09_P_2 */
11342 { "vroundpd", { XM
, EXx
, Ib
}, 0 },
11345 /* VEX_W_0F3A0A_P_2 */
11346 { "vroundss", { XMScalar
, VexScalar
, EXdScalar
, Ib
}, 0 },
11349 /* VEX_W_0F3A0B_P_2 */
11350 { "vroundsd", { XMScalar
, VexScalar
, EXqScalar
, Ib
}, 0 },
11353 /* VEX_W_0F3A0C_P_2 */
11354 { "vblendps", { XM
, Vex
, EXx
, Ib
}, 0 },
11357 /* VEX_W_0F3A0D_P_2 */
11358 { "vblendpd", { XM
, Vex
, EXx
, Ib
}, 0 },
11361 /* VEX_W_0F3A0E_P_2 */
11362 { "vpblendw", { XM
, Vex
, EXx
, Ib
}, 0 },
11365 /* VEX_W_0F3A0F_P_2 */
11366 { "vpalignr", { XM
, Vex
, EXx
, Ib
}, 0 },
11369 /* VEX_W_0F3A14_P_2 */
11370 { "vpextrb", { Edqb
, XM
, Ib
}, 0 },
11373 /* VEX_W_0F3A15_P_2 */
11374 { "vpextrw", { Edqw
, XM
, Ib
}, 0 },
11377 /* VEX_W_0F3A18_P_2 */
11378 { "vinsertf128", { XM
, Vex256
, EXxmm
, Ib
}, 0 },
11381 /* VEX_W_0F3A19_P_2 */
11382 { "vextractf128", { EXxmm
, XM
, Ib
}, 0 },
11385 /* VEX_W_0F3A20_P_2 */
11386 { "vpinsrb", { XM
, Vex128
, Edqb
, Ib
}, 0 },
11389 /* VEX_W_0F3A21_P_2 */
11390 { "vinsertps", { XM
, Vex128
, EXd
, Ib
}, 0 },
11393 /* VEX_W_0F3A30_P_2_LEN_0 */
11394 { MOD_TABLE (MOD_VEX_W_0_0F3A30_P_2_LEN_0
) },
11395 { MOD_TABLE (MOD_VEX_W_1_0F3A30_P_2_LEN_0
) },
11398 /* VEX_W_0F3A31_P_2_LEN_0 */
11399 { MOD_TABLE (MOD_VEX_W_0_0F3A31_P_2_LEN_0
) },
11400 { MOD_TABLE (MOD_VEX_W_1_0F3A31_P_2_LEN_0
) },
11403 /* VEX_W_0F3A32_P_2_LEN_0 */
11404 { MOD_TABLE (MOD_VEX_W_0_0F3A32_P_2_LEN_0
) },
11405 { MOD_TABLE (MOD_VEX_W_1_0F3A32_P_2_LEN_0
) },
11408 /* VEX_W_0F3A33_P_2_LEN_0 */
11409 { MOD_TABLE (MOD_VEX_W_0_0F3A33_P_2_LEN_0
) },
11410 { MOD_TABLE (MOD_VEX_W_1_0F3A33_P_2_LEN_0
) },
11413 /* VEX_W_0F3A38_P_2 */
11414 { "vinserti128", { XM
, Vex256
, EXxmm
, Ib
}, 0 },
11417 /* VEX_W_0F3A39_P_2 */
11418 { "vextracti128", { EXxmm
, XM
, Ib
}, 0 },
11421 /* VEX_W_0F3A40_P_2 */
11422 { "vdpps", { XM
, Vex
, EXx
, Ib
}, 0 },
11425 /* VEX_W_0F3A41_P_2 */
11426 { "vdppd", { XM
, Vex128
, EXx
, Ib
}, 0 },
11429 /* VEX_W_0F3A42_P_2 */
11430 { "vmpsadbw", { XM
, Vex
, EXx
, Ib
}, 0 },
11433 /* VEX_W_0F3A46_P_2 */
11434 { "vperm2i128", { XM
, Vex256
, EXx
, Ib
}, 0 },
11437 /* VEX_W_0F3A48_P_2 */
11438 { "vpermil2ps", { XMVexW
, Vex
, EXVexImmW
, EXVexImmW
, EXVexImmW
}, 0 },
11439 { "vpermil2ps", { XMVexW
, Vex
, EXVexImmW
, EXVexImmW
, EXVexImmW
}, 0 },
11442 /* VEX_W_0F3A49_P_2 */
11443 { "vpermil2pd", { XMVexW
, Vex
, EXVexImmW
, EXVexImmW
, EXVexImmW
}, 0 },
11444 { "vpermil2pd", { XMVexW
, Vex
, EXVexImmW
, EXVexImmW
, EXVexImmW
}, 0 },
11447 /* VEX_W_0F3A4A_P_2 */
11448 { "vblendvps", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
11451 /* VEX_W_0F3A4B_P_2 */
11452 { "vblendvpd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
11455 /* VEX_W_0F3A4C_P_2 */
11456 { "vpblendvb", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
11459 /* VEX_W_0F3A62_P_2 */
11460 { "vpcmpistrm", { XM
, EXx
, Ib
}, 0 },
11463 /* VEX_W_0F3A63_P_2 */
11464 { "vpcmpistri", { XM
, EXx
, Ib
}, 0 },
11467 /* VEX_W_0F3ACE_P_2 */
11469 { "vgf2p8affineqb", { XM
, Vex
, EXx
, Ib
}, 0 },
11472 /* VEX_W_0F3ACF_P_2 */
11474 { "vgf2p8affineinvqb", { XM
, Vex
, EXx
, Ib
}, 0 },
11477 /* VEX_W_0F3ADF_P_2 */
11478 { "vaeskeygenassist", { XM
, EXx
, Ib
}, 0 },
11480 #define NEED_VEX_W_TABLE
11481 #include "i386-dis-evex.h"
11482 #undef NEED_VEX_W_TABLE
11485 static const struct dis386 mod_table
[][2] = {
11488 { "leaS", { Gv
, M
}, 0 },
11493 { RM_TABLE (RM_C6_REG_7
) },
11498 { RM_TABLE (RM_C7_REG_7
) },
11502 { "Jcall^", { indirEp
}, 0 },
11506 { "Jjmp^", { indirEp
}, 0 },
11509 /* MOD_0F01_REG_0 */
11510 { X86_64_TABLE (X86_64_0F01_REG_0
) },
11511 { RM_TABLE (RM_0F01_REG_0
) },
11514 /* MOD_0F01_REG_1 */
11515 { X86_64_TABLE (X86_64_0F01_REG_1
) },
11516 { RM_TABLE (RM_0F01_REG_1
) },
11519 /* MOD_0F01_REG_2 */
11520 { X86_64_TABLE (X86_64_0F01_REG_2
) },
11521 { RM_TABLE (RM_0F01_REG_2
) },
11524 /* MOD_0F01_REG_3 */
11525 { X86_64_TABLE (X86_64_0F01_REG_3
) },
11526 { RM_TABLE (RM_0F01_REG_3
) },
11529 /* MOD_0F01_REG_5 */
11530 { PREFIX_TABLE (PREFIX_MOD_0_0F01_REG_5
) },
11531 { RM_TABLE (RM_0F01_REG_5
) },
11534 /* MOD_0F01_REG_7 */
11535 { "invlpg", { Mb
}, 0 },
11536 { RM_TABLE (RM_0F01_REG_7
) },
11539 /* MOD_0F12_PREFIX_0 */
11540 { "movlps", { XM
, EXq
}, PREFIX_OPCODE
},
11541 { "movhlps", { XM
, EXq
}, PREFIX_OPCODE
},
11545 { "movlpX", { EXq
, XM
}, PREFIX_OPCODE
},
11548 /* MOD_0F16_PREFIX_0 */
11549 { "movhps", { XM
, EXq
}, 0 },
11550 { "movlhps", { XM
, EXq
}, 0 },
11554 { "movhpX", { EXq
, XM
}, PREFIX_OPCODE
},
11557 /* MOD_0F18_REG_0 */
11558 { "prefetchnta", { Mb
}, 0 },
11561 /* MOD_0F18_REG_1 */
11562 { "prefetcht0", { Mb
}, 0 },
11565 /* MOD_0F18_REG_2 */
11566 { "prefetcht1", { Mb
}, 0 },
11569 /* MOD_0F18_REG_3 */
11570 { "prefetcht2", { Mb
}, 0 },
11573 /* MOD_0F18_REG_4 */
11574 { "nop/reserved", { Mb
}, 0 },
11577 /* MOD_0F18_REG_5 */
11578 { "nop/reserved", { Mb
}, 0 },
11581 /* MOD_0F18_REG_6 */
11582 { "nop/reserved", { Mb
}, 0 },
11585 /* MOD_0F18_REG_7 */
11586 { "nop/reserved", { Mb
}, 0 },
11589 /* MOD_0F1A_PREFIX_0 */
11590 { "bndldx", { Gbnd
, Ev_bnd
}, 0 },
11591 { "nopQ", { Ev
}, 0 },
11594 /* MOD_0F1B_PREFIX_0 */
11595 { "bndstx", { Ev_bnd
, Gbnd
}, 0 },
11596 { "nopQ", { Ev
}, 0 },
11599 /* MOD_0F1B_PREFIX_1 */
11600 { "bndmk", { Gbnd
, Ev_bnd
}, 0 },
11601 { "nopQ", { Ev
}, 0 },
11604 /* MOD_0F1E_PREFIX_1 */
11605 { "nopQ", { Ev
}, 0 },
11606 { REG_TABLE (REG_0F1E_MOD_3
) },
11611 { "movL", { Rd
, Td
}, 0 },
11616 { "movL", { Td
, Rd
}, 0 },
11619 /* MOD_0F2B_PREFIX_0 */
11620 {"movntps", { Mx
, XM
}, PREFIX_OPCODE
},
11623 /* MOD_0F2B_PREFIX_1 */
11624 {"movntss", { Md
, XM
}, PREFIX_OPCODE
},
11627 /* MOD_0F2B_PREFIX_2 */
11628 {"movntpd", { Mx
, XM
}, PREFIX_OPCODE
},
11631 /* MOD_0F2B_PREFIX_3 */
11632 {"movntsd", { Mq
, XM
}, PREFIX_OPCODE
},
11637 { "movmskpX", { Gdq
, XS
}, PREFIX_OPCODE
},
11640 /* MOD_0F71_REG_2 */
11642 { "psrlw", { MS
, Ib
}, 0 },
11645 /* MOD_0F71_REG_4 */
11647 { "psraw", { MS
, Ib
}, 0 },
11650 /* MOD_0F71_REG_6 */
11652 { "psllw", { MS
, Ib
}, 0 },
11655 /* MOD_0F72_REG_2 */
11657 { "psrld", { MS
, Ib
}, 0 },
11660 /* MOD_0F72_REG_4 */
11662 { "psrad", { MS
, Ib
}, 0 },
11665 /* MOD_0F72_REG_6 */
11667 { "pslld", { MS
, Ib
}, 0 },
11670 /* MOD_0F73_REG_2 */
11672 { "psrlq", { MS
, Ib
}, 0 },
11675 /* MOD_0F73_REG_3 */
11677 { PREFIX_TABLE (PREFIX_0F73_REG_3
) },
11680 /* MOD_0F73_REG_6 */
11682 { "psllq", { MS
, Ib
}, 0 },
11685 /* MOD_0F73_REG_7 */
11687 { PREFIX_TABLE (PREFIX_0F73_REG_7
) },
11690 /* MOD_0FAE_REG_0 */
11691 { "fxsave", { FXSAVE
}, 0 },
11692 { PREFIX_TABLE (PREFIX_0FAE_REG_0
) },
11695 /* MOD_0FAE_REG_1 */
11696 { "fxrstor", { FXSAVE
}, 0 },
11697 { PREFIX_TABLE (PREFIX_0FAE_REG_1
) },
11700 /* MOD_0FAE_REG_2 */
11701 { "ldmxcsr", { Md
}, 0 },
11702 { PREFIX_TABLE (PREFIX_0FAE_REG_2
) },
11705 /* MOD_0FAE_REG_3 */
11706 { "stmxcsr", { Md
}, 0 },
11707 { PREFIX_TABLE (PREFIX_0FAE_REG_3
) },
11710 /* MOD_0FAE_REG_4 */
11711 { PREFIX_TABLE (PREFIX_MOD_0_0FAE_REG_4
) },
11712 { PREFIX_TABLE (PREFIX_MOD_3_0FAE_REG_4
) },
11715 /* MOD_0FAE_REG_5 */
11716 { PREFIX_TABLE (PREFIX_MOD_0_0FAE_REG_5
) },
11717 { PREFIX_TABLE (PREFIX_MOD_3_0FAE_REG_5
) },
11720 /* MOD_0FAE_REG_6 */
11721 { PREFIX_TABLE (PREFIX_0FAE_REG_6
) },
11722 { RM_TABLE (RM_0FAE_REG_6
) },
11725 /* MOD_0FAE_REG_7 */
11726 { PREFIX_TABLE (PREFIX_0FAE_REG_7
) },
11727 { RM_TABLE (RM_0FAE_REG_7
) },
11731 { "lssS", { Gv
, Mp
}, 0 },
11735 { "lfsS", { Gv
, Mp
}, 0 },
11739 { "lgsS", { Gv
, Mp
}, 0 },
11743 { PREFIX_TABLE (PREFIX_MOD_0_0FC3
) },
11746 /* MOD_0FC7_REG_3 */
11747 { "xrstors", { FXSAVE
}, 0 },
11750 /* MOD_0FC7_REG_4 */
11751 { "xsavec", { FXSAVE
}, 0 },
11754 /* MOD_0FC7_REG_5 */
11755 { "xsaves", { FXSAVE
}, 0 },
11758 /* MOD_0FC7_REG_6 */
11759 { PREFIX_TABLE (PREFIX_MOD_0_0FC7_REG_6
) },
11760 { PREFIX_TABLE (PREFIX_MOD_3_0FC7_REG_6
) }
11763 /* MOD_0FC7_REG_7 */
11764 { "vmptrst", { Mq
}, 0 },
11765 { PREFIX_TABLE (PREFIX_MOD_3_0FC7_REG_7
) }
11770 { "pmovmskb", { Gdq
, MS
}, 0 },
11773 /* MOD_0FE7_PREFIX_2 */
11774 { "movntdq", { Mx
, XM
}, 0 },
11777 /* MOD_0FF0_PREFIX_3 */
11778 { "lddqu", { XM
, M
}, 0 },
11781 /* MOD_0F382A_PREFIX_2 */
11782 { "movntdqa", { XM
, Mx
}, 0 },
11785 /* MOD_0F38F5_PREFIX_2 */
11786 { "wrussK", { M
, Gdq
}, PREFIX_OPCODE
},
11789 /* MOD_0F38F6_PREFIX_0 */
11790 { "wrssK", { M
, Gdq
}, PREFIX_OPCODE
},
11794 { "bound{S|}", { Gv
, Ma
}, 0 },
11795 { EVEX_TABLE (EVEX_0F
) },
11799 { "lesS", { Gv
, Mp
}, 0 },
11800 { VEX_C4_TABLE (VEX_0F
) },
11804 { "ldsS", { Gv
, Mp
}, 0 },
11805 { VEX_C5_TABLE (VEX_0F
) },
11808 /* MOD_VEX_0F12_PREFIX_0 */
11809 { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_0
) },
11810 { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_1
) },
11814 { VEX_LEN_TABLE (VEX_LEN_0F13_M_0
) },
11817 /* MOD_VEX_0F16_PREFIX_0 */
11818 { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_0
) },
11819 { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_1
) },
11823 { VEX_LEN_TABLE (VEX_LEN_0F17_M_0
) },
11827 { VEX_W_TABLE (VEX_W_0F2B_M_0
) },
11830 /* MOD_VEX_W_0_0F41_P_0_LEN_1 */
11832 { "kandw", { MaskG
, MaskVex
, MaskR
}, 0 },
11835 /* MOD_VEX_W_1_0F41_P_0_LEN_1 */
11837 { "kandq", { MaskG
, MaskVex
, MaskR
}, 0 },
11840 /* MOD_VEX_W_0_0F41_P_2_LEN_1 */
11842 { "kandb", { MaskG
, MaskVex
, MaskR
}, 0 },
11845 /* MOD_VEX_W_1_0F41_P_2_LEN_1 */
11847 { "kandd", { MaskG
, MaskVex
, MaskR
}, 0 },
11850 /* MOD_VEX_W_0_0F42_P_0_LEN_1 */
11852 { "kandnw", { MaskG
, MaskVex
, MaskR
}, 0 },
11855 /* MOD_VEX_W_1_0F42_P_0_LEN_1 */
11857 { "kandnq", { MaskG
, MaskVex
, MaskR
}, 0 },
11860 /* MOD_VEX_W_0_0F42_P_2_LEN_1 */
11862 { "kandnb", { MaskG
, MaskVex
, MaskR
}, 0 },
11865 /* MOD_VEX_W_1_0F42_P_2_LEN_1 */
11867 { "kandnd", { MaskG
, MaskVex
, MaskR
}, 0 },
11870 /* MOD_VEX_W_0_0F44_P_0_LEN_0 */
11872 { "knotw", { MaskG
, MaskR
}, 0 },
11875 /* MOD_VEX_W_1_0F44_P_0_LEN_0 */
11877 { "knotq", { MaskG
, MaskR
}, 0 },
11880 /* MOD_VEX_W_0_0F44_P_2_LEN_0 */
11882 { "knotb", { MaskG
, MaskR
}, 0 },
11885 /* MOD_VEX_W_1_0F44_P_2_LEN_0 */
11887 { "knotd", { MaskG
, MaskR
}, 0 },
11890 /* MOD_VEX_W_0_0F45_P_0_LEN_1 */
11892 { "korw", { MaskG
, MaskVex
, MaskR
}, 0 },
11895 /* MOD_VEX_W_1_0F45_P_0_LEN_1 */
11897 { "korq", { MaskG
, MaskVex
, MaskR
}, 0 },
11900 /* MOD_VEX_W_0_0F45_P_2_LEN_1 */
11902 { "korb", { MaskG
, MaskVex
, MaskR
}, 0 },
11905 /* MOD_VEX_W_1_0F45_P_2_LEN_1 */
11907 { "kord", { MaskG
, MaskVex
, MaskR
}, 0 },
11910 /* MOD_VEX_W_0_0F46_P_0_LEN_1 */
11912 { "kxnorw", { MaskG
, MaskVex
, MaskR
}, 0 },
11915 /* MOD_VEX_W_1_0F46_P_0_LEN_1 */
11917 { "kxnorq", { MaskG
, MaskVex
, MaskR
}, 0 },
11920 /* MOD_VEX_W_0_0F46_P_2_LEN_1 */
11922 { "kxnorb", { MaskG
, MaskVex
, MaskR
}, 0 },
11925 /* MOD_VEX_W_1_0F46_P_2_LEN_1 */
11927 { "kxnord", { MaskG
, MaskVex
, MaskR
}, 0 },
11930 /* MOD_VEX_W_0_0F47_P_0_LEN_1 */
11932 { "kxorw", { MaskG
, MaskVex
, MaskR
}, 0 },
11935 /* MOD_VEX_W_1_0F47_P_0_LEN_1 */
11937 { "kxorq", { MaskG
, MaskVex
, MaskR
}, 0 },
11940 /* MOD_VEX_W_0_0F47_P_2_LEN_1 */
11942 { "kxorb", { MaskG
, MaskVex
, MaskR
}, 0 },
11945 /* MOD_VEX_W_1_0F47_P_2_LEN_1 */
11947 { "kxord", { MaskG
, MaskVex
, MaskR
}, 0 },
11950 /* MOD_VEX_W_0_0F4A_P_0_LEN_1 */
11952 { "kaddw", { MaskG
, MaskVex
, MaskR
}, 0 },
11955 /* MOD_VEX_W_1_0F4A_P_0_LEN_1 */
11957 { "kaddq", { MaskG
, MaskVex
, MaskR
}, 0 },
11960 /* MOD_VEX_W_0_0F4A_P_2_LEN_1 */
11962 { "kaddb", { MaskG
, MaskVex
, MaskR
}, 0 },
11965 /* MOD_VEX_W_1_0F4A_P_2_LEN_1 */
11967 { "kaddd", { MaskG
, MaskVex
, MaskR
}, 0 },
11970 /* MOD_VEX_W_0_0F4B_P_0_LEN_1 */
11972 { "kunpckwd", { MaskG
, MaskVex
, MaskR
}, 0 },
11975 /* MOD_VEX_W_1_0F4B_P_0_LEN_1 */
11977 { "kunpckdq", { MaskG
, MaskVex
, MaskR
}, 0 },
11980 /* MOD_VEX_W_0_0F4B_P_2_LEN_1 */
11982 { "kunpckbw", { MaskG
, MaskVex
, MaskR
}, 0 },
11987 { VEX_W_TABLE (VEX_W_0F50_M_0
) },
11990 /* MOD_VEX_0F71_REG_2 */
11992 { PREFIX_TABLE (PREFIX_VEX_0F71_REG_2
) },
11995 /* MOD_VEX_0F71_REG_4 */
11997 { PREFIX_TABLE (PREFIX_VEX_0F71_REG_4
) },
12000 /* MOD_VEX_0F71_REG_6 */
12002 { PREFIX_TABLE (PREFIX_VEX_0F71_REG_6
) },
12005 /* MOD_VEX_0F72_REG_2 */
12007 { PREFIX_TABLE (PREFIX_VEX_0F72_REG_2
) },
12010 /* MOD_VEX_0F72_REG_4 */
12012 { PREFIX_TABLE (PREFIX_VEX_0F72_REG_4
) },
12015 /* MOD_VEX_0F72_REG_6 */
12017 { PREFIX_TABLE (PREFIX_VEX_0F72_REG_6
) },
12020 /* MOD_VEX_0F73_REG_2 */
12022 { PREFIX_TABLE (PREFIX_VEX_0F73_REG_2
) },
12025 /* MOD_VEX_0F73_REG_3 */
12027 { PREFIX_TABLE (PREFIX_VEX_0F73_REG_3
) },
12030 /* MOD_VEX_0F73_REG_6 */
12032 { PREFIX_TABLE (PREFIX_VEX_0F73_REG_6
) },
12035 /* MOD_VEX_0F73_REG_7 */
12037 { PREFIX_TABLE (PREFIX_VEX_0F73_REG_7
) },
12040 /* MOD_VEX_W_0_0F91_P_0_LEN_0 */
12041 { "kmovw", { Ew
, MaskG
}, 0 },
12045 /* MOD_VEX_W_0_0F91_P_0_LEN_0 */
12046 { "kmovq", { Eq
, MaskG
}, 0 },
12050 /* MOD_VEX_W_0_0F91_P_2_LEN_0 */
12051 { "kmovb", { Eb
, MaskG
}, 0 },
12055 /* MOD_VEX_W_0_0F91_P_2_LEN_0 */
12056 { "kmovd", { Ed
, MaskG
}, 0 },
12060 /* MOD_VEX_W_0_0F92_P_0_LEN_0 */
12062 { "kmovw", { MaskG
, Rdq
}, 0 },
12065 /* MOD_VEX_W_0_0F92_P_2_LEN_0 */
12067 { "kmovb", { MaskG
, Rdq
}, 0 },
12070 /* MOD_VEX_W_0_0F92_P_3_LEN_0 */
12072 { "kmovd", { MaskG
, Rdq
}, 0 },
12075 /* MOD_VEX_W_1_0F92_P_3_LEN_0 */
12077 { "kmovq", { MaskG
, Rdq
}, 0 },
12080 /* MOD_VEX_W_0_0F93_P_0_LEN_0 */
12082 { "kmovw", { Gdq
, MaskR
}, 0 },
12085 /* MOD_VEX_W_0_0F93_P_2_LEN_0 */
12087 { "kmovb", { Gdq
, MaskR
}, 0 },
12090 /* MOD_VEX_W_0_0F93_P_3_LEN_0 */
12092 { "kmovd", { Gdq
, MaskR
}, 0 },
12095 /* MOD_VEX_W_1_0F93_P_3_LEN_0 */
12097 { "kmovq", { Gdq
, MaskR
}, 0 },
12100 /* MOD_VEX_W_0_0F98_P_0_LEN_0 */
12102 { "kortestw", { MaskG
, MaskR
}, 0 },
12105 /* MOD_VEX_W_1_0F98_P_0_LEN_0 */
12107 { "kortestq", { MaskG
, MaskR
}, 0 },
12110 /* MOD_VEX_W_0_0F98_P_2_LEN_0 */
12112 { "kortestb", { MaskG
, MaskR
}, 0 },
12115 /* MOD_VEX_W_1_0F98_P_2_LEN_0 */
12117 { "kortestd", { MaskG
, MaskR
}, 0 },
12120 /* MOD_VEX_W_0_0F99_P_0_LEN_0 */
12122 { "ktestw", { MaskG
, MaskR
}, 0 },
12125 /* MOD_VEX_W_1_0F99_P_0_LEN_0 */
12127 { "ktestq", { MaskG
, MaskR
}, 0 },
12130 /* MOD_VEX_W_0_0F99_P_2_LEN_0 */
12132 { "ktestb", { MaskG
, MaskR
}, 0 },
12135 /* MOD_VEX_W_1_0F99_P_2_LEN_0 */
12137 { "ktestd", { MaskG
, MaskR
}, 0 },
12140 /* MOD_VEX_0FAE_REG_2 */
12141 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_2_M_0
) },
12144 /* MOD_VEX_0FAE_REG_3 */
12145 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_3_M_0
) },
12148 /* MOD_VEX_0FD7_PREFIX_2 */
12150 { VEX_W_TABLE (VEX_W_0FD7_P_2_M_1
) },
12153 /* MOD_VEX_0FE7_PREFIX_2 */
12154 { VEX_W_TABLE (VEX_W_0FE7_P_2_M_0
) },
12157 /* MOD_VEX_0FF0_PREFIX_3 */
12158 { VEX_W_TABLE (VEX_W_0FF0_P_3_M_0
) },
12161 /* MOD_VEX_0F381A_PREFIX_2 */
12162 { VEX_LEN_TABLE (VEX_LEN_0F381A_P_2_M_0
) },
12165 /* MOD_VEX_0F382A_PREFIX_2 */
12166 { VEX_W_TABLE (VEX_W_0F382A_P_2_M_0
) },
12169 /* MOD_VEX_0F382C_PREFIX_2 */
12170 { VEX_W_TABLE (VEX_W_0F382C_P_2_M_0
) },
12173 /* MOD_VEX_0F382D_PREFIX_2 */
12174 { VEX_W_TABLE (VEX_W_0F382D_P_2_M_0
) },
12177 /* MOD_VEX_0F382E_PREFIX_2 */
12178 { VEX_W_TABLE (VEX_W_0F382E_P_2_M_0
) },
12181 /* MOD_VEX_0F382F_PREFIX_2 */
12182 { VEX_W_TABLE (VEX_W_0F382F_P_2_M_0
) },
12185 /* MOD_VEX_0F385A_PREFIX_2 */
12186 { VEX_LEN_TABLE (VEX_LEN_0F385A_P_2_M_0
) },
12189 /* MOD_VEX_0F388C_PREFIX_2 */
12190 { "vpmaskmov%LW", { XM
, Vex
, Mx
}, 0 },
12193 /* MOD_VEX_0F388E_PREFIX_2 */
12194 { "vpmaskmov%LW", { Mx
, Vex
, XM
}, 0 },
12197 /* MOD_VEX_W_0_0F3A30_P_2_LEN_0 */
12199 { "kshiftrb", { MaskG
, MaskR
, Ib
}, 0 },
12202 /* MOD_VEX_W_1_0F3A30_P_2_LEN_0 */
12204 { "kshiftrw", { MaskG
, MaskR
, Ib
}, 0 },
12207 /* MOD_VEX_W_0_0F3A31_P_2_LEN_0 */
12209 { "kshiftrd", { MaskG
, MaskR
, Ib
}, 0 },
12212 /* MOD_VEX_W_1_0F3A31_P_2_LEN_0 */
12214 { "kshiftrq", { MaskG
, MaskR
, Ib
}, 0 },
12217 /* MOD_VEX_W_0_0F3A32_P_2_LEN_0 */
12219 { "kshiftlb", { MaskG
, MaskR
, Ib
}, 0 },
12222 /* MOD_VEX_W_1_0F3A32_P_2_LEN_0 */
12224 { "kshiftlw", { MaskG
, MaskR
, Ib
}, 0 },
12227 /* MOD_VEX_W_0_0F3A33_P_2_LEN_0 */
12229 { "kshiftld", { MaskG
, MaskR
, Ib
}, 0 },
12232 /* MOD_VEX_W_1_0F3A33_P_2_LEN_0 */
12234 { "kshiftlq", { MaskG
, MaskR
, Ib
}, 0 },
12236 #define NEED_MOD_TABLE
12237 #include "i386-dis-evex.h"
12238 #undef NEED_MOD_TABLE
12241 static const struct dis386 rm_table
[][8] = {
12244 { "xabort", { Skip_MODRM
, Ib
}, 0 },
12248 { "xbeginT", { Skip_MODRM
, Jv
}, 0 },
12251 /* RM_0F01_REG_0 */
12253 { "vmcall", { Skip_MODRM
}, 0 },
12254 { "vmlaunch", { Skip_MODRM
}, 0 },
12255 { "vmresume", { Skip_MODRM
}, 0 },
12256 { "vmxoff", { Skip_MODRM
}, 0 },
12259 /* RM_0F01_REG_1 */
12260 { "monitor", { { OP_Monitor
, 0 } }, 0 },
12261 { "mwait", { { OP_Mwait
, 0 } }, 0 },
12262 { "clac", { Skip_MODRM
}, 0 },
12263 { "stac", { Skip_MODRM
}, 0 },
12267 { "encls", { Skip_MODRM
}, 0 },
12270 /* RM_0F01_REG_2 */
12271 { "xgetbv", { Skip_MODRM
}, 0 },
12272 { "xsetbv", { Skip_MODRM
}, 0 },
12275 { "vmfunc", { Skip_MODRM
}, 0 },
12276 { "xend", { Skip_MODRM
}, 0 },
12277 { "xtest", { Skip_MODRM
}, 0 },
12278 { "enclu", { Skip_MODRM
}, 0 },
12281 /* RM_0F01_REG_3 */
12282 { "vmrun", { Skip_MODRM
}, 0 },
12283 { "vmmcall", { Skip_MODRM
}, 0 },
12284 { "vmload", { Skip_MODRM
}, 0 },
12285 { "vmsave", { Skip_MODRM
}, 0 },
12286 { "stgi", { Skip_MODRM
}, 0 },
12287 { "clgi", { Skip_MODRM
}, 0 },
12288 { "skinit", { Skip_MODRM
}, 0 },
12289 { "invlpga", { Skip_MODRM
}, 0 },
12292 /* RM_0F01_REG_5 */
12293 { PREFIX_TABLE (PREFIX_MOD_3_0F01_REG_5_RM_0
) },
12295 { PREFIX_TABLE (PREFIX_MOD_3_0F01_REG_5_RM_2
) },
12299 { "rdpkru", { Skip_MODRM
}, 0 },
12300 { "wrpkru", { Skip_MODRM
}, 0 },
12303 /* RM_0F01_REG_7 */
12304 { "swapgs", { Skip_MODRM
}, 0 },
12305 { "rdtscp", { Skip_MODRM
}, 0 },
12306 { "monitorx", { { OP_Monitor
, 0 } }, 0 },
12307 { "mwaitx", { { OP_Mwaitx
, 0 } }, 0 },
12308 { "clzero", { Skip_MODRM
}, 0 },
12311 /* RM_0F1E_MOD_3_REG_7 */
12312 { "nopQ", { Ev
}, 0 },
12313 { "nopQ", { Ev
}, 0 },
12314 { "endbr64", { Skip_MODRM
}, PREFIX_OPCODE
},
12315 { "endbr32", { Skip_MODRM
}, PREFIX_OPCODE
},
12316 { "nopQ", { Ev
}, 0 },
12317 { "nopQ", { Ev
}, 0 },
12318 { "nopQ", { Ev
}, 0 },
12319 { "nopQ", { Ev
}, 0 },
12322 /* RM_0FAE_REG_6 */
12323 { "mfence", { Skip_MODRM
}, 0 },
12326 /* RM_0FAE_REG_7 */
12327 { "sfence", { Skip_MODRM
}, 0 },
12332 #define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
12334 /* We use the high bit to indicate different name for the same
12336 #define REP_PREFIX (0xf3 | 0x100)
12337 #define XACQUIRE_PREFIX (0xf2 | 0x200)
12338 #define XRELEASE_PREFIX (0xf3 | 0x400)
12339 #define BND_PREFIX (0xf2 | 0x400)
12340 #define NOTRACK_PREFIX (0x3e | 0x100)
12345 int newrex
, i
, length
;
12351 last_lock_prefix
= -1;
12352 last_repz_prefix
= -1;
12353 last_repnz_prefix
= -1;
12354 last_data_prefix
= -1;
12355 last_addr_prefix
= -1;
12356 last_rex_prefix
= -1;
12357 last_seg_prefix
= -1;
12359 active_seg_prefix
= 0;
12360 for (i
= 0; i
< (int) ARRAY_SIZE (all_prefixes
); i
++)
12361 all_prefixes
[i
] = 0;
12364 /* The maximum instruction length is 15bytes. */
12365 while (length
< MAX_CODE_LENGTH
- 1)
12367 FETCH_DATA (the_info
, codep
+ 1);
12371 /* REX prefixes family. */
12388 if (address_mode
== mode_64bit
)
12392 last_rex_prefix
= i
;
12395 prefixes
|= PREFIX_REPZ
;
12396 last_repz_prefix
= i
;
12399 prefixes
|= PREFIX_REPNZ
;
12400 last_repnz_prefix
= i
;
12403 prefixes
|= PREFIX_LOCK
;
12404 last_lock_prefix
= i
;
12407 prefixes
|= PREFIX_CS
;
12408 last_seg_prefix
= i
;
12409 active_seg_prefix
= PREFIX_CS
;
12412 prefixes
|= PREFIX_SS
;
12413 last_seg_prefix
= i
;
12414 active_seg_prefix
= PREFIX_SS
;
12417 prefixes
|= PREFIX_DS
;
12418 last_seg_prefix
= i
;
12419 active_seg_prefix
= PREFIX_DS
;
12422 prefixes
|= PREFIX_ES
;
12423 last_seg_prefix
= i
;
12424 active_seg_prefix
= PREFIX_ES
;
12427 prefixes
|= PREFIX_FS
;
12428 last_seg_prefix
= i
;
12429 active_seg_prefix
= PREFIX_FS
;
12432 prefixes
|= PREFIX_GS
;
12433 last_seg_prefix
= i
;
12434 active_seg_prefix
= PREFIX_GS
;
12437 prefixes
|= PREFIX_DATA
;
12438 last_data_prefix
= i
;
12441 prefixes
|= PREFIX_ADDR
;
12442 last_addr_prefix
= i
;
12445 /* fwait is really an instruction. If there are prefixes
12446 before the fwait, they belong to the fwait, *not* to the
12447 following instruction. */
12449 if (prefixes
|| rex
)
12451 prefixes
|= PREFIX_FWAIT
;
12453 /* This ensures that the previous REX prefixes are noticed
12454 as unused prefixes, as in the return case below. */
12458 prefixes
= PREFIX_FWAIT
;
12463 /* Rex is ignored when followed by another prefix. */
12469 if (*codep
!= FWAIT_OPCODE
)
12470 all_prefixes
[i
++] = *codep
;
12478 /* Return the name of the prefix byte PREF, or NULL if PREF is not a
12481 static const char *
12482 prefix_name (int pref
, int sizeflag
)
12484 static const char *rexes
[16] =
12487 "rex.B", /* 0x41 */
12488 "rex.X", /* 0x42 */
12489 "rex.XB", /* 0x43 */
12490 "rex.R", /* 0x44 */
12491 "rex.RB", /* 0x45 */
12492 "rex.RX", /* 0x46 */
12493 "rex.RXB", /* 0x47 */
12494 "rex.W", /* 0x48 */
12495 "rex.WB", /* 0x49 */
12496 "rex.WX", /* 0x4a */
12497 "rex.WXB", /* 0x4b */
12498 "rex.WR", /* 0x4c */
12499 "rex.WRB", /* 0x4d */
12500 "rex.WRX", /* 0x4e */
12501 "rex.WRXB", /* 0x4f */
12506 /* REX prefixes family. */
12523 return rexes
[pref
- 0x40];
12543 return (sizeflag
& DFLAG
) ? "data16" : "data32";
12545 if (address_mode
== mode_64bit
)
12546 return (sizeflag
& AFLAG
) ? "addr32" : "addr64";
12548 return (sizeflag
& AFLAG
) ? "addr16" : "addr32";
12553 case XACQUIRE_PREFIX
:
12555 case XRELEASE_PREFIX
:
12559 case NOTRACK_PREFIX
:
12566 static char op_out
[MAX_OPERANDS
][100];
12567 static int op_ad
, op_index
[MAX_OPERANDS
];
12568 static int two_source_ops
;
12569 static bfd_vma op_address
[MAX_OPERANDS
];
12570 static bfd_vma op_riprel
[MAX_OPERANDS
];
12571 static bfd_vma start_pc
;
12574 * On the 386's of 1988, the maximum length of an instruction is 15 bytes.
12575 * (see topic "Redundant prefixes" in the "Differences from 8086"
12576 * section of the "Virtual 8086 Mode" chapter.)
12577 * 'pc' should be the address of this instruction, it will
12578 * be used to print the target address if this is a relative jump or call
12579 * The function returns the length of this instruction in bytes.
12582 static char intel_syntax
;
12583 static char intel_mnemonic
= !SYSV386_COMPAT
;
12584 static char open_char
;
12585 static char close_char
;
12586 static char separator_char
;
12587 static char scale_char
;
12595 static enum x86_64_isa isa64
;
12597 /* Here for backwards compatibility. When gdb stops using
12598 print_insn_i386_att and print_insn_i386_intel these functions can
12599 disappear, and print_insn_i386 be merged into print_insn. */
12601 print_insn_i386_att (bfd_vma pc
, disassemble_info
*info
)
12605 return print_insn (pc
, info
);
12609 print_insn_i386_intel (bfd_vma pc
, disassemble_info
*info
)
12613 return print_insn (pc
, info
);
12617 print_insn_i386 (bfd_vma pc
, disassemble_info
*info
)
12621 return print_insn (pc
, info
);
12625 print_i386_disassembler_options (FILE *stream
)
12627 fprintf (stream
, _("\n\
12628 The following i386/x86-64 specific disassembler options are supported for use\n\
12629 with the -M switch (multiple options should be separated by commas):\n"));
12631 fprintf (stream
, _(" x86-64 Disassemble in 64bit mode\n"));
12632 fprintf (stream
, _(" i386 Disassemble in 32bit mode\n"));
12633 fprintf (stream
, _(" i8086 Disassemble in 16bit mode\n"));
12634 fprintf (stream
, _(" att Display instruction in AT&T syntax\n"));
12635 fprintf (stream
, _(" intel Display instruction in Intel syntax\n"));
12636 fprintf (stream
, _(" att-mnemonic\n"
12637 " Display instruction in AT&T mnemonic\n"));
12638 fprintf (stream
, _(" intel-mnemonic\n"
12639 " Display instruction in Intel mnemonic\n"));
12640 fprintf (stream
, _(" addr64 Assume 64bit address size\n"));
12641 fprintf (stream
, _(" addr32 Assume 32bit address size\n"));
12642 fprintf (stream
, _(" addr16 Assume 16bit address size\n"));
12643 fprintf (stream
, _(" data32 Assume 32bit data size\n"));
12644 fprintf (stream
, _(" data16 Assume 16bit data size\n"));
12645 fprintf (stream
, _(" suffix Always display instruction suffix in AT&T syntax\n"));
12646 fprintf (stream
, _(" amd64 Display instruction in AMD64 ISA\n"));
12647 fprintf (stream
, _(" intel64 Display instruction in Intel64 ISA\n"));
12651 static const struct dis386 bad_opcode
= { "(bad)", { XX
}, 0 };
12653 /* Get a pointer to struct dis386 with a valid name. */
12655 static const struct dis386
*
12656 get_valid_dis386 (const struct dis386
*dp
, disassemble_info
*info
)
12658 int vindex
, vex_table_index
;
12660 if (dp
->name
!= NULL
)
12663 switch (dp
->op
[0].bytemode
)
12665 case USE_REG_TABLE
:
12666 dp
= ®_table
[dp
->op
[1].bytemode
][modrm
.reg
];
12669 case USE_MOD_TABLE
:
12670 vindex
= modrm
.mod
== 0x3 ? 1 : 0;
12671 dp
= &mod_table
[dp
->op
[1].bytemode
][vindex
];
12675 dp
= &rm_table
[dp
->op
[1].bytemode
][modrm
.rm
];
12678 case USE_PREFIX_TABLE
:
12681 /* The prefix in VEX is implicit. */
12682 switch (vex
.prefix
)
12687 case REPE_PREFIX_OPCODE
:
12690 case DATA_PREFIX_OPCODE
:
12693 case REPNE_PREFIX_OPCODE
:
12703 int last_prefix
= -1;
12706 /* We check PREFIX_REPNZ and PREFIX_REPZ before PREFIX_DATA.
12707 When there are multiple PREFIX_REPNZ and PREFIX_REPZ, the
12709 if ((prefixes
& (PREFIX_REPZ
| PREFIX_REPNZ
)) != 0)
12711 if (last_repz_prefix
> last_repnz_prefix
)
12714 prefix
= PREFIX_REPZ
;
12715 last_prefix
= last_repz_prefix
;
12720 prefix
= PREFIX_REPNZ
;
12721 last_prefix
= last_repnz_prefix
;
12724 /* Check if prefix should be ignored. */
12725 if ((((prefix_table
[dp
->op
[1].bytemode
][vindex
].prefix_requirement
12726 & PREFIX_IGNORED
) >> PREFIX_IGNORED_SHIFT
)
12731 if (vindex
== 0 && (prefixes
& PREFIX_DATA
) != 0)
12734 prefix
= PREFIX_DATA
;
12735 last_prefix
= last_data_prefix
;
12740 used_prefixes
|= prefix
;
12741 all_prefixes
[last_prefix
] = 0;
12744 dp
= &prefix_table
[dp
->op
[1].bytemode
][vindex
];
12747 case USE_X86_64_TABLE
:
12748 vindex
= address_mode
== mode_64bit
? 1 : 0;
12749 dp
= &x86_64_table
[dp
->op
[1].bytemode
][vindex
];
12752 case USE_3BYTE_TABLE
:
12753 FETCH_DATA (info
, codep
+ 2);
12755 dp
= &three_byte_table
[dp
->op
[1].bytemode
][vindex
];
12757 modrm
.mod
= (*codep
>> 6) & 3;
12758 modrm
.reg
= (*codep
>> 3) & 7;
12759 modrm
.rm
= *codep
& 7;
12762 case USE_VEX_LEN_TABLE
:
12766 switch (vex
.length
)
12779 dp
= &vex_len_table
[dp
->op
[1].bytemode
][vindex
];
12782 case USE_XOP_8F_TABLE
:
12783 FETCH_DATA (info
, codep
+ 3);
12784 /* All bits in the REX prefix are ignored. */
12786 rex
= ~(*codep
>> 5) & 0x7;
12788 /* VEX_TABLE_INDEX is the mmmmm part of the XOP byte 1 "RCB.mmmmm". */
12789 switch ((*codep
& 0x1f))
12795 vex_table_index
= XOP_08
;
12798 vex_table_index
= XOP_09
;
12801 vex_table_index
= XOP_0A
;
12805 vex
.w
= *codep
& 0x80;
12806 if (vex
.w
&& address_mode
== mode_64bit
)
12809 vex
.register_specifier
= (~(*codep
>> 3)) & 0xf;
12810 if (address_mode
!= mode_64bit
)
12812 /* In 16/32-bit mode REX_B is silently ignored. */
12814 if (vex
.register_specifier
> 0x7)
12821 vex
.length
= (*codep
& 0x4) ? 256 : 128;
12822 switch ((*codep
& 0x3))
12828 vex
.prefix
= DATA_PREFIX_OPCODE
;
12831 vex
.prefix
= REPE_PREFIX_OPCODE
;
12834 vex
.prefix
= REPNE_PREFIX_OPCODE
;
12841 dp
= &xop_table
[vex_table_index
][vindex
];
12844 FETCH_DATA (info
, codep
+ 1);
12845 modrm
.mod
= (*codep
>> 6) & 3;
12846 modrm
.reg
= (*codep
>> 3) & 7;
12847 modrm
.rm
= *codep
& 7;
12850 case USE_VEX_C4_TABLE
:
12852 FETCH_DATA (info
, codep
+ 3);
12853 /* All bits in the REX prefix are ignored. */
12855 rex
= ~(*codep
>> 5) & 0x7;
12856 switch ((*codep
& 0x1f))
12862 vex_table_index
= VEX_0F
;
12865 vex_table_index
= VEX_0F38
;
12868 vex_table_index
= VEX_0F3A
;
12872 vex
.w
= *codep
& 0x80;
12873 if (address_mode
== mode_64bit
)
12877 vex
.register_specifier
= (~(*codep
>> 3)) & 0xf;
12881 /* For the 3-byte VEX prefix in 32-bit mode, the REX_B bit
12882 is ignored, other REX bits are 0 and the highest bit in
12883 VEX.vvvv is also ignored. */
12885 vex
.register_specifier
= (~(*codep
>> 3)) & 0x7;
12887 vex
.length
= (*codep
& 0x4) ? 256 : 128;
12888 switch ((*codep
& 0x3))
12894 vex
.prefix
= DATA_PREFIX_OPCODE
;
12897 vex
.prefix
= REPE_PREFIX_OPCODE
;
12900 vex
.prefix
= REPNE_PREFIX_OPCODE
;
12907 dp
= &vex_table
[vex_table_index
][vindex
];
12909 /* There is no MODRM byte for VEX0F 77. */
12910 if (vex_table_index
!= VEX_0F
|| vindex
!= 0x77)
12912 FETCH_DATA (info
, codep
+ 1);
12913 modrm
.mod
= (*codep
>> 6) & 3;
12914 modrm
.reg
= (*codep
>> 3) & 7;
12915 modrm
.rm
= *codep
& 7;
12919 case USE_VEX_C5_TABLE
:
12921 FETCH_DATA (info
, codep
+ 2);
12922 /* All bits in the REX prefix are ignored. */
12924 rex
= (*codep
& 0x80) ? 0 : REX_R
;
12926 /* For the 2-byte VEX prefix in 32-bit mode, the highest bit in
12928 vex
.register_specifier
= (~(*codep
>> 3)) & 0xf;
12930 vex
.length
= (*codep
& 0x4) ? 256 : 128;
12931 switch ((*codep
& 0x3))
12937 vex
.prefix
= DATA_PREFIX_OPCODE
;
12940 vex
.prefix
= REPE_PREFIX_OPCODE
;
12943 vex
.prefix
= REPNE_PREFIX_OPCODE
;
12950 dp
= &vex_table
[dp
->op
[1].bytemode
][vindex
];
12952 /* There is no MODRM byte for VEX 77. */
12953 if (vindex
!= 0x77)
12955 FETCH_DATA (info
, codep
+ 1);
12956 modrm
.mod
= (*codep
>> 6) & 3;
12957 modrm
.reg
= (*codep
>> 3) & 7;
12958 modrm
.rm
= *codep
& 7;
12962 case USE_VEX_W_TABLE
:
12966 dp
= &vex_w_table
[dp
->op
[1].bytemode
][vex
.w
? 1 : 0];
12969 case USE_EVEX_TABLE
:
12970 two_source_ops
= 0;
12973 FETCH_DATA (info
, codep
+ 4);
12974 /* All bits in the REX prefix are ignored. */
12976 /* The first byte after 0x62. */
12977 rex
= ~(*codep
>> 5) & 0x7;
12978 vex
.r
= *codep
& 0x10;
12979 switch ((*codep
& 0xf))
12982 return &bad_opcode
;
12984 vex_table_index
= EVEX_0F
;
12987 vex_table_index
= EVEX_0F38
;
12990 vex_table_index
= EVEX_0F3A
;
12994 /* The second byte after 0x62. */
12996 vex
.w
= *codep
& 0x80;
12997 if (vex
.w
&& address_mode
== mode_64bit
)
13000 vex
.register_specifier
= (~(*codep
>> 3)) & 0xf;
13001 if (address_mode
!= mode_64bit
)
13003 /* In 16/32-bit mode silently ignore following bits. */
13007 vex
.register_specifier
&= 0x7;
13011 if (!(*codep
& 0x4))
13012 return &bad_opcode
;
13014 switch ((*codep
& 0x3))
13020 vex
.prefix
= DATA_PREFIX_OPCODE
;
13023 vex
.prefix
= REPE_PREFIX_OPCODE
;
13026 vex
.prefix
= REPNE_PREFIX_OPCODE
;
13030 /* The third byte after 0x62. */
13033 /* Remember the static rounding bits. */
13034 vex
.ll
= (*codep
>> 5) & 3;
13035 vex
.b
= (*codep
& 0x10) != 0;
13037 vex
.v
= *codep
& 0x8;
13038 vex
.mask_register_specifier
= *codep
& 0x7;
13039 vex
.zeroing
= *codep
& 0x80;
13045 dp
= &evex_table
[vex_table_index
][vindex
];
13047 FETCH_DATA (info
, codep
+ 1);
13048 modrm
.mod
= (*codep
>> 6) & 3;
13049 modrm
.reg
= (*codep
>> 3) & 7;
13050 modrm
.rm
= *codep
& 7;
13052 /* Set vector length. */
13053 if (modrm
.mod
== 3 && vex
.b
)
13069 return &bad_opcode
;
13082 if (dp
->name
!= NULL
)
13085 return get_valid_dis386 (dp
, info
);
13089 get_sib (disassemble_info
*info
, int sizeflag
)
13091 /* If modrm.mod == 3, operand must be register. */
13093 && ((sizeflag
& AFLAG
) || address_mode
== mode_64bit
)
13097 FETCH_DATA (info
, codep
+ 2);
13098 sib
.index
= (codep
[1] >> 3) & 7;
13099 sib
.scale
= (codep
[1] >> 6) & 3;
13100 sib
.base
= codep
[1] & 7;
13105 print_insn (bfd_vma pc
, disassemble_info
*info
)
13107 const struct dis386
*dp
;
13109 char *op_txt
[MAX_OPERANDS
];
13111 int sizeflag
, orig_sizeflag
;
13113 struct dis_private priv
;
13116 priv
.orig_sizeflag
= AFLAG
| DFLAG
;
13117 if ((info
->mach
& bfd_mach_i386_i386
) != 0)
13118 address_mode
= mode_32bit
;
13119 else if (info
->mach
== bfd_mach_i386_i8086
)
13121 address_mode
= mode_16bit
;
13122 priv
.orig_sizeflag
= 0;
13125 address_mode
= mode_64bit
;
13127 if (intel_syntax
== (char) -1)
13128 intel_syntax
= (info
->mach
& bfd_mach_i386_intel_syntax
) != 0;
13130 for (p
= info
->disassembler_options
; p
!= NULL
; )
13132 if (CONST_STRNEQ (p
, "amd64"))
13134 else if (CONST_STRNEQ (p
, "intel64"))
13136 else if (CONST_STRNEQ (p
, "x86-64"))
13138 address_mode
= mode_64bit
;
13139 priv
.orig_sizeflag
= AFLAG
| DFLAG
;
13141 else if (CONST_STRNEQ (p
, "i386"))
13143 address_mode
= mode_32bit
;
13144 priv
.orig_sizeflag
= AFLAG
| DFLAG
;
13146 else if (CONST_STRNEQ (p
, "i8086"))
13148 address_mode
= mode_16bit
;
13149 priv
.orig_sizeflag
= 0;
13151 else if (CONST_STRNEQ (p
, "intel"))
13154 if (CONST_STRNEQ (p
+ 5, "-mnemonic"))
13155 intel_mnemonic
= 1;
13157 else if (CONST_STRNEQ (p
, "att"))
13160 if (CONST_STRNEQ (p
+ 3, "-mnemonic"))
13161 intel_mnemonic
= 0;
13163 else if (CONST_STRNEQ (p
, "addr"))
13165 if (address_mode
== mode_64bit
)
13167 if (p
[4] == '3' && p
[5] == '2')
13168 priv
.orig_sizeflag
&= ~AFLAG
;
13169 else if (p
[4] == '6' && p
[5] == '4')
13170 priv
.orig_sizeflag
|= AFLAG
;
13174 if (p
[4] == '1' && p
[5] == '6')
13175 priv
.orig_sizeflag
&= ~AFLAG
;
13176 else if (p
[4] == '3' && p
[5] == '2')
13177 priv
.orig_sizeflag
|= AFLAG
;
13180 else if (CONST_STRNEQ (p
, "data"))
13182 if (p
[4] == '1' && p
[5] == '6')
13183 priv
.orig_sizeflag
&= ~DFLAG
;
13184 else if (p
[4] == '3' && p
[5] == '2')
13185 priv
.orig_sizeflag
|= DFLAG
;
13187 else if (CONST_STRNEQ (p
, "suffix"))
13188 priv
.orig_sizeflag
|= SUFFIX_ALWAYS
;
13190 p
= strchr (p
, ',');
13195 if (address_mode
== mode_64bit
&& sizeof (bfd_vma
) < 8)
13197 (*info
->fprintf_func
) (info
->stream
,
13198 _("64-bit address is disabled"));
13204 names64
= intel_names64
;
13205 names32
= intel_names32
;
13206 names16
= intel_names16
;
13207 names8
= intel_names8
;
13208 names8rex
= intel_names8rex
;
13209 names_seg
= intel_names_seg
;
13210 names_mm
= intel_names_mm
;
13211 names_bnd
= intel_names_bnd
;
13212 names_xmm
= intel_names_xmm
;
13213 names_ymm
= intel_names_ymm
;
13214 names_zmm
= intel_names_zmm
;
13215 index64
= intel_index64
;
13216 index32
= intel_index32
;
13217 names_mask
= intel_names_mask
;
13218 index16
= intel_index16
;
13221 separator_char
= '+';
13226 names64
= att_names64
;
13227 names32
= att_names32
;
13228 names16
= att_names16
;
13229 names8
= att_names8
;
13230 names8rex
= att_names8rex
;
13231 names_seg
= att_names_seg
;
13232 names_mm
= att_names_mm
;
13233 names_bnd
= att_names_bnd
;
13234 names_xmm
= att_names_xmm
;
13235 names_ymm
= att_names_ymm
;
13236 names_zmm
= att_names_zmm
;
13237 index64
= att_index64
;
13238 index32
= att_index32
;
13239 names_mask
= att_names_mask
;
13240 index16
= att_index16
;
13243 separator_char
= ',';
13247 /* The output looks better if we put 7 bytes on a line, since that
13248 puts most long word instructions on a single line. Use 8 bytes
13250 if ((info
->mach
& bfd_mach_l1om
) != 0)
13251 info
->bytes_per_line
= 8;
13253 info
->bytes_per_line
= 7;
13255 info
->private_data
= &priv
;
13256 priv
.max_fetched
= priv
.the_buffer
;
13257 priv
.insn_start
= pc
;
13260 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
13268 start_codep
= priv
.the_buffer
;
13269 codep
= priv
.the_buffer
;
13271 if (OPCODES_SIGSETJMP (priv
.bailout
) != 0)
13275 /* Getting here means we tried for data but didn't get it. That
13276 means we have an incomplete instruction of some sort. Just
13277 print the first byte as a prefix or a .byte pseudo-op. */
13278 if (codep
> priv
.the_buffer
)
13280 name
= prefix_name (priv
.the_buffer
[0], priv
.orig_sizeflag
);
13282 (*info
->fprintf_func
) (info
->stream
, "%s", name
);
13285 /* Just print the first byte as a .byte instruction. */
13286 (*info
->fprintf_func
) (info
->stream
, ".byte 0x%x",
13287 (unsigned int) priv
.the_buffer
[0]);
13297 sizeflag
= priv
.orig_sizeflag
;
13299 if (!ckprefix () || rex_used
)
13301 /* Too many prefixes or unused REX prefixes. */
13303 i
< (int) ARRAY_SIZE (all_prefixes
) && all_prefixes
[i
];
13305 (*info
->fprintf_func
) (info
->stream
, "%s%s",
13307 prefix_name (all_prefixes
[i
], sizeflag
));
13311 insn_codep
= codep
;
13313 FETCH_DATA (info
, codep
+ 1);
13314 two_source_ops
= (*codep
== 0x62) || (*codep
== 0xc8);
13316 if (((prefixes
& PREFIX_FWAIT
)
13317 && ((*codep
< 0xd8) || (*codep
> 0xdf))))
13319 /* Handle prefixes before fwait. */
13320 for (i
= 0; i
< fwait_prefix
&& all_prefixes
[i
];
13322 (*info
->fprintf_func
) (info
->stream
, "%s ",
13323 prefix_name (all_prefixes
[i
], sizeflag
));
13324 (*info
->fprintf_func
) (info
->stream
, "fwait");
13328 if (*codep
== 0x0f)
13330 unsigned char threebyte
;
13333 FETCH_DATA (info
, codep
+ 1);
13334 threebyte
= *codep
;
13335 dp
= &dis386_twobyte
[threebyte
];
13336 need_modrm
= twobyte_has_modrm
[*codep
];
13341 dp
= &dis386
[*codep
];
13342 need_modrm
= onebyte_has_modrm
[*codep
];
13346 /* Save sizeflag for printing the extra prefixes later before updating
13347 it for mnemonic and operand processing. The prefix names depend
13348 only on the address mode. */
13349 orig_sizeflag
= sizeflag
;
13350 if (prefixes
& PREFIX_ADDR
)
13352 if ((prefixes
& PREFIX_DATA
))
13358 FETCH_DATA (info
, codep
+ 1);
13359 modrm
.mod
= (*codep
>> 6) & 3;
13360 modrm
.reg
= (*codep
>> 3) & 7;
13361 modrm
.rm
= *codep
& 7;
13369 if (dp
->name
== NULL
&& dp
->op
[0].bytemode
== FLOATCODE
)
13371 get_sib (info
, sizeflag
);
13372 dofloat (sizeflag
);
13376 dp
= get_valid_dis386 (dp
, info
);
13377 if (dp
!= NULL
&& putop (dp
->name
, sizeflag
) == 0)
13379 get_sib (info
, sizeflag
);
13380 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
13383 op_ad
= MAX_OPERANDS
- 1 - i
;
13385 (*dp
->op
[i
].rtn
) (dp
->op
[i
].bytemode
, sizeflag
);
13386 /* For EVEX instruction after the last operand masking
13387 should be printed. */
13388 if (i
== 0 && vex
.evex
)
13390 /* Don't print {%k0}. */
13391 if (vex
.mask_register_specifier
)
13394 oappend (names_mask
[vex
.mask_register_specifier
]);
13404 /* Check if the REX prefix is used. */
13405 if (rex_ignored
== 0 && (rex
^ rex_used
) == 0 && last_rex_prefix
>= 0)
13406 all_prefixes
[last_rex_prefix
] = 0;
13408 /* Check if the SEG prefix is used. */
13409 if ((prefixes
& (PREFIX_CS
| PREFIX_SS
| PREFIX_DS
| PREFIX_ES
13410 | PREFIX_FS
| PREFIX_GS
)) != 0
13411 && (used_prefixes
& active_seg_prefix
) != 0)
13412 all_prefixes
[last_seg_prefix
] = 0;
13414 /* Check if the ADDR prefix is used. */
13415 if ((prefixes
& PREFIX_ADDR
) != 0
13416 && (used_prefixes
& PREFIX_ADDR
) != 0)
13417 all_prefixes
[last_addr_prefix
] = 0;
13419 /* Check if the DATA prefix is used. */
13420 if ((prefixes
& PREFIX_DATA
) != 0
13421 && (used_prefixes
& PREFIX_DATA
) != 0)
13422 all_prefixes
[last_data_prefix
] = 0;
13424 /* Print the extra prefixes. */
13426 for (i
= 0; i
< (int) ARRAY_SIZE (all_prefixes
); i
++)
13427 if (all_prefixes
[i
])
13430 name
= prefix_name (all_prefixes
[i
], orig_sizeflag
);
13433 prefix_length
+= strlen (name
) + 1;
13434 (*info
->fprintf_func
) (info
->stream
, "%s ", name
);
13437 /* If the mandatory PREFIX_REPZ/PREFIX_REPNZ/PREFIX_DATA prefix is
13438 unused, opcode is invalid. Since the PREFIX_DATA prefix may be
13439 used by putop and MMX/SSE operand and may be overriden by the
13440 PREFIX_REPZ/PREFIX_REPNZ fix, we check the PREFIX_DATA prefix
13442 if (dp
->prefix_requirement
== PREFIX_OPCODE
13443 && dp
!= &bad_opcode
13445 & (PREFIX_REPZ
| PREFIX_REPNZ
)) != 0
13447 & (PREFIX_REPZ
| PREFIX_REPNZ
)) == 0)
13449 & (PREFIX_REPZ
| PREFIX_REPNZ
| PREFIX_DATA
))
13451 && (used_prefixes
& PREFIX_DATA
) == 0))))
13453 (*info
->fprintf_func
) (info
->stream
, "(bad)");
13454 return end_codep
- priv
.the_buffer
;
13457 /* Check maximum code length. */
13458 if ((codep
- start_codep
) > MAX_CODE_LENGTH
)
13460 (*info
->fprintf_func
) (info
->stream
, "(bad)");
13461 return MAX_CODE_LENGTH
;
13464 obufp
= mnemonicendp
;
13465 for (i
= strlen (obuf
) + prefix_length
; i
< 6; i
++)
13468 (*info
->fprintf_func
) (info
->stream
, "%s", obuf
);
13470 /* The enter and bound instructions are printed with operands in the same
13471 order as the intel book; everything else is printed in reverse order. */
13472 if (intel_syntax
|| two_source_ops
)
13476 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
13477 op_txt
[i
] = op_out
[i
];
13479 if (intel_syntax
&& dp
&& dp
->op
[2].rtn
== OP_Rounding
13480 && dp
->op
[3].rtn
== OP_E
&& dp
->op
[4].rtn
== NULL
)
13482 op_txt
[2] = op_out
[3];
13483 op_txt
[3] = op_out
[2];
13486 for (i
= 0; i
< (MAX_OPERANDS
>> 1); ++i
)
13488 op_ad
= op_index
[i
];
13489 op_index
[i
] = op_index
[MAX_OPERANDS
- 1 - i
];
13490 op_index
[MAX_OPERANDS
- 1 - i
] = op_ad
;
13491 riprel
= op_riprel
[i
];
13492 op_riprel
[i
] = op_riprel
[MAX_OPERANDS
- 1 - i
];
13493 op_riprel
[MAX_OPERANDS
- 1 - i
] = riprel
;
13498 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
13499 op_txt
[MAX_OPERANDS
- 1 - i
] = op_out
[i
];
13503 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
13507 (*info
->fprintf_func
) (info
->stream
, ",");
13508 if (op_index
[i
] != -1 && !op_riprel
[i
])
13509 (*info
->print_address_func
) ((bfd_vma
) op_address
[op_index
[i
]], info
);
13511 (*info
->fprintf_func
) (info
->stream
, "%s", op_txt
[i
]);
13515 for (i
= 0; i
< MAX_OPERANDS
; i
++)
13516 if (op_index
[i
] != -1 && op_riprel
[i
])
13518 (*info
->fprintf_func
) (info
->stream
, " # ");
13519 (*info
->print_address_func
) ((bfd_vma
) (start_pc
+ (codep
- start_codep
)
13520 + op_address
[op_index
[i
]]), info
);
13523 return codep
- priv
.the_buffer
;
13526 static const char *float_mem
[] = {
13601 static const unsigned char float_mem_mode
[] = {
13676 #define ST { OP_ST, 0 }
13677 #define STi { OP_STi, 0 }
13679 #define FGRPd9_2 NULL, { { NULL, 1 } }, 0
13680 #define FGRPd9_4 NULL, { { NULL, 2 } }, 0
13681 #define FGRPd9_5 NULL, { { NULL, 3 } }, 0
13682 #define FGRPd9_6 NULL, { { NULL, 4 } }, 0
13683 #define FGRPd9_7 NULL, { { NULL, 5 } }, 0
13684 #define FGRPda_5 NULL, { { NULL, 6 } }, 0
13685 #define FGRPdb_4 NULL, { { NULL, 7 } }, 0
13686 #define FGRPde_3 NULL, { { NULL, 8 } }, 0
13687 #define FGRPdf_4 NULL, { { NULL, 9 } }, 0
13689 static const struct dis386 float_reg
[][8] = {
13692 { "fadd", { ST
, STi
}, 0 },
13693 { "fmul", { ST
, STi
}, 0 },
13694 { "fcom", { STi
}, 0 },
13695 { "fcomp", { STi
}, 0 },
13696 { "fsub", { ST
, STi
}, 0 },
13697 { "fsubr", { ST
, STi
}, 0 },
13698 { "fdiv", { ST
, STi
}, 0 },
13699 { "fdivr", { ST
, STi
}, 0 },
13703 { "fld", { STi
}, 0 },
13704 { "fxch", { STi
}, 0 },
13714 { "fcmovb", { ST
, STi
}, 0 },
13715 { "fcmove", { ST
, STi
}, 0 },
13716 { "fcmovbe",{ ST
, STi
}, 0 },
13717 { "fcmovu", { ST
, STi
}, 0 },
13725 { "fcmovnb",{ ST
, STi
}, 0 },
13726 { "fcmovne",{ ST
, STi
}, 0 },
13727 { "fcmovnbe",{ ST
, STi
}, 0 },
13728 { "fcmovnu",{ ST
, STi
}, 0 },
13730 { "fucomi", { ST
, STi
}, 0 },
13731 { "fcomi", { ST
, STi
}, 0 },
13736 { "fadd", { STi
, ST
}, 0 },
13737 { "fmul", { STi
, ST
}, 0 },
13740 { "fsub!M", { STi
, ST
}, 0 },
13741 { "fsubM", { STi
, ST
}, 0 },
13742 { "fdiv!M", { STi
, ST
}, 0 },
13743 { "fdivM", { STi
, ST
}, 0 },
13747 { "ffree", { STi
}, 0 },
13749 { "fst", { STi
}, 0 },
13750 { "fstp", { STi
}, 0 },
13751 { "fucom", { STi
}, 0 },
13752 { "fucomp", { STi
}, 0 },
13758 { "faddp", { STi
, ST
}, 0 },
13759 { "fmulp", { STi
, ST
}, 0 },
13762 { "fsub!Mp", { STi
, ST
}, 0 },
13763 { "fsubMp", { STi
, ST
}, 0 },
13764 { "fdiv!Mp", { STi
, ST
}, 0 },
13765 { "fdivMp", { STi
, ST
}, 0 },
13769 { "ffreep", { STi
}, 0 },
13774 { "fucomip", { ST
, STi
}, 0 },
13775 { "fcomip", { ST
, STi
}, 0 },
13780 static char *fgrps
[][8] = {
13783 "(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
13788 "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
13793 "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
13798 "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
13803 "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
13808 "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
13813 "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
13818 "fNeni(8087 only)","fNdisi(8087 only)","fNclex","fNinit",
13819 "fNsetpm(287 only)","frstpm(287 only)","(bad)","(bad)",
13824 "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
13829 "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
13834 swap_operand (void)
13836 mnemonicendp
[0] = '.';
13837 mnemonicendp
[1] = 's';
13842 OP_Skip_MODRM (int bytemode ATTRIBUTE_UNUSED
,
13843 int sizeflag ATTRIBUTE_UNUSED
)
13845 /* Skip mod/rm byte. */
13851 dofloat (int sizeflag
)
13853 const struct dis386
*dp
;
13854 unsigned char floatop
;
13856 floatop
= codep
[-1];
13858 if (modrm
.mod
!= 3)
13860 int fp_indx
= (floatop
- 0xd8) * 8 + modrm
.reg
;
13862 putop (float_mem
[fp_indx
], sizeflag
);
13865 OP_E (float_mem_mode
[fp_indx
], sizeflag
);
13868 /* Skip mod/rm byte. */
13872 dp
= &float_reg
[floatop
- 0xd8][modrm
.reg
];
13873 if (dp
->name
== NULL
)
13875 putop (fgrps
[dp
->op
[0].bytemode
][modrm
.rm
], sizeflag
);
13877 /* Instruction fnstsw is only one with strange arg. */
13878 if (floatop
== 0xdf && codep
[-1] == 0xe0)
13879 strcpy (op_out
[0], names16
[0]);
13883 putop (dp
->name
, sizeflag
);
13888 (*dp
->op
[0].rtn
) (dp
->op
[0].bytemode
, sizeflag
);
13893 (*dp
->op
[1].rtn
) (dp
->op
[1].bytemode
, sizeflag
);
13897 /* Like oappend (below), but S is a string starting with '%'.
13898 In Intel syntax, the '%' is elided. */
13900 oappend_maybe_intel (const char *s
)
13902 oappend (s
+ intel_syntax
);
13906 OP_ST (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
13908 oappend_maybe_intel ("%st");
13912 OP_STi (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
13914 sprintf (scratchbuf
, "%%st(%d)", modrm
.rm
);
13915 oappend_maybe_intel (scratchbuf
);
13918 /* Capital letters in template are macros. */
13920 putop (const char *in_template
, int sizeflag
)
13925 unsigned int l
= 0, len
= 1;
13928 #define SAVE_LAST(c) \
13929 if (l < len && l < sizeof (last)) \
13934 for (p
= in_template
; *p
; p
++)
13950 while (*++p
!= '|')
13951 if (*p
== '}' || *p
== '\0')
13954 /* Fall through. */
13959 while (*++p
!= '}')
13970 if (modrm
.mod
!= 3 || (sizeflag
& SUFFIX_ALWAYS
))
13974 if (l
== 0 && len
== 1)
13979 if (sizeflag
& SUFFIX_ALWAYS
)
13992 if (address_mode
== mode_64bit
13993 && !(prefixes
& PREFIX_ADDR
))
14004 if (intel_syntax
&& !alt
)
14006 if ((prefixes
& PREFIX_DATA
) || (sizeflag
& SUFFIX_ALWAYS
))
14008 if (sizeflag
& DFLAG
)
14009 *obufp
++ = intel_syntax
? 'd' : 'l';
14011 *obufp
++ = intel_syntax
? 'w' : 's';
14012 used_prefixes
|= (prefixes
& PREFIX_DATA
);
14016 if (intel_syntax
|| !(sizeflag
& SUFFIX_ALWAYS
))
14019 if (modrm
.mod
== 3)
14025 if (sizeflag
& DFLAG
)
14026 *obufp
++ = intel_syntax
? 'd' : 'l';
14029 used_prefixes
|= (prefixes
& PREFIX_DATA
);
14035 case 'E': /* For jcxz/jecxz */
14036 if (address_mode
== mode_64bit
)
14038 if (sizeflag
& AFLAG
)
14044 if (sizeflag
& AFLAG
)
14046 used_prefixes
|= (prefixes
& PREFIX_ADDR
);
14051 if ((prefixes
& PREFIX_ADDR
) || (sizeflag
& SUFFIX_ALWAYS
))
14053 if (sizeflag
& AFLAG
)
14054 *obufp
++ = address_mode
== mode_64bit
? 'q' : 'l';
14056 *obufp
++ = address_mode
== mode_64bit
? 'l' : 'w';
14057 used_prefixes
|= (prefixes
& PREFIX_ADDR
);
14061 if (intel_syntax
|| (obufp
[-1] != 's' && !(sizeflag
& SUFFIX_ALWAYS
)))
14063 if ((rex
& REX_W
) || (sizeflag
& DFLAG
))
14067 if (!(rex
& REX_W
))
14068 used_prefixes
|= (prefixes
& PREFIX_DATA
);
14073 if ((prefixes
& (PREFIX_CS
| PREFIX_DS
)) == PREFIX_CS
14074 || (prefixes
& (PREFIX_CS
| PREFIX_DS
)) == PREFIX_DS
)
14076 used_prefixes
|= prefixes
& (PREFIX_CS
| PREFIX_DS
);
14079 if (prefixes
& PREFIX_DS
)
14098 if (l
!= 0 || len
!= 1)
14100 if (l
!= 1 || len
!= 2 || last
[0] != 'X')
14105 if (!need_vex
|| !vex
.evex
)
14108 || ((modrm
.mod
== 3 || vex
.b
) && !(sizeflag
& SUFFIX_ALWAYS
)))
14110 switch (vex
.length
)
14128 if (address_mode
== mode_64bit
&& (sizeflag
& SUFFIX_ALWAYS
))
14133 /* Fall through. */
14136 if (l
!= 0 || len
!= 1)
14144 if (sizeflag
& SUFFIX_ALWAYS
)
14148 if (intel_mnemonic
!= cond
)
14152 if ((prefixes
& PREFIX_FWAIT
) == 0)
14155 used_prefixes
|= PREFIX_FWAIT
;
14161 else if (intel_syntax
&& (sizeflag
& DFLAG
))
14165 if (!(rex
& REX_W
))
14166 used_prefixes
|= (prefixes
& PREFIX_DATA
);
14170 && address_mode
== mode_64bit
14171 && isa64
== intel64
)
14176 /* Fall through. */
14179 && address_mode
== mode_64bit
14180 && ((sizeflag
& DFLAG
) || (rex
& REX_W
)))
14185 /* Fall through. */
14188 if (l
== 0 && len
== 1)
14193 if ((rex
& REX_W
) == 0
14194 && (prefixes
& PREFIX_DATA
))
14196 if ((sizeflag
& DFLAG
) == 0)
14198 used_prefixes
|= (prefixes
& PREFIX_DATA
);
14202 if ((prefixes
& PREFIX_DATA
)
14204 || (sizeflag
& SUFFIX_ALWAYS
))
14211 if (sizeflag
& DFLAG
)
14215 used_prefixes
|= (prefixes
& PREFIX_DATA
);
14221 if (l
!= 1 || len
!= 2 || last
[0] != 'L')
14227 if ((prefixes
& PREFIX_DATA
)
14229 || (sizeflag
& SUFFIX_ALWAYS
))
14236 if (sizeflag
& DFLAG
)
14237 *obufp
++ = intel_syntax
? 'd' : 'l';
14240 used_prefixes
|= (prefixes
& PREFIX_DATA
);
14248 if (address_mode
== mode_64bit
14249 && ((sizeflag
& DFLAG
) || (rex
& REX_W
)))
14251 if (modrm
.mod
!= 3 || (sizeflag
& SUFFIX_ALWAYS
))
14255 /* Fall through. */
14258 if (l
== 0 && len
== 1)
14261 if (intel_syntax
&& !alt
)
14264 if (modrm
.mod
!= 3 || (sizeflag
& SUFFIX_ALWAYS
))
14270 if (sizeflag
& DFLAG
)
14271 *obufp
++ = intel_syntax
? 'd' : 'l';
14274 used_prefixes
|= (prefixes
& PREFIX_DATA
);
14280 if (l
!= 1 || len
!= 2 || last
[0] != 'L')
14286 || (modrm
.mod
== 3 && !(sizeflag
& SUFFIX_ALWAYS
)))
14301 else if (sizeflag
& DFLAG
)
14310 if (intel_syntax
&& !p
[1]
14311 && ((rex
& REX_W
) || (sizeflag
& DFLAG
)))
14313 if (!(rex
& REX_W
))
14314 used_prefixes
|= (prefixes
& PREFIX_DATA
);
14317 if (l
== 0 && len
== 1)
14321 if (address_mode
== mode_64bit
14322 && ((sizeflag
& DFLAG
) || (rex
& REX_W
)))
14324 if (sizeflag
& SUFFIX_ALWAYS
)
14346 /* Fall through. */
14349 if (l
== 0 && len
== 1)
14354 if (sizeflag
& SUFFIX_ALWAYS
)
14360 if (sizeflag
& DFLAG
)
14364 used_prefixes
|= (prefixes
& PREFIX_DATA
);
14378 if (address_mode
== mode_64bit
14379 && !(prefixes
& PREFIX_ADDR
))
14390 if (l
!= 0 || len
!= 1)
14395 if (need_vex
&& vex
.prefix
)
14397 if (vex
.prefix
== DATA_PREFIX_OPCODE
)
14404 if (prefixes
& PREFIX_DATA
)
14408 used_prefixes
|= (prefixes
& PREFIX_DATA
);
14412 if (l
== 0 && len
== 1)
14414 if (intel_syntax
|| !(sizeflag
& SUFFIX_ALWAYS
))
14425 if (l
!= 1 || len
!= 2 || last
[0] != 'X')
14433 || ((modrm
.mod
== 3 || vex
.b
) && !(sizeflag
& SUFFIX_ALWAYS
)))
14435 switch (vex
.length
)
14451 if (l
== 0 && len
== 1)
14453 /* operand size flag for cwtl, cbtw */
14462 else if (sizeflag
& DFLAG
)
14466 if (!(rex
& REX_W
))
14467 used_prefixes
|= (prefixes
& PREFIX_DATA
);
14474 && last
[0] != 'L'))
14481 if (last
[0] == 'X')
14482 *obufp
++ = vex
.w
? 'd': 's';
14484 *obufp
++ = vex
.w
? 'q': 'd';
14490 if ((prefixes
& PREFIX_DATA
) || (sizeflag
& SUFFIX_ALWAYS
))
14492 if (sizeflag
& DFLAG
)
14496 used_prefixes
|= (prefixes
& PREFIX_DATA
);
14502 if (address_mode
== mode_64bit
14503 && (isa64
== intel64
14504 || ((sizeflag
& DFLAG
) || (rex
& REX_W
))))
14506 else if ((prefixes
& PREFIX_DATA
))
14508 if (!(sizeflag
& DFLAG
))
14510 used_prefixes
|= (prefixes
& PREFIX_DATA
);
14517 mnemonicendp
= obufp
;
14522 oappend (const char *s
)
14524 obufp
= stpcpy (obufp
, s
);
14530 /* Only print the active segment register. */
14531 if (!active_seg_prefix
)
14534 used_prefixes
|= active_seg_prefix
;
14535 switch (active_seg_prefix
)
14538 oappend_maybe_intel ("%cs:");
14541 oappend_maybe_intel ("%ds:");
14544 oappend_maybe_intel ("%ss:");
14547 oappend_maybe_intel ("%es:");
14550 oappend_maybe_intel ("%fs:");
14553 oappend_maybe_intel ("%gs:");
14561 OP_indirE (int bytemode
, int sizeflag
)
14565 OP_E (bytemode
, sizeflag
);
14569 print_operand_value (char *buf
, int hex
, bfd_vma disp
)
14571 if (address_mode
== mode_64bit
)
14579 sprintf_vma (tmp
, disp
);
14580 for (i
= 0; tmp
[i
] == '0' && tmp
[i
+ 1]; i
++);
14581 strcpy (buf
+ 2, tmp
+ i
);
14585 bfd_signed_vma v
= disp
;
14592 /* Check for possible overflow on 0x8000000000000000. */
14595 strcpy (buf
, "9223372036854775808");
14609 tmp
[28 - i
] = (v
% 10) + '0';
14613 strcpy (buf
, tmp
+ 29 - i
);
14619 sprintf (buf
, "0x%x", (unsigned int) disp
);
14621 sprintf (buf
, "%d", (int) disp
);
14625 /* Put DISP in BUF as signed hex number. */
14628 print_displacement (char *buf
, bfd_vma disp
)
14630 bfd_signed_vma val
= disp
;
14639 /* Check for possible overflow. */
14642 switch (address_mode
)
14645 strcpy (buf
+ j
, "0x8000000000000000");
14648 strcpy (buf
+ j
, "0x80000000");
14651 strcpy (buf
+ j
, "0x8000");
14661 sprintf_vma (tmp
, (bfd_vma
) val
);
14662 for (i
= 0; tmp
[i
] == '0'; i
++)
14664 if (tmp
[i
] == '\0')
14666 strcpy (buf
+ j
, tmp
+ i
);
14670 intel_operand_size (int bytemode
, int sizeflag
)
14674 && (bytemode
== x_mode
14675 || bytemode
== evex_half_bcst_xmmq_mode
))
14678 oappend ("QWORD PTR ");
14680 oappend ("DWORD PTR ");
14689 oappend ("BYTE PTR ");
14694 oappend ("WORD PTR ");
14697 if (address_mode
== mode_64bit
&& isa64
== intel64
)
14699 oappend ("QWORD PTR ");
14702 /* Fall through. */
14704 if (address_mode
== mode_64bit
&& ((sizeflag
& DFLAG
) || (rex
& REX_W
)))
14706 oappend ("QWORD PTR ");
14709 /* Fall through. */
14715 oappend ("QWORD PTR ");
14718 if ((sizeflag
& DFLAG
) || bytemode
== dq_mode
)
14719 oappend ("DWORD PTR ");
14721 oappend ("WORD PTR ");
14722 used_prefixes
|= (prefixes
& PREFIX_DATA
);
14726 if ((rex
& REX_W
) || (sizeflag
& DFLAG
))
14728 oappend ("WORD PTR ");
14729 if (!(rex
& REX_W
))
14730 used_prefixes
|= (prefixes
& PREFIX_DATA
);
14733 if (sizeflag
& DFLAG
)
14734 oappend ("QWORD PTR ");
14736 oappend ("DWORD PTR ");
14737 used_prefixes
|= (prefixes
& PREFIX_DATA
);
14740 case d_scalar_mode
:
14741 case d_scalar_swap_mode
:
14744 oappend ("DWORD PTR ");
14747 case q_scalar_mode
:
14748 case q_scalar_swap_mode
:
14750 oappend ("QWORD PTR ");
14753 if (address_mode
== mode_64bit
)
14754 oappend ("QWORD PTR ");
14756 oappend ("DWORD PTR ");
14759 if (sizeflag
& DFLAG
)
14760 oappend ("FWORD PTR ");
14762 oappend ("DWORD PTR ");
14763 used_prefixes
|= (prefixes
& PREFIX_DATA
);
14766 oappend ("TBYTE PTR ");
14770 case evex_x_gscat_mode
:
14771 case evex_x_nobcst_mode
:
14772 case b_scalar_mode
:
14773 case w_scalar_mode
:
14776 switch (vex
.length
)
14779 oappend ("XMMWORD PTR ");
14782 oappend ("YMMWORD PTR ");
14785 oappend ("ZMMWORD PTR ");
14792 oappend ("XMMWORD PTR ");
14795 oappend ("XMMWORD PTR ");
14798 oappend ("YMMWORD PTR ");
14801 case evex_half_bcst_xmmq_mode
:
14805 switch (vex
.length
)
14808 oappend ("QWORD PTR ");
14811 oappend ("XMMWORD PTR ");
14814 oappend ("YMMWORD PTR ");
14824 switch (vex
.length
)
14829 oappend ("BYTE PTR ");
14839 switch (vex
.length
)
14844 oappend ("WORD PTR ");
14854 switch (vex
.length
)
14859 oappend ("DWORD PTR ");
14869 switch (vex
.length
)
14874 oappend ("QWORD PTR ");
14884 switch (vex
.length
)
14887 oappend ("WORD PTR ");
14890 oappend ("DWORD PTR ");
14893 oappend ("QWORD PTR ");
14903 switch (vex
.length
)
14906 oappend ("DWORD PTR ");
14909 oappend ("QWORD PTR ");
14912 oappend ("XMMWORD PTR ");
14922 switch (vex
.length
)
14925 oappend ("QWORD PTR ");
14928 oappend ("YMMWORD PTR ");
14931 oappend ("ZMMWORD PTR ");
14941 switch (vex
.length
)
14945 oappend ("XMMWORD PTR ");
14952 oappend ("OWORD PTR ");
14955 case vex_w_dq_mode
:
14956 case vex_scalar_w_dq_mode
:
14961 oappend ("QWORD PTR ");
14963 oappend ("DWORD PTR ");
14965 case vex_vsib_d_w_dq_mode
:
14966 case vex_vsib_q_w_dq_mode
:
14973 oappend ("QWORD PTR ");
14975 oappend ("DWORD PTR ");
14979 switch (vex
.length
)
14982 oappend ("XMMWORD PTR ");
14985 oappend ("YMMWORD PTR ");
14988 oappend ("ZMMWORD PTR ");
14995 case vex_vsib_q_w_d_mode
:
14996 case vex_vsib_d_w_d_mode
:
14997 if (!need_vex
|| !vex
.evex
)
15000 switch (vex
.length
)
15003 oappend ("QWORD PTR ");
15006 oappend ("XMMWORD PTR ");
15009 oappend ("YMMWORD PTR ");
15017 if (!need_vex
|| vex
.length
!= 128)
15020 oappend ("DWORD PTR ");
15022 oappend ("BYTE PTR ");
15028 oappend ("QWORD PTR ");
15030 oappend ("WORD PTR ");
15039 OP_E_register (int bytemode
, int sizeflag
)
15041 int reg
= modrm
.rm
;
15042 const char **names
;
15048 if ((sizeflag
& SUFFIX_ALWAYS
)
15049 && (bytemode
== b_swap_mode
15050 || bytemode
== v_swap_mode
))
15076 names
= address_mode
== mode_64bit
? names64
: names32
;
15087 if (address_mode
== mode_64bit
&& isa64
== intel64
)
15092 /* Fall through. */
15094 if (address_mode
== mode_64bit
&& ((sizeflag
& DFLAG
) || (rex
& REX_W
)))
15100 /* Fall through. */
15112 if ((sizeflag
& DFLAG
)
15113 || (bytemode
!= v_mode
15114 && bytemode
!= v_swap_mode
))
15118 used_prefixes
|= (prefixes
& PREFIX_DATA
);
15128 names
= names_mask
;
15133 oappend (INTERNAL_DISASSEMBLER_ERROR
);
15136 oappend (names
[reg
]);
15140 OP_E_memory (int bytemode
, int sizeflag
)
15143 int add
= (rex
& REX_B
) ? 8 : 0;
15149 /* In EVEX, if operand doesn't allow broadcast, vex.b should be 0. */
15151 && bytemode
!= x_mode
15152 && bytemode
!= xmmq_mode
15153 && bytemode
!= evex_half_bcst_xmmq_mode
)
15168 case vex_vsib_d_w_dq_mode
:
15169 case vex_vsib_d_w_d_mode
:
15170 case vex_vsib_q_w_dq_mode
:
15171 case vex_vsib_q_w_d_mode
:
15172 case evex_x_gscat_mode
:
15174 shift
= vex
.w
? 3 : 2;
15177 case evex_half_bcst_xmmq_mode
:
15181 shift
= vex
.w
? 3 : 2;
15184 /* Fall through. */
15188 case evex_x_nobcst_mode
:
15190 switch (vex
.length
)
15213 case q_scalar_mode
:
15215 case q_scalar_swap_mode
:
15221 case d_scalar_mode
:
15223 case d_scalar_swap_mode
:
15226 case w_scalar_mode
:
15230 case b_scalar_mode
:
15237 /* Make necessary corrections to shift for modes that need it.
15238 For these modes we currently have shift 4, 5 or 6 depending on
15239 vex.length (it corresponds to xmmword, ymmword or zmmword
15240 operand). We might want to make it 3, 4 or 5 (e.g. for
15241 xmmq_mode). In case of broadcast enabled the corrections
15242 aren't needed, as element size is always 32 or 64 bits. */
15244 && (bytemode
== xmmq_mode
15245 || bytemode
== evex_half_bcst_xmmq_mode
))
15247 else if (bytemode
== xmmqd_mode
)
15249 else if (bytemode
== xmmdw_mode
)
15251 else if (bytemode
== ymmq_mode
&& vex
.length
== 128)
15259 intel_operand_size (bytemode
, sizeflag
);
15262 if ((sizeflag
& AFLAG
) || address_mode
== mode_64bit
)
15264 /* 32/64 bit address mode */
15273 int addr32flag
= !((sizeflag
& AFLAG
)
15274 || bytemode
== v_bnd_mode
15275 || bytemode
== bnd_mode
);
15276 const char **indexes64
= names64
;
15277 const char **indexes32
= names32
;
15287 vindex
= sib
.index
;
15293 case vex_vsib_d_w_dq_mode
:
15294 case vex_vsib_d_w_d_mode
:
15295 case vex_vsib_q_w_dq_mode
:
15296 case vex_vsib_q_w_d_mode
:
15306 switch (vex
.length
)
15309 indexes64
= indexes32
= names_xmm
;
15313 || bytemode
== vex_vsib_q_w_dq_mode
15314 || bytemode
== vex_vsib_q_w_d_mode
)
15315 indexes64
= indexes32
= names_ymm
;
15317 indexes64
= indexes32
= names_xmm
;
15321 || bytemode
== vex_vsib_q_w_dq_mode
15322 || bytemode
== vex_vsib_q_w_d_mode
)
15323 indexes64
= indexes32
= names_zmm
;
15325 indexes64
= indexes32
= names_ymm
;
15332 haveindex
= vindex
!= 4;
15339 rbase
= base
+ add
;
15347 if (address_mode
== mode_64bit
&& !havesib
)
15353 FETCH_DATA (the_info
, codep
+ 1);
15355 if ((disp
& 0x80) != 0)
15357 if (vex
.evex
&& shift
> 0)
15365 /* In 32bit mode, we need index register to tell [offset] from
15366 [eiz*1 + offset]. */
15367 needindex
= (havesib
15370 && address_mode
== mode_32bit
);
15371 havedisp
= (havebase
15373 || (havesib
&& (haveindex
|| scale
!= 0)));
15376 if (modrm
.mod
!= 0 || base
== 5)
15378 if (havedisp
|| riprel
)
15379 print_displacement (scratchbuf
, disp
);
15381 print_operand_value (scratchbuf
, 1, disp
);
15382 oappend (scratchbuf
);
15386 oappend (!addr32flag
? "(%rip)" : "(%eip)");
15390 if ((havebase
|| haveindex
|| riprel
)
15391 && (bytemode
!= v_bnd_mode
)
15392 && (bytemode
!= bnd_mode
))
15393 used_prefixes
|= PREFIX_ADDR
;
15395 if (havedisp
|| (intel_syntax
&& riprel
))
15397 *obufp
++ = open_char
;
15398 if (intel_syntax
&& riprel
)
15401 oappend (!addr32flag
? "rip" : "eip");
15405 oappend (address_mode
== mode_64bit
&& !addr32flag
15406 ? names64
[rbase
] : names32
[rbase
]);
15409 /* ESP/RSP won't allow index. If base isn't ESP/RSP,
15410 print index to tell base + index from base. */
15414 || (havebase
&& base
!= ESP_REG_NUM
))
15416 if (!intel_syntax
|| havebase
)
15418 *obufp
++ = separator_char
;
15422 oappend (address_mode
== mode_64bit
&& !addr32flag
15423 ? indexes64
[vindex
] : indexes32
[vindex
]);
15425 oappend (address_mode
== mode_64bit
&& !addr32flag
15426 ? index64
: index32
);
15428 *obufp
++ = scale_char
;
15430 sprintf (scratchbuf
, "%d", 1 << scale
);
15431 oappend (scratchbuf
);
15435 && (disp
|| modrm
.mod
!= 0 || base
== 5))
15437 if (!havedisp
|| (bfd_signed_vma
) disp
>= 0)
15442 else if (modrm
.mod
!= 1 && disp
!= -disp
)
15446 disp
= - (bfd_signed_vma
) disp
;
15450 print_displacement (scratchbuf
, disp
);
15452 print_operand_value (scratchbuf
, 1, disp
);
15453 oappend (scratchbuf
);
15456 *obufp
++ = close_char
;
15459 else if (intel_syntax
)
15461 if (modrm
.mod
!= 0 || base
== 5)
15463 if (!active_seg_prefix
)
15465 oappend (names_seg
[ds_reg
- es_reg
]);
15468 print_operand_value (scratchbuf
, 1, disp
);
15469 oappend (scratchbuf
);
15475 /* 16 bit address mode */
15476 used_prefixes
|= prefixes
& PREFIX_ADDR
;
15483 if ((disp
& 0x8000) != 0)
15488 FETCH_DATA (the_info
, codep
+ 1);
15490 if ((disp
& 0x80) != 0)
15495 if ((disp
& 0x8000) != 0)
15501 if (modrm
.mod
!= 0 || modrm
.rm
== 6)
15503 print_displacement (scratchbuf
, disp
);
15504 oappend (scratchbuf
);
15507 if (modrm
.mod
!= 0 || modrm
.rm
!= 6)
15509 *obufp
++ = open_char
;
15511 oappend (index16
[modrm
.rm
]);
15513 && (disp
|| modrm
.mod
!= 0 || modrm
.rm
== 6))
15515 if ((bfd_signed_vma
) disp
>= 0)
15520 else if (modrm
.mod
!= 1)
15524 disp
= - (bfd_signed_vma
) disp
;
15527 print_displacement (scratchbuf
, disp
);
15528 oappend (scratchbuf
);
15531 *obufp
++ = close_char
;
15534 else if (intel_syntax
)
15536 if (!active_seg_prefix
)
15538 oappend (names_seg
[ds_reg
- es_reg
]);
15541 print_operand_value (scratchbuf
, 1, disp
& 0xffff);
15542 oappend (scratchbuf
);
15545 if (vex
.evex
&& vex
.b
15546 && (bytemode
== x_mode
15547 || bytemode
== xmmq_mode
15548 || bytemode
== evex_half_bcst_xmmq_mode
))
15551 || bytemode
== xmmq_mode
15552 || bytemode
== evex_half_bcst_xmmq_mode
)
15554 switch (vex
.length
)
15557 oappend ("{1to2}");
15560 oappend ("{1to4}");
15563 oappend ("{1to8}");
15571 switch (vex
.length
)
15574 oappend ("{1to4}");
15577 oappend ("{1to8}");
15580 oappend ("{1to16}");
15590 OP_E (int bytemode
, int sizeflag
)
15592 /* Skip mod/rm byte. */
15596 if (modrm
.mod
== 3)
15597 OP_E_register (bytemode
, sizeflag
);
15599 OP_E_memory (bytemode
, sizeflag
);
15603 OP_G (int bytemode
, int sizeflag
)
15614 oappend (names8rex
[modrm
.reg
+ add
]);
15616 oappend (names8
[modrm
.reg
+ add
]);
15619 oappend (names16
[modrm
.reg
+ add
]);
15624 oappend (names32
[modrm
.reg
+ add
]);
15627 oappend (names64
[modrm
.reg
+ add
]);
15630 if (modrm
.reg
> 0x3)
15635 oappend (names_bnd
[modrm
.reg
]);
15644 oappend (names64
[modrm
.reg
+ add
]);
15647 if ((sizeflag
& DFLAG
) || bytemode
!= v_mode
)
15648 oappend (names32
[modrm
.reg
+ add
]);
15650 oappend (names16
[modrm
.reg
+ add
]);
15651 used_prefixes
|= (prefixes
& PREFIX_DATA
);
15655 if (address_mode
== mode_64bit
)
15656 oappend (names64
[modrm
.reg
+ add
]);
15658 oappend (names32
[modrm
.reg
+ add
]);
15662 if ((modrm
.reg
+ add
) > 0x7)
15667 oappend (names_mask
[modrm
.reg
+ add
]);
15670 oappend (INTERNAL_DISASSEMBLER_ERROR
);
15683 FETCH_DATA (the_info
, codep
+ 8);
15684 a
= *codep
++ & 0xff;
15685 a
|= (*codep
++ & 0xff) << 8;
15686 a
|= (*codep
++ & 0xff) << 16;
15687 a
|= (*codep
++ & 0xffu
) << 24;
15688 b
= *codep
++ & 0xff;
15689 b
|= (*codep
++ & 0xff) << 8;
15690 b
|= (*codep
++ & 0xff) << 16;
15691 b
|= (*codep
++ & 0xffu
) << 24;
15692 x
= a
+ ((bfd_vma
) b
<< 32);
15700 static bfd_signed_vma
15703 bfd_signed_vma x
= 0;
15705 FETCH_DATA (the_info
, codep
+ 4);
15706 x
= *codep
++ & (bfd_signed_vma
) 0xff;
15707 x
|= (*codep
++ & (bfd_signed_vma
) 0xff) << 8;
15708 x
|= (*codep
++ & (bfd_signed_vma
) 0xff) << 16;
15709 x
|= (*codep
++ & (bfd_signed_vma
) 0xff) << 24;
15713 static bfd_signed_vma
15716 bfd_signed_vma x
= 0;
15718 FETCH_DATA (the_info
, codep
+ 4);
15719 x
= *codep
++ & (bfd_signed_vma
) 0xff;
15720 x
|= (*codep
++ & (bfd_signed_vma
) 0xff) << 8;
15721 x
|= (*codep
++ & (bfd_signed_vma
) 0xff) << 16;
15722 x
|= (*codep
++ & (bfd_signed_vma
) 0xff) << 24;
15724 x
= (x
^ ((bfd_signed_vma
) 1 << 31)) - ((bfd_signed_vma
) 1 << 31);
15734 FETCH_DATA (the_info
, codep
+ 2);
15735 x
= *codep
++ & 0xff;
15736 x
|= (*codep
++ & 0xff) << 8;
15741 set_op (bfd_vma op
, int riprel
)
15743 op_index
[op_ad
] = op_ad
;
15744 if (address_mode
== mode_64bit
)
15746 op_address
[op_ad
] = op
;
15747 op_riprel
[op_ad
] = riprel
;
15751 /* Mask to get a 32-bit address. */
15752 op_address
[op_ad
] = op
& 0xffffffff;
15753 op_riprel
[op_ad
] = riprel
& 0xffffffff;
15758 OP_REG (int code
, int sizeflag
)
15765 case es_reg
: case ss_reg
: case cs_reg
:
15766 case ds_reg
: case fs_reg
: case gs_reg
:
15767 oappend (names_seg
[code
- es_reg
]);
15779 case ax_reg
: case cx_reg
: case dx_reg
: case bx_reg
:
15780 case sp_reg
: case bp_reg
: case si_reg
: case di_reg
:
15781 s
= names16
[code
- ax_reg
+ add
];
15783 case al_reg
: case ah_reg
: case cl_reg
: case ch_reg
:
15784 case dl_reg
: case dh_reg
: case bl_reg
: case bh_reg
:
15787 s
= names8rex
[code
- al_reg
+ add
];
15789 s
= names8
[code
- al_reg
];
15791 case rAX_reg
: case rCX_reg
: case rDX_reg
: case rBX_reg
:
15792 case rSP_reg
: case rBP_reg
: case rSI_reg
: case rDI_reg
:
15793 if (address_mode
== mode_64bit
15794 && ((sizeflag
& DFLAG
) || (rex
& REX_W
)))
15796 s
= names64
[code
- rAX_reg
+ add
];
15799 code
+= eAX_reg
- rAX_reg
;
15800 /* Fall through. */
15801 case eAX_reg
: case eCX_reg
: case eDX_reg
: case eBX_reg
:
15802 case eSP_reg
: case eBP_reg
: case eSI_reg
: case eDI_reg
:
15805 s
= names64
[code
- eAX_reg
+ add
];
15808 if (sizeflag
& DFLAG
)
15809 s
= names32
[code
- eAX_reg
+ add
];
15811 s
= names16
[code
- eAX_reg
+ add
];
15812 used_prefixes
|= (prefixes
& PREFIX_DATA
);
15816 s
= INTERNAL_DISASSEMBLER_ERROR
;
15823 OP_IMREG (int code
, int sizeflag
)
15835 case ax_reg
: case cx_reg
: case dx_reg
: case bx_reg
:
15836 case sp_reg
: case bp_reg
: case si_reg
: case di_reg
:
15837 s
= names16
[code
- ax_reg
];
15839 case es_reg
: case ss_reg
: case cs_reg
:
15840 case ds_reg
: case fs_reg
: case gs_reg
:
15841 s
= names_seg
[code
- es_reg
];
15843 case al_reg
: case ah_reg
: case cl_reg
: case ch_reg
:
15844 case dl_reg
: case dh_reg
: case bl_reg
: case bh_reg
:
15847 s
= names8rex
[code
- al_reg
];
15849 s
= names8
[code
- al_reg
];
15851 case eAX_reg
: case eCX_reg
: case eDX_reg
: case eBX_reg
:
15852 case eSP_reg
: case eBP_reg
: case eSI_reg
: case eDI_reg
:
15855 s
= names64
[code
- eAX_reg
];
15858 if (sizeflag
& DFLAG
)
15859 s
= names32
[code
- eAX_reg
];
15861 s
= names16
[code
- eAX_reg
];
15862 used_prefixes
|= (prefixes
& PREFIX_DATA
);
15865 case z_mode_ax_reg
:
15866 if ((rex
& REX_W
) || (sizeflag
& DFLAG
))
15870 if (!(rex
& REX_W
))
15871 used_prefixes
|= (prefixes
& PREFIX_DATA
);
15874 s
= INTERNAL_DISASSEMBLER_ERROR
;
15881 OP_I (int bytemode
, int sizeflag
)
15884 bfd_signed_vma mask
= -1;
15889 FETCH_DATA (the_info
, codep
+ 1);
15894 if (address_mode
== mode_64bit
)
15899 /* Fall through. */
15906 if (sizeflag
& DFLAG
)
15916 used_prefixes
|= (prefixes
& PREFIX_DATA
);
15928 oappend (INTERNAL_DISASSEMBLER_ERROR
);
15933 scratchbuf
[0] = '$';
15934 print_operand_value (scratchbuf
+ 1, 1, op
);
15935 oappend_maybe_intel (scratchbuf
);
15936 scratchbuf
[0] = '\0';
15940 OP_I64 (int bytemode
, int sizeflag
)
15943 bfd_signed_vma mask
= -1;
15945 if (address_mode
!= mode_64bit
)
15947 OP_I (bytemode
, sizeflag
);
15954 FETCH_DATA (the_info
, codep
+ 1);
15964 if (sizeflag
& DFLAG
)
15974 used_prefixes
|= (prefixes
& PREFIX_DATA
);
15982 oappend (INTERNAL_DISASSEMBLER_ERROR
);
15987 scratchbuf
[0] = '$';
15988 print_operand_value (scratchbuf
+ 1, 1, op
);
15989 oappend_maybe_intel (scratchbuf
);
15990 scratchbuf
[0] = '\0';
15994 OP_sI (int bytemode
, int sizeflag
)
16002 FETCH_DATA (the_info
, codep
+ 1);
16004 if ((op
& 0x80) != 0)
16006 if (bytemode
== b_T_mode
)
16008 if (address_mode
!= mode_64bit
16009 || !((sizeflag
& DFLAG
) || (rex
& REX_W
)))
16011 /* The operand-size prefix is overridden by a REX prefix. */
16012 if ((sizeflag
& DFLAG
) || (rex
& REX_W
))
16020 if (!(rex
& REX_W
))
16022 if (sizeflag
& DFLAG
)
16030 /* The operand-size prefix is overridden by a REX prefix. */
16031 if ((sizeflag
& DFLAG
) || (rex
& REX_W
))
16037 oappend (INTERNAL_DISASSEMBLER_ERROR
);
16041 scratchbuf
[0] = '$';
16042 print_operand_value (scratchbuf
+ 1, 1, op
);
16043 oappend_maybe_intel (scratchbuf
);
16047 OP_J (int bytemode
, int sizeflag
)
16051 bfd_vma segment
= 0;
16056 FETCH_DATA (the_info
, codep
+ 1);
16058 if ((disp
& 0x80) != 0)
16062 if (isa64
== amd64
)
16064 if ((sizeflag
& DFLAG
)
16065 || (address_mode
== mode_64bit
16066 && (isa64
!= amd64
|| (rex
& REX_W
))))
16071 if ((disp
& 0x8000) != 0)
16073 /* In 16bit mode, address is wrapped around at 64k within
16074 the same segment. Otherwise, a data16 prefix on a jump
16075 instruction means that the pc is masked to 16 bits after
16076 the displacement is added! */
16078 if ((prefixes
& PREFIX_DATA
) == 0)
16079 segment
= ((start_pc
+ (codep
- start_codep
))
16080 & ~((bfd_vma
) 0xffff));
16082 if (address_mode
!= mode_64bit
16083 || (isa64
== amd64
&& !(rex
& REX_W
)))
16084 used_prefixes
|= (prefixes
& PREFIX_DATA
);
16087 oappend (INTERNAL_DISASSEMBLER_ERROR
);
16090 disp
= ((start_pc
+ (codep
- start_codep
) + disp
) & mask
) | segment
;
16092 print_operand_value (scratchbuf
, 1, disp
);
16093 oappend (scratchbuf
);
16097 OP_SEG (int bytemode
, int sizeflag
)
16099 if (bytemode
== w_mode
)
16100 oappend (names_seg
[modrm
.reg
]);
16102 OP_E (modrm
.mod
== 3 ? bytemode
: w_mode
, sizeflag
);
16106 OP_DIR (int dummy ATTRIBUTE_UNUSED
, int sizeflag
)
16110 if (sizeflag
& DFLAG
)
16120 used_prefixes
|= (prefixes
& PREFIX_DATA
);
16122 sprintf (scratchbuf
, "0x%x:0x%x", seg
, offset
);
16124 sprintf (scratchbuf
, "$0x%x,$0x%x", seg
, offset
);
16125 oappend (scratchbuf
);
16129 OP_OFF (int bytemode
, int sizeflag
)
16133 if (intel_syntax
&& (sizeflag
& SUFFIX_ALWAYS
))
16134 intel_operand_size (bytemode
, sizeflag
);
16137 if ((sizeflag
& AFLAG
) || address_mode
== mode_64bit
)
16144 if (!active_seg_prefix
)
16146 oappend (names_seg
[ds_reg
- es_reg
]);
16150 print_operand_value (scratchbuf
, 1, off
);
16151 oappend (scratchbuf
);
16155 OP_OFF64 (int bytemode
, int sizeflag
)
16159 if (address_mode
!= mode_64bit
16160 || (prefixes
& PREFIX_ADDR
))
16162 OP_OFF (bytemode
, sizeflag
);
16166 if (intel_syntax
&& (sizeflag
& SUFFIX_ALWAYS
))
16167 intel_operand_size (bytemode
, sizeflag
);
16174 if (!active_seg_prefix
)
16176 oappend (names_seg
[ds_reg
- es_reg
]);
16180 print_operand_value (scratchbuf
, 1, off
);
16181 oappend (scratchbuf
);
16185 ptr_reg (int code
, int sizeflag
)
16189 *obufp
++ = open_char
;
16190 used_prefixes
|= (prefixes
& PREFIX_ADDR
);
16191 if (address_mode
== mode_64bit
)
16193 if (!(sizeflag
& AFLAG
))
16194 s
= names32
[code
- eAX_reg
];
16196 s
= names64
[code
- eAX_reg
];
16198 else if (sizeflag
& AFLAG
)
16199 s
= names32
[code
- eAX_reg
];
16201 s
= names16
[code
- eAX_reg
];
16203 *obufp
++ = close_char
;
16208 OP_ESreg (int code
, int sizeflag
)
16214 case 0x6d: /* insw/insl */
16215 intel_operand_size (z_mode
, sizeflag
);
16217 case 0xa5: /* movsw/movsl/movsq */
16218 case 0xa7: /* cmpsw/cmpsl/cmpsq */
16219 case 0xab: /* stosw/stosl */
16220 case 0xaf: /* scasw/scasl */
16221 intel_operand_size (v_mode
, sizeflag
);
16224 intel_operand_size (b_mode
, sizeflag
);
16227 oappend_maybe_intel ("%es:");
16228 ptr_reg (code
, sizeflag
);
16232 OP_DSreg (int code
, int sizeflag
)
16238 case 0x6f: /* outsw/outsl */
16239 intel_operand_size (z_mode
, sizeflag
);
16241 case 0xa5: /* movsw/movsl/movsq */
16242 case 0xa7: /* cmpsw/cmpsl/cmpsq */
16243 case 0xad: /* lodsw/lodsl/lodsq */
16244 intel_operand_size (v_mode
, sizeflag
);
16247 intel_operand_size (b_mode
, sizeflag
);
16250 /* Set active_seg_prefix to PREFIX_DS if it is unset so that the
16251 default segment register DS is printed. */
16252 if (!active_seg_prefix
)
16253 active_seg_prefix
= PREFIX_DS
;
16255 ptr_reg (code
, sizeflag
);
16259 OP_C (int dummy ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
16267 else if (address_mode
!= mode_64bit
&& (prefixes
& PREFIX_LOCK
))
16269 all_prefixes
[last_lock_prefix
] = 0;
16270 used_prefixes
|= PREFIX_LOCK
;
16275 sprintf (scratchbuf
, "%%cr%d", modrm
.reg
+ add
);
16276 oappend_maybe_intel (scratchbuf
);
16280 OP_D (int dummy ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
16289 sprintf (scratchbuf
, "db%d", modrm
.reg
+ add
);
16291 sprintf (scratchbuf
, "%%db%d", modrm
.reg
+ add
);
16292 oappend (scratchbuf
);
16296 OP_T (int dummy ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
16298 sprintf (scratchbuf
, "%%tr%d", modrm
.reg
);
16299 oappend_maybe_intel (scratchbuf
);
16303 OP_R (int bytemode
, int sizeflag
)
16305 /* Skip mod/rm byte. */
16308 OP_E_register (bytemode
, sizeflag
);
16312 OP_MMX (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
16314 int reg
= modrm
.reg
;
16315 const char **names
;
16317 used_prefixes
|= (prefixes
& PREFIX_DATA
);
16318 if (prefixes
& PREFIX_DATA
)
16327 oappend (names
[reg
]);
16331 OP_XMM (int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
16333 int reg
= modrm
.reg
;
16334 const char **names
;
16346 && bytemode
!= xmm_mode
16347 && bytemode
!= xmmq_mode
16348 && bytemode
!= evex_half_bcst_xmmq_mode
16349 && bytemode
!= ymm_mode
16350 && bytemode
!= scalar_mode
)
16352 switch (vex
.length
)
16359 || (bytemode
!= vex_vsib_q_w_dq_mode
16360 && bytemode
!= vex_vsib_q_w_d_mode
))
16372 else if (bytemode
== xmmq_mode
16373 || bytemode
== evex_half_bcst_xmmq_mode
)
16375 switch (vex
.length
)
16388 else if (bytemode
== ymm_mode
)
16392 oappend (names
[reg
]);
16396 OP_EM (int bytemode
, int sizeflag
)
16399 const char **names
;
16401 if (modrm
.mod
!= 3)
16404 && (bytemode
== v_mode
|| bytemode
== v_swap_mode
))
16406 bytemode
= (prefixes
& PREFIX_DATA
) ? x_mode
: q_mode
;
16407 used_prefixes
|= (prefixes
& PREFIX_DATA
);
16409 OP_E (bytemode
, sizeflag
);
16413 if ((sizeflag
& SUFFIX_ALWAYS
) && bytemode
== v_swap_mode
)
16416 /* Skip mod/rm byte. */
16419 used_prefixes
|= (prefixes
& PREFIX_DATA
);
16421 if (prefixes
& PREFIX_DATA
)
16430 oappend (names
[reg
]);
16433 /* cvt* are the only instructions in sse2 which have
16434 both SSE and MMX operands and also have 0x66 prefix
16435 in their opcode. 0x66 was originally used to differentiate
16436 between SSE and MMX instruction(operands). So we have to handle the
16437 cvt* separately using OP_EMC and OP_MXC */
16439 OP_EMC (int bytemode
, int sizeflag
)
16441 if (modrm
.mod
!= 3)
16443 if (intel_syntax
&& bytemode
== v_mode
)
16445 bytemode
= (prefixes
& PREFIX_DATA
) ? x_mode
: q_mode
;
16446 used_prefixes
|= (prefixes
& PREFIX_DATA
);
16448 OP_E (bytemode
, sizeflag
);
16452 /* Skip mod/rm byte. */
16455 used_prefixes
|= (prefixes
& PREFIX_DATA
);
16456 oappend (names_mm
[modrm
.rm
]);
16460 OP_MXC (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
16462 used_prefixes
|= (prefixes
& PREFIX_DATA
);
16463 oappend (names_mm
[modrm
.reg
]);
16467 OP_EX (int bytemode
, int sizeflag
)
16470 const char **names
;
16472 /* Skip mod/rm byte. */
16476 if (modrm
.mod
!= 3)
16478 OP_E_memory (bytemode
, sizeflag
);
16493 if ((sizeflag
& SUFFIX_ALWAYS
)
16494 && (bytemode
== x_swap_mode
16495 || bytemode
== d_swap_mode
16496 || bytemode
== d_scalar_swap_mode
16497 || bytemode
== q_swap_mode
16498 || bytemode
== q_scalar_swap_mode
))
16502 && bytemode
!= xmm_mode
16503 && bytemode
!= xmmdw_mode
16504 && bytemode
!= xmmqd_mode
16505 && bytemode
!= xmm_mb_mode
16506 && bytemode
!= xmm_mw_mode
16507 && bytemode
!= xmm_md_mode
16508 && bytemode
!= xmm_mq_mode
16509 && bytemode
!= xmm_mdq_mode
16510 && bytemode
!= xmmq_mode
16511 && bytemode
!= evex_half_bcst_xmmq_mode
16512 && bytemode
!= ymm_mode
16513 && bytemode
!= d_scalar_mode
16514 && bytemode
!= d_scalar_swap_mode
16515 && bytemode
!= q_scalar_mode
16516 && bytemode
!= q_scalar_swap_mode
16517 && bytemode
!= vex_scalar_w_dq_mode
)
16519 switch (vex
.length
)
16534 else if (bytemode
== xmmq_mode
16535 || bytemode
== evex_half_bcst_xmmq_mode
)
16537 switch (vex
.length
)
16550 else if (bytemode
== ymm_mode
)
16554 oappend (names
[reg
]);
16558 OP_MS (int bytemode
, int sizeflag
)
16560 if (modrm
.mod
== 3)
16561 OP_EM (bytemode
, sizeflag
);
16567 OP_XS (int bytemode
, int sizeflag
)
16569 if (modrm
.mod
== 3)
16570 OP_EX (bytemode
, sizeflag
);
16576 OP_M (int bytemode
, int sizeflag
)
16578 if (modrm
.mod
== 3)
16579 /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
16582 OP_E (bytemode
, sizeflag
);
16586 OP_0f07 (int bytemode
, int sizeflag
)
16588 if (modrm
.mod
!= 3 || modrm
.rm
!= 0)
16591 OP_E (bytemode
, sizeflag
);
16594 /* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
16595 32bit mode and "xchg %rax,%rax" in 64bit mode. */
16598 NOP_Fixup1 (int bytemode
, int sizeflag
)
16600 if ((prefixes
& PREFIX_DATA
) != 0
16603 && address_mode
== mode_64bit
))
16604 OP_REG (bytemode
, sizeflag
);
16606 strcpy (obuf
, "nop");
16610 NOP_Fixup2 (int bytemode
, int sizeflag
)
16612 if ((prefixes
& PREFIX_DATA
) != 0
16615 && address_mode
== mode_64bit
))
16616 OP_IMREG (bytemode
, sizeflag
);
16619 static const char *const Suffix3DNow
[] = {
16620 /* 00 */ NULL
, NULL
, NULL
, NULL
,
16621 /* 04 */ NULL
, NULL
, NULL
, NULL
,
16622 /* 08 */ NULL
, NULL
, NULL
, NULL
,
16623 /* 0C */ "pi2fw", "pi2fd", NULL
, NULL
,
16624 /* 10 */ NULL
, NULL
, NULL
, NULL
,
16625 /* 14 */ NULL
, NULL
, NULL
, NULL
,
16626 /* 18 */ NULL
, NULL
, NULL
, NULL
,
16627 /* 1C */ "pf2iw", "pf2id", NULL
, NULL
,
16628 /* 20 */ NULL
, NULL
, NULL
, NULL
,
16629 /* 24 */ NULL
, NULL
, NULL
, NULL
,
16630 /* 28 */ NULL
, NULL
, NULL
, NULL
,
16631 /* 2C */ NULL
, NULL
, NULL
, NULL
,
16632 /* 30 */ NULL
, NULL
, NULL
, NULL
,
16633 /* 34 */ NULL
, NULL
, NULL
, NULL
,
16634 /* 38 */ NULL
, NULL
, NULL
, NULL
,
16635 /* 3C */ NULL
, NULL
, NULL
, NULL
,
16636 /* 40 */ NULL
, NULL
, NULL
, NULL
,
16637 /* 44 */ NULL
, NULL
, NULL
, NULL
,
16638 /* 48 */ NULL
, NULL
, NULL
, NULL
,
16639 /* 4C */ NULL
, NULL
, NULL
, NULL
,
16640 /* 50 */ NULL
, NULL
, NULL
, NULL
,
16641 /* 54 */ NULL
, NULL
, NULL
, NULL
,
16642 /* 58 */ NULL
, NULL
, NULL
, NULL
,
16643 /* 5C */ NULL
, NULL
, NULL
, NULL
,
16644 /* 60 */ NULL
, NULL
, NULL
, NULL
,
16645 /* 64 */ NULL
, NULL
, NULL
, NULL
,
16646 /* 68 */ NULL
, NULL
, NULL
, NULL
,
16647 /* 6C */ NULL
, NULL
, NULL
, NULL
,
16648 /* 70 */ NULL
, NULL
, NULL
, NULL
,
16649 /* 74 */ NULL
, NULL
, NULL
, NULL
,
16650 /* 78 */ NULL
, NULL
, NULL
, NULL
,
16651 /* 7C */ NULL
, NULL
, NULL
, NULL
,
16652 /* 80 */ NULL
, NULL
, NULL
, NULL
,
16653 /* 84 */ NULL
, NULL
, NULL
, NULL
,
16654 /* 88 */ NULL
, NULL
, "pfnacc", NULL
,
16655 /* 8C */ NULL
, NULL
, "pfpnacc", NULL
,
16656 /* 90 */ "pfcmpge", NULL
, NULL
, NULL
,
16657 /* 94 */ "pfmin", NULL
, "pfrcp", "pfrsqrt",
16658 /* 98 */ NULL
, NULL
, "pfsub", NULL
,
16659 /* 9C */ NULL
, NULL
, "pfadd", NULL
,
16660 /* A0 */ "pfcmpgt", NULL
, NULL
, NULL
,
16661 /* A4 */ "pfmax", NULL
, "pfrcpit1", "pfrsqit1",
16662 /* A8 */ NULL
, NULL
, "pfsubr", NULL
,
16663 /* AC */ NULL
, NULL
, "pfacc", NULL
,
16664 /* B0 */ "pfcmpeq", NULL
, NULL
, NULL
,
16665 /* B4 */ "pfmul", NULL
, "pfrcpit2", "pmulhrw",
16666 /* B8 */ NULL
, NULL
, NULL
, "pswapd",
16667 /* BC */ NULL
, NULL
, NULL
, "pavgusb",
16668 /* C0 */ NULL
, NULL
, NULL
, NULL
,
16669 /* C4 */ NULL
, NULL
, NULL
, NULL
,
16670 /* C8 */ NULL
, NULL
, NULL
, NULL
,
16671 /* CC */ NULL
, NULL
, NULL
, NULL
,
16672 /* D0 */ NULL
, NULL
, NULL
, NULL
,
16673 /* D4 */ NULL
, NULL
, NULL
, NULL
,
16674 /* D8 */ NULL
, NULL
, NULL
, NULL
,
16675 /* DC */ NULL
, NULL
, NULL
, NULL
,
16676 /* E0 */ NULL
, NULL
, NULL
, NULL
,
16677 /* E4 */ NULL
, NULL
, NULL
, NULL
,
16678 /* E8 */ NULL
, NULL
, NULL
, NULL
,
16679 /* EC */ NULL
, NULL
, NULL
, NULL
,
16680 /* F0 */ NULL
, NULL
, NULL
, NULL
,
16681 /* F4 */ NULL
, NULL
, NULL
, NULL
,
16682 /* F8 */ NULL
, NULL
, NULL
, NULL
,
16683 /* FC */ NULL
, NULL
, NULL
, NULL
,
16687 OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
16689 const char *mnemonic
;
16691 FETCH_DATA (the_info
, codep
+ 1);
16692 /* AMD 3DNow! instructions are specified by an opcode suffix in the
16693 place where an 8-bit immediate would normally go. ie. the last
16694 byte of the instruction. */
16695 obufp
= mnemonicendp
;
16696 mnemonic
= Suffix3DNow
[*codep
++ & 0xff];
16698 oappend (mnemonic
);
16701 /* Since a variable sized modrm/sib chunk is between the start
16702 of the opcode (0x0f0f) and the opcode suffix, we need to do
16703 all the modrm processing first, and don't know until now that
16704 we have a bad opcode. This necessitates some cleaning up. */
16705 op_out
[0][0] = '\0';
16706 op_out
[1][0] = '\0';
16709 mnemonicendp
= obufp
;
16712 static struct op simd_cmp_op
[] =
16714 { STRING_COMMA_LEN ("eq") },
16715 { STRING_COMMA_LEN ("lt") },
16716 { STRING_COMMA_LEN ("le") },
16717 { STRING_COMMA_LEN ("unord") },
16718 { STRING_COMMA_LEN ("neq") },
16719 { STRING_COMMA_LEN ("nlt") },
16720 { STRING_COMMA_LEN ("nle") },
16721 { STRING_COMMA_LEN ("ord") }
16725 CMP_Fixup (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
16727 unsigned int cmp_type
;
16729 FETCH_DATA (the_info
, codep
+ 1);
16730 cmp_type
= *codep
++ & 0xff;
16731 if (cmp_type
< ARRAY_SIZE (simd_cmp_op
))
16734 char *p
= mnemonicendp
- 2;
16738 sprintf (p
, "%s%s", simd_cmp_op
[cmp_type
].name
, suffix
);
16739 mnemonicendp
+= simd_cmp_op
[cmp_type
].len
;
16743 /* We have a reserved extension byte. Output it directly. */
16744 scratchbuf
[0] = '$';
16745 print_operand_value (scratchbuf
+ 1, 1, cmp_type
);
16746 oappend_maybe_intel (scratchbuf
);
16747 scratchbuf
[0] = '\0';
16752 OP_Mwaitx (int bytemode ATTRIBUTE_UNUSED
,
16753 int sizeflag ATTRIBUTE_UNUSED
)
16755 /* mwaitx %eax,%ecx,%ebx */
16758 const char **names
= (address_mode
== mode_64bit
16759 ? names64
: names32
);
16760 strcpy (op_out
[0], names
[0]);
16761 strcpy (op_out
[1], names
[1]);
16762 strcpy (op_out
[2], names
[3]);
16763 two_source_ops
= 1;
16765 /* Skip mod/rm byte. */
16771 OP_Mwait (int bytemode ATTRIBUTE_UNUSED
,
16772 int sizeflag ATTRIBUTE_UNUSED
)
16774 /* mwait %eax,%ecx */
16777 const char **names
= (address_mode
== mode_64bit
16778 ? names64
: names32
);
16779 strcpy (op_out
[0], names
[0]);
16780 strcpy (op_out
[1], names
[1]);
16781 two_source_ops
= 1;
16783 /* Skip mod/rm byte. */
16789 OP_Monitor (int bytemode ATTRIBUTE_UNUSED
,
16790 int sizeflag ATTRIBUTE_UNUSED
)
16792 /* monitor %eax,%ecx,%edx" */
16795 const char **op1_names
;
16796 const char **names
= (address_mode
== mode_64bit
16797 ? names64
: names32
);
16799 if (!(prefixes
& PREFIX_ADDR
))
16800 op1_names
= (address_mode
== mode_16bit
16801 ? names16
: names
);
16804 /* Remove "addr16/addr32". */
16805 all_prefixes
[last_addr_prefix
] = 0;
16806 op1_names
= (address_mode
!= mode_32bit
16807 ? names32
: names16
);
16808 used_prefixes
|= PREFIX_ADDR
;
16810 strcpy (op_out
[0], op1_names
[0]);
16811 strcpy (op_out
[1], names
[1]);
16812 strcpy (op_out
[2], names
[2]);
16813 two_source_ops
= 1;
16815 /* Skip mod/rm byte. */
16823 /* Throw away prefixes and 1st. opcode byte. */
16824 codep
= insn_codep
+ 1;
16829 REP_Fixup (int bytemode
, int sizeflag
)
16831 /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
16833 if (prefixes
& PREFIX_REPZ
)
16834 all_prefixes
[last_repz_prefix
] = REP_PREFIX
;
16841 OP_IMREG (bytemode
, sizeflag
);
16844 OP_ESreg (bytemode
, sizeflag
);
16847 OP_DSreg (bytemode
, sizeflag
);
16855 /* For BND-prefixed instructions 0xF2 prefix should be displayed as
16859 BND_Fixup (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
16861 if (prefixes
& PREFIX_REPNZ
)
16862 all_prefixes
[last_repnz_prefix
] = BND_PREFIX
;
16865 /* For NOTRACK-prefixed instructions, 0x3E prefix should be displayed as
16869 NOTRACK_Fixup (int bytemode ATTRIBUTE_UNUSED
,
16870 int sizeflag ATTRIBUTE_UNUSED
)
16872 if (active_seg_prefix
== PREFIX_DS
16873 && (address_mode
!= mode_64bit
|| last_data_prefix
< 0))
16875 /* NOTRACK prefix is only valid on indirect branch instructions.
16876 NB: DATA prefix is unsupported for Intel64. */
16877 active_seg_prefix
= 0;
16878 all_prefixes
[last_seg_prefix
] = NOTRACK_PREFIX
;
16882 /* Similar to OP_E. But the 0xf2/0xf3 prefixes should be displayed as
16883 "xacquire"/"xrelease" for memory operand if there is a LOCK prefix.
16887 HLE_Fixup1 (int bytemode
, int sizeflag
)
16890 && (prefixes
& PREFIX_LOCK
) != 0)
16892 if (prefixes
& PREFIX_REPZ
)
16893 all_prefixes
[last_repz_prefix
] = XRELEASE_PREFIX
;
16894 if (prefixes
& PREFIX_REPNZ
)
16895 all_prefixes
[last_repnz_prefix
] = XACQUIRE_PREFIX
;
16898 OP_E (bytemode
, sizeflag
);
16901 /* Similar to OP_E. But the 0xf2/0xf3 prefixes should be displayed as
16902 "xacquire"/"xrelease" for memory operand. No check for LOCK prefix.
16906 HLE_Fixup2 (int bytemode
, int sizeflag
)
16908 if (modrm
.mod
!= 3)
16910 if (prefixes
& PREFIX_REPZ
)
16911 all_prefixes
[last_repz_prefix
] = XRELEASE_PREFIX
;
16912 if (prefixes
& PREFIX_REPNZ
)
16913 all_prefixes
[last_repnz_prefix
] = XACQUIRE_PREFIX
;
16916 OP_E (bytemode
, sizeflag
);
16919 /* Similar to OP_E. But the 0xf3 prefixes should be displayed as
16920 "xrelease" for memory operand. No check for LOCK prefix. */
16923 HLE_Fixup3 (int bytemode
, int sizeflag
)
16926 && last_repz_prefix
> last_repnz_prefix
16927 && (prefixes
& PREFIX_REPZ
) != 0)
16928 all_prefixes
[last_repz_prefix
] = XRELEASE_PREFIX
;
16930 OP_E (bytemode
, sizeflag
);
16934 CMPXCHG8B_Fixup (int bytemode
, int sizeflag
)
16939 /* Change cmpxchg8b to cmpxchg16b. */
16940 char *p
= mnemonicendp
- 2;
16941 mnemonicendp
= stpcpy (p
, "16b");
16944 else if ((prefixes
& PREFIX_LOCK
) != 0)
16946 if (prefixes
& PREFIX_REPZ
)
16947 all_prefixes
[last_repz_prefix
] = XRELEASE_PREFIX
;
16948 if (prefixes
& PREFIX_REPNZ
)
16949 all_prefixes
[last_repnz_prefix
] = XACQUIRE_PREFIX
;
16952 OP_M (bytemode
, sizeflag
);
16956 XMM_Fixup (int reg
, int sizeflag ATTRIBUTE_UNUSED
)
16958 const char **names
;
16962 switch (vex
.length
)
16976 oappend (names
[reg
]);
16980 CRC32_Fixup (int bytemode
, int sizeflag
)
16982 /* Add proper suffix to "crc32". */
16983 char *p
= mnemonicendp
;
17002 if (sizeflag
& DFLAG
)
17006 used_prefixes
|= (prefixes
& PREFIX_DATA
);
17010 oappend (INTERNAL_DISASSEMBLER_ERROR
);
17017 if (modrm
.mod
== 3)
17021 /* Skip mod/rm byte. */
17026 add
= (rex
& REX_B
) ? 8 : 0;
17027 if (bytemode
== b_mode
)
17031 oappend (names8rex
[modrm
.rm
+ add
]);
17033 oappend (names8
[modrm
.rm
+ add
]);
17039 oappend (names64
[modrm
.rm
+ add
]);
17040 else if ((prefixes
& PREFIX_DATA
))
17041 oappend (names16
[modrm
.rm
+ add
]);
17043 oappend (names32
[modrm
.rm
+ add
]);
17047 OP_E (bytemode
, sizeflag
);
17051 FXSAVE_Fixup (int bytemode
, int sizeflag
)
17053 /* Add proper suffix to "fxsave" and "fxrstor". */
17057 char *p
= mnemonicendp
;
17063 OP_M (bytemode
, sizeflag
);
17067 PCMPESTR_Fixup (int bytemode
, int sizeflag
)
17069 /* Add proper suffix to "{,v}pcmpestr{i,m}". */
17072 char *p
= mnemonicendp
;
17077 else if (sizeflag
& SUFFIX_ALWAYS
)
17084 OP_EX (bytemode
, sizeflag
);
17087 /* Display the destination register operand for instructions with
17091 OP_VEX (int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
17094 const char **names
;
17102 reg
= vex
.register_specifier
;
17109 if (bytemode
== vex_scalar_mode
)
17111 oappend (names_xmm
[reg
]);
17115 switch (vex
.length
)
17122 case vex_vsib_q_w_dq_mode
:
17123 case vex_vsib_q_w_d_mode
:
17139 names
= names_mask
;
17153 case vex_vsib_q_w_dq_mode
:
17154 case vex_vsib_q_w_d_mode
:
17155 names
= vex
.w
? names_ymm
: names_xmm
;
17164 names
= names_mask
;
17167 /* See PR binutils/20893 for a reproducer. */
17179 oappend (names
[reg
]);
17182 /* Get the VEX immediate byte without moving codep. */
17184 static unsigned char
17185 get_vex_imm8 (int sizeflag
, int opnum
)
17187 int bytes_before_imm
= 0;
17189 if (modrm
.mod
!= 3)
17191 /* There are SIB/displacement bytes. */
17192 if ((sizeflag
& AFLAG
) || address_mode
== mode_64bit
)
17194 /* 32/64 bit address mode */
17195 int base
= modrm
.rm
;
17197 /* Check SIB byte. */
17200 FETCH_DATA (the_info
, codep
+ 1);
17202 /* When decoding the third source, don't increase
17203 bytes_before_imm as this has already been incremented
17204 by one in OP_E_memory while decoding the second
17207 bytes_before_imm
++;
17210 /* Don't increase bytes_before_imm when decoding the third source,
17211 it has already been incremented by OP_E_memory while decoding
17212 the second source operand. */
17218 /* When modrm.rm == 5 or modrm.rm == 4 and base in
17219 SIB == 5, there is a 4 byte displacement. */
17221 /* No displacement. */
17223 /* Fall through. */
17225 /* 4 byte displacement. */
17226 bytes_before_imm
+= 4;
17229 /* 1 byte displacement. */
17230 bytes_before_imm
++;
17237 /* 16 bit address mode */
17238 /* Don't increase bytes_before_imm when decoding the third source,
17239 it has already been incremented by OP_E_memory while decoding
17240 the second source operand. */
17246 /* When modrm.rm == 6, there is a 2 byte displacement. */
17248 /* No displacement. */
17250 /* Fall through. */
17252 /* 2 byte displacement. */
17253 bytes_before_imm
+= 2;
17256 /* 1 byte displacement: when decoding the third source,
17257 don't increase bytes_before_imm as this has already
17258 been incremented by one in OP_E_memory while decoding
17259 the second source operand. */
17261 bytes_before_imm
++;
17269 FETCH_DATA (the_info
, codep
+ bytes_before_imm
+ 1);
17270 return codep
[bytes_before_imm
];
17274 OP_EX_VexReg (int bytemode
, int sizeflag
, int reg
)
17276 const char **names
;
17278 if (reg
== -1 && modrm
.mod
!= 3)
17280 OP_E_memory (bytemode
, sizeflag
);
17292 else if (reg
> 7 && address_mode
!= mode_64bit
)
17296 switch (vex
.length
)
17307 oappend (names
[reg
]);
17311 OP_EX_VexImmW (int bytemode
, int sizeflag
)
17314 static unsigned char vex_imm8
;
17316 if (vex_w_done
== 0)
17320 /* Skip mod/rm byte. */
17324 vex_imm8
= get_vex_imm8 (sizeflag
, 0);
17327 reg
= vex_imm8
>> 4;
17329 OP_EX_VexReg (bytemode
, sizeflag
, reg
);
17331 else if (vex_w_done
== 1)
17336 reg
= vex_imm8
>> 4;
17338 OP_EX_VexReg (bytemode
, sizeflag
, reg
);
17342 /* Output the imm8 directly. */
17343 scratchbuf
[0] = '$';
17344 print_operand_value (scratchbuf
+ 1, 1, vex_imm8
& 0xf);
17345 oappend_maybe_intel (scratchbuf
);
17346 scratchbuf
[0] = '\0';
17352 OP_Vex_2src (int bytemode
, int sizeflag
)
17354 if (modrm
.mod
== 3)
17356 int reg
= modrm
.rm
;
17360 oappend (names_xmm
[reg
]);
17365 && (bytemode
== v_mode
|| bytemode
== v_swap_mode
))
17367 bytemode
= (prefixes
& PREFIX_DATA
) ? x_mode
: q_mode
;
17368 used_prefixes
|= (prefixes
& PREFIX_DATA
);
17370 OP_E (bytemode
, sizeflag
);
17375 OP_Vex_2src_1 (int bytemode
, int sizeflag
)
17377 if (modrm
.mod
== 3)
17379 /* Skip mod/rm byte. */
17385 oappend (names_xmm
[vex
.register_specifier
]);
17387 OP_Vex_2src (bytemode
, sizeflag
);
17391 OP_Vex_2src_2 (int bytemode
, int sizeflag
)
17394 OP_Vex_2src (bytemode
, sizeflag
);
17396 oappend (names_xmm
[vex
.register_specifier
]);
17400 OP_EX_VexW (int bytemode
, int sizeflag
)
17408 /* Skip mod/rm byte. */
17413 reg
= get_vex_imm8 (sizeflag
, 0) >> 4;
17418 reg
= get_vex_imm8 (sizeflag
, 1) >> 4;
17421 OP_EX_VexReg (bytemode
, sizeflag
, reg
);
17425 VEXI4_Fixup (int bytemode ATTRIBUTE_UNUSED
,
17426 int sizeflag ATTRIBUTE_UNUSED
)
17428 /* Skip the immediate byte and check for invalid bits. */
17429 FETCH_DATA (the_info
, codep
+ 1);
17430 if (*codep
++ & 0xf)
17435 OP_REG_VexI4 (int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
17438 const char **names
;
17440 FETCH_DATA (the_info
, codep
+ 1);
17443 if (bytemode
!= x_mode
)
17450 if (reg
> 7 && address_mode
!= mode_64bit
)
17453 switch (vex
.length
)
17464 oappend (names
[reg
]);
17468 OP_XMM_VexW (int bytemode
, int sizeflag
)
17470 /* Turn off the REX.W bit since it is used for swapping operands
17473 OP_XMM (bytemode
, sizeflag
);
17477 OP_EX_Vex (int bytemode
, int sizeflag
)
17479 if (modrm
.mod
!= 3)
17481 if (vex
.register_specifier
!= 0)
17485 OP_EX (bytemode
, sizeflag
);
17489 OP_XMM_Vex (int bytemode
, int sizeflag
)
17491 if (modrm
.mod
!= 3)
17493 if (vex
.register_specifier
!= 0)
17497 OP_XMM (bytemode
, sizeflag
);
17501 VZERO_Fixup (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
17503 switch (vex
.length
)
17506 mnemonicendp
= stpcpy (obuf
, "vzeroupper");
17509 mnemonicendp
= stpcpy (obuf
, "vzeroall");
17516 static struct op vex_cmp_op
[] =
17518 { STRING_COMMA_LEN ("eq") },
17519 { STRING_COMMA_LEN ("lt") },
17520 { STRING_COMMA_LEN ("le") },
17521 { STRING_COMMA_LEN ("unord") },
17522 { STRING_COMMA_LEN ("neq") },
17523 { STRING_COMMA_LEN ("nlt") },
17524 { STRING_COMMA_LEN ("nle") },
17525 { STRING_COMMA_LEN ("ord") },
17526 { STRING_COMMA_LEN ("eq_uq") },
17527 { STRING_COMMA_LEN ("nge") },
17528 { STRING_COMMA_LEN ("ngt") },
17529 { STRING_COMMA_LEN ("false") },
17530 { STRING_COMMA_LEN ("neq_oq") },
17531 { STRING_COMMA_LEN ("ge") },
17532 { STRING_COMMA_LEN ("gt") },
17533 { STRING_COMMA_LEN ("true") },
17534 { STRING_COMMA_LEN ("eq_os") },
17535 { STRING_COMMA_LEN ("lt_oq") },
17536 { STRING_COMMA_LEN ("le_oq") },
17537 { STRING_COMMA_LEN ("unord_s") },
17538 { STRING_COMMA_LEN ("neq_us") },
17539 { STRING_COMMA_LEN ("nlt_uq") },
17540 { STRING_COMMA_LEN ("nle_uq") },
17541 { STRING_COMMA_LEN ("ord_s") },
17542 { STRING_COMMA_LEN ("eq_us") },
17543 { STRING_COMMA_LEN ("nge_uq") },
17544 { STRING_COMMA_LEN ("ngt_uq") },
17545 { STRING_COMMA_LEN ("false_os") },
17546 { STRING_COMMA_LEN ("neq_os") },
17547 { STRING_COMMA_LEN ("ge_oq") },
17548 { STRING_COMMA_LEN ("gt_oq") },
17549 { STRING_COMMA_LEN ("true_us") },
17553 VCMP_Fixup (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
17555 unsigned int cmp_type
;
17557 FETCH_DATA (the_info
, codep
+ 1);
17558 cmp_type
= *codep
++ & 0xff;
17559 if (cmp_type
< ARRAY_SIZE (vex_cmp_op
))
17562 char *p
= mnemonicendp
- 2;
17566 sprintf (p
, "%s%s", vex_cmp_op
[cmp_type
].name
, suffix
);
17567 mnemonicendp
+= vex_cmp_op
[cmp_type
].len
;
17571 /* We have a reserved extension byte. Output it directly. */
17572 scratchbuf
[0] = '$';
17573 print_operand_value (scratchbuf
+ 1, 1, cmp_type
);
17574 oappend_maybe_intel (scratchbuf
);
17575 scratchbuf
[0] = '\0';
17580 VPCMP_Fixup (int bytemode ATTRIBUTE_UNUSED
,
17581 int sizeflag ATTRIBUTE_UNUSED
)
17583 unsigned int cmp_type
;
17588 FETCH_DATA (the_info
, codep
+ 1);
17589 cmp_type
= *codep
++ & 0xff;
17590 /* There are aliases for immediates 0, 1, 2, 4, 5, 6.
17591 If it's the case, print suffix, otherwise - print the immediate. */
17592 if (cmp_type
< ARRAY_SIZE (simd_cmp_op
)
17597 char *p
= mnemonicendp
- 2;
17599 /* vpcmp* can have both one- and two-lettered suffix. */
17613 sprintf (p
, "%s%s", simd_cmp_op
[cmp_type
].name
, suffix
);
17614 mnemonicendp
+= simd_cmp_op
[cmp_type
].len
;
17618 /* We have a reserved extension byte. Output it directly. */
17619 scratchbuf
[0] = '$';
17620 print_operand_value (scratchbuf
+ 1, 1, cmp_type
);
17621 oappend_maybe_intel (scratchbuf
);
17622 scratchbuf
[0] = '\0';
17626 static const struct op xop_cmp_op
[] =
17628 { STRING_COMMA_LEN ("lt") },
17629 { STRING_COMMA_LEN ("le") },
17630 { STRING_COMMA_LEN ("gt") },
17631 { STRING_COMMA_LEN ("ge") },
17632 { STRING_COMMA_LEN ("eq") },
17633 { STRING_COMMA_LEN ("neq") },
17634 { STRING_COMMA_LEN ("false") },
17635 { STRING_COMMA_LEN ("true") }
17639 VPCOM_Fixup (int bytemode ATTRIBUTE_UNUSED
,
17640 int sizeflag ATTRIBUTE_UNUSED
)
17642 unsigned int cmp_type
;
17644 FETCH_DATA (the_info
, codep
+ 1);
17645 cmp_type
= *codep
++ & 0xff;
17646 if (cmp_type
< ARRAY_SIZE (xop_cmp_op
))
17649 char *p
= mnemonicendp
- 2;
17651 /* vpcom* can have both one- and two-lettered suffix. */
17665 sprintf (p
, "%s%s", xop_cmp_op
[cmp_type
].name
, suffix
);
17666 mnemonicendp
+= xop_cmp_op
[cmp_type
].len
;
17670 /* We have a reserved extension byte. Output it directly. */
17671 scratchbuf
[0] = '$';
17672 print_operand_value (scratchbuf
+ 1, 1, cmp_type
);
17673 oappend_maybe_intel (scratchbuf
);
17674 scratchbuf
[0] = '\0';
17678 static const struct op pclmul_op
[] =
17680 { STRING_COMMA_LEN ("lql") },
17681 { STRING_COMMA_LEN ("hql") },
17682 { STRING_COMMA_LEN ("lqh") },
17683 { STRING_COMMA_LEN ("hqh") }
17687 PCLMUL_Fixup (int bytemode ATTRIBUTE_UNUSED
,
17688 int sizeflag ATTRIBUTE_UNUSED
)
17690 unsigned int pclmul_type
;
17692 FETCH_DATA (the_info
, codep
+ 1);
17693 pclmul_type
= *codep
++ & 0xff;
17694 switch (pclmul_type
)
17705 if (pclmul_type
< ARRAY_SIZE (pclmul_op
))
17708 char *p
= mnemonicendp
- 3;
17713 sprintf (p
, "%s%s", pclmul_op
[pclmul_type
].name
, suffix
);
17714 mnemonicendp
+= pclmul_op
[pclmul_type
].len
;
17718 /* We have a reserved extension byte. Output it directly. */
17719 scratchbuf
[0] = '$';
17720 print_operand_value (scratchbuf
+ 1, 1, pclmul_type
);
17721 oappend_maybe_intel (scratchbuf
);
17722 scratchbuf
[0] = '\0';
17727 MOVBE_Fixup (int bytemode
, int sizeflag
)
17729 /* Add proper suffix to "movbe". */
17730 char *p
= mnemonicendp
;
17739 if (sizeflag
& SUFFIX_ALWAYS
)
17745 if (sizeflag
& DFLAG
)
17749 used_prefixes
|= (prefixes
& PREFIX_DATA
);
17754 oappend (INTERNAL_DISASSEMBLER_ERROR
);
17761 OP_M (bytemode
, sizeflag
);
17765 OP_LWPCB_E (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
17768 const char **names
;
17770 /* Skip mod/rm byte. */
17784 oappend (names
[reg
]);
17788 OP_LWP_E (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
17790 const char **names
;
17797 oappend (names
[vex
.register_specifier
]);
17801 OP_Mask (int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
17804 || (bytemode
!= mask_mode
&& bytemode
!= mask_bd_mode
))
17808 if ((rex
& REX_R
) != 0 || !vex
.r
)
17814 oappend (names_mask
[modrm
.reg
]);
17818 OP_Rounding (int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
17821 || (bytemode
!= evex_rounding_mode
17822 && bytemode
!= evex_sae_mode
))
17824 if (modrm
.mod
== 3 && vex
.b
)
17827 case evex_rounding_mode
:
17828 oappend (names_rounding
[vex
.ll
]);
17830 case evex_sae_mode
: