daily update
[binutils.git] / opcodes / i386-dis.c
blob6207ac4f136939da5b039b646d01a315cf700f08
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
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 fetch_data (struct disassemble_info *, bfd_byte *);
46 static void ckprefix (void);
47 static const char *prefix_name (int, int);
48 static int print_insn (bfd_vma, disassemble_info *);
49 static void dofloat (int);
50 static void OP_ST (int, int);
51 static void OP_STi (int, int);
52 static int putop (const char *, int);
53 static void oappend (const char *);
54 static void append_seg (void);
55 static void OP_indirE (int, int);
56 static void print_operand_value (char *, int, bfd_vma);
57 static void OP_E_register (int, int);
58 static void OP_E_memory (int, int, int);
59 static void OP_E_extended (int, int, int);
60 static void print_displacement (char *, bfd_vma);
61 static void OP_E (int, int);
62 static void OP_G (int, int);
63 static bfd_vma get64 (void);
64 static bfd_signed_vma get32 (void);
65 static bfd_signed_vma get32s (void);
66 static int get16 (void);
67 static void set_op (bfd_vma, int);
68 static void OP_Skip_MODRM (int, int);
69 static void OP_REG (int, int);
70 static void OP_IMREG (int, int);
71 static void OP_I (int, int);
72 static void OP_I64 (int, int);
73 static void OP_sI (int, int);
74 static void OP_J (int, int);
75 static void OP_SEG (int, int);
76 static void OP_DIR (int, int);
77 static void OP_OFF (int, int);
78 static void OP_OFF64 (int, int);
79 static void ptr_reg (int, int);
80 static void OP_ESreg (int, int);
81 static void OP_DSreg (int, int);
82 static void OP_C (int, int);
83 static void OP_D (int, int);
84 static void OP_T (int, int);
85 static void OP_R (int, int);
86 static void OP_MMX (int, int);
87 static void OP_XMM (int, int);
88 static void OP_EM (int, int);
89 static void OP_EX (int, int);
90 static void OP_EMC (int,int);
91 static void OP_MXC (int,int);
92 static void OP_MS (int, int);
93 static void OP_XS (int, int);
94 static void OP_M (int, int);
95 static void OP_VEX (int, int);
96 static void OP_VEX_FMA (int, int);
97 static void OP_EX_Vex (int, int);
98 static void OP_EX_VexW (int, int);
99 static void OP_EX_VexImmW (int, int);
100 static void OP_XMM_Vex (int, int);
101 static void OP_XMM_VexW (int, int);
102 static void OP_REG_VexI4 (int, int);
103 static void PCLMUL_Fixup (int, int);
104 static void VEXI4_Fixup (int, int);
105 static void VZERO_Fixup (int, int);
106 static void VCMP_Fixup (int, int);
107 static void VPERMIL2_Fixup (int, int);
108 static void OP_0f07 (int, int);
109 static void OP_Monitor (int, int);
110 static void OP_Mwait (int, int);
111 static void NOP_Fixup1 (int, int);
112 static void NOP_Fixup2 (int, int);
113 static void OP_3DNowSuffix (int, int);
114 static void CMP_Fixup (int, int);
115 static void BadOp (void);
116 static void REP_Fixup (int, int);
117 static void CMPXCHG8B_Fixup (int, int);
118 static void XMM_Fixup (int, int);
119 static void CRC32_Fixup (int, int);
120 static void print_drex_arg (unsigned int, int, int);
121 static void OP_DREX4 (int, int);
122 static void OP_DREX3 (int, int);
123 static void OP_DREX_ICMP (int, int);
124 static void OP_DREX_FCMP (int, int);
125 static void MOVBE_Fixup (int, int);
127 struct dis_private {
128 /* Points to first byte not fetched. */
129 bfd_byte *max_fetched;
130 bfd_byte the_buffer[MAX_MNEM_SIZE];
131 bfd_vma insn_start;
132 int orig_sizeflag;
133 jmp_buf bailout;
136 enum address_mode
138 mode_16bit,
139 mode_32bit,
140 mode_64bit
143 enum address_mode address_mode;
145 /* Flags for the prefixes for the current instruction. See below. */
146 static int prefixes;
148 /* REX prefix the current instruction. See below. */
149 static int rex;
150 /* Bits of REX we've already used. */
151 static int rex_used;
152 /* Original REX prefix. */
153 static int rex_original;
154 /* REX bits in original REX prefix ignored. It may not be the same
155 as rex_original since some bits may not be ignored. */
156 static int rex_ignored;
157 /* Mark parts used in the REX prefix. When we are testing for
158 empty prefix (for 8bit register REX extension), just mask it
159 out. Otherwise test for REX bit is excuse for existence of REX
160 only in case value is nonzero. */
161 #define USED_REX(value) \
163 if (value) \
165 if ((rex & value)) \
166 rex_used |= (value) | REX_OPCODE; \
168 else \
169 rex_used |= REX_OPCODE; \
172 /* Special 'registers' for DREX handling */
173 #define DREX_REG_UNKNOWN 1000 /* not initialized */
174 #define DREX_REG_MEMORY 1001 /* use MODRM/SIB/OFFSET memory */
176 /* The DREX byte has the following fields:
177 Bits 7-4 -- DREX.Dest, xmm destination register
178 Bit 3 -- DREX.OC0, operand config bit defines operand order
179 Bit 2 -- DREX.R, equivalent to REX_R bit, to extend ModRM register
180 Bit 1 -- DREX.X, equivalent to REX_X bit, to extend SIB index field
181 Bit 0 -- DREX.W, equivalent to REX_B bit, to extend ModRM r/m field,
182 SIB base field, or opcode reg field. */
183 #define DREX_XMM(drex) ((drex >> 4) & 0xf)
184 #define DREX_OC0(drex) ((drex >> 3) & 0x1)
186 /* Flags for prefixes which we somehow handled when printing the
187 current instruction. */
188 static int used_prefixes;
190 /* Flags stored in PREFIXES. */
191 #define PREFIX_REPZ 1
192 #define PREFIX_REPNZ 2
193 #define PREFIX_LOCK 4
194 #define PREFIX_CS 8
195 #define PREFIX_SS 0x10
196 #define PREFIX_DS 0x20
197 #define PREFIX_ES 0x40
198 #define PREFIX_FS 0x80
199 #define PREFIX_GS 0x100
200 #define PREFIX_DATA 0x200
201 #define PREFIX_ADDR 0x400
202 #define PREFIX_FWAIT 0x800
204 /* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
205 to ADDR (exclusive) are valid. Returns 1 for success, longjmps
206 on error. */
207 #define FETCH_DATA(info, addr) \
208 ((addr) <= ((struct dis_private *) (info->private_data))->max_fetched \
209 ? 1 : fetch_data ((info), (addr)))
211 static int
212 fetch_data (struct disassemble_info *info, bfd_byte *addr)
214 int status;
215 struct dis_private *priv = (struct dis_private *) info->private_data;
216 bfd_vma start = priv->insn_start + (priv->max_fetched - priv->the_buffer);
218 if (addr <= priv->the_buffer + MAX_MNEM_SIZE)
219 status = (*info->read_memory_func) (start,
220 priv->max_fetched,
221 addr - priv->max_fetched,
222 info);
223 else
224 status = -1;
225 if (status != 0)
227 /* If we did manage to read at least one byte, then
228 print_insn_i386 will do something sensible. Otherwise, print
229 an error. We do that here because this is where we know
230 STATUS. */
231 if (priv->max_fetched == priv->the_buffer)
232 (*info->memory_error_func) (status, start, info);
233 longjmp (priv->bailout, 1);
235 else
236 priv->max_fetched = addr;
237 return 1;
240 #define XX { NULL, 0 }
242 #define Eb { OP_E, b_mode }
243 #define Ev { OP_E, v_mode }
244 #define Ed { OP_E, d_mode }
245 #define Edq { OP_E, dq_mode }
246 #define Edqw { OP_E, dqw_mode }
247 #define Edqb { OP_E, dqb_mode }
248 #define Edqd { OP_E, dqd_mode }
249 #define Eq { OP_E, q_mode }
250 #define indirEv { OP_indirE, stack_v_mode }
251 #define indirEp { OP_indirE, f_mode }
252 #define stackEv { OP_E, stack_v_mode }
253 #define Em { OP_E, m_mode }
254 #define Ew { OP_E, w_mode }
255 #define M { OP_M, 0 } /* lea, lgdt, etc. */
256 #define Ma { OP_M, a_mode }
257 #define Mb { OP_M, b_mode }
258 #define Md { OP_M, d_mode }
259 #define Mo { OP_M, o_mode }
260 #define Mp { OP_M, f_mode } /* 32 or 48 bit memory operand for LDS, LES etc */
261 #define Mq { OP_M, q_mode }
262 #define Mx { OP_M, x_mode }
263 #define Mxmm { OP_M, xmm_mode }
264 #define Gb { OP_G, b_mode }
265 #define Gv { OP_G, v_mode }
266 #define Gd { OP_G, d_mode }
267 #define Gdq { OP_G, dq_mode }
268 #define Gm { OP_G, m_mode }
269 #define Gw { OP_G, w_mode }
270 #define Rd { OP_R, d_mode }
271 #define Rm { OP_R, m_mode }
272 #define Ib { OP_I, b_mode }
273 #define sIb { OP_sI, b_mode } /* sign extened byte */
274 #define Iv { OP_I, v_mode }
275 #define Iq { OP_I, q_mode }
276 #define Iv64 { OP_I64, v_mode }
277 #define Iw { OP_I, w_mode }
278 #define I1 { OP_I, const_1_mode }
279 #define Jb { OP_J, b_mode }
280 #define Jv { OP_J, v_mode }
281 #define Cm { OP_C, m_mode }
282 #define Dm { OP_D, m_mode }
283 #define Td { OP_T, d_mode }
284 #define Skip_MODRM { OP_Skip_MODRM, 0 }
286 #define RMeAX { OP_REG, eAX_reg }
287 #define RMeBX { OP_REG, eBX_reg }
288 #define RMeCX { OP_REG, eCX_reg }
289 #define RMeDX { OP_REG, eDX_reg }
290 #define RMeSP { OP_REG, eSP_reg }
291 #define RMeBP { OP_REG, eBP_reg }
292 #define RMeSI { OP_REG, eSI_reg }
293 #define RMeDI { OP_REG, eDI_reg }
294 #define RMrAX { OP_REG, rAX_reg }
295 #define RMrBX { OP_REG, rBX_reg }
296 #define RMrCX { OP_REG, rCX_reg }
297 #define RMrDX { OP_REG, rDX_reg }
298 #define RMrSP { OP_REG, rSP_reg }
299 #define RMrBP { OP_REG, rBP_reg }
300 #define RMrSI { OP_REG, rSI_reg }
301 #define RMrDI { OP_REG, rDI_reg }
302 #define RMAL { OP_REG, al_reg }
303 #define RMAL { OP_REG, al_reg }
304 #define RMCL { OP_REG, cl_reg }
305 #define RMDL { OP_REG, dl_reg }
306 #define RMBL { OP_REG, bl_reg }
307 #define RMAH { OP_REG, ah_reg }
308 #define RMCH { OP_REG, ch_reg }
309 #define RMDH { OP_REG, dh_reg }
310 #define RMBH { OP_REG, bh_reg }
311 #define RMAX { OP_REG, ax_reg }
312 #define RMDX { OP_REG, dx_reg }
314 #define eAX { OP_IMREG, eAX_reg }
315 #define eBX { OP_IMREG, eBX_reg }
316 #define eCX { OP_IMREG, eCX_reg }
317 #define eDX { OP_IMREG, eDX_reg }
318 #define eSP { OP_IMREG, eSP_reg }
319 #define eBP { OP_IMREG, eBP_reg }
320 #define eSI { OP_IMREG, eSI_reg }
321 #define eDI { OP_IMREG, eDI_reg }
322 #define AL { OP_IMREG, al_reg }
323 #define CL { OP_IMREG, cl_reg }
324 #define DL { OP_IMREG, dl_reg }
325 #define BL { OP_IMREG, bl_reg }
326 #define AH { OP_IMREG, ah_reg }
327 #define CH { OP_IMREG, ch_reg }
328 #define DH { OP_IMREG, dh_reg }
329 #define BH { OP_IMREG, bh_reg }
330 #define AX { OP_IMREG, ax_reg }
331 #define DX { OP_IMREG, dx_reg }
332 #define zAX { OP_IMREG, z_mode_ax_reg }
333 #define indirDX { OP_IMREG, indir_dx_reg }
335 #define Sw { OP_SEG, w_mode }
336 #define Sv { OP_SEG, v_mode }
337 #define Ap { OP_DIR, 0 }
338 #define Ob { OP_OFF64, b_mode }
339 #define Ov { OP_OFF64, v_mode }
340 #define Xb { OP_DSreg, eSI_reg }
341 #define Xv { OP_DSreg, eSI_reg }
342 #define Xz { OP_DSreg, eSI_reg }
343 #define Yb { OP_ESreg, eDI_reg }
344 #define Yv { OP_ESreg, eDI_reg }
345 #define DSBX { OP_DSreg, eBX_reg }
347 #define es { OP_REG, es_reg }
348 #define ss { OP_REG, ss_reg }
349 #define cs { OP_REG, cs_reg }
350 #define ds { OP_REG, ds_reg }
351 #define fs { OP_REG, fs_reg }
352 #define gs { OP_REG, gs_reg }
354 #define MX { OP_MMX, 0 }
355 #define XM { OP_XMM, 0 }
356 #define XMM { OP_XMM, xmm_mode }
357 #define EM { OP_EM, v_mode }
358 #define EMd { OP_EM, d_mode }
359 #define EMx { OP_EM, x_mode }
360 #define EXw { OP_EX, w_mode }
361 #define EXd { OP_EX, d_mode }
362 #define EXq { OP_EX, q_mode }
363 #define EXx { OP_EX, x_mode }
364 #define EXxmm { OP_EX, xmm_mode }
365 #define EXxmmq { OP_EX, xmmq_mode }
366 #define EXymmq { OP_EX, ymmq_mode }
367 #define MS { OP_MS, v_mode }
368 #define XS { OP_XS, v_mode }
369 #define EMCq { OP_EMC, q_mode }
370 #define MXC { OP_MXC, 0 }
371 #define OPSUF { OP_3DNowSuffix, 0 }
372 #define CMP { CMP_Fixup, 0 }
373 #define XMM0 { XMM_Fixup, 0 }
375 #define Vex { OP_VEX, vex_mode }
376 #define Vex128 { OP_VEX, vex128_mode }
377 #define Vex256 { OP_VEX, vex256_mode }
378 #define VexI4 { VEXI4_Fixup, 0}
379 #define VexFMA { OP_VEX_FMA, vex_mode }
380 #define Vex128FMA { OP_VEX_FMA, vex128_mode }
381 #define EXdVex { OP_EX_Vex, d_mode }
382 #define EXqVex { OP_EX_Vex, q_mode }
383 #define EXVexW { OP_EX_VexW, x_mode }
384 #define EXdVexW { OP_EX_VexW, d_mode }
385 #define EXqVexW { OP_EX_VexW, q_mode }
386 #define EXVexImmW { OP_EX_VexImmW, x_mode }
387 #define XMVex { OP_XMM_Vex, 0 }
388 #define XMVexW { OP_XMM_VexW, 0 }
389 #define XMVexI4 { OP_REG_VexI4, x_mode }
390 #define PCLMUL { PCLMUL_Fixup, 0 }
391 #define VZERO { VZERO_Fixup, 0 }
392 #define VCMP { VCMP_Fixup, 0 }
393 #define VPERMIL2 { VPERMIL2_Fixup, 0 }
395 /* Used handle "rep" prefix for string instructions. */
396 #define Xbr { REP_Fixup, eSI_reg }
397 #define Xvr { REP_Fixup, eSI_reg }
398 #define Ybr { REP_Fixup, eDI_reg }
399 #define Yvr { REP_Fixup, eDI_reg }
400 #define Yzr { REP_Fixup, eDI_reg }
401 #define indirDXr { REP_Fixup, indir_dx_reg }
402 #define ALr { REP_Fixup, al_reg }
403 #define eAXr { REP_Fixup, eAX_reg }
405 #define cond_jump_flag { NULL, cond_jump_mode }
406 #define loop_jcxz_flag { NULL, loop_jcxz_mode }
408 /* bits in sizeflag */
409 #define SUFFIX_ALWAYS 4
410 #define AFLAG 2
411 #define DFLAG 1
413 /* byte operand */
414 #define b_mode 1
415 /* operand size depends on prefixes */
416 #define v_mode (b_mode + 1)
417 /* word operand */
418 #define w_mode (v_mode + 1)
419 /* double word operand */
420 #define d_mode (w_mode + 1)
421 /* quad word operand */
422 #define q_mode (d_mode + 1)
423 /* ten-byte operand */
424 #define t_mode (q_mode + 1)
425 /* 16-byte XMM or 32-byte YMM operand */
426 #define x_mode (t_mode + 1)
427 /* 16-byte XMM operand */
428 #define xmm_mode (x_mode + 1)
429 /* 16-byte XMM or quad word operand */
430 #define xmmq_mode (xmm_mode + 1)
431 /* 32-byte YMM or quad word operand */
432 #define ymmq_mode (xmmq_mode + 1)
433 /* d_mode in 32bit, q_mode in 64bit mode. */
434 #define m_mode (ymmq_mode + 1)
435 /* pair of v_mode operands */
436 #define a_mode (m_mode + 1)
437 #define cond_jump_mode (a_mode + 1)
438 #define loop_jcxz_mode (cond_jump_mode + 1)
439 /* operand size depends on REX prefixes. */
440 #define dq_mode (loop_jcxz_mode + 1)
441 /* registers like dq_mode, memory like w_mode. */
442 #define dqw_mode (dq_mode + 1)
443 /* 4- or 6-byte pointer operand */
444 #define f_mode (dqw_mode + 1)
445 #define const_1_mode (f_mode + 1)
446 /* v_mode for stack-related opcodes. */
447 #define stack_v_mode (const_1_mode + 1)
448 /* non-quad operand size depends on prefixes */
449 #define z_mode (stack_v_mode + 1)
450 /* 16-byte operand */
451 #define o_mode (z_mode + 1)
452 /* registers like dq_mode, memory like b_mode. */
453 #define dqb_mode (o_mode + 1)
454 /* registers like dq_mode, memory like d_mode. */
455 #define dqd_mode (dqb_mode + 1)
456 /* normal vex mode */
457 #define vex_mode (dqd_mode + 1)
458 /* 128bit vex mode */
459 #define vex128_mode (vex_mode + 1)
460 /* 256bit vex mode */
461 #define vex256_mode (vex128_mode + 1)
463 #define es_reg (vex256_mode + 1)
464 #define cs_reg (es_reg + 1)
465 #define ss_reg (cs_reg + 1)
466 #define ds_reg (ss_reg + 1)
467 #define fs_reg (ds_reg + 1)
468 #define gs_reg (fs_reg + 1)
470 #define eAX_reg (gs_reg + 1)
471 #define eCX_reg (eAX_reg + 1)
472 #define eDX_reg (eCX_reg + 1)
473 #define eBX_reg (eDX_reg + 1)
474 #define eSP_reg (eBX_reg + 1)
475 #define eBP_reg (eSP_reg + 1)
476 #define eSI_reg (eBP_reg + 1)
477 #define eDI_reg (eSI_reg + 1)
479 #define al_reg (eDI_reg + 1)
480 #define cl_reg (al_reg + 1)
481 #define dl_reg (cl_reg + 1)
482 #define bl_reg (dl_reg + 1)
483 #define ah_reg (bl_reg + 1)
484 #define ch_reg (ah_reg + 1)
485 #define dh_reg (ch_reg + 1)
486 #define bh_reg (dh_reg + 1)
488 #define ax_reg (bh_reg + 1)
489 #define cx_reg (ax_reg + 1)
490 #define dx_reg (cx_reg + 1)
491 #define bx_reg (dx_reg + 1)
492 #define sp_reg (bx_reg + 1)
493 #define bp_reg (sp_reg + 1)
494 #define si_reg (bp_reg + 1)
495 #define di_reg (si_reg + 1)
497 #define rAX_reg (di_reg + 1)
498 #define rCX_reg (rAX_reg + 1)
499 #define rDX_reg (rCX_reg + 1)
500 #define rBX_reg (rDX_reg + 1)
501 #define rSP_reg (rBX_reg + 1)
502 #define rBP_reg (rSP_reg + 1)
503 #define rSI_reg (rBP_reg + 1)
504 #define rDI_reg (rSI_reg + 1)
506 #define z_mode_ax_reg (rDI_reg + 1)
507 #define indir_dx_reg (z_mode_ax_reg + 1)
509 #define MAX_BYTEMODE indir_dx_reg
511 /* Flags that are OR'ed into the bytemode field to pass extra
512 information. */
513 #define DREX_OC1 0x10000 /* OC1 bit set */
514 #define DREX_NO_OC0 0x20000 /* OC0 bit not used */
515 #define DREX_MASK 0x40000 /* mask to delete */
517 #if MAX_BYTEMODE >= DREX_OC1
518 #error MAX_BYTEMODE must be less than DREX_OC1
519 #endif
521 #define FLOATCODE 1
522 #define USE_REG_TABLE (FLOATCODE + 1)
523 #define USE_MOD_TABLE (USE_REG_TABLE + 1)
524 #define USE_RM_TABLE (USE_MOD_TABLE + 1)
525 #define USE_PREFIX_TABLE (USE_RM_TABLE + 1)
526 #define USE_X86_64_TABLE (USE_PREFIX_TABLE + 1)
527 #define USE_3BYTE_TABLE (USE_X86_64_TABLE + 1)
528 #define USE_VEX_C4_TABLE (USE_3BYTE_TABLE + 1)
529 #define USE_VEX_C5_TABLE (USE_VEX_C4_TABLE + 1)
530 #define USE_VEX_LEN_TABLE (USE_VEX_C5_TABLE + 1)
532 #define FLOAT NULL, { { NULL, FLOATCODE } }
534 #define DIS386(T, I) NULL, { { NULL, (T)}, { NULL, (I) } }
535 #define REG_TABLE(I) DIS386 (USE_REG_TABLE, (I))
536 #define MOD_TABLE(I) DIS386 (USE_MOD_TABLE, (I))
537 #define RM_TABLE(I) DIS386 (USE_RM_TABLE, (I))
538 #define PREFIX_TABLE(I) DIS386 (USE_PREFIX_TABLE, (I))
539 #define X86_64_TABLE(I) DIS386 (USE_X86_64_TABLE, (I))
540 #define THREE_BYTE_TABLE(I) DIS386 (USE_3BYTE_TABLE, (I))
541 #define VEX_C4_TABLE(I) DIS386 (USE_VEX_C4_TABLE, (I))
542 #define VEX_C5_TABLE(I) DIS386 (USE_VEX_C5_TABLE, (I))
543 #define VEX_LEN_TABLE(I) DIS386 (USE_VEX_LEN_TABLE, (I))
545 #define REG_80 0
546 #define REG_81 (REG_80 + 1)
547 #define REG_82 (REG_81 + 1)
548 #define REG_8F (REG_82 + 1)
549 #define REG_C0 (REG_8F + 1)
550 #define REG_C1 (REG_C0 + 1)
551 #define REG_C6 (REG_C1 + 1)
552 #define REG_C7 (REG_C6 + 1)
553 #define REG_D0 (REG_C7 + 1)
554 #define REG_D1 (REG_D0 + 1)
555 #define REG_D2 (REG_D1 + 1)
556 #define REG_D3 (REG_D2 + 1)
557 #define REG_F6 (REG_D3 + 1)
558 #define REG_F7 (REG_F6 + 1)
559 #define REG_FE (REG_F7 + 1)
560 #define REG_FF (REG_FE + 1)
561 #define REG_0F00 (REG_FF + 1)
562 #define REG_0F01 (REG_0F00 + 1)
563 #define REG_0F0D (REG_0F01 + 1)
564 #define REG_0F18 (REG_0F0D + 1)
565 #define REG_0F71 (REG_0F18 + 1)
566 #define REG_0F72 (REG_0F71 + 1)
567 #define REG_0F73 (REG_0F72 + 1)
568 #define REG_0FA6 (REG_0F73 + 1)
569 #define REG_0FA7 (REG_0FA6 + 1)
570 #define REG_0FAE (REG_0FA7 + 1)
571 #define REG_0FBA (REG_0FAE + 1)
572 #define REG_0FC7 (REG_0FBA + 1)
573 #define REG_VEX_71 (REG_0FC7 + 1)
574 #define REG_VEX_72 (REG_VEX_71 + 1)
575 #define REG_VEX_73 (REG_VEX_72 + 1)
576 #define REG_VEX_AE (REG_VEX_73 + 1)
578 #define MOD_8D 0
579 #define MOD_0F01_REG_0 (MOD_8D + 1)
580 #define MOD_0F01_REG_1 (MOD_0F01_REG_0 + 1)
581 #define MOD_0F01_REG_2 (MOD_0F01_REG_1 + 1)
582 #define MOD_0F01_REG_3 (MOD_0F01_REG_2 + 1)
583 #define MOD_0F01_REG_7 (MOD_0F01_REG_3 + 1)
584 #define MOD_0F12_PREFIX_0 (MOD_0F01_REG_7 + 1)
585 #define MOD_0F13 (MOD_0F12_PREFIX_0 + 1)
586 #define MOD_0F16_PREFIX_0 (MOD_0F13 + 1)
587 #define MOD_0F17 (MOD_0F16_PREFIX_0 + 1)
588 #define MOD_0F18_REG_0 (MOD_0F17 + 1)
589 #define MOD_0F18_REG_1 (MOD_0F18_REG_0 + 1)
590 #define MOD_0F18_REG_2 (MOD_0F18_REG_1 + 1)
591 #define MOD_0F18_REG_3 (MOD_0F18_REG_2 + 1)
592 #define MOD_0F20 (MOD_0F18_REG_3 + 1)
593 #define MOD_0F21 (MOD_0F20 + 1)
594 #define MOD_0F22 (MOD_0F21 + 1)
595 #define MOD_0F23 (MOD_0F22 + 1)
596 #define MOD_0F24 (MOD_0F23 + 1)
597 #define MOD_0F26 (MOD_0F24 + 1)
598 #define MOD_0F2B_PREFIX_0 (MOD_0F26 + 1)
599 #define MOD_0F2B_PREFIX_1 (MOD_0F2B_PREFIX_0 + 1)
600 #define MOD_0F2B_PREFIX_2 (MOD_0F2B_PREFIX_1 + 1)
601 #define MOD_0F2B_PREFIX_3 (MOD_0F2B_PREFIX_2 + 1)
602 #define MOD_0F51 (MOD_0F2B_PREFIX_3 + 1)
603 #define MOD_0F71_REG_2 (MOD_0F51 + 1)
604 #define MOD_0F71_REG_4 (MOD_0F71_REG_2 + 1)
605 #define MOD_0F71_REG_6 (MOD_0F71_REG_4 + 1)
606 #define MOD_0F72_REG_2 (MOD_0F71_REG_6 + 1)
607 #define MOD_0F72_REG_4 (MOD_0F72_REG_2 + 1)
608 #define MOD_0F72_REG_6 (MOD_0F72_REG_4 + 1)
609 #define MOD_0F73_REG_2 (MOD_0F72_REG_6 + 1)
610 #define MOD_0F73_REG_3 (MOD_0F73_REG_2 + 1)
611 #define MOD_0F73_REG_6 (MOD_0F73_REG_3 + 1)
612 #define MOD_0F73_REG_7 (MOD_0F73_REG_6 + 1)
613 #define MOD_0FAE_REG_0 (MOD_0F73_REG_7 + 1)
614 #define MOD_0FAE_REG_1 (MOD_0FAE_REG_0 + 1)
615 #define MOD_0FAE_REG_2 (MOD_0FAE_REG_1 + 1)
616 #define MOD_0FAE_REG_3 (MOD_0FAE_REG_2 + 1)
617 #define MOD_0FAE_REG_4 (MOD_0FAE_REG_3 + 1)
618 #define MOD_0FAE_REG_5 (MOD_0FAE_REG_4 + 1)
619 #define MOD_0FAE_REG_6 (MOD_0FAE_REG_5 + 1)
620 #define MOD_0FAE_REG_7 (MOD_0FAE_REG_6 + 1)
621 #define MOD_0FB2 (MOD_0FAE_REG_7 + 1)
622 #define MOD_0FB4 (MOD_0FB2 + 1)
623 #define MOD_0FB5 (MOD_0FB4 + 1)
624 #define MOD_0FC7_REG_6 (MOD_0FB5 + 1)
625 #define MOD_0FC7_REG_7 (MOD_0FC7_REG_6 + 1)
626 #define MOD_0FD7 (MOD_0FC7_REG_7 + 1)
627 #define MOD_0FE7_PREFIX_2 (MOD_0FD7 + 1)
628 #define MOD_0FF0_PREFIX_3 (MOD_0FE7_PREFIX_2 + 1)
629 #define MOD_0F382A_PREFIX_2 (MOD_0FF0_PREFIX_3 + 1)
630 #define MOD_62_32BIT (MOD_0F382A_PREFIX_2 + 1)
631 #define MOD_C4_32BIT (MOD_62_32BIT + 1)
632 #define MOD_C5_32BIT (MOD_C4_32BIT + 1)
633 #define MOD_VEX_12_PREFIX_0 (MOD_C5_32BIT + 1)
634 #define MOD_VEX_13 (MOD_VEX_12_PREFIX_0 + 1)
635 #define MOD_VEX_16_PREFIX_0 (MOD_VEX_13 + 1)
636 #define MOD_VEX_17 (MOD_VEX_16_PREFIX_0 + 1)
637 #define MOD_VEX_2B (MOD_VEX_17 + 1)
638 #define MOD_VEX_51 (MOD_VEX_2B + 1)
639 #define MOD_VEX_71_REG_2 (MOD_VEX_51 + 1)
640 #define MOD_VEX_71_REG_4 (MOD_VEX_71_REG_2 + 1)
641 #define MOD_VEX_71_REG_6 (MOD_VEX_71_REG_4 + 1)
642 #define MOD_VEX_72_REG_2 (MOD_VEX_71_REG_6 + 1)
643 #define MOD_VEX_72_REG_4 (MOD_VEX_72_REG_2 + 1)
644 #define MOD_VEX_72_REG_6 (MOD_VEX_72_REG_4 + 1)
645 #define MOD_VEX_73_REG_2 (MOD_VEX_72_REG_6 + 1)
646 #define MOD_VEX_73_REG_3 (MOD_VEX_73_REG_2 + 1)
647 #define MOD_VEX_73_REG_6 (MOD_VEX_73_REG_3 + 1)
648 #define MOD_VEX_73_REG_7 (MOD_VEX_73_REG_6 + 1)
649 #define MOD_VEX_AE_REG_2 (MOD_VEX_73_REG_7 + 1)
650 #define MOD_VEX_AE_REG_3 (MOD_VEX_AE_REG_2 + 1)
651 #define MOD_VEX_D7_PREFIX_2 (MOD_VEX_AE_REG_3 + 1)
652 #define MOD_VEX_E7_PREFIX_2 (MOD_VEX_D7_PREFIX_2 + 1)
653 #define MOD_VEX_F0_PREFIX_3 (MOD_VEX_E7_PREFIX_2 + 1)
654 #define MOD_VEX_3818_PREFIX_2 (MOD_VEX_F0_PREFIX_3 + 1)
655 #define MOD_VEX_3819_PREFIX_2 (MOD_VEX_3818_PREFIX_2 + 1)
656 #define MOD_VEX_381A_PREFIX_2 (MOD_VEX_3819_PREFIX_2 + 1)
657 #define MOD_VEX_382A_PREFIX_2 (MOD_VEX_381A_PREFIX_2 + 1)
658 #define MOD_VEX_382C_PREFIX_2 (MOD_VEX_382A_PREFIX_2 + 1)
659 #define MOD_VEX_382D_PREFIX_2 (MOD_VEX_382C_PREFIX_2 + 1)
660 #define MOD_VEX_382E_PREFIX_2 (MOD_VEX_382D_PREFIX_2 + 1)
661 #define MOD_VEX_382F_PREFIX_2 (MOD_VEX_382E_PREFIX_2 + 1)
663 #define RM_0F01_REG_0 0
664 #define RM_0F01_REG_1 (RM_0F01_REG_0 + 1)
665 #define RM_0F01_REG_2 (RM_0F01_REG_1 + 1)
666 #define RM_0F01_REG_3 (RM_0F01_REG_2 + 1)
667 #define RM_0F01_REG_7 (RM_0F01_REG_3 + 1)
668 #define RM_0FAE_REG_5 (RM_0F01_REG_7 + 1)
669 #define RM_0FAE_REG_6 (RM_0FAE_REG_5 + 1)
670 #define RM_0FAE_REG_7 (RM_0FAE_REG_6 + 1)
672 #define PREFIX_90 0
673 #define PREFIX_0F10 (PREFIX_90 + 1)
674 #define PREFIX_0F11 (PREFIX_0F10 + 1)
675 #define PREFIX_0F12 (PREFIX_0F11 + 1)
676 #define PREFIX_0F16 (PREFIX_0F12 + 1)
677 #define PREFIX_0F2A (PREFIX_0F16 + 1)
678 #define PREFIX_0F2B (PREFIX_0F2A + 1)
679 #define PREFIX_0F2C (PREFIX_0F2B + 1)
680 #define PREFIX_0F2D (PREFIX_0F2C + 1)
681 #define PREFIX_0F2E (PREFIX_0F2D + 1)
682 #define PREFIX_0F2F (PREFIX_0F2E + 1)
683 #define PREFIX_0F51 (PREFIX_0F2F + 1)
684 #define PREFIX_0F52 (PREFIX_0F51 + 1)
685 #define PREFIX_0F53 (PREFIX_0F52 + 1)
686 #define PREFIX_0F58 (PREFIX_0F53 + 1)
687 #define PREFIX_0F59 (PREFIX_0F58 + 1)
688 #define PREFIX_0F5A (PREFIX_0F59 + 1)
689 #define PREFIX_0F5B (PREFIX_0F5A + 1)
690 #define PREFIX_0F5C (PREFIX_0F5B + 1)
691 #define PREFIX_0F5D (PREFIX_0F5C + 1)
692 #define PREFIX_0F5E (PREFIX_0F5D + 1)
693 #define PREFIX_0F5F (PREFIX_0F5E + 1)
694 #define PREFIX_0F60 (PREFIX_0F5F + 1)
695 #define PREFIX_0F61 (PREFIX_0F60 + 1)
696 #define PREFIX_0F62 (PREFIX_0F61 + 1)
697 #define PREFIX_0F6C (PREFIX_0F62 + 1)
698 #define PREFIX_0F6D (PREFIX_0F6C + 1)
699 #define PREFIX_0F6F (PREFIX_0F6D + 1)
700 #define PREFIX_0F70 (PREFIX_0F6F + 1)
701 #define PREFIX_0F73_REG_3 (PREFIX_0F70 + 1)
702 #define PREFIX_0F73_REG_7 (PREFIX_0F73_REG_3 + 1)
703 #define PREFIX_0F78 (PREFIX_0F73_REG_7 + 1)
704 #define PREFIX_0F79 (PREFIX_0F78 + 1)
705 #define PREFIX_0F7C (PREFIX_0F79 + 1)
706 #define PREFIX_0F7D (PREFIX_0F7C + 1)
707 #define PREFIX_0F7E (PREFIX_0F7D + 1)
708 #define PREFIX_0F7F (PREFIX_0F7E + 1)
709 #define PREFIX_0FB8 (PREFIX_0F7F + 1)
710 #define PREFIX_0FBD (PREFIX_0FB8 + 1)
711 #define PREFIX_0FC2 (PREFIX_0FBD + 1)
712 #define PREFIX_0FC3 (PREFIX_0FC2 + 1)
713 #define PREFIX_0FC7_REG_6 (PREFIX_0FC3 + 1)
714 #define PREFIX_0FD0 (PREFIX_0FC7_REG_6 + 1)
715 #define PREFIX_0FD6 (PREFIX_0FD0 + 1)
716 #define PREFIX_0FE6 (PREFIX_0FD6 + 1)
717 #define PREFIX_0FE7 (PREFIX_0FE6 + 1)
718 #define PREFIX_0FF0 (PREFIX_0FE7 + 1)
719 #define PREFIX_0FF7 (PREFIX_0FF0 + 1)
720 #define PREFIX_0F3810 (PREFIX_0FF7 + 1)
721 #define PREFIX_0F3814 (PREFIX_0F3810 + 1)
722 #define PREFIX_0F3815 (PREFIX_0F3814 + 1)
723 #define PREFIX_0F3817 (PREFIX_0F3815 + 1)
724 #define PREFIX_0F3820 (PREFIX_0F3817 + 1)
725 #define PREFIX_0F3821 (PREFIX_0F3820 + 1)
726 #define PREFIX_0F3822 (PREFIX_0F3821 + 1)
727 #define PREFIX_0F3823 (PREFIX_0F3822 + 1)
728 #define PREFIX_0F3824 (PREFIX_0F3823 + 1)
729 #define PREFIX_0F3825 (PREFIX_0F3824 + 1)
730 #define PREFIX_0F3828 (PREFIX_0F3825 + 1)
731 #define PREFIX_0F3829 (PREFIX_0F3828 + 1)
732 #define PREFIX_0F382A (PREFIX_0F3829 + 1)
733 #define PREFIX_0F382B (PREFIX_0F382A + 1)
734 #define PREFIX_0F3830 (PREFIX_0F382B + 1)
735 #define PREFIX_0F3831 (PREFIX_0F3830 + 1)
736 #define PREFIX_0F3832 (PREFIX_0F3831 + 1)
737 #define PREFIX_0F3833 (PREFIX_0F3832 + 1)
738 #define PREFIX_0F3834 (PREFIX_0F3833 + 1)
739 #define PREFIX_0F3835 (PREFIX_0F3834 + 1)
740 #define PREFIX_0F3837 (PREFIX_0F3835 + 1)
741 #define PREFIX_0F3838 (PREFIX_0F3837 + 1)
742 #define PREFIX_0F3839 (PREFIX_0F3838 + 1)
743 #define PREFIX_0F383A (PREFIX_0F3839 + 1)
744 #define PREFIX_0F383B (PREFIX_0F383A + 1)
745 #define PREFIX_0F383C (PREFIX_0F383B + 1)
746 #define PREFIX_0F383D (PREFIX_0F383C + 1)
747 #define PREFIX_0F383E (PREFIX_0F383D + 1)
748 #define PREFIX_0F383F (PREFIX_0F383E + 1)
749 #define PREFIX_0F3840 (PREFIX_0F383F + 1)
750 #define PREFIX_0F3841 (PREFIX_0F3840 + 1)
751 #define PREFIX_0F3880 (PREFIX_0F3841 + 1)
752 #define PREFIX_0F3881 (PREFIX_0F3880 + 1)
753 #define PREFIX_0F38DB (PREFIX_0F3881 + 1)
754 #define PREFIX_0F38DC (PREFIX_0F38DB + 1)
755 #define PREFIX_0F38DD (PREFIX_0F38DC + 1)
756 #define PREFIX_0F38DE (PREFIX_0F38DD + 1)
757 #define PREFIX_0F38DF (PREFIX_0F38DE + 1)
758 #define PREFIX_0F38F0 (PREFIX_0F38DF + 1)
759 #define PREFIX_0F38F1 (PREFIX_0F38F0 + 1)
760 #define PREFIX_0F3A08 (PREFIX_0F38F1 + 1)
761 #define PREFIX_0F3A09 (PREFIX_0F3A08 + 1)
762 #define PREFIX_0F3A0A (PREFIX_0F3A09 + 1)
763 #define PREFIX_0F3A0B (PREFIX_0F3A0A + 1)
764 #define PREFIX_0F3A0C (PREFIX_0F3A0B + 1)
765 #define PREFIX_0F3A0D (PREFIX_0F3A0C + 1)
766 #define PREFIX_0F3A0E (PREFIX_0F3A0D + 1)
767 #define PREFIX_0F3A14 (PREFIX_0F3A0E + 1)
768 #define PREFIX_0F3A15 (PREFIX_0F3A14 + 1)
769 #define PREFIX_0F3A16 (PREFIX_0F3A15 + 1)
770 #define PREFIX_0F3A17 (PREFIX_0F3A16 + 1)
771 #define PREFIX_0F3A20 (PREFIX_0F3A17 + 1)
772 #define PREFIX_0F3A21 (PREFIX_0F3A20 + 1)
773 #define PREFIX_0F3A22 (PREFIX_0F3A21 + 1)
774 #define PREFIX_0F3A40 (PREFIX_0F3A22 + 1)
775 #define PREFIX_0F3A41 (PREFIX_0F3A40 + 1)
776 #define PREFIX_0F3A42 (PREFIX_0F3A41 + 1)
777 #define PREFIX_0F3A44 (PREFIX_0F3A42 + 1)
778 #define PREFIX_0F3A60 (PREFIX_0F3A44 + 1)
779 #define PREFIX_0F3A61 (PREFIX_0F3A60 + 1)
780 #define PREFIX_0F3A62 (PREFIX_0F3A61 + 1)
781 #define PREFIX_0F3A63 (PREFIX_0F3A62 + 1)
782 #define PREFIX_0F3ADF (PREFIX_0F3A63 + 1)
783 #define PREFIX_VEX_10 (PREFIX_0F3ADF + 1)
784 #define PREFIX_VEX_11 (PREFIX_VEX_10 + 1)
785 #define PREFIX_VEX_12 (PREFIX_VEX_11 + 1)
786 #define PREFIX_VEX_16 (PREFIX_VEX_12 + 1)
787 #define PREFIX_VEX_2A (PREFIX_VEX_16 + 1)
788 #define PREFIX_VEX_2C (PREFIX_VEX_2A + 1)
789 #define PREFIX_VEX_2D (PREFIX_VEX_2C + 1)
790 #define PREFIX_VEX_2E (PREFIX_VEX_2D + 1)
791 #define PREFIX_VEX_2F (PREFIX_VEX_2E + 1)
792 #define PREFIX_VEX_51 (PREFIX_VEX_2F + 1)
793 #define PREFIX_VEX_52 (PREFIX_VEX_51 + 1)
794 #define PREFIX_VEX_53 (PREFIX_VEX_52 + 1)
795 #define PREFIX_VEX_58 (PREFIX_VEX_53 + 1)
796 #define PREFIX_VEX_59 (PREFIX_VEX_58 + 1)
797 #define PREFIX_VEX_5A (PREFIX_VEX_59 + 1)
798 #define PREFIX_VEX_5B (PREFIX_VEX_5A + 1)
799 #define PREFIX_VEX_5C (PREFIX_VEX_5B + 1)
800 #define PREFIX_VEX_5D (PREFIX_VEX_5C + 1)
801 #define PREFIX_VEX_5E (PREFIX_VEX_5D + 1)
802 #define PREFIX_VEX_5F (PREFIX_VEX_5E + 1)
803 #define PREFIX_VEX_60 (PREFIX_VEX_5F + 1)
804 #define PREFIX_VEX_61 (PREFIX_VEX_60 + 1)
805 #define PREFIX_VEX_62 (PREFIX_VEX_61 + 1)
806 #define PREFIX_VEX_63 (PREFIX_VEX_62 + 1)
807 #define PREFIX_VEX_64 (PREFIX_VEX_63 + 1)
808 #define PREFIX_VEX_65 (PREFIX_VEX_64 + 1)
809 #define PREFIX_VEX_66 (PREFIX_VEX_65 + 1)
810 #define PREFIX_VEX_67 (PREFIX_VEX_66 + 1)
811 #define PREFIX_VEX_68 (PREFIX_VEX_67 + 1)
812 #define PREFIX_VEX_69 (PREFIX_VEX_68 + 1)
813 #define PREFIX_VEX_6A (PREFIX_VEX_69 + 1)
814 #define PREFIX_VEX_6B (PREFIX_VEX_6A + 1)
815 #define PREFIX_VEX_6C (PREFIX_VEX_6B + 1)
816 #define PREFIX_VEX_6D (PREFIX_VEX_6C + 1)
817 #define PREFIX_VEX_6E (PREFIX_VEX_6D + 1)
818 #define PREFIX_VEX_6F (PREFIX_VEX_6E + 1)
819 #define PREFIX_VEX_70 (PREFIX_VEX_6F + 1)
820 #define PREFIX_VEX_71_REG_2 (PREFIX_VEX_70 + 1)
821 #define PREFIX_VEX_71_REG_4 (PREFIX_VEX_71_REG_2 + 1)
822 #define PREFIX_VEX_71_REG_6 (PREFIX_VEX_71_REG_4 + 1)
823 #define PREFIX_VEX_72_REG_2 (PREFIX_VEX_71_REG_6 + 1)
824 #define PREFIX_VEX_72_REG_4 (PREFIX_VEX_72_REG_2 + 1)
825 #define PREFIX_VEX_72_REG_6 (PREFIX_VEX_72_REG_4 + 1)
826 #define PREFIX_VEX_73_REG_2 (PREFIX_VEX_72_REG_6 + 1)
827 #define PREFIX_VEX_73_REG_3 (PREFIX_VEX_73_REG_2 + 1)
828 #define PREFIX_VEX_73_REG_6 (PREFIX_VEX_73_REG_3 + 1)
829 #define PREFIX_VEX_73_REG_7 (PREFIX_VEX_73_REG_6 + 1)
830 #define PREFIX_VEX_74 (PREFIX_VEX_73_REG_7 + 1)
831 #define PREFIX_VEX_75 (PREFIX_VEX_74 + 1)
832 #define PREFIX_VEX_76 (PREFIX_VEX_75 + 1)
833 #define PREFIX_VEX_77 (PREFIX_VEX_76 + 1)
834 #define PREFIX_VEX_7C (PREFIX_VEX_77 + 1)
835 #define PREFIX_VEX_7D (PREFIX_VEX_7C + 1)
836 #define PREFIX_VEX_7E (PREFIX_VEX_7D + 1)
837 #define PREFIX_VEX_7F (PREFIX_VEX_7E + 1)
838 #define PREFIX_VEX_C2 (PREFIX_VEX_7F + 1)
839 #define PREFIX_VEX_C4 (PREFIX_VEX_C2 + 1)
840 #define PREFIX_VEX_C5 (PREFIX_VEX_C4 + 1)
841 #define PREFIX_VEX_D0 (PREFIX_VEX_C5 + 1)
842 #define PREFIX_VEX_D1 (PREFIX_VEX_D0 + 1)
843 #define PREFIX_VEX_D2 (PREFIX_VEX_D1 + 1)
844 #define PREFIX_VEX_D3 (PREFIX_VEX_D2 + 1)
845 #define PREFIX_VEX_D4 (PREFIX_VEX_D3 + 1)
846 #define PREFIX_VEX_D5 (PREFIX_VEX_D4 + 1)
847 #define PREFIX_VEX_D6 (PREFIX_VEX_D5 + 1)
848 #define PREFIX_VEX_D7 (PREFIX_VEX_D6 + 1)
849 #define PREFIX_VEX_D8 (PREFIX_VEX_D7 + 1)
850 #define PREFIX_VEX_D9 (PREFIX_VEX_D8 + 1)
851 #define PREFIX_VEX_DA (PREFIX_VEX_D9 + 1)
852 #define PREFIX_VEX_DB (PREFIX_VEX_DA + 1)
853 #define PREFIX_VEX_DC (PREFIX_VEX_DB + 1)
854 #define PREFIX_VEX_DD (PREFIX_VEX_DC + 1)
855 #define PREFIX_VEX_DE (PREFIX_VEX_DD + 1)
856 #define PREFIX_VEX_DF (PREFIX_VEX_DE + 1)
857 #define PREFIX_VEX_E0 (PREFIX_VEX_DF + 1)
858 #define PREFIX_VEX_E1 (PREFIX_VEX_E0 + 1)
859 #define PREFIX_VEX_E2 (PREFIX_VEX_E1 + 1)
860 #define PREFIX_VEX_E3 (PREFIX_VEX_E2 + 1)
861 #define PREFIX_VEX_E4 (PREFIX_VEX_E3 + 1)
862 #define PREFIX_VEX_E5 (PREFIX_VEX_E4 + 1)
863 #define PREFIX_VEX_E6 (PREFIX_VEX_E5 + 1)
864 #define PREFIX_VEX_E7 (PREFIX_VEX_E6 + 1)
865 #define PREFIX_VEX_E8 (PREFIX_VEX_E7 + 1)
866 #define PREFIX_VEX_E9 (PREFIX_VEX_E8 + 1)
867 #define PREFIX_VEX_EA (PREFIX_VEX_E9 + 1)
868 #define PREFIX_VEX_EB (PREFIX_VEX_EA + 1)
869 #define PREFIX_VEX_EC (PREFIX_VEX_EB + 1)
870 #define PREFIX_VEX_ED (PREFIX_VEX_EC + 1)
871 #define PREFIX_VEX_EE (PREFIX_VEX_ED + 1)
872 #define PREFIX_VEX_EF (PREFIX_VEX_EE + 1)
873 #define PREFIX_VEX_F0 (PREFIX_VEX_EF + 1)
874 #define PREFIX_VEX_F1 (PREFIX_VEX_F0 + 1)
875 #define PREFIX_VEX_F2 (PREFIX_VEX_F1 + 1)
876 #define PREFIX_VEX_F3 (PREFIX_VEX_F2 + 1)
877 #define PREFIX_VEX_F4 (PREFIX_VEX_F3 + 1)
878 #define PREFIX_VEX_F5 (PREFIX_VEX_F4 + 1)
879 #define PREFIX_VEX_F6 (PREFIX_VEX_F5 + 1)
880 #define PREFIX_VEX_F7 (PREFIX_VEX_F6 + 1)
881 #define PREFIX_VEX_F8 (PREFIX_VEX_F7 + 1)
882 #define PREFIX_VEX_F9 (PREFIX_VEX_F8 + 1)
883 #define PREFIX_VEX_FA (PREFIX_VEX_F9 + 1)
884 #define PREFIX_VEX_FB (PREFIX_VEX_FA + 1)
885 #define PREFIX_VEX_FC (PREFIX_VEX_FB + 1)
886 #define PREFIX_VEX_FD (PREFIX_VEX_FC + 1)
887 #define PREFIX_VEX_FE (PREFIX_VEX_FD + 1)
888 #define PREFIX_VEX_3800 (PREFIX_VEX_FE + 1)
889 #define PREFIX_VEX_3801 (PREFIX_VEX_3800 + 1)
890 #define PREFIX_VEX_3802 (PREFIX_VEX_3801 + 1)
891 #define PREFIX_VEX_3803 (PREFIX_VEX_3802 + 1)
892 #define PREFIX_VEX_3804 (PREFIX_VEX_3803 + 1)
893 #define PREFIX_VEX_3805 (PREFIX_VEX_3804 + 1)
894 #define PREFIX_VEX_3806 (PREFIX_VEX_3805 + 1)
895 #define PREFIX_VEX_3807 (PREFIX_VEX_3806 + 1)
896 #define PREFIX_VEX_3808 (PREFIX_VEX_3807 + 1)
897 #define PREFIX_VEX_3809 (PREFIX_VEX_3808 + 1)
898 #define PREFIX_VEX_380A (PREFIX_VEX_3809 + 1)
899 #define PREFIX_VEX_380B (PREFIX_VEX_380A + 1)
900 #define PREFIX_VEX_380C (PREFIX_VEX_380B + 1)
901 #define PREFIX_VEX_380D (PREFIX_VEX_380C + 1)
902 #define PREFIX_VEX_380E (PREFIX_VEX_380D + 1)
903 #define PREFIX_VEX_380F (PREFIX_VEX_380E + 1)
904 #define PREFIX_VEX_3817 (PREFIX_VEX_380F + 1)
905 #define PREFIX_VEX_3818 (PREFIX_VEX_3817 + 1)
906 #define PREFIX_VEX_3819 (PREFIX_VEX_3818 + 1)
907 #define PREFIX_VEX_381A (PREFIX_VEX_3819 + 1)
908 #define PREFIX_VEX_381C (PREFIX_VEX_381A + 1)
909 #define PREFIX_VEX_381D (PREFIX_VEX_381C + 1)
910 #define PREFIX_VEX_381E (PREFIX_VEX_381D + 1)
911 #define PREFIX_VEX_3820 (PREFIX_VEX_381E + 1)
912 #define PREFIX_VEX_3821 (PREFIX_VEX_3820 + 1)
913 #define PREFIX_VEX_3822 (PREFIX_VEX_3821 + 1)
914 #define PREFIX_VEX_3823 (PREFIX_VEX_3822 + 1)
915 #define PREFIX_VEX_3824 (PREFIX_VEX_3823 + 1)
916 #define PREFIX_VEX_3825 (PREFIX_VEX_3824 + 1)
917 #define PREFIX_VEX_3828 (PREFIX_VEX_3825 + 1)
918 #define PREFIX_VEX_3829 (PREFIX_VEX_3828 + 1)
919 #define PREFIX_VEX_382A (PREFIX_VEX_3829 + 1)
920 #define PREFIX_VEX_382B (PREFIX_VEX_382A + 1)
921 #define PREFIX_VEX_382C (PREFIX_VEX_382B + 1)
922 #define PREFIX_VEX_382D (PREFIX_VEX_382C + 1)
923 #define PREFIX_VEX_382E (PREFIX_VEX_382D + 1)
924 #define PREFIX_VEX_382F (PREFIX_VEX_382E + 1)
925 #define PREFIX_VEX_3830 (PREFIX_VEX_382F + 1)
926 #define PREFIX_VEX_3831 (PREFIX_VEX_3830 + 1)
927 #define PREFIX_VEX_3832 (PREFIX_VEX_3831 + 1)
928 #define PREFIX_VEX_3833 (PREFIX_VEX_3832 + 1)
929 #define PREFIX_VEX_3834 (PREFIX_VEX_3833 + 1)
930 #define PREFIX_VEX_3835 (PREFIX_VEX_3834 + 1)
931 #define PREFIX_VEX_3837 (PREFIX_VEX_3835 + 1)
932 #define PREFIX_VEX_3838 (PREFIX_VEX_3837 + 1)
933 #define PREFIX_VEX_3839 (PREFIX_VEX_3838 + 1)
934 #define PREFIX_VEX_383A (PREFIX_VEX_3839 + 1)
935 #define PREFIX_VEX_383B (PREFIX_VEX_383A + 1)
936 #define PREFIX_VEX_383C (PREFIX_VEX_383B + 1)
937 #define PREFIX_VEX_383D (PREFIX_VEX_383C + 1)
938 #define PREFIX_VEX_383E (PREFIX_VEX_383D + 1)
939 #define PREFIX_VEX_383F (PREFIX_VEX_383E + 1)
940 #define PREFIX_VEX_3840 (PREFIX_VEX_383F + 1)
941 #define PREFIX_VEX_3841 (PREFIX_VEX_3840 + 1)
942 #define PREFIX_VEX_38DB (PREFIX_VEX_3841 + 1)
943 #define PREFIX_VEX_38DC (PREFIX_VEX_38DB + 1)
944 #define PREFIX_VEX_38DD (PREFIX_VEX_38DC + 1)
945 #define PREFIX_VEX_38DE (PREFIX_VEX_38DD + 1)
946 #define PREFIX_VEX_38DF (PREFIX_VEX_38DE + 1)
947 #define PREFIX_VEX_3A04 (PREFIX_VEX_38DF + 1)
948 #define PREFIX_VEX_3A05 (PREFIX_VEX_3A04 + 1)
949 #define PREFIX_VEX_3A06 (PREFIX_VEX_3A05 + 1)
950 #define PREFIX_VEX_3A08 (PREFIX_VEX_3A06 + 1)
951 #define PREFIX_VEX_3A09 (PREFIX_VEX_3A08 + 1)
952 #define PREFIX_VEX_3A0A (PREFIX_VEX_3A09 + 1)
953 #define PREFIX_VEX_3A0B (PREFIX_VEX_3A0A + 1)
954 #define PREFIX_VEX_3A0C (PREFIX_VEX_3A0B + 1)
955 #define PREFIX_VEX_3A0D (PREFIX_VEX_3A0C + 1)
956 #define PREFIX_VEX_3A0E (PREFIX_VEX_3A0D + 1)
957 #define PREFIX_VEX_3A0F (PREFIX_VEX_3A0E + 1)
958 #define PREFIX_VEX_3A14 (PREFIX_VEX_3A0F + 1)
959 #define PREFIX_VEX_3A15 (PREFIX_VEX_3A14 + 1)
960 #define PREFIX_VEX_3A16 (PREFIX_VEX_3A15 + 1)
961 #define PREFIX_VEX_3A17 (PREFIX_VEX_3A16 + 1)
962 #define PREFIX_VEX_3A18 (PREFIX_VEX_3A17 + 1)
963 #define PREFIX_VEX_3A19 (PREFIX_VEX_3A18 + 1)
964 #define PREFIX_VEX_3A20 (PREFIX_VEX_3A19 + 1)
965 #define PREFIX_VEX_3A21 (PREFIX_VEX_3A20 + 1)
966 #define PREFIX_VEX_3A22 (PREFIX_VEX_3A21 + 1)
967 #define PREFIX_VEX_3A40 (PREFIX_VEX_3A22 + 1)
968 #define PREFIX_VEX_3A41 (PREFIX_VEX_3A40 + 1)
969 #define PREFIX_VEX_3A42 (PREFIX_VEX_3A41 + 1)
970 #define PREFIX_VEX_3A48 (PREFIX_VEX_3A42 + 1)
971 #define PREFIX_VEX_3A49 (PREFIX_VEX_3A48 + 1)
972 #define PREFIX_VEX_3A4A (PREFIX_VEX_3A49 + 1)
973 #define PREFIX_VEX_3A4B (PREFIX_VEX_3A4A + 1)
974 #define PREFIX_VEX_3A4C (PREFIX_VEX_3A4B + 1)
975 #define PREFIX_VEX_3A5C (PREFIX_VEX_3A4C + 1)
976 #define PREFIX_VEX_3A5D (PREFIX_VEX_3A5C + 1)
977 #define PREFIX_VEX_3A5E (PREFIX_VEX_3A5D + 1)
978 #define PREFIX_VEX_3A5F (PREFIX_VEX_3A5E + 1)
979 #define PREFIX_VEX_3A60 (PREFIX_VEX_3A5F + 1)
980 #define PREFIX_VEX_3A61 (PREFIX_VEX_3A60 + 1)
981 #define PREFIX_VEX_3A62 (PREFIX_VEX_3A61 + 1)
982 #define PREFIX_VEX_3A63 (PREFIX_VEX_3A62 + 1)
983 #define PREFIX_VEX_3A68 (PREFIX_VEX_3A63 + 1)
984 #define PREFIX_VEX_3A69 (PREFIX_VEX_3A68 + 1)
985 #define PREFIX_VEX_3A6A (PREFIX_VEX_3A69 + 1)
986 #define PREFIX_VEX_3A6B (PREFIX_VEX_3A6A + 1)
987 #define PREFIX_VEX_3A6C (PREFIX_VEX_3A6B + 1)
988 #define PREFIX_VEX_3A6D (PREFIX_VEX_3A6C + 1)
989 #define PREFIX_VEX_3A6E (PREFIX_VEX_3A6D + 1)
990 #define PREFIX_VEX_3A6F (PREFIX_VEX_3A6E + 1)
991 #define PREFIX_VEX_3A78 (PREFIX_VEX_3A6F + 1)
992 #define PREFIX_VEX_3A79 (PREFIX_VEX_3A78 + 1)
993 #define PREFIX_VEX_3A7A (PREFIX_VEX_3A79 + 1)
994 #define PREFIX_VEX_3A7B (PREFIX_VEX_3A7A + 1)
995 #define PREFIX_VEX_3A7C (PREFIX_VEX_3A7B + 1)
996 #define PREFIX_VEX_3A7D (PREFIX_VEX_3A7C + 1)
997 #define PREFIX_VEX_3A7E (PREFIX_VEX_3A7D + 1)
998 #define PREFIX_VEX_3A7F (PREFIX_VEX_3A7E + 1)
999 #define PREFIX_VEX_3ADF (PREFIX_VEX_3A7F + 1)
1001 #define X86_64_06 0
1002 #define X86_64_07 (X86_64_06 + 1)
1003 #define X86_64_0D (X86_64_07 + 1)
1004 #define X86_64_16 (X86_64_0D + 1)
1005 #define X86_64_17 (X86_64_16 + 1)
1006 #define X86_64_1E (X86_64_17 + 1)
1007 #define X86_64_1F (X86_64_1E + 1)
1008 #define X86_64_27 (X86_64_1F + 1)
1009 #define X86_64_2F (X86_64_27 + 1)
1010 #define X86_64_37 (X86_64_2F + 1)
1011 #define X86_64_3F (X86_64_37 + 1)
1012 #define X86_64_60 (X86_64_3F + 1)
1013 #define X86_64_61 (X86_64_60 + 1)
1014 #define X86_64_62 (X86_64_61 + 1)
1015 #define X86_64_63 (X86_64_62 + 1)
1016 #define X86_64_6D (X86_64_63 + 1)
1017 #define X86_64_6F (X86_64_6D + 1)
1018 #define X86_64_9A (X86_64_6F + 1)
1019 #define X86_64_C4 (X86_64_9A + 1)
1020 #define X86_64_C5 (X86_64_C4 + 1)
1021 #define X86_64_CE (X86_64_C5 + 1)
1022 #define X86_64_D4 (X86_64_CE + 1)
1023 #define X86_64_D5 (X86_64_D4 + 1)
1024 #define X86_64_EA (X86_64_D5 + 1)
1025 #define X86_64_0F01_REG_0 (X86_64_EA + 1)
1026 #define X86_64_0F01_REG_1 (X86_64_0F01_REG_0 + 1)
1027 #define X86_64_0F01_REG_2 (X86_64_0F01_REG_1 + 1)
1028 #define X86_64_0F01_REG_3 (X86_64_0F01_REG_2 + 1)
1030 #define THREE_BYTE_0F24 0
1031 #define THREE_BYTE_0F25 (THREE_BYTE_0F24 + 1)
1032 #define THREE_BYTE_0F38 (THREE_BYTE_0F25 + 1)
1033 #define THREE_BYTE_0F3A (THREE_BYTE_0F38 + 1)
1034 #define THREE_BYTE_0F7A (THREE_BYTE_0F3A + 1)
1035 #define THREE_BYTE_0F7B (THREE_BYTE_0F7A + 1)
1037 #define VEX_0F 0
1038 #define VEX_0F38 (VEX_0F + 1)
1039 #define VEX_0F3A (VEX_0F38 + 1)
1041 #define VEX_LEN_10_P_1 0
1042 #define VEX_LEN_10_P_3 (VEX_LEN_10_P_1 + 1)
1043 #define VEX_LEN_11_P_1 (VEX_LEN_10_P_3 + 1)
1044 #define VEX_LEN_11_P_3 (VEX_LEN_11_P_1 + 1)
1045 #define VEX_LEN_12_P_0_M_0 (VEX_LEN_11_P_3 + 1)
1046 #define VEX_LEN_12_P_0_M_1 (VEX_LEN_12_P_0_M_0 + 1)
1047 #define VEX_LEN_12_P_2 (VEX_LEN_12_P_0_M_1 + 1)
1048 #define VEX_LEN_13_M_0 (VEX_LEN_12_P_2 + 1)
1049 #define VEX_LEN_16_P_0_M_0 (VEX_LEN_13_M_0 + 1)
1050 #define VEX_LEN_16_P_0_M_1 (VEX_LEN_16_P_0_M_0 + 1)
1051 #define VEX_LEN_16_P_2 (VEX_LEN_16_P_0_M_1 + 1)
1052 #define VEX_LEN_17_M_0 (VEX_LEN_16_P_2 + 1)
1053 #define VEX_LEN_2A_P_1 (VEX_LEN_17_M_0 + 1)
1054 #define VEX_LEN_2A_P_3 (VEX_LEN_2A_P_1 + 1)
1055 #define VEX_LEN_2B_M_0 (VEX_LEN_2A_P_3 + 1)
1056 #define VEX_LEN_2C_P_1 (VEX_LEN_2B_M_0 + 1)
1057 #define VEX_LEN_2C_P_3 (VEX_LEN_2C_P_1 + 1)
1058 #define VEX_LEN_2D_P_1 (VEX_LEN_2C_P_3 + 1)
1059 #define VEX_LEN_2D_P_3 (VEX_LEN_2D_P_1 + 1)
1060 #define VEX_LEN_2E_P_0 (VEX_LEN_2D_P_3 + 1)
1061 #define VEX_LEN_2E_P_2 (VEX_LEN_2E_P_0 + 1)
1062 #define VEX_LEN_2F_P_0 (VEX_LEN_2E_P_2 + 1)
1063 #define VEX_LEN_2F_P_2 (VEX_LEN_2F_P_0 + 1)
1064 #define VEX_LEN_51_P_1 (VEX_LEN_2F_P_2 + 1)
1065 #define VEX_LEN_51_P_3 (VEX_LEN_51_P_1 + 1)
1066 #define VEX_LEN_52_P_1 (VEX_LEN_51_P_3 + 1)
1067 #define VEX_LEN_53_P_1 (VEX_LEN_52_P_1 + 1)
1068 #define VEX_LEN_58_P_1 (VEX_LEN_53_P_1 + 1)
1069 #define VEX_LEN_58_P_3 (VEX_LEN_58_P_1 + 1)
1070 #define VEX_LEN_59_P_1 (VEX_LEN_58_P_3 + 1)
1071 #define VEX_LEN_59_P_3 (VEX_LEN_59_P_1 + 1)
1072 #define VEX_LEN_5A_P_1 (VEX_LEN_59_P_3 + 1)
1073 #define VEX_LEN_5A_P_3 (VEX_LEN_5A_P_1 + 1)
1074 #define VEX_LEN_5C_P_1 (VEX_LEN_5A_P_3 + 1)
1075 #define VEX_LEN_5C_P_3 (VEX_LEN_5C_P_1 + 1)
1076 #define VEX_LEN_5D_P_1 (VEX_LEN_5C_P_3 + 1)
1077 #define VEX_LEN_5D_P_3 (VEX_LEN_5D_P_1 + 1)
1078 #define VEX_LEN_5E_P_1 (VEX_LEN_5D_P_3 + 1)
1079 #define VEX_LEN_5E_P_3 (VEX_LEN_5E_P_1 + 1)
1080 #define VEX_LEN_5F_P_1 (VEX_LEN_5E_P_3 + 1)
1081 #define VEX_LEN_5F_P_3 (VEX_LEN_5F_P_1 + 1)
1082 #define VEX_LEN_60_P_2 (VEX_LEN_5F_P_3 + 1)
1083 #define VEX_LEN_61_P_2 (VEX_LEN_60_P_2 + 1)
1084 #define VEX_LEN_62_P_2 (VEX_LEN_61_P_2 + 1)
1085 #define VEX_LEN_63_P_2 (VEX_LEN_62_P_2 + 1)
1086 #define VEX_LEN_64_P_2 (VEX_LEN_63_P_2 + 1)
1087 #define VEX_LEN_65_P_2 (VEX_LEN_64_P_2 + 1)
1088 #define VEX_LEN_66_P_2 (VEX_LEN_65_P_2 + 1)
1089 #define VEX_LEN_67_P_2 (VEX_LEN_66_P_2 + 1)
1090 #define VEX_LEN_68_P_2 (VEX_LEN_67_P_2 + 1)
1091 #define VEX_LEN_69_P_2 (VEX_LEN_68_P_2 + 1)
1092 #define VEX_LEN_6A_P_2 (VEX_LEN_69_P_2 + 1)
1093 #define VEX_LEN_6B_P_2 (VEX_LEN_6A_P_2 + 1)
1094 #define VEX_LEN_6C_P_2 (VEX_LEN_6B_P_2 + 1)
1095 #define VEX_LEN_6D_P_2 (VEX_LEN_6C_P_2 + 1)
1096 #define VEX_LEN_6E_P_2 (VEX_LEN_6D_P_2 + 1)
1097 #define VEX_LEN_70_P_1 (VEX_LEN_6E_P_2 + 1)
1098 #define VEX_LEN_70_P_2 (VEX_LEN_70_P_1 + 1)
1099 #define VEX_LEN_70_P_3 (VEX_LEN_70_P_2 + 1)
1100 #define VEX_LEN_71_R_2_P_2 (VEX_LEN_70_P_3 + 1)
1101 #define VEX_LEN_71_R_4_P_2 (VEX_LEN_71_R_2_P_2 + 1)
1102 #define VEX_LEN_71_R_6_P_2 (VEX_LEN_71_R_4_P_2 + 1)
1103 #define VEX_LEN_72_R_2_P_2 (VEX_LEN_71_R_6_P_2 + 1)
1104 #define VEX_LEN_72_R_4_P_2 (VEX_LEN_72_R_2_P_2 + 1)
1105 #define VEX_LEN_72_R_6_P_2 (VEX_LEN_72_R_4_P_2 + 1)
1106 #define VEX_LEN_73_R_2_P_2 (VEX_LEN_72_R_6_P_2 + 1)
1107 #define VEX_LEN_73_R_3_P_2 (VEX_LEN_73_R_2_P_2 + 1)
1108 #define VEX_LEN_73_R_6_P_2 (VEX_LEN_73_R_3_P_2 + 1)
1109 #define VEX_LEN_73_R_7_P_2 (VEX_LEN_73_R_6_P_2 + 1)
1110 #define VEX_LEN_74_P_2 (VEX_LEN_73_R_7_P_2 + 1)
1111 #define VEX_LEN_75_P_2 (VEX_LEN_74_P_2 + 1)
1112 #define VEX_LEN_76_P_2 (VEX_LEN_75_P_2 + 1)
1113 #define VEX_LEN_7E_P_1 (VEX_LEN_76_P_2 + 1)
1114 #define VEX_LEN_7E_P_2 (VEX_LEN_7E_P_1 + 1)
1115 #define VEX_LEN_AE_R_2_M_0 (VEX_LEN_7E_P_2 + 1)
1116 #define VEX_LEN_AE_R_3_M_0 (VEX_LEN_AE_R_2_M_0 + 1)
1117 #define VEX_LEN_C2_P_1 (VEX_LEN_AE_R_3_M_0 + 1)
1118 #define VEX_LEN_C2_P_3 (VEX_LEN_C2_P_1 + 1)
1119 #define VEX_LEN_C4_P_2 (VEX_LEN_C2_P_3 + 1)
1120 #define VEX_LEN_C5_P_2 (VEX_LEN_C4_P_2 + 1)
1121 #define VEX_LEN_D1_P_2 (VEX_LEN_C5_P_2 + 1)
1122 #define VEX_LEN_D2_P_2 (VEX_LEN_D1_P_2 + 1)
1123 #define VEX_LEN_D3_P_2 (VEX_LEN_D2_P_2 + 1)
1124 #define VEX_LEN_D4_P_2 (VEX_LEN_D3_P_2 + 1)
1125 #define VEX_LEN_D5_P_2 (VEX_LEN_D4_P_2 + 1)
1126 #define VEX_LEN_D6_P_2 (VEX_LEN_D5_P_2 + 1)
1127 #define VEX_LEN_D7_P_2_M_1 (VEX_LEN_D6_P_2 + 1)
1128 #define VEX_LEN_D8_P_2 (VEX_LEN_D7_P_2_M_1 + 1)
1129 #define VEX_LEN_D9_P_2 (VEX_LEN_D8_P_2 + 1)
1130 #define VEX_LEN_DA_P_2 (VEX_LEN_D9_P_2 + 1)
1131 #define VEX_LEN_DB_P_2 (VEX_LEN_DA_P_2 + 1)
1132 #define VEX_LEN_DC_P_2 (VEX_LEN_DB_P_2 + 1)
1133 #define VEX_LEN_DD_P_2 (VEX_LEN_DC_P_2 + 1)
1134 #define VEX_LEN_DE_P_2 (VEX_LEN_DD_P_2 + 1)
1135 #define VEX_LEN_DF_P_2 (VEX_LEN_DE_P_2 + 1)
1136 #define VEX_LEN_E0_P_2 (VEX_LEN_DF_P_2 + 1)
1137 #define VEX_LEN_E1_P_2 (VEX_LEN_E0_P_2 + 1)
1138 #define VEX_LEN_E2_P_2 (VEX_LEN_E1_P_2 + 1)
1139 #define VEX_LEN_E3_P_2 (VEX_LEN_E2_P_2 + 1)
1140 #define VEX_LEN_E4_P_2 (VEX_LEN_E3_P_2 + 1)
1141 #define VEX_LEN_E5_P_2 (VEX_LEN_E4_P_2 + 1)
1142 #define VEX_LEN_E7_P_2_M_0 (VEX_LEN_E5_P_2 + 1)
1143 #define VEX_LEN_E8_P_2 (VEX_LEN_E7_P_2_M_0 + 1)
1144 #define VEX_LEN_E9_P_2 (VEX_LEN_E8_P_2 + 1)
1145 #define VEX_LEN_EA_P_2 (VEX_LEN_E9_P_2 + 1)
1146 #define VEX_LEN_EB_P_2 (VEX_LEN_EA_P_2 + 1)
1147 #define VEX_LEN_EC_P_2 (VEX_LEN_EB_P_2 + 1)
1148 #define VEX_LEN_ED_P_2 (VEX_LEN_EC_P_2 + 1)
1149 #define VEX_LEN_EE_P_2 (VEX_LEN_ED_P_2 + 1)
1150 #define VEX_LEN_EF_P_2 (VEX_LEN_EE_P_2 + 1)
1151 #define VEX_LEN_F1_P_2 (VEX_LEN_EF_P_2 + 1)
1152 #define VEX_LEN_F2_P_2 (VEX_LEN_F1_P_2 + 1)
1153 #define VEX_LEN_F3_P_2 (VEX_LEN_F2_P_2 + 1)
1154 #define VEX_LEN_F4_P_2 (VEX_LEN_F3_P_2 + 1)
1155 #define VEX_LEN_F5_P_2 (VEX_LEN_F4_P_2 + 1)
1156 #define VEX_LEN_F6_P_2 (VEX_LEN_F5_P_2 + 1)
1157 #define VEX_LEN_F7_P_2 (VEX_LEN_F6_P_2 + 1)
1158 #define VEX_LEN_F8_P_2 (VEX_LEN_F7_P_2 + 1)
1159 #define VEX_LEN_F9_P_2 (VEX_LEN_F8_P_2 + 1)
1160 #define VEX_LEN_FA_P_2 (VEX_LEN_F9_P_2 + 1)
1161 #define VEX_LEN_FB_P_2 (VEX_LEN_FA_P_2 + 1)
1162 #define VEX_LEN_FC_P_2 (VEX_LEN_FB_P_2 + 1)
1163 #define VEX_LEN_FD_P_2 (VEX_LEN_FC_P_2 + 1)
1164 #define VEX_LEN_FE_P_2 (VEX_LEN_FD_P_2 + 1)
1165 #define VEX_LEN_3800_P_2 (VEX_LEN_FE_P_2 + 1)
1166 #define VEX_LEN_3801_P_2 (VEX_LEN_3800_P_2 + 1)
1167 #define VEX_LEN_3802_P_2 (VEX_LEN_3801_P_2 + 1)
1168 #define VEX_LEN_3803_P_2 (VEX_LEN_3802_P_2 + 1)
1169 #define VEX_LEN_3804_P_2 (VEX_LEN_3803_P_2 + 1)
1170 #define VEX_LEN_3805_P_2 (VEX_LEN_3804_P_2 + 1)
1171 #define VEX_LEN_3806_P_2 (VEX_LEN_3805_P_2 + 1)
1172 #define VEX_LEN_3807_P_2 (VEX_LEN_3806_P_2 + 1)
1173 #define VEX_LEN_3808_P_2 (VEX_LEN_3807_P_2 + 1)
1174 #define VEX_LEN_3809_P_2 (VEX_LEN_3808_P_2 + 1)
1175 #define VEX_LEN_380A_P_2 (VEX_LEN_3809_P_2 + 1)
1176 #define VEX_LEN_380B_P_2 (VEX_LEN_380A_P_2 + 1)
1177 #define VEX_LEN_3819_P_2_M_0 (VEX_LEN_380B_P_2 + 1)
1178 #define VEX_LEN_381A_P_2_M_0 (VEX_LEN_3819_P_2_M_0 + 1)
1179 #define VEX_LEN_381C_P_2 (VEX_LEN_381A_P_2_M_0 + 1)
1180 #define VEX_LEN_381D_P_2 (VEX_LEN_381C_P_2 + 1)
1181 #define VEX_LEN_381E_P_2 (VEX_LEN_381D_P_2 + 1)
1182 #define VEX_LEN_3820_P_2 (VEX_LEN_381E_P_2 + 1)
1183 #define VEX_LEN_3821_P_2 (VEX_LEN_3820_P_2 + 1)
1184 #define VEX_LEN_3822_P_2 (VEX_LEN_3821_P_2 + 1)
1185 #define VEX_LEN_3823_P_2 (VEX_LEN_3822_P_2 + 1)
1186 #define VEX_LEN_3824_P_2 (VEX_LEN_3823_P_2 + 1)
1187 #define VEX_LEN_3825_P_2 (VEX_LEN_3824_P_2 + 1)
1188 #define VEX_LEN_3828_P_2 (VEX_LEN_3825_P_2 + 1)
1189 #define VEX_LEN_3829_P_2 (VEX_LEN_3828_P_2 + 1)
1190 #define VEX_LEN_382A_P_2_M_0 (VEX_LEN_3829_P_2 + 1)
1191 #define VEX_LEN_382B_P_2 (VEX_LEN_382A_P_2_M_0 + 1)
1192 #define VEX_LEN_3830_P_2 (VEX_LEN_382B_P_2 + 1)
1193 #define VEX_LEN_3831_P_2 (VEX_LEN_3830_P_2 + 1)
1194 #define VEX_LEN_3832_P_2 (VEX_LEN_3831_P_2 + 1)
1195 #define VEX_LEN_3833_P_2 (VEX_LEN_3832_P_2 + 1)
1196 #define VEX_LEN_3834_P_2 (VEX_LEN_3833_P_2 + 1)
1197 #define VEX_LEN_3835_P_2 (VEX_LEN_3834_P_2 + 1)
1198 #define VEX_LEN_3837_P_2 (VEX_LEN_3835_P_2 + 1)
1199 #define VEX_LEN_3838_P_2 (VEX_LEN_3837_P_2 + 1)
1200 #define VEX_LEN_3839_P_2 (VEX_LEN_3838_P_2 + 1)
1201 #define VEX_LEN_383A_P_2 (VEX_LEN_3839_P_2 + 1)
1202 #define VEX_LEN_383B_P_2 (VEX_LEN_383A_P_2 + 1)
1203 #define VEX_LEN_383C_P_2 (VEX_LEN_383B_P_2 + 1)
1204 #define VEX_LEN_383D_P_2 (VEX_LEN_383C_P_2 + 1)
1205 #define VEX_LEN_383E_P_2 (VEX_LEN_383D_P_2 + 1)
1206 #define VEX_LEN_383F_P_2 (VEX_LEN_383E_P_2 + 1)
1207 #define VEX_LEN_3840_P_2 (VEX_LEN_383F_P_2 + 1)
1208 #define VEX_LEN_3841_P_2 (VEX_LEN_3840_P_2 + 1)
1209 #define VEX_LEN_38DB_P_2 (VEX_LEN_3841_P_2 + 1)
1210 #define VEX_LEN_38DC_P_2 (VEX_LEN_38DB_P_2 + 1)
1211 #define VEX_LEN_38DD_P_2 (VEX_LEN_38DC_P_2 + 1)
1212 #define VEX_LEN_38DE_P_2 (VEX_LEN_38DD_P_2 + 1)
1213 #define VEX_LEN_38DF_P_2 (VEX_LEN_38DE_P_2 + 1)
1214 #define VEX_LEN_3A06_P_2 (VEX_LEN_38DF_P_2 + 1)
1215 #define VEX_LEN_3A0A_P_2 (VEX_LEN_3A06_P_2 + 1)
1216 #define VEX_LEN_3A0B_P_2 (VEX_LEN_3A0A_P_2 + 1)
1217 #define VEX_LEN_3A0E_P_2 (VEX_LEN_3A0B_P_2 + 1)
1218 #define VEX_LEN_3A0F_P_2 (VEX_LEN_3A0E_P_2 + 1)
1219 #define VEX_LEN_3A14_P_2 (VEX_LEN_3A0F_P_2 + 1)
1220 #define VEX_LEN_3A15_P_2 (VEX_LEN_3A14_P_2 + 1)
1221 #define VEX_LEN_3A16_P_2 (VEX_LEN_3A15_P_2 + 1)
1222 #define VEX_LEN_3A17_P_2 (VEX_LEN_3A16_P_2 + 1)
1223 #define VEX_LEN_3A18_P_2 (VEX_LEN_3A17_P_2 + 1)
1224 #define VEX_LEN_3A19_P_2 (VEX_LEN_3A18_P_2 + 1)
1225 #define VEX_LEN_3A20_P_2 (VEX_LEN_3A19_P_2 + 1)
1226 #define VEX_LEN_3A21_P_2 (VEX_LEN_3A20_P_2 + 1)
1227 #define VEX_LEN_3A22_P_2 (VEX_LEN_3A21_P_2 + 1)
1228 #define VEX_LEN_3A41_P_2 (VEX_LEN_3A22_P_2 + 1)
1229 #define VEX_LEN_3A42_P_2 (VEX_LEN_3A41_P_2 + 1)
1230 #define VEX_LEN_3A4C_P_2 (VEX_LEN_3A42_P_2 + 1)
1231 #define VEX_LEN_3A60_P_2 (VEX_LEN_3A4C_P_2 + 1)
1232 #define VEX_LEN_3A61_P_2 (VEX_LEN_3A60_P_2 + 1)
1233 #define VEX_LEN_3A62_P_2 (VEX_LEN_3A61_P_2 + 1)
1234 #define VEX_LEN_3A63_P_2 (VEX_LEN_3A62_P_2 + 1)
1235 #define VEX_LEN_3A6A_P_2 (VEX_LEN_3A63_P_2 + 1)
1236 #define VEX_LEN_3A6B_P_2 (VEX_LEN_3A6A_P_2 + 1)
1237 #define VEX_LEN_3A6E_P_2 (VEX_LEN_3A6B_P_2 + 1)
1238 #define VEX_LEN_3A6F_P_2 (VEX_LEN_3A6E_P_2 + 1)
1239 #define VEX_LEN_3A7A_P_2 (VEX_LEN_3A6F_P_2 + 1)
1240 #define VEX_LEN_3A7B_P_2 (VEX_LEN_3A7A_P_2 + 1)
1241 #define VEX_LEN_3A7E_P_2 (VEX_LEN_3A7B_P_2 + 1)
1242 #define VEX_LEN_3A7F_P_2 (VEX_LEN_3A7E_P_2 + 1)
1243 #define VEX_LEN_3ADF_P_2 (VEX_LEN_3A7F_P_2 + 1)
1245 typedef void (*op_rtn) (int bytemode, int sizeflag);
1247 struct dis386 {
1248 const char *name;
1249 struct
1251 op_rtn rtn;
1252 int bytemode;
1253 } op[MAX_OPERANDS];
1256 /* Upper case letters in the instruction names here are macros.
1257 'A' => print 'b' if no register operands or suffix_always is true
1258 'B' => print 'b' if suffix_always is true
1259 'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
1260 size prefix
1261 'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
1262 suffix_always is true
1263 'E' => print 'e' if 32-bit form of jcxz
1264 'F' => print 'w' or 'l' depending on address size prefix (loop insns)
1265 'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
1266 'H' => print ",pt" or ",pn" branch hint
1267 'I' => honor following macro letter even in Intel mode (implemented only
1268 for some of the macro letters)
1269 'J' => print 'l'
1270 'K' => print 'd' or 'q' if rex prefix is present.
1271 'L' => print 'l' if suffix_always is true
1272 'M' => print 'r' if intel_mnemonic is false.
1273 'N' => print 'n' if instruction has no wait "prefix"
1274 'O' => print 'd' or 'o' (or 'q' in Intel mode)
1275 'P' => print 'w', 'l' or 'q' if instruction has an operand size prefix,
1276 or suffix_always is true. print 'q' if rex prefix is present.
1277 'Q' => print 'w', 'l' or 'q' for memory operand or suffix_always
1278 is true
1279 'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
1280 'S' => print 'w', 'l' or 'q' if suffix_always is true
1281 'T' => print 'q' in 64bit mode and behave as 'P' otherwise
1282 'U' => print 'q' in 64bit mode and behave as 'Q' otherwise
1283 'V' => print 'q' in 64bit mode and behave as 'S' otherwise
1284 'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
1285 'X' => print 's', 'd' depending on data16 prefix (for XMM)
1286 'Y' => 'q' if instruction has an REX 64bit overwrite prefix and
1287 suffix_always is true.
1288 'Z' => print 'q' in 64bit mode and behave as 'L' otherwise
1289 '!' => change condition from true to false or from false to true.
1290 '%' => add 1 upper case letter to the macro.
1292 2 upper case letter macros:
1293 "XY" => print 'x' or 'y' if no register operands or suffix_always
1294 is true.
1295 'LQ' => print 'l' ('d' in Intel mode) or 'q' for memory operand
1296 or suffix_always is true
1298 Many of the above letters print nothing in Intel mode. See "putop"
1299 for the details.
1301 Braces '{' and '}', and vertical bars '|', indicate alternative
1302 mnemonic strings for AT&T and Intel. */
1304 static const struct dis386 dis386[] = {
1305 /* 00 */
1306 { "addB", { Eb, Gb } },
1307 { "addS", { Ev, Gv } },
1308 { "addB", { Gb, Eb } },
1309 { "addS", { Gv, Ev } },
1310 { "addB", { AL, Ib } },
1311 { "addS", { eAX, Iv } },
1312 { X86_64_TABLE (X86_64_06) },
1313 { X86_64_TABLE (X86_64_07) },
1314 /* 08 */
1315 { "orB", { Eb, Gb } },
1316 { "orS", { Ev, Gv } },
1317 { "orB", { Gb, Eb } },
1318 { "orS", { Gv, Ev } },
1319 { "orB", { AL, Ib } },
1320 { "orS", { eAX, Iv } },
1321 { X86_64_TABLE (X86_64_0D) },
1322 { "(bad)", { XX } }, /* 0x0f extended opcode escape */
1323 /* 10 */
1324 { "adcB", { Eb, Gb } },
1325 { "adcS", { Ev, Gv } },
1326 { "adcB", { Gb, Eb } },
1327 { "adcS", { Gv, Ev } },
1328 { "adcB", { AL, Ib } },
1329 { "adcS", { eAX, Iv } },
1330 { X86_64_TABLE (X86_64_16) },
1331 { X86_64_TABLE (X86_64_17) },
1332 /* 18 */
1333 { "sbbB", { Eb, Gb } },
1334 { "sbbS", { Ev, Gv } },
1335 { "sbbB", { Gb, Eb } },
1336 { "sbbS", { Gv, Ev } },
1337 { "sbbB", { AL, Ib } },
1338 { "sbbS", { eAX, Iv } },
1339 { X86_64_TABLE (X86_64_1E) },
1340 { X86_64_TABLE (X86_64_1F) },
1341 /* 20 */
1342 { "andB", { Eb, Gb } },
1343 { "andS", { Ev, Gv } },
1344 { "andB", { Gb, Eb } },
1345 { "andS", { Gv, Ev } },
1346 { "andB", { AL, Ib } },
1347 { "andS", { eAX, Iv } },
1348 { "(bad)", { XX } }, /* SEG ES prefix */
1349 { X86_64_TABLE (X86_64_27) },
1350 /* 28 */
1351 { "subB", { Eb, Gb } },
1352 { "subS", { Ev, Gv } },
1353 { "subB", { Gb, Eb } },
1354 { "subS", { Gv, Ev } },
1355 { "subB", { AL, Ib } },
1356 { "subS", { eAX, Iv } },
1357 { "(bad)", { XX } }, /* SEG CS prefix */
1358 { X86_64_TABLE (X86_64_2F) },
1359 /* 30 */
1360 { "xorB", { Eb, Gb } },
1361 { "xorS", { Ev, Gv } },
1362 { "xorB", { Gb, Eb } },
1363 { "xorS", { Gv, Ev } },
1364 { "xorB", { AL, Ib } },
1365 { "xorS", { eAX, Iv } },
1366 { "(bad)", { XX } }, /* SEG SS prefix */
1367 { X86_64_TABLE (X86_64_37) },
1368 /* 38 */
1369 { "cmpB", { Eb, Gb } },
1370 { "cmpS", { Ev, Gv } },
1371 { "cmpB", { Gb, Eb } },
1372 { "cmpS", { Gv, Ev } },
1373 { "cmpB", { AL, Ib } },
1374 { "cmpS", { eAX, Iv } },
1375 { "(bad)", { XX } }, /* SEG DS prefix */
1376 { X86_64_TABLE (X86_64_3F) },
1377 /* 40 */
1378 { "inc{S|}", { RMeAX } },
1379 { "inc{S|}", { RMeCX } },
1380 { "inc{S|}", { RMeDX } },
1381 { "inc{S|}", { RMeBX } },
1382 { "inc{S|}", { RMeSP } },
1383 { "inc{S|}", { RMeBP } },
1384 { "inc{S|}", { RMeSI } },
1385 { "inc{S|}", { RMeDI } },
1386 /* 48 */
1387 { "dec{S|}", { RMeAX } },
1388 { "dec{S|}", { RMeCX } },
1389 { "dec{S|}", { RMeDX } },
1390 { "dec{S|}", { RMeBX } },
1391 { "dec{S|}", { RMeSP } },
1392 { "dec{S|}", { RMeBP } },
1393 { "dec{S|}", { RMeSI } },
1394 { "dec{S|}", { RMeDI } },
1395 /* 50 */
1396 { "pushV", { RMrAX } },
1397 { "pushV", { RMrCX } },
1398 { "pushV", { RMrDX } },
1399 { "pushV", { RMrBX } },
1400 { "pushV", { RMrSP } },
1401 { "pushV", { RMrBP } },
1402 { "pushV", { RMrSI } },
1403 { "pushV", { RMrDI } },
1404 /* 58 */
1405 { "popV", { RMrAX } },
1406 { "popV", { RMrCX } },
1407 { "popV", { RMrDX } },
1408 { "popV", { RMrBX } },
1409 { "popV", { RMrSP } },
1410 { "popV", { RMrBP } },
1411 { "popV", { RMrSI } },
1412 { "popV", { RMrDI } },
1413 /* 60 */
1414 { X86_64_TABLE (X86_64_60) },
1415 { X86_64_TABLE (X86_64_61) },
1416 { X86_64_TABLE (X86_64_62) },
1417 { X86_64_TABLE (X86_64_63) },
1418 { "(bad)", { XX } }, /* seg fs */
1419 { "(bad)", { XX } }, /* seg gs */
1420 { "(bad)", { XX } }, /* op size prefix */
1421 { "(bad)", { XX } }, /* adr size prefix */
1422 /* 68 */
1423 { "pushT", { Iq } },
1424 { "imulS", { Gv, Ev, Iv } },
1425 { "pushT", { sIb } },
1426 { "imulS", { Gv, Ev, sIb } },
1427 { "ins{b|}", { Ybr, indirDX } },
1428 { X86_64_TABLE (X86_64_6D) },
1429 { "outs{b|}", { indirDXr, Xb } },
1430 { X86_64_TABLE (X86_64_6F) },
1431 /* 70 */
1432 { "joH", { Jb, XX, cond_jump_flag } },
1433 { "jnoH", { Jb, XX, cond_jump_flag } },
1434 { "jbH", { Jb, XX, cond_jump_flag } },
1435 { "jaeH", { Jb, XX, cond_jump_flag } },
1436 { "jeH", { Jb, XX, cond_jump_flag } },
1437 { "jneH", { Jb, XX, cond_jump_flag } },
1438 { "jbeH", { Jb, XX, cond_jump_flag } },
1439 { "jaH", { Jb, XX, cond_jump_flag } },
1440 /* 78 */
1441 { "jsH", { Jb, XX, cond_jump_flag } },
1442 { "jnsH", { Jb, XX, cond_jump_flag } },
1443 { "jpH", { Jb, XX, cond_jump_flag } },
1444 { "jnpH", { Jb, XX, cond_jump_flag } },
1445 { "jlH", { Jb, XX, cond_jump_flag } },
1446 { "jgeH", { Jb, XX, cond_jump_flag } },
1447 { "jleH", { Jb, XX, cond_jump_flag } },
1448 { "jgH", { Jb, XX, cond_jump_flag } },
1449 /* 80 */
1450 { REG_TABLE (REG_80) },
1451 { REG_TABLE (REG_81) },
1452 { "(bad)", { XX } },
1453 { REG_TABLE (REG_82) },
1454 { "testB", { Eb, Gb } },
1455 { "testS", { Ev, Gv } },
1456 { "xchgB", { Eb, Gb } },
1457 { "xchgS", { Ev, Gv } },
1458 /* 88 */
1459 { "movB", { Eb, Gb } },
1460 { "movS", { Ev, Gv } },
1461 { "movB", { Gb, Eb } },
1462 { "movS", { Gv, Ev } },
1463 { "movD", { Sv, Sw } },
1464 { MOD_TABLE (MOD_8D) },
1465 { "movD", { Sw, Sv } },
1466 { REG_TABLE (REG_8F) },
1467 /* 90 */
1468 { PREFIX_TABLE (PREFIX_90) },
1469 { "xchgS", { RMeCX, eAX } },
1470 { "xchgS", { RMeDX, eAX } },
1471 { "xchgS", { RMeBX, eAX } },
1472 { "xchgS", { RMeSP, eAX } },
1473 { "xchgS", { RMeBP, eAX } },
1474 { "xchgS", { RMeSI, eAX } },
1475 { "xchgS", { RMeDI, eAX } },
1476 /* 98 */
1477 { "cW{t|}R", { XX } },
1478 { "cR{t|}O", { XX } },
1479 { X86_64_TABLE (X86_64_9A) },
1480 { "(bad)", { XX } }, /* fwait */
1481 { "pushfT", { XX } },
1482 { "popfT", { XX } },
1483 { "sahf", { XX } },
1484 { "lahf", { XX } },
1485 /* a0 */
1486 { "movB", { AL, Ob } },
1487 { "movS", { eAX, Ov } },
1488 { "movB", { Ob, AL } },
1489 { "movS", { Ov, eAX } },
1490 { "movs{b|}", { Ybr, Xb } },
1491 { "movs{R|}", { Yvr, Xv } },
1492 { "cmps{b|}", { Xb, Yb } },
1493 { "cmps{R|}", { Xv, Yv } },
1494 /* a8 */
1495 { "testB", { AL, Ib } },
1496 { "testS", { eAX, Iv } },
1497 { "stosB", { Ybr, AL } },
1498 { "stosS", { Yvr, eAX } },
1499 { "lodsB", { ALr, Xb } },
1500 { "lodsS", { eAXr, Xv } },
1501 { "scasB", { AL, Yb } },
1502 { "scasS", { eAX, Yv } },
1503 /* b0 */
1504 { "movB", { RMAL, Ib } },
1505 { "movB", { RMCL, Ib } },
1506 { "movB", { RMDL, Ib } },
1507 { "movB", { RMBL, Ib } },
1508 { "movB", { RMAH, Ib } },
1509 { "movB", { RMCH, Ib } },
1510 { "movB", { RMDH, Ib } },
1511 { "movB", { RMBH, Ib } },
1512 /* b8 */
1513 { "movS", { RMeAX, Iv64 } },
1514 { "movS", { RMeCX, Iv64 } },
1515 { "movS", { RMeDX, Iv64 } },
1516 { "movS", { RMeBX, Iv64 } },
1517 { "movS", { RMeSP, Iv64 } },
1518 { "movS", { RMeBP, Iv64 } },
1519 { "movS", { RMeSI, Iv64 } },
1520 { "movS", { RMeDI, Iv64 } },
1521 /* c0 */
1522 { REG_TABLE (REG_C0) },
1523 { REG_TABLE (REG_C1) },
1524 { "retT", { Iw } },
1525 { "retT", { XX } },
1526 { X86_64_TABLE (X86_64_C4) },
1527 { X86_64_TABLE (X86_64_C5) },
1528 { REG_TABLE (REG_C6) },
1529 { REG_TABLE (REG_C7) },
1530 /* c8 */
1531 { "enterT", { Iw, Ib } },
1532 { "leaveT", { XX } },
1533 { "Jret{|f}P", { Iw } },
1534 { "Jret{|f}P", { XX } },
1535 { "int3", { XX } },
1536 { "int", { Ib } },
1537 { X86_64_TABLE (X86_64_CE) },
1538 { "iretP", { XX } },
1539 /* d0 */
1540 { REG_TABLE (REG_D0) },
1541 { REG_TABLE (REG_D1) },
1542 { REG_TABLE (REG_D2) },
1543 { REG_TABLE (REG_D3) },
1544 { X86_64_TABLE (X86_64_D4) },
1545 { X86_64_TABLE (X86_64_D5) },
1546 { "(bad)", { XX } },
1547 { "xlat", { DSBX } },
1548 /* d8 */
1549 { FLOAT },
1550 { FLOAT },
1551 { FLOAT },
1552 { FLOAT },
1553 { FLOAT },
1554 { FLOAT },
1555 { FLOAT },
1556 { FLOAT },
1557 /* e0 */
1558 { "loopneFH", { Jb, XX, loop_jcxz_flag } },
1559 { "loopeFH", { Jb, XX, loop_jcxz_flag } },
1560 { "loopFH", { Jb, XX, loop_jcxz_flag } },
1561 { "jEcxzH", { Jb, XX, loop_jcxz_flag } },
1562 { "inB", { AL, Ib } },
1563 { "inG", { zAX, Ib } },
1564 { "outB", { Ib, AL } },
1565 { "outG", { Ib, zAX } },
1566 /* e8 */
1567 { "callT", { Jv } },
1568 { "jmpT", { Jv } },
1569 { X86_64_TABLE (X86_64_EA) },
1570 { "jmp", { Jb } },
1571 { "inB", { AL, indirDX } },
1572 { "inG", { zAX, indirDX } },
1573 { "outB", { indirDX, AL } },
1574 { "outG", { indirDX, zAX } },
1575 /* f0 */
1576 { "(bad)", { XX } }, /* lock prefix */
1577 { "icebp", { XX } },
1578 { "(bad)", { XX } }, /* repne */
1579 { "(bad)", { XX } }, /* repz */
1580 { "hlt", { XX } },
1581 { "cmc", { XX } },
1582 { REG_TABLE (REG_F6) },
1583 { REG_TABLE (REG_F7) },
1584 /* f8 */
1585 { "clc", { XX } },
1586 { "stc", { XX } },
1587 { "cli", { XX } },
1588 { "sti", { XX } },
1589 { "cld", { XX } },
1590 { "std", { XX } },
1591 { REG_TABLE (REG_FE) },
1592 { REG_TABLE (REG_FF) },
1595 static const struct dis386 dis386_twobyte[] = {
1596 /* 00 */
1597 { REG_TABLE (REG_0F00 ) },
1598 { REG_TABLE (REG_0F01 ) },
1599 { "larS", { Gv, Ew } },
1600 { "lslS", { Gv, Ew } },
1601 { "(bad)", { XX } },
1602 { "syscall", { XX } },
1603 { "clts", { XX } },
1604 { "sysretP", { XX } },
1605 /* 08 */
1606 { "invd", { XX } },
1607 { "wbinvd", { XX } },
1608 { "(bad)", { XX } },
1609 { "ud2a", { XX } },
1610 { "(bad)", { XX } },
1611 { REG_TABLE (REG_0F0D) },
1612 { "femms", { XX } },
1613 { "", { MX, EM, OPSUF } }, /* See OP_3DNowSuffix. */
1614 /* 10 */
1615 { PREFIX_TABLE (PREFIX_0F10) },
1616 { PREFIX_TABLE (PREFIX_0F11) },
1617 { PREFIX_TABLE (PREFIX_0F12) },
1618 { MOD_TABLE (MOD_0F13) },
1619 { "unpcklpX", { XM, EXx } },
1620 { "unpckhpX", { XM, EXx } },
1621 { PREFIX_TABLE (PREFIX_0F16) },
1622 { MOD_TABLE (MOD_0F17) },
1623 /* 18 */
1624 { REG_TABLE (REG_0F18) },
1625 { "nopQ", { Ev } },
1626 { "nopQ", { Ev } },
1627 { "nopQ", { Ev } },
1628 { "nopQ", { Ev } },
1629 { "nopQ", { Ev } },
1630 { "nopQ", { Ev } },
1631 { "nopQ", { Ev } },
1632 /* 20 */
1633 { MOD_TABLE (MOD_0F20) },
1634 { MOD_TABLE (MOD_0F21) },
1635 { MOD_TABLE (MOD_0F22) },
1636 { MOD_TABLE (MOD_0F23) },
1637 { MOD_TABLE (MOD_0F24) },
1638 { THREE_BYTE_TABLE (THREE_BYTE_0F25) },
1639 { MOD_TABLE (MOD_0F26) },
1640 { "(bad)", { XX } },
1641 /* 28 */
1642 { "movapX", { XM, EXx } },
1643 { "movapX", { EXx, XM } },
1644 { PREFIX_TABLE (PREFIX_0F2A) },
1645 { PREFIX_TABLE (PREFIX_0F2B) },
1646 { PREFIX_TABLE (PREFIX_0F2C) },
1647 { PREFIX_TABLE (PREFIX_0F2D) },
1648 { PREFIX_TABLE (PREFIX_0F2E) },
1649 { PREFIX_TABLE (PREFIX_0F2F) },
1650 /* 30 */
1651 { "wrmsr", { XX } },
1652 { "rdtsc", { XX } },
1653 { "rdmsr", { XX } },
1654 { "rdpmc", { XX } },
1655 { "sysenter", { XX } },
1656 { "sysexit", { XX } },
1657 { "(bad)", { XX } },
1658 { "getsec", { XX } },
1659 /* 38 */
1660 { THREE_BYTE_TABLE (THREE_BYTE_0F38) },
1661 { "(bad)", { XX } },
1662 { THREE_BYTE_TABLE (THREE_BYTE_0F3A) },
1663 { "(bad)", { XX } },
1664 { "(bad)", { XX } },
1665 { "(bad)", { XX } },
1666 { "(bad)", { XX } },
1667 { "(bad)", { XX } },
1668 /* 40 */
1669 { "cmovoS", { Gv, Ev } },
1670 { "cmovnoS", { Gv, Ev } },
1671 { "cmovbS", { Gv, Ev } },
1672 { "cmovaeS", { Gv, Ev } },
1673 { "cmoveS", { Gv, Ev } },
1674 { "cmovneS", { Gv, Ev } },
1675 { "cmovbeS", { Gv, Ev } },
1676 { "cmovaS", { Gv, Ev } },
1677 /* 48 */
1678 { "cmovsS", { Gv, Ev } },
1679 { "cmovnsS", { Gv, Ev } },
1680 { "cmovpS", { Gv, Ev } },
1681 { "cmovnpS", { Gv, Ev } },
1682 { "cmovlS", { Gv, Ev } },
1683 { "cmovgeS", { Gv, Ev } },
1684 { "cmovleS", { Gv, Ev } },
1685 { "cmovgS", { Gv, Ev } },
1686 /* 50 */
1687 { MOD_TABLE (MOD_0F51) },
1688 { PREFIX_TABLE (PREFIX_0F51) },
1689 { PREFIX_TABLE (PREFIX_0F52) },
1690 { PREFIX_TABLE (PREFIX_0F53) },
1691 { "andpX", { XM, EXx } },
1692 { "andnpX", { XM, EXx } },
1693 { "orpX", { XM, EXx } },
1694 { "xorpX", { XM, EXx } },
1695 /* 58 */
1696 { PREFIX_TABLE (PREFIX_0F58) },
1697 { PREFIX_TABLE (PREFIX_0F59) },
1698 { PREFIX_TABLE (PREFIX_0F5A) },
1699 { PREFIX_TABLE (PREFIX_0F5B) },
1700 { PREFIX_TABLE (PREFIX_0F5C) },
1701 { PREFIX_TABLE (PREFIX_0F5D) },
1702 { PREFIX_TABLE (PREFIX_0F5E) },
1703 { PREFIX_TABLE (PREFIX_0F5F) },
1704 /* 60 */
1705 { PREFIX_TABLE (PREFIX_0F60) },
1706 { PREFIX_TABLE (PREFIX_0F61) },
1707 { PREFIX_TABLE (PREFIX_0F62) },
1708 { "packsswb", { MX, EM } },
1709 { "pcmpgtb", { MX, EM } },
1710 { "pcmpgtw", { MX, EM } },
1711 { "pcmpgtd", { MX, EM } },
1712 { "packuswb", { MX, EM } },
1713 /* 68 */
1714 { "punpckhbw", { MX, EM } },
1715 { "punpckhwd", { MX, EM } },
1716 { "punpckhdq", { MX, EM } },
1717 { "packssdw", { MX, EM } },
1718 { PREFIX_TABLE (PREFIX_0F6C) },
1719 { PREFIX_TABLE (PREFIX_0F6D) },
1720 { "movK", { MX, Edq } },
1721 { PREFIX_TABLE (PREFIX_0F6F) },
1722 /* 70 */
1723 { PREFIX_TABLE (PREFIX_0F70) },
1724 { REG_TABLE (REG_0F71) },
1725 { REG_TABLE (REG_0F72) },
1726 { REG_TABLE (REG_0F73) },
1727 { "pcmpeqb", { MX, EM } },
1728 { "pcmpeqw", { MX, EM } },
1729 { "pcmpeqd", { MX, EM } },
1730 { "emms", { XX } },
1731 /* 78 */
1732 { PREFIX_TABLE (PREFIX_0F78) },
1733 { PREFIX_TABLE (PREFIX_0F79) },
1734 { THREE_BYTE_TABLE (THREE_BYTE_0F7A) },
1735 { THREE_BYTE_TABLE (THREE_BYTE_0F7B) },
1736 { PREFIX_TABLE (PREFIX_0F7C) },
1737 { PREFIX_TABLE (PREFIX_0F7D) },
1738 { PREFIX_TABLE (PREFIX_0F7E) },
1739 { PREFIX_TABLE (PREFIX_0F7F) },
1740 /* 80 */
1741 { "joH", { Jv, XX, cond_jump_flag } },
1742 { "jnoH", { Jv, XX, cond_jump_flag } },
1743 { "jbH", { Jv, XX, cond_jump_flag } },
1744 { "jaeH", { Jv, XX, cond_jump_flag } },
1745 { "jeH", { Jv, XX, cond_jump_flag } },
1746 { "jneH", { Jv, XX, cond_jump_flag } },
1747 { "jbeH", { Jv, XX, cond_jump_flag } },
1748 { "jaH", { Jv, XX, cond_jump_flag } },
1749 /* 88 */
1750 { "jsH", { Jv, XX, cond_jump_flag } },
1751 { "jnsH", { Jv, XX, cond_jump_flag } },
1752 { "jpH", { Jv, XX, cond_jump_flag } },
1753 { "jnpH", { Jv, XX, cond_jump_flag } },
1754 { "jlH", { Jv, XX, cond_jump_flag } },
1755 { "jgeH", { Jv, XX, cond_jump_flag } },
1756 { "jleH", { Jv, XX, cond_jump_flag } },
1757 { "jgH", { Jv, XX, cond_jump_flag } },
1758 /* 90 */
1759 { "seto", { Eb } },
1760 { "setno", { Eb } },
1761 { "setb", { Eb } },
1762 { "setae", { Eb } },
1763 { "sete", { Eb } },
1764 { "setne", { Eb } },
1765 { "setbe", { Eb } },
1766 { "seta", { Eb } },
1767 /* 98 */
1768 { "sets", { Eb } },
1769 { "setns", { Eb } },
1770 { "setp", { Eb } },
1771 { "setnp", { Eb } },
1772 { "setl", { Eb } },
1773 { "setge", { Eb } },
1774 { "setle", { Eb } },
1775 { "setg", { Eb } },
1776 /* a0 */
1777 { "pushT", { fs } },
1778 { "popT", { fs } },
1779 { "cpuid", { XX } },
1780 { "btS", { Ev, Gv } },
1781 { "shldS", { Ev, Gv, Ib } },
1782 { "shldS", { Ev, Gv, CL } },
1783 { REG_TABLE (REG_0FA6) },
1784 { REG_TABLE (REG_0FA7) },
1785 /* a8 */
1786 { "pushT", { gs } },
1787 { "popT", { gs } },
1788 { "rsm", { XX } },
1789 { "btsS", { Ev, Gv } },
1790 { "shrdS", { Ev, Gv, Ib } },
1791 { "shrdS", { Ev, Gv, CL } },
1792 { REG_TABLE (REG_0FAE) },
1793 { "imulS", { Gv, Ev } },
1794 /* b0 */
1795 { "cmpxchgB", { Eb, Gb } },
1796 { "cmpxchgS", { Ev, Gv } },
1797 { MOD_TABLE (MOD_0FB2) },
1798 { "btrS", { Ev, Gv } },
1799 { MOD_TABLE (MOD_0FB4) },
1800 { MOD_TABLE (MOD_0FB5) },
1801 { "movz{bR|x}", { Gv, Eb } },
1802 { "movz{wR|x}", { Gv, Ew } }, /* yes, there really is movzww ! */
1803 /* b8 */
1804 { PREFIX_TABLE (PREFIX_0FB8) },
1805 { "ud2b", { XX } },
1806 { REG_TABLE (REG_0FBA) },
1807 { "btcS", { Ev, Gv } },
1808 { "bsfS", { Gv, Ev } },
1809 { PREFIX_TABLE (PREFIX_0FBD) },
1810 { "movs{bR|x}", { Gv, Eb } },
1811 { "movs{wR|x}", { Gv, Ew } }, /* yes, there really is movsww ! */
1812 /* c0 */
1813 { "xaddB", { Eb, Gb } },
1814 { "xaddS", { Ev, Gv } },
1815 { PREFIX_TABLE (PREFIX_0FC2) },
1816 { PREFIX_TABLE (PREFIX_0FC3) },
1817 { "pinsrw", { MX, Edqw, Ib } },
1818 { "pextrw", { Gdq, MS, Ib } },
1819 { "shufpX", { XM, EXx, Ib } },
1820 { REG_TABLE (REG_0FC7) },
1821 /* c8 */
1822 { "bswap", { RMeAX } },
1823 { "bswap", { RMeCX } },
1824 { "bswap", { RMeDX } },
1825 { "bswap", { RMeBX } },
1826 { "bswap", { RMeSP } },
1827 { "bswap", { RMeBP } },
1828 { "bswap", { RMeSI } },
1829 { "bswap", { RMeDI } },
1830 /* d0 */
1831 { PREFIX_TABLE (PREFIX_0FD0) },
1832 { "psrlw", { MX, EM } },
1833 { "psrld", { MX, EM } },
1834 { "psrlq", { MX, EM } },
1835 { "paddq", { MX, EM } },
1836 { "pmullw", { MX, EM } },
1837 { PREFIX_TABLE (PREFIX_0FD6) },
1838 { MOD_TABLE (MOD_0FD7) },
1839 /* d8 */
1840 { "psubusb", { MX, EM } },
1841 { "psubusw", { MX, EM } },
1842 { "pminub", { MX, EM } },
1843 { "pand", { MX, EM } },
1844 { "paddusb", { MX, EM } },
1845 { "paddusw", { MX, EM } },
1846 { "pmaxub", { MX, EM } },
1847 { "pandn", { MX, EM } },
1848 /* e0 */
1849 { "pavgb", { MX, EM } },
1850 { "psraw", { MX, EM } },
1851 { "psrad", { MX, EM } },
1852 { "pavgw", { MX, EM } },
1853 { "pmulhuw", { MX, EM } },
1854 { "pmulhw", { MX, EM } },
1855 { PREFIX_TABLE (PREFIX_0FE6) },
1856 { PREFIX_TABLE (PREFIX_0FE7) },
1857 /* e8 */
1858 { "psubsb", { MX, EM } },
1859 { "psubsw", { MX, EM } },
1860 { "pminsw", { MX, EM } },
1861 { "por", { MX, EM } },
1862 { "paddsb", { MX, EM } },
1863 { "paddsw", { MX, EM } },
1864 { "pmaxsw", { MX, EM } },
1865 { "pxor", { MX, EM } },
1866 /* f0 */
1867 { PREFIX_TABLE (PREFIX_0FF0) },
1868 { "psllw", { MX, EM } },
1869 { "pslld", { MX, EM } },
1870 { "psllq", { MX, EM } },
1871 { "pmuludq", { MX, EM } },
1872 { "pmaddwd", { MX, EM } },
1873 { "psadbw", { MX, EM } },
1874 { PREFIX_TABLE (PREFIX_0FF7) },
1875 /* f8 */
1876 { "psubb", { MX, EM } },
1877 { "psubw", { MX, EM } },
1878 { "psubd", { MX, EM } },
1879 { "psubq", { MX, EM } },
1880 { "paddb", { MX, EM } },
1881 { "paddw", { MX, EM } },
1882 { "paddd", { MX, EM } },
1883 { "(bad)", { XX } },
1886 static const unsigned char onebyte_has_modrm[256] = {
1887 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
1888 /* ------------------------------- */
1889 /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
1890 /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
1891 /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
1892 /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
1893 /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
1894 /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
1895 /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
1896 /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
1897 /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
1898 /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
1899 /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
1900 /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
1901 /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
1902 /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
1903 /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
1904 /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1 /* f0 */
1905 /* ------------------------------- */
1906 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
1909 static const unsigned char twobyte_has_modrm[256] = {
1910 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
1911 /* ------------------------------- */
1912 /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
1913 /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
1914 /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
1915 /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
1916 /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
1917 /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
1918 /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
1919 /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
1920 /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
1921 /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
1922 /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
1923 /* b0 */ 1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1, /* bf */
1924 /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
1925 /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
1926 /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
1927 /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0 /* ff */
1928 /* ------------------------------- */
1929 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
1932 static char obuf[100];
1933 static char *obufp;
1934 static char scratchbuf[100];
1935 static unsigned char *start_codep;
1936 static unsigned char *insn_codep;
1937 static unsigned char *codep;
1938 static const char *lock_prefix;
1939 static const char *data_prefix;
1940 static const char *addr_prefix;
1941 static const char *repz_prefix;
1942 static const char *repnz_prefix;
1943 static disassemble_info *the_info;
1944 static struct
1946 int mod;
1947 int reg;
1948 int rm;
1950 modrm;
1951 static unsigned char need_modrm;
1952 static struct
1954 int register_specifier;
1955 int length;
1956 int prefix;
1957 int w;
1959 vex;
1960 static unsigned char need_vex;
1961 static unsigned char need_vex_reg;
1962 static unsigned char vex_w_done;
1964 /* If we are accessing mod/rm/reg without need_modrm set, then the
1965 values are stale. Hitting this abort likely indicates that you
1966 need to update onebyte_has_modrm or twobyte_has_modrm. */
1967 #define MODRM_CHECK if (!need_modrm) abort ()
1969 static const char **names64;
1970 static const char **names32;
1971 static const char **names16;
1972 static const char **names8;
1973 static const char **names8rex;
1974 static const char **names_seg;
1975 static const char *index64;
1976 static const char *index32;
1977 static const char **index16;
1979 static const char *intel_names64[] = {
1980 "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
1981 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
1983 static const char *intel_names32[] = {
1984 "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
1985 "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
1987 static const char *intel_names16[] = {
1988 "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
1989 "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
1991 static const char *intel_names8[] = {
1992 "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
1994 static const char *intel_names8rex[] = {
1995 "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
1996 "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
1998 static const char *intel_names_seg[] = {
1999 "es", "cs", "ss", "ds", "fs", "gs", "?", "?",
2001 static const char *intel_index64 = "riz";
2002 static const char *intel_index32 = "eiz";
2003 static const char *intel_index16[] = {
2004 "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
2007 static const char *att_names64[] = {
2008 "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
2009 "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
2011 static const char *att_names32[] = {
2012 "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
2013 "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
2015 static const char *att_names16[] = {
2016 "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
2017 "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
2019 static const char *att_names8[] = {
2020 "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
2022 static const char *att_names8rex[] = {
2023 "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
2024 "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
2026 static const char *att_names_seg[] = {
2027 "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
2029 static const char *att_index64 = "%riz";
2030 static const char *att_index32 = "%eiz";
2031 static const char *att_index16[] = {
2032 "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
2035 static const struct dis386 reg_table[][8] = {
2036 /* REG_80 */
2038 { "addA", { Eb, Ib } },
2039 { "orA", { Eb, Ib } },
2040 { "adcA", { Eb, Ib } },
2041 { "sbbA", { Eb, Ib } },
2042 { "andA", { Eb, Ib } },
2043 { "subA", { Eb, Ib } },
2044 { "xorA", { Eb, Ib } },
2045 { "cmpA", { Eb, Ib } },
2047 /* REG_81 */
2049 { "addQ", { Ev, Iv } },
2050 { "orQ", { Ev, Iv } },
2051 { "adcQ", { Ev, Iv } },
2052 { "sbbQ", { Ev, Iv } },
2053 { "andQ", { Ev, Iv } },
2054 { "subQ", { Ev, Iv } },
2055 { "xorQ", { Ev, Iv } },
2056 { "cmpQ", { Ev, Iv } },
2058 /* REG_82 */
2060 { "addQ", { Ev, sIb } },
2061 { "orQ", { Ev, sIb } },
2062 { "adcQ", { Ev, sIb } },
2063 { "sbbQ", { Ev, sIb } },
2064 { "andQ", { Ev, sIb } },
2065 { "subQ", { Ev, sIb } },
2066 { "xorQ", { Ev, sIb } },
2067 { "cmpQ", { Ev, sIb } },
2069 /* REG_8F */
2071 { "popU", { stackEv } },
2072 { "(bad)", { XX } },
2073 { "(bad)", { XX } },
2074 { "(bad)", { XX } },
2075 { "(bad)", { XX } },
2076 { "(bad)", { XX } },
2077 { "(bad)", { XX } },
2078 { "(bad)", { XX } },
2080 /* REG_C0 */
2082 { "rolA", { Eb, Ib } },
2083 { "rorA", { Eb, Ib } },
2084 { "rclA", { Eb, Ib } },
2085 { "rcrA", { Eb, Ib } },
2086 { "shlA", { Eb, Ib } },
2087 { "shrA", { Eb, Ib } },
2088 { "(bad)", { XX } },
2089 { "sarA", { Eb, Ib } },
2091 /* REG_C1 */
2093 { "rolQ", { Ev, Ib } },
2094 { "rorQ", { Ev, Ib } },
2095 { "rclQ", { Ev, Ib } },
2096 { "rcrQ", { Ev, Ib } },
2097 { "shlQ", { Ev, Ib } },
2098 { "shrQ", { Ev, Ib } },
2099 { "(bad)", { XX } },
2100 { "sarQ", { Ev, Ib } },
2102 /* REG_C6 */
2104 { "movA", { Eb, Ib } },
2105 { "(bad)", { XX } },
2106 { "(bad)", { XX } },
2107 { "(bad)", { XX } },
2108 { "(bad)", { XX } },
2109 { "(bad)", { XX } },
2110 { "(bad)", { XX } },
2111 { "(bad)", { XX } },
2113 /* REG_C7 */
2115 { "movQ", { Ev, Iv } },
2116 { "(bad)", { XX } },
2117 { "(bad)", { XX } },
2118 { "(bad)", { XX } },
2119 { "(bad)", { XX } },
2120 { "(bad)", { XX } },
2121 { "(bad)", { XX } },
2122 { "(bad)", { XX } },
2124 /* REG_D0 */
2126 { "rolA", { Eb, I1 } },
2127 { "rorA", { Eb, I1 } },
2128 { "rclA", { Eb, I1 } },
2129 { "rcrA", { Eb, I1 } },
2130 { "shlA", { Eb, I1 } },
2131 { "shrA", { Eb, I1 } },
2132 { "(bad)", { XX } },
2133 { "sarA", { Eb, I1 } },
2135 /* REG_D1 */
2137 { "rolQ", { Ev, I1 } },
2138 { "rorQ", { Ev, I1 } },
2139 { "rclQ", { Ev, I1 } },
2140 { "rcrQ", { Ev, I1 } },
2141 { "shlQ", { Ev, I1 } },
2142 { "shrQ", { Ev, I1 } },
2143 { "(bad)", { XX } },
2144 { "sarQ", { Ev, I1 } },
2146 /* REG_D2 */
2148 { "rolA", { Eb, CL } },
2149 { "rorA", { Eb, CL } },
2150 { "rclA", { Eb, CL } },
2151 { "rcrA", { Eb, CL } },
2152 { "shlA", { Eb, CL } },
2153 { "shrA", { Eb, CL } },
2154 { "(bad)", { XX } },
2155 { "sarA", { Eb, CL } },
2157 /* REG_D3 */
2159 { "rolQ", { Ev, CL } },
2160 { "rorQ", { Ev, CL } },
2161 { "rclQ", { Ev, CL } },
2162 { "rcrQ", { Ev, CL } },
2163 { "shlQ", { Ev, CL } },
2164 { "shrQ", { Ev, CL } },
2165 { "(bad)", { XX } },
2166 { "sarQ", { Ev, CL } },
2168 /* REG_F6 */
2170 { "testA", { Eb, Ib } },
2171 { "(bad)", { XX } },
2172 { "notA", { Eb } },
2173 { "negA", { Eb } },
2174 { "mulA", { Eb } }, /* Don't print the implicit %al register, */
2175 { "imulA", { Eb } }, /* to distinguish these opcodes from other */
2176 { "divA", { Eb } }, /* mul/imul opcodes. Do the same for div */
2177 { "idivA", { Eb } }, /* and idiv for consistency. */
2179 /* REG_F7 */
2181 { "testQ", { Ev, Iv } },
2182 { "(bad)", { XX } },
2183 { "notQ", { Ev } },
2184 { "negQ", { Ev } },
2185 { "mulQ", { Ev } }, /* Don't print the implicit register. */
2186 { "imulQ", { Ev } },
2187 { "divQ", { Ev } },
2188 { "idivQ", { Ev } },
2190 /* REG_FE */
2192 { "incA", { Eb } },
2193 { "decA", { Eb } },
2194 { "(bad)", { XX } },
2195 { "(bad)", { XX } },
2196 { "(bad)", { XX } },
2197 { "(bad)", { XX } },
2198 { "(bad)", { XX } },
2199 { "(bad)", { XX } },
2201 /* REG_FF */
2203 { "incQ", { Ev } },
2204 { "decQ", { Ev } },
2205 { "callT", { indirEv } },
2206 { "JcallT", { indirEp } },
2207 { "jmpT", { indirEv } },
2208 { "JjmpT", { indirEp } },
2209 { "pushU", { stackEv } },
2210 { "(bad)", { XX } },
2212 /* REG_0F00 */
2214 { "sldtD", { Sv } },
2215 { "strD", { Sv } },
2216 { "lldt", { Ew } },
2217 { "ltr", { Ew } },
2218 { "verr", { Ew } },
2219 { "verw", { Ew } },
2220 { "(bad)", { XX } },
2221 { "(bad)", { XX } },
2223 /* REG_0F01 */
2225 { MOD_TABLE (MOD_0F01_REG_0) },
2226 { MOD_TABLE (MOD_0F01_REG_1) },
2227 { MOD_TABLE (MOD_0F01_REG_2) },
2228 { MOD_TABLE (MOD_0F01_REG_3) },
2229 { "smswD", { Sv } },
2230 { "(bad)", { XX } },
2231 { "lmsw", { Ew } },
2232 { MOD_TABLE (MOD_0F01_REG_7) },
2234 /* REG_0F0D */
2236 { "prefetch", { Eb } },
2237 { "prefetchw", { Eb } },
2238 { "(bad)", { XX } },
2239 { "(bad)", { XX } },
2240 { "(bad)", { XX } },
2241 { "(bad)", { XX } },
2242 { "(bad)", { XX } },
2243 { "(bad)", { XX } },
2245 /* REG_0F18 */
2247 { MOD_TABLE (MOD_0F18_REG_0) },
2248 { MOD_TABLE (MOD_0F18_REG_1) },
2249 { MOD_TABLE (MOD_0F18_REG_2) },
2250 { MOD_TABLE (MOD_0F18_REG_3) },
2251 { "(bad)", { XX } },
2252 { "(bad)", { XX } },
2253 { "(bad)", { XX } },
2254 { "(bad)", { XX } },
2256 /* REG_0F71 */
2258 { "(bad)", { XX } },
2259 { "(bad)", { XX } },
2260 { MOD_TABLE (MOD_0F71_REG_2) },
2261 { "(bad)", { XX } },
2262 { MOD_TABLE (MOD_0F71_REG_4) },
2263 { "(bad)", { XX } },
2264 { MOD_TABLE (MOD_0F71_REG_6) },
2265 { "(bad)", { XX } },
2267 /* REG_0F72 */
2269 { "(bad)", { XX } },
2270 { "(bad)", { XX } },
2271 { MOD_TABLE (MOD_0F72_REG_2) },
2272 { "(bad)", { XX } },
2273 { MOD_TABLE (MOD_0F72_REG_4) },
2274 { "(bad)", { XX } },
2275 { MOD_TABLE (MOD_0F72_REG_6) },
2276 { "(bad)", { XX } },
2278 /* REG_0F73 */
2280 { "(bad)", { XX } },
2281 { "(bad)", { XX } },
2282 { MOD_TABLE (MOD_0F73_REG_2) },
2283 { MOD_TABLE (MOD_0F73_REG_3) },
2284 { "(bad)", { XX } },
2285 { "(bad)", { XX } },
2286 { MOD_TABLE (MOD_0F73_REG_6) },
2287 { MOD_TABLE (MOD_0F73_REG_7) },
2289 /* REG_0FA6 */
2291 { "montmul", { { OP_0f07, 0 } } },
2292 { "xsha1", { { OP_0f07, 0 } } },
2293 { "xsha256", { { OP_0f07, 0 } } },
2294 { "(bad)", { { OP_0f07, 0 } } },
2295 { "(bad)", { { OP_0f07, 0 } } },
2296 { "(bad)", { { OP_0f07, 0 } } },
2297 { "(bad)", { { OP_0f07, 0 } } },
2298 { "(bad)", { { OP_0f07, 0 } } },
2300 /* REG_0FA7 */
2302 { "xstore-rng", { { OP_0f07, 0 } } },
2303 { "xcrypt-ecb", { { OP_0f07, 0 } } },
2304 { "xcrypt-cbc", { { OP_0f07, 0 } } },
2305 { "xcrypt-ctr", { { OP_0f07, 0 } } },
2306 { "xcrypt-cfb", { { OP_0f07, 0 } } },
2307 { "xcrypt-ofb", { { OP_0f07, 0 } } },
2308 { "(bad)", { { OP_0f07, 0 } } },
2309 { "(bad)", { { OP_0f07, 0 } } },
2311 /* REG_0FAE */
2313 { MOD_TABLE (MOD_0FAE_REG_0) },
2314 { MOD_TABLE (MOD_0FAE_REG_1) },
2315 { MOD_TABLE (MOD_0FAE_REG_2) },
2316 { MOD_TABLE (MOD_0FAE_REG_3) },
2317 { MOD_TABLE (MOD_0FAE_REG_4) },
2318 { MOD_TABLE (MOD_0FAE_REG_5) },
2319 { MOD_TABLE (MOD_0FAE_REG_6) },
2320 { MOD_TABLE (MOD_0FAE_REG_7) },
2322 /* REG_0FBA */
2324 { "(bad)", { XX } },
2325 { "(bad)", { XX } },
2326 { "(bad)", { XX } },
2327 { "(bad)", { XX } },
2328 { "btQ", { Ev, Ib } },
2329 { "btsQ", { Ev, Ib } },
2330 { "btrQ", { Ev, Ib } },
2331 { "btcQ", { Ev, Ib } },
2333 /* REG_0FC7 */
2335 { "(bad)", { XX } },
2336 { "cmpxchg8b", { { CMPXCHG8B_Fixup, q_mode } } },
2337 { "(bad)", { XX } },
2338 { "(bad)", { XX } },
2339 { "(bad)", { XX } },
2340 { "(bad)", { XX } },
2341 { MOD_TABLE (MOD_0FC7_REG_6) },
2342 { MOD_TABLE (MOD_0FC7_REG_7) },
2344 /* REG_VEX_71 */
2346 { "(bad)", { XX } },
2347 { "(bad)", { XX } },
2348 { MOD_TABLE (MOD_VEX_71_REG_2) },
2349 { "(bad)", { XX } },
2350 { MOD_TABLE (MOD_VEX_71_REG_4) },
2351 { "(bad)", { XX } },
2352 { MOD_TABLE (MOD_VEX_71_REG_6) },
2353 { "(bad)", { XX } },
2355 /* REG_VEX_72 */
2357 { "(bad)", { XX } },
2358 { "(bad)", { XX } },
2359 { MOD_TABLE (MOD_VEX_72_REG_2) },
2360 { "(bad)", { XX } },
2361 { MOD_TABLE (MOD_VEX_72_REG_4) },
2362 { "(bad)", { XX } },
2363 { MOD_TABLE (MOD_VEX_72_REG_6) },
2364 { "(bad)", { XX } },
2366 /* REG_VEX_73 */
2368 { "(bad)", { XX } },
2369 { "(bad)", { XX } },
2370 { MOD_TABLE (MOD_VEX_73_REG_2) },
2371 { MOD_TABLE (MOD_VEX_73_REG_3) },
2372 { "(bad)", { XX } },
2373 { "(bad)", { XX } },
2374 { MOD_TABLE (MOD_VEX_73_REG_6) },
2375 { MOD_TABLE (MOD_VEX_73_REG_7) },
2377 /* REG_VEX_AE */
2379 { "(bad)", { XX } },
2380 { "(bad)", { XX } },
2381 { MOD_TABLE (MOD_VEX_AE_REG_2) },
2382 { MOD_TABLE (MOD_VEX_AE_REG_3) },
2383 { "(bad)", { XX } },
2384 { "(bad)", { XX } },
2385 { "(bad)", { XX } },
2386 { "(bad)", { XX } },
2390 static const struct dis386 prefix_table[][4] = {
2391 /* PREFIX_90 */
2393 { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } } },
2394 { "pause", { XX } },
2395 { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } } },
2396 { "(bad)", { XX } },
2399 /* PREFIX_0F10 */
2401 { "movups", { XM, EXx } },
2402 { "movss", { XM, EXd } },
2403 { "movupd", { XM, EXx } },
2404 { "movsd", { XM, EXq } },
2407 /* PREFIX_0F11 */
2409 { "movups", { EXx, XM } },
2410 { "movss", { EXd, XM } },
2411 { "movupd", { EXx, XM } },
2412 { "movsd", { EXq, XM } },
2415 /* PREFIX_0F12 */
2417 { MOD_TABLE (MOD_0F12_PREFIX_0) },
2418 { "movsldup", { XM, EXx } },
2419 { "movlpd", { XM, EXq } },
2420 { "movddup", { XM, EXq } },
2423 /* PREFIX_0F16 */
2425 { MOD_TABLE (MOD_0F16_PREFIX_0) },
2426 { "movshdup", { XM, EXx } },
2427 { "movhpd", { XM, EXq } },
2428 { "(bad)", { XX } },
2431 /* PREFIX_0F2A */
2433 { "cvtpi2ps", { XM, EMCq } },
2434 { "cvtsi2ss%LQ", { XM, Ev } },
2435 { "cvtpi2pd", { XM, EMCq } },
2436 { "cvtsi2sd%LQ", { XM, Ev } },
2439 /* PREFIX_0F2B */
2441 { MOD_TABLE (MOD_0F2B_PREFIX_0) },
2442 { MOD_TABLE (MOD_0F2B_PREFIX_1) },
2443 { MOD_TABLE (MOD_0F2B_PREFIX_2) },
2444 { MOD_TABLE (MOD_0F2B_PREFIX_3) },
2447 /* PREFIX_0F2C */
2449 { "cvttps2pi", { MXC, EXq } },
2450 { "cvttss2siY", { Gv, EXd } },
2451 { "cvttpd2pi", { MXC, EXx } },
2452 { "cvttsd2siY", { Gv, EXq } },
2455 /* PREFIX_0F2D */
2457 { "cvtps2pi", { MXC, EXq } },
2458 { "cvtss2siY", { Gv, EXd } },
2459 { "cvtpd2pi", { MXC, EXx } },
2460 { "cvtsd2siY", { Gv, EXq } },
2463 /* PREFIX_0F2E */
2465 { "ucomiss",{ XM, EXd } },
2466 { "(bad)", { XX } },
2467 { "ucomisd",{ XM, EXq } },
2468 { "(bad)", { XX } },
2471 /* PREFIX_0F2F */
2473 { "comiss", { XM, EXd } },
2474 { "(bad)", { XX } },
2475 { "comisd", { XM, EXq } },
2476 { "(bad)", { XX } },
2479 /* PREFIX_0F51 */
2481 { "sqrtps", { XM, EXx } },
2482 { "sqrtss", { XM, EXd } },
2483 { "sqrtpd", { XM, EXx } },
2484 { "sqrtsd", { XM, EXq } },
2487 /* PREFIX_0F52 */
2489 { "rsqrtps",{ XM, EXx } },
2490 { "rsqrtss",{ XM, EXd } },
2491 { "(bad)", { XX } },
2492 { "(bad)", { XX } },
2495 /* PREFIX_0F53 */
2497 { "rcpps", { XM, EXx } },
2498 { "rcpss", { XM, EXd } },
2499 { "(bad)", { XX } },
2500 { "(bad)", { XX } },
2503 /* PREFIX_0F58 */
2505 { "addps", { XM, EXx } },
2506 { "addss", { XM, EXd } },
2507 { "addpd", { XM, EXx } },
2508 { "addsd", { XM, EXq } },
2511 /* PREFIX_0F59 */
2513 { "mulps", { XM, EXx } },
2514 { "mulss", { XM, EXd } },
2515 { "mulpd", { XM, EXx } },
2516 { "mulsd", { XM, EXq } },
2519 /* PREFIX_0F5A */
2521 { "cvtps2pd", { XM, EXq } },
2522 { "cvtss2sd", { XM, EXd } },
2523 { "cvtpd2ps", { XM, EXx } },
2524 { "cvtsd2ss", { XM, EXq } },
2527 /* PREFIX_0F5B */
2529 { "cvtdq2ps", { XM, EXx } },
2530 { "cvttps2dq", { XM, EXx } },
2531 { "cvtps2dq", { XM, EXx } },
2532 { "(bad)", { XX } },
2535 /* PREFIX_0F5C */
2537 { "subps", { XM, EXx } },
2538 { "subss", { XM, EXd } },
2539 { "subpd", { XM, EXx } },
2540 { "subsd", { XM, EXq } },
2543 /* PREFIX_0F5D */
2545 { "minps", { XM, EXx } },
2546 { "minss", { XM, EXd } },
2547 { "minpd", { XM, EXx } },
2548 { "minsd", { XM, EXq } },
2551 /* PREFIX_0F5E */
2553 { "divps", { XM, EXx } },
2554 { "divss", { XM, EXd } },
2555 { "divpd", { XM, EXx } },
2556 { "divsd", { XM, EXq } },
2559 /* PREFIX_0F5F */
2561 { "maxps", { XM, EXx } },
2562 { "maxss", { XM, EXd } },
2563 { "maxpd", { XM, EXx } },
2564 { "maxsd", { XM, EXq } },
2567 /* PREFIX_0F60 */
2569 { "punpcklbw",{ MX, EMd } },
2570 { "(bad)", { XX } },
2571 { "punpcklbw",{ MX, EMx } },
2572 { "(bad)", { XX } },
2575 /* PREFIX_0F61 */
2577 { "punpcklwd",{ MX, EMd } },
2578 { "(bad)", { XX } },
2579 { "punpcklwd",{ MX, EMx } },
2580 { "(bad)", { XX } },
2583 /* PREFIX_0F62 */
2585 { "punpckldq",{ MX, EMd } },
2586 { "(bad)", { XX } },
2587 { "punpckldq",{ MX, EMx } },
2588 { "(bad)", { XX } },
2591 /* PREFIX_0F6C */
2593 { "(bad)", { XX } },
2594 { "(bad)", { XX } },
2595 { "punpcklqdq", { XM, EXx } },
2596 { "(bad)", { XX } },
2599 /* PREFIX_0F6D */
2601 { "(bad)", { XX } },
2602 { "(bad)", { XX } },
2603 { "punpckhqdq", { XM, EXx } },
2604 { "(bad)", { XX } },
2607 /* PREFIX_0F6F */
2609 { "movq", { MX, EM } },
2610 { "movdqu", { XM, EXx } },
2611 { "movdqa", { XM, EXx } },
2612 { "(bad)", { XX } },
2615 /* PREFIX_0F70 */
2617 { "pshufw", { MX, EM, Ib } },
2618 { "pshufhw",{ XM, EXx, Ib } },
2619 { "pshufd", { XM, EXx, Ib } },
2620 { "pshuflw",{ XM, EXx, Ib } },
2623 /* PREFIX_0F73_REG_3 */
2625 { "(bad)", { XX } },
2626 { "(bad)", { XX } },
2627 { "psrldq", { XS, Ib } },
2628 { "(bad)", { XX } },
2631 /* PREFIX_0F73_REG_7 */
2633 { "(bad)", { XX } },
2634 { "(bad)", { XX } },
2635 { "pslldq", { XS, Ib } },
2636 { "(bad)", { XX } },
2639 /* PREFIX_0F78 */
2641 {"vmread", { Em, Gm } },
2642 {"(bad)", { XX } },
2643 {"extrq", { XS, Ib, Ib } },
2644 {"insertq", { XM, XS, Ib, Ib } },
2647 /* PREFIX_0F79 */
2649 {"vmwrite", { Gm, Em } },
2650 {"(bad)", { XX } },
2651 {"extrq", { XM, XS } },
2652 {"insertq", { XM, XS } },
2655 /* PREFIX_0F7C */
2657 { "(bad)", { XX } },
2658 { "(bad)", { XX } },
2659 { "haddpd", { XM, EXx } },
2660 { "haddps", { XM, EXx } },
2663 /* PREFIX_0F7D */
2665 { "(bad)", { XX } },
2666 { "(bad)", { XX } },
2667 { "hsubpd", { XM, EXx } },
2668 { "hsubps", { XM, EXx } },
2671 /* PREFIX_0F7E */
2673 { "movK", { Edq, MX } },
2674 { "movq", { XM, EXq } },
2675 { "movK", { Edq, XM } },
2676 { "(bad)", { XX } },
2679 /* PREFIX_0F7F */
2681 { "movq", { EM, MX } },
2682 { "movdqu", { EXx, XM } },
2683 { "movdqa", { EXx, XM } },
2684 { "(bad)", { XX } },
2687 /* PREFIX_0FB8 */
2689 { "(bad)", { XX } },
2690 { "popcntS", { Gv, Ev } },
2691 { "(bad)", { XX } },
2692 { "(bad)", { XX } },
2695 /* PREFIX_0FBD */
2697 { "bsrS", { Gv, Ev } },
2698 { "lzcntS", { Gv, Ev } },
2699 { "bsrS", { Gv, Ev } },
2700 { "(bad)", { XX } },
2703 /* PREFIX_0FC2 */
2705 { "cmpps", { XM, EXx, CMP } },
2706 { "cmpss", { XM, EXd, CMP } },
2707 { "cmppd", { XM, EXx, CMP } },
2708 { "cmpsd", { XM, EXq, CMP } },
2711 /* PREFIX_0FC3 */
2713 { "movntiS", { Ma, Gv } },
2714 { "(bad)", { XX } },
2715 { "(bad)", { XX } },
2716 { "(bad)", { XX } },
2719 /* PREFIX_0FC7_REG_6 */
2721 { "vmptrld",{ Mq } },
2722 { "vmxon", { Mq } },
2723 { "vmclear",{ Mq } },
2724 { "(bad)", { XX } },
2727 /* PREFIX_0FD0 */
2729 { "(bad)", { XX } },
2730 { "(bad)", { XX } },
2731 { "addsubpd", { XM, EXx } },
2732 { "addsubps", { XM, EXx } },
2735 /* PREFIX_0FD6 */
2737 { "(bad)", { XX } },
2738 { "movq2dq",{ XM, MS } },
2739 { "movq", { EXq, XM } },
2740 { "movdq2q",{ MX, XS } },
2743 /* PREFIX_0FE6 */
2745 { "(bad)", { XX } },
2746 { "cvtdq2pd", { XM, EXq } },
2747 { "cvttpd2dq", { XM, EXx } },
2748 { "cvtpd2dq", { XM, EXx } },
2751 /* PREFIX_0FE7 */
2753 { "movntq", { Mq, MX } },
2754 { "(bad)", { XX } },
2755 { MOD_TABLE (MOD_0FE7_PREFIX_2) },
2756 { "(bad)", { XX } },
2759 /* PREFIX_0FF0 */
2761 { "(bad)", { XX } },
2762 { "(bad)", { XX } },
2763 { "(bad)", { XX } },
2764 { MOD_TABLE (MOD_0FF0_PREFIX_3) },
2767 /* PREFIX_0FF7 */
2769 { "maskmovq", { MX, MS } },
2770 { "(bad)", { XX } },
2771 { "maskmovdqu", { XM, XS } },
2772 { "(bad)", { XX } },
2775 /* PREFIX_0F3810 */
2777 { "(bad)", { XX } },
2778 { "(bad)", { XX } },
2779 { "pblendvb", { XM, EXx, XMM0 } },
2780 { "(bad)", { XX } },
2783 /* PREFIX_0F3814 */
2785 { "(bad)", { XX } },
2786 { "(bad)", { XX } },
2787 { "blendvps", { XM, EXx, XMM0 } },
2788 { "(bad)", { XX } },
2791 /* PREFIX_0F3815 */
2793 { "(bad)", { XX } },
2794 { "(bad)", { XX } },
2795 { "blendvpd", { XM, EXx, XMM0 } },
2796 { "(bad)", { XX } },
2799 /* PREFIX_0F3817 */
2801 { "(bad)", { XX } },
2802 { "(bad)", { XX } },
2803 { "ptest", { XM, EXx } },
2804 { "(bad)", { XX } },
2807 /* PREFIX_0F3820 */
2809 { "(bad)", { XX } },
2810 { "(bad)", { XX } },
2811 { "pmovsxbw", { XM, EXq } },
2812 { "(bad)", { XX } },
2815 /* PREFIX_0F3821 */
2817 { "(bad)", { XX } },
2818 { "(bad)", { XX } },
2819 { "pmovsxbd", { XM, EXd } },
2820 { "(bad)", { XX } },
2823 /* PREFIX_0F3822 */
2825 { "(bad)", { XX } },
2826 { "(bad)", { XX } },
2827 { "pmovsxbq", { XM, EXw } },
2828 { "(bad)", { XX } },
2831 /* PREFIX_0F3823 */
2833 { "(bad)", { XX } },
2834 { "(bad)", { XX } },
2835 { "pmovsxwd", { XM, EXq } },
2836 { "(bad)", { XX } },
2839 /* PREFIX_0F3824 */
2841 { "(bad)", { XX } },
2842 { "(bad)", { XX } },
2843 { "pmovsxwq", { XM, EXd } },
2844 { "(bad)", { XX } },
2847 /* PREFIX_0F3825 */
2849 { "(bad)", { XX } },
2850 { "(bad)", { XX } },
2851 { "pmovsxdq", { XM, EXq } },
2852 { "(bad)", { XX } },
2855 /* PREFIX_0F3828 */
2857 { "(bad)", { XX } },
2858 { "(bad)", { XX } },
2859 { "pmuldq", { XM, EXx } },
2860 { "(bad)", { XX } },
2863 /* PREFIX_0F3829 */
2865 { "(bad)", { XX } },
2866 { "(bad)", { XX } },
2867 { "pcmpeqq", { XM, EXx } },
2868 { "(bad)", { XX } },
2871 /* PREFIX_0F382A */
2873 { "(bad)", { XX } },
2874 { "(bad)", { XX } },
2875 { MOD_TABLE (MOD_0F382A_PREFIX_2) },
2876 { "(bad)", { XX } },
2879 /* PREFIX_0F382B */
2881 { "(bad)", { XX } },
2882 { "(bad)", { XX } },
2883 { "packusdw", { XM, EXx } },
2884 { "(bad)", { XX } },
2887 /* PREFIX_0F3830 */
2889 { "(bad)", { XX } },
2890 { "(bad)", { XX } },
2891 { "pmovzxbw", { XM, EXq } },
2892 { "(bad)", { XX } },
2895 /* PREFIX_0F3831 */
2897 { "(bad)", { XX } },
2898 { "(bad)", { XX } },
2899 { "pmovzxbd", { XM, EXd } },
2900 { "(bad)", { XX } },
2903 /* PREFIX_0F3832 */
2905 { "(bad)", { XX } },
2906 { "(bad)", { XX } },
2907 { "pmovzxbq", { XM, EXw } },
2908 { "(bad)", { XX } },
2911 /* PREFIX_0F3833 */
2913 { "(bad)", { XX } },
2914 { "(bad)", { XX } },
2915 { "pmovzxwd", { XM, EXq } },
2916 { "(bad)", { XX } },
2919 /* PREFIX_0F3834 */
2921 { "(bad)", { XX } },
2922 { "(bad)", { XX } },
2923 { "pmovzxwq", { XM, EXd } },
2924 { "(bad)", { XX } },
2927 /* PREFIX_0F3835 */
2929 { "(bad)", { XX } },
2930 { "(bad)", { XX } },
2931 { "pmovzxdq", { XM, EXq } },
2932 { "(bad)", { XX } },
2935 /* PREFIX_0F3837 */
2937 { "(bad)", { XX } },
2938 { "(bad)", { XX } },
2939 { "pcmpgtq", { XM, EXx } },
2940 { "(bad)", { XX } },
2943 /* PREFIX_0F3838 */
2945 { "(bad)", { XX } },
2946 { "(bad)", { XX } },
2947 { "pminsb", { XM, EXx } },
2948 { "(bad)", { XX } },
2951 /* PREFIX_0F3839 */
2953 { "(bad)", { XX } },
2954 { "(bad)", { XX } },
2955 { "pminsd", { XM, EXx } },
2956 { "(bad)", { XX } },
2959 /* PREFIX_0F383A */
2961 { "(bad)", { XX } },
2962 { "(bad)", { XX } },
2963 { "pminuw", { XM, EXx } },
2964 { "(bad)", { XX } },
2967 /* PREFIX_0F383B */
2969 { "(bad)", { XX } },
2970 { "(bad)", { XX } },
2971 { "pminud", { XM, EXx } },
2972 { "(bad)", { XX } },
2975 /* PREFIX_0F383C */
2977 { "(bad)", { XX } },
2978 { "(bad)", { XX } },
2979 { "pmaxsb", { XM, EXx } },
2980 { "(bad)", { XX } },
2983 /* PREFIX_0F383D */
2985 { "(bad)", { XX } },
2986 { "(bad)", { XX } },
2987 { "pmaxsd", { XM, EXx } },
2988 { "(bad)", { XX } },
2991 /* PREFIX_0F383E */
2993 { "(bad)", { XX } },
2994 { "(bad)", { XX } },
2995 { "pmaxuw", { XM, EXx } },
2996 { "(bad)", { XX } },
2999 /* PREFIX_0F383F */
3001 { "(bad)", { XX } },
3002 { "(bad)", { XX } },
3003 { "pmaxud", { XM, EXx } },
3004 { "(bad)", { XX } },
3007 /* PREFIX_0F3840 */
3009 { "(bad)", { XX } },
3010 { "(bad)", { XX } },
3011 { "pmulld", { XM, EXx } },
3012 { "(bad)", { XX } },
3015 /* PREFIX_0F3841 */
3017 { "(bad)", { XX } },
3018 { "(bad)", { XX } },
3019 { "phminposuw", { XM, EXx } },
3020 { "(bad)", { XX } },
3023 /* PREFIX_0F3880 */
3025 { "(bad)", { XX } },
3026 { "(bad)", { XX } },
3027 { "invept", { Gm, Mo } },
3028 { "(bad)", { XX } },
3031 /* PREFIX_0F3881 */
3033 { "(bad)", { XX } },
3034 { "(bad)", { XX } },
3035 { "invvpid", { Gm, Mo } },
3036 { "(bad)", { XX } },
3039 /* PREFIX_0F38DB */
3041 { "(bad)", { XX } },
3042 { "(bad)", { XX } },
3043 { "aesimc", { XM, EXx } },
3044 { "(bad)", { XX } },
3047 /* PREFIX_0F38DC */
3049 { "(bad)", { XX } },
3050 { "(bad)", { XX } },
3051 { "aesenc", { XM, EXx } },
3052 { "(bad)", { XX } },
3055 /* PREFIX_0F38DD */
3057 { "(bad)", { XX } },
3058 { "(bad)", { XX } },
3059 { "aesenclast", { XM, EXx } },
3060 { "(bad)", { XX } },
3063 /* PREFIX_0F38DE */
3065 { "(bad)", { XX } },
3066 { "(bad)", { XX } },
3067 { "aesdec", { XM, EXx } },
3068 { "(bad)", { XX } },
3071 /* PREFIX_0F38DF */
3073 { "(bad)", { XX } },
3074 { "(bad)", { XX } },
3075 { "aesdeclast", { XM, EXx } },
3076 { "(bad)", { XX } },
3079 /* PREFIX_0F38F0 */
3081 { "movbeS", { Gv, { MOVBE_Fixup, v_mode } } },
3082 { "(bad)", { XX } },
3083 { "movbeS", { Gv, { MOVBE_Fixup, v_mode } } },
3084 { "crc32", { Gdq, { CRC32_Fixup, b_mode } } },
3087 /* PREFIX_0F38F1 */
3089 { "movbeS", { { MOVBE_Fixup, v_mode }, Gv } },
3090 { "(bad)", { XX } },
3091 { "movbeS", { { MOVBE_Fixup, v_mode }, Gv } },
3092 { "crc32", { Gdq, { CRC32_Fixup, v_mode } } },
3095 /* PREFIX_0F3A08 */
3097 { "(bad)", { XX } },
3098 { "(bad)", { XX } },
3099 { "roundps", { XM, EXx, Ib } },
3100 { "(bad)", { XX } },
3103 /* PREFIX_0F3A09 */
3105 { "(bad)", { XX } },
3106 { "(bad)", { XX } },
3107 { "roundpd", { XM, EXx, Ib } },
3108 { "(bad)", { XX } },
3111 /* PREFIX_0F3A0A */
3113 { "(bad)", { XX } },
3114 { "(bad)", { XX } },
3115 { "roundss", { XM, EXd, Ib } },
3116 { "(bad)", { XX } },
3119 /* PREFIX_0F3A0B */
3121 { "(bad)", { XX } },
3122 { "(bad)", { XX } },
3123 { "roundsd", { XM, EXq, Ib } },
3124 { "(bad)", { XX } },
3127 /* PREFIX_0F3A0C */
3129 { "(bad)", { XX } },
3130 { "(bad)", { XX } },
3131 { "blendps", { XM, EXx, Ib } },
3132 { "(bad)", { XX } },
3135 /* PREFIX_0F3A0D */
3137 { "(bad)", { XX } },
3138 { "(bad)", { XX } },
3139 { "blendpd", { XM, EXx, Ib } },
3140 { "(bad)", { XX } },
3143 /* PREFIX_0F3A0E */
3145 { "(bad)", { XX } },
3146 { "(bad)", { XX } },
3147 { "pblendw", { XM, EXx, Ib } },
3148 { "(bad)", { XX } },
3151 /* PREFIX_0F3A14 */
3153 { "(bad)", { XX } },
3154 { "(bad)", { XX } },
3155 { "pextrb", { Edqb, XM, Ib } },
3156 { "(bad)", { XX } },
3159 /* PREFIX_0F3A15 */
3161 { "(bad)", { XX } },
3162 { "(bad)", { XX } },
3163 { "pextrw", { Edqw, XM, Ib } },
3164 { "(bad)", { XX } },
3167 /* PREFIX_0F3A16 */
3169 { "(bad)", { XX } },
3170 { "(bad)", { XX } },
3171 { "pextrK", { Edq, XM, Ib } },
3172 { "(bad)", { XX } },
3175 /* PREFIX_0F3A17 */
3177 { "(bad)", { XX } },
3178 { "(bad)", { XX } },
3179 { "extractps", { Edqd, XM, Ib } },
3180 { "(bad)", { XX } },
3183 /* PREFIX_0F3A20 */
3185 { "(bad)", { XX } },
3186 { "(bad)", { XX } },
3187 { "pinsrb", { XM, Edqb, Ib } },
3188 { "(bad)", { XX } },
3191 /* PREFIX_0F3A21 */
3193 { "(bad)", { XX } },
3194 { "(bad)", { XX } },
3195 { "insertps", { XM, EXd, Ib } },
3196 { "(bad)", { XX } },
3199 /* PREFIX_0F3A22 */
3201 { "(bad)", { XX } },
3202 { "(bad)", { XX } },
3203 { "pinsrK", { XM, Edq, Ib } },
3204 { "(bad)", { XX } },
3207 /* PREFIX_0F3A40 */
3209 { "(bad)", { XX } },
3210 { "(bad)", { XX } },
3211 { "dpps", { XM, EXx, Ib } },
3212 { "(bad)", { XX } },
3215 /* PREFIX_0F3A41 */
3217 { "(bad)", { XX } },
3218 { "(bad)", { XX } },
3219 { "dppd", { XM, EXx, Ib } },
3220 { "(bad)", { XX } },
3223 /* PREFIX_0F3A42 */
3225 { "(bad)", { XX } },
3226 { "(bad)", { XX } },
3227 { "mpsadbw", { XM, EXx, Ib } },
3228 { "(bad)", { XX } },
3231 /* PREFIX_0F3A44 */
3233 { "(bad)", { XX } },
3234 { "(bad)", { XX } },
3235 { "pclmulqdq", { XM, EXx, PCLMUL } },
3236 { "(bad)", { XX } },
3239 /* PREFIX_0F3A60 */
3241 { "(bad)", { XX } },
3242 { "(bad)", { XX } },
3243 { "pcmpestrm", { XM, EXx, Ib } },
3244 { "(bad)", { XX } },
3247 /* PREFIX_0F3A61 */
3249 { "(bad)", { XX } },
3250 { "(bad)", { XX } },
3251 { "pcmpestri", { XM, EXx, Ib } },
3252 { "(bad)", { XX } },
3255 /* PREFIX_0F3A62 */
3257 { "(bad)", { XX } },
3258 { "(bad)", { XX } },
3259 { "pcmpistrm", { XM, EXx, Ib } },
3260 { "(bad)", { XX } },
3263 /* PREFIX_0F3A63 */
3265 { "(bad)", { XX } },
3266 { "(bad)", { XX } },
3267 { "pcmpistri", { XM, EXx, Ib } },
3268 { "(bad)", { XX } },
3271 /* PREFIX_0F3ADF */
3273 { "(bad)", { XX } },
3274 { "(bad)", { XX } },
3275 { "aeskeygenassist", { XM, EXx, Ib } },
3276 { "(bad)", { XX } },
3279 /* PREFIX_VEX_10 */
3281 { "vmovups", { XM, EXx } },
3282 { VEX_LEN_TABLE (VEX_LEN_10_P_1) },
3283 { "vmovupd", { XM, EXx } },
3284 { VEX_LEN_TABLE (VEX_LEN_10_P_3) },
3287 /* PREFIX_VEX_11 */
3289 { "vmovups", { EXx, XM } },
3290 { VEX_LEN_TABLE (VEX_LEN_11_P_1) },
3291 { "vmovupd", { EXx, XM } },
3292 { VEX_LEN_TABLE (VEX_LEN_11_P_3) },
3295 /* PREFIX_VEX_12 */
3297 { MOD_TABLE (MOD_VEX_12_PREFIX_0) },
3298 { "vmovsldup", { XM, EXx } },
3299 { VEX_LEN_TABLE (VEX_LEN_12_P_2) },
3300 { "vmovddup", { XM, EXymmq } },
3303 /* PREFIX_VEX_16 */
3305 { MOD_TABLE (MOD_VEX_16_PREFIX_0) },
3306 { "vmovshdup", { XM, EXx } },
3307 { VEX_LEN_TABLE (VEX_LEN_16_P_2) },
3308 { "(bad)", { XX } },
3311 /* PREFIX_VEX_2A */
3313 { "(bad)", { XX } },
3314 { VEX_LEN_TABLE (VEX_LEN_2A_P_1) },
3315 { "(bad)", { XX } },
3316 { VEX_LEN_TABLE (VEX_LEN_2A_P_3) },
3319 /* PREFIX_VEX_2C */
3321 { "(bad)", { XX } },
3322 { VEX_LEN_TABLE (VEX_LEN_2C_P_1) },
3323 { "(bad)", { XX } },
3324 { VEX_LEN_TABLE (VEX_LEN_2C_P_3) },
3327 /* PREFIX_VEX_2D */
3329 { "(bad)", { XX } },
3330 { VEX_LEN_TABLE (VEX_LEN_2D_P_1) },
3331 { "(bad)", { XX } },
3332 { VEX_LEN_TABLE (VEX_LEN_2D_P_3) },
3335 /* PREFIX_VEX_2E */
3337 { VEX_LEN_TABLE (VEX_LEN_2E_P_0) },
3338 { "(bad)", { XX } },
3339 { VEX_LEN_TABLE (VEX_LEN_2E_P_2) },
3340 { "(bad)", { XX } },
3343 /* PREFIX_VEX_2F */
3345 { VEX_LEN_TABLE (VEX_LEN_2F_P_0) },
3346 { "(bad)", { XX } },
3347 { VEX_LEN_TABLE (VEX_LEN_2F_P_2) },
3348 { "(bad)", { XX } },
3351 /* PREFIX_VEX_51 */
3353 { "vsqrtps", { XM, EXx } },
3354 { VEX_LEN_TABLE (VEX_LEN_51_P_1) },
3355 { "vsqrtpd", { XM, EXx } },
3356 { VEX_LEN_TABLE (VEX_LEN_51_P_3) },
3359 /* PREFIX_VEX_52 */
3361 { "vrsqrtps", { XM, EXx } },
3362 { VEX_LEN_TABLE (VEX_LEN_52_P_1) },
3363 { "(bad)", { XX } },
3364 { "(bad)", { XX } },
3367 /* PREFIX_VEX_53 */
3369 { "vrcpps", { XM, EXx } },
3370 { VEX_LEN_TABLE (VEX_LEN_53_P_1) },
3371 { "(bad)", { XX } },
3372 { "(bad)", { XX } },
3375 /* PREFIX_VEX_58 */
3377 { "vaddps", { XM, Vex, EXx } },
3378 { VEX_LEN_TABLE (VEX_LEN_58_P_1) },
3379 { "vaddpd", { XM, Vex, EXx } },
3380 { VEX_LEN_TABLE (VEX_LEN_58_P_3) },
3383 /* PREFIX_VEX_59 */
3385 { "vmulps", { XM, Vex, EXx } },
3386 { VEX_LEN_TABLE (VEX_LEN_59_P_1) },
3387 { "vmulpd", { XM, Vex, EXx } },
3388 { VEX_LEN_TABLE (VEX_LEN_59_P_3) },
3391 /* PREFIX_VEX_5A */
3393 { "vcvtps2pd", { XM, EXxmmq } },
3394 { VEX_LEN_TABLE (VEX_LEN_5A_P_1) },
3395 { "vcvtpd2ps%XY", { XMM, EXx } },
3396 { VEX_LEN_TABLE (VEX_LEN_5A_P_3) },
3399 /* PREFIX_VEX_5B */
3401 { "vcvtdq2ps", { XM, EXx } },
3402 { "vcvttps2dq", { XM, EXx } },
3403 { "vcvtps2dq", { XM, EXx } },
3404 { "(bad)", { XX } },
3407 /* PREFIX_VEX_5C */
3409 { "vsubps", { XM, Vex, EXx } },
3410 { VEX_LEN_TABLE (VEX_LEN_5C_P_1) },
3411 { "vsubpd", { XM, Vex, EXx } },
3412 { VEX_LEN_TABLE (VEX_LEN_5C_P_3) },
3415 /* PREFIX_VEX_5D */
3417 { "vminps", { XM, Vex, EXx } },
3418 { VEX_LEN_TABLE (VEX_LEN_5D_P_1) },
3419 { "vminpd", { XM, Vex, EXx } },
3420 { VEX_LEN_TABLE (VEX_LEN_5D_P_3) },
3423 /* PREFIX_VEX_5E */
3425 { "vdivps", { XM, Vex, EXx } },
3426 { VEX_LEN_TABLE (VEX_LEN_5E_P_1) },
3427 { "vdivpd", { XM, Vex, EXx } },
3428 { VEX_LEN_TABLE (VEX_LEN_5E_P_3) },
3431 /* PREFIX_VEX_5F */
3433 { "vmaxps", { XM, Vex, EXx } },
3434 { VEX_LEN_TABLE (VEX_LEN_5F_P_1) },
3435 { "vmaxpd", { XM, Vex, EXx } },
3436 { VEX_LEN_TABLE (VEX_LEN_5F_P_3) },
3439 /* PREFIX_VEX_60 */
3441 { "(bad)", { XX } },
3442 { "(bad)", { XX } },
3443 { VEX_LEN_TABLE (VEX_LEN_60_P_2) },
3444 { "(bad)", { XX } },
3447 /* PREFIX_VEX_61 */
3449 { "(bad)", { XX } },
3450 { "(bad)", { XX } },
3451 { VEX_LEN_TABLE (VEX_LEN_61_P_2) },
3452 { "(bad)", { XX } },
3455 /* PREFIX_VEX_62 */
3457 { "(bad)", { XX } },
3458 { "(bad)", { XX } },
3459 { VEX_LEN_TABLE (VEX_LEN_62_P_2) },
3460 { "(bad)", { XX } },
3463 /* PREFIX_VEX_63 */
3465 { "(bad)", { XX } },
3466 { "(bad)", { XX } },
3467 { VEX_LEN_TABLE (VEX_LEN_63_P_2) },
3468 { "(bad)", { XX } },
3471 /* PREFIX_VEX_64 */
3473 { "(bad)", { XX } },
3474 { "(bad)", { XX } },
3475 { VEX_LEN_TABLE (VEX_LEN_64_P_2) },
3476 { "(bad)", { XX } },
3479 /* PREFIX_VEX_65 */
3481 { "(bad)", { XX } },
3482 { "(bad)", { XX } },
3483 { VEX_LEN_TABLE (VEX_LEN_65_P_2) },
3484 { "(bad)", { XX } },
3487 /* PREFIX_VEX_66 */
3489 { "(bad)", { XX } },
3490 { "(bad)", { XX } },
3491 { VEX_LEN_TABLE (VEX_LEN_66_P_2) },
3492 { "(bad)", { XX } },
3495 /* PREFIX_VEX_67 */
3497 { "(bad)", { XX } },
3498 { "(bad)", { XX } },
3499 { VEX_LEN_TABLE (VEX_LEN_67_P_2) },
3500 { "(bad)", { XX } },
3503 /* PREFIX_VEX_68 */
3505 { "(bad)", { XX } },
3506 { "(bad)", { XX } },
3507 { VEX_LEN_TABLE (VEX_LEN_68_P_2) },
3508 { "(bad)", { XX } },
3511 /* PREFIX_VEX_69 */
3513 { "(bad)", { XX } },
3514 { "(bad)", { XX } },
3515 { VEX_LEN_TABLE (VEX_LEN_69_P_2) },
3516 { "(bad)", { XX } },
3519 /* PREFIX_VEX_6A */
3521 { "(bad)", { XX } },
3522 { "(bad)", { XX } },
3523 { VEX_LEN_TABLE (VEX_LEN_6A_P_2) },
3524 { "(bad)", { XX } },
3527 /* PREFIX_VEX_6B */
3529 { "(bad)", { XX } },
3530 { "(bad)", { XX } },
3531 { VEX_LEN_TABLE (VEX_LEN_6B_P_2) },
3532 { "(bad)", { XX } },
3535 /* PREFIX_VEX_6C */
3537 { "(bad)", { XX } },
3538 { "(bad)", { XX } },
3539 { VEX_LEN_TABLE (VEX_LEN_6C_P_2) },
3540 { "(bad)", { XX } },
3543 /* PREFIX_VEX_6D */
3545 { "(bad)", { XX } },
3546 { "(bad)", { XX } },
3547 { VEX_LEN_TABLE (VEX_LEN_6D_P_2) },
3548 { "(bad)", { XX } },
3551 /* PREFIX_VEX_6E */
3553 { "(bad)", { XX } },
3554 { "(bad)", { XX } },
3555 { VEX_LEN_TABLE (VEX_LEN_6E_P_2) },
3556 { "(bad)", { XX } },
3559 /* PREFIX_VEX_6F */
3561 { "(bad)", { XX } },
3562 { "vmovdqu", { XM, EXx } },
3563 { "vmovdqa", { XM, EXx } },
3564 { "(bad)", { XX } },
3567 /* PREFIX_VEX_70 */
3569 { "(bad)", { XX } },
3570 { VEX_LEN_TABLE (VEX_LEN_70_P_1) },
3571 { VEX_LEN_TABLE (VEX_LEN_70_P_2) },
3572 { VEX_LEN_TABLE (VEX_LEN_70_P_3) },
3575 /* PREFIX_VEX_71_REG_2 */
3577 { "(bad)", { XX } },
3578 { "(bad)", { XX } },
3579 { VEX_LEN_TABLE (VEX_LEN_71_R_2_P_2) },
3580 { "(bad)", { XX } },
3583 /* PREFIX_VEX_71_REG_4 */
3585 { "(bad)", { XX } },
3586 { "(bad)", { XX } },
3587 { VEX_LEN_TABLE (VEX_LEN_71_R_4_P_2) },
3588 { "(bad)", { XX } },
3591 /* PREFIX_VEX_71_REG_6 */
3593 { "(bad)", { XX } },
3594 { "(bad)", { XX } },
3595 { VEX_LEN_TABLE (VEX_LEN_71_R_6_P_2) },
3596 { "(bad)", { XX } },
3599 /* PREFIX_VEX_72_REG_2 */
3601 { "(bad)", { XX } },
3602 { "(bad)", { XX } },
3603 { VEX_LEN_TABLE (VEX_LEN_72_R_2_P_2) },
3604 { "(bad)", { XX } },
3607 /* PREFIX_VEX_72_REG_4 */
3609 { "(bad)", { XX } },
3610 { "(bad)", { XX } },
3611 { VEX_LEN_TABLE (VEX_LEN_72_R_4_P_2) },
3612 { "(bad)", { XX } },
3615 /* PREFIX_VEX_72_REG_6 */
3617 { "(bad)", { XX } },
3618 { "(bad)", { XX } },
3619 { VEX_LEN_TABLE (VEX_LEN_72_R_6_P_2) },
3620 { "(bad)", { XX } },
3623 /* PREFIX_VEX_73_REG_2 */
3625 { "(bad)", { XX } },
3626 { "(bad)", { XX } },
3627 { VEX_LEN_TABLE (VEX_LEN_73_R_2_P_2) },
3628 { "(bad)", { XX } },
3631 /* PREFIX_VEX_73_REG_3 */
3633 { "(bad)", { XX } },
3634 { "(bad)", { XX } },
3635 { VEX_LEN_TABLE (VEX_LEN_73_R_3_P_2) },
3636 { "(bad)", { XX } },
3639 /* PREFIX_VEX_73_REG_6 */
3641 { "(bad)", { XX } },
3642 { "(bad)", { XX } },
3643 { VEX_LEN_TABLE (VEX_LEN_73_R_6_P_2) },
3644 { "(bad)", { XX } },
3647 /* PREFIX_VEX_73_REG_7 */
3649 { "(bad)", { XX } },
3650 { "(bad)", { XX } },
3651 { VEX_LEN_TABLE (VEX_LEN_73_R_7_P_2) },
3652 { "(bad)", { XX } },
3655 /* PREFIX_VEX_74 */
3657 { "(bad)", { XX } },
3658 { "(bad)", { XX } },
3659 { VEX_LEN_TABLE (VEX_LEN_74_P_2) },
3660 { "(bad)", { XX } },
3663 /* PREFIX_VEX_75 */
3665 { "(bad)", { XX } },
3666 { "(bad)", { XX } },
3667 { VEX_LEN_TABLE (VEX_LEN_75_P_2) },
3668 { "(bad)", { XX } },
3671 /* PREFIX_VEX_76 */
3673 { "(bad)", { XX } },
3674 { "(bad)", { XX } },
3675 { VEX_LEN_TABLE (VEX_LEN_76_P_2) },
3676 { "(bad)", { XX } },
3679 /* PREFIX_VEX_77 */
3681 { "", { VZERO } },
3682 { "(bad)", { XX } },
3683 { "(bad)", { XX } },
3684 { "(bad)", { XX } },
3687 /* PREFIX_VEX_7C */
3689 { "(bad)", { XX } },
3690 { "(bad)", { XX } },
3691 { "vhaddpd", { XM, Vex, EXx } },
3692 { "vhaddps", { XM, Vex, EXx } },
3695 /* PREFIX_VEX_7D */
3697 { "(bad)", { XX } },
3698 { "(bad)", { XX } },
3699 { "vhsubpd", { XM, Vex, EXx } },
3700 { "vhsubps", { XM, Vex, EXx } },
3703 /* PREFIX_VEX_7E */
3705 { "(bad)", { XX } },
3706 { VEX_LEN_TABLE (VEX_LEN_7E_P_1) },
3707 { VEX_LEN_TABLE (VEX_LEN_7E_P_2) },
3708 { "(bad)", { XX } },
3711 /* PREFIX_VEX_7F */
3713 { "(bad)", { XX } },
3714 { "vmovdqu", { EXx, XM } },
3715 { "vmovdqa", { EXx, XM } },
3716 { "(bad)", { XX } },
3719 /* PREFIX_VEX_C2 */
3721 { "vcmpps", { XM, Vex, EXx, VCMP } },
3722 { VEX_LEN_TABLE (VEX_LEN_C2_P_1) },
3723 { "vcmppd", { XM, Vex, EXx, VCMP } },
3724 { VEX_LEN_TABLE (VEX_LEN_C2_P_3) },
3727 /* PREFIX_VEX_C4 */
3729 { "(bad)", { XX } },
3730 { "(bad)", { XX } },
3731 { VEX_LEN_TABLE (VEX_LEN_C4_P_2) },
3732 { "(bad)", { XX } },
3735 /* PREFIX_VEX_C5 */
3737 { "(bad)", { XX } },
3738 { "(bad)", { XX } },
3739 { VEX_LEN_TABLE (VEX_LEN_C5_P_2) },
3740 { "(bad)", { XX } },
3743 /* PREFIX_VEX_D0 */
3745 { "(bad)", { XX } },
3746 { "(bad)", { XX } },
3747 { "vaddsubpd", { XM, Vex, EXx } },
3748 { "vaddsubps", { XM, Vex, EXx } },
3751 /* PREFIX_VEX_D1 */
3753 { "(bad)", { XX } },
3754 { "(bad)", { XX } },
3755 { VEX_LEN_TABLE (VEX_LEN_D1_P_2) },
3756 { "(bad)", { XX } },
3759 /* PREFIX_VEX_D2 */
3761 { "(bad)", { XX } },
3762 { "(bad)", { XX } },
3763 { VEX_LEN_TABLE (VEX_LEN_D2_P_2) },
3764 { "(bad)", { XX } },
3767 /* PREFIX_VEX_D3 */
3769 { "(bad)", { XX } },
3770 { "(bad)", { XX } },
3771 { VEX_LEN_TABLE (VEX_LEN_D3_P_2) },
3772 { "(bad)", { XX } },
3775 /* PREFIX_VEX_D4 */
3777 { "(bad)", { XX } },
3778 { "(bad)", { XX } },
3779 { VEX_LEN_TABLE (VEX_LEN_D4_P_2) },
3780 { "(bad)", { XX } },
3783 /* PREFIX_VEX_D5 */
3785 { "(bad)", { XX } },
3786 { "(bad)", { XX } },
3787 { VEX_LEN_TABLE (VEX_LEN_D5_P_2) },
3788 { "(bad)", { XX } },
3791 /* PREFIX_VEX_D6 */
3793 { "(bad)", { XX } },
3794 { "(bad)", { XX } },
3795 { VEX_LEN_TABLE (VEX_LEN_D6_P_2) },
3796 { "(bad)", { XX } },
3799 /* PREFIX_VEX_D7 */
3801 { "(bad)", { XX } },
3802 { "(bad)", { XX } },
3803 { MOD_TABLE (MOD_VEX_D7_PREFIX_2) },
3804 { "(bad)", { XX } },
3807 /* PREFIX_VEX_D8 */
3809 { "(bad)", { XX } },
3810 { "(bad)", { XX } },
3811 { VEX_LEN_TABLE (VEX_LEN_D8_P_2) },
3812 { "(bad)", { XX } },
3815 /* PREFIX_VEX_D9 */
3817 { "(bad)", { XX } },
3818 { "(bad)", { XX } },
3819 { VEX_LEN_TABLE (VEX_LEN_D9_P_2) },
3820 { "(bad)", { XX } },
3823 /* PREFIX_VEX_DA */
3825 { "(bad)", { XX } },
3826 { "(bad)", { XX } },
3827 { VEX_LEN_TABLE (VEX_LEN_DA_P_2) },
3828 { "(bad)", { XX } },
3831 /* PREFIX_VEX_DB */
3833 { "(bad)", { XX } },
3834 { "(bad)", { XX } },
3835 { VEX_LEN_TABLE (VEX_LEN_DB_P_2) },
3836 { "(bad)", { XX } },
3839 /* PREFIX_VEX_DC */
3841 { "(bad)", { XX } },
3842 { "(bad)", { XX } },
3843 { VEX_LEN_TABLE (VEX_LEN_DC_P_2) },
3844 { "(bad)", { XX } },
3847 /* PREFIX_VEX_DD */
3849 { "(bad)", { XX } },
3850 { "(bad)", { XX } },
3851 { VEX_LEN_TABLE (VEX_LEN_DD_P_2) },
3852 { "(bad)", { XX } },
3855 /* PREFIX_VEX_DE */
3857 { "(bad)", { XX } },
3858 { "(bad)", { XX } },
3859 { VEX_LEN_TABLE (VEX_LEN_DE_P_2) },
3860 { "(bad)", { XX } },
3863 /* PREFIX_VEX_DF */
3865 { "(bad)", { XX } },
3866 { "(bad)", { XX } },
3867 { VEX_LEN_TABLE (VEX_LEN_DF_P_2) },
3868 { "(bad)", { XX } },
3871 /* PREFIX_VEX_E0 */
3873 { "(bad)", { XX } },
3874 { "(bad)", { XX } },
3875 { VEX_LEN_TABLE (VEX_LEN_E0_P_2) },
3876 { "(bad)", { XX } },
3879 /* PREFIX_VEX_E1 */
3881 { "(bad)", { XX } },
3882 { "(bad)", { XX } },
3883 { VEX_LEN_TABLE (VEX_LEN_E1_P_2) },
3884 { "(bad)", { XX } },
3887 /* PREFIX_VEX_E2 */
3889 { "(bad)", { XX } },
3890 { "(bad)", { XX } },
3891 { VEX_LEN_TABLE (VEX_LEN_E2_P_2) },
3892 { "(bad)", { XX } },
3895 /* PREFIX_VEX_E3 */
3897 { "(bad)", { XX } },
3898 { "(bad)", { XX } },
3899 { VEX_LEN_TABLE (VEX_LEN_E3_P_2) },
3900 { "(bad)", { XX } },
3903 /* PREFIX_VEX_E4 */
3905 { "(bad)", { XX } },
3906 { "(bad)", { XX } },
3907 { VEX_LEN_TABLE (VEX_LEN_E4_P_2) },
3908 { "(bad)", { XX } },
3911 /* PREFIX_VEX_E5 */
3913 { "(bad)", { XX } },
3914 { "(bad)", { XX } },
3915 { VEX_LEN_TABLE (VEX_LEN_E5_P_2) },
3916 { "(bad)", { XX } },
3919 /* PREFIX_VEX_E6 */
3921 { "(bad)", { XX } },
3922 { "vcvtdq2pd", { XM, EXxmmq } },
3923 { "vcvttpd2dq%XY", { XMM, EXx } },
3924 { "vcvtpd2dq%XY", { XMM, EXx } },
3927 /* PREFIX_VEX_E7 */
3929 { "(bad)", { XX } },
3930 { "(bad)", { XX } },
3931 { MOD_TABLE (MOD_VEX_E7_PREFIX_2) },
3932 { "(bad)", { XX } },
3935 /* PREFIX_VEX_E8 */
3937 { "(bad)", { XX } },
3938 { "(bad)", { XX } },
3939 { VEX_LEN_TABLE (VEX_LEN_E8_P_2) },
3940 { "(bad)", { XX } },
3943 /* PREFIX_VEX_E9 */
3945 { "(bad)", { XX } },
3946 { "(bad)", { XX } },
3947 { VEX_LEN_TABLE (VEX_LEN_E9_P_2) },
3948 { "(bad)", { XX } },
3951 /* PREFIX_VEX_EA */
3953 { "(bad)", { XX } },
3954 { "(bad)", { XX } },
3955 { VEX_LEN_TABLE (VEX_LEN_EA_P_2) },
3956 { "(bad)", { XX } },
3959 /* PREFIX_VEX_EB */
3961 { "(bad)", { XX } },
3962 { "(bad)", { XX } },
3963 { VEX_LEN_TABLE (VEX_LEN_EB_P_2) },
3964 { "(bad)", { XX } },
3967 /* PREFIX_VEX_EC */
3969 { "(bad)", { XX } },
3970 { "(bad)", { XX } },
3971 { VEX_LEN_TABLE (VEX_LEN_EC_P_2) },
3972 { "(bad)", { XX } },
3975 /* PREFIX_VEX_ED */
3977 { "(bad)", { XX } },
3978 { "(bad)", { XX } },
3979 { VEX_LEN_TABLE (VEX_LEN_ED_P_2) },
3980 { "(bad)", { XX } },
3983 /* PREFIX_VEX_EE */
3985 { "(bad)", { XX } },
3986 { "(bad)", { XX } },
3987 { VEX_LEN_TABLE (VEX_LEN_EE_P_2) },
3988 { "(bad)", { XX } },
3991 /* PREFIX_VEX_EF */
3993 { "(bad)", { XX } },
3994 { "(bad)", { XX } },
3995 { VEX_LEN_TABLE (VEX_LEN_EF_P_2) },
3996 { "(bad)", { XX } },
3999 /* PREFIX_VEX_F0 */
4001 { "(bad)", { XX } },
4002 { "(bad)", { XX } },
4003 { "(bad)", { XX } },
4004 { MOD_TABLE (MOD_VEX_F0_PREFIX_3) },
4007 /* PREFIX_VEX_F1 */
4009 { "(bad)", { XX } },
4010 { "(bad)", { XX } },
4011 { VEX_LEN_TABLE (VEX_LEN_F1_P_2) },
4012 { "(bad)", { XX } },
4015 /* PREFIX_VEX_F2 */
4017 { "(bad)", { XX } },
4018 { "(bad)", { XX } },
4019 { VEX_LEN_TABLE (VEX_LEN_F2_P_2) },
4020 { "(bad)", { XX } },
4023 /* PREFIX_VEX_F3 */
4025 { "(bad)", { XX } },
4026 { "(bad)", { XX } },
4027 { VEX_LEN_TABLE (VEX_LEN_F3_P_2) },
4028 { "(bad)", { XX } },
4031 /* PREFIX_VEX_F4 */
4033 { "(bad)", { XX } },
4034 { "(bad)", { XX } },
4035 { VEX_LEN_TABLE (VEX_LEN_F4_P_2) },
4036 { "(bad)", { XX } },
4039 /* PREFIX_VEX_F5 */
4041 { "(bad)", { XX } },
4042 { "(bad)", { XX } },
4043 { VEX_LEN_TABLE (VEX_LEN_F5_P_2) },
4044 { "(bad)", { XX } },
4047 /* PREFIX_VEX_F6 */
4049 { "(bad)", { XX } },
4050 { "(bad)", { XX } },
4051 { VEX_LEN_TABLE (VEX_LEN_F6_P_2) },
4052 { "(bad)", { XX } },
4055 /* PREFIX_VEX_F7 */
4057 { "(bad)", { XX } },
4058 { "(bad)", { XX } },
4059 { VEX_LEN_TABLE (VEX_LEN_F7_P_2) },
4060 { "(bad)", { XX } },
4063 /* PREFIX_VEX_F8 */
4065 { "(bad)", { XX } },
4066 { "(bad)", { XX } },
4067 { VEX_LEN_TABLE (VEX_LEN_F8_P_2) },
4068 { "(bad)", { XX } },
4071 /* PREFIX_VEX_F9 */
4073 { "(bad)", { XX } },
4074 { "(bad)", { XX } },
4075 { VEX_LEN_TABLE (VEX_LEN_F9_P_2) },
4076 { "(bad)", { XX } },
4079 /* PREFIX_VEX_FA */
4081 { "(bad)", { XX } },
4082 { "(bad)", { XX } },
4083 { VEX_LEN_TABLE (VEX_LEN_FA_P_2) },
4084 { "(bad)", { XX } },
4087 /* PREFIX_VEX_FB */
4089 { "(bad)", { XX } },
4090 { "(bad)", { XX } },
4091 { VEX_LEN_TABLE (VEX_LEN_FB_P_2) },
4092 { "(bad)", { XX } },
4095 /* PREFIX_VEX_FC */
4097 { "(bad)", { XX } },
4098 { "(bad)", { XX } },
4099 { VEX_LEN_TABLE (VEX_LEN_FC_P_2) },
4100 { "(bad)", { XX } },
4103 /* PREFIX_VEX_FD */
4105 { "(bad)", { XX } },
4106 { "(bad)", { XX } },
4107 { VEX_LEN_TABLE (VEX_LEN_FD_P_2) },
4108 { "(bad)", { XX } },
4111 /* PREFIX_VEX_FE */
4113 { "(bad)", { XX } },
4114 { "(bad)", { XX } },
4115 { VEX_LEN_TABLE (VEX_LEN_FE_P_2) },
4116 { "(bad)", { XX } },
4119 /* PREFIX_VEX_3800 */
4121 { "(bad)", { XX } },
4122 { "(bad)", { XX } },
4123 { VEX_LEN_TABLE (VEX_LEN_3800_P_2) },
4124 { "(bad)", { XX } },
4127 /* PREFIX_VEX_3801 */
4129 { "(bad)", { XX } },
4130 { "(bad)", { XX } },
4131 { VEX_LEN_TABLE (VEX_LEN_3801_P_2) },
4132 { "(bad)", { XX } },
4135 /* PREFIX_VEX_3802 */
4137 { "(bad)", { XX } },
4138 { "(bad)", { XX } },
4139 { VEX_LEN_TABLE (VEX_LEN_3802_P_2) },
4140 { "(bad)", { XX } },
4143 /* PREFIX_VEX_3803 */
4145 { "(bad)", { XX } },
4146 { "(bad)", { XX } },
4147 { VEX_LEN_TABLE (VEX_LEN_3803_P_2) },
4148 { "(bad)", { XX } },
4151 /* PREFIX_VEX_3804 */
4153 { "(bad)", { XX } },
4154 { "(bad)", { XX } },
4155 { VEX_LEN_TABLE (VEX_LEN_3804_P_2) },
4156 { "(bad)", { XX } },
4159 /* PREFIX_VEX_3805 */
4161 { "(bad)", { XX } },
4162 { "(bad)", { XX } },
4163 { VEX_LEN_TABLE (VEX_LEN_3805_P_2) },
4164 { "(bad)", { XX } },
4167 /* PREFIX_VEX_3806 */
4169 { "(bad)", { XX } },
4170 { "(bad)", { XX } },
4171 { VEX_LEN_TABLE (VEX_LEN_3806_P_2) },
4172 { "(bad)", { XX } },
4175 /* PREFIX_VEX_3807 */
4177 { "(bad)", { XX } },
4178 { "(bad)", { XX } },
4179 { VEX_LEN_TABLE (VEX_LEN_3807_P_2) },
4180 { "(bad)", { XX } },
4183 /* PREFIX_VEX_3808 */
4185 { "(bad)", { XX } },
4186 { "(bad)", { XX } },
4187 { VEX_LEN_TABLE (VEX_LEN_3808_P_2) },
4188 { "(bad)", { XX } },
4191 /* PREFIX_VEX_3809 */
4193 { "(bad)", { XX } },
4194 { "(bad)", { XX } },
4195 { VEX_LEN_TABLE (VEX_LEN_3809_P_2) },
4196 { "(bad)", { XX } },
4199 /* PREFIX_VEX_380A */
4201 { "(bad)", { XX } },
4202 { "(bad)", { XX } },
4203 { VEX_LEN_TABLE (VEX_LEN_380A_P_2) },
4204 { "(bad)", { XX } },
4207 /* PREFIX_VEX_380B */
4209 { "(bad)", { XX } },
4210 { "(bad)", { XX } },
4211 { VEX_LEN_TABLE (VEX_LEN_380B_P_2) },
4212 { "(bad)", { XX } },
4215 /* PREFIX_VEX_380C */
4217 { "(bad)", { XX } },
4218 { "(bad)", { XX } },
4219 { "vpermilps", { XM, Vex, EXx } },
4220 { "(bad)", { XX } },
4223 /* PREFIX_VEX_380D */
4225 { "(bad)", { XX } },
4226 { "(bad)", { XX } },
4227 { "vpermilpd", { XM, Vex, EXx } },
4228 { "(bad)", { XX } },
4231 /* PREFIX_VEX_380E */
4233 { "(bad)", { XX } },
4234 { "(bad)", { XX } },
4235 { "vtestps", { XM, EXx } },
4236 { "(bad)", { XX } },
4239 /* PREFIX_VEX_380F */
4241 { "(bad)", { XX } },
4242 { "(bad)", { XX } },
4243 { "vtestpd", { XM, EXx } },
4244 { "(bad)", { XX } },
4247 /* PREFIX_VEX_3817 */
4249 { "(bad)", { XX } },
4250 { "(bad)", { XX } },
4251 { "vptest", { XM, EXx } },
4252 { "(bad)", { XX } },
4255 /* PREFIX_VEX_3818 */
4257 { "(bad)", { XX } },
4258 { "(bad)", { XX } },
4259 { MOD_TABLE (MOD_VEX_3818_PREFIX_2) },
4260 { "(bad)", { XX } },
4263 /* PREFIX_VEX_3819 */
4265 { "(bad)", { XX } },
4266 { "(bad)", { XX } },
4267 { MOD_TABLE (MOD_VEX_3819_PREFIX_2) },
4268 { "(bad)", { XX } },
4271 /* PREFIX_VEX_381A */
4273 { "(bad)", { XX } },
4274 { "(bad)", { XX } },
4275 { MOD_TABLE (MOD_VEX_381A_PREFIX_2) },
4276 { "(bad)", { XX } },
4279 /* PREFIX_VEX_381C */
4281 { "(bad)", { XX } },
4282 { "(bad)", { XX } },
4283 { VEX_LEN_TABLE (VEX_LEN_381C_P_2) },
4284 { "(bad)", { XX } },
4287 /* PREFIX_VEX_381D */
4289 { "(bad)", { XX } },
4290 { "(bad)", { XX } },
4291 { VEX_LEN_TABLE (VEX_LEN_381D_P_2) },
4292 { "(bad)", { XX } },
4295 /* PREFIX_VEX_381E */
4297 { "(bad)", { XX } },
4298 { "(bad)", { XX } },
4299 { VEX_LEN_TABLE (VEX_LEN_381E_P_2) },
4300 { "(bad)", { XX } },
4303 /* PREFIX_VEX_3820 */
4305 { "(bad)", { XX } },
4306 { "(bad)", { XX } },
4307 { VEX_LEN_TABLE (VEX_LEN_3820_P_2) },
4308 { "(bad)", { XX } },
4311 /* PREFIX_VEX_3821 */
4313 { "(bad)", { XX } },
4314 { "(bad)", { XX } },
4315 { VEX_LEN_TABLE (VEX_LEN_3821_P_2) },
4316 { "(bad)", { XX } },
4319 /* PREFIX_VEX_3822 */
4321 { "(bad)", { XX } },
4322 { "(bad)", { XX } },
4323 { VEX_LEN_TABLE (VEX_LEN_3822_P_2) },
4324 { "(bad)", { XX } },
4327 /* PREFIX_VEX_3823 */
4329 { "(bad)", { XX } },
4330 { "(bad)", { XX } },
4331 { VEX_LEN_TABLE (VEX_LEN_3823_P_2) },
4332 { "(bad)", { XX } },
4335 /* PREFIX_VEX_3824 */
4337 { "(bad)", { XX } },
4338 { "(bad)", { XX } },
4339 { VEX_LEN_TABLE (VEX_LEN_3824_P_2) },
4340 { "(bad)", { XX } },
4343 /* PREFIX_VEX_3825 */
4345 { "(bad)", { XX } },
4346 { "(bad)", { XX } },
4347 { VEX_LEN_TABLE (VEX_LEN_3825_P_2) },
4348 { "(bad)", { XX } },
4351 /* PREFIX_VEX_3828 */
4353 { "(bad)", { XX } },
4354 { "(bad)", { XX } },
4355 { VEX_LEN_TABLE (VEX_LEN_3828_P_2) },
4356 { "(bad)", { XX } },
4359 /* PREFIX_VEX_3829 */
4361 { "(bad)", { XX } },
4362 { "(bad)", { XX } },
4363 { VEX_LEN_TABLE (VEX_LEN_3829_P_2) },
4364 { "(bad)", { XX } },
4367 /* PREFIX_VEX_382A */
4369 { "(bad)", { XX } },
4370 { "(bad)", { XX } },
4371 { MOD_TABLE (MOD_VEX_382A_PREFIX_2) },
4372 { "(bad)", { XX } },
4375 /* PREFIX_VEX_382B */
4377 { "(bad)", { XX } },
4378 { "(bad)", { XX } },
4379 { VEX_LEN_TABLE (VEX_LEN_382B_P_2) },
4380 { "(bad)", { XX } },
4383 /* PREFIX_VEX_382C */
4385 { "(bad)", { XX } },
4386 { "(bad)", { XX } },
4387 { MOD_TABLE (MOD_VEX_382C_PREFIX_2) },
4388 { "(bad)", { XX } },
4391 /* PREFIX_VEX_382D */
4393 { "(bad)", { XX } },
4394 { "(bad)", { XX } },
4395 { MOD_TABLE (MOD_VEX_382D_PREFIX_2) },
4396 { "(bad)", { XX } },
4399 /* PREFIX_VEX_382E */
4401 { "(bad)", { XX } },
4402 { "(bad)", { XX } },
4403 { MOD_TABLE (MOD_VEX_382E_PREFIX_2) },
4404 { "(bad)", { XX } },
4407 /* PREFIX_VEX_382F */
4409 { "(bad)", { XX } },
4410 { "(bad)", { XX } },
4411 { MOD_TABLE (MOD_VEX_382F_PREFIX_2) },
4412 { "(bad)", { XX } },
4415 /* PREFIX_VEX_3830 */
4417 { "(bad)", { XX } },
4418 { "(bad)", { XX } },
4419 { VEX_LEN_TABLE (VEX_LEN_3830_P_2) },
4420 { "(bad)", { XX } },
4423 /* PREFIX_VEX_3831 */
4425 { "(bad)", { XX } },
4426 { "(bad)", { XX } },
4427 { VEX_LEN_TABLE (VEX_LEN_3831_P_2) },
4428 { "(bad)", { XX } },
4431 /* PREFIX_VEX_3832 */
4433 { "(bad)", { XX } },
4434 { "(bad)", { XX } },
4435 { VEX_LEN_TABLE (VEX_LEN_3832_P_2) },
4436 { "(bad)", { XX } },
4439 /* PREFIX_VEX_3833 */
4441 { "(bad)", { XX } },
4442 { "(bad)", { XX } },
4443 { VEX_LEN_TABLE (VEX_LEN_3833_P_2) },
4444 { "(bad)", { XX } },
4447 /* PREFIX_VEX_3834 */
4449 { "(bad)", { XX } },
4450 { "(bad)", { XX } },
4451 { VEX_LEN_TABLE (VEX_LEN_3834_P_2) },
4452 { "(bad)", { XX } },
4455 /* PREFIX_VEX_3835 */
4457 { "(bad)", { XX } },
4458 { "(bad)", { XX } },
4459 { VEX_LEN_TABLE (VEX_LEN_3835_P_2) },
4460 { "(bad)", { XX } },
4463 /* PREFIX_VEX_3837 */
4465 { "(bad)", { XX } },
4466 { "(bad)", { XX } },
4467 { VEX_LEN_TABLE (VEX_LEN_3837_P_2) },
4468 { "(bad)", { XX } },
4471 /* PREFIX_VEX_3838 */
4473 { "(bad)", { XX } },
4474 { "(bad)", { XX } },
4475 { VEX_LEN_TABLE (VEX_LEN_3838_P_2) },
4476 { "(bad)", { XX } },
4479 /* PREFIX_VEX_3839 */
4481 { "(bad)", { XX } },
4482 { "(bad)", { XX } },
4483 { VEX_LEN_TABLE (VEX_LEN_3839_P_2) },
4484 { "(bad)", { XX } },
4487 /* PREFIX_VEX_383A */
4489 { "(bad)", { XX } },
4490 { "(bad)", { XX } },
4491 { VEX_LEN_TABLE (VEX_LEN_383A_P_2) },
4492 { "(bad)", { XX } },
4495 /* PREFIX_VEX_383B */
4497 { "(bad)", { XX } },
4498 { "(bad)", { XX } },
4499 { VEX_LEN_TABLE (VEX_LEN_383B_P_2) },
4500 { "(bad)", { XX } },
4503 /* PREFIX_VEX_383C */
4505 { "(bad)", { XX } },
4506 { "(bad)", { XX } },
4507 { VEX_LEN_TABLE (VEX_LEN_383C_P_2) },
4508 { "(bad)", { XX } },
4511 /* PREFIX_VEX_383D */
4513 { "(bad)", { XX } },
4514 { "(bad)", { XX } },
4515 { VEX_LEN_TABLE (VEX_LEN_383D_P_2) },
4516 { "(bad)", { XX } },
4519 /* PREFIX_VEX_383E */
4521 { "(bad)", { XX } },
4522 { "(bad)", { XX } },
4523 { VEX_LEN_TABLE (VEX_LEN_383E_P_2) },
4524 { "(bad)", { XX } },
4527 /* PREFIX_VEX_383F */
4529 { "(bad)", { XX } },
4530 { "(bad)", { XX } },
4531 { VEX_LEN_TABLE (VEX_LEN_383F_P_2) },
4532 { "(bad)", { XX } },
4535 /* PREFIX_VEX_3840 */
4537 { "(bad)", { XX } },
4538 { "(bad)", { XX } },
4539 { VEX_LEN_TABLE (VEX_LEN_3840_P_2) },
4540 { "(bad)", { XX } },
4543 /* PREFIX_VEX_3841 */
4545 { "(bad)", { XX } },
4546 { "(bad)", { XX } },
4547 { VEX_LEN_TABLE (VEX_LEN_3841_P_2) },
4548 { "(bad)", { XX } },
4551 /* PREFIX_VEX_38DB */
4553 { "(bad)", { XX } },
4554 { "(bad)", { XX } },
4555 { VEX_LEN_TABLE (VEX_LEN_38DB_P_2) },
4556 { "(bad)", { XX } },
4559 /* PREFIX_VEX_38DC */
4561 { "(bad)", { XX } },
4562 { "(bad)", { XX } },
4563 { VEX_LEN_TABLE (VEX_LEN_38DC_P_2) },
4564 { "(bad)", { XX } },
4567 /* PREFIX_VEX_38DD */
4569 { "(bad)", { XX } },
4570 { "(bad)", { XX } },
4571 { VEX_LEN_TABLE (VEX_LEN_38DD_P_2) },
4572 { "(bad)", { XX } },
4575 /* PREFIX_VEX_38DE */
4577 { "(bad)", { XX } },
4578 { "(bad)", { XX } },
4579 { VEX_LEN_TABLE (VEX_LEN_38DE_P_2) },
4580 { "(bad)", { XX } },
4583 /* PREFIX_VEX_38DF */
4585 { "(bad)", { XX } },
4586 { "(bad)", { XX } },
4587 { VEX_LEN_TABLE (VEX_LEN_38DF_P_2) },
4588 { "(bad)", { XX } },
4591 /* PREFIX_VEX_3A04 */
4593 { "(bad)", { XX } },
4594 { "(bad)", { XX } },
4595 { "vpermilps", { XM, EXx, Ib } },
4596 { "(bad)", { XX } },
4599 /* PREFIX_VEX_3A05 */
4601 { "(bad)", { XX } },
4602 { "(bad)", { XX } },
4603 { "vpermilpd", { XM, EXx, Ib } },
4604 { "(bad)", { XX } },
4607 /* PREFIX_VEX_3A06 */
4609 { "(bad)", { XX } },
4610 { "(bad)", { XX } },
4611 { VEX_LEN_TABLE (VEX_LEN_3A06_P_2) },
4612 { "(bad)", { XX } },
4615 /* PREFIX_VEX_3A08 */
4617 { "(bad)", { XX } },
4618 { "(bad)", { XX } },
4619 { "vroundps", { XM, EXx, Ib } },
4620 { "(bad)", { XX } },
4623 /* PREFIX_VEX_3A09 */
4625 { "(bad)", { XX } },
4626 { "(bad)", { XX } },
4627 { "vroundpd", { XM, EXx, Ib } },
4628 { "(bad)", { XX } },
4631 /* PREFIX_VEX_3A0A */
4633 { "(bad)", { XX } },
4634 { "(bad)", { XX } },
4635 { VEX_LEN_TABLE (VEX_LEN_3A0A_P_2) },
4636 { "(bad)", { XX } },
4639 /* PREFIX_VEX_3A0B */
4641 { "(bad)", { XX } },
4642 { "(bad)", { XX } },
4643 { VEX_LEN_TABLE (VEX_LEN_3A0B_P_2) },
4644 { "(bad)", { XX } },
4647 /* PREFIX_VEX_3A0C */
4649 { "(bad)", { XX } },
4650 { "(bad)", { XX } },
4651 { "vblendps", { XM, Vex, EXx, Ib } },
4652 { "(bad)", { XX } },
4655 /* PREFIX_VEX_3A0D */
4657 { "(bad)", { XX } },
4658 { "(bad)", { XX } },
4659 { "vblendpd", { XM, Vex, EXx, Ib } },
4660 { "(bad)", { XX } },
4663 /* PREFIX_VEX_3A0E */
4665 { "(bad)", { XX } },
4666 { "(bad)", { XX } },
4667 { VEX_LEN_TABLE (VEX_LEN_3A0E_P_2) },
4668 { "(bad)", { XX } },
4671 /* PREFIX_VEX_3A0F */
4673 { "(bad)", { XX } },
4674 { "(bad)", { XX } },
4675 { VEX_LEN_TABLE (VEX_LEN_3A0F_P_2) },
4676 { "(bad)", { XX } },
4679 /* PREFIX_VEX_3A14 */
4681 { "(bad)", { XX } },
4682 { "(bad)", { XX } },
4683 { VEX_LEN_TABLE (VEX_LEN_3A14_P_2) },
4684 { "(bad)", { XX } },
4687 /* PREFIX_VEX_3A15 */
4689 { "(bad)", { XX } },
4690 { "(bad)", { XX } },
4691 { VEX_LEN_TABLE (VEX_LEN_3A15_P_2) },
4692 { "(bad)", { XX } },
4695 /* PREFIX_VEX_3A16 */
4697 { "(bad)", { XX } },
4698 { "(bad)", { XX } },
4699 { VEX_LEN_TABLE (VEX_LEN_3A16_P_2) },
4700 { "(bad)", { XX } },
4703 /* PREFIX_VEX_3A17 */
4705 { "(bad)", { XX } },
4706 { "(bad)", { XX } },
4707 { VEX_LEN_TABLE (VEX_LEN_3A17_P_2) },
4708 { "(bad)", { XX } },
4711 /* PREFIX_VEX_3A18 */
4713 { "(bad)", { XX } },
4714 { "(bad)", { XX } },
4715 { VEX_LEN_TABLE (VEX_LEN_3A18_P_2) },
4716 { "(bad)", { XX } },
4719 /* PREFIX_VEX_3A19 */
4721 { "(bad)", { XX } },
4722 { "(bad)", { XX } },
4723 { VEX_LEN_TABLE (VEX_LEN_3A19_P_2) },
4724 { "(bad)", { XX } },
4727 /* PREFIX_VEX_3A20 */
4729 { "(bad)", { XX } },
4730 { "(bad)", { XX } },
4731 { VEX_LEN_TABLE (VEX_LEN_3A20_P_2) },
4732 { "(bad)", { XX } },
4735 /* PREFIX_VEX_3A21 */
4737 { "(bad)", { XX } },
4738 { "(bad)", { XX } },
4739 { VEX_LEN_TABLE (VEX_LEN_3A21_P_2) },
4740 { "(bad)", { XX } },
4743 /* PREFIX_VEX_3A22 */
4745 { "(bad)", { XX } },
4746 { "(bad)", { XX } },
4747 { VEX_LEN_TABLE (VEX_LEN_3A22_P_2) },
4748 { "(bad)", { XX } },
4751 /* PREFIX_VEX_3A40 */
4753 { "(bad)", { XX } },
4754 { "(bad)", { XX } },
4755 { "vdpps", { XM, Vex, EXx, Ib } },
4756 { "(bad)", { XX } },
4759 /* PREFIX_VEX_3A41 */
4761 { "(bad)", { XX } },
4762 { "(bad)", { XX } },
4763 { VEX_LEN_TABLE (VEX_LEN_3A41_P_2) },
4764 { "(bad)", { XX } },
4767 /* PREFIX_VEX_3A42 */
4769 { "(bad)", { XX } },
4770 { "(bad)", { XX } },
4771 { VEX_LEN_TABLE (VEX_LEN_3A42_P_2) },
4772 { "(bad)", { XX } },
4775 /* PREFIX_VEX_3A48 */
4777 { "(bad)", { XX } },
4778 { "(bad)", { XX } },
4779 { "vpermil2ps", { XMVexW, Vex, EXVexImmW, EXVexImmW, VPERMIL2 } },
4780 { "(bad)", { XX } },
4783 /* PREFIX_VEX_3A49 */
4785 { "(bad)", { XX } },
4786 { "(bad)", { XX } },
4787 { "vpermil2pd", { XMVexW, Vex, EXVexImmW, EXVexImmW, VPERMIL2 } },
4788 { "(bad)", { XX } },
4791 /* PREFIX_VEX_3A4A */
4793 { "(bad)", { XX } },
4794 { "(bad)", { XX } },
4795 { "vblendvps", { XM, Vex, EXx, XMVexI4 } },
4796 { "(bad)", { XX } },
4799 /* PREFIX_VEX_3A4B */
4801 { "(bad)", { XX } },
4802 { "(bad)", { XX } },
4803 { "vblendvpd", { XM, Vex, EXx, XMVexI4 } },
4804 { "(bad)", { XX } },
4807 /* PREFIX_VEX_3A4C */
4809 { "(bad)", { XX } },
4810 { "(bad)", { XX } },
4811 { VEX_LEN_TABLE (VEX_LEN_3A4C_P_2) },
4812 { "(bad)", { XX } },
4815 /* PREFIX_VEX_3A5C */
4817 { "(bad)", { XX } },
4818 { "(bad)", { XX } },
4819 { "vfmaddsubps", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } },
4820 { "(bad)", { XX } },
4823 /* PREFIX_VEX_3A5D */
4825 { "(bad)", { XX } },
4826 { "(bad)", { XX } },
4827 { "vfmaddsubpd", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } },
4828 { "(bad)", { XX } },
4831 /* PREFIX_VEX_3A5E */
4833 { "(bad)", { XX } },
4834 { "(bad)", { XX } },
4835 { "vfmsubaddps", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } },
4836 { "(bad)", { XX } },
4839 /* PREFIX_VEX_3A5F */
4841 { "(bad)", { XX } },
4842 { "(bad)", { XX } },
4843 { "vfmsubaddpd", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } },
4844 { "(bad)", { XX } },
4847 /* PREFIX_VEX_3A60 */
4849 { "(bad)", { XX } },
4850 { "(bad)", { XX } },
4851 { VEX_LEN_TABLE (VEX_LEN_3A60_P_2) },
4852 { "(bad)", { XX } },
4855 /* PREFIX_VEX_3A61 */
4857 { "(bad)", { XX } },
4858 { "(bad)", { XX } },
4859 { VEX_LEN_TABLE (VEX_LEN_3A61_P_2) },
4860 { "(bad)", { XX } },
4863 /* PREFIX_VEX_3A62 */
4865 { "(bad)", { XX } },
4866 { "(bad)", { XX } },
4867 { VEX_LEN_TABLE (VEX_LEN_3A62_P_2) },
4868 { "(bad)", { XX } },
4871 /* PREFIX_VEX_3A63 */
4873 { "(bad)", { XX } },
4874 { "(bad)", { XX } },
4875 { VEX_LEN_TABLE (VEX_LEN_3A63_P_2) },
4876 { "(bad)", { XX } },
4879 /* PREFIX_VEX_3A68 */
4881 { "(bad)", { XX } },
4882 { "(bad)", { XX } },
4883 { "vfmaddps", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } },
4884 { "(bad)", { XX } },
4887 /* PREFIX_VEX_3A69 */
4889 { "(bad)", { XX } },
4890 { "(bad)", { XX } },
4891 { "vfmaddpd", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } },
4892 { "(bad)", { XX } },
4895 /* PREFIX_VEX_3A6A */
4897 { "(bad)", { XX } },
4898 { "(bad)", { XX } },
4899 { VEX_LEN_TABLE (VEX_LEN_3A6A_P_2) },
4900 { "(bad)", { XX } },
4903 /* PREFIX_VEX_3A6B */
4905 { "(bad)", { XX } },
4906 { "(bad)", { XX } },
4907 { VEX_LEN_TABLE (VEX_LEN_3A6B_P_2) },
4908 { "(bad)", { XX } },
4911 /* PREFIX_VEX_3A6C */
4913 { "(bad)", { XX } },
4914 { "(bad)", { XX } },
4915 { "vfmsubps", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } },
4916 { "(bad)", { XX } },
4919 /* PREFIX_VEX_3A6D */
4921 { "(bad)", { XX } },
4922 { "(bad)", { XX } },
4923 { "vfmsubpd", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } },
4924 { "(bad)", { XX } },
4927 /* PREFIX_VEX_3A6E */
4929 { "(bad)", { XX } },
4930 { "(bad)", { XX } },
4931 { VEX_LEN_TABLE (VEX_LEN_3A6E_P_2) },
4932 { "(bad)", { XX } },
4935 /* PREFIX_VEX_3A6F */
4937 { "(bad)", { XX } },
4938 { "(bad)", { XX } },
4939 { VEX_LEN_TABLE (VEX_LEN_3A6F_P_2) },
4940 { "(bad)", { XX } },
4943 /* PREFIX_VEX_3A78 */
4945 { "(bad)", { XX } },
4946 { "(bad)", { XX } },
4947 { "vfnmaddps", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } },
4948 { "(bad)", { XX } },
4951 /* PREFIX_VEX_3A79 */
4953 { "(bad)", { XX } },
4954 { "(bad)", { XX } },
4955 { "vfnmaddpd", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } },
4956 { "(bad)", { XX } },
4959 /* PREFIX_VEX_3A7A */
4961 { "(bad)", { XX } },
4962 { "(bad)", { XX } },
4963 { VEX_LEN_TABLE (VEX_LEN_3A7A_P_2) },
4964 { "(bad)", { XX } },
4967 /* PREFIX_VEX_3A7B */
4969 { "(bad)", { XX } },
4970 { "(bad)", { XX } },
4971 { VEX_LEN_TABLE (VEX_LEN_3A7B_P_2) },
4972 { "(bad)", { XX } },
4975 /* PREFIX_VEX_3A7C */
4977 { "(bad)", { XX } },
4978 { "(bad)", { XX } },
4979 { "vfnmsubps", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } },
4980 { "(bad)", { XX } },
4983 /* PREFIX_VEX_3A7D */
4985 { "(bad)", { XX } },
4986 { "(bad)", { XX } },
4987 { "vfnmsubpd", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } },
4988 { "(bad)", { XX } },
4991 /* PREFIX_VEX_3A7E */
4993 { "(bad)", { XX } },
4994 { "(bad)", { XX } },
4995 { VEX_LEN_TABLE (VEX_LEN_3A7E_P_2) },
4996 { "(bad)", { XX } },
4999 /* PREFIX_VEX_3A7F */
5001 { "(bad)", { XX } },
5002 { "(bad)", { XX } },
5003 { VEX_LEN_TABLE (VEX_LEN_3A7F_P_2) },
5004 { "(bad)", { XX } },
5007 /* PREFIX_VEX_3ADF */
5009 { "(bad)", { XX } },
5010 { "(bad)", { XX } },
5011 { VEX_LEN_TABLE (VEX_LEN_3ADF_P_2) },
5012 { "(bad)", { XX } },
5016 static const struct dis386 x86_64_table[][2] = {
5017 /* X86_64_06 */
5019 { "push{T|}", { es } },
5020 { "(bad)", { XX } },
5023 /* X86_64_07 */
5025 { "pop{T|}", { es } },
5026 { "(bad)", { XX } },
5029 /* X86_64_0D */
5031 { "push{T|}", { cs } },
5032 { "(bad)", { XX } },
5035 /* X86_64_16 */
5037 { "push{T|}", { ss } },
5038 { "(bad)", { XX } },
5041 /* X86_64_17 */
5043 { "pop{T|}", { ss } },
5044 { "(bad)", { XX } },
5047 /* X86_64_1E */
5049 { "push{T|}", { ds } },
5050 { "(bad)", { XX } },
5053 /* X86_64_1F */
5055 { "pop{T|}", { ds } },
5056 { "(bad)", { XX } },
5059 /* X86_64_27 */
5061 { "daa", { XX } },
5062 { "(bad)", { XX } },
5065 /* X86_64_2F */
5067 { "das", { XX } },
5068 { "(bad)", { XX } },
5071 /* X86_64_37 */
5073 { "aaa", { XX } },
5074 { "(bad)", { XX } },
5077 /* X86_64_3F */
5079 { "aas", { XX } },
5080 { "(bad)", { XX } },
5083 /* X86_64_60 */
5085 { "pusha{P|}", { XX } },
5086 { "(bad)", { XX } },
5089 /* X86_64_61 */
5091 { "popa{P|}", { XX } },
5092 { "(bad)", { XX } },
5095 /* X86_64_62 */
5097 { MOD_TABLE (MOD_62_32BIT) },
5098 { "(bad)", { XX } },
5101 /* X86_64_63 */
5103 { "arpl", { Ew, Gw } },
5104 { "movs{lq|xd}", { Gv, Ed } },
5107 /* X86_64_6D */
5109 { "ins{R|}", { Yzr, indirDX } },
5110 { "ins{G|}", { Yzr, indirDX } },
5113 /* X86_64_6F */
5115 { "outs{R|}", { indirDXr, Xz } },
5116 { "outs{G|}", { indirDXr, Xz } },
5119 /* X86_64_9A */
5121 { "Jcall{T|}", { Ap } },
5122 { "(bad)", { XX } },
5125 /* X86_64_C4 */
5127 { MOD_TABLE (MOD_C4_32BIT) },
5128 { VEX_C4_TABLE (VEX_0F) },
5131 /* X86_64_C5 */
5133 { MOD_TABLE (MOD_C5_32BIT) },
5134 { VEX_C5_TABLE (VEX_0F) },
5137 /* X86_64_CE */
5139 { "into", { XX } },
5140 { "(bad)", { XX } },
5143 /* X86_64_D4 */
5145 { "aam", { sIb } },
5146 { "(bad)", { XX } },
5149 /* X86_64_D5 */
5151 { "aad", { sIb } },
5152 { "(bad)", { XX } },
5155 /* X86_64_EA */
5157 { "Jjmp{T|}", { Ap } },
5158 { "(bad)", { XX } },
5161 /* X86_64_0F01_REG_0 */
5163 { "sgdt{Q|IQ}", { M } },
5164 { "sgdt", { M } },
5167 /* X86_64_0F01_REG_1 */
5169 { "sidt{Q|IQ}", { M } },
5170 { "sidt", { M } },
5173 /* X86_64_0F01_REG_2 */
5175 { "lgdt{Q|Q}", { M } },
5176 { "lgdt", { M } },
5179 /* X86_64_0F01_REG_3 */
5181 { "lidt{Q|Q}", { M } },
5182 { "lidt", { M } },
5186 static const struct dis386 three_byte_table[][256] = {
5187 /* THREE_BYTE_0F24 */
5189 /* 00 */
5190 { "fmaddps", { { OP_DREX4, q_mode } } },
5191 { "fmaddpd", { { OP_DREX4, q_mode } } },
5192 { "fmaddss", { { OP_DREX4, w_mode } } },
5193 { "fmaddsd", { { OP_DREX4, d_mode } } },
5194 { "fmaddps", { { OP_DREX4, DREX_OC1 + q_mode } } },
5195 { "fmaddpd", { { OP_DREX4, DREX_OC1 + q_mode } } },
5196 { "fmaddss", { { OP_DREX4, DREX_OC1 + w_mode } } },
5197 { "fmaddsd", { { OP_DREX4, DREX_OC1 + d_mode } } },
5198 /* 08 */
5199 { "fmsubps", { { OP_DREX4, q_mode } } },
5200 { "fmsubpd", { { OP_DREX4, q_mode } } },
5201 { "fmsubss", { { OP_DREX4, w_mode } } },
5202 { "fmsubsd", { { OP_DREX4, d_mode } } },
5203 { "fmsubps", { { OP_DREX4, DREX_OC1 + q_mode } } },
5204 { "fmsubpd", { { OP_DREX4, DREX_OC1 + q_mode } } },
5205 { "fmsubss", { { OP_DREX4, DREX_OC1 + w_mode } } },
5206 { "fmsubsd", { { OP_DREX4, DREX_OC1 + d_mode } } },
5207 /* 10 */
5208 { "fnmaddps", { { OP_DREX4, q_mode } } },
5209 { "fnmaddpd", { { OP_DREX4, q_mode } } },
5210 { "fnmaddss", { { OP_DREX4, w_mode } } },
5211 { "fnmaddsd", { { OP_DREX4, d_mode } } },
5212 { "fnmaddps", { { OP_DREX4, DREX_OC1 + q_mode } } },
5213 { "fnmaddpd", { { OP_DREX4, DREX_OC1 + q_mode } } },
5214 { "fnmaddss", { { OP_DREX4, DREX_OC1 + w_mode } } },
5215 { "fnmaddsd", { { OP_DREX4, DREX_OC1 + d_mode } } },
5216 /* 18 */
5217 { "fnmsubps", { { OP_DREX4, q_mode } } },
5218 { "fnmsubpd", { { OP_DREX4, q_mode } } },
5219 { "fnmsubss", { { OP_DREX4, w_mode } } },
5220 { "fnmsubsd", { { OP_DREX4, d_mode } } },
5221 { "fnmsubps", { { OP_DREX4, DREX_OC1 + q_mode } } },
5222 { "fnmsubpd", { { OP_DREX4, DREX_OC1 + q_mode } } },
5223 { "fnmsubss", { { OP_DREX4, DREX_OC1 + w_mode } } },
5224 { "fnmsubsd", { { OP_DREX4, DREX_OC1 + d_mode } } },
5225 /* 20 */
5226 { "permps", { { OP_DREX4, q_mode } } },
5227 { "permpd", { { OP_DREX4, q_mode } } },
5228 { "pcmov", { { OP_DREX4, q_mode } } },
5229 { "pperm", { { OP_DREX4, q_mode } } },
5230 { "permps", { { OP_DREX4, DREX_OC1 + q_mode } } },
5231 { "permpd", { { OP_DREX4, DREX_OC1 + q_mode } } },
5232 { "pcmov", { { OP_DREX4, DREX_OC1 + w_mode } } },
5233 { "pperm", { { OP_DREX4, DREX_OC1 + d_mode } } },
5234 /* 28 */
5235 { "(bad)", { XX } },
5236 { "(bad)", { XX } },
5237 { "(bad)", { XX } },
5238 { "(bad)", { XX } },
5239 { "(bad)", { XX } },
5240 { "(bad)", { XX } },
5241 { "(bad)", { XX } },
5242 { "(bad)", { XX } },
5243 /* 30 */
5244 { "(bad)", { XX } },
5245 { "(bad)", { XX } },
5246 { "(bad)", { XX } },
5247 { "(bad)", { XX } },
5248 { "(bad)", { XX } },
5249 { "(bad)", { XX } },
5250 { "(bad)", { XX } },
5251 { "(bad)", { XX } },
5252 /* 38 */
5253 { "(bad)", { XX } },
5254 { "(bad)", { XX } },
5255 { "(bad)", { XX } },
5256 { "(bad)", { XX } },
5257 { "(bad)", { XX } },
5258 { "(bad)", { XX } },
5259 { "(bad)", { XX } },
5260 { "(bad)", { XX } },
5261 /* 40 */
5262 { "protb", { { OP_DREX3, q_mode } } },
5263 { "protw", { { OP_DREX3, q_mode } } },
5264 { "protd", { { OP_DREX3, q_mode } } },
5265 { "protq", { { OP_DREX3, q_mode } } },
5266 { "pshlb", { { OP_DREX3, q_mode } } },
5267 { "pshlw", { { OP_DREX3, q_mode } } },
5268 { "pshld", { { OP_DREX3, q_mode } } },
5269 { "pshlq", { { OP_DREX3, q_mode } } },
5270 /* 48 */
5271 { "pshab", { { OP_DREX3, q_mode } } },
5272 { "pshaw", { { OP_DREX3, q_mode } } },
5273 { "pshad", { { OP_DREX3, q_mode } } },
5274 { "pshaq", { { OP_DREX3, q_mode } } },
5275 { "(bad)", { XX } },
5276 { "(bad)", { XX } },
5277 { "(bad)", { XX } },
5278 { "(bad)", { XX } },
5279 /* 50 */
5280 { "(bad)", { XX } },
5281 { "(bad)", { XX } },
5282 { "(bad)", { XX } },
5283 { "(bad)", { XX } },
5284 { "(bad)", { XX } },
5285 { "(bad)", { XX } },
5286 { "(bad)", { XX } },
5287 { "(bad)", { XX } },
5288 /* 58 */
5289 { "(bad)", { XX } },
5290 { "(bad)", { XX } },
5291 { "(bad)", { XX } },
5292 { "(bad)", { XX } },
5293 { "(bad)", { XX } },
5294 { "(bad)", { XX } },
5295 { "(bad)", { XX } },
5296 { "(bad)", { XX } },
5297 /* 60 */
5298 { "(bad)", { XX } },
5299 { "(bad)", { XX } },
5300 { "(bad)", { XX } },
5301 { "(bad)", { XX } },
5302 { "(bad)", { XX } },
5303 { "(bad)", { XX } },
5304 { "(bad)", { XX } },
5305 { "(bad)", { XX } },
5306 /* 68 */
5307 { "(bad)", { XX } },
5308 { "(bad)", { XX } },
5309 { "(bad)", { XX } },
5310 { "(bad)", { XX } },
5311 { "(bad)", { XX } },
5312 { "(bad)", { XX } },
5313 { "(bad)", { XX } },
5314 { "(bad)", { XX } },
5315 /* 70 */
5316 { "(bad)", { XX } },
5317 { "(bad)", { XX } },
5318 { "(bad)", { XX } },
5319 { "(bad)", { XX } },
5320 { "(bad)", { XX } },
5321 { "(bad)", { XX } },
5322 { "(bad)", { XX } },
5323 { "(bad)", { XX } },
5324 /* 78 */
5325 { "(bad)", { XX } },
5326 { "(bad)", { XX } },
5327 { "(bad)", { XX } },
5328 { "(bad)", { XX } },
5329 { "(bad)", { XX } },
5330 { "(bad)", { XX } },
5331 { "(bad)", { XX } },
5332 { "(bad)", { XX } },
5333 /* 80 */
5334 { "(bad)", { XX } },
5335 { "(bad)", { XX } },
5336 { "(bad)", { XX } },
5337 { "(bad)", { XX } },
5338 { "(bad)", { XX } },
5339 { "pmacssww", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5340 { "pmacsswd", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5341 { "pmacssdql", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5342 /* 88 */
5343 { "(bad)", { XX } },
5344 { "(bad)", { XX } },
5345 { "(bad)", { XX } },
5346 { "(bad)", { XX } },
5347 { "(bad)", { XX } },
5348 { "(bad)", { XX } },
5349 { "pmacssdd", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5350 { "pmacssdqh", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5351 /* 90 */
5352 { "(bad)", { XX } },
5353 { "(bad)", { XX } },
5354 { "(bad)", { XX } },
5355 { "(bad)", { XX } },
5356 { "(bad)", { XX } },
5357 { "pmacsww", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5358 { "pmacswd", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5359 { "pmacsdql", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5360 /* 98 */
5361 { "(bad)", { XX } },
5362 { "(bad)", { XX } },
5363 { "(bad)", { XX } },
5364 { "(bad)", { XX } },
5365 { "(bad)", { XX } },
5366 { "(bad)", { XX } },
5367 { "pmacsdd", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5368 { "pmacsdqh", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5369 /* a0 */
5370 { "(bad)", { XX } },
5371 { "(bad)", { XX } },
5372 { "(bad)", { XX } },
5373 { "(bad)", { XX } },
5374 { "(bad)", { XX } },
5375 { "(bad)", { XX } },
5376 { "pmadcsswd", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5377 { "(bad)", { XX } },
5378 /* a8 */
5379 { "(bad)", { XX } },
5380 { "(bad)", { XX } },
5381 { "(bad)", { XX } },
5382 { "(bad)", { XX } },
5383 { "(bad)", { XX } },
5384 { "(bad)", { XX } },
5385 { "(bad)", { XX } },
5386 { "(bad)", { XX } },
5387 /* b0 */
5388 { "(bad)", { XX } },
5389 { "(bad)", { XX } },
5390 { "(bad)", { XX } },
5391 { "(bad)", { XX } },
5392 { "(bad)", { XX } },
5393 { "(bad)", { XX } },
5394 { "pmadcswd", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5395 { "(bad)", { XX } },
5396 /* b8 */
5397 { "(bad)", { XX } },
5398 { "(bad)", { XX } },
5399 { "(bad)", { XX } },
5400 { "(bad)", { XX } },
5401 { "(bad)", { XX } },
5402 { "(bad)", { XX } },
5403 { "(bad)", { XX } },
5404 { "(bad)", { XX } },
5405 /* c0 */
5406 { "(bad)", { XX } },
5407 { "(bad)", { XX } },
5408 { "(bad)", { XX } },
5409 { "(bad)", { XX } },
5410 { "(bad)", { XX } },
5411 { "(bad)", { XX } },
5412 { "(bad)", { XX } },
5413 { "(bad)", { XX } },
5414 /* c8 */
5415 { "(bad)", { XX } },
5416 { "(bad)", { XX } },
5417 { "(bad)", { XX } },
5418 { "(bad)", { XX } },
5419 { "(bad)", { XX } },
5420 { "(bad)", { XX } },
5421 { "(bad)", { XX } },
5422 { "(bad)", { XX } },
5423 /* d0 */
5424 { "(bad)", { XX } },
5425 { "(bad)", { XX } },
5426 { "(bad)", { XX } },
5427 { "(bad)", { XX } },
5428 { "(bad)", { XX } },
5429 { "(bad)", { XX } },
5430 { "(bad)", { XX } },
5431 { "(bad)", { XX } },
5432 /* d8 */
5433 { "(bad)", { XX } },
5434 { "(bad)", { XX } },
5435 { "(bad)", { XX } },
5436 { "(bad)", { XX } },
5437 { "(bad)", { XX } },
5438 { "(bad)", { XX } },
5439 { "(bad)", { XX } },
5440 { "(bad)", { XX } },
5441 /* e0 */
5442 { "(bad)", { XX } },
5443 { "(bad)", { XX } },
5444 { "(bad)", { XX } },
5445 { "(bad)", { XX } },
5446 { "(bad)", { XX } },
5447 { "(bad)", { XX } },
5448 { "(bad)", { XX } },
5449 { "(bad)", { XX } },
5450 /* e8 */
5451 { "(bad)", { XX } },
5452 { "(bad)", { XX } },
5453 { "(bad)", { XX } },
5454 { "(bad)", { XX } },
5455 { "(bad)", { XX } },
5456 { "(bad)", { XX } },
5457 { "(bad)", { XX } },
5458 { "(bad)", { XX } },
5459 /* f0 */
5460 { "(bad)", { XX } },
5461 { "(bad)", { XX } },
5462 { "(bad)", { XX } },
5463 { "(bad)", { XX } },
5464 { "(bad)", { XX } },
5465 { "(bad)", { XX } },
5466 { "(bad)", { XX } },
5467 { "(bad)", { XX } },
5468 /* f8 */
5469 { "(bad)", { XX } },
5470 { "(bad)", { XX } },
5471 { "(bad)", { XX } },
5472 { "(bad)", { XX } },
5473 { "(bad)", { XX } },
5474 { "(bad)", { XX } },
5475 { "(bad)", { XX } },
5476 { "(bad)", { XX } },
5478 /* THREE_BYTE_0F25 */
5480 /* 00 */
5481 { "(bad)", { XX } },
5482 { "(bad)", { XX } },
5483 { "(bad)", { XX } },
5484 { "(bad)", { XX } },
5485 { "(bad)", { XX } },
5486 { "(bad)", { XX } },
5487 { "(bad)", { XX } },
5488 { "(bad)", { XX } },
5489 /* 08 */
5490 { "(bad)", { XX } },
5491 { "(bad)", { XX } },
5492 { "(bad)", { XX } },
5493 { "(bad)", { XX } },
5494 { "(bad)", { XX } },
5495 { "(bad)", { XX } },
5496 { "(bad)", { XX } },
5497 { "(bad)", { XX } },
5498 /* 10 */
5499 { "(bad)", { XX } },
5500 { "(bad)", { XX } },
5501 { "(bad)", { XX } },
5502 { "(bad)", { XX } },
5503 { "(bad)", { XX } },
5504 { "(bad)", { XX } },
5505 { "(bad)", { XX } },
5506 { "(bad)", { XX } },
5507 /* 18 */
5508 { "(bad)", { XX } },
5509 { "(bad)", { XX } },
5510 { "(bad)", { XX } },
5511 { "(bad)", { XX } },
5512 { "(bad)", { XX } },
5513 { "(bad)", { XX } },
5514 { "(bad)", { XX } },
5515 { "(bad)", { XX } },
5516 /* 20 */
5517 { "(bad)", { XX } },
5518 { "(bad)", { XX } },
5519 { "(bad)", { XX } },
5520 { "(bad)", { XX } },
5521 { "(bad)", { XX } },
5522 { "(bad)", { XX } },
5523 { "(bad)", { XX } },
5524 { "(bad)", { XX } },
5525 /* 28 */
5526 { "(bad)", { XX } },
5527 { "(bad)", { XX } },
5528 { "(bad)", { XX } },
5529 { "(bad)", { XX } },
5530 { "comps", { { OP_DREX3, q_mode }, { OP_DREX_FCMP, b_mode } } },
5531 { "compd", { { OP_DREX3, q_mode }, { OP_DREX_FCMP, b_mode } } },
5532 { "comss", { { OP_DREX3, w_mode }, { OP_DREX_FCMP, b_mode } } },
5533 { "comsd", { { OP_DREX3, d_mode }, { OP_DREX_FCMP, b_mode } } },
5534 /* 30 */
5535 { "(bad)", { XX } },
5536 { "(bad)", { XX } },
5537 { "(bad)", { XX } },
5538 { "(bad)", { XX } },
5539 { "(bad)", { XX } },
5540 { "(bad)", { XX } },
5541 { "(bad)", { XX } },
5542 { "(bad)", { XX } },
5543 /* 38 */
5544 { "(bad)", { XX } },
5545 { "(bad)", { XX } },
5546 { "(bad)", { XX } },
5547 { "(bad)", { XX } },
5548 { "(bad)", { XX } },
5549 { "(bad)", { XX } },
5550 { "(bad)", { XX } },
5551 { "(bad)", { XX } },
5552 /* 40 */
5553 { "(bad)", { XX } },
5554 { "(bad)", { XX } },
5555 { "(bad)", { XX } },
5556 { "(bad)", { XX } },
5557 { "(bad)", { XX } },
5558 { "(bad)", { XX } },
5559 { "(bad)", { XX } },
5560 { "(bad)", { XX } },
5561 /* 48 */
5562 { "(bad)", { XX } },
5563 { "(bad)", { XX } },
5564 { "(bad)", { XX } },
5565 { "(bad)", { XX } },
5566 { "pcomb", { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
5567 { "pcomw", { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
5568 { "pcomd", { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
5569 { "pcomq", { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
5570 /* 50 */
5571 { "(bad)", { XX } },
5572 { "(bad)", { XX } },
5573 { "(bad)", { XX } },
5574 { "(bad)", { XX } },
5575 { "(bad)", { XX } },
5576 { "(bad)", { XX } },
5577 { "(bad)", { XX } },
5578 { "(bad)", { XX } },
5579 /* 58 */
5580 { "(bad)", { XX } },
5581 { "(bad)", { XX } },
5582 { "(bad)", { XX } },
5583 { "(bad)", { XX } },
5584 { "(bad)", { XX } },
5585 { "(bad)", { XX } },
5586 { "(bad)", { XX } },
5587 { "(bad)", { XX } },
5588 /* 60 */
5589 { "(bad)", { XX } },
5590 { "(bad)", { XX } },
5591 { "(bad)", { XX } },
5592 { "(bad)", { XX } },
5593 { "(bad)", { XX } },
5594 { "(bad)", { XX } },
5595 { "(bad)", { XX } },
5596 { "(bad)", { XX } },
5597 /* 68 */
5598 { "(bad)", { XX } },
5599 { "(bad)", { XX } },
5600 { "(bad)", { XX } },
5601 { "(bad)", { XX } },
5602 { "pcomub", { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
5603 { "pcomuw", { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
5604 { "pcomud", { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
5605 { "pcomuq", { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
5606 /* 70 */
5607 { "(bad)", { XX } },
5608 { "(bad)", { XX } },
5609 { "(bad)", { XX } },
5610 { "(bad)", { XX } },
5611 { "(bad)", { XX } },
5612 { "(bad)", { XX } },
5613 { "(bad)", { XX } },
5614 { "(bad)", { XX } },
5615 /* 78 */
5616 { "(bad)", { XX } },
5617 { "(bad)", { XX } },
5618 { "(bad)", { XX } },
5619 { "(bad)", { XX } },
5620 { "(bad)", { XX } },
5621 { "(bad)", { XX } },
5622 { "(bad)", { XX } },
5623 { "(bad)", { XX } },
5624 /* 80 */
5625 { "(bad)", { XX } },
5626 { "(bad)", { XX } },
5627 { "(bad)", { XX } },
5628 { "(bad)", { XX } },
5629 { "(bad)", { XX } },
5630 { "(bad)", { XX } },
5631 { "(bad)", { XX } },
5632 { "(bad)", { XX } },
5633 /* 88 */
5634 { "(bad)", { XX } },
5635 { "(bad)", { XX } },
5636 { "(bad)", { XX } },
5637 { "(bad)", { XX } },
5638 { "(bad)", { XX } },
5639 { "(bad)", { XX } },
5640 { "(bad)", { XX } },
5641 { "(bad)", { XX } },
5642 /* 90 */
5643 { "(bad)", { XX } },
5644 { "(bad)", { XX } },
5645 { "(bad)", { XX } },
5646 { "(bad)", { XX } },
5647 { "(bad)", { XX } },
5648 { "(bad)", { XX } },
5649 { "(bad)", { XX } },
5650 { "(bad)", { XX } },
5651 /* 98 */
5652 { "(bad)", { XX } },
5653 { "(bad)", { XX } },
5654 { "(bad)", { XX } },
5655 { "(bad)", { XX } },
5656 { "(bad)", { XX } },
5657 { "(bad)", { XX } },
5658 { "(bad)", { XX } },
5659 { "(bad)", { XX } },
5660 /* a0 */
5661 { "(bad)", { XX } },
5662 { "(bad)", { XX } },
5663 { "(bad)", { XX } },
5664 { "(bad)", { XX } },
5665 { "(bad)", { XX } },
5666 { "(bad)", { XX } },
5667 { "(bad)", { XX } },
5668 { "(bad)", { XX } },
5669 /* a8 */
5670 { "(bad)", { XX } },
5671 { "(bad)", { XX } },
5672 { "(bad)", { XX } },
5673 { "(bad)", { XX } },
5674 { "(bad)", { XX } },
5675 { "(bad)", { XX } },
5676 { "(bad)", { XX } },
5677 { "(bad)", { XX } },
5678 /* b0 */
5679 { "(bad)", { XX } },
5680 { "(bad)", { XX } },
5681 { "(bad)", { XX } },
5682 { "(bad)", { XX } },
5683 { "(bad)", { XX } },
5684 { "(bad)", { XX } },
5685 { "(bad)", { XX } },
5686 { "(bad)", { XX } },
5687 /* b8 */
5688 { "(bad)", { XX } },
5689 { "(bad)", { XX } },
5690 { "(bad)", { XX } },
5691 { "(bad)", { XX } },
5692 { "(bad)", { XX } },
5693 { "(bad)", { XX } },
5694 { "(bad)", { XX } },
5695 { "(bad)", { XX } },
5696 /* c0 */
5697 { "(bad)", { XX } },
5698 { "(bad)", { XX } },
5699 { "(bad)", { XX } },
5700 { "(bad)", { XX } },
5701 { "(bad)", { XX } },
5702 { "(bad)", { XX } },
5703 { "(bad)", { XX } },
5704 { "(bad)", { XX } },
5705 /* c8 */
5706 { "(bad)", { XX } },
5707 { "(bad)", { XX } },
5708 { "(bad)", { XX } },
5709 { "(bad)", { XX } },
5710 { "(bad)", { XX } },
5711 { "(bad)", { XX } },
5712 { "(bad)", { XX } },
5713 { "(bad)", { XX } },
5714 /* d0 */
5715 { "(bad)", { XX } },
5716 { "(bad)", { XX } },
5717 { "(bad)", { XX } },
5718 { "(bad)", { XX } },
5719 { "(bad)", { XX } },
5720 { "(bad)", { XX } },
5721 { "(bad)", { XX } },
5722 { "(bad)", { XX } },
5723 /* d8 */
5724 { "(bad)", { XX } },
5725 { "(bad)", { XX } },
5726 { "(bad)", { XX } },
5727 { "(bad)", { XX } },
5728 { "(bad)", { XX } },
5729 { "(bad)", { XX } },
5730 { "(bad)", { XX } },
5731 { "(bad)", { XX } },
5732 /* e0 */
5733 { "(bad)", { XX } },
5734 { "(bad)", { XX } },
5735 { "(bad)", { XX } },
5736 { "(bad)", { XX } },
5737 { "(bad)", { XX } },
5738 { "(bad)", { XX } },
5739 { "(bad)", { XX } },
5740 { "(bad)", { XX } },
5741 /* e8 */
5742 { "(bad)", { XX } },
5743 { "(bad)", { XX } },
5744 { "(bad)", { XX } },
5745 { "(bad)", { XX } },
5746 { "(bad)", { XX } },
5747 { "(bad)", { XX } },
5748 { "(bad)", { XX } },
5749 { "(bad)", { XX } },
5750 /* f0 */
5751 { "(bad)", { XX } },
5752 { "(bad)", { XX } },
5753 { "(bad)", { XX } },
5754 { "(bad)", { XX } },
5755 { "(bad)", { XX } },
5756 { "(bad)", { XX } },
5757 { "(bad)", { XX } },
5758 { "(bad)", { XX } },
5759 /* f8 */
5760 { "(bad)", { XX } },
5761 { "(bad)", { XX } },
5762 { "(bad)", { XX } },
5763 { "(bad)", { XX } },
5764 { "(bad)", { XX } },
5765 { "(bad)", { XX } },
5766 { "(bad)", { XX } },
5767 { "(bad)", { XX } },
5769 /* THREE_BYTE_0F38 */
5771 /* 00 */
5772 { "pshufb", { MX, EM } },
5773 { "phaddw", { MX, EM } },
5774 { "phaddd", { MX, EM } },
5775 { "phaddsw", { MX, EM } },
5776 { "pmaddubsw", { MX, EM } },
5777 { "phsubw", { MX, EM } },
5778 { "phsubd", { MX, EM } },
5779 { "phsubsw", { MX, EM } },
5780 /* 08 */
5781 { "psignb", { MX, EM } },
5782 { "psignw", { MX, EM } },
5783 { "psignd", { MX, EM } },
5784 { "pmulhrsw", { MX, EM } },
5785 { "(bad)", { XX } },
5786 { "(bad)", { XX } },
5787 { "(bad)", { XX } },
5788 { "(bad)", { XX } },
5789 /* 10 */
5790 { PREFIX_TABLE (PREFIX_0F3810) },
5791 { "(bad)", { XX } },
5792 { "(bad)", { XX } },
5793 { "(bad)", { XX } },
5794 { PREFIX_TABLE (PREFIX_0F3814) },
5795 { PREFIX_TABLE (PREFIX_0F3815) },
5796 { "(bad)", { XX } },
5797 { PREFIX_TABLE (PREFIX_0F3817) },
5798 /* 18 */
5799 { "(bad)", { XX } },
5800 { "(bad)", { XX } },
5801 { "(bad)", { XX } },
5802 { "(bad)", { XX } },
5803 { "pabsb", { MX, EM } },
5804 { "pabsw", { MX, EM } },
5805 { "pabsd", { MX, EM } },
5806 { "(bad)", { XX } },
5807 /* 20 */
5808 { PREFIX_TABLE (PREFIX_0F3820) },
5809 { PREFIX_TABLE (PREFIX_0F3821) },
5810 { PREFIX_TABLE (PREFIX_0F3822) },
5811 { PREFIX_TABLE (PREFIX_0F3823) },
5812 { PREFIX_TABLE (PREFIX_0F3824) },
5813 { PREFIX_TABLE (PREFIX_0F3825) },
5814 { "(bad)", { XX } },
5815 { "(bad)", { XX } },
5816 /* 28 */
5817 { PREFIX_TABLE (PREFIX_0F3828) },
5818 { PREFIX_TABLE (PREFIX_0F3829) },
5819 { PREFIX_TABLE (PREFIX_0F382A) },
5820 { PREFIX_TABLE (PREFIX_0F382B) },
5821 { "(bad)", { XX } },
5822 { "(bad)", { XX } },
5823 { "(bad)", { XX } },
5824 { "(bad)", { XX } },
5825 /* 30 */
5826 { PREFIX_TABLE (PREFIX_0F3830) },
5827 { PREFIX_TABLE (PREFIX_0F3831) },
5828 { PREFIX_TABLE (PREFIX_0F3832) },
5829 { PREFIX_TABLE (PREFIX_0F3833) },
5830 { PREFIX_TABLE (PREFIX_0F3834) },
5831 { PREFIX_TABLE (PREFIX_0F3835) },
5832 { "(bad)", { XX } },
5833 { PREFIX_TABLE (PREFIX_0F3837) },
5834 /* 38 */
5835 { PREFIX_TABLE (PREFIX_0F3838) },
5836 { PREFIX_TABLE (PREFIX_0F3839) },
5837 { PREFIX_TABLE (PREFIX_0F383A) },
5838 { PREFIX_TABLE (PREFIX_0F383B) },
5839 { PREFIX_TABLE (PREFIX_0F383C) },
5840 { PREFIX_TABLE (PREFIX_0F383D) },
5841 { PREFIX_TABLE (PREFIX_0F383E) },
5842 { PREFIX_TABLE (PREFIX_0F383F) },
5843 /* 40 */
5844 { PREFIX_TABLE (PREFIX_0F3840) },
5845 { PREFIX_TABLE (PREFIX_0F3841) },
5846 { "(bad)", { XX } },
5847 { "(bad)", { XX } },
5848 { "(bad)", { XX } },
5849 { "(bad)", { XX } },
5850 { "(bad)", { XX } },
5851 { "(bad)", { XX } },
5852 /* 48 */
5853 { "(bad)", { XX } },
5854 { "(bad)", { XX } },
5855 { "(bad)", { XX } },
5856 { "(bad)", { XX } },
5857 { "(bad)", { XX } },
5858 { "(bad)", { XX } },
5859 { "(bad)", { XX } },
5860 { "(bad)", { XX } },
5861 /* 50 */
5862 { "(bad)", { XX } },
5863 { "(bad)", { XX } },
5864 { "(bad)", { XX } },
5865 { "(bad)", { XX } },
5866 { "(bad)", { XX } },
5867 { "(bad)", { XX } },
5868 { "(bad)", { XX } },
5869 { "(bad)", { XX } },
5870 /* 58 */
5871 { "(bad)", { XX } },
5872 { "(bad)", { XX } },
5873 { "(bad)", { XX } },
5874 { "(bad)", { XX } },
5875 { "(bad)", { XX } },
5876 { "(bad)", { XX } },
5877 { "(bad)", { XX } },
5878 { "(bad)", { XX } },
5879 /* 60 */
5880 { "(bad)", { XX } },
5881 { "(bad)", { XX } },
5882 { "(bad)", { XX } },
5883 { "(bad)", { XX } },
5884 { "(bad)", { XX } },
5885 { "(bad)", { XX } },
5886 { "(bad)", { XX } },
5887 { "(bad)", { XX } },
5888 /* 68 */
5889 { "(bad)", { XX } },
5890 { "(bad)", { XX } },
5891 { "(bad)", { XX } },
5892 { "(bad)", { XX } },
5893 { "(bad)", { XX } },
5894 { "(bad)", { XX } },
5895 { "(bad)", { XX } },
5896 { "(bad)", { XX } },
5897 /* 70 */
5898 { "(bad)", { XX } },
5899 { "(bad)", { XX } },
5900 { "(bad)", { XX } },
5901 { "(bad)", { XX } },
5902 { "(bad)", { XX } },
5903 { "(bad)", { XX } },
5904 { "(bad)", { XX } },
5905 { "(bad)", { XX } },
5906 /* 78 */
5907 { "(bad)", { XX } },
5908 { "(bad)", { XX } },
5909 { "(bad)", { XX } },
5910 { "(bad)", { XX } },
5911 { "(bad)", { XX } },
5912 { "(bad)", { XX } },
5913 { "(bad)", { XX } },
5914 { "(bad)", { XX } },
5915 /* 80 */
5916 { PREFIX_TABLE (PREFIX_0F3880) },
5917 { PREFIX_TABLE (PREFIX_0F3881) },
5918 { "(bad)", { XX } },
5919 { "(bad)", { XX } },
5920 { "(bad)", { XX } },
5921 { "(bad)", { XX } },
5922 { "(bad)", { XX } },
5923 { "(bad)", { XX } },
5924 /* 88 */
5925 { "(bad)", { XX } },
5926 { "(bad)", { XX } },
5927 { "(bad)", { XX } },
5928 { "(bad)", { XX } },
5929 { "(bad)", { XX } },
5930 { "(bad)", { XX } },
5931 { "(bad)", { XX } },
5932 { "(bad)", { XX } },
5933 /* 90 */
5934 { "(bad)", { XX } },
5935 { "(bad)", { XX } },
5936 { "(bad)", { XX } },
5937 { "(bad)", { XX } },
5938 { "(bad)", { XX } },
5939 { "(bad)", { XX } },
5940 { "(bad)", { XX } },
5941 { "(bad)", { XX } },
5942 /* 98 */
5943 { "(bad)", { XX } },
5944 { "(bad)", { XX } },
5945 { "(bad)", { XX } },
5946 { "(bad)", { XX } },
5947 { "(bad)", { XX } },
5948 { "(bad)", { XX } },
5949 { "(bad)", { XX } },
5950 { "(bad)", { XX } },
5951 /* a0 */
5952 { "(bad)", { XX } },
5953 { "(bad)", { XX } },
5954 { "(bad)", { XX } },
5955 { "(bad)", { XX } },
5956 { "(bad)", { XX } },
5957 { "(bad)", { XX } },
5958 { "(bad)", { XX } },
5959 { "(bad)", { XX } },
5960 /* a8 */
5961 { "(bad)", { XX } },
5962 { "(bad)", { XX } },
5963 { "(bad)", { XX } },
5964 { "(bad)", { XX } },
5965 { "(bad)", { XX } },
5966 { "(bad)", { XX } },
5967 { "(bad)", { XX } },
5968 { "(bad)", { XX } },
5969 /* b0 */
5970 { "(bad)", { XX } },
5971 { "(bad)", { XX } },
5972 { "(bad)", { XX } },
5973 { "(bad)", { XX } },
5974 { "(bad)", { XX } },
5975 { "(bad)", { XX } },
5976 { "(bad)", { XX } },
5977 { "(bad)", { XX } },
5978 /* b8 */
5979 { "(bad)", { XX } },
5980 { "(bad)", { XX } },
5981 { "(bad)", { XX } },
5982 { "(bad)", { XX } },
5983 { "(bad)", { XX } },
5984 { "(bad)", { XX } },
5985 { "(bad)", { XX } },
5986 { "(bad)", { XX } },
5987 /* c0 */
5988 { "(bad)", { XX } },
5989 { "(bad)", { XX } },
5990 { "(bad)", { XX } },
5991 { "(bad)", { XX } },
5992 { "(bad)", { XX } },
5993 { "(bad)", { XX } },
5994 { "(bad)", { XX } },
5995 { "(bad)", { XX } },
5996 /* c8 */
5997 { "(bad)", { XX } },
5998 { "(bad)", { XX } },
5999 { "(bad)", { XX } },
6000 { "(bad)", { XX } },
6001 { "(bad)", { XX } },
6002 { "(bad)", { XX } },
6003 { "(bad)", { XX } },
6004 { "(bad)", { XX } },
6005 /* d0 */
6006 { "(bad)", { XX } },
6007 { "(bad)", { XX } },
6008 { "(bad)", { XX } },
6009 { "(bad)", { XX } },
6010 { "(bad)", { XX } },
6011 { "(bad)", { XX } },
6012 { "(bad)", { XX } },
6013 { "(bad)", { XX } },
6014 /* d8 */
6015 { "(bad)", { XX } },
6016 { "(bad)", { XX } },
6017 { "(bad)", { XX } },
6018 { PREFIX_TABLE (PREFIX_0F38DB) },
6019 { PREFIX_TABLE (PREFIX_0F38DC) },
6020 { PREFIX_TABLE (PREFIX_0F38DD) },
6021 { PREFIX_TABLE (PREFIX_0F38DE) },
6022 { PREFIX_TABLE (PREFIX_0F38DF) },
6023 /* e0 */
6024 { "(bad)", { XX } },
6025 { "(bad)", { XX } },
6026 { "(bad)", { XX } },
6027 { "(bad)", { XX } },
6028 { "(bad)", { XX } },
6029 { "(bad)", { XX } },
6030 { "(bad)", { XX } },
6031 { "(bad)", { XX } },
6032 /* e8 */
6033 { "(bad)", { XX } },
6034 { "(bad)", { XX } },
6035 { "(bad)", { XX } },
6036 { "(bad)", { XX } },
6037 { "(bad)", { XX } },
6038 { "(bad)", { XX } },
6039 { "(bad)", { XX } },
6040 { "(bad)", { XX } },
6041 /* f0 */
6042 { PREFIX_TABLE (PREFIX_0F38F0) },
6043 { PREFIX_TABLE (PREFIX_0F38F1) },
6044 { "(bad)", { XX } },
6045 { "(bad)", { XX } },
6046 { "(bad)", { XX } },
6047 { "(bad)", { XX } },
6048 { "(bad)", { XX } },
6049 { "(bad)", { XX } },
6050 /* f8 */
6051 { "(bad)", { XX } },
6052 { "(bad)", { XX } },
6053 { "(bad)", { XX } },
6054 { "(bad)", { XX } },
6055 { "(bad)", { XX } },
6056 { "(bad)", { XX } },
6057 { "(bad)", { XX } },
6058 { "(bad)", { XX } },
6060 /* THREE_BYTE_0F3A */
6062 /* 00 */
6063 { "(bad)", { XX } },
6064 { "(bad)", { XX } },
6065 { "(bad)", { XX } },
6066 { "(bad)", { XX } },
6067 { "(bad)", { XX } },
6068 { "(bad)", { XX } },
6069 { "(bad)", { XX } },
6070 { "(bad)", { XX } },
6071 /* 08 */
6072 { PREFIX_TABLE (PREFIX_0F3A08) },
6073 { PREFIX_TABLE (PREFIX_0F3A09) },
6074 { PREFIX_TABLE (PREFIX_0F3A0A) },
6075 { PREFIX_TABLE (PREFIX_0F3A0B) },
6076 { PREFIX_TABLE (PREFIX_0F3A0C) },
6077 { PREFIX_TABLE (PREFIX_0F3A0D) },
6078 { PREFIX_TABLE (PREFIX_0F3A0E) },
6079 { "palignr", { MX, EM, Ib } },
6080 /* 10 */
6081 { "(bad)", { XX } },
6082 { "(bad)", { XX } },
6083 { "(bad)", { XX } },
6084 { "(bad)", { XX } },
6085 { PREFIX_TABLE (PREFIX_0F3A14) },
6086 { PREFIX_TABLE (PREFIX_0F3A15) },
6087 { PREFIX_TABLE (PREFIX_0F3A16) },
6088 { PREFIX_TABLE (PREFIX_0F3A17) },
6089 /* 18 */
6090 { "(bad)", { XX } },
6091 { "(bad)", { XX } },
6092 { "(bad)", { XX } },
6093 { "(bad)", { XX } },
6094 { "(bad)", { XX } },
6095 { "(bad)", { XX } },
6096 { "(bad)", { XX } },
6097 { "(bad)", { XX } },
6098 /* 20 */
6099 { PREFIX_TABLE (PREFIX_0F3A20) },
6100 { PREFIX_TABLE (PREFIX_0F3A21) },
6101 { PREFIX_TABLE (PREFIX_0F3A22) },
6102 { "(bad)", { XX } },
6103 { "(bad)", { XX } },
6104 { "(bad)", { XX } },
6105 { "(bad)", { XX } },
6106 { "(bad)", { XX } },
6107 /* 28 */
6108 { "(bad)", { XX } },
6109 { "(bad)", { XX } },
6110 { "(bad)", { XX } },
6111 { "(bad)", { XX } },
6112 { "(bad)", { XX } },
6113 { "(bad)", { XX } },
6114 { "(bad)", { XX } },
6115 { "(bad)", { XX } },
6116 /* 30 */
6117 { "(bad)", { XX } },
6118 { "(bad)", { XX } },
6119 { "(bad)", { XX } },
6120 { "(bad)", { XX } },
6121 { "(bad)", { XX } },
6122 { "(bad)", { XX } },
6123 { "(bad)", { XX } },
6124 { "(bad)", { XX } },
6125 /* 38 */
6126 { "(bad)", { XX } },
6127 { "(bad)", { XX } },
6128 { "(bad)", { XX } },
6129 { "(bad)", { XX } },
6130 { "(bad)", { XX } },
6131 { "(bad)", { XX } },
6132 { "(bad)", { XX } },
6133 { "(bad)", { XX } },
6134 /* 40 */
6135 { PREFIX_TABLE (PREFIX_0F3A40) },
6136 { PREFIX_TABLE (PREFIX_0F3A41) },
6137 { PREFIX_TABLE (PREFIX_0F3A42) },
6138 { "(bad)", { XX } },
6139 { PREFIX_TABLE (PREFIX_0F3A44) },
6140 { "(bad)", { XX } },
6141 { "(bad)", { XX } },
6142 { "(bad)", { XX } },
6143 /* 48 */
6144 { "(bad)", { XX } },
6145 { "(bad)", { XX } },
6146 { "(bad)", { XX } },
6147 { "(bad)", { XX } },
6148 { "(bad)", { XX } },
6149 { "(bad)", { XX } },
6150 { "(bad)", { XX } },
6151 { "(bad)", { XX } },
6152 /* 50 */
6153 { "(bad)", { XX } },
6154 { "(bad)", { XX } },
6155 { "(bad)", { XX } },
6156 { "(bad)", { XX } },
6157 { "(bad)", { XX } },
6158 { "(bad)", { XX } },
6159 { "(bad)", { XX } },
6160 { "(bad)", { XX } },
6161 /* 58 */
6162 { "(bad)", { XX } },
6163 { "(bad)", { XX } },
6164 { "(bad)", { XX } },
6165 { "(bad)", { XX } },
6166 { "(bad)", { XX } },
6167 { "(bad)", { XX } },
6168 { "(bad)", { XX } },
6169 { "(bad)", { XX } },
6170 /* 60 */
6171 { PREFIX_TABLE (PREFIX_0F3A60) },
6172 { PREFIX_TABLE (PREFIX_0F3A61) },
6173 { PREFIX_TABLE (PREFIX_0F3A62) },
6174 { PREFIX_TABLE (PREFIX_0F3A63) },
6175 { "(bad)", { XX } },
6176 { "(bad)", { XX } },
6177 { "(bad)", { XX } },
6178 { "(bad)", { XX } },
6179 /* 68 */
6180 { "(bad)", { XX } },
6181 { "(bad)", { XX } },
6182 { "(bad)", { XX } },
6183 { "(bad)", { XX } },
6184 { "(bad)", { XX } },
6185 { "(bad)", { XX } },
6186 { "(bad)", { XX } },
6187 { "(bad)", { XX } },
6188 /* 70 */
6189 { "(bad)", { XX } },
6190 { "(bad)", { XX } },
6191 { "(bad)", { XX } },
6192 { "(bad)", { XX } },
6193 { "(bad)", { XX } },
6194 { "(bad)", { XX } },
6195 { "(bad)", { XX } },
6196 { "(bad)", { XX } },
6197 /* 78 */
6198 { "(bad)", { XX } },
6199 { "(bad)", { XX } },
6200 { "(bad)", { XX } },
6201 { "(bad)", { XX } },
6202 { "(bad)", { XX } },
6203 { "(bad)", { XX } },
6204 { "(bad)", { XX } },
6205 { "(bad)", { XX } },
6206 /* 80 */
6207 { "(bad)", { XX } },
6208 { "(bad)", { XX } },
6209 { "(bad)", { XX } },
6210 { "(bad)", { XX } },
6211 { "(bad)", { XX } },
6212 { "(bad)", { XX } },
6213 { "(bad)", { XX } },
6214 { "(bad)", { XX } },
6215 /* 88 */
6216 { "(bad)", { XX } },
6217 { "(bad)", { XX } },
6218 { "(bad)", { XX } },
6219 { "(bad)", { XX } },
6220 { "(bad)", { XX } },
6221 { "(bad)", { XX } },
6222 { "(bad)", { XX } },
6223 { "(bad)", { XX } },
6224 /* 90 */
6225 { "(bad)", { XX } },
6226 { "(bad)", { XX } },
6227 { "(bad)", { XX } },
6228 { "(bad)", { XX } },
6229 { "(bad)", { XX } },
6230 { "(bad)", { XX } },
6231 { "(bad)", { XX } },
6232 { "(bad)", { XX } },
6233 /* 98 */
6234 { "(bad)", { XX } },
6235 { "(bad)", { XX } },
6236 { "(bad)", { XX } },
6237 { "(bad)", { XX } },
6238 { "(bad)", { XX } },
6239 { "(bad)", { XX } },
6240 { "(bad)", { XX } },
6241 { "(bad)", { XX } },
6242 /* a0 */
6243 { "(bad)", { XX } },
6244 { "(bad)", { XX } },
6245 { "(bad)", { XX } },
6246 { "(bad)", { XX } },
6247 { "(bad)", { XX } },
6248 { "(bad)", { XX } },
6249 { "(bad)", { XX } },
6250 { "(bad)", { XX } },
6251 /* a8 */
6252 { "(bad)", { XX } },
6253 { "(bad)", { XX } },
6254 { "(bad)", { XX } },
6255 { "(bad)", { XX } },
6256 { "(bad)", { XX } },
6257 { "(bad)", { XX } },
6258 { "(bad)", { XX } },
6259 { "(bad)", { XX } },
6260 /* b0 */
6261 { "(bad)", { XX } },
6262 { "(bad)", { XX } },
6263 { "(bad)", { XX } },
6264 { "(bad)", { XX } },
6265 { "(bad)", { XX } },
6266 { "(bad)", { XX } },
6267 { "(bad)", { XX } },
6268 { "(bad)", { XX } },
6269 /* b8 */
6270 { "(bad)", { XX } },
6271 { "(bad)", { XX } },
6272 { "(bad)", { XX } },
6273 { "(bad)", { XX } },
6274 { "(bad)", { XX } },
6275 { "(bad)", { XX } },
6276 { "(bad)", { XX } },
6277 { "(bad)", { XX } },
6278 /* c0 */
6279 { "(bad)", { XX } },
6280 { "(bad)", { XX } },
6281 { "(bad)", { XX } },
6282 { "(bad)", { XX } },
6283 { "(bad)", { XX } },
6284 { "(bad)", { XX } },
6285 { "(bad)", { XX } },
6286 { "(bad)", { XX } },
6287 /* c8 */
6288 { "(bad)", { XX } },
6289 { "(bad)", { XX } },
6290 { "(bad)", { XX } },
6291 { "(bad)", { XX } },
6292 { "(bad)", { XX } },
6293 { "(bad)", { XX } },
6294 { "(bad)", { XX } },
6295 { "(bad)", { XX } },
6296 /* d0 */
6297 { "(bad)", { XX } },
6298 { "(bad)", { XX } },
6299 { "(bad)", { XX } },
6300 { "(bad)", { XX } },
6301 { "(bad)", { XX } },
6302 { "(bad)", { XX } },
6303 { "(bad)", { XX } },
6304 { "(bad)", { XX } },
6305 /* d8 */
6306 { "(bad)", { XX } },
6307 { "(bad)", { XX } },
6308 { "(bad)", { XX } },
6309 { "(bad)", { XX } },
6310 { "(bad)", { XX } },
6311 { "(bad)", { XX } },
6312 { "(bad)", { XX } },
6313 { PREFIX_TABLE (PREFIX_0F3ADF) },
6314 /* e0 */
6315 { "(bad)", { XX } },
6316 { "(bad)", { XX } },
6317 { "(bad)", { XX } },
6318 { "(bad)", { XX } },
6319 { "(bad)", { XX } },
6320 { "(bad)", { XX } },
6321 { "(bad)", { XX } },
6322 { "(bad)", { XX } },
6323 /* e8 */
6324 { "(bad)", { XX } },
6325 { "(bad)", { XX } },
6326 { "(bad)", { XX } },
6327 { "(bad)", { XX } },
6328 { "(bad)", { XX } },
6329 { "(bad)", { XX } },
6330 { "(bad)", { XX } },
6331 { "(bad)", { XX } },
6332 /* f0 */
6333 { "(bad)", { XX } },
6334 { "(bad)", { XX } },
6335 { "(bad)", { XX } },
6336 { "(bad)", { XX } },
6337 { "(bad)", { XX } },
6338 { "(bad)", { XX } },
6339 { "(bad)", { XX } },
6340 { "(bad)", { XX } },
6341 /* f8 */
6342 { "(bad)", { XX } },
6343 { "(bad)", { XX } },
6344 { "(bad)", { XX } },
6345 { "(bad)", { XX } },
6346 { "(bad)", { XX } },
6347 { "(bad)", { XX } },
6348 { "(bad)", { XX } },
6349 { "(bad)", { XX } },
6351 /* THREE_BYTE_0F7A */
6353 /* 00 */
6354 { "(bad)", { XX } },
6355 { "(bad)", { XX } },
6356 { "(bad)", { XX } },
6357 { "(bad)", { XX } },
6358 { "(bad)", { XX } },
6359 { "(bad)", { XX } },
6360 { "(bad)", { XX } },
6361 { "(bad)", { XX } },
6362 /* 08 */
6363 { "(bad)", { XX } },
6364 { "(bad)", { XX } },
6365 { "(bad)", { XX } },
6366 { "(bad)", { XX } },
6367 { "(bad)", { XX } },
6368 { "(bad)", { XX } },
6369 { "(bad)", { XX } },
6370 { "(bad)", { XX } },
6371 /* 10 */
6372 { "frczps", { XM, EXq } },
6373 { "frczpd", { XM, EXq } },
6374 { "frczss", { XM, EXq } },
6375 { "frczsd", { XM, EXq } },
6376 { "(bad)", { XX } },
6377 { "(bad)", { XX } },
6378 { "(bad)", { XX } },
6379 { "(bad)", { XX } },
6380 /* 18 */
6381 { "(bad)", { XX } },
6382 { "(bad)", { XX } },
6383 { "(bad)", { XX } },
6384 { "(bad)", { XX } },
6385 { "(bad)", { XX } },
6386 { "(bad)", { XX } },
6387 { "(bad)", { XX } },
6388 { "(bad)", { XX } },
6389 /* 20 */
6390 { "ptest", { XX } },
6391 { "(bad)", { XX } },
6392 { "(bad)", { XX } },
6393 { "(bad)", { XX } },
6394 { "(bad)", { XX } },
6395 { "(bad)", { XX } },
6396 { "(bad)", { XX } },
6397 { "(bad)", { XX } },
6398 /* 28 */
6399 { "(bad)", { XX } },
6400 { "(bad)", { XX } },
6401 { "(bad)", { XX } },
6402 { "(bad)", { XX } },
6403 { "(bad)", { XX } },
6404 { "(bad)", { XX } },
6405 { "(bad)", { XX } },
6406 { "(bad)", { XX } },
6407 /* 30 */
6408 { "cvtph2ps", { XM, EXd } },
6409 { "cvtps2ph", { EXd, XM } },
6410 { "(bad)", { XX } },
6411 { "(bad)", { XX } },
6412 { "(bad)", { XX } },
6413 { "(bad)", { XX } },
6414 { "(bad)", { XX } },
6415 { "(bad)", { XX } },
6416 /* 38 */
6417 { "(bad)", { XX } },
6418 { "(bad)", { XX } },
6419 { "(bad)", { XX } },
6420 { "(bad)", { XX } },
6421 { "(bad)", { XX } },
6422 { "(bad)", { XX } },
6423 { "(bad)", { XX } },
6424 { "(bad)", { XX } },
6425 /* 40 */
6426 { "(bad)", { XX } },
6427 { "phaddbw", { XM, EXq } },
6428 { "phaddbd", { XM, EXq } },
6429 { "phaddbq", { XM, EXq } },
6430 { "(bad)", { XX } },
6431 { "(bad)", { XX } },
6432 { "phaddwd", { XM, EXq } },
6433 { "phaddwq", { XM, EXq } },
6434 /* 48 */
6435 { "(bad)", { XX } },
6436 { "(bad)", { XX } },
6437 { "(bad)", { XX } },
6438 { "phadddq", { XM, EXq } },
6439 { "(bad)", { XX } },
6440 { "(bad)", { XX } },
6441 { "(bad)", { XX } },
6442 { "(bad)", { XX } },
6443 /* 50 */
6444 { "(bad)", { XX } },
6445 { "phaddubw", { XM, EXq } },
6446 { "phaddubd", { XM, EXq } },
6447 { "phaddubq", { XM, EXq } },
6448 { "(bad)", { XX } },
6449 { "(bad)", { XX } },
6450 { "phadduwd", { XM, EXq } },
6451 { "phadduwq", { XM, EXq } },
6452 /* 58 */
6453 { "(bad)", { XX } },
6454 { "(bad)", { XX } },
6455 { "(bad)", { XX } },
6456 { "phaddudq", { XM, EXq } },
6457 { "(bad)", { XX } },
6458 { "(bad)", { XX } },
6459 { "(bad)", { XX } },
6460 { "(bad)", { XX } },
6461 /* 60 */
6462 { "(bad)", { XX } },
6463 { "phsubbw", { XM, EXq } },
6464 { "phsubbd", { XM, EXq } },
6465 { "phsubbq", { XM, EXq } },
6466 { "(bad)", { XX } },
6467 { "(bad)", { XX } },
6468 { "(bad)", { XX } },
6469 { "(bad)", { XX } },
6470 /* 68 */
6471 { "(bad)", { XX } },
6472 { "(bad)", { XX } },
6473 { "(bad)", { XX } },
6474 { "(bad)", { XX } },
6475 { "(bad)", { XX } },
6476 { "(bad)", { XX } },
6477 { "(bad)", { XX } },
6478 { "(bad)", { XX } },
6479 /* 70 */
6480 { "(bad)", { XX } },
6481 { "(bad)", { XX } },
6482 { "(bad)", { XX } },
6483 { "(bad)", { XX } },
6484 { "(bad)", { XX } },
6485 { "(bad)", { XX } },
6486 { "(bad)", { XX } },
6487 { "(bad)", { XX } },
6488 /* 78 */
6489 { "(bad)", { XX } },
6490 { "(bad)", { XX } },
6491 { "(bad)", { XX } },
6492 { "(bad)", { XX } },
6493 { "(bad)", { XX } },
6494 { "(bad)", { XX } },
6495 { "(bad)", { XX } },
6496 { "(bad)", { XX } },
6497 /* 80 */
6498 { "(bad)", { XX } },
6499 { "(bad)", { XX } },
6500 { "(bad)", { XX } },
6501 { "(bad)", { XX } },
6502 { "(bad)", { XX } },
6503 { "(bad)", { XX } },
6504 { "(bad)", { XX } },
6505 { "(bad)", { XX } },
6506 /* 88 */
6507 { "(bad)", { XX } },
6508 { "(bad)", { XX } },
6509 { "(bad)", { XX } },
6510 { "(bad)", { XX } },
6511 { "(bad)", { XX } },
6512 { "(bad)", { XX } },
6513 { "(bad)", { XX } },
6514 { "(bad)", { XX } },
6515 /* 90 */
6516 { "(bad)", { XX } },
6517 { "(bad)", { XX } },
6518 { "(bad)", { XX } },
6519 { "(bad)", { XX } },
6520 { "(bad)", { XX } },
6521 { "(bad)", { XX } },
6522 { "(bad)", { XX } },
6523 { "(bad)", { XX } },
6524 /* 98 */
6525 { "(bad)", { XX } },
6526 { "(bad)", { XX } },
6527 { "(bad)", { XX } },
6528 { "(bad)", { XX } },
6529 { "(bad)", { XX } },
6530 { "(bad)", { XX } },
6531 { "(bad)", { XX } },
6532 { "(bad)", { XX } },
6533 /* a0 */
6534 { "(bad)", { XX } },
6535 { "(bad)", { XX } },
6536 { "(bad)", { XX } },
6537 { "(bad)", { XX } },
6538 { "(bad)", { XX } },
6539 { "(bad)", { XX } },
6540 { "(bad)", { XX } },
6541 { "(bad)", { XX } },
6542 /* a8 */
6543 { "(bad)", { XX } },
6544 { "(bad)", { XX } },
6545 { "(bad)", { XX } },
6546 { "(bad)", { XX } },
6547 { "(bad)", { XX } },
6548 { "(bad)", { XX } },
6549 { "(bad)", { XX } },
6550 { "(bad)", { XX } },
6551 /* b0 */
6552 { "(bad)", { XX } },
6553 { "(bad)", { XX } },
6554 { "(bad)", { XX } },
6555 { "(bad)", { XX } },
6556 { "(bad)", { XX } },
6557 { "(bad)", { XX } },
6558 { "(bad)", { XX } },
6559 { "(bad)", { XX } },
6560 /* b8 */
6561 { "(bad)", { XX } },
6562 { "(bad)", { XX } },
6563 { "(bad)", { XX } },
6564 { "(bad)", { XX } },
6565 { "(bad)", { XX } },
6566 { "(bad)", { XX } },
6567 { "(bad)", { XX } },
6568 { "(bad)", { XX } },
6569 /* c0 */
6570 { "(bad)", { XX } },
6571 { "(bad)", { XX } },
6572 { "(bad)", { XX } },
6573 { "(bad)", { XX } },
6574 { "(bad)", { XX } },
6575 { "(bad)", { XX } },
6576 { "(bad)", { XX } },
6577 { "(bad)", { XX } },
6578 /* c8 */
6579 { "(bad)", { XX } },
6580 { "(bad)", { XX } },
6581 { "(bad)", { XX } },
6582 { "(bad)", { XX } },
6583 { "(bad)", { XX } },
6584 { "(bad)", { XX } },
6585 { "(bad)", { XX } },
6586 { "(bad)", { XX } },
6587 /* d0 */
6588 { "(bad)", { XX } },
6589 { "(bad)", { XX } },
6590 { "(bad)", { XX } },
6591 { "(bad)", { XX } },
6592 { "(bad)", { XX } },
6593 { "(bad)", { XX } },
6594 { "(bad)", { XX } },
6595 { "(bad)", { XX } },
6596 /* d8 */
6597 { "(bad)", { XX } },
6598 { "(bad)", { XX } },
6599 { "(bad)", { XX } },
6600 { "(bad)", { XX } },
6601 { "(bad)", { XX } },
6602 { "(bad)", { XX } },
6603 { "(bad)", { XX } },
6604 { "(bad)", { XX } },
6605 /* e0 */
6606 { "(bad)", { XX } },
6607 { "(bad)", { XX } },
6608 { "(bad)", { XX } },
6609 { "(bad)", { XX } },
6610 { "(bad)", { XX } },
6611 { "(bad)", { XX } },
6612 { "(bad)", { XX } },
6613 { "(bad)", { XX } },
6614 /* e8 */
6615 { "(bad)", { XX } },
6616 { "(bad)", { XX } },
6617 { "(bad)", { XX } },
6618 { "(bad)", { XX } },
6619 { "(bad)", { XX } },
6620 { "(bad)", { XX } },
6621 { "(bad)", { XX } },
6622 { "(bad)", { XX } },
6623 /* f0 */
6624 { "(bad)", { XX } },
6625 { "(bad)", { XX } },
6626 { "(bad)", { XX } },
6627 { "(bad)", { XX } },
6628 { "(bad)", { XX } },
6629 { "(bad)", { XX } },
6630 { "(bad)", { XX } },
6631 { "(bad)", { XX } },
6632 /* f8 */
6633 { "(bad)", { XX } },
6634 { "(bad)", { XX } },
6635 { "(bad)", { XX } },
6636 { "(bad)", { XX } },
6637 { "(bad)", { XX } },
6638 { "(bad)", { XX } },
6639 { "(bad)", { XX } },
6640 { "(bad)", { XX } },
6642 /* THREE_BYTE_0F7B */
6644 /* 00 */
6645 { "(bad)", { XX } },
6646 { "(bad)", { XX } },
6647 { "(bad)", { XX } },
6648 { "(bad)", { XX } },
6649 { "(bad)", { XX } },
6650 { "(bad)", { XX } },
6651 { "(bad)", { XX } },
6652 { "(bad)", { XX } },
6653 /* 08 */
6654 { "(bad)", { XX } },
6655 { "(bad)", { XX } },
6656 { "(bad)", { XX } },
6657 { "(bad)", { XX } },
6658 { "(bad)", { XX } },
6659 { "(bad)", { XX } },
6660 { "(bad)", { XX } },
6661 { "(bad)", { XX } },
6662 /* 10 */
6663 { "(bad)", { XX } },
6664 { "(bad)", { XX } },
6665 { "(bad)", { XX } },
6666 { "(bad)", { XX } },
6667 { "(bad)", { XX } },
6668 { "(bad)", { XX } },
6669 { "(bad)", { XX } },
6670 { "(bad)", { XX } },
6671 /* 18 */
6672 { "(bad)", { XX } },
6673 { "(bad)", { XX } },
6674 { "(bad)", { XX } },
6675 { "(bad)", { XX } },
6676 { "(bad)", { XX } },
6677 { "(bad)", { XX } },
6678 { "(bad)", { XX } },
6679 { "(bad)", { XX } },
6680 /* 20 */
6681 { "(bad)", { XX } },
6682 { "(bad)", { XX } },
6683 { "(bad)", { XX } },
6684 { "(bad)", { XX } },
6685 { "(bad)", { XX } },
6686 { "(bad)", { XX } },
6687 { "(bad)", { XX } },
6688 { "(bad)", { XX } },
6689 /* 28 */
6690 { "(bad)", { XX } },
6691 { "(bad)", { XX } },
6692 { "(bad)", { XX } },
6693 { "(bad)", { XX } },
6694 { "(bad)", { XX } },
6695 { "(bad)", { XX } },
6696 { "(bad)", { XX } },
6697 { "(bad)", { XX } },
6698 /* 30 */
6699 { "(bad)", { XX } },
6700 { "(bad)", { XX } },
6701 { "(bad)", { XX } },
6702 { "(bad)", { XX } },
6703 { "(bad)", { XX } },
6704 { "(bad)", { XX } },
6705 { "(bad)", { XX } },
6706 { "(bad)", { XX } },
6707 /* 38 */
6708 { "(bad)", { XX } },
6709 { "(bad)", { XX } },
6710 { "(bad)", { XX } },
6711 { "(bad)", { XX } },
6712 { "(bad)", { XX } },
6713 { "(bad)", { XX } },
6714 { "(bad)", { XX } },
6715 { "(bad)", { XX } },
6716 /* 40 */
6717 { "protb", { XM, EXq, Ib } },
6718 { "protw", { XM, EXq, Ib } },
6719 { "protd", { XM, EXq, Ib } },
6720 { "protq", { XM, EXq, Ib } },
6721 { "pshlb", { XM, EXq, Ib } },
6722 { "pshlw", { XM, EXq, Ib } },
6723 { "pshld", { XM, EXq, Ib } },
6724 { "pshlq", { XM, EXq, Ib } },
6725 /* 48 */
6726 { "pshab", { XM, EXq, Ib } },
6727 { "pshaw", { XM, EXq, Ib } },
6728 { "pshad", { XM, EXq, Ib } },
6729 { "pshaq", { XM, EXq, Ib } },
6730 { "(bad)", { XX } },
6731 { "(bad)", { XX } },
6732 { "(bad)", { XX } },
6733 { "(bad)", { XX } },
6734 /* 50 */
6735 { "(bad)", { XX } },
6736 { "(bad)", { XX } },
6737 { "(bad)", { XX } },
6738 { "(bad)", { XX } },
6739 { "(bad)", { XX } },
6740 { "(bad)", { XX } },
6741 { "(bad)", { XX } },
6742 { "(bad)", { XX } },
6743 /* 58 */
6744 { "(bad)", { XX } },
6745 { "(bad)", { XX } },
6746 { "(bad)", { XX } },
6747 { "(bad)", { XX } },
6748 { "(bad)", { XX } },
6749 { "(bad)", { XX } },
6750 { "(bad)", { XX } },
6751 { "(bad)", { XX } },
6752 /* 60 */
6753 { "(bad)", { XX } },
6754 { "(bad)", { XX } },
6755 { "(bad)", { XX } },
6756 { "(bad)", { XX } },
6757 { "(bad)", { XX } },
6758 { "(bad)", { XX } },
6759 { "(bad)", { XX } },
6760 { "(bad)", { XX } },
6761 /* 68 */
6762 { "(bad)", { XX } },
6763 { "(bad)", { XX } },
6764 { "(bad)", { XX } },
6765 { "(bad)", { XX } },
6766 { "(bad)", { XX } },
6767 { "(bad)", { XX } },
6768 { "(bad)", { XX } },
6769 { "(bad)", { XX } },
6770 /* 70 */
6771 { "(bad)", { XX } },
6772 { "(bad)", { XX } },
6773 { "(bad)", { XX } },
6774 { "(bad)", { XX } },
6775 { "(bad)", { XX } },
6776 { "(bad)", { XX } },
6777 { "(bad)", { XX } },
6778 { "(bad)", { XX } },
6779 /* 78 */
6780 { "(bad)", { XX } },
6781 { "(bad)", { XX } },
6782 { "(bad)", { XX } },
6783 { "(bad)", { XX } },
6784 { "(bad)", { XX } },
6785 { "(bad)", { XX } },
6786 { "(bad)", { XX } },
6787 { "(bad)", { XX } },
6788 /* 80 */
6789 { "(bad)", { XX } },
6790 { "(bad)", { XX } },
6791 { "(bad)", { XX } },
6792 { "(bad)", { XX } },
6793 { "(bad)", { XX } },
6794 { "(bad)", { XX } },
6795 { "(bad)", { XX } },
6796 { "(bad)", { XX } },
6797 /* 88 */
6798 { "(bad)", { XX } },
6799 { "(bad)", { XX } },
6800 { "(bad)", { XX } },
6801 { "(bad)", { XX } },
6802 { "(bad)", { XX } },
6803 { "(bad)", { XX } },
6804 { "(bad)", { XX } },
6805 { "(bad)", { XX } },
6806 /* 90 */
6807 { "(bad)", { XX } },
6808 { "(bad)", { XX } },
6809 { "(bad)", { XX } },
6810 { "(bad)", { XX } },
6811 { "(bad)", { XX } },
6812 { "(bad)", { XX } },
6813 { "(bad)", { XX } },
6814 { "(bad)", { XX } },
6815 /* 98 */
6816 { "(bad)", { XX } },
6817 { "(bad)", { XX } },
6818 { "(bad)", { XX } },
6819 { "(bad)", { XX } },
6820 { "(bad)", { XX } },
6821 { "(bad)", { XX } },
6822 { "(bad)", { XX } },
6823 { "(bad)", { XX } },
6824 /* a0 */
6825 { "(bad)", { XX } },
6826 { "(bad)", { XX } },
6827 { "(bad)", { XX } },
6828 { "(bad)", { XX } },
6829 { "(bad)", { XX } },
6830 { "(bad)", { XX } },
6831 { "(bad)", { XX } },
6832 { "(bad)", { XX } },
6833 /* a8 */
6834 { "(bad)", { XX } },
6835 { "(bad)", { XX } },
6836 { "(bad)", { XX } },
6837 { "(bad)", { XX } },
6838 { "(bad)", { XX } },
6839 { "(bad)", { XX } },
6840 { "(bad)", { XX } },
6841 { "(bad)", { XX } },
6842 /* b0 */
6843 { "(bad)", { XX } },
6844 { "(bad)", { XX } },
6845 { "(bad)", { XX } },
6846 { "(bad)", { XX } },
6847 { "(bad)", { XX } },
6848 { "(bad)", { XX } },
6849 { "(bad)", { XX } },
6850 { "(bad)", { XX } },
6851 /* b8 */
6852 { "(bad)", { XX } },
6853 { "(bad)", { XX } },
6854 { "(bad)", { XX } },
6855 { "(bad)", { XX } },
6856 { "(bad)", { XX } },
6857 { "(bad)", { XX } },
6858 { "(bad)", { XX } },
6859 { "(bad)", { XX } },
6860 /* c0 */
6861 { "(bad)", { XX } },
6862 { "(bad)", { XX } },
6863 { "(bad)", { XX } },
6864 { "(bad)", { XX } },
6865 { "(bad)", { XX } },
6866 { "(bad)", { XX } },
6867 { "(bad)", { XX } },
6868 { "(bad)", { XX } },
6869 /* c8 */
6870 { "(bad)", { XX } },
6871 { "(bad)", { XX } },
6872 { "(bad)", { XX } },
6873 { "(bad)", { XX } },
6874 { "(bad)", { XX } },
6875 { "(bad)", { XX } },
6876 { "(bad)", { XX } },
6877 { "(bad)", { XX } },
6878 /* d0 */
6879 { "(bad)", { XX } },
6880 { "(bad)", { XX } },
6881 { "(bad)", { XX } },
6882 { "(bad)", { XX } },
6883 { "(bad)", { XX } },
6884 { "(bad)", { XX } },
6885 { "(bad)", { XX } },
6886 { "(bad)", { XX } },
6887 /* d8 */
6888 { "(bad)", { XX } },
6889 { "(bad)", { XX } },
6890 { "(bad)", { XX } },
6891 { "(bad)", { XX } },
6892 { "(bad)", { XX } },
6893 { "(bad)", { XX } },
6894 { "(bad)", { XX } },
6895 { "(bad)", { XX } },
6896 /* e0 */
6897 { "(bad)", { XX } },
6898 { "(bad)", { XX } },
6899 { "(bad)", { XX } },
6900 { "(bad)", { XX } },
6901 { "(bad)", { XX } },
6902 { "(bad)", { XX } },
6903 { "(bad)", { XX } },
6904 { "(bad)", { XX } },
6905 /* e8 */
6906 { "(bad)", { XX } },
6907 { "(bad)", { XX } },
6908 { "(bad)", { XX } },
6909 { "(bad)", { XX } },
6910 { "(bad)", { XX } },
6911 { "(bad)", { XX } },
6912 { "(bad)", { XX } },
6913 { "(bad)", { XX } },
6914 /* f0 */
6915 { "(bad)", { XX } },
6916 { "(bad)", { XX } },
6917 { "(bad)", { XX } },
6918 { "(bad)", { XX } },
6919 { "(bad)", { XX } },
6920 { "(bad)", { XX } },
6921 { "(bad)", { XX } },
6922 { "(bad)", { XX } },
6923 /* f8 */
6924 { "(bad)", { XX } },
6925 { "(bad)", { XX } },
6926 { "(bad)", { XX } },
6927 { "(bad)", { XX } },
6928 { "(bad)", { XX } },
6929 { "(bad)", { XX } },
6930 { "(bad)", { XX } },
6931 { "(bad)", { XX } },
6935 static const struct dis386 vex_table[][256] = {
6936 /* VEX_0F */
6938 /* 00 */
6939 { "(bad)", { XX } },
6940 { "(bad)", { XX } },
6941 { "(bad)", { XX } },
6942 { "(bad)", { XX } },
6943 { "(bad)", { XX } },
6944 { "(bad)", { XX } },
6945 { "(bad)", { XX } },
6946 { "(bad)", { XX } },
6947 /* 08 */
6948 { "(bad)", { XX } },
6949 { "(bad)", { XX } },
6950 { "(bad)", { XX } },
6951 { "(bad)", { XX } },
6952 { "(bad)", { XX } },
6953 { "(bad)", { XX } },
6954 { "(bad)", { XX } },
6955 { "(bad)", { XX } },
6956 /* 10 */
6957 { PREFIX_TABLE (PREFIX_VEX_10) },
6958 { PREFIX_TABLE (PREFIX_VEX_11) },
6959 { PREFIX_TABLE (PREFIX_VEX_12) },
6960 { MOD_TABLE (MOD_VEX_13) },
6961 { "vunpcklpX", { XM, Vex, EXx } },
6962 { "vunpckhpX", { XM, Vex, EXx } },
6963 { PREFIX_TABLE (PREFIX_VEX_16) },
6964 { MOD_TABLE (MOD_VEX_17) },
6965 /* 18 */
6966 { "(bad)", { XX } },
6967 { "(bad)", { XX } },
6968 { "(bad)", { XX } },
6969 { "(bad)", { XX } },
6970 { "(bad)", { XX } },
6971 { "(bad)", { XX } },
6972 { "(bad)", { XX } },
6973 { "(bad)", { XX } },
6974 /* 20 */
6975 { "(bad)", { XX } },
6976 { "(bad)", { XX } },
6977 { "(bad)", { XX } },
6978 { "(bad)", { XX } },
6979 { "(bad)", { XX } },
6980 { "(bad)", { XX } },
6981 { "(bad)", { XX } },
6982 { "(bad)", { XX } },
6983 /* 28 */
6984 { "vmovapX", { XM, EXx } },
6985 { "vmovapX", { EXx, XM } },
6986 { PREFIX_TABLE (PREFIX_VEX_2A) },
6987 { MOD_TABLE (MOD_VEX_2B) },
6988 { PREFIX_TABLE (PREFIX_VEX_2C) },
6989 { PREFIX_TABLE (PREFIX_VEX_2D) },
6990 { PREFIX_TABLE (PREFIX_VEX_2E) },
6991 { PREFIX_TABLE (PREFIX_VEX_2F) },
6992 /* 30 */
6993 { "(bad)", { XX } },
6994 { "(bad)", { XX } },
6995 { "(bad)", { XX } },
6996 { "(bad)", { XX } },
6997 { "(bad)", { XX } },
6998 { "(bad)", { XX } },
6999 { "(bad)", { XX } },
7000 { "(bad)", { XX } },
7001 /* 38 */
7002 { "(bad)", { XX } },
7003 { "(bad)", { XX } },
7004 { "(bad)", { XX } },
7005 { "(bad)", { XX } },
7006 { "(bad)", { XX } },
7007 { "(bad)", { XX } },
7008 { "(bad)", { XX } },
7009 { "(bad)", { XX } },
7010 /* 40 */
7011 { "(bad)", { XX } },
7012 { "(bad)", { XX } },
7013 { "(bad)", { XX } },
7014 { "(bad)", { XX } },
7015 { "(bad)", { XX } },
7016 { "(bad)", { XX } },
7017 { "(bad)", { XX } },
7018 { "(bad)", { XX } },
7019 /* 48 */
7020 { "(bad)", { XX } },
7021 { "(bad)", { XX } },
7022 { "(bad)", { XX } },
7023 { "(bad)", { XX } },
7024 { "(bad)", { XX } },
7025 { "(bad)", { XX } },
7026 { "(bad)", { XX } },
7027 { "(bad)", { XX } },
7028 /* 50 */
7029 { MOD_TABLE (MOD_VEX_51) },
7030 { PREFIX_TABLE (PREFIX_VEX_51) },
7031 { PREFIX_TABLE (PREFIX_VEX_52) },
7032 { PREFIX_TABLE (PREFIX_VEX_53) },
7033 { "vandpX", { XM, Vex, EXx } },
7034 { "vandnpX", { XM, Vex, EXx } },
7035 { "vorpX", { XM, Vex, EXx } },
7036 { "vxorpX", { XM, Vex, EXx } },
7037 /* 58 */
7038 { PREFIX_TABLE (PREFIX_VEX_58) },
7039 { PREFIX_TABLE (PREFIX_VEX_59) },
7040 { PREFIX_TABLE (PREFIX_VEX_5A) },
7041 { PREFIX_TABLE (PREFIX_VEX_5B) },
7042 { PREFIX_TABLE (PREFIX_VEX_5C) },
7043 { PREFIX_TABLE (PREFIX_VEX_5D) },
7044 { PREFIX_TABLE (PREFIX_VEX_5E) },
7045 { PREFIX_TABLE (PREFIX_VEX_5F) },
7046 /* 60 */
7047 { PREFIX_TABLE (PREFIX_VEX_60) },
7048 { PREFIX_TABLE (PREFIX_VEX_61) },
7049 { PREFIX_TABLE (PREFIX_VEX_62) },
7050 { PREFIX_TABLE (PREFIX_VEX_63) },
7051 { PREFIX_TABLE (PREFIX_VEX_64) },
7052 { PREFIX_TABLE (PREFIX_VEX_65) },
7053 { PREFIX_TABLE (PREFIX_VEX_66) },
7054 { PREFIX_TABLE (PREFIX_VEX_67) },
7055 /* 68 */
7056 { PREFIX_TABLE (PREFIX_VEX_68) },
7057 { PREFIX_TABLE (PREFIX_VEX_69) },
7058 { PREFIX_TABLE (PREFIX_VEX_6A) },
7059 { PREFIX_TABLE (PREFIX_VEX_6B) },
7060 { PREFIX_TABLE (PREFIX_VEX_6C) },
7061 { PREFIX_TABLE (PREFIX_VEX_6D) },
7062 { PREFIX_TABLE (PREFIX_VEX_6E) },
7063 { PREFIX_TABLE (PREFIX_VEX_6F) },
7064 /* 70 */
7065 { PREFIX_TABLE (PREFIX_VEX_70) },
7066 { REG_TABLE (REG_VEX_71) },
7067 { REG_TABLE (REG_VEX_72) },
7068 { REG_TABLE (REG_VEX_73) },
7069 { PREFIX_TABLE (PREFIX_VEX_74) },
7070 { PREFIX_TABLE (PREFIX_VEX_75) },
7071 { PREFIX_TABLE (PREFIX_VEX_76) },
7072 { PREFIX_TABLE (PREFIX_VEX_77) },
7073 /* 78 */
7074 { "(bad)", { XX } },
7075 { "(bad)", { XX } },
7076 { "(bad)", { XX } },
7077 { "(bad)", { XX } },
7078 { PREFIX_TABLE (PREFIX_VEX_7C) },
7079 { PREFIX_TABLE (PREFIX_VEX_7D) },
7080 { PREFIX_TABLE (PREFIX_VEX_7E) },
7081 { PREFIX_TABLE (PREFIX_VEX_7F) },
7082 /* 80 */
7083 { "(bad)", { XX } },
7084 { "(bad)", { XX } },
7085 { "(bad)", { XX } },
7086 { "(bad)", { XX } },
7087 { "(bad)", { XX } },
7088 { "(bad)", { XX } },
7089 { "(bad)", { XX } },
7090 { "(bad)", { XX } },
7091 /* 88 */
7092 { "(bad)", { XX } },
7093 { "(bad)", { XX } },
7094 { "(bad)", { XX } },
7095 { "(bad)", { XX } },
7096 { "(bad)", { XX } },
7097 { "(bad)", { XX } },
7098 { "(bad)", { XX } },
7099 { "(bad)", { XX } },
7100 /* 90 */
7101 { "(bad)", { XX } },
7102 { "(bad)", { XX } },
7103 { "(bad)", { XX } },
7104 { "(bad)", { XX } },
7105 { "(bad)", { XX } },
7106 { "(bad)", { XX } },
7107 { "(bad)", { XX } },
7108 { "(bad)", { XX } },
7109 /* 98 */
7110 { "(bad)", { XX } },
7111 { "(bad)", { XX } },
7112 { "(bad)", { XX } },
7113 { "(bad)", { XX } },
7114 { "(bad)", { XX } },
7115 { "(bad)", { XX } },
7116 { "(bad)", { XX } },
7117 { "(bad)", { XX } },
7118 /* a0 */
7119 { "(bad)", { XX } },
7120 { "(bad)", { XX } },
7121 { "(bad)", { XX } },
7122 { "(bad)", { XX } },
7123 { "(bad)", { XX } },
7124 { "(bad)", { XX } },
7125 { "(bad)", { XX } },
7126 { "(bad)", { XX } },
7127 /* a8 */
7128 { "(bad)", { XX } },
7129 { "(bad)", { XX } },
7130 { "(bad)", { XX } },
7131 { "(bad)", { XX } },
7132 { "(bad)", { XX } },
7133 { "(bad)", { XX } },
7134 { REG_TABLE (REG_VEX_AE) },
7135 { "(bad)", { XX } },
7136 /* b0 */
7137 { "(bad)", { XX } },
7138 { "(bad)", { XX } },
7139 { "(bad)", { XX } },
7140 { "(bad)", { XX } },
7141 { "(bad)", { XX } },
7142 { "(bad)", { XX } },
7143 { "(bad)", { XX } },
7144 { "(bad)", { XX } },
7145 /* b8 */
7146 { "(bad)", { XX } },
7147 { "(bad)", { XX } },
7148 { "(bad)", { XX } },
7149 { "(bad)", { XX } },
7150 { "(bad)", { XX } },
7151 { "(bad)", { XX } },
7152 { "(bad)", { XX } },
7153 { "(bad)", { XX } },
7154 /* c0 */
7155 { "(bad)", { XX } },
7156 { "(bad)", { XX } },
7157 { PREFIX_TABLE (PREFIX_VEX_C2) },
7158 { "(bad)", { XX } },
7159 { PREFIX_TABLE (PREFIX_VEX_C4) },
7160 { PREFIX_TABLE (PREFIX_VEX_C5) },
7161 { "vshufpX", { XM, Vex, EXx, Ib } },
7162 { "(bad)", { XX } },
7163 /* c8 */
7164 { "(bad)", { XX } },
7165 { "(bad)", { XX } },
7166 { "(bad)", { XX } },
7167 { "(bad)", { XX } },
7168 { "(bad)", { XX } },
7169 { "(bad)", { XX } },
7170 { "(bad)", { XX } },
7171 { "(bad)", { XX } },
7172 /* d0 */
7173 { PREFIX_TABLE (PREFIX_VEX_D0) },
7174 { PREFIX_TABLE (PREFIX_VEX_D1) },
7175 { PREFIX_TABLE (PREFIX_VEX_D2) },
7176 { PREFIX_TABLE (PREFIX_VEX_D3) },
7177 { PREFIX_TABLE (PREFIX_VEX_D4) },
7178 { PREFIX_TABLE (PREFIX_VEX_D5) },
7179 { PREFIX_TABLE (PREFIX_VEX_D6) },
7180 { PREFIX_TABLE (PREFIX_VEX_D7) },
7181 /* d8 */
7182 { PREFIX_TABLE (PREFIX_VEX_D8) },
7183 { PREFIX_TABLE (PREFIX_VEX_D9) },
7184 { PREFIX_TABLE (PREFIX_VEX_DA) },
7185 { PREFIX_TABLE (PREFIX_VEX_DB) },
7186 { PREFIX_TABLE (PREFIX_VEX_DC) },
7187 { PREFIX_TABLE (PREFIX_VEX_DD) },
7188 { PREFIX_TABLE (PREFIX_VEX_DE) },
7189 { PREFIX_TABLE (PREFIX_VEX_DF) },
7190 /* e0 */
7191 { PREFIX_TABLE (PREFIX_VEX_E0) },
7192 { PREFIX_TABLE (PREFIX_VEX_E1) },
7193 { PREFIX_TABLE (PREFIX_VEX_E2) },
7194 { PREFIX_TABLE (PREFIX_VEX_E3) },
7195 { PREFIX_TABLE (PREFIX_VEX_E4) },
7196 { PREFIX_TABLE (PREFIX_VEX_E5) },
7197 { PREFIX_TABLE (PREFIX_VEX_E6) },
7198 { PREFIX_TABLE (PREFIX_VEX_E7) },
7199 /* e8 */
7200 { PREFIX_TABLE (PREFIX_VEX_E8) },
7201 { PREFIX_TABLE (PREFIX_VEX_E9) },
7202 { PREFIX_TABLE (PREFIX_VEX_EA) },
7203 { PREFIX_TABLE (PREFIX_VEX_EB) },
7204 { PREFIX_TABLE (PREFIX_VEX_EC) },
7205 { PREFIX_TABLE (PREFIX_VEX_ED) },
7206 { PREFIX_TABLE (PREFIX_VEX_EE) },
7207 { PREFIX_TABLE (PREFIX_VEX_EF) },
7208 /* f0 */
7209 { PREFIX_TABLE (PREFIX_VEX_F0) },
7210 { PREFIX_TABLE (PREFIX_VEX_F1) },
7211 { PREFIX_TABLE (PREFIX_VEX_F2) },
7212 { PREFIX_TABLE (PREFIX_VEX_F3) },
7213 { PREFIX_TABLE (PREFIX_VEX_F4) },
7214 { PREFIX_TABLE (PREFIX_VEX_F5) },
7215 { PREFIX_TABLE (PREFIX_VEX_F6) },
7216 { PREFIX_TABLE (PREFIX_VEX_F7) },
7217 /* f8 */
7218 { PREFIX_TABLE (PREFIX_VEX_F8) },
7219 { PREFIX_TABLE (PREFIX_VEX_F9) },
7220 { PREFIX_TABLE (PREFIX_VEX_FA) },
7221 { PREFIX_TABLE (PREFIX_VEX_FB) },
7222 { PREFIX_TABLE (PREFIX_VEX_FC) },
7223 { PREFIX_TABLE (PREFIX_VEX_FD) },
7224 { PREFIX_TABLE (PREFIX_VEX_FE) },
7225 { "(bad)", { XX } },
7227 /* VEX_0F38 */
7229 /* 00 */
7230 { PREFIX_TABLE (PREFIX_VEX_3800) },
7231 { PREFIX_TABLE (PREFIX_VEX_3801) },
7232 { PREFIX_TABLE (PREFIX_VEX_3802) },
7233 { PREFIX_TABLE (PREFIX_VEX_3803) },
7234 { PREFIX_TABLE (PREFIX_VEX_3804) },
7235 { PREFIX_TABLE (PREFIX_VEX_3805) },
7236 { PREFIX_TABLE (PREFIX_VEX_3806) },
7237 { PREFIX_TABLE (PREFIX_VEX_3807) },
7238 /* 08 */
7239 { PREFIX_TABLE (PREFIX_VEX_3808) },
7240 { PREFIX_TABLE (PREFIX_VEX_3809) },
7241 { PREFIX_TABLE (PREFIX_VEX_380A) },
7242 { PREFIX_TABLE (PREFIX_VEX_380B) },
7243 { PREFIX_TABLE (PREFIX_VEX_380C) },
7244 { PREFIX_TABLE (PREFIX_VEX_380D) },
7245 { PREFIX_TABLE (PREFIX_VEX_380E) },
7246 { PREFIX_TABLE (PREFIX_VEX_380F) },
7247 /* 10 */
7248 { "(bad)", { XX } },
7249 { "(bad)", { XX } },
7250 { "(bad)", { XX } },
7251 { "(bad)", { XX } },
7252 { "(bad)", { XX } },
7253 { "(bad)", { XX } },
7254 { "(bad)", { XX } },
7255 { PREFIX_TABLE (PREFIX_VEX_3817) },
7256 /* 18 */
7257 { PREFIX_TABLE (PREFIX_VEX_3818) },
7258 { PREFIX_TABLE (PREFIX_VEX_3819) },
7259 { PREFIX_TABLE (PREFIX_VEX_381A) },
7260 { "(bad)", { XX } },
7261 { PREFIX_TABLE (PREFIX_VEX_381C) },
7262 { PREFIX_TABLE (PREFIX_VEX_381D) },
7263 { PREFIX_TABLE (PREFIX_VEX_381E) },
7264 { "(bad)", { XX } },
7265 /* 20 */
7266 { PREFIX_TABLE (PREFIX_VEX_3820) },
7267 { PREFIX_TABLE (PREFIX_VEX_3821) },
7268 { PREFIX_TABLE (PREFIX_VEX_3822) },
7269 { PREFIX_TABLE (PREFIX_VEX_3823) },
7270 { PREFIX_TABLE (PREFIX_VEX_3824) },
7271 { PREFIX_TABLE (PREFIX_VEX_3825) },
7272 { "(bad)", { XX } },
7273 { "(bad)", { XX } },
7274 /* 28 */
7275 { PREFIX_TABLE (PREFIX_VEX_3828) },
7276 { PREFIX_TABLE (PREFIX_VEX_3829) },
7277 { PREFIX_TABLE (PREFIX_VEX_382A) },
7278 { PREFIX_TABLE (PREFIX_VEX_382B) },
7279 { PREFIX_TABLE (PREFIX_VEX_382C) },
7280 { PREFIX_TABLE (PREFIX_VEX_382D) },
7281 { PREFIX_TABLE (PREFIX_VEX_382E) },
7282 { PREFIX_TABLE (PREFIX_VEX_382F) },
7283 /* 30 */
7284 { PREFIX_TABLE (PREFIX_VEX_3830) },
7285 { PREFIX_TABLE (PREFIX_VEX_3831) },
7286 { PREFIX_TABLE (PREFIX_VEX_3832) },
7287 { PREFIX_TABLE (PREFIX_VEX_3833) },
7288 { PREFIX_TABLE (PREFIX_VEX_3834) },
7289 { PREFIX_TABLE (PREFIX_VEX_3835) },
7290 { "(bad)", { XX } },
7291 { PREFIX_TABLE (PREFIX_VEX_3837) },
7292 /* 38 */
7293 { PREFIX_TABLE (PREFIX_VEX_3838) },
7294 { PREFIX_TABLE (PREFIX_VEX_3839) },
7295 { PREFIX_TABLE (PREFIX_VEX_383A) },
7296 { PREFIX_TABLE (PREFIX_VEX_383B) },
7297 { PREFIX_TABLE (PREFIX_VEX_383C) },
7298 { PREFIX_TABLE (PREFIX_VEX_383D) },
7299 { PREFIX_TABLE (PREFIX_VEX_383E) },
7300 { PREFIX_TABLE (PREFIX_VEX_383F) },
7301 /* 40 */
7302 { PREFIX_TABLE (PREFIX_VEX_3840) },
7303 { PREFIX_TABLE (PREFIX_VEX_3841) },
7304 { "(bad)", { XX } },
7305 { "(bad)", { XX } },
7306 { "(bad)", { XX } },
7307 { "(bad)", { XX } },
7308 { "(bad)", { XX } },
7309 { "(bad)", { XX } },
7310 /* 48 */
7311 { "(bad)", { XX } },
7312 { "(bad)", { XX } },
7313 { "(bad)", { XX } },
7314 { "(bad)", { XX } },
7315 { "(bad)", { XX } },
7316 { "(bad)", { XX } },
7317 { "(bad)", { XX } },
7318 { "(bad)", { XX } },
7319 /* 50 */
7320 { "(bad)", { XX } },
7321 { "(bad)", { XX } },
7322 { "(bad)", { XX } },
7323 { "(bad)", { XX } },
7324 { "(bad)", { XX } },
7325 { "(bad)", { XX } },
7326 { "(bad)", { XX } },
7327 { "(bad)", { XX } },
7328 /* 58 */
7329 { "(bad)", { XX } },
7330 { "(bad)", { XX } },
7331 { "(bad)", { XX } },
7332 { "(bad)", { XX } },
7333 { "(bad)", { XX } },
7334 { "(bad)", { XX } },
7335 { "(bad)", { XX } },
7336 { "(bad)", { XX } },
7337 /* 60 */
7338 { "(bad)", { XX } },
7339 { "(bad)", { XX } },
7340 { "(bad)", { XX } },
7341 { "(bad)", { XX } },
7342 { "(bad)", { XX } },
7343 { "(bad)", { XX } },
7344 { "(bad)", { XX } },
7345 { "(bad)", { XX } },
7346 /* 68 */
7347 { "(bad)", { XX } },
7348 { "(bad)", { XX } },
7349 { "(bad)", { XX } },
7350 { "(bad)", { XX } },
7351 { "(bad)", { XX } },
7352 { "(bad)", { XX } },
7353 { "(bad)", { XX } },
7354 { "(bad)", { XX } },
7355 /* 70 */
7356 { "(bad)", { XX } },
7357 { "(bad)", { XX } },
7358 { "(bad)", { XX } },
7359 { "(bad)", { XX } },
7360 { "(bad)", { XX } },
7361 { "(bad)", { XX } },
7362 { "(bad)", { XX } },
7363 { "(bad)", { XX } },
7364 /* 78 */
7365 { "(bad)", { XX } },
7366 { "(bad)", { XX } },
7367 { "(bad)", { XX } },
7368 { "(bad)", { XX } },
7369 { "(bad)", { XX } },
7370 { "(bad)", { XX } },
7371 { "(bad)", { XX } },
7372 { "(bad)", { XX } },
7373 /* 80 */
7374 { "(bad)", { XX } },
7375 { "(bad)", { XX } },
7376 { "(bad)", { XX } },
7377 { "(bad)", { XX } },
7378 { "(bad)", { XX } },
7379 { "(bad)", { XX } },
7380 { "(bad)", { XX } },
7381 { "(bad)", { XX } },
7382 /* 88 */
7383 { "(bad)", { XX } },
7384 { "(bad)", { XX } },
7385 { "(bad)", { XX } },
7386 { "(bad)", { XX } },
7387 { "(bad)", { XX } },
7388 { "(bad)", { XX } },
7389 { "(bad)", { XX } },
7390 { "(bad)", { XX } },
7391 /* 90 */
7392 { "(bad)", { XX } },
7393 { "(bad)", { XX } },
7394 { "(bad)", { XX } },
7395 { "(bad)", { XX } },
7396 { "(bad)", { XX } },
7397 { "(bad)", { XX } },
7398 { "(bad)", { XX } },
7399 { "(bad)", { XX } },
7400 /* 98 */
7401 { "(bad)", { XX } },
7402 { "(bad)", { XX } },
7403 { "(bad)", { XX } },
7404 { "(bad)", { XX } },
7405 { "(bad)", { XX } },
7406 { "(bad)", { XX } },
7407 { "(bad)", { XX } },
7408 { "(bad)", { XX } },
7409 /* a0 */
7410 { "(bad)", { XX } },
7411 { "(bad)", { XX } },
7412 { "(bad)", { XX } },
7413 { "(bad)", { XX } },
7414 { "(bad)", { XX } },
7415 { "(bad)", { XX } },
7416 { "(bad)", { XX } },
7417 { "(bad)", { XX } },
7418 /* a8 */
7419 { "(bad)", { XX } },
7420 { "(bad)", { XX } },
7421 { "(bad)", { XX } },
7422 { "(bad)", { XX } },
7423 { "(bad)", { XX } },
7424 { "(bad)", { XX } },
7425 { "(bad)", { XX } },
7426 { "(bad)", { XX } },
7427 /* b0 */
7428 { "(bad)", { XX } },
7429 { "(bad)", { XX } },
7430 { "(bad)", { XX } },
7431 { "(bad)", { XX } },
7432 { "(bad)", { XX } },
7433 { "(bad)", { XX } },
7434 { "(bad)", { XX } },
7435 { "(bad)", { XX } },
7436 /* b8 */
7437 { "(bad)", { XX } },
7438 { "(bad)", { XX } },
7439 { "(bad)", { XX } },
7440 { "(bad)", { XX } },
7441 { "(bad)", { XX } },
7442 { "(bad)", { XX } },
7443 { "(bad)", { XX } },
7444 { "(bad)", { XX } },
7445 /* c0 */
7446 { "(bad)", { XX } },
7447 { "(bad)", { XX } },
7448 { "(bad)", { XX } },
7449 { "(bad)", { XX } },
7450 { "(bad)", { XX } },
7451 { "(bad)", { XX } },
7452 { "(bad)", { XX } },
7453 { "(bad)", { XX } },
7454 /* c8 */
7455 { "(bad)", { XX } },
7456 { "(bad)", { XX } },
7457 { "(bad)", { XX } },
7458 { "(bad)", { XX } },
7459 { "(bad)", { XX } },
7460 { "(bad)", { XX } },
7461 { "(bad)", { XX } },
7462 { "(bad)", { XX } },
7463 /* d0 */
7464 { "(bad)", { XX } },
7465 { "(bad)", { XX } },
7466 { "(bad)", { XX } },
7467 { "(bad)", { XX } },
7468 { "(bad)", { XX } },
7469 { "(bad)", { XX } },
7470 { "(bad)", { XX } },
7471 { "(bad)", { XX } },
7472 /* d8 */
7473 { "(bad)", { XX } },
7474 { "(bad)", { XX } },
7475 { "(bad)", { XX } },
7476 { PREFIX_TABLE (PREFIX_VEX_38DB) },
7477 { PREFIX_TABLE (PREFIX_VEX_38DC) },
7478 { PREFIX_TABLE (PREFIX_VEX_38DD) },
7479 { PREFIX_TABLE (PREFIX_VEX_38DE) },
7480 { PREFIX_TABLE (PREFIX_VEX_38DF) },
7481 /* e0 */
7482 { "(bad)", { XX } },
7483 { "(bad)", { XX } },
7484 { "(bad)", { XX } },
7485 { "(bad)", { XX } },
7486 { "(bad)", { XX } },
7487 { "(bad)", { XX } },
7488 { "(bad)", { XX } },
7489 { "(bad)", { XX } },
7490 /* e8 */
7491 { "(bad)", { XX } },
7492 { "(bad)", { XX } },
7493 { "(bad)", { XX } },
7494 { "(bad)", { XX } },
7495 { "(bad)", { XX } },
7496 { "(bad)", { XX } },
7497 { "(bad)", { XX } },
7498 { "(bad)", { XX } },
7499 /* f0 */
7500 { "(bad)", { XX } },
7501 { "(bad)", { XX } },
7502 { "(bad)", { XX } },
7503 { "(bad)", { XX } },
7504 { "(bad)", { XX } },
7505 { "(bad)", { XX } },
7506 { "(bad)", { XX } },
7507 { "(bad)", { XX } },
7508 /* f8 */
7509 { "(bad)", { XX } },
7510 { "(bad)", { XX } },
7511 { "(bad)", { XX } },
7512 { "(bad)", { XX } },
7513 { "(bad)", { XX } },
7514 { "(bad)", { XX } },
7515 { "(bad)", { XX } },
7516 { "(bad)", { XX } },
7518 /* VEX_0F3A */
7520 /* 00 */
7521 { "(bad)", { XX } },
7522 { "(bad)", { XX } },
7523 { "(bad)", { XX } },
7524 { "(bad)", { XX } },
7525 { PREFIX_TABLE (PREFIX_VEX_3A04) },
7526 { PREFIX_TABLE (PREFIX_VEX_3A05) },
7527 { PREFIX_TABLE (PREFIX_VEX_3A06) },
7528 { "(bad)", { XX } },
7529 /* 08 */
7530 { PREFIX_TABLE (PREFIX_VEX_3A08) },
7531 { PREFIX_TABLE (PREFIX_VEX_3A09) },
7532 { PREFIX_TABLE (PREFIX_VEX_3A0A) },
7533 { PREFIX_TABLE (PREFIX_VEX_3A0B) },
7534 { PREFIX_TABLE (PREFIX_VEX_3A0C) },
7535 { PREFIX_TABLE (PREFIX_VEX_3A0D) },
7536 { PREFIX_TABLE (PREFIX_VEX_3A0E) },
7537 { PREFIX_TABLE (PREFIX_VEX_3A0F) },
7538 /* 10 */
7539 { "(bad)", { XX } },
7540 { "(bad)", { XX } },
7541 { "(bad)", { XX } },
7542 { "(bad)", { XX } },
7543 { PREFIX_TABLE (PREFIX_VEX_3A14) },
7544 { PREFIX_TABLE (PREFIX_VEX_3A15) },
7545 { PREFIX_TABLE (PREFIX_VEX_3A16) },
7546 { PREFIX_TABLE (PREFIX_VEX_3A17) },
7547 /* 18 */
7548 { PREFIX_TABLE (PREFIX_VEX_3A18) },
7549 { PREFIX_TABLE (PREFIX_VEX_3A19) },
7550 { "(bad)", { XX } },
7551 { "(bad)", { XX } },
7552 { "(bad)", { XX } },
7553 { "(bad)", { XX } },
7554 { "(bad)", { XX } },
7555 { "(bad)", { XX } },
7556 /* 20 */
7557 { PREFIX_TABLE (PREFIX_VEX_3A20) },
7558 { PREFIX_TABLE (PREFIX_VEX_3A21) },
7559 { PREFIX_TABLE (PREFIX_VEX_3A22) },
7560 { "(bad)", { XX } },
7561 { "(bad)", { XX } },
7562 { "(bad)", { XX } },
7563 { "(bad)", { XX } },
7564 { "(bad)", { XX } },
7565 /* 28 */
7566 { "(bad)", { XX } },
7567 { "(bad)", { XX } },
7568 { "(bad)", { XX } },
7569 { "(bad)", { XX } },
7570 { "(bad)", { XX } },
7571 { "(bad)", { XX } },
7572 { "(bad)", { XX } },
7573 { "(bad)", { XX } },
7574 /* 30 */
7575 { "(bad)", { XX } },
7576 { "(bad)", { XX } },
7577 { "(bad)", { XX } },
7578 { "(bad)", { XX } },
7579 { "(bad)", { XX } },
7580 { "(bad)", { XX } },
7581 { "(bad)", { XX } },
7582 { "(bad)", { XX } },
7583 /* 38 */
7584 { "(bad)", { XX } },
7585 { "(bad)", { XX } },
7586 { "(bad)", { XX } },
7587 { "(bad)", { XX } },
7588 { "(bad)", { XX } },
7589 { "(bad)", { XX } },
7590 { "(bad)", { XX } },
7591 { "(bad)", { XX } },
7592 /* 40 */
7593 { PREFIX_TABLE (PREFIX_VEX_3A40) },
7594 { PREFIX_TABLE (PREFIX_VEX_3A41) },
7595 { PREFIX_TABLE (PREFIX_VEX_3A42) },
7596 { "(bad)", { XX } },
7597 { "(bad)", { XX } },
7598 { "(bad)", { XX } },
7599 { "(bad)", { XX } },
7600 { "(bad)", { XX } },
7601 /* 48 */
7602 { PREFIX_TABLE (PREFIX_VEX_3A48) },
7603 { PREFIX_TABLE (PREFIX_VEX_3A49) },
7604 { PREFIX_TABLE (PREFIX_VEX_3A4A) },
7605 { PREFIX_TABLE (PREFIX_VEX_3A4B) },
7606 { PREFIX_TABLE (PREFIX_VEX_3A4C) },
7607 { "(bad)", { XX } },
7608 { "(bad)", { XX } },
7609 { "(bad)", { XX } },
7610 /* 50 */
7611 { "(bad)", { XX } },
7612 { "(bad)", { XX } },
7613 { "(bad)", { XX } },
7614 { "(bad)", { XX } },
7615 { "(bad)", { XX } },
7616 { "(bad)", { XX } },
7617 { "(bad)", { XX } },
7618 { "(bad)", { XX } },
7619 /* 58 */
7620 { "(bad)", { XX } },
7621 { "(bad)", { XX } },
7622 { "(bad)", { XX } },
7623 { "(bad)", { XX } },
7624 { PREFIX_TABLE (PREFIX_VEX_3A5C) },
7625 { PREFIX_TABLE (PREFIX_VEX_3A5D) },
7626 { PREFIX_TABLE (PREFIX_VEX_3A5E) },
7627 { PREFIX_TABLE (PREFIX_VEX_3A5F) },
7628 /* 60 */
7629 { PREFIX_TABLE (PREFIX_VEX_3A60) },
7630 { PREFIX_TABLE (PREFIX_VEX_3A61) },
7631 { PREFIX_TABLE (PREFIX_VEX_3A62) },
7632 { PREFIX_TABLE (PREFIX_VEX_3A63) },
7633 { "(bad)", { XX } },
7634 { "(bad)", { XX } },
7635 { "(bad)", { XX } },
7636 { "(bad)", { XX } },
7637 /* 68 */
7638 { PREFIX_TABLE (PREFIX_VEX_3A68) },
7639 { PREFIX_TABLE (PREFIX_VEX_3A69) },
7640 { PREFIX_TABLE (PREFIX_VEX_3A6A) },
7641 { PREFIX_TABLE (PREFIX_VEX_3A6B) },
7642 { PREFIX_TABLE (PREFIX_VEX_3A6C) },
7643 { PREFIX_TABLE (PREFIX_VEX_3A6D) },
7644 { PREFIX_TABLE (PREFIX_VEX_3A6E) },
7645 { PREFIX_TABLE (PREFIX_VEX_3A6F) },
7646 /* 70 */
7647 { "(bad)", { XX } },
7648 { "(bad)", { XX } },
7649 { "(bad)", { XX } },
7650 { "(bad)", { XX } },
7651 { "(bad)", { XX } },
7652 { "(bad)", { XX } },
7653 { "(bad)", { XX } },
7654 { "(bad)", { XX } },
7655 /* 78 */
7656 { PREFIX_TABLE (PREFIX_VEX_3A78) },
7657 { PREFIX_TABLE (PREFIX_VEX_3A79) },
7658 { PREFIX_TABLE (PREFIX_VEX_3A7A) },
7659 { PREFIX_TABLE (PREFIX_VEX_3A7B) },
7660 { PREFIX_TABLE (PREFIX_VEX_3A7C) },
7661 { PREFIX_TABLE (PREFIX_VEX_3A7D) },
7662 { PREFIX_TABLE (PREFIX_VEX_3A7E) },
7663 { PREFIX_TABLE (PREFIX_VEX_3A7F) },
7664 /* 80 */
7665 { "(bad)", { XX } },
7666 { "(bad)", { XX } },
7667 { "(bad)", { XX } },
7668 { "(bad)", { XX } },
7669 { "(bad)", { XX } },
7670 { "(bad)", { XX } },
7671 { "(bad)", { XX } },
7672 { "(bad)", { XX } },
7673 /* 88 */
7674 { "(bad)", { XX } },
7675 { "(bad)", { XX } },
7676 { "(bad)", { XX } },
7677 { "(bad)", { XX } },
7678 { "(bad)", { XX } },
7679 { "(bad)", { XX } },
7680 { "(bad)", { XX } },
7681 { "(bad)", { XX } },
7682 /* 90 */
7683 { "(bad)", { XX } },
7684 { "(bad)", { XX } },
7685 { "(bad)", { XX } },
7686 { "(bad)", { XX } },
7687 { "(bad)", { XX } },
7688 { "(bad)", { XX } },
7689 { "(bad)", { XX } },
7690 { "(bad)", { XX } },
7691 /* 98 */
7692 { "(bad)", { XX } },
7693 { "(bad)", { XX } },
7694 { "(bad)", { XX } },
7695 { "(bad)", { XX } },
7696 { "(bad)", { XX } },
7697 { "(bad)", { XX } },
7698 { "(bad)", { XX } },
7699 { "(bad)", { XX } },
7700 /* a0 */
7701 { "(bad)", { XX } },
7702 { "(bad)", { XX } },
7703 { "(bad)", { XX } },
7704 { "(bad)", { XX } },
7705 { "(bad)", { XX } },
7706 { "(bad)", { XX } },
7707 { "(bad)", { XX } },
7708 { "(bad)", { XX } },
7709 /* a8 */
7710 { "(bad)", { XX } },
7711 { "(bad)", { XX } },
7712 { "(bad)", { XX } },
7713 { "(bad)", { XX } },
7714 { "(bad)", { XX } },
7715 { "(bad)", { XX } },
7716 { "(bad)", { XX } },
7717 { "(bad)", { XX } },
7718 /* b0 */
7719 { "(bad)", { XX } },
7720 { "(bad)", { XX } },
7721 { "(bad)", { XX } },
7722 { "(bad)", { XX } },
7723 { "(bad)", { XX } },
7724 { "(bad)", { XX } },
7725 { "(bad)", { XX } },
7726 { "(bad)", { XX } },
7727 /* b8 */
7728 { "(bad)", { XX } },
7729 { "(bad)", { XX } },
7730 { "(bad)", { XX } },
7731 { "(bad)", { XX } },
7732 { "(bad)", { XX } },
7733 { "(bad)", { XX } },
7734 { "(bad)", { XX } },
7735 { "(bad)", { XX } },
7736 /* c0 */
7737 { "(bad)", { XX } },
7738 { "(bad)", { XX } },
7739 { "(bad)", { XX } },
7740 { "(bad)", { XX } },
7741 { "(bad)", { XX } },
7742 { "(bad)", { XX } },
7743 { "(bad)", { XX } },
7744 { "(bad)", { XX } },
7745 /* c8 */
7746 { "(bad)", { XX } },
7747 { "(bad)", { XX } },
7748 { "(bad)", { XX } },
7749 { "(bad)", { XX } },
7750 { "(bad)", { XX } },
7751 { "(bad)", { XX } },
7752 { "(bad)", { XX } },
7753 { "(bad)", { XX } },
7754 /* d0 */
7755 { "(bad)", { XX } },
7756 { "(bad)", { XX } },
7757 { "(bad)", { XX } },
7758 { "(bad)", { XX } },
7759 { "(bad)", { XX } },
7760 { "(bad)", { XX } },
7761 { "(bad)", { XX } },
7762 { "(bad)", { XX } },
7763 /* d8 */
7764 { "(bad)", { XX } },
7765 { "(bad)", { XX } },
7766 { "(bad)", { XX } },
7767 { "(bad)", { XX } },
7768 { "(bad)", { XX } },
7769 { "(bad)", { XX } },
7770 { "(bad)", { XX } },
7771 { PREFIX_TABLE (PREFIX_VEX_3ADF) },
7772 /* e0 */
7773 { "(bad)", { XX } },
7774 { "(bad)", { XX } },
7775 { "(bad)", { XX } },
7776 { "(bad)", { XX } },
7777 { "(bad)", { XX } },
7778 { "(bad)", { XX } },
7779 { "(bad)", { XX } },
7780 { "(bad)", { XX } },
7781 /* e8 */
7782 { "(bad)", { XX } },
7783 { "(bad)", { XX } },
7784 { "(bad)", { XX } },
7785 { "(bad)", { XX } },
7786 { "(bad)", { XX } },
7787 { "(bad)", { XX } },
7788 { "(bad)", { XX } },
7789 { "(bad)", { XX } },
7790 /* f0 */
7791 { "(bad)", { XX } },
7792 { "(bad)", { XX } },
7793 { "(bad)", { XX } },
7794 { "(bad)", { XX } },
7795 { "(bad)", { XX } },
7796 { "(bad)", { XX } },
7797 { "(bad)", { XX } },
7798 { "(bad)", { XX } },
7799 /* f8 */
7800 { "(bad)", { XX } },
7801 { "(bad)", { XX } },
7802 { "(bad)", { XX } },
7803 { "(bad)", { XX } },
7804 { "(bad)", { XX } },
7805 { "(bad)", { XX } },
7806 { "(bad)", { XX } },
7807 { "(bad)", { XX } },
7811 static const struct dis386 vex_len_table[][2] = {
7812 /* VEX_LEN_10_P_1 */
7814 { "vmovss", { XMVex, Vex128, EXd } },
7815 { "(bad)", { XX } },
7818 /* VEX_LEN_10_P_3 */
7820 { "vmovsd", { XMVex, Vex128, EXq } },
7821 { "(bad)", { XX } },
7824 /* VEX_LEN_11_P_1 */
7826 { "vmovss", { EXdVex, Vex128, XM } },
7827 { "(bad)", { XX } },
7830 /* VEX_LEN_11_P_3 */
7832 { "vmovsd", { EXqVex, Vex128, XM } },
7833 { "(bad)", { XX } },
7836 /* VEX_LEN_12_P_0_M_0 */
7838 { "vmovlps", { XM, Vex128, EXq } },
7839 { "(bad)", { XX } },
7842 /* VEX_LEN_12_P_0_M_1 */
7844 { "vmovhlps", { XM, Vex128, EXq } },
7845 { "(bad)", { XX } },
7848 /* VEX_LEN_12_P_2 */
7850 { "vmovlpd", { XM, Vex128, EXq } },
7851 { "(bad)", { XX } },
7854 /* VEX_LEN_13_M_0 */
7856 { "vmovlpX", { EXq, XM } },
7857 { "(bad)", { XX } },
7860 /* VEX_LEN_16_P_0_M_0 */
7862 { "vmovhps", { XM, Vex128, EXq } },
7863 { "(bad)", { XX } },
7866 /* VEX_LEN_16_P_0_M_1 */
7868 { "vmovlhps", { XM, Vex128, EXq } },
7869 { "(bad)", { XX } },
7872 /* VEX_LEN_16_P_2 */
7874 { "vmovhpd", { XM, Vex128, EXq } },
7875 { "(bad)", { XX } },
7878 /* VEX_LEN_17_M_0 */
7880 { "vmovhpX", { EXq, XM } },
7881 { "(bad)", { XX } },
7884 /* VEX_LEN_2A_P_1 */
7886 { "vcvtsi2ss%LQ", { XM, Vex128, Ev } },
7887 { "(bad)", { XX } },
7890 /* VEX_LEN_2A_P_3 */
7892 { "vcvtsi2sd%LQ", { XM, Vex128, Ev } },
7893 { "(bad)", { XX } },
7896 /* VEX_LEN_2B_M_0 */
7898 { "vmovntpX", { Mx, XM } },
7899 { "(bad)", { XX } },
7902 /* VEX_LEN_2C_P_1 */
7904 { "vcvttss2siY", { Gv, EXd } },
7905 { "(bad)", { XX } },
7908 /* VEX_LEN_2C_P_3 */
7910 { "vcvttsd2siY", { Gv, EXq } },
7911 { "(bad)", { XX } },
7914 /* VEX_LEN_2D_P_1 */
7916 { "vcvtss2siY", { Gv, EXd } },
7917 { "(bad)", { XX } },
7920 /* VEX_LEN_2D_P_3 */
7922 { "vcvtsd2siY", { Gv, EXq } },
7923 { "(bad)", { XX } },
7926 /* VEX_LEN_2E_P_0 */
7928 { "vucomiss", { XM, EXd } },
7929 { "(bad)", { XX } },
7932 /* VEX_LEN_2E_P_2 */
7934 { "vucomisd", { XM, EXq } },
7935 { "(bad)", { XX } },
7938 /* VEX_LEN_2F_P_0 */
7940 { "vcomiss", { XM, EXd } },
7941 { "(bad)", { XX } },
7944 /* VEX_LEN_2F_P_2 */
7946 { "vcomisd", { XM, EXq } },
7947 { "(bad)", { XX } },
7950 /* VEX_LEN_51_P_1 */
7952 { "vsqrtss", { XM, Vex128, EXd } },
7953 { "(bad)", { XX } },
7956 /* VEX_LEN_51_P_3 */
7958 { "vsqrtsd", { XM, Vex128, EXq } },
7959 { "(bad)", { XX } },
7962 /* VEX_LEN_52_P_1 */
7964 { "vrsqrtss", { XM, Vex128, EXd } },
7965 { "(bad)", { XX } },
7968 /* VEX_LEN_53_P_1 */
7970 { "vrcpss", { XM, Vex128, EXd } },
7971 { "(bad)", { XX } },
7974 /* VEX_LEN_58_P_1 */
7976 { "vaddss", { XM, Vex128, EXd } },
7977 { "(bad)", { XX } },
7980 /* VEX_LEN_58_P_3 */
7982 { "vaddsd", { XM, Vex128, EXq } },
7983 { "(bad)", { XX } },
7986 /* VEX_LEN_59_P_1 */
7988 { "vmulss", { XM, Vex128, EXd } },
7989 { "(bad)", { XX } },
7992 /* VEX_LEN_59_P_3 */
7994 { "vmulsd", { XM, Vex128, EXq } },
7995 { "(bad)", { XX } },
7998 /* VEX_LEN_5A_P_1 */
8000 { "vcvtss2sd", { XM, Vex128, EXd } },
8001 { "(bad)", { XX } },
8004 /* VEX_LEN_5A_P_3 */
8006 { "vcvtsd2ss", { XM, Vex128, EXq } },
8007 { "(bad)", { XX } },
8010 /* VEX_LEN_5C_P_1 */
8012 { "vsubss", { XM, Vex128, EXd } },
8013 { "(bad)", { XX } },
8016 /* VEX_LEN_5C_P_3 */
8018 { "vsubsd", { XM, Vex128, EXq } },
8019 { "(bad)", { XX } },
8022 /* VEX_LEN_5D_P_1 */
8024 { "vminss", { XM, Vex128, EXd } },
8025 { "(bad)", { XX } },
8028 /* VEX_LEN_5D_P_3 */
8030 { "vminsd", { XM, Vex128, EXq } },
8031 { "(bad)", { XX } },
8034 /* VEX_LEN_5E_P_1 */
8036 { "vdivss", { XM, Vex128, EXd } },
8037 { "(bad)", { XX } },
8040 /* VEX_LEN_5E_P_3 */
8042 { "vdivsd", { XM, Vex128, EXq } },
8043 { "(bad)", { XX } },
8046 /* VEX_LEN_5F_P_1 */
8048 { "vmaxss", { XM, Vex128, EXd } },
8049 { "(bad)", { XX } },
8052 /* VEX_LEN_5F_P_3 */
8054 { "vmaxsd", { XM, Vex128, EXq } },
8055 { "(bad)", { XX } },
8058 /* VEX_LEN_60_P_2 */
8060 { "vpunpcklbw", { XM, Vex128, EXx } },
8061 { "(bad)", { XX } },
8064 /* VEX_LEN_61_P_2 */
8066 { "vpunpcklwd", { XM, Vex128, EXx } },
8067 { "(bad)", { XX } },
8070 /* VEX_LEN_62_P_2 */
8072 { "vpunpckldq", { XM, Vex128, EXx } },
8073 { "(bad)", { XX } },
8076 /* VEX_LEN_63_P_2 */
8078 { "vpacksswb", { XM, Vex128, EXx } },
8079 { "(bad)", { XX } },
8082 /* VEX_LEN_64_P_2 */
8084 { "vpcmpgtb", { XM, Vex128, EXx } },
8085 { "(bad)", { XX } },
8088 /* VEX_LEN_65_P_2 */
8090 { "vpcmpgtw", { XM, Vex128, EXx } },
8091 { "(bad)", { XX } },
8094 /* VEX_LEN_66_P_2 */
8096 { "vpcmpgtd", { XM, Vex128, EXx } },
8097 { "(bad)", { XX } },
8100 /* VEX_LEN_67_P_2 */
8102 { "vpackuswb", { XM, Vex128, EXx } },
8103 { "(bad)", { XX } },
8106 /* VEX_LEN_68_P_2 */
8108 { "vpunpckhbw", { XM, Vex128, EXx } },
8109 { "(bad)", { XX } },
8112 /* VEX_LEN_69_P_2 */
8114 { "vpunpckhwd", { XM, Vex128, EXx } },
8115 { "(bad)", { XX } },
8118 /* VEX_LEN_6A_P_2 */
8120 { "vpunpckhdq", { XM, Vex128, EXx } },
8121 { "(bad)", { XX } },
8124 /* VEX_LEN_6B_P_2 */
8126 { "vpackssdw", { XM, Vex128, EXx } },
8127 { "(bad)", { XX } },
8130 /* VEX_LEN_6C_P_2 */
8132 { "vpunpcklqdq", { XM, Vex128, EXx } },
8133 { "(bad)", { XX } },
8136 /* VEX_LEN_6D_P_2 */
8138 { "vpunpckhqdq", { XM, Vex128, EXx } },
8139 { "(bad)", { XX } },
8142 /* VEX_LEN_6E_P_2 */
8144 { "vmovK", { XM, Edq } },
8145 { "(bad)", { XX } },
8148 /* VEX_LEN_70_P_1 */
8150 { "vpshufhw", { XM, EXx, Ib } },
8151 { "(bad)", { XX } },
8154 /* VEX_LEN_70_P_2 */
8156 { "vpshufd", { XM, EXx, Ib } },
8157 { "(bad)", { XX } },
8160 /* VEX_LEN_70_P_3 */
8162 { "vpshuflw", { XM, EXx, Ib } },
8163 { "(bad)", { XX } },
8166 /* VEX_LEN_71_R_2_P_2 */
8168 { "vpsrlw", { Vex128, XS, Ib } },
8169 { "(bad)", { XX } },
8172 /* VEX_LEN_71_R_4_P_2 */
8174 { "vpsraw", { Vex128, XS, Ib } },
8175 { "(bad)", { XX } },
8178 /* VEX_LEN_71_R_6_P_2 */
8180 { "vpsllw", { Vex128, XS, Ib } },
8181 { "(bad)", { XX } },
8184 /* VEX_LEN_72_R_2_P_2 */
8186 { "vpsrld", { Vex128, XS, Ib } },
8187 { "(bad)", { XX } },
8190 /* VEX_LEN_72_R_4_P_2 */
8192 { "vpsrad", { Vex128, XS, Ib } },
8193 { "(bad)", { XX } },
8196 /* VEX_LEN_72_R_6_P_2 */
8198 { "vpslld", { Vex128, XS, Ib } },
8199 { "(bad)", { XX } },
8202 /* VEX_LEN_73_R_2_P_2 */
8204 { "vpsrlq", { Vex128, XS, Ib } },
8205 { "(bad)", { XX } },
8208 /* VEX_LEN_73_R_3_P_2 */
8210 { "vpsrldq", { Vex128, XS, Ib } },
8211 { "(bad)", { XX } },
8214 /* VEX_LEN_73_R_6_P_2 */
8216 { "vpsllq", { Vex128, XS, Ib } },
8217 { "(bad)", { XX } },
8220 /* VEX_LEN_73_R_7_P_2 */
8222 { "vpslldq", { Vex128, XS, Ib } },
8223 { "(bad)", { XX } },
8226 /* VEX_LEN_74_P_2 */
8228 { "vpcmpeqb", { XM, Vex128, EXx } },
8229 { "(bad)", { XX } },
8232 /* VEX_LEN_75_P_2 */
8234 { "vpcmpeqw", { XM, Vex128, EXx } },
8235 { "(bad)", { XX } },
8238 /* VEX_LEN_76_P_2 */
8240 { "vpcmpeqd", { XM, Vex128, EXx } },
8241 { "(bad)", { XX } },
8244 /* VEX_LEN_7E_P_1 */
8246 { "vmovq", { XM, EXq } },
8247 { "(bad)", { XX } },
8250 /* VEX_LEN_7E_P_2 */
8252 { "vmovK", { Edq, XM } },
8253 { "(bad)", { XX } },
8256 /* VEX_LEN_AE_R_2_M0 */
8258 { "vldmxcsr", { Md } },
8259 { "(bad)", { XX } },
8262 /* VEX_LEN_AE_R_3_M0 */
8264 { "vstmxcsr", { Md } },
8265 { "(bad)", { XX } },
8268 /* VEX_LEN_C2_P_1 */
8270 { "vcmpss", { XM, Vex128, EXd, VCMP } },
8271 { "(bad)", { XX } },
8274 /* VEX_LEN_C2_P_3 */
8276 { "vcmpsd", { XM, Vex128, EXq, VCMP } },
8277 { "(bad)", { XX } },
8280 /* VEX_LEN_C4_P_2 */
8282 { "vpinsrw", { XM, Vex128, Edqw, Ib } },
8283 { "(bad)", { XX } },
8286 /* VEX_LEN_C5_P_2 */
8288 { "vpextrw", { Gdq, XS, Ib } },
8289 { "(bad)", { XX } },
8292 /* VEX_LEN_D1_P_2 */
8294 { "vpsrlw", { XM, Vex128, EXx } },
8295 { "(bad)", { XX } },
8298 /* VEX_LEN_D2_P_2 */
8300 { "vpsrld", { XM, Vex128, EXx } },
8301 { "(bad)", { XX } },
8304 /* VEX_LEN_D3_P_2 */
8306 { "vpsrlq", { XM, Vex128, EXx } },
8307 { "(bad)", { XX } },
8310 /* VEX_LEN_D4_P_2 */
8312 { "vpaddq", { XM, Vex128, EXx } },
8313 { "(bad)", { XX } },
8316 /* VEX_LEN_D5_P_2 */
8318 { "vpmullw", { XM, Vex128, EXx } },
8319 { "(bad)", { XX } },
8322 /* VEX_LEN_D6_P_2 */
8324 { "vmovq", { EXq, XM } },
8325 { "(bad)", { XX } },
8328 /* VEX_LEN_D7_P_2_M_1 */
8330 { "vpmovmskb", { Gdq, XS } },
8331 { "(bad)", { XX } },
8334 /* VEX_LEN_D8_P_2 */
8336 { "vpsubusb", { XM, Vex128, EXx } },
8337 { "(bad)", { XX } },
8340 /* VEX_LEN_D9_P_2 */
8342 { "vpsubusw", { XM, Vex128, EXx } },
8343 { "(bad)", { XX } },
8346 /* VEX_LEN_DA_P_2 */
8348 { "vpminub", { XM, Vex128, EXx } },
8349 { "(bad)", { XX } },
8352 /* VEX_LEN_DB_P_2 */
8354 { "vpand", { XM, Vex128, EXx } },
8355 { "(bad)", { XX } },
8358 /* VEX_LEN_DC_P_2 */
8360 { "vpaddusb", { XM, Vex128, EXx } },
8361 { "(bad)", { XX } },
8364 /* VEX_LEN_DD_P_2 */
8366 { "vpaddusw", { XM, Vex128, EXx } },
8367 { "(bad)", { XX } },
8370 /* VEX_LEN_DE_P_2 */
8372 { "vpmaxub", { XM, Vex128, EXx } },
8373 { "(bad)", { XX } },
8376 /* VEX_LEN_DF_P_2 */
8378 { "vpandn", { XM, Vex128, EXx } },
8379 { "(bad)", { XX } },
8382 /* VEX_LEN_E0_P_2 */
8384 { "vpavgb", { XM, Vex128, EXx } },
8385 { "(bad)", { XX } },
8388 /* VEX_LEN_E1_P_2 */
8390 { "vpsraw", { XM, Vex128, EXx } },
8391 { "(bad)", { XX } },
8394 /* VEX_LEN_E2_P_2 */
8396 { "vpsrad", { XM, Vex128, EXx } },
8397 { "(bad)", { XX } },
8400 /* VEX_LEN_E3_P_2 */
8402 { "vpavgw", { XM, Vex128, EXx } },
8403 { "(bad)", { XX } },
8406 /* VEX_LEN_E4_P_2 */
8408 { "vpmulhuw", { XM, Vex128, EXx } },
8409 { "(bad)", { XX } },
8412 /* VEX_LEN_E5_P_2 */
8414 { "vpmulhw", { XM, Vex128, EXx } },
8415 { "(bad)", { XX } },
8418 /* VEX_LEN_E7_P_2_M_0 */
8420 { "vmovntdq", { Mx, XM } },
8421 { "(bad)", { XX } },
8424 /* VEX_LEN_E8_P_2 */
8426 { "vpsubsb", { XM, Vex128, EXx } },
8427 { "(bad)", { XX } },
8430 /* VEX_LEN_E9_P_2 */
8432 { "vpsubsw", { XM, Vex128, EXx } },
8433 { "(bad)", { XX } },
8436 /* VEX_LEN_EA_P_2 */
8438 { "vpminsw", { XM, Vex128, EXx } },
8439 { "(bad)", { XX } },
8442 /* VEX_LEN_EB_P_2 */
8444 { "vpor", { XM, Vex128, EXx } },
8445 { "(bad)", { XX } },
8448 /* VEX_LEN_EC_P_2 */
8450 { "vpaddsb", { XM, Vex128, EXx } },
8451 { "(bad)", { XX } },
8454 /* VEX_LEN_ED_P_2 */
8456 { "vpaddsw", { XM, Vex128, EXx } },
8457 { "(bad)", { XX } },
8460 /* VEX_LEN_EE_P_2 */
8462 { "vpmaxsw", { XM, Vex128, EXx } },
8463 { "(bad)", { XX } },
8466 /* VEX_LEN_EF_P_2 */
8468 { "vpxor", { XM, Vex128, EXx } },
8469 { "(bad)", { XX } },
8472 /* VEX_LEN_F1_P_2 */
8474 { "vpsllw", { XM, Vex128, EXx } },
8475 { "(bad)", { XX } },
8478 /* VEX_LEN_F2_P_2 */
8480 { "vpslld", { XM, Vex128, EXx } },
8481 { "(bad)", { XX } },
8484 /* VEX_LEN_F3_P_2 */
8486 { "vpsllq", { XM, Vex128, EXx } },
8487 { "(bad)", { XX } },
8490 /* VEX_LEN_F4_P_2 */
8492 { "vpmuludq", { XM, Vex128, EXx } },
8493 { "(bad)", { XX } },
8496 /* VEX_LEN_F5_P_2 */
8498 { "vpmaddwd", { XM, Vex128, EXx } },
8499 { "(bad)", { XX } },
8502 /* VEX_LEN_F6_P_2 */
8504 { "vpsadbw", { XM, Vex128, EXx } },
8505 { "(bad)", { XX } },
8508 /* VEX_LEN_F7_P_2 */
8510 { "vmaskmovdqu", { XM, XS } },
8511 { "(bad)", { XX } },
8514 /* VEX_LEN_F8_P_2 */
8516 { "vpsubb", { XM, Vex128, EXx } },
8517 { "(bad)", { XX } },
8520 /* VEX_LEN_F9_P_2 */
8522 { "vpsubw", { XM, Vex128, EXx } },
8523 { "(bad)", { XX } },
8526 /* VEX_LEN_FA_P_2 */
8528 { "vpsubd", { XM, Vex128, EXx } },
8529 { "(bad)", { XX } },
8532 /* VEX_LEN_FB_P_2 */
8534 { "vpsubq", { XM, Vex128, EXx } },
8535 { "(bad)", { XX } },
8538 /* VEX_LEN_FC_P_2 */
8540 { "vpaddb", { XM, Vex128, EXx } },
8541 { "(bad)", { XX } },
8544 /* VEX_LEN_FD_P_2 */
8546 { "vpaddw", { XM, Vex128, EXx } },
8547 { "(bad)", { XX } },
8550 /* VEX_LEN_FE_P_2 */
8552 { "vpaddd", { XM, Vex128, EXx } },
8553 { "(bad)", { XX } },
8556 /* VEX_LEN_3800_P_2 */
8558 { "vpshufb", { XM, Vex128, EXx } },
8559 { "(bad)", { XX } },
8562 /* VEX_LEN_3801_P_2 */
8564 { "vphaddw", { XM, Vex128, EXx } },
8565 { "(bad)", { XX } },
8568 /* VEX_LEN_3802_P_2 */
8570 { "vphaddd", { XM, Vex128, EXx } },
8571 { "(bad)", { XX } },
8574 /* VEX_LEN_3803_P_2 */
8576 { "vphaddsw", { XM, Vex128, EXx } },
8577 { "(bad)", { XX } },
8580 /* VEX_LEN_3804_P_2 */
8582 { "vpmaddubsw", { XM, Vex128, EXx } },
8583 { "(bad)", { XX } },
8586 /* VEX_LEN_3805_P_2 */
8588 { "vphsubw", { XM, Vex128, EXx } },
8589 { "(bad)", { XX } },
8592 /* VEX_LEN_3806_P_2 */
8594 { "vphsubd", { XM, Vex128, EXx } },
8595 { "(bad)", { XX } },
8598 /* VEX_LEN_3807_P_2 */
8600 { "vphsubsw", { XM, Vex128, EXx } },
8601 { "(bad)", { XX } },
8604 /* VEX_LEN_3808_P_2 */
8606 { "vpsignb", { XM, Vex128, EXx } },
8607 { "(bad)", { XX } },
8610 /* VEX_LEN_3809_P_2 */
8612 { "vpsignw", { XM, Vex128, EXx } },
8613 { "(bad)", { XX } },
8616 /* VEX_LEN_380A_P_2 */
8618 { "vpsignd", { XM, Vex128, EXx } },
8619 { "(bad)", { XX } },
8622 /* VEX_LEN_380B_P_2 */
8624 { "vpmulhrsw", { XM, Vex128, EXx } },
8625 { "(bad)", { XX } },
8628 /* VEX_LEN_3819_P_2_M_0 */
8630 { "(bad)", { XX } },
8631 { "vbroadcastsd", { XM, Mq } },
8634 /* VEX_LEN_381A_P_2_M_0 */
8636 { "(bad)", { XX } },
8637 { "vbroadcastf128", { XM, Mxmm } },
8640 /* VEX_LEN_381C_P_2 */
8642 { "vpabsb", { XM, EXx } },
8643 { "(bad)", { XX } },
8646 /* VEX_LEN_381D_P_2 */
8648 { "vpabsw", { XM, EXx } },
8649 { "(bad)", { XX } },
8652 /* VEX_LEN_381E_P_2 */
8654 { "vpabsd", { XM, EXx } },
8655 { "(bad)", { XX } },
8658 /* VEX_LEN_3820_P_2 */
8660 { "vpmovsxbw", { XM, EXq } },
8661 { "(bad)", { XX } },
8664 /* VEX_LEN_3821_P_2 */
8666 { "vpmovsxbd", { XM, EXd } },
8667 { "(bad)", { XX } },
8670 /* VEX_LEN_3822_P_2 */
8672 { "vpmovsxbq", { XM, EXw } },
8673 { "(bad)", { XX } },
8676 /* VEX_LEN_3823_P_2 */
8678 { "vpmovsxwd", { XM, EXq } },
8679 { "(bad)", { XX } },
8682 /* VEX_LEN_3824_P_2 */
8684 { "vpmovsxwq", { XM, EXd } },
8685 { "(bad)", { XX } },
8688 /* VEX_LEN_3825_P_2 */
8690 { "vpmovsxdq", { XM, EXq } },
8691 { "(bad)", { XX } },
8694 /* VEX_LEN_3828_P_2 */
8696 { "vpmuldq", { XM, Vex128, EXx } },
8697 { "(bad)", { XX } },
8700 /* VEX_LEN_3829_P_2 */
8702 { "vpcmpeqq", { XM, Vex128, EXx } },
8703 { "(bad)", { XX } },
8706 /* VEX_LEN_382A_P_2_M_0 */
8708 { "vmovntdqa", { XM, Mx } },
8709 { "(bad)", { XX } },
8712 /* VEX_LEN_382B_P_2 */
8714 { "vpackusdw", { XM, Vex128, EXx } },
8715 { "(bad)", { XX } },
8718 /* VEX_LEN_3830_P_2 */
8720 { "vpmovzxbw", { XM, EXq } },
8721 { "(bad)", { XX } },
8724 /* VEX_LEN_3831_P_2 */
8726 { "vpmovzxbd", { XM, EXd } },
8727 { "(bad)", { XX } },
8730 /* VEX_LEN_3832_P_2 */
8732 { "vpmovzxbq", { XM, EXw } },
8733 { "(bad)", { XX } },
8736 /* VEX_LEN_3833_P_2 */
8738 { "vpmovzxwd", { XM, EXq } },
8739 { "(bad)", { XX } },
8742 /* VEX_LEN_3834_P_2 */
8744 { "vpmovzxwq", { XM, EXd } },
8745 { "(bad)", { XX } },
8748 /* VEX_LEN_3835_P_2 */
8750 { "vpmovzxdq", { XM, EXq } },
8751 { "(bad)", { XX } },
8754 /* VEX_LEN_3837_P_2 */
8756 { "vpcmpgtq", { XM, Vex128, EXx } },
8757 { "(bad)", { XX } },
8760 /* VEX_LEN_3838_P_2 */
8762 { "vpminsb", { XM, Vex128, EXx } },
8763 { "(bad)", { XX } },
8766 /* VEX_LEN_3839_P_2 */
8768 { "vpminsd", { XM, Vex128, EXx } },
8769 { "(bad)", { XX } },
8772 /* VEX_LEN_383A_P_2 */
8774 { "vpminuw", { XM, Vex128, EXx } },
8775 { "(bad)", { XX } },
8778 /* VEX_LEN_383B_P_2 */
8780 { "vpminud", { XM, Vex128, EXx } },
8781 { "(bad)", { XX } },
8784 /* VEX_LEN_383C_P_2 */
8786 { "vpmaxsb", { XM, Vex128, EXx } },
8787 { "(bad)", { XX } },
8790 /* VEX_LEN_383D_P_2 */
8792 { "vpmaxsd", { XM, Vex128, EXx } },
8793 { "(bad)", { XX } },
8796 /* VEX_LEN_383E_P_2 */
8798 { "vpmaxuw", { XM, Vex128, EXx } },
8799 { "(bad)", { XX } },
8802 /* VEX_LEN_383F_P_2 */
8804 { "vpmaxud", { XM, Vex128, EXx } },
8805 { "(bad)", { XX } },
8808 /* VEX_LEN_3840_P_2 */
8810 { "vpmulld", { XM, Vex128, EXx } },
8811 { "(bad)", { XX } },
8814 /* VEX_LEN_3841_P_2 */
8816 { "vphminposuw", { XM, EXx } },
8817 { "(bad)", { XX } },
8820 /* VEX_LEN_38DB_P_2 */
8822 { "vaesimc", { XM, EXx } },
8823 { "(bad)", { XX } },
8826 /* VEX_LEN_38DC_P_2 */
8828 { "vaesenc", { XM, Vex128, EXx } },
8829 { "(bad)", { XX } },
8832 /* VEX_LEN_38DD_P_2 */
8834 { "vaesenclast", { XM, Vex128, EXx } },
8835 { "(bad)", { XX } },
8838 /* VEX_LEN_38DE_P_2 */
8840 { "vaesdec", { XM, Vex128, EXx } },
8841 { "(bad)", { XX } },
8844 /* VEX_LEN_38DF_P_2 */
8846 { "vaesdeclast", { XM, Vex128, EXx } },
8847 { "(bad)", { XX } },
8850 /* VEX_LEN_3A06_P_2 */
8852 { "(bad)", { XX } },
8853 { "vperm2f128", { XM, Vex256, EXx, Ib } },
8856 /* VEX_LEN_3A0A_P_2 */
8858 { "vroundss", { XM, Vex128, EXd, Ib } },
8859 { "(bad)", { XX } },
8862 /* VEX_LEN_3A0B_P_2 */
8864 { "vroundsd", { XM, Vex128, EXq, Ib } },
8865 { "(bad)", { XX } },
8868 /* VEX_LEN_3A0E_P_2 */
8870 { "vpblendw", { XM, Vex128, EXx, Ib } },
8871 { "(bad)", { XX } },
8874 /* VEX_LEN_3A0F_P_2 */
8876 { "vpalignr", { XM, Vex128, EXx, Ib } },
8877 { "(bad)", { XX } },
8880 /* VEX_LEN_3A14_P_2 */
8882 { "vpextrb", { Edqb, XM, Ib } },
8883 { "(bad)", { XX } },
8886 /* VEX_LEN_3A15_P_2 */
8888 { "vpextrw", { Edqw, XM, Ib } },
8889 { "(bad)", { XX } },
8892 /* VEX_LEN_3A16_P_2 */
8894 { "vpextrK", { Edq, XM, Ib } },
8895 { "(bad)", { XX } },
8898 /* VEX_LEN_3A17_P_2 */
8900 { "vextractps", { Edqd, XM, Ib } },
8901 { "(bad)", { XX } },
8904 /* VEX_LEN_3A18_P_2 */
8906 { "(bad)", { XX } },
8907 { "vinsertf128", { XM, Vex256, EXxmm, Ib } },
8910 /* VEX_LEN_3A19_P_2 */
8912 { "(bad)", { XX } },
8913 { "vextractf128", { EXxmm, XM, Ib } },
8916 /* VEX_LEN_3A20_P_2 */
8918 { "vpinsrb", { XM, Vex128, Edqb, Ib } },
8919 { "(bad)", { XX } },
8922 /* VEX_LEN_3A21_P_2 */
8924 { "vinsertps", { XM, Vex128, EXd, Ib } },
8925 { "(bad)", { XX } },
8928 /* VEX_LEN_3A22_P_2 */
8930 { "vpinsrK", { XM, Vex128, Edq, Ib } },
8931 { "(bad)", { XX } },
8934 /* VEX_LEN_3A41_P_2 */
8936 { "vdppd", { XM, Vex128, EXx, Ib } },
8937 { "(bad)", { XX } },
8940 /* VEX_LEN_3A42_P_2 */
8942 { "vmpsadbw", { XM, Vex128, EXx, Ib } },
8943 { "(bad)", { XX } },
8946 /* VEX_LEN_3A4C_P_2 */
8948 { "vpblendvb", { XM, Vex128, EXx, XMVexI4 } },
8949 { "(bad)", { XX } },
8952 /* VEX_LEN_3A60_P_2 */
8954 { "vpcmpestrm", { XM, EXx, Ib } },
8955 { "(bad)", { XX } },
8958 /* VEX_LEN_3A61_P_2 */
8960 { "vpcmpestri", { XM, EXx, Ib } },
8961 { "(bad)", { XX } },
8964 /* VEX_LEN_3A62_P_2 */
8966 { "vpcmpistrm", { XM, EXx, Ib } },
8967 { "(bad)", { XX } },
8970 /* VEX_LEN_3A63_P_2 */
8972 { "vpcmpistri", { XM, EXx, Ib } },
8973 { "(bad)", { XX } },
8976 /* VEX_LEN_3A6A_P_2 */
8978 { "vfmaddss", { XMVexW, Vex128FMA, EXdVexW, EXdVexW, VexI4 } },
8979 { "(bad)", { XX } },
8982 /* VEX_LEN_3A6B_P_2 */
8984 { "vfmaddsd", { XMVexW, Vex128FMA, EXqVexW, EXqVexW, VexI4 } },
8985 { "(bad)", { XX } },
8988 /* VEX_LEN_3A6E_P_2 */
8990 { "vfmsubss", { XMVexW, Vex128FMA, EXdVexW, EXdVexW, VexI4 } },
8991 { "(bad)", { XX } },
8994 /* VEX_LEN_3A6F_P_2 */
8996 { "vfmsubsd", { XMVexW, Vex128FMA, EXqVexW, EXqVexW, VexI4 } },
8997 { "(bad)", { XX } },
9000 /* VEX_LEN_3A7A_P_2 */
9002 { "vfnmaddss", { XMVexW, Vex128FMA, EXdVexW, EXdVexW, VexI4 } },
9003 { "(bad)", { XX } },
9006 /* VEX_LEN_3A7B_P_2 */
9008 { "vfnmaddsd", { XMVexW, Vex128FMA, EXqVexW, EXqVexW, VexI4 } },
9009 { "(bad)", { XX } },
9012 /* VEX_LEN_3A7E_P_2 */
9014 { "vfnmsubss", { XMVexW, Vex128FMA, EXdVexW, EXdVexW, VexI4 } },
9015 { "(bad)", { XX } },
9018 /* VEX_LEN_3A7F_P_2 */
9020 { "vfnmsubsd", { XMVexW, Vex128FMA, EXqVexW, EXqVexW, VexI4 } },
9021 { "(bad)", { XX } },
9024 /* VEX_LEN_3ADF_P_2 */
9026 { "vaeskeygenassist", { XM, EXx, Ib } },
9027 { "(bad)", { XX } },
9031 static const struct dis386 mod_table[][2] = {
9033 /* MOD_8D */
9034 { "leaS", { Gv, M } },
9035 { "(bad)", { XX } },
9038 /* MOD_0F01_REG_0 */
9039 { X86_64_TABLE (X86_64_0F01_REG_0) },
9040 { RM_TABLE (RM_0F01_REG_0) },
9043 /* MOD_0F01_REG_1 */
9044 { X86_64_TABLE (X86_64_0F01_REG_1) },
9045 { RM_TABLE (RM_0F01_REG_1) },
9048 /* MOD_0F01_REG_2 */
9049 { X86_64_TABLE (X86_64_0F01_REG_2) },
9050 { RM_TABLE (RM_0F01_REG_2) },
9053 /* MOD_0F01_REG_3 */
9054 { X86_64_TABLE (X86_64_0F01_REG_3) },
9055 { RM_TABLE (RM_0F01_REG_3) },
9058 /* MOD_0F01_REG_7 */
9059 { "invlpg", { Mb } },
9060 { RM_TABLE (RM_0F01_REG_7) },
9063 /* MOD_0F12_PREFIX_0 */
9064 { "movlps", { XM, EXq } },
9065 { "movhlps", { XM, EXq } },
9068 /* MOD_0F13 */
9069 { "movlpX", { EXq, XM } },
9070 { "(bad)", { XX } },
9073 /* MOD_0F16_PREFIX_0 */
9074 { "movhps", { XM, EXq } },
9075 { "movlhps", { XM, EXq } },
9078 /* MOD_0F17 */
9079 { "movhpX", { EXq, XM } },
9080 { "(bad)", { XX } },
9083 /* MOD_0F18_REG_0 */
9084 { "prefetchnta", { Mb } },
9085 { "(bad)", { XX } },
9088 /* MOD_0F18_REG_1 */
9089 { "prefetcht0", { Mb } },
9090 { "(bad)", { XX } },
9093 /* MOD_0F18_REG_2 */
9094 { "prefetcht1", { Mb } },
9095 { "(bad)", { XX } },
9098 /* MOD_0F18_REG_3 */
9099 { "prefetcht2", { Mb } },
9100 { "(bad)", { XX } },
9103 /* MOD_0F20 */
9104 { "(bad)", { XX } },
9105 { "movZ", { Rm, Cm } },
9108 /* MOD_0F21 */
9109 { "(bad)", { XX } },
9110 { "movZ", { Rm, Dm } },
9113 /* MOD_0F22 */
9114 { "(bad)", { XX } },
9115 { "movZ", { Cm, Rm } },
9118 /* MOD_0F23 */
9119 { "(bad)", { XX } },
9120 { "movZ", { Dm, Rm } },
9123 /* MOD_0F24 */
9124 { THREE_BYTE_TABLE (THREE_BYTE_0F24) },
9125 { "movL", { Rd, Td } },
9128 /* MOD_0F26 */
9129 { "(bad)", { XX } },
9130 { "movL", { Td, Rd } },
9133 /* MOD_0F2B_PREFIX_0 */
9134 {"movntps", { Mx, XM } },
9135 { "(bad)", { XX } },
9138 /* MOD_0F2B_PREFIX_1 */
9139 {"movntss", { Md, XM } },
9140 { "(bad)", { XX } },
9143 /* MOD_0F2B_PREFIX_2 */
9144 {"movntpd", { Mx, XM } },
9145 { "(bad)", { XX } },
9148 /* MOD_0F2B_PREFIX_3 */
9149 {"movntsd", { Mq, XM } },
9150 { "(bad)", { XX } },
9153 /* MOD_0F51 */
9154 { "(bad)", { XX } },
9155 { "movmskpX", { Gdq, XS } },
9158 /* MOD_0F71_REG_2 */
9159 { "(bad)", { XX } },
9160 { "psrlw", { MS, Ib } },
9163 /* MOD_0F71_REG_4 */
9164 { "(bad)", { XX } },
9165 { "psraw", { MS, Ib } },
9168 /* MOD_0F71_REG_6 */
9169 { "(bad)", { XX } },
9170 { "psllw", { MS, Ib } },
9173 /* MOD_0F72_REG_2 */
9174 { "(bad)", { XX } },
9175 { "psrld", { MS, Ib } },
9178 /* MOD_0F72_REG_4 */
9179 { "(bad)", { XX } },
9180 { "psrad", { MS, Ib } },
9183 /* MOD_0F72_REG_6 */
9184 { "(bad)", { XX } },
9185 { "pslld", { MS, Ib } },
9188 /* MOD_0F73_REG_2 */
9189 { "(bad)", { XX } },
9190 { "psrlq", { MS, Ib } },
9193 /* MOD_0F73_REG_3 */
9194 { "(bad)", { XX } },
9195 { PREFIX_TABLE (PREFIX_0F73_REG_3) },
9198 /* MOD_0F73_REG_6 */
9199 { "(bad)", { XX } },
9200 { "psllq", { MS, Ib } },
9203 /* MOD_0F73_REG_7 */
9204 { "(bad)", { XX } },
9205 { PREFIX_TABLE (PREFIX_0F73_REG_7) },
9208 /* MOD_0FAE_REG_0 */
9209 { "fxsave", { M } },
9210 { "(bad)", { XX } },
9213 /* MOD_0FAE_REG_1 */
9214 { "fxrstor", { M } },
9215 { "(bad)", { XX } },
9218 /* MOD_0FAE_REG_2 */
9219 { "ldmxcsr", { Md } },
9220 { "(bad)", { XX } },
9223 /* MOD_0FAE_REG_3 */
9224 { "stmxcsr", { Md } },
9225 { "(bad)", { XX } },
9228 /* MOD_0FAE_REG_4 */
9229 { "xsave", { M } },
9230 { "(bad)", { XX } },
9233 /* MOD_0FAE_REG_5 */
9234 { "xrstor", { M } },
9235 { RM_TABLE (RM_0FAE_REG_5) },
9238 /* MOD_0FAE_REG_6 */
9239 { "xsaveopt", { M } },
9240 { RM_TABLE (RM_0FAE_REG_6) },
9243 /* MOD_0FAE_REG_7 */
9244 { "clflush", { Mb } },
9245 { RM_TABLE (RM_0FAE_REG_7) },
9248 /* MOD_0FB2 */
9249 { "lssS", { Gv, Mp } },
9250 { "(bad)", { XX } },
9253 /* MOD_0FB4 */
9254 { "lfsS", { Gv, Mp } },
9255 { "(bad)", { XX } },
9258 /* MOD_0FB5 */
9259 { "lgsS", { Gv, Mp } },
9260 { "(bad)", { XX } },
9263 /* MOD_0FC7_REG_6 */
9264 { PREFIX_TABLE (PREFIX_0FC7_REG_6) },
9265 { "(bad)", { XX } },
9268 /* MOD_0FC7_REG_7 */
9269 { "vmptrst", { Mq } },
9270 { "(bad)", { XX } },
9273 /* MOD_0FD7 */
9274 { "(bad)", { XX } },
9275 { "pmovmskb", { Gdq, MS } },
9278 /* MOD_0FE7_PREFIX_2 */
9279 { "movntdq", { Mx, XM } },
9280 { "(bad)", { XX } },
9283 /* MOD_0FF0_PREFIX_3 */
9284 { "lddqu", { XM, M } },
9285 { "(bad)", { XX } },
9288 /* MOD_0F382A_PREFIX_2 */
9289 { "movntdqa", { XM, Mx } },
9290 { "(bad)", { XX } },
9293 /* MOD_62_32BIT */
9294 { "bound{S|}", { Gv, Ma } },
9295 { "(bad)", { XX } },
9298 /* MOD_C4_32BIT */
9299 { "lesS", { Gv, Mp } },
9300 { VEX_C4_TABLE (VEX_0F) },
9303 /* MOD_C5_32BIT */
9304 { "ldsS", { Gv, Mp } },
9305 { VEX_C5_TABLE (VEX_0F) },
9308 /* MOD_VEX_12_PREFIX_0 */
9309 { VEX_LEN_TABLE (VEX_LEN_12_P_0_M_0) },
9310 { VEX_LEN_TABLE (VEX_LEN_12_P_0_M_1) },
9313 /* MOD_VEX_13 */
9314 { VEX_LEN_TABLE (VEX_LEN_13_M_0) },
9315 { "(bad)", { XX } },
9318 /* MOD_VEX_16_PREFIX_0 */
9319 { VEX_LEN_TABLE (VEX_LEN_16_P_0_M_0) },
9320 { VEX_LEN_TABLE (VEX_LEN_16_P_0_M_1) },
9323 /* MOD_VEX_17 */
9324 { VEX_LEN_TABLE (VEX_LEN_17_M_0) },
9325 { "(bad)", { XX } },
9328 /* MOD_VEX_2B */
9329 { VEX_LEN_TABLE (VEX_LEN_2B_M_0) },
9330 { "(bad)", { XX } },
9333 /* MOD_VEX_51 */
9334 { "(bad)", { XX } },
9335 { "vmovmskpX", { Gdq, XS } },
9338 /* MOD_VEX_71_REG_2 */
9339 { "(bad)", { XX } },
9340 { PREFIX_TABLE (PREFIX_VEX_71_REG_2) },
9343 /* MOD_VEX_71_REG_4 */
9344 { "(bad)", { XX } },
9345 { PREFIX_TABLE (PREFIX_VEX_71_REG_4) },
9348 /* MOD_VEX_71_REG_6 */
9349 { "(bad)", { XX } },
9350 { PREFIX_TABLE (PREFIX_VEX_71_REG_6) },
9353 /* MOD_VEX_72_REG_2 */
9354 { "(bad)", { XX } },
9355 { PREFIX_TABLE (PREFIX_VEX_72_REG_2) },
9358 /* MOD_VEX_72_REG_4 */
9359 { "(bad)", { XX } },
9360 { PREFIX_TABLE (PREFIX_VEX_72_REG_4) },
9363 /* MOD_VEX_72_REG_6 */
9364 { "(bad)", { XX } },
9365 { PREFIX_TABLE (PREFIX_VEX_72_REG_6) },
9368 /* MOD_VEX_73_REG_2 */
9369 { "(bad)", { XX } },
9370 { PREFIX_TABLE (PREFIX_VEX_73_REG_2) },
9373 /* MOD_VEX_73_REG_3 */
9374 { "(bad)", { XX } },
9375 { PREFIX_TABLE (PREFIX_VEX_73_REG_3) },
9378 /* MOD_VEX_73_REG_6 */
9379 { "(bad)", { XX } },
9380 { PREFIX_TABLE (PREFIX_VEX_73_REG_6) },
9383 /* MOD_VEX_73_REG_7 */
9384 { "(bad)", { XX } },
9385 { PREFIX_TABLE (PREFIX_VEX_73_REG_7) },
9388 /* MOD_VEX_AE_REG_2 */
9389 { VEX_LEN_TABLE (VEX_LEN_AE_R_2_M_0) },
9390 { "(bad)", { XX } },
9393 /* MOD_VEX_AE_REG_3 */
9394 { VEX_LEN_TABLE (VEX_LEN_AE_R_3_M_0) },
9395 { "(bad)", { XX } },
9398 /* MOD_VEX_D7_PREFIX_2 */
9399 { "(bad)", { XX } },
9400 { VEX_LEN_TABLE (VEX_LEN_D7_P_2_M_1) },
9403 /* MOD_VEX_E7_PREFIX_2 */
9404 { VEX_LEN_TABLE (VEX_LEN_E7_P_2_M_0) },
9405 { "(bad)", { XX } },
9408 /* MOD_VEX_F0_PREFIX_3 */
9409 { "vlddqu", { XM, M } },
9410 { "(bad)", { XX } },
9413 /* MOD_VEX_3818_PREFIX_2 */
9414 { "vbroadcastss", { XM, Md } },
9415 { "(bad)", { XX } },
9418 /* MOD_VEX_3819_PREFIX_2 */
9419 { VEX_LEN_TABLE (VEX_LEN_3819_P_2_M_0) },
9420 { "(bad)", { XX } },
9423 /* MOD_VEX_381A_PREFIX_2 */
9424 { VEX_LEN_TABLE (VEX_LEN_381A_P_2_M_0) },
9425 { "(bad)", { XX } },
9428 /* MOD_VEX_382A_PREFIX_2 */
9429 { VEX_LEN_TABLE (VEX_LEN_382A_P_2_M_0) },
9430 { "(bad)", { XX } },
9433 /* MOD_VEX_382C_PREFIX_2 */
9434 { "vmaskmovps", { XM, Vex, Mx } },
9435 { "(bad)", { XX } },
9438 /* MOD_VEX_382D_PREFIX_2 */
9439 { "vmaskmovpd", { XM, Vex, Mx } },
9440 { "(bad)", { XX } },
9443 /* MOD_VEX_382E_PREFIX_2 */
9444 { "vmaskmovps", { Mx, Vex, XM } },
9445 { "(bad)", { XX } },
9448 /* MOD_VEX_382F_PREFIX_2 */
9449 { "vmaskmovpd", { Mx, Vex, XM } },
9450 { "(bad)", { XX } },
9454 static const struct dis386 rm_table[][8] = {
9456 /* RM_0F01_REG_0 */
9457 { "(bad)", { XX } },
9458 { "vmcall", { Skip_MODRM } },
9459 { "vmlaunch", { Skip_MODRM } },
9460 { "vmresume", { Skip_MODRM } },
9461 { "vmxoff", { Skip_MODRM } },
9462 { "(bad)", { XX } },
9463 { "(bad)", { XX } },
9464 { "(bad)", { XX } },
9467 /* RM_0F01_REG_1 */
9468 { "monitor", { { OP_Monitor, 0 } } },
9469 { "mwait", { { OP_Mwait, 0 } } },
9470 { "(bad)", { XX } },
9471 { "(bad)", { XX } },
9472 { "(bad)", { XX } },
9473 { "(bad)", { XX } },
9474 { "(bad)", { XX } },
9475 { "(bad)", { XX } },
9478 /* RM_0F01_REG_2 */
9479 { "xgetbv", { Skip_MODRM } },
9480 { "xsetbv", { Skip_MODRM } },
9481 { "(bad)", { XX } },
9482 { "(bad)", { XX } },
9483 { "(bad)", { XX } },
9484 { "(bad)", { XX } },
9485 { "(bad)", { XX } },
9486 { "(bad)", { XX } },
9489 /* RM_0F01_REG_3 */
9490 { "vmrun", { Skip_MODRM } },
9491 { "vmmcall", { Skip_MODRM } },
9492 { "vmload", { Skip_MODRM } },
9493 { "vmsave", { Skip_MODRM } },
9494 { "stgi", { Skip_MODRM } },
9495 { "clgi", { Skip_MODRM } },
9496 { "skinit", { Skip_MODRM } },
9497 { "invlpga", { Skip_MODRM } },
9500 /* RM_0F01_REG_7 */
9501 { "swapgs", { Skip_MODRM } },
9502 { "rdtscp", { Skip_MODRM } },
9503 { "(bad)", { XX } },
9504 { "(bad)", { XX } },
9505 { "(bad)", { XX } },
9506 { "(bad)", { XX } },
9507 { "(bad)", { XX } },
9508 { "(bad)", { XX } },
9511 /* RM_0FAE_REG_5 */
9512 { "lfence", { Skip_MODRM } },
9513 { "(bad)", { XX } },
9514 { "(bad)", { XX } },
9515 { "(bad)", { XX } },
9516 { "(bad)", { XX } },
9517 { "(bad)", { XX } },
9518 { "(bad)", { XX } },
9519 { "(bad)", { XX } },
9522 /* RM_0FAE_REG_6 */
9523 { "mfence", { Skip_MODRM } },
9524 { "(bad)", { XX } },
9525 { "(bad)", { XX } },
9526 { "(bad)", { XX } },
9527 { "(bad)", { XX } },
9528 { "(bad)", { XX } },
9529 { "(bad)", { XX } },
9530 { "(bad)", { XX } },
9533 /* RM_0FAE_REG_7 */
9534 { "sfence", { Skip_MODRM } },
9535 { "(bad)", { XX } },
9536 { "(bad)", { XX } },
9537 { "(bad)", { XX } },
9538 { "(bad)", { XX } },
9539 { "(bad)", { XX } },
9540 { "(bad)", { XX } },
9541 { "(bad)", { XX } },
9545 #define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
9547 static void
9548 ckprefix (void)
9550 int newrex;
9551 rex = 0;
9552 rex_original = 0;
9553 rex_ignored = 0;
9554 prefixes = 0;
9555 used_prefixes = 0;
9556 rex_used = 0;
9557 while (1)
9559 FETCH_DATA (the_info, codep + 1);
9560 newrex = 0;
9561 switch (*codep)
9563 /* REX prefixes family. */
9564 case 0x40:
9565 case 0x41:
9566 case 0x42:
9567 case 0x43:
9568 case 0x44:
9569 case 0x45:
9570 case 0x46:
9571 case 0x47:
9572 case 0x48:
9573 case 0x49:
9574 case 0x4a:
9575 case 0x4b:
9576 case 0x4c:
9577 case 0x4d:
9578 case 0x4e:
9579 case 0x4f:
9580 if (address_mode == mode_64bit)
9581 newrex = *codep;
9582 else
9583 return;
9584 break;
9585 case 0xf3:
9586 prefixes |= PREFIX_REPZ;
9587 break;
9588 case 0xf2:
9589 prefixes |= PREFIX_REPNZ;
9590 break;
9591 case 0xf0:
9592 prefixes |= PREFIX_LOCK;
9593 break;
9594 case 0x2e:
9595 prefixes |= PREFIX_CS;
9596 break;
9597 case 0x36:
9598 prefixes |= PREFIX_SS;
9599 break;
9600 case 0x3e:
9601 prefixes |= PREFIX_DS;
9602 break;
9603 case 0x26:
9604 prefixes |= PREFIX_ES;
9605 break;
9606 case 0x64:
9607 prefixes |= PREFIX_FS;
9608 break;
9609 case 0x65:
9610 prefixes |= PREFIX_GS;
9611 break;
9612 case 0x66:
9613 prefixes |= PREFIX_DATA;
9614 break;
9615 case 0x67:
9616 prefixes |= PREFIX_ADDR;
9617 break;
9618 case FWAIT_OPCODE:
9619 /* fwait is really an instruction. If there are prefixes
9620 before the fwait, they belong to the fwait, *not* to the
9621 following instruction. */
9622 if (prefixes || rex)
9624 prefixes |= PREFIX_FWAIT;
9625 codep++;
9626 return;
9628 prefixes = PREFIX_FWAIT;
9629 break;
9630 default:
9631 return;
9633 /* Rex is ignored when followed by another prefix. */
9634 if (rex)
9636 rex_used = rex;
9637 return;
9639 rex = newrex;
9640 rex_original = rex;
9641 codep++;
9645 /* Return the name of the prefix byte PREF, or NULL if PREF is not a
9646 prefix byte. */
9648 static const char *
9649 prefix_name (int pref, int sizeflag)
9651 static const char *rexes [16] =
9653 "rex", /* 0x40 */
9654 "rex.B", /* 0x41 */
9655 "rex.X", /* 0x42 */
9656 "rex.XB", /* 0x43 */
9657 "rex.R", /* 0x44 */
9658 "rex.RB", /* 0x45 */
9659 "rex.RX", /* 0x46 */
9660 "rex.RXB", /* 0x47 */
9661 "rex.W", /* 0x48 */
9662 "rex.WB", /* 0x49 */
9663 "rex.WX", /* 0x4a */
9664 "rex.WXB", /* 0x4b */
9665 "rex.WR", /* 0x4c */
9666 "rex.WRB", /* 0x4d */
9667 "rex.WRX", /* 0x4e */
9668 "rex.WRXB", /* 0x4f */
9671 switch (pref)
9673 /* REX prefixes family. */
9674 case 0x40:
9675 case 0x41:
9676 case 0x42:
9677 case 0x43:
9678 case 0x44:
9679 case 0x45:
9680 case 0x46:
9681 case 0x47:
9682 case 0x48:
9683 case 0x49:
9684 case 0x4a:
9685 case 0x4b:
9686 case 0x4c:
9687 case 0x4d:
9688 case 0x4e:
9689 case 0x4f:
9690 return rexes [pref - 0x40];
9691 case 0xf3:
9692 return "repz";
9693 case 0xf2:
9694 return "repnz";
9695 case 0xf0:
9696 return "lock";
9697 case 0x2e:
9698 return "cs";
9699 case 0x36:
9700 return "ss";
9701 case 0x3e:
9702 return "ds";
9703 case 0x26:
9704 return "es";
9705 case 0x64:
9706 return "fs";
9707 case 0x65:
9708 return "gs";
9709 case 0x66:
9710 return (sizeflag & DFLAG) ? "data16" : "data32";
9711 case 0x67:
9712 if (address_mode == mode_64bit)
9713 return (sizeflag & AFLAG) ? "addr32" : "addr64";
9714 else
9715 return (sizeflag & AFLAG) ? "addr16" : "addr32";
9716 case FWAIT_OPCODE:
9717 return "fwait";
9718 default:
9719 return NULL;
9723 static char op_out[MAX_OPERANDS][100];
9724 static int op_ad, op_index[MAX_OPERANDS];
9725 static int two_source_ops;
9726 static bfd_vma op_address[MAX_OPERANDS];
9727 static bfd_vma op_riprel[MAX_OPERANDS];
9728 static bfd_vma start_pc;
9731 * On the 386's of 1988, the maximum length of an instruction is 15 bytes.
9732 * (see topic "Redundant prefixes" in the "Differences from 8086"
9733 * section of the "Virtual 8086 Mode" chapter.)
9734 * 'pc' should be the address of this instruction, it will
9735 * be used to print the target address if this is a relative jump or call
9736 * The function returns the length of this instruction in bytes.
9739 static char intel_syntax;
9740 static char intel_mnemonic = !SYSV386_COMPAT;
9741 static char open_char;
9742 static char close_char;
9743 static char separator_char;
9744 static char scale_char;
9746 /* Here for backwards compatibility. When gdb stops using
9747 print_insn_i386_att and print_insn_i386_intel these functions can
9748 disappear, and print_insn_i386 be merged into print_insn. */
9750 print_insn_i386_att (bfd_vma pc, disassemble_info *info)
9752 intel_syntax = 0;
9754 return print_insn (pc, info);
9758 print_insn_i386_intel (bfd_vma pc, disassemble_info *info)
9760 intel_syntax = 1;
9762 return print_insn (pc, info);
9766 print_insn_i386 (bfd_vma pc, disassemble_info *info)
9768 intel_syntax = -1;
9770 return print_insn (pc, info);
9773 void
9774 print_i386_disassembler_options (FILE *stream)
9776 fprintf (stream, _("\n\
9777 The following i386/x86-64 specific disassembler options are supported for use\n\
9778 with the -M switch (multiple options should be separated by commas):\n"));
9780 fprintf (stream, _(" x86-64 Disassemble in 64bit mode\n"));
9781 fprintf (stream, _(" i386 Disassemble in 32bit mode\n"));
9782 fprintf (stream, _(" i8086 Disassemble in 16bit mode\n"));
9783 fprintf (stream, _(" att Display instruction in AT&T syntax\n"));
9784 fprintf (stream, _(" intel Display instruction in Intel syntax\n"));
9785 fprintf (stream, _(" att-mnemonic\n"
9786 " Display instruction in AT&T mnemonic\n"));
9787 fprintf (stream, _(" intel-mnemonic\n"
9788 " Display instruction in Intel mnemonic\n"));
9789 fprintf (stream, _(" addr64 Assume 64bit address size\n"));
9790 fprintf (stream, _(" addr32 Assume 32bit address size\n"));
9791 fprintf (stream, _(" addr16 Assume 16bit address size\n"));
9792 fprintf (stream, _(" data32 Assume 32bit data size\n"));
9793 fprintf (stream, _(" data16 Assume 16bit data size\n"));
9794 fprintf (stream, _(" suffix Always display instruction suffix in AT&T syntax\n"));
9797 /* Get a pointer to struct dis386 with a valid name. */
9799 static const struct dis386 *
9800 get_valid_dis386 (const struct dis386 *dp, disassemble_info *info)
9802 int index, vex_table_index;
9804 if (dp->name != NULL)
9805 return dp;
9807 switch (dp->op[0].bytemode)
9809 case USE_REG_TABLE:
9810 dp = &reg_table[dp->op[1].bytemode][modrm.reg];
9811 break;
9813 case USE_MOD_TABLE:
9814 index = modrm.mod == 0x3 ? 1 : 0;
9815 dp = &mod_table[dp->op[1].bytemode][index];
9816 break;
9818 case USE_RM_TABLE:
9819 dp = &rm_table[dp->op[1].bytemode][modrm.rm];
9820 break;
9822 case USE_PREFIX_TABLE:
9823 if (need_vex)
9825 /* The prefix in VEX is implicit. */
9826 switch (vex.prefix)
9828 case 0:
9829 index = 0;
9830 break;
9831 case REPE_PREFIX_OPCODE:
9832 index = 1;
9833 break;
9834 case DATA_PREFIX_OPCODE:
9835 index = 2;
9836 break;
9837 case REPNE_PREFIX_OPCODE:
9838 index = 3;
9839 break;
9840 default:
9841 abort ();
9842 break;
9845 else
9847 index = 0;
9848 used_prefixes |= (prefixes & PREFIX_REPZ);
9849 if (prefixes & PREFIX_REPZ)
9851 index = 1;
9852 repz_prefix = NULL;
9854 else
9856 /* We should check PREFIX_REPNZ and PREFIX_REPZ before
9857 PREFIX_DATA. */
9858 used_prefixes |= (prefixes & PREFIX_REPNZ);
9859 if (prefixes & PREFIX_REPNZ)
9861 index = 3;
9862 repnz_prefix = NULL;
9864 else
9866 used_prefixes |= (prefixes & PREFIX_DATA);
9867 if (prefixes & PREFIX_DATA)
9869 index = 2;
9870 data_prefix = NULL;
9875 dp = &prefix_table[dp->op[1].bytemode][index];
9876 break;
9878 case USE_X86_64_TABLE:
9879 index = address_mode == mode_64bit ? 1 : 0;
9880 dp = &x86_64_table[dp->op[1].bytemode][index];
9881 break;
9883 case USE_3BYTE_TABLE:
9884 FETCH_DATA (info, codep + 2);
9885 index = *codep++;
9886 dp = &three_byte_table[dp->op[1].bytemode][index];
9887 modrm.mod = (*codep >> 6) & 3;
9888 modrm.reg = (*codep >> 3) & 7;
9889 modrm.rm = *codep & 7;
9890 break;
9892 case USE_VEX_LEN_TABLE:
9893 if (!need_vex)
9894 abort ();
9896 switch (vex.length)
9898 case 128:
9899 index = 0;
9900 break;
9901 case 256:
9902 index = 1;
9903 break;
9904 default:
9905 abort ();
9906 break;
9909 dp = &vex_len_table[dp->op[1].bytemode][index];
9910 break;
9912 case USE_VEX_C4_TABLE:
9913 FETCH_DATA (info, codep + 3);
9914 /* All bits in the REX prefix are ignored. */
9915 rex_ignored = rex;
9916 rex = ~(*codep >> 5) & 0x7;
9917 switch ((*codep & 0x1f))
9919 default:
9920 BadOp ();
9921 case 0x1:
9922 vex_table_index = 0;
9923 break;
9924 case 0x2:
9925 vex_table_index = 1;
9926 break;
9927 case 0x3:
9928 vex_table_index = 2;
9929 break;
9931 codep++;
9932 vex.w = *codep & 0x80;
9933 if (vex.w && address_mode == mode_64bit)
9934 rex |= REX_W;
9936 vex.register_specifier = (~(*codep >> 3)) & 0xf;
9937 if (address_mode != mode_64bit
9938 && vex.register_specifier > 0x7)
9939 BadOp ();
9941 vex.length = (*codep & 0x4) ? 256 : 128;
9942 switch ((*codep & 0x3))
9944 case 0:
9945 vex.prefix = 0;
9946 break;
9947 case 1:
9948 vex.prefix = DATA_PREFIX_OPCODE;
9949 break;
9950 case 2:
9951 vex.prefix = REPE_PREFIX_OPCODE;
9952 break;
9953 case 3:
9954 vex.prefix = REPNE_PREFIX_OPCODE;
9955 break;
9957 need_vex = 1;
9958 need_vex_reg = 1;
9959 codep++;
9960 index = *codep++;
9961 dp = &vex_table[vex_table_index][index];
9962 /* There is no MODRM byte for VEX [82|77]. */
9963 if (index != 0x77 && index != 0x82)
9965 FETCH_DATA (info, codep + 1);
9966 modrm.mod = (*codep >> 6) & 3;
9967 modrm.reg = (*codep >> 3) & 7;
9968 modrm.rm = *codep & 7;
9970 break;
9972 case USE_VEX_C5_TABLE:
9973 FETCH_DATA (info, codep + 2);
9974 /* All bits in the REX prefix are ignored. */
9975 rex_ignored = rex;
9976 rex = (*codep & 0x80) ? 0 : REX_R;
9978 vex.register_specifier = (~(*codep >> 3)) & 0xf;
9979 if (address_mode != mode_64bit
9980 && vex.register_specifier > 0x7)
9981 BadOp ();
9983 vex.length = (*codep & 0x4) ? 256 : 128;
9984 switch ((*codep & 0x3))
9986 case 0:
9987 vex.prefix = 0;
9988 break;
9989 case 1:
9990 vex.prefix = DATA_PREFIX_OPCODE;
9991 break;
9992 case 2:
9993 vex.prefix = REPE_PREFIX_OPCODE;
9994 break;
9995 case 3:
9996 vex.prefix = REPNE_PREFIX_OPCODE;
9997 break;
9999 need_vex = 1;
10000 need_vex_reg = 1;
10001 codep++;
10002 index = *codep++;
10003 dp = &vex_table[dp->op[1].bytemode][index];
10004 /* There is no MODRM byte for VEX [82|77]. */
10005 if (index != 0x77 && index != 0x82)
10007 FETCH_DATA (info, codep + 1);
10008 modrm.mod = (*codep >> 6) & 3;
10009 modrm.reg = (*codep >> 3) & 7;
10010 modrm.rm = *codep & 7;
10012 break;
10014 default:
10015 oappend (INTERNAL_DISASSEMBLER_ERROR);
10016 return NULL;
10019 if (dp->name != NULL)
10020 return dp;
10021 else
10022 return get_valid_dis386 (dp, info);
10025 static int
10026 print_insn (bfd_vma pc, disassemble_info *info)
10028 const struct dis386 *dp;
10029 int i;
10030 char *op_txt[MAX_OPERANDS];
10031 int needcomma;
10032 int sizeflag;
10033 const char *p;
10034 struct dis_private priv;
10035 unsigned char op;
10036 char prefix_obuf[32];
10037 char *prefix_obufp;
10039 if (info->mach == bfd_mach_x86_64_intel_syntax
10040 || info->mach == bfd_mach_x86_64)
10041 address_mode = mode_64bit;
10042 else
10043 address_mode = mode_32bit;
10045 if (intel_syntax == (char) -1)
10046 intel_syntax = (info->mach == bfd_mach_i386_i386_intel_syntax
10047 || info->mach == bfd_mach_x86_64_intel_syntax);
10049 if (info->mach == bfd_mach_i386_i386
10050 || info->mach == bfd_mach_x86_64
10051 || info->mach == bfd_mach_i386_i386_intel_syntax
10052 || info->mach == bfd_mach_x86_64_intel_syntax)
10053 priv.orig_sizeflag = AFLAG | DFLAG;
10054 else if (info->mach == bfd_mach_i386_i8086)
10055 priv.orig_sizeflag = 0;
10056 else
10057 abort ();
10059 for (p = info->disassembler_options; p != NULL; )
10061 if (CONST_STRNEQ (p, "x86-64"))
10063 address_mode = mode_64bit;
10064 priv.orig_sizeflag = AFLAG | DFLAG;
10066 else if (CONST_STRNEQ (p, "i386"))
10068 address_mode = mode_32bit;
10069 priv.orig_sizeflag = AFLAG | DFLAG;
10071 else if (CONST_STRNEQ (p, "i8086"))
10073 address_mode = mode_16bit;
10074 priv.orig_sizeflag = 0;
10076 else if (CONST_STRNEQ (p, "intel"))
10078 intel_syntax = 1;
10079 if (CONST_STRNEQ (p + 5, "-mnemonic"))
10080 intel_mnemonic = 1;
10082 else if (CONST_STRNEQ (p, "att"))
10084 intel_syntax = 0;
10085 if (CONST_STRNEQ (p + 3, "-mnemonic"))
10086 intel_mnemonic = 0;
10088 else if (CONST_STRNEQ (p, "addr"))
10090 if (address_mode == mode_64bit)
10092 if (p[4] == '3' && p[5] == '2')
10093 priv.orig_sizeflag &= ~AFLAG;
10094 else if (p[4] == '6' && p[5] == '4')
10095 priv.orig_sizeflag |= AFLAG;
10097 else
10099 if (p[4] == '1' && p[5] == '6')
10100 priv.orig_sizeflag &= ~AFLAG;
10101 else if (p[4] == '3' && p[5] == '2')
10102 priv.orig_sizeflag |= AFLAG;
10105 else if (CONST_STRNEQ (p, "data"))
10107 if (p[4] == '1' && p[5] == '6')
10108 priv.orig_sizeflag &= ~DFLAG;
10109 else if (p[4] == '3' && p[5] == '2')
10110 priv.orig_sizeflag |= DFLAG;
10112 else if (CONST_STRNEQ (p, "suffix"))
10113 priv.orig_sizeflag |= SUFFIX_ALWAYS;
10115 p = strchr (p, ',');
10116 if (p != NULL)
10117 p++;
10120 if (intel_syntax)
10122 names64 = intel_names64;
10123 names32 = intel_names32;
10124 names16 = intel_names16;
10125 names8 = intel_names8;
10126 names8rex = intel_names8rex;
10127 names_seg = intel_names_seg;
10128 index64 = intel_index64;
10129 index32 = intel_index32;
10130 index16 = intel_index16;
10131 open_char = '[';
10132 close_char = ']';
10133 separator_char = '+';
10134 scale_char = '*';
10136 else
10138 names64 = att_names64;
10139 names32 = att_names32;
10140 names16 = att_names16;
10141 names8 = att_names8;
10142 names8rex = att_names8rex;
10143 names_seg = att_names_seg;
10144 index64 = att_index64;
10145 index32 = att_index32;
10146 index16 = att_index16;
10147 open_char = '(';
10148 close_char = ')';
10149 separator_char = ',';
10150 scale_char = ',';
10153 /* The output looks better if we put 7 bytes on a line, since that
10154 puts most long word instructions on a single line. */
10155 info->bytes_per_line = 7;
10157 info->private_data = &priv;
10158 priv.max_fetched = priv.the_buffer;
10159 priv.insn_start = pc;
10161 obuf[0] = 0;
10162 for (i = 0; i < MAX_OPERANDS; ++i)
10164 op_out[i][0] = 0;
10165 op_index[i] = -1;
10168 the_info = info;
10169 start_pc = pc;
10170 start_codep = priv.the_buffer;
10171 codep = priv.the_buffer;
10173 if (setjmp (priv.bailout) != 0)
10175 const char *name;
10177 /* Getting here means we tried for data but didn't get it. That
10178 means we have an incomplete instruction of some sort. Just
10179 print the first byte as a prefix or a .byte pseudo-op. */
10180 if (codep > priv.the_buffer)
10182 name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
10183 if (name != NULL)
10184 (*info->fprintf_func) (info->stream, "%s", name);
10185 else
10187 /* Just print the first byte as a .byte instruction. */
10188 (*info->fprintf_func) (info->stream, ".byte 0x%x",
10189 (unsigned int) priv.the_buffer[0]);
10192 return 1;
10195 return -1;
10198 obufp = obuf;
10199 ckprefix ();
10201 insn_codep = codep;
10202 sizeflag = priv.orig_sizeflag;
10204 FETCH_DATA (info, codep + 1);
10205 two_source_ops = (*codep == 0x62) || (*codep == 0xc8);
10207 if (((prefixes & PREFIX_FWAIT)
10208 && ((*codep < 0xd8) || (*codep > 0xdf)))
10209 || (rex && rex_used))
10211 const char *name;
10213 /* fwait not followed by floating point instruction, or rex followed
10214 by other prefixes. Print the first prefix. */
10215 name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
10216 if (name == NULL)
10217 name = INTERNAL_DISASSEMBLER_ERROR;
10218 (*info->fprintf_func) (info->stream, "%s", name);
10219 return 1;
10222 op = 0;
10223 if (*codep == 0x0f)
10225 unsigned char threebyte;
10226 FETCH_DATA (info, codep + 2);
10227 threebyte = *++codep;
10228 dp = &dis386_twobyte[threebyte];
10229 need_modrm = twobyte_has_modrm[*codep];
10230 codep++;
10232 else
10234 dp = &dis386[*codep];
10235 need_modrm = onebyte_has_modrm[*codep];
10236 codep++;
10239 if ((prefixes & PREFIX_REPZ))
10241 repz_prefix = "repz ";
10242 used_prefixes |= PREFIX_REPZ;
10244 else
10245 repz_prefix = NULL;
10247 if ((prefixes & PREFIX_REPNZ))
10249 repnz_prefix = "repnz ";
10250 used_prefixes |= PREFIX_REPNZ;
10252 else
10253 repnz_prefix = NULL;
10255 if ((prefixes & PREFIX_LOCK))
10257 lock_prefix = "lock ";
10258 used_prefixes |= PREFIX_LOCK;
10260 else
10261 lock_prefix = NULL;
10263 addr_prefix = NULL;
10264 if (prefixes & PREFIX_ADDR)
10266 sizeflag ^= AFLAG;
10267 if (dp->op[2].bytemode != loop_jcxz_mode || intel_syntax)
10269 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
10270 addr_prefix = "addr32 ";
10271 else
10272 addr_prefix = "addr16 ";
10273 used_prefixes |= PREFIX_ADDR;
10277 data_prefix = NULL;
10278 if ((prefixes & PREFIX_DATA))
10280 sizeflag ^= DFLAG;
10281 if (dp->op[2].bytemode == cond_jump_mode
10282 && dp->op[0].bytemode == v_mode
10283 && !intel_syntax)
10285 if (sizeflag & DFLAG)
10286 data_prefix = "data32 ";
10287 else
10288 data_prefix = "data16 ";
10289 used_prefixes |= PREFIX_DATA;
10293 if (need_modrm)
10295 FETCH_DATA (info, codep + 1);
10296 modrm.mod = (*codep >> 6) & 3;
10297 modrm.reg = (*codep >> 3) & 7;
10298 modrm.rm = *codep & 7;
10301 if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE)
10303 dofloat (sizeflag);
10305 else
10307 need_vex = 0;
10308 need_vex_reg = 0;
10309 vex_w_done = 0;
10310 dp = get_valid_dis386 (dp, info);
10311 if (dp != NULL && putop (dp->name, sizeflag) == 0)
10313 for (i = 0; i < MAX_OPERANDS; ++i)
10315 obufp = op_out[i];
10316 op_ad = MAX_OPERANDS - 1 - i;
10317 if (dp->op[i].rtn)
10318 (*dp->op[i].rtn) (dp->op[i].bytemode, sizeflag);
10323 /* See if any prefixes were not used. If so, print the first one
10324 separately. If we don't do this, we'll wind up printing an
10325 instruction stream which does not precisely correspond to the
10326 bytes we are disassembling. */
10327 if ((prefixes & ~used_prefixes) != 0)
10329 const char *name;
10331 name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
10332 if (name == NULL)
10333 name = INTERNAL_DISASSEMBLER_ERROR;
10334 (*info->fprintf_func) (info->stream, "%s", name);
10335 return 1;
10337 if ((rex_original & ~rex_used) || rex_ignored)
10339 const char *name;
10340 name = prefix_name (rex_original, priv.orig_sizeflag);
10341 if (name == NULL)
10342 name = INTERNAL_DISASSEMBLER_ERROR;
10343 (*info->fprintf_func) (info->stream, "%s ", name);
10346 prefix_obuf[0] = 0;
10347 prefix_obufp = prefix_obuf;
10348 if (lock_prefix)
10349 prefix_obufp = stpcpy (prefix_obufp, lock_prefix);
10350 if (repz_prefix)
10351 prefix_obufp = stpcpy (prefix_obufp, repz_prefix);
10352 if (repnz_prefix)
10353 prefix_obufp = stpcpy (prefix_obufp, repnz_prefix);
10354 if (addr_prefix)
10355 prefix_obufp = stpcpy (prefix_obufp, addr_prefix);
10356 if (data_prefix)
10357 prefix_obufp = stpcpy (prefix_obufp, data_prefix);
10359 if (prefix_obuf[0] != 0)
10360 (*info->fprintf_func) (info->stream, "%s", prefix_obuf);
10362 obufp = obuf + strlen (obuf);
10363 for (i = strlen (obuf) + strlen (prefix_obuf); i < 6; i++)
10364 oappend (" ");
10365 oappend (" ");
10366 (*info->fprintf_func) (info->stream, "%s", obuf);
10368 /* The enter and bound instructions are printed with operands in the same
10369 order as the intel book; everything else is printed in reverse order. */
10370 if (intel_syntax || two_source_ops)
10372 bfd_vma riprel;
10374 for (i = 0; i < MAX_OPERANDS; ++i)
10375 op_txt[i] = op_out[i];
10377 for (i = 0; i < (MAX_OPERANDS >> 1); ++i)
10379 op_ad = op_index[i];
10380 op_index[i] = op_index[MAX_OPERANDS - 1 - i];
10381 op_index[MAX_OPERANDS - 1 - i] = op_ad;
10382 riprel = op_riprel[i];
10383 op_riprel[i] = op_riprel [MAX_OPERANDS - 1 - i];
10384 op_riprel[MAX_OPERANDS - 1 - i] = riprel;
10387 else
10389 for (i = 0; i < MAX_OPERANDS; ++i)
10390 op_txt[MAX_OPERANDS - 1 - i] = op_out[i];
10393 needcomma = 0;
10394 for (i = 0; i < MAX_OPERANDS; ++i)
10395 if (*op_txt[i])
10397 if (needcomma)
10398 (*info->fprintf_func) (info->stream, ",");
10399 if (op_index[i] != -1 && !op_riprel[i])
10400 (*info->print_address_func) ((bfd_vma) op_address[op_index[i]], info);
10401 else
10402 (*info->fprintf_func) (info->stream, "%s", op_txt[i]);
10403 needcomma = 1;
10406 for (i = 0; i < MAX_OPERANDS; i++)
10407 if (op_index[i] != -1 && op_riprel[i])
10409 (*info->fprintf_func) (info->stream, " # ");
10410 (*info->print_address_func) ((bfd_vma) (start_pc + codep - start_codep
10411 + op_address[op_index[i]]), info);
10412 break;
10414 return codep - priv.the_buffer;
10417 static const char *float_mem[] = {
10418 /* d8 */
10419 "fadd{s|}",
10420 "fmul{s|}",
10421 "fcom{s|}",
10422 "fcomp{s|}",
10423 "fsub{s|}",
10424 "fsubr{s|}",
10425 "fdiv{s|}",
10426 "fdivr{s|}",
10427 /* d9 */
10428 "fld{s|}",
10429 "(bad)",
10430 "fst{s|}",
10431 "fstp{s|}",
10432 "fldenvIC",
10433 "fldcw",
10434 "fNstenvIC",
10435 "fNstcw",
10436 /* da */
10437 "fiadd{l|}",
10438 "fimul{l|}",
10439 "ficom{l|}",
10440 "ficomp{l|}",
10441 "fisub{l|}",
10442 "fisubr{l|}",
10443 "fidiv{l|}",
10444 "fidivr{l|}",
10445 /* db */
10446 "fild{l|}",
10447 "fisttp{l|}",
10448 "fist{l|}",
10449 "fistp{l|}",
10450 "(bad)",
10451 "fld{t||t|}",
10452 "(bad)",
10453 "fstp{t||t|}",
10454 /* dc */
10455 "fadd{l|}",
10456 "fmul{l|}",
10457 "fcom{l|}",
10458 "fcomp{l|}",
10459 "fsub{l|}",
10460 "fsubr{l|}",
10461 "fdiv{l|}",
10462 "fdivr{l|}",
10463 /* dd */
10464 "fld{l|}",
10465 "fisttp{ll|}",
10466 "fst{l||}",
10467 "fstp{l|}",
10468 "frstorIC",
10469 "(bad)",
10470 "fNsaveIC",
10471 "fNstsw",
10472 /* de */
10473 "fiadd",
10474 "fimul",
10475 "ficom",
10476 "ficomp",
10477 "fisub",
10478 "fisubr",
10479 "fidiv",
10480 "fidivr",
10481 /* df */
10482 "fild",
10483 "fisttp",
10484 "fist",
10485 "fistp",
10486 "fbld",
10487 "fild{ll|}",
10488 "fbstp",
10489 "fistp{ll|}",
10492 static const unsigned char float_mem_mode[] = {
10493 /* d8 */
10494 d_mode,
10495 d_mode,
10496 d_mode,
10497 d_mode,
10498 d_mode,
10499 d_mode,
10500 d_mode,
10501 d_mode,
10502 /* d9 */
10503 d_mode,
10505 d_mode,
10506 d_mode,
10508 w_mode,
10510 w_mode,
10511 /* da */
10512 d_mode,
10513 d_mode,
10514 d_mode,
10515 d_mode,
10516 d_mode,
10517 d_mode,
10518 d_mode,
10519 d_mode,
10520 /* db */
10521 d_mode,
10522 d_mode,
10523 d_mode,
10524 d_mode,
10526 t_mode,
10528 t_mode,
10529 /* dc */
10530 q_mode,
10531 q_mode,
10532 q_mode,
10533 q_mode,
10534 q_mode,
10535 q_mode,
10536 q_mode,
10537 q_mode,
10538 /* dd */
10539 q_mode,
10540 q_mode,
10541 q_mode,
10542 q_mode,
10546 w_mode,
10547 /* de */
10548 w_mode,
10549 w_mode,
10550 w_mode,
10551 w_mode,
10552 w_mode,
10553 w_mode,
10554 w_mode,
10555 w_mode,
10556 /* df */
10557 w_mode,
10558 w_mode,
10559 w_mode,
10560 w_mode,
10561 t_mode,
10562 q_mode,
10563 t_mode,
10564 q_mode
10567 #define ST { OP_ST, 0 }
10568 #define STi { OP_STi, 0 }
10570 #define FGRPd9_2 NULL, { { NULL, 0 } }
10571 #define FGRPd9_4 NULL, { { NULL, 1 } }
10572 #define FGRPd9_5 NULL, { { NULL, 2 } }
10573 #define FGRPd9_6 NULL, { { NULL, 3 } }
10574 #define FGRPd9_7 NULL, { { NULL, 4 } }
10575 #define FGRPda_5 NULL, { { NULL, 5 } }
10576 #define FGRPdb_4 NULL, { { NULL, 6 } }
10577 #define FGRPde_3 NULL, { { NULL, 7 } }
10578 #define FGRPdf_4 NULL, { { NULL, 8 } }
10580 static const struct dis386 float_reg[][8] = {
10581 /* d8 */
10583 { "fadd", { ST, STi } },
10584 { "fmul", { ST, STi } },
10585 { "fcom", { STi } },
10586 { "fcomp", { STi } },
10587 { "fsub", { ST, STi } },
10588 { "fsubr", { ST, STi } },
10589 { "fdiv", { ST, STi } },
10590 { "fdivr", { ST, STi } },
10592 /* d9 */
10594 { "fld", { STi } },
10595 { "fxch", { STi } },
10596 { FGRPd9_2 },
10597 { "(bad)", { XX } },
10598 { FGRPd9_4 },
10599 { FGRPd9_5 },
10600 { FGRPd9_6 },
10601 { FGRPd9_7 },
10603 /* da */
10605 { "fcmovb", { ST, STi } },
10606 { "fcmove", { ST, STi } },
10607 { "fcmovbe",{ ST, STi } },
10608 { "fcmovu", { ST, STi } },
10609 { "(bad)", { XX } },
10610 { FGRPda_5 },
10611 { "(bad)", { XX } },
10612 { "(bad)", { XX } },
10614 /* db */
10616 { "fcmovnb",{ ST, STi } },
10617 { "fcmovne",{ ST, STi } },
10618 { "fcmovnbe",{ ST, STi } },
10619 { "fcmovnu",{ ST, STi } },
10620 { FGRPdb_4 },
10621 { "fucomi", { ST, STi } },
10622 { "fcomi", { ST, STi } },
10623 { "(bad)", { XX } },
10625 /* dc */
10627 { "fadd", { STi, ST } },
10628 { "fmul", { STi, ST } },
10629 { "(bad)", { XX } },
10630 { "(bad)", { XX } },
10631 { "fsub!M", { STi, ST } },
10632 { "fsubM", { STi, ST } },
10633 { "fdiv!M", { STi, ST } },
10634 { "fdivM", { STi, ST } },
10636 /* dd */
10638 { "ffree", { STi } },
10639 { "(bad)", { XX } },
10640 { "fst", { STi } },
10641 { "fstp", { STi } },
10642 { "fucom", { STi } },
10643 { "fucomp", { STi } },
10644 { "(bad)", { XX } },
10645 { "(bad)", { XX } },
10647 /* de */
10649 { "faddp", { STi, ST } },
10650 { "fmulp", { STi, ST } },
10651 { "(bad)", { XX } },
10652 { FGRPde_3 },
10653 { "fsub!Mp", { STi, ST } },
10654 { "fsubMp", { STi, ST } },
10655 { "fdiv!Mp", { STi, ST } },
10656 { "fdivMp", { STi, ST } },
10658 /* df */
10660 { "ffreep", { STi } },
10661 { "(bad)", { XX } },
10662 { "(bad)", { XX } },
10663 { "(bad)", { XX } },
10664 { FGRPdf_4 },
10665 { "fucomip", { ST, STi } },
10666 { "fcomip", { ST, STi } },
10667 { "(bad)", { XX } },
10671 static char *fgrps[][8] = {
10672 /* d9_2 0 */
10674 "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10677 /* d9_4 1 */
10679 "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
10682 /* d9_5 2 */
10684 "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
10687 /* d9_6 3 */
10689 "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
10692 /* d9_7 4 */
10694 "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
10697 /* da_5 5 */
10699 "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10702 /* db_4 6 */
10704 "feni(287 only)","fdisi(287 only)","fNclex","fNinit",
10705 "fNsetpm(287 only)","(bad)","(bad)","(bad)",
10708 /* de_3 7 */
10710 "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10713 /* df_4 8 */
10715 "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10719 static void
10720 OP_Skip_MODRM (int bytemode ATTRIBUTE_UNUSED,
10721 int sizeflag ATTRIBUTE_UNUSED)
10723 /* Skip mod/rm byte. */
10724 MODRM_CHECK;
10725 codep++;
10728 static void
10729 dofloat (int sizeflag)
10731 const struct dis386 *dp;
10732 unsigned char floatop;
10734 floatop = codep[-1];
10736 if (modrm.mod != 3)
10738 int fp_indx = (floatop - 0xd8) * 8 + modrm.reg;
10740 putop (float_mem[fp_indx], sizeflag);
10741 obufp = op_out[0];
10742 op_ad = 2;
10743 OP_E (float_mem_mode[fp_indx], sizeflag);
10744 return;
10746 /* Skip mod/rm byte. */
10747 MODRM_CHECK;
10748 codep++;
10750 dp = &float_reg[floatop - 0xd8][modrm.reg];
10751 if (dp->name == NULL)
10753 putop (fgrps[dp->op[0].bytemode][modrm.rm], sizeflag);
10755 /* Instruction fnstsw is only one with strange arg. */
10756 if (floatop == 0xdf && codep[-1] == 0xe0)
10757 strcpy (op_out[0], names16[0]);
10759 else
10761 putop (dp->name, sizeflag);
10763 obufp = op_out[0];
10764 op_ad = 2;
10765 if (dp->op[0].rtn)
10766 (*dp->op[0].rtn) (dp->op[0].bytemode, sizeflag);
10768 obufp = op_out[1];
10769 op_ad = 1;
10770 if (dp->op[1].rtn)
10771 (*dp->op[1].rtn) (dp->op[1].bytemode, sizeflag);
10775 static void
10776 OP_ST (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
10778 oappend ("%st" + intel_syntax);
10781 static void
10782 OP_STi (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
10784 sprintf (scratchbuf, "%%st(%d)", modrm.rm);
10785 oappend (scratchbuf + intel_syntax);
10788 /* Capital letters in template are macros. */
10789 static int
10790 putop (const char *template, int sizeflag)
10792 const char *p;
10793 int alt = 0;
10794 int cond = 1;
10795 unsigned int l = 0, len = 1;
10796 char last[4];
10798 #define SAVE_LAST(c) \
10799 if (l < len && l < sizeof (last)) \
10800 last[l++] = c; \
10801 else \
10802 abort ();
10804 for (p = template; *p; p++)
10806 switch (*p)
10808 default:
10809 *obufp++ = *p;
10810 break;
10811 case '%':
10812 len++;
10813 break;
10814 case '!':
10815 cond = 0;
10816 break;
10817 case '{':
10818 alt = 0;
10819 if (intel_syntax)
10821 while (*++p != '|')
10822 if (*p == '}' || *p == '\0')
10823 abort ();
10825 /* Fall through. */
10826 case 'I':
10827 alt = 1;
10828 continue;
10829 case '|':
10830 while (*++p != '}')
10832 if (*p == '\0')
10833 abort ();
10835 break;
10836 case '}':
10837 break;
10838 case 'A':
10839 if (intel_syntax)
10840 break;
10841 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
10842 *obufp++ = 'b';
10843 break;
10844 case 'B':
10845 if (intel_syntax)
10846 break;
10847 if (sizeflag & SUFFIX_ALWAYS)
10848 *obufp++ = 'b';
10849 break;
10850 case 'C':
10851 if (intel_syntax && !alt)
10852 break;
10853 if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
10855 if (sizeflag & DFLAG)
10856 *obufp++ = intel_syntax ? 'd' : 'l';
10857 else
10858 *obufp++ = intel_syntax ? 'w' : 's';
10859 used_prefixes |= (prefixes & PREFIX_DATA);
10861 break;
10862 case 'D':
10863 if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
10864 break;
10865 USED_REX (REX_W);
10866 if (modrm.mod == 3)
10868 if (rex & REX_W)
10869 *obufp++ = 'q';
10870 else if (sizeflag & DFLAG)
10871 *obufp++ = intel_syntax ? 'd' : 'l';
10872 else
10873 *obufp++ = 'w';
10874 used_prefixes |= (prefixes & PREFIX_DATA);
10876 else
10877 *obufp++ = 'w';
10878 break;
10879 case 'E': /* For jcxz/jecxz */
10880 if (address_mode == mode_64bit)
10882 if (sizeflag & AFLAG)
10883 *obufp++ = 'r';
10884 else
10885 *obufp++ = 'e';
10887 else
10888 if (sizeflag & AFLAG)
10889 *obufp++ = 'e';
10890 used_prefixes |= (prefixes & PREFIX_ADDR);
10891 break;
10892 case 'F':
10893 if (intel_syntax)
10894 break;
10895 if ((prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS))
10897 if (sizeflag & AFLAG)
10898 *obufp++ = address_mode == mode_64bit ? 'q' : 'l';
10899 else
10900 *obufp++ = address_mode == mode_64bit ? 'l' : 'w';
10901 used_prefixes |= (prefixes & PREFIX_ADDR);
10903 break;
10904 case 'G':
10905 if (intel_syntax || (obufp[-1] != 's' && !(sizeflag & SUFFIX_ALWAYS)))
10906 break;
10907 if ((rex & REX_W) || (sizeflag & DFLAG))
10908 *obufp++ = 'l';
10909 else
10910 *obufp++ = 'w';
10911 if (!(rex & REX_W))
10912 used_prefixes |= (prefixes & PREFIX_DATA);
10913 break;
10914 case 'H':
10915 if (intel_syntax)
10916 break;
10917 if ((prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS
10918 || (prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS)
10920 used_prefixes |= prefixes & (PREFIX_CS | PREFIX_DS);
10921 *obufp++ = ',';
10922 *obufp++ = 'p';
10923 if (prefixes & PREFIX_DS)
10924 *obufp++ = 't';
10925 else
10926 *obufp++ = 'n';
10928 break;
10929 case 'J':
10930 if (intel_syntax)
10931 break;
10932 *obufp++ = 'l';
10933 break;
10934 case 'K':
10935 USED_REX (REX_W);
10936 if (rex & REX_W)
10937 *obufp++ = 'q';
10938 else
10939 *obufp++ = 'd';
10940 break;
10941 case 'Z':
10942 if (intel_syntax)
10943 break;
10944 if (address_mode == mode_64bit && (sizeflag & SUFFIX_ALWAYS))
10946 *obufp++ = 'q';
10947 break;
10949 /* Fall through. */
10950 goto case_L;
10951 case 'L':
10952 if (l != 0 || len != 1)
10954 SAVE_LAST (*p);
10955 break;
10957 case_L:
10958 if (intel_syntax)
10959 break;
10960 if (sizeflag & SUFFIX_ALWAYS)
10961 *obufp++ = 'l';
10962 break;
10963 case 'M':
10964 if (intel_mnemonic != cond)
10965 *obufp++ = 'r';
10966 break;
10967 case 'N':
10968 if ((prefixes & PREFIX_FWAIT) == 0)
10969 *obufp++ = 'n';
10970 else
10971 used_prefixes |= PREFIX_FWAIT;
10972 break;
10973 case 'O':
10974 USED_REX (REX_W);
10975 if (rex & REX_W)
10976 *obufp++ = 'o';
10977 else if (intel_syntax && (sizeflag & DFLAG))
10978 *obufp++ = 'q';
10979 else
10980 *obufp++ = 'd';
10981 if (!(rex & REX_W))
10982 used_prefixes |= (prefixes & PREFIX_DATA);
10983 break;
10984 case 'T':
10985 if (intel_syntax)
10986 break;
10987 if (address_mode == mode_64bit && (sizeflag & DFLAG))
10989 *obufp++ = 'q';
10990 break;
10992 /* Fall through. */
10993 case 'P':
10994 if (intel_syntax)
10995 break;
10996 if ((prefixes & PREFIX_DATA)
10997 || (rex & REX_W)
10998 || (sizeflag & SUFFIX_ALWAYS))
11000 USED_REX (REX_W);
11001 if (rex & REX_W)
11002 *obufp++ = 'q';
11003 else
11005 if (sizeflag & DFLAG)
11006 *obufp++ = 'l';
11007 else
11008 *obufp++ = 'w';
11010 used_prefixes |= (prefixes & PREFIX_DATA);
11012 break;
11013 case 'U':
11014 if (intel_syntax)
11015 break;
11016 if (address_mode == mode_64bit && (sizeflag & DFLAG))
11018 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
11019 *obufp++ = 'q';
11020 break;
11022 /* Fall through. */
11023 goto case_Q;
11024 case 'Q':
11025 if (l == 0 && len == 1)
11027 case_Q:
11028 if (intel_syntax && !alt)
11029 break;
11030 USED_REX (REX_W);
11031 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
11033 if (rex & REX_W)
11034 *obufp++ = 'q';
11035 else
11037 if (sizeflag & DFLAG)
11038 *obufp++ = intel_syntax ? 'd' : 'l';
11039 else
11040 *obufp++ = 'w';
11042 used_prefixes |= (prefixes & PREFIX_DATA);
11045 else
11047 if (l != 1 || len != 2 || last[0] != 'L')
11049 SAVE_LAST (*p);
11050 break;
11052 if (intel_syntax
11053 || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
11054 break;
11055 if ((rex & REX_W))
11057 USED_REX (REX_W);
11058 *obufp++ = 'q';
11060 else
11061 *obufp++ = 'l';
11063 break;
11064 case 'R':
11065 USED_REX (REX_W);
11066 if (rex & REX_W)
11067 *obufp++ = 'q';
11068 else if (sizeflag & DFLAG)
11070 if (intel_syntax)
11071 *obufp++ = 'd';
11072 else
11073 *obufp++ = 'l';
11075 else
11076 *obufp++ = 'w';
11077 if (intel_syntax && !p[1]
11078 && ((rex & REX_W) || (sizeflag & DFLAG)))
11079 *obufp++ = 'e';
11080 if (!(rex & REX_W))
11081 used_prefixes |= (prefixes & PREFIX_DATA);
11082 break;
11083 case 'V':
11084 if (intel_syntax)
11085 break;
11086 if (address_mode == mode_64bit && (sizeflag & DFLAG))
11088 if (sizeflag & SUFFIX_ALWAYS)
11089 *obufp++ = 'q';
11090 break;
11092 /* Fall through. */
11093 case 'S':
11094 if (intel_syntax)
11095 break;
11096 if (sizeflag & SUFFIX_ALWAYS)
11098 if (rex & REX_W)
11099 *obufp++ = 'q';
11100 else
11102 if (sizeflag & DFLAG)
11103 *obufp++ = 'l';
11104 else
11105 *obufp++ = 'w';
11106 used_prefixes |= (prefixes & PREFIX_DATA);
11109 break;
11110 case 'X':
11111 if (l != 0 || len != 1)
11113 SAVE_LAST (*p);
11114 break;
11116 if (need_vex && vex.prefix)
11118 if (vex.prefix == DATA_PREFIX_OPCODE)
11119 *obufp++ = 'd';
11120 else
11121 *obufp++ = 's';
11123 else if (prefixes & PREFIX_DATA)
11124 *obufp++ = 'd';
11125 else
11126 *obufp++ = 's';
11127 used_prefixes |= (prefixes & PREFIX_DATA);
11128 break;
11129 case 'Y':
11130 if (l == 0 && len == 1)
11132 if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
11133 break;
11134 if (rex & REX_W)
11136 USED_REX (REX_W);
11137 *obufp++ = 'q';
11139 break;
11141 else
11143 if (l != 1 || len != 2 || last[0] != 'X')
11145 SAVE_LAST (*p);
11146 break;
11148 if (!need_vex)
11149 abort ();
11150 if (intel_syntax
11151 || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
11152 break;
11153 switch (vex.length)
11155 case 128:
11156 *obufp++ = 'x';
11157 break;
11158 case 256:
11159 *obufp++ = 'y';
11160 break;
11161 default:
11162 abort ();
11165 break;
11166 /* implicit operand size 'l' for i386 or 'q' for x86-64 */
11167 case 'W':
11168 /* operand size flag for cwtl, cbtw */
11169 USED_REX (REX_W);
11170 if (rex & REX_W)
11172 if (intel_syntax)
11173 *obufp++ = 'd';
11174 else
11175 *obufp++ = 'l';
11177 else if (sizeflag & DFLAG)
11178 *obufp++ = 'w';
11179 else
11180 *obufp++ = 'b';
11181 if (!(rex & REX_W))
11182 used_prefixes |= (prefixes & PREFIX_DATA);
11183 break;
11185 alt = 0;
11187 *obufp = 0;
11188 return 0;
11191 static void
11192 oappend (const char *s)
11194 strcpy (obufp, s);
11195 obufp += strlen (s);
11198 static void
11199 append_seg (void)
11201 if (prefixes & PREFIX_CS)
11203 used_prefixes |= PREFIX_CS;
11204 oappend ("%cs:" + intel_syntax);
11206 if (prefixes & PREFIX_DS)
11208 used_prefixes |= PREFIX_DS;
11209 oappend ("%ds:" + intel_syntax);
11211 if (prefixes & PREFIX_SS)
11213 used_prefixes |= PREFIX_SS;
11214 oappend ("%ss:" + intel_syntax);
11216 if (prefixes & PREFIX_ES)
11218 used_prefixes |= PREFIX_ES;
11219 oappend ("%es:" + intel_syntax);
11221 if (prefixes & PREFIX_FS)
11223 used_prefixes |= PREFIX_FS;
11224 oappend ("%fs:" + intel_syntax);
11226 if (prefixes & PREFIX_GS)
11228 used_prefixes |= PREFIX_GS;
11229 oappend ("%gs:" + intel_syntax);
11233 static void
11234 OP_indirE (int bytemode, int sizeflag)
11236 if (!intel_syntax)
11237 oappend ("*");
11238 OP_E (bytemode, sizeflag);
11241 static void
11242 print_operand_value (char *buf, int hex, bfd_vma disp)
11244 if (address_mode == mode_64bit)
11246 if (hex)
11248 char tmp[30];
11249 int i;
11250 buf[0] = '0';
11251 buf[1] = 'x';
11252 sprintf_vma (tmp, disp);
11253 for (i = 0; tmp[i] == '0' && tmp[i + 1]; i++);
11254 strcpy (buf + 2, tmp + i);
11256 else
11258 bfd_signed_vma v = disp;
11259 char tmp[30];
11260 int i;
11261 if (v < 0)
11263 *(buf++) = '-';
11264 v = -disp;
11265 /* Check for possible overflow on 0x8000000000000000. */
11266 if (v < 0)
11268 strcpy (buf, "9223372036854775808");
11269 return;
11272 if (!v)
11274 strcpy (buf, "0");
11275 return;
11278 i = 0;
11279 tmp[29] = 0;
11280 while (v)
11282 tmp[28 - i] = (v % 10) + '0';
11283 v /= 10;
11284 i++;
11286 strcpy (buf, tmp + 29 - i);
11289 else
11291 if (hex)
11292 sprintf (buf, "0x%x", (unsigned int) disp);
11293 else
11294 sprintf (buf, "%d", (int) disp);
11298 /* Put DISP in BUF as signed hex number. */
11300 static void
11301 print_displacement (char *buf, bfd_vma disp)
11303 bfd_signed_vma val = disp;
11304 char tmp[30];
11305 int i, j = 0;
11307 if (val < 0)
11309 buf[j++] = '-';
11310 val = -disp;
11312 /* Check for possible overflow. */
11313 if (val < 0)
11315 switch (address_mode)
11317 case mode_64bit:
11318 strcpy (buf + j, "0x8000000000000000");
11319 break;
11320 case mode_32bit:
11321 strcpy (buf + j, "0x80000000");
11322 break;
11323 case mode_16bit:
11324 strcpy (buf + j, "0x8000");
11325 break;
11327 return;
11331 buf[j++] = '0';
11332 buf[j++] = 'x';
11334 sprintf_vma (tmp, (bfd_vma) val);
11335 for (i = 0; tmp[i] == '0'; i++)
11336 continue;
11337 if (tmp[i] == '\0')
11338 i--;
11339 strcpy (buf + j, tmp + i);
11342 static void
11343 intel_operand_size (int bytemode, int sizeflag)
11345 switch (bytemode)
11347 case b_mode:
11348 case dqb_mode:
11349 oappend ("BYTE PTR ");
11350 break;
11351 case w_mode:
11352 case dqw_mode:
11353 oappend ("WORD PTR ");
11354 break;
11355 case stack_v_mode:
11356 if (address_mode == mode_64bit && (sizeflag & DFLAG))
11358 oappend ("QWORD PTR ");
11359 used_prefixes |= (prefixes & PREFIX_DATA);
11360 break;
11362 /* FALLTHRU */
11363 case v_mode:
11364 case dq_mode:
11365 USED_REX (REX_W);
11366 if (rex & REX_W)
11367 oappend ("QWORD PTR ");
11368 else if ((sizeflag & DFLAG) || bytemode == dq_mode)
11369 oappend ("DWORD PTR ");
11370 else
11371 oappend ("WORD PTR ");
11372 used_prefixes |= (prefixes & PREFIX_DATA);
11373 break;
11374 case z_mode:
11375 if ((rex & REX_W) || (sizeflag & DFLAG))
11376 *obufp++ = 'D';
11377 oappend ("WORD PTR ");
11378 if (!(rex & REX_W))
11379 used_prefixes |= (prefixes & PREFIX_DATA);
11380 break;
11381 case a_mode:
11382 if (sizeflag & DFLAG)
11383 oappend ("QWORD PTR ");
11384 else
11385 oappend ("DWORD PTR ");
11386 used_prefixes |= (prefixes & PREFIX_DATA);
11387 break;
11388 case d_mode:
11389 case dqd_mode:
11390 oappend ("DWORD PTR ");
11391 break;
11392 case q_mode:
11393 oappend ("QWORD PTR ");
11394 break;
11395 case m_mode:
11396 if (address_mode == mode_64bit)
11397 oappend ("QWORD PTR ");
11398 else
11399 oappend ("DWORD PTR ");
11400 break;
11401 case f_mode:
11402 if (sizeflag & DFLAG)
11403 oappend ("FWORD PTR ");
11404 else
11405 oappend ("DWORD PTR ");
11406 used_prefixes |= (prefixes & PREFIX_DATA);
11407 break;
11408 case t_mode:
11409 oappend ("TBYTE PTR ");
11410 break;
11411 case x_mode:
11412 if (need_vex)
11414 switch (vex.length)
11416 case 128:
11417 oappend ("XMMWORD PTR ");
11418 break;
11419 case 256:
11420 oappend ("YMMWORD PTR ");
11421 break;
11422 default:
11423 abort ();
11426 else
11427 oappend ("XMMWORD PTR ");
11428 break;
11429 case xmm_mode:
11430 oappend ("XMMWORD PTR ");
11431 break;
11432 case xmmq_mode:
11433 if (!need_vex)
11434 abort ();
11436 switch (vex.length)
11438 case 128:
11439 oappend ("QWORD PTR ");
11440 break;
11441 case 256:
11442 oappend ("XMMWORD PTR ");
11443 break;
11444 default:
11445 abort ();
11447 break;
11448 case ymmq_mode:
11449 if (!need_vex)
11450 abort ();
11452 switch (vex.length)
11454 case 128:
11455 oappend ("QWORD PTR ");
11456 break;
11457 case 256:
11458 oappend ("YMMWORD PTR ");
11459 break;
11460 default:
11461 abort ();
11463 break;
11464 case o_mode:
11465 oappend ("OWORD PTR ");
11466 break;
11467 default:
11468 break;
11472 static void
11473 OP_E_register (int bytemode, int sizeflag)
11475 int reg = modrm.rm;
11476 const char **names;
11478 USED_REX (REX_B);
11479 if ((rex & REX_B))
11480 reg += 8;
11482 switch (bytemode)
11484 case b_mode:
11485 USED_REX (0);
11486 if (rex)
11487 names = names8rex;
11488 else
11489 names = names8;
11490 break;
11491 case w_mode:
11492 names = names16;
11493 break;
11494 case d_mode:
11495 names = names32;
11496 break;
11497 case q_mode:
11498 names = names64;
11499 break;
11500 case m_mode:
11501 names = address_mode == mode_64bit ? names64 : names32;
11502 break;
11503 case stack_v_mode:
11504 if (address_mode == mode_64bit && (sizeflag & DFLAG))
11506 names = names64;
11507 used_prefixes |= (prefixes & PREFIX_DATA);
11508 break;
11510 bytemode = v_mode;
11511 /* FALLTHRU */
11512 case v_mode:
11513 case dq_mode:
11514 case dqb_mode:
11515 case dqd_mode:
11516 case dqw_mode:
11517 USED_REX (REX_W);
11518 if (rex & REX_W)
11519 names = names64;
11520 else if ((sizeflag & DFLAG) || bytemode != v_mode)
11521 names = names32;
11522 else
11523 names = names16;
11524 used_prefixes |= (prefixes & PREFIX_DATA);
11525 break;
11526 case 0:
11527 return;
11528 default:
11529 oappend (INTERNAL_DISASSEMBLER_ERROR);
11530 return;
11532 oappend (names[reg]);
11535 static void
11536 OP_E_memory (int bytemode, int sizeflag, int has_drex)
11538 bfd_vma disp = 0;
11539 int add = (rex & REX_B) ? 8 : 0;
11540 int riprel = 0;
11542 USED_REX (REX_B);
11543 if (intel_syntax)
11544 intel_operand_size (bytemode, sizeflag);
11545 append_seg ();
11547 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
11549 /* 32/64 bit address mode */
11550 int havedisp;
11551 int havesib;
11552 int havebase;
11553 int haveindex;
11554 int needindex;
11555 int base, rbase;
11556 int index = 0;
11557 int scale = 0;
11559 havesib = 0;
11560 havebase = 1;
11561 haveindex = 0;
11562 base = modrm.rm;
11564 if (base == 4)
11566 havesib = 1;
11567 FETCH_DATA (the_info, codep + 1);
11568 index = (*codep >> 3) & 7;
11569 scale = (*codep >> 6) & 3;
11570 base = *codep & 7;
11571 USED_REX (REX_X);
11572 if (rex & REX_X)
11573 index += 8;
11574 haveindex = index != 4;
11575 codep++;
11577 rbase = base + add;
11579 /* If we have a DREX byte, skip it now
11580 (it has already been handled) */
11581 if (has_drex)
11583 FETCH_DATA (the_info, codep + 1);
11584 codep++;
11587 switch (modrm.mod)
11589 case 0:
11590 if (base == 5)
11592 havebase = 0;
11593 if (address_mode == mode_64bit && !havesib)
11594 riprel = 1;
11595 disp = get32s ();
11597 break;
11598 case 1:
11599 FETCH_DATA (the_info, codep + 1);
11600 disp = *codep++;
11601 if ((disp & 0x80) != 0)
11602 disp -= 0x100;
11603 break;
11604 case 2:
11605 disp = get32s ();
11606 break;
11609 /* In 32bit mode, we need index register to tell [offset] from
11610 [eiz*1 + offset]. */
11611 needindex = (havesib
11612 && !havebase
11613 && !haveindex
11614 && address_mode == mode_32bit);
11615 havedisp = (havebase
11616 || needindex
11617 || (havesib && (haveindex || scale != 0)));
11619 if (!intel_syntax)
11620 if (modrm.mod != 0 || base == 5)
11622 if (havedisp || riprel)
11623 print_displacement (scratchbuf, disp);
11624 else
11625 print_operand_value (scratchbuf, 1, disp);
11626 oappend (scratchbuf);
11627 if (riprel)
11629 set_op (disp, 1);
11630 oappend (sizeflag & AFLAG ? "(%rip)" : "(%eip)");
11634 if (havebase || haveindex || riprel)
11635 used_prefixes |= PREFIX_ADDR;
11637 if (havedisp || (intel_syntax && riprel))
11639 *obufp++ = open_char;
11640 if (intel_syntax && riprel)
11642 set_op (disp, 1);
11643 oappend (sizeflag & AFLAG ? "rip" : "eip");
11645 *obufp = '\0';
11646 if (havebase)
11647 oappend (address_mode == mode_64bit && (sizeflag & AFLAG)
11648 ? names64[rbase] : names32[rbase]);
11649 if (havesib)
11651 /* ESP/RSP won't allow index. If base isn't ESP/RSP,
11652 print index to tell base + index from base. */
11653 if (scale != 0
11654 || needindex
11655 || haveindex
11656 || (havebase && base != ESP_REG_NUM))
11658 if (!intel_syntax || havebase)
11660 *obufp++ = separator_char;
11661 *obufp = '\0';
11663 if (haveindex)
11664 oappend (address_mode == mode_64bit
11665 && (sizeflag & AFLAG)
11666 ? names64[index] : names32[index]);
11667 else
11668 oappend (address_mode == mode_64bit
11669 && (sizeflag & AFLAG)
11670 ? index64 : index32);
11672 *obufp++ = scale_char;
11673 *obufp = '\0';
11674 sprintf (scratchbuf, "%d", 1 << scale);
11675 oappend (scratchbuf);
11678 if (intel_syntax
11679 && (disp || modrm.mod != 0 || base == 5))
11681 if (!havedisp || (bfd_signed_vma) disp >= 0)
11683 *obufp++ = '+';
11684 *obufp = '\0';
11686 else if (modrm.mod != 1)
11688 *obufp++ = '-';
11689 *obufp = '\0';
11690 disp = - (bfd_signed_vma) disp;
11693 if (havedisp)
11694 print_displacement (scratchbuf, disp);
11695 else
11696 print_operand_value (scratchbuf, 1, disp);
11697 oappend (scratchbuf);
11700 *obufp++ = close_char;
11701 *obufp = '\0';
11703 else if (intel_syntax)
11705 if (modrm.mod != 0 || base == 5)
11707 if (prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
11708 | PREFIX_ES | PREFIX_FS | PREFIX_GS))
11710 else
11712 oappend (names_seg[ds_reg - es_reg]);
11713 oappend (":");
11715 print_operand_value (scratchbuf, 1, disp);
11716 oappend (scratchbuf);
11720 else
11721 { /* 16 bit address mode */
11722 switch (modrm.mod)
11724 case 0:
11725 if (modrm.rm == 6)
11727 disp = get16 ();
11728 if ((disp & 0x8000) != 0)
11729 disp -= 0x10000;
11731 break;
11732 case 1:
11733 FETCH_DATA (the_info, codep + 1);
11734 disp = *codep++;
11735 if ((disp & 0x80) != 0)
11736 disp -= 0x100;
11737 break;
11738 case 2:
11739 disp = get16 ();
11740 if ((disp & 0x8000) != 0)
11741 disp -= 0x10000;
11742 break;
11745 if (!intel_syntax)
11746 if (modrm.mod != 0 || modrm.rm == 6)
11748 print_displacement (scratchbuf, disp);
11749 oappend (scratchbuf);
11752 if (modrm.mod != 0 || modrm.rm != 6)
11754 *obufp++ = open_char;
11755 *obufp = '\0';
11756 oappend (index16[modrm.rm]);
11757 if (intel_syntax
11758 && (disp || modrm.mod != 0 || modrm.rm == 6))
11760 if ((bfd_signed_vma) disp >= 0)
11762 *obufp++ = '+';
11763 *obufp = '\0';
11765 else if (modrm.mod != 1)
11767 *obufp++ = '-';
11768 *obufp = '\0';
11769 disp = - (bfd_signed_vma) disp;
11772 print_displacement (scratchbuf, disp);
11773 oappend (scratchbuf);
11776 *obufp++ = close_char;
11777 *obufp = '\0';
11779 else if (intel_syntax)
11781 if (prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
11782 | PREFIX_ES | PREFIX_FS | PREFIX_GS))
11784 else
11786 oappend (names_seg[ds_reg - es_reg]);
11787 oappend (":");
11789 print_operand_value (scratchbuf, 1, disp & 0xffff);
11790 oappend (scratchbuf);
11795 static void
11796 OP_E_extended (int bytemode, int sizeflag, int has_drex)
11798 /* Skip mod/rm byte. */
11799 MODRM_CHECK;
11800 codep++;
11802 if (modrm.mod == 3)
11803 OP_E_register (bytemode, sizeflag);
11804 else
11805 OP_E_memory (bytemode, sizeflag, has_drex);
11808 static void
11809 OP_E (int bytemode, int sizeflag)
11811 OP_E_extended (bytemode, sizeflag, 0);
11815 static void
11816 OP_G (int bytemode, int sizeflag)
11818 int add = 0;
11819 USED_REX (REX_R);
11820 if (rex & REX_R)
11821 add += 8;
11822 switch (bytemode)
11824 case b_mode:
11825 USED_REX (0);
11826 if (rex)
11827 oappend (names8rex[modrm.reg + add]);
11828 else
11829 oappend (names8[modrm.reg + add]);
11830 break;
11831 case w_mode:
11832 oappend (names16[modrm.reg + add]);
11833 break;
11834 case d_mode:
11835 oappend (names32[modrm.reg + add]);
11836 break;
11837 case q_mode:
11838 oappend (names64[modrm.reg + add]);
11839 break;
11840 case v_mode:
11841 case dq_mode:
11842 case dqb_mode:
11843 case dqd_mode:
11844 case dqw_mode:
11845 USED_REX (REX_W);
11846 if (rex & REX_W)
11847 oappend (names64[modrm.reg + add]);
11848 else if ((sizeflag & DFLAG) || bytemode != v_mode)
11849 oappend (names32[modrm.reg + add]);
11850 else
11851 oappend (names16[modrm.reg + add]);
11852 used_prefixes |= (prefixes & PREFIX_DATA);
11853 break;
11854 case m_mode:
11855 if (address_mode == mode_64bit)
11856 oappend (names64[modrm.reg + add]);
11857 else
11858 oappend (names32[modrm.reg + add]);
11859 break;
11860 default:
11861 oappend (INTERNAL_DISASSEMBLER_ERROR);
11862 break;
11866 static bfd_vma
11867 get64 (void)
11869 bfd_vma x;
11870 #ifdef BFD64
11871 unsigned int a;
11872 unsigned int b;
11874 FETCH_DATA (the_info, codep + 8);
11875 a = *codep++ & 0xff;
11876 a |= (*codep++ & 0xff) << 8;
11877 a |= (*codep++ & 0xff) << 16;
11878 a |= (*codep++ & 0xff) << 24;
11879 b = *codep++ & 0xff;
11880 b |= (*codep++ & 0xff) << 8;
11881 b |= (*codep++ & 0xff) << 16;
11882 b |= (*codep++ & 0xff) << 24;
11883 x = a + ((bfd_vma) b << 32);
11884 #else
11885 abort ();
11886 x = 0;
11887 #endif
11888 return x;
11891 static bfd_signed_vma
11892 get32 (void)
11894 bfd_signed_vma x = 0;
11896 FETCH_DATA (the_info, codep + 4);
11897 x = *codep++ & (bfd_signed_vma) 0xff;
11898 x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
11899 x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
11900 x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
11901 return x;
11904 static bfd_signed_vma
11905 get32s (void)
11907 bfd_signed_vma x = 0;
11909 FETCH_DATA (the_info, codep + 4);
11910 x = *codep++ & (bfd_signed_vma) 0xff;
11911 x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
11912 x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
11913 x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
11915 x = (x ^ ((bfd_signed_vma) 1 << 31)) - ((bfd_signed_vma) 1 << 31);
11917 return x;
11920 static int
11921 get16 (void)
11923 int x = 0;
11925 FETCH_DATA (the_info, codep + 2);
11926 x = *codep++ & 0xff;
11927 x |= (*codep++ & 0xff) << 8;
11928 return x;
11931 static void
11932 set_op (bfd_vma op, int riprel)
11934 op_index[op_ad] = op_ad;
11935 if (address_mode == mode_64bit)
11937 op_address[op_ad] = op;
11938 op_riprel[op_ad] = riprel;
11940 else
11942 /* Mask to get a 32-bit address. */
11943 op_address[op_ad] = op & 0xffffffff;
11944 op_riprel[op_ad] = riprel & 0xffffffff;
11948 static void
11949 OP_REG (int code, int sizeflag)
11951 const char *s;
11952 int add;
11953 USED_REX (REX_B);
11954 if (rex & REX_B)
11955 add = 8;
11956 else
11957 add = 0;
11959 switch (code)
11961 case ax_reg: case cx_reg: case dx_reg: case bx_reg:
11962 case sp_reg: case bp_reg: case si_reg: case di_reg:
11963 s = names16[code - ax_reg + add];
11964 break;
11965 case es_reg: case ss_reg: case cs_reg:
11966 case ds_reg: case fs_reg: case gs_reg:
11967 s = names_seg[code - es_reg + add];
11968 break;
11969 case al_reg: case ah_reg: case cl_reg: case ch_reg:
11970 case dl_reg: case dh_reg: case bl_reg: case bh_reg:
11971 USED_REX (0);
11972 if (rex)
11973 s = names8rex[code - al_reg + add];
11974 else
11975 s = names8[code - al_reg];
11976 break;
11977 case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
11978 case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
11979 if (address_mode == mode_64bit && (sizeflag & DFLAG))
11981 s = names64[code - rAX_reg + add];
11982 break;
11984 code += eAX_reg - rAX_reg;
11985 /* Fall through. */
11986 case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
11987 case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
11988 USED_REX (REX_W);
11989 if (rex & REX_W)
11990 s = names64[code - eAX_reg + add];
11991 else if (sizeflag & DFLAG)
11992 s = names32[code - eAX_reg + add];
11993 else
11994 s = names16[code - eAX_reg + add];
11995 used_prefixes |= (prefixes & PREFIX_DATA);
11996 break;
11997 default:
11998 s = INTERNAL_DISASSEMBLER_ERROR;
11999 break;
12001 oappend (s);
12004 static void
12005 OP_IMREG (int code, int sizeflag)
12007 const char *s;
12009 switch (code)
12011 case indir_dx_reg:
12012 if (intel_syntax)
12013 s = "dx";
12014 else
12015 s = "(%dx)";
12016 break;
12017 case ax_reg: case cx_reg: case dx_reg: case bx_reg:
12018 case sp_reg: case bp_reg: case si_reg: case di_reg:
12019 s = names16[code - ax_reg];
12020 break;
12021 case es_reg: case ss_reg: case cs_reg:
12022 case ds_reg: case fs_reg: case gs_reg:
12023 s = names_seg[code - es_reg];
12024 break;
12025 case al_reg: case ah_reg: case cl_reg: case ch_reg:
12026 case dl_reg: case dh_reg: case bl_reg: case bh_reg:
12027 USED_REX (0);
12028 if (rex)
12029 s = names8rex[code - al_reg];
12030 else
12031 s = names8[code - al_reg];
12032 break;
12033 case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
12034 case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
12035 USED_REX (REX_W);
12036 if (rex & REX_W)
12037 s = names64[code - eAX_reg];
12038 else if (sizeflag & DFLAG)
12039 s = names32[code - eAX_reg];
12040 else
12041 s = names16[code - eAX_reg];
12042 used_prefixes |= (prefixes & PREFIX_DATA);
12043 break;
12044 case z_mode_ax_reg:
12045 if ((rex & REX_W) || (sizeflag & DFLAG))
12046 s = *names32;
12047 else
12048 s = *names16;
12049 if (!(rex & REX_W))
12050 used_prefixes |= (prefixes & PREFIX_DATA);
12051 break;
12052 default:
12053 s = INTERNAL_DISASSEMBLER_ERROR;
12054 break;
12056 oappend (s);
12059 static void
12060 OP_I (int bytemode, int sizeflag)
12062 bfd_signed_vma op;
12063 bfd_signed_vma mask = -1;
12065 switch (bytemode)
12067 case b_mode:
12068 FETCH_DATA (the_info, codep + 1);
12069 op = *codep++;
12070 mask = 0xff;
12071 break;
12072 case q_mode:
12073 if (address_mode == mode_64bit)
12075 op = get32s ();
12076 break;
12078 /* Fall through. */
12079 case v_mode:
12080 USED_REX (REX_W);
12081 if (rex & REX_W)
12082 op = get32s ();
12083 else if (sizeflag & DFLAG)
12085 op = get32 ();
12086 mask = 0xffffffff;
12088 else
12090 op = get16 ();
12091 mask = 0xfffff;
12093 used_prefixes |= (prefixes & PREFIX_DATA);
12094 break;
12095 case w_mode:
12096 mask = 0xfffff;
12097 op = get16 ();
12098 break;
12099 case const_1_mode:
12100 if (intel_syntax)
12101 oappend ("1");
12102 return;
12103 default:
12104 oappend (INTERNAL_DISASSEMBLER_ERROR);
12105 return;
12108 op &= mask;
12109 scratchbuf[0] = '$';
12110 print_operand_value (scratchbuf + 1, 1, op);
12111 oappend (scratchbuf + intel_syntax);
12112 scratchbuf[0] = '\0';
12115 static void
12116 OP_I64 (int bytemode, int sizeflag)
12118 bfd_signed_vma op;
12119 bfd_signed_vma mask = -1;
12121 if (address_mode != mode_64bit)
12123 OP_I (bytemode, sizeflag);
12124 return;
12127 switch (bytemode)
12129 case b_mode:
12130 FETCH_DATA (the_info, codep + 1);
12131 op = *codep++;
12132 mask = 0xff;
12133 break;
12134 case v_mode:
12135 USED_REX (REX_W);
12136 if (rex & REX_W)
12137 op = get64 ();
12138 else if (sizeflag & DFLAG)
12140 op = get32 ();
12141 mask = 0xffffffff;
12143 else
12145 op = get16 ();
12146 mask = 0xfffff;
12148 used_prefixes |= (prefixes & PREFIX_DATA);
12149 break;
12150 case w_mode:
12151 mask = 0xfffff;
12152 op = get16 ();
12153 break;
12154 default:
12155 oappend (INTERNAL_DISASSEMBLER_ERROR);
12156 return;
12159 op &= mask;
12160 scratchbuf[0] = '$';
12161 print_operand_value (scratchbuf + 1, 1, op);
12162 oappend (scratchbuf + intel_syntax);
12163 scratchbuf[0] = '\0';
12166 static void
12167 OP_sI (int bytemode, int sizeflag)
12169 bfd_signed_vma op;
12170 bfd_signed_vma mask = -1;
12172 switch (bytemode)
12174 case b_mode:
12175 FETCH_DATA (the_info, codep + 1);
12176 op = *codep++;
12177 if ((op & 0x80) != 0)
12178 op -= 0x100;
12179 mask = 0xffffffff;
12180 break;
12181 case v_mode:
12182 USED_REX (REX_W);
12183 if (rex & REX_W)
12184 op = get32s ();
12185 else if (sizeflag & DFLAG)
12187 op = get32s ();
12188 mask = 0xffffffff;
12190 else
12192 mask = 0xffffffff;
12193 op = get16 ();
12194 if ((op & 0x8000) != 0)
12195 op -= 0x10000;
12197 used_prefixes |= (prefixes & PREFIX_DATA);
12198 break;
12199 case w_mode:
12200 op = get16 ();
12201 mask = 0xffffffff;
12202 if ((op & 0x8000) != 0)
12203 op -= 0x10000;
12204 break;
12205 default:
12206 oappend (INTERNAL_DISASSEMBLER_ERROR);
12207 return;
12210 scratchbuf[0] = '$';
12211 print_operand_value (scratchbuf + 1, 1, op);
12212 oappend (scratchbuf + intel_syntax);
12215 static void
12216 OP_J (int bytemode, int sizeflag)
12218 bfd_vma disp;
12219 bfd_vma mask = -1;
12220 bfd_vma segment = 0;
12222 switch (bytemode)
12224 case b_mode:
12225 FETCH_DATA (the_info, codep + 1);
12226 disp = *codep++;
12227 if ((disp & 0x80) != 0)
12228 disp -= 0x100;
12229 break;
12230 case v_mode:
12231 if ((sizeflag & DFLAG) || (rex & REX_W))
12232 disp = get32s ();
12233 else
12235 disp = get16 ();
12236 if ((disp & 0x8000) != 0)
12237 disp -= 0x10000;
12238 /* In 16bit mode, address is wrapped around at 64k within
12239 the same segment. Otherwise, a data16 prefix on a jump
12240 instruction means that the pc is masked to 16 bits after
12241 the displacement is added! */
12242 mask = 0xffff;
12243 if ((prefixes & PREFIX_DATA) == 0)
12244 segment = ((start_pc + codep - start_codep)
12245 & ~((bfd_vma) 0xffff));
12247 used_prefixes |= (prefixes & PREFIX_DATA);
12248 break;
12249 default:
12250 oappend (INTERNAL_DISASSEMBLER_ERROR);
12251 return;
12253 disp = ((start_pc + codep - start_codep + disp) & mask) | segment;
12254 set_op (disp, 0);
12255 print_operand_value (scratchbuf, 1, disp);
12256 oappend (scratchbuf);
12259 static void
12260 OP_SEG (int bytemode, int sizeflag)
12262 if (bytemode == w_mode)
12263 oappend (names_seg[modrm.reg]);
12264 else
12265 OP_E (modrm.mod == 3 ? bytemode : w_mode, sizeflag);
12268 static void
12269 OP_DIR (int dummy ATTRIBUTE_UNUSED, int sizeflag)
12271 int seg, offset;
12273 if (sizeflag & DFLAG)
12275 offset = get32 ();
12276 seg = get16 ();
12278 else
12280 offset = get16 ();
12281 seg = get16 ();
12283 used_prefixes |= (prefixes & PREFIX_DATA);
12284 if (intel_syntax)
12285 sprintf (scratchbuf, "0x%x:0x%x", seg, offset);
12286 else
12287 sprintf (scratchbuf, "$0x%x,$0x%x", seg, offset);
12288 oappend (scratchbuf);
12291 static void
12292 OP_OFF (int bytemode, int sizeflag)
12294 bfd_vma off;
12296 if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
12297 intel_operand_size (bytemode, sizeflag);
12298 append_seg ();
12300 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
12301 off = get32 ();
12302 else
12303 off = get16 ();
12305 if (intel_syntax)
12307 if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
12308 | PREFIX_ES | PREFIX_FS | PREFIX_GS)))
12310 oappend (names_seg[ds_reg - es_reg]);
12311 oappend (":");
12314 print_operand_value (scratchbuf, 1, off);
12315 oappend (scratchbuf);
12318 static void
12319 OP_OFF64 (int bytemode, int sizeflag)
12321 bfd_vma off;
12323 if (address_mode != mode_64bit
12324 || (prefixes & PREFIX_ADDR))
12326 OP_OFF (bytemode, sizeflag);
12327 return;
12330 if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
12331 intel_operand_size (bytemode, sizeflag);
12332 append_seg ();
12334 off = get64 ();
12336 if (intel_syntax)
12338 if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
12339 | PREFIX_ES | PREFIX_FS | PREFIX_GS)))
12341 oappend (names_seg[ds_reg - es_reg]);
12342 oappend (":");
12345 print_operand_value (scratchbuf, 1, off);
12346 oappend (scratchbuf);
12349 static void
12350 ptr_reg (int code, int sizeflag)
12352 const char *s;
12354 *obufp++ = open_char;
12355 used_prefixes |= (prefixes & PREFIX_ADDR);
12356 if (address_mode == mode_64bit)
12358 if (!(sizeflag & AFLAG))
12359 s = names32[code - eAX_reg];
12360 else
12361 s = names64[code - eAX_reg];
12363 else if (sizeflag & AFLAG)
12364 s = names32[code - eAX_reg];
12365 else
12366 s = names16[code - eAX_reg];
12367 oappend (s);
12368 *obufp++ = close_char;
12369 *obufp = 0;
12372 static void
12373 OP_ESreg (int code, int sizeflag)
12375 if (intel_syntax)
12377 switch (codep[-1])
12379 case 0x6d: /* insw/insl */
12380 intel_operand_size (z_mode, sizeflag);
12381 break;
12382 case 0xa5: /* movsw/movsl/movsq */
12383 case 0xa7: /* cmpsw/cmpsl/cmpsq */
12384 case 0xab: /* stosw/stosl */
12385 case 0xaf: /* scasw/scasl */
12386 intel_operand_size (v_mode, sizeflag);
12387 break;
12388 default:
12389 intel_operand_size (b_mode, sizeflag);
12392 oappend ("%es:" + intel_syntax);
12393 ptr_reg (code, sizeflag);
12396 static void
12397 OP_DSreg (int code, int sizeflag)
12399 if (intel_syntax)
12401 switch (codep[-1])
12403 case 0x6f: /* outsw/outsl */
12404 intel_operand_size (z_mode, sizeflag);
12405 break;
12406 case 0xa5: /* movsw/movsl/movsq */
12407 case 0xa7: /* cmpsw/cmpsl/cmpsq */
12408 case 0xad: /* lodsw/lodsl/lodsq */
12409 intel_operand_size (v_mode, sizeflag);
12410 break;
12411 default:
12412 intel_operand_size (b_mode, sizeflag);
12415 if ((prefixes
12416 & (PREFIX_CS
12417 | PREFIX_DS
12418 | PREFIX_SS
12419 | PREFIX_ES
12420 | PREFIX_FS
12421 | PREFIX_GS)) == 0)
12422 prefixes |= PREFIX_DS;
12423 append_seg ();
12424 ptr_reg (code, sizeflag);
12427 static void
12428 OP_C (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12430 int add;
12431 if (rex & REX_R)
12433 USED_REX (REX_R);
12434 add = 8;
12436 else if (address_mode != mode_64bit && (prefixes & PREFIX_LOCK))
12438 lock_prefix = NULL;
12439 used_prefixes |= PREFIX_LOCK;
12440 add = 8;
12442 else
12443 add = 0;
12444 sprintf (scratchbuf, "%%cr%d", modrm.reg + add);
12445 oappend (scratchbuf + intel_syntax);
12448 static void
12449 OP_D (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12451 int add;
12452 USED_REX (REX_R);
12453 if (rex & REX_R)
12454 add = 8;
12455 else
12456 add = 0;
12457 if (intel_syntax)
12458 sprintf (scratchbuf, "db%d", modrm.reg + add);
12459 else
12460 sprintf (scratchbuf, "%%db%d", modrm.reg + add);
12461 oappend (scratchbuf);
12464 static void
12465 OP_T (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12467 sprintf (scratchbuf, "%%tr%d", modrm.reg);
12468 oappend (scratchbuf + intel_syntax);
12471 static void
12472 OP_R (int bytemode, int sizeflag)
12474 if (modrm.mod == 3)
12475 OP_E (bytemode, sizeflag);
12476 else
12477 BadOp ();
12480 static void
12481 OP_MMX (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12483 used_prefixes |= (prefixes & PREFIX_DATA);
12484 if (prefixes & PREFIX_DATA)
12486 int add;
12487 USED_REX (REX_R);
12488 if (rex & REX_R)
12489 add = 8;
12490 else
12491 add = 0;
12492 sprintf (scratchbuf, "%%xmm%d", modrm.reg + add);
12494 else
12495 sprintf (scratchbuf, "%%mm%d", modrm.reg);
12496 oappend (scratchbuf + intel_syntax);
12499 static void
12500 OP_XMM (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
12502 int add;
12503 USED_REX (REX_R);
12504 if (rex & REX_R)
12505 add = 8;
12506 else
12507 add = 0;
12508 if (need_vex && bytemode != xmm_mode)
12510 switch (vex.length)
12512 case 128:
12513 sprintf (scratchbuf, "%%xmm%d", modrm.reg + add);
12514 break;
12515 case 256:
12516 sprintf (scratchbuf, "%%ymm%d", modrm.reg + add);
12517 break;
12518 default:
12519 abort ();
12522 else
12523 sprintf (scratchbuf, "%%xmm%d", modrm.reg + add);
12524 oappend (scratchbuf + intel_syntax);
12527 static void
12528 OP_EM (int bytemode, int sizeflag)
12530 if (modrm.mod != 3)
12532 if (intel_syntax && bytemode == v_mode)
12534 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
12535 used_prefixes |= (prefixes & PREFIX_DATA);
12537 OP_E (bytemode, sizeflag);
12538 return;
12541 /* Skip mod/rm byte. */
12542 MODRM_CHECK;
12543 codep++;
12544 used_prefixes |= (prefixes & PREFIX_DATA);
12545 if (prefixes & PREFIX_DATA)
12547 int add;
12549 USED_REX (REX_B);
12550 if (rex & REX_B)
12551 add = 8;
12552 else
12553 add = 0;
12554 sprintf (scratchbuf, "%%xmm%d", modrm.rm + add);
12556 else
12557 sprintf (scratchbuf, "%%mm%d", modrm.rm);
12558 oappend (scratchbuf + intel_syntax);
12561 /* cvt* are the only instructions in sse2 which have
12562 both SSE and MMX operands and also have 0x66 prefix
12563 in their opcode. 0x66 was originally used to differentiate
12564 between SSE and MMX instruction(operands). So we have to handle the
12565 cvt* separately using OP_EMC and OP_MXC */
12566 static void
12567 OP_EMC (int bytemode, int sizeflag)
12569 if (modrm.mod != 3)
12571 if (intel_syntax && bytemode == v_mode)
12573 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
12574 used_prefixes |= (prefixes & PREFIX_DATA);
12576 OP_E (bytemode, sizeflag);
12577 return;
12580 /* Skip mod/rm byte. */
12581 MODRM_CHECK;
12582 codep++;
12583 used_prefixes |= (prefixes & PREFIX_DATA);
12584 sprintf (scratchbuf, "%%mm%d", modrm.rm);
12585 oappend (scratchbuf + intel_syntax);
12588 static void
12589 OP_MXC (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12591 used_prefixes |= (prefixes & PREFIX_DATA);
12592 sprintf (scratchbuf, "%%mm%d", modrm.reg);
12593 oappend (scratchbuf + intel_syntax);
12596 static void
12597 OP_EX (int bytemode, int sizeflag)
12599 int add;
12600 if (modrm.mod != 3)
12602 OP_E (bytemode, sizeflag);
12603 return;
12605 USED_REX (REX_B);
12606 if (rex & REX_B)
12607 add = 8;
12608 else
12609 add = 0;
12611 /* Skip mod/rm byte. */
12612 MODRM_CHECK;
12613 codep++;
12614 if (need_vex
12615 && bytemode != xmm_mode
12616 && bytemode != xmmq_mode)
12618 switch (vex.length)
12620 case 128:
12621 sprintf (scratchbuf, "%%xmm%d", modrm.rm + add);
12622 break;
12623 case 256:
12624 sprintf (scratchbuf, "%%ymm%d", modrm.rm + add);
12625 break;
12626 default:
12627 abort ();
12630 else
12631 sprintf (scratchbuf, "%%xmm%d", modrm.rm + add);
12632 oappend (scratchbuf + intel_syntax);
12635 static void
12636 OP_MS (int bytemode, int sizeflag)
12638 if (modrm.mod == 3)
12639 OP_EM (bytemode, sizeflag);
12640 else
12641 BadOp ();
12644 static void
12645 OP_XS (int bytemode, int sizeflag)
12647 if (modrm.mod == 3)
12648 OP_EX (bytemode, sizeflag);
12649 else
12650 BadOp ();
12653 static void
12654 OP_M (int bytemode, int sizeflag)
12656 if (modrm.mod == 3)
12657 /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
12658 BadOp ();
12659 else
12660 OP_E (bytemode, sizeflag);
12663 static void
12664 OP_0f07 (int bytemode, int sizeflag)
12666 if (modrm.mod != 3 || modrm.rm != 0)
12667 BadOp ();
12668 else
12669 OP_E (bytemode, sizeflag);
12672 /* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
12673 32bit mode and "xchg %rax,%rax" in 64bit mode. */
12675 static void
12676 NOP_Fixup1 (int bytemode, int sizeflag)
12678 if ((prefixes & PREFIX_DATA) != 0
12679 || (rex != 0
12680 && rex != 0x48
12681 && address_mode == mode_64bit))
12682 OP_REG (bytemode, sizeflag);
12683 else
12684 strcpy (obuf, "nop");
12687 static void
12688 NOP_Fixup2 (int bytemode, int sizeflag)
12690 if ((prefixes & PREFIX_DATA) != 0
12691 || (rex != 0
12692 && rex != 0x48
12693 && address_mode == mode_64bit))
12694 OP_IMREG (bytemode, sizeflag);
12697 static const char *const Suffix3DNow[] = {
12698 /* 00 */ NULL, NULL, NULL, NULL,
12699 /* 04 */ NULL, NULL, NULL, NULL,
12700 /* 08 */ NULL, NULL, NULL, NULL,
12701 /* 0C */ "pi2fw", "pi2fd", NULL, NULL,
12702 /* 10 */ NULL, NULL, NULL, NULL,
12703 /* 14 */ NULL, NULL, NULL, NULL,
12704 /* 18 */ NULL, NULL, NULL, NULL,
12705 /* 1C */ "pf2iw", "pf2id", NULL, NULL,
12706 /* 20 */ NULL, NULL, NULL, NULL,
12707 /* 24 */ NULL, NULL, NULL, NULL,
12708 /* 28 */ NULL, NULL, NULL, NULL,
12709 /* 2C */ NULL, NULL, NULL, NULL,
12710 /* 30 */ NULL, NULL, NULL, NULL,
12711 /* 34 */ NULL, NULL, NULL, NULL,
12712 /* 38 */ NULL, NULL, NULL, NULL,
12713 /* 3C */ NULL, NULL, NULL, NULL,
12714 /* 40 */ NULL, NULL, NULL, NULL,
12715 /* 44 */ NULL, NULL, NULL, NULL,
12716 /* 48 */ NULL, NULL, NULL, NULL,
12717 /* 4C */ NULL, NULL, NULL, NULL,
12718 /* 50 */ NULL, NULL, NULL, NULL,
12719 /* 54 */ NULL, NULL, NULL, NULL,
12720 /* 58 */ NULL, NULL, NULL, NULL,
12721 /* 5C */ NULL, NULL, NULL, NULL,
12722 /* 60 */ NULL, NULL, NULL, NULL,
12723 /* 64 */ NULL, NULL, NULL, NULL,
12724 /* 68 */ NULL, NULL, NULL, NULL,
12725 /* 6C */ NULL, NULL, NULL, NULL,
12726 /* 70 */ NULL, NULL, NULL, NULL,
12727 /* 74 */ NULL, NULL, NULL, NULL,
12728 /* 78 */ NULL, NULL, NULL, NULL,
12729 /* 7C */ NULL, NULL, NULL, NULL,
12730 /* 80 */ NULL, NULL, NULL, NULL,
12731 /* 84 */ NULL, NULL, NULL, NULL,
12732 /* 88 */ NULL, NULL, "pfnacc", NULL,
12733 /* 8C */ NULL, NULL, "pfpnacc", NULL,
12734 /* 90 */ "pfcmpge", NULL, NULL, NULL,
12735 /* 94 */ "pfmin", NULL, "pfrcp", "pfrsqrt",
12736 /* 98 */ NULL, NULL, "pfsub", NULL,
12737 /* 9C */ NULL, NULL, "pfadd", NULL,
12738 /* A0 */ "pfcmpgt", NULL, NULL, NULL,
12739 /* A4 */ "pfmax", NULL, "pfrcpit1", "pfrsqit1",
12740 /* A8 */ NULL, NULL, "pfsubr", NULL,
12741 /* AC */ NULL, NULL, "pfacc", NULL,
12742 /* B0 */ "pfcmpeq", NULL, NULL, NULL,
12743 /* B4 */ "pfmul", NULL, "pfrcpit2", "pmulhrw",
12744 /* B8 */ NULL, NULL, NULL, "pswapd",
12745 /* BC */ NULL, NULL, NULL, "pavgusb",
12746 /* C0 */ NULL, NULL, NULL, NULL,
12747 /* C4 */ NULL, NULL, NULL, NULL,
12748 /* C8 */ NULL, NULL, NULL, NULL,
12749 /* CC */ NULL, NULL, NULL, NULL,
12750 /* D0 */ NULL, NULL, NULL, NULL,
12751 /* D4 */ NULL, NULL, NULL, NULL,
12752 /* D8 */ NULL, NULL, NULL, NULL,
12753 /* DC */ NULL, NULL, NULL, NULL,
12754 /* E0 */ NULL, NULL, NULL, NULL,
12755 /* E4 */ NULL, NULL, NULL, NULL,
12756 /* E8 */ NULL, NULL, NULL, NULL,
12757 /* EC */ NULL, NULL, NULL, NULL,
12758 /* F0 */ NULL, NULL, NULL, NULL,
12759 /* F4 */ NULL, NULL, NULL, NULL,
12760 /* F8 */ NULL, NULL, NULL, NULL,
12761 /* FC */ NULL, NULL, NULL, NULL,
12764 static void
12765 OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12767 const char *mnemonic;
12769 FETCH_DATA (the_info, codep + 1);
12770 /* AMD 3DNow! instructions are specified by an opcode suffix in the
12771 place where an 8-bit immediate would normally go. ie. the last
12772 byte of the instruction. */
12773 obufp = obuf + strlen (obuf);
12774 mnemonic = Suffix3DNow[*codep++ & 0xff];
12775 if (mnemonic)
12776 oappend (mnemonic);
12777 else
12779 /* Since a variable sized modrm/sib chunk is between the start
12780 of the opcode (0x0f0f) and the opcode suffix, we need to do
12781 all the modrm processing first, and don't know until now that
12782 we have a bad opcode. This necessitates some cleaning up. */
12783 op_out[0][0] = '\0';
12784 op_out[1][0] = '\0';
12785 BadOp ();
12789 static const char *simd_cmp_op[] = {
12790 "eq",
12791 "lt",
12792 "le",
12793 "unord",
12794 "neq",
12795 "nlt",
12796 "nle",
12797 "ord"
12800 static void
12801 CMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12803 unsigned int cmp_type;
12805 FETCH_DATA (the_info, codep + 1);
12806 cmp_type = *codep++ & 0xff;
12807 if (cmp_type < ARRAY_SIZE (simd_cmp_op))
12809 char suffix [3];
12810 char *p = obuf + strlen (obuf) - 2;
12811 suffix[0] = p[0];
12812 suffix[1] = p[1];
12813 suffix[2] = '\0';
12814 sprintf (p, "%s%s", simd_cmp_op[cmp_type], suffix);
12816 else
12818 /* We have a reserved extension byte. Output it directly. */
12819 scratchbuf[0] = '$';
12820 print_operand_value (scratchbuf + 1, 1, cmp_type);
12821 oappend (scratchbuf + intel_syntax);
12822 scratchbuf[0] = '\0';
12826 static void
12827 OP_Mwait (int bytemode ATTRIBUTE_UNUSED,
12828 int sizeflag ATTRIBUTE_UNUSED)
12830 /* mwait %eax,%ecx */
12831 if (!intel_syntax)
12833 const char **names = (address_mode == mode_64bit
12834 ? names64 : names32);
12835 strcpy (op_out[0], names[0]);
12836 strcpy (op_out[1], names[1]);
12837 two_source_ops = 1;
12839 /* Skip mod/rm byte. */
12840 MODRM_CHECK;
12841 codep++;
12844 static void
12845 OP_Monitor (int bytemode ATTRIBUTE_UNUSED,
12846 int sizeflag ATTRIBUTE_UNUSED)
12848 /* monitor %eax,%ecx,%edx" */
12849 if (!intel_syntax)
12851 const char **op1_names;
12852 const char **names = (address_mode == mode_64bit
12853 ? names64 : names32);
12855 if (!(prefixes & PREFIX_ADDR))
12856 op1_names = (address_mode == mode_16bit
12857 ? names16 : names);
12858 else
12860 /* Remove "addr16/addr32". */
12861 addr_prefix = NULL;
12862 op1_names = (address_mode != mode_32bit
12863 ? names32 : names16);
12864 used_prefixes |= PREFIX_ADDR;
12866 strcpy (op_out[0], op1_names[0]);
12867 strcpy (op_out[1], names[1]);
12868 strcpy (op_out[2], names[2]);
12869 two_source_ops = 1;
12871 /* Skip mod/rm byte. */
12872 MODRM_CHECK;
12873 codep++;
12876 static void
12877 BadOp (void)
12879 /* Throw away prefixes and 1st. opcode byte. */
12880 codep = insn_codep + 1;
12881 oappend ("(bad)");
12884 static void
12885 REP_Fixup (int bytemode, int sizeflag)
12887 /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
12888 lods and stos. */
12889 if (prefixes & PREFIX_REPZ)
12890 repz_prefix = "rep ";
12892 switch (bytemode)
12894 case al_reg:
12895 case eAX_reg:
12896 case indir_dx_reg:
12897 OP_IMREG (bytemode, sizeflag);
12898 break;
12899 case eDI_reg:
12900 OP_ESreg (bytemode, sizeflag);
12901 break;
12902 case eSI_reg:
12903 OP_DSreg (bytemode, sizeflag);
12904 break;
12905 default:
12906 abort ();
12907 break;
12911 static void
12912 CMPXCHG8B_Fixup (int bytemode, int sizeflag)
12914 USED_REX (REX_W);
12915 if (rex & REX_W)
12917 /* Change cmpxchg8b to cmpxchg16b. */
12918 char *p = obuf + strlen (obuf) - 2;
12919 strcpy (p, "16b");
12920 bytemode = o_mode;
12922 OP_M (bytemode, sizeflag);
12925 static void
12926 XMM_Fixup (int reg, int sizeflag ATTRIBUTE_UNUSED)
12928 if (need_vex)
12930 switch (vex.length)
12932 case 128:
12933 sprintf (scratchbuf, "%%xmm%d", reg);
12934 break;
12935 case 256:
12936 sprintf (scratchbuf, "%%ymm%d", reg);
12937 break;
12938 default:
12939 abort ();
12942 else
12943 sprintf (scratchbuf, "%%xmm%d", reg);
12944 oappend (scratchbuf + intel_syntax);
12947 static void
12948 CRC32_Fixup (int bytemode, int sizeflag)
12950 /* Add proper suffix to "crc32". */
12951 char *p = obuf + strlen (obuf);
12953 switch (bytemode)
12955 case b_mode:
12956 if (intel_syntax)
12957 break;
12959 *p++ = 'b';
12960 break;
12961 case v_mode:
12962 if (intel_syntax)
12963 break;
12965 USED_REX (REX_W);
12966 if (rex & REX_W)
12967 *p++ = 'q';
12968 else if (sizeflag & DFLAG)
12969 *p++ = 'l';
12970 else
12971 *p++ = 'w';
12972 used_prefixes |= (prefixes & PREFIX_DATA);
12973 break;
12974 default:
12975 oappend (INTERNAL_DISASSEMBLER_ERROR);
12976 break;
12978 *p = '\0';
12980 if (modrm.mod == 3)
12982 int add;
12984 /* Skip mod/rm byte. */
12985 MODRM_CHECK;
12986 codep++;
12988 USED_REX (REX_B);
12989 add = (rex & REX_B) ? 8 : 0;
12990 if (bytemode == b_mode)
12992 USED_REX (0);
12993 if (rex)
12994 oappend (names8rex[modrm.rm + add]);
12995 else
12996 oappend (names8[modrm.rm + add]);
12998 else
13000 USED_REX (REX_W);
13001 if (rex & REX_W)
13002 oappend (names64[modrm.rm + add]);
13003 else if ((prefixes & PREFIX_DATA))
13004 oappend (names16[modrm.rm + add]);
13005 else
13006 oappend (names32[modrm.rm + add]);
13009 else
13010 OP_E (bytemode, sizeflag);
13013 /* Print a DREX argument as either a register or memory operation. */
13014 static void
13015 print_drex_arg (unsigned int reg, int bytemode, int sizeflag)
13017 if (reg == DREX_REG_UNKNOWN)
13018 BadOp ();
13020 else if (reg != DREX_REG_MEMORY)
13022 sprintf (scratchbuf, "%%xmm%d", reg);
13023 oappend (scratchbuf + intel_syntax);
13026 else
13027 OP_E_extended (bytemode, sizeflag, 1);
13030 /* SSE5 instructions that have 4 arguments are encoded as:
13031 0f 24 <sub-opcode> <modrm> <optional-sib> <drex> <offset>.
13033 The <sub-opcode> byte has 1 bit (0x4) that is combined with 1 bit in
13034 the DREX field (0x8) to determine how the arguments are laid out.
13035 The destination register must be the same register as one of the
13036 inputs, and it is encoded in the DREX byte. No REX prefix is used
13037 for these instructions, since the DREX field contains the 3 extension
13038 bits provided by the REX prefix.
13040 The bytemode argument adds 2 extra bits for passing extra information:
13041 DREX_OC1 -- Set the OC1 bit to indicate dest == 1st arg
13042 DREX_NO_OC0 -- OC0 in DREX is invalid
13043 (but pretend it is set). */
13045 static void
13046 OP_DREX4 (int flag_bytemode, int sizeflag)
13048 unsigned int drex_byte;
13049 unsigned int regs[4];
13050 unsigned int modrm_regmem;
13051 unsigned int modrm_reg;
13052 unsigned int drex_reg;
13053 int bytemode;
13054 int rex_save = rex;
13055 int rex_used_save = rex_used;
13056 int has_sib = 0;
13057 int oc1 = (flag_bytemode & DREX_OC1) ? 2 : 0;
13058 int oc0;
13059 int i;
13061 bytemode = flag_bytemode & ~ DREX_MASK;
13063 for (i = 0; i < 4; i++)
13064 regs[i] = DREX_REG_UNKNOWN;
13066 /* Determine if we have a SIB byte in addition to MODRM before the
13067 DREX byte. */
13068 if (((sizeflag & AFLAG) || address_mode == mode_64bit)
13069 && (modrm.mod != 3)
13070 && (modrm.rm == 4))
13071 has_sib = 1;
13073 /* Get the DREX byte. */
13074 FETCH_DATA (the_info, codep + 2 + has_sib);
13075 drex_byte = codep[has_sib+1];
13076 drex_reg = DREX_XMM (drex_byte);
13077 modrm_reg = modrm.reg + ((drex_byte & REX_R) ? 8 : 0);
13079 /* Is OC0 legal? If not, hardwire oc0 == 1. */
13080 if (flag_bytemode & DREX_NO_OC0)
13082 oc0 = 1;
13083 if (DREX_OC0 (drex_byte))
13084 BadOp ();
13086 else
13087 oc0 = DREX_OC0 (drex_byte);
13089 if (modrm.mod == 3)
13091 /* regmem == register */
13092 modrm_regmem = modrm.rm + ((drex_byte & REX_B) ? 8 : 0);
13093 rex = rex_used = 0;
13094 /* skip modrm/drex since we don't call OP_E_extended */
13095 codep += 2;
13097 else
13099 /* regmem == memory, fill in appropriate REX bits */
13100 modrm_regmem = DREX_REG_MEMORY;
13101 rex = drex_byte & (REX_B | REX_X | REX_R);
13102 if (rex)
13103 rex |= REX_OPCODE;
13104 rex_used = rex;
13107 /* Based on the OC1/OC0 bits, lay out the arguments in the correct
13108 order. */
13109 switch (oc0 + oc1)
13111 default:
13112 BadOp ();
13113 return;
13115 case 0:
13116 regs[0] = modrm_regmem;
13117 regs[1] = modrm_reg;
13118 regs[2] = drex_reg;
13119 regs[3] = drex_reg;
13120 break;
13122 case 1:
13123 regs[0] = modrm_reg;
13124 regs[1] = modrm_regmem;
13125 regs[2] = drex_reg;
13126 regs[3] = drex_reg;
13127 break;
13129 case 2:
13130 regs[0] = drex_reg;
13131 regs[1] = modrm_regmem;
13132 regs[2] = modrm_reg;
13133 regs[3] = drex_reg;
13134 break;
13136 case 3:
13137 regs[0] = drex_reg;
13138 regs[1] = modrm_reg;
13139 regs[2] = modrm_regmem;
13140 regs[3] = drex_reg;
13141 break;
13144 /* Print out the arguments. */
13145 for (i = 0; i < 4; i++)
13147 int j = (intel_syntax) ? 3 - i : i;
13148 if (i > 0)
13150 *obufp++ = ',';
13151 *obufp = '\0';
13154 print_drex_arg (regs[j], bytemode, sizeflag);
13157 rex = rex_save;
13158 rex_used = rex_used_save;
13161 /* SSE5 instructions that have 3 arguments, and are encoded as:
13162 0f 24 <sub-opcode> <modrm> <optional-sib> <drex> <offset> (or)
13163 0f 25 <sub-opcode> <modrm> <optional-sib> <drex> <offset> <cmp-byte>
13165 The DREX field has 1 bit (0x8) to determine how the arguments are
13166 laid out. The destination register is encoded in the DREX byte.
13167 No REX prefix is used for these instructions, since the DREX field
13168 contains the 3 extension bits provided by the REX prefix. */
13170 static void
13171 OP_DREX3 (int flag_bytemode, int sizeflag)
13173 unsigned int drex_byte;
13174 unsigned int regs[3];
13175 unsigned int modrm_regmem;
13176 unsigned int modrm_reg;
13177 unsigned int drex_reg;
13178 int bytemode;
13179 int rex_save = rex;
13180 int rex_used_save = rex_used;
13181 int has_sib = 0;
13182 int oc0;
13183 int i;
13185 bytemode = flag_bytemode & ~ DREX_MASK;
13187 for (i = 0; i < 3; i++)
13188 regs[i] = DREX_REG_UNKNOWN;
13190 /* Determine if we have a SIB byte in addition to MODRM before the
13191 DREX byte. */
13192 if (((sizeflag & AFLAG) || address_mode == mode_64bit)
13193 && (modrm.mod != 3)
13194 && (modrm.rm == 4))
13195 has_sib = 1;
13197 /* Get the DREX byte. */
13198 FETCH_DATA (the_info, codep + 2 + has_sib);
13199 drex_byte = codep[has_sib+1];
13200 drex_reg = DREX_XMM (drex_byte);
13201 modrm_reg = modrm.reg + ((drex_byte & REX_R) ? 8 : 0);
13203 /* Is OC0 legal? If not, hardwire oc0 == 0 */
13204 oc0 = DREX_OC0 (drex_byte);
13205 if ((flag_bytemode & DREX_NO_OC0) && oc0)
13206 BadOp ();
13208 if (modrm.mod == 3)
13210 /* regmem == register */
13211 modrm_regmem = modrm.rm + ((drex_byte & REX_B) ? 8 : 0);
13212 rex = rex_used = 0;
13213 /* skip modrm/drex since we don't call OP_E_extended. */
13214 codep += 2;
13216 else
13218 /* regmem == memory, fill in appropriate REX bits. */
13219 modrm_regmem = DREX_REG_MEMORY;
13220 rex = drex_byte & (REX_B | REX_X | REX_R);
13221 if (rex)
13222 rex |= REX_OPCODE;
13223 rex_used = rex;
13226 /* Based on the OC1/OC0 bits, lay out the arguments in the correct
13227 order. */
13228 switch (oc0)
13230 default:
13231 BadOp ();
13232 return;
13234 case 0:
13235 regs[0] = modrm_regmem;
13236 regs[1] = modrm_reg;
13237 regs[2] = drex_reg;
13238 break;
13240 case 1:
13241 regs[0] = modrm_reg;
13242 regs[1] = modrm_regmem;
13243 regs[2] = drex_reg;
13244 break;
13247 /* Print out the arguments. */
13248 for (i = 0; i < 3; i++)
13250 int j = (intel_syntax) ? 2 - i : i;
13251 if (i > 0)
13253 *obufp++ = ',';
13254 *obufp = '\0';
13257 print_drex_arg (regs[j], bytemode, sizeflag);
13260 rex = rex_save;
13261 rex_used = rex_used_save;
13264 /* Emit a floating point comparison for comp<xx> instructions. */
13266 static void
13267 OP_DREX_FCMP (int bytemode ATTRIBUTE_UNUSED,
13268 int sizeflag ATTRIBUTE_UNUSED)
13270 unsigned char byte;
13272 static const char *const cmp_test[] = {
13273 "eq",
13274 "lt",
13275 "le",
13276 "unord",
13277 "ne",
13278 "nlt",
13279 "nle",
13280 "ord",
13281 "ueq",
13282 "ult",
13283 "ule",
13284 "false",
13285 "une",
13286 "unlt",
13287 "unle",
13288 "true"
13291 FETCH_DATA (the_info, codep + 1);
13292 byte = *codep & 0xff;
13294 if (byte >= ARRAY_SIZE (cmp_test)
13295 || obuf[0] != 'c'
13296 || obuf[1] != 'o'
13297 || obuf[2] != 'm')
13299 /* The instruction isn't one we know about, so just append the
13300 extension byte as a numeric value. */
13301 OP_I (b_mode, 0);
13304 else
13306 sprintf (scratchbuf, "com%s%s", cmp_test[byte], obuf+3);
13307 strcpy (obuf, scratchbuf);
13308 codep++;
13312 /* Emit an integer point comparison for pcom<xx> instructions,
13313 rewriting the instruction to have the test inside of it. */
13315 static void
13316 OP_DREX_ICMP (int bytemode ATTRIBUTE_UNUSED,
13317 int sizeflag ATTRIBUTE_UNUSED)
13319 unsigned char byte;
13321 static const char *const cmp_test[] = {
13322 "lt",
13323 "le",
13324 "gt",
13325 "ge",
13326 "eq",
13327 "ne",
13328 "false",
13329 "true"
13332 FETCH_DATA (the_info, codep + 1);
13333 byte = *codep & 0xff;
13335 if (byte >= ARRAY_SIZE (cmp_test)
13336 || obuf[0] != 'p'
13337 || obuf[1] != 'c'
13338 || obuf[2] != 'o'
13339 || obuf[3] != 'm')
13341 /* The instruction isn't one we know about, so just print the
13342 comparison test byte as a numeric value. */
13343 OP_I (b_mode, 0);
13346 else
13348 sprintf (scratchbuf, "pcom%s%s", cmp_test[byte], obuf+4);
13349 strcpy (obuf, scratchbuf);
13350 codep++;
13354 /* Display the destination register operand for instructions with
13355 VEX. */
13357 static void
13358 OP_VEX (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13360 if (!need_vex)
13361 abort ();
13363 if (!need_vex_reg)
13364 return;
13366 switch (vex.length)
13368 case 128:
13369 switch (bytemode)
13371 case vex_mode:
13372 case vex128_mode:
13373 break;
13374 default:
13375 abort ();
13376 return;
13379 sprintf (scratchbuf, "%%xmm%d", vex.register_specifier);
13380 break;
13381 case 256:
13382 switch (bytemode)
13384 case vex_mode:
13385 case vex256_mode:
13386 break;
13387 default:
13388 abort ();
13389 return;
13392 sprintf (scratchbuf, "%%ymm%d", vex.register_specifier);
13393 break;
13394 default:
13395 abort ();
13396 break;
13398 oappend (scratchbuf + intel_syntax);
13401 /* Get the VEX immediate byte without moving codep. */
13403 static unsigned char
13404 get_vex_imm8 (int sizeflag)
13406 int bytes_before_imm = 0;
13408 /* Skip mod/rm byte. */
13409 MODRM_CHECK;
13410 codep++;
13412 if (modrm.mod != 3)
13414 /* There are SIB/displacement bytes. */
13415 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
13417 /* 32/64 bit address mode */
13418 int base = modrm.rm;
13420 /* Check SIB byte. */
13421 if (base == 4)
13423 FETCH_DATA (the_info, codep + 1);
13424 base = *codep & 7;
13425 bytes_before_imm++;
13428 switch (modrm.mod)
13430 case 0:
13431 /* When modrm.rm == 5 or modrm.rm == 4 and base in
13432 SIB == 5, there is a 4 byte displacement. */
13433 if (base != 5)
13434 /* No displacement. */
13435 break;
13436 case 2:
13437 /* 4 byte displacement. */
13438 bytes_before_imm += 4;
13439 break;
13440 case 1:
13441 /* 1 byte displacement. */
13442 bytes_before_imm++;
13443 break;
13446 else
13447 { /* 16 bit address mode */
13448 switch (modrm.mod)
13450 case 0:
13451 /* When modrm.rm == 6, there is a 2 byte displacement. */
13452 if (modrm.rm != 6)
13453 /* No displacement. */
13454 break;
13455 case 2:
13456 /* 2 byte displacement. */
13457 bytes_before_imm += 2;
13458 break;
13459 case 1:
13460 /* 1 byte displacement. */
13461 bytes_before_imm++;
13462 break;
13467 FETCH_DATA (the_info, codep + bytes_before_imm + 1);
13468 return codep [bytes_before_imm];
13471 static void
13472 OP_EX_VexReg (int bytemode, int sizeflag, int reg)
13474 if (reg == -1 && modrm.mod != 3)
13476 OP_E_memory (bytemode, sizeflag, 0);
13477 return;
13479 else
13481 if (reg == -1)
13483 reg = modrm.rm;
13484 USED_REX (REX_B);
13485 if (rex & REX_B)
13486 reg += 8;
13488 else if (reg > 7 && address_mode != mode_64bit)
13489 BadOp ();
13492 switch (vex.length)
13494 case 128:
13495 sprintf (scratchbuf, "%%xmm%d", reg);
13496 break;
13497 case 256:
13498 sprintf (scratchbuf, "%%ymm%d", reg);
13499 break;
13500 default:
13501 abort ();
13503 oappend (scratchbuf + intel_syntax);
13506 static void
13507 OP_EX_VexImmW (int bytemode, int sizeflag)
13509 int reg = -1;
13510 static unsigned char vex_imm8;
13512 if (!vex_w_done)
13514 vex_imm8 = get_vex_imm8 (sizeflag);
13515 if (vex.w)
13516 reg = vex_imm8 >> 4;
13517 vex_w_done = 1;
13519 else
13521 if (!vex.w)
13522 reg = vex_imm8 >> 4;
13525 OP_EX_VexReg (bytemode, sizeflag, reg);
13528 static void
13529 OP_EX_VexW (int bytemode, int sizeflag)
13531 int reg = -1;
13533 if (!vex_w_done)
13535 vex_w_done = 1;
13536 if (vex.w)
13537 reg = vex.register_specifier;
13539 else
13541 if (!vex.w)
13542 reg = vex.register_specifier;
13545 OP_EX_VexReg (bytemode, sizeflag, reg);
13548 static void
13549 OP_VEX_FMA (int bytemode, int sizeflag)
13551 int reg = get_vex_imm8 (sizeflag) >> 4;
13553 if (reg > 7 && address_mode != mode_64bit)
13554 BadOp ();
13556 switch (vex.length)
13558 case 128:
13559 switch (bytemode)
13561 case vex_mode:
13562 case vex128_mode:
13563 break;
13564 default:
13565 abort ();
13566 return;
13569 sprintf (scratchbuf, "%%xmm%d", reg);
13570 break;
13571 case 256:
13572 switch (bytemode)
13574 case vex_mode:
13575 break;
13576 default:
13577 abort ();
13578 return;
13581 sprintf (scratchbuf, "%%ymm%d", reg);
13582 break;
13583 default:
13584 abort ();
13586 oappend (scratchbuf + intel_syntax);
13589 static void
13590 VEXI4_Fixup (int bytemode ATTRIBUTE_UNUSED,
13591 int sizeflag ATTRIBUTE_UNUSED)
13593 /* Skip the immediate byte and check for invalid bits. */
13594 FETCH_DATA (the_info, codep + 1);
13595 if (*codep++ & 0xf)
13596 BadOp ();
13599 static void
13600 OP_REG_VexI4 (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13602 int reg;
13603 FETCH_DATA (the_info, codep + 1);
13604 reg = *codep++;
13606 if (bytemode != x_mode)
13607 abort ();
13609 if (reg & 0xf)
13610 BadOp ();
13612 reg >>= 4;
13613 if (reg > 7 && address_mode != mode_64bit)
13614 BadOp ();
13616 switch (vex.length)
13618 case 128:
13619 sprintf (scratchbuf, "%%xmm%d", reg);
13620 break;
13621 case 256:
13622 sprintf (scratchbuf, "%%ymm%d", reg);
13623 break;
13624 default:
13625 abort ();
13627 oappend (scratchbuf + intel_syntax);
13630 static void
13631 OP_XMM_VexW (int bytemode, int sizeflag)
13633 /* Turn off the REX.W bit since it is used for swapping operands
13634 now. */
13635 rex &= ~REX_W;
13636 OP_XMM (bytemode, sizeflag);
13639 static void
13640 OP_EX_Vex (int bytemode, int sizeflag)
13642 if (modrm.mod != 3)
13644 if (vex.register_specifier != 0)
13645 BadOp ();
13646 need_vex_reg = 0;
13648 OP_EX (bytemode, sizeflag);
13651 static void
13652 OP_XMM_Vex (int bytemode, int sizeflag)
13654 if (modrm.mod != 3)
13656 if (vex.register_specifier != 0)
13657 BadOp ();
13658 need_vex_reg = 0;
13660 OP_XMM (bytemode, sizeflag);
13663 static void
13664 VZERO_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13666 switch (vex.length)
13668 case 128:
13669 strcpy (obuf, "vzeroupper");
13670 break;
13671 case 256:
13672 strcpy (obuf, "vzeroall");
13673 break;
13674 default:
13675 abort ();
13679 static const char *vex_cmp_op[] = {
13680 "eq",
13681 "lt",
13682 "le",
13683 "unord",
13684 "neq",
13685 "nlt",
13686 "nle",
13687 "ord",
13688 "eq_uq",
13689 "nge",
13690 "ngt",
13691 "false",
13692 "neq_oq",
13693 "ge",
13694 "gt",
13695 "true",
13696 "eq_os",
13697 "lt_oq",
13698 "le_oq",
13699 "unord_s",
13700 "neq_us",
13701 "nlt_uq",
13702 "nle_uq",
13703 "ord_s",
13704 "eq_us",
13705 "nge_uq",
13706 "ngt_uq",
13707 "false_os",
13708 "neq_os",
13709 "ge_oq",
13710 "gt_oq",
13711 "true_us"
13714 static void
13715 VCMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13717 unsigned int cmp_type;
13719 FETCH_DATA (the_info, codep + 1);
13720 cmp_type = *codep++ & 0xff;
13721 if (cmp_type < ARRAY_SIZE (vex_cmp_op))
13723 char suffix [3];
13724 char *p = obuf + strlen (obuf) - 2;
13725 suffix[0] = p[0];
13726 suffix[1] = p[1];
13727 suffix[2] = '\0';
13728 sprintf (p, "%s%s", vex_cmp_op[cmp_type], suffix);
13730 else
13732 /* We have a reserved extension byte. Output it directly. */
13733 scratchbuf[0] = '$';
13734 print_operand_value (scratchbuf + 1, 1, cmp_type);
13735 oappend (scratchbuf + intel_syntax);
13736 scratchbuf[0] = '\0';
13740 static const char *pclmul_op[] = {
13741 "lql",
13742 "hql",
13743 "lqh",
13744 "hqh"
13747 static void
13748 PCLMUL_Fixup (int bytemode ATTRIBUTE_UNUSED,
13749 int sizeflag ATTRIBUTE_UNUSED)
13751 unsigned int pclmul_type;
13753 FETCH_DATA (the_info, codep + 1);
13754 pclmul_type = *codep++ & 0xff;
13755 switch (pclmul_type)
13757 case 0x10:
13758 pclmul_type = 2;
13759 break;
13760 case 0x11:
13761 pclmul_type = 3;
13762 break;
13763 default:
13764 break;
13766 if (pclmul_type < ARRAY_SIZE (pclmul_op))
13768 char suffix [4];
13769 char *p = obuf + strlen (obuf) - 3;
13770 suffix[0] = p[0];
13771 suffix[1] = p[1];
13772 suffix[2] = p[2];
13773 suffix[3] = '\0';
13774 sprintf (p, "%s%s", pclmul_op[pclmul_type], suffix);
13776 else
13778 /* We have a reserved extension byte. Output it directly. */
13779 scratchbuf[0] = '$';
13780 print_operand_value (scratchbuf + 1, 1, pclmul_type);
13781 oappend (scratchbuf + intel_syntax);
13782 scratchbuf[0] = '\0';
13786 static const char *vpermil2_op[] = {
13787 "td",
13788 "td",
13789 "mo",
13790 "mz"
13793 static void
13794 VPERMIL2_Fixup (int bytemode ATTRIBUTE_UNUSED,
13795 int sizeflag ATTRIBUTE_UNUSED)
13797 unsigned int vpermil2_type;
13799 FETCH_DATA (the_info, codep + 1);
13800 vpermil2_type = *codep++ & 0xf;
13801 if (vpermil2_type < ARRAY_SIZE (vpermil2_op))
13803 char suffix [4];
13804 char *p = obuf + strlen (obuf) - 3;
13805 suffix[0] = p[0];
13806 suffix[1] = p[1];
13807 suffix[2] = p[2];
13808 suffix[3] = '\0';
13809 sprintf (p, "%s%s", vpermil2_op[vpermil2_type], suffix);
13811 else
13813 /* We have a reserved extension byte. Output it directly. */
13814 scratchbuf[0] = '$';
13815 print_operand_value (scratchbuf + 1, 1, vpermil2_type);
13816 oappend (scratchbuf + intel_syntax);
13817 scratchbuf[0] = '\0';
13821 static void
13822 MOVBE_Fixup (int bytemode, int sizeflag)
13824 /* Add proper suffix to "movbe". */
13825 char *p = obuf + strlen (obuf);
13827 switch (bytemode)
13829 case v_mode:
13830 if (intel_syntax)
13831 break;
13833 USED_REX (REX_W);
13834 if (sizeflag & SUFFIX_ALWAYS)
13836 if (rex & REX_W)
13837 *p++ = 'q';
13838 else if (sizeflag & DFLAG)
13839 *p++ = 'l';
13840 else
13841 *p++ = 'w';
13843 used_prefixes |= (prefixes & PREFIX_DATA);
13844 break;
13845 default:
13846 oappend (INTERNAL_DISASSEMBLER_ERROR);
13847 break;
13849 *p = '\0';
13851 OP_M (bytemode, sizeflag);