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 OP_0f07 (int, int);
103 static void OP_Monitor (int, int);
104 static void OP_Mwait (int, int);
105 static void OP_Mwaitx (int, int);
106 static void NOP_Fixup1 (int, int);
107 static void NOP_Fixup2 (int, int);
108 static void OP_3DNowSuffix (int, int);
109 static void CMP_Fixup (int, int);
110 static void BadOp (void);
111 static void REP_Fixup (int, int);
112 static void BND_Fixup (int, int);
113 static void NOTRACK_Fixup (int, int);
114 static void HLE_Fixup1 (int, int);
115 static void HLE_Fixup2 (int, int);
116 static void HLE_Fixup3 (int, int);
117 static void CMPXCHG8B_Fixup (int, int);
118 static void XMM_Fixup (int, int);
119 static void CRC32_Fixup (int, int);
120 static void FXSAVE_Fixup (int, int);
121 static void PCMPESTR_Fixup (int, int);
122 static void OP_LWPCB_E (int, int);
123 static void OP_LWP_E (int, int);
124 static void OP_Vex_2src_1 (int, int);
125 static void OP_Vex_2src_2 (int, int);
127 static void MOVBE_Fixup (int, int);
129 static void OP_Mask (int, int);
132 /* Points to first byte not fetched. */
133 bfd_byte
*max_fetched
;
134 bfd_byte the_buffer
[MAX_MNEM_SIZE
];
137 OPCODES_SIGJMP_BUF bailout
;
147 enum address_mode address_mode
;
149 /* Flags for the prefixes for the current instruction. See below. */
152 /* REX prefix the current instruction. See below. */
154 /* Bits of REX we've already used. */
156 /* REX bits in original REX prefix ignored. */
157 static int rex_ignored
;
158 /* Mark parts used in the REX prefix. When we are testing for
159 empty prefix (for 8bit register REX extension), just mask it
160 out. Otherwise test for REX bit is excuse for existence of REX
161 only in case value is nonzero. */
162 #define USED_REX(value) \
167 rex_used |= (value) | REX_OPCODE; \
170 rex_used |= REX_OPCODE; \
173 /* Flags for prefixes which we somehow handled when printing the
174 current instruction. */
175 static int used_prefixes
;
177 /* Flags stored in PREFIXES. */
178 #define PREFIX_REPZ 1
179 #define PREFIX_REPNZ 2
180 #define PREFIX_LOCK 4
182 #define PREFIX_SS 0x10
183 #define PREFIX_DS 0x20
184 #define PREFIX_ES 0x40
185 #define PREFIX_FS 0x80
186 #define PREFIX_GS 0x100
187 #define PREFIX_DATA 0x200
188 #define PREFIX_ADDR 0x400
189 #define PREFIX_FWAIT 0x800
191 /* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
192 to ADDR (exclusive) are valid. Returns 1 for success, longjmps
194 #define FETCH_DATA(info, addr) \
195 ((addr) <= ((struct dis_private *) (info->private_data))->max_fetched \
196 ? 1 : fetch_data ((info), (addr)))
199 fetch_data (struct disassemble_info
*info
, bfd_byte
*addr
)
202 struct dis_private
*priv
= (struct dis_private
*) info
->private_data
;
203 bfd_vma start
= priv
->insn_start
+ (priv
->max_fetched
- priv
->the_buffer
);
205 if (addr
<= priv
->the_buffer
+ MAX_MNEM_SIZE
)
206 status
= (*info
->read_memory_func
) (start
,
208 addr
- priv
->max_fetched
,
214 /* If we did manage to read at least one byte, then
215 print_insn_i386 will do something sensible. Otherwise, print
216 an error. We do that here because this is where we know
218 if (priv
->max_fetched
== priv
->the_buffer
)
219 (*info
->memory_error_func
) (status
, start
, info
);
220 OPCODES_SIGLONGJMP (priv
->bailout
, 1);
223 priv
->max_fetched
= addr
;
227 /* Possible values for prefix requirement. */
228 #define PREFIX_IGNORED_SHIFT 16
229 #define PREFIX_IGNORED_REPZ (PREFIX_REPZ << PREFIX_IGNORED_SHIFT)
230 #define PREFIX_IGNORED_REPNZ (PREFIX_REPNZ << PREFIX_IGNORED_SHIFT)
231 #define PREFIX_IGNORED_DATA (PREFIX_DATA << PREFIX_IGNORED_SHIFT)
232 #define PREFIX_IGNORED_ADDR (PREFIX_ADDR << PREFIX_IGNORED_SHIFT)
233 #define PREFIX_IGNORED_LOCK (PREFIX_LOCK << PREFIX_IGNORED_SHIFT)
235 /* Opcode prefixes. */
236 #define PREFIX_OPCODE (PREFIX_REPZ \
240 /* Prefixes ignored. */
241 #define PREFIX_IGNORED (PREFIX_IGNORED_REPZ \
242 | PREFIX_IGNORED_REPNZ \
243 | PREFIX_IGNORED_DATA)
245 #define XX { NULL, 0 }
246 #define Bad_Opcode NULL, { { NULL, 0 } }, 0
248 #define Eb { OP_E, b_mode }
249 #define Ebnd { OP_E, bnd_mode }
250 #define EbS { OP_E, b_swap_mode }
251 #define Ev { OP_E, v_mode }
252 #define Ev_bnd { OP_E, v_bnd_mode }
253 #define EvS { OP_E, v_swap_mode }
254 #define Ed { OP_E, d_mode }
255 #define Edq { OP_E, dq_mode }
256 #define Edqw { OP_E, dqw_mode }
257 #define Edqb { OP_E, dqb_mode }
258 #define Edb { OP_E, db_mode }
259 #define Edw { OP_E, dw_mode }
260 #define Edqd { OP_E, dqd_mode }
261 #define Eq { OP_E, q_mode }
262 #define indirEv { OP_indirE, indir_v_mode }
263 #define indirEp { OP_indirE, f_mode }
264 #define stackEv { OP_E, stack_v_mode }
265 #define Em { OP_E, m_mode }
266 #define Ew { OP_E, w_mode }
267 #define M { OP_M, 0 } /* lea, lgdt, etc. */
268 #define Ma { OP_M, a_mode }
269 #define Mb { OP_M, b_mode }
270 #define Md { OP_M, d_mode }
271 #define Mo { OP_M, o_mode }
272 #define Mp { OP_M, f_mode } /* 32 or 48 bit memory operand for LDS, LES etc */
273 #define Mq { OP_M, q_mode }
274 #define Mx { OP_M, x_mode }
275 #define Mxmm { OP_M, xmm_mode }
276 #define Gb { OP_G, b_mode }
277 #define Gbnd { OP_G, bnd_mode }
278 #define Gv { OP_G, v_mode }
279 #define Gd { OP_G, d_mode }
280 #define Gdq { OP_G, dq_mode }
281 #define Gm { OP_G, m_mode }
282 #define Gw { OP_G, w_mode }
283 #define Rd { OP_R, d_mode }
284 #define Rdq { OP_R, dq_mode }
285 #define Rm { OP_R, m_mode }
286 #define Ib { OP_I, b_mode }
287 #define sIb { OP_sI, b_mode } /* sign extened byte */
288 #define sIbT { OP_sI, b_T_mode } /* sign extened byte like 'T' */
289 #define Iv { OP_I, v_mode }
290 #define sIv { OP_sI, v_mode }
291 #define Iq { OP_I, q_mode }
292 #define Iv64 { OP_I64, v_mode }
293 #define Iw { OP_I, w_mode }
294 #define I1 { OP_I, const_1_mode }
295 #define Jb { OP_J, b_mode }
296 #define Jv { OP_J, v_mode }
297 #define Cm { OP_C, m_mode }
298 #define Dm { OP_D, m_mode }
299 #define Td { OP_T, d_mode }
300 #define Skip_MODRM { OP_Skip_MODRM, 0 }
302 #define RMeAX { OP_REG, eAX_reg }
303 #define RMeBX { OP_REG, eBX_reg }
304 #define RMeCX { OP_REG, eCX_reg }
305 #define RMeDX { OP_REG, eDX_reg }
306 #define RMeSP { OP_REG, eSP_reg }
307 #define RMeBP { OP_REG, eBP_reg }
308 #define RMeSI { OP_REG, eSI_reg }
309 #define RMeDI { OP_REG, eDI_reg }
310 #define RMrAX { OP_REG, rAX_reg }
311 #define RMrBX { OP_REG, rBX_reg }
312 #define RMrCX { OP_REG, rCX_reg }
313 #define RMrDX { OP_REG, rDX_reg }
314 #define RMrSP { OP_REG, rSP_reg }
315 #define RMrBP { OP_REG, rBP_reg }
316 #define RMrSI { OP_REG, rSI_reg }
317 #define RMrDI { OP_REG, rDI_reg }
318 #define RMAL { OP_REG, al_reg }
319 #define RMCL { OP_REG, cl_reg }
320 #define RMDL { OP_REG, dl_reg }
321 #define RMBL { OP_REG, bl_reg }
322 #define RMAH { OP_REG, ah_reg }
323 #define RMCH { OP_REG, ch_reg }
324 #define RMDH { OP_REG, dh_reg }
325 #define RMBH { OP_REG, bh_reg }
326 #define RMAX { OP_REG, ax_reg }
327 #define RMDX { OP_REG, dx_reg }
329 #define eAX { OP_IMREG, eAX_reg }
330 #define eBX { OP_IMREG, eBX_reg }
331 #define eCX { OP_IMREG, eCX_reg }
332 #define eDX { OP_IMREG, eDX_reg }
333 #define eSP { OP_IMREG, eSP_reg }
334 #define eBP { OP_IMREG, eBP_reg }
335 #define eSI { OP_IMREG, eSI_reg }
336 #define eDI { OP_IMREG, eDI_reg }
337 #define AL { OP_IMREG, al_reg }
338 #define CL { OP_IMREG, cl_reg }
339 #define DL { OP_IMREG, dl_reg }
340 #define BL { OP_IMREG, bl_reg }
341 #define AH { OP_IMREG, ah_reg }
342 #define CH { OP_IMREG, ch_reg }
343 #define DH { OP_IMREG, dh_reg }
344 #define BH { OP_IMREG, bh_reg }
345 #define AX { OP_IMREG, ax_reg }
346 #define DX { OP_IMREG, dx_reg }
347 #define zAX { OP_IMREG, z_mode_ax_reg }
348 #define indirDX { OP_IMREG, indir_dx_reg }
350 #define Sw { OP_SEG, w_mode }
351 #define Sv { OP_SEG, v_mode }
352 #define Ap { OP_DIR, 0 }
353 #define Ob { OP_OFF64, b_mode }
354 #define Ov { OP_OFF64, v_mode }
355 #define Xb { OP_DSreg, eSI_reg }
356 #define Xv { OP_DSreg, eSI_reg }
357 #define Xz { OP_DSreg, eSI_reg }
358 #define Yb { OP_ESreg, eDI_reg }
359 #define Yv { OP_ESreg, eDI_reg }
360 #define DSBX { OP_DSreg, eBX_reg }
362 #define es { OP_REG, es_reg }
363 #define ss { OP_REG, ss_reg }
364 #define cs { OP_REG, cs_reg }
365 #define ds { OP_REG, ds_reg }
366 #define fs { OP_REG, fs_reg }
367 #define gs { OP_REG, gs_reg }
369 #define MX { OP_MMX, 0 }
370 #define XM { OP_XMM, 0 }
371 #define XMScalar { OP_XMM, scalar_mode }
372 #define XMGatherQ { OP_XMM, vex_vsib_q_w_dq_mode }
373 #define XMM { OP_XMM, xmm_mode }
374 #define XMxmmq { OP_XMM, xmmq_mode }
375 #define EM { OP_EM, v_mode }
376 #define EMS { OP_EM, v_swap_mode }
377 #define EMd { OP_EM, d_mode }
378 #define EMx { OP_EM, x_mode }
379 #define EXbScalar { OP_EX, b_scalar_mode }
380 #define EXw { OP_EX, w_mode }
381 #define EXwScalar { OP_EX, w_scalar_mode }
382 #define EXd { OP_EX, d_mode }
383 #define EXdScalar { OP_EX, d_scalar_mode }
384 #define EXdS { OP_EX, d_swap_mode }
385 #define EXdScalarS { OP_EX, d_scalar_swap_mode }
386 #define EXq { OP_EX, q_mode }
387 #define EXqScalar { OP_EX, q_scalar_mode }
388 #define EXqScalarS { OP_EX, q_scalar_swap_mode }
389 #define EXqS { OP_EX, q_swap_mode }
390 #define EXx { OP_EX, x_mode }
391 #define EXxS { OP_EX, x_swap_mode }
392 #define EXxmm { OP_EX, xmm_mode }
393 #define EXymm { OP_EX, ymm_mode }
394 #define EXxmmq { OP_EX, xmmq_mode }
395 #define EXEvexHalfBcstXmmq { OP_EX, evex_half_bcst_xmmq_mode }
396 #define EXxmm_mb { OP_EX, xmm_mb_mode }
397 #define EXxmm_mw { OP_EX, xmm_mw_mode }
398 #define EXxmm_md { OP_EX, xmm_md_mode }
399 #define EXxmm_mq { OP_EX, xmm_mq_mode }
400 #define EXxmm_mdq { OP_EX, xmm_mdq_mode }
401 #define EXxmmdw { OP_EX, xmmdw_mode }
402 #define EXxmmqd { OP_EX, xmmqd_mode }
403 #define EXymmq { OP_EX, ymmq_mode }
404 #define EXVexWdq { OP_EX, vex_w_dq_mode }
405 #define EXVexWdqScalar { OP_EX, vex_scalar_w_dq_mode }
406 #define EXEvexXGscat { OP_EX, evex_x_gscat_mode }
407 #define EXEvexXNoBcst { OP_EX, evex_x_nobcst_mode }
408 #define MS { OP_MS, v_mode }
409 #define XS { OP_XS, v_mode }
410 #define EMCq { OP_EMC, q_mode }
411 #define MXC { OP_MXC, 0 }
412 #define OPSUF { OP_3DNowSuffix, 0 }
413 #define CMP { CMP_Fixup, 0 }
414 #define XMM0 { XMM_Fixup, 0 }
415 #define FXSAVE { FXSAVE_Fixup, 0 }
416 #define Vex_2src_1 { OP_Vex_2src_1, 0 }
417 #define Vex_2src_2 { OP_Vex_2src_2, 0 }
419 #define Vex { OP_VEX, vex_mode }
420 #define VexScalar { OP_VEX, vex_scalar_mode }
421 #define VexGatherQ { OP_VEX, vex_vsib_q_w_dq_mode }
422 #define Vex128 { OP_VEX, vex128_mode }
423 #define Vex256 { OP_VEX, vex256_mode }
424 #define VexGdq { OP_VEX, dq_mode }
425 #define VexI4 { VEXI4_Fixup, 0}
426 #define EXdVex { OP_EX_Vex, d_mode }
427 #define EXdVexS { OP_EX_Vex, d_swap_mode }
428 #define EXdVexScalarS { OP_EX_Vex, d_scalar_swap_mode }
429 #define EXqVex { OP_EX_Vex, q_mode }
430 #define EXqVexS { OP_EX_Vex, q_swap_mode }
431 #define EXqVexScalarS { OP_EX_Vex, q_scalar_swap_mode }
432 #define EXVexW { OP_EX_VexW, x_mode }
433 #define EXdVexW { OP_EX_VexW, d_mode }
434 #define EXqVexW { OP_EX_VexW, q_mode }
435 #define EXVexImmW { OP_EX_VexImmW, x_mode }
436 #define XMVex { OP_XMM_Vex, 0 }
437 #define XMVexScalar { OP_XMM_Vex, scalar_mode }
438 #define XMVexW { OP_XMM_VexW, 0 }
439 #define XMVexI4 { OP_REG_VexI4, x_mode }
440 #define PCLMUL { PCLMUL_Fixup, 0 }
441 #define VZERO { VZERO_Fixup, 0 }
442 #define VCMP { VCMP_Fixup, 0 }
443 #define VPCMP { VPCMP_Fixup, 0 }
445 #define EXxEVexR { OP_Rounding, evex_rounding_mode }
446 #define EXxEVexS { OP_Rounding, evex_sae_mode }
448 #define XMask { OP_Mask, mask_mode }
449 #define MaskG { OP_G, mask_mode }
450 #define MaskE { OP_E, mask_mode }
451 #define MaskBDE { OP_E, mask_bd_mode }
452 #define MaskR { OP_R, mask_mode }
453 #define MaskVex { OP_VEX, mask_mode }
455 #define MVexVSIBDWpX { OP_M, vex_vsib_d_w_dq_mode }
456 #define MVexVSIBDQWpX { OP_M, vex_vsib_d_w_d_mode }
457 #define MVexVSIBQWpX { OP_M, vex_vsib_q_w_dq_mode }
458 #define MVexVSIBQDWpX { OP_M, vex_vsib_q_w_d_mode }
460 /* Used handle "rep" prefix for string instructions. */
461 #define Xbr { REP_Fixup, eSI_reg }
462 #define Xvr { REP_Fixup, eSI_reg }
463 #define Ybr { REP_Fixup, eDI_reg }
464 #define Yvr { REP_Fixup, eDI_reg }
465 #define Yzr { REP_Fixup, eDI_reg }
466 #define indirDXr { REP_Fixup, indir_dx_reg }
467 #define ALr { REP_Fixup, al_reg }
468 #define eAXr { REP_Fixup, eAX_reg }
470 /* Used handle HLE prefix for lockable instructions. */
471 #define Ebh1 { HLE_Fixup1, b_mode }
472 #define Evh1 { HLE_Fixup1, v_mode }
473 #define Ebh2 { HLE_Fixup2, b_mode }
474 #define Evh2 { HLE_Fixup2, v_mode }
475 #define Ebh3 { HLE_Fixup3, b_mode }
476 #define Evh3 { HLE_Fixup3, v_mode }
478 #define BND { BND_Fixup, 0 }
479 #define NOTRACK { NOTRACK_Fixup, 0 }
481 #define cond_jump_flag { NULL, cond_jump_mode }
482 #define loop_jcxz_flag { NULL, loop_jcxz_mode }
484 /* bits in sizeflag */
485 #define SUFFIX_ALWAYS 4
493 /* byte operand with operand swapped */
495 /* byte operand, sign extend like 'T' suffix */
497 /* operand size depends on prefixes */
499 /* operand size depends on prefixes with operand swapped */
503 /* double word operand */
505 /* double word operand with operand swapped */
507 /* quad word operand */
509 /* quad word operand with operand swapped */
511 /* ten-byte operand */
513 /* 16-byte XMM, 32-byte YMM or 64-byte ZMM operand. In EVEX with
514 broadcast enabled. */
516 /* Similar to x_mode, but with different EVEX mem shifts. */
518 /* Similar to x_mode, but with disabled broadcast. */
520 /* Similar to x_mode, but with operands swapped and disabled broadcast
523 /* 16-byte XMM operand */
525 /* XMM, XMM or YMM register operand, or quad word, xmmword or ymmword
526 memory operand (depending on vector length). Broadcast isn't
529 /* Same as xmmq_mode, but broadcast is allowed. */
530 evex_half_bcst_xmmq_mode
,
531 /* XMM register or byte memory operand */
533 /* XMM register or word memory operand */
535 /* XMM register or double word memory operand */
537 /* XMM register or quad word memory operand */
539 /* XMM register or double/quad word memory operand, depending on
542 /* 16-byte XMM, word, double word or quad word operand. */
544 /* 16-byte XMM, double word, quad word operand or xmm word operand. */
546 /* 32-byte YMM operand */
548 /* quad word, ymmword or zmmword memory operand. */
550 /* 32-byte YMM or 16-byte word operand */
552 /* d_mode in 32bit, q_mode in 64bit mode. */
554 /* pair of v_mode operands */
559 /* operand size depends on REX prefixes. */
561 /* registers like dq_mode, memory like w_mode. */
564 /* 4- or 6-byte pointer operand */
567 /* v_mode for indirect branch opcodes. */
569 /* v_mode for stack-related opcodes. */
571 /* non-quad operand size depends on prefixes */
573 /* 16-byte operand */
575 /* registers like dq_mode, memory like b_mode. */
577 /* registers like d_mode, memory like b_mode. */
579 /* registers like d_mode, memory like w_mode. */
581 /* registers like dq_mode, memory like d_mode. */
583 /* normal vex mode */
585 /* 128bit vex mode */
587 /* 256bit vex mode */
589 /* operand size depends on the VEX.W bit. */
592 /* Similar to vex_w_dq_mode, with VSIB dword indices. */
593 vex_vsib_d_w_dq_mode
,
594 /* Similar to vex_vsib_d_w_dq_mode, with smaller memory. */
596 /* Similar to vex_w_dq_mode, with VSIB qword indices. */
597 vex_vsib_q_w_dq_mode
,
598 /* Similar to vex_vsib_q_w_dq_mode, with smaller memory. */
601 /* scalar, ignore vector length. */
603 /* like b_mode, ignore vector length. */
605 /* like w_mode, ignore vector length. */
607 /* like d_mode, ignore vector length. */
609 /* like d_swap_mode, ignore vector length. */
611 /* like q_mode, ignore vector length. */
613 /* like q_swap_mode, ignore vector length. */
615 /* like vex_mode, ignore vector length. */
617 /* like vex_w_dq_mode, ignore vector length. */
618 vex_scalar_w_dq_mode
,
620 /* Static rounding. */
622 /* Supress all exceptions. */
625 /* Mask register operand. */
627 /* Mask register operand. */
694 #define FLOAT NULL, { { NULL, FLOATCODE } }, 0
696 #define DIS386(T, I) NULL, { { NULL, (T)}, { NULL, (I) } }, 0
697 #define DIS386_PREFIX(T, I, P) NULL, { { NULL, (T)}, { NULL, (I) } }, P
698 #define REG_TABLE(I) DIS386 (USE_REG_TABLE, (I))
699 #define MOD_TABLE(I) DIS386 (USE_MOD_TABLE, (I))
700 #define RM_TABLE(I) DIS386 (USE_RM_TABLE, (I))
701 #define PREFIX_TABLE(I) DIS386 (USE_PREFIX_TABLE, (I))
702 #define X86_64_TABLE(I) DIS386 (USE_X86_64_TABLE, (I))
703 #define THREE_BYTE_TABLE(I) DIS386 (USE_3BYTE_TABLE, (I))
704 #define THREE_BYTE_TABLE_PREFIX(I, P) DIS386_PREFIX (USE_3BYTE_TABLE, (I), P)
705 #define XOP_8F_TABLE(I) DIS386 (USE_XOP_8F_TABLE, (I))
706 #define VEX_C4_TABLE(I) DIS386 (USE_VEX_C4_TABLE, (I))
707 #define VEX_C5_TABLE(I) DIS386 (USE_VEX_C5_TABLE, (I))
708 #define VEX_LEN_TABLE(I) DIS386 (USE_VEX_LEN_TABLE, (I))
709 #define VEX_W_TABLE(I) DIS386 (USE_VEX_W_TABLE, (I))
710 #define EVEX_TABLE(I) DIS386 (USE_EVEX_TABLE, (I))
832 MOD_VEX_0F12_PREFIX_0
,
834 MOD_VEX_0F16_PREFIX_0
,
837 MOD_VEX_W_0_0F41_P_0_LEN_1
,
838 MOD_VEX_W_1_0F41_P_0_LEN_1
,
839 MOD_VEX_W_0_0F41_P_2_LEN_1
,
840 MOD_VEX_W_1_0F41_P_2_LEN_1
,
841 MOD_VEX_W_0_0F42_P_0_LEN_1
,
842 MOD_VEX_W_1_0F42_P_0_LEN_1
,
843 MOD_VEX_W_0_0F42_P_2_LEN_1
,
844 MOD_VEX_W_1_0F42_P_2_LEN_1
,
845 MOD_VEX_W_0_0F44_P_0_LEN_1
,
846 MOD_VEX_W_1_0F44_P_0_LEN_1
,
847 MOD_VEX_W_0_0F44_P_2_LEN_1
,
848 MOD_VEX_W_1_0F44_P_2_LEN_1
,
849 MOD_VEX_W_0_0F45_P_0_LEN_1
,
850 MOD_VEX_W_1_0F45_P_0_LEN_1
,
851 MOD_VEX_W_0_0F45_P_2_LEN_1
,
852 MOD_VEX_W_1_0F45_P_2_LEN_1
,
853 MOD_VEX_W_0_0F46_P_0_LEN_1
,
854 MOD_VEX_W_1_0F46_P_0_LEN_1
,
855 MOD_VEX_W_0_0F46_P_2_LEN_1
,
856 MOD_VEX_W_1_0F46_P_2_LEN_1
,
857 MOD_VEX_W_0_0F47_P_0_LEN_1
,
858 MOD_VEX_W_1_0F47_P_0_LEN_1
,
859 MOD_VEX_W_0_0F47_P_2_LEN_1
,
860 MOD_VEX_W_1_0F47_P_2_LEN_1
,
861 MOD_VEX_W_0_0F4A_P_0_LEN_1
,
862 MOD_VEX_W_1_0F4A_P_0_LEN_1
,
863 MOD_VEX_W_0_0F4A_P_2_LEN_1
,
864 MOD_VEX_W_1_0F4A_P_2_LEN_1
,
865 MOD_VEX_W_0_0F4B_P_0_LEN_1
,
866 MOD_VEX_W_1_0F4B_P_0_LEN_1
,
867 MOD_VEX_W_0_0F4B_P_2_LEN_1
,
879 MOD_VEX_W_0_0F91_P_0_LEN_0
,
880 MOD_VEX_W_1_0F91_P_0_LEN_0
,
881 MOD_VEX_W_0_0F91_P_2_LEN_0
,
882 MOD_VEX_W_1_0F91_P_2_LEN_0
,
883 MOD_VEX_W_0_0F92_P_0_LEN_0
,
884 MOD_VEX_W_0_0F92_P_2_LEN_0
,
885 MOD_VEX_W_0_0F92_P_3_LEN_0
,
886 MOD_VEX_W_1_0F92_P_3_LEN_0
,
887 MOD_VEX_W_0_0F93_P_0_LEN_0
,
888 MOD_VEX_W_0_0F93_P_2_LEN_0
,
889 MOD_VEX_W_0_0F93_P_3_LEN_0
,
890 MOD_VEX_W_1_0F93_P_3_LEN_0
,
891 MOD_VEX_W_0_0F98_P_0_LEN_0
,
892 MOD_VEX_W_1_0F98_P_0_LEN_0
,
893 MOD_VEX_W_0_0F98_P_2_LEN_0
,
894 MOD_VEX_W_1_0F98_P_2_LEN_0
,
895 MOD_VEX_W_0_0F99_P_0_LEN_0
,
896 MOD_VEX_W_1_0F99_P_0_LEN_0
,
897 MOD_VEX_W_0_0F99_P_2_LEN_0
,
898 MOD_VEX_W_1_0F99_P_2_LEN_0
,
901 MOD_VEX_0FD7_PREFIX_2
,
902 MOD_VEX_0FE7_PREFIX_2
,
903 MOD_VEX_0FF0_PREFIX_3
,
904 MOD_VEX_0F381A_PREFIX_2
,
905 MOD_VEX_0F382A_PREFIX_2
,
906 MOD_VEX_0F382C_PREFIX_2
,
907 MOD_VEX_0F382D_PREFIX_2
,
908 MOD_VEX_0F382E_PREFIX_2
,
909 MOD_VEX_0F382F_PREFIX_2
,
910 MOD_VEX_0F385A_PREFIX_2
,
911 MOD_VEX_0F388C_PREFIX_2
,
912 MOD_VEX_0F388E_PREFIX_2
,
913 MOD_VEX_W_0_0F3A30_P_2_LEN_0
,
914 MOD_VEX_W_1_0F3A30_P_2_LEN_0
,
915 MOD_VEX_W_0_0F3A31_P_2_LEN_0
,
916 MOD_VEX_W_1_0F3A31_P_2_LEN_0
,
917 MOD_VEX_W_0_0F3A32_P_2_LEN_0
,
918 MOD_VEX_W_1_0F3A32_P_2_LEN_0
,
919 MOD_VEX_W_0_0F3A33_P_2_LEN_0
,
920 MOD_VEX_W_1_0F3A33_P_2_LEN_0
,
922 MOD_EVEX_0F10_PREFIX_1
,
923 MOD_EVEX_0F10_PREFIX_3
,
924 MOD_EVEX_0F11_PREFIX_1
,
925 MOD_EVEX_0F11_PREFIX_3
,
926 MOD_EVEX_0F12_PREFIX_0
,
927 MOD_EVEX_0F16_PREFIX_0
,
928 MOD_EVEX_0F38C6_REG_1
,
929 MOD_EVEX_0F38C6_REG_2
,
930 MOD_EVEX_0F38C6_REG_5
,
931 MOD_EVEX_0F38C6_REG_6
,
932 MOD_EVEX_0F38C7_REG_1
,
933 MOD_EVEX_0F38C7_REG_2
,
934 MOD_EVEX_0F38C7_REG_5
,
935 MOD_EVEX_0F38C7_REG_6
956 PREFIX_MOD_0_0F01_REG_5
,
957 PREFIX_MOD_3_0F01_REG_5_RM_0
,
958 PREFIX_MOD_3_0F01_REG_5_RM_2
,
1002 PREFIX_MOD_0_0FAE_REG_4
,
1003 PREFIX_MOD_3_0FAE_REG_4
,
1004 PREFIX_MOD_0_0FAE_REG_5
,
1005 PREFIX_MOD_3_0FAE_REG_5
,
1013 PREFIX_MOD_0_0FC7_REG_6
,
1014 PREFIX_MOD_3_0FC7_REG_6
,
1015 PREFIX_MOD_3_0FC7_REG_7
,
1143 PREFIX_VEX_0F71_REG_2
,
1144 PREFIX_VEX_0F71_REG_4
,
1145 PREFIX_VEX_0F71_REG_6
,
1146 PREFIX_VEX_0F72_REG_2
,
1147 PREFIX_VEX_0F72_REG_4
,
1148 PREFIX_VEX_0F72_REG_6
,
1149 PREFIX_VEX_0F73_REG_2
,
1150 PREFIX_VEX_0F73_REG_3
,
1151 PREFIX_VEX_0F73_REG_6
,
1152 PREFIX_VEX_0F73_REG_7
,
1325 PREFIX_VEX_0F38F3_REG_1
,
1326 PREFIX_VEX_0F38F3_REG_2
,
1327 PREFIX_VEX_0F38F3_REG_3
,
1446 PREFIX_EVEX_0F71_REG_2
,
1447 PREFIX_EVEX_0F71_REG_4
,
1448 PREFIX_EVEX_0F71_REG_6
,
1449 PREFIX_EVEX_0F72_REG_0
,
1450 PREFIX_EVEX_0F72_REG_1
,
1451 PREFIX_EVEX_0F72_REG_2
,
1452 PREFIX_EVEX_0F72_REG_4
,
1453 PREFIX_EVEX_0F72_REG_6
,
1454 PREFIX_EVEX_0F73_REG_2
,
1455 PREFIX_EVEX_0F73_REG_3
,
1456 PREFIX_EVEX_0F73_REG_6
,
1457 PREFIX_EVEX_0F73_REG_7
,
1649 PREFIX_EVEX_0F38C6_REG_1
,
1650 PREFIX_EVEX_0F38C6_REG_2
,
1651 PREFIX_EVEX_0F38C6_REG_5
,
1652 PREFIX_EVEX_0F38C6_REG_6
,
1653 PREFIX_EVEX_0F38C7_REG_1
,
1654 PREFIX_EVEX_0F38C7_REG_2
,
1655 PREFIX_EVEX_0F38C7_REG_5
,
1656 PREFIX_EVEX_0F38C7_REG_6
,
1757 THREE_BYTE_0F38
= 0,
1784 VEX_LEN_0F10_P_1
= 0,
1788 VEX_LEN_0F12_P_0_M_0
,
1789 VEX_LEN_0F12_P_0_M_1
,
1792 VEX_LEN_0F16_P_0_M_0
,
1793 VEX_LEN_0F16_P_0_M_1
,
1857 VEX_LEN_0FAE_R_2_M_0
,
1858 VEX_LEN_0FAE_R_3_M_0
,
1867 VEX_LEN_0F381A_P_2_M_0
,
1870 VEX_LEN_0F385A_P_2_M_0
,
1873 VEX_LEN_0F38F3_R_1_P_0
,
1874 VEX_LEN_0F38F3_R_2_P_0
,
1875 VEX_LEN_0F38F3_R_3_P_0
,
1921 VEX_LEN_0FXOP_08_CC
,
1922 VEX_LEN_0FXOP_08_CD
,
1923 VEX_LEN_0FXOP_08_CE
,
1924 VEX_LEN_0FXOP_08_CF
,
1925 VEX_LEN_0FXOP_08_EC
,
1926 VEX_LEN_0FXOP_08_ED
,
1927 VEX_LEN_0FXOP_08_EE
,
1928 VEX_LEN_0FXOP_08_EF
,
1929 VEX_LEN_0FXOP_09_80
,
1963 VEX_W_0F41_P_0_LEN_1
,
1964 VEX_W_0F41_P_2_LEN_1
,
1965 VEX_W_0F42_P_0_LEN_1
,
1966 VEX_W_0F42_P_2_LEN_1
,
1967 VEX_W_0F44_P_0_LEN_0
,
1968 VEX_W_0F44_P_2_LEN_0
,
1969 VEX_W_0F45_P_0_LEN_1
,
1970 VEX_W_0F45_P_2_LEN_1
,
1971 VEX_W_0F46_P_0_LEN_1
,
1972 VEX_W_0F46_P_2_LEN_1
,
1973 VEX_W_0F47_P_0_LEN_1
,
1974 VEX_W_0F47_P_2_LEN_1
,
1975 VEX_W_0F4A_P_0_LEN_1
,
1976 VEX_W_0F4A_P_2_LEN_1
,
1977 VEX_W_0F4B_P_0_LEN_1
,
1978 VEX_W_0F4B_P_2_LEN_1
,
2058 VEX_W_0F90_P_0_LEN_0
,
2059 VEX_W_0F90_P_2_LEN_0
,
2060 VEX_W_0F91_P_0_LEN_0
,
2061 VEX_W_0F91_P_2_LEN_0
,
2062 VEX_W_0F92_P_0_LEN_0
,
2063 VEX_W_0F92_P_2_LEN_0
,
2064 VEX_W_0F92_P_3_LEN_0
,
2065 VEX_W_0F93_P_0_LEN_0
,
2066 VEX_W_0F93_P_2_LEN_0
,
2067 VEX_W_0F93_P_3_LEN_0
,
2068 VEX_W_0F98_P_0_LEN_0
,
2069 VEX_W_0F98_P_2_LEN_0
,
2070 VEX_W_0F99_P_0_LEN_0
,
2071 VEX_W_0F99_P_2_LEN_0
,
2150 VEX_W_0F381A_P_2_M_0
,
2162 VEX_W_0F382A_P_2_M_0
,
2164 VEX_W_0F382C_P_2_M_0
,
2165 VEX_W_0F382D_P_2_M_0
,
2166 VEX_W_0F382E_P_2_M_0
,
2167 VEX_W_0F382F_P_2_M_0
,
2189 VEX_W_0F385A_P_2_M_0
,
2214 VEX_W_0F3A30_P_2_LEN_0
,
2215 VEX_W_0F3A31_P_2_LEN_0
,
2216 VEX_W_0F3A32_P_2_LEN_0
,
2217 VEX_W_0F3A33_P_2_LEN_0
,
2237 EVEX_W_0F10_P_1_M_0
,
2238 EVEX_W_0F10_P_1_M_1
,
2240 EVEX_W_0F10_P_3_M_0
,
2241 EVEX_W_0F10_P_3_M_1
,
2243 EVEX_W_0F11_P_1_M_0
,
2244 EVEX_W_0F11_P_1_M_1
,
2246 EVEX_W_0F11_P_3_M_0
,
2247 EVEX_W_0F11_P_3_M_1
,
2248 EVEX_W_0F12_P_0_M_0
,
2249 EVEX_W_0F12_P_0_M_1
,
2259 EVEX_W_0F16_P_0_M_0
,
2260 EVEX_W_0F16_P_0_M_1
,
2331 EVEX_W_0F72_R_2_P_2
,
2332 EVEX_W_0F72_R_6_P_2
,
2333 EVEX_W_0F73_R_2_P_2
,
2334 EVEX_W_0F73_R_6_P_2
,
2441 EVEX_W_0F38C7_R_1_P_2
,
2442 EVEX_W_0F38C7_R_2_P_2
,
2443 EVEX_W_0F38C7_R_5_P_2
,
2444 EVEX_W_0F38C7_R_6_P_2
,
2485 typedef void (*op_rtn
) (int bytemode
, int sizeflag
);
2494 unsigned int prefix_requirement
;
2497 /* Upper case letters in the instruction names here are macros.
2498 'A' => print 'b' if no register operands or suffix_always is true
2499 'B' => print 'b' if suffix_always is true
2500 'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
2502 'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
2503 suffix_always is true
2504 'E' => print 'e' if 32-bit form of jcxz
2505 'F' => print 'w' or 'l' depending on address size prefix (loop insns)
2506 'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
2507 'H' => print ",pt" or ",pn" branch hint
2508 'I' => honor following macro letter even in Intel mode (implemented only
2509 for some of the macro letters)
2511 'K' => print 'd' or 'q' if rex prefix is present.
2512 'L' => print 'l' if suffix_always is true
2513 'M' => print 'r' if intel_mnemonic is false.
2514 'N' => print 'n' if instruction has no wait "prefix"
2515 'O' => print 'd' or 'o' (or 'q' in Intel mode)
2516 'P' => print 'w', 'l' or 'q' if instruction has an operand size prefix,
2517 or suffix_always is true. print 'q' if rex prefix is present.
2518 'Q' => print 'w', 'l' or 'q' for memory operand or suffix_always
2520 'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
2521 'S' => print 'w', 'l' or 'q' if suffix_always is true
2522 'T' => print 'q' in 64bit mode if instruction has no operand size
2523 prefix and behave as 'P' otherwise
2524 'U' => print 'q' in 64bit mode if instruction has no operand size
2525 prefix and behave as 'Q' otherwise
2526 'V' => print 'q' in 64bit mode if instruction has no operand size
2527 prefix and behave as 'S' otherwise
2528 'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
2529 'X' => print 's', 'd' depending on data16 prefix (for XMM)
2530 'Y' => 'q' if instruction has an REX 64bit overwrite prefix and
2531 suffix_always is true.
2532 'Z' => print 'q' in 64bit mode and behave as 'L' otherwise
2533 '!' => change condition from true to false or from false to true.
2534 '%' => add 1 upper case letter to the macro.
2535 '^' => print 'w' or 'l' depending on operand size prefix or
2536 suffix_always is true (lcall/ljmp).
2537 '@' => print 'q' for Intel64 ISA, 'w' or 'q' for AMD64 ISA depending
2538 on operand size prefix.
2539 '&' => print 'q' in 64bit mode for Intel64 ISA or if instruction
2540 has no operand size prefix for AMD64 ISA, behave as 'P'
2543 2 upper case letter macros:
2544 "XY" => print 'x' or 'y' if suffix_always is true or no register
2545 operands and no broadcast.
2546 "XZ" => print 'x', 'y', or 'z' if suffix_always is true or no
2547 register operands and no broadcast.
2548 "XW" => print 's', 'd' depending on the VEX.W bit (for FMA)
2549 "LQ" => print 'l' ('d' in Intel mode) or 'q' for memory operand
2550 or suffix_always is true
2551 "LB" => print "abs" in 64bit mode and behave as 'B' otherwise
2552 "LS" => print "abs" in 64bit mode and behave as 'S' otherwise
2553 "LV" => print "abs" for 64bit operand and behave as 'S' otherwise
2554 "LW" => print 'd', 'q' depending on the VEX.W bit
2555 "LP" => print 'w' or 'l' ('d' in Intel mode) if instruction has
2556 an operand size prefix, or suffix_always is true. print
2557 'q' if rex prefix is present.
2559 Many of the above letters print nothing in Intel mode. See "putop"
2562 Braces '{' and '}', and vertical bars '|', indicate alternative
2563 mnemonic strings for AT&T and Intel. */
2565 static const struct dis386 dis386
[] = {
2567 { "addB", { Ebh1
, Gb
}, 0 },
2568 { "addS", { Evh1
, Gv
}, 0 },
2569 { "addB", { Gb
, EbS
}, 0 },
2570 { "addS", { Gv
, EvS
}, 0 },
2571 { "addB", { AL
, Ib
}, 0 },
2572 { "addS", { eAX
, Iv
}, 0 },
2573 { X86_64_TABLE (X86_64_06
) },
2574 { X86_64_TABLE (X86_64_07
) },
2576 { "orB", { Ebh1
, Gb
}, 0 },
2577 { "orS", { Evh1
, Gv
}, 0 },
2578 { "orB", { Gb
, EbS
}, 0 },
2579 { "orS", { Gv
, EvS
}, 0 },
2580 { "orB", { AL
, Ib
}, 0 },
2581 { "orS", { eAX
, Iv
}, 0 },
2582 { X86_64_TABLE (X86_64_0D
) },
2583 { Bad_Opcode
}, /* 0x0f extended opcode escape */
2585 { "adcB", { Ebh1
, Gb
}, 0 },
2586 { "adcS", { Evh1
, Gv
}, 0 },
2587 { "adcB", { Gb
, EbS
}, 0 },
2588 { "adcS", { Gv
, EvS
}, 0 },
2589 { "adcB", { AL
, Ib
}, 0 },
2590 { "adcS", { eAX
, Iv
}, 0 },
2591 { X86_64_TABLE (X86_64_16
) },
2592 { X86_64_TABLE (X86_64_17
) },
2594 { "sbbB", { Ebh1
, Gb
}, 0 },
2595 { "sbbS", { Evh1
, Gv
}, 0 },
2596 { "sbbB", { Gb
, EbS
}, 0 },
2597 { "sbbS", { Gv
, EvS
}, 0 },
2598 { "sbbB", { AL
, Ib
}, 0 },
2599 { "sbbS", { eAX
, Iv
}, 0 },
2600 { X86_64_TABLE (X86_64_1E
) },
2601 { X86_64_TABLE (X86_64_1F
) },
2603 { "andB", { Ebh1
, Gb
}, 0 },
2604 { "andS", { Evh1
, Gv
}, 0 },
2605 { "andB", { Gb
, EbS
}, 0 },
2606 { "andS", { Gv
, EvS
}, 0 },
2607 { "andB", { AL
, Ib
}, 0 },
2608 { "andS", { eAX
, Iv
}, 0 },
2609 { Bad_Opcode
}, /* SEG ES prefix */
2610 { X86_64_TABLE (X86_64_27
) },
2612 { "subB", { Ebh1
, Gb
}, 0 },
2613 { "subS", { Evh1
, Gv
}, 0 },
2614 { "subB", { Gb
, EbS
}, 0 },
2615 { "subS", { Gv
, EvS
}, 0 },
2616 { "subB", { AL
, Ib
}, 0 },
2617 { "subS", { eAX
, Iv
}, 0 },
2618 { Bad_Opcode
}, /* SEG CS prefix */
2619 { X86_64_TABLE (X86_64_2F
) },
2621 { "xorB", { Ebh1
, Gb
}, 0 },
2622 { "xorS", { Evh1
, Gv
}, 0 },
2623 { "xorB", { Gb
, EbS
}, 0 },
2624 { "xorS", { Gv
, EvS
}, 0 },
2625 { "xorB", { AL
, Ib
}, 0 },
2626 { "xorS", { eAX
, Iv
}, 0 },
2627 { Bad_Opcode
}, /* SEG SS prefix */
2628 { X86_64_TABLE (X86_64_37
) },
2630 { "cmpB", { Eb
, Gb
}, 0 },
2631 { "cmpS", { Ev
, Gv
}, 0 },
2632 { "cmpB", { Gb
, EbS
}, 0 },
2633 { "cmpS", { Gv
, EvS
}, 0 },
2634 { "cmpB", { AL
, Ib
}, 0 },
2635 { "cmpS", { eAX
, Iv
}, 0 },
2636 { Bad_Opcode
}, /* SEG DS prefix */
2637 { X86_64_TABLE (X86_64_3F
) },
2639 { "inc{S|}", { RMeAX
}, 0 },
2640 { "inc{S|}", { RMeCX
}, 0 },
2641 { "inc{S|}", { RMeDX
}, 0 },
2642 { "inc{S|}", { RMeBX
}, 0 },
2643 { "inc{S|}", { RMeSP
}, 0 },
2644 { "inc{S|}", { RMeBP
}, 0 },
2645 { "inc{S|}", { RMeSI
}, 0 },
2646 { "inc{S|}", { RMeDI
}, 0 },
2648 { "dec{S|}", { RMeAX
}, 0 },
2649 { "dec{S|}", { RMeCX
}, 0 },
2650 { "dec{S|}", { RMeDX
}, 0 },
2651 { "dec{S|}", { RMeBX
}, 0 },
2652 { "dec{S|}", { RMeSP
}, 0 },
2653 { "dec{S|}", { RMeBP
}, 0 },
2654 { "dec{S|}", { RMeSI
}, 0 },
2655 { "dec{S|}", { RMeDI
}, 0 },
2657 { "pushV", { RMrAX
}, 0 },
2658 { "pushV", { RMrCX
}, 0 },
2659 { "pushV", { RMrDX
}, 0 },
2660 { "pushV", { RMrBX
}, 0 },
2661 { "pushV", { RMrSP
}, 0 },
2662 { "pushV", { RMrBP
}, 0 },
2663 { "pushV", { RMrSI
}, 0 },
2664 { "pushV", { RMrDI
}, 0 },
2666 { "popV", { RMrAX
}, 0 },
2667 { "popV", { RMrCX
}, 0 },
2668 { "popV", { RMrDX
}, 0 },
2669 { "popV", { RMrBX
}, 0 },
2670 { "popV", { RMrSP
}, 0 },
2671 { "popV", { RMrBP
}, 0 },
2672 { "popV", { RMrSI
}, 0 },
2673 { "popV", { RMrDI
}, 0 },
2675 { X86_64_TABLE (X86_64_60
) },
2676 { X86_64_TABLE (X86_64_61
) },
2677 { X86_64_TABLE (X86_64_62
) },
2678 { X86_64_TABLE (X86_64_63
) },
2679 { Bad_Opcode
}, /* seg fs */
2680 { Bad_Opcode
}, /* seg gs */
2681 { Bad_Opcode
}, /* op size prefix */
2682 { Bad_Opcode
}, /* adr size prefix */
2684 { "pushT", { sIv
}, 0 },
2685 { "imulS", { Gv
, Ev
, Iv
}, 0 },
2686 { "pushT", { sIbT
}, 0 },
2687 { "imulS", { Gv
, Ev
, sIb
}, 0 },
2688 { "ins{b|}", { Ybr
, indirDX
}, 0 },
2689 { X86_64_TABLE (X86_64_6D
) },
2690 { "outs{b|}", { indirDXr
, Xb
}, 0 },
2691 { X86_64_TABLE (X86_64_6F
) },
2693 { "joH", { Jb
, BND
, cond_jump_flag
}, 0 },
2694 { "jnoH", { Jb
, BND
, cond_jump_flag
}, 0 },
2695 { "jbH", { Jb
, BND
, cond_jump_flag
}, 0 },
2696 { "jaeH", { Jb
, BND
, cond_jump_flag
}, 0 },
2697 { "jeH", { Jb
, BND
, cond_jump_flag
}, 0 },
2698 { "jneH", { Jb
, BND
, cond_jump_flag
}, 0 },
2699 { "jbeH", { Jb
, BND
, cond_jump_flag
}, 0 },
2700 { "jaH", { Jb
, BND
, cond_jump_flag
}, 0 },
2702 { "jsH", { Jb
, BND
, cond_jump_flag
}, 0 },
2703 { "jnsH", { Jb
, BND
, cond_jump_flag
}, 0 },
2704 { "jpH", { Jb
, BND
, cond_jump_flag
}, 0 },
2705 { "jnpH", { Jb
, BND
, cond_jump_flag
}, 0 },
2706 { "jlH", { Jb
, BND
, cond_jump_flag
}, 0 },
2707 { "jgeH", { Jb
, BND
, cond_jump_flag
}, 0 },
2708 { "jleH", { Jb
, BND
, cond_jump_flag
}, 0 },
2709 { "jgH", { Jb
, BND
, cond_jump_flag
}, 0 },
2711 { REG_TABLE (REG_80
) },
2712 { REG_TABLE (REG_81
) },
2713 { X86_64_TABLE (X86_64_82
) },
2714 { REG_TABLE (REG_83
) },
2715 { "testB", { Eb
, Gb
}, 0 },
2716 { "testS", { Ev
, Gv
}, 0 },
2717 { "xchgB", { Ebh2
, Gb
}, 0 },
2718 { "xchgS", { Evh2
, Gv
}, 0 },
2720 { "movB", { Ebh3
, Gb
}, 0 },
2721 { "movS", { Evh3
, Gv
}, 0 },
2722 { "movB", { Gb
, EbS
}, 0 },
2723 { "movS", { Gv
, EvS
}, 0 },
2724 { "movD", { Sv
, Sw
}, 0 },
2725 { MOD_TABLE (MOD_8D
) },
2726 { "movD", { Sw
, Sv
}, 0 },
2727 { REG_TABLE (REG_8F
) },
2729 { PREFIX_TABLE (PREFIX_90
) },
2730 { "xchgS", { RMeCX
, eAX
}, 0 },
2731 { "xchgS", { RMeDX
, eAX
}, 0 },
2732 { "xchgS", { RMeBX
, eAX
}, 0 },
2733 { "xchgS", { RMeSP
, eAX
}, 0 },
2734 { "xchgS", { RMeBP
, eAX
}, 0 },
2735 { "xchgS", { RMeSI
, eAX
}, 0 },
2736 { "xchgS", { RMeDI
, eAX
}, 0 },
2738 { "cW{t|}R", { XX
}, 0 },
2739 { "cR{t|}O", { XX
}, 0 },
2740 { X86_64_TABLE (X86_64_9A
) },
2741 { Bad_Opcode
}, /* fwait */
2742 { "pushfT", { XX
}, 0 },
2743 { "popfT", { XX
}, 0 },
2744 { "sahf", { XX
}, 0 },
2745 { "lahf", { XX
}, 0 },
2747 { "mov%LB", { AL
, Ob
}, 0 },
2748 { "mov%LS", { eAX
, Ov
}, 0 },
2749 { "mov%LB", { Ob
, AL
}, 0 },
2750 { "mov%LS", { Ov
, eAX
}, 0 },
2751 { "movs{b|}", { Ybr
, Xb
}, 0 },
2752 { "movs{R|}", { Yvr
, Xv
}, 0 },
2753 { "cmps{b|}", { Xb
, Yb
}, 0 },
2754 { "cmps{R|}", { Xv
, Yv
}, 0 },
2756 { "testB", { AL
, Ib
}, 0 },
2757 { "testS", { eAX
, Iv
}, 0 },
2758 { "stosB", { Ybr
, AL
}, 0 },
2759 { "stosS", { Yvr
, eAX
}, 0 },
2760 { "lodsB", { ALr
, Xb
}, 0 },
2761 { "lodsS", { eAXr
, Xv
}, 0 },
2762 { "scasB", { AL
, Yb
}, 0 },
2763 { "scasS", { eAX
, Yv
}, 0 },
2765 { "movB", { RMAL
, Ib
}, 0 },
2766 { "movB", { RMCL
, Ib
}, 0 },
2767 { "movB", { RMDL
, Ib
}, 0 },
2768 { "movB", { RMBL
, Ib
}, 0 },
2769 { "movB", { RMAH
, Ib
}, 0 },
2770 { "movB", { RMCH
, Ib
}, 0 },
2771 { "movB", { RMDH
, Ib
}, 0 },
2772 { "movB", { RMBH
, Ib
}, 0 },
2774 { "mov%LV", { RMeAX
, Iv64
}, 0 },
2775 { "mov%LV", { RMeCX
, Iv64
}, 0 },
2776 { "mov%LV", { RMeDX
, Iv64
}, 0 },
2777 { "mov%LV", { RMeBX
, Iv64
}, 0 },
2778 { "mov%LV", { RMeSP
, Iv64
}, 0 },
2779 { "mov%LV", { RMeBP
, Iv64
}, 0 },
2780 { "mov%LV", { RMeSI
, Iv64
}, 0 },
2781 { "mov%LV", { RMeDI
, Iv64
}, 0 },
2783 { REG_TABLE (REG_C0
) },
2784 { REG_TABLE (REG_C1
) },
2785 { "retT", { Iw
, BND
}, 0 },
2786 { "retT", { BND
}, 0 },
2787 { X86_64_TABLE (X86_64_C4
) },
2788 { X86_64_TABLE (X86_64_C5
) },
2789 { REG_TABLE (REG_C6
) },
2790 { REG_TABLE (REG_C7
) },
2792 { "enterT", { Iw
, Ib
}, 0 },
2793 { "leaveT", { XX
}, 0 },
2794 { "Jret{|f}P", { Iw
}, 0 },
2795 { "Jret{|f}P", { XX
}, 0 },
2796 { "int3", { XX
}, 0 },
2797 { "int", { Ib
}, 0 },
2798 { X86_64_TABLE (X86_64_CE
) },
2799 { "iret%LP", { XX
}, 0 },
2801 { REG_TABLE (REG_D0
) },
2802 { REG_TABLE (REG_D1
) },
2803 { REG_TABLE (REG_D2
) },
2804 { REG_TABLE (REG_D3
) },
2805 { X86_64_TABLE (X86_64_D4
) },
2806 { X86_64_TABLE (X86_64_D5
) },
2808 { "xlat", { DSBX
}, 0 },
2819 { "loopneFH", { Jb
, XX
, loop_jcxz_flag
}, 0 },
2820 { "loopeFH", { Jb
, XX
, loop_jcxz_flag
}, 0 },
2821 { "loopFH", { Jb
, XX
, loop_jcxz_flag
}, 0 },
2822 { "jEcxzH", { Jb
, XX
, loop_jcxz_flag
}, 0 },
2823 { "inB", { AL
, Ib
}, 0 },
2824 { "inG", { zAX
, Ib
}, 0 },
2825 { "outB", { Ib
, AL
}, 0 },
2826 { "outG", { Ib
, zAX
}, 0 },
2828 { X86_64_TABLE (X86_64_E8
) },
2829 { X86_64_TABLE (X86_64_E9
) },
2830 { X86_64_TABLE (X86_64_EA
) },
2831 { "jmp", { Jb
, BND
}, 0 },
2832 { "inB", { AL
, indirDX
}, 0 },
2833 { "inG", { zAX
, indirDX
}, 0 },
2834 { "outB", { indirDX
, AL
}, 0 },
2835 { "outG", { indirDX
, zAX
}, 0 },
2837 { Bad_Opcode
}, /* lock prefix */
2838 { "icebp", { XX
}, 0 },
2839 { Bad_Opcode
}, /* repne */
2840 { Bad_Opcode
}, /* repz */
2841 { "hlt", { XX
}, 0 },
2842 { "cmc", { XX
}, 0 },
2843 { REG_TABLE (REG_F6
) },
2844 { REG_TABLE (REG_F7
) },
2846 { "clc", { XX
}, 0 },
2847 { "stc", { XX
}, 0 },
2848 { "cli", { XX
}, 0 },
2849 { "sti", { XX
}, 0 },
2850 { "cld", { XX
}, 0 },
2851 { "std", { XX
}, 0 },
2852 { REG_TABLE (REG_FE
) },
2853 { REG_TABLE (REG_FF
) },
2856 static const struct dis386 dis386_twobyte
[] = {
2858 { REG_TABLE (REG_0F00
) },
2859 { REG_TABLE (REG_0F01
) },
2860 { "larS", { Gv
, Ew
}, 0 },
2861 { "lslS", { Gv
, Ew
}, 0 },
2863 { "syscall", { XX
}, 0 },
2864 { "clts", { XX
}, 0 },
2865 { "sysret%LP", { XX
}, 0 },
2867 { "invd", { XX
}, 0 },
2868 { "wbinvd", { XX
}, 0 },
2870 { "ud2", { XX
}, 0 },
2872 { REG_TABLE (REG_0F0D
) },
2873 { "femms", { XX
}, 0 },
2874 { "", { MX
, EM
, OPSUF
}, 0 }, /* See OP_3DNowSuffix. */
2876 { PREFIX_TABLE (PREFIX_0F10
) },
2877 { PREFIX_TABLE (PREFIX_0F11
) },
2878 { PREFIX_TABLE (PREFIX_0F12
) },
2879 { MOD_TABLE (MOD_0F13
) },
2880 { "unpcklpX", { XM
, EXx
}, PREFIX_OPCODE
},
2881 { "unpckhpX", { XM
, EXx
}, PREFIX_OPCODE
},
2882 { PREFIX_TABLE (PREFIX_0F16
) },
2883 { MOD_TABLE (MOD_0F17
) },
2885 { REG_TABLE (REG_0F18
) },
2886 { "nopQ", { Ev
}, 0 },
2887 { PREFIX_TABLE (PREFIX_0F1A
) },
2888 { PREFIX_TABLE (PREFIX_0F1B
) },
2889 { "nopQ", { Ev
}, 0 },
2890 { "nopQ", { Ev
}, 0 },
2891 { PREFIX_TABLE (PREFIX_0F1E
) },
2892 { "nopQ", { Ev
}, 0 },
2894 { "movZ", { Rm
, Cm
}, 0 },
2895 { "movZ", { Rm
, Dm
}, 0 },
2896 { "movZ", { Cm
, Rm
}, 0 },
2897 { "movZ", { Dm
, Rm
}, 0 },
2898 { MOD_TABLE (MOD_0F24
) },
2900 { MOD_TABLE (MOD_0F26
) },
2903 { "movapX", { XM
, EXx
}, PREFIX_OPCODE
},
2904 { "movapX", { EXxS
, XM
}, PREFIX_OPCODE
},
2905 { PREFIX_TABLE (PREFIX_0F2A
) },
2906 { PREFIX_TABLE (PREFIX_0F2B
) },
2907 { PREFIX_TABLE (PREFIX_0F2C
) },
2908 { PREFIX_TABLE (PREFIX_0F2D
) },
2909 { PREFIX_TABLE (PREFIX_0F2E
) },
2910 { PREFIX_TABLE (PREFIX_0F2F
) },
2912 { "wrmsr", { XX
}, 0 },
2913 { "rdtsc", { XX
}, 0 },
2914 { "rdmsr", { XX
}, 0 },
2915 { "rdpmc", { XX
}, 0 },
2916 { "sysenter", { XX
}, 0 },
2917 { "sysexit", { XX
}, 0 },
2919 { "getsec", { XX
}, 0 },
2921 { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F38
, PREFIX_OPCODE
) },
2923 { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F3A
, PREFIX_OPCODE
) },
2930 { "cmovoS", { Gv
, Ev
}, 0 },
2931 { "cmovnoS", { Gv
, Ev
}, 0 },
2932 { "cmovbS", { Gv
, Ev
}, 0 },
2933 { "cmovaeS", { Gv
, Ev
}, 0 },
2934 { "cmoveS", { Gv
, Ev
}, 0 },
2935 { "cmovneS", { Gv
, Ev
}, 0 },
2936 { "cmovbeS", { Gv
, Ev
}, 0 },
2937 { "cmovaS", { Gv
, Ev
}, 0 },
2939 { "cmovsS", { Gv
, Ev
}, 0 },
2940 { "cmovnsS", { Gv
, Ev
}, 0 },
2941 { "cmovpS", { Gv
, Ev
}, 0 },
2942 { "cmovnpS", { Gv
, Ev
}, 0 },
2943 { "cmovlS", { Gv
, Ev
}, 0 },
2944 { "cmovgeS", { Gv
, Ev
}, 0 },
2945 { "cmovleS", { Gv
, Ev
}, 0 },
2946 { "cmovgS", { Gv
, Ev
}, 0 },
2948 { MOD_TABLE (MOD_0F51
) },
2949 { PREFIX_TABLE (PREFIX_0F51
) },
2950 { PREFIX_TABLE (PREFIX_0F52
) },
2951 { PREFIX_TABLE (PREFIX_0F53
) },
2952 { "andpX", { XM
, EXx
}, PREFIX_OPCODE
},
2953 { "andnpX", { XM
, EXx
}, PREFIX_OPCODE
},
2954 { "orpX", { XM
, EXx
}, PREFIX_OPCODE
},
2955 { "xorpX", { XM
, EXx
}, PREFIX_OPCODE
},
2957 { PREFIX_TABLE (PREFIX_0F58
) },
2958 { PREFIX_TABLE (PREFIX_0F59
) },
2959 { PREFIX_TABLE (PREFIX_0F5A
) },
2960 { PREFIX_TABLE (PREFIX_0F5B
) },
2961 { PREFIX_TABLE (PREFIX_0F5C
) },
2962 { PREFIX_TABLE (PREFIX_0F5D
) },
2963 { PREFIX_TABLE (PREFIX_0F5E
) },
2964 { PREFIX_TABLE (PREFIX_0F5F
) },
2966 { PREFIX_TABLE (PREFIX_0F60
) },
2967 { PREFIX_TABLE (PREFIX_0F61
) },
2968 { PREFIX_TABLE (PREFIX_0F62
) },
2969 { "packsswb", { MX
, EM
}, PREFIX_OPCODE
},
2970 { "pcmpgtb", { MX
, EM
}, PREFIX_OPCODE
},
2971 { "pcmpgtw", { MX
, EM
}, PREFIX_OPCODE
},
2972 { "pcmpgtd", { MX
, EM
}, PREFIX_OPCODE
},
2973 { "packuswb", { MX
, EM
}, PREFIX_OPCODE
},
2975 { "punpckhbw", { MX
, EM
}, PREFIX_OPCODE
},
2976 { "punpckhwd", { MX
, EM
}, PREFIX_OPCODE
},
2977 { "punpckhdq", { MX
, EM
}, PREFIX_OPCODE
},
2978 { "packssdw", { MX
, EM
}, PREFIX_OPCODE
},
2979 { PREFIX_TABLE (PREFIX_0F6C
) },
2980 { PREFIX_TABLE (PREFIX_0F6D
) },
2981 { "movK", { MX
, Edq
}, PREFIX_OPCODE
},
2982 { PREFIX_TABLE (PREFIX_0F6F
) },
2984 { PREFIX_TABLE (PREFIX_0F70
) },
2985 { REG_TABLE (REG_0F71
) },
2986 { REG_TABLE (REG_0F72
) },
2987 { REG_TABLE (REG_0F73
) },
2988 { "pcmpeqb", { MX
, EM
}, PREFIX_OPCODE
},
2989 { "pcmpeqw", { MX
, EM
}, PREFIX_OPCODE
},
2990 { "pcmpeqd", { MX
, EM
}, PREFIX_OPCODE
},
2991 { "emms", { XX
}, PREFIX_OPCODE
},
2993 { PREFIX_TABLE (PREFIX_0F78
) },
2994 { PREFIX_TABLE (PREFIX_0F79
) },
2997 { PREFIX_TABLE (PREFIX_0F7C
) },
2998 { PREFIX_TABLE (PREFIX_0F7D
) },
2999 { PREFIX_TABLE (PREFIX_0F7E
) },
3000 { PREFIX_TABLE (PREFIX_0F7F
) },
3002 { "joH", { Jv
, BND
, cond_jump_flag
}, 0 },
3003 { "jnoH", { Jv
, BND
, cond_jump_flag
}, 0 },
3004 { "jbH", { Jv
, BND
, cond_jump_flag
}, 0 },
3005 { "jaeH", { Jv
, BND
, cond_jump_flag
}, 0 },
3006 { "jeH", { Jv
, BND
, cond_jump_flag
}, 0 },
3007 { "jneH", { Jv
, BND
, cond_jump_flag
}, 0 },
3008 { "jbeH", { Jv
, BND
, cond_jump_flag
}, 0 },
3009 { "jaH", { Jv
, BND
, cond_jump_flag
}, 0 },
3011 { "jsH", { Jv
, BND
, cond_jump_flag
}, 0 },
3012 { "jnsH", { Jv
, BND
, cond_jump_flag
}, 0 },
3013 { "jpH", { Jv
, BND
, cond_jump_flag
}, 0 },
3014 { "jnpH", { Jv
, BND
, cond_jump_flag
}, 0 },
3015 { "jlH", { Jv
, BND
, cond_jump_flag
}, 0 },
3016 { "jgeH", { Jv
, BND
, cond_jump_flag
}, 0 },
3017 { "jleH", { Jv
, BND
, cond_jump_flag
}, 0 },
3018 { "jgH", { Jv
, BND
, cond_jump_flag
}, 0 },
3020 { "seto", { Eb
}, 0 },
3021 { "setno", { Eb
}, 0 },
3022 { "setb", { Eb
}, 0 },
3023 { "setae", { Eb
}, 0 },
3024 { "sete", { Eb
}, 0 },
3025 { "setne", { Eb
}, 0 },
3026 { "setbe", { Eb
}, 0 },
3027 { "seta", { Eb
}, 0 },
3029 { "sets", { Eb
}, 0 },
3030 { "setns", { Eb
}, 0 },
3031 { "setp", { Eb
}, 0 },
3032 { "setnp", { Eb
}, 0 },
3033 { "setl", { Eb
}, 0 },
3034 { "setge", { Eb
}, 0 },
3035 { "setle", { Eb
}, 0 },
3036 { "setg", { Eb
}, 0 },
3038 { "pushT", { fs
}, 0 },
3039 { "popT", { fs
}, 0 },
3040 { "cpuid", { XX
}, 0 },
3041 { "btS", { Ev
, Gv
}, 0 },
3042 { "shldS", { Ev
, Gv
, Ib
}, 0 },
3043 { "shldS", { Ev
, Gv
, CL
}, 0 },
3044 { REG_TABLE (REG_0FA6
) },
3045 { REG_TABLE (REG_0FA7
) },
3047 { "pushT", { gs
}, 0 },
3048 { "popT", { gs
}, 0 },
3049 { "rsm", { XX
}, 0 },
3050 { "btsS", { Evh1
, Gv
}, 0 },
3051 { "shrdS", { Ev
, Gv
, Ib
}, 0 },
3052 { "shrdS", { Ev
, Gv
, CL
}, 0 },
3053 { REG_TABLE (REG_0FAE
) },
3054 { "imulS", { Gv
, Ev
}, 0 },
3056 { "cmpxchgB", { Ebh1
, Gb
}, 0 },
3057 { "cmpxchgS", { Evh1
, Gv
}, 0 },
3058 { MOD_TABLE (MOD_0FB2
) },
3059 { "btrS", { Evh1
, Gv
}, 0 },
3060 { MOD_TABLE (MOD_0FB4
) },
3061 { MOD_TABLE (MOD_0FB5
) },
3062 { "movz{bR|x}", { Gv
, Eb
}, 0 },
3063 { "movz{wR|x}", { Gv
, Ew
}, 0 }, /* yes, there really is movzww ! */
3065 { PREFIX_TABLE (PREFIX_0FB8
) },
3066 { "ud1", { XX
}, 0 },
3067 { REG_TABLE (REG_0FBA
) },
3068 { "btcS", { Evh1
, Gv
}, 0 },
3069 { PREFIX_TABLE (PREFIX_0FBC
) },
3070 { PREFIX_TABLE (PREFIX_0FBD
) },
3071 { "movs{bR|x}", { Gv
, Eb
}, 0 },
3072 { "movs{wR|x}", { Gv
, Ew
}, 0 }, /* yes, there really is movsww ! */
3074 { "xaddB", { Ebh1
, Gb
}, 0 },
3075 { "xaddS", { Evh1
, Gv
}, 0 },
3076 { PREFIX_TABLE (PREFIX_0FC2
) },
3077 { MOD_TABLE (MOD_0FC3
) },
3078 { "pinsrw", { MX
, Edqw
, Ib
}, PREFIX_OPCODE
},
3079 { "pextrw", { Gdq
, MS
, Ib
}, PREFIX_OPCODE
},
3080 { "shufpX", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
3081 { REG_TABLE (REG_0FC7
) },
3083 { "bswap", { RMeAX
}, 0 },
3084 { "bswap", { RMeCX
}, 0 },
3085 { "bswap", { RMeDX
}, 0 },
3086 { "bswap", { RMeBX
}, 0 },
3087 { "bswap", { RMeSP
}, 0 },
3088 { "bswap", { RMeBP
}, 0 },
3089 { "bswap", { RMeSI
}, 0 },
3090 { "bswap", { RMeDI
}, 0 },
3092 { PREFIX_TABLE (PREFIX_0FD0
) },
3093 { "psrlw", { MX
, EM
}, PREFIX_OPCODE
},
3094 { "psrld", { MX
, EM
}, PREFIX_OPCODE
},
3095 { "psrlq", { MX
, EM
}, PREFIX_OPCODE
},
3096 { "paddq", { MX
, EM
}, PREFIX_OPCODE
},
3097 { "pmullw", { MX
, EM
}, PREFIX_OPCODE
},
3098 { PREFIX_TABLE (PREFIX_0FD6
) },
3099 { MOD_TABLE (MOD_0FD7
) },
3101 { "psubusb", { MX
, EM
}, PREFIX_OPCODE
},
3102 { "psubusw", { MX
, EM
}, PREFIX_OPCODE
},
3103 { "pminub", { MX
, EM
}, PREFIX_OPCODE
},
3104 { "pand", { MX
, EM
}, PREFIX_OPCODE
},
3105 { "paddusb", { MX
, EM
}, PREFIX_OPCODE
},
3106 { "paddusw", { MX
, EM
}, PREFIX_OPCODE
},
3107 { "pmaxub", { MX
, EM
}, PREFIX_OPCODE
},
3108 { "pandn", { MX
, EM
}, PREFIX_OPCODE
},
3110 { "pavgb", { MX
, EM
}, PREFIX_OPCODE
},
3111 { "psraw", { MX
, EM
}, PREFIX_OPCODE
},
3112 { "psrad", { MX
, EM
}, PREFIX_OPCODE
},
3113 { "pavgw", { MX
, EM
}, PREFIX_OPCODE
},
3114 { "pmulhuw", { MX
, EM
}, PREFIX_OPCODE
},
3115 { "pmulhw", { MX
, EM
}, PREFIX_OPCODE
},
3116 { PREFIX_TABLE (PREFIX_0FE6
) },
3117 { PREFIX_TABLE (PREFIX_0FE7
) },
3119 { "psubsb", { MX
, EM
}, PREFIX_OPCODE
},
3120 { "psubsw", { MX
, EM
}, PREFIX_OPCODE
},
3121 { "pminsw", { MX
, EM
}, PREFIX_OPCODE
},
3122 { "por", { MX
, EM
}, PREFIX_OPCODE
},
3123 { "paddsb", { MX
, EM
}, PREFIX_OPCODE
},
3124 { "paddsw", { MX
, EM
}, PREFIX_OPCODE
},
3125 { "pmaxsw", { MX
, EM
}, PREFIX_OPCODE
},
3126 { "pxor", { MX
, EM
}, PREFIX_OPCODE
},
3128 { PREFIX_TABLE (PREFIX_0FF0
) },
3129 { "psllw", { MX
, EM
}, PREFIX_OPCODE
},
3130 { "pslld", { MX
, EM
}, PREFIX_OPCODE
},
3131 { "psllq", { MX
, EM
}, PREFIX_OPCODE
},
3132 { "pmuludq", { MX
, EM
}, PREFIX_OPCODE
},
3133 { "pmaddwd", { MX
, EM
}, PREFIX_OPCODE
},
3134 { "psadbw", { MX
, EM
}, PREFIX_OPCODE
},
3135 { PREFIX_TABLE (PREFIX_0FF7
) },
3137 { "psubb", { MX
, EM
}, PREFIX_OPCODE
},
3138 { "psubw", { MX
, EM
}, PREFIX_OPCODE
},
3139 { "psubd", { MX
, EM
}, PREFIX_OPCODE
},
3140 { "psubq", { MX
, EM
}, PREFIX_OPCODE
},
3141 { "paddb", { MX
, EM
}, PREFIX_OPCODE
},
3142 { "paddw", { MX
, EM
}, PREFIX_OPCODE
},
3143 { "paddd", { MX
, EM
}, PREFIX_OPCODE
},
3147 static const unsigned char onebyte_has_modrm
[256] = {
3148 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
3149 /* ------------------------------- */
3150 /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
3151 /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
3152 /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
3153 /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
3154 /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
3155 /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
3156 /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
3157 /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
3158 /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
3159 /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
3160 /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
3161 /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
3162 /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
3163 /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
3164 /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
3165 /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1 /* f0 */
3166 /* ------------------------------- */
3167 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
3170 static const unsigned char twobyte_has_modrm
[256] = {
3171 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
3172 /* ------------------------------- */
3173 /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
3174 /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
3175 /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
3176 /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
3177 /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
3178 /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
3179 /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
3180 /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
3181 /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
3182 /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
3183 /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
3184 /* b0 */ 1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1, /* bf */
3185 /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
3186 /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
3187 /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
3188 /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0 /* ff */
3189 /* ------------------------------- */
3190 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
3193 static char obuf
[100];
3195 static char *mnemonicendp
;
3196 static char scratchbuf
[100];
3197 static unsigned char *start_codep
;
3198 static unsigned char *insn_codep
;
3199 static unsigned char *codep
;
3200 static unsigned char *end_codep
;
3201 static int last_lock_prefix
;
3202 static int last_repz_prefix
;
3203 static int last_repnz_prefix
;
3204 static int last_data_prefix
;
3205 static int last_addr_prefix
;
3206 static int last_rex_prefix
;
3207 static int last_seg_prefix
;
3208 static int fwait_prefix
;
3209 /* The active segment register prefix. */
3210 static int active_seg_prefix
;
3211 #define MAX_CODE_LENGTH 15
3212 /* We can up to 14 prefixes since the maximum instruction length is
3214 static int all_prefixes
[MAX_CODE_LENGTH
- 1];
3215 static disassemble_info
*the_info
;
3223 static unsigned char need_modrm
;
3233 int register_specifier
;
3240 int mask_register_specifier
;
3246 static unsigned char need_vex
;
3247 static unsigned char need_vex_reg
;
3248 static unsigned char vex_w_done
;
3256 /* If we are accessing mod/rm/reg without need_modrm set, then the
3257 values are stale. Hitting this abort likely indicates that you
3258 need to update onebyte_has_modrm or twobyte_has_modrm. */
3259 #define MODRM_CHECK if (!need_modrm) abort ()
3261 static const char **names64
;
3262 static const char **names32
;
3263 static const char **names16
;
3264 static const char **names8
;
3265 static const char **names8rex
;
3266 static const char **names_seg
;
3267 static const char *index64
;
3268 static const char *index32
;
3269 static const char **index16
;
3270 static const char **names_bnd
;
3272 static const char *intel_names64
[] = {
3273 "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
3274 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
3276 static const char *intel_names32
[] = {
3277 "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
3278 "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
3280 static const char *intel_names16
[] = {
3281 "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
3282 "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
3284 static const char *intel_names8
[] = {
3285 "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
3287 static const char *intel_names8rex
[] = {
3288 "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
3289 "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
3291 static const char *intel_names_seg
[] = {
3292 "es", "cs", "ss", "ds", "fs", "gs", "?", "?",
3294 static const char *intel_index64
= "riz";
3295 static const char *intel_index32
= "eiz";
3296 static const char *intel_index16
[] = {
3297 "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
3300 static const char *att_names64
[] = {
3301 "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
3302 "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
3304 static const char *att_names32
[] = {
3305 "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
3306 "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
3308 static const char *att_names16
[] = {
3309 "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
3310 "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
3312 static const char *att_names8
[] = {
3313 "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
3315 static const char *att_names8rex
[] = {
3316 "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
3317 "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
3319 static const char *att_names_seg
[] = {
3320 "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
3322 static const char *att_index64
= "%riz";
3323 static const char *att_index32
= "%eiz";
3324 static const char *att_index16
[] = {
3325 "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
3328 static const char **names_mm
;
3329 static const char *intel_names_mm
[] = {
3330 "mm0", "mm1", "mm2", "mm3",
3331 "mm4", "mm5", "mm6", "mm7"
3333 static const char *att_names_mm
[] = {
3334 "%mm0", "%mm1", "%mm2", "%mm3",
3335 "%mm4", "%mm5", "%mm6", "%mm7"
3338 static const char *intel_names_bnd
[] = {
3339 "bnd0", "bnd1", "bnd2", "bnd3"
3342 static const char *att_names_bnd
[] = {
3343 "%bnd0", "%bnd1", "%bnd2", "%bnd3"
3346 static const char **names_xmm
;
3347 static const char *intel_names_xmm
[] = {
3348 "xmm0", "xmm1", "xmm2", "xmm3",
3349 "xmm4", "xmm5", "xmm6", "xmm7",
3350 "xmm8", "xmm9", "xmm10", "xmm11",
3351 "xmm12", "xmm13", "xmm14", "xmm15",
3352 "xmm16", "xmm17", "xmm18", "xmm19",
3353 "xmm20", "xmm21", "xmm22", "xmm23",
3354 "xmm24", "xmm25", "xmm26", "xmm27",
3355 "xmm28", "xmm29", "xmm30", "xmm31"
3357 static const char *att_names_xmm
[] = {
3358 "%xmm0", "%xmm1", "%xmm2", "%xmm3",
3359 "%xmm4", "%xmm5", "%xmm6", "%xmm7",
3360 "%xmm8", "%xmm9", "%xmm10", "%xmm11",
3361 "%xmm12", "%xmm13", "%xmm14", "%xmm15",
3362 "%xmm16", "%xmm17", "%xmm18", "%xmm19",
3363 "%xmm20", "%xmm21", "%xmm22", "%xmm23",
3364 "%xmm24", "%xmm25", "%xmm26", "%xmm27",
3365 "%xmm28", "%xmm29", "%xmm30", "%xmm31"
3368 static const char **names_ymm
;
3369 static const char *intel_names_ymm
[] = {
3370 "ymm0", "ymm1", "ymm2", "ymm3",
3371 "ymm4", "ymm5", "ymm6", "ymm7",
3372 "ymm8", "ymm9", "ymm10", "ymm11",
3373 "ymm12", "ymm13", "ymm14", "ymm15",
3374 "ymm16", "ymm17", "ymm18", "ymm19",
3375 "ymm20", "ymm21", "ymm22", "ymm23",
3376 "ymm24", "ymm25", "ymm26", "ymm27",
3377 "ymm28", "ymm29", "ymm30", "ymm31"
3379 static const char *att_names_ymm
[] = {
3380 "%ymm0", "%ymm1", "%ymm2", "%ymm3",
3381 "%ymm4", "%ymm5", "%ymm6", "%ymm7",
3382 "%ymm8", "%ymm9", "%ymm10", "%ymm11",
3383 "%ymm12", "%ymm13", "%ymm14", "%ymm15",
3384 "%ymm16", "%ymm17", "%ymm18", "%ymm19",
3385 "%ymm20", "%ymm21", "%ymm22", "%ymm23",
3386 "%ymm24", "%ymm25", "%ymm26", "%ymm27",
3387 "%ymm28", "%ymm29", "%ymm30", "%ymm31"
3390 static const char **names_zmm
;
3391 static const char *intel_names_zmm
[] = {
3392 "zmm0", "zmm1", "zmm2", "zmm3",
3393 "zmm4", "zmm5", "zmm6", "zmm7",
3394 "zmm8", "zmm9", "zmm10", "zmm11",
3395 "zmm12", "zmm13", "zmm14", "zmm15",
3396 "zmm16", "zmm17", "zmm18", "zmm19",
3397 "zmm20", "zmm21", "zmm22", "zmm23",
3398 "zmm24", "zmm25", "zmm26", "zmm27",
3399 "zmm28", "zmm29", "zmm30", "zmm31"
3401 static const char *att_names_zmm
[] = {
3402 "%zmm0", "%zmm1", "%zmm2", "%zmm3",
3403 "%zmm4", "%zmm5", "%zmm6", "%zmm7",
3404 "%zmm8", "%zmm9", "%zmm10", "%zmm11",
3405 "%zmm12", "%zmm13", "%zmm14", "%zmm15",
3406 "%zmm16", "%zmm17", "%zmm18", "%zmm19",
3407 "%zmm20", "%zmm21", "%zmm22", "%zmm23",
3408 "%zmm24", "%zmm25", "%zmm26", "%zmm27",
3409 "%zmm28", "%zmm29", "%zmm30", "%zmm31"
3412 static const char **names_mask
;
3413 static const char *intel_names_mask
[] = {
3414 "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7"
3416 static const char *att_names_mask
[] = {
3417 "%k0", "%k1", "%k2", "%k3", "%k4", "%k5", "%k6", "%k7"
3420 static const char *names_rounding
[] =
3428 static const struct dis386 reg_table
[][8] = {
3431 { "addA", { Ebh1
, Ib
}, 0 },
3432 { "orA", { Ebh1
, Ib
}, 0 },
3433 { "adcA", { Ebh1
, Ib
}, 0 },
3434 { "sbbA", { Ebh1
, Ib
}, 0 },
3435 { "andA", { Ebh1
, Ib
}, 0 },
3436 { "subA", { Ebh1
, Ib
}, 0 },
3437 { "xorA", { Ebh1
, Ib
}, 0 },
3438 { "cmpA", { Eb
, Ib
}, 0 },
3442 { "addQ", { Evh1
, Iv
}, 0 },
3443 { "orQ", { Evh1
, Iv
}, 0 },
3444 { "adcQ", { Evh1
, Iv
}, 0 },
3445 { "sbbQ", { Evh1
, Iv
}, 0 },
3446 { "andQ", { Evh1
, Iv
}, 0 },
3447 { "subQ", { Evh1
, Iv
}, 0 },
3448 { "xorQ", { Evh1
, Iv
}, 0 },
3449 { "cmpQ", { Ev
, Iv
}, 0 },
3453 { "addQ", { Evh1
, sIb
}, 0 },
3454 { "orQ", { Evh1
, sIb
}, 0 },
3455 { "adcQ", { Evh1
, sIb
}, 0 },
3456 { "sbbQ", { Evh1
, sIb
}, 0 },
3457 { "andQ", { Evh1
, sIb
}, 0 },
3458 { "subQ", { Evh1
, sIb
}, 0 },
3459 { "xorQ", { Evh1
, sIb
}, 0 },
3460 { "cmpQ", { Ev
, sIb
}, 0 },
3464 { "popU", { stackEv
}, 0 },
3465 { XOP_8F_TABLE (XOP_09
) },
3469 { XOP_8F_TABLE (XOP_09
) },
3473 { "rolA", { Eb
, Ib
}, 0 },
3474 { "rorA", { Eb
, Ib
}, 0 },
3475 { "rclA", { Eb
, Ib
}, 0 },
3476 { "rcrA", { Eb
, Ib
}, 0 },
3477 { "shlA", { Eb
, Ib
}, 0 },
3478 { "shrA", { Eb
, Ib
}, 0 },
3479 { "shlA", { Eb
, Ib
}, 0 },
3480 { "sarA", { Eb
, Ib
}, 0 },
3484 { "rolQ", { Ev
, Ib
}, 0 },
3485 { "rorQ", { Ev
, Ib
}, 0 },
3486 { "rclQ", { Ev
, Ib
}, 0 },
3487 { "rcrQ", { Ev
, Ib
}, 0 },
3488 { "shlQ", { Ev
, Ib
}, 0 },
3489 { "shrQ", { Ev
, Ib
}, 0 },
3490 { "shlQ", { Ev
, Ib
}, 0 },
3491 { "sarQ", { Ev
, Ib
}, 0 },
3495 { "movA", { Ebh3
, Ib
}, 0 },
3502 { MOD_TABLE (MOD_C6_REG_7
) },
3506 { "movQ", { Evh3
, Iv
}, 0 },
3513 { MOD_TABLE (MOD_C7_REG_7
) },
3517 { "rolA", { Eb
, I1
}, 0 },
3518 { "rorA", { Eb
, I1
}, 0 },
3519 { "rclA", { Eb
, I1
}, 0 },
3520 { "rcrA", { Eb
, I1
}, 0 },
3521 { "shlA", { Eb
, I1
}, 0 },
3522 { "shrA", { Eb
, I1
}, 0 },
3523 { "shlA", { Eb
, I1
}, 0 },
3524 { "sarA", { Eb
, I1
}, 0 },
3528 { "rolQ", { Ev
, I1
}, 0 },
3529 { "rorQ", { Ev
, I1
}, 0 },
3530 { "rclQ", { Ev
, I1
}, 0 },
3531 { "rcrQ", { Ev
, I1
}, 0 },
3532 { "shlQ", { Ev
, I1
}, 0 },
3533 { "shrQ", { Ev
, I1
}, 0 },
3534 { "shlQ", { Ev
, I1
}, 0 },
3535 { "sarQ", { Ev
, I1
}, 0 },
3539 { "rolA", { Eb
, CL
}, 0 },
3540 { "rorA", { Eb
, CL
}, 0 },
3541 { "rclA", { Eb
, CL
}, 0 },
3542 { "rcrA", { Eb
, CL
}, 0 },
3543 { "shlA", { Eb
, CL
}, 0 },
3544 { "shrA", { Eb
, CL
}, 0 },
3545 { "shlA", { Eb
, CL
}, 0 },
3546 { "sarA", { Eb
, CL
}, 0 },
3550 { "rolQ", { Ev
, CL
}, 0 },
3551 { "rorQ", { Ev
, CL
}, 0 },
3552 { "rclQ", { Ev
, CL
}, 0 },
3553 { "rcrQ", { Ev
, CL
}, 0 },
3554 { "shlQ", { Ev
, CL
}, 0 },
3555 { "shrQ", { Ev
, CL
}, 0 },
3556 { "shlQ", { Ev
, CL
}, 0 },
3557 { "sarQ", { Ev
, CL
}, 0 },
3561 { "testA", { Eb
, Ib
}, 0 },
3562 { "testA", { Eb
, Ib
}, 0 },
3563 { "notA", { Ebh1
}, 0 },
3564 { "negA", { Ebh1
}, 0 },
3565 { "mulA", { Eb
}, 0 }, /* Don't print the implicit %al register, */
3566 { "imulA", { Eb
}, 0 }, /* to distinguish these opcodes from other */
3567 { "divA", { Eb
}, 0 }, /* mul/imul opcodes. Do the same for div */
3568 { "idivA", { Eb
}, 0 }, /* and idiv for consistency. */
3572 { "testQ", { Ev
, Iv
}, 0 },
3573 { "testQ", { Ev
, Iv
}, 0 },
3574 { "notQ", { Evh1
}, 0 },
3575 { "negQ", { Evh1
}, 0 },
3576 { "mulQ", { Ev
}, 0 }, /* Don't print the implicit register. */
3577 { "imulQ", { Ev
}, 0 },
3578 { "divQ", { Ev
}, 0 },
3579 { "idivQ", { Ev
}, 0 },
3583 { "incA", { Ebh1
}, 0 },
3584 { "decA", { Ebh1
}, 0 },
3588 { "incQ", { Evh1
}, 0 },
3589 { "decQ", { Evh1
}, 0 },
3590 { "call{&|}", { NOTRACK
, indirEv
, BND
}, 0 },
3591 { MOD_TABLE (MOD_FF_REG_3
) },
3592 { "jmp{&|}", { NOTRACK
, indirEv
, BND
}, 0 },
3593 { MOD_TABLE (MOD_FF_REG_5
) },
3594 { "pushU", { stackEv
}, 0 },
3599 { "sldtD", { Sv
}, 0 },
3600 { "strD", { Sv
}, 0 },
3601 { "lldt", { Ew
}, 0 },
3602 { "ltr", { Ew
}, 0 },
3603 { "verr", { Ew
}, 0 },
3604 { "verw", { Ew
}, 0 },
3610 { MOD_TABLE (MOD_0F01_REG_0
) },
3611 { MOD_TABLE (MOD_0F01_REG_1
) },
3612 { MOD_TABLE (MOD_0F01_REG_2
) },
3613 { MOD_TABLE (MOD_0F01_REG_3
) },
3614 { "smswD", { Sv
}, 0 },
3615 { MOD_TABLE (MOD_0F01_REG_5
) },
3616 { "lmsw", { Ew
}, 0 },
3617 { MOD_TABLE (MOD_0F01_REG_7
) },
3621 { "prefetch", { Mb
}, 0 },
3622 { "prefetchw", { Mb
}, 0 },
3623 { "prefetchwt1", { Mb
}, 0 },
3624 { "prefetch", { Mb
}, 0 },
3625 { "prefetch", { Mb
}, 0 },
3626 { "prefetch", { Mb
}, 0 },
3627 { "prefetch", { Mb
}, 0 },
3628 { "prefetch", { Mb
}, 0 },
3632 { MOD_TABLE (MOD_0F18_REG_0
) },
3633 { MOD_TABLE (MOD_0F18_REG_1
) },
3634 { MOD_TABLE (MOD_0F18_REG_2
) },
3635 { MOD_TABLE (MOD_0F18_REG_3
) },
3636 { MOD_TABLE (MOD_0F18_REG_4
) },
3637 { MOD_TABLE (MOD_0F18_REG_5
) },
3638 { MOD_TABLE (MOD_0F18_REG_6
) },
3639 { MOD_TABLE (MOD_0F18_REG_7
) },
3641 /* REG_0F1E_MOD_3 */
3643 { "nopQ", { Ev
}, 0 },
3644 { "rdsspK", { Rdq
}, PREFIX_OPCODE
},
3645 { "nopQ", { Ev
}, 0 },
3646 { "nopQ", { Ev
}, 0 },
3647 { "nopQ", { Ev
}, 0 },
3648 { "nopQ", { Ev
}, 0 },
3649 { "nopQ", { Ev
}, 0 },
3650 { RM_TABLE (RM_0F1E_MOD_3_REG_7
) },
3656 { MOD_TABLE (MOD_0F71_REG_2
) },
3658 { MOD_TABLE (MOD_0F71_REG_4
) },
3660 { MOD_TABLE (MOD_0F71_REG_6
) },
3666 { MOD_TABLE (MOD_0F72_REG_2
) },
3668 { MOD_TABLE (MOD_0F72_REG_4
) },
3670 { MOD_TABLE (MOD_0F72_REG_6
) },
3676 { MOD_TABLE (MOD_0F73_REG_2
) },
3677 { MOD_TABLE (MOD_0F73_REG_3
) },
3680 { MOD_TABLE (MOD_0F73_REG_6
) },
3681 { MOD_TABLE (MOD_0F73_REG_7
) },
3685 { "montmul", { { OP_0f07
, 0 } }, 0 },
3686 { "xsha1", { { OP_0f07
, 0 } }, 0 },
3687 { "xsha256", { { OP_0f07
, 0 } }, 0 },
3691 { "xstore-rng", { { OP_0f07
, 0 } }, 0 },
3692 { "xcrypt-ecb", { { OP_0f07
, 0 } }, 0 },
3693 { "xcrypt-cbc", { { OP_0f07
, 0 } }, 0 },
3694 { "xcrypt-ctr", { { OP_0f07
, 0 } }, 0 },
3695 { "xcrypt-cfb", { { OP_0f07
, 0 } }, 0 },
3696 { "xcrypt-ofb", { { OP_0f07
, 0 } }, 0 },
3700 { MOD_TABLE (MOD_0FAE_REG_0
) },
3701 { MOD_TABLE (MOD_0FAE_REG_1
) },
3702 { MOD_TABLE (MOD_0FAE_REG_2
) },
3703 { MOD_TABLE (MOD_0FAE_REG_3
) },
3704 { MOD_TABLE (MOD_0FAE_REG_4
) },
3705 { MOD_TABLE (MOD_0FAE_REG_5
) },
3706 { MOD_TABLE (MOD_0FAE_REG_6
) },
3707 { MOD_TABLE (MOD_0FAE_REG_7
) },
3715 { "btQ", { Ev
, Ib
}, 0 },
3716 { "btsQ", { Evh1
, Ib
}, 0 },
3717 { "btrQ", { Evh1
, Ib
}, 0 },
3718 { "btcQ", { Evh1
, Ib
}, 0 },
3723 { "cmpxchg8b", { { CMPXCHG8B_Fixup
, q_mode
} }, 0 },
3725 { MOD_TABLE (MOD_0FC7_REG_3
) },
3726 { MOD_TABLE (MOD_0FC7_REG_4
) },
3727 { MOD_TABLE (MOD_0FC7_REG_5
) },
3728 { MOD_TABLE (MOD_0FC7_REG_6
) },
3729 { MOD_TABLE (MOD_0FC7_REG_7
) },
3735 { MOD_TABLE (MOD_VEX_0F71_REG_2
) },
3737 { MOD_TABLE (MOD_VEX_0F71_REG_4
) },
3739 { MOD_TABLE (MOD_VEX_0F71_REG_6
) },
3745 { MOD_TABLE (MOD_VEX_0F72_REG_2
) },
3747 { MOD_TABLE (MOD_VEX_0F72_REG_4
) },
3749 { MOD_TABLE (MOD_VEX_0F72_REG_6
) },
3755 { MOD_TABLE (MOD_VEX_0F73_REG_2
) },
3756 { MOD_TABLE (MOD_VEX_0F73_REG_3
) },
3759 { MOD_TABLE (MOD_VEX_0F73_REG_6
) },
3760 { MOD_TABLE (MOD_VEX_0F73_REG_7
) },
3766 { MOD_TABLE (MOD_VEX_0FAE_REG_2
) },
3767 { MOD_TABLE (MOD_VEX_0FAE_REG_3
) },
3769 /* REG_VEX_0F38F3 */
3772 { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_1
) },
3773 { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_2
) },
3774 { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_3
) },
3778 { "llwpcb", { { OP_LWPCB_E
, 0 } }, 0 },
3779 { "slwpcb", { { OP_LWPCB_E
, 0 } }, 0 },
3783 { "lwpins", { { OP_LWP_E
, 0 }, Ed
, Iq
}, 0 },
3784 { "lwpval", { { OP_LWP_E
, 0 }, Ed
, Iq
}, 0 },
3786 /* REG_XOP_TBM_01 */
3789 { "blcfill", { { OP_LWP_E
, 0 }, Ev
}, 0 },
3790 { "blsfill", { { OP_LWP_E
, 0 }, Ev
}, 0 },
3791 { "blcs", { { OP_LWP_E
, 0 }, Ev
}, 0 },
3792 { "tzmsk", { { OP_LWP_E
, 0 }, Ev
}, 0 },
3793 { "blcic", { { OP_LWP_E
, 0 }, Ev
}, 0 },
3794 { "blsic", { { OP_LWP_E
, 0 }, Ev
}, 0 },
3795 { "t1mskc", { { OP_LWP_E
, 0 }, Ev
}, 0 },
3797 /* REG_XOP_TBM_02 */
3800 { "blcmsk", { { OP_LWP_E
, 0 }, Ev
}, 0 },
3805 { "blci", { { OP_LWP_E
, 0 }, Ev
}, 0 },
3807 #define NEED_REG_TABLE
3808 #include "i386-dis-evex.h"
3809 #undef NEED_REG_TABLE
3812 static const struct dis386 prefix_table
[][4] = {
3815 { "xchgS", { { NOP_Fixup1
, eAX_reg
}, { NOP_Fixup2
, eAX_reg
} }, 0 },
3816 { "pause", { XX
}, 0 },
3817 { "xchgS", { { NOP_Fixup1
, eAX_reg
}, { NOP_Fixup2
, eAX_reg
} }, 0 },
3818 { NULL
, { { NULL
, 0 } }, PREFIX_IGNORED
}
3821 /* PREFIX_MOD_0_0F01_REG_5 */
3824 { "rstorssp", { Mq
}, PREFIX_OPCODE
},
3827 /* PREFIX_MOD_3_0F01_REG_5_RM_0 */
3830 { "setssbsy", { Skip_MODRM
}, PREFIX_OPCODE
},
3833 /* PREFIX_MOD_3_0F01_REG_5_RM_2 */
3836 { "saveprevssp", { Skip_MODRM
}, PREFIX_OPCODE
},
3841 { "movups", { XM
, EXx
}, PREFIX_OPCODE
},
3842 { "movss", { XM
, EXd
}, PREFIX_OPCODE
},
3843 { "movupd", { XM
, EXx
}, PREFIX_OPCODE
},
3844 { "movsd", { XM
, EXq
}, PREFIX_OPCODE
},
3849 { "movups", { EXxS
, XM
}, PREFIX_OPCODE
},
3850 { "movss", { EXdS
, XM
}, PREFIX_OPCODE
},
3851 { "movupd", { EXxS
, XM
}, PREFIX_OPCODE
},
3852 { "movsd", { EXqS
, XM
}, PREFIX_OPCODE
},
3857 { MOD_TABLE (MOD_0F12_PREFIX_0
) },
3858 { "movsldup", { XM
, EXx
}, PREFIX_OPCODE
},
3859 { "movlpd", { XM
, EXq
}, PREFIX_OPCODE
},
3860 { "movddup", { XM
, EXq
}, PREFIX_OPCODE
},
3865 { MOD_TABLE (MOD_0F16_PREFIX_0
) },
3866 { "movshdup", { XM
, EXx
}, PREFIX_OPCODE
},
3867 { "movhpd", { XM
, EXq
}, PREFIX_OPCODE
},
3872 { MOD_TABLE (MOD_0F1A_PREFIX_0
) },
3873 { "bndcl", { Gbnd
, Ev_bnd
}, 0 },
3874 { "bndmov", { Gbnd
, Ebnd
}, 0 },
3875 { "bndcu", { Gbnd
, Ev_bnd
}, 0 },
3880 { MOD_TABLE (MOD_0F1B_PREFIX_0
) },
3881 { MOD_TABLE (MOD_0F1B_PREFIX_1
) },
3882 { "bndmov", { Ebnd
, Gbnd
}, 0 },
3883 { "bndcn", { Gbnd
, Ev_bnd
}, 0 },
3888 { "nopQ", { Ev
}, PREFIX_OPCODE
},
3889 { MOD_TABLE (MOD_0F1E_PREFIX_1
) },
3890 { "nopQ", { Ev
}, PREFIX_OPCODE
},
3891 { "nopQ", { Ev
}, PREFIX_OPCODE
},
3896 { "cvtpi2ps", { XM
, EMCq
}, PREFIX_OPCODE
},
3897 { "cvtsi2ss%LQ", { XM
, Ev
}, PREFIX_OPCODE
},
3898 { "cvtpi2pd", { XM
, EMCq
}, PREFIX_OPCODE
},
3899 { "cvtsi2sd%LQ", { XM
, Ev
}, 0 },
3904 { MOD_TABLE (MOD_0F2B_PREFIX_0
) },
3905 { MOD_TABLE (MOD_0F2B_PREFIX_1
) },
3906 { MOD_TABLE (MOD_0F2B_PREFIX_2
) },
3907 { MOD_TABLE (MOD_0F2B_PREFIX_3
) },
3912 { "cvttps2pi", { MXC
, EXq
}, PREFIX_OPCODE
},
3913 { "cvttss2siY", { Gv
, EXd
}, PREFIX_OPCODE
},
3914 { "cvttpd2pi", { MXC
, EXx
}, PREFIX_OPCODE
},
3915 { "cvttsd2siY", { Gv
, EXq
}, PREFIX_OPCODE
},
3920 { "cvtps2pi", { MXC
, EXq
}, PREFIX_OPCODE
},
3921 { "cvtss2siY", { Gv
, EXd
}, PREFIX_OPCODE
},
3922 { "cvtpd2pi", { MXC
, EXx
}, PREFIX_OPCODE
},
3923 { "cvtsd2siY", { Gv
, EXq
}, PREFIX_OPCODE
},
3928 { "ucomiss",{ XM
, EXd
}, 0 },
3930 { "ucomisd",{ XM
, EXq
}, 0 },
3935 { "comiss", { XM
, EXd
}, 0 },
3937 { "comisd", { XM
, EXq
}, 0 },
3942 { "sqrtps", { XM
, EXx
}, PREFIX_OPCODE
},
3943 { "sqrtss", { XM
, EXd
}, PREFIX_OPCODE
},
3944 { "sqrtpd", { XM
, EXx
}, PREFIX_OPCODE
},
3945 { "sqrtsd", { XM
, EXq
}, PREFIX_OPCODE
},
3950 { "rsqrtps",{ XM
, EXx
}, PREFIX_OPCODE
},
3951 { "rsqrtss",{ XM
, EXd
}, PREFIX_OPCODE
},
3956 { "rcpps", { XM
, EXx
}, PREFIX_OPCODE
},
3957 { "rcpss", { XM
, EXd
}, PREFIX_OPCODE
},
3962 { "addps", { XM
, EXx
}, PREFIX_OPCODE
},
3963 { "addss", { XM
, EXd
}, PREFIX_OPCODE
},
3964 { "addpd", { XM
, EXx
}, PREFIX_OPCODE
},
3965 { "addsd", { XM
, EXq
}, PREFIX_OPCODE
},
3970 { "mulps", { XM
, EXx
}, PREFIX_OPCODE
},
3971 { "mulss", { XM
, EXd
}, PREFIX_OPCODE
},
3972 { "mulpd", { XM
, EXx
}, PREFIX_OPCODE
},
3973 { "mulsd", { XM
, EXq
}, PREFIX_OPCODE
},
3978 { "cvtps2pd", { XM
, EXq
}, PREFIX_OPCODE
},
3979 { "cvtss2sd", { XM
, EXd
}, PREFIX_OPCODE
},
3980 { "cvtpd2ps", { XM
, EXx
}, PREFIX_OPCODE
},
3981 { "cvtsd2ss", { XM
, EXq
}, PREFIX_OPCODE
},
3986 { "cvtdq2ps", { XM
, EXx
}, PREFIX_OPCODE
},
3987 { "cvttps2dq", { XM
, EXx
}, PREFIX_OPCODE
},
3988 { "cvtps2dq", { XM
, EXx
}, PREFIX_OPCODE
},
3993 { "subps", { XM
, EXx
}, PREFIX_OPCODE
},
3994 { "subss", { XM
, EXd
}, PREFIX_OPCODE
},
3995 { "subpd", { XM
, EXx
}, PREFIX_OPCODE
},
3996 { "subsd", { XM
, EXq
}, PREFIX_OPCODE
},
4001 { "minps", { XM
, EXx
}, PREFIX_OPCODE
},
4002 { "minss", { XM
, EXd
}, PREFIX_OPCODE
},
4003 { "minpd", { XM
, EXx
}, PREFIX_OPCODE
},
4004 { "minsd", { XM
, EXq
}, PREFIX_OPCODE
},
4009 { "divps", { XM
, EXx
}, PREFIX_OPCODE
},
4010 { "divss", { XM
, EXd
}, PREFIX_OPCODE
},
4011 { "divpd", { XM
, EXx
}, PREFIX_OPCODE
},
4012 { "divsd", { XM
, EXq
}, PREFIX_OPCODE
},
4017 { "maxps", { XM
, EXx
}, PREFIX_OPCODE
},
4018 { "maxss", { XM
, EXd
}, PREFIX_OPCODE
},
4019 { "maxpd", { XM
, EXx
}, PREFIX_OPCODE
},
4020 { "maxsd", { XM
, EXq
}, PREFIX_OPCODE
},
4025 { "punpcklbw",{ MX
, EMd
}, PREFIX_OPCODE
},
4027 { "punpcklbw",{ MX
, EMx
}, PREFIX_OPCODE
},
4032 { "punpcklwd",{ MX
, EMd
}, PREFIX_OPCODE
},
4034 { "punpcklwd",{ MX
, EMx
}, PREFIX_OPCODE
},
4039 { "punpckldq",{ MX
, EMd
}, PREFIX_OPCODE
},
4041 { "punpckldq",{ MX
, EMx
}, PREFIX_OPCODE
},
4048 { "punpcklqdq", { XM
, EXx
}, PREFIX_OPCODE
},
4055 { "punpckhqdq", { XM
, EXx
}, PREFIX_OPCODE
},
4060 { "movq", { MX
, EM
}, PREFIX_OPCODE
},
4061 { "movdqu", { XM
, EXx
}, PREFIX_OPCODE
},
4062 { "movdqa", { XM
, EXx
}, PREFIX_OPCODE
},
4067 { "pshufw", { MX
, EM
, Ib
}, PREFIX_OPCODE
},
4068 { "pshufhw",{ XM
, EXx
, Ib
}, PREFIX_OPCODE
},
4069 { "pshufd", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
4070 { "pshuflw",{ XM
, EXx
, Ib
}, PREFIX_OPCODE
},
4073 /* PREFIX_0F73_REG_3 */
4077 { "psrldq", { XS
, Ib
}, 0 },
4080 /* PREFIX_0F73_REG_7 */
4084 { "pslldq", { XS
, Ib
}, 0 },
4089 {"vmread", { Em
, Gm
}, 0 },
4091 {"extrq", { XS
, Ib
, Ib
}, 0 },
4092 {"insertq", { XM
, XS
, Ib
, Ib
}, 0 },
4097 {"vmwrite", { Gm
, Em
}, 0 },
4099 {"extrq", { XM
, XS
}, 0 },
4100 {"insertq", { XM
, XS
}, 0 },
4107 { "haddpd", { XM
, EXx
}, PREFIX_OPCODE
},
4108 { "haddps", { XM
, EXx
}, PREFIX_OPCODE
},
4115 { "hsubpd", { XM
, EXx
}, PREFIX_OPCODE
},
4116 { "hsubps", { XM
, EXx
}, PREFIX_OPCODE
},
4121 { "movK", { Edq
, MX
}, PREFIX_OPCODE
},
4122 { "movq", { XM
, EXq
}, PREFIX_OPCODE
},
4123 { "movK", { Edq
, XM
}, PREFIX_OPCODE
},
4128 { "movq", { EMS
, MX
}, PREFIX_OPCODE
},
4129 { "movdqu", { EXxS
, XM
}, PREFIX_OPCODE
},
4130 { "movdqa", { EXxS
, XM
}, PREFIX_OPCODE
},
4133 /* PREFIX_0FAE_REG_0 */
4136 { "rdfsbase", { Ev
}, 0 },
4139 /* PREFIX_0FAE_REG_1 */
4142 { "rdgsbase", { Ev
}, 0 },
4145 /* PREFIX_0FAE_REG_2 */
4148 { "wrfsbase", { Ev
}, 0 },
4151 /* PREFIX_0FAE_REG_3 */
4154 { "wrgsbase", { Ev
}, 0 },
4157 /* PREFIX_MOD_0_0FAE_REG_4 */
4159 { "xsave", { FXSAVE
}, 0 },
4160 { "ptwrite%LQ", { Edq
}, 0 },
4163 /* PREFIX_MOD_3_0FAE_REG_4 */
4166 { "ptwrite%LQ", { Edq
}, 0 },
4169 /* PREFIX_MOD_0_0FAE_REG_5 */
4171 { "xrstor", { FXSAVE
}, PREFIX_OPCODE
},
4174 /* PREFIX_MOD_3_0FAE_REG_5 */
4176 { "lfence", { Skip_MODRM
}, 0 },
4177 { "incsspK", { Rdq
}, PREFIX_OPCODE
},
4180 /* PREFIX_0FAE_REG_6 */
4182 { "xsaveopt", { FXSAVE
}, PREFIX_OPCODE
},
4183 { "clrssbsy", { Mq
}, PREFIX_OPCODE
},
4184 { "clwb", { Mb
}, PREFIX_OPCODE
},
4187 /* PREFIX_0FAE_REG_7 */
4189 { "clflush", { Mb
}, 0 },
4191 { "clflushopt", { Mb
}, 0 },
4197 { "popcntS", { Gv
, Ev
}, 0 },
4202 { "bsfS", { Gv
, Ev
}, 0 },
4203 { "tzcntS", { Gv
, Ev
}, 0 },
4204 { "bsfS", { Gv
, Ev
}, 0 },
4209 { "bsrS", { Gv
, Ev
}, 0 },
4210 { "lzcntS", { Gv
, Ev
}, 0 },
4211 { "bsrS", { Gv
, Ev
}, 0 },
4216 { "cmpps", { XM
, EXx
, CMP
}, PREFIX_OPCODE
},
4217 { "cmpss", { XM
, EXd
, CMP
}, PREFIX_OPCODE
},
4218 { "cmppd", { XM
, EXx
, CMP
}, PREFIX_OPCODE
},
4219 { "cmpsd", { XM
, EXq
, CMP
}, PREFIX_OPCODE
},
4222 /* PREFIX_MOD_0_0FC3 */
4224 { "movntiS", { Ev
, Gv
}, PREFIX_OPCODE
},
4227 /* PREFIX_MOD_0_0FC7_REG_6 */
4229 { "vmptrld",{ Mq
}, 0 },
4230 { "vmxon", { Mq
}, 0 },
4231 { "vmclear",{ Mq
}, 0 },
4234 /* PREFIX_MOD_3_0FC7_REG_6 */
4236 { "rdrand", { Ev
}, 0 },
4238 { "rdrand", { Ev
}, 0 }
4241 /* PREFIX_MOD_3_0FC7_REG_7 */
4243 { "rdseed", { Ev
}, 0 },
4244 { "rdpid", { Em
}, 0 },
4245 { "rdseed", { Ev
}, 0 },
4252 { "addsubpd", { XM
, EXx
}, 0 },
4253 { "addsubps", { XM
, EXx
}, 0 },
4259 { "movq2dq",{ XM
, MS
}, 0 },
4260 { "movq", { EXqS
, XM
}, 0 },
4261 { "movdq2q",{ MX
, XS
}, 0 },
4267 { "cvtdq2pd", { XM
, EXq
}, PREFIX_OPCODE
},
4268 { "cvttpd2dq", { XM
, EXx
}, PREFIX_OPCODE
},
4269 { "cvtpd2dq", { XM
, EXx
}, PREFIX_OPCODE
},
4274 { "movntq", { Mq
, MX
}, PREFIX_OPCODE
},
4276 { MOD_TABLE (MOD_0FE7_PREFIX_2
) },
4284 { MOD_TABLE (MOD_0FF0_PREFIX_3
) },
4289 { "maskmovq", { MX
, MS
}, PREFIX_OPCODE
},
4291 { "maskmovdqu", { XM
, XS
}, PREFIX_OPCODE
},
4298 { "pblendvb", { XM
, EXx
, XMM0
}, PREFIX_OPCODE
},
4305 { "blendvps", { XM
, EXx
, XMM0
}, PREFIX_OPCODE
},
4312 { "blendvpd", { XM
, EXx
, XMM0
}, PREFIX_OPCODE
},
4319 { "ptest", { XM
, EXx
}, PREFIX_OPCODE
},
4326 { "pmovsxbw", { XM
, EXq
}, PREFIX_OPCODE
},
4333 { "pmovsxbd", { XM
, EXd
}, PREFIX_OPCODE
},
4340 { "pmovsxbq", { XM
, EXw
}, PREFIX_OPCODE
},
4347 { "pmovsxwd", { XM
, EXq
}, PREFIX_OPCODE
},
4354 { "pmovsxwq", { XM
, EXd
}, PREFIX_OPCODE
},
4361 { "pmovsxdq", { XM
, EXq
}, PREFIX_OPCODE
},
4368 { "pmuldq", { XM
, EXx
}, PREFIX_OPCODE
},
4375 { "pcmpeqq", { XM
, EXx
}, PREFIX_OPCODE
},
4382 { MOD_TABLE (MOD_0F382A_PREFIX_2
) },
4389 { "packusdw", { XM
, EXx
}, PREFIX_OPCODE
},
4396 { "pmovzxbw", { XM
, EXq
}, PREFIX_OPCODE
},
4403 { "pmovzxbd", { XM
, EXd
}, PREFIX_OPCODE
},
4410 { "pmovzxbq", { XM
, EXw
}, PREFIX_OPCODE
},
4417 { "pmovzxwd", { XM
, EXq
}, PREFIX_OPCODE
},
4424 { "pmovzxwq", { XM
, EXd
}, PREFIX_OPCODE
},
4431 { "pmovzxdq", { XM
, EXq
}, PREFIX_OPCODE
},
4438 { "pcmpgtq", { XM
, EXx
}, PREFIX_OPCODE
},
4445 { "pminsb", { XM
, EXx
}, PREFIX_OPCODE
},
4452 { "pminsd", { XM
, EXx
}, PREFIX_OPCODE
},
4459 { "pminuw", { XM
, EXx
}, PREFIX_OPCODE
},
4466 { "pminud", { XM
, EXx
}, PREFIX_OPCODE
},
4473 { "pmaxsb", { XM
, EXx
}, PREFIX_OPCODE
},
4480 { "pmaxsd", { XM
, EXx
}, PREFIX_OPCODE
},
4487 { "pmaxuw", { XM
, EXx
}, PREFIX_OPCODE
},
4494 { "pmaxud", { XM
, EXx
}, PREFIX_OPCODE
},
4501 { "pmulld", { XM
, EXx
}, PREFIX_OPCODE
},
4508 { "phminposuw", { XM
, EXx
}, PREFIX_OPCODE
},
4515 { "invept", { Gm
, Mo
}, PREFIX_OPCODE
},
4522 { "invvpid", { Gm
, Mo
}, PREFIX_OPCODE
},
4529 { "invpcid", { Gm
, M
}, PREFIX_OPCODE
},
4534 { "sha1nexte", { XM
, EXxmm
}, PREFIX_OPCODE
},
4539 { "sha1msg1", { XM
, EXxmm
}, PREFIX_OPCODE
},
4544 { "sha1msg2", { XM
, EXxmm
}, PREFIX_OPCODE
},
4549 { "sha256rnds2", { XM
, EXxmm
, XMM0
}, PREFIX_OPCODE
},
4554 { "sha256msg1", { XM
, EXxmm
}, PREFIX_OPCODE
},
4559 { "sha256msg2", { XM
, EXxmm
}, PREFIX_OPCODE
},
4566 { "gf2p8mulb", { XM
, EXxmm
}, PREFIX_OPCODE
},
4573 { "aesimc", { XM
, EXx
}, PREFIX_OPCODE
},
4580 { "aesenc", { XM
, EXx
}, PREFIX_OPCODE
},
4587 { "aesenclast", { XM
, EXx
}, PREFIX_OPCODE
},
4594 { "aesdec", { XM
, EXx
}, PREFIX_OPCODE
},
4601 { "aesdeclast", { XM
, EXx
}, PREFIX_OPCODE
},
4606 { "movbeS", { Gv
, { MOVBE_Fixup
, v_mode
} }, PREFIX_OPCODE
},
4608 { "movbeS", { Gv
, { MOVBE_Fixup
, v_mode
} }, PREFIX_OPCODE
},
4609 { "crc32", { Gdq
, { CRC32_Fixup
, b_mode
} }, PREFIX_OPCODE
},
4614 { "movbeS", { { MOVBE_Fixup
, v_mode
}, Gv
}, PREFIX_OPCODE
},
4616 { "movbeS", { { MOVBE_Fixup
, v_mode
}, Gv
}, PREFIX_OPCODE
},
4617 { "crc32", { Gdq
, { CRC32_Fixup
, v_mode
} }, PREFIX_OPCODE
},
4624 { MOD_TABLE (MOD_0F38F5_PREFIX_2
) },
4629 { MOD_TABLE (MOD_0F38F6_PREFIX_0
) },
4630 { "adoxS", { Gdq
, Edq
}, PREFIX_OPCODE
},
4631 { "adcxS", { Gdq
, Edq
}, PREFIX_OPCODE
},
4639 { "roundps", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
4646 { "roundpd", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
4653 { "roundss", { XM
, EXd
, Ib
}, PREFIX_OPCODE
},
4660 { "roundsd", { XM
, EXq
, Ib
}, PREFIX_OPCODE
},
4667 { "blendps", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
4674 { "blendpd", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
4681 { "pblendw", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
4688 { "pextrb", { Edqb
, XM
, Ib
}, PREFIX_OPCODE
},
4695 { "pextrw", { Edqw
, XM
, Ib
}, PREFIX_OPCODE
},
4702 { "pextrK", { Edq
, XM
, Ib
}, PREFIX_OPCODE
},
4709 { "extractps", { Edqd
, XM
, Ib
}, PREFIX_OPCODE
},
4716 { "pinsrb", { XM
, Edqb
, Ib
}, PREFIX_OPCODE
},
4723 { "insertps", { XM
, EXd
, Ib
}, PREFIX_OPCODE
},
4730 { "pinsrK", { XM
, Edq
, Ib
}, PREFIX_OPCODE
},
4737 { "dpps", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
4744 { "dppd", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
4751 { "mpsadbw", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
4758 { "pclmulqdq", { XM
, EXx
, PCLMUL
}, PREFIX_OPCODE
},
4765 { "pcmpestrm", { XM
, { PCMPESTR_Fixup
, x_mode
}, Ib
}, PREFIX_OPCODE
},
4772 { "pcmpestri", { XM
, { PCMPESTR_Fixup
, x_mode
}, Ib
}, PREFIX_OPCODE
},
4779 { "pcmpistrm", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
4786 { "pcmpistri", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
4791 { "sha1rnds4", { XM
, EXxmm
, Ib
}, PREFIX_OPCODE
},
4798 { "gf2p8affineqb", { XM
, EXxmm
, Ib
}, PREFIX_OPCODE
},
4805 { "gf2p8affineinvqb", { XM
, EXxmm
, Ib
}, PREFIX_OPCODE
},
4812 { "aeskeygenassist", { XM
, EXx
, Ib
}, PREFIX_OPCODE
},
4815 /* PREFIX_VEX_0F10 */
4817 { VEX_W_TABLE (VEX_W_0F10_P_0
) },
4818 { VEX_LEN_TABLE (VEX_LEN_0F10_P_1
) },
4819 { VEX_W_TABLE (VEX_W_0F10_P_2
) },
4820 { VEX_LEN_TABLE (VEX_LEN_0F10_P_3
) },
4823 /* PREFIX_VEX_0F11 */
4825 { VEX_W_TABLE (VEX_W_0F11_P_0
) },
4826 { VEX_LEN_TABLE (VEX_LEN_0F11_P_1
) },
4827 { VEX_W_TABLE (VEX_W_0F11_P_2
) },
4828 { VEX_LEN_TABLE (VEX_LEN_0F11_P_3
) },
4831 /* PREFIX_VEX_0F12 */
4833 { MOD_TABLE (MOD_VEX_0F12_PREFIX_0
) },
4834 { VEX_W_TABLE (VEX_W_0F12_P_1
) },
4835 { VEX_LEN_TABLE (VEX_LEN_0F12_P_2
) },
4836 { VEX_W_TABLE (VEX_W_0F12_P_3
) },
4839 /* PREFIX_VEX_0F16 */
4841 { MOD_TABLE (MOD_VEX_0F16_PREFIX_0
) },
4842 { VEX_W_TABLE (VEX_W_0F16_P_1
) },
4843 { VEX_LEN_TABLE (VEX_LEN_0F16_P_2
) },
4846 /* PREFIX_VEX_0F2A */
4849 { VEX_LEN_TABLE (VEX_LEN_0F2A_P_1
) },
4851 { VEX_LEN_TABLE (VEX_LEN_0F2A_P_3
) },
4854 /* PREFIX_VEX_0F2C */
4857 { VEX_LEN_TABLE (VEX_LEN_0F2C_P_1
) },
4859 { VEX_LEN_TABLE (VEX_LEN_0F2C_P_3
) },
4862 /* PREFIX_VEX_0F2D */
4865 { VEX_LEN_TABLE (VEX_LEN_0F2D_P_1
) },
4867 { VEX_LEN_TABLE (VEX_LEN_0F2D_P_3
) },
4870 /* PREFIX_VEX_0F2E */
4872 { VEX_LEN_TABLE (VEX_LEN_0F2E_P_0
) },
4874 { VEX_LEN_TABLE (VEX_LEN_0F2E_P_2
) },
4877 /* PREFIX_VEX_0F2F */
4879 { VEX_LEN_TABLE (VEX_LEN_0F2F_P_0
) },
4881 { VEX_LEN_TABLE (VEX_LEN_0F2F_P_2
) },
4884 /* PREFIX_VEX_0F41 */
4886 { VEX_LEN_TABLE (VEX_LEN_0F41_P_0
) },
4888 { VEX_LEN_TABLE (VEX_LEN_0F41_P_2
) },
4891 /* PREFIX_VEX_0F42 */
4893 { VEX_LEN_TABLE (VEX_LEN_0F42_P_0
) },
4895 { VEX_LEN_TABLE (VEX_LEN_0F42_P_2
) },
4898 /* PREFIX_VEX_0F44 */
4900 { VEX_LEN_TABLE (VEX_LEN_0F44_P_0
) },
4902 { VEX_LEN_TABLE (VEX_LEN_0F44_P_2
) },
4905 /* PREFIX_VEX_0F45 */
4907 { VEX_LEN_TABLE (VEX_LEN_0F45_P_0
) },
4909 { VEX_LEN_TABLE (VEX_LEN_0F45_P_2
) },
4912 /* PREFIX_VEX_0F46 */
4914 { VEX_LEN_TABLE (VEX_LEN_0F46_P_0
) },
4916 { VEX_LEN_TABLE (VEX_LEN_0F46_P_2
) },
4919 /* PREFIX_VEX_0F47 */
4921 { VEX_LEN_TABLE (VEX_LEN_0F47_P_0
) },
4923 { VEX_LEN_TABLE (VEX_LEN_0F47_P_2
) },
4926 /* PREFIX_VEX_0F4A */
4928 { VEX_LEN_TABLE (VEX_LEN_0F4A_P_0
) },
4930 { VEX_LEN_TABLE (VEX_LEN_0F4A_P_2
) },
4933 /* PREFIX_VEX_0F4B */
4935 { VEX_LEN_TABLE (VEX_LEN_0F4B_P_0
) },
4937 { VEX_LEN_TABLE (VEX_LEN_0F4B_P_2
) },
4940 /* PREFIX_VEX_0F51 */
4942 { VEX_W_TABLE (VEX_W_0F51_P_0
) },
4943 { VEX_LEN_TABLE (VEX_LEN_0F51_P_1
) },
4944 { VEX_W_TABLE (VEX_W_0F51_P_2
) },
4945 { VEX_LEN_TABLE (VEX_LEN_0F51_P_3
) },
4948 /* PREFIX_VEX_0F52 */
4950 { VEX_W_TABLE (VEX_W_0F52_P_0
) },
4951 { VEX_LEN_TABLE (VEX_LEN_0F52_P_1
) },
4954 /* PREFIX_VEX_0F53 */
4956 { VEX_W_TABLE (VEX_W_0F53_P_0
) },
4957 { VEX_LEN_TABLE (VEX_LEN_0F53_P_1
) },
4960 /* PREFIX_VEX_0F58 */
4962 { VEX_W_TABLE (VEX_W_0F58_P_0
) },
4963 { VEX_LEN_TABLE (VEX_LEN_0F58_P_1
) },
4964 { VEX_W_TABLE (VEX_W_0F58_P_2
) },
4965 { VEX_LEN_TABLE (VEX_LEN_0F58_P_3
) },
4968 /* PREFIX_VEX_0F59 */
4970 { VEX_W_TABLE (VEX_W_0F59_P_0
) },
4971 { VEX_LEN_TABLE (VEX_LEN_0F59_P_1
) },
4972 { VEX_W_TABLE (VEX_W_0F59_P_2
) },
4973 { VEX_LEN_TABLE (VEX_LEN_0F59_P_3
) },
4976 /* PREFIX_VEX_0F5A */
4978 { VEX_W_TABLE (VEX_W_0F5A_P_0
) },
4979 { VEX_LEN_TABLE (VEX_LEN_0F5A_P_1
) },
4980 { "vcvtpd2ps%XY", { XMM
, EXx
}, 0 },
4981 { VEX_LEN_TABLE (VEX_LEN_0F5A_P_3
) },
4984 /* PREFIX_VEX_0F5B */
4986 { VEX_W_TABLE (VEX_W_0F5B_P_0
) },
4987 { VEX_W_TABLE (VEX_W_0F5B_P_1
) },
4988 { VEX_W_TABLE (VEX_W_0F5B_P_2
) },
4991 /* PREFIX_VEX_0F5C */
4993 { VEX_W_TABLE (VEX_W_0F5C_P_0
) },
4994 { VEX_LEN_TABLE (VEX_LEN_0F5C_P_1
) },
4995 { VEX_W_TABLE (VEX_W_0F5C_P_2
) },
4996 { VEX_LEN_TABLE (VEX_LEN_0F5C_P_3
) },
4999 /* PREFIX_VEX_0F5D */
5001 { VEX_W_TABLE (VEX_W_0F5D_P_0
) },
5002 { VEX_LEN_TABLE (VEX_LEN_0F5D_P_1
) },
5003 { VEX_W_TABLE (VEX_W_0F5D_P_2
) },
5004 { VEX_LEN_TABLE (VEX_LEN_0F5D_P_3
) },
5007 /* PREFIX_VEX_0F5E */
5009 { VEX_W_TABLE (VEX_W_0F5E_P_0
) },
5010 { VEX_LEN_TABLE (VEX_LEN_0F5E_P_1
) },
5011 { VEX_W_TABLE (VEX_W_0F5E_P_2
) },
5012 { VEX_LEN_TABLE (VEX_LEN_0F5E_P_3
) },
5015 /* PREFIX_VEX_0F5F */
5017 { VEX_W_TABLE (VEX_W_0F5F_P_0
) },
5018 { VEX_LEN_TABLE (VEX_LEN_0F5F_P_1
) },
5019 { VEX_W_TABLE (VEX_W_0F5F_P_2
) },
5020 { VEX_LEN_TABLE (VEX_LEN_0F5F_P_3
) },
5023 /* PREFIX_VEX_0F60 */
5027 { VEX_W_TABLE (VEX_W_0F60_P_2
) },
5030 /* PREFIX_VEX_0F61 */
5034 { VEX_W_TABLE (VEX_W_0F61_P_2
) },
5037 /* PREFIX_VEX_0F62 */
5041 { VEX_W_TABLE (VEX_W_0F62_P_2
) },
5044 /* PREFIX_VEX_0F63 */
5048 { VEX_W_TABLE (VEX_W_0F63_P_2
) },
5051 /* PREFIX_VEX_0F64 */
5055 { VEX_W_TABLE (VEX_W_0F64_P_2
) },
5058 /* PREFIX_VEX_0F65 */
5062 { VEX_W_TABLE (VEX_W_0F65_P_2
) },
5065 /* PREFIX_VEX_0F66 */
5069 { VEX_W_TABLE (VEX_W_0F66_P_2
) },
5072 /* PREFIX_VEX_0F67 */
5076 { VEX_W_TABLE (VEX_W_0F67_P_2
) },
5079 /* PREFIX_VEX_0F68 */
5083 { VEX_W_TABLE (VEX_W_0F68_P_2
) },
5086 /* PREFIX_VEX_0F69 */
5090 { VEX_W_TABLE (VEX_W_0F69_P_2
) },
5093 /* PREFIX_VEX_0F6A */
5097 { VEX_W_TABLE (VEX_W_0F6A_P_2
) },
5100 /* PREFIX_VEX_0F6B */
5104 { VEX_W_TABLE (VEX_W_0F6B_P_2
) },
5107 /* PREFIX_VEX_0F6C */
5111 { VEX_W_TABLE (VEX_W_0F6C_P_2
) },
5114 /* PREFIX_VEX_0F6D */
5118 { VEX_W_TABLE (VEX_W_0F6D_P_2
) },
5121 /* PREFIX_VEX_0F6E */
5125 { VEX_LEN_TABLE (VEX_LEN_0F6E_P_2
) },
5128 /* PREFIX_VEX_0F6F */
5131 { VEX_W_TABLE (VEX_W_0F6F_P_1
) },
5132 { VEX_W_TABLE (VEX_W_0F6F_P_2
) },
5135 /* PREFIX_VEX_0F70 */
5138 { VEX_W_TABLE (VEX_W_0F70_P_1
) },
5139 { VEX_W_TABLE (VEX_W_0F70_P_2
) },
5140 { VEX_W_TABLE (VEX_W_0F70_P_3
) },
5143 /* PREFIX_VEX_0F71_REG_2 */
5147 { VEX_W_TABLE (VEX_W_0F71_R_2_P_2
) },
5150 /* PREFIX_VEX_0F71_REG_4 */
5154 { VEX_W_TABLE (VEX_W_0F71_R_4_P_2
) },
5157 /* PREFIX_VEX_0F71_REG_6 */
5161 { VEX_W_TABLE (VEX_W_0F71_R_6_P_2
) },
5164 /* PREFIX_VEX_0F72_REG_2 */
5168 { VEX_W_TABLE (VEX_W_0F72_R_2_P_2
) },
5171 /* PREFIX_VEX_0F72_REG_4 */
5175 { VEX_W_TABLE (VEX_W_0F72_R_4_P_2
) },
5178 /* PREFIX_VEX_0F72_REG_6 */
5182 { VEX_W_TABLE (VEX_W_0F72_R_6_P_2
) },
5185 /* PREFIX_VEX_0F73_REG_2 */
5189 { VEX_W_TABLE (VEX_W_0F73_R_2_P_2
) },
5192 /* PREFIX_VEX_0F73_REG_3 */
5196 { VEX_W_TABLE (VEX_W_0F73_R_3_P_2
) },
5199 /* PREFIX_VEX_0F73_REG_6 */
5203 { VEX_W_TABLE (VEX_W_0F73_R_6_P_2
) },
5206 /* PREFIX_VEX_0F73_REG_7 */
5210 { VEX_W_TABLE (VEX_W_0F73_R_7_P_2
) },
5213 /* PREFIX_VEX_0F74 */
5217 { VEX_W_TABLE (VEX_W_0F74_P_2
) },
5220 /* PREFIX_VEX_0F75 */
5224 { VEX_W_TABLE (VEX_W_0F75_P_2
) },
5227 /* PREFIX_VEX_0F76 */
5231 { VEX_W_TABLE (VEX_W_0F76_P_2
) },
5234 /* PREFIX_VEX_0F77 */
5236 { VEX_W_TABLE (VEX_W_0F77_P_0
) },
5239 /* PREFIX_VEX_0F7C */
5243 { VEX_W_TABLE (VEX_W_0F7C_P_2
) },
5244 { VEX_W_TABLE (VEX_W_0F7C_P_3
) },
5247 /* PREFIX_VEX_0F7D */
5251 { VEX_W_TABLE (VEX_W_0F7D_P_2
) },
5252 { VEX_W_TABLE (VEX_W_0F7D_P_3
) },
5255 /* PREFIX_VEX_0F7E */
5258 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_1
) },
5259 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_2
) },
5262 /* PREFIX_VEX_0F7F */
5265 { VEX_W_TABLE (VEX_W_0F7F_P_1
) },
5266 { VEX_W_TABLE (VEX_W_0F7F_P_2
) },
5269 /* PREFIX_VEX_0F90 */
5271 { VEX_LEN_TABLE (VEX_LEN_0F90_P_0
) },
5273 { VEX_LEN_TABLE (VEX_LEN_0F90_P_2
) },
5276 /* PREFIX_VEX_0F91 */
5278 { VEX_LEN_TABLE (VEX_LEN_0F91_P_0
) },
5280 { VEX_LEN_TABLE (VEX_LEN_0F91_P_2
) },
5283 /* PREFIX_VEX_0F92 */
5285 { VEX_LEN_TABLE (VEX_LEN_0F92_P_0
) },
5287 { VEX_LEN_TABLE (VEX_LEN_0F92_P_2
) },
5288 { VEX_LEN_TABLE (VEX_LEN_0F92_P_3
) },
5291 /* PREFIX_VEX_0F93 */
5293 { VEX_LEN_TABLE (VEX_LEN_0F93_P_0
) },
5295 { VEX_LEN_TABLE (VEX_LEN_0F93_P_2
) },
5296 { VEX_LEN_TABLE (VEX_LEN_0F93_P_3
) },
5299 /* PREFIX_VEX_0F98 */
5301 { VEX_LEN_TABLE (VEX_LEN_0F98_P_0
) },
5303 { VEX_LEN_TABLE (VEX_LEN_0F98_P_2
) },
5306 /* PREFIX_VEX_0F99 */
5308 { VEX_LEN_TABLE (VEX_LEN_0F99_P_0
) },
5310 { VEX_LEN_TABLE (VEX_LEN_0F99_P_2
) },
5313 /* PREFIX_VEX_0FC2 */
5315 { VEX_W_TABLE (VEX_W_0FC2_P_0
) },
5316 { VEX_LEN_TABLE (VEX_LEN_0FC2_P_1
) },
5317 { VEX_W_TABLE (VEX_W_0FC2_P_2
) },
5318 { VEX_LEN_TABLE (VEX_LEN_0FC2_P_3
) },
5321 /* PREFIX_VEX_0FC4 */
5325 { VEX_LEN_TABLE (VEX_LEN_0FC4_P_2
) },
5328 /* PREFIX_VEX_0FC5 */
5332 { VEX_LEN_TABLE (VEX_LEN_0FC5_P_2
) },
5335 /* PREFIX_VEX_0FD0 */
5339 { VEX_W_TABLE (VEX_W_0FD0_P_2
) },
5340 { VEX_W_TABLE (VEX_W_0FD0_P_3
) },
5343 /* PREFIX_VEX_0FD1 */
5347 { VEX_W_TABLE (VEX_W_0FD1_P_2
) },
5350 /* PREFIX_VEX_0FD2 */
5354 { VEX_W_TABLE (VEX_W_0FD2_P_2
) },
5357 /* PREFIX_VEX_0FD3 */
5361 { VEX_W_TABLE (VEX_W_0FD3_P_2
) },
5364 /* PREFIX_VEX_0FD4 */
5368 { VEX_W_TABLE (VEX_W_0FD4_P_2
) },
5371 /* PREFIX_VEX_0FD5 */
5375 { VEX_W_TABLE (VEX_W_0FD5_P_2
) },
5378 /* PREFIX_VEX_0FD6 */
5382 { VEX_LEN_TABLE (VEX_LEN_0FD6_P_2
) },
5385 /* PREFIX_VEX_0FD7 */
5389 { MOD_TABLE (MOD_VEX_0FD7_PREFIX_2
) },
5392 /* PREFIX_VEX_0FD8 */
5396 { VEX_W_TABLE (VEX_W_0FD8_P_2
) },
5399 /* PREFIX_VEX_0FD9 */
5403 { VEX_W_TABLE (VEX_W_0FD9_P_2
) },
5406 /* PREFIX_VEX_0FDA */
5410 { VEX_W_TABLE (VEX_W_0FDA_P_2
) },
5413 /* PREFIX_VEX_0FDB */
5417 { VEX_W_TABLE (VEX_W_0FDB_P_2
) },
5420 /* PREFIX_VEX_0FDC */
5424 { VEX_W_TABLE (VEX_W_0FDC_P_2
) },
5427 /* PREFIX_VEX_0FDD */
5431 { VEX_W_TABLE (VEX_W_0FDD_P_2
) },
5434 /* PREFIX_VEX_0FDE */
5438 { VEX_W_TABLE (VEX_W_0FDE_P_2
) },
5441 /* PREFIX_VEX_0FDF */
5445 { VEX_W_TABLE (VEX_W_0FDF_P_2
) },
5448 /* PREFIX_VEX_0FE0 */
5452 { VEX_W_TABLE (VEX_W_0FE0_P_2
) },
5455 /* PREFIX_VEX_0FE1 */
5459 { VEX_W_TABLE (VEX_W_0FE1_P_2
) },
5462 /* PREFIX_VEX_0FE2 */
5466 { VEX_W_TABLE (VEX_W_0FE2_P_2
) },
5469 /* PREFIX_VEX_0FE3 */
5473 { VEX_W_TABLE (VEX_W_0FE3_P_2
) },
5476 /* PREFIX_VEX_0FE4 */
5480 { VEX_W_TABLE (VEX_W_0FE4_P_2
) },
5483 /* PREFIX_VEX_0FE5 */
5487 { VEX_W_TABLE (VEX_W_0FE5_P_2
) },
5490 /* PREFIX_VEX_0FE6 */
5493 { VEX_W_TABLE (VEX_W_0FE6_P_1
) },
5494 { VEX_W_TABLE (VEX_W_0FE6_P_2
) },
5495 { VEX_W_TABLE (VEX_W_0FE6_P_3
) },
5498 /* PREFIX_VEX_0FE7 */
5502 { MOD_TABLE (MOD_VEX_0FE7_PREFIX_2
) },
5505 /* PREFIX_VEX_0FE8 */
5509 { VEX_W_TABLE (VEX_W_0FE8_P_2
) },
5512 /* PREFIX_VEX_0FE9 */
5516 { VEX_W_TABLE (VEX_W_0FE9_P_2
) },
5519 /* PREFIX_VEX_0FEA */
5523 { VEX_W_TABLE (VEX_W_0FEA_P_2
) },
5526 /* PREFIX_VEX_0FEB */
5530 { VEX_W_TABLE (VEX_W_0FEB_P_2
) },
5533 /* PREFIX_VEX_0FEC */
5537 { VEX_W_TABLE (VEX_W_0FEC_P_2
) },
5540 /* PREFIX_VEX_0FED */
5544 { VEX_W_TABLE (VEX_W_0FED_P_2
) },
5547 /* PREFIX_VEX_0FEE */
5551 { VEX_W_TABLE (VEX_W_0FEE_P_2
) },
5554 /* PREFIX_VEX_0FEF */
5558 { VEX_W_TABLE (VEX_W_0FEF_P_2
) },
5561 /* PREFIX_VEX_0FF0 */
5566 { MOD_TABLE (MOD_VEX_0FF0_PREFIX_3
) },
5569 /* PREFIX_VEX_0FF1 */
5573 { VEX_W_TABLE (VEX_W_0FF1_P_2
) },
5576 /* PREFIX_VEX_0FF2 */
5580 { VEX_W_TABLE (VEX_W_0FF2_P_2
) },
5583 /* PREFIX_VEX_0FF3 */
5587 { VEX_W_TABLE (VEX_W_0FF3_P_2
) },
5590 /* PREFIX_VEX_0FF4 */
5594 { VEX_W_TABLE (VEX_W_0FF4_P_2
) },
5597 /* PREFIX_VEX_0FF5 */
5601 { VEX_W_TABLE (VEX_W_0FF5_P_2
) },
5604 /* PREFIX_VEX_0FF6 */
5608 { VEX_W_TABLE (VEX_W_0FF6_P_2
) },
5611 /* PREFIX_VEX_0FF7 */
5615 { VEX_LEN_TABLE (VEX_LEN_0FF7_P_2
) },
5618 /* PREFIX_VEX_0FF8 */
5622 { VEX_W_TABLE (VEX_W_0FF8_P_2
) },
5625 /* PREFIX_VEX_0FF9 */
5629 { VEX_W_TABLE (VEX_W_0FF9_P_2
) },
5632 /* PREFIX_VEX_0FFA */
5636 { VEX_W_TABLE (VEX_W_0FFA_P_2
) },
5639 /* PREFIX_VEX_0FFB */
5643 { VEX_W_TABLE (VEX_W_0FFB_P_2
) },
5646 /* PREFIX_VEX_0FFC */
5650 { VEX_W_TABLE (VEX_W_0FFC_P_2
) },
5653 /* PREFIX_VEX_0FFD */
5657 { VEX_W_TABLE (VEX_W_0FFD_P_2
) },
5660 /* PREFIX_VEX_0FFE */
5664 { VEX_W_TABLE (VEX_W_0FFE_P_2
) },
5667 /* PREFIX_VEX_0F3800 */
5671 { VEX_W_TABLE (VEX_W_0F3800_P_2
) },
5674 /* PREFIX_VEX_0F3801 */
5678 { VEX_W_TABLE (VEX_W_0F3801_P_2
) },
5681 /* PREFIX_VEX_0F3802 */
5685 { VEX_W_TABLE (VEX_W_0F3802_P_2
) },
5688 /* PREFIX_VEX_0F3803 */
5692 { VEX_W_TABLE (VEX_W_0F3803_P_2
) },
5695 /* PREFIX_VEX_0F3804 */
5699 { VEX_W_TABLE (VEX_W_0F3804_P_2
) },
5702 /* PREFIX_VEX_0F3805 */
5706 { VEX_W_TABLE (VEX_W_0F3805_P_2
) },
5709 /* PREFIX_VEX_0F3806 */
5713 { VEX_W_TABLE (VEX_W_0F3806_P_2
) },
5716 /* PREFIX_VEX_0F3807 */
5720 { VEX_W_TABLE (VEX_W_0F3807_P_2
) },
5723 /* PREFIX_VEX_0F3808 */
5727 { VEX_W_TABLE (VEX_W_0F3808_P_2
) },
5730 /* PREFIX_VEX_0F3809 */
5734 { VEX_W_TABLE (VEX_W_0F3809_P_2
) },
5737 /* PREFIX_VEX_0F380A */
5741 { VEX_W_TABLE (VEX_W_0F380A_P_2
) },
5744 /* PREFIX_VEX_0F380B */
5748 { VEX_W_TABLE (VEX_W_0F380B_P_2
) },
5751 /* PREFIX_VEX_0F380C */
5755 { VEX_W_TABLE (VEX_W_0F380C_P_2
) },
5758 /* PREFIX_VEX_0F380D */
5762 { VEX_W_TABLE (VEX_W_0F380D_P_2
) },
5765 /* PREFIX_VEX_0F380E */
5769 { VEX_W_TABLE (VEX_W_0F380E_P_2
) },
5772 /* PREFIX_VEX_0F380F */
5776 { VEX_W_TABLE (VEX_W_0F380F_P_2
) },
5779 /* PREFIX_VEX_0F3813 */
5783 { "vcvtph2ps", { XM
, EXxmmq
}, 0 },
5786 /* PREFIX_VEX_0F3816 */
5790 { VEX_LEN_TABLE (VEX_LEN_0F3816_P_2
) },
5793 /* PREFIX_VEX_0F3817 */
5797 { VEX_W_TABLE (VEX_W_0F3817_P_2
) },
5800 /* PREFIX_VEX_0F3818 */
5804 { VEX_W_TABLE (VEX_W_0F3818_P_2
) },
5807 /* PREFIX_VEX_0F3819 */
5811 { VEX_LEN_TABLE (VEX_LEN_0F3819_P_2
) },
5814 /* PREFIX_VEX_0F381A */
5818 { MOD_TABLE (MOD_VEX_0F381A_PREFIX_2
) },
5821 /* PREFIX_VEX_0F381C */
5825 { VEX_W_TABLE (VEX_W_0F381C_P_2
) },
5828 /* PREFIX_VEX_0F381D */
5832 { VEX_W_TABLE (VEX_W_0F381D_P_2
) },
5835 /* PREFIX_VEX_0F381E */
5839 { VEX_W_TABLE (VEX_W_0F381E_P_2
) },
5842 /* PREFIX_VEX_0F3820 */
5846 { VEX_W_TABLE (VEX_W_0F3820_P_2
) },
5849 /* PREFIX_VEX_0F3821 */
5853 { VEX_W_TABLE (VEX_W_0F3821_P_2
) },
5856 /* PREFIX_VEX_0F3822 */
5860 { VEX_W_TABLE (VEX_W_0F3822_P_2
) },
5863 /* PREFIX_VEX_0F3823 */
5867 { VEX_W_TABLE (VEX_W_0F3823_P_2
) },
5870 /* PREFIX_VEX_0F3824 */
5874 { VEX_W_TABLE (VEX_W_0F3824_P_2
) },
5877 /* PREFIX_VEX_0F3825 */
5881 { VEX_W_TABLE (VEX_W_0F3825_P_2
) },
5884 /* PREFIX_VEX_0F3828 */
5888 { VEX_W_TABLE (VEX_W_0F3828_P_2
) },
5891 /* PREFIX_VEX_0F3829 */
5895 { VEX_W_TABLE (VEX_W_0F3829_P_2
) },
5898 /* PREFIX_VEX_0F382A */
5902 { MOD_TABLE (MOD_VEX_0F382A_PREFIX_2
) },
5905 /* PREFIX_VEX_0F382B */
5909 { VEX_W_TABLE (VEX_W_0F382B_P_2
) },
5912 /* PREFIX_VEX_0F382C */
5916 { MOD_TABLE (MOD_VEX_0F382C_PREFIX_2
) },
5919 /* PREFIX_VEX_0F382D */
5923 { MOD_TABLE (MOD_VEX_0F382D_PREFIX_2
) },
5926 /* PREFIX_VEX_0F382E */
5930 { MOD_TABLE (MOD_VEX_0F382E_PREFIX_2
) },
5933 /* PREFIX_VEX_0F382F */
5937 { MOD_TABLE (MOD_VEX_0F382F_PREFIX_2
) },
5940 /* PREFIX_VEX_0F3830 */
5944 { VEX_W_TABLE (VEX_W_0F3830_P_2
) },
5947 /* PREFIX_VEX_0F3831 */
5951 { VEX_W_TABLE (VEX_W_0F3831_P_2
) },
5954 /* PREFIX_VEX_0F3832 */
5958 { VEX_W_TABLE (VEX_W_0F3832_P_2
) },
5961 /* PREFIX_VEX_0F3833 */
5965 { VEX_W_TABLE (VEX_W_0F3833_P_2
) },
5968 /* PREFIX_VEX_0F3834 */
5972 { VEX_W_TABLE (VEX_W_0F3834_P_2
) },
5975 /* PREFIX_VEX_0F3835 */
5979 { VEX_W_TABLE (VEX_W_0F3835_P_2
) },
5982 /* PREFIX_VEX_0F3836 */
5986 { VEX_LEN_TABLE (VEX_LEN_0F3836_P_2
) },
5989 /* PREFIX_VEX_0F3837 */
5993 { VEX_W_TABLE (VEX_W_0F3837_P_2
) },
5996 /* PREFIX_VEX_0F3838 */
6000 { VEX_W_TABLE (VEX_W_0F3838_P_2
) },
6003 /* PREFIX_VEX_0F3839 */
6007 { VEX_W_TABLE (VEX_W_0F3839_P_2
) },
6010 /* PREFIX_VEX_0F383A */
6014 { VEX_W_TABLE (VEX_W_0F383A_P_2
) },
6017 /* PREFIX_VEX_0F383B */
6021 { VEX_W_TABLE (VEX_W_0F383B_P_2
) },
6024 /* PREFIX_VEX_0F383C */
6028 { VEX_W_TABLE (VEX_W_0F383C_P_2
) },
6031 /* PREFIX_VEX_0F383D */
6035 { VEX_W_TABLE (VEX_W_0F383D_P_2
) },
6038 /* PREFIX_VEX_0F383E */
6042 { VEX_W_TABLE (VEX_W_0F383E_P_2
) },
6045 /* PREFIX_VEX_0F383F */
6049 { VEX_W_TABLE (VEX_W_0F383F_P_2
) },
6052 /* PREFIX_VEX_0F3840 */
6056 { VEX_W_TABLE (VEX_W_0F3840_P_2
) },
6059 /* PREFIX_VEX_0F3841 */
6063 { VEX_LEN_TABLE (VEX_LEN_0F3841_P_2
) },
6066 /* PREFIX_VEX_0F3845 */
6070 { "vpsrlv%LW", { XM
, Vex
, EXx
}, 0 },
6073 /* PREFIX_VEX_0F3846 */
6077 { VEX_W_TABLE (VEX_W_0F3846_P_2
) },
6080 /* PREFIX_VEX_0F3847 */
6084 { "vpsllv%LW", { XM
, Vex
, EXx
}, 0 },
6087 /* PREFIX_VEX_0F3858 */
6091 { VEX_W_TABLE (VEX_W_0F3858_P_2
) },
6094 /* PREFIX_VEX_0F3859 */
6098 { VEX_W_TABLE (VEX_W_0F3859_P_2
) },
6101 /* PREFIX_VEX_0F385A */
6105 { MOD_TABLE (MOD_VEX_0F385A_PREFIX_2
) },
6108 /* PREFIX_VEX_0F3878 */
6112 { VEX_W_TABLE (VEX_W_0F3878_P_2
) },
6115 /* PREFIX_VEX_0F3879 */
6119 { VEX_W_TABLE (VEX_W_0F3879_P_2
) },
6122 /* PREFIX_VEX_0F388C */
6126 { MOD_TABLE (MOD_VEX_0F388C_PREFIX_2
) },
6129 /* PREFIX_VEX_0F388E */
6133 { MOD_TABLE (MOD_VEX_0F388E_PREFIX_2
) },
6136 /* PREFIX_VEX_0F3890 */
6140 { "vpgatherd%LW", { XM
, MVexVSIBDWpX
, Vex
}, 0 },
6143 /* PREFIX_VEX_0F3891 */
6147 { "vpgatherq%LW", { XMGatherQ
, MVexVSIBQWpX
, VexGatherQ
}, 0 },
6150 /* PREFIX_VEX_0F3892 */
6154 { "vgatherdp%XW", { XM
, MVexVSIBDWpX
, Vex
}, 0 },
6157 /* PREFIX_VEX_0F3893 */
6161 { "vgatherqp%XW", { XMGatherQ
, MVexVSIBQWpX
, VexGatherQ
}, 0 },
6164 /* PREFIX_VEX_0F3896 */
6168 { "vfmaddsub132p%XW", { XM
, Vex
, EXx
}, 0 },
6171 /* PREFIX_VEX_0F3897 */
6175 { "vfmsubadd132p%XW", { XM
, Vex
, EXx
}, 0 },
6178 /* PREFIX_VEX_0F3898 */
6182 { "vfmadd132p%XW", { XM
, Vex
, EXx
}, 0 },
6185 /* PREFIX_VEX_0F3899 */
6189 { "vfmadd132s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
}, 0 },
6192 /* PREFIX_VEX_0F389A */
6196 { "vfmsub132p%XW", { XM
, Vex
, EXx
}, 0 },
6199 /* PREFIX_VEX_0F389B */
6203 { "vfmsub132s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
}, 0 },
6206 /* PREFIX_VEX_0F389C */
6210 { "vfnmadd132p%XW", { XM
, Vex
, EXx
}, 0 },
6213 /* PREFIX_VEX_0F389D */
6217 { "vfnmadd132s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
}, 0 },
6220 /* PREFIX_VEX_0F389E */
6224 { "vfnmsub132p%XW", { XM
, Vex
, EXx
}, 0 },
6227 /* PREFIX_VEX_0F389F */
6231 { "vfnmsub132s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
}, 0 },
6234 /* PREFIX_VEX_0F38A6 */
6238 { "vfmaddsub213p%XW", { XM
, Vex
, EXx
}, 0 },
6242 /* PREFIX_VEX_0F38A7 */
6246 { "vfmsubadd213p%XW", { XM
, Vex
, EXx
}, 0 },
6249 /* PREFIX_VEX_0F38A8 */
6253 { "vfmadd213p%XW", { XM
, Vex
, EXx
}, 0 },
6256 /* PREFIX_VEX_0F38A9 */
6260 { "vfmadd213s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
}, 0 },
6263 /* PREFIX_VEX_0F38AA */
6267 { "vfmsub213p%XW", { XM
, Vex
, EXx
}, 0 },
6270 /* PREFIX_VEX_0F38AB */
6274 { "vfmsub213s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
}, 0 },
6277 /* PREFIX_VEX_0F38AC */
6281 { "vfnmadd213p%XW", { XM
, Vex
, EXx
}, 0 },
6284 /* PREFIX_VEX_0F38AD */
6288 { "vfnmadd213s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
}, 0 },
6291 /* PREFIX_VEX_0F38AE */
6295 { "vfnmsub213p%XW", { XM
, Vex
, EXx
}, 0 },
6298 /* PREFIX_VEX_0F38AF */
6302 { "vfnmsub213s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
}, 0 },
6305 /* PREFIX_VEX_0F38B6 */
6309 { "vfmaddsub231p%XW", { XM
, Vex
, EXx
}, 0 },
6312 /* PREFIX_VEX_0F38B7 */
6316 { "vfmsubadd231p%XW", { XM
, Vex
, EXx
}, 0 },
6319 /* PREFIX_VEX_0F38B8 */
6323 { "vfmadd231p%XW", { XM
, Vex
, EXx
}, 0 },
6326 /* PREFIX_VEX_0F38B9 */
6330 { "vfmadd231s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
}, 0 },
6333 /* PREFIX_VEX_0F38BA */
6337 { "vfmsub231p%XW", { XM
, Vex
, EXx
}, 0 },
6340 /* PREFIX_VEX_0F38BB */
6344 { "vfmsub231s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
}, 0 },
6347 /* PREFIX_VEX_0F38BC */
6351 { "vfnmadd231p%XW", { XM
, Vex
, EXx
}, 0 },
6354 /* PREFIX_VEX_0F38BD */
6358 { "vfnmadd231s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
}, 0 },
6361 /* PREFIX_VEX_0F38BE */
6365 { "vfnmsub231p%XW", { XM
, Vex
, EXx
}, 0 },
6368 /* PREFIX_VEX_0F38BF */
6372 { "vfnmsub231s%XW", { XMScalar
, VexScalar
, EXVexWdqScalar
}, 0 },
6375 /* PREFIX_VEX_0F38CF */
6379 { VEX_W_TABLE (VEX_W_0F38CF_P_2
) },
6382 /* PREFIX_VEX_0F38DB */
6386 { VEX_LEN_TABLE (VEX_LEN_0F38DB_P_2
) },
6389 /* PREFIX_VEX_0F38DC */
6393 { "vaesenc", { XM
, Vex
, EXx
}, 0 },
6396 /* PREFIX_VEX_0F38DD */
6400 { "vaesenclast", { XM
, Vex
, EXx
}, 0 },
6403 /* PREFIX_VEX_0F38DE */
6407 { "vaesdec", { XM
, Vex
, EXx
}, 0 },
6410 /* PREFIX_VEX_0F38DF */
6414 { "vaesdeclast", { XM
, Vex
, EXx
}, 0 },
6417 /* PREFIX_VEX_0F38F2 */
6419 { VEX_LEN_TABLE (VEX_LEN_0F38F2_P_0
) },
6422 /* PREFIX_VEX_0F38F3_REG_1 */
6424 { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_1_P_0
) },
6427 /* PREFIX_VEX_0F38F3_REG_2 */
6429 { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_2_P_0
) },
6432 /* PREFIX_VEX_0F38F3_REG_3 */
6434 { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_3_P_0
) },
6437 /* PREFIX_VEX_0F38F5 */
6439 { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_0
) },
6440 { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_1
) },
6442 { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_3
) },
6445 /* PREFIX_VEX_0F38F6 */
6450 { VEX_LEN_TABLE (VEX_LEN_0F38F6_P_3
) },
6453 /* PREFIX_VEX_0F38F7 */
6455 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_0
) },
6456 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_1
) },
6457 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_2
) },
6458 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_3
) },
6461 /* PREFIX_VEX_0F3A00 */
6465 { VEX_LEN_TABLE (VEX_LEN_0F3A00_P_2
) },
6468 /* PREFIX_VEX_0F3A01 */
6472 { VEX_LEN_TABLE (VEX_LEN_0F3A01_P_2
) },
6475 /* PREFIX_VEX_0F3A02 */
6479 { VEX_W_TABLE (VEX_W_0F3A02_P_2
) },
6482 /* PREFIX_VEX_0F3A04 */
6486 { VEX_W_TABLE (VEX_W_0F3A04_P_2
) },
6489 /* PREFIX_VEX_0F3A05 */
6493 { VEX_W_TABLE (VEX_W_0F3A05_P_2
) },
6496 /* PREFIX_VEX_0F3A06 */
6500 { VEX_LEN_TABLE (VEX_LEN_0F3A06_P_2
) },
6503 /* PREFIX_VEX_0F3A08 */
6507 { VEX_W_TABLE (VEX_W_0F3A08_P_2
) },
6510 /* PREFIX_VEX_0F3A09 */
6514 { VEX_W_TABLE (VEX_W_0F3A09_P_2
) },
6517 /* PREFIX_VEX_0F3A0A */
6521 { VEX_LEN_TABLE (VEX_LEN_0F3A0A_P_2
) },
6524 /* PREFIX_VEX_0F3A0B */
6528 { VEX_LEN_TABLE (VEX_LEN_0F3A0B_P_2
) },
6531 /* PREFIX_VEX_0F3A0C */
6535 { VEX_W_TABLE (VEX_W_0F3A0C_P_2
) },
6538 /* PREFIX_VEX_0F3A0D */
6542 { VEX_W_TABLE (VEX_W_0F3A0D_P_2
) },
6545 /* PREFIX_VEX_0F3A0E */
6549 { VEX_W_TABLE (VEX_W_0F3A0E_P_2
) },
6552 /* PREFIX_VEX_0F3A0F */
6556 { VEX_W_TABLE (VEX_W_0F3A0F_P_2
) },
6559 /* PREFIX_VEX_0F3A14 */
6563 { VEX_LEN_TABLE (VEX_LEN_0F3A14_P_2
) },
6566 /* PREFIX_VEX_0F3A15 */
6570 { VEX_LEN_TABLE (VEX_LEN_0F3A15_P_2
) },
6573 /* PREFIX_VEX_0F3A16 */
6577 { VEX_LEN_TABLE (VEX_LEN_0F3A16_P_2
) },
6580 /* PREFIX_VEX_0F3A17 */
6584 { VEX_LEN_TABLE (VEX_LEN_0F3A17_P_2
) },
6587 /* PREFIX_VEX_0F3A18 */
6591 { VEX_LEN_TABLE (VEX_LEN_0F3A18_P_2
) },
6594 /* PREFIX_VEX_0F3A19 */
6598 { VEX_LEN_TABLE (VEX_LEN_0F3A19_P_2
) },
6601 /* PREFIX_VEX_0F3A1D */
6605 { "vcvtps2ph", { EXxmmq
, XM
, Ib
}, 0 },
6608 /* PREFIX_VEX_0F3A20 */
6612 { VEX_LEN_TABLE (VEX_LEN_0F3A20_P_2
) },
6615 /* PREFIX_VEX_0F3A21 */
6619 { VEX_LEN_TABLE (VEX_LEN_0F3A21_P_2
) },
6622 /* PREFIX_VEX_0F3A22 */
6626 { VEX_LEN_TABLE (VEX_LEN_0F3A22_P_2
) },
6629 /* PREFIX_VEX_0F3A30 */
6633 { VEX_LEN_TABLE (VEX_LEN_0F3A30_P_2
) },
6636 /* PREFIX_VEX_0F3A31 */
6640 { VEX_LEN_TABLE (VEX_LEN_0F3A31_P_2
) },
6643 /* PREFIX_VEX_0F3A32 */
6647 { VEX_LEN_TABLE (VEX_LEN_0F3A32_P_2
) },
6650 /* PREFIX_VEX_0F3A33 */
6654 { VEX_LEN_TABLE (VEX_LEN_0F3A33_P_2
) },
6657 /* PREFIX_VEX_0F3A38 */
6661 { VEX_LEN_TABLE (VEX_LEN_0F3A38_P_2
) },
6664 /* PREFIX_VEX_0F3A39 */
6668 { VEX_LEN_TABLE (VEX_LEN_0F3A39_P_2
) },
6671 /* PREFIX_VEX_0F3A40 */
6675 { VEX_W_TABLE (VEX_W_0F3A40_P_2
) },
6678 /* PREFIX_VEX_0F3A41 */
6682 { VEX_LEN_TABLE (VEX_LEN_0F3A41_P_2
) },
6685 /* PREFIX_VEX_0F3A42 */
6689 { VEX_W_TABLE (VEX_W_0F3A42_P_2
) },
6692 /* PREFIX_VEX_0F3A44 */
6696 { VEX_LEN_TABLE (VEX_LEN_0F3A44_P_2
) },
6699 /* PREFIX_VEX_0F3A46 */
6703 { VEX_LEN_TABLE (VEX_LEN_0F3A46_P_2
) },
6706 /* PREFIX_VEX_0F3A48 */
6710 { VEX_W_TABLE (VEX_W_0F3A48_P_2
) },
6713 /* PREFIX_VEX_0F3A49 */
6717 { VEX_W_TABLE (VEX_W_0F3A49_P_2
) },
6720 /* PREFIX_VEX_0F3A4A */
6724 { VEX_W_TABLE (VEX_W_0F3A4A_P_2
) },
6727 /* PREFIX_VEX_0F3A4B */
6731 { VEX_W_TABLE (VEX_W_0F3A4B_P_2
) },
6734 /* PREFIX_VEX_0F3A4C */
6738 { VEX_W_TABLE (VEX_W_0F3A4C_P_2
) },
6741 /* PREFIX_VEX_0F3A5C */
6745 { "vfmaddsubps", { XMVexW
, Vex
, EXVexW
, EXVexW
, VexI4
}, 0 },
6748 /* PREFIX_VEX_0F3A5D */
6752 { "vfmaddsubpd", { XMVexW
, Vex
, EXVexW
, EXVexW
, VexI4
}, 0 },
6755 /* PREFIX_VEX_0F3A5E */
6759 { "vfmsubaddps", { XMVexW
, Vex
, EXVexW
, EXVexW
, VexI4
}, 0 },
6762 /* PREFIX_VEX_0F3A5F */
6766 { "vfmsubaddpd", { XMVexW
, Vex
, EXVexW
, EXVexW
, VexI4
}, 0 },
6769 /* PREFIX_VEX_0F3A60 */
6773 { VEX_LEN_TABLE (VEX_LEN_0F3A60_P_2
) },
6777 /* PREFIX_VEX_0F3A61 */
6781 { VEX_LEN_TABLE (VEX_LEN_0F3A61_P_2
) },
6784 /* PREFIX_VEX_0F3A62 */
6788 { VEX_LEN_TABLE (VEX_LEN_0F3A62_P_2
) },
6791 /* PREFIX_VEX_0F3A63 */
6795 { VEX_LEN_TABLE (VEX_LEN_0F3A63_P_2
) },
6798 /* PREFIX_VEX_0F3A68 */
6802 { "vfmaddps", { XMVexW
, Vex
, EXVexW
, EXVexW
, VexI4
}, 0 },
6805 /* PREFIX_VEX_0F3A69 */
6809 { "vfmaddpd", { XMVexW
, Vex
, EXVexW
, EXVexW
, VexI4
}, 0 },
6812 /* PREFIX_VEX_0F3A6A */
6816 { VEX_LEN_TABLE (VEX_LEN_0F3A6A_P_2
) },
6819 /* PREFIX_VEX_0F3A6B */
6823 { VEX_LEN_TABLE (VEX_LEN_0F3A6B_P_2
) },
6826 /* PREFIX_VEX_0F3A6C */
6830 { "vfmsubps", { XMVexW
, Vex
, EXVexW
, EXVexW
, VexI4
}, 0 },
6833 /* PREFIX_VEX_0F3A6D */
6837 { "vfmsubpd", { XMVexW
, Vex
, EXVexW
, EXVexW
, VexI4
}, 0 },
6840 /* PREFIX_VEX_0F3A6E */
6844 { VEX_LEN_TABLE (VEX_LEN_0F3A6E_P_2
) },
6847 /* PREFIX_VEX_0F3A6F */
6851 { VEX_LEN_TABLE (VEX_LEN_0F3A6F_P_2
) },
6854 /* PREFIX_VEX_0F3A78 */
6858 { "vfnmaddps", { XMVexW
, Vex
, EXVexW
, EXVexW
, VexI4
}, 0 },
6861 /* PREFIX_VEX_0F3A79 */
6865 { "vfnmaddpd", { XMVexW
, Vex
, EXVexW
, EXVexW
, VexI4
}, 0 },
6868 /* PREFIX_VEX_0F3A7A */
6872 { VEX_LEN_TABLE (VEX_LEN_0F3A7A_P_2
) },
6875 /* PREFIX_VEX_0F3A7B */
6879 { VEX_LEN_TABLE (VEX_LEN_0F3A7B_P_2
) },
6882 /* PREFIX_VEX_0F3A7C */
6886 { "vfnmsubps", { XMVexW
, Vex
, EXVexW
, EXVexW
, VexI4
}, 0 },
6890 /* PREFIX_VEX_0F3A7D */
6894 { "vfnmsubpd", { XMVexW
, Vex
, EXVexW
, EXVexW
, VexI4
}, 0 },
6897 /* PREFIX_VEX_0F3A7E */
6901 { VEX_LEN_TABLE (VEX_LEN_0F3A7E_P_2
) },
6904 /* PREFIX_VEX_0F3A7F */
6908 { VEX_LEN_TABLE (VEX_LEN_0F3A7F_P_2
) },
6911 /* PREFIX_VEX_0F3ACE */
6915 { VEX_W_TABLE (VEX_W_0F3ACE_P_2
) },
6918 /* PREFIX_VEX_0F3ACF */
6922 { VEX_W_TABLE (VEX_W_0F3ACF_P_2
) },
6925 /* PREFIX_VEX_0F3ADF */
6929 { VEX_LEN_TABLE (VEX_LEN_0F3ADF_P_2
) },
6932 /* PREFIX_VEX_0F3AF0 */
6937 { VEX_LEN_TABLE (VEX_LEN_0F3AF0_P_3
) },
6940 #define NEED_PREFIX_TABLE
6941 #include "i386-dis-evex.h"
6942 #undef NEED_PREFIX_TABLE
6945 static const struct dis386 x86_64_table
[][2] = {
6948 { "pushP", { es
}, 0 },
6953 { "popP", { es
}, 0 },
6958 { "pushP", { cs
}, 0 },
6963 { "pushP", { ss
}, 0 },
6968 { "popP", { ss
}, 0 },
6973 { "pushP", { ds
}, 0 },
6978 { "popP", { ds
}, 0 },
6983 { "daa", { XX
}, 0 },
6988 { "das", { XX
}, 0 },
6993 { "aaa", { XX
}, 0 },
6998 { "aas", { XX
}, 0 },
7003 { "pushaP", { XX
}, 0 },
7008 { "popaP", { XX
}, 0 },
7013 { MOD_TABLE (MOD_62_32BIT
) },
7014 { EVEX_TABLE (EVEX_0F
) },
7019 { "arpl", { Ew
, Gw
}, 0 },
7020 { "movs{lq|xd}", { Gv
, Ed
}, 0 },
7025 { "ins{R|}", { Yzr
, indirDX
}, 0 },
7026 { "ins{G|}", { Yzr
, indirDX
}, 0 },
7031 { "outs{R|}", { indirDXr
, Xz
}, 0 },
7032 { "outs{G|}", { indirDXr
, Xz
}, 0 },
7037 /* Opcode 0x82 is an alias of opcode 0x80 in 32-bit mode. */
7038 { REG_TABLE (REG_80
) },
7043 { "Jcall{T|}", { Ap
}, 0 },
7048 { MOD_TABLE (MOD_C4_32BIT
) },
7049 { VEX_C4_TABLE (VEX_0F
) },
7054 { MOD_TABLE (MOD_C5_32BIT
) },
7055 { VEX_C5_TABLE (VEX_0F
) },
7060 { "into", { XX
}, 0 },
7065 { "aam", { Ib
}, 0 },
7070 { "aad", { Ib
}, 0 },
7075 { "callP", { Jv
, BND
}, 0 },
7076 { "call@", { Jv
, BND
}, 0 }
7081 { "jmpP", { Jv
, BND
}, 0 },
7082 { "jmp@", { Jv
, BND
}, 0 }
7087 { "Jjmp{T|}", { Ap
}, 0 },
7090 /* X86_64_0F01_REG_0 */
7092 { "sgdt{Q|IQ}", { M
}, 0 },
7093 { "sgdt", { M
}, 0 },
7096 /* X86_64_0F01_REG_1 */
7098 { "sidt{Q|IQ}", { M
}, 0 },
7099 { "sidt", { M
}, 0 },
7102 /* X86_64_0F01_REG_2 */
7104 { "lgdt{Q|Q}", { M
}, 0 },
7105 { "lgdt", { M
}, 0 },
7108 /* X86_64_0F01_REG_3 */
7110 { "lidt{Q|Q}", { M
}, 0 },
7111 { "lidt", { M
}, 0 },
7115 static const struct dis386 three_byte_table
[][256] = {
7117 /* THREE_BYTE_0F38 */
7120 { "pshufb", { MX
, EM
}, PREFIX_OPCODE
},
7121 { "phaddw", { MX
, EM
}, PREFIX_OPCODE
},
7122 { "phaddd", { MX
, EM
}, PREFIX_OPCODE
},
7123 { "phaddsw", { MX
, EM
}, PREFIX_OPCODE
},
7124 { "pmaddubsw", { MX
, EM
}, PREFIX_OPCODE
},
7125 { "phsubw", { MX
, EM
}, PREFIX_OPCODE
},
7126 { "phsubd", { MX
, EM
}, PREFIX_OPCODE
},
7127 { "phsubsw", { MX
, EM
}, PREFIX_OPCODE
},
7129 { "psignb", { MX
, EM
}, PREFIX_OPCODE
},
7130 { "psignw", { MX
, EM
}, PREFIX_OPCODE
},
7131 { "psignd", { MX
, EM
}, PREFIX_OPCODE
},
7132 { "pmulhrsw", { MX
, EM
}, PREFIX_OPCODE
},
7138 { PREFIX_TABLE (PREFIX_0F3810
) },
7142 { PREFIX_TABLE (PREFIX_0F3814
) },
7143 { PREFIX_TABLE (PREFIX_0F3815
) },
7145 { PREFIX_TABLE (PREFIX_0F3817
) },
7151 { "pabsb", { MX
, EM
}, PREFIX_OPCODE
},
7152 { "pabsw", { MX
, EM
}, PREFIX_OPCODE
},
7153 { "pabsd", { MX
, EM
}, PREFIX_OPCODE
},
7156 { PREFIX_TABLE (PREFIX_0F3820
) },
7157 { PREFIX_TABLE (PREFIX_0F3821
) },
7158 { PREFIX_TABLE (PREFIX_0F3822
) },
7159 { PREFIX_TABLE (PREFIX_0F3823
) },
7160 { PREFIX_TABLE (PREFIX_0F3824
) },
7161 { PREFIX_TABLE (PREFIX_0F3825
) },
7165 { PREFIX_TABLE (PREFIX_0F3828
) },
7166 { PREFIX_TABLE (PREFIX_0F3829
) },
7167 { PREFIX_TABLE (PREFIX_0F382A
) },
7168 { PREFIX_TABLE (PREFIX_0F382B
) },
7174 { PREFIX_TABLE (PREFIX_0F3830
) },
7175 { PREFIX_TABLE (PREFIX_0F3831
) },
7176 { PREFIX_TABLE (PREFIX_0F3832
) },
7177 { PREFIX_TABLE (PREFIX_0F3833
) },
7178 { PREFIX_TABLE (PREFIX_0F3834
) },
7179 { PREFIX_TABLE (PREFIX_0F3835
) },
7181 { PREFIX_TABLE (PREFIX_0F3837
) },
7183 { PREFIX_TABLE (PREFIX_0F3838
) },
7184 { PREFIX_TABLE (PREFIX_0F3839
) },
7185 { PREFIX_TABLE (PREFIX_0F383A
) },
7186 { PREFIX_TABLE (PREFIX_0F383B
) },
7187 { PREFIX_TABLE (PREFIX_0F383C
) },
7188 { PREFIX_TABLE (PREFIX_0F383D
) },
7189 { PREFIX_TABLE (PREFIX_0F383E
) },
7190 { PREFIX_TABLE (PREFIX_0F383F
) },
7192 { PREFIX_TABLE (PREFIX_0F3840
) },
7193 { PREFIX_TABLE (PREFIX_0F3841
) },
7264 { PREFIX_TABLE (PREFIX_0F3880
) },
7265 { PREFIX_TABLE (PREFIX_0F3881
) },
7266 { PREFIX_TABLE (PREFIX_0F3882
) },
7345 { PREFIX_TABLE (PREFIX_0F38C8
) },
7346 { PREFIX_TABLE (PREFIX_0F38C9
) },
7347 { PREFIX_TABLE (PREFIX_0F38CA
) },
7348 { PREFIX_TABLE (PREFIX_0F38CB
) },
7349 { PREFIX_TABLE (PREFIX_0F38CC
) },
7350 { PREFIX_TABLE (PREFIX_0F38CD
) },
7352 { PREFIX_TABLE (PREFIX_0F38CF
) },
7366 { PREFIX_TABLE (PREFIX_0F38DB
) },
7367 { PREFIX_TABLE (PREFIX_0F38DC
) },
7368 { PREFIX_TABLE (PREFIX_0F38DD
) },
7369 { PREFIX_TABLE (PREFIX_0F38DE
) },
7370 { PREFIX_TABLE (PREFIX_0F38DF
) },
7390 { PREFIX_TABLE (PREFIX_0F38F0
) },
7391 { PREFIX_TABLE (PREFIX_0F38F1
) },
7395 { PREFIX_TABLE (PREFIX_0F38F5
) },
7396 { PREFIX_TABLE (PREFIX_0F38F6
) },
7408 /* THREE_BYTE_0F3A */
7420 { PREFIX_TABLE (PREFIX_0F3A08
) },
7421 { PREFIX_TABLE (PREFIX_0F3A09
) },
7422 { PREFIX_TABLE (PREFIX_0F3A0A
) },
7423 { PREFIX_TABLE (PREFIX_0F3A0B
) },
7424 { PREFIX_TABLE (PREFIX_0F3A0C
) },
7425 { PREFIX_TABLE (PREFIX_0F3A0D
) },
7426 { PREFIX_TABLE (PREFIX_0F3A0E
) },
7427 { "palignr", { MX
, EM
, Ib
}, PREFIX_OPCODE
},
7433 { PREFIX_TABLE (PREFIX_0F3A14
) },
7434 { PREFIX_TABLE (PREFIX_0F3A15
) },
7435 { PREFIX_TABLE (PREFIX_0F3A16
) },
7436 { PREFIX_TABLE (PREFIX_0F3A17
) },
7447 { PREFIX_TABLE (PREFIX_0F3A20
) },
7448 { PREFIX_TABLE (PREFIX_0F3A21
) },
7449 { PREFIX_TABLE (PREFIX_0F3A22
) },
7483 { PREFIX_TABLE (PREFIX_0F3A40
) },
7484 { PREFIX_TABLE (PREFIX_0F3A41
) },
7485 { PREFIX_TABLE (PREFIX_0F3A42
) },
7487 { PREFIX_TABLE (PREFIX_0F3A44
) },
7519 { PREFIX_TABLE (PREFIX_0F3A60
) },
7520 { PREFIX_TABLE (PREFIX_0F3A61
) },
7521 { PREFIX_TABLE (PREFIX_0F3A62
) },
7522 { PREFIX_TABLE (PREFIX_0F3A63
) },
7640 { PREFIX_TABLE (PREFIX_0F3ACC
) },
7642 { PREFIX_TABLE (PREFIX_0F3ACE
) },
7643 { PREFIX_TABLE (PREFIX_0F3ACF
) },
7661 { PREFIX_TABLE (PREFIX_0F3ADF
) },
7701 static const struct dis386 xop_table
[][256] = {
7854 { "vpmacssww", { XMVexW
, Vex
, EXVexW
, EXVexW
, VexI4
}, 0 },
7855 { "vpmacsswd", { XMVexW
, Vex
, EXVexW
, EXVexW
, VexI4
}, 0 },
7856 { "vpmacssdql", { XMVexW
, Vex
, EXVexW
, EXVexW
, VexI4
}, 0 },
7864 { "vpmacssdd", { XMVexW
, Vex
, EXVexW
, EXVexW
, VexI4
}, 0 },
7865 { "vpmacssdqh", { XMVexW
, Vex
, EXVexW
, EXVexW
, VexI4
}, 0 },
7872 { "vpmacsww", { XMVexW
, Vex
, EXVexW
, EXVexW
, VexI4
}, 0 },
7873 { "vpmacswd", { XMVexW
, Vex
, EXVexW
, EXVexW
, VexI4
}, 0 },
7874 { "vpmacsdql", { XMVexW
, Vex
, EXVexW
, EXVexW
, VexI4
}, 0 },
7882 { "vpmacsdd", { XMVexW
, Vex
, EXVexW
, EXVexW
, VexI4
}, 0 },
7883 { "vpmacsdqh", { XMVexW
, Vex
, EXVexW
, EXVexW
, VexI4
}, 0 },
7887 { "vpcmov", { XMVexW
, Vex
, EXVexW
, EXVexW
, VexI4
}, 0 },
7888 { "vpperm", { XMVexW
, Vex
, EXVexW
, EXVexW
, VexI4
}, 0 },
7891 { "vpmadcsswd", { XMVexW
, Vex
, EXVexW
, EXVexW
, VexI4
}, 0 },
7909 { "vpmadcswd", { XMVexW
, Vex
, EXVexW
, EXVexW
, VexI4
}, 0 },
7921 { "vprotb", { XM
, Vex_2src_1
, Ib
}, 0 },
7922 { "vprotw", { XM
, Vex_2src_1
, Ib
}, 0 },
7923 { "vprotd", { XM
, Vex_2src_1
, Ib
}, 0 },
7924 { "vprotq", { XM
, Vex_2src_1
, Ib
}, 0 },
7934 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CC
) },
7935 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CD
) },
7936 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CE
) },
7937 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CF
) },
7970 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EC
) },
7971 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_ED
) },
7972 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EE
) },
7973 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EF
) },
7997 { REG_TABLE (REG_XOP_TBM_01
) },
7998 { REG_TABLE (REG_XOP_TBM_02
) },
8016 { REG_TABLE (REG_XOP_LWPCB
) },
8140 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_80
) },
8141 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_81
) },
8142 { "vfrczss", { XM
, EXd
}, 0 },
8143 { "vfrczsd", { XM
, EXq
}, 0 },
8158 { "vprotb", { XM
, Vex_2src_1
, Vex_2src_2
}, 0 },
8159 { "vprotw", { XM
, Vex_2src_1
, Vex_2src_2
}, 0 },
8160 { "vprotd", { XM
, Vex_2src_1
, Vex_2src_2
}, 0 },
8161 { "vprotq", { XM
, Vex_2src_1
, Vex_2src_2
}, 0 },
8162 { "vpshlb", { XM
, Vex_2src_1
, Vex_2src_2
}, 0 },
8163 { "vpshlw", { XM
, Vex_2src_1
, Vex_2src_2
}, 0 },
8164 { "vpshld", { XM
, Vex_2src_1
, Vex_2src_2
}, 0 },
8165 { "vpshlq", { XM
, Vex_2src_1
, Vex_2src_2
}, 0 },
8167 { "vpshab", { XM
, Vex_2src_1
, Vex_2src_2
}, 0 },
8168 { "vpshaw", { XM
, Vex_2src_1
, Vex_2src_2
}, 0 },
8169 { "vpshad", { XM
, Vex_2src_1
, Vex_2src_2
}, 0 },
8170 { "vpshaq", { XM
, Vex_2src_1
, Vex_2src_2
}, 0 },
8213 { "vphaddbw", { XM
, EXxmm
}, 0 },
8214 { "vphaddbd", { XM
, EXxmm
}, 0 },
8215 { "vphaddbq", { XM
, EXxmm
}, 0 },
8218 { "vphaddwd", { XM
, EXxmm
}, 0 },
8219 { "vphaddwq", { XM
, EXxmm
}, 0 },
8224 { "vphadddq", { XM
, EXxmm
}, 0 },
8231 { "vphaddubw", { XM
, EXxmm
}, 0 },
8232 { "vphaddubd", { XM
, EXxmm
}, 0 },
8233 { "vphaddubq", { XM
, EXxmm
}, 0 },
8236 { "vphadduwd", { XM
, EXxmm
}, 0 },
8237 { "vphadduwq", { XM
, EXxmm
}, 0 },
8242 { "vphaddudq", { XM
, EXxmm
}, 0 },
8249 { "vphsubbw", { XM
, EXxmm
}, 0 },
8250 { "vphsubwd", { XM
, EXxmm
}, 0 },
8251 { "vphsubdq", { XM
, EXxmm
}, 0 },
8305 { "bextr", { Gv
, Ev
, Iq
}, 0 },
8307 { REG_TABLE (REG_XOP_LWP
) },
8577 static const struct dis386 vex_table
[][256] = {
8599 { PREFIX_TABLE (PREFIX_VEX_0F10
) },
8600 { PREFIX_TABLE (PREFIX_VEX_0F11
) },
8601 { PREFIX_TABLE (PREFIX_VEX_0F12
) },
8602 { MOD_TABLE (MOD_VEX_0F13
) },
8603 { VEX_W_TABLE (VEX_W_0F14
) },
8604 { VEX_W_TABLE (VEX_W_0F15
) },
8605 { PREFIX_TABLE (PREFIX_VEX_0F16
) },
8606 { MOD_TABLE (MOD_VEX_0F17
) },
8626 { VEX_W_TABLE (VEX_W_0F28
) },
8627 { VEX_W_TABLE (VEX_W_0F29
) },
8628 { PREFIX_TABLE (PREFIX_VEX_0F2A
) },
8629 { MOD_TABLE (MOD_VEX_0F2B
) },
8630 { PREFIX_TABLE (PREFIX_VEX_0F2C
) },
8631 { PREFIX_TABLE (PREFIX_VEX_0F2D
) },
8632 { PREFIX_TABLE (PREFIX_VEX_0F2E
) },
8633 { PREFIX_TABLE (PREFIX_VEX_0F2F
) },
8654 { PREFIX_TABLE (PREFIX_VEX_0F41
) },
8655 { PREFIX_TABLE (PREFIX_VEX_0F42
) },
8657 { PREFIX_TABLE (PREFIX_VEX_0F44
) },
8658 { PREFIX_TABLE (PREFIX_VEX_0F45
) },
8659 { PREFIX_TABLE (PREFIX_VEX_0F46
) },
8660 { PREFIX_TABLE (PREFIX_VEX_0F47
) },
8664 { PREFIX_TABLE (PREFIX_VEX_0F4A
) },
8665 { PREFIX_TABLE (PREFIX_VEX_0F4B
) },
8671 { MOD_TABLE (MOD_VEX_0F50
) },
8672 { PREFIX_TABLE (PREFIX_VEX_0F51
) },
8673 { PREFIX_TABLE (PREFIX_VEX_0F52
) },
8674 { PREFIX_TABLE (PREFIX_VEX_0F53
) },
8675 { "vandpX", { XM
, Vex
, EXx
}, 0 },
8676 { "vandnpX", { XM
, Vex
, EXx
}, 0 },
8677 { "vorpX", { XM
, Vex
, EXx
}, 0 },
8678 { "vxorpX", { XM
, Vex
, EXx
}, 0 },
8680 { PREFIX_TABLE (PREFIX_VEX_0F58
) },
8681 { PREFIX_TABLE (PREFIX_VEX_0F59
) },
8682 { PREFIX_TABLE (PREFIX_VEX_0F5A
) },
8683 { PREFIX_TABLE (PREFIX_VEX_0F5B
) },
8684 { PREFIX_TABLE (PREFIX_VEX_0F5C
) },
8685 { PREFIX_TABLE (PREFIX_VEX_0F5D
) },
8686 { PREFIX_TABLE (PREFIX_VEX_0F5E
) },
8687 { PREFIX_TABLE (PREFIX_VEX_0F5F
) },
8689 { PREFIX_TABLE (PREFIX_VEX_0F60
) },
8690 { PREFIX_TABLE (PREFIX_VEX_0F61
) },
8691 { PREFIX_TABLE (PREFIX_VEX_0F62
) },
8692 { PREFIX_TABLE (PREFIX_VEX_0F63
) },
8693 { PREFIX_TABLE (PREFIX_VEX_0F64
) },
8694 { PREFIX_TABLE (PREFIX_VEX_0F65
) },
8695 { PREFIX_TABLE (PREFIX_VEX_0F66
) },
8696 { PREFIX_TABLE (PREFIX_VEX_0F67
) },
8698 { PREFIX_TABLE (PREFIX_VEX_0F68
) },
8699 { PREFIX_TABLE (PREFIX_VEX_0F69
) },
8700 { PREFIX_TABLE (PREFIX_VEX_0F6A
) },
8701 { PREFIX_TABLE (PREFIX_VEX_0F6B
) },
8702 { PREFIX_TABLE (PREFIX_VEX_0F6C
) },
8703 { PREFIX_TABLE (PREFIX_VEX_0F6D
) },
8704 { PREFIX_TABLE (PREFIX_VEX_0F6E
) },
8705 { PREFIX_TABLE (PREFIX_VEX_0F6F
) },
8707 { PREFIX_TABLE (PREFIX_VEX_0F70
) },
8708 { REG_TABLE (REG_VEX_0F71
) },
8709 { REG_TABLE (REG_VEX_0F72
) },
8710 { REG_TABLE (REG_VEX_0F73
) },
8711 { PREFIX_TABLE (PREFIX_VEX_0F74
) },
8712 { PREFIX_TABLE (PREFIX_VEX_0F75
) },
8713 { PREFIX_TABLE (PREFIX_VEX_0F76
) },
8714 { PREFIX_TABLE (PREFIX_VEX_0F77
) },
8720 { PREFIX_TABLE (PREFIX_VEX_0F7C
) },
8721 { PREFIX_TABLE (PREFIX_VEX_0F7D
) },
8722 { PREFIX_TABLE (PREFIX_VEX_0F7E
) },
8723 { PREFIX_TABLE (PREFIX_VEX_0F7F
) },
8743 { PREFIX_TABLE (PREFIX_VEX_0F90
) },
8744 { PREFIX_TABLE (PREFIX_VEX_0F91
) },
8745 { PREFIX_TABLE (PREFIX_VEX_0F92
) },
8746 { PREFIX_TABLE (PREFIX_VEX_0F93
) },
8752 { PREFIX_TABLE (PREFIX_VEX_0F98
) },
8753 { PREFIX_TABLE (PREFIX_VEX_0F99
) },
8776 { REG_TABLE (REG_VEX_0FAE
) },
8799 { PREFIX_TABLE (PREFIX_VEX_0FC2
) },
8801 { PREFIX_TABLE (PREFIX_VEX_0FC4
) },
8802 { PREFIX_TABLE (PREFIX_VEX_0FC5
) },
8803 { "vshufpX", { XM
, Vex
, EXx
, Ib
}, 0 },
8815 { PREFIX_TABLE (PREFIX_VEX_0FD0
) },
8816 { PREFIX_TABLE (PREFIX_VEX_0FD1
) },
8817 { PREFIX_TABLE (PREFIX_VEX_0FD2
) },
8818 { PREFIX_TABLE (PREFIX_VEX_0FD3
) },
8819 { PREFIX_TABLE (PREFIX_VEX_0FD4
) },
8820 { PREFIX_TABLE (PREFIX_VEX_0FD5
) },
8821 { PREFIX_TABLE (PREFIX_VEX_0FD6
) },
8822 { PREFIX_TABLE (PREFIX_VEX_0FD7
) },
8824 { PREFIX_TABLE (PREFIX_VEX_0FD8
) },
8825 { PREFIX_TABLE (PREFIX_VEX_0FD9
) },
8826 { PREFIX_TABLE (PREFIX_VEX_0FDA
) },
8827 { PREFIX_TABLE (PREFIX_VEX_0FDB
) },
8828 { PREFIX_TABLE (PREFIX_VEX_0FDC
) },
8829 { PREFIX_TABLE (PREFIX_VEX_0FDD
) },
8830 { PREFIX_TABLE (PREFIX_VEX_0FDE
) },
8831 { PREFIX_TABLE (PREFIX_VEX_0FDF
) },
8833 { PREFIX_TABLE (PREFIX_VEX_0FE0
) },
8834 { PREFIX_TABLE (PREFIX_VEX_0FE1
) },
8835 { PREFIX_TABLE (PREFIX_VEX_0FE2
) },
8836 { PREFIX_TABLE (PREFIX_VEX_0FE3
) },
8837 { PREFIX_TABLE (PREFIX_VEX_0FE4
) },
8838 { PREFIX_TABLE (PREFIX_VEX_0FE5
) },
8839 { PREFIX_TABLE (PREFIX_VEX_0FE6
) },
8840 { PREFIX_TABLE (PREFIX_VEX_0FE7
) },
8842 { PREFIX_TABLE (PREFIX_VEX_0FE8
) },
8843 { PREFIX_TABLE (PREFIX_VEX_0FE9
) },
8844 { PREFIX_TABLE (PREFIX_VEX_0FEA
) },
8845 { PREFIX_TABLE (PREFIX_VEX_0FEB
) },
8846 { PREFIX_TABLE (PREFIX_VEX_0FEC
) },
8847 { PREFIX_TABLE (PREFIX_VEX_0FED
) },
8848 { PREFIX_TABLE (PREFIX_VEX_0FEE
) },
8849 { PREFIX_TABLE (PREFIX_VEX_0FEF
) },
8851 { PREFIX_TABLE (PREFIX_VEX_0FF0
) },
8852 { PREFIX_TABLE (PREFIX_VEX_0FF1
) },
8853 { PREFIX_TABLE (PREFIX_VEX_0FF2
) },
8854 { PREFIX_TABLE (PREFIX_VEX_0FF3
) },
8855 { PREFIX_TABLE (PREFIX_VEX_0FF4
) },
8856 { PREFIX_TABLE (PREFIX_VEX_0FF5
) },
8857 { PREFIX_TABLE (PREFIX_VEX_0FF6
) },
8858 { PREFIX_TABLE (PREFIX_VEX_0FF7
) },
8860 { PREFIX_TABLE (PREFIX_VEX_0FF8
) },
8861 { PREFIX_TABLE (PREFIX_VEX_0FF9
) },
8862 { PREFIX_TABLE (PREFIX_VEX_0FFA
) },
8863 { PREFIX_TABLE (PREFIX_VEX_0FFB
) },
8864 { PREFIX_TABLE (PREFIX_VEX_0FFC
) },
8865 { PREFIX_TABLE (PREFIX_VEX_0FFD
) },
8866 { PREFIX_TABLE (PREFIX_VEX_0FFE
) },
8872 { PREFIX_TABLE (PREFIX_VEX_0F3800
) },
8873 { PREFIX_TABLE (PREFIX_VEX_0F3801
) },
8874 { PREFIX_TABLE (PREFIX_VEX_0F3802
) },
8875 { PREFIX_TABLE (PREFIX_VEX_0F3803
) },
8876 { PREFIX_TABLE (PREFIX_VEX_0F3804
) },
8877 { PREFIX_TABLE (PREFIX_VEX_0F3805
) },
8878 { PREFIX_TABLE (PREFIX_VEX_0F3806
) },
8879 { PREFIX_TABLE (PREFIX_VEX_0F3807
) },
8881 { PREFIX_TABLE (PREFIX_VEX_0F3808
) },
8882 { PREFIX_TABLE (PREFIX_VEX_0F3809
) },
8883 { PREFIX_TABLE (PREFIX_VEX_0F380A
) },
8884 { PREFIX_TABLE (PREFIX_VEX_0F380B
) },
8885 { PREFIX_TABLE (PREFIX_VEX_0F380C
) },
8886 { PREFIX_TABLE (PREFIX_VEX_0F380D
) },
8887 { PREFIX_TABLE (PREFIX_VEX_0F380E
) },
8888 { PREFIX_TABLE (PREFIX_VEX_0F380F
) },
8893 { PREFIX_TABLE (PREFIX_VEX_0F3813
) },
8896 { PREFIX_TABLE (PREFIX_VEX_0F3816
) },
8897 { PREFIX_TABLE (PREFIX_VEX_0F3817
) },
8899 { PREFIX_TABLE (PREFIX_VEX_0F3818
) },
8900 { PREFIX_TABLE (PREFIX_VEX_0F3819
) },
8901 { PREFIX_TABLE (PREFIX_VEX_0F381A
) },
8903 { PREFIX_TABLE (PREFIX_VEX_0F381C
) },
8904 { PREFIX_TABLE (PREFIX_VEX_0F381D
) },
8905 { PREFIX_TABLE (PREFIX_VEX_0F381E
) },
8908 { PREFIX_TABLE (PREFIX_VEX_0F3820
) },
8909 { PREFIX_TABLE (PREFIX_VEX_0F3821
) },
8910 { PREFIX_TABLE (PREFIX_VEX_0F3822
) },
8911 { PREFIX_TABLE (PREFIX_VEX_0F3823
) },
8912 { PREFIX_TABLE (PREFIX_VEX_0F3824
) },
8913 { PREFIX_TABLE (PREFIX_VEX_0F3825
) },
8917 { PREFIX_TABLE (PREFIX_VEX_0F3828
) },
8918 { PREFIX_TABLE (PREFIX_VEX_0F3829
) },
8919 { PREFIX_TABLE (PREFIX_VEX_0F382A
) },
8920 { PREFIX_TABLE (PREFIX_VEX_0F382B
) },
8921 { PREFIX_TABLE (PREFIX_VEX_0F382C
) },
8922 { PREFIX_TABLE (PREFIX_VEX_0F382D
) },
8923 { PREFIX_TABLE (PREFIX_VEX_0F382E
) },
8924 { PREFIX_TABLE (PREFIX_VEX_0F382F
) },
8926 { PREFIX_TABLE (PREFIX_VEX_0F3830
) },
8927 { PREFIX_TABLE (PREFIX_VEX_0F3831
) },
8928 { PREFIX_TABLE (PREFIX_VEX_0F3832
) },
8929 { PREFIX_TABLE (PREFIX_VEX_0F3833
) },
8930 { PREFIX_TABLE (PREFIX_VEX_0F3834
) },
8931 { PREFIX_TABLE (PREFIX_VEX_0F3835
) },
8932 { PREFIX_TABLE (PREFIX_VEX_0F3836
) },
8933 { PREFIX_TABLE (PREFIX_VEX_0F3837
) },
8935 { PREFIX_TABLE (PREFIX_VEX_0F3838
) },
8936 { PREFIX_TABLE (PREFIX_VEX_0F3839
) },
8937 { PREFIX_TABLE (PREFIX_VEX_0F383A
) },
8938 { PREFIX_TABLE (PREFIX_VEX_0F383B
) },
8939 { PREFIX_TABLE (PREFIX_VEX_0F383C
) },
8940 { PREFIX_TABLE (PREFIX_VEX_0F383D
) },
8941 { PREFIX_TABLE (PREFIX_VEX_0F383E
) },
8942 { PREFIX_TABLE (PREFIX_VEX_0F383F
) },
8944 { PREFIX_TABLE (PREFIX_VEX_0F3840
) },
8945 { PREFIX_TABLE (PREFIX_VEX_0F3841
) },
8949 { PREFIX_TABLE (PREFIX_VEX_0F3845
) },
8950 { PREFIX_TABLE (PREFIX_VEX_0F3846
) },
8951 { PREFIX_TABLE (PREFIX_VEX_0F3847
) },
8971 { PREFIX_TABLE (PREFIX_VEX_0F3858
) },
8972 { PREFIX_TABLE (PREFIX_VEX_0F3859
) },
8973 { PREFIX_TABLE (PREFIX_VEX_0F385A
) },
9007 { PREFIX_TABLE (PREFIX_VEX_0F3878
) },
9008 { PREFIX_TABLE (PREFIX_VEX_0F3879
) },
9029 { PREFIX_TABLE (PREFIX_VEX_0F388C
) },
9031 { PREFIX_TABLE (PREFIX_VEX_0F388E
) },
9034 { PREFIX_TABLE (PREFIX_VEX_0F3890
) },
9035 { PREFIX_TABLE (PREFIX_VEX_0F3891
) },
9036 { PREFIX_TABLE (PREFIX_VEX_0F3892
) },
9037 { PREFIX_TABLE (PREFIX_VEX_0F3893
) },
9040 { PREFIX_TABLE (PREFIX_VEX_0F3896
) },
9041 { PREFIX_TABLE (PREFIX_VEX_0F3897
) },
9043 { PREFIX_TABLE (PREFIX_VEX_0F3898
) },
9044 { PREFIX_TABLE (PREFIX_VEX_0F3899
) },
9045 { PREFIX_TABLE (PREFIX_VEX_0F389A
) },
9046 { PREFIX_TABLE (PREFIX_VEX_0F389B
) },
9047 { PREFIX_TABLE (PREFIX_VEX_0F389C
) },
9048 { PREFIX_TABLE (PREFIX_VEX_0F389D
) },
9049 { PREFIX_TABLE (PREFIX_VEX_0F389E
) },
9050 { PREFIX_TABLE (PREFIX_VEX_0F389F
) },
9058 { PREFIX_TABLE (PREFIX_VEX_0F38A6
) },
9059 { PREFIX_TABLE (PREFIX_VEX_0F38A7
) },
9061 { PREFIX_TABLE (PREFIX_VEX_0F38A8
) },
9062 { PREFIX_TABLE (PREFIX_VEX_0F38A9
) },
9063 { PREFIX_TABLE (PREFIX_VEX_0F38AA
) },
9064 { PREFIX_TABLE (PREFIX_VEX_0F38AB
) },
9065 { PREFIX_TABLE (PREFIX_VEX_0F38AC
) },
9066 { PREFIX_TABLE (PREFIX_VEX_0F38AD
) },
9067 { PREFIX_TABLE (PREFIX_VEX_0F38AE
) },
9068 { PREFIX_TABLE (PREFIX_VEX_0F38AF
) },
9076 { PREFIX_TABLE (PREFIX_VEX_0F38B6
) },
9077 { PREFIX_TABLE (PREFIX_VEX_0F38B7
) },
9079 { PREFIX_TABLE (PREFIX_VEX_0F38B8
) },
9080 { PREFIX_TABLE (PREFIX_VEX_0F38B9
) },
9081 { PREFIX_TABLE (PREFIX_VEX_0F38BA
) },
9082 { PREFIX_TABLE (PREFIX_VEX_0F38BB
) },
9083 { PREFIX_TABLE (PREFIX_VEX_0F38BC
) },
9084 { PREFIX_TABLE (PREFIX_VEX_0F38BD
) },
9085 { PREFIX_TABLE (PREFIX_VEX_0F38BE
) },
9086 { PREFIX_TABLE (PREFIX_VEX_0F38BF
) },
9104 { PREFIX_TABLE (PREFIX_VEX_0F38CF
) },
9118 { PREFIX_TABLE (PREFIX_VEX_0F38DB
) },
9119 { PREFIX_TABLE (PREFIX_VEX_0F38DC
) },
9120 { PREFIX_TABLE (PREFIX_VEX_0F38DD
) },
9121 { PREFIX_TABLE (PREFIX_VEX_0F38DE
) },
9122 { PREFIX_TABLE (PREFIX_VEX_0F38DF
) },
9144 { PREFIX_TABLE (PREFIX_VEX_0F38F2
) },
9145 { REG_TABLE (REG_VEX_0F38F3
) },
9147 { PREFIX_TABLE (PREFIX_VEX_0F38F5
) },
9148 { PREFIX_TABLE (PREFIX_VEX_0F38F6
) },
9149 { PREFIX_TABLE (PREFIX_VEX_0F38F7
) },
9163 { PREFIX_TABLE (PREFIX_VEX_0F3A00
) },
9164 { PREFIX_TABLE (PREFIX_VEX_0F3A01
) },
9165 { PREFIX_TABLE (PREFIX_VEX_0F3A02
) },
9167 { PREFIX_TABLE (PREFIX_VEX_0F3A04
) },
9168 { PREFIX_TABLE (PREFIX_VEX_0F3A05
) },
9169 { PREFIX_TABLE (PREFIX_VEX_0F3A06
) },
9172 { PREFIX_TABLE (PREFIX_VEX_0F3A08
) },
9173 { PREFIX_TABLE (PREFIX_VEX_0F3A09
) },
9174 { PREFIX_TABLE (PREFIX_VEX_0F3A0A
) },
9175 { PREFIX_TABLE (PREFIX_VEX_0F3A0B
) },
9176 { PREFIX_TABLE (PREFIX_VEX_0F3A0C
) },
9177 { PREFIX_TABLE (PREFIX_VEX_0F3A0D
) },
9178 { PREFIX_TABLE (PREFIX_VEX_0F3A0E
) },
9179 { PREFIX_TABLE (PREFIX_VEX_0F3A0F
) },
9185 { PREFIX_TABLE (PREFIX_VEX_0F3A14
) },
9186 { PREFIX_TABLE (PREFIX_VEX_0F3A15
) },
9187 { PREFIX_TABLE (PREFIX_VEX_0F3A16
) },
9188 { PREFIX_TABLE (PREFIX_VEX_0F3A17
) },
9190 { PREFIX_TABLE (PREFIX_VEX_0F3A18
) },
9191 { PREFIX_TABLE (PREFIX_VEX_0F3A19
) },
9195 { PREFIX_TABLE (PREFIX_VEX_0F3A1D
) },
9199 { PREFIX_TABLE (PREFIX_VEX_0F3A20
) },
9200 { PREFIX_TABLE (PREFIX_VEX_0F3A21
) },
9201 { PREFIX_TABLE (PREFIX_VEX_0F3A22
) },
9217 { PREFIX_TABLE (PREFIX_VEX_0F3A30
) },
9218 { PREFIX_TABLE (PREFIX_VEX_0F3A31
) },
9219 { PREFIX_TABLE (PREFIX_VEX_0F3A32
) },
9220 { PREFIX_TABLE (PREFIX_VEX_0F3A33
) },
9226 { PREFIX_TABLE (PREFIX_VEX_0F3A38
) },
9227 { PREFIX_TABLE (PREFIX_VEX_0F3A39
) },
9235 { PREFIX_TABLE (PREFIX_VEX_0F3A40
) },
9236 { PREFIX_TABLE (PREFIX_VEX_0F3A41
) },
9237 { PREFIX_TABLE (PREFIX_VEX_0F3A42
) },
9239 { PREFIX_TABLE (PREFIX_VEX_0F3A44
) },
9241 { PREFIX_TABLE (PREFIX_VEX_0F3A46
) },
9244 { PREFIX_TABLE (PREFIX_VEX_0F3A48
) },
9245 { PREFIX_TABLE (PREFIX_VEX_0F3A49
) },
9246 { PREFIX_TABLE (PREFIX_VEX_0F3A4A
) },
9247 { PREFIX_TABLE (PREFIX_VEX_0F3A4B
) },
9248 { PREFIX_TABLE (PREFIX_VEX_0F3A4C
) },
9266 { PREFIX_TABLE (PREFIX_VEX_0F3A5C
) },
9267 { PREFIX_TABLE (PREFIX_VEX_0F3A5D
) },
9268 { PREFIX_TABLE (PREFIX_VEX_0F3A5E
) },
9269 { PREFIX_TABLE (PREFIX_VEX_0F3A5F
) },
9271 { PREFIX_TABLE (PREFIX_VEX_0F3A60
) },
9272 { PREFIX_TABLE (PREFIX_VEX_0F3A61
) },
9273 { PREFIX_TABLE (PREFIX_VEX_0F3A62
) },
9274 { PREFIX_TABLE (PREFIX_VEX_0F3A63
) },
9280 { PREFIX_TABLE (PREFIX_VEX_0F3A68
) },
9281 { PREFIX_TABLE (PREFIX_VEX_0F3A69
) },
9282 { PREFIX_TABLE (PREFIX_VEX_0F3A6A
) },
9283 { PREFIX_TABLE (PREFIX_VEX_0F3A6B
) },
9284 { PREFIX_TABLE (PREFIX_VEX_0F3A6C
) },
9285 { PREFIX_TABLE (PREFIX_VEX_0F3A6D
) },
9286 { PREFIX_TABLE (PREFIX_VEX_0F3A6E
) },
9287 { PREFIX_TABLE (PREFIX_VEX_0F3A6F
) },
9298 { PREFIX_TABLE (PREFIX_VEX_0F3A78
) },
9299 { PREFIX_TABLE (PREFIX_VEX_0F3A79
) },
9300 { PREFIX_TABLE (PREFIX_VEX_0F3A7A
) },
9301 { PREFIX_TABLE (PREFIX_VEX_0F3A7B
) },
9302 { PREFIX_TABLE (PREFIX_VEX_0F3A7C
) },
9303 { PREFIX_TABLE (PREFIX_VEX_0F3A7D
) },
9304 { PREFIX_TABLE (PREFIX_VEX_0F3A7E
) },
9305 { PREFIX_TABLE (PREFIX_VEX_0F3A7F
) },
9394 { PREFIX_TABLE(PREFIX_VEX_0F3ACE
) },
9395 { PREFIX_TABLE(PREFIX_VEX_0F3ACF
) },
9413 { PREFIX_TABLE (PREFIX_VEX_0F3ADF
) },
9433 { PREFIX_TABLE (PREFIX_VEX_0F3AF0
) },
9453 #define NEED_OPCODE_TABLE
9454 #include "i386-dis-evex.h"
9455 #undef NEED_OPCODE_TABLE
9456 static const struct dis386 vex_len_table
[][2] = {
9457 /* VEX_LEN_0F10_P_1 */
9459 { VEX_W_TABLE (VEX_W_0F10_P_1
) },
9460 { VEX_W_TABLE (VEX_W_0F10_P_1
) },
9463 /* VEX_LEN_0F10_P_3 */
9465 { VEX_W_TABLE (VEX_W_0F10_P_3
) },
9466 { VEX_W_TABLE (VEX_W_0F10_P_3
) },
9469 /* VEX_LEN_0F11_P_1 */
9471 { VEX_W_TABLE (VEX_W_0F11_P_1
) },
9472 { VEX_W_TABLE (VEX_W_0F11_P_1
) },
9475 /* VEX_LEN_0F11_P_3 */
9477 { VEX_W_TABLE (VEX_W_0F11_P_3
) },
9478 { VEX_W_TABLE (VEX_W_0F11_P_3
) },
9481 /* VEX_LEN_0F12_P_0_M_0 */
9483 { VEX_W_TABLE (VEX_W_0F12_P_0_M_0
) },
9486 /* VEX_LEN_0F12_P_0_M_1 */
9488 { VEX_W_TABLE (VEX_W_0F12_P_0_M_1
) },
9491 /* VEX_LEN_0F12_P_2 */
9493 { VEX_W_TABLE (VEX_W_0F12_P_2
) },
9496 /* VEX_LEN_0F13_M_0 */
9498 { VEX_W_TABLE (VEX_W_0F13_M_0
) },
9501 /* VEX_LEN_0F16_P_0_M_0 */
9503 { VEX_W_TABLE (VEX_W_0F16_P_0_M_0
) },
9506 /* VEX_LEN_0F16_P_0_M_1 */
9508 { VEX_W_TABLE (VEX_W_0F16_P_0_M_1
) },
9511 /* VEX_LEN_0F16_P_2 */
9513 { VEX_W_TABLE (VEX_W_0F16_P_2
) },
9516 /* VEX_LEN_0F17_M_0 */
9518 { VEX_W_TABLE (VEX_W_0F17_M_0
) },
9521 /* VEX_LEN_0F2A_P_1 */
9523 { "vcvtsi2ss%LQ", { XMScalar
, VexScalar
, Ev
}, 0 },
9524 { "vcvtsi2ss%LQ", { XMScalar
, VexScalar
, Ev
}, 0 },
9527 /* VEX_LEN_0F2A_P_3 */
9529 { "vcvtsi2sd%LQ", { XMScalar
, VexScalar
, Ev
}, 0 },
9530 { "vcvtsi2sd%LQ", { XMScalar
, VexScalar
, Ev
}, 0 },
9533 /* VEX_LEN_0F2C_P_1 */
9535 { "vcvttss2siY", { Gv
, EXdScalar
}, 0 },
9536 { "vcvttss2siY", { Gv
, EXdScalar
}, 0 },
9539 /* VEX_LEN_0F2C_P_3 */
9541 { "vcvttsd2siY", { Gv
, EXqScalar
}, 0 },
9542 { "vcvttsd2siY", { Gv
, EXqScalar
}, 0 },
9545 /* VEX_LEN_0F2D_P_1 */
9547 { "vcvtss2siY", { Gv
, EXdScalar
}, 0 },
9548 { "vcvtss2siY", { Gv
, EXdScalar
}, 0 },
9551 /* VEX_LEN_0F2D_P_3 */
9553 { "vcvtsd2siY", { Gv
, EXqScalar
}, 0 },
9554 { "vcvtsd2siY", { Gv
, EXqScalar
}, 0 },
9557 /* VEX_LEN_0F2E_P_0 */
9559 { VEX_W_TABLE (VEX_W_0F2E_P_0
) },
9560 { VEX_W_TABLE (VEX_W_0F2E_P_0
) },
9563 /* VEX_LEN_0F2E_P_2 */
9565 { VEX_W_TABLE (VEX_W_0F2E_P_2
) },
9566 { VEX_W_TABLE (VEX_W_0F2E_P_2
) },
9569 /* VEX_LEN_0F2F_P_0 */
9571 { VEX_W_TABLE (VEX_W_0F2F_P_0
) },
9572 { VEX_W_TABLE (VEX_W_0F2F_P_0
) },
9575 /* VEX_LEN_0F2F_P_2 */
9577 { VEX_W_TABLE (VEX_W_0F2F_P_2
) },
9578 { VEX_W_TABLE (VEX_W_0F2F_P_2
) },
9581 /* VEX_LEN_0F41_P_0 */
9584 { VEX_W_TABLE (VEX_W_0F41_P_0_LEN_1
) },
9586 /* VEX_LEN_0F41_P_2 */
9589 { VEX_W_TABLE (VEX_W_0F41_P_2_LEN_1
) },
9591 /* VEX_LEN_0F42_P_0 */
9594 { VEX_W_TABLE (VEX_W_0F42_P_0_LEN_1
) },
9596 /* VEX_LEN_0F42_P_2 */
9599 { VEX_W_TABLE (VEX_W_0F42_P_2_LEN_1
) },
9601 /* VEX_LEN_0F44_P_0 */
9603 { VEX_W_TABLE (VEX_W_0F44_P_0_LEN_0
) },
9605 /* VEX_LEN_0F44_P_2 */
9607 { VEX_W_TABLE (VEX_W_0F44_P_2_LEN_0
) },
9609 /* VEX_LEN_0F45_P_0 */
9612 { VEX_W_TABLE (VEX_W_0F45_P_0_LEN_1
) },
9614 /* VEX_LEN_0F45_P_2 */
9617 { VEX_W_TABLE (VEX_W_0F45_P_2_LEN_1
) },
9619 /* VEX_LEN_0F46_P_0 */
9622 { VEX_W_TABLE (VEX_W_0F46_P_0_LEN_1
) },
9624 /* VEX_LEN_0F46_P_2 */
9627 { VEX_W_TABLE (VEX_W_0F46_P_2_LEN_1
) },
9629 /* VEX_LEN_0F47_P_0 */
9632 { VEX_W_TABLE (VEX_W_0F47_P_0_LEN_1
) },
9634 /* VEX_LEN_0F47_P_2 */
9637 { VEX_W_TABLE (VEX_W_0F47_P_2_LEN_1
) },
9639 /* VEX_LEN_0F4A_P_0 */
9642 { VEX_W_TABLE (VEX_W_0F4A_P_0_LEN_1
) },
9644 /* VEX_LEN_0F4A_P_2 */
9647 { VEX_W_TABLE (VEX_W_0F4A_P_2_LEN_1
) },
9649 /* VEX_LEN_0F4B_P_0 */
9652 { VEX_W_TABLE (VEX_W_0F4B_P_0_LEN_1
) },
9654 /* VEX_LEN_0F4B_P_2 */
9657 { VEX_W_TABLE (VEX_W_0F4B_P_2_LEN_1
) },
9660 /* VEX_LEN_0F51_P_1 */
9662 { VEX_W_TABLE (VEX_W_0F51_P_1
) },
9663 { VEX_W_TABLE (VEX_W_0F51_P_1
) },
9666 /* VEX_LEN_0F51_P_3 */
9668 { VEX_W_TABLE (VEX_W_0F51_P_3
) },
9669 { VEX_W_TABLE (VEX_W_0F51_P_3
) },
9672 /* VEX_LEN_0F52_P_1 */
9674 { VEX_W_TABLE (VEX_W_0F52_P_1
) },
9675 { VEX_W_TABLE (VEX_W_0F52_P_1
) },
9678 /* VEX_LEN_0F53_P_1 */
9680 { VEX_W_TABLE (VEX_W_0F53_P_1
) },
9681 { VEX_W_TABLE (VEX_W_0F53_P_1
) },
9684 /* VEX_LEN_0F58_P_1 */
9686 { VEX_W_TABLE (VEX_W_0F58_P_1
) },
9687 { VEX_W_TABLE (VEX_W_0F58_P_1
) },
9690 /* VEX_LEN_0F58_P_3 */
9692 { VEX_W_TABLE (VEX_W_0F58_P_3
) },
9693 { VEX_W_TABLE (VEX_W_0F58_P_3
) },
9696 /* VEX_LEN_0F59_P_1 */
9698 { VEX_W_TABLE (VEX_W_0F59_P_1
) },
9699 { VEX_W_TABLE (VEX_W_0F59_P_1
) },
9702 /* VEX_LEN_0F59_P_3 */
9704 { VEX_W_TABLE (VEX_W_0F59_P_3
) },
9705 { VEX_W_TABLE (VEX_W_0F59_P_3
) },
9708 /* VEX_LEN_0F5A_P_1 */
9710 { VEX_W_TABLE (VEX_W_0F5A_P_1
) },
9711 { VEX_W_TABLE (VEX_W_0F5A_P_1
) },
9714 /* VEX_LEN_0F5A_P_3 */
9716 { VEX_W_TABLE (VEX_W_0F5A_P_3
) },
9717 { VEX_W_TABLE (VEX_W_0F5A_P_3
) },
9720 /* VEX_LEN_0F5C_P_1 */
9722 { VEX_W_TABLE (VEX_W_0F5C_P_1
) },
9723 { VEX_W_TABLE (VEX_W_0F5C_P_1
) },
9726 /* VEX_LEN_0F5C_P_3 */
9728 { VEX_W_TABLE (VEX_W_0F5C_P_3
) },
9729 { VEX_W_TABLE (VEX_W_0F5C_P_3
) },
9732 /* VEX_LEN_0F5D_P_1 */
9734 { VEX_W_TABLE (VEX_W_0F5D_P_1
) },
9735 { VEX_W_TABLE (VEX_W_0F5D_P_1
) },
9738 /* VEX_LEN_0F5D_P_3 */
9740 { VEX_W_TABLE (VEX_W_0F5D_P_3
) },
9741 { VEX_W_TABLE (VEX_W_0F5D_P_3
) },
9744 /* VEX_LEN_0F5E_P_1 */
9746 { VEX_W_TABLE (VEX_W_0F5E_P_1
) },
9747 { VEX_W_TABLE (VEX_W_0F5E_P_1
) },
9750 /* VEX_LEN_0F5E_P_3 */
9752 { VEX_W_TABLE (VEX_W_0F5E_P_3
) },
9753 { VEX_W_TABLE (VEX_W_0F5E_P_3
) },
9756 /* VEX_LEN_0F5F_P_1 */
9758 { VEX_W_TABLE (VEX_W_0F5F_P_1
) },
9759 { VEX_W_TABLE (VEX_W_0F5F_P_1
) },
9762 /* VEX_LEN_0F5F_P_3 */
9764 { VEX_W_TABLE (VEX_W_0F5F_P_3
) },
9765 { VEX_W_TABLE (VEX_W_0F5F_P_3
) },
9768 /* VEX_LEN_0F6E_P_2 */
9770 { "vmovK", { XMScalar
, Edq
}, 0 },
9771 { "vmovK", { XMScalar
, Edq
}, 0 },
9774 /* VEX_LEN_0F7E_P_1 */
9776 { VEX_W_TABLE (VEX_W_0F7E_P_1
) },
9777 { VEX_W_TABLE (VEX_W_0F7E_P_1
) },
9780 /* VEX_LEN_0F7E_P_2 */
9782 { "vmovK", { Edq
, XMScalar
}, 0 },
9783 { "vmovK", { Edq
, XMScalar
}, 0 },
9786 /* VEX_LEN_0F90_P_0 */
9788 { VEX_W_TABLE (VEX_W_0F90_P_0_LEN_0
) },
9791 /* VEX_LEN_0F90_P_2 */
9793 { VEX_W_TABLE (VEX_W_0F90_P_2_LEN_0
) },
9796 /* VEX_LEN_0F91_P_0 */
9798 { VEX_W_TABLE (VEX_W_0F91_P_0_LEN_0
) },
9801 /* VEX_LEN_0F91_P_2 */
9803 { VEX_W_TABLE (VEX_W_0F91_P_2_LEN_0
) },
9806 /* VEX_LEN_0F92_P_0 */
9808 { VEX_W_TABLE (VEX_W_0F92_P_0_LEN_0
) },
9811 /* VEX_LEN_0F92_P_2 */
9813 { VEX_W_TABLE (VEX_W_0F92_P_2_LEN_0
) },
9816 /* VEX_LEN_0F92_P_3 */
9818 { VEX_W_TABLE (VEX_W_0F92_P_3_LEN_0
) },
9821 /* VEX_LEN_0F93_P_0 */
9823 { VEX_W_TABLE (VEX_W_0F93_P_0_LEN_0
) },
9826 /* VEX_LEN_0F93_P_2 */
9828 { VEX_W_TABLE (VEX_W_0F93_P_2_LEN_0
) },
9831 /* VEX_LEN_0F93_P_3 */
9833 { VEX_W_TABLE (VEX_W_0F93_P_3_LEN_0
) },
9836 /* VEX_LEN_0F98_P_0 */
9838 { VEX_W_TABLE (VEX_W_0F98_P_0_LEN_0
) },
9841 /* VEX_LEN_0F98_P_2 */
9843 { VEX_W_TABLE (VEX_W_0F98_P_2_LEN_0
) },
9846 /* VEX_LEN_0F99_P_0 */
9848 { VEX_W_TABLE (VEX_W_0F99_P_0_LEN_0
) },
9851 /* VEX_LEN_0F99_P_2 */
9853 { VEX_W_TABLE (VEX_W_0F99_P_2_LEN_0
) },
9856 /* VEX_LEN_0FAE_R_2_M_0 */
9858 { VEX_W_TABLE (VEX_W_0FAE_R_2_M_0
) },
9861 /* VEX_LEN_0FAE_R_3_M_0 */
9863 { VEX_W_TABLE (VEX_W_0FAE_R_3_M_0
) },
9866 /* VEX_LEN_0FC2_P_1 */
9868 { VEX_W_TABLE (VEX_W_0FC2_P_1
) },
9869 { VEX_W_TABLE (VEX_W_0FC2_P_1
) },
9872 /* VEX_LEN_0FC2_P_3 */
9874 { VEX_W_TABLE (VEX_W_0FC2_P_3
) },
9875 { VEX_W_TABLE (VEX_W_0FC2_P_3
) },
9878 /* VEX_LEN_0FC4_P_2 */
9880 { VEX_W_TABLE (VEX_W_0FC4_P_2
) },
9883 /* VEX_LEN_0FC5_P_2 */
9885 { VEX_W_TABLE (VEX_W_0FC5_P_2
) },
9888 /* VEX_LEN_0FD6_P_2 */
9890 { VEX_W_TABLE (VEX_W_0FD6_P_2
) },
9891 { VEX_W_TABLE (VEX_W_0FD6_P_2
) },
9894 /* VEX_LEN_0FF7_P_2 */
9896 { VEX_W_TABLE (VEX_W_0FF7_P_2
) },
9899 /* VEX_LEN_0F3816_P_2 */
9902 { VEX_W_TABLE (VEX_W_0F3816_P_2
) },
9905 /* VEX_LEN_0F3819_P_2 */
9908 { VEX_W_TABLE (VEX_W_0F3819_P_2
) },
9911 /* VEX_LEN_0F381A_P_2_M_0 */
9914 { VEX_W_TABLE (VEX_W_0F381A_P_2_M_0
) },
9917 /* VEX_LEN_0F3836_P_2 */
9920 { VEX_W_TABLE (VEX_W_0F3836_P_2
) },
9923 /* VEX_LEN_0F3841_P_2 */
9925 { VEX_W_TABLE (VEX_W_0F3841_P_2
) },
9928 /* VEX_LEN_0F385A_P_2_M_0 */
9931 { VEX_W_TABLE (VEX_W_0F385A_P_2_M_0
) },
9934 /* VEX_LEN_0F38DB_P_2 */
9936 { VEX_W_TABLE (VEX_W_0F38DB_P_2
) },
9939 /* VEX_LEN_0F38F2_P_0 */
9941 { "andnS", { Gdq
, VexGdq
, Edq
}, 0 },
9944 /* VEX_LEN_0F38F3_R_1_P_0 */
9946 { "blsrS", { VexGdq
, Edq
}, 0 },
9949 /* VEX_LEN_0F38F3_R_2_P_0 */
9951 { "blsmskS", { VexGdq
, Edq
}, 0 },
9954 /* VEX_LEN_0F38F3_R_3_P_0 */
9956 { "blsiS", { VexGdq
, Edq
}, 0 },
9959 /* VEX_LEN_0F38F5_P_0 */
9961 { "bzhiS", { Gdq
, Edq
, VexGdq
}, 0 },
9964 /* VEX_LEN_0F38F5_P_1 */
9966 { "pextS", { Gdq
, VexGdq
, Edq
}, 0 },
9969 /* VEX_LEN_0F38F5_P_3 */
9971 { "pdepS", { Gdq
, VexGdq
, Edq
}, 0 },
9974 /* VEX_LEN_0F38F6_P_3 */
9976 { "mulxS", { Gdq
, VexGdq
, Edq
}, 0 },
9979 /* VEX_LEN_0F38F7_P_0 */
9981 { "bextrS", { Gdq
, Edq
, VexGdq
}, 0 },
9984 /* VEX_LEN_0F38F7_P_1 */
9986 { "sarxS", { Gdq
, Edq
, VexGdq
}, 0 },
9989 /* VEX_LEN_0F38F7_P_2 */
9991 { "shlxS", { Gdq
, Edq
, VexGdq
}, 0 },
9994 /* VEX_LEN_0F38F7_P_3 */
9996 { "shrxS", { Gdq
, Edq
, VexGdq
}, 0 },
9999 /* VEX_LEN_0F3A00_P_2 */
10002 { VEX_W_TABLE (VEX_W_0F3A00_P_2
) },
10005 /* VEX_LEN_0F3A01_P_2 */
10008 { VEX_W_TABLE (VEX_W_0F3A01_P_2
) },
10011 /* VEX_LEN_0F3A06_P_2 */
10014 { VEX_W_TABLE (VEX_W_0F3A06_P_2
) },
10017 /* VEX_LEN_0F3A0A_P_2 */
10019 { VEX_W_TABLE (VEX_W_0F3A0A_P_2
) },
10020 { VEX_W_TABLE (VEX_W_0F3A0A_P_2
) },
10023 /* VEX_LEN_0F3A0B_P_2 */
10025 { VEX_W_TABLE (VEX_W_0F3A0B_P_2
) },
10026 { VEX_W_TABLE (VEX_W_0F3A0B_P_2
) },
10029 /* VEX_LEN_0F3A14_P_2 */
10031 { VEX_W_TABLE (VEX_W_0F3A14_P_2
) },
10034 /* VEX_LEN_0F3A15_P_2 */
10036 { VEX_W_TABLE (VEX_W_0F3A15_P_2
) },
10039 /* VEX_LEN_0F3A16_P_2 */
10041 { "vpextrK", { Edq
, XM
, Ib
}, 0 },
10044 /* VEX_LEN_0F3A17_P_2 */
10046 { "vextractps", { Edqd
, XM
, Ib
}, 0 },
10049 /* VEX_LEN_0F3A18_P_2 */
10052 { VEX_W_TABLE (VEX_W_0F3A18_P_2
) },
10055 /* VEX_LEN_0F3A19_P_2 */
10058 { VEX_W_TABLE (VEX_W_0F3A19_P_2
) },
10061 /* VEX_LEN_0F3A20_P_2 */
10063 { VEX_W_TABLE (VEX_W_0F3A20_P_2
) },
10066 /* VEX_LEN_0F3A21_P_2 */
10068 { VEX_W_TABLE (VEX_W_0F3A21_P_2
) },
10071 /* VEX_LEN_0F3A22_P_2 */
10073 { "vpinsrK", { XM
, Vex128
, Edq
, Ib
}, 0 },
10076 /* VEX_LEN_0F3A30_P_2 */
10078 { VEX_W_TABLE (VEX_W_0F3A30_P_2_LEN_0
) },
10081 /* VEX_LEN_0F3A31_P_2 */
10083 { VEX_W_TABLE (VEX_W_0F3A31_P_2_LEN_0
) },
10086 /* VEX_LEN_0F3A32_P_2 */
10088 { VEX_W_TABLE (VEX_W_0F3A32_P_2_LEN_0
) },
10091 /* VEX_LEN_0F3A33_P_2 */
10093 { VEX_W_TABLE (VEX_W_0F3A33_P_2_LEN_0
) },
10096 /* VEX_LEN_0F3A38_P_2 */
10099 { VEX_W_TABLE (VEX_W_0F3A38_P_2
) },
10102 /* VEX_LEN_0F3A39_P_2 */
10105 { VEX_W_TABLE (VEX_W_0F3A39_P_2
) },
10108 /* VEX_LEN_0F3A41_P_2 */
10110 { VEX_W_TABLE (VEX_W_0F3A41_P_2
) },
10113 /* VEX_LEN_0F3A44_P_2 */
10115 { VEX_W_TABLE (VEX_W_0F3A44_P_2
) },
10118 /* VEX_LEN_0F3A46_P_2 */
10121 { VEX_W_TABLE (VEX_W_0F3A46_P_2
) },
10124 /* VEX_LEN_0F3A60_P_2 */
10126 { "vpcmpestrm", { XM
, { PCMPESTR_Fixup
, x_mode
}, Ib
}, 0 },
10129 /* VEX_LEN_0F3A61_P_2 */
10131 { "vpcmpestri", { XM
, { PCMPESTR_Fixup
, x_mode
}, Ib
}, 0 },
10134 /* VEX_LEN_0F3A62_P_2 */
10136 { VEX_W_TABLE (VEX_W_0F3A62_P_2
) },
10139 /* VEX_LEN_0F3A63_P_2 */
10141 { VEX_W_TABLE (VEX_W_0F3A63_P_2
) },
10144 /* VEX_LEN_0F3A6A_P_2 */
10146 { "vfmaddss", { XMVexW
, Vex128
, EXdVexW
, EXdVexW
, VexI4
}, 0 },
10149 /* VEX_LEN_0F3A6B_P_2 */
10151 { "vfmaddsd", { XMVexW
, Vex128
, EXqVexW
, EXqVexW
, VexI4
}, 0 },
10154 /* VEX_LEN_0F3A6E_P_2 */
10156 { "vfmsubss", { XMVexW
, Vex128
, EXdVexW
, EXdVexW
, VexI4
}, 0 },
10159 /* VEX_LEN_0F3A6F_P_2 */
10161 { "vfmsubsd", { XMVexW
, Vex128
, EXqVexW
, EXqVexW
, VexI4
}, 0 },
10164 /* VEX_LEN_0F3A7A_P_2 */
10166 { "vfnmaddss", { XMVexW
, Vex128
, EXdVexW
, EXdVexW
, VexI4
}, 0 },
10169 /* VEX_LEN_0F3A7B_P_2 */
10171 { "vfnmaddsd", { XMVexW
, Vex128
, EXqVexW
, EXqVexW
, VexI4
}, 0 },
10174 /* VEX_LEN_0F3A7E_P_2 */
10176 { "vfnmsubss", { XMVexW
, Vex128
, EXdVexW
, EXdVexW
, VexI4
}, 0 },
10179 /* VEX_LEN_0F3A7F_P_2 */
10181 { "vfnmsubsd", { XMVexW
, Vex128
, EXqVexW
, EXqVexW
, VexI4
}, 0 },
10184 /* VEX_LEN_0F3ADF_P_2 */
10186 { VEX_W_TABLE (VEX_W_0F3ADF_P_2
) },
10189 /* VEX_LEN_0F3AF0_P_3 */
10191 { "rorxS", { Gdq
, Edq
, Ib
}, 0 },
10194 /* VEX_LEN_0FXOP_08_CC */
10196 { "vpcomb", { XM
, Vex128
, EXx
, Ib
}, 0 },
10199 /* VEX_LEN_0FXOP_08_CD */
10201 { "vpcomw", { XM
, Vex128
, EXx
, Ib
}, 0 },
10204 /* VEX_LEN_0FXOP_08_CE */
10206 { "vpcomd", { XM
, Vex128
, EXx
, Ib
}, 0 },
10209 /* VEX_LEN_0FXOP_08_CF */
10211 { "vpcomq", { XM
, Vex128
, EXx
, Ib
}, 0 },
10214 /* VEX_LEN_0FXOP_08_EC */
10216 { "vpcomub", { XM
, Vex128
, EXx
, Ib
}, 0 },
10219 /* VEX_LEN_0FXOP_08_ED */
10221 { "vpcomuw", { XM
, Vex128
, EXx
, Ib
}, 0 },
10224 /* VEX_LEN_0FXOP_08_EE */
10226 { "vpcomud", { XM
, Vex128
, EXx
, Ib
}, 0 },
10229 /* VEX_LEN_0FXOP_08_EF */
10231 { "vpcomuq", { XM
, Vex128
, EXx
, Ib
}, 0 },
10234 /* VEX_LEN_0FXOP_09_80 */
10236 { "vfrczps", { XM
, EXxmm
}, 0 },
10237 { "vfrczps", { XM
, EXymmq
}, 0 },
10240 /* VEX_LEN_0FXOP_09_81 */
10242 { "vfrczpd", { XM
, EXxmm
}, 0 },
10243 { "vfrczpd", { XM
, EXymmq
}, 0 },
10247 static const struct dis386 vex_w_table
[][2] = {
10249 /* VEX_W_0F10_P_0 */
10250 { "vmovups", { XM
, EXx
}, 0 },
10253 /* VEX_W_0F10_P_1 */
10254 { "vmovss", { XMVexScalar
, VexScalar
, EXdScalar
}, 0 },
10257 /* VEX_W_0F10_P_2 */
10258 { "vmovupd", { XM
, EXx
}, 0 },
10261 /* VEX_W_0F10_P_3 */
10262 { "vmovsd", { XMVexScalar
, VexScalar
, EXqScalar
}, 0 },
10265 /* VEX_W_0F11_P_0 */
10266 { "vmovups", { EXxS
, XM
}, 0 },
10269 /* VEX_W_0F11_P_1 */
10270 { "vmovss", { EXdVexScalarS
, VexScalar
, XMScalar
}, 0 },
10273 /* VEX_W_0F11_P_2 */
10274 { "vmovupd", { EXxS
, XM
}, 0 },
10277 /* VEX_W_0F11_P_3 */
10278 { "vmovsd", { EXqVexScalarS
, VexScalar
, XMScalar
}, 0 },
10281 /* VEX_W_0F12_P_0_M_0 */
10282 { "vmovlps", { XM
, Vex128
, EXq
}, 0 },
10285 /* VEX_W_0F12_P_0_M_1 */
10286 { "vmovhlps", { XM
, Vex128
, EXq
}, 0 },
10289 /* VEX_W_0F12_P_1 */
10290 { "vmovsldup", { XM
, EXx
}, 0 },
10293 /* VEX_W_0F12_P_2 */
10294 { "vmovlpd", { XM
, Vex128
, EXq
}, 0 },
10297 /* VEX_W_0F12_P_3 */
10298 { "vmovddup", { XM
, EXymmq
}, 0 },
10301 /* VEX_W_0F13_M_0 */
10302 { "vmovlpX", { EXq
, XM
}, 0 },
10306 { "vunpcklpX", { XM
, Vex
, EXx
}, 0 },
10310 { "vunpckhpX", { XM
, Vex
, EXx
}, 0 },
10313 /* VEX_W_0F16_P_0_M_0 */
10314 { "vmovhps", { XM
, Vex128
, EXq
}, 0 },
10317 /* VEX_W_0F16_P_0_M_1 */
10318 { "vmovlhps", { XM
, Vex128
, EXq
}, 0 },
10321 /* VEX_W_0F16_P_1 */
10322 { "vmovshdup", { XM
, EXx
}, 0 },
10325 /* VEX_W_0F16_P_2 */
10326 { "vmovhpd", { XM
, Vex128
, EXq
}, 0 },
10329 /* VEX_W_0F17_M_0 */
10330 { "vmovhpX", { EXq
, XM
}, 0 },
10334 { "vmovapX", { XM
, EXx
}, 0 },
10338 { "vmovapX", { EXxS
, XM
}, 0 },
10341 /* VEX_W_0F2B_M_0 */
10342 { "vmovntpX", { Mx
, XM
}, 0 },
10345 /* VEX_W_0F2E_P_0 */
10346 { "vucomiss", { XMScalar
, EXdScalar
}, 0 },
10349 /* VEX_W_0F2E_P_2 */
10350 { "vucomisd", { XMScalar
, EXqScalar
}, 0 },
10353 /* VEX_W_0F2F_P_0 */
10354 { "vcomiss", { XMScalar
, EXdScalar
}, 0 },
10357 /* VEX_W_0F2F_P_2 */
10358 { "vcomisd", { XMScalar
, EXqScalar
}, 0 },
10361 /* VEX_W_0F41_P_0_LEN_1 */
10362 { MOD_TABLE (MOD_VEX_W_0_0F41_P_0_LEN_1
) },
10363 { MOD_TABLE (MOD_VEX_W_1_0F41_P_0_LEN_1
) },
10366 /* VEX_W_0F41_P_2_LEN_1 */
10367 { MOD_TABLE (MOD_VEX_W_0_0F41_P_2_LEN_1
) },
10368 { MOD_TABLE (MOD_VEX_W_1_0F41_P_2_LEN_1
) }
10371 /* VEX_W_0F42_P_0_LEN_1 */
10372 { MOD_TABLE (MOD_VEX_W_0_0F42_P_0_LEN_1
) },
10373 { MOD_TABLE (MOD_VEX_W_1_0F42_P_0_LEN_1
) },
10376 /* VEX_W_0F42_P_2_LEN_1 */
10377 { MOD_TABLE (MOD_VEX_W_0_0F42_P_2_LEN_1
) },
10378 { MOD_TABLE (MOD_VEX_W_1_0F42_P_2_LEN_1
) },
10381 /* VEX_W_0F44_P_0_LEN_0 */
10382 { MOD_TABLE (MOD_VEX_W_0_0F44_P_0_LEN_1
) },
10383 { MOD_TABLE (MOD_VEX_W_1_0F44_P_0_LEN_1
) },
10386 /* VEX_W_0F44_P_2_LEN_0 */
10387 { MOD_TABLE (MOD_VEX_W_0_0F44_P_2_LEN_1
) },
10388 { MOD_TABLE (MOD_VEX_W_1_0F44_P_2_LEN_1
) },
10391 /* VEX_W_0F45_P_0_LEN_1 */
10392 { MOD_TABLE (MOD_VEX_W_0_0F45_P_0_LEN_1
) },
10393 { MOD_TABLE (MOD_VEX_W_1_0F45_P_0_LEN_1
) },
10396 /* VEX_W_0F45_P_2_LEN_1 */
10397 { MOD_TABLE (MOD_VEX_W_0_0F45_P_2_LEN_1
) },
10398 { MOD_TABLE (MOD_VEX_W_1_0F45_P_2_LEN_1
) },
10401 /* VEX_W_0F46_P_0_LEN_1 */
10402 { MOD_TABLE (MOD_VEX_W_0_0F46_P_0_LEN_1
) },
10403 { MOD_TABLE (MOD_VEX_W_1_0F46_P_0_LEN_1
) },
10406 /* VEX_W_0F46_P_2_LEN_1 */
10407 { MOD_TABLE (MOD_VEX_W_0_0F46_P_2_LEN_1
) },
10408 { MOD_TABLE (MOD_VEX_W_1_0F46_P_2_LEN_1
) },
10411 /* VEX_W_0F47_P_0_LEN_1 */
10412 { MOD_TABLE (MOD_VEX_W_0_0F47_P_0_LEN_1
) },
10413 { MOD_TABLE (MOD_VEX_W_1_0F47_P_0_LEN_1
) },
10416 /* VEX_W_0F47_P_2_LEN_1 */
10417 { MOD_TABLE (MOD_VEX_W_0_0F47_P_2_LEN_1
) },
10418 { MOD_TABLE (MOD_VEX_W_1_0F47_P_2_LEN_1
) },
10421 /* VEX_W_0F4A_P_0_LEN_1 */
10422 { MOD_TABLE (MOD_VEX_W_0_0F4A_P_0_LEN_1
) },
10423 { MOD_TABLE (MOD_VEX_W_1_0F4A_P_0_LEN_1
) },
10426 /* VEX_W_0F4A_P_2_LEN_1 */
10427 { MOD_TABLE (MOD_VEX_W_0_0F4A_P_2_LEN_1
) },
10428 { MOD_TABLE (MOD_VEX_W_1_0F4A_P_2_LEN_1
) },
10431 /* VEX_W_0F4B_P_0_LEN_1 */
10432 { MOD_TABLE (MOD_VEX_W_0_0F4B_P_0_LEN_1
) },
10433 { MOD_TABLE (MOD_VEX_W_1_0F4B_P_0_LEN_1
) },
10436 /* VEX_W_0F4B_P_2_LEN_1 */
10437 { MOD_TABLE (MOD_VEX_W_0_0F4B_P_2_LEN_1
) },
10440 /* VEX_W_0F50_M_0 */
10441 { "vmovmskpX", { Gdq
, XS
}, 0 },
10444 /* VEX_W_0F51_P_0 */
10445 { "vsqrtps", { XM
, EXx
}, 0 },
10448 /* VEX_W_0F51_P_1 */
10449 { "vsqrtss", { XMScalar
, VexScalar
, EXdScalar
}, 0 },
10452 /* VEX_W_0F51_P_2 */
10453 { "vsqrtpd", { XM
, EXx
}, 0 },
10456 /* VEX_W_0F51_P_3 */
10457 { "vsqrtsd", { XMScalar
, VexScalar
, EXqScalar
}, 0 },
10460 /* VEX_W_0F52_P_0 */
10461 { "vrsqrtps", { XM
, EXx
}, 0 },
10464 /* VEX_W_0F52_P_1 */
10465 { "vrsqrtss", { XMScalar
, VexScalar
, EXdScalar
}, 0 },
10468 /* VEX_W_0F53_P_0 */
10469 { "vrcpps", { XM
, EXx
}, 0 },
10472 /* VEX_W_0F53_P_1 */
10473 { "vrcpss", { XMScalar
, VexScalar
, EXdScalar
}, 0 },
10476 /* VEX_W_0F58_P_0 */
10477 { "vaddps", { XM
, Vex
, EXx
}, 0 },
10480 /* VEX_W_0F58_P_1 */
10481 { "vaddss", { XMScalar
, VexScalar
, EXdScalar
}, 0 },
10484 /* VEX_W_0F58_P_2 */
10485 { "vaddpd", { XM
, Vex
, EXx
}, 0 },
10488 /* VEX_W_0F58_P_3 */
10489 { "vaddsd", { XMScalar
, VexScalar
, EXqScalar
}, 0 },
10492 /* VEX_W_0F59_P_0 */
10493 { "vmulps", { XM
, Vex
, EXx
}, 0 },
10496 /* VEX_W_0F59_P_1 */
10497 { "vmulss", { XMScalar
, VexScalar
, EXdScalar
}, 0 },
10500 /* VEX_W_0F59_P_2 */
10501 { "vmulpd", { XM
, Vex
, EXx
}, 0 },
10504 /* VEX_W_0F59_P_3 */
10505 { "vmulsd", { XMScalar
, VexScalar
, EXqScalar
}, 0 },
10508 /* VEX_W_0F5A_P_0 */
10509 { "vcvtps2pd", { XM
, EXxmmq
}, 0 },
10512 /* VEX_W_0F5A_P_1 */
10513 { "vcvtss2sd", { XMScalar
, VexScalar
, EXdScalar
}, 0 },
10516 /* VEX_W_0F5A_P_3 */
10517 { "vcvtsd2ss", { XMScalar
, VexScalar
, EXqScalar
}, 0 },
10520 /* VEX_W_0F5B_P_0 */
10521 { "vcvtdq2ps", { XM
, EXx
}, 0 },
10524 /* VEX_W_0F5B_P_1 */
10525 { "vcvttps2dq", { XM
, EXx
}, 0 },
10528 /* VEX_W_0F5B_P_2 */
10529 { "vcvtps2dq", { XM
, EXx
}, 0 },
10532 /* VEX_W_0F5C_P_0 */
10533 { "vsubps", { XM
, Vex
, EXx
}, 0 },
10536 /* VEX_W_0F5C_P_1 */
10537 { "vsubss", { XMScalar
, VexScalar
, EXdScalar
}, 0 },
10540 /* VEX_W_0F5C_P_2 */
10541 { "vsubpd", { XM
, Vex
, EXx
}, 0 },
10544 /* VEX_W_0F5C_P_3 */
10545 { "vsubsd", { XMScalar
, VexScalar
, EXqScalar
}, 0 },
10548 /* VEX_W_0F5D_P_0 */
10549 { "vminps", { XM
, Vex
, EXx
}, 0 },
10552 /* VEX_W_0F5D_P_1 */
10553 { "vminss", { XMScalar
, VexScalar
, EXdScalar
}, 0 },
10556 /* VEX_W_0F5D_P_2 */
10557 { "vminpd", { XM
, Vex
, EXx
}, 0 },
10560 /* VEX_W_0F5D_P_3 */
10561 { "vminsd", { XMScalar
, VexScalar
, EXqScalar
}, 0 },
10564 /* VEX_W_0F5E_P_0 */
10565 { "vdivps", { XM
, Vex
, EXx
}, 0 },
10568 /* VEX_W_0F5E_P_1 */
10569 { "vdivss", { XMScalar
, VexScalar
, EXdScalar
}, 0 },
10572 /* VEX_W_0F5E_P_2 */
10573 { "vdivpd", { XM
, Vex
, EXx
}, 0 },
10576 /* VEX_W_0F5E_P_3 */
10577 { "vdivsd", { XMScalar
, VexScalar
, EXqScalar
}, 0 },
10580 /* VEX_W_0F5F_P_0 */
10581 { "vmaxps", { XM
, Vex
, EXx
}, 0 },
10584 /* VEX_W_0F5F_P_1 */
10585 { "vmaxss", { XMScalar
, VexScalar
, EXdScalar
}, 0 },
10588 /* VEX_W_0F5F_P_2 */
10589 { "vmaxpd", { XM
, Vex
, EXx
}, 0 },
10592 /* VEX_W_0F5F_P_3 */
10593 { "vmaxsd", { XMScalar
, VexScalar
, EXqScalar
}, 0 },
10596 /* VEX_W_0F60_P_2 */
10597 { "vpunpcklbw", { XM
, Vex
, EXx
}, 0 },
10600 /* VEX_W_0F61_P_2 */
10601 { "vpunpcklwd", { XM
, Vex
, EXx
}, 0 },
10604 /* VEX_W_0F62_P_2 */
10605 { "vpunpckldq", { XM
, Vex
, EXx
}, 0 },
10608 /* VEX_W_0F63_P_2 */
10609 { "vpacksswb", { XM
, Vex
, EXx
}, 0 },
10612 /* VEX_W_0F64_P_2 */
10613 { "vpcmpgtb", { XM
, Vex
, EXx
}, 0 },
10616 /* VEX_W_0F65_P_2 */
10617 { "vpcmpgtw", { XM
, Vex
, EXx
}, 0 },
10620 /* VEX_W_0F66_P_2 */
10621 { "vpcmpgtd", { XM
, Vex
, EXx
}, 0 },
10624 /* VEX_W_0F67_P_2 */
10625 { "vpackuswb", { XM
, Vex
, EXx
}, 0 },
10628 /* VEX_W_0F68_P_2 */
10629 { "vpunpckhbw", { XM
, Vex
, EXx
}, 0 },
10632 /* VEX_W_0F69_P_2 */
10633 { "vpunpckhwd", { XM
, Vex
, EXx
}, 0 },
10636 /* VEX_W_0F6A_P_2 */
10637 { "vpunpckhdq", { XM
, Vex
, EXx
}, 0 },
10640 /* VEX_W_0F6B_P_2 */
10641 { "vpackssdw", { XM
, Vex
, EXx
}, 0 },
10644 /* VEX_W_0F6C_P_2 */
10645 { "vpunpcklqdq", { XM
, Vex
, EXx
}, 0 },
10648 /* VEX_W_0F6D_P_2 */
10649 { "vpunpckhqdq", { XM
, Vex
, EXx
}, 0 },
10652 /* VEX_W_0F6F_P_1 */
10653 { "vmovdqu", { XM
, EXx
}, 0 },
10656 /* VEX_W_0F6F_P_2 */
10657 { "vmovdqa", { XM
, EXx
}, 0 },
10660 /* VEX_W_0F70_P_1 */
10661 { "vpshufhw", { XM
, EXx
, Ib
}, 0 },
10664 /* VEX_W_0F70_P_2 */
10665 { "vpshufd", { XM
, EXx
, Ib
}, 0 },
10668 /* VEX_W_0F70_P_3 */
10669 { "vpshuflw", { XM
, EXx
, Ib
}, 0 },
10672 /* VEX_W_0F71_R_2_P_2 */
10673 { "vpsrlw", { Vex
, XS
, Ib
}, 0 },
10676 /* VEX_W_0F71_R_4_P_2 */
10677 { "vpsraw", { Vex
, XS
, Ib
}, 0 },
10680 /* VEX_W_0F71_R_6_P_2 */
10681 { "vpsllw", { Vex
, XS
, Ib
}, 0 },
10684 /* VEX_W_0F72_R_2_P_2 */
10685 { "vpsrld", { Vex
, XS
, Ib
}, 0 },
10688 /* VEX_W_0F72_R_4_P_2 */
10689 { "vpsrad", { Vex
, XS
, Ib
}, 0 },
10692 /* VEX_W_0F72_R_6_P_2 */
10693 { "vpslld", { Vex
, XS
, Ib
}, 0 },
10696 /* VEX_W_0F73_R_2_P_2 */
10697 { "vpsrlq", { Vex
, XS
, Ib
}, 0 },
10700 /* VEX_W_0F73_R_3_P_2 */
10701 { "vpsrldq", { Vex
, XS
, Ib
}, 0 },
10704 /* VEX_W_0F73_R_6_P_2 */
10705 { "vpsllq", { Vex
, XS
, Ib
}, 0 },
10708 /* VEX_W_0F73_R_7_P_2 */
10709 { "vpslldq", { Vex
, XS
, Ib
}, 0 },
10712 /* VEX_W_0F74_P_2 */
10713 { "vpcmpeqb", { XM
, Vex
, EXx
}, 0 },
10716 /* VEX_W_0F75_P_2 */
10717 { "vpcmpeqw", { XM
, Vex
, EXx
}, 0 },
10720 /* VEX_W_0F76_P_2 */
10721 { "vpcmpeqd", { XM
, Vex
, EXx
}, 0 },
10724 /* VEX_W_0F77_P_0 */
10725 { "", { VZERO
}, 0 },
10728 /* VEX_W_0F7C_P_2 */
10729 { "vhaddpd", { XM
, Vex
, EXx
}, 0 },
10732 /* VEX_W_0F7C_P_3 */
10733 { "vhaddps", { XM
, Vex
, EXx
}, 0 },
10736 /* VEX_W_0F7D_P_2 */
10737 { "vhsubpd", { XM
, Vex
, EXx
}, 0 },
10740 /* VEX_W_0F7D_P_3 */
10741 { "vhsubps", { XM
, Vex
, EXx
}, 0 },
10744 /* VEX_W_0F7E_P_1 */
10745 { "vmovq", { XMScalar
, EXqScalar
}, 0 },
10748 /* VEX_W_0F7F_P_1 */
10749 { "vmovdqu", { EXxS
, XM
}, 0 },
10752 /* VEX_W_0F7F_P_2 */
10753 { "vmovdqa", { EXxS
, XM
}, 0 },
10756 /* VEX_W_0F90_P_0_LEN_0 */
10757 { "kmovw", { MaskG
, MaskE
}, 0 },
10758 { "kmovq", { MaskG
, MaskE
}, 0 },
10761 /* VEX_W_0F90_P_2_LEN_0 */
10762 { "kmovb", { MaskG
, MaskBDE
}, 0 },
10763 { "kmovd", { MaskG
, MaskBDE
}, 0 },
10766 /* VEX_W_0F91_P_0_LEN_0 */
10767 { MOD_TABLE (MOD_VEX_W_0_0F91_P_0_LEN_0
) },
10768 { MOD_TABLE (MOD_VEX_W_1_0F91_P_0_LEN_0
) },
10771 /* VEX_W_0F91_P_2_LEN_0 */
10772 { MOD_TABLE (MOD_VEX_W_0_0F91_P_2_LEN_0
) },
10773 { MOD_TABLE (MOD_VEX_W_1_0F91_P_2_LEN_0
) },
10776 /* VEX_W_0F92_P_0_LEN_0 */
10777 { MOD_TABLE (MOD_VEX_W_0_0F92_P_0_LEN_0
) },
10780 /* VEX_W_0F92_P_2_LEN_0 */
10781 { MOD_TABLE (MOD_VEX_W_0_0F92_P_2_LEN_0
) },
10784 /* VEX_W_0F92_P_3_LEN_0 */
10785 { MOD_TABLE (MOD_VEX_W_0_0F92_P_3_LEN_0
) },
10786 { MOD_TABLE (MOD_VEX_W_1_0F92_P_3_LEN_0
) },
10789 /* VEX_W_0F93_P_0_LEN_0 */
10790 { MOD_TABLE (MOD_VEX_W_0_0F93_P_0_LEN_0
) },
10793 /* VEX_W_0F93_P_2_LEN_0 */
10794 { MOD_TABLE (MOD_VEX_W_0_0F93_P_2_LEN_0
) },
10797 /* VEX_W_0F93_P_3_LEN_0 */
10798 { MOD_TABLE (MOD_VEX_W_0_0F93_P_3_LEN_0
) },
10799 { MOD_TABLE (MOD_VEX_W_1_0F93_P_3_LEN_0
) },
10802 /* VEX_W_0F98_P_0_LEN_0 */
10803 { MOD_TABLE (MOD_VEX_W_0_0F98_P_0_LEN_0
) },
10804 { MOD_TABLE (MOD_VEX_W_1_0F98_P_0_LEN_0
) },
10807 /* VEX_W_0F98_P_2_LEN_0 */
10808 { MOD_TABLE (MOD_VEX_W_0_0F98_P_2_LEN_0
) },
10809 { MOD_TABLE (MOD_VEX_W_1_0F98_P_2_LEN_0
) },
10812 /* VEX_W_0F99_P_0_LEN_0 */
10813 { MOD_TABLE (MOD_VEX_W_0_0F99_P_0_LEN_0
) },
10814 { MOD_TABLE (MOD_VEX_W_1_0F99_P_0_LEN_0
) },
10817 /* VEX_W_0F99_P_2_LEN_0 */
10818 { MOD_TABLE (MOD_VEX_W_0_0F99_P_2_LEN_0
) },
10819 { MOD_TABLE (MOD_VEX_W_1_0F99_P_2_LEN_0
) },
10822 /* VEX_W_0FAE_R_2_M_0 */
10823 { "vldmxcsr", { Md
}, 0 },
10826 /* VEX_W_0FAE_R_3_M_0 */
10827 { "vstmxcsr", { Md
}, 0 },
10830 /* VEX_W_0FC2_P_0 */
10831 { "vcmpps", { XM
, Vex
, EXx
, VCMP
}, 0 },
10834 /* VEX_W_0FC2_P_1 */
10835 { "vcmpss", { XMScalar
, VexScalar
, EXdScalar
, VCMP
}, 0 },
10838 /* VEX_W_0FC2_P_2 */
10839 { "vcmppd", { XM
, Vex
, EXx
, VCMP
}, 0 },
10842 /* VEX_W_0FC2_P_3 */
10843 { "vcmpsd", { XMScalar
, VexScalar
, EXqScalar
, VCMP
}, 0 },
10846 /* VEX_W_0FC4_P_2 */
10847 { "vpinsrw", { XM
, Vex128
, Edqw
, Ib
}, 0 },
10850 /* VEX_W_0FC5_P_2 */
10851 { "vpextrw", { Gdq
, XS
, Ib
}, 0 },
10854 /* VEX_W_0FD0_P_2 */
10855 { "vaddsubpd", { XM
, Vex
, EXx
}, 0 },
10858 /* VEX_W_0FD0_P_3 */
10859 { "vaddsubps", { XM
, Vex
, EXx
}, 0 },
10862 /* VEX_W_0FD1_P_2 */
10863 { "vpsrlw", { XM
, Vex
, EXxmm
}, 0 },
10866 /* VEX_W_0FD2_P_2 */
10867 { "vpsrld", { XM
, Vex
, EXxmm
}, 0 },
10870 /* VEX_W_0FD3_P_2 */
10871 { "vpsrlq", { XM
, Vex
, EXxmm
}, 0 },
10874 /* VEX_W_0FD4_P_2 */
10875 { "vpaddq", { XM
, Vex
, EXx
}, 0 },
10878 /* VEX_W_0FD5_P_2 */
10879 { "vpmullw", { XM
, Vex
, EXx
}, 0 },
10882 /* VEX_W_0FD6_P_2 */
10883 { "vmovq", { EXqScalarS
, XMScalar
}, 0 },
10886 /* VEX_W_0FD7_P_2_M_1 */
10887 { "vpmovmskb", { Gdq
, XS
}, 0 },
10890 /* VEX_W_0FD8_P_2 */
10891 { "vpsubusb", { XM
, Vex
, EXx
}, 0 },
10894 /* VEX_W_0FD9_P_2 */
10895 { "vpsubusw", { XM
, Vex
, EXx
}, 0 },
10898 /* VEX_W_0FDA_P_2 */
10899 { "vpminub", { XM
, Vex
, EXx
}, 0 },
10902 /* VEX_W_0FDB_P_2 */
10903 { "vpand", { XM
, Vex
, EXx
}, 0 },
10906 /* VEX_W_0FDC_P_2 */
10907 { "vpaddusb", { XM
, Vex
, EXx
}, 0 },
10910 /* VEX_W_0FDD_P_2 */
10911 { "vpaddusw", { XM
, Vex
, EXx
}, 0 },
10914 /* VEX_W_0FDE_P_2 */
10915 { "vpmaxub", { XM
, Vex
, EXx
}, 0 },
10918 /* VEX_W_0FDF_P_2 */
10919 { "vpandn", { XM
, Vex
, EXx
}, 0 },
10922 /* VEX_W_0FE0_P_2 */
10923 { "vpavgb", { XM
, Vex
, EXx
}, 0 },
10926 /* VEX_W_0FE1_P_2 */
10927 { "vpsraw", { XM
, Vex
, EXxmm
}, 0 },
10930 /* VEX_W_0FE2_P_2 */
10931 { "vpsrad", { XM
, Vex
, EXxmm
}, 0 },
10934 /* VEX_W_0FE3_P_2 */
10935 { "vpavgw", { XM
, Vex
, EXx
}, 0 },
10938 /* VEX_W_0FE4_P_2 */
10939 { "vpmulhuw", { XM
, Vex
, EXx
}, 0 },
10942 /* VEX_W_0FE5_P_2 */
10943 { "vpmulhw", { XM
, Vex
, EXx
}, 0 },
10946 /* VEX_W_0FE6_P_1 */
10947 { "vcvtdq2pd", { XM
, EXxmmq
}, 0 },
10950 /* VEX_W_0FE6_P_2 */
10951 { "vcvttpd2dq%XY", { XMM
, EXx
}, 0 },
10954 /* VEX_W_0FE6_P_3 */
10955 { "vcvtpd2dq%XY", { XMM
, EXx
}, 0 },
10958 /* VEX_W_0FE7_P_2_M_0 */
10959 { "vmovntdq", { Mx
, XM
}, 0 },
10962 /* VEX_W_0FE8_P_2 */
10963 { "vpsubsb", { XM
, Vex
, EXx
}, 0 },
10966 /* VEX_W_0FE9_P_2 */
10967 { "vpsubsw", { XM
, Vex
, EXx
}, 0 },
10970 /* VEX_W_0FEA_P_2 */
10971 { "vpminsw", { XM
, Vex
, EXx
}, 0 },
10974 /* VEX_W_0FEB_P_2 */
10975 { "vpor", { XM
, Vex
, EXx
}, 0 },
10978 /* VEX_W_0FEC_P_2 */
10979 { "vpaddsb", { XM
, Vex
, EXx
}, 0 },
10982 /* VEX_W_0FED_P_2 */
10983 { "vpaddsw", { XM
, Vex
, EXx
}, 0 },
10986 /* VEX_W_0FEE_P_2 */
10987 { "vpmaxsw", { XM
, Vex
, EXx
}, 0 },
10990 /* VEX_W_0FEF_P_2 */
10991 { "vpxor", { XM
, Vex
, EXx
}, 0 },
10994 /* VEX_W_0FF0_P_3_M_0 */
10995 { "vlddqu", { XM
, M
}, 0 },
10998 /* VEX_W_0FF1_P_2 */
10999 { "vpsllw", { XM
, Vex
, EXxmm
}, 0 },
11002 /* VEX_W_0FF2_P_2 */
11003 { "vpslld", { XM
, Vex
, EXxmm
}, 0 },
11006 /* VEX_W_0FF3_P_2 */
11007 { "vpsllq", { XM
, Vex
, EXxmm
}, 0 },
11010 /* VEX_W_0FF4_P_2 */
11011 { "vpmuludq", { XM
, Vex
, EXx
}, 0 },
11014 /* VEX_W_0FF5_P_2 */
11015 { "vpmaddwd", { XM
, Vex
, EXx
}, 0 },
11018 /* VEX_W_0FF6_P_2 */
11019 { "vpsadbw", { XM
, Vex
, EXx
}, 0 },
11022 /* VEX_W_0FF7_P_2 */
11023 { "vmaskmovdqu", { XM
, XS
}, 0 },
11026 /* VEX_W_0FF8_P_2 */
11027 { "vpsubb", { XM
, Vex
, EXx
}, 0 },
11030 /* VEX_W_0FF9_P_2 */
11031 { "vpsubw", { XM
, Vex
, EXx
}, 0 },
11034 /* VEX_W_0FFA_P_2 */
11035 { "vpsubd", { XM
, Vex
, EXx
}, 0 },
11038 /* VEX_W_0FFB_P_2 */
11039 { "vpsubq", { XM
, Vex
, EXx
}, 0 },
11042 /* VEX_W_0FFC_P_2 */
11043 { "vpaddb", { XM
, Vex
, EXx
}, 0 },
11046 /* VEX_W_0FFD_P_2 */
11047 { "vpaddw", { XM
, Vex
, EXx
}, 0 },
11050 /* VEX_W_0FFE_P_2 */
11051 { "vpaddd", { XM
, Vex
, EXx
}, 0 },
11054 /* VEX_W_0F3800_P_2 */
11055 { "vpshufb", { XM
, Vex
, EXx
}, 0 },
11058 /* VEX_W_0F3801_P_2 */
11059 { "vphaddw", { XM
, Vex
, EXx
}, 0 },
11062 /* VEX_W_0F3802_P_2 */
11063 { "vphaddd", { XM
, Vex
, EXx
}, 0 },
11066 /* VEX_W_0F3803_P_2 */
11067 { "vphaddsw", { XM
, Vex
, EXx
}, 0 },
11070 /* VEX_W_0F3804_P_2 */
11071 { "vpmaddubsw", { XM
, Vex
, EXx
}, 0 },
11074 /* VEX_W_0F3805_P_2 */
11075 { "vphsubw", { XM
, Vex
, EXx
}, 0 },
11078 /* VEX_W_0F3806_P_2 */
11079 { "vphsubd", { XM
, Vex
, EXx
}, 0 },
11082 /* VEX_W_0F3807_P_2 */
11083 { "vphsubsw", { XM
, Vex
, EXx
}, 0 },
11086 /* VEX_W_0F3808_P_2 */
11087 { "vpsignb", { XM
, Vex
, EXx
}, 0 },
11090 /* VEX_W_0F3809_P_2 */
11091 { "vpsignw", { XM
, Vex
, EXx
}, 0 },
11094 /* VEX_W_0F380A_P_2 */
11095 { "vpsignd", { XM
, Vex
, EXx
}, 0 },
11098 /* VEX_W_0F380B_P_2 */
11099 { "vpmulhrsw", { XM
, Vex
, EXx
}, 0 },
11102 /* VEX_W_0F380C_P_2 */
11103 { "vpermilps", { XM
, Vex
, EXx
}, 0 },
11106 /* VEX_W_0F380D_P_2 */
11107 { "vpermilpd", { XM
, Vex
, EXx
}, 0 },
11110 /* VEX_W_0F380E_P_2 */
11111 { "vtestps", { XM
, EXx
}, 0 },
11114 /* VEX_W_0F380F_P_2 */
11115 { "vtestpd", { XM
, EXx
}, 0 },
11118 /* VEX_W_0F3816_P_2 */
11119 { "vpermps", { XM
, Vex
, EXx
}, 0 },
11122 /* VEX_W_0F3817_P_2 */
11123 { "vptest", { XM
, EXx
}, 0 },
11126 /* VEX_W_0F3818_P_2 */
11127 { "vbroadcastss", { XM
, EXxmm_md
}, 0 },
11130 /* VEX_W_0F3819_P_2 */
11131 { "vbroadcastsd", { XM
, EXxmm_mq
}, 0 },
11134 /* VEX_W_0F381A_P_2_M_0 */
11135 { "vbroadcastf128", { XM
, Mxmm
}, 0 },
11138 /* VEX_W_0F381C_P_2 */
11139 { "vpabsb", { XM
, EXx
}, 0 },
11142 /* VEX_W_0F381D_P_2 */
11143 { "vpabsw", { XM
, EXx
}, 0 },
11146 /* VEX_W_0F381E_P_2 */
11147 { "vpabsd", { XM
, EXx
}, 0 },
11150 /* VEX_W_0F3820_P_2 */
11151 { "vpmovsxbw", { XM
, EXxmmq
}, 0 },
11154 /* VEX_W_0F3821_P_2 */
11155 { "vpmovsxbd", { XM
, EXxmmqd
}, 0 },
11158 /* VEX_W_0F3822_P_2 */
11159 { "vpmovsxbq", { XM
, EXxmmdw
}, 0 },
11162 /* VEX_W_0F3823_P_2 */
11163 { "vpmovsxwd", { XM
, EXxmmq
}, 0 },
11166 /* VEX_W_0F3824_P_2 */
11167 { "vpmovsxwq", { XM
, EXxmmqd
}, 0 },
11170 /* VEX_W_0F3825_P_2 */
11171 { "vpmovsxdq", { XM
, EXxmmq
}, 0 },
11174 /* VEX_W_0F3828_P_2 */
11175 { "vpmuldq", { XM
, Vex
, EXx
}, 0 },
11178 /* VEX_W_0F3829_P_2 */
11179 { "vpcmpeqq", { XM
, Vex
, EXx
}, 0 },
11182 /* VEX_W_0F382A_P_2_M_0 */
11183 { "vmovntdqa", { XM
, Mx
}, 0 },
11186 /* VEX_W_0F382B_P_2 */
11187 { "vpackusdw", { XM
, Vex
, EXx
}, 0 },
11190 /* VEX_W_0F382C_P_2_M_0 */
11191 { "vmaskmovps", { XM
, Vex
, Mx
}, 0 },
11194 /* VEX_W_0F382D_P_2_M_0 */
11195 { "vmaskmovpd", { XM
, Vex
, Mx
}, 0 },
11198 /* VEX_W_0F382E_P_2_M_0 */
11199 { "vmaskmovps", { Mx
, Vex
, XM
}, 0 },
11202 /* VEX_W_0F382F_P_2_M_0 */
11203 { "vmaskmovpd", { Mx
, Vex
, XM
}, 0 },
11206 /* VEX_W_0F3830_P_2 */
11207 { "vpmovzxbw", { XM
, EXxmmq
}, 0 },
11210 /* VEX_W_0F3831_P_2 */
11211 { "vpmovzxbd", { XM
, EXxmmqd
}, 0 },
11214 /* VEX_W_0F3832_P_2 */
11215 { "vpmovzxbq", { XM
, EXxmmdw
}, 0 },
11218 /* VEX_W_0F3833_P_2 */
11219 { "vpmovzxwd", { XM
, EXxmmq
}, 0 },
11222 /* VEX_W_0F3834_P_2 */
11223 { "vpmovzxwq", { XM
, EXxmmqd
}, 0 },
11226 /* VEX_W_0F3835_P_2 */
11227 { "vpmovzxdq", { XM
, EXxmmq
}, 0 },
11230 /* VEX_W_0F3836_P_2 */
11231 { "vpermd", { XM
, Vex
, EXx
}, 0 },
11234 /* VEX_W_0F3837_P_2 */
11235 { "vpcmpgtq", { XM
, Vex
, EXx
}, 0 },
11238 /* VEX_W_0F3838_P_2 */
11239 { "vpminsb", { XM
, Vex
, EXx
}, 0 },
11242 /* VEX_W_0F3839_P_2 */
11243 { "vpminsd", { XM
, Vex
, EXx
}, 0 },
11246 /* VEX_W_0F383A_P_2 */
11247 { "vpminuw", { XM
, Vex
, EXx
}, 0 },
11250 /* VEX_W_0F383B_P_2 */
11251 { "vpminud", { XM
, Vex
, EXx
}, 0 },
11254 /* VEX_W_0F383C_P_2 */
11255 { "vpmaxsb", { XM
, Vex
, EXx
}, 0 },
11258 /* VEX_W_0F383D_P_2 */
11259 { "vpmaxsd", { XM
, Vex
, EXx
}, 0 },
11262 /* VEX_W_0F383E_P_2 */
11263 { "vpmaxuw", { XM
, Vex
, EXx
}, 0 },
11266 /* VEX_W_0F383F_P_2 */
11267 { "vpmaxud", { XM
, Vex
, EXx
}, 0 },
11270 /* VEX_W_0F3840_P_2 */
11271 { "vpmulld", { XM
, Vex
, EXx
}, 0 },
11274 /* VEX_W_0F3841_P_2 */
11275 { "vphminposuw", { XM
, EXx
}, 0 },
11278 /* VEX_W_0F3846_P_2 */
11279 { "vpsravd", { XM
, Vex
, EXx
}, 0 },
11282 /* VEX_W_0F3858_P_2 */
11283 { "vpbroadcastd", { XM
, EXxmm_md
}, 0 },
11286 /* VEX_W_0F3859_P_2 */
11287 { "vpbroadcastq", { XM
, EXxmm_mq
}, 0 },
11290 /* VEX_W_0F385A_P_2_M_0 */
11291 { "vbroadcasti128", { XM
, Mxmm
}, 0 },
11294 /* VEX_W_0F3878_P_2 */
11295 { "vpbroadcastb", { XM
, EXxmm_mb
}, 0 },
11298 /* VEX_W_0F3879_P_2 */
11299 { "vpbroadcastw", { XM
, EXxmm_mw
}, 0 },
11302 /* VEX_W_0F38CF_P_2 */
11303 { "vgf2p8mulb", { XM
, Vex
, EXx
}, 0 },
11306 /* VEX_W_0F38DB_P_2 */
11307 { "vaesimc", { XM
, EXx
}, 0 },
11310 /* VEX_W_0F3A00_P_2 */
11312 { "vpermq", { XM
, EXx
, Ib
}, 0 },
11315 /* VEX_W_0F3A01_P_2 */
11317 { "vpermpd", { XM
, EXx
, Ib
}, 0 },
11320 /* VEX_W_0F3A02_P_2 */
11321 { "vpblendd", { XM
, Vex
, EXx
, Ib
}, 0 },
11324 /* VEX_W_0F3A04_P_2 */
11325 { "vpermilps", { XM
, EXx
, Ib
}, 0 },
11328 /* VEX_W_0F3A05_P_2 */
11329 { "vpermilpd", { XM
, EXx
, Ib
}, 0 },
11332 /* VEX_W_0F3A06_P_2 */
11333 { "vperm2f128", { XM
, Vex256
, EXx
, Ib
}, 0 },
11336 /* VEX_W_0F3A08_P_2 */
11337 { "vroundps", { XM
, EXx
, Ib
}, 0 },
11340 /* VEX_W_0F3A09_P_2 */
11341 { "vroundpd", { XM
, EXx
, Ib
}, 0 },
11344 /* VEX_W_0F3A0A_P_2 */
11345 { "vroundss", { XMScalar
, VexScalar
, EXdScalar
, Ib
}, 0 },
11348 /* VEX_W_0F3A0B_P_2 */
11349 { "vroundsd", { XMScalar
, VexScalar
, EXqScalar
, Ib
}, 0 },
11352 /* VEX_W_0F3A0C_P_2 */
11353 { "vblendps", { XM
, Vex
, EXx
, Ib
}, 0 },
11356 /* VEX_W_0F3A0D_P_2 */
11357 { "vblendpd", { XM
, Vex
, EXx
, Ib
}, 0 },
11360 /* VEX_W_0F3A0E_P_2 */
11361 { "vpblendw", { XM
, Vex
, EXx
, Ib
}, 0 },
11364 /* VEX_W_0F3A0F_P_2 */
11365 { "vpalignr", { XM
, Vex
, EXx
, Ib
}, 0 },
11368 /* VEX_W_0F3A14_P_2 */
11369 { "vpextrb", { Edqb
, XM
, Ib
}, 0 },
11372 /* VEX_W_0F3A15_P_2 */
11373 { "vpextrw", { Edqw
, XM
, Ib
}, 0 },
11376 /* VEX_W_0F3A18_P_2 */
11377 { "vinsertf128", { XM
, Vex256
, EXxmm
, Ib
}, 0 },
11380 /* VEX_W_0F3A19_P_2 */
11381 { "vextractf128", { EXxmm
, XM
, Ib
}, 0 },
11384 /* VEX_W_0F3A20_P_2 */
11385 { "vpinsrb", { XM
, Vex128
, Edqb
, Ib
}, 0 },
11388 /* VEX_W_0F3A21_P_2 */
11389 { "vinsertps", { XM
, Vex128
, EXd
, Ib
}, 0 },
11392 /* VEX_W_0F3A30_P_2_LEN_0 */
11393 { MOD_TABLE (MOD_VEX_W_0_0F3A30_P_2_LEN_0
) },
11394 { MOD_TABLE (MOD_VEX_W_1_0F3A30_P_2_LEN_0
) },
11397 /* VEX_W_0F3A31_P_2_LEN_0 */
11398 { MOD_TABLE (MOD_VEX_W_0_0F3A31_P_2_LEN_0
) },
11399 { MOD_TABLE (MOD_VEX_W_1_0F3A31_P_2_LEN_0
) },
11402 /* VEX_W_0F3A32_P_2_LEN_0 */
11403 { MOD_TABLE (MOD_VEX_W_0_0F3A32_P_2_LEN_0
) },
11404 { MOD_TABLE (MOD_VEX_W_1_0F3A32_P_2_LEN_0
) },
11407 /* VEX_W_0F3A33_P_2_LEN_0 */
11408 { MOD_TABLE (MOD_VEX_W_0_0F3A33_P_2_LEN_0
) },
11409 { MOD_TABLE (MOD_VEX_W_1_0F3A33_P_2_LEN_0
) },
11412 /* VEX_W_0F3A38_P_2 */
11413 { "vinserti128", { XM
, Vex256
, EXxmm
, Ib
}, 0 },
11416 /* VEX_W_0F3A39_P_2 */
11417 { "vextracti128", { EXxmm
, XM
, Ib
}, 0 },
11420 /* VEX_W_0F3A40_P_2 */
11421 { "vdpps", { XM
, Vex
, EXx
, Ib
}, 0 },
11424 /* VEX_W_0F3A41_P_2 */
11425 { "vdppd", { XM
, Vex128
, EXx
, Ib
}, 0 },
11428 /* VEX_W_0F3A42_P_2 */
11429 { "vmpsadbw", { XM
, Vex
, EXx
, Ib
}, 0 },
11432 /* VEX_W_0F3A44_P_2 */
11433 { "vpclmulqdq", { XM
, Vex128
, EXx
, PCLMUL
}, 0 },
11436 /* VEX_W_0F3A46_P_2 */
11437 { "vperm2i128", { XM
, Vex256
, EXx
, Ib
}, 0 },
11440 /* VEX_W_0F3A48_P_2 */
11441 { "vpermil2ps", { XMVexW
, Vex
, EXVexImmW
, EXVexImmW
, EXVexImmW
}, 0 },
11442 { "vpermil2ps", { XMVexW
, Vex
, EXVexImmW
, EXVexImmW
, EXVexImmW
}, 0 },
11445 /* VEX_W_0F3A49_P_2 */
11446 { "vpermil2pd", { XMVexW
, Vex
, EXVexImmW
, EXVexImmW
, EXVexImmW
}, 0 },
11447 { "vpermil2pd", { XMVexW
, Vex
, EXVexImmW
, EXVexImmW
, EXVexImmW
}, 0 },
11450 /* VEX_W_0F3A4A_P_2 */
11451 { "vblendvps", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
11454 /* VEX_W_0F3A4B_P_2 */
11455 { "vblendvpd", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
11458 /* VEX_W_0F3A4C_P_2 */
11459 { "vpblendvb", { XM
, Vex
, EXx
, XMVexI4
}, 0 },
11462 /* VEX_W_0F3A62_P_2 */
11463 { "vpcmpistrm", { XM
, EXx
, Ib
}, 0 },
11466 /* VEX_W_0F3A63_P_2 */
11467 { "vpcmpistri", { XM
, EXx
, Ib
}, 0 },
11470 /* VEX_W_0F3ACE_P_2 */
11472 { "vgf2p8affineqb", { XM
, Vex
, EXx
, Ib
}, 0 },
11475 /* VEX_W_0F3ACF_P_2 */
11477 { "vgf2p8affineinvqb", { XM
, Vex
, EXx
, Ib
}, 0 },
11480 /* VEX_W_0F3ADF_P_2 */
11481 { "vaeskeygenassist", { XM
, EXx
, Ib
}, 0 },
11483 #define NEED_VEX_W_TABLE
11484 #include "i386-dis-evex.h"
11485 #undef NEED_VEX_W_TABLE
11488 static const struct dis386 mod_table
[][2] = {
11491 { "leaS", { Gv
, M
}, 0 },
11496 { RM_TABLE (RM_C6_REG_7
) },
11501 { RM_TABLE (RM_C7_REG_7
) },
11505 { "Jcall^", { indirEp
}, 0 },
11509 { "Jjmp^", { indirEp
}, 0 },
11512 /* MOD_0F01_REG_0 */
11513 { X86_64_TABLE (X86_64_0F01_REG_0
) },
11514 { RM_TABLE (RM_0F01_REG_0
) },
11517 /* MOD_0F01_REG_1 */
11518 { X86_64_TABLE (X86_64_0F01_REG_1
) },
11519 { RM_TABLE (RM_0F01_REG_1
) },
11522 /* MOD_0F01_REG_2 */
11523 { X86_64_TABLE (X86_64_0F01_REG_2
) },
11524 { RM_TABLE (RM_0F01_REG_2
) },
11527 /* MOD_0F01_REG_3 */
11528 { X86_64_TABLE (X86_64_0F01_REG_3
) },
11529 { RM_TABLE (RM_0F01_REG_3
) },
11532 /* MOD_0F01_REG_5 */
11533 { PREFIX_TABLE (PREFIX_MOD_0_0F01_REG_5
) },
11534 { RM_TABLE (RM_0F01_REG_5
) },
11537 /* MOD_0F01_REG_7 */
11538 { "invlpg", { Mb
}, 0 },
11539 { RM_TABLE (RM_0F01_REG_7
) },
11542 /* MOD_0F12_PREFIX_0 */
11543 { "movlps", { XM
, EXq
}, PREFIX_OPCODE
},
11544 { "movhlps", { XM
, EXq
}, PREFIX_OPCODE
},
11548 { "movlpX", { EXq
, XM
}, PREFIX_OPCODE
},
11551 /* MOD_0F16_PREFIX_0 */
11552 { "movhps", { XM
, EXq
}, 0 },
11553 { "movlhps", { XM
, EXq
}, 0 },
11557 { "movhpX", { EXq
, XM
}, PREFIX_OPCODE
},
11560 /* MOD_0F18_REG_0 */
11561 { "prefetchnta", { Mb
}, 0 },
11564 /* MOD_0F18_REG_1 */
11565 { "prefetcht0", { Mb
}, 0 },
11568 /* MOD_0F18_REG_2 */
11569 { "prefetcht1", { Mb
}, 0 },
11572 /* MOD_0F18_REG_3 */
11573 { "prefetcht2", { Mb
}, 0 },
11576 /* MOD_0F18_REG_4 */
11577 { "nop/reserved", { Mb
}, 0 },
11580 /* MOD_0F18_REG_5 */
11581 { "nop/reserved", { Mb
}, 0 },
11584 /* MOD_0F18_REG_6 */
11585 { "nop/reserved", { Mb
}, 0 },
11588 /* MOD_0F18_REG_7 */
11589 { "nop/reserved", { Mb
}, 0 },
11592 /* MOD_0F1A_PREFIX_0 */
11593 { "bndldx", { Gbnd
, Ev_bnd
}, 0 },
11594 { "nopQ", { Ev
}, 0 },
11597 /* MOD_0F1B_PREFIX_0 */
11598 { "bndstx", { Ev_bnd
, Gbnd
}, 0 },
11599 { "nopQ", { Ev
}, 0 },
11602 /* MOD_0F1B_PREFIX_1 */
11603 { "bndmk", { Gbnd
, Ev_bnd
}, 0 },
11604 { "nopQ", { Ev
}, 0 },
11607 /* MOD_0F1E_PREFIX_1 */
11608 { "nopQ", { Ev
}, 0 },
11609 { REG_TABLE (REG_0F1E_MOD_3
) },
11614 { "movL", { Rd
, Td
}, 0 },
11619 { "movL", { Td
, Rd
}, 0 },
11622 /* MOD_0F2B_PREFIX_0 */
11623 {"movntps", { Mx
, XM
}, PREFIX_OPCODE
},
11626 /* MOD_0F2B_PREFIX_1 */
11627 {"movntss", { Md
, XM
}, PREFIX_OPCODE
},
11630 /* MOD_0F2B_PREFIX_2 */
11631 {"movntpd", { Mx
, XM
}, PREFIX_OPCODE
},
11634 /* MOD_0F2B_PREFIX_3 */
11635 {"movntsd", { Mq
, XM
}, PREFIX_OPCODE
},
11640 { "movmskpX", { Gdq
, XS
}, PREFIX_OPCODE
},
11643 /* MOD_0F71_REG_2 */
11645 { "psrlw", { MS
, Ib
}, 0 },
11648 /* MOD_0F71_REG_4 */
11650 { "psraw", { MS
, Ib
}, 0 },
11653 /* MOD_0F71_REG_6 */
11655 { "psllw", { MS
, Ib
}, 0 },
11658 /* MOD_0F72_REG_2 */
11660 { "psrld", { MS
, Ib
}, 0 },
11663 /* MOD_0F72_REG_4 */
11665 { "psrad", { MS
, Ib
}, 0 },
11668 /* MOD_0F72_REG_6 */
11670 { "pslld", { MS
, Ib
}, 0 },
11673 /* MOD_0F73_REG_2 */
11675 { "psrlq", { MS
, Ib
}, 0 },
11678 /* MOD_0F73_REG_3 */
11680 { PREFIX_TABLE (PREFIX_0F73_REG_3
) },
11683 /* MOD_0F73_REG_6 */
11685 { "psllq", { MS
, Ib
}, 0 },
11688 /* MOD_0F73_REG_7 */
11690 { PREFIX_TABLE (PREFIX_0F73_REG_7
) },
11693 /* MOD_0FAE_REG_0 */
11694 { "fxsave", { FXSAVE
}, 0 },
11695 { PREFIX_TABLE (PREFIX_0FAE_REG_0
) },
11698 /* MOD_0FAE_REG_1 */
11699 { "fxrstor", { FXSAVE
}, 0 },
11700 { PREFIX_TABLE (PREFIX_0FAE_REG_1
) },
11703 /* MOD_0FAE_REG_2 */
11704 { "ldmxcsr", { Md
}, 0 },
11705 { PREFIX_TABLE (PREFIX_0FAE_REG_2
) },
11708 /* MOD_0FAE_REG_3 */
11709 { "stmxcsr", { Md
}, 0 },
11710 { PREFIX_TABLE (PREFIX_0FAE_REG_3
) },
11713 /* MOD_0FAE_REG_4 */
11714 { PREFIX_TABLE (PREFIX_MOD_0_0FAE_REG_4
) },
11715 { PREFIX_TABLE (PREFIX_MOD_3_0FAE_REG_4
) },
11718 /* MOD_0FAE_REG_5 */
11719 { PREFIX_TABLE (PREFIX_MOD_0_0FAE_REG_5
) },
11720 { PREFIX_TABLE (PREFIX_MOD_3_0FAE_REG_5
) },
11723 /* MOD_0FAE_REG_6 */
11724 { PREFIX_TABLE (PREFIX_0FAE_REG_6
) },
11725 { RM_TABLE (RM_0FAE_REG_6
) },
11728 /* MOD_0FAE_REG_7 */
11729 { PREFIX_TABLE (PREFIX_0FAE_REG_7
) },
11730 { RM_TABLE (RM_0FAE_REG_7
) },
11734 { "lssS", { Gv
, Mp
}, 0 },
11738 { "lfsS", { Gv
, Mp
}, 0 },
11742 { "lgsS", { Gv
, Mp
}, 0 },
11746 { PREFIX_TABLE (PREFIX_MOD_0_0FC3
) },
11749 /* MOD_0FC7_REG_3 */
11750 { "xrstors", { FXSAVE
}, 0 },
11753 /* MOD_0FC7_REG_4 */
11754 { "xsavec", { FXSAVE
}, 0 },
11757 /* MOD_0FC7_REG_5 */
11758 { "xsaves", { FXSAVE
}, 0 },
11761 /* MOD_0FC7_REG_6 */
11762 { PREFIX_TABLE (PREFIX_MOD_0_0FC7_REG_6
) },
11763 { PREFIX_TABLE (PREFIX_MOD_3_0FC7_REG_6
) }
11766 /* MOD_0FC7_REG_7 */
11767 { "vmptrst", { Mq
}, 0 },
11768 { PREFIX_TABLE (PREFIX_MOD_3_0FC7_REG_7
) }
11773 { "pmovmskb", { Gdq
, MS
}, 0 },
11776 /* MOD_0FE7_PREFIX_2 */
11777 { "movntdq", { Mx
, XM
}, 0 },
11780 /* MOD_0FF0_PREFIX_3 */
11781 { "lddqu", { XM
, M
}, 0 },
11784 /* MOD_0F382A_PREFIX_2 */
11785 { "movntdqa", { XM
, Mx
}, 0 },
11788 /* MOD_0F38F5_PREFIX_2 */
11789 { "wrussK", { M
, Gdq
}, PREFIX_OPCODE
},
11792 /* MOD_0F38F6_PREFIX_0 */
11793 { "wrssK", { M
, Gdq
}, PREFIX_OPCODE
},
11797 { "bound{S|}", { Gv
, Ma
}, 0 },
11798 { EVEX_TABLE (EVEX_0F
) },
11802 { "lesS", { Gv
, Mp
}, 0 },
11803 { VEX_C4_TABLE (VEX_0F
) },
11807 { "ldsS", { Gv
, Mp
}, 0 },
11808 { VEX_C5_TABLE (VEX_0F
) },
11811 /* MOD_VEX_0F12_PREFIX_0 */
11812 { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_0
) },
11813 { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_1
) },
11817 { VEX_LEN_TABLE (VEX_LEN_0F13_M_0
) },
11820 /* MOD_VEX_0F16_PREFIX_0 */
11821 { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_0
) },
11822 { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_1
) },
11826 { VEX_LEN_TABLE (VEX_LEN_0F17_M_0
) },
11830 { VEX_W_TABLE (VEX_W_0F2B_M_0
) },
11833 /* MOD_VEX_W_0_0F41_P_0_LEN_1 */
11835 { "kandw", { MaskG
, MaskVex
, MaskR
}, 0 },
11838 /* MOD_VEX_W_1_0F41_P_0_LEN_1 */
11840 { "kandq", { MaskG
, MaskVex
, MaskR
}, 0 },
11843 /* MOD_VEX_W_0_0F41_P_2_LEN_1 */
11845 { "kandb", { MaskG
, MaskVex
, MaskR
}, 0 },
11848 /* MOD_VEX_W_1_0F41_P_2_LEN_1 */
11850 { "kandd", { MaskG
, MaskVex
, MaskR
}, 0 },
11853 /* MOD_VEX_W_0_0F42_P_0_LEN_1 */
11855 { "kandnw", { MaskG
, MaskVex
, MaskR
}, 0 },
11858 /* MOD_VEX_W_1_0F42_P_0_LEN_1 */
11860 { "kandnq", { MaskG
, MaskVex
, MaskR
}, 0 },
11863 /* MOD_VEX_W_0_0F42_P_2_LEN_1 */
11865 { "kandnb", { MaskG
, MaskVex
, MaskR
}, 0 },
11868 /* MOD_VEX_W_1_0F42_P_2_LEN_1 */
11870 { "kandnd", { MaskG
, MaskVex
, MaskR
}, 0 },
11873 /* MOD_VEX_W_0_0F44_P_0_LEN_0 */
11875 { "knotw", { MaskG
, MaskR
}, 0 },
11878 /* MOD_VEX_W_1_0F44_P_0_LEN_0 */
11880 { "knotq", { MaskG
, MaskR
}, 0 },
11883 /* MOD_VEX_W_0_0F44_P_2_LEN_0 */
11885 { "knotb", { MaskG
, MaskR
}, 0 },
11888 /* MOD_VEX_W_1_0F44_P_2_LEN_0 */
11890 { "knotd", { MaskG
, MaskR
}, 0 },
11893 /* MOD_VEX_W_0_0F45_P_0_LEN_1 */
11895 { "korw", { MaskG
, MaskVex
, MaskR
}, 0 },
11898 /* MOD_VEX_W_1_0F45_P_0_LEN_1 */
11900 { "korq", { MaskG
, MaskVex
, MaskR
}, 0 },
11903 /* MOD_VEX_W_0_0F45_P_2_LEN_1 */
11905 { "korb", { MaskG
, MaskVex
, MaskR
}, 0 },
11908 /* MOD_VEX_W_1_0F45_P_2_LEN_1 */
11910 { "kord", { MaskG
, MaskVex
, MaskR
}, 0 },
11913 /* MOD_VEX_W_0_0F46_P_0_LEN_1 */
11915 { "kxnorw", { MaskG
, MaskVex
, MaskR
}, 0 },
11918 /* MOD_VEX_W_1_0F46_P_0_LEN_1 */
11920 { "kxnorq", { MaskG
, MaskVex
, MaskR
}, 0 },
11923 /* MOD_VEX_W_0_0F46_P_2_LEN_1 */
11925 { "kxnorb", { MaskG
, MaskVex
, MaskR
}, 0 },
11928 /* MOD_VEX_W_1_0F46_P_2_LEN_1 */
11930 { "kxnord", { MaskG
, MaskVex
, MaskR
}, 0 },
11933 /* MOD_VEX_W_0_0F47_P_0_LEN_1 */
11935 { "kxorw", { MaskG
, MaskVex
, MaskR
}, 0 },
11938 /* MOD_VEX_W_1_0F47_P_0_LEN_1 */
11940 { "kxorq", { MaskG
, MaskVex
, MaskR
}, 0 },
11943 /* MOD_VEX_W_0_0F47_P_2_LEN_1 */
11945 { "kxorb", { MaskG
, MaskVex
, MaskR
}, 0 },
11948 /* MOD_VEX_W_1_0F47_P_2_LEN_1 */
11950 { "kxord", { MaskG
, MaskVex
, MaskR
}, 0 },
11953 /* MOD_VEX_W_0_0F4A_P_0_LEN_1 */
11955 { "kaddw", { MaskG
, MaskVex
, MaskR
}, 0 },
11958 /* MOD_VEX_W_1_0F4A_P_0_LEN_1 */
11960 { "kaddq", { MaskG
, MaskVex
, MaskR
}, 0 },
11963 /* MOD_VEX_W_0_0F4A_P_2_LEN_1 */
11965 { "kaddb", { MaskG
, MaskVex
, MaskR
}, 0 },
11968 /* MOD_VEX_W_1_0F4A_P_2_LEN_1 */
11970 { "kaddd", { MaskG
, MaskVex
, MaskR
}, 0 },
11973 /* MOD_VEX_W_0_0F4B_P_0_LEN_1 */
11975 { "kunpckwd", { MaskG
, MaskVex
, MaskR
}, 0 },
11978 /* MOD_VEX_W_1_0F4B_P_0_LEN_1 */
11980 { "kunpckdq", { MaskG
, MaskVex
, MaskR
}, 0 },
11983 /* MOD_VEX_W_0_0F4B_P_2_LEN_1 */
11985 { "kunpckbw", { MaskG
, MaskVex
, MaskR
}, 0 },
11990 { VEX_W_TABLE (VEX_W_0F50_M_0
) },
11993 /* MOD_VEX_0F71_REG_2 */
11995 { PREFIX_TABLE (PREFIX_VEX_0F71_REG_2
) },
11998 /* MOD_VEX_0F71_REG_4 */
12000 { PREFIX_TABLE (PREFIX_VEX_0F71_REG_4
) },
12003 /* MOD_VEX_0F71_REG_6 */
12005 { PREFIX_TABLE (PREFIX_VEX_0F71_REG_6
) },
12008 /* MOD_VEX_0F72_REG_2 */
12010 { PREFIX_TABLE (PREFIX_VEX_0F72_REG_2
) },
12013 /* MOD_VEX_0F72_REG_4 */
12015 { PREFIX_TABLE (PREFIX_VEX_0F72_REG_4
) },
12018 /* MOD_VEX_0F72_REG_6 */
12020 { PREFIX_TABLE (PREFIX_VEX_0F72_REG_6
) },
12023 /* MOD_VEX_0F73_REG_2 */
12025 { PREFIX_TABLE (PREFIX_VEX_0F73_REG_2
) },
12028 /* MOD_VEX_0F73_REG_3 */
12030 { PREFIX_TABLE (PREFIX_VEX_0F73_REG_3
) },
12033 /* MOD_VEX_0F73_REG_6 */
12035 { PREFIX_TABLE (PREFIX_VEX_0F73_REG_6
) },
12038 /* MOD_VEX_0F73_REG_7 */
12040 { PREFIX_TABLE (PREFIX_VEX_0F73_REG_7
) },
12043 /* MOD_VEX_W_0_0F91_P_0_LEN_0 */
12044 { "kmovw", { Ew
, MaskG
}, 0 },
12048 /* MOD_VEX_W_0_0F91_P_0_LEN_0 */
12049 { "kmovq", { Eq
, MaskG
}, 0 },
12053 /* MOD_VEX_W_0_0F91_P_2_LEN_0 */
12054 { "kmovb", { Eb
, MaskG
}, 0 },
12058 /* MOD_VEX_W_0_0F91_P_2_LEN_0 */
12059 { "kmovd", { Ed
, MaskG
}, 0 },
12063 /* MOD_VEX_W_0_0F92_P_0_LEN_0 */
12065 { "kmovw", { MaskG
, Rdq
}, 0 },
12068 /* MOD_VEX_W_0_0F92_P_2_LEN_0 */
12070 { "kmovb", { MaskG
, Rdq
}, 0 },
12073 /* MOD_VEX_W_0_0F92_P_3_LEN_0 */
12075 { "kmovd", { MaskG
, Rdq
}, 0 },
12078 /* MOD_VEX_W_1_0F92_P_3_LEN_0 */
12080 { "kmovq", { MaskG
, Rdq
}, 0 },
12083 /* MOD_VEX_W_0_0F93_P_0_LEN_0 */
12085 { "kmovw", { Gdq
, MaskR
}, 0 },
12088 /* MOD_VEX_W_0_0F93_P_2_LEN_0 */
12090 { "kmovb", { Gdq
, MaskR
}, 0 },
12093 /* MOD_VEX_W_0_0F93_P_3_LEN_0 */
12095 { "kmovd", { Gdq
, MaskR
}, 0 },
12098 /* MOD_VEX_W_1_0F93_P_3_LEN_0 */
12100 { "kmovq", { Gdq
, MaskR
}, 0 },
12103 /* MOD_VEX_W_0_0F98_P_0_LEN_0 */
12105 { "kortestw", { MaskG
, MaskR
}, 0 },
12108 /* MOD_VEX_W_1_0F98_P_0_LEN_0 */
12110 { "kortestq", { MaskG
, MaskR
}, 0 },
12113 /* MOD_VEX_W_0_0F98_P_2_LEN_0 */
12115 { "kortestb", { MaskG
, MaskR
}, 0 },
12118 /* MOD_VEX_W_1_0F98_P_2_LEN_0 */
12120 { "kortestd", { MaskG
, MaskR
}, 0 },
12123 /* MOD_VEX_W_0_0F99_P_0_LEN_0 */
12125 { "ktestw", { MaskG
, MaskR
}, 0 },
12128 /* MOD_VEX_W_1_0F99_P_0_LEN_0 */
12130 { "ktestq", { MaskG
, MaskR
}, 0 },
12133 /* MOD_VEX_W_0_0F99_P_2_LEN_0 */
12135 { "ktestb", { MaskG
, MaskR
}, 0 },
12138 /* MOD_VEX_W_1_0F99_P_2_LEN_0 */
12140 { "ktestd", { MaskG
, MaskR
}, 0 },
12143 /* MOD_VEX_0FAE_REG_2 */
12144 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_2_M_0
) },
12147 /* MOD_VEX_0FAE_REG_3 */
12148 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_3_M_0
) },
12151 /* MOD_VEX_0FD7_PREFIX_2 */
12153 { VEX_W_TABLE (VEX_W_0FD7_P_2_M_1
) },
12156 /* MOD_VEX_0FE7_PREFIX_2 */
12157 { VEX_W_TABLE (VEX_W_0FE7_P_2_M_0
) },
12160 /* MOD_VEX_0FF0_PREFIX_3 */
12161 { VEX_W_TABLE (VEX_W_0FF0_P_3_M_0
) },
12164 /* MOD_VEX_0F381A_PREFIX_2 */
12165 { VEX_LEN_TABLE (VEX_LEN_0F381A_P_2_M_0
) },
12168 /* MOD_VEX_0F382A_PREFIX_2 */
12169 { VEX_W_TABLE (VEX_W_0F382A_P_2_M_0
) },
12172 /* MOD_VEX_0F382C_PREFIX_2 */
12173 { VEX_W_TABLE (VEX_W_0F382C_P_2_M_0
) },
12176 /* MOD_VEX_0F382D_PREFIX_2 */
12177 { VEX_W_TABLE (VEX_W_0F382D_P_2_M_0
) },
12180 /* MOD_VEX_0F382E_PREFIX_2 */
12181 { VEX_W_TABLE (VEX_W_0F382E_P_2_M_0
) },
12184 /* MOD_VEX_0F382F_PREFIX_2 */
12185 { VEX_W_TABLE (VEX_W_0F382F_P_2_M_0
) },
12188 /* MOD_VEX_0F385A_PREFIX_2 */
12189 { VEX_LEN_TABLE (VEX_LEN_0F385A_P_2_M_0
) },
12192 /* MOD_VEX_0F388C_PREFIX_2 */
12193 { "vpmaskmov%LW", { XM
, Vex
, Mx
}, 0 },
12196 /* MOD_VEX_0F388E_PREFIX_2 */
12197 { "vpmaskmov%LW", { Mx
, Vex
, XM
}, 0 },
12200 /* MOD_VEX_W_0_0F3A30_P_2_LEN_0 */
12202 { "kshiftrb", { MaskG
, MaskR
, Ib
}, 0 },
12205 /* MOD_VEX_W_1_0F3A30_P_2_LEN_0 */
12207 { "kshiftrw", { MaskG
, MaskR
, Ib
}, 0 },
12210 /* MOD_VEX_W_0_0F3A31_P_2_LEN_0 */
12212 { "kshiftrd", { MaskG
, MaskR
, Ib
}, 0 },
12215 /* MOD_VEX_W_1_0F3A31_P_2_LEN_0 */
12217 { "kshiftrq", { MaskG
, MaskR
, Ib
}, 0 },
12220 /* MOD_VEX_W_0_0F3A32_P_2_LEN_0 */
12222 { "kshiftlb", { MaskG
, MaskR
, Ib
}, 0 },
12225 /* MOD_VEX_W_1_0F3A32_P_2_LEN_0 */
12227 { "kshiftlw", { MaskG
, MaskR
, Ib
}, 0 },
12230 /* MOD_VEX_W_0_0F3A33_P_2_LEN_0 */
12232 { "kshiftld", { MaskG
, MaskR
, Ib
}, 0 },
12235 /* MOD_VEX_W_1_0F3A33_P_2_LEN_0 */
12237 { "kshiftlq", { MaskG
, MaskR
, Ib
}, 0 },
12239 #define NEED_MOD_TABLE
12240 #include "i386-dis-evex.h"
12241 #undef NEED_MOD_TABLE
12244 static const struct dis386 rm_table
[][8] = {
12247 { "xabort", { Skip_MODRM
, Ib
}, 0 },
12251 { "xbeginT", { Skip_MODRM
, Jv
}, 0 },
12254 /* RM_0F01_REG_0 */
12256 { "vmcall", { Skip_MODRM
}, 0 },
12257 { "vmlaunch", { Skip_MODRM
}, 0 },
12258 { "vmresume", { Skip_MODRM
}, 0 },
12259 { "vmxoff", { Skip_MODRM
}, 0 },
12262 /* RM_0F01_REG_1 */
12263 { "monitor", { { OP_Monitor
, 0 } }, 0 },
12264 { "mwait", { { OP_Mwait
, 0 } }, 0 },
12265 { "clac", { Skip_MODRM
}, 0 },
12266 { "stac", { Skip_MODRM
}, 0 },
12270 { "encls", { Skip_MODRM
}, 0 },
12273 /* RM_0F01_REG_2 */
12274 { "xgetbv", { Skip_MODRM
}, 0 },
12275 { "xsetbv", { Skip_MODRM
}, 0 },
12278 { "vmfunc", { Skip_MODRM
}, 0 },
12279 { "xend", { Skip_MODRM
}, 0 },
12280 { "xtest", { Skip_MODRM
}, 0 },
12281 { "enclu", { Skip_MODRM
}, 0 },
12284 /* RM_0F01_REG_3 */
12285 { "vmrun", { Skip_MODRM
}, 0 },
12286 { "vmmcall", { Skip_MODRM
}, 0 },
12287 { "vmload", { Skip_MODRM
}, 0 },
12288 { "vmsave", { Skip_MODRM
}, 0 },
12289 { "stgi", { Skip_MODRM
}, 0 },
12290 { "clgi", { Skip_MODRM
}, 0 },
12291 { "skinit", { Skip_MODRM
}, 0 },
12292 { "invlpga", { Skip_MODRM
}, 0 },
12295 /* RM_0F01_REG_5 */
12296 { PREFIX_TABLE (PREFIX_MOD_3_0F01_REG_5_RM_0
) },
12298 { PREFIX_TABLE (PREFIX_MOD_3_0F01_REG_5_RM_2
) },
12302 { "rdpkru", { Skip_MODRM
}, 0 },
12303 { "wrpkru", { Skip_MODRM
}, 0 },
12306 /* RM_0F01_REG_7 */
12307 { "swapgs", { Skip_MODRM
}, 0 },
12308 { "rdtscp", { Skip_MODRM
}, 0 },
12309 { "monitorx", { { OP_Monitor
, 0 } }, 0 },
12310 { "mwaitx", { { OP_Mwaitx
, 0 } }, 0 },
12311 { "clzero", { Skip_MODRM
}, 0 },
12314 /* RM_0F1E_MOD_3_REG_7 */
12315 { "nopQ", { Ev
}, 0 },
12316 { "nopQ", { Ev
}, 0 },
12317 { "endbr64", { Skip_MODRM
}, PREFIX_OPCODE
},
12318 { "endbr32", { Skip_MODRM
}, PREFIX_OPCODE
},
12319 { "nopQ", { Ev
}, 0 },
12320 { "nopQ", { Ev
}, 0 },
12321 { "nopQ", { Ev
}, 0 },
12322 { "nopQ", { Ev
}, 0 },
12325 /* RM_0FAE_REG_6 */
12326 { "mfence", { Skip_MODRM
}, 0 },
12329 /* RM_0FAE_REG_7 */
12330 { "sfence", { Skip_MODRM
}, 0 },
12335 #define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
12337 /* We use the high bit to indicate different name for the same
12339 #define REP_PREFIX (0xf3 | 0x100)
12340 #define XACQUIRE_PREFIX (0xf2 | 0x200)
12341 #define XRELEASE_PREFIX (0xf3 | 0x400)
12342 #define BND_PREFIX (0xf2 | 0x400)
12343 #define NOTRACK_PREFIX (0x3e | 0x100)
12348 int newrex
, i
, length
;
12354 last_lock_prefix
= -1;
12355 last_repz_prefix
= -1;
12356 last_repnz_prefix
= -1;
12357 last_data_prefix
= -1;
12358 last_addr_prefix
= -1;
12359 last_rex_prefix
= -1;
12360 last_seg_prefix
= -1;
12362 active_seg_prefix
= 0;
12363 for (i
= 0; i
< (int) ARRAY_SIZE (all_prefixes
); i
++)
12364 all_prefixes
[i
] = 0;
12367 /* The maximum instruction length is 15bytes. */
12368 while (length
< MAX_CODE_LENGTH
- 1)
12370 FETCH_DATA (the_info
, codep
+ 1);
12374 /* REX prefixes family. */
12391 if (address_mode
== mode_64bit
)
12395 last_rex_prefix
= i
;
12398 prefixes
|= PREFIX_REPZ
;
12399 last_repz_prefix
= i
;
12402 prefixes
|= PREFIX_REPNZ
;
12403 last_repnz_prefix
= i
;
12406 prefixes
|= PREFIX_LOCK
;
12407 last_lock_prefix
= i
;
12410 prefixes
|= PREFIX_CS
;
12411 last_seg_prefix
= i
;
12412 active_seg_prefix
= PREFIX_CS
;
12415 prefixes
|= PREFIX_SS
;
12416 last_seg_prefix
= i
;
12417 active_seg_prefix
= PREFIX_SS
;
12420 prefixes
|= PREFIX_DS
;
12421 last_seg_prefix
= i
;
12422 active_seg_prefix
= PREFIX_DS
;
12425 prefixes
|= PREFIX_ES
;
12426 last_seg_prefix
= i
;
12427 active_seg_prefix
= PREFIX_ES
;
12430 prefixes
|= PREFIX_FS
;
12431 last_seg_prefix
= i
;
12432 active_seg_prefix
= PREFIX_FS
;
12435 prefixes
|= PREFIX_GS
;
12436 last_seg_prefix
= i
;
12437 active_seg_prefix
= PREFIX_GS
;
12440 prefixes
|= PREFIX_DATA
;
12441 last_data_prefix
= i
;
12444 prefixes
|= PREFIX_ADDR
;
12445 last_addr_prefix
= i
;
12448 /* fwait is really an instruction. If there are prefixes
12449 before the fwait, they belong to the fwait, *not* to the
12450 following instruction. */
12452 if (prefixes
|| rex
)
12454 prefixes
|= PREFIX_FWAIT
;
12456 /* This ensures that the previous REX prefixes are noticed
12457 as unused prefixes, as in the return case below. */
12461 prefixes
= PREFIX_FWAIT
;
12466 /* Rex is ignored when followed by another prefix. */
12472 if (*codep
!= FWAIT_OPCODE
)
12473 all_prefixes
[i
++] = *codep
;
12481 /* Return the name of the prefix byte PREF, or NULL if PREF is not a
12484 static const char *
12485 prefix_name (int pref
, int sizeflag
)
12487 static const char *rexes
[16] =
12490 "rex.B", /* 0x41 */
12491 "rex.X", /* 0x42 */
12492 "rex.XB", /* 0x43 */
12493 "rex.R", /* 0x44 */
12494 "rex.RB", /* 0x45 */
12495 "rex.RX", /* 0x46 */
12496 "rex.RXB", /* 0x47 */
12497 "rex.W", /* 0x48 */
12498 "rex.WB", /* 0x49 */
12499 "rex.WX", /* 0x4a */
12500 "rex.WXB", /* 0x4b */
12501 "rex.WR", /* 0x4c */
12502 "rex.WRB", /* 0x4d */
12503 "rex.WRX", /* 0x4e */
12504 "rex.WRXB", /* 0x4f */
12509 /* REX prefixes family. */
12526 return rexes
[pref
- 0x40];
12546 return (sizeflag
& DFLAG
) ? "data16" : "data32";
12548 if (address_mode
== mode_64bit
)
12549 return (sizeflag
& AFLAG
) ? "addr32" : "addr64";
12551 return (sizeflag
& AFLAG
) ? "addr16" : "addr32";
12556 case XACQUIRE_PREFIX
:
12558 case XRELEASE_PREFIX
:
12562 case NOTRACK_PREFIX
:
12569 static char op_out
[MAX_OPERANDS
][100];
12570 static int op_ad
, op_index
[MAX_OPERANDS
];
12571 static int two_source_ops
;
12572 static bfd_vma op_address
[MAX_OPERANDS
];
12573 static bfd_vma op_riprel
[MAX_OPERANDS
];
12574 static bfd_vma start_pc
;
12577 * On the 386's of 1988, the maximum length of an instruction is 15 bytes.
12578 * (see topic "Redundant prefixes" in the "Differences from 8086"
12579 * section of the "Virtual 8086 Mode" chapter.)
12580 * 'pc' should be the address of this instruction, it will
12581 * be used to print the target address if this is a relative jump or call
12582 * The function returns the length of this instruction in bytes.
12585 static char intel_syntax
;
12586 static char intel_mnemonic
= !SYSV386_COMPAT
;
12587 static char open_char
;
12588 static char close_char
;
12589 static char separator_char
;
12590 static char scale_char
;
12598 static enum x86_64_isa isa64
;
12600 /* Here for backwards compatibility. When gdb stops using
12601 print_insn_i386_att and print_insn_i386_intel these functions can
12602 disappear, and print_insn_i386 be merged into print_insn. */
12604 print_insn_i386_att (bfd_vma pc
, disassemble_info
*info
)
12608 return print_insn (pc
, info
);
12612 print_insn_i386_intel (bfd_vma pc
, disassemble_info
*info
)
12616 return print_insn (pc
, info
);
12620 print_insn_i386 (bfd_vma pc
, disassemble_info
*info
)
12624 return print_insn (pc
, info
);
12628 print_i386_disassembler_options (FILE *stream
)
12630 fprintf (stream
, _("\n\
12631 The following i386/x86-64 specific disassembler options are supported for use\n\
12632 with the -M switch (multiple options should be separated by commas):\n"));
12634 fprintf (stream
, _(" x86-64 Disassemble in 64bit mode\n"));
12635 fprintf (stream
, _(" i386 Disassemble in 32bit mode\n"));
12636 fprintf (stream
, _(" i8086 Disassemble in 16bit mode\n"));
12637 fprintf (stream
, _(" att Display instruction in AT&T syntax\n"));
12638 fprintf (stream
, _(" intel Display instruction in Intel syntax\n"));
12639 fprintf (stream
, _(" att-mnemonic\n"
12640 " Display instruction in AT&T mnemonic\n"));
12641 fprintf (stream
, _(" intel-mnemonic\n"
12642 " Display instruction in Intel mnemonic\n"));
12643 fprintf (stream
, _(" addr64 Assume 64bit address size\n"));
12644 fprintf (stream
, _(" addr32 Assume 32bit address size\n"));
12645 fprintf (stream
, _(" addr16 Assume 16bit address size\n"));
12646 fprintf (stream
, _(" data32 Assume 32bit data size\n"));
12647 fprintf (stream
, _(" data16 Assume 16bit data size\n"));
12648 fprintf (stream
, _(" suffix Always display instruction suffix in AT&T syntax\n"));
12649 fprintf (stream
, _(" amd64 Display instruction in AMD64 ISA\n"));
12650 fprintf (stream
, _(" intel64 Display instruction in Intel64 ISA\n"));
12654 static const struct dis386 bad_opcode
= { "(bad)", { XX
}, 0 };
12656 /* Get a pointer to struct dis386 with a valid name. */
12658 static const struct dis386
*
12659 get_valid_dis386 (const struct dis386
*dp
, disassemble_info
*info
)
12661 int vindex
, vex_table_index
;
12663 if (dp
->name
!= NULL
)
12666 switch (dp
->op
[0].bytemode
)
12668 case USE_REG_TABLE
:
12669 dp
= ®_table
[dp
->op
[1].bytemode
][modrm
.reg
];
12672 case USE_MOD_TABLE
:
12673 vindex
= modrm
.mod
== 0x3 ? 1 : 0;
12674 dp
= &mod_table
[dp
->op
[1].bytemode
][vindex
];
12678 dp
= &rm_table
[dp
->op
[1].bytemode
][modrm
.rm
];
12681 case USE_PREFIX_TABLE
:
12684 /* The prefix in VEX is implicit. */
12685 switch (vex
.prefix
)
12690 case REPE_PREFIX_OPCODE
:
12693 case DATA_PREFIX_OPCODE
:
12696 case REPNE_PREFIX_OPCODE
:
12706 int last_prefix
= -1;
12709 /* We check PREFIX_REPNZ and PREFIX_REPZ before PREFIX_DATA.
12710 When there are multiple PREFIX_REPNZ and PREFIX_REPZ, the
12712 if ((prefixes
& (PREFIX_REPZ
| PREFIX_REPNZ
)) != 0)
12714 if (last_repz_prefix
> last_repnz_prefix
)
12717 prefix
= PREFIX_REPZ
;
12718 last_prefix
= last_repz_prefix
;
12723 prefix
= PREFIX_REPNZ
;
12724 last_prefix
= last_repnz_prefix
;
12727 /* Check if prefix should be ignored. */
12728 if ((((prefix_table
[dp
->op
[1].bytemode
][vindex
].prefix_requirement
12729 & PREFIX_IGNORED
) >> PREFIX_IGNORED_SHIFT
)
12734 if (vindex
== 0 && (prefixes
& PREFIX_DATA
) != 0)
12737 prefix
= PREFIX_DATA
;
12738 last_prefix
= last_data_prefix
;
12743 used_prefixes
|= prefix
;
12744 all_prefixes
[last_prefix
] = 0;
12747 dp
= &prefix_table
[dp
->op
[1].bytemode
][vindex
];
12750 case USE_X86_64_TABLE
:
12751 vindex
= address_mode
== mode_64bit
? 1 : 0;
12752 dp
= &x86_64_table
[dp
->op
[1].bytemode
][vindex
];
12755 case USE_3BYTE_TABLE
:
12756 FETCH_DATA (info
, codep
+ 2);
12758 dp
= &three_byte_table
[dp
->op
[1].bytemode
][vindex
];
12760 modrm
.mod
= (*codep
>> 6) & 3;
12761 modrm
.reg
= (*codep
>> 3) & 7;
12762 modrm
.rm
= *codep
& 7;
12765 case USE_VEX_LEN_TABLE
:
12769 switch (vex
.length
)
12782 dp
= &vex_len_table
[dp
->op
[1].bytemode
][vindex
];
12785 case USE_XOP_8F_TABLE
:
12786 FETCH_DATA (info
, codep
+ 3);
12787 /* All bits in the REX prefix are ignored. */
12789 rex
= ~(*codep
>> 5) & 0x7;
12791 /* VEX_TABLE_INDEX is the mmmmm part of the XOP byte 1 "RCB.mmmmm". */
12792 switch ((*codep
& 0x1f))
12798 vex_table_index
= XOP_08
;
12801 vex_table_index
= XOP_09
;
12804 vex_table_index
= XOP_0A
;
12808 vex
.w
= *codep
& 0x80;
12809 if (vex
.w
&& address_mode
== mode_64bit
)
12812 vex
.register_specifier
= (~(*codep
>> 3)) & 0xf;
12813 if (address_mode
!= mode_64bit
)
12815 /* In 16/32-bit mode REX_B is silently ignored. */
12817 if (vex
.register_specifier
> 0x7)
12824 vex
.length
= (*codep
& 0x4) ? 256 : 128;
12825 switch ((*codep
& 0x3))
12831 vex
.prefix
= DATA_PREFIX_OPCODE
;
12834 vex
.prefix
= REPE_PREFIX_OPCODE
;
12837 vex
.prefix
= REPNE_PREFIX_OPCODE
;
12844 dp
= &xop_table
[vex_table_index
][vindex
];
12847 FETCH_DATA (info
, codep
+ 1);
12848 modrm
.mod
= (*codep
>> 6) & 3;
12849 modrm
.reg
= (*codep
>> 3) & 7;
12850 modrm
.rm
= *codep
& 7;
12853 case USE_VEX_C4_TABLE
:
12855 FETCH_DATA (info
, codep
+ 3);
12856 /* All bits in the REX prefix are ignored. */
12858 rex
= ~(*codep
>> 5) & 0x7;
12859 switch ((*codep
& 0x1f))
12865 vex_table_index
= VEX_0F
;
12868 vex_table_index
= VEX_0F38
;
12871 vex_table_index
= VEX_0F3A
;
12875 vex
.w
= *codep
& 0x80;
12876 if (address_mode
== mode_64bit
)
12880 vex
.register_specifier
= (~(*codep
>> 3)) & 0xf;
12884 /* For the 3-byte VEX prefix in 32-bit mode, the REX_B bit
12885 is ignored, other REX bits are 0 and the highest bit in
12886 VEX.vvvv is also ignored. */
12888 vex
.register_specifier
= (~(*codep
>> 3)) & 0x7;
12890 vex
.length
= (*codep
& 0x4) ? 256 : 128;
12891 switch ((*codep
& 0x3))
12897 vex
.prefix
= DATA_PREFIX_OPCODE
;
12900 vex
.prefix
= REPE_PREFIX_OPCODE
;
12903 vex
.prefix
= REPNE_PREFIX_OPCODE
;
12910 dp
= &vex_table
[vex_table_index
][vindex
];
12912 /* There is no MODRM byte for VEX0F 77. */
12913 if (vex_table_index
!= VEX_0F
|| vindex
!= 0x77)
12915 FETCH_DATA (info
, codep
+ 1);
12916 modrm
.mod
= (*codep
>> 6) & 3;
12917 modrm
.reg
= (*codep
>> 3) & 7;
12918 modrm
.rm
= *codep
& 7;
12922 case USE_VEX_C5_TABLE
:
12924 FETCH_DATA (info
, codep
+ 2);
12925 /* All bits in the REX prefix are ignored. */
12927 rex
= (*codep
& 0x80) ? 0 : REX_R
;
12929 /* For the 2-byte VEX prefix in 32-bit mode, the highest bit in
12931 vex
.register_specifier
= (~(*codep
>> 3)) & 0xf;
12933 vex
.length
= (*codep
& 0x4) ? 256 : 128;
12934 switch ((*codep
& 0x3))
12940 vex
.prefix
= DATA_PREFIX_OPCODE
;
12943 vex
.prefix
= REPE_PREFIX_OPCODE
;
12946 vex
.prefix
= REPNE_PREFIX_OPCODE
;
12953 dp
= &vex_table
[dp
->op
[1].bytemode
][vindex
];
12955 /* There is no MODRM byte for VEX 77. */
12956 if (vindex
!= 0x77)
12958 FETCH_DATA (info
, codep
+ 1);
12959 modrm
.mod
= (*codep
>> 6) & 3;
12960 modrm
.reg
= (*codep
>> 3) & 7;
12961 modrm
.rm
= *codep
& 7;
12965 case USE_VEX_W_TABLE
:
12969 dp
= &vex_w_table
[dp
->op
[1].bytemode
][vex
.w
? 1 : 0];
12972 case USE_EVEX_TABLE
:
12973 two_source_ops
= 0;
12976 FETCH_DATA (info
, codep
+ 4);
12977 /* All bits in the REX prefix are ignored. */
12979 /* The first byte after 0x62. */
12980 rex
= ~(*codep
>> 5) & 0x7;
12981 vex
.r
= *codep
& 0x10;
12982 switch ((*codep
& 0xf))
12985 return &bad_opcode
;
12987 vex_table_index
= EVEX_0F
;
12990 vex_table_index
= EVEX_0F38
;
12993 vex_table_index
= EVEX_0F3A
;
12997 /* The second byte after 0x62. */
12999 vex
.w
= *codep
& 0x80;
13000 if (vex
.w
&& address_mode
== mode_64bit
)
13003 vex
.register_specifier
= (~(*codep
>> 3)) & 0xf;
13004 if (address_mode
!= mode_64bit
)
13006 /* In 16/32-bit mode silently ignore following bits. */
13010 vex
.register_specifier
&= 0x7;
13014 if (!(*codep
& 0x4))
13015 return &bad_opcode
;
13017 switch ((*codep
& 0x3))
13023 vex
.prefix
= DATA_PREFIX_OPCODE
;
13026 vex
.prefix
= REPE_PREFIX_OPCODE
;
13029 vex
.prefix
= REPNE_PREFIX_OPCODE
;
13033 /* The third byte after 0x62. */
13036 /* Remember the static rounding bits. */
13037 vex
.ll
= (*codep
>> 5) & 3;
13038 vex
.b
= (*codep
& 0x10) != 0;
13040 vex
.v
= *codep
& 0x8;
13041 vex
.mask_register_specifier
= *codep
& 0x7;
13042 vex
.zeroing
= *codep
& 0x80;
13048 dp
= &evex_table
[vex_table_index
][vindex
];
13050 FETCH_DATA (info
, codep
+ 1);
13051 modrm
.mod
= (*codep
>> 6) & 3;
13052 modrm
.reg
= (*codep
>> 3) & 7;
13053 modrm
.rm
= *codep
& 7;
13055 /* Set vector length. */
13056 if (modrm
.mod
== 3 && vex
.b
)
13072 return &bad_opcode
;
13085 if (dp
->name
!= NULL
)
13088 return get_valid_dis386 (dp
, info
);
13092 get_sib (disassemble_info
*info
, int sizeflag
)
13094 /* If modrm.mod == 3, operand must be register. */
13096 && ((sizeflag
& AFLAG
) || address_mode
== mode_64bit
)
13100 FETCH_DATA (info
, codep
+ 2);
13101 sib
.index
= (codep
[1] >> 3) & 7;
13102 sib
.scale
= (codep
[1] >> 6) & 3;
13103 sib
.base
= codep
[1] & 7;
13108 print_insn (bfd_vma pc
, disassemble_info
*info
)
13110 const struct dis386
*dp
;
13112 char *op_txt
[MAX_OPERANDS
];
13114 int sizeflag
, orig_sizeflag
;
13116 struct dis_private priv
;
13119 priv
.orig_sizeflag
= AFLAG
| DFLAG
;
13120 if ((info
->mach
& bfd_mach_i386_i386
) != 0)
13121 address_mode
= mode_32bit
;
13122 else if (info
->mach
== bfd_mach_i386_i8086
)
13124 address_mode
= mode_16bit
;
13125 priv
.orig_sizeflag
= 0;
13128 address_mode
= mode_64bit
;
13130 if (intel_syntax
== (char) -1)
13131 intel_syntax
= (info
->mach
& bfd_mach_i386_intel_syntax
) != 0;
13133 for (p
= info
->disassembler_options
; p
!= NULL
; )
13135 if (CONST_STRNEQ (p
, "amd64"))
13137 else if (CONST_STRNEQ (p
, "intel64"))
13139 else if (CONST_STRNEQ (p
, "x86-64"))
13141 address_mode
= mode_64bit
;
13142 priv
.orig_sizeflag
= AFLAG
| DFLAG
;
13144 else if (CONST_STRNEQ (p
, "i386"))
13146 address_mode
= mode_32bit
;
13147 priv
.orig_sizeflag
= AFLAG
| DFLAG
;
13149 else if (CONST_STRNEQ (p
, "i8086"))
13151 address_mode
= mode_16bit
;
13152 priv
.orig_sizeflag
= 0;
13154 else if (CONST_STRNEQ (p
, "intel"))
13157 if (CONST_STRNEQ (p
+ 5, "-mnemonic"))
13158 intel_mnemonic
= 1;
13160 else if (CONST_STRNEQ (p
, "att"))
13163 if (CONST_STRNEQ (p
+ 3, "-mnemonic"))
13164 intel_mnemonic
= 0;
13166 else if (CONST_STRNEQ (p
, "addr"))
13168 if (address_mode
== mode_64bit
)
13170 if (p
[4] == '3' && p
[5] == '2')
13171 priv
.orig_sizeflag
&= ~AFLAG
;
13172 else if (p
[4] == '6' && p
[5] == '4')
13173 priv
.orig_sizeflag
|= AFLAG
;
13177 if (p
[4] == '1' && p
[5] == '6')
13178 priv
.orig_sizeflag
&= ~AFLAG
;
13179 else if (p
[4] == '3' && p
[5] == '2')
13180 priv
.orig_sizeflag
|= AFLAG
;
13183 else if (CONST_STRNEQ (p
, "data"))
13185 if (p
[4] == '1' && p
[5] == '6')
13186 priv
.orig_sizeflag
&= ~DFLAG
;
13187 else if (p
[4] == '3' && p
[5] == '2')
13188 priv
.orig_sizeflag
|= DFLAG
;
13190 else if (CONST_STRNEQ (p
, "suffix"))
13191 priv
.orig_sizeflag
|= SUFFIX_ALWAYS
;
13193 p
= strchr (p
, ',');
13198 if (address_mode
== mode_64bit
&& sizeof (bfd_vma
) < 8)
13200 (*info
->fprintf_func
) (info
->stream
,
13201 _("64-bit address is disabled"));
13207 names64
= intel_names64
;
13208 names32
= intel_names32
;
13209 names16
= intel_names16
;
13210 names8
= intel_names8
;
13211 names8rex
= intel_names8rex
;
13212 names_seg
= intel_names_seg
;
13213 names_mm
= intel_names_mm
;
13214 names_bnd
= intel_names_bnd
;
13215 names_xmm
= intel_names_xmm
;
13216 names_ymm
= intel_names_ymm
;
13217 names_zmm
= intel_names_zmm
;
13218 index64
= intel_index64
;
13219 index32
= intel_index32
;
13220 names_mask
= intel_names_mask
;
13221 index16
= intel_index16
;
13224 separator_char
= '+';
13229 names64
= att_names64
;
13230 names32
= att_names32
;
13231 names16
= att_names16
;
13232 names8
= att_names8
;
13233 names8rex
= att_names8rex
;
13234 names_seg
= att_names_seg
;
13235 names_mm
= att_names_mm
;
13236 names_bnd
= att_names_bnd
;
13237 names_xmm
= att_names_xmm
;
13238 names_ymm
= att_names_ymm
;
13239 names_zmm
= att_names_zmm
;
13240 index64
= att_index64
;
13241 index32
= att_index32
;
13242 names_mask
= att_names_mask
;
13243 index16
= att_index16
;
13246 separator_char
= ',';
13250 /* The output looks better if we put 7 bytes on a line, since that
13251 puts most long word instructions on a single line. Use 8 bytes
13253 if ((info
->mach
& bfd_mach_l1om
) != 0)
13254 info
->bytes_per_line
= 8;
13256 info
->bytes_per_line
= 7;
13258 info
->private_data
= &priv
;
13259 priv
.max_fetched
= priv
.the_buffer
;
13260 priv
.insn_start
= pc
;
13263 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
13271 start_codep
= priv
.the_buffer
;
13272 codep
= priv
.the_buffer
;
13274 if (OPCODES_SIGSETJMP (priv
.bailout
) != 0)
13278 /* Getting here means we tried for data but didn't get it. That
13279 means we have an incomplete instruction of some sort. Just
13280 print the first byte as a prefix or a .byte pseudo-op. */
13281 if (codep
> priv
.the_buffer
)
13283 name
= prefix_name (priv
.the_buffer
[0], priv
.orig_sizeflag
);
13285 (*info
->fprintf_func
) (info
->stream
, "%s", name
);
13288 /* Just print the first byte as a .byte instruction. */
13289 (*info
->fprintf_func
) (info
->stream
, ".byte 0x%x",
13290 (unsigned int) priv
.the_buffer
[0]);
13300 sizeflag
= priv
.orig_sizeflag
;
13302 if (!ckprefix () || rex_used
)
13304 /* Too many prefixes or unused REX prefixes. */
13306 i
< (int) ARRAY_SIZE (all_prefixes
) && all_prefixes
[i
];
13308 (*info
->fprintf_func
) (info
->stream
, "%s%s",
13310 prefix_name (all_prefixes
[i
], sizeflag
));
13314 insn_codep
= codep
;
13316 FETCH_DATA (info
, codep
+ 1);
13317 two_source_ops
= (*codep
== 0x62) || (*codep
== 0xc8);
13319 if (((prefixes
& PREFIX_FWAIT
)
13320 && ((*codep
< 0xd8) || (*codep
> 0xdf))))
13322 /* Handle prefixes before fwait. */
13323 for (i
= 0; i
< fwait_prefix
&& all_prefixes
[i
];
13325 (*info
->fprintf_func
) (info
->stream
, "%s ",
13326 prefix_name (all_prefixes
[i
], sizeflag
));
13327 (*info
->fprintf_func
) (info
->stream
, "fwait");
13331 if (*codep
== 0x0f)
13333 unsigned char threebyte
;
13336 FETCH_DATA (info
, codep
+ 1);
13337 threebyte
= *codep
;
13338 dp
= &dis386_twobyte
[threebyte
];
13339 need_modrm
= twobyte_has_modrm
[*codep
];
13344 dp
= &dis386
[*codep
];
13345 need_modrm
= onebyte_has_modrm
[*codep
];
13349 /* Save sizeflag for printing the extra prefixes later before updating
13350 it for mnemonic and operand processing. The prefix names depend
13351 only on the address mode. */
13352 orig_sizeflag
= sizeflag
;
13353 if (prefixes
& PREFIX_ADDR
)
13355 if ((prefixes
& PREFIX_DATA
))
13361 FETCH_DATA (info
, codep
+ 1);
13362 modrm
.mod
= (*codep
>> 6) & 3;
13363 modrm
.reg
= (*codep
>> 3) & 7;
13364 modrm
.rm
= *codep
& 7;
13372 if (dp
->name
== NULL
&& dp
->op
[0].bytemode
== FLOATCODE
)
13374 get_sib (info
, sizeflag
);
13375 dofloat (sizeflag
);
13379 dp
= get_valid_dis386 (dp
, info
);
13380 if (dp
!= NULL
&& putop (dp
->name
, sizeflag
) == 0)
13382 get_sib (info
, sizeflag
);
13383 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
13386 op_ad
= MAX_OPERANDS
- 1 - i
;
13388 (*dp
->op
[i
].rtn
) (dp
->op
[i
].bytemode
, sizeflag
);
13389 /* For EVEX instruction after the last operand masking
13390 should be printed. */
13391 if (i
== 0 && vex
.evex
)
13393 /* Don't print {%k0}. */
13394 if (vex
.mask_register_specifier
)
13397 oappend (names_mask
[vex
.mask_register_specifier
]);
13407 /* Check if the REX prefix is used. */
13408 if (rex_ignored
== 0 && (rex
^ rex_used
) == 0 && last_rex_prefix
>= 0)
13409 all_prefixes
[last_rex_prefix
] = 0;
13411 /* Check if the SEG prefix is used. */
13412 if ((prefixes
& (PREFIX_CS
| PREFIX_SS
| PREFIX_DS
| PREFIX_ES
13413 | PREFIX_FS
| PREFIX_GS
)) != 0
13414 && (used_prefixes
& active_seg_prefix
) != 0)
13415 all_prefixes
[last_seg_prefix
] = 0;
13417 /* Check if the ADDR prefix is used. */
13418 if ((prefixes
& PREFIX_ADDR
) != 0
13419 && (used_prefixes
& PREFIX_ADDR
) != 0)
13420 all_prefixes
[last_addr_prefix
] = 0;
13422 /* Check if the DATA prefix is used. */
13423 if ((prefixes
& PREFIX_DATA
) != 0
13424 && (used_prefixes
& PREFIX_DATA
) != 0)
13425 all_prefixes
[last_data_prefix
] = 0;
13427 /* Print the extra prefixes. */
13429 for (i
= 0; i
< (int) ARRAY_SIZE (all_prefixes
); i
++)
13430 if (all_prefixes
[i
])
13433 name
= prefix_name (all_prefixes
[i
], orig_sizeflag
);
13436 prefix_length
+= strlen (name
) + 1;
13437 (*info
->fprintf_func
) (info
->stream
, "%s ", name
);
13440 /* If the mandatory PREFIX_REPZ/PREFIX_REPNZ/PREFIX_DATA prefix is
13441 unused, opcode is invalid. Since the PREFIX_DATA prefix may be
13442 used by putop and MMX/SSE operand and may be overriden by the
13443 PREFIX_REPZ/PREFIX_REPNZ fix, we check the PREFIX_DATA prefix
13445 if (dp
->prefix_requirement
== PREFIX_OPCODE
13446 && dp
!= &bad_opcode
13448 & (PREFIX_REPZ
| PREFIX_REPNZ
)) != 0
13450 & (PREFIX_REPZ
| PREFIX_REPNZ
)) == 0)
13452 & (PREFIX_REPZ
| PREFIX_REPNZ
| PREFIX_DATA
))
13454 && (used_prefixes
& PREFIX_DATA
) == 0))))
13456 (*info
->fprintf_func
) (info
->stream
, "(bad)");
13457 return end_codep
- priv
.the_buffer
;
13460 /* Check maximum code length. */
13461 if ((codep
- start_codep
) > MAX_CODE_LENGTH
)
13463 (*info
->fprintf_func
) (info
->stream
, "(bad)");
13464 return MAX_CODE_LENGTH
;
13467 obufp
= mnemonicendp
;
13468 for (i
= strlen (obuf
) + prefix_length
; i
< 6; i
++)
13471 (*info
->fprintf_func
) (info
->stream
, "%s", obuf
);
13473 /* The enter and bound instructions are printed with operands in the same
13474 order as the intel book; everything else is printed in reverse order. */
13475 if (intel_syntax
|| two_source_ops
)
13479 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
13480 op_txt
[i
] = op_out
[i
];
13482 if (intel_syntax
&& dp
&& dp
->op
[2].rtn
== OP_Rounding
13483 && dp
->op
[3].rtn
== OP_E
&& dp
->op
[4].rtn
== NULL
)
13485 op_txt
[2] = op_out
[3];
13486 op_txt
[3] = op_out
[2];
13489 for (i
= 0; i
< (MAX_OPERANDS
>> 1); ++i
)
13491 op_ad
= op_index
[i
];
13492 op_index
[i
] = op_index
[MAX_OPERANDS
- 1 - i
];
13493 op_index
[MAX_OPERANDS
- 1 - i
] = op_ad
;
13494 riprel
= op_riprel
[i
];
13495 op_riprel
[i
] = op_riprel
[MAX_OPERANDS
- 1 - i
];
13496 op_riprel
[MAX_OPERANDS
- 1 - i
] = riprel
;
13501 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
13502 op_txt
[MAX_OPERANDS
- 1 - i
] = op_out
[i
];
13506 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
13510 (*info
->fprintf_func
) (info
->stream
, ",");
13511 if (op_index
[i
] != -1 && !op_riprel
[i
])
13512 (*info
->print_address_func
) ((bfd_vma
) op_address
[op_index
[i
]], info
);
13514 (*info
->fprintf_func
) (info
->stream
, "%s", op_txt
[i
]);
13518 for (i
= 0; i
< MAX_OPERANDS
; i
++)
13519 if (op_index
[i
] != -1 && op_riprel
[i
])
13521 (*info
->fprintf_func
) (info
->stream
, " # ");
13522 (*info
->print_address_func
) ((bfd_vma
) (start_pc
+ (codep
- start_codep
)
13523 + op_address
[op_index
[i
]]), info
);
13526 return codep
- priv
.the_buffer
;
13529 static const char *float_mem
[] = {
13604 static const unsigned char float_mem_mode
[] = {
13679 #define ST { OP_ST, 0 }
13680 #define STi { OP_STi, 0 }
13682 #define FGRPd9_2 NULL, { { NULL, 1 } }, 0
13683 #define FGRPd9_4 NULL, { { NULL, 2 } }, 0
13684 #define FGRPd9_5 NULL, { { NULL, 3 } }, 0
13685 #define FGRPd9_6 NULL, { { NULL, 4 } }, 0
13686 #define FGRPd9_7 NULL, { { NULL, 5 } }, 0
13687 #define FGRPda_5 NULL, { { NULL, 6 } }, 0
13688 #define FGRPdb_4 NULL, { { NULL, 7 } }, 0
13689 #define FGRPde_3 NULL, { { NULL, 8 } }, 0
13690 #define FGRPdf_4 NULL, { { NULL, 9 } }, 0
13692 static const struct dis386 float_reg
[][8] = {
13695 { "fadd", { ST
, STi
}, 0 },
13696 { "fmul", { ST
, STi
}, 0 },
13697 { "fcom", { STi
}, 0 },
13698 { "fcomp", { STi
}, 0 },
13699 { "fsub", { ST
, STi
}, 0 },
13700 { "fsubr", { ST
, STi
}, 0 },
13701 { "fdiv", { ST
, STi
}, 0 },
13702 { "fdivr", { ST
, STi
}, 0 },
13706 { "fld", { STi
}, 0 },
13707 { "fxch", { STi
}, 0 },
13717 { "fcmovb", { ST
, STi
}, 0 },
13718 { "fcmove", { ST
, STi
}, 0 },
13719 { "fcmovbe",{ ST
, STi
}, 0 },
13720 { "fcmovu", { ST
, STi
}, 0 },
13728 { "fcmovnb",{ ST
, STi
}, 0 },
13729 { "fcmovne",{ ST
, STi
}, 0 },
13730 { "fcmovnbe",{ ST
, STi
}, 0 },
13731 { "fcmovnu",{ ST
, STi
}, 0 },
13733 { "fucomi", { ST
, STi
}, 0 },
13734 { "fcomi", { ST
, STi
}, 0 },
13739 { "fadd", { STi
, ST
}, 0 },
13740 { "fmul", { STi
, ST
}, 0 },
13743 { "fsub!M", { STi
, ST
}, 0 },
13744 { "fsubM", { STi
, ST
}, 0 },
13745 { "fdiv!M", { STi
, ST
}, 0 },
13746 { "fdivM", { STi
, ST
}, 0 },
13750 { "ffree", { STi
}, 0 },
13752 { "fst", { STi
}, 0 },
13753 { "fstp", { STi
}, 0 },
13754 { "fucom", { STi
}, 0 },
13755 { "fucomp", { STi
}, 0 },
13761 { "faddp", { STi
, ST
}, 0 },
13762 { "fmulp", { STi
, ST
}, 0 },
13765 { "fsub!Mp", { STi
, ST
}, 0 },
13766 { "fsubMp", { STi
, ST
}, 0 },
13767 { "fdiv!Mp", { STi
, ST
}, 0 },
13768 { "fdivMp", { STi
, ST
}, 0 },
13772 { "ffreep", { STi
}, 0 },
13777 { "fucomip", { ST
, STi
}, 0 },
13778 { "fcomip", { ST
, STi
}, 0 },
13783 static char *fgrps
[][8] = {
13786 "(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
13791 "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
13796 "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
13801 "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
13806 "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
13811 "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
13816 "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
13821 "fNeni(8087 only)","fNdisi(8087 only)","fNclex","fNinit",
13822 "fNsetpm(287 only)","frstpm(287 only)","(bad)","(bad)",
13827 "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
13832 "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
13837 swap_operand (void)
13839 mnemonicendp
[0] = '.';
13840 mnemonicendp
[1] = 's';
13845 OP_Skip_MODRM (int bytemode ATTRIBUTE_UNUSED
,
13846 int sizeflag ATTRIBUTE_UNUSED
)
13848 /* Skip mod/rm byte. */
13854 dofloat (int sizeflag
)
13856 const struct dis386
*dp
;
13857 unsigned char floatop
;
13859 floatop
= codep
[-1];
13861 if (modrm
.mod
!= 3)
13863 int fp_indx
= (floatop
- 0xd8) * 8 + modrm
.reg
;
13865 putop (float_mem
[fp_indx
], sizeflag
);
13868 OP_E (float_mem_mode
[fp_indx
], sizeflag
);
13871 /* Skip mod/rm byte. */
13875 dp
= &float_reg
[floatop
- 0xd8][modrm
.reg
];
13876 if (dp
->name
== NULL
)
13878 putop (fgrps
[dp
->op
[0].bytemode
][modrm
.rm
], sizeflag
);
13880 /* Instruction fnstsw is only one with strange arg. */
13881 if (floatop
== 0xdf && codep
[-1] == 0xe0)
13882 strcpy (op_out
[0], names16
[0]);
13886 putop (dp
->name
, sizeflag
);
13891 (*dp
->op
[0].rtn
) (dp
->op
[0].bytemode
, sizeflag
);
13896 (*dp
->op
[1].rtn
) (dp
->op
[1].bytemode
, sizeflag
);
13900 /* Like oappend (below), but S is a string starting with '%'.
13901 In Intel syntax, the '%' is elided. */
13903 oappend_maybe_intel (const char *s
)
13905 oappend (s
+ intel_syntax
);
13909 OP_ST (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
13911 oappend_maybe_intel ("%st");
13915 OP_STi (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
13917 sprintf (scratchbuf
, "%%st(%d)", modrm
.rm
);
13918 oappend_maybe_intel (scratchbuf
);
13921 /* Capital letters in template are macros. */
13923 putop (const char *in_template
, int sizeflag
)
13928 unsigned int l
= 0, len
= 1;
13931 #define SAVE_LAST(c) \
13932 if (l < len && l < sizeof (last)) \
13937 for (p
= in_template
; *p
; p
++)
13953 while (*++p
!= '|')
13954 if (*p
== '}' || *p
== '\0')
13957 /* Fall through. */
13962 while (*++p
!= '}')
13973 if (modrm
.mod
!= 3 || (sizeflag
& SUFFIX_ALWAYS
))
13977 if (l
== 0 && len
== 1)
13982 if (sizeflag
& SUFFIX_ALWAYS
)
13995 if (address_mode
== mode_64bit
13996 && !(prefixes
& PREFIX_ADDR
))
14007 if (intel_syntax
&& !alt
)
14009 if ((prefixes
& PREFIX_DATA
) || (sizeflag
& SUFFIX_ALWAYS
))
14011 if (sizeflag
& DFLAG
)
14012 *obufp
++ = intel_syntax
? 'd' : 'l';
14014 *obufp
++ = intel_syntax
? 'w' : 's';
14015 used_prefixes
|= (prefixes
& PREFIX_DATA
);
14019 if (intel_syntax
|| !(sizeflag
& SUFFIX_ALWAYS
))
14022 if (modrm
.mod
== 3)
14028 if (sizeflag
& DFLAG
)
14029 *obufp
++ = intel_syntax
? 'd' : 'l';
14032 used_prefixes
|= (prefixes
& PREFIX_DATA
);
14038 case 'E': /* For jcxz/jecxz */
14039 if (address_mode
== mode_64bit
)
14041 if (sizeflag
& AFLAG
)
14047 if (sizeflag
& AFLAG
)
14049 used_prefixes
|= (prefixes
& PREFIX_ADDR
);
14054 if ((prefixes
& PREFIX_ADDR
) || (sizeflag
& SUFFIX_ALWAYS
))
14056 if (sizeflag
& AFLAG
)
14057 *obufp
++ = address_mode
== mode_64bit
? 'q' : 'l';
14059 *obufp
++ = address_mode
== mode_64bit
? 'l' : 'w';
14060 used_prefixes
|= (prefixes
& PREFIX_ADDR
);
14064 if (intel_syntax
|| (obufp
[-1] != 's' && !(sizeflag
& SUFFIX_ALWAYS
)))
14066 if ((rex
& REX_W
) || (sizeflag
& DFLAG
))
14070 if (!(rex
& REX_W
))
14071 used_prefixes
|= (prefixes
& PREFIX_DATA
);
14076 if ((prefixes
& (PREFIX_CS
| PREFIX_DS
)) == PREFIX_CS
14077 || (prefixes
& (PREFIX_CS
| PREFIX_DS
)) == PREFIX_DS
)
14079 used_prefixes
|= prefixes
& (PREFIX_CS
| PREFIX_DS
);
14082 if (prefixes
& PREFIX_DS
)
14101 if (l
!= 0 || len
!= 1)
14103 if (l
!= 1 || len
!= 2 || last
[0] != 'X')
14108 if (!need_vex
|| !vex
.evex
)
14111 || ((modrm
.mod
== 3 || vex
.b
) && !(sizeflag
& SUFFIX_ALWAYS
)))
14113 switch (vex
.length
)
14131 if (address_mode
== mode_64bit
&& (sizeflag
& SUFFIX_ALWAYS
))
14136 /* Fall through. */
14139 if (l
!= 0 || len
!= 1)
14147 if (sizeflag
& SUFFIX_ALWAYS
)
14151 if (intel_mnemonic
!= cond
)
14155 if ((prefixes
& PREFIX_FWAIT
) == 0)
14158 used_prefixes
|= PREFIX_FWAIT
;
14164 else if (intel_syntax
&& (sizeflag
& DFLAG
))
14168 if (!(rex
& REX_W
))
14169 used_prefixes
|= (prefixes
& PREFIX_DATA
);
14173 && address_mode
== mode_64bit
14174 && isa64
== intel64
)
14179 /* Fall through. */
14182 && address_mode
== mode_64bit
14183 && ((sizeflag
& DFLAG
) || (rex
& REX_W
)))
14188 /* Fall through. */
14191 if (l
== 0 && len
== 1)
14196 if ((rex
& REX_W
) == 0
14197 && (prefixes
& PREFIX_DATA
))
14199 if ((sizeflag
& DFLAG
) == 0)
14201 used_prefixes
|= (prefixes
& PREFIX_DATA
);
14205 if ((prefixes
& PREFIX_DATA
)
14207 || (sizeflag
& SUFFIX_ALWAYS
))
14214 if (sizeflag
& DFLAG
)
14218 used_prefixes
|= (prefixes
& PREFIX_DATA
);
14224 if (l
!= 1 || len
!= 2 || last
[0] != 'L')
14230 if ((prefixes
& PREFIX_DATA
)
14232 || (sizeflag
& SUFFIX_ALWAYS
))
14239 if (sizeflag
& DFLAG
)
14240 *obufp
++ = intel_syntax
? 'd' : 'l';
14243 used_prefixes
|= (prefixes
& PREFIX_DATA
);
14251 if (address_mode
== mode_64bit
14252 && ((sizeflag
& DFLAG
) || (rex
& REX_W
)))
14254 if (modrm
.mod
!= 3 || (sizeflag
& SUFFIX_ALWAYS
))
14258 /* Fall through. */
14261 if (l
== 0 && len
== 1)
14264 if (intel_syntax
&& !alt
)
14267 if (modrm
.mod
!= 3 || (sizeflag
& SUFFIX_ALWAYS
))
14273 if (sizeflag
& DFLAG
)
14274 *obufp
++ = intel_syntax
? 'd' : 'l';
14277 used_prefixes
|= (prefixes
& PREFIX_DATA
);
14283 if (l
!= 1 || len
!= 2 || last
[0] != 'L')
14289 || (modrm
.mod
== 3 && !(sizeflag
& SUFFIX_ALWAYS
)))
14304 else if (sizeflag
& DFLAG
)
14313 if (intel_syntax
&& !p
[1]
14314 && ((rex
& REX_W
) || (sizeflag
& DFLAG
)))
14316 if (!(rex
& REX_W
))
14317 used_prefixes
|= (prefixes
& PREFIX_DATA
);
14320 if (l
== 0 && len
== 1)
14324 if (address_mode
== mode_64bit
14325 && ((sizeflag
& DFLAG
) || (rex
& REX_W
)))
14327 if (sizeflag
& SUFFIX_ALWAYS
)
14349 /* Fall through. */
14352 if (l
== 0 && len
== 1)
14357 if (sizeflag
& SUFFIX_ALWAYS
)
14363 if (sizeflag
& DFLAG
)
14367 used_prefixes
|= (prefixes
& PREFIX_DATA
);
14381 if (address_mode
== mode_64bit
14382 && !(prefixes
& PREFIX_ADDR
))
14393 if (l
!= 0 || len
!= 1)
14398 if (need_vex
&& vex
.prefix
)
14400 if (vex
.prefix
== DATA_PREFIX_OPCODE
)
14407 if (prefixes
& PREFIX_DATA
)
14411 used_prefixes
|= (prefixes
& PREFIX_DATA
);
14415 if (l
== 0 && len
== 1)
14417 if (intel_syntax
|| !(sizeflag
& SUFFIX_ALWAYS
))
14428 if (l
!= 1 || len
!= 2 || last
[0] != 'X')
14436 || ((modrm
.mod
== 3 || vex
.b
) && !(sizeflag
& SUFFIX_ALWAYS
)))
14438 switch (vex
.length
)
14454 if (l
== 0 && len
== 1)
14456 /* operand size flag for cwtl, cbtw */
14465 else if (sizeflag
& DFLAG
)
14469 if (!(rex
& REX_W
))
14470 used_prefixes
|= (prefixes
& PREFIX_DATA
);
14477 && last
[0] != 'L'))
14484 if (last
[0] == 'X')
14485 *obufp
++ = vex
.w
? 'd': 's';
14487 *obufp
++ = vex
.w
? 'q': 'd';
14493 if ((prefixes
& PREFIX_DATA
) || (sizeflag
& SUFFIX_ALWAYS
))
14495 if (sizeflag
& DFLAG
)
14499 used_prefixes
|= (prefixes
& PREFIX_DATA
);
14505 if (address_mode
== mode_64bit
14506 && (isa64
== intel64
14507 || ((sizeflag
& DFLAG
) || (rex
& REX_W
))))
14509 else if ((prefixes
& PREFIX_DATA
))
14511 if (!(sizeflag
& DFLAG
))
14513 used_prefixes
|= (prefixes
& PREFIX_DATA
);
14520 mnemonicendp
= obufp
;
14525 oappend (const char *s
)
14527 obufp
= stpcpy (obufp
, s
);
14533 /* Only print the active segment register. */
14534 if (!active_seg_prefix
)
14537 used_prefixes
|= active_seg_prefix
;
14538 switch (active_seg_prefix
)
14541 oappend_maybe_intel ("%cs:");
14544 oappend_maybe_intel ("%ds:");
14547 oappend_maybe_intel ("%ss:");
14550 oappend_maybe_intel ("%es:");
14553 oappend_maybe_intel ("%fs:");
14556 oappend_maybe_intel ("%gs:");
14564 OP_indirE (int bytemode
, int sizeflag
)
14568 OP_E (bytemode
, sizeflag
);
14572 print_operand_value (char *buf
, int hex
, bfd_vma disp
)
14574 if (address_mode
== mode_64bit
)
14582 sprintf_vma (tmp
, disp
);
14583 for (i
= 0; tmp
[i
] == '0' && tmp
[i
+ 1]; i
++);
14584 strcpy (buf
+ 2, tmp
+ i
);
14588 bfd_signed_vma v
= disp
;
14595 /* Check for possible overflow on 0x8000000000000000. */
14598 strcpy (buf
, "9223372036854775808");
14612 tmp
[28 - i
] = (v
% 10) + '0';
14616 strcpy (buf
, tmp
+ 29 - i
);
14622 sprintf (buf
, "0x%x", (unsigned int) disp
);
14624 sprintf (buf
, "%d", (int) disp
);
14628 /* Put DISP in BUF as signed hex number. */
14631 print_displacement (char *buf
, bfd_vma disp
)
14633 bfd_signed_vma val
= disp
;
14642 /* Check for possible overflow. */
14645 switch (address_mode
)
14648 strcpy (buf
+ j
, "0x8000000000000000");
14651 strcpy (buf
+ j
, "0x80000000");
14654 strcpy (buf
+ j
, "0x8000");
14664 sprintf_vma (tmp
, (bfd_vma
) val
);
14665 for (i
= 0; tmp
[i
] == '0'; i
++)
14667 if (tmp
[i
] == '\0')
14669 strcpy (buf
+ j
, tmp
+ i
);
14673 intel_operand_size (int bytemode
, int sizeflag
)
14677 && (bytemode
== x_mode
14678 || bytemode
== evex_half_bcst_xmmq_mode
))
14681 oappend ("QWORD PTR ");
14683 oappend ("DWORD PTR ");
14692 oappend ("BYTE PTR ");
14697 oappend ("WORD PTR ");
14700 if (address_mode
== mode_64bit
&& isa64
== intel64
)
14702 oappend ("QWORD PTR ");
14705 /* Fall through. */
14707 if (address_mode
== mode_64bit
&& ((sizeflag
& DFLAG
) || (rex
& REX_W
)))
14709 oappend ("QWORD PTR ");
14712 /* Fall through. */
14718 oappend ("QWORD PTR ");
14721 if ((sizeflag
& DFLAG
) || bytemode
== dq_mode
)
14722 oappend ("DWORD PTR ");
14724 oappend ("WORD PTR ");
14725 used_prefixes
|= (prefixes
& PREFIX_DATA
);
14729 if ((rex
& REX_W
) || (sizeflag
& DFLAG
))
14731 oappend ("WORD PTR ");
14732 if (!(rex
& REX_W
))
14733 used_prefixes
|= (prefixes
& PREFIX_DATA
);
14736 if (sizeflag
& DFLAG
)
14737 oappend ("QWORD PTR ");
14739 oappend ("DWORD PTR ");
14740 used_prefixes
|= (prefixes
& PREFIX_DATA
);
14743 case d_scalar_mode
:
14744 case d_scalar_swap_mode
:
14747 oappend ("DWORD PTR ");
14750 case q_scalar_mode
:
14751 case q_scalar_swap_mode
:
14753 oappend ("QWORD PTR ");
14756 if (address_mode
== mode_64bit
)
14757 oappend ("QWORD PTR ");
14759 oappend ("DWORD PTR ");
14762 if (sizeflag
& DFLAG
)
14763 oappend ("FWORD PTR ");
14765 oappend ("DWORD PTR ");
14766 used_prefixes
|= (prefixes
& PREFIX_DATA
);
14769 oappend ("TBYTE PTR ");
14773 case evex_x_gscat_mode
:
14774 case evex_x_nobcst_mode
:
14775 case b_scalar_mode
:
14776 case w_scalar_mode
:
14779 switch (vex
.length
)
14782 oappend ("XMMWORD PTR ");
14785 oappend ("YMMWORD PTR ");
14788 oappend ("ZMMWORD PTR ");
14795 oappend ("XMMWORD PTR ");
14798 oappend ("XMMWORD PTR ");
14801 oappend ("YMMWORD PTR ");
14804 case evex_half_bcst_xmmq_mode
:
14808 switch (vex
.length
)
14811 oappend ("QWORD PTR ");
14814 oappend ("XMMWORD PTR ");
14817 oappend ("YMMWORD PTR ");
14827 switch (vex
.length
)
14832 oappend ("BYTE PTR ");
14842 switch (vex
.length
)
14847 oappend ("WORD PTR ");
14857 switch (vex
.length
)
14862 oappend ("DWORD PTR ");
14872 switch (vex
.length
)
14877 oappend ("QWORD PTR ");
14887 switch (vex
.length
)
14890 oappend ("WORD PTR ");
14893 oappend ("DWORD PTR ");
14896 oappend ("QWORD PTR ");
14906 switch (vex
.length
)
14909 oappend ("DWORD PTR ");
14912 oappend ("QWORD PTR ");
14915 oappend ("XMMWORD PTR ");
14925 switch (vex
.length
)
14928 oappend ("QWORD PTR ");
14931 oappend ("YMMWORD PTR ");
14934 oappend ("ZMMWORD PTR ");
14944 switch (vex
.length
)
14948 oappend ("XMMWORD PTR ");
14955 oappend ("OWORD PTR ");
14958 case vex_w_dq_mode
:
14959 case vex_scalar_w_dq_mode
:
14964 oappend ("QWORD PTR ");
14966 oappend ("DWORD PTR ");
14968 case vex_vsib_d_w_dq_mode
:
14969 case vex_vsib_q_w_dq_mode
:
14976 oappend ("QWORD PTR ");
14978 oappend ("DWORD PTR ");
14982 switch (vex
.length
)
14985 oappend ("XMMWORD PTR ");
14988 oappend ("YMMWORD PTR ");
14991 oappend ("ZMMWORD PTR ");
14998 case vex_vsib_q_w_d_mode
:
14999 case vex_vsib_d_w_d_mode
:
15000 if (!need_vex
|| !vex
.evex
)
15003 switch (vex
.length
)
15006 oappend ("QWORD PTR ");
15009 oappend ("XMMWORD PTR ");
15012 oappend ("YMMWORD PTR ");
15020 if (!need_vex
|| vex
.length
!= 128)
15023 oappend ("DWORD PTR ");
15025 oappend ("BYTE PTR ");
15031 oappend ("QWORD PTR ");
15033 oappend ("WORD PTR ");
15042 OP_E_register (int bytemode
, int sizeflag
)
15044 int reg
= modrm
.rm
;
15045 const char **names
;
15051 if ((sizeflag
& SUFFIX_ALWAYS
)
15052 && (bytemode
== b_swap_mode
15053 || bytemode
== v_swap_mode
))
15079 names
= address_mode
== mode_64bit
? names64
: names32
;
15090 if (address_mode
== mode_64bit
&& isa64
== intel64
)
15095 /* Fall through. */
15097 if (address_mode
== mode_64bit
&& ((sizeflag
& DFLAG
) || (rex
& REX_W
)))
15103 /* Fall through. */
15115 if ((sizeflag
& DFLAG
)
15116 || (bytemode
!= v_mode
15117 && bytemode
!= v_swap_mode
))
15121 used_prefixes
|= (prefixes
& PREFIX_DATA
);
15131 names
= names_mask
;
15136 oappend (INTERNAL_DISASSEMBLER_ERROR
);
15139 oappend (names
[reg
]);
15143 OP_E_memory (int bytemode
, int sizeflag
)
15146 int add
= (rex
& REX_B
) ? 8 : 0;
15152 /* In EVEX, if operand doesn't allow broadcast, vex.b should be 0. */
15154 && bytemode
!= x_mode
15155 && bytemode
!= xmmq_mode
15156 && bytemode
!= evex_half_bcst_xmmq_mode
)
15171 case vex_vsib_d_w_dq_mode
:
15172 case vex_vsib_d_w_d_mode
:
15173 case vex_vsib_q_w_dq_mode
:
15174 case vex_vsib_q_w_d_mode
:
15175 case evex_x_gscat_mode
:
15177 shift
= vex
.w
? 3 : 2;
15180 case evex_half_bcst_xmmq_mode
:
15184 shift
= vex
.w
? 3 : 2;
15187 /* Fall through. */
15191 case evex_x_nobcst_mode
:
15193 switch (vex
.length
)
15216 case q_scalar_mode
:
15218 case q_scalar_swap_mode
:
15224 case d_scalar_mode
:
15226 case d_scalar_swap_mode
:
15229 case w_scalar_mode
:
15233 case b_scalar_mode
:
15240 /* Make necessary corrections to shift for modes that need it.
15241 For these modes we currently have shift 4, 5 or 6 depending on
15242 vex.length (it corresponds to xmmword, ymmword or zmmword
15243 operand). We might want to make it 3, 4 or 5 (e.g. for
15244 xmmq_mode). In case of broadcast enabled the corrections
15245 aren't needed, as element size is always 32 or 64 bits. */
15247 && (bytemode
== xmmq_mode
15248 || bytemode
== evex_half_bcst_xmmq_mode
))
15250 else if (bytemode
== xmmqd_mode
)
15252 else if (bytemode
== xmmdw_mode
)
15254 else if (bytemode
== ymmq_mode
&& vex
.length
== 128)
15262 intel_operand_size (bytemode
, sizeflag
);
15265 if ((sizeflag
& AFLAG
) || address_mode
== mode_64bit
)
15267 /* 32/64 bit address mode */
15276 int addr32flag
= !((sizeflag
& AFLAG
)
15277 || bytemode
== v_bnd_mode
15278 || bytemode
== bnd_mode
);
15279 const char **indexes64
= names64
;
15280 const char **indexes32
= names32
;
15290 vindex
= sib
.index
;
15296 case vex_vsib_d_w_dq_mode
:
15297 case vex_vsib_d_w_d_mode
:
15298 case vex_vsib_q_w_dq_mode
:
15299 case vex_vsib_q_w_d_mode
:
15309 switch (vex
.length
)
15312 indexes64
= indexes32
= names_xmm
;
15316 || bytemode
== vex_vsib_q_w_dq_mode
15317 || bytemode
== vex_vsib_q_w_d_mode
)
15318 indexes64
= indexes32
= names_ymm
;
15320 indexes64
= indexes32
= names_xmm
;
15324 || bytemode
== vex_vsib_q_w_dq_mode
15325 || bytemode
== vex_vsib_q_w_d_mode
)
15326 indexes64
= indexes32
= names_zmm
;
15328 indexes64
= indexes32
= names_ymm
;
15335 haveindex
= vindex
!= 4;
15342 rbase
= base
+ add
;
15350 if (address_mode
== mode_64bit
&& !havesib
)
15356 FETCH_DATA (the_info
, codep
+ 1);
15358 if ((disp
& 0x80) != 0)
15360 if (vex
.evex
&& shift
> 0)
15368 /* In 32bit mode, we need index register to tell [offset] from
15369 [eiz*1 + offset]. */
15370 needindex
= (havesib
15373 && address_mode
== mode_32bit
);
15374 havedisp
= (havebase
15376 || (havesib
&& (haveindex
|| scale
!= 0)));
15379 if (modrm
.mod
!= 0 || base
== 5)
15381 if (havedisp
|| riprel
)
15382 print_displacement (scratchbuf
, disp
);
15384 print_operand_value (scratchbuf
, 1, disp
);
15385 oappend (scratchbuf
);
15389 oappend (!addr32flag
? "(%rip)" : "(%eip)");
15393 if ((havebase
|| haveindex
|| riprel
)
15394 && (bytemode
!= v_bnd_mode
)
15395 && (bytemode
!= bnd_mode
))
15396 used_prefixes
|= PREFIX_ADDR
;
15398 if (havedisp
|| (intel_syntax
&& riprel
))
15400 *obufp
++ = open_char
;
15401 if (intel_syntax
&& riprel
)
15404 oappend (!addr32flag
? "rip" : "eip");
15408 oappend (address_mode
== mode_64bit
&& !addr32flag
15409 ? names64
[rbase
] : names32
[rbase
]);
15412 /* ESP/RSP won't allow index. If base isn't ESP/RSP,
15413 print index to tell base + index from base. */
15417 || (havebase
&& base
!= ESP_REG_NUM
))
15419 if (!intel_syntax
|| havebase
)
15421 *obufp
++ = separator_char
;
15425 oappend (address_mode
== mode_64bit
&& !addr32flag
15426 ? indexes64
[vindex
] : indexes32
[vindex
]);
15428 oappend (address_mode
== mode_64bit
&& !addr32flag
15429 ? index64
: index32
);
15431 *obufp
++ = scale_char
;
15433 sprintf (scratchbuf
, "%d", 1 << scale
);
15434 oappend (scratchbuf
);
15438 && (disp
|| modrm
.mod
!= 0 || base
== 5))
15440 if (!havedisp
|| (bfd_signed_vma
) disp
>= 0)
15445 else if (modrm
.mod
!= 1 && disp
!= -disp
)
15449 disp
= - (bfd_signed_vma
) disp
;
15453 print_displacement (scratchbuf
, disp
);
15455 print_operand_value (scratchbuf
, 1, disp
);
15456 oappend (scratchbuf
);
15459 *obufp
++ = close_char
;
15462 else if (intel_syntax
)
15464 if (modrm
.mod
!= 0 || base
== 5)
15466 if (!active_seg_prefix
)
15468 oappend (names_seg
[ds_reg
- es_reg
]);
15471 print_operand_value (scratchbuf
, 1, disp
);
15472 oappend (scratchbuf
);
15478 /* 16 bit address mode */
15479 used_prefixes
|= prefixes
& PREFIX_ADDR
;
15486 if ((disp
& 0x8000) != 0)
15491 FETCH_DATA (the_info
, codep
+ 1);
15493 if ((disp
& 0x80) != 0)
15498 if ((disp
& 0x8000) != 0)
15504 if (modrm
.mod
!= 0 || modrm
.rm
== 6)
15506 print_displacement (scratchbuf
, disp
);
15507 oappend (scratchbuf
);
15510 if (modrm
.mod
!= 0 || modrm
.rm
!= 6)
15512 *obufp
++ = open_char
;
15514 oappend (index16
[modrm
.rm
]);
15516 && (disp
|| modrm
.mod
!= 0 || modrm
.rm
== 6))
15518 if ((bfd_signed_vma
) disp
>= 0)
15523 else if (modrm
.mod
!= 1)
15527 disp
= - (bfd_signed_vma
) disp
;
15530 print_displacement (scratchbuf
, disp
);
15531 oappend (scratchbuf
);
15534 *obufp
++ = close_char
;
15537 else if (intel_syntax
)
15539 if (!active_seg_prefix
)
15541 oappend (names_seg
[ds_reg
- es_reg
]);
15544 print_operand_value (scratchbuf
, 1, disp
& 0xffff);
15545 oappend (scratchbuf
);
15548 if (vex
.evex
&& vex
.b
15549 && (bytemode
== x_mode
15550 || bytemode
== xmmq_mode
15551 || bytemode
== evex_half_bcst_xmmq_mode
))
15554 || bytemode
== xmmq_mode
15555 || bytemode
== evex_half_bcst_xmmq_mode
)
15557 switch (vex
.length
)
15560 oappend ("{1to2}");
15563 oappend ("{1to4}");
15566 oappend ("{1to8}");
15574 switch (vex
.length
)
15577 oappend ("{1to4}");
15580 oappend ("{1to8}");
15583 oappend ("{1to16}");
15593 OP_E (int bytemode
, int sizeflag
)
15595 /* Skip mod/rm byte. */
15599 if (modrm
.mod
== 3)
15600 OP_E_register (bytemode
, sizeflag
);
15602 OP_E_memory (bytemode
, sizeflag
);
15606 OP_G (int bytemode
, int sizeflag
)
15617 oappend (names8rex
[modrm
.reg
+ add
]);
15619 oappend (names8
[modrm
.reg
+ add
]);
15622 oappend (names16
[modrm
.reg
+ add
]);
15627 oappend (names32
[modrm
.reg
+ add
]);
15630 oappend (names64
[modrm
.reg
+ add
]);
15633 if (modrm
.reg
> 0x3)
15638 oappend (names_bnd
[modrm
.reg
]);
15647 oappend (names64
[modrm
.reg
+ add
]);
15650 if ((sizeflag
& DFLAG
) || bytemode
!= v_mode
)
15651 oappend (names32
[modrm
.reg
+ add
]);
15653 oappend (names16
[modrm
.reg
+ add
]);
15654 used_prefixes
|= (prefixes
& PREFIX_DATA
);
15658 if (address_mode
== mode_64bit
)
15659 oappend (names64
[modrm
.reg
+ add
]);
15661 oappend (names32
[modrm
.reg
+ add
]);
15665 if ((modrm
.reg
+ add
) > 0x7)
15670 oappend (names_mask
[modrm
.reg
+ add
]);
15673 oappend (INTERNAL_DISASSEMBLER_ERROR
);
15686 FETCH_DATA (the_info
, codep
+ 8);
15687 a
= *codep
++ & 0xff;
15688 a
|= (*codep
++ & 0xff) << 8;
15689 a
|= (*codep
++ & 0xff) << 16;
15690 a
|= (*codep
++ & 0xffu
) << 24;
15691 b
= *codep
++ & 0xff;
15692 b
|= (*codep
++ & 0xff) << 8;
15693 b
|= (*codep
++ & 0xff) << 16;
15694 b
|= (*codep
++ & 0xffu
) << 24;
15695 x
= a
+ ((bfd_vma
) b
<< 32);
15703 static bfd_signed_vma
15706 bfd_signed_vma x
= 0;
15708 FETCH_DATA (the_info
, codep
+ 4);
15709 x
= *codep
++ & (bfd_signed_vma
) 0xff;
15710 x
|= (*codep
++ & (bfd_signed_vma
) 0xff) << 8;
15711 x
|= (*codep
++ & (bfd_signed_vma
) 0xff) << 16;
15712 x
|= (*codep
++ & (bfd_signed_vma
) 0xff) << 24;
15716 static bfd_signed_vma
15719 bfd_signed_vma x
= 0;
15721 FETCH_DATA (the_info
, codep
+ 4);
15722 x
= *codep
++ & (bfd_signed_vma
) 0xff;
15723 x
|= (*codep
++ & (bfd_signed_vma
) 0xff) << 8;
15724 x
|= (*codep
++ & (bfd_signed_vma
) 0xff) << 16;
15725 x
|= (*codep
++ & (bfd_signed_vma
) 0xff) << 24;
15727 x
= (x
^ ((bfd_signed_vma
) 1 << 31)) - ((bfd_signed_vma
) 1 << 31);
15737 FETCH_DATA (the_info
, codep
+ 2);
15738 x
= *codep
++ & 0xff;
15739 x
|= (*codep
++ & 0xff) << 8;
15744 set_op (bfd_vma op
, int riprel
)
15746 op_index
[op_ad
] = op_ad
;
15747 if (address_mode
== mode_64bit
)
15749 op_address
[op_ad
] = op
;
15750 op_riprel
[op_ad
] = riprel
;
15754 /* Mask to get a 32-bit address. */
15755 op_address
[op_ad
] = op
& 0xffffffff;
15756 op_riprel
[op_ad
] = riprel
& 0xffffffff;
15761 OP_REG (int code
, int sizeflag
)
15768 case es_reg
: case ss_reg
: case cs_reg
:
15769 case ds_reg
: case fs_reg
: case gs_reg
:
15770 oappend (names_seg
[code
- es_reg
]);
15782 case ax_reg
: case cx_reg
: case dx_reg
: case bx_reg
:
15783 case sp_reg
: case bp_reg
: case si_reg
: case di_reg
:
15784 s
= names16
[code
- ax_reg
+ add
];
15786 case al_reg
: case ah_reg
: case cl_reg
: case ch_reg
:
15787 case dl_reg
: case dh_reg
: case bl_reg
: case bh_reg
:
15790 s
= names8rex
[code
- al_reg
+ add
];
15792 s
= names8
[code
- al_reg
];
15794 case rAX_reg
: case rCX_reg
: case rDX_reg
: case rBX_reg
:
15795 case rSP_reg
: case rBP_reg
: case rSI_reg
: case rDI_reg
:
15796 if (address_mode
== mode_64bit
15797 && ((sizeflag
& DFLAG
) || (rex
& REX_W
)))
15799 s
= names64
[code
- rAX_reg
+ add
];
15802 code
+= eAX_reg
- rAX_reg
;
15803 /* Fall through. */
15804 case eAX_reg
: case eCX_reg
: case eDX_reg
: case eBX_reg
:
15805 case eSP_reg
: case eBP_reg
: case eSI_reg
: case eDI_reg
:
15808 s
= names64
[code
- eAX_reg
+ add
];
15811 if (sizeflag
& DFLAG
)
15812 s
= names32
[code
- eAX_reg
+ add
];
15814 s
= names16
[code
- eAX_reg
+ add
];
15815 used_prefixes
|= (prefixes
& PREFIX_DATA
);
15819 s
= INTERNAL_DISASSEMBLER_ERROR
;
15826 OP_IMREG (int code
, int sizeflag
)
15838 case ax_reg
: case cx_reg
: case dx_reg
: case bx_reg
:
15839 case sp_reg
: case bp_reg
: case si_reg
: case di_reg
:
15840 s
= names16
[code
- ax_reg
];
15842 case es_reg
: case ss_reg
: case cs_reg
:
15843 case ds_reg
: case fs_reg
: case gs_reg
:
15844 s
= names_seg
[code
- es_reg
];
15846 case al_reg
: case ah_reg
: case cl_reg
: case ch_reg
:
15847 case dl_reg
: case dh_reg
: case bl_reg
: case bh_reg
:
15850 s
= names8rex
[code
- al_reg
];
15852 s
= names8
[code
- al_reg
];
15854 case eAX_reg
: case eCX_reg
: case eDX_reg
: case eBX_reg
:
15855 case eSP_reg
: case eBP_reg
: case eSI_reg
: case eDI_reg
:
15858 s
= names64
[code
- eAX_reg
];
15861 if (sizeflag
& DFLAG
)
15862 s
= names32
[code
- eAX_reg
];
15864 s
= names16
[code
- eAX_reg
];
15865 used_prefixes
|= (prefixes
& PREFIX_DATA
);
15868 case z_mode_ax_reg
:
15869 if ((rex
& REX_W
) || (sizeflag
& DFLAG
))
15873 if (!(rex
& REX_W
))
15874 used_prefixes
|= (prefixes
& PREFIX_DATA
);
15877 s
= INTERNAL_DISASSEMBLER_ERROR
;
15884 OP_I (int bytemode
, int sizeflag
)
15887 bfd_signed_vma mask
= -1;
15892 FETCH_DATA (the_info
, codep
+ 1);
15897 if (address_mode
== mode_64bit
)
15902 /* Fall through. */
15909 if (sizeflag
& DFLAG
)
15919 used_prefixes
|= (prefixes
& PREFIX_DATA
);
15931 oappend (INTERNAL_DISASSEMBLER_ERROR
);
15936 scratchbuf
[0] = '$';
15937 print_operand_value (scratchbuf
+ 1, 1, op
);
15938 oappend_maybe_intel (scratchbuf
);
15939 scratchbuf
[0] = '\0';
15943 OP_I64 (int bytemode
, int sizeflag
)
15946 bfd_signed_vma mask
= -1;
15948 if (address_mode
!= mode_64bit
)
15950 OP_I (bytemode
, sizeflag
);
15957 FETCH_DATA (the_info
, codep
+ 1);
15967 if (sizeflag
& DFLAG
)
15977 used_prefixes
|= (prefixes
& PREFIX_DATA
);
15985 oappend (INTERNAL_DISASSEMBLER_ERROR
);
15990 scratchbuf
[0] = '$';
15991 print_operand_value (scratchbuf
+ 1, 1, op
);
15992 oappend_maybe_intel (scratchbuf
);
15993 scratchbuf
[0] = '\0';
15997 OP_sI (int bytemode
, int sizeflag
)
16005 FETCH_DATA (the_info
, codep
+ 1);
16007 if ((op
& 0x80) != 0)
16009 if (bytemode
== b_T_mode
)
16011 if (address_mode
!= mode_64bit
16012 || !((sizeflag
& DFLAG
) || (rex
& REX_W
)))
16014 /* The operand-size prefix is overridden by a REX prefix. */
16015 if ((sizeflag
& DFLAG
) || (rex
& REX_W
))
16023 if (!(rex
& REX_W
))
16025 if (sizeflag
& DFLAG
)
16033 /* The operand-size prefix is overridden by a REX prefix. */
16034 if ((sizeflag
& DFLAG
) || (rex
& REX_W
))
16040 oappend (INTERNAL_DISASSEMBLER_ERROR
);
16044 scratchbuf
[0] = '$';
16045 print_operand_value (scratchbuf
+ 1, 1, op
);
16046 oappend_maybe_intel (scratchbuf
);
16050 OP_J (int bytemode
, int sizeflag
)
16054 bfd_vma segment
= 0;
16059 FETCH_DATA (the_info
, codep
+ 1);
16061 if ((disp
& 0x80) != 0)
16065 if (isa64
== amd64
)
16067 if ((sizeflag
& DFLAG
)
16068 || (address_mode
== mode_64bit
16069 && (isa64
!= amd64
|| (rex
& REX_W
))))
16074 if ((disp
& 0x8000) != 0)
16076 /* In 16bit mode, address is wrapped around at 64k within
16077 the same segment. Otherwise, a data16 prefix on a jump
16078 instruction means that the pc is masked to 16 bits after
16079 the displacement is added! */
16081 if ((prefixes
& PREFIX_DATA
) == 0)
16082 segment
= ((start_pc
+ (codep
- start_codep
))
16083 & ~((bfd_vma
) 0xffff));
16085 if (address_mode
!= mode_64bit
16086 || (isa64
== amd64
&& !(rex
& REX_W
)))
16087 used_prefixes
|= (prefixes
& PREFIX_DATA
);
16090 oappend (INTERNAL_DISASSEMBLER_ERROR
);
16093 disp
= ((start_pc
+ (codep
- start_codep
) + disp
) & mask
) | segment
;
16095 print_operand_value (scratchbuf
, 1, disp
);
16096 oappend (scratchbuf
);
16100 OP_SEG (int bytemode
, int sizeflag
)
16102 if (bytemode
== w_mode
)
16103 oappend (names_seg
[modrm
.reg
]);
16105 OP_E (modrm
.mod
== 3 ? bytemode
: w_mode
, sizeflag
);
16109 OP_DIR (int dummy ATTRIBUTE_UNUSED
, int sizeflag
)
16113 if (sizeflag
& DFLAG
)
16123 used_prefixes
|= (prefixes
& PREFIX_DATA
);
16125 sprintf (scratchbuf
, "0x%x:0x%x", seg
, offset
);
16127 sprintf (scratchbuf
, "$0x%x,$0x%x", seg
, offset
);
16128 oappend (scratchbuf
);
16132 OP_OFF (int bytemode
, int sizeflag
)
16136 if (intel_syntax
&& (sizeflag
& SUFFIX_ALWAYS
))
16137 intel_operand_size (bytemode
, sizeflag
);
16140 if ((sizeflag
& AFLAG
) || address_mode
== mode_64bit
)
16147 if (!active_seg_prefix
)
16149 oappend (names_seg
[ds_reg
- es_reg
]);
16153 print_operand_value (scratchbuf
, 1, off
);
16154 oappend (scratchbuf
);
16158 OP_OFF64 (int bytemode
, int sizeflag
)
16162 if (address_mode
!= mode_64bit
16163 || (prefixes
& PREFIX_ADDR
))
16165 OP_OFF (bytemode
, sizeflag
);
16169 if (intel_syntax
&& (sizeflag
& SUFFIX_ALWAYS
))
16170 intel_operand_size (bytemode
, sizeflag
);
16177 if (!active_seg_prefix
)
16179 oappend (names_seg
[ds_reg
- es_reg
]);
16183 print_operand_value (scratchbuf
, 1, off
);
16184 oappend (scratchbuf
);
16188 ptr_reg (int code
, int sizeflag
)
16192 *obufp
++ = open_char
;
16193 used_prefixes
|= (prefixes
& PREFIX_ADDR
);
16194 if (address_mode
== mode_64bit
)
16196 if (!(sizeflag
& AFLAG
))
16197 s
= names32
[code
- eAX_reg
];
16199 s
= names64
[code
- eAX_reg
];
16201 else if (sizeflag
& AFLAG
)
16202 s
= names32
[code
- eAX_reg
];
16204 s
= names16
[code
- eAX_reg
];
16206 *obufp
++ = close_char
;
16211 OP_ESreg (int code
, int sizeflag
)
16217 case 0x6d: /* insw/insl */
16218 intel_operand_size (z_mode
, sizeflag
);
16220 case 0xa5: /* movsw/movsl/movsq */
16221 case 0xa7: /* cmpsw/cmpsl/cmpsq */
16222 case 0xab: /* stosw/stosl */
16223 case 0xaf: /* scasw/scasl */
16224 intel_operand_size (v_mode
, sizeflag
);
16227 intel_operand_size (b_mode
, sizeflag
);
16230 oappend_maybe_intel ("%es:");
16231 ptr_reg (code
, sizeflag
);
16235 OP_DSreg (int code
, int sizeflag
)
16241 case 0x6f: /* outsw/outsl */
16242 intel_operand_size (z_mode
, sizeflag
);
16244 case 0xa5: /* movsw/movsl/movsq */
16245 case 0xa7: /* cmpsw/cmpsl/cmpsq */
16246 case 0xad: /* lodsw/lodsl/lodsq */
16247 intel_operand_size (v_mode
, sizeflag
);
16250 intel_operand_size (b_mode
, sizeflag
);
16253 /* Set active_seg_prefix to PREFIX_DS if it is unset so that the
16254 default segment register DS is printed. */
16255 if (!active_seg_prefix
)
16256 active_seg_prefix
= PREFIX_DS
;
16258 ptr_reg (code
, sizeflag
);
16262 OP_C (int dummy ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
16270 else if (address_mode
!= mode_64bit
&& (prefixes
& PREFIX_LOCK
))
16272 all_prefixes
[last_lock_prefix
] = 0;
16273 used_prefixes
|= PREFIX_LOCK
;
16278 sprintf (scratchbuf
, "%%cr%d", modrm
.reg
+ add
);
16279 oappend_maybe_intel (scratchbuf
);
16283 OP_D (int dummy ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
16292 sprintf (scratchbuf
, "db%d", modrm
.reg
+ add
);
16294 sprintf (scratchbuf
, "%%db%d", modrm
.reg
+ add
);
16295 oappend (scratchbuf
);
16299 OP_T (int dummy ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
16301 sprintf (scratchbuf
, "%%tr%d", modrm
.reg
);
16302 oappend_maybe_intel (scratchbuf
);
16306 OP_R (int bytemode
, int sizeflag
)
16308 /* Skip mod/rm byte. */
16311 OP_E_register (bytemode
, sizeflag
);
16315 OP_MMX (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
16317 int reg
= modrm
.reg
;
16318 const char **names
;
16320 used_prefixes
|= (prefixes
& PREFIX_DATA
);
16321 if (prefixes
& PREFIX_DATA
)
16330 oappend (names
[reg
]);
16334 OP_XMM (int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
16336 int reg
= modrm
.reg
;
16337 const char **names
;
16349 && bytemode
!= xmm_mode
16350 && bytemode
!= xmmq_mode
16351 && bytemode
!= evex_half_bcst_xmmq_mode
16352 && bytemode
!= ymm_mode
16353 && bytemode
!= scalar_mode
)
16355 switch (vex
.length
)
16362 || (bytemode
!= vex_vsib_q_w_dq_mode
16363 && bytemode
!= vex_vsib_q_w_d_mode
))
16375 else if (bytemode
== xmmq_mode
16376 || bytemode
== evex_half_bcst_xmmq_mode
)
16378 switch (vex
.length
)
16391 else if (bytemode
== ymm_mode
)
16395 oappend (names
[reg
]);
16399 OP_EM (int bytemode
, int sizeflag
)
16402 const char **names
;
16404 if (modrm
.mod
!= 3)
16407 && (bytemode
== v_mode
|| bytemode
== v_swap_mode
))
16409 bytemode
= (prefixes
& PREFIX_DATA
) ? x_mode
: q_mode
;
16410 used_prefixes
|= (prefixes
& PREFIX_DATA
);
16412 OP_E (bytemode
, sizeflag
);
16416 if ((sizeflag
& SUFFIX_ALWAYS
) && bytemode
== v_swap_mode
)
16419 /* Skip mod/rm byte. */
16422 used_prefixes
|= (prefixes
& PREFIX_DATA
);
16424 if (prefixes
& PREFIX_DATA
)
16433 oappend (names
[reg
]);
16436 /* cvt* are the only instructions in sse2 which have
16437 both SSE and MMX operands and also have 0x66 prefix
16438 in their opcode. 0x66 was originally used to differentiate
16439 between SSE and MMX instruction(operands). So we have to handle the
16440 cvt* separately using OP_EMC and OP_MXC */
16442 OP_EMC (int bytemode
, int sizeflag
)
16444 if (modrm
.mod
!= 3)
16446 if (intel_syntax
&& bytemode
== v_mode
)
16448 bytemode
= (prefixes
& PREFIX_DATA
) ? x_mode
: q_mode
;
16449 used_prefixes
|= (prefixes
& PREFIX_DATA
);
16451 OP_E (bytemode
, sizeflag
);
16455 /* Skip mod/rm byte. */
16458 used_prefixes
|= (prefixes
& PREFIX_DATA
);
16459 oappend (names_mm
[modrm
.rm
]);
16463 OP_MXC (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
16465 used_prefixes
|= (prefixes
& PREFIX_DATA
);
16466 oappend (names_mm
[modrm
.reg
]);
16470 OP_EX (int bytemode
, int sizeflag
)
16473 const char **names
;
16475 /* Skip mod/rm byte. */
16479 if (modrm
.mod
!= 3)
16481 OP_E_memory (bytemode
, sizeflag
);
16496 if ((sizeflag
& SUFFIX_ALWAYS
)
16497 && (bytemode
== x_swap_mode
16498 || bytemode
== d_swap_mode
16499 || bytemode
== d_scalar_swap_mode
16500 || bytemode
== q_swap_mode
16501 || bytemode
== q_scalar_swap_mode
))
16505 && bytemode
!= xmm_mode
16506 && bytemode
!= xmmdw_mode
16507 && bytemode
!= xmmqd_mode
16508 && bytemode
!= xmm_mb_mode
16509 && bytemode
!= xmm_mw_mode
16510 && bytemode
!= xmm_md_mode
16511 && bytemode
!= xmm_mq_mode
16512 && bytemode
!= xmm_mdq_mode
16513 && bytemode
!= xmmq_mode
16514 && bytemode
!= evex_half_bcst_xmmq_mode
16515 && bytemode
!= ymm_mode
16516 && bytemode
!= d_scalar_mode
16517 && bytemode
!= d_scalar_swap_mode
16518 && bytemode
!= q_scalar_mode
16519 && bytemode
!= q_scalar_swap_mode
16520 && bytemode
!= vex_scalar_w_dq_mode
)
16522 switch (vex
.length
)
16537 else if (bytemode
== xmmq_mode
16538 || bytemode
== evex_half_bcst_xmmq_mode
)
16540 switch (vex
.length
)
16553 else if (bytemode
== ymm_mode
)
16557 oappend (names
[reg
]);
16561 OP_MS (int bytemode
, int sizeflag
)
16563 if (modrm
.mod
== 3)
16564 OP_EM (bytemode
, sizeflag
);
16570 OP_XS (int bytemode
, int sizeflag
)
16572 if (modrm
.mod
== 3)
16573 OP_EX (bytemode
, sizeflag
);
16579 OP_M (int bytemode
, int sizeflag
)
16581 if (modrm
.mod
== 3)
16582 /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
16585 OP_E (bytemode
, sizeflag
);
16589 OP_0f07 (int bytemode
, int sizeflag
)
16591 if (modrm
.mod
!= 3 || modrm
.rm
!= 0)
16594 OP_E (bytemode
, sizeflag
);
16597 /* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
16598 32bit mode and "xchg %rax,%rax" in 64bit mode. */
16601 NOP_Fixup1 (int bytemode
, int sizeflag
)
16603 if ((prefixes
& PREFIX_DATA
) != 0
16606 && address_mode
== mode_64bit
))
16607 OP_REG (bytemode
, sizeflag
);
16609 strcpy (obuf
, "nop");
16613 NOP_Fixup2 (int bytemode
, int sizeflag
)
16615 if ((prefixes
& PREFIX_DATA
) != 0
16618 && address_mode
== mode_64bit
))
16619 OP_IMREG (bytemode
, sizeflag
);
16622 static const char *const Suffix3DNow
[] = {
16623 /* 00 */ NULL
, NULL
, NULL
, NULL
,
16624 /* 04 */ NULL
, NULL
, NULL
, NULL
,
16625 /* 08 */ NULL
, NULL
, NULL
, NULL
,
16626 /* 0C */ "pi2fw", "pi2fd", NULL
, NULL
,
16627 /* 10 */ NULL
, NULL
, NULL
, NULL
,
16628 /* 14 */ NULL
, NULL
, NULL
, NULL
,
16629 /* 18 */ NULL
, NULL
, NULL
, NULL
,
16630 /* 1C */ "pf2iw", "pf2id", NULL
, NULL
,
16631 /* 20 */ NULL
, NULL
, NULL
, NULL
,
16632 /* 24 */ NULL
, NULL
, NULL
, NULL
,
16633 /* 28 */ NULL
, NULL
, NULL
, NULL
,
16634 /* 2C */ NULL
, NULL
, NULL
, NULL
,
16635 /* 30 */ NULL
, NULL
, NULL
, NULL
,
16636 /* 34 */ NULL
, NULL
, NULL
, NULL
,
16637 /* 38 */ NULL
, NULL
, NULL
, NULL
,
16638 /* 3C */ NULL
, NULL
, NULL
, NULL
,
16639 /* 40 */ NULL
, NULL
, NULL
, NULL
,
16640 /* 44 */ NULL
, NULL
, NULL
, NULL
,
16641 /* 48 */ NULL
, NULL
, NULL
, NULL
,
16642 /* 4C */ NULL
, NULL
, NULL
, NULL
,
16643 /* 50 */ NULL
, NULL
, NULL
, NULL
,
16644 /* 54 */ NULL
, NULL
, NULL
, NULL
,
16645 /* 58 */ NULL
, NULL
, NULL
, NULL
,
16646 /* 5C */ NULL
, NULL
, NULL
, NULL
,
16647 /* 60 */ NULL
, NULL
, NULL
, NULL
,
16648 /* 64 */ NULL
, NULL
, NULL
, NULL
,
16649 /* 68 */ NULL
, NULL
, NULL
, NULL
,
16650 /* 6C */ NULL
, NULL
, NULL
, NULL
,
16651 /* 70 */ NULL
, NULL
, NULL
, NULL
,
16652 /* 74 */ NULL
, NULL
, NULL
, NULL
,
16653 /* 78 */ NULL
, NULL
, NULL
, NULL
,
16654 /* 7C */ NULL
, NULL
, NULL
, NULL
,
16655 /* 80 */ NULL
, NULL
, NULL
, NULL
,
16656 /* 84 */ NULL
, NULL
, NULL
, NULL
,
16657 /* 88 */ NULL
, NULL
, "pfnacc", NULL
,
16658 /* 8C */ NULL
, NULL
, "pfpnacc", NULL
,
16659 /* 90 */ "pfcmpge", NULL
, NULL
, NULL
,
16660 /* 94 */ "pfmin", NULL
, "pfrcp", "pfrsqrt",
16661 /* 98 */ NULL
, NULL
, "pfsub", NULL
,
16662 /* 9C */ NULL
, NULL
, "pfadd", NULL
,
16663 /* A0 */ "pfcmpgt", NULL
, NULL
, NULL
,
16664 /* A4 */ "pfmax", NULL
, "pfrcpit1", "pfrsqit1",
16665 /* A8 */ NULL
, NULL
, "pfsubr", NULL
,
16666 /* AC */ NULL
, NULL
, "pfacc", NULL
,
16667 /* B0 */ "pfcmpeq", NULL
, NULL
, NULL
,
16668 /* B4 */ "pfmul", NULL
, "pfrcpit2", "pmulhrw",
16669 /* B8 */ NULL
, NULL
, NULL
, "pswapd",
16670 /* BC */ NULL
, NULL
, NULL
, "pavgusb",
16671 /* C0 */ NULL
, NULL
, NULL
, NULL
,
16672 /* C4 */ NULL
, NULL
, NULL
, NULL
,
16673 /* C8 */ NULL
, NULL
, NULL
, NULL
,
16674 /* CC */ NULL
, NULL
, NULL
, NULL
,
16675 /* D0 */ NULL
, NULL
, NULL
, NULL
,
16676 /* D4 */ NULL
, NULL
, NULL
, NULL
,
16677 /* D8 */ NULL
, NULL
, NULL
, NULL
,
16678 /* DC */ NULL
, NULL
, NULL
, NULL
,
16679 /* E0 */ NULL
, NULL
, NULL
, NULL
,
16680 /* E4 */ NULL
, NULL
, NULL
, NULL
,
16681 /* E8 */ NULL
, NULL
, NULL
, NULL
,
16682 /* EC */ NULL
, NULL
, NULL
, NULL
,
16683 /* F0 */ NULL
, NULL
, NULL
, NULL
,
16684 /* F4 */ NULL
, NULL
, NULL
, NULL
,
16685 /* F8 */ NULL
, NULL
, NULL
, NULL
,
16686 /* FC */ NULL
, NULL
, NULL
, NULL
,
16690 OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
16692 const char *mnemonic
;
16694 FETCH_DATA (the_info
, codep
+ 1);
16695 /* AMD 3DNow! instructions are specified by an opcode suffix in the
16696 place where an 8-bit immediate would normally go. ie. the last
16697 byte of the instruction. */
16698 obufp
= mnemonicendp
;
16699 mnemonic
= Suffix3DNow
[*codep
++ & 0xff];
16701 oappend (mnemonic
);
16704 /* Since a variable sized modrm/sib chunk is between the start
16705 of the opcode (0x0f0f) and the opcode suffix, we need to do
16706 all the modrm processing first, and don't know until now that
16707 we have a bad opcode. This necessitates some cleaning up. */
16708 op_out
[0][0] = '\0';
16709 op_out
[1][0] = '\0';
16712 mnemonicendp
= obufp
;
16715 static struct op simd_cmp_op
[] =
16717 { STRING_COMMA_LEN ("eq") },
16718 { STRING_COMMA_LEN ("lt") },
16719 { STRING_COMMA_LEN ("le") },
16720 { STRING_COMMA_LEN ("unord") },
16721 { STRING_COMMA_LEN ("neq") },
16722 { STRING_COMMA_LEN ("nlt") },
16723 { STRING_COMMA_LEN ("nle") },
16724 { STRING_COMMA_LEN ("ord") }
16728 CMP_Fixup (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
16730 unsigned int cmp_type
;
16732 FETCH_DATA (the_info
, codep
+ 1);
16733 cmp_type
= *codep
++ & 0xff;
16734 if (cmp_type
< ARRAY_SIZE (simd_cmp_op
))
16737 char *p
= mnemonicendp
- 2;
16741 sprintf (p
, "%s%s", simd_cmp_op
[cmp_type
].name
, suffix
);
16742 mnemonicendp
+= simd_cmp_op
[cmp_type
].len
;
16746 /* We have a reserved extension byte. Output it directly. */
16747 scratchbuf
[0] = '$';
16748 print_operand_value (scratchbuf
+ 1, 1, cmp_type
);
16749 oappend_maybe_intel (scratchbuf
);
16750 scratchbuf
[0] = '\0';
16755 OP_Mwaitx (int bytemode ATTRIBUTE_UNUSED
,
16756 int sizeflag ATTRIBUTE_UNUSED
)
16758 /* mwaitx %eax,%ecx,%ebx */
16761 const char **names
= (address_mode
== mode_64bit
16762 ? names64
: names32
);
16763 strcpy (op_out
[0], names
[0]);
16764 strcpy (op_out
[1], names
[1]);
16765 strcpy (op_out
[2], names
[3]);
16766 two_source_ops
= 1;
16768 /* Skip mod/rm byte. */
16774 OP_Mwait (int bytemode ATTRIBUTE_UNUSED
,
16775 int sizeflag ATTRIBUTE_UNUSED
)
16777 /* mwait %eax,%ecx */
16780 const char **names
= (address_mode
== mode_64bit
16781 ? names64
: names32
);
16782 strcpy (op_out
[0], names
[0]);
16783 strcpy (op_out
[1], names
[1]);
16784 two_source_ops
= 1;
16786 /* Skip mod/rm byte. */
16792 OP_Monitor (int bytemode ATTRIBUTE_UNUSED
,
16793 int sizeflag ATTRIBUTE_UNUSED
)
16795 /* monitor %eax,%ecx,%edx" */
16798 const char **op1_names
;
16799 const char **names
= (address_mode
== mode_64bit
16800 ? names64
: names32
);
16802 if (!(prefixes
& PREFIX_ADDR
))
16803 op1_names
= (address_mode
== mode_16bit
16804 ? names16
: names
);
16807 /* Remove "addr16/addr32". */
16808 all_prefixes
[last_addr_prefix
] = 0;
16809 op1_names
= (address_mode
!= mode_32bit
16810 ? names32
: names16
);
16811 used_prefixes
|= PREFIX_ADDR
;
16813 strcpy (op_out
[0], op1_names
[0]);
16814 strcpy (op_out
[1], names
[1]);
16815 strcpy (op_out
[2], names
[2]);
16816 two_source_ops
= 1;
16818 /* Skip mod/rm byte. */
16826 /* Throw away prefixes and 1st. opcode byte. */
16827 codep
= insn_codep
+ 1;
16832 REP_Fixup (int bytemode
, int sizeflag
)
16834 /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
16836 if (prefixes
& PREFIX_REPZ
)
16837 all_prefixes
[last_repz_prefix
] = REP_PREFIX
;
16844 OP_IMREG (bytemode
, sizeflag
);
16847 OP_ESreg (bytemode
, sizeflag
);
16850 OP_DSreg (bytemode
, sizeflag
);
16858 /* For BND-prefixed instructions 0xF2 prefix should be displayed as
16862 BND_Fixup (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
16864 if (prefixes
& PREFIX_REPNZ
)
16865 all_prefixes
[last_repnz_prefix
] = BND_PREFIX
;
16868 /* For NOTRACK-prefixed instructions, 0x3E prefix should be displayed as
16872 NOTRACK_Fixup (int bytemode ATTRIBUTE_UNUSED
,
16873 int sizeflag ATTRIBUTE_UNUSED
)
16875 if (active_seg_prefix
== PREFIX_DS
16876 && (address_mode
!= mode_64bit
|| last_data_prefix
< 0))
16878 /* NOTRACK prefix is only valid on indirect branch instructions.
16879 NB: DATA prefix is unsupported for Intel64. */
16880 active_seg_prefix
= 0;
16881 all_prefixes
[last_seg_prefix
] = NOTRACK_PREFIX
;
16885 /* Similar to OP_E. But the 0xf2/0xf3 prefixes should be displayed as
16886 "xacquire"/"xrelease" for memory operand if there is a LOCK prefix.
16890 HLE_Fixup1 (int bytemode
, int sizeflag
)
16893 && (prefixes
& PREFIX_LOCK
) != 0)
16895 if (prefixes
& PREFIX_REPZ
)
16896 all_prefixes
[last_repz_prefix
] = XRELEASE_PREFIX
;
16897 if (prefixes
& PREFIX_REPNZ
)
16898 all_prefixes
[last_repnz_prefix
] = XACQUIRE_PREFIX
;
16901 OP_E (bytemode
, sizeflag
);
16904 /* Similar to OP_E. But the 0xf2/0xf3 prefixes should be displayed as
16905 "xacquire"/"xrelease" for memory operand. No check for LOCK prefix.
16909 HLE_Fixup2 (int bytemode
, int sizeflag
)
16911 if (modrm
.mod
!= 3)
16913 if (prefixes
& PREFIX_REPZ
)
16914 all_prefixes
[last_repz_prefix
] = XRELEASE_PREFIX
;
16915 if (prefixes
& PREFIX_REPNZ
)
16916 all_prefixes
[last_repnz_prefix
] = XACQUIRE_PREFIX
;
16919 OP_E (bytemode
, sizeflag
);
16922 /* Similar to OP_E. But the 0xf3 prefixes should be displayed as
16923 "xrelease" for memory operand. No check for LOCK prefix. */
16926 HLE_Fixup3 (int bytemode
, int sizeflag
)
16929 && last_repz_prefix
> last_repnz_prefix
16930 && (prefixes
& PREFIX_REPZ
) != 0)
16931 all_prefixes
[last_repz_prefix
] = XRELEASE_PREFIX
;
16933 OP_E (bytemode
, sizeflag
);
16937 CMPXCHG8B_Fixup (int bytemode
, int sizeflag
)
16942 /* Change cmpxchg8b to cmpxchg16b. */
16943 char *p
= mnemonicendp
- 2;
16944 mnemonicendp
= stpcpy (p
, "16b");
16947 else if ((prefixes
& PREFIX_LOCK
) != 0)
16949 if (prefixes
& PREFIX_REPZ
)
16950 all_prefixes
[last_repz_prefix
] = XRELEASE_PREFIX
;
16951 if (prefixes
& PREFIX_REPNZ
)
16952 all_prefixes
[last_repnz_prefix
] = XACQUIRE_PREFIX
;
16955 OP_M (bytemode
, sizeflag
);
16959 XMM_Fixup (int reg
, int sizeflag ATTRIBUTE_UNUSED
)
16961 const char **names
;
16965 switch (vex
.length
)
16979 oappend (names
[reg
]);
16983 CRC32_Fixup (int bytemode
, int sizeflag
)
16985 /* Add proper suffix to "crc32". */
16986 char *p
= mnemonicendp
;
17005 if (sizeflag
& DFLAG
)
17009 used_prefixes
|= (prefixes
& PREFIX_DATA
);
17013 oappend (INTERNAL_DISASSEMBLER_ERROR
);
17020 if (modrm
.mod
== 3)
17024 /* Skip mod/rm byte. */
17029 add
= (rex
& REX_B
) ? 8 : 0;
17030 if (bytemode
== b_mode
)
17034 oappend (names8rex
[modrm
.rm
+ add
]);
17036 oappend (names8
[modrm
.rm
+ add
]);
17042 oappend (names64
[modrm
.rm
+ add
]);
17043 else if ((prefixes
& PREFIX_DATA
))
17044 oappend (names16
[modrm
.rm
+ add
]);
17046 oappend (names32
[modrm
.rm
+ add
]);
17050 OP_E (bytemode
, sizeflag
);
17054 FXSAVE_Fixup (int bytemode
, int sizeflag
)
17056 /* Add proper suffix to "fxsave" and "fxrstor". */
17060 char *p
= mnemonicendp
;
17066 OP_M (bytemode
, sizeflag
);
17070 PCMPESTR_Fixup (int bytemode
, int sizeflag
)
17072 /* Add proper suffix to "{,v}pcmpestr{i,m}". */
17075 char *p
= mnemonicendp
;
17080 else if (sizeflag
& SUFFIX_ALWAYS
)
17087 OP_EX (bytemode
, sizeflag
);
17090 /* Display the destination register operand for instructions with
17094 OP_VEX (int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
17097 const char **names
;
17105 reg
= vex
.register_specifier
;
17112 if (bytemode
== vex_scalar_mode
)
17114 oappend (names_xmm
[reg
]);
17118 switch (vex
.length
)
17125 case vex_vsib_q_w_dq_mode
:
17126 case vex_vsib_q_w_d_mode
:
17142 names
= names_mask
;
17156 case vex_vsib_q_w_dq_mode
:
17157 case vex_vsib_q_w_d_mode
:
17158 names
= vex
.w
? names_ymm
: names_xmm
;
17167 names
= names_mask
;
17170 /* See PR binutils/20893 for a reproducer. */
17182 oappend (names
[reg
]);
17185 /* Get the VEX immediate byte without moving codep. */
17187 static unsigned char
17188 get_vex_imm8 (int sizeflag
, int opnum
)
17190 int bytes_before_imm
= 0;
17192 if (modrm
.mod
!= 3)
17194 /* There are SIB/displacement bytes. */
17195 if ((sizeflag
& AFLAG
) || address_mode
== mode_64bit
)
17197 /* 32/64 bit address mode */
17198 int base
= modrm
.rm
;
17200 /* Check SIB byte. */
17203 FETCH_DATA (the_info
, codep
+ 1);
17205 /* When decoding the third source, don't increase
17206 bytes_before_imm as this has already been incremented
17207 by one in OP_E_memory while decoding the second
17210 bytes_before_imm
++;
17213 /* Don't increase bytes_before_imm when decoding the third source,
17214 it has already been incremented by OP_E_memory while decoding
17215 the second source operand. */
17221 /* When modrm.rm == 5 or modrm.rm == 4 and base in
17222 SIB == 5, there is a 4 byte displacement. */
17224 /* No displacement. */
17226 /* Fall through. */
17228 /* 4 byte displacement. */
17229 bytes_before_imm
+= 4;
17232 /* 1 byte displacement. */
17233 bytes_before_imm
++;
17240 /* 16 bit address mode */
17241 /* Don't increase bytes_before_imm when decoding the third source,
17242 it has already been incremented by OP_E_memory while decoding
17243 the second source operand. */
17249 /* When modrm.rm == 6, there is a 2 byte displacement. */
17251 /* No displacement. */
17253 /* Fall through. */
17255 /* 2 byte displacement. */
17256 bytes_before_imm
+= 2;
17259 /* 1 byte displacement: when decoding the third source,
17260 don't increase bytes_before_imm as this has already
17261 been incremented by one in OP_E_memory while decoding
17262 the second source operand. */
17264 bytes_before_imm
++;
17272 FETCH_DATA (the_info
, codep
+ bytes_before_imm
+ 1);
17273 return codep
[bytes_before_imm
];
17277 OP_EX_VexReg (int bytemode
, int sizeflag
, int reg
)
17279 const char **names
;
17281 if (reg
== -1 && modrm
.mod
!= 3)
17283 OP_E_memory (bytemode
, sizeflag
);
17295 else if (reg
> 7 && address_mode
!= mode_64bit
)
17299 switch (vex
.length
)
17310 oappend (names
[reg
]);
17314 OP_EX_VexImmW (int bytemode
, int sizeflag
)
17317 static unsigned char vex_imm8
;
17319 if (vex_w_done
== 0)
17323 /* Skip mod/rm byte. */
17327 vex_imm8
= get_vex_imm8 (sizeflag
, 0);
17330 reg
= vex_imm8
>> 4;
17332 OP_EX_VexReg (bytemode
, sizeflag
, reg
);
17334 else if (vex_w_done
== 1)
17339 reg
= vex_imm8
>> 4;
17341 OP_EX_VexReg (bytemode
, sizeflag
, reg
);
17345 /* Output the imm8 directly. */
17346 scratchbuf
[0] = '$';
17347 print_operand_value (scratchbuf
+ 1, 1, vex_imm8
& 0xf);
17348 oappend_maybe_intel (scratchbuf
);
17349 scratchbuf
[0] = '\0';
17355 OP_Vex_2src (int bytemode
, int sizeflag
)
17357 if (modrm
.mod
== 3)
17359 int reg
= modrm
.rm
;
17363 oappend (names_xmm
[reg
]);
17368 && (bytemode
== v_mode
|| bytemode
== v_swap_mode
))
17370 bytemode
= (prefixes
& PREFIX_DATA
) ? x_mode
: q_mode
;
17371 used_prefixes
|= (prefixes
& PREFIX_DATA
);
17373 OP_E (bytemode
, sizeflag
);
17378 OP_Vex_2src_1 (int bytemode
, int sizeflag
)
17380 if (modrm
.mod
== 3)
17382 /* Skip mod/rm byte. */
17388 oappend (names_xmm
[vex
.register_specifier
]);
17390 OP_Vex_2src (bytemode
, sizeflag
);
17394 OP_Vex_2src_2 (int bytemode
, int sizeflag
)
17397 OP_Vex_2src (bytemode
, sizeflag
);
17399 oappend (names_xmm
[vex
.register_specifier
]);
17403 OP_EX_VexW (int bytemode
, int sizeflag
)
17411 /* Skip mod/rm byte. */
17416 reg
= get_vex_imm8 (sizeflag
, 0) >> 4;
17421 reg
= get_vex_imm8 (sizeflag
, 1) >> 4;
17424 OP_EX_VexReg (bytemode
, sizeflag
, reg
);
17428 VEXI4_Fixup (int bytemode ATTRIBUTE_UNUSED
,
17429 int sizeflag ATTRIBUTE_UNUSED
)
17431 /* Skip the immediate byte and check for invalid bits. */
17432 FETCH_DATA (the_info
, codep
+ 1);
17433 if (*codep
++ & 0xf)
17438 OP_REG_VexI4 (int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
17441 const char **names
;
17443 FETCH_DATA (the_info
, codep
+ 1);
17446 if (bytemode
!= x_mode
)
17453 if (reg
> 7 && address_mode
!= mode_64bit
)
17456 switch (vex
.length
)
17467 oappend (names
[reg
]);
17471 OP_XMM_VexW (int bytemode
, int sizeflag
)
17473 /* Turn off the REX.W bit since it is used for swapping operands
17476 OP_XMM (bytemode
, sizeflag
);
17480 OP_EX_Vex (int bytemode
, int sizeflag
)
17482 if (modrm
.mod
!= 3)
17484 if (vex
.register_specifier
!= 0)
17488 OP_EX (bytemode
, sizeflag
);
17492 OP_XMM_Vex (int bytemode
, int sizeflag
)
17494 if (modrm
.mod
!= 3)
17496 if (vex
.register_specifier
!= 0)
17500 OP_XMM (bytemode
, sizeflag
);
17504 VZERO_Fixup (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
17506 switch (vex
.length
)
17509 mnemonicendp
= stpcpy (obuf
, "vzeroupper");
17512 mnemonicendp
= stpcpy (obuf
, "vzeroall");
17519 static struct op vex_cmp_op
[] =
17521 { STRING_COMMA_LEN ("eq") },
17522 { STRING_COMMA_LEN ("lt") },
17523 { STRING_COMMA_LEN ("le") },
17524 { STRING_COMMA_LEN ("unord") },
17525 { STRING_COMMA_LEN ("neq") },
17526 { STRING_COMMA_LEN ("nlt") },
17527 { STRING_COMMA_LEN ("nle") },
17528 { STRING_COMMA_LEN ("ord") },
17529 { STRING_COMMA_LEN ("eq_uq") },
17530 { STRING_COMMA_LEN ("nge") },
17531 { STRING_COMMA_LEN ("ngt") },
17532 { STRING_COMMA_LEN ("false") },
17533 { STRING_COMMA_LEN ("neq_oq") },
17534 { STRING_COMMA_LEN ("ge") },
17535 { STRING_COMMA_LEN ("gt") },
17536 { STRING_COMMA_LEN ("true") },
17537 { STRING_COMMA_LEN ("eq_os") },
17538 { STRING_COMMA_LEN ("lt_oq") },
17539 { STRING_COMMA_LEN ("le_oq") },
17540 { STRING_COMMA_LEN ("unord_s") },
17541 { STRING_COMMA_LEN ("neq_us") },
17542 { STRING_COMMA_LEN ("nlt_uq") },
17543 { STRING_COMMA_LEN ("nle_uq") },
17544 { STRING_COMMA_LEN ("ord_s") },
17545 { STRING_COMMA_LEN ("eq_us") },
17546 { STRING_COMMA_LEN ("nge_uq") },
17547 { STRING_COMMA_LEN ("ngt_uq") },
17548 { STRING_COMMA_LEN ("false_os") },
17549 { STRING_COMMA_LEN ("neq_os") },
17550 { STRING_COMMA_LEN ("ge_oq") },
17551 { STRING_COMMA_LEN ("gt_oq") },
17552 { STRING_COMMA_LEN ("true_us") },
17556 VCMP_Fixup (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
17558 unsigned int cmp_type
;
17560 FETCH_DATA (the_info
, codep
+ 1);
17561 cmp_type
= *codep
++ & 0xff;
17562 if (cmp_type
< ARRAY_SIZE (vex_cmp_op
))
17565 char *p
= mnemonicendp
- 2;
17569 sprintf (p
, "%s%s", vex_cmp_op
[cmp_type
].name
, suffix
);
17570 mnemonicendp
+= vex_cmp_op
[cmp_type
].len
;
17574 /* We have a reserved extension byte. Output it directly. */
17575 scratchbuf
[0] = '$';
17576 print_operand_value (scratchbuf
+ 1, 1, cmp_type
);
17577 oappend_maybe_intel (scratchbuf
);
17578 scratchbuf
[0] = '\0';
17583 VPCMP_Fixup (int bytemode ATTRIBUTE_UNUSED
,
17584 int sizeflag ATTRIBUTE_UNUSED
)
17586 unsigned int cmp_type
;
17591 FETCH_DATA (the_info
, codep
+ 1);
17592 cmp_type
= *codep
++ & 0xff;
17593 /* There are aliases for immediates 0, 1, 2, 4, 5, 6.
17594 If it's the case, print suffix, otherwise - print the immediate. */
17595 if (cmp_type
< ARRAY_SIZE (simd_cmp_op
)
17600 char *p
= mnemonicendp
- 2;
17602 /* vpcmp* can have both one- and two-lettered suffix. */
17616 sprintf (p
, "%s%s", simd_cmp_op
[cmp_type
].name
, suffix
);
17617 mnemonicendp
+= simd_cmp_op
[cmp_type
].len
;
17621 /* We have a reserved extension byte. Output it directly. */
17622 scratchbuf
[0] = '$';
17623 print_operand_value (scratchbuf
+ 1, 1, cmp_type
);
17624 oappend_maybe_intel (scratchbuf
);
17625 scratchbuf
[0] = '\0';
17629 static const struct op pclmul_op
[] =
17631 { STRING_COMMA_LEN ("lql") },
17632 { STRING_COMMA_LEN ("hql") },
17633 { STRING_COMMA_LEN ("lqh") },
17634 { STRING_COMMA_LEN ("hqh") }
17638 PCLMUL_Fixup (int bytemode ATTRIBUTE_UNUSED
,
17639 int sizeflag ATTRIBUTE_UNUSED
)
17641 unsigned int pclmul_type
;
17643 FETCH_DATA (the_info
, codep
+ 1);
17644 pclmul_type
= *codep
++ & 0xff;
17645 switch (pclmul_type
)
17656 if (pclmul_type
< ARRAY_SIZE (pclmul_op
))
17659 char *p
= mnemonicendp
- 3;
17664 sprintf (p
, "%s%s", pclmul_op
[pclmul_type
].name
, suffix
);
17665 mnemonicendp
+= pclmul_op
[pclmul_type
].len
;
17669 /* We have a reserved extension byte. Output it directly. */
17670 scratchbuf
[0] = '$';
17671 print_operand_value (scratchbuf
+ 1, 1, pclmul_type
);
17672 oappend_maybe_intel (scratchbuf
);
17673 scratchbuf
[0] = '\0';
17678 MOVBE_Fixup (int bytemode
, int sizeflag
)
17680 /* Add proper suffix to "movbe". */
17681 char *p
= mnemonicendp
;
17690 if (sizeflag
& SUFFIX_ALWAYS
)
17696 if (sizeflag
& DFLAG
)
17700 used_prefixes
|= (prefixes
& PREFIX_DATA
);
17705 oappend (INTERNAL_DISASSEMBLER_ERROR
);
17712 OP_M (bytemode
, sizeflag
);
17716 OP_LWPCB_E (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
17719 const char **names
;
17721 /* Skip mod/rm byte. */
17735 oappend (names
[reg
]);
17739 OP_LWP_E (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
17741 const char **names
;
17748 oappend (names
[vex
.register_specifier
]);
17752 OP_Mask (int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
17755 || (bytemode
!= mask_mode
&& bytemode
!= mask_bd_mode
))
17759 if ((rex
& REX_R
) != 0 || !vex
.r
)
17765 oappend (names_mask
[modrm
.reg
]);
17769 OP_Rounding (int bytemode
, int sizeflag ATTRIBUTE_UNUSED
)
17772 || (bytemode
!= evex_rounding_mode
17773 && bytemode
!= evex_sae_mode
))
17775 if (modrm
.mod
== 3 && vex
.b
)
17778 case evex_rounding_mode
:
17779 oappend (names_rounding
[vex
.ll
]);
17781 case evex_sae_mode
: