Replace is_archive with maybe_archive.
[binutils.git] / opcodes / i386-dis.c
blobf2def134cef8635bca73286cc7d3850e149e2f03
1 /* Print i386 instructions for GDB, the GNU debugger.
2 Copyright 1988, 1989, 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
4 Free Software Foundation, Inc.
6 This file is part of the GNU opcodes library.
8 This library is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3, or (at your option)
11 any later version.
13 It is distributed in the hope that it will be useful, but WITHOUT
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
16 License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21 MA 02110-1301, USA. */
24 /* 80386 instruction printer by Pace Willisson (pace@prep.ai.mit.edu)
25 July 1988
26 modified by John Hassey (hassey@dg-rtp.dg.com)
27 x86-64 support added by Jan Hubicka (jh@suse.cz)
28 VIA PadLock support by Michal Ludvig (mludvig@suse.cz). */
30 /* The main tables describing the instructions is essentially a copy
31 of the "Opcode Map" chapter (Appendix A) of the Intel 80386
32 Programmers Manual. Usually, there is a capital letter, followed
33 by a small letter. The capital letter tell the addressing mode,
34 and the small letter tells about the operand size. Refer to
35 the Intel manual for details. */
37 #include "sysdep.h"
38 #include "dis-asm.h"
39 #include "opintl.h"
40 #include "opcode/i386.h"
41 #include "libiberty.h"
43 #include <setjmp.h>
45 static int print_insn (bfd_vma, disassemble_info *);
46 static void dofloat (int);
47 static void OP_ST (int, int);
48 static void OP_STi (int, int);
49 static int putop (const char *, int);
50 static void oappend (const char *);
51 static void append_seg (void);
52 static void OP_indirE (int, int);
53 static void print_operand_value (char *, int, bfd_vma);
54 static void OP_E_register (int, int);
55 static void OP_E_memory (int, int);
56 static void print_displacement (char *, bfd_vma);
57 static void OP_E (int, int);
58 static void OP_G (int, int);
59 static bfd_vma get64 (void);
60 static bfd_signed_vma get32 (void);
61 static bfd_signed_vma get32s (void);
62 static int get16 (void);
63 static void set_op (bfd_vma, int);
64 static void OP_Skip_MODRM (int, int);
65 static void OP_REG (int, int);
66 static void OP_IMREG (int, int);
67 static void OP_I (int, int);
68 static void OP_I64 (int, int);
69 static void OP_sI (int, int);
70 static void OP_J (int, int);
71 static void OP_SEG (int, int);
72 static void OP_DIR (int, int);
73 static void OP_OFF (int, int);
74 static void OP_OFF64 (int, int);
75 static void ptr_reg (int, int);
76 static void OP_ESreg (int, int);
77 static void OP_DSreg (int, int);
78 static void OP_C (int, int);
79 static void OP_D (int, int);
80 static void OP_T (int, int);
81 static void OP_R (int, int);
82 static void OP_MMX (int, int);
83 static void OP_XMM (int, int);
84 static void OP_EM (int, int);
85 static void OP_EX (int, int);
86 static void OP_EMC (int,int);
87 static void OP_MXC (int,int);
88 static void OP_MS (int, int);
89 static void OP_XS (int, int);
90 static void OP_M (int, int);
91 static void OP_VEX (int, int);
92 static void OP_EX_Vex (int, int);
93 static void OP_EX_VexW (int, int);
94 static void OP_EX_VexImmW (int, int);
95 static void OP_XMM_Vex (int, int);
96 static void OP_XMM_VexW (int, int);
97 static void OP_REG_VexI4 (int, int);
98 static void PCLMUL_Fixup (int, int);
99 static void VEXI4_Fixup (int, int);
100 static void VZERO_Fixup (int, int);
101 static void VCMP_Fixup (int, int);
102 static void OP_0f07 (int, int);
103 static void OP_Monitor (int, int);
104 static void OP_Mwait (int, int);
105 static void NOP_Fixup1 (int, int);
106 static void NOP_Fixup2 (int, int);
107 static void OP_3DNowSuffix (int, int);
108 static void CMP_Fixup (int, int);
109 static void BadOp (void);
110 static void REP_Fixup (int, int);
111 static void CMPXCHG8B_Fixup (int, int);
112 static void XMM_Fixup (int, int);
113 static void CRC32_Fixup (int, int);
114 static void FXSAVE_Fixup (int, int);
115 static void OP_LWPCB_E (int, int);
116 static void OP_LWP_E (int, int);
117 static void OP_Vex_2src_1 (int, int);
118 static void OP_Vex_2src_2 (int, int);
120 static void MOVBE_Fixup (int, int);
122 struct dis_private {
123 /* Points to first byte not fetched. */
124 bfd_byte *max_fetched;
125 bfd_byte the_buffer[MAX_MNEM_SIZE];
126 bfd_vma insn_start;
127 int orig_sizeflag;
128 jmp_buf bailout;
131 enum address_mode
133 mode_16bit,
134 mode_32bit,
135 mode_64bit
138 enum address_mode address_mode;
140 /* Flags for the prefixes for the current instruction. See below. */
141 static int prefixes;
143 /* REX prefix the current instruction. See below. */
144 static int rex;
145 /* Bits of REX we've already used. */
146 static int rex_used;
147 /* REX bits in original REX prefix ignored. */
148 static int rex_ignored;
149 /* Mark parts used in the REX prefix. When we are testing for
150 empty prefix (for 8bit register REX extension), just mask it
151 out. Otherwise test for REX bit is excuse for existence of REX
152 only in case value is nonzero. */
153 #define USED_REX(value) \
155 if (value) \
157 if ((rex & value)) \
158 rex_used |= (value) | REX_OPCODE; \
160 else \
161 rex_used |= REX_OPCODE; \
164 /* Flags for prefixes which we somehow handled when printing the
165 current instruction. */
166 static int used_prefixes;
168 /* Flags stored in PREFIXES. */
169 #define PREFIX_REPZ 1
170 #define PREFIX_REPNZ 2
171 #define PREFIX_LOCK 4
172 #define PREFIX_CS 8
173 #define PREFIX_SS 0x10
174 #define PREFIX_DS 0x20
175 #define PREFIX_ES 0x40
176 #define PREFIX_FS 0x80
177 #define PREFIX_GS 0x100
178 #define PREFIX_DATA 0x200
179 #define PREFIX_ADDR 0x400
180 #define PREFIX_FWAIT 0x800
182 /* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
183 to ADDR (exclusive) are valid. Returns 1 for success, longjmps
184 on error. */
185 #define FETCH_DATA(info, addr) \
186 ((addr) <= ((struct dis_private *) (info->private_data))->max_fetched \
187 ? 1 : fetch_data ((info), (addr)))
189 static int
190 fetch_data (struct disassemble_info *info, bfd_byte *addr)
192 int status;
193 struct dis_private *priv = (struct dis_private *) info->private_data;
194 bfd_vma start = priv->insn_start + (priv->max_fetched - priv->the_buffer);
196 if (addr <= priv->the_buffer + MAX_MNEM_SIZE)
197 status = (*info->read_memory_func) (start,
198 priv->max_fetched,
199 addr - priv->max_fetched,
200 info);
201 else
202 status = -1;
203 if (status != 0)
205 /* If we did manage to read at least one byte, then
206 print_insn_i386 will do something sensible. Otherwise, print
207 an error. We do that here because this is where we know
208 STATUS. */
209 if (priv->max_fetched == priv->the_buffer)
210 (*info->memory_error_func) (status, start, info);
211 longjmp (priv->bailout, 1);
213 else
214 priv->max_fetched = addr;
215 return 1;
218 #define XX { NULL, 0 }
219 #define Bad_Opcode NULL, { { NULL, 0 } }
221 #define Eb { OP_E, b_mode }
222 #define EbS { OP_E, b_swap_mode }
223 #define Ev { OP_E, v_mode }
224 #define EvS { OP_E, v_swap_mode }
225 #define Ed { OP_E, d_mode }
226 #define Edq { OP_E, dq_mode }
227 #define Edqw { OP_E, dqw_mode }
228 #define Edqb { OP_E, dqb_mode }
229 #define Edqd { OP_E, dqd_mode }
230 #define Eq { OP_E, q_mode }
231 #define indirEv { OP_indirE, stack_v_mode }
232 #define indirEp { OP_indirE, f_mode }
233 #define stackEv { OP_E, stack_v_mode }
234 #define Em { OP_E, m_mode }
235 #define Ew { OP_E, w_mode }
236 #define M { OP_M, 0 } /* lea, lgdt, etc. */
237 #define Ma { OP_M, a_mode }
238 #define Mb { OP_M, b_mode }
239 #define Md { OP_M, d_mode }
240 #define Mo { OP_M, o_mode }
241 #define Mp { OP_M, f_mode } /* 32 or 48 bit memory operand for LDS, LES etc */
242 #define Mq { OP_M, q_mode }
243 #define Mx { OP_M, x_mode }
244 #define Mxmm { OP_M, xmm_mode }
245 #define Gb { OP_G, b_mode }
246 #define Gv { OP_G, v_mode }
247 #define Gd { OP_G, d_mode }
248 #define Gdq { OP_G, dq_mode }
249 #define Gm { OP_G, m_mode }
250 #define Gw { OP_G, w_mode }
251 #define Rd { OP_R, d_mode }
252 #define Rm { OP_R, m_mode }
253 #define Ib { OP_I, b_mode }
254 #define sIb { OP_sI, b_mode } /* sign extened byte */
255 #define Iv { OP_I, v_mode }
256 #define sIv { OP_sI, v_mode }
257 #define Iq { OP_I, q_mode }
258 #define Iv64 { OP_I64, v_mode }
259 #define Iw { OP_I, w_mode }
260 #define I1 { OP_I, const_1_mode }
261 #define Jb { OP_J, b_mode }
262 #define Jv { OP_J, v_mode }
263 #define Cm { OP_C, m_mode }
264 #define Dm { OP_D, m_mode }
265 #define Td { OP_T, d_mode }
266 #define Skip_MODRM { OP_Skip_MODRM, 0 }
268 #define RMeAX { OP_REG, eAX_reg }
269 #define RMeBX { OP_REG, eBX_reg }
270 #define RMeCX { OP_REG, eCX_reg }
271 #define RMeDX { OP_REG, eDX_reg }
272 #define RMeSP { OP_REG, eSP_reg }
273 #define RMeBP { OP_REG, eBP_reg }
274 #define RMeSI { OP_REG, eSI_reg }
275 #define RMeDI { OP_REG, eDI_reg }
276 #define RMrAX { OP_REG, rAX_reg }
277 #define RMrBX { OP_REG, rBX_reg }
278 #define RMrCX { OP_REG, rCX_reg }
279 #define RMrDX { OP_REG, rDX_reg }
280 #define RMrSP { OP_REG, rSP_reg }
281 #define RMrBP { OP_REG, rBP_reg }
282 #define RMrSI { OP_REG, rSI_reg }
283 #define RMrDI { OP_REG, rDI_reg }
284 #define RMAL { OP_REG, al_reg }
285 #define RMCL { OP_REG, cl_reg }
286 #define RMDL { OP_REG, dl_reg }
287 #define RMBL { OP_REG, bl_reg }
288 #define RMAH { OP_REG, ah_reg }
289 #define RMCH { OP_REG, ch_reg }
290 #define RMDH { OP_REG, dh_reg }
291 #define RMBH { OP_REG, bh_reg }
292 #define RMAX { OP_REG, ax_reg }
293 #define RMDX { OP_REG, dx_reg }
295 #define eAX { OP_IMREG, eAX_reg }
296 #define eBX { OP_IMREG, eBX_reg }
297 #define eCX { OP_IMREG, eCX_reg }
298 #define eDX { OP_IMREG, eDX_reg }
299 #define eSP { OP_IMREG, eSP_reg }
300 #define eBP { OP_IMREG, eBP_reg }
301 #define eSI { OP_IMREG, eSI_reg }
302 #define eDI { OP_IMREG, eDI_reg }
303 #define AL { OP_IMREG, al_reg }
304 #define CL { OP_IMREG, cl_reg }
305 #define DL { OP_IMREG, dl_reg }
306 #define BL { OP_IMREG, bl_reg }
307 #define AH { OP_IMREG, ah_reg }
308 #define CH { OP_IMREG, ch_reg }
309 #define DH { OP_IMREG, dh_reg }
310 #define BH { OP_IMREG, bh_reg }
311 #define AX { OP_IMREG, ax_reg }
312 #define DX { OP_IMREG, dx_reg }
313 #define zAX { OP_IMREG, z_mode_ax_reg }
314 #define indirDX { OP_IMREG, indir_dx_reg }
316 #define Sw { OP_SEG, w_mode }
317 #define Sv { OP_SEG, v_mode }
318 #define Ap { OP_DIR, 0 }
319 #define Ob { OP_OFF64, b_mode }
320 #define Ov { OP_OFF64, v_mode }
321 #define Xb { OP_DSreg, eSI_reg }
322 #define Xv { OP_DSreg, eSI_reg }
323 #define Xz { OP_DSreg, eSI_reg }
324 #define Yb { OP_ESreg, eDI_reg }
325 #define Yv { OP_ESreg, eDI_reg }
326 #define DSBX { OP_DSreg, eBX_reg }
328 #define es { OP_REG, es_reg }
329 #define ss { OP_REG, ss_reg }
330 #define cs { OP_REG, cs_reg }
331 #define ds { OP_REG, ds_reg }
332 #define fs { OP_REG, fs_reg }
333 #define gs { OP_REG, gs_reg }
335 #define MX { OP_MMX, 0 }
336 #define XM { OP_XMM, 0 }
337 #define XMScalar { OP_XMM, scalar_mode }
338 #define XMM { OP_XMM, xmm_mode }
339 #define EM { OP_EM, v_mode }
340 #define EMS { OP_EM, v_swap_mode }
341 #define EMd { OP_EM, d_mode }
342 #define EMx { OP_EM, x_mode }
343 #define EXw { OP_EX, w_mode }
344 #define EXd { OP_EX, d_mode }
345 #define EXdScalar { OP_EX, d_scalar_mode }
346 #define EXdS { OP_EX, d_swap_mode }
347 #define EXq { OP_EX, q_mode }
348 #define EXqScalar { OP_EX, q_scalar_mode }
349 #define EXqScalarS { OP_EX, q_scalar_swap_mode }
350 #define EXqS { OP_EX, q_swap_mode }
351 #define EXx { OP_EX, x_mode }
352 #define EXxS { OP_EX, x_swap_mode }
353 #define EXxmm { OP_EX, xmm_mode }
354 #define EXxmmq { OP_EX, xmmq_mode }
355 #define EXymmq { OP_EX, ymmq_mode }
356 #define EXVexWdq { OP_EX, vex_w_dq_mode }
357 #define EXVexWdqScalar { OP_EX, vex_scalar_w_dq_mode }
358 #define MS { OP_MS, v_mode }
359 #define XS { OP_XS, v_mode }
360 #define EMCq { OP_EMC, q_mode }
361 #define MXC { OP_MXC, 0 }
362 #define OPSUF { OP_3DNowSuffix, 0 }
363 #define CMP { CMP_Fixup, 0 }
364 #define XMM0 { XMM_Fixup, 0 }
365 #define FXSAVE { FXSAVE_Fixup, 0 }
366 #define Vex_2src_1 { OP_Vex_2src_1, 0 }
367 #define Vex_2src_2 { OP_Vex_2src_2, 0 }
369 #define Vex { OP_VEX, vex_mode }
370 #define VexScalar { OP_VEX, vex_scalar_mode }
371 #define Vex128 { OP_VEX, vex128_mode }
372 #define Vex256 { OP_VEX, vex256_mode }
373 #define VexI4 { VEXI4_Fixup, 0}
374 #define EXdVex { OP_EX_Vex, d_mode }
375 #define EXdVexS { OP_EX_Vex, d_swap_mode }
376 #define EXdVexScalarS { OP_EX_Vex, d_scalar_swap_mode }
377 #define EXqVex { OP_EX_Vex, q_mode }
378 #define EXqVexS { OP_EX_Vex, q_swap_mode }
379 #define EXqVexScalarS { OP_EX_Vex, q_scalar_swap_mode }
380 #define EXVexW { OP_EX_VexW, x_mode }
381 #define EXdVexW { OP_EX_VexW, d_mode }
382 #define EXqVexW { OP_EX_VexW, q_mode }
383 #define EXVexImmW { OP_EX_VexImmW, x_mode }
384 #define XMVex { OP_XMM_Vex, 0 }
385 #define XMVexScalar { OP_XMM_Vex, scalar_mode }
386 #define XMVexW { OP_XMM_VexW, 0 }
387 #define XMVexI4 { OP_REG_VexI4, x_mode }
388 #define PCLMUL { PCLMUL_Fixup, 0 }
389 #define VZERO { VZERO_Fixup, 0 }
390 #define VCMP { VCMP_Fixup, 0 }
392 /* Used handle "rep" prefix for string instructions. */
393 #define Xbr { REP_Fixup, eSI_reg }
394 #define Xvr { REP_Fixup, eSI_reg }
395 #define Ybr { REP_Fixup, eDI_reg }
396 #define Yvr { REP_Fixup, eDI_reg }
397 #define Yzr { REP_Fixup, eDI_reg }
398 #define indirDXr { REP_Fixup, indir_dx_reg }
399 #define ALr { REP_Fixup, al_reg }
400 #define eAXr { REP_Fixup, eAX_reg }
402 #define cond_jump_flag { NULL, cond_jump_mode }
403 #define loop_jcxz_flag { NULL, loop_jcxz_mode }
405 /* bits in sizeflag */
406 #define SUFFIX_ALWAYS 4
407 #define AFLAG 2
408 #define DFLAG 1
410 enum
412 /* byte operand */
413 b_mode = 1,
414 /* byte operand with operand swapped */
415 b_swap_mode,
416 /* operand size depends on prefixes */
417 v_mode,
418 /* operand size depends on prefixes with operand swapped */
419 v_swap_mode,
420 /* word operand */
421 w_mode,
422 /* double word operand */
423 d_mode,
424 /* double word operand with operand swapped */
425 d_swap_mode,
426 /* quad word operand */
427 q_mode,
428 /* quad word operand with operand swapped */
429 q_swap_mode,
430 /* ten-byte operand */
431 t_mode,
432 /* 16-byte XMM or 32-byte YMM operand */
433 x_mode,
434 /* 16-byte XMM or 32-byte YMM operand with operand swapped */
435 x_swap_mode,
436 /* 16-byte XMM operand */
437 xmm_mode,
438 /* 16-byte XMM or quad word operand */
439 xmmq_mode,
440 /* 32-byte YMM or quad word operand */
441 ymmq_mode,
442 /* d_mode in 32bit, q_mode in 64bit mode. */
443 m_mode,
444 /* pair of v_mode operands */
445 a_mode,
446 cond_jump_mode,
447 loop_jcxz_mode,
448 /* operand size depends on REX prefixes. */
449 dq_mode,
450 /* registers like dq_mode, memory like w_mode. */
451 dqw_mode,
452 /* 4- or 6-byte pointer operand */
453 f_mode,
454 const_1_mode,
455 /* v_mode for stack-related opcodes. */
456 stack_v_mode,
457 /* non-quad operand size depends on prefixes */
458 z_mode,
459 /* 16-byte operand */
460 o_mode,
461 /* registers like dq_mode, memory like b_mode. */
462 dqb_mode,
463 /* registers like dq_mode, memory like d_mode. */
464 dqd_mode,
465 /* normal vex mode */
466 vex_mode,
467 /* 128bit vex mode */
468 vex128_mode,
469 /* 256bit vex mode */
470 vex256_mode,
471 /* operand size depends on the VEX.W bit. */
472 vex_w_dq_mode,
474 /* scalar, ignore vector length. */
475 scalar_mode,
476 /* like d_mode, ignore vector length. */
477 d_scalar_mode,
478 /* like d_swap_mode, ignore vector length. */
479 d_scalar_swap_mode,
480 /* like q_mode, ignore vector length. */
481 q_scalar_mode,
482 /* like q_swap_mode, ignore vector length. */
483 q_scalar_swap_mode,
484 /* like vex_mode, ignore vector length. */
485 vex_scalar_mode,
486 /* like vex_w_dq_mode, ignore vector length. */
487 vex_scalar_w_dq_mode,
489 es_reg,
490 cs_reg,
491 ss_reg,
492 ds_reg,
493 fs_reg,
494 gs_reg,
496 eAX_reg,
497 eCX_reg,
498 eDX_reg,
499 eBX_reg,
500 eSP_reg,
501 eBP_reg,
502 eSI_reg,
503 eDI_reg,
505 al_reg,
506 cl_reg,
507 dl_reg,
508 bl_reg,
509 ah_reg,
510 ch_reg,
511 dh_reg,
512 bh_reg,
514 ax_reg,
515 cx_reg,
516 dx_reg,
517 bx_reg,
518 sp_reg,
519 bp_reg,
520 si_reg,
521 di_reg,
523 rAX_reg,
524 rCX_reg,
525 rDX_reg,
526 rBX_reg,
527 rSP_reg,
528 rBP_reg,
529 rSI_reg,
530 rDI_reg,
532 z_mode_ax_reg,
533 indir_dx_reg
536 enum
538 FLOATCODE = 1,
539 USE_REG_TABLE,
540 USE_MOD_TABLE,
541 USE_RM_TABLE,
542 USE_PREFIX_TABLE,
543 USE_X86_64_TABLE,
544 USE_3BYTE_TABLE,
545 USE_XOP_8F_TABLE,
546 USE_VEX_C4_TABLE,
547 USE_VEX_C5_TABLE,
548 USE_VEX_LEN_TABLE,
549 USE_VEX_W_TABLE
552 #define FLOAT NULL, { { NULL, FLOATCODE } }
554 #define DIS386(T, I) NULL, { { NULL, (T)}, { NULL, (I) } }
555 #define REG_TABLE(I) DIS386 (USE_REG_TABLE, (I))
556 #define MOD_TABLE(I) DIS386 (USE_MOD_TABLE, (I))
557 #define RM_TABLE(I) DIS386 (USE_RM_TABLE, (I))
558 #define PREFIX_TABLE(I) DIS386 (USE_PREFIX_TABLE, (I))
559 #define X86_64_TABLE(I) DIS386 (USE_X86_64_TABLE, (I))
560 #define THREE_BYTE_TABLE(I) DIS386 (USE_3BYTE_TABLE, (I))
561 #define XOP_8F_TABLE(I) DIS386 (USE_XOP_8F_TABLE, (I))
562 #define VEX_C4_TABLE(I) DIS386 (USE_VEX_C4_TABLE, (I))
563 #define VEX_C5_TABLE(I) DIS386 (USE_VEX_C5_TABLE, (I))
564 #define VEX_LEN_TABLE(I) DIS386 (USE_VEX_LEN_TABLE, (I))
565 #define VEX_W_TABLE(I) DIS386 (USE_VEX_W_TABLE, (I))
567 enum
569 REG_80 = 0,
570 REG_81,
571 REG_82,
572 REG_8F,
573 REG_C0,
574 REG_C1,
575 REG_C6,
576 REG_C7,
577 REG_D0,
578 REG_D1,
579 REG_D2,
580 REG_D3,
581 REG_F6,
582 REG_F7,
583 REG_FE,
584 REG_FF,
585 REG_0F00,
586 REG_0F01,
587 REG_0F0D,
588 REG_0F18,
589 REG_0F71,
590 REG_0F72,
591 REG_0F73,
592 REG_0FA6,
593 REG_0FA7,
594 REG_0FAE,
595 REG_0FBA,
596 REG_0FC7,
597 REG_VEX_0F71,
598 REG_VEX_0F72,
599 REG_VEX_0F73,
600 REG_VEX_0FAE,
601 REG_XOP_LWPCB,
602 REG_XOP_LWP
605 enum
607 MOD_8D = 0,
608 MOD_0F01_REG_0,
609 MOD_0F01_REG_1,
610 MOD_0F01_REG_2,
611 MOD_0F01_REG_3,
612 MOD_0F01_REG_7,
613 MOD_0F12_PREFIX_0,
614 MOD_0F13,
615 MOD_0F16_PREFIX_0,
616 MOD_0F17,
617 MOD_0F18_REG_0,
618 MOD_0F18_REG_1,
619 MOD_0F18_REG_2,
620 MOD_0F18_REG_3,
621 MOD_0F20,
622 MOD_0F21,
623 MOD_0F22,
624 MOD_0F23,
625 MOD_0F24,
626 MOD_0F26,
627 MOD_0F2B_PREFIX_0,
628 MOD_0F2B_PREFIX_1,
629 MOD_0F2B_PREFIX_2,
630 MOD_0F2B_PREFIX_3,
631 MOD_0F51,
632 MOD_0F71_REG_2,
633 MOD_0F71_REG_4,
634 MOD_0F71_REG_6,
635 MOD_0F72_REG_2,
636 MOD_0F72_REG_4,
637 MOD_0F72_REG_6,
638 MOD_0F73_REG_2,
639 MOD_0F73_REG_3,
640 MOD_0F73_REG_6,
641 MOD_0F73_REG_7,
642 MOD_0FAE_REG_0,
643 MOD_0FAE_REG_1,
644 MOD_0FAE_REG_2,
645 MOD_0FAE_REG_3,
646 MOD_0FAE_REG_4,
647 MOD_0FAE_REG_5,
648 MOD_0FAE_REG_6,
649 MOD_0FAE_REG_7,
650 MOD_0FB2,
651 MOD_0FB4,
652 MOD_0FB5,
653 MOD_0FC7_REG_6,
654 MOD_0FC7_REG_7,
655 MOD_0FD7,
656 MOD_0FE7_PREFIX_2,
657 MOD_0FF0_PREFIX_3,
658 MOD_0F382A_PREFIX_2,
659 MOD_62_32BIT,
660 MOD_C4_32BIT,
661 MOD_C5_32BIT,
662 MOD_VEX_0F12_PREFIX_0,
663 MOD_VEX_0F13,
664 MOD_VEX_0F16_PREFIX_0,
665 MOD_VEX_0F17,
666 MOD_VEX_0F2B,
667 MOD_VEX_0F50,
668 MOD_VEX_0F71_REG_2,
669 MOD_VEX_0F71_REG_4,
670 MOD_VEX_0F71_REG_6,
671 MOD_VEX_0F72_REG_2,
672 MOD_VEX_0F72_REG_4,
673 MOD_VEX_0F72_REG_6,
674 MOD_VEX_0F73_REG_2,
675 MOD_VEX_0F73_REG_3,
676 MOD_VEX_0F73_REG_6,
677 MOD_VEX_0F73_REG_7,
678 MOD_VEX_0FAE_REG_2,
679 MOD_VEX_0FAE_REG_3,
680 MOD_VEX_0FD7_PREFIX_2,
681 MOD_VEX_0FE7_PREFIX_2,
682 MOD_VEX_0FF0_PREFIX_3,
683 MOD_VEX_0F3818_PREFIX_2,
684 MOD_VEX_0F3819_PREFIX_2,
685 MOD_VEX_0F381A_PREFIX_2,
686 MOD_VEX_0F382A_PREFIX_2,
687 MOD_VEX_0F382C_PREFIX_2,
688 MOD_VEX_0F382D_PREFIX_2,
689 MOD_VEX_0F382E_PREFIX_2,
690 MOD_VEX_0F382F_PREFIX_2
693 enum
695 RM_0F01_REG_0 = 0,
696 RM_0F01_REG_1,
697 RM_0F01_REG_2,
698 RM_0F01_REG_3,
699 RM_0F01_REG_7,
700 RM_0FAE_REG_5,
701 RM_0FAE_REG_6,
702 RM_0FAE_REG_7
705 enum
707 PREFIX_90 = 0,
708 PREFIX_0F10,
709 PREFIX_0F11,
710 PREFIX_0F12,
711 PREFIX_0F16,
712 PREFIX_0F2A,
713 PREFIX_0F2B,
714 PREFIX_0F2C,
715 PREFIX_0F2D,
716 PREFIX_0F2E,
717 PREFIX_0F2F,
718 PREFIX_0F51,
719 PREFIX_0F52,
720 PREFIX_0F53,
721 PREFIX_0F58,
722 PREFIX_0F59,
723 PREFIX_0F5A,
724 PREFIX_0F5B,
725 PREFIX_0F5C,
726 PREFIX_0F5D,
727 PREFIX_0F5E,
728 PREFIX_0F5F,
729 PREFIX_0F60,
730 PREFIX_0F61,
731 PREFIX_0F62,
732 PREFIX_0F6C,
733 PREFIX_0F6D,
734 PREFIX_0F6F,
735 PREFIX_0F70,
736 PREFIX_0F73_REG_3,
737 PREFIX_0F73_REG_7,
738 PREFIX_0F78,
739 PREFIX_0F79,
740 PREFIX_0F7C,
741 PREFIX_0F7D,
742 PREFIX_0F7E,
743 PREFIX_0F7F,
744 PREFIX_0FAE_REG_0,
745 PREFIX_0FAE_REG_1,
746 PREFIX_0FAE_REG_2,
747 PREFIX_0FAE_REG_3,
748 PREFIX_0FB8,
749 PREFIX_0FBD,
750 PREFIX_0FC2,
751 PREFIX_0FC3,
752 PREFIX_0FC7_REG_6,
753 PREFIX_0FD0,
754 PREFIX_0FD6,
755 PREFIX_0FE6,
756 PREFIX_0FE7,
757 PREFIX_0FF0,
758 PREFIX_0FF7,
759 PREFIX_0F3810,
760 PREFIX_0F3814,
761 PREFIX_0F3815,
762 PREFIX_0F3817,
763 PREFIX_0F3820,
764 PREFIX_0F3821,
765 PREFIX_0F3822,
766 PREFIX_0F3823,
767 PREFIX_0F3824,
768 PREFIX_0F3825,
769 PREFIX_0F3828,
770 PREFIX_0F3829,
771 PREFIX_0F382A,
772 PREFIX_0F382B,
773 PREFIX_0F3830,
774 PREFIX_0F3831,
775 PREFIX_0F3832,
776 PREFIX_0F3833,
777 PREFIX_0F3834,
778 PREFIX_0F3835,
779 PREFIX_0F3837,
780 PREFIX_0F3838,
781 PREFIX_0F3839,
782 PREFIX_0F383A,
783 PREFIX_0F383B,
784 PREFIX_0F383C,
785 PREFIX_0F383D,
786 PREFIX_0F383E,
787 PREFIX_0F383F,
788 PREFIX_0F3840,
789 PREFIX_0F3841,
790 PREFIX_0F3880,
791 PREFIX_0F3881,
792 PREFIX_0F38DB,
793 PREFIX_0F38DC,
794 PREFIX_0F38DD,
795 PREFIX_0F38DE,
796 PREFIX_0F38DF,
797 PREFIX_0F38F0,
798 PREFIX_0F38F1,
799 PREFIX_0F3A08,
800 PREFIX_0F3A09,
801 PREFIX_0F3A0A,
802 PREFIX_0F3A0B,
803 PREFIX_0F3A0C,
804 PREFIX_0F3A0D,
805 PREFIX_0F3A0E,
806 PREFIX_0F3A14,
807 PREFIX_0F3A15,
808 PREFIX_0F3A16,
809 PREFIX_0F3A17,
810 PREFIX_0F3A20,
811 PREFIX_0F3A21,
812 PREFIX_0F3A22,
813 PREFIX_0F3A40,
814 PREFIX_0F3A41,
815 PREFIX_0F3A42,
816 PREFIX_0F3A44,
817 PREFIX_0F3A60,
818 PREFIX_0F3A61,
819 PREFIX_0F3A62,
820 PREFIX_0F3A63,
821 PREFIX_0F3ADF,
822 PREFIX_VEX_0F10,
823 PREFIX_VEX_0F11,
824 PREFIX_VEX_0F12,
825 PREFIX_VEX_0F16,
826 PREFIX_VEX_0F2A,
827 PREFIX_VEX_0F2C,
828 PREFIX_VEX_0F2D,
829 PREFIX_VEX_0F2E,
830 PREFIX_VEX_0F2F,
831 PREFIX_VEX_0F51,
832 PREFIX_VEX_0F52,
833 PREFIX_VEX_0F53,
834 PREFIX_VEX_0F58,
835 PREFIX_VEX_0F59,
836 PREFIX_VEX_0F5A,
837 PREFIX_VEX_0F5B,
838 PREFIX_VEX_0F5C,
839 PREFIX_VEX_0F5D,
840 PREFIX_VEX_0F5E,
841 PREFIX_VEX_0F5F,
842 PREFIX_VEX_0F60,
843 PREFIX_VEX_0F61,
844 PREFIX_VEX_0F62,
845 PREFIX_VEX_0F63,
846 PREFIX_VEX_0F64,
847 PREFIX_VEX_0F65,
848 PREFIX_VEX_0F66,
849 PREFIX_VEX_0F67,
850 PREFIX_VEX_0F68,
851 PREFIX_VEX_0F69,
852 PREFIX_VEX_0F6A,
853 PREFIX_VEX_0F6B,
854 PREFIX_VEX_0F6C,
855 PREFIX_VEX_0F6D,
856 PREFIX_VEX_0F6E,
857 PREFIX_VEX_0F6F,
858 PREFIX_VEX_0F70,
859 PREFIX_VEX_0F71_REG_2,
860 PREFIX_VEX_0F71_REG_4,
861 PREFIX_VEX_0F71_REG_6,
862 PREFIX_VEX_0F72_REG_2,
863 PREFIX_VEX_0F72_REG_4,
864 PREFIX_VEX_0F72_REG_6,
865 PREFIX_VEX_0F73_REG_2,
866 PREFIX_VEX_0F73_REG_3,
867 PREFIX_VEX_0F73_REG_6,
868 PREFIX_VEX_0F73_REG_7,
869 PREFIX_VEX_0F74,
870 PREFIX_VEX_0F75,
871 PREFIX_VEX_0F76,
872 PREFIX_VEX_0F77,
873 PREFIX_VEX_0F7C,
874 PREFIX_VEX_0F7D,
875 PREFIX_VEX_0F7E,
876 PREFIX_VEX_0F7F,
877 PREFIX_VEX_0FC2,
878 PREFIX_VEX_0FC4,
879 PREFIX_VEX_0FC5,
880 PREFIX_VEX_0FD0,
881 PREFIX_VEX_0FD1,
882 PREFIX_VEX_0FD2,
883 PREFIX_VEX_0FD3,
884 PREFIX_VEX_0FD4,
885 PREFIX_VEX_0FD5,
886 PREFIX_VEX_0FD6,
887 PREFIX_VEX_0FD7,
888 PREFIX_VEX_0FD8,
889 PREFIX_VEX_0FD9,
890 PREFIX_VEX_0FDA,
891 PREFIX_VEX_0FDB,
892 PREFIX_VEX_0FDC,
893 PREFIX_VEX_0FDD,
894 PREFIX_VEX_0FDE,
895 PREFIX_VEX_0FDF,
896 PREFIX_VEX_0FE0,
897 PREFIX_VEX_0FE1,
898 PREFIX_VEX_0FE2,
899 PREFIX_VEX_0FE3,
900 PREFIX_VEX_0FE4,
901 PREFIX_VEX_0FE5,
902 PREFIX_VEX_0FE6,
903 PREFIX_VEX_0FE7,
904 PREFIX_VEX_0FE8,
905 PREFIX_VEX_0FE9,
906 PREFIX_VEX_0FEA,
907 PREFIX_VEX_0FEB,
908 PREFIX_VEX_0FEC,
909 PREFIX_VEX_0FED,
910 PREFIX_VEX_0FEE,
911 PREFIX_VEX_0FEF,
912 PREFIX_VEX_0FF0,
913 PREFIX_VEX_0FF1,
914 PREFIX_VEX_0FF2,
915 PREFIX_VEX_0FF3,
916 PREFIX_VEX_0FF4,
917 PREFIX_VEX_0FF5,
918 PREFIX_VEX_0FF6,
919 PREFIX_VEX_0FF7,
920 PREFIX_VEX_0FF8,
921 PREFIX_VEX_0FF9,
922 PREFIX_VEX_0FFA,
923 PREFIX_VEX_0FFB,
924 PREFIX_VEX_0FFC,
925 PREFIX_VEX_0FFD,
926 PREFIX_VEX_0FFE,
927 PREFIX_VEX_0F3800,
928 PREFIX_VEX_0F3801,
929 PREFIX_VEX_0F3802,
930 PREFIX_VEX_0F3803,
931 PREFIX_VEX_0F3804,
932 PREFIX_VEX_0F3805,
933 PREFIX_VEX_0F3806,
934 PREFIX_VEX_0F3807,
935 PREFIX_VEX_0F3808,
936 PREFIX_VEX_0F3809,
937 PREFIX_VEX_0F380A,
938 PREFIX_VEX_0F380B,
939 PREFIX_VEX_0F380C,
940 PREFIX_VEX_0F380D,
941 PREFIX_VEX_0F380E,
942 PREFIX_VEX_0F380F,
943 PREFIX_VEX_0F3813,
944 PREFIX_VEX_0F3817,
945 PREFIX_VEX_0F3818,
946 PREFIX_VEX_0F3819,
947 PREFIX_VEX_0F381A,
948 PREFIX_VEX_0F381C,
949 PREFIX_VEX_0F381D,
950 PREFIX_VEX_0F381E,
951 PREFIX_VEX_0F3820,
952 PREFIX_VEX_0F3821,
953 PREFIX_VEX_0F3822,
954 PREFIX_VEX_0F3823,
955 PREFIX_VEX_0F3824,
956 PREFIX_VEX_0F3825,
957 PREFIX_VEX_0F3828,
958 PREFIX_VEX_0F3829,
959 PREFIX_VEX_0F382A,
960 PREFIX_VEX_0F382B,
961 PREFIX_VEX_0F382C,
962 PREFIX_VEX_0F382D,
963 PREFIX_VEX_0F382E,
964 PREFIX_VEX_0F382F,
965 PREFIX_VEX_0F3830,
966 PREFIX_VEX_0F3831,
967 PREFIX_VEX_0F3832,
968 PREFIX_VEX_0F3833,
969 PREFIX_VEX_0F3834,
970 PREFIX_VEX_0F3835,
971 PREFIX_VEX_0F3837,
972 PREFIX_VEX_0F3838,
973 PREFIX_VEX_0F3839,
974 PREFIX_VEX_0F383A,
975 PREFIX_VEX_0F383B,
976 PREFIX_VEX_0F383C,
977 PREFIX_VEX_0F383D,
978 PREFIX_VEX_0F383E,
979 PREFIX_VEX_0F383F,
980 PREFIX_VEX_0F3840,
981 PREFIX_VEX_0F3841,
982 PREFIX_VEX_0F3896,
983 PREFIX_VEX_0F3897,
984 PREFIX_VEX_0F3898,
985 PREFIX_VEX_0F3899,
986 PREFIX_VEX_0F389A,
987 PREFIX_VEX_0F389B,
988 PREFIX_VEX_0F389C,
989 PREFIX_VEX_0F389D,
990 PREFIX_VEX_0F389E,
991 PREFIX_VEX_0F389F,
992 PREFIX_VEX_0F38A6,
993 PREFIX_VEX_0F38A7,
994 PREFIX_VEX_0F38A8,
995 PREFIX_VEX_0F38A9,
996 PREFIX_VEX_0F38AA,
997 PREFIX_VEX_0F38AB,
998 PREFIX_VEX_0F38AC,
999 PREFIX_VEX_0F38AD,
1000 PREFIX_VEX_0F38AE,
1001 PREFIX_VEX_0F38AF,
1002 PREFIX_VEX_0F38B6,
1003 PREFIX_VEX_0F38B7,
1004 PREFIX_VEX_0F38B8,
1005 PREFIX_VEX_0F38B9,
1006 PREFIX_VEX_0F38BA,
1007 PREFIX_VEX_0F38BB,
1008 PREFIX_VEX_0F38BC,
1009 PREFIX_VEX_0F38BD,
1010 PREFIX_VEX_0F38BE,
1011 PREFIX_VEX_0F38BF,
1012 PREFIX_VEX_0F38DB,
1013 PREFIX_VEX_0F38DC,
1014 PREFIX_VEX_0F38DD,
1015 PREFIX_VEX_0F38DE,
1016 PREFIX_VEX_0F38DF,
1017 PREFIX_VEX_0F3A04,
1018 PREFIX_VEX_0F3A05,
1019 PREFIX_VEX_0F3A06,
1020 PREFIX_VEX_0F3A08,
1021 PREFIX_VEX_0F3A09,
1022 PREFIX_VEX_0F3A0A,
1023 PREFIX_VEX_0F3A0B,
1024 PREFIX_VEX_0F3A0C,
1025 PREFIX_VEX_0F3A0D,
1026 PREFIX_VEX_0F3A0E,
1027 PREFIX_VEX_0F3A0F,
1028 PREFIX_VEX_0F3A14,
1029 PREFIX_VEX_0F3A15,
1030 PREFIX_VEX_0F3A16,
1031 PREFIX_VEX_0F3A17,
1032 PREFIX_VEX_0F3A18,
1033 PREFIX_VEX_0F3A19,
1034 PREFIX_VEX_0F3A1D,
1035 PREFIX_VEX_0F3A20,
1036 PREFIX_VEX_0F3A21,
1037 PREFIX_VEX_0F3A22,
1038 PREFIX_VEX_0F3A40,
1039 PREFIX_VEX_0F3A41,
1040 PREFIX_VEX_0F3A42,
1041 PREFIX_VEX_0F3A44,
1042 PREFIX_VEX_0F3A48,
1043 PREFIX_VEX_0F3A49,
1044 PREFIX_VEX_0F3A4A,
1045 PREFIX_VEX_0F3A4B,
1046 PREFIX_VEX_0F3A4C,
1047 PREFIX_VEX_0F3A5C,
1048 PREFIX_VEX_0F3A5D,
1049 PREFIX_VEX_0F3A5E,
1050 PREFIX_VEX_0F3A5F,
1051 PREFIX_VEX_0F3A60,
1052 PREFIX_VEX_0F3A61,
1053 PREFIX_VEX_0F3A62,
1054 PREFIX_VEX_0F3A63,
1055 PREFIX_VEX_0F3A68,
1056 PREFIX_VEX_0F3A69,
1057 PREFIX_VEX_0F3A6A,
1058 PREFIX_VEX_0F3A6B,
1059 PREFIX_VEX_0F3A6C,
1060 PREFIX_VEX_0F3A6D,
1061 PREFIX_VEX_0F3A6E,
1062 PREFIX_VEX_0F3A6F,
1063 PREFIX_VEX_0F3A78,
1064 PREFIX_VEX_0F3A79,
1065 PREFIX_VEX_0F3A7A,
1066 PREFIX_VEX_0F3A7B,
1067 PREFIX_VEX_0F3A7C,
1068 PREFIX_VEX_0F3A7D,
1069 PREFIX_VEX_0F3A7E,
1070 PREFIX_VEX_0F3A7F,
1071 PREFIX_VEX_0F3ADF
1074 enum
1076 X86_64_06 = 0,
1077 X86_64_07,
1078 X86_64_0D,
1079 X86_64_16,
1080 X86_64_17,
1081 X86_64_1E,
1082 X86_64_1F,
1083 X86_64_27,
1084 X86_64_2F,
1085 X86_64_37,
1086 X86_64_3F,
1087 X86_64_60,
1088 X86_64_61,
1089 X86_64_62,
1090 X86_64_63,
1091 X86_64_6D,
1092 X86_64_6F,
1093 X86_64_9A,
1094 X86_64_C4,
1095 X86_64_C5,
1096 X86_64_CE,
1097 X86_64_D4,
1098 X86_64_D5,
1099 X86_64_EA,
1100 X86_64_0F01_REG_0,
1101 X86_64_0F01_REG_1,
1102 X86_64_0F01_REG_2,
1103 X86_64_0F01_REG_3
1106 enum
1108 THREE_BYTE_0F38 = 0,
1109 THREE_BYTE_0F3A,
1110 THREE_BYTE_0F7A
1113 enum
1115 XOP_08 = 0,
1116 XOP_09,
1117 XOP_0A
1120 enum
1122 VEX_0F = 0,
1123 VEX_0F38,
1124 VEX_0F3A
1127 enum
1129 VEX_LEN_0F10_P_1 = 0,
1130 VEX_LEN_0F10_P_3,
1131 VEX_LEN_0F11_P_1,
1132 VEX_LEN_0F11_P_3,
1133 VEX_LEN_0F12_P_0_M_0,
1134 VEX_LEN_0F12_P_0_M_1,
1135 VEX_LEN_0F12_P_2,
1136 VEX_LEN_0F13_M_0,
1137 VEX_LEN_0F16_P_0_M_0,
1138 VEX_LEN_0F16_P_0_M_1,
1139 VEX_LEN_0F16_P_2,
1140 VEX_LEN_0F17_M_0,
1141 VEX_LEN_0F2A_P_1,
1142 VEX_LEN_0F2A_P_3,
1143 VEX_LEN_0F2C_P_1,
1144 VEX_LEN_0F2C_P_3,
1145 VEX_LEN_0F2D_P_1,
1146 VEX_LEN_0F2D_P_3,
1147 VEX_LEN_0F2E_P_0,
1148 VEX_LEN_0F2E_P_2,
1149 VEX_LEN_0F2F_P_0,
1150 VEX_LEN_0F2F_P_2,
1151 VEX_LEN_0F51_P_1,
1152 VEX_LEN_0F51_P_3,
1153 VEX_LEN_0F52_P_1,
1154 VEX_LEN_0F53_P_1,
1155 VEX_LEN_0F58_P_1,
1156 VEX_LEN_0F58_P_3,
1157 VEX_LEN_0F59_P_1,
1158 VEX_LEN_0F59_P_3,
1159 VEX_LEN_0F5A_P_1,
1160 VEX_LEN_0F5A_P_3,
1161 VEX_LEN_0F5C_P_1,
1162 VEX_LEN_0F5C_P_3,
1163 VEX_LEN_0F5D_P_1,
1164 VEX_LEN_0F5D_P_3,
1165 VEX_LEN_0F5E_P_1,
1166 VEX_LEN_0F5E_P_3,
1167 VEX_LEN_0F5F_P_1,
1168 VEX_LEN_0F5F_P_3,
1169 VEX_LEN_0F60_P_2,
1170 VEX_LEN_0F61_P_2,
1171 VEX_LEN_0F62_P_2,
1172 VEX_LEN_0F63_P_2,
1173 VEX_LEN_0F64_P_2,
1174 VEX_LEN_0F65_P_2,
1175 VEX_LEN_0F66_P_2,
1176 VEX_LEN_0F67_P_2,
1177 VEX_LEN_0F68_P_2,
1178 VEX_LEN_0F69_P_2,
1179 VEX_LEN_0F6A_P_2,
1180 VEX_LEN_0F6B_P_2,
1181 VEX_LEN_0F6C_P_2,
1182 VEX_LEN_0F6D_P_2,
1183 VEX_LEN_0F6E_P_2,
1184 VEX_LEN_0F70_P_1,
1185 VEX_LEN_0F70_P_2,
1186 VEX_LEN_0F70_P_3,
1187 VEX_LEN_0F71_R_2_P_2,
1188 VEX_LEN_0F71_R_4_P_2,
1189 VEX_LEN_0F71_R_6_P_2,
1190 VEX_LEN_0F72_R_2_P_2,
1191 VEX_LEN_0F72_R_4_P_2,
1192 VEX_LEN_0F72_R_6_P_2,
1193 VEX_LEN_0F73_R_2_P_2,
1194 VEX_LEN_0F73_R_3_P_2,
1195 VEX_LEN_0F73_R_6_P_2,
1196 VEX_LEN_0F73_R_7_P_2,
1197 VEX_LEN_0F74_P_2,
1198 VEX_LEN_0F75_P_2,
1199 VEX_LEN_0F76_P_2,
1200 VEX_LEN_0F7E_P_1,
1201 VEX_LEN_0F7E_P_2,
1202 VEX_LEN_0FAE_R_2_M_0,
1203 VEX_LEN_0FAE_R_3_M_0,
1204 VEX_LEN_0FC2_P_1,
1205 VEX_LEN_0FC2_P_3,
1206 VEX_LEN_0FC4_P_2,
1207 VEX_LEN_0FC5_P_2,
1208 VEX_LEN_0FD1_P_2,
1209 VEX_LEN_0FD2_P_2,
1210 VEX_LEN_0FD3_P_2,
1211 VEX_LEN_0FD4_P_2,
1212 VEX_LEN_0FD5_P_2,
1213 VEX_LEN_0FD6_P_2,
1214 VEX_LEN_0FD7_P_2_M_1,
1215 VEX_LEN_0FD8_P_2,
1216 VEX_LEN_0FD9_P_2,
1217 VEX_LEN_0FDA_P_2,
1218 VEX_LEN_0FDB_P_2,
1219 VEX_LEN_0FDC_P_2,
1220 VEX_LEN_0FDD_P_2,
1221 VEX_LEN_0FDE_P_2,
1222 VEX_LEN_0FDF_P_2,
1223 VEX_LEN_0FE0_P_2,
1224 VEX_LEN_0FE1_P_2,
1225 VEX_LEN_0FE2_P_2,
1226 VEX_LEN_0FE3_P_2,
1227 VEX_LEN_0FE4_P_2,
1228 VEX_LEN_0FE5_P_2,
1229 VEX_LEN_0FE8_P_2,
1230 VEX_LEN_0FE9_P_2,
1231 VEX_LEN_0FEA_P_2,
1232 VEX_LEN_0FEB_P_2,
1233 VEX_LEN_0FEC_P_2,
1234 VEX_LEN_0FED_P_2,
1235 VEX_LEN_0FEE_P_2,
1236 VEX_LEN_0FEF_P_2,
1237 VEX_LEN_0FF1_P_2,
1238 VEX_LEN_0FF2_P_2,
1239 VEX_LEN_0FF3_P_2,
1240 VEX_LEN_0FF4_P_2,
1241 VEX_LEN_0FF5_P_2,
1242 VEX_LEN_0FF6_P_2,
1243 VEX_LEN_0FF7_P_2,
1244 VEX_LEN_0FF8_P_2,
1245 VEX_LEN_0FF9_P_2,
1246 VEX_LEN_0FFA_P_2,
1247 VEX_LEN_0FFB_P_2,
1248 VEX_LEN_0FFC_P_2,
1249 VEX_LEN_0FFD_P_2,
1250 VEX_LEN_0FFE_P_2,
1251 VEX_LEN_0F3800_P_2,
1252 VEX_LEN_0F3801_P_2,
1253 VEX_LEN_0F3802_P_2,
1254 VEX_LEN_0F3803_P_2,
1255 VEX_LEN_0F3804_P_2,
1256 VEX_LEN_0F3805_P_2,
1257 VEX_LEN_0F3806_P_2,
1258 VEX_LEN_0F3807_P_2,
1259 VEX_LEN_0F3808_P_2,
1260 VEX_LEN_0F3809_P_2,
1261 VEX_LEN_0F380A_P_2,
1262 VEX_LEN_0F380B_P_2,
1263 VEX_LEN_0F3819_P_2_M_0,
1264 VEX_LEN_0F381A_P_2_M_0,
1265 VEX_LEN_0F381C_P_2,
1266 VEX_LEN_0F381D_P_2,
1267 VEX_LEN_0F381E_P_2,
1268 VEX_LEN_0F3820_P_2,
1269 VEX_LEN_0F3821_P_2,
1270 VEX_LEN_0F3822_P_2,
1271 VEX_LEN_0F3823_P_2,
1272 VEX_LEN_0F3824_P_2,
1273 VEX_LEN_0F3825_P_2,
1274 VEX_LEN_0F3828_P_2,
1275 VEX_LEN_0F3829_P_2,
1276 VEX_LEN_0F382A_P_2_M_0,
1277 VEX_LEN_0F382B_P_2,
1278 VEX_LEN_0F3830_P_2,
1279 VEX_LEN_0F3831_P_2,
1280 VEX_LEN_0F3832_P_2,
1281 VEX_LEN_0F3833_P_2,
1282 VEX_LEN_0F3834_P_2,
1283 VEX_LEN_0F3835_P_2,
1284 VEX_LEN_0F3837_P_2,
1285 VEX_LEN_0F3838_P_2,
1286 VEX_LEN_0F3839_P_2,
1287 VEX_LEN_0F383A_P_2,
1288 VEX_LEN_0F383B_P_2,
1289 VEX_LEN_0F383C_P_2,
1290 VEX_LEN_0F383D_P_2,
1291 VEX_LEN_0F383E_P_2,
1292 VEX_LEN_0F383F_P_2,
1293 VEX_LEN_0F3840_P_2,
1294 VEX_LEN_0F3841_P_2,
1295 VEX_LEN_0F38DB_P_2,
1296 VEX_LEN_0F38DC_P_2,
1297 VEX_LEN_0F38DD_P_2,
1298 VEX_LEN_0F38DE_P_2,
1299 VEX_LEN_0F38DF_P_2,
1300 VEX_LEN_0F3A06_P_2,
1301 VEX_LEN_0F3A0A_P_2,
1302 VEX_LEN_0F3A0B_P_2,
1303 VEX_LEN_0F3A0E_P_2,
1304 VEX_LEN_0F3A0F_P_2,
1305 VEX_LEN_0F3A14_P_2,
1306 VEX_LEN_0F3A15_P_2,
1307 VEX_LEN_0F3A16_P_2,
1308 VEX_LEN_0F3A17_P_2,
1309 VEX_LEN_0F3A18_P_2,
1310 VEX_LEN_0F3A19_P_2,
1311 VEX_LEN_0F3A20_P_2,
1312 VEX_LEN_0F3A21_P_2,
1313 VEX_LEN_0F3A22_P_2,
1314 VEX_LEN_0F3A41_P_2,
1315 VEX_LEN_0F3A42_P_2,
1316 VEX_LEN_0F3A44_P_2,
1317 VEX_LEN_0F3A4C_P_2,
1318 VEX_LEN_0F3A60_P_2,
1319 VEX_LEN_0F3A61_P_2,
1320 VEX_LEN_0F3A62_P_2,
1321 VEX_LEN_0F3A63_P_2,
1322 VEX_LEN_0F3A6A_P_2,
1323 VEX_LEN_0F3A6B_P_2,
1324 VEX_LEN_0F3A6E_P_2,
1325 VEX_LEN_0F3A6F_P_2,
1326 VEX_LEN_0F3A7A_P_2,
1327 VEX_LEN_0F3A7B_P_2,
1328 VEX_LEN_0F3A7E_P_2,
1329 VEX_LEN_0F3A7F_P_2,
1330 VEX_LEN_0F3ADF_P_2,
1331 VEX_LEN_0FXOP_09_80,
1332 VEX_LEN_0FXOP_09_81
1335 enum
1337 VEX_W_0F10_P_0 = 0,
1338 VEX_W_0F10_P_1,
1339 VEX_W_0F10_P_2,
1340 VEX_W_0F10_P_3,
1341 VEX_W_0F11_P_0,
1342 VEX_W_0F11_P_1,
1343 VEX_W_0F11_P_2,
1344 VEX_W_0F11_P_3,
1345 VEX_W_0F12_P_0_M_0,
1346 VEX_W_0F12_P_0_M_1,
1347 VEX_W_0F12_P_1,
1348 VEX_W_0F12_P_2,
1349 VEX_W_0F12_P_3,
1350 VEX_W_0F13_M_0,
1351 VEX_W_0F14,
1352 VEX_W_0F15,
1353 VEX_W_0F16_P_0_M_0,
1354 VEX_W_0F16_P_0_M_1,
1355 VEX_W_0F16_P_1,
1356 VEX_W_0F16_P_2,
1357 VEX_W_0F17_M_0,
1358 VEX_W_0F28,
1359 VEX_W_0F29,
1360 VEX_W_0F2B_M_0,
1361 VEX_W_0F2E_P_0,
1362 VEX_W_0F2E_P_2,
1363 VEX_W_0F2F_P_0,
1364 VEX_W_0F2F_P_2,
1365 VEX_W_0F50_M_0,
1366 VEX_W_0F51_P_0,
1367 VEX_W_0F51_P_1,
1368 VEX_W_0F51_P_2,
1369 VEX_W_0F51_P_3,
1370 VEX_W_0F52_P_0,
1371 VEX_W_0F52_P_1,
1372 VEX_W_0F53_P_0,
1373 VEX_W_0F53_P_1,
1374 VEX_W_0F58_P_0,
1375 VEX_W_0F58_P_1,
1376 VEX_W_0F58_P_2,
1377 VEX_W_0F58_P_3,
1378 VEX_W_0F59_P_0,
1379 VEX_W_0F59_P_1,
1380 VEX_W_0F59_P_2,
1381 VEX_W_0F59_P_3,
1382 VEX_W_0F5A_P_0,
1383 VEX_W_0F5A_P_1,
1384 VEX_W_0F5A_P_3,
1385 VEX_W_0F5B_P_0,
1386 VEX_W_0F5B_P_1,
1387 VEX_W_0F5B_P_2,
1388 VEX_W_0F5C_P_0,
1389 VEX_W_0F5C_P_1,
1390 VEX_W_0F5C_P_2,
1391 VEX_W_0F5C_P_3,
1392 VEX_W_0F5D_P_0,
1393 VEX_W_0F5D_P_1,
1394 VEX_W_0F5D_P_2,
1395 VEX_W_0F5D_P_3,
1396 VEX_W_0F5E_P_0,
1397 VEX_W_0F5E_P_1,
1398 VEX_W_0F5E_P_2,
1399 VEX_W_0F5E_P_3,
1400 VEX_W_0F5F_P_0,
1401 VEX_W_0F5F_P_1,
1402 VEX_W_0F5F_P_2,
1403 VEX_W_0F5F_P_3,
1404 VEX_W_0F60_P_2,
1405 VEX_W_0F61_P_2,
1406 VEX_W_0F62_P_2,
1407 VEX_W_0F63_P_2,
1408 VEX_W_0F64_P_2,
1409 VEX_W_0F65_P_2,
1410 VEX_W_0F66_P_2,
1411 VEX_W_0F67_P_2,
1412 VEX_W_0F68_P_2,
1413 VEX_W_0F69_P_2,
1414 VEX_W_0F6A_P_2,
1415 VEX_W_0F6B_P_2,
1416 VEX_W_0F6C_P_2,
1417 VEX_W_0F6D_P_2,
1418 VEX_W_0F6F_P_1,
1419 VEX_W_0F6F_P_2,
1420 VEX_W_0F70_P_1,
1421 VEX_W_0F70_P_2,
1422 VEX_W_0F70_P_3,
1423 VEX_W_0F71_R_2_P_2,
1424 VEX_W_0F71_R_4_P_2,
1425 VEX_W_0F71_R_6_P_2,
1426 VEX_W_0F72_R_2_P_2,
1427 VEX_W_0F72_R_4_P_2,
1428 VEX_W_0F72_R_6_P_2,
1429 VEX_W_0F73_R_2_P_2,
1430 VEX_W_0F73_R_3_P_2,
1431 VEX_W_0F73_R_6_P_2,
1432 VEX_W_0F73_R_7_P_2,
1433 VEX_W_0F74_P_2,
1434 VEX_W_0F75_P_2,
1435 VEX_W_0F76_P_2,
1436 VEX_W_0F77_P_0,
1437 VEX_W_0F7C_P_2,
1438 VEX_W_0F7C_P_3,
1439 VEX_W_0F7D_P_2,
1440 VEX_W_0F7D_P_3,
1441 VEX_W_0F7E_P_1,
1442 VEX_W_0F7F_P_1,
1443 VEX_W_0F7F_P_2,
1444 VEX_W_0FAE_R_2_M_0,
1445 VEX_W_0FAE_R_3_M_0,
1446 VEX_W_0FC2_P_0,
1447 VEX_W_0FC2_P_1,
1448 VEX_W_0FC2_P_2,
1449 VEX_W_0FC2_P_3,
1450 VEX_W_0FC4_P_2,
1451 VEX_W_0FC5_P_2,
1452 VEX_W_0FD0_P_2,
1453 VEX_W_0FD0_P_3,
1454 VEX_W_0FD1_P_2,
1455 VEX_W_0FD2_P_2,
1456 VEX_W_0FD3_P_2,
1457 VEX_W_0FD4_P_2,
1458 VEX_W_0FD5_P_2,
1459 VEX_W_0FD6_P_2,
1460 VEX_W_0FD7_P_2_M_1,
1461 VEX_W_0FD8_P_2,
1462 VEX_W_0FD9_P_2,
1463 VEX_W_0FDA_P_2,
1464 VEX_W_0FDB_P_2,
1465 VEX_W_0FDC_P_2,
1466 VEX_W_0FDD_P_2,
1467 VEX_W_0FDE_P_2,
1468 VEX_W_0FDF_P_2,
1469 VEX_W_0FE0_P_2,
1470 VEX_W_0FE1_P_2,
1471 VEX_W_0FE2_P_2,
1472 VEX_W_0FE3_P_2,
1473 VEX_W_0FE4_P_2,
1474 VEX_W_0FE5_P_2,
1475 VEX_W_0FE6_P_1,
1476 VEX_W_0FE6_P_2,
1477 VEX_W_0FE6_P_3,
1478 VEX_W_0FE7_P_2_M_0,
1479 VEX_W_0FE8_P_2,
1480 VEX_W_0FE9_P_2,
1481 VEX_W_0FEA_P_2,
1482 VEX_W_0FEB_P_2,
1483 VEX_W_0FEC_P_2,
1484 VEX_W_0FED_P_2,
1485 VEX_W_0FEE_P_2,
1486 VEX_W_0FEF_P_2,
1487 VEX_W_0FF0_P_3_M_0,
1488 VEX_W_0FF1_P_2,
1489 VEX_W_0FF2_P_2,
1490 VEX_W_0FF3_P_2,
1491 VEX_W_0FF4_P_2,
1492 VEX_W_0FF5_P_2,
1493 VEX_W_0FF6_P_2,
1494 VEX_W_0FF7_P_2,
1495 VEX_W_0FF8_P_2,
1496 VEX_W_0FF9_P_2,
1497 VEX_W_0FFA_P_2,
1498 VEX_W_0FFB_P_2,
1499 VEX_W_0FFC_P_2,
1500 VEX_W_0FFD_P_2,
1501 VEX_W_0FFE_P_2,
1502 VEX_W_0F3800_P_2,
1503 VEX_W_0F3801_P_2,
1504 VEX_W_0F3802_P_2,
1505 VEX_W_0F3803_P_2,
1506 VEX_W_0F3804_P_2,
1507 VEX_W_0F3805_P_2,
1508 VEX_W_0F3806_P_2,
1509 VEX_W_0F3807_P_2,
1510 VEX_W_0F3808_P_2,
1511 VEX_W_0F3809_P_2,
1512 VEX_W_0F380A_P_2,
1513 VEX_W_0F380B_P_2,
1514 VEX_W_0F380C_P_2,
1515 VEX_W_0F380D_P_2,
1516 VEX_W_0F380E_P_2,
1517 VEX_W_0F380F_P_2,
1518 VEX_W_0F3817_P_2,
1519 VEX_W_0F3818_P_2_M_0,
1520 VEX_W_0F3819_P_2_M_0,
1521 VEX_W_0F381A_P_2_M_0,
1522 VEX_W_0F381C_P_2,
1523 VEX_W_0F381D_P_2,
1524 VEX_W_0F381E_P_2,
1525 VEX_W_0F3820_P_2,
1526 VEX_W_0F3821_P_2,
1527 VEX_W_0F3822_P_2,
1528 VEX_W_0F3823_P_2,
1529 VEX_W_0F3824_P_2,
1530 VEX_W_0F3825_P_2,
1531 VEX_W_0F3828_P_2,
1532 VEX_W_0F3829_P_2,
1533 VEX_W_0F382A_P_2_M_0,
1534 VEX_W_0F382B_P_2,
1535 VEX_W_0F382C_P_2_M_0,
1536 VEX_W_0F382D_P_2_M_0,
1537 VEX_W_0F382E_P_2_M_0,
1538 VEX_W_0F382F_P_2_M_0,
1539 VEX_W_0F3830_P_2,
1540 VEX_W_0F3831_P_2,
1541 VEX_W_0F3832_P_2,
1542 VEX_W_0F3833_P_2,
1543 VEX_W_0F3834_P_2,
1544 VEX_W_0F3835_P_2,
1545 VEX_W_0F3837_P_2,
1546 VEX_W_0F3838_P_2,
1547 VEX_W_0F3839_P_2,
1548 VEX_W_0F383A_P_2,
1549 VEX_W_0F383B_P_2,
1550 VEX_W_0F383C_P_2,
1551 VEX_W_0F383D_P_2,
1552 VEX_W_0F383E_P_2,
1553 VEX_W_0F383F_P_2,
1554 VEX_W_0F3840_P_2,
1555 VEX_W_0F3841_P_2,
1556 VEX_W_0F38DB_P_2,
1557 VEX_W_0F38DC_P_2,
1558 VEX_W_0F38DD_P_2,
1559 VEX_W_0F38DE_P_2,
1560 VEX_W_0F38DF_P_2,
1561 VEX_W_0F3A04_P_2,
1562 VEX_W_0F3A05_P_2,
1563 VEX_W_0F3A06_P_2,
1564 VEX_W_0F3A08_P_2,
1565 VEX_W_0F3A09_P_2,
1566 VEX_W_0F3A0A_P_2,
1567 VEX_W_0F3A0B_P_2,
1568 VEX_W_0F3A0C_P_2,
1569 VEX_W_0F3A0D_P_2,
1570 VEX_W_0F3A0E_P_2,
1571 VEX_W_0F3A0F_P_2,
1572 VEX_W_0F3A14_P_2,
1573 VEX_W_0F3A15_P_2,
1574 VEX_W_0F3A18_P_2,
1575 VEX_W_0F3A19_P_2,
1576 VEX_W_0F3A20_P_2,
1577 VEX_W_0F3A21_P_2,
1578 VEX_W_0F3A40_P_2,
1579 VEX_W_0F3A41_P_2,
1580 VEX_W_0F3A42_P_2,
1581 VEX_W_0F3A44_P_2,
1582 VEX_W_0F3A48_P_2,
1583 VEX_W_0F3A49_P_2,
1584 VEX_W_0F3A4A_P_2,
1585 VEX_W_0F3A4B_P_2,
1586 VEX_W_0F3A4C_P_2,
1587 VEX_W_0F3A60_P_2,
1588 VEX_W_0F3A61_P_2,
1589 VEX_W_0F3A62_P_2,
1590 VEX_W_0F3A63_P_2,
1591 VEX_W_0F3ADF_P_2
1594 typedef void (*op_rtn) (int bytemode, int sizeflag);
1596 struct dis386 {
1597 const char *name;
1598 struct
1600 op_rtn rtn;
1601 int bytemode;
1602 } op[MAX_OPERANDS];
1605 /* Upper case letters in the instruction names here are macros.
1606 'A' => print 'b' if no register operands or suffix_always is true
1607 'B' => print 'b' if suffix_always is true
1608 'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
1609 size prefix
1610 'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
1611 suffix_always is true
1612 'E' => print 'e' if 32-bit form of jcxz
1613 'F' => print 'w' or 'l' depending on address size prefix (loop insns)
1614 'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
1615 'H' => print ",pt" or ",pn" branch hint
1616 'I' => honor following macro letter even in Intel mode (implemented only
1617 for some of the macro letters)
1618 'J' => print 'l'
1619 'K' => print 'd' or 'q' if rex prefix is present.
1620 'L' => print 'l' if suffix_always is true
1621 'M' => print 'r' if intel_mnemonic is false.
1622 'N' => print 'n' if instruction has no wait "prefix"
1623 'O' => print 'd' or 'o' (or 'q' in Intel mode)
1624 'P' => print 'w', 'l' or 'q' if instruction has an operand size prefix,
1625 or suffix_always is true. print 'q' if rex prefix is present.
1626 'Q' => print 'w', 'l' or 'q' for memory operand or suffix_always
1627 is true
1628 'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
1629 'S' => print 'w', 'l' or 'q' if suffix_always is true
1630 'T' => print 'q' in 64bit mode and behave as 'P' otherwise
1631 'U' => print 'q' in 64bit mode and behave as 'Q' otherwise
1632 'V' => print 'q' in 64bit mode and behave as 'S' otherwise
1633 'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
1634 'X' => print 's', 'd' depending on data16 prefix (for XMM)
1635 'Y' => 'q' if instruction has an REX 64bit overwrite prefix and
1636 suffix_always is true.
1637 'Z' => print 'q' in 64bit mode and behave as 'L' otherwise
1638 '!' => change condition from true to false or from false to true.
1639 '%' => add 1 upper case letter to the macro.
1641 2 upper case letter macros:
1642 "XY" => print 'x' or 'y' if no register operands or suffix_always
1643 is true.
1644 "XW" => print 's', 'd' depending on the VEX.W bit (for FMA)
1645 "LQ" => print 'l' ('d' in Intel mode) or 'q' for memory operand
1646 or suffix_always is true
1647 "LB" => print "abs" in 64bit mode and behave as 'B' otherwise
1648 "LS" => print "abs" in 64bit mode and behave as 'S' otherwise
1649 "LV" => print "abs" for 64bit operand and behave as 'S' otherwise
1651 Many of the above letters print nothing in Intel mode. See "putop"
1652 for the details.
1654 Braces '{' and '}', and vertical bars '|', indicate alternative
1655 mnemonic strings for AT&T and Intel. */
1657 static const struct dis386 dis386[] = {
1658 /* 00 */
1659 { "addB", { Eb, Gb } },
1660 { "addS", { Ev, Gv } },
1661 { "addB", { Gb, EbS } },
1662 { "addS", { Gv, EvS } },
1663 { "addB", { AL, Ib } },
1664 { "addS", { eAX, Iv } },
1665 { X86_64_TABLE (X86_64_06) },
1666 { X86_64_TABLE (X86_64_07) },
1667 /* 08 */
1668 { "orB", { Eb, Gb } },
1669 { "orS", { Ev, Gv } },
1670 { "orB", { Gb, EbS } },
1671 { "orS", { Gv, EvS } },
1672 { "orB", { AL, Ib } },
1673 { "orS", { eAX, Iv } },
1674 { X86_64_TABLE (X86_64_0D) },
1675 { Bad_Opcode }, /* 0x0f extended opcode escape */
1676 /* 10 */
1677 { "adcB", { Eb, Gb } },
1678 { "adcS", { Ev, Gv } },
1679 { "adcB", { Gb, EbS } },
1680 { "adcS", { Gv, EvS } },
1681 { "adcB", { AL, Ib } },
1682 { "adcS", { eAX, Iv } },
1683 { X86_64_TABLE (X86_64_16) },
1684 { X86_64_TABLE (X86_64_17) },
1685 /* 18 */
1686 { "sbbB", { Eb, Gb } },
1687 { "sbbS", { Ev, Gv } },
1688 { "sbbB", { Gb, EbS } },
1689 { "sbbS", { Gv, EvS } },
1690 { "sbbB", { AL, Ib } },
1691 { "sbbS", { eAX, Iv } },
1692 { X86_64_TABLE (X86_64_1E) },
1693 { X86_64_TABLE (X86_64_1F) },
1694 /* 20 */
1695 { "andB", { Eb, Gb } },
1696 { "andS", { Ev, Gv } },
1697 { "andB", { Gb, EbS } },
1698 { "andS", { Gv, EvS } },
1699 { "andB", { AL, Ib } },
1700 { "andS", { eAX, Iv } },
1701 { Bad_Opcode }, /* SEG ES prefix */
1702 { X86_64_TABLE (X86_64_27) },
1703 /* 28 */
1704 { "subB", { Eb, Gb } },
1705 { "subS", { Ev, Gv } },
1706 { "subB", { Gb, EbS } },
1707 { "subS", { Gv, EvS } },
1708 { "subB", { AL, Ib } },
1709 { "subS", { eAX, Iv } },
1710 { Bad_Opcode }, /* SEG CS prefix */
1711 { X86_64_TABLE (X86_64_2F) },
1712 /* 30 */
1713 { "xorB", { Eb, Gb } },
1714 { "xorS", { Ev, Gv } },
1715 { "xorB", { Gb, EbS } },
1716 { "xorS", { Gv, EvS } },
1717 { "xorB", { AL, Ib } },
1718 { "xorS", { eAX, Iv } },
1719 { Bad_Opcode }, /* SEG SS prefix */
1720 { X86_64_TABLE (X86_64_37) },
1721 /* 38 */
1722 { "cmpB", { Eb, Gb } },
1723 { "cmpS", { Ev, Gv } },
1724 { "cmpB", { Gb, EbS } },
1725 { "cmpS", { Gv, EvS } },
1726 { "cmpB", { AL, Ib } },
1727 { "cmpS", { eAX, Iv } },
1728 { Bad_Opcode }, /* SEG DS prefix */
1729 { X86_64_TABLE (X86_64_3F) },
1730 /* 40 */
1731 { "inc{S|}", { RMeAX } },
1732 { "inc{S|}", { RMeCX } },
1733 { "inc{S|}", { RMeDX } },
1734 { "inc{S|}", { RMeBX } },
1735 { "inc{S|}", { RMeSP } },
1736 { "inc{S|}", { RMeBP } },
1737 { "inc{S|}", { RMeSI } },
1738 { "inc{S|}", { RMeDI } },
1739 /* 48 */
1740 { "dec{S|}", { RMeAX } },
1741 { "dec{S|}", { RMeCX } },
1742 { "dec{S|}", { RMeDX } },
1743 { "dec{S|}", { RMeBX } },
1744 { "dec{S|}", { RMeSP } },
1745 { "dec{S|}", { RMeBP } },
1746 { "dec{S|}", { RMeSI } },
1747 { "dec{S|}", { RMeDI } },
1748 /* 50 */
1749 { "pushV", { RMrAX } },
1750 { "pushV", { RMrCX } },
1751 { "pushV", { RMrDX } },
1752 { "pushV", { RMrBX } },
1753 { "pushV", { RMrSP } },
1754 { "pushV", { RMrBP } },
1755 { "pushV", { RMrSI } },
1756 { "pushV", { RMrDI } },
1757 /* 58 */
1758 { "popV", { RMrAX } },
1759 { "popV", { RMrCX } },
1760 { "popV", { RMrDX } },
1761 { "popV", { RMrBX } },
1762 { "popV", { RMrSP } },
1763 { "popV", { RMrBP } },
1764 { "popV", { RMrSI } },
1765 { "popV", { RMrDI } },
1766 /* 60 */
1767 { X86_64_TABLE (X86_64_60) },
1768 { X86_64_TABLE (X86_64_61) },
1769 { X86_64_TABLE (X86_64_62) },
1770 { X86_64_TABLE (X86_64_63) },
1771 { Bad_Opcode }, /* seg fs */
1772 { Bad_Opcode }, /* seg gs */
1773 { Bad_Opcode }, /* op size prefix */
1774 { Bad_Opcode }, /* adr size prefix */
1775 /* 68 */
1776 { "pushT", { sIv } },
1777 { "imulS", { Gv, Ev, Iv } },
1778 { "pushT", { sIb } },
1779 { "imulS", { Gv, Ev, sIb } },
1780 { "ins{b|}", { Ybr, indirDX } },
1781 { X86_64_TABLE (X86_64_6D) },
1782 { "outs{b|}", { indirDXr, Xb } },
1783 { X86_64_TABLE (X86_64_6F) },
1784 /* 70 */
1785 { "joH", { Jb, XX, cond_jump_flag } },
1786 { "jnoH", { Jb, XX, cond_jump_flag } },
1787 { "jbH", { Jb, XX, cond_jump_flag } },
1788 { "jaeH", { Jb, XX, cond_jump_flag } },
1789 { "jeH", { Jb, XX, cond_jump_flag } },
1790 { "jneH", { Jb, XX, cond_jump_flag } },
1791 { "jbeH", { Jb, XX, cond_jump_flag } },
1792 { "jaH", { Jb, XX, cond_jump_flag } },
1793 /* 78 */
1794 { "jsH", { Jb, XX, cond_jump_flag } },
1795 { "jnsH", { Jb, XX, cond_jump_flag } },
1796 { "jpH", { Jb, XX, cond_jump_flag } },
1797 { "jnpH", { Jb, XX, cond_jump_flag } },
1798 { "jlH", { Jb, XX, cond_jump_flag } },
1799 { "jgeH", { Jb, XX, cond_jump_flag } },
1800 { "jleH", { Jb, XX, cond_jump_flag } },
1801 { "jgH", { Jb, XX, cond_jump_flag } },
1802 /* 80 */
1803 { REG_TABLE (REG_80) },
1804 { REG_TABLE (REG_81) },
1805 { Bad_Opcode },
1806 { REG_TABLE (REG_82) },
1807 { "testB", { Eb, Gb } },
1808 { "testS", { Ev, Gv } },
1809 { "xchgB", { Eb, Gb } },
1810 { "xchgS", { Ev, Gv } },
1811 /* 88 */
1812 { "movB", { Eb, Gb } },
1813 { "movS", { Ev, Gv } },
1814 { "movB", { Gb, EbS } },
1815 { "movS", { Gv, EvS } },
1816 { "movD", { Sv, Sw } },
1817 { MOD_TABLE (MOD_8D) },
1818 { "movD", { Sw, Sv } },
1819 { REG_TABLE (REG_8F) },
1820 /* 90 */
1821 { PREFIX_TABLE (PREFIX_90) },
1822 { "xchgS", { RMeCX, eAX } },
1823 { "xchgS", { RMeDX, eAX } },
1824 { "xchgS", { RMeBX, eAX } },
1825 { "xchgS", { RMeSP, eAX } },
1826 { "xchgS", { RMeBP, eAX } },
1827 { "xchgS", { RMeSI, eAX } },
1828 { "xchgS", { RMeDI, eAX } },
1829 /* 98 */
1830 { "cW{t|}R", { XX } },
1831 { "cR{t|}O", { XX } },
1832 { X86_64_TABLE (X86_64_9A) },
1833 { Bad_Opcode }, /* fwait */
1834 { "pushfT", { XX } },
1835 { "popfT", { XX } },
1836 { "sahf", { XX } },
1837 { "lahf", { XX } },
1838 /* a0 */
1839 { "mov%LB", { AL, Ob } },
1840 { "mov%LS", { eAX, Ov } },
1841 { "mov%LB", { Ob, AL } },
1842 { "mov%LS", { Ov, eAX } },
1843 { "movs{b|}", { Ybr, Xb } },
1844 { "movs{R|}", { Yvr, Xv } },
1845 { "cmps{b|}", { Xb, Yb } },
1846 { "cmps{R|}", { Xv, Yv } },
1847 /* a8 */
1848 { "testB", { AL, Ib } },
1849 { "testS", { eAX, Iv } },
1850 { "stosB", { Ybr, AL } },
1851 { "stosS", { Yvr, eAX } },
1852 { "lodsB", { ALr, Xb } },
1853 { "lodsS", { eAXr, Xv } },
1854 { "scasB", { AL, Yb } },
1855 { "scasS", { eAX, Yv } },
1856 /* b0 */
1857 { "movB", { RMAL, Ib } },
1858 { "movB", { RMCL, Ib } },
1859 { "movB", { RMDL, Ib } },
1860 { "movB", { RMBL, Ib } },
1861 { "movB", { RMAH, Ib } },
1862 { "movB", { RMCH, Ib } },
1863 { "movB", { RMDH, Ib } },
1864 { "movB", { RMBH, Ib } },
1865 /* b8 */
1866 { "mov%LV", { RMeAX, Iv64 } },
1867 { "mov%LV", { RMeCX, Iv64 } },
1868 { "mov%LV", { RMeDX, Iv64 } },
1869 { "mov%LV", { RMeBX, Iv64 } },
1870 { "mov%LV", { RMeSP, Iv64 } },
1871 { "mov%LV", { RMeBP, Iv64 } },
1872 { "mov%LV", { RMeSI, Iv64 } },
1873 { "mov%LV", { RMeDI, Iv64 } },
1874 /* c0 */
1875 { REG_TABLE (REG_C0) },
1876 { REG_TABLE (REG_C1) },
1877 { "retT", { Iw } },
1878 { "retT", { XX } },
1879 { X86_64_TABLE (X86_64_C4) },
1880 { X86_64_TABLE (X86_64_C5) },
1881 { REG_TABLE (REG_C6) },
1882 { REG_TABLE (REG_C7) },
1883 /* c8 */
1884 { "enterT", { Iw, Ib } },
1885 { "leaveT", { XX } },
1886 { "Jret{|f}P", { Iw } },
1887 { "Jret{|f}P", { XX } },
1888 { "int3", { XX } },
1889 { "int", { Ib } },
1890 { X86_64_TABLE (X86_64_CE) },
1891 { "iretP", { XX } },
1892 /* d0 */
1893 { REG_TABLE (REG_D0) },
1894 { REG_TABLE (REG_D1) },
1895 { REG_TABLE (REG_D2) },
1896 { REG_TABLE (REG_D3) },
1897 { X86_64_TABLE (X86_64_D4) },
1898 { X86_64_TABLE (X86_64_D5) },
1899 { Bad_Opcode },
1900 { "xlat", { DSBX } },
1901 /* d8 */
1902 { FLOAT },
1903 { FLOAT },
1904 { FLOAT },
1905 { FLOAT },
1906 { FLOAT },
1907 { FLOAT },
1908 { FLOAT },
1909 { FLOAT },
1910 /* e0 */
1911 { "loopneFH", { Jb, XX, loop_jcxz_flag } },
1912 { "loopeFH", { Jb, XX, loop_jcxz_flag } },
1913 { "loopFH", { Jb, XX, loop_jcxz_flag } },
1914 { "jEcxzH", { Jb, XX, loop_jcxz_flag } },
1915 { "inB", { AL, Ib } },
1916 { "inG", { zAX, Ib } },
1917 { "outB", { Ib, AL } },
1918 { "outG", { Ib, zAX } },
1919 /* e8 */
1920 { "callT", { Jv } },
1921 { "jmpT", { Jv } },
1922 { X86_64_TABLE (X86_64_EA) },
1923 { "jmp", { Jb } },
1924 { "inB", { AL, indirDX } },
1925 { "inG", { zAX, indirDX } },
1926 { "outB", { indirDX, AL } },
1927 { "outG", { indirDX, zAX } },
1928 /* f0 */
1929 { Bad_Opcode }, /* lock prefix */
1930 { "icebp", { XX } },
1931 { Bad_Opcode }, /* repne */
1932 { Bad_Opcode }, /* repz */
1933 { "hlt", { XX } },
1934 { "cmc", { XX } },
1935 { REG_TABLE (REG_F6) },
1936 { REG_TABLE (REG_F7) },
1937 /* f8 */
1938 { "clc", { XX } },
1939 { "stc", { XX } },
1940 { "cli", { XX } },
1941 { "sti", { XX } },
1942 { "cld", { XX } },
1943 { "std", { XX } },
1944 { REG_TABLE (REG_FE) },
1945 { REG_TABLE (REG_FF) },
1948 static const struct dis386 dis386_twobyte[] = {
1949 /* 00 */
1950 { REG_TABLE (REG_0F00 ) },
1951 { REG_TABLE (REG_0F01 ) },
1952 { "larS", { Gv, Ew } },
1953 { "lslS", { Gv, Ew } },
1954 { Bad_Opcode },
1955 { "syscall", { XX } },
1956 { "clts", { XX } },
1957 { "sysretP", { XX } },
1958 /* 08 */
1959 { "invd", { XX } },
1960 { "wbinvd", { XX } },
1961 { Bad_Opcode },
1962 { "ud2", { XX } },
1963 { Bad_Opcode },
1964 { REG_TABLE (REG_0F0D) },
1965 { "femms", { XX } },
1966 { "", { MX, EM, OPSUF } }, /* See OP_3DNowSuffix. */
1967 /* 10 */
1968 { PREFIX_TABLE (PREFIX_0F10) },
1969 { PREFIX_TABLE (PREFIX_0F11) },
1970 { PREFIX_TABLE (PREFIX_0F12) },
1971 { MOD_TABLE (MOD_0F13) },
1972 { "unpcklpX", { XM, EXx } },
1973 { "unpckhpX", { XM, EXx } },
1974 { PREFIX_TABLE (PREFIX_0F16) },
1975 { MOD_TABLE (MOD_0F17) },
1976 /* 18 */
1977 { REG_TABLE (REG_0F18) },
1978 { "nopQ", { Ev } },
1979 { "nopQ", { Ev } },
1980 { "nopQ", { Ev } },
1981 { "nopQ", { Ev } },
1982 { "nopQ", { Ev } },
1983 { "nopQ", { Ev } },
1984 { "nopQ", { Ev } },
1985 /* 20 */
1986 { MOD_TABLE (MOD_0F20) },
1987 { MOD_TABLE (MOD_0F21) },
1988 { MOD_TABLE (MOD_0F22) },
1989 { MOD_TABLE (MOD_0F23) },
1990 { MOD_TABLE (MOD_0F24) },
1991 { Bad_Opcode },
1992 { MOD_TABLE (MOD_0F26) },
1993 { Bad_Opcode },
1994 /* 28 */
1995 { "movapX", { XM, EXx } },
1996 { "movapX", { EXxS, XM } },
1997 { PREFIX_TABLE (PREFIX_0F2A) },
1998 { PREFIX_TABLE (PREFIX_0F2B) },
1999 { PREFIX_TABLE (PREFIX_0F2C) },
2000 { PREFIX_TABLE (PREFIX_0F2D) },
2001 { PREFIX_TABLE (PREFIX_0F2E) },
2002 { PREFIX_TABLE (PREFIX_0F2F) },
2003 /* 30 */
2004 { "wrmsr", { XX } },
2005 { "rdtsc", { XX } },
2006 { "rdmsr", { XX } },
2007 { "rdpmc", { XX } },
2008 { "sysenter", { XX } },
2009 { "sysexit", { XX } },
2010 { Bad_Opcode },
2011 { "getsec", { XX } },
2012 /* 38 */
2013 { THREE_BYTE_TABLE (THREE_BYTE_0F38) },
2014 { Bad_Opcode },
2015 { THREE_BYTE_TABLE (THREE_BYTE_0F3A) },
2016 { Bad_Opcode },
2017 { Bad_Opcode },
2018 { Bad_Opcode },
2019 { Bad_Opcode },
2020 { Bad_Opcode },
2021 /* 40 */
2022 { "cmovoS", { Gv, Ev } },
2023 { "cmovnoS", { Gv, Ev } },
2024 { "cmovbS", { Gv, Ev } },
2025 { "cmovaeS", { Gv, Ev } },
2026 { "cmoveS", { Gv, Ev } },
2027 { "cmovneS", { Gv, Ev } },
2028 { "cmovbeS", { Gv, Ev } },
2029 { "cmovaS", { Gv, Ev } },
2030 /* 48 */
2031 { "cmovsS", { Gv, Ev } },
2032 { "cmovnsS", { Gv, Ev } },
2033 { "cmovpS", { Gv, Ev } },
2034 { "cmovnpS", { Gv, Ev } },
2035 { "cmovlS", { Gv, Ev } },
2036 { "cmovgeS", { Gv, Ev } },
2037 { "cmovleS", { Gv, Ev } },
2038 { "cmovgS", { Gv, Ev } },
2039 /* 50 */
2040 { MOD_TABLE (MOD_0F51) },
2041 { PREFIX_TABLE (PREFIX_0F51) },
2042 { PREFIX_TABLE (PREFIX_0F52) },
2043 { PREFIX_TABLE (PREFIX_0F53) },
2044 { "andpX", { XM, EXx } },
2045 { "andnpX", { XM, EXx } },
2046 { "orpX", { XM, EXx } },
2047 { "xorpX", { XM, EXx } },
2048 /* 58 */
2049 { PREFIX_TABLE (PREFIX_0F58) },
2050 { PREFIX_TABLE (PREFIX_0F59) },
2051 { PREFIX_TABLE (PREFIX_0F5A) },
2052 { PREFIX_TABLE (PREFIX_0F5B) },
2053 { PREFIX_TABLE (PREFIX_0F5C) },
2054 { PREFIX_TABLE (PREFIX_0F5D) },
2055 { PREFIX_TABLE (PREFIX_0F5E) },
2056 { PREFIX_TABLE (PREFIX_0F5F) },
2057 /* 60 */
2058 { PREFIX_TABLE (PREFIX_0F60) },
2059 { PREFIX_TABLE (PREFIX_0F61) },
2060 { PREFIX_TABLE (PREFIX_0F62) },
2061 { "packsswb", { MX, EM } },
2062 { "pcmpgtb", { MX, EM } },
2063 { "pcmpgtw", { MX, EM } },
2064 { "pcmpgtd", { MX, EM } },
2065 { "packuswb", { MX, EM } },
2066 /* 68 */
2067 { "punpckhbw", { MX, EM } },
2068 { "punpckhwd", { MX, EM } },
2069 { "punpckhdq", { MX, EM } },
2070 { "packssdw", { MX, EM } },
2071 { PREFIX_TABLE (PREFIX_0F6C) },
2072 { PREFIX_TABLE (PREFIX_0F6D) },
2073 { "movK", { MX, Edq } },
2074 { PREFIX_TABLE (PREFIX_0F6F) },
2075 /* 70 */
2076 { PREFIX_TABLE (PREFIX_0F70) },
2077 { REG_TABLE (REG_0F71) },
2078 { REG_TABLE (REG_0F72) },
2079 { REG_TABLE (REG_0F73) },
2080 { "pcmpeqb", { MX, EM } },
2081 { "pcmpeqw", { MX, EM } },
2082 { "pcmpeqd", { MX, EM } },
2083 { "emms", { XX } },
2084 /* 78 */
2085 { PREFIX_TABLE (PREFIX_0F78) },
2086 { PREFIX_TABLE (PREFIX_0F79) },
2087 { THREE_BYTE_TABLE (THREE_BYTE_0F7A) },
2088 { Bad_Opcode },
2089 { PREFIX_TABLE (PREFIX_0F7C) },
2090 { PREFIX_TABLE (PREFIX_0F7D) },
2091 { PREFIX_TABLE (PREFIX_0F7E) },
2092 { PREFIX_TABLE (PREFIX_0F7F) },
2093 /* 80 */
2094 { "joH", { Jv, XX, cond_jump_flag } },
2095 { "jnoH", { Jv, XX, cond_jump_flag } },
2096 { "jbH", { Jv, XX, cond_jump_flag } },
2097 { "jaeH", { Jv, XX, cond_jump_flag } },
2098 { "jeH", { Jv, XX, cond_jump_flag } },
2099 { "jneH", { Jv, XX, cond_jump_flag } },
2100 { "jbeH", { Jv, XX, cond_jump_flag } },
2101 { "jaH", { Jv, XX, cond_jump_flag } },
2102 /* 88 */
2103 { "jsH", { Jv, XX, cond_jump_flag } },
2104 { "jnsH", { Jv, XX, cond_jump_flag } },
2105 { "jpH", { Jv, XX, cond_jump_flag } },
2106 { "jnpH", { Jv, XX, cond_jump_flag } },
2107 { "jlH", { Jv, XX, cond_jump_flag } },
2108 { "jgeH", { Jv, XX, cond_jump_flag } },
2109 { "jleH", { Jv, XX, cond_jump_flag } },
2110 { "jgH", { Jv, XX, cond_jump_flag } },
2111 /* 90 */
2112 { "seto", { Eb } },
2113 { "setno", { Eb } },
2114 { "setb", { Eb } },
2115 { "setae", { Eb } },
2116 { "sete", { Eb } },
2117 { "setne", { Eb } },
2118 { "setbe", { Eb } },
2119 { "seta", { Eb } },
2120 /* 98 */
2121 { "sets", { Eb } },
2122 { "setns", { Eb } },
2123 { "setp", { Eb } },
2124 { "setnp", { Eb } },
2125 { "setl", { Eb } },
2126 { "setge", { Eb } },
2127 { "setle", { Eb } },
2128 { "setg", { Eb } },
2129 /* a0 */
2130 { "pushT", { fs } },
2131 { "popT", { fs } },
2132 { "cpuid", { XX } },
2133 { "btS", { Ev, Gv } },
2134 { "shldS", { Ev, Gv, Ib } },
2135 { "shldS", { Ev, Gv, CL } },
2136 { REG_TABLE (REG_0FA6) },
2137 { REG_TABLE (REG_0FA7) },
2138 /* a8 */
2139 { "pushT", { gs } },
2140 { "popT", { gs } },
2141 { "rsm", { XX } },
2142 { "btsS", { Ev, Gv } },
2143 { "shrdS", { Ev, Gv, Ib } },
2144 { "shrdS", { Ev, Gv, CL } },
2145 { REG_TABLE (REG_0FAE) },
2146 { "imulS", { Gv, Ev } },
2147 /* b0 */
2148 { "cmpxchgB", { Eb, Gb } },
2149 { "cmpxchgS", { Ev, Gv } },
2150 { MOD_TABLE (MOD_0FB2) },
2151 { "btrS", { Ev, Gv } },
2152 { MOD_TABLE (MOD_0FB4) },
2153 { MOD_TABLE (MOD_0FB5) },
2154 { "movz{bR|x}", { Gv, Eb } },
2155 { "movz{wR|x}", { Gv, Ew } }, /* yes, there really is movzww ! */
2156 /* b8 */
2157 { PREFIX_TABLE (PREFIX_0FB8) },
2158 { "ud1", { XX } },
2159 { REG_TABLE (REG_0FBA) },
2160 { "btcS", { Ev, Gv } },
2161 { "bsfS", { Gv, Ev } },
2162 { PREFIX_TABLE (PREFIX_0FBD) },
2163 { "movs{bR|x}", { Gv, Eb } },
2164 { "movs{wR|x}", { Gv, Ew } }, /* yes, there really is movsww ! */
2165 /* c0 */
2166 { "xaddB", { Eb, Gb } },
2167 { "xaddS", { Ev, Gv } },
2168 { PREFIX_TABLE (PREFIX_0FC2) },
2169 { PREFIX_TABLE (PREFIX_0FC3) },
2170 { "pinsrw", { MX, Edqw, Ib } },
2171 { "pextrw", { Gdq, MS, Ib } },
2172 { "shufpX", { XM, EXx, Ib } },
2173 { REG_TABLE (REG_0FC7) },
2174 /* c8 */
2175 { "bswap", { RMeAX } },
2176 { "bswap", { RMeCX } },
2177 { "bswap", { RMeDX } },
2178 { "bswap", { RMeBX } },
2179 { "bswap", { RMeSP } },
2180 { "bswap", { RMeBP } },
2181 { "bswap", { RMeSI } },
2182 { "bswap", { RMeDI } },
2183 /* d0 */
2184 { PREFIX_TABLE (PREFIX_0FD0) },
2185 { "psrlw", { MX, EM } },
2186 { "psrld", { MX, EM } },
2187 { "psrlq", { MX, EM } },
2188 { "paddq", { MX, EM } },
2189 { "pmullw", { MX, EM } },
2190 { PREFIX_TABLE (PREFIX_0FD6) },
2191 { MOD_TABLE (MOD_0FD7) },
2192 /* d8 */
2193 { "psubusb", { MX, EM } },
2194 { "psubusw", { MX, EM } },
2195 { "pminub", { MX, EM } },
2196 { "pand", { MX, EM } },
2197 { "paddusb", { MX, EM } },
2198 { "paddusw", { MX, EM } },
2199 { "pmaxub", { MX, EM } },
2200 { "pandn", { MX, EM } },
2201 /* e0 */
2202 { "pavgb", { MX, EM } },
2203 { "psraw", { MX, EM } },
2204 { "psrad", { MX, EM } },
2205 { "pavgw", { MX, EM } },
2206 { "pmulhuw", { MX, EM } },
2207 { "pmulhw", { MX, EM } },
2208 { PREFIX_TABLE (PREFIX_0FE6) },
2209 { PREFIX_TABLE (PREFIX_0FE7) },
2210 /* e8 */
2211 { "psubsb", { MX, EM } },
2212 { "psubsw", { MX, EM } },
2213 { "pminsw", { MX, EM } },
2214 { "por", { MX, EM } },
2215 { "paddsb", { MX, EM } },
2216 { "paddsw", { MX, EM } },
2217 { "pmaxsw", { MX, EM } },
2218 { "pxor", { MX, EM } },
2219 /* f0 */
2220 { PREFIX_TABLE (PREFIX_0FF0) },
2221 { "psllw", { MX, EM } },
2222 { "pslld", { MX, EM } },
2223 { "psllq", { MX, EM } },
2224 { "pmuludq", { MX, EM } },
2225 { "pmaddwd", { MX, EM } },
2226 { "psadbw", { MX, EM } },
2227 { PREFIX_TABLE (PREFIX_0FF7) },
2228 /* f8 */
2229 { "psubb", { MX, EM } },
2230 { "psubw", { MX, EM } },
2231 { "psubd", { MX, EM } },
2232 { "psubq", { MX, EM } },
2233 { "paddb", { MX, EM } },
2234 { "paddw", { MX, EM } },
2235 { "paddd", { MX, EM } },
2236 { Bad_Opcode },
2239 static const unsigned char onebyte_has_modrm[256] = {
2240 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2241 /* ------------------------------- */
2242 /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
2243 /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
2244 /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
2245 /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
2246 /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
2247 /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
2248 /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
2249 /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
2250 /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
2251 /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
2252 /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
2253 /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
2254 /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
2255 /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
2256 /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
2257 /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1 /* f0 */
2258 /* ------------------------------- */
2259 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2262 static const unsigned char twobyte_has_modrm[256] = {
2263 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2264 /* ------------------------------- */
2265 /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
2266 /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
2267 /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
2268 /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
2269 /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
2270 /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
2271 /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
2272 /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
2273 /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
2274 /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
2275 /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
2276 /* b0 */ 1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1, /* bf */
2277 /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
2278 /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
2279 /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
2280 /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0 /* ff */
2281 /* ------------------------------- */
2282 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2285 static char obuf[100];
2286 static char *obufp;
2287 static char *mnemonicendp;
2288 static char scratchbuf[100];
2289 static unsigned char *start_codep;
2290 static unsigned char *insn_codep;
2291 static unsigned char *codep;
2292 static int last_lock_prefix;
2293 static int last_repz_prefix;
2294 static int last_repnz_prefix;
2295 static int last_data_prefix;
2296 static int last_addr_prefix;
2297 static int last_rex_prefix;
2298 static int last_seg_prefix;
2299 #define MAX_CODE_LENGTH 15
2300 /* We can up to 14 prefixes since the maximum instruction length is
2301 15bytes. */
2302 static int all_prefixes[MAX_CODE_LENGTH - 1];
2303 static disassemble_info *the_info;
2304 static struct
2306 int mod;
2307 int reg;
2308 int rm;
2310 modrm;
2311 static unsigned char need_modrm;
2312 static struct
2314 int scale;
2315 int index;
2316 int base;
2318 sib;
2319 static struct
2321 int register_specifier;
2322 int length;
2323 int prefix;
2324 int w;
2326 vex;
2327 static unsigned char need_vex;
2328 static unsigned char need_vex_reg;
2329 static unsigned char vex_w_done;
2331 struct op
2333 const char *name;
2334 unsigned int len;
2337 /* If we are accessing mod/rm/reg without need_modrm set, then the
2338 values are stale. Hitting this abort likely indicates that you
2339 need to update onebyte_has_modrm or twobyte_has_modrm. */
2340 #define MODRM_CHECK if (!need_modrm) abort ()
2342 static const char **names64;
2343 static const char **names32;
2344 static const char **names16;
2345 static const char **names8;
2346 static const char **names8rex;
2347 static const char **names_seg;
2348 static const char *index64;
2349 static const char *index32;
2350 static const char **index16;
2352 static const char *intel_names64[] = {
2353 "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
2354 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2356 static const char *intel_names32[] = {
2357 "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
2358 "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
2360 static const char *intel_names16[] = {
2361 "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
2362 "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
2364 static const char *intel_names8[] = {
2365 "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
2367 static const char *intel_names8rex[] = {
2368 "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
2369 "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
2371 static const char *intel_names_seg[] = {
2372 "es", "cs", "ss", "ds", "fs", "gs", "?", "?",
2374 static const char *intel_index64 = "riz";
2375 static const char *intel_index32 = "eiz";
2376 static const char *intel_index16[] = {
2377 "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
2380 static const char *att_names64[] = {
2381 "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
2382 "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
2384 static const char *att_names32[] = {
2385 "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
2386 "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
2388 static const char *att_names16[] = {
2389 "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
2390 "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
2392 static const char *att_names8[] = {
2393 "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
2395 static const char *att_names8rex[] = {
2396 "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
2397 "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
2399 static const char *att_names_seg[] = {
2400 "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
2402 static const char *att_index64 = "%riz";
2403 static const char *att_index32 = "%eiz";
2404 static const char *att_index16[] = {
2405 "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
2408 static const char **names_mm;
2409 static const char *intel_names_mm[] = {
2410 "mm0", "mm1", "mm2", "mm3",
2411 "mm4", "mm5", "mm6", "mm7"
2413 static const char *att_names_mm[] = {
2414 "%mm0", "%mm1", "%mm2", "%mm3",
2415 "%mm4", "%mm5", "%mm6", "%mm7"
2418 static const char **names_xmm;
2419 static const char *intel_names_xmm[] = {
2420 "xmm0", "xmm1", "xmm2", "xmm3",
2421 "xmm4", "xmm5", "xmm6", "xmm7",
2422 "xmm8", "xmm9", "xmm10", "xmm11",
2423 "xmm12", "xmm13", "xmm14", "xmm15"
2425 static const char *att_names_xmm[] = {
2426 "%xmm0", "%xmm1", "%xmm2", "%xmm3",
2427 "%xmm4", "%xmm5", "%xmm6", "%xmm7",
2428 "%xmm8", "%xmm9", "%xmm10", "%xmm11",
2429 "%xmm12", "%xmm13", "%xmm14", "%xmm15"
2432 static const char **names_ymm;
2433 static const char *intel_names_ymm[] = {
2434 "ymm0", "ymm1", "ymm2", "ymm3",
2435 "ymm4", "ymm5", "ymm6", "ymm7",
2436 "ymm8", "ymm9", "ymm10", "ymm11",
2437 "ymm12", "ymm13", "ymm14", "ymm15"
2439 static const char *att_names_ymm[] = {
2440 "%ymm0", "%ymm1", "%ymm2", "%ymm3",
2441 "%ymm4", "%ymm5", "%ymm6", "%ymm7",
2442 "%ymm8", "%ymm9", "%ymm10", "%ymm11",
2443 "%ymm12", "%ymm13", "%ymm14", "%ymm15"
2446 static const struct dis386 reg_table[][8] = {
2447 /* REG_80 */
2449 { "addA", { Eb, Ib } },
2450 { "orA", { Eb, Ib } },
2451 { "adcA", { Eb, Ib } },
2452 { "sbbA", { Eb, Ib } },
2453 { "andA", { Eb, Ib } },
2454 { "subA", { Eb, Ib } },
2455 { "xorA", { Eb, Ib } },
2456 { "cmpA", { Eb, Ib } },
2458 /* REG_81 */
2460 { "addQ", { Ev, Iv } },
2461 { "orQ", { Ev, Iv } },
2462 { "adcQ", { Ev, Iv } },
2463 { "sbbQ", { Ev, Iv } },
2464 { "andQ", { Ev, Iv } },
2465 { "subQ", { Ev, Iv } },
2466 { "xorQ", { Ev, Iv } },
2467 { "cmpQ", { Ev, Iv } },
2469 /* REG_82 */
2471 { "addQ", { Ev, sIb } },
2472 { "orQ", { Ev, sIb } },
2473 { "adcQ", { Ev, sIb } },
2474 { "sbbQ", { Ev, sIb } },
2475 { "andQ", { Ev, sIb } },
2476 { "subQ", { Ev, sIb } },
2477 { "xorQ", { Ev, sIb } },
2478 { "cmpQ", { Ev, sIb } },
2480 /* REG_8F */
2482 { "popU", { stackEv } },
2483 { XOP_8F_TABLE (XOP_09) },
2484 { Bad_Opcode },
2485 { Bad_Opcode },
2486 { Bad_Opcode },
2487 { XOP_8F_TABLE (XOP_09) },
2489 /* REG_C0 */
2491 { "rolA", { Eb, Ib } },
2492 { "rorA", { Eb, Ib } },
2493 { "rclA", { Eb, Ib } },
2494 { "rcrA", { Eb, Ib } },
2495 { "shlA", { Eb, Ib } },
2496 { "shrA", { Eb, Ib } },
2497 { Bad_Opcode },
2498 { "sarA", { Eb, Ib } },
2500 /* REG_C1 */
2502 { "rolQ", { Ev, Ib } },
2503 { "rorQ", { Ev, Ib } },
2504 { "rclQ", { Ev, Ib } },
2505 { "rcrQ", { Ev, Ib } },
2506 { "shlQ", { Ev, Ib } },
2507 { "shrQ", { Ev, Ib } },
2508 { Bad_Opcode },
2509 { "sarQ", { Ev, Ib } },
2511 /* REG_C6 */
2513 { "movA", { Eb, Ib } },
2515 /* REG_C7 */
2517 { "movQ", { Ev, Iv } },
2519 /* REG_D0 */
2521 { "rolA", { Eb, I1 } },
2522 { "rorA", { Eb, I1 } },
2523 { "rclA", { Eb, I1 } },
2524 { "rcrA", { Eb, I1 } },
2525 { "shlA", { Eb, I1 } },
2526 { "shrA", { Eb, I1 } },
2527 { Bad_Opcode },
2528 { "sarA", { Eb, I1 } },
2530 /* REG_D1 */
2532 { "rolQ", { Ev, I1 } },
2533 { "rorQ", { Ev, I1 } },
2534 { "rclQ", { Ev, I1 } },
2535 { "rcrQ", { Ev, I1 } },
2536 { "shlQ", { Ev, I1 } },
2537 { "shrQ", { Ev, I1 } },
2538 { Bad_Opcode },
2539 { "sarQ", { Ev, I1 } },
2541 /* REG_D2 */
2543 { "rolA", { Eb, CL } },
2544 { "rorA", { Eb, CL } },
2545 { "rclA", { Eb, CL } },
2546 { "rcrA", { Eb, CL } },
2547 { "shlA", { Eb, CL } },
2548 { "shrA", { Eb, CL } },
2549 { Bad_Opcode },
2550 { "sarA", { Eb, CL } },
2552 /* REG_D3 */
2554 { "rolQ", { Ev, CL } },
2555 { "rorQ", { Ev, CL } },
2556 { "rclQ", { Ev, CL } },
2557 { "rcrQ", { Ev, CL } },
2558 { "shlQ", { Ev, CL } },
2559 { "shrQ", { Ev, CL } },
2560 { Bad_Opcode },
2561 { "sarQ", { Ev, CL } },
2563 /* REG_F6 */
2565 { "testA", { Eb, Ib } },
2566 { Bad_Opcode },
2567 { "notA", { Eb } },
2568 { "negA", { Eb } },
2569 { "mulA", { Eb } }, /* Don't print the implicit %al register, */
2570 { "imulA", { Eb } }, /* to distinguish these opcodes from other */
2571 { "divA", { Eb } }, /* mul/imul opcodes. Do the same for div */
2572 { "idivA", { Eb } }, /* and idiv for consistency. */
2574 /* REG_F7 */
2576 { "testQ", { Ev, Iv } },
2577 { Bad_Opcode },
2578 { "notQ", { Ev } },
2579 { "negQ", { Ev } },
2580 { "mulQ", { Ev } }, /* Don't print the implicit register. */
2581 { "imulQ", { Ev } },
2582 { "divQ", { Ev } },
2583 { "idivQ", { Ev } },
2585 /* REG_FE */
2587 { "incA", { Eb } },
2588 { "decA", { Eb } },
2590 /* REG_FF */
2592 { "incQ", { Ev } },
2593 { "decQ", { Ev } },
2594 { "call{T|}", { indirEv } },
2595 { "Jcall{T|}", { indirEp } },
2596 { "jmp{T|}", { indirEv } },
2597 { "Jjmp{T|}", { indirEp } },
2598 { "pushU", { stackEv } },
2599 { Bad_Opcode },
2601 /* REG_0F00 */
2603 { "sldtD", { Sv } },
2604 { "strD", { Sv } },
2605 { "lldt", { Ew } },
2606 { "ltr", { Ew } },
2607 { "verr", { Ew } },
2608 { "verw", { Ew } },
2609 { Bad_Opcode },
2610 { Bad_Opcode },
2612 /* REG_0F01 */
2614 { MOD_TABLE (MOD_0F01_REG_0) },
2615 { MOD_TABLE (MOD_0F01_REG_1) },
2616 { MOD_TABLE (MOD_0F01_REG_2) },
2617 { MOD_TABLE (MOD_0F01_REG_3) },
2618 { "smswD", { Sv } },
2619 { Bad_Opcode },
2620 { "lmsw", { Ew } },
2621 { MOD_TABLE (MOD_0F01_REG_7) },
2623 /* REG_0F0D */
2625 { "prefetch", { Mb } },
2626 { "prefetchw", { Mb } },
2628 /* REG_0F18 */
2630 { MOD_TABLE (MOD_0F18_REG_0) },
2631 { MOD_TABLE (MOD_0F18_REG_1) },
2632 { MOD_TABLE (MOD_0F18_REG_2) },
2633 { MOD_TABLE (MOD_0F18_REG_3) },
2635 /* REG_0F71 */
2637 { Bad_Opcode },
2638 { Bad_Opcode },
2639 { MOD_TABLE (MOD_0F71_REG_2) },
2640 { Bad_Opcode },
2641 { MOD_TABLE (MOD_0F71_REG_4) },
2642 { Bad_Opcode },
2643 { MOD_TABLE (MOD_0F71_REG_6) },
2645 /* REG_0F72 */
2647 { Bad_Opcode },
2648 { Bad_Opcode },
2649 { MOD_TABLE (MOD_0F72_REG_2) },
2650 { Bad_Opcode },
2651 { MOD_TABLE (MOD_0F72_REG_4) },
2652 { Bad_Opcode },
2653 { MOD_TABLE (MOD_0F72_REG_6) },
2655 /* REG_0F73 */
2657 { Bad_Opcode },
2658 { Bad_Opcode },
2659 { MOD_TABLE (MOD_0F73_REG_2) },
2660 { MOD_TABLE (MOD_0F73_REG_3) },
2661 { Bad_Opcode },
2662 { Bad_Opcode },
2663 { MOD_TABLE (MOD_0F73_REG_6) },
2664 { MOD_TABLE (MOD_0F73_REG_7) },
2666 /* REG_0FA6 */
2668 { "montmul", { { OP_0f07, 0 } } },
2669 { "xsha1", { { OP_0f07, 0 } } },
2670 { "xsha256", { { OP_0f07, 0 } } },
2672 /* REG_0FA7 */
2674 { "xstore-rng", { { OP_0f07, 0 } } },
2675 { "xcrypt-ecb", { { OP_0f07, 0 } } },
2676 { "xcrypt-cbc", { { OP_0f07, 0 } } },
2677 { "xcrypt-ctr", { { OP_0f07, 0 } } },
2678 { "xcrypt-cfb", { { OP_0f07, 0 } } },
2679 { "xcrypt-ofb", { { OP_0f07, 0 } } },
2681 /* REG_0FAE */
2683 { MOD_TABLE (MOD_0FAE_REG_0) },
2684 { MOD_TABLE (MOD_0FAE_REG_1) },
2685 { MOD_TABLE (MOD_0FAE_REG_2) },
2686 { MOD_TABLE (MOD_0FAE_REG_3) },
2687 { MOD_TABLE (MOD_0FAE_REG_4) },
2688 { MOD_TABLE (MOD_0FAE_REG_5) },
2689 { MOD_TABLE (MOD_0FAE_REG_6) },
2690 { MOD_TABLE (MOD_0FAE_REG_7) },
2692 /* REG_0FBA */
2694 { Bad_Opcode },
2695 { Bad_Opcode },
2696 { Bad_Opcode },
2697 { Bad_Opcode },
2698 { "btQ", { Ev, Ib } },
2699 { "btsQ", { Ev, Ib } },
2700 { "btrQ", { Ev, Ib } },
2701 { "btcQ", { Ev, Ib } },
2703 /* REG_0FC7 */
2705 { Bad_Opcode },
2706 { "cmpxchg8b", { { CMPXCHG8B_Fixup, q_mode } } },
2707 { Bad_Opcode },
2708 { Bad_Opcode },
2709 { Bad_Opcode },
2710 { Bad_Opcode },
2711 { MOD_TABLE (MOD_0FC7_REG_6) },
2712 { MOD_TABLE (MOD_0FC7_REG_7) },
2714 /* REG_VEX_0F71 */
2716 { Bad_Opcode },
2717 { Bad_Opcode },
2718 { MOD_TABLE (MOD_VEX_0F71_REG_2) },
2719 { Bad_Opcode },
2720 { MOD_TABLE (MOD_VEX_0F71_REG_4) },
2721 { Bad_Opcode },
2722 { MOD_TABLE (MOD_VEX_0F71_REG_6) },
2724 /* REG_VEX_0F72 */
2726 { Bad_Opcode },
2727 { Bad_Opcode },
2728 { MOD_TABLE (MOD_VEX_0F72_REG_2) },
2729 { Bad_Opcode },
2730 { MOD_TABLE (MOD_VEX_0F72_REG_4) },
2731 { Bad_Opcode },
2732 { MOD_TABLE (MOD_VEX_0F72_REG_6) },
2734 /* REG_VEX_0F73 */
2736 { Bad_Opcode },
2737 { Bad_Opcode },
2738 { MOD_TABLE (MOD_VEX_0F73_REG_2) },
2739 { MOD_TABLE (MOD_VEX_0F73_REG_3) },
2740 { Bad_Opcode },
2741 { Bad_Opcode },
2742 { MOD_TABLE (MOD_VEX_0F73_REG_6) },
2743 { MOD_TABLE (MOD_VEX_0F73_REG_7) },
2745 /* REG_VEX_0FAE */
2747 { Bad_Opcode },
2748 { Bad_Opcode },
2749 { MOD_TABLE (MOD_VEX_0FAE_REG_2) },
2750 { MOD_TABLE (MOD_VEX_0FAE_REG_3) },
2752 /* REG_XOP_LWPCB */
2754 { "llwpcb", { { OP_LWPCB_E, 0 } } },
2755 { "slwpcb", { { OP_LWPCB_E, 0 } } },
2757 /* REG_XOP_LWP */
2759 { "lwpins", { { OP_LWP_E, 0 }, Ed, Iq } },
2760 { "lwpval", { { OP_LWP_E, 0 }, Ed, Iq } },
2764 static const struct dis386 prefix_table[][4] = {
2765 /* PREFIX_90 */
2767 { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } } },
2768 { "pause", { XX } },
2769 { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } } },
2772 /* PREFIX_0F10 */
2774 { "movups", { XM, EXx } },
2775 { "movss", { XM, EXd } },
2776 { "movupd", { XM, EXx } },
2777 { "movsd", { XM, EXq } },
2780 /* PREFIX_0F11 */
2782 { "movups", { EXxS, XM } },
2783 { "movss", { EXdS, XM } },
2784 { "movupd", { EXxS, XM } },
2785 { "movsd", { EXqS, XM } },
2788 /* PREFIX_0F12 */
2790 { MOD_TABLE (MOD_0F12_PREFIX_0) },
2791 { "movsldup", { XM, EXx } },
2792 { "movlpd", { XM, EXq } },
2793 { "movddup", { XM, EXq } },
2796 /* PREFIX_0F16 */
2798 { MOD_TABLE (MOD_0F16_PREFIX_0) },
2799 { "movshdup", { XM, EXx } },
2800 { "movhpd", { XM, EXq } },
2803 /* PREFIX_0F2A */
2805 { "cvtpi2ps", { XM, EMCq } },
2806 { "cvtsi2ss%LQ", { XM, Ev } },
2807 { "cvtpi2pd", { XM, EMCq } },
2808 { "cvtsi2sd%LQ", { XM, Ev } },
2811 /* PREFIX_0F2B */
2813 { MOD_TABLE (MOD_0F2B_PREFIX_0) },
2814 { MOD_TABLE (MOD_0F2B_PREFIX_1) },
2815 { MOD_TABLE (MOD_0F2B_PREFIX_2) },
2816 { MOD_TABLE (MOD_0F2B_PREFIX_3) },
2819 /* PREFIX_0F2C */
2821 { "cvttps2pi", { MXC, EXq } },
2822 { "cvttss2siY", { Gv, EXd } },
2823 { "cvttpd2pi", { MXC, EXx } },
2824 { "cvttsd2siY", { Gv, EXq } },
2827 /* PREFIX_0F2D */
2829 { "cvtps2pi", { MXC, EXq } },
2830 { "cvtss2siY", { Gv, EXd } },
2831 { "cvtpd2pi", { MXC, EXx } },
2832 { "cvtsd2siY", { Gv, EXq } },
2835 /* PREFIX_0F2E */
2837 { "ucomiss",{ XM, EXd } },
2838 { Bad_Opcode },
2839 { "ucomisd",{ XM, EXq } },
2842 /* PREFIX_0F2F */
2844 { "comiss", { XM, EXd } },
2845 { Bad_Opcode },
2846 { "comisd", { XM, EXq } },
2849 /* PREFIX_0F51 */
2851 { "sqrtps", { XM, EXx } },
2852 { "sqrtss", { XM, EXd } },
2853 { "sqrtpd", { XM, EXx } },
2854 { "sqrtsd", { XM, EXq } },
2857 /* PREFIX_0F52 */
2859 { "rsqrtps",{ XM, EXx } },
2860 { "rsqrtss",{ XM, EXd } },
2863 /* PREFIX_0F53 */
2865 { "rcpps", { XM, EXx } },
2866 { "rcpss", { XM, EXd } },
2869 /* PREFIX_0F58 */
2871 { "addps", { XM, EXx } },
2872 { "addss", { XM, EXd } },
2873 { "addpd", { XM, EXx } },
2874 { "addsd", { XM, EXq } },
2877 /* PREFIX_0F59 */
2879 { "mulps", { XM, EXx } },
2880 { "mulss", { XM, EXd } },
2881 { "mulpd", { XM, EXx } },
2882 { "mulsd", { XM, EXq } },
2885 /* PREFIX_0F5A */
2887 { "cvtps2pd", { XM, EXq } },
2888 { "cvtss2sd", { XM, EXd } },
2889 { "cvtpd2ps", { XM, EXx } },
2890 { "cvtsd2ss", { XM, EXq } },
2893 /* PREFIX_0F5B */
2895 { "cvtdq2ps", { XM, EXx } },
2896 { "cvttps2dq", { XM, EXx } },
2897 { "cvtps2dq", { XM, EXx } },
2900 /* PREFIX_0F5C */
2902 { "subps", { XM, EXx } },
2903 { "subss", { XM, EXd } },
2904 { "subpd", { XM, EXx } },
2905 { "subsd", { XM, EXq } },
2908 /* PREFIX_0F5D */
2910 { "minps", { XM, EXx } },
2911 { "minss", { XM, EXd } },
2912 { "minpd", { XM, EXx } },
2913 { "minsd", { XM, EXq } },
2916 /* PREFIX_0F5E */
2918 { "divps", { XM, EXx } },
2919 { "divss", { XM, EXd } },
2920 { "divpd", { XM, EXx } },
2921 { "divsd", { XM, EXq } },
2924 /* PREFIX_0F5F */
2926 { "maxps", { XM, EXx } },
2927 { "maxss", { XM, EXd } },
2928 { "maxpd", { XM, EXx } },
2929 { "maxsd", { XM, EXq } },
2932 /* PREFIX_0F60 */
2934 { "punpcklbw",{ MX, EMd } },
2935 { Bad_Opcode },
2936 { "punpcklbw",{ MX, EMx } },
2939 /* PREFIX_0F61 */
2941 { "punpcklwd",{ MX, EMd } },
2942 { Bad_Opcode },
2943 { "punpcklwd",{ MX, EMx } },
2946 /* PREFIX_0F62 */
2948 { "punpckldq",{ MX, EMd } },
2949 { Bad_Opcode },
2950 { "punpckldq",{ MX, EMx } },
2953 /* PREFIX_0F6C */
2955 { Bad_Opcode },
2956 { Bad_Opcode },
2957 { "punpcklqdq", { XM, EXx } },
2960 /* PREFIX_0F6D */
2962 { Bad_Opcode },
2963 { Bad_Opcode },
2964 { "punpckhqdq", { XM, EXx } },
2967 /* PREFIX_0F6F */
2969 { "movq", { MX, EM } },
2970 { "movdqu", { XM, EXx } },
2971 { "movdqa", { XM, EXx } },
2974 /* PREFIX_0F70 */
2976 { "pshufw", { MX, EM, Ib } },
2977 { "pshufhw",{ XM, EXx, Ib } },
2978 { "pshufd", { XM, EXx, Ib } },
2979 { "pshuflw",{ XM, EXx, Ib } },
2982 /* PREFIX_0F73_REG_3 */
2984 { Bad_Opcode },
2985 { Bad_Opcode },
2986 { "psrldq", { XS, Ib } },
2989 /* PREFIX_0F73_REG_7 */
2991 { Bad_Opcode },
2992 { Bad_Opcode },
2993 { "pslldq", { XS, Ib } },
2996 /* PREFIX_0F78 */
2998 {"vmread", { Em, Gm } },
2999 { Bad_Opcode },
3000 {"extrq", { XS, Ib, Ib } },
3001 {"insertq", { XM, XS, Ib, Ib } },
3004 /* PREFIX_0F79 */
3006 {"vmwrite", { Gm, Em } },
3007 { Bad_Opcode },
3008 {"extrq", { XM, XS } },
3009 {"insertq", { XM, XS } },
3012 /* PREFIX_0F7C */
3014 { Bad_Opcode },
3015 { Bad_Opcode },
3016 { "haddpd", { XM, EXx } },
3017 { "haddps", { XM, EXx } },
3020 /* PREFIX_0F7D */
3022 { Bad_Opcode },
3023 { Bad_Opcode },
3024 { "hsubpd", { XM, EXx } },
3025 { "hsubps", { XM, EXx } },
3028 /* PREFIX_0F7E */
3030 { "movK", { Edq, MX } },
3031 { "movq", { XM, EXq } },
3032 { "movK", { Edq, XM } },
3035 /* PREFIX_0F7F */
3037 { "movq", { EMS, MX } },
3038 { "movdqu", { EXxS, XM } },
3039 { "movdqa", { EXxS, XM } },
3042 /* PREFIX_0FAE_REG_0 */
3044 { Bad_Opcode },
3045 { "rdfsbase", { Ev } },
3048 /* PREFIX_0FAE_REG_1 */
3050 { Bad_Opcode },
3051 { "rdgsbase", { Ev } },
3054 /* PREFIX_0FAE_REG_2 */
3056 { Bad_Opcode },
3057 { "wrfsbase", { Ev } },
3060 /* PREFIX_0FAE_REG_3 */
3062 { Bad_Opcode },
3063 { "wrgsbase", { Ev } },
3066 /* PREFIX_0FB8 */
3068 { Bad_Opcode },
3069 { "popcntS", { Gv, Ev } },
3072 /* PREFIX_0FBD */
3074 { "bsrS", { Gv, Ev } },
3075 { "lzcntS", { Gv, Ev } },
3076 { "bsrS", { Gv, Ev } },
3079 /* PREFIX_0FC2 */
3081 { "cmpps", { XM, EXx, CMP } },
3082 { "cmpss", { XM, EXd, CMP } },
3083 { "cmppd", { XM, EXx, CMP } },
3084 { "cmpsd", { XM, EXq, CMP } },
3087 /* PREFIX_0FC3 */
3089 { "movntiS", { Ma, Gv } },
3092 /* PREFIX_0FC7_REG_6 */
3094 { "vmptrld",{ Mq } },
3095 { "vmxon", { Mq } },
3096 { "vmclear",{ Mq } },
3099 /* PREFIX_0FD0 */
3101 { Bad_Opcode },
3102 { Bad_Opcode },
3103 { "addsubpd", { XM, EXx } },
3104 { "addsubps", { XM, EXx } },
3107 /* PREFIX_0FD6 */
3109 { Bad_Opcode },
3110 { "movq2dq",{ XM, MS } },
3111 { "movq", { EXqS, XM } },
3112 { "movdq2q",{ MX, XS } },
3115 /* PREFIX_0FE6 */
3117 { Bad_Opcode },
3118 { "cvtdq2pd", { XM, EXq } },
3119 { "cvttpd2dq", { XM, EXx } },
3120 { "cvtpd2dq", { XM, EXx } },
3123 /* PREFIX_0FE7 */
3125 { "movntq", { Mq, MX } },
3126 { Bad_Opcode },
3127 { MOD_TABLE (MOD_0FE7_PREFIX_2) },
3130 /* PREFIX_0FF0 */
3132 { Bad_Opcode },
3133 { Bad_Opcode },
3134 { Bad_Opcode },
3135 { MOD_TABLE (MOD_0FF0_PREFIX_3) },
3138 /* PREFIX_0FF7 */
3140 { "maskmovq", { MX, MS } },
3141 { Bad_Opcode },
3142 { "maskmovdqu", { XM, XS } },
3145 /* PREFIX_0F3810 */
3147 { Bad_Opcode },
3148 { Bad_Opcode },
3149 { "pblendvb", { XM, EXx, XMM0 } },
3152 /* PREFIX_0F3814 */
3154 { Bad_Opcode },
3155 { Bad_Opcode },
3156 { "blendvps", { XM, EXx, XMM0 } },
3159 /* PREFIX_0F3815 */
3161 { Bad_Opcode },
3162 { Bad_Opcode },
3163 { "blendvpd", { XM, EXx, XMM0 } },
3166 /* PREFIX_0F3817 */
3168 { Bad_Opcode },
3169 { Bad_Opcode },
3170 { "ptest", { XM, EXx } },
3173 /* PREFIX_0F3820 */
3175 { Bad_Opcode },
3176 { Bad_Opcode },
3177 { "pmovsxbw", { XM, EXq } },
3180 /* PREFIX_0F3821 */
3182 { Bad_Opcode },
3183 { Bad_Opcode },
3184 { "pmovsxbd", { XM, EXd } },
3187 /* PREFIX_0F3822 */
3189 { Bad_Opcode },
3190 { Bad_Opcode },
3191 { "pmovsxbq", { XM, EXw } },
3194 /* PREFIX_0F3823 */
3196 { Bad_Opcode },
3197 { Bad_Opcode },
3198 { "pmovsxwd", { XM, EXq } },
3201 /* PREFIX_0F3824 */
3203 { Bad_Opcode },
3204 { Bad_Opcode },
3205 { "pmovsxwq", { XM, EXd } },
3208 /* PREFIX_0F3825 */
3210 { Bad_Opcode },
3211 { Bad_Opcode },
3212 { "pmovsxdq", { XM, EXq } },
3215 /* PREFIX_0F3828 */
3217 { Bad_Opcode },
3218 { Bad_Opcode },
3219 { "pmuldq", { XM, EXx } },
3222 /* PREFIX_0F3829 */
3224 { Bad_Opcode },
3225 { Bad_Opcode },
3226 { "pcmpeqq", { XM, EXx } },
3229 /* PREFIX_0F382A */
3231 { Bad_Opcode },
3232 { Bad_Opcode },
3233 { MOD_TABLE (MOD_0F382A_PREFIX_2) },
3236 /* PREFIX_0F382B */
3238 { Bad_Opcode },
3239 { Bad_Opcode },
3240 { "packusdw", { XM, EXx } },
3243 /* PREFIX_0F3830 */
3245 { Bad_Opcode },
3246 { Bad_Opcode },
3247 { "pmovzxbw", { XM, EXq } },
3250 /* PREFIX_0F3831 */
3252 { Bad_Opcode },
3253 { Bad_Opcode },
3254 { "pmovzxbd", { XM, EXd } },
3257 /* PREFIX_0F3832 */
3259 { Bad_Opcode },
3260 { Bad_Opcode },
3261 { "pmovzxbq", { XM, EXw } },
3264 /* PREFIX_0F3833 */
3266 { Bad_Opcode },
3267 { Bad_Opcode },
3268 { "pmovzxwd", { XM, EXq } },
3271 /* PREFIX_0F3834 */
3273 { Bad_Opcode },
3274 { Bad_Opcode },
3275 { "pmovzxwq", { XM, EXd } },
3278 /* PREFIX_0F3835 */
3280 { Bad_Opcode },
3281 { Bad_Opcode },
3282 { "pmovzxdq", { XM, EXq } },
3285 /* PREFIX_0F3837 */
3287 { Bad_Opcode },
3288 { Bad_Opcode },
3289 { "pcmpgtq", { XM, EXx } },
3292 /* PREFIX_0F3838 */
3294 { Bad_Opcode },
3295 { Bad_Opcode },
3296 { "pminsb", { XM, EXx } },
3299 /* PREFIX_0F3839 */
3301 { Bad_Opcode },
3302 { Bad_Opcode },
3303 { "pminsd", { XM, EXx } },
3306 /* PREFIX_0F383A */
3308 { Bad_Opcode },
3309 { Bad_Opcode },
3310 { "pminuw", { XM, EXx } },
3313 /* PREFIX_0F383B */
3315 { Bad_Opcode },
3316 { Bad_Opcode },
3317 { "pminud", { XM, EXx } },
3320 /* PREFIX_0F383C */
3322 { Bad_Opcode },
3323 { Bad_Opcode },
3324 { "pmaxsb", { XM, EXx } },
3327 /* PREFIX_0F383D */
3329 { Bad_Opcode },
3330 { Bad_Opcode },
3331 { "pmaxsd", { XM, EXx } },
3334 /* PREFIX_0F383E */
3336 { Bad_Opcode },
3337 { Bad_Opcode },
3338 { "pmaxuw", { XM, EXx } },
3341 /* PREFIX_0F383F */
3343 { Bad_Opcode },
3344 { Bad_Opcode },
3345 { "pmaxud", { XM, EXx } },
3348 /* PREFIX_0F3840 */
3350 { Bad_Opcode },
3351 { Bad_Opcode },
3352 { "pmulld", { XM, EXx } },
3355 /* PREFIX_0F3841 */
3357 { Bad_Opcode },
3358 { Bad_Opcode },
3359 { "phminposuw", { XM, EXx } },
3362 /* PREFIX_0F3880 */
3364 { Bad_Opcode },
3365 { Bad_Opcode },
3366 { "invept", { Gm, Mo } },
3369 /* PREFIX_0F3881 */
3371 { Bad_Opcode },
3372 { Bad_Opcode },
3373 { "invvpid", { Gm, Mo } },
3376 /* PREFIX_0F38DB */
3378 { Bad_Opcode },
3379 { Bad_Opcode },
3380 { "aesimc", { XM, EXx } },
3383 /* PREFIX_0F38DC */
3385 { Bad_Opcode },
3386 { Bad_Opcode },
3387 { "aesenc", { XM, EXx } },
3390 /* PREFIX_0F38DD */
3392 { Bad_Opcode },
3393 { Bad_Opcode },
3394 { "aesenclast", { XM, EXx } },
3397 /* PREFIX_0F38DE */
3399 { Bad_Opcode },
3400 { Bad_Opcode },
3401 { "aesdec", { XM, EXx } },
3404 /* PREFIX_0F38DF */
3406 { Bad_Opcode },
3407 { Bad_Opcode },
3408 { "aesdeclast", { XM, EXx } },
3411 /* PREFIX_0F38F0 */
3413 { "movbeS", { Gv, { MOVBE_Fixup, v_mode } } },
3414 { Bad_Opcode },
3415 { "movbeS", { Gv, { MOVBE_Fixup, v_mode } } },
3416 { "crc32", { Gdq, { CRC32_Fixup, b_mode } } },
3419 /* PREFIX_0F38F1 */
3421 { "movbeS", { { MOVBE_Fixup, v_mode }, Gv } },
3422 { Bad_Opcode },
3423 { "movbeS", { { MOVBE_Fixup, v_mode }, Gv } },
3424 { "crc32", { Gdq, { CRC32_Fixup, v_mode } } },
3427 /* PREFIX_0F3A08 */
3429 { Bad_Opcode },
3430 { Bad_Opcode },
3431 { "roundps", { XM, EXx, Ib } },
3434 /* PREFIX_0F3A09 */
3436 { Bad_Opcode },
3437 { Bad_Opcode },
3438 { "roundpd", { XM, EXx, Ib } },
3441 /* PREFIX_0F3A0A */
3443 { Bad_Opcode },
3444 { Bad_Opcode },
3445 { "roundss", { XM, EXd, Ib } },
3448 /* PREFIX_0F3A0B */
3450 { Bad_Opcode },
3451 { Bad_Opcode },
3452 { "roundsd", { XM, EXq, Ib } },
3455 /* PREFIX_0F3A0C */
3457 { Bad_Opcode },
3458 { Bad_Opcode },
3459 { "blendps", { XM, EXx, Ib } },
3462 /* PREFIX_0F3A0D */
3464 { Bad_Opcode },
3465 { Bad_Opcode },
3466 { "blendpd", { XM, EXx, Ib } },
3469 /* PREFIX_0F3A0E */
3471 { Bad_Opcode },
3472 { Bad_Opcode },
3473 { "pblendw", { XM, EXx, Ib } },
3476 /* PREFIX_0F3A14 */
3478 { Bad_Opcode },
3479 { Bad_Opcode },
3480 { "pextrb", { Edqb, XM, Ib } },
3483 /* PREFIX_0F3A15 */
3485 { Bad_Opcode },
3486 { Bad_Opcode },
3487 { "pextrw", { Edqw, XM, Ib } },
3490 /* PREFIX_0F3A16 */
3492 { Bad_Opcode },
3493 { Bad_Opcode },
3494 { "pextrK", { Edq, XM, Ib } },
3497 /* PREFIX_0F3A17 */
3499 { Bad_Opcode },
3500 { Bad_Opcode },
3501 { "extractps", { Edqd, XM, Ib } },
3504 /* PREFIX_0F3A20 */
3506 { Bad_Opcode },
3507 { Bad_Opcode },
3508 { "pinsrb", { XM, Edqb, Ib } },
3511 /* PREFIX_0F3A21 */
3513 { Bad_Opcode },
3514 { Bad_Opcode },
3515 { "insertps", { XM, EXd, Ib } },
3518 /* PREFIX_0F3A22 */
3520 { Bad_Opcode },
3521 { Bad_Opcode },
3522 { "pinsrK", { XM, Edq, Ib } },
3525 /* PREFIX_0F3A40 */
3527 { Bad_Opcode },
3528 { Bad_Opcode },
3529 { "dpps", { XM, EXx, Ib } },
3532 /* PREFIX_0F3A41 */
3534 { Bad_Opcode },
3535 { Bad_Opcode },
3536 { "dppd", { XM, EXx, Ib } },
3539 /* PREFIX_0F3A42 */
3541 { Bad_Opcode },
3542 { Bad_Opcode },
3543 { "mpsadbw", { XM, EXx, Ib } },
3546 /* PREFIX_0F3A44 */
3548 { Bad_Opcode },
3549 { Bad_Opcode },
3550 { "pclmulqdq", { XM, EXx, PCLMUL } },
3553 /* PREFIX_0F3A60 */
3555 { Bad_Opcode },
3556 { Bad_Opcode },
3557 { "pcmpestrm", { XM, EXx, Ib } },
3560 /* PREFIX_0F3A61 */
3562 { Bad_Opcode },
3563 { Bad_Opcode },
3564 { "pcmpestri", { XM, EXx, Ib } },
3567 /* PREFIX_0F3A62 */
3569 { Bad_Opcode },
3570 { Bad_Opcode },
3571 { "pcmpistrm", { XM, EXx, Ib } },
3574 /* PREFIX_0F3A63 */
3576 { Bad_Opcode },
3577 { Bad_Opcode },
3578 { "pcmpistri", { XM, EXx, Ib } },
3581 /* PREFIX_0F3ADF */
3583 { Bad_Opcode },
3584 { Bad_Opcode },
3585 { "aeskeygenassist", { XM, EXx, Ib } },
3588 /* PREFIX_VEX_0F10 */
3590 { VEX_W_TABLE (VEX_W_0F10_P_0) },
3591 { VEX_LEN_TABLE (VEX_LEN_0F10_P_1) },
3592 { VEX_W_TABLE (VEX_W_0F10_P_2) },
3593 { VEX_LEN_TABLE (VEX_LEN_0F10_P_3) },
3596 /* PREFIX_VEX_0F11 */
3598 { VEX_W_TABLE (VEX_W_0F11_P_0) },
3599 { VEX_LEN_TABLE (VEX_LEN_0F11_P_1) },
3600 { VEX_W_TABLE (VEX_W_0F11_P_2) },
3601 { VEX_LEN_TABLE (VEX_LEN_0F11_P_3) },
3604 /* PREFIX_VEX_0F12 */
3606 { MOD_TABLE (MOD_VEX_0F12_PREFIX_0) },
3607 { VEX_W_TABLE (VEX_W_0F12_P_1) },
3608 { VEX_LEN_TABLE (VEX_LEN_0F12_P_2) },
3609 { VEX_W_TABLE (VEX_W_0F12_P_3) },
3612 /* PREFIX_VEX_0F16 */
3614 { MOD_TABLE (MOD_VEX_0F16_PREFIX_0) },
3615 { VEX_W_TABLE (VEX_W_0F16_P_1) },
3616 { VEX_LEN_TABLE (VEX_LEN_0F16_P_2) },
3619 /* PREFIX_VEX_0F2A */
3621 { Bad_Opcode },
3622 { VEX_LEN_TABLE (VEX_LEN_0F2A_P_1) },
3623 { Bad_Opcode },
3624 { VEX_LEN_TABLE (VEX_LEN_0F2A_P_3) },
3627 /* PREFIX_VEX_0F2C */
3629 { Bad_Opcode },
3630 { VEX_LEN_TABLE (VEX_LEN_0F2C_P_1) },
3631 { Bad_Opcode },
3632 { VEX_LEN_TABLE (VEX_LEN_0F2C_P_3) },
3635 /* PREFIX_VEX_0F2D */
3637 { Bad_Opcode },
3638 { VEX_LEN_TABLE (VEX_LEN_0F2D_P_1) },
3639 { Bad_Opcode },
3640 { VEX_LEN_TABLE (VEX_LEN_0F2D_P_3) },
3643 /* PREFIX_VEX_0F2E */
3645 { VEX_LEN_TABLE (VEX_LEN_0F2E_P_0) },
3646 { Bad_Opcode },
3647 { VEX_LEN_TABLE (VEX_LEN_0F2E_P_2) },
3650 /* PREFIX_VEX_0F2F */
3652 { VEX_LEN_TABLE (VEX_LEN_0F2F_P_0) },
3653 { Bad_Opcode },
3654 { VEX_LEN_TABLE (VEX_LEN_0F2F_P_2) },
3657 /* PREFIX_VEX_0F51 */
3659 { VEX_W_TABLE (VEX_W_0F51_P_0) },
3660 { VEX_LEN_TABLE (VEX_LEN_0F51_P_1) },
3661 { VEX_W_TABLE (VEX_W_0F51_P_2) },
3662 { VEX_LEN_TABLE (VEX_LEN_0F51_P_3) },
3665 /* PREFIX_VEX_0F52 */
3667 { VEX_W_TABLE (VEX_W_0F52_P_0) },
3668 { VEX_LEN_TABLE (VEX_LEN_0F52_P_1) },
3671 /* PREFIX_VEX_0F53 */
3673 { VEX_W_TABLE (VEX_W_0F53_P_0) },
3674 { VEX_LEN_TABLE (VEX_LEN_0F53_P_1) },
3677 /* PREFIX_VEX_0F58 */
3679 { VEX_W_TABLE (VEX_W_0F58_P_0) },
3680 { VEX_LEN_TABLE (VEX_LEN_0F58_P_1) },
3681 { VEX_W_TABLE (VEX_W_0F58_P_2) },
3682 { VEX_LEN_TABLE (VEX_LEN_0F58_P_3) },
3685 /* PREFIX_VEX_0F59 */
3687 { VEX_W_TABLE (VEX_W_0F59_P_0) },
3688 { VEX_LEN_TABLE (VEX_LEN_0F59_P_1) },
3689 { VEX_W_TABLE (VEX_W_0F59_P_2) },
3690 { VEX_LEN_TABLE (VEX_LEN_0F59_P_3) },
3693 /* PREFIX_VEX_0F5A */
3695 { VEX_W_TABLE (VEX_W_0F5A_P_0) },
3696 { VEX_LEN_TABLE (VEX_LEN_0F5A_P_1) },
3697 { "vcvtpd2ps%XY", { XMM, EXx } },
3698 { VEX_LEN_TABLE (VEX_LEN_0F5A_P_3) },
3701 /* PREFIX_VEX_0F5B */
3703 { VEX_W_TABLE (VEX_W_0F5B_P_0) },
3704 { VEX_W_TABLE (VEX_W_0F5B_P_1) },
3705 { VEX_W_TABLE (VEX_W_0F5B_P_2) },
3708 /* PREFIX_VEX_0F5C */
3710 { VEX_W_TABLE (VEX_W_0F5C_P_0) },
3711 { VEX_LEN_TABLE (VEX_LEN_0F5C_P_1) },
3712 { VEX_W_TABLE (VEX_W_0F5C_P_2) },
3713 { VEX_LEN_TABLE (VEX_LEN_0F5C_P_3) },
3716 /* PREFIX_VEX_0F5D */
3718 { VEX_W_TABLE (VEX_W_0F5D_P_0) },
3719 { VEX_LEN_TABLE (VEX_LEN_0F5D_P_1) },
3720 { VEX_W_TABLE (VEX_W_0F5D_P_2) },
3721 { VEX_LEN_TABLE (VEX_LEN_0F5D_P_3) },
3724 /* PREFIX_VEX_0F5E */
3726 { VEX_W_TABLE (VEX_W_0F5E_P_0) },
3727 { VEX_LEN_TABLE (VEX_LEN_0F5E_P_1) },
3728 { VEX_W_TABLE (VEX_W_0F5E_P_2) },
3729 { VEX_LEN_TABLE (VEX_LEN_0F5E_P_3) },
3732 /* PREFIX_VEX_0F5F */
3734 { VEX_W_TABLE (VEX_W_0F5F_P_0) },
3735 { VEX_LEN_TABLE (VEX_LEN_0F5F_P_1) },
3736 { VEX_W_TABLE (VEX_W_0F5F_P_2) },
3737 { VEX_LEN_TABLE (VEX_LEN_0F5F_P_3) },
3740 /* PREFIX_VEX_0F60 */
3742 { Bad_Opcode },
3743 { Bad_Opcode },
3744 { VEX_LEN_TABLE (VEX_LEN_0F60_P_2) },
3747 /* PREFIX_VEX_0F61 */
3749 { Bad_Opcode },
3750 { Bad_Opcode },
3751 { VEX_LEN_TABLE (VEX_LEN_0F61_P_2) },
3754 /* PREFIX_VEX_0F62 */
3756 { Bad_Opcode },
3757 { Bad_Opcode },
3758 { VEX_LEN_TABLE (VEX_LEN_0F62_P_2) },
3761 /* PREFIX_VEX_0F63 */
3763 { Bad_Opcode },
3764 { Bad_Opcode },
3765 { VEX_LEN_TABLE (VEX_LEN_0F63_P_2) },
3768 /* PREFIX_VEX_0F64 */
3770 { Bad_Opcode },
3771 { Bad_Opcode },
3772 { VEX_LEN_TABLE (VEX_LEN_0F64_P_2) },
3775 /* PREFIX_VEX_0F65 */
3777 { Bad_Opcode },
3778 { Bad_Opcode },
3779 { VEX_LEN_TABLE (VEX_LEN_0F65_P_2) },
3782 /* PREFIX_VEX_0F66 */
3784 { Bad_Opcode },
3785 { Bad_Opcode },
3786 { VEX_LEN_TABLE (VEX_LEN_0F66_P_2) },
3789 /* PREFIX_VEX_0F67 */
3791 { Bad_Opcode },
3792 { Bad_Opcode },
3793 { VEX_LEN_TABLE (VEX_LEN_0F67_P_2) },
3796 /* PREFIX_VEX_0F68 */
3798 { Bad_Opcode },
3799 { Bad_Opcode },
3800 { VEX_LEN_TABLE (VEX_LEN_0F68_P_2) },
3803 /* PREFIX_VEX_0F69 */
3805 { Bad_Opcode },
3806 { Bad_Opcode },
3807 { VEX_LEN_TABLE (VEX_LEN_0F69_P_2) },
3810 /* PREFIX_VEX_0F6A */
3812 { Bad_Opcode },
3813 { Bad_Opcode },
3814 { VEX_LEN_TABLE (VEX_LEN_0F6A_P_2) },
3817 /* PREFIX_VEX_0F6B */
3819 { Bad_Opcode },
3820 { Bad_Opcode },
3821 { VEX_LEN_TABLE (VEX_LEN_0F6B_P_2) },
3824 /* PREFIX_VEX_0F6C */
3826 { Bad_Opcode },
3827 { Bad_Opcode },
3828 { VEX_LEN_TABLE (VEX_LEN_0F6C_P_2) },
3831 /* PREFIX_VEX_0F6D */
3833 { Bad_Opcode },
3834 { Bad_Opcode },
3835 { VEX_LEN_TABLE (VEX_LEN_0F6D_P_2) },
3838 /* PREFIX_VEX_0F6E */
3840 { Bad_Opcode },
3841 { Bad_Opcode },
3842 { VEX_LEN_TABLE (VEX_LEN_0F6E_P_2) },
3845 /* PREFIX_VEX_0F6F */
3847 { Bad_Opcode },
3848 { VEX_W_TABLE (VEX_W_0F6F_P_1) },
3849 { VEX_W_TABLE (VEX_W_0F6F_P_2) },
3852 /* PREFIX_VEX_0F70 */
3854 { Bad_Opcode },
3855 { VEX_LEN_TABLE (VEX_LEN_0F70_P_1) },
3856 { VEX_LEN_TABLE (VEX_LEN_0F70_P_2) },
3857 { VEX_LEN_TABLE (VEX_LEN_0F70_P_3) },
3860 /* PREFIX_VEX_0F71_REG_2 */
3862 { Bad_Opcode },
3863 { Bad_Opcode },
3864 { VEX_LEN_TABLE (VEX_LEN_0F71_R_2_P_2) },
3867 /* PREFIX_VEX_0F71_REG_4 */
3869 { Bad_Opcode },
3870 { Bad_Opcode },
3871 { VEX_LEN_TABLE (VEX_LEN_0F71_R_4_P_2) },
3874 /* PREFIX_VEX_0F71_REG_6 */
3876 { Bad_Opcode },
3877 { Bad_Opcode },
3878 { VEX_LEN_TABLE (VEX_LEN_0F71_R_6_P_2) },
3881 /* PREFIX_VEX_0F72_REG_2 */
3883 { Bad_Opcode },
3884 { Bad_Opcode },
3885 { VEX_LEN_TABLE (VEX_LEN_0F72_R_2_P_2) },
3888 /* PREFIX_VEX_0F72_REG_4 */
3890 { Bad_Opcode },
3891 { Bad_Opcode },
3892 { VEX_LEN_TABLE (VEX_LEN_0F72_R_4_P_2) },
3895 /* PREFIX_VEX_0F72_REG_6 */
3897 { Bad_Opcode },
3898 { Bad_Opcode },
3899 { VEX_LEN_TABLE (VEX_LEN_0F72_R_6_P_2) },
3902 /* PREFIX_VEX_0F73_REG_2 */
3904 { Bad_Opcode },
3905 { Bad_Opcode },
3906 { VEX_LEN_TABLE (VEX_LEN_0F73_R_2_P_2) },
3909 /* PREFIX_VEX_0F73_REG_3 */
3911 { Bad_Opcode },
3912 { Bad_Opcode },
3913 { VEX_LEN_TABLE (VEX_LEN_0F73_R_3_P_2) },
3916 /* PREFIX_VEX_0F73_REG_6 */
3918 { Bad_Opcode },
3919 { Bad_Opcode },
3920 { VEX_LEN_TABLE (VEX_LEN_0F73_R_6_P_2) },
3923 /* PREFIX_VEX_0F73_REG_7 */
3925 { Bad_Opcode },
3926 { Bad_Opcode },
3927 { VEX_LEN_TABLE (VEX_LEN_0F73_R_7_P_2) },
3930 /* PREFIX_VEX_0F74 */
3932 { Bad_Opcode },
3933 { Bad_Opcode },
3934 { VEX_LEN_TABLE (VEX_LEN_0F74_P_2) },
3937 /* PREFIX_VEX_0F75 */
3939 { Bad_Opcode },
3940 { Bad_Opcode },
3941 { VEX_LEN_TABLE (VEX_LEN_0F75_P_2) },
3944 /* PREFIX_VEX_0F76 */
3946 { Bad_Opcode },
3947 { Bad_Opcode },
3948 { VEX_LEN_TABLE (VEX_LEN_0F76_P_2) },
3951 /* PREFIX_VEX_0F77 */
3953 { VEX_W_TABLE (VEX_W_0F77_P_0) },
3956 /* PREFIX_VEX_0F7C */
3958 { Bad_Opcode },
3959 { Bad_Opcode },
3960 { VEX_W_TABLE (VEX_W_0F7C_P_2) },
3961 { VEX_W_TABLE (VEX_W_0F7C_P_3) },
3964 /* PREFIX_VEX_0F7D */
3966 { Bad_Opcode },
3967 { Bad_Opcode },
3968 { VEX_W_TABLE (VEX_W_0F7D_P_2) },
3969 { VEX_W_TABLE (VEX_W_0F7D_P_3) },
3972 /* PREFIX_VEX_0F7E */
3974 { Bad_Opcode },
3975 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_1) },
3976 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_2) },
3979 /* PREFIX_VEX_0F7F */
3981 { Bad_Opcode },
3982 { VEX_W_TABLE (VEX_W_0F7F_P_1) },
3983 { VEX_W_TABLE (VEX_W_0F7F_P_2) },
3986 /* PREFIX_VEX_0FC2 */
3988 { VEX_W_TABLE (VEX_W_0FC2_P_0) },
3989 { VEX_LEN_TABLE (VEX_LEN_0FC2_P_1) },
3990 { VEX_W_TABLE (VEX_W_0FC2_P_2) },
3991 { VEX_LEN_TABLE (VEX_LEN_0FC2_P_3) },
3994 /* PREFIX_VEX_0FC4 */
3996 { Bad_Opcode },
3997 { Bad_Opcode },
3998 { VEX_LEN_TABLE (VEX_LEN_0FC4_P_2) },
4001 /* PREFIX_VEX_0FC5 */
4003 { Bad_Opcode },
4004 { Bad_Opcode },
4005 { VEX_LEN_TABLE (VEX_LEN_0FC5_P_2) },
4008 /* PREFIX_VEX_0FD0 */
4010 { Bad_Opcode },
4011 { Bad_Opcode },
4012 { VEX_W_TABLE (VEX_W_0FD0_P_2) },
4013 { VEX_W_TABLE (VEX_W_0FD0_P_3) },
4016 /* PREFIX_VEX_0FD1 */
4018 { Bad_Opcode },
4019 { Bad_Opcode },
4020 { VEX_LEN_TABLE (VEX_LEN_0FD1_P_2) },
4023 /* PREFIX_VEX_0FD2 */
4025 { Bad_Opcode },
4026 { Bad_Opcode },
4027 { VEX_LEN_TABLE (VEX_LEN_0FD2_P_2) },
4030 /* PREFIX_VEX_0FD3 */
4032 { Bad_Opcode },
4033 { Bad_Opcode },
4034 { VEX_LEN_TABLE (VEX_LEN_0FD3_P_2) },
4037 /* PREFIX_VEX_0FD4 */
4039 { Bad_Opcode },
4040 { Bad_Opcode },
4041 { VEX_LEN_TABLE (VEX_LEN_0FD4_P_2) },
4044 /* PREFIX_VEX_0FD5 */
4046 { Bad_Opcode },
4047 { Bad_Opcode },
4048 { VEX_LEN_TABLE (VEX_LEN_0FD5_P_2) },
4051 /* PREFIX_VEX_0FD6 */
4053 { Bad_Opcode },
4054 { Bad_Opcode },
4055 { VEX_LEN_TABLE (VEX_LEN_0FD6_P_2) },
4058 /* PREFIX_VEX_0FD7 */
4060 { Bad_Opcode },
4061 { Bad_Opcode },
4062 { MOD_TABLE (MOD_VEX_0FD7_PREFIX_2) },
4065 /* PREFIX_VEX_0FD8 */
4067 { Bad_Opcode },
4068 { Bad_Opcode },
4069 { VEX_LEN_TABLE (VEX_LEN_0FD8_P_2) },
4072 /* PREFIX_VEX_0FD9 */
4074 { Bad_Opcode },
4075 { Bad_Opcode },
4076 { VEX_LEN_TABLE (VEX_LEN_0FD9_P_2) },
4079 /* PREFIX_VEX_0FDA */
4081 { Bad_Opcode },
4082 { Bad_Opcode },
4083 { VEX_LEN_TABLE (VEX_LEN_0FDA_P_2) },
4086 /* PREFIX_VEX_0FDB */
4088 { Bad_Opcode },
4089 { Bad_Opcode },
4090 { VEX_LEN_TABLE (VEX_LEN_0FDB_P_2) },
4093 /* PREFIX_VEX_0FDC */
4095 { Bad_Opcode },
4096 { Bad_Opcode },
4097 { VEX_LEN_TABLE (VEX_LEN_0FDC_P_2) },
4100 /* PREFIX_VEX_0FDD */
4102 { Bad_Opcode },
4103 { Bad_Opcode },
4104 { VEX_LEN_TABLE (VEX_LEN_0FDD_P_2) },
4107 /* PREFIX_VEX_0FDE */
4109 { Bad_Opcode },
4110 { Bad_Opcode },
4111 { VEX_LEN_TABLE (VEX_LEN_0FDE_P_2) },
4114 /* PREFIX_VEX_0FDF */
4116 { Bad_Opcode },
4117 { Bad_Opcode },
4118 { VEX_LEN_TABLE (VEX_LEN_0FDF_P_2) },
4121 /* PREFIX_VEX_0FE0 */
4123 { Bad_Opcode },
4124 { Bad_Opcode },
4125 { VEX_LEN_TABLE (VEX_LEN_0FE0_P_2) },
4128 /* PREFIX_VEX_0FE1 */
4130 { Bad_Opcode },
4131 { Bad_Opcode },
4132 { VEX_LEN_TABLE (VEX_LEN_0FE1_P_2) },
4135 /* PREFIX_VEX_0FE2 */
4137 { Bad_Opcode },
4138 { Bad_Opcode },
4139 { VEX_LEN_TABLE (VEX_LEN_0FE2_P_2) },
4142 /* PREFIX_VEX_0FE3 */
4144 { Bad_Opcode },
4145 { Bad_Opcode },
4146 { VEX_LEN_TABLE (VEX_LEN_0FE3_P_2) },
4149 /* PREFIX_VEX_0FE4 */
4151 { Bad_Opcode },
4152 { Bad_Opcode },
4153 { VEX_LEN_TABLE (VEX_LEN_0FE4_P_2) },
4156 /* PREFIX_VEX_0FE5 */
4158 { Bad_Opcode },
4159 { Bad_Opcode },
4160 { VEX_LEN_TABLE (VEX_LEN_0FE5_P_2) },
4163 /* PREFIX_VEX_0FE6 */
4165 { Bad_Opcode },
4166 { VEX_W_TABLE (VEX_W_0FE6_P_1) },
4167 { VEX_W_TABLE (VEX_W_0FE6_P_2) },
4168 { VEX_W_TABLE (VEX_W_0FE6_P_3) },
4171 /* PREFIX_VEX_0FE7 */
4173 { Bad_Opcode },
4174 { Bad_Opcode },
4175 { MOD_TABLE (MOD_VEX_0FE7_PREFIX_2) },
4178 /* PREFIX_VEX_0FE8 */
4180 { Bad_Opcode },
4181 { Bad_Opcode },
4182 { VEX_LEN_TABLE (VEX_LEN_0FE8_P_2) },
4185 /* PREFIX_VEX_0FE9 */
4187 { Bad_Opcode },
4188 { Bad_Opcode },
4189 { VEX_LEN_TABLE (VEX_LEN_0FE9_P_2) },
4192 /* PREFIX_VEX_0FEA */
4194 { Bad_Opcode },
4195 { Bad_Opcode },
4196 { VEX_LEN_TABLE (VEX_LEN_0FEA_P_2) },
4199 /* PREFIX_VEX_0FEB */
4201 { Bad_Opcode },
4202 { Bad_Opcode },
4203 { VEX_LEN_TABLE (VEX_LEN_0FEB_P_2) },
4206 /* PREFIX_VEX_0FEC */
4208 { Bad_Opcode },
4209 { Bad_Opcode },
4210 { VEX_LEN_TABLE (VEX_LEN_0FEC_P_2) },
4213 /* PREFIX_VEX_0FED */
4215 { Bad_Opcode },
4216 { Bad_Opcode },
4217 { VEX_LEN_TABLE (VEX_LEN_0FED_P_2) },
4220 /* PREFIX_VEX_0FEE */
4222 { Bad_Opcode },
4223 { Bad_Opcode },
4224 { VEX_LEN_TABLE (VEX_LEN_0FEE_P_2) },
4227 /* PREFIX_VEX_0FEF */
4229 { Bad_Opcode },
4230 { Bad_Opcode },
4231 { VEX_LEN_TABLE (VEX_LEN_0FEF_P_2) },
4234 /* PREFIX_VEX_0FF0 */
4236 { Bad_Opcode },
4237 { Bad_Opcode },
4238 { Bad_Opcode },
4239 { MOD_TABLE (MOD_VEX_0FF0_PREFIX_3) },
4242 /* PREFIX_VEX_0FF1 */
4244 { Bad_Opcode },
4245 { Bad_Opcode },
4246 { VEX_LEN_TABLE (VEX_LEN_0FF1_P_2) },
4249 /* PREFIX_VEX_0FF2 */
4251 { Bad_Opcode },
4252 { Bad_Opcode },
4253 { VEX_LEN_TABLE (VEX_LEN_0FF2_P_2) },
4256 /* PREFIX_VEX_0FF3 */
4258 { Bad_Opcode },
4259 { Bad_Opcode },
4260 { VEX_LEN_TABLE (VEX_LEN_0FF3_P_2) },
4263 /* PREFIX_VEX_0FF4 */
4265 { Bad_Opcode },
4266 { Bad_Opcode },
4267 { VEX_LEN_TABLE (VEX_LEN_0FF4_P_2) },
4270 /* PREFIX_VEX_0FF5 */
4272 { Bad_Opcode },
4273 { Bad_Opcode },
4274 { VEX_LEN_TABLE (VEX_LEN_0FF5_P_2) },
4277 /* PREFIX_VEX_0FF6 */
4279 { Bad_Opcode },
4280 { Bad_Opcode },
4281 { VEX_LEN_TABLE (VEX_LEN_0FF6_P_2) },
4284 /* PREFIX_VEX_0FF7 */
4286 { Bad_Opcode },
4287 { Bad_Opcode },
4288 { VEX_LEN_TABLE (VEX_LEN_0FF7_P_2) },
4291 /* PREFIX_VEX_0FF8 */
4293 { Bad_Opcode },
4294 { Bad_Opcode },
4295 { VEX_LEN_TABLE (VEX_LEN_0FF8_P_2) },
4298 /* PREFIX_VEX_0FF9 */
4300 { Bad_Opcode },
4301 { Bad_Opcode },
4302 { VEX_LEN_TABLE (VEX_LEN_0FF9_P_2) },
4305 /* PREFIX_VEX_0FFA */
4307 { Bad_Opcode },
4308 { Bad_Opcode },
4309 { VEX_LEN_TABLE (VEX_LEN_0FFA_P_2) },
4312 /* PREFIX_VEX_0FFB */
4314 { Bad_Opcode },
4315 { Bad_Opcode },
4316 { VEX_LEN_TABLE (VEX_LEN_0FFB_P_2) },
4319 /* PREFIX_VEX_0FFC */
4321 { Bad_Opcode },
4322 { Bad_Opcode },
4323 { VEX_LEN_TABLE (VEX_LEN_0FFC_P_2) },
4326 /* PREFIX_VEX_0FFD */
4328 { Bad_Opcode },
4329 { Bad_Opcode },
4330 { VEX_LEN_TABLE (VEX_LEN_0FFD_P_2) },
4333 /* PREFIX_VEX_0FFE */
4335 { Bad_Opcode },
4336 { Bad_Opcode },
4337 { VEX_LEN_TABLE (VEX_LEN_0FFE_P_2) },
4340 /* PREFIX_VEX_0F3800 */
4342 { Bad_Opcode },
4343 { Bad_Opcode },
4344 { VEX_LEN_TABLE (VEX_LEN_0F3800_P_2) },
4347 /* PREFIX_VEX_0F3801 */
4349 { Bad_Opcode },
4350 { Bad_Opcode },
4351 { VEX_LEN_TABLE (VEX_LEN_0F3801_P_2) },
4354 /* PREFIX_VEX_0F3802 */
4356 { Bad_Opcode },
4357 { Bad_Opcode },
4358 { VEX_LEN_TABLE (VEX_LEN_0F3802_P_2) },
4361 /* PREFIX_VEX_0F3803 */
4363 { Bad_Opcode },
4364 { Bad_Opcode },
4365 { VEX_LEN_TABLE (VEX_LEN_0F3803_P_2) },
4368 /* PREFIX_VEX_0F3804 */
4370 { Bad_Opcode },
4371 { Bad_Opcode },
4372 { VEX_LEN_TABLE (VEX_LEN_0F3804_P_2) },
4375 /* PREFIX_VEX_0F3805 */
4377 { Bad_Opcode },
4378 { Bad_Opcode },
4379 { VEX_LEN_TABLE (VEX_LEN_0F3805_P_2) },
4382 /* PREFIX_VEX_0F3806 */
4384 { Bad_Opcode },
4385 { Bad_Opcode },
4386 { VEX_LEN_TABLE (VEX_LEN_0F3806_P_2) },
4389 /* PREFIX_VEX_0F3807 */
4391 { Bad_Opcode },
4392 { Bad_Opcode },
4393 { VEX_LEN_TABLE (VEX_LEN_0F3807_P_2) },
4396 /* PREFIX_VEX_0F3808 */
4398 { Bad_Opcode },
4399 { Bad_Opcode },
4400 { VEX_LEN_TABLE (VEX_LEN_0F3808_P_2) },
4403 /* PREFIX_VEX_0F3809 */
4405 { Bad_Opcode },
4406 { Bad_Opcode },
4407 { VEX_LEN_TABLE (VEX_LEN_0F3809_P_2) },
4410 /* PREFIX_VEX_0F380A */
4412 { Bad_Opcode },
4413 { Bad_Opcode },
4414 { VEX_LEN_TABLE (VEX_LEN_0F380A_P_2) },
4417 /* PREFIX_VEX_0F380B */
4419 { Bad_Opcode },
4420 { Bad_Opcode },
4421 { VEX_LEN_TABLE (VEX_LEN_0F380B_P_2) },
4424 /* PREFIX_VEX_0F380C */
4426 { Bad_Opcode },
4427 { Bad_Opcode },
4428 { VEX_W_TABLE (VEX_W_0F380C_P_2) },
4431 /* PREFIX_VEX_0F380D */
4433 { Bad_Opcode },
4434 { Bad_Opcode },
4435 { VEX_W_TABLE (VEX_W_0F380D_P_2) },
4438 /* PREFIX_VEX_0F380E */
4440 { Bad_Opcode },
4441 { Bad_Opcode },
4442 { VEX_W_TABLE (VEX_W_0F380E_P_2) },
4445 /* PREFIX_VEX_0F380F */
4447 { Bad_Opcode },
4448 { Bad_Opcode },
4449 { VEX_W_TABLE (VEX_W_0F380F_P_2) },
4452 /* PREFIX_VEX_0F3813 */
4454 { Bad_Opcode },
4455 { Bad_Opcode },
4456 { "vcvtph2ps", { XM, EXxmmq } },
4459 /* PREFIX_VEX_0F3817 */
4461 { Bad_Opcode },
4462 { Bad_Opcode },
4463 { VEX_W_TABLE (VEX_W_0F3817_P_2) },
4466 /* PREFIX_VEX_0F3818 */
4468 { Bad_Opcode },
4469 { Bad_Opcode },
4470 { MOD_TABLE (MOD_VEX_0F3818_PREFIX_2) },
4473 /* PREFIX_VEX_0F3819 */
4475 { Bad_Opcode },
4476 { Bad_Opcode },
4477 { MOD_TABLE (MOD_VEX_0F3819_PREFIX_2) },
4480 /* PREFIX_VEX_0F381A */
4482 { Bad_Opcode },
4483 { Bad_Opcode },
4484 { MOD_TABLE (MOD_VEX_0F381A_PREFIX_2) },
4487 /* PREFIX_VEX_0F381C */
4489 { Bad_Opcode },
4490 { Bad_Opcode },
4491 { VEX_LEN_TABLE (VEX_LEN_0F381C_P_2) },
4494 /* PREFIX_VEX_0F381D */
4496 { Bad_Opcode },
4497 { Bad_Opcode },
4498 { VEX_LEN_TABLE (VEX_LEN_0F381D_P_2) },
4501 /* PREFIX_VEX_0F381E */
4503 { Bad_Opcode },
4504 { Bad_Opcode },
4505 { VEX_LEN_TABLE (VEX_LEN_0F381E_P_2) },
4508 /* PREFIX_VEX_0F3820 */
4510 { Bad_Opcode },
4511 { Bad_Opcode },
4512 { VEX_LEN_TABLE (VEX_LEN_0F3820_P_2) },
4515 /* PREFIX_VEX_0F3821 */
4517 { Bad_Opcode },
4518 { Bad_Opcode },
4519 { VEX_LEN_TABLE (VEX_LEN_0F3821_P_2) },
4522 /* PREFIX_VEX_0F3822 */
4524 { Bad_Opcode },
4525 { Bad_Opcode },
4526 { VEX_LEN_TABLE (VEX_LEN_0F3822_P_2) },
4529 /* PREFIX_VEX_0F3823 */
4531 { Bad_Opcode },
4532 { Bad_Opcode },
4533 { VEX_LEN_TABLE (VEX_LEN_0F3823_P_2) },
4536 /* PREFIX_VEX_0F3824 */
4538 { Bad_Opcode },
4539 { Bad_Opcode },
4540 { VEX_LEN_TABLE (VEX_LEN_0F3824_P_2) },
4543 /* PREFIX_VEX_0F3825 */
4545 { Bad_Opcode },
4546 { Bad_Opcode },
4547 { VEX_LEN_TABLE (VEX_LEN_0F3825_P_2) },
4550 /* PREFIX_VEX_0F3828 */
4552 { Bad_Opcode },
4553 { Bad_Opcode },
4554 { VEX_LEN_TABLE (VEX_LEN_0F3828_P_2) },
4557 /* PREFIX_VEX_0F3829 */
4559 { Bad_Opcode },
4560 { Bad_Opcode },
4561 { VEX_LEN_TABLE (VEX_LEN_0F3829_P_2) },
4564 /* PREFIX_VEX_0F382A */
4566 { Bad_Opcode },
4567 { Bad_Opcode },
4568 { MOD_TABLE (MOD_VEX_0F382A_PREFIX_2) },
4571 /* PREFIX_VEX_0F382B */
4573 { Bad_Opcode },
4574 { Bad_Opcode },
4575 { VEX_LEN_TABLE (VEX_LEN_0F382B_P_2) },
4578 /* PREFIX_VEX_0F382C */
4580 { Bad_Opcode },
4581 { Bad_Opcode },
4582 { MOD_TABLE (MOD_VEX_0F382C_PREFIX_2) },
4585 /* PREFIX_VEX_0F382D */
4587 { Bad_Opcode },
4588 { Bad_Opcode },
4589 { MOD_TABLE (MOD_VEX_0F382D_PREFIX_2) },
4592 /* PREFIX_VEX_0F382E */
4594 { Bad_Opcode },
4595 { Bad_Opcode },
4596 { MOD_TABLE (MOD_VEX_0F382E_PREFIX_2) },
4599 /* PREFIX_VEX_0F382F */
4601 { Bad_Opcode },
4602 { Bad_Opcode },
4603 { MOD_TABLE (MOD_VEX_0F382F_PREFIX_2) },
4606 /* PREFIX_VEX_0F3830 */
4608 { Bad_Opcode },
4609 { Bad_Opcode },
4610 { VEX_LEN_TABLE (VEX_LEN_0F3830_P_2) },
4613 /* PREFIX_VEX_0F3831 */
4615 { Bad_Opcode },
4616 { Bad_Opcode },
4617 { VEX_LEN_TABLE (VEX_LEN_0F3831_P_2) },
4620 /* PREFIX_VEX_0F3832 */
4622 { Bad_Opcode },
4623 { Bad_Opcode },
4624 { VEX_LEN_TABLE (VEX_LEN_0F3832_P_2) },
4627 /* PREFIX_VEX_0F3833 */
4629 { Bad_Opcode },
4630 { Bad_Opcode },
4631 { VEX_LEN_TABLE (VEX_LEN_0F3833_P_2) },
4634 /* PREFIX_VEX_0F3834 */
4636 { Bad_Opcode },
4637 { Bad_Opcode },
4638 { VEX_LEN_TABLE (VEX_LEN_0F3834_P_2) },
4641 /* PREFIX_VEX_0F3835 */
4643 { Bad_Opcode },
4644 { Bad_Opcode },
4645 { VEX_LEN_TABLE (VEX_LEN_0F3835_P_2) },
4648 /* PREFIX_VEX_0F3837 */
4650 { Bad_Opcode },
4651 { Bad_Opcode },
4652 { VEX_LEN_TABLE (VEX_LEN_0F3837_P_2) },
4655 /* PREFIX_VEX_0F3838 */
4657 { Bad_Opcode },
4658 { Bad_Opcode },
4659 { VEX_LEN_TABLE (VEX_LEN_0F3838_P_2) },
4662 /* PREFIX_VEX_0F3839 */
4664 { Bad_Opcode },
4665 { Bad_Opcode },
4666 { VEX_LEN_TABLE (VEX_LEN_0F3839_P_2) },
4669 /* PREFIX_VEX_0F383A */
4671 { Bad_Opcode },
4672 { Bad_Opcode },
4673 { VEX_LEN_TABLE (VEX_LEN_0F383A_P_2) },
4676 /* PREFIX_VEX_0F383B */
4678 { Bad_Opcode },
4679 { Bad_Opcode },
4680 { VEX_LEN_TABLE (VEX_LEN_0F383B_P_2) },
4683 /* PREFIX_VEX_0F383C */
4685 { Bad_Opcode },
4686 { Bad_Opcode },
4687 { VEX_LEN_TABLE (VEX_LEN_0F383C_P_2) },
4690 /* PREFIX_VEX_0F383D */
4692 { Bad_Opcode },
4693 { Bad_Opcode },
4694 { VEX_LEN_TABLE (VEX_LEN_0F383D_P_2) },
4697 /* PREFIX_VEX_0F383E */
4699 { Bad_Opcode },
4700 { Bad_Opcode },
4701 { VEX_LEN_TABLE (VEX_LEN_0F383E_P_2) },
4704 /* PREFIX_VEX_0F383F */
4706 { Bad_Opcode },
4707 { Bad_Opcode },
4708 { VEX_LEN_TABLE (VEX_LEN_0F383F_P_2) },
4711 /* PREFIX_VEX_0F3840 */
4713 { Bad_Opcode },
4714 { Bad_Opcode },
4715 { VEX_LEN_TABLE (VEX_LEN_0F3840_P_2) },
4718 /* PREFIX_VEX_0F3841 */
4720 { Bad_Opcode },
4721 { Bad_Opcode },
4722 { VEX_LEN_TABLE (VEX_LEN_0F3841_P_2) },
4725 /* PREFIX_VEX_0F3896 */
4727 { Bad_Opcode },
4728 { Bad_Opcode },
4729 { "vfmaddsub132p%XW", { XM, Vex, EXx } },
4732 /* PREFIX_VEX_0F3897 */
4734 { Bad_Opcode },
4735 { Bad_Opcode },
4736 { "vfmsubadd132p%XW", { XM, Vex, EXx } },
4739 /* PREFIX_VEX_0F3898 */
4741 { Bad_Opcode },
4742 { Bad_Opcode },
4743 { "vfmadd132p%XW", { XM, Vex, EXx } },
4746 /* PREFIX_VEX_0F3899 */
4748 { Bad_Opcode },
4749 { Bad_Opcode },
4750 { "vfmadd132s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
4753 /* PREFIX_VEX_0F389A */
4755 { Bad_Opcode },
4756 { Bad_Opcode },
4757 { "vfmsub132p%XW", { XM, Vex, EXx } },
4760 /* PREFIX_VEX_0F389B */
4762 { Bad_Opcode },
4763 { Bad_Opcode },
4764 { "vfmsub132s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
4767 /* PREFIX_VEX_0F389C */
4769 { Bad_Opcode },
4770 { Bad_Opcode },
4771 { "vfnmadd132p%XW", { XM, Vex, EXx } },
4774 /* PREFIX_VEX_0F389D */
4776 { Bad_Opcode },
4777 { Bad_Opcode },
4778 { "vfnmadd132s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
4781 /* PREFIX_VEX_0F389E */
4783 { Bad_Opcode },
4784 { Bad_Opcode },
4785 { "vfnmsub132p%XW", { XM, Vex, EXx } },
4788 /* PREFIX_VEX_0F389F */
4790 { Bad_Opcode },
4791 { Bad_Opcode },
4792 { "vfnmsub132s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
4795 /* PREFIX_VEX_0F38A6 */
4797 { Bad_Opcode },
4798 { Bad_Opcode },
4799 { "vfmaddsub213p%XW", { XM, Vex, EXx } },
4800 { Bad_Opcode },
4803 /* PREFIX_VEX_0F38A7 */
4805 { Bad_Opcode },
4806 { Bad_Opcode },
4807 { "vfmsubadd213p%XW", { XM, Vex, EXx } },
4810 /* PREFIX_VEX_0F38A8 */
4812 { Bad_Opcode },
4813 { Bad_Opcode },
4814 { "vfmadd213p%XW", { XM, Vex, EXx } },
4817 /* PREFIX_VEX_0F38A9 */
4819 { Bad_Opcode },
4820 { Bad_Opcode },
4821 { "vfmadd213s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
4824 /* PREFIX_VEX_0F38AA */
4826 { Bad_Opcode },
4827 { Bad_Opcode },
4828 { "vfmsub213p%XW", { XM, Vex, EXx } },
4831 /* PREFIX_VEX_0F38AB */
4833 { Bad_Opcode },
4834 { Bad_Opcode },
4835 { "vfmsub213s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
4838 /* PREFIX_VEX_0F38AC */
4840 { Bad_Opcode },
4841 { Bad_Opcode },
4842 { "vfnmadd213p%XW", { XM, Vex, EXx } },
4845 /* PREFIX_VEX_0F38AD */
4847 { Bad_Opcode },
4848 { Bad_Opcode },
4849 { "vfnmadd213s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
4852 /* PREFIX_VEX_0F38AE */
4854 { Bad_Opcode },
4855 { Bad_Opcode },
4856 { "vfnmsub213p%XW", { XM, Vex, EXx } },
4859 /* PREFIX_VEX_0F38AF */
4861 { Bad_Opcode },
4862 { Bad_Opcode },
4863 { "vfnmsub213s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
4866 /* PREFIX_VEX_0F38B6 */
4868 { Bad_Opcode },
4869 { Bad_Opcode },
4870 { "vfmaddsub231p%XW", { XM, Vex, EXx } },
4873 /* PREFIX_VEX_0F38B7 */
4875 { Bad_Opcode },
4876 { Bad_Opcode },
4877 { "vfmsubadd231p%XW", { XM, Vex, EXx } },
4880 /* PREFIX_VEX_0F38B8 */
4882 { Bad_Opcode },
4883 { Bad_Opcode },
4884 { "vfmadd231p%XW", { XM, Vex, EXx } },
4887 /* PREFIX_VEX_0F38B9 */
4889 { Bad_Opcode },
4890 { Bad_Opcode },
4891 { "vfmadd231s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
4894 /* PREFIX_VEX_0F38BA */
4896 { Bad_Opcode },
4897 { Bad_Opcode },
4898 { "vfmsub231p%XW", { XM, Vex, EXx } },
4901 /* PREFIX_VEX_0F38BB */
4903 { Bad_Opcode },
4904 { Bad_Opcode },
4905 { "vfmsub231s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
4908 /* PREFIX_VEX_0F38BC */
4910 { Bad_Opcode },
4911 { Bad_Opcode },
4912 { "vfnmadd231p%XW", { XM, Vex, EXx } },
4915 /* PREFIX_VEX_0F38BD */
4917 { Bad_Opcode },
4918 { Bad_Opcode },
4919 { "vfnmadd231s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
4922 /* PREFIX_VEX_0F38BE */
4924 { Bad_Opcode },
4925 { Bad_Opcode },
4926 { "vfnmsub231p%XW", { XM, Vex, EXx } },
4929 /* PREFIX_VEX_0F38BF */
4931 { Bad_Opcode },
4932 { Bad_Opcode },
4933 { "vfnmsub231s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
4936 /* PREFIX_VEX_0F38DB */
4938 { Bad_Opcode },
4939 { Bad_Opcode },
4940 { VEX_LEN_TABLE (VEX_LEN_0F38DB_P_2) },
4943 /* PREFIX_VEX_0F38DC */
4945 { Bad_Opcode },
4946 { Bad_Opcode },
4947 { VEX_LEN_TABLE (VEX_LEN_0F38DC_P_2) },
4950 /* PREFIX_VEX_0F38DD */
4952 { Bad_Opcode },
4953 { Bad_Opcode },
4954 { VEX_LEN_TABLE (VEX_LEN_0F38DD_P_2) },
4957 /* PREFIX_VEX_0F38DE */
4959 { Bad_Opcode },
4960 { Bad_Opcode },
4961 { VEX_LEN_TABLE (VEX_LEN_0F38DE_P_2) },
4964 /* PREFIX_VEX_0F38DF */
4966 { Bad_Opcode },
4967 { Bad_Opcode },
4968 { VEX_LEN_TABLE (VEX_LEN_0F38DF_P_2) },
4971 /* PREFIX_VEX_0F3A04 */
4973 { Bad_Opcode },
4974 { Bad_Opcode },
4975 { VEX_W_TABLE (VEX_W_0F3A04_P_2) },
4978 /* PREFIX_VEX_0F3A05 */
4980 { Bad_Opcode },
4981 { Bad_Opcode },
4982 { VEX_W_TABLE (VEX_W_0F3A05_P_2) },
4985 /* PREFIX_VEX_0F3A06 */
4987 { Bad_Opcode },
4988 { Bad_Opcode },
4989 { VEX_LEN_TABLE (VEX_LEN_0F3A06_P_2) },
4992 /* PREFIX_VEX_0F3A08 */
4994 { Bad_Opcode },
4995 { Bad_Opcode },
4996 { VEX_W_TABLE (VEX_W_0F3A08_P_2) },
4999 /* PREFIX_VEX_0F3A09 */
5001 { Bad_Opcode },
5002 { Bad_Opcode },
5003 { VEX_W_TABLE (VEX_W_0F3A09_P_2) },
5006 /* PREFIX_VEX_0F3A0A */
5008 { Bad_Opcode },
5009 { Bad_Opcode },
5010 { VEX_LEN_TABLE (VEX_LEN_0F3A0A_P_2) },
5013 /* PREFIX_VEX_0F3A0B */
5015 { Bad_Opcode },
5016 { Bad_Opcode },
5017 { VEX_LEN_TABLE (VEX_LEN_0F3A0B_P_2) },
5020 /* PREFIX_VEX_0F3A0C */
5022 { Bad_Opcode },
5023 { Bad_Opcode },
5024 { VEX_W_TABLE (VEX_W_0F3A0C_P_2) },
5027 /* PREFIX_VEX_0F3A0D */
5029 { Bad_Opcode },
5030 { Bad_Opcode },
5031 { VEX_W_TABLE (VEX_W_0F3A0D_P_2) },
5034 /* PREFIX_VEX_0F3A0E */
5036 { Bad_Opcode },
5037 { Bad_Opcode },
5038 { VEX_LEN_TABLE (VEX_LEN_0F3A0E_P_2) },
5041 /* PREFIX_VEX_0F3A0F */
5043 { Bad_Opcode },
5044 { Bad_Opcode },
5045 { VEX_LEN_TABLE (VEX_LEN_0F3A0F_P_2) },
5048 /* PREFIX_VEX_0F3A14 */
5050 { Bad_Opcode },
5051 { Bad_Opcode },
5052 { VEX_LEN_TABLE (VEX_LEN_0F3A14_P_2) },
5055 /* PREFIX_VEX_0F3A15 */
5057 { Bad_Opcode },
5058 { Bad_Opcode },
5059 { VEX_LEN_TABLE (VEX_LEN_0F3A15_P_2) },
5062 /* PREFIX_VEX_0F3A16 */
5064 { Bad_Opcode },
5065 { Bad_Opcode },
5066 { VEX_LEN_TABLE (VEX_LEN_0F3A16_P_2) },
5069 /* PREFIX_VEX_0F3A17 */
5071 { Bad_Opcode },
5072 { Bad_Opcode },
5073 { VEX_LEN_TABLE (VEX_LEN_0F3A17_P_2) },
5076 /* PREFIX_VEX_0F3A18 */
5078 { Bad_Opcode },
5079 { Bad_Opcode },
5080 { VEX_LEN_TABLE (VEX_LEN_0F3A18_P_2) },
5083 /* PREFIX_VEX_0F3A19 */
5085 { Bad_Opcode },
5086 { Bad_Opcode },
5087 { VEX_LEN_TABLE (VEX_LEN_0F3A19_P_2) },
5090 /* PREFIX_VEX_0F3A1D */
5092 { Bad_Opcode },
5093 { Bad_Opcode },
5094 { "vcvtps2ph", { EXxmmq, XM, Ib } },
5097 /* PREFIX_VEX_0F3A20 */
5099 { Bad_Opcode },
5100 { Bad_Opcode },
5101 { VEX_LEN_TABLE (VEX_LEN_0F3A20_P_2) },
5104 /* PREFIX_VEX_0F3A21 */
5106 { Bad_Opcode },
5107 { Bad_Opcode },
5108 { VEX_LEN_TABLE (VEX_LEN_0F3A21_P_2) },
5111 /* PREFIX_VEX_0F3A22 */
5113 { Bad_Opcode },
5114 { Bad_Opcode },
5115 { VEX_LEN_TABLE (VEX_LEN_0F3A22_P_2) },
5118 /* PREFIX_VEX_0F3A40 */
5120 { Bad_Opcode },
5121 { Bad_Opcode },
5122 { VEX_W_TABLE (VEX_W_0F3A40_P_2) },
5125 /* PREFIX_VEX_0F3A41 */
5127 { Bad_Opcode },
5128 { Bad_Opcode },
5129 { VEX_LEN_TABLE (VEX_LEN_0F3A41_P_2) },
5132 /* PREFIX_VEX_0F3A42 */
5134 { Bad_Opcode },
5135 { Bad_Opcode },
5136 { VEX_LEN_TABLE (VEX_LEN_0F3A42_P_2) },
5139 /* PREFIX_VEX_0F3A44 */
5141 { Bad_Opcode },
5142 { Bad_Opcode },
5143 { VEX_LEN_TABLE (VEX_LEN_0F3A44_P_2) },
5146 /* PREFIX_VEX_0F3A48 */
5148 { Bad_Opcode },
5149 { Bad_Opcode },
5150 { VEX_W_TABLE (VEX_W_0F3A48_P_2) },
5153 /* PREFIX_VEX_0F3A49 */
5155 { Bad_Opcode },
5156 { Bad_Opcode },
5157 { VEX_W_TABLE (VEX_W_0F3A49_P_2) },
5160 /* PREFIX_VEX_0F3A4A */
5162 { Bad_Opcode },
5163 { Bad_Opcode },
5164 { VEX_W_TABLE (VEX_W_0F3A4A_P_2) },
5167 /* PREFIX_VEX_0F3A4B */
5169 { Bad_Opcode },
5170 { Bad_Opcode },
5171 { VEX_W_TABLE (VEX_W_0F3A4B_P_2) },
5174 /* PREFIX_VEX_0F3A4C */
5176 { Bad_Opcode },
5177 { Bad_Opcode },
5178 { VEX_LEN_TABLE (VEX_LEN_0F3A4C_P_2) },
5181 /* PREFIX_VEX_0F3A5C */
5183 { Bad_Opcode },
5184 { Bad_Opcode },
5185 { "vfmaddsubps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5188 /* PREFIX_VEX_0F3A5D */
5190 { Bad_Opcode },
5191 { Bad_Opcode },
5192 { "vfmaddsubpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5195 /* PREFIX_VEX_0F3A5E */
5197 { Bad_Opcode },
5198 { Bad_Opcode },
5199 { "vfmsubaddps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5202 /* PREFIX_VEX_0F3A5F */
5204 { Bad_Opcode },
5205 { Bad_Opcode },
5206 { "vfmsubaddpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5209 /* PREFIX_VEX_0F3A60 */
5211 { Bad_Opcode },
5212 { Bad_Opcode },
5213 { VEX_LEN_TABLE (VEX_LEN_0F3A60_P_2) },
5214 { Bad_Opcode },
5217 /* PREFIX_VEX_0F3A61 */
5219 { Bad_Opcode },
5220 { Bad_Opcode },
5221 { VEX_LEN_TABLE (VEX_LEN_0F3A61_P_2) },
5224 /* PREFIX_VEX_0F3A62 */
5226 { Bad_Opcode },
5227 { Bad_Opcode },
5228 { VEX_LEN_TABLE (VEX_LEN_0F3A62_P_2) },
5231 /* PREFIX_VEX_0F3A63 */
5233 { Bad_Opcode },
5234 { Bad_Opcode },
5235 { VEX_LEN_TABLE (VEX_LEN_0F3A63_P_2) },
5238 /* PREFIX_VEX_0F3A68 */
5240 { Bad_Opcode },
5241 { Bad_Opcode },
5242 { "vfmaddps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5245 /* PREFIX_VEX_0F3A69 */
5247 { Bad_Opcode },
5248 { Bad_Opcode },
5249 { "vfmaddpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5252 /* PREFIX_VEX_0F3A6A */
5254 { Bad_Opcode },
5255 { Bad_Opcode },
5256 { VEX_LEN_TABLE (VEX_LEN_0F3A6A_P_2) },
5259 /* PREFIX_VEX_0F3A6B */
5261 { Bad_Opcode },
5262 { Bad_Opcode },
5263 { VEX_LEN_TABLE (VEX_LEN_0F3A6B_P_2) },
5266 /* PREFIX_VEX_0F3A6C */
5268 { Bad_Opcode },
5269 { Bad_Opcode },
5270 { "vfmsubps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5273 /* PREFIX_VEX_0F3A6D */
5275 { Bad_Opcode },
5276 { Bad_Opcode },
5277 { "vfmsubpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5280 /* PREFIX_VEX_0F3A6E */
5282 { Bad_Opcode },
5283 { Bad_Opcode },
5284 { VEX_LEN_TABLE (VEX_LEN_0F3A6E_P_2) },
5287 /* PREFIX_VEX_0F3A6F */
5289 { Bad_Opcode },
5290 { Bad_Opcode },
5291 { VEX_LEN_TABLE (VEX_LEN_0F3A6F_P_2) },
5294 /* PREFIX_VEX_0F3A78 */
5296 { Bad_Opcode },
5297 { Bad_Opcode },
5298 { "vfnmaddps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5301 /* PREFIX_VEX_0F3A79 */
5303 { Bad_Opcode },
5304 { Bad_Opcode },
5305 { "vfnmaddpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5308 /* PREFIX_VEX_0F3A7A */
5310 { Bad_Opcode },
5311 { Bad_Opcode },
5312 { VEX_LEN_TABLE (VEX_LEN_0F3A7A_P_2) },
5315 /* PREFIX_VEX_0F3A7B */
5317 { Bad_Opcode },
5318 { Bad_Opcode },
5319 { VEX_LEN_TABLE (VEX_LEN_0F3A7B_P_2) },
5322 /* PREFIX_VEX_0F3A7C */
5324 { Bad_Opcode },
5325 { Bad_Opcode },
5326 { "vfnmsubps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5327 { Bad_Opcode },
5330 /* PREFIX_VEX_0F3A7D */
5332 { Bad_Opcode },
5333 { Bad_Opcode },
5334 { "vfnmsubpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5337 /* PREFIX_VEX_0F3A7E */
5339 { Bad_Opcode },
5340 { Bad_Opcode },
5341 { VEX_LEN_TABLE (VEX_LEN_0F3A7E_P_2) },
5344 /* PREFIX_VEX_0F3A7F */
5346 { Bad_Opcode },
5347 { Bad_Opcode },
5348 { VEX_LEN_TABLE (VEX_LEN_0F3A7F_P_2) },
5351 /* PREFIX_VEX_0F3ADF */
5353 { Bad_Opcode },
5354 { Bad_Opcode },
5355 { VEX_LEN_TABLE (VEX_LEN_0F3ADF_P_2) },
5359 static const struct dis386 x86_64_table[][2] = {
5360 /* X86_64_06 */
5362 { "pushP", { es } },
5365 /* X86_64_07 */
5367 { "popP", { es } },
5370 /* X86_64_0D */
5372 { "pushP", { cs } },
5375 /* X86_64_16 */
5377 { "pushP", { ss } },
5380 /* X86_64_17 */
5382 { "popP", { ss } },
5385 /* X86_64_1E */
5387 { "pushP", { ds } },
5390 /* X86_64_1F */
5392 { "popP", { ds } },
5395 /* X86_64_27 */
5397 { "daa", { XX } },
5400 /* X86_64_2F */
5402 { "das", { XX } },
5405 /* X86_64_37 */
5407 { "aaa", { XX } },
5410 /* X86_64_3F */
5412 { "aas", { XX } },
5415 /* X86_64_60 */
5417 { "pushaP", { XX } },
5420 /* X86_64_61 */
5422 { "popaP", { XX } },
5425 /* X86_64_62 */
5427 { MOD_TABLE (MOD_62_32BIT) },
5430 /* X86_64_63 */
5432 { "arpl", { Ew, Gw } },
5433 { "movs{lq|xd}", { Gv, Ed } },
5436 /* X86_64_6D */
5438 { "ins{R|}", { Yzr, indirDX } },
5439 { "ins{G|}", { Yzr, indirDX } },
5442 /* X86_64_6F */
5444 { "outs{R|}", { indirDXr, Xz } },
5445 { "outs{G|}", { indirDXr, Xz } },
5448 /* X86_64_9A */
5450 { "Jcall{T|}", { Ap } },
5453 /* X86_64_C4 */
5455 { MOD_TABLE (MOD_C4_32BIT) },
5456 { VEX_C4_TABLE (VEX_0F) },
5459 /* X86_64_C5 */
5461 { MOD_TABLE (MOD_C5_32BIT) },
5462 { VEX_C5_TABLE (VEX_0F) },
5465 /* X86_64_CE */
5467 { "into", { XX } },
5470 /* X86_64_D4 */
5472 { "aam", { sIb } },
5475 /* X86_64_D5 */
5477 { "aad", { sIb } },
5480 /* X86_64_EA */
5482 { "Jjmp{T|}", { Ap } },
5485 /* X86_64_0F01_REG_0 */
5487 { "sgdt{Q|IQ}", { M } },
5488 { "sgdt", { M } },
5491 /* X86_64_0F01_REG_1 */
5493 { "sidt{Q|IQ}", { M } },
5494 { "sidt", { M } },
5497 /* X86_64_0F01_REG_2 */
5499 { "lgdt{Q|Q}", { M } },
5500 { "lgdt", { M } },
5503 /* X86_64_0F01_REG_3 */
5505 { "lidt{Q|Q}", { M } },
5506 { "lidt", { M } },
5510 static const struct dis386 three_byte_table[][256] = {
5512 /* THREE_BYTE_0F38 */
5514 /* 00 */
5515 { "pshufb", { MX, EM } },
5516 { "phaddw", { MX, EM } },
5517 { "phaddd", { MX, EM } },
5518 { "phaddsw", { MX, EM } },
5519 { "pmaddubsw", { MX, EM } },
5520 { "phsubw", { MX, EM } },
5521 { "phsubd", { MX, EM } },
5522 { "phsubsw", { MX, EM } },
5523 /* 08 */
5524 { "psignb", { MX, EM } },
5525 { "psignw", { MX, EM } },
5526 { "psignd", { MX, EM } },
5527 { "pmulhrsw", { MX, EM } },
5528 { Bad_Opcode },
5529 { Bad_Opcode },
5530 { Bad_Opcode },
5531 { Bad_Opcode },
5532 /* 10 */
5533 { PREFIX_TABLE (PREFIX_0F3810) },
5534 { Bad_Opcode },
5535 { Bad_Opcode },
5536 { Bad_Opcode },
5537 { PREFIX_TABLE (PREFIX_0F3814) },
5538 { PREFIX_TABLE (PREFIX_0F3815) },
5539 { Bad_Opcode },
5540 { PREFIX_TABLE (PREFIX_0F3817) },
5541 /* 18 */
5542 { Bad_Opcode },
5543 { Bad_Opcode },
5544 { Bad_Opcode },
5545 { Bad_Opcode },
5546 { "pabsb", { MX, EM } },
5547 { "pabsw", { MX, EM } },
5548 { "pabsd", { MX, EM } },
5549 { Bad_Opcode },
5550 /* 20 */
5551 { PREFIX_TABLE (PREFIX_0F3820) },
5552 { PREFIX_TABLE (PREFIX_0F3821) },
5553 { PREFIX_TABLE (PREFIX_0F3822) },
5554 { PREFIX_TABLE (PREFIX_0F3823) },
5555 { PREFIX_TABLE (PREFIX_0F3824) },
5556 { PREFIX_TABLE (PREFIX_0F3825) },
5557 { Bad_Opcode },
5558 { Bad_Opcode },
5559 /* 28 */
5560 { PREFIX_TABLE (PREFIX_0F3828) },
5561 { PREFIX_TABLE (PREFIX_0F3829) },
5562 { PREFIX_TABLE (PREFIX_0F382A) },
5563 { PREFIX_TABLE (PREFIX_0F382B) },
5564 { Bad_Opcode },
5565 { Bad_Opcode },
5566 { Bad_Opcode },
5567 { Bad_Opcode },
5568 /* 30 */
5569 { PREFIX_TABLE (PREFIX_0F3830) },
5570 { PREFIX_TABLE (PREFIX_0F3831) },
5571 { PREFIX_TABLE (PREFIX_0F3832) },
5572 { PREFIX_TABLE (PREFIX_0F3833) },
5573 { PREFIX_TABLE (PREFIX_0F3834) },
5574 { PREFIX_TABLE (PREFIX_0F3835) },
5575 { Bad_Opcode },
5576 { PREFIX_TABLE (PREFIX_0F3837) },
5577 /* 38 */
5578 { PREFIX_TABLE (PREFIX_0F3838) },
5579 { PREFIX_TABLE (PREFIX_0F3839) },
5580 { PREFIX_TABLE (PREFIX_0F383A) },
5581 { PREFIX_TABLE (PREFIX_0F383B) },
5582 { PREFIX_TABLE (PREFIX_0F383C) },
5583 { PREFIX_TABLE (PREFIX_0F383D) },
5584 { PREFIX_TABLE (PREFIX_0F383E) },
5585 { PREFIX_TABLE (PREFIX_0F383F) },
5586 /* 40 */
5587 { PREFIX_TABLE (PREFIX_0F3840) },
5588 { PREFIX_TABLE (PREFIX_0F3841) },
5589 { Bad_Opcode },
5590 { Bad_Opcode },
5591 { Bad_Opcode },
5592 { Bad_Opcode },
5593 { Bad_Opcode },
5594 { Bad_Opcode },
5595 /* 48 */
5596 { Bad_Opcode },
5597 { Bad_Opcode },
5598 { Bad_Opcode },
5599 { Bad_Opcode },
5600 { Bad_Opcode },
5601 { Bad_Opcode },
5602 { Bad_Opcode },
5603 { Bad_Opcode },
5604 /* 50 */
5605 { Bad_Opcode },
5606 { Bad_Opcode },
5607 { Bad_Opcode },
5608 { Bad_Opcode },
5609 { Bad_Opcode },
5610 { Bad_Opcode },
5611 { Bad_Opcode },
5612 { Bad_Opcode },
5613 /* 58 */
5614 { Bad_Opcode },
5615 { Bad_Opcode },
5616 { Bad_Opcode },
5617 { Bad_Opcode },
5618 { Bad_Opcode },
5619 { Bad_Opcode },
5620 { Bad_Opcode },
5621 { Bad_Opcode },
5622 /* 60 */
5623 { Bad_Opcode },
5624 { Bad_Opcode },
5625 { Bad_Opcode },
5626 { Bad_Opcode },
5627 { Bad_Opcode },
5628 { Bad_Opcode },
5629 { Bad_Opcode },
5630 { Bad_Opcode },
5631 /* 68 */
5632 { Bad_Opcode },
5633 { Bad_Opcode },
5634 { Bad_Opcode },
5635 { Bad_Opcode },
5636 { Bad_Opcode },
5637 { Bad_Opcode },
5638 { Bad_Opcode },
5639 { Bad_Opcode },
5640 /* 70 */
5641 { Bad_Opcode },
5642 { Bad_Opcode },
5643 { Bad_Opcode },
5644 { Bad_Opcode },
5645 { Bad_Opcode },
5646 { Bad_Opcode },
5647 { Bad_Opcode },
5648 { Bad_Opcode },
5649 /* 78 */
5650 { Bad_Opcode },
5651 { Bad_Opcode },
5652 { Bad_Opcode },
5653 { Bad_Opcode },
5654 { Bad_Opcode },
5655 { Bad_Opcode },
5656 { Bad_Opcode },
5657 { Bad_Opcode },
5658 /* 80 */
5659 { PREFIX_TABLE (PREFIX_0F3880) },
5660 { PREFIX_TABLE (PREFIX_0F3881) },
5661 { Bad_Opcode },
5662 { Bad_Opcode },
5663 { Bad_Opcode },
5664 { Bad_Opcode },
5665 { Bad_Opcode },
5666 { Bad_Opcode },
5667 /* 88 */
5668 { Bad_Opcode },
5669 { Bad_Opcode },
5670 { Bad_Opcode },
5671 { Bad_Opcode },
5672 { Bad_Opcode },
5673 { Bad_Opcode },
5674 { Bad_Opcode },
5675 { Bad_Opcode },
5676 /* 90 */
5677 { Bad_Opcode },
5678 { Bad_Opcode },
5679 { Bad_Opcode },
5680 { Bad_Opcode },
5681 { Bad_Opcode },
5682 { Bad_Opcode },
5683 { Bad_Opcode },
5684 { Bad_Opcode },
5685 /* 98 */
5686 { Bad_Opcode },
5687 { Bad_Opcode },
5688 { Bad_Opcode },
5689 { Bad_Opcode },
5690 { Bad_Opcode },
5691 { Bad_Opcode },
5692 { Bad_Opcode },
5693 { Bad_Opcode },
5694 /* a0 */
5695 { Bad_Opcode },
5696 { Bad_Opcode },
5697 { Bad_Opcode },
5698 { Bad_Opcode },
5699 { Bad_Opcode },
5700 { Bad_Opcode },
5701 { Bad_Opcode },
5702 { Bad_Opcode },
5703 /* a8 */
5704 { Bad_Opcode },
5705 { Bad_Opcode },
5706 { Bad_Opcode },
5707 { Bad_Opcode },
5708 { Bad_Opcode },
5709 { Bad_Opcode },
5710 { Bad_Opcode },
5711 { Bad_Opcode },
5712 /* b0 */
5713 { Bad_Opcode },
5714 { Bad_Opcode },
5715 { Bad_Opcode },
5716 { Bad_Opcode },
5717 { Bad_Opcode },
5718 { Bad_Opcode },
5719 { Bad_Opcode },
5720 { Bad_Opcode },
5721 /* b8 */
5722 { Bad_Opcode },
5723 { Bad_Opcode },
5724 { Bad_Opcode },
5725 { Bad_Opcode },
5726 { Bad_Opcode },
5727 { Bad_Opcode },
5728 { Bad_Opcode },
5729 { Bad_Opcode },
5730 /* c0 */
5731 { Bad_Opcode },
5732 { Bad_Opcode },
5733 { Bad_Opcode },
5734 { Bad_Opcode },
5735 { Bad_Opcode },
5736 { Bad_Opcode },
5737 { Bad_Opcode },
5738 { Bad_Opcode },
5739 /* c8 */
5740 { Bad_Opcode },
5741 { Bad_Opcode },
5742 { Bad_Opcode },
5743 { Bad_Opcode },
5744 { Bad_Opcode },
5745 { Bad_Opcode },
5746 { Bad_Opcode },
5747 { Bad_Opcode },
5748 /* d0 */
5749 { Bad_Opcode },
5750 { Bad_Opcode },
5751 { Bad_Opcode },
5752 { Bad_Opcode },
5753 { Bad_Opcode },
5754 { Bad_Opcode },
5755 { Bad_Opcode },
5756 { Bad_Opcode },
5757 /* d8 */
5758 { Bad_Opcode },
5759 { Bad_Opcode },
5760 { Bad_Opcode },
5761 { PREFIX_TABLE (PREFIX_0F38DB) },
5762 { PREFIX_TABLE (PREFIX_0F38DC) },
5763 { PREFIX_TABLE (PREFIX_0F38DD) },
5764 { PREFIX_TABLE (PREFIX_0F38DE) },
5765 { PREFIX_TABLE (PREFIX_0F38DF) },
5766 /* e0 */
5767 { Bad_Opcode },
5768 { Bad_Opcode },
5769 { Bad_Opcode },
5770 { Bad_Opcode },
5771 { Bad_Opcode },
5772 { Bad_Opcode },
5773 { Bad_Opcode },
5774 { Bad_Opcode },
5775 /* e8 */
5776 { Bad_Opcode },
5777 { Bad_Opcode },
5778 { Bad_Opcode },
5779 { Bad_Opcode },
5780 { Bad_Opcode },
5781 { Bad_Opcode },
5782 { Bad_Opcode },
5783 { Bad_Opcode },
5784 /* f0 */
5785 { PREFIX_TABLE (PREFIX_0F38F0) },
5786 { PREFIX_TABLE (PREFIX_0F38F1) },
5787 { Bad_Opcode },
5788 { Bad_Opcode },
5789 { Bad_Opcode },
5790 { Bad_Opcode },
5791 { Bad_Opcode },
5792 { Bad_Opcode },
5793 /* f8 */
5794 { Bad_Opcode },
5795 { Bad_Opcode },
5796 { Bad_Opcode },
5797 { Bad_Opcode },
5798 { Bad_Opcode },
5799 { Bad_Opcode },
5800 { Bad_Opcode },
5801 { Bad_Opcode },
5803 /* THREE_BYTE_0F3A */
5805 /* 00 */
5806 { Bad_Opcode },
5807 { Bad_Opcode },
5808 { Bad_Opcode },
5809 { Bad_Opcode },
5810 { Bad_Opcode },
5811 { Bad_Opcode },
5812 { Bad_Opcode },
5813 { Bad_Opcode },
5814 /* 08 */
5815 { PREFIX_TABLE (PREFIX_0F3A08) },
5816 { PREFIX_TABLE (PREFIX_0F3A09) },
5817 { PREFIX_TABLE (PREFIX_0F3A0A) },
5818 { PREFIX_TABLE (PREFIX_0F3A0B) },
5819 { PREFIX_TABLE (PREFIX_0F3A0C) },
5820 { PREFIX_TABLE (PREFIX_0F3A0D) },
5821 { PREFIX_TABLE (PREFIX_0F3A0E) },
5822 { "palignr", { MX, EM, Ib } },
5823 /* 10 */
5824 { Bad_Opcode },
5825 { Bad_Opcode },
5826 { Bad_Opcode },
5827 { Bad_Opcode },
5828 { PREFIX_TABLE (PREFIX_0F3A14) },
5829 { PREFIX_TABLE (PREFIX_0F3A15) },
5830 { PREFIX_TABLE (PREFIX_0F3A16) },
5831 { PREFIX_TABLE (PREFIX_0F3A17) },
5832 /* 18 */
5833 { Bad_Opcode },
5834 { Bad_Opcode },
5835 { Bad_Opcode },
5836 { Bad_Opcode },
5837 { Bad_Opcode },
5838 { Bad_Opcode },
5839 { Bad_Opcode },
5840 { Bad_Opcode },
5841 /* 20 */
5842 { PREFIX_TABLE (PREFIX_0F3A20) },
5843 { PREFIX_TABLE (PREFIX_0F3A21) },
5844 { PREFIX_TABLE (PREFIX_0F3A22) },
5845 { Bad_Opcode },
5846 { Bad_Opcode },
5847 { Bad_Opcode },
5848 { Bad_Opcode },
5849 { Bad_Opcode },
5850 /* 28 */
5851 { Bad_Opcode },
5852 { Bad_Opcode },
5853 { Bad_Opcode },
5854 { Bad_Opcode },
5855 { Bad_Opcode },
5856 { Bad_Opcode },
5857 { Bad_Opcode },
5858 { Bad_Opcode },
5859 /* 30 */
5860 { Bad_Opcode },
5861 { Bad_Opcode },
5862 { Bad_Opcode },
5863 { Bad_Opcode },
5864 { Bad_Opcode },
5865 { Bad_Opcode },
5866 { Bad_Opcode },
5867 { Bad_Opcode },
5868 /* 38 */
5869 { Bad_Opcode },
5870 { Bad_Opcode },
5871 { Bad_Opcode },
5872 { Bad_Opcode },
5873 { Bad_Opcode },
5874 { Bad_Opcode },
5875 { Bad_Opcode },
5876 { Bad_Opcode },
5877 /* 40 */
5878 { PREFIX_TABLE (PREFIX_0F3A40) },
5879 { PREFIX_TABLE (PREFIX_0F3A41) },
5880 { PREFIX_TABLE (PREFIX_0F3A42) },
5881 { Bad_Opcode },
5882 { PREFIX_TABLE (PREFIX_0F3A44) },
5883 { Bad_Opcode },
5884 { Bad_Opcode },
5885 { Bad_Opcode },
5886 /* 48 */
5887 { Bad_Opcode },
5888 { Bad_Opcode },
5889 { Bad_Opcode },
5890 { Bad_Opcode },
5891 { Bad_Opcode },
5892 { Bad_Opcode },
5893 { Bad_Opcode },
5894 { Bad_Opcode },
5895 /* 50 */
5896 { Bad_Opcode },
5897 { Bad_Opcode },
5898 { Bad_Opcode },
5899 { Bad_Opcode },
5900 { Bad_Opcode },
5901 { Bad_Opcode },
5902 { Bad_Opcode },
5903 { Bad_Opcode },
5904 /* 58 */
5905 { Bad_Opcode },
5906 { Bad_Opcode },
5907 { Bad_Opcode },
5908 { Bad_Opcode },
5909 { Bad_Opcode },
5910 { Bad_Opcode },
5911 { Bad_Opcode },
5912 { Bad_Opcode },
5913 /* 60 */
5914 { PREFIX_TABLE (PREFIX_0F3A60) },
5915 { PREFIX_TABLE (PREFIX_0F3A61) },
5916 { PREFIX_TABLE (PREFIX_0F3A62) },
5917 { PREFIX_TABLE (PREFIX_0F3A63) },
5918 { Bad_Opcode },
5919 { Bad_Opcode },
5920 { Bad_Opcode },
5921 { Bad_Opcode },
5922 /* 68 */
5923 { Bad_Opcode },
5924 { Bad_Opcode },
5925 { Bad_Opcode },
5926 { Bad_Opcode },
5927 { Bad_Opcode },
5928 { Bad_Opcode },
5929 { Bad_Opcode },
5930 { Bad_Opcode },
5931 /* 70 */
5932 { Bad_Opcode },
5933 { Bad_Opcode },
5934 { Bad_Opcode },
5935 { Bad_Opcode },
5936 { Bad_Opcode },
5937 { Bad_Opcode },
5938 { Bad_Opcode },
5939 { Bad_Opcode },
5940 /* 78 */
5941 { Bad_Opcode },
5942 { Bad_Opcode },
5943 { Bad_Opcode },
5944 { Bad_Opcode },
5945 { Bad_Opcode },
5946 { Bad_Opcode },
5947 { Bad_Opcode },
5948 { Bad_Opcode },
5949 /* 80 */
5950 { Bad_Opcode },
5951 { Bad_Opcode },
5952 { Bad_Opcode },
5953 { Bad_Opcode },
5954 { Bad_Opcode },
5955 { Bad_Opcode },
5956 { Bad_Opcode },
5957 { Bad_Opcode },
5958 /* 88 */
5959 { Bad_Opcode },
5960 { Bad_Opcode },
5961 { Bad_Opcode },
5962 { Bad_Opcode },
5963 { Bad_Opcode },
5964 { Bad_Opcode },
5965 { Bad_Opcode },
5966 { Bad_Opcode },
5967 /* 90 */
5968 { Bad_Opcode },
5969 { Bad_Opcode },
5970 { Bad_Opcode },
5971 { Bad_Opcode },
5972 { Bad_Opcode },
5973 { Bad_Opcode },
5974 { Bad_Opcode },
5975 { Bad_Opcode },
5976 /* 98 */
5977 { Bad_Opcode },
5978 { Bad_Opcode },
5979 { Bad_Opcode },
5980 { Bad_Opcode },
5981 { Bad_Opcode },
5982 { Bad_Opcode },
5983 { Bad_Opcode },
5984 { Bad_Opcode },
5985 /* a0 */
5986 { Bad_Opcode },
5987 { Bad_Opcode },
5988 { Bad_Opcode },
5989 { Bad_Opcode },
5990 { Bad_Opcode },
5991 { Bad_Opcode },
5992 { Bad_Opcode },
5993 { Bad_Opcode },
5994 /* a8 */
5995 { Bad_Opcode },
5996 { Bad_Opcode },
5997 { Bad_Opcode },
5998 { Bad_Opcode },
5999 { Bad_Opcode },
6000 { Bad_Opcode },
6001 { Bad_Opcode },
6002 { Bad_Opcode },
6003 /* b0 */
6004 { Bad_Opcode },
6005 { Bad_Opcode },
6006 { Bad_Opcode },
6007 { Bad_Opcode },
6008 { Bad_Opcode },
6009 { Bad_Opcode },
6010 { Bad_Opcode },
6011 { Bad_Opcode },
6012 /* b8 */
6013 { Bad_Opcode },
6014 { Bad_Opcode },
6015 { Bad_Opcode },
6016 { Bad_Opcode },
6017 { Bad_Opcode },
6018 { Bad_Opcode },
6019 { Bad_Opcode },
6020 { Bad_Opcode },
6021 /* c0 */
6022 { Bad_Opcode },
6023 { Bad_Opcode },
6024 { Bad_Opcode },
6025 { Bad_Opcode },
6026 { Bad_Opcode },
6027 { Bad_Opcode },
6028 { Bad_Opcode },
6029 { Bad_Opcode },
6030 /* c8 */
6031 { Bad_Opcode },
6032 { Bad_Opcode },
6033 { Bad_Opcode },
6034 { Bad_Opcode },
6035 { Bad_Opcode },
6036 { Bad_Opcode },
6037 { Bad_Opcode },
6038 { Bad_Opcode },
6039 /* d0 */
6040 { Bad_Opcode },
6041 { Bad_Opcode },
6042 { Bad_Opcode },
6043 { Bad_Opcode },
6044 { Bad_Opcode },
6045 { Bad_Opcode },
6046 { Bad_Opcode },
6047 { Bad_Opcode },
6048 /* d8 */
6049 { Bad_Opcode },
6050 { Bad_Opcode },
6051 { Bad_Opcode },
6052 { Bad_Opcode },
6053 { Bad_Opcode },
6054 { Bad_Opcode },
6055 { Bad_Opcode },
6056 { PREFIX_TABLE (PREFIX_0F3ADF) },
6057 /* e0 */
6058 { Bad_Opcode },
6059 { Bad_Opcode },
6060 { Bad_Opcode },
6061 { Bad_Opcode },
6062 { Bad_Opcode },
6063 { Bad_Opcode },
6064 { Bad_Opcode },
6065 { Bad_Opcode },
6066 /* e8 */
6067 { Bad_Opcode },
6068 { Bad_Opcode },
6069 { Bad_Opcode },
6070 { Bad_Opcode },
6071 { Bad_Opcode },
6072 { Bad_Opcode },
6073 { Bad_Opcode },
6074 { Bad_Opcode },
6075 /* f0 */
6076 { Bad_Opcode },
6077 { Bad_Opcode },
6078 { Bad_Opcode },
6079 { Bad_Opcode },
6080 { Bad_Opcode },
6081 { Bad_Opcode },
6082 { Bad_Opcode },
6083 { Bad_Opcode },
6084 /* f8 */
6085 { Bad_Opcode },
6086 { Bad_Opcode },
6087 { Bad_Opcode },
6088 { Bad_Opcode },
6089 { Bad_Opcode },
6090 { Bad_Opcode },
6091 { Bad_Opcode },
6092 { Bad_Opcode },
6095 /* THREE_BYTE_0F7A */
6097 /* 00 */
6098 { Bad_Opcode },
6099 { Bad_Opcode },
6100 { Bad_Opcode },
6101 { Bad_Opcode },
6102 { Bad_Opcode },
6103 { Bad_Opcode },
6104 { Bad_Opcode },
6105 { Bad_Opcode },
6106 /* 08 */
6107 { Bad_Opcode },
6108 { Bad_Opcode },
6109 { Bad_Opcode },
6110 { Bad_Opcode },
6111 { Bad_Opcode },
6112 { Bad_Opcode },
6113 { Bad_Opcode },
6114 { Bad_Opcode },
6115 /* 10 */
6116 { Bad_Opcode },
6117 { Bad_Opcode },
6118 { Bad_Opcode },
6119 { Bad_Opcode },
6120 { Bad_Opcode },
6121 { Bad_Opcode },
6122 { Bad_Opcode },
6123 { Bad_Opcode },
6124 /* 18 */
6125 { Bad_Opcode },
6126 { Bad_Opcode },
6127 { Bad_Opcode },
6128 { Bad_Opcode },
6129 { Bad_Opcode },
6130 { Bad_Opcode },
6131 { Bad_Opcode },
6132 { Bad_Opcode },
6133 /* 20 */
6134 { "ptest", { XX } },
6135 { Bad_Opcode },
6136 { Bad_Opcode },
6137 { Bad_Opcode },
6138 { Bad_Opcode },
6139 { Bad_Opcode },
6140 { Bad_Opcode },
6141 { Bad_Opcode },
6142 /* 28 */
6143 { Bad_Opcode },
6144 { Bad_Opcode },
6145 { Bad_Opcode },
6146 { Bad_Opcode },
6147 { Bad_Opcode },
6148 { Bad_Opcode },
6149 { Bad_Opcode },
6150 { Bad_Opcode },
6151 /* 30 */
6152 { Bad_Opcode },
6153 { Bad_Opcode },
6154 { Bad_Opcode },
6155 { Bad_Opcode },
6156 { Bad_Opcode },
6157 { Bad_Opcode },
6158 { Bad_Opcode },
6159 { Bad_Opcode },
6160 /* 38 */
6161 { Bad_Opcode },
6162 { Bad_Opcode },
6163 { Bad_Opcode },
6164 { Bad_Opcode },
6165 { Bad_Opcode },
6166 { Bad_Opcode },
6167 { Bad_Opcode },
6168 { Bad_Opcode },
6169 /* 40 */
6170 { Bad_Opcode },
6171 { "phaddbw", { XM, EXq } },
6172 { "phaddbd", { XM, EXq } },
6173 { "phaddbq", { XM, EXq } },
6174 { Bad_Opcode },
6175 { Bad_Opcode },
6176 { "phaddwd", { XM, EXq } },
6177 { "phaddwq", { XM, EXq } },
6178 /* 48 */
6179 { Bad_Opcode },
6180 { Bad_Opcode },
6181 { Bad_Opcode },
6182 { "phadddq", { XM, EXq } },
6183 { Bad_Opcode },
6184 { Bad_Opcode },
6185 { Bad_Opcode },
6186 { Bad_Opcode },
6187 /* 50 */
6188 { Bad_Opcode },
6189 { "phaddubw", { XM, EXq } },
6190 { "phaddubd", { XM, EXq } },
6191 { "phaddubq", { XM, EXq } },
6192 { Bad_Opcode },
6193 { Bad_Opcode },
6194 { "phadduwd", { XM, EXq } },
6195 { "phadduwq", { XM, EXq } },
6196 /* 58 */
6197 { Bad_Opcode },
6198 { Bad_Opcode },
6199 { Bad_Opcode },
6200 { "phaddudq", { XM, EXq } },
6201 { Bad_Opcode },
6202 { Bad_Opcode },
6203 { Bad_Opcode },
6204 { Bad_Opcode },
6205 /* 60 */
6206 { Bad_Opcode },
6207 { "phsubbw", { XM, EXq } },
6208 { "phsubbd", { XM, EXq } },
6209 { "phsubbq", { XM, EXq } },
6210 { Bad_Opcode },
6211 { Bad_Opcode },
6212 { Bad_Opcode },
6213 { Bad_Opcode },
6214 /* 68 */
6215 { Bad_Opcode },
6216 { Bad_Opcode },
6217 { Bad_Opcode },
6218 { Bad_Opcode },
6219 { Bad_Opcode },
6220 { Bad_Opcode },
6221 { Bad_Opcode },
6222 { Bad_Opcode },
6223 /* 70 */
6224 { Bad_Opcode },
6225 { Bad_Opcode },
6226 { Bad_Opcode },
6227 { Bad_Opcode },
6228 { Bad_Opcode },
6229 { Bad_Opcode },
6230 { Bad_Opcode },
6231 { Bad_Opcode },
6232 /* 78 */
6233 { Bad_Opcode },
6234 { Bad_Opcode },
6235 { Bad_Opcode },
6236 { Bad_Opcode },
6237 { Bad_Opcode },
6238 { Bad_Opcode },
6239 { Bad_Opcode },
6240 { Bad_Opcode },
6241 /* 80 */
6242 { Bad_Opcode },
6243 { Bad_Opcode },
6244 { Bad_Opcode },
6245 { Bad_Opcode },
6246 { Bad_Opcode },
6247 { Bad_Opcode },
6248 { Bad_Opcode },
6249 { Bad_Opcode },
6250 /* 88 */
6251 { Bad_Opcode },
6252 { Bad_Opcode },
6253 { Bad_Opcode },
6254 { Bad_Opcode },
6255 { Bad_Opcode },
6256 { Bad_Opcode },
6257 { Bad_Opcode },
6258 { Bad_Opcode },
6259 /* 90 */
6260 { Bad_Opcode },
6261 { Bad_Opcode },
6262 { Bad_Opcode },
6263 { Bad_Opcode },
6264 { Bad_Opcode },
6265 { Bad_Opcode },
6266 { Bad_Opcode },
6267 { Bad_Opcode },
6268 /* 98 */
6269 { Bad_Opcode },
6270 { Bad_Opcode },
6271 { Bad_Opcode },
6272 { Bad_Opcode },
6273 { Bad_Opcode },
6274 { Bad_Opcode },
6275 { Bad_Opcode },
6276 { Bad_Opcode },
6277 /* a0 */
6278 { Bad_Opcode },
6279 { Bad_Opcode },
6280 { Bad_Opcode },
6281 { Bad_Opcode },
6282 { Bad_Opcode },
6283 { Bad_Opcode },
6284 { Bad_Opcode },
6285 { Bad_Opcode },
6286 /* a8 */
6287 { Bad_Opcode },
6288 { Bad_Opcode },
6289 { Bad_Opcode },
6290 { Bad_Opcode },
6291 { Bad_Opcode },
6292 { Bad_Opcode },
6293 { Bad_Opcode },
6294 { Bad_Opcode },
6295 /* b0 */
6296 { Bad_Opcode },
6297 { Bad_Opcode },
6298 { Bad_Opcode },
6299 { Bad_Opcode },
6300 { Bad_Opcode },
6301 { Bad_Opcode },
6302 { Bad_Opcode },
6303 { Bad_Opcode },
6304 /* b8 */
6305 { Bad_Opcode },
6306 { Bad_Opcode },
6307 { Bad_Opcode },
6308 { Bad_Opcode },
6309 { Bad_Opcode },
6310 { Bad_Opcode },
6311 { Bad_Opcode },
6312 { Bad_Opcode },
6313 /* c0 */
6314 { Bad_Opcode },
6315 { Bad_Opcode },
6316 { Bad_Opcode },
6317 { Bad_Opcode },
6318 { Bad_Opcode },
6319 { Bad_Opcode },
6320 { Bad_Opcode },
6321 { Bad_Opcode },
6322 /* c8 */
6323 { Bad_Opcode },
6324 { Bad_Opcode },
6325 { Bad_Opcode },
6326 { Bad_Opcode },
6327 { Bad_Opcode },
6328 { Bad_Opcode },
6329 { Bad_Opcode },
6330 { Bad_Opcode },
6331 /* d0 */
6332 { Bad_Opcode },
6333 { Bad_Opcode },
6334 { Bad_Opcode },
6335 { Bad_Opcode },
6336 { Bad_Opcode },
6337 { Bad_Opcode },
6338 { Bad_Opcode },
6339 { Bad_Opcode },
6340 /* d8 */
6341 { Bad_Opcode },
6342 { Bad_Opcode },
6343 { Bad_Opcode },
6344 { Bad_Opcode },
6345 { Bad_Opcode },
6346 { Bad_Opcode },
6347 { Bad_Opcode },
6348 { Bad_Opcode },
6349 /* e0 */
6350 { Bad_Opcode },
6351 { Bad_Opcode },
6352 { Bad_Opcode },
6353 { Bad_Opcode },
6354 { Bad_Opcode },
6355 { Bad_Opcode },
6356 { Bad_Opcode },
6357 { Bad_Opcode },
6358 /* e8 */
6359 { Bad_Opcode },
6360 { Bad_Opcode },
6361 { Bad_Opcode },
6362 { Bad_Opcode },
6363 { Bad_Opcode },
6364 { Bad_Opcode },
6365 { Bad_Opcode },
6366 { Bad_Opcode },
6367 /* f0 */
6368 { Bad_Opcode },
6369 { Bad_Opcode },
6370 { Bad_Opcode },
6371 { Bad_Opcode },
6372 { Bad_Opcode },
6373 { Bad_Opcode },
6374 { Bad_Opcode },
6375 { Bad_Opcode },
6376 /* f8 */
6377 { Bad_Opcode },
6378 { Bad_Opcode },
6379 { Bad_Opcode },
6380 { Bad_Opcode },
6381 { Bad_Opcode },
6382 { Bad_Opcode },
6383 { Bad_Opcode },
6384 { Bad_Opcode },
6388 static const struct dis386 xop_table[][256] = {
6389 /* XOP_08 */
6391 /* 00 */
6392 { Bad_Opcode },
6393 { Bad_Opcode },
6394 { Bad_Opcode },
6395 { Bad_Opcode },
6396 { Bad_Opcode },
6397 { Bad_Opcode },
6398 { Bad_Opcode },
6399 { Bad_Opcode },
6400 /* 08 */
6401 { Bad_Opcode },
6402 { Bad_Opcode },
6403 { Bad_Opcode },
6404 { Bad_Opcode },
6405 { Bad_Opcode },
6406 { Bad_Opcode },
6407 { Bad_Opcode },
6408 { Bad_Opcode },
6409 /* 10 */
6410 { Bad_Opcode },
6411 { Bad_Opcode },
6412 { Bad_Opcode },
6413 { Bad_Opcode },
6414 { Bad_Opcode },
6415 { Bad_Opcode },
6416 { Bad_Opcode },
6417 { Bad_Opcode },
6418 /* 18 */
6419 { Bad_Opcode },
6420 { Bad_Opcode },
6421 { Bad_Opcode },
6422 { Bad_Opcode },
6423 { Bad_Opcode },
6424 { Bad_Opcode },
6425 { Bad_Opcode },
6426 { Bad_Opcode },
6427 /* 20 */
6428 { Bad_Opcode },
6429 { Bad_Opcode },
6430 { Bad_Opcode },
6431 { Bad_Opcode },
6432 { Bad_Opcode },
6433 { Bad_Opcode },
6434 { Bad_Opcode },
6435 { Bad_Opcode },
6436 /* 28 */
6437 { Bad_Opcode },
6438 { Bad_Opcode },
6439 { Bad_Opcode },
6440 { Bad_Opcode },
6441 { Bad_Opcode },
6442 { Bad_Opcode },
6443 { Bad_Opcode },
6444 { Bad_Opcode },
6445 /* 30 */
6446 { Bad_Opcode },
6447 { Bad_Opcode },
6448 { Bad_Opcode },
6449 { Bad_Opcode },
6450 { Bad_Opcode },
6451 { Bad_Opcode },
6452 { Bad_Opcode },
6453 { Bad_Opcode },
6454 /* 38 */
6455 { Bad_Opcode },
6456 { Bad_Opcode },
6457 { Bad_Opcode },
6458 { Bad_Opcode },
6459 { Bad_Opcode },
6460 { Bad_Opcode },
6461 { Bad_Opcode },
6462 { Bad_Opcode },
6463 /* 40 */
6464 { Bad_Opcode },
6465 { Bad_Opcode },
6466 { Bad_Opcode },
6467 { Bad_Opcode },
6468 { Bad_Opcode },
6469 { Bad_Opcode },
6470 { Bad_Opcode },
6471 { Bad_Opcode },
6472 /* 48 */
6473 { Bad_Opcode },
6474 { Bad_Opcode },
6475 { Bad_Opcode },
6476 { Bad_Opcode },
6477 { Bad_Opcode },
6478 { Bad_Opcode },
6479 { Bad_Opcode },
6480 { Bad_Opcode },
6481 /* 50 */
6482 { Bad_Opcode },
6483 { Bad_Opcode },
6484 { Bad_Opcode },
6485 { Bad_Opcode },
6486 { Bad_Opcode },
6487 { Bad_Opcode },
6488 { Bad_Opcode },
6489 { Bad_Opcode },
6490 /* 58 */
6491 { Bad_Opcode },
6492 { Bad_Opcode },
6493 { Bad_Opcode },
6494 { Bad_Opcode },
6495 { Bad_Opcode },
6496 { Bad_Opcode },
6497 { Bad_Opcode },
6498 { Bad_Opcode },
6499 /* 60 */
6500 { Bad_Opcode },
6501 { Bad_Opcode },
6502 { Bad_Opcode },
6503 { Bad_Opcode },
6504 { Bad_Opcode },
6505 { Bad_Opcode },
6506 { Bad_Opcode },
6507 { Bad_Opcode },
6508 /* 68 */
6509 { Bad_Opcode },
6510 { Bad_Opcode },
6511 { Bad_Opcode },
6512 { Bad_Opcode },
6513 { Bad_Opcode },
6514 { Bad_Opcode },
6515 { Bad_Opcode },
6516 { Bad_Opcode },
6517 /* 70 */
6518 { Bad_Opcode },
6519 { Bad_Opcode },
6520 { Bad_Opcode },
6521 { Bad_Opcode },
6522 { Bad_Opcode },
6523 { Bad_Opcode },
6524 { Bad_Opcode },
6525 { Bad_Opcode },
6526 /* 78 */
6527 { Bad_Opcode },
6528 { Bad_Opcode },
6529 { Bad_Opcode },
6530 { Bad_Opcode },
6531 { Bad_Opcode },
6532 { Bad_Opcode },
6533 { Bad_Opcode },
6534 { Bad_Opcode },
6535 /* 80 */
6536 { Bad_Opcode },
6537 { Bad_Opcode },
6538 { Bad_Opcode },
6539 { Bad_Opcode },
6540 { Bad_Opcode },
6541 { "vpmacssww", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6542 { "vpmacsswd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6543 { "vpmacssdql", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6544 /* 88 */
6545 { Bad_Opcode },
6546 { Bad_Opcode },
6547 { Bad_Opcode },
6548 { Bad_Opcode },
6549 { Bad_Opcode },
6550 { Bad_Opcode },
6551 { "vpmacssdd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6552 { "vpmacssdqh", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6553 /* 90 */
6554 { Bad_Opcode },
6555 { Bad_Opcode },
6556 { Bad_Opcode },
6557 { Bad_Opcode },
6558 { Bad_Opcode },
6559 { "vpmacsww", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6560 { "vpmacswd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6561 { "vpmacsdql", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6562 /* 98 */
6563 { Bad_Opcode },
6564 { Bad_Opcode },
6565 { Bad_Opcode },
6566 { Bad_Opcode },
6567 { Bad_Opcode },
6568 { Bad_Opcode },
6569 { "vpmacsdd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6570 { "vpmacsdqh", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6571 /* a0 */
6572 { Bad_Opcode },
6573 { Bad_Opcode },
6574 { "vpcmov", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6575 { "vpperm", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6576 { Bad_Opcode },
6577 { Bad_Opcode },
6578 { "vpmadcsswd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6579 { Bad_Opcode },
6580 /* a8 */
6581 { Bad_Opcode },
6582 { Bad_Opcode },
6583 { Bad_Opcode },
6584 { Bad_Opcode },
6585 { Bad_Opcode },
6586 { Bad_Opcode },
6587 { Bad_Opcode },
6588 { Bad_Opcode },
6589 /* b0 */
6590 { Bad_Opcode },
6591 { Bad_Opcode },
6592 { Bad_Opcode },
6593 { Bad_Opcode },
6594 { Bad_Opcode },
6595 { Bad_Opcode },
6596 { "vpmadcswd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6597 { Bad_Opcode },
6598 /* b8 */
6599 { Bad_Opcode },
6600 { Bad_Opcode },
6601 { Bad_Opcode },
6602 { Bad_Opcode },
6603 { Bad_Opcode },
6604 { Bad_Opcode },
6605 { Bad_Opcode },
6606 { Bad_Opcode },
6607 /* c0 */
6608 { "vprotb", { XM, Vex_2src_1, Ib } },
6609 { "vprotw", { XM, Vex_2src_1, Ib } },
6610 { "vprotd", { XM, Vex_2src_1, Ib } },
6611 { "vprotq", { XM, Vex_2src_1, Ib } },
6612 { Bad_Opcode },
6613 { Bad_Opcode },
6614 { Bad_Opcode },
6615 { Bad_Opcode },
6616 /* c8 */
6617 { Bad_Opcode },
6618 { Bad_Opcode },
6619 { Bad_Opcode },
6620 { Bad_Opcode },
6621 { "vpcomb", { XM, Vex128, EXx, Ib } },
6622 { "vpcomw", { XM, Vex128, EXx, Ib } },
6623 { "vpcomd", { XM, Vex128, EXx, Ib } },
6624 { "vpcomq", { XM, Vex128, EXx, Ib } },
6625 /* d0 */
6626 { Bad_Opcode },
6627 { Bad_Opcode },
6628 { Bad_Opcode },
6629 { Bad_Opcode },
6630 { Bad_Opcode },
6631 { Bad_Opcode },
6632 { Bad_Opcode },
6633 { Bad_Opcode },
6634 /* d8 */
6635 { Bad_Opcode },
6636 { Bad_Opcode },
6637 { Bad_Opcode },
6638 { Bad_Opcode },
6639 { Bad_Opcode },
6640 { Bad_Opcode },
6641 { Bad_Opcode },
6642 { Bad_Opcode },
6643 /* e0 */
6644 { Bad_Opcode },
6645 { Bad_Opcode },
6646 { Bad_Opcode },
6647 { Bad_Opcode },
6648 { Bad_Opcode },
6649 { Bad_Opcode },
6650 { Bad_Opcode },
6651 { Bad_Opcode },
6652 /* e8 */
6653 { Bad_Opcode },
6654 { Bad_Opcode },
6655 { Bad_Opcode },
6656 { Bad_Opcode },
6657 { "vpcomub", { XM, Vex128, EXx, Ib } },
6658 { "vpcomuw", { XM, Vex128, EXx, Ib } },
6659 { "vpcomud", { XM, Vex128, EXx, Ib } },
6660 { "vpcomuq", { XM, Vex128, EXx, Ib } },
6661 /* f0 */
6662 { Bad_Opcode },
6663 { Bad_Opcode },
6664 { Bad_Opcode },
6665 { Bad_Opcode },
6666 { Bad_Opcode },
6667 { Bad_Opcode },
6668 { Bad_Opcode },
6669 { Bad_Opcode },
6670 /* f8 */
6671 { Bad_Opcode },
6672 { Bad_Opcode },
6673 { Bad_Opcode },
6674 { Bad_Opcode },
6675 { Bad_Opcode },
6676 { Bad_Opcode },
6677 { Bad_Opcode },
6678 { Bad_Opcode },
6680 /* XOP_09 */
6682 /* 00 */
6683 { Bad_Opcode },
6684 { Bad_Opcode },
6685 { Bad_Opcode },
6686 { Bad_Opcode },
6687 { Bad_Opcode },
6688 { Bad_Opcode },
6689 { Bad_Opcode },
6690 { Bad_Opcode },
6691 /* 08 */
6692 { Bad_Opcode },
6693 { Bad_Opcode },
6694 { Bad_Opcode },
6695 { Bad_Opcode },
6696 { Bad_Opcode },
6697 { Bad_Opcode },
6698 { Bad_Opcode },
6699 { Bad_Opcode },
6700 /* 10 */
6701 { Bad_Opcode },
6702 { Bad_Opcode },
6703 { REG_TABLE (REG_XOP_LWPCB) },
6704 { Bad_Opcode },
6705 { Bad_Opcode },
6706 { Bad_Opcode },
6707 { Bad_Opcode },
6708 { Bad_Opcode },
6709 /* 18 */
6710 { Bad_Opcode },
6711 { Bad_Opcode },
6712 { Bad_Opcode },
6713 { Bad_Opcode },
6714 { Bad_Opcode },
6715 { Bad_Opcode },
6716 { Bad_Opcode },
6717 { Bad_Opcode },
6718 /* 20 */
6719 { Bad_Opcode },
6720 { Bad_Opcode },
6721 { Bad_Opcode },
6722 { Bad_Opcode },
6723 { Bad_Opcode },
6724 { Bad_Opcode },
6725 { Bad_Opcode },
6726 { Bad_Opcode },
6727 /* 28 */
6728 { Bad_Opcode },
6729 { Bad_Opcode },
6730 { Bad_Opcode },
6731 { Bad_Opcode },
6732 { Bad_Opcode },
6733 { Bad_Opcode },
6734 { Bad_Opcode },
6735 { Bad_Opcode },
6736 /* 30 */
6737 { Bad_Opcode },
6738 { Bad_Opcode },
6739 { Bad_Opcode },
6740 { Bad_Opcode },
6741 { Bad_Opcode },
6742 { Bad_Opcode },
6743 { Bad_Opcode },
6744 { Bad_Opcode },
6745 /* 38 */
6746 { Bad_Opcode },
6747 { Bad_Opcode },
6748 { Bad_Opcode },
6749 { Bad_Opcode },
6750 { Bad_Opcode },
6751 { Bad_Opcode },
6752 { Bad_Opcode },
6753 { Bad_Opcode },
6754 /* 40 */
6755 { Bad_Opcode },
6756 { Bad_Opcode },
6757 { Bad_Opcode },
6758 { Bad_Opcode },
6759 { Bad_Opcode },
6760 { Bad_Opcode },
6761 { Bad_Opcode },
6762 { Bad_Opcode },
6763 /* 48 */
6764 { Bad_Opcode },
6765 { Bad_Opcode },
6766 { Bad_Opcode },
6767 { Bad_Opcode },
6768 { Bad_Opcode },
6769 { Bad_Opcode },
6770 { Bad_Opcode },
6771 { Bad_Opcode },
6772 /* 50 */
6773 { Bad_Opcode },
6774 { Bad_Opcode },
6775 { Bad_Opcode },
6776 { Bad_Opcode },
6777 { Bad_Opcode },
6778 { Bad_Opcode },
6779 { Bad_Opcode },
6780 { Bad_Opcode },
6781 /* 58 */
6782 { Bad_Opcode },
6783 { Bad_Opcode },
6784 { Bad_Opcode },
6785 { Bad_Opcode },
6786 { Bad_Opcode },
6787 { Bad_Opcode },
6788 { Bad_Opcode },
6789 { Bad_Opcode },
6790 /* 60 */
6791 { Bad_Opcode },
6792 { Bad_Opcode },
6793 { Bad_Opcode },
6794 { Bad_Opcode },
6795 { Bad_Opcode },
6796 { Bad_Opcode },
6797 { Bad_Opcode },
6798 { Bad_Opcode },
6799 /* 68 */
6800 { Bad_Opcode },
6801 { Bad_Opcode },
6802 { Bad_Opcode },
6803 { Bad_Opcode },
6804 { Bad_Opcode },
6805 { Bad_Opcode },
6806 { Bad_Opcode },
6807 { Bad_Opcode },
6808 /* 70 */
6809 { Bad_Opcode },
6810 { Bad_Opcode },
6811 { Bad_Opcode },
6812 { Bad_Opcode },
6813 { Bad_Opcode },
6814 { Bad_Opcode },
6815 { Bad_Opcode },
6816 { Bad_Opcode },
6817 /* 78 */
6818 { Bad_Opcode },
6819 { Bad_Opcode },
6820 { Bad_Opcode },
6821 { Bad_Opcode },
6822 { Bad_Opcode },
6823 { Bad_Opcode },
6824 { Bad_Opcode },
6825 { Bad_Opcode },
6826 /* 80 */
6827 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_80) },
6828 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_81) },
6829 { "vfrczss", { XM, EXd } },
6830 { "vfrczsd", { XM, EXq } },
6831 { Bad_Opcode },
6832 { Bad_Opcode },
6833 { Bad_Opcode },
6834 { Bad_Opcode },
6835 /* 88 */
6836 { Bad_Opcode },
6837 { Bad_Opcode },
6838 { Bad_Opcode },
6839 { Bad_Opcode },
6840 { Bad_Opcode },
6841 { Bad_Opcode },
6842 { Bad_Opcode },
6843 { Bad_Opcode },
6844 /* 90 */
6845 { "vprotb", { XM, Vex_2src_1, Vex_2src_2 } },
6846 { "vprotw", { XM, Vex_2src_1, Vex_2src_2 } },
6847 { "vprotd", { XM, Vex_2src_1, Vex_2src_2 } },
6848 { "vprotq", { XM, Vex_2src_1, Vex_2src_2 } },
6849 { "vpshlb", { XM, Vex_2src_1, Vex_2src_2 } },
6850 { "vpshlw", { XM, Vex_2src_1, Vex_2src_2 } },
6851 { "vpshld", { XM, Vex_2src_1, Vex_2src_2 } },
6852 { "vpshlq", { XM, Vex_2src_1, Vex_2src_2 } },
6853 /* 98 */
6854 { "vpshab", { XM, Vex_2src_1, Vex_2src_2 } },
6855 { "vpshaw", { XM, Vex_2src_1, Vex_2src_2 } },
6856 { "vpshad", { XM, Vex_2src_1, Vex_2src_2 } },
6857 { "vpshaq", { XM, Vex_2src_1, Vex_2src_2 } },
6858 { Bad_Opcode },
6859 { Bad_Opcode },
6860 { Bad_Opcode },
6861 { Bad_Opcode },
6862 /* a0 */
6863 { Bad_Opcode },
6864 { Bad_Opcode },
6865 { Bad_Opcode },
6866 { Bad_Opcode },
6867 { Bad_Opcode },
6868 { Bad_Opcode },
6869 { Bad_Opcode },
6870 { Bad_Opcode },
6871 /* a8 */
6872 { Bad_Opcode },
6873 { Bad_Opcode },
6874 { Bad_Opcode },
6875 { Bad_Opcode },
6876 { Bad_Opcode },
6877 { Bad_Opcode },
6878 { Bad_Opcode },
6879 { Bad_Opcode },
6880 /* b0 */
6881 { Bad_Opcode },
6882 { Bad_Opcode },
6883 { Bad_Opcode },
6884 { Bad_Opcode },
6885 { Bad_Opcode },
6886 { Bad_Opcode },
6887 { Bad_Opcode },
6888 { Bad_Opcode },
6889 /* b8 */
6890 { Bad_Opcode },
6891 { Bad_Opcode },
6892 { Bad_Opcode },
6893 { Bad_Opcode },
6894 { Bad_Opcode },
6895 { Bad_Opcode },
6896 { Bad_Opcode },
6897 { Bad_Opcode },
6898 /* c0 */
6899 { Bad_Opcode },
6900 { "vphaddbw", { XM, EXxmm } },
6901 { "vphaddbd", { XM, EXxmm } },
6902 { "vphaddbq", { XM, EXxmm } },
6903 { Bad_Opcode },
6904 { Bad_Opcode },
6905 { "vphaddwd", { XM, EXxmm } },
6906 { "vphaddwq", { XM, EXxmm } },
6907 /* c8 */
6908 { Bad_Opcode },
6909 { Bad_Opcode },
6910 { Bad_Opcode },
6911 { "vphadddq", { XM, EXxmm } },
6912 { Bad_Opcode },
6913 { Bad_Opcode },
6914 { Bad_Opcode },
6915 { Bad_Opcode },
6916 /* d0 */
6917 { Bad_Opcode },
6918 { "vphaddubw", { XM, EXxmm } },
6919 { "vphaddubd", { XM, EXxmm } },
6920 { "vphaddubq", { XM, EXxmm } },
6921 { Bad_Opcode },
6922 { Bad_Opcode },
6923 { "vphadduwd", { XM, EXxmm } },
6924 { "vphadduwq", { XM, EXxmm } },
6925 /* d8 */
6926 { Bad_Opcode },
6927 { Bad_Opcode },
6928 { Bad_Opcode },
6929 { "vphaddudq", { XM, EXxmm } },
6930 { Bad_Opcode },
6931 { Bad_Opcode },
6932 { Bad_Opcode },
6933 { Bad_Opcode },
6934 /* e0 */
6935 { Bad_Opcode },
6936 { "vphsubbw", { XM, EXxmm } },
6937 { "vphsubwd", { XM, EXxmm } },
6938 { "vphsubdq", { XM, EXxmm } },
6939 { Bad_Opcode },
6940 { Bad_Opcode },
6941 { Bad_Opcode },
6942 { Bad_Opcode },
6943 /* e8 */
6944 { Bad_Opcode },
6945 { Bad_Opcode },
6946 { Bad_Opcode },
6947 { Bad_Opcode },
6948 { Bad_Opcode },
6949 { Bad_Opcode },
6950 { Bad_Opcode },
6951 { Bad_Opcode },
6952 /* f0 */
6953 { Bad_Opcode },
6954 { Bad_Opcode },
6955 { Bad_Opcode },
6956 { Bad_Opcode },
6957 { Bad_Opcode },
6958 { Bad_Opcode },
6959 { Bad_Opcode },
6960 { Bad_Opcode },
6961 /* f8 */
6962 { Bad_Opcode },
6963 { Bad_Opcode },
6964 { Bad_Opcode },
6965 { Bad_Opcode },
6966 { Bad_Opcode },
6967 { Bad_Opcode },
6968 { Bad_Opcode },
6969 { Bad_Opcode },
6971 /* XOP_0A */
6973 /* 00 */
6974 { Bad_Opcode },
6975 { Bad_Opcode },
6976 { Bad_Opcode },
6977 { Bad_Opcode },
6978 { Bad_Opcode },
6979 { Bad_Opcode },
6980 { Bad_Opcode },
6981 { Bad_Opcode },
6982 /* 08 */
6983 { Bad_Opcode },
6984 { Bad_Opcode },
6985 { Bad_Opcode },
6986 { Bad_Opcode },
6987 { Bad_Opcode },
6988 { Bad_Opcode },
6989 { Bad_Opcode },
6990 { Bad_Opcode },
6991 /* 10 */
6992 { Bad_Opcode },
6993 { Bad_Opcode },
6994 { REG_TABLE (REG_XOP_LWP) },
6995 { Bad_Opcode },
6996 { Bad_Opcode },
6997 { Bad_Opcode },
6998 { Bad_Opcode },
6999 { Bad_Opcode },
7000 /* 18 */
7001 { Bad_Opcode },
7002 { Bad_Opcode },
7003 { Bad_Opcode },
7004 { Bad_Opcode },
7005 { Bad_Opcode },
7006 { Bad_Opcode },
7007 { Bad_Opcode },
7008 { Bad_Opcode },
7009 /* 20 */
7010 { Bad_Opcode },
7011 { Bad_Opcode },
7012 { Bad_Opcode },
7013 { Bad_Opcode },
7014 { Bad_Opcode },
7015 { Bad_Opcode },
7016 { Bad_Opcode },
7017 { Bad_Opcode },
7018 /* 28 */
7019 { Bad_Opcode },
7020 { Bad_Opcode },
7021 { Bad_Opcode },
7022 { Bad_Opcode },
7023 { Bad_Opcode },
7024 { Bad_Opcode },
7025 { Bad_Opcode },
7026 { Bad_Opcode },
7027 /* 30 */
7028 { Bad_Opcode },
7029 { Bad_Opcode },
7030 { Bad_Opcode },
7031 { Bad_Opcode },
7032 { Bad_Opcode },
7033 { Bad_Opcode },
7034 { Bad_Opcode },
7035 { Bad_Opcode },
7036 /* 38 */
7037 { Bad_Opcode },
7038 { Bad_Opcode },
7039 { Bad_Opcode },
7040 { Bad_Opcode },
7041 { Bad_Opcode },
7042 { Bad_Opcode },
7043 { Bad_Opcode },
7044 { Bad_Opcode },
7045 /* 40 */
7046 { Bad_Opcode },
7047 { Bad_Opcode },
7048 { Bad_Opcode },
7049 { Bad_Opcode },
7050 { Bad_Opcode },
7051 { Bad_Opcode },
7052 { Bad_Opcode },
7053 { Bad_Opcode },
7054 /* 48 */
7055 { Bad_Opcode },
7056 { Bad_Opcode },
7057 { Bad_Opcode },
7058 { Bad_Opcode },
7059 { Bad_Opcode },
7060 { Bad_Opcode },
7061 { Bad_Opcode },
7062 { Bad_Opcode },
7063 /* 50 */
7064 { Bad_Opcode },
7065 { Bad_Opcode },
7066 { Bad_Opcode },
7067 { Bad_Opcode },
7068 { Bad_Opcode },
7069 { Bad_Opcode },
7070 { Bad_Opcode },
7071 { Bad_Opcode },
7072 /* 58 */
7073 { Bad_Opcode },
7074 { Bad_Opcode },
7075 { Bad_Opcode },
7076 { Bad_Opcode },
7077 { Bad_Opcode },
7078 { Bad_Opcode },
7079 { Bad_Opcode },
7080 { Bad_Opcode },
7081 /* 60 */
7082 { Bad_Opcode },
7083 { Bad_Opcode },
7084 { Bad_Opcode },
7085 { Bad_Opcode },
7086 { Bad_Opcode },
7087 { Bad_Opcode },
7088 { Bad_Opcode },
7089 { Bad_Opcode },
7090 /* 68 */
7091 { Bad_Opcode },
7092 { Bad_Opcode },
7093 { Bad_Opcode },
7094 { Bad_Opcode },
7095 { Bad_Opcode },
7096 { Bad_Opcode },
7097 { Bad_Opcode },
7098 { Bad_Opcode },
7099 /* 70 */
7100 { Bad_Opcode },
7101 { Bad_Opcode },
7102 { Bad_Opcode },
7103 { Bad_Opcode },
7104 { Bad_Opcode },
7105 { Bad_Opcode },
7106 { Bad_Opcode },
7107 { Bad_Opcode },
7108 /* 78 */
7109 { Bad_Opcode },
7110 { Bad_Opcode },
7111 { Bad_Opcode },
7112 { Bad_Opcode },
7113 { Bad_Opcode },
7114 { Bad_Opcode },
7115 { Bad_Opcode },
7116 { Bad_Opcode },
7117 /* 80 */
7118 { Bad_Opcode },
7119 { Bad_Opcode },
7120 { Bad_Opcode },
7121 { Bad_Opcode },
7122 { Bad_Opcode },
7123 { Bad_Opcode },
7124 { Bad_Opcode },
7125 { Bad_Opcode },
7126 /* 88 */
7127 { Bad_Opcode },
7128 { Bad_Opcode },
7129 { Bad_Opcode },
7130 { Bad_Opcode },
7131 { Bad_Opcode },
7132 { Bad_Opcode },
7133 { Bad_Opcode },
7134 { Bad_Opcode },
7135 /* 90 */
7136 { Bad_Opcode },
7137 { Bad_Opcode },
7138 { Bad_Opcode },
7139 { Bad_Opcode },
7140 { Bad_Opcode },
7141 { Bad_Opcode },
7142 { Bad_Opcode },
7143 { Bad_Opcode },
7144 /* 98 */
7145 { Bad_Opcode },
7146 { Bad_Opcode },
7147 { Bad_Opcode },
7148 { Bad_Opcode },
7149 { Bad_Opcode },
7150 { Bad_Opcode },
7151 { Bad_Opcode },
7152 { Bad_Opcode },
7153 /* a0 */
7154 { Bad_Opcode },
7155 { Bad_Opcode },
7156 { Bad_Opcode },
7157 { Bad_Opcode },
7158 { Bad_Opcode },
7159 { Bad_Opcode },
7160 { Bad_Opcode },
7161 { Bad_Opcode },
7162 /* a8 */
7163 { Bad_Opcode },
7164 { Bad_Opcode },
7165 { Bad_Opcode },
7166 { Bad_Opcode },
7167 { Bad_Opcode },
7168 { Bad_Opcode },
7169 { Bad_Opcode },
7170 { Bad_Opcode },
7171 /* b0 */
7172 { Bad_Opcode },
7173 { Bad_Opcode },
7174 { Bad_Opcode },
7175 { Bad_Opcode },
7176 { Bad_Opcode },
7177 { Bad_Opcode },
7178 { Bad_Opcode },
7179 { Bad_Opcode },
7180 /* b8 */
7181 { Bad_Opcode },
7182 { Bad_Opcode },
7183 { Bad_Opcode },
7184 { Bad_Opcode },
7185 { Bad_Opcode },
7186 { Bad_Opcode },
7187 { Bad_Opcode },
7188 { Bad_Opcode },
7189 /* c0 */
7190 { Bad_Opcode },
7191 { Bad_Opcode },
7192 { Bad_Opcode },
7193 { Bad_Opcode },
7194 { Bad_Opcode },
7195 { Bad_Opcode },
7196 { Bad_Opcode },
7197 { Bad_Opcode },
7198 /* c8 */
7199 { Bad_Opcode },
7200 { Bad_Opcode },
7201 { Bad_Opcode },
7202 { Bad_Opcode },
7203 { Bad_Opcode },
7204 { Bad_Opcode },
7205 { Bad_Opcode },
7206 { Bad_Opcode },
7207 /* d0 */
7208 { Bad_Opcode },
7209 { Bad_Opcode },
7210 { Bad_Opcode },
7211 { Bad_Opcode },
7212 { Bad_Opcode },
7213 { Bad_Opcode },
7214 { Bad_Opcode },
7215 { Bad_Opcode },
7216 /* d8 */
7217 { Bad_Opcode },
7218 { Bad_Opcode },
7219 { Bad_Opcode },
7220 { Bad_Opcode },
7221 { Bad_Opcode },
7222 { Bad_Opcode },
7223 { Bad_Opcode },
7224 { Bad_Opcode },
7225 /* e0 */
7226 { Bad_Opcode },
7227 { Bad_Opcode },
7228 { Bad_Opcode },
7229 { Bad_Opcode },
7230 { Bad_Opcode },
7231 { Bad_Opcode },
7232 { Bad_Opcode },
7233 { Bad_Opcode },
7234 /* e8 */
7235 { Bad_Opcode },
7236 { Bad_Opcode },
7237 { Bad_Opcode },
7238 { Bad_Opcode },
7239 { Bad_Opcode },
7240 { Bad_Opcode },
7241 { Bad_Opcode },
7242 { Bad_Opcode },
7243 /* f0 */
7244 { Bad_Opcode },
7245 { Bad_Opcode },
7246 { Bad_Opcode },
7247 { Bad_Opcode },
7248 { Bad_Opcode },
7249 { Bad_Opcode },
7250 { Bad_Opcode },
7251 { Bad_Opcode },
7252 /* f8 */
7253 { Bad_Opcode },
7254 { Bad_Opcode },
7255 { Bad_Opcode },
7256 { Bad_Opcode },
7257 { Bad_Opcode },
7258 { Bad_Opcode },
7259 { Bad_Opcode },
7260 { Bad_Opcode },
7264 static const struct dis386 vex_table[][256] = {
7265 /* VEX_0F */
7267 /* 00 */
7268 { Bad_Opcode },
7269 { Bad_Opcode },
7270 { Bad_Opcode },
7271 { Bad_Opcode },
7272 { Bad_Opcode },
7273 { Bad_Opcode },
7274 { Bad_Opcode },
7275 { Bad_Opcode },
7276 /* 08 */
7277 { Bad_Opcode },
7278 { Bad_Opcode },
7279 { Bad_Opcode },
7280 { Bad_Opcode },
7281 { Bad_Opcode },
7282 { Bad_Opcode },
7283 { Bad_Opcode },
7284 { Bad_Opcode },
7285 /* 10 */
7286 { PREFIX_TABLE (PREFIX_VEX_0F10) },
7287 { PREFIX_TABLE (PREFIX_VEX_0F11) },
7288 { PREFIX_TABLE (PREFIX_VEX_0F12) },
7289 { MOD_TABLE (MOD_VEX_0F13) },
7290 { VEX_W_TABLE (VEX_W_0F14) },
7291 { VEX_W_TABLE (VEX_W_0F15) },
7292 { PREFIX_TABLE (PREFIX_VEX_0F16) },
7293 { MOD_TABLE (MOD_VEX_0F17) },
7294 /* 18 */
7295 { Bad_Opcode },
7296 { Bad_Opcode },
7297 { Bad_Opcode },
7298 { Bad_Opcode },
7299 { Bad_Opcode },
7300 { Bad_Opcode },
7301 { Bad_Opcode },
7302 { Bad_Opcode },
7303 /* 20 */
7304 { Bad_Opcode },
7305 { Bad_Opcode },
7306 { Bad_Opcode },
7307 { Bad_Opcode },
7308 { Bad_Opcode },
7309 { Bad_Opcode },
7310 { Bad_Opcode },
7311 { Bad_Opcode },
7312 /* 28 */
7313 { VEX_W_TABLE (VEX_W_0F28) },
7314 { VEX_W_TABLE (VEX_W_0F29) },
7315 { PREFIX_TABLE (PREFIX_VEX_0F2A) },
7316 { MOD_TABLE (MOD_VEX_0F2B) },
7317 { PREFIX_TABLE (PREFIX_VEX_0F2C) },
7318 { PREFIX_TABLE (PREFIX_VEX_0F2D) },
7319 { PREFIX_TABLE (PREFIX_VEX_0F2E) },
7320 { PREFIX_TABLE (PREFIX_VEX_0F2F) },
7321 /* 30 */
7322 { Bad_Opcode },
7323 { Bad_Opcode },
7324 { Bad_Opcode },
7325 { Bad_Opcode },
7326 { Bad_Opcode },
7327 { Bad_Opcode },
7328 { Bad_Opcode },
7329 { Bad_Opcode },
7330 /* 38 */
7331 { Bad_Opcode },
7332 { Bad_Opcode },
7333 { Bad_Opcode },
7334 { Bad_Opcode },
7335 { Bad_Opcode },
7336 { Bad_Opcode },
7337 { Bad_Opcode },
7338 { Bad_Opcode },
7339 /* 40 */
7340 { Bad_Opcode },
7341 { Bad_Opcode },
7342 { Bad_Opcode },
7343 { Bad_Opcode },
7344 { Bad_Opcode },
7345 { Bad_Opcode },
7346 { Bad_Opcode },
7347 { Bad_Opcode },
7348 /* 48 */
7349 { Bad_Opcode },
7350 { Bad_Opcode },
7351 { Bad_Opcode },
7352 { Bad_Opcode },
7353 { Bad_Opcode },
7354 { Bad_Opcode },
7355 { Bad_Opcode },
7356 { Bad_Opcode },
7357 /* 50 */
7358 { MOD_TABLE (MOD_VEX_0F50) },
7359 { PREFIX_TABLE (PREFIX_VEX_0F51) },
7360 { PREFIX_TABLE (PREFIX_VEX_0F52) },
7361 { PREFIX_TABLE (PREFIX_VEX_0F53) },
7362 { "vandpX", { XM, Vex, EXx } },
7363 { "vandnpX", { XM, Vex, EXx } },
7364 { "vorpX", { XM, Vex, EXx } },
7365 { "vxorpX", { XM, Vex, EXx } },
7366 /* 58 */
7367 { PREFIX_TABLE (PREFIX_VEX_0F58) },
7368 { PREFIX_TABLE (PREFIX_VEX_0F59) },
7369 { PREFIX_TABLE (PREFIX_VEX_0F5A) },
7370 { PREFIX_TABLE (PREFIX_VEX_0F5B) },
7371 { PREFIX_TABLE (PREFIX_VEX_0F5C) },
7372 { PREFIX_TABLE (PREFIX_VEX_0F5D) },
7373 { PREFIX_TABLE (PREFIX_VEX_0F5E) },
7374 { PREFIX_TABLE (PREFIX_VEX_0F5F) },
7375 /* 60 */
7376 { PREFIX_TABLE (PREFIX_VEX_0F60) },
7377 { PREFIX_TABLE (PREFIX_VEX_0F61) },
7378 { PREFIX_TABLE (PREFIX_VEX_0F62) },
7379 { PREFIX_TABLE (PREFIX_VEX_0F63) },
7380 { PREFIX_TABLE (PREFIX_VEX_0F64) },
7381 { PREFIX_TABLE (PREFIX_VEX_0F65) },
7382 { PREFIX_TABLE (PREFIX_VEX_0F66) },
7383 { PREFIX_TABLE (PREFIX_VEX_0F67) },
7384 /* 68 */
7385 { PREFIX_TABLE (PREFIX_VEX_0F68) },
7386 { PREFIX_TABLE (PREFIX_VEX_0F69) },
7387 { PREFIX_TABLE (PREFIX_VEX_0F6A) },
7388 { PREFIX_TABLE (PREFIX_VEX_0F6B) },
7389 { PREFIX_TABLE (PREFIX_VEX_0F6C) },
7390 { PREFIX_TABLE (PREFIX_VEX_0F6D) },
7391 { PREFIX_TABLE (PREFIX_VEX_0F6E) },
7392 { PREFIX_TABLE (PREFIX_VEX_0F6F) },
7393 /* 70 */
7394 { PREFIX_TABLE (PREFIX_VEX_0F70) },
7395 { REG_TABLE (REG_VEX_0F71) },
7396 { REG_TABLE (REG_VEX_0F72) },
7397 { REG_TABLE (REG_VEX_0F73) },
7398 { PREFIX_TABLE (PREFIX_VEX_0F74) },
7399 { PREFIX_TABLE (PREFIX_VEX_0F75) },
7400 { PREFIX_TABLE (PREFIX_VEX_0F76) },
7401 { PREFIX_TABLE (PREFIX_VEX_0F77) },
7402 /* 78 */
7403 { Bad_Opcode },
7404 { Bad_Opcode },
7405 { Bad_Opcode },
7406 { Bad_Opcode },
7407 { PREFIX_TABLE (PREFIX_VEX_0F7C) },
7408 { PREFIX_TABLE (PREFIX_VEX_0F7D) },
7409 { PREFIX_TABLE (PREFIX_VEX_0F7E) },
7410 { PREFIX_TABLE (PREFIX_VEX_0F7F) },
7411 /* 80 */
7412 { Bad_Opcode },
7413 { Bad_Opcode },
7414 { Bad_Opcode },
7415 { Bad_Opcode },
7416 { Bad_Opcode },
7417 { Bad_Opcode },
7418 { Bad_Opcode },
7419 { Bad_Opcode },
7420 /* 88 */
7421 { Bad_Opcode },
7422 { Bad_Opcode },
7423 { Bad_Opcode },
7424 { Bad_Opcode },
7425 { Bad_Opcode },
7426 { Bad_Opcode },
7427 { Bad_Opcode },
7428 { Bad_Opcode },
7429 /* 90 */
7430 { Bad_Opcode },
7431 { Bad_Opcode },
7432 { Bad_Opcode },
7433 { Bad_Opcode },
7434 { Bad_Opcode },
7435 { Bad_Opcode },
7436 { Bad_Opcode },
7437 { Bad_Opcode },
7438 /* 98 */
7439 { Bad_Opcode },
7440 { Bad_Opcode },
7441 { Bad_Opcode },
7442 { Bad_Opcode },
7443 { Bad_Opcode },
7444 { Bad_Opcode },
7445 { Bad_Opcode },
7446 { Bad_Opcode },
7447 /* a0 */
7448 { Bad_Opcode },
7449 { Bad_Opcode },
7450 { Bad_Opcode },
7451 { Bad_Opcode },
7452 { Bad_Opcode },
7453 { Bad_Opcode },
7454 { Bad_Opcode },
7455 { Bad_Opcode },
7456 /* a8 */
7457 { Bad_Opcode },
7458 { Bad_Opcode },
7459 { Bad_Opcode },
7460 { Bad_Opcode },
7461 { Bad_Opcode },
7462 { Bad_Opcode },
7463 { REG_TABLE (REG_VEX_0FAE) },
7464 { Bad_Opcode },
7465 /* b0 */
7466 { Bad_Opcode },
7467 { Bad_Opcode },
7468 { Bad_Opcode },
7469 { Bad_Opcode },
7470 { Bad_Opcode },
7471 { Bad_Opcode },
7472 { Bad_Opcode },
7473 { Bad_Opcode },
7474 /* b8 */
7475 { Bad_Opcode },
7476 { Bad_Opcode },
7477 { Bad_Opcode },
7478 { Bad_Opcode },
7479 { Bad_Opcode },
7480 { Bad_Opcode },
7481 { Bad_Opcode },
7482 { Bad_Opcode },
7483 /* c0 */
7484 { Bad_Opcode },
7485 { Bad_Opcode },
7486 { PREFIX_TABLE (PREFIX_VEX_0FC2) },
7487 { Bad_Opcode },
7488 { PREFIX_TABLE (PREFIX_VEX_0FC4) },
7489 { PREFIX_TABLE (PREFIX_VEX_0FC5) },
7490 { "vshufpX", { XM, Vex, EXx, Ib } },
7491 { Bad_Opcode },
7492 /* c8 */
7493 { Bad_Opcode },
7494 { Bad_Opcode },
7495 { Bad_Opcode },
7496 { Bad_Opcode },
7497 { Bad_Opcode },
7498 { Bad_Opcode },
7499 { Bad_Opcode },
7500 { Bad_Opcode },
7501 /* d0 */
7502 { PREFIX_TABLE (PREFIX_VEX_0FD0) },
7503 { PREFIX_TABLE (PREFIX_VEX_0FD1) },
7504 { PREFIX_TABLE (PREFIX_VEX_0FD2) },
7505 { PREFIX_TABLE (PREFIX_VEX_0FD3) },
7506 { PREFIX_TABLE (PREFIX_VEX_0FD4) },
7507 { PREFIX_TABLE (PREFIX_VEX_0FD5) },
7508 { PREFIX_TABLE (PREFIX_VEX_0FD6) },
7509 { PREFIX_TABLE (PREFIX_VEX_0FD7) },
7510 /* d8 */
7511 { PREFIX_TABLE (PREFIX_VEX_0FD8) },
7512 { PREFIX_TABLE (PREFIX_VEX_0FD9) },
7513 { PREFIX_TABLE (PREFIX_VEX_0FDA) },
7514 { PREFIX_TABLE (PREFIX_VEX_0FDB) },
7515 { PREFIX_TABLE (PREFIX_VEX_0FDC) },
7516 { PREFIX_TABLE (PREFIX_VEX_0FDD) },
7517 { PREFIX_TABLE (PREFIX_VEX_0FDE) },
7518 { PREFIX_TABLE (PREFIX_VEX_0FDF) },
7519 /* e0 */
7520 { PREFIX_TABLE (PREFIX_VEX_0FE0) },
7521 { PREFIX_TABLE (PREFIX_VEX_0FE1) },
7522 { PREFIX_TABLE (PREFIX_VEX_0FE2) },
7523 { PREFIX_TABLE (PREFIX_VEX_0FE3) },
7524 { PREFIX_TABLE (PREFIX_VEX_0FE4) },
7525 { PREFIX_TABLE (PREFIX_VEX_0FE5) },
7526 { PREFIX_TABLE (PREFIX_VEX_0FE6) },
7527 { PREFIX_TABLE (PREFIX_VEX_0FE7) },
7528 /* e8 */
7529 { PREFIX_TABLE (PREFIX_VEX_0FE8) },
7530 { PREFIX_TABLE (PREFIX_VEX_0FE9) },
7531 { PREFIX_TABLE (PREFIX_VEX_0FEA) },
7532 { PREFIX_TABLE (PREFIX_VEX_0FEB) },
7533 { PREFIX_TABLE (PREFIX_VEX_0FEC) },
7534 { PREFIX_TABLE (PREFIX_VEX_0FED) },
7535 { PREFIX_TABLE (PREFIX_VEX_0FEE) },
7536 { PREFIX_TABLE (PREFIX_VEX_0FEF) },
7537 /* f0 */
7538 { PREFIX_TABLE (PREFIX_VEX_0FF0) },
7539 { PREFIX_TABLE (PREFIX_VEX_0FF1) },
7540 { PREFIX_TABLE (PREFIX_VEX_0FF2) },
7541 { PREFIX_TABLE (PREFIX_VEX_0FF3) },
7542 { PREFIX_TABLE (PREFIX_VEX_0FF4) },
7543 { PREFIX_TABLE (PREFIX_VEX_0FF5) },
7544 { PREFIX_TABLE (PREFIX_VEX_0FF6) },
7545 { PREFIX_TABLE (PREFIX_VEX_0FF7) },
7546 /* f8 */
7547 { PREFIX_TABLE (PREFIX_VEX_0FF8) },
7548 { PREFIX_TABLE (PREFIX_VEX_0FF9) },
7549 { PREFIX_TABLE (PREFIX_VEX_0FFA) },
7550 { PREFIX_TABLE (PREFIX_VEX_0FFB) },
7551 { PREFIX_TABLE (PREFIX_VEX_0FFC) },
7552 { PREFIX_TABLE (PREFIX_VEX_0FFD) },
7553 { PREFIX_TABLE (PREFIX_VEX_0FFE) },
7554 { Bad_Opcode },
7556 /* VEX_0F38 */
7558 /* 00 */
7559 { PREFIX_TABLE (PREFIX_VEX_0F3800) },
7560 { PREFIX_TABLE (PREFIX_VEX_0F3801) },
7561 { PREFIX_TABLE (PREFIX_VEX_0F3802) },
7562 { PREFIX_TABLE (PREFIX_VEX_0F3803) },
7563 { PREFIX_TABLE (PREFIX_VEX_0F3804) },
7564 { PREFIX_TABLE (PREFIX_VEX_0F3805) },
7565 { PREFIX_TABLE (PREFIX_VEX_0F3806) },
7566 { PREFIX_TABLE (PREFIX_VEX_0F3807) },
7567 /* 08 */
7568 { PREFIX_TABLE (PREFIX_VEX_0F3808) },
7569 { PREFIX_TABLE (PREFIX_VEX_0F3809) },
7570 { PREFIX_TABLE (PREFIX_VEX_0F380A) },
7571 { PREFIX_TABLE (PREFIX_VEX_0F380B) },
7572 { PREFIX_TABLE (PREFIX_VEX_0F380C) },
7573 { PREFIX_TABLE (PREFIX_VEX_0F380D) },
7574 { PREFIX_TABLE (PREFIX_VEX_0F380E) },
7575 { PREFIX_TABLE (PREFIX_VEX_0F380F) },
7576 /* 10 */
7577 { Bad_Opcode },
7578 { Bad_Opcode },
7579 { Bad_Opcode },
7580 { PREFIX_TABLE (PREFIX_VEX_0F3813) },
7581 { Bad_Opcode },
7582 { Bad_Opcode },
7583 { Bad_Opcode },
7584 { PREFIX_TABLE (PREFIX_VEX_0F3817) },
7585 /* 18 */
7586 { PREFIX_TABLE (PREFIX_VEX_0F3818) },
7587 { PREFIX_TABLE (PREFIX_VEX_0F3819) },
7588 { PREFIX_TABLE (PREFIX_VEX_0F381A) },
7589 { Bad_Opcode },
7590 { PREFIX_TABLE (PREFIX_VEX_0F381C) },
7591 { PREFIX_TABLE (PREFIX_VEX_0F381D) },
7592 { PREFIX_TABLE (PREFIX_VEX_0F381E) },
7593 { Bad_Opcode },
7594 /* 20 */
7595 { PREFIX_TABLE (PREFIX_VEX_0F3820) },
7596 { PREFIX_TABLE (PREFIX_VEX_0F3821) },
7597 { PREFIX_TABLE (PREFIX_VEX_0F3822) },
7598 { PREFIX_TABLE (PREFIX_VEX_0F3823) },
7599 { PREFIX_TABLE (PREFIX_VEX_0F3824) },
7600 { PREFIX_TABLE (PREFIX_VEX_0F3825) },
7601 { Bad_Opcode },
7602 { Bad_Opcode },
7603 /* 28 */
7604 { PREFIX_TABLE (PREFIX_VEX_0F3828) },
7605 { PREFIX_TABLE (PREFIX_VEX_0F3829) },
7606 { PREFIX_TABLE (PREFIX_VEX_0F382A) },
7607 { PREFIX_TABLE (PREFIX_VEX_0F382B) },
7608 { PREFIX_TABLE (PREFIX_VEX_0F382C) },
7609 { PREFIX_TABLE (PREFIX_VEX_0F382D) },
7610 { PREFIX_TABLE (PREFIX_VEX_0F382E) },
7611 { PREFIX_TABLE (PREFIX_VEX_0F382F) },
7612 /* 30 */
7613 { PREFIX_TABLE (PREFIX_VEX_0F3830) },
7614 { PREFIX_TABLE (PREFIX_VEX_0F3831) },
7615 { PREFIX_TABLE (PREFIX_VEX_0F3832) },
7616 { PREFIX_TABLE (PREFIX_VEX_0F3833) },
7617 { PREFIX_TABLE (PREFIX_VEX_0F3834) },
7618 { PREFIX_TABLE (PREFIX_VEX_0F3835) },
7619 { Bad_Opcode },
7620 { PREFIX_TABLE (PREFIX_VEX_0F3837) },
7621 /* 38 */
7622 { PREFIX_TABLE (PREFIX_VEX_0F3838) },
7623 { PREFIX_TABLE (PREFIX_VEX_0F3839) },
7624 { PREFIX_TABLE (PREFIX_VEX_0F383A) },
7625 { PREFIX_TABLE (PREFIX_VEX_0F383B) },
7626 { PREFIX_TABLE (PREFIX_VEX_0F383C) },
7627 { PREFIX_TABLE (PREFIX_VEX_0F383D) },
7628 { PREFIX_TABLE (PREFIX_VEX_0F383E) },
7629 { PREFIX_TABLE (PREFIX_VEX_0F383F) },
7630 /* 40 */
7631 { PREFIX_TABLE (PREFIX_VEX_0F3840) },
7632 { PREFIX_TABLE (PREFIX_VEX_0F3841) },
7633 { Bad_Opcode },
7634 { Bad_Opcode },
7635 { Bad_Opcode },
7636 { Bad_Opcode },
7637 { Bad_Opcode },
7638 { Bad_Opcode },
7639 /* 48 */
7640 { Bad_Opcode },
7641 { Bad_Opcode },
7642 { Bad_Opcode },
7643 { Bad_Opcode },
7644 { Bad_Opcode },
7645 { Bad_Opcode },
7646 { Bad_Opcode },
7647 { Bad_Opcode },
7648 /* 50 */
7649 { Bad_Opcode },
7650 { Bad_Opcode },
7651 { Bad_Opcode },
7652 { Bad_Opcode },
7653 { Bad_Opcode },
7654 { Bad_Opcode },
7655 { Bad_Opcode },
7656 { Bad_Opcode },
7657 /* 58 */
7658 { Bad_Opcode },
7659 { Bad_Opcode },
7660 { Bad_Opcode },
7661 { Bad_Opcode },
7662 { Bad_Opcode },
7663 { Bad_Opcode },
7664 { Bad_Opcode },
7665 { Bad_Opcode },
7666 /* 60 */
7667 { Bad_Opcode },
7668 { Bad_Opcode },
7669 { Bad_Opcode },
7670 { Bad_Opcode },
7671 { Bad_Opcode },
7672 { Bad_Opcode },
7673 { Bad_Opcode },
7674 { Bad_Opcode },
7675 /* 68 */
7676 { Bad_Opcode },
7677 { Bad_Opcode },
7678 { Bad_Opcode },
7679 { Bad_Opcode },
7680 { Bad_Opcode },
7681 { Bad_Opcode },
7682 { Bad_Opcode },
7683 { Bad_Opcode },
7684 /* 70 */
7685 { Bad_Opcode },
7686 { Bad_Opcode },
7687 { Bad_Opcode },
7688 { Bad_Opcode },
7689 { Bad_Opcode },
7690 { Bad_Opcode },
7691 { Bad_Opcode },
7692 { Bad_Opcode },
7693 /* 78 */
7694 { Bad_Opcode },
7695 { Bad_Opcode },
7696 { Bad_Opcode },
7697 { Bad_Opcode },
7698 { Bad_Opcode },
7699 { Bad_Opcode },
7700 { Bad_Opcode },
7701 { Bad_Opcode },
7702 /* 80 */
7703 { Bad_Opcode },
7704 { Bad_Opcode },
7705 { Bad_Opcode },
7706 { Bad_Opcode },
7707 { Bad_Opcode },
7708 { Bad_Opcode },
7709 { Bad_Opcode },
7710 { Bad_Opcode },
7711 /* 88 */
7712 { Bad_Opcode },
7713 { Bad_Opcode },
7714 { Bad_Opcode },
7715 { Bad_Opcode },
7716 { Bad_Opcode },
7717 { Bad_Opcode },
7718 { Bad_Opcode },
7719 { Bad_Opcode },
7720 /* 90 */
7721 { Bad_Opcode },
7722 { Bad_Opcode },
7723 { Bad_Opcode },
7724 { Bad_Opcode },
7725 { Bad_Opcode },
7726 { Bad_Opcode },
7727 { PREFIX_TABLE (PREFIX_VEX_0F3896) },
7728 { PREFIX_TABLE (PREFIX_VEX_0F3897) },
7729 /* 98 */
7730 { PREFIX_TABLE (PREFIX_VEX_0F3898) },
7731 { PREFIX_TABLE (PREFIX_VEX_0F3899) },
7732 { PREFIX_TABLE (PREFIX_VEX_0F389A) },
7733 { PREFIX_TABLE (PREFIX_VEX_0F389B) },
7734 { PREFIX_TABLE (PREFIX_VEX_0F389C) },
7735 { PREFIX_TABLE (PREFIX_VEX_0F389D) },
7736 { PREFIX_TABLE (PREFIX_VEX_0F389E) },
7737 { PREFIX_TABLE (PREFIX_VEX_0F389F) },
7738 /* a0 */
7739 { Bad_Opcode },
7740 { Bad_Opcode },
7741 { Bad_Opcode },
7742 { Bad_Opcode },
7743 { Bad_Opcode },
7744 { Bad_Opcode },
7745 { PREFIX_TABLE (PREFIX_VEX_0F38A6) },
7746 { PREFIX_TABLE (PREFIX_VEX_0F38A7) },
7747 /* a8 */
7748 { PREFIX_TABLE (PREFIX_VEX_0F38A8) },
7749 { PREFIX_TABLE (PREFIX_VEX_0F38A9) },
7750 { PREFIX_TABLE (PREFIX_VEX_0F38AA) },
7751 { PREFIX_TABLE (PREFIX_VEX_0F38AB) },
7752 { PREFIX_TABLE (PREFIX_VEX_0F38AC) },
7753 { PREFIX_TABLE (PREFIX_VEX_0F38AD) },
7754 { PREFIX_TABLE (PREFIX_VEX_0F38AE) },
7755 { PREFIX_TABLE (PREFIX_VEX_0F38AF) },
7756 /* b0 */
7757 { Bad_Opcode },
7758 { Bad_Opcode },
7759 { Bad_Opcode },
7760 { Bad_Opcode },
7761 { Bad_Opcode },
7762 { Bad_Opcode },
7763 { PREFIX_TABLE (PREFIX_VEX_0F38B6) },
7764 { PREFIX_TABLE (PREFIX_VEX_0F38B7) },
7765 /* b8 */
7766 { PREFIX_TABLE (PREFIX_VEX_0F38B8) },
7767 { PREFIX_TABLE (PREFIX_VEX_0F38B9) },
7768 { PREFIX_TABLE (PREFIX_VEX_0F38BA) },
7769 { PREFIX_TABLE (PREFIX_VEX_0F38BB) },
7770 { PREFIX_TABLE (PREFIX_VEX_0F38BC) },
7771 { PREFIX_TABLE (PREFIX_VEX_0F38BD) },
7772 { PREFIX_TABLE (PREFIX_VEX_0F38BE) },
7773 { PREFIX_TABLE (PREFIX_VEX_0F38BF) },
7774 /* c0 */
7775 { Bad_Opcode },
7776 { Bad_Opcode },
7777 { Bad_Opcode },
7778 { Bad_Opcode },
7779 { Bad_Opcode },
7780 { Bad_Opcode },
7781 { Bad_Opcode },
7782 { Bad_Opcode },
7783 /* c8 */
7784 { Bad_Opcode },
7785 { Bad_Opcode },
7786 { Bad_Opcode },
7787 { Bad_Opcode },
7788 { Bad_Opcode },
7789 { Bad_Opcode },
7790 { Bad_Opcode },
7791 { Bad_Opcode },
7792 /* d0 */
7793 { Bad_Opcode },
7794 { Bad_Opcode },
7795 { Bad_Opcode },
7796 { Bad_Opcode },
7797 { Bad_Opcode },
7798 { Bad_Opcode },
7799 { Bad_Opcode },
7800 { Bad_Opcode },
7801 /* d8 */
7802 { Bad_Opcode },
7803 { Bad_Opcode },
7804 { Bad_Opcode },
7805 { PREFIX_TABLE (PREFIX_VEX_0F38DB) },
7806 { PREFIX_TABLE (PREFIX_VEX_0F38DC) },
7807 { PREFIX_TABLE (PREFIX_VEX_0F38DD) },
7808 { PREFIX_TABLE (PREFIX_VEX_0F38DE) },
7809 { PREFIX_TABLE (PREFIX_VEX_0F38DF) },
7810 /* e0 */
7811 { Bad_Opcode },
7812 { Bad_Opcode },
7813 { Bad_Opcode },
7814 { Bad_Opcode },
7815 { Bad_Opcode },
7816 { Bad_Opcode },
7817 { Bad_Opcode },
7818 { Bad_Opcode },
7819 /* e8 */
7820 { Bad_Opcode },
7821 { Bad_Opcode },
7822 { Bad_Opcode },
7823 { Bad_Opcode },
7824 { Bad_Opcode },
7825 { Bad_Opcode },
7826 { Bad_Opcode },
7827 { Bad_Opcode },
7828 /* f0 */
7829 { Bad_Opcode },
7830 { Bad_Opcode },
7831 { Bad_Opcode },
7832 { Bad_Opcode },
7833 { Bad_Opcode },
7834 { Bad_Opcode },
7835 { Bad_Opcode },
7836 { Bad_Opcode },
7837 /* f8 */
7838 { Bad_Opcode },
7839 { Bad_Opcode },
7840 { Bad_Opcode },
7841 { Bad_Opcode },
7842 { Bad_Opcode },
7843 { Bad_Opcode },
7844 { Bad_Opcode },
7845 { Bad_Opcode },
7847 /* VEX_0F3A */
7849 /* 00 */
7850 { Bad_Opcode },
7851 { Bad_Opcode },
7852 { Bad_Opcode },
7853 { Bad_Opcode },
7854 { PREFIX_TABLE (PREFIX_VEX_0F3A04) },
7855 { PREFIX_TABLE (PREFIX_VEX_0F3A05) },
7856 { PREFIX_TABLE (PREFIX_VEX_0F3A06) },
7857 { Bad_Opcode },
7858 /* 08 */
7859 { PREFIX_TABLE (PREFIX_VEX_0F3A08) },
7860 { PREFIX_TABLE (PREFIX_VEX_0F3A09) },
7861 { PREFIX_TABLE (PREFIX_VEX_0F3A0A) },
7862 { PREFIX_TABLE (PREFIX_VEX_0F3A0B) },
7863 { PREFIX_TABLE (PREFIX_VEX_0F3A0C) },
7864 { PREFIX_TABLE (PREFIX_VEX_0F3A0D) },
7865 { PREFIX_TABLE (PREFIX_VEX_0F3A0E) },
7866 { PREFIX_TABLE (PREFIX_VEX_0F3A0F) },
7867 /* 10 */
7868 { Bad_Opcode },
7869 { Bad_Opcode },
7870 { Bad_Opcode },
7871 { Bad_Opcode },
7872 { PREFIX_TABLE (PREFIX_VEX_0F3A14) },
7873 { PREFIX_TABLE (PREFIX_VEX_0F3A15) },
7874 { PREFIX_TABLE (PREFIX_VEX_0F3A16) },
7875 { PREFIX_TABLE (PREFIX_VEX_0F3A17) },
7876 /* 18 */
7877 { PREFIX_TABLE (PREFIX_VEX_0F3A18) },
7878 { PREFIX_TABLE (PREFIX_VEX_0F3A19) },
7879 { Bad_Opcode },
7880 { Bad_Opcode },
7881 { Bad_Opcode },
7882 { PREFIX_TABLE (PREFIX_VEX_0F3A1D) },
7883 { Bad_Opcode },
7884 { Bad_Opcode },
7885 /* 20 */
7886 { PREFIX_TABLE (PREFIX_VEX_0F3A20) },
7887 { PREFIX_TABLE (PREFIX_VEX_0F3A21) },
7888 { PREFIX_TABLE (PREFIX_VEX_0F3A22) },
7889 { Bad_Opcode },
7890 { Bad_Opcode },
7891 { Bad_Opcode },
7892 { Bad_Opcode },
7893 { Bad_Opcode },
7894 /* 28 */
7895 { Bad_Opcode },
7896 { Bad_Opcode },
7897 { Bad_Opcode },
7898 { Bad_Opcode },
7899 { Bad_Opcode },
7900 { Bad_Opcode },
7901 { Bad_Opcode },
7902 { Bad_Opcode },
7903 /* 30 */
7904 { Bad_Opcode },
7905 { Bad_Opcode },
7906 { Bad_Opcode },
7907 { Bad_Opcode },
7908 { Bad_Opcode },
7909 { Bad_Opcode },
7910 { Bad_Opcode },
7911 { Bad_Opcode },
7912 /* 38 */
7913 { Bad_Opcode },
7914 { Bad_Opcode },
7915 { Bad_Opcode },
7916 { Bad_Opcode },
7917 { Bad_Opcode },
7918 { Bad_Opcode },
7919 { Bad_Opcode },
7920 { Bad_Opcode },
7921 /* 40 */
7922 { PREFIX_TABLE (PREFIX_VEX_0F3A40) },
7923 { PREFIX_TABLE (PREFIX_VEX_0F3A41) },
7924 { PREFIX_TABLE (PREFIX_VEX_0F3A42) },
7925 { Bad_Opcode },
7926 { PREFIX_TABLE (PREFIX_VEX_0F3A44) },
7927 { Bad_Opcode },
7928 { Bad_Opcode },
7929 { Bad_Opcode },
7930 /* 48 */
7931 { PREFIX_TABLE (PREFIX_VEX_0F3A48) },
7932 { PREFIX_TABLE (PREFIX_VEX_0F3A49) },
7933 { PREFIX_TABLE (PREFIX_VEX_0F3A4A) },
7934 { PREFIX_TABLE (PREFIX_VEX_0F3A4B) },
7935 { PREFIX_TABLE (PREFIX_VEX_0F3A4C) },
7936 { Bad_Opcode },
7937 { Bad_Opcode },
7938 { Bad_Opcode },
7939 /* 50 */
7940 { Bad_Opcode },
7941 { Bad_Opcode },
7942 { Bad_Opcode },
7943 { Bad_Opcode },
7944 { Bad_Opcode },
7945 { Bad_Opcode },
7946 { Bad_Opcode },
7947 { Bad_Opcode },
7948 /* 58 */
7949 { Bad_Opcode },
7950 { Bad_Opcode },
7951 { Bad_Opcode },
7952 { Bad_Opcode },
7953 { PREFIX_TABLE (PREFIX_VEX_0F3A5C) },
7954 { PREFIX_TABLE (PREFIX_VEX_0F3A5D) },
7955 { PREFIX_TABLE (PREFIX_VEX_0F3A5E) },
7956 { PREFIX_TABLE (PREFIX_VEX_0F3A5F) },
7957 /* 60 */
7958 { PREFIX_TABLE (PREFIX_VEX_0F3A60) },
7959 { PREFIX_TABLE (PREFIX_VEX_0F3A61) },
7960 { PREFIX_TABLE (PREFIX_VEX_0F3A62) },
7961 { PREFIX_TABLE (PREFIX_VEX_0F3A63) },
7962 { Bad_Opcode },
7963 { Bad_Opcode },
7964 { Bad_Opcode },
7965 { Bad_Opcode },
7966 /* 68 */
7967 { PREFIX_TABLE (PREFIX_VEX_0F3A68) },
7968 { PREFIX_TABLE (PREFIX_VEX_0F3A69) },
7969 { PREFIX_TABLE (PREFIX_VEX_0F3A6A) },
7970 { PREFIX_TABLE (PREFIX_VEX_0F3A6B) },
7971 { PREFIX_TABLE (PREFIX_VEX_0F3A6C) },
7972 { PREFIX_TABLE (PREFIX_VEX_0F3A6D) },
7973 { PREFIX_TABLE (PREFIX_VEX_0F3A6E) },
7974 { PREFIX_TABLE (PREFIX_VEX_0F3A6F) },
7975 /* 70 */
7976 { Bad_Opcode },
7977 { Bad_Opcode },
7978 { Bad_Opcode },
7979 { Bad_Opcode },
7980 { Bad_Opcode },
7981 { Bad_Opcode },
7982 { Bad_Opcode },
7983 { Bad_Opcode },
7984 /* 78 */
7985 { PREFIX_TABLE (PREFIX_VEX_0F3A78) },
7986 { PREFIX_TABLE (PREFIX_VEX_0F3A79) },
7987 { PREFIX_TABLE (PREFIX_VEX_0F3A7A) },
7988 { PREFIX_TABLE (PREFIX_VEX_0F3A7B) },
7989 { PREFIX_TABLE (PREFIX_VEX_0F3A7C) },
7990 { PREFIX_TABLE (PREFIX_VEX_0F3A7D) },
7991 { PREFIX_TABLE (PREFIX_VEX_0F3A7E) },
7992 { PREFIX_TABLE (PREFIX_VEX_0F3A7F) },
7993 /* 80 */
7994 { Bad_Opcode },
7995 { Bad_Opcode },
7996 { Bad_Opcode },
7997 { Bad_Opcode },
7998 { Bad_Opcode },
7999 { Bad_Opcode },
8000 { Bad_Opcode },
8001 { Bad_Opcode },
8002 /* 88 */
8003 { Bad_Opcode },
8004 { Bad_Opcode },
8005 { Bad_Opcode },
8006 { Bad_Opcode },
8007 { Bad_Opcode },
8008 { Bad_Opcode },
8009 { Bad_Opcode },
8010 { Bad_Opcode },
8011 /* 90 */
8012 { Bad_Opcode },
8013 { Bad_Opcode },
8014 { Bad_Opcode },
8015 { Bad_Opcode },
8016 { Bad_Opcode },
8017 { Bad_Opcode },
8018 { Bad_Opcode },
8019 { Bad_Opcode },
8020 /* 98 */
8021 { Bad_Opcode },
8022 { Bad_Opcode },
8023 { Bad_Opcode },
8024 { Bad_Opcode },
8025 { Bad_Opcode },
8026 { Bad_Opcode },
8027 { Bad_Opcode },
8028 { Bad_Opcode },
8029 /* a0 */
8030 { Bad_Opcode },
8031 { Bad_Opcode },
8032 { Bad_Opcode },
8033 { Bad_Opcode },
8034 { Bad_Opcode },
8035 { Bad_Opcode },
8036 { Bad_Opcode },
8037 { Bad_Opcode },
8038 /* a8 */
8039 { Bad_Opcode },
8040 { Bad_Opcode },
8041 { Bad_Opcode },
8042 { Bad_Opcode },
8043 { Bad_Opcode },
8044 { Bad_Opcode },
8045 { Bad_Opcode },
8046 { Bad_Opcode },
8047 /* b0 */
8048 { Bad_Opcode },
8049 { Bad_Opcode },
8050 { Bad_Opcode },
8051 { Bad_Opcode },
8052 { Bad_Opcode },
8053 { Bad_Opcode },
8054 { Bad_Opcode },
8055 { Bad_Opcode },
8056 /* b8 */
8057 { Bad_Opcode },
8058 { Bad_Opcode },
8059 { Bad_Opcode },
8060 { Bad_Opcode },
8061 { Bad_Opcode },
8062 { Bad_Opcode },
8063 { Bad_Opcode },
8064 { Bad_Opcode },
8065 /* c0 */
8066 { Bad_Opcode },
8067 { Bad_Opcode },
8068 { Bad_Opcode },
8069 { Bad_Opcode },
8070 { Bad_Opcode },
8071 { Bad_Opcode },
8072 { Bad_Opcode },
8073 { Bad_Opcode },
8074 /* c8 */
8075 { Bad_Opcode },
8076 { Bad_Opcode },
8077 { Bad_Opcode },
8078 { Bad_Opcode },
8079 { Bad_Opcode },
8080 { Bad_Opcode },
8081 { Bad_Opcode },
8082 { Bad_Opcode },
8083 /* d0 */
8084 { Bad_Opcode },
8085 { Bad_Opcode },
8086 { Bad_Opcode },
8087 { Bad_Opcode },
8088 { Bad_Opcode },
8089 { Bad_Opcode },
8090 { Bad_Opcode },
8091 { Bad_Opcode },
8092 /* d8 */
8093 { Bad_Opcode },
8094 { Bad_Opcode },
8095 { Bad_Opcode },
8096 { Bad_Opcode },
8097 { Bad_Opcode },
8098 { Bad_Opcode },
8099 { Bad_Opcode },
8100 { PREFIX_TABLE (PREFIX_VEX_0F3ADF) },
8101 /* e0 */
8102 { Bad_Opcode },
8103 { Bad_Opcode },
8104 { Bad_Opcode },
8105 { Bad_Opcode },
8106 { Bad_Opcode },
8107 { Bad_Opcode },
8108 { Bad_Opcode },
8109 { Bad_Opcode },
8110 /* e8 */
8111 { Bad_Opcode },
8112 { Bad_Opcode },
8113 { Bad_Opcode },
8114 { Bad_Opcode },
8115 { Bad_Opcode },
8116 { Bad_Opcode },
8117 { Bad_Opcode },
8118 { Bad_Opcode },
8119 /* f0 */
8120 { Bad_Opcode },
8121 { Bad_Opcode },
8122 { Bad_Opcode },
8123 { Bad_Opcode },
8124 { Bad_Opcode },
8125 { Bad_Opcode },
8126 { Bad_Opcode },
8127 { Bad_Opcode },
8128 /* f8 */
8129 { Bad_Opcode },
8130 { Bad_Opcode },
8131 { Bad_Opcode },
8132 { Bad_Opcode },
8133 { Bad_Opcode },
8134 { Bad_Opcode },
8135 { Bad_Opcode },
8136 { Bad_Opcode },
8140 static const struct dis386 vex_len_table[][2] = {
8141 /* VEX_LEN_0F10_P_1 */
8143 { VEX_W_TABLE (VEX_W_0F10_P_1) },
8144 { VEX_W_TABLE (VEX_W_0F10_P_1) },
8147 /* VEX_LEN_0F10_P_3 */
8149 { VEX_W_TABLE (VEX_W_0F10_P_3) },
8150 { VEX_W_TABLE (VEX_W_0F10_P_3) },
8153 /* VEX_LEN_0F11_P_1 */
8155 { VEX_W_TABLE (VEX_W_0F11_P_1) },
8156 { VEX_W_TABLE (VEX_W_0F11_P_1) },
8159 /* VEX_LEN_0F11_P_3 */
8161 { VEX_W_TABLE (VEX_W_0F11_P_3) },
8162 { VEX_W_TABLE (VEX_W_0F11_P_3) },
8165 /* VEX_LEN_0F12_P_0_M_0 */
8167 { VEX_W_TABLE (VEX_W_0F12_P_0_M_0) },
8170 /* VEX_LEN_0F12_P_0_M_1 */
8172 { VEX_W_TABLE (VEX_W_0F12_P_0_M_1) },
8175 /* VEX_LEN_0F12_P_2 */
8177 { VEX_W_TABLE (VEX_W_0F12_P_2) },
8180 /* VEX_LEN_0F13_M_0 */
8182 { VEX_W_TABLE (VEX_W_0F13_M_0) },
8185 /* VEX_LEN_0F16_P_0_M_0 */
8187 { VEX_W_TABLE (VEX_W_0F16_P_0_M_0) },
8190 /* VEX_LEN_0F16_P_0_M_1 */
8192 { VEX_W_TABLE (VEX_W_0F16_P_0_M_1) },
8195 /* VEX_LEN_0F16_P_2 */
8197 { VEX_W_TABLE (VEX_W_0F16_P_2) },
8200 /* VEX_LEN_0F17_M_0 */
8202 { VEX_W_TABLE (VEX_W_0F17_M_0) },
8205 /* VEX_LEN_0F2A_P_1 */
8207 { "vcvtsi2ss%LQ", { XMScalar, VexScalar, Ev } },
8208 { "vcvtsi2ss%LQ", { XMScalar, VexScalar, Ev } },
8211 /* VEX_LEN_0F2A_P_3 */
8213 { "vcvtsi2sd%LQ", { XMScalar, VexScalar, Ev } },
8214 { "vcvtsi2sd%LQ", { XMScalar, VexScalar, Ev } },
8217 /* VEX_LEN_0F2C_P_1 */
8219 { "vcvttss2siY", { Gv, EXdScalar } },
8220 { "vcvttss2siY", { Gv, EXdScalar } },
8223 /* VEX_LEN_0F2C_P_3 */
8225 { "vcvttsd2siY", { Gv, EXqScalar } },
8226 { "vcvttsd2siY", { Gv, EXqScalar } },
8229 /* VEX_LEN_0F2D_P_1 */
8231 { "vcvtss2siY", { Gv, EXdScalar } },
8232 { "vcvtss2siY", { Gv, EXdScalar } },
8235 /* VEX_LEN_0F2D_P_3 */
8237 { "vcvtsd2siY", { Gv, EXqScalar } },
8238 { "vcvtsd2siY", { Gv, EXqScalar } },
8241 /* VEX_LEN_0F2E_P_0 */
8243 { VEX_W_TABLE (VEX_W_0F2E_P_0) },
8244 { VEX_W_TABLE (VEX_W_0F2E_P_0) },
8247 /* VEX_LEN_0F2E_P_2 */
8249 { VEX_W_TABLE (VEX_W_0F2E_P_2) },
8250 { VEX_W_TABLE (VEX_W_0F2E_P_2) },
8253 /* VEX_LEN_0F2F_P_0 */
8255 { VEX_W_TABLE (VEX_W_0F2F_P_0) },
8256 { VEX_W_TABLE (VEX_W_0F2F_P_0) },
8259 /* VEX_LEN_0F2F_P_2 */
8261 { VEX_W_TABLE (VEX_W_0F2F_P_2) },
8262 { VEX_W_TABLE (VEX_W_0F2F_P_2) },
8265 /* VEX_LEN_0F51_P_1 */
8267 { VEX_W_TABLE (VEX_W_0F51_P_1) },
8268 { VEX_W_TABLE (VEX_W_0F51_P_1) },
8271 /* VEX_LEN_0F51_P_3 */
8273 { VEX_W_TABLE (VEX_W_0F51_P_3) },
8274 { VEX_W_TABLE (VEX_W_0F51_P_3) },
8277 /* VEX_LEN_0F52_P_1 */
8279 { VEX_W_TABLE (VEX_W_0F52_P_1) },
8280 { VEX_W_TABLE (VEX_W_0F52_P_1) },
8283 /* VEX_LEN_0F53_P_1 */
8285 { VEX_W_TABLE (VEX_W_0F53_P_1) },
8286 { VEX_W_TABLE (VEX_W_0F53_P_1) },
8289 /* VEX_LEN_0F58_P_1 */
8291 { VEX_W_TABLE (VEX_W_0F58_P_1) },
8292 { VEX_W_TABLE (VEX_W_0F58_P_1) },
8295 /* VEX_LEN_0F58_P_3 */
8297 { VEX_W_TABLE (VEX_W_0F58_P_3) },
8298 { VEX_W_TABLE (VEX_W_0F58_P_3) },
8301 /* VEX_LEN_0F59_P_1 */
8303 { VEX_W_TABLE (VEX_W_0F59_P_1) },
8304 { VEX_W_TABLE (VEX_W_0F59_P_1) },
8307 /* VEX_LEN_0F59_P_3 */
8309 { VEX_W_TABLE (VEX_W_0F59_P_3) },
8310 { VEX_W_TABLE (VEX_W_0F59_P_3) },
8313 /* VEX_LEN_0F5A_P_1 */
8315 { VEX_W_TABLE (VEX_W_0F5A_P_1) },
8316 { VEX_W_TABLE (VEX_W_0F5A_P_1) },
8319 /* VEX_LEN_0F5A_P_3 */
8321 { VEX_W_TABLE (VEX_W_0F5A_P_3) },
8322 { VEX_W_TABLE (VEX_W_0F5A_P_3) },
8325 /* VEX_LEN_0F5C_P_1 */
8327 { VEX_W_TABLE (VEX_W_0F5C_P_1) },
8328 { VEX_W_TABLE (VEX_W_0F5C_P_1) },
8331 /* VEX_LEN_0F5C_P_3 */
8333 { VEX_W_TABLE (VEX_W_0F5C_P_3) },
8334 { VEX_W_TABLE (VEX_W_0F5C_P_3) },
8337 /* VEX_LEN_0F5D_P_1 */
8339 { VEX_W_TABLE (VEX_W_0F5D_P_1) },
8340 { VEX_W_TABLE (VEX_W_0F5D_P_1) },
8343 /* VEX_LEN_0F5D_P_3 */
8345 { VEX_W_TABLE (VEX_W_0F5D_P_3) },
8346 { VEX_W_TABLE (VEX_W_0F5D_P_3) },
8349 /* VEX_LEN_0F5E_P_1 */
8351 { VEX_W_TABLE (VEX_W_0F5E_P_1) },
8352 { VEX_W_TABLE (VEX_W_0F5E_P_1) },
8355 /* VEX_LEN_0F5E_P_3 */
8357 { VEX_W_TABLE (VEX_W_0F5E_P_3) },
8358 { VEX_W_TABLE (VEX_W_0F5E_P_3) },
8361 /* VEX_LEN_0F5F_P_1 */
8363 { VEX_W_TABLE (VEX_W_0F5F_P_1) },
8364 { VEX_W_TABLE (VEX_W_0F5F_P_1) },
8367 /* VEX_LEN_0F5F_P_3 */
8369 { VEX_W_TABLE (VEX_W_0F5F_P_3) },
8370 { VEX_W_TABLE (VEX_W_0F5F_P_3) },
8373 /* VEX_LEN_0F60_P_2 */
8375 { VEX_W_TABLE (VEX_W_0F60_P_2) },
8378 /* VEX_LEN_0F61_P_2 */
8380 { VEX_W_TABLE (VEX_W_0F61_P_2) },
8383 /* VEX_LEN_0F62_P_2 */
8385 { VEX_W_TABLE (VEX_W_0F62_P_2) },
8388 /* VEX_LEN_0F63_P_2 */
8390 { VEX_W_TABLE (VEX_W_0F63_P_2) },
8393 /* VEX_LEN_0F64_P_2 */
8395 { VEX_W_TABLE (VEX_W_0F64_P_2) },
8398 /* VEX_LEN_0F65_P_2 */
8400 { VEX_W_TABLE (VEX_W_0F65_P_2) },
8403 /* VEX_LEN_0F66_P_2 */
8405 { VEX_W_TABLE (VEX_W_0F66_P_2) },
8408 /* VEX_LEN_0F67_P_2 */
8410 { VEX_W_TABLE (VEX_W_0F67_P_2) },
8413 /* VEX_LEN_0F68_P_2 */
8415 { VEX_W_TABLE (VEX_W_0F68_P_2) },
8418 /* VEX_LEN_0F69_P_2 */
8420 { VEX_W_TABLE (VEX_W_0F69_P_2) },
8423 /* VEX_LEN_0F6A_P_2 */
8425 { VEX_W_TABLE (VEX_W_0F6A_P_2) },
8428 /* VEX_LEN_0F6B_P_2 */
8430 { VEX_W_TABLE (VEX_W_0F6B_P_2) },
8433 /* VEX_LEN_0F6C_P_2 */
8435 { VEX_W_TABLE (VEX_W_0F6C_P_2) },
8438 /* VEX_LEN_0F6D_P_2 */
8440 { VEX_W_TABLE (VEX_W_0F6D_P_2) },
8443 /* VEX_LEN_0F6E_P_2 */
8445 { "vmovK", { XMScalar, Edq } },
8446 { "vmovK", { XMScalar, Edq } },
8449 /* VEX_LEN_0F70_P_1 */
8451 { VEX_W_TABLE (VEX_W_0F70_P_1) },
8454 /* VEX_LEN_0F70_P_2 */
8456 { VEX_W_TABLE (VEX_W_0F70_P_2) },
8459 /* VEX_LEN_0F70_P_3 */
8461 { VEX_W_TABLE (VEX_W_0F70_P_3) },
8464 /* VEX_LEN_0F71_R_2_P_2 */
8466 { VEX_W_TABLE (VEX_W_0F71_R_2_P_2) },
8469 /* VEX_LEN_0F71_R_4_P_2 */
8471 { VEX_W_TABLE (VEX_W_0F71_R_4_P_2) },
8474 /* VEX_LEN_0F71_R_6_P_2 */
8476 { VEX_W_TABLE (VEX_W_0F71_R_6_P_2) },
8479 /* VEX_LEN_0F72_R_2_P_2 */
8481 { VEX_W_TABLE (VEX_W_0F72_R_2_P_2) },
8484 /* VEX_LEN_0F72_R_4_P_2 */
8486 { VEX_W_TABLE (VEX_W_0F72_R_4_P_2) },
8489 /* VEX_LEN_0F72_R_6_P_2 */
8491 { VEX_W_TABLE (VEX_W_0F72_R_6_P_2) },
8494 /* VEX_LEN_0F73_R_2_P_2 */
8496 { VEX_W_TABLE (VEX_W_0F73_R_2_P_2) },
8499 /* VEX_LEN_0F73_R_3_P_2 */
8501 { VEX_W_TABLE (VEX_W_0F73_R_3_P_2) },
8504 /* VEX_LEN_0F73_R_6_P_2 */
8506 { VEX_W_TABLE (VEX_W_0F73_R_6_P_2) },
8509 /* VEX_LEN_0F73_R_7_P_2 */
8511 { VEX_W_TABLE (VEX_W_0F73_R_7_P_2) },
8514 /* VEX_LEN_0F74_P_2 */
8516 { VEX_W_TABLE (VEX_W_0F74_P_2) },
8519 /* VEX_LEN_0F75_P_2 */
8521 { VEX_W_TABLE (VEX_W_0F75_P_2) },
8524 /* VEX_LEN_0F76_P_2 */
8526 { VEX_W_TABLE (VEX_W_0F76_P_2) },
8529 /* VEX_LEN_0F7E_P_1 */
8531 { VEX_W_TABLE (VEX_W_0F7E_P_1) },
8532 { VEX_W_TABLE (VEX_W_0F7E_P_1) },
8535 /* VEX_LEN_0F7E_P_2 */
8537 { "vmovK", { Edq, XMScalar } },
8538 { "vmovK", { Edq, XMScalar } },
8541 /* VEX_LEN_0FAE_R_2_M_0 */
8543 { VEX_W_TABLE (VEX_W_0FAE_R_2_M_0) },
8546 /* VEX_LEN_0FAE_R_3_M_0 */
8548 { VEX_W_TABLE (VEX_W_0FAE_R_3_M_0) },
8551 /* VEX_LEN_0FC2_P_1 */
8553 { VEX_W_TABLE (VEX_W_0FC2_P_1) },
8554 { VEX_W_TABLE (VEX_W_0FC2_P_1) },
8557 /* VEX_LEN_0FC2_P_3 */
8559 { VEX_W_TABLE (VEX_W_0FC2_P_3) },
8560 { VEX_W_TABLE (VEX_W_0FC2_P_3) },
8563 /* VEX_LEN_0FC4_P_2 */
8565 { VEX_W_TABLE (VEX_W_0FC4_P_2) },
8568 /* VEX_LEN_0FC5_P_2 */
8570 { VEX_W_TABLE (VEX_W_0FC5_P_2) },
8573 /* VEX_LEN_0FD1_P_2 */
8575 { VEX_W_TABLE (VEX_W_0FD1_P_2) },
8578 /* VEX_LEN_0FD2_P_2 */
8580 { VEX_W_TABLE (VEX_W_0FD2_P_2) },
8583 /* VEX_LEN_0FD3_P_2 */
8585 { VEX_W_TABLE (VEX_W_0FD3_P_2) },
8588 /* VEX_LEN_0FD4_P_2 */
8590 { VEX_W_TABLE (VEX_W_0FD4_P_2) },
8593 /* VEX_LEN_0FD5_P_2 */
8595 { VEX_W_TABLE (VEX_W_0FD5_P_2) },
8598 /* VEX_LEN_0FD6_P_2 */
8600 { VEX_W_TABLE (VEX_W_0FD6_P_2) },
8601 { VEX_W_TABLE (VEX_W_0FD6_P_2) },
8604 /* VEX_LEN_0FD7_P_2_M_1 */
8606 { VEX_W_TABLE (VEX_W_0FD7_P_2_M_1) },
8609 /* VEX_LEN_0FD8_P_2 */
8611 { VEX_W_TABLE (VEX_W_0FD8_P_2) },
8614 /* VEX_LEN_0FD9_P_2 */
8616 { VEX_W_TABLE (VEX_W_0FD9_P_2) },
8619 /* VEX_LEN_0FDA_P_2 */
8621 { VEX_W_TABLE (VEX_W_0FDA_P_2) },
8624 /* VEX_LEN_0FDB_P_2 */
8626 { VEX_W_TABLE (VEX_W_0FDB_P_2) },
8629 /* VEX_LEN_0FDC_P_2 */
8631 { VEX_W_TABLE (VEX_W_0FDC_P_2) },
8634 /* VEX_LEN_0FDD_P_2 */
8636 { VEX_W_TABLE (VEX_W_0FDD_P_2) },
8639 /* VEX_LEN_0FDE_P_2 */
8641 { VEX_W_TABLE (VEX_W_0FDE_P_2) },
8644 /* VEX_LEN_0FDF_P_2 */
8646 { VEX_W_TABLE (VEX_W_0FDF_P_2) },
8649 /* VEX_LEN_0FE0_P_2 */
8651 { VEX_W_TABLE (VEX_W_0FE0_P_2) },
8654 /* VEX_LEN_0FE1_P_2 */
8656 { VEX_W_TABLE (VEX_W_0FE1_P_2) },
8659 /* VEX_LEN_0FE2_P_2 */
8661 { VEX_W_TABLE (VEX_W_0FE2_P_2) },
8664 /* VEX_LEN_0FE3_P_2 */
8666 { VEX_W_TABLE (VEX_W_0FE3_P_2) },
8669 /* VEX_LEN_0FE4_P_2 */
8671 { VEX_W_TABLE (VEX_W_0FE4_P_2) },
8674 /* VEX_LEN_0FE5_P_2 */
8676 { VEX_W_TABLE (VEX_W_0FE5_P_2) },
8679 /* VEX_LEN_0FE8_P_2 */
8681 { VEX_W_TABLE (VEX_W_0FE8_P_2) },
8684 /* VEX_LEN_0FE9_P_2 */
8686 { VEX_W_TABLE (VEX_W_0FE9_P_2) },
8689 /* VEX_LEN_0FEA_P_2 */
8691 { VEX_W_TABLE (VEX_W_0FEA_P_2) },
8694 /* VEX_LEN_0FEB_P_2 */
8696 { VEX_W_TABLE (VEX_W_0FEB_P_2) },
8699 /* VEX_LEN_0FEC_P_2 */
8701 { VEX_W_TABLE (VEX_W_0FEC_P_2) },
8704 /* VEX_LEN_0FED_P_2 */
8706 { VEX_W_TABLE (VEX_W_0FED_P_2) },
8709 /* VEX_LEN_0FEE_P_2 */
8711 { VEX_W_TABLE (VEX_W_0FEE_P_2) },
8714 /* VEX_LEN_0FEF_P_2 */
8716 { VEX_W_TABLE (VEX_W_0FEF_P_2) },
8719 /* VEX_LEN_0FF1_P_2 */
8721 { VEX_W_TABLE (VEX_W_0FF1_P_2) },
8724 /* VEX_LEN_0FF2_P_2 */
8726 { VEX_W_TABLE (VEX_W_0FF2_P_2) },
8729 /* VEX_LEN_0FF3_P_2 */
8731 { VEX_W_TABLE (VEX_W_0FF3_P_2) },
8734 /* VEX_LEN_0FF4_P_2 */
8736 { VEX_W_TABLE (VEX_W_0FF4_P_2) },
8739 /* VEX_LEN_0FF5_P_2 */
8741 { VEX_W_TABLE (VEX_W_0FF5_P_2) },
8744 /* VEX_LEN_0FF6_P_2 */
8746 { VEX_W_TABLE (VEX_W_0FF6_P_2) },
8749 /* VEX_LEN_0FF7_P_2 */
8751 { VEX_W_TABLE (VEX_W_0FF7_P_2) },
8754 /* VEX_LEN_0FF8_P_2 */
8756 { VEX_W_TABLE (VEX_W_0FF8_P_2) },
8759 /* VEX_LEN_0FF9_P_2 */
8761 { VEX_W_TABLE (VEX_W_0FF9_P_2) },
8764 /* VEX_LEN_0FFA_P_2 */
8766 { VEX_W_TABLE (VEX_W_0FFA_P_2) },
8769 /* VEX_LEN_0FFB_P_2 */
8771 { VEX_W_TABLE (VEX_W_0FFB_P_2) },
8774 /* VEX_LEN_0FFC_P_2 */
8776 { VEX_W_TABLE (VEX_W_0FFC_P_2) },
8779 /* VEX_LEN_0FFD_P_2 */
8781 { VEX_W_TABLE (VEX_W_0FFD_P_2) },
8784 /* VEX_LEN_0FFE_P_2 */
8786 { VEX_W_TABLE (VEX_W_0FFE_P_2) },
8789 /* VEX_LEN_0F3800_P_2 */
8791 { VEX_W_TABLE (VEX_W_0F3800_P_2) },
8794 /* VEX_LEN_0F3801_P_2 */
8796 { VEX_W_TABLE (VEX_W_0F3801_P_2) },
8799 /* VEX_LEN_0F3802_P_2 */
8801 { VEX_W_TABLE (VEX_W_0F3802_P_2) },
8804 /* VEX_LEN_0F3803_P_2 */
8806 { VEX_W_TABLE (VEX_W_0F3803_P_2) },
8809 /* VEX_LEN_0F3804_P_2 */
8811 { VEX_W_TABLE (VEX_W_0F3804_P_2) },
8814 /* VEX_LEN_0F3805_P_2 */
8816 { VEX_W_TABLE (VEX_W_0F3805_P_2) },
8819 /* VEX_LEN_0F3806_P_2 */
8821 { VEX_W_TABLE (VEX_W_0F3806_P_2) },
8824 /* VEX_LEN_0F3807_P_2 */
8826 { VEX_W_TABLE (VEX_W_0F3807_P_2) },
8829 /* VEX_LEN_0F3808_P_2 */
8831 { VEX_W_TABLE (VEX_W_0F3808_P_2) },
8834 /* VEX_LEN_0F3809_P_2 */
8836 { VEX_W_TABLE (VEX_W_0F3809_P_2) },
8839 /* VEX_LEN_0F380A_P_2 */
8841 { VEX_W_TABLE (VEX_W_0F380A_P_2) },
8844 /* VEX_LEN_0F380B_P_2 */
8846 { VEX_W_TABLE (VEX_W_0F380B_P_2) },
8849 /* VEX_LEN_0F3819_P_2_M_0 */
8851 { Bad_Opcode },
8852 { VEX_W_TABLE (VEX_W_0F3819_P_2_M_0) },
8855 /* VEX_LEN_0F381A_P_2_M_0 */
8857 { Bad_Opcode },
8858 { VEX_W_TABLE (VEX_W_0F381A_P_2_M_0) },
8861 /* VEX_LEN_0F381C_P_2 */
8863 { VEX_W_TABLE (VEX_W_0F381C_P_2) },
8866 /* VEX_LEN_0F381D_P_2 */
8868 { VEX_W_TABLE (VEX_W_0F381D_P_2) },
8871 /* VEX_LEN_0F381E_P_2 */
8873 { VEX_W_TABLE (VEX_W_0F381E_P_2) },
8876 /* VEX_LEN_0F3820_P_2 */
8878 { VEX_W_TABLE (VEX_W_0F3820_P_2) },
8881 /* VEX_LEN_0F3821_P_2 */
8883 { VEX_W_TABLE (VEX_W_0F3821_P_2) },
8886 /* VEX_LEN_0F3822_P_2 */
8888 { VEX_W_TABLE (VEX_W_0F3822_P_2) },
8891 /* VEX_LEN_0F3823_P_2 */
8893 { VEX_W_TABLE (VEX_W_0F3823_P_2) },
8896 /* VEX_LEN_0F3824_P_2 */
8898 { VEX_W_TABLE (VEX_W_0F3824_P_2) },
8901 /* VEX_LEN_0F3825_P_2 */
8903 { VEX_W_TABLE (VEX_W_0F3825_P_2) },
8906 /* VEX_LEN_0F3828_P_2 */
8908 { VEX_W_TABLE (VEX_W_0F3828_P_2) },
8911 /* VEX_LEN_0F3829_P_2 */
8913 { VEX_W_TABLE (VEX_W_0F3829_P_2) },
8916 /* VEX_LEN_0F382A_P_2_M_0 */
8918 { VEX_W_TABLE (VEX_W_0F382A_P_2_M_0) },
8921 /* VEX_LEN_0F382B_P_2 */
8923 { VEX_W_TABLE (VEX_W_0F382B_P_2) },
8926 /* VEX_LEN_0F3830_P_2 */
8928 { VEX_W_TABLE (VEX_W_0F3830_P_2) },
8931 /* VEX_LEN_0F3831_P_2 */
8933 { VEX_W_TABLE (VEX_W_0F3831_P_2) },
8936 /* VEX_LEN_0F3832_P_2 */
8938 { VEX_W_TABLE (VEX_W_0F3832_P_2) },
8941 /* VEX_LEN_0F3833_P_2 */
8943 { VEX_W_TABLE (VEX_W_0F3833_P_2) },
8946 /* VEX_LEN_0F3834_P_2 */
8948 { VEX_W_TABLE (VEX_W_0F3834_P_2) },
8951 /* VEX_LEN_0F3835_P_2 */
8953 { VEX_W_TABLE (VEX_W_0F3835_P_2) },
8956 /* VEX_LEN_0F3837_P_2 */
8958 { VEX_W_TABLE (VEX_W_0F3837_P_2) },
8961 /* VEX_LEN_0F3838_P_2 */
8963 { VEX_W_TABLE (VEX_W_0F3838_P_2) },
8966 /* VEX_LEN_0F3839_P_2 */
8968 { VEX_W_TABLE (VEX_W_0F3839_P_2) },
8971 /* VEX_LEN_0F383A_P_2 */
8973 { VEX_W_TABLE (VEX_W_0F383A_P_2) },
8976 /* VEX_LEN_0F383B_P_2 */
8978 { VEX_W_TABLE (VEX_W_0F383B_P_2) },
8981 /* VEX_LEN_0F383C_P_2 */
8983 { VEX_W_TABLE (VEX_W_0F383C_P_2) },
8986 /* VEX_LEN_0F383D_P_2 */
8988 { VEX_W_TABLE (VEX_W_0F383D_P_2) },
8991 /* VEX_LEN_0F383E_P_2 */
8993 { VEX_W_TABLE (VEX_W_0F383E_P_2) },
8996 /* VEX_LEN_0F383F_P_2 */
8998 { VEX_W_TABLE (VEX_W_0F383F_P_2) },
9001 /* VEX_LEN_0F3840_P_2 */
9003 { VEX_W_TABLE (VEX_W_0F3840_P_2) },
9006 /* VEX_LEN_0F3841_P_2 */
9008 { VEX_W_TABLE (VEX_W_0F3841_P_2) },
9011 /* VEX_LEN_0F38DB_P_2 */
9013 { VEX_W_TABLE (VEX_W_0F38DB_P_2) },
9016 /* VEX_LEN_0F38DC_P_2 */
9018 { VEX_W_TABLE (VEX_W_0F38DC_P_2) },
9021 /* VEX_LEN_0F38DD_P_2 */
9023 { VEX_W_TABLE (VEX_W_0F38DD_P_2) },
9026 /* VEX_LEN_0F38DE_P_2 */
9028 { VEX_W_TABLE (VEX_W_0F38DE_P_2) },
9031 /* VEX_LEN_0F38DF_P_2 */
9033 { VEX_W_TABLE (VEX_W_0F38DF_P_2) },
9036 /* VEX_LEN_0F3A06_P_2 */
9038 { Bad_Opcode },
9039 { VEX_W_TABLE (VEX_W_0F3A06_P_2) },
9042 /* VEX_LEN_0F3A0A_P_2 */
9044 { VEX_W_TABLE (VEX_W_0F3A0A_P_2) },
9045 { VEX_W_TABLE (VEX_W_0F3A0A_P_2) },
9048 /* VEX_LEN_0F3A0B_P_2 */
9050 { VEX_W_TABLE (VEX_W_0F3A0B_P_2) },
9051 { VEX_W_TABLE (VEX_W_0F3A0B_P_2) },
9054 /* VEX_LEN_0F3A0E_P_2 */
9056 { VEX_W_TABLE (VEX_W_0F3A0E_P_2) },
9059 /* VEX_LEN_0F3A0F_P_2 */
9061 { VEX_W_TABLE (VEX_W_0F3A0F_P_2) },
9064 /* VEX_LEN_0F3A14_P_2 */
9066 { VEX_W_TABLE (VEX_W_0F3A14_P_2) },
9069 /* VEX_LEN_0F3A15_P_2 */
9071 { VEX_W_TABLE (VEX_W_0F3A15_P_2) },
9074 /* VEX_LEN_0F3A16_P_2 */
9076 { "vpextrK", { Edq, XM, Ib } },
9079 /* VEX_LEN_0F3A17_P_2 */
9081 { "vextractps", { Edqd, XM, Ib } },
9084 /* VEX_LEN_0F3A18_P_2 */
9086 { Bad_Opcode },
9087 { VEX_W_TABLE (VEX_W_0F3A18_P_2) },
9090 /* VEX_LEN_0F3A19_P_2 */
9092 { Bad_Opcode },
9093 { VEX_W_TABLE (VEX_W_0F3A19_P_2) },
9096 /* VEX_LEN_0F3A20_P_2 */
9098 { VEX_W_TABLE (VEX_W_0F3A20_P_2) },
9101 /* VEX_LEN_0F3A21_P_2 */
9103 { VEX_W_TABLE (VEX_W_0F3A21_P_2) },
9106 /* VEX_LEN_0F3A22_P_2 */
9108 { "vpinsrK", { XM, Vex128, Edq, Ib } },
9111 /* VEX_LEN_0F3A41_P_2 */
9113 { VEX_W_TABLE (VEX_W_0F3A41_P_2) },
9116 /* VEX_LEN_0F3A42_P_2 */
9118 { VEX_W_TABLE (VEX_W_0F3A42_P_2) },
9121 /* VEX_LEN_0F3A44_P_2 */
9123 { VEX_W_TABLE (VEX_W_0F3A44_P_2) },
9126 /* VEX_LEN_0F3A4C_P_2 */
9128 { VEX_W_TABLE (VEX_W_0F3A4C_P_2) },
9131 /* VEX_LEN_0F3A60_P_2 */
9133 { VEX_W_TABLE (VEX_W_0F3A60_P_2) },
9136 /* VEX_LEN_0F3A61_P_2 */
9138 { VEX_W_TABLE (VEX_W_0F3A61_P_2) },
9141 /* VEX_LEN_0F3A62_P_2 */
9143 { VEX_W_TABLE (VEX_W_0F3A62_P_2) },
9146 /* VEX_LEN_0F3A63_P_2 */
9148 { VEX_W_TABLE (VEX_W_0F3A63_P_2) },
9151 /* VEX_LEN_0F3A6A_P_2 */
9153 { "vfmaddss", { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
9156 /* VEX_LEN_0F3A6B_P_2 */
9158 { "vfmaddsd", { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
9161 /* VEX_LEN_0F3A6E_P_2 */
9163 { "vfmsubss", { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
9166 /* VEX_LEN_0F3A6F_P_2 */
9168 { "vfmsubsd", { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
9171 /* VEX_LEN_0F3A7A_P_2 */
9173 { "vfnmaddss", { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
9176 /* VEX_LEN_0F3A7B_P_2 */
9178 { "vfnmaddsd", { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
9181 /* VEX_LEN_0F3A7E_P_2 */
9183 { "vfnmsubss", { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
9186 /* VEX_LEN_0F3A7F_P_2 */
9188 { "vfnmsubsd", { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
9191 /* VEX_LEN_0F3ADF_P_2 */
9193 { VEX_W_TABLE (VEX_W_0F3ADF_P_2) },
9196 /* VEX_LEN_0FXOP_09_80 */
9198 { "vfrczps", { XM, EXxmm } },
9199 { "vfrczps", { XM, EXymmq } },
9202 /* VEX_LEN_0FXOP_09_81 */
9204 { "vfrczpd", { XM, EXxmm } },
9205 { "vfrczpd", { XM, EXymmq } },
9209 static const struct dis386 vex_w_table[][2] = {
9211 /* VEX_W_0F10_P_0 */
9212 { "vmovups", { XM, EXx } },
9215 /* VEX_W_0F10_P_1 */
9216 { "vmovss", { XMVexScalar, VexScalar, EXdScalar } },
9219 /* VEX_W_0F10_P_2 */
9220 { "vmovupd", { XM, EXx } },
9223 /* VEX_W_0F10_P_3 */
9224 { "vmovsd", { XMVexScalar, VexScalar, EXqScalar } },
9227 /* VEX_W_0F11_P_0 */
9228 { "vmovups", { EXxS, XM } },
9231 /* VEX_W_0F11_P_1 */
9232 { "vmovss", { EXdVexScalarS, VexScalar, XMScalar } },
9235 /* VEX_W_0F11_P_2 */
9236 { "vmovupd", { EXxS, XM } },
9239 /* VEX_W_0F11_P_3 */
9240 { "vmovsd", { EXqVexScalarS, VexScalar, XMScalar } },
9243 /* VEX_W_0F12_P_0_M_0 */
9244 { "vmovlps", { XM, Vex128, EXq } },
9247 /* VEX_W_0F12_P_0_M_1 */
9248 { "vmovhlps", { XM, Vex128, EXq } },
9251 /* VEX_W_0F12_P_1 */
9252 { "vmovsldup", { XM, EXx } },
9255 /* VEX_W_0F12_P_2 */
9256 { "vmovlpd", { XM, Vex128, EXq } },
9259 /* VEX_W_0F12_P_3 */
9260 { "vmovddup", { XM, EXymmq } },
9263 /* VEX_W_0F13_M_0 */
9264 { "vmovlpX", { EXq, XM } },
9267 /* VEX_W_0F14 */
9268 { "vunpcklpX", { XM, Vex, EXx } },
9271 /* VEX_W_0F15 */
9272 { "vunpckhpX", { XM, Vex, EXx } },
9275 /* VEX_W_0F16_P_0_M_0 */
9276 { "vmovhps", { XM, Vex128, EXq } },
9279 /* VEX_W_0F16_P_0_M_1 */
9280 { "vmovlhps", { XM, Vex128, EXq } },
9283 /* VEX_W_0F16_P_1 */
9284 { "vmovshdup", { XM, EXx } },
9287 /* VEX_W_0F16_P_2 */
9288 { "vmovhpd", { XM, Vex128, EXq } },
9291 /* VEX_W_0F17_M_0 */
9292 { "vmovhpX", { EXq, XM } },
9295 /* VEX_W_0F28 */
9296 { "vmovapX", { XM, EXx } },
9299 /* VEX_W_0F29 */
9300 { "vmovapX", { EXxS, XM } },
9303 /* VEX_W_0F2B_M_0 */
9304 { "vmovntpX", { Mx, XM } },
9307 /* VEX_W_0F2E_P_0 */
9308 { "vucomiss", { XMScalar, EXdScalar } },
9311 /* VEX_W_0F2E_P_2 */
9312 { "vucomisd", { XMScalar, EXqScalar } },
9315 /* VEX_W_0F2F_P_0 */
9316 { "vcomiss", { XMScalar, EXdScalar } },
9319 /* VEX_W_0F2F_P_2 */
9320 { "vcomisd", { XMScalar, EXqScalar } },
9323 /* VEX_W_0F50_M_0 */
9324 { "vmovmskpX", { Gdq, XS } },
9327 /* VEX_W_0F51_P_0 */
9328 { "vsqrtps", { XM, EXx } },
9331 /* VEX_W_0F51_P_1 */
9332 { "vsqrtss", { XMScalar, VexScalar, EXdScalar } },
9335 /* VEX_W_0F51_P_2 */
9336 { "vsqrtpd", { XM, EXx } },
9339 /* VEX_W_0F51_P_3 */
9340 { "vsqrtsd", { XMScalar, VexScalar, EXqScalar } },
9343 /* VEX_W_0F52_P_0 */
9344 { "vrsqrtps", { XM, EXx } },
9347 /* VEX_W_0F52_P_1 */
9348 { "vrsqrtss", { XMScalar, VexScalar, EXdScalar } },
9351 /* VEX_W_0F53_P_0 */
9352 { "vrcpps", { XM, EXx } },
9355 /* VEX_W_0F53_P_1 */
9356 { "vrcpss", { XMScalar, VexScalar, EXdScalar } },
9359 /* VEX_W_0F58_P_0 */
9360 { "vaddps", { XM, Vex, EXx } },
9363 /* VEX_W_0F58_P_1 */
9364 { "vaddss", { XMScalar, VexScalar, EXdScalar } },
9367 /* VEX_W_0F58_P_2 */
9368 { "vaddpd", { XM, Vex, EXx } },
9371 /* VEX_W_0F58_P_3 */
9372 { "vaddsd", { XMScalar, VexScalar, EXqScalar } },
9375 /* VEX_W_0F59_P_0 */
9376 { "vmulps", { XM, Vex, EXx } },
9379 /* VEX_W_0F59_P_1 */
9380 { "vmulss", { XMScalar, VexScalar, EXdScalar } },
9383 /* VEX_W_0F59_P_2 */
9384 { "vmulpd", { XM, Vex, EXx } },
9387 /* VEX_W_0F59_P_3 */
9388 { "vmulsd", { XMScalar, VexScalar, EXqScalar } },
9391 /* VEX_W_0F5A_P_0 */
9392 { "vcvtps2pd", { XM, EXxmmq } },
9395 /* VEX_W_0F5A_P_1 */
9396 { "vcvtss2sd", { XMScalar, VexScalar, EXdScalar } },
9399 /* VEX_W_0F5A_P_3 */
9400 { "vcvtsd2ss", { XMScalar, VexScalar, EXqScalar } },
9403 /* VEX_W_0F5B_P_0 */
9404 { "vcvtdq2ps", { XM, EXx } },
9407 /* VEX_W_0F5B_P_1 */
9408 { "vcvttps2dq", { XM, EXx } },
9411 /* VEX_W_0F5B_P_2 */
9412 { "vcvtps2dq", { XM, EXx } },
9415 /* VEX_W_0F5C_P_0 */
9416 { "vsubps", { XM, Vex, EXx } },
9419 /* VEX_W_0F5C_P_1 */
9420 { "vsubss", { XMScalar, VexScalar, EXdScalar } },
9423 /* VEX_W_0F5C_P_2 */
9424 { "vsubpd", { XM, Vex, EXx } },
9427 /* VEX_W_0F5C_P_3 */
9428 { "vsubsd", { XMScalar, VexScalar, EXqScalar } },
9431 /* VEX_W_0F5D_P_0 */
9432 { "vminps", { XM, Vex, EXx } },
9435 /* VEX_W_0F5D_P_1 */
9436 { "vminss", { XMScalar, VexScalar, EXdScalar } },
9439 /* VEX_W_0F5D_P_2 */
9440 { "vminpd", { XM, Vex, EXx } },
9443 /* VEX_W_0F5D_P_3 */
9444 { "vminsd", { XMScalar, VexScalar, EXqScalar } },
9447 /* VEX_W_0F5E_P_0 */
9448 { "vdivps", { XM, Vex, EXx } },
9451 /* VEX_W_0F5E_P_1 */
9452 { "vdivss", { XMScalar, VexScalar, EXdScalar } },
9455 /* VEX_W_0F5E_P_2 */
9456 { "vdivpd", { XM, Vex, EXx } },
9459 /* VEX_W_0F5E_P_3 */
9460 { "vdivsd", { XMScalar, VexScalar, EXqScalar } },
9463 /* VEX_W_0F5F_P_0 */
9464 { "vmaxps", { XM, Vex, EXx } },
9467 /* VEX_W_0F5F_P_1 */
9468 { "vmaxss", { XMScalar, VexScalar, EXdScalar } },
9471 /* VEX_W_0F5F_P_2 */
9472 { "vmaxpd", { XM, Vex, EXx } },
9475 /* VEX_W_0F5F_P_3 */
9476 { "vmaxsd", { XMScalar, VexScalar, EXqScalar } },
9479 /* VEX_W_0F60_P_2 */
9480 { "vpunpcklbw", { XM, Vex128, EXx } },
9483 /* VEX_W_0F61_P_2 */
9484 { "vpunpcklwd", { XM, Vex128, EXx } },
9487 /* VEX_W_0F62_P_2 */
9488 { "vpunpckldq", { XM, Vex128, EXx } },
9491 /* VEX_W_0F63_P_2 */
9492 { "vpacksswb", { XM, Vex128, EXx } },
9495 /* VEX_W_0F64_P_2 */
9496 { "vpcmpgtb", { XM, Vex128, EXx } },
9499 /* VEX_W_0F65_P_2 */
9500 { "vpcmpgtw", { XM, Vex128, EXx } },
9503 /* VEX_W_0F66_P_2 */
9504 { "vpcmpgtd", { XM, Vex128, EXx } },
9507 /* VEX_W_0F67_P_2 */
9508 { "vpackuswb", { XM, Vex128, EXx } },
9511 /* VEX_W_0F68_P_2 */
9512 { "vpunpckhbw", { XM, Vex128, EXx } },
9515 /* VEX_W_0F69_P_2 */
9516 { "vpunpckhwd", { XM, Vex128, EXx } },
9519 /* VEX_W_0F6A_P_2 */
9520 { "vpunpckhdq", { XM, Vex128, EXx } },
9523 /* VEX_W_0F6B_P_2 */
9524 { "vpackssdw", { XM, Vex128, EXx } },
9527 /* VEX_W_0F6C_P_2 */
9528 { "vpunpcklqdq", { XM, Vex128, EXx } },
9531 /* VEX_W_0F6D_P_2 */
9532 { "vpunpckhqdq", { XM, Vex128, EXx } },
9535 /* VEX_W_0F6F_P_1 */
9536 { "vmovdqu", { XM, EXx } },
9539 /* VEX_W_0F6F_P_2 */
9540 { "vmovdqa", { XM, EXx } },
9543 /* VEX_W_0F70_P_1 */
9544 { "vpshufhw", { XM, EXx, Ib } },
9547 /* VEX_W_0F70_P_2 */
9548 { "vpshufd", { XM, EXx, Ib } },
9551 /* VEX_W_0F70_P_3 */
9552 { "vpshuflw", { XM, EXx, Ib } },
9555 /* VEX_W_0F71_R_2_P_2 */
9556 { "vpsrlw", { Vex128, XS, Ib } },
9559 /* VEX_W_0F71_R_4_P_2 */
9560 { "vpsraw", { Vex128, XS, Ib } },
9563 /* VEX_W_0F71_R_6_P_2 */
9564 { "vpsllw", { Vex128, XS, Ib } },
9567 /* VEX_W_0F72_R_2_P_2 */
9568 { "vpsrld", { Vex128, XS, Ib } },
9571 /* VEX_W_0F72_R_4_P_2 */
9572 { "vpsrad", { Vex128, XS, Ib } },
9575 /* VEX_W_0F72_R_6_P_2 */
9576 { "vpslld", { Vex128, XS, Ib } },
9579 /* VEX_W_0F73_R_2_P_2 */
9580 { "vpsrlq", { Vex128, XS, Ib } },
9583 /* VEX_W_0F73_R_3_P_2 */
9584 { "vpsrldq", { Vex128, XS, Ib } },
9587 /* VEX_W_0F73_R_6_P_2 */
9588 { "vpsllq", { Vex128, XS, Ib } },
9591 /* VEX_W_0F73_R_7_P_2 */
9592 { "vpslldq", { Vex128, XS, Ib } },
9595 /* VEX_W_0F74_P_2 */
9596 { "vpcmpeqb", { XM, Vex128, EXx } },
9599 /* VEX_W_0F75_P_2 */
9600 { "vpcmpeqw", { XM, Vex128, EXx } },
9603 /* VEX_W_0F76_P_2 */
9604 { "vpcmpeqd", { XM, Vex128, EXx } },
9607 /* VEX_W_0F77_P_0 */
9608 { "", { VZERO } },
9611 /* VEX_W_0F7C_P_2 */
9612 { "vhaddpd", { XM, Vex, EXx } },
9615 /* VEX_W_0F7C_P_3 */
9616 { "vhaddps", { XM, Vex, EXx } },
9619 /* VEX_W_0F7D_P_2 */
9620 { "vhsubpd", { XM, Vex, EXx } },
9623 /* VEX_W_0F7D_P_3 */
9624 { "vhsubps", { XM, Vex, EXx } },
9627 /* VEX_W_0F7E_P_1 */
9628 { "vmovq", { XMScalar, EXqScalar } },
9631 /* VEX_W_0F7F_P_1 */
9632 { "vmovdqu", { EXxS, XM } },
9635 /* VEX_W_0F7F_P_2 */
9636 { "vmovdqa", { EXxS, XM } },
9639 /* VEX_W_0FAE_R_2_M_0 */
9640 { "vldmxcsr", { Md } },
9643 /* VEX_W_0FAE_R_3_M_0 */
9644 { "vstmxcsr", { Md } },
9647 /* VEX_W_0FC2_P_0 */
9648 { "vcmpps", { XM, Vex, EXx, VCMP } },
9651 /* VEX_W_0FC2_P_1 */
9652 { "vcmpss", { XMScalar, VexScalar, EXdScalar, VCMP } },
9655 /* VEX_W_0FC2_P_2 */
9656 { "vcmppd", { XM, Vex, EXx, VCMP } },
9659 /* VEX_W_0FC2_P_3 */
9660 { "vcmpsd", { XMScalar, VexScalar, EXqScalar, VCMP } },
9663 /* VEX_W_0FC4_P_2 */
9664 { "vpinsrw", { XM, Vex128, Edqw, Ib } },
9667 /* VEX_W_0FC5_P_2 */
9668 { "vpextrw", { Gdq, XS, Ib } },
9671 /* VEX_W_0FD0_P_2 */
9672 { "vaddsubpd", { XM, Vex, EXx } },
9675 /* VEX_W_0FD0_P_3 */
9676 { "vaddsubps", { XM, Vex, EXx } },
9679 /* VEX_W_0FD1_P_2 */
9680 { "vpsrlw", { XM, Vex128, EXx } },
9683 /* VEX_W_0FD2_P_2 */
9684 { "vpsrld", { XM, Vex128, EXx } },
9687 /* VEX_W_0FD3_P_2 */
9688 { "vpsrlq", { XM, Vex128, EXx } },
9691 /* VEX_W_0FD4_P_2 */
9692 { "vpaddq", { XM, Vex128, EXx } },
9695 /* VEX_W_0FD5_P_2 */
9696 { "vpmullw", { XM, Vex128, EXx } },
9699 /* VEX_W_0FD6_P_2 */
9700 { "vmovq", { EXqScalarS, XMScalar } },
9703 /* VEX_W_0FD7_P_2_M_1 */
9704 { "vpmovmskb", { Gdq, XS } },
9707 /* VEX_W_0FD8_P_2 */
9708 { "vpsubusb", { XM, Vex128, EXx } },
9711 /* VEX_W_0FD9_P_2 */
9712 { "vpsubusw", { XM, Vex128, EXx } },
9715 /* VEX_W_0FDA_P_2 */
9716 { "vpminub", { XM, Vex128, EXx } },
9719 /* VEX_W_0FDB_P_2 */
9720 { "vpand", { XM, Vex128, EXx } },
9723 /* VEX_W_0FDC_P_2 */
9724 { "vpaddusb", { XM, Vex128, EXx } },
9727 /* VEX_W_0FDD_P_2 */
9728 { "vpaddusw", { XM, Vex128, EXx } },
9731 /* VEX_W_0FDE_P_2 */
9732 { "vpmaxub", { XM, Vex128, EXx } },
9735 /* VEX_W_0FDF_P_2 */
9736 { "vpandn", { XM, Vex128, EXx } },
9739 /* VEX_W_0FE0_P_2 */
9740 { "vpavgb", { XM, Vex128, EXx } },
9743 /* VEX_W_0FE1_P_2 */
9744 { "vpsraw", { XM, Vex128, EXx } },
9747 /* VEX_W_0FE2_P_2 */
9748 { "vpsrad", { XM, Vex128, EXx } },
9751 /* VEX_W_0FE3_P_2 */
9752 { "vpavgw", { XM, Vex128, EXx } },
9755 /* VEX_W_0FE4_P_2 */
9756 { "vpmulhuw", { XM, Vex128, EXx } },
9759 /* VEX_W_0FE5_P_2 */
9760 { "vpmulhw", { XM, Vex128, EXx } },
9763 /* VEX_W_0FE6_P_1 */
9764 { "vcvtdq2pd", { XM, EXxmmq } },
9767 /* VEX_W_0FE6_P_2 */
9768 { "vcvttpd2dq%XY", { XMM, EXx } },
9771 /* VEX_W_0FE6_P_3 */
9772 { "vcvtpd2dq%XY", { XMM, EXx } },
9775 /* VEX_W_0FE7_P_2_M_0 */
9776 { "vmovntdq", { Mx, XM } },
9779 /* VEX_W_0FE8_P_2 */
9780 { "vpsubsb", { XM, Vex128, EXx } },
9783 /* VEX_W_0FE9_P_2 */
9784 { "vpsubsw", { XM, Vex128, EXx } },
9787 /* VEX_W_0FEA_P_2 */
9788 { "vpminsw", { XM, Vex128, EXx } },
9791 /* VEX_W_0FEB_P_2 */
9792 { "vpor", { XM, Vex128, EXx } },
9795 /* VEX_W_0FEC_P_2 */
9796 { "vpaddsb", { XM, Vex128, EXx } },
9799 /* VEX_W_0FED_P_2 */
9800 { "vpaddsw", { XM, Vex128, EXx } },
9803 /* VEX_W_0FEE_P_2 */
9804 { "vpmaxsw", { XM, Vex128, EXx } },
9807 /* VEX_W_0FEF_P_2 */
9808 { "vpxor", { XM, Vex128, EXx } },
9811 /* VEX_W_0FF0_P_3_M_0 */
9812 { "vlddqu", { XM, M } },
9815 /* VEX_W_0FF1_P_2 */
9816 { "vpsllw", { XM, Vex128, EXx } },
9819 /* VEX_W_0FF2_P_2 */
9820 { "vpslld", { XM, Vex128, EXx } },
9823 /* VEX_W_0FF3_P_2 */
9824 { "vpsllq", { XM, Vex128, EXx } },
9827 /* VEX_W_0FF4_P_2 */
9828 { "vpmuludq", { XM, Vex128, EXx } },
9831 /* VEX_W_0FF5_P_2 */
9832 { "vpmaddwd", { XM, Vex128, EXx } },
9835 /* VEX_W_0FF6_P_2 */
9836 { "vpsadbw", { XM, Vex128, EXx } },
9839 /* VEX_W_0FF7_P_2 */
9840 { "vmaskmovdqu", { XM, XS } },
9843 /* VEX_W_0FF8_P_2 */
9844 { "vpsubb", { XM, Vex128, EXx } },
9847 /* VEX_W_0FF9_P_2 */
9848 { "vpsubw", { XM, Vex128, EXx } },
9851 /* VEX_W_0FFA_P_2 */
9852 { "vpsubd", { XM, Vex128, EXx } },
9855 /* VEX_W_0FFB_P_2 */
9856 { "vpsubq", { XM, Vex128, EXx } },
9859 /* VEX_W_0FFC_P_2 */
9860 { "vpaddb", { XM, Vex128, EXx } },
9863 /* VEX_W_0FFD_P_2 */
9864 { "vpaddw", { XM, Vex128, EXx } },
9867 /* VEX_W_0FFE_P_2 */
9868 { "vpaddd", { XM, Vex128, EXx } },
9871 /* VEX_W_0F3800_P_2 */
9872 { "vpshufb", { XM, Vex128, EXx } },
9875 /* VEX_W_0F3801_P_2 */
9876 { "vphaddw", { XM, Vex128, EXx } },
9879 /* VEX_W_0F3802_P_2 */
9880 { "vphaddd", { XM, Vex128, EXx } },
9883 /* VEX_W_0F3803_P_2 */
9884 { "vphaddsw", { XM, Vex128, EXx } },
9887 /* VEX_W_0F3804_P_2 */
9888 { "vpmaddubsw", { XM, Vex128, EXx } },
9891 /* VEX_W_0F3805_P_2 */
9892 { "vphsubw", { XM, Vex128, EXx } },
9895 /* VEX_W_0F3806_P_2 */
9896 { "vphsubd", { XM, Vex128, EXx } },
9899 /* VEX_W_0F3807_P_2 */
9900 { "vphsubsw", { XM, Vex128, EXx } },
9903 /* VEX_W_0F3808_P_2 */
9904 { "vpsignb", { XM, Vex128, EXx } },
9907 /* VEX_W_0F3809_P_2 */
9908 { "vpsignw", { XM, Vex128, EXx } },
9911 /* VEX_W_0F380A_P_2 */
9912 { "vpsignd", { XM, Vex128, EXx } },
9915 /* VEX_W_0F380B_P_2 */
9916 { "vpmulhrsw", { XM, Vex128, EXx } },
9919 /* VEX_W_0F380C_P_2 */
9920 { "vpermilps", { XM, Vex, EXx } },
9923 /* VEX_W_0F380D_P_2 */
9924 { "vpermilpd", { XM, Vex, EXx } },
9927 /* VEX_W_0F380E_P_2 */
9928 { "vtestps", { XM, EXx } },
9931 /* VEX_W_0F380F_P_2 */
9932 { "vtestpd", { XM, EXx } },
9935 /* VEX_W_0F3817_P_2 */
9936 { "vptest", { XM, EXx } },
9939 /* VEX_W_0F3818_P_2_M_0 */
9940 { "vbroadcastss", { XM, Md } },
9943 /* VEX_W_0F3819_P_2_M_0 */
9944 { "vbroadcastsd", { XM, Mq } },
9947 /* VEX_W_0F381A_P_2_M_0 */
9948 { "vbroadcastf128", { XM, Mxmm } },
9951 /* VEX_W_0F381C_P_2 */
9952 { "vpabsb", { XM, EXx } },
9955 /* VEX_W_0F381D_P_2 */
9956 { "vpabsw", { XM, EXx } },
9959 /* VEX_W_0F381E_P_2 */
9960 { "vpabsd", { XM, EXx } },
9963 /* VEX_W_0F3820_P_2 */
9964 { "vpmovsxbw", { XM, EXq } },
9967 /* VEX_W_0F3821_P_2 */
9968 { "vpmovsxbd", { XM, EXd } },
9971 /* VEX_W_0F3822_P_2 */
9972 { "vpmovsxbq", { XM, EXw } },
9975 /* VEX_W_0F3823_P_2 */
9976 { "vpmovsxwd", { XM, EXq } },
9979 /* VEX_W_0F3824_P_2 */
9980 { "vpmovsxwq", { XM, EXd } },
9983 /* VEX_W_0F3825_P_2 */
9984 { "vpmovsxdq", { XM, EXq } },
9987 /* VEX_W_0F3828_P_2 */
9988 { "vpmuldq", { XM, Vex128, EXx } },
9991 /* VEX_W_0F3829_P_2 */
9992 { "vpcmpeqq", { XM, Vex128, EXx } },
9995 /* VEX_W_0F382A_P_2_M_0 */
9996 { "vmovntdqa", { XM, Mx } },
9999 /* VEX_W_0F382B_P_2 */
10000 { "vpackusdw", { XM, Vex128, EXx } },
10003 /* VEX_W_0F382C_P_2_M_0 */
10004 { "vmaskmovps", { XM, Vex, Mx } },
10007 /* VEX_W_0F382D_P_2_M_0 */
10008 { "vmaskmovpd", { XM, Vex, Mx } },
10011 /* VEX_W_0F382E_P_2_M_0 */
10012 { "vmaskmovps", { Mx, Vex, XM } },
10015 /* VEX_W_0F382F_P_2_M_0 */
10016 { "vmaskmovpd", { Mx, Vex, XM } },
10019 /* VEX_W_0F3830_P_2 */
10020 { "vpmovzxbw", { XM, EXq } },
10023 /* VEX_W_0F3831_P_2 */
10024 { "vpmovzxbd", { XM, EXd } },
10027 /* VEX_W_0F3832_P_2 */
10028 { "vpmovzxbq", { XM, EXw } },
10031 /* VEX_W_0F3833_P_2 */
10032 { "vpmovzxwd", { XM, EXq } },
10035 /* VEX_W_0F3834_P_2 */
10036 { "vpmovzxwq", { XM, EXd } },
10039 /* VEX_W_0F3835_P_2 */
10040 { "vpmovzxdq", { XM, EXq } },
10043 /* VEX_W_0F3837_P_2 */
10044 { "vpcmpgtq", { XM, Vex128, EXx } },
10047 /* VEX_W_0F3838_P_2 */
10048 { "vpminsb", { XM, Vex128, EXx } },
10051 /* VEX_W_0F3839_P_2 */
10052 { "vpminsd", { XM, Vex128, EXx } },
10055 /* VEX_W_0F383A_P_2 */
10056 { "vpminuw", { XM, Vex128, EXx } },
10059 /* VEX_W_0F383B_P_2 */
10060 { "vpminud", { XM, Vex128, EXx } },
10063 /* VEX_W_0F383C_P_2 */
10064 { "vpmaxsb", { XM, Vex128, EXx } },
10067 /* VEX_W_0F383D_P_2 */
10068 { "vpmaxsd", { XM, Vex128, EXx } },
10071 /* VEX_W_0F383E_P_2 */
10072 { "vpmaxuw", { XM, Vex128, EXx } },
10075 /* VEX_W_0F383F_P_2 */
10076 { "vpmaxud", { XM, Vex128, EXx } },
10079 /* VEX_W_0F3840_P_2 */
10080 { "vpmulld", { XM, Vex128, EXx } },
10083 /* VEX_W_0F3841_P_2 */
10084 { "vphminposuw", { XM, EXx } },
10087 /* VEX_W_0F38DB_P_2 */
10088 { "vaesimc", { XM, EXx } },
10091 /* VEX_W_0F38DC_P_2 */
10092 { "vaesenc", { XM, Vex128, EXx } },
10095 /* VEX_W_0F38DD_P_2 */
10096 { "vaesenclast", { XM, Vex128, EXx } },
10099 /* VEX_W_0F38DE_P_2 */
10100 { "vaesdec", { XM, Vex128, EXx } },
10103 /* VEX_W_0F38DF_P_2 */
10104 { "vaesdeclast", { XM, Vex128, EXx } },
10107 /* VEX_W_0F3A04_P_2 */
10108 { "vpermilps", { XM, EXx, Ib } },
10111 /* VEX_W_0F3A05_P_2 */
10112 { "vpermilpd", { XM, EXx, Ib } },
10115 /* VEX_W_0F3A06_P_2 */
10116 { "vperm2f128", { XM, Vex256, EXx, Ib } },
10119 /* VEX_W_0F3A08_P_2 */
10120 { "vroundps", { XM, EXx, Ib } },
10123 /* VEX_W_0F3A09_P_2 */
10124 { "vroundpd", { XM, EXx, Ib } },
10127 /* VEX_W_0F3A0A_P_2 */
10128 { "vroundss", { XMScalar, VexScalar, EXdScalar, Ib } },
10131 /* VEX_W_0F3A0B_P_2 */
10132 { "vroundsd", { XMScalar, VexScalar, EXqScalar, Ib } },
10135 /* VEX_W_0F3A0C_P_2 */
10136 { "vblendps", { XM, Vex, EXx, Ib } },
10139 /* VEX_W_0F3A0D_P_2 */
10140 { "vblendpd", { XM, Vex, EXx, Ib } },
10143 /* VEX_W_0F3A0E_P_2 */
10144 { "vpblendw", { XM, Vex128, EXx, Ib } },
10147 /* VEX_W_0F3A0F_P_2 */
10148 { "vpalignr", { XM, Vex128, EXx, Ib } },
10151 /* VEX_W_0F3A14_P_2 */
10152 { "vpextrb", { Edqb, XM, Ib } },
10155 /* VEX_W_0F3A15_P_2 */
10156 { "vpextrw", { Edqw, XM, Ib } },
10159 /* VEX_W_0F3A18_P_2 */
10160 { "vinsertf128", { XM, Vex256, EXxmm, Ib } },
10163 /* VEX_W_0F3A19_P_2 */
10164 { "vextractf128", { EXxmm, XM, Ib } },
10167 /* VEX_W_0F3A20_P_2 */
10168 { "vpinsrb", { XM, Vex128, Edqb, Ib } },
10171 /* VEX_W_0F3A21_P_2 */
10172 { "vinsertps", { XM, Vex128, EXd, Ib } },
10175 /* VEX_W_0F3A40_P_2 */
10176 { "vdpps", { XM, Vex, EXx, Ib } },
10179 /* VEX_W_0F3A41_P_2 */
10180 { "vdppd", { XM, Vex128, EXx, Ib } },
10183 /* VEX_W_0F3A42_P_2 */
10184 { "vmpsadbw", { XM, Vex128, EXx, Ib } },
10187 /* VEX_W_0F3A44_P_2 */
10188 { "vpclmulqdq", { XM, Vex128, EXx, PCLMUL } },
10191 /* VEX_W_0F3A48_P_2 */
10192 { "vpermil2ps", { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW } },
10193 { "vpermil2ps", { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW } },
10196 /* VEX_W_0F3A49_P_2 */
10197 { "vpermil2pd", { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW } },
10198 { "vpermil2pd", { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW } },
10201 /* VEX_W_0F3A4A_P_2 */
10202 { "vblendvps", { XM, Vex, EXx, XMVexI4 } },
10205 /* VEX_W_0F3A4B_P_2 */
10206 { "vblendvpd", { XM, Vex, EXx, XMVexI4 } },
10209 /* VEX_W_0F3A4C_P_2 */
10210 { "vpblendvb", { XM, Vex128, EXx, XMVexI4 } },
10213 /* VEX_W_0F3A60_P_2 */
10214 { "vpcmpestrm", { XM, EXx, Ib } },
10217 /* VEX_W_0F3A61_P_2 */
10218 { "vpcmpestri", { XM, EXx, Ib } },
10221 /* VEX_W_0F3A62_P_2 */
10222 { "vpcmpistrm", { XM, EXx, Ib } },
10225 /* VEX_W_0F3A63_P_2 */
10226 { "vpcmpistri", { XM, EXx, Ib } },
10229 /* VEX_W_0F3ADF_P_2 */
10230 { "vaeskeygenassist", { XM, EXx, Ib } },
10234 static const struct dis386 mod_table[][2] = {
10236 /* MOD_8D */
10237 { "leaS", { Gv, M } },
10240 /* MOD_0F01_REG_0 */
10241 { X86_64_TABLE (X86_64_0F01_REG_0) },
10242 { RM_TABLE (RM_0F01_REG_0) },
10245 /* MOD_0F01_REG_1 */
10246 { X86_64_TABLE (X86_64_0F01_REG_1) },
10247 { RM_TABLE (RM_0F01_REG_1) },
10250 /* MOD_0F01_REG_2 */
10251 { X86_64_TABLE (X86_64_0F01_REG_2) },
10252 { RM_TABLE (RM_0F01_REG_2) },
10255 /* MOD_0F01_REG_3 */
10256 { X86_64_TABLE (X86_64_0F01_REG_3) },
10257 { RM_TABLE (RM_0F01_REG_3) },
10260 /* MOD_0F01_REG_7 */
10261 { "invlpg", { Mb } },
10262 { RM_TABLE (RM_0F01_REG_7) },
10265 /* MOD_0F12_PREFIX_0 */
10266 { "movlps", { XM, EXq } },
10267 { "movhlps", { XM, EXq } },
10270 /* MOD_0F13 */
10271 { "movlpX", { EXq, XM } },
10274 /* MOD_0F16_PREFIX_0 */
10275 { "movhps", { XM, EXq } },
10276 { "movlhps", { XM, EXq } },
10279 /* MOD_0F17 */
10280 { "movhpX", { EXq, XM } },
10283 /* MOD_0F18_REG_0 */
10284 { "prefetchnta", { Mb } },
10287 /* MOD_0F18_REG_1 */
10288 { "prefetcht0", { Mb } },
10291 /* MOD_0F18_REG_2 */
10292 { "prefetcht1", { Mb } },
10295 /* MOD_0F18_REG_3 */
10296 { "prefetcht2", { Mb } },
10299 /* MOD_0F20 */
10300 { Bad_Opcode },
10301 { "movZ", { Rm, Cm } },
10304 /* MOD_0F21 */
10305 { Bad_Opcode },
10306 { "movZ", { Rm, Dm } },
10309 /* MOD_0F22 */
10310 { Bad_Opcode },
10311 { "movZ", { Cm, Rm } },
10314 /* MOD_0F23 */
10315 { Bad_Opcode },
10316 { "movZ", { Dm, Rm } },
10319 /* MOD_0F24 */
10320 { Bad_Opcode },
10321 { "movL", { Rd, Td } },
10324 /* MOD_0F26 */
10325 { Bad_Opcode },
10326 { "movL", { Td, Rd } },
10329 /* MOD_0F2B_PREFIX_0 */
10330 {"movntps", { Mx, XM } },
10333 /* MOD_0F2B_PREFIX_1 */
10334 {"movntss", { Md, XM } },
10337 /* MOD_0F2B_PREFIX_2 */
10338 {"movntpd", { Mx, XM } },
10341 /* MOD_0F2B_PREFIX_3 */
10342 {"movntsd", { Mq, XM } },
10345 /* MOD_0F51 */
10346 { Bad_Opcode },
10347 { "movmskpX", { Gdq, XS } },
10350 /* MOD_0F71_REG_2 */
10351 { Bad_Opcode },
10352 { "psrlw", { MS, Ib } },
10355 /* MOD_0F71_REG_4 */
10356 { Bad_Opcode },
10357 { "psraw", { MS, Ib } },
10360 /* MOD_0F71_REG_6 */
10361 { Bad_Opcode },
10362 { "psllw", { MS, Ib } },
10365 /* MOD_0F72_REG_2 */
10366 { Bad_Opcode },
10367 { "psrld", { MS, Ib } },
10370 /* MOD_0F72_REG_4 */
10371 { Bad_Opcode },
10372 { "psrad", { MS, Ib } },
10375 /* MOD_0F72_REG_6 */
10376 { Bad_Opcode },
10377 { "pslld", { MS, Ib } },
10380 /* MOD_0F73_REG_2 */
10381 { Bad_Opcode },
10382 { "psrlq", { MS, Ib } },
10385 /* MOD_0F73_REG_3 */
10386 { Bad_Opcode },
10387 { PREFIX_TABLE (PREFIX_0F73_REG_3) },
10390 /* MOD_0F73_REG_6 */
10391 { Bad_Opcode },
10392 { "psllq", { MS, Ib } },
10395 /* MOD_0F73_REG_7 */
10396 { Bad_Opcode },
10397 { PREFIX_TABLE (PREFIX_0F73_REG_7) },
10400 /* MOD_0FAE_REG_0 */
10401 { "fxsave", { FXSAVE } },
10402 { PREFIX_TABLE (PREFIX_0FAE_REG_0) },
10405 /* MOD_0FAE_REG_1 */
10406 { "fxrstor", { FXSAVE } },
10407 { PREFIX_TABLE (PREFIX_0FAE_REG_1) },
10410 /* MOD_0FAE_REG_2 */
10411 { "ldmxcsr", { Md } },
10412 { PREFIX_TABLE (PREFIX_0FAE_REG_2) },
10415 /* MOD_0FAE_REG_3 */
10416 { "stmxcsr", { Md } },
10417 { PREFIX_TABLE (PREFIX_0FAE_REG_3) },
10420 /* MOD_0FAE_REG_4 */
10421 { "xsave", { FXSAVE } },
10424 /* MOD_0FAE_REG_5 */
10425 { "xrstor", { FXSAVE } },
10426 { RM_TABLE (RM_0FAE_REG_5) },
10429 /* MOD_0FAE_REG_6 */
10430 { "xsaveopt", { FXSAVE } },
10431 { RM_TABLE (RM_0FAE_REG_6) },
10434 /* MOD_0FAE_REG_7 */
10435 { "clflush", { Mb } },
10436 { RM_TABLE (RM_0FAE_REG_7) },
10439 /* MOD_0FB2 */
10440 { "lssS", { Gv, Mp } },
10443 /* MOD_0FB4 */
10444 { "lfsS", { Gv, Mp } },
10447 /* MOD_0FB5 */
10448 { "lgsS", { Gv, Mp } },
10451 /* MOD_0FC7_REG_6 */
10452 { PREFIX_TABLE (PREFIX_0FC7_REG_6) },
10453 { "rdrand", { Ev } },
10456 /* MOD_0FC7_REG_7 */
10457 { "vmptrst", { Mq } },
10460 /* MOD_0FD7 */
10461 { Bad_Opcode },
10462 { "pmovmskb", { Gdq, MS } },
10465 /* MOD_0FE7_PREFIX_2 */
10466 { "movntdq", { Mx, XM } },
10469 /* MOD_0FF0_PREFIX_3 */
10470 { "lddqu", { XM, M } },
10473 /* MOD_0F382A_PREFIX_2 */
10474 { "movntdqa", { XM, Mx } },
10477 /* MOD_62_32BIT */
10478 { "bound{S|}", { Gv, Ma } },
10481 /* MOD_C4_32BIT */
10482 { "lesS", { Gv, Mp } },
10483 { VEX_C4_TABLE (VEX_0F) },
10486 /* MOD_C5_32BIT */
10487 { "ldsS", { Gv, Mp } },
10488 { VEX_C5_TABLE (VEX_0F) },
10491 /* MOD_VEX_0F12_PREFIX_0 */
10492 { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_0) },
10493 { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_1) },
10496 /* MOD_VEX_0F13 */
10497 { VEX_LEN_TABLE (VEX_LEN_0F13_M_0) },
10500 /* MOD_VEX_0F16_PREFIX_0 */
10501 { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_0) },
10502 { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_1) },
10505 /* MOD_VEX_0F17 */
10506 { VEX_LEN_TABLE (VEX_LEN_0F17_M_0) },
10509 /* MOD_VEX_0F2B */
10510 { VEX_W_TABLE (VEX_W_0F2B_M_0) },
10513 /* MOD_VEX_0F50 */
10514 { Bad_Opcode },
10515 { VEX_W_TABLE (VEX_W_0F50_M_0) },
10518 /* MOD_VEX_0F71_REG_2 */
10519 { Bad_Opcode },
10520 { PREFIX_TABLE (PREFIX_VEX_0F71_REG_2) },
10523 /* MOD_VEX_0F71_REG_4 */
10524 { Bad_Opcode },
10525 { PREFIX_TABLE (PREFIX_VEX_0F71_REG_4) },
10528 /* MOD_VEX_0F71_REG_6 */
10529 { Bad_Opcode },
10530 { PREFIX_TABLE (PREFIX_VEX_0F71_REG_6) },
10533 /* MOD_VEX_0F72_REG_2 */
10534 { Bad_Opcode },
10535 { PREFIX_TABLE (PREFIX_VEX_0F72_REG_2) },
10538 /* MOD_VEX_0F72_REG_4 */
10539 { Bad_Opcode },
10540 { PREFIX_TABLE (PREFIX_VEX_0F72_REG_4) },
10543 /* MOD_VEX_0F72_REG_6 */
10544 { Bad_Opcode },
10545 { PREFIX_TABLE (PREFIX_VEX_0F72_REG_6) },
10548 /* MOD_VEX_0F73_REG_2 */
10549 { Bad_Opcode },
10550 { PREFIX_TABLE (PREFIX_VEX_0F73_REG_2) },
10553 /* MOD_VEX_0F73_REG_3 */
10554 { Bad_Opcode },
10555 { PREFIX_TABLE (PREFIX_VEX_0F73_REG_3) },
10558 /* MOD_VEX_0F73_REG_6 */
10559 { Bad_Opcode },
10560 { PREFIX_TABLE (PREFIX_VEX_0F73_REG_6) },
10563 /* MOD_VEX_0F73_REG_7 */
10564 { Bad_Opcode },
10565 { PREFIX_TABLE (PREFIX_VEX_0F73_REG_7) },
10568 /* MOD_VEX_0FAE_REG_2 */
10569 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_2_M_0) },
10572 /* MOD_VEX_0FAE_REG_3 */
10573 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_3_M_0) },
10576 /* MOD_VEX_0FD7_PREFIX_2 */
10577 { Bad_Opcode },
10578 { VEX_LEN_TABLE (VEX_LEN_0FD7_P_2_M_1) },
10581 /* MOD_VEX_0FE7_PREFIX_2 */
10582 { VEX_W_TABLE (VEX_W_0FE7_P_2_M_0) },
10585 /* MOD_VEX_0FF0_PREFIX_3 */
10586 { VEX_W_TABLE (VEX_W_0FF0_P_3_M_0) },
10589 /* MOD_VEX_0F3818_PREFIX_2 */
10590 { VEX_W_TABLE (VEX_W_0F3818_P_2_M_0) },
10593 /* MOD_VEX_0F3819_PREFIX_2 */
10594 { VEX_LEN_TABLE (VEX_LEN_0F3819_P_2_M_0) },
10597 /* MOD_VEX_0F381A_PREFIX_2 */
10598 { VEX_LEN_TABLE (VEX_LEN_0F381A_P_2_M_0) },
10601 /* MOD_VEX_0F382A_PREFIX_2 */
10602 { VEX_LEN_TABLE (VEX_LEN_0F382A_P_2_M_0) },
10605 /* MOD_VEX_0F382C_PREFIX_2 */
10606 { VEX_W_TABLE (VEX_W_0F382C_P_2_M_0) },
10609 /* MOD_VEX_0F382D_PREFIX_2 */
10610 { VEX_W_TABLE (VEX_W_0F382D_P_2_M_0) },
10613 /* MOD_VEX_0F382E_PREFIX_2 */
10614 { VEX_W_TABLE (VEX_W_0F382E_P_2_M_0) },
10617 /* MOD_VEX_0F382F_PREFIX_2 */
10618 { VEX_W_TABLE (VEX_W_0F382F_P_2_M_0) },
10622 static const struct dis386 rm_table[][8] = {
10624 /* RM_0F01_REG_0 */
10625 { Bad_Opcode },
10626 { "vmcall", { Skip_MODRM } },
10627 { "vmlaunch", { Skip_MODRM } },
10628 { "vmresume", { Skip_MODRM } },
10629 { "vmxoff", { Skip_MODRM } },
10632 /* RM_0F01_REG_1 */
10633 { "monitor", { { OP_Monitor, 0 } } },
10634 { "mwait", { { OP_Mwait, 0 } } },
10637 /* RM_0F01_REG_2 */
10638 { "xgetbv", { Skip_MODRM } },
10639 { "xsetbv", { Skip_MODRM } },
10642 /* RM_0F01_REG_3 */
10643 { "vmrun", { Skip_MODRM } },
10644 { "vmmcall", { Skip_MODRM } },
10645 { "vmload", { Skip_MODRM } },
10646 { "vmsave", { Skip_MODRM } },
10647 { "stgi", { Skip_MODRM } },
10648 { "clgi", { Skip_MODRM } },
10649 { "skinit", { Skip_MODRM } },
10650 { "invlpga", { Skip_MODRM } },
10653 /* RM_0F01_REG_7 */
10654 { "swapgs", { Skip_MODRM } },
10655 { "rdtscp", { Skip_MODRM } },
10658 /* RM_0FAE_REG_5 */
10659 { "lfence", { Skip_MODRM } },
10662 /* RM_0FAE_REG_6 */
10663 { "mfence", { Skip_MODRM } },
10666 /* RM_0FAE_REG_7 */
10667 { "sfence", { Skip_MODRM } },
10671 #define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
10673 /* We use the high bit to indicate different name for the same
10674 prefix. */
10675 #define ADDR16_PREFIX (0x67 | 0x100)
10676 #define ADDR32_PREFIX (0x67 | 0x200)
10677 #define DATA16_PREFIX (0x66 | 0x100)
10678 #define DATA32_PREFIX (0x66 | 0x200)
10679 #define REP_PREFIX (0xf3 | 0x100)
10681 static int
10682 ckprefix (void)
10684 int newrex, i, length;
10685 rex = 0;
10686 rex_ignored = 0;
10687 prefixes = 0;
10688 used_prefixes = 0;
10689 rex_used = 0;
10690 last_lock_prefix = -1;
10691 last_repz_prefix = -1;
10692 last_repnz_prefix = -1;
10693 last_data_prefix = -1;
10694 last_addr_prefix = -1;
10695 last_rex_prefix = -1;
10696 last_seg_prefix = -1;
10697 for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
10698 all_prefixes[i] = 0;
10699 i = 0;
10700 length = 0;
10701 /* The maximum instruction length is 15bytes. */
10702 while (length < MAX_CODE_LENGTH - 1)
10704 FETCH_DATA (the_info, codep + 1);
10705 newrex = 0;
10706 switch (*codep)
10708 /* REX prefixes family. */
10709 case 0x40:
10710 case 0x41:
10711 case 0x42:
10712 case 0x43:
10713 case 0x44:
10714 case 0x45:
10715 case 0x46:
10716 case 0x47:
10717 case 0x48:
10718 case 0x49:
10719 case 0x4a:
10720 case 0x4b:
10721 case 0x4c:
10722 case 0x4d:
10723 case 0x4e:
10724 case 0x4f:
10725 if (address_mode == mode_64bit)
10726 newrex = *codep;
10727 else
10728 return 1;
10729 last_rex_prefix = i;
10730 break;
10731 case 0xf3:
10732 prefixes |= PREFIX_REPZ;
10733 last_repz_prefix = i;
10734 break;
10735 case 0xf2:
10736 prefixes |= PREFIX_REPNZ;
10737 last_repnz_prefix = i;
10738 break;
10739 case 0xf0:
10740 prefixes |= PREFIX_LOCK;
10741 last_lock_prefix = i;
10742 break;
10743 case 0x2e:
10744 prefixes |= PREFIX_CS;
10745 last_seg_prefix = i;
10746 break;
10747 case 0x36:
10748 prefixes |= PREFIX_SS;
10749 last_seg_prefix = i;
10750 break;
10751 case 0x3e:
10752 prefixes |= PREFIX_DS;
10753 last_seg_prefix = i;
10754 break;
10755 case 0x26:
10756 prefixes |= PREFIX_ES;
10757 last_seg_prefix = i;
10758 break;
10759 case 0x64:
10760 prefixes |= PREFIX_FS;
10761 last_seg_prefix = i;
10762 break;
10763 case 0x65:
10764 prefixes |= PREFIX_GS;
10765 last_seg_prefix = i;
10766 break;
10767 case 0x66:
10768 prefixes |= PREFIX_DATA;
10769 last_data_prefix = i;
10770 break;
10771 case 0x67:
10772 prefixes |= PREFIX_ADDR;
10773 last_addr_prefix = i;
10774 break;
10775 case FWAIT_OPCODE:
10776 /* fwait is really an instruction. If there are prefixes
10777 before the fwait, they belong to the fwait, *not* to the
10778 following instruction. */
10779 if (prefixes || rex)
10781 prefixes |= PREFIX_FWAIT;
10782 codep++;
10783 return 1;
10785 prefixes = PREFIX_FWAIT;
10786 break;
10787 default:
10788 return 1;
10790 /* Rex is ignored when followed by another prefix. */
10791 if (rex)
10793 rex_used = rex;
10794 return 1;
10796 if (*codep != FWAIT_OPCODE)
10797 all_prefixes[i++] = *codep;
10798 rex = newrex;
10799 codep++;
10800 length++;
10802 return 0;
10805 static int
10806 seg_prefix (int pref)
10808 switch (pref)
10810 case 0x2e:
10811 return PREFIX_CS;
10812 case 0x36:
10813 return PREFIX_SS;
10814 case 0x3e:
10815 return PREFIX_DS;
10816 case 0x26:
10817 return PREFIX_ES;
10818 case 0x64:
10819 return PREFIX_FS;
10820 case 0x65:
10821 return PREFIX_GS;
10822 default:
10823 return 0;
10827 /* Return the name of the prefix byte PREF, or NULL if PREF is not a
10828 prefix byte. */
10830 static const char *
10831 prefix_name (int pref, int sizeflag)
10833 static const char *rexes [16] =
10835 "rex", /* 0x40 */
10836 "rex.B", /* 0x41 */
10837 "rex.X", /* 0x42 */
10838 "rex.XB", /* 0x43 */
10839 "rex.R", /* 0x44 */
10840 "rex.RB", /* 0x45 */
10841 "rex.RX", /* 0x46 */
10842 "rex.RXB", /* 0x47 */
10843 "rex.W", /* 0x48 */
10844 "rex.WB", /* 0x49 */
10845 "rex.WX", /* 0x4a */
10846 "rex.WXB", /* 0x4b */
10847 "rex.WR", /* 0x4c */
10848 "rex.WRB", /* 0x4d */
10849 "rex.WRX", /* 0x4e */
10850 "rex.WRXB", /* 0x4f */
10853 switch (pref)
10855 /* REX prefixes family. */
10856 case 0x40:
10857 case 0x41:
10858 case 0x42:
10859 case 0x43:
10860 case 0x44:
10861 case 0x45:
10862 case 0x46:
10863 case 0x47:
10864 case 0x48:
10865 case 0x49:
10866 case 0x4a:
10867 case 0x4b:
10868 case 0x4c:
10869 case 0x4d:
10870 case 0x4e:
10871 case 0x4f:
10872 return rexes [pref - 0x40];
10873 case 0xf3:
10874 return "repz";
10875 case 0xf2:
10876 return "repnz";
10877 case 0xf0:
10878 return "lock";
10879 case 0x2e:
10880 return "cs";
10881 case 0x36:
10882 return "ss";
10883 case 0x3e:
10884 return "ds";
10885 case 0x26:
10886 return "es";
10887 case 0x64:
10888 return "fs";
10889 case 0x65:
10890 return "gs";
10891 case 0x66:
10892 return (sizeflag & DFLAG) ? "data16" : "data32";
10893 case 0x67:
10894 if (address_mode == mode_64bit)
10895 return (sizeflag & AFLAG) ? "addr32" : "addr64";
10896 else
10897 return (sizeflag & AFLAG) ? "addr16" : "addr32";
10898 case FWAIT_OPCODE:
10899 return "fwait";
10900 case ADDR16_PREFIX:
10901 return "addr16";
10902 case ADDR32_PREFIX:
10903 return "addr32";
10904 case DATA16_PREFIX:
10905 return "data16";
10906 case DATA32_PREFIX:
10907 return "data32";
10908 case REP_PREFIX:
10909 return "rep";
10910 default:
10911 return NULL;
10915 static char op_out[MAX_OPERANDS][100];
10916 static int op_ad, op_index[MAX_OPERANDS];
10917 static int two_source_ops;
10918 static bfd_vma op_address[MAX_OPERANDS];
10919 static bfd_vma op_riprel[MAX_OPERANDS];
10920 static bfd_vma start_pc;
10923 * On the 386's of 1988, the maximum length of an instruction is 15 bytes.
10924 * (see topic "Redundant prefixes" in the "Differences from 8086"
10925 * section of the "Virtual 8086 Mode" chapter.)
10926 * 'pc' should be the address of this instruction, it will
10927 * be used to print the target address if this is a relative jump or call
10928 * The function returns the length of this instruction in bytes.
10931 static char intel_syntax;
10932 static char intel_mnemonic = !SYSV386_COMPAT;
10933 static char open_char;
10934 static char close_char;
10935 static char separator_char;
10936 static char scale_char;
10938 /* Here for backwards compatibility. When gdb stops using
10939 print_insn_i386_att and print_insn_i386_intel these functions can
10940 disappear, and print_insn_i386 be merged into print_insn. */
10942 print_insn_i386_att (bfd_vma pc, disassemble_info *info)
10944 intel_syntax = 0;
10946 return print_insn (pc, info);
10950 print_insn_i386_intel (bfd_vma pc, disassemble_info *info)
10952 intel_syntax = 1;
10954 return print_insn (pc, info);
10958 print_insn_i386 (bfd_vma pc, disassemble_info *info)
10960 intel_syntax = -1;
10962 return print_insn (pc, info);
10965 void
10966 print_i386_disassembler_options (FILE *stream)
10968 fprintf (stream, _("\n\
10969 The following i386/x86-64 specific disassembler options are supported for use\n\
10970 with the -M switch (multiple options should be separated by commas):\n"));
10972 fprintf (stream, _(" x86-64 Disassemble in 64bit mode\n"));
10973 fprintf (stream, _(" i386 Disassemble in 32bit mode\n"));
10974 fprintf (stream, _(" i8086 Disassemble in 16bit mode\n"));
10975 fprintf (stream, _(" att Display instruction in AT&T syntax\n"));
10976 fprintf (stream, _(" intel Display instruction in Intel syntax\n"));
10977 fprintf (stream, _(" att-mnemonic\n"
10978 " Display instruction in AT&T mnemonic\n"));
10979 fprintf (stream, _(" intel-mnemonic\n"
10980 " Display instruction in Intel mnemonic\n"));
10981 fprintf (stream, _(" addr64 Assume 64bit address size\n"));
10982 fprintf (stream, _(" addr32 Assume 32bit address size\n"));
10983 fprintf (stream, _(" addr16 Assume 16bit address size\n"));
10984 fprintf (stream, _(" data32 Assume 32bit data size\n"));
10985 fprintf (stream, _(" data16 Assume 16bit data size\n"));
10986 fprintf (stream, _(" suffix Always display instruction suffix in AT&T syntax\n"));
10989 /* Bad opcode. */
10990 static const struct dis386 bad_opcode = { "(bad)", { XX } };
10992 /* Get a pointer to struct dis386 with a valid name. */
10994 static const struct dis386 *
10995 get_valid_dis386 (const struct dis386 *dp, disassemble_info *info)
10997 int vindex, vex_table_index;
10999 if (dp->name != NULL)
11000 return dp;
11002 switch (dp->op[0].bytemode)
11004 case USE_REG_TABLE:
11005 dp = &reg_table[dp->op[1].bytemode][modrm.reg];
11006 break;
11008 case USE_MOD_TABLE:
11009 vindex = modrm.mod == 0x3 ? 1 : 0;
11010 dp = &mod_table[dp->op[1].bytemode][vindex];
11011 break;
11013 case USE_RM_TABLE:
11014 dp = &rm_table[dp->op[1].bytemode][modrm.rm];
11015 break;
11017 case USE_PREFIX_TABLE:
11018 if (need_vex)
11020 /* The prefix in VEX is implicit. */
11021 switch (vex.prefix)
11023 case 0:
11024 vindex = 0;
11025 break;
11026 case REPE_PREFIX_OPCODE:
11027 vindex = 1;
11028 break;
11029 case DATA_PREFIX_OPCODE:
11030 vindex = 2;
11031 break;
11032 case REPNE_PREFIX_OPCODE:
11033 vindex = 3;
11034 break;
11035 default:
11036 abort ();
11037 break;
11040 else
11042 vindex = 0;
11043 used_prefixes |= (prefixes & PREFIX_REPZ);
11044 if (prefixes & PREFIX_REPZ)
11046 vindex = 1;
11047 all_prefixes[last_repz_prefix] = 0;
11049 else
11051 /* We should check PREFIX_REPNZ and PREFIX_REPZ before
11052 PREFIX_DATA. */
11053 used_prefixes |= (prefixes & PREFIX_REPNZ);
11054 if (prefixes & PREFIX_REPNZ)
11056 vindex = 3;
11057 all_prefixes[last_repnz_prefix] = 0;
11059 else
11061 used_prefixes |= (prefixes & PREFIX_DATA);
11062 if (prefixes & PREFIX_DATA)
11064 vindex = 2;
11065 all_prefixes[last_data_prefix] = 0;
11070 dp = &prefix_table[dp->op[1].bytemode][vindex];
11071 break;
11073 case USE_X86_64_TABLE:
11074 vindex = address_mode == mode_64bit ? 1 : 0;
11075 dp = &x86_64_table[dp->op[1].bytemode][vindex];
11076 break;
11078 case USE_3BYTE_TABLE:
11079 FETCH_DATA (info, codep + 2);
11080 vindex = *codep++;
11081 dp = &three_byte_table[dp->op[1].bytemode][vindex];
11082 modrm.mod = (*codep >> 6) & 3;
11083 modrm.reg = (*codep >> 3) & 7;
11084 modrm.rm = *codep & 7;
11085 break;
11087 case USE_VEX_LEN_TABLE:
11088 if (!need_vex)
11089 abort ();
11091 switch (vex.length)
11093 case 128:
11094 vindex = 0;
11095 break;
11096 case 256:
11097 vindex = 1;
11098 break;
11099 default:
11100 abort ();
11101 break;
11104 dp = &vex_len_table[dp->op[1].bytemode][vindex];
11105 break;
11107 case USE_XOP_8F_TABLE:
11108 FETCH_DATA (info, codep + 3);
11109 /* All bits in the REX prefix are ignored. */
11110 rex_ignored = rex;
11111 rex = ~(*codep >> 5) & 0x7;
11113 /* VEX_TABLE_INDEX is the mmmmm part of the XOP byte 1 "RCB.mmmmm". */
11114 switch ((*codep & 0x1f))
11116 default:
11117 dp = &bad_opcode;
11118 return dp;
11119 case 0x8:
11120 vex_table_index = XOP_08;
11121 break;
11122 case 0x9:
11123 vex_table_index = XOP_09;
11124 break;
11125 case 0xa:
11126 vex_table_index = XOP_0A;
11127 break;
11129 codep++;
11130 vex.w = *codep & 0x80;
11131 if (vex.w && address_mode == mode_64bit)
11132 rex |= REX_W;
11134 vex.register_specifier = (~(*codep >> 3)) & 0xf;
11135 if (address_mode != mode_64bit
11136 && vex.register_specifier > 0x7)
11138 dp = &bad_opcode;
11139 return dp;
11142 vex.length = (*codep & 0x4) ? 256 : 128;
11143 switch ((*codep & 0x3))
11145 case 0:
11146 vex.prefix = 0;
11147 break;
11148 case 1:
11149 vex.prefix = DATA_PREFIX_OPCODE;
11150 break;
11151 case 2:
11152 vex.prefix = REPE_PREFIX_OPCODE;
11153 break;
11154 case 3:
11155 vex.prefix = REPNE_PREFIX_OPCODE;
11156 break;
11158 need_vex = 1;
11159 need_vex_reg = 1;
11160 codep++;
11161 vindex = *codep++;
11162 dp = &xop_table[vex_table_index][vindex];
11164 FETCH_DATA (info, codep + 1);
11165 modrm.mod = (*codep >> 6) & 3;
11166 modrm.reg = (*codep >> 3) & 7;
11167 modrm.rm = *codep & 7;
11168 break;
11170 case USE_VEX_C4_TABLE:
11171 FETCH_DATA (info, codep + 3);
11172 /* All bits in the REX prefix are ignored. */
11173 rex_ignored = rex;
11174 rex = ~(*codep >> 5) & 0x7;
11175 switch ((*codep & 0x1f))
11177 default:
11178 dp = &bad_opcode;
11179 return dp;
11180 case 0x1:
11181 vex_table_index = VEX_0F;
11182 break;
11183 case 0x2:
11184 vex_table_index = VEX_0F38;
11185 break;
11186 case 0x3:
11187 vex_table_index = VEX_0F3A;
11188 break;
11190 codep++;
11191 vex.w = *codep & 0x80;
11192 if (vex.w && address_mode == mode_64bit)
11193 rex |= REX_W;
11195 vex.register_specifier = (~(*codep >> 3)) & 0xf;
11196 if (address_mode != mode_64bit
11197 && vex.register_specifier > 0x7)
11199 dp = &bad_opcode;
11200 return dp;
11203 vex.length = (*codep & 0x4) ? 256 : 128;
11204 switch ((*codep & 0x3))
11206 case 0:
11207 vex.prefix = 0;
11208 break;
11209 case 1:
11210 vex.prefix = DATA_PREFIX_OPCODE;
11211 break;
11212 case 2:
11213 vex.prefix = REPE_PREFIX_OPCODE;
11214 break;
11215 case 3:
11216 vex.prefix = REPNE_PREFIX_OPCODE;
11217 break;
11219 need_vex = 1;
11220 need_vex_reg = 1;
11221 codep++;
11222 vindex = *codep++;
11223 dp = &vex_table[vex_table_index][vindex];
11224 /* There is no MODRM byte for VEX [82|77]. */
11225 if (vindex != 0x77 && vindex != 0x82)
11227 FETCH_DATA (info, codep + 1);
11228 modrm.mod = (*codep >> 6) & 3;
11229 modrm.reg = (*codep >> 3) & 7;
11230 modrm.rm = *codep & 7;
11232 break;
11234 case USE_VEX_C5_TABLE:
11235 FETCH_DATA (info, codep + 2);
11236 /* All bits in the REX prefix are ignored. */
11237 rex_ignored = rex;
11238 rex = (*codep & 0x80) ? 0 : REX_R;
11240 vex.register_specifier = (~(*codep >> 3)) & 0xf;
11241 if (address_mode != mode_64bit
11242 && vex.register_specifier > 0x7)
11244 dp = &bad_opcode;
11245 return dp;
11248 vex.w = 0;
11250 vex.length = (*codep & 0x4) ? 256 : 128;
11251 switch ((*codep & 0x3))
11253 case 0:
11254 vex.prefix = 0;
11255 break;
11256 case 1:
11257 vex.prefix = DATA_PREFIX_OPCODE;
11258 break;
11259 case 2:
11260 vex.prefix = REPE_PREFIX_OPCODE;
11261 break;
11262 case 3:
11263 vex.prefix = REPNE_PREFIX_OPCODE;
11264 break;
11266 need_vex = 1;
11267 need_vex_reg = 1;
11268 codep++;
11269 vindex = *codep++;
11270 dp = &vex_table[dp->op[1].bytemode][vindex];
11271 /* There is no MODRM byte for VEX [82|77]. */
11272 if (vindex != 0x77 && vindex != 0x82)
11274 FETCH_DATA (info, codep + 1);
11275 modrm.mod = (*codep >> 6) & 3;
11276 modrm.reg = (*codep >> 3) & 7;
11277 modrm.rm = *codep & 7;
11279 break;
11281 case USE_VEX_W_TABLE:
11282 if (!need_vex)
11283 abort ();
11285 dp = &vex_w_table[dp->op[1].bytemode][vex.w ? 1 : 0];
11286 break;
11288 case 0:
11289 dp = &bad_opcode;
11290 break;
11292 default:
11293 abort ();
11296 if (dp->name != NULL)
11297 return dp;
11298 else
11299 return get_valid_dis386 (dp, info);
11302 static void
11303 get_sib (disassemble_info *info)
11305 /* If modrm.mod == 3, operand must be register. */
11306 if (need_modrm
11307 && address_mode != mode_16bit
11308 && modrm.mod != 3
11309 && modrm.rm == 4)
11311 FETCH_DATA (info, codep + 2);
11312 sib.index = (codep [1] >> 3) & 7;
11313 sib.scale = (codep [1] >> 6) & 3;
11314 sib.base = codep [1] & 7;
11318 static int
11319 print_insn (bfd_vma pc, disassemble_info *info)
11321 const struct dis386 *dp;
11322 int i;
11323 char *op_txt[MAX_OPERANDS];
11324 int needcomma;
11325 int sizeflag;
11326 const char *p;
11327 struct dis_private priv;
11328 int prefix_length;
11329 int default_prefixes;
11331 if (info->mach == bfd_mach_x86_64_intel_syntax
11332 || info->mach == bfd_mach_x86_64
11333 || info->mach == bfd_mach_l1om
11334 || info->mach == bfd_mach_l1om_intel_syntax)
11335 address_mode = mode_64bit;
11336 else
11337 address_mode = mode_32bit;
11339 if (intel_syntax == (char) -1)
11340 intel_syntax = (info->mach == bfd_mach_i386_i386_intel_syntax
11341 || info->mach == bfd_mach_x86_64_intel_syntax
11342 || info->mach == bfd_mach_l1om_intel_syntax);
11344 if (info->mach == bfd_mach_i386_i386
11345 || info->mach == bfd_mach_x86_64
11346 || info->mach == bfd_mach_l1om
11347 || info->mach == bfd_mach_i386_i386_intel_syntax
11348 || info->mach == bfd_mach_x86_64_intel_syntax
11349 || info->mach == bfd_mach_l1om_intel_syntax)
11350 priv.orig_sizeflag = AFLAG | DFLAG;
11351 else if (info->mach == bfd_mach_i386_i8086)
11352 priv.orig_sizeflag = 0;
11353 else
11354 abort ();
11356 for (p = info->disassembler_options; p != NULL; )
11358 if (CONST_STRNEQ (p, "x86-64"))
11360 address_mode = mode_64bit;
11361 priv.orig_sizeflag = AFLAG | DFLAG;
11363 else if (CONST_STRNEQ (p, "i386"))
11365 address_mode = mode_32bit;
11366 priv.orig_sizeflag = AFLAG | DFLAG;
11368 else if (CONST_STRNEQ (p, "i8086"))
11370 address_mode = mode_16bit;
11371 priv.orig_sizeflag = 0;
11373 else if (CONST_STRNEQ (p, "intel"))
11375 intel_syntax = 1;
11376 if (CONST_STRNEQ (p + 5, "-mnemonic"))
11377 intel_mnemonic = 1;
11379 else if (CONST_STRNEQ (p, "att"))
11381 intel_syntax = 0;
11382 if (CONST_STRNEQ (p + 3, "-mnemonic"))
11383 intel_mnemonic = 0;
11385 else if (CONST_STRNEQ (p, "addr"))
11387 if (address_mode == mode_64bit)
11389 if (p[4] == '3' && p[5] == '2')
11390 priv.orig_sizeflag &= ~AFLAG;
11391 else if (p[4] == '6' && p[5] == '4')
11392 priv.orig_sizeflag |= AFLAG;
11394 else
11396 if (p[4] == '1' && p[5] == '6')
11397 priv.orig_sizeflag &= ~AFLAG;
11398 else if (p[4] == '3' && p[5] == '2')
11399 priv.orig_sizeflag |= AFLAG;
11402 else if (CONST_STRNEQ (p, "data"))
11404 if (p[4] == '1' && p[5] == '6')
11405 priv.orig_sizeflag &= ~DFLAG;
11406 else if (p[4] == '3' && p[5] == '2')
11407 priv.orig_sizeflag |= DFLAG;
11409 else if (CONST_STRNEQ (p, "suffix"))
11410 priv.orig_sizeflag |= SUFFIX_ALWAYS;
11412 p = strchr (p, ',');
11413 if (p != NULL)
11414 p++;
11417 if (intel_syntax)
11419 names64 = intel_names64;
11420 names32 = intel_names32;
11421 names16 = intel_names16;
11422 names8 = intel_names8;
11423 names8rex = intel_names8rex;
11424 names_seg = intel_names_seg;
11425 names_mm = intel_names_mm;
11426 names_xmm = intel_names_xmm;
11427 names_ymm = intel_names_ymm;
11428 index64 = intel_index64;
11429 index32 = intel_index32;
11430 index16 = intel_index16;
11431 open_char = '[';
11432 close_char = ']';
11433 separator_char = '+';
11434 scale_char = '*';
11436 else
11438 names64 = att_names64;
11439 names32 = att_names32;
11440 names16 = att_names16;
11441 names8 = att_names8;
11442 names8rex = att_names8rex;
11443 names_seg = att_names_seg;
11444 names_mm = att_names_mm;
11445 names_xmm = att_names_xmm;
11446 names_ymm = att_names_ymm;
11447 index64 = att_index64;
11448 index32 = att_index32;
11449 index16 = att_index16;
11450 open_char = '(';
11451 close_char = ')';
11452 separator_char = ',';
11453 scale_char = ',';
11456 /* The output looks better if we put 7 bytes on a line, since that
11457 puts most long word instructions on a single line. Use 8 bytes
11458 for Intel L1OM. */
11459 if (info->mach == bfd_mach_l1om
11460 || info->mach == bfd_mach_l1om_intel_syntax)
11461 info->bytes_per_line = 8;
11462 else
11463 info->bytes_per_line = 7;
11465 info->private_data = &priv;
11466 priv.max_fetched = priv.the_buffer;
11467 priv.insn_start = pc;
11469 obuf[0] = 0;
11470 for (i = 0; i < MAX_OPERANDS; ++i)
11472 op_out[i][0] = 0;
11473 op_index[i] = -1;
11476 the_info = info;
11477 start_pc = pc;
11478 start_codep = priv.the_buffer;
11479 codep = priv.the_buffer;
11481 if (setjmp (priv.bailout) != 0)
11483 const char *name;
11485 /* Getting here means we tried for data but didn't get it. That
11486 means we have an incomplete instruction of some sort. Just
11487 print the first byte as a prefix or a .byte pseudo-op. */
11488 if (codep > priv.the_buffer)
11490 name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
11491 if (name != NULL)
11492 (*info->fprintf_func) (info->stream, "%s", name);
11493 else
11495 /* Just print the first byte as a .byte instruction. */
11496 (*info->fprintf_func) (info->stream, ".byte 0x%x",
11497 (unsigned int) priv.the_buffer[0]);
11500 return 1;
11503 return -1;
11506 obufp = obuf;
11507 sizeflag = priv.orig_sizeflag;
11509 if (!ckprefix () || rex_used)
11511 /* Too many prefixes or unused REX prefixes. */
11512 for (i = 0;
11513 all_prefixes[i] && i < (int) ARRAY_SIZE (all_prefixes);
11514 i++)
11515 (*info->fprintf_func) (info->stream, "%s",
11516 prefix_name (all_prefixes[i], sizeflag));
11517 return 1;
11520 insn_codep = codep;
11522 FETCH_DATA (info, codep + 1);
11523 two_source_ops = (*codep == 0x62) || (*codep == 0xc8);
11525 if (((prefixes & PREFIX_FWAIT)
11526 && ((*codep < 0xd8) || (*codep > 0xdf))))
11528 (*info->fprintf_func) (info->stream, "fwait");
11529 return 1;
11532 if (*codep == 0x0f)
11534 unsigned char threebyte;
11535 FETCH_DATA (info, codep + 2);
11536 threebyte = *++codep;
11537 dp = &dis386_twobyte[threebyte];
11538 need_modrm = twobyte_has_modrm[*codep];
11539 codep++;
11541 else
11543 dp = &dis386[*codep];
11544 need_modrm = onebyte_has_modrm[*codep];
11545 codep++;
11548 if ((prefixes & PREFIX_REPZ))
11549 used_prefixes |= PREFIX_REPZ;
11550 if ((prefixes & PREFIX_REPNZ))
11551 used_prefixes |= PREFIX_REPNZ;
11552 if ((prefixes & PREFIX_LOCK))
11553 used_prefixes |= PREFIX_LOCK;
11555 default_prefixes = 0;
11556 if (prefixes & PREFIX_ADDR)
11558 sizeflag ^= AFLAG;
11559 if (dp->op[2].bytemode != loop_jcxz_mode || intel_syntax)
11561 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
11562 all_prefixes[last_addr_prefix] = ADDR32_PREFIX;
11563 else
11564 all_prefixes[last_addr_prefix] = ADDR16_PREFIX;
11565 default_prefixes |= PREFIX_ADDR;
11569 if ((prefixes & PREFIX_DATA))
11571 sizeflag ^= DFLAG;
11572 if (dp->op[2].bytemode == cond_jump_mode
11573 && dp->op[0].bytemode == v_mode
11574 && !intel_syntax)
11576 if (sizeflag & DFLAG)
11577 all_prefixes[last_data_prefix] = DATA32_PREFIX;
11578 else
11579 all_prefixes[last_data_prefix] = DATA16_PREFIX;
11580 default_prefixes |= PREFIX_DATA;
11582 else if (rex & REX_W)
11584 /* REX_W will override PREFIX_DATA. */
11585 default_prefixes |= PREFIX_DATA;
11589 if (need_modrm)
11591 FETCH_DATA (info, codep + 1);
11592 modrm.mod = (*codep >> 6) & 3;
11593 modrm.reg = (*codep >> 3) & 7;
11594 modrm.rm = *codep & 7;
11597 need_vex = 0;
11598 need_vex_reg = 0;
11599 vex_w_done = 0;
11601 if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE)
11603 get_sib (info);
11604 dofloat (sizeflag);
11606 else
11608 dp = get_valid_dis386 (dp, info);
11609 if (dp != NULL && putop (dp->name, sizeflag) == 0)
11611 get_sib (info);
11612 for (i = 0; i < MAX_OPERANDS; ++i)
11614 obufp = op_out[i];
11615 op_ad = MAX_OPERANDS - 1 - i;
11616 if (dp->op[i].rtn)
11617 (*dp->op[i].rtn) (dp->op[i].bytemode, sizeflag);
11622 /* See if any prefixes were not used. If so, print the first one
11623 separately. If we don't do this, we'll wind up printing an
11624 instruction stream which does not precisely correspond to the
11625 bytes we are disassembling. */
11626 if ((prefixes & ~(used_prefixes | default_prefixes)) != 0)
11628 for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
11629 if (all_prefixes[i])
11631 const char *name;
11632 name = prefix_name (all_prefixes[i], priv.orig_sizeflag);
11633 if (name == NULL)
11634 name = INTERNAL_DISASSEMBLER_ERROR;
11635 (*info->fprintf_func) (info->stream, "%s", name);
11636 return 1;
11640 /* Check if the REX prefix is used. */
11641 if (rex_ignored == 0 && (rex ^ rex_used) == 0)
11642 all_prefixes[last_rex_prefix] = 0;
11644 /* Check if the SEG prefix is used. */
11645 if ((prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS | PREFIX_ES
11646 | PREFIX_FS | PREFIX_GS)) != 0
11647 && (used_prefixes
11648 & seg_prefix (all_prefixes[last_seg_prefix])) != 0)
11649 all_prefixes[last_seg_prefix] = 0;
11651 /* Check if the ADDR prefix is used. */
11652 if ((prefixes & PREFIX_ADDR) != 0
11653 && (used_prefixes & PREFIX_ADDR) != 0)
11654 all_prefixes[last_addr_prefix] = 0;
11656 /* Check if the DATA prefix is used. */
11657 if ((prefixes & PREFIX_DATA) != 0
11658 && (used_prefixes & PREFIX_DATA) != 0)
11659 all_prefixes[last_data_prefix] = 0;
11661 prefix_length = 0;
11662 for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
11663 if (all_prefixes[i])
11665 const char *name;
11666 name = prefix_name (all_prefixes[i], sizeflag);
11667 if (name == NULL)
11668 abort ();
11669 prefix_length += strlen (name) + 1;
11670 (*info->fprintf_func) (info->stream, "%s ", name);
11673 /* Check maximum code length. */
11674 if ((codep - start_codep) > MAX_CODE_LENGTH)
11676 (*info->fprintf_func) (info->stream, "(bad)");
11677 return MAX_CODE_LENGTH;
11680 obufp = mnemonicendp;
11681 for (i = strlen (obuf) + prefix_length; i < 6; i++)
11682 oappend (" ");
11683 oappend (" ");
11684 (*info->fprintf_func) (info->stream, "%s", obuf);
11686 /* The enter and bound instructions are printed with operands in the same
11687 order as the intel book; everything else is printed in reverse order. */
11688 if (intel_syntax || two_source_ops)
11690 bfd_vma riprel;
11692 for (i = 0; i < MAX_OPERANDS; ++i)
11693 op_txt[i] = op_out[i];
11695 for (i = 0; i < (MAX_OPERANDS >> 1); ++i)
11697 op_ad = op_index[i];
11698 op_index[i] = op_index[MAX_OPERANDS - 1 - i];
11699 op_index[MAX_OPERANDS - 1 - i] = op_ad;
11700 riprel = op_riprel[i];
11701 op_riprel[i] = op_riprel [MAX_OPERANDS - 1 - i];
11702 op_riprel[MAX_OPERANDS - 1 - i] = riprel;
11705 else
11707 for (i = 0; i < MAX_OPERANDS; ++i)
11708 op_txt[MAX_OPERANDS - 1 - i] = op_out[i];
11711 needcomma = 0;
11712 for (i = 0; i < MAX_OPERANDS; ++i)
11713 if (*op_txt[i])
11715 if (needcomma)
11716 (*info->fprintf_func) (info->stream, ",");
11717 if (op_index[i] != -1 && !op_riprel[i])
11718 (*info->print_address_func) ((bfd_vma) op_address[op_index[i]], info);
11719 else
11720 (*info->fprintf_func) (info->stream, "%s", op_txt[i]);
11721 needcomma = 1;
11724 for (i = 0; i < MAX_OPERANDS; i++)
11725 if (op_index[i] != -1 && op_riprel[i])
11727 (*info->fprintf_func) (info->stream, " # ");
11728 (*info->print_address_func) ((bfd_vma) (start_pc + codep - start_codep
11729 + op_address[op_index[i]]), info);
11730 break;
11732 return codep - priv.the_buffer;
11735 static const char *float_mem[] = {
11736 /* d8 */
11737 "fadd{s|}",
11738 "fmul{s|}",
11739 "fcom{s|}",
11740 "fcomp{s|}",
11741 "fsub{s|}",
11742 "fsubr{s|}",
11743 "fdiv{s|}",
11744 "fdivr{s|}",
11745 /* d9 */
11746 "fld{s|}",
11747 "(bad)",
11748 "fst{s|}",
11749 "fstp{s|}",
11750 "fldenvIC",
11751 "fldcw",
11752 "fNstenvIC",
11753 "fNstcw",
11754 /* da */
11755 "fiadd{l|}",
11756 "fimul{l|}",
11757 "ficom{l|}",
11758 "ficomp{l|}",
11759 "fisub{l|}",
11760 "fisubr{l|}",
11761 "fidiv{l|}",
11762 "fidivr{l|}",
11763 /* db */
11764 "fild{l|}",
11765 "fisttp{l|}",
11766 "fist{l|}",
11767 "fistp{l|}",
11768 "(bad)",
11769 "fld{t||t|}",
11770 "(bad)",
11771 "fstp{t||t|}",
11772 /* dc */
11773 "fadd{l|}",
11774 "fmul{l|}",
11775 "fcom{l|}",
11776 "fcomp{l|}",
11777 "fsub{l|}",
11778 "fsubr{l|}",
11779 "fdiv{l|}",
11780 "fdivr{l|}",
11781 /* dd */
11782 "fld{l|}",
11783 "fisttp{ll|}",
11784 "fst{l||}",
11785 "fstp{l|}",
11786 "frstorIC",
11787 "(bad)",
11788 "fNsaveIC",
11789 "fNstsw",
11790 /* de */
11791 "fiadd",
11792 "fimul",
11793 "ficom",
11794 "ficomp",
11795 "fisub",
11796 "fisubr",
11797 "fidiv",
11798 "fidivr",
11799 /* df */
11800 "fild",
11801 "fisttp",
11802 "fist",
11803 "fistp",
11804 "fbld",
11805 "fild{ll|}",
11806 "fbstp",
11807 "fistp{ll|}",
11810 static const unsigned char float_mem_mode[] = {
11811 /* d8 */
11812 d_mode,
11813 d_mode,
11814 d_mode,
11815 d_mode,
11816 d_mode,
11817 d_mode,
11818 d_mode,
11819 d_mode,
11820 /* d9 */
11821 d_mode,
11823 d_mode,
11824 d_mode,
11826 w_mode,
11828 w_mode,
11829 /* da */
11830 d_mode,
11831 d_mode,
11832 d_mode,
11833 d_mode,
11834 d_mode,
11835 d_mode,
11836 d_mode,
11837 d_mode,
11838 /* db */
11839 d_mode,
11840 d_mode,
11841 d_mode,
11842 d_mode,
11844 t_mode,
11846 t_mode,
11847 /* dc */
11848 q_mode,
11849 q_mode,
11850 q_mode,
11851 q_mode,
11852 q_mode,
11853 q_mode,
11854 q_mode,
11855 q_mode,
11856 /* dd */
11857 q_mode,
11858 q_mode,
11859 q_mode,
11860 q_mode,
11864 w_mode,
11865 /* de */
11866 w_mode,
11867 w_mode,
11868 w_mode,
11869 w_mode,
11870 w_mode,
11871 w_mode,
11872 w_mode,
11873 w_mode,
11874 /* df */
11875 w_mode,
11876 w_mode,
11877 w_mode,
11878 w_mode,
11879 t_mode,
11880 q_mode,
11881 t_mode,
11882 q_mode
11885 #define ST { OP_ST, 0 }
11886 #define STi { OP_STi, 0 }
11888 #define FGRPd9_2 NULL, { { NULL, 0 } }
11889 #define FGRPd9_4 NULL, { { NULL, 1 } }
11890 #define FGRPd9_5 NULL, { { NULL, 2 } }
11891 #define FGRPd9_6 NULL, { { NULL, 3 } }
11892 #define FGRPd9_7 NULL, { { NULL, 4 } }
11893 #define FGRPda_5 NULL, { { NULL, 5 } }
11894 #define FGRPdb_4 NULL, { { NULL, 6 } }
11895 #define FGRPde_3 NULL, { { NULL, 7 } }
11896 #define FGRPdf_4 NULL, { { NULL, 8 } }
11898 static const struct dis386 float_reg[][8] = {
11899 /* d8 */
11901 { "fadd", { ST, STi } },
11902 { "fmul", { ST, STi } },
11903 { "fcom", { STi } },
11904 { "fcomp", { STi } },
11905 { "fsub", { ST, STi } },
11906 { "fsubr", { ST, STi } },
11907 { "fdiv", { ST, STi } },
11908 { "fdivr", { ST, STi } },
11910 /* d9 */
11912 { "fld", { STi } },
11913 { "fxch", { STi } },
11914 { FGRPd9_2 },
11915 { Bad_Opcode },
11916 { FGRPd9_4 },
11917 { FGRPd9_5 },
11918 { FGRPd9_6 },
11919 { FGRPd9_7 },
11921 /* da */
11923 { "fcmovb", { ST, STi } },
11924 { "fcmove", { ST, STi } },
11925 { "fcmovbe",{ ST, STi } },
11926 { "fcmovu", { ST, STi } },
11927 { Bad_Opcode },
11928 { FGRPda_5 },
11929 { Bad_Opcode },
11930 { Bad_Opcode },
11932 /* db */
11934 { "fcmovnb",{ ST, STi } },
11935 { "fcmovne",{ ST, STi } },
11936 { "fcmovnbe",{ ST, STi } },
11937 { "fcmovnu",{ ST, STi } },
11938 { FGRPdb_4 },
11939 { "fucomi", { ST, STi } },
11940 { "fcomi", { ST, STi } },
11941 { Bad_Opcode },
11943 /* dc */
11945 { "fadd", { STi, ST } },
11946 { "fmul", { STi, ST } },
11947 { Bad_Opcode },
11948 { Bad_Opcode },
11949 { "fsub!M", { STi, ST } },
11950 { "fsubM", { STi, ST } },
11951 { "fdiv!M", { STi, ST } },
11952 { "fdivM", { STi, ST } },
11954 /* dd */
11956 { "ffree", { STi } },
11957 { Bad_Opcode },
11958 { "fst", { STi } },
11959 { "fstp", { STi } },
11960 { "fucom", { STi } },
11961 { "fucomp", { STi } },
11962 { Bad_Opcode },
11963 { Bad_Opcode },
11965 /* de */
11967 { "faddp", { STi, ST } },
11968 { "fmulp", { STi, ST } },
11969 { Bad_Opcode },
11970 { FGRPde_3 },
11971 { "fsub!Mp", { STi, ST } },
11972 { "fsubMp", { STi, ST } },
11973 { "fdiv!Mp", { STi, ST } },
11974 { "fdivMp", { STi, ST } },
11976 /* df */
11978 { "ffreep", { STi } },
11979 { Bad_Opcode },
11980 { Bad_Opcode },
11981 { Bad_Opcode },
11982 { FGRPdf_4 },
11983 { "fucomip", { ST, STi } },
11984 { "fcomip", { ST, STi } },
11985 { Bad_Opcode },
11989 static char *fgrps[][8] = {
11990 /* d9_2 0 */
11992 "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
11995 /* d9_4 1 */
11997 "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
12000 /* d9_5 2 */
12002 "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
12005 /* d9_6 3 */
12007 "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
12010 /* d9_7 4 */
12012 "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
12015 /* da_5 5 */
12017 "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
12020 /* db_4 6 */
12022 "fNeni(8087 only)","fNdisi(8087 only)","fNclex","fNinit",
12023 "fNsetpm(287 only)","frstpm(287 only)","(bad)","(bad)",
12026 /* de_3 7 */
12028 "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
12031 /* df_4 8 */
12033 "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
12037 static void
12038 swap_operand (void)
12040 mnemonicendp[0] = '.';
12041 mnemonicendp[1] = 's';
12042 mnemonicendp += 2;
12045 static void
12046 OP_Skip_MODRM (int bytemode ATTRIBUTE_UNUSED,
12047 int sizeflag ATTRIBUTE_UNUSED)
12049 /* Skip mod/rm byte. */
12050 MODRM_CHECK;
12051 codep++;
12054 static void
12055 dofloat (int sizeflag)
12057 const struct dis386 *dp;
12058 unsigned char floatop;
12060 floatop = codep[-1];
12062 if (modrm.mod != 3)
12064 int fp_indx = (floatop - 0xd8) * 8 + modrm.reg;
12066 putop (float_mem[fp_indx], sizeflag);
12067 obufp = op_out[0];
12068 op_ad = 2;
12069 OP_E (float_mem_mode[fp_indx], sizeflag);
12070 return;
12072 /* Skip mod/rm byte. */
12073 MODRM_CHECK;
12074 codep++;
12076 dp = &float_reg[floatop - 0xd8][modrm.reg];
12077 if (dp->name == NULL)
12079 putop (fgrps[dp->op[0].bytemode][modrm.rm], sizeflag);
12081 /* Instruction fnstsw is only one with strange arg. */
12082 if (floatop == 0xdf && codep[-1] == 0xe0)
12083 strcpy (op_out[0], names16[0]);
12085 else
12087 putop (dp->name, sizeflag);
12089 obufp = op_out[0];
12090 op_ad = 2;
12091 if (dp->op[0].rtn)
12092 (*dp->op[0].rtn) (dp->op[0].bytemode, sizeflag);
12094 obufp = op_out[1];
12095 op_ad = 1;
12096 if (dp->op[1].rtn)
12097 (*dp->op[1].rtn) (dp->op[1].bytemode, sizeflag);
12101 static void
12102 OP_ST (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12104 oappend ("%st" + intel_syntax);
12107 static void
12108 OP_STi (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12110 sprintf (scratchbuf, "%%st(%d)", modrm.rm);
12111 oappend (scratchbuf + intel_syntax);
12114 /* Capital letters in template are macros. */
12115 static int
12116 putop (const char *in_template, int sizeflag)
12118 const char *p;
12119 int alt = 0;
12120 int cond = 1;
12121 unsigned int l = 0, len = 1;
12122 char last[4];
12124 #define SAVE_LAST(c) \
12125 if (l < len && l < sizeof (last)) \
12126 last[l++] = c; \
12127 else \
12128 abort ();
12130 for (p = in_template; *p; p++)
12132 switch (*p)
12134 default:
12135 *obufp++ = *p;
12136 break;
12137 case '%':
12138 len++;
12139 break;
12140 case '!':
12141 cond = 0;
12142 break;
12143 case '{':
12144 alt = 0;
12145 if (intel_syntax)
12147 while (*++p != '|')
12148 if (*p == '}' || *p == '\0')
12149 abort ();
12151 /* Fall through. */
12152 case 'I':
12153 alt = 1;
12154 continue;
12155 case '|':
12156 while (*++p != '}')
12158 if (*p == '\0')
12159 abort ();
12161 break;
12162 case '}':
12163 break;
12164 case 'A':
12165 if (intel_syntax)
12166 break;
12167 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
12168 *obufp++ = 'b';
12169 break;
12170 case 'B':
12171 if (l == 0 && len == 1)
12173 case_B:
12174 if (intel_syntax)
12175 break;
12176 if (sizeflag & SUFFIX_ALWAYS)
12177 *obufp++ = 'b';
12179 else
12181 if (l != 1
12182 || len != 2
12183 || last[0] != 'L')
12185 SAVE_LAST (*p);
12186 break;
12189 if (address_mode == mode_64bit
12190 && !(prefixes & PREFIX_ADDR))
12192 *obufp++ = 'a';
12193 *obufp++ = 'b';
12194 *obufp++ = 's';
12197 goto case_B;
12199 break;
12200 case 'C':
12201 if (intel_syntax && !alt)
12202 break;
12203 if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
12205 if (sizeflag & DFLAG)
12206 *obufp++ = intel_syntax ? 'd' : 'l';
12207 else
12208 *obufp++ = intel_syntax ? 'w' : 's';
12209 used_prefixes |= (prefixes & PREFIX_DATA);
12211 break;
12212 case 'D':
12213 if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
12214 break;
12215 USED_REX (REX_W);
12216 if (modrm.mod == 3)
12218 if (rex & REX_W)
12219 *obufp++ = 'q';
12220 else
12222 if (sizeflag & DFLAG)
12223 *obufp++ = intel_syntax ? 'd' : 'l';
12224 else
12225 *obufp++ = 'w';
12226 used_prefixes |= (prefixes & PREFIX_DATA);
12229 else
12230 *obufp++ = 'w';
12231 break;
12232 case 'E': /* For jcxz/jecxz */
12233 if (address_mode == mode_64bit)
12235 if (sizeflag & AFLAG)
12236 *obufp++ = 'r';
12237 else
12238 *obufp++ = 'e';
12240 else
12241 if (sizeflag & AFLAG)
12242 *obufp++ = 'e';
12243 used_prefixes |= (prefixes & PREFIX_ADDR);
12244 break;
12245 case 'F':
12246 if (intel_syntax)
12247 break;
12248 if ((prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS))
12250 if (sizeflag & AFLAG)
12251 *obufp++ = address_mode == mode_64bit ? 'q' : 'l';
12252 else
12253 *obufp++ = address_mode == mode_64bit ? 'l' : 'w';
12254 used_prefixes |= (prefixes & PREFIX_ADDR);
12256 break;
12257 case 'G':
12258 if (intel_syntax || (obufp[-1] != 's' && !(sizeflag & SUFFIX_ALWAYS)))
12259 break;
12260 if ((rex & REX_W) || (sizeflag & DFLAG))
12261 *obufp++ = 'l';
12262 else
12263 *obufp++ = 'w';
12264 if (!(rex & REX_W))
12265 used_prefixes |= (prefixes & PREFIX_DATA);
12266 break;
12267 case 'H':
12268 if (intel_syntax)
12269 break;
12270 if ((prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS
12271 || (prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS)
12273 used_prefixes |= prefixes & (PREFIX_CS | PREFIX_DS);
12274 *obufp++ = ',';
12275 *obufp++ = 'p';
12276 if (prefixes & PREFIX_DS)
12277 *obufp++ = 't';
12278 else
12279 *obufp++ = 'n';
12281 break;
12282 case 'J':
12283 if (intel_syntax)
12284 break;
12285 *obufp++ = 'l';
12286 break;
12287 case 'K':
12288 USED_REX (REX_W);
12289 if (rex & REX_W)
12290 *obufp++ = 'q';
12291 else
12292 *obufp++ = 'd';
12293 break;
12294 case 'Z':
12295 if (intel_syntax)
12296 break;
12297 if (address_mode == mode_64bit && (sizeflag & SUFFIX_ALWAYS))
12299 *obufp++ = 'q';
12300 break;
12302 /* Fall through. */
12303 goto case_L;
12304 case 'L':
12305 if (l != 0 || len != 1)
12307 SAVE_LAST (*p);
12308 break;
12310 case_L:
12311 if (intel_syntax)
12312 break;
12313 if (sizeflag & SUFFIX_ALWAYS)
12314 *obufp++ = 'l';
12315 break;
12316 case 'M':
12317 if (intel_mnemonic != cond)
12318 *obufp++ = 'r';
12319 break;
12320 case 'N':
12321 if ((prefixes & PREFIX_FWAIT) == 0)
12322 *obufp++ = 'n';
12323 else
12324 used_prefixes |= PREFIX_FWAIT;
12325 break;
12326 case 'O':
12327 USED_REX (REX_W);
12328 if (rex & REX_W)
12329 *obufp++ = 'o';
12330 else if (intel_syntax && (sizeflag & DFLAG))
12331 *obufp++ = 'q';
12332 else
12333 *obufp++ = 'd';
12334 if (!(rex & REX_W))
12335 used_prefixes |= (prefixes & PREFIX_DATA);
12336 break;
12337 case 'T':
12338 if (!intel_syntax
12339 && address_mode == mode_64bit
12340 && (sizeflag & DFLAG))
12342 *obufp++ = 'q';
12343 break;
12345 /* Fall through. */
12346 case 'P':
12347 if (intel_syntax)
12349 if ((rex & REX_W) == 0
12350 && (prefixes & PREFIX_DATA))
12352 if ((sizeflag & DFLAG) == 0)
12353 *obufp++ = 'w';
12354 used_prefixes |= (prefixes & PREFIX_DATA);
12356 break;
12358 if ((prefixes & PREFIX_DATA)
12359 || (rex & REX_W)
12360 || (sizeflag & SUFFIX_ALWAYS))
12362 USED_REX (REX_W);
12363 if (rex & REX_W)
12364 *obufp++ = 'q';
12365 else
12367 if (sizeflag & DFLAG)
12368 *obufp++ = 'l';
12369 else
12370 *obufp++ = 'w';
12371 used_prefixes |= (prefixes & PREFIX_DATA);
12374 break;
12375 case 'U':
12376 if (intel_syntax)
12377 break;
12378 if (address_mode == mode_64bit && (sizeflag & DFLAG))
12380 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
12381 *obufp++ = 'q';
12382 break;
12384 /* Fall through. */
12385 goto case_Q;
12386 case 'Q':
12387 if (l == 0 && len == 1)
12389 case_Q:
12390 if (intel_syntax && !alt)
12391 break;
12392 USED_REX (REX_W);
12393 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
12395 if (rex & REX_W)
12396 *obufp++ = 'q';
12397 else
12399 if (sizeflag & DFLAG)
12400 *obufp++ = intel_syntax ? 'd' : 'l';
12401 else
12402 *obufp++ = 'w';
12403 used_prefixes |= (prefixes & PREFIX_DATA);
12407 else
12409 if (l != 1 || len != 2 || last[0] != 'L')
12411 SAVE_LAST (*p);
12412 break;
12414 if (intel_syntax
12415 || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
12416 break;
12417 if ((rex & REX_W))
12419 USED_REX (REX_W);
12420 *obufp++ = 'q';
12422 else
12423 *obufp++ = 'l';
12425 break;
12426 case 'R':
12427 USED_REX (REX_W);
12428 if (rex & REX_W)
12429 *obufp++ = 'q';
12430 else if (sizeflag & DFLAG)
12432 if (intel_syntax)
12433 *obufp++ = 'd';
12434 else
12435 *obufp++ = 'l';
12437 else
12438 *obufp++ = 'w';
12439 if (intel_syntax && !p[1]
12440 && ((rex & REX_W) || (sizeflag & DFLAG)))
12441 *obufp++ = 'e';
12442 if (!(rex & REX_W))
12443 used_prefixes |= (prefixes & PREFIX_DATA);
12444 break;
12445 case 'V':
12446 if (l == 0 && len == 1)
12448 if (intel_syntax)
12449 break;
12450 if (address_mode == mode_64bit && (sizeflag & DFLAG))
12452 if (sizeflag & SUFFIX_ALWAYS)
12453 *obufp++ = 'q';
12454 break;
12457 else
12459 if (l != 1
12460 || len != 2
12461 || last[0] != 'L')
12463 SAVE_LAST (*p);
12464 break;
12467 if (rex & REX_W)
12469 *obufp++ = 'a';
12470 *obufp++ = 'b';
12471 *obufp++ = 's';
12474 /* Fall through. */
12475 goto case_S;
12476 case 'S':
12477 if (l == 0 && len == 1)
12479 case_S:
12480 if (intel_syntax)
12481 break;
12482 if (sizeflag & SUFFIX_ALWAYS)
12484 if (rex & REX_W)
12485 *obufp++ = 'q';
12486 else
12488 if (sizeflag & DFLAG)
12489 *obufp++ = 'l';
12490 else
12491 *obufp++ = 'w';
12492 used_prefixes |= (prefixes & PREFIX_DATA);
12496 else
12498 if (l != 1
12499 || len != 2
12500 || last[0] != 'L')
12502 SAVE_LAST (*p);
12503 break;
12506 if (address_mode == mode_64bit
12507 && !(prefixes & PREFIX_ADDR))
12509 *obufp++ = 'a';
12510 *obufp++ = 'b';
12511 *obufp++ = 's';
12514 goto case_S;
12516 break;
12517 case 'X':
12518 if (l != 0 || len != 1)
12520 SAVE_LAST (*p);
12521 break;
12523 if (need_vex && vex.prefix)
12525 if (vex.prefix == DATA_PREFIX_OPCODE)
12526 *obufp++ = 'd';
12527 else
12528 *obufp++ = 's';
12530 else
12532 if (prefixes & PREFIX_DATA)
12533 *obufp++ = 'd';
12534 else
12535 *obufp++ = 's';
12536 used_prefixes |= (prefixes & PREFIX_DATA);
12538 break;
12539 case 'Y':
12540 if (l == 0 && len == 1)
12542 if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
12543 break;
12544 if (rex & REX_W)
12546 USED_REX (REX_W);
12547 *obufp++ = 'q';
12549 break;
12551 else
12553 if (l != 1 || len != 2 || last[0] != 'X')
12555 SAVE_LAST (*p);
12556 break;
12558 if (!need_vex)
12559 abort ();
12560 if (intel_syntax
12561 || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
12562 break;
12563 switch (vex.length)
12565 case 128:
12566 *obufp++ = 'x';
12567 break;
12568 case 256:
12569 *obufp++ = 'y';
12570 break;
12571 default:
12572 abort ();
12575 break;
12576 case 'W':
12577 if (l == 0 && len == 1)
12579 /* operand size flag for cwtl, cbtw */
12580 USED_REX (REX_W);
12581 if (rex & REX_W)
12583 if (intel_syntax)
12584 *obufp++ = 'd';
12585 else
12586 *obufp++ = 'l';
12588 else if (sizeflag & DFLAG)
12589 *obufp++ = 'w';
12590 else
12591 *obufp++ = 'b';
12592 if (!(rex & REX_W))
12593 used_prefixes |= (prefixes & PREFIX_DATA);
12595 else
12597 if (l != 1 || len != 2 || last[0] != 'X')
12599 SAVE_LAST (*p);
12600 break;
12602 if (!need_vex)
12603 abort ();
12604 *obufp++ = vex.w ? 'd': 's';
12606 break;
12608 alt = 0;
12610 *obufp = 0;
12611 mnemonicendp = obufp;
12612 return 0;
12615 static void
12616 oappend (const char *s)
12618 obufp = stpcpy (obufp, s);
12621 static void
12622 append_seg (void)
12624 if (prefixes & PREFIX_CS)
12626 used_prefixes |= PREFIX_CS;
12627 oappend ("%cs:" + intel_syntax);
12629 if (prefixes & PREFIX_DS)
12631 used_prefixes |= PREFIX_DS;
12632 oappend ("%ds:" + intel_syntax);
12634 if (prefixes & PREFIX_SS)
12636 used_prefixes |= PREFIX_SS;
12637 oappend ("%ss:" + intel_syntax);
12639 if (prefixes & PREFIX_ES)
12641 used_prefixes |= PREFIX_ES;
12642 oappend ("%es:" + intel_syntax);
12644 if (prefixes & PREFIX_FS)
12646 used_prefixes |= PREFIX_FS;
12647 oappend ("%fs:" + intel_syntax);
12649 if (prefixes & PREFIX_GS)
12651 used_prefixes |= PREFIX_GS;
12652 oappend ("%gs:" + intel_syntax);
12656 static void
12657 OP_indirE (int bytemode, int sizeflag)
12659 if (!intel_syntax)
12660 oappend ("*");
12661 OP_E (bytemode, sizeflag);
12664 static void
12665 print_operand_value (char *buf, int hex, bfd_vma disp)
12667 if (address_mode == mode_64bit)
12669 if (hex)
12671 char tmp[30];
12672 int i;
12673 buf[0] = '0';
12674 buf[1] = 'x';
12675 sprintf_vma (tmp, disp);
12676 for (i = 0; tmp[i] == '0' && tmp[i + 1]; i++);
12677 strcpy (buf + 2, tmp + i);
12679 else
12681 bfd_signed_vma v = disp;
12682 char tmp[30];
12683 int i;
12684 if (v < 0)
12686 *(buf++) = '-';
12687 v = -disp;
12688 /* Check for possible overflow on 0x8000000000000000. */
12689 if (v < 0)
12691 strcpy (buf, "9223372036854775808");
12692 return;
12695 if (!v)
12697 strcpy (buf, "0");
12698 return;
12701 i = 0;
12702 tmp[29] = 0;
12703 while (v)
12705 tmp[28 - i] = (v % 10) + '0';
12706 v /= 10;
12707 i++;
12709 strcpy (buf, tmp + 29 - i);
12712 else
12714 if (hex)
12715 sprintf (buf, "0x%x", (unsigned int) disp);
12716 else
12717 sprintf (buf, "%d", (int) disp);
12721 /* Put DISP in BUF as signed hex number. */
12723 static void
12724 print_displacement (char *buf, bfd_vma disp)
12726 bfd_signed_vma val = disp;
12727 char tmp[30];
12728 int i, j = 0;
12730 if (val < 0)
12732 buf[j++] = '-';
12733 val = -disp;
12735 /* Check for possible overflow. */
12736 if (val < 0)
12738 switch (address_mode)
12740 case mode_64bit:
12741 strcpy (buf + j, "0x8000000000000000");
12742 break;
12743 case mode_32bit:
12744 strcpy (buf + j, "0x80000000");
12745 break;
12746 case mode_16bit:
12747 strcpy (buf + j, "0x8000");
12748 break;
12750 return;
12754 buf[j++] = '0';
12755 buf[j++] = 'x';
12757 sprintf_vma (tmp, (bfd_vma) val);
12758 for (i = 0; tmp[i] == '0'; i++)
12759 continue;
12760 if (tmp[i] == '\0')
12761 i--;
12762 strcpy (buf + j, tmp + i);
12765 static void
12766 intel_operand_size (int bytemode, int sizeflag)
12768 switch (bytemode)
12770 case b_mode:
12771 case b_swap_mode:
12772 case dqb_mode:
12773 oappend ("BYTE PTR ");
12774 break;
12775 case w_mode:
12776 case dqw_mode:
12777 oappend ("WORD PTR ");
12778 break;
12779 case stack_v_mode:
12780 if (address_mode == mode_64bit && (sizeflag & DFLAG))
12782 oappend ("QWORD PTR ");
12783 break;
12785 /* FALLTHRU */
12786 case v_mode:
12787 case v_swap_mode:
12788 case dq_mode:
12789 USED_REX (REX_W);
12790 if (rex & REX_W)
12791 oappend ("QWORD PTR ");
12792 else
12794 if ((sizeflag & DFLAG) || bytemode == dq_mode)
12795 oappend ("DWORD PTR ");
12796 else
12797 oappend ("WORD PTR ");
12798 used_prefixes |= (prefixes & PREFIX_DATA);
12800 break;
12801 case z_mode:
12802 if ((rex & REX_W) || (sizeflag & DFLAG))
12803 *obufp++ = 'D';
12804 oappend ("WORD PTR ");
12805 if (!(rex & REX_W))
12806 used_prefixes |= (prefixes & PREFIX_DATA);
12807 break;
12808 case a_mode:
12809 if (sizeflag & DFLAG)
12810 oappend ("QWORD PTR ");
12811 else
12812 oappend ("DWORD PTR ");
12813 used_prefixes |= (prefixes & PREFIX_DATA);
12814 break;
12815 case d_mode:
12816 case d_scalar_mode:
12817 case d_scalar_swap_mode:
12818 case d_swap_mode:
12819 case dqd_mode:
12820 oappend ("DWORD PTR ");
12821 break;
12822 case q_mode:
12823 case q_scalar_mode:
12824 case q_scalar_swap_mode:
12825 case q_swap_mode:
12826 oappend ("QWORD PTR ");
12827 break;
12828 case m_mode:
12829 if (address_mode == mode_64bit)
12830 oappend ("QWORD PTR ");
12831 else
12832 oappend ("DWORD PTR ");
12833 break;
12834 case f_mode:
12835 if (sizeflag & DFLAG)
12836 oappend ("FWORD PTR ");
12837 else
12838 oappend ("DWORD PTR ");
12839 used_prefixes |= (prefixes & PREFIX_DATA);
12840 break;
12841 case t_mode:
12842 oappend ("TBYTE PTR ");
12843 break;
12844 case x_mode:
12845 case x_swap_mode:
12846 if (need_vex)
12848 switch (vex.length)
12850 case 128:
12851 oappend ("XMMWORD PTR ");
12852 break;
12853 case 256:
12854 oappend ("YMMWORD PTR ");
12855 break;
12856 default:
12857 abort ();
12860 else
12861 oappend ("XMMWORD PTR ");
12862 break;
12863 case xmm_mode:
12864 oappend ("XMMWORD PTR ");
12865 break;
12866 case xmmq_mode:
12867 if (!need_vex)
12868 abort ();
12870 switch (vex.length)
12872 case 128:
12873 oappend ("QWORD PTR ");
12874 break;
12875 case 256:
12876 oappend ("XMMWORD PTR ");
12877 break;
12878 default:
12879 abort ();
12881 break;
12882 case ymmq_mode:
12883 if (!need_vex)
12884 abort ();
12886 switch (vex.length)
12888 case 128:
12889 oappend ("QWORD PTR ");
12890 break;
12891 case 256:
12892 oappend ("YMMWORD PTR ");
12893 break;
12894 default:
12895 abort ();
12897 break;
12898 case o_mode:
12899 oappend ("OWORD PTR ");
12900 break;
12901 case vex_w_dq_mode:
12902 case vex_scalar_w_dq_mode:
12903 if (!need_vex)
12904 abort ();
12906 if (vex.w)
12907 oappend ("QWORD PTR ");
12908 else
12909 oappend ("DWORD PTR ");
12910 break;
12911 default:
12912 break;
12916 static void
12917 OP_E_register (int bytemode, int sizeflag)
12919 int reg = modrm.rm;
12920 const char **names;
12922 USED_REX (REX_B);
12923 if ((rex & REX_B))
12924 reg += 8;
12926 if ((sizeflag & SUFFIX_ALWAYS)
12927 && (bytemode == b_swap_mode || bytemode == v_swap_mode))
12928 swap_operand ();
12930 switch (bytemode)
12932 case b_mode:
12933 case b_swap_mode:
12934 USED_REX (0);
12935 if (rex)
12936 names = names8rex;
12937 else
12938 names = names8;
12939 break;
12940 case w_mode:
12941 names = names16;
12942 break;
12943 case d_mode:
12944 names = names32;
12945 break;
12946 case q_mode:
12947 names = names64;
12948 break;
12949 case m_mode:
12950 names = address_mode == mode_64bit ? names64 : names32;
12951 break;
12952 case stack_v_mode:
12953 if (address_mode == mode_64bit && (sizeflag & DFLAG))
12955 names = names64;
12956 break;
12958 bytemode = v_mode;
12959 /* FALLTHRU */
12960 case v_mode:
12961 case v_swap_mode:
12962 case dq_mode:
12963 case dqb_mode:
12964 case dqd_mode:
12965 case dqw_mode:
12966 USED_REX (REX_W);
12967 if (rex & REX_W)
12968 names = names64;
12969 else
12971 if ((sizeflag & DFLAG)
12972 || (bytemode != v_mode
12973 && bytemode != v_swap_mode))
12974 names = names32;
12975 else
12976 names = names16;
12977 used_prefixes |= (prefixes & PREFIX_DATA);
12979 break;
12980 case 0:
12981 return;
12982 default:
12983 oappend (INTERNAL_DISASSEMBLER_ERROR);
12984 return;
12986 oappend (names[reg]);
12989 static void
12990 OP_E_memory (int bytemode, int sizeflag)
12992 bfd_vma disp = 0;
12993 int add = (rex & REX_B) ? 8 : 0;
12994 int riprel = 0;
12996 USED_REX (REX_B);
12997 if (intel_syntax)
12998 intel_operand_size (bytemode, sizeflag);
12999 append_seg ();
13001 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
13003 /* 32/64 bit address mode */
13004 int havedisp;
13005 int havesib;
13006 int havebase;
13007 int haveindex;
13008 int needindex;
13009 int base, rbase;
13010 int vindex = 0;
13011 int scale = 0;
13013 havesib = 0;
13014 havebase = 1;
13015 haveindex = 0;
13016 base = modrm.rm;
13018 if (base == 4)
13020 havesib = 1;
13021 vindex = sib.index;
13022 scale = sib.scale;
13023 base = sib.base;
13024 USED_REX (REX_X);
13025 if (rex & REX_X)
13026 vindex += 8;
13027 haveindex = vindex != 4;
13028 codep++;
13030 rbase = base + add;
13032 switch (modrm.mod)
13034 case 0:
13035 if (base == 5)
13037 havebase = 0;
13038 if (address_mode == mode_64bit && !havesib)
13039 riprel = 1;
13040 disp = get32s ();
13042 break;
13043 case 1:
13044 FETCH_DATA (the_info, codep + 1);
13045 disp = *codep++;
13046 if ((disp & 0x80) != 0)
13047 disp -= 0x100;
13048 break;
13049 case 2:
13050 disp = get32s ();
13051 break;
13054 /* In 32bit mode, we need index register to tell [offset] from
13055 [eiz*1 + offset]. */
13056 needindex = (havesib
13057 && !havebase
13058 && !haveindex
13059 && address_mode == mode_32bit);
13060 havedisp = (havebase
13061 || needindex
13062 || (havesib && (haveindex || scale != 0)));
13064 if (!intel_syntax)
13065 if (modrm.mod != 0 || base == 5)
13067 if (havedisp || riprel)
13068 print_displacement (scratchbuf, disp);
13069 else
13070 print_operand_value (scratchbuf, 1, disp);
13071 oappend (scratchbuf);
13072 if (riprel)
13074 set_op (disp, 1);
13075 oappend (sizeflag & AFLAG ? "(%rip)" : "(%eip)");
13079 if (havebase || haveindex || riprel)
13080 used_prefixes |= PREFIX_ADDR;
13082 if (havedisp || (intel_syntax && riprel))
13084 *obufp++ = open_char;
13085 if (intel_syntax && riprel)
13087 set_op (disp, 1);
13088 oappend (sizeflag & AFLAG ? "rip" : "eip");
13090 *obufp = '\0';
13091 if (havebase)
13092 oappend (address_mode == mode_64bit && (sizeflag & AFLAG)
13093 ? names64[rbase] : names32[rbase]);
13094 if (havesib)
13096 /* ESP/RSP won't allow index. If base isn't ESP/RSP,
13097 print index to tell base + index from base. */
13098 if (scale != 0
13099 || needindex
13100 || haveindex
13101 || (havebase && base != ESP_REG_NUM))
13103 if (!intel_syntax || havebase)
13105 *obufp++ = separator_char;
13106 *obufp = '\0';
13108 if (haveindex)
13109 oappend (address_mode == mode_64bit
13110 && (sizeflag & AFLAG)
13111 ? names64[vindex] : names32[vindex]);
13112 else
13113 oappend (address_mode == mode_64bit
13114 && (sizeflag & AFLAG)
13115 ? index64 : index32);
13117 *obufp++ = scale_char;
13118 *obufp = '\0';
13119 sprintf (scratchbuf, "%d", 1 << scale);
13120 oappend (scratchbuf);
13123 if (intel_syntax
13124 && (disp || modrm.mod != 0 || base == 5))
13126 if (!havedisp || (bfd_signed_vma) disp >= 0)
13128 *obufp++ = '+';
13129 *obufp = '\0';
13131 else if (modrm.mod != 1 && disp != -disp)
13133 *obufp++ = '-';
13134 *obufp = '\0';
13135 disp = - (bfd_signed_vma) disp;
13138 if (havedisp)
13139 print_displacement (scratchbuf, disp);
13140 else
13141 print_operand_value (scratchbuf, 1, disp);
13142 oappend (scratchbuf);
13145 *obufp++ = close_char;
13146 *obufp = '\0';
13148 else if (intel_syntax)
13150 if (modrm.mod != 0 || base == 5)
13152 if (prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
13153 | PREFIX_ES | PREFIX_FS | PREFIX_GS))
13155 else
13157 oappend (names_seg[ds_reg - es_reg]);
13158 oappend (":");
13160 print_operand_value (scratchbuf, 1, disp);
13161 oappend (scratchbuf);
13165 else
13167 /* 16 bit address mode */
13168 used_prefixes |= prefixes & PREFIX_ADDR;
13169 switch (modrm.mod)
13171 case 0:
13172 if (modrm.rm == 6)
13174 disp = get16 ();
13175 if ((disp & 0x8000) != 0)
13176 disp -= 0x10000;
13178 break;
13179 case 1:
13180 FETCH_DATA (the_info, codep + 1);
13181 disp = *codep++;
13182 if ((disp & 0x80) != 0)
13183 disp -= 0x100;
13184 break;
13185 case 2:
13186 disp = get16 ();
13187 if ((disp & 0x8000) != 0)
13188 disp -= 0x10000;
13189 break;
13192 if (!intel_syntax)
13193 if (modrm.mod != 0 || modrm.rm == 6)
13195 print_displacement (scratchbuf, disp);
13196 oappend (scratchbuf);
13199 if (modrm.mod != 0 || modrm.rm != 6)
13201 *obufp++ = open_char;
13202 *obufp = '\0';
13203 oappend (index16[modrm.rm]);
13204 if (intel_syntax
13205 && (disp || modrm.mod != 0 || modrm.rm == 6))
13207 if ((bfd_signed_vma) disp >= 0)
13209 *obufp++ = '+';
13210 *obufp = '\0';
13212 else if (modrm.mod != 1)
13214 *obufp++ = '-';
13215 *obufp = '\0';
13216 disp = - (bfd_signed_vma) disp;
13219 print_displacement (scratchbuf, disp);
13220 oappend (scratchbuf);
13223 *obufp++ = close_char;
13224 *obufp = '\0';
13226 else if (intel_syntax)
13228 if (prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
13229 | PREFIX_ES | PREFIX_FS | PREFIX_GS))
13231 else
13233 oappend (names_seg[ds_reg - es_reg]);
13234 oappend (":");
13236 print_operand_value (scratchbuf, 1, disp & 0xffff);
13237 oappend (scratchbuf);
13242 static void
13243 OP_E (int bytemode, int sizeflag)
13245 /* Skip mod/rm byte. */
13246 MODRM_CHECK;
13247 codep++;
13249 if (modrm.mod == 3)
13250 OP_E_register (bytemode, sizeflag);
13251 else
13252 OP_E_memory (bytemode, sizeflag);
13255 static void
13256 OP_G (int bytemode, int sizeflag)
13258 int add = 0;
13259 USED_REX (REX_R);
13260 if (rex & REX_R)
13261 add += 8;
13262 switch (bytemode)
13264 case b_mode:
13265 USED_REX (0);
13266 if (rex)
13267 oappend (names8rex[modrm.reg + add]);
13268 else
13269 oappend (names8[modrm.reg + add]);
13270 break;
13271 case w_mode:
13272 oappend (names16[modrm.reg + add]);
13273 break;
13274 case d_mode:
13275 oappend (names32[modrm.reg + add]);
13276 break;
13277 case q_mode:
13278 oappend (names64[modrm.reg + add]);
13279 break;
13280 case v_mode:
13281 case dq_mode:
13282 case dqb_mode:
13283 case dqd_mode:
13284 case dqw_mode:
13285 USED_REX (REX_W);
13286 if (rex & REX_W)
13287 oappend (names64[modrm.reg + add]);
13288 else
13290 if ((sizeflag & DFLAG) || bytemode != v_mode)
13291 oappend (names32[modrm.reg + add]);
13292 else
13293 oappend (names16[modrm.reg + add]);
13294 used_prefixes |= (prefixes & PREFIX_DATA);
13296 break;
13297 case m_mode:
13298 if (address_mode == mode_64bit)
13299 oappend (names64[modrm.reg + add]);
13300 else
13301 oappend (names32[modrm.reg + add]);
13302 break;
13303 default:
13304 oappend (INTERNAL_DISASSEMBLER_ERROR);
13305 break;
13309 static bfd_vma
13310 get64 (void)
13312 bfd_vma x;
13313 #ifdef BFD64
13314 unsigned int a;
13315 unsigned int b;
13317 FETCH_DATA (the_info, codep + 8);
13318 a = *codep++ & 0xff;
13319 a |= (*codep++ & 0xff) << 8;
13320 a |= (*codep++ & 0xff) << 16;
13321 a |= (*codep++ & 0xff) << 24;
13322 b = *codep++ & 0xff;
13323 b |= (*codep++ & 0xff) << 8;
13324 b |= (*codep++ & 0xff) << 16;
13325 b |= (*codep++ & 0xff) << 24;
13326 x = a + ((bfd_vma) b << 32);
13327 #else
13328 abort ();
13329 x = 0;
13330 #endif
13331 return x;
13334 static bfd_signed_vma
13335 get32 (void)
13337 bfd_signed_vma x = 0;
13339 FETCH_DATA (the_info, codep + 4);
13340 x = *codep++ & (bfd_signed_vma) 0xff;
13341 x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
13342 x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
13343 x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
13344 return x;
13347 static bfd_signed_vma
13348 get32s (void)
13350 bfd_signed_vma x = 0;
13352 FETCH_DATA (the_info, codep + 4);
13353 x = *codep++ & (bfd_signed_vma) 0xff;
13354 x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
13355 x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
13356 x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
13358 x = (x ^ ((bfd_signed_vma) 1 << 31)) - ((bfd_signed_vma) 1 << 31);
13360 return x;
13363 static int
13364 get16 (void)
13366 int x = 0;
13368 FETCH_DATA (the_info, codep + 2);
13369 x = *codep++ & 0xff;
13370 x |= (*codep++ & 0xff) << 8;
13371 return x;
13374 static void
13375 set_op (bfd_vma op, int riprel)
13377 op_index[op_ad] = op_ad;
13378 if (address_mode == mode_64bit)
13380 op_address[op_ad] = op;
13381 op_riprel[op_ad] = riprel;
13383 else
13385 /* Mask to get a 32-bit address. */
13386 op_address[op_ad] = op & 0xffffffff;
13387 op_riprel[op_ad] = riprel & 0xffffffff;
13391 static void
13392 OP_REG (int code, int sizeflag)
13394 const char *s;
13395 int add;
13396 USED_REX (REX_B);
13397 if (rex & REX_B)
13398 add = 8;
13399 else
13400 add = 0;
13402 switch (code)
13404 case ax_reg: case cx_reg: case dx_reg: case bx_reg:
13405 case sp_reg: case bp_reg: case si_reg: case di_reg:
13406 s = names16[code - ax_reg + add];
13407 break;
13408 case es_reg: case ss_reg: case cs_reg:
13409 case ds_reg: case fs_reg: case gs_reg:
13410 s = names_seg[code - es_reg + add];
13411 break;
13412 case al_reg: case ah_reg: case cl_reg: case ch_reg:
13413 case dl_reg: case dh_reg: case bl_reg: case bh_reg:
13414 USED_REX (0);
13415 if (rex)
13416 s = names8rex[code - al_reg + add];
13417 else
13418 s = names8[code - al_reg];
13419 break;
13420 case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
13421 case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
13422 if (address_mode == mode_64bit && (sizeflag & DFLAG))
13424 s = names64[code - rAX_reg + add];
13425 break;
13427 code += eAX_reg - rAX_reg;
13428 /* Fall through. */
13429 case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
13430 case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
13431 USED_REX (REX_W);
13432 if (rex & REX_W)
13433 s = names64[code - eAX_reg + add];
13434 else
13436 if (sizeflag & DFLAG)
13437 s = names32[code - eAX_reg + add];
13438 else
13439 s = names16[code - eAX_reg + add];
13440 used_prefixes |= (prefixes & PREFIX_DATA);
13442 break;
13443 default:
13444 s = INTERNAL_DISASSEMBLER_ERROR;
13445 break;
13447 oappend (s);
13450 static void
13451 OP_IMREG (int code, int sizeflag)
13453 const char *s;
13455 switch (code)
13457 case indir_dx_reg:
13458 if (intel_syntax)
13459 s = "dx";
13460 else
13461 s = "(%dx)";
13462 break;
13463 case ax_reg: case cx_reg: case dx_reg: case bx_reg:
13464 case sp_reg: case bp_reg: case si_reg: case di_reg:
13465 s = names16[code - ax_reg];
13466 break;
13467 case es_reg: case ss_reg: case cs_reg:
13468 case ds_reg: case fs_reg: case gs_reg:
13469 s = names_seg[code - es_reg];
13470 break;
13471 case al_reg: case ah_reg: case cl_reg: case ch_reg:
13472 case dl_reg: case dh_reg: case bl_reg: case bh_reg:
13473 USED_REX (0);
13474 if (rex)
13475 s = names8rex[code - al_reg];
13476 else
13477 s = names8[code - al_reg];
13478 break;
13479 case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
13480 case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
13481 USED_REX (REX_W);
13482 if (rex & REX_W)
13483 s = names64[code - eAX_reg];
13484 else
13486 if (sizeflag & DFLAG)
13487 s = names32[code - eAX_reg];
13488 else
13489 s = names16[code - eAX_reg];
13490 used_prefixes |= (prefixes & PREFIX_DATA);
13492 break;
13493 case z_mode_ax_reg:
13494 if ((rex & REX_W) || (sizeflag & DFLAG))
13495 s = *names32;
13496 else
13497 s = *names16;
13498 if (!(rex & REX_W))
13499 used_prefixes |= (prefixes & PREFIX_DATA);
13500 break;
13501 default:
13502 s = INTERNAL_DISASSEMBLER_ERROR;
13503 break;
13505 oappend (s);
13508 static void
13509 OP_I (int bytemode, int sizeflag)
13511 bfd_signed_vma op;
13512 bfd_signed_vma mask = -1;
13514 switch (bytemode)
13516 case b_mode:
13517 FETCH_DATA (the_info, codep + 1);
13518 op = *codep++;
13519 mask = 0xff;
13520 break;
13521 case q_mode:
13522 if (address_mode == mode_64bit)
13524 op = get32s ();
13525 break;
13527 /* Fall through. */
13528 case v_mode:
13529 USED_REX (REX_W);
13530 if (rex & REX_W)
13531 op = get32s ();
13532 else
13534 if (sizeflag & DFLAG)
13536 op = get32 ();
13537 mask = 0xffffffff;
13539 else
13541 op = get16 ();
13542 mask = 0xfffff;
13544 used_prefixes |= (prefixes & PREFIX_DATA);
13546 break;
13547 case w_mode:
13548 mask = 0xfffff;
13549 op = get16 ();
13550 break;
13551 case const_1_mode:
13552 if (intel_syntax)
13553 oappend ("1");
13554 return;
13555 default:
13556 oappend (INTERNAL_DISASSEMBLER_ERROR);
13557 return;
13560 op &= mask;
13561 scratchbuf[0] = '$';
13562 print_operand_value (scratchbuf + 1, 1, op);
13563 oappend (scratchbuf + intel_syntax);
13564 scratchbuf[0] = '\0';
13567 static void
13568 OP_I64 (int bytemode, int sizeflag)
13570 bfd_signed_vma op;
13571 bfd_signed_vma mask = -1;
13573 if (address_mode != mode_64bit)
13575 OP_I (bytemode, sizeflag);
13576 return;
13579 switch (bytemode)
13581 case b_mode:
13582 FETCH_DATA (the_info, codep + 1);
13583 op = *codep++;
13584 mask = 0xff;
13585 break;
13586 case v_mode:
13587 USED_REX (REX_W);
13588 if (rex & REX_W)
13589 op = get64 ();
13590 else
13592 if (sizeflag & DFLAG)
13594 op = get32 ();
13595 mask = 0xffffffff;
13597 else
13599 op = get16 ();
13600 mask = 0xfffff;
13602 used_prefixes |= (prefixes & PREFIX_DATA);
13604 break;
13605 case w_mode:
13606 mask = 0xfffff;
13607 op = get16 ();
13608 break;
13609 default:
13610 oappend (INTERNAL_DISASSEMBLER_ERROR);
13611 return;
13614 op &= mask;
13615 scratchbuf[0] = '$';
13616 print_operand_value (scratchbuf + 1, 1, op);
13617 oappend (scratchbuf + intel_syntax);
13618 scratchbuf[0] = '\0';
13621 static void
13622 OP_sI (int bytemode, int sizeflag)
13624 bfd_signed_vma op;
13626 switch (bytemode)
13628 case b_mode:
13629 FETCH_DATA (the_info, codep + 1);
13630 op = *codep++;
13631 if ((op & 0x80) != 0)
13632 op -= 0x100;
13633 break;
13634 case v_mode:
13635 if (sizeflag & DFLAG)
13636 op = get32s ();
13637 else
13638 op = get16 ();
13639 break;
13640 default:
13641 oappend (INTERNAL_DISASSEMBLER_ERROR);
13642 return;
13645 scratchbuf[0] = '$';
13646 print_operand_value (scratchbuf + 1, 1, op);
13647 oappend (scratchbuf + intel_syntax);
13650 static void
13651 OP_J (int bytemode, int sizeflag)
13653 bfd_vma disp;
13654 bfd_vma mask = -1;
13655 bfd_vma segment = 0;
13657 switch (bytemode)
13659 case b_mode:
13660 FETCH_DATA (the_info, codep + 1);
13661 disp = *codep++;
13662 if ((disp & 0x80) != 0)
13663 disp -= 0x100;
13664 break;
13665 case v_mode:
13666 USED_REX (REX_W);
13667 if ((sizeflag & DFLAG) || (rex & REX_W))
13668 disp = get32s ();
13669 else
13671 disp = get16 ();
13672 if ((disp & 0x8000) != 0)
13673 disp -= 0x10000;
13674 /* In 16bit mode, address is wrapped around at 64k within
13675 the same segment. Otherwise, a data16 prefix on a jump
13676 instruction means that the pc is masked to 16 bits after
13677 the displacement is added! */
13678 mask = 0xffff;
13679 if ((prefixes & PREFIX_DATA) == 0)
13680 segment = ((start_pc + codep - start_codep)
13681 & ~((bfd_vma) 0xffff));
13683 if (!(rex & REX_W))
13684 used_prefixes |= (prefixes & PREFIX_DATA);
13685 break;
13686 default:
13687 oappend (INTERNAL_DISASSEMBLER_ERROR);
13688 return;
13690 disp = ((start_pc + codep - start_codep + disp) & mask) | segment;
13691 set_op (disp, 0);
13692 print_operand_value (scratchbuf, 1, disp);
13693 oappend (scratchbuf);
13696 static void
13697 OP_SEG (int bytemode, int sizeflag)
13699 if (bytemode == w_mode)
13700 oappend (names_seg[modrm.reg]);
13701 else
13702 OP_E (modrm.mod == 3 ? bytemode : w_mode, sizeflag);
13705 static void
13706 OP_DIR (int dummy ATTRIBUTE_UNUSED, int sizeflag)
13708 int seg, offset;
13710 if (sizeflag & DFLAG)
13712 offset = get32 ();
13713 seg = get16 ();
13715 else
13717 offset = get16 ();
13718 seg = get16 ();
13720 used_prefixes |= (prefixes & PREFIX_DATA);
13721 if (intel_syntax)
13722 sprintf (scratchbuf, "0x%x:0x%x", seg, offset);
13723 else
13724 sprintf (scratchbuf, "$0x%x,$0x%x", seg, offset);
13725 oappend (scratchbuf);
13728 static void
13729 OP_OFF (int bytemode, int sizeflag)
13731 bfd_vma off;
13733 if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
13734 intel_operand_size (bytemode, sizeflag);
13735 append_seg ();
13737 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
13738 off = get32 ();
13739 else
13740 off = get16 ();
13742 if (intel_syntax)
13744 if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
13745 | PREFIX_ES | PREFIX_FS | PREFIX_GS)))
13747 oappend (names_seg[ds_reg - es_reg]);
13748 oappend (":");
13751 print_operand_value (scratchbuf, 1, off);
13752 oappend (scratchbuf);
13755 static void
13756 OP_OFF64 (int bytemode, int sizeflag)
13758 bfd_vma off;
13760 if (address_mode != mode_64bit
13761 || (prefixes & PREFIX_ADDR))
13763 OP_OFF (bytemode, sizeflag);
13764 return;
13767 if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
13768 intel_operand_size (bytemode, sizeflag);
13769 append_seg ();
13771 off = get64 ();
13773 if (intel_syntax)
13775 if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
13776 | PREFIX_ES | PREFIX_FS | PREFIX_GS)))
13778 oappend (names_seg[ds_reg - es_reg]);
13779 oappend (":");
13782 print_operand_value (scratchbuf, 1, off);
13783 oappend (scratchbuf);
13786 static void
13787 ptr_reg (int code, int sizeflag)
13789 const char *s;
13791 *obufp++ = open_char;
13792 used_prefixes |= (prefixes & PREFIX_ADDR);
13793 if (address_mode == mode_64bit)
13795 if (!(sizeflag & AFLAG))
13796 s = names32[code - eAX_reg];
13797 else
13798 s = names64[code - eAX_reg];
13800 else if (sizeflag & AFLAG)
13801 s = names32[code - eAX_reg];
13802 else
13803 s = names16[code - eAX_reg];
13804 oappend (s);
13805 *obufp++ = close_char;
13806 *obufp = 0;
13809 static void
13810 OP_ESreg (int code, int sizeflag)
13812 if (intel_syntax)
13814 switch (codep[-1])
13816 case 0x6d: /* insw/insl */
13817 intel_operand_size (z_mode, sizeflag);
13818 break;
13819 case 0xa5: /* movsw/movsl/movsq */
13820 case 0xa7: /* cmpsw/cmpsl/cmpsq */
13821 case 0xab: /* stosw/stosl */
13822 case 0xaf: /* scasw/scasl */
13823 intel_operand_size (v_mode, sizeflag);
13824 break;
13825 default:
13826 intel_operand_size (b_mode, sizeflag);
13829 oappend ("%es:" + intel_syntax);
13830 ptr_reg (code, sizeflag);
13833 static void
13834 OP_DSreg (int code, int sizeflag)
13836 if (intel_syntax)
13838 switch (codep[-1])
13840 case 0x6f: /* outsw/outsl */
13841 intel_operand_size (z_mode, sizeflag);
13842 break;
13843 case 0xa5: /* movsw/movsl/movsq */
13844 case 0xa7: /* cmpsw/cmpsl/cmpsq */
13845 case 0xad: /* lodsw/lodsl/lodsq */
13846 intel_operand_size (v_mode, sizeflag);
13847 break;
13848 default:
13849 intel_operand_size (b_mode, sizeflag);
13852 if ((prefixes
13853 & (PREFIX_CS
13854 | PREFIX_DS
13855 | PREFIX_SS
13856 | PREFIX_ES
13857 | PREFIX_FS
13858 | PREFIX_GS)) == 0)
13859 prefixes |= PREFIX_DS;
13860 append_seg ();
13861 ptr_reg (code, sizeflag);
13864 static void
13865 OP_C (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13867 int add;
13868 if (rex & REX_R)
13870 USED_REX (REX_R);
13871 add = 8;
13873 else if (address_mode != mode_64bit && (prefixes & PREFIX_LOCK))
13875 all_prefixes[last_lock_prefix] = 0;
13876 used_prefixes |= PREFIX_LOCK;
13877 add = 8;
13879 else
13880 add = 0;
13881 sprintf (scratchbuf, "%%cr%d", modrm.reg + add);
13882 oappend (scratchbuf + intel_syntax);
13885 static void
13886 OP_D (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13888 int add;
13889 USED_REX (REX_R);
13890 if (rex & REX_R)
13891 add = 8;
13892 else
13893 add = 0;
13894 if (intel_syntax)
13895 sprintf (scratchbuf, "db%d", modrm.reg + add);
13896 else
13897 sprintf (scratchbuf, "%%db%d", modrm.reg + add);
13898 oappend (scratchbuf);
13901 static void
13902 OP_T (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13904 sprintf (scratchbuf, "%%tr%d", modrm.reg);
13905 oappend (scratchbuf + intel_syntax);
13908 static void
13909 OP_R (int bytemode, int sizeflag)
13911 if (modrm.mod == 3)
13912 OP_E (bytemode, sizeflag);
13913 else
13914 BadOp ();
13917 static void
13918 OP_MMX (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13920 int reg = modrm.reg;
13921 const char **names;
13923 used_prefixes |= (prefixes & PREFIX_DATA);
13924 if (prefixes & PREFIX_DATA)
13926 names = names_xmm;
13927 USED_REX (REX_R);
13928 if (rex & REX_R)
13929 reg += 8;
13931 else
13932 names = names_mm;
13933 oappend (names[reg]);
13936 static void
13937 OP_XMM (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13939 int reg = modrm.reg;
13940 const char **names;
13942 USED_REX (REX_R);
13943 if (rex & REX_R)
13944 reg += 8;
13945 if (need_vex
13946 && bytemode != xmm_mode
13947 && bytemode != scalar_mode)
13949 switch (vex.length)
13951 case 128:
13952 names = names_xmm;
13953 break;
13954 case 256:
13955 names = names_ymm;
13956 break;
13957 default:
13958 abort ();
13961 else
13962 names = names_xmm;
13963 oappend (names[reg]);
13966 static void
13967 OP_EM (int bytemode, int sizeflag)
13969 int reg;
13970 const char **names;
13972 if (modrm.mod != 3)
13974 if (intel_syntax
13975 && (bytemode == v_mode || bytemode == v_swap_mode))
13977 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
13978 used_prefixes |= (prefixes & PREFIX_DATA);
13980 OP_E (bytemode, sizeflag);
13981 return;
13984 if ((sizeflag & SUFFIX_ALWAYS) && bytemode == v_swap_mode)
13985 swap_operand ();
13987 /* Skip mod/rm byte. */
13988 MODRM_CHECK;
13989 codep++;
13990 used_prefixes |= (prefixes & PREFIX_DATA);
13991 reg = modrm.rm;
13992 if (prefixes & PREFIX_DATA)
13994 names = names_xmm;
13995 USED_REX (REX_B);
13996 if (rex & REX_B)
13997 reg += 8;
13999 else
14000 names = names_mm;
14001 oappend (names[reg]);
14004 /* cvt* are the only instructions in sse2 which have
14005 both SSE and MMX operands and also have 0x66 prefix
14006 in their opcode. 0x66 was originally used to differentiate
14007 between SSE and MMX instruction(operands). So we have to handle the
14008 cvt* separately using OP_EMC and OP_MXC */
14009 static void
14010 OP_EMC (int bytemode, int sizeflag)
14012 if (modrm.mod != 3)
14014 if (intel_syntax && bytemode == v_mode)
14016 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
14017 used_prefixes |= (prefixes & PREFIX_DATA);
14019 OP_E (bytemode, sizeflag);
14020 return;
14023 /* Skip mod/rm byte. */
14024 MODRM_CHECK;
14025 codep++;
14026 used_prefixes |= (prefixes & PREFIX_DATA);
14027 oappend (names_mm[modrm.rm]);
14030 static void
14031 OP_MXC (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
14033 used_prefixes |= (prefixes & PREFIX_DATA);
14034 oappend (names_mm[modrm.reg]);
14037 static void
14038 OP_EX (int bytemode, int sizeflag)
14040 int reg;
14041 const char **names;
14043 /* Skip mod/rm byte. */
14044 MODRM_CHECK;
14045 codep++;
14047 if (modrm.mod != 3)
14049 OP_E_memory (bytemode, sizeflag);
14050 return;
14053 reg = modrm.rm;
14054 USED_REX (REX_B);
14055 if (rex & REX_B)
14056 reg += 8;
14058 if ((sizeflag & SUFFIX_ALWAYS)
14059 && (bytemode == x_swap_mode
14060 || bytemode == d_swap_mode
14061 || bytemode == d_scalar_swap_mode
14062 || bytemode == q_swap_mode
14063 || bytemode == q_scalar_swap_mode))
14064 swap_operand ();
14066 if (need_vex
14067 && bytemode != xmm_mode
14068 && bytemode != xmmq_mode
14069 && bytemode != d_scalar_mode
14070 && bytemode != d_scalar_swap_mode
14071 && bytemode != q_scalar_mode
14072 && bytemode != q_scalar_swap_mode
14073 && bytemode != vex_scalar_w_dq_mode)
14075 switch (vex.length)
14077 case 128:
14078 names = names_xmm;
14079 break;
14080 case 256:
14081 names = names_ymm;
14082 break;
14083 default:
14084 abort ();
14087 else
14088 names = names_xmm;
14089 oappend (names[reg]);
14092 static void
14093 OP_MS (int bytemode, int sizeflag)
14095 if (modrm.mod == 3)
14096 OP_EM (bytemode, sizeflag);
14097 else
14098 BadOp ();
14101 static void
14102 OP_XS (int bytemode, int sizeflag)
14104 if (modrm.mod == 3)
14105 OP_EX (bytemode, sizeflag);
14106 else
14107 BadOp ();
14110 static void
14111 OP_M (int bytemode, int sizeflag)
14113 if (modrm.mod == 3)
14114 /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
14115 BadOp ();
14116 else
14117 OP_E (bytemode, sizeflag);
14120 static void
14121 OP_0f07 (int bytemode, int sizeflag)
14123 if (modrm.mod != 3 || modrm.rm != 0)
14124 BadOp ();
14125 else
14126 OP_E (bytemode, sizeflag);
14129 /* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
14130 32bit mode and "xchg %rax,%rax" in 64bit mode. */
14132 static void
14133 NOP_Fixup1 (int bytemode, int sizeflag)
14135 if ((prefixes & PREFIX_DATA) != 0
14136 || (rex != 0
14137 && rex != 0x48
14138 && address_mode == mode_64bit))
14139 OP_REG (bytemode, sizeflag);
14140 else
14141 strcpy (obuf, "nop");
14144 static void
14145 NOP_Fixup2 (int bytemode, int sizeflag)
14147 if ((prefixes & PREFIX_DATA) != 0
14148 || (rex != 0
14149 && rex != 0x48
14150 && address_mode == mode_64bit))
14151 OP_IMREG (bytemode, sizeflag);
14154 static const char *const Suffix3DNow[] = {
14155 /* 00 */ NULL, NULL, NULL, NULL,
14156 /* 04 */ NULL, NULL, NULL, NULL,
14157 /* 08 */ NULL, NULL, NULL, NULL,
14158 /* 0C */ "pi2fw", "pi2fd", NULL, NULL,
14159 /* 10 */ NULL, NULL, NULL, NULL,
14160 /* 14 */ NULL, NULL, NULL, NULL,
14161 /* 18 */ NULL, NULL, NULL, NULL,
14162 /* 1C */ "pf2iw", "pf2id", NULL, NULL,
14163 /* 20 */ NULL, NULL, NULL, NULL,
14164 /* 24 */ NULL, NULL, NULL, NULL,
14165 /* 28 */ NULL, NULL, NULL, NULL,
14166 /* 2C */ NULL, NULL, NULL, NULL,
14167 /* 30 */ NULL, NULL, NULL, NULL,
14168 /* 34 */ NULL, NULL, NULL, NULL,
14169 /* 38 */ NULL, NULL, NULL, NULL,
14170 /* 3C */ NULL, NULL, NULL, NULL,
14171 /* 40 */ NULL, NULL, NULL, NULL,
14172 /* 44 */ NULL, NULL, NULL, NULL,
14173 /* 48 */ NULL, NULL, NULL, NULL,
14174 /* 4C */ NULL, NULL, NULL, NULL,
14175 /* 50 */ NULL, NULL, NULL, NULL,
14176 /* 54 */ NULL, NULL, NULL, NULL,
14177 /* 58 */ NULL, NULL, NULL, NULL,
14178 /* 5C */ NULL, NULL, NULL, NULL,
14179 /* 60 */ NULL, NULL, NULL, NULL,
14180 /* 64 */ NULL, NULL, NULL, NULL,
14181 /* 68 */ NULL, NULL, NULL, NULL,
14182 /* 6C */ NULL, NULL, NULL, NULL,
14183 /* 70 */ NULL, NULL, NULL, NULL,
14184 /* 74 */ NULL, NULL, NULL, NULL,
14185 /* 78 */ NULL, NULL, NULL, NULL,
14186 /* 7C */ NULL, NULL, NULL, NULL,
14187 /* 80 */ NULL, NULL, NULL, NULL,
14188 /* 84 */ NULL, NULL, NULL, NULL,
14189 /* 88 */ NULL, NULL, "pfnacc", NULL,
14190 /* 8C */ NULL, NULL, "pfpnacc", NULL,
14191 /* 90 */ "pfcmpge", NULL, NULL, NULL,
14192 /* 94 */ "pfmin", NULL, "pfrcp", "pfrsqrt",
14193 /* 98 */ NULL, NULL, "pfsub", NULL,
14194 /* 9C */ NULL, NULL, "pfadd", NULL,
14195 /* A0 */ "pfcmpgt", NULL, NULL, NULL,
14196 /* A4 */ "pfmax", NULL, "pfrcpit1", "pfrsqit1",
14197 /* A8 */ NULL, NULL, "pfsubr", NULL,
14198 /* AC */ NULL, NULL, "pfacc", NULL,
14199 /* B0 */ "pfcmpeq", NULL, NULL, NULL,
14200 /* B4 */ "pfmul", NULL, "pfrcpit2", "pmulhrw",
14201 /* B8 */ NULL, NULL, NULL, "pswapd",
14202 /* BC */ NULL, NULL, NULL, "pavgusb",
14203 /* C0 */ NULL, NULL, NULL, NULL,
14204 /* C4 */ NULL, NULL, NULL, NULL,
14205 /* C8 */ NULL, NULL, NULL, NULL,
14206 /* CC */ NULL, NULL, NULL, NULL,
14207 /* D0 */ NULL, NULL, NULL, NULL,
14208 /* D4 */ NULL, NULL, NULL, NULL,
14209 /* D8 */ NULL, NULL, NULL, NULL,
14210 /* DC */ NULL, NULL, NULL, NULL,
14211 /* E0 */ NULL, NULL, NULL, NULL,
14212 /* E4 */ NULL, NULL, NULL, NULL,
14213 /* E8 */ NULL, NULL, NULL, NULL,
14214 /* EC */ NULL, NULL, NULL, NULL,
14215 /* F0 */ NULL, NULL, NULL, NULL,
14216 /* F4 */ NULL, NULL, NULL, NULL,
14217 /* F8 */ NULL, NULL, NULL, NULL,
14218 /* FC */ NULL, NULL, NULL, NULL,
14221 static void
14222 OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
14224 const char *mnemonic;
14226 FETCH_DATA (the_info, codep + 1);
14227 /* AMD 3DNow! instructions are specified by an opcode suffix in the
14228 place where an 8-bit immediate would normally go. ie. the last
14229 byte of the instruction. */
14230 obufp = mnemonicendp;
14231 mnemonic = Suffix3DNow[*codep++ & 0xff];
14232 if (mnemonic)
14233 oappend (mnemonic);
14234 else
14236 /* Since a variable sized modrm/sib chunk is between the start
14237 of the opcode (0x0f0f) and the opcode suffix, we need to do
14238 all the modrm processing first, and don't know until now that
14239 we have a bad opcode. This necessitates some cleaning up. */
14240 op_out[0][0] = '\0';
14241 op_out[1][0] = '\0';
14242 BadOp ();
14244 mnemonicendp = obufp;
14247 static struct op simd_cmp_op[] =
14249 { STRING_COMMA_LEN ("eq") },
14250 { STRING_COMMA_LEN ("lt") },
14251 { STRING_COMMA_LEN ("le") },
14252 { STRING_COMMA_LEN ("unord") },
14253 { STRING_COMMA_LEN ("neq") },
14254 { STRING_COMMA_LEN ("nlt") },
14255 { STRING_COMMA_LEN ("nle") },
14256 { STRING_COMMA_LEN ("ord") }
14259 static void
14260 CMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
14262 unsigned int cmp_type;
14264 FETCH_DATA (the_info, codep + 1);
14265 cmp_type = *codep++ & 0xff;
14266 if (cmp_type < ARRAY_SIZE (simd_cmp_op))
14268 char suffix [3];
14269 char *p = mnemonicendp - 2;
14270 suffix[0] = p[0];
14271 suffix[1] = p[1];
14272 suffix[2] = '\0';
14273 sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
14274 mnemonicendp += simd_cmp_op[cmp_type].len;
14276 else
14278 /* We have a reserved extension byte. Output it directly. */
14279 scratchbuf[0] = '$';
14280 print_operand_value (scratchbuf + 1, 1, cmp_type);
14281 oappend (scratchbuf + intel_syntax);
14282 scratchbuf[0] = '\0';
14286 static void
14287 OP_Mwait (int bytemode ATTRIBUTE_UNUSED,
14288 int sizeflag ATTRIBUTE_UNUSED)
14290 /* mwait %eax,%ecx */
14291 if (!intel_syntax)
14293 const char **names = (address_mode == mode_64bit
14294 ? names64 : names32);
14295 strcpy (op_out[0], names[0]);
14296 strcpy (op_out[1], names[1]);
14297 two_source_ops = 1;
14299 /* Skip mod/rm byte. */
14300 MODRM_CHECK;
14301 codep++;
14304 static void
14305 OP_Monitor (int bytemode ATTRIBUTE_UNUSED,
14306 int sizeflag ATTRIBUTE_UNUSED)
14308 /* monitor %eax,%ecx,%edx" */
14309 if (!intel_syntax)
14311 const char **op1_names;
14312 const char **names = (address_mode == mode_64bit
14313 ? names64 : names32);
14315 if (!(prefixes & PREFIX_ADDR))
14316 op1_names = (address_mode == mode_16bit
14317 ? names16 : names);
14318 else
14320 /* Remove "addr16/addr32". */
14321 all_prefixes[last_addr_prefix] = 0;
14322 op1_names = (address_mode != mode_32bit
14323 ? names32 : names16);
14324 used_prefixes |= PREFIX_ADDR;
14326 strcpy (op_out[0], op1_names[0]);
14327 strcpy (op_out[1], names[1]);
14328 strcpy (op_out[2], names[2]);
14329 two_source_ops = 1;
14331 /* Skip mod/rm byte. */
14332 MODRM_CHECK;
14333 codep++;
14336 static void
14337 BadOp (void)
14339 /* Throw away prefixes and 1st. opcode byte. */
14340 codep = insn_codep + 1;
14341 oappend ("(bad)");
14344 static void
14345 REP_Fixup (int bytemode, int sizeflag)
14347 /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
14348 lods and stos. */
14349 if (prefixes & PREFIX_REPZ)
14350 all_prefixes[last_repz_prefix] = REP_PREFIX;
14352 switch (bytemode)
14354 case al_reg:
14355 case eAX_reg:
14356 case indir_dx_reg:
14357 OP_IMREG (bytemode, sizeflag);
14358 break;
14359 case eDI_reg:
14360 OP_ESreg (bytemode, sizeflag);
14361 break;
14362 case eSI_reg:
14363 OP_DSreg (bytemode, sizeflag);
14364 break;
14365 default:
14366 abort ();
14367 break;
14371 static void
14372 CMPXCHG8B_Fixup (int bytemode, int sizeflag)
14374 USED_REX (REX_W);
14375 if (rex & REX_W)
14377 /* Change cmpxchg8b to cmpxchg16b. */
14378 char *p = mnemonicendp - 2;
14379 mnemonicendp = stpcpy (p, "16b");
14380 bytemode = o_mode;
14382 OP_M (bytemode, sizeflag);
14385 static void
14386 XMM_Fixup (int reg, int sizeflag ATTRIBUTE_UNUSED)
14388 const char **names;
14390 if (need_vex)
14392 switch (vex.length)
14394 case 128:
14395 names = names_xmm;
14396 break;
14397 case 256:
14398 names = names_ymm;
14399 break;
14400 default:
14401 abort ();
14404 else
14405 names = names_xmm;
14406 oappend (names[reg]);
14409 static void
14410 CRC32_Fixup (int bytemode, int sizeflag)
14412 /* Add proper suffix to "crc32". */
14413 char *p = mnemonicendp;
14415 switch (bytemode)
14417 case b_mode:
14418 if (intel_syntax)
14419 goto skip;
14421 *p++ = 'b';
14422 break;
14423 case v_mode:
14424 if (intel_syntax)
14425 goto skip;
14427 USED_REX (REX_W);
14428 if (rex & REX_W)
14429 *p++ = 'q';
14430 else
14432 if (sizeflag & DFLAG)
14433 *p++ = 'l';
14434 else
14435 *p++ = 'w';
14436 used_prefixes |= (prefixes & PREFIX_DATA);
14438 break;
14439 default:
14440 oappend (INTERNAL_DISASSEMBLER_ERROR);
14441 break;
14443 mnemonicendp = p;
14444 *p = '\0';
14446 skip:
14447 if (modrm.mod == 3)
14449 int add;
14451 /* Skip mod/rm byte. */
14452 MODRM_CHECK;
14453 codep++;
14455 USED_REX (REX_B);
14456 add = (rex & REX_B) ? 8 : 0;
14457 if (bytemode == b_mode)
14459 USED_REX (0);
14460 if (rex)
14461 oappend (names8rex[modrm.rm + add]);
14462 else
14463 oappend (names8[modrm.rm + add]);
14465 else
14467 USED_REX (REX_W);
14468 if (rex & REX_W)
14469 oappend (names64[modrm.rm + add]);
14470 else if ((prefixes & PREFIX_DATA))
14471 oappend (names16[modrm.rm + add]);
14472 else
14473 oappend (names32[modrm.rm + add]);
14476 else
14477 OP_E (bytemode, sizeflag);
14480 static void
14481 FXSAVE_Fixup (int bytemode, int sizeflag)
14483 /* Add proper suffix to "fxsave" and "fxrstor". */
14484 USED_REX (REX_W);
14485 if (rex & REX_W)
14487 char *p = mnemonicendp;
14488 *p++ = '6';
14489 *p++ = '4';
14490 *p = '\0';
14491 mnemonicendp = p;
14493 OP_M (bytemode, sizeflag);
14496 /* Display the destination register operand for instructions with
14497 VEX. */
14499 static void
14500 OP_VEX (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
14502 int reg;
14503 const char **names;
14505 if (!need_vex)
14506 abort ();
14508 if (!need_vex_reg)
14509 return;
14511 reg = vex.register_specifier;
14512 if (bytemode == vex_scalar_mode)
14514 oappend (names_xmm[reg]);
14515 return;
14518 switch (vex.length)
14520 case 128:
14521 switch (bytemode)
14523 case vex_mode:
14524 case vex128_mode:
14525 break;
14526 default:
14527 abort ();
14528 return;
14531 names = names_xmm;
14532 break;
14533 case 256:
14534 switch (bytemode)
14536 case vex_mode:
14537 case vex256_mode:
14538 break;
14539 default:
14540 abort ();
14541 return;
14544 names = names_ymm;
14545 break;
14546 default:
14547 abort ();
14548 break;
14550 oappend (names[reg]);
14553 /* Get the VEX immediate byte without moving codep. */
14555 static unsigned char
14556 get_vex_imm8 (int sizeflag, int opnum)
14558 int bytes_before_imm = 0;
14560 if (modrm.mod != 3)
14562 /* There are SIB/displacement bytes. */
14563 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
14565 /* 32/64 bit address mode */
14566 int base = modrm.rm;
14568 /* Check SIB byte. */
14569 if (base == 4)
14571 FETCH_DATA (the_info, codep + 1);
14572 base = *codep & 7;
14573 /* When decoding the third source, don't increase
14574 bytes_before_imm as this has already been incremented
14575 by one in OP_E_memory while decoding the second
14576 source operand. */
14577 if (opnum == 0)
14578 bytes_before_imm++;
14581 /* Don't increase bytes_before_imm when decoding the third source,
14582 it has already been incremented by OP_E_memory while decoding
14583 the second source operand. */
14584 if (opnum == 0)
14586 switch (modrm.mod)
14588 case 0:
14589 /* When modrm.rm == 5 or modrm.rm == 4 and base in
14590 SIB == 5, there is a 4 byte displacement. */
14591 if (base != 5)
14592 /* No displacement. */
14593 break;
14594 case 2:
14595 /* 4 byte displacement. */
14596 bytes_before_imm += 4;
14597 break;
14598 case 1:
14599 /* 1 byte displacement. */
14600 bytes_before_imm++;
14601 break;
14605 else
14607 /* 16 bit address mode */
14608 /* Don't increase bytes_before_imm when decoding the third source,
14609 it has already been incremented by OP_E_memory while decoding
14610 the second source operand. */
14611 if (opnum == 0)
14613 switch (modrm.mod)
14615 case 0:
14616 /* When modrm.rm == 6, there is a 2 byte displacement. */
14617 if (modrm.rm != 6)
14618 /* No displacement. */
14619 break;
14620 case 2:
14621 /* 2 byte displacement. */
14622 bytes_before_imm += 2;
14623 break;
14624 case 1:
14625 /* 1 byte displacement: when decoding the third source,
14626 don't increase bytes_before_imm as this has already
14627 been incremented by one in OP_E_memory while decoding
14628 the second source operand. */
14629 if (opnum == 0)
14630 bytes_before_imm++;
14632 break;
14638 FETCH_DATA (the_info, codep + bytes_before_imm + 1);
14639 return codep [bytes_before_imm];
14642 static void
14643 OP_EX_VexReg (int bytemode, int sizeflag, int reg)
14645 const char **names;
14647 if (reg == -1 && modrm.mod != 3)
14649 OP_E_memory (bytemode, sizeflag);
14650 return;
14652 else
14654 if (reg == -1)
14656 reg = modrm.rm;
14657 USED_REX (REX_B);
14658 if (rex & REX_B)
14659 reg += 8;
14661 else if (reg > 7 && address_mode != mode_64bit)
14662 BadOp ();
14665 switch (vex.length)
14667 case 128:
14668 names = names_xmm;
14669 break;
14670 case 256:
14671 names = names_ymm;
14672 break;
14673 default:
14674 abort ();
14676 oappend (names[reg]);
14679 static void
14680 OP_EX_VexImmW (int bytemode, int sizeflag)
14682 int reg = -1;
14683 static unsigned char vex_imm8;
14685 if (vex_w_done == 0)
14687 vex_w_done = 1;
14689 /* Skip mod/rm byte. */
14690 MODRM_CHECK;
14691 codep++;
14693 vex_imm8 = get_vex_imm8 (sizeflag, 0);
14695 if (vex.w)
14696 reg = vex_imm8 >> 4;
14698 OP_EX_VexReg (bytemode, sizeflag, reg);
14700 else if (vex_w_done == 1)
14702 vex_w_done = 2;
14704 if (!vex.w)
14705 reg = vex_imm8 >> 4;
14707 OP_EX_VexReg (bytemode, sizeflag, reg);
14709 else
14711 /* Output the imm8 directly. */
14712 scratchbuf[0] = '$';
14713 print_operand_value (scratchbuf + 1, 1, vex_imm8 & 0xf);
14714 oappend (scratchbuf + intel_syntax);
14715 scratchbuf[0] = '\0';
14716 codep++;
14720 static void
14721 OP_Vex_2src (int bytemode, int sizeflag)
14723 if (modrm.mod == 3)
14725 int reg = modrm.rm;
14726 USED_REX (REX_B);
14727 if (rex & REX_B)
14728 reg += 8;
14729 oappend (names_xmm[reg]);
14731 else
14733 if (intel_syntax
14734 && (bytemode == v_mode || bytemode == v_swap_mode))
14736 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
14737 used_prefixes |= (prefixes & PREFIX_DATA);
14739 OP_E (bytemode, sizeflag);
14743 static void
14744 OP_Vex_2src_1 (int bytemode, int sizeflag)
14746 if (modrm.mod == 3)
14748 /* Skip mod/rm byte. */
14749 MODRM_CHECK;
14750 codep++;
14753 if (vex.w)
14754 oappend (names_xmm[vex.register_specifier]);
14755 else
14756 OP_Vex_2src (bytemode, sizeflag);
14759 static void
14760 OP_Vex_2src_2 (int bytemode, int sizeflag)
14762 if (vex.w)
14763 OP_Vex_2src (bytemode, sizeflag);
14764 else
14765 oappend (names_xmm[vex.register_specifier]);
14768 static void
14769 OP_EX_VexW (int bytemode, int sizeflag)
14771 int reg = -1;
14773 if (!vex_w_done)
14775 vex_w_done = 1;
14777 /* Skip mod/rm byte. */
14778 MODRM_CHECK;
14779 codep++;
14781 if (vex.w)
14782 reg = get_vex_imm8 (sizeflag, 0) >> 4;
14784 else
14786 if (!vex.w)
14787 reg = get_vex_imm8 (sizeflag, 1) >> 4;
14790 OP_EX_VexReg (bytemode, sizeflag, reg);
14793 static void
14794 VEXI4_Fixup (int bytemode ATTRIBUTE_UNUSED,
14795 int sizeflag ATTRIBUTE_UNUSED)
14797 /* Skip the immediate byte and check for invalid bits. */
14798 FETCH_DATA (the_info, codep + 1);
14799 if (*codep++ & 0xf)
14800 BadOp ();
14803 static void
14804 OP_REG_VexI4 (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
14806 int reg;
14807 const char **names;
14809 FETCH_DATA (the_info, codep + 1);
14810 reg = *codep++;
14812 if (bytemode != x_mode)
14813 abort ();
14815 if (reg & 0xf)
14816 BadOp ();
14818 reg >>= 4;
14819 if (reg > 7 && address_mode != mode_64bit)
14820 BadOp ();
14822 switch (vex.length)
14824 case 128:
14825 names = names_xmm;
14826 break;
14827 case 256:
14828 names = names_ymm;
14829 break;
14830 default:
14831 abort ();
14833 oappend (names[reg]);
14836 static void
14837 OP_XMM_VexW (int bytemode, int sizeflag)
14839 /* Turn off the REX.W bit since it is used for swapping operands
14840 now. */
14841 rex &= ~REX_W;
14842 OP_XMM (bytemode, sizeflag);
14845 static void
14846 OP_EX_Vex (int bytemode, int sizeflag)
14848 if (modrm.mod != 3)
14850 if (vex.register_specifier != 0)
14851 BadOp ();
14852 need_vex_reg = 0;
14854 OP_EX (bytemode, sizeflag);
14857 static void
14858 OP_XMM_Vex (int bytemode, int sizeflag)
14860 if (modrm.mod != 3)
14862 if (vex.register_specifier != 0)
14863 BadOp ();
14864 need_vex_reg = 0;
14866 OP_XMM (bytemode, sizeflag);
14869 static void
14870 VZERO_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
14872 switch (vex.length)
14874 case 128:
14875 mnemonicendp = stpcpy (obuf, "vzeroupper");
14876 break;
14877 case 256:
14878 mnemonicendp = stpcpy (obuf, "vzeroall");
14879 break;
14880 default:
14881 abort ();
14885 static struct op vex_cmp_op[] =
14887 { STRING_COMMA_LEN ("eq") },
14888 { STRING_COMMA_LEN ("lt") },
14889 { STRING_COMMA_LEN ("le") },
14890 { STRING_COMMA_LEN ("unord") },
14891 { STRING_COMMA_LEN ("neq") },
14892 { STRING_COMMA_LEN ("nlt") },
14893 { STRING_COMMA_LEN ("nle") },
14894 { STRING_COMMA_LEN ("ord") },
14895 { STRING_COMMA_LEN ("eq_uq") },
14896 { STRING_COMMA_LEN ("nge") },
14897 { STRING_COMMA_LEN ("ngt") },
14898 { STRING_COMMA_LEN ("false") },
14899 { STRING_COMMA_LEN ("neq_oq") },
14900 { STRING_COMMA_LEN ("ge") },
14901 { STRING_COMMA_LEN ("gt") },
14902 { STRING_COMMA_LEN ("true") },
14903 { STRING_COMMA_LEN ("eq_os") },
14904 { STRING_COMMA_LEN ("lt_oq") },
14905 { STRING_COMMA_LEN ("le_oq") },
14906 { STRING_COMMA_LEN ("unord_s") },
14907 { STRING_COMMA_LEN ("neq_us") },
14908 { STRING_COMMA_LEN ("nlt_uq") },
14909 { STRING_COMMA_LEN ("nle_uq") },
14910 { STRING_COMMA_LEN ("ord_s") },
14911 { STRING_COMMA_LEN ("eq_us") },
14912 { STRING_COMMA_LEN ("nge_uq") },
14913 { STRING_COMMA_LEN ("ngt_uq") },
14914 { STRING_COMMA_LEN ("false_os") },
14915 { STRING_COMMA_LEN ("neq_os") },
14916 { STRING_COMMA_LEN ("ge_oq") },
14917 { STRING_COMMA_LEN ("gt_oq") },
14918 { STRING_COMMA_LEN ("true_us") },
14921 static void
14922 VCMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
14924 unsigned int cmp_type;
14926 FETCH_DATA (the_info, codep + 1);
14927 cmp_type = *codep++ & 0xff;
14928 if (cmp_type < ARRAY_SIZE (vex_cmp_op))
14930 char suffix [3];
14931 char *p = mnemonicendp - 2;
14932 suffix[0] = p[0];
14933 suffix[1] = p[1];
14934 suffix[2] = '\0';
14935 sprintf (p, "%s%s", vex_cmp_op[cmp_type].name, suffix);
14936 mnemonicendp += vex_cmp_op[cmp_type].len;
14938 else
14940 /* We have a reserved extension byte. Output it directly. */
14941 scratchbuf[0] = '$';
14942 print_operand_value (scratchbuf + 1, 1, cmp_type);
14943 oappend (scratchbuf + intel_syntax);
14944 scratchbuf[0] = '\0';
14948 static const struct op pclmul_op[] =
14950 { STRING_COMMA_LEN ("lql") },
14951 { STRING_COMMA_LEN ("hql") },
14952 { STRING_COMMA_LEN ("lqh") },
14953 { STRING_COMMA_LEN ("hqh") }
14956 static void
14957 PCLMUL_Fixup (int bytemode ATTRIBUTE_UNUSED,
14958 int sizeflag ATTRIBUTE_UNUSED)
14960 unsigned int pclmul_type;
14962 FETCH_DATA (the_info, codep + 1);
14963 pclmul_type = *codep++ & 0xff;
14964 switch (pclmul_type)
14966 case 0x10:
14967 pclmul_type = 2;
14968 break;
14969 case 0x11:
14970 pclmul_type = 3;
14971 break;
14972 default:
14973 break;
14975 if (pclmul_type < ARRAY_SIZE (pclmul_op))
14977 char suffix [4];
14978 char *p = mnemonicendp - 3;
14979 suffix[0] = p[0];
14980 suffix[1] = p[1];
14981 suffix[2] = p[2];
14982 suffix[3] = '\0';
14983 sprintf (p, "%s%s", pclmul_op[pclmul_type].name, suffix);
14984 mnemonicendp += pclmul_op[pclmul_type].len;
14986 else
14988 /* We have a reserved extension byte. Output it directly. */
14989 scratchbuf[0] = '$';
14990 print_operand_value (scratchbuf + 1, 1, pclmul_type);
14991 oappend (scratchbuf + intel_syntax);
14992 scratchbuf[0] = '\0';
14996 static void
14997 MOVBE_Fixup (int bytemode, int sizeflag)
14999 /* Add proper suffix to "movbe". */
15000 char *p = mnemonicendp;
15002 switch (bytemode)
15004 case v_mode:
15005 if (intel_syntax)
15006 goto skip;
15008 USED_REX (REX_W);
15009 if (sizeflag & SUFFIX_ALWAYS)
15011 if (rex & REX_W)
15012 *p++ = 'q';
15013 else
15015 if (sizeflag & DFLAG)
15016 *p++ = 'l';
15017 else
15018 *p++ = 'w';
15019 used_prefixes |= (prefixes & PREFIX_DATA);
15022 break;
15023 default:
15024 oappend (INTERNAL_DISASSEMBLER_ERROR);
15025 break;
15027 mnemonicendp = p;
15028 *p = '\0';
15030 skip:
15031 OP_M (bytemode, sizeflag);
15034 static void
15035 OP_LWPCB_E (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15037 int reg;
15038 const char **names;
15040 /* Skip mod/rm byte. */
15041 MODRM_CHECK;
15042 codep++;
15044 if (vex.w)
15045 names = names64;
15046 else
15047 names = names32;
15049 reg = modrm.rm;
15050 USED_REX (REX_B);
15051 if (rex & REX_B)
15052 reg += 8;
15054 oappend (names[reg]);
15057 static void
15058 OP_LWP_E (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15060 const char **names;
15062 if (vex.w)
15063 names = names64;
15064 else
15065 names = names32;
15067 oappend (names[vex.register_specifier]);