Disallow 64bit relocations in x32 mode.
[binutils.git] / opcodes / i386-dis.c
blob9e18bac681da2e8831aeff1d99d7f7c6a1a8e8a8
1 /* Print i386 instructions for GDB, the GNU debugger.
2 Copyright 1988, 1989, 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
4 Free Software Foundation, Inc.
6 This file is part of the GNU opcodes library.
8 This library is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3, or (at your option)
11 any later version.
13 It is distributed in the hope that it will be useful, but WITHOUT
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
16 License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21 MA 02110-1301, USA. */
24 /* 80386 instruction printer by Pace Willisson (pace@prep.ai.mit.edu)
25 July 1988
26 modified by John Hassey (hassey@dg-rtp.dg.com)
27 x86-64 support added by Jan Hubicka (jh@suse.cz)
28 VIA PadLock support by Michal Ludvig (mludvig@suse.cz). */
30 /* The main tables describing the instructions is essentially a copy
31 of the "Opcode Map" chapter (Appendix A) of the Intel 80386
32 Programmers Manual. Usually, there is a capital letter, followed
33 by a small letter. The capital letter tell the addressing mode,
34 and the small letter tells about the operand size. Refer to
35 the Intel manual for details. */
37 #include "sysdep.h"
38 #include "dis-asm.h"
39 #include "opintl.h"
40 #include "opcode/i386.h"
41 #include "libiberty.h"
43 #include <setjmp.h>
45 static int print_insn (bfd_vma, disassemble_info *);
46 static void dofloat (int);
47 static void OP_ST (int, int);
48 static void OP_STi (int, int);
49 static int putop (const char *, int);
50 static void oappend (const char *);
51 static void append_seg (void);
52 static void OP_indirE (int, int);
53 static void print_operand_value (char *, int, bfd_vma);
54 static void OP_E_register (int, int);
55 static void OP_E_memory (int, int);
56 static void print_displacement (char *, bfd_vma);
57 static void OP_E (int, int);
58 static void OP_G (int, int);
59 static bfd_vma get64 (void);
60 static bfd_signed_vma get32 (void);
61 static bfd_signed_vma get32s (void);
62 static int get16 (void);
63 static void set_op (bfd_vma, int);
64 static void OP_Skip_MODRM (int, int);
65 static void OP_REG (int, int);
66 static void OP_IMREG (int, int);
67 static void OP_I (int, int);
68 static void OP_I64 (int, int);
69 static void OP_sI (int, int);
70 static void OP_J (int, int);
71 static void OP_SEG (int, int);
72 static void OP_DIR (int, int);
73 static void OP_OFF (int, int);
74 static void OP_OFF64 (int, int);
75 static void ptr_reg (int, int);
76 static void OP_ESreg (int, int);
77 static void OP_DSreg (int, int);
78 static void OP_C (int, int);
79 static void OP_D (int, int);
80 static void OP_T (int, int);
81 static void OP_R (int, int);
82 static void OP_MMX (int, int);
83 static void OP_XMM (int, int);
84 static void OP_EM (int, int);
85 static void OP_EX (int, int);
86 static void OP_EMC (int,int);
87 static void OP_MXC (int,int);
88 static void OP_MS (int, int);
89 static void OP_XS (int, int);
90 static void OP_M (int, int);
91 static void OP_VEX (int, int);
92 static void OP_EX_Vex (int, int);
93 static void OP_EX_VexW (int, int);
94 static void OP_EX_VexImmW (int, int);
95 static void OP_XMM_Vex (int, int);
96 static void OP_XMM_VexW (int, int);
97 static void OP_REG_VexI4 (int, int);
98 static void PCLMUL_Fixup (int, int);
99 static void VEXI4_Fixup (int, int);
100 static void VZERO_Fixup (int, int);
101 static void VCMP_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 NOP_Fixup1 (int, int);
106 static void NOP_Fixup2 (int, int);
107 static void OP_3DNowSuffix (int, int);
108 static void CMP_Fixup (int, int);
109 static void BadOp (void);
110 static void REP_Fixup (int, int);
111 static void CMPXCHG8B_Fixup (int, int);
112 static void XMM_Fixup (int, int);
113 static void CRC32_Fixup (int, int);
114 static void FXSAVE_Fixup (int, int);
115 static void OP_LWPCB_E (int, int);
116 static void OP_LWP_E (int, int);
117 static void OP_Vex_2src_1 (int, int);
118 static void OP_Vex_2src_2 (int, int);
120 static void MOVBE_Fixup (int, int);
122 struct dis_private {
123 /* Points to first byte not fetched. */
124 bfd_byte *max_fetched;
125 bfd_byte the_buffer[MAX_MNEM_SIZE];
126 bfd_vma insn_start;
127 int orig_sizeflag;
128 jmp_buf bailout;
131 enum address_mode
133 mode_16bit,
134 mode_32bit,
135 mode_64bit
138 enum address_mode address_mode;
140 /* Flags for the prefixes for the current instruction. See below. */
141 static int prefixes;
143 /* REX prefix the current instruction. See below. */
144 static int rex;
145 /* Bits of REX we've already used. */
146 static int rex_used;
147 /* REX bits in original REX prefix ignored. */
148 static int rex_ignored;
149 /* Mark parts used in the REX prefix. When we are testing for
150 empty prefix (for 8bit register REX extension), just mask it
151 out. Otherwise test for REX bit is excuse for existence of REX
152 only in case value is nonzero. */
153 #define USED_REX(value) \
155 if (value) \
157 if ((rex & value)) \
158 rex_used |= (value) | REX_OPCODE; \
160 else \
161 rex_used |= REX_OPCODE; \
164 /* Flags for prefixes which we somehow handled when printing the
165 current instruction. */
166 static int used_prefixes;
168 /* Flags stored in PREFIXES. */
169 #define PREFIX_REPZ 1
170 #define PREFIX_REPNZ 2
171 #define PREFIX_LOCK 4
172 #define PREFIX_CS 8
173 #define PREFIX_SS 0x10
174 #define PREFIX_DS 0x20
175 #define PREFIX_ES 0x40
176 #define PREFIX_FS 0x80
177 #define PREFIX_GS 0x100
178 #define PREFIX_DATA 0x200
179 #define PREFIX_ADDR 0x400
180 #define PREFIX_FWAIT 0x800
182 /* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
183 to ADDR (exclusive) are valid. Returns 1 for success, longjmps
184 on error. */
185 #define FETCH_DATA(info, addr) \
186 ((addr) <= ((struct dis_private *) (info->private_data))->max_fetched \
187 ? 1 : fetch_data ((info), (addr)))
189 static int
190 fetch_data (struct disassemble_info *info, bfd_byte *addr)
192 int status;
193 struct dis_private *priv = (struct dis_private *) info->private_data;
194 bfd_vma start = priv->insn_start + (priv->max_fetched - priv->the_buffer);
196 if (addr <= priv->the_buffer + MAX_MNEM_SIZE)
197 status = (*info->read_memory_func) (start,
198 priv->max_fetched,
199 addr - priv->max_fetched,
200 info);
201 else
202 status = -1;
203 if (status != 0)
205 /* If we did manage to read at least one byte, then
206 print_insn_i386 will do something sensible. Otherwise, print
207 an error. We do that here because this is where we know
208 STATUS. */
209 if (priv->max_fetched == priv->the_buffer)
210 (*info->memory_error_func) (status, start, info);
211 longjmp (priv->bailout, 1);
213 else
214 priv->max_fetched = addr;
215 return 1;
218 #define XX { NULL, 0 }
219 #define Bad_Opcode NULL, { { NULL, 0 } }
221 #define Eb { OP_E, b_mode }
222 #define EbS { OP_E, b_swap_mode }
223 #define Ev { OP_E, v_mode }
224 #define EvS { OP_E, v_swap_mode }
225 #define Ed { OP_E, d_mode }
226 #define Edq { OP_E, dq_mode }
227 #define Edqw { OP_E, dqw_mode }
228 #define Edqb { OP_E, dqb_mode }
229 #define Edqd { OP_E, dqd_mode }
230 #define Eq { OP_E, q_mode }
231 #define indirEv { OP_indirE, stack_v_mode }
232 #define indirEp { OP_indirE, f_mode }
233 #define stackEv { OP_E, stack_v_mode }
234 #define Em { OP_E, m_mode }
235 #define Ew { OP_E, w_mode }
236 #define M { OP_M, 0 } /* lea, lgdt, etc. */
237 #define Ma { OP_M, a_mode }
238 #define Mb { OP_M, b_mode }
239 #define Md { OP_M, d_mode }
240 #define Mo { OP_M, o_mode }
241 #define Mp { OP_M, f_mode } /* 32 or 48 bit memory operand for LDS, LES etc */
242 #define Mq { OP_M, q_mode }
243 #define Mx { OP_M, x_mode }
244 #define Mxmm { OP_M, xmm_mode }
245 #define Gb { OP_G, b_mode }
246 #define Gv { OP_G, v_mode }
247 #define Gd { OP_G, d_mode }
248 #define Gdq { OP_G, dq_mode }
249 #define Gm { OP_G, m_mode }
250 #define Gw { OP_G, w_mode }
251 #define Rd { OP_R, d_mode }
252 #define Rm { OP_R, m_mode }
253 #define Ib { OP_I, b_mode }
254 #define sIb { OP_sI, b_mode } /* sign extened byte */
255 #define Iv { OP_I, v_mode }
256 #define sIv { OP_sI, v_mode }
257 #define Iq { OP_I, q_mode }
258 #define Iv64 { OP_I64, v_mode }
259 #define Iw { OP_I, w_mode }
260 #define I1 { OP_I, const_1_mode }
261 #define Jb { OP_J, b_mode }
262 #define Jv { OP_J, v_mode }
263 #define Cm { OP_C, m_mode }
264 #define Dm { OP_D, m_mode }
265 #define Td { OP_T, d_mode }
266 #define Skip_MODRM { OP_Skip_MODRM, 0 }
268 #define RMeAX { OP_REG, eAX_reg }
269 #define RMeBX { OP_REG, eBX_reg }
270 #define RMeCX { OP_REG, eCX_reg }
271 #define RMeDX { OP_REG, eDX_reg }
272 #define RMeSP { OP_REG, eSP_reg }
273 #define RMeBP { OP_REG, eBP_reg }
274 #define RMeSI { OP_REG, eSI_reg }
275 #define RMeDI { OP_REG, eDI_reg }
276 #define RMrAX { OP_REG, rAX_reg }
277 #define RMrBX { OP_REG, rBX_reg }
278 #define RMrCX { OP_REG, rCX_reg }
279 #define RMrDX { OP_REG, rDX_reg }
280 #define RMrSP { OP_REG, rSP_reg }
281 #define RMrBP { OP_REG, rBP_reg }
282 #define RMrSI { OP_REG, rSI_reg }
283 #define RMrDI { OP_REG, rDI_reg }
284 #define RMAL { OP_REG, al_reg }
285 #define RMCL { OP_REG, cl_reg }
286 #define RMDL { OP_REG, dl_reg }
287 #define RMBL { OP_REG, bl_reg }
288 #define RMAH { OP_REG, ah_reg }
289 #define RMCH { OP_REG, ch_reg }
290 #define RMDH { OP_REG, dh_reg }
291 #define RMBH { OP_REG, bh_reg }
292 #define RMAX { OP_REG, ax_reg }
293 #define RMDX { OP_REG, dx_reg }
295 #define eAX { OP_IMREG, eAX_reg }
296 #define eBX { OP_IMREG, eBX_reg }
297 #define eCX { OP_IMREG, eCX_reg }
298 #define eDX { OP_IMREG, eDX_reg }
299 #define eSP { OP_IMREG, eSP_reg }
300 #define eBP { OP_IMREG, eBP_reg }
301 #define eSI { OP_IMREG, eSI_reg }
302 #define eDI { OP_IMREG, eDI_reg }
303 #define AL { OP_IMREG, al_reg }
304 #define CL { OP_IMREG, cl_reg }
305 #define DL { OP_IMREG, dl_reg }
306 #define BL { OP_IMREG, bl_reg }
307 #define AH { OP_IMREG, ah_reg }
308 #define CH { OP_IMREG, ch_reg }
309 #define DH { OP_IMREG, dh_reg }
310 #define BH { OP_IMREG, bh_reg }
311 #define AX { OP_IMREG, ax_reg }
312 #define DX { OP_IMREG, dx_reg }
313 #define zAX { OP_IMREG, z_mode_ax_reg }
314 #define indirDX { OP_IMREG, indir_dx_reg }
316 #define Sw { OP_SEG, w_mode }
317 #define Sv { OP_SEG, v_mode }
318 #define Ap { OP_DIR, 0 }
319 #define Ob { OP_OFF64, b_mode }
320 #define Ov { OP_OFF64, v_mode }
321 #define Xb { OP_DSreg, eSI_reg }
322 #define Xv { OP_DSreg, eSI_reg }
323 #define Xz { OP_DSreg, eSI_reg }
324 #define Yb { OP_ESreg, eDI_reg }
325 #define Yv { OP_ESreg, eDI_reg }
326 #define DSBX { OP_DSreg, eBX_reg }
328 #define es { OP_REG, es_reg }
329 #define ss { OP_REG, ss_reg }
330 #define cs { OP_REG, cs_reg }
331 #define ds { OP_REG, ds_reg }
332 #define fs { OP_REG, fs_reg }
333 #define gs { OP_REG, gs_reg }
335 #define MX { OP_MMX, 0 }
336 #define XM { OP_XMM, 0 }
337 #define XMScalar { OP_XMM, scalar_mode }
338 #define XMM { OP_XMM, xmm_mode }
339 #define EM { OP_EM, v_mode }
340 #define EMS { OP_EM, v_swap_mode }
341 #define EMd { OP_EM, d_mode }
342 #define EMx { OP_EM, x_mode }
343 #define EXw { OP_EX, w_mode }
344 #define EXd { OP_EX, d_mode }
345 #define EXdScalar { OP_EX, d_scalar_mode }
346 #define EXdS { OP_EX, d_swap_mode }
347 #define EXq { OP_EX, q_mode }
348 #define EXqScalar { OP_EX, q_scalar_mode }
349 #define EXqScalarS { OP_EX, q_scalar_swap_mode }
350 #define EXqS { OP_EX, q_swap_mode }
351 #define EXx { OP_EX, x_mode }
352 #define EXxS { OP_EX, x_swap_mode }
353 #define EXxmm { OP_EX, xmm_mode }
354 #define EXxmmq { OP_EX, xmmq_mode }
355 #define EXymmq { OP_EX, ymmq_mode }
356 #define EXVexWdq { OP_EX, vex_w_dq_mode }
357 #define EXVexWdqScalar { OP_EX, vex_scalar_w_dq_mode }
358 #define MS { OP_MS, v_mode }
359 #define XS { OP_XS, v_mode }
360 #define EMCq { OP_EMC, q_mode }
361 #define MXC { OP_MXC, 0 }
362 #define OPSUF { OP_3DNowSuffix, 0 }
363 #define CMP { CMP_Fixup, 0 }
364 #define XMM0 { XMM_Fixup, 0 }
365 #define FXSAVE { FXSAVE_Fixup, 0 }
366 #define Vex_2src_1 { OP_Vex_2src_1, 0 }
367 #define Vex_2src_2 { OP_Vex_2src_2, 0 }
369 #define Vex { OP_VEX, vex_mode }
370 #define VexScalar { OP_VEX, vex_scalar_mode }
371 #define Vex128 { OP_VEX, vex128_mode }
372 #define Vex256 { OP_VEX, vex256_mode }
373 #define VexGdq { OP_VEX, dq_mode }
374 #define VexI4 { VEXI4_Fixup, 0}
375 #define EXdVex { OP_EX_Vex, d_mode }
376 #define EXdVexS { OP_EX_Vex, d_swap_mode }
377 #define EXdVexScalarS { OP_EX_Vex, d_scalar_swap_mode }
378 #define EXqVex { OP_EX_Vex, q_mode }
379 #define EXqVexS { OP_EX_Vex, q_swap_mode }
380 #define EXqVexScalarS { OP_EX_Vex, q_scalar_swap_mode }
381 #define EXVexW { OP_EX_VexW, x_mode }
382 #define EXdVexW { OP_EX_VexW, d_mode }
383 #define EXqVexW { OP_EX_VexW, q_mode }
384 #define EXVexImmW { OP_EX_VexImmW, x_mode }
385 #define XMVex { OP_XMM_Vex, 0 }
386 #define XMVexScalar { OP_XMM_Vex, scalar_mode }
387 #define XMVexW { OP_XMM_VexW, 0 }
388 #define XMVexI4 { OP_REG_VexI4, x_mode }
389 #define PCLMUL { PCLMUL_Fixup, 0 }
390 #define VZERO { VZERO_Fixup, 0 }
391 #define VCMP { VCMP_Fixup, 0 }
393 /* Used handle "rep" prefix for string instructions. */
394 #define Xbr { REP_Fixup, eSI_reg }
395 #define Xvr { REP_Fixup, eSI_reg }
396 #define Ybr { REP_Fixup, eDI_reg }
397 #define Yvr { REP_Fixup, eDI_reg }
398 #define Yzr { REP_Fixup, eDI_reg }
399 #define indirDXr { REP_Fixup, indir_dx_reg }
400 #define ALr { REP_Fixup, al_reg }
401 #define eAXr { REP_Fixup, eAX_reg }
403 #define cond_jump_flag { NULL, cond_jump_mode }
404 #define loop_jcxz_flag { NULL, loop_jcxz_mode }
406 /* bits in sizeflag */
407 #define SUFFIX_ALWAYS 4
408 #define AFLAG 2
409 #define DFLAG 1
411 enum
413 /* byte operand */
414 b_mode = 1,
415 /* byte operand with operand swapped */
416 b_swap_mode,
417 /* operand size depends on prefixes */
418 v_mode,
419 /* operand size depends on prefixes with operand swapped */
420 v_swap_mode,
421 /* word operand */
422 w_mode,
423 /* double word operand */
424 d_mode,
425 /* double word operand with operand swapped */
426 d_swap_mode,
427 /* quad word operand */
428 q_mode,
429 /* quad word operand with operand swapped */
430 q_swap_mode,
431 /* ten-byte operand */
432 t_mode,
433 /* 16-byte XMM or 32-byte YMM operand */
434 x_mode,
435 /* 16-byte XMM or 32-byte YMM operand with operand swapped */
436 x_swap_mode,
437 /* 16-byte XMM operand */
438 xmm_mode,
439 /* 16-byte XMM or quad word operand */
440 xmmq_mode,
441 /* 32-byte YMM or quad word operand */
442 ymmq_mode,
443 /* d_mode in 32bit, q_mode in 64bit mode. */
444 m_mode,
445 /* pair of v_mode operands */
446 a_mode,
447 cond_jump_mode,
448 loop_jcxz_mode,
449 /* operand size depends on REX prefixes. */
450 dq_mode,
451 /* registers like dq_mode, memory like w_mode. */
452 dqw_mode,
453 /* 4- or 6-byte pointer operand */
454 f_mode,
455 const_1_mode,
456 /* v_mode for stack-related opcodes. */
457 stack_v_mode,
458 /* non-quad operand size depends on prefixes */
459 z_mode,
460 /* 16-byte operand */
461 o_mode,
462 /* registers like dq_mode, memory like b_mode. */
463 dqb_mode,
464 /* registers like dq_mode, memory like d_mode. */
465 dqd_mode,
466 /* normal vex mode */
467 vex_mode,
468 /* 128bit vex mode */
469 vex128_mode,
470 /* 256bit vex mode */
471 vex256_mode,
472 /* operand size depends on the VEX.W bit. */
473 vex_w_dq_mode,
475 /* scalar, ignore vector length. */
476 scalar_mode,
477 /* like d_mode, ignore vector length. */
478 d_scalar_mode,
479 /* like d_swap_mode, ignore vector length. */
480 d_scalar_swap_mode,
481 /* like q_mode, ignore vector length. */
482 q_scalar_mode,
483 /* like q_swap_mode, ignore vector length. */
484 q_scalar_swap_mode,
485 /* like vex_mode, ignore vector length. */
486 vex_scalar_mode,
487 /* like vex_w_dq_mode, ignore vector length. */
488 vex_scalar_w_dq_mode,
490 es_reg,
491 cs_reg,
492 ss_reg,
493 ds_reg,
494 fs_reg,
495 gs_reg,
497 eAX_reg,
498 eCX_reg,
499 eDX_reg,
500 eBX_reg,
501 eSP_reg,
502 eBP_reg,
503 eSI_reg,
504 eDI_reg,
506 al_reg,
507 cl_reg,
508 dl_reg,
509 bl_reg,
510 ah_reg,
511 ch_reg,
512 dh_reg,
513 bh_reg,
515 ax_reg,
516 cx_reg,
517 dx_reg,
518 bx_reg,
519 sp_reg,
520 bp_reg,
521 si_reg,
522 di_reg,
524 rAX_reg,
525 rCX_reg,
526 rDX_reg,
527 rBX_reg,
528 rSP_reg,
529 rBP_reg,
530 rSI_reg,
531 rDI_reg,
533 z_mode_ax_reg,
534 indir_dx_reg
537 enum
539 FLOATCODE = 1,
540 USE_REG_TABLE,
541 USE_MOD_TABLE,
542 USE_RM_TABLE,
543 USE_PREFIX_TABLE,
544 USE_X86_64_TABLE,
545 USE_3BYTE_TABLE,
546 USE_XOP_8F_TABLE,
547 USE_VEX_C4_TABLE,
548 USE_VEX_C5_TABLE,
549 USE_VEX_LEN_TABLE,
550 USE_VEX_W_TABLE
553 #define FLOAT NULL, { { NULL, FLOATCODE } }
555 #define DIS386(T, I) NULL, { { NULL, (T)}, { NULL, (I) } }
556 #define REG_TABLE(I) DIS386 (USE_REG_TABLE, (I))
557 #define MOD_TABLE(I) DIS386 (USE_MOD_TABLE, (I))
558 #define RM_TABLE(I) DIS386 (USE_RM_TABLE, (I))
559 #define PREFIX_TABLE(I) DIS386 (USE_PREFIX_TABLE, (I))
560 #define X86_64_TABLE(I) DIS386 (USE_X86_64_TABLE, (I))
561 #define THREE_BYTE_TABLE(I) DIS386 (USE_3BYTE_TABLE, (I))
562 #define XOP_8F_TABLE(I) DIS386 (USE_XOP_8F_TABLE, (I))
563 #define VEX_C4_TABLE(I) DIS386 (USE_VEX_C4_TABLE, (I))
564 #define VEX_C5_TABLE(I) DIS386 (USE_VEX_C5_TABLE, (I))
565 #define VEX_LEN_TABLE(I) DIS386 (USE_VEX_LEN_TABLE, (I))
566 #define VEX_W_TABLE(I) DIS386 (USE_VEX_W_TABLE, (I))
568 enum
570 REG_80 = 0,
571 REG_81,
572 REG_82,
573 REG_8F,
574 REG_C0,
575 REG_C1,
576 REG_C6,
577 REG_C7,
578 REG_D0,
579 REG_D1,
580 REG_D2,
581 REG_D3,
582 REG_F6,
583 REG_F7,
584 REG_FE,
585 REG_FF,
586 REG_0F00,
587 REG_0F01,
588 REG_0F0D,
589 REG_0F18,
590 REG_0F71,
591 REG_0F72,
592 REG_0F73,
593 REG_0FA6,
594 REG_0FA7,
595 REG_0FAE,
596 REG_0FBA,
597 REG_0FC7,
598 REG_VEX_0F71,
599 REG_VEX_0F72,
600 REG_VEX_0F73,
601 REG_VEX_0FAE,
602 REG_VEX_0F38F3,
603 REG_XOP_LWPCB,
604 REG_XOP_LWP
607 enum
609 MOD_8D = 0,
610 MOD_0F01_REG_0,
611 MOD_0F01_REG_1,
612 MOD_0F01_REG_2,
613 MOD_0F01_REG_3,
614 MOD_0F01_REG_7,
615 MOD_0F12_PREFIX_0,
616 MOD_0F13,
617 MOD_0F16_PREFIX_0,
618 MOD_0F17,
619 MOD_0F18_REG_0,
620 MOD_0F18_REG_1,
621 MOD_0F18_REG_2,
622 MOD_0F18_REG_3,
623 MOD_0F20,
624 MOD_0F21,
625 MOD_0F22,
626 MOD_0F23,
627 MOD_0F24,
628 MOD_0F26,
629 MOD_0F2B_PREFIX_0,
630 MOD_0F2B_PREFIX_1,
631 MOD_0F2B_PREFIX_2,
632 MOD_0F2B_PREFIX_3,
633 MOD_0F51,
634 MOD_0F71_REG_2,
635 MOD_0F71_REG_4,
636 MOD_0F71_REG_6,
637 MOD_0F72_REG_2,
638 MOD_0F72_REG_4,
639 MOD_0F72_REG_6,
640 MOD_0F73_REG_2,
641 MOD_0F73_REG_3,
642 MOD_0F73_REG_6,
643 MOD_0F73_REG_7,
644 MOD_0FAE_REG_0,
645 MOD_0FAE_REG_1,
646 MOD_0FAE_REG_2,
647 MOD_0FAE_REG_3,
648 MOD_0FAE_REG_4,
649 MOD_0FAE_REG_5,
650 MOD_0FAE_REG_6,
651 MOD_0FAE_REG_7,
652 MOD_0FB2,
653 MOD_0FB4,
654 MOD_0FB5,
655 MOD_0FC7_REG_6,
656 MOD_0FC7_REG_7,
657 MOD_0FD7,
658 MOD_0FE7_PREFIX_2,
659 MOD_0FF0_PREFIX_3,
660 MOD_0F382A_PREFIX_2,
661 MOD_62_32BIT,
662 MOD_C4_32BIT,
663 MOD_C5_32BIT,
664 MOD_VEX_0F12_PREFIX_0,
665 MOD_VEX_0F13,
666 MOD_VEX_0F16_PREFIX_0,
667 MOD_VEX_0F17,
668 MOD_VEX_0F2B,
669 MOD_VEX_0F50,
670 MOD_VEX_0F71_REG_2,
671 MOD_VEX_0F71_REG_4,
672 MOD_VEX_0F71_REG_6,
673 MOD_VEX_0F72_REG_2,
674 MOD_VEX_0F72_REG_4,
675 MOD_VEX_0F72_REG_6,
676 MOD_VEX_0F73_REG_2,
677 MOD_VEX_0F73_REG_3,
678 MOD_VEX_0F73_REG_6,
679 MOD_VEX_0F73_REG_7,
680 MOD_VEX_0FAE_REG_2,
681 MOD_VEX_0FAE_REG_3,
682 MOD_VEX_0FD7_PREFIX_2,
683 MOD_VEX_0FE7_PREFIX_2,
684 MOD_VEX_0FF0_PREFIX_3,
685 MOD_VEX_0F3818_PREFIX_2,
686 MOD_VEX_0F3819_PREFIX_2,
687 MOD_VEX_0F381A_PREFIX_2,
688 MOD_VEX_0F382A_PREFIX_2,
689 MOD_VEX_0F382C_PREFIX_2,
690 MOD_VEX_0F382D_PREFIX_2,
691 MOD_VEX_0F382E_PREFIX_2,
692 MOD_VEX_0F382F_PREFIX_2
695 enum
697 RM_0F01_REG_0 = 0,
698 RM_0F01_REG_1,
699 RM_0F01_REG_2,
700 RM_0F01_REG_3,
701 RM_0F01_REG_7,
702 RM_0FAE_REG_5,
703 RM_0FAE_REG_6,
704 RM_0FAE_REG_7
707 enum
709 PREFIX_90 = 0,
710 PREFIX_0F10,
711 PREFIX_0F11,
712 PREFIX_0F12,
713 PREFIX_0F16,
714 PREFIX_0F2A,
715 PREFIX_0F2B,
716 PREFIX_0F2C,
717 PREFIX_0F2D,
718 PREFIX_0F2E,
719 PREFIX_0F2F,
720 PREFIX_0F51,
721 PREFIX_0F52,
722 PREFIX_0F53,
723 PREFIX_0F58,
724 PREFIX_0F59,
725 PREFIX_0F5A,
726 PREFIX_0F5B,
727 PREFIX_0F5C,
728 PREFIX_0F5D,
729 PREFIX_0F5E,
730 PREFIX_0F5F,
731 PREFIX_0F60,
732 PREFIX_0F61,
733 PREFIX_0F62,
734 PREFIX_0F6C,
735 PREFIX_0F6D,
736 PREFIX_0F6F,
737 PREFIX_0F70,
738 PREFIX_0F73_REG_3,
739 PREFIX_0F73_REG_7,
740 PREFIX_0F78,
741 PREFIX_0F79,
742 PREFIX_0F7C,
743 PREFIX_0F7D,
744 PREFIX_0F7E,
745 PREFIX_0F7F,
746 PREFIX_0FAE_REG_0,
747 PREFIX_0FAE_REG_1,
748 PREFIX_0FAE_REG_2,
749 PREFIX_0FAE_REG_3,
750 PREFIX_0FB8,
751 PREFIX_0FBC,
752 PREFIX_0FBD,
753 PREFIX_0FC2,
754 PREFIX_0FC3,
755 PREFIX_0FC7_REG_6,
756 PREFIX_0FD0,
757 PREFIX_0FD6,
758 PREFIX_0FE6,
759 PREFIX_0FE7,
760 PREFIX_0FF0,
761 PREFIX_0FF7,
762 PREFIX_0F3810,
763 PREFIX_0F3814,
764 PREFIX_0F3815,
765 PREFIX_0F3817,
766 PREFIX_0F3820,
767 PREFIX_0F3821,
768 PREFIX_0F3822,
769 PREFIX_0F3823,
770 PREFIX_0F3824,
771 PREFIX_0F3825,
772 PREFIX_0F3828,
773 PREFIX_0F3829,
774 PREFIX_0F382A,
775 PREFIX_0F382B,
776 PREFIX_0F3830,
777 PREFIX_0F3831,
778 PREFIX_0F3832,
779 PREFIX_0F3833,
780 PREFIX_0F3834,
781 PREFIX_0F3835,
782 PREFIX_0F3837,
783 PREFIX_0F3838,
784 PREFIX_0F3839,
785 PREFIX_0F383A,
786 PREFIX_0F383B,
787 PREFIX_0F383C,
788 PREFIX_0F383D,
789 PREFIX_0F383E,
790 PREFIX_0F383F,
791 PREFIX_0F3840,
792 PREFIX_0F3841,
793 PREFIX_0F3880,
794 PREFIX_0F3881,
795 PREFIX_0F38DB,
796 PREFIX_0F38DC,
797 PREFIX_0F38DD,
798 PREFIX_0F38DE,
799 PREFIX_0F38DF,
800 PREFIX_0F38F0,
801 PREFIX_0F38F1,
802 PREFIX_0F3A08,
803 PREFIX_0F3A09,
804 PREFIX_0F3A0A,
805 PREFIX_0F3A0B,
806 PREFIX_0F3A0C,
807 PREFIX_0F3A0D,
808 PREFIX_0F3A0E,
809 PREFIX_0F3A14,
810 PREFIX_0F3A15,
811 PREFIX_0F3A16,
812 PREFIX_0F3A17,
813 PREFIX_0F3A20,
814 PREFIX_0F3A21,
815 PREFIX_0F3A22,
816 PREFIX_0F3A40,
817 PREFIX_0F3A41,
818 PREFIX_0F3A42,
819 PREFIX_0F3A44,
820 PREFIX_0F3A60,
821 PREFIX_0F3A61,
822 PREFIX_0F3A62,
823 PREFIX_0F3A63,
824 PREFIX_0F3ADF,
825 PREFIX_VEX_0F10,
826 PREFIX_VEX_0F11,
827 PREFIX_VEX_0F12,
828 PREFIX_VEX_0F16,
829 PREFIX_VEX_0F2A,
830 PREFIX_VEX_0F2C,
831 PREFIX_VEX_0F2D,
832 PREFIX_VEX_0F2E,
833 PREFIX_VEX_0F2F,
834 PREFIX_VEX_0F51,
835 PREFIX_VEX_0F52,
836 PREFIX_VEX_0F53,
837 PREFIX_VEX_0F58,
838 PREFIX_VEX_0F59,
839 PREFIX_VEX_0F5A,
840 PREFIX_VEX_0F5B,
841 PREFIX_VEX_0F5C,
842 PREFIX_VEX_0F5D,
843 PREFIX_VEX_0F5E,
844 PREFIX_VEX_0F5F,
845 PREFIX_VEX_0F60,
846 PREFIX_VEX_0F61,
847 PREFIX_VEX_0F62,
848 PREFIX_VEX_0F63,
849 PREFIX_VEX_0F64,
850 PREFIX_VEX_0F65,
851 PREFIX_VEX_0F66,
852 PREFIX_VEX_0F67,
853 PREFIX_VEX_0F68,
854 PREFIX_VEX_0F69,
855 PREFIX_VEX_0F6A,
856 PREFIX_VEX_0F6B,
857 PREFIX_VEX_0F6C,
858 PREFIX_VEX_0F6D,
859 PREFIX_VEX_0F6E,
860 PREFIX_VEX_0F6F,
861 PREFIX_VEX_0F70,
862 PREFIX_VEX_0F71_REG_2,
863 PREFIX_VEX_0F71_REG_4,
864 PREFIX_VEX_0F71_REG_6,
865 PREFIX_VEX_0F72_REG_2,
866 PREFIX_VEX_0F72_REG_4,
867 PREFIX_VEX_0F72_REG_6,
868 PREFIX_VEX_0F73_REG_2,
869 PREFIX_VEX_0F73_REG_3,
870 PREFIX_VEX_0F73_REG_6,
871 PREFIX_VEX_0F73_REG_7,
872 PREFIX_VEX_0F74,
873 PREFIX_VEX_0F75,
874 PREFIX_VEX_0F76,
875 PREFIX_VEX_0F77,
876 PREFIX_VEX_0F7C,
877 PREFIX_VEX_0F7D,
878 PREFIX_VEX_0F7E,
879 PREFIX_VEX_0F7F,
880 PREFIX_VEX_0FC2,
881 PREFIX_VEX_0FC4,
882 PREFIX_VEX_0FC5,
883 PREFIX_VEX_0FD0,
884 PREFIX_VEX_0FD1,
885 PREFIX_VEX_0FD2,
886 PREFIX_VEX_0FD3,
887 PREFIX_VEX_0FD4,
888 PREFIX_VEX_0FD5,
889 PREFIX_VEX_0FD6,
890 PREFIX_VEX_0FD7,
891 PREFIX_VEX_0FD8,
892 PREFIX_VEX_0FD9,
893 PREFIX_VEX_0FDA,
894 PREFIX_VEX_0FDB,
895 PREFIX_VEX_0FDC,
896 PREFIX_VEX_0FDD,
897 PREFIX_VEX_0FDE,
898 PREFIX_VEX_0FDF,
899 PREFIX_VEX_0FE0,
900 PREFIX_VEX_0FE1,
901 PREFIX_VEX_0FE2,
902 PREFIX_VEX_0FE3,
903 PREFIX_VEX_0FE4,
904 PREFIX_VEX_0FE5,
905 PREFIX_VEX_0FE6,
906 PREFIX_VEX_0FE7,
907 PREFIX_VEX_0FE8,
908 PREFIX_VEX_0FE9,
909 PREFIX_VEX_0FEA,
910 PREFIX_VEX_0FEB,
911 PREFIX_VEX_0FEC,
912 PREFIX_VEX_0FED,
913 PREFIX_VEX_0FEE,
914 PREFIX_VEX_0FEF,
915 PREFIX_VEX_0FF0,
916 PREFIX_VEX_0FF1,
917 PREFIX_VEX_0FF2,
918 PREFIX_VEX_0FF3,
919 PREFIX_VEX_0FF4,
920 PREFIX_VEX_0FF5,
921 PREFIX_VEX_0FF6,
922 PREFIX_VEX_0FF7,
923 PREFIX_VEX_0FF8,
924 PREFIX_VEX_0FF9,
925 PREFIX_VEX_0FFA,
926 PREFIX_VEX_0FFB,
927 PREFIX_VEX_0FFC,
928 PREFIX_VEX_0FFD,
929 PREFIX_VEX_0FFE,
930 PREFIX_VEX_0F3800,
931 PREFIX_VEX_0F3801,
932 PREFIX_VEX_0F3802,
933 PREFIX_VEX_0F3803,
934 PREFIX_VEX_0F3804,
935 PREFIX_VEX_0F3805,
936 PREFIX_VEX_0F3806,
937 PREFIX_VEX_0F3807,
938 PREFIX_VEX_0F3808,
939 PREFIX_VEX_0F3809,
940 PREFIX_VEX_0F380A,
941 PREFIX_VEX_0F380B,
942 PREFIX_VEX_0F380C,
943 PREFIX_VEX_0F380D,
944 PREFIX_VEX_0F380E,
945 PREFIX_VEX_0F380F,
946 PREFIX_VEX_0F3813,
947 PREFIX_VEX_0F3817,
948 PREFIX_VEX_0F3818,
949 PREFIX_VEX_0F3819,
950 PREFIX_VEX_0F381A,
951 PREFIX_VEX_0F381C,
952 PREFIX_VEX_0F381D,
953 PREFIX_VEX_0F381E,
954 PREFIX_VEX_0F3820,
955 PREFIX_VEX_0F3821,
956 PREFIX_VEX_0F3822,
957 PREFIX_VEX_0F3823,
958 PREFIX_VEX_0F3824,
959 PREFIX_VEX_0F3825,
960 PREFIX_VEX_0F3828,
961 PREFIX_VEX_0F3829,
962 PREFIX_VEX_0F382A,
963 PREFIX_VEX_0F382B,
964 PREFIX_VEX_0F382C,
965 PREFIX_VEX_0F382D,
966 PREFIX_VEX_0F382E,
967 PREFIX_VEX_0F382F,
968 PREFIX_VEX_0F3830,
969 PREFIX_VEX_0F3831,
970 PREFIX_VEX_0F3832,
971 PREFIX_VEX_0F3833,
972 PREFIX_VEX_0F3834,
973 PREFIX_VEX_0F3835,
974 PREFIX_VEX_0F3837,
975 PREFIX_VEX_0F3838,
976 PREFIX_VEX_0F3839,
977 PREFIX_VEX_0F383A,
978 PREFIX_VEX_0F383B,
979 PREFIX_VEX_0F383C,
980 PREFIX_VEX_0F383D,
981 PREFIX_VEX_0F383E,
982 PREFIX_VEX_0F383F,
983 PREFIX_VEX_0F3840,
984 PREFIX_VEX_0F3841,
985 PREFIX_VEX_0F3896,
986 PREFIX_VEX_0F3897,
987 PREFIX_VEX_0F3898,
988 PREFIX_VEX_0F3899,
989 PREFIX_VEX_0F389A,
990 PREFIX_VEX_0F389B,
991 PREFIX_VEX_0F389C,
992 PREFIX_VEX_0F389D,
993 PREFIX_VEX_0F389E,
994 PREFIX_VEX_0F389F,
995 PREFIX_VEX_0F38A6,
996 PREFIX_VEX_0F38A7,
997 PREFIX_VEX_0F38A8,
998 PREFIX_VEX_0F38A9,
999 PREFIX_VEX_0F38AA,
1000 PREFIX_VEX_0F38AB,
1001 PREFIX_VEX_0F38AC,
1002 PREFIX_VEX_0F38AD,
1003 PREFIX_VEX_0F38AE,
1004 PREFIX_VEX_0F38AF,
1005 PREFIX_VEX_0F38B6,
1006 PREFIX_VEX_0F38B7,
1007 PREFIX_VEX_0F38B8,
1008 PREFIX_VEX_0F38B9,
1009 PREFIX_VEX_0F38BA,
1010 PREFIX_VEX_0F38BB,
1011 PREFIX_VEX_0F38BC,
1012 PREFIX_VEX_0F38BD,
1013 PREFIX_VEX_0F38BE,
1014 PREFIX_VEX_0F38BF,
1015 PREFIX_VEX_0F38DB,
1016 PREFIX_VEX_0F38DC,
1017 PREFIX_VEX_0F38DD,
1018 PREFIX_VEX_0F38DE,
1019 PREFIX_VEX_0F38DF,
1020 PREFIX_VEX_0F38F2,
1021 PREFIX_VEX_0F38F3_REG_1,
1022 PREFIX_VEX_0F38F3_REG_2,
1023 PREFIX_VEX_0F38F3_REG_3,
1024 PREFIX_VEX_0F38F7,
1025 PREFIX_VEX_0F3A04,
1026 PREFIX_VEX_0F3A05,
1027 PREFIX_VEX_0F3A06,
1028 PREFIX_VEX_0F3A08,
1029 PREFIX_VEX_0F3A09,
1030 PREFIX_VEX_0F3A0A,
1031 PREFIX_VEX_0F3A0B,
1032 PREFIX_VEX_0F3A0C,
1033 PREFIX_VEX_0F3A0D,
1034 PREFIX_VEX_0F3A0E,
1035 PREFIX_VEX_0F3A0F,
1036 PREFIX_VEX_0F3A14,
1037 PREFIX_VEX_0F3A15,
1038 PREFIX_VEX_0F3A16,
1039 PREFIX_VEX_0F3A17,
1040 PREFIX_VEX_0F3A18,
1041 PREFIX_VEX_0F3A19,
1042 PREFIX_VEX_0F3A1D,
1043 PREFIX_VEX_0F3A20,
1044 PREFIX_VEX_0F3A21,
1045 PREFIX_VEX_0F3A22,
1046 PREFIX_VEX_0F3A40,
1047 PREFIX_VEX_0F3A41,
1048 PREFIX_VEX_0F3A42,
1049 PREFIX_VEX_0F3A44,
1050 PREFIX_VEX_0F3A48,
1051 PREFIX_VEX_0F3A49,
1052 PREFIX_VEX_0F3A4A,
1053 PREFIX_VEX_0F3A4B,
1054 PREFIX_VEX_0F3A4C,
1055 PREFIX_VEX_0F3A5C,
1056 PREFIX_VEX_0F3A5D,
1057 PREFIX_VEX_0F3A5E,
1058 PREFIX_VEX_0F3A5F,
1059 PREFIX_VEX_0F3A60,
1060 PREFIX_VEX_0F3A61,
1061 PREFIX_VEX_0F3A62,
1062 PREFIX_VEX_0F3A63,
1063 PREFIX_VEX_0F3A68,
1064 PREFIX_VEX_0F3A69,
1065 PREFIX_VEX_0F3A6A,
1066 PREFIX_VEX_0F3A6B,
1067 PREFIX_VEX_0F3A6C,
1068 PREFIX_VEX_0F3A6D,
1069 PREFIX_VEX_0F3A6E,
1070 PREFIX_VEX_0F3A6F,
1071 PREFIX_VEX_0F3A78,
1072 PREFIX_VEX_0F3A79,
1073 PREFIX_VEX_0F3A7A,
1074 PREFIX_VEX_0F3A7B,
1075 PREFIX_VEX_0F3A7C,
1076 PREFIX_VEX_0F3A7D,
1077 PREFIX_VEX_0F3A7E,
1078 PREFIX_VEX_0F3A7F,
1079 PREFIX_VEX_0F3ADF
1082 enum
1084 X86_64_06 = 0,
1085 X86_64_07,
1086 X86_64_0D,
1087 X86_64_16,
1088 X86_64_17,
1089 X86_64_1E,
1090 X86_64_1F,
1091 X86_64_27,
1092 X86_64_2F,
1093 X86_64_37,
1094 X86_64_3F,
1095 X86_64_60,
1096 X86_64_61,
1097 X86_64_62,
1098 X86_64_63,
1099 X86_64_6D,
1100 X86_64_6F,
1101 X86_64_9A,
1102 X86_64_C4,
1103 X86_64_C5,
1104 X86_64_CE,
1105 X86_64_D4,
1106 X86_64_D5,
1107 X86_64_EA,
1108 X86_64_0F01_REG_0,
1109 X86_64_0F01_REG_1,
1110 X86_64_0F01_REG_2,
1111 X86_64_0F01_REG_3
1114 enum
1116 THREE_BYTE_0F38 = 0,
1117 THREE_BYTE_0F3A,
1118 THREE_BYTE_0F7A
1121 enum
1123 XOP_08 = 0,
1124 XOP_09,
1125 XOP_0A
1128 enum
1130 VEX_0F = 0,
1131 VEX_0F38,
1132 VEX_0F3A
1135 enum
1137 VEX_LEN_0F10_P_1 = 0,
1138 VEX_LEN_0F10_P_3,
1139 VEX_LEN_0F11_P_1,
1140 VEX_LEN_0F11_P_3,
1141 VEX_LEN_0F12_P_0_M_0,
1142 VEX_LEN_0F12_P_0_M_1,
1143 VEX_LEN_0F12_P_2,
1144 VEX_LEN_0F13_M_0,
1145 VEX_LEN_0F16_P_0_M_0,
1146 VEX_LEN_0F16_P_0_M_1,
1147 VEX_LEN_0F16_P_2,
1148 VEX_LEN_0F17_M_0,
1149 VEX_LEN_0F2A_P_1,
1150 VEX_LEN_0F2A_P_3,
1151 VEX_LEN_0F2C_P_1,
1152 VEX_LEN_0F2C_P_3,
1153 VEX_LEN_0F2D_P_1,
1154 VEX_LEN_0F2D_P_3,
1155 VEX_LEN_0F2E_P_0,
1156 VEX_LEN_0F2E_P_2,
1157 VEX_LEN_0F2F_P_0,
1158 VEX_LEN_0F2F_P_2,
1159 VEX_LEN_0F51_P_1,
1160 VEX_LEN_0F51_P_3,
1161 VEX_LEN_0F52_P_1,
1162 VEX_LEN_0F53_P_1,
1163 VEX_LEN_0F58_P_1,
1164 VEX_LEN_0F58_P_3,
1165 VEX_LEN_0F59_P_1,
1166 VEX_LEN_0F59_P_3,
1167 VEX_LEN_0F5A_P_1,
1168 VEX_LEN_0F5A_P_3,
1169 VEX_LEN_0F5C_P_1,
1170 VEX_LEN_0F5C_P_3,
1171 VEX_LEN_0F5D_P_1,
1172 VEX_LEN_0F5D_P_3,
1173 VEX_LEN_0F5E_P_1,
1174 VEX_LEN_0F5E_P_3,
1175 VEX_LEN_0F5F_P_1,
1176 VEX_LEN_0F5F_P_3,
1177 VEX_LEN_0F60_P_2,
1178 VEX_LEN_0F61_P_2,
1179 VEX_LEN_0F62_P_2,
1180 VEX_LEN_0F63_P_2,
1181 VEX_LEN_0F64_P_2,
1182 VEX_LEN_0F65_P_2,
1183 VEX_LEN_0F66_P_2,
1184 VEX_LEN_0F67_P_2,
1185 VEX_LEN_0F68_P_2,
1186 VEX_LEN_0F69_P_2,
1187 VEX_LEN_0F6A_P_2,
1188 VEX_LEN_0F6B_P_2,
1189 VEX_LEN_0F6C_P_2,
1190 VEX_LEN_0F6D_P_2,
1191 VEX_LEN_0F6E_P_2,
1192 VEX_LEN_0F70_P_1,
1193 VEX_LEN_0F70_P_2,
1194 VEX_LEN_0F70_P_3,
1195 VEX_LEN_0F71_R_2_P_2,
1196 VEX_LEN_0F71_R_4_P_2,
1197 VEX_LEN_0F71_R_6_P_2,
1198 VEX_LEN_0F72_R_2_P_2,
1199 VEX_LEN_0F72_R_4_P_2,
1200 VEX_LEN_0F72_R_6_P_2,
1201 VEX_LEN_0F73_R_2_P_2,
1202 VEX_LEN_0F73_R_3_P_2,
1203 VEX_LEN_0F73_R_6_P_2,
1204 VEX_LEN_0F73_R_7_P_2,
1205 VEX_LEN_0F74_P_2,
1206 VEX_LEN_0F75_P_2,
1207 VEX_LEN_0F76_P_2,
1208 VEX_LEN_0F7E_P_1,
1209 VEX_LEN_0F7E_P_2,
1210 VEX_LEN_0FAE_R_2_M_0,
1211 VEX_LEN_0FAE_R_3_M_0,
1212 VEX_LEN_0FC2_P_1,
1213 VEX_LEN_0FC2_P_3,
1214 VEX_LEN_0FC4_P_2,
1215 VEX_LEN_0FC5_P_2,
1216 VEX_LEN_0FD1_P_2,
1217 VEX_LEN_0FD2_P_2,
1218 VEX_LEN_0FD3_P_2,
1219 VEX_LEN_0FD4_P_2,
1220 VEX_LEN_0FD5_P_2,
1221 VEX_LEN_0FD6_P_2,
1222 VEX_LEN_0FD7_P_2_M_1,
1223 VEX_LEN_0FD8_P_2,
1224 VEX_LEN_0FD9_P_2,
1225 VEX_LEN_0FDA_P_2,
1226 VEX_LEN_0FDB_P_2,
1227 VEX_LEN_0FDC_P_2,
1228 VEX_LEN_0FDD_P_2,
1229 VEX_LEN_0FDE_P_2,
1230 VEX_LEN_0FDF_P_2,
1231 VEX_LEN_0FE0_P_2,
1232 VEX_LEN_0FE1_P_2,
1233 VEX_LEN_0FE2_P_2,
1234 VEX_LEN_0FE3_P_2,
1235 VEX_LEN_0FE4_P_2,
1236 VEX_LEN_0FE5_P_2,
1237 VEX_LEN_0FE8_P_2,
1238 VEX_LEN_0FE9_P_2,
1239 VEX_LEN_0FEA_P_2,
1240 VEX_LEN_0FEB_P_2,
1241 VEX_LEN_0FEC_P_2,
1242 VEX_LEN_0FED_P_2,
1243 VEX_LEN_0FEE_P_2,
1244 VEX_LEN_0FEF_P_2,
1245 VEX_LEN_0FF1_P_2,
1246 VEX_LEN_0FF2_P_2,
1247 VEX_LEN_0FF3_P_2,
1248 VEX_LEN_0FF4_P_2,
1249 VEX_LEN_0FF5_P_2,
1250 VEX_LEN_0FF6_P_2,
1251 VEX_LEN_0FF7_P_2,
1252 VEX_LEN_0FF8_P_2,
1253 VEX_LEN_0FF9_P_2,
1254 VEX_LEN_0FFA_P_2,
1255 VEX_LEN_0FFB_P_2,
1256 VEX_LEN_0FFC_P_2,
1257 VEX_LEN_0FFD_P_2,
1258 VEX_LEN_0FFE_P_2,
1259 VEX_LEN_0F3800_P_2,
1260 VEX_LEN_0F3801_P_2,
1261 VEX_LEN_0F3802_P_2,
1262 VEX_LEN_0F3803_P_2,
1263 VEX_LEN_0F3804_P_2,
1264 VEX_LEN_0F3805_P_2,
1265 VEX_LEN_0F3806_P_2,
1266 VEX_LEN_0F3807_P_2,
1267 VEX_LEN_0F3808_P_2,
1268 VEX_LEN_0F3809_P_2,
1269 VEX_LEN_0F380A_P_2,
1270 VEX_LEN_0F380B_P_2,
1271 VEX_LEN_0F3819_P_2_M_0,
1272 VEX_LEN_0F381A_P_2_M_0,
1273 VEX_LEN_0F381C_P_2,
1274 VEX_LEN_0F381D_P_2,
1275 VEX_LEN_0F381E_P_2,
1276 VEX_LEN_0F3820_P_2,
1277 VEX_LEN_0F3821_P_2,
1278 VEX_LEN_0F3822_P_2,
1279 VEX_LEN_0F3823_P_2,
1280 VEX_LEN_0F3824_P_2,
1281 VEX_LEN_0F3825_P_2,
1282 VEX_LEN_0F3828_P_2,
1283 VEX_LEN_0F3829_P_2,
1284 VEX_LEN_0F382A_P_2_M_0,
1285 VEX_LEN_0F382B_P_2,
1286 VEX_LEN_0F3830_P_2,
1287 VEX_LEN_0F3831_P_2,
1288 VEX_LEN_0F3832_P_2,
1289 VEX_LEN_0F3833_P_2,
1290 VEX_LEN_0F3834_P_2,
1291 VEX_LEN_0F3835_P_2,
1292 VEX_LEN_0F3837_P_2,
1293 VEX_LEN_0F3838_P_2,
1294 VEX_LEN_0F3839_P_2,
1295 VEX_LEN_0F383A_P_2,
1296 VEX_LEN_0F383B_P_2,
1297 VEX_LEN_0F383C_P_2,
1298 VEX_LEN_0F383D_P_2,
1299 VEX_LEN_0F383E_P_2,
1300 VEX_LEN_0F383F_P_2,
1301 VEX_LEN_0F3840_P_2,
1302 VEX_LEN_0F3841_P_2,
1303 VEX_LEN_0F38DB_P_2,
1304 VEX_LEN_0F38DC_P_2,
1305 VEX_LEN_0F38DD_P_2,
1306 VEX_LEN_0F38DE_P_2,
1307 VEX_LEN_0F38DF_P_2,
1308 VEX_LEN_0F38F2_P_0,
1309 VEX_LEN_0F38F3_R_1_P_0,
1310 VEX_LEN_0F38F3_R_2_P_0,
1311 VEX_LEN_0F38F3_R_3_P_0,
1312 VEX_LEN_0F38F7_P_0,
1313 VEX_LEN_0F3A06_P_2,
1314 VEX_LEN_0F3A0A_P_2,
1315 VEX_LEN_0F3A0B_P_2,
1316 VEX_LEN_0F3A0E_P_2,
1317 VEX_LEN_0F3A0F_P_2,
1318 VEX_LEN_0F3A14_P_2,
1319 VEX_LEN_0F3A15_P_2,
1320 VEX_LEN_0F3A16_P_2,
1321 VEX_LEN_0F3A17_P_2,
1322 VEX_LEN_0F3A18_P_2,
1323 VEX_LEN_0F3A19_P_2,
1324 VEX_LEN_0F3A20_P_2,
1325 VEX_LEN_0F3A21_P_2,
1326 VEX_LEN_0F3A22_P_2,
1327 VEX_LEN_0F3A41_P_2,
1328 VEX_LEN_0F3A42_P_2,
1329 VEX_LEN_0F3A44_P_2,
1330 VEX_LEN_0F3A4C_P_2,
1331 VEX_LEN_0F3A60_P_2,
1332 VEX_LEN_0F3A61_P_2,
1333 VEX_LEN_0F3A62_P_2,
1334 VEX_LEN_0F3A63_P_2,
1335 VEX_LEN_0F3A6A_P_2,
1336 VEX_LEN_0F3A6B_P_2,
1337 VEX_LEN_0F3A6E_P_2,
1338 VEX_LEN_0F3A6F_P_2,
1339 VEX_LEN_0F3A7A_P_2,
1340 VEX_LEN_0F3A7B_P_2,
1341 VEX_LEN_0F3A7E_P_2,
1342 VEX_LEN_0F3A7F_P_2,
1343 VEX_LEN_0F3ADF_P_2,
1344 VEX_LEN_0FXOP_09_80,
1345 VEX_LEN_0FXOP_09_81
1348 enum
1350 VEX_W_0F10_P_0 = 0,
1351 VEX_W_0F10_P_1,
1352 VEX_W_0F10_P_2,
1353 VEX_W_0F10_P_3,
1354 VEX_W_0F11_P_0,
1355 VEX_W_0F11_P_1,
1356 VEX_W_0F11_P_2,
1357 VEX_W_0F11_P_3,
1358 VEX_W_0F12_P_0_M_0,
1359 VEX_W_0F12_P_0_M_1,
1360 VEX_W_0F12_P_1,
1361 VEX_W_0F12_P_2,
1362 VEX_W_0F12_P_3,
1363 VEX_W_0F13_M_0,
1364 VEX_W_0F14,
1365 VEX_W_0F15,
1366 VEX_W_0F16_P_0_M_0,
1367 VEX_W_0F16_P_0_M_1,
1368 VEX_W_0F16_P_1,
1369 VEX_W_0F16_P_2,
1370 VEX_W_0F17_M_0,
1371 VEX_W_0F28,
1372 VEX_W_0F29,
1373 VEX_W_0F2B_M_0,
1374 VEX_W_0F2E_P_0,
1375 VEX_W_0F2E_P_2,
1376 VEX_W_0F2F_P_0,
1377 VEX_W_0F2F_P_2,
1378 VEX_W_0F50_M_0,
1379 VEX_W_0F51_P_0,
1380 VEX_W_0F51_P_1,
1381 VEX_W_0F51_P_2,
1382 VEX_W_0F51_P_3,
1383 VEX_W_0F52_P_0,
1384 VEX_W_0F52_P_1,
1385 VEX_W_0F53_P_0,
1386 VEX_W_0F53_P_1,
1387 VEX_W_0F58_P_0,
1388 VEX_W_0F58_P_1,
1389 VEX_W_0F58_P_2,
1390 VEX_W_0F58_P_3,
1391 VEX_W_0F59_P_0,
1392 VEX_W_0F59_P_1,
1393 VEX_W_0F59_P_2,
1394 VEX_W_0F59_P_3,
1395 VEX_W_0F5A_P_0,
1396 VEX_W_0F5A_P_1,
1397 VEX_W_0F5A_P_3,
1398 VEX_W_0F5B_P_0,
1399 VEX_W_0F5B_P_1,
1400 VEX_W_0F5B_P_2,
1401 VEX_W_0F5C_P_0,
1402 VEX_W_0F5C_P_1,
1403 VEX_W_0F5C_P_2,
1404 VEX_W_0F5C_P_3,
1405 VEX_W_0F5D_P_0,
1406 VEX_W_0F5D_P_1,
1407 VEX_W_0F5D_P_2,
1408 VEX_W_0F5D_P_3,
1409 VEX_W_0F5E_P_0,
1410 VEX_W_0F5E_P_1,
1411 VEX_W_0F5E_P_2,
1412 VEX_W_0F5E_P_3,
1413 VEX_W_0F5F_P_0,
1414 VEX_W_0F5F_P_1,
1415 VEX_W_0F5F_P_2,
1416 VEX_W_0F5F_P_3,
1417 VEX_W_0F60_P_2,
1418 VEX_W_0F61_P_2,
1419 VEX_W_0F62_P_2,
1420 VEX_W_0F63_P_2,
1421 VEX_W_0F64_P_2,
1422 VEX_W_0F65_P_2,
1423 VEX_W_0F66_P_2,
1424 VEX_W_0F67_P_2,
1425 VEX_W_0F68_P_2,
1426 VEX_W_0F69_P_2,
1427 VEX_W_0F6A_P_2,
1428 VEX_W_0F6B_P_2,
1429 VEX_W_0F6C_P_2,
1430 VEX_W_0F6D_P_2,
1431 VEX_W_0F6F_P_1,
1432 VEX_W_0F6F_P_2,
1433 VEX_W_0F70_P_1,
1434 VEX_W_0F70_P_2,
1435 VEX_W_0F70_P_3,
1436 VEX_W_0F71_R_2_P_2,
1437 VEX_W_0F71_R_4_P_2,
1438 VEX_W_0F71_R_6_P_2,
1439 VEX_W_0F72_R_2_P_2,
1440 VEX_W_0F72_R_4_P_2,
1441 VEX_W_0F72_R_6_P_2,
1442 VEX_W_0F73_R_2_P_2,
1443 VEX_W_0F73_R_3_P_2,
1444 VEX_W_0F73_R_6_P_2,
1445 VEX_W_0F73_R_7_P_2,
1446 VEX_W_0F74_P_2,
1447 VEX_W_0F75_P_2,
1448 VEX_W_0F76_P_2,
1449 VEX_W_0F77_P_0,
1450 VEX_W_0F7C_P_2,
1451 VEX_W_0F7C_P_3,
1452 VEX_W_0F7D_P_2,
1453 VEX_W_0F7D_P_3,
1454 VEX_W_0F7E_P_1,
1455 VEX_W_0F7F_P_1,
1456 VEX_W_0F7F_P_2,
1457 VEX_W_0FAE_R_2_M_0,
1458 VEX_W_0FAE_R_3_M_0,
1459 VEX_W_0FC2_P_0,
1460 VEX_W_0FC2_P_1,
1461 VEX_W_0FC2_P_2,
1462 VEX_W_0FC2_P_3,
1463 VEX_W_0FC4_P_2,
1464 VEX_W_0FC5_P_2,
1465 VEX_W_0FD0_P_2,
1466 VEX_W_0FD0_P_3,
1467 VEX_W_0FD1_P_2,
1468 VEX_W_0FD2_P_2,
1469 VEX_W_0FD3_P_2,
1470 VEX_W_0FD4_P_2,
1471 VEX_W_0FD5_P_2,
1472 VEX_W_0FD6_P_2,
1473 VEX_W_0FD7_P_2_M_1,
1474 VEX_W_0FD8_P_2,
1475 VEX_W_0FD9_P_2,
1476 VEX_W_0FDA_P_2,
1477 VEX_W_0FDB_P_2,
1478 VEX_W_0FDC_P_2,
1479 VEX_W_0FDD_P_2,
1480 VEX_W_0FDE_P_2,
1481 VEX_W_0FDF_P_2,
1482 VEX_W_0FE0_P_2,
1483 VEX_W_0FE1_P_2,
1484 VEX_W_0FE2_P_2,
1485 VEX_W_0FE3_P_2,
1486 VEX_W_0FE4_P_2,
1487 VEX_W_0FE5_P_2,
1488 VEX_W_0FE6_P_1,
1489 VEX_W_0FE6_P_2,
1490 VEX_W_0FE6_P_3,
1491 VEX_W_0FE7_P_2_M_0,
1492 VEX_W_0FE8_P_2,
1493 VEX_W_0FE9_P_2,
1494 VEX_W_0FEA_P_2,
1495 VEX_W_0FEB_P_2,
1496 VEX_W_0FEC_P_2,
1497 VEX_W_0FED_P_2,
1498 VEX_W_0FEE_P_2,
1499 VEX_W_0FEF_P_2,
1500 VEX_W_0FF0_P_3_M_0,
1501 VEX_W_0FF1_P_2,
1502 VEX_W_0FF2_P_2,
1503 VEX_W_0FF3_P_2,
1504 VEX_W_0FF4_P_2,
1505 VEX_W_0FF5_P_2,
1506 VEX_W_0FF6_P_2,
1507 VEX_W_0FF7_P_2,
1508 VEX_W_0FF8_P_2,
1509 VEX_W_0FF9_P_2,
1510 VEX_W_0FFA_P_2,
1511 VEX_W_0FFB_P_2,
1512 VEX_W_0FFC_P_2,
1513 VEX_W_0FFD_P_2,
1514 VEX_W_0FFE_P_2,
1515 VEX_W_0F3800_P_2,
1516 VEX_W_0F3801_P_2,
1517 VEX_W_0F3802_P_2,
1518 VEX_W_0F3803_P_2,
1519 VEX_W_0F3804_P_2,
1520 VEX_W_0F3805_P_2,
1521 VEX_W_0F3806_P_2,
1522 VEX_W_0F3807_P_2,
1523 VEX_W_0F3808_P_2,
1524 VEX_W_0F3809_P_2,
1525 VEX_W_0F380A_P_2,
1526 VEX_W_0F380B_P_2,
1527 VEX_W_0F380C_P_2,
1528 VEX_W_0F380D_P_2,
1529 VEX_W_0F380E_P_2,
1530 VEX_W_0F380F_P_2,
1531 VEX_W_0F3817_P_2,
1532 VEX_W_0F3818_P_2_M_0,
1533 VEX_W_0F3819_P_2_M_0,
1534 VEX_W_0F381A_P_2_M_0,
1535 VEX_W_0F381C_P_2,
1536 VEX_W_0F381D_P_2,
1537 VEX_W_0F381E_P_2,
1538 VEX_W_0F3820_P_2,
1539 VEX_W_0F3821_P_2,
1540 VEX_W_0F3822_P_2,
1541 VEX_W_0F3823_P_2,
1542 VEX_W_0F3824_P_2,
1543 VEX_W_0F3825_P_2,
1544 VEX_W_0F3828_P_2,
1545 VEX_W_0F3829_P_2,
1546 VEX_W_0F382A_P_2_M_0,
1547 VEX_W_0F382B_P_2,
1548 VEX_W_0F382C_P_2_M_0,
1549 VEX_W_0F382D_P_2_M_0,
1550 VEX_W_0F382E_P_2_M_0,
1551 VEX_W_0F382F_P_2_M_0,
1552 VEX_W_0F3830_P_2,
1553 VEX_W_0F3831_P_2,
1554 VEX_W_0F3832_P_2,
1555 VEX_W_0F3833_P_2,
1556 VEX_W_0F3834_P_2,
1557 VEX_W_0F3835_P_2,
1558 VEX_W_0F3837_P_2,
1559 VEX_W_0F3838_P_2,
1560 VEX_W_0F3839_P_2,
1561 VEX_W_0F383A_P_2,
1562 VEX_W_0F383B_P_2,
1563 VEX_W_0F383C_P_2,
1564 VEX_W_0F383D_P_2,
1565 VEX_W_0F383E_P_2,
1566 VEX_W_0F383F_P_2,
1567 VEX_W_0F3840_P_2,
1568 VEX_W_0F3841_P_2,
1569 VEX_W_0F38DB_P_2,
1570 VEX_W_0F38DC_P_2,
1571 VEX_W_0F38DD_P_2,
1572 VEX_W_0F38DE_P_2,
1573 VEX_W_0F38DF_P_2,
1574 VEX_W_0F3A04_P_2,
1575 VEX_W_0F3A05_P_2,
1576 VEX_W_0F3A06_P_2,
1577 VEX_W_0F3A08_P_2,
1578 VEX_W_0F3A09_P_2,
1579 VEX_W_0F3A0A_P_2,
1580 VEX_W_0F3A0B_P_2,
1581 VEX_W_0F3A0C_P_2,
1582 VEX_W_0F3A0D_P_2,
1583 VEX_W_0F3A0E_P_2,
1584 VEX_W_0F3A0F_P_2,
1585 VEX_W_0F3A14_P_2,
1586 VEX_W_0F3A15_P_2,
1587 VEX_W_0F3A18_P_2,
1588 VEX_W_0F3A19_P_2,
1589 VEX_W_0F3A20_P_2,
1590 VEX_W_0F3A21_P_2,
1591 VEX_W_0F3A40_P_2,
1592 VEX_W_0F3A41_P_2,
1593 VEX_W_0F3A42_P_2,
1594 VEX_W_0F3A44_P_2,
1595 VEX_W_0F3A48_P_2,
1596 VEX_W_0F3A49_P_2,
1597 VEX_W_0F3A4A_P_2,
1598 VEX_W_0F3A4B_P_2,
1599 VEX_W_0F3A4C_P_2,
1600 VEX_W_0F3A60_P_2,
1601 VEX_W_0F3A61_P_2,
1602 VEX_W_0F3A62_P_2,
1603 VEX_W_0F3A63_P_2,
1604 VEX_W_0F3ADF_P_2
1607 typedef void (*op_rtn) (int bytemode, int sizeflag);
1609 struct dis386 {
1610 const char *name;
1611 struct
1613 op_rtn rtn;
1614 int bytemode;
1615 } op[MAX_OPERANDS];
1618 /* Upper case letters in the instruction names here are macros.
1619 'A' => print 'b' if no register operands or suffix_always is true
1620 'B' => print 'b' if suffix_always is true
1621 'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
1622 size prefix
1623 'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
1624 suffix_always is true
1625 'E' => print 'e' if 32-bit form of jcxz
1626 'F' => print 'w' or 'l' depending on address size prefix (loop insns)
1627 'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
1628 'H' => print ",pt" or ",pn" branch hint
1629 'I' => honor following macro letter even in Intel mode (implemented only
1630 for some of the macro letters)
1631 'J' => print 'l'
1632 'K' => print 'd' or 'q' if rex prefix is present.
1633 'L' => print 'l' if suffix_always is true
1634 'M' => print 'r' if intel_mnemonic is false.
1635 'N' => print 'n' if instruction has no wait "prefix"
1636 'O' => print 'd' or 'o' (or 'q' in Intel mode)
1637 'P' => print 'w', 'l' or 'q' if instruction has an operand size prefix,
1638 or suffix_always is true. print 'q' if rex prefix is present.
1639 'Q' => print 'w', 'l' or 'q' for memory operand or suffix_always
1640 is true
1641 'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
1642 'S' => print 'w', 'l' or 'q' if suffix_always is true
1643 'T' => print 'q' in 64bit mode and behave as 'P' otherwise
1644 'U' => print 'q' in 64bit mode and behave as 'Q' otherwise
1645 'V' => print 'q' in 64bit mode and behave as 'S' otherwise
1646 'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
1647 'X' => print 's', 'd' depending on data16 prefix (for XMM)
1648 'Y' => 'q' if instruction has an REX 64bit overwrite prefix and
1649 suffix_always is true.
1650 'Z' => print 'q' in 64bit mode and behave as 'L' otherwise
1651 '!' => change condition from true to false or from false to true.
1652 '%' => add 1 upper case letter to the macro.
1654 2 upper case letter macros:
1655 "XY" => print 'x' or 'y' if no register operands or suffix_always
1656 is true.
1657 "XW" => print 's', 'd' depending on the VEX.W bit (for FMA)
1658 "LQ" => print 'l' ('d' in Intel mode) or 'q' for memory operand
1659 or suffix_always is true
1660 "LB" => print "abs" in 64bit mode and behave as 'B' otherwise
1661 "LS" => print "abs" in 64bit mode and behave as 'S' otherwise
1662 "LV" => print "abs" for 64bit operand and behave as 'S' otherwise
1664 Many of the above letters print nothing in Intel mode. See "putop"
1665 for the details.
1667 Braces '{' and '}', and vertical bars '|', indicate alternative
1668 mnemonic strings for AT&T and Intel. */
1670 static const struct dis386 dis386[] = {
1671 /* 00 */
1672 { "addB", { Eb, Gb } },
1673 { "addS", { Ev, Gv } },
1674 { "addB", { Gb, EbS } },
1675 { "addS", { Gv, EvS } },
1676 { "addB", { AL, Ib } },
1677 { "addS", { eAX, Iv } },
1678 { X86_64_TABLE (X86_64_06) },
1679 { X86_64_TABLE (X86_64_07) },
1680 /* 08 */
1681 { "orB", { Eb, Gb } },
1682 { "orS", { Ev, Gv } },
1683 { "orB", { Gb, EbS } },
1684 { "orS", { Gv, EvS } },
1685 { "orB", { AL, Ib } },
1686 { "orS", { eAX, Iv } },
1687 { X86_64_TABLE (X86_64_0D) },
1688 { Bad_Opcode }, /* 0x0f extended opcode escape */
1689 /* 10 */
1690 { "adcB", { Eb, Gb } },
1691 { "adcS", { Ev, Gv } },
1692 { "adcB", { Gb, EbS } },
1693 { "adcS", { Gv, EvS } },
1694 { "adcB", { AL, Ib } },
1695 { "adcS", { eAX, Iv } },
1696 { X86_64_TABLE (X86_64_16) },
1697 { X86_64_TABLE (X86_64_17) },
1698 /* 18 */
1699 { "sbbB", { Eb, Gb } },
1700 { "sbbS", { Ev, Gv } },
1701 { "sbbB", { Gb, EbS } },
1702 { "sbbS", { Gv, EvS } },
1703 { "sbbB", { AL, Ib } },
1704 { "sbbS", { eAX, Iv } },
1705 { X86_64_TABLE (X86_64_1E) },
1706 { X86_64_TABLE (X86_64_1F) },
1707 /* 20 */
1708 { "andB", { Eb, Gb } },
1709 { "andS", { Ev, Gv } },
1710 { "andB", { Gb, EbS } },
1711 { "andS", { Gv, EvS } },
1712 { "andB", { AL, Ib } },
1713 { "andS", { eAX, Iv } },
1714 { Bad_Opcode }, /* SEG ES prefix */
1715 { X86_64_TABLE (X86_64_27) },
1716 /* 28 */
1717 { "subB", { Eb, Gb } },
1718 { "subS", { Ev, Gv } },
1719 { "subB", { Gb, EbS } },
1720 { "subS", { Gv, EvS } },
1721 { "subB", { AL, Ib } },
1722 { "subS", { eAX, Iv } },
1723 { Bad_Opcode }, /* SEG CS prefix */
1724 { X86_64_TABLE (X86_64_2F) },
1725 /* 30 */
1726 { "xorB", { Eb, Gb } },
1727 { "xorS", { Ev, Gv } },
1728 { "xorB", { Gb, EbS } },
1729 { "xorS", { Gv, EvS } },
1730 { "xorB", { AL, Ib } },
1731 { "xorS", { eAX, Iv } },
1732 { Bad_Opcode }, /* SEG SS prefix */
1733 { X86_64_TABLE (X86_64_37) },
1734 /* 38 */
1735 { "cmpB", { Eb, Gb } },
1736 { "cmpS", { Ev, Gv } },
1737 { "cmpB", { Gb, EbS } },
1738 { "cmpS", { Gv, EvS } },
1739 { "cmpB", { AL, Ib } },
1740 { "cmpS", { eAX, Iv } },
1741 { Bad_Opcode }, /* SEG DS prefix */
1742 { X86_64_TABLE (X86_64_3F) },
1743 /* 40 */
1744 { "inc{S|}", { RMeAX } },
1745 { "inc{S|}", { RMeCX } },
1746 { "inc{S|}", { RMeDX } },
1747 { "inc{S|}", { RMeBX } },
1748 { "inc{S|}", { RMeSP } },
1749 { "inc{S|}", { RMeBP } },
1750 { "inc{S|}", { RMeSI } },
1751 { "inc{S|}", { RMeDI } },
1752 /* 48 */
1753 { "dec{S|}", { RMeAX } },
1754 { "dec{S|}", { RMeCX } },
1755 { "dec{S|}", { RMeDX } },
1756 { "dec{S|}", { RMeBX } },
1757 { "dec{S|}", { RMeSP } },
1758 { "dec{S|}", { RMeBP } },
1759 { "dec{S|}", { RMeSI } },
1760 { "dec{S|}", { RMeDI } },
1761 /* 50 */
1762 { "pushV", { RMrAX } },
1763 { "pushV", { RMrCX } },
1764 { "pushV", { RMrDX } },
1765 { "pushV", { RMrBX } },
1766 { "pushV", { RMrSP } },
1767 { "pushV", { RMrBP } },
1768 { "pushV", { RMrSI } },
1769 { "pushV", { RMrDI } },
1770 /* 58 */
1771 { "popV", { RMrAX } },
1772 { "popV", { RMrCX } },
1773 { "popV", { RMrDX } },
1774 { "popV", { RMrBX } },
1775 { "popV", { RMrSP } },
1776 { "popV", { RMrBP } },
1777 { "popV", { RMrSI } },
1778 { "popV", { RMrDI } },
1779 /* 60 */
1780 { X86_64_TABLE (X86_64_60) },
1781 { X86_64_TABLE (X86_64_61) },
1782 { X86_64_TABLE (X86_64_62) },
1783 { X86_64_TABLE (X86_64_63) },
1784 { Bad_Opcode }, /* seg fs */
1785 { Bad_Opcode }, /* seg gs */
1786 { Bad_Opcode }, /* op size prefix */
1787 { Bad_Opcode }, /* adr size prefix */
1788 /* 68 */
1789 { "pushT", { sIv } },
1790 { "imulS", { Gv, Ev, Iv } },
1791 { "pushT", { sIb } },
1792 { "imulS", { Gv, Ev, sIb } },
1793 { "ins{b|}", { Ybr, indirDX } },
1794 { X86_64_TABLE (X86_64_6D) },
1795 { "outs{b|}", { indirDXr, Xb } },
1796 { X86_64_TABLE (X86_64_6F) },
1797 /* 70 */
1798 { "joH", { Jb, XX, cond_jump_flag } },
1799 { "jnoH", { Jb, XX, cond_jump_flag } },
1800 { "jbH", { Jb, XX, cond_jump_flag } },
1801 { "jaeH", { Jb, XX, cond_jump_flag } },
1802 { "jeH", { Jb, XX, cond_jump_flag } },
1803 { "jneH", { Jb, XX, cond_jump_flag } },
1804 { "jbeH", { Jb, XX, cond_jump_flag } },
1805 { "jaH", { Jb, XX, cond_jump_flag } },
1806 /* 78 */
1807 { "jsH", { Jb, XX, cond_jump_flag } },
1808 { "jnsH", { Jb, XX, cond_jump_flag } },
1809 { "jpH", { Jb, XX, cond_jump_flag } },
1810 { "jnpH", { Jb, XX, cond_jump_flag } },
1811 { "jlH", { Jb, XX, cond_jump_flag } },
1812 { "jgeH", { Jb, XX, cond_jump_flag } },
1813 { "jleH", { Jb, XX, cond_jump_flag } },
1814 { "jgH", { Jb, XX, cond_jump_flag } },
1815 /* 80 */
1816 { REG_TABLE (REG_80) },
1817 { REG_TABLE (REG_81) },
1818 { Bad_Opcode },
1819 { REG_TABLE (REG_82) },
1820 { "testB", { Eb, Gb } },
1821 { "testS", { Ev, Gv } },
1822 { "xchgB", { Eb, Gb } },
1823 { "xchgS", { Ev, Gv } },
1824 /* 88 */
1825 { "movB", { Eb, Gb } },
1826 { "movS", { Ev, Gv } },
1827 { "movB", { Gb, EbS } },
1828 { "movS", { Gv, EvS } },
1829 { "movD", { Sv, Sw } },
1830 { MOD_TABLE (MOD_8D) },
1831 { "movD", { Sw, Sv } },
1832 { REG_TABLE (REG_8F) },
1833 /* 90 */
1834 { PREFIX_TABLE (PREFIX_90) },
1835 { "xchgS", { RMeCX, eAX } },
1836 { "xchgS", { RMeDX, eAX } },
1837 { "xchgS", { RMeBX, eAX } },
1838 { "xchgS", { RMeSP, eAX } },
1839 { "xchgS", { RMeBP, eAX } },
1840 { "xchgS", { RMeSI, eAX } },
1841 { "xchgS", { RMeDI, eAX } },
1842 /* 98 */
1843 { "cW{t|}R", { XX } },
1844 { "cR{t|}O", { XX } },
1845 { X86_64_TABLE (X86_64_9A) },
1846 { Bad_Opcode }, /* fwait */
1847 { "pushfT", { XX } },
1848 { "popfT", { XX } },
1849 { "sahf", { XX } },
1850 { "lahf", { XX } },
1851 /* a0 */
1852 { "mov%LB", { AL, Ob } },
1853 { "mov%LS", { eAX, Ov } },
1854 { "mov%LB", { Ob, AL } },
1855 { "mov%LS", { Ov, eAX } },
1856 { "movs{b|}", { Ybr, Xb } },
1857 { "movs{R|}", { Yvr, Xv } },
1858 { "cmps{b|}", { Xb, Yb } },
1859 { "cmps{R|}", { Xv, Yv } },
1860 /* a8 */
1861 { "testB", { AL, Ib } },
1862 { "testS", { eAX, Iv } },
1863 { "stosB", { Ybr, AL } },
1864 { "stosS", { Yvr, eAX } },
1865 { "lodsB", { ALr, Xb } },
1866 { "lodsS", { eAXr, Xv } },
1867 { "scasB", { AL, Yb } },
1868 { "scasS", { eAX, Yv } },
1869 /* b0 */
1870 { "movB", { RMAL, Ib } },
1871 { "movB", { RMCL, Ib } },
1872 { "movB", { RMDL, Ib } },
1873 { "movB", { RMBL, Ib } },
1874 { "movB", { RMAH, Ib } },
1875 { "movB", { RMCH, Ib } },
1876 { "movB", { RMDH, Ib } },
1877 { "movB", { RMBH, Ib } },
1878 /* b8 */
1879 { "mov%LV", { RMeAX, Iv64 } },
1880 { "mov%LV", { RMeCX, Iv64 } },
1881 { "mov%LV", { RMeDX, Iv64 } },
1882 { "mov%LV", { RMeBX, Iv64 } },
1883 { "mov%LV", { RMeSP, Iv64 } },
1884 { "mov%LV", { RMeBP, Iv64 } },
1885 { "mov%LV", { RMeSI, Iv64 } },
1886 { "mov%LV", { RMeDI, Iv64 } },
1887 /* c0 */
1888 { REG_TABLE (REG_C0) },
1889 { REG_TABLE (REG_C1) },
1890 { "retT", { Iw } },
1891 { "retT", { XX } },
1892 { X86_64_TABLE (X86_64_C4) },
1893 { X86_64_TABLE (X86_64_C5) },
1894 { REG_TABLE (REG_C6) },
1895 { REG_TABLE (REG_C7) },
1896 /* c8 */
1897 { "enterT", { Iw, Ib } },
1898 { "leaveT", { XX } },
1899 { "Jret{|f}P", { Iw } },
1900 { "Jret{|f}P", { XX } },
1901 { "int3", { XX } },
1902 { "int", { Ib } },
1903 { X86_64_TABLE (X86_64_CE) },
1904 { "iretP", { XX } },
1905 /* d0 */
1906 { REG_TABLE (REG_D0) },
1907 { REG_TABLE (REG_D1) },
1908 { REG_TABLE (REG_D2) },
1909 { REG_TABLE (REG_D3) },
1910 { X86_64_TABLE (X86_64_D4) },
1911 { X86_64_TABLE (X86_64_D5) },
1912 { Bad_Opcode },
1913 { "xlat", { DSBX } },
1914 /* d8 */
1915 { FLOAT },
1916 { FLOAT },
1917 { FLOAT },
1918 { FLOAT },
1919 { FLOAT },
1920 { FLOAT },
1921 { FLOAT },
1922 { FLOAT },
1923 /* e0 */
1924 { "loopneFH", { Jb, XX, loop_jcxz_flag } },
1925 { "loopeFH", { Jb, XX, loop_jcxz_flag } },
1926 { "loopFH", { Jb, XX, loop_jcxz_flag } },
1927 { "jEcxzH", { Jb, XX, loop_jcxz_flag } },
1928 { "inB", { AL, Ib } },
1929 { "inG", { zAX, Ib } },
1930 { "outB", { Ib, AL } },
1931 { "outG", { Ib, zAX } },
1932 /* e8 */
1933 { "callT", { Jv } },
1934 { "jmpT", { Jv } },
1935 { X86_64_TABLE (X86_64_EA) },
1936 { "jmp", { Jb } },
1937 { "inB", { AL, indirDX } },
1938 { "inG", { zAX, indirDX } },
1939 { "outB", { indirDX, AL } },
1940 { "outG", { indirDX, zAX } },
1941 /* f0 */
1942 { Bad_Opcode }, /* lock prefix */
1943 { "icebp", { XX } },
1944 { Bad_Opcode }, /* repne */
1945 { Bad_Opcode }, /* repz */
1946 { "hlt", { XX } },
1947 { "cmc", { XX } },
1948 { REG_TABLE (REG_F6) },
1949 { REG_TABLE (REG_F7) },
1950 /* f8 */
1951 { "clc", { XX } },
1952 { "stc", { XX } },
1953 { "cli", { XX } },
1954 { "sti", { XX } },
1955 { "cld", { XX } },
1956 { "std", { XX } },
1957 { REG_TABLE (REG_FE) },
1958 { REG_TABLE (REG_FF) },
1961 static const struct dis386 dis386_twobyte[] = {
1962 /* 00 */
1963 { REG_TABLE (REG_0F00 ) },
1964 { REG_TABLE (REG_0F01 ) },
1965 { "larS", { Gv, Ew } },
1966 { "lslS", { Gv, Ew } },
1967 { Bad_Opcode },
1968 { "syscall", { XX } },
1969 { "clts", { XX } },
1970 { "sysretP", { XX } },
1971 /* 08 */
1972 { "invd", { XX } },
1973 { "wbinvd", { XX } },
1974 { Bad_Opcode },
1975 { "ud2", { XX } },
1976 { Bad_Opcode },
1977 { REG_TABLE (REG_0F0D) },
1978 { "femms", { XX } },
1979 { "", { MX, EM, OPSUF } }, /* See OP_3DNowSuffix. */
1980 /* 10 */
1981 { PREFIX_TABLE (PREFIX_0F10) },
1982 { PREFIX_TABLE (PREFIX_0F11) },
1983 { PREFIX_TABLE (PREFIX_0F12) },
1984 { MOD_TABLE (MOD_0F13) },
1985 { "unpcklpX", { XM, EXx } },
1986 { "unpckhpX", { XM, EXx } },
1987 { PREFIX_TABLE (PREFIX_0F16) },
1988 { MOD_TABLE (MOD_0F17) },
1989 /* 18 */
1990 { REG_TABLE (REG_0F18) },
1991 { "nopQ", { Ev } },
1992 { "nopQ", { Ev } },
1993 { "nopQ", { Ev } },
1994 { "nopQ", { Ev } },
1995 { "nopQ", { Ev } },
1996 { "nopQ", { Ev } },
1997 { "nopQ", { Ev } },
1998 /* 20 */
1999 { MOD_TABLE (MOD_0F20) },
2000 { MOD_TABLE (MOD_0F21) },
2001 { MOD_TABLE (MOD_0F22) },
2002 { MOD_TABLE (MOD_0F23) },
2003 { MOD_TABLE (MOD_0F24) },
2004 { Bad_Opcode },
2005 { MOD_TABLE (MOD_0F26) },
2006 { Bad_Opcode },
2007 /* 28 */
2008 { "movapX", { XM, EXx } },
2009 { "movapX", { EXxS, XM } },
2010 { PREFIX_TABLE (PREFIX_0F2A) },
2011 { PREFIX_TABLE (PREFIX_0F2B) },
2012 { PREFIX_TABLE (PREFIX_0F2C) },
2013 { PREFIX_TABLE (PREFIX_0F2D) },
2014 { PREFIX_TABLE (PREFIX_0F2E) },
2015 { PREFIX_TABLE (PREFIX_0F2F) },
2016 /* 30 */
2017 { "wrmsr", { XX } },
2018 { "rdtsc", { XX } },
2019 { "rdmsr", { XX } },
2020 { "rdpmc", { XX } },
2021 { "sysenter", { XX } },
2022 { "sysexit", { XX } },
2023 { Bad_Opcode },
2024 { "getsec", { XX } },
2025 /* 38 */
2026 { THREE_BYTE_TABLE (THREE_BYTE_0F38) },
2027 { Bad_Opcode },
2028 { THREE_BYTE_TABLE (THREE_BYTE_0F3A) },
2029 { Bad_Opcode },
2030 { Bad_Opcode },
2031 { Bad_Opcode },
2032 { Bad_Opcode },
2033 { Bad_Opcode },
2034 /* 40 */
2035 { "cmovoS", { Gv, Ev } },
2036 { "cmovnoS", { Gv, Ev } },
2037 { "cmovbS", { Gv, Ev } },
2038 { "cmovaeS", { Gv, Ev } },
2039 { "cmoveS", { Gv, Ev } },
2040 { "cmovneS", { Gv, Ev } },
2041 { "cmovbeS", { Gv, Ev } },
2042 { "cmovaS", { Gv, Ev } },
2043 /* 48 */
2044 { "cmovsS", { Gv, Ev } },
2045 { "cmovnsS", { Gv, Ev } },
2046 { "cmovpS", { Gv, Ev } },
2047 { "cmovnpS", { Gv, Ev } },
2048 { "cmovlS", { Gv, Ev } },
2049 { "cmovgeS", { Gv, Ev } },
2050 { "cmovleS", { Gv, Ev } },
2051 { "cmovgS", { Gv, Ev } },
2052 /* 50 */
2053 { MOD_TABLE (MOD_0F51) },
2054 { PREFIX_TABLE (PREFIX_0F51) },
2055 { PREFIX_TABLE (PREFIX_0F52) },
2056 { PREFIX_TABLE (PREFIX_0F53) },
2057 { "andpX", { XM, EXx } },
2058 { "andnpX", { XM, EXx } },
2059 { "orpX", { XM, EXx } },
2060 { "xorpX", { XM, EXx } },
2061 /* 58 */
2062 { PREFIX_TABLE (PREFIX_0F58) },
2063 { PREFIX_TABLE (PREFIX_0F59) },
2064 { PREFIX_TABLE (PREFIX_0F5A) },
2065 { PREFIX_TABLE (PREFIX_0F5B) },
2066 { PREFIX_TABLE (PREFIX_0F5C) },
2067 { PREFIX_TABLE (PREFIX_0F5D) },
2068 { PREFIX_TABLE (PREFIX_0F5E) },
2069 { PREFIX_TABLE (PREFIX_0F5F) },
2070 /* 60 */
2071 { PREFIX_TABLE (PREFIX_0F60) },
2072 { PREFIX_TABLE (PREFIX_0F61) },
2073 { PREFIX_TABLE (PREFIX_0F62) },
2074 { "packsswb", { MX, EM } },
2075 { "pcmpgtb", { MX, EM } },
2076 { "pcmpgtw", { MX, EM } },
2077 { "pcmpgtd", { MX, EM } },
2078 { "packuswb", { MX, EM } },
2079 /* 68 */
2080 { "punpckhbw", { MX, EM } },
2081 { "punpckhwd", { MX, EM } },
2082 { "punpckhdq", { MX, EM } },
2083 { "packssdw", { MX, EM } },
2084 { PREFIX_TABLE (PREFIX_0F6C) },
2085 { PREFIX_TABLE (PREFIX_0F6D) },
2086 { "movK", { MX, Edq } },
2087 { PREFIX_TABLE (PREFIX_0F6F) },
2088 /* 70 */
2089 { PREFIX_TABLE (PREFIX_0F70) },
2090 { REG_TABLE (REG_0F71) },
2091 { REG_TABLE (REG_0F72) },
2092 { REG_TABLE (REG_0F73) },
2093 { "pcmpeqb", { MX, EM } },
2094 { "pcmpeqw", { MX, EM } },
2095 { "pcmpeqd", { MX, EM } },
2096 { "emms", { XX } },
2097 /* 78 */
2098 { PREFIX_TABLE (PREFIX_0F78) },
2099 { PREFIX_TABLE (PREFIX_0F79) },
2100 { THREE_BYTE_TABLE (THREE_BYTE_0F7A) },
2101 { Bad_Opcode },
2102 { PREFIX_TABLE (PREFIX_0F7C) },
2103 { PREFIX_TABLE (PREFIX_0F7D) },
2104 { PREFIX_TABLE (PREFIX_0F7E) },
2105 { PREFIX_TABLE (PREFIX_0F7F) },
2106 /* 80 */
2107 { "joH", { Jv, XX, cond_jump_flag } },
2108 { "jnoH", { Jv, XX, cond_jump_flag } },
2109 { "jbH", { Jv, XX, cond_jump_flag } },
2110 { "jaeH", { Jv, XX, cond_jump_flag } },
2111 { "jeH", { Jv, XX, cond_jump_flag } },
2112 { "jneH", { Jv, XX, cond_jump_flag } },
2113 { "jbeH", { Jv, XX, cond_jump_flag } },
2114 { "jaH", { Jv, XX, cond_jump_flag } },
2115 /* 88 */
2116 { "jsH", { Jv, XX, cond_jump_flag } },
2117 { "jnsH", { Jv, XX, cond_jump_flag } },
2118 { "jpH", { Jv, XX, cond_jump_flag } },
2119 { "jnpH", { Jv, XX, cond_jump_flag } },
2120 { "jlH", { Jv, XX, cond_jump_flag } },
2121 { "jgeH", { Jv, XX, cond_jump_flag } },
2122 { "jleH", { Jv, XX, cond_jump_flag } },
2123 { "jgH", { Jv, XX, cond_jump_flag } },
2124 /* 90 */
2125 { "seto", { Eb } },
2126 { "setno", { Eb } },
2127 { "setb", { Eb } },
2128 { "setae", { Eb } },
2129 { "sete", { Eb } },
2130 { "setne", { Eb } },
2131 { "setbe", { Eb } },
2132 { "seta", { Eb } },
2133 /* 98 */
2134 { "sets", { Eb } },
2135 { "setns", { Eb } },
2136 { "setp", { Eb } },
2137 { "setnp", { Eb } },
2138 { "setl", { Eb } },
2139 { "setge", { Eb } },
2140 { "setle", { Eb } },
2141 { "setg", { Eb } },
2142 /* a0 */
2143 { "pushT", { fs } },
2144 { "popT", { fs } },
2145 { "cpuid", { XX } },
2146 { "btS", { Ev, Gv } },
2147 { "shldS", { Ev, Gv, Ib } },
2148 { "shldS", { Ev, Gv, CL } },
2149 { REG_TABLE (REG_0FA6) },
2150 { REG_TABLE (REG_0FA7) },
2151 /* a8 */
2152 { "pushT", { gs } },
2153 { "popT", { gs } },
2154 { "rsm", { XX } },
2155 { "btsS", { Ev, Gv } },
2156 { "shrdS", { Ev, Gv, Ib } },
2157 { "shrdS", { Ev, Gv, CL } },
2158 { REG_TABLE (REG_0FAE) },
2159 { "imulS", { Gv, Ev } },
2160 /* b0 */
2161 { "cmpxchgB", { Eb, Gb } },
2162 { "cmpxchgS", { Ev, Gv } },
2163 { MOD_TABLE (MOD_0FB2) },
2164 { "btrS", { Ev, Gv } },
2165 { MOD_TABLE (MOD_0FB4) },
2166 { MOD_TABLE (MOD_0FB5) },
2167 { "movz{bR|x}", { Gv, Eb } },
2168 { "movz{wR|x}", { Gv, Ew } }, /* yes, there really is movzww ! */
2169 /* b8 */
2170 { PREFIX_TABLE (PREFIX_0FB8) },
2171 { "ud1", { XX } },
2172 { REG_TABLE (REG_0FBA) },
2173 { "btcS", { Ev, Gv } },
2174 { PREFIX_TABLE (PREFIX_0FBC) },
2175 { PREFIX_TABLE (PREFIX_0FBD) },
2176 { "movs{bR|x}", { Gv, Eb } },
2177 { "movs{wR|x}", { Gv, Ew } }, /* yes, there really is movsww ! */
2178 /* c0 */
2179 { "xaddB", { Eb, Gb } },
2180 { "xaddS", { Ev, Gv } },
2181 { PREFIX_TABLE (PREFIX_0FC2) },
2182 { PREFIX_TABLE (PREFIX_0FC3) },
2183 { "pinsrw", { MX, Edqw, Ib } },
2184 { "pextrw", { Gdq, MS, Ib } },
2185 { "shufpX", { XM, EXx, Ib } },
2186 { REG_TABLE (REG_0FC7) },
2187 /* c8 */
2188 { "bswap", { RMeAX } },
2189 { "bswap", { RMeCX } },
2190 { "bswap", { RMeDX } },
2191 { "bswap", { RMeBX } },
2192 { "bswap", { RMeSP } },
2193 { "bswap", { RMeBP } },
2194 { "bswap", { RMeSI } },
2195 { "bswap", { RMeDI } },
2196 /* d0 */
2197 { PREFIX_TABLE (PREFIX_0FD0) },
2198 { "psrlw", { MX, EM } },
2199 { "psrld", { MX, EM } },
2200 { "psrlq", { MX, EM } },
2201 { "paddq", { MX, EM } },
2202 { "pmullw", { MX, EM } },
2203 { PREFIX_TABLE (PREFIX_0FD6) },
2204 { MOD_TABLE (MOD_0FD7) },
2205 /* d8 */
2206 { "psubusb", { MX, EM } },
2207 { "psubusw", { MX, EM } },
2208 { "pminub", { MX, EM } },
2209 { "pand", { MX, EM } },
2210 { "paddusb", { MX, EM } },
2211 { "paddusw", { MX, EM } },
2212 { "pmaxub", { MX, EM } },
2213 { "pandn", { MX, EM } },
2214 /* e0 */
2215 { "pavgb", { MX, EM } },
2216 { "psraw", { MX, EM } },
2217 { "psrad", { MX, EM } },
2218 { "pavgw", { MX, EM } },
2219 { "pmulhuw", { MX, EM } },
2220 { "pmulhw", { MX, EM } },
2221 { PREFIX_TABLE (PREFIX_0FE6) },
2222 { PREFIX_TABLE (PREFIX_0FE7) },
2223 /* e8 */
2224 { "psubsb", { MX, EM } },
2225 { "psubsw", { MX, EM } },
2226 { "pminsw", { MX, EM } },
2227 { "por", { MX, EM } },
2228 { "paddsb", { MX, EM } },
2229 { "paddsw", { MX, EM } },
2230 { "pmaxsw", { MX, EM } },
2231 { "pxor", { MX, EM } },
2232 /* f0 */
2233 { PREFIX_TABLE (PREFIX_0FF0) },
2234 { "psllw", { MX, EM } },
2235 { "pslld", { MX, EM } },
2236 { "psllq", { MX, EM } },
2237 { "pmuludq", { MX, EM } },
2238 { "pmaddwd", { MX, EM } },
2239 { "psadbw", { MX, EM } },
2240 { PREFIX_TABLE (PREFIX_0FF7) },
2241 /* f8 */
2242 { "psubb", { MX, EM } },
2243 { "psubw", { MX, EM } },
2244 { "psubd", { MX, EM } },
2245 { "psubq", { MX, EM } },
2246 { "paddb", { MX, EM } },
2247 { "paddw", { MX, EM } },
2248 { "paddd", { MX, EM } },
2249 { Bad_Opcode },
2252 static const unsigned char onebyte_has_modrm[256] = {
2253 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2254 /* ------------------------------- */
2255 /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
2256 /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
2257 /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
2258 /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
2259 /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
2260 /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
2261 /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
2262 /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
2263 /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
2264 /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
2265 /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
2266 /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
2267 /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
2268 /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
2269 /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
2270 /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1 /* f0 */
2271 /* ------------------------------- */
2272 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2275 static const unsigned char twobyte_has_modrm[256] = {
2276 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2277 /* ------------------------------- */
2278 /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
2279 /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
2280 /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
2281 /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
2282 /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
2283 /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
2284 /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
2285 /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
2286 /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
2287 /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
2288 /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
2289 /* b0 */ 1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1, /* bf */
2290 /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
2291 /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
2292 /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
2293 /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0 /* ff */
2294 /* ------------------------------- */
2295 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2298 static char obuf[100];
2299 static char *obufp;
2300 static char *mnemonicendp;
2301 static char scratchbuf[100];
2302 static unsigned char *start_codep;
2303 static unsigned char *insn_codep;
2304 static unsigned char *codep;
2305 static int last_lock_prefix;
2306 static int last_repz_prefix;
2307 static int last_repnz_prefix;
2308 static int last_data_prefix;
2309 static int last_addr_prefix;
2310 static int last_rex_prefix;
2311 static int last_seg_prefix;
2312 #define MAX_CODE_LENGTH 15
2313 /* We can up to 14 prefixes since the maximum instruction length is
2314 15bytes. */
2315 static int all_prefixes[MAX_CODE_LENGTH - 1];
2316 static disassemble_info *the_info;
2317 static struct
2319 int mod;
2320 int reg;
2321 int rm;
2323 modrm;
2324 static unsigned char need_modrm;
2325 static struct
2327 int scale;
2328 int index;
2329 int base;
2331 sib;
2332 static struct
2334 int register_specifier;
2335 int length;
2336 int prefix;
2337 int w;
2339 vex;
2340 static unsigned char need_vex;
2341 static unsigned char need_vex_reg;
2342 static unsigned char vex_w_done;
2344 struct op
2346 const char *name;
2347 unsigned int len;
2350 /* If we are accessing mod/rm/reg without need_modrm set, then the
2351 values are stale. Hitting this abort likely indicates that you
2352 need to update onebyte_has_modrm or twobyte_has_modrm. */
2353 #define MODRM_CHECK if (!need_modrm) abort ()
2355 static const char **names64;
2356 static const char **names32;
2357 static const char **names16;
2358 static const char **names8;
2359 static const char **names8rex;
2360 static const char **names_seg;
2361 static const char *index64;
2362 static const char *index32;
2363 static const char **index16;
2365 static const char *intel_names64[] = {
2366 "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
2367 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2369 static const char *intel_names32[] = {
2370 "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
2371 "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
2373 static const char *intel_names16[] = {
2374 "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
2375 "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
2377 static const char *intel_names8[] = {
2378 "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
2380 static const char *intel_names8rex[] = {
2381 "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
2382 "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
2384 static const char *intel_names_seg[] = {
2385 "es", "cs", "ss", "ds", "fs", "gs", "?", "?",
2387 static const char *intel_index64 = "riz";
2388 static const char *intel_index32 = "eiz";
2389 static const char *intel_index16[] = {
2390 "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
2393 static const char *att_names64[] = {
2394 "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
2395 "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
2397 static const char *att_names32[] = {
2398 "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
2399 "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
2401 static const char *att_names16[] = {
2402 "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
2403 "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
2405 static const char *att_names8[] = {
2406 "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
2408 static const char *att_names8rex[] = {
2409 "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
2410 "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
2412 static const char *att_names_seg[] = {
2413 "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
2415 static const char *att_index64 = "%riz";
2416 static const char *att_index32 = "%eiz";
2417 static const char *att_index16[] = {
2418 "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
2421 static const char **names_mm;
2422 static const char *intel_names_mm[] = {
2423 "mm0", "mm1", "mm2", "mm3",
2424 "mm4", "mm5", "mm6", "mm7"
2426 static const char *att_names_mm[] = {
2427 "%mm0", "%mm1", "%mm2", "%mm3",
2428 "%mm4", "%mm5", "%mm6", "%mm7"
2431 static const char **names_xmm;
2432 static const char *intel_names_xmm[] = {
2433 "xmm0", "xmm1", "xmm2", "xmm3",
2434 "xmm4", "xmm5", "xmm6", "xmm7",
2435 "xmm8", "xmm9", "xmm10", "xmm11",
2436 "xmm12", "xmm13", "xmm14", "xmm15"
2438 static const char *att_names_xmm[] = {
2439 "%xmm0", "%xmm1", "%xmm2", "%xmm3",
2440 "%xmm4", "%xmm5", "%xmm6", "%xmm7",
2441 "%xmm8", "%xmm9", "%xmm10", "%xmm11",
2442 "%xmm12", "%xmm13", "%xmm14", "%xmm15"
2445 static const char **names_ymm;
2446 static const char *intel_names_ymm[] = {
2447 "ymm0", "ymm1", "ymm2", "ymm3",
2448 "ymm4", "ymm5", "ymm6", "ymm7",
2449 "ymm8", "ymm9", "ymm10", "ymm11",
2450 "ymm12", "ymm13", "ymm14", "ymm15"
2452 static const char *att_names_ymm[] = {
2453 "%ymm0", "%ymm1", "%ymm2", "%ymm3",
2454 "%ymm4", "%ymm5", "%ymm6", "%ymm7",
2455 "%ymm8", "%ymm9", "%ymm10", "%ymm11",
2456 "%ymm12", "%ymm13", "%ymm14", "%ymm15"
2459 static const struct dis386 reg_table[][8] = {
2460 /* REG_80 */
2462 { "addA", { Eb, Ib } },
2463 { "orA", { Eb, Ib } },
2464 { "adcA", { Eb, Ib } },
2465 { "sbbA", { Eb, Ib } },
2466 { "andA", { Eb, Ib } },
2467 { "subA", { Eb, Ib } },
2468 { "xorA", { Eb, Ib } },
2469 { "cmpA", { Eb, Ib } },
2471 /* REG_81 */
2473 { "addQ", { Ev, Iv } },
2474 { "orQ", { Ev, Iv } },
2475 { "adcQ", { Ev, Iv } },
2476 { "sbbQ", { Ev, Iv } },
2477 { "andQ", { Ev, Iv } },
2478 { "subQ", { Ev, Iv } },
2479 { "xorQ", { Ev, Iv } },
2480 { "cmpQ", { Ev, Iv } },
2482 /* REG_82 */
2484 { "addQ", { Ev, sIb } },
2485 { "orQ", { Ev, sIb } },
2486 { "adcQ", { Ev, sIb } },
2487 { "sbbQ", { Ev, sIb } },
2488 { "andQ", { Ev, sIb } },
2489 { "subQ", { Ev, sIb } },
2490 { "xorQ", { Ev, sIb } },
2491 { "cmpQ", { Ev, sIb } },
2493 /* REG_8F */
2495 { "popU", { stackEv } },
2496 { XOP_8F_TABLE (XOP_09) },
2497 { Bad_Opcode },
2498 { Bad_Opcode },
2499 { Bad_Opcode },
2500 { XOP_8F_TABLE (XOP_09) },
2502 /* REG_C0 */
2504 { "rolA", { Eb, Ib } },
2505 { "rorA", { Eb, Ib } },
2506 { "rclA", { Eb, Ib } },
2507 { "rcrA", { Eb, Ib } },
2508 { "shlA", { Eb, Ib } },
2509 { "shrA", { Eb, Ib } },
2510 { Bad_Opcode },
2511 { "sarA", { Eb, Ib } },
2513 /* REG_C1 */
2515 { "rolQ", { Ev, Ib } },
2516 { "rorQ", { Ev, Ib } },
2517 { "rclQ", { Ev, Ib } },
2518 { "rcrQ", { Ev, Ib } },
2519 { "shlQ", { Ev, Ib } },
2520 { "shrQ", { Ev, Ib } },
2521 { Bad_Opcode },
2522 { "sarQ", { Ev, Ib } },
2524 /* REG_C6 */
2526 { "movA", { Eb, Ib } },
2528 /* REG_C7 */
2530 { "movQ", { Ev, Iv } },
2532 /* REG_D0 */
2534 { "rolA", { Eb, I1 } },
2535 { "rorA", { Eb, I1 } },
2536 { "rclA", { Eb, I1 } },
2537 { "rcrA", { Eb, I1 } },
2538 { "shlA", { Eb, I1 } },
2539 { "shrA", { Eb, I1 } },
2540 { Bad_Opcode },
2541 { "sarA", { Eb, I1 } },
2543 /* REG_D1 */
2545 { "rolQ", { Ev, I1 } },
2546 { "rorQ", { Ev, I1 } },
2547 { "rclQ", { Ev, I1 } },
2548 { "rcrQ", { Ev, I1 } },
2549 { "shlQ", { Ev, I1 } },
2550 { "shrQ", { Ev, I1 } },
2551 { Bad_Opcode },
2552 { "sarQ", { Ev, I1 } },
2554 /* REG_D2 */
2556 { "rolA", { Eb, CL } },
2557 { "rorA", { Eb, CL } },
2558 { "rclA", { Eb, CL } },
2559 { "rcrA", { Eb, CL } },
2560 { "shlA", { Eb, CL } },
2561 { "shrA", { Eb, CL } },
2562 { Bad_Opcode },
2563 { "sarA", { Eb, CL } },
2565 /* REG_D3 */
2567 { "rolQ", { Ev, CL } },
2568 { "rorQ", { Ev, CL } },
2569 { "rclQ", { Ev, CL } },
2570 { "rcrQ", { Ev, CL } },
2571 { "shlQ", { Ev, CL } },
2572 { "shrQ", { Ev, CL } },
2573 { Bad_Opcode },
2574 { "sarQ", { Ev, CL } },
2576 /* REG_F6 */
2578 { "testA", { Eb, Ib } },
2579 { Bad_Opcode },
2580 { "notA", { Eb } },
2581 { "negA", { Eb } },
2582 { "mulA", { Eb } }, /* Don't print the implicit %al register, */
2583 { "imulA", { Eb } }, /* to distinguish these opcodes from other */
2584 { "divA", { Eb } }, /* mul/imul opcodes. Do the same for div */
2585 { "idivA", { Eb } }, /* and idiv for consistency. */
2587 /* REG_F7 */
2589 { "testQ", { Ev, Iv } },
2590 { Bad_Opcode },
2591 { "notQ", { Ev } },
2592 { "negQ", { Ev } },
2593 { "mulQ", { Ev } }, /* Don't print the implicit register. */
2594 { "imulQ", { Ev } },
2595 { "divQ", { Ev } },
2596 { "idivQ", { Ev } },
2598 /* REG_FE */
2600 { "incA", { Eb } },
2601 { "decA", { Eb } },
2603 /* REG_FF */
2605 { "incQ", { Ev } },
2606 { "decQ", { Ev } },
2607 { "call{T|}", { indirEv } },
2608 { "Jcall{T|}", { indirEp } },
2609 { "jmp{T|}", { indirEv } },
2610 { "Jjmp{T|}", { indirEp } },
2611 { "pushU", { stackEv } },
2612 { Bad_Opcode },
2614 /* REG_0F00 */
2616 { "sldtD", { Sv } },
2617 { "strD", { Sv } },
2618 { "lldt", { Ew } },
2619 { "ltr", { Ew } },
2620 { "verr", { Ew } },
2621 { "verw", { Ew } },
2622 { Bad_Opcode },
2623 { Bad_Opcode },
2625 /* REG_0F01 */
2627 { MOD_TABLE (MOD_0F01_REG_0) },
2628 { MOD_TABLE (MOD_0F01_REG_1) },
2629 { MOD_TABLE (MOD_0F01_REG_2) },
2630 { MOD_TABLE (MOD_0F01_REG_3) },
2631 { "smswD", { Sv } },
2632 { Bad_Opcode },
2633 { "lmsw", { Ew } },
2634 { MOD_TABLE (MOD_0F01_REG_7) },
2636 /* REG_0F0D */
2638 { "prefetch", { Mb } },
2639 { "prefetchw", { Mb } },
2641 /* REG_0F18 */
2643 { MOD_TABLE (MOD_0F18_REG_0) },
2644 { MOD_TABLE (MOD_0F18_REG_1) },
2645 { MOD_TABLE (MOD_0F18_REG_2) },
2646 { MOD_TABLE (MOD_0F18_REG_3) },
2648 /* REG_0F71 */
2650 { Bad_Opcode },
2651 { Bad_Opcode },
2652 { MOD_TABLE (MOD_0F71_REG_2) },
2653 { Bad_Opcode },
2654 { MOD_TABLE (MOD_0F71_REG_4) },
2655 { Bad_Opcode },
2656 { MOD_TABLE (MOD_0F71_REG_6) },
2658 /* REG_0F72 */
2660 { Bad_Opcode },
2661 { Bad_Opcode },
2662 { MOD_TABLE (MOD_0F72_REG_2) },
2663 { Bad_Opcode },
2664 { MOD_TABLE (MOD_0F72_REG_4) },
2665 { Bad_Opcode },
2666 { MOD_TABLE (MOD_0F72_REG_6) },
2668 /* REG_0F73 */
2670 { Bad_Opcode },
2671 { Bad_Opcode },
2672 { MOD_TABLE (MOD_0F73_REG_2) },
2673 { MOD_TABLE (MOD_0F73_REG_3) },
2674 { Bad_Opcode },
2675 { Bad_Opcode },
2676 { MOD_TABLE (MOD_0F73_REG_6) },
2677 { MOD_TABLE (MOD_0F73_REG_7) },
2679 /* REG_0FA6 */
2681 { "montmul", { { OP_0f07, 0 } } },
2682 { "xsha1", { { OP_0f07, 0 } } },
2683 { "xsha256", { { OP_0f07, 0 } } },
2685 /* REG_0FA7 */
2687 { "xstore-rng", { { OP_0f07, 0 } } },
2688 { "xcrypt-ecb", { { OP_0f07, 0 } } },
2689 { "xcrypt-cbc", { { OP_0f07, 0 } } },
2690 { "xcrypt-ctr", { { OP_0f07, 0 } } },
2691 { "xcrypt-cfb", { { OP_0f07, 0 } } },
2692 { "xcrypt-ofb", { { OP_0f07, 0 } } },
2694 /* REG_0FAE */
2696 { MOD_TABLE (MOD_0FAE_REG_0) },
2697 { MOD_TABLE (MOD_0FAE_REG_1) },
2698 { MOD_TABLE (MOD_0FAE_REG_2) },
2699 { MOD_TABLE (MOD_0FAE_REG_3) },
2700 { MOD_TABLE (MOD_0FAE_REG_4) },
2701 { MOD_TABLE (MOD_0FAE_REG_5) },
2702 { MOD_TABLE (MOD_0FAE_REG_6) },
2703 { MOD_TABLE (MOD_0FAE_REG_7) },
2705 /* REG_0FBA */
2707 { Bad_Opcode },
2708 { Bad_Opcode },
2709 { Bad_Opcode },
2710 { Bad_Opcode },
2711 { "btQ", { Ev, Ib } },
2712 { "btsQ", { Ev, Ib } },
2713 { "btrQ", { Ev, Ib } },
2714 { "btcQ", { Ev, Ib } },
2716 /* REG_0FC7 */
2718 { Bad_Opcode },
2719 { "cmpxchg8b", { { CMPXCHG8B_Fixup, q_mode } } },
2720 { Bad_Opcode },
2721 { Bad_Opcode },
2722 { Bad_Opcode },
2723 { Bad_Opcode },
2724 { MOD_TABLE (MOD_0FC7_REG_6) },
2725 { MOD_TABLE (MOD_0FC7_REG_7) },
2727 /* REG_VEX_0F71 */
2729 { Bad_Opcode },
2730 { Bad_Opcode },
2731 { MOD_TABLE (MOD_VEX_0F71_REG_2) },
2732 { Bad_Opcode },
2733 { MOD_TABLE (MOD_VEX_0F71_REG_4) },
2734 { Bad_Opcode },
2735 { MOD_TABLE (MOD_VEX_0F71_REG_6) },
2737 /* REG_VEX_0F72 */
2739 { Bad_Opcode },
2740 { Bad_Opcode },
2741 { MOD_TABLE (MOD_VEX_0F72_REG_2) },
2742 { Bad_Opcode },
2743 { MOD_TABLE (MOD_VEX_0F72_REG_4) },
2744 { Bad_Opcode },
2745 { MOD_TABLE (MOD_VEX_0F72_REG_6) },
2747 /* REG_VEX_0F73 */
2749 { Bad_Opcode },
2750 { Bad_Opcode },
2751 { MOD_TABLE (MOD_VEX_0F73_REG_2) },
2752 { MOD_TABLE (MOD_VEX_0F73_REG_3) },
2753 { Bad_Opcode },
2754 { Bad_Opcode },
2755 { MOD_TABLE (MOD_VEX_0F73_REG_6) },
2756 { MOD_TABLE (MOD_VEX_0F73_REG_7) },
2758 /* REG_VEX_0FAE */
2760 { Bad_Opcode },
2761 { Bad_Opcode },
2762 { MOD_TABLE (MOD_VEX_0FAE_REG_2) },
2763 { MOD_TABLE (MOD_VEX_0FAE_REG_3) },
2765 /* REG_VEX_0F38F3 */
2767 { Bad_Opcode },
2768 { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_1) },
2769 { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_2) },
2770 { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_3) },
2772 /* REG_XOP_LWPCB */
2774 { "llwpcb", { { OP_LWPCB_E, 0 } } },
2775 { "slwpcb", { { OP_LWPCB_E, 0 } } },
2777 /* REG_XOP_LWP */
2779 { "lwpins", { { OP_LWP_E, 0 }, Ed, Iq } },
2780 { "lwpval", { { OP_LWP_E, 0 }, Ed, Iq } },
2784 static const struct dis386 prefix_table[][4] = {
2785 /* PREFIX_90 */
2787 { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } } },
2788 { "pause", { XX } },
2789 { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } } },
2792 /* PREFIX_0F10 */
2794 { "movups", { XM, EXx } },
2795 { "movss", { XM, EXd } },
2796 { "movupd", { XM, EXx } },
2797 { "movsd", { XM, EXq } },
2800 /* PREFIX_0F11 */
2802 { "movups", { EXxS, XM } },
2803 { "movss", { EXdS, XM } },
2804 { "movupd", { EXxS, XM } },
2805 { "movsd", { EXqS, XM } },
2808 /* PREFIX_0F12 */
2810 { MOD_TABLE (MOD_0F12_PREFIX_0) },
2811 { "movsldup", { XM, EXx } },
2812 { "movlpd", { XM, EXq } },
2813 { "movddup", { XM, EXq } },
2816 /* PREFIX_0F16 */
2818 { MOD_TABLE (MOD_0F16_PREFIX_0) },
2819 { "movshdup", { XM, EXx } },
2820 { "movhpd", { XM, EXq } },
2823 /* PREFIX_0F2A */
2825 { "cvtpi2ps", { XM, EMCq } },
2826 { "cvtsi2ss%LQ", { XM, Ev } },
2827 { "cvtpi2pd", { XM, EMCq } },
2828 { "cvtsi2sd%LQ", { XM, Ev } },
2831 /* PREFIX_0F2B */
2833 { MOD_TABLE (MOD_0F2B_PREFIX_0) },
2834 { MOD_TABLE (MOD_0F2B_PREFIX_1) },
2835 { MOD_TABLE (MOD_0F2B_PREFIX_2) },
2836 { MOD_TABLE (MOD_0F2B_PREFIX_3) },
2839 /* PREFIX_0F2C */
2841 { "cvttps2pi", { MXC, EXq } },
2842 { "cvttss2siY", { Gv, EXd } },
2843 { "cvttpd2pi", { MXC, EXx } },
2844 { "cvttsd2siY", { Gv, EXq } },
2847 /* PREFIX_0F2D */
2849 { "cvtps2pi", { MXC, EXq } },
2850 { "cvtss2siY", { Gv, EXd } },
2851 { "cvtpd2pi", { MXC, EXx } },
2852 { "cvtsd2siY", { Gv, EXq } },
2855 /* PREFIX_0F2E */
2857 { "ucomiss",{ XM, EXd } },
2858 { Bad_Opcode },
2859 { "ucomisd",{ XM, EXq } },
2862 /* PREFIX_0F2F */
2864 { "comiss", { XM, EXd } },
2865 { Bad_Opcode },
2866 { "comisd", { XM, EXq } },
2869 /* PREFIX_0F51 */
2871 { "sqrtps", { XM, EXx } },
2872 { "sqrtss", { XM, EXd } },
2873 { "sqrtpd", { XM, EXx } },
2874 { "sqrtsd", { XM, EXq } },
2877 /* PREFIX_0F52 */
2879 { "rsqrtps",{ XM, EXx } },
2880 { "rsqrtss",{ XM, EXd } },
2883 /* PREFIX_0F53 */
2885 { "rcpps", { XM, EXx } },
2886 { "rcpss", { XM, EXd } },
2889 /* PREFIX_0F58 */
2891 { "addps", { XM, EXx } },
2892 { "addss", { XM, EXd } },
2893 { "addpd", { XM, EXx } },
2894 { "addsd", { XM, EXq } },
2897 /* PREFIX_0F59 */
2899 { "mulps", { XM, EXx } },
2900 { "mulss", { XM, EXd } },
2901 { "mulpd", { XM, EXx } },
2902 { "mulsd", { XM, EXq } },
2905 /* PREFIX_0F5A */
2907 { "cvtps2pd", { XM, EXq } },
2908 { "cvtss2sd", { XM, EXd } },
2909 { "cvtpd2ps", { XM, EXx } },
2910 { "cvtsd2ss", { XM, EXq } },
2913 /* PREFIX_0F5B */
2915 { "cvtdq2ps", { XM, EXx } },
2916 { "cvttps2dq", { XM, EXx } },
2917 { "cvtps2dq", { XM, EXx } },
2920 /* PREFIX_0F5C */
2922 { "subps", { XM, EXx } },
2923 { "subss", { XM, EXd } },
2924 { "subpd", { XM, EXx } },
2925 { "subsd", { XM, EXq } },
2928 /* PREFIX_0F5D */
2930 { "minps", { XM, EXx } },
2931 { "minss", { XM, EXd } },
2932 { "minpd", { XM, EXx } },
2933 { "minsd", { XM, EXq } },
2936 /* PREFIX_0F5E */
2938 { "divps", { XM, EXx } },
2939 { "divss", { XM, EXd } },
2940 { "divpd", { XM, EXx } },
2941 { "divsd", { XM, EXq } },
2944 /* PREFIX_0F5F */
2946 { "maxps", { XM, EXx } },
2947 { "maxss", { XM, EXd } },
2948 { "maxpd", { XM, EXx } },
2949 { "maxsd", { XM, EXq } },
2952 /* PREFIX_0F60 */
2954 { "punpcklbw",{ MX, EMd } },
2955 { Bad_Opcode },
2956 { "punpcklbw",{ MX, EMx } },
2959 /* PREFIX_0F61 */
2961 { "punpcklwd",{ MX, EMd } },
2962 { Bad_Opcode },
2963 { "punpcklwd",{ MX, EMx } },
2966 /* PREFIX_0F62 */
2968 { "punpckldq",{ MX, EMd } },
2969 { Bad_Opcode },
2970 { "punpckldq",{ MX, EMx } },
2973 /* PREFIX_0F6C */
2975 { Bad_Opcode },
2976 { Bad_Opcode },
2977 { "punpcklqdq", { XM, EXx } },
2980 /* PREFIX_0F6D */
2982 { Bad_Opcode },
2983 { Bad_Opcode },
2984 { "punpckhqdq", { XM, EXx } },
2987 /* PREFIX_0F6F */
2989 { "movq", { MX, EM } },
2990 { "movdqu", { XM, EXx } },
2991 { "movdqa", { XM, EXx } },
2994 /* PREFIX_0F70 */
2996 { "pshufw", { MX, EM, Ib } },
2997 { "pshufhw",{ XM, EXx, Ib } },
2998 { "pshufd", { XM, EXx, Ib } },
2999 { "pshuflw",{ XM, EXx, Ib } },
3002 /* PREFIX_0F73_REG_3 */
3004 { Bad_Opcode },
3005 { Bad_Opcode },
3006 { "psrldq", { XS, Ib } },
3009 /* PREFIX_0F73_REG_7 */
3011 { Bad_Opcode },
3012 { Bad_Opcode },
3013 { "pslldq", { XS, Ib } },
3016 /* PREFIX_0F78 */
3018 {"vmread", { Em, Gm } },
3019 { Bad_Opcode },
3020 {"extrq", { XS, Ib, Ib } },
3021 {"insertq", { XM, XS, Ib, Ib } },
3024 /* PREFIX_0F79 */
3026 {"vmwrite", { Gm, Em } },
3027 { Bad_Opcode },
3028 {"extrq", { XM, XS } },
3029 {"insertq", { XM, XS } },
3032 /* PREFIX_0F7C */
3034 { Bad_Opcode },
3035 { Bad_Opcode },
3036 { "haddpd", { XM, EXx } },
3037 { "haddps", { XM, EXx } },
3040 /* PREFIX_0F7D */
3042 { Bad_Opcode },
3043 { Bad_Opcode },
3044 { "hsubpd", { XM, EXx } },
3045 { "hsubps", { XM, EXx } },
3048 /* PREFIX_0F7E */
3050 { "movK", { Edq, MX } },
3051 { "movq", { XM, EXq } },
3052 { "movK", { Edq, XM } },
3055 /* PREFIX_0F7F */
3057 { "movq", { EMS, MX } },
3058 { "movdqu", { EXxS, XM } },
3059 { "movdqa", { EXxS, XM } },
3062 /* PREFIX_0FAE_REG_0 */
3064 { Bad_Opcode },
3065 { "rdfsbase", { Ev } },
3068 /* PREFIX_0FAE_REG_1 */
3070 { Bad_Opcode },
3071 { "rdgsbase", { Ev } },
3074 /* PREFIX_0FAE_REG_2 */
3076 { Bad_Opcode },
3077 { "wrfsbase", { Ev } },
3080 /* PREFIX_0FAE_REG_3 */
3082 { Bad_Opcode },
3083 { "wrgsbase", { Ev } },
3086 /* PREFIX_0FB8 */
3088 { Bad_Opcode },
3089 { "popcntS", { Gv, Ev } },
3092 /* PREFIX_0FBC */
3094 { "bsfS", { Gv, Ev } },
3095 { "tzcntS", { Gv, Ev } },
3096 { "bsfS", { Gv, Ev } },
3099 /* PREFIX_0FBD */
3101 { "bsrS", { Gv, Ev } },
3102 { "lzcntS", { Gv, Ev } },
3103 { "bsrS", { Gv, Ev } },
3106 /* PREFIX_0FC2 */
3108 { "cmpps", { XM, EXx, CMP } },
3109 { "cmpss", { XM, EXd, CMP } },
3110 { "cmppd", { XM, EXx, CMP } },
3111 { "cmpsd", { XM, EXq, CMP } },
3114 /* PREFIX_0FC3 */
3116 { "movntiS", { Ma, Gv } },
3119 /* PREFIX_0FC7_REG_6 */
3121 { "vmptrld",{ Mq } },
3122 { "vmxon", { Mq } },
3123 { "vmclear",{ Mq } },
3126 /* PREFIX_0FD0 */
3128 { Bad_Opcode },
3129 { Bad_Opcode },
3130 { "addsubpd", { XM, EXx } },
3131 { "addsubps", { XM, EXx } },
3134 /* PREFIX_0FD6 */
3136 { Bad_Opcode },
3137 { "movq2dq",{ XM, MS } },
3138 { "movq", { EXqS, XM } },
3139 { "movdq2q",{ MX, XS } },
3142 /* PREFIX_0FE6 */
3144 { Bad_Opcode },
3145 { "cvtdq2pd", { XM, EXq } },
3146 { "cvttpd2dq", { XM, EXx } },
3147 { "cvtpd2dq", { XM, EXx } },
3150 /* PREFIX_0FE7 */
3152 { "movntq", { Mq, MX } },
3153 { Bad_Opcode },
3154 { MOD_TABLE (MOD_0FE7_PREFIX_2) },
3157 /* PREFIX_0FF0 */
3159 { Bad_Opcode },
3160 { Bad_Opcode },
3161 { Bad_Opcode },
3162 { MOD_TABLE (MOD_0FF0_PREFIX_3) },
3165 /* PREFIX_0FF7 */
3167 { "maskmovq", { MX, MS } },
3168 { Bad_Opcode },
3169 { "maskmovdqu", { XM, XS } },
3172 /* PREFIX_0F3810 */
3174 { Bad_Opcode },
3175 { Bad_Opcode },
3176 { "pblendvb", { XM, EXx, XMM0 } },
3179 /* PREFIX_0F3814 */
3181 { Bad_Opcode },
3182 { Bad_Opcode },
3183 { "blendvps", { XM, EXx, XMM0 } },
3186 /* PREFIX_0F3815 */
3188 { Bad_Opcode },
3189 { Bad_Opcode },
3190 { "blendvpd", { XM, EXx, XMM0 } },
3193 /* PREFIX_0F3817 */
3195 { Bad_Opcode },
3196 { Bad_Opcode },
3197 { "ptest", { XM, EXx } },
3200 /* PREFIX_0F3820 */
3202 { Bad_Opcode },
3203 { Bad_Opcode },
3204 { "pmovsxbw", { XM, EXq } },
3207 /* PREFIX_0F3821 */
3209 { Bad_Opcode },
3210 { Bad_Opcode },
3211 { "pmovsxbd", { XM, EXd } },
3214 /* PREFIX_0F3822 */
3216 { Bad_Opcode },
3217 { Bad_Opcode },
3218 { "pmovsxbq", { XM, EXw } },
3221 /* PREFIX_0F3823 */
3223 { Bad_Opcode },
3224 { Bad_Opcode },
3225 { "pmovsxwd", { XM, EXq } },
3228 /* PREFIX_0F3824 */
3230 { Bad_Opcode },
3231 { Bad_Opcode },
3232 { "pmovsxwq", { XM, EXd } },
3235 /* PREFIX_0F3825 */
3237 { Bad_Opcode },
3238 { Bad_Opcode },
3239 { "pmovsxdq", { XM, EXq } },
3242 /* PREFIX_0F3828 */
3244 { Bad_Opcode },
3245 { Bad_Opcode },
3246 { "pmuldq", { XM, EXx } },
3249 /* PREFIX_0F3829 */
3251 { Bad_Opcode },
3252 { Bad_Opcode },
3253 { "pcmpeqq", { XM, EXx } },
3256 /* PREFIX_0F382A */
3258 { Bad_Opcode },
3259 { Bad_Opcode },
3260 { MOD_TABLE (MOD_0F382A_PREFIX_2) },
3263 /* PREFIX_0F382B */
3265 { Bad_Opcode },
3266 { Bad_Opcode },
3267 { "packusdw", { XM, EXx } },
3270 /* PREFIX_0F3830 */
3272 { Bad_Opcode },
3273 { Bad_Opcode },
3274 { "pmovzxbw", { XM, EXq } },
3277 /* PREFIX_0F3831 */
3279 { Bad_Opcode },
3280 { Bad_Opcode },
3281 { "pmovzxbd", { XM, EXd } },
3284 /* PREFIX_0F3832 */
3286 { Bad_Opcode },
3287 { Bad_Opcode },
3288 { "pmovzxbq", { XM, EXw } },
3291 /* PREFIX_0F3833 */
3293 { Bad_Opcode },
3294 { Bad_Opcode },
3295 { "pmovzxwd", { XM, EXq } },
3298 /* PREFIX_0F3834 */
3300 { Bad_Opcode },
3301 { Bad_Opcode },
3302 { "pmovzxwq", { XM, EXd } },
3305 /* PREFIX_0F3835 */
3307 { Bad_Opcode },
3308 { Bad_Opcode },
3309 { "pmovzxdq", { XM, EXq } },
3312 /* PREFIX_0F3837 */
3314 { Bad_Opcode },
3315 { Bad_Opcode },
3316 { "pcmpgtq", { XM, EXx } },
3319 /* PREFIX_0F3838 */
3321 { Bad_Opcode },
3322 { Bad_Opcode },
3323 { "pminsb", { XM, EXx } },
3326 /* PREFIX_0F3839 */
3328 { Bad_Opcode },
3329 { Bad_Opcode },
3330 { "pminsd", { XM, EXx } },
3333 /* PREFIX_0F383A */
3335 { Bad_Opcode },
3336 { Bad_Opcode },
3337 { "pminuw", { XM, EXx } },
3340 /* PREFIX_0F383B */
3342 { Bad_Opcode },
3343 { Bad_Opcode },
3344 { "pminud", { XM, EXx } },
3347 /* PREFIX_0F383C */
3349 { Bad_Opcode },
3350 { Bad_Opcode },
3351 { "pmaxsb", { XM, EXx } },
3354 /* PREFIX_0F383D */
3356 { Bad_Opcode },
3357 { Bad_Opcode },
3358 { "pmaxsd", { XM, EXx } },
3361 /* PREFIX_0F383E */
3363 { Bad_Opcode },
3364 { Bad_Opcode },
3365 { "pmaxuw", { XM, EXx } },
3368 /* PREFIX_0F383F */
3370 { Bad_Opcode },
3371 { Bad_Opcode },
3372 { "pmaxud", { XM, EXx } },
3375 /* PREFIX_0F3840 */
3377 { Bad_Opcode },
3378 { Bad_Opcode },
3379 { "pmulld", { XM, EXx } },
3382 /* PREFIX_0F3841 */
3384 { Bad_Opcode },
3385 { Bad_Opcode },
3386 { "phminposuw", { XM, EXx } },
3389 /* PREFIX_0F3880 */
3391 { Bad_Opcode },
3392 { Bad_Opcode },
3393 { "invept", { Gm, Mo } },
3396 /* PREFIX_0F3881 */
3398 { Bad_Opcode },
3399 { Bad_Opcode },
3400 { "invvpid", { Gm, Mo } },
3403 /* PREFIX_0F38DB */
3405 { Bad_Opcode },
3406 { Bad_Opcode },
3407 { "aesimc", { XM, EXx } },
3410 /* PREFIX_0F38DC */
3412 { Bad_Opcode },
3413 { Bad_Opcode },
3414 { "aesenc", { XM, EXx } },
3417 /* PREFIX_0F38DD */
3419 { Bad_Opcode },
3420 { Bad_Opcode },
3421 { "aesenclast", { XM, EXx } },
3424 /* PREFIX_0F38DE */
3426 { Bad_Opcode },
3427 { Bad_Opcode },
3428 { "aesdec", { XM, EXx } },
3431 /* PREFIX_0F38DF */
3433 { Bad_Opcode },
3434 { Bad_Opcode },
3435 { "aesdeclast", { XM, EXx } },
3438 /* PREFIX_0F38F0 */
3440 { "movbeS", { Gv, { MOVBE_Fixup, v_mode } } },
3441 { Bad_Opcode },
3442 { "movbeS", { Gv, { MOVBE_Fixup, v_mode } } },
3443 { "crc32", { Gdq, { CRC32_Fixup, b_mode } } },
3446 /* PREFIX_0F38F1 */
3448 { "movbeS", { { MOVBE_Fixup, v_mode }, Gv } },
3449 { Bad_Opcode },
3450 { "movbeS", { { MOVBE_Fixup, v_mode }, Gv } },
3451 { "crc32", { Gdq, { CRC32_Fixup, v_mode } } },
3454 /* PREFIX_0F3A08 */
3456 { Bad_Opcode },
3457 { Bad_Opcode },
3458 { "roundps", { XM, EXx, Ib } },
3461 /* PREFIX_0F3A09 */
3463 { Bad_Opcode },
3464 { Bad_Opcode },
3465 { "roundpd", { XM, EXx, Ib } },
3468 /* PREFIX_0F3A0A */
3470 { Bad_Opcode },
3471 { Bad_Opcode },
3472 { "roundss", { XM, EXd, Ib } },
3475 /* PREFIX_0F3A0B */
3477 { Bad_Opcode },
3478 { Bad_Opcode },
3479 { "roundsd", { XM, EXq, Ib } },
3482 /* PREFIX_0F3A0C */
3484 { Bad_Opcode },
3485 { Bad_Opcode },
3486 { "blendps", { XM, EXx, Ib } },
3489 /* PREFIX_0F3A0D */
3491 { Bad_Opcode },
3492 { Bad_Opcode },
3493 { "blendpd", { XM, EXx, Ib } },
3496 /* PREFIX_0F3A0E */
3498 { Bad_Opcode },
3499 { Bad_Opcode },
3500 { "pblendw", { XM, EXx, Ib } },
3503 /* PREFIX_0F3A14 */
3505 { Bad_Opcode },
3506 { Bad_Opcode },
3507 { "pextrb", { Edqb, XM, Ib } },
3510 /* PREFIX_0F3A15 */
3512 { Bad_Opcode },
3513 { Bad_Opcode },
3514 { "pextrw", { Edqw, XM, Ib } },
3517 /* PREFIX_0F3A16 */
3519 { Bad_Opcode },
3520 { Bad_Opcode },
3521 { "pextrK", { Edq, XM, Ib } },
3524 /* PREFIX_0F3A17 */
3526 { Bad_Opcode },
3527 { Bad_Opcode },
3528 { "extractps", { Edqd, XM, Ib } },
3531 /* PREFIX_0F3A20 */
3533 { Bad_Opcode },
3534 { Bad_Opcode },
3535 { "pinsrb", { XM, Edqb, Ib } },
3538 /* PREFIX_0F3A21 */
3540 { Bad_Opcode },
3541 { Bad_Opcode },
3542 { "insertps", { XM, EXd, Ib } },
3545 /* PREFIX_0F3A22 */
3547 { Bad_Opcode },
3548 { Bad_Opcode },
3549 { "pinsrK", { XM, Edq, Ib } },
3552 /* PREFIX_0F3A40 */
3554 { Bad_Opcode },
3555 { Bad_Opcode },
3556 { "dpps", { XM, EXx, Ib } },
3559 /* PREFIX_0F3A41 */
3561 { Bad_Opcode },
3562 { Bad_Opcode },
3563 { "dppd", { XM, EXx, Ib } },
3566 /* PREFIX_0F3A42 */
3568 { Bad_Opcode },
3569 { Bad_Opcode },
3570 { "mpsadbw", { XM, EXx, Ib } },
3573 /* PREFIX_0F3A44 */
3575 { Bad_Opcode },
3576 { Bad_Opcode },
3577 { "pclmulqdq", { XM, EXx, PCLMUL } },
3580 /* PREFIX_0F3A60 */
3582 { Bad_Opcode },
3583 { Bad_Opcode },
3584 { "pcmpestrm", { XM, EXx, Ib } },
3587 /* PREFIX_0F3A61 */
3589 { Bad_Opcode },
3590 { Bad_Opcode },
3591 { "pcmpestri", { XM, EXx, Ib } },
3594 /* PREFIX_0F3A62 */
3596 { Bad_Opcode },
3597 { Bad_Opcode },
3598 { "pcmpistrm", { XM, EXx, Ib } },
3601 /* PREFIX_0F3A63 */
3603 { Bad_Opcode },
3604 { Bad_Opcode },
3605 { "pcmpistri", { XM, EXx, Ib } },
3608 /* PREFIX_0F3ADF */
3610 { Bad_Opcode },
3611 { Bad_Opcode },
3612 { "aeskeygenassist", { XM, EXx, Ib } },
3615 /* PREFIX_VEX_0F10 */
3617 { VEX_W_TABLE (VEX_W_0F10_P_0) },
3618 { VEX_LEN_TABLE (VEX_LEN_0F10_P_1) },
3619 { VEX_W_TABLE (VEX_W_0F10_P_2) },
3620 { VEX_LEN_TABLE (VEX_LEN_0F10_P_3) },
3623 /* PREFIX_VEX_0F11 */
3625 { VEX_W_TABLE (VEX_W_0F11_P_0) },
3626 { VEX_LEN_TABLE (VEX_LEN_0F11_P_1) },
3627 { VEX_W_TABLE (VEX_W_0F11_P_2) },
3628 { VEX_LEN_TABLE (VEX_LEN_0F11_P_3) },
3631 /* PREFIX_VEX_0F12 */
3633 { MOD_TABLE (MOD_VEX_0F12_PREFIX_0) },
3634 { VEX_W_TABLE (VEX_W_0F12_P_1) },
3635 { VEX_LEN_TABLE (VEX_LEN_0F12_P_2) },
3636 { VEX_W_TABLE (VEX_W_0F12_P_3) },
3639 /* PREFIX_VEX_0F16 */
3641 { MOD_TABLE (MOD_VEX_0F16_PREFIX_0) },
3642 { VEX_W_TABLE (VEX_W_0F16_P_1) },
3643 { VEX_LEN_TABLE (VEX_LEN_0F16_P_2) },
3646 /* PREFIX_VEX_0F2A */
3648 { Bad_Opcode },
3649 { VEX_LEN_TABLE (VEX_LEN_0F2A_P_1) },
3650 { Bad_Opcode },
3651 { VEX_LEN_TABLE (VEX_LEN_0F2A_P_3) },
3654 /* PREFIX_VEX_0F2C */
3656 { Bad_Opcode },
3657 { VEX_LEN_TABLE (VEX_LEN_0F2C_P_1) },
3658 { Bad_Opcode },
3659 { VEX_LEN_TABLE (VEX_LEN_0F2C_P_3) },
3662 /* PREFIX_VEX_0F2D */
3664 { Bad_Opcode },
3665 { VEX_LEN_TABLE (VEX_LEN_0F2D_P_1) },
3666 { Bad_Opcode },
3667 { VEX_LEN_TABLE (VEX_LEN_0F2D_P_3) },
3670 /* PREFIX_VEX_0F2E */
3672 { VEX_LEN_TABLE (VEX_LEN_0F2E_P_0) },
3673 { Bad_Opcode },
3674 { VEX_LEN_TABLE (VEX_LEN_0F2E_P_2) },
3677 /* PREFIX_VEX_0F2F */
3679 { VEX_LEN_TABLE (VEX_LEN_0F2F_P_0) },
3680 { Bad_Opcode },
3681 { VEX_LEN_TABLE (VEX_LEN_0F2F_P_2) },
3684 /* PREFIX_VEX_0F51 */
3686 { VEX_W_TABLE (VEX_W_0F51_P_0) },
3687 { VEX_LEN_TABLE (VEX_LEN_0F51_P_1) },
3688 { VEX_W_TABLE (VEX_W_0F51_P_2) },
3689 { VEX_LEN_TABLE (VEX_LEN_0F51_P_3) },
3692 /* PREFIX_VEX_0F52 */
3694 { VEX_W_TABLE (VEX_W_0F52_P_0) },
3695 { VEX_LEN_TABLE (VEX_LEN_0F52_P_1) },
3698 /* PREFIX_VEX_0F53 */
3700 { VEX_W_TABLE (VEX_W_0F53_P_0) },
3701 { VEX_LEN_TABLE (VEX_LEN_0F53_P_1) },
3704 /* PREFIX_VEX_0F58 */
3706 { VEX_W_TABLE (VEX_W_0F58_P_0) },
3707 { VEX_LEN_TABLE (VEX_LEN_0F58_P_1) },
3708 { VEX_W_TABLE (VEX_W_0F58_P_2) },
3709 { VEX_LEN_TABLE (VEX_LEN_0F58_P_3) },
3712 /* PREFIX_VEX_0F59 */
3714 { VEX_W_TABLE (VEX_W_0F59_P_0) },
3715 { VEX_LEN_TABLE (VEX_LEN_0F59_P_1) },
3716 { VEX_W_TABLE (VEX_W_0F59_P_2) },
3717 { VEX_LEN_TABLE (VEX_LEN_0F59_P_3) },
3720 /* PREFIX_VEX_0F5A */
3722 { VEX_W_TABLE (VEX_W_0F5A_P_0) },
3723 { VEX_LEN_TABLE (VEX_LEN_0F5A_P_1) },
3724 { "vcvtpd2ps%XY", { XMM, EXx } },
3725 { VEX_LEN_TABLE (VEX_LEN_0F5A_P_3) },
3728 /* PREFIX_VEX_0F5B */
3730 { VEX_W_TABLE (VEX_W_0F5B_P_0) },
3731 { VEX_W_TABLE (VEX_W_0F5B_P_1) },
3732 { VEX_W_TABLE (VEX_W_0F5B_P_2) },
3735 /* PREFIX_VEX_0F5C */
3737 { VEX_W_TABLE (VEX_W_0F5C_P_0) },
3738 { VEX_LEN_TABLE (VEX_LEN_0F5C_P_1) },
3739 { VEX_W_TABLE (VEX_W_0F5C_P_2) },
3740 { VEX_LEN_TABLE (VEX_LEN_0F5C_P_3) },
3743 /* PREFIX_VEX_0F5D */
3745 { VEX_W_TABLE (VEX_W_0F5D_P_0) },
3746 { VEX_LEN_TABLE (VEX_LEN_0F5D_P_1) },
3747 { VEX_W_TABLE (VEX_W_0F5D_P_2) },
3748 { VEX_LEN_TABLE (VEX_LEN_0F5D_P_3) },
3751 /* PREFIX_VEX_0F5E */
3753 { VEX_W_TABLE (VEX_W_0F5E_P_0) },
3754 { VEX_LEN_TABLE (VEX_LEN_0F5E_P_1) },
3755 { VEX_W_TABLE (VEX_W_0F5E_P_2) },
3756 { VEX_LEN_TABLE (VEX_LEN_0F5E_P_3) },
3759 /* PREFIX_VEX_0F5F */
3761 { VEX_W_TABLE (VEX_W_0F5F_P_0) },
3762 { VEX_LEN_TABLE (VEX_LEN_0F5F_P_1) },
3763 { VEX_W_TABLE (VEX_W_0F5F_P_2) },
3764 { VEX_LEN_TABLE (VEX_LEN_0F5F_P_3) },
3767 /* PREFIX_VEX_0F60 */
3769 { Bad_Opcode },
3770 { Bad_Opcode },
3771 { VEX_LEN_TABLE (VEX_LEN_0F60_P_2) },
3774 /* PREFIX_VEX_0F61 */
3776 { Bad_Opcode },
3777 { Bad_Opcode },
3778 { VEX_LEN_TABLE (VEX_LEN_0F61_P_2) },
3781 /* PREFIX_VEX_0F62 */
3783 { Bad_Opcode },
3784 { Bad_Opcode },
3785 { VEX_LEN_TABLE (VEX_LEN_0F62_P_2) },
3788 /* PREFIX_VEX_0F63 */
3790 { Bad_Opcode },
3791 { Bad_Opcode },
3792 { VEX_LEN_TABLE (VEX_LEN_0F63_P_2) },
3795 /* PREFIX_VEX_0F64 */
3797 { Bad_Opcode },
3798 { Bad_Opcode },
3799 { VEX_LEN_TABLE (VEX_LEN_0F64_P_2) },
3802 /* PREFIX_VEX_0F65 */
3804 { Bad_Opcode },
3805 { Bad_Opcode },
3806 { VEX_LEN_TABLE (VEX_LEN_0F65_P_2) },
3809 /* PREFIX_VEX_0F66 */
3811 { Bad_Opcode },
3812 { Bad_Opcode },
3813 { VEX_LEN_TABLE (VEX_LEN_0F66_P_2) },
3816 /* PREFIX_VEX_0F67 */
3818 { Bad_Opcode },
3819 { Bad_Opcode },
3820 { VEX_LEN_TABLE (VEX_LEN_0F67_P_2) },
3823 /* PREFIX_VEX_0F68 */
3825 { Bad_Opcode },
3826 { Bad_Opcode },
3827 { VEX_LEN_TABLE (VEX_LEN_0F68_P_2) },
3830 /* PREFIX_VEX_0F69 */
3832 { Bad_Opcode },
3833 { Bad_Opcode },
3834 { VEX_LEN_TABLE (VEX_LEN_0F69_P_2) },
3837 /* PREFIX_VEX_0F6A */
3839 { Bad_Opcode },
3840 { Bad_Opcode },
3841 { VEX_LEN_TABLE (VEX_LEN_0F6A_P_2) },
3844 /* PREFIX_VEX_0F6B */
3846 { Bad_Opcode },
3847 { Bad_Opcode },
3848 { VEX_LEN_TABLE (VEX_LEN_0F6B_P_2) },
3851 /* PREFIX_VEX_0F6C */
3853 { Bad_Opcode },
3854 { Bad_Opcode },
3855 { VEX_LEN_TABLE (VEX_LEN_0F6C_P_2) },
3858 /* PREFIX_VEX_0F6D */
3860 { Bad_Opcode },
3861 { Bad_Opcode },
3862 { VEX_LEN_TABLE (VEX_LEN_0F6D_P_2) },
3865 /* PREFIX_VEX_0F6E */
3867 { Bad_Opcode },
3868 { Bad_Opcode },
3869 { VEX_LEN_TABLE (VEX_LEN_0F6E_P_2) },
3872 /* PREFIX_VEX_0F6F */
3874 { Bad_Opcode },
3875 { VEX_W_TABLE (VEX_W_0F6F_P_1) },
3876 { VEX_W_TABLE (VEX_W_0F6F_P_2) },
3879 /* PREFIX_VEX_0F70 */
3881 { Bad_Opcode },
3882 { VEX_LEN_TABLE (VEX_LEN_0F70_P_1) },
3883 { VEX_LEN_TABLE (VEX_LEN_0F70_P_2) },
3884 { VEX_LEN_TABLE (VEX_LEN_0F70_P_3) },
3887 /* PREFIX_VEX_0F71_REG_2 */
3889 { Bad_Opcode },
3890 { Bad_Opcode },
3891 { VEX_LEN_TABLE (VEX_LEN_0F71_R_2_P_2) },
3894 /* PREFIX_VEX_0F71_REG_4 */
3896 { Bad_Opcode },
3897 { Bad_Opcode },
3898 { VEX_LEN_TABLE (VEX_LEN_0F71_R_4_P_2) },
3901 /* PREFIX_VEX_0F71_REG_6 */
3903 { Bad_Opcode },
3904 { Bad_Opcode },
3905 { VEX_LEN_TABLE (VEX_LEN_0F71_R_6_P_2) },
3908 /* PREFIX_VEX_0F72_REG_2 */
3910 { Bad_Opcode },
3911 { Bad_Opcode },
3912 { VEX_LEN_TABLE (VEX_LEN_0F72_R_2_P_2) },
3915 /* PREFIX_VEX_0F72_REG_4 */
3917 { Bad_Opcode },
3918 { Bad_Opcode },
3919 { VEX_LEN_TABLE (VEX_LEN_0F72_R_4_P_2) },
3922 /* PREFIX_VEX_0F72_REG_6 */
3924 { Bad_Opcode },
3925 { Bad_Opcode },
3926 { VEX_LEN_TABLE (VEX_LEN_0F72_R_6_P_2) },
3929 /* PREFIX_VEX_0F73_REG_2 */
3931 { Bad_Opcode },
3932 { Bad_Opcode },
3933 { VEX_LEN_TABLE (VEX_LEN_0F73_R_2_P_2) },
3936 /* PREFIX_VEX_0F73_REG_3 */
3938 { Bad_Opcode },
3939 { Bad_Opcode },
3940 { VEX_LEN_TABLE (VEX_LEN_0F73_R_3_P_2) },
3943 /* PREFIX_VEX_0F73_REG_6 */
3945 { Bad_Opcode },
3946 { Bad_Opcode },
3947 { VEX_LEN_TABLE (VEX_LEN_0F73_R_6_P_2) },
3950 /* PREFIX_VEX_0F73_REG_7 */
3952 { Bad_Opcode },
3953 { Bad_Opcode },
3954 { VEX_LEN_TABLE (VEX_LEN_0F73_R_7_P_2) },
3957 /* PREFIX_VEX_0F74 */
3959 { Bad_Opcode },
3960 { Bad_Opcode },
3961 { VEX_LEN_TABLE (VEX_LEN_0F74_P_2) },
3964 /* PREFIX_VEX_0F75 */
3966 { Bad_Opcode },
3967 { Bad_Opcode },
3968 { VEX_LEN_TABLE (VEX_LEN_0F75_P_2) },
3971 /* PREFIX_VEX_0F76 */
3973 { Bad_Opcode },
3974 { Bad_Opcode },
3975 { VEX_LEN_TABLE (VEX_LEN_0F76_P_2) },
3978 /* PREFIX_VEX_0F77 */
3980 { VEX_W_TABLE (VEX_W_0F77_P_0) },
3983 /* PREFIX_VEX_0F7C */
3985 { Bad_Opcode },
3986 { Bad_Opcode },
3987 { VEX_W_TABLE (VEX_W_0F7C_P_2) },
3988 { VEX_W_TABLE (VEX_W_0F7C_P_3) },
3991 /* PREFIX_VEX_0F7D */
3993 { Bad_Opcode },
3994 { Bad_Opcode },
3995 { VEX_W_TABLE (VEX_W_0F7D_P_2) },
3996 { VEX_W_TABLE (VEX_W_0F7D_P_3) },
3999 /* PREFIX_VEX_0F7E */
4001 { Bad_Opcode },
4002 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_1) },
4003 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_2) },
4006 /* PREFIX_VEX_0F7F */
4008 { Bad_Opcode },
4009 { VEX_W_TABLE (VEX_W_0F7F_P_1) },
4010 { VEX_W_TABLE (VEX_W_0F7F_P_2) },
4013 /* PREFIX_VEX_0FC2 */
4015 { VEX_W_TABLE (VEX_W_0FC2_P_0) },
4016 { VEX_LEN_TABLE (VEX_LEN_0FC2_P_1) },
4017 { VEX_W_TABLE (VEX_W_0FC2_P_2) },
4018 { VEX_LEN_TABLE (VEX_LEN_0FC2_P_3) },
4021 /* PREFIX_VEX_0FC4 */
4023 { Bad_Opcode },
4024 { Bad_Opcode },
4025 { VEX_LEN_TABLE (VEX_LEN_0FC4_P_2) },
4028 /* PREFIX_VEX_0FC5 */
4030 { Bad_Opcode },
4031 { Bad_Opcode },
4032 { VEX_LEN_TABLE (VEX_LEN_0FC5_P_2) },
4035 /* PREFIX_VEX_0FD0 */
4037 { Bad_Opcode },
4038 { Bad_Opcode },
4039 { VEX_W_TABLE (VEX_W_0FD0_P_2) },
4040 { VEX_W_TABLE (VEX_W_0FD0_P_3) },
4043 /* PREFIX_VEX_0FD1 */
4045 { Bad_Opcode },
4046 { Bad_Opcode },
4047 { VEX_LEN_TABLE (VEX_LEN_0FD1_P_2) },
4050 /* PREFIX_VEX_0FD2 */
4052 { Bad_Opcode },
4053 { Bad_Opcode },
4054 { VEX_LEN_TABLE (VEX_LEN_0FD2_P_2) },
4057 /* PREFIX_VEX_0FD3 */
4059 { Bad_Opcode },
4060 { Bad_Opcode },
4061 { VEX_LEN_TABLE (VEX_LEN_0FD3_P_2) },
4064 /* PREFIX_VEX_0FD4 */
4066 { Bad_Opcode },
4067 { Bad_Opcode },
4068 { VEX_LEN_TABLE (VEX_LEN_0FD4_P_2) },
4071 /* PREFIX_VEX_0FD5 */
4073 { Bad_Opcode },
4074 { Bad_Opcode },
4075 { VEX_LEN_TABLE (VEX_LEN_0FD5_P_2) },
4078 /* PREFIX_VEX_0FD6 */
4080 { Bad_Opcode },
4081 { Bad_Opcode },
4082 { VEX_LEN_TABLE (VEX_LEN_0FD6_P_2) },
4085 /* PREFIX_VEX_0FD7 */
4087 { Bad_Opcode },
4088 { Bad_Opcode },
4089 { MOD_TABLE (MOD_VEX_0FD7_PREFIX_2) },
4092 /* PREFIX_VEX_0FD8 */
4094 { Bad_Opcode },
4095 { Bad_Opcode },
4096 { VEX_LEN_TABLE (VEX_LEN_0FD8_P_2) },
4099 /* PREFIX_VEX_0FD9 */
4101 { Bad_Opcode },
4102 { Bad_Opcode },
4103 { VEX_LEN_TABLE (VEX_LEN_0FD9_P_2) },
4106 /* PREFIX_VEX_0FDA */
4108 { Bad_Opcode },
4109 { Bad_Opcode },
4110 { VEX_LEN_TABLE (VEX_LEN_0FDA_P_2) },
4113 /* PREFIX_VEX_0FDB */
4115 { Bad_Opcode },
4116 { Bad_Opcode },
4117 { VEX_LEN_TABLE (VEX_LEN_0FDB_P_2) },
4120 /* PREFIX_VEX_0FDC */
4122 { Bad_Opcode },
4123 { Bad_Opcode },
4124 { VEX_LEN_TABLE (VEX_LEN_0FDC_P_2) },
4127 /* PREFIX_VEX_0FDD */
4129 { Bad_Opcode },
4130 { Bad_Opcode },
4131 { VEX_LEN_TABLE (VEX_LEN_0FDD_P_2) },
4134 /* PREFIX_VEX_0FDE */
4136 { Bad_Opcode },
4137 { Bad_Opcode },
4138 { VEX_LEN_TABLE (VEX_LEN_0FDE_P_2) },
4141 /* PREFIX_VEX_0FDF */
4143 { Bad_Opcode },
4144 { Bad_Opcode },
4145 { VEX_LEN_TABLE (VEX_LEN_0FDF_P_2) },
4148 /* PREFIX_VEX_0FE0 */
4150 { Bad_Opcode },
4151 { Bad_Opcode },
4152 { VEX_LEN_TABLE (VEX_LEN_0FE0_P_2) },
4155 /* PREFIX_VEX_0FE1 */
4157 { Bad_Opcode },
4158 { Bad_Opcode },
4159 { VEX_LEN_TABLE (VEX_LEN_0FE1_P_2) },
4162 /* PREFIX_VEX_0FE2 */
4164 { Bad_Opcode },
4165 { Bad_Opcode },
4166 { VEX_LEN_TABLE (VEX_LEN_0FE2_P_2) },
4169 /* PREFIX_VEX_0FE3 */
4171 { Bad_Opcode },
4172 { Bad_Opcode },
4173 { VEX_LEN_TABLE (VEX_LEN_0FE3_P_2) },
4176 /* PREFIX_VEX_0FE4 */
4178 { Bad_Opcode },
4179 { Bad_Opcode },
4180 { VEX_LEN_TABLE (VEX_LEN_0FE4_P_2) },
4183 /* PREFIX_VEX_0FE5 */
4185 { Bad_Opcode },
4186 { Bad_Opcode },
4187 { VEX_LEN_TABLE (VEX_LEN_0FE5_P_2) },
4190 /* PREFIX_VEX_0FE6 */
4192 { Bad_Opcode },
4193 { VEX_W_TABLE (VEX_W_0FE6_P_1) },
4194 { VEX_W_TABLE (VEX_W_0FE6_P_2) },
4195 { VEX_W_TABLE (VEX_W_0FE6_P_3) },
4198 /* PREFIX_VEX_0FE7 */
4200 { Bad_Opcode },
4201 { Bad_Opcode },
4202 { MOD_TABLE (MOD_VEX_0FE7_PREFIX_2) },
4205 /* PREFIX_VEX_0FE8 */
4207 { Bad_Opcode },
4208 { Bad_Opcode },
4209 { VEX_LEN_TABLE (VEX_LEN_0FE8_P_2) },
4212 /* PREFIX_VEX_0FE9 */
4214 { Bad_Opcode },
4215 { Bad_Opcode },
4216 { VEX_LEN_TABLE (VEX_LEN_0FE9_P_2) },
4219 /* PREFIX_VEX_0FEA */
4221 { Bad_Opcode },
4222 { Bad_Opcode },
4223 { VEX_LEN_TABLE (VEX_LEN_0FEA_P_2) },
4226 /* PREFIX_VEX_0FEB */
4228 { Bad_Opcode },
4229 { Bad_Opcode },
4230 { VEX_LEN_TABLE (VEX_LEN_0FEB_P_2) },
4233 /* PREFIX_VEX_0FEC */
4235 { Bad_Opcode },
4236 { Bad_Opcode },
4237 { VEX_LEN_TABLE (VEX_LEN_0FEC_P_2) },
4240 /* PREFIX_VEX_0FED */
4242 { Bad_Opcode },
4243 { Bad_Opcode },
4244 { VEX_LEN_TABLE (VEX_LEN_0FED_P_2) },
4247 /* PREFIX_VEX_0FEE */
4249 { Bad_Opcode },
4250 { Bad_Opcode },
4251 { VEX_LEN_TABLE (VEX_LEN_0FEE_P_2) },
4254 /* PREFIX_VEX_0FEF */
4256 { Bad_Opcode },
4257 { Bad_Opcode },
4258 { VEX_LEN_TABLE (VEX_LEN_0FEF_P_2) },
4261 /* PREFIX_VEX_0FF0 */
4263 { Bad_Opcode },
4264 { Bad_Opcode },
4265 { Bad_Opcode },
4266 { MOD_TABLE (MOD_VEX_0FF0_PREFIX_3) },
4269 /* PREFIX_VEX_0FF1 */
4271 { Bad_Opcode },
4272 { Bad_Opcode },
4273 { VEX_LEN_TABLE (VEX_LEN_0FF1_P_2) },
4276 /* PREFIX_VEX_0FF2 */
4278 { Bad_Opcode },
4279 { Bad_Opcode },
4280 { VEX_LEN_TABLE (VEX_LEN_0FF2_P_2) },
4283 /* PREFIX_VEX_0FF3 */
4285 { Bad_Opcode },
4286 { Bad_Opcode },
4287 { VEX_LEN_TABLE (VEX_LEN_0FF3_P_2) },
4290 /* PREFIX_VEX_0FF4 */
4292 { Bad_Opcode },
4293 { Bad_Opcode },
4294 { VEX_LEN_TABLE (VEX_LEN_0FF4_P_2) },
4297 /* PREFIX_VEX_0FF5 */
4299 { Bad_Opcode },
4300 { Bad_Opcode },
4301 { VEX_LEN_TABLE (VEX_LEN_0FF5_P_2) },
4304 /* PREFIX_VEX_0FF6 */
4306 { Bad_Opcode },
4307 { Bad_Opcode },
4308 { VEX_LEN_TABLE (VEX_LEN_0FF6_P_2) },
4311 /* PREFIX_VEX_0FF7 */
4313 { Bad_Opcode },
4314 { Bad_Opcode },
4315 { VEX_LEN_TABLE (VEX_LEN_0FF7_P_2) },
4318 /* PREFIX_VEX_0FF8 */
4320 { Bad_Opcode },
4321 { Bad_Opcode },
4322 { VEX_LEN_TABLE (VEX_LEN_0FF8_P_2) },
4325 /* PREFIX_VEX_0FF9 */
4327 { Bad_Opcode },
4328 { Bad_Opcode },
4329 { VEX_LEN_TABLE (VEX_LEN_0FF9_P_2) },
4332 /* PREFIX_VEX_0FFA */
4334 { Bad_Opcode },
4335 { Bad_Opcode },
4336 { VEX_LEN_TABLE (VEX_LEN_0FFA_P_2) },
4339 /* PREFIX_VEX_0FFB */
4341 { Bad_Opcode },
4342 { Bad_Opcode },
4343 { VEX_LEN_TABLE (VEX_LEN_0FFB_P_2) },
4346 /* PREFIX_VEX_0FFC */
4348 { Bad_Opcode },
4349 { Bad_Opcode },
4350 { VEX_LEN_TABLE (VEX_LEN_0FFC_P_2) },
4353 /* PREFIX_VEX_0FFD */
4355 { Bad_Opcode },
4356 { Bad_Opcode },
4357 { VEX_LEN_TABLE (VEX_LEN_0FFD_P_2) },
4360 /* PREFIX_VEX_0FFE */
4362 { Bad_Opcode },
4363 { Bad_Opcode },
4364 { VEX_LEN_TABLE (VEX_LEN_0FFE_P_2) },
4367 /* PREFIX_VEX_0F3800 */
4369 { Bad_Opcode },
4370 { Bad_Opcode },
4371 { VEX_LEN_TABLE (VEX_LEN_0F3800_P_2) },
4374 /* PREFIX_VEX_0F3801 */
4376 { Bad_Opcode },
4377 { Bad_Opcode },
4378 { VEX_LEN_TABLE (VEX_LEN_0F3801_P_2) },
4381 /* PREFIX_VEX_0F3802 */
4383 { Bad_Opcode },
4384 { Bad_Opcode },
4385 { VEX_LEN_TABLE (VEX_LEN_0F3802_P_2) },
4388 /* PREFIX_VEX_0F3803 */
4390 { Bad_Opcode },
4391 { Bad_Opcode },
4392 { VEX_LEN_TABLE (VEX_LEN_0F3803_P_2) },
4395 /* PREFIX_VEX_0F3804 */
4397 { Bad_Opcode },
4398 { Bad_Opcode },
4399 { VEX_LEN_TABLE (VEX_LEN_0F3804_P_2) },
4402 /* PREFIX_VEX_0F3805 */
4404 { Bad_Opcode },
4405 { Bad_Opcode },
4406 { VEX_LEN_TABLE (VEX_LEN_0F3805_P_2) },
4409 /* PREFIX_VEX_0F3806 */
4411 { Bad_Opcode },
4412 { Bad_Opcode },
4413 { VEX_LEN_TABLE (VEX_LEN_0F3806_P_2) },
4416 /* PREFIX_VEX_0F3807 */
4418 { Bad_Opcode },
4419 { Bad_Opcode },
4420 { VEX_LEN_TABLE (VEX_LEN_0F3807_P_2) },
4423 /* PREFIX_VEX_0F3808 */
4425 { Bad_Opcode },
4426 { Bad_Opcode },
4427 { VEX_LEN_TABLE (VEX_LEN_0F3808_P_2) },
4430 /* PREFIX_VEX_0F3809 */
4432 { Bad_Opcode },
4433 { Bad_Opcode },
4434 { VEX_LEN_TABLE (VEX_LEN_0F3809_P_2) },
4437 /* PREFIX_VEX_0F380A */
4439 { Bad_Opcode },
4440 { Bad_Opcode },
4441 { VEX_LEN_TABLE (VEX_LEN_0F380A_P_2) },
4444 /* PREFIX_VEX_0F380B */
4446 { Bad_Opcode },
4447 { Bad_Opcode },
4448 { VEX_LEN_TABLE (VEX_LEN_0F380B_P_2) },
4451 /* PREFIX_VEX_0F380C */
4453 { Bad_Opcode },
4454 { Bad_Opcode },
4455 { VEX_W_TABLE (VEX_W_0F380C_P_2) },
4458 /* PREFIX_VEX_0F380D */
4460 { Bad_Opcode },
4461 { Bad_Opcode },
4462 { VEX_W_TABLE (VEX_W_0F380D_P_2) },
4465 /* PREFIX_VEX_0F380E */
4467 { Bad_Opcode },
4468 { Bad_Opcode },
4469 { VEX_W_TABLE (VEX_W_0F380E_P_2) },
4472 /* PREFIX_VEX_0F380F */
4474 { Bad_Opcode },
4475 { Bad_Opcode },
4476 { VEX_W_TABLE (VEX_W_0F380F_P_2) },
4479 /* PREFIX_VEX_0F3813 */
4481 { Bad_Opcode },
4482 { Bad_Opcode },
4483 { "vcvtph2ps", { XM, EXxmmq } },
4486 /* PREFIX_VEX_0F3817 */
4488 { Bad_Opcode },
4489 { Bad_Opcode },
4490 { VEX_W_TABLE (VEX_W_0F3817_P_2) },
4493 /* PREFIX_VEX_0F3818 */
4495 { Bad_Opcode },
4496 { Bad_Opcode },
4497 { MOD_TABLE (MOD_VEX_0F3818_PREFIX_2) },
4500 /* PREFIX_VEX_0F3819 */
4502 { Bad_Opcode },
4503 { Bad_Opcode },
4504 { MOD_TABLE (MOD_VEX_0F3819_PREFIX_2) },
4507 /* PREFIX_VEX_0F381A */
4509 { Bad_Opcode },
4510 { Bad_Opcode },
4511 { MOD_TABLE (MOD_VEX_0F381A_PREFIX_2) },
4514 /* PREFIX_VEX_0F381C */
4516 { Bad_Opcode },
4517 { Bad_Opcode },
4518 { VEX_LEN_TABLE (VEX_LEN_0F381C_P_2) },
4521 /* PREFIX_VEX_0F381D */
4523 { Bad_Opcode },
4524 { Bad_Opcode },
4525 { VEX_LEN_TABLE (VEX_LEN_0F381D_P_2) },
4528 /* PREFIX_VEX_0F381E */
4530 { Bad_Opcode },
4531 { Bad_Opcode },
4532 { VEX_LEN_TABLE (VEX_LEN_0F381E_P_2) },
4535 /* PREFIX_VEX_0F3820 */
4537 { Bad_Opcode },
4538 { Bad_Opcode },
4539 { VEX_LEN_TABLE (VEX_LEN_0F3820_P_2) },
4542 /* PREFIX_VEX_0F3821 */
4544 { Bad_Opcode },
4545 { Bad_Opcode },
4546 { VEX_LEN_TABLE (VEX_LEN_0F3821_P_2) },
4549 /* PREFIX_VEX_0F3822 */
4551 { Bad_Opcode },
4552 { Bad_Opcode },
4553 { VEX_LEN_TABLE (VEX_LEN_0F3822_P_2) },
4556 /* PREFIX_VEX_0F3823 */
4558 { Bad_Opcode },
4559 { Bad_Opcode },
4560 { VEX_LEN_TABLE (VEX_LEN_0F3823_P_2) },
4563 /* PREFIX_VEX_0F3824 */
4565 { Bad_Opcode },
4566 { Bad_Opcode },
4567 { VEX_LEN_TABLE (VEX_LEN_0F3824_P_2) },
4570 /* PREFIX_VEX_0F3825 */
4572 { Bad_Opcode },
4573 { Bad_Opcode },
4574 { VEX_LEN_TABLE (VEX_LEN_0F3825_P_2) },
4577 /* PREFIX_VEX_0F3828 */
4579 { Bad_Opcode },
4580 { Bad_Opcode },
4581 { VEX_LEN_TABLE (VEX_LEN_0F3828_P_2) },
4584 /* PREFIX_VEX_0F3829 */
4586 { Bad_Opcode },
4587 { Bad_Opcode },
4588 { VEX_LEN_TABLE (VEX_LEN_0F3829_P_2) },
4591 /* PREFIX_VEX_0F382A */
4593 { Bad_Opcode },
4594 { Bad_Opcode },
4595 { MOD_TABLE (MOD_VEX_0F382A_PREFIX_2) },
4598 /* PREFIX_VEX_0F382B */
4600 { Bad_Opcode },
4601 { Bad_Opcode },
4602 { VEX_LEN_TABLE (VEX_LEN_0F382B_P_2) },
4605 /* PREFIX_VEX_0F382C */
4607 { Bad_Opcode },
4608 { Bad_Opcode },
4609 { MOD_TABLE (MOD_VEX_0F382C_PREFIX_2) },
4612 /* PREFIX_VEX_0F382D */
4614 { Bad_Opcode },
4615 { Bad_Opcode },
4616 { MOD_TABLE (MOD_VEX_0F382D_PREFIX_2) },
4619 /* PREFIX_VEX_0F382E */
4621 { Bad_Opcode },
4622 { Bad_Opcode },
4623 { MOD_TABLE (MOD_VEX_0F382E_PREFIX_2) },
4626 /* PREFIX_VEX_0F382F */
4628 { Bad_Opcode },
4629 { Bad_Opcode },
4630 { MOD_TABLE (MOD_VEX_0F382F_PREFIX_2) },
4633 /* PREFIX_VEX_0F3830 */
4635 { Bad_Opcode },
4636 { Bad_Opcode },
4637 { VEX_LEN_TABLE (VEX_LEN_0F3830_P_2) },
4640 /* PREFIX_VEX_0F3831 */
4642 { Bad_Opcode },
4643 { Bad_Opcode },
4644 { VEX_LEN_TABLE (VEX_LEN_0F3831_P_2) },
4647 /* PREFIX_VEX_0F3832 */
4649 { Bad_Opcode },
4650 { Bad_Opcode },
4651 { VEX_LEN_TABLE (VEX_LEN_0F3832_P_2) },
4654 /* PREFIX_VEX_0F3833 */
4656 { Bad_Opcode },
4657 { Bad_Opcode },
4658 { VEX_LEN_TABLE (VEX_LEN_0F3833_P_2) },
4661 /* PREFIX_VEX_0F3834 */
4663 { Bad_Opcode },
4664 { Bad_Opcode },
4665 { VEX_LEN_TABLE (VEX_LEN_0F3834_P_2) },
4668 /* PREFIX_VEX_0F3835 */
4670 { Bad_Opcode },
4671 { Bad_Opcode },
4672 { VEX_LEN_TABLE (VEX_LEN_0F3835_P_2) },
4675 /* PREFIX_VEX_0F3837 */
4677 { Bad_Opcode },
4678 { Bad_Opcode },
4679 { VEX_LEN_TABLE (VEX_LEN_0F3837_P_2) },
4682 /* PREFIX_VEX_0F3838 */
4684 { Bad_Opcode },
4685 { Bad_Opcode },
4686 { VEX_LEN_TABLE (VEX_LEN_0F3838_P_2) },
4689 /* PREFIX_VEX_0F3839 */
4691 { Bad_Opcode },
4692 { Bad_Opcode },
4693 { VEX_LEN_TABLE (VEX_LEN_0F3839_P_2) },
4696 /* PREFIX_VEX_0F383A */
4698 { Bad_Opcode },
4699 { Bad_Opcode },
4700 { VEX_LEN_TABLE (VEX_LEN_0F383A_P_2) },
4703 /* PREFIX_VEX_0F383B */
4705 { Bad_Opcode },
4706 { Bad_Opcode },
4707 { VEX_LEN_TABLE (VEX_LEN_0F383B_P_2) },
4710 /* PREFIX_VEX_0F383C */
4712 { Bad_Opcode },
4713 { Bad_Opcode },
4714 { VEX_LEN_TABLE (VEX_LEN_0F383C_P_2) },
4717 /* PREFIX_VEX_0F383D */
4719 { Bad_Opcode },
4720 { Bad_Opcode },
4721 { VEX_LEN_TABLE (VEX_LEN_0F383D_P_2) },
4724 /* PREFIX_VEX_0F383E */
4726 { Bad_Opcode },
4727 { Bad_Opcode },
4728 { VEX_LEN_TABLE (VEX_LEN_0F383E_P_2) },
4731 /* PREFIX_VEX_0F383F */
4733 { Bad_Opcode },
4734 { Bad_Opcode },
4735 { VEX_LEN_TABLE (VEX_LEN_0F383F_P_2) },
4738 /* PREFIX_VEX_0F3840 */
4740 { Bad_Opcode },
4741 { Bad_Opcode },
4742 { VEX_LEN_TABLE (VEX_LEN_0F3840_P_2) },
4745 /* PREFIX_VEX_0F3841 */
4747 { Bad_Opcode },
4748 { Bad_Opcode },
4749 { VEX_LEN_TABLE (VEX_LEN_0F3841_P_2) },
4752 /* PREFIX_VEX_0F3896 */
4754 { Bad_Opcode },
4755 { Bad_Opcode },
4756 { "vfmaddsub132p%XW", { XM, Vex, EXx } },
4759 /* PREFIX_VEX_0F3897 */
4761 { Bad_Opcode },
4762 { Bad_Opcode },
4763 { "vfmsubadd132p%XW", { XM, Vex, EXx } },
4766 /* PREFIX_VEX_0F3898 */
4768 { Bad_Opcode },
4769 { Bad_Opcode },
4770 { "vfmadd132p%XW", { XM, Vex, EXx } },
4773 /* PREFIX_VEX_0F3899 */
4775 { Bad_Opcode },
4776 { Bad_Opcode },
4777 { "vfmadd132s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
4780 /* PREFIX_VEX_0F389A */
4782 { Bad_Opcode },
4783 { Bad_Opcode },
4784 { "vfmsub132p%XW", { XM, Vex, EXx } },
4787 /* PREFIX_VEX_0F389B */
4789 { Bad_Opcode },
4790 { Bad_Opcode },
4791 { "vfmsub132s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
4794 /* PREFIX_VEX_0F389C */
4796 { Bad_Opcode },
4797 { Bad_Opcode },
4798 { "vfnmadd132p%XW", { XM, Vex, EXx } },
4801 /* PREFIX_VEX_0F389D */
4803 { Bad_Opcode },
4804 { Bad_Opcode },
4805 { "vfnmadd132s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
4808 /* PREFIX_VEX_0F389E */
4810 { Bad_Opcode },
4811 { Bad_Opcode },
4812 { "vfnmsub132p%XW", { XM, Vex, EXx } },
4815 /* PREFIX_VEX_0F389F */
4817 { Bad_Opcode },
4818 { Bad_Opcode },
4819 { "vfnmsub132s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
4822 /* PREFIX_VEX_0F38A6 */
4824 { Bad_Opcode },
4825 { Bad_Opcode },
4826 { "vfmaddsub213p%XW", { XM, Vex, EXx } },
4827 { Bad_Opcode },
4830 /* PREFIX_VEX_0F38A7 */
4832 { Bad_Opcode },
4833 { Bad_Opcode },
4834 { "vfmsubadd213p%XW", { XM, Vex, EXx } },
4837 /* PREFIX_VEX_0F38A8 */
4839 { Bad_Opcode },
4840 { Bad_Opcode },
4841 { "vfmadd213p%XW", { XM, Vex, EXx } },
4844 /* PREFIX_VEX_0F38A9 */
4846 { Bad_Opcode },
4847 { Bad_Opcode },
4848 { "vfmadd213s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
4851 /* PREFIX_VEX_0F38AA */
4853 { Bad_Opcode },
4854 { Bad_Opcode },
4855 { "vfmsub213p%XW", { XM, Vex, EXx } },
4858 /* PREFIX_VEX_0F38AB */
4860 { Bad_Opcode },
4861 { Bad_Opcode },
4862 { "vfmsub213s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
4865 /* PREFIX_VEX_0F38AC */
4867 { Bad_Opcode },
4868 { Bad_Opcode },
4869 { "vfnmadd213p%XW", { XM, Vex, EXx } },
4872 /* PREFIX_VEX_0F38AD */
4874 { Bad_Opcode },
4875 { Bad_Opcode },
4876 { "vfnmadd213s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
4879 /* PREFIX_VEX_0F38AE */
4881 { Bad_Opcode },
4882 { Bad_Opcode },
4883 { "vfnmsub213p%XW", { XM, Vex, EXx } },
4886 /* PREFIX_VEX_0F38AF */
4888 { Bad_Opcode },
4889 { Bad_Opcode },
4890 { "vfnmsub213s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
4893 /* PREFIX_VEX_0F38B6 */
4895 { Bad_Opcode },
4896 { Bad_Opcode },
4897 { "vfmaddsub231p%XW", { XM, Vex, EXx } },
4900 /* PREFIX_VEX_0F38B7 */
4902 { Bad_Opcode },
4903 { Bad_Opcode },
4904 { "vfmsubadd231p%XW", { XM, Vex, EXx } },
4907 /* PREFIX_VEX_0F38B8 */
4909 { Bad_Opcode },
4910 { Bad_Opcode },
4911 { "vfmadd231p%XW", { XM, Vex, EXx } },
4914 /* PREFIX_VEX_0F38B9 */
4916 { Bad_Opcode },
4917 { Bad_Opcode },
4918 { "vfmadd231s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
4921 /* PREFIX_VEX_0F38BA */
4923 { Bad_Opcode },
4924 { Bad_Opcode },
4925 { "vfmsub231p%XW", { XM, Vex, EXx } },
4928 /* PREFIX_VEX_0F38BB */
4930 { Bad_Opcode },
4931 { Bad_Opcode },
4932 { "vfmsub231s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
4935 /* PREFIX_VEX_0F38BC */
4937 { Bad_Opcode },
4938 { Bad_Opcode },
4939 { "vfnmadd231p%XW", { XM, Vex, EXx } },
4942 /* PREFIX_VEX_0F38BD */
4944 { Bad_Opcode },
4945 { Bad_Opcode },
4946 { "vfnmadd231s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
4949 /* PREFIX_VEX_0F38BE */
4951 { Bad_Opcode },
4952 { Bad_Opcode },
4953 { "vfnmsub231p%XW", { XM, Vex, EXx } },
4956 /* PREFIX_VEX_0F38BF */
4958 { Bad_Opcode },
4959 { Bad_Opcode },
4960 { "vfnmsub231s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
4963 /* PREFIX_VEX_0F38DB */
4965 { Bad_Opcode },
4966 { Bad_Opcode },
4967 { VEX_LEN_TABLE (VEX_LEN_0F38DB_P_2) },
4970 /* PREFIX_VEX_0F38DC */
4972 { Bad_Opcode },
4973 { Bad_Opcode },
4974 { VEX_LEN_TABLE (VEX_LEN_0F38DC_P_2) },
4977 /* PREFIX_VEX_0F38DD */
4979 { Bad_Opcode },
4980 { Bad_Opcode },
4981 { VEX_LEN_TABLE (VEX_LEN_0F38DD_P_2) },
4984 /* PREFIX_VEX_0F38DE */
4986 { Bad_Opcode },
4987 { Bad_Opcode },
4988 { VEX_LEN_TABLE (VEX_LEN_0F38DE_P_2) },
4991 /* PREFIX_VEX_0F38DF */
4993 { Bad_Opcode },
4994 { Bad_Opcode },
4995 { VEX_LEN_TABLE (VEX_LEN_0F38DF_P_2) },
4998 /* PREFIX_VEX_0F38F2 */
5000 { VEX_LEN_TABLE (VEX_LEN_0F38F2_P_0) },
5003 /* PREFIX_VEX_0F38F3_REG_1 */
5005 { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_1_P_0) },
5008 /* PREFIX_VEX_0F38F3_REG_2 */
5010 { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_2_P_0) },
5013 /* PREFIX_VEX_0F38F3_REG_3 */
5015 { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_3_P_0) },
5018 /* PREFIX_VEX_0F38F7 */
5020 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_0) },
5023 /* PREFIX_VEX_0F3A04 */
5025 { Bad_Opcode },
5026 { Bad_Opcode },
5027 { VEX_W_TABLE (VEX_W_0F3A04_P_2) },
5030 /* PREFIX_VEX_0F3A05 */
5032 { Bad_Opcode },
5033 { Bad_Opcode },
5034 { VEX_W_TABLE (VEX_W_0F3A05_P_2) },
5037 /* PREFIX_VEX_0F3A06 */
5039 { Bad_Opcode },
5040 { Bad_Opcode },
5041 { VEX_LEN_TABLE (VEX_LEN_0F3A06_P_2) },
5044 /* PREFIX_VEX_0F3A08 */
5046 { Bad_Opcode },
5047 { Bad_Opcode },
5048 { VEX_W_TABLE (VEX_W_0F3A08_P_2) },
5051 /* PREFIX_VEX_0F3A09 */
5053 { Bad_Opcode },
5054 { Bad_Opcode },
5055 { VEX_W_TABLE (VEX_W_0F3A09_P_2) },
5058 /* PREFIX_VEX_0F3A0A */
5060 { Bad_Opcode },
5061 { Bad_Opcode },
5062 { VEX_LEN_TABLE (VEX_LEN_0F3A0A_P_2) },
5065 /* PREFIX_VEX_0F3A0B */
5067 { Bad_Opcode },
5068 { Bad_Opcode },
5069 { VEX_LEN_TABLE (VEX_LEN_0F3A0B_P_2) },
5072 /* PREFIX_VEX_0F3A0C */
5074 { Bad_Opcode },
5075 { Bad_Opcode },
5076 { VEX_W_TABLE (VEX_W_0F3A0C_P_2) },
5079 /* PREFIX_VEX_0F3A0D */
5081 { Bad_Opcode },
5082 { Bad_Opcode },
5083 { VEX_W_TABLE (VEX_W_0F3A0D_P_2) },
5086 /* PREFIX_VEX_0F3A0E */
5088 { Bad_Opcode },
5089 { Bad_Opcode },
5090 { VEX_LEN_TABLE (VEX_LEN_0F3A0E_P_2) },
5093 /* PREFIX_VEX_0F3A0F */
5095 { Bad_Opcode },
5096 { Bad_Opcode },
5097 { VEX_LEN_TABLE (VEX_LEN_0F3A0F_P_2) },
5100 /* PREFIX_VEX_0F3A14 */
5102 { Bad_Opcode },
5103 { Bad_Opcode },
5104 { VEX_LEN_TABLE (VEX_LEN_0F3A14_P_2) },
5107 /* PREFIX_VEX_0F3A15 */
5109 { Bad_Opcode },
5110 { Bad_Opcode },
5111 { VEX_LEN_TABLE (VEX_LEN_0F3A15_P_2) },
5114 /* PREFIX_VEX_0F3A16 */
5116 { Bad_Opcode },
5117 { Bad_Opcode },
5118 { VEX_LEN_TABLE (VEX_LEN_0F3A16_P_2) },
5121 /* PREFIX_VEX_0F3A17 */
5123 { Bad_Opcode },
5124 { Bad_Opcode },
5125 { VEX_LEN_TABLE (VEX_LEN_0F3A17_P_2) },
5128 /* PREFIX_VEX_0F3A18 */
5130 { Bad_Opcode },
5131 { Bad_Opcode },
5132 { VEX_LEN_TABLE (VEX_LEN_0F3A18_P_2) },
5135 /* PREFIX_VEX_0F3A19 */
5137 { Bad_Opcode },
5138 { Bad_Opcode },
5139 { VEX_LEN_TABLE (VEX_LEN_0F3A19_P_2) },
5142 /* PREFIX_VEX_0F3A1D */
5144 { Bad_Opcode },
5145 { Bad_Opcode },
5146 { "vcvtps2ph", { EXxmmq, XM, Ib } },
5149 /* PREFIX_VEX_0F3A20 */
5151 { Bad_Opcode },
5152 { Bad_Opcode },
5153 { VEX_LEN_TABLE (VEX_LEN_0F3A20_P_2) },
5156 /* PREFIX_VEX_0F3A21 */
5158 { Bad_Opcode },
5159 { Bad_Opcode },
5160 { VEX_LEN_TABLE (VEX_LEN_0F3A21_P_2) },
5163 /* PREFIX_VEX_0F3A22 */
5165 { Bad_Opcode },
5166 { Bad_Opcode },
5167 { VEX_LEN_TABLE (VEX_LEN_0F3A22_P_2) },
5170 /* PREFIX_VEX_0F3A40 */
5172 { Bad_Opcode },
5173 { Bad_Opcode },
5174 { VEX_W_TABLE (VEX_W_0F3A40_P_2) },
5177 /* PREFIX_VEX_0F3A41 */
5179 { Bad_Opcode },
5180 { Bad_Opcode },
5181 { VEX_LEN_TABLE (VEX_LEN_0F3A41_P_2) },
5184 /* PREFIX_VEX_0F3A42 */
5186 { Bad_Opcode },
5187 { Bad_Opcode },
5188 { VEX_LEN_TABLE (VEX_LEN_0F3A42_P_2) },
5191 /* PREFIX_VEX_0F3A44 */
5193 { Bad_Opcode },
5194 { Bad_Opcode },
5195 { VEX_LEN_TABLE (VEX_LEN_0F3A44_P_2) },
5198 /* PREFIX_VEX_0F3A48 */
5200 { Bad_Opcode },
5201 { Bad_Opcode },
5202 { VEX_W_TABLE (VEX_W_0F3A48_P_2) },
5205 /* PREFIX_VEX_0F3A49 */
5207 { Bad_Opcode },
5208 { Bad_Opcode },
5209 { VEX_W_TABLE (VEX_W_0F3A49_P_2) },
5212 /* PREFIX_VEX_0F3A4A */
5214 { Bad_Opcode },
5215 { Bad_Opcode },
5216 { VEX_W_TABLE (VEX_W_0F3A4A_P_2) },
5219 /* PREFIX_VEX_0F3A4B */
5221 { Bad_Opcode },
5222 { Bad_Opcode },
5223 { VEX_W_TABLE (VEX_W_0F3A4B_P_2) },
5226 /* PREFIX_VEX_0F3A4C */
5228 { Bad_Opcode },
5229 { Bad_Opcode },
5230 { VEX_LEN_TABLE (VEX_LEN_0F3A4C_P_2) },
5233 /* PREFIX_VEX_0F3A5C */
5235 { Bad_Opcode },
5236 { Bad_Opcode },
5237 { "vfmaddsubps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5240 /* PREFIX_VEX_0F3A5D */
5242 { Bad_Opcode },
5243 { Bad_Opcode },
5244 { "vfmaddsubpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5247 /* PREFIX_VEX_0F3A5E */
5249 { Bad_Opcode },
5250 { Bad_Opcode },
5251 { "vfmsubaddps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5254 /* PREFIX_VEX_0F3A5F */
5256 { Bad_Opcode },
5257 { Bad_Opcode },
5258 { "vfmsubaddpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5261 /* PREFIX_VEX_0F3A60 */
5263 { Bad_Opcode },
5264 { Bad_Opcode },
5265 { VEX_LEN_TABLE (VEX_LEN_0F3A60_P_2) },
5266 { Bad_Opcode },
5269 /* PREFIX_VEX_0F3A61 */
5271 { Bad_Opcode },
5272 { Bad_Opcode },
5273 { VEX_LEN_TABLE (VEX_LEN_0F3A61_P_2) },
5276 /* PREFIX_VEX_0F3A62 */
5278 { Bad_Opcode },
5279 { Bad_Opcode },
5280 { VEX_LEN_TABLE (VEX_LEN_0F3A62_P_2) },
5283 /* PREFIX_VEX_0F3A63 */
5285 { Bad_Opcode },
5286 { Bad_Opcode },
5287 { VEX_LEN_TABLE (VEX_LEN_0F3A63_P_2) },
5290 /* PREFIX_VEX_0F3A68 */
5292 { Bad_Opcode },
5293 { Bad_Opcode },
5294 { "vfmaddps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5297 /* PREFIX_VEX_0F3A69 */
5299 { Bad_Opcode },
5300 { Bad_Opcode },
5301 { "vfmaddpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5304 /* PREFIX_VEX_0F3A6A */
5306 { Bad_Opcode },
5307 { Bad_Opcode },
5308 { VEX_LEN_TABLE (VEX_LEN_0F3A6A_P_2) },
5311 /* PREFIX_VEX_0F3A6B */
5313 { Bad_Opcode },
5314 { Bad_Opcode },
5315 { VEX_LEN_TABLE (VEX_LEN_0F3A6B_P_2) },
5318 /* PREFIX_VEX_0F3A6C */
5320 { Bad_Opcode },
5321 { Bad_Opcode },
5322 { "vfmsubps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5325 /* PREFIX_VEX_0F3A6D */
5327 { Bad_Opcode },
5328 { Bad_Opcode },
5329 { "vfmsubpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5332 /* PREFIX_VEX_0F3A6E */
5334 { Bad_Opcode },
5335 { Bad_Opcode },
5336 { VEX_LEN_TABLE (VEX_LEN_0F3A6E_P_2) },
5339 /* PREFIX_VEX_0F3A6F */
5341 { Bad_Opcode },
5342 { Bad_Opcode },
5343 { VEX_LEN_TABLE (VEX_LEN_0F3A6F_P_2) },
5346 /* PREFIX_VEX_0F3A78 */
5348 { Bad_Opcode },
5349 { Bad_Opcode },
5350 { "vfnmaddps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5353 /* PREFIX_VEX_0F3A79 */
5355 { Bad_Opcode },
5356 { Bad_Opcode },
5357 { "vfnmaddpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5360 /* PREFIX_VEX_0F3A7A */
5362 { Bad_Opcode },
5363 { Bad_Opcode },
5364 { VEX_LEN_TABLE (VEX_LEN_0F3A7A_P_2) },
5367 /* PREFIX_VEX_0F3A7B */
5369 { Bad_Opcode },
5370 { Bad_Opcode },
5371 { VEX_LEN_TABLE (VEX_LEN_0F3A7B_P_2) },
5374 /* PREFIX_VEX_0F3A7C */
5376 { Bad_Opcode },
5377 { Bad_Opcode },
5378 { "vfnmsubps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5379 { Bad_Opcode },
5382 /* PREFIX_VEX_0F3A7D */
5384 { Bad_Opcode },
5385 { Bad_Opcode },
5386 { "vfnmsubpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5389 /* PREFIX_VEX_0F3A7E */
5391 { Bad_Opcode },
5392 { Bad_Opcode },
5393 { VEX_LEN_TABLE (VEX_LEN_0F3A7E_P_2) },
5396 /* PREFIX_VEX_0F3A7F */
5398 { Bad_Opcode },
5399 { Bad_Opcode },
5400 { VEX_LEN_TABLE (VEX_LEN_0F3A7F_P_2) },
5403 /* PREFIX_VEX_0F3ADF */
5405 { Bad_Opcode },
5406 { Bad_Opcode },
5407 { VEX_LEN_TABLE (VEX_LEN_0F3ADF_P_2) },
5411 static const struct dis386 x86_64_table[][2] = {
5412 /* X86_64_06 */
5414 { "pushP", { es } },
5417 /* X86_64_07 */
5419 { "popP", { es } },
5422 /* X86_64_0D */
5424 { "pushP", { cs } },
5427 /* X86_64_16 */
5429 { "pushP", { ss } },
5432 /* X86_64_17 */
5434 { "popP", { ss } },
5437 /* X86_64_1E */
5439 { "pushP", { ds } },
5442 /* X86_64_1F */
5444 { "popP", { ds } },
5447 /* X86_64_27 */
5449 { "daa", { XX } },
5452 /* X86_64_2F */
5454 { "das", { XX } },
5457 /* X86_64_37 */
5459 { "aaa", { XX } },
5462 /* X86_64_3F */
5464 { "aas", { XX } },
5467 /* X86_64_60 */
5469 { "pushaP", { XX } },
5472 /* X86_64_61 */
5474 { "popaP", { XX } },
5477 /* X86_64_62 */
5479 { MOD_TABLE (MOD_62_32BIT) },
5482 /* X86_64_63 */
5484 { "arpl", { Ew, Gw } },
5485 { "movs{lq|xd}", { Gv, Ed } },
5488 /* X86_64_6D */
5490 { "ins{R|}", { Yzr, indirDX } },
5491 { "ins{G|}", { Yzr, indirDX } },
5494 /* X86_64_6F */
5496 { "outs{R|}", { indirDXr, Xz } },
5497 { "outs{G|}", { indirDXr, Xz } },
5500 /* X86_64_9A */
5502 { "Jcall{T|}", { Ap } },
5505 /* X86_64_C4 */
5507 { MOD_TABLE (MOD_C4_32BIT) },
5508 { VEX_C4_TABLE (VEX_0F) },
5511 /* X86_64_C5 */
5513 { MOD_TABLE (MOD_C5_32BIT) },
5514 { VEX_C5_TABLE (VEX_0F) },
5517 /* X86_64_CE */
5519 { "into", { XX } },
5522 /* X86_64_D4 */
5524 { "aam", { sIb } },
5527 /* X86_64_D5 */
5529 { "aad", { sIb } },
5532 /* X86_64_EA */
5534 { "Jjmp{T|}", { Ap } },
5537 /* X86_64_0F01_REG_0 */
5539 { "sgdt{Q|IQ}", { M } },
5540 { "sgdt", { M } },
5543 /* X86_64_0F01_REG_1 */
5545 { "sidt{Q|IQ}", { M } },
5546 { "sidt", { M } },
5549 /* X86_64_0F01_REG_2 */
5551 { "lgdt{Q|Q}", { M } },
5552 { "lgdt", { M } },
5555 /* X86_64_0F01_REG_3 */
5557 { "lidt{Q|Q}", { M } },
5558 { "lidt", { M } },
5562 static const struct dis386 three_byte_table[][256] = {
5564 /* THREE_BYTE_0F38 */
5566 /* 00 */
5567 { "pshufb", { MX, EM } },
5568 { "phaddw", { MX, EM } },
5569 { "phaddd", { MX, EM } },
5570 { "phaddsw", { MX, EM } },
5571 { "pmaddubsw", { MX, EM } },
5572 { "phsubw", { MX, EM } },
5573 { "phsubd", { MX, EM } },
5574 { "phsubsw", { MX, EM } },
5575 /* 08 */
5576 { "psignb", { MX, EM } },
5577 { "psignw", { MX, EM } },
5578 { "psignd", { MX, EM } },
5579 { "pmulhrsw", { MX, EM } },
5580 { Bad_Opcode },
5581 { Bad_Opcode },
5582 { Bad_Opcode },
5583 { Bad_Opcode },
5584 /* 10 */
5585 { PREFIX_TABLE (PREFIX_0F3810) },
5586 { Bad_Opcode },
5587 { Bad_Opcode },
5588 { Bad_Opcode },
5589 { PREFIX_TABLE (PREFIX_0F3814) },
5590 { PREFIX_TABLE (PREFIX_0F3815) },
5591 { Bad_Opcode },
5592 { PREFIX_TABLE (PREFIX_0F3817) },
5593 /* 18 */
5594 { Bad_Opcode },
5595 { Bad_Opcode },
5596 { Bad_Opcode },
5597 { Bad_Opcode },
5598 { "pabsb", { MX, EM } },
5599 { "pabsw", { MX, EM } },
5600 { "pabsd", { MX, EM } },
5601 { Bad_Opcode },
5602 /* 20 */
5603 { PREFIX_TABLE (PREFIX_0F3820) },
5604 { PREFIX_TABLE (PREFIX_0F3821) },
5605 { PREFIX_TABLE (PREFIX_0F3822) },
5606 { PREFIX_TABLE (PREFIX_0F3823) },
5607 { PREFIX_TABLE (PREFIX_0F3824) },
5608 { PREFIX_TABLE (PREFIX_0F3825) },
5609 { Bad_Opcode },
5610 { Bad_Opcode },
5611 /* 28 */
5612 { PREFIX_TABLE (PREFIX_0F3828) },
5613 { PREFIX_TABLE (PREFIX_0F3829) },
5614 { PREFIX_TABLE (PREFIX_0F382A) },
5615 { PREFIX_TABLE (PREFIX_0F382B) },
5616 { Bad_Opcode },
5617 { Bad_Opcode },
5618 { Bad_Opcode },
5619 { Bad_Opcode },
5620 /* 30 */
5621 { PREFIX_TABLE (PREFIX_0F3830) },
5622 { PREFIX_TABLE (PREFIX_0F3831) },
5623 { PREFIX_TABLE (PREFIX_0F3832) },
5624 { PREFIX_TABLE (PREFIX_0F3833) },
5625 { PREFIX_TABLE (PREFIX_0F3834) },
5626 { PREFIX_TABLE (PREFIX_0F3835) },
5627 { Bad_Opcode },
5628 { PREFIX_TABLE (PREFIX_0F3837) },
5629 /* 38 */
5630 { PREFIX_TABLE (PREFIX_0F3838) },
5631 { PREFIX_TABLE (PREFIX_0F3839) },
5632 { PREFIX_TABLE (PREFIX_0F383A) },
5633 { PREFIX_TABLE (PREFIX_0F383B) },
5634 { PREFIX_TABLE (PREFIX_0F383C) },
5635 { PREFIX_TABLE (PREFIX_0F383D) },
5636 { PREFIX_TABLE (PREFIX_0F383E) },
5637 { PREFIX_TABLE (PREFIX_0F383F) },
5638 /* 40 */
5639 { PREFIX_TABLE (PREFIX_0F3840) },
5640 { PREFIX_TABLE (PREFIX_0F3841) },
5641 { Bad_Opcode },
5642 { Bad_Opcode },
5643 { Bad_Opcode },
5644 { Bad_Opcode },
5645 { Bad_Opcode },
5646 { Bad_Opcode },
5647 /* 48 */
5648 { Bad_Opcode },
5649 { Bad_Opcode },
5650 { Bad_Opcode },
5651 { Bad_Opcode },
5652 { Bad_Opcode },
5653 { Bad_Opcode },
5654 { Bad_Opcode },
5655 { Bad_Opcode },
5656 /* 50 */
5657 { Bad_Opcode },
5658 { Bad_Opcode },
5659 { Bad_Opcode },
5660 { Bad_Opcode },
5661 { Bad_Opcode },
5662 { Bad_Opcode },
5663 { Bad_Opcode },
5664 { Bad_Opcode },
5665 /* 58 */
5666 { Bad_Opcode },
5667 { Bad_Opcode },
5668 { Bad_Opcode },
5669 { Bad_Opcode },
5670 { Bad_Opcode },
5671 { Bad_Opcode },
5672 { Bad_Opcode },
5673 { Bad_Opcode },
5674 /* 60 */
5675 { Bad_Opcode },
5676 { Bad_Opcode },
5677 { Bad_Opcode },
5678 { Bad_Opcode },
5679 { Bad_Opcode },
5680 { Bad_Opcode },
5681 { Bad_Opcode },
5682 { Bad_Opcode },
5683 /* 68 */
5684 { Bad_Opcode },
5685 { Bad_Opcode },
5686 { Bad_Opcode },
5687 { Bad_Opcode },
5688 { Bad_Opcode },
5689 { Bad_Opcode },
5690 { Bad_Opcode },
5691 { Bad_Opcode },
5692 /* 70 */
5693 { Bad_Opcode },
5694 { Bad_Opcode },
5695 { Bad_Opcode },
5696 { Bad_Opcode },
5697 { Bad_Opcode },
5698 { Bad_Opcode },
5699 { Bad_Opcode },
5700 { Bad_Opcode },
5701 /* 78 */
5702 { Bad_Opcode },
5703 { Bad_Opcode },
5704 { Bad_Opcode },
5705 { Bad_Opcode },
5706 { Bad_Opcode },
5707 { Bad_Opcode },
5708 { Bad_Opcode },
5709 { Bad_Opcode },
5710 /* 80 */
5711 { PREFIX_TABLE (PREFIX_0F3880) },
5712 { PREFIX_TABLE (PREFIX_0F3881) },
5713 { Bad_Opcode },
5714 { Bad_Opcode },
5715 { Bad_Opcode },
5716 { Bad_Opcode },
5717 { Bad_Opcode },
5718 { Bad_Opcode },
5719 /* 88 */
5720 { Bad_Opcode },
5721 { Bad_Opcode },
5722 { Bad_Opcode },
5723 { Bad_Opcode },
5724 { Bad_Opcode },
5725 { Bad_Opcode },
5726 { Bad_Opcode },
5727 { Bad_Opcode },
5728 /* 90 */
5729 { Bad_Opcode },
5730 { Bad_Opcode },
5731 { Bad_Opcode },
5732 { Bad_Opcode },
5733 { Bad_Opcode },
5734 { Bad_Opcode },
5735 { Bad_Opcode },
5736 { Bad_Opcode },
5737 /* 98 */
5738 { Bad_Opcode },
5739 { Bad_Opcode },
5740 { Bad_Opcode },
5741 { Bad_Opcode },
5742 { Bad_Opcode },
5743 { Bad_Opcode },
5744 { Bad_Opcode },
5745 { Bad_Opcode },
5746 /* a0 */
5747 { Bad_Opcode },
5748 { Bad_Opcode },
5749 { Bad_Opcode },
5750 { Bad_Opcode },
5751 { Bad_Opcode },
5752 { Bad_Opcode },
5753 { Bad_Opcode },
5754 { Bad_Opcode },
5755 /* a8 */
5756 { Bad_Opcode },
5757 { Bad_Opcode },
5758 { Bad_Opcode },
5759 { Bad_Opcode },
5760 { Bad_Opcode },
5761 { Bad_Opcode },
5762 { Bad_Opcode },
5763 { Bad_Opcode },
5764 /* b0 */
5765 { Bad_Opcode },
5766 { Bad_Opcode },
5767 { Bad_Opcode },
5768 { Bad_Opcode },
5769 { Bad_Opcode },
5770 { Bad_Opcode },
5771 { Bad_Opcode },
5772 { Bad_Opcode },
5773 /* b8 */
5774 { Bad_Opcode },
5775 { Bad_Opcode },
5776 { Bad_Opcode },
5777 { Bad_Opcode },
5778 { Bad_Opcode },
5779 { Bad_Opcode },
5780 { Bad_Opcode },
5781 { Bad_Opcode },
5782 /* c0 */
5783 { Bad_Opcode },
5784 { Bad_Opcode },
5785 { Bad_Opcode },
5786 { Bad_Opcode },
5787 { Bad_Opcode },
5788 { Bad_Opcode },
5789 { Bad_Opcode },
5790 { Bad_Opcode },
5791 /* c8 */
5792 { Bad_Opcode },
5793 { Bad_Opcode },
5794 { Bad_Opcode },
5795 { Bad_Opcode },
5796 { Bad_Opcode },
5797 { Bad_Opcode },
5798 { Bad_Opcode },
5799 { Bad_Opcode },
5800 /* d0 */
5801 { Bad_Opcode },
5802 { Bad_Opcode },
5803 { Bad_Opcode },
5804 { Bad_Opcode },
5805 { Bad_Opcode },
5806 { Bad_Opcode },
5807 { Bad_Opcode },
5808 { Bad_Opcode },
5809 /* d8 */
5810 { Bad_Opcode },
5811 { Bad_Opcode },
5812 { Bad_Opcode },
5813 { PREFIX_TABLE (PREFIX_0F38DB) },
5814 { PREFIX_TABLE (PREFIX_0F38DC) },
5815 { PREFIX_TABLE (PREFIX_0F38DD) },
5816 { PREFIX_TABLE (PREFIX_0F38DE) },
5817 { PREFIX_TABLE (PREFIX_0F38DF) },
5818 /* e0 */
5819 { Bad_Opcode },
5820 { Bad_Opcode },
5821 { Bad_Opcode },
5822 { Bad_Opcode },
5823 { Bad_Opcode },
5824 { Bad_Opcode },
5825 { Bad_Opcode },
5826 { Bad_Opcode },
5827 /* e8 */
5828 { Bad_Opcode },
5829 { Bad_Opcode },
5830 { Bad_Opcode },
5831 { Bad_Opcode },
5832 { Bad_Opcode },
5833 { Bad_Opcode },
5834 { Bad_Opcode },
5835 { Bad_Opcode },
5836 /* f0 */
5837 { PREFIX_TABLE (PREFIX_0F38F0) },
5838 { PREFIX_TABLE (PREFIX_0F38F1) },
5839 { Bad_Opcode },
5840 { Bad_Opcode },
5841 { Bad_Opcode },
5842 { Bad_Opcode },
5843 { Bad_Opcode },
5844 { Bad_Opcode },
5845 /* f8 */
5846 { Bad_Opcode },
5847 { Bad_Opcode },
5848 { Bad_Opcode },
5849 { Bad_Opcode },
5850 { Bad_Opcode },
5851 { Bad_Opcode },
5852 { Bad_Opcode },
5853 { Bad_Opcode },
5855 /* THREE_BYTE_0F3A */
5857 /* 00 */
5858 { Bad_Opcode },
5859 { Bad_Opcode },
5860 { Bad_Opcode },
5861 { Bad_Opcode },
5862 { Bad_Opcode },
5863 { Bad_Opcode },
5864 { Bad_Opcode },
5865 { Bad_Opcode },
5866 /* 08 */
5867 { PREFIX_TABLE (PREFIX_0F3A08) },
5868 { PREFIX_TABLE (PREFIX_0F3A09) },
5869 { PREFIX_TABLE (PREFIX_0F3A0A) },
5870 { PREFIX_TABLE (PREFIX_0F3A0B) },
5871 { PREFIX_TABLE (PREFIX_0F3A0C) },
5872 { PREFIX_TABLE (PREFIX_0F3A0D) },
5873 { PREFIX_TABLE (PREFIX_0F3A0E) },
5874 { "palignr", { MX, EM, Ib } },
5875 /* 10 */
5876 { Bad_Opcode },
5877 { Bad_Opcode },
5878 { Bad_Opcode },
5879 { Bad_Opcode },
5880 { PREFIX_TABLE (PREFIX_0F3A14) },
5881 { PREFIX_TABLE (PREFIX_0F3A15) },
5882 { PREFIX_TABLE (PREFIX_0F3A16) },
5883 { PREFIX_TABLE (PREFIX_0F3A17) },
5884 /* 18 */
5885 { Bad_Opcode },
5886 { Bad_Opcode },
5887 { Bad_Opcode },
5888 { Bad_Opcode },
5889 { Bad_Opcode },
5890 { Bad_Opcode },
5891 { Bad_Opcode },
5892 { Bad_Opcode },
5893 /* 20 */
5894 { PREFIX_TABLE (PREFIX_0F3A20) },
5895 { PREFIX_TABLE (PREFIX_0F3A21) },
5896 { PREFIX_TABLE (PREFIX_0F3A22) },
5897 { Bad_Opcode },
5898 { Bad_Opcode },
5899 { Bad_Opcode },
5900 { Bad_Opcode },
5901 { Bad_Opcode },
5902 /* 28 */
5903 { Bad_Opcode },
5904 { Bad_Opcode },
5905 { Bad_Opcode },
5906 { Bad_Opcode },
5907 { Bad_Opcode },
5908 { Bad_Opcode },
5909 { Bad_Opcode },
5910 { Bad_Opcode },
5911 /* 30 */
5912 { Bad_Opcode },
5913 { Bad_Opcode },
5914 { Bad_Opcode },
5915 { Bad_Opcode },
5916 { Bad_Opcode },
5917 { Bad_Opcode },
5918 { Bad_Opcode },
5919 { Bad_Opcode },
5920 /* 38 */
5921 { Bad_Opcode },
5922 { Bad_Opcode },
5923 { Bad_Opcode },
5924 { Bad_Opcode },
5925 { Bad_Opcode },
5926 { Bad_Opcode },
5927 { Bad_Opcode },
5928 { Bad_Opcode },
5929 /* 40 */
5930 { PREFIX_TABLE (PREFIX_0F3A40) },
5931 { PREFIX_TABLE (PREFIX_0F3A41) },
5932 { PREFIX_TABLE (PREFIX_0F3A42) },
5933 { Bad_Opcode },
5934 { PREFIX_TABLE (PREFIX_0F3A44) },
5935 { Bad_Opcode },
5936 { Bad_Opcode },
5937 { Bad_Opcode },
5938 /* 48 */
5939 { Bad_Opcode },
5940 { Bad_Opcode },
5941 { Bad_Opcode },
5942 { Bad_Opcode },
5943 { Bad_Opcode },
5944 { Bad_Opcode },
5945 { Bad_Opcode },
5946 { Bad_Opcode },
5947 /* 50 */
5948 { Bad_Opcode },
5949 { Bad_Opcode },
5950 { Bad_Opcode },
5951 { Bad_Opcode },
5952 { Bad_Opcode },
5953 { Bad_Opcode },
5954 { Bad_Opcode },
5955 { Bad_Opcode },
5956 /* 58 */
5957 { Bad_Opcode },
5958 { Bad_Opcode },
5959 { Bad_Opcode },
5960 { Bad_Opcode },
5961 { Bad_Opcode },
5962 { Bad_Opcode },
5963 { Bad_Opcode },
5964 { Bad_Opcode },
5965 /* 60 */
5966 { PREFIX_TABLE (PREFIX_0F3A60) },
5967 { PREFIX_TABLE (PREFIX_0F3A61) },
5968 { PREFIX_TABLE (PREFIX_0F3A62) },
5969 { PREFIX_TABLE (PREFIX_0F3A63) },
5970 { Bad_Opcode },
5971 { Bad_Opcode },
5972 { Bad_Opcode },
5973 { Bad_Opcode },
5974 /* 68 */
5975 { Bad_Opcode },
5976 { Bad_Opcode },
5977 { Bad_Opcode },
5978 { Bad_Opcode },
5979 { Bad_Opcode },
5980 { Bad_Opcode },
5981 { Bad_Opcode },
5982 { Bad_Opcode },
5983 /* 70 */
5984 { Bad_Opcode },
5985 { Bad_Opcode },
5986 { Bad_Opcode },
5987 { Bad_Opcode },
5988 { Bad_Opcode },
5989 { Bad_Opcode },
5990 { Bad_Opcode },
5991 { Bad_Opcode },
5992 /* 78 */
5993 { Bad_Opcode },
5994 { Bad_Opcode },
5995 { Bad_Opcode },
5996 { Bad_Opcode },
5997 { Bad_Opcode },
5998 { Bad_Opcode },
5999 { Bad_Opcode },
6000 { Bad_Opcode },
6001 /* 80 */
6002 { Bad_Opcode },
6003 { Bad_Opcode },
6004 { Bad_Opcode },
6005 { Bad_Opcode },
6006 { Bad_Opcode },
6007 { Bad_Opcode },
6008 { Bad_Opcode },
6009 { Bad_Opcode },
6010 /* 88 */
6011 { Bad_Opcode },
6012 { Bad_Opcode },
6013 { Bad_Opcode },
6014 { Bad_Opcode },
6015 { Bad_Opcode },
6016 { Bad_Opcode },
6017 { Bad_Opcode },
6018 { Bad_Opcode },
6019 /* 90 */
6020 { Bad_Opcode },
6021 { Bad_Opcode },
6022 { Bad_Opcode },
6023 { Bad_Opcode },
6024 { Bad_Opcode },
6025 { Bad_Opcode },
6026 { Bad_Opcode },
6027 { Bad_Opcode },
6028 /* 98 */
6029 { Bad_Opcode },
6030 { Bad_Opcode },
6031 { Bad_Opcode },
6032 { Bad_Opcode },
6033 { Bad_Opcode },
6034 { Bad_Opcode },
6035 { Bad_Opcode },
6036 { Bad_Opcode },
6037 /* a0 */
6038 { Bad_Opcode },
6039 { Bad_Opcode },
6040 { Bad_Opcode },
6041 { Bad_Opcode },
6042 { Bad_Opcode },
6043 { Bad_Opcode },
6044 { Bad_Opcode },
6045 { Bad_Opcode },
6046 /* a8 */
6047 { Bad_Opcode },
6048 { Bad_Opcode },
6049 { Bad_Opcode },
6050 { Bad_Opcode },
6051 { Bad_Opcode },
6052 { Bad_Opcode },
6053 { Bad_Opcode },
6054 { Bad_Opcode },
6055 /* b0 */
6056 { Bad_Opcode },
6057 { Bad_Opcode },
6058 { Bad_Opcode },
6059 { Bad_Opcode },
6060 { Bad_Opcode },
6061 { Bad_Opcode },
6062 { Bad_Opcode },
6063 { Bad_Opcode },
6064 /* b8 */
6065 { Bad_Opcode },
6066 { Bad_Opcode },
6067 { Bad_Opcode },
6068 { Bad_Opcode },
6069 { Bad_Opcode },
6070 { Bad_Opcode },
6071 { Bad_Opcode },
6072 { Bad_Opcode },
6073 /* c0 */
6074 { Bad_Opcode },
6075 { Bad_Opcode },
6076 { Bad_Opcode },
6077 { Bad_Opcode },
6078 { Bad_Opcode },
6079 { Bad_Opcode },
6080 { Bad_Opcode },
6081 { Bad_Opcode },
6082 /* c8 */
6083 { Bad_Opcode },
6084 { Bad_Opcode },
6085 { Bad_Opcode },
6086 { Bad_Opcode },
6087 { Bad_Opcode },
6088 { Bad_Opcode },
6089 { Bad_Opcode },
6090 { Bad_Opcode },
6091 /* d0 */
6092 { Bad_Opcode },
6093 { Bad_Opcode },
6094 { Bad_Opcode },
6095 { Bad_Opcode },
6096 { Bad_Opcode },
6097 { Bad_Opcode },
6098 { Bad_Opcode },
6099 { Bad_Opcode },
6100 /* d8 */
6101 { Bad_Opcode },
6102 { Bad_Opcode },
6103 { Bad_Opcode },
6104 { Bad_Opcode },
6105 { Bad_Opcode },
6106 { Bad_Opcode },
6107 { Bad_Opcode },
6108 { PREFIX_TABLE (PREFIX_0F3ADF) },
6109 /* e0 */
6110 { Bad_Opcode },
6111 { Bad_Opcode },
6112 { Bad_Opcode },
6113 { Bad_Opcode },
6114 { Bad_Opcode },
6115 { Bad_Opcode },
6116 { Bad_Opcode },
6117 { Bad_Opcode },
6118 /* e8 */
6119 { Bad_Opcode },
6120 { Bad_Opcode },
6121 { Bad_Opcode },
6122 { Bad_Opcode },
6123 { Bad_Opcode },
6124 { Bad_Opcode },
6125 { Bad_Opcode },
6126 { Bad_Opcode },
6127 /* f0 */
6128 { Bad_Opcode },
6129 { Bad_Opcode },
6130 { Bad_Opcode },
6131 { Bad_Opcode },
6132 { Bad_Opcode },
6133 { Bad_Opcode },
6134 { Bad_Opcode },
6135 { Bad_Opcode },
6136 /* f8 */
6137 { Bad_Opcode },
6138 { Bad_Opcode },
6139 { Bad_Opcode },
6140 { Bad_Opcode },
6141 { Bad_Opcode },
6142 { Bad_Opcode },
6143 { Bad_Opcode },
6144 { Bad_Opcode },
6147 /* THREE_BYTE_0F7A */
6149 /* 00 */
6150 { Bad_Opcode },
6151 { Bad_Opcode },
6152 { Bad_Opcode },
6153 { Bad_Opcode },
6154 { Bad_Opcode },
6155 { Bad_Opcode },
6156 { Bad_Opcode },
6157 { Bad_Opcode },
6158 /* 08 */
6159 { Bad_Opcode },
6160 { Bad_Opcode },
6161 { Bad_Opcode },
6162 { Bad_Opcode },
6163 { Bad_Opcode },
6164 { Bad_Opcode },
6165 { Bad_Opcode },
6166 { Bad_Opcode },
6167 /* 10 */
6168 { Bad_Opcode },
6169 { Bad_Opcode },
6170 { Bad_Opcode },
6171 { Bad_Opcode },
6172 { Bad_Opcode },
6173 { Bad_Opcode },
6174 { Bad_Opcode },
6175 { Bad_Opcode },
6176 /* 18 */
6177 { Bad_Opcode },
6178 { Bad_Opcode },
6179 { Bad_Opcode },
6180 { Bad_Opcode },
6181 { Bad_Opcode },
6182 { Bad_Opcode },
6183 { Bad_Opcode },
6184 { Bad_Opcode },
6185 /* 20 */
6186 { "ptest", { XX } },
6187 { Bad_Opcode },
6188 { Bad_Opcode },
6189 { Bad_Opcode },
6190 { Bad_Opcode },
6191 { Bad_Opcode },
6192 { Bad_Opcode },
6193 { Bad_Opcode },
6194 /* 28 */
6195 { Bad_Opcode },
6196 { Bad_Opcode },
6197 { Bad_Opcode },
6198 { Bad_Opcode },
6199 { Bad_Opcode },
6200 { Bad_Opcode },
6201 { Bad_Opcode },
6202 { Bad_Opcode },
6203 /* 30 */
6204 { Bad_Opcode },
6205 { Bad_Opcode },
6206 { Bad_Opcode },
6207 { Bad_Opcode },
6208 { Bad_Opcode },
6209 { Bad_Opcode },
6210 { Bad_Opcode },
6211 { Bad_Opcode },
6212 /* 38 */
6213 { Bad_Opcode },
6214 { Bad_Opcode },
6215 { Bad_Opcode },
6216 { Bad_Opcode },
6217 { Bad_Opcode },
6218 { Bad_Opcode },
6219 { Bad_Opcode },
6220 { Bad_Opcode },
6221 /* 40 */
6222 { Bad_Opcode },
6223 { "phaddbw", { XM, EXq } },
6224 { "phaddbd", { XM, EXq } },
6225 { "phaddbq", { XM, EXq } },
6226 { Bad_Opcode },
6227 { Bad_Opcode },
6228 { "phaddwd", { XM, EXq } },
6229 { "phaddwq", { XM, EXq } },
6230 /* 48 */
6231 { Bad_Opcode },
6232 { Bad_Opcode },
6233 { Bad_Opcode },
6234 { "phadddq", { XM, EXq } },
6235 { Bad_Opcode },
6236 { Bad_Opcode },
6237 { Bad_Opcode },
6238 { Bad_Opcode },
6239 /* 50 */
6240 { Bad_Opcode },
6241 { "phaddubw", { XM, EXq } },
6242 { "phaddubd", { XM, EXq } },
6243 { "phaddubq", { XM, EXq } },
6244 { Bad_Opcode },
6245 { Bad_Opcode },
6246 { "phadduwd", { XM, EXq } },
6247 { "phadduwq", { XM, EXq } },
6248 /* 58 */
6249 { Bad_Opcode },
6250 { Bad_Opcode },
6251 { Bad_Opcode },
6252 { "phaddudq", { XM, EXq } },
6253 { Bad_Opcode },
6254 { Bad_Opcode },
6255 { Bad_Opcode },
6256 { Bad_Opcode },
6257 /* 60 */
6258 { Bad_Opcode },
6259 { "phsubbw", { XM, EXq } },
6260 { "phsubbd", { XM, EXq } },
6261 { "phsubbq", { XM, EXq } },
6262 { Bad_Opcode },
6263 { Bad_Opcode },
6264 { Bad_Opcode },
6265 { Bad_Opcode },
6266 /* 68 */
6267 { Bad_Opcode },
6268 { Bad_Opcode },
6269 { Bad_Opcode },
6270 { Bad_Opcode },
6271 { Bad_Opcode },
6272 { Bad_Opcode },
6273 { Bad_Opcode },
6274 { Bad_Opcode },
6275 /* 70 */
6276 { Bad_Opcode },
6277 { Bad_Opcode },
6278 { Bad_Opcode },
6279 { Bad_Opcode },
6280 { Bad_Opcode },
6281 { Bad_Opcode },
6282 { Bad_Opcode },
6283 { Bad_Opcode },
6284 /* 78 */
6285 { Bad_Opcode },
6286 { Bad_Opcode },
6287 { Bad_Opcode },
6288 { Bad_Opcode },
6289 { Bad_Opcode },
6290 { Bad_Opcode },
6291 { Bad_Opcode },
6292 { Bad_Opcode },
6293 /* 80 */
6294 { Bad_Opcode },
6295 { Bad_Opcode },
6296 { Bad_Opcode },
6297 { Bad_Opcode },
6298 { Bad_Opcode },
6299 { Bad_Opcode },
6300 { Bad_Opcode },
6301 { Bad_Opcode },
6302 /* 88 */
6303 { Bad_Opcode },
6304 { Bad_Opcode },
6305 { Bad_Opcode },
6306 { Bad_Opcode },
6307 { Bad_Opcode },
6308 { Bad_Opcode },
6309 { Bad_Opcode },
6310 { Bad_Opcode },
6311 /* 90 */
6312 { Bad_Opcode },
6313 { Bad_Opcode },
6314 { Bad_Opcode },
6315 { Bad_Opcode },
6316 { Bad_Opcode },
6317 { Bad_Opcode },
6318 { Bad_Opcode },
6319 { Bad_Opcode },
6320 /* 98 */
6321 { Bad_Opcode },
6322 { Bad_Opcode },
6323 { Bad_Opcode },
6324 { Bad_Opcode },
6325 { Bad_Opcode },
6326 { Bad_Opcode },
6327 { Bad_Opcode },
6328 { Bad_Opcode },
6329 /* a0 */
6330 { Bad_Opcode },
6331 { Bad_Opcode },
6332 { Bad_Opcode },
6333 { Bad_Opcode },
6334 { Bad_Opcode },
6335 { Bad_Opcode },
6336 { Bad_Opcode },
6337 { Bad_Opcode },
6338 /* a8 */
6339 { Bad_Opcode },
6340 { Bad_Opcode },
6341 { Bad_Opcode },
6342 { Bad_Opcode },
6343 { Bad_Opcode },
6344 { Bad_Opcode },
6345 { Bad_Opcode },
6346 { Bad_Opcode },
6347 /* b0 */
6348 { Bad_Opcode },
6349 { Bad_Opcode },
6350 { Bad_Opcode },
6351 { Bad_Opcode },
6352 { Bad_Opcode },
6353 { Bad_Opcode },
6354 { Bad_Opcode },
6355 { Bad_Opcode },
6356 /* b8 */
6357 { Bad_Opcode },
6358 { Bad_Opcode },
6359 { Bad_Opcode },
6360 { Bad_Opcode },
6361 { Bad_Opcode },
6362 { Bad_Opcode },
6363 { Bad_Opcode },
6364 { Bad_Opcode },
6365 /* c0 */
6366 { Bad_Opcode },
6367 { Bad_Opcode },
6368 { Bad_Opcode },
6369 { Bad_Opcode },
6370 { Bad_Opcode },
6371 { Bad_Opcode },
6372 { Bad_Opcode },
6373 { Bad_Opcode },
6374 /* c8 */
6375 { Bad_Opcode },
6376 { Bad_Opcode },
6377 { Bad_Opcode },
6378 { Bad_Opcode },
6379 { Bad_Opcode },
6380 { Bad_Opcode },
6381 { Bad_Opcode },
6382 { Bad_Opcode },
6383 /* d0 */
6384 { Bad_Opcode },
6385 { Bad_Opcode },
6386 { Bad_Opcode },
6387 { Bad_Opcode },
6388 { Bad_Opcode },
6389 { Bad_Opcode },
6390 { Bad_Opcode },
6391 { Bad_Opcode },
6392 /* d8 */
6393 { Bad_Opcode },
6394 { Bad_Opcode },
6395 { Bad_Opcode },
6396 { Bad_Opcode },
6397 { Bad_Opcode },
6398 { Bad_Opcode },
6399 { Bad_Opcode },
6400 { Bad_Opcode },
6401 /* e0 */
6402 { Bad_Opcode },
6403 { Bad_Opcode },
6404 { Bad_Opcode },
6405 { Bad_Opcode },
6406 { Bad_Opcode },
6407 { Bad_Opcode },
6408 { Bad_Opcode },
6409 { Bad_Opcode },
6410 /* e8 */
6411 { Bad_Opcode },
6412 { Bad_Opcode },
6413 { Bad_Opcode },
6414 { Bad_Opcode },
6415 { Bad_Opcode },
6416 { Bad_Opcode },
6417 { Bad_Opcode },
6418 { Bad_Opcode },
6419 /* f0 */
6420 { Bad_Opcode },
6421 { Bad_Opcode },
6422 { Bad_Opcode },
6423 { Bad_Opcode },
6424 { Bad_Opcode },
6425 { Bad_Opcode },
6426 { Bad_Opcode },
6427 { Bad_Opcode },
6428 /* f8 */
6429 { Bad_Opcode },
6430 { Bad_Opcode },
6431 { Bad_Opcode },
6432 { Bad_Opcode },
6433 { Bad_Opcode },
6434 { Bad_Opcode },
6435 { Bad_Opcode },
6436 { Bad_Opcode },
6440 static const struct dis386 xop_table[][256] = {
6441 /* XOP_08 */
6443 /* 00 */
6444 { Bad_Opcode },
6445 { Bad_Opcode },
6446 { Bad_Opcode },
6447 { Bad_Opcode },
6448 { Bad_Opcode },
6449 { Bad_Opcode },
6450 { Bad_Opcode },
6451 { Bad_Opcode },
6452 /* 08 */
6453 { Bad_Opcode },
6454 { Bad_Opcode },
6455 { Bad_Opcode },
6456 { Bad_Opcode },
6457 { Bad_Opcode },
6458 { Bad_Opcode },
6459 { Bad_Opcode },
6460 { Bad_Opcode },
6461 /* 10 */
6462 { Bad_Opcode },
6463 { Bad_Opcode },
6464 { Bad_Opcode },
6465 { Bad_Opcode },
6466 { Bad_Opcode },
6467 { Bad_Opcode },
6468 { Bad_Opcode },
6469 { Bad_Opcode },
6470 /* 18 */
6471 { Bad_Opcode },
6472 { Bad_Opcode },
6473 { Bad_Opcode },
6474 { Bad_Opcode },
6475 { Bad_Opcode },
6476 { Bad_Opcode },
6477 { Bad_Opcode },
6478 { Bad_Opcode },
6479 /* 20 */
6480 { Bad_Opcode },
6481 { Bad_Opcode },
6482 { Bad_Opcode },
6483 { Bad_Opcode },
6484 { Bad_Opcode },
6485 { Bad_Opcode },
6486 { Bad_Opcode },
6487 { Bad_Opcode },
6488 /* 28 */
6489 { Bad_Opcode },
6490 { Bad_Opcode },
6491 { Bad_Opcode },
6492 { Bad_Opcode },
6493 { Bad_Opcode },
6494 { Bad_Opcode },
6495 { Bad_Opcode },
6496 { Bad_Opcode },
6497 /* 30 */
6498 { Bad_Opcode },
6499 { Bad_Opcode },
6500 { Bad_Opcode },
6501 { Bad_Opcode },
6502 { Bad_Opcode },
6503 { Bad_Opcode },
6504 { Bad_Opcode },
6505 { Bad_Opcode },
6506 /* 38 */
6507 { Bad_Opcode },
6508 { Bad_Opcode },
6509 { Bad_Opcode },
6510 { Bad_Opcode },
6511 { Bad_Opcode },
6512 { Bad_Opcode },
6513 { Bad_Opcode },
6514 { Bad_Opcode },
6515 /* 40 */
6516 { Bad_Opcode },
6517 { Bad_Opcode },
6518 { Bad_Opcode },
6519 { Bad_Opcode },
6520 { Bad_Opcode },
6521 { Bad_Opcode },
6522 { Bad_Opcode },
6523 { Bad_Opcode },
6524 /* 48 */
6525 { Bad_Opcode },
6526 { Bad_Opcode },
6527 { Bad_Opcode },
6528 { Bad_Opcode },
6529 { Bad_Opcode },
6530 { Bad_Opcode },
6531 { Bad_Opcode },
6532 { Bad_Opcode },
6533 /* 50 */
6534 { Bad_Opcode },
6535 { Bad_Opcode },
6536 { Bad_Opcode },
6537 { Bad_Opcode },
6538 { Bad_Opcode },
6539 { Bad_Opcode },
6540 { Bad_Opcode },
6541 { Bad_Opcode },
6542 /* 58 */
6543 { Bad_Opcode },
6544 { Bad_Opcode },
6545 { Bad_Opcode },
6546 { Bad_Opcode },
6547 { Bad_Opcode },
6548 { Bad_Opcode },
6549 { Bad_Opcode },
6550 { Bad_Opcode },
6551 /* 60 */
6552 { Bad_Opcode },
6553 { Bad_Opcode },
6554 { Bad_Opcode },
6555 { Bad_Opcode },
6556 { Bad_Opcode },
6557 { Bad_Opcode },
6558 { Bad_Opcode },
6559 { Bad_Opcode },
6560 /* 68 */
6561 { Bad_Opcode },
6562 { Bad_Opcode },
6563 { Bad_Opcode },
6564 { Bad_Opcode },
6565 { Bad_Opcode },
6566 { Bad_Opcode },
6567 { Bad_Opcode },
6568 { Bad_Opcode },
6569 /* 70 */
6570 { Bad_Opcode },
6571 { Bad_Opcode },
6572 { Bad_Opcode },
6573 { Bad_Opcode },
6574 { Bad_Opcode },
6575 { Bad_Opcode },
6576 { Bad_Opcode },
6577 { Bad_Opcode },
6578 /* 78 */
6579 { Bad_Opcode },
6580 { Bad_Opcode },
6581 { Bad_Opcode },
6582 { Bad_Opcode },
6583 { Bad_Opcode },
6584 { Bad_Opcode },
6585 { Bad_Opcode },
6586 { Bad_Opcode },
6587 /* 80 */
6588 { Bad_Opcode },
6589 { Bad_Opcode },
6590 { Bad_Opcode },
6591 { Bad_Opcode },
6592 { Bad_Opcode },
6593 { "vpmacssww", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6594 { "vpmacsswd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6595 { "vpmacssdql", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6596 /* 88 */
6597 { Bad_Opcode },
6598 { Bad_Opcode },
6599 { Bad_Opcode },
6600 { Bad_Opcode },
6601 { Bad_Opcode },
6602 { Bad_Opcode },
6603 { "vpmacssdd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6604 { "vpmacssdqh", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6605 /* 90 */
6606 { Bad_Opcode },
6607 { Bad_Opcode },
6608 { Bad_Opcode },
6609 { Bad_Opcode },
6610 { Bad_Opcode },
6611 { "vpmacsww", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6612 { "vpmacswd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6613 { "vpmacsdql", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6614 /* 98 */
6615 { Bad_Opcode },
6616 { Bad_Opcode },
6617 { Bad_Opcode },
6618 { Bad_Opcode },
6619 { Bad_Opcode },
6620 { Bad_Opcode },
6621 { "vpmacsdd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6622 { "vpmacsdqh", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6623 /* a0 */
6624 { Bad_Opcode },
6625 { Bad_Opcode },
6626 { "vpcmov", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6627 { "vpperm", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6628 { Bad_Opcode },
6629 { Bad_Opcode },
6630 { "vpmadcsswd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6631 { Bad_Opcode },
6632 /* a8 */
6633 { Bad_Opcode },
6634 { Bad_Opcode },
6635 { Bad_Opcode },
6636 { Bad_Opcode },
6637 { Bad_Opcode },
6638 { Bad_Opcode },
6639 { Bad_Opcode },
6640 { Bad_Opcode },
6641 /* b0 */
6642 { Bad_Opcode },
6643 { Bad_Opcode },
6644 { Bad_Opcode },
6645 { Bad_Opcode },
6646 { Bad_Opcode },
6647 { Bad_Opcode },
6648 { "vpmadcswd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6649 { Bad_Opcode },
6650 /* b8 */
6651 { Bad_Opcode },
6652 { Bad_Opcode },
6653 { Bad_Opcode },
6654 { Bad_Opcode },
6655 { Bad_Opcode },
6656 { Bad_Opcode },
6657 { Bad_Opcode },
6658 { Bad_Opcode },
6659 /* c0 */
6660 { "vprotb", { XM, Vex_2src_1, Ib } },
6661 { "vprotw", { XM, Vex_2src_1, Ib } },
6662 { "vprotd", { XM, Vex_2src_1, Ib } },
6663 { "vprotq", { XM, Vex_2src_1, Ib } },
6664 { Bad_Opcode },
6665 { Bad_Opcode },
6666 { Bad_Opcode },
6667 { Bad_Opcode },
6668 /* c8 */
6669 { Bad_Opcode },
6670 { Bad_Opcode },
6671 { Bad_Opcode },
6672 { Bad_Opcode },
6673 { "vpcomb", { XM, Vex128, EXx, Ib } },
6674 { "vpcomw", { XM, Vex128, EXx, Ib } },
6675 { "vpcomd", { XM, Vex128, EXx, Ib } },
6676 { "vpcomq", { XM, Vex128, EXx, Ib } },
6677 /* d0 */
6678 { Bad_Opcode },
6679 { Bad_Opcode },
6680 { Bad_Opcode },
6681 { Bad_Opcode },
6682 { Bad_Opcode },
6683 { Bad_Opcode },
6684 { Bad_Opcode },
6685 { Bad_Opcode },
6686 /* d8 */
6687 { Bad_Opcode },
6688 { Bad_Opcode },
6689 { Bad_Opcode },
6690 { Bad_Opcode },
6691 { Bad_Opcode },
6692 { Bad_Opcode },
6693 { Bad_Opcode },
6694 { Bad_Opcode },
6695 /* e0 */
6696 { Bad_Opcode },
6697 { Bad_Opcode },
6698 { Bad_Opcode },
6699 { Bad_Opcode },
6700 { Bad_Opcode },
6701 { Bad_Opcode },
6702 { Bad_Opcode },
6703 { Bad_Opcode },
6704 /* e8 */
6705 { Bad_Opcode },
6706 { Bad_Opcode },
6707 { Bad_Opcode },
6708 { Bad_Opcode },
6709 { "vpcomub", { XM, Vex128, EXx, Ib } },
6710 { "vpcomuw", { XM, Vex128, EXx, Ib } },
6711 { "vpcomud", { XM, Vex128, EXx, Ib } },
6712 { "vpcomuq", { XM, Vex128, EXx, Ib } },
6713 /* f0 */
6714 { Bad_Opcode },
6715 { Bad_Opcode },
6716 { Bad_Opcode },
6717 { Bad_Opcode },
6718 { Bad_Opcode },
6719 { Bad_Opcode },
6720 { Bad_Opcode },
6721 { Bad_Opcode },
6722 /* f8 */
6723 { Bad_Opcode },
6724 { Bad_Opcode },
6725 { Bad_Opcode },
6726 { Bad_Opcode },
6727 { Bad_Opcode },
6728 { Bad_Opcode },
6729 { Bad_Opcode },
6730 { Bad_Opcode },
6732 /* XOP_09 */
6734 /* 00 */
6735 { Bad_Opcode },
6736 { Bad_Opcode },
6737 { Bad_Opcode },
6738 { Bad_Opcode },
6739 { Bad_Opcode },
6740 { Bad_Opcode },
6741 { Bad_Opcode },
6742 { Bad_Opcode },
6743 /* 08 */
6744 { Bad_Opcode },
6745 { Bad_Opcode },
6746 { Bad_Opcode },
6747 { Bad_Opcode },
6748 { Bad_Opcode },
6749 { Bad_Opcode },
6750 { Bad_Opcode },
6751 { Bad_Opcode },
6752 /* 10 */
6753 { Bad_Opcode },
6754 { Bad_Opcode },
6755 { REG_TABLE (REG_XOP_LWPCB) },
6756 { Bad_Opcode },
6757 { Bad_Opcode },
6758 { Bad_Opcode },
6759 { Bad_Opcode },
6760 { Bad_Opcode },
6761 /* 18 */
6762 { Bad_Opcode },
6763 { Bad_Opcode },
6764 { Bad_Opcode },
6765 { Bad_Opcode },
6766 { Bad_Opcode },
6767 { Bad_Opcode },
6768 { Bad_Opcode },
6769 { Bad_Opcode },
6770 /* 20 */
6771 { Bad_Opcode },
6772 { Bad_Opcode },
6773 { Bad_Opcode },
6774 { Bad_Opcode },
6775 { Bad_Opcode },
6776 { Bad_Opcode },
6777 { Bad_Opcode },
6778 { Bad_Opcode },
6779 /* 28 */
6780 { Bad_Opcode },
6781 { Bad_Opcode },
6782 { Bad_Opcode },
6783 { Bad_Opcode },
6784 { Bad_Opcode },
6785 { Bad_Opcode },
6786 { Bad_Opcode },
6787 { Bad_Opcode },
6788 /* 30 */
6789 { Bad_Opcode },
6790 { Bad_Opcode },
6791 { Bad_Opcode },
6792 { Bad_Opcode },
6793 { Bad_Opcode },
6794 { Bad_Opcode },
6795 { Bad_Opcode },
6796 { Bad_Opcode },
6797 /* 38 */
6798 { Bad_Opcode },
6799 { Bad_Opcode },
6800 { Bad_Opcode },
6801 { Bad_Opcode },
6802 { Bad_Opcode },
6803 { Bad_Opcode },
6804 { Bad_Opcode },
6805 { Bad_Opcode },
6806 /* 40 */
6807 { Bad_Opcode },
6808 { Bad_Opcode },
6809 { Bad_Opcode },
6810 { Bad_Opcode },
6811 { Bad_Opcode },
6812 { Bad_Opcode },
6813 { Bad_Opcode },
6814 { Bad_Opcode },
6815 /* 48 */
6816 { Bad_Opcode },
6817 { Bad_Opcode },
6818 { Bad_Opcode },
6819 { Bad_Opcode },
6820 { Bad_Opcode },
6821 { Bad_Opcode },
6822 { Bad_Opcode },
6823 { Bad_Opcode },
6824 /* 50 */
6825 { Bad_Opcode },
6826 { Bad_Opcode },
6827 { Bad_Opcode },
6828 { Bad_Opcode },
6829 { Bad_Opcode },
6830 { Bad_Opcode },
6831 { Bad_Opcode },
6832 { Bad_Opcode },
6833 /* 58 */
6834 { Bad_Opcode },
6835 { Bad_Opcode },
6836 { Bad_Opcode },
6837 { Bad_Opcode },
6838 { Bad_Opcode },
6839 { Bad_Opcode },
6840 { Bad_Opcode },
6841 { Bad_Opcode },
6842 /* 60 */
6843 { Bad_Opcode },
6844 { Bad_Opcode },
6845 { Bad_Opcode },
6846 { Bad_Opcode },
6847 { Bad_Opcode },
6848 { Bad_Opcode },
6849 { Bad_Opcode },
6850 { Bad_Opcode },
6851 /* 68 */
6852 { Bad_Opcode },
6853 { Bad_Opcode },
6854 { Bad_Opcode },
6855 { Bad_Opcode },
6856 { Bad_Opcode },
6857 { Bad_Opcode },
6858 { Bad_Opcode },
6859 { Bad_Opcode },
6860 /* 70 */
6861 { Bad_Opcode },
6862 { Bad_Opcode },
6863 { Bad_Opcode },
6864 { Bad_Opcode },
6865 { Bad_Opcode },
6866 { Bad_Opcode },
6867 { Bad_Opcode },
6868 { Bad_Opcode },
6869 /* 78 */
6870 { Bad_Opcode },
6871 { Bad_Opcode },
6872 { Bad_Opcode },
6873 { Bad_Opcode },
6874 { Bad_Opcode },
6875 { Bad_Opcode },
6876 { Bad_Opcode },
6877 { Bad_Opcode },
6878 /* 80 */
6879 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_80) },
6880 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_81) },
6881 { "vfrczss", { XM, EXd } },
6882 { "vfrczsd", { XM, EXq } },
6883 { Bad_Opcode },
6884 { Bad_Opcode },
6885 { Bad_Opcode },
6886 { Bad_Opcode },
6887 /* 88 */
6888 { Bad_Opcode },
6889 { Bad_Opcode },
6890 { Bad_Opcode },
6891 { Bad_Opcode },
6892 { Bad_Opcode },
6893 { Bad_Opcode },
6894 { Bad_Opcode },
6895 { Bad_Opcode },
6896 /* 90 */
6897 { "vprotb", { XM, Vex_2src_1, Vex_2src_2 } },
6898 { "vprotw", { XM, Vex_2src_1, Vex_2src_2 } },
6899 { "vprotd", { XM, Vex_2src_1, Vex_2src_2 } },
6900 { "vprotq", { XM, Vex_2src_1, Vex_2src_2 } },
6901 { "vpshlb", { XM, Vex_2src_1, Vex_2src_2 } },
6902 { "vpshlw", { XM, Vex_2src_1, Vex_2src_2 } },
6903 { "vpshld", { XM, Vex_2src_1, Vex_2src_2 } },
6904 { "vpshlq", { XM, Vex_2src_1, Vex_2src_2 } },
6905 /* 98 */
6906 { "vpshab", { XM, Vex_2src_1, Vex_2src_2 } },
6907 { "vpshaw", { XM, Vex_2src_1, Vex_2src_2 } },
6908 { "vpshad", { XM, Vex_2src_1, Vex_2src_2 } },
6909 { "vpshaq", { XM, Vex_2src_1, Vex_2src_2 } },
6910 { Bad_Opcode },
6911 { Bad_Opcode },
6912 { Bad_Opcode },
6913 { Bad_Opcode },
6914 /* a0 */
6915 { Bad_Opcode },
6916 { Bad_Opcode },
6917 { Bad_Opcode },
6918 { Bad_Opcode },
6919 { Bad_Opcode },
6920 { Bad_Opcode },
6921 { Bad_Opcode },
6922 { Bad_Opcode },
6923 /* a8 */
6924 { Bad_Opcode },
6925 { Bad_Opcode },
6926 { Bad_Opcode },
6927 { Bad_Opcode },
6928 { Bad_Opcode },
6929 { Bad_Opcode },
6930 { Bad_Opcode },
6931 { Bad_Opcode },
6932 /* b0 */
6933 { Bad_Opcode },
6934 { Bad_Opcode },
6935 { Bad_Opcode },
6936 { Bad_Opcode },
6937 { Bad_Opcode },
6938 { Bad_Opcode },
6939 { Bad_Opcode },
6940 { Bad_Opcode },
6941 /* b8 */
6942 { Bad_Opcode },
6943 { Bad_Opcode },
6944 { Bad_Opcode },
6945 { Bad_Opcode },
6946 { Bad_Opcode },
6947 { Bad_Opcode },
6948 { Bad_Opcode },
6949 { Bad_Opcode },
6950 /* c0 */
6951 { Bad_Opcode },
6952 { "vphaddbw", { XM, EXxmm } },
6953 { "vphaddbd", { XM, EXxmm } },
6954 { "vphaddbq", { XM, EXxmm } },
6955 { Bad_Opcode },
6956 { Bad_Opcode },
6957 { "vphaddwd", { XM, EXxmm } },
6958 { "vphaddwq", { XM, EXxmm } },
6959 /* c8 */
6960 { Bad_Opcode },
6961 { Bad_Opcode },
6962 { Bad_Opcode },
6963 { "vphadddq", { XM, EXxmm } },
6964 { Bad_Opcode },
6965 { Bad_Opcode },
6966 { Bad_Opcode },
6967 { Bad_Opcode },
6968 /* d0 */
6969 { Bad_Opcode },
6970 { "vphaddubw", { XM, EXxmm } },
6971 { "vphaddubd", { XM, EXxmm } },
6972 { "vphaddubq", { XM, EXxmm } },
6973 { Bad_Opcode },
6974 { Bad_Opcode },
6975 { "vphadduwd", { XM, EXxmm } },
6976 { "vphadduwq", { XM, EXxmm } },
6977 /* d8 */
6978 { Bad_Opcode },
6979 { Bad_Opcode },
6980 { Bad_Opcode },
6981 { "vphaddudq", { XM, EXxmm } },
6982 { Bad_Opcode },
6983 { Bad_Opcode },
6984 { Bad_Opcode },
6985 { Bad_Opcode },
6986 /* e0 */
6987 { Bad_Opcode },
6988 { "vphsubbw", { XM, EXxmm } },
6989 { "vphsubwd", { XM, EXxmm } },
6990 { "vphsubdq", { XM, EXxmm } },
6991 { Bad_Opcode },
6992 { Bad_Opcode },
6993 { Bad_Opcode },
6994 { Bad_Opcode },
6995 /* e8 */
6996 { Bad_Opcode },
6997 { Bad_Opcode },
6998 { Bad_Opcode },
6999 { Bad_Opcode },
7000 { Bad_Opcode },
7001 { Bad_Opcode },
7002 { Bad_Opcode },
7003 { Bad_Opcode },
7004 /* f0 */
7005 { Bad_Opcode },
7006 { Bad_Opcode },
7007 { Bad_Opcode },
7008 { Bad_Opcode },
7009 { Bad_Opcode },
7010 { Bad_Opcode },
7011 { Bad_Opcode },
7012 { Bad_Opcode },
7013 /* f8 */
7014 { Bad_Opcode },
7015 { Bad_Opcode },
7016 { Bad_Opcode },
7017 { Bad_Opcode },
7018 { Bad_Opcode },
7019 { Bad_Opcode },
7020 { Bad_Opcode },
7021 { Bad_Opcode },
7023 /* XOP_0A */
7025 /* 00 */
7026 { Bad_Opcode },
7027 { Bad_Opcode },
7028 { Bad_Opcode },
7029 { Bad_Opcode },
7030 { Bad_Opcode },
7031 { Bad_Opcode },
7032 { Bad_Opcode },
7033 { Bad_Opcode },
7034 /* 08 */
7035 { Bad_Opcode },
7036 { Bad_Opcode },
7037 { Bad_Opcode },
7038 { Bad_Opcode },
7039 { Bad_Opcode },
7040 { Bad_Opcode },
7041 { Bad_Opcode },
7042 { Bad_Opcode },
7043 /* 10 */
7044 { Bad_Opcode },
7045 { Bad_Opcode },
7046 { REG_TABLE (REG_XOP_LWP) },
7047 { Bad_Opcode },
7048 { Bad_Opcode },
7049 { Bad_Opcode },
7050 { Bad_Opcode },
7051 { Bad_Opcode },
7052 /* 18 */
7053 { Bad_Opcode },
7054 { Bad_Opcode },
7055 { Bad_Opcode },
7056 { Bad_Opcode },
7057 { Bad_Opcode },
7058 { Bad_Opcode },
7059 { Bad_Opcode },
7060 { Bad_Opcode },
7061 /* 20 */
7062 { Bad_Opcode },
7063 { Bad_Opcode },
7064 { Bad_Opcode },
7065 { Bad_Opcode },
7066 { Bad_Opcode },
7067 { Bad_Opcode },
7068 { Bad_Opcode },
7069 { Bad_Opcode },
7070 /* 28 */
7071 { Bad_Opcode },
7072 { Bad_Opcode },
7073 { Bad_Opcode },
7074 { Bad_Opcode },
7075 { Bad_Opcode },
7076 { Bad_Opcode },
7077 { Bad_Opcode },
7078 { Bad_Opcode },
7079 /* 30 */
7080 { Bad_Opcode },
7081 { Bad_Opcode },
7082 { Bad_Opcode },
7083 { Bad_Opcode },
7084 { Bad_Opcode },
7085 { Bad_Opcode },
7086 { Bad_Opcode },
7087 { Bad_Opcode },
7088 /* 38 */
7089 { Bad_Opcode },
7090 { Bad_Opcode },
7091 { Bad_Opcode },
7092 { Bad_Opcode },
7093 { Bad_Opcode },
7094 { Bad_Opcode },
7095 { Bad_Opcode },
7096 { Bad_Opcode },
7097 /* 40 */
7098 { Bad_Opcode },
7099 { Bad_Opcode },
7100 { Bad_Opcode },
7101 { Bad_Opcode },
7102 { Bad_Opcode },
7103 { Bad_Opcode },
7104 { Bad_Opcode },
7105 { Bad_Opcode },
7106 /* 48 */
7107 { Bad_Opcode },
7108 { Bad_Opcode },
7109 { Bad_Opcode },
7110 { Bad_Opcode },
7111 { Bad_Opcode },
7112 { Bad_Opcode },
7113 { Bad_Opcode },
7114 { Bad_Opcode },
7115 /* 50 */
7116 { Bad_Opcode },
7117 { Bad_Opcode },
7118 { Bad_Opcode },
7119 { Bad_Opcode },
7120 { Bad_Opcode },
7121 { Bad_Opcode },
7122 { Bad_Opcode },
7123 { Bad_Opcode },
7124 /* 58 */
7125 { Bad_Opcode },
7126 { Bad_Opcode },
7127 { Bad_Opcode },
7128 { Bad_Opcode },
7129 { Bad_Opcode },
7130 { Bad_Opcode },
7131 { Bad_Opcode },
7132 { Bad_Opcode },
7133 /* 60 */
7134 { Bad_Opcode },
7135 { Bad_Opcode },
7136 { Bad_Opcode },
7137 { Bad_Opcode },
7138 { Bad_Opcode },
7139 { Bad_Opcode },
7140 { Bad_Opcode },
7141 { Bad_Opcode },
7142 /* 68 */
7143 { Bad_Opcode },
7144 { Bad_Opcode },
7145 { Bad_Opcode },
7146 { Bad_Opcode },
7147 { Bad_Opcode },
7148 { Bad_Opcode },
7149 { Bad_Opcode },
7150 { Bad_Opcode },
7151 /* 70 */
7152 { Bad_Opcode },
7153 { Bad_Opcode },
7154 { Bad_Opcode },
7155 { Bad_Opcode },
7156 { Bad_Opcode },
7157 { Bad_Opcode },
7158 { Bad_Opcode },
7159 { Bad_Opcode },
7160 /* 78 */
7161 { Bad_Opcode },
7162 { Bad_Opcode },
7163 { Bad_Opcode },
7164 { Bad_Opcode },
7165 { Bad_Opcode },
7166 { Bad_Opcode },
7167 { Bad_Opcode },
7168 { Bad_Opcode },
7169 /* 80 */
7170 { Bad_Opcode },
7171 { Bad_Opcode },
7172 { Bad_Opcode },
7173 { Bad_Opcode },
7174 { Bad_Opcode },
7175 { Bad_Opcode },
7176 { Bad_Opcode },
7177 { Bad_Opcode },
7178 /* 88 */
7179 { Bad_Opcode },
7180 { Bad_Opcode },
7181 { Bad_Opcode },
7182 { Bad_Opcode },
7183 { Bad_Opcode },
7184 { Bad_Opcode },
7185 { Bad_Opcode },
7186 { Bad_Opcode },
7187 /* 90 */
7188 { Bad_Opcode },
7189 { Bad_Opcode },
7190 { Bad_Opcode },
7191 { Bad_Opcode },
7192 { Bad_Opcode },
7193 { Bad_Opcode },
7194 { Bad_Opcode },
7195 { Bad_Opcode },
7196 /* 98 */
7197 { Bad_Opcode },
7198 { Bad_Opcode },
7199 { Bad_Opcode },
7200 { Bad_Opcode },
7201 { Bad_Opcode },
7202 { Bad_Opcode },
7203 { Bad_Opcode },
7204 { Bad_Opcode },
7205 /* a0 */
7206 { Bad_Opcode },
7207 { Bad_Opcode },
7208 { Bad_Opcode },
7209 { Bad_Opcode },
7210 { Bad_Opcode },
7211 { Bad_Opcode },
7212 { Bad_Opcode },
7213 { Bad_Opcode },
7214 /* a8 */
7215 { Bad_Opcode },
7216 { Bad_Opcode },
7217 { Bad_Opcode },
7218 { Bad_Opcode },
7219 { Bad_Opcode },
7220 { Bad_Opcode },
7221 { Bad_Opcode },
7222 { Bad_Opcode },
7223 /* b0 */
7224 { Bad_Opcode },
7225 { Bad_Opcode },
7226 { Bad_Opcode },
7227 { Bad_Opcode },
7228 { Bad_Opcode },
7229 { Bad_Opcode },
7230 { Bad_Opcode },
7231 { Bad_Opcode },
7232 /* b8 */
7233 { Bad_Opcode },
7234 { Bad_Opcode },
7235 { Bad_Opcode },
7236 { Bad_Opcode },
7237 { Bad_Opcode },
7238 { Bad_Opcode },
7239 { Bad_Opcode },
7240 { Bad_Opcode },
7241 /* c0 */
7242 { Bad_Opcode },
7243 { Bad_Opcode },
7244 { Bad_Opcode },
7245 { Bad_Opcode },
7246 { Bad_Opcode },
7247 { Bad_Opcode },
7248 { Bad_Opcode },
7249 { Bad_Opcode },
7250 /* c8 */
7251 { Bad_Opcode },
7252 { Bad_Opcode },
7253 { Bad_Opcode },
7254 { Bad_Opcode },
7255 { Bad_Opcode },
7256 { Bad_Opcode },
7257 { Bad_Opcode },
7258 { Bad_Opcode },
7259 /* d0 */
7260 { Bad_Opcode },
7261 { Bad_Opcode },
7262 { Bad_Opcode },
7263 { Bad_Opcode },
7264 { Bad_Opcode },
7265 { Bad_Opcode },
7266 { Bad_Opcode },
7267 { Bad_Opcode },
7268 /* d8 */
7269 { Bad_Opcode },
7270 { Bad_Opcode },
7271 { Bad_Opcode },
7272 { Bad_Opcode },
7273 { Bad_Opcode },
7274 { Bad_Opcode },
7275 { Bad_Opcode },
7276 { Bad_Opcode },
7277 /* e0 */
7278 { Bad_Opcode },
7279 { Bad_Opcode },
7280 { Bad_Opcode },
7281 { Bad_Opcode },
7282 { Bad_Opcode },
7283 { Bad_Opcode },
7284 { Bad_Opcode },
7285 { Bad_Opcode },
7286 /* e8 */
7287 { Bad_Opcode },
7288 { Bad_Opcode },
7289 { Bad_Opcode },
7290 { Bad_Opcode },
7291 { Bad_Opcode },
7292 { Bad_Opcode },
7293 { Bad_Opcode },
7294 { Bad_Opcode },
7295 /* f0 */
7296 { Bad_Opcode },
7297 { Bad_Opcode },
7298 { Bad_Opcode },
7299 { Bad_Opcode },
7300 { Bad_Opcode },
7301 { Bad_Opcode },
7302 { Bad_Opcode },
7303 { Bad_Opcode },
7304 /* f8 */
7305 { Bad_Opcode },
7306 { Bad_Opcode },
7307 { Bad_Opcode },
7308 { Bad_Opcode },
7309 { Bad_Opcode },
7310 { Bad_Opcode },
7311 { Bad_Opcode },
7312 { Bad_Opcode },
7316 static const struct dis386 vex_table[][256] = {
7317 /* VEX_0F */
7319 /* 00 */
7320 { Bad_Opcode },
7321 { Bad_Opcode },
7322 { Bad_Opcode },
7323 { Bad_Opcode },
7324 { Bad_Opcode },
7325 { Bad_Opcode },
7326 { Bad_Opcode },
7327 { Bad_Opcode },
7328 /* 08 */
7329 { Bad_Opcode },
7330 { Bad_Opcode },
7331 { Bad_Opcode },
7332 { Bad_Opcode },
7333 { Bad_Opcode },
7334 { Bad_Opcode },
7335 { Bad_Opcode },
7336 { Bad_Opcode },
7337 /* 10 */
7338 { PREFIX_TABLE (PREFIX_VEX_0F10) },
7339 { PREFIX_TABLE (PREFIX_VEX_0F11) },
7340 { PREFIX_TABLE (PREFIX_VEX_0F12) },
7341 { MOD_TABLE (MOD_VEX_0F13) },
7342 { VEX_W_TABLE (VEX_W_0F14) },
7343 { VEX_W_TABLE (VEX_W_0F15) },
7344 { PREFIX_TABLE (PREFIX_VEX_0F16) },
7345 { MOD_TABLE (MOD_VEX_0F17) },
7346 /* 18 */
7347 { Bad_Opcode },
7348 { Bad_Opcode },
7349 { Bad_Opcode },
7350 { Bad_Opcode },
7351 { Bad_Opcode },
7352 { Bad_Opcode },
7353 { Bad_Opcode },
7354 { Bad_Opcode },
7355 /* 20 */
7356 { Bad_Opcode },
7357 { Bad_Opcode },
7358 { Bad_Opcode },
7359 { Bad_Opcode },
7360 { Bad_Opcode },
7361 { Bad_Opcode },
7362 { Bad_Opcode },
7363 { Bad_Opcode },
7364 /* 28 */
7365 { VEX_W_TABLE (VEX_W_0F28) },
7366 { VEX_W_TABLE (VEX_W_0F29) },
7367 { PREFIX_TABLE (PREFIX_VEX_0F2A) },
7368 { MOD_TABLE (MOD_VEX_0F2B) },
7369 { PREFIX_TABLE (PREFIX_VEX_0F2C) },
7370 { PREFIX_TABLE (PREFIX_VEX_0F2D) },
7371 { PREFIX_TABLE (PREFIX_VEX_0F2E) },
7372 { PREFIX_TABLE (PREFIX_VEX_0F2F) },
7373 /* 30 */
7374 { Bad_Opcode },
7375 { Bad_Opcode },
7376 { Bad_Opcode },
7377 { Bad_Opcode },
7378 { Bad_Opcode },
7379 { Bad_Opcode },
7380 { Bad_Opcode },
7381 { Bad_Opcode },
7382 /* 38 */
7383 { Bad_Opcode },
7384 { Bad_Opcode },
7385 { Bad_Opcode },
7386 { Bad_Opcode },
7387 { Bad_Opcode },
7388 { Bad_Opcode },
7389 { Bad_Opcode },
7390 { Bad_Opcode },
7391 /* 40 */
7392 { Bad_Opcode },
7393 { Bad_Opcode },
7394 { Bad_Opcode },
7395 { Bad_Opcode },
7396 { Bad_Opcode },
7397 { Bad_Opcode },
7398 { Bad_Opcode },
7399 { Bad_Opcode },
7400 /* 48 */
7401 { Bad_Opcode },
7402 { Bad_Opcode },
7403 { Bad_Opcode },
7404 { Bad_Opcode },
7405 { Bad_Opcode },
7406 { Bad_Opcode },
7407 { Bad_Opcode },
7408 { Bad_Opcode },
7409 /* 50 */
7410 { MOD_TABLE (MOD_VEX_0F50) },
7411 { PREFIX_TABLE (PREFIX_VEX_0F51) },
7412 { PREFIX_TABLE (PREFIX_VEX_0F52) },
7413 { PREFIX_TABLE (PREFIX_VEX_0F53) },
7414 { "vandpX", { XM, Vex, EXx } },
7415 { "vandnpX", { XM, Vex, EXx } },
7416 { "vorpX", { XM, Vex, EXx } },
7417 { "vxorpX", { XM, Vex, EXx } },
7418 /* 58 */
7419 { PREFIX_TABLE (PREFIX_VEX_0F58) },
7420 { PREFIX_TABLE (PREFIX_VEX_0F59) },
7421 { PREFIX_TABLE (PREFIX_VEX_0F5A) },
7422 { PREFIX_TABLE (PREFIX_VEX_0F5B) },
7423 { PREFIX_TABLE (PREFIX_VEX_0F5C) },
7424 { PREFIX_TABLE (PREFIX_VEX_0F5D) },
7425 { PREFIX_TABLE (PREFIX_VEX_0F5E) },
7426 { PREFIX_TABLE (PREFIX_VEX_0F5F) },
7427 /* 60 */
7428 { PREFIX_TABLE (PREFIX_VEX_0F60) },
7429 { PREFIX_TABLE (PREFIX_VEX_0F61) },
7430 { PREFIX_TABLE (PREFIX_VEX_0F62) },
7431 { PREFIX_TABLE (PREFIX_VEX_0F63) },
7432 { PREFIX_TABLE (PREFIX_VEX_0F64) },
7433 { PREFIX_TABLE (PREFIX_VEX_0F65) },
7434 { PREFIX_TABLE (PREFIX_VEX_0F66) },
7435 { PREFIX_TABLE (PREFIX_VEX_0F67) },
7436 /* 68 */
7437 { PREFIX_TABLE (PREFIX_VEX_0F68) },
7438 { PREFIX_TABLE (PREFIX_VEX_0F69) },
7439 { PREFIX_TABLE (PREFIX_VEX_0F6A) },
7440 { PREFIX_TABLE (PREFIX_VEX_0F6B) },
7441 { PREFIX_TABLE (PREFIX_VEX_0F6C) },
7442 { PREFIX_TABLE (PREFIX_VEX_0F6D) },
7443 { PREFIX_TABLE (PREFIX_VEX_0F6E) },
7444 { PREFIX_TABLE (PREFIX_VEX_0F6F) },
7445 /* 70 */
7446 { PREFIX_TABLE (PREFIX_VEX_0F70) },
7447 { REG_TABLE (REG_VEX_0F71) },
7448 { REG_TABLE (REG_VEX_0F72) },
7449 { REG_TABLE (REG_VEX_0F73) },
7450 { PREFIX_TABLE (PREFIX_VEX_0F74) },
7451 { PREFIX_TABLE (PREFIX_VEX_0F75) },
7452 { PREFIX_TABLE (PREFIX_VEX_0F76) },
7453 { PREFIX_TABLE (PREFIX_VEX_0F77) },
7454 /* 78 */
7455 { Bad_Opcode },
7456 { Bad_Opcode },
7457 { Bad_Opcode },
7458 { Bad_Opcode },
7459 { PREFIX_TABLE (PREFIX_VEX_0F7C) },
7460 { PREFIX_TABLE (PREFIX_VEX_0F7D) },
7461 { PREFIX_TABLE (PREFIX_VEX_0F7E) },
7462 { PREFIX_TABLE (PREFIX_VEX_0F7F) },
7463 /* 80 */
7464 { Bad_Opcode },
7465 { Bad_Opcode },
7466 { Bad_Opcode },
7467 { Bad_Opcode },
7468 { Bad_Opcode },
7469 { Bad_Opcode },
7470 { Bad_Opcode },
7471 { Bad_Opcode },
7472 /* 88 */
7473 { Bad_Opcode },
7474 { Bad_Opcode },
7475 { Bad_Opcode },
7476 { Bad_Opcode },
7477 { Bad_Opcode },
7478 { Bad_Opcode },
7479 { Bad_Opcode },
7480 { Bad_Opcode },
7481 /* 90 */
7482 { Bad_Opcode },
7483 { Bad_Opcode },
7484 { Bad_Opcode },
7485 { Bad_Opcode },
7486 { Bad_Opcode },
7487 { Bad_Opcode },
7488 { Bad_Opcode },
7489 { Bad_Opcode },
7490 /* 98 */
7491 { Bad_Opcode },
7492 { Bad_Opcode },
7493 { Bad_Opcode },
7494 { Bad_Opcode },
7495 { Bad_Opcode },
7496 { Bad_Opcode },
7497 { Bad_Opcode },
7498 { Bad_Opcode },
7499 /* a0 */
7500 { Bad_Opcode },
7501 { Bad_Opcode },
7502 { Bad_Opcode },
7503 { Bad_Opcode },
7504 { Bad_Opcode },
7505 { Bad_Opcode },
7506 { Bad_Opcode },
7507 { Bad_Opcode },
7508 /* a8 */
7509 { Bad_Opcode },
7510 { Bad_Opcode },
7511 { Bad_Opcode },
7512 { Bad_Opcode },
7513 { Bad_Opcode },
7514 { Bad_Opcode },
7515 { REG_TABLE (REG_VEX_0FAE) },
7516 { Bad_Opcode },
7517 /* b0 */
7518 { Bad_Opcode },
7519 { Bad_Opcode },
7520 { Bad_Opcode },
7521 { Bad_Opcode },
7522 { Bad_Opcode },
7523 { Bad_Opcode },
7524 { Bad_Opcode },
7525 { Bad_Opcode },
7526 /* b8 */
7527 { Bad_Opcode },
7528 { Bad_Opcode },
7529 { Bad_Opcode },
7530 { Bad_Opcode },
7531 { Bad_Opcode },
7532 { Bad_Opcode },
7533 { Bad_Opcode },
7534 { Bad_Opcode },
7535 /* c0 */
7536 { Bad_Opcode },
7537 { Bad_Opcode },
7538 { PREFIX_TABLE (PREFIX_VEX_0FC2) },
7539 { Bad_Opcode },
7540 { PREFIX_TABLE (PREFIX_VEX_0FC4) },
7541 { PREFIX_TABLE (PREFIX_VEX_0FC5) },
7542 { "vshufpX", { XM, Vex, EXx, Ib } },
7543 { Bad_Opcode },
7544 /* c8 */
7545 { Bad_Opcode },
7546 { Bad_Opcode },
7547 { Bad_Opcode },
7548 { Bad_Opcode },
7549 { Bad_Opcode },
7550 { Bad_Opcode },
7551 { Bad_Opcode },
7552 { Bad_Opcode },
7553 /* d0 */
7554 { PREFIX_TABLE (PREFIX_VEX_0FD0) },
7555 { PREFIX_TABLE (PREFIX_VEX_0FD1) },
7556 { PREFIX_TABLE (PREFIX_VEX_0FD2) },
7557 { PREFIX_TABLE (PREFIX_VEX_0FD3) },
7558 { PREFIX_TABLE (PREFIX_VEX_0FD4) },
7559 { PREFIX_TABLE (PREFIX_VEX_0FD5) },
7560 { PREFIX_TABLE (PREFIX_VEX_0FD6) },
7561 { PREFIX_TABLE (PREFIX_VEX_0FD7) },
7562 /* d8 */
7563 { PREFIX_TABLE (PREFIX_VEX_0FD8) },
7564 { PREFIX_TABLE (PREFIX_VEX_0FD9) },
7565 { PREFIX_TABLE (PREFIX_VEX_0FDA) },
7566 { PREFIX_TABLE (PREFIX_VEX_0FDB) },
7567 { PREFIX_TABLE (PREFIX_VEX_0FDC) },
7568 { PREFIX_TABLE (PREFIX_VEX_0FDD) },
7569 { PREFIX_TABLE (PREFIX_VEX_0FDE) },
7570 { PREFIX_TABLE (PREFIX_VEX_0FDF) },
7571 /* e0 */
7572 { PREFIX_TABLE (PREFIX_VEX_0FE0) },
7573 { PREFIX_TABLE (PREFIX_VEX_0FE1) },
7574 { PREFIX_TABLE (PREFIX_VEX_0FE2) },
7575 { PREFIX_TABLE (PREFIX_VEX_0FE3) },
7576 { PREFIX_TABLE (PREFIX_VEX_0FE4) },
7577 { PREFIX_TABLE (PREFIX_VEX_0FE5) },
7578 { PREFIX_TABLE (PREFIX_VEX_0FE6) },
7579 { PREFIX_TABLE (PREFIX_VEX_0FE7) },
7580 /* e8 */
7581 { PREFIX_TABLE (PREFIX_VEX_0FE8) },
7582 { PREFIX_TABLE (PREFIX_VEX_0FE9) },
7583 { PREFIX_TABLE (PREFIX_VEX_0FEA) },
7584 { PREFIX_TABLE (PREFIX_VEX_0FEB) },
7585 { PREFIX_TABLE (PREFIX_VEX_0FEC) },
7586 { PREFIX_TABLE (PREFIX_VEX_0FED) },
7587 { PREFIX_TABLE (PREFIX_VEX_0FEE) },
7588 { PREFIX_TABLE (PREFIX_VEX_0FEF) },
7589 /* f0 */
7590 { PREFIX_TABLE (PREFIX_VEX_0FF0) },
7591 { PREFIX_TABLE (PREFIX_VEX_0FF1) },
7592 { PREFIX_TABLE (PREFIX_VEX_0FF2) },
7593 { PREFIX_TABLE (PREFIX_VEX_0FF3) },
7594 { PREFIX_TABLE (PREFIX_VEX_0FF4) },
7595 { PREFIX_TABLE (PREFIX_VEX_0FF5) },
7596 { PREFIX_TABLE (PREFIX_VEX_0FF6) },
7597 { PREFIX_TABLE (PREFIX_VEX_0FF7) },
7598 /* f8 */
7599 { PREFIX_TABLE (PREFIX_VEX_0FF8) },
7600 { PREFIX_TABLE (PREFIX_VEX_0FF9) },
7601 { PREFIX_TABLE (PREFIX_VEX_0FFA) },
7602 { PREFIX_TABLE (PREFIX_VEX_0FFB) },
7603 { PREFIX_TABLE (PREFIX_VEX_0FFC) },
7604 { PREFIX_TABLE (PREFIX_VEX_0FFD) },
7605 { PREFIX_TABLE (PREFIX_VEX_0FFE) },
7606 { Bad_Opcode },
7608 /* VEX_0F38 */
7610 /* 00 */
7611 { PREFIX_TABLE (PREFIX_VEX_0F3800) },
7612 { PREFIX_TABLE (PREFIX_VEX_0F3801) },
7613 { PREFIX_TABLE (PREFIX_VEX_0F3802) },
7614 { PREFIX_TABLE (PREFIX_VEX_0F3803) },
7615 { PREFIX_TABLE (PREFIX_VEX_0F3804) },
7616 { PREFIX_TABLE (PREFIX_VEX_0F3805) },
7617 { PREFIX_TABLE (PREFIX_VEX_0F3806) },
7618 { PREFIX_TABLE (PREFIX_VEX_0F3807) },
7619 /* 08 */
7620 { PREFIX_TABLE (PREFIX_VEX_0F3808) },
7621 { PREFIX_TABLE (PREFIX_VEX_0F3809) },
7622 { PREFIX_TABLE (PREFIX_VEX_0F380A) },
7623 { PREFIX_TABLE (PREFIX_VEX_0F380B) },
7624 { PREFIX_TABLE (PREFIX_VEX_0F380C) },
7625 { PREFIX_TABLE (PREFIX_VEX_0F380D) },
7626 { PREFIX_TABLE (PREFIX_VEX_0F380E) },
7627 { PREFIX_TABLE (PREFIX_VEX_0F380F) },
7628 /* 10 */
7629 { Bad_Opcode },
7630 { Bad_Opcode },
7631 { Bad_Opcode },
7632 { PREFIX_TABLE (PREFIX_VEX_0F3813) },
7633 { Bad_Opcode },
7634 { Bad_Opcode },
7635 { Bad_Opcode },
7636 { PREFIX_TABLE (PREFIX_VEX_0F3817) },
7637 /* 18 */
7638 { PREFIX_TABLE (PREFIX_VEX_0F3818) },
7639 { PREFIX_TABLE (PREFIX_VEX_0F3819) },
7640 { PREFIX_TABLE (PREFIX_VEX_0F381A) },
7641 { Bad_Opcode },
7642 { PREFIX_TABLE (PREFIX_VEX_0F381C) },
7643 { PREFIX_TABLE (PREFIX_VEX_0F381D) },
7644 { PREFIX_TABLE (PREFIX_VEX_0F381E) },
7645 { Bad_Opcode },
7646 /* 20 */
7647 { PREFIX_TABLE (PREFIX_VEX_0F3820) },
7648 { PREFIX_TABLE (PREFIX_VEX_0F3821) },
7649 { PREFIX_TABLE (PREFIX_VEX_0F3822) },
7650 { PREFIX_TABLE (PREFIX_VEX_0F3823) },
7651 { PREFIX_TABLE (PREFIX_VEX_0F3824) },
7652 { PREFIX_TABLE (PREFIX_VEX_0F3825) },
7653 { Bad_Opcode },
7654 { Bad_Opcode },
7655 /* 28 */
7656 { PREFIX_TABLE (PREFIX_VEX_0F3828) },
7657 { PREFIX_TABLE (PREFIX_VEX_0F3829) },
7658 { PREFIX_TABLE (PREFIX_VEX_0F382A) },
7659 { PREFIX_TABLE (PREFIX_VEX_0F382B) },
7660 { PREFIX_TABLE (PREFIX_VEX_0F382C) },
7661 { PREFIX_TABLE (PREFIX_VEX_0F382D) },
7662 { PREFIX_TABLE (PREFIX_VEX_0F382E) },
7663 { PREFIX_TABLE (PREFIX_VEX_0F382F) },
7664 /* 30 */
7665 { PREFIX_TABLE (PREFIX_VEX_0F3830) },
7666 { PREFIX_TABLE (PREFIX_VEX_0F3831) },
7667 { PREFIX_TABLE (PREFIX_VEX_0F3832) },
7668 { PREFIX_TABLE (PREFIX_VEX_0F3833) },
7669 { PREFIX_TABLE (PREFIX_VEX_0F3834) },
7670 { PREFIX_TABLE (PREFIX_VEX_0F3835) },
7671 { Bad_Opcode },
7672 { PREFIX_TABLE (PREFIX_VEX_0F3837) },
7673 /* 38 */
7674 { PREFIX_TABLE (PREFIX_VEX_0F3838) },
7675 { PREFIX_TABLE (PREFIX_VEX_0F3839) },
7676 { PREFIX_TABLE (PREFIX_VEX_0F383A) },
7677 { PREFIX_TABLE (PREFIX_VEX_0F383B) },
7678 { PREFIX_TABLE (PREFIX_VEX_0F383C) },
7679 { PREFIX_TABLE (PREFIX_VEX_0F383D) },
7680 { PREFIX_TABLE (PREFIX_VEX_0F383E) },
7681 { PREFIX_TABLE (PREFIX_VEX_0F383F) },
7682 /* 40 */
7683 { PREFIX_TABLE (PREFIX_VEX_0F3840) },
7684 { PREFIX_TABLE (PREFIX_VEX_0F3841) },
7685 { Bad_Opcode },
7686 { Bad_Opcode },
7687 { Bad_Opcode },
7688 { Bad_Opcode },
7689 { Bad_Opcode },
7690 { Bad_Opcode },
7691 /* 48 */
7692 { Bad_Opcode },
7693 { Bad_Opcode },
7694 { Bad_Opcode },
7695 { Bad_Opcode },
7696 { Bad_Opcode },
7697 { Bad_Opcode },
7698 { Bad_Opcode },
7699 { Bad_Opcode },
7700 /* 50 */
7701 { Bad_Opcode },
7702 { Bad_Opcode },
7703 { Bad_Opcode },
7704 { Bad_Opcode },
7705 { Bad_Opcode },
7706 { Bad_Opcode },
7707 { Bad_Opcode },
7708 { Bad_Opcode },
7709 /* 58 */
7710 { Bad_Opcode },
7711 { Bad_Opcode },
7712 { Bad_Opcode },
7713 { Bad_Opcode },
7714 { Bad_Opcode },
7715 { Bad_Opcode },
7716 { Bad_Opcode },
7717 { Bad_Opcode },
7718 /* 60 */
7719 { Bad_Opcode },
7720 { Bad_Opcode },
7721 { Bad_Opcode },
7722 { Bad_Opcode },
7723 { Bad_Opcode },
7724 { Bad_Opcode },
7725 { Bad_Opcode },
7726 { Bad_Opcode },
7727 /* 68 */
7728 { Bad_Opcode },
7729 { Bad_Opcode },
7730 { Bad_Opcode },
7731 { Bad_Opcode },
7732 { Bad_Opcode },
7733 { Bad_Opcode },
7734 { Bad_Opcode },
7735 { Bad_Opcode },
7736 /* 70 */
7737 { Bad_Opcode },
7738 { Bad_Opcode },
7739 { Bad_Opcode },
7740 { Bad_Opcode },
7741 { Bad_Opcode },
7742 { Bad_Opcode },
7743 { Bad_Opcode },
7744 { Bad_Opcode },
7745 /* 78 */
7746 { Bad_Opcode },
7747 { Bad_Opcode },
7748 { Bad_Opcode },
7749 { Bad_Opcode },
7750 { Bad_Opcode },
7751 { Bad_Opcode },
7752 { Bad_Opcode },
7753 { Bad_Opcode },
7754 /* 80 */
7755 { Bad_Opcode },
7756 { Bad_Opcode },
7757 { Bad_Opcode },
7758 { Bad_Opcode },
7759 { Bad_Opcode },
7760 { Bad_Opcode },
7761 { Bad_Opcode },
7762 { Bad_Opcode },
7763 /* 88 */
7764 { Bad_Opcode },
7765 { Bad_Opcode },
7766 { Bad_Opcode },
7767 { Bad_Opcode },
7768 { Bad_Opcode },
7769 { Bad_Opcode },
7770 { Bad_Opcode },
7771 { Bad_Opcode },
7772 /* 90 */
7773 { Bad_Opcode },
7774 { Bad_Opcode },
7775 { Bad_Opcode },
7776 { Bad_Opcode },
7777 { Bad_Opcode },
7778 { Bad_Opcode },
7779 { PREFIX_TABLE (PREFIX_VEX_0F3896) },
7780 { PREFIX_TABLE (PREFIX_VEX_0F3897) },
7781 /* 98 */
7782 { PREFIX_TABLE (PREFIX_VEX_0F3898) },
7783 { PREFIX_TABLE (PREFIX_VEX_0F3899) },
7784 { PREFIX_TABLE (PREFIX_VEX_0F389A) },
7785 { PREFIX_TABLE (PREFIX_VEX_0F389B) },
7786 { PREFIX_TABLE (PREFIX_VEX_0F389C) },
7787 { PREFIX_TABLE (PREFIX_VEX_0F389D) },
7788 { PREFIX_TABLE (PREFIX_VEX_0F389E) },
7789 { PREFIX_TABLE (PREFIX_VEX_0F389F) },
7790 /* a0 */
7791 { Bad_Opcode },
7792 { Bad_Opcode },
7793 { Bad_Opcode },
7794 { Bad_Opcode },
7795 { Bad_Opcode },
7796 { Bad_Opcode },
7797 { PREFIX_TABLE (PREFIX_VEX_0F38A6) },
7798 { PREFIX_TABLE (PREFIX_VEX_0F38A7) },
7799 /* a8 */
7800 { PREFIX_TABLE (PREFIX_VEX_0F38A8) },
7801 { PREFIX_TABLE (PREFIX_VEX_0F38A9) },
7802 { PREFIX_TABLE (PREFIX_VEX_0F38AA) },
7803 { PREFIX_TABLE (PREFIX_VEX_0F38AB) },
7804 { PREFIX_TABLE (PREFIX_VEX_0F38AC) },
7805 { PREFIX_TABLE (PREFIX_VEX_0F38AD) },
7806 { PREFIX_TABLE (PREFIX_VEX_0F38AE) },
7807 { PREFIX_TABLE (PREFIX_VEX_0F38AF) },
7808 /* b0 */
7809 { Bad_Opcode },
7810 { Bad_Opcode },
7811 { Bad_Opcode },
7812 { Bad_Opcode },
7813 { Bad_Opcode },
7814 { Bad_Opcode },
7815 { PREFIX_TABLE (PREFIX_VEX_0F38B6) },
7816 { PREFIX_TABLE (PREFIX_VEX_0F38B7) },
7817 /* b8 */
7818 { PREFIX_TABLE (PREFIX_VEX_0F38B8) },
7819 { PREFIX_TABLE (PREFIX_VEX_0F38B9) },
7820 { PREFIX_TABLE (PREFIX_VEX_0F38BA) },
7821 { PREFIX_TABLE (PREFIX_VEX_0F38BB) },
7822 { PREFIX_TABLE (PREFIX_VEX_0F38BC) },
7823 { PREFIX_TABLE (PREFIX_VEX_0F38BD) },
7824 { PREFIX_TABLE (PREFIX_VEX_0F38BE) },
7825 { PREFIX_TABLE (PREFIX_VEX_0F38BF) },
7826 /* c0 */
7827 { Bad_Opcode },
7828 { Bad_Opcode },
7829 { Bad_Opcode },
7830 { Bad_Opcode },
7831 { Bad_Opcode },
7832 { Bad_Opcode },
7833 { Bad_Opcode },
7834 { Bad_Opcode },
7835 /* c8 */
7836 { Bad_Opcode },
7837 { Bad_Opcode },
7838 { Bad_Opcode },
7839 { Bad_Opcode },
7840 { Bad_Opcode },
7841 { Bad_Opcode },
7842 { Bad_Opcode },
7843 { Bad_Opcode },
7844 /* d0 */
7845 { Bad_Opcode },
7846 { Bad_Opcode },
7847 { Bad_Opcode },
7848 { Bad_Opcode },
7849 { Bad_Opcode },
7850 { Bad_Opcode },
7851 { Bad_Opcode },
7852 { Bad_Opcode },
7853 /* d8 */
7854 { Bad_Opcode },
7855 { Bad_Opcode },
7856 { Bad_Opcode },
7857 { PREFIX_TABLE (PREFIX_VEX_0F38DB) },
7858 { PREFIX_TABLE (PREFIX_VEX_0F38DC) },
7859 { PREFIX_TABLE (PREFIX_VEX_0F38DD) },
7860 { PREFIX_TABLE (PREFIX_VEX_0F38DE) },
7861 { PREFIX_TABLE (PREFIX_VEX_0F38DF) },
7862 /* e0 */
7863 { Bad_Opcode },
7864 { Bad_Opcode },
7865 { Bad_Opcode },
7866 { Bad_Opcode },
7867 { Bad_Opcode },
7868 { Bad_Opcode },
7869 { Bad_Opcode },
7870 { Bad_Opcode },
7871 /* e8 */
7872 { Bad_Opcode },
7873 { Bad_Opcode },
7874 { Bad_Opcode },
7875 { Bad_Opcode },
7876 { Bad_Opcode },
7877 { Bad_Opcode },
7878 { Bad_Opcode },
7879 { Bad_Opcode },
7880 /* f0 */
7881 { Bad_Opcode },
7882 { Bad_Opcode },
7883 { PREFIX_TABLE (PREFIX_VEX_0F38F2) },
7884 { REG_TABLE (REG_VEX_0F38F3) },
7885 { Bad_Opcode },
7886 { Bad_Opcode },
7887 { Bad_Opcode },
7888 { PREFIX_TABLE (PREFIX_VEX_0F38F7) },
7889 /* f8 */
7890 { Bad_Opcode },
7891 { Bad_Opcode },
7892 { Bad_Opcode },
7893 { Bad_Opcode },
7894 { Bad_Opcode },
7895 { Bad_Opcode },
7896 { Bad_Opcode },
7897 { Bad_Opcode },
7899 /* VEX_0F3A */
7901 /* 00 */
7902 { Bad_Opcode },
7903 { Bad_Opcode },
7904 { Bad_Opcode },
7905 { Bad_Opcode },
7906 { PREFIX_TABLE (PREFIX_VEX_0F3A04) },
7907 { PREFIX_TABLE (PREFIX_VEX_0F3A05) },
7908 { PREFIX_TABLE (PREFIX_VEX_0F3A06) },
7909 { Bad_Opcode },
7910 /* 08 */
7911 { PREFIX_TABLE (PREFIX_VEX_0F3A08) },
7912 { PREFIX_TABLE (PREFIX_VEX_0F3A09) },
7913 { PREFIX_TABLE (PREFIX_VEX_0F3A0A) },
7914 { PREFIX_TABLE (PREFIX_VEX_0F3A0B) },
7915 { PREFIX_TABLE (PREFIX_VEX_0F3A0C) },
7916 { PREFIX_TABLE (PREFIX_VEX_0F3A0D) },
7917 { PREFIX_TABLE (PREFIX_VEX_0F3A0E) },
7918 { PREFIX_TABLE (PREFIX_VEX_0F3A0F) },
7919 /* 10 */
7920 { Bad_Opcode },
7921 { Bad_Opcode },
7922 { Bad_Opcode },
7923 { Bad_Opcode },
7924 { PREFIX_TABLE (PREFIX_VEX_0F3A14) },
7925 { PREFIX_TABLE (PREFIX_VEX_0F3A15) },
7926 { PREFIX_TABLE (PREFIX_VEX_0F3A16) },
7927 { PREFIX_TABLE (PREFIX_VEX_0F3A17) },
7928 /* 18 */
7929 { PREFIX_TABLE (PREFIX_VEX_0F3A18) },
7930 { PREFIX_TABLE (PREFIX_VEX_0F3A19) },
7931 { Bad_Opcode },
7932 { Bad_Opcode },
7933 { Bad_Opcode },
7934 { PREFIX_TABLE (PREFIX_VEX_0F3A1D) },
7935 { Bad_Opcode },
7936 { Bad_Opcode },
7937 /* 20 */
7938 { PREFIX_TABLE (PREFIX_VEX_0F3A20) },
7939 { PREFIX_TABLE (PREFIX_VEX_0F3A21) },
7940 { PREFIX_TABLE (PREFIX_VEX_0F3A22) },
7941 { Bad_Opcode },
7942 { Bad_Opcode },
7943 { Bad_Opcode },
7944 { Bad_Opcode },
7945 { Bad_Opcode },
7946 /* 28 */
7947 { Bad_Opcode },
7948 { Bad_Opcode },
7949 { Bad_Opcode },
7950 { Bad_Opcode },
7951 { Bad_Opcode },
7952 { Bad_Opcode },
7953 { Bad_Opcode },
7954 { Bad_Opcode },
7955 /* 30 */
7956 { Bad_Opcode },
7957 { Bad_Opcode },
7958 { Bad_Opcode },
7959 { Bad_Opcode },
7960 { Bad_Opcode },
7961 { Bad_Opcode },
7962 { Bad_Opcode },
7963 { Bad_Opcode },
7964 /* 38 */
7965 { Bad_Opcode },
7966 { Bad_Opcode },
7967 { Bad_Opcode },
7968 { Bad_Opcode },
7969 { Bad_Opcode },
7970 { Bad_Opcode },
7971 { Bad_Opcode },
7972 { Bad_Opcode },
7973 /* 40 */
7974 { PREFIX_TABLE (PREFIX_VEX_0F3A40) },
7975 { PREFIX_TABLE (PREFIX_VEX_0F3A41) },
7976 { PREFIX_TABLE (PREFIX_VEX_0F3A42) },
7977 { Bad_Opcode },
7978 { PREFIX_TABLE (PREFIX_VEX_0F3A44) },
7979 { Bad_Opcode },
7980 { Bad_Opcode },
7981 { Bad_Opcode },
7982 /* 48 */
7983 { PREFIX_TABLE (PREFIX_VEX_0F3A48) },
7984 { PREFIX_TABLE (PREFIX_VEX_0F3A49) },
7985 { PREFIX_TABLE (PREFIX_VEX_0F3A4A) },
7986 { PREFIX_TABLE (PREFIX_VEX_0F3A4B) },
7987 { PREFIX_TABLE (PREFIX_VEX_0F3A4C) },
7988 { Bad_Opcode },
7989 { Bad_Opcode },
7990 { Bad_Opcode },
7991 /* 50 */
7992 { Bad_Opcode },
7993 { Bad_Opcode },
7994 { Bad_Opcode },
7995 { Bad_Opcode },
7996 { Bad_Opcode },
7997 { Bad_Opcode },
7998 { Bad_Opcode },
7999 { Bad_Opcode },
8000 /* 58 */
8001 { Bad_Opcode },
8002 { Bad_Opcode },
8003 { Bad_Opcode },
8004 { Bad_Opcode },
8005 { PREFIX_TABLE (PREFIX_VEX_0F3A5C) },
8006 { PREFIX_TABLE (PREFIX_VEX_0F3A5D) },
8007 { PREFIX_TABLE (PREFIX_VEX_0F3A5E) },
8008 { PREFIX_TABLE (PREFIX_VEX_0F3A5F) },
8009 /* 60 */
8010 { PREFIX_TABLE (PREFIX_VEX_0F3A60) },
8011 { PREFIX_TABLE (PREFIX_VEX_0F3A61) },
8012 { PREFIX_TABLE (PREFIX_VEX_0F3A62) },
8013 { PREFIX_TABLE (PREFIX_VEX_0F3A63) },
8014 { Bad_Opcode },
8015 { Bad_Opcode },
8016 { Bad_Opcode },
8017 { Bad_Opcode },
8018 /* 68 */
8019 { PREFIX_TABLE (PREFIX_VEX_0F3A68) },
8020 { PREFIX_TABLE (PREFIX_VEX_0F3A69) },
8021 { PREFIX_TABLE (PREFIX_VEX_0F3A6A) },
8022 { PREFIX_TABLE (PREFIX_VEX_0F3A6B) },
8023 { PREFIX_TABLE (PREFIX_VEX_0F3A6C) },
8024 { PREFIX_TABLE (PREFIX_VEX_0F3A6D) },
8025 { PREFIX_TABLE (PREFIX_VEX_0F3A6E) },
8026 { PREFIX_TABLE (PREFIX_VEX_0F3A6F) },
8027 /* 70 */
8028 { Bad_Opcode },
8029 { Bad_Opcode },
8030 { Bad_Opcode },
8031 { Bad_Opcode },
8032 { Bad_Opcode },
8033 { Bad_Opcode },
8034 { Bad_Opcode },
8035 { Bad_Opcode },
8036 /* 78 */
8037 { PREFIX_TABLE (PREFIX_VEX_0F3A78) },
8038 { PREFIX_TABLE (PREFIX_VEX_0F3A79) },
8039 { PREFIX_TABLE (PREFIX_VEX_0F3A7A) },
8040 { PREFIX_TABLE (PREFIX_VEX_0F3A7B) },
8041 { PREFIX_TABLE (PREFIX_VEX_0F3A7C) },
8042 { PREFIX_TABLE (PREFIX_VEX_0F3A7D) },
8043 { PREFIX_TABLE (PREFIX_VEX_0F3A7E) },
8044 { PREFIX_TABLE (PREFIX_VEX_0F3A7F) },
8045 /* 80 */
8046 { Bad_Opcode },
8047 { Bad_Opcode },
8048 { Bad_Opcode },
8049 { Bad_Opcode },
8050 { Bad_Opcode },
8051 { Bad_Opcode },
8052 { Bad_Opcode },
8053 { Bad_Opcode },
8054 /* 88 */
8055 { Bad_Opcode },
8056 { Bad_Opcode },
8057 { Bad_Opcode },
8058 { Bad_Opcode },
8059 { Bad_Opcode },
8060 { Bad_Opcode },
8061 { Bad_Opcode },
8062 { Bad_Opcode },
8063 /* 90 */
8064 { Bad_Opcode },
8065 { Bad_Opcode },
8066 { Bad_Opcode },
8067 { Bad_Opcode },
8068 { Bad_Opcode },
8069 { Bad_Opcode },
8070 { Bad_Opcode },
8071 { Bad_Opcode },
8072 /* 98 */
8073 { Bad_Opcode },
8074 { Bad_Opcode },
8075 { Bad_Opcode },
8076 { Bad_Opcode },
8077 { Bad_Opcode },
8078 { Bad_Opcode },
8079 { Bad_Opcode },
8080 { Bad_Opcode },
8081 /* a0 */
8082 { Bad_Opcode },
8083 { Bad_Opcode },
8084 { Bad_Opcode },
8085 { Bad_Opcode },
8086 { Bad_Opcode },
8087 { Bad_Opcode },
8088 { Bad_Opcode },
8089 { Bad_Opcode },
8090 /* a8 */
8091 { Bad_Opcode },
8092 { Bad_Opcode },
8093 { Bad_Opcode },
8094 { Bad_Opcode },
8095 { Bad_Opcode },
8096 { Bad_Opcode },
8097 { Bad_Opcode },
8098 { Bad_Opcode },
8099 /* b0 */
8100 { Bad_Opcode },
8101 { Bad_Opcode },
8102 { Bad_Opcode },
8103 { Bad_Opcode },
8104 { Bad_Opcode },
8105 { Bad_Opcode },
8106 { Bad_Opcode },
8107 { Bad_Opcode },
8108 /* b8 */
8109 { Bad_Opcode },
8110 { Bad_Opcode },
8111 { Bad_Opcode },
8112 { Bad_Opcode },
8113 { Bad_Opcode },
8114 { Bad_Opcode },
8115 { Bad_Opcode },
8116 { Bad_Opcode },
8117 /* c0 */
8118 { Bad_Opcode },
8119 { Bad_Opcode },
8120 { Bad_Opcode },
8121 { Bad_Opcode },
8122 { Bad_Opcode },
8123 { Bad_Opcode },
8124 { Bad_Opcode },
8125 { Bad_Opcode },
8126 /* c8 */
8127 { Bad_Opcode },
8128 { Bad_Opcode },
8129 { Bad_Opcode },
8130 { Bad_Opcode },
8131 { Bad_Opcode },
8132 { Bad_Opcode },
8133 { Bad_Opcode },
8134 { Bad_Opcode },
8135 /* d0 */
8136 { Bad_Opcode },
8137 { Bad_Opcode },
8138 { Bad_Opcode },
8139 { Bad_Opcode },
8140 { Bad_Opcode },
8141 { Bad_Opcode },
8142 { Bad_Opcode },
8143 { Bad_Opcode },
8144 /* d8 */
8145 { Bad_Opcode },
8146 { Bad_Opcode },
8147 { Bad_Opcode },
8148 { Bad_Opcode },
8149 { Bad_Opcode },
8150 { Bad_Opcode },
8151 { Bad_Opcode },
8152 { PREFIX_TABLE (PREFIX_VEX_0F3ADF) },
8153 /* e0 */
8154 { Bad_Opcode },
8155 { Bad_Opcode },
8156 { Bad_Opcode },
8157 { Bad_Opcode },
8158 { Bad_Opcode },
8159 { Bad_Opcode },
8160 { Bad_Opcode },
8161 { Bad_Opcode },
8162 /* e8 */
8163 { Bad_Opcode },
8164 { Bad_Opcode },
8165 { Bad_Opcode },
8166 { Bad_Opcode },
8167 { Bad_Opcode },
8168 { Bad_Opcode },
8169 { Bad_Opcode },
8170 { Bad_Opcode },
8171 /* f0 */
8172 { Bad_Opcode },
8173 { Bad_Opcode },
8174 { Bad_Opcode },
8175 { Bad_Opcode },
8176 { Bad_Opcode },
8177 { Bad_Opcode },
8178 { Bad_Opcode },
8179 { Bad_Opcode },
8180 /* f8 */
8181 { Bad_Opcode },
8182 { Bad_Opcode },
8183 { Bad_Opcode },
8184 { Bad_Opcode },
8185 { Bad_Opcode },
8186 { Bad_Opcode },
8187 { Bad_Opcode },
8188 { Bad_Opcode },
8192 static const struct dis386 vex_len_table[][2] = {
8193 /* VEX_LEN_0F10_P_1 */
8195 { VEX_W_TABLE (VEX_W_0F10_P_1) },
8196 { VEX_W_TABLE (VEX_W_0F10_P_1) },
8199 /* VEX_LEN_0F10_P_3 */
8201 { VEX_W_TABLE (VEX_W_0F10_P_3) },
8202 { VEX_W_TABLE (VEX_W_0F10_P_3) },
8205 /* VEX_LEN_0F11_P_1 */
8207 { VEX_W_TABLE (VEX_W_0F11_P_1) },
8208 { VEX_W_TABLE (VEX_W_0F11_P_1) },
8211 /* VEX_LEN_0F11_P_3 */
8213 { VEX_W_TABLE (VEX_W_0F11_P_3) },
8214 { VEX_W_TABLE (VEX_W_0F11_P_3) },
8217 /* VEX_LEN_0F12_P_0_M_0 */
8219 { VEX_W_TABLE (VEX_W_0F12_P_0_M_0) },
8222 /* VEX_LEN_0F12_P_0_M_1 */
8224 { VEX_W_TABLE (VEX_W_0F12_P_0_M_1) },
8227 /* VEX_LEN_0F12_P_2 */
8229 { VEX_W_TABLE (VEX_W_0F12_P_2) },
8232 /* VEX_LEN_0F13_M_0 */
8234 { VEX_W_TABLE (VEX_W_0F13_M_0) },
8237 /* VEX_LEN_0F16_P_0_M_0 */
8239 { VEX_W_TABLE (VEX_W_0F16_P_0_M_0) },
8242 /* VEX_LEN_0F16_P_0_M_1 */
8244 { VEX_W_TABLE (VEX_W_0F16_P_0_M_1) },
8247 /* VEX_LEN_0F16_P_2 */
8249 { VEX_W_TABLE (VEX_W_0F16_P_2) },
8252 /* VEX_LEN_0F17_M_0 */
8254 { VEX_W_TABLE (VEX_W_0F17_M_0) },
8257 /* VEX_LEN_0F2A_P_1 */
8259 { "vcvtsi2ss%LQ", { XMScalar, VexScalar, Ev } },
8260 { "vcvtsi2ss%LQ", { XMScalar, VexScalar, Ev } },
8263 /* VEX_LEN_0F2A_P_3 */
8265 { "vcvtsi2sd%LQ", { XMScalar, VexScalar, Ev } },
8266 { "vcvtsi2sd%LQ", { XMScalar, VexScalar, Ev } },
8269 /* VEX_LEN_0F2C_P_1 */
8271 { "vcvttss2siY", { Gv, EXdScalar } },
8272 { "vcvttss2siY", { Gv, EXdScalar } },
8275 /* VEX_LEN_0F2C_P_3 */
8277 { "vcvttsd2siY", { Gv, EXqScalar } },
8278 { "vcvttsd2siY", { Gv, EXqScalar } },
8281 /* VEX_LEN_0F2D_P_1 */
8283 { "vcvtss2siY", { Gv, EXdScalar } },
8284 { "vcvtss2siY", { Gv, EXdScalar } },
8287 /* VEX_LEN_0F2D_P_3 */
8289 { "vcvtsd2siY", { Gv, EXqScalar } },
8290 { "vcvtsd2siY", { Gv, EXqScalar } },
8293 /* VEX_LEN_0F2E_P_0 */
8295 { VEX_W_TABLE (VEX_W_0F2E_P_0) },
8296 { VEX_W_TABLE (VEX_W_0F2E_P_0) },
8299 /* VEX_LEN_0F2E_P_2 */
8301 { VEX_W_TABLE (VEX_W_0F2E_P_2) },
8302 { VEX_W_TABLE (VEX_W_0F2E_P_2) },
8305 /* VEX_LEN_0F2F_P_0 */
8307 { VEX_W_TABLE (VEX_W_0F2F_P_0) },
8308 { VEX_W_TABLE (VEX_W_0F2F_P_0) },
8311 /* VEX_LEN_0F2F_P_2 */
8313 { VEX_W_TABLE (VEX_W_0F2F_P_2) },
8314 { VEX_W_TABLE (VEX_W_0F2F_P_2) },
8317 /* VEX_LEN_0F51_P_1 */
8319 { VEX_W_TABLE (VEX_W_0F51_P_1) },
8320 { VEX_W_TABLE (VEX_W_0F51_P_1) },
8323 /* VEX_LEN_0F51_P_3 */
8325 { VEX_W_TABLE (VEX_W_0F51_P_3) },
8326 { VEX_W_TABLE (VEX_W_0F51_P_3) },
8329 /* VEX_LEN_0F52_P_1 */
8331 { VEX_W_TABLE (VEX_W_0F52_P_1) },
8332 { VEX_W_TABLE (VEX_W_0F52_P_1) },
8335 /* VEX_LEN_0F53_P_1 */
8337 { VEX_W_TABLE (VEX_W_0F53_P_1) },
8338 { VEX_W_TABLE (VEX_W_0F53_P_1) },
8341 /* VEX_LEN_0F58_P_1 */
8343 { VEX_W_TABLE (VEX_W_0F58_P_1) },
8344 { VEX_W_TABLE (VEX_W_0F58_P_1) },
8347 /* VEX_LEN_0F58_P_3 */
8349 { VEX_W_TABLE (VEX_W_0F58_P_3) },
8350 { VEX_W_TABLE (VEX_W_0F58_P_3) },
8353 /* VEX_LEN_0F59_P_1 */
8355 { VEX_W_TABLE (VEX_W_0F59_P_1) },
8356 { VEX_W_TABLE (VEX_W_0F59_P_1) },
8359 /* VEX_LEN_0F59_P_3 */
8361 { VEX_W_TABLE (VEX_W_0F59_P_3) },
8362 { VEX_W_TABLE (VEX_W_0F59_P_3) },
8365 /* VEX_LEN_0F5A_P_1 */
8367 { VEX_W_TABLE (VEX_W_0F5A_P_1) },
8368 { VEX_W_TABLE (VEX_W_0F5A_P_1) },
8371 /* VEX_LEN_0F5A_P_3 */
8373 { VEX_W_TABLE (VEX_W_0F5A_P_3) },
8374 { VEX_W_TABLE (VEX_W_0F5A_P_3) },
8377 /* VEX_LEN_0F5C_P_1 */
8379 { VEX_W_TABLE (VEX_W_0F5C_P_1) },
8380 { VEX_W_TABLE (VEX_W_0F5C_P_1) },
8383 /* VEX_LEN_0F5C_P_3 */
8385 { VEX_W_TABLE (VEX_W_0F5C_P_3) },
8386 { VEX_W_TABLE (VEX_W_0F5C_P_3) },
8389 /* VEX_LEN_0F5D_P_1 */
8391 { VEX_W_TABLE (VEX_W_0F5D_P_1) },
8392 { VEX_W_TABLE (VEX_W_0F5D_P_1) },
8395 /* VEX_LEN_0F5D_P_3 */
8397 { VEX_W_TABLE (VEX_W_0F5D_P_3) },
8398 { VEX_W_TABLE (VEX_W_0F5D_P_3) },
8401 /* VEX_LEN_0F5E_P_1 */
8403 { VEX_W_TABLE (VEX_W_0F5E_P_1) },
8404 { VEX_W_TABLE (VEX_W_0F5E_P_1) },
8407 /* VEX_LEN_0F5E_P_3 */
8409 { VEX_W_TABLE (VEX_W_0F5E_P_3) },
8410 { VEX_W_TABLE (VEX_W_0F5E_P_3) },
8413 /* VEX_LEN_0F5F_P_1 */
8415 { VEX_W_TABLE (VEX_W_0F5F_P_1) },
8416 { VEX_W_TABLE (VEX_W_0F5F_P_1) },
8419 /* VEX_LEN_0F5F_P_3 */
8421 { VEX_W_TABLE (VEX_W_0F5F_P_3) },
8422 { VEX_W_TABLE (VEX_W_0F5F_P_3) },
8425 /* VEX_LEN_0F60_P_2 */
8427 { VEX_W_TABLE (VEX_W_0F60_P_2) },
8430 /* VEX_LEN_0F61_P_2 */
8432 { VEX_W_TABLE (VEX_W_0F61_P_2) },
8435 /* VEX_LEN_0F62_P_2 */
8437 { VEX_W_TABLE (VEX_W_0F62_P_2) },
8440 /* VEX_LEN_0F63_P_2 */
8442 { VEX_W_TABLE (VEX_W_0F63_P_2) },
8445 /* VEX_LEN_0F64_P_2 */
8447 { VEX_W_TABLE (VEX_W_0F64_P_2) },
8450 /* VEX_LEN_0F65_P_2 */
8452 { VEX_W_TABLE (VEX_W_0F65_P_2) },
8455 /* VEX_LEN_0F66_P_2 */
8457 { VEX_W_TABLE (VEX_W_0F66_P_2) },
8460 /* VEX_LEN_0F67_P_2 */
8462 { VEX_W_TABLE (VEX_W_0F67_P_2) },
8465 /* VEX_LEN_0F68_P_2 */
8467 { VEX_W_TABLE (VEX_W_0F68_P_2) },
8470 /* VEX_LEN_0F69_P_2 */
8472 { VEX_W_TABLE (VEX_W_0F69_P_2) },
8475 /* VEX_LEN_0F6A_P_2 */
8477 { VEX_W_TABLE (VEX_W_0F6A_P_2) },
8480 /* VEX_LEN_0F6B_P_2 */
8482 { VEX_W_TABLE (VEX_W_0F6B_P_2) },
8485 /* VEX_LEN_0F6C_P_2 */
8487 { VEX_W_TABLE (VEX_W_0F6C_P_2) },
8490 /* VEX_LEN_0F6D_P_2 */
8492 { VEX_W_TABLE (VEX_W_0F6D_P_2) },
8495 /* VEX_LEN_0F6E_P_2 */
8497 { "vmovK", { XMScalar, Edq } },
8498 { "vmovK", { XMScalar, Edq } },
8501 /* VEX_LEN_0F70_P_1 */
8503 { VEX_W_TABLE (VEX_W_0F70_P_1) },
8506 /* VEX_LEN_0F70_P_2 */
8508 { VEX_W_TABLE (VEX_W_0F70_P_2) },
8511 /* VEX_LEN_0F70_P_3 */
8513 { VEX_W_TABLE (VEX_W_0F70_P_3) },
8516 /* VEX_LEN_0F71_R_2_P_2 */
8518 { VEX_W_TABLE (VEX_W_0F71_R_2_P_2) },
8521 /* VEX_LEN_0F71_R_4_P_2 */
8523 { VEX_W_TABLE (VEX_W_0F71_R_4_P_2) },
8526 /* VEX_LEN_0F71_R_6_P_2 */
8528 { VEX_W_TABLE (VEX_W_0F71_R_6_P_2) },
8531 /* VEX_LEN_0F72_R_2_P_2 */
8533 { VEX_W_TABLE (VEX_W_0F72_R_2_P_2) },
8536 /* VEX_LEN_0F72_R_4_P_2 */
8538 { VEX_W_TABLE (VEX_W_0F72_R_4_P_2) },
8541 /* VEX_LEN_0F72_R_6_P_2 */
8543 { VEX_W_TABLE (VEX_W_0F72_R_6_P_2) },
8546 /* VEX_LEN_0F73_R_2_P_2 */
8548 { VEX_W_TABLE (VEX_W_0F73_R_2_P_2) },
8551 /* VEX_LEN_0F73_R_3_P_2 */
8553 { VEX_W_TABLE (VEX_W_0F73_R_3_P_2) },
8556 /* VEX_LEN_0F73_R_6_P_2 */
8558 { VEX_W_TABLE (VEX_W_0F73_R_6_P_2) },
8561 /* VEX_LEN_0F73_R_7_P_2 */
8563 { VEX_W_TABLE (VEX_W_0F73_R_7_P_2) },
8566 /* VEX_LEN_0F74_P_2 */
8568 { VEX_W_TABLE (VEX_W_0F74_P_2) },
8571 /* VEX_LEN_0F75_P_2 */
8573 { VEX_W_TABLE (VEX_W_0F75_P_2) },
8576 /* VEX_LEN_0F76_P_2 */
8578 { VEX_W_TABLE (VEX_W_0F76_P_2) },
8581 /* VEX_LEN_0F7E_P_1 */
8583 { VEX_W_TABLE (VEX_W_0F7E_P_1) },
8584 { VEX_W_TABLE (VEX_W_0F7E_P_1) },
8587 /* VEX_LEN_0F7E_P_2 */
8589 { "vmovK", { Edq, XMScalar } },
8590 { "vmovK", { Edq, XMScalar } },
8593 /* VEX_LEN_0FAE_R_2_M_0 */
8595 { VEX_W_TABLE (VEX_W_0FAE_R_2_M_0) },
8598 /* VEX_LEN_0FAE_R_3_M_0 */
8600 { VEX_W_TABLE (VEX_W_0FAE_R_3_M_0) },
8603 /* VEX_LEN_0FC2_P_1 */
8605 { VEX_W_TABLE (VEX_W_0FC2_P_1) },
8606 { VEX_W_TABLE (VEX_W_0FC2_P_1) },
8609 /* VEX_LEN_0FC2_P_3 */
8611 { VEX_W_TABLE (VEX_W_0FC2_P_3) },
8612 { VEX_W_TABLE (VEX_W_0FC2_P_3) },
8615 /* VEX_LEN_0FC4_P_2 */
8617 { VEX_W_TABLE (VEX_W_0FC4_P_2) },
8620 /* VEX_LEN_0FC5_P_2 */
8622 { VEX_W_TABLE (VEX_W_0FC5_P_2) },
8625 /* VEX_LEN_0FD1_P_2 */
8627 { VEX_W_TABLE (VEX_W_0FD1_P_2) },
8630 /* VEX_LEN_0FD2_P_2 */
8632 { VEX_W_TABLE (VEX_W_0FD2_P_2) },
8635 /* VEX_LEN_0FD3_P_2 */
8637 { VEX_W_TABLE (VEX_W_0FD3_P_2) },
8640 /* VEX_LEN_0FD4_P_2 */
8642 { VEX_W_TABLE (VEX_W_0FD4_P_2) },
8645 /* VEX_LEN_0FD5_P_2 */
8647 { VEX_W_TABLE (VEX_W_0FD5_P_2) },
8650 /* VEX_LEN_0FD6_P_2 */
8652 { VEX_W_TABLE (VEX_W_0FD6_P_2) },
8653 { VEX_W_TABLE (VEX_W_0FD6_P_2) },
8656 /* VEX_LEN_0FD7_P_2_M_1 */
8658 { VEX_W_TABLE (VEX_W_0FD7_P_2_M_1) },
8661 /* VEX_LEN_0FD8_P_2 */
8663 { VEX_W_TABLE (VEX_W_0FD8_P_2) },
8666 /* VEX_LEN_0FD9_P_2 */
8668 { VEX_W_TABLE (VEX_W_0FD9_P_2) },
8671 /* VEX_LEN_0FDA_P_2 */
8673 { VEX_W_TABLE (VEX_W_0FDA_P_2) },
8676 /* VEX_LEN_0FDB_P_2 */
8678 { VEX_W_TABLE (VEX_W_0FDB_P_2) },
8681 /* VEX_LEN_0FDC_P_2 */
8683 { VEX_W_TABLE (VEX_W_0FDC_P_2) },
8686 /* VEX_LEN_0FDD_P_2 */
8688 { VEX_W_TABLE (VEX_W_0FDD_P_2) },
8691 /* VEX_LEN_0FDE_P_2 */
8693 { VEX_W_TABLE (VEX_W_0FDE_P_2) },
8696 /* VEX_LEN_0FDF_P_2 */
8698 { VEX_W_TABLE (VEX_W_0FDF_P_2) },
8701 /* VEX_LEN_0FE0_P_2 */
8703 { VEX_W_TABLE (VEX_W_0FE0_P_2) },
8706 /* VEX_LEN_0FE1_P_2 */
8708 { VEX_W_TABLE (VEX_W_0FE1_P_2) },
8711 /* VEX_LEN_0FE2_P_2 */
8713 { VEX_W_TABLE (VEX_W_0FE2_P_2) },
8716 /* VEX_LEN_0FE3_P_2 */
8718 { VEX_W_TABLE (VEX_W_0FE3_P_2) },
8721 /* VEX_LEN_0FE4_P_2 */
8723 { VEX_W_TABLE (VEX_W_0FE4_P_2) },
8726 /* VEX_LEN_0FE5_P_2 */
8728 { VEX_W_TABLE (VEX_W_0FE5_P_2) },
8731 /* VEX_LEN_0FE8_P_2 */
8733 { VEX_W_TABLE (VEX_W_0FE8_P_2) },
8736 /* VEX_LEN_0FE9_P_2 */
8738 { VEX_W_TABLE (VEX_W_0FE9_P_2) },
8741 /* VEX_LEN_0FEA_P_2 */
8743 { VEX_W_TABLE (VEX_W_0FEA_P_2) },
8746 /* VEX_LEN_0FEB_P_2 */
8748 { VEX_W_TABLE (VEX_W_0FEB_P_2) },
8751 /* VEX_LEN_0FEC_P_2 */
8753 { VEX_W_TABLE (VEX_W_0FEC_P_2) },
8756 /* VEX_LEN_0FED_P_2 */
8758 { VEX_W_TABLE (VEX_W_0FED_P_2) },
8761 /* VEX_LEN_0FEE_P_2 */
8763 { VEX_W_TABLE (VEX_W_0FEE_P_2) },
8766 /* VEX_LEN_0FEF_P_2 */
8768 { VEX_W_TABLE (VEX_W_0FEF_P_2) },
8771 /* VEX_LEN_0FF1_P_2 */
8773 { VEX_W_TABLE (VEX_W_0FF1_P_2) },
8776 /* VEX_LEN_0FF2_P_2 */
8778 { VEX_W_TABLE (VEX_W_0FF2_P_2) },
8781 /* VEX_LEN_0FF3_P_2 */
8783 { VEX_W_TABLE (VEX_W_0FF3_P_2) },
8786 /* VEX_LEN_0FF4_P_2 */
8788 { VEX_W_TABLE (VEX_W_0FF4_P_2) },
8791 /* VEX_LEN_0FF5_P_2 */
8793 { VEX_W_TABLE (VEX_W_0FF5_P_2) },
8796 /* VEX_LEN_0FF6_P_2 */
8798 { VEX_W_TABLE (VEX_W_0FF6_P_2) },
8801 /* VEX_LEN_0FF7_P_2 */
8803 { VEX_W_TABLE (VEX_W_0FF7_P_2) },
8806 /* VEX_LEN_0FF8_P_2 */
8808 { VEX_W_TABLE (VEX_W_0FF8_P_2) },
8811 /* VEX_LEN_0FF9_P_2 */
8813 { VEX_W_TABLE (VEX_W_0FF9_P_2) },
8816 /* VEX_LEN_0FFA_P_2 */
8818 { VEX_W_TABLE (VEX_W_0FFA_P_2) },
8821 /* VEX_LEN_0FFB_P_2 */
8823 { VEX_W_TABLE (VEX_W_0FFB_P_2) },
8826 /* VEX_LEN_0FFC_P_2 */
8828 { VEX_W_TABLE (VEX_W_0FFC_P_2) },
8831 /* VEX_LEN_0FFD_P_2 */
8833 { VEX_W_TABLE (VEX_W_0FFD_P_2) },
8836 /* VEX_LEN_0FFE_P_2 */
8838 { VEX_W_TABLE (VEX_W_0FFE_P_2) },
8841 /* VEX_LEN_0F3800_P_2 */
8843 { VEX_W_TABLE (VEX_W_0F3800_P_2) },
8846 /* VEX_LEN_0F3801_P_2 */
8848 { VEX_W_TABLE (VEX_W_0F3801_P_2) },
8851 /* VEX_LEN_0F3802_P_2 */
8853 { VEX_W_TABLE (VEX_W_0F3802_P_2) },
8856 /* VEX_LEN_0F3803_P_2 */
8858 { VEX_W_TABLE (VEX_W_0F3803_P_2) },
8861 /* VEX_LEN_0F3804_P_2 */
8863 { VEX_W_TABLE (VEX_W_0F3804_P_2) },
8866 /* VEX_LEN_0F3805_P_2 */
8868 { VEX_W_TABLE (VEX_W_0F3805_P_2) },
8871 /* VEX_LEN_0F3806_P_2 */
8873 { VEX_W_TABLE (VEX_W_0F3806_P_2) },
8876 /* VEX_LEN_0F3807_P_2 */
8878 { VEX_W_TABLE (VEX_W_0F3807_P_2) },
8881 /* VEX_LEN_0F3808_P_2 */
8883 { VEX_W_TABLE (VEX_W_0F3808_P_2) },
8886 /* VEX_LEN_0F3809_P_2 */
8888 { VEX_W_TABLE (VEX_W_0F3809_P_2) },
8891 /* VEX_LEN_0F380A_P_2 */
8893 { VEX_W_TABLE (VEX_W_0F380A_P_2) },
8896 /* VEX_LEN_0F380B_P_2 */
8898 { VEX_W_TABLE (VEX_W_0F380B_P_2) },
8901 /* VEX_LEN_0F3819_P_2_M_0 */
8903 { Bad_Opcode },
8904 { VEX_W_TABLE (VEX_W_0F3819_P_2_M_0) },
8907 /* VEX_LEN_0F381A_P_2_M_0 */
8909 { Bad_Opcode },
8910 { VEX_W_TABLE (VEX_W_0F381A_P_2_M_0) },
8913 /* VEX_LEN_0F381C_P_2 */
8915 { VEX_W_TABLE (VEX_W_0F381C_P_2) },
8918 /* VEX_LEN_0F381D_P_2 */
8920 { VEX_W_TABLE (VEX_W_0F381D_P_2) },
8923 /* VEX_LEN_0F381E_P_2 */
8925 { VEX_W_TABLE (VEX_W_0F381E_P_2) },
8928 /* VEX_LEN_0F3820_P_2 */
8930 { VEX_W_TABLE (VEX_W_0F3820_P_2) },
8933 /* VEX_LEN_0F3821_P_2 */
8935 { VEX_W_TABLE (VEX_W_0F3821_P_2) },
8938 /* VEX_LEN_0F3822_P_2 */
8940 { VEX_W_TABLE (VEX_W_0F3822_P_2) },
8943 /* VEX_LEN_0F3823_P_2 */
8945 { VEX_W_TABLE (VEX_W_0F3823_P_2) },
8948 /* VEX_LEN_0F3824_P_2 */
8950 { VEX_W_TABLE (VEX_W_0F3824_P_2) },
8953 /* VEX_LEN_0F3825_P_2 */
8955 { VEX_W_TABLE (VEX_W_0F3825_P_2) },
8958 /* VEX_LEN_0F3828_P_2 */
8960 { VEX_W_TABLE (VEX_W_0F3828_P_2) },
8963 /* VEX_LEN_0F3829_P_2 */
8965 { VEX_W_TABLE (VEX_W_0F3829_P_2) },
8968 /* VEX_LEN_0F382A_P_2_M_0 */
8970 { VEX_W_TABLE (VEX_W_0F382A_P_2_M_0) },
8973 /* VEX_LEN_0F382B_P_2 */
8975 { VEX_W_TABLE (VEX_W_0F382B_P_2) },
8978 /* VEX_LEN_0F3830_P_2 */
8980 { VEX_W_TABLE (VEX_W_0F3830_P_2) },
8983 /* VEX_LEN_0F3831_P_2 */
8985 { VEX_W_TABLE (VEX_W_0F3831_P_2) },
8988 /* VEX_LEN_0F3832_P_2 */
8990 { VEX_W_TABLE (VEX_W_0F3832_P_2) },
8993 /* VEX_LEN_0F3833_P_2 */
8995 { VEX_W_TABLE (VEX_W_0F3833_P_2) },
8998 /* VEX_LEN_0F3834_P_2 */
9000 { VEX_W_TABLE (VEX_W_0F3834_P_2) },
9003 /* VEX_LEN_0F3835_P_2 */
9005 { VEX_W_TABLE (VEX_W_0F3835_P_2) },
9008 /* VEX_LEN_0F3837_P_2 */
9010 { VEX_W_TABLE (VEX_W_0F3837_P_2) },
9013 /* VEX_LEN_0F3838_P_2 */
9015 { VEX_W_TABLE (VEX_W_0F3838_P_2) },
9018 /* VEX_LEN_0F3839_P_2 */
9020 { VEX_W_TABLE (VEX_W_0F3839_P_2) },
9023 /* VEX_LEN_0F383A_P_2 */
9025 { VEX_W_TABLE (VEX_W_0F383A_P_2) },
9028 /* VEX_LEN_0F383B_P_2 */
9030 { VEX_W_TABLE (VEX_W_0F383B_P_2) },
9033 /* VEX_LEN_0F383C_P_2 */
9035 { VEX_W_TABLE (VEX_W_0F383C_P_2) },
9038 /* VEX_LEN_0F383D_P_2 */
9040 { VEX_W_TABLE (VEX_W_0F383D_P_2) },
9043 /* VEX_LEN_0F383E_P_2 */
9045 { VEX_W_TABLE (VEX_W_0F383E_P_2) },
9048 /* VEX_LEN_0F383F_P_2 */
9050 { VEX_W_TABLE (VEX_W_0F383F_P_2) },
9053 /* VEX_LEN_0F3840_P_2 */
9055 { VEX_W_TABLE (VEX_W_0F3840_P_2) },
9058 /* VEX_LEN_0F3841_P_2 */
9060 { VEX_W_TABLE (VEX_W_0F3841_P_2) },
9063 /* VEX_LEN_0F38DB_P_2 */
9065 { VEX_W_TABLE (VEX_W_0F38DB_P_2) },
9068 /* VEX_LEN_0F38DC_P_2 */
9070 { VEX_W_TABLE (VEX_W_0F38DC_P_2) },
9073 /* VEX_LEN_0F38DD_P_2 */
9075 { VEX_W_TABLE (VEX_W_0F38DD_P_2) },
9078 /* VEX_LEN_0F38DE_P_2 */
9080 { VEX_W_TABLE (VEX_W_0F38DE_P_2) },
9083 /* VEX_LEN_0F38DF_P_2 */
9085 { VEX_W_TABLE (VEX_W_0F38DF_P_2) },
9088 /* VEX_LEN_0F38F2_P_0 */
9090 { "andnS", { Gdq, VexGdq, Edq } },
9093 /* VEX_LEN_0F38F3_R_1_P_0 */
9095 { "blsrS", { VexGdq, Edq } },
9098 /* VEX_LEN_0F38F3_R_2_P_0 */
9100 { "blsmskS", { VexGdq, Edq } },
9103 /* VEX_LEN_0F38F3_R_3_P_0 */
9105 { "blsiS", { VexGdq, Edq } },
9108 /* VEX_LEN_0F38F7_P_0 */
9110 { "bextrS", { Gdq, Edq, VexGdq } },
9113 /* VEX_LEN_0F3A06_P_2 */
9115 { Bad_Opcode },
9116 { VEX_W_TABLE (VEX_W_0F3A06_P_2) },
9119 /* VEX_LEN_0F3A0A_P_2 */
9121 { VEX_W_TABLE (VEX_W_0F3A0A_P_2) },
9122 { VEX_W_TABLE (VEX_W_0F3A0A_P_2) },
9125 /* VEX_LEN_0F3A0B_P_2 */
9127 { VEX_W_TABLE (VEX_W_0F3A0B_P_2) },
9128 { VEX_W_TABLE (VEX_W_0F3A0B_P_2) },
9131 /* VEX_LEN_0F3A0E_P_2 */
9133 { VEX_W_TABLE (VEX_W_0F3A0E_P_2) },
9136 /* VEX_LEN_0F3A0F_P_2 */
9138 { VEX_W_TABLE (VEX_W_0F3A0F_P_2) },
9141 /* VEX_LEN_0F3A14_P_2 */
9143 { VEX_W_TABLE (VEX_W_0F3A14_P_2) },
9146 /* VEX_LEN_0F3A15_P_2 */
9148 { VEX_W_TABLE (VEX_W_0F3A15_P_2) },
9151 /* VEX_LEN_0F3A16_P_2 */
9153 { "vpextrK", { Edq, XM, Ib } },
9156 /* VEX_LEN_0F3A17_P_2 */
9158 { "vextractps", { Edqd, XM, Ib } },
9161 /* VEX_LEN_0F3A18_P_2 */
9163 { Bad_Opcode },
9164 { VEX_W_TABLE (VEX_W_0F3A18_P_2) },
9167 /* VEX_LEN_0F3A19_P_2 */
9169 { Bad_Opcode },
9170 { VEX_W_TABLE (VEX_W_0F3A19_P_2) },
9173 /* VEX_LEN_0F3A20_P_2 */
9175 { VEX_W_TABLE (VEX_W_0F3A20_P_2) },
9178 /* VEX_LEN_0F3A21_P_2 */
9180 { VEX_W_TABLE (VEX_W_0F3A21_P_2) },
9183 /* VEX_LEN_0F3A22_P_2 */
9185 { "vpinsrK", { XM, Vex128, Edq, Ib } },
9188 /* VEX_LEN_0F3A41_P_2 */
9190 { VEX_W_TABLE (VEX_W_0F3A41_P_2) },
9193 /* VEX_LEN_0F3A42_P_2 */
9195 { VEX_W_TABLE (VEX_W_0F3A42_P_2) },
9198 /* VEX_LEN_0F3A44_P_2 */
9200 { VEX_W_TABLE (VEX_W_0F3A44_P_2) },
9203 /* VEX_LEN_0F3A4C_P_2 */
9205 { VEX_W_TABLE (VEX_W_0F3A4C_P_2) },
9208 /* VEX_LEN_0F3A60_P_2 */
9210 { VEX_W_TABLE (VEX_W_0F3A60_P_2) },
9213 /* VEX_LEN_0F3A61_P_2 */
9215 { VEX_W_TABLE (VEX_W_0F3A61_P_2) },
9218 /* VEX_LEN_0F3A62_P_2 */
9220 { VEX_W_TABLE (VEX_W_0F3A62_P_2) },
9223 /* VEX_LEN_0F3A63_P_2 */
9225 { VEX_W_TABLE (VEX_W_0F3A63_P_2) },
9228 /* VEX_LEN_0F3A6A_P_2 */
9230 { "vfmaddss", { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
9233 /* VEX_LEN_0F3A6B_P_2 */
9235 { "vfmaddsd", { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
9238 /* VEX_LEN_0F3A6E_P_2 */
9240 { "vfmsubss", { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
9243 /* VEX_LEN_0F3A6F_P_2 */
9245 { "vfmsubsd", { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
9248 /* VEX_LEN_0F3A7A_P_2 */
9250 { "vfnmaddss", { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
9253 /* VEX_LEN_0F3A7B_P_2 */
9255 { "vfnmaddsd", { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
9258 /* VEX_LEN_0F3A7E_P_2 */
9260 { "vfnmsubss", { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
9263 /* VEX_LEN_0F3A7F_P_2 */
9265 { "vfnmsubsd", { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
9268 /* VEX_LEN_0F3ADF_P_2 */
9270 { VEX_W_TABLE (VEX_W_0F3ADF_P_2) },
9273 /* VEX_LEN_0FXOP_09_80 */
9275 { "vfrczps", { XM, EXxmm } },
9276 { "vfrczps", { XM, EXymmq } },
9279 /* VEX_LEN_0FXOP_09_81 */
9281 { "vfrczpd", { XM, EXxmm } },
9282 { "vfrczpd", { XM, EXymmq } },
9286 static const struct dis386 vex_w_table[][2] = {
9288 /* VEX_W_0F10_P_0 */
9289 { "vmovups", { XM, EXx } },
9292 /* VEX_W_0F10_P_1 */
9293 { "vmovss", { XMVexScalar, VexScalar, EXdScalar } },
9296 /* VEX_W_0F10_P_2 */
9297 { "vmovupd", { XM, EXx } },
9300 /* VEX_W_0F10_P_3 */
9301 { "vmovsd", { XMVexScalar, VexScalar, EXqScalar } },
9304 /* VEX_W_0F11_P_0 */
9305 { "vmovups", { EXxS, XM } },
9308 /* VEX_W_0F11_P_1 */
9309 { "vmovss", { EXdVexScalarS, VexScalar, XMScalar } },
9312 /* VEX_W_0F11_P_2 */
9313 { "vmovupd", { EXxS, XM } },
9316 /* VEX_W_0F11_P_3 */
9317 { "vmovsd", { EXqVexScalarS, VexScalar, XMScalar } },
9320 /* VEX_W_0F12_P_0_M_0 */
9321 { "vmovlps", { XM, Vex128, EXq } },
9324 /* VEX_W_0F12_P_0_M_1 */
9325 { "vmovhlps", { XM, Vex128, EXq } },
9328 /* VEX_W_0F12_P_1 */
9329 { "vmovsldup", { XM, EXx } },
9332 /* VEX_W_0F12_P_2 */
9333 { "vmovlpd", { XM, Vex128, EXq } },
9336 /* VEX_W_0F12_P_3 */
9337 { "vmovddup", { XM, EXymmq } },
9340 /* VEX_W_0F13_M_0 */
9341 { "vmovlpX", { EXq, XM } },
9344 /* VEX_W_0F14 */
9345 { "vunpcklpX", { XM, Vex, EXx } },
9348 /* VEX_W_0F15 */
9349 { "vunpckhpX", { XM, Vex, EXx } },
9352 /* VEX_W_0F16_P_0_M_0 */
9353 { "vmovhps", { XM, Vex128, EXq } },
9356 /* VEX_W_0F16_P_0_M_1 */
9357 { "vmovlhps", { XM, Vex128, EXq } },
9360 /* VEX_W_0F16_P_1 */
9361 { "vmovshdup", { XM, EXx } },
9364 /* VEX_W_0F16_P_2 */
9365 { "vmovhpd", { XM, Vex128, EXq } },
9368 /* VEX_W_0F17_M_0 */
9369 { "vmovhpX", { EXq, XM } },
9372 /* VEX_W_0F28 */
9373 { "vmovapX", { XM, EXx } },
9376 /* VEX_W_0F29 */
9377 { "vmovapX", { EXxS, XM } },
9380 /* VEX_W_0F2B_M_0 */
9381 { "vmovntpX", { Mx, XM } },
9384 /* VEX_W_0F2E_P_0 */
9385 { "vucomiss", { XMScalar, EXdScalar } },
9388 /* VEX_W_0F2E_P_2 */
9389 { "vucomisd", { XMScalar, EXqScalar } },
9392 /* VEX_W_0F2F_P_0 */
9393 { "vcomiss", { XMScalar, EXdScalar } },
9396 /* VEX_W_0F2F_P_2 */
9397 { "vcomisd", { XMScalar, EXqScalar } },
9400 /* VEX_W_0F50_M_0 */
9401 { "vmovmskpX", { Gdq, XS } },
9404 /* VEX_W_0F51_P_0 */
9405 { "vsqrtps", { XM, EXx } },
9408 /* VEX_W_0F51_P_1 */
9409 { "vsqrtss", { XMScalar, VexScalar, EXdScalar } },
9412 /* VEX_W_0F51_P_2 */
9413 { "vsqrtpd", { XM, EXx } },
9416 /* VEX_W_0F51_P_3 */
9417 { "vsqrtsd", { XMScalar, VexScalar, EXqScalar } },
9420 /* VEX_W_0F52_P_0 */
9421 { "vrsqrtps", { XM, EXx } },
9424 /* VEX_W_0F52_P_1 */
9425 { "vrsqrtss", { XMScalar, VexScalar, EXdScalar } },
9428 /* VEX_W_0F53_P_0 */
9429 { "vrcpps", { XM, EXx } },
9432 /* VEX_W_0F53_P_1 */
9433 { "vrcpss", { XMScalar, VexScalar, EXdScalar } },
9436 /* VEX_W_0F58_P_0 */
9437 { "vaddps", { XM, Vex, EXx } },
9440 /* VEX_W_0F58_P_1 */
9441 { "vaddss", { XMScalar, VexScalar, EXdScalar } },
9444 /* VEX_W_0F58_P_2 */
9445 { "vaddpd", { XM, Vex, EXx } },
9448 /* VEX_W_0F58_P_3 */
9449 { "vaddsd", { XMScalar, VexScalar, EXqScalar } },
9452 /* VEX_W_0F59_P_0 */
9453 { "vmulps", { XM, Vex, EXx } },
9456 /* VEX_W_0F59_P_1 */
9457 { "vmulss", { XMScalar, VexScalar, EXdScalar } },
9460 /* VEX_W_0F59_P_2 */
9461 { "vmulpd", { XM, Vex, EXx } },
9464 /* VEX_W_0F59_P_3 */
9465 { "vmulsd", { XMScalar, VexScalar, EXqScalar } },
9468 /* VEX_W_0F5A_P_0 */
9469 { "vcvtps2pd", { XM, EXxmmq } },
9472 /* VEX_W_0F5A_P_1 */
9473 { "vcvtss2sd", { XMScalar, VexScalar, EXdScalar } },
9476 /* VEX_W_0F5A_P_3 */
9477 { "vcvtsd2ss", { XMScalar, VexScalar, EXqScalar } },
9480 /* VEX_W_0F5B_P_0 */
9481 { "vcvtdq2ps", { XM, EXx } },
9484 /* VEX_W_0F5B_P_1 */
9485 { "vcvttps2dq", { XM, EXx } },
9488 /* VEX_W_0F5B_P_2 */
9489 { "vcvtps2dq", { XM, EXx } },
9492 /* VEX_W_0F5C_P_0 */
9493 { "vsubps", { XM, Vex, EXx } },
9496 /* VEX_W_0F5C_P_1 */
9497 { "vsubss", { XMScalar, VexScalar, EXdScalar } },
9500 /* VEX_W_0F5C_P_2 */
9501 { "vsubpd", { XM, Vex, EXx } },
9504 /* VEX_W_0F5C_P_3 */
9505 { "vsubsd", { XMScalar, VexScalar, EXqScalar } },
9508 /* VEX_W_0F5D_P_0 */
9509 { "vminps", { XM, Vex, EXx } },
9512 /* VEX_W_0F5D_P_1 */
9513 { "vminss", { XMScalar, VexScalar, EXdScalar } },
9516 /* VEX_W_0F5D_P_2 */
9517 { "vminpd", { XM, Vex, EXx } },
9520 /* VEX_W_0F5D_P_3 */
9521 { "vminsd", { XMScalar, VexScalar, EXqScalar } },
9524 /* VEX_W_0F5E_P_0 */
9525 { "vdivps", { XM, Vex, EXx } },
9528 /* VEX_W_0F5E_P_1 */
9529 { "vdivss", { XMScalar, VexScalar, EXdScalar } },
9532 /* VEX_W_0F5E_P_2 */
9533 { "vdivpd", { XM, Vex, EXx } },
9536 /* VEX_W_0F5E_P_3 */
9537 { "vdivsd", { XMScalar, VexScalar, EXqScalar } },
9540 /* VEX_W_0F5F_P_0 */
9541 { "vmaxps", { XM, Vex, EXx } },
9544 /* VEX_W_0F5F_P_1 */
9545 { "vmaxss", { XMScalar, VexScalar, EXdScalar } },
9548 /* VEX_W_0F5F_P_2 */
9549 { "vmaxpd", { XM, Vex, EXx } },
9552 /* VEX_W_0F5F_P_3 */
9553 { "vmaxsd", { XMScalar, VexScalar, EXqScalar } },
9556 /* VEX_W_0F60_P_2 */
9557 { "vpunpcklbw", { XM, Vex128, EXx } },
9560 /* VEX_W_0F61_P_2 */
9561 { "vpunpcklwd", { XM, Vex128, EXx } },
9564 /* VEX_W_0F62_P_2 */
9565 { "vpunpckldq", { XM, Vex128, EXx } },
9568 /* VEX_W_0F63_P_2 */
9569 { "vpacksswb", { XM, Vex128, EXx } },
9572 /* VEX_W_0F64_P_2 */
9573 { "vpcmpgtb", { XM, Vex128, EXx } },
9576 /* VEX_W_0F65_P_2 */
9577 { "vpcmpgtw", { XM, Vex128, EXx } },
9580 /* VEX_W_0F66_P_2 */
9581 { "vpcmpgtd", { XM, Vex128, EXx } },
9584 /* VEX_W_0F67_P_2 */
9585 { "vpackuswb", { XM, Vex128, EXx } },
9588 /* VEX_W_0F68_P_2 */
9589 { "vpunpckhbw", { XM, Vex128, EXx } },
9592 /* VEX_W_0F69_P_2 */
9593 { "vpunpckhwd", { XM, Vex128, EXx } },
9596 /* VEX_W_0F6A_P_2 */
9597 { "vpunpckhdq", { XM, Vex128, EXx } },
9600 /* VEX_W_0F6B_P_2 */
9601 { "vpackssdw", { XM, Vex128, EXx } },
9604 /* VEX_W_0F6C_P_2 */
9605 { "vpunpcklqdq", { XM, Vex128, EXx } },
9608 /* VEX_W_0F6D_P_2 */
9609 { "vpunpckhqdq", { XM, Vex128, EXx } },
9612 /* VEX_W_0F6F_P_1 */
9613 { "vmovdqu", { XM, EXx } },
9616 /* VEX_W_0F6F_P_2 */
9617 { "vmovdqa", { XM, EXx } },
9620 /* VEX_W_0F70_P_1 */
9621 { "vpshufhw", { XM, EXx, Ib } },
9624 /* VEX_W_0F70_P_2 */
9625 { "vpshufd", { XM, EXx, Ib } },
9628 /* VEX_W_0F70_P_3 */
9629 { "vpshuflw", { XM, EXx, Ib } },
9632 /* VEX_W_0F71_R_2_P_2 */
9633 { "vpsrlw", { Vex128, XS, Ib } },
9636 /* VEX_W_0F71_R_4_P_2 */
9637 { "vpsraw", { Vex128, XS, Ib } },
9640 /* VEX_W_0F71_R_6_P_2 */
9641 { "vpsllw", { Vex128, XS, Ib } },
9644 /* VEX_W_0F72_R_2_P_2 */
9645 { "vpsrld", { Vex128, XS, Ib } },
9648 /* VEX_W_0F72_R_4_P_2 */
9649 { "vpsrad", { Vex128, XS, Ib } },
9652 /* VEX_W_0F72_R_6_P_2 */
9653 { "vpslld", { Vex128, XS, Ib } },
9656 /* VEX_W_0F73_R_2_P_2 */
9657 { "vpsrlq", { Vex128, XS, Ib } },
9660 /* VEX_W_0F73_R_3_P_2 */
9661 { "vpsrldq", { Vex128, XS, Ib } },
9664 /* VEX_W_0F73_R_6_P_2 */
9665 { "vpsllq", { Vex128, XS, Ib } },
9668 /* VEX_W_0F73_R_7_P_2 */
9669 { "vpslldq", { Vex128, XS, Ib } },
9672 /* VEX_W_0F74_P_2 */
9673 { "vpcmpeqb", { XM, Vex128, EXx } },
9676 /* VEX_W_0F75_P_2 */
9677 { "vpcmpeqw", { XM, Vex128, EXx } },
9680 /* VEX_W_0F76_P_2 */
9681 { "vpcmpeqd", { XM, Vex128, EXx } },
9684 /* VEX_W_0F77_P_0 */
9685 { "", { VZERO } },
9688 /* VEX_W_0F7C_P_2 */
9689 { "vhaddpd", { XM, Vex, EXx } },
9692 /* VEX_W_0F7C_P_3 */
9693 { "vhaddps", { XM, Vex, EXx } },
9696 /* VEX_W_0F7D_P_2 */
9697 { "vhsubpd", { XM, Vex, EXx } },
9700 /* VEX_W_0F7D_P_3 */
9701 { "vhsubps", { XM, Vex, EXx } },
9704 /* VEX_W_0F7E_P_1 */
9705 { "vmovq", { XMScalar, EXqScalar } },
9708 /* VEX_W_0F7F_P_1 */
9709 { "vmovdqu", { EXxS, XM } },
9712 /* VEX_W_0F7F_P_2 */
9713 { "vmovdqa", { EXxS, XM } },
9716 /* VEX_W_0FAE_R_2_M_0 */
9717 { "vldmxcsr", { Md } },
9720 /* VEX_W_0FAE_R_3_M_0 */
9721 { "vstmxcsr", { Md } },
9724 /* VEX_W_0FC2_P_0 */
9725 { "vcmpps", { XM, Vex, EXx, VCMP } },
9728 /* VEX_W_0FC2_P_1 */
9729 { "vcmpss", { XMScalar, VexScalar, EXdScalar, VCMP } },
9732 /* VEX_W_0FC2_P_2 */
9733 { "vcmppd", { XM, Vex, EXx, VCMP } },
9736 /* VEX_W_0FC2_P_3 */
9737 { "vcmpsd", { XMScalar, VexScalar, EXqScalar, VCMP } },
9740 /* VEX_W_0FC4_P_2 */
9741 { "vpinsrw", { XM, Vex128, Edqw, Ib } },
9744 /* VEX_W_0FC5_P_2 */
9745 { "vpextrw", { Gdq, XS, Ib } },
9748 /* VEX_W_0FD0_P_2 */
9749 { "vaddsubpd", { XM, Vex, EXx } },
9752 /* VEX_W_0FD0_P_3 */
9753 { "vaddsubps", { XM, Vex, EXx } },
9756 /* VEX_W_0FD1_P_2 */
9757 { "vpsrlw", { XM, Vex128, EXx } },
9760 /* VEX_W_0FD2_P_2 */
9761 { "vpsrld", { XM, Vex128, EXx } },
9764 /* VEX_W_0FD3_P_2 */
9765 { "vpsrlq", { XM, Vex128, EXx } },
9768 /* VEX_W_0FD4_P_2 */
9769 { "vpaddq", { XM, Vex128, EXx } },
9772 /* VEX_W_0FD5_P_2 */
9773 { "vpmullw", { XM, Vex128, EXx } },
9776 /* VEX_W_0FD6_P_2 */
9777 { "vmovq", { EXqScalarS, XMScalar } },
9780 /* VEX_W_0FD7_P_2_M_1 */
9781 { "vpmovmskb", { Gdq, XS } },
9784 /* VEX_W_0FD8_P_2 */
9785 { "vpsubusb", { XM, Vex128, EXx } },
9788 /* VEX_W_0FD9_P_2 */
9789 { "vpsubusw", { XM, Vex128, EXx } },
9792 /* VEX_W_0FDA_P_2 */
9793 { "vpminub", { XM, Vex128, EXx } },
9796 /* VEX_W_0FDB_P_2 */
9797 { "vpand", { XM, Vex128, EXx } },
9800 /* VEX_W_0FDC_P_2 */
9801 { "vpaddusb", { XM, Vex128, EXx } },
9804 /* VEX_W_0FDD_P_2 */
9805 { "vpaddusw", { XM, Vex128, EXx } },
9808 /* VEX_W_0FDE_P_2 */
9809 { "vpmaxub", { XM, Vex128, EXx } },
9812 /* VEX_W_0FDF_P_2 */
9813 { "vpandn", { XM, Vex128, EXx } },
9816 /* VEX_W_0FE0_P_2 */
9817 { "vpavgb", { XM, Vex128, EXx } },
9820 /* VEX_W_0FE1_P_2 */
9821 { "vpsraw", { XM, Vex128, EXx } },
9824 /* VEX_W_0FE2_P_2 */
9825 { "vpsrad", { XM, Vex128, EXx } },
9828 /* VEX_W_0FE3_P_2 */
9829 { "vpavgw", { XM, Vex128, EXx } },
9832 /* VEX_W_0FE4_P_2 */
9833 { "vpmulhuw", { XM, Vex128, EXx } },
9836 /* VEX_W_0FE5_P_2 */
9837 { "vpmulhw", { XM, Vex128, EXx } },
9840 /* VEX_W_0FE6_P_1 */
9841 { "vcvtdq2pd", { XM, EXxmmq } },
9844 /* VEX_W_0FE6_P_2 */
9845 { "vcvttpd2dq%XY", { XMM, EXx } },
9848 /* VEX_W_0FE6_P_3 */
9849 { "vcvtpd2dq%XY", { XMM, EXx } },
9852 /* VEX_W_0FE7_P_2_M_0 */
9853 { "vmovntdq", { Mx, XM } },
9856 /* VEX_W_0FE8_P_2 */
9857 { "vpsubsb", { XM, Vex128, EXx } },
9860 /* VEX_W_0FE9_P_2 */
9861 { "vpsubsw", { XM, Vex128, EXx } },
9864 /* VEX_W_0FEA_P_2 */
9865 { "vpminsw", { XM, Vex128, EXx } },
9868 /* VEX_W_0FEB_P_2 */
9869 { "vpor", { XM, Vex128, EXx } },
9872 /* VEX_W_0FEC_P_2 */
9873 { "vpaddsb", { XM, Vex128, EXx } },
9876 /* VEX_W_0FED_P_2 */
9877 { "vpaddsw", { XM, Vex128, EXx } },
9880 /* VEX_W_0FEE_P_2 */
9881 { "vpmaxsw", { XM, Vex128, EXx } },
9884 /* VEX_W_0FEF_P_2 */
9885 { "vpxor", { XM, Vex128, EXx } },
9888 /* VEX_W_0FF0_P_3_M_0 */
9889 { "vlddqu", { XM, M } },
9892 /* VEX_W_0FF1_P_2 */
9893 { "vpsllw", { XM, Vex128, EXx } },
9896 /* VEX_W_0FF2_P_2 */
9897 { "vpslld", { XM, Vex128, EXx } },
9900 /* VEX_W_0FF3_P_2 */
9901 { "vpsllq", { XM, Vex128, EXx } },
9904 /* VEX_W_0FF4_P_2 */
9905 { "vpmuludq", { XM, Vex128, EXx } },
9908 /* VEX_W_0FF5_P_2 */
9909 { "vpmaddwd", { XM, Vex128, EXx } },
9912 /* VEX_W_0FF6_P_2 */
9913 { "vpsadbw", { XM, Vex128, EXx } },
9916 /* VEX_W_0FF7_P_2 */
9917 { "vmaskmovdqu", { XM, XS } },
9920 /* VEX_W_0FF8_P_2 */
9921 { "vpsubb", { XM, Vex128, EXx } },
9924 /* VEX_W_0FF9_P_2 */
9925 { "vpsubw", { XM, Vex128, EXx } },
9928 /* VEX_W_0FFA_P_2 */
9929 { "vpsubd", { XM, Vex128, EXx } },
9932 /* VEX_W_0FFB_P_2 */
9933 { "vpsubq", { XM, Vex128, EXx } },
9936 /* VEX_W_0FFC_P_2 */
9937 { "vpaddb", { XM, Vex128, EXx } },
9940 /* VEX_W_0FFD_P_2 */
9941 { "vpaddw", { XM, Vex128, EXx } },
9944 /* VEX_W_0FFE_P_2 */
9945 { "vpaddd", { XM, Vex128, EXx } },
9948 /* VEX_W_0F3800_P_2 */
9949 { "vpshufb", { XM, Vex128, EXx } },
9952 /* VEX_W_0F3801_P_2 */
9953 { "vphaddw", { XM, Vex128, EXx } },
9956 /* VEX_W_0F3802_P_2 */
9957 { "vphaddd", { XM, Vex128, EXx } },
9960 /* VEX_W_0F3803_P_2 */
9961 { "vphaddsw", { XM, Vex128, EXx } },
9964 /* VEX_W_0F3804_P_2 */
9965 { "vpmaddubsw", { XM, Vex128, EXx } },
9968 /* VEX_W_0F3805_P_2 */
9969 { "vphsubw", { XM, Vex128, EXx } },
9972 /* VEX_W_0F3806_P_2 */
9973 { "vphsubd", { XM, Vex128, EXx } },
9976 /* VEX_W_0F3807_P_2 */
9977 { "vphsubsw", { XM, Vex128, EXx } },
9980 /* VEX_W_0F3808_P_2 */
9981 { "vpsignb", { XM, Vex128, EXx } },
9984 /* VEX_W_0F3809_P_2 */
9985 { "vpsignw", { XM, Vex128, EXx } },
9988 /* VEX_W_0F380A_P_2 */
9989 { "vpsignd", { XM, Vex128, EXx } },
9992 /* VEX_W_0F380B_P_2 */
9993 { "vpmulhrsw", { XM, Vex128, EXx } },
9996 /* VEX_W_0F380C_P_2 */
9997 { "vpermilps", { XM, Vex, EXx } },
10000 /* VEX_W_0F380D_P_2 */
10001 { "vpermilpd", { XM, Vex, EXx } },
10004 /* VEX_W_0F380E_P_2 */
10005 { "vtestps", { XM, EXx } },
10008 /* VEX_W_0F380F_P_2 */
10009 { "vtestpd", { XM, EXx } },
10012 /* VEX_W_0F3817_P_2 */
10013 { "vptest", { XM, EXx } },
10016 /* VEX_W_0F3818_P_2_M_0 */
10017 { "vbroadcastss", { XM, Md } },
10020 /* VEX_W_0F3819_P_2_M_0 */
10021 { "vbroadcastsd", { XM, Mq } },
10024 /* VEX_W_0F381A_P_2_M_0 */
10025 { "vbroadcastf128", { XM, Mxmm } },
10028 /* VEX_W_0F381C_P_2 */
10029 { "vpabsb", { XM, EXx } },
10032 /* VEX_W_0F381D_P_2 */
10033 { "vpabsw", { XM, EXx } },
10036 /* VEX_W_0F381E_P_2 */
10037 { "vpabsd", { XM, EXx } },
10040 /* VEX_W_0F3820_P_2 */
10041 { "vpmovsxbw", { XM, EXq } },
10044 /* VEX_W_0F3821_P_2 */
10045 { "vpmovsxbd", { XM, EXd } },
10048 /* VEX_W_0F3822_P_2 */
10049 { "vpmovsxbq", { XM, EXw } },
10052 /* VEX_W_0F3823_P_2 */
10053 { "vpmovsxwd", { XM, EXq } },
10056 /* VEX_W_0F3824_P_2 */
10057 { "vpmovsxwq", { XM, EXd } },
10060 /* VEX_W_0F3825_P_2 */
10061 { "vpmovsxdq", { XM, EXq } },
10064 /* VEX_W_0F3828_P_2 */
10065 { "vpmuldq", { XM, Vex128, EXx } },
10068 /* VEX_W_0F3829_P_2 */
10069 { "vpcmpeqq", { XM, Vex128, EXx } },
10072 /* VEX_W_0F382A_P_2_M_0 */
10073 { "vmovntdqa", { XM, Mx } },
10076 /* VEX_W_0F382B_P_2 */
10077 { "vpackusdw", { XM, Vex128, EXx } },
10080 /* VEX_W_0F382C_P_2_M_0 */
10081 { "vmaskmovps", { XM, Vex, Mx } },
10084 /* VEX_W_0F382D_P_2_M_0 */
10085 { "vmaskmovpd", { XM, Vex, Mx } },
10088 /* VEX_W_0F382E_P_2_M_0 */
10089 { "vmaskmovps", { Mx, Vex, XM } },
10092 /* VEX_W_0F382F_P_2_M_0 */
10093 { "vmaskmovpd", { Mx, Vex, XM } },
10096 /* VEX_W_0F3830_P_2 */
10097 { "vpmovzxbw", { XM, EXq } },
10100 /* VEX_W_0F3831_P_2 */
10101 { "vpmovzxbd", { XM, EXd } },
10104 /* VEX_W_0F3832_P_2 */
10105 { "vpmovzxbq", { XM, EXw } },
10108 /* VEX_W_0F3833_P_2 */
10109 { "vpmovzxwd", { XM, EXq } },
10112 /* VEX_W_0F3834_P_2 */
10113 { "vpmovzxwq", { XM, EXd } },
10116 /* VEX_W_0F3835_P_2 */
10117 { "vpmovzxdq", { XM, EXq } },
10120 /* VEX_W_0F3837_P_2 */
10121 { "vpcmpgtq", { XM, Vex128, EXx } },
10124 /* VEX_W_0F3838_P_2 */
10125 { "vpminsb", { XM, Vex128, EXx } },
10128 /* VEX_W_0F3839_P_2 */
10129 { "vpminsd", { XM, Vex128, EXx } },
10132 /* VEX_W_0F383A_P_2 */
10133 { "vpminuw", { XM, Vex128, EXx } },
10136 /* VEX_W_0F383B_P_2 */
10137 { "vpminud", { XM, Vex128, EXx } },
10140 /* VEX_W_0F383C_P_2 */
10141 { "vpmaxsb", { XM, Vex128, EXx } },
10144 /* VEX_W_0F383D_P_2 */
10145 { "vpmaxsd", { XM, Vex128, EXx } },
10148 /* VEX_W_0F383E_P_2 */
10149 { "vpmaxuw", { XM, Vex128, EXx } },
10152 /* VEX_W_0F383F_P_2 */
10153 { "vpmaxud", { XM, Vex128, EXx } },
10156 /* VEX_W_0F3840_P_2 */
10157 { "vpmulld", { XM, Vex128, EXx } },
10160 /* VEX_W_0F3841_P_2 */
10161 { "vphminposuw", { XM, EXx } },
10164 /* VEX_W_0F38DB_P_2 */
10165 { "vaesimc", { XM, EXx } },
10168 /* VEX_W_0F38DC_P_2 */
10169 { "vaesenc", { XM, Vex128, EXx } },
10172 /* VEX_W_0F38DD_P_2 */
10173 { "vaesenclast", { XM, Vex128, EXx } },
10176 /* VEX_W_0F38DE_P_2 */
10177 { "vaesdec", { XM, Vex128, EXx } },
10180 /* VEX_W_0F38DF_P_2 */
10181 { "vaesdeclast", { XM, Vex128, EXx } },
10184 /* VEX_W_0F3A04_P_2 */
10185 { "vpermilps", { XM, EXx, Ib } },
10188 /* VEX_W_0F3A05_P_2 */
10189 { "vpermilpd", { XM, EXx, Ib } },
10192 /* VEX_W_0F3A06_P_2 */
10193 { "vperm2f128", { XM, Vex256, EXx, Ib } },
10196 /* VEX_W_0F3A08_P_2 */
10197 { "vroundps", { XM, EXx, Ib } },
10200 /* VEX_W_0F3A09_P_2 */
10201 { "vroundpd", { XM, EXx, Ib } },
10204 /* VEX_W_0F3A0A_P_2 */
10205 { "vroundss", { XMScalar, VexScalar, EXdScalar, Ib } },
10208 /* VEX_W_0F3A0B_P_2 */
10209 { "vroundsd", { XMScalar, VexScalar, EXqScalar, Ib } },
10212 /* VEX_W_0F3A0C_P_2 */
10213 { "vblendps", { XM, Vex, EXx, Ib } },
10216 /* VEX_W_0F3A0D_P_2 */
10217 { "vblendpd", { XM, Vex, EXx, Ib } },
10220 /* VEX_W_0F3A0E_P_2 */
10221 { "vpblendw", { XM, Vex128, EXx, Ib } },
10224 /* VEX_W_0F3A0F_P_2 */
10225 { "vpalignr", { XM, Vex128, EXx, Ib } },
10228 /* VEX_W_0F3A14_P_2 */
10229 { "vpextrb", { Edqb, XM, Ib } },
10232 /* VEX_W_0F3A15_P_2 */
10233 { "vpextrw", { Edqw, XM, Ib } },
10236 /* VEX_W_0F3A18_P_2 */
10237 { "vinsertf128", { XM, Vex256, EXxmm, Ib } },
10240 /* VEX_W_0F3A19_P_2 */
10241 { "vextractf128", { EXxmm, XM, Ib } },
10244 /* VEX_W_0F3A20_P_2 */
10245 { "vpinsrb", { XM, Vex128, Edqb, Ib } },
10248 /* VEX_W_0F3A21_P_2 */
10249 { "vinsertps", { XM, Vex128, EXd, Ib } },
10252 /* VEX_W_0F3A40_P_2 */
10253 { "vdpps", { XM, Vex, EXx, Ib } },
10256 /* VEX_W_0F3A41_P_2 */
10257 { "vdppd", { XM, Vex128, EXx, Ib } },
10260 /* VEX_W_0F3A42_P_2 */
10261 { "vmpsadbw", { XM, Vex128, EXx, Ib } },
10264 /* VEX_W_0F3A44_P_2 */
10265 { "vpclmulqdq", { XM, Vex128, EXx, PCLMUL } },
10268 /* VEX_W_0F3A48_P_2 */
10269 { "vpermil2ps", { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW } },
10270 { "vpermil2ps", { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW } },
10273 /* VEX_W_0F3A49_P_2 */
10274 { "vpermil2pd", { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW } },
10275 { "vpermil2pd", { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW } },
10278 /* VEX_W_0F3A4A_P_2 */
10279 { "vblendvps", { XM, Vex, EXx, XMVexI4 } },
10282 /* VEX_W_0F3A4B_P_2 */
10283 { "vblendvpd", { XM, Vex, EXx, XMVexI4 } },
10286 /* VEX_W_0F3A4C_P_2 */
10287 { "vpblendvb", { XM, Vex128, EXx, XMVexI4 } },
10290 /* VEX_W_0F3A60_P_2 */
10291 { "vpcmpestrm", { XM, EXx, Ib } },
10294 /* VEX_W_0F3A61_P_2 */
10295 { "vpcmpestri", { XM, EXx, Ib } },
10298 /* VEX_W_0F3A62_P_2 */
10299 { "vpcmpistrm", { XM, EXx, Ib } },
10302 /* VEX_W_0F3A63_P_2 */
10303 { "vpcmpistri", { XM, EXx, Ib } },
10306 /* VEX_W_0F3ADF_P_2 */
10307 { "vaeskeygenassist", { XM, EXx, Ib } },
10311 static const struct dis386 mod_table[][2] = {
10313 /* MOD_8D */
10314 { "leaS", { Gv, M } },
10317 /* MOD_0F01_REG_0 */
10318 { X86_64_TABLE (X86_64_0F01_REG_0) },
10319 { RM_TABLE (RM_0F01_REG_0) },
10322 /* MOD_0F01_REG_1 */
10323 { X86_64_TABLE (X86_64_0F01_REG_1) },
10324 { RM_TABLE (RM_0F01_REG_1) },
10327 /* MOD_0F01_REG_2 */
10328 { X86_64_TABLE (X86_64_0F01_REG_2) },
10329 { RM_TABLE (RM_0F01_REG_2) },
10332 /* MOD_0F01_REG_3 */
10333 { X86_64_TABLE (X86_64_0F01_REG_3) },
10334 { RM_TABLE (RM_0F01_REG_3) },
10337 /* MOD_0F01_REG_7 */
10338 { "invlpg", { Mb } },
10339 { RM_TABLE (RM_0F01_REG_7) },
10342 /* MOD_0F12_PREFIX_0 */
10343 { "movlps", { XM, EXq } },
10344 { "movhlps", { XM, EXq } },
10347 /* MOD_0F13 */
10348 { "movlpX", { EXq, XM } },
10351 /* MOD_0F16_PREFIX_0 */
10352 { "movhps", { XM, EXq } },
10353 { "movlhps", { XM, EXq } },
10356 /* MOD_0F17 */
10357 { "movhpX", { EXq, XM } },
10360 /* MOD_0F18_REG_0 */
10361 { "prefetchnta", { Mb } },
10364 /* MOD_0F18_REG_1 */
10365 { "prefetcht0", { Mb } },
10368 /* MOD_0F18_REG_2 */
10369 { "prefetcht1", { Mb } },
10372 /* MOD_0F18_REG_3 */
10373 { "prefetcht2", { Mb } },
10376 /* MOD_0F20 */
10377 { Bad_Opcode },
10378 { "movZ", { Rm, Cm } },
10381 /* MOD_0F21 */
10382 { Bad_Opcode },
10383 { "movZ", { Rm, Dm } },
10386 /* MOD_0F22 */
10387 { Bad_Opcode },
10388 { "movZ", { Cm, Rm } },
10391 /* MOD_0F23 */
10392 { Bad_Opcode },
10393 { "movZ", { Dm, Rm } },
10396 /* MOD_0F24 */
10397 { Bad_Opcode },
10398 { "movL", { Rd, Td } },
10401 /* MOD_0F26 */
10402 { Bad_Opcode },
10403 { "movL", { Td, Rd } },
10406 /* MOD_0F2B_PREFIX_0 */
10407 {"movntps", { Mx, XM } },
10410 /* MOD_0F2B_PREFIX_1 */
10411 {"movntss", { Md, XM } },
10414 /* MOD_0F2B_PREFIX_2 */
10415 {"movntpd", { Mx, XM } },
10418 /* MOD_0F2B_PREFIX_3 */
10419 {"movntsd", { Mq, XM } },
10422 /* MOD_0F51 */
10423 { Bad_Opcode },
10424 { "movmskpX", { Gdq, XS } },
10427 /* MOD_0F71_REG_2 */
10428 { Bad_Opcode },
10429 { "psrlw", { MS, Ib } },
10432 /* MOD_0F71_REG_4 */
10433 { Bad_Opcode },
10434 { "psraw", { MS, Ib } },
10437 /* MOD_0F71_REG_6 */
10438 { Bad_Opcode },
10439 { "psllw", { MS, Ib } },
10442 /* MOD_0F72_REG_2 */
10443 { Bad_Opcode },
10444 { "psrld", { MS, Ib } },
10447 /* MOD_0F72_REG_4 */
10448 { Bad_Opcode },
10449 { "psrad", { MS, Ib } },
10452 /* MOD_0F72_REG_6 */
10453 { Bad_Opcode },
10454 { "pslld", { MS, Ib } },
10457 /* MOD_0F73_REG_2 */
10458 { Bad_Opcode },
10459 { "psrlq", { MS, Ib } },
10462 /* MOD_0F73_REG_3 */
10463 { Bad_Opcode },
10464 { PREFIX_TABLE (PREFIX_0F73_REG_3) },
10467 /* MOD_0F73_REG_6 */
10468 { Bad_Opcode },
10469 { "psllq", { MS, Ib } },
10472 /* MOD_0F73_REG_7 */
10473 { Bad_Opcode },
10474 { PREFIX_TABLE (PREFIX_0F73_REG_7) },
10477 /* MOD_0FAE_REG_0 */
10478 { "fxsave", { FXSAVE } },
10479 { PREFIX_TABLE (PREFIX_0FAE_REG_0) },
10482 /* MOD_0FAE_REG_1 */
10483 { "fxrstor", { FXSAVE } },
10484 { PREFIX_TABLE (PREFIX_0FAE_REG_1) },
10487 /* MOD_0FAE_REG_2 */
10488 { "ldmxcsr", { Md } },
10489 { PREFIX_TABLE (PREFIX_0FAE_REG_2) },
10492 /* MOD_0FAE_REG_3 */
10493 { "stmxcsr", { Md } },
10494 { PREFIX_TABLE (PREFIX_0FAE_REG_3) },
10497 /* MOD_0FAE_REG_4 */
10498 { "xsave", { FXSAVE } },
10501 /* MOD_0FAE_REG_5 */
10502 { "xrstor", { FXSAVE } },
10503 { RM_TABLE (RM_0FAE_REG_5) },
10506 /* MOD_0FAE_REG_6 */
10507 { "xsaveopt", { FXSAVE } },
10508 { RM_TABLE (RM_0FAE_REG_6) },
10511 /* MOD_0FAE_REG_7 */
10512 { "clflush", { Mb } },
10513 { RM_TABLE (RM_0FAE_REG_7) },
10516 /* MOD_0FB2 */
10517 { "lssS", { Gv, Mp } },
10520 /* MOD_0FB4 */
10521 { "lfsS", { Gv, Mp } },
10524 /* MOD_0FB5 */
10525 { "lgsS", { Gv, Mp } },
10528 /* MOD_0FC7_REG_6 */
10529 { PREFIX_TABLE (PREFIX_0FC7_REG_6) },
10530 { "rdrand", { Ev } },
10533 /* MOD_0FC7_REG_7 */
10534 { "vmptrst", { Mq } },
10537 /* MOD_0FD7 */
10538 { Bad_Opcode },
10539 { "pmovmskb", { Gdq, MS } },
10542 /* MOD_0FE7_PREFIX_2 */
10543 { "movntdq", { Mx, XM } },
10546 /* MOD_0FF0_PREFIX_3 */
10547 { "lddqu", { XM, M } },
10550 /* MOD_0F382A_PREFIX_2 */
10551 { "movntdqa", { XM, Mx } },
10554 /* MOD_62_32BIT */
10555 { "bound{S|}", { Gv, Ma } },
10558 /* MOD_C4_32BIT */
10559 { "lesS", { Gv, Mp } },
10560 { VEX_C4_TABLE (VEX_0F) },
10563 /* MOD_C5_32BIT */
10564 { "ldsS", { Gv, Mp } },
10565 { VEX_C5_TABLE (VEX_0F) },
10568 /* MOD_VEX_0F12_PREFIX_0 */
10569 { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_0) },
10570 { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_1) },
10573 /* MOD_VEX_0F13 */
10574 { VEX_LEN_TABLE (VEX_LEN_0F13_M_0) },
10577 /* MOD_VEX_0F16_PREFIX_0 */
10578 { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_0) },
10579 { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_1) },
10582 /* MOD_VEX_0F17 */
10583 { VEX_LEN_TABLE (VEX_LEN_0F17_M_0) },
10586 /* MOD_VEX_0F2B */
10587 { VEX_W_TABLE (VEX_W_0F2B_M_0) },
10590 /* MOD_VEX_0F50 */
10591 { Bad_Opcode },
10592 { VEX_W_TABLE (VEX_W_0F50_M_0) },
10595 /* MOD_VEX_0F71_REG_2 */
10596 { Bad_Opcode },
10597 { PREFIX_TABLE (PREFIX_VEX_0F71_REG_2) },
10600 /* MOD_VEX_0F71_REG_4 */
10601 { Bad_Opcode },
10602 { PREFIX_TABLE (PREFIX_VEX_0F71_REG_4) },
10605 /* MOD_VEX_0F71_REG_6 */
10606 { Bad_Opcode },
10607 { PREFIX_TABLE (PREFIX_VEX_0F71_REG_6) },
10610 /* MOD_VEX_0F72_REG_2 */
10611 { Bad_Opcode },
10612 { PREFIX_TABLE (PREFIX_VEX_0F72_REG_2) },
10615 /* MOD_VEX_0F72_REG_4 */
10616 { Bad_Opcode },
10617 { PREFIX_TABLE (PREFIX_VEX_0F72_REG_4) },
10620 /* MOD_VEX_0F72_REG_6 */
10621 { Bad_Opcode },
10622 { PREFIX_TABLE (PREFIX_VEX_0F72_REG_6) },
10625 /* MOD_VEX_0F73_REG_2 */
10626 { Bad_Opcode },
10627 { PREFIX_TABLE (PREFIX_VEX_0F73_REG_2) },
10630 /* MOD_VEX_0F73_REG_3 */
10631 { Bad_Opcode },
10632 { PREFIX_TABLE (PREFIX_VEX_0F73_REG_3) },
10635 /* MOD_VEX_0F73_REG_6 */
10636 { Bad_Opcode },
10637 { PREFIX_TABLE (PREFIX_VEX_0F73_REG_6) },
10640 /* MOD_VEX_0F73_REG_7 */
10641 { Bad_Opcode },
10642 { PREFIX_TABLE (PREFIX_VEX_0F73_REG_7) },
10645 /* MOD_VEX_0FAE_REG_2 */
10646 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_2_M_0) },
10649 /* MOD_VEX_0FAE_REG_3 */
10650 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_3_M_0) },
10653 /* MOD_VEX_0FD7_PREFIX_2 */
10654 { Bad_Opcode },
10655 { VEX_LEN_TABLE (VEX_LEN_0FD7_P_2_M_1) },
10658 /* MOD_VEX_0FE7_PREFIX_2 */
10659 { VEX_W_TABLE (VEX_W_0FE7_P_2_M_0) },
10662 /* MOD_VEX_0FF0_PREFIX_3 */
10663 { VEX_W_TABLE (VEX_W_0FF0_P_3_M_0) },
10666 /* MOD_VEX_0F3818_PREFIX_2 */
10667 { VEX_W_TABLE (VEX_W_0F3818_P_2_M_0) },
10670 /* MOD_VEX_0F3819_PREFIX_2 */
10671 { VEX_LEN_TABLE (VEX_LEN_0F3819_P_2_M_0) },
10674 /* MOD_VEX_0F381A_PREFIX_2 */
10675 { VEX_LEN_TABLE (VEX_LEN_0F381A_P_2_M_0) },
10678 /* MOD_VEX_0F382A_PREFIX_2 */
10679 { VEX_LEN_TABLE (VEX_LEN_0F382A_P_2_M_0) },
10682 /* MOD_VEX_0F382C_PREFIX_2 */
10683 { VEX_W_TABLE (VEX_W_0F382C_P_2_M_0) },
10686 /* MOD_VEX_0F382D_PREFIX_2 */
10687 { VEX_W_TABLE (VEX_W_0F382D_P_2_M_0) },
10690 /* MOD_VEX_0F382E_PREFIX_2 */
10691 { VEX_W_TABLE (VEX_W_0F382E_P_2_M_0) },
10694 /* MOD_VEX_0F382F_PREFIX_2 */
10695 { VEX_W_TABLE (VEX_W_0F382F_P_2_M_0) },
10699 static const struct dis386 rm_table[][8] = {
10701 /* RM_0F01_REG_0 */
10702 { Bad_Opcode },
10703 { "vmcall", { Skip_MODRM } },
10704 { "vmlaunch", { Skip_MODRM } },
10705 { "vmresume", { Skip_MODRM } },
10706 { "vmxoff", { Skip_MODRM } },
10709 /* RM_0F01_REG_1 */
10710 { "monitor", { { OP_Monitor, 0 } } },
10711 { "mwait", { { OP_Mwait, 0 } } },
10714 /* RM_0F01_REG_2 */
10715 { "xgetbv", { Skip_MODRM } },
10716 { "xsetbv", { Skip_MODRM } },
10719 /* RM_0F01_REG_3 */
10720 { "vmrun", { Skip_MODRM } },
10721 { "vmmcall", { Skip_MODRM } },
10722 { "vmload", { Skip_MODRM } },
10723 { "vmsave", { Skip_MODRM } },
10724 { "stgi", { Skip_MODRM } },
10725 { "clgi", { Skip_MODRM } },
10726 { "skinit", { Skip_MODRM } },
10727 { "invlpga", { Skip_MODRM } },
10730 /* RM_0F01_REG_7 */
10731 { "swapgs", { Skip_MODRM } },
10732 { "rdtscp", { Skip_MODRM } },
10735 /* RM_0FAE_REG_5 */
10736 { "lfence", { Skip_MODRM } },
10739 /* RM_0FAE_REG_6 */
10740 { "mfence", { Skip_MODRM } },
10743 /* RM_0FAE_REG_7 */
10744 { "sfence", { Skip_MODRM } },
10748 #define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
10750 /* We use the high bit to indicate different name for the same
10751 prefix. */
10752 #define ADDR16_PREFIX (0x67 | 0x100)
10753 #define ADDR32_PREFIX (0x67 | 0x200)
10754 #define DATA16_PREFIX (0x66 | 0x100)
10755 #define DATA32_PREFIX (0x66 | 0x200)
10756 #define REP_PREFIX (0xf3 | 0x100)
10758 static int
10759 ckprefix (void)
10761 int newrex, i, length;
10762 rex = 0;
10763 rex_ignored = 0;
10764 prefixes = 0;
10765 used_prefixes = 0;
10766 rex_used = 0;
10767 last_lock_prefix = -1;
10768 last_repz_prefix = -1;
10769 last_repnz_prefix = -1;
10770 last_data_prefix = -1;
10771 last_addr_prefix = -1;
10772 last_rex_prefix = -1;
10773 last_seg_prefix = -1;
10774 for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
10775 all_prefixes[i] = 0;
10776 i = 0;
10777 length = 0;
10778 /* The maximum instruction length is 15bytes. */
10779 while (length < MAX_CODE_LENGTH - 1)
10781 FETCH_DATA (the_info, codep + 1);
10782 newrex = 0;
10783 switch (*codep)
10785 /* REX prefixes family. */
10786 case 0x40:
10787 case 0x41:
10788 case 0x42:
10789 case 0x43:
10790 case 0x44:
10791 case 0x45:
10792 case 0x46:
10793 case 0x47:
10794 case 0x48:
10795 case 0x49:
10796 case 0x4a:
10797 case 0x4b:
10798 case 0x4c:
10799 case 0x4d:
10800 case 0x4e:
10801 case 0x4f:
10802 if (address_mode == mode_64bit)
10803 newrex = *codep;
10804 else
10805 return 1;
10806 last_rex_prefix = i;
10807 break;
10808 case 0xf3:
10809 prefixes |= PREFIX_REPZ;
10810 last_repz_prefix = i;
10811 break;
10812 case 0xf2:
10813 prefixes |= PREFIX_REPNZ;
10814 last_repnz_prefix = i;
10815 break;
10816 case 0xf0:
10817 prefixes |= PREFIX_LOCK;
10818 last_lock_prefix = i;
10819 break;
10820 case 0x2e:
10821 prefixes |= PREFIX_CS;
10822 last_seg_prefix = i;
10823 break;
10824 case 0x36:
10825 prefixes |= PREFIX_SS;
10826 last_seg_prefix = i;
10827 break;
10828 case 0x3e:
10829 prefixes |= PREFIX_DS;
10830 last_seg_prefix = i;
10831 break;
10832 case 0x26:
10833 prefixes |= PREFIX_ES;
10834 last_seg_prefix = i;
10835 break;
10836 case 0x64:
10837 prefixes |= PREFIX_FS;
10838 last_seg_prefix = i;
10839 break;
10840 case 0x65:
10841 prefixes |= PREFIX_GS;
10842 last_seg_prefix = i;
10843 break;
10844 case 0x66:
10845 prefixes |= PREFIX_DATA;
10846 last_data_prefix = i;
10847 break;
10848 case 0x67:
10849 prefixes |= PREFIX_ADDR;
10850 last_addr_prefix = i;
10851 break;
10852 case FWAIT_OPCODE:
10853 /* fwait is really an instruction. If there are prefixes
10854 before the fwait, they belong to the fwait, *not* to the
10855 following instruction. */
10856 if (prefixes || rex)
10858 prefixes |= PREFIX_FWAIT;
10859 codep++;
10860 return 1;
10862 prefixes = PREFIX_FWAIT;
10863 break;
10864 default:
10865 return 1;
10867 /* Rex is ignored when followed by another prefix. */
10868 if (rex)
10870 rex_used = rex;
10871 return 1;
10873 if (*codep != FWAIT_OPCODE)
10874 all_prefixes[i++] = *codep;
10875 rex = newrex;
10876 codep++;
10877 length++;
10879 return 0;
10882 static int
10883 seg_prefix (int pref)
10885 switch (pref)
10887 case 0x2e:
10888 return PREFIX_CS;
10889 case 0x36:
10890 return PREFIX_SS;
10891 case 0x3e:
10892 return PREFIX_DS;
10893 case 0x26:
10894 return PREFIX_ES;
10895 case 0x64:
10896 return PREFIX_FS;
10897 case 0x65:
10898 return PREFIX_GS;
10899 default:
10900 return 0;
10904 /* Return the name of the prefix byte PREF, or NULL if PREF is not a
10905 prefix byte. */
10907 static const char *
10908 prefix_name (int pref, int sizeflag)
10910 static const char *rexes [16] =
10912 "rex", /* 0x40 */
10913 "rex.B", /* 0x41 */
10914 "rex.X", /* 0x42 */
10915 "rex.XB", /* 0x43 */
10916 "rex.R", /* 0x44 */
10917 "rex.RB", /* 0x45 */
10918 "rex.RX", /* 0x46 */
10919 "rex.RXB", /* 0x47 */
10920 "rex.W", /* 0x48 */
10921 "rex.WB", /* 0x49 */
10922 "rex.WX", /* 0x4a */
10923 "rex.WXB", /* 0x4b */
10924 "rex.WR", /* 0x4c */
10925 "rex.WRB", /* 0x4d */
10926 "rex.WRX", /* 0x4e */
10927 "rex.WRXB", /* 0x4f */
10930 switch (pref)
10932 /* REX prefixes family. */
10933 case 0x40:
10934 case 0x41:
10935 case 0x42:
10936 case 0x43:
10937 case 0x44:
10938 case 0x45:
10939 case 0x46:
10940 case 0x47:
10941 case 0x48:
10942 case 0x49:
10943 case 0x4a:
10944 case 0x4b:
10945 case 0x4c:
10946 case 0x4d:
10947 case 0x4e:
10948 case 0x4f:
10949 return rexes [pref - 0x40];
10950 case 0xf3:
10951 return "repz";
10952 case 0xf2:
10953 return "repnz";
10954 case 0xf0:
10955 return "lock";
10956 case 0x2e:
10957 return "cs";
10958 case 0x36:
10959 return "ss";
10960 case 0x3e:
10961 return "ds";
10962 case 0x26:
10963 return "es";
10964 case 0x64:
10965 return "fs";
10966 case 0x65:
10967 return "gs";
10968 case 0x66:
10969 return (sizeflag & DFLAG) ? "data16" : "data32";
10970 case 0x67:
10971 if (address_mode == mode_64bit)
10972 return (sizeflag & AFLAG) ? "addr32" : "addr64";
10973 else
10974 return (sizeflag & AFLAG) ? "addr16" : "addr32";
10975 case FWAIT_OPCODE:
10976 return "fwait";
10977 case ADDR16_PREFIX:
10978 return "addr16";
10979 case ADDR32_PREFIX:
10980 return "addr32";
10981 case DATA16_PREFIX:
10982 return "data16";
10983 case DATA32_PREFIX:
10984 return "data32";
10985 case REP_PREFIX:
10986 return "rep";
10987 default:
10988 return NULL;
10992 static char op_out[MAX_OPERANDS][100];
10993 static int op_ad, op_index[MAX_OPERANDS];
10994 static int two_source_ops;
10995 static bfd_vma op_address[MAX_OPERANDS];
10996 static bfd_vma op_riprel[MAX_OPERANDS];
10997 static bfd_vma start_pc;
11000 * On the 386's of 1988, the maximum length of an instruction is 15 bytes.
11001 * (see topic "Redundant prefixes" in the "Differences from 8086"
11002 * section of the "Virtual 8086 Mode" chapter.)
11003 * 'pc' should be the address of this instruction, it will
11004 * be used to print the target address if this is a relative jump or call
11005 * The function returns the length of this instruction in bytes.
11008 static char intel_syntax;
11009 static char intel_mnemonic = !SYSV386_COMPAT;
11010 static char open_char;
11011 static char close_char;
11012 static char separator_char;
11013 static char scale_char;
11015 /* Here for backwards compatibility. When gdb stops using
11016 print_insn_i386_att and print_insn_i386_intel these functions can
11017 disappear, and print_insn_i386 be merged into print_insn. */
11019 print_insn_i386_att (bfd_vma pc, disassemble_info *info)
11021 intel_syntax = 0;
11023 return print_insn (pc, info);
11027 print_insn_i386_intel (bfd_vma pc, disassemble_info *info)
11029 intel_syntax = 1;
11031 return print_insn (pc, info);
11035 print_insn_i386 (bfd_vma pc, disassemble_info *info)
11037 intel_syntax = -1;
11039 return print_insn (pc, info);
11042 void
11043 print_i386_disassembler_options (FILE *stream)
11045 fprintf (stream, _("\n\
11046 The following i386/x86-64 specific disassembler options are supported for use\n\
11047 with the -M switch (multiple options should be separated by commas):\n"));
11049 fprintf (stream, _(" x86-64 Disassemble in 64bit mode\n"));
11050 fprintf (stream, _(" i386 Disassemble in 32bit mode\n"));
11051 fprintf (stream, _(" i8086 Disassemble in 16bit mode\n"));
11052 fprintf (stream, _(" att Display instruction in AT&T syntax\n"));
11053 fprintf (stream, _(" intel Display instruction in Intel syntax\n"));
11054 fprintf (stream, _(" att-mnemonic\n"
11055 " Display instruction in AT&T mnemonic\n"));
11056 fprintf (stream, _(" intel-mnemonic\n"
11057 " Display instruction in Intel mnemonic\n"));
11058 fprintf (stream, _(" addr64 Assume 64bit address size\n"));
11059 fprintf (stream, _(" addr32 Assume 32bit address size\n"));
11060 fprintf (stream, _(" addr16 Assume 16bit address size\n"));
11061 fprintf (stream, _(" data32 Assume 32bit data size\n"));
11062 fprintf (stream, _(" data16 Assume 16bit data size\n"));
11063 fprintf (stream, _(" suffix Always display instruction suffix in AT&T syntax\n"));
11066 /* Bad opcode. */
11067 static const struct dis386 bad_opcode = { "(bad)", { XX } };
11069 /* Get a pointer to struct dis386 with a valid name. */
11071 static const struct dis386 *
11072 get_valid_dis386 (const struct dis386 *dp, disassemble_info *info)
11074 int vindex, vex_table_index;
11076 if (dp->name != NULL)
11077 return dp;
11079 switch (dp->op[0].bytemode)
11081 case USE_REG_TABLE:
11082 dp = &reg_table[dp->op[1].bytemode][modrm.reg];
11083 break;
11085 case USE_MOD_TABLE:
11086 vindex = modrm.mod == 0x3 ? 1 : 0;
11087 dp = &mod_table[dp->op[1].bytemode][vindex];
11088 break;
11090 case USE_RM_TABLE:
11091 dp = &rm_table[dp->op[1].bytemode][modrm.rm];
11092 break;
11094 case USE_PREFIX_TABLE:
11095 if (need_vex)
11097 /* The prefix in VEX is implicit. */
11098 switch (vex.prefix)
11100 case 0:
11101 vindex = 0;
11102 break;
11103 case REPE_PREFIX_OPCODE:
11104 vindex = 1;
11105 break;
11106 case DATA_PREFIX_OPCODE:
11107 vindex = 2;
11108 break;
11109 case REPNE_PREFIX_OPCODE:
11110 vindex = 3;
11111 break;
11112 default:
11113 abort ();
11114 break;
11117 else
11119 vindex = 0;
11120 used_prefixes |= (prefixes & PREFIX_REPZ);
11121 if (prefixes & PREFIX_REPZ)
11123 vindex = 1;
11124 all_prefixes[last_repz_prefix] = 0;
11126 else
11128 /* We should check PREFIX_REPNZ and PREFIX_REPZ before
11129 PREFIX_DATA. */
11130 used_prefixes |= (prefixes & PREFIX_REPNZ);
11131 if (prefixes & PREFIX_REPNZ)
11133 vindex = 3;
11134 all_prefixes[last_repnz_prefix] = 0;
11136 else
11138 used_prefixes |= (prefixes & PREFIX_DATA);
11139 if (prefixes & PREFIX_DATA)
11141 vindex = 2;
11142 all_prefixes[last_data_prefix] = 0;
11147 dp = &prefix_table[dp->op[1].bytemode][vindex];
11148 break;
11150 case USE_X86_64_TABLE:
11151 vindex = address_mode == mode_64bit ? 1 : 0;
11152 dp = &x86_64_table[dp->op[1].bytemode][vindex];
11153 break;
11155 case USE_3BYTE_TABLE:
11156 FETCH_DATA (info, codep + 2);
11157 vindex = *codep++;
11158 dp = &three_byte_table[dp->op[1].bytemode][vindex];
11159 modrm.mod = (*codep >> 6) & 3;
11160 modrm.reg = (*codep >> 3) & 7;
11161 modrm.rm = *codep & 7;
11162 break;
11164 case USE_VEX_LEN_TABLE:
11165 if (!need_vex)
11166 abort ();
11168 switch (vex.length)
11170 case 128:
11171 vindex = 0;
11172 break;
11173 case 256:
11174 vindex = 1;
11175 break;
11176 default:
11177 abort ();
11178 break;
11181 dp = &vex_len_table[dp->op[1].bytemode][vindex];
11182 break;
11184 case USE_XOP_8F_TABLE:
11185 FETCH_DATA (info, codep + 3);
11186 /* All bits in the REX prefix are ignored. */
11187 rex_ignored = rex;
11188 rex = ~(*codep >> 5) & 0x7;
11190 /* VEX_TABLE_INDEX is the mmmmm part of the XOP byte 1 "RCB.mmmmm". */
11191 switch ((*codep & 0x1f))
11193 default:
11194 dp = &bad_opcode;
11195 return dp;
11196 case 0x8:
11197 vex_table_index = XOP_08;
11198 break;
11199 case 0x9:
11200 vex_table_index = XOP_09;
11201 break;
11202 case 0xa:
11203 vex_table_index = XOP_0A;
11204 break;
11206 codep++;
11207 vex.w = *codep & 0x80;
11208 if (vex.w && address_mode == mode_64bit)
11209 rex |= REX_W;
11211 vex.register_specifier = (~(*codep >> 3)) & 0xf;
11212 if (address_mode != mode_64bit
11213 && vex.register_specifier > 0x7)
11215 dp = &bad_opcode;
11216 return dp;
11219 vex.length = (*codep & 0x4) ? 256 : 128;
11220 switch ((*codep & 0x3))
11222 case 0:
11223 vex.prefix = 0;
11224 break;
11225 case 1:
11226 vex.prefix = DATA_PREFIX_OPCODE;
11227 break;
11228 case 2:
11229 vex.prefix = REPE_PREFIX_OPCODE;
11230 break;
11231 case 3:
11232 vex.prefix = REPNE_PREFIX_OPCODE;
11233 break;
11235 need_vex = 1;
11236 need_vex_reg = 1;
11237 codep++;
11238 vindex = *codep++;
11239 dp = &xop_table[vex_table_index][vindex];
11241 FETCH_DATA (info, codep + 1);
11242 modrm.mod = (*codep >> 6) & 3;
11243 modrm.reg = (*codep >> 3) & 7;
11244 modrm.rm = *codep & 7;
11245 break;
11247 case USE_VEX_C4_TABLE:
11248 FETCH_DATA (info, codep + 3);
11249 /* All bits in the REX prefix are ignored. */
11250 rex_ignored = rex;
11251 rex = ~(*codep >> 5) & 0x7;
11252 switch ((*codep & 0x1f))
11254 default:
11255 dp = &bad_opcode;
11256 return dp;
11257 case 0x1:
11258 vex_table_index = VEX_0F;
11259 break;
11260 case 0x2:
11261 vex_table_index = VEX_0F38;
11262 break;
11263 case 0x3:
11264 vex_table_index = VEX_0F3A;
11265 break;
11267 codep++;
11268 vex.w = *codep & 0x80;
11269 if (vex.w && address_mode == mode_64bit)
11270 rex |= REX_W;
11272 vex.register_specifier = (~(*codep >> 3)) & 0xf;
11273 if (address_mode != mode_64bit
11274 && vex.register_specifier > 0x7)
11276 dp = &bad_opcode;
11277 return dp;
11280 vex.length = (*codep & 0x4) ? 256 : 128;
11281 switch ((*codep & 0x3))
11283 case 0:
11284 vex.prefix = 0;
11285 break;
11286 case 1:
11287 vex.prefix = DATA_PREFIX_OPCODE;
11288 break;
11289 case 2:
11290 vex.prefix = REPE_PREFIX_OPCODE;
11291 break;
11292 case 3:
11293 vex.prefix = REPNE_PREFIX_OPCODE;
11294 break;
11296 need_vex = 1;
11297 need_vex_reg = 1;
11298 codep++;
11299 vindex = *codep++;
11300 dp = &vex_table[vex_table_index][vindex];
11301 /* There is no MODRM byte for VEX [82|77]. */
11302 if (vindex != 0x77 && vindex != 0x82)
11304 FETCH_DATA (info, codep + 1);
11305 modrm.mod = (*codep >> 6) & 3;
11306 modrm.reg = (*codep >> 3) & 7;
11307 modrm.rm = *codep & 7;
11309 break;
11311 case USE_VEX_C5_TABLE:
11312 FETCH_DATA (info, codep + 2);
11313 /* All bits in the REX prefix are ignored. */
11314 rex_ignored = rex;
11315 rex = (*codep & 0x80) ? 0 : REX_R;
11317 vex.register_specifier = (~(*codep >> 3)) & 0xf;
11318 if (address_mode != mode_64bit
11319 && vex.register_specifier > 0x7)
11321 dp = &bad_opcode;
11322 return dp;
11325 vex.w = 0;
11327 vex.length = (*codep & 0x4) ? 256 : 128;
11328 switch ((*codep & 0x3))
11330 case 0:
11331 vex.prefix = 0;
11332 break;
11333 case 1:
11334 vex.prefix = DATA_PREFIX_OPCODE;
11335 break;
11336 case 2:
11337 vex.prefix = REPE_PREFIX_OPCODE;
11338 break;
11339 case 3:
11340 vex.prefix = REPNE_PREFIX_OPCODE;
11341 break;
11343 need_vex = 1;
11344 need_vex_reg = 1;
11345 codep++;
11346 vindex = *codep++;
11347 dp = &vex_table[dp->op[1].bytemode][vindex];
11348 /* There is no MODRM byte for VEX [82|77]. */
11349 if (vindex != 0x77 && vindex != 0x82)
11351 FETCH_DATA (info, codep + 1);
11352 modrm.mod = (*codep >> 6) & 3;
11353 modrm.reg = (*codep >> 3) & 7;
11354 modrm.rm = *codep & 7;
11356 break;
11358 case USE_VEX_W_TABLE:
11359 if (!need_vex)
11360 abort ();
11362 dp = &vex_w_table[dp->op[1].bytemode][vex.w ? 1 : 0];
11363 break;
11365 case 0:
11366 dp = &bad_opcode;
11367 break;
11369 default:
11370 abort ();
11373 if (dp->name != NULL)
11374 return dp;
11375 else
11376 return get_valid_dis386 (dp, info);
11379 static void
11380 get_sib (disassemble_info *info)
11382 /* If modrm.mod == 3, operand must be register. */
11383 if (need_modrm
11384 && address_mode != mode_16bit
11385 && modrm.mod != 3
11386 && modrm.rm == 4)
11388 FETCH_DATA (info, codep + 2);
11389 sib.index = (codep [1] >> 3) & 7;
11390 sib.scale = (codep [1] >> 6) & 3;
11391 sib.base = codep [1] & 7;
11395 static int
11396 print_insn (bfd_vma pc, disassemble_info *info)
11398 const struct dis386 *dp;
11399 int i;
11400 char *op_txt[MAX_OPERANDS];
11401 int needcomma;
11402 int sizeflag;
11403 const char *p;
11404 struct dis_private priv;
11405 int prefix_length;
11406 int default_prefixes;
11408 if (info->mach == bfd_mach_x86_64_intel_syntax
11409 || info->mach == bfd_mach_x86_64
11410 || info->mach == bfd_mach_x64_32_intel_syntax
11411 || info->mach == bfd_mach_x64_32
11412 || info->mach == bfd_mach_l1om
11413 || info->mach == bfd_mach_l1om_intel_syntax)
11414 address_mode = mode_64bit;
11415 else
11416 address_mode = mode_32bit;
11418 if (intel_syntax == (char) -1)
11419 intel_syntax = (info->mach == bfd_mach_i386_i386_intel_syntax
11420 || info->mach == bfd_mach_x86_64_intel_syntax
11421 || info->mach == bfd_mach_x64_32_intel_syntax
11422 || info->mach == bfd_mach_l1om_intel_syntax);
11424 if (info->mach == bfd_mach_i386_i386
11425 || info->mach == bfd_mach_x86_64
11426 || info->mach == bfd_mach_x64_32
11427 || info->mach == bfd_mach_l1om
11428 || info->mach == bfd_mach_i386_i386_intel_syntax
11429 || info->mach == bfd_mach_x86_64_intel_syntax
11430 || info->mach == bfd_mach_x64_32_intel_syntax
11431 || info->mach == bfd_mach_l1om_intel_syntax)
11432 priv.orig_sizeflag = AFLAG | DFLAG;
11433 else if (info->mach == bfd_mach_i386_i8086)
11434 priv.orig_sizeflag = 0;
11435 else
11436 abort ();
11438 for (p = info->disassembler_options; p != NULL; )
11440 if (CONST_STRNEQ (p, "x86-64"))
11442 address_mode = mode_64bit;
11443 priv.orig_sizeflag = AFLAG | DFLAG;
11445 else if (CONST_STRNEQ (p, "i386"))
11447 address_mode = mode_32bit;
11448 priv.orig_sizeflag = AFLAG | DFLAG;
11450 else if (CONST_STRNEQ (p, "i8086"))
11452 address_mode = mode_16bit;
11453 priv.orig_sizeflag = 0;
11455 else if (CONST_STRNEQ (p, "intel"))
11457 intel_syntax = 1;
11458 if (CONST_STRNEQ (p + 5, "-mnemonic"))
11459 intel_mnemonic = 1;
11461 else if (CONST_STRNEQ (p, "att"))
11463 intel_syntax = 0;
11464 if (CONST_STRNEQ (p + 3, "-mnemonic"))
11465 intel_mnemonic = 0;
11467 else if (CONST_STRNEQ (p, "addr"))
11469 if (address_mode == mode_64bit)
11471 if (p[4] == '3' && p[5] == '2')
11472 priv.orig_sizeflag &= ~AFLAG;
11473 else if (p[4] == '6' && p[5] == '4')
11474 priv.orig_sizeflag |= AFLAG;
11476 else
11478 if (p[4] == '1' && p[5] == '6')
11479 priv.orig_sizeflag &= ~AFLAG;
11480 else if (p[4] == '3' && p[5] == '2')
11481 priv.orig_sizeflag |= AFLAG;
11484 else if (CONST_STRNEQ (p, "data"))
11486 if (p[4] == '1' && p[5] == '6')
11487 priv.orig_sizeflag &= ~DFLAG;
11488 else if (p[4] == '3' && p[5] == '2')
11489 priv.orig_sizeflag |= DFLAG;
11491 else if (CONST_STRNEQ (p, "suffix"))
11492 priv.orig_sizeflag |= SUFFIX_ALWAYS;
11494 p = strchr (p, ',');
11495 if (p != NULL)
11496 p++;
11499 if (intel_syntax)
11501 names64 = intel_names64;
11502 names32 = intel_names32;
11503 names16 = intel_names16;
11504 names8 = intel_names8;
11505 names8rex = intel_names8rex;
11506 names_seg = intel_names_seg;
11507 names_mm = intel_names_mm;
11508 names_xmm = intel_names_xmm;
11509 names_ymm = intel_names_ymm;
11510 index64 = intel_index64;
11511 index32 = intel_index32;
11512 index16 = intel_index16;
11513 open_char = '[';
11514 close_char = ']';
11515 separator_char = '+';
11516 scale_char = '*';
11518 else
11520 names64 = att_names64;
11521 names32 = att_names32;
11522 names16 = att_names16;
11523 names8 = att_names8;
11524 names8rex = att_names8rex;
11525 names_seg = att_names_seg;
11526 names_mm = att_names_mm;
11527 names_xmm = att_names_xmm;
11528 names_ymm = att_names_ymm;
11529 index64 = att_index64;
11530 index32 = att_index32;
11531 index16 = att_index16;
11532 open_char = '(';
11533 close_char = ')';
11534 separator_char = ',';
11535 scale_char = ',';
11538 /* The output looks better if we put 7 bytes on a line, since that
11539 puts most long word instructions on a single line. Use 8 bytes
11540 for Intel L1OM. */
11541 if (info->mach == bfd_mach_l1om
11542 || info->mach == bfd_mach_l1om_intel_syntax)
11543 info->bytes_per_line = 8;
11544 else
11545 info->bytes_per_line = 7;
11547 info->private_data = &priv;
11548 priv.max_fetched = priv.the_buffer;
11549 priv.insn_start = pc;
11551 obuf[0] = 0;
11552 for (i = 0; i < MAX_OPERANDS; ++i)
11554 op_out[i][0] = 0;
11555 op_index[i] = -1;
11558 the_info = info;
11559 start_pc = pc;
11560 start_codep = priv.the_buffer;
11561 codep = priv.the_buffer;
11563 if (setjmp (priv.bailout) != 0)
11565 const char *name;
11567 /* Getting here means we tried for data but didn't get it. That
11568 means we have an incomplete instruction of some sort. Just
11569 print the first byte as a prefix or a .byte pseudo-op. */
11570 if (codep > priv.the_buffer)
11572 name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
11573 if (name != NULL)
11574 (*info->fprintf_func) (info->stream, "%s", name);
11575 else
11577 /* Just print the first byte as a .byte instruction. */
11578 (*info->fprintf_func) (info->stream, ".byte 0x%x",
11579 (unsigned int) priv.the_buffer[0]);
11582 return 1;
11585 return -1;
11588 obufp = obuf;
11589 sizeflag = priv.orig_sizeflag;
11591 if (!ckprefix () || rex_used)
11593 /* Too many prefixes or unused REX prefixes. */
11594 for (i = 0;
11595 all_prefixes[i] && i < (int) ARRAY_SIZE (all_prefixes);
11596 i++)
11597 (*info->fprintf_func) (info->stream, "%s",
11598 prefix_name (all_prefixes[i], sizeflag));
11599 return 1;
11602 insn_codep = codep;
11604 FETCH_DATA (info, codep + 1);
11605 two_source_ops = (*codep == 0x62) || (*codep == 0xc8);
11607 if (((prefixes & PREFIX_FWAIT)
11608 && ((*codep < 0xd8) || (*codep > 0xdf))))
11610 (*info->fprintf_func) (info->stream, "fwait");
11611 return 1;
11614 if (*codep == 0x0f)
11616 unsigned char threebyte;
11617 FETCH_DATA (info, codep + 2);
11618 threebyte = *++codep;
11619 dp = &dis386_twobyte[threebyte];
11620 need_modrm = twobyte_has_modrm[*codep];
11621 codep++;
11623 else
11625 dp = &dis386[*codep];
11626 need_modrm = onebyte_has_modrm[*codep];
11627 codep++;
11630 if ((prefixes & PREFIX_REPZ))
11631 used_prefixes |= PREFIX_REPZ;
11632 if ((prefixes & PREFIX_REPNZ))
11633 used_prefixes |= PREFIX_REPNZ;
11634 if ((prefixes & PREFIX_LOCK))
11635 used_prefixes |= PREFIX_LOCK;
11637 default_prefixes = 0;
11638 if (prefixes & PREFIX_ADDR)
11640 sizeflag ^= AFLAG;
11641 if (dp->op[2].bytemode != loop_jcxz_mode || intel_syntax)
11643 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
11644 all_prefixes[last_addr_prefix] = ADDR32_PREFIX;
11645 else
11646 all_prefixes[last_addr_prefix] = ADDR16_PREFIX;
11647 default_prefixes |= PREFIX_ADDR;
11651 if ((prefixes & PREFIX_DATA))
11653 sizeflag ^= DFLAG;
11654 if (dp->op[2].bytemode == cond_jump_mode
11655 && dp->op[0].bytemode == v_mode
11656 && !intel_syntax)
11658 if (sizeflag & DFLAG)
11659 all_prefixes[last_data_prefix] = DATA32_PREFIX;
11660 else
11661 all_prefixes[last_data_prefix] = DATA16_PREFIX;
11662 default_prefixes |= PREFIX_DATA;
11664 else if (rex & REX_W)
11666 /* REX_W will override PREFIX_DATA. */
11667 default_prefixes |= PREFIX_DATA;
11671 if (need_modrm)
11673 FETCH_DATA (info, codep + 1);
11674 modrm.mod = (*codep >> 6) & 3;
11675 modrm.reg = (*codep >> 3) & 7;
11676 modrm.rm = *codep & 7;
11679 need_vex = 0;
11680 need_vex_reg = 0;
11681 vex_w_done = 0;
11683 if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE)
11685 get_sib (info);
11686 dofloat (sizeflag);
11688 else
11690 dp = get_valid_dis386 (dp, info);
11691 if (dp != NULL && putop (dp->name, sizeflag) == 0)
11693 get_sib (info);
11694 for (i = 0; i < MAX_OPERANDS; ++i)
11696 obufp = op_out[i];
11697 op_ad = MAX_OPERANDS - 1 - i;
11698 if (dp->op[i].rtn)
11699 (*dp->op[i].rtn) (dp->op[i].bytemode, sizeflag);
11704 /* See if any prefixes were not used. If so, print the first one
11705 separately. If we don't do this, we'll wind up printing an
11706 instruction stream which does not precisely correspond to the
11707 bytes we are disassembling. */
11708 if ((prefixes & ~(used_prefixes | default_prefixes)) != 0)
11710 for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
11711 if (all_prefixes[i])
11713 const char *name;
11714 name = prefix_name (all_prefixes[i], priv.orig_sizeflag);
11715 if (name == NULL)
11716 name = INTERNAL_DISASSEMBLER_ERROR;
11717 (*info->fprintf_func) (info->stream, "%s", name);
11718 return 1;
11722 /* Check if the REX prefix is used. */
11723 if (rex_ignored == 0 && (rex ^ rex_used) == 0)
11724 all_prefixes[last_rex_prefix] = 0;
11726 /* Check if the SEG prefix is used. */
11727 if ((prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS | PREFIX_ES
11728 | PREFIX_FS | PREFIX_GS)) != 0
11729 && (used_prefixes
11730 & seg_prefix (all_prefixes[last_seg_prefix])) != 0)
11731 all_prefixes[last_seg_prefix] = 0;
11733 /* Check if the ADDR prefix is used. */
11734 if ((prefixes & PREFIX_ADDR) != 0
11735 && (used_prefixes & PREFIX_ADDR) != 0)
11736 all_prefixes[last_addr_prefix] = 0;
11738 /* Check if the DATA prefix is used. */
11739 if ((prefixes & PREFIX_DATA) != 0
11740 && (used_prefixes & PREFIX_DATA) != 0)
11741 all_prefixes[last_data_prefix] = 0;
11743 prefix_length = 0;
11744 for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
11745 if (all_prefixes[i])
11747 const char *name;
11748 name = prefix_name (all_prefixes[i], sizeflag);
11749 if (name == NULL)
11750 abort ();
11751 prefix_length += strlen (name) + 1;
11752 (*info->fprintf_func) (info->stream, "%s ", name);
11755 /* Check maximum code length. */
11756 if ((codep - start_codep) > MAX_CODE_LENGTH)
11758 (*info->fprintf_func) (info->stream, "(bad)");
11759 return MAX_CODE_LENGTH;
11762 obufp = mnemonicendp;
11763 for (i = strlen (obuf) + prefix_length; i < 6; i++)
11764 oappend (" ");
11765 oappend (" ");
11766 (*info->fprintf_func) (info->stream, "%s", obuf);
11768 /* The enter and bound instructions are printed with operands in the same
11769 order as the intel book; everything else is printed in reverse order. */
11770 if (intel_syntax || two_source_ops)
11772 bfd_vma riprel;
11774 for (i = 0; i < MAX_OPERANDS; ++i)
11775 op_txt[i] = op_out[i];
11777 for (i = 0; i < (MAX_OPERANDS >> 1); ++i)
11779 op_ad = op_index[i];
11780 op_index[i] = op_index[MAX_OPERANDS - 1 - i];
11781 op_index[MAX_OPERANDS - 1 - i] = op_ad;
11782 riprel = op_riprel[i];
11783 op_riprel[i] = op_riprel [MAX_OPERANDS - 1 - i];
11784 op_riprel[MAX_OPERANDS - 1 - i] = riprel;
11787 else
11789 for (i = 0; i < MAX_OPERANDS; ++i)
11790 op_txt[MAX_OPERANDS - 1 - i] = op_out[i];
11793 needcomma = 0;
11794 for (i = 0; i < MAX_OPERANDS; ++i)
11795 if (*op_txt[i])
11797 if (needcomma)
11798 (*info->fprintf_func) (info->stream, ",");
11799 if (op_index[i] != -1 && !op_riprel[i])
11800 (*info->print_address_func) ((bfd_vma) op_address[op_index[i]], info);
11801 else
11802 (*info->fprintf_func) (info->stream, "%s", op_txt[i]);
11803 needcomma = 1;
11806 for (i = 0; i < MAX_OPERANDS; i++)
11807 if (op_index[i] != -1 && op_riprel[i])
11809 (*info->fprintf_func) (info->stream, " # ");
11810 (*info->print_address_func) ((bfd_vma) (start_pc + codep - start_codep
11811 + op_address[op_index[i]]), info);
11812 break;
11814 return codep - priv.the_buffer;
11817 static const char *float_mem[] = {
11818 /* d8 */
11819 "fadd{s|}",
11820 "fmul{s|}",
11821 "fcom{s|}",
11822 "fcomp{s|}",
11823 "fsub{s|}",
11824 "fsubr{s|}",
11825 "fdiv{s|}",
11826 "fdivr{s|}",
11827 /* d9 */
11828 "fld{s|}",
11829 "(bad)",
11830 "fst{s|}",
11831 "fstp{s|}",
11832 "fldenvIC",
11833 "fldcw",
11834 "fNstenvIC",
11835 "fNstcw",
11836 /* da */
11837 "fiadd{l|}",
11838 "fimul{l|}",
11839 "ficom{l|}",
11840 "ficomp{l|}",
11841 "fisub{l|}",
11842 "fisubr{l|}",
11843 "fidiv{l|}",
11844 "fidivr{l|}",
11845 /* db */
11846 "fild{l|}",
11847 "fisttp{l|}",
11848 "fist{l|}",
11849 "fistp{l|}",
11850 "(bad)",
11851 "fld{t||t|}",
11852 "(bad)",
11853 "fstp{t||t|}",
11854 /* dc */
11855 "fadd{l|}",
11856 "fmul{l|}",
11857 "fcom{l|}",
11858 "fcomp{l|}",
11859 "fsub{l|}",
11860 "fsubr{l|}",
11861 "fdiv{l|}",
11862 "fdivr{l|}",
11863 /* dd */
11864 "fld{l|}",
11865 "fisttp{ll|}",
11866 "fst{l||}",
11867 "fstp{l|}",
11868 "frstorIC",
11869 "(bad)",
11870 "fNsaveIC",
11871 "fNstsw",
11872 /* de */
11873 "fiadd",
11874 "fimul",
11875 "ficom",
11876 "ficomp",
11877 "fisub",
11878 "fisubr",
11879 "fidiv",
11880 "fidivr",
11881 /* df */
11882 "fild",
11883 "fisttp",
11884 "fist",
11885 "fistp",
11886 "fbld",
11887 "fild{ll|}",
11888 "fbstp",
11889 "fistp{ll|}",
11892 static const unsigned char float_mem_mode[] = {
11893 /* d8 */
11894 d_mode,
11895 d_mode,
11896 d_mode,
11897 d_mode,
11898 d_mode,
11899 d_mode,
11900 d_mode,
11901 d_mode,
11902 /* d9 */
11903 d_mode,
11905 d_mode,
11906 d_mode,
11908 w_mode,
11910 w_mode,
11911 /* da */
11912 d_mode,
11913 d_mode,
11914 d_mode,
11915 d_mode,
11916 d_mode,
11917 d_mode,
11918 d_mode,
11919 d_mode,
11920 /* db */
11921 d_mode,
11922 d_mode,
11923 d_mode,
11924 d_mode,
11926 t_mode,
11928 t_mode,
11929 /* dc */
11930 q_mode,
11931 q_mode,
11932 q_mode,
11933 q_mode,
11934 q_mode,
11935 q_mode,
11936 q_mode,
11937 q_mode,
11938 /* dd */
11939 q_mode,
11940 q_mode,
11941 q_mode,
11942 q_mode,
11946 w_mode,
11947 /* de */
11948 w_mode,
11949 w_mode,
11950 w_mode,
11951 w_mode,
11952 w_mode,
11953 w_mode,
11954 w_mode,
11955 w_mode,
11956 /* df */
11957 w_mode,
11958 w_mode,
11959 w_mode,
11960 w_mode,
11961 t_mode,
11962 q_mode,
11963 t_mode,
11964 q_mode
11967 #define ST { OP_ST, 0 }
11968 #define STi { OP_STi, 0 }
11970 #define FGRPd9_2 NULL, { { NULL, 0 } }
11971 #define FGRPd9_4 NULL, { { NULL, 1 } }
11972 #define FGRPd9_5 NULL, { { NULL, 2 } }
11973 #define FGRPd9_6 NULL, { { NULL, 3 } }
11974 #define FGRPd9_7 NULL, { { NULL, 4 } }
11975 #define FGRPda_5 NULL, { { NULL, 5 } }
11976 #define FGRPdb_4 NULL, { { NULL, 6 } }
11977 #define FGRPde_3 NULL, { { NULL, 7 } }
11978 #define FGRPdf_4 NULL, { { NULL, 8 } }
11980 static const struct dis386 float_reg[][8] = {
11981 /* d8 */
11983 { "fadd", { ST, STi } },
11984 { "fmul", { ST, STi } },
11985 { "fcom", { STi } },
11986 { "fcomp", { STi } },
11987 { "fsub", { ST, STi } },
11988 { "fsubr", { ST, STi } },
11989 { "fdiv", { ST, STi } },
11990 { "fdivr", { ST, STi } },
11992 /* d9 */
11994 { "fld", { STi } },
11995 { "fxch", { STi } },
11996 { FGRPd9_2 },
11997 { Bad_Opcode },
11998 { FGRPd9_4 },
11999 { FGRPd9_5 },
12000 { FGRPd9_6 },
12001 { FGRPd9_7 },
12003 /* da */
12005 { "fcmovb", { ST, STi } },
12006 { "fcmove", { ST, STi } },
12007 { "fcmovbe",{ ST, STi } },
12008 { "fcmovu", { ST, STi } },
12009 { Bad_Opcode },
12010 { FGRPda_5 },
12011 { Bad_Opcode },
12012 { Bad_Opcode },
12014 /* db */
12016 { "fcmovnb",{ ST, STi } },
12017 { "fcmovne",{ ST, STi } },
12018 { "fcmovnbe",{ ST, STi } },
12019 { "fcmovnu",{ ST, STi } },
12020 { FGRPdb_4 },
12021 { "fucomi", { ST, STi } },
12022 { "fcomi", { ST, STi } },
12023 { Bad_Opcode },
12025 /* dc */
12027 { "fadd", { STi, ST } },
12028 { "fmul", { STi, ST } },
12029 { Bad_Opcode },
12030 { Bad_Opcode },
12031 { "fsub!M", { STi, ST } },
12032 { "fsubM", { STi, ST } },
12033 { "fdiv!M", { STi, ST } },
12034 { "fdivM", { STi, ST } },
12036 /* dd */
12038 { "ffree", { STi } },
12039 { Bad_Opcode },
12040 { "fst", { STi } },
12041 { "fstp", { STi } },
12042 { "fucom", { STi } },
12043 { "fucomp", { STi } },
12044 { Bad_Opcode },
12045 { Bad_Opcode },
12047 /* de */
12049 { "faddp", { STi, ST } },
12050 { "fmulp", { STi, ST } },
12051 { Bad_Opcode },
12052 { FGRPde_3 },
12053 { "fsub!Mp", { STi, ST } },
12054 { "fsubMp", { STi, ST } },
12055 { "fdiv!Mp", { STi, ST } },
12056 { "fdivMp", { STi, ST } },
12058 /* df */
12060 { "ffreep", { STi } },
12061 { Bad_Opcode },
12062 { Bad_Opcode },
12063 { Bad_Opcode },
12064 { FGRPdf_4 },
12065 { "fucomip", { ST, STi } },
12066 { "fcomip", { ST, STi } },
12067 { Bad_Opcode },
12071 static char *fgrps[][8] = {
12072 /* d9_2 0 */
12074 "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
12077 /* d9_4 1 */
12079 "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
12082 /* d9_5 2 */
12084 "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
12087 /* d9_6 3 */
12089 "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
12092 /* d9_7 4 */
12094 "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
12097 /* da_5 5 */
12099 "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
12102 /* db_4 6 */
12104 "fNeni(8087 only)","fNdisi(8087 only)","fNclex","fNinit",
12105 "fNsetpm(287 only)","frstpm(287 only)","(bad)","(bad)",
12108 /* de_3 7 */
12110 "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
12113 /* df_4 8 */
12115 "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
12119 static void
12120 swap_operand (void)
12122 mnemonicendp[0] = '.';
12123 mnemonicendp[1] = 's';
12124 mnemonicendp += 2;
12127 static void
12128 OP_Skip_MODRM (int bytemode ATTRIBUTE_UNUSED,
12129 int sizeflag ATTRIBUTE_UNUSED)
12131 /* Skip mod/rm byte. */
12132 MODRM_CHECK;
12133 codep++;
12136 static void
12137 dofloat (int sizeflag)
12139 const struct dis386 *dp;
12140 unsigned char floatop;
12142 floatop = codep[-1];
12144 if (modrm.mod != 3)
12146 int fp_indx = (floatop - 0xd8) * 8 + modrm.reg;
12148 putop (float_mem[fp_indx], sizeflag);
12149 obufp = op_out[0];
12150 op_ad = 2;
12151 OP_E (float_mem_mode[fp_indx], sizeflag);
12152 return;
12154 /* Skip mod/rm byte. */
12155 MODRM_CHECK;
12156 codep++;
12158 dp = &float_reg[floatop - 0xd8][modrm.reg];
12159 if (dp->name == NULL)
12161 putop (fgrps[dp->op[0].bytemode][modrm.rm], sizeflag);
12163 /* Instruction fnstsw is only one with strange arg. */
12164 if (floatop == 0xdf && codep[-1] == 0xe0)
12165 strcpy (op_out[0], names16[0]);
12167 else
12169 putop (dp->name, sizeflag);
12171 obufp = op_out[0];
12172 op_ad = 2;
12173 if (dp->op[0].rtn)
12174 (*dp->op[0].rtn) (dp->op[0].bytemode, sizeflag);
12176 obufp = op_out[1];
12177 op_ad = 1;
12178 if (dp->op[1].rtn)
12179 (*dp->op[1].rtn) (dp->op[1].bytemode, sizeflag);
12183 static void
12184 OP_ST (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12186 oappend ("%st" + intel_syntax);
12189 static void
12190 OP_STi (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12192 sprintf (scratchbuf, "%%st(%d)", modrm.rm);
12193 oappend (scratchbuf + intel_syntax);
12196 /* Capital letters in template are macros. */
12197 static int
12198 putop (const char *in_template, int sizeflag)
12200 const char *p;
12201 int alt = 0;
12202 int cond = 1;
12203 unsigned int l = 0, len = 1;
12204 char last[4];
12206 #define SAVE_LAST(c) \
12207 if (l < len && l < sizeof (last)) \
12208 last[l++] = c; \
12209 else \
12210 abort ();
12212 for (p = in_template; *p; p++)
12214 switch (*p)
12216 default:
12217 *obufp++ = *p;
12218 break;
12219 case '%':
12220 len++;
12221 break;
12222 case '!':
12223 cond = 0;
12224 break;
12225 case '{':
12226 alt = 0;
12227 if (intel_syntax)
12229 while (*++p != '|')
12230 if (*p == '}' || *p == '\0')
12231 abort ();
12233 /* Fall through. */
12234 case 'I':
12235 alt = 1;
12236 continue;
12237 case '|':
12238 while (*++p != '}')
12240 if (*p == '\0')
12241 abort ();
12243 break;
12244 case '}':
12245 break;
12246 case 'A':
12247 if (intel_syntax)
12248 break;
12249 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
12250 *obufp++ = 'b';
12251 break;
12252 case 'B':
12253 if (l == 0 && len == 1)
12255 case_B:
12256 if (intel_syntax)
12257 break;
12258 if (sizeflag & SUFFIX_ALWAYS)
12259 *obufp++ = 'b';
12261 else
12263 if (l != 1
12264 || len != 2
12265 || last[0] != 'L')
12267 SAVE_LAST (*p);
12268 break;
12271 if (address_mode == mode_64bit
12272 && !(prefixes & PREFIX_ADDR))
12274 *obufp++ = 'a';
12275 *obufp++ = 'b';
12276 *obufp++ = 's';
12279 goto case_B;
12281 break;
12282 case 'C':
12283 if (intel_syntax && !alt)
12284 break;
12285 if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
12287 if (sizeflag & DFLAG)
12288 *obufp++ = intel_syntax ? 'd' : 'l';
12289 else
12290 *obufp++ = intel_syntax ? 'w' : 's';
12291 used_prefixes |= (prefixes & PREFIX_DATA);
12293 break;
12294 case 'D':
12295 if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
12296 break;
12297 USED_REX (REX_W);
12298 if (modrm.mod == 3)
12300 if (rex & REX_W)
12301 *obufp++ = 'q';
12302 else
12304 if (sizeflag & DFLAG)
12305 *obufp++ = intel_syntax ? 'd' : 'l';
12306 else
12307 *obufp++ = 'w';
12308 used_prefixes |= (prefixes & PREFIX_DATA);
12311 else
12312 *obufp++ = 'w';
12313 break;
12314 case 'E': /* For jcxz/jecxz */
12315 if (address_mode == mode_64bit)
12317 if (sizeflag & AFLAG)
12318 *obufp++ = 'r';
12319 else
12320 *obufp++ = 'e';
12322 else
12323 if (sizeflag & AFLAG)
12324 *obufp++ = 'e';
12325 used_prefixes |= (prefixes & PREFIX_ADDR);
12326 break;
12327 case 'F':
12328 if (intel_syntax)
12329 break;
12330 if ((prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS))
12332 if (sizeflag & AFLAG)
12333 *obufp++ = address_mode == mode_64bit ? 'q' : 'l';
12334 else
12335 *obufp++ = address_mode == mode_64bit ? 'l' : 'w';
12336 used_prefixes |= (prefixes & PREFIX_ADDR);
12338 break;
12339 case 'G':
12340 if (intel_syntax || (obufp[-1] != 's' && !(sizeflag & SUFFIX_ALWAYS)))
12341 break;
12342 if ((rex & REX_W) || (sizeflag & DFLAG))
12343 *obufp++ = 'l';
12344 else
12345 *obufp++ = 'w';
12346 if (!(rex & REX_W))
12347 used_prefixes |= (prefixes & PREFIX_DATA);
12348 break;
12349 case 'H':
12350 if (intel_syntax)
12351 break;
12352 if ((prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS
12353 || (prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS)
12355 used_prefixes |= prefixes & (PREFIX_CS | PREFIX_DS);
12356 *obufp++ = ',';
12357 *obufp++ = 'p';
12358 if (prefixes & PREFIX_DS)
12359 *obufp++ = 't';
12360 else
12361 *obufp++ = 'n';
12363 break;
12364 case 'J':
12365 if (intel_syntax)
12366 break;
12367 *obufp++ = 'l';
12368 break;
12369 case 'K':
12370 USED_REX (REX_W);
12371 if (rex & REX_W)
12372 *obufp++ = 'q';
12373 else
12374 *obufp++ = 'd';
12375 break;
12376 case 'Z':
12377 if (intel_syntax)
12378 break;
12379 if (address_mode == mode_64bit && (sizeflag & SUFFIX_ALWAYS))
12381 *obufp++ = 'q';
12382 break;
12384 /* Fall through. */
12385 goto case_L;
12386 case 'L':
12387 if (l != 0 || len != 1)
12389 SAVE_LAST (*p);
12390 break;
12392 case_L:
12393 if (intel_syntax)
12394 break;
12395 if (sizeflag & SUFFIX_ALWAYS)
12396 *obufp++ = 'l';
12397 break;
12398 case 'M':
12399 if (intel_mnemonic != cond)
12400 *obufp++ = 'r';
12401 break;
12402 case 'N':
12403 if ((prefixes & PREFIX_FWAIT) == 0)
12404 *obufp++ = 'n';
12405 else
12406 used_prefixes |= PREFIX_FWAIT;
12407 break;
12408 case 'O':
12409 USED_REX (REX_W);
12410 if (rex & REX_W)
12411 *obufp++ = 'o';
12412 else if (intel_syntax && (sizeflag & DFLAG))
12413 *obufp++ = 'q';
12414 else
12415 *obufp++ = 'd';
12416 if (!(rex & REX_W))
12417 used_prefixes |= (prefixes & PREFIX_DATA);
12418 break;
12419 case 'T':
12420 if (!intel_syntax
12421 && address_mode == mode_64bit
12422 && (sizeflag & DFLAG))
12424 *obufp++ = 'q';
12425 break;
12427 /* Fall through. */
12428 case 'P':
12429 if (intel_syntax)
12431 if ((rex & REX_W) == 0
12432 && (prefixes & PREFIX_DATA))
12434 if ((sizeflag & DFLAG) == 0)
12435 *obufp++ = 'w';
12436 used_prefixes |= (prefixes & PREFIX_DATA);
12438 break;
12440 if ((prefixes & PREFIX_DATA)
12441 || (rex & REX_W)
12442 || (sizeflag & SUFFIX_ALWAYS))
12444 USED_REX (REX_W);
12445 if (rex & REX_W)
12446 *obufp++ = 'q';
12447 else
12449 if (sizeflag & DFLAG)
12450 *obufp++ = 'l';
12451 else
12452 *obufp++ = 'w';
12453 used_prefixes |= (prefixes & PREFIX_DATA);
12456 break;
12457 case 'U':
12458 if (intel_syntax)
12459 break;
12460 if (address_mode == mode_64bit && (sizeflag & DFLAG))
12462 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
12463 *obufp++ = 'q';
12464 break;
12466 /* Fall through. */
12467 goto case_Q;
12468 case 'Q':
12469 if (l == 0 && len == 1)
12471 case_Q:
12472 if (intel_syntax && !alt)
12473 break;
12474 USED_REX (REX_W);
12475 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
12477 if (rex & REX_W)
12478 *obufp++ = 'q';
12479 else
12481 if (sizeflag & DFLAG)
12482 *obufp++ = intel_syntax ? 'd' : 'l';
12483 else
12484 *obufp++ = 'w';
12485 used_prefixes |= (prefixes & PREFIX_DATA);
12489 else
12491 if (l != 1 || len != 2 || last[0] != 'L')
12493 SAVE_LAST (*p);
12494 break;
12496 if (intel_syntax
12497 || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
12498 break;
12499 if ((rex & REX_W))
12501 USED_REX (REX_W);
12502 *obufp++ = 'q';
12504 else
12505 *obufp++ = 'l';
12507 break;
12508 case 'R':
12509 USED_REX (REX_W);
12510 if (rex & REX_W)
12511 *obufp++ = 'q';
12512 else if (sizeflag & DFLAG)
12514 if (intel_syntax)
12515 *obufp++ = 'd';
12516 else
12517 *obufp++ = 'l';
12519 else
12520 *obufp++ = 'w';
12521 if (intel_syntax && !p[1]
12522 && ((rex & REX_W) || (sizeflag & DFLAG)))
12523 *obufp++ = 'e';
12524 if (!(rex & REX_W))
12525 used_prefixes |= (prefixes & PREFIX_DATA);
12526 break;
12527 case 'V':
12528 if (l == 0 && len == 1)
12530 if (intel_syntax)
12531 break;
12532 if (address_mode == mode_64bit && (sizeflag & DFLAG))
12534 if (sizeflag & SUFFIX_ALWAYS)
12535 *obufp++ = 'q';
12536 break;
12539 else
12541 if (l != 1
12542 || len != 2
12543 || last[0] != 'L')
12545 SAVE_LAST (*p);
12546 break;
12549 if (rex & REX_W)
12551 *obufp++ = 'a';
12552 *obufp++ = 'b';
12553 *obufp++ = 's';
12556 /* Fall through. */
12557 goto case_S;
12558 case 'S':
12559 if (l == 0 && len == 1)
12561 case_S:
12562 if (intel_syntax)
12563 break;
12564 if (sizeflag & SUFFIX_ALWAYS)
12566 if (rex & REX_W)
12567 *obufp++ = 'q';
12568 else
12570 if (sizeflag & DFLAG)
12571 *obufp++ = 'l';
12572 else
12573 *obufp++ = 'w';
12574 used_prefixes |= (prefixes & PREFIX_DATA);
12578 else
12580 if (l != 1
12581 || len != 2
12582 || last[0] != 'L')
12584 SAVE_LAST (*p);
12585 break;
12588 if (address_mode == mode_64bit
12589 && !(prefixes & PREFIX_ADDR))
12591 *obufp++ = 'a';
12592 *obufp++ = 'b';
12593 *obufp++ = 's';
12596 goto case_S;
12598 break;
12599 case 'X':
12600 if (l != 0 || len != 1)
12602 SAVE_LAST (*p);
12603 break;
12605 if (need_vex && vex.prefix)
12607 if (vex.prefix == DATA_PREFIX_OPCODE)
12608 *obufp++ = 'd';
12609 else
12610 *obufp++ = 's';
12612 else
12614 if (prefixes & PREFIX_DATA)
12615 *obufp++ = 'd';
12616 else
12617 *obufp++ = 's';
12618 used_prefixes |= (prefixes & PREFIX_DATA);
12620 break;
12621 case 'Y':
12622 if (l == 0 && len == 1)
12624 if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
12625 break;
12626 if (rex & REX_W)
12628 USED_REX (REX_W);
12629 *obufp++ = 'q';
12631 break;
12633 else
12635 if (l != 1 || len != 2 || last[0] != 'X')
12637 SAVE_LAST (*p);
12638 break;
12640 if (!need_vex)
12641 abort ();
12642 if (intel_syntax
12643 || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
12644 break;
12645 switch (vex.length)
12647 case 128:
12648 *obufp++ = 'x';
12649 break;
12650 case 256:
12651 *obufp++ = 'y';
12652 break;
12653 default:
12654 abort ();
12657 break;
12658 case 'W':
12659 if (l == 0 && len == 1)
12661 /* operand size flag for cwtl, cbtw */
12662 USED_REX (REX_W);
12663 if (rex & REX_W)
12665 if (intel_syntax)
12666 *obufp++ = 'd';
12667 else
12668 *obufp++ = 'l';
12670 else if (sizeflag & DFLAG)
12671 *obufp++ = 'w';
12672 else
12673 *obufp++ = 'b';
12674 if (!(rex & REX_W))
12675 used_prefixes |= (prefixes & PREFIX_DATA);
12677 else
12679 if (l != 1 || len != 2 || last[0] != 'X')
12681 SAVE_LAST (*p);
12682 break;
12684 if (!need_vex)
12685 abort ();
12686 *obufp++ = vex.w ? 'd': 's';
12688 break;
12690 alt = 0;
12692 *obufp = 0;
12693 mnemonicendp = obufp;
12694 return 0;
12697 static void
12698 oappend (const char *s)
12700 obufp = stpcpy (obufp, s);
12703 static void
12704 append_seg (void)
12706 if (prefixes & PREFIX_CS)
12708 used_prefixes |= PREFIX_CS;
12709 oappend ("%cs:" + intel_syntax);
12711 if (prefixes & PREFIX_DS)
12713 used_prefixes |= PREFIX_DS;
12714 oappend ("%ds:" + intel_syntax);
12716 if (prefixes & PREFIX_SS)
12718 used_prefixes |= PREFIX_SS;
12719 oappend ("%ss:" + intel_syntax);
12721 if (prefixes & PREFIX_ES)
12723 used_prefixes |= PREFIX_ES;
12724 oappend ("%es:" + intel_syntax);
12726 if (prefixes & PREFIX_FS)
12728 used_prefixes |= PREFIX_FS;
12729 oappend ("%fs:" + intel_syntax);
12731 if (prefixes & PREFIX_GS)
12733 used_prefixes |= PREFIX_GS;
12734 oappend ("%gs:" + intel_syntax);
12738 static void
12739 OP_indirE (int bytemode, int sizeflag)
12741 if (!intel_syntax)
12742 oappend ("*");
12743 OP_E (bytemode, sizeflag);
12746 static void
12747 print_operand_value (char *buf, int hex, bfd_vma disp)
12749 if (address_mode == mode_64bit)
12751 if (hex)
12753 char tmp[30];
12754 int i;
12755 buf[0] = '0';
12756 buf[1] = 'x';
12757 sprintf_vma (tmp, disp);
12758 for (i = 0; tmp[i] == '0' && tmp[i + 1]; i++);
12759 strcpy (buf + 2, tmp + i);
12761 else
12763 bfd_signed_vma v = disp;
12764 char tmp[30];
12765 int i;
12766 if (v < 0)
12768 *(buf++) = '-';
12769 v = -disp;
12770 /* Check for possible overflow on 0x8000000000000000. */
12771 if (v < 0)
12773 strcpy (buf, "9223372036854775808");
12774 return;
12777 if (!v)
12779 strcpy (buf, "0");
12780 return;
12783 i = 0;
12784 tmp[29] = 0;
12785 while (v)
12787 tmp[28 - i] = (v % 10) + '0';
12788 v /= 10;
12789 i++;
12791 strcpy (buf, tmp + 29 - i);
12794 else
12796 if (hex)
12797 sprintf (buf, "0x%x", (unsigned int) disp);
12798 else
12799 sprintf (buf, "%d", (int) disp);
12803 /* Put DISP in BUF as signed hex number. */
12805 static void
12806 print_displacement (char *buf, bfd_vma disp)
12808 bfd_signed_vma val = disp;
12809 char tmp[30];
12810 int i, j = 0;
12812 if (val < 0)
12814 buf[j++] = '-';
12815 val = -disp;
12817 /* Check for possible overflow. */
12818 if (val < 0)
12820 switch (address_mode)
12822 case mode_64bit:
12823 strcpy (buf + j, "0x8000000000000000");
12824 break;
12825 case mode_32bit:
12826 strcpy (buf + j, "0x80000000");
12827 break;
12828 case mode_16bit:
12829 strcpy (buf + j, "0x8000");
12830 break;
12832 return;
12836 buf[j++] = '0';
12837 buf[j++] = 'x';
12839 sprintf_vma (tmp, (bfd_vma) val);
12840 for (i = 0; tmp[i] == '0'; i++)
12841 continue;
12842 if (tmp[i] == '\0')
12843 i--;
12844 strcpy (buf + j, tmp + i);
12847 static void
12848 intel_operand_size (int bytemode, int sizeflag)
12850 switch (bytemode)
12852 case b_mode:
12853 case b_swap_mode:
12854 case dqb_mode:
12855 oappend ("BYTE PTR ");
12856 break;
12857 case w_mode:
12858 case dqw_mode:
12859 oappend ("WORD PTR ");
12860 break;
12861 case stack_v_mode:
12862 if (address_mode == mode_64bit && (sizeflag & DFLAG))
12864 oappend ("QWORD PTR ");
12865 break;
12867 /* FALLTHRU */
12868 case v_mode:
12869 case v_swap_mode:
12870 case dq_mode:
12871 USED_REX (REX_W);
12872 if (rex & REX_W)
12873 oappend ("QWORD PTR ");
12874 else
12876 if ((sizeflag & DFLAG) || bytemode == dq_mode)
12877 oappend ("DWORD PTR ");
12878 else
12879 oappend ("WORD PTR ");
12880 used_prefixes |= (prefixes & PREFIX_DATA);
12882 break;
12883 case z_mode:
12884 if ((rex & REX_W) || (sizeflag & DFLAG))
12885 *obufp++ = 'D';
12886 oappend ("WORD PTR ");
12887 if (!(rex & REX_W))
12888 used_prefixes |= (prefixes & PREFIX_DATA);
12889 break;
12890 case a_mode:
12891 if (sizeflag & DFLAG)
12892 oappend ("QWORD PTR ");
12893 else
12894 oappend ("DWORD PTR ");
12895 used_prefixes |= (prefixes & PREFIX_DATA);
12896 break;
12897 case d_mode:
12898 case d_scalar_mode:
12899 case d_scalar_swap_mode:
12900 case d_swap_mode:
12901 case dqd_mode:
12902 oappend ("DWORD PTR ");
12903 break;
12904 case q_mode:
12905 case q_scalar_mode:
12906 case q_scalar_swap_mode:
12907 case q_swap_mode:
12908 oappend ("QWORD PTR ");
12909 break;
12910 case m_mode:
12911 if (address_mode == mode_64bit)
12912 oappend ("QWORD PTR ");
12913 else
12914 oappend ("DWORD PTR ");
12915 break;
12916 case f_mode:
12917 if (sizeflag & DFLAG)
12918 oappend ("FWORD PTR ");
12919 else
12920 oappend ("DWORD PTR ");
12921 used_prefixes |= (prefixes & PREFIX_DATA);
12922 break;
12923 case t_mode:
12924 oappend ("TBYTE PTR ");
12925 break;
12926 case x_mode:
12927 case x_swap_mode:
12928 if (need_vex)
12930 switch (vex.length)
12932 case 128:
12933 oappend ("XMMWORD PTR ");
12934 break;
12935 case 256:
12936 oappend ("YMMWORD PTR ");
12937 break;
12938 default:
12939 abort ();
12942 else
12943 oappend ("XMMWORD PTR ");
12944 break;
12945 case xmm_mode:
12946 oappend ("XMMWORD PTR ");
12947 break;
12948 case xmmq_mode:
12949 if (!need_vex)
12950 abort ();
12952 switch (vex.length)
12954 case 128:
12955 oappend ("QWORD PTR ");
12956 break;
12957 case 256:
12958 oappend ("XMMWORD PTR ");
12959 break;
12960 default:
12961 abort ();
12963 break;
12964 case ymmq_mode:
12965 if (!need_vex)
12966 abort ();
12968 switch (vex.length)
12970 case 128:
12971 oappend ("QWORD PTR ");
12972 break;
12973 case 256:
12974 oappend ("YMMWORD PTR ");
12975 break;
12976 default:
12977 abort ();
12979 break;
12980 case o_mode:
12981 oappend ("OWORD PTR ");
12982 break;
12983 case vex_w_dq_mode:
12984 case vex_scalar_w_dq_mode:
12985 if (!need_vex)
12986 abort ();
12988 if (vex.w)
12989 oappend ("QWORD PTR ");
12990 else
12991 oappend ("DWORD PTR ");
12992 break;
12993 default:
12994 break;
12998 static void
12999 OP_E_register (int bytemode, int sizeflag)
13001 int reg = modrm.rm;
13002 const char **names;
13004 USED_REX (REX_B);
13005 if ((rex & REX_B))
13006 reg += 8;
13008 if ((sizeflag & SUFFIX_ALWAYS)
13009 && (bytemode == b_swap_mode || bytemode == v_swap_mode))
13010 swap_operand ();
13012 switch (bytemode)
13014 case b_mode:
13015 case b_swap_mode:
13016 USED_REX (0);
13017 if (rex)
13018 names = names8rex;
13019 else
13020 names = names8;
13021 break;
13022 case w_mode:
13023 names = names16;
13024 break;
13025 case d_mode:
13026 names = names32;
13027 break;
13028 case q_mode:
13029 names = names64;
13030 break;
13031 case m_mode:
13032 names = address_mode == mode_64bit ? names64 : names32;
13033 break;
13034 case stack_v_mode:
13035 if (address_mode == mode_64bit && (sizeflag & DFLAG))
13037 names = names64;
13038 break;
13040 bytemode = v_mode;
13041 /* FALLTHRU */
13042 case v_mode:
13043 case v_swap_mode:
13044 case dq_mode:
13045 case dqb_mode:
13046 case dqd_mode:
13047 case dqw_mode:
13048 USED_REX (REX_W);
13049 if (rex & REX_W)
13050 names = names64;
13051 else
13053 if ((sizeflag & DFLAG)
13054 || (bytemode != v_mode
13055 && bytemode != v_swap_mode))
13056 names = names32;
13057 else
13058 names = names16;
13059 used_prefixes |= (prefixes & PREFIX_DATA);
13061 break;
13062 case 0:
13063 return;
13064 default:
13065 oappend (INTERNAL_DISASSEMBLER_ERROR);
13066 return;
13068 oappend (names[reg]);
13071 static void
13072 OP_E_memory (int bytemode, int sizeflag)
13074 bfd_vma disp = 0;
13075 int add = (rex & REX_B) ? 8 : 0;
13076 int riprel = 0;
13078 USED_REX (REX_B);
13079 if (intel_syntax)
13080 intel_operand_size (bytemode, sizeflag);
13081 append_seg ();
13083 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
13085 /* 32/64 bit address mode */
13086 int havedisp;
13087 int havesib;
13088 int havebase;
13089 int haveindex;
13090 int needindex;
13091 int base, rbase;
13092 int vindex = 0;
13093 int scale = 0;
13095 havesib = 0;
13096 havebase = 1;
13097 haveindex = 0;
13098 base = modrm.rm;
13100 if (base == 4)
13102 havesib = 1;
13103 vindex = sib.index;
13104 scale = sib.scale;
13105 base = sib.base;
13106 USED_REX (REX_X);
13107 if (rex & REX_X)
13108 vindex += 8;
13109 haveindex = vindex != 4;
13110 codep++;
13112 rbase = base + add;
13114 switch (modrm.mod)
13116 case 0:
13117 if (base == 5)
13119 havebase = 0;
13120 if (address_mode == mode_64bit && !havesib)
13121 riprel = 1;
13122 disp = get32s ();
13124 break;
13125 case 1:
13126 FETCH_DATA (the_info, codep + 1);
13127 disp = *codep++;
13128 if ((disp & 0x80) != 0)
13129 disp -= 0x100;
13130 break;
13131 case 2:
13132 disp = get32s ();
13133 break;
13136 /* In 32bit mode, we need index register to tell [offset] from
13137 [eiz*1 + offset]. */
13138 needindex = (havesib
13139 && !havebase
13140 && !haveindex
13141 && address_mode == mode_32bit);
13142 havedisp = (havebase
13143 || needindex
13144 || (havesib && (haveindex || scale != 0)));
13146 if (!intel_syntax)
13147 if (modrm.mod != 0 || base == 5)
13149 if (havedisp || riprel)
13150 print_displacement (scratchbuf, disp);
13151 else
13152 print_operand_value (scratchbuf, 1, disp);
13153 oappend (scratchbuf);
13154 if (riprel)
13156 set_op (disp, 1);
13157 oappend (sizeflag & AFLAG ? "(%rip)" : "(%eip)");
13161 if (havebase || haveindex || riprel)
13162 used_prefixes |= PREFIX_ADDR;
13164 if (havedisp || (intel_syntax && riprel))
13166 *obufp++ = open_char;
13167 if (intel_syntax && riprel)
13169 set_op (disp, 1);
13170 oappend (sizeflag & AFLAG ? "rip" : "eip");
13172 *obufp = '\0';
13173 if (havebase)
13174 oappend (address_mode == mode_64bit && (sizeflag & AFLAG)
13175 ? names64[rbase] : names32[rbase]);
13176 if (havesib)
13178 /* ESP/RSP won't allow index. If base isn't ESP/RSP,
13179 print index to tell base + index from base. */
13180 if (scale != 0
13181 || needindex
13182 || haveindex
13183 || (havebase && base != ESP_REG_NUM))
13185 if (!intel_syntax || havebase)
13187 *obufp++ = separator_char;
13188 *obufp = '\0';
13190 if (haveindex)
13191 oappend (address_mode == mode_64bit
13192 && (sizeflag & AFLAG)
13193 ? names64[vindex] : names32[vindex]);
13194 else
13195 oappend (address_mode == mode_64bit
13196 && (sizeflag & AFLAG)
13197 ? index64 : index32);
13199 *obufp++ = scale_char;
13200 *obufp = '\0';
13201 sprintf (scratchbuf, "%d", 1 << scale);
13202 oappend (scratchbuf);
13205 if (intel_syntax
13206 && (disp || modrm.mod != 0 || base == 5))
13208 if (!havedisp || (bfd_signed_vma) disp >= 0)
13210 *obufp++ = '+';
13211 *obufp = '\0';
13213 else if (modrm.mod != 1 && disp != -disp)
13215 *obufp++ = '-';
13216 *obufp = '\0';
13217 disp = - (bfd_signed_vma) disp;
13220 if (havedisp)
13221 print_displacement (scratchbuf, disp);
13222 else
13223 print_operand_value (scratchbuf, 1, disp);
13224 oappend (scratchbuf);
13227 *obufp++ = close_char;
13228 *obufp = '\0';
13230 else if (intel_syntax)
13232 if (modrm.mod != 0 || base == 5)
13234 if (prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
13235 | PREFIX_ES | PREFIX_FS | PREFIX_GS))
13237 else
13239 oappend (names_seg[ds_reg - es_reg]);
13240 oappend (":");
13242 print_operand_value (scratchbuf, 1, disp);
13243 oappend (scratchbuf);
13247 else
13249 /* 16 bit address mode */
13250 used_prefixes |= prefixes & PREFIX_ADDR;
13251 switch (modrm.mod)
13253 case 0:
13254 if (modrm.rm == 6)
13256 disp = get16 ();
13257 if ((disp & 0x8000) != 0)
13258 disp -= 0x10000;
13260 break;
13261 case 1:
13262 FETCH_DATA (the_info, codep + 1);
13263 disp = *codep++;
13264 if ((disp & 0x80) != 0)
13265 disp -= 0x100;
13266 break;
13267 case 2:
13268 disp = get16 ();
13269 if ((disp & 0x8000) != 0)
13270 disp -= 0x10000;
13271 break;
13274 if (!intel_syntax)
13275 if (modrm.mod != 0 || modrm.rm == 6)
13277 print_displacement (scratchbuf, disp);
13278 oappend (scratchbuf);
13281 if (modrm.mod != 0 || modrm.rm != 6)
13283 *obufp++ = open_char;
13284 *obufp = '\0';
13285 oappend (index16[modrm.rm]);
13286 if (intel_syntax
13287 && (disp || modrm.mod != 0 || modrm.rm == 6))
13289 if ((bfd_signed_vma) disp >= 0)
13291 *obufp++ = '+';
13292 *obufp = '\0';
13294 else if (modrm.mod != 1)
13296 *obufp++ = '-';
13297 *obufp = '\0';
13298 disp = - (bfd_signed_vma) disp;
13301 print_displacement (scratchbuf, disp);
13302 oappend (scratchbuf);
13305 *obufp++ = close_char;
13306 *obufp = '\0';
13308 else if (intel_syntax)
13310 if (prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
13311 | PREFIX_ES | PREFIX_FS | PREFIX_GS))
13313 else
13315 oappend (names_seg[ds_reg - es_reg]);
13316 oappend (":");
13318 print_operand_value (scratchbuf, 1, disp & 0xffff);
13319 oappend (scratchbuf);
13324 static void
13325 OP_E (int bytemode, int sizeflag)
13327 /* Skip mod/rm byte. */
13328 MODRM_CHECK;
13329 codep++;
13331 if (modrm.mod == 3)
13332 OP_E_register (bytemode, sizeflag);
13333 else
13334 OP_E_memory (bytemode, sizeflag);
13337 static void
13338 OP_G (int bytemode, int sizeflag)
13340 int add = 0;
13341 USED_REX (REX_R);
13342 if (rex & REX_R)
13343 add += 8;
13344 switch (bytemode)
13346 case b_mode:
13347 USED_REX (0);
13348 if (rex)
13349 oappend (names8rex[modrm.reg + add]);
13350 else
13351 oappend (names8[modrm.reg + add]);
13352 break;
13353 case w_mode:
13354 oappend (names16[modrm.reg + add]);
13355 break;
13356 case d_mode:
13357 oappend (names32[modrm.reg + add]);
13358 break;
13359 case q_mode:
13360 oappend (names64[modrm.reg + add]);
13361 break;
13362 case v_mode:
13363 case dq_mode:
13364 case dqb_mode:
13365 case dqd_mode:
13366 case dqw_mode:
13367 USED_REX (REX_W);
13368 if (rex & REX_W)
13369 oappend (names64[modrm.reg + add]);
13370 else
13372 if ((sizeflag & DFLAG) || bytemode != v_mode)
13373 oappend (names32[modrm.reg + add]);
13374 else
13375 oappend (names16[modrm.reg + add]);
13376 used_prefixes |= (prefixes & PREFIX_DATA);
13378 break;
13379 case m_mode:
13380 if (address_mode == mode_64bit)
13381 oappend (names64[modrm.reg + add]);
13382 else
13383 oappend (names32[modrm.reg + add]);
13384 break;
13385 default:
13386 oappend (INTERNAL_DISASSEMBLER_ERROR);
13387 break;
13391 static bfd_vma
13392 get64 (void)
13394 bfd_vma x;
13395 #ifdef BFD64
13396 unsigned int a;
13397 unsigned int b;
13399 FETCH_DATA (the_info, codep + 8);
13400 a = *codep++ & 0xff;
13401 a |= (*codep++ & 0xff) << 8;
13402 a |= (*codep++ & 0xff) << 16;
13403 a |= (*codep++ & 0xff) << 24;
13404 b = *codep++ & 0xff;
13405 b |= (*codep++ & 0xff) << 8;
13406 b |= (*codep++ & 0xff) << 16;
13407 b |= (*codep++ & 0xff) << 24;
13408 x = a + ((bfd_vma) b << 32);
13409 #else
13410 abort ();
13411 x = 0;
13412 #endif
13413 return x;
13416 static bfd_signed_vma
13417 get32 (void)
13419 bfd_signed_vma x = 0;
13421 FETCH_DATA (the_info, codep + 4);
13422 x = *codep++ & (bfd_signed_vma) 0xff;
13423 x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
13424 x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
13425 x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
13426 return x;
13429 static bfd_signed_vma
13430 get32s (void)
13432 bfd_signed_vma x = 0;
13434 FETCH_DATA (the_info, codep + 4);
13435 x = *codep++ & (bfd_signed_vma) 0xff;
13436 x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
13437 x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
13438 x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
13440 x = (x ^ ((bfd_signed_vma) 1 << 31)) - ((bfd_signed_vma) 1 << 31);
13442 return x;
13445 static int
13446 get16 (void)
13448 int x = 0;
13450 FETCH_DATA (the_info, codep + 2);
13451 x = *codep++ & 0xff;
13452 x |= (*codep++ & 0xff) << 8;
13453 return x;
13456 static void
13457 set_op (bfd_vma op, int riprel)
13459 op_index[op_ad] = op_ad;
13460 if (address_mode == mode_64bit)
13462 op_address[op_ad] = op;
13463 op_riprel[op_ad] = riprel;
13465 else
13467 /* Mask to get a 32-bit address. */
13468 op_address[op_ad] = op & 0xffffffff;
13469 op_riprel[op_ad] = riprel & 0xffffffff;
13473 static void
13474 OP_REG (int code, int sizeflag)
13476 const char *s;
13477 int add;
13478 USED_REX (REX_B);
13479 if (rex & REX_B)
13480 add = 8;
13481 else
13482 add = 0;
13484 switch (code)
13486 case ax_reg: case cx_reg: case dx_reg: case bx_reg:
13487 case sp_reg: case bp_reg: case si_reg: case di_reg:
13488 s = names16[code - ax_reg + add];
13489 break;
13490 case es_reg: case ss_reg: case cs_reg:
13491 case ds_reg: case fs_reg: case gs_reg:
13492 s = names_seg[code - es_reg + add];
13493 break;
13494 case al_reg: case ah_reg: case cl_reg: case ch_reg:
13495 case dl_reg: case dh_reg: case bl_reg: case bh_reg:
13496 USED_REX (0);
13497 if (rex)
13498 s = names8rex[code - al_reg + add];
13499 else
13500 s = names8[code - al_reg];
13501 break;
13502 case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
13503 case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
13504 if (address_mode == mode_64bit && (sizeflag & DFLAG))
13506 s = names64[code - rAX_reg + add];
13507 break;
13509 code += eAX_reg - rAX_reg;
13510 /* Fall through. */
13511 case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
13512 case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
13513 USED_REX (REX_W);
13514 if (rex & REX_W)
13515 s = names64[code - eAX_reg + add];
13516 else
13518 if (sizeflag & DFLAG)
13519 s = names32[code - eAX_reg + add];
13520 else
13521 s = names16[code - eAX_reg + add];
13522 used_prefixes |= (prefixes & PREFIX_DATA);
13524 break;
13525 default:
13526 s = INTERNAL_DISASSEMBLER_ERROR;
13527 break;
13529 oappend (s);
13532 static void
13533 OP_IMREG (int code, int sizeflag)
13535 const char *s;
13537 switch (code)
13539 case indir_dx_reg:
13540 if (intel_syntax)
13541 s = "dx";
13542 else
13543 s = "(%dx)";
13544 break;
13545 case ax_reg: case cx_reg: case dx_reg: case bx_reg:
13546 case sp_reg: case bp_reg: case si_reg: case di_reg:
13547 s = names16[code - ax_reg];
13548 break;
13549 case es_reg: case ss_reg: case cs_reg:
13550 case ds_reg: case fs_reg: case gs_reg:
13551 s = names_seg[code - es_reg];
13552 break;
13553 case al_reg: case ah_reg: case cl_reg: case ch_reg:
13554 case dl_reg: case dh_reg: case bl_reg: case bh_reg:
13555 USED_REX (0);
13556 if (rex)
13557 s = names8rex[code - al_reg];
13558 else
13559 s = names8[code - al_reg];
13560 break;
13561 case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
13562 case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
13563 USED_REX (REX_W);
13564 if (rex & REX_W)
13565 s = names64[code - eAX_reg];
13566 else
13568 if (sizeflag & DFLAG)
13569 s = names32[code - eAX_reg];
13570 else
13571 s = names16[code - eAX_reg];
13572 used_prefixes |= (prefixes & PREFIX_DATA);
13574 break;
13575 case z_mode_ax_reg:
13576 if ((rex & REX_W) || (sizeflag & DFLAG))
13577 s = *names32;
13578 else
13579 s = *names16;
13580 if (!(rex & REX_W))
13581 used_prefixes |= (prefixes & PREFIX_DATA);
13582 break;
13583 default:
13584 s = INTERNAL_DISASSEMBLER_ERROR;
13585 break;
13587 oappend (s);
13590 static void
13591 OP_I (int bytemode, int sizeflag)
13593 bfd_signed_vma op;
13594 bfd_signed_vma mask = -1;
13596 switch (bytemode)
13598 case b_mode:
13599 FETCH_DATA (the_info, codep + 1);
13600 op = *codep++;
13601 mask = 0xff;
13602 break;
13603 case q_mode:
13604 if (address_mode == mode_64bit)
13606 op = get32s ();
13607 break;
13609 /* Fall through. */
13610 case v_mode:
13611 USED_REX (REX_W);
13612 if (rex & REX_W)
13613 op = get32s ();
13614 else
13616 if (sizeflag & DFLAG)
13618 op = get32 ();
13619 mask = 0xffffffff;
13621 else
13623 op = get16 ();
13624 mask = 0xfffff;
13626 used_prefixes |= (prefixes & PREFIX_DATA);
13628 break;
13629 case w_mode:
13630 mask = 0xfffff;
13631 op = get16 ();
13632 break;
13633 case const_1_mode:
13634 if (intel_syntax)
13635 oappend ("1");
13636 return;
13637 default:
13638 oappend (INTERNAL_DISASSEMBLER_ERROR);
13639 return;
13642 op &= mask;
13643 scratchbuf[0] = '$';
13644 print_operand_value (scratchbuf + 1, 1, op);
13645 oappend (scratchbuf + intel_syntax);
13646 scratchbuf[0] = '\0';
13649 static void
13650 OP_I64 (int bytemode, int sizeflag)
13652 bfd_signed_vma op;
13653 bfd_signed_vma mask = -1;
13655 if (address_mode != mode_64bit)
13657 OP_I (bytemode, sizeflag);
13658 return;
13661 switch (bytemode)
13663 case b_mode:
13664 FETCH_DATA (the_info, codep + 1);
13665 op = *codep++;
13666 mask = 0xff;
13667 break;
13668 case v_mode:
13669 USED_REX (REX_W);
13670 if (rex & REX_W)
13671 op = get64 ();
13672 else
13674 if (sizeflag & DFLAG)
13676 op = get32 ();
13677 mask = 0xffffffff;
13679 else
13681 op = get16 ();
13682 mask = 0xfffff;
13684 used_prefixes |= (prefixes & PREFIX_DATA);
13686 break;
13687 case w_mode:
13688 mask = 0xfffff;
13689 op = get16 ();
13690 break;
13691 default:
13692 oappend (INTERNAL_DISASSEMBLER_ERROR);
13693 return;
13696 op &= mask;
13697 scratchbuf[0] = '$';
13698 print_operand_value (scratchbuf + 1, 1, op);
13699 oappend (scratchbuf + intel_syntax);
13700 scratchbuf[0] = '\0';
13703 static void
13704 OP_sI (int bytemode, int sizeflag)
13706 bfd_signed_vma op;
13708 switch (bytemode)
13710 case b_mode:
13711 FETCH_DATA (the_info, codep + 1);
13712 op = *codep++;
13713 if ((op & 0x80) != 0)
13714 op -= 0x100;
13715 break;
13716 case v_mode:
13717 if (sizeflag & DFLAG)
13718 op = get32s ();
13719 else
13720 op = get16 ();
13721 break;
13722 default:
13723 oappend (INTERNAL_DISASSEMBLER_ERROR);
13724 return;
13727 scratchbuf[0] = '$';
13728 print_operand_value (scratchbuf + 1, 1, op);
13729 oappend (scratchbuf + intel_syntax);
13732 static void
13733 OP_J (int bytemode, int sizeflag)
13735 bfd_vma disp;
13736 bfd_vma mask = -1;
13737 bfd_vma segment = 0;
13739 switch (bytemode)
13741 case b_mode:
13742 FETCH_DATA (the_info, codep + 1);
13743 disp = *codep++;
13744 if ((disp & 0x80) != 0)
13745 disp -= 0x100;
13746 break;
13747 case v_mode:
13748 USED_REX (REX_W);
13749 if ((sizeflag & DFLAG) || (rex & REX_W))
13750 disp = get32s ();
13751 else
13753 disp = get16 ();
13754 if ((disp & 0x8000) != 0)
13755 disp -= 0x10000;
13756 /* In 16bit mode, address is wrapped around at 64k within
13757 the same segment. Otherwise, a data16 prefix on a jump
13758 instruction means that the pc is masked to 16 bits after
13759 the displacement is added! */
13760 mask = 0xffff;
13761 if ((prefixes & PREFIX_DATA) == 0)
13762 segment = ((start_pc + codep - start_codep)
13763 & ~((bfd_vma) 0xffff));
13765 if (!(rex & REX_W))
13766 used_prefixes |= (prefixes & PREFIX_DATA);
13767 break;
13768 default:
13769 oappend (INTERNAL_DISASSEMBLER_ERROR);
13770 return;
13772 disp = ((start_pc + codep - start_codep + disp) & mask) | segment;
13773 set_op (disp, 0);
13774 print_operand_value (scratchbuf, 1, disp);
13775 oappend (scratchbuf);
13778 static void
13779 OP_SEG (int bytemode, int sizeflag)
13781 if (bytemode == w_mode)
13782 oappend (names_seg[modrm.reg]);
13783 else
13784 OP_E (modrm.mod == 3 ? bytemode : w_mode, sizeflag);
13787 static void
13788 OP_DIR (int dummy ATTRIBUTE_UNUSED, int sizeflag)
13790 int seg, offset;
13792 if (sizeflag & DFLAG)
13794 offset = get32 ();
13795 seg = get16 ();
13797 else
13799 offset = get16 ();
13800 seg = get16 ();
13802 used_prefixes |= (prefixes & PREFIX_DATA);
13803 if (intel_syntax)
13804 sprintf (scratchbuf, "0x%x:0x%x", seg, offset);
13805 else
13806 sprintf (scratchbuf, "$0x%x,$0x%x", seg, offset);
13807 oappend (scratchbuf);
13810 static void
13811 OP_OFF (int bytemode, int sizeflag)
13813 bfd_vma off;
13815 if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
13816 intel_operand_size (bytemode, sizeflag);
13817 append_seg ();
13819 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
13820 off = get32 ();
13821 else
13822 off = get16 ();
13824 if (intel_syntax)
13826 if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
13827 | PREFIX_ES | PREFIX_FS | PREFIX_GS)))
13829 oappend (names_seg[ds_reg - es_reg]);
13830 oappend (":");
13833 print_operand_value (scratchbuf, 1, off);
13834 oappend (scratchbuf);
13837 static void
13838 OP_OFF64 (int bytemode, int sizeflag)
13840 bfd_vma off;
13842 if (address_mode != mode_64bit
13843 || (prefixes & PREFIX_ADDR))
13845 OP_OFF (bytemode, sizeflag);
13846 return;
13849 if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
13850 intel_operand_size (bytemode, sizeflag);
13851 append_seg ();
13853 off = get64 ();
13855 if (intel_syntax)
13857 if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
13858 | PREFIX_ES | PREFIX_FS | PREFIX_GS)))
13860 oappend (names_seg[ds_reg - es_reg]);
13861 oappend (":");
13864 print_operand_value (scratchbuf, 1, off);
13865 oappend (scratchbuf);
13868 static void
13869 ptr_reg (int code, int sizeflag)
13871 const char *s;
13873 *obufp++ = open_char;
13874 used_prefixes |= (prefixes & PREFIX_ADDR);
13875 if (address_mode == mode_64bit)
13877 if (!(sizeflag & AFLAG))
13878 s = names32[code - eAX_reg];
13879 else
13880 s = names64[code - eAX_reg];
13882 else if (sizeflag & AFLAG)
13883 s = names32[code - eAX_reg];
13884 else
13885 s = names16[code - eAX_reg];
13886 oappend (s);
13887 *obufp++ = close_char;
13888 *obufp = 0;
13891 static void
13892 OP_ESreg (int code, int sizeflag)
13894 if (intel_syntax)
13896 switch (codep[-1])
13898 case 0x6d: /* insw/insl */
13899 intel_operand_size (z_mode, sizeflag);
13900 break;
13901 case 0xa5: /* movsw/movsl/movsq */
13902 case 0xa7: /* cmpsw/cmpsl/cmpsq */
13903 case 0xab: /* stosw/stosl */
13904 case 0xaf: /* scasw/scasl */
13905 intel_operand_size (v_mode, sizeflag);
13906 break;
13907 default:
13908 intel_operand_size (b_mode, sizeflag);
13911 oappend ("%es:" + intel_syntax);
13912 ptr_reg (code, sizeflag);
13915 static void
13916 OP_DSreg (int code, int sizeflag)
13918 if (intel_syntax)
13920 switch (codep[-1])
13922 case 0x6f: /* outsw/outsl */
13923 intel_operand_size (z_mode, sizeflag);
13924 break;
13925 case 0xa5: /* movsw/movsl/movsq */
13926 case 0xa7: /* cmpsw/cmpsl/cmpsq */
13927 case 0xad: /* lodsw/lodsl/lodsq */
13928 intel_operand_size (v_mode, sizeflag);
13929 break;
13930 default:
13931 intel_operand_size (b_mode, sizeflag);
13934 if ((prefixes
13935 & (PREFIX_CS
13936 | PREFIX_DS
13937 | PREFIX_SS
13938 | PREFIX_ES
13939 | PREFIX_FS
13940 | PREFIX_GS)) == 0)
13941 prefixes |= PREFIX_DS;
13942 append_seg ();
13943 ptr_reg (code, sizeflag);
13946 static void
13947 OP_C (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13949 int add;
13950 if (rex & REX_R)
13952 USED_REX (REX_R);
13953 add = 8;
13955 else if (address_mode != mode_64bit && (prefixes & PREFIX_LOCK))
13957 all_prefixes[last_lock_prefix] = 0;
13958 used_prefixes |= PREFIX_LOCK;
13959 add = 8;
13961 else
13962 add = 0;
13963 sprintf (scratchbuf, "%%cr%d", modrm.reg + add);
13964 oappend (scratchbuf + intel_syntax);
13967 static void
13968 OP_D (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13970 int add;
13971 USED_REX (REX_R);
13972 if (rex & REX_R)
13973 add = 8;
13974 else
13975 add = 0;
13976 if (intel_syntax)
13977 sprintf (scratchbuf, "db%d", modrm.reg + add);
13978 else
13979 sprintf (scratchbuf, "%%db%d", modrm.reg + add);
13980 oappend (scratchbuf);
13983 static void
13984 OP_T (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13986 sprintf (scratchbuf, "%%tr%d", modrm.reg);
13987 oappend (scratchbuf + intel_syntax);
13990 static void
13991 OP_R (int bytemode, int sizeflag)
13993 if (modrm.mod == 3)
13994 OP_E (bytemode, sizeflag);
13995 else
13996 BadOp ();
13999 static void
14000 OP_MMX (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
14002 int reg = modrm.reg;
14003 const char **names;
14005 used_prefixes |= (prefixes & PREFIX_DATA);
14006 if (prefixes & PREFIX_DATA)
14008 names = names_xmm;
14009 USED_REX (REX_R);
14010 if (rex & REX_R)
14011 reg += 8;
14013 else
14014 names = names_mm;
14015 oappend (names[reg]);
14018 static void
14019 OP_XMM (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
14021 int reg = modrm.reg;
14022 const char **names;
14024 USED_REX (REX_R);
14025 if (rex & REX_R)
14026 reg += 8;
14027 if (need_vex
14028 && bytemode != xmm_mode
14029 && bytemode != scalar_mode)
14031 switch (vex.length)
14033 case 128:
14034 names = names_xmm;
14035 break;
14036 case 256:
14037 names = names_ymm;
14038 break;
14039 default:
14040 abort ();
14043 else
14044 names = names_xmm;
14045 oappend (names[reg]);
14048 static void
14049 OP_EM (int bytemode, int sizeflag)
14051 int reg;
14052 const char **names;
14054 if (modrm.mod != 3)
14056 if (intel_syntax
14057 && (bytemode == v_mode || bytemode == v_swap_mode))
14059 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
14060 used_prefixes |= (prefixes & PREFIX_DATA);
14062 OP_E (bytemode, sizeflag);
14063 return;
14066 if ((sizeflag & SUFFIX_ALWAYS) && bytemode == v_swap_mode)
14067 swap_operand ();
14069 /* Skip mod/rm byte. */
14070 MODRM_CHECK;
14071 codep++;
14072 used_prefixes |= (prefixes & PREFIX_DATA);
14073 reg = modrm.rm;
14074 if (prefixes & PREFIX_DATA)
14076 names = names_xmm;
14077 USED_REX (REX_B);
14078 if (rex & REX_B)
14079 reg += 8;
14081 else
14082 names = names_mm;
14083 oappend (names[reg]);
14086 /* cvt* are the only instructions in sse2 which have
14087 both SSE and MMX operands and also have 0x66 prefix
14088 in their opcode. 0x66 was originally used to differentiate
14089 between SSE and MMX instruction(operands). So we have to handle the
14090 cvt* separately using OP_EMC and OP_MXC */
14091 static void
14092 OP_EMC (int bytemode, int sizeflag)
14094 if (modrm.mod != 3)
14096 if (intel_syntax && bytemode == v_mode)
14098 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
14099 used_prefixes |= (prefixes & PREFIX_DATA);
14101 OP_E (bytemode, sizeflag);
14102 return;
14105 /* Skip mod/rm byte. */
14106 MODRM_CHECK;
14107 codep++;
14108 used_prefixes |= (prefixes & PREFIX_DATA);
14109 oappend (names_mm[modrm.rm]);
14112 static void
14113 OP_MXC (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
14115 used_prefixes |= (prefixes & PREFIX_DATA);
14116 oappend (names_mm[modrm.reg]);
14119 static void
14120 OP_EX (int bytemode, int sizeflag)
14122 int reg;
14123 const char **names;
14125 /* Skip mod/rm byte. */
14126 MODRM_CHECK;
14127 codep++;
14129 if (modrm.mod != 3)
14131 OP_E_memory (bytemode, sizeflag);
14132 return;
14135 reg = modrm.rm;
14136 USED_REX (REX_B);
14137 if (rex & REX_B)
14138 reg += 8;
14140 if ((sizeflag & SUFFIX_ALWAYS)
14141 && (bytemode == x_swap_mode
14142 || bytemode == d_swap_mode
14143 || bytemode == d_scalar_swap_mode
14144 || bytemode == q_swap_mode
14145 || bytemode == q_scalar_swap_mode))
14146 swap_operand ();
14148 if (need_vex
14149 && bytemode != xmm_mode
14150 && bytemode != xmmq_mode
14151 && bytemode != d_scalar_mode
14152 && bytemode != d_scalar_swap_mode
14153 && bytemode != q_scalar_mode
14154 && bytemode != q_scalar_swap_mode
14155 && bytemode != vex_scalar_w_dq_mode)
14157 switch (vex.length)
14159 case 128:
14160 names = names_xmm;
14161 break;
14162 case 256:
14163 names = names_ymm;
14164 break;
14165 default:
14166 abort ();
14169 else
14170 names = names_xmm;
14171 oappend (names[reg]);
14174 static void
14175 OP_MS (int bytemode, int sizeflag)
14177 if (modrm.mod == 3)
14178 OP_EM (bytemode, sizeflag);
14179 else
14180 BadOp ();
14183 static void
14184 OP_XS (int bytemode, int sizeflag)
14186 if (modrm.mod == 3)
14187 OP_EX (bytemode, sizeflag);
14188 else
14189 BadOp ();
14192 static void
14193 OP_M (int bytemode, int sizeflag)
14195 if (modrm.mod == 3)
14196 /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
14197 BadOp ();
14198 else
14199 OP_E (bytemode, sizeflag);
14202 static void
14203 OP_0f07 (int bytemode, int sizeflag)
14205 if (modrm.mod != 3 || modrm.rm != 0)
14206 BadOp ();
14207 else
14208 OP_E (bytemode, sizeflag);
14211 /* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
14212 32bit mode and "xchg %rax,%rax" in 64bit mode. */
14214 static void
14215 NOP_Fixup1 (int bytemode, int sizeflag)
14217 if ((prefixes & PREFIX_DATA) != 0
14218 || (rex != 0
14219 && rex != 0x48
14220 && address_mode == mode_64bit))
14221 OP_REG (bytemode, sizeflag);
14222 else
14223 strcpy (obuf, "nop");
14226 static void
14227 NOP_Fixup2 (int bytemode, int sizeflag)
14229 if ((prefixes & PREFIX_DATA) != 0
14230 || (rex != 0
14231 && rex != 0x48
14232 && address_mode == mode_64bit))
14233 OP_IMREG (bytemode, sizeflag);
14236 static const char *const Suffix3DNow[] = {
14237 /* 00 */ NULL, NULL, NULL, NULL,
14238 /* 04 */ NULL, NULL, NULL, NULL,
14239 /* 08 */ NULL, NULL, NULL, NULL,
14240 /* 0C */ "pi2fw", "pi2fd", NULL, NULL,
14241 /* 10 */ NULL, NULL, NULL, NULL,
14242 /* 14 */ NULL, NULL, NULL, NULL,
14243 /* 18 */ NULL, NULL, NULL, NULL,
14244 /* 1C */ "pf2iw", "pf2id", NULL, NULL,
14245 /* 20 */ NULL, NULL, NULL, NULL,
14246 /* 24 */ NULL, NULL, NULL, NULL,
14247 /* 28 */ NULL, NULL, NULL, NULL,
14248 /* 2C */ NULL, NULL, NULL, NULL,
14249 /* 30 */ NULL, NULL, NULL, NULL,
14250 /* 34 */ NULL, NULL, NULL, NULL,
14251 /* 38 */ NULL, NULL, NULL, NULL,
14252 /* 3C */ NULL, NULL, NULL, NULL,
14253 /* 40 */ NULL, NULL, NULL, NULL,
14254 /* 44 */ NULL, NULL, NULL, NULL,
14255 /* 48 */ NULL, NULL, NULL, NULL,
14256 /* 4C */ NULL, NULL, NULL, NULL,
14257 /* 50 */ NULL, NULL, NULL, NULL,
14258 /* 54 */ NULL, NULL, NULL, NULL,
14259 /* 58 */ NULL, NULL, NULL, NULL,
14260 /* 5C */ NULL, NULL, NULL, NULL,
14261 /* 60 */ NULL, NULL, NULL, NULL,
14262 /* 64 */ NULL, NULL, NULL, NULL,
14263 /* 68 */ NULL, NULL, NULL, NULL,
14264 /* 6C */ NULL, NULL, NULL, NULL,
14265 /* 70 */ NULL, NULL, NULL, NULL,
14266 /* 74 */ NULL, NULL, NULL, NULL,
14267 /* 78 */ NULL, NULL, NULL, NULL,
14268 /* 7C */ NULL, NULL, NULL, NULL,
14269 /* 80 */ NULL, NULL, NULL, NULL,
14270 /* 84 */ NULL, NULL, NULL, NULL,
14271 /* 88 */ NULL, NULL, "pfnacc", NULL,
14272 /* 8C */ NULL, NULL, "pfpnacc", NULL,
14273 /* 90 */ "pfcmpge", NULL, NULL, NULL,
14274 /* 94 */ "pfmin", NULL, "pfrcp", "pfrsqrt",
14275 /* 98 */ NULL, NULL, "pfsub", NULL,
14276 /* 9C */ NULL, NULL, "pfadd", NULL,
14277 /* A0 */ "pfcmpgt", NULL, NULL, NULL,
14278 /* A4 */ "pfmax", NULL, "pfrcpit1", "pfrsqit1",
14279 /* A8 */ NULL, NULL, "pfsubr", NULL,
14280 /* AC */ NULL, NULL, "pfacc", NULL,
14281 /* B0 */ "pfcmpeq", NULL, NULL, NULL,
14282 /* B4 */ "pfmul", NULL, "pfrcpit2", "pmulhrw",
14283 /* B8 */ NULL, NULL, NULL, "pswapd",
14284 /* BC */ NULL, NULL, NULL, "pavgusb",
14285 /* C0 */ NULL, NULL, NULL, NULL,
14286 /* C4 */ NULL, NULL, NULL, NULL,
14287 /* C8 */ NULL, NULL, NULL, NULL,
14288 /* CC */ NULL, NULL, NULL, NULL,
14289 /* D0 */ NULL, NULL, NULL, NULL,
14290 /* D4 */ NULL, NULL, NULL, NULL,
14291 /* D8 */ NULL, NULL, NULL, NULL,
14292 /* DC */ NULL, NULL, NULL, NULL,
14293 /* E0 */ NULL, NULL, NULL, NULL,
14294 /* E4 */ NULL, NULL, NULL, NULL,
14295 /* E8 */ NULL, NULL, NULL, NULL,
14296 /* EC */ NULL, NULL, NULL, NULL,
14297 /* F0 */ NULL, NULL, NULL, NULL,
14298 /* F4 */ NULL, NULL, NULL, NULL,
14299 /* F8 */ NULL, NULL, NULL, NULL,
14300 /* FC */ NULL, NULL, NULL, NULL,
14303 static void
14304 OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
14306 const char *mnemonic;
14308 FETCH_DATA (the_info, codep + 1);
14309 /* AMD 3DNow! instructions are specified by an opcode suffix in the
14310 place where an 8-bit immediate would normally go. ie. the last
14311 byte of the instruction. */
14312 obufp = mnemonicendp;
14313 mnemonic = Suffix3DNow[*codep++ & 0xff];
14314 if (mnemonic)
14315 oappend (mnemonic);
14316 else
14318 /* Since a variable sized modrm/sib chunk is between the start
14319 of the opcode (0x0f0f) and the opcode suffix, we need to do
14320 all the modrm processing first, and don't know until now that
14321 we have a bad opcode. This necessitates some cleaning up. */
14322 op_out[0][0] = '\0';
14323 op_out[1][0] = '\0';
14324 BadOp ();
14326 mnemonicendp = obufp;
14329 static struct op simd_cmp_op[] =
14331 { STRING_COMMA_LEN ("eq") },
14332 { STRING_COMMA_LEN ("lt") },
14333 { STRING_COMMA_LEN ("le") },
14334 { STRING_COMMA_LEN ("unord") },
14335 { STRING_COMMA_LEN ("neq") },
14336 { STRING_COMMA_LEN ("nlt") },
14337 { STRING_COMMA_LEN ("nle") },
14338 { STRING_COMMA_LEN ("ord") }
14341 static void
14342 CMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
14344 unsigned int cmp_type;
14346 FETCH_DATA (the_info, codep + 1);
14347 cmp_type = *codep++ & 0xff;
14348 if (cmp_type < ARRAY_SIZE (simd_cmp_op))
14350 char suffix [3];
14351 char *p = mnemonicendp - 2;
14352 suffix[0] = p[0];
14353 suffix[1] = p[1];
14354 suffix[2] = '\0';
14355 sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
14356 mnemonicendp += simd_cmp_op[cmp_type].len;
14358 else
14360 /* We have a reserved extension byte. Output it directly. */
14361 scratchbuf[0] = '$';
14362 print_operand_value (scratchbuf + 1, 1, cmp_type);
14363 oappend (scratchbuf + intel_syntax);
14364 scratchbuf[0] = '\0';
14368 static void
14369 OP_Mwait (int bytemode ATTRIBUTE_UNUSED,
14370 int sizeflag ATTRIBUTE_UNUSED)
14372 /* mwait %eax,%ecx */
14373 if (!intel_syntax)
14375 const char **names = (address_mode == mode_64bit
14376 ? names64 : names32);
14377 strcpy (op_out[0], names[0]);
14378 strcpy (op_out[1], names[1]);
14379 two_source_ops = 1;
14381 /* Skip mod/rm byte. */
14382 MODRM_CHECK;
14383 codep++;
14386 static void
14387 OP_Monitor (int bytemode ATTRIBUTE_UNUSED,
14388 int sizeflag ATTRIBUTE_UNUSED)
14390 /* monitor %eax,%ecx,%edx" */
14391 if (!intel_syntax)
14393 const char **op1_names;
14394 const char **names = (address_mode == mode_64bit
14395 ? names64 : names32);
14397 if (!(prefixes & PREFIX_ADDR))
14398 op1_names = (address_mode == mode_16bit
14399 ? names16 : names);
14400 else
14402 /* Remove "addr16/addr32". */
14403 all_prefixes[last_addr_prefix] = 0;
14404 op1_names = (address_mode != mode_32bit
14405 ? names32 : names16);
14406 used_prefixes |= PREFIX_ADDR;
14408 strcpy (op_out[0], op1_names[0]);
14409 strcpy (op_out[1], names[1]);
14410 strcpy (op_out[2], names[2]);
14411 two_source_ops = 1;
14413 /* Skip mod/rm byte. */
14414 MODRM_CHECK;
14415 codep++;
14418 static void
14419 BadOp (void)
14421 /* Throw away prefixes and 1st. opcode byte. */
14422 codep = insn_codep + 1;
14423 oappend ("(bad)");
14426 static void
14427 REP_Fixup (int bytemode, int sizeflag)
14429 /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
14430 lods and stos. */
14431 if (prefixes & PREFIX_REPZ)
14432 all_prefixes[last_repz_prefix] = REP_PREFIX;
14434 switch (bytemode)
14436 case al_reg:
14437 case eAX_reg:
14438 case indir_dx_reg:
14439 OP_IMREG (bytemode, sizeflag);
14440 break;
14441 case eDI_reg:
14442 OP_ESreg (bytemode, sizeflag);
14443 break;
14444 case eSI_reg:
14445 OP_DSreg (bytemode, sizeflag);
14446 break;
14447 default:
14448 abort ();
14449 break;
14453 static void
14454 CMPXCHG8B_Fixup (int bytemode, int sizeflag)
14456 USED_REX (REX_W);
14457 if (rex & REX_W)
14459 /* Change cmpxchg8b to cmpxchg16b. */
14460 char *p = mnemonicendp - 2;
14461 mnemonicendp = stpcpy (p, "16b");
14462 bytemode = o_mode;
14464 OP_M (bytemode, sizeflag);
14467 static void
14468 XMM_Fixup (int reg, int sizeflag ATTRIBUTE_UNUSED)
14470 const char **names;
14472 if (need_vex)
14474 switch (vex.length)
14476 case 128:
14477 names = names_xmm;
14478 break;
14479 case 256:
14480 names = names_ymm;
14481 break;
14482 default:
14483 abort ();
14486 else
14487 names = names_xmm;
14488 oappend (names[reg]);
14491 static void
14492 CRC32_Fixup (int bytemode, int sizeflag)
14494 /* Add proper suffix to "crc32". */
14495 char *p = mnemonicendp;
14497 switch (bytemode)
14499 case b_mode:
14500 if (intel_syntax)
14501 goto skip;
14503 *p++ = 'b';
14504 break;
14505 case v_mode:
14506 if (intel_syntax)
14507 goto skip;
14509 USED_REX (REX_W);
14510 if (rex & REX_W)
14511 *p++ = 'q';
14512 else
14514 if (sizeflag & DFLAG)
14515 *p++ = 'l';
14516 else
14517 *p++ = 'w';
14518 used_prefixes |= (prefixes & PREFIX_DATA);
14520 break;
14521 default:
14522 oappend (INTERNAL_DISASSEMBLER_ERROR);
14523 break;
14525 mnemonicendp = p;
14526 *p = '\0';
14528 skip:
14529 if (modrm.mod == 3)
14531 int add;
14533 /* Skip mod/rm byte. */
14534 MODRM_CHECK;
14535 codep++;
14537 USED_REX (REX_B);
14538 add = (rex & REX_B) ? 8 : 0;
14539 if (bytemode == b_mode)
14541 USED_REX (0);
14542 if (rex)
14543 oappend (names8rex[modrm.rm + add]);
14544 else
14545 oappend (names8[modrm.rm + add]);
14547 else
14549 USED_REX (REX_W);
14550 if (rex & REX_W)
14551 oappend (names64[modrm.rm + add]);
14552 else if ((prefixes & PREFIX_DATA))
14553 oappend (names16[modrm.rm + add]);
14554 else
14555 oappend (names32[modrm.rm + add]);
14558 else
14559 OP_E (bytemode, sizeflag);
14562 static void
14563 FXSAVE_Fixup (int bytemode, int sizeflag)
14565 /* Add proper suffix to "fxsave" and "fxrstor". */
14566 USED_REX (REX_W);
14567 if (rex & REX_W)
14569 char *p = mnemonicendp;
14570 *p++ = '6';
14571 *p++ = '4';
14572 *p = '\0';
14573 mnemonicendp = p;
14575 OP_M (bytemode, sizeflag);
14578 /* Display the destination register operand for instructions with
14579 VEX. */
14581 static void
14582 OP_VEX (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
14584 int reg;
14585 const char **names;
14587 if (!need_vex)
14588 abort ();
14590 if (!need_vex_reg)
14591 return;
14593 reg = vex.register_specifier;
14594 if (bytemode == vex_scalar_mode)
14596 oappend (names_xmm[reg]);
14597 return;
14600 switch (vex.length)
14602 case 128:
14603 switch (bytemode)
14605 case vex_mode:
14606 case vex128_mode:
14607 names = names_xmm;
14608 break;
14609 case dq_mode:
14610 if (vex.w)
14611 names = names64;
14612 else
14613 names = names32;
14614 break;
14615 default:
14616 abort ();
14617 return;
14619 break;
14620 case 256:
14621 switch (bytemode)
14623 case vex_mode:
14624 case vex256_mode:
14625 break;
14626 default:
14627 abort ();
14628 return;
14631 names = names_ymm;
14632 break;
14633 default:
14634 abort ();
14635 break;
14637 oappend (names[reg]);
14640 /* Get the VEX immediate byte without moving codep. */
14642 static unsigned char
14643 get_vex_imm8 (int sizeflag, int opnum)
14645 int bytes_before_imm = 0;
14647 if (modrm.mod != 3)
14649 /* There are SIB/displacement bytes. */
14650 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
14652 /* 32/64 bit address mode */
14653 int base = modrm.rm;
14655 /* Check SIB byte. */
14656 if (base == 4)
14658 FETCH_DATA (the_info, codep + 1);
14659 base = *codep & 7;
14660 /* When decoding the third source, don't increase
14661 bytes_before_imm as this has already been incremented
14662 by one in OP_E_memory while decoding the second
14663 source operand. */
14664 if (opnum == 0)
14665 bytes_before_imm++;
14668 /* Don't increase bytes_before_imm when decoding the third source,
14669 it has already been incremented by OP_E_memory while decoding
14670 the second source operand. */
14671 if (opnum == 0)
14673 switch (modrm.mod)
14675 case 0:
14676 /* When modrm.rm == 5 or modrm.rm == 4 and base in
14677 SIB == 5, there is a 4 byte displacement. */
14678 if (base != 5)
14679 /* No displacement. */
14680 break;
14681 case 2:
14682 /* 4 byte displacement. */
14683 bytes_before_imm += 4;
14684 break;
14685 case 1:
14686 /* 1 byte displacement. */
14687 bytes_before_imm++;
14688 break;
14692 else
14694 /* 16 bit address mode */
14695 /* Don't increase bytes_before_imm when decoding the third source,
14696 it has already been incremented by OP_E_memory while decoding
14697 the second source operand. */
14698 if (opnum == 0)
14700 switch (modrm.mod)
14702 case 0:
14703 /* When modrm.rm == 6, there is a 2 byte displacement. */
14704 if (modrm.rm != 6)
14705 /* No displacement. */
14706 break;
14707 case 2:
14708 /* 2 byte displacement. */
14709 bytes_before_imm += 2;
14710 break;
14711 case 1:
14712 /* 1 byte displacement: when decoding the third source,
14713 don't increase bytes_before_imm as this has already
14714 been incremented by one in OP_E_memory while decoding
14715 the second source operand. */
14716 if (opnum == 0)
14717 bytes_before_imm++;
14719 break;
14725 FETCH_DATA (the_info, codep + bytes_before_imm + 1);
14726 return codep [bytes_before_imm];
14729 static void
14730 OP_EX_VexReg (int bytemode, int sizeflag, int reg)
14732 const char **names;
14734 if (reg == -1 && modrm.mod != 3)
14736 OP_E_memory (bytemode, sizeflag);
14737 return;
14739 else
14741 if (reg == -1)
14743 reg = modrm.rm;
14744 USED_REX (REX_B);
14745 if (rex & REX_B)
14746 reg += 8;
14748 else if (reg > 7 && address_mode != mode_64bit)
14749 BadOp ();
14752 switch (vex.length)
14754 case 128:
14755 names = names_xmm;
14756 break;
14757 case 256:
14758 names = names_ymm;
14759 break;
14760 default:
14761 abort ();
14763 oappend (names[reg]);
14766 static void
14767 OP_EX_VexImmW (int bytemode, int sizeflag)
14769 int reg = -1;
14770 static unsigned char vex_imm8;
14772 if (vex_w_done == 0)
14774 vex_w_done = 1;
14776 /* Skip mod/rm byte. */
14777 MODRM_CHECK;
14778 codep++;
14780 vex_imm8 = get_vex_imm8 (sizeflag, 0);
14782 if (vex.w)
14783 reg = vex_imm8 >> 4;
14785 OP_EX_VexReg (bytemode, sizeflag, reg);
14787 else if (vex_w_done == 1)
14789 vex_w_done = 2;
14791 if (!vex.w)
14792 reg = vex_imm8 >> 4;
14794 OP_EX_VexReg (bytemode, sizeflag, reg);
14796 else
14798 /* Output the imm8 directly. */
14799 scratchbuf[0] = '$';
14800 print_operand_value (scratchbuf + 1, 1, vex_imm8 & 0xf);
14801 oappend (scratchbuf + intel_syntax);
14802 scratchbuf[0] = '\0';
14803 codep++;
14807 static void
14808 OP_Vex_2src (int bytemode, int sizeflag)
14810 if (modrm.mod == 3)
14812 int reg = modrm.rm;
14813 USED_REX (REX_B);
14814 if (rex & REX_B)
14815 reg += 8;
14816 oappend (names_xmm[reg]);
14818 else
14820 if (intel_syntax
14821 && (bytemode == v_mode || bytemode == v_swap_mode))
14823 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
14824 used_prefixes |= (prefixes & PREFIX_DATA);
14826 OP_E (bytemode, sizeflag);
14830 static void
14831 OP_Vex_2src_1 (int bytemode, int sizeflag)
14833 if (modrm.mod == 3)
14835 /* Skip mod/rm byte. */
14836 MODRM_CHECK;
14837 codep++;
14840 if (vex.w)
14841 oappend (names_xmm[vex.register_specifier]);
14842 else
14843 OP_Vex_2src (bytemode, sizeflag);
14846 static void
14847 OP_Vex_2src_2 (int bytemode, int sizeflag)
14849 if (vex.w)
14850 OP_Vex_2src (bytemode, sizeflag);
14851 else
14852 oappend (names_xmm[vex.register_specifier]);
14855 static void
14856 OP_EX_VexW (int bytemode, int sizeflag)
14858 int reg = -1;
14860 if (!vex_w_done)
14862 vex_w_done = 1;
14864 /* Skip mod/rm byte. */
14865 MODRM_CHECK;
14866 codep++;
14868 if (vex.w)
14869 reg = get_vex_imm8 (sizeflag, 0) >> 4;
14871 else
14873 if (!vex.w)
14874 reg = get_vex_imm8 (sizeflag, 1) >> 4;
14877 OP_EX_VexReg (bytemode, sizeflag, reg);
14880 static void
14881 VEXI4_Fixup (int bytemode ATTRIBUTE_UNUSED,
14882 int sizeflag ATTRIBUTE_UNUSED)
14884 /* Skip the immediate byte and check for invalid bits. */
14885 FETCH_DATA (the_info, codep + 1);
14886 if (*codep++ & 0xf)
14887 BadOp ();
14890 static void
14891 OP_REG_VexI4 (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
14893 int reg;
14894 const char **names;
14896 FETCH_DATA (the_info, codep + 1);
14897 reg = *codep++;
14899 if (bytemode != x_mode)
14900 abort ();
14902 if (reg & 0xf)
14903 BadOp ();
14905 reg >>= 4;
14906 if (reg > 7 && address_mode != mode_64bit)
14907 BadOp ();
14909 switch (vex.length)
14911 case 128:
14912 names = names_xmm;
14913 break;
14914 case 256:
14915 names = names_ymm;
14916 break;
14917 default:
14918 abort ();
14920 oappend (names[reg]);
14923 static void
14924 OP_XMM_VexW (int bytemode, int sizeflag)
14926 /* Turn off the REX.W bit since it is used for swapping operands
14927 now. */
14928 rex &= ~REX_W;
14929 OP_XMM (bytemode, sizeflag);
14932 static void
14933 OP_EX_Vex (int bytemode, int sizeflag)
14935 if (modrm.mod != 3)
14937 if (vex.register_specifier != 0)
14938 BadOp ();
14939 need_vex_reg = 0;
14941 OP_EX (bytemode, sizeflag);
14944 static void
14945 OP_XMM_Vex (int bytemode, int sizeflag)
14947 if (modrm.mod != 3)
14949 if (vex.register_specifier != 0)
14950 BadOp ();
14951 need_vex_reg = 0;
14953 OP_XMM (bytemode, sizeflag);
14956 static void
14957 VZERO_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
14959 switch (vex.length)
14961 case 128:
14962 mnemonicendp = stpcpy (obuf, "vzeroupper");
14963 break;
14964 case 256:
14965 mnemonicendp = stpcpy (obuf, "vzeroall");
14966 break;
14967 default:
14968 abort ();
14972 static struct op vex_cmp_op[] =
14974 { STRING_COMMA_LEN ("eq") },
14975 { STRING_COMMA_LEN ("lt") },
14976 { STRING_COMMA_LEN ("le") },
14977 { STRING_COMMA_LEN ("unord") },
14978 { STRING_COMMA_LEN ("neq") },
14979 { STRING_COMMA_LEN ("nlt") },
14980 { STRING_COMMA_LEN ("nle") },
14981 { STRING_COMMA_LEN ("ord") },
14982 { STRING_COMMA_LEN ("eq_uq") },
14983 { STRING_COMMA_LEN ("nge") },
14984 { STRING_COMMA_LEN ("ngt") },
14985 { STRING_COMMA_LEN ("false") },
14986 { STRING_COMMA_LEN ("neq_oq") },
14987 { STRING_COMMA_LEN ("ge") },
14988 { STRING_COMMA_LEN ("gt") },
14989 { STRING_COMMA_LEN ("true") },
14990 { STRING_COMMA_LEN ("eq_os") },
14991 { STRING_COMMA_LEN ("lt_oq") },
14992 { STRING_COMMA_LEN ("le_oq") },
14993 { STRING_COMMA_LEN ("unord_s") },
14994 { STRING_COMMA_LEN ("neq_us") },
14995 { STRING_COMMA_LEN ("nlt_uq") },
14996 { STRING_COMMA_LEN ("nle_uq") },
14997 { STRING_COMMA_LEN ("ord_s") },
14998 { STRING_COMMA_LEN ("eq_us") },
14999 { STRING_COMMA_LEN ("nge_uq") },
15000 { STRING_COMMA_LEN ("ngt_uq") },
15001 { STRING_COMMA_LEN ("false_os") },
15002 { STRING_COMMA_LEN ("neq_os") },
15003 { STRING_COMMA_LEN ("ge_oq") },
15004 { STRING_COMMA_LEN ("gt_oq") },
15005 { STRING_COMMA_LEN ("true_us") },
15008 static void
15009 VCMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15011 unsigned int cmp_type;
15013 FETCH_DATA (the_info, codep + 1);
15014 cmp_type = *codep++ & 0xff;
15015 if (cmp_type < ARRAY_SIZE (vex_cmp_op))
15017 char suffix [3];
15018 char *p = mnemonicendp - 2;
15019 suffix[0] = p[0];
15020 suffix[1] = p[1];
15021 suffix[2] = '\0';
15022 sprintf (p, "%s%s", vex_cmp_op[cmp_type].name, suffix);
15023 mnemonicendp += vex_cmp_op[cmp_type].len;
15025 else
15027 /* We have a reserved extension byte. Output it directly. */
15028 scratchbuf[0] = '$';
15029 print_operand_value (scratchbuf + 1, 1, cmp_type);
15030 oappend (scratchbuf + intel_syntax);
15031 scratchbuf[0] = '\0';
15035 static const struct op pclmul_op[] =
15037 { STRING_COMMA_LEN ("lql") },
15038 { STRING_COMMA_LEN ("hql") },
15039 { STRING_COMMA_LEN ("lqh") },
15040 { STRING_COMMA_LEN ("hqh") }
15043 static void
15044 PCLMUL_Fixup (int bytemode ATTRIBUTE_UNUSED,
15045 int sizeflag ATTRIBUTE_UNUSED)
15047 unsigned int pclmul_type;
15049 FETCH_DATA (the_info, codep + 1);
15050 pclmul_type = *codep++ & 0xff;
15051 switch (pclmul_type)
15053 case 0x10:
15054 pclmul_type = 2;
15055 break;
15056 case 0x11:
15057 pclmul_type = 3;
15058 break;
15059 default:
15060 break;
15062 if (pclmul_type < ARRAY_SIZE (pclmul_op))
15064 char suffix [4];
15065 char *p = mnemonicendp - 3;
15066 suffix[0] = p[0];
15067 suffix[1] = p[1];
15068 suffix[2] = p[2];
15069 suffix[3] = '\0';
15070 sprintf (p, "%s%s", pclmul_op[pclmul_type].name, suffix);
15071 mnemonicendp += pclmul_op[pclmul_type].len;
15073 else
15075 /* We have a reserved extension byte. Output it directly. */
15076 scratchbuf[0] = '$';
15077 print_operand_value (scratchbuf + 1, 1, pclmul_type);
15078 oappend (scratchbuf + intel_syntax);
15079 scratchbuf[0] = '\0';
15083 static void
15084 MOVBE_Fixup (int bytemode, int sizeflag)
15086 /* Add proper suffix to "movbe". */
15087 char *p = mnemonicendp;
15089 switch (bytemode)
15091 case v_mode:
15092 if (intel_syntax)
15093 goto skip;
15095 USED_REX (REX_W);
15096 if (sizeflag & SUFFIX_ALWAYS)
15098 if (rex & REX_W)
15099 *p++ = 'q';
15100 else
15102 if (sizeflag & DFLAG)
15103 *p++ = 'l';
15104 else
15105 *p++ = 'w';
15106 used_prefixes |= (prefixes & PREFIX_DATA);
15109 break;
15110 default:
15111 oappend (INTERNAL_DISASSEMBLER_ERROR);
15112 break;
15114 mnemonicendp = p;
15115 *p = '\0';
15117 skip:
15118 OP_M (bytemode, sizeflag);
15121 static void
15122 OP_LWPCB_E (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15124 int reg;
15125 const char **names;
15127 /* Skip mod/rm byte. */
15128 MODRM_CHECK;
15129 codep++;
15131 if (vex.w)
15132 names = names64;
15133 else
15134 names = names32;
15136 reg = modrm.rm;
15137 USED_REX (REX_B);
15138 if (rex & REX_B)
15139 reg += 8;
15141 oappend (names[reg]);
15144 static void
15145 OP_LWP_E (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15147 const char **names;
15149 if (vex.w)
15150 names = names64;
15151 else
15152 names = names32;
15154 oappend (names[vex.register_specifier]);