Sync from gcc mainline.
[binutils.git] / opcodes / i386-dis.c
blob96e42854dccae473930d3b627d90b97050814404
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_LWP_I (int, int);
118 static void OP_Vex_2src_1 (int, int);
119 static void OP_Vex_2src_2 (int, int);
121 static void MOVBE_Fixup (int, int);
123 struct dis_private {
124 /* Points to first byte not fetched. */
125 bfd_byte *max_fetched;
126 bfd_byte the_buffer[MAX_MNEM_SIZE];
127 bfd_vma insn_start;
128 int orig_sizeflag;
129 jmp_buf bailout;
132 enum address_mode
134 mode_16bit,
135 mode_32bit,
136 mode_64bit
139 enum address_mode address_mode;
141 /* Flags for the prefixes for the current instruction. See below. */
142 static int prefixes;
144 /* REX prefix the current instruction. See below. */
145 static int rex;
146 /* Bits of REX we've already used. */
147 static int rex_used;
148 /* REX bits in original REX prefix ignored. */
149 static int rex_ignored;
150 /* Mark parts used in the REX prefix. When we are testing for
151 empty prefix (for 8bit register REX extension), just mask it
152 out. Otherwise test for REX bit is excuse for existence of REX
153 only in case value is nonzero. */
154 #define USED_REX(value) \
156 if (value) \
158 if ((rex & value)) \
159 rex_used |= (value) | REX_OPCODE; \
161 else \
162 rex_used |= REX_OPCODE; \
165 /* Flags for prefixes which we somehow handled when printing the
166 current instruction. */
167 static int used_prefixes;
169 /* Flags stored in PREFIXES. */
170 #define PREFIX_REPZ 1
171 #define PREFIX_REPNZ 2
172 #define PREFIX_LOCK 4
173 #define PREFIX_CS 8
174 #define PREFIX_SS 0x10
175 #define PREFIX_DS 0x20
176 #define PREFIX_ES 0x40
177 #define PREFIX_FS 0x80
178 #define PREFIX_GS 0x100
179 #define PREFIX_DATA 0x200
180 #define PREFIX_ADDR 0x400
181 #define PREFIX_FWAIT 0x800
183 /* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
184 to ADDR (exclusive) are valid. Returns 1 for success, longjmps
185 on error. */
186 #define FETCH_DATA(info, addr) \
187 ((addr) <= ((struct dis_private *) (info->private_data))->max_fetched \
188 ? 1 : fetch_data ((info), (addr)))
190 static int
191 fetch_data (struct disassemble_info *info, bfd_byte *addr)
193 int status;
194 struct dis_private *priv = (struct dis_private *) info->private_data;
195 bfd_vma start = priv->insn_start + (priv->max_fetched - priv->the_buffer);
197 if (addr <= priv->the_buffer + MAX_MNEM_SIZE)
198 status = (*info->read_memory_func) (start,
199 priv->max_fetched,
200 addr - priv->max_fetched,
201 info);
202 else
203 status = -1;
204 if (status != 0)
206 /* If we did manage to read at least one byte, then
207 print_insn_i386 will do something sensible. Otherwise, print
208 an error. We do that here because this is where we know
209 STATUS. */
210 if (priv->max_fetched == priv->the_buffer)
211 (*info->memory_error_func) (status, start, info);
212 longjmp (priv->bailout, 1);
214 else
215 priv->max_fetched = addr;
216 return 1;
219 #define XX { NULL, 0 }
220 #define Bad_Opcode NULL, { { NULL, 0 } }
222 #define Eb { OP_E, b_mode }
223 #define EbS { OP_E, b_swap_mode }
224 #define Ev { OP_E, v_mode }
225 #define EvS { OP_E, v_swap_mode }
226 #define Ed { OP_E, d_mode }
227 #define Edq { OP_E, dq_mode }
228 #define Edqw { OP_E, dqw_mode }
229 #define Edqb { OP_E, dqb_mode }
230 #define Edqd { OP_E, dqd_mode }
231 #define Eq { OP_E, q_mode }
232 #define indirEv { OP_indirE, stack_v_mode }
233 #define indirEp { OP_indirE, f_mode }
234 #define stackEv { OP_E, stack_v_mode }
235 #define Em { OP_E, m_mode }
236 #define Ew { OP_E, w_mode }
237 #define M { OP_M, 0 } /* lea, lgdt, etc. */
238 #define Ma { OP_M, a_mode }
239 #define Mb { OP_M, b_mode }
240 #define Md { OP_M, d_mode }
241 #define Mo { OP_M, o_mode }
242 #define Mp { OP_M, f_mode } /* 32 or 48 bit memory operand for LDS, LES etc */
243 #define Mq { OP_M, q_mode }
244 #define Mx { OP_M, x_mode }
245 #define Mxmm { OP_M, xmm_mode }
246 #define Gb { OP_G, b_mode }
247 #define Gv { OP_G, v_mode }
248 #define Gd { OP_G, d_mode }
249 #define Gdq { OP_G, dq_mode }
250 #define Gm { OP_G, m_mode }
251 #define Gw { OP_G, w_mode }
252 #define Rd { OP_R, d_mode }
253 #define Rm { OP_R, m_mode }
254 #define Ib { OP_I, b_mode }
255 #define sIb { OP_sI, b_mode } /* sign extened byte */
256 #define Iv { OP_I, 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 RMAL { OP_REG, al_reg }
286 #define RMCL { OP_REG, cl_reg }
287 #define RMDL { OP_REG, dl_reg }
288 #define RMBL { OP_REG, bl_reg }
289 #define RMAH { OP_REG, ah_reg }
290 #define RMCH { OP_REG, ch_reg }
291 #define RMDH { OP_REG, dh_reg }
292 #define RMBH { OP_REG, bh_reg }
293 #define RMAX { OP_REG, ax_reg }
294 #define RMDX { OP_REG, dx_reg }
296 #define eAX { OP_IMREG, eAX_reg }
297 #define eBX { OP_IMREG, eBX_reg }
298 #define eCX { OP_IMREG, eCX_reg }
299 #define eDX { OP_IMREG, eDX_reg }
300 #define eSP { OP_IMREG, eSP_reg }
301 #define eBP { OP_IMREG, eBP_reg }
302 #define eSI { OP_IMREG, eSI_reg }
303 #define eDI { OP_IMREG, eDI_reg }
304 #define AL { OP_IMREG, al_reg }
305 #define CL { OP_IMREG, cl_reg }
306 #define DL { OP_IMREG, dl_reg }
307 #define BL { OP_IMREG, bl_reg }
308 #define AH { OP_IMREG, ah_reg }
309 #define CH { OP_IMREG, ch_reg }
310 #define DH { OP_IMREG, dh_reg }
311 #define BH { OP_IMREG, bh_reg }
312 #define AX { OP_IMREG, ax_reg }
313 #define DX { OP_IMREG, dx_reg }
314 #define zAX { OP_IMREG, z_mode_ax_reg }
315 #define indirDX { OP_IMREG, indir_dx_reg }
317 #define Sw { OP_SEG, w_mode }
318 #define Sv { OP_SEG, v_mode }
319 #define Ap { OP_DIR, 0 }
320 #define Ob { OP_OFF64, b_mode }
321 #define Ov { OP_OFF64, v_mode }
322 #define Xb { OP_DSreg, eSI_reg }
323 #define Xv { OP_DSreg, eSI_reg }
324 #define Xz { OP_DSreg, eSI_reg }
325 #define Yb { OP_ESreg, eDI_reg }
326 #define Yv { OP_ESreg, eDI_reg }
327 #define DSBX { OP_DSreg, eBX_reg }
329 #define es { OP_REG, es_reg }
330 #define ss { OP_REG, ss_reg }
331 #define cs { OP_REG, cs_reg }
332 #define ds { OP_REG, ds_reg }
333 #define fs { OP_REG, fs_reg }
334 #define gs { OP_REG, gs_reg }
336 #define MX { OP_MMX, 0 }
337 #define XM { OP_XMM, 0 }
338 #define XMScalar { OP_XMM, scalar_mode }
339 #define XMM { OP_XMM, xmm_mode }
340 #define EM { OP_EM, v_mode }
341 #define EMS { OP_EM, v_swap_mode }
342 #define EMd { OP_EM, d_mode }
343 #define EMx { OP_EM, x_mode }
344 #define EXw { OP_EX, w_mode }
345 #define EXd { OP_EX, d_mode }
346 #define EXdScalar { OP_EX, d_scalar_mode }
347 #define EXdS { OP_EX, d_swap_mode }
348 #define EXq { OP_EX, q_mode }
349 #define EXqScalar { OP_EX, q_scalar_mode }
350 #define EXqScalarS { OP_EX, q_scalar_swap_mode }
351 #define EXqS { OP_EX, q_swap_mode }
352 #define EXx { OP_EX, x_mode }
353 #define EXxS { OP_EX, x_swap_mode }
354 #define EXxmm { OP_EX, xmm_mode }
355 #define EXxmmq { OP_EX, xmmq_mode }
356 #define EXymmq { OP_EX, ymmq_mode }
357 #define EXVexWdq { OP_EX, vex_w_dq_mode }
358 #define EXVexWdqScalar { OP_EX, vex_scalar_w_dq_mode }
359 #define MS { OP_MS, v_mode }
360 #define XS { OP_XS, v_mode }
361 #define EMCq { OP_EMC, q_mode }
362 #define MXC { OP_MXC, 0 }
363 #define OPSUF { OP_3DNowSuffix, 0 }
364 #define CMP { CMP_Fixup, 0 }
365 #define XMM0 { XMM_Fixup, 0 }
366 #define FXSAVE { FXSAVE_Fixup, 0 }
367 #define Vex_2src_1 { OP_Vex_2src_1, 0 }
368 #define Vex_2src_2 { OP_Vex_2src_2, 0 }
370 #define Vex { OP_VEX, vex_mode }
371 #define VexScalar { OP_VEX, vex_scalar_mode }
372 #define Vex128 { OP_VEX, vex128_mode }
373 #define Vex256 { OP_VEX, vex256_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_71,
599 REG_VEX_72,
600 REG_VEX_73,
601 REG_VEX_AE,
602 REG_XOP_LWPCB,
603 REG_XOP_LWP
606 enum
608 MOD_8D = 0,
609 MOD_0F01_REG_0,
610 MOD_0F01_REG_1,
611 MOD_0F01_REG_2,
612 MOD_0F01_REG_3,
613 MOD_0F01_REG_7,
614 MOD_0F12_PREFIX_0,
615 MOD_0F13,
616 MOD_0F16_PREFIX_0,
617 MOD_0F17,
618 MOD_0F18_REG_0,
619 MOD_0F18_REG_1,
620 MOD_0F18_REG_2,
621 MOD_0F18_REG_3,
622 MOD_0F20,
623 MOD_0F21,
624 MOD_0F22,
625 MOD_0F23,
626 MOD_0F24,
627 MOD_0F26,
628 MOD_0F2B_PREFIX_0,
629 MOD_0F2B_PREFIX_1,
630 MOD_0F2B_PREFIX_2,
631 MOD_0F2B_PREFIX_3,
632 MOD_0F51,
633 MOD_0F71_REG_2,
634 MOD_0F71_REG_4,
635 MOD_0F71_REG_6,
636 MOD_0F72_REG_2,
637 MOD_0F72_REG_4,
638 MOD_0F72_REG_6,
639 MOD_0F73_REG_2,
640 MOD_0F73_REG_3,
641 MOD_0F73_REG_6,
642 MOD_0F73_REG_7,
643 MOD_0FAE_REG_0,
644 MOD_0FAE_REG_1,
645 MOD_0FAE_REG_2,
646 MOD_0FAE_REG_3,
647 MOD_0FAE_REG_4,
648 MOD_0FAE_REG_5,
649 MOD_0FAE_REG_6,
650 MOD_0FAE_REG_7,
651 MOD_0FB2,
652 MOD_0FB4,
653 MOD_0FB5,
654 MOD_0FC7_REG_6,
655 MOD_0FC7_REG_7,
656 MOD_0FD7,
657 MOD_0FE7_PREFIX_2,
658 MOD_0FF0_PREFIX_3,
659 MOD_0F382A_PREFIX_2,
660 MOD_62_32BIT,
661 MOD_C4_32BIT,
662 MOD_C5_32BIT,
663 MOD_VEX_12_PREFIX_0,
664 MOD_VEX_13,
665 MOD_VEX_16_PREFIX_0,
666 MOD_VEX_17,
667 MOD_VEX_2B,
668 MOD_VEX_50,
669 MOD_VEX_71_REG_2,
670 MOD_VEX_71_REG_4,
671 MOD_VEX_71_REG_6,
672 MOD_VEX_72_REG_2,
673 MOD_VEX_72_REG_4,
674 MOD_VEX_72_REG_6,
675 MOD_VEX_73_REG_2,
676 MOD_VEX_73_REG_3,
677 MOD_VEX_73_REG_6,
678 MOD_VEX_73_REG_7,
679 MOD_VEX_AE_REG_2,
680 MOD_VEX_AE_REG_3,
681 MOD_VEX_D7_PREFIX_2,
682 MOD_VEX_E7_PREFIX_2,
683 MOD_VEX_F0_PREFIX_3,
684 MOD_VEX_3818_PREFIX_2,
685 MOD_VEX_3819_PREFIX_2,
686 MOD_VEX_381A_PREFIX_2,
687 MOD_VEX_382A_PREFIX_2,
688 MOD_VEX_382C_PREFIX_2,
689 MOD_VEX_382D_PREFIX_2,
690 MOD_VEX_382E_PREFIX_2,
691 MOD_VEX_382F_PREFIX_2
694 enum
696 RM_0F01_REG_0 = 0,
697 RM_0F01_REG_1,
698 RM_0F01_REG_2,
699 RM_0F01_REG_3,
700 RM_0F01_REG_7,
701 RM_0FAE_REG_5,
702 RM_0FAE_REG_6,
703 RM_0FAE_REG_7
706 enum
708 PREFIX_90 = 0,
709 PREFIX_0F10,
710 PREFIX_0F11,
711 PREFIX_0F12,
712 PREFIX_0F16,
713 PREFIX_0F2A,
714 PREFIX_0F2B,
715 PREFIX_0F2C,
716 PREFIX_0F2D,
717 PREFIX_0F2E,
718 PREFIX_0F2F,
719 PREFIX_0F51,
720 PREFIX_0F52,
721 PREFIX_0F53,
722 PREFIX_0F58,
723 PREFIX_0F59,
724 PREFIX_0F5A,
725 PREFIX_0F5B,
726 PREFIX_0F5C,
727 PREFIX_0F5D,
728 PREFIX_0F5E,
729 PREFIX_0F5F,
730 PREFIX_0F60,
731 PREFIX_0F61,
732 PREFIX_0F62,
733 PREFIX_0F6C,
734 PREFIX_0F6D,
735 PREFIX_0F6F,
736 PREFIX_0F70,
737 PREFIX_0F73_REG_3,
738 PREFIX_0F73_REG_7,
739 PREFIX_0F78,
740 PREFIX_0F79,
741 PREFIX_0F7C,
742 PREFIX_0F7D,
743 PREFIX_0F7E,
744 PREFIX_0F7F,
745 PREFIX_0FB8,
746 PREFIX_0FBD,
747 PREFIX_0FC2,
748 PREFIX_0FC3,
749 PREFIX_0FC7_REG_6,
750 PREFIX_0FD0,
751 PREFIX_0FD6,
752 PREFIX_0FE6,
753 PREFIX_0FE7,
754 PREFIX_0FF0,
755 PREFIX_0FF7,
756 PREFIX_0F3810,
757 PREFIX_0F3814,
758 PREFIX_0F3815,
759 PREFIX_0F3817,
760 PREFIX_0F3820,
761 PREFIX_0F3821,
762 PREFIX_0F3822,
763 PREFIX_0F3823,
764 PREFIX_0F3824,
765 PREFIX_0F3825,
766 PREFIX_0F3828,
767 PREFIX_0F3829,
768 PREFIX_0F382A,
769 PREFIX_0F382B,
770 PREFIX_0F3830,
771 PREFIX_0F3831,
772 PREFIX_0F3832,
773 PREFIX_0F3833,
774 PREFIX_0F3834,
775 PREFIX_0F3835,
776 PREFIX_0F3837,
777 PREFIX_0F3838,
778 PREFIX_0F3839,
779 PREFIX_0F383A,
780 PREFIX_0F383B,
781 PREFIX_0F383C,
782 PREFIX_0F383D,
783 PREFIX_0F383E,
784 PREFIX_0F383F,
785 PREFIX_0F3840,
786 PREFIX_0F3841,
787 PREFIX_0F3880,
788 PREFIX_0F3881,
789 PREFIX_0F38DB,
790 PREFIX_0F38DC,
791 PREFIX_0F38DD,
792 PREFIX_0F38DE,
793 PREFIX_0F38DF,
794 PREFIX_0F38F0,
795 PREFIX_0F38F1,
796 PREFIX_0F3A08,
797 PREFIX_0F3A09,
798 PREFIX_0F3A0A,
799 PREFIX_0F3A0B,
800 PREFIX_0F3A0C,
801 PREFIX_0F3A0D,
802 PREFIX_0F3A0E,
803 PREFIX_0F3A14,
804 PREFIX_0F3A15,
805 PREFIX_0F3A16,
806 PREFIX_0F3A17,
807 PREFIX_0F3A20,
808 PREFIX_0F3A21,
809 PREFIX_0F3A22,
810 PREFIX_0F3A40,
811 PREFIX_0F3A41,
812 PREFIX_0F3A42,
813 PREFIX_0F3A44,
814 PREFIX_0F3A60,
815 PREFIX_0F3A61,
816 PREFIX_0F3A62,
817 PREFIX_0F3A63,
818 PREFIX_0F3ADF,
819 PREFIX_VEX_10,
820 PREFIX_VEX_11,
821 PREFIX_VEX_12,
822 PREFIX_VEX_16,
823 PREFIX_VEX_2A,
824 PREFIX_VEX_2C,
825 PREFIX_VEX_2D,
826 PREFIX_VEX_2E,
827 PREFIX_VEX_2F,
828 PREFIX_VEX_51,
829 PREFIX_VEX_52,
830 PREFIX_VEX_53,
831 PREFIX_VEX_58,
832 PREFIX_VEX_59,
833 PREFIX_VEX_5A,
834 PREFIX_VEX_5B,
835 PREFIX_VEX_5C,
836 PREFIX_VEX_5D,
837 PREFIX_VEX_5E,
838 PREFIX_VEX_5F,
839 PREFIX_VEX_60,
840 PREFIX_VEX_61,
841 PREFIX_VEX_62,
842 PREFIX_VEX_63,
843 PREFIX_VEX_64,
844 PREFIX_VEX_65,
845 PREFIX_VEX_66,
846 PREFIX_VEX_67,
847 PREFIX_VEX_68,
848 PREFIX_VEX_69,
849 PREFIX_VEX_6A,
850 PREFIX_VEX_6B,
851 PREFIX_VEX_6C,
852 PREFIX_VEX_6D,
853 PREFIX_VEX_6E,
854 PREFIX_VEX_6F,
855 PREFIX_VEX_70,
856 PREFIX_VEX_71_REG_2,
857 PREFIX_VEX_71_REG_4,
858 PREFIX_VEX_71_REG_6,
859 PREFIX_VEX_72_REG_2,
860 PREFIX_VEX_72_REG_4,
861 PREFIX_VEX_72_REG_6,
862 PREFIX_VEX_73_REG_2,
863 PREFIX_VEX_73_REG_3,
864 PREFIX_VEX_73_REG_6,
865 PREFIX_VEX_73_REG_7,
866 PREFIX_VEX_74,
867 PREFIX_VEX_75,
868 PREFIX_VEX_76,
869 PREFIX_VEX_77,
870 PREFIX_VEX_7C,
871 PREFIX_VEX_7D,
872 PREFIX_VEX_7E,
873 PREFIX_VEX_7F,
874 PREFIX_VEX_C2,
875 PREFIX_VEX_C4,
876 PREFIX_VEX_C5,
877 PREFIX_VEX_D0,
878 PREFIX_VEX_D1,
879 PREFIX_VEX_D2,
880 PREFIX_VEX_D3,
881 PREFIX_VEX_D4,
882 PREFIX_VEX_D5,
883 PREFIX_VEX_D6,
884 PREFIX_VEX_D7,
885 PREFIX_VEX_D8,
886 PREFIX_VEX_D9,
887 PREFIX_VEX_DA,
888 PREFIX_VEX_DB,
889 PREFIX_VEX_DC,
890 PREFIX_VEX_DD,
891 PREFIX_VEX_DE,
892 PREFIX_VEX_DF,
893 PREFIX_VEX_E0,
894 PREFIX_VEX_E1,
895 PREFIX_VEX_E2,
896 PREFIX_VEX_E3,
897 PREFIX_VEX_E4,
898 PREFIX_VEX_E5,
899 PREFIX_VEX_E6,
900 PREFIX_VEX_E7,
901 PREFIX_VEX_E8,
902 PREFIX_VEX_E9,
903 PREFIX_VEX_EA,
904 PREFIX_VEX_EB,
905 PREFIX_VEX_EC,
906 PREFIX_VEX_ED,
907 PREFIX_VEX_EE,
908 PREFIX_VEX_EF,
909 PREFIX_VEX_F0,
910 PREFIX_VEX_F1,
911 PREFIX_VEX_F2,
912 PREFIX_VEX_F3,
913 PREFIX_VEX_F4,
914 PREFIX_VEX_F5,
915 PREFIX_VEX_F6,
916 PREFIX_VEX_F7,
917 PREFIX_VEX_F8,
918 PREFIX_VEX_F9,
919 PREFIX_VEX_FA,
920 PREFIX_VEX_FB,
921 PREFIX_VEX_FC,
922 PREFIX_VEX_FD,
923 PREFIX_VEX_FE,
924 PREFIX_VEX_3800,
925 PREFIX_VEX_3801,
926 PREFIX_VEX_3802,
927 PREFIX_VEX_3803,
928 PREFIX_VEX_3804,
929 PREFIX_VEX_3805,
930 PREFIX_VEX_3806,
931 PREFIX_VEX_3807,
932 PREFIX_VEX_3808,
933 PREFIX_VEX_3809,
934 PREFIX_VEX_380A,
935 PREFIX_VEX_380B,
936 PREFIX_VEX_380C,
937 PREFIX_VEX_380D,
938 PREFIX_VEX_380E,
939 PREFIX_VEX_380F,
940 PREFIX_VEX_3817,
941 PREFIX_VEX_3818,
942 PREFIX_VEX_3819,
943 PREFIX_VEX_381A,
944 PREFIX_VEX_381C,
945 PREFIX_VEX_381D,
946 PREFIX_VEX_381E,
947 PREFIX_VEX_3820,
948 PREFIX_VEX_3821,
949 PREFIX_VEX_3822,
950 PREFIX_VEX_3823,
951 PREFIX_VEX_3824,
952 PREFIX_VEX_3825,
953 PREFIX_VEX_3828,
954 PREFIX_VEX_3829,
955 PREFIX_VEX_382A,
956 PREFIX_VEX_382B,
957 PREFIX_VEX_382C,
958 PREFIX_VEX_382D,
959 PREFIX_VEX_382E,
960 PREFIX_VEX_382F,
961 PREFIX_VEX_3830,
962 PREFIX_VEX_3831,
963 PREFIX_VEX_3832,
964 PREFIX_VEX_3833,
965 PREFIX_VEX_3834,
966 PREFIX_VEX_3835,
967 PREFIX_VEX_3837,
968 PREFIX_VEX_3838,
969 PREFIX_VEX_3839,
970 PREFIX_VEX_383A,
971 PREFIX_VEX_383B,
972 PREFIX_VEX_383C,
973 PREFIX_VEX_383D,
974 PREFIX_VEX_383E,
975 PREFIX_VEX_383F,
976 PREFIX_VEX_3840,
977 PREFIX_VEX_3841,
978 PREFIX_VEX_3896,
979 PREFIX_VEX_3897,
980 PREFIX_VEX_3898,
981 PREFIX_VEX_3899,
982 PREFIX_VEX_389A,
983 PREFIX_VEX_389B,
984 PREFIX_VEX_389C,
985 PREFIX_VEX_389D,
986 PREFIX_VEX_389E,
987 PREFIX_VEX_389F,
988 PREFIX_VEX_38A6,
989 PREFIX_VEX_38A7,
990 PREFIX_VEX_38A8,
991 PREFIX_VEX_38A9,
992 PREFIX_VEX_38AA,
993 PREFIX_VEX_38AB,
994 PREFIX_VEX_38AC,
995 PREFIX_VEX_38AD,
996 PREFIX_VEX_38AE,
997 PREFIX_VEX_38AF,
998 PREFIX_VEX_38B6,
999 PREFIX_VEX_38B7,
1000 PREFIX_VEX_38B8,
1001 PREFIX_VEX_38B9,
1002 PREFIX_VEX_38BA,
1003 PREFIX_VEX_38BB,
1004 PREFIX_VEX_38BC,
1005 PREFIX_VEX_38BD,
1006 PREFIX_VEX_38BE,
1007 PREFIX_VEX_38BF,
1008 PREFIX_VEX_38DB,
1009 PREFIX_VEX_38DC,
1010 PREFIX_VEX_38DD,
1011 PREFIX_VEX_38DE,
1012 PREFIX_VEX_38DF,
1013 PREFIX_VEX_3A04,
1014 PREFIX_VEX_3A05,
1015 PREFIX_VEX_3A06,
1016 PREFIX_VEX_3A08,
1017 PREFIX_VEX_3A09,
1018 PREFIX_VEX_3A0A,
1019 PREFIX_VEX_3A0B,
1020 PREFIX_VEX_3A0C,
1021 PREFIX_VEX_3A0D,
1022 PREFIX_VEX_3A0E,
1023 PREFIX_VEX_3A0F,
1024 PREFIX_VEX_3A14,
1025 PREFIX_VEX_3A15,
1026 PREFIX_VEX_3A16,
1027 PREFIX_VEX_3A17,
1028 PREFIX_VEX_3A18,
1029 PREFIX_VEX_3A19,
1030 PREFIX_VEX_3A20,
1031 PREFIX_VEX_3A21,
1032 PREFIX_VEX_3A22,
1033 PREFIX_VEX_3A40,
1034 PREFIX_VEX_3A41,
1035 PREFIX_VEX_3A42,
1036 PREFIX_VEX_3A44,
1037 PREFIX_VEX_3A48,
1038 PREFIX_VEX_3A49,
1039 PREFIX_VEX_3A4A,
1040 PREFIX_VEX_3A4B,
1041 PREFIX_VEX_3A4C,
1042 PREFIX_VEX_3A5C,
1043 PREFIX_VEX_3A5D,
1044 PREFIX_VEX_3A5E,
1045 PREFIX_VEX_3A5F,
1046 PREFIX_VEX_3A60,
1047 PREFIX_VEX_3A61,
1048 PREFIX_VEX_3A62,
1049 PREFIX_VEX_3A63,
1050 PREFIX_VEX_3A68,
1051 PREFIX_VEX_3A69,
1052 PREFIX_VEX_3A6A,
1053 PREFIX_VEX_3A6B,
1054 PREFIX_VEX_3A6C,
1055 PREFIX_VEX_3A6D,
1056 PREFIX_VEX_3A6E,
1057 PREFIX_VEX_3A6F,
1058 PREFIX_VEX_3A78,
1059 PREFIX_VEX_3A79,
1060 PREFIX_VEX_3A7A,
1061 PREFIX_VEX_3A7B,
1062 PREFIX_VEX_3A7C,
1063 PREFIX_VEX_3A7D,
1064 PREFIX_VEX_3A7E,
1065 PREFIX_VEX_3A7F,
1066 PREFIX_VEX_3ADF
1069 enum
1071 X86_64_06 = 0,
1072 X86_64_07,
1073 X86_64_0D,
1074 X86_64_16,
1075 X86_64_17,
1076 X86_64_1E,
1077 X86_64_1F,
1078 X86_64_27,
1079 X86_64_2F,
1080 X86_64_37,
1081 X86_64_3F,
1082 X86_64_60,
1083 X86_64_61,
1084 X86_64_62,
1085 X86_64_63,
1086 X86_64_6D,
1087 X86_64_6F,
1088 X86_64_9A,
1089 X86_64_C4,
1090 X86_64_C5,
1091 X86_64_CE,
1092 X86_64_D4,
1093 X86_64_D5,
1094 X86_64_EA,
1095 X86_64_0F01_REG_0,
1096 X86_64_0F01_REG_1,
1097 X86_64_0F01_REG_2,
1098 X86_64_0F01_REG_3
1101 enum
1103 THREE_BYTE_0F38 = 0,
1104 THREE_BYTE_0F3A,
1105 THREE_BYTE_0F7A
1108 enum
1110 XOP_08 = 0,
1111 XOP_09,
1112 XOP_0A
1115 enum
1117 VEX_0F = 0,
1118 VEX_0F38,
1119 VEX_0F3A
1122 enum
1124 VEX_LEN_10_P_1 = 0,
1125 VEX_LEN_10_P_3,
1126 VEX_LEN_11_P_1,
1127 VEX_LEN_11_P_3,
1128 VEX_LEN_12_P_0_M_0,
1129 VEX_LEN_12_P_0_M_1,
1130 VEX_LEN_12_P_2,
1131 VEX_LEN_13_M_0,
1132 VEX_LEN_16_P_0_M_0,
1133 VEX_LEN_16_P_0_M_1,
1134 VEX_LEN_16_P_2,
1135 VEX_LEN_17_M_0,
1136 VEX_LEN_2A_P_1,
1137 VEX_LEN_2A_P_3,
1138 VEX_LEN_2C_P_1,
1139 VEX_LEN_2C_P_3,
1140 VEX_LEN_2D_P_1,
1141 VEX_LEN_2D_P_3,
1142 VEX_LEN_2E_P_0,
1143 VEX_LEN_2E_P_2,
1144 VEX_LEN_2F_P_0,
1145 VEX_LEN_2F_P_2,
1146 VEX_LEN_51_P_1,
1147 VEX_LEN_51_P_3,
1148 VEX_LEN_52_P_1,
1149 VEX_LEN_53_P_1,
1150 VEX_LEN_58_P_1,
1151 VEX_LEN_58_P_3,
1152 VEX_LEN_59_P_1,
1153 VEX_LEN_59_P_3,
1154 VEX_LEN_5A_P_1,
1155 VEX_LEN_5A_P_3,
1156 VEX_LEN_5C_P_1,
1157 VEX_LEN_5C_P_3,
1158 VEX_LEN_5D_P_1,
1159 VEX_LEN_5D_P_3,
1160 VEX_LEN_5E_P_1,
1161 VEX_LEN_5E_P_3,
1162 VEX_LEN_5F_P_1,
1163 VEX_LEN_5F_P_3,
1164 VEX_LEN_60_P_2,
1165 VEX_LEN_61_P_2,
1166 VEX_LEN_62_P_2,
1167 VEX_LEN_63_P_2,
1168 VEX_LEN_64_P_2,
1169 VEX_LEN_65_P_2,
1170 VEX_LEN_66_P_2,
1171 VEX_LEN_67_P_2,
1172 VEX_LEN_68_P_2,
1173 VEX_LEN_69_P_2,
1174 VEX_LEN_6A_P_2,
1175 VEX_LEN_6B_P_2,
1176 VEX_LEN_6C_P_2,
1177 VEX_LEN_6D_P_2,
1178 VEX_LEN_6E_P_2,
1179 VEX_LEN_70_P_1,
1180 VEX_LEN_70_P_2,
1181 VEX_LEN_70_P_3,
1182 VEX_LEN_71_R_2_P_2,
1183 VEX_LEN_71_R_4_P_2,
1184 VEX_LEN_71_R_6_P_2,
1185 VEX_LEN_72_R_2_P_2,
1186 VEX_LEN_72_R_4_P_2,
1187 VEX_LEN_72_R_6_P_2,
1188 VEX_LEN_73_R_2_P_2,
1189 VEX_LEN_73_R_3_P_2,
1190 VEX_LEN_73_R_6_P_2,
1191 VEX_LEN_73_R_7_P_2,
1192 VEX_LEN_74_P_2,
1193 VEX_LEN_75_P_2,
1194 VEX_LEN_76_P_2,
1195 VEX_LEN_7E_P_1,
1196 VEX_LEN_7E_P_2,
1197 VEX_LEN_AE_R_2_M_0,
1198 VEX_LEN_AE_R_3_M_0,
1199 VEX_LEN_C2_P_1,
1200 VEX_LEN_C2_P_3,
1201 VEX_LEN_C4_P_2,
1202 VEX_LEN_C5_P_2,
1203 VEX_LEN_D1_P_2,
1204 VEX_LEN_D2_P_2,
1205 VEX_LEN_D3_P_2,
1206 VEX_LEN_D4_P_2,
1207 VEX_LEN_D5_P_2,
1208 VEX_LEN_D6_P_2,
1209 VEX_LEN_D7_P_2_M_1,
1210 VEX_LEN_D8_P_2,
1211 VEX_LEN_D9_P_2,
1212 VEX_LEN_DA_P_2,
1213 VEX_LEN_DB_P_2,
1214 VEX_LEN_DC_P_2,
1215 VEX_LEN_DD_P_2,
1216 VEX_LEN_DE_P_2,
1217 VEX_LEN_DF_P_2,
1218 VEX_LEN_E0_P_2,
1219 VEX_LEN_E1_P_2,
1220 VEX_LEN_E2_P_2,
1221 VEX_LEN_E3_P_2,
1222 VEX_LEN_E4_P_2,
1223 VEX_LEN_E5_P_2,
1224 VEX_LEN_E8_P_2,
1225 VEX_LEN_E9_P_2,
1226 VEX_LEN_EA_P_2,
1227 VEX_LEN_EB_P_2,
1228 VEX_LEN_EC_P_2,
1229 VEX_LEN_ED_P_2,
1230 VEX_LEN_EE_P_2,
1231 VEX_LEN_EF_P_2,
1232 VEX_LEN_F1_P_2,
1233 VEX_LEN_F2_P_2,
1234 VEX_LEN_F3_P_2,
1235 VEX_LEN_F4_P_2,
1236 VEX_LEN_F5_P_2,
1237 VEX_LEN_F6_P_2,
1238 VEX_LEN_F7_P_2,
1239 VEX_LEN_F8_P_2,
1240 VEX_LEN_F9_P_2,
1241 VEX_LEN_FA_P_2,
1242 VEX_LEN_FB_P_2,
1243 VEX_LEN_FC_P_2,
1244 VEX_LEN_FD_P_2,
1245 VEX_LEN_FE_P_2,
1246 VEX_LEN_3800_P_2,
1247 VEX_LEN_3801_P_2,
1248 VEX_LEN_3802_P_2,
1249 VEX_LEN_3803_P_2,
1250 VEX_LEN_3804_P_2,
1251 VEX_LEN_3805_P_2,
1252 VEX_LEN_3806_P_2,
1253 VEX_LEN_3807_P_2,
1254 VEX_LEN_3808_P_2,
1255 VEX_LEN_3809_P_2,
1256 VEX_LEN_380A_P_2,
1257 VEX_LEN_380B_P_2,
1258 VEX_LEN_3819_P_2_M_0,
1259 VEX_LEN_381A_P_2_M_0,
1260 VEX_LEN_381C_P_2,
1261 VEX_LEN_381D_P_2,
1262 VEX_LEN_381E_P_2,
1263 VEX_LEN_3820_P_2,
1264 VEX_LEN_3821_P_2,
1265 VEX_LEN_3822_P_2,
1266 VEX_LEN_3823_P_2,
1267 VEX_LEN_3824_P_2,
1268 VEX_LEN_3825_P_2,
1269 VEX_LEN_3828_P_2,
1270 VEX_LEN_3829_P_2,
1271 VEX_LEN_382A_P_2_M_0,
1272 VEX_LEN_382B_P_2,
1273 VEX_LEN_3830_P_2,
1274 VEX_LEN_3831_P_2,
1275 VEX_LEN_3832_P_2,
1276 VEX_LEN_3833_P_2,
1277 VEX_LEN_3834_P_2,
1278 VEX_LEN_3835_P_2,
1279 VEX_LEN_3837_P_2,
1280 VEX_LEN_3838_P_2,
1281 VEX_LEN_3839_P_2,
1282 VEX_LEN_383A_P_2,
1283 VEX_LEN_383B_P_2,
1284 VEX_LEN_383C_P_2,
1285 VEX_LEN_383D_P_2,
1286 VEX_LEN_383E_P_2,
1287 VEX_LEN_383F_P_2,
1288 VEX_LEN_3840_P_2,
1289 VEX_LEN_3841_P_2,
1290 VEX_LEN_38DB_P_2,
1291 VEX_LEN_38DC_P_2,
1292 VEX_LEN_38DD_P_2,
1293 VEX_LEN_38DE_P_2,
1294 VEX_LEN_38DF_P_2,
1295 VEX_LEN_3A06_P_2,
1296 VEX_LEN_3A0A_P_2,
1297 VEX_LEN_3A0B_P_2,
1298 VEX_LEN_3A0E_P_2,
1299 VEX_LEN_3A0F_P_2,
1300 VEX_LEN_3A14_P_2,
1301 VEX_LEN_3A15_P_2,
1302 VEX_LEN_3A16_P_2,
1303 VEX_LEN_3A17_P_2,
1304 VEX_LEN_3A18_P_2,
1305 VEX_LEN_3A19_P_2,
1306 VEX_LEN_3A20_P_2,
1307 VEX_LEN_3A21_P_2,
1308 VEX_LEN_3A22_P_2,
1309 VEX_LEN_3A41_P_2,
1310 VEX_LEN_3A42_P_2,
1311 VEX_LEN_3A44_P_2,
1312 VEX_LEN_3A4C_P_2,
1313 VEX_LEN_3A60_P_2,
1314 VEX_LEN_3A61_P_2,
1315 VEX_LEN_3A62_P_2,
1316 VEX_LEN_3A63_P_2,
1317 VEX_LEN_3A6A_P_2,
1318 VEX_LEN_3A6B_P_2,
1319 VEX_LEN_3A6E_P_2,
1320 VEX_LEN_3A6F_P_2,
1321 VEX_LEN_3A7A_P_2,
1322 VEX_LEN_3A7B_P_2,
1323 VEX_LEN_3A7E_P_2,
1324 VEX_LEN_3A7F_P_2,
1325 VEX_LEN_3ADF_P_2,
1326 VEX_LEN_XOP_09_80,
1327 VEX_LEN_XOP_09_81
1330 enum
1332 VEX_W_10_P_0 = 0,
1333 VEX_W_10_P_1,
1334 VEX_W_10_P_2,
1335 VEX_W_10_P_3,
1336 VEX_W_11_P_0,
1337 VEX_W_11_P_1,
1338 VEX_W_11_P_2,
1339 VEX_W_11_P_3,
1340 VEX_W_12_P_0_M_0,
1341 VEX_W_12_P_0_M_1,
1342 VEX_W_12_P_1,
1343 VEX_W_12_P_2,
1344 VEX_W_12_P_3,
1345 VEX_W_13_M_0,
1346 VEX_W_14,
1347 VEX_W_15,
1348 VEX_W_16_P_0_M_0,
1349 VEX_W_16_P_0_M_1,
1350 VEX_W_16_P_1,
1351 VEX_W_16_P_2,
1352 VEX_W_17_M_0,
1353 VEX_W_28,
1354 VEX_W_29,
1355 VEX_W_2B_M_0,
1356 VEX_W_2E_P_0,
1357 VEX_W_2E_P_2,
1358 VEX_W_2F_P_0,
1359 VEX_W_2F_P_2,
1360 VEX_W_50_M_0,
1361 VEX_W_51_P_0,
1362 VEX_W_51_P_1,
1363 VEX_W_51_P_2,
1364 VEX_W_51_P_3,
1365 VEX_W_52_P_0,
1366 VEX_W_52_P_1,
1367 VEX_W_53_P_0,
1368 VEX_W_53_P_1,
1369 VEX_W_58_P_0,
1370 VEX_W_58_P_1,
1371 VEX_W_58_P_2,
1372 VEX_W_58_P_3,
1373 VEX_W_59_P_0,
1374 VEX_W_59_P_1,
1375 VEX_W_59_P_2,
1376 VEX_W_59_P_3,
1377 VEX_W_5A_P_0,
1378 VEX_W_5A_P_1,
1379 VEX_W_5A_P_3,
1380 VEX_W_5B_P_0,
1381 VEX_W_5B_P_1,
1382 VEX_W_5B_P_2,
1383 VEX_W_5C_P_0,
1384 VEX_W_5C_P_1,
1385 VEX_W_5C_P_2,
1386 VEX_W_5C_P_3,
1387 VEX_W_5D_P_0,
1388 VEX_W_5D_P_1,
1389 VEX_W_5D_P_2,
1390 VEX_W_5D_P_3,
1391 VEX_W_5E_P_0,
1392 VEX_W_5E_P_1,
1393 VEX_W_5E_P_2,
1394 VEX_W_5E_P_3,
1395 VEX_W_5F_P_0,
1396 VEX_W_5F_P_1,
1397 VEX_W_5F_P_2,
1398 VEX_W_5F_P_3,
1399 VEX_W_60_P_2,
1400 VEX_W_61_P_2,
1401 VEX_W_62_P_2,
1402 VEX_W_63_P_2,
1403 VEX_W_64_P_2,
1404 VEX_W_65_P_2,
1405 VEX_W_66_P_2,
1406 VEX_W_67_P_2,
1407 VEX_W_68_P_2,
1408 VEX_W_69_P_2,
1409 VEX_W_6A_P_2,
1410 VEX_W_6B_P_2,
1411 VEX_W_6C_P_2,
1412 VEX_W_6D_P_2,
1413 VEX_W_6F_P_1,
1414 VEX_W_6F_P_2,
1415 VEX_W_70_P_1,
1416 VEX_W_70_P_2,
1417 VEX_W_70_P_3,
1418 VEX_W_71_R_2_P_2,
1419 VEX_W_71_R_4_P_2,
1420 VEX_W_71_R_6_P_2,
1421 VEX_W_72_R_2_P_2,
1422 VEX_W_72_R_4_P_2,
1423 VEX_W_72_R_6_P_2,
1424 VEX_W_73_R_2_P_2,
1425 VEX_W_73_R_3_P_2,
1426 VEX_W_73_R_6_P_2,
1427 VEX_W_73_R_7_P_2,
1428 VEX_W_74_P_2,
1429 VEX_W_75_P_2,
1430 VEX_W_76_P_2,
1431 VEX_W_77_P_0,
1432 VEX_W_7C_P_2,
1433 VEX_W_7C_P_3,
1434 VEX_W_7D_P_2,
1435 VEX_W_7D_P_3,
1436 VEX_W_7E_P_1,
1437 VEX_W_7F_P_1,
1438 VEX_W_7F_P_2,
1439 VEX_W_AE_R_2_M_0,
1440 VEX_W_AE_R_3_M_0,
1441 VEX_W_C2_P_0,
1442 VEX_W_C2_P_1,
1443 VEX_W_C2_P_2,
1444 VEX_W_C2_P_3,
1445 VEX_W_C4_P_2,
1446 VEX_W_C5_P_2,
1447 VEX_W_D0_P_2,
1448 VEX_W_D0_P_3,
1449 VEX_W_D1_P_2,
1450 VEX_W_D2_P_2,
1451 VEX_W_D3_P_2,
1452 VEX_W_D4_P_2,
1453 VEX_W_D5_P_2,
1454 VEX_W_D6_P_2,
1455 VEX_W_D7_P_2_M_1,
1456 VEX_W_D8_P_2,
1457 VEX_W_D9_P_2,
1458 VEX_W_DA_P_2,
1459 VEX_W_DB_P_2,
1460 VEX_W_DC_P_2,
1461 VEX_W_DD_P_2,
1462 VEX_W_DE_P_2,
1463 VEX_W_DF_P_2,
1464 VEX_W_E0_P_2,
1465 VEX_W_E1_P_2,
1466 VEX_W_E2_P_2,
1467 VEX_W_E3_P_2,
1468 VEX_W_E4_P_2,
1469 VEX_W_E5_P_2,
1470 VEX_W_E6_P_1,
1471 VEX_W_E6_P_2,
1472 VEX_W_E6_P_3,
1473 VEX_W_E7_P_2_M_0,
1474 VEX_W_E8_P_2,
1475 VEX_W_E9_P_2,
1476 VEX_W_EA_P_2,
1477 VEX_W_EB_P_2,
1478 VEX_W_EC_P_2,
1479 VEX_W_ED_P_2,
1480 VEX_W_EE_P_2,
1481 VEX_W_EF_P_2,
1482 VEX_W_F0_P_3_M_0,
1483 VEX_W_F1_P_2,
1484 VEX_W_F2_P_2,
1485 VEX_W_F3_P_2,
1486 VEX_W_F4_P_2,
1487 VEX_W_F5_P_2,
1488 VEX_W_F6_P_2,
1489 VEX_W_F7_P_2,
1490 VEX_W_F8_P_2,
1491 VEX_W_F9_P_2,
1492 VEX_W_FA_P_2,
1493 VEX_W_FB_P_2,
1494 VEX_W_FC_P_2,
1495 VEX_W_FD_P_2,
1496 VEX_W_FE_P_2,
1497 VEX_W_3800_P_2,
1498 VEX_W_3801_P_2,
1499 VEX_W_3802_P_2,
1500 VEX_W_3803_P_2,
1501 VEX_W_3804_P_2,
1502 VEX_W_3805_P_2,
1503 VEX_W_3806_P_2,
1504 VEX_W_3807_P_2,
1505 VEX_W_3808_P_2,
1506 VEX_W_3809_P_2,
1507 VEX_W_380A_P_2,
1508 VEX_W_380B_P_2,
1509 VEX_W_380C_P_2,
1510 VEX_W_380D_P_2,
1511 VEX_W_380E_P_2,
1512 VEX_W_380F_P_2,
1513 VEX_W_3817_P_2,
1514 VEX_W_3818_P_2_M_0,
1515 VEX_W_3819_P_2_M_0,
1516 VEX_W_381A_P_2_M_0,
1517 VEX_W_381C_P_2,
1518 VEX_W_381D_P_2,
1519 VEX_W_381E_P_2,
1520 VEX_W_3820_P_2,
1521 VEX_W_3821_P_2,
1522 VEX_W_3822_P_2,
1523 VEX_W_3823_P_2,
1524 VEX_W_3824_P_2,
1525 VEX_W_3825_P_2,
1526 VEX_W_3828_P_2,
1527 VEX_W_3829_P_2,
1528 VEX_W_382A_P_2_M_0,
1529 VEX_W_382B_P_2,
1530 VEX_W_382C_P_2_M_0,
1531 VEX_W_382D_P_2_M_0,
1532 VEX_W_382E_P_2_M_0,
1533 VEX_W_382F_P_2_M_0,
1534 VEX_W_3830_P_2,
1535 VEX_W_3831_P_2,
1536 VEX_W_3832_P_2,
1537 VEX_W_3833_P_2,
1538 VEX_W_3834_P_2,
1539 VEX_W_3835_P_2,
1540 VEX_W_3837_P_2,
1541 VEX_W_3838_P_2,
1542 VEX_W_3839_P_2,
1543 VEX_W_383A_P_2,
1544 VEX_W_383B_P_2,
1545 VEX_W_383C_P_2,
1546 VEX_W_383D_P_2,
1547 VEX_W_383E_P_2,
1548 VEX_W_383F_P_2,
1549 VEX_W_3840_P_2,
1550 VEX_W_3841_P_2,
1551 VEX_W_38DB_P_2,
1552 VEX_W_38DC_P_2,
1553 VEX_W_38DD_P_2,
1554 VEX_W_38DE_P_2,
1555 VEX_W_38DF_P_2,
1556 VEX_W_3A04_P_2,
1557 VEX_W_3A05_P_2,
1558 VEX_W_3A06_P_2,
1559 VEX_W_3A08_P_2,
1560 VEX_W_3A09_P_2,
1561 VEX_W_3A0A_P_2,
1562 VEX_W_3A0B_P_2,
1563 VEX_W_3A0C_P_2,
1564 VEX_W_3A0D_P_2,
1565 VEX_W_3A0E_P_2,
1566 VEX_W_3A0F_P_2,
1567 VEX_W_3A14_P_2,
1568 VEX_W_3A15_P_2,
1569 VEX_W_3A18_P_2,
1570 VEX_W_3A19_P_2,
1571 VEX_W_3A20_P_2,
1572 VEX_W_3A21_P_2,
1573 VEX_W_3A40_P_2,
1574 VEX_W_3A41_P_2,
1575 VEX_W_3A42_P_2,
1576 VEX_W_3A44_P_2,
1577 VEX_W_3A48_P_2,
1578 VEX_W_3A49_P_2,
1579 VEX_W_3A4A_P_2,
1580 VEX_W_3A4B_P_2,
1581 VEX_W_3A4C_P_2,
1582 VEX_W_3A60_P_2,
1583 VEX_W_3A61_P_2,
1584 VEX_W_3A62_P_2,
1585 VEX_W_3A63_P_2,
1586 VEX_W_3ADF_P_2
1589 typedef void (*op_rtn) (int bytemode, int sizeflag);
1591 struct dis386 {
1592 const char *name;
1593 struct
1595 op_rtn rtn;
1596 int bytemode;
1597 } op[MAX_OPERANDS];
1600 /* Upper case letters in the instruction names here are macros.
1601 'A' => print 'b' if no register operands or suffix_always is true
1602 'B' => print 'b' if suffix_always is true
1603 'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
1604 size prefix
1605 'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
1606 suffix_always is true
1607 'E' => print 'e' if 32-bit form of jcxz
1608 'F' => print 'w' or 'l' depending on address size prefix (loop insns)
1609 'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
1610 'H' => print ",pt" or ",pn" branch hint
1611 'I' => honor following macro letter even in Intel mode (implemented only
1612 for some of the macro letters)
1613 'J' => print 'l'
1614 'K' => print 'd' or 'q' if rex prefix is present.
1615 'L' => print 'l' if suffix_always is true
1616 'M' => print 'r' if intel_mnemonic is false.
1617 'N' => print 'n' if instruction has no wait "prefix"
1618 'O' => print 'd' or 'o' (or 'q' in Intel mode)
1619 'P' => print 'w', 'l' or 'q' if instruction has an operand size prefix,
1620 or suffix_always is true. print 'q' if rex prefix is present.
1621 'Q' => print 'w', 'l' or 'q' for memory operand or suffix_always
1622 is true
1623 'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
1624 'S' => print 'w', 'l' or 'q' if suffix_always is true
1625 'T' => print 'q' in 64bit mode and behave as 'P' otherwise
1626 'U' => print 'q' in 64bit mode and behave as 'Q' otherwise
1627 'V' => print 'q' in 64bit mode and behave as 'S' otherwise
1628 'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
1629 'X' => print 's', 'd' depending on data16 prefix (for XMM)
1630 'Y' => 'q' if instruction has an REX 64bit overwrite prefix and
1631 suffix_always is true.
1632 'Z' => print 'q' in 64bit mode and behave as 'L' otherwise
1633 '!' => change condition from true to false or from false to true.
1634 '%' => add 1 upper case letter to the macro.
1636 2 upper case letter macros:
1637 "XY" => print 'x' or 'y' if no register operands or suffix_always
1638 is true.
1639 "XW" => print 's', 'd' depending on the VEX.W bit (for FMA)
1640 "LQ" => print 'l' ('d' in Intel mode) or 'q' for memory operand
1641 or suffix_always is true
1642 "LB" => print "abs" in 64bit mode and behave as 'B' otherwise
1643 "LS" => print "abs" in 64bit mode and behave as 'S' otherwise
1644 "LV" => print "abs" for 64bit operand and behave as 'S' otherwise
1646 Many of the above letters print nothing in Intel mode. See "putop"
1647 for the details.
1649 Braces '{' and '}', and vertical bars '|', indicate alternative
1650 mnemonic strings for AT&T and Intel. */
1652 static const struct dis386 dis386[] = {
1653 /* 00 */
1654 { "addB", { Eb, Gb } },
1655 { "addS", { Ev, Gv } },
1656 { "addB", { Gb, EbS } },
1657 { "addS", { Gv, EvS } },
1658 { "addB", { AL, Ib } },
1659 { "addS", { eAX, Iv } },
1660 { X86_64_TABLE (X86_64_06) },
1661 { X86_64_TABLE (X86_64_07) },
1662 /* 08 */
1663 { "orB", { Eb, Gb } },
1664 { "orS", { Ev, Gv } },
1665 { "orB", { Gb, EbS } },
1666 { "orS", { Gv, EvS } },
1667 { "orB", { AL, Ib } },
1668 { "orS", { eAX, Iv } },
1669 { X86_64_TABLE (X86_64_0D) },
1670 { Bad_Opcode }, /* 0x0f extended opcode escape */
1671 /* 10 */
1672 { "adcB", { Eb, Gb } },
1673 { "adcS", { Ev, Gv } },
1674 { "adcB", { Gb, EbS } },
1675 { "adcS", { Gv, EvS } },
1676 { "adcB", { AL, Ib } },
1677 { "adcS", { eAX, Iv } },
1678 { X86_64_TABLE (X86_64_16) },
1679 { X86_64_TABLE (X86_64_17) },
1680 /* 18 */
1681 { "sbbB", { Eb, Gb } },
1682 { "sbbS", { Ev, Gv } },
1683 { "sbbB", { Gb, EbS } },
1684 { "sbbS", { Gv, EvS } },
1685 { "sbbB", { AL, Ib } },
1686 { "sbbS", { eAX, Iv } },
1687 { X86_64_TABLE (X86_64_1E) },
1688 { X86_64_TABLE (X86_64_1F) },
1689 /* 20 */
1690 { "andB", { Eb, Gb } },
1691 { "andS", { Ev, Gv } },
1692 { "andB", { Gb, EbS } },
1693 { "andS", { Gv, EvS } },
1694 { "andB", { AL, Ib } },
1695 { "andS", { eAX, Iv } },
1696 { Bad_Opcode }, /* SEG ES prefix */
1697 { X86_64_TABLE (X86_64_27) },
1698 /* 28 */
1699 { "subB", { Eb, Gb } },
1700 { "subS", { Ev, Gv } },
1701 { "subB", { Gb, EbS } },
1702 { "subS", { Gv, EvS } },
1703 { "subB", { AL, Ib } },
1704 { "subS", { eAX, Iv } },
1705 { Bad_Opcode }, /* SEG CS prefix */
1706 { X86_64_TABLE (X86_64_2F) },
1707 /* 30 */
1708 { "xorB", { Eb, Gb } },
1709 { "xorS", { Ev, Gv } },
1710 { "xorB", { Gb, EbS } },
1711 { "xorS", { Gv, EvS } },
1712 { "xorB", { AL, Ib } },
1713 { "xorS", { eAX, Iv } },
1714 { Bad_Opcode }, /* SEG SS prefix */
1715 { X86_64_TABLE (X86_64_37) },
1716 /* 38 */
1717 { "cmpB", { Eb, Gb } },
1718 { "cmpS", { Ev, Gv } },
1719 { "cmpB", { Gb, EbS } },
1720 { "cmpS", { Gv, EvS } },
1721 { "cmpB", { AL, Ib } },
1722 { "cmpS", { eAX, Iv } },
1723 { Bad_Opcode }, /* SEG DS prefix */
1724 { X86_64_TABLE (X86_64_3F) },
1725 /* 40 */
1726 { "inc{S|}", { RMeAX } },
1727 { "inc{S|}", { RMeCX } },
1728 { "inc{S|}", { RMeDX } },
1729 { "inc{S|}", { RMeBX } },
1730 { "inc{S|}", { RMeSP } },
1731 { "inc{S|}", { RMeBP } },
1732 { "inc{S|}", { RMeSI } },
1733 { "inc{S|}", { RMeDI } },
1734 /* 48 */
1735 { "dec{S|}", { RMeAX } },
1736 { "dec{S|}", { RMeCX } },
1737 { "dec{S|}", { RMeDX } },
1738 { "dec{S|}", { RMeBX } },
1739 { "dec{S|}", { RMeSP } },
1740 { "dec{S|}", { RMeBP } },
1741 { "dec{S|}", { RMeSI } },
1742 { "dec{S|}", { RMeDI } },
1743 /* 50 */
1744 { "pushV", { RMrAX } },
1745 { "pushV", { RMrCX } },
1746 { "pushV", { RMrDX } },
1747 { "pushV", { RMrBX } },
1748 { "pushV", { RMrSP } },
1749 { "pushV", { RMrBP } },
1750 { "pushV", { RMrSI } },
1751 { "pushV", { RMrDI } },
1752 /* 58 */
1753 { "popV", { RMrAX } },
1754 { "popV", { RMrCX } },
1755 { "popV", { RMrDX } },
1756 { "popV", { RMrBX } },
1757 { "popV", { RMrSP } },
1758 { "popV", { RMrBP } },
1759 { "popV", { RMrSI } },
1760 { "popV", { RMrDI } },
1761 /* 60 */
1762 { X86_64_TABLE (X86_64_60) },
1763 { X86_64_TABLE (X86_64_61) },
1764 { X86_64_TABLE (X86_64_62) },
1765 { X86_64_TABLE (X86_64_63) },
1766 { Bad_Opcode }, /* seg fs */
1767 { Bad_Opcode }, /* seg gs */
1768 { Bad_Opcode }, /* op size prefix */
1769 { Bad_Opcode }, /* adr size prefix */
1770 /* 68 */
1771 { "pushT", { Iq } },
1772 { "imulS", { Gv, Ev, Iv } },
1773 { "pushT", { sIb } },
1774 { "imulS", { Gv, Ev, sIb } },
1775 { "ins{b|}", { Ybr, indirDX } },
1776 { X86_64_TABLE (X86_64_6D) },
1777 { "outs{b|}", { indirDXr, Xb } },
1778 { X86_64_TABLE (X86_64_6F) },
1779 /* 70 */
1780 { "joH", { Jb, XX, cond_jump_flag } },
1781 { "jnoH", { Jb, XX, cond_jump_flag } },
1782 { "jbH", { Jb, XX, cond_jump_flag } },
1783 { "jaeH", { Jb, XX, cond_jump_flag } },
1784 { "jeH", { Jb, XX, cond_jump_flag } },
1785 { "jneH", { Jb, XX, cond_jump_flag } },
1786 { "jbeH", { Jb, XX, cond_jump_flag } },
1787 { "jaH", { Jb, XX, cond_jump_flag } },
1788 /* 78 */
1789 { "jsH", { Jb, XX, cond_jump_flag } },
1790 { "jnsH", { Jb, XX, cond_jump_flag } },
1791 { "jpH", { Jb, XX, cond_jump_flag } },
1792 { "jnpH", { Jb, XX, cond_jump_flag } },
1793 { "jlH", { Jb, XX, cond_jump_flag } },
1794 { "jgeH", { Jb, XX, cond_jump_flag } },
1795 { "jleH", { Jb, XX, cond_jump_flag } },
1796 { "jgH", { Jb, XX, cond_jump_flag } },
1797 /* 80 */
1798 { REG_TABLE (REG_80) },
1799 { REG_TABLE (REG_81) },
1800 { Bad_Opcode },
1801 { REG_TABLE (REG_82) },
1802 { "testB", { Eb, Gb } },
1803 { "testS", { Ev, Gv } },
1804 { "xchgB", { Eb, Gb } },
1805 { "xchgS", { Ev, Gv } },
1806 /* 88 */
1807 { "movB", { Eb, Gb } },
1808 { "movS", { Ev, Gv } },
1809 { "movB", { Gb, EbS } },
1810 { "movS", { Gv, EvS } },
1811 { "movD", { Sv, Sw } },
1812 { MOD_TABLE (MOD_8D) },
1813 { "movD", { Sw, Sv } },
1814 { REG_TABLE (REG_8F) },
1815 /* 90 */
1816 { PREFIX_TABLE (PREFIX_90) },
1817 { "xchgS", { RMeCX, eAX } },
1818 { "xchgS", { RMeDX, eAX } },
1819 { "xchgS", { RMeBX, eAX } },
1820 { "xchgS", { RMeSP, eAX } },
1821 { "xchgS", { RMeBP, eAX } },
1822 { "xchgS", { RMeSI, eAX } },
1823 { "xchgS", { RMeDI, eAX } },
1824 /* 98 */
1825 { "cW{t|}R", { XX } },
1826 { "cR{t|}O", { XX } },
1827 { X86_64_TABLE (X86_64_9A) },
1828 { Bad_Opcode }, /* fwait */
1829 { "pushfT", { XX } },
1830 { "popfT", { XX } },
1831 { "sahf", { XX } },
1832 { "lahf", { XX } },
1833 /* a0 */
1834 { "mov%LB", { AL, Ob } },
1835 { "mov%LS", { eAX, Ov } },
1836 { "mov%LB", { Ob, AL } },
1837 { "mov%LS", { Ov, eAX } },
1838 { "movs{b|}", { Ybr, Xb } },
1839 { "movs{R|}", { Yvr, Xv } },
1840 { "cmps{b|}", { Xb, Yb } },
1841 { "cmps{R|}", { Xv, Yv } },
1842 /* a8 */
1843 { "testB", { AL, Ib } },
1844 { "testS", { eAX, Iv } },
1845 { "stosB", { Ybr, AL } },
1846 { "stosS", { Yvr, eAX } },
1847 { "lodsB", { ALr, Xb } },
1848 { "lodsS", { eAXr, Xv } },
1849 { "scasB", { AL, Yb } },
1850 { "scasS", { eAX, Yv } },
1851 /* b0 */
1852 { "movB", { RMAL, Ib } },
1853 { "movB", { RMCL, Ib } },
1854 { "movB", { RMDL, Ib } },
1855 { "movB", { RMBL, Ib } },
1856 { "movB", { RMAH, Ib } },
1857 { "movB", { RMCH, Ib } },
1858 { "movB", { RMDH, Ib } },
1859 { "movB", { RMBH, Ib } },
1860 /* b8 */
1861 { "mov%LV", { RMeAX, Iv64 } },
1862 { "mov%LV", { RMeCX, Iv64 } },
1863 { "mov%LV", { RMeDX, Iv64 } },
1864 { "mov%LV", { RMeBX, Iv64 } },
1865 { "mov%LV", { RMeSP, Iv64 } },
1866 { "mov%LV", { RMeBP, Iv64 } },
1867 { "mov%LV", { RMeSI, Iv64 } },
1868 { "mov%LV", { RMeDI, Iv64 } },
1869 /* c0 */
1870 { REG_TABLE (REG_C0) },
1871 { REG_TABLE (REG_C1) },
1872 { "retT", { Iw } },
1873 { "retT", { XX } },
1874 { X86_64_TABLE (X86_64_C4) },
1875 { X86_64_TABLE (X86_64_C5) },
1876 { REG_TABLE (REG_C6) },
1877 { REG_TABLE (REG_C7) },
1878 /* c8 */
1879 { "enterT", { Iw, Ib } },
1880 { "leaveT", { XX } },
1881 { "Jret{|f}P", { Iw } },
1882 { "Jret{|f}P", { XX } },
1883 { "int3", { XX } },
1884 { "int", { Ib } },
1885 { X86_64_TABLE (X86_64_CE) },
1886 { "iretP", { XX } },
1887 /* d0 */
1888 { REG_TABLE (REG_D0) },
1889 { REG_TABLE (REG_D1) },
1890 { REG_TABLE (REG_D2) },
1891 { REG_TABLE (REG_D3) },
1892 { X86_64_TABLE (X86_64_D4) },
1893 { X86_64_TABLE (X86_64_D5) },
1894 { Bad_Opcode },
1895 { "xlat", { DSBX } },
1896 /* d8 */
1897 { FLOAT },
1898 { FLOAT },
1899 { FLOAT },
1900 { FLOAT },
1901 { FLOAT },
1902 { FLOAT },
1903 { FLOAT },
1904 { FLOAT },
1905 /* e0 */
1906 { "loopneFH", { Jb, XX, loop_jcxz_flag } },
1907 { "loopeFH", { Jb, XX, loop_jcxz_flag } },
1908 { "loopFH", { Jb, XX, loop_jcxz_flag } },
1909 { "jEcxzH", { Jb, XX, loop_jcxz_flag } },
1910 { "inB", { AL, Ib } },
1911 { "inG", { zAX, Ib } },
1912 { "outB", { Ib, AL } },
1913 { "outG", { Ib, zAX } },
1914 /* e8 */
1915 { "callT", { Jv } },
1916 { "jmpT", { Jv } },
1917 { X86_64_TABLE (X86_64_EA) },
1918 { "jmp", { Jb } },
1919 { "inB", { AL, indirDX } },
1920 { "inG", { zAX, indirDX } },
1921 { "outB", { indirDX, AL } },
1922 { "outG", { indirDX, zAX } },
1923 /* f0 */
1924 { Bad_Opcode }, /* lock prefix */
1925 { "icebp", { XX } },
1926 { Bad_Opcode }, /* repne */
1927 { Bad_Opcode }, /* repz */
1928 { "hlt", { XX } },
1929 { "cmc", { XX } },
1930 { REG_TABLE (REG_F6) },
1931 { REG_TABLE (REG_F7) },
1932 /* f8 */
1933 { "clc", { XX } },
1934 { "stc", { XX } },
1935 { "cli", { XX } },
1936 { "sti", { XX } },
1937 { "cld", { XX } },
1938 { "std", { XX } },
1939 { REG_TABLE (REG_FE) },
1940 { REG_TABLE (REG_FF) },
1943 static const struct dis386 dis386_twobyte[] = {
1944 /* 00 */
1945 { REG_TABLE (REG_0F00 ) },
1946 { REG_TABLE (REG_0F01 ) },
1947 { "larS", { Gv, Ew } },
1948 { "lslS", { Gv, Ew } },
1949 { Bad_Opcode },
1950 { "syscall", { XX } },
1951 { "clts", { XX } },
1952 { "sysretP", { XX } },
1953 /* 08 */
1954 { "invd", { XX } },
1955 { "wbinvd", { XX } },
1956 { Bad_Opcode },
1957 { "ud2a", { XX } },
1958 { Bad_Opcode },
1959 { REG_TABLE (REG_0F0D) },
1960 { "femms", { XX } },
1961 { "", { MX, EM, OPSUF } }, /* See OP_3DNowSuffix. */
1962 /* 10 */
1963 { PREFIX_TABLE (PREFIX_0F10) },
1964 { PREFIX_TABLE (PREFIX_0F11) },
1965 { PREFIX_TABLE (PREFIX_0F12) },
1966 { MOD_TABLE (MOD_0F13) },
1967 { "unpcklpX", { XM, EXx } },
1968 { "unpckhpX", { XM, EXx } },
1969 { PREFIX_TABLE (PREFIX_0F16) },
1970 { MOD_TABLE (MOD_0F17) },
1971 /* 18 */
1972 { REG_TABLE (REG_0F18) },
1973 { "nopQ", { Ev } },
1974 { "nopQ", { Ev } },
1975 { "nopQ", { Ev } },
1976 { "nopQ", { Ev } },
1977 { "nopQ", { Ev } },
1978 { "nopQ", { Ev } },
1979 { "nopQ", { Ev } },
1980 /* 20 */
1981 { MOD_TABLE (MOD_0F20) },
1982 { MOD_TABLE (MOD_0F21) },
1983 { MOD_TABLE (MOD_0F22) },
1984 { MOD_TABLE (MOD_0F23) },
1985 { MOD_TABLE (MOD_0F24) },
1986 { Bad_Opcode },
1987 { MOD_TABLE (MOD_0F26) },
1988 { Bad_Opcode },
1989 /* 28 */
1990 { "movapX", { XM, EXx } },
1991 { "movapX", { EXxS, XM } },
1992 { PREFIX_TABLE (PREFIX_0F2A) },
1993 { PREFIX_TABLE (PREFIX_0F2B) },
1994 { PREFIX_TABLE (PREFIX_0F2C) },
1995 { PREFIX_TABLE (PREFIX_0F2D) },
1996 { PREFIX_TABLE (PREFIX_0F2E) },
1997 { PREFIX_TABLE (PREFIX_0F2F) },
1998 /* 30 */
1999 { "wrmsr", { XX } },
2000 { "rdtsc", { XX } },
2001 { "rdmsr", { XX } },
2002 { "rdpmc", { XX } },
2003 { "sysenter", { XX } },
2004 { "sysexit", { XX } },
2005 { Bad_Opcode },
2006 { "getsec", { XX } },
2007 /* 38 */
2008 { THREE_BYTE_TABLE (THREE_BYTE_0F38) },
2009 { Bad_Opcode },
2010 { THREE_BYTE_TABLE (THREE_BYTE_0F3A) },
2011 { Bad_Opcode },
2012 { Bad_Opcode },
2013 { Bad_Opcode },
2014 { Bad_Opcode },
2015 { Bad_Opcode },
2016 /* 40 */
2017 { "cmovoS", { Gv, Ev } },
2018 { "cmovnoS", { Gv, Ev } },
2019 { "cmovbS", { Gv, Ev } },
2020 { "cmovaeS", { Gv, Ev } },
2021 { "cmoveS", { Gv, Ev } },
2022 { "cmovneS", { Gv, Ev } },
2023 { "cmovbeS", { Gv, Ev } },
2024 { "cmovaS", { Gv, Ev } },
2025 /* 48 */
2026 { "cmovsS", { Gv, Ev } },
2027 { "cmovnsS", { Gv, Ev } },
2028 { "cmovpS", { Gv, Ev } },
2029 { "cmovnpS", { Gv, Ev } },
2030 { "cmovlS", { Gv, Ev } },
2031 { "cmovgeS", { Gv, Ev } },
2032 { "cmovleS", { Gv, Ev } },
2033 { "cmovgS", { Gv, Ev } },
2034 /* 50 */
2035 { MOD_TABLE (MOD_0F51) },
2036 { PREFIX_TABLE (PREFIX_0F51) },
2037 { PREFIX_TABLE (PREFIX_0F52) },
2038 { PREFIX_TABLE (PREFIX_0F53) },
2039 { "andpX", { XM, EXx } },
2040 { "andnpX", { XM, EXx } },
2041 { "orpX", { XM, EXx } },
2042 { "xorpX", { XM, EXx } },
2043 /* 58 */
2044 { PREFIX_TABLE (PREFIX_0F58) },
2045 { PREFIX_TABLE (PREFIX_0F59) },
2046 { PREFIX_TABLE (PREFIX_0F5A) },
2047 { PREFIX_TABLE (PREFIX_0F5B) },
2048 { PREFIX_TABLE (PREFIX_0F5C) },
2049 { PREFIX_TABLE (PREFIX_0F5D) },
2050 { PREFIX_TABLE (PREFIX_0F5E) },
2051 { PREFIX_TABLE (PREFIX_0F5F) },
2052 /* 60 */
2053 { PREFIX_TABLE (PREFIX_0F60) },
2054 { PREFIX_TABLE (PREFIX_0F61) },
2055 { PREFIX_TABLE (PREFIX_0F62) },
2056 { "packsswb", { MX, EM } },
2057 { "pcmpgtb", { MX, EM } },
2058 { "pcmpgtw", { MX, EM } },
2059 { "pcmpgtd", { MX, EM } },
2060 { "packuswb", { MX, EM } },
2061 /* 68 */
2062 { "punpckhbw", { MX, EM } },
2063 { "punpckhwd", { MX, EM } },
2064 { "punpckhdq", { MX, EM } },
2065 { "packssdw", { MX, EM } },
2066 { PREFIX_TABLE (PREFIX_0F6C) },
2067 { PREFIX_TABLE (PREFIX_0F6D) },
2068 { "movK", { MX, Edq } },
2069 { PREFIX_TABLE (PREFIX_0F6F) },
2070 /* 70 */
2071 { PREFIX_TABLE (PREFIX_0F70) },
2072 { REG_TABLE (REG_0F71) },
2073 { REG_TABLE (REG_0F72) },
2074 { REG_TABLE (REG_0F73) },
2075 { "pcmpeqb", { MX, EM } },
2076 { "pcmpeqw", { MX, EM } },
2077 { "pcmpeqd", { MX, EM } },
2078 { "emms", { XX } },
2079 /* 78 */
2080 { PREFIX_TABLE (PREFIX_0F78) },
2081 { PREFIX_TABLE (PREFIX_0F79) },
2082 { THREE_BYTE_TABLE (THREE_BYTE_0F7A) },
2083 { Bad_Opcode },
2084 { PREFIX_TABLE (PREFIX_0F7C) },
2085 { PREFIX_TABLE (PREFIX_0F7D) },
2086 { PREFIX_TABLE (PREFIX_0F7E) },
2087 { PREFIX_TABLE (PREFIX_0F7F) },
2088 /* 80 */
2089 { "joH", { Jv, XX, cond_jump_flag } },
2090 { "jnoH", { Jv, XX, cond_jump_flag } },
2091 { "jbH", { Jv, XX, cond_jump_flag } },
2092 { "jaeH", { Jv, XX, cond_jump_flag } },
2093 { "jeH", { Jv, XX, cond_jump_flag } },
2094 { "jneH", { Jv, XX, cond_jump_flag } },
2095 { "jbeH", { Jv, XX, cond_jump_flag } },
2096 { "jaH", { Jv, XX, cond_jump_flag } },
2097 /* 88 */
2098 { "jsH", { Jv, XX, cond_jump_flag } },
2099 { "jnsH", { Jv, XX, cond_jump_flag } },
2100 { "jpH", { Jv, XX, cond_jump_flag } },
2101 { "jnpH", { Jv, XX, cond_jump_flag } },
2102 { "jlH", { Jv, XX, cond_jump_flag } },
2103 { "jgeH", { Jv, XX, cond_jump_flag } },
2104 { "jleH", { Jv, XX, cond_jump_flag } },
2105 { "jgH", { Jv, XX, cond_jump_flag } },
2106 /* 90 */
2107 { "seto", { Eb } },
2108 { "setno", { Eb } },
2109 { "setb", { Eb } },
2110 { "setae", { Eb } },
2111 { "sete", { Eb } },
2112 { "setne", { Eb } },
2113 { "setbe", { Eb } },
2114 { "seta", { Eb } },
2115 /* 98 */
2116 { "sets", { Eb } },
2117 { "setns", { Eb } },
2118 { "setp", { Eb } },
2119 { "setnp", { Eb } },
2120 { "setl", { Eb } },
2121 { "setge", { Eb } },
2122 { "setle", { Eb } },
2123 { "setg", { Eb } },
2124 /* a0 */
2125 { "pushT", { fs } },
2126 { "popT", { fs } },
2127 { "cpuid", { XX } },
2128 { "btS", { Ev, Gv } },
2129 { "shldS", { Ev, Gv, Ib } },
2130 { "shldS", { Ev, Gv, CL } },
2131 { REG_TABLE (REG_0FA6) },
2132 { REG_TABLE (REG_0FA7) },
2133 /* a8 */
2134 { "pushT", { gs } },
2135 { "popT", { gs } },
2136 { "rsm", { XX } },
2137 { "btsS", { Ev, Gv } },
2138 { "shrdS", { Ev, Gv, Ib } },
2139 { "shrdS", { Ev, Gv, CL } },
2140 { REG_TABLE (REG_0FAE) },
2141 { "imulS", { Gv, Ev } },
2142 /* b0 */
2143 { "cmpxchgB", { Eb, Gb } },
2144 { "cmpxchgS", { Ev, Gv } },
2145 { MOD_TABLE (MOD_0FB2) },
2146 { "btrS", { Ev, Gv } },
2147 { MOD_TABLE (MOD_0FB4) },
2148 { MOD_TABLE (MOD_0FB5) },
2149 { "movz{bR|x}", { Gv, Eb } },
2150 { "movz{wR|x}", { Gv, Ew } }, /* yes, there really is movzww ! */
2151 /* b8 */
2152 { PREFIX_TABLE (PREFIX_0FB8) },
2153 { "ud2b", { XX } },
2154 { REG_TABLE (REG_0FBA) },
2155 { "btcS", { Ev, Gv } },
2156 { "bsfS", { Gv, Ev } },
2157 { PREFIX_TABLE (PREFIX_0FBD) },
2158 { "movs{bR|x}", { Gv, Eb } },
2159 { "movs{wR|x}", { Gv, Ew } }, /* yes, there really is movsww ! */
2160 /* c0 */
2161 { "xaddB", { Eb, Gb } },
2162 { "xaddS", { Ev, Gv } },
2163 { PREFIX_TABLE (PREFIX_0FC2) },
2164 { PREFIX_TABLE (PREFIX_0FC3) },
2165 { "pinsrw", { MX, Edqw, Ib } },
2166 { "pextrw", { Gdq, MS, Ib } },
2167 { "shufpX", { XM, EXx, Ib } },
2168 { REG_TABLE (REG_0FC7) },
2169 /* c8 */
2170 { "bswap", { RMeAX } },
2171 { "bswap", { RMeCX } },
2172 { "bswap", { RMeDX } },
2173 { "bswap", { RMeBX } },
2174 { "bswap", { RMeSP } },
2175 { "bswap", { RMeBP } },
2176 { "bswap", { RMeSI } },
2177 { "bswap", { RMeDI } },
2178 /* d0 */
2179 { PREFIX_TABLE (PREFIX_0FD0) },
2180 { "psrlw", { MX, EM } },
2181 { "psrld", { MX, EM } },
2182 { "psrlq", { MX, EM } },
2183 { "paddq", { MX, EM } },
2184 { "pmullw", { MX, EM } },
2185 { PREFIX_TABLE (PREFIX_0FD6) },
2186 { MOD_TABLE (MOD_0FD7) },
2187 /* d8 */
2188 { "psubusb", { MX, EM } },
2189 { "psubusw", { MX, EM } },
2190 { "pminub", { MX, EM } },
2191 { "pand", { MX, EM } },
2192 { "paddusb", { MX, EM } },
2193 { "paddusw", { MX, EM } },
2194 { "pmaxub", { MX, EM } },
2195 { "pandn", { MX, EM } },
2196 /* e0 */
2197 { "pavgb", { MX, EM } },
2198 { "psraw", { MX, EM } },
2199 { "psrad", { MX, EM } },
2200 { "pavgw", { MX, EM } },
2201 { "pmulhuw", { MX, EM } },
2202 { "pmulhw", { MX, EM } },
2203 { PREFIX_TABLE (PREFIX_0FE6) },
2204 { PREFIX_TABLE (PREFIX_0FE7) },
2205 /* e8 */
2206 { "psubsb", { MX, EM } },
2207 { "psubsw", { MX, EM } },
2208 { "pminsw", { MX, EM } },
2209 { "por", { MX, EM } },
2210 { "paddsb", { MX, EM } },
2211 { "paddsw", { MX, EM } },
2212 { "pmaxsw", { MX, EM } },
2213 { "pxor", { MX, EM } },
2214 /* f0 */
2215 { PREFIX_TABLE (PREFIX_0FF0) },
2216 { "psllw", { MX, EM } },
2217 { "pslld", { MX, EM } },
2218 { "psllq", { MX, EM } },
2219 { "pmuludq", { MX, EM } },
2220 { "pmaddwd", { MX, EM } },
2221 { "psadbw", { MX, EM } },
2222 { PREFIX_TABLE (PREFIX_0FF7) },
2223 /* f8 */
2224 { "psubb", { MX, EM } },
2225 { "psubw", { MX, EM } },
2226 { "psubd", { MX, EM } },
2227 { "psubq", { MX, EM } },
2228 { "paddb", { MX, EM } },
2229 { "paddw", { MX, EM } },
2230 { "paddd", { MX, EM } },
2231 { Bad_Opcode },
2234 static const unsigned char onebyte_has_modrm[256] = {
2235 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2236 /* ------------------------------- */
2237 /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
2238 /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
2239 /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
2240 /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
2241 /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
2242 /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
2243 /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
2244 /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
2245 /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
2246 /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
2247 /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
2248 /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
2249 /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
2250 /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
2251 /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
2252 /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1 /* f0 */
2253 /* ------------------------------- */
2254 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2257 static const unsigned char twobyte_has_modrm[256] = {
2258 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2259 /* ------------------------------- */
2260 /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
2261 /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
2262 /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
2263 /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
2264 /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
2265 /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
2266 /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
2267 /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
2268 /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
2269 /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
2270 /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
2271 /* b0 */ 1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1, /* bf */
2272 /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
2273 /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
2274 /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
2275 /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0 /* ff */
2276 /* ------------------------------- */
2277 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2280 static char obuf[100];
2281 static char *obufp;
2282 static char *mnemonicendp;
2283 static char scratchbuf[100];
2284 static unsigned char *start_codep;
2285 static unsigned char *insn_codep;
2286 static unsigned char *codep;
2287 static int last_lock_prefix;
2288 static int last_repz_prefix;
2289 static int last_repnz_prefix;
2290 static int last_data_prefix;
2291 static int last_addr_prefix;
2292 static int last_rex_prefix;
2293 static int last_seg_prefix;
2294 #define MAX_CODE_LENGTH 15
2295 /* We can up to 14 prefixes since the maximum instruction length is
2296 15bytes. */
2297 static int all_prefixes[MAX_CODE_LENGTH - 1];
2298 static disassemble_info *the_info;
2299 static struct
2301 int mod;
2302 int reg;
2303 int rm;
2305 modrm;
2306 static unsigned char need_modrm;
2307 static struct
2309 int register_specifier;
2310 int length;
2311 int prefix;
2312 int w;
2314 vex;
2315 static unsigned char need_vex;
2316 static unsigned char need_vex_reg;
2317 static unsigned char vex_w_done;
2319 struct op
2321 const char *name;
2322 unsigned int len;
2325 /* If we are accessing mod/rm/reg without need_modrm set, then the
2326 values are stale. Hitting this abort likely indicates that you
2327 need to update onebyte_has_modrm or twobyte_has_modrm. */
2328 #define MODRM_CHECK if (!need_modrm) abort ()
2330 static const char **names64;
2331 static const char **names32;
2332 static const char **names16;
2333 static const char **names8;
2334 static const char **names8rex;
2335 static const char **names_seg;
2336 static const char *index64;
2337 static const char *index32;
2338 static const char **index16;
2340 static const char *intel_names64[] = {
2341 "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
2342 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2344 static const char *intel_names32[] = {
2345 "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
2346 "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
2348 static const char *intel_names16[] = {
2349 "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
2350 "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
2352 static const char *intel_names8[] = {
2353 "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
2355 static const char *intel_names8rex[] = {
2356 "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
2357 "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
2359 static const char *intel_names_seg[] = {
2360 "es", "cs", "ss", "ds", "fs", "gs", "?", "?",
2362 static const char *intel_index64 = "riz";
2363 static const char *intel_index32 = "eiz";
2364 static const char *intel_index16[] = {
2365 "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
2368 static const char *att_names64[] = {
2369 "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
2370 "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
2372 static const char *att_names32[] = {
2373 "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
2374 "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
2376 static const char *att_names16[] = {
2377 "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
2378 "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
2380 static const char *att_names8[] = {
2381 "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
2383 static const char *att_names8rex[] = {
2384 "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
2385 "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
2387 static const char *att_names_seg[] = {
2388 "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
2390 static const char *att_index64 = "%riz";
2391 static const char *att_index32 = "%eiz";
2392 static const char *att_index16[] = {
2393 "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
2396 static const char **names_mm;
2397 static const char *intel_names_mm[] = {
2398 "mm0", "mm1", "mm2", "mm3",
2399 "mm4", "mm5", "mm6", "mm7"
2401 static const char *att_names_mm[] = {
2402 "%mm0", "%mm1", "%mm2", "%mm3",
2403 "%mm4", "%mm5", "%mm6", "%mm7"
2406 static const char **names_xmm;
2407 static const char *intel_names_xmm[] = {
2408 "xmm0", "xmm1", "xmm2", "xmm3",
2409 "xmm4", "xmm5", "xmm6", "xmm7",
2410 "xmm8", "xmm9", "xmm10", "xmm11",
2411 "xmm12", "xmm13", "xmm14", "xmm15"
2413 static const char *att_names_xmm[] = {
2414 "%xmm0", "%xmm1", "%xmm2", "%xmm3",
2415 "%xmm4", "%xmm5", "%xmm6", "%xmm7",
2416 "%xmm8", "%xmm9", "%xmm10", "%xmm11",
2417 "%xmm12", "%xmm13", "%xmm14", "%xmm15"
2420 static const char **names_ymm;
2421 static const char *intel_names_ymm[] = {
2422 "ymm0", "ymm1", "ymm2", "ymm3",
2423 "ymm4", "ymm5", "ymm6", "ymm7",
2424 "ymm8", "ymm9", "ymm10", "ymm11",
2425 "ymm12", "ymm13", "ymm14", "ymm15"
2427 static const char *att_names_ymm[] = {
2428 "%ymm0", "%ymm1", "%ymm2", "%ymm3",
2429 "%ymm4", "%ymm5", "%ymm6", "%ymm7",
2430 "%ymm8", "%ymm9", "%ymm10", "%ymm11",
2431 "%ymm12", "%ymm13", "%ymm14", "%ymm15"
2434 static const struct dis386 reg_table[][8] = {
2435 /* REG_80 */
2437 { "addA", { Eb, Ib } },
2438 { "orA", { Eb, Ib } },
2439 { "adcA", { Eb, Ib } },
2440 { "sbbA", { Eb, Ib } },
2441 { "andA", { Eb, Ib } },
2442 { "subA", { Eb, Ib } },
2443 { "xorA", { Eb, Ib } },
2444 { "cmpA", { Eb, Ib } },
2446 /* REG_81 */
2448 { "addQ", { Ev, Iv } },
2449 { "orQ", { Ev, Iv } },
2450 { "adcQ", { Ev, Iv } },
2451 { "sbbQ", { Ev, Iv } },
2452 { "andQ", { Ev, Iv } },
2453 { "subQ", { Ev, Iv } },
2454 { "xorQ", { Ev, Iv } },
2455 { "cmpQ", { Ev, Iv } },
2457 /* REG_82 */
2459 { "addQ", { Ev, sIb } },
2460 { "orQ", { Ev, sIb } },
2461 { "adcQ", { Ev, sIb } },
2462 { "sbbQ", { Ev, sIb } },
2463 { "andQ", { Ev, sIb } },
2464 { "subQ", { Ev, sIb } },
2465 { "xorQ", { Ev, sIb } },
2466 { "cmpQ", { Ev, sIb } },
2468 /* REG_8F */
2470 { "popU", { stackEv } },
2471 { XOP_8F_TABLE (XOP_09) },
2472 { Bad_Opcode },
2473 { Bad_Opcode },
2474 { Bad_Opcode },
2475 { XOP_8F_TABLE (XOP_09) },
2477 /* REG_C0 */
2479 { "rolA", { Eb, Ib } },
2480 { "rorA", { Eb, Ib } },
2481 { "rclA", { Eb, Ib } },
2482 { "rcrA", { Eb, Ib } },
2483 { "shlA", { Eb, Ib } },
2484 { "shrA", { Eb, Ib } },
2485 { Bad_Opcode },
2486 { "sarA", { Eb, Ib } },
2488 /* REG_C1 */
2490 { "rolQ", { Ev, Ib } },
2491 { "rorQ", { Ev, Ib } },
2492 { "rclQ", { Ev, Ib } },
2493 { "rcrQ", { Ev, Ib } },
2494 { "shlQ", { Ev, Ib } },
2495 { "shrQ", { Ev, Ib } },
2496 { Bad_Opcode },
2497 { "sarQ", { Ev, Ib } },
2499 /* REG_C6 */
2501 { "movA", { Eb, Ib } },
2503 /* REG_C7 */
2505 { "movQ", { Ev, Iv } },
2507 /* REG_D0 */
2509 { "rolA", { Eb, I1 } },
2510 { "rorA", { Eb, I1 } },
2511 { "rclA", { Eb, I1 } },
2512 { "rcrA", { Eb, I1 } },
2513 { "shlA", { Eb, I1 } },
2514 { "shrA", { Eb, I1 } },
2515 { Bad_Opcode },
2516 { "sarA", { Eb, I1 } },
2518 /* REG_D1 */
2520 { "rolQ", { Ev, I1 } },
2521 { "rorQ", { Ev, I1 } },
2522 { "rclQ", { Ev, I1 } },
2523 { "rcrQ", { Ev, I1 } },
2524 { "shlQ", { Ev, I1 } },
2525 { "shrQ", { Ev, I1 } },
2526 { Bad_Opcode },
2527 { "sarQ", { Ev, I1 } },
2529 /* REG_D2 */
2531 { "rolA", { Eb, CL } },
2532 { "rorA", { Eb, CL } },
2533 { "rclA", { Eb, CL } },
2534 { "rcrA", { Eb, CL } },
2535 { "shlA", { Eb, CL } },
2536 { "shrA", { Eb, CL } },
2537 { Bad_Opcode },
2538 { "sarA", { Eb, CL } },
2540 /* REG_D3 */
2542 { "rolQ", { Ev, CL } },
2543 { "rorQ", { Ev, CL } },
2544 { "rclQ", { Ev, CL } },
2545 { "rcrQ", { Ev, CL } },
2546 { "shlQ", { Ev, CL } },
2547 { "shrQ", { Ev, CL } },
2548 { Bad_Opcode },
2549 { "sarQ", { Ev, CL } },
2551 /* REG_F6 */
2553 { "testA", { Eb, Ib } },
2554 { Bad_Opcode },
2555 { "notA", { Eb } },
2556 { "negA", { Eb } },
2557 { "mulA", { Eb } }, /* Don't print the implicit %al register, */
2558 { "imulA", { Eb } }, /* to distinguish these opcodes from other */
2559 { "divA", { Eb } }, /* mul/imul opcodes. Do the same for div */
2560 { "idivA", { Eb } }, /* and idiv for consistency. */
2562 /* REG_F7 */
2564 { "testQ", { Ev, Iv } },
2565 { Bad_Opcode },
2566 { "notQ", { Ev } },
2567 { "negQ", { Ev } },
2568 { "mulQ", { Ev } }, /* Don't print the implicit register. */
2569 { "imulQ", { Ev } },
2570 { "divQ", { Ev } },
2571 { "idivQ", { Ev } },
2573 /* REG_FE */
2575 { "incA", { Eb } },
2576 { "decA", { Eb } },
2578 /* REG_FF */
2580 { "incQ", { Ev } },
2581 { "decQ", { Ev } },
2582 { "callT", { indirEv } },
2583 { "JcallT", { indirEp } },
2584 { "jmpT", { indirEv } },
2585 { "JjmpT", { indirEp } },
2586 { "pushU", { stackEv } },
2587 { Bad_Opcode },
2589 /* REG_0F00 */
2591 { "sldtD", { Sv } },
2592 { "strD", { Sv } },
2593 { "lldt", { Ew } },
2594 { "ltr", { Ew } },
2595 { "verr", { Ew } },
2596 { "verw", { Ew } },
2597 { Bad_Opcode },
2598 { Bad_Opcode },
2600 /* REG_0F01 */
2602 { MOD_TABLE (MOD_0F01_REG_0) },
2603 { MOD_TABLE (MOD_0F01_REG_1) },
2604 { MOD_TABLE (MOD_0F01_REG_2) },
2605 { MOD_TABLE (MOD_0F01_REG_3) },
2606 { "smswD", { Sv } },
2607 { Bad_Opcode },
2608 { "lmsw", { Ew } },
2609 { MOD_TABLE (MOD_0F01_REG_7) },
2611 /* REG_0F0D */
2613 { "prefetch", { Eb } },
2614 { "prefetchw", { Eb } },
2616 /* REG_0F18 */
2618 { MOD_TABLE (MOD_0F18_REG_0) },
2619 { MOD_TABLE (MOD_0F18_REG_1) },
2620 { MOD_TABLE (MOD_0F18_REG_2) },
2621 { MOD_TABLE (MOD_0F18_REG_3) },
2623 /* REG_0F71 */
2625 { Bad_Opcode },
2626 { Bad_Opcode },
2627 { MOD_TABLE (MOD_0F71_REG_2) },
2628 { Bad_Opcode },
2629 { MOD_TABLE (MOD_0F71_REG_4) },
2630 { Bad_Opcode },
2631 { MOD_TABLE (MOD_0F71_REG_6) },
2633 /* REG_0F72 */
2635 { Bad_Opcode },
2636 { Bad_Opcode },
2637 { MOD_TABLE (MOD_0F72_REG_2) },
2638 { Bad_Opcode },
2639 { MOD_TABLE (MOD_0F72_REG_4) },
2640 { Bad_Opcode },
2641 { MOD_TABLE (MOD_0F72_REG_6) },
2643 /* REG_0F73 */
2645 { Bad_Opcode },
2646 { Bad_Opcode },
2647 { MOD_TABLE (MOD_0F73_REG_2) },
2648 { MOD_TABLE (MOD_0F73_REG_3) },
2649 { Bad_Opcode },
2650 { Bad_Opcode },
2651 { MOD_TABLE (MOD_0F73_REG_6) },
2652 { MOD_TABLE (MOD_0F73_REG_7) },
2654 /* REG_0FA6 */
2656 { "montmul", { { OP_0f07, 0 } } },
2657 { "xsha1", { { OP_0f07, 0 } } },
2658 { "xsha256", { { OP_0f07, 0 } } },
2660 /* REG_0FA7 */
2662 { "xstore-rng", { { OP_0f07, 0 } } },
2663 { "xcrypt-ecb", { { OP_0f07, 0 } } },
2664 { "xcrypt-cbc", { { OP_0f07, 0 } } },
2665 { "xcrypt-ctr", { { OP_0f07, 0 } } },
2666 { "xcrypt-cfb", { { OP_0f07, 0 } } },
2667 { "xcrypt-ofb", { { OP_0f07, 0 } } },
2669 /* REG_0FAE */
2671 { MOD_TABLE (MOD_0FAE_REG_0) },
2672 { MOD_TABLE (MOD_0FAE_REG_1) },
2673 { MOD_TABLE (MOD_0FAE_REG_2) },
2674 { MOD_TABLE (MOD_0FAE_REG_3) },
2675 { MOD_TABLE (MOD_0FAE_REG_4) },
2676 { MOD_TABLE (MOD_0FAE_REG_5) },
2677 { MOD_TABLE (MOD_0FAE_REG_6) },
2678 { MOD_TABLE (MOD_0FAE_REG_7) },
2680 /* REG_0FBA */
2682 { Bad_Opcode },
2683 { Bad_Opcode },
2684 { Bad_Opcode },
2685 { Bad_Opcode },
2686 { "btQ", { Ev, Ib } },
2687 { "btsQ", { Ev, Ib } },
2688 { "btrQ", { Ev, Ib } },
2689 { "btcQ", { Ev, Ib } },
2691 /* REG_0FC7 */
2693 { Bad_Opcode },
2694 { "cmpxchg8b", { { CMPXCHG8B_Fixup, q_mode } } },
2695 { Bad_Opcode },
2696 { Bad_Opcode },
2697 { Bad_Opcode },
2698 { Bad_Opcode },
2699 { MOD_TABLE (MOD_0FC7_REG_6) },
2700 { MOD_TABLE (MOD_0FC7_REG_7) },
2702 /* REG_VEX_71 */
2704 { Bad_Opcode },
2705 { Bad_Opcode },
2706 { MOD_TABLE (MOD_VEX_71_REG_2) },
2707 { Bad_Opcode },
2708 { MOD_TABLE (MOD_VEX_71_REG_4) },
2709 { Bad_Opcode },
2710 { MOD_TABLE (MOD_VEX_71_REG_6) },
2712 /* REG_VEX_72 */
2714 { Bad_Opcode },
2715 { Bad_Opcode },
2716 { MOD_TABLE (MOD_VEX_72_REG_2) },
2717 { Bad_Opcode },
2718 { MOD_TABLE (MOD_VEX_72_REG_4) },
2719 { Bad_Opcode },
2720 { MOD_TABLE (MOD_VEX_72_REG_6) },
2722 /* REG_VEX_73 */
2724 { Bad_Opcode },
2725 { Bad_Opcode },
2726 { MOD_TABLE (MOD_VEX_73_REG_2) },
2727 { MOD_TABLE (MOD_VEX_73_REG_3) },
2728 { Bad_Opcode },
2729 { Bad_Opcode },
2730 { MOD_TABLE (MOD_VEX_73_REG_6) },
2731 { MOD_TABLE (MOD_VEX_73_REG_7) },
2733 /* REG_VEX_AE */
2735 { Bad_Opcode },
2736 { Bad_Opcode },
2737 { MOD_TABLE (MOD_VEX_AE_REG_2) },
2738 { MOD_TABLE (MOD_VEX_AE_REG_3) },
2740 /* REG_XOP_LWPCB */
2742 { "llwpcb", { { OP_LWPCB_E, 0 } } },
2743 { "slwpcb", { { OP_LWPCB_E, 0 } } },
2745 /* REG_XOP_LWP */
2747 { "lwpins", { { OP_LWP_E, 0 }, Ed, { OP_LWP_I, 0 } } },
2748 { "lwpval", { { OP_LWP_E, 0 }, Ed, { OP_LWP_I, 0 } } },
2752 static const struct dis386 prefix_table[][4] = {
2753 /* PREFIX_90 */
2755 { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } } },
2756 { "pause", { XX } },
2757 { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } } },
2760 /* PREFIX_0F10 */
2762 { "movups", { XM, EXx } },
2763 { "movss", { XM, EXd } },
2764 { "movupd", { XM, EXx } },
2765 { "movsd", { XM, EXq } },
2768 /* PREFIX_0F11 */
2770 { "movups", { EXxS, XM } },
2771 { "movss", { EXdS, XM } },
2772 { "movupd", { EXxS, XM } },
2773 { "movsd", { EXqS, XM } },
2776 /* PREFIX_0F12 */
2778 { MOD_TABLE (MOD_0F12_PREFIX_0) },
2779 { "movsldup", { XM, EXx } },
2780 { "movlpd", { XM, EXq } },
2781 { "movddup", { XM, EXq } },
2784 /* PREFIX_0F16 */
2786 { MOD_TABLE (MOD_0F16_PREFIX_0) },
2787 { "movshdup", { XM, EXx } },
2788 { "movhpd", { XM, EXq } },
2791 /* PREFIX_0F2A */
2793 { "cvtpi2ps", { XM, EMCq } },
2794 { "cvtsi2ss%LQ", { XM, Ev } },
2795 { "cvtpi2pd", { XM, EMCq } },
2796 { "cvtsi2sd%LQ", { XM, Ev } },
2799 /* PREFIX_0F2B */
2801 { MOD_TABLE (MOD_0F2B_PREFIX_0) },
2802 { MOD_TABLE (MOD_0F2B_PREFIX_1) },
2803 { MOD_TABLE (MOD_0F2B_PREFIX_2) },
2804 { MOD_TABLE (MOD_0F2B_PREFIX_3) },
2807 /* PREFIX_0F2C */
2809 { "cvttps2pi", { MXC, EXq } },
2810 { "cvttss2siY", { Gv, EXd } },
2811 { "cvttpd2pi", { MXC, EXx } },
2812 { "cvttsd2siY", { Gv, EXq } },
2815 /* PREFIX_0F2D */
2817 { "cvtps2pi", { MXC, EXq } },
2818 { "cvtss2siY", { Gv, EXd } },
2819 { "cvtpd2pi", { MXC, EXx } },
2820 { "cvtsd2siY", { Gv, EXq } },
2823 /* PREFIX_0F2E */
2825 { "ucomiss",{ XM, EXd } },
2826 { Bad_Opcode },
2827 { "ucomisd",{ XM, EXq } },
2830 /* PREFIX_0F2F */
2832 { "comiss", { XM, EXd } },
2833 { Bad_Opcode },
2834 { "comisd", { XM, EXq } },
2837 /* PREFIX_0F51 */
2839 { "sqrtps", { XM, EXx } },
2840 { "sqrtss", { XM, EXd } },
2841 { "sqrtpd", { XM, EXx } },
2842 { "sqrtsd", { XM, EXq } },
2845 /* PREFIX_0F52 */
2847 { "rsqrtps",{ XM, EXx } },
2848 { "rsqrtss",{ XM, EXd } },
2851 /* PREFIX_0F53 */
2853 { "rcpps", { XM, EXx } },
2854 { "rcpss", { XM, EXd } },
2857 /* PREFIX_0F58 */
2859 { "addps", { XM, EXx } },
2860 { "addss", { XM, EXd } },
2861 { "addpd", { XM, EXx } },
2862 { "addsd", { XM, EXq } },
2865 /* PREFIX_0F59 */
2867 { "mulps", { XM, EXx } },
2868 { "mulss", { XM, EXd } },
2869 { "mulpd", { XM, EXx } },
2870 { "mulsd", { XM, EXq } },
2873 /* PREFIX_0F5A */
2875 { "cvtps2pd", { XM, EXq } },
2876 { "cvtss2sd", { XM, EXd } },
2877 { "cvtpd2ps", { XM, EXx } },
2878 { "cvtsd2ss", { XM, EXq } },
2881 /* PREFIX_0F5B */
2883 { "cvtdq2ps", { XM, EXx } },
2884 { "cvttps2dq", { XM, EXx } },
2885 { "cvtps2dq", { XM, EXx } },
2888 /* PREFIX_0F5C */
2890 { "subps", { XM, EXx } },
2891 { "subss", { XM, EXd } },
2892 { "subpd", { XM, EXx } },
2893 { "subsd", { XM, EXq } },
2896 /* PREFIX_0F5D */
2898 { "minps", { XM, EXx } },
2899 { "minss", { XM, EXd } },
2900 { "minpd", { XM, EXx } },
2901 { "minsd", { XM, EXq } },
2904 /* PREFIX_0F5E */
2906 { "divps", { XM, EXx } },
2907 { "divss", { XM, EXd } },
2908 { "divpd", { XM, EXx } },
2909 { "divsd", { XM, EXq } },
2912 /* PREFIX_0F5F */
2914 { "maxps", { XM, EXx } },
2915 { "maxss", { XM, EXd } },
2916 { "maxpd", { XM, EXx } },
2917 { "maxsd", { XM, EXq } },
2920 /* PREFIX_0F60 */
2922 { "punpcklbw",{ MX, EMd } },
2923 { Bad_Opcode },
2924 { "punpcklbw",{ MX, EMx } },
2927 /* PREFIX_0F61 */
2929 { "punpcklwd",{ MX, EMd } },
2930 { Bad_Opcode },
2931 { "punpcklwd",{ MX, EMx } },
2934 /* PREFIX_0F62 */
2936 { "punpckldq",{ MX, EMd } },
2937 { Bad_Opcode },
2938 { "punpckldq",{ MX, EMx } },
2941 /* PREFIX_0F6C */
2943 { Bad_Opcode },
2944 { Bad_Opcode },
2945 { "punpcklqdq", { XM, EXx } },
2948 /* PREFIX_0F6D */
2950 { Bad_Opcode },
2951 { Bad_Opcode },
2952 { "punpckhqdq", { XM, EXx } },
2955 /* PREFIX_0F6F */
2957 { "movq", { MX, EM } },
2958 { "movdqu", { XM, EXx } },
2959 { "movdqa", { XM, EXx } },
2962 /* PREFIX_0F70 */
2964 { "pshufw", { MX, EM, Ib } },
2965 { "pshufhw",{ XM, EXx, Ib } },
2966 { "pshufd", { XM, EXx, Ib } },
2967 { "pshuflw",{ XM, EXx, Ib } },
2970 /* PREFIX_0F73_REG_3 */
2972 { Bad_Opcode },
2973 { Bad_Opcode },
2974 { "psrldq", { XS, Ib } },
2977 /* PREFIX_0F73_REG_7 */
2979 { Bad_Opcode },
2980 { Bad_Opcode },
2981 { "pslldq", { XS, Ib } },
2984 /* PREFIX_0F78 */
2986 {"vmread", { Em, Gm } },
2987 { Bad_Opcode },
2988 {"extrq", { XS, Ib, Ib } },
2989 {"insertq", { XM, XS, Ib, Ib } },
2992 /* PREFIX_0F79 */
2994 {"vmwrite", { Gm, Em } },
2995 { Bad_Opcode },
2996 {"extrq", { XM, XS } },
2997 {"insertq", { XM, XS } },
3000 /* PREFIX_0F7C */
3002 { Bad_Opcode },
3003 { Bad_Opcode },
3004 { "haddpd", { XM, EXx } },
3005 { "haddps", { XM, EXx } },
3008 /* PREFIX_0F7D */
3010 { Bad_Opcode },
3011 { Bad_Opcode },
3012 { "hsubpd", { XM, EXx } },
3013 { "hsubps", { XM, EXx } },
3016 /* PREFIX_0F7E */
3018 { "movK", { Edq, MX } },
3019 { "movq", { XM, EXq } },
3020 { "movK", { Edq, XM } },
3023 /* PREFIX_0F7F */
3025 { "movq", { EMS, MX } },
3026 { "movdqu", { EXxS, XM } },
3027 { "movdqa", { EXxS, XM } },
3030 /* PREFIX_0FB8 */
3032 { Bad_Opcode },
3033 { "popcntS", { Gv, Ev } },
3036 /* PREFIX_0FBD */
3038 { "bsrS", { Gv, Ev } },
3039 { "lzcntS", { Gv, Ev } },
3040 { "bsrS", { Gv, Ev } },
3043 /* PREFIX_0FC2 */
3045 { "cmpps", { XM, EXx, CMP } },
3046 { "cmpss", { XM, EXd, CMP } },
3047 { "cmppd", { XM, EXx, CMP } },
3048 { "cmpsd", { XM, EXq, CMP } },
3051 /* PREFIX_0FC3 */
3053 { "movntiS", { Ma, Gv } },
3056 /* PREFIX_0FC7_REG_6 */
3058 { "vmptrld",{ Mq } },
3059 { "vmxon", { Mq } },
3060 { "vmclear",{ Mq } },
3063 /* PREFIX_0FD0 */
3065 { Bad_Opcode },
3066 { Bad_Opcode },
3067 { "addsubpd", { XM, EXx } },
3068 { "addsubps", { XM, EXx } },
3071 /* PREFIX_0FD6 */
3073 { Bad_Opcode },
3074 { "movq2dq",{ XM, MS } },
3075 { "movq", { EXqS, XM } },
3076 { "movdq2q",{ MX, XS } },
3079 /* PREFIX_0FE6 */
3081 { Bad_Opcode },
3082 { "cvtdq2pd", { XM, EXq } },
3083 { "cvttpd2dq", { XM, EXx } },
3084 { "cvtpd2dq", { XM, EXx } },
3087 /* PREFIX_0FE7 */
3089 { "movntq", { Mq, MX } },
3090 { Bad_Opcode },
3091 { MOD_TABLE (MOD_0FE7_PREFIX_2) },
3094 /* PREFIX_0FF0 */
3096 { Bad_Opcode },
3097 { Bad_Opcode },
3098 { Bad_Opcode },
3099 { MOD_TABLE (MOD_0FF0_PREFIX_3) },
3102 /* PREFIX_0FF7 */
3104 { "maskmovq", { MX, MS } },
3105 { Bad_Opcode },
3106 { "maskmovdqu", { XM, XS } },
3109 /* PREFIX_0F3810 */
3111 { Bad_Opcode },
3112 { Bad_Opcode },
3113 { "pblendvb", { XM, EXx, XMM0 } },
3116 /* PREFIX_0F3814 */
3118 { Bad_Opcode },
3119 { Bad_Opcode },
3120 { "blendvps", { XM, EXx, XMM0 } },
3123 /* PREFIX_0F3815 */
3125 { Bad_Opcode },
3126 { Bad_Opcode },
3127 { "blendvpd", { XM, EXx, XMM0 } },
3130 /* PREFIX_0F3817 */
3132 { Bad_Opcode },
3133 { Bad_Opcode },
3134 { "ptest", { XM, EXx } },
3137 /* PREFIX_0F3820 */
3139 { Bad_Opcode },
3140 { Bad_Opcode },
3141 { "pmovsxbw", { XM, EXq } },
3144 /* PREFIX_0F3821 */
3146 { Bad_Opcode },
3147 { Bad_Opcode },
3148 { "pmovsxbd", { XM, EXd } },
3151 /* PREFIX_0F3822 */
3153 { Bad_Opcode },
3154 { Bad_Opcode },
3155 { "pmovsxbq", { XM, EXw } },
3158 /* PREFIX_0F3823 */
3160 { Bad_Opcode },
3161 { Bad_Opcode },
3162 { "pmovsxwd", { XM, EXq } },
3165 /* PREFIX_0F3824 */
3167 { Bad_Opcode },
3168 { Bad_Opcode },
3169 { "pmovsxwq", { XM, EXd } },
3172 /* PREFIX_0F3825 */
3174 { Bad_Opcode },
3175 { Bad_Opcode },
3176 { "pmovsxdq", { XM, EXq } },
3179 /* PREFIX_0F3828 */
3181 { Bad_Opcode },
3182 { Bad_Opcode },
3183 { "pmuldq", { XM, EXx } },
3186 /* PREFIX_0F3829 */
3188 { Bad_Opcode },
3189 { Bad_Opcode },
3190 { "pcmpeqq", { XM, EXx } },
3193 /* PREFIX_0F382A */
3195 { Bad_Opcode },
3196 { Bad_Opcode },
3197 { MOD_TABLE (MOD_0F382A_PREFIX_2) },
3200 /* PREFIX_0F382B */
3202 { Bad_Opcode },
3203 { Bad_Opcode },
3204 { "packusdw", { XM, EXx } },
3207 /* PREFIX_0F3830 */
3209 { Bad_Opcode },
3210 { Bad_Opcode },
3211 { "pmovzxbw", { XM, EXq } },
3214 /* PREFIX_0F3831 */
3216 { Bad_Opcode },
3217 { Bad_Opcode },
3218 { "pmovzxbd", { XM, EXd } },
3221 /* PREFIX_0F3832 */
3223 { Bad_Opcode },
3224 { Bad_Opcode },
3225 { "pmovzxbq", { XM, EXw } },
3228 /* PREFIX_0F3833 */
3230 { Bad_Opcode },
3231 { Bad_Opcode },
3232 { "pmovzxwd", { XM, EXq } },
3235 /* PREFIX_0F3834 */
3237 { Bad_Opcode },
3238 { Bad_Opcode },
3239 { "pmovzxwq", { XM, EXd } },
3242 /* PREFIX_0F3835 */
3244 { Bad_Opcode },
3245 { Bad_Opcode },
3246 { "pmovzxdq", { XM, EXq } },
3249 /* PREFIX_0F3837 */
3251 { Bad_Opcode },
3252 { Bad_Opcode },
3253 { "pcmpgtq", { XM, EXx } },
3256 /* PREFIX_0F3838 */
3258 { Bad_Opcode },
3259 { Bad_Opcode },
3260 { "pminsb", { XM, EXx } },
3263 /* PREFIX_0F3839 */
3265 { Bad_Opcode },
3266 { Bad_Opcode },
3267 { "pminsd", { XM, EXx } },
3270 /* PREFIX_0F383A */
3272 { Bad_Opcode },
3273 { Bad_Opcode },
3274 { "pminuw", { XM, EXx } },
3277 /* PREFIX_0F383B */
3279 { Bad_Opcode },
3280 { Bad_Opcode },
3281 { "pminud", { XM, EXx } },
3284 /* PREFIX_0F383C */
3286 { Bad_Opcode },
3287 { Bad_Opcode },
3288 { "pmaxsb", { XM, EXx } },
3291 /* PREFIX_0F383D */
3293 { Bad_Opcode },
3294 { Bad_Opcode },
3295 { "pmaxsd", { XM, EXx } },
3298 /* PREFIX_0F383E */
3300 { Bad_Opcode },
3301 { Bad_Opcode },
3302 { "pmaxuw", { XM, EXx } },
3305 /* PREFIX_0F383F */
3307 { Bad_Opcode },
3308 { Bad_Opcode },
3309 { "pmaxud", { XM, EXx } },
3312 /* PREFIX_0F3840 */
3314 { Bad_Opcode },
3315 { Bad_Opcode },
3316 { "pmulld", { XM, EXx } },
3319 /* PREFIX_0F3841 */
3321 { Bad_Opcode },
3322 { Bad_Opcode },
3323 { "phminposuw", { XM, EXx } },
3326 /* PREFIX_0F3880 */
3328 { Bad_Opcode },
3329 { Bad_Opcode },
3330 { "invept", { Gm, Mo } },
3333 /* PREFIX_0F3881 */
3335 { Bad_Opcode },
3336 { Bad_Opcode },
3337 { "invvpid", { Gm, Mo } },
3340 /* PREFIX_0F38DB */
3342 { Bad_Opcode },
3343 { Bad_Opcode },
3344 { "aesimc", { XM, EXx } },
3347 /* PREFIX_0F38DC */
3349 { Bad_Opcode },
3350 { Bad_Opcode },
3351 { "aesenc", { XM, EXx } },
3354 /* PREFIX_0F38DD */
3356 { Bad_Opcode },
3357 { Bad_Opcode },
3358 { "aesenclast", { XM, EXx } },
3361 /* PREFIX_0F38DE */
3363 { Bad_Opcode },
3364 { Bad_Opcode },
3365 { "aesdec", { XM, EXx } },
3368 /* PREFIX_0F38DF */
3370 { Bad_Opcode },
3371 { Bad_Opcode },
3372 { "aesdeclast", { XM, EXx } },
3375 /* PREFIX_0F38F0 */
3377 { "movbeS", { Gv, { MOVBE_Fixup, v_mode } } },
3378 { Bad_Opcode },
3379 { "movbeS", { Gv, { MOVBE_Fixup, v_mode } } },
3380 { "crc32", { Gdq, { CRC32_Fixup, b_mode } } },
3383 /* PREFIX_0F38F1 */
3385 { "movbeS", { { MOVBE_Fixup, v_mode }, Gv } },
3386 { Bad_Opcode },
3387 { "movbeS", { { MOVBE_Fixup, v_mode }, Gv } },
3388 { "crc32", { Gdq, { CRC32_Fixup, v_mode } } },
3391 /* PREFIX_0F3A08 */
3393 { Bad_Opcode },
3394 { Bad_Opcode },
3395 { "roundps", { XM, EXx, Ib } },
3398 /* PREFIX_0F3A09 */
3400 { Bad_Opcode },
3401 { Bad_Opcode },
3402 { "roundpd", { XM, EXx, Ib } },
3405 /* PREFIX_0F3A0A */
3407 { Bad_Opcode },
3408 { Bad_Opcode },
3409 { "roundss", { XM, EXd, Ib } },
3412 /* PREFIX_0F3A0B */
3414 { Bad_Opcode },
3415 { Bad_Opcode },
3416 { "roundsd", { XM, EXq, Ib } },
3419 /* PREFIX_0F3A0C */
3421 { Bad_Opcode },
3422 { Bad_Opcode },
3423 { "blendps", { XM, EXx, Ib } },
3426 /* PREFIX_0F3A0D */
3428 { Bad_Opcode },
3429 { Bad_Opcode },
3430 { "blendpd", { XM, EXx, Ib } },
3433 /* PREFIX_0F3A0E */
3435 { Bad_Opcode },
3436 { Bad_Opcode },
3437 { "pblendw", { XM, EXx, Ib } },
3440 /* PREFIX_0F3A14 */
3442 { Bad_Opcode },
3443 { Bad_Opcode },
3444 { "pextrb", { Edqb, XM, Ib } },
3447 /* PREFIX_0F3A15 */
3449 { Bad_Opcode },
3450 { Bad_Opcode },
3451 { "pextrw", { Edqw, XM, Ib } },
3454 /* PREFIX_0F3A16 */
3456 { Bad_Opcode },
3457 { Bad_Opcode },
3458 { "pextrK", { Edq, XM, Ib } },
3461 /* PREFIX_0F3A17 */
3463 { Bad_Opcode },
3464 { Bad_Opcode },
3465 { "extractps", { Edqd, XM, Ib } },
3468 /* PREFIX_0F3A20 */
3470 { Bad_Opcode },
3471 { Bad_Opcode },
3472 { "pinsrb", { XM, Edqb, Ib } },
3475 /* PREFIX_0F3A21 */
3477 { Bad_Opcode },
3478 { Bad_Opcode },
3479 { "insertps", { XM, EXd, Ib } },
3482 /* PREFIX_0F3A22 */
3484 { Bad_Opcode },
3485 { Bad_Opcode },
3486 { "pinsrK", { XM, Edq, Ib } },
3489 /* PREFIX_0F3A40 */
3491 { Bad_Opcode },
3492 { Bad_Opcode },
3493 { "dpps", { XM, EXx, Ib } },
3496 /* PREFIX_0F3A41 */
3498 { Bad_Opcode },
3499 { Bad_Opcode },
3500 { "dppd", { XM, EXx, Ib } },
3503 /* PREFIX_0F3A42 */
3505 { Bad_Opcode },
3506 { Bad_Opcode },
3507 { "mpsadbw", { XM, EXx, Ib } },
3510 /* PREFIX_0F3A44 */
3512 { Bad_Opcode },
3513 { Bad_Opcode },
3514 { "pclmulqdq", { XM, EXx, PCLMUL } },
3517 /* PREFIX_0F3A60 */
3519 { Bad_Opcode },
3520 { Bad_Opcode },
3521 { "pcmpestrm", { XM, EXx, Ib } },
3524 /* PREFIX_0F3A61 */
3526 { Bad_Opcode },
3527 { Bad_Opcode },
3528 { "pcmpestri", { XM, EXx, Ib } },
3531 /* PREFIX_0F3A62 */
3533 { Bad_Opcode },
3534 { Bad_Opcode },
3535 { "pcmpistrm", { XM, EXx, Ib } },
3538 /* PREFIX_0F3A63 */
3540 { Bad_Opcode },
3541 { Bad_Opcode },
3542 { "pcmpistri", { XM, EXx, Ib } },
3545 /* PREFIX_0F3ADF */
3547 { Bad_Opcode },
3548 { Bad_Opcode },
3549 { "aeskeygenassist", { XM, EXx, Ib } },
3552 /* PREFIX_VEX_10 */
3554 { VEX_W_TABLE (VEX_W_10_P_0) },
3555 { VEX_LEN_TABLE (VEX_LEN_10_P_1) },
3556 { VEX_W_TABLE (VEX_W_10_P_2) },
3557 { VEX_LEN_TABLE (VEX_LEN_10_P_3) },
3560 /* PREFIX_VEX_11 */
3562 { VEX_W_TABLE (VEX_W_11_P_0) },
3563 { VEX_LEN_TABLE (VEX_LEN_11_P_1) },
3564 { VEX_W_TABLE (VEX_W_11_P_2) },
3565 { VEX_LEN_TABLE (VEX_LEN_11_P_3) },
3568 /* PREFIX_VEX_12 */
3570 { MOD_TABLE (MOD_VEX_12_PREFIX_0) },
3571 { VEX_W_TABLE (VEX_W_12_P_1) },
3572 { VEX_LEN_TABLE (VEX_LEN_12_P_2) },
3573 { VEX_W_TABLE (VEX_W_12_P_3) },
3576 /* PREFIX_VEX_16 */
3578 { MOD_TABLE (MOD_VEX_16_PREFIX_0) },
3579 { VEX_W_TABLE (VEX_W_16_P_1) },
3580 { VEX_LEN_TABLE (VEX_LEN_16_P_2) },
3583 /* PREFIX_VEX_2A */
3585 { Bad_Opcode },
3586 { VEX_LEN_TABLE (VEX_LEN_2A_P_1) },
3587 { Bad_Opcode },
3588 { VEX_LEN_TABLE (VEX_LEN_2A_P_3) },
3591 /* PREFIX_VEX_2C */
3593 { Bad_Opcode },
3594 { VEX_LEN_TABLE (VEX_LEN_2C_P_1) },
3595 { Bad_Opcode },
3596 { VEX_LEN_TABLE (VEX_LEN_2C_P_3) },
3599 /* PREFIX_VEX_2D */
3601 { Bad_Opcode },
3602 { VEX_LEN_TABLE (VEX_LEN_2D_P_1) },
3603 { Bad_Opcode },
3604 { VEX_LEN_TABLE (VEX_LEN_2D_P_3) },
3607 /* PREFIX_VEX_2E */
3609 { VEX_LEN_TABLE (VEX_LEN_2E_P_0) },
3610 { Bad_Opcode },
3611 { VEX_LEN_TABLE (VEX_LEN_2E_P_2) },
3614 /* PREFIX_VEX_2F */
3616 { VEX_LEN_TABLE (VEX_LEN_2F_P_0) },
3617 { Bad_Opcode },
3618 { VEX_LEN_TABLE (VEX_LEN_2F_P_2) },
3621 /* PREFIX_VEX_51 */
3623 { VEX_W_TABLE (VEX_W_51_P_0) },
3624 { VEX_LEN_TABLE (VEX_LEN_51_P_1) },
3625 { VEX_W_TABLE (VEX_W_51_P_2) },
3626 { VEX_LEN_TABLE (VEX_LEN_51_P_3) },
3629 /* PREFIX_VEX_52 */
3631 { VEX_W_TABLE (VEX_W_52_P_0) },
3632 { VEX_LEN_TABLE (VEX_LEN_52_P_1) },
3635 /* PREFIX_VEX_53 */
3637 { VEX_W_TABLE (VEX_W_53_P_0) },
3638 { VEX_LEN_TABLE (VEX_LEN_53_P_1) },
3641 /* PREFIX_VEX_58 */
3643 { VEX_W_TABLE (VEX_W_58_P_0) },
3644 { VEX_LEN_TABLE (VEX_LEN_58_P_1) },
3645 { VEX_W_TABLE (VEX_W_58_P_2) },
3646 { VEX_LEN_TABLE (VEX_LEN_58_P_3) },
3649 /* PREFIX_VEX_59 */
3651 { VEX_W_TABLE (VEX_W_59_P_0) },
3652 { VEX_LEN_TABLE (VEX_LEN_59_P_1) },
3653 { VEX_W_TABLE (VEX_W_59_P_2) },
3654 { VEX_LEN_TABLE (VEX_LEN_59_P_3) },
3657 /* PREFIX_VEX_5A */
3659 { VEX_W_TABLE (VEX_W_5A_P_0) },
3660 { VEX_LEN_TABLE (VEX_LEN_5A_P_1) },
3661 { "vcvtpd2ps%XY", { XMM, EXx } },
3662 { VEX_LEN_TABLE (VEX_LEN_5A_P_3) },
3665 /* PREFIX_VEX_5B */
3667 { VEX_W_TABLE (VEX_W_5B_P_0) },
3668 { VEX_W_TABLE (VEX_W_5B_P_1) },
3669 { VEX_W_TABLE (VEX_W_5B_P_2) },
3672 /* PREFIX_VEX_5C */
3674 { VEX_W_TABLE (VEX_W_5C_P_0) },
3675 { VEX_LEN_TABLE (VEX_LEN_5C_P_1) },
3676 { VEX_W_TABLE (VEX_W_5C_P_2) },
3677 { VEX_LEN_TABLE (VEX_LEN_5C_P_3) },
3680 /* PREFIX_VEX_5D */
3682 { VEX_W_TABLE (VEX_W_5D_P_0) },
3683 { VEX_LEN_TABLE (VEX_LEN_5D_P_1) },
3684 { VEX_W_TABLE (VEX_W_5D_P_2) },
3685 { VEX_LEN_TABLE (VEX_LEN_5D_P_3) },
3688 /* PREFIX_VEX_5E */
3690 { VEX_W_TABLE (VEX_W_5E_P_0) },
3691 { VEX_LEN_TABLE (VEX_LEN_5E_P_1) },
3692 { VEX_W_TABLE (VEX_W_5E_P_2) },
3693 { VEX_LEN_TABLE (VEX_LEN_5E_P_3) },
3696 /* PREFIX_VEX_5F */
3698 { VEX_W_TABLE (VEX_W_5F_P_0) },
3699 { VEX_LEN_TABLE (VEX_LEN_5F_P_1) },
3700 { VEX_W_TABLE (VEX_W_5F_P_2) },
3701 { VEX_LEN_TABLE (VEX_LEN_5F_P_3) },
3704 /* PREFIX_VEX_60 */
3706 { Bad_Opcode },
3707 { Bad_Opcode },
3708 { VEX_LEN_TABLE (VEX_LEN_60_P_2) },
3711 /* PREFIX_VEX_61 */
3713 { Bad_Opcode },
3714 { Bad_Opcode },
3715 { VEX_LEN_TABLE (VEX_LEN_61_P_2) },
3718 /* PREFIX_VEX_62 */
3720 { Bad_Opcode },
3721 { Bad_Opcode },
3722 { VEX_LEN_TABLE (VEX_LEN_62_P_2) },
3725 /* PREFIX_VEX_63 */
3727 { Bad_Opcode },
3728 { Bad_Opcode },
3729 { VEX_LEN_TABLE (VEX_LEN_63_P_2) },
3732 /* PREFIX_VEX_64 */
3734 { Bad_Opcode },
3735 { Bad_Opcode },
3736 { VEX_LEN_TABLE (VEX_LEN_64_P_2) },
3739 /* PREFIX_VEX_65 */
3741 { Bad_Opcode },
3742 { Bad_Opcode },
3743 { VEX_LEN_TABLE (VEX_LEN_65_P_2) },
3746 /* PREFIX_VEX_66 */
3748 { Bad_Opcode },
3749 { Bad_Opcode },
3750 { VEX_LEN_TABLE (VEX_LEN_66_P_2) },
3753 /* PREFIX_VEX_67 */
3755 { Bad_Opcode },
3756 { Bad_Opcode },
3757 { VEX_LEN_TABLE (VEX_LEN_67_P_2) },
3760 /* PREFIX_VEX_68 */
3762 { Bad_Opcode },
3763 { Bad_Opcode },
3764 { VEX_LEN_TABLE (VEX_LEN_68_P_2) },
3767 /* PREFIX_VEX_69 */
3769 { Bad_Opcode },
3770 { Bad_Opcode },
3771 { VEX_LEN_TABLE (VEX_LEN_69_P_2) },
3774 /* PREFIX_VEX_6A */
3776 { Bad_Opcode },
3777 { Bad_Opcode },
3778 { VEX_LEN_TABLE (VEX_LEN_6A_P_2) },
3781 /* PREFIX_VEX_6B */
3783 { Bad_Opcode },
3784 { Bad_Opcode },
3785 { VEX_LEN_TABLE (VEX_LEN_6B_P_2) },
3788 /* PREFIX_VEX_6C */
3790 { Bad_Opcode },
3791 { Bad_Opcode },
3792 { VEX_LEN_TABLE (VEX_LEN_6C_P_2) },
3795 /* PREFIX_VEX_6D */
3797 { Bad_Opcode },
3798 { Bad_Opcode },
3799 { VEX_LEN_TABLE (VEX_LEN_6D_P_2) },
3802 /* PREFIX_VEX_6E */
3804 { Bad_Opcode },
3805 { Bad_Opcode },
3806 { VEX_LEN_TABLE (VEX_LEN_6E_P_2) },
3809 /* PREFIX_VEX_6F */
3811 { Bad_Opcode },
3812 { VEX_W_TABLE (VEX_W_6F_P_1) },
3813 { VEX_W_TABLE (VEX_W_6F_P_2) },
3816 /* PREFIX_VEX_70 */
3818 { Bad_Opcode },
3819 { VEX_LEN_TABLE (VEX_LEN_70_P_1) },
3820 { VEX_LEN_TABLE (VEX_LEN_70_P_2) },
3821 { VEX_LEN_TABLE (VEX_LEN_70_P_3) },
3824 /* PREFIX_VEX_71_REG_2 */
3826 { Bad_Opcode },
3827 { Bad_Opcode },
3828 { VEX_LEN_TABLE (VEX_LEN_71_R_2_P_2) },
3831 /* PREFIX_VEX_71_REG_4 */
3833 { Bad_Opcode },
3834 { Bad_Opcode },
3835 { VEX_LEN_TABLE (VEX_LEN_71_R_4_P_2) },
3838 /* PREFIX_VEX_71_REG_6 */
3840 { Bad_Opcode },
3841 { Bad_Opcode },
3842 { VEX_LEN_TABLE (VEX_LEN_71_R_6_P_2) },
3845 /* PREFIX_VEX_72_REG_2 */
3847 { Bad_Opcode },
3848 { Bad_Opcode },
3849 { VEX_LEN_TABLE (VEX_LEN_72_R_2_P_2) },
3852 /* PREFIX_VEX_72_REG_4 */
3854 { Bad_Opcode },
3855 { Bad_Opcode },
3856 { VEX_LEN_TABLE (VEX_LEN_72_R_4_P_2) },
3859 /* PREFIX_VEX_72_REG_6 */
3861 { Bad_Opcode },
3862 { Bad_Opcode },
3863 { VEX_LEN_TABLE (VEX_LEN_72_R_6_P_2) },
3866 /* PREFIX_VEX_73_REG_2 */
3868 { Bad_Opcode },
3869 { Bad_Opcode },
3870 { VEX_LEN_TABLE (VEX_LEN_73_R_2_P_2) },
3873 /* PREFIX_VEX_73_REG_3 */
3875 { Bad_Opcode },
3876 { Bad_Opcode },
3877 { VEX_LEN_TABLE (VEX_LEN_73_R_3_P_2) },
3880 /* PREFIX_VEX_73_REG_6 */
3882 { Bad_Opcode },
3883 { Bad_Opcode },
3884 { VEX_LEN_TABLE (VEX_LEN_73_R_6_P_2) },
3887 /* PREFIX_VEX_73_REG_7 */
3889 { Bad_Opcode },
3890 { Bad_Opcode },
3891 { VEX_LEN_TABLE (VEX_LEN_73_R_7_P_2) },
3894 /* PREFIX_VEX_74 */
3896 { Bad_Opcode },
3897 { Bad_Opcode },
3898 { VEX_LEN_TABLE (VEX_LEN_74_P_2) },
3901 /* PREFIX_VEX_75 */
3903 { Bad_Opcode },
3904 { Bad_Opcode },
3905 { VEX_LEN_TABLE (VEX_LEN_75_P_2) },
3908 /* PREFIX_VEX_76 */
3910 { Bad_Opcode },
3911 { Bad_Opcode },
3912 { VEX_LEN_TABLE (VEX_LEN_76_P_2) },
3915 /* PREFIX_VEX_77 */
3917 { VEX_W_TABLE (VEX_W_77_P_0) },
3920 /* PREFIX_VEX_7C */
3922 { Bad_Opcode },
3923 { Bad_Opcode },
3924 { VEX_W_TABLE (VEX_W_7C_P_2) },
3925 { VEX_W_TABLE (VEX_W_7C_P_3) },
3928 /* PREFIX_VEX_7D */
3930 { Bad_Opcode },
3931 { Bad_Opcode },
3932 { VEX_W_TABLE (VEX_W_7D_P_2) },
3933 { VEX_W_TABLE (VEX_W_7D_P_3) },
3936 /* PREFIX_VEX_7E */
3938 { Bad_Opcode },
3939 { VEX_LEN_TABLE (VEX_LEN_7E_P_1) },
3940 { VEX_LEN_TABLE (VEX_LEN_7E_P_2) },
3943 /* PREFIX_VEX_7F */
3945 { Bad_Opcode },
3946 { VEX_W_TABLE (VEX_W_7F_P_1) },
3947 { VEX_W_TABLE (VEX_W_7F_P_2) },
3950 /* PREFIX_VEX_C2 */
3952 { VEX_W_TABLE (VEX_W_C2_P_0) },
3953 { VEX_LEN_TABLE (VEX_LEN_C2_P_1) },
3954 { VEX_W_TABLE (VEX_W_C2_P_2) },
3955 { VEX_LEN_TABLE (VEX_LEN_C2_P_3) },
3958 /* PREFIX_VEX_C4 */
3960 { Bad_Opcode },
3961 { Bad_Opcode },
3962 { VEX_LEN_TABLE (VEX_LEN_C4_P_2) },
3965 /* PREFIX_VEX_C5 */
3967 { Bad_Opcode },
3968 { Bad_Opcode },
3969 { VEX_LEN_TABLE (VEX_LEN_C5_P_2) },
3972 /* PREFIX_VEX_D0 */
3974 { Bad_Opcode },
3975 { Bad_Opcode },
3976 { VEX_W_TABLE (VEX_W_D0_P_2) },
3977 { VEX_W_TABLE (VEX_W_D0_P_3) },
3980 /* PREFIX_VEX_D1 */
3982 { Bad_Opcode },
3983 { Bad_Opcode },
3984 { VEX_LEN_TABLE (VEX_LEN_D1_P_2) },
3987 /* PREFIX_VEX_D2 */
3989 { Bad_Opcode },
3990 { Bad_Opcode },
3991 { VEX_LEN_TABLE (VEX_LEN_D2_P_2) },
3994 /* PREFIX_VEX_D3 */
3996 { Bad_Opcode },
3997 { Bad_Opcode },
3998 { VEX_LEN_TABLE (VEX_LEN_D3_P_2) },
4001 /* PREFIX_VEX_D4 */
4003 { Bad_Opcode },
4004 { Bad_Opcode },
4005 { VEX_LEN_TABLE (VEX_LEN_D4_P_2) },
4008 /* PREFIX_VEX_D5 */
4010 { Bad_Opcode },
4011 { Bad_Opcode },
4012 { VEX_LEN_TABLE (VEX_LEN_D5_P_2) },
4015 /* PREFIX_VEX_D6 */
4017 { Bad_Opcode },
4018 { Bad_Opcode },
4019 { VEX_LEN_TABLE (VEX_LEN_D6_P_2) },
4022 /* PREFIX_VEX_D7 */
4024 { Bad_Opcode },
4025 { Bad_Opcode },
4026 { MOD_TABLE (MOD_VEX_D7_PREFIX_2) },
4029 /* PREFIX_VEX_D8 */
4031 { Bad_Opcode },
4032 { Bad_Opcode },
4033 { VEX_LEN_TABLE (VEX_LEN_D8_P_2) },
4036 /* PREFIX_VEX_D9 */
4038 { Bad_Opcode },
4039 { Bad_Opcode },
4040 { VEX_LEN_TABLE (VEX_LEN_D9_P_2) },
4043 /* PREFIX_VEX_DA */
4045 { Bad_Opcode },
4046 { Bad_Opcode },
4047 { VEX_LEN_TABLE (VEX_LEN_DA_P_2) },
4050 /* PREFIX_VEX_DB */
4052 { Bad_Opcode },
4053 { Bad_Opcode },
4054 { VEX_LEN_TABLE (VEX_LEN_DB_P_2) },
4057 /* PREFIX_VEX_DC */
4059 { Bad_Opcode },
4060 { Bad_Opcode },
4061 { VEX_LEN_TABLE (VEX_LEN_DC_P_2) },
4064 /* PREFIX_VEX_DD */
4066 { Bad_Opcode },
4067 { Bad_Opcode },
4068 { VEX_LEN_TABLE (VEX_LEN_DD_P_2) },
4071 /* PREFIX_VEX_DE */
4073 { Bad_Opcode },
4074 { Bad_Opcode },
4075 { VEX_LEN_TABLE (VEX_LEN_DE_P_2) },
4078 /* PREFIX_VEX_DF */
4080 { Bad_Opcode },
4081 { Bad_Opcode },
4082 { VEX_LEN_TABLE (VEX_LEN_DF_P_2) },
4085 /* PREFIX_VEX_E0 */
4087 { Bad_Opcode },
4088 { Bad_Opcode },
4089 { VEX_LEN_TABLE (VEX_LEN_E0_P_2) },
4092 /* PREFIX_VEX_E1 */
4094 { Bad_Opcode },
4095 { Bad_Opcode },
4096 { VEX_LEN_TABLE (VEX_LEN_E1_P_2) },
4099 /* PREFIX_VEX_E2 */
4101 { Bad_Opcode },
4102 { Bad_Opcode },
4103 { VEX_LEN_TABLE (VEX_LEN_E2_P_2) },
4106 /* PREFIX_VEX_E3 */
4108 { Bad_Opcode },
4109 { Bad_Opcode },
4110 { VEX_LEN_TABLE (VEX_LEN_E3_P_2) },
4113 /* PREFIX_VEX_E4 */
4115 { Bad_Opcode },
4116 { Bad_Opcode },
4117 { VEX_LEN_TABLE (VEX_LEN_E4_P_2) },
4120 /* PREFIX_VEX_E5 */
4122 { Bad_Opcode },
4123 { Bad_Opcode },
4124 { VEX_LEN_TABLE (VEX_LEN_E5_P_2) },
4127 /* PREFIX_VEX_E6 */
4129 { Bad_Opcode },
4130 { VEX_W_TABLE (VEX_W_E6_P_1) },
4131 { VEX_W_TABLE (VEX_W_E6_P_2) },
4132 { VEX_W_TABLE (VEX_W_E6_P_3) },
4135 /* PREFIX_VEX_E7 */
4137 { Bad_Opcode },
4138 { Bad_Opcode },
4139 { MOD_TABLE (MOD_VEX_E7_PREFIX_2) },
4142 /* PREFIX_VEX_E8 */
4144 { Bad_Opcode },
4145 { Bad_Opcode },
4146 { VEX_LEN_TABLE (VEX_LEN_E8_P_2) },
4149 /* PREFIX_VEX_E9 */
4151 { Bad_Opcode },
4152 { Bad_Opcode },
4153 { VEX_LEN_TABLE (VEX_LEN_E9_P_2) },
4156 /* PREFIX_VEX_EA */
4158 { Bad_Opcode },
4159 { Bad_Opcode },
4160 { VEX_LEN_TABLE (VEX_LEN_EA_P_2) },
4163 /* PREFIX_VEX_EB */
4165 { Bad_Opcode },
4166 { Bad_Opcode },
4167 { VEX_LEN_TABLE (VEX_LEN_EB_P_2) },
4170 /* PREFIX_VEX_EC */
4172 { Bad_Opcode },
4173 { Bad_Opcode },
4174 { VEX_LEN_TABLE (VEX_LEN_EC_P_2) },
4177 /* PREFIX_VEX_ED */
4179 { Bad_Opcode },
4180 { Bad_Opcode },
4181 { VEX_LEN_TABLE (VEX_LEN_ED_P_2) },
4184 /* PREFIX_VEX_EE */
4186 { Bad_Opcode },
4187 { Bad_Opcode },
4188 { VEX_LEN_TABLE (VEX_LEN_EE_P_2) },
4191 /* PREFIX_VEX_EF */
4193 { Bad_Opcode },
4194 { Bad_Opcode },
4195 { VEX_LEN_TABLE (VEX_LEN_EF_P_2) },
4198 /* PREFIX_VEX_F0 */
4200 { Bad_Opcode },
4201 { Bad_Opcode },
4202 { Bad_Opcode },
4203 { MOD_TABLE (MOD_VEX_F0_PREFIX_3) },
4206 /* PREFIX_VEX_F1 */
4208 { Bad_Opcode },
4209 { Bad_Opcode },
4210 { VEX_LEN_TABLE (VEX_LEN_F1_P_2) },
4213 /* PREFIX_VEX_F2 */
4215 { Bad_Opcode },
4216 { Bad_Opcode },
4217 { VEX_LEN_TABLE (VEX_LEN_F2_P_2) },
4220 /* PREFIX_VEX_F3 */
4222 { Bad_Opcode },
4223 { Bad_Opcode },
4224 { VEX_LEN_TABLE (VEX_LEN_F3_P_2) },
4227 /* PREFIX_VEX_F4 */
4229 { Bad_Opcode },
4230 { Bad_Opcode },
4231 { VEX_LEN_TABLE (VEX_LEN_F4_P_2) },
4234 /* PREFIX_VEX_F5 */
4236 { Bad_Opcode },
4237 { Bad_Opcode },
4238 { VEX_LEN_TABLE (VEX_LEN_F5_P_2) },
4241 /* PREFIX_VEX_F6 */
4243 { Bad_Opcode },
4244 { Bad_Opcode },
4245 { VEX_LEN_TABLE (VEX_LEN_F6_P_2) },
4248 /* PREFIX_VEX_F7 */
4250 { Bad_Opcode },
4251 { Bad_Opcode },
4252 { VEX_LEN_TABLE (VEX_LEN_F7_P_2) },
4255 /* PREFIX_VEX_F8 */
4257 { Bad_Opcode },
4258 { Bad_Opcode },
4259 { VEX_LEN_TABLE (VEX_LEN_F8_P_2) },
4262 /* PREFIX_VEX_F9 */
4264 { Bad_Opcode },
4265 { Bad_Opcode },
4266 { VEX_LEN_TABLE (VEX_LEN_F9_P_2) },
4269 /* PREFIX_VEX_FA */
4271 { Bad_Opcode },
4272 { Bad_Opcode },
4273 { VEX_LEN_TABLE (VEX_LEN_FA_P_2) },
4276 /* PREFIX_VEX_FB */
4278 { Bad_Opcode },
4279 { Bad_Opcode },
4280 { VEX_LEN_TABLE (VEX_LEN_FB_P_2) },
4283 /* PREFIX_VEX_FC */
4285 { Bad_Opcode },
4286 { Bad_Opcode },
4287 { VEX_LEN_TABLE (VEX_LEN_FC_P_2) },
4290 /* PREFIX_VEX_FD */
4292 { Bad_Opcode },
4293 { Bad_Opcode },
4294 { VEX_LEN_TABLE (VEX_LEN_FD_P_2) },
4297 /* PREFIX_VEX_FE */
4299 { Bad_Opcode },
4300 { Bad_Opcode },
4301 { VEX_LEN_TABLE (VEX_LEN_FE_P_2) },
4304 /* PREFIX_VEX_3800 */
4306 { Bad_Opcode },
4307 { Bad_Opcode },
4308 { VEX_LEN_TABLE (VEX_LEN_3800_P_2) },
4311 /* PREFIX_VEX_3801 */
4313 { Bad_Opcode },
4314 { Bad_Opcode },
4315 { VEX_LEN_TABLE (VEX_LEN_3801_P_2) },
4318 /* PREFIX_VEX_3802 */
4320 { Bad_Opcode },
4321 { Bad_Opcode },
4322 { VEX_LEN_TABLE (VEX_LEN_3802_P_2) },
4325 /* PREFIX_VEX_3803 */
4327 { Bad_Opcode },
4328 { Bad_Opcode },
4329 { VEX_LEN_TABLE (VEX_LEN_3803_P_2) },
4332 /* PREFIX_VEX_3804 */
4334 { Bad_Opcode },
4335 { Bad_Opcode },
4336 { VEX_LEN_TABLE (VEX_LEN_3804_P_2) },
4339 /* PREFIX_VEX_3805 */
4341 { Bad_Opcode },
4342 { Bad_Opcode },
4343 { VEX_LEN_TABLE (VEX_LEN_3805_P_2) },
4346 /* PREFIX_VEX_3806 */
4348 { Bad_Opcode },
4349 { Bad_Opcode },
4350 { VEX_LEN_TABLE (VEX_LEN_3806_P_2) },
4353 /* PREFIX_VEX_3807 */
4355 { Bad_Opcode },
4356 { Bad_Opcode },
4357 { VEX_LEN_TABLE (VEX_LEN_3807_P_2) },
4360 /* PREFIX_VEX_3808 */
4362 { Bad_Opcode },
4363 { Bad_Opcode },
4364 { VEX_LEN_TABLE (VEX_LEN_3808_P_2) },
4367 /* PREFIX_VEX_3809 */
4369 { Bad_Opcode },
4370 { Bad_Opcode },
4371 { VEX_LEN_TABLE (VEX_LEN_3809_P_2) },
4374 /* PREFIX_VEX_380A */
4376 { Bad_Opcode },
4377 { Bad_Opcode },
4378 { VEX_LEN_TABLE (VEX_LEN_380A_P_2) },
4381 /* PREFIX_VEX_380B */
4383 { Bad_Opcode },
4384 { Bad_Opcode },
4385 { VEX_LEN_TABLE (VEX_LEN_380B_P_2) },
4388 /* PREFIX_VEX_380C */
4390 { Bad_Opcode },
4391 { Bad_Opcode },
4392 { VEX_W_TABLE (VEX_W_380C_P_2) },
4395 /* PREFIX_VEX_380D */
4397 { Bad_Opcode },
4398 { Bad_Opcode },
4399 { VEX_W_TABLE (VEX_W_380D_P_2) },
4402 /* PREFIX_VEX_380E */
4404 { Bad_Opcode },
4405 { Bad_Opcode },
4406 { VEX_W_TABLE (VEX_W_380E_P_2) },
4409 /* PREFIX_VEX_380F */
4411 { Bad_Opcode },
4412 { Bad_Opcode },
4413 { VEX_W_TABLE (VEX_W_380F_P_2) },
4416 /* PREFIX_VEX_3817 */
4418 { Bad_Opcode },
4419 { Bad_Opcode },
4420 { VEX_W_TABLE (VEX_W_3817_P_2) },
4423 /* PREFIX_VEX_3818 */
4425 { Bad_Opcode },
4426 { Bad_Opcode },
4427 { MOD_TABLE (MOD_VEX_3818_PREFIX_2) },
4430 /* PREFIX_VEX_3819 */
4432 { Bad_Opcode },
4433 { Bad_Opcode },
4434 { MOD_TABLE (MOD_VEX_3819_PREFIX_2) },
4437 /* PREFIX_VEX_381A */
4439 { Bad_Opcode },
4440 { Bad_Opcode },
4441 { MOD_TABLE (MOD_VEX_381A_PREFIX_2) },
4444 /* PREFIX_VEX_381C */
4446 { Bad_Opcode },
4447 { Bad_Opcode },
4448 { VEX_LEN_TABLE (VEX_LEN_381C_P_2) },
4451 /* PREFIX_VEX_381D */
4453 { Bad_Opcode },
4454 { Bad_Opcode },
4455 { VEX_LEN_TABLE (VEX_LEN_381D_P_2) },
4458 /* PREFIX_VEX_381E */
4460 { Bad_Opcode },
4461 { Bad_Opcode },
4462 { VEX_LEN_TABLE (VEX_LEN_381E_P_2) },
4465 /* PREFIX_VEX_3820 */
4467 { Bad_Opcode },
4468 { Bad_Opcode },
4469 { VEX_LEN_TABLE (VEX_LEN_3820_P_2) },
4472 /* PREFIX_VEX_3821 */
4474 { Bad_Opcode },
4475 { Bad_Opcode },
4476 { VEX_LEN_TABLE (VEX_LEN_3821_P_2) },
4479 /* PREFIX_VEX_3822 */
4481 { Bad_Opcode },
4482 { Bad_Opcode },
4483 { VEX_LEN_TABLE (VEX_LEN_3822_P_2) },
4486 /* PREFIX_VEX_3823 */
4488 { Bad_Opcode },
4489 { Bad_Opcode },
4490 { VEX_LEN_TABLE (VEX_LEN_3823_P_2) },
4493 /* PREFIX_VEX_3824 */
4495 { Bad_Opcode },
4496 { Bad_Opcode },
4497 { VEX_LEN_TABLE (VEX_LEN_3824_P_2) },
4500 /* PREFIX_VEX_3825 */
4502 { Bad_Opcode },
4503 { Bad_Opcode },
4504 { VEX_LEN_TABLE (VEX_LEN_3825_P_2) },
4507 /* PREFIX_VEX_3828 */
4509 { Bad_Opcode },
4510 { Bad_Opcode },
4511 { VEX_LEN_TABLE (VEX_LEN_3828_P_2) },
4514 /* PREFIX_VEX_3829 */
4516 { Bad_Opcode },
4517 { Bad_Opcode },
4518 { VEX_LEN_TABLE (VEX_LEN_3829_P_2) },
4521 /* PREFIX_VEX_382A */
4523 { Bad_Opcode },
4524 { Bad_Opcode },
4525 { MOD_TABLE (MOD_VEX_382A_PREFIX_2) },
4528 /* PREFIX_VEX_382B */
4530 { Bad_Opcode },
4531 { Bad_Opcode },
4532 { VEX_LEN_TABLE (VEX_LEN_382B_P_2) },
4535 /* PREFIX_VEX_382C */
4537 { Bad_Opcode },
4538 { Bad_Opcode },
4539 { MOD_TABLE (MOD_VEX_382C_PREFIX_2) },
4542 /* PREFIX_VEX_382D */
4544 { Bad_Opcode },
4545 { Bad_Opcode },
4546 { MOD_TABLE (MOD_VEX_382D_PREFIX_2) },
4549 /* PREFIX_VEX_382E */
4551 { Bad_Opcode },
4552 { Bad_Opcode },
4553 { MOD_TABLE (MOD_VEX_382E_PREFIX_2) },
4556 /* PREFIX_VEX_382F */
4558 { Bad_Opcode },
4559 { Bad_Opcode },
4560 { MOD_TABLE (MOD_VEX_382F_PREFIX_2) },
4563 /* PREFIX_VEX_3830 */
4565 { Bad_Opcode },
4566 { Bad_Opcode },
4567 { VEX_LEN_TABLE (VEX_LEN_3830_P_2) },
4570 /* PREFIX_VEX_3831 */
4572 { Bad_Opcode },
4573 { Bad_Opcode },
4574 { VEX_LEN_TABLE (VEX_LEN_3831_P_2) },
4577 /* PREFIX_VEX_3832 */
4579 { Bad_Opcode },
4580 { Bad_Opcode },
4581 { VEX_LEN_TABLE (VEX_LEN_3832_P_2) },
4584 /* PREFIX_VEX_3833 */
4586 { Bad_Opcode },
4587 { Bad_Opcode },
4588 { VEX_LEN_TABLE (VEX_LEN_3833_P_2) },
4591 /* PREFIX_VEX_3834 */
4593 { Bad_Opcode },
4594 { Bad_Opcode },
4595 { VEX_LEN_TABLE (VEX_LEN_3834_P_2) },
4598 /* PREFIX_VEX_3835 */
4600 { Bad_Opcode },
4601 { Bad_Opcode },
4602 { VEX_LEN_TABLE (VEX_LEN_3835_P_2) },
4605 /* PREFIX_VEX_3837 */
4607 { Bad_Opcode },
4608 { Bad_Opcode },
4609 { VEX_LEN_TABLE (VEX_LEN_3837_P_2) },
4612 /* PREFIX_VEX_3838 */
4614 { Bad_Opcode },
4615 { Bad_Opcode },
4616 { VEX_LEN_TABLE (VEX_LEN_3838_P_2) },
4619 /* PREFIX_VEX_3839 */
4621 { Bad_Opcode },
4622 { Bad_Opcode },
4623 { VEX_LEN_TABLE (VEX_LEN_3839_P_2) },
4626 /* PREFIX_VEX_383A */
4628 { Bad_Opcode },
4629 { Bad_Opcode },
4630 { VEX_LEN_TABLE (VEX_LEN_383A_P_2) },
4633 /* PREFIX_VEX_383B */
4635 { Bad_Opcode },
4636 { Bad_Opcode },
4637 { VEX_LEN_TABLE (VEX_LEN_383B_P_2) },
4640 /* PREFIX_VEX_383C */
4642 { Bad_Opcode },
4643 { Bad_Opcode },
4644 { VEX_LEN_TABLE (VEX_LEN_383C_P_2) },
4647 /* PREFIX_VEX_383D */
4649 { Bad_Opcode },
4650 { Bad_Opcode },
4651 { VEX_LEN_TABLE (VEX_LEN_383D_P_2) },
4654 /* PREFIX_VEX_383E */
4656 { Bad_Opcode },
4657 { Bad_Opcode },
4658 { VEX_LEN_TABLE (VEX_LEN_383E_P_2) },
4661 /* PREFIX_VEX_383F */
4663 { Bad_Opcode },
4664 { Bad_Opcode },
4665 { VEX_LEN_TABLE (VEX_LEN_383F_P_2) },
4668 /* PREFIX_VEX_3840 */
4670 { Bad_Opcode },
4671 { Bad_Opcode },
4672 { VEX_LEN_TABLE (VEX_LEN_3840_P_2) },
4675 /* PREFIX_VEX_3841 */
4677 { Bad_Opcode },
4678 { Bad_Opcode },
4679 { VEX_LEN_TABLE (VEX_LEN_3841_P_2) },
4682 /* PREFIX_VEX_3896 */
4684 { Bad_Opcode },
4685 { Bad_Opcode },
4686 { "vfmaddsub132p%XW", { XM, Vex, EXx } },
4689 /* PREFIX_VEX_3897 */
4691 { Bad_Opcode },
4692 { Bad_Opcode },
4693 { "vfmsubadd132p%XW", { XM, Vex, EXx } },
4696 /* PREFIX_VEX_3898 */
4698 { Bad_Opcode },
4699 { Bad_Opcode },
4700 { "vfmadd132p%XW", { XM, Vex, EXx } },
4703 /* PREFIX_VEX_3899 */
4705 { Bad_Opcode },
4706 { Bad_Opcode },
4707 { "vfmadd132s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
4710 /* PREFIX_VEX_389A */
4712 { Bad_Opcode },
4713 { Bad_Opcode },
4714 { "vfmsub132p%XW", { XM, Vex, EXx } },
4717 /* PREFIX_VEX_389B */
4719 { Bad_Opcode },
4720 { Bad_Opcode },
4721 { "vfmsub132s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
4724 /* PREFIX_VEX_389C */
4726 { Bad_Opcode },
4727 { Bad_Opcode },
4728 { "vfnmadd132p%XW", { XM, Vex, EXx } },
4731 /* PREFIX_VEX_389D */
4733 { Bad_Opcode },
4734 { Bad_Opcode },
4735 { "vfnmadd132s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
4738 /* PREFIX_VEX_389E */
4740 { Bad_Opcode },
4741 { Bad_Opcode },
4742 { "vfnmsub132p%XW", { XM, Vex, EXx } },
4745 /* PREFIX_VEX_389F */
4747 { Bad_Opcode },
4748 { Bad_Opcode },
4749 { "vfnmsub132s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
4752 /* PREFIX_VEX_38A6 */
4754 { Bad_Opcode },
4755 { Bad_Opcode },
4756 { "vfmaddsub213p%XW", { XM, Vex, EXx } },
4757 { Bad_Opcode },
4760 /* PREFIX_VEX_38A7 */
4762 { Bad_Opcode },
4763 { Bad_Opcode },
4764 { "vfmsubadd213p%XW", { XM, Vex, EXx } },
4767 /* PREFIX_VEX_38A8 */
4769 { Bad_Opcode },
4770 { Bad_Opcode },
4771 { "vfmadd213p%XW", { XM, Vex, EXx } },
4774 /* PREFIX_VEX_38A9 */
4776 { Bad_Opcode },
4777 { Bad_Opcode },
4778 { "vfmadd213s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
4781 /* PREFIX_VEX_38AA */
4783 { Bad_Opcode },
4784 { Bad_Opcode },
4785 { "vfmsub213p%XW", { XM, Vex, EXx } },
4788 /* PREFIX_VEX_38AB */
4790 { Bad_Opcode },
4791 { Bad_Opcode },
4792 { "vfmsub213s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
4795 /* PREFIX_VEX_38AC */
4797 { Bad_Opcode },
4798 { Bad_Opcode },
4799 { "vfnmadd213p%XW", { XM, Vex, EXx } },
4802 /* PREFIX_VEX_38AD */
4804 { Bad_Opcode },
4805 { Bad_Opcode },
4806 { "vfnmadd213s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
4809 /* PREFIX_VEX_38AE */
4811 { Bad_Opcode },
4812 { Bad_Opcode },
4813 { "vfnmsub213p%XW", { XM, Vex, EXx } },
4816 /* PREFIX_VEX_38AF */
4818 { Bad_Opcode },
4819 { Bad_Opcode },
4820 { "vfnmsub213s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
4823 /* PREFIX_VEX_38B6 */
4825 { Bad_Opcode },
4826 { Bad_Opcode },
4827 { "vfmaddsub231p%XW", { XM, Vex, EXx } },
4830 /* PREFIX_VEX_38B7 */
4832 { Bad_Opcode },
4833 { Bad_Opcode },
4834 { "vfmsubadd231p%XW", { XM, Vex, EXx } },
4837 /* PREFIX_VEX_38B8 */
4839 { Bad_Opcode },
4840 { Bad_Opcode },
4841 { "vfmadd231p%XW", { XM, Vex, EXx } },
4844 /* PREFIX_VEX_38B9 */
4846 { Bad_Opcode },
4847 { Bad_Opcode },
4848 { "vfmadd231s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
4851 /* PREFIX_VEX_38BA */
4853 { Bad_Opcode },
4854 { Bad_Opcode },
4855 { "vfmsub231p%XW", { XM, Vex, EXx } },
4858 /* PREFIX_VEX_38BB */
4860 { Bad_Opcode },
4861 { Bad_Opcode },
4862 { "vfmsub231s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
4865 /* PREFIX_VEX_38BC */
4867 { Bad_Opcode },
4868 { Bad_Opcode },
4869 { "vfnmadd231p%XW", { XM, Vex, EXx } },
4872 /* PREFIX_VEX_38BD */
4874 { Bad_Opcode },
4875 { Bad_Opcode },
4876 { "vfnmadd231s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
4879 /* PREFIX_VEX_38BE */
4881 { Bad_Opcode },
4882 { Bad_Opcode },
4883 { "vfnmsub231p%XW", { XM, Vex, EXx } },
4886 /* PREFIX_VEX_38BF */
4888 { Bad_Opcode },
4889 { Bad_Opcode },
4890 { "vfnmsub231s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
4893 /* PREFIX_VEX_38DB */
4895 { Bad_Opcode },
4896 { Bad_Opcode },
4897 { VEX_LEN_TABLE (VEX_LEN_38DB_P_2) },
4900 /* PREFIX_VEX_38DC */
4902 { Bad_Opcode },
4903 { Bad_Opcode },
4904 { VEX_LEN_TABLE (VEX_LEN_38DC_P_2) },
4907 /* PREFIX_VEX_38DD */
4909 { Bad_Opcode },
4910 { Bad_Opcode },
4911 { VEX_LEN_TABLE (VEX_LEN_38DD_P_2) },
4914 /* PREFIX_VEX_38DE */
4916 { Bad_Opcode },
4917 { Bad_Opcode },
4918 { VEX_LEN_TABLE (VEX_LEN_38DE_P_2) },
4921 /* PREFIX_VEX_38DF */
4923 { Bad_Opcode },
4924 { Bad_Opcode },
4925 { VEX_LEN_TABLE (VEX_LEN_38DF_P_2) },
4928 /* PREFIX_VEX_3A04 */
4930 { Bad_Opcode },
4931 { Bad_Opcode },
4932 { VEX_W_TABLE (VEX_W_3A04_P_2) },
4935 /* PREFIX_VEX_3A05 */
4937 { Bad_Opcode },
4938 { Bad_Opcode },
4939 { VEX_W_TABLE (VEX_W_3A05_P_2) },
4942 /* PREFIX_VEX_3A06 */
4944 { Bad_Opcode },
4945 { Bad_Opcode },
4946 { VEX_LEN_TABLE (VEX_LEN_3A06_P_2) },
4949 /* PREFIX_VEX_3A08 */
4951 { Bad_Opcode },
4952 { Bad_Opcode },
4953 { VEX_W_TABLE (VEX_W_3A08_P_2) },
4956 /* PREFIX_VEX_3A09 */
4958 { Bad_Opcode },
4959 { Bad_Opcode },
4960 { VEX_W_TABLE (VEX_W_3A09_P_2) },
4963 /* PREFIX_VEX_3A0A */
4965 { Bad_Opcode },
4966 { Bad_Opcode },
4967 { VEX_LEN_TABLE (VEX_LEN_3A0A_P_2) },
4970 /* PREFIX_VEX_3A0B */
4972 { Bad_Opcode },
4973 { Bad_Opcode },
4974 { VEX_LEN_TABLE (VEX_LEN_3A0B_P_2) },
4977 /* PREFIX_VEX_3A0C */
4979 { Bad_Opcode },
4980 { Bad_Opcode },
4981 { VEX_W_TABLE (VEX_W_3A0C_P_2) },
4984 /* PREFIX_VEX_3A0D */
4986 { Bad_Opcode },
4987 { Bad_Opcode },
4988 { VEX_W_TABLE (VEX_W_3A0D_P_2) },
4991 /* PREFIX_VEX_3A0E */
4993 { Bad_Opcode },
4994 { Bad_Opcode },
4995 { VEX_LEN_TABLE (VEX_LEN_3A0E_P_2) },
4998 /* PREFIX_VEX_3A0F */
5000 { Bad_Opcode },
5001 { Bad_Opcode },
5002 { VEX_LEN_TABLE (VEX_LEN_3A0F_P_2) },
5005 /* PREFIX_VEX_3A14 */
5007 { Bad_Opcode },
5008 { Bad_Opcode },
5009 { VEX_LEN_TABLE (VEX_LEN_3A14_P_2) },
5012 /* PREFIX_VEX_3A15 */
5014 { Bad_Opcode },
5015 { Bad_Opcode },
5016 { VEX_LEN_TABLE (VEX_LEN_3A15_P_2) },
5019 /* PREFIX_VEX_3A16 */
5021 { Bad_Opcode },
5022 { Bad_Opcode },
5023 { VEX_LEN_TABLE (VEX_LEN_3A16_P_2) },
5026 /* PREFIX_VEX_3A17 */
5028 { Bad_Opcode },
5029 { Bad_Opcode },
5030 { VEX_LEN_TABLE (VEX_LEN_3A17_P_2) },
5033 /* PREFIX_VEX_3A18 */
5035 { Bad_Opcode },
5036 { Bad_Opcode },
5037 { VEX_LEN_TABLE (VEX_LEN_3A18_P_2) },
5040 /* PREFIX_VEX_3A19 */
5042 { Bad_Opcode },
5043 { Bad_Opcode },
5044 { VEX_LEN_TABLE (VEX_LEN_3A19_P_2) },
5047 /* PREFIX_VEX_3A20 */
5049 { Bad_Opcode },
5050 { Bad_Opcode },
5051 { VEX_LEN_TABLE (VEX_LEN_3A20_P_2) },
5054 /* PREFIX_VEX_3A21 */
5056 { Bad_Opcode },
5057 { Bad_Opcode },
5058 { VEX_LEN_TABLE (VEX_LEN_3A21_P_2) },
5061 /* PREFIX_VEX_3A22 */
5063 { Bad_Opcode },
5064 { Bad_Opcode },
5065 { VEX_LEN_TABLE (VEX_LEN_3A22_P_2) },
5068 /* PREFIX_VEX_3A40 */
5070 { Bad_Opcode },
5071 { Bad_Opcode },
5072 { VEX_W_TABLE (VEX_W_3A40_P_2) },
5075 /* PREFIX_VEX_3A41 */
5077 { Bad_Opcode },
5078 { Bad_Opcode },
5079 { VEX_LEN_TABLE (VEX_LEN_3A41_P_2) },
5082 /* PREFIX_VEX_3A42 */
5084 { Bad_Opcode },
5085 { Bad_Opcode },
5086 { VEX_LEN_TABLE (VEX_LEN_3A42_P_2) },
5089 /* PREFIX_VEX_3A44 */
5091 { Bad_Opcode },
5092 { Bad_Opcode },
5093 { VEX_LEN_TABLE (VEX_LEN_3A44_P_2) },
5096 /* PREFIX_VEX_3A48 */
5098 { Bad_Opcode },
5099 { Bad_Opcode },
5100 { VEX_W_TABLE (VEX_W_3A48_P_2) },
5103 /* PREFIX_VEX_3A49 */
5105 { Bad_Opcode },
5106 { Bad_Opcode },
5107 { VEX_W_TABLE (VEX_W_3A49_P_2) },
5110 /* PREFIX_VEX_3A4A */
5112 { Bad_Opcode },
5113 { Bad_Opcode },
5114 { VEX_W_TABLE (VEX_W_3A4A_P_2) },
5117 /* PREFIX_VEX_3A4B */
5119 { Bad_Opcode },
5120 { Bad_Opcode },
5121 { VEX_W_TABLE (VEX_W_3A4B_P_2) },
5124 /* PREFIX_VEX_3A4C */
5126 { Bad_Opcode },
5127 { Bad_Opcode },
5128 { VEX_LEN_TABLE (VEX_LEN_3A4C_P_2) },
5131 /* PREFIX_VEX_3A5C */
5133 { Bad_Opcode },
5134 { Bad_Opcode },
5135 { "vfmaddsubps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5138 /* PREFIX_VEX_3A5D */
5140 { Bad_Opcode },
5141 { Bad_Opcode },
5142 { "vfmaddsubpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5145 /* PREFIX_VEX_3A5E */
5147 { Bad_Opcode },
5148 { Bad_Opcode },
5149 { "vfmsubaddps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5152 /* PREFIX_VEX_3A5F */
5154 { Bad_Opcode },
5155 { Bad_Opcode },
5156 { "vfmsubaddpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5159 /* PREFIX_VEX_3A60 */
5161 { Bad_Opcode },
5162 { Bad_Opcode },
5163 { VEX_LEN_TABLE (VEX_LEN_3A60_P_2) },
5164 { Bad_Opcode },
5167 /* PREFIX_VEX_3A61 */
5169 { Bad_Opcode },
5170 { Bad_Opcode },
5171 { VEX_LEN_TABLE (VEX_LEN_3A61_P_2) },
5174 /* PREFIX_VEX_3A62 */
5176 { Bad_Opcode },
5177 { Bad_Opcode },
5178 { VEX_LEN_TABLE (VEX_LEN_3A62_P_2) },
5181 /* PREFIX_VEX_3A63 */
5183 { Bad_Opcode },
5184 { Bad_Opcode },
5185 { VEX_LEN_TABLE (VEX_LEN_3A63_P_2) },
5188 /* PREFIX_VEX_3A68 */
5190 { Bad_Opcode },
5191 { Bad_Opcode },
5192 { "vfmaddps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5195 /* PREFIX_VEX_3A69 */
5197 { Bad_Opcode },
5198 { Bad_Opcode },
5199 { "vfmaddpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5202 /* PREFIX_VEX_3A6A */
5204 { Bad_Opcode },
5205 { Bad_Opcode },
5206 { VEX_LEN_TABLE (VEX_LEN_3A6A_P_2) },
5209 /* PREFIX_VEX_3A6B */
5211 { Bad_Opcode },
5212 { Bad_Opcode },
5213 { VEX_LEN_TABLE (VEX_LEN_3A6B_P_2) },
5216 /* PREFIX_VEX_3A6C */
5218 { Bad_Opcode },
5219 { Bad_Opcode },
5220 { "vfmsubps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5223 /* PREFIX_VEX_3A6D */
5225 { Bad_Opcode },
5226 { Bad_Opcode },
5227 { "vfmsubpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5230 /* PREFIX_VEX_3A6E */
5232 { Bad_Opcode },
5233 { Bad_Opcode },
5234 { VEX_LEN_TABLE (VEX_LEN_3A6E_P_2) },
5237 /* PREFIX_VEX_3A6F */
5239 { Bad_Opcode },
5240 { Bad_Opcode },
5241 { VEX_LEN_TABLE (VEX_LEN_3A6F_P_2) },
5244 /* PREFIX_VEX_3A78 */
5246 { Bad_Opcode },
5247 { Bad_Opcode },
5248 { "vfnmaddps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5251 /* PREFIX_VEX_3A79 */
5253 { Bad_Opcode },
5254 { Bad_Opcode },
5255 { "vfnmaddpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5258 /* PREFIX_VEX_3A7A */
5260 { Bad_Opcode },
5261 { Bad_Opcode },
5262 { VEX_LEN_TABLE (VEX_LEN_3A7A_P_2) },
5265 /* PREFIX_VEX_3A7B */
5267 { Bad_Opcode },
5268 { Bad_Opcode },
5269 { VEX_LEN_TABLE (VEX_LEN_3A7B_P_2) },
5272 /* PREFIX_VEX_3A7C */
5274 { Bad_Opcode },
5275 { Bad_Opcode },
5276 { "vfnmsubps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5277 { Bad_Opcode },
5280 /* PREFIX_VEX_3A7D */
5282 { Bad_Opcode },
5283 { Bad_Opcode },
5284 { "vfnmsubpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5287 /* PREFIX_VEX_3A7E */
5289 { Bad_Opcode },
5290 { Bad_Opcode },
5291 { VEX_LEN_TABLE (VEX_LEN_3A7E_P_2) },
5294 /* PREFIX_VEX_3A7F */
5296 { Bad_Opcode },
5297 { Bad_Opcode },
5298 { VEX_LEN_TABLE (VEX_LEN_3A7F_P_2) },
5301 /* PREFIX_VEX_3ADF */
5303 { Bad_Opcode },
5304 { Bad_Opcode },
5305 { VEX_LEN_TABLE (VEX_LEN_3ADF_P_2) },
5309 static const struct dis386 x86_64_table[][2] = {
5310 /* X86_64_06 */
5312 { "push{T|}", { es } },
5315 /* X86_64_07 */
5317 { "pop{T|}", { es } },
5320 /* X86_64_0D */
5322 { "push{T|}", { cs } },
5325 /* X86_64_16 */
5327 { "push{T|}", { ss } },
5330 /* X86_64_17 */
5332 { "pop{T|}", { ss } },
5335 /* X86_64_1E */
5337 { "push{T|}", { ds } },
5340 /* X86_64_1F */
5342 { "pop{T|}", { ds } },
5345 /* X86_64_27 */
5347 { "daa", { XX } },
5350 /* X86_64_2F */
5352 { "das", { XX } },
5355 /* X86_64_37 */
5357 { "aaa", { XX } },
5360 /* X86_64_3F */
5362 { "aas", { XX } },
5365 /* X86_64_60 */
5367 { "pusha{P|}", { XX } },
5370 /* X86_64_61 */
5372 { "popa{P|}", { XX } },
5375 /* X86_64_62 */
5377 { MOD_TABLE (MOD_62_32BIT) },
5380 /* X86_64_63 */
5382 { "arpl", { Ew, Gw } },
5383 { "movs{lq|xd}", { Gv, Ed } },
5386 /* X86_64_6D */
5388 { "ins{R|}", { Yzr, indirDX } },
5389 { "ins{G|}", { Yzr, indirDX } },
5392 /* X86_64_6F */
5394 { "outs{R|}", { indirDXr, Xz } },
5395 { "outs{G|}", { indirDXr, Xz } },
5398 /* X86_64_9A */
5400 { "Jcall{T|}", { Ap } },
5403 /* X86_64_C4 */
5405 { MOD_TABLE (MOD_C4_32BIT) },
5406 { VEX_C4_TABLE (VEX_0F) },
5409 /* X86_64_C5 */
5411 { MOD_TABLE (MOD_C5_32BIT) },
5412 { VEX_C5_TABLE (VEX_0F) },
5415 /* X86_64_CE */
5417 { "into", { XX } },
5420 /* X86_64_D4 */
5422 { "aam", { sIb } },
5425 /* X86_64_D5 */
5427 { "aad", { sIb } },
5430 /* X86_64_EA */
5432 { "Jjmp{T|}", { Ap } },
5435 /* X86_64_0F01_REG_0 */
5437 { "sgdt{Q|IQ}", { M } },
5438 { "sgdt", { M } },
5441 /* X86_64_0F01_REG_1 */
5443 { "sidt{Q|IQ}", { M } },
5444 { "sidt", { M } },
5447 /* X86_64_0F01_REG_2 */
5449 { "lgdt{Q|Q}", { M } },
5450 { "lgdt", { M } },
5453 /* X86_64_0F01_REG_3 */
5455 { "lidt{Q|Q}", { M } },
5456 { "lidt", { M } },
5460 static const struct dis386 three_byte_table[][256] = {
5462 /* THREE_BYTE_0F38 */
5464 /* 00 */
5465 { "pshufb", { MX, EM } },
5466 { "phaddw", { MX, EM } },
5467 { "phaddd", { MX, EM } },
5468 { "phaddsw", { MX, EM } },
5469 { "pmaddubsw", { MX, EM } },
5470 { "phsubw", { MX, EM } },
5471 { "phsubd", { MX, EM } },
5472 { "phsubsw", { MX, EM } },
5473 /* 08 */
5474 { "psignb", { MX, EM } },
5475 { "psignw", { MX, EM } },
5476 { "psignd", { MX, EM } },
5477 { "pmulhrsw", { MX, EM } },
5478 { Bad_Opcode },
5479 { Bad_Opcode },
5480 { Bad_Opcode },
5481 { Bad_Opcode },
5482 /* 10 */
5483 { PREFIX_TABLE (PREFIX_0F3810) },
5484 { Bad_Opcode },
5485 { Bad_Opcode },
5486 { Bad_Opcode },
5487 { PREFIX_TABLE (PREFIX_0F3814) },
5488 { PREFIX_TABLE (PREFIX_0F3815) },
5489 { Bad_Opcode },
5490 { PREFIX_TABLE (PREFIX_0F3817) },
5491 /* 18 */
5492 { Bad_Opcode },
5493 { Bad_Opcode },
5494 { Bad_Opcode },
5495 { Bad_Opcode },
5496 { "pabsb", { MX, EM } },
5497 { "pabsw", { MX, EM } },
5498 { "pabsd", { MX, EM } },
5499 { Bad_Opcode },
5500 /* 20 */
5501 { PREFIX_TABLE (PREFIX_0F3820) },
5502 { PREFIX_TABLE (PREFIX_0F3821) },
5503 { PREFIX_TABLE (PREFIX_0F3822) },
5504 { PREFIX_TABLE (PREFIX_0F3823) },
5505 { PREFIX_TABLE (PREFIX_0F3824) },
5506 { PREFIX_TABLE (PREFIX_0F3825) },
5507 { Bad_Opcode },
5508 { Bad_Opcode },
5509 /* 28 */
5510 { PREFIX_TABLE (PREFIX_0F3828) },
5511 { PREFIX_TABLE (PREFIX_0F3829) },
5512 { PREFIX_TABLE (PREFIX_0F382A) },
5513 { PREFIX_TABLE (PREFIX_0F382B) },
5514 { Bad_Opcode },
5515 { Bad_Opcode },
5516 { Bad_Opcode },
5517 { Bad_Opcode },
5518 /* 30 */
5519 { PREFIX_TABLE (PREFIX_0F3830) },
5520 { PREFIX_TABLE (PREFIX_0F3831) },
5521 { PREFIX_TABLE (PREFIX_0F3832) },
5522 { PREFIX_TABLE (PREFIX_0F3833) },
5523 { PREFIX_TABLE (PREFIX_0F3834) },
5524 { PREFIX_TABLE (PREFIX_0F3835) },
5525 { Bad_Opcode },
5526 { PREFIX_TABLE (PREFIX_0F3837) },
5527 /* 38 */
5528 { PREFIX_TABLE (PREFIX_0F3838) },
5529 { PREFIX_TABLE (PREFIX_0F3839) },
5530 { PREFIX_TABLE (PREFIX_0F383A) },
5531 { PREFIX_TABLE (PREFIX_0F383B) },
5532 { PREFIX_TABLE (PREFIX_0F383C) },
5533 { PREFIX_TABLE (PREFIX_0F383D) },
5534 { PREFIX_TABLE (PREFIX_0F383E) },
5535 { PREFIX_TABLE (PREFIX_0F383F) },
5536 /* 40 */
5537 { PREFIX_TABLE (PREFIX_0F3840) },
5538 { PREFIX_TABLE (PREFIX_0F3841) },
5539 { Bad_Opcode },
5540 { Bad_Opcode },
5541 { Bad_Opcode },
5542 { Bad_Opcode },
5543 { Bad_Opcode },
5544 { Bad_Opcode },
5545 /* 48 */
5546 { Bad_Opcode },
5547 { Bad_Opcode },
5548 { Bad_Opcode },
5549 { Bad_Opcode },
5550 { Bad_Opcode },
5551 { Bad_Opcode },
5552 { Bad_Opcode },
5553 { Bad_Opcode },
5554 /* 50 */
5555 { Bad_Opcode },
5556 { Bad_Opcode },
5557 { Bad_Opcode },
5558 { Bad_Opcode },
5559 { Bad_Opcode },
5560 { Bad_Opcode },
5561 { Bad_Opcode },
5562 { Bad_Opcode },
5563 /* 58 */
5564 { Bad_Opcode },
5565 { Bad_Opcode },
5566 { Bad_Opcode },
5567 { Bad_Opcode },
5568 { Bad_Opcode },
5569 { Bad_Opcode },
5570 { Bad_Opcode },
5571 { Bad_Opcode },
5572 /* 60 */
5573 { Bad_Opcode },
5574 { Bad_Opcode },
5575 { Bad_Opcode },
5576 { Bad_Opcode },
5577 { Bad_Opcode },
5578 { Bad_Opcode },
5579 { Bad_Opcode },
5580 { Bad_Opcode },
5581 /* 68 */
5582 { Bad_Opcode },
5583 { Bad_Opcode },
5584 { Bad_Opcode },
5585 { Bad_Opcode },
5586 { Bad_Opcode },
5587 { Bad_Opcode },
5588 { Bad_Opcode },
5589 { Bad_Opcode },
5590 /* 70 */
5591 { Bad_Opcode },
5592 { Bad_Opcode },
5593 { Bad_Opcode },
5594 { Bad_Opcode },
5595 { Bad_Opcode },
5596 { Bad_Opcode },
5597 { Bad_Opcode },
5598 { Bad_Opcode },
5599 /* 78 */
5600 { Bad_Opcode },
5601 { Bad_Opcode },
5602 { Bad_Opcode },
5603 { Bad_Opcode },
5604 { Bad_Opcode },
5605 { Bad_Opcode },
5606 { Bad_Opcode },
5607 { Bad_Opcode },
5608 /* 80 */
5609 { PREFIX_TABLE (PREFIX_0F3880) },
5610 { PREFIX_TABLE (PREFIX_0F3881) },
5611 { Bad_Opcode },
5612 { Bad_Opcode },
5613 { Bad_Opcode },
5614 { Bad_Opcode },
5615 { Bad_Opcode },
5616 { Bad_Opcode },
5617 /* 88 */
5618 { Bad_Opcode },
5619 { Bad_Opcode },
5620 { Bad_Opcode },
5621 { Bad_Opcode },
5622 { Bad_Opcode },
5623 { Bad_Opcode },
5624 { Bad_Opcode },
5625 { Bad_Opcode },
5626 /* 90 */
5627 { Bad_Opcode },
5628 { Bad_Opcode },
5629 { Bad_Opcode },
5630 { Bad_Opcode },
5631 { Bad_Opcode },
5632 { Bad_Opcode },
5633 { Bad_Opcode },
5634 { Bad_Opcode },
5635 /* 98 */
5636 { Bad_Opcode },
5637 { Bad_Opcode },
5638 { Bad_Opcode },
5639 { Bad_Opcode },
5640 { Bad_Opcode },
5641 { Bad_Opcode },
5642 { Bad_Opcode },
5643 { Bad_Opcode },
5644 /* a0 */
5645 { Bad_Opcode },
5646 { Bad_Opcode },
5647 { Bad_Opcode },
5648 { Bad_Opcode },
5649 { Bad_Opcode },
5650 { Bad_Opcode },
5651 { Bad_Opcode },
5652 { Bad_Opcode },
5653 /* a8 */
5654 { Bad_Opcode },
5655 { Bad_Opcode },
5656 { Bad_Opcode },
5657 { Bad_Opcode },
5658 { Bad_Opcode },
5659 { Bad_Opcode },
5660 { Bad_Opcode },
5661 { Bad_Opcode },
5662 /* b0 */
5663 { Bad_Opcode },
5664 { Bad_Opcode },
5665 { Bad_Opcode },
5666 { Bad_Opcode },
5667 { Bad_Opcode },
5668 { Bad_Opcode },
5669 { Bad_Opcode },
5670 { Bad_Opcode },
5671 /* b8 */
5672 { Bad_Opcode },
5673 { Bad_Opcode },
5674 { Bad_Opcode },
5675 { Bad_Opcode },
5676 { Bad_Opcode },
5677 { Bad_Opcode },
5678 { Bad_Opcode },
5679 { Bad_Opcode },
5680 /* c0 */
5681 { Bad_Opcode },
5682 { Bad_Opcode },
5683 { Bad_Opcode },
5684 { Bad_Opcode },
5685 { Bad_Opcode },
5686 { Bad_Opcode },
5687 { Bad_Opcode },
5688 { Bad_Opcode },
5689 /* c8 */
5690 { Bad_Opcode },
5691 { Bad_Opcode },
5692 { Bad_Opcode },
5693 { Bad_Opcode },
5694 { Bad_Opcode },
5695 { Bad_Opcode },
5696 { Bad_Opcode },
5697 { Bad_Opcode },
5698 /* d0 */
5699 { Bad_Opcode },
5700 { Bad_Opcode },
5701 { Bad_Opcode },
5702 { Bad_Opcode },
5703 { Bad_Opcode },
5704 { Bad_Opcode },
5705 { Bad_Opcode },
5706 { Bad_Opcode },
5707 /* d8 */
5708 { Bad_Opcode },
5709 { Bad_Opcode },
5710 { Bad_Opcode },
5711 { PREFIX_TABLE (PREFIX_0F38DB) },
5712 { PREFIX_TABLE (PREFIX_0F38DC) },
5713 { PREFIX_TABLE (PREFIX_0F38DD) },
5714 { PREFIX_TABLE (PREFIX_0F38DE) },
5715 { PREFIX_TABLE (PREFIX_0F38DF) },
5716 /* e0 */
5717 { Bad_Opcode },
5718 { Bad_Opcode },
5719 { Bad_Opcode },
5720 { Bad_Opcode },
5721 { Bad_Opcode },
5722 { Bad_Opcode },
5723 { Bad_Opcode },
5724 { Bad_Opcode },
5725 /* e8 */
5726 { Bad_Opcode },
5727 { Bad_Opcode },
5728 { Bad_Opcode },
5729 { Bad_Opcode },
5730 { Bad_Opcode },
5731 { Bad_Opcode },
5732 { Bad_Opcode },
5733 { Bad_Opcode },
5734 /* f0 */
5735 { PREFIX_TABLE (PREFIX_0F38F0) },
5736 { PREFIX_TABLE (PREFIX_0F38F1) },
5737 { Bad_Opcode },
5738 { Bad_Opcode },
5739 { Bad_Opcode },
5740 { Bad_Opcode },
5741 { Bad_Opcode },
5742 { Bad_Opcode },
5743 /* f8 */
5744 { Bad_Opcode },
5745 { Bad_Opcode },
5746 { Bad_Opcode },
5747 { Bad_Opcode },
5748 { Bad_Opcode },
5749 { Bad_Opcode },
5750 { Bad_Opcode },
5751 { Bad_Opcode },
5753 /* THREE_BYTE_0F3A */
5755 /* 00 */
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 /* 08 */
5765 { PREFIX_TABLE (PREFIX_0F3A08) },
5766 { PREFIX_TABLE (PREFIX_0F3A09) },
5767 { PREFIX_TABLE (PREFIX_0F3A0A) },
5768 { PREFIX_TABLE (PREFIX_0F3A0B) },
5769 { PREFIX_TABLE (PREFIX_0F3A0C) },
5770 { PREFIX_TABLE (PREFIX_0F3A0D) },
5771 { PREFIX_TABLE (PREFIX_0F3A0E) },
5772 { "palignr", { MX, EM, Ib } },
5773 /* 10 */
5774 { Bad_Opcode },
5775 { Bad_Opcode },
5776 { Bad_Opcode },
5777 { Bad_Opcode },
5778 { PREFIX_TABLE (PREFIX_0F3A14) },
5779 { PREFIX_TABLE (PREFIX_0F3A15) },
5780 { PREFIX_TABLE (PREFIX_0F3A16) },
5781 { PREFIX_TABLE (PREFIX_0F3A17) },
5782 /* 18 */
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 /* 20 */
5792 { PREFIX_TABLE (PREFIX_0F3A20) },
5793 { PREFIX_TABLE (PREFIX_0F3A21) },
5794 { PREFIX_TABLE (PREFIX_0F3A22) },
5795 { Bad_Opcode },
5796 { Bad_Opcode },
5797 { Bad_Opcode },
5798 { Bad_Opcode },
5799 { Bad_Opcode },
5800 /* 28 */
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 /* 30 */
5810 { Bad_Opcode },
5811 { Bad_Opcode },
5812 { Bad_Opcode },
5813 { Bad_Opcode },
5814 { Bad_Opcode },
5815 { Bad_Opcode },
5816 { Bad_Opcode },
5817 { Bad_Opcode },
5818 /* 38 */
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 /* 40 */
5828 { PREFIX_TABLE (PREFIX_0F3A40) },
5829 { PREFIX_TABLE (PREFIX_0F3A41) },
5830 { PREFIX_TABLE (PREFIX_0F3A42) },
5831 { Bad_Opcode },
5832 { PREFIX_TABLE (PREFIX_0F3A44) },
5833 { Bad_Opcode },
5834 { Bad_Opcode },
5835 { Bad_Opcode },
5836 /* 48 */
5837 { Bad_Opcode },
5838 { Bad_Opcode },
5839 { Bad_Opcode },
5840 { Bad_Opcode },
5841 { Bad_Opcode },
5842 { Bad_Opcode },
5843 { Bad_Opcode },
5844 { Bad_Opcode },
5845 /* 50 */
5846 { Bad_Opcode },
5847 { Bad_Opcode },
5848 { Bad_Opcode },
5849 { Bad_Opcode },
5850 { Bad_Opcode },
5851 { Bad_Opcode },
5852 { Bad_Opcode },
5853 { Bad_Opcode },
5854 /* 58 */
5855 { Bad_Opcode },
5856 { Bad_Opcode },
5857 { Bad_Opcode },
5858 { Bad_Opcode },
5859 { Bad_Opcode },
5860 { Bad_Opcode },
5861 { Bad_Opcode },
5862 { Bad_Opcode },
5863 /* 60 */
5864 { PREFIX_TABLE (PREFIX_0F3A60) },
5865 { PREFIX_TABLE (PREFIX_0F3A61) },
5866 { PREFIX_TABLE (PREFIX_0F3A62) },
5867 { PREFIX_TABLE (PREFIX_0F3A63) },
5868 { Bad_Opcode },
5869 { Bad_Opcode },
5870 { Bad_Opcode },
5871 { Bad_Opcode },
5872 /* 68 */
5873 { Bad_Opcode },
5874 { Bad_Opcode },
5875 { Bad_Opcode },
5876 { Bad_Opcode },
5877 { Bad_Opcode },
5878 { Bad_Opcode },
5879 { Bad_Opcode },
5880 { Bad_Opcode },
5881 /* 70 */
5882 { Bad_Opcode },
5883 { Bad_Opcode },
5884 { Bad_Opcode },
5885 { Bad_Opcode },
5886 { Bad_Opcode },
5887 { Bad_Opcode },
5888 { Bad_Opcode },
5889 { Bad_Opcode },
5890 /* 78 */
5891 { Bad_Opcode },
5892 { Bad_Opcode },
5893 { Bad_Opcode },
5894 { Bad_Opcode },
5895 { Bad_Opcode },
5896 { Bad_Opcode },
5897 { Bad_Opcode },
5898 { Bad_Opcode },
5899 /* 80 */
5900 { Bad_Opcode },
5901 { Bad_Opcode },
5902 { Bad_Opcode },
5903 { Bad_Opcode },
5904 { Bad_Opcode },
5905 { Bad_Opcode },
5906 { Bad_Opcode },
5907 { Bad_Opcode },
5908 /* 88 */
5909 { Bad_Opcode },
5910 { Bad_Opcode },
5911 { Bad_Opcode },
5912 { Bad_Opcode },
5913 { Bad_Opcode },
5914 { Bad_Opcode },
5915 { Bad_Opcode },
5916 { Bad_Opcode },
5917 /* 90 */
5918 { Bad_Opcode },
5919 { Bad_Opcode },
5920 { Bad_Opcode },
5921 { Bad_Opcode },
5922 { Bad_Opcode },
5923 { Bad_Opcode },
5924 { Bad_Opcode },
5925 { Bad_Opcode },
5926 /* 98 */
5927 { Bad_Opcode },
5928 { Bad_Opcode },
5929 { Bad_Opcode },
5930 { Bad_Opcode },
5931 { Bad_Opcode },
5932 { Bad_Opcode },
5933 { Bad_Opcode },
5934 { Bad_Opcode },
5935 /* a0 */
5936 { Bad_Opcode },
5937 { Bad_Opcode },
5938 { Bad_Opcode },
5939 { Bad_Opcode },
5940 { Bad_Opcode },
5941 { Bad_Opcode },
5942 { Bad_Opcode },
5943 { Bad_Opcode },
5944 /* a8 */
5945 { Bad_Opcode },
5946 { Bad_Opcode },
5947 { Bad_Opcode },
5948 { Bad_Opcode },
5949 { Bad_Opcode },
5950 { Bad_Opcode },
5951 { Bad_Opcode },
5952 { Bad_Opcode },
5953 /* b0 */
5954 { Bad_Opcode },
5955 { Bad_Opcode },
5956 { Bad_Opcode },
5957 { Bad_Opcode },
5958 { Bad_Opcode },
5959 { Bad_Opcode },
5960 { Bad_Opcode },
5961 { Bad_Opcode },
5962 /* b8 */
5963 { Bad_Opcode },
5964 { Bad_Opcode },
5965 { Bad_Opcode },
5966 { Bad_Opcode },
5967 { Bad_Opcode },
5968 { Bad_Opcode },
5969 { Bad_Opcode },
5970 { Bad_Opcode },
5971 /* c0 */
5972 { Bad_Opcode },
5973 { Bad_Opcode },
5974 { Bad_Opcode },
5975 { Bad_Opcode },
5976 { Bad_Opcode },
5977 { Bad_Opcode },
5978 { Bad_Opcode },
5979 { Bad_Opcode },
5980 /* c8 */
5981 { Bad_Opcode },
5982 { Bad_Opcode },
5983 { Bad_Opcode },
5984 { Bad_Opcode },
5985 { Bad_Opcode },
5986 { Bad_Opcode },
5987 { Bad_Opcode },
5988 { Bad_Opcode },
5989 /* d0 */
5990 { Bad_Opcode },
5991 { Bad_Opcode },
5992 { Bad_Opcode },
5993 { Bad_Opcode },
5994 { Bad_Opcode },
5995 { Bad_Opcode },
5996 { Bad_Opcode },
5997 { Bad_Opcode },
5998 /* d8 */
5999 { Bad_Opcode },
6000 { Bad_Opcode },
6001 { Bad_Opcode },
6002 { Bad_Opcode },
6003 { Bad_Opcode },
6004 { Bad_Opcode },
6005 { Bad_Opcode },
6006 { PREFIX_TABLE (PREFIX_0F3ADF) },
6007 /* e0 */
6008 { Bad_Opcode },
6009 { Bad_Opcode },
6010 { Bad_Opcode },
6011 { Bad_Opcode },
6012 { Bad_Opcode },
6013 { Bad_Opcode },
6014 { Bad_Opcode },
6015 { Bad_Opcode },
6016 /* e8 */
6017 { Bad_Opcode },
6018 { Bad_Opcode },
6019 { Bad_Opcode },
6020 { Bad_Opcode },
6021 { Bad_Opcode },
6022 { Bad_Opcode },
6023 { Bad_Opcode },
6024 { Bad_Opcode },
6025 /* f0 */
6026 { Bad_Opcode },
6027 { Bad_Opcode },
6028 { Bad_Opcode },
6029 { Bad_Opcode },
6030 { Bad_Opcode },
6031 { Bad_Opcode },
6032 { Bad_Opcode },
6033 { Bad_Opcode },
6034 /* f8 */
6035 { Bad_Opcode },
6036 { Bad_Opcode },
6037 { Bad_Opcode },
6038 { Bad_Opcode },
6039 { Bad_Opcode },
6040 { Bad_Opcode },
6041 { Bad_Opcode },
6042 { Bad_Opcode },
6045 /* THREE_BYTE_0F7A */
6047 /* 00 */
6048 { Bad_Opcode },
6049 { Bad_Opcode },
6050 { Bad_Opcode },
6051 { Bad_Opcode },
6052 { Bad_Opcode },
6053 { Bad_Opcode },
6054 { Bad_Opcode },
6055 { Bad_Opcode },
6056 /* 08 */
6057 { Bad_Opcode },
6058 { Bad_Opcode },
6059 { Bad_Opcode },
6060 { Bad_Opcode },
6061 { Bad_Opcode },
6062 { Bad_Opcode },
6063 { Bad_Opcode },
6064 { Bad_Opcode },
6065 /* 10 */
6066 { Bad_Opcode },
6067 { Bad_Opcode },
6068 { Bad_Opcode },
6069 { Bad_Opcode },
6070 { Bad_Opcode },
6071 { Bad_Opcode },
6072 { Bad_Opcode },
6073 { Bad_Opcode },
6074 /* 18 */
6075 { Bad_Opcode },
6076 { Bad_Opcode },
6077 { Bad_Opcode },
6078 { Bad_Opcode },
6079 { Bad_Opcode },
6080 { Bad_Opcode },
6081 { Bad_Opcode },
6082 { Bad_Opcode },
6083 /* 20 */
6084 { "ptest", { XX } },
6085 { Bad_Opcode },
6086 { Bad_Opcode },
6087 { Bad_Opcode },
6088 { Bad_Opcode },
6089 { Bad_Opcode },
6090 { Bad_Opcode },
6091 { Bad_Opcode },
6092 /* 28 */
6093 { Bad_Opcode },
6094 { Bad_Opcode },
6095 { Bad_Opcode },
6096 { Bad_Opcode },
6097 { Bad_Opcode },
6098 { Bad_Opcode },
6099 { Bad_Opcode },
6100 { Bad_Opcode },
6101 /* 30 */
6102 { Bad_Opcode },
6103 { Bad_Opcode },
6104 { Bad_Opcode },
6105 { Bad_Opcode },
6106 { Bad_Opcode },
6107 { Bad_Opcode },
6108 { Bad_Opcode },
6109 { Bad_Opcode },
6110 /* 38 */
6111 { Bad_Opcode },
6112 { Bad_Opcode },
6113 { Bad_Opcode },
6114 { Bad_Opcode },
6115 { Bad_Opcode },
6116 { Bad_Opcode },
6117 { Bad_Opcode },
6118 { Bad_Opcode },
6119 /* 40 */
6120 { Bad_Opcode },
6121 { "phaddbw", { XM, EXq } },
6122 { "phaddbd", { XM, EXq } },
6123 { "phaddbq", { XM, EXq } },
6124 { Bad_Opcode },
6125 { Bad_Opcode },
6126 { "phaddwd", { XM, EXq } },
6127 { "phaddwq", { XM, EXq } },
6128 /* 48 */
6129 { Bad_Opcode },
6130 { Bad_Opcode },
6131 { Bad_Opcode },
6132 { "phadddq", { XM, EXq } },
6133 { Bad_Opcode },
6134 { Bad_Opcode },
6135 { Bad_Opcode },
6136 { Bad_Opcode },
6137 /* 50 */
6138 { Bad_Opcode },
6139 { "phaddubw", { XM, EXq } },
6140 { "phaddubd", { XM, EXq } },
6141 { "phaddubq", { XM, EXq } },
6142 { Bad_Opcode },
6143 { Bad_Opcode },
6144 { "phadduwd", { XM, EXq } },
6145 { "phadduwq", { XM, EXq } },
6146 /* 58 */
6147 { Bad_Opcode },
6148 { Bad_Opcode },
6149 { Bad_Opcode },
6150 { "phaddudq", { XM, EXq } },
6151 { Bad_Opcode },
6152 { Bad_Opcode },
6153 { Bad_Opcode },
6154 { Bad_Opcode },
6155 /* 60 */
6156 { Bad_Opcode },
6157 { "phsubbw", { XM, EXq } },
6158 { "phsubbd", { XM, EXq } },
6159 { "phsubbq", { XM, EXq } },
6160 { Bad_Opcode },
6161 { Bad_Opcode },
6162 { Bad_Opcode },
6163 { Bad_Opcode },
6164 /* 68 */
6165 { Bad_Opcode },
6166 { Bad_Opcode },
6167 { Bad_Opcode },
6168 { Bad_Opcode },
6169 { Bad_Opcode },
6170 { Bad_Opcode },
6171 { Bad_Opcode },
6172 { Bad_Opcode },
6173 /* 70 */
6174 { Bad_Opcode },
6175 { Bad_Opcode },
6176 { Bad_Opcode },
6177 { Bad_Opcode },
6178 { Bad_Opcode },
6179 { Bad_Opcode },
6180 { Bad_Opcode },
6181 { Bad_Opcode },
6182 /* 78 */
6183 { Bad_Opcode },
6184 { Bad_Opcode },
6185 { Bad_Opcode },
6186 { Bad_Opcode },
6187 { Bad_Opcode },
6188 { Bad_Opcode },
6189 { Bad_Opcode },
6190 { Bad_Opcode },
6191 /* 80 */
6192 { Bad_Opcode },
6193 { Bad_Opcode },
6194 { Bad_Opcode },
6195 { Bad_Opcode },
6196 { Bad_Opcode },
6197 { Bad_Opcode },
6198 { Bad_Opcode },
6199 { Bad_Opcode },
6200 /* 88 */
6201 { Bad_Opcode },
6202 { Bad_Opcode },
6203 { Bad_Opcode },
6204 { Bad_Opcode },
6205 { Bad_Opcode },
6206 { Bad_Opcode },
6207 { Bad_Opcode },
6208 { Bad_Opcode },
6209 /* 90 */
6210 { Bad_Opcode },
6211 { Bad_Opcode },
6212 { Bad_Opcode },
6213 { Bad_Opcode },
6214 { Bad_Opcode },
6215 { Bad_Opcode },
6216 { Bad_Opcode },
6217 { Bad_Opcode },
6218 /* 98 */
6219 { Bad_Opcode },
6220 { Bad_Opcode },
6221 { Bad_Opcode },
6222 { Bad_Opcode },
6223 { Bad_Opcode },
6224 { Bad_Opcode },
6225 { Bad_Opcode },
6226 { Bad_Opcode },
6227 /* a0 */
6228 { Bad_Opcode },
6229 { Bad_Opcode },
6230 { Bad_Opcode },
6231 { Bad_Opcode },
6232 { Bad_Opcode },
6233 { Bad_Opcode },
6234 { Bad_Opcode },
6235 { Bad_Opcode },
6236 /* a8 */
6237 { Bad_Opcode },
6238 { Bad_Opcode },
6239 { Bad_Opcode },
6240 { Bad_Opcode },
6241 { Bad_Opcode },
6242 { Bad_Opcode },
6243 { Bad_Opcode },
6244 { Bad_Opcode },
6245 /* b0 */
6246 { Bad_Opcode },
6247 { Bad_Opcode },
6248 { Bad_Opcode },
6249 { Bad_Opcode },
6250 { Bad_Opcode },
6251 { Bad_Opcode },
6252 { Bad_Opcode },
6253 { Bad_Opcode },
6254 /* b8 */
6255 { Bad_Opcode },
6256 { Bad_Opcode },
6257 { Bad_Opcode },
6258 { Bad_Opcode },
6259 { Bad_Opcode },
6260 { Bad_Opcode },
6261 { Bad_Opcode },
6262 { Bad_Opcode },
6263 /* c0 */
6264 { Bad_Opcode },
6265 { Bad_Opcode },
6266 { Bad_Opcode },
6267 { Bad_Opcode },
6268 { Bad_Opcode },
6269 { Bad_Opcode },
6270 { Bad_Opcode },
6271 { Bad_Opcode },
6272 /* c8 */
6273 { Bad_Opcode },
6274 { Bad_Opcode },
6275 { Bad_Opcode },
6276 { Bad_Opcode },
6277 { Bad_Opcode },
6278 { Bad_Opcode },
6279 { Bad_Opcode },
6280 { Bad_Opcode },
6281 /* d0 */
6282 { Bad_Opcode },
6283 { Bad_Opcode },
6284 { Bad_Opcode },
6285 { Bad_Opcode },
6286 { Bad_Opcode },
6287 { Bad_Opcode },
6288 { Bad_Opcode },
6289 { Bad_Opcode },
6290 /* d8 */
6291 { Bad_Opcode },
6292 { Bad_Opcode },
6293 { Bad_Opcode },
6294 { Bad_Opcode },
6295 { Bad_Opcode },
6296 { Bad_Opcode },
6297 { Bad_Opcode },
6298 { Bad_Opcode },
6299 /* e0 */
6300 { Bad_Opcode },
6301 { Bad_Opcode },
6302 { Bad_Opcode },
6303 { Bad_Opcode },
6304 { Bad_Opcode },
6305 { Bad_Opcode },
6306 { Bad_Opcode },
6307 { Bad_Opcode },
6308 /* e8 */
6309 { Bad_Opcode },
6310 { Bad_Opcode },
6311 { Bad_Opcode },
6312 { Bad_Opcode },
6313 { Bad_Opcode },
6314 { Bad_Opcode },
6315 { Bad_Opcode },
6316 { Bad_Opcode },
6317 /* f0 */
6318 { Bad_Opcode },
6319 { Bad_Opcode },
6320 { Bad_Opcode },
6321 { Bad_Opcode },
6322 { Bad_Opcode },
6323 { Bad_Opcode },
6324 { Bad_Opcode },
6325 { Bad_Opcode },
6326 /* f8 */
6327 { Bad_Opcode },
6328 { Bad_Opcode },
6329 { Bad_Opcode },
6330 { Bad_Opcode },
6331 { Bad_Opcode },
6332 { Bad_Opcode },
6333 { Bad_Opcode },
6334 { Bad_Opcode },
6338 static const struct dis386 xop_table[][256] = {
6339 /* XOP_08 */
6341 /* 00 */
6342 { Bad_Opcode },
6343 { Bad_Opcode },
6344 { Bad_Opcode },
6345 { Bad_Opcode },
6346 { Bad_Opcode },
6347 { Bad_Opcode },
6348 { Bad_Opcode },
6349 { Bad_Opcode },
6350 /* 08 */
6351 { Bad_Opcode },
6352 { Bad_Opcode },
6353 { Bad_Opcode },
6354 { Bad_Opcode },
6355 { Bad_Opcode },
6356 { Bad_Opcode },
6357 { Bad_Opcode },
6358 { Bad_Opcode },
6359 /* 10 */
6360 { Bad_Opcode },
6361 { Bad_Opcode },
6362 { Bad_Opcode },
6363 { Bad_Opcode },
6364 { Bad_Opcode },
6365 { Bad_Opcode },
6366 { Bad_Opcode },
6367 { Bad_Opcode },
6368 /* 18 */
6369 { Bad_Opcode },
6370 { Bad_Opcode },
6371 { Bad_Opcode },
6372 { Bad_Opcode },
6373 { Bad_Opcode },
6374 { Bad_Opcode },
6375 { Bad_Opcode },
6376 { Bad_Opcode },
6377 /* 20 */
6378 { Bad_Opcode },
6379 { Bad_Opcode },
6380 { Bad_Opcode },
6381 { Bad_Opcode },
6382 { Bad_Opcode },
6383 { Bad_Opcode },
6384 { Bad_Opcode },
6385 { Bad_Opcode },
6386 /* 28 */
6387 { Bad_Opcode },
6388 { Bad_Opcode },
6389 { Bad_Opcode },
6390 { Bad_Opcode },
6391 { Bad_Opcode },
6392 { Bad_Opcode },
6393 { Bad_Opcode },
6394 { Bad_Opcode },
6395 /* 30 */
6396 { Bad_Opcode },
6397 { Bad_Opcode },
6398 { Bad_Opcode },
6399 { Bad_Opcode },
6400 { Bad_Opcode },
6401 { Bad_Opcode },
6402 { Bad_Opcode },
6403 { Bad_Opcode },
6404 /* 38 */
6405 { Bad_Opcode },
6406 { Bad_Opcode },
6407 { Bad_Opcode },
6408 { Bad_Opcode },
6409 { Bad_Opcode },
6410 { Bad_Opcode },
6411 { Bad_Opcode },
6412 { Bad_Opcode },
6413 /* 40 */
6414 { Bad_Opcode },
6415 { Bad_Opcode },
6416 { Bad_Opcode },
6417 { Bad_Opcode },
6418 { Bad_Opcode },
6419 { Bad_Opcode },
6420 { Bad_Opcode },
6421 { Bad_Opcode },
6422 /* 48 */
6423 { Bad_Opcode },
6424 { Bad_Opcode },
6425 { Bad_Opcode },
6426 { Bad_Opcode },
6427 { Bad_Opcode },
6428 { Bad_Opcode },
6429 { Bad_Opcode },
6430 { Bad_Opcode },
6431 /* 50 */
6432 { Bad_Opcode },
6433 { Bad_Opcode },
6434 { Bad_Opcode },
6435 { Bad_Opcode },
6436 { Bad_Opcode },
6437 { Bad_Opcode },
6438 { Bad_Opcode },
6439 { Bad_Opcode },
6440 /* 58 */
6441 { Bad_Opcode },
6442 { Bad_Opcode },
6443 { Bad_Opcode },
6444 { Bad_Opcode },
6445 { Bad_Opcode },
6446 { Bad_Opcode },
6447 { Bad_Opcode },
6448 { Bad_Opcode },
6449 /* 60 */
6450 { Bad_Opcode },
6451 { Bad_Opcode },
6452 { Bad_Opcode },
6453 { Bad_Opcode },
6454 { Bad_Opcode },
6455 { Bad_Opcode },
6456 { Bad_Opcode },
6457 { Bad_Opcode },
6458 /* 68 */
6459 { Bad_Opcode },
6460 { Bad_Opcode },
6461 { Bad_Opcode },
6462 { Bad_Opcode },
6463 { Bad_Opcode },
6464 { Bad_Opcode },
6465 { Bad_Opcode },
6466 { Bad_Opcode },
6467 /* 70 */
6468 { Bad_Opcode },
6469 { Bad_Opcode },
6470 { Bad_Opcode },
6471 { Bad_Opcode },
6472 { Bad_Opcode },
6473 { Bad_Opcode },
6474 { Bad_Opcode },
6475 { Bad_Opcode },
6476 /* 78 */
6477 { Bad_Opcode },
6478 { Bad_Opcode },
6479 { Bad_Opcode },
6480 { Bad_Opcode },
6481 { Bad_Opcode },
6482 { Bad_Opcode },
6483 { Bad_Opcode },
6484 { Bad_Opcode },
6485 /* 80 */
6486 { Bad_Opcode },
6487 { Bad_Opcode },
6488 { Bad_Opcode },
6489 { Bad_Opcode },
6490 { Bad_Opcode },
6491 { "vpmacssww", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6492 { "vpmacsswd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6493 { "vpmacssdql", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6494 /* 88 */
6495 { Bad_Opcode },
6496 { Bad_Opcode },
6497 { Bad_Opcode },
6498 { Bad_Opcode },
6499 { Bad_Opcode },
6500 { Bad_Opcode },
6501 { "vpmacssdd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6502 { "vpmacssdqh", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6503 /* 90 */
6504 { Bad_Opcode },
6505 { Bad_Opcode },
6506 { Bad_Opcode },
6507 { Bad_Opcode },
6508 { Bad_Opcode },
6509 { "vpmacsww", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6510 { "vpmacswd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6511 { "vpmacsdql", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6512 /* 98 */
6513 { Bad_Opcode },
6514 { Bad_Opcode },
6515 { Bad_Opcode },
6516 { Bad_Opcode },
6517 { Bad_Opcode },
6518 { Bad_Opcode },
6519 { "vpmacsdd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6520 { "vpmacsdqh", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6521 /* a0 */
6522 { Bad_Opcode },
6523 { Bad_Opcode },
6524 { "vpcmov", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6525 { "vpperm", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6526 { Bad_Opcode },
6527 { Bad_Opcode },
6528 { "vpmadcsswd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6529 { Bad_Opcode },
6530 /* a8 */
6531 { Bad_Opcode },
6532 { Bad_Opcode },
6533 { Bad_Opcode },
6534 { Bad_Opcode },
6535 { Bad_Opcode },
6536 { Bad_Opcode },
6537 { Bad_Opcode },
6538 { Bad_Opcode },
6539 /* b0 */
6540 { Bad_Opcode },
6541 { Bad_Opcode },
6542 { Bad_Opcode },
6543 { Bad_Opcode },
6544 { Bad_Opcode },
6545 { Bad_Opcode },
6546 { "vpmadcswd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6547 { Bad_Opcode },
6548 /* b8 */
6549 { Bad_Opcode },
6550 { Bad_Opcode },
6551 { Bad_Opcode },
6552 { Bad_Opcode },
6553 { Bad_Opcode },
6554 { Bad_Opcode },
6555 { Bad_Opcode },
6556 { Bad_Opcode },
6557 /* c0 */
6558 { "vprotb", { XM, Vex_2src_1, Ib } },
6559 { "vprotw", { XM, Vex_2src_1, Ib } },
6560 { "vprotd", { XM, Vex_2src_1, Ib } },
6561 { "vprotq", { XM, Vex_2src_1, Ib } },
6562 { Bad_Opcode },
6563 { Bad_Opcode },
6564 { Bad_Opcode },
6565 { Bad_Opcode },
6566 /* c8 */
6567 { Bad_Opcode },
6568 { Bad_Opcode },
6569 { Bad_Opcode },
6570 { Bad_Opcode },
6571 { "vpcomb", { XM, Vex128, EXx, Ib } },
6572 { "vpcomw", { XM, Vex128, EXx, Ib } },
6573 { "vpcomd", { XM, Vex128, EXx, Ib } },
6574 { "vpcomq", { XM, Vex128, EXx, Ib } },
6575 /* d0 */
6576 { Bad_Opcode },
6577 { Bad_Opcode },
6578 { Bad_Opcode },
6579 { Bad_Opcode },
6580 { Bad_Opcode },
6581 { Bad_Opcode },
6582 { Bad_Opcode },
6583 { Bad_Opcode },
6584 /* d8 */
6585 { Bad_Opcode },
6586 { Bad_Opcode },
6587 { Bad_Opcode },
6588 { Bad_Opcode },
6589 { Bad_Opcode },
6590 { Bad_Opcode },
6591 { Bad_Opcode },
6592 { Bad_Opcode },
6593 /* e0 */
6594 { Bad_Opcode },
6595 { Bad_Opcode },
6596 { Bad_Opcode },
6597 { Bad_Opcode },
6598 { Bad_Opcode },
6599 { Bad_Opcode },
6600 { Bad_Opcode },
6601 { Bad_Opcode },
6602 /* e8 */
6603 { Bad_Opcode },
6604 { Bad_Opcode },
6605 { Bad_Opcode },
6606 { Bad_Opcode },
6607 { "vpcomub", { XM, Vex128, EXx, Ib } },
6608 { "vpcomuw", { XM, Vex128, EXx, Ib } },
6609 { "vpcomud", { XM, Vex128, EXx, Ib } },
6610 { "vpcomuq", { XM, Vex128, EXx, Ib } },
6611 /* f0 */
6612 { Bad_Opcode },
6613 { Bad_Opcode },
6614 { Bad_Opcode },
6615 { Bad_Opcode },
6616 { Bad_Opcode },
6617 { Bad_Opcode },
6618 { Bad_Opcode },
6619 { Bad_Opcode },
6620 /* f8 */
6621 { Bad_Opcode },
6622 { Bad_Opcode },
6623 { Bad_Opcode },
6624 { Bad_Opcode },
6625 { Bad_Opcode },
6626 { Bad_Opcode },
6627 { Bad_Opcode },
6628 { Bad_Opcode },
6630 /* XOP_09 */
6632 /* 00 */
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 /* 08 */
6642 { Bad_Opcode },
6643 { Bad_Opcode },
6644 { Bad_Opcode },
6645 { Bad_Opcode },
6646 { Bad_Opcode },
6647 { Bad_Opcode },
6648 { Bad_Opcode },
6649 { Bad_Opcode },
6650 /* 10 */
6651 { Bad_Opcode },
6652 { Bad_Opcode },
6653 { REG_TABLE (REG_XOP_LWPCB) },
6654 { Bad_Opcode },
6655 { Bad_Opcode },
6656 { Bad_Opcode },
6657 { Bad_Opcode },
6658 { Bad_Opcode },
6659 /* 18 */
6660 { Bad_Opcode },
6661 { Bad_Opcode },
6662 { Bad_Opcode },
6663 { Bad_Opcode },
6664 { Bad_Opcode },
6665 { Bad_Opcode },
6666 { Bad_Opcode },
6667 { Bad_Opcode },
6668 /* 20 */
6669 { Bad_Opcode },
6670 { Bad_Opcode },
6671 { Bad_Opcode },
6672 { Bad_Opcode },
6673 { Bad_Opcode },
6674 { Bad_Opcode },
6675 { Bad_Opcode },
6676 { Bad_Opcode },
6677 /* 28 */
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 /* 30 */
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 /* 38 */
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 /* 40 */
6705 { Bad_Opcode },
6706 { Bad_Opcode },
6707 { Bad_Opcode },
6708 { Bad_Opcode },
6709 { Bad_Opcode },
6710 { Bad_Opcode },
6711 { Bad_Opcode },
6712 { Bad_Opcode },
6713 /* 48 */
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 /* 50 */
6723 { Bad_Opcode },
6724 { Bad_Opcode },
6725 { Bad_Opcode },
6726 { Bad_Opcode },
6727 { Bad_Opcode },
6728 { Bad_Opcode },
6729 { Bad_Opcode },
6730 { Bad_Opcode },
6731 /* 58 */
6732 { Bad_Opcode },
6733 { Bad_Opcode },
6734 { Bad_Opcode },
6735 { Bad_Opcode },
6736 { Bad_Opcode },
6737 { Bad_Opcode },
6738 { Bad_Opcode },
6739 { Bad_Opcode },
6740 /* 60 */
6741 { Bad_Opcode },
6742 { Bad_Opcode },
6743 { Bad_Opcode },
6744 { Bad_Opcode },
6745 { Bad_Opcode },
6746 { Bad_Opcode },
6747 { Bad_Opcode },
6748 { Bad_Opcode },
6749 /* 68 */
6750 { Bad_Opcode },
6751 { Bad_Opcode },
6752 { Bad_Opcode },
6753 { Bad_Opcode },
6754 { Bad_Opcode },
6755 { Bad_Opcode },
6756 { Bad_Opcode },
6757 { Bad_Opcode },
6758 /* 70 */
6759 { Bad_Opcode },
6760 { Bad_Opcode },
6761 { Bad_Opcode },
6762 { Bad_Opcode },
6763 { Bad_Opcode },
6764 { Bad_Opcode },
6765 { Bad_Opcode },
6766 { Bad_Opcode },
6767 /* 78 */
6768 { Bad_Opcode },
6769 { Bad_Opcode },
6770 { Bad_Opcode },
6771 { Bad_Opcode },
6772 { Bad_Opcode },
6773 { Bad_Opcode },
6774 { Bad_Opcode },
6775 { Bad_Opcode },
6776 /* 80 */
6777 { VEX_LEN_TABLE (VEX_LEN_XOP_09_80) },
6778 { VEX_LEN_TABLE (VEX_LEN_XOP_09_81) },
6779 { "vfrczss", { XM, EXd } },
6780 { "vfrczsd", { XM, EXq } },
6781 { Bad_Opcode },
6782 { Bad_Opcode },
6783 { Bad_Opcode },
6784 { Bad_Opcode },
6785 /* 88 */
6786 { Bad_Opcode },
6787 { Bad_Opcode },
6788 { Bad_Opcode },
6789 { Bad_Opcode },
6790 { Bad_Opcode },
6791 { Bad_Opcode },
6792 { Bad_Opcode },
6793 { Bad_Opcode },
6794 /* 90 */
6795 { "vprotb", { XM, Vex_2src_1, Vex_2src_2 } },
6796 { "vprotw", { XM, Vex_2src_1, Vex_2src_2 } },
6797 { "vprotd", { XM, Vex_2src_1, Vex_2src_2 } },
6798 { "vprotq", { XM, Vex_2src_1, Vex_2src_2 } },
6799 { "vpshlb", { XM, Vex_2src_1, Vex_2src_2 } },
6800 { "vpshlw", { XM, Vex_2src_1, Vex_2src_2 } },
6801 { "vpshld", { XM, Vex_2src_1, Vex_2src_2 } },
6802 { "vpshlq", { XM, Vex_2src_1, Vex_2src_2 } },
6803 /* 98 */
6804 { "vpshab", { XM, Vex_2src_1, Vex_2src_2 } },
6805 { "vpshaw", { XM, Vex_2src_1, Vex_2src_2 } },
6806 { "vpshad", { XM, Vex_2src_1, Vex_2src_2 } },
6807 { "vpshaq", { XM, Vex_2src_1, Vex_2src_2 } },
6808 { Bad_Opcode },
6809 { Bad_Opcode },
6810 { Bad_Opcode },
6811 { Bad_Opcode },
6812 /* a0 */
6813 { Bad_Opcode },
6814 { Bad_Opcode },
6815 { Bad_Opcode },
6816 { Bad_Opcode },
6817 { Bad_Opcode },
6818 { Bad_Opcode },
6819 { Bad_Opcode },
6820 { Bad_Opcode },
6821 /* a8 */
6822 { Bad_Opcode },
6823 { Bad_Opcode },
6824 { Bad_Opcode },
6825 { Bad_Opcode },
6826 { Bad_Opcode },
6827 { Bad_Opcode },
6828 { Bad_Opcode },
6829 { Bad_Opcode },
6830 /* b0 */
6831 { Bad_Opcode },
6832 { Bad_Opcode },
6833 { Bad_Opcode },
6834 { Bad_Opcode },
6835 { Bad_Opcode },
6836 { Bad_Opcode },
6837 { Bad_Opcode },
6838 { Bad_Opcode },
6839 /* b8 */
6840 { Bad_Opcode },
6841 { Bad_Opcode },
6842 { Bad_Opcode },
6843 { Bad_Opcode },
6844 { Bad_Opcode },
6845 { Bad_Opcode },
6846 { Bad_Opcode },
6847 { Bad_Opcode },
6848 /* c0 */
6849 { Bad_Opcode },
6850 { "vphaddbw", { XM, EXxmm } },
6851 { "vphaddbd", { XM, EXxmm } },
6852 { "vphaddbq", { XM, EXxmm } },
6853 { Bad_Opcode },
6854 { Bad_Opcode },
6855 { "vphaddwd", { XM, EXxmm } },
6856 { "vphaddwq", { XM, EXxmm } },
6857 /* c8 */
6858 { Bad_Opcode },
6859 { Bad_Opcode },
6860 { Bad_Opcode },
6861 { "vphadddq", { XM, EXxmm } },
6862 { Bad_Opcode },
6863 { Bad_Opcode },
6864 { Bad_Opcode },
6865 { Bad_Opcode },
6866 /* d0 */
6867 { Bad_Opcode },
6868 { "vphaddubw", { XM, EXxmm } },
6869 { "vphaddubd", { XM, EXxmm } },
6870 { "vphaddubq", { XM, EXxmm } },
6871 { Bad_Opcode },
6872 { Bad_Opcode },
6873 { "vphadduwd", { XM, EXxmm } },
6874 { "vphadduwq", { XM, EXxmm } },
6875 /* d8 */
6876 { Bad_Opcode },
6877 { Bad_Opcode },
6878 { Bad_Opcode },
6879 { "vphaddudq", { XM, EXxmm } },
6880 { Bad_Opcode },
6881 { Bad_Opcode },
6882 { Bad_Opcode },
6883 { Bad_Opcode },
6884 /* e0 */
6885 { Bad_Opcode },
6886 { "vphsubbw", { XM, EXxmm } },
6887 { "vphsubwd", { XM, EXxmm } },
6888 { "vphsubdq", { XM, EXxmm } },
6889 { Bad_Opcode },
6890 { Bad_Opcode },
6891 { Bad_Opcode },
6892 { Bad_Opcode },
6893 /* e8 */
6894 { Bad_Opcode },
6895 { Bad_Opcode },
6896 { Bad_Opcode },
6897 { Bad_Opcode },
6898 { Bad_Opcode },
6899 { Bad_Opcode },
6900 { Bad_Opcode },
6901 { Bad_Opcode },
6902 /* f0 */
6903 { Bad_Opcode },
6904 { Bad_Opcode },
6905 { Bad_Opcode },
6906 { Bad_Opcode },
6907 { Bad_Opcode },
6908 { Bad_Opcode },
6909 { Bad_Opcode },
6910 { Bad_Opcode },
6911 /* f8 */
6912 { Bad_Opcode },
6913 { Bad_Opcode },
6914 { Bad_Opcode },
6915 { Bad_Opcode },
6916 { Bad_Opcode },
6917 { Bad_Opcode },
6918 { Bad_Opcode },
6919 { Bad_Opcode },
6921 /* XOP_0A */
6923 /* 00 */
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 /* 08 */
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 /* 10 */
6942 { Bad_Opcode },
6943 { Bad_Opcode },
6944 { REG_TABLE (REG_XOP_LWP) },
6945 { Bad_Opcode },
6946 { Bad_Opcode },
6947 { Bad_Opcode },
6948 { Bad_Opcode },
6949 { Bad_Opcode },
6950 /* 18 */
6951 { Bad_Opcode },
6952 { Bad_Opcode },
6953 { Bad_Opcode },
6954 { Bad_Opcode },
6955 { Bad_Opcode },
6956 { Bad_Opcode },
6957 { Bad_Opcode },
6958 { Bad_Opcode },
6959 /* 20 */
6960 { Bad_Opcode },
6961 { Bad_Opcode },
6962 { Bad_Opcode },
6963 { Bad_Opcode },
6964 { Bad_Opcode },
6965 { Bad_Opcode },
6966 { Bad_Opcode },
6967 { Bad_Opcode },
6968 /* 28 */
6969 { Bad_Opcode },
6970 { Bad_Opcode },
6971 { Bad_Opcode },
6972 { Bad_Opcode },
6973 { Bad_Opcode },
6974 { Bad_Opcode },
6975 { Bad_Opcode },
6976 { Bad_Opcode },
6977 /* 30 */
6978 { Bad_Opcode },
6979 { Bad_Opcode },
6980 { Bad_Opcode },
6981 { Bad_Opcode },
6982 { Bad_Opcode },
6983 { Bad_Opcode },
6984 { Bad_Opcode },
6985 { Bad_Opcode },
6986 /* 38 */
6987 { Bad_Opcode },
6988 { Bad_Opcode },
6989 { Bad_Opcode },
6990 { Bad_Opcode },
6991 { Bad_Opcode },
6992 { Bad_Opcode },
6993 { Bad_Opcode },
6994 { Bad_Opcode },
6995 /* 40 */
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 /* 48 */
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 /* 50 */
7014 { Bad_Opcode },
7015 { Bad_Opcode },
7016 { Bad_Opcode },
7017 { Bad_Opcode },
7018 { Bad_Opcode },
7019 { Bad_Opcode },
7020 { Bad_Opcode },
7021 { Bad_Opcode },
7022 /* 58 */
7023 { Bad_Opcode },
7024 { Bad_Opcode },
7025 { Bad_Opcode },
7026 { Bad_Opcode },
7027 { Bad_Opcode },
7028 { Bad_Opcode },
7029 { Bad_Opcode },
7030 { Bad_Opcode },
7031 /* 60 */
7032 { Bad_Opcode },
7033 { Bad_Opcode },
7034 { Bad_Opcode },
7035 { Bad_Opcode },
7036 { Bad_Opcode },
7037 { Bad_Opcode },
7038 { Bad_Opcode },
7039 { Bad_Opcode },
7040 /* 68 */
7041 { Bad_Opcode },
7042 { Bad_Opcode },
7043 { Bad_Opcode },
7044 { Bad_Opcode },
7045 { Bad_Opcode },
7046 { Bad_Opcode },
7047 { Bad_Opcode },
7048 { Bad_Opcode },
7049 /* 70 */
7050 { Bad_Opcode },
7051 { Bad_Opcode },
7052 { Bad_Opcode },
7053 { Bad_Opcode },
7054 { Bad_Opcode },
7055 { Bad_Opcode },
7056 { Bad_Opcode },
7057 { Bad_Opcode },
7058 /* 78 */
7059 { Bad_Opcode },
7060 { Bad_Opcode },
7061 { Bad_Opcode },
7062 { Bad_Opcode },
7063 { Bad_Opcode },
7064 { Bad_Opcode },
7065 { Bad_Opcode },
7066 { Bad_Opcode },
7067 /* 80 */
7068 { Bad_Opcode },
7069 { Bad_Opcode },
7070 { Bad_Opcode },
7071 { Bad_Opcode },
7072 { Bad_Opcode },
7073 { Bad_Opcode },
7074 { Bad_Opcode },
7075 { Bad_Opcode },
7076 /* 88 */
7077 { Bad_Opcode },
7078 { Bad_Opcode },
7079 { Bad_Opcode },
7080 { Bad_Opcode },
7081 { Bad_Opcode },
7082 { Bad_Opcode },
7083 { Bad_Opcode },
7084 { Bad_Opcode },
7085 /* 90 */
7086 { Bad_Opcode },
7087 { Bad_Opcode },
7088 { Bad_Opcode },
7089 { Bad_Opcode },
7090 { Bad_Opcode },
7091 { Bad_Opcode },
7092 { Bad_Opcode },
7093 { Bad_Opcode },
7094 /* 98 */
7095 { Bad_Opcode },
7096 { Bad_Opcode },
7097 { Bad_Opcode },
7098 { Bad_Opcode },
7099 { Bad_Opcode },
7100 { Bad_Opcode },
7101 { Bad_Opcode },
7102 { Bad_Opcode },
7103 /* a0 */
7104 { Bad_Opcode },
7105 { Bad_Opcode },
7106 { Bad_Opcode },
7107 { Bad_Opcode },
7108 { Bad_Opcode },
7109 { Bad_Opcode },
7110 { Bad_Opcode },
7111 { Bad_Opcode },
7112 /* a8 */
7113 { Bad_Opcode },
7114 { Bad_Opcode },
7115 { Bad_Opcode },
7116 { Bad_Opcode },
7117 { Bad_Opcode },
7118 { Bad_Opcode },
7119 { Bad_Opcode },
7120 { Bad_Opcode },
7121 /* b0 */
7122 { Bad_Opcode },
7123 { Bad_Opcode },
7124 { Bad_Opcode },
7125 { Bad_Opcode },
7126 { Bad_Opcode },
7127 { Bad_Opcode },
7128 { Bad_Opcode },
7129 { Bad_Opcode },
7130 /* b8 */
7131 { Bad_Opcode },
7132 { Bad_Opcode },
7133 { Bad_Opcode },
7134 { Bad_Opcode },
7135 { Bad_Opcode },
7136 { Bad_Opcode },
7137 { Bad_Opcode },
7138 { Bad_Opcode },
7139 /* c0 */
7140 { Bad_Opcode },
7141 { Bad_Opcode },
7142 { Bad_Opcode },
7143 { Bad_Opcode },
7144 { Bad_Opcode },
7145 { Bad_Opcode },
7146 { Bad_Opcode },
7147 { Bad_Opcode },
7148 /* c8 */
7149 { Bad_Opcode },
7150 { Bad_Opcode },
7151 { Bad_Opcode },
7152 { Bad_Opcode },
7153 { Bad_Opcode },
7154 { Bad_Opcode },
7155 { Bad_Opcode },
7156 { Bad_Opcode },
7157 /* d0 */
7158 { Bad_Opcode },
7159 { Bad_Opcode },
7160 { Bad_Opcode },
7161 { Bad_Opcode },
7162 { Bad_Opcode },
7163 { Bad_Opcode },
7164 { Bad_Opcode },
7165 { Bad_Opcode },
7166 /* d8 */
7167 { Bad_Opcode },
7168 { Bad_Opcode },
7169 { Bad_Opcode },
7170 { Bad_Opcode },
7171 { Bad_Opcode },
7172 { Bad_Opcode },
7173 { Bad_Opcode },
7174 { Bad_Opcode },
7175 /* e0 */
7176 { Bad_Opcode },
7177 { Bad_Opcode },
7178 { Bad_Opcode },
7179 { Bad_Opcode },
7180 { Bad_Opcode },
7181 { Bad_Opcode },
7182 { Bad_Opcode },
7183 { Bad_Opcode },
7184 /* e8 */
7185 { Bad_Opcode },
7186 { Bad_Opcode },
7187 { Bad_Opcode },
7188 { Bad_Opcode },
7189 { Bad_Opcode },
7190 { Bad_Opcode },
7191 { Bad_Opcode },
7192 { Bad_Opcode },
7193 /* f0 */
7194 { Bad_Opcode },
7195 { Bad_Opcode },
7196 { Bad_Opcode },
7197 { Bad_Opcode },
7198 { Bad_Opcode },
7199 { Bad_Opcode },
7200 { Bad_Opcode },
7201 { Bad_Opcode },
7202 /* f8 */
7203 { Bad_Opcode },
7204 { Bad_Opcode },
7205 { Bad_Opcode },
7206 { Bad_Opcode },
7207 { Bad_Opcode },
7208 { Bad_Opcode },
7209 { Bad_Opcode },
7210 { Bad_Opcode },
7214 static const struct dis386 vex_table[][256] = {
7215 /* VEX_0F */
7217 /* 00 */
7218 { Bad_Opcode },
7219 { Bad_Opcode },
7220 { Bad_Opcode },
7221 { Bad_Opcode },
7222 { Bad_Opcode },
7223 { Bad_Opcode },
7224 { Bad_Opcode },
7225 { Bad_Opcode },
7226 /* 08 */
7227 { Bad_Opcode },
7228 { Bad_Opcode },
7229 { Bad_Opcode },
7230 { Bad_Opcode },
7231 { Bad_Opcode },
7232 { Bad_Opcode },
7233 { Bad_Opcode },
7234 { Bad_Opcode },
7235 /* 10 */
7236 { PREFIX_TABLE (PREFIX_VEX_10) },
7237 { PREFIX_TABLE (PREFIX_VEX_11) },
7238 { PREFIX_TABLE (PREFIX_VEX_12) },
7239 { MOD_TABLE (MOD_VEX_13) },
7240 { VEX_W_TABLE (VEX_W_14) },
7241 { VEX_W_TABLE (VEX_W_15) },
7242 { PREFIX_TABLE (PREFIX_VEX_16) },
7243 { MOD_TABLE (MOD_VEX_17) },
7244 /* 18 */
7245 { Bad_Opcode },
7246 { Bad_Opcode },
7247 { Bad_Opcode },
7248 { Bad_Opcode },
7249 { Bad_Opcode },
7250 { Bad_Opcode },
7251 { Bad_Opcode },
7252 { Bad_Opcode },
7253 /* 20 */
7254 { Bad_Opcode },
7255 { Bad_Opcode },
7256 { Bad_Opcode },
7257 { Bad_Opcode },
7258 { Bad_Opcode },
7259 { Bad_Opcode },
7260 { Bad_Opcode },
7261 { Bad_Opcode },
7262 /* 28 */
7263 { VEX_W_TABLE (VEX_W_28) },
7264 { VEX_W_TABLE (VEX_W_29) },
7265 { PREFIX_TABLE (PREFIX_VEX_2A) },
7266 { MOD_TABLE (MOD_VEX_2B) },
7267 { PREFIX_TABLE (PREFIX_VEX_2C) },
7268 { PREFIX_TABLE (PREFIX_VEX_2D) },
7269 { PREFIX_TABLE (PREFIX_VEX_2E) },
7270 { PREFIX_TABLE (PREFIX_VEX_2F) },
7271 /* 30 */
7272 { Bad_Opcode },
7273 { Bad_Opcode },
7274 { Bad_Opcode },
7275 { Bad_Opcode },
7276 { Bad_Opcode },
7277 { Bad_Opcode },
7278 { Bad_Opcode },
7279 { Bad_Opcode },
7280 /* 38 */
7281 { Bad_Opcode },
7282 { Bad_Opcode },
7283 { Bad_Opcode },
7284 { Bad_Opcode },
7285 { Bad_Opcode },
7286 { Bad_Opcode },
7287 { Bad_Opcode },
7288 { Bad_Opcode },
7289 /* 40 */
7290 { Bad_Opcode },
7291 { Bad_Opcode },
7292 { Bad_Opcode },
7293 { Bad_Opcode },
7294 { Bad_Opcode },
7295 { Bad_Opcode },
7296 { Bad_Opcode },
7297 { Bad_Opcode },
7298 /* 48 */
7299 { Bad_Opcode },
7300 { Bad_Opcode },
7301 { Bad_Opcode },
7302 { Bad_Opcode },
7303 { Bad_Opcode },
7304 { Bad_Opcode },
7305 { Bad_Opcode },
7306 { Bad_Opcode },
7307 /* 50 */
7308 { MOD_TABLE (MOD_VEX_50) },
7309 { PREFIX_TABLE (PREFIX_VEX_51) },
7310 { PREFIX_TABLE (PREFIX_VEX_52) },
7311 { PREFIX_TABLE (PREFIX_VEX_53) },
7312 { "vandpX", { XM, Vex, EXx } },
7313 { "vandnpX", { XM, Vex, EXx } },
7314 { "vorpX", { XM, Vex, EXx } },
7315 { "vxorpX", { XM, Vex, EXx } },
7316 /* 58 */
7317 { PREFIX_TABLE (PREFIX_VEX_58) },
7318 { PREFIX_TABLE (PREFIX_VEX_59) },
7319 { PREFIX_TABLE (PREFIX_VEX_5A) },
7320 { PREFIX_TABLE (PREFIX_VEX_5B) },
7321 { PREFIX_TABLE (PREFIX_VEX_5C) },
7322 { PREFIX_TABLE (PREFIX_VEX_5D) },
7323 { PREFIX_TABLE (PREFIX_VEX_5E) },
7324 { PREFIX_TABLE (PREFIX_VEX_5F) },
7325 /* 60 */
7326 { PREFIX_TABLE (PREFIX_VEX_60) },
7327 { PREFIX_TABLE (PREFIX_VEX_61) },
7328 { PREFIX_TABLE (PREFIX_VEX_62) },
7329 { PREFIX_TABLE (PREFIX_VEX_63) },
7330 { PREFIX_TABLE (PREFIX_VEX_64) },
7331 { PREFIX_TABLE (PREFIX_VEX_65) },
7332 { PREFIX_TABLE (PREFIX_VEX_66) },
7333 { PREFIX_TABLE (PREFIX_VEX_67) },
7334 /* 68 */
7335 { PREFIX_TABLE (PREFIX_VEX_68) },
7336 { PREFIX_TABLE (PREFIX_VEX_69) },
7337 { PREFIX_TABLE (PREFIX_VEX_6A) },
7338 { PREFIX_TABLE (PREFIX_VEX_6B) },
7339 { PREFIX_TABLE (PREFIX_VEX_6C) },
7340 { PREFIX_TABLE (PREFIX_VEX_6D) },
7341 { PREFIX_TABLE (PREFIX_VEX_6E) },
7342 { PREFIX_TABLE (PREFIX_VEX_6F) },
7343 /* 70 */
7344 { PREFIX_TABLE (PREFIX_VEX_70) },
7345 { REG_TABLE (REG_VEX_71) },
7346 { REG_TABLE (REG_VEX_72) },
7347 { REG_TABLE (REG_VEX_73) },
7348 { PREFIX_TABLE (PREFIX_VEX_74) },
7349 { PREFIX_TABLE (PREFIX_VEX_75) },
7350 { PREFIX_TABLE (PREFIX_VEX_76) },
7351 { PREFIX_TABLE (PREFIX_VEX_77) },
7352 /* 78 */
7353 { Bad_Opcode },
7354 { Bad_Opcode },
7355 { Bad_Opcode },
7356 { Bad_Opcode },
7357 { PREFIX_TABLE (PREFIX_VEX_7C) },
7358 { PREFIX_TABLE (PREFIX_VEX_7D) },
7359 { PREFIX_TABLE (PREFIX_VEX_7E) },
7360 { PREFIX_TABLE (PREFIX_VEX_7F) },
7361 /* 80 */
7362 { Bad_Opcode },
7363 { Bad_Opcode },
7364 { Bad_Opcode },
7365 { Bad_Opcode },
7366 { Bad_Opcode },
7367 { Bad_Opcode },
7368 { Bad_Opcode },
7369 { Bad_Opcode },
7370 /* 88 */
7371 { Bad_Opcode },
7372 { Bad_Opcode },
7373 { Bad_Opcode },
7374 { Bad_Opcode },
7375 { Bad_Opcode },
7376 { Bad_Opcode },
7377 { Bad_Opcode },
7378 { Bad_Opcode },
7379 /* 90 */
7380 { Bad_Opcode },
7381 { Bad_Opcode },
7382 { Bad_Opcode },
7383 { Bad_Opcode },
7384 { Bad_Opcode },
7385 { Bad_Opcode },
7386 { Bad_Opcode },
7387 { Bad_Opcode },
7388 /* 98 */
7389 { Bad_Opcode },
7390 { Bad_Opcode },
7391 { Bad_Opcode },
7392 { Bad_Opcode },
7393 { Bad_Opcode },
7394 { Bad_Opcode },
7395 { Bad_Opcode },
7396 { Bad_Opcode },
7397 /* a0 */
7398 { Bad_Opcode },
7399 { Bad_Opcode },
7400 { Bad_Opcode },
7401 { Bad_Opcode },
7402 { Bad_Opcode },
7403 { Bad_Opcode },
7404 { Bad_Opcode },
7405 { Bad_Opcode },
7406 /* a8 */
7407 { Bad_Opcode },
7408 { Bad_Opcode },
7409 { Bad_Opcode },
7410 { Bad_Opcode },
7411 { Bad_Opcode },
7412 { Bad_Opcode },
7413 { REG_TABLE (REG_VEX_AE) },
7414 { Bad_Opcode },
7415 /* b0 */
7416 { Bad_Opcode },
7417 { Bad_Opcode },
7418 { Bad_Opcode },
7419 { Bad_Opcode },
7420 { Bad_Opcode },
7421 { Bad_Opcode },
7422 { Bad_Opcode },
7423 { Bad_Opcode },
7424 /* b8 */
7425 { Bad_Opcode },
7426 { Bad_Opcode },
7427 { Bad_Opcode },
7428 { Bad_Opcode },
7429 { Bad_Opcode },
7430 { Bad_Opcode },
7431 { Bad_Opcode },
7432 { Bad_Opcode },
7433 /* c0 */
7434 { Bad_Opcode },
7435 { Bad_Opcode },
7436 { PREFIX_TABLE (PREFIX_VEX_C2) },
7437 { Bad_Opcode },
7438 { PREFIX_TABLE (PREFIX_VEX_C4) },
7439 { PREFIX_TABLE (PREFIX_VEX_C5) },
7440 { "vshufpX", { XM, Vex, EXx, Ib } },
7441 { Bad_Opcode },
7442 /* c8 */
7443 { Bad_Opcode },
7444 { Bad_Opcode },
7445 { Bad_Opcode },
7446 { Bad_Opcode },
7447 { Bad_Opcode },
7448 { Bad_Opcode },
7449 { Bad_Opcode },
7450 { Bad_Opcode },
7451 /* d0 */
7452 { PREFIX_TABLE (PREFIX_VEX_D0) },
7453 { PREFIX_TABLE (PREFIX_VEX_D1) },
7454 { PREFIX_TABLE (PREFIX_VEX_D2) },
7455 { PREFIX_TABLE (PREFIX_VEX_D3) },
7456 { PREFIX_TABLE (PREFIX_VEX_D4) },
7457 { PREFIX_TABLE (PREFIX_VEX_D5) },
7458 { PREFIX_TABLE (PREFIX_VEX_D6) },
7459 { PREFIX_TABLE (PREFIX_VEX_D7) },
7460 /* d8 */
7461 { PREFIX_TABLE (PREFIX_VEX_D8) },
7462 { PREFIX_TABLE (PREFIX_VEX_D9) },
7463 { PREFIX_TABLE (PREFIX_VEX_DA) },
7464 { PREFIX_TABLE (PREFIX_VEX_DB) },
7465 { PREFIX_TABLE (PREFIX_VEX_DC) },
7466 { PREFIX_TABLE (PREFIX_VEX_DD) },
7467 { PREFIX_TABLE (PREFIX_VEX_DE) },
7468 { PREFIX_TABLE (PREFIX_VEX_DF) },
7469 /* e0 */
7470 { PREFIX_TABLE (PREFIX_VEX_E0) },
7471 { PREFIX_TABLE (PREFIX_VEX_E1) },
7472 { PREFIX_TABLE (PREFIX_VEX_E2) },
7473 { PREFIX_TABLE (PREFIX_VEX_E3) },
7474 { PREFIX_TABLE (PREFIX_VEX_E4) },
7475 { PREFIX_TABLE (PREFIX_VEX_E5) },
7476 { PREFIX_TABLE (PREFIX_VEX_E6) },
7477 { PREFIX_TABLE (PREFIX_VEX_E7) },
7478 /* e8 */
7479 { PREFIX_TABLE (PREFIX_VEX_E8) },
7480 { PREFIX_TABLE (PREFIX_VEX_E9) },
7481 { PREFIX_TABLE (PREFIX_VEX_EA) },
7482 { PREFIX_TABLE (PREFIX_VEX_EB) },
7483 { PREFIX_TABLE (PREFIX_VEX_EC) },
7484 { PREFIX_TABLE (PREFIX_VEX_ED) },
7485 { PREFIX_TABLE (PREFIX_VEX_EE) },
7486 { PREFIX_TABLE (PREFIX_VEX_EF) },
7487 /* f0 */
7488 { PREFIX_TABLE (PREFIX_VEX_F0) },
7489 { PREFIX_TABLE (PREFIX_VEX_F1) },
7490 { PREFIX_TABLE (PREFIX_VEX_F2) },
7491 { PREFIX_TABLE (PREFIX_VEX_F3) },
7492 { PREFIX_TABLE (PREFIX_VEX_F4) },
7493 { PREFIX_TABLE (PREFIX_VEX_F5) },
7494 { PREFIX_TABLE (PREFIX_VEX_F6) },
7495 { PREFIX_TABLE (PREFIX_VEX_F7) },
7496 /* f8 */
7497 { PREFIX_TABLE (PREFIX_VEX_F8) },
7498 { PREFIX_TABLE (PREFIX_VEX_F9) },
7499 { PREFIX_TABLE (PREFIX_VEX_FA) },
7500 { PREFIX_TABLE (PREFIX_VEX_FB) },
7501 { PREFIX_TABLE (PREFIX_VEX_FC) },
7502 { PREFIX_TABLE (PREFIX_VEX_FD) },
7503 { PREFIX_TABLE (PREFIX_VEX_FE) },
7504 { Bad_Opcode },
7506 /* VEX_0F38 */
7508 /* 00 */
7509 { PREFIX_TABLE (PREFIX_VEX_3800) },
7510 { PREFIX_TABLE (PREFIX_VEX_3801) },
7511 { PREFIX_TABLE (PREFIX_VEX_3802) },
7512 { PREFIX_TABLE (PREFIX_VEX_3803) },
7513 { PREFIX_TABLE (PREFIX_VEX_3804) },
7514 { PREFIX_TABLE (PREFIX_VEX_3805) },
7515 { PREFIX_TABLE (PREFIX_VEX_3806) },
7516 { PREFIX_TABLE (PREFIX_VEX_3807) },
7517 /* 08 */
7518 { PREFIX_TABLE (PREFIX_VEX_3808) },
7519 { PREFIX_TABLE (PREFIX_VEX_3809) },
7520 { PREFIX_TABLE (PREFIX_VEX_380A) },
7521 { PREFIX_TABLE (PREFIX_VEX_380B) },
7522 { PREFIX_TABLE (PREFIX_VEX_380C) },
7523 { PREFIX_TABLE (PREFIX_VEX_380D) },
7524 { PREFIX_TABLE (PREFIX_VEX_380E) },
7525 { PREFIX_TABLE (PREFIX_VEX_380F) },
7526 /* 10 */
7527 { Bad_Opcode },
7528 { Bad_Opcode },
7529 { Bad_Opcode },
7530 { Bad_Opcode },
7531 { Bad_Opcode },
7532 { Bad_Opcode },
7533 { Bad_Opcode },
7534 { PREFIX_TABLE (PREFIX_VEX_3817) },
7535 /* 18 */
7536 { PREFIX_TABLE (PREFIX_VEX_3818) },
7537 { PREFIX_TABLE (PREFIX_VEX_3819) },
7538 { PREFIX_TABLE (PREFIX_VEX_381A) },
7539 { Bad_Opcode },
7540 { PREFIX_TABLE (PREFIX_VEX_381C) },
7541 { PREFIX_TABLE (PREFIX_VEX_381D) },
7542 { PREFIX_TABLE (PREFIX_VEX_381E) },
7543 { Bad_Opcode },
7544 /* 20 */
7545 { PREFIX_TABLE (PREFIX_VEX_3820) },
7546 { PREFIX_TABLE (PREFIX_VEX_3821) },
7547 { PREFIX_TABLE (PREFIX_VEX_3822) },
7548 { PREFIX_TABLE (PREFIX_VEX_3823) },
7549 { PREFIX_TABLE (PREFIX_VEX_3824) },
7550 { PREFIX_TABLE (PREFIX_VEX_3825) },
7551 { Bad_Opcode },
7552 { Bad_Opcode },
7553 /* 28 */
7554 { PREFIX_TABLE (PREFIX_VEX_3828) },
7555 { PREFIX_TABLE (PREFIX_VEX_3829) },
7556 { PREFIX_TABLE (PREFIX_VEX_382A) },
7557 { PREFIX_TABLE (PREFIX_VEX_382B) },
7558 { PREFIX_TABLE (PREFIX_VEX_382C) },
7559 { PREFIX_TABLE (PREFIX_VEX_382D) },
7560 { PREFIX_TABLE (PREFIX_VEX_382E) },
7561 { PREFIX_TABLE (PREFIX_VEX_382F) },
7562 /* 30 */
7563 { PREFIX_TABLE (PREFIX_VEX_3830) },
7564 { PREFIX_TABLE (PREFIX_VEX_3831) },
7565 { PREFIX_TABLE (PREFIX_VEX_3832) },
7566 { PREFIX_TABLE (PREFIX_VEX_3833) },
7567 { PREFIX_TABLE (PREFIX_VEX_3834) },
7568 { PREFIX_TABLE (PREFIX_VEX_3835) },
7569 { Bad_Opcode },
7570 { PREFIX_TABLE (PREFIX_VEX_3837) },
7571 /* 38 */
7572 { PREFIX_TABLE (PREFIX_VEX_3838) },
7573 { PREFIX_TABLE (PREFIX_VEX_3839) },
7574 { PREFIX_TABLE (PREFIX_VEX_383A) },
7575 { PREFIX_TABLE (PREFIX_VEX_383B) },
7576 { PREFIX_TABLE (PREFIX_VEX_383C) },
7577 { PREFIX_TABLE (PREFIX_VEX_383D) },
7578 { PREFIX_TABLE (PREFIX_VEX_383E) },
7579 { PREFIX_TABLE (PREFIX_VEX_383F) },
7580 /* 40 */
7581 { PREFIX_TABLE (PREFIX_VEX_3840) },
7582 { PREFIX_TABLE (PREFIX_VEX_3841) },
7583 { Bad_Opcode },
7584 { Bad_Opcode },
7585 { Bad_Opcode },
7586 { Bad_Opcode },
7587 { Bad_Opcode },
7588 { Bad_Opcode },
7589 /* 48 */
7590 { Bad_Opcode },
7591 { Bad_Opcode },
7592 { Bad_Opcode },
7593 { Bad_Opcode },
7594 { Bad_Opcode },
7595 { Bad_Opcode },
7596 { Bad_Opcode },
7597 { Bad_Opcode },
7598 /* 50 */
7599 { Bad_Opcode },
7600 { Bad_Opcode },
7601 { Bad_Opcode },
7602 { Bad_Opcode },
7603 { Bad_Opcode },
7604 { Bad_Opcode },
7605 { Bad_Opcode },
7606 { Bad_Opcode },
7607 /* 58 */
7608 { Bad_Opcode },
7609 { Bad_Opcode },
7610 { Bad_Opcode },
7611 { Bad_Opcode },
7612 { Bad_Opcode },
7613 { Bad_Opcode },
7614 { Bad_Opcode },
7615 { Bad_Opcode },
7616 /* 60 */
7617 { Bad_Opcode },
7618 { Bad_Opcode },
7619 { Bad_Opcode },
7620 { Bad_Opcode },
7621 { Bad_Opcode },
7622 { Bad_Opcode },
7623 { Bad_Opcode },
7624 { Bad_Opcode },
7625 /* 68 */
7626 { Bad_Opcode },
7627 { Bad_Opcode },
7628 { Bad_Opcode },
7629 { Bad_Opcode },
7630 { Bad_Opcode },
7631 { Bad_Opcode },
7632 { Bad_Opcode },
7633 { Bad_Opcode },
7634 /* 70 */
7635 { Bad_Opcode },
7636 { Bad_Opcode },
7637 { Bad_Opcode },
7638 { Bad_Opcode },
7639 { Bad_Opcode },
7640 { Bad_Opcode },
7641 { Bad_Opcode },
7642 { Bad_Opcode },
7643 /* 78 */
7644 { Bad_Opcode },
7645 { Bad_Opcode },
7646 { Bad_Opcode },
7647 { Bad_Opcode },
7648 { Bad_Opcode },
7649 { Bad_Opcode },
7650 { Bad_Opcode },
7651 { Bad_Opcode },
7652 /* 80 */
7653 { Bad_Opcode },
7654 { Bad_Opcode },
7655 { Bad_Opcode },
7656 { Bad_Opcode },
7657 { Bad_Opcode },
7658 { Bad_Opcode },
7659 { Bad_Opcode },
7660 { Bad_Opcode },
7661 /* 88 */
7662 { Bad_Opcode },
7663 { Bad_Opcode },
7664 { Bad_Opcode },
7665 { Bad_Opcode },
7666 { Bad_Opcode },
7667 { Bad_Opcode },
7668 { Bad_Opcode },
7669 { Bad_Opcode },
7670 /* 90 */
7671 { Bad_Opcode },
7672 { Bad_Opcode },
7673 { Bad_Opcode },
7674 { Bad_Opcode },
7675 { Bad_Opcode },
7676 { Bad_Opcode },
7677 { PREFIX_TABLE (PREFIX_VEX_3896) },
7678 { PREFIX_TABLE (PREFIX_VEX_3897) },
7679 /* 98 */
7680 { PREFIX_TABLE (PREFIX_VEX_3898) },
7681 { PREFIX_TABLE (PREFIX_VEX_3899) },
7682 { PREFIX_TABLE (PREFIX_VEX_389A) },
7683 { PREFIX_TABLE (PREFIX_VEX_389B) },
7684 { PREFIX_TABLE (PREFIX_VEX_389C) },
7685 { PREFIX_TABLE (PREFIX_VEX_389D) },
7686 { PREFIX_TABLE (PREFIX_VEX_389E) },
7687 { PREFIX_TABLE (PREFIX_VEX_389F) },
7688 /* a0 */
7689 { Bad_Opcode },
7690 { Bad_Opcode },
7691 { Bad_Opcode },
7692 { Bad_Opcode },
7693 { Bad_Opcode },
7694 { Bad_Opcode },
7695 { PREFIX_TABLE (PREFIX_VEX_38A6) },
7696 { PREFIX_TABLE (PREFIX_VEX_38A7) },
7697 /* a8 */
7698 { PREFIX_TABLE (PREFIX_VEX_38A8) },
7699 { PREFIX_TABLE (PREFIX_VEX_38A9) },
7700 { PREFIX_TABLE (PREFIX_VEX_38AA) },
7701 { PREFIX_TABLE (PREFIX_VEX_38AB) },
7702 { PREFIX_TABLE (PREFIX_VEX_38AC) },
7703 { PREFIX_TABLE (PREFIX_VEX_38AD) },
7704 { PREFIX_TABLE (PREFIX_VEX_38AE) },
7705 { PREFIX_TABLE (PREFIX_VEX_38AF) },
7706 /* b0 */
7707 { Bad_Opcode },
7708 { Bad_Opcode },
7709 { Bad_Opcode },
7710 { Bad_Opcode },
7711 { Bad_Opcode },
7712 { Bad_Opcode },
7713 { PREFIX_TABLE (PREFIX_VEX_38B6) },
7714 { PREFIX_TABLE (PREFIX_VEX_38B7) },
7715 /* b8 */
7716 { PREFIX_TABLE (PREFIX_VEX_38B8) },
7717 { PREFIX_TABLE (PREFIX_VEX_38B9) },
7718 { PREFIX_TABLE (PREFIX_VEX_38BA) },
7719 { PREFIX_TABLE (PREFIX_VEX_38BB) },
7720 { PREFIX_TABLE (PREFIX_VEX_38BC) },
7721 { PREFIX_TABLE (PREFIX_VEX_38BD) },
7722 { PREFIX_TABLE (PREFIX_VEX_38BE) },
7723 { PREFIX_TABLE (PREFIX_VEX_38BF) },
7724 /* c0 */
7725 { Bad_Opcode },
7726 { Bad_Opcode },
7727 { Bad_Opcode },
7728 { Bad_Opcode },
7729 { Bad_Opcode },
7730 { Bad_Opcode },
7731 { Bad_Opcode },
7732 { Bad_Opcode },
7733 /* c8 */
7734 { Bad_Opcode },
7735 { Bad_Opcode },
7736 { Bad_Opcode },
7737 { Bad_Opcode },
7738 { Bad_Opcode },
7739 { Bad_Opcode },
7740 { Bad_Opcode },
7741 { Bad_Opcode },
7742 /* d0 */
7743 { Bad_Opcode },
7744 { Bad_Opcode },
7745 { Bad_Opcode },
7746 { Bad_Opcode },
7747 { Bad_Opcode },
7748 { Bad_Opcode },
7749 { Bad_Opcode },
7750 { Bad_Opcode },
7751 /* d8 */
7752 { Bad_Opcode },
7753 { Bad_Opcode },
7754 { Bad_Opcode },
7755 { PREFIX_TABLE (PREFIX_VEX_38DB) },
7756 { PREFIX_TABLE (PREFIX_VEX_38DC) },
7757 { PREFIX_TABLE (PREFIX_VEX_38DD) },
7758 { PREFIX_TABLE (PREFIX_VEX_38DE) },
7759 { PREFIX_TABLE (PREFIX_VEX_38DF) },
7760 /* e0 */
7761 { Bad_Opcode },
7762 { Bad_Opcode },
7763 { Bad_Opcode },
7764 { Bad_Opcode },
7765 { Bad_Opcode },
7766 { Bad_Opcode },
7767 { Bad_Opcode },
7768 { Bad_Opcode },
7769 /* e8 */
7770 { Bad_Opcode },
7771 { Bad_Opcode },
7772 { Bad_Opcode },
7773 { Bad_Opcode },
7774 { Bad_Opcode },
7775 { Bad_Opcode },
7776 { Bad_Opcode },
7777 { Bad_Opcode },
7778 /* f0 */
7779 { Bad_Opcode },
7780 { Bad_Opcode },
7781 { Bad_Opcode },
7782 { Bad_Opcode },
7783 { Bad_Opcode },
7784 { Bad_Opcode },
7785 { Bad_Opcode },
7786 { Bad_Opcode },
7787 /* f8 */
7788 { Bad_Opcode },
7789 { Bad_Opcode },
7790 { Bad_Opcode },
7791 { Bad_Opcode },
7792 { Bad_Opcode },
7793 { Bad_Opcode },
7794 { Bad_Opcode },
7795 { Bad_Opcode },
7797 /* VEX_0F3A */
7799 /* 00 */
7800 { Bad_Opcode },
7801 { Bad_Opcode },
7802 { Bad_Opcode },
7803 { Bad_Opcode },
7804 { PREFIX_TABLE (PREFIX_VEX_3A04) },
7805 { PREFIX_TABLE (PREFIX_VEX_3A05) },
7806 { PREFIX_TABLE (PREFIX_VEX_3A06) },
7807 { Bad_Opcode },
7808 /* 08 */
7809 { PREFIX_TABLE (PREFIX_VEX_3A08) },
7810 { PREFIX_TABLE (PREFIX_VEX_3A09) },
7811 { PREFIX_TABLE (PREFIX_VEX_3A0A) },
7812 { PREFIX_TABLE (PREFIX_VEX_3A0B) },
7813 { PREFIX_TABLE (PREFIX_VEX_3A0C) },
7814 { PREFIX_TABLE (PREFIX_VEX_3A0D) },
7815 { PREFIX_TABLE (PREFIX_VEX_3A0E) },
7816 { PREFIX_TABLE (PREFIX_VEX_3A0F) },
7817 /* 10 */
7818 { Bad_Opcode },
7819 { Bad_Opcode },
7820 { Bad_Opcode },
7821 { Bad_Opcode },
7822 { PREFIX_TABLE (PREFIX_VEX_3A14) },
7823 { PREFIX_TABLE (PREFIX_VEX_3A15) },
7824 { PREFIX_TABLE (PREFIX_VEX_3A16) },
7825 { PREFIX_TABLE (PREFIX_VEX_3A17) },
7826 /* 18 */
7827 { PREFIX_TABLE (PREFIX_VEX_3A18) },
7828 { PREFIX_TABLE (PREFIX_VEX_3A19) },
7829 { Bad_Opcode },
7830 { Bad_Opcode },
7831 { Bad_Opcode },
7832 { Bad_Opcode },
7833 { Bad_Opcode },
7834 { Bad_Opcode },
7835 /* 20 */
7836 { PREFIX_TABLE (PREFIX_VEX_3A20) },
7837 { PREFIX_TABLE (PREFIX_VEX_3A21) },
7838 { PREFIX_TABLE (PREFIX_VEX_3A22) },
7839 { Bad_Opcode },
7840 { Bad_Opcode },
7841 { Bad_Opcode },
7842 { Bad_Opcode },
7843 { Bad_Opcode },
7844 /* 28 */
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 /* 30 */
7854 { Bad_Opcode },
7855 { Bad_Opcode },
7856 { Bad_Opcode },
7857 { Bad_Opcode },
7858 { Bad_Opcode },
7859 { Bad_Opcode },
7860 { Bad_Opcode },
7861 { Bad_Opcode },
7862 /* 38 */
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 /* 40 */
7872 { PREFIX_TABLE (PREFIX_VEX_3A40) },
7873 { PREFIX_TABLE (PREFIX_VEX_3A41) },
7874 { PREFIX_TABLE (PREFIX_VEX_3A42) },
7875 { Bad_Opcode },
7876 { PREFIX_TABLE (PREFIX_VEX_3A44) },
7877 { Bad_Opcode },
7878 { Bad_Opcode },
7879 { Bad_Opcode },
7880 /* 48 */
7881 { PREFIX_TABLE (PREFIX_VEX_3A48) },
7882 { PREFIX_TABLE (PREFIX_VEX_3A49) },
7883 { PREFIX_TABLE (PREFIX_VEX_3A4A) },
7884 { PREFIX_TABLE (PREFIX_VEX_3A4B) },
7885 { PREFIX_TABLE (PREFIX_VEX_3A4C) },
7886 { Bad_Opcode },
7887 { Bad_Opcode },
7888 { Bad_Opcode },
7889 /* 50 */
7890 { Bad_Opcode },
7891 { Bad_Opcode },
7892 { Bad_Opcode },
7893 { Bad_Opcode },
7894 { Bad_Opcode },
7895 { Bad_Opcode },
7896 { Bad_Opcode },
7897 { Bad_Opcode },
7898 /* 58 */
7899 { Bad_Opcode },
7900 { Bad_Opcode },
7901 { Bad_Opcode },
7902 { Bad_Opcode },
7903 { PREFIX_TABLE (PREFIX_VEX_3A5C) },
7904 { PREFIX_TABLE (PREFIX_VEX_3A5D) },
7905 { PREFIX_TABLE (PREFIX_VEX_3A5E) },
7906 { PREFIX_TABLE (PREFIX_VEX_3A5F) },
7907 /* 60 */
7908 { PREFIX_TABLE (PREFIX_VEX_3A60) },
7909 { PREFIX_TABLE (PREFIX_VEX_3A61) },
7910 { PREFIX_TABLE (PREFIX_VEX_3A62) },
7911 { PREFIX_TABLE (PREFIX_VEX_3A63) },
7912 { Bad_Opcode },
7913 { Bad_Opcode },
7914 { Bad_Opcode },
7915 { Bad_Opcode },
7916 /* 68 */
7917 { PREFIX_TABLE (PREFIX_VEX_3A68) },
7918 { PREFIX_TABLE (PREFIX_VEX_3A69) },
7919 { PREFIX_TABLE (PREFIX_VEX_3A6A) },
7920 { PREFIX_TABLE (PREFIX_VEX_3A6B) },
7921 { PREFIX_TABLE (PREFIX_VEX_3A6C) },
7922 { PREFIX_TABLE (PREFIX_VEX_3A6D) },
7923 { PREFIX_TABLE (PREFIX_VEX_3A6E) },
7924 { PREFIX_TABLE (PREFIX_VEX_3A6F) },
7925 /* 70 */
7926 { Bad_Opcode },
7927 { Bad_Opcode },
7928 { Bad_Opcode },
7929 { Bad_Opcode },
7930 { Bad_Opcode },
7931 { Bad_Opcode },
7932 { Bad_Opcode },
7933 { Bad_Opcode },
7934 /* 78 */
7935 { PREFIX_TABLE (PREFIX_VEX_3A78) },
7936 { PREFIX_TABLE (PREFIX_VEX_3A79) },
7937 { PREFIX_TABLE (PREFIX_VEX_3A7A) },
7938 { PREFIX_TABLE (PREFIX_VEX_3A7B) },
7939 { PREFIX_TABLE (PREFIX_VEX_3A7C) },
7940 { PREFIX_TABLE (PREFIX_VEX_3A7D) },
7941 { PREFIX_TABLE (PREFIX_VEX_3A7E) },
7942 { PREFIX_TABLE (PREFIX_VEX_3A7F) },
7943 /* 80 */
7944 { Bad_Opcode },
7945 { Bad_Opcode },
7946 { Bad_Opcode },
7947 { Bad_Opcode },
7948 { Bad_Opcode },
7949 { Bad_Opcode },
7950 { Bad_Opcode },
7951 { Bad_Opcode },
7952 /* 88 */
7953 { Bad_Opcode },
7954 { Bad_Opcode },
7955 { Bad_Opcode },
7956 { Bad_Opcode },
7957 { Bad_Opcode },
7958 { Bad_Opcode },
7959 { Bad_Opcode },
7960 { Bad_Opcode },
7961 /* 90 */
7962 { Bad_Opcode },
7963 { Bad_Opcode },
7964 { Bad_Opcode },
7965 { Bad_Opcode },
7966 { Bad_Opcode },
7967 { Bad_Opcode },
7968 { Bad_Opcode },
7969 { Bad_Opcode },
7970 /* 98 */
7971 { Bad_Opcode },
7972 { Bad_Opcode },
7973 { Bad_Opcode },
7974 { Bad_Opcode },
7975 { Bad_Opcode },
7976 { Bad_Opcode },
7977 { Bad_Opcode },
7978 { Bad_Opcode },
7979 /* a0 */
7980 { Bad_Opcode },
7981 { Bad_Opcode },
7982 { Bad_Opcode },
7983 { Bad_Opcode },
7984 { Bad_Opcode },
7985 { Bad_Opcode },
7986 { Bad_Opcode },
7987 { Bad_Opcode },
7988 /* a8 */
7989 { Bad_Opcode },
7990 { Bad_Opcode },
7991 { Bad_Opcode },
7992 { Bad_Opcode },
7993 { Bad_Opcode },
7994 { Bad_Opcode },
7995 { Bad_Opcode },
7996 { Bad_Opcode },
7997 /* b0 */
7998 { Bad_Opcode },
7999 { Bad_Opcode },
8000 { Bad_Opcode },
8001 { Bad_Opcode },
8002 { Bad_Opcode },
8003 { Bad_Opcode },
8004 { Bad_Opcode },
8005 { Bad_Opcode },
8006 /* b8 */
8007 { Bad_Opcode },
8008 { Bad_Opcode },
8009 { Bad_Opcode },
8010 { Bad_Opcode },
8011 { Bad_Opcode },
8012 { Bad_Opcode },
8013 { Bad_Opcode },
8014 { Bad_Opcode },
8015 /* c0 */
8016 { Bad_Opcode },
8017 { Bad_Opcode },
8018 { Bad_Opcode },
8019 { Bad_Opcode },
8020 { Bad_Opcode },
8021 { Bad_Opcode },
8022 { Bad_Opcode },
8023 { Bad_Opcode },
8024 /* c8 */
8025 { Bad_Opcode },
8026 { Bad_Opcode },
8027 { Bad_Opcode },
8028 { Bad_Opcode },
8029 { Bad_Opcode },
8030 { Bad_Opcode },
8031 { Bad_Opcode },
8032 { Bad_Opcode },
8033 /* d0 */
8034 { Bad_Opcode },
8035 { Bad_Opcode },
8036 { Bad_Opcode },
8037 { Bad_Opcode },
8038 { Bad_Opcode },
8039 { Bad_Opcode },
8040 { Bad_Opcode },
8041 { Bad_Opcode },
8042 /* d8 */
8043 { Bad_Opcode },
8044 { Bad_Opcode },
8045 { Bad_Opcode },
8046 { Bad_Opcode },
8047 { Bad_Opcode },
8048 { Bad_Opcode },
8049 { Bad_Opcode },
8050 { PREFIX_TABLE (PREFIX_VEX_3ADF) },
8051 /* e0 */
8052 { Bad_Opcode },
8053 { Bad_Opcode },
8054 { Bad_Opcode },
8055 { Bad_Opcode },
8056 { Bad_Opcode },
8057 { Bad_Opcode },
8058 { Bad_Opcode },
8059 { Bad_Opcode },
8060 /* e8 */
8061 { Bad_Opcode },
8062 { Bad_Opcode },
8063 { Bad_Opcode },
8064 { Bad_Opcode },
8065 { Bad_Opcode },
8066 { Bad_Opcode },
8067 { Bad_Opcode },
8068 { Bad_Opcode },
8069 /* f0 */
8070 { Bad_Opcode },
8071 { Bad_Opcode },
8072 { Bad_Opcode },
8073 { Bad_Opcode },
8074 { Bad_Opcode },
8075 { Bad_Opcode },
8076 { Bad_Opcode },
8077 { Bad_Opcode },
8078 /* f8 */
8079 { Bad_Opcode },
8080 { Bad_Opcode },
8081 { Bad_Opcode },
8082 { Bad_Opcode },
8083 { Bad_Opcode },
8084 { Bad_Opcode },
8085 { Bad_Opcode },
8086 { Bad_Opcode },
8090 static const struct dis386 vex_len_table[][2] = {
8091 /* VEX_LEN_10_P_1 */
8093 { VEX_W_TABLE (VEX_W_10_P_1) },
8094 { VEX_W_TABLE (VEX_W_10_P_1) },
8097 /* VEX_LEN_10_P_3 */
8099 { VEX_W_TABLE (VEX_W_10_P_3) },
8100 { VEX_W_TABLE (VEX_W_10_P_3) },
8103 /* VEX_LEN_11_P_1 */
8105 { VEX_W_TABLE (VEX_W_11_P_1) },
8106 { VEX_W_TABLE (VEX_W_11_P_1) },
8109 /* VEX_LEN_11_P_3 */
8111 { VEX_W_TABLE (VEX_W_11_P_3) },
8112 { VEX_W_TABLE (VEX_W_11_P_3) },
8115 /* VEX_LEN_12_P_0_M_0 */
8117 { VEX_W_TABLE (VEX_W_12_P_0_M_0) },
8120 /* VEX_LEN_12_P_0_M_1 */
8122 { VEX_W_TABLE (VEX_W_12_P_0_M_1) },
8125 /* VEX_LEN_12_P_2 */
8127 { VEX_W_TABLE (VEX_W_12_P_2) },
8130 /* VEX_LEN_13_M_0 */
8132 { VEX_W_TABLE (VEX_W_13_M_0) },
8135 /* VEX_LEN_16_P_0_M_0 */
8137 { VEX_W_TABLE (VEX_W_16_P_0_M_0) },
8140 /* VEX_LEN_16_P_0_M_1 */
8142 { VEX_W_TABLE (VEX_W_16_P_0_M_1) },
8145 /* VEX_LEN_16_P_2 */
8147 { VEX_W_TABLE (VEX_W_16_P_2) },
8150 /* VEX_LEN_17_M_0 */
8152 { VEX_W_TABLE (VEX_W_17_M_0) },
8155 /* VEX_LEN_2A_P_1 */
8157 { "vcvtsi2ss%LQ", { XMScalar, VexScalar, Ev } },
8158 { "vcvtsi2ss%LQ", { XMScalar, VexScalar, Ev } },
8161 /* VEX_LEN_2A_P_3 */
8163 { "vcvtsi2sd%LQ", { XMScalar, VexScalar, Ev } },
8164 { "vcvtsi2sd%LQ", { XMScalar, VexScalar, Ev } },
8167 /* VEX_LEN_2C_P_1 */
8169 { "vcvttss2siY", { Gv, EXdScalar } },
8170 { "vcvttss2siY", { Gv, EXdScalar } },
8173 /* VEX_LEN_2C_P_3 */
8175 { "vcvttsd2siY", { Gv, EXqScalar } },
8176 { "vcvttsd2siY", { Gv, EXqScalar } },
8179 /* VEX_LEN_2D_P_1 */
8181 { "vcvtss2siY", { Gv, EXdScalar } },
8182 { "vcvtss2siY", { Gv, EXdScalar } },
8185 /* VEX_LEN_2D_P_3 */
8187 { "vcvtsd2siY", { Gv, EXqScalar } },
8188 { "vcvtsd2siY", { Gv, EXqScalar } },
8191 /* VEX_LEN_2E_P_0 */
8193 { VEX_W_TABLE (VEX_W_2E_P_0) },
8194 { VEX_W_TABLE (VEX_W_2E_P_0) },
8197 /* VEX_LEN_2E_P_2 */
8199 { VEX_W_TABLE (VEX_W_2E_P_2) },
8200 { VEX_W_TABLE (VEX_W_2E_P_2) },
8203 /* VEX_LEN_2F_P_0 */
8205 { VEX_W_TABLE (VEX_W_2F_P_0) },
8206 { VEX_W_TABLE (VEX_W_2F_P_0) },
8209 /* VEX_LEN_2F_P_2 */
8211 { VEX_W_TABLE (VEX_W_2F_P_2) },
8212 { VEX_W_TABLE (VEX_W_2F_P_2) },
8215 /* VEX_LEN_51_P_1 */
8217 { VEX_W_TABLE (VEX_W_51_P_1) },
8218 { VEX_W_TABLE (VEX_W_51_P_1) },
8221 /* VEX_LEN_51_P_3 */
8223 { VEX_W_TABLE (VEX_W_51_P_3) },
8224 { VEX_W_TABLE (VEX_W_51_P_3) },
8227 /* VEX_LEN_52_P_1 */
8229 { VEX_W_TABLE (VEX_W_52_P_1) },
8230 { VEX_W_TABLE (VEX_W_52_P_1) },
8233 /* VEX_LEN_53_P_1 */
8235 { VEX_W_TABLE (VEX_W_53_P_1) },
8236 { VEX_W_TABLE (VEX_W_53_P_1) },
8239 /* VEX_LEN_58_P_1 */
8241 { VEX_W_TABLE (VEX_W_58_P_1) },
8242 { VEX_W_TABLE (VEX_W_58_P_1) },
8245 /* VEX_LEN_58_P_3 */
8247 { VEX_W_TABLE (VEX_W_58_P_3) },
8248 { VEX_W_TABLE (VEX_W_58_P_3) },
8251 /* VEX_LEN_59_P_1 */
8253 { VEX_W_TABLE (VEX_W_59_P_1) },
8254 { VEX_W_TABLE (VEX_W_59_P_1) },
8257 /* VEX_LEN_59_P_3 */
8259 { VEX_W_TABLE (VEX_W_59_P_3) },
8260 { VEX_W_TABLE (VEX_W_59_P_3) },
8263 /* VEX_LEN_5A_P_1 */
8265 { VEX_W_TABLE (VEX_W_5A_P_1) },
8266 { VEX_W_TABLE (VEX_W_5A_P_1) },
8269 /* VEX_LEN_5A_P_3 */
8271 { VEX_W_TABLE (VEX_W_5A_P_3) },
8272 { VEX_W_TABLE (VEX_W_5A_P_3) },
8275 /* VEX_LEN_5C_P_1 */
8277 { VEX_W_TABLE (VEX_W_5C_P_1) },
8278 { VEX_W_TABLE (VEX_W_5C_P_1) },
8281 /* VEX_LEN_5C_P_3 */
8283 { VEX_W_TABLE (VEX_W_5C_P_3) },
8284 { VEX_W_TABLE (VEX_W_5C_P_3) },
8287 /* VEX_LEN_5D_P_1 */
8289 { VEX_W_TABLE (VEX_W_5D_P_1) },
8290 { VEX_W_TABLE (VEX_W_5D_P_1) },
8293 /* VEX_LEN_5D_P_3 */
8295 { VEX_W_TABLE (VEX_W_5D_P_3) },
8296 { VEX_W_TABLE (VEX_W_5D_P_3) },
8299 /* VEX_LEN_5E_P_1 */
8301 { VEX_W_TABLE (VEX_W_5E_P_1) },
8302 { VEX_W_TABLE (VEX_W_5E_P_1) },
8305 /* VEX_LEN_5E_P_3 */
8307 { VEX_W_TABLE (VEX_W_5E_P_3) },
8308 { VEX_W_TABLE (VEX_W_5E_P_3) },
8311 /* VEX_LEN_5F_P_1 */
8313 { VEX_W_TABLE (VEX_W_5F_P_1) },
8314 { VEX_W_TABLE (VEX_W_5F_P_1) },
8317 /* VEX_LEN_5F_P_3 */
8319 { VEX_W_TABLE (VEX_W_5F_P_3) },
8320 { VEX_W_TABLE (VEX_W_5F_P_3) },
8323 /* VEX_LEN_60_P_2 */
8325 { VEX_W_TABLE (VEX_W_60_P_2) },
8328 /* VEX_LEN_61_P_2 */
8330 { VEX_W_TABLE (VEX_W_61_P_2) },
8333 /* VEX_LEN_62_P_2 */
8335 { VEX_W_TABLE (VEX_W_62_P_2) },
8338 /* VEX_LEN_63_P_2 */
8340 { VEX_W_TABLE (VEX_W_63_P_2) },
8343 /* VEX_LEN_64_P_2 */
8345 { VEX_W_TABLE (VEX_W_64_P_2) },
8348 /* VEX_LEN_65_P_2 */
8350 { VEX_W_TABLE (VEX_W_65_P_2) },
8353 /* VEX_LEN_66_P_2 */
8355 { VEX_W_TABLE (VEX_W_66_P_2) },
8358 /* VEX_LEN_67_P_2 */
8360 { VEX_W_TABLE (VEX_W_67_P_2) },
8363 /* VEX_LEN_68_P_2 */
8365 { VEX_W_TABLE (VEX_W_68_P_2) },
8368 /* VEX_LEN_69_P_2 */
8370 { VEX_W_TABLE (VEX_W_69_P_2) },
8373 /* VEX_LEN_6A_P_2 */
8375 { VEX_W_TABLE (VEX_W_6A_P_2) },
8378 /* VEX_LEN_6B_P_2 */
8380 { VEX_W_TABLE (VEX_W_6B_P_2) },
8383 /* VEX_LEN_6C_P_2 */
8385 { VEX_W_TABLE (VEX_W_6C_P_2) },
8388 /* VEX_LEN_6D_P_2 */
8390 { VEX_W_TABLE (VEX_W_6D_P_2) },
8393 /* VEX_LEN_6E_P_2 */
8395 { "vmovK", { XMScalar, Edq } },
8396 { "vmovK", { XMScalar, Edq } },
8399 /* VEX_LEN_70_P_1 */
8401 { VEX_W_TABLE (VEX_W_70_P_1) },
8404 /* VEX_LEN_70_P_2 */
8406 { VEX_W_TABLE (VEX_W_70_P_2) },
8409 /* VEX_LEN_70_P_3 */
8411 { VEX_W_TABLE (VEX_W_70_P_3) },
8414 /* VEX_LEN_71_R_2_P_2 */
8416 { VEX_W_TABLE (VEX_W_71_R_2_P_2) },
8419 /* VEX_LEN_71_R_4_P_2 */
8421 { VEX_W_TABLE (VEX_W_71_R_4_P_2) },
8424 /* VEX_LEN_71_R_6_P_2 */
8426 { VEX_W_TABLE (VEX_W_71_R_6_P_2) },
8429 /* VEX_LEN_72_R_2_P_2 */
8431 { VEX_W_TABLE (VEX_W_72_R_2_P_2) },
8434 /* VEX_LEN_72_R_4_P_2 */
8436 { VEX_W_TABLE (VEX_W_72_R_4_P_2) },
8439 /* VEX_LEN_72_R_6_P_2 */
8441 { VEX_W_TABLE (VEX_W_72_R_6_P_2) },
8444 /* VEX_LEN_73_R_2_P_2 */
8446 { VEX_W_TABLE (VEX_W_73_R_2_P_2) },
8449 /* VEX_LEN_73_R_3_P_2 */
8451 { VEX_W_TABLE (VEX_W_73_R_3_P_2) },
8454 /* VEX_LEN_73_R_6_P_2 */
8456 { VEX_W_TABLE (VEX_W_73_R_6_P_2) },
8459 /* VEX_LEN_73_R_7_P_2 */
8461 { VEX_W_TABLE (VEX_W_73_R_7_P_2) },
8464 /* VEX_LEN_74_P_2 */
8466 { VEX_W_TABLE (VEX_W_74_P_2) },
8469 /* VEX_LEN_75_P_2 */
8471 { VEX_W_TABLE (VEX_W_75_P_2) },
8474 /* VEX_LEN_76_P_2 */
8476 { VEX_W_TABLE (VEX_W_76_P_2) },
8479 /* VEX_LEN_7E_P_1 */
8481 { VEX_W_TABLE (VEX_W_7E_P_1) },
8482 { VEX_W_TABLE (VEX_W_7E_P_1) },
8485 /* VEX_LEN_7E_P_2 */
8487 { "vmovK", { Edq, XMScalar } },
8488 { "vmovK", { Edq, XMScalar } },
8491 /* VEX_LEN_AE_R_2_M_0 */
8493 { VEX_W_TABLE (VEX_W_AE_R_2_M_0) },
8496 /* VEX_LEN_AE_R_3_M_0 */
8498 { VEX_W_TABLE (VEX_W_AE_R_3_M_0) },
8501 /* VEX_LEN_C2_P_1 */
8503 { VEX_W_TABLE (VEX_W_C2_P_1) },
8504 { VEX_W_TABLE (VEX_W_C2_P_1) },
8507 /* VEX_LEN_C2_P_3 */
8509 { VEX_W_TABLE (VEX_W_C2_P_3) },
8510 { VEX_W_TABLE (VEX_W_C2_P_3) },
8513 /* VEX_LEN_C4_P_2 */
8515 { VEX_W_TABLE (VEX_W_C4_P_2) },
8518 /* VEX_LEN_C5_P_2 */
8520 { VEX_W_TABLE (VEX_W_C5_P_2) },
8523 /* VEX_LEN_D1_P_2 */
8525 { VEX_W_TABLE (VEX_W_D1_P_2) },
8528 /* VEX_LEN_D2_P_2 */
8530 { VEX_W_TABLE (VEX_W_D2_P_2) },
8533 /* VEX_LEN_D3_P_2 */
8535 { VEX_W_TABLE (VEX_W_D3_P_2) },
8538 /* VEX_LEN_D4_P_2 */
8540 { VEX_W_TABLE (VEX_W_D4_P_2) },
8543 /* VEX_LEN_D5_P_2 */
8545 { VEX_W_TABLE (VEX_W_D5_P_2) },
8548 /* VEX_LEN_D6_P_2 */
8550 { VEX_W_TABLE (VEX_W_D6_P_2) },
8551 { VEX_W_TABLE (VEX_W_D6_P_2) },
8554 /* VEX_LEN_D7_P_2_M_1 */
8556 { VEX_W_TABLE (VEX_W_D7_P_2_M_1) },
8559 /* VEX_LEN_D8_P_2 */
8561 { VEX_W_TABLE (VEX_W_D8_P_2) },
8564 /* VEX_LEN_D9_P_2 */
8566 { VEX_W_TABLE (VEX_W_D9_P_2) },
8569 /* VEX_LEN_DA_P_2 */
8571 { VEX_W_TABLE (VEX_W_DA_P_2) },
8574 /* VEX_LEN_DB_P_2 */
8576 { VEX_W_TABLE (VEX_W_DB_P_2) },
8579 /* VEX_LEN_DC_P_2 */
8581 { VEX_W_TABLE (VEX_W_DC_P_2) },
8584 /* VEX_LEN_DD_P_2 */
8586 { VEX_W_TABLE (VEX_W_DD_P_2) },
8589 /* VEX_LEN_DE_P_2 */
8591 { VEX_W_TABLE (VEX_W_DE_P_2) },
8594 /* VEX_LEN_DF_P_2 */
8596 { VEX_W_TABLE (VEX_W_DF_P_2) },
8599 /* VEX_LEN_E0_P_2 */
8601 { VEX_W_TABLE (VEX_W_E0_P_2) },
8604 /* VEX_LEN_E1_P_2 */
8606 { VEX_W_TABLE (VEX_W_E1_P_2) },
8609 /* VEX_LEN_E2_P_2 */
8611 { VEX_W_TABLE (VEX_W_E2_P_2) },
8614 /* VEX_LEN_E3_P_2 */
8616 { VEX_W_TABLE (VEX_W_E3_P_2) },
8619 /* VEX_LEN_E4_P_2 */
8621 { VEX_W_TABLE (VEX_W_E4_P_2) },
8624 /* VEX_LEN_E5_P_2 */
8626 { VEX_W_TABLE (VEX_W_E5_P_2) },
8629 /* VEX_LEN_E8_P_2 */
8631 { VEX_W_TABLE (VEX_W_E8_P_2) },
8634 /* VEX_LEN_E9_P_2 */
8636 { VEX_W_TABLE (VEX_W_E9_P_2) },
8639 /* VEX_LEN_EA_P_2 */
8641 { VEX_W_TABLE (VEX_W_EA_P_2) },
8644 /* VEX_LEN_EB_P_2 */
8646 { VEX_W_TABLE (VEX_W_EB_P_2) },
8649 /* VEX_LEN_EC_P_2 */
8651 { VEX_W_TABLE (VEX_W_EC_P_2) },
8654 /* VEX_LEN_ED_P_2 */
8656 { VEX_W_TABLE (VEX_W_ED_P_2) },
8659 /* VEX_LEN_EE_P_2 */
8661 { VEX_W_TABLE (VEX_W_EE_P_2) },
8664 /* VEX_LEN_EF_P_2 */
8666 { VEX_W_TABLE (VEX_W_EF_P_2) },
8669 /* VEX_LEN_F1_P_2 */
8671 { VEX_W_TABLE (VEX_W_F1_P_2) },
8674 /* VEX_LEN_F2_P_2 */
8676 { VEX_W_TABLE (VEX_W_F2_P_2) },
8679 /* VEX_LEN_F3_P_2 */
8681 { VEX_W_TABLE (VEX_W_F3_P_2) },
8684 /* VEX_LEN_F4_P_2 */
8686 { VEX_W_TABLE (VEX_W_F4_P_2) },
8689 /* VEX_LEN_F5_P_2 */
8691 { VEX_W_TABLE (VEX_W_F5_P_2) },
8694 /* VEX_LEN_F6_P_2 */
8696 { VEX_W_TABLE (VEX_W_F6_P_2) },
8699 /* VEX_LEN_F7_P_2 */
8701 { VEX_W_TABLE (VEX_W_F7_P_2) },
8704 /* VEX_LEN_F8_P_2 */
8706 { VEX_W_TABLE (VEX_W_F8_P_2) },
8709 /* VEX_LEN_F9_P_2 */
8711 { VEX_W_TABLE (VEX_W_F9_P_2) },
8714 /* VEX_LEN_FA_P_2 */
8716 { VEX_W_TABLE (VEX_W_FA_P_2) },
8719 /* VEX_LEN_FB_P_2 */
8721 { VEX_W_TABLE (VEX_W_FB_P_2) },
8724 /* VEX_LEN_FC_P_2 */
8726 { VEX_W_TABLE (VEX_W_FC_P_2) },
8729 /* VEX_LEN_FD_P_2 */
8731 { VEX_W_TABLE (VEX_W_FD_P_2) },
8734 /* VEX_LEN_FE_P_2 */
8736 { VEX_W_TABLE (VEX_W_FE_P_2) },
8739 /* VEX_LEN_3800_P_2 */
8741 { VEX_W_TABLE (VEX_W_3800_P_2) },
8744 /* VEX_LEN_3801_P_2 */
8746 { VEX_W_TABLE (VEX_W_3801_P_2) },
8749 /* VEX_LEN_3802_P_2 */
8751 { VEX_W_TABLE (VEX_W_3802_P_2) },
8754 /* VEX_LEN_3803_P_2 */
8756 { VEX_W_TABLE (VEX_W_3803_P_2) },
8759 /* VEX_LEN_3804_P_2 */
8761 { VEX_W_TABLE (VEX_W_3804_P_2) },
8764 /* VEX_LEN_3805_P_2 */
8766 { VEX_W_TABLE (VEX_W_3805_P_2) },
8769 /* VEX_LEN_3806_P_2 */
8771 { VEX_W_TABLE (VEX_W_3806_P_2) },
8774 /* VEX_LEN_3807_P_2 */
8776 { VEX_W_TABLE (VEX_W_3807_P_2) },
8779 /* VEX_LEN_3808_P_2 */
8781 { VEX_W_TABLE (VEX_W_3808_P_2) },
8784 /* VEX_LEN_3809_P_2 */
8786 { VEX_W_TABLE (VEX_W_3809_P_2) },
8789 /* VEX_LEN_380A_P_2 */
8791 { VEX_W_TABLE (VEX_W_380A_P_2) },
8794 /* VEX_LEN_380B_P_2 */
8796 { VEX_W_TABLE (VEX_W_380B_P_2) },
8799 /* VEX_LEN_3819_P_2_M_0 */
8801 { Bad_Opcode },
8802 { VEX_W_TABLE (VEX_W_3819_P_2_M_0) },
8805 /* VEX_LEN_381A_P_2_M_0 */
8807 { Bad_Opcode },
8808 { VEX_W_TABLE (VEX_W_381A_P_2_M_0) },
8811 /* VEX_LEN_381C_P_2 */
8813 { VEX_W_TABLE (VEX_W_381C_P_2) },
8816 /* VEX_LEN_381D_P_2 */
8818 { VEX_W_TABLE (VEX_W_381D_P_2) },
8821 /* VEX_LEN_381E_P_2 */
8823 { VEX_W_TABLE (VEX_W_381E_P_2) },
8826 /* VEX_LEN_3820_P_2 */
8828 { VEX_W_TABLE (VEX_W_3820_P_2) },
8831 /* VEX_LEN_3821_P_2 */
8833 { VEX_W_TABLE (VEX_W_3821_P_2) },
8836 /* VEX_LEN_3822_P_2 */
8838 { VEX_W_TABLE (VEX_W_3822_P_2) },
8841 /* VEX_LEN_3823_P_2 */
8843 { VEX_W_TABLE (VEX_W_3823_P_2) },
8846 /* VEX_LEN_3824_P_2 */
8848 { VEX_W_TABLE (VEX_W_3824_P_2) },
8851 /* VEX_LEN_3825_P_2 */
8853 { VEX_W_TABLE (VEX_W_3825_P_2) },
8856 /* VEX_LEN_3828_P_2 */
8858 { VEX_W_TABLE (VEX_W_3828_P_2) },
8861 /* VEX_LEN_3829_P_2 */
8863 { VEX_W_TABLE (VEX_W_3829_P_2) },
8866 /* VEX_LEN_382A_P_2_M_0 */
8868 { VEX_W_TABLE (VEX_W_382A_P_2_M_0) },
8871 /* VEX_LEN_382B_P_2 */
8873 { VEX_W_TABLE (VEX_W_382B_P_2) },
8876 /* VEX_LEN_3830_P_2 */
8878 { VEX_W_TABLE (VEX_W_3830_P_2) },
8881 /* VEX_LEN_3831_P_2 */
8883 { VEX_W_TABLE (VEX_W_3831_P_2) },
8886 /* VEX_LEN_3832_P_2 */
8888 { VEX_W_TABLE (VEX_W_3832_P_2) },
8891 /* VEX_LEN_3833_P_2 */
8893 { VEX_W_TABLE (VEX_W_3833_P_2) },
8896 /* VEX_LEN_3834_P_2 */
8898 { VEX_W_TABLE (VEX_W_3834_P_2) },
8901 /* VEX_LEN_3835_P_2 */
8903 { VEX_W_TABLE (VEX_W_3835_P_2) },
8906 /* VEX_LEN_3837_P_2 */
8908 { VEX_W_TABLE (VEX_W_3837_P_2) },
8911 /* VEX_LEN_3838_P_2 */
8913 { VEX_W_TABLE (VEX_W_3838_P_2) },
8916 /* VEX_LEN_3839_P_2 */
8918 { VEX_W_TABLE (VEX_W_3839_P_2) },
8921 /* VEX_LEN_383A_P_2 */
8923 { VEX_W_TABLE (VEX_W_383A_P_2) },
8926 /* VEX_LEN_383B_P_2 */
8928 { VEX_W_TABLE (VEX_W_383B_P_2) },
8931 /* VEX_LEN_383C_P_2 */
8933 { VEX_W_TABLE (VEX_W_383C_P_2) },
8936 /* VEX_LEN_383D_P_2 */
8938 { VEX_W_TABLE (VEX_W_383D_P_2) },
8941 /* VEX_LEN_383E_P_2 */
8943 { VEX_W_TABLE (VEX_W_383E_P_2) },
8946 /* VEX_LEN_383F_P_2 */
8948 { VEX_W_TABLE (VEX_W_383F_P_2) },
8951 /* VEX_LEN_3840_P_2 */
8953 { VEX_W_TABLE (VEX_W_3840_P_2) },
8956 /* VEX_LEN_3841_P_2 */
8958 { VEX_W_TABLE (VEX_W_3841_P_2) },
8961 /* VEX_LEN_38DB_P_2 */
8963 { VEX_W_TABLE (VEX_W_38DB_P_2) },
8966 /* VEX_LEN_38DC_P_2 */
8968 { VEX_W_TABLE (VEX_W_38DC_P_2) },
8971 /* VEX_LEN_38DD_P_2 */
8973 { VEX_W_TABLE (VEX_W_38DD_P_2) },
8976 /* VEX_LEN_38DE_P_2 */
8978 { VEX_W_TABLE (VEX_W_38DE_P_2) },
8981 /* VEX_LEN_38DF_P_2 */
8983 { VEX_W_TABLE (VEX_W_38DF_P_2) },
8986 /* VEX_LEN_3A06_P_2 */
8988 { Bad_Opcode },
8989 { VEX_W_TABLE (VEX_W_3A06_P_2) },
8992 /* VEX_LEN_3A0A_P_2 */
8994 { VEX_W_TABLE (VEX_W_3A0A_P_2) },
8995 { VEX_W_TABLE (VEX_W_3A0A_P_2) },
8998 /* VEX_LEN_3A0B_P_2 */
9000 { VEX_W_TABLE (VEX_W_3A0B_P_2) },
9001 { VEX_W_TABLE (VEX_W_3A0B_P_2) },
9004 /* VEX_LEN_3A0E_P_2 */
9006 { VEX_W_TABLE (VEX_W_3A0E_P_2) },
9009 /* VEX_LEN_3A0F_P_2 */
9011 { VEX_W_TABLE (VEX_W_3A0F_P_2) },
9014 /* VEX_LEN_3A14_P_2 */
9016 { VEX_W_TABLE (VEX_W_3A14_P_2) },
9019 /* VEX_LEN_3A15_P_2 */
9021 { VEX_W_TABLE (VEX_W_3A15_P_2) },
9024 /* VEX_LEN_3A16_P_2 */
9026 { "vpextrK", { Edq, XM, Ib } },
9029 /* VEX_LEN_3A17_P_2 */
9031 { "vextractps", { Edqd, XM, Ib } },
9034 /* VEX_LEN_3A18_P_2 */
9036 { Bad_Opcode },
9037 { VEX_W_TABLE (VEX_W_3A18_P_2) },
9040 /* VEX_LEN_3A19_P_2 */
9042 { Bad_Opcode },
9043 { VEX_W_TABLE (VEX_W_3A19_P_2) },
9046 /* VEX_LEN_3A20_P_2 */
9048 { VEX_W_TABLE (VEX_W_3A20_P_2) },
9051 /* VEX_LEN_3A21_P_2 */
9053 { VEX_W_TABLE (VEX_W_3A21_P_2) },
9056 /* VEX_LEN_3A22_P_2 */
9058 { "vpinsrK", { XM, Vex128, Edq, Ib } },
9061 /* VEX_LEN_3A41_P_2 */
9063 { VEX_W_TABLE (VEX_W_3A41_P_2) },
9066 /* VEX_LEN_3A42_P_2 */
9068 { VEX_W_TABLE (VEX_W_3A42_P_2) },
9071 /* VEX_LEN_3A44_P_2 */
9073 { VEX_W_TABLE (VEX_W_3A44_P_2) },
9076 /* VEX_LEN_3A4C_P_2 */
9078 { VEX_W_TABLE (VEX_W_3A4C_P_2) },
9081 /* VEX_LEN_3A60_P_2 */
9083 { VEX_W_TABLE (VEX_W_3A60_P_2) },
9086 /* VEX_LEN_3A61_P_2 */
9088 { VEX_W_TABLE (VEX_W_3A61_P_2) },
9091 /* VEX_LEN_3A62_P_2 */
9093 { VEX_W_TABLE (VEX_W_3A62_P_2) },
9096 /* VEX_LEN_3A63_P_2 */
9098 { VEX_W_TABLE (VEX_W_3A63_P_2) },
9101 /* VEX_LEN_3A6A_P_2 */
9103 { "vfmaddss", { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
9106 /* VEX_LEN_3A6B_P_2 */
9108 { "vfmaddsd", { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
9111 /* VEX_LEN_3A6E_P_2 */
9113 { "vfmsubss", { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
9116 /* VEX_LEN_3A6F_P_2 */
9118 { "vfmsubsd", { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
9121 /* VEX_LEN_3A7A_P_2 */
9123 { "vfnmaddss", { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
9126 /* VEX_LEN_3A7B_P_2 */
9128 { "vfnmaddsd", { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
9131 /* VEX_LEN_3A7E_P_2 */
9133 { "vfnmsubss", { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
9136 /* VEX_LEN_3A7F_P_2 */
9138 { "vfnmsubsd", { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
9141 /* VEX_LEN_3ADF_P_2 */
9143 { VEX_W_TABLE (VEX_W_3ADF_P_2) },
9146 /* VEX_LEN_XOP_09_80 */
9148 { "vfrczps", { XM, EXxmm } },
9149 { "vfrczps", { XM, EXymmq } },
9152 /* VEX_LEN_XOP_09_81 */
9154 { "vfrczpd", { XM, EXxmm } },
9155 { "vfrczpd", { XM, EXymmq } },
9159 static const struct dis386 vex_w_table[][2] = {
9161 /* VEX_W_10_P_0 */
9162 { "vmovups", { XM, EXx } },
9165 /* VEX_W_10_P_1 */
9166 { "vmovss", { XMVexScalar, VexScalar, EXdScalar } },
9169 /* VEX_W_10_P_2 */
9170 { "vmovupd", { XM, EXx } },
9173 /* VEX_W_10_P_3 */
9174 { "vmovsd", { XMVexScalar, VexScalar, EXqScalar } },
9177 /* VEX_W_11_P_0 */
9178 { "vmovups", { EXxS, XM } },
9181 /* VEX_W_11_P_1 */
9182 { "vmovss", { EXdVexScalarS, VexScalar, XMScalar } },
9185 /* VEX_W_11_P_2 */
9186 { "vmovupd", { EXxS, XM } },
9189 /* VEX_W_11_P_3 */
9190 { "vmovsd", { EXqVexScalarS, VexScalar, XMScalar } },
9193 /* VEX_W_12_P_0_M_0 */
9194 { "vmovlps", { XM, Vex128, EXq } },
9197 /* VEX_W_12_P_0_M_1 */
9198 { "vmovhlps", { XM, Vex128, EXq } },
9201 /* VEX_W_12_P_1 */
9202 { "vmovsldup", { XM, EXx } },
9205 /* VEX_W_12_P_2 */
9206 { "vmovlpd", { XM, Vex128, EXq } },
9209 /* VEX_W_12_P_3 */
9210 { "vmovddup", { XM, EXymmq } },
9213 /* VEX_W_13_M_0 */
9214 { "vmovlpX", { EXq, XM } },
9217 /* VEX_W_14 */
9218 { "vunpcklpX", { XM, Vex, EXx } },
9221 /* VEX_W_15 */
9222 { "vunpckhpX", { XM, Vex, EXx } },
9225 /* VEX_W_16_P_0_M_0 */
9226 { "vmovhps", { XM, Vex128, EXq } },
9229 /* VEX_W_16_P_0_M_1 */
9230 { "vmovlhps", { XM, Vex128, EXq } },
9233 /* VEX_W_16_P_1 */
9234 { "vmovshdup", { XM, EXx } },
9237 /* VEX_W_16_P_2 */
9238 { "vmovhpd", { XM, Vex128, EXq } },
9241 /* VEX_W_17_M_0 */
9242 { "vmovhpX", { EXq, XM } },
9245 /* VEX_W_28 */
9246 { "vmovapX", { XM, EXx } },
9249 /* VEX_W_29 */
9250 { "vmovapX", { EXxS, XM } },
9253 /* VEX_W_2B_M_0 */
9254 { "vmovntpX", { Mx, XM } },
9257 /* VEX_W_2E_P_0 */
9258 { "vucomiss", { XMScalar, EXdScalar } },
9261 /* VEX_W_2E_P_2 */
9262 { "vucomisd", { XMScalar, EXqScalar } },
9265 /* VEX_W_2F_P_0 */
9266 { "vcomiss", { XMScalar, EXdScalar } },
9269 /* VEX_W_2F_P_2 */
9270 { "vcomisd", { XMScalar, EXqScalar } },
9273 /* VEX_W_50_M_0 */
9274 { "vmovmskpX", { Gdq, XS } },
9277 /* VEX_W_51_P_0 */
9278 { "vsqrtps", { XM, EXx } },
9281 /* VEX_W_51_P_1 */
9282 { "vsqrtss", { XMScalar, VexScalar, EXdScalar } },
9285 /* VEX_W_51_P_2 */
9286 { "vsqrtpd", { XM, EXx } },
9289 /* VEX_W_51_P_3 */
9290 { "vsqrtsd", { XMScalar, VexScalar, EXqScalar } },
9293 /* VEX_W_52_P_0 */
9294 { "vrsqrtps", { XM, EXx } },
9297 /* VEX_W_52_P_1 */
9298 { "vrsqrtss", { XMScalar, VexScalar, EXdScalar } },
9301 /* VEX_W_53_P_0 */
9302 { "vrcpps", { XM, EXx } },
9305 /* VEX_W_53_P_1 */
9306 { "vrcpss", { XMScalar, VexScalar, EXdScalar } },
9309 /* VEX_W_58_P_0 */
9310 { "vaddps", { XM, Vex, EXx } },
9313 /* VEX_W_58_P_1 */
9314 { "vaddss", { XMScalar, VexScalar, EXdScalar } },
9317 /* VEX_W_58_P_2 */
9318 { "vaddpd", { XM, Vex, EXx } },
9321 /* VEX_W_58_P_3 */
9322 { "vaddsd", { XMScalar, VexScalar, EXqScalar } },
9325 /* VEX_W_59_P_0 */
9326 { "vmulps", { XM, Vex, EXx } },
9329 /* VEX_W_59_P_1 */
9330 { "vmulss", { XMScalar, VexScalar, EXdScalar } },
9333 /* VEX_W_59_P_2 */
9334 { "vmulpd", { XM, Vex, EXx } },
9337 /* VEX_W_59_P_3 */
9338 { "vmulsd", { XMScalar, VexScalar, EXqScalar } },
9341 /* VEX_W_5A_P_0 */
9342 { "vcvtps2pd", { XM, EXxmmq } },
9345 /* VEX_W_5A_P_1 */
9346 { "vcvtss2sd", { XMScalar, VexScalar, EXdScalar } },
9349 /* VEX_W_5A_P_3 */
9350 { "vcvtsd2ss", { XMScalar, VexScalar, EXqScalar } },
9353 /* VEX_W_5B_P_0 */
9354 { "vcvtdq2ps", { XM, EXx } },
9357 /* VEX_W_5B_P_1 */
9358 { "vcvttps2dq", { XM, EXx } },
9361 /* VEX_W_5B_P_2 */
9362 { "vcvtps2dq", { XM, EXx } },
9365 /* VEX_W_5C_P_0 */
9366 { "vsubps", { XM, Vex, EXx } },
9369 /* VEX_W_5C_P_1 */
9370 { "vsubss", { XMScalar, VexScalar, EXdScalar } },
9373 /* VEX_W_5C_P_2 */
9374 { "vsubpd", { XM, Vex, EXx } },
9377 /* VEX_W_5C_P_3 */
9378 { "vsubsd", { XMScalar, VexScalar, EXqScalar } },
9381 /* VEX_W_5D_P_0 */
9382 { "vminps", { XM, Vex, EXx } },
9385 /* VEX_W_5D_P_1 */
9386 { "vminss", { XMScalar, VexScalar, EXdScalar } },
9389 /* VEX_W_5D_P_2 */
9390 { "vminpd", { XM, Vex, EXx } },
9393 /* VEX_W_5D_P_3 */
9394 { "vminsd", { XMScalar, VexScalar, EXqScalar } },
9397 /* VEX_W_5E_P_0 */
9398 { "vdivps", { XM, Vex, EXx } },
9401 /* VEX_W_5E_P_1 */
9402 { "vdivss", { XMScalar, VexScalar, EXdScalar } },
9405 /* VEX_W_5E_P_2 */
9406 { "vdivpd", { XM, Vex, EXx } },
9409 /* VEX_W_5E_P_3 */
9410 { "vdivsd", { XMScalar, VexScalar, EXqScalar } },
9413 /* VEX_W_5F_P_0 */
9414 { "vmaxps", { XM, Vex, EXx } },
9417 /* VEX_W_5F_P_1 */
9418 { "vmaxss", { XMScalar, VexScalar, EXdScalar } },
9421 /* VEX_W_5F_P_2 */
9422 { "vmaxpd", { XM, Vex, EXx } },
9425 /* VEX_W_5F_P_3 */
9426 { "vmaxsd", { XMScalar, VexScalar, EXqScalar } },
9429 /* VEX_W_60_P_2 */
9430 { "vpunpcklbw", { XM, Vex128, EXx } },
9433 /* VEX_W_61_P_2 */
9434 { "vpunpcklwd", { XM, Vex128, EXx } },
9437 /* VEX_W_62_P_2 */
9438 { "vpunpckldq", { XM, Vex128, EXx } },
9441 /* VEX_W_63_P_2 */
9442 { "vpacksswb", { XM, Vex128, EXx } },
9445 /* VEX_W_64_P_2 */
9446 { "vpcmpgtb", { XM, Vex128, EXx } },
9449 /* VEX_W_65_P_2 */
9450 { "vpcmpgtw", { XM, Vex128, EXx } },
9453 /* VEX_W_66_P_2 */
9454 { "vpcmpgtd", { XM, Vex128, EXx } },
9457 /* VEX_W_67_P_2 */
9458 { "vpackuswb", { XM, Vex128, EXx } },
9461 /* VEX_W_68_P_2 */
9462 { "vpunpckhbw", { XM, Vex128, EXx } },
9465 /* VEX_W_69_P_2 */
9466 { "vpunpckhwd", { XM, Vex128, EXx } },
9469 /* VEX_W_6A_P_2 */
9470 { "vpunpckhdq", { XM, Vex128, EXx } },
9473 /* VEX_W_6B_P_2 */
9474 { "vpackssdw", { XM, Vex128, EXx } },
9477 /* VEX_W_6C_P_2 */
9478 { "vpunpcklqdq", { XM, Vex128, EXx } },
9481 /* VEX_W_6D_P_2 */
9482 { "vpunpckhqdq", { XM, Vex128, EXx } },
9485 /* VEX_W_6F_P_1 */
9486 { "vmovdqu", { XM, EXx } },
9489 /* VEX_W_6F_P_2 */
9490 { "vmovdqa", { XM, EXx } },
9493 /* VEX_W_70_P_1 */
9494 { "vpshufhw", { XM, EXx, Ib } },
9497 /* VEX_W_70_P_2 */
9498 { "vpshufd", { XM, EXx, Ib } },
9501 /* VEX_W_70_P_3 */
9502 { "vpshuflw", { XM, EXx, Ib } },
9505 /* VEX_W_71_R_2_P_2 */
9506 { "vpsrlw", { Vex128, XS, Ib } },
9509 /* VEX_W_71_R_4_P_2 */
9510 { "vpsraw", { Vex128, XS, Ib } },
9513 /* VEX_W_71_R_6_P_2 */
9514 { "vpsllw", { Vex128, XS, Ib } },
9517 /* VEX_W_72_R_2_P_2 */
9518 { "vpsrld", { Vex128, XS, Ib } },
9521 /* VEX_W_72_R_4_P_2 */
9522 { "vpsrad", { Vex128, XS, Ib } },
9525 /* VEX_W_72_R_6_P_2 */
9526 { "vpslld", { Vex128, XS, Ib } },
9529 /* VEX_W_73_R_2_P_2 */
9530 { "vpsrlq", { Vex128, XS, Ib } },
9533 /* VEX_W_73_R_3_P_2 */
9534 { "vpsrldq", { Vex128, XS, Ib } },
9537 /* VEX_W_73_R_6_P_2 */
9538 { "vpsllq", { Vex128, XS, Ib } },
9541 /* VEX_W_73_R_7_P_2 */
9542 { "vpslldq", { Vex128, XS, Ib } },
9545 /* VEX_W_74_P_2 */
9546 { "vpcmpeqb", { XM, Vex128, EXx } },
9549 /* VEX_W_75_P_2 */
9550 { "vpcmpeqw", { XM, Vex128, EXx } },
9553 /* VEX_W_76_P_2 */
9554 { "vpcmpeqd", { XM, Vex128, EXx } },
9557 /* VEX_W_77_P_0 */
9558 { "", { VZERO } },
9561 /* VEX_W_7C_P_2 */
9562 { "vhaddpd", { XM, Vex, EXx } },
9565 /* VEX_W_7C_P_3 */
9566 { "vhaddps", { XM, Vex, EXx } },
9569 /* VEX_W_7D_P_2 */
9570 { "vhsubpd", { XM, Vex, EXx } },
9573 /* VEX_W_7D_P_3 */
9574 { "vhsubps", { XM, Vex, EXx } },
9577 /* VEX_W_7E_P_1 */
9578 { "vmovq", { XMScalar, EXqScalar } },
9581 /* VEX_W_7F_P_1 */
9582 { "vmovdqu", { EXxS, XM } },
9585 /* VEX_W_7F_P_2 */
9586 { "vmovdqa", { EXxS, XM } },
9589 /* VEX_W_AE_R_2_M_0 */
9590 { "vldmxcsr", { Md } },
9593 /* VEX_W_AE_R_3_M_0 */
9594 { "vstmxcsr", { Md } },
9597 /* VEX_W_C2_P_0 */
9598 { "vcmpps", { XM, Vex, EXx, VCMP } },
9601 /* VEX_W_C2_P_1 */
9602 { "vcmpss", { XMScalar, VexScalar, EXdScalar, VCMP } },
9605 /* VEX_W_C2_P_2 */
9606 { "vcmppd", { XM, Vex, EXx, VCMP } },
9609 /* VEX_W_C2_P_3 */
9610 { "vcmpsd", { XMScalar, VexScalar, EXqScalar, VCMP } },
9613 /* VEX_W_C4_P_2 */
9614 { "vpinsrw", { XM, Vex128, Edqw, Ib } },
9617 /* VEX_W_C5_P_2 */
9618 { "vpextrw", { Gdq, XS, Ib } },
9621 /* VEX_W_D0_P_2 */
9622 { "vaddsubpd", { XM, Vex, EXx } },
9625 /* VEX_W_D0_P_3 */
9626 { "vaddsubps", { XM, Vex, EXx } },
9629 /* VEX_W_D1_P_2 */
9630 { "vpsrlw", { XM, Vex128, EXx } },
9633 /* VEX_W_D2_P_2 */
9634 { "vpsrld", { XM, Vex128, EXx } },
9637 /* VEX_W_D3_P_2 */
9638 { "vpsrlq", { XM, Vex128, EXx } },
9641 /* VEX_W_D4_P_2 */
9642 { "vpaddq", { XM, Vex128, EXx } },
9645 /* VEX_W_D5_P_2 */
9646 { "vpmullw", { XM, Vex128, EXx } },
9649 /* VEX_W_D6_P_2 */
9650 { "vmovq", { EXqScalarS, XMScalar } },
9653 /* VEX_W_D7_P_2_M_1 */
9654 { "vpmovmskb", { Gdq, XS } },
9657 /* VEX_W_D8_P_2 */
9658 { "vpsubusb", { XM, Vex128, EXx } },
9661 /* VEX_W_D9_P_2 */
9662 { "vpsubusw", { XM, Vex128, EXx } },
9665 /* VEX_W_DA_P_2 */
9666 { "vpminub", { XM, Vex128, EXx } },
9669 /* VEX_W_DB_P_2 */
9670 { "vpand", { XM, Vex128, EXx } },
9673 /* VEX_W_DC_P_2 */
9674 { "vpaddusb", { XM, Vex128, EXx } },
9677 /* VEX_W_DD_P_2 */
9678 { "vpaddusw", { XM, Vex128, EXx } },
9681 /* VEX_W_DE_P_2 */
9682 { "vpmaxub", { XM, Vex128, EXx } },
9685 /* VEX_W_DF_P_2 */
9686 { "vpandn", { XM, Vex128, EXx } },
9689 /* VEX_W_E0_P_2 */
9690 { "vpavgb", { XM, Vex128, EXx } },
9693 /* VEX_W_E1_P_2 */
9694 { "vpsraw", { XM, Vex128, EXx } },
9697 /* VEX_W_E2_P_2 */
9698 { "vpsrad", { XM, Vex128, EXx } },
9701 /* VEX_W_E3_P_2 */
9702 { "vpavgw", { XM, Vex128, EXx } },
9705 /* VEX_W_E4_P_2 */
9706 { "vpmulhuw", { XM, Vex128, EXx } },
9709 /* VEX_W_E5_P_2 */
9710 { "vpmulhw", { XM, Vex128, EXx } },
9713 /* VEX_W_E6_P_1 */
9714 { "vcvtdq2pd", { XM, EXxmmq } },
9717 /* VEX_W_E6_P_2 */
9718 { "vcvttpd2dq%XY", { XMM, EXx } },
9721 /* VEX_W_E6_P_3 */
9722 { "vcvtpd2dq%XY", { XMM, EXx } },
9725 /* VEX_W_E7_P_2_M_0 */
9726 { "vmovntdq", { Mx, XM } },
9729 /* VEX_W_E8_P_2 */
9730 { "vpsubsb", { XM, Vex128, EXx } },
9733 /* VEX_W_E9_P_2 */
9734 { "vpsubsw", { XM, Vex128, EXx } },
9737 /* VEX_W_EA_P_2 */
9738 { "vpminsw", { XM, Vex128, EXx } },
9741 /* VEX_W_EB_P_2 */
9742 { "vpor", { XM, Vex128, EXx } },
9745 /* VEX_W_EC_P_2 */
9746 { "vpaddsb", { XM, Vex128, EXx } },
9749 /* VEX_W_ED_P_2 */
9750 { "vpaddsw", { XM, Vex128, EXx } },
9753 /* VEX_W_EE_P_2 */
9754 { "vpmaxsw", { XM, Vex128, EXx } },
9757 /* VEX_W_EF_P_2 */
9758 { "vpxor", { XM, Vex128, EXx } },
9761 /* VEX_W_F0_P_3_M_0 */
9762 { "vlddqu", { XM, M } },
9765 /* VEX_W_F1_P_2 */
9766 { "vpsllw", { XM, Vex128, EXx } },
9769 /* VEX_W_F2_P_2 */
9770 { "vpslld", { XM, Vex128, EXx } },
9773 /* VEX_W_F3_P_2 */
9774 { "vpsllq", { XM, Vex128, EXx } },
9777 /* VEX_W_F4_P_2 */
9778 { "vpmuludq", { XM, Vex128, EXx } },
9781 /* VEX_W_F5_P_2 */
9782 { "vpmaddwd", { XM, Vex128, EXx } },
9785 /* VEX_W_F6_P_2 */
9786 { "vpsadbw", { XM, Vex128, EXx } },
9789 /* VEX_W_F7_P_2 */
9790 { "vmaskmovdqu", { XM, XS } },
9793 /* VEX_W_F8_P_2 */
9794 { "vpsubb", { XM, Vex128, EXx } },
9797 /* VEX_W_F9_P_2 */
9798 { "vpsubw", { XM, Vex128, EXx } },
9801 /* VEX_W_FA_P_2 */
9802 { "vpsubd", { XM, Vex128, EXx } },
9805 /* VEX_W_FB_P_2 */
9806 { "vpsubq", { XM, Vex128, EXx } },
9809 /* VEX_W_FC_P_2 */
9810 { "vpaddb", { XM, Vex128, EXx } },
9813 /* VEX_W_FD_P_2 */
9814 { "vpaddw", { XM, Vex128, EXx } },
9817 /* VEX_W_FE_P_2 */
9818 { "vpaddd", { XM, Vex128, EXx } },
9821 /* VEX_W_3800_P_2 */
9822 { "vpshufb", { XM, Vex128, EXx } },
9825 /* VEX_W_3801_P_2 */
9826 { "vphaddw", { XM, Vex128, EXx } },
9829 /* VEX_W_3802_P_2 */
9830 { "vphaddd", { XM, Vex128, EXx } },
9833 /* VEX_W_3803_P_2 */
9834 { "vphaddsw", { XM, Vex128, EXx } },
9837 /* VEX_W_3804_P_2 */
9838 { "vpmaddubsw", { XM, Vex128, EXx } },
9841 /* VEX_W_3805_P_2 */
9842 { "vphsubw", { XM, Vex128, EXx } },
9845 /* VEX_W_3806_P_2 */
9846 { "vphsubd", { XM, Vex128, EXx } },
9849 /* VEX_W_3807_P_2 */
9850 { "vphsubsw", { XM, Vex128, EXx } },
9853 /* VEX_W_3808_P_2 */
9854 { "vpsignb", { XM, Vex128, EXx } },
9857 /* VEX_W_3809_P_2 */
9858 { "vpsignw", { XM, Vex128, EXx } },
9861 /* VEX_W_380A_P_2 */
9862 { "vpsignd", { XM, Vex128, EXx } },
9865 /* VEX_W_380B_P_2 */
9866 { "vpmulhrsw", { XM, Vex128, EXx } },
9869 /* VEX_W_380C_P_2 */
9870 { "vpermilps", { XM, Vex, EXx } },
9873 /* VEX_W_380D_P_2 */
9874 { "vpermilpd", { XM, Vex, EXx } },
9877 /* VEX_W_380E_P_2 */
9878 { "vtestps", { XM, EXx } },
9881 /* VEX_W_380F_P_2 */
9882 { "vtestpd", { XM, EXx } },
9885 /* VEX_W_3817_P_2 */
9886 { "vptest", { XM, EXx } },
9889 /* VEX_W_3818_P_2_M_0 */
9890 { "vbroadcastss", { XM, Md } },
9893 /* VEX_W_3819_P_2_M_0 */
9894 { "vbroadcastsd", { XM, Mq } },
9897 /* VEX_W_381A_P_2_M_0 */
9898 { "vbroadcastf128", { XM, Mxmm } },
9901 /* VEX_W_381C_P_2 */
9902 { "vpabsb", { XM, EXx } },
9905 /* VEX_W_381D_P_2 */
9906 { "vpabsw", { XM, EXx } },
9909 /* VEX_W_381E_P_2 */
9910 { "vpabsd", { XM, EXx } },
9913 /* VEX_W_3820_P_2 */
9914 { "vpmovsxbw", { XM, EXq } },
9917 /* VEX_W_3821_P_2 */
9918 { "vpmovsxbd", { XM, EXd } },
9921 /* VEX_W_3822_P_2 */
9922 { "vpmovsxbq", { XM, EXw } },
9925 /* VEX_W_3823_P_2 */
9926 { "vpmovsxwd", { XM, EXq } },
9929 /* VEX_W_3824_P_2 */
9930 { "vpmovsxwq", { XM, EXd } },
9933 /* VEX_W_3825_P_2 */
9934 { "vpmovsxdq", { XM, EXq } },
9937 /* VEX_W_3828_P_2 */
9938 { "vpmuldq", { XM, Vex128, EXx } },
9941 /* VEX_W_3829_P_2 */
9942 { "vpcmpeqq", { XM, Vex128, EXx } },
9945 /* VEX_W_382A_P_2_M_0 */
9946 { "vmovntdqa", { XM, Mx } },
9949 /* VEX_W_382B_P_2 */
9950 { "vpackusdw", { XM, Vex128, EXx } },
9953 /* VEX_W_382C_P_2_M_0 */
9954 { "vmaskmovps", { XM, Vex, Mx } },
9957 /* VEX_W_382D_P_2_M_0 */
9958 { "vmaskmovpd", { XM, Vex, Mx } },
9961 /* VEX_W_382E_P_2_M_0 */
9962 { "vmaskmovps", { Mx, Vex, XM } },
9965 /* VEX_W_382F_P_2_M_0 */
9966 { "vmaskmovpd", { Mx, Vex, XM } },
9969 /* VEX_W_3830_P_2 */
9970 { "vpmovzxbw", { XM, EXq } },
9973 /* VEX_W_3831_P_2 */
9974 { "vpmovzxbd", { XM, EXd } },
9977 /* VEX_W_3832_P_2 */
9978 { "vpmovzxbq", { XM, EXw } },
9981 /* VEX_W_3833_P_2 */
9982 { "vpmovzxwd", { XM, EXq } },
9985 /* VEX_W_3834_P_2 */
9986 { "vpmovzxwq", { XM, EXd } },
9989 /* VEX_W_3835_P_2 */
9990 { "vpmovzxdq", { XM, EXq } },
9993 /* VEX_W_3837_P_2 */
9994 { "vpcmpgtq", { XM, Vex128, EXx } },
9997 /* VEX_W_3838_P_2 */
9998 { "vpminsb", { XM, Vex128, EXx } },
10001 /* VEX_W_3839_P_2 */
10002 { "vpminsd", { XM, Vex128, EXx } },
10005 /* VEX_W_383A_P_2 */
10006 { "vpminuw", { XM, Vex128, EXx } },
10009 /* VEX_W_383B_P_2 */
10010 { "vpminud", { XM, Vex128, EXx } },
10013 /* VEX_W_383C_P_2 */
10014 { "vpmaxsb", { XM, Vex128, EXx } },
10017 /* VEX_W_383D_P_2 */
10018 { "vpmaxsd", { XM, Vex128, EXx } },
10021 /* VEX_W_383E_P_2 */
10022 { "vpmaxuw", { XM, Vex128, EXx } },
10025 /* VEX_W_383F_P_2 */
10026 { "vpmaxud", { XM, Vex128, EXx } },
10029 /* VEX_W_3840_P_2 */
10030 { "vpmulld", { XM, Vex128, EXx } },
10033 /* VEX_W_3841_P_2 */
10034 { "vphminposuw", { XM, EXx } },
10037 /* VEX_W_38DB_P_2 */
10038 { "vaesimc", { XM, EXx } },
10041 /* VEX_W_38DC_P_2 */
10042 { "vaesenc", { XM, Vex128, EXx } },
10045 /* VEX_W_38DD_P_2 */
10046 { "vaesenclast", { XM, Vex128, EXx } },
10049 /* VEX_W_38DE_P_2 */
10050 { "vaesdec", { XM, Vex128, EXx } },
10053 /* VEX_W_38DF_P_2 */
10054 { "vaesdeclast", { XM, Vex128, EXx } },
10057 /* VEX_W_3A04_P_2 */
10058 { "vpermilps", { XM, EXx, Ib } },
10061 /* VEX_W_3A05_P_2 */
10062 { "vpermilpd", { XM, EXx, Ib } },
10065 /* VEX_W_3A06_P_2 */
10066 { "vperm2f128", { XM, Vex256, EXx, Ib } },
10069 /* VEX_W_3A08_P_2 */
10070 { "vroundps", { XM, EXx, Ib } },
10073 /* VEX_W_3A09_P_2 */
10074 { "vroundpd", { XM, EXx, Ib } },
10077 /* VEX_W_3A0A_P_2 */
10078 { "vroundss", { XMScalar, VexScalar, EXdScalar, Ib } },
10081 /* VEX_W_3A0B_P_2 */
10082 { "vroundsd", { XMScalar, VexScalar, EXqScalar, Ib } },
10085 /* VEX_W_3A0C_P_2 */
10086 { "vblendps", { XM, Vex, EXx, Ib } },
10089 /* VEX_W_3A0D_P_2 */
10090 { "vblendpd", { XM, Vex, EXx, Ib } },
10093 /* VEX_W_3A0E_P_2 */
10094 { "vpblendw", { XM, Vex128, EXx, Ib } },
10097 /* VEX_W_3A0F_P_2 */
10098 { "vpalignr", { XM, Vex128, EXx, Ib } },
10101 /* VEX_W_3A14_P_2 */
10102 { "vpextrb", { Edqb, XM, Ib } },
10105 /* VEX_W_3A15_P_2 */
10106 { "vpextrw", { Edqw, XM, Ib } },
10109 /* VEX_W_3A18_P_2 */
10110 { "vinsertf128", { XM, Vex256, EXxmm, Ib } },
10113 /* VEX_W_3A19_P_2 */
10114 { "vextractf128", { EXxmm, XM, Ib } },
10117 /* VEX_W_3A20_P_2 */
10118 { "vpinsrb", { XM, Vex128, Edqb, Ib } },
10121 /* VEX_W_3A21_P_2 */
10122 { "vinsertps", { XM, Vex128, EXd, Ib } },
10125 /* VEX_W_3A40_P_2 */
10126 { "vdpps", { XM, Vex, EXx, Ib } },
10129 /* VEX_W_3A41_P_2 */
10130 { "vdppd", { XM, Vex128, EXx, Ib } },
10133 /* VEX_W_3A42_P_2 */
10134 { "vmpsadbw", { XM, Vex128, EXx, Ib } },
10137 /* VEX_W_3A44_P_2 */
10138 { "vpclmulqdq", { XM, Vex128, EXx, PCLMUL } },
10141 /* VEX_W_3A48_P_2 */
10142 { "vpermil2ps", { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW } },
10143 { "vpermil2ps", { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW } },
10146 /* VEX_W_3A49_P_2 */
10147 { "vpermil2pd", { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW } },
10148 { "vpermil2pd", { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW } },
10151 /* VEX_W_3A4A_P_2 */
10152 { "vblendvps", { XM, Vex, EXx, XMVexI4 } },
10155 /* VEX_W_3A4B_P_2 */
10156 { "vblendvpd", { XM, Vex, EXx, XMVexI4 } },
10159 /* VEX_W_3A4C_P_2 */
10160 { "vpblendvb", { XM, Vex128, EXx, XMVexI4 } },
10163 /* VEX_W_3A60_P_2 */
10164 { "vpcmpestrm", { XM, EXx, Ib } },
10167 /* VEX_W_3A61_P_2 */
10168 { "vpcmpestri", { XM, EXx, Ib } },
10171 /* VEX_W_3A62_P_2 */
10172 { "vpcmpistrm", { XM, EXx, Ib } },
10175 /* VEX_W_3A63_P_2 */
10176 { "vpcmpistri", { XM, EXx, Ib } },
10179 /* VEX_W_3ADF_P_2 */
10180 { "vaeskeygenassist", { XM, EXx, Ib } },
10184 static const struct dis386 mod_table[][2] = {
10186 /* MOD_8D */
10187 { "leaS", { Gv, M } },
10190 /* MOD_0F01_REG_0 */
10191 { X86_64_TABLE (X86_64_0F01_REG_0) },
10192 { RM_TABLE (RM_0F01_REG_0) },
10195 /* MOD_0F01_REG_1 */
10196 { X86_64_TABLE (X86_64_0F01_REG_1) },
10197 { RM_TABLE (RM_0F01_REG_1) },
10200 /* MOD_0F01_REG_2 */
10201 { X86_64_TABLE (X86_64_0F01_REG_2) },
10202 { RM_TABLE (RM_0F01_REG_2) },
10205 /* MOD_0F01_REG_3 */
10206 { X86_64_TABLE (X86_64_0F01_REG_3) },
10207 { RM_TABLE (RM_0F01_REG_3) },
10210 /* MOD_0F01_REG_7 */
10211 { "invlpg", { Mb } },
10212 { RM_TABLE (RM_0F01_REG_7) },
10215 /* MOD_0F12_PREFIX_0 */
10216 { "movlps", { XM, EXq } },
10217 { "movhlps", { XM, EXq } },
10220 /* MOD_0F13 */
10221 { "movlpX", { EXq, XM } },
10224 /* MOD_0F16_PREFIX_0 */
10225 { "movhps", { XM, EXq } },
10226 { "movlhps", { XM, EXq } },
10229 /* MOD_0F17 */
10230 { "movhpX", { EXq, XM } },
10233 /* MOD_0F18_REG_0 */
10234 { "prefetchnta", { Mb } },
10237 /* MOD_0F18_REG_1 */
10238 { "prefetcht0", { Mb } },
10241 /* MOD_0F18_REG_2 */
10242 { "prefetcht1", { Mb } },
10245 /* MOD_0F18_REG_3 */
10246 { "prefetcht2", { Mb } },
10249 /* MOD_0F20 */
10250 { Bad_Opcode },
10251 { "movZ", { Rm, Cm } },
10254 /* MOD_0F21 */
10255 { Bad_Opcode },
10256 { "movZ", { Rm, Dm } },
10259 /* MOD_0F22 */
10260 { Bad_Opcode },
10261 { "movZ", { Cm, Rm } },
10264 /* MOD_0F23 */
10265 { Bad_Opcode },
10266 { "movZ", { Dm, Rm } },
10269 /* MOD_0F24 */
10270 { Bad_Opcode },
10271 { "movL", { Rd, Td } },
10274 /* MOD_0F26 */
10275 { Bad_Opcode },
10276 { "movL", { Td, Rd } },
10279 /* MOD_0F2B_PREFIX_0 */
10280 {"movntps", { Mx, XM } },
10283 /* MOD_0F2B_PREFIX_1 */
10284 {"movntss", { Md, XM } },
10287 /* MOD_0F2B_PREFIX_2 */
10288 {"movntpd", { Mx, XM } },
10291 /* MOD_0F2B_PREFIX_3 */
10292 {"movntsd", { Mq, XM } },
10295 /* MOD_0F51 */
10296 { Bad_Opcode },
10297 { "movmskpX", { Gdq, XS } },
10300 /* MOD_0F71_REG_2 */
10301 { Bad_Opcode },
10302 { "psrlw", { MS, Ib } },
10305 /* MOD_0F71_REG_4 */
10306 { Bad_Opcode },
10307 { "psraw", { MS, Ib } },
10310 /* MOD_0F71_REG_6 */
10311 { Bad_Opcode },
10312 { "psllw", { MS, Ib } },
10315 /* MOD_0F72_REG_2 */
10316 { Bad_Opcode },
10317 { "psrld", { MS, Ib } },
10320 /* MOD_0F72_REG_4 */
10321 { Bad_Opcode },
10322 { "psrad", { MS, Ib } },
10325 /* MOD_0F72_REG_6 */
10326 { Bad_Opcode },
10327 { "pslld", { MS, Ib } },
10330 /* MOD_0F73_REG_2 */
10331 { Bad_Opcode },
10332 { "psrlq", { MS, Ib } },
10335 /* MOD_0F73_REG_3 */
10336 { Bad_Opcode },
10337 { PREFIX_TABLE (PREFIX_0F73_REG_3) },
10340 /* MOD_0F73_REG_6 */
10341 { Bad_Opcode },
10342 { "psllq", { MS, Ib } },
10345 /* MOD_0F73_REG_7 */
10346 { Bad_Opcode },
10347 { PREFIX_TABLE (PREFIX_0F73_REG_7) },
10350 /* MOD_0FAE_REG_0 */
10351 { "fxsave", { FXSAVE } },
10354 /* MOD_0FAE_REG_1 */
10355 { "fxrstor", { FXSAVE } },
10358 /* MOD_0FAE_REG_2 */
10359 { "ldmxcsr", { Md } },
10362 /* MOD_0FAE_REG_3 */
10363 { "stmxcsr", { Md } },
10366 /* MOD_0FAE_REG_4 */
10367 { "xsave", { FXSAVE } },
10370 /* MOD_0FAE_REG_5 */
10371 { "xrstor", { FXSAVE } },
10372 { RM_TABLE (RM_0FAE_REG_5) },
10375 /* MOD_0FAE_REG_6 */
10376 { Bad_Opcode },
10377 { RM_TABLE (RM_0FAE_REG_6) },
10380 /* MOD_0FAE_REG_7 */
10381 { "clflush", { Mb } },
10382 { RM_TABLE (RM_0FAE_REG_7) },
10385 /* MOD_0FB2 */
10386 { "lssS", { Gv, Mp } },
10389 /* MOD_0FB4 */
10390 { "lfsS", { Gv, Mp } },
10393 /* MOD_0FB5 */
10394 { "lgsS", { Gv, Mp } },
10397 /* MOD_0FC7_REG_6 */
10398 { PREFIX_TABLE (PREFIX_0FC7_REG_6) },
10401 /* MOD_0FC7_REG_7 */
10402 { "vmptrst", { Mq } },
10405 /* MOD_0FD7 */
10406 { Bad_Opcode },
10407 { "pmovmskb", { Gdq, MS } },
10410 /* MOD_0FE7_PREFIX_2 */
10411 { "movntdq", { Mx, XM } },
10414 /* MOD_0FF0_PREFIX_3 */
10415 { "lddqu", { XM, M } },
10418 /* MOD_0F382A_PREFIX_2 */
10419 { "movntdqa", { XM, Mx } },
10422 /* MOD_62_32BIT */
10423 { "bound{S|}", { Gv, Ma } },
10426 /* MOD_C4_32BIT */
10427 { "lesS", { Gv, Mp } },
10428 { VEX_C4_TABLE (VEX_0F) },
10431 /* MOD_C5_32BIT */
10432 { "ldsS", { Gv, Mp } },
10433 { VEX_C5_TABLE (VEX_0F) },
10436 /* MOD_VEX_12_PREFIX_0 */
10437 { VEX_LEN_TABLE (VEX_LEN_12_P_0_M_0) },
10438 { VEX_LEN_TABLE (VEX_LEN_12_P_0_M_1) },
10441 /* MOD_VEX_13 */
10442 { VEX_LEN_TABLE (VEX_LEN_13_M_0) },
10445 /* MOD_VEX_16_PREFIX_0 */
10446 { VEX_LEN_TABLE (VEX_LEN_16_P_0_M_0) },
10447 { VEX_LEN_TABLE (VEX_LEN_16_P_0_M_1) },
10450 /* MOD_VEX_17 */
10451 { VEX_LEN_TABLE (VEX_LEN_17_M_0) },
10454 /* MOD_VEX_2B */
10455 { VEX_W_TABLE (VEX_W_2B_M_0) },
10458 /* MOD_VEX_50 */
10459 { Bad_Opcode },
10460 { VEX_W_TABLE (VEX_W_50_M_0) },
10463 /* MOD_VEX_71_REG_2 */
10464 { Bad_Opcode },
10465 { PREFIX_TABLE (PREFIX_VEX_71_REG_2) },
10468 /* MOD_VEX_71_REG_4 */
10469 { Bad_Opcode },
10470 { PREFIX_TABLE (PREFIX_VEX_71_REG_4) },
10473 /* MOD_VEX_71_REG_6 */
10474 { Bad_Opcode },
10475 { PREFIX_TABLE (PREFIX_VEX_71_REG_6) },
10478 /* MOD_VEX_72_REG_2 */
10479 { Bad_Opcode },
10480 { PREFIX_TABLE (PREFIX_VEX_72_REG_2) },
10483 /* MOD_VEX_72_REG_4 */
10484 { Bad_Opcode },
10485 { PREFIX_TABLE (PREFIX_VEX_72_REG_4) },
10488 /* MOD_VEX_72_REG_6 */
10489 { Bad_Opcode },
10490 { PREFIX_TABLE (PREFIX_VEX_72_REG_6) },
10493 /* MOD_VEX_73_REG_2 */
10494 { Bad_Opcode },
10495 { PREFIX_TABLE (PREFIX_VEX_73_REG_2) },
10498 /* MOD_VEX_73_REG_3 */
10499 { Bad_Opcode },
10500 { PREFIX_TABLE (PREFIX_VEX_73_REG_3) },
10503 /* MOD_VEX_73_REG_6 */
10504 { Bad_Opcode },
10505 { PREFIX_TABLE (PREFIX_VEX_73_REG_6) },
10508 /* MOD_VEX_73_REG_7 */
10509 { Bad_Opcode },
10510 { PREFIX_TABLE (PREFIX_VEX_73_REG_7) },
10513 /* MOD_VEX_AE_REG_2 */
10514 { VEX_LEN_TABLE (VEX_LEN_AE_R_2_M_0) },
10517 /* MOD_VEX_AE_REG_3 */
10518 { VEX_LEN_TABLE (VEX_LEN_AE_R_3_M_0) },
10521 /* MOD_VEX_D7_PREFIX_2 */
10522 { Bad_Opcode },
10523 { VEX_LEN_TABLE (VEX_LEN_D7_P_2_M_1) },
10526 /* MOD_VEX_E7_PREFIX_2 */
10527 { VEX_W_TABLE (VEX_W_E7_P_2_M_0) },
10530 /* MOD_VEX_F0_PREFIX_3 */
10531 { VEX_W_TABLE (VEX_W_F0_P_3_M_0) },
10534 /* MOD_VEX_3818_PREFIX_2 */
10535 { VEX_W_TABLE (VEX_W_3818_P_2_M_0) },
10538 /* MOD_VEX_3819_PREFIX_2 */
10539 { VEX_LEN_TABLE (VEX_LEN_3819_P_2_M_0) },
10542 /* MOD_VEX_381A_PREFIX_2 */
10543 { VEX_LEN_TABLE (VEX_LEN_381A_P_2_M_0) },
10546 /* MOD_VEX_382A_PREFIX_2 */
10547 { VEX_LEN_TABLE (VEX_LEN_382A_P_2_M_0) },
10550 /* MOD_VEX_382C_PREFIX_2 */
10551 { VEX_W_TABLE (VEX_W_382C_P_2_M_0) },
10554 /* MOD_VEX_382D_PREFIX_2 */
10555 { VEX_W_TABLE (VEX_W_382D_P_2_M_0) },
10558 /* MOD_VEX_382E_PREFIX_2 */
10559 { VEX_W_TABLE (VEX_W_382E_P_2_M_0) },
10562 /* MOD_VEX_382F_PREFIX_2 */
10563 { VEX_W_TABLE (VEX_W_382F_P_2_M_0) },
10567 static const struct dis386 rm_table[][8] = {
10569 /* RM_0F01_REG_0 */
10570 { Bad_Opcode },
10571 { "vmcall", { Skip_MODRM } },
10572 { "vmlaunch", { Skip_MODRM } },
10573 { "vmresume", { Skip_MODRM } },
10574 { "vmxoff", { Skip_MODRM } },
10577 /* RM_0F01_REG_1 */
10578 { "monitor", { { OP_Monitor, 0 } } },
10579 { "mwait", { { OP_Mwait, 0 } } },
10582 /* RM_0F01_REG_2 */
10583 { "xgetbv", { Skip_MODRM } },
10584 { "xsetbv", { Skip_MODRM } },
10587 /* RM_0F01_REG_3 */
10588 { "vmrun", { Skip_MODRM } },
10589 { "vmmcall", { Skip_MODRM } },
10590 { "vmload", { Skip_MODRM } },
10591 { "vmsave", { Skip_MODRM } },
10592 { "stgi", { Skip_MODRM } },
10593 { "clgi", { Skip_MODRM } },
10594 { "skinit", { Skip_MODRM } },
10595 { "invlpga", { Skip_MODRM } },
10598 /* RM_0F01_REG_7 */
10599 { "swapgs", { Skip_MODRM } },
10600 { "rdtscp", { Skip_MODRM } },
10603 /* RM_0FAE_REG_5 */
10604 { "lfence", { Skip_MODRM } },
10607 /* RM_0FAE_REG_6 */
10608 { "mfence", { Skip_MODRM } },
10611 /* RM_0FAE_REG_7 */
10612 { "sfence", { Skip_MODRM } },
10616 #define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
10618 /* We use the high bit to indicate different name for the same
10619 prefix. */
10620 #define ADDR16_PREFIX (0x67 | 0x100)
10621 #define ADDR32_PREFIX (0x67 | 0x200)
10622 #define DATA16_PREFIX (0x66 | 0x100)
10623 #define DATA32_PREFIX (0x66 | 0x200)
10624 #define REP_PREFIX (0xf3 | 0x100)
10626 static int
10627 ckprefix (void)
10629 int newrex, i, length;
10630 rex = 0;
10631 rex_ignored = 0;
10632 prefixes = 0;
10633 used_prefixes = 0;
10634 rex_used = 0;
10635 last_lock_prefix = -1;
10636 last_repz_prefix = -1;
10637 last_repnz_prefix = -1;
10638 last_data_prefix = -1;
10639 last_addr_prefix = -1;
10640 last_rex_prefix = -1;
10641 last_seg_prefix = -1;
10642 for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
10643 all_prefixes[i] = 0;
10644 i = 0;
10645 length = 0;
10646 /* The maximum instruction length is 15bytes. */
10647 while (length < MAX_CODE_LENGTH - 1)
10649 FETCH_DATA (the_info, codep + 1);
10650 newrex = 0;
10651 switch (*codep)
10653 /* REX prefixes family. */
10654 case 0x40:
10655 case 0x41:
10656 case 0x42:
10657 case 0x43:
10658 case 0x44:
10659 case 0x45:
10660 case 0x46:
10661 case 0x47:
10662 case 0x48:
10663 case 0x49:
10664 case 0x4a:
10665 case 0x4b:
10666 case 0x4c:
10667 case 0x4d:
10668 case 0x4e:
10669 case 0x4f:
10670 if (address_mode == mode_64bit)
10671 newrex = *codep;
10672 else
10673 return 1;
10674 last_rex_prefix = i;
10675 break;
10676 case 0xf3:
10677 prefixes |= PREFIX_REPZ;
10678 last_repz_prefix = i;
10679 break;
10680 case 0xf2:
10681 prefixes |= PREFIX_REPNZ;
10682 last_repnz_prefix = i;
10683 break;
10684 case 0xf0:
10685 prefixes |= PREFIX_LOCK;
10686 last_lock_prefix = i;
10687 break;
10688 case 0x2e:
10689 prefixes |= PREFIX_CS;
10690 last_seg_prefix = i;
10691 break;
10692 case 0x36:
10693 prefixes |= PREFIX_SS;
10694 last_seg_prefix = i;
10695 break;
10696 case 0x3e:
10697 prefixes |= PREFIX_DS;
10698 last_seg_prefix = i;
10699 break;
10700 case 0x26:
10701 prefixes |= PREFIX_ES;
10702 last_seg_prefix = i;
10703 break;
10704 case 0x64:
10705 prefixes |= PREFIX_FS;
10706 last_seg_prefix = i;
10707 break;
10708 case 0x65:
10709 prefixes |= PREFIX_GS;
10710 last_seg_prefix = i;
10711 break;
10712 case 0x66:
10713 prefixes |= PREFIX_DATA;
10714 last_data_prefix = i;
10715 break;
10716 case 0x67:
10717 prefixes |= PREFIX_ADDR;
10718 last_addr_prefix = i;
10719 break;
10720 case FWAIT_OPCODE:
10721 /* fwait is really an instruction. If there are prefixes
10722 before the fwait, they belong to the fwait, *not* to the
10723 following instruction. */
10724 if (prefixes || rex)
10726 prefixes |= PREFIX_FWAIT;
10727 codep++;
10728 return 1;
10730 prefixes = PREFIX_FWAIT;
10731 break;
10732 default:
10733 return 1;
10735 /* Rex is ignored when followed by another prefix. */
10736 if (rex)
10738 rex_used = rex;
10739 return 1;
10741 if (*codep != FWAIT_OPCODE)
10742 all_prefixes[i++] = *codep;
10743 rex = newrex;
10744 codep++;
10745 length++;
10747 return 0;
10750 static int
10751 seg_prefix (int pref)
10753 switch (pref)
10755 case 0x2e:
10756 return PREFIX_CS;
10757 case 0x36:
10758 return PREFIX_SS;
10759 case 0x3e:
10760 return PREFIX_DS;
10761 case 0x26:
10762 return PREFIX_ES;
10763 case 0x64:
10764 return PREFIX_FS;
10765 case 0x65:
10766 return PREFIX_GS;
10767 default:
10768 return 0;
10772 /* Return the name of the prefix byte PREF, or NULL if PREF is not a
10773 prefix byte. */
10775 static const char *
10776 prefix_name (int pref, int sizeflag)
10778 static const char *rexes [16] =
10780 "rex", /* 0x40 */
10781 "rex.B", /* 0x41 */
10782 "rex.X", /* 0x42 */
10783 "rex.XB", /* 0x43 */
10784 "rex.R", /* 0x44 */
10785 "rex.RB", /* 0x45 */
10786 "rex.RX", /* 0x46 */
10787 "rex.RXB", /* 0x47 */
10788 "rex.W", /* 0x48 */
10789 "rex.WB", /* 0x49 */
10790 "rex.WX", /* 0x4a */
10791 "rex.WXB", /* 0x4b */
10792 "rex.WR", /* 0x4c */
10793 "rex.WRB", /* 0x4d */
10794 "rex.WRX", /* 0x4e */
10795 "rex.WRXB", /* 0x4f */
10798 switch (pref)
10800 /* REX prefixes family. */
10801 case 0x40:
10802 case 0x41:
10803 case 0x42:
10804 case 0x43:
10805 case 0x44:
10806 case 0x45:
10807 case 0x46:
10808 case 0x47:
10809 case 0x48:
10810 case 0x49:
10811 case 0x4a:
10812 case 0x4b:
10813 case 0x4c:
10814 case 0x4d:
10815 case 0x4e:
10816 case 0x4f:
10817 return rexes [pref - 0x40];
10818 case 0xf3:
10819 return "repz";
10820 case 0xf2:
10821 return "repnz";
10822 case 0xf0:
10823 return "lock";
10824 case 0x2e:
10825 return "cs";
10826 case 0x36:
10827 return "ss";
10828 case 0x3e:
10829 return "ds";
10830 case 0x26:
10831 return "es";
10832 case 0x64:
10833 return "fs";
10834 case 0x65:
10835 return "gs";
10836 case 0x66:
10837 return (sizeflag & DFLAG) ? "data16" : "data32";
10838 case 0x67:
10839 if (address_mode == mode_64bit)
10840 return (sizeflag & AFLAG) ? "addr32" : "addr64";
10841 else
10842 return (sizeflag & AFLAG) ? "addr16" : "addr32";
10843 case FWAIT_OPCODE:
10844 return "fwait";
10845 case ADDR16_PREFIX:
10846 return "addr16";
10847 case ADDR32_PREFIX:
10848 return "addr32";
10849 case DATA16_PREFIX:
10850 return "data16";
10851 case DATA32_PREFIX:
10852 return "data32";
10853 case REP_PREFIX:
10854 return "rep";
10855 default:
10856 return NULL;
10860 static char op_out[MAX_OPERANDS][100];
10861 static int op_ad, op_index[MAX_OPERANDS];
10862 static int two_source_ops;
10863 static bfd_vma op_address[MAX_OPERANDS];
10864 static bfd_vma op_riprel[MAX_OPERANDS];
10865 static bfd_vma start_pc;
10868 * On the 386's of 1988, the maximum length of an instruction is 15 bytes.
10869 * (see topic "Redundant prefixes" in the "Differences from 8086"
10870 * section of the "Virtual 8086 Mode" chapter.)
10871 * 'pc' should be the address of this instruction, it will
10872 * be used to print the target address if this is a relative jump or call
10873 * The function returns the length of this instruction in bytes.
10876 static char intel_syntax;
10877 static char intel_mnemonic = !SYSV386_COMPAT;
10878 static char open_char;
10879 static char close_char;
10880 static char separator_char;
10881 static char scale_char;
10883 /* Here for backwards compatibility. When gdb stops using
10884 print_insn_i386_att and print_insn_i386_intel these functions can
10885 disappear, and print_insn_i386 be merged into print_insn. */
10887 print_insn_i386_att (bfd_vma pc, disassemble_info *info)
10889 intel_syntax = 0;
10891 return print_insn (pc, info);
10895 print_insn_i386_intel (bfd_vma pc, disassemble_info *info)
10897 intel_syntax = 1;
10899 return print_insn (pc, info);
10903 print_insn_i386 (bfd_vma pc, disassemble_info *info)
10905 intel_syntax = -1;
10907 return print_insn (pc, info);
10910 void
10911 print_i386_disassembler_options (FILE *stream)
10913 fprintf (stream, _("\n\
10914 The following i386/x86-64 specific disassembler options are supported for use\n\
10915 with the -M switch (multiple options should be separated by commas):\n"));
10917 fprintf (stream, _(" x86-64 Disassemble in 64bit mode\n"));
10918 fprintf (stream, _(" i386 Disassemble in 32bit mode\n"));
10919 fprintf (stream, _(" i8086 Disassemble in 16bit mode\n"));
10920 fprintf (stream, _(" att Display instruction in AT&T syntax\n"));
10921 fprintf (stream, _(" intel Display instruction in Intel syntax\n"));
10922 fprintf (stream, _(" att-mnemonic\n"
10923 " Display instruction in AT&T mnemonic\n"));
10924 fprintf (stream, _(" intel-mnemonic\n"
10925 " Display instruction in Intel mnemonic\n"));
10926 fprintf (stream, _(" addr64 Assume 64bit address size\n"));
10927 fprintf (stream, _(" addr32 Assume 32bit address size\n"));
10928 fprintf (stream, _(" addr16 Assume 16bit address size\n"));
10929 fprintf (stream, _(" data32 Assume 32bit data size\n"));
10930 fprintf (stream, _(" data16 Assume 16bit data size\n"));
10931 fprintf (stream, _(" suffix Always display instruction suffix in AT&T syntax\n"));
10934 /* Bad opcode. */
10935 static const struct dis386 bad_opcode = { "(bad)", { XX } };
10937 /* Get a pointer to struct dis386 with a valid name. */
10939 static const struct dis386 *
10940 get_valid_dis386 (const struct dis386 *dp, disassemble_info *info)
10942 int vindex, vex_table_index;
10944 if (dp->name != NULL)
10945 return dp;
10947 switch (dp->op[0].bytemode)
10949 case USE_REG_TABLE:
10950 dp = &reg_table[dp->op[1].bytemode][modrm.reg];
10951 break;
10953 case USE_MOD_TABLE:
10954 vindex = modrm.mod == 0x3 ? 1 : 0;
10955 dp = &mod_table[dp->op[1].bytemode][vindex];
10956 break;
10958 case USE_RM_TABLE:
10959 dp = &rm_table[dp->op[1].bytemode][modrm.rm];
10960 break;
10962 case USE_PREFIX_TABLE:
10963 if (need_vex)
10965 /* The prefix in VEX is implicit. */
10966 switch (vex.prefix)
10968 case 0:
10969 vindex = 0;
10970 break;
10971 case REPE_PREFIX_OPCODE:
10972 vindex = 1;
10973 break;
10974 case DATA_PREFIX_OPCODE:
10975 vindex = 2;
10976 break;
10977 case REPNE_PREFIX_OPCODE:
10978 vindex = 3;
10979 break;
10980 default:
10981 abort ();
10982 break;
10985 else
10987 vindex = 0;
10988 used_prefixes |= (prefixes & PREFIX_REPZ);
10989 if (prefixes & PREFIX_REPZ)
10991 vindex = 1;
10992 all_prefixes[last_repz_prefix] = 0;
10994 else
10996 /* We should check PREFIX_REPNZ and PREFIX_REPZ before
10997 PREFIX_DATA. */
10998 used_prefixes |= (prefixes & PREFIX_REPNZ);
10999 if (prefixes & PREFIX_REPNZ)
11001 vindex = 3;
11002 all_prefixes[last_repnz_prefix] = 0;
11004 else
11006 used_prefixes |= (prefixes & PREFIX_DATA);
11007 if (prefixes & PREFIX_DATA)
11009 vindex = 2;
11010 all_prefixes[last_data_prefix] = 0;
11015 dp = &prefix_table[dp->op[1].bytemode][vindex];
11016 break;
11018 case USE_X86_64_TABLE:
11019 vindex = address_mode == mode_64bit ? 1 : 0;
11020 dp = &x86_64_table[dp->op[1].bytemode][vindex];
11021 break;
11023 case USE_3BYTE_TABLE:
11024 FETCH_DATA (info, codep + 2);
11025 vindex = *codep++;
11026 dp = &three_byte_table[dp->op[1].bytemode][vindex];
11027 modrm.mod = (*codep >> 6) & 3;
11028 modrm.reg = (*codep >> 3) & 7;
11029 modrm.rm = *codep & 7;
11030 break;
11032 case USE_VEX_LEN_TABLE:
11033 if (!need_vex)
11034 abort ();
11036 switch (vex.length)
11038 case 128:
11039 vindex = 0;
11040 break;
11041 case 256:
11042 vindex = 1;
11043 break;
11044 default:
11045 abort ();
11046 break;
11049 dp = &vex_len_table[dp->op[1].bytemode][vindex];
11050 break;
11052 case USE_XOP_8F_TABLE:
11053 FETCH_DATA (info, codep + 3);
11054 /* All bits in the REX prefix are ignored. */
11055 rex_ignored = rex;
11056 rex = ~(*codep >> 5) & 0x7;
11058 /* VEX_TABLE_INDEX is the mmmmm part of the XOP byte 1 "RCB.mmmmm". */
11059 switch ((*codep & 0x1f))
11061 default:
11062 BadOp ();
11063 case 0x8:
11064 vex_table_index = XOP_08;
11065 break;
11066 case 0x9:
11067 vex_table_index = XOP_09;
11068 break;
11069 case 0xa:
11070 vex_table_index = XOP_0A;
11071 break;
11073 codep++;
11074 vex.w = *codep & 0x80;
11075 if (vex.w && address_mode == mode_64bit)
11076 rex |= REX_W;
11078 vex.register_specifier = (~(*codep >> 3)) & 0xf;
11079 if (address_mode != mode_64bit
11080 && vex.register_specifier > 0x7)
11081 BadOp ();
11083 vex.length = (*codep & 0x4) ? 256 : 128;
11084 switch ((*codep & 0x3))
11086 case 0:
11087 vex.prefix = 0;
11088 break;
11089 case 1:
11090 vex.prefix = DATA_PREFIX_OPCODE;
11091 break;
11092 case 2:
11093 vex.prefix = REPE_PREFIX_OPCODE;
11094 break;
11095 case 3:
11096 vex.prefix = REPNE_PREFIX_OPCODE;
11097 break;
11099 need_vex = 1;
11100 need_vex_reg = 1;
11101 codep++;
11102 vindex = *codep++;
11103 dp = &xop_table[vex_table_index][vindex];
11105 FETCH_DATA (info, codep + 1);
11106 modrm.mod = (*codep >> 6) & 3;
11107 modrm.reg = (*codep >> 3) & 7;
11108 modrm.rm = *codep & 7;
11109 break;
11111 case USE_VEX_C4_TABLE:
11112 FETCH_DATA (info, codep + 3);
11113 /* All bits in the REX prefix are ignored. */
11114 rex_ignored = rex;
11115 rex = ~(*codep >> 5) & 0x7;
11116 switch ((*codep & 0x1f))
11118 default:
11119 BadOp ();
11120 case 0x1:
11121 vex_table_index = VEX_0F;
11122 break;
11123 case 0x2:
11124 vex_table_index = VEX_0F38;
11125 break;
11126 case 0x3:
11127 vex_table_index = VEX_0F3A;
11128 break;
11130 codep++;
11131 vex.w = *codep & 0x80;
11132 if (vex.w && address_mode == mode_64bit)
11133 rex |= REX_W;
11135 vex.register_specifier = (~(*codep >> 3)) & 0xf;
11136 if (address_mode != mode_64bit
11137 && vex.register_specifier > 0x7)
11138 BadOp ();
11140 vex.length = (*codep & 0x4) ? 256 : 128;
11141 switch ((*codep & 0x3))
11143 case 0:
11144 vex.prefix = 0;
11145 break;
11146 case 1:
11147 vex.prefix = DATA_PREFIX_OPCODE;
11148 break;
11149 case 2:
11150 vex.prefix = REPE_PREFIX_OPCODE;
11151 break;
11152 case 3:
11153 vex.prefix = REPNE_PREFIX_OPCODE;
11154 break;
11156 need_vex = 1;
11157 need_vex_reg = 1;
11158 codep++;
11159 vindex = *codep++;
11160 dp = &vex_table[vex_table_index][vindex];
11161 /* There is no MODRM byte for VEX [82|77]. */
11162 if (vindex != 0x77 && vindex != 0x82)
11164 FETCH_DATA (info, codep + 1);
11165 modrm.mod = (*codep >> 6) & 3;
11166 modrm.reg = (*codep >> 3) & 7;
11167 modrm.rm = *codep & 7;
11169 break;
11171 case USE_VEX_C5_TABLE:
11172 FETCH_DATA (info, codep + 2);
11173 /* All bits in the REX prefix are ignored. */
11174 rex_ignored = rex;
11175 rex = (*codep & 0x80) ? 0 : REX_R;
11177 vex.register_specifier = (~(*codep >> 3)) & 0xf;
11178 if (address_mode != mode_64bit
11179 && vex.register_specifier > 0x7)
11180 BadOp ();
11182 vex.w = 0;
11184 vex.length = (*codep & 0x4) ? 256 : 128;
11185 switch ((*codep & 0x3))
11187 case 0:
11188 vex.prefix = 0;
11189 break;
11190 case 1:
11191 vex.prefix = DATA_PREFIX_OPCODE;
11192 break;
11193 case 2:
11194 vex.prefix = REPE_PREFIX_OPCODE;
11195 break;
11196 case 3:
11197 vex.prefix = REPNE_PREFIX_OPCODE;
11198 break;
11200 need_vex = 1;
11201 need_vex_reg = 1;
11202 codep++;
11203 vindex = *codep++;
11204 dp = &vex_table[dp->op[1].bytemode][vindex];
11205 /* There is no MODRM byte for VEX [82|77]. */
11206 if (vindex != 0x77 && vindex != 0x82)
11208 FETCH_DATA (info, codep + 1);
11209 modrm.mod = (*codep >> 6) & 3;
11210 modrm.reg = (*codep >> 3) & 7;
11211 modrm.rm = *codep & 7;
11213 break;
11215 case USE_VEX_W_TABLE:
11216 if (!need_vex)
11217 abort ();
11219 dp = &vex_w_table[dp->op[1].bytemode][vex.w ? 1 : 0];
11220 break;
11222 case 0:
11223 dp = &bad_opcode;
11224 break;
11226 default:
11227 abort ();
11230 if (dp->name != NULL)
11231 return dp;
11232 else
11233 return get_valid_dis386 (dp, info);
11236 static int
11237 print_insn (bfd_vma pc, disassemble_info *info)
11239 const struct dis386 *dp;
11240 int i;
11241 char *op_txt[MAX_OPERANDS];
11242 int needcomma;
11243 int sizeflag;
11244 const char *p;
11245 struct dis_private priv;
11246 unsigned char op;
11247 int prefix_length;
11248 int default_prefixes;
11250 if (info->mach == bfd_mach_x86_64_intel_syntax
11251 || info->mach == bfd_mach_x86_64
11252 || info->mach == bfd_mach_l1om
11253 || info->mach == bfd_mach_l1om_intel_syntax)
11254 address_mode = mode_64bit;
11255 else
11256 address_mode = mode_32bit;
11258 if (intel_syntax == (char) -1)
11259 intel_syntax = (info->mach == bfd_mach_i386_i386_intel_syntax
11260 || info->mach == bfd_mach_x86_64_intel_syntax
11261 || info->mach == bfd_mach_l1om_intel_syntax);
11263 if (info->mach == bfd_mach_i386_i386
11264 || info->mach == bfd_mach_x86_64
11265 || info->mach == bfd_mach_l1om
11266 || info->mach == bfd_mach_i386_i386_intel_syntax
11267 || info->mach == bfd_mach_x86_64_intel_syntax
11268 || info->mach == bfd_mach_l1om_intel_syntax)
11269 priv.orig_sizeflag = AFLAG | DFLAG;
11270 else if (info->mach == bfd_mach_i386_i8086)
11271 priv.orig_sizeflag = 0;
11272 else
11273 abort ();
11275 for (p = info->disassembler_options; p != NULL; )
11277 if (CONST_STRNEQ (p, "x86-64"))
11279 address_mode = mode_64bit;
11280 priv.orig_sizeflag = AFLAG | DFLAG;
11282 else if (CONST_STRNEQ (p, "i386"))
11284 address_mode = mode_32bit;
11285 priv.orig_sizeflag = AFLAG | DFLAG;
11287 else if (CONST_STRNEQ (p, "i8086"))
11289 address_mode = mode_16bit;
11290 priv.orig_sizeflag = 0;
11292 else if (CONST_STRNEQ (p, "intel"))
11294 intel_syntax = 1;
11295 if (CONST_STRNEQ (p + 5, "-mnemonic"))
11296 intel_mnemonic = 1;
11298 else if (CONST_STRNEQ (p, "att"))
11300 intel_syntax = 0;
11301 if (CONST_STRNEQ (p + 3, "-mnemonic"))
11302 intel_mnemonic = 0;
11304 else if (CONST_STRNEQ (p, "addr"))
11306 if (address_mode == mode_64bit)
11308 if (p[4] == '3' && p[5] == '2')
11309 priv.orig_sizeflag &= ~AFLAG;
11310 else if (p[4] == '6' && p[5] == '4')
11311 priv.orig_sizeflag |= AFLAG;
11313 else
11315 if (p[4] == '1' && p[5] == '6')
11316 priv.orig_sizeflag &= ~AFLAG;
11317 else if (p[4] == '3' && p[5] == '2')
11318 priv.orig_sizeflag |= AFLAG;
11321 else if (CONST_STRNEQ (p, "data"))
11323 if (p[4] == '1' && p[5] == '6')
11324 priv.orig_sizeflag &= ~DFLAG;
11325 else if (p[4] == '3' && p[5] == '2')
11326 priv.orig_sizeflag |= DFLAG;
11328 else if (CONST_STRNEQ (p, "suffix"))
11329 priv.orig_sizeflag |= SUFFIX_ALWAYS;
11331 p = strchr (p, ',');
11332 if (p != NULL)
11333 p++;
11336 if (intel_syntax)
11338 names64 = intel_names64;
11339 names32 = intel_names32;
11340 names16 = intel_names16;
11341 names8 = intel_names8;
11342 names8rex = intel_names8rex;
11343 names_seg = intel_names_seg;
11344 names_mm = intel_names_mm;
11345 names_xmm = intel_names_xmm;
11346 names_ymm = intel_names_ymm;
11347 index64 = intel_index64;
11348 index32 = intel_index32;
11349 index16 = intel_index16;
11350 open_char = '[';
11351 close_char = ']';
11352 separator_char = '+';
11353 scale_char = '*';
11355 else
11357 names64 = att_names64;
11358 names32 = att_names32;
11359 names16 = att_names16;
11360 names8 = att_names8;
11361 names8rex = att_names8rex;
11362 names_seg = att_names_seg;
11363 names_mm = att_names_mm;
11364 names_xmm = att_names_xmm;
11365 names_ymm = att_names_ymm;
11366 index64 = att_index64;
11367 index32 = att_index32;
11368 index16 = att_index16;
11369 open_char = '(';
11370 close_char = ')';
11371 separator_char = ',';
11372 scale_char = ',';
11375 /* The output looks better if we put 7 bytes on a line, since that
11376 puts most long word instructions on a single line. Use 8 bytes
11377 for Intel L1OM. */
11378 if (info->mach == bfd_mach_l1om
11379 || info->mach == bfd_mach_l1om_intel_syntax)
11380 info->bytes_per_line = 8;
11381 else
11382 info->bytes_per_line = 7;
11384 info->private_data = &priv;
11385 priv.max_fetched = priv.the_buffer;
11386 priv.insn_start = pc;
11388 obuf[0] = 0;
11389 for (i = 0; i < MAX_OPERANDS; ++i)
11391 op_out[i][0] = 0;
11392 op_index[i] = -1;
11395 the_info = info;
11396 start_pc = pc;
11397 start_codep = priv.the_buffer;
11398 codep = priv.the_buffer;
11400 if (setjmp (priv.bailout) != 0)
11402 const char *name;
11404 /* Getting here means we tried for data but didn't get it. That
11405 means we have an incomplete instruction of some sort. Just
11406 print the first byte as a prefix or a .byte pseudo-op. */
11407 if (codep > priv.the_buffer)
11409 name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
11410 if (name != NULL)
11411 (*info->fprintf_func) (info->stream, "%s", name);
11412 else
11414 /* Just print the first byte as a .byte instruction. */
11415 (*info->fprintf_func) (info->stream, ".byte 0x%x",
11416 (unsigned int) priv.the_buffer[0]);
11419 return 1;
11422 return -1;
11425 obufp = obuf;
11426 sizeflag = priv.orig_sizeflag;
11428 if (!ckprefix () || rex_used)
11430 /* Too many prefixes or unused REX prefixes. */
11431 for (i = 0;
11432 all_prefixes[i] && i < (int) ARRAY_SIZE (all_prefixes);
11433 i++)
11434 (*info->fprintf_func) (info->stream, "%s",
11435 prefix_name (all_prefixes[i], sizeflag));
11436 return 1;
11439 insn_codep = codep;
11441 FETCH_DATA (info, codep + 1);
11442 two_source_ops = (*codep == 0x62) || (*codep == 0xc8);
11444 if (((prefixes & PREFIX_FWAIT)
11445 && ((*codep < 0xd8) || (*codep > 0xdf))))
11447 (*info->fprintf_func) (info->stream, "fwait");
11448 return 1;
11451 op = 0;
11453 if (*codep == 0x0f)
11455 unsigned char threebyte;
11456 FETCH_DATA (info, codep + 2);
11457 threebyte = *++codep;
11458 dp = &dis386_twobyte[threebyte];
11459 need_modrm = twobyte_has_modrm[*codep];
11460 codep++;
11462 else
11464 dp = &dis386[*codep];
11465 need_modrm = onebyte_has_modrm[*codep];
11466 codep++;
11469 if ((prefixes & PREFIX_REPZ))
11470 used_prefixes |= PREFIX_REPZ;
11471 if ((prefixes & PREFIX_REPNZ))
11472 used_prefixes |= PREFIX_REPNZ;
11473 if ((prefixes & PREFIX_LOCK))
11474 used_prefixes |= PREFIX_LOCK;
11476 default_prefixes = 0;
11477 if (prefixes & PREFIX_ADDR)
11479 sizeflag ^= AFLAG;
11480 if (dp->op[2].bytemode != loop_jcxz_mode || intel_syntax)
11482 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
11483 all_prefixes[last_addr_prefix] = ADDR32_PREFIX;
11484 else
11485 all_prefixes[last_addr_prefix] = ADDR16_PREFIX;
11486 default_prefixes |= PREFIX_ADDR;
11490 if ((prefixes & PREFIX_DATA))
11492 sizeflag ^= DFLAG;
11493 if (dp->op[2].bytemode == cond_jump_mode
11494 && dp->op[0].bytemode == v_mode
11495 && !intel_syntax)
11497 if (sizeflag & DFLAG)
11498 all_prefixes[last_data_prefix] = DATA32_PREFIX;
11499 else
11500 all_prefixes[last_data_prefix] = DATA16_PREFIX;
11501 default_prefixes |= PREFIX_DATA;
11503 else if (rex & REX_W)
11505 /* REX_W will override PREFIX_DATA. */
11506 default_prefixes |= PREFIX_DATA;
11510 if (need_modrm)
11512 FETCH_DATA (info, codep + 1);
11513 modrm.mod = (*codep >> 6) & 3;
11514 modrm.reg = (*codep >> 3) & 7;
11515 modrm.rm = *codep & 7;
11518 need_vex = 0;
11519 need_vex_reg = 0;
11520 vex_w_done = 0;
11522 if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE)
11524 dofloat (sizeflag);
11526 else
11528 dp = get_valid_dis386 (dp, info);
11529 if (dp != NULL && putop (dp->name, sizeflag) == 0)
11531 for (i = 0; i < MAX_OPERANDS; ++i)
11533 obufp = op_out[i];
11534 op_ad = MAX_OPERANDS - 1 - i;
11535 if (dp->op[i].rtn)
11536 (*dp->op[i].rtn) (dp->op[i].bytemode, sizeflag);
11541 /* See if any prefixes were not used. If so, print the first one
11542 separately. If we don't do this, we'll wind up printing an
11543 instruction stream which does not precisely correspond to the
11544 bytes we are disassembling. */
11545 if ((prefixes & ~(used_prefixes | default_prefixes)) != 0)
11547 for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
11548 if (all_prefixes[i])
11550 const char *name;
11551 name = prefix_name (all_prefixes[i], priv.orig_sizeflag);
11552 if (name == NULL)
11553 name = INTERNAL_DISASSEMBLER_ERROR;
11554 (*info->fprintf_func) (info->stream, "%s", name);
11555 return 1;
11559 /* Check if the REX prefix is used. */
11560 if (rex_ignored == 0 && (rex ^ rex_used) == 0)
11561 all_prefixes[last_rex_prefix] = 0;
11563 /* Check if the SEG prefix is used. */
11564 if ((prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS | PREFIX_ES
11565 | PREFIX_FS | PREFIX_GS)) != 0
11566 && (used_prefixes
11567 & seg_prefix (all_prefixes[last_seg_prefix])) != 0)
11568 all_prefixes[last_seg_prefix] = 0;
11570 /* Check if the ADDR prefix is used. */
11571 if ((prefixes & PREFIX_ADDR) != 0
11572 && (used_prefixes & PREFIX_ADDR) != 0)
11573 all_prefixes[last_addr_prefix] = 0;
11575 /* Check if the DATA prefix is used. */
11576 if ((prefixes & PREFIX_DATA) != 0
11577 && (used_prefixes & PREFIX_DATA) != 0)
11578 all_prefixes[last_data_prefix] = 0;
11580 prefix_length = 0;
11581 for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
11582 if (all_prefixes[i])
11584 const char *name;
11585 name = prefix_name (all_prefixes[i], sizeflag);
11586 if (name == NULL)
11587 abort ();
11588 prefix_length += strlen (name) + 1;
11589 (*info->fprintf_func) (info->stream, "%s ", name);
11592 /* Check maximum code length. */
11593 if ((codep - start_codep) > MAX_CODE_LENGTH)
11595 (*info->fprintf_func) (info->stream, "(bad)");
11596 return MAX_CODE_LENGTH;
11599 obufp = mnemonicendp;
11600 for (i = strlen (obuf) + prefix_length; i < 6; i++)
11601 oappend (" ");
11602 oappend (" ");
11603 (*info->fprintf_func) (info->stream, "%s", obuf);
11605 /* The enter and bound instructions are printed with operands in the same
11606 order as the intel book; everything else is printed in reverse order. */
11607 if (intel_syntax || two_source_ops)
11609 bfd_vma riprel;
11611 for (i = 0; i < MAX_OPERANDS; ++i)
11612 op_txt[i] = op_out[i];
11614 for (i = 0; i < (MAX_OPERANDS >> 1); ++i)
11616 op_ad = op_index[i];
11617 op_index[i] = op_index[MAX_OPERANDS - 1 - i];
11618 op_index[MAX_OPERANDS - 1 - i] = op_ad;
11619 riprel = op_riprel[i];
11620 op_riprel[i] = op_riprel [MAX_OPERANDS - 1 - i];
11621 op_riprel[MAX_OPERANDS - 1 - i] = riprel;
11624 else
11626 for (i = 0; i < MAX_OPERANDS; ++i)
11627 op_txt[MAX_OPERANDS - 1 - i] = op_out[i];
11630 needcomma = 0;
11631 for (i = 0; i < MAX_OPERANDS; ++i)
11632 if (*op_txt[i])
11634 if (needcomma)
11635 (*info->fprintf_func) (info->stream, ",");
11636 if (op_index[i] != -1 && !op_riprel[i])
11637 (*info->print_address_func) ((bfd_vma) op_address[op_index[i]], info);
11638 else
11639 (*info->fprintf_func) (info->stream, "%s", op_txt[i]);
11640 needcomma = 1;
11643 for (i = 0; i < MAX_OPERANDS; i++)
11644 if (op_index[i] != -1 && op_riprel[i])
11646 (*info->fprintf_func) (info->stream, " # ");
11647 (*info->print_address_func) ((bfd_vma) (start_pc + codep - start_codep
11648 + op_address[op_index[i]]), info);
11649 break;
11651 return codep - priv.the_buffer;
11654 static const char *float_mem[] = {
11655 /* d8 */
11656 "fadd{s|}",
11657 "fmul{s|}",
11658 "fcom{s|}",
11659 "fcomp{s|}",
11660 "fsub{s|}",
11661 "fsubr{s|}",
11662 "fdiv{s|}",
11663 "fdivr{s|}",
11664 /* d9 */
11665 "fld{s|}",
11666 "(bad)",
11667 "fst{s|}",
11668 "fstp{s|}",
11669 "fldenvIC",
11670 "fldcw",
11671 "fNstenvIC",
11672 "fNstcw",
11673 /* da */
11674 "fiadd{l|}",
11675 "fimul{l|}",
11676 "ficom{l|}",
11677 "ficomp{l|}",
11678 "fisub{l|}",
11679 "fisubr{l|}",
11680 "fidiv{l|}",
11681 "fidivr{l|}",
11682 /* db */
11683 "fild{l|}",
11684 "fisttp{l|}",
11685 "fist{l|}",
11686 "fistp{l|}",
11687 "(bad)",
11688 "fld{t||t|}",
11689 "(bad)",
11690 "fstp{t||t|}",
11691 /* dc */
11692 "fadd{l|}",
11693 "fmul{l|}",
11694 "fcom{l|}",
11695 "fcomp{l|}",
11696 "fsub{l|}",
11697 "fsubr{l|}",
11698 "fdiv{l|}",
11699 "fdivr{l|}",
11700 /* dd */
11701 "fld{l|}",
11702 "fisttp{ll|}",
11703 "fst{l||}",
11704 "fstp{l|}",
11705 "frstorIC",
11706 "(bad)",
11707 "fNsaveIC",
11708 "fNstsw",
11709 /* de */
11710 "fiadd",
11711 "fimul",
11712 "ficom",
11713 "ficomp",
11714 "fisub",
11715 "fisubr",
11716 "fidiv",
11717 "fidivr",
11718 /* df */
11719 "fild",
11720 "fisttp",
11721 "fist",
11722 "fistp",
11723 "fbld",
11724 "fild{ll|}",
11725 "fbstp",
11726 "fistp{ll|}",
11729 static const unsigned char float_mem_mode[] = {
11730 /* d8 */
11731 d_mode,
11732 d_mode,
11733 d_mode,
11734 d_mode,
11735 d_mode,
11736 d_mode,
11737 d_mode,
11738 d_mode,
11739 /* d9 */
11740 d_mode,
11742 d_mode,
11743 d_mode,
11745 w_mode,
11747 w_mode,
11748 /* da */
11749 d_mode,
11750 d_mode,
11751 d_mode,
11752 d_mode,
11753 d_mode,
11754 d_mode,
11755 d_mode,
11756 d_mode,
11757 /* db */
11758 d_mode,
11759 d_mode,
11760 d_mode,
11761 d_mode,
11763 t_mode,
11765 t_mode,
11766 /* dc */
11767 q_mode,
11768 q_mode,
11769 q_mode,
11770 q_mode,
11771 q_mode,
11772 q_mode,
11773 q_mode,
11774 q_mode,
11775 /* dd */
11776 q_mode,
11777 q_mode,
11778 q_mode,
11779 q_mode,
11783 w_mode,
11784 /* de */
11785 w_mode,
11786 w_mode,
11787 w_mode,
11788 w_mode,
11789 w_mode,
11790 w_mode,
11791 w_mode,
11792 w_mode,
11793 /* df */
11794 w_mode,
11795 w_mode,
11796 w_mode,
11797 w_mode,
11798 t_mode,
11799 q_mode,
11800 t_mode,
11801 q_mode
11804 #define ST { OP_ST, 0 }
11805 #define STi { OP_STi, 0 }
11807 #define FGRPd9_2 NULL, { { NULL, 0 } }
11808 #define FGRPd9_4 NULL, { { NULL, 1 } }
11809 #define FGRPd9_5 NULL, { { NULL, 2 } }
11810 #define FGRPd9_6 NULL, { { NULL, 3 } }
11811 #define FGRPd9_7 NULL, { { NULL, 4 } }
11812 #define FGRPda_5 NULL, { { NULL, 5 } }
11813 #define FGRPdb_4 NULL, { { NULL, 6 } }
11814 #define FGRPde_3 NULL, { { NULL, 7 } }
11815 #define FGRPdf_4 NULL, { { NULL, 8 } }
11817 static const struct dis386 float_reg[][8] = {
11818 /* d8 */
11820 { "fadd", { ST, STi } },
11821 { "fmul", { ST, STi } },
11822 { "fcom", { STi } },
11823 { "fcomp", { STi } },
11824 { "fsub", { ST, STi } },
11825 { "fsubr", { ST, STi } },
11826 { "fdiv", { ST, STi } },
11827 { "fdivr", { ST, STi } },
11829 /* d9 */
11831 { "fld", { STi } },
11832 { "fxch", { STi } },
11833 { FGRPd9_2 },
11834 { Bad_Opcode },
11835 { FGRPd9_4 },
11836 { FGRPd9_5 },
11837 { FGRPd9_6 },
11838 { FGRPd9_7 },
11840 /* da */
11842 { "fcmovb", { ST, STi } },
11843 { "fcmove", { ST, STi } },
11844 { "fcmovbe",{ ST, STi } },
11845 { "fcmovu", { ST, STi } },
11846 { Bad_Opcode },
11847 { FGRPda_5 },
11848 { Bad_Opcode },
11849 { Bad_Opcode },
11851 /* db */
11853 { "fcmovnb",{ ST, STi } },
11854 { "fcmovne",{ ST, STi } },
11855 { "fcmovnbe",{ ST, STi } },
11856 { "fcmovnu",{ ST, STi } },
11857 { FGRPdb_4 },
11858 { "fucomi", { ST, STi } },
11859 { "fcomi", { ST, STi } },
11860 { Bad_Opcode },
11862 /* dc */
11864 { "fadd", { STi, ST } },
11865 { "fmul", { STi, ST } },
11866 { Bad_Opcode },
11867 { Bad_Opcode },
11868 { "fsub!M", { STi, ST } },
11869 { "fsubM", { STi, ST } },
11870 { "fdiv!M", { STi, ST } },
11871 { "fdivM", { STi, ST } },
11873 /* dd */
11875 { "ffree", { STi } },
11876 { Bad_Opcode },
11877 { "fst", { STi } },
11878 { "fstp", { STi } },
11879 { "fucom", { STi } },
11880 { "fucomp", { STi } },
11881 { Bad_Opcode },
11882 { Bad_Opcode },
11884 /* de */
11886 { "faddp", { STi, ST } },
11887 { "fmulp", { STi, ST } },
11888 { Bad_Opcode },
11889 { FGRPde_3 },
11890 { "fsub!Mp", { STi, ST } },
11891 { "fsubMp", { STi, ST } },
11892 { "fdiv!Mp", { STi, ST } },
11893 { "fdivMp", { STi, ST } },
11895 /* df */
11897 { "ffreep", { STi } },
11898 { Bad_Opcode },
11899 { Bad_Opcode },
11900 { Bad_Opcode },
11901 { FGRPdf_4 },
11902 { "fucomip", { ST, STi } },
11903 { "fcomip", { ST, STi } },
11904 { Bad_Opcode },
11908 static char *fgrps[][8] = {
11909 /* d9_2 0 */
11911 "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
11914 /* d9_4 1 */
11916 "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
11919 /* d9_5 2 */
11921 "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
11924 /* d9_6 3 */
11926 "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
11929 /* d9_7 4 */
11931 "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
11934 /* da_5 5 */
11936 "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
11939 /* db_4 6 */
11941 "fNeni(8087 only)","fNdisi(8087 only)","fNclex","fNinit",
11942 "fNsetpm(287 only)","frstpm(287 only)","(bad)","(bad)",
11945 /* de_3 7 */
11947 "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
11950 /* df_4 8 */
11952 "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
11956 static void
11957 swap_operand (void)
11959 mnemonicendp[0] = '.';
11960 mnemonicendp[1] = 's';
11961 mnemonicendp += 2;
11964 static void
11965 OP_Skip_MODRM (int bytemode ATTRIBUTE_UNUSED,
11966 int sizeflag ATTRIBUTE_UNUSED)
11968 /* Skip mod/rm byte. */
11969 MODRM_CHECK;
11970 codep++;
11973 static void
11974 dofloat (int sizeflag)
11976 const struct dis386 *dp;
11977 unsigned char floatop;
11979 floatop = codep[-1];
11981 if (modrm.mod != 3)
11983 int fp_indx = (floatop - 0xd8) * 8 + modrm.reg;
11985 putop (float_mem[fp_indx], sizeflag);
11986 obufp = op_out[0];
11987 op_ad = 2;
11988 OP_E (float_mem_mode[fp_indx], sizeflag);
11989 return;
11991 /* Skip mod/rm byte. */
11992 MODRM_CHECK;
11993 codep++;
11995 dp = &float_reg[floatop - 0xd8][modrm.reg];
11996 if (dp->name == NULL)
11998 putop (fgrps[dp->op[0].bytemode][modrm.rm], sizeflag);
12000 /* Instruction fnstsw is only one with strange arg. */
12001 if (floatop == 0xdf && codep[-1] == 0xe0)
12002 strcpy (op_out[0], names16[0]);
12004 else
12006 putop (dp->name, sizeflag);
12008 obufp = op_out[0];
12009 op_ad = 2;
12010 if (dp->op[0].rtn)
12011 (*dp->op[0].rtn) (dp->op[0].bytemode, sizeflag);
12013 obufp = op_out[1];
12014 op_ad = 1;
12015 if (dp->op[1].rtn)
12016 (*dp->op[1].rtn) (dp->op[1].bytemode, sizeflag);
12020 static void
12021 OP_ST (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12023 oappend ("%st" + intel_syntax);
12026 static void
12027 OP_STi (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12029 sprintf (scratchbuf, "%%st(%d)", modrm.rm);
12030 oappend (scratchbuf + intel_syntax);
12033 /* Capital letters in template are macros. */
12034 static int
12035 putop (const char *in_template, int sizeflag)
12037 const char *p;
12038 int alt = 0;
12039 int cond = 1;
12040 unsigned int l = 0, len = 1;
12041 char last[4];
12043 #define SAVE_LAST(c) \
12044 if (l < len && l < sizeof (last)) \
12045 last[l++] = c; \
12046 else \
12047 abort ();
12049 for (p = in_template; *p; p++)
12051 switch (*p)
12053 default:
12054 *obufp++ = *p;
12055 break;
12056 case '%':
12057 len++;
12058 break;
12059 case '!':
12060 cond = 0;
12061 break;
12062 case '{':
12063 alt = 0;
12064 if (intel_syntax)
12066 while (*++p != '|')
12067 if (*p == '}' || *p == '\0')
12068 abort ();
12070 /* Fall through. */
12071 case 'I':
12072 alt = 1;
12073 continue;
12074 case '|':
12075 while (*++p != '}')
12077 if (*p == '\0')
12078 abort ();
12080 break;
12081 case '}':
12082 break;
12083 case 'A':
12084 if (intel_syntax)
12085 break;
12086 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
12087 *obufp++ = 'b';
12088 break;
12089 case 'B':
12090 if (l == 0 && len == 1)
12092 case_B:
12093 if (intel_syntax)
12094 break;
12095 if (sizeflag & SUFFIX_ALWAYS)
12096 *obufp++ = 'b';
12098 else
12100 if (l != 1
12101 || len != 2
12102 || last[0] != 'L')
12104 SAVE_LAST (*p);
12105 break;
12108 if (address_mode == mode_64bit
12109 && !(prefixes & PREFIX_ADDR))
12111 *obufp++ = 'a';
12112 *obufp++ = 'b';
12113 *obufp++ = 's';
12116 goto case_B;
12118 break;
12119 case 'C':
12120 if (intel_syntax && !alt)
12121 break;
12122 if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
12124 if (sizeflag & DFLAG)
12125 *obufp++ = intel_syntax ? 'd' : 'l';
12126 else
12127 *obufp++ = intel_syntax ? 'w' : 's';
12128 used_prefixes |= (prefixes & PREFIX_DATA);
12130 break;
12131 case 'D':
12132 if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
12133 break;
12134 USED_REX (REX_W);
12135 if (modrm.mod == 3)
12137 if (rex & REX_W)
12138 *obufp++ = 'q';
12139 else
12141 if (sizeflag & DFLAG)
12142 *obufp++ = intel_syntax ? 'd' : 'l';
12143 else
12144 *obufp++ = 'w';
12145 used_prefixes |= (prefixes & PREFIX_DATA);
12148 else
12149 *obufp++ = 'w';
12150 break;
12151 case 'E': /* For jcxz/jecxz */
12152 if (address_mode == mode_64bit)
12154 if (sizeflag & AFLAG)
12155 *obufp++ = 'r';
12156 else
12157 *obufp++ = 'e';
12159 else
12160 if (sizeflag & AFLAG)
12161 *obufp++ = 'e';
12162 used_prefixes |= (prefixes & PREFIX_ADDR);
12163 break;
12164 case 'F':
12165 if (intel_syntax)
12166 break;
12167 if ((prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS))
12169 if (sizeflag & AFLAG)
12170 *obufp++ = address_mode == mode_64bit ? 'q' : 'l';
12171 else
12172 *obufp++ = address_mode == mode_64bit ? 'l' : 'w';
12173 used_prefixes |= (prefixes & PREFIX_ADDR);
12175 break;
12176 case 'G':
12177 if (intel_syntax || (obufp[-1] != 's' && !(sizeflag & SUFFIX_ALWAYS)))
12178 break;
12179 if ((rex & REX_W) || (sizeflag & DFLAG))
12180 *obufp++ = 'l';
12181 else
12182 *obufp++ = 'w';
12183 if (!(rex & REX_W))
12184 used_prefixes |= (prefixes & PREFIX_DATA);
12185 break;
12186 case 'H':
12187 if (intel_syntax)
12188 break;
12189 if ((prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS
12190 || (prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS)
12192 used_prefixes |= prefixes & (PREFIX_CS | PREFIX_DS);
12193 *obufp++ = ',';
12194 *obufp++ = 'p';
12195 if (prefixes & PREFIX_DS)
12196 *obufp++ = 't';
12197 else
12198 *obufp++ = 'n';
12200 break;
12201 case 'J':
12202 if (intel_syntax)
12203 break;
12204 *obufp++ = 'l';
12205 break;
12206 case 'K':
12207 USED_REX (REX_W);
12208 if (rex & REX_W)
12209 *obufp++ = 'q';
12210 else
12211 *obufp++ = 'd';
12212 break;
12213 case 'Z':
12214 if (intel_syntax)
12215 break;
12216 if (address_mode == mode_64bit && (sizeflag & SUFFIX_ALWAYS))
12218 *obufp++ = 'q';
12219 break;
12221 /* Fall through. */
12222 goto case_L;
12223 case 'L':
12224 if (l != 0 || len != 1)
12226 SAVE_LAST (*p);
12227 break;
12229 case_L:
12230 if (intel_syntax)
12231 break;
12232 if (sizeflag & SUFFIX_ALWAYS)
12233 *obufp++ = 'l';
12234 break;
12235 case 'M':
12236 if (intel_mnemonic != cond)
12237 *obufp++ = 'r';
12238 break;
12239 case 'N':
12240 if ((prefixes & PREFIX_FWAIT) == 0)
12241 *obufp++ = 'n';
12242 else
12243 used_prefixes |= PREFIX_FWAIT;
12244 break;
12245 case 'O':
12246 USED_REX (REX_W);
12247 if (rex & REX_W)
12248 *obufp++ = 'o';
12249 else if (intel_syntax && (sizeflag & DFLAG))
12250 *obufp++ = 'q';
12251 else
12252 *obufp++ = 'd';
12253 if (!(rex & REX_W))
12254 used_prefixes |= (prefixes & PREFIX_DATA);
12255 break;
12256 case 'T':
12257 if (intel_syntax)
12258 break;
12259 if (address_mode == mode_64bit && (sizeflag & DFLAG))
12261 *obufp++ = 'q';
12262 break;
12264 /* Fall through. */
12265 case 'P':
12266 if (intel_syntax)
12267 break;
12268 if ((prefixes & PREFIX_DATA)
12269 || (rex & REX_W)
12270 || (sizeflag & SUFFIX_ALWAYS))
12272 USED_REX (REX_W);
12273 if (rex & REX_W)
12274 *obufp++ = 'q';
12275 else
12277 if (sizeflag & DFLAG)
12278 *obufp++ = 'l';
12279 else
12280 *obufp++ = 'w';
12281 used_prefixes |= (prefixes & PREFIX_DATA);
12284 break;
12285 case 'U':
12286 if (intel_syntax)
12287 break;
12288 if (address_mode == mode_64bit && (sizeflag & DFLAG))
12290 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
12291 *obufp++ = 'q';
12292 break;
12294 /* Fall through. */
12295 goto case_Q;
12296 case 'Q':
12297 if (l == 0 && len == 1)
12299 case_Q:
12300 if (intel_syntax && !alt)
12301 break;
12302 USED_REX (REX_W);
12303 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
12305 if (rex & REX_W)
12306 *obufp++ = 'q';
12307 else
12309 if (sizeflag & DFLAG)
12310 *obufp++ = intel_syntax ? 'd' : 'l';
12311 else
12312 *obufp++ = 'w';
12313 used_prefixes |= (prefixes & PREFIX_DATA);
12317 else
12319 if (l != 1 || len != 2 || last[0] != 'L')
12321 SAVE_LAST (*p);
12322 break;
12324 if (intel_syntax
12325 || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
12326 break;
12327 if ((rex & REX_W))
12329 USED_REX (REX_W);
12330 *obufp++ = 'q';
12332 else
12333 *obufp++ = 'l';
12335 break;
12336 case 'R':
12337 USED_REX (REX_W);
12338 if (rex & REX_W)
12339 *obufp++ = 'q';
12340 else if (sizeflag & DFLAG)
12342 if (intel_syntax)
12343 *obufp++ = 'd';
12344 else
12345 *obufp++ = 'l';
12347 else
12348 *obufp++ = 'w';
12349 if (intel_syntax && !p[1]
12350 && ((rex & REX_W) || (sizeflag & DFLAG)))
12351 *obufp++ = 'e';
12352 if (!(rex & REX_W))
12353 used_prefixes |= (prefixes & PREFIX_DATA);
12354 break;
12355 case 'V':
12356 if (l == 0 && len == 1)
12358 if (intel_syntax)
12359 break;
12360 if (address_mode == mode_64bit && (sizeflag & DFLAG))
12362 if (sizeflag & SUFFIX_ALWAYS)
12363 *obufp++ = 'q';
12364 break;
12367 else
12369 if (l != 1
12370 || len != 2
12371 || last[0] != 'L')
12373 SAVE_LAST (*p);
12374 break;
12377 if (rex & REX_W)
12379 *obufp++ = 'a';
12380 *obufp++ = 'b';
12381 *obufp++ = 's';
12384 /* Fall through. */
12385 goto case_S;
12386 case 'S':
12387 if (l == 0 && len == 1)
12389 case_S:
12390 if (intel_syntax)
12391 break;
12392 if (sizeflag & SUFFIX_ALWAYS)
12394 if (rex & REX_W)
12395 *obufp++ = 'q';
12396 else
12398 if (sizeflag & DFLAG)
12399 *obufp++ = 'l';
12400 else
12401 *obufp++ = 'w';
12402 used_prefixes |= (prefixes & PREFIX_DATA);
12406 else
12408 if (l != 1
12409 || len != 2
12410 || last[0] != 'L')
12412 SAVE_LAST (*p);
12413 break;
12416 if (address_mode == mode_64bit
12417 && !(prefixes & PREFIX_ADDR))
12419 *obufp++ = 'a';
12420 *obufp++ = 'b';
12421 *obufp++ = 's';
12424 goto case_S;
12426 break;
12427 case 'X':
12428 if (l != 0 || len != 1)
12430 SAVE_LAST (*p);
12431 break;
12433 if (need_vex && vex.prefix)
12435 if (vex.prefix == DATA_PREFIX_OPCODE)
12436 *obufp++ = 'd';
12437 else
12438 *obufp++ = 's';
12440 else
12442 if (prefixes & PREFIX_DATA)
12443 *obufp++ = 'd';
12444 else
12445 *obufp++ = 's';
12446 used_prefixes |= (prefixes & PREFIX_DATA);
12448 break;
12449 case 'Y':
12450 if (l == 0 && len == 1)
12452 if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
12453 break;
12454 if (rex & REX_W)
12456 USED_REX (REX_W);
12457 *obufp++ = 'q';
12459 break;
12461 else
12463 if (l != 1 || len != 2 || last[0] != 'X')
12465 SAVE_LAST (*p);
12466 break;
12468 if (!need_vex)
12469 abort ();
12470 if (intel_syntax
12471 || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
12472 break;
12473 switch (vex.length)
12475 case 128:
12476 *obufp++ = 'x';
12477 break;
12478 case 256:
12479 *obufp++ = 'y';
12480 break;
12481 default:
12482 abort ();
12485 break;
12486 case 'W':
12487 if (l == 0 && len == 1)
12489 /* operand size flag for cwtl, cbtw */
12490 USED_REX (REX_W);
12491 if (rex & REX_W)
12493 if (intel_syntax)
12494 *obufp++ = 'd';
12495 else
12496 *obufp++ = 'l';
12498 else if (sizeflag & DFLAG)
12499 *obufp++ = 'w';
12500 else
12501 *obufp++ = 'b';
12502 if (!(rex & REX_W))
12503 used_prefixes |= (prefixes & PREFIX_DATA);
12505 else
12507 if (l != 1 || len != 2 || last[0] != 'X')
12509 SAVE_LAST (*p);
12510 break;
12512 if (!need_vex)
12513 abort ();
12514 *obufp++ = vex.w ? 'd': 's';
12516 break;
12518 alt = 0;
12520 *obufp = 0;
12521 mnemonicendp = obufp;
12522 return 0;
12525 static void
12526 oappend (const char *s)
12528 obufp = stpcpy (obufp, s);
12531 static void
12532 append_seg (void)
12534 if (prefixes & PREFIX_CS)
12536 used_prefixes |= PREFIX_CS;
12537 oappend ("%cs:" + intel_syntax);
12539 if (prefixes & PREFIX_DS)
12541 used_prefixes |= PREFIX_DS;
12542 oappend ("%ds:" + intel_syntax);
12544 if (prefixes & PREFIX_SS)
12546 used_prefixes |= PREFIX_SS;
12547 oappend ("%ss:" + intel_syntax);
12549 if (prefixes & PREFIX_ES)
12551 used_prefixes |= PREFIX_ES;
12552 oappend ("%es:" + intel_syntax);
12554 if (prefixes & PREFIX_FS)
12556 used_prefixes |= PREFIX_FS;
12557 oappend ("%fs:" + intel_syntax);
12559 if (prefixes & PREFIX_GS)
12561 used_prefixes |= PREFIX_GS;
12562 oappend ("%gs:" + intel_syntax);
12566 static void
12567 OP_indirE (int bytemode, int sizeflag)
12569 if (!intel_syntax)
12570 oappend ("*");
12571 OP_E (bytemode, sizeflag);
12574 static void
12575 print_operand_value (char *buf, int hex, bfd_vma disp)
12577 if (address_mode == mode_64bit)
12579 if (hex)
12581 char tmp[30];
12582 int i;
12583 buf[0] = '0';
12584 buf[1] = 'x';
12585 sprintf_vma (tmp, disp);
12586 for (i = 0; tmp[i] == '0' && tmp[i + 1]; i++);
12587 strcpy (buf + 2, tmp + i);
12589 else
12591 bfd_signed_vma v = disp;
12592 char tmp[30];
12593 int i;
12594 if (v < 0)
12596 *(buf++) = '-';
12597 v = -disp;
12598 /* Check for possible overflow on 0x8000000000000000. */
12599 if (v < 0)
12601 strcpy (buf, "9223372036854775808");
12602 return;
12605 if (!v)
12607 strcpy (buf, "0");
12608 return;
12611 i = 0;
12612 tmp[29] = 0;
12613 while (v)
12615 tmp[28 - i] = (v % 10) + '0';
12616 v /= 10;
12617 i++;
12619 strcpy (buf, tmp + 29 - i);
12622 else
12624 if (hex)
12625 sprintf (buf, "0x%x", (unsigned int) disp);
12626 else
12627 sprintf (buf, "%d", (int) disp);
12631 /* Put DISP in BUF as signed hex number. */
12633 static void
12634 print_displacement (char *buf, bfd_vma disp)
12636 bfd_signed_vma val = disp;
12637 char tmp[30];
12638 int i, j = 0;
12640 if (val < 0)
12642 buf[j++] = '-';
12643 val = -disp;
12645 /* Check for possible overflow. */
12646 if (val < 0)
12648 switch (address_mode)
12650 case mode_64bit:
12651 strcpy (buf + j, "0x8000000000000000");
12652 break;
12653 case mode_32bit:
12654 strcpy (buf + j, "0x80000000");
12655 break;
12656 case mode_16bit:
12657 strcpy (buf + j, "0x8000");
12658 break;
12660 return;
12664 buf[j++] = '0';
12665 buf[j++] = 'x';
12667 sprintf_vma (tmp, (bfd_vma) val);
12668 for (i = 0; tmp[i] == '0'; i++)
12669 continue;
12670 if (tmp[i] == '\0')
12671 i--;
12672 strcpy (buf + j, tmp + i);
12675 static void
12676 intel_operand_size (int bytemode, int sizeflag)
12678 switch (bytemode)
12680 case b_mode:
12681 case b_swap_mode:
12682 case dqb_mode:
12683 oappend ("BYTE PTR ");
12684 break;
12685 case w_mode:
12686 case dqw_mode:
12687 oappend ("WORD PTR ");
12688 break;
12689 case stack_v_mode:
12690 if (address_mode == mode_64bit && (sizeflag & DFLAG))
12692 oappend ("QWORD PTR ");
12693 break;
12695 /* FALLTHRU */
12696 case v_mode:
12697 case v_swap_mode:
12698 case dq_mode:
12699 USED_REX (REX_W);
12700 if (rex & REX_W)
12701 oappend ("QWORD PTR ");
12702 else
12704 if ((sizeflag & DFLAG) || bytemode == dq_mode)
12705 oappend ("DWORD PTR ");
12706 else
12707 oappend ("WORD PTR ");
12708 used_prefixes |= (prefixes & PREFIX_DATA);
12710 break;
12711 case z_mode:
12712 if ((rex & REX_W) || (sizeflag & DFLAG))
12713 *obufp++ = 'D';
12714 oappend ("WORD PTR ");
12715 if (!(rex & REX_W))
12716 used_prefixes |= (prefixes & PREFIX_DATA);
12717 break;
12718 case a_mode:
12719 if (sizeflag & DFLAG)
12720 oappend ("QWORD PTR ");
12721 else
12722 oappend ("DWORD PTR ");
12723 used_prefixes |= (prefixes & PREFIX_DATA);
12724 break;
12725 case d_mode:
12726 case d_scalar_mode:
12727 case d_scalar_swap_mode:
12728 case d_swap_mode:
12729 case dqd_mode:
12730 oappend ("DWORD PTR ");
12731 break;
12732 case q_mode:
12733 case q_scalar_mode:
12734 case q_scalar_swap_mode:
12735 case q_swap_mode:
12736 oappend ("QWORD PTR ");
12737 break;
12738 case m_mode:
12739 if (address_mode == mode_64bit)
12740 oappend ("QWORD PTR ");
12741 else
12742 oappend ("DWORD PTR ");
12743 break;
12744 case f_mode:
12745 if (sizeflag & DFLAG)
12746 oappend ("FWORD PTR ");
12747 else
12748 oappend ("DWORD PTR ");
12749 used_prefixes |= (prefixes & PREFIX_DATA);
12750 break;
12751 case t_mode:
12752 oappend ("TBYTE PTR ");
12753 break;
12754 case x_mode:
12755 case x_swap_mode:
12756 if (need_vex)
12758 switch (vex.length)
12760 case 128:
12761 oappend ("XMMWORD PTR ");
12762 break;
12763 case 256:
12764 oappend ("YMMWORD PTR ");
12765 break;
12766 default:
12767 abort ();
12770 else
12771 oappend ("XMMWORD PTR ");
12772 break;
12773 case xmm_mode:
12774 oappend ("XMMWORD PTR ");
12775 break;
12776 case xmmq_mode:
12777 if (!need_vex)
12778 abort ();
12780 switch (vex.length)
12782 case 128:
12783 oappend ("QWORD PTR ");
12784 break;
12785 case 256:
12786 oappend ("XMMWORD PTR ");
12787 break;
12788 default:
12789 abort ();
12791 break;
12792 case ymmq_mode:
12793 if (!need_vex)
12794 abort ();
12796 switch (vex.length)
12798 case 128:
12799 oappend ("QWORD PTR ");
12800 break;
12801 case 256:
12802 oappend ("YMMWORD PTR ");
12803 break;
12804 default:
12805 abort ();
12807 break;
12808 case o_mode:
12809 oappend ("OWORD PTR ");
12810 break;
12811 case vex_w_dq_mode:
12812 case vex_scalar_w_dq_mode:
12813 if (!need_vex)
12814 abort ();
12816 if (vex.w)
12817 oappend ("QWORD PTR ");
12818 else
12819 oappend ("DWORD PTR ");
12820 break;
12821 default:
12822 break;
12826 static void
12827 OP_E_register (int bytemode, int sizeflag)
12829 int reg = modrm.rm;
12830 const char **names;
12832 USED_REX (REX_B);
12833 if ((rex & REX_B))
12834 reg += 8;
12836 if ((sizeflag & SUFFIX_ALWAYS)
12837 && (bytemode == b_swap_mode || bytemode == v_swap_mode))
12838 swap_operand ();
12840 switch (bytemode)
12842 case b_mode:
12843 case b_swap_mode:
12844 USED_REX (0);
12845 if (rex)
12846 names = names8rex;
12847 else
12848 names = names8;
12849 break;
12850 case w_mode:
12851 names = names16;
12852 break;
12853 case d_mode:
12854 names = names32;
12855 break;
12856 case q_mode:
12857 names = names64;
12858 break;
12859 case m_mode:
12860 names = address_mode == mode_64bit ? names64 : names32;
12861 break;
12862 case stack_v_mode:
12863 if (address_mode == mode_64bit && (sizeflag & DFLAG))
12865 names = names64;
12866 break;
12868 bytemode = v_mode;
12869 /* FALLTHRU */
12870 case v_mode:
12871 case v_swap_mode:
12872 case dq_mode:
12873 case dqb_mode:
12874 case dqd_mode:
12875 case dqw_mode:
12876 USED_REX (REX_W);
12877 if (rex & REX_W)
12878 names = names64;
12879 else
12881 if ((sizeflag & DFLAG)
12882 || (bytemode != v_mode
12883 && bytemode != v_swap_mode))
12884 names = names32;
12885 else
12886 names = names16;
12887 used_prefixes |= (prefixes & PREFIX_DATA);
12889 break;
12890 case 0:
12891 return;
12892 default:
12893 oappend (INTERNAL_DISASSEMBLER_ERROR);
12894 return;
12896 oappend (names[reg]);
12899 static void
12900 OP_E_memory (int bytemode, int sizeflag)
12902 bfd_vma disp = 0;
12903 int add = (rex & REX_B) ? 8 : 0;
12904 int riprel = 0;
12906 USED_REX (REX_B);
12907 if (intel_syntax)
12908 intel_operand_size (bytemode, sizeflag);
12909 append_seg ();
12911 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
12913 /* 32/64 bit address mode */
12914 int havedisp;
12915 int havesib;
12916 int havebase;
12917 int haveindex;
12918 int needindex;
12919 int base, rbase;
12920 int vindex = 0;
12921 int scale = 0;
12923 havesib = 0;
12924 havebase = 1;
12925 haveindex = 0;
12926 base = modrm.rm;
12928 if (base == 4)
12930 havesib = 1;
12931 FETCH_DATA (the_info, codep + 1);
12932 vindex = (*codep >> 3) & 7;
12933 scale = (*codep >> 6) & 3;
12934 base = *codep & 7;
12935 USED_REX (REX_X);
12936 if (rex & REX_X)
12937 vindex += 8;
12938 haveindex = vindex != 4;
12939 codep++;
12941 rbase = base + add;
12943 switch (modrm.mod)
12945 case 0:
12946 if (base == 5)
12948 havebase = 0;
12949 if (address_mode == mode_64bit && !havesib)
12950 riprel = 1;
12951 disp = get32s ();
12953 break;
12954 case 1:
12955 FETCH_DATA (the_info, codep + 1);
12956 disp = *codep++;
12957 if ((disp & 0x80) != 0)
12958 disp -= 0x100;
12959 break;
12960 case 2:
12961 disp = get32s ();
12962 break;
12965 /* In 32bit mode, we need index register to tell [offset] from
12966 [eiz*1 + offset]. */
12967 needindex = (havesib
12968 && !havebase
12969 && !haveindex
12970 && address_mode == mode_32bit);
12971 havedisp = (havebase
12972 || needindex
12973 || (havesib && (haveindex || scale != 0)));
12975 if (!intel_syntax)
12976 if (modrm.mod != 0 || base == 5)
12978 if (havedisp || riprel)
12979 print_displacement (scratchbuf, disp);
12980 else
12981 print_operand_value (scratchbuf, 1, disp);
12982 oappend (scratchbuf);
12983 if (riprel)
12985 set_op (disp, 1);
12986 oappend (sizeflag & AFLAG ? "(%rip)" : "(%eip)");
12990 if (havebase || haveindex || riprel)
12991 used_prefixes |= PREFIX_ADDR;
12993 if (havedisp || (intel_syntax && riprel))
12995 *obufp++ = open_char;
12996 if (intel_syntax && riprel)
12998 set_op (disp, 1);
12999 oappend (sizeflag & AFLAG ? "rip" : "eip");
13001 *obufp = '\0';
13002 if (havebase)
13003 oappend (address_mode == mode_64bit && (sizeflag & AFLAG)
13004 ? names64[rbase] : names32[rbase]);
13005 if (havesib)
13007 /* ESP/RSP won't allow index. If base isn't ESP/RSP,
13008 print index to tell base + index from base. */
13009 if (scale != 0
13010 || needindex
13011 || haveindex
13012 || (havebase && base != ESP_REG_NUM))
13014 if (!intel_syntax || havebase)
13016 *obufp++ = separator_char;
13017 *obufp = '\0';
13019 if (haveindex)
13020 oappend (address_mode == mode_64bit
13021 && (sizeflag & AFLAG)
13022 ? names64[vindex] : names32[vindex]);
13023 else
13024 oappend (address_mode == mode_64bit
13025 && (sizeflag & AFLAG)
13026 ? index64 : index32);
13028 *obufp++ = scale_char;
13029 *obufp = '\0';
13030 sprintf (scratchbuf, "%d", 1 << scale);
13031 oappend (scratchbuf);
13034 if (intel_syntax
13035 && (disp || modrm.mod != 0 || base == 5))
13037 if (!havedisp || (bfd_signed_vma) disp >= 0)
13039 *obufp++ = '+';
13040 *obufp = '\0';
13042 else if (modrm.mod != 1 && disp != -disp)
13044 *obufp++ = '-';
13045 *obufp = '\0';
13046 disp = - (bfd_signed_vma) disp;
13049 if (havedisp)
13050 print_displacement (scratchbuf, disp);
13051 else
13052 print_operand_value (scratchbuf, 1, disp);
13053 oappend (scratchbuf);
13056 *obufp++ = close_char;
13057 *obufp = '\0';
13059 else if (intel_syntax)
13061 if (modrm.mod != 0 || base == 5)
13063 if (prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
13064 | PREFIX_ES | PREFIX_FS | PREFIX_GS))
13066 else
13068 oappend (names_seg[ds_reg - es_reg]);
13069 oappend (":");
13071 print_operand_value (scratchbuf, 1, disp);
13072 oappend (scratchbuf);
13076 else
13078 /* 16 bit address mode */
13079 used_prefixes |= prefixes & PREFIX_ADDR;
13080 switch (modrm.mod)
13082 case 0:
13083 if (modrm.rm == 6)
13085 disp = get16 ();
13086 if ((disp & 0x8000) != 0)
13087 disp -= 0x10000;
13089 break;
13090 case 1:
13091 FETCH_DATA (the_info, codep + 1);
13092 disp = *codep++;
13093 if ((disp & 0x80) != 0)
13094 disp -= 0x100;
13095 break;
13096 case 2:
13097 disp = get16 ();
13098 if ((disp & 0x8000) != 0)
13099 disp -= 0x10000;
13100 break;
13103 if (!intel_syntax)
13104 if (modrm.mod != 0 || modrm.rm == 6)
13106 print_displacement (scratchbuf, disp);
13107 oappend (scratchbuf);
13110 if (modrm.mod != 0 || modrm.rm != 6)
13112 *obufp++ = open_char;
13113 *obufp = '\0';
13114 oappend (index16[modrm.rm]);
13115 if (intel_syntax
13116 && (disp || modrm.mod != 0 || modrm.rm == 6))
13118 if ((bfd_signed_vma) disp >= 0)
13120 *obufp++ = '+';
13121 *obufp = '\0';
13123 else if (modrm.mod != 1)
13125 *obufp++ = '-';
13126 *obufp = '\0';
13127 disp = - (bfd_signed_vma) disp;
13130 print_displacement (scratchbuf, disp);
13131 oappend (scratchbuf);
13134 *obufp++ = close_char;
13135 *obufp = '\0';
13137 else if (intel_syntax)
13139 if (prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
13140 | PREFIX_ES | PREFIX_FS | PREFIX_GS))
13142 else
13144 oappend (names_seg[ds_reg - es_reg]);
13145 oappend (":");
13147 print_operand_value (scratchbuf, 1, disp & 0xffff);
13148 oappend (scratchbuf);
13153 static void
13154 OP_E (int bytemode, int sizeflag)
13156 /* Skip mod/rm byte. */
13157 MODRM_CHECK;
13158 codep++;
13160 if (modrm.mod == 3)
13161 OP_E_register (bytemode, sizeflag);
13162 else
13163 OP_E_memory (bytemode, sizeflag);
13166 static void
13167 OP_G (int bytemode, int sizeflag)
13169 int add = 0;
13170 USED_REX (REX_R);
13171 if (rex & REX_R)
13172 add += 8;
13173 switch (bytemode)
13175 case b_mode:
13176 USED_REX (0);
13177 if (rex)
13178 oappend (names8rex[modrm.reg + add]);
13179 else
13180 oappend (names8[modrm.reg + add]);
13181 break;
13182 case w_mode:
13183 oappend (names16[modrm.reg + add]);
13184 break;
13185 case d_mode:
13186 oappend (names32[modrm.reg + add]);
13187 break;
13188 case q_mode:
13189 oappend (names64[modrm.reg + add]);
13190 break;
13191 case v_mode:
13192 case dq_mode:
13193 case dqb_mode:
13194 case dqd_mode:
13195 case dqw_mode:
13196 USED_REX (REX_W);
13197 if (rex & REX_W)
13198 oappend (names64[modrm.reg + add]);
13199 else
13201 if ((sizeflag & DFLAG) || bytemode != v_mode)
13202 oappend (names32[modrm.reg + add]);
13203 else
13204 oappend (names16[modrm.reg + add]);
13205 used_prefixes |= (prefixes & PREFIX_DATA);
13207 break;
13208 case m_mode:
13209 if (address_mode == mode_64bit)
13210 oappend (names64[modrm.reg + add]);
13211 else
13212 oappend (names32[modrm.reg + add]);
13213 break;
13214 default:
13215 oappend (INTERNAL_DISASSEMBLER_ERROR);
13216 break;
13220 static bfd_vma
13221 get64 (void)
13223 bfd_vma x;
13224 #ifdef BFD64
13225 unsigned int a;
13226 unsigned int b;
13228 FETCH_DATA (the_info, codep + 8);
13229 a = *codep++ & 0xff;
13230 a |= (*codep++ & 0xff) << 8;
13231 a |= (*codep++ & 0xff) << 16;
13232 a |= (*codep++ & 0xff) << 24;
13233 b = *codep++ & 0xff;
13234 b |= (*codep++ & 0xff) << 8;
13235 b |= (*codep++ & 0xff) << 16;
13236 b |= (*codep++ & 0xff) << 24;
13237 x = a + ((bfd_vma) b << 32);
13238 #else
13239 abort ();
13240 x = 0;
13241 #endif
13242 return x;
13245 static bfd_signed_vma
13246 get32 (void)
13248 bfd_signed_vma x = 0;
13250 FETCH_DATA (the_info, codep + 4);
13251 x = *codep++ & (bfd_signed_vma) 0xff;
13252 x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
13253 x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
13254 x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
13255 return x;
13258 static bfd_signed_vma
13259 get32s (void)
13261 bfd_signed_vma x = 0;
13263 FETCH_DATA (the_info, codep + 4);
13264 x = *codep++ & (bfd_signed_vma) 0xff;
13265 x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
13266 x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
13267 x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
13269 x = (x ^ ((bfd_signed_vma) 1 << 31)) - ((bfd_signed_vma) 1 << 31);
13271 return x;
13274 static int
13275 get16 (void)
13277 int x = 0;
13279 FETCH_DATA (the_info, codep + 2);
13280 x = *codep++ & 0xff;
13281 x |= (*codep++ & 0xff) << 8;
13282 return x;
13285 static void
13286 set_op (bfd_vma op, int riprel)
13288 op_index[op_ad] = op_ad;
13289 if (address_mode == mode_64bit)
13291 op_address[op_ad] = op;
13292 op_riprel[op_ad] = riprel;
13294 else
13296 /* Mask to get a 32-bit address. */
13297 op_address[op_ad] = op & 0xffffffff;
13298 op_riprel[op_ad] = riprel & 0xffffffff;
13302 static void
13303 OP_REG (int code, int sizeflag)
13305 const char *s;
13306 int add;
13307 USED_REX (REX_B);
13308 if (rex & REX_B)
13309 add = 8;
13310 else
13311 add = 0;
13313 switch (code)
13315 case ax_reg: case cx_reg: case dx_reg: case bx_reg:
13316 case sp_reg: case bp_reg: case si_reg: case di_reg:
13317 s = names16[code - ax_reg + add];
13318 break;
13319 case es_reg: case ss_reg: case cs_reg:
13320 case ds_reg: case fs_reg: case gs_reg:
13321 s = names_seg[code - es_reg + add];
13322 break;
13323 case al_reg: case ah_reg: case cl_reg: case ch_reg:
13324 case dl_reg: case dh_reg: case bl_reg: case bh_reg:
13325 USED_REX (0);
13326 if (rex)
13327 s = names8rex[code - al_reg + add];
13328 else
13329 s = names8[code - al_reg];
13330 break;
13331 case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
13332 case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
13333 if (address_mode == mode_64bit && (sizeflag & DFLAG))
13335 s = names64[code - rAX_reg + add];
13336 break;
13338 code += eAX_reg - rAX_reg;
13339 /* Fall through. */
13340 case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
13341 case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
13342 USED_REX (REX_W);
13343 if (rex & REX_W)
13344 s = names64[code - eAX_reg + add];
13345 else
13347 if (sizeflag & DFLAG)
13348 s = names32[code - eAX_reg + add];
13349 else
13350 s = names16[code - eAX_reg + add];
13351 used_prefixes |= (prefixes & PREFIX_DATA);
13353 break;
13354 default:
13355 s = INTERNAL_DISASSEMBLER_ERROR;
13356 break;
13358 oappend (s);
13361 static void
13362 OP_IMREG (int code, int sizeflag)
13364 const char *s;
13366 switch (code)
13368 case indir_dx_reg:
13369 if (intel_syntax)
13370 s = "dx";
13371 else
13372 s = "(%dx)";
13373 break;
13374 case ax_reg: case cx_reg: case dx_reg: case bx_reg:
13375 case sp_reg: case bp_reg: case si_reg: case di_reg:
13376 s = names16[code - ax_reg];
13377 break;
13378 case es_reg: case ss_reg: case cs_reg:
13379 case ds_reg: case fs_reg: case gs_reg:
13380 s = names_seg[code - es_reg];
13381 break;
13382 case al_reg: case ah_reg: case cl_reg: case ch_reg:
13383 case dl_reg: case dh_reg: case bl_reg: case bh_reg:
13384 USED_REX (0);
13385 if (rex)
13386 s = names8rex[code - al_reg];
13387 else
13388 s = names8[code - al_reg];
13389 break;
13390 case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
13391 case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
13392 USED_REX (REX_W);
13393 if (rex & REX_W)
13394 s = names64[code - eAX_reg];
13395 else
13397 if (sizeflag & DFLAG)
13398 s = names32[code - eAX_reg];
13399 else
13400 s = names16[code - eAX_reg];
13401 used_prefixes |= (prefixes & PREFIX_DATA);
13403 break;
13404 case z_mode_ax_reg:
13405 if ((rex & REX_W) || (sizeflag & DFLAG))
13406 s = *names32;
13407 else
13408 s = *names16;
13409 if (!(rex & REX_W))
13410 used_prefixes |= (prefixes & PREFIX_DATA);
13411 break;
13412 default:
13413 s = INTERNAL_DISASSEMBLER_ERROR;
13414 break;
13416 oappend (s);
13419 static void
13420 OP_I (int bytemode, int sizeflag)
13422 bfd_signed_vma op;
13423 bfd_signed_vma mask = -1;
13425 switch (bytemode)
13427 case b_mode:
13428 FETCH_DATA (the_info, codep + 1);
13429 op = *codep++;
13430 mask = 0xff;
13431 break;
13432 case q_mode:
13433 if (address_mode == mode_64bit)
13435 op = get32s ();
13436 break;
13438 /* Fall through. */
13439 case v_mode:
13440 USED_REX (REX_W);
13441 if (rex & REX_W)
13442 op = get32s ();
13443 else
13445 if (sizeflag & DFLAG)
13447 op = get32 ();
13448 mask = 0xffffffff;
13450 else
13452 op = get16 ();
13453 mask = 0xfffff;
13455 used_prefixes |= (prefixes & PREFIX_DATA);
13457 break;
13458 case w_mode:
13459 mask = 0xfffff;
13460 op = get16 ();
13461 break;
13462 case const_1_mode:
13463 if (intel_syntax)
13464 oappend ("1");
13465 return;
13466 default:
13467 oappend (INTERNAL_DISASSEMBLER_ERROR);
13468 return;
13471 op &= mask;
13472 scratchbuf[0] = '$';
13473 print_operand_value (scratchbuf + 1, 1, op);
13474 oappend (scratchbuf + intel_syntax);
13475 scratchbuf[0] = '\0';
13478 static void
13479 OP_I64 (int bytemode, int sizeflag)
13481 bfd_signed_vma op;
13482 bfd_signed_vma mask = -1;
13484 if (address_mode != mode_64bit)
13486 OP_I (bytemode, sizeflag);
13487 return;
13490 switch (bytemode)
13492 case b_mode:
13493 FETCH_DATA (the_info, codep + 1);
13494 op = *codep++;
13495 mask = 0xff;
13496 break;
13497 case v_mode:
13498 USED_REX (REX_W);
13499 if (rex & REX_W)
13500 op = get64 ();
13501 else
13503 if (sizeflag & DFLAG)
13505 op = get32 ();
13506 mask = 0xffffffff;
13508 else
13510 op = get16 ();
13511 mask = 0xfffff;
13513 used_prefixes |= (prefixes & PREFIX_DATA);
13515 break;
13516 case w_mode:
13517 mask = 0xfffff;
13518 op = get16 ();
13519 break;
13520 default:
13521 oappend (INTERNAL_DISASSEMBLER_ERROR);
13522 return;
13525 op &= mask;
13526 scratchbuf[0] = '$';
13527 print_operand_value (scratchbuf + 1, 1, op);
13528 oappend (scratchbuf + intel_syntax);
13529 scratchbuf[0] = '\0';
13532 static void
13533 OP_sI (int bytemode, int sizeflag)
13535 bfd_signed_vma op;
13536 bfd_signed_vma mask = -1;
13538 switch (bytemode)
13540 case b_mode:
13541 FETCH_DATA (the_info, codep + 1);
13542 op = *codep++;
13543 if ((op & 0x80) != 0)
13544 op -= 0x100;
13545 mask = 0xffffffff;
13546 break;
13547 case v_mode:
13548 USED_REX (REX_W);
13549 if (rex & REX_W)
13550 op = get32s ();
13551 else
13553 if (sizeflag & DFLAG)
13555 op = get32s ();
13556 mask = 0xffffffff;
13558 else
13560 mask = 0xffffffff;
13561 op = get16 ();
13562 if ((op & 0x8000) != 0)
13563 op -= 0x10000;
13565 used_prefixes |= (prefixes & PREFIX_DATA);
13567 break;
13568 case w_mode:
13569 op = get16 ();
13570 mask = 0xffffffff;
13571 if ((op & 0x8000) != 0)
13572 op -= 0x10000;
13573 break;
13574 default:
13575 oappend (INTERNAL_DISASSEMBLER_ERROR);
13576 return;
13579 scratchbuf[0] = '$';
13580 print_operand_value (scratchbuf + 1, 1, op);
13581 oappend (scratchbuf + intel_syntax);
13584 static void
13585 OP_J (int bytemode, int sizeflag)
13587 bfd_vma disp;
13588 bfd_vma mask = -1;
13589 bfd_vma segment = 0;
13591 switch (bytemode)
13593 case b_mode:
13594 FETCH_DATA (the_info, codep + 1);
13595 disp = *codep++;
13596 if ((disp & 0x80) != 0)
13597 disp -= 0x100;
13598 break;
13599 case v_mode:
13600 USED_REX (REX_W);
13601 if ((sizeflag & DFLAG) || (rex & REX_W))
13602 disp = get32s ();
13603 else
13605 disp = get16 ();
13606 if ((disp & 0x8000) != 0)
13607 disp -= 0x10000;
13608 /* In 16bit mode, address is wrapped around at 64k within
13609 the same segment. Otherwise, a data16 prefix on a jump
13610 instruction means that the pc is masked to 16 bits after
13611 the displacement is added! */
13612 mask = 0xffff;
13613 if ((prefixes & PREFIX_DATA) == 0)
13614 segment = ((start_pc + codep - start_codep)
13615 & ~((bfd_vma) 0xffff));
13617 if (!(rex & REX_W))
13618 used_prefixes |= (prefixes & PREFIX_DATA);
13619 break;
13620 default:
13621 oappend (INTERNAL_DISASSEMBLER_ERROR);
13622 return;
13624 disp = ((start_pc + codep - start_codep + disp) & mask) | segment;
13625 set_op (disp, 0);
13626 print_operand_value (scratchbuf, 1, disp);
13627 oappend (scratchbuf);
13630 static void
13631 OP_SEG (int bytemode, int sizeflag)
13633 if (bytemode == w_mode)
13634 oappend (names_seg[modrm.reg]);
13635 else
13636 OP_E (modrm.mod == 3 ? bytemode : w_mode, sizeflag);
13639 static void
13640 OP_DIR (int dummy ATTRIBUTE_UNUSED, int sizeflag)
13642 int seg, offset;
13644 if (sizeflag & DFLAG)
13646 offset = get32 ();
13647 seg = get16 ();
13649 else
13651 offset = get16 ();
13652 seg = get16 ();
13654 used_prefixes |= (prefixes & PREFIX_DATA);
13655 if (intel_syntax)
13656 sprintf (scratchbuf, "0x%x:0x%x", seg, offset);
13657 else
13658 sprintf (scratchbuf, "$0x%x,$0x%x", seg, offset);
13659 oappend (scratchbuf);
13662 static void
13663 OP_OFF (int bytemode, int sizeflag)
13665 bfd_vma off;
13667 if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
13668 intel_operand_size (bytemode, sizeflag);
13669 append_seg ();
13671 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
13672 off = get32 ();
13673 else
13674 off = get16 ();
13676 if (intel_syntax)
13678 if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
13679 | PREFIX_ES | PREFIX_FS | PREFIX_GS)))
13681 oappend (names_seg[ds_reg - es_reg]);
13682 oappend (":");
13685 print_operand_value (scratchbuf, 1, off);
13686 oappend (scratchbuf);
13689 static void
13690 OP_OFF64 (int bytemode, int sizeflag)
13692 bfd_vma off;
13694 if (address_mode != mode_64bit
13695 || (prefixes & PREFIX_ADDR))
13697 OP_OFF (bytemode, sizeflag);
13698 return;
13701 if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
13702 intel_operand_size (bytemode, sizeflag);
13703 append_seg ();
13705 off = get64 ();
13707 if (intel_syntax)
13709 if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
13710 | PREFIX_ES | PREFIX_FS | PREFIX_GS)))
13712 oappend (names_seg[ds_reg - es_reg]);
13713 oappend (":");
13716 print_operand_value (scratchbuf, 1, off);
13717 oappend (scratchbuf);
13720 static void
13721 ptr_reg (int code, int sizeflag)
13723 const char *s;
13725 *obufp++ = open_char;
13726 used_prefixes |= (prefixes & PREFIX_ADDR);
13727 if (address_mode == mode_64bit)
13729 if (!(sizeflag & AFLAG))
13730 s = names32[code - eAX_reg];
13731 else
13732 s = names64[code - eAX_reg];
13734 else if (sizeflag & AFLAG)
13735 s = names32[code - eAX_reg];
13736 else
13737 s = names16[code - eAX_reg];
13738 oappend (s);
13739 *obufp++ = close_char;
13740 *obufp = 0;
13743 static void
13744 OP_ESreg (int code, int sizeflag)
13746 if (intel_syntax)
13748 switch (codep[-1])
13750 case 0x6d: /* insw/insl */
13751 intel_operand_size (z_mode, sizeflag);
13752 break;
13753 case 0xa5: /* movsw/movsl/movsq */
13754 case 0xa7: /* cmpsw/cmpsl/cmpsq */
13755 case 0xab: /* stosw/stosl */
13756 case 0xaf: /* scasw/scasl */
13757 intel_operand_size (v_mode, sizeflag);
13758 break;
13759 default:
13760 intel_operand_size (b_mode, sizeflag);
13763 oappend ("%es:" + intel_syntax);
13764 ptr_reg (code, sizeflag);
13767 static void
13768 OP_DSreg (int code, int sizeflag)
13770 if (intel_syntax)
13772 switch (codep[-1])
13774 case 0x6f: /* outsw/outsl */
13775 intel_operand_size (z_mode, sizeflag);
13776 break;
13777 case 0xa5: /* movsw/movsl/movsq */
13778 case 0xa7: /* cmpsw/cmpsl/cmpsq */
13779 case 0xad: /* lodsw/lodsl/lodsq */
13780 intel_operand_size (v_mode, sizeflag);
13781 break;
13782 default:
13783 intel_operand_size (b_mode, sizeflag);
13786 if ((prefixes
13787 & (PREFIX_CS
13788 | PREFIX_DS
13789 | PREFIX_SS
13790 | PREFIX_ES
13791 | PREFIX_FS
13792 | PREFIX_GS)) == 0)
13793 prefixes |= PREFIX_DS;
13794 append_seg ();
13795 ptr_reg (code, sizeflag);
13798 static void
13799 OP_C (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13801 int add;
13802 if (rex & REX_R)
13804 USED_REX (REX_R);
13805 add = 8;
13807 else if (address_mode != mode_64bit && (prefixes & PREFIX_LOCK))
13809 all_prefixes[last_lock_prefix] = 0;
13810 used_prefixes |= PREFIX_LOCK;
13811 add = 8;
13813 else
13814 add = 0;
13815 sprintf (scratchbuf, "%%cr%d", modrm.reg + add);
13816 oappend (scratchbuf + intel_syntax);
13819 static void
13820 OP_D (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13822 int add;
13823 USED_REX (REX_R);
13824 if (rex & REX_R)
13825 add = 8;
13826 else
13827 add = 0;
13828 if (intel_syntax)
13829 sprintf (scratchbuf, "db%d", modrm.reg + add);
13830 else
13831 sprintf (scratchbuf, "%%db%d", modrm.reg + add);
13832 oappend (scratchbuf);
13835 static void
13836 OP_T (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13838 sprintf (scratchbuf, "%%tr%d", modrm.reg);
13839 oappend (scratchbuf + intel_syntax);
13842 static void
13843 OP_R (int bytemode, int sizeflag)
13845 if (modrm.mod == 3)
13846 OP_E (bytemode, sizeflag);
13847 else
13848 BadOp ();
13851 static void
13852 OP_MMX (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13854 int reg = modrm.reg;
13855 const char **names;
13857 used_prefixes |= (prefixes & PREFIX_DATA);
13858 if (prefixes & PREFIX_DATA)
13860 names = names_xmm;
13861 USED_REX (REX_R);
13862 if (rex & REX_R)
13863 reg += 8;
13865 else
13866 names = names_mm;
13867 oappend (names[reg]);
13870 static void
13871 OP_XMM (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13873 int reg = modrm.reg;
13874 const char **names;
13876 USED_REX (REX_R);
13877 if (rex & REX_R)
13878 reg += 8;
13879 if (need_vex
13880 && bytemode != xmm_mode
13881 && bytemode != scalar_mode)
13883 switch (vex.length)
13885 case 128:
13886 names = names_xmm;
13887 break;
13888 case 256:
13889 names = names_ymm;
13890 break;
13891 default:
13892 abort ();
13895 else
13896 names = names_xmm;
13897 oappend (names[reg]);
13900 static void
13901 OP_EM (int bytemode, int sizeflag)
13903 int reg;
13904 const char **names;
13906 if (modrm.mod != 3)
13908 if (intel_syntax
13909 && (bytemode == v_mode || bytemode == v_swap_mode))
13911 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
13912 used_prefixes |= (prefixes & PREFIX_DATA);
13914 OP_E (bytemode, sizeflag);
13915 return;
13918 if ((sizeflag & SUFFIX_ALWAYS) && bytemode == v_swap_mode)
13919 swap_operand ();
13921 /* Skip mod/rm byte. */
13922 MODRM_CHECK;
13923 codep++;
13924 used_prefixes |= (prefixes & PREFIX_DATA);
13925 reg = modrm.rm;
13926 if (prefixes & PREFIX_DATA)
13928 names = names_xmm;
13929 USED_REX (REX_B);
13930 if (rex & REX_B)
13931 reg += 8;
13933 else
13934 names = names_mm;
13935 oappend (names[reg]);
13938 /* cvt* are the only instructions in sse2 which have
13939 both SSE and MMX operands and also have 0x66 prefix
13940 in their opcode. 0x66 was originally used to differentiate
13941 between SSE and MMX instruction(operands). So we have to handle the
13942 cvt* separately using OP_EMC and OP_MXC */
13943 static void
13944 OP_EMC (int bytemode, int sizeflag)
13946 if (modrm.mod != 3)
13948 if (intel_syntax && bytemode == v_mode)
13950 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
13951 used_prefixes |= (prefixes & PREFIX_DATA);
13953 OP_E (bytemode, sizeflag);
13954 return;
13957 /* Skip mod/rm byte. */
13958 MODRM_CHECK;
13959 codep++;
13960 used_prefixes |= (prefixes & PREFIX_DATA);
13961 oappend (names_mm[modrm.rm]);
13964 static void
13965 OP_MXC (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13967 used_prefixes |= (prefixes & PREFIX_DATA);
13968 oappend (names_mm[modrm.reg]);
13971 static void
13972 OP_EX (int bytemode, int sizeflag)
13974 int reg;
13975 const char **names;
13977 /* Skip mod/rm byte. */
13978 MODRM_CHECK;
13979 codep++;
13981 if (modrm.mod != 3)
13983 OP_E_memory (bytemode, sizeflag);
13984 return;
13987 reg = modrm.rm;
13988 USED_REX (REX_B);
13989 if (rex & REX_B)
13990 reg += 8;
13992 if ((sizeflag & SUFFIX_ALWAYS)
13993 && (bytemode == x_swap_mode
13994 || bytemode == d_swap_mode
13995 || bytemode == d_scalar_swap_mode
13996 || bytemode == q_swap_mode
13997 || bytemode == q_scalar_swap_mode))
13998 swap_operand ();
14000 if (need_vex
14001 && bytemode != xmm_mode
14002 && bytemode != xmmq_mode
14003 && bytemode != d_scalar_mode
14004 && bytemode != d_scalar_swap_mode
14005 && bytemode != q_scalar_mode
14006 && bytemode != q_scalar_swap_mode
14007 && bytemode != vex_scalar_w_dq_mode)
14009 switch (vex.length)
14011 case 128:
14012 names = names_xmm;
14013 break;
14014 case 256:
14015 names = names_ymm;
14016 break;
14017 default:
14018 abort ();
14021 else
14022 names = names_xmm;
14023 oappend (names[reg]);
14026 static void
14027 OP_MS (int bytemode, int sizeflag)
14029 if (modrm.mod == 3)
14030 OP_EM (bytemode, sizeflag);
14031 else
14032 BadOp ();
14035 static void
14036 OP_XS (int bytemode, int sizeflag)
14038 if (modrm.mod == 3)
14039 OP_EX (bytemode, sizeflag);
14040 else
14041 BadOp ();
14044 static void
14045 OP_M (int bytemode, int sizeflag)
14047 if (modrm.mod == 3)
14048 /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
14049 BadOp ();
14050 else
14051 OP_E (bytemode, sizeflag);
14054 static void
14055 OP_0f07 (int bytemode, int sizeflag)
14057 if (modrm.mod != 3 || modrm.rm != 0)
14058 BadOp ();
14059 else
14060 OP_E (bytemode, sizeflag);
14063 /* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
14064 32bit mode and "xchg %rax,%rax" in 64bit mode. */
14066 static void
14067 NOP_Fixup1 (int bytemode, int sizeflag)
14069 if ((prefixes & PREFIX_DATA) != 0
14070 || (rex != 0
14071 && rex != 0x48
14072 && address_mode == mode_64bit))
14073 OP_REG (bytemode, sizeflag);
14074 else
14075 strcpy (obuf, "nop");
14078 static void
14079 NOP_Fixup2 (int bytemode, int sizeflag)
14081 if ((prefixes & PREFIX_DATA) != 0
14082 || (rex != 0
14083 && rex != 0x48
14084 && address_mode == mode_64bit))
14085 OP_IMREG (bytemode, sizeflag);
14088 static const char *const Suffix3DNow[] = {
14089 /* 00 */ NULL, NULL, NULL, NULL,
14090 /* 04 */ NULL, NULL, NULL, NULL,
14091 /* 08 */ NULL, NULL, NULL, NULL,
14092 /* 0C */ "pi2fw", "pi2fd", NULL, NULL,
14093 /* 10 */ NULL, NULL, NULL, NULL,
14094 /* 14 */ NULL, NULL, NULL, NULL,
14095 /* 18 */ NULL, NULL, NULL, NULL,
14096 /* 1C */ "pf2iw", "pf2id", NULL, NULL,
14097 /* 20 */ NULL, NULL, NULL, NULL,
14098 /* 24 */ NULL, NULL, NULL, NULL,
14099 /* 28 */ NULL, NULL, NULL, NULL,
14100 /* 2C */ NULL, NULL, NULL, NULL,
14101 /* 30 */ NULL, NULL, NULL, NULL,
14102 /* 34 */ NULL, NULL, NULL, NULL,
14103 /* 38 */ NULL, NULL, NULL, NULL,
14104 /* 3C */ NULL, NULL, NULL, NULL,
14105 /* 40 */ NULL, NULL, NULL, NULL,
14106 /* 44 */ NULL, NULL, NULL, NULL,
14107 /* 48 */ NULL, NULL, NULL, NULL,
14108 /* 4C */ NULL, NULL, NULL, NULL,
14109 /* 50 */ NULL, NULL, NULL, NULL,
14110 /* 54 */ NULL, NULL, NULL, NULL,
14111 /* 58 */ NULL, NULL, NULL, NULL,
14112 /* 5C */ NULL, NULL, NULL, NULL,
14113 /* 60 */ NULL, NULL, NULL, NULL,
14114 /* 64 */ NULL, NULL, NULL, NULL,
14115 /* 68 */ NULL, NULL, NULL, NULL,
14116 /* 6C */ NULL, NULL, NULL, NULL,
14117 /* 70 */ NULL, NULL, NULL, NULL,
14118 /* 74 */ NULL, NULL, NULL, NULL,
14119 /* 78 */ NULL, NULL, NULL, NULL,
14120 /* 7C */ NULL, NULL, NULL, NULL,
14121 /* 80 */ NULL, NULL, NULL, NULL,
14122 /* 84 */ NULL, NULL, NULL, NULL,
14123 /* 88 */ NULL, NULL, "pfnacc", NULL,
14124 /* 8C */ NULL, NULL, "pfpnacc", NULL,
14125 /* 90 */ "pfcmpge", NULL, NULL, NULL,
14126 /* 94 */ "pfmin", NULL, "pfrcp", "pfrsqrt",
14127 /* 98 */ NULL, NULL, "pfsub", NULL,
14128 /* 9C */ NULL, NULL, "pfadd", NULL,
14129 /* A0 */ "pfcmpgt", NULL, NULL, NULL,
14130 /* A4 */ "pfmax", NULL, "pfrcpit1", "pfrsqit1",
14131 /* A8 */ NULL, NULL, "pfsubr", NULL,
14132 /* AC */ NULL, NULL, "pfacc", NULL,
14133 /* B0 */ "pfcmpeq", NULL, NULL, NULL,
14134 /* B4 */ "pfmul", NULL, "pfrcpit2", "pmulhrw",
14135 /* B8 */ NULL, NULL, NULL, "pswapd",
14136 /* BC */ NULL, NULL, NULL, "pavgusb",
14137 /* C0 */ NULL, NULL, NULL, NULL,
14138 /* C4 */ NULL, NULL, NULL, NULL,
14139 /* C8 */ NULL, NULL, NULL, NULL,
14140 /* CC */ NULL, NULL, NULL, NULL,
14141 /* D0 */ NULL, NULL, NULL, NULL,
14142 /* D4 */ NULL, NULL, NULL, NULL,
14143 /* D8 */ NULL, NULL, NULL, NULL,
14144 /* DC */ NULL, NULL, NULL, NULL,
14145 /* E0 */ NULL, NULL, NULL, NULL,
14146 /* E4 */ NULL, NULL, NULL, NULL,
14147 /* E8 */ NULL, NULL, NULL, NULL,
14148 /* EC */ NULL, NULL, NULL, NULL,
14149 /* F0 */ NULL, NULL, NULL, NULL,
14150 /* F4 */ NULL, NULL, NULL, NULL,
14151 /* F8 */ NULL, NULL, NULL, NULL,
14152 /* FC */ NULL, NULL, NULL, NULL,
14155 static void
14156 OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
14158 const char *mnemonic;
14160 FETCH_DATA (the_info, codep + 1);
14161 /* AMD 3DNow! instructions are specified by an opcode suffix in the
14162 place where an 8-bit immediate would normally go. ie. the last
14163 byte of the instruction. */
14164 obufp = mnemonicendp;
14165 mnemonic = Suffix3DNow[*codep++ & 0xff];
14166 if (mnemonic)
14167 oappend (mnemonic);
14168 else
14170 /* Since a variable sized modrm/sib chunk is between the start
14171 of the opcode (0x0f0f) and the opcode suffix, we need to do
14172 all the modrm processing first, and don't know until now that
14173 we have a bad opcode. This necessitates some cleaning up. */
14174 op_out[0][0] = '\0';
14175 op_out[1][0] = '\0';
14176 BadOp ();
14178 mnemonicendp = obufp;
14181 static struct op simd_cmp_op[] =
14183 { STRING_COMMA_LEN ("eq") },
14184 { STRING_COMMA_LEN ("lt") },
14185 { STRING_COMMA_LEN ("le") },
14186 { STRING_COMMA_LEN ("unord") },
14187 { STRING_COMMA_LEN ("neq") },
14188 { STRING_COMMA_LEN ("nlt") },
14189 { STRING_COMMA_LEN ("nle") },
14190 { STRING_COMMA_LEN ("ord") }
14193 static void
14194 CMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
14196 unsigned int cmp_type;
14198 FETCH_DATA (the_info, codep + 1);
14199 cmp_type = *codep++ & 0xff;
14200 if (cmp_type < ARRAY_SIZE (simd_cmp_op))
14202 char suffix [3];
14203 char *p = mnemonicendp - 2;
14204 suffix[0] = p[0];
14205 suffix[1] = p[1];
14206 suffix[2] = '\0';
14207 sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
14208 mnemonicendp += simd_cmp_op[cmp_type].len;
14210 else
14212 /* We have a reserved extension byte. Output it directly. */
14213 scratchbuf[0] = '$';
14214 print_operand_value (scratchbuf + 1, 1, cmp_type);
14215 oappend (scratchbuf + intel_syntax);
14216 scratchbuf[0] = '\0';
14220 static void
14221 OP_Mwait (int bytemode ATTRIBUTE_UNUSED,
14222 int sizeflag ATTRIBUTE_UNUSED)
14224 /* mwait %eax,%ecx */
14225 if (!intel_syntax)
14227 const char **names = (address_mode == mode_64bit
14228 ? names64 : names32);
14229 strcpy (op_out[0], names[0]);
14230 strcpy (op_out[1], names[1]);
14231 two_source_ops = 1;
14233 /* Skip mod/rm byte. */
14234 MODRM_CHECK;
14235 codep++;
14238 static void
14239 OP_Monitor (int bytemode ATTRIBUTE_UNUSED,
14240 int sizeflag ATTRIBUTE_UNUSED)
14242 /* monitor %eax,%ecx,%edx" */
14243 if (!intel_syntax)
14245 const char **op1_names;
14246 const char **names = (address_mode == mode_64bit
14247 ? names64 : names32);
14249 if (!(prefixes & PREFIX_ADDR))
14250 op1_names = (address_mode == mode_16bit
14251 ? names16 : names);
14252 else
14254 /* Remove "addr16/addr32". */
14255 all_prefixes[last_addr_prefix] = 0;
14256 op1_names = (address_mode != mode_32bit
14257 ? names32 : names16);
14258 used_prefixes |= PREFIX_ADDR;
14260 strcpy (op_out[0], op1_names[0]);
14261 strcpy (op_out[1], names[1]);
14262 strcpy (op_out[2], names[2]);
14263 two_source_ops = 1;
14265 /* Skip mod/rm byte. */
14266 MODRM_CHECK;
14267 codep++;
14270 static void
14271 BadOp (void)
14273 /* Throw away prefixes and 1st. opcode byte. */
14274 codep = insn_codep + 1;
14275 oappend ("(bad)");
14278 static void
14279 REP_Fixup (int bytemode, int sizeflag)
14281 /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
14282 lods and stos. */
14283 if (prefixes & PREFIX_REPZ)
14284 all_prefixes[last_repz_prefix] = REP_PREFIX;
14286 switch (bytemode)
14288 case al_reg:
14289 case eAX_reg:
14290 case indir_dx_reg:
14291 OP_IMREG (bytemode, sizeflag);
14292 break;
14293 case eDI_reg:
14294 OP_ESreg (bytemode, sizeflag);
14295 break;
14296 case eSI_reg:
14297 OP_DSreg (bytemode, sizeflag);
14298 break;
14299 default:
14300 abort ();
14301 break;
14305 static void
14306 CMPXCHG8B_Fixup (int bytemode, int sizeflag)
14308 USED_REX (REX_W);
14309 if (rex & REX_W)
14311 /* Change cmpxchg8b to cmpxchg16b. */
14312 char *p = mnemonicendp - 2;
14313 mnemonicendp = stpcpy (p, "16b");
14314 bytemode = o_mode;
14316 OP_M (bytemode, sizeflag);
14319 static void
14320 XMM_Fixup (int reg, int sizeflag ATTRIBUTE_UNUSED)
14322 const char **names;
14324 if (need_vex)
14326 switch (vex.length)
14328 case 128:
14329 names = names_xmm;
14330 break;
14331 case 256:
14332 names = names_ymm;
14333 break;
14334 default:
14335 abort ();
14338 else
14339 names = names_xmm;
14340 oappend (names[reg]);
14343 static void
14344 CRC32_Fixup (int bytemode, int sizeflag)
14346 /* Add proper suffix to "crc32". */
14347 char *p = mnemonicendp;
14349 switch (bytemode)
14351 case b_mode:
14352 if (intel_syntax)
14353 goto skip;
14355 *p++ = 'b';
14356 break;
14357 case v_mode:
14358 if (intel_syntax)
14359 goto skip;
14361 USED_REX (REX_W);
14362 if (rex & REX_W)
14363 *p++ = 'q';
14364 else
14366 if (sizeflag & DFLAG)
14367 *p++ = 'l';
14368 else
14369 *p++ = 'w';
14370 used_prefixes |= (prefixes & PREFIX_DATA);
14372 break;
14373 default:
14374 oappend (INTERNAL_DISASSEMBLER_ERROR);
14375 break;
14377 mnemonicendp = p;
14378 *p = '\0';
14380 skip:
14381 if (modrm.mod == 3)
14383 int add;
14385 /* Skip mod/rm byte. */
14386 MODRM_CHECK;
14387 codep++;
14389 USED_REX (REX_B);
14390 add = (rex & REX_B) ? 8 : 0;
14391 if (bytemode == b_mode)
14393 USED_REX (0);
14394 if (rex)
14395 oappend (names8rex[modrm.rm + add]);
14396 else
14397 oappend (names8[modrm.rm + add]);
14399 else
14401 USED_REX (REX_W);
14402 if (rex & REX_W)
14403 oappend (names64[modrm.rm + add]);
14404 else if ((prefixes & PREFIX_DATA))
14405 oappend (names16[modrm.rm + add]);
14406 else
14407 oappend (names32[modrm.rm + add]);
14410 else
14411 OP_E (bytemode, sizeflag);
14414 static void
14415 FXSAVE_Fixup (int bytemode, int sizeflag)
14417 /* Add proper suffix to "fxsave" and "fxrstor". */
14418 USED_REX (REX_W);
14419 if (rex & REX_W)
14421 char *p = mnemonicendp;
14422 *p++ = '6';
14423 *p++ = '4';
14424 *p = '\0';
14425 mnemonicendp = p;
14427 OP_M (bytemode, sizeflag);
14430 /* Display the destination register operand for instructions with
14431 VEX. */
14433 static void
14434 OP_VEX (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
14436 int reg;
14437 const char **names;
14439 if (!need_vex)
14440 abort ();
14442 if (!need_vex_reg)
14443 return;
14445 reg = vex.register_specifier;
14446 if (bytemode == vex_scalar_mode)
14448 oappend (names_xmm[reg]);
14449 return;
14452 switch (vex.length)
14454 case 128:
14455 switch (bytemode)
14457 case vex_mode:
14458 case vex128_mode:
14459 break;
14460 default:
14461 abort ();
14462 return;
14465 names = names_xmm;
14466 break;
14467 case 256:
14468 switch (bytemode)
14470 case vex_mode:
14471 case vex256_mode:
14472 break;
14473 default:
14474 abort ();
14475 return;
14478 names = names_ymm;
14479 break;
14480 default:
14481 abort ();
14482 break;
14484 oappend (names[reg]);
14487 /* Get the VEX immediate byte without moving codep. */
14489 static unsigned char
14490 get_vex_imm8 (int sizeflag, int opnum)
14492 int bytes_before_imm = 0;
14494 if (modrm.mod != 3)
14496 /* There are SIB/displacement bytes. */
14497 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
14499 /* 32/64 bit address mode */
14500 int base = modrm.rm;
14502 /* Check SIB byte. */
14503 if (base == 4)
14505 FETCH_DATA (the_info, codep + 1);
14506 base = *codep & 7;
14507 /* When decoding the third source, don't increase
14508 bytes_before_imm as this has already been incremented
14509 by one in OP_E_memory while decoding the second
14510 source operand. */
14511 if (opnum == 0)
14512 bytes_before_imm++;
14515 /* Don't increase bytes_before_imm when decoding the third source,
14516 it has already been incremented by OP_E_memory while decoding
14517 the second source operand. */
14518 if (opnum == 0)
14520 switch (modrm.mod)
14522 case 0:
14523 /* When modrm.rm == 5 or modrm.rm == 4 and base in
14524 SIB == 5, there is a 4 byte displacement. */
14525 if (base != 5)
14526 /* No displacement. */
14527 break;
14528 case 2:
14529 /* 4 byte displacement. */
14530 bytes_before_imm += 4;
14531 break;
14532 case 1:
14533 /* 1 byte displacement. */
14534 bytes_before_imm++;
14535 break;
14539 else
14541 /* 16 bit address mode */
14542 /* Don't increase bytes_before_imm when decoding the third source,
14543 it has already been incremented by OP_E_memory while decoding
14544 the second source operand. */
14545 if (opnum == 0)
14547 switch (modrm.mod)
14549 case 0:
14550 /* When modrm.rm == 6, there is a 2 byte displacement. */
14551 if (modrm.rm != 6)
14552 /* No displacement. */
14553 break;
14554 case 2:
14555 /* 2 byte displacement. */
14556 bytes_before_imm += 2;
14557 break;
14558 case 1:
14559 /* 1 byte displacement: when decoding the third source,
14560 don't increase bytes_before_imm as this has already
14561 been incremented by one in OP_E_memory while decoding
14562 the second source operand. */
14563 if (opnum == 0)
14564 bytes_before_imm++;
14566 break;
14572 FETCH_DATA (the_info, codep + bytes_before_imm + 1);
14573 return codep [bytes_before_imm];
14576 static void
14577 OP_EX_VexReg (int bytemode, int sizeflag, int reg)
14579 const char **names;
14581 if (reg == -1 && modrm.mod != 3)
14583 OP_E_memory (bytemode, sizeflag);
14584 return;
14586 else
14588 if (reg == -1)
14590 reg = modrm.rm;
14591 USED_REX (REX_B);
14592 if (rex & REX_B)
14593 reg += 8;
14595 else if (reg > 7 && address_mode != mode_64bit)
14596 BadOp ();
14599 switch (vex.length)
14601 case 128:
14602 names = names_xmm;
14603 break;
14604 case 256:
14605 names = names_ymm;
14606 break;
14607 default:
14608 abort ();
14610 oappend (names[reg]);
14613 static void
14614 OP_EX_VexImmW (int bytemode, int sizeflag)
14616 int reg = -1;
14617 static unsigned char vex_imm8;
14619 if (vex_w_done == 0)
14621 vex_w_done = 1;
14623 /* Skip mod/rm byte. */
14624 MODRM_CHECK;
14625 codep++;
14627 vex_imm8 = get_vex_imm8 (sizeflag, 0);
14629 if (vex.w)
14630 reg = vex_imm8 >> 4;
14632 OP_EX_VexReg (bytemode, sizeflag, reg);
14634 else if (vex_w_done == 1)
14636 vex_w_done = 2;
14638 if (!vex.w)
14639 reg = vex_imm8 >> 4;
14641 OP_EX_VexReg (bytemode, sizeflag, reg);
14643 else
14645 /* Output the imm8 directly. */
14646 scratchbuf[0] = '$';
14647 print_operand_value (scratchbuf + 1, 1, vex_imm8 & 0xf);
14648 oappend (scratchbuf + intel_syntax);
14649 scratchbuf[0] = '\0';
14650 codep++;
14654 static void
14655 OP_Vex_2src (int bytemode, int sizeflag)
14657 if (modrm.mod == 3)
14659 int reg = modrm.rm;
14660 USED_REX (REX_B);
14661 if (rex & REX_B)
14662 reg += 8;
14663 oappend (names_xmm[reg]);
14665 else
14667 if (intel_syntax
14668 && (bytemode == v_mode || bytemode == v_swap_mode))
14670 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
14671 used_prefixes |= (prefixes & PREFIX_DATA);
14673 OP_E (bytemode, sizeflag);
14677 static void
14678 OP_Vex_2src_1 (int bytemode, int sizeflag)
14680 if (modrm.mod == 3)
14682 /* Skip mod/rm byte. */
14683 MODRM_CHECK;
14684 codep++;
14687 if (vex.w)
14688 oappend (names_xmm[vex.register_specifier]);
14689 else
14690 OP_Vex_2src (bytemode, sizeflag);
14693 static void
14694 OP_Vex_2src_2 (int bytemode, int sizeflag)
14696 if (vex.w)
14697 OP_Vex_2src (bytemode, sizeflag);
14698 else
14699 oappend (names_xmm[vex.register_specifier]);
14702 static void
14703 OP_EX_VexW (int bytemode, int sizeflag)
14705 int reg = -1;
14707 if (!vex_w_done)
14709 vex_w_done = 1;
14711 /* Skip mod/rm byte. */
14712 MODRM_CHECK;
14713 codep++;
14715 if (vex.w)
14716 reg = get_vex_imm8 (sizeflag, 0) >> 4;
14718 else
14720 if (!vex.w)
14721 reg = get_vex_imm8 (sizeflag, 1) >> 4;
14724 OP_EX_VexReg (bytemode, sizeflag, reg);
14727 static void
14728 VEXI4_Fixup (int bytemode ATTRIBUTE_UNUSED,
14729 int sizeflag ATTRIBUTE_UNUSED)
14731 /* Skip the immediate byte and check for invalid bits. */
14732 FETCH_DATA (the_info, codep + 1);
14733 if (*codep++ & 0xf)
14734 BadOp ();
14737 static void
14738 OP_REG_VexI4 (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
14740 int reg;
14741 const char **names;
14743 FETCH_DATA (the_info, codep + 1);
14744 reg = *codep++;
14746 if (bytemode != x_mode)
14747 abort ();
14749 if (reg & 0xf)
14750 BadOp ();
14752 reg >>= 4;
14753 if (reg > 7 && address_mode != mode_64bit)
14754 BadOp ();
14756 switch (vex.length)
14758 case 128:
14759 names = names_xmm;
14760 break;
14761 case 256:
14762 names = names_ymm;
14763 break;
14764 default:
14765 abort ();
14767 oappend (names[reg]);
14770 static void
14771 OP_XMM_VexW (int bytemode, int sizeflag)
14773 /* Turn off the REX.W bit since it is used for swapping operands
14774 now. */
14775 rex &= ~REX_W;
14776 OP_XMM (bytemode, sizeflag);
14779 static void
14780 OP_EX_Vex (int bytemode, int sizeflag)
14782 if (modrm.mod != 3)
14784 if (vex.register_specifier != 0)
14785 BadOp ();
14786 need_vex_reg = 0;
14788 OP_EX (bytemode, sizeflag);
14791 static void
14792 OP_XMM_Vex (int bytemode, int sizeflag)
14794 if (modrm.mod != 3)
14796 if (vex.register_specifier != 0)
14797 BadOp ();
14798 need_vex_reg = 0;
14800 OP_XMM (bytemode, sizeflag);
14803 static void
14804 VZERO_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
14806 switch (vex.length)
14808 case 128:
14809 mnemonicendp = stpcpy (obuf, "vzeroupper");
14810 break;
14811 case 256:
14812 mnemonicendp = stpcpy (obuf, "vzeroall");
14813 break;
14814 default:
14815 abort ();
14819 static struct op vex_cmp_op[] =
14821 { STRING_COMMA_LEN ("eq") },
14822 { STRING_COMMA_LEN ("lt") },
14823 { STRING_COMMA_LEN ("le") },
14824 { STRING_COMMA_LEN ("unord") },
14825 { STRING_COMMA_LEN ("neq") },
14826 { STRING_COMMA_LEN ("nlt") },
14827 { STRING_COMMA_LEN ("nle") },
14828 { STRING_COMMA_LEN ("ord") },
14829 { STRING_COMMA_LEN ("eq_uq") },
14830 { STRING_COMMA_LEN ("nge") },
14831 { STRING_COMMA_LEN ("ngt") },
14832 { STRING_COMMA_LEN ("false") },
14833 { STRING_COMMA_LEN ("neq_oq") },
14834 { STRING_COMMA_LEN ("ge") },
14835 { STRING_COMMA_LEN ("gt") },
14836 { STRING_COMMA_LEN ("true") },
14837 { STRING_COMMA_LEN ("eq_os") },
14838 { STRING_COMMA_LEN ("lt_oq") },
14839 { STRING_COMMA_LEN ("le_oq") },
14840 { STRING_COMMA_LEN ("unord_s") },
14841 { STRING_COMMA_LEN ("neq_us") },
14842 { STRING_COMMA_LEN ("nlt_uq") },
14843 { STRING_COMMA_LEN ("nle_uq") },
14844 { STRING_COMMA_LEN ("ord_s") },
14845 { STRING_COMMA_LEN ("eq_us") },
14846 { STRING_COMMA_LEN ("nge_uq") },
14847 { STRING_COMMA_LEN ("ngt_uq") },
14848 { STRING_COMMA_LEN ("false_os") },
14849 { STRING_COMMA_LEN ("neq_os") },
14850 { STRING_COMMA_LEN ("ge_oq") },
14851 { STRING_COMMA_LEN ("gt_oq") },
14852 { STRING_COMMA_LEN ("true_us") },
14855 static void
14856 VCMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
14858 unsigned int cmp_type;
14860 FETCH_DATA (the_info, codep + 1);
14861 cmp_type = *codep++ & 0xff;
14862 if (cmp_type < ARRAY_SIZE (vex_cmp_op))
14864 char suffix [3];
14865 char *p = mnemonicendp - 2;
14866 suffix[0] = p[0];
14867 suffix[1] = p[1];
14868 suffix[2] = '\0';
14869 sprintf (p, "%s%s", vex_cmp_op[cmp_type].name, suffix);
14870 mnemonicendp += vex_cmp_op[cmp_type].len;
14872 else
14874 /* We have a reserved extension byte. Output it directly. */
14875 scratchbuf[0] = '$';
14876 print_operand_value (scratchbuf + 1, 1, cmp_type);
14877 oappend (scratchbuf + intel_syntax);
14878 scratchbuf[0] = '\0';
14882 static const struct op pclmul_op[] =
14884 { STRING_COMMA_LEN ("lql") },
14885 { STRING_COMMA_LEN ("hql") },
14886 { STRING_COMMA_LEN ("lqh") },
14887 { STRING_COMMA_LEN ("hqh") }
14890 static void
14891 PCLMUL_Fixup (int bytemode ATTRIBUTE_UNUSED,
14892 int sizeflag ATTRIBUTE_UNUSED)
14894 unsigned int pclmul_type;
14896 FETCH_DATA (the_info, codep + 1);
14897 pclmul_type = *codep++ & 0xff;
14898 switch (pclmul_type)
14900 case 0x10:
14901 pclmul_type = 2;
14902 break;
14903 case 0x11:
14904 pclmul_type = 3;
14905 break;
14906 default:
14907 break;
14909 if (pclmul_type < ARRAY_SIZE (pclmul_op))
14911 char suffix [4];
14912 char *p = mnemonicendp - 3;
14913 suffix[0] = p[0];
14914 suffix[1] = p[1];
14915 suffix[2] = p[2];
14916 suffix[3] = '\0';
14917 sprintf (p, "%s%s", pclmul_op[pclmul_type].name, suffix);
14918 mnemonicendp += pclmul_op[pclmul_type].len;
14920 else
14922 /* We have a reserved extension byte. Output it directly. */
14923 scratchbuf[0] = '$';
14924 print_operand_value (scratchbuf + 1, 1, pclmul_type);
14925 oappend (scratchbuf + intel_syntax);
14926 scratchbuf[0] = '\0';
14930 static void
14931 MOVBE_Fixup (int bytemode, int sizeflag)
14933 /* Add proper suffix to "movbe". */
14934 char *p = mnemonicendp;
14936 switch (bytemode)
14938 case v_mode:
14939 if (intel_syntax)
14940 goto skip;
14942 USED_REX (REX_W);
14943 if (sizeflag & SUFFIX_ALWAYS)
14945 if (rex & REX_W)
14946 *p++ = 'q';
14947 else
14949 if (sizeflag & DFLAG)
14950 *p++ = 'l';
14951 else
14952 *p++ = 'w';
14953 used_prefixes |= (prefixes & PREFIX_DATA);
14956 break;
14957 default:
14958 oappend (INTERNAL_DISASSEMBLER_ERROR);
14959 break;
14961 mnemonicendp = p;
14962 *p = '\0';
14964 skip:
14965 OP_M (bytemode, sizeflag);
14968 static void
14969 OP_LWPCB_E (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
14971 int reg;
14972 const char **names;
14974 /* Skip mod/rm byte. */
14975 MODRM_CHECK;
14976 codep++;
14978 if (vex.w)
14979 names = names64;
14980 else if (vex.length == 256)
14981 names = names32;
14982 else
14983 names = names16;
14985 reg = modrm.rm;
14986 USED_REX (REX_B);
14987 if (rex & REX_B)
14988 reg += 8;
14990 oappend (names[reg]);
14993 static void
14994 OP_LWP_E (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
14996 const char **names;
14998 if (vex.w)
14999 names = names64;
15000 else if (vex.length == 256)
15001 names = names32;
15002 else
15003 names = names16;
15005 oappend (names[vex.register_specifier]);
15008 static void
15009 OP_LWP_I (int bytemode ATTRIBUTE_UNUSED, int sizeflag)
15011 if (vex.w || vex.length == 256)
15012 OP_I (q_mode, sizeflag);
15013 else
15014 OP_I (w_mode, sizeflag);